AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 475906
Accepted
Greg Nisbet
Greg Nisbet
Asked: 2018-10-17 13:46:16 +0800 CST2018-10-17 13:46:16 +0800 CST 2018-10-17 13:46:16 +0800 CST

直接清除特定的 X 缓冲区,无需经过 xsel 或 xclip

  • 772

我正在尝试使用Radivarig 的解决方案完全禁用从缓冲区粘贴的中键。

把这个放在~/.xbindkeysrc

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

但是,此解决方案取决于xsel(或等效xclip地)快速完成其工作。

最近我注意到尝试清除主缓冲区时xsel延迟了几秒钟。xclip

是否有比强制 X 清空特定缓冲区的任何方式xsel或正在采取的方式更不“礼貌”的方式?xclip

有问题的 Linux 发行版是 Manjaro ......这可能是 Manjaro 或 Arch 特定的错误,但关于如何在没有或其他类似工具的情况下与 X11 服务器交互的面向最终用户的信息xsel似乎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到一个挂起xclip的 s 上,它似乎一直在等待来自 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:

如果新所有者(无论是客户端还是 None )与选择的当前所有者不同并且当前所有者不是 None ,则向当前所有者发送 SelectionClear 事件。如果作为选择所有者的客户端稍后终止(即其连接关闭),或者如果它在请求中指定的所有者窗口后来被销毁,则选择的所有者自动恢复为 None ,但最后一个-更改时间不受影响。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前后显示相同的东西。

x11 x
  • 1 1 个回答
  • 405 Views

1 个回答

  • Voted
  1. Best Answer
    mosvy
    2018-10-17T14:32:54+08:002018-10-17T14:32:54+08:00
      XSetSelectionOwner(display, XA_PRIMARY, None, CurrentTime);
    

    这行不通。DESCRIPTION正如of中的第一行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结构中获取时间戳。窗口可以是InputOnly一个。xlib 编程手册或某些 X11 联机帮助页中也对此进行了描述。

    不幸的是,这也意味着你的小程序也不够快,因为它必须等待那个事件;-)

    我认为链接问题的答案并不令人满意。您最好探索使用一些LD_PRELOAD技巧,或修改给您带来麻烦的程序。

    • 2

相关问题

  • 没有 x 会话的 gnome-keyring 用法

  • Arch Linux:在没有窗口管理器的情况下运行 VirtualBox (VM)

  • xrdb 冒号丢失错误

  • 在不改变分辨率的情况下让事情变得更大?[伴侣]

  • SSH X11 转发仅在使用受信任时有效

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve