ungrab_pointer() 在 Xlib 中不存在但 ungrab_button 不会释放鼠标

ungrab_pointer() in Xlib doesn't exist but ungrab_button won't release the mouse

我找不到取消注册我的 grab_pointer 使用 python-xlib 的调用的方法。
如果你不取消抓取,你将无法在内部单击 windows 如果你习惯了,这是一个恼人的问题。

除了代码丑陋之外,相关的部分是:

try:
    display.screen().root.grab_pointer(True, X.ButtonPressMask | X.ButtonReleaseMask, X.GrabModeAsync, X.GrabModeAsync, 0, 0, X.CurrentTime)
    display.record_enable_context(ctx, handle_event)
    display.record_free_context(ctx)
except:
    display.record_disable_context(ctx)
    #display.screen().root.ungrab_pointer(X.CurrentTime)
    display.screen().root.ungrab_button(0, [0])
    display.flush()
    exit(1)

前三行获取指针并将(与其余代码一起)输出我想要的每个事件。但是每当出现问题或 Ctrl+C 事件时,except 块就会触发(如预期的那样)。

问题是没有 display.screen().root.ungrab_pointer 调用 aparently。
Every code documented using this library says there should be,但我找不到。

关于如何取消抓取指针的任何想法?

版本: 0.15-0.10.rc1.fc21


对于那些不幸想要帮助我的勇敢的灵魂,这里是完整的代码:

import select

from Xlib.display import Display
from Xlib import X
from Xlib.ext.xtest import fake_input
from Xlib.ext import record
from Xlib.protocol import rq

def handle_event(event):
    print(event)

display = Display(':0')
ctx = display.record_create_context(
            0,
            [record.AllClients],
            [{
                    '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.ButtonPressMask, X.ButtonReleaseMask),
                    'errors': (0, 0),
                    'client_started': False,
                    'client_died': False,
            }]
 )

try:
    display.screen().root.grab_pointer(True, X.ButtonPressMask | X.ButtonReleaseMask, X.GrabModeAsync, X.GrabModeAsync, 0, 0, X.CurrentTime)
    display.record_enable_context(ctx, handle_event)
    display.record_free_context(ctx)
except:
    display.record_disable_context(ctx)
    #display.screen().root.ungrab_pointer(X.CurrentTime)
    display.screen().root.ungrab_button(0, [0])
    display.flush()
    exit(1)


try:
    while 1:
        # Wait for display to send something, or a timeout of one second
        readable, w, e = select.select([display], [], [], 1)

        # if no files are ready to be read, it's an timeout
        if not readable:
            print('Got no events')
            break

        # if display is readable, handle as many events as have been recieved
        elif display in readable:
            i = display.pending_events()
            while i > 0:
                event = display.next_event()
                handle_event(event)
                i = i - 1
except:
    display.record_disable_context(ctx)
    display,ungrab_pointer(X.CurrentTime)
    display.flush()

Ps。稍后我会制作漂亮的函数和 类,但首先我需要逻辑才能工作,这样我才能更好地理解它。 D.s

ungrab_pointer是Display的方法,不是Window。

 display.ungrab_pointer(X.CurrentTime)

有效。

函数的 C 原型是:

int XGrabPointer(Display *display, Window grab_window, Bool owner_events, 
                 unsigned int event_mask, int pointer_mode, 
                 int keyboard_mode, Window confine_to, 
                 Cursor cursor, Time time);
int XUngrabPointer(Display *display, Time time);

Python Xlib 库或多或少是 Xlib 的机械包装器。接受 Display*Window 的函数通常映射到 Window class 的方法,只接受 Display* 的函数映射到 [=17= 的方法].