2011-05-17 32 views
3

[已解決 - 提供的示例包含答案!] 我試圖實現一個程序,該程序在全屏幕中啓動,並且不允許任何userinput(其他鼠標和鍵盤),因爲它只是作出反應UDEV-信號,當插入USB或CD時。 我想要防止用戶放入鍵盤/鼠標,並在工作站上做些事情。 唯一需要鍵盤的情況是當管理員插入鍵盤並按下CTRL-T時,所以我的程序會打開一個終端窗口。阻止鍵盤,但得到全球Hotkeys XLib

我使用的是Debian(Squeeze)+ Gnome-Desktop-Environment。

我試圖使用XLib,它可以很好地抓取所有的鍵盤事件,但是當我的程序打開我的終端(它也可以完美)時,我不能取下鍵盤,所以用戶不能使用鍵盤,除非鍵盤 - 取消關閉。

這裏有一些重要的代碼片段:

class ScanWSClient(gtk.Window): 

    def __init__(self, url): 
     # current display 
     disp = Display() 
     self.display = disp 

     gtk.Window.__init__(self)   

     self.terminal_window = None 
     self.kb_handler = KeyboardHandler(self).start() 

     #self.fullscreen() 

     self._browser= webkit.WebView() 
     self.add(self._browser) 
     self.connect('destroy', gtk.main_quit) 

     self._browser.open(url) 
     self.show_all() 

class KeyboardHandler(threading.Thread): 
    def __init__(self, scanws_client): 
     super(KeyboardHandler,self).__init__() 
     self.running = True 
     self.daemon = True   
     self.terminal_window = None 
     self.scanws_client = scanws_client # 

    def run(self): 
     root = self.scanws_client.display.screen().root 


     while self.running: 
       event = root.display.next_event() 
       self.handle_event(event) 
       time.sleep(1) 

    def handle_event(self,aEvent): 
       keycode = aEvent.detail 
       state = aEvent.state 
       key_type = aEvent.type 

       if keycode == 28 and key_type == X.KeyPress: 
         if self.scanws_client.terminal_window == None: 
          self.scanws_client.terminal_window = TerminalWindow(self.scanws_client, "Administrative Shell started...Type *exit* to return to the locked workstation") 
         else: 
          self.scanws_client.terminal_window.present() 
          self.scanws_client.display.flush() #THIS FLUSH IS NECESSARY TO UNGRAB THE KEYBOARD LATER ON!!! 
         self.scanws_client.display.ungrab_keyboard(1, X.CurrentTime) 
         print "Key: %s/Mask: %s/Type: %s" % (keycode, state, key_type) 

       print self.scanws_client.terminal_window 

在我的螺紋KeyboardHandler,我獲取所有的xlib排隊的活動,並與我的功能「handle_event」檢查,如果有CTRL-T壓。如果是這樣,我打開我的終端和ungrab我的鍵盤(不工作):

self.scanws_client.display.ungrab_keyboard(1, X.CurrentTime)

誰能告訴我爲什麼我不能ungrab我傻鍵盤? (這個問題提供了cookie;))

回答

1

你是否調用了X服務器? Xlib是異步的並緩存所有請求,直到你填充緩衝區,進行需要服務器響應的調用,或者調用XFlush(C API接口,不確定python綁定名稱)。

+0

完美的作品。但在GrabModeAsync中,它的CTRL-T輸入和我的終端彈出窗口之間有一點延遲......但我認爲這是硬件事件和xlib處理之間的文檔中提到的保留......我更新了我的示例,所以每個人都看到如何解決它..謝謝 – ryyppy 2011-05-23 11:58:21