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= 的方法].
我找不到取消注册我的 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= 的方法].