再アクティブ化ポイントからの非アクティブフレームでのマウスクリックを防止


11

フレームをアクティブにする以外に、非アクティブなXウィンドウでフレームの「最初の」クリックが影響を受けないようにしたい。具体的には、ポイントの位置を変更したくありません。

問題は、マウスをクリックしたときに彼のフレーム非アクティブだったことを検出できないように見えることです。したがって、次のコードは常に表示されます"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)

フレームが以前に非アクティブであったことをどのように検出しますか?

または、誰かが私が他の場所でやろうとしていることをすでに達成していますか?

注:私はこの他の質問とは異なる何かを求めています。これは、非アクティブなフレームではなく、非アクティブなウィンドウに関するものです。


のキーボードショートカットを変更し、mouse-set-point独自の関数を作成して、必要な操作を行います。C-h kマウスをクリックして、そこにリストされている2つの機能を確認してください。
弁護士

フレームにタイトルバーと境界線がありませんか?バッファをクリックするのではなく、それらをクリックしてみませんか?
2015年

@lawlist:upイベントが後で来るので、これは役に立たないと思います。ダウンイベント中にフレームが非アクティブであったことさえわかりません!
edam

2
@ドリュー:まあ、私はできましたが、それはフィドルです。emacsがターミナルで実行されているときのように、Xウィンドウをクリックできるようにしたいのですが。
edam

これは確かに非常に迷惑な動作です。つまり、マウスをまったく使用しないことによって、それを防ぎます。Alt + Tabおよびcoを使用します。フレームを切り替えます。
GergelyPolonkai 2015年

回答:


1

これはEmacs内からは可能ではないと思います。問題は、フレームをクリックするとすぐに、ウィンドウマネージャーがそのフレームを選択することです。したがって、Emacsはそれを選択されたフレームとしてすぐに見ます。

あなた自身のテストコードはこれを示しています。mouse-drag-regionまたはmouse-set-point(またはその他のEmacs関数)のいずれについてもアドバイスしても違いはありません。

(恐らく、X11レベルでできることがある-知らない。)


を介して選択したフレームを追跡し、post-command-hookすべてのポイント位置を記録して、選択したフレームが変化したときにそれらを元に戻すことはできませんか?効率的ではありませんが、機能します。
PythonNut 2015

@PythonNut:うーん。多分。それを試してみてください。post-command-hook悪鬼の最後の手段です。;-)私たちは皆、それをたくさんのものに使用しますが、重いハンマーです。
2015

1

あなたが求めているものとは正確には異なりますが、これは私にとってはうまくいきます:

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

これは、フレームがアクティブにされるだけでなく、ウィンドウがクリックされるという点でも、要求と正確に一致しません。しかし、私はそれが役に立つと思います。ダブルクリックはポイントを移動しますが、シングルクリックは移動しません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.