
時々、ウィンドウマネージャが応答しないアプリケーションをどのように処理するのか疑問に思います。_NET_WM_PING
たとえば、ポップアップウィンドウに「このアプリケーションを終了しますか?「これはデバッグ グラフィックアプリケーションそして方法を学ぶさまざまなアプリケーションがさまざまな信号を処理します。そしてさまざまなウィンドウマネージャ アプリケーションとの対話。
たとえば、
kwin
持つClient::pingWindow()
機能と「このアプリケーションを終了しますか?「情報。mutter
持つmeta_display_ping_window
機能と「アプリケーションが応答しません。「情報。xfwm4
一つあるclientSendNetWMPing
機能を表示し、「このウィンドウは使用中または応答しない可能性があります。」情報。
strace
たとえば、受信した信号を確認するために応答しないプログラムを実行できるように、これらの動作を意図的にトリガーしたいと思います。私はPython / Tkinterまたはbash / zenityスクリプトを検討していますが、他の可能性も開いています。理想的には、このプログラムはCPUを飽和させませんが、それも問題になりません。 (このようにしても、SIGSTOP
ウィンドウマネージャの目的の動作は実行されません。)
_NET_WM_PING
意図的に応答しないグラフィックプロセスを作成して、ウィンドウマネージャの注意を引くための簡単で信頼性の高い方法はありますか?
答え1
正確な答えはフレームワークなどによって異なります。
すべてのGUIフレームワークの共通の「スレッド」は、再描画、キーボード、マウス入力などのイベント/要求を受け取る中央/メインイベントハンドラです。
while true; do nothing; done
これはすぐには応答しませんが、緊密なループ内のイベントを処理するハンドラです。
答え2
数行のコードでGUIアプリケーションをノックアウトし、信号をキャプチャすることでラップできます。 Pythonに対するTkinterの主張は非常に簡単です。バラよりここ
答え3
以下は、ウィンドウを作成して固定する高速で汚れたC ++コードです。
// freeze.cpp
#include <QtWidgets/QApplication>
#include <QtWidgets/QMainWindow>
#include <QtCore/QMutex>
int main (int argc, char** argv) {
QApplication a (argc, argv);
QMainWindow w;
QMutex m;
w.show ();
m.lock ();
m.lock ();
return (a.exec ());
}
これはQt5フレームワークによって異なります。 Qt5開発パッケージをインストールしたら、次のコマンドラインを使用してコードをコンパイルできます(実際にはQtアプリケーションをビルドする正しい方法ではありません)。
$ g++ freeze.cpp -fPIC -std=c++11 -I/usr/include/qt5 -I/usr/include/qt -lQt5Core -lQt5Gui -lQt5Widgets
答え4
zenity
その属性を持つ必要な_NET_WM_PING
Xアプリケーションに置き換えます。
#!/bin/bash
zenity --question &
sleep 5
kill -STOP $!
XアプリケーションのPIDが消えるようにするには、を使用してXアプリケーションのPIDをkill -CONT xxxx
置き換える必要があります。xxxx
xprop | grep _NET_WM_PING # Click on the zenity GTK dialog
WM_PROTOCOLS(ATOM): protocols WM_DELETE_WINDOW, WM_TAKE_FOCUS, _NET_WM_PING, _NET_WM_SYNC_REQUEST