StructureNotifyMaskはLinux Mintの他のウィンドウを妨げます。

StructureNotifyMaskはLinux Mintの他のウィンドウを妨げます。

次のコードに基づいてすべてのキーボード入力をキャプチャしようとしています。この回答。実際のキー入力キャプチャが正しく機能します。しかし、Linux Mint Cinnamonでコードを実行すると、他の問題が発生します。

  1. マウスを使ってウィンドウをドラッグしたりサイズを変更したりすることはできません。
  2. xedおよびnemoメニューバー(ファイル、ビューなど)でオプションをクリックすると、サブメニューオプションは表示されません。
  3. [スタート]メニューをクリックするとアプリのリストが表示されますが、フォーカスはその背後にあるウィンドウに残るため、アプリリストの項目をポイント、スクロール、またはクリックすることはできません。

以下はシンプルだが機能的なコードバージョンです。原因を.NETStructureNotifyMaskにイベントマスクがあることに絞り込みましたXSelectInput。このイベントマスクがないと、上記の問題は発生しません。ただし、これはウィンドウがマップされたときにプログラムに通知しないため、キャプチャが機能しないことを意味します。

上記の問題なくキャプチャを開始するにはどうすればよいですか?XSelectInputプログラムがキー押下およびリリースイベントマスクのみにマッピングされた通知を受信した後、1秒を追加してみました。しかし、これは問題を解決できないようです。

#include <X11/Xlib.h>
#include <X11/keysym.h>
#include <stdio.h>

整数メイン()
{
    ディスプレイ*ディスプレイ。
    ウィンドウ、ルートウィンドウ;
    XEventイベント;
    KeySym脱出;

    ディスプレイ = XOpenDisplay(NULL);
    rootwindow = DefaultRootWindow(display);
    window = XCreateWindow(表示、ルートウィンドウ、
                           -99、-99、1、1、/* x、y、幅、高さ*/
                           0、0、InputOnly、/*ボーダー、深さ、クラス*/
                           CopyFromParent、/*ビジョン*/
                           0、空)/*値マスクと属性*/

    XSelectInput(display, window, StructureNotifyMask | KeyPressMask | KeyReleaseMask);    

    XMapWindow(表示、ウィンドウ);

    する{
        XNextEvent(display、&event);
    while(event.type!= MapNotify);

    XGrabKeyboard(Display、Window、False、GrabModeAsync、GrabModeAsync、CurrentTime);

    escape = XKeysymToKeycode(display、XK_Escape);
    printf("\n終了するには ESC を押してください。\n\n");
    fflush(標準出力);

    そして(1){

        XNextEvent(display、&event);

        if(event.type == KeyPress) {
            printf("キー: キーコード %u 状態 %u\n", event.xkey.keycode, event.xkey.state);
            fflush(標準出力);

        }その他
        if(event.type == KeyRelease) {

            printf("KeyRelease: キーコード %u 状態 %u\n", event.xkey.keycode, event.xkey.state);
            fflush(標準出力);

            if(event.xkey.keycode ==エスケープ)
                残り;
        }その他{

            printf("イベントタイプ %d\n", event.type);
            fflush(標準出力);
        }
    }

    XUngrabKeyboard(表示、現在時刻);

    XDestroyWindow(ディスプレイ、ウィンドウ);
    XCloseDisplay(ディスプレイ);
    0を返します。
}

答え1

永久的なものを作ることはできませんXGrabKeyboard。この種のインポートは、一部の対話が進行中に一時的にのみ使用できます。

キャッチを押し続けると、キャッチが必要な他のすべての機能(例:WMタスクなど)は機能しません。

関連情報