xselやxclipを介さずに特定のXバッファを直接消去します。

xselやxclipを介さずに特定のXバッファを直接消去します。

以下を使用してバッファから貼り付けるために、中央クリックを完全に無効にしようとします。ラバリグのソリューション

それを入れて~/.xbindkeysrc

"echo -n | xsel -n -i; pkill xbindkeys; xdotool click 2; xbindkeys"
b:2 + Release

しかし、このソリューションはタスクをすばやく実行することに依存していますxsel(またはそれと同じです)。xclip

xsel最近、メインバッファをクリアしようとしたときに数秒の遅延が発生することがわかりました。xclip

xselxclipXが特定のバッファを空にするように強制するあまり「丁寧な」方法はありますか?

xsel問題のLinuxディストリビューションはManjaroです...これはManjaroまたはArch固有のバグである可能性がありますが、他の同様のツールなしでX11サーバーと対話する方法に関するエンドユーザー対面情報が少し不足しているようですxclip

~  > xclip -selection primary -verbose -in </dev/null
Connected to X server.
Using selection: XA_PRIMARY
Using UTF8_STRING.
Waiting for selection requests, Control-C to quit
  Waiting for selection request number 1
  Waiting for selection request number 2
Time: 13s

~  > xclip -selection primary -verbose -in </dev/null
...
Time: 11s

~  > xclip -selection primary -verbose -in </dev/null
...
Time: 23s

私はgdb停止の1つに接続しておりxclip、Xサーバーの応答を待っている間停止しているようです。

(gdb) where
#0  0x00007f905e1f1b78 in poll () from /usr/lib/libc.so.6
#1  0x00007f905dc68630 in ?? () from /usr/lib/libxcb.so.1
#2  0x00007f905dc6a2db in xcb_wait_for_event () from /usr/lib/libxcb.so.1
#3  0x00007f905e306009 in _XReadEvents () from /usr/lib/libX11.so.6
#4  0x00007f905e2f4ee1 in XNextEvent () from /usr/lib/libX11.so.6
#5  0x0000563eb8eaea70 in ?? ()
#6  0x00007f905e125223 in __libc_start_main () from /usr/lib/libc.so.6
#7  0x0000563eb8eaf53e in ?? ()

私はxselソースコードの一部に直接基づいてX APIを使用して合理化されたプログラムを書こうとしました。具体的には次のとおりです。https://github.com/kfish/xsel/blob/master/xsel.c#L1003-L1018

バッファを消去するために、xselは次の属性に依存しているようですXSetSelectionOwner

新しい所有者(クライアントまたはなし)が選択項目の現在の所有者と異なり、現在の所有者が存在しない場合は、SelectionClearイベントが現在の所有者に送信されます。選択の所有者であるクライアントが後で終了した場合(たとえば、接続が閉じられた場合)、要求で指定された所有者ウィンドウが後で削除されると、選択の所有者は自動的に[なし]に戻ります。 A - 変更時間は影響を受けません。 X サーバーは選択した原子を解釈しません。 XGetSelectionOwner() は、SelectionRequest イベントと SelectionClear イベントに報告された所有者ウィンドウを返します。選択はXサーバーにグローバルに適用されます。

xselこれは私が必要な機能に圧縮しようとする私の試みです。

私はXA_PRIMARYバッファの所有者が一般的にNone。私はそれをNone私のCプログラムの本文に設定し、それが動作することを願っています。

// clear.c
#include <stdio.h>
#include <X11/Xlib.h>
#include <X11/Xatom.h>
#include <assert.h>

// always debug
#undef NDEBUG

static Display * display = NULL;

static char * display_name = NULL;

static void clear_selection(void)
{
  printf("%d\n", 300);
  display = XOpenDisplay(display_name);
  assert(display != NULL);
  printf("%d\n", 200);
  XSetSelectionOwner(display, XA_PRIMARY, None, CurrentTime);
  printf("%d\n, 500);
  XSync(display, False);
  return;
}

int main(void)
{
  printf("%d\n", 100);
  clear_selection();
  printf("%d\n", 200);
  return 0;
}

プログラムが実行され、印刷されます。

100
300
400
500
200

予想通り。

ただし、デフォルトのバッファをクリアできません。

xclip -selection -primary out前後の同じコンテンツを表示します。

ベストアンサー1

  XSetSelectionOwner(display, XA_PRIMARY, None, CurrentTime);

これはうまくいきません。最初の行は次のようにDESCRIPTION言いますXSetSelectionOwner(3)

XSetSelectionOwner関数は、指定された選択項目の所有者と最後の変更時刻を変更します。指定された時間が指定された選択項目の現在の最後の変更時間より前の場合、何の効果もありません。または現在のXサーバー時間より後です。

XEventサーバーから受信したタイムスタンプから取得できる実際のタイムスタンプを渡す必要があります。これが私が直接実装した作業ですxsel

Time getctime(void){
        XSelectInput(dpy, w, PropertyChangeMask);
        XStoreName(dpy, w, "xsel");
        for(;;){
                XEvent e;
                XNextEvent(dpy, &e);
                if(e.type == PropertyNotify && e.xproperty.window == w)
                        return e.xproperty.time;
        }
}

ウィンドウにプロパティを設定してイベントを待ち、構造PropertyNotifyからタイムスタンプを取得しますXPropertyEvent。ウィンドウはInputOnly1つです。これは、xlibプログラミングマニュアルまたは一部のX11マンページにも記載されています。

残念ながら、これはまた、アプレットがそのイベントを待たなければならないので、十分に速くないことを意味します;-)

リンクされた答えではないようです。質問みんな満足です。いくつかのLD_PRELOADトリックを試したり、問題を引き起こすプログラムを修正した方が良いでしょう。

おすすめ記事