web-dev-qa-db-ja.com

忙しいプログラムからドラッグアンドドロップを中止する

次の場合:

  1. アプリケーションABCからドラッグアンドドロップ操作を開始します。
  2. アプリケーションABCが(一時的に)ロックアップする
  3. マウスボタンを離します

次に、アプリケーションABCが処理を完了するまで、次の問題が発生します。

  • 他のプログラムはマウスポインタを「つかむ」ことができません
  • ドラッグアンドドロップカーソルはアクティブなままです
  • 何もクリックできない
  • Gnome-panelまたはGNOMEメニューを開くことができません
  • 特定のキー(スペース、Enter、矢印キーを含む)を押すことができません

もちろん、アプリケーションが終了するのを待っている間は、他の作業を行うことはできません。

これが発生する状況は、最大500個のFirefoxタブを開いている場合です。タブをドラッグすると、30分ほどフリーズすることがあります。

回避策は、Ctrl-Alt-F1を押してターミナルを使用し、ログインし、killall ABCを実行して問題のあるアプリケーションを強制終了し、Ctrl-Alt-F7を押してグラフィカル環境に戻ることです。しかし、ABCを強制終了する必要はなく、マウスを元に戻しながら処理を終了させたいと思います。

それで、ビジーなプログラムからマウスポインタをドラッグアンドドロップ/グラブ解除することを強制的に中止することは可能ですかプロセスを強制終了することなく?

7

実際、これを行うことは可能です(少なくとも最近のバージョンのXでは)。

あなたはを押すことによってこれを行うことができます XF86Ungrab キー、 このコミット で導入されました。

デフォルトでは、このkeysymは物理的なキーまたはキーの組み合わせにバインドされていません(セキュリティホールとして報告された後、2012年に無効になりました。これは、誰もがグラブを壊してロック画面をバイパスできるためです)。他のいくつかの設定では、テンキーを使用するショートカットにバインドされています。明らかに、それはキーパッドのないラップトップでは機能しません。

ただし、xdotoolを使用してkeysymをアクティブ化することはできます。

setxkbmap -option grab:break_actions
xdotool key XF86Ungrab

これは、Ubuntu PreciseのX.orgバージョン2:1.11.4-0ubuntu10.8で機能します。

6

ほとんどのオペレーティングシステムまたはウィンドウシステムでは、エスケープボタンを押すことでマウスドラッグハンドラを中止できます。また、Mac osのトップメニューのように "drag cancel" target を見つけたり使用したりしても、キャンセルできる場合があります。たとえば、ほとんどのWindowsでは、カーソルが線で囲まれた円に変化することに気付くでしょう。これは、現実世界の古典的な禁煙標識やダイビング禁止タイプの標識のようです;)

OPの場合、彼らはGNOME/Firefoxを使用しています。

Gnome では、ほとんどの場合、マウスボタンを離す前にエスケープキーを押すと、ドラッグアンドドロップイベントがキャンセルされます(すべきです)。それは彼らの開発ガイドラインの一部ですらあります:

http://developer.gnome.org/hig-book/3.2/input-mouse.html.en#drag-drop-override

すべてのマウス操作が完了する前にキャンセルできるようにします。 Escキーを押すと、ファイルマネージャでファイルをドラッグアンドドロップしたり、描画アプリケーションで図形を描画したりするなど、進行中のマウス操作をキャンセルできます。

そして..

次のすべての方法で、ユーザーがドラッグアンドドロップ操作をキャンセルできるようにします。

  • オブジェクトをドロップするマウスボタンを離す前にEscキーを押す
  • 元の場所に戻り、クエリドラッグを実行して選択します
  • ポップアップメニューでキャンセルします(セクション10.1.3.1.2-クエリドラッグを参照)
  • 無効なドロップターゲットにオブジェクトをドロップします。

私はそれがKDEでも同じだと確信しています 実行中いくつか検索

Mozilla開発者のドロップイベントについて

dropドロップイベントは、ドラッグ操作の最後にドロップが発生した要素で発生します。リスナーは、ドラッグされているデータを取得し、ドロップ位置に挿入する責任があります。このイベントは、ドロップが必要な場合にのみ発生します。ユーザーがEscキーを押してドラッグ操作をキャンセルした場合、またはマウスが有効なドロップターゲット上にないときにマウスボタンを離した場合は、起動しません。これについては、「ドロップの実行」を参照してください。

私はこれがすべてのセットアップで常に機能するとは決して言いませんでした。たとえば、これは一種の不完全なUbuntuでは機能しないと思います。 バージョン3.1 以降、ドラッグイベントがEscキーで機能しなくなったことを覚えています。

ほとんどすべての(適切にコーディングされた)アプリケーションのすべてのMS Windowsオペレーティングシステム:-マウスのドラッグアンドドロップイベント中にマウスボタンを離す前にEscキーを押すと、ハンドラー関数がキャンセル/中止されます。

たとえば、Google Chrome Windows7の場合:-タ​​ブを切り離すようにツールバーからドラッグし、離す前にキーボードのEscキーを押します。ドラッグを中止して戻る必要があります。あなたのタブ。

1