2015-12-22 52 views
1

我無法找到一種方法來註銷我的grab_pointer與python-xlib的調用。
如果你沒有取消,你將無法點擊窗口,這是一個惱人的問題,如果你習慣了它。Xlib中的ungrab_pointer()不存在,但ungrab_button不會釋放鼠標

除了碼是難看,相關部分是thse:

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。我找不到一個。

任何想法如何解開指針?

版本: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() 

詩篇。我將在後面編寫漂亮的函數和類,但首先我需要邏輯來工作,以便更好地理解它。 D.s

回答

1

ungrab_pointer是顯示,而不是窗口的方法。

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的或多或少機械包裝。接受Display*Window的函數通常映射到Window類的方法,只接受Display*的函數映射到Display的方法。

+0

非常確定我嘗試了這一點,但是如果它真的起作用了,你現在就可以投票決定了。將檢查一下! – Torxed

+0

可以發誓我試過這個,我做到了。但是我沒有顯示,ungrab_pointer(X.CurrentTime)'< - 注意逗號而不是點。 *嘆* – Torxed