ビジー状態のプログラムからのドラッグアンドドロップを中止する

ビジー状態のプログラムからのドラッグアンドドロップを中止する

次のことが起こる場合:

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

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

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

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

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

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

それで、ビジー状態のプログラムからドラッグアンドドロップを強制的に中止したり、マウスポインターを解除したりすることは可能ですか?プロセスを終了せずに?

答え1

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

これはXF86Ungrabこのコミット

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

ただし、次のコマンドを使用してキーシムをアクティブ化できますxdotool

setxkbmap -option grab:break_actions
xdotool key XF86Ungrab

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

答え2

ほとんどのオペレーティングシステムやウィンドウシステムでは、Escボタンを押すことでマウスドラッグハンドラを中止することができます。また、イベントをキャンセルするには、「ドラッグキャンセル」ターゲットMac OS のトップ メニューのように。たとえば、ほとんどの Windows では、現実世界の典型的な禁煙標識やダイビング禁止標識のように、カーソルが線が引かれた円に変わります。

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

ノームほとんどの場合、マウスボタンを離す前に Esc キーを押すと、ドラッグ/ドロップ イベントがキャンセルされます (キャンセルされるはずです)。これは開発ガイドラインの一部でもあります。

http://developer.gnome.org/hig-book/3.2/input-mouse.html.en#ドラッグドロップオーバーライド

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

そして..

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

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

KDEでも同じだと思いますやっている いくつか 検索

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

落とす ドロップ イベントは、ドラッグ操作の終了時にドロップが発生した要素で発生します。リスナーは、ドラッグされているデータを取得してドロップ位置に挿入する役割を担います。このイベントは、ドロップが必要な場合にのみ発生します。ユーザーがドラッグ操作をキャンセルした場合 (たとえば、Esc キーを押すなど)、またはマウスが有効なドロップ ターゲット上にないときにマウス ボタンが放された場合は、このイベントは発生しません。詳細については、「ドロップの実行」を参照してください。

私はこれがすべての設定で常に機能するとは言っていません。たとえば、Ubuntuでは機能しないと思います。これはちょっと残念です。Windowsではドラッグイベントの中止がEscキーで機能していたことを覚えています。バージョン 3.1

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

たとえば、Windows7 上の Google Chrome の場合: - タブを切り離すかのようにツールバーからタブをドラッグし、放す前にキーボードの Esc キーを押します。ドラッグが中止され、タブが元に戻ります。

関連情報