python - 使用 python xlib 进行选择性记录?

标签 python x11 xlib xorg

我正在尝试使用 python xlib 的 RECORD 扩展在根窗口上实现可点击区域。 这是我到目前为止所得到的:

import sys
import os

from Xlib import X, XK, display
from Xlib.ext import record
from Xlib.protocol import rq

local_dpy = display.Display()
record_dpy = display.Display()

buttons={(0,200,0,200,"echo Hep")}
def record_callback(reply):
    if reply.category != record.FromServer:
        return
    if reply.client_swapped:
        print "* received swapped protocol data, cowardly ignored"
        return
    if not len(reply.data) or ord(reply.data[0]) < 2:
        # not an event
        return

    data = reply.data
    while len(data):
        event, data = rq.EventField(None).parse_binary_value(data, record_dpy.display, None, None)

        if event.type == X.ButtonRelease:
            print "ButtonRelease", event
            if(event.detail==1):
                for btn in buttons:
                  if(event.root_x>=btn[0] and event.root_x<=btn[1]):
                      if(event.root_y>=btn[2] and event.root_y<=btn[3]):
                          os.system(btn[4])

# Check if the extension is present
if not record_dpy.has_extension("RECORD"):
    print "RECORD extension not found"
    sys.exit(1)
r = record_dpy.record_get_version(0, 0)
print "RECORD extension version %d.%d" % (r.major_version, r.minor_version)

ctx = record_dpy.record_create_context(
        0,
        [record.CurrentClients],
        [{
                'core_requests': (0, 0),
                'core_replies': (0, 0),
                'ext_requests': (0, 0, 0, 0),
                'ext_replies': (0, 0, 0, 0),
                'delivered_events': (0, 0),
                'device_events': (X.KeyPress, X.MotionNotify),
                'errors': (0, 0),
                'client_started': False,
                'client_died': False,
        }])

record_dpy.record_enable_context(ctx, record_callback)
record_dpy.record_free_context(ctx)

问题是:我不知道是否(以及如何)可以让 RECORD 仅监听根窗口事件,或者过滤接收到的事件。

示例:单击根窗口:

Xlib.protocol.request.QueryExtension
Xlib.protocol.request.QueryExtension
RECORD extension version 1.13
ButtonRelease Xlib.protocol.event.ButtonRelease(event_y = 0, state = 256, type = 5, child = 0, detail = 1, window = <Xlib.display.Window 0x00000000>, same_screen = 0, time = 795133824, root_y = 76, root_x = 76, root = <Xlib.display.Window 0x00000000>, event_x = 0, sequence_number = 0)
Hep

单击 Firefox 的工具栏:

Xlib.protocol.request.QueryExtension
Xlib.protocol.request.QueryExtension
RECORD extension version 1.13
ButtonRelease Xlib.protocol.event.ButtonRelease(event_y = 0, state = 256, type = 5, child = 0, detail = 1, window = <Xlib.display.Window 0x00000000>, same_screen = 0, time = 795205475, root_y = 61, root_x = 92, root = <Xlib.display.Window 0x00000000>, event_x = 0, sequence_number = 0)
Hep

所以我必须通过以下方式过滤事件:检查事件是否来自根窗口(事件都有空窗口,见上文...),或检查另一个窗口是否位于单击区域上方(所以我无法单击下面的根窗口)。

因为该事件不提供窗口信息,我想我会做第二个选项,但我不知道如何...

最佳答案

我自己发现了:

def record_callback(reply):
    if reply.category != record.FromServer:
        return
    if reply.client_swapped:
        print "* received swapped protocol data, cowardly ignored"
        return
    if not len(reply.data) or ord(reply.data[0]) < 2:
        # not an event
        return

    data = reply.data
    clients=local_dpy.screen().root.query_tree().children
    while len(data):
        event, data = rq.EventField(None).parse_binary_value(data, record_dpy.display, None, None)
        if event.type == X.ButtonRelease:
            if(event.detail==1):
                for btn in buttons:
                  if(event.root_x>=btn[0] and event.root_x<=btn[1]):
                      if(event.root_y>=btn[2] and event.root_y<=btn[3]):
                          doit=1
                          for win in clients:
                              if win==local_dpy.screen().root.query_pointer().child:
                                  doit=2
                          if doit==1:
                              os.system(btn[4])

这个想法是检查指针下的窗口是否是根窗口的客户端之一。

关于python - 使用 python xlib 进行选择性记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6609078/

相关文章:

python - 如何修复这个 NumPy loadtxt 函数?

python - 应用以属性系列作为参数的函数

Python - 具有 "don' t care"值的数字类

c++ - XRender 创建离屏图片

python - 如何从 Azure IoT Edge 模块 Python 发送新消息

ruby - Mountain Lion rvm 安装 1.8.7 x11 错误

r - 在服务器上运行 R 时,如何从 emacs ess 启动 x 窗口?

c++ - XCheckWindowEvent 不返回 ClientMessage 事件

c - 指针运动。为什么数字这么高?为什么它以 block 而不是恒定流的形式打印信息?

c - 如何使用 Xlib 作为 xeyes 通过透明窗口发送点击信号?