Cegah klik mouse pada frame yang tidak aktif dari titik reposisi

11

Saya ingin mencegah klik "pertama" pada bingkai di jendela X tidak aktif dari efek apa pun, selain membuat bingkai aktif. Secara khusus, saya tidak ingin mereposisi titik.

Masalahnya adalah bahwa saya tidak dapat mendeteksi bahwa frame dia tidak aktif ketika saya mendapatkan klik mouse. Jadi kode berikut selalu ditampilkan "y":

;; detect if frame is active when clicking
(defun my/mouse-drag-region (event)
  (interactive "e")
  (mouse-minibuffer-check event)
  (let* ((window (caadr event))
         (frame (window-frame window)))
    (if (eql frame (selected-frame))
        (print "y")
      (print "n"))))
(global-set-key [down-mouse-1] 'my/mouse-drag-region)

Bagaimana saya mendeteksi bahwa frame itu sebelumnya tidak aktif?

Atau, sudahkah seseorang mencapai apa yang saya coba lakukan di tempat lain?

Catatan: Saya meminta sesuatu yang berbeda dari pertanyaan lain ini , yaitu tentang windows yang tidak aktif, bukan frame yang tidak aktif.

edam
sumber
Anda ingin memodifikasi pintasan keyboard untuk mouse-set-pointdan membuat fungsi Anda sendiri untuk melakukan apa pun yang Anda inginkan. Lakukan C-h khal klik mouse dan lihat dua (2) fungsi yang tercantum di sana.
hukum
Tidakkah bingkai Anda memiliki bilah judul dan batas? Mengapa Anda tidak mengkliknya saja, alih-alih mengklik dalam buffer?
Drew
@lawlist: Saya rasa ini tidak membantu karena acara naik bahkan lebih lambat. Saya bahkan tidak tahu bahwa frame itu tidak aktif selama acara down!
edam
2
@Rew: well, saya bisa, tapi itu fiddley. Saya lebih suka klik di jendela X, seperti yang saya bisa ketika emacs berjalan di terminal.
edam
Ini memang perilaku yang sangat menyebalkan. Saya mencegahnya dengan tidak menggunakan mouse sama sekali, yaitu. menggunakan Alt + Tab dan co. untuk beralih di antara bingkai.
GergelyPolonkai

Jawaban:

1

Saya tidak berpikir ini mungkin dari dalam Emacs. Masalahnya adalah segera setelah Anda mengklik di bingkai, manajer jendela memilih bingkai itu. Dengan demikian Emacs segera melihatnya sebagai bingkai yang dipilih.

Kode tes Anda sendiri menunjukkan ini. Tidak ada nasihat tentang salah satu mouse-drag-regionatau mouse-set-point(atau fungsi Emacs lainnya) yang akan membuat perbedaan.

(Mungkin ada sesuatu yang dapat Anda lakukan di tingkat X11 - tak tahu.)

Drew
sumber
Tidak bisakah Anda melacak bingkai yang dipilih melalui post-command-hook, merekam semua posisi titik dan mengembalikannya ketika bingkai yang dipilih berubah? Itu tidak akan efisien, tetapi itu akan berhasil.
PythonNut
@PythonNut: Ugh. Mungkin. Cobalah. post-command-hookadalah pilihan terakhir dari bajingan. ;-) Kita semua menggunakannya untuk banyak hal, tetapi ini adalah palu yang berat.
Drew
1

Bukan apa yang Anda minta, tetapi ini bekerja dengan baik untuk saya:

(global-unset-key [down-mouse-1])   ; no dragging nonsense
(global-set-key [mouse-1] 'mouse-select-window)  ; no setting point

Ini tidak sesuai dengan permintaan Anda karena tidak hanya bingkai dibuat aktif tetapi juga jendela yang diklik. Tapi, saya menemukan itu berguna. Klik dua kali memindahkan titik, satu klik tidak.

DaveL
sumber