首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Xlib中的ungrab_pointer()不存在,但ungrab_button不会释放鼠标

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

Stack Overflow用户
提问于 2015-12-22 18:50:29
回答 1查看 311关注 0票数 1

我找不到用python注销grab_pointer调用的方法。

如果您不取消抓取,您将无法单击内部窗口,这是一个恼人的问题,如果你习惯了它。

除了代码很难看之外,相关部分还包括:

代码语言:javascript
运行
复制
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调用。

使用这个库记录的每一段代码都说,但我找不到。

有什么办法解开指针吗?

版本:0.15-0.10.rc1.fc21

对于那些不幸想要帮助我的勇敢的人来说,下面是完整的代码:

代码语言:javascript
运行
复制
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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-24 08:33:24

ungrab_pointer是一种显示方法,而不是窗口。

代码语言:javascript
运行
复制
 display.ungrab_pointer(X.CurrentTime)

很管用。

C这些功能的原型如下:

代码语言:javascript
运行
复制
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的机械包装器。接受Display*Window的函数通常映射到Window类的方法,只接受Display*的函数被映射到Display的方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34422556

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档