如何使用python xlib正确处理CreateNotify事件?

时间:2015-09-01 18:04:23

标签: python events xlib

我想在用户打开它时更改窗口属性。

在此示例中,我只是尝试处理CreateNotify个事件:

#!/usr/bin/python
import Xlib
from Xlib import X, display, error
import time

disp = Xlib.display.Display()
root = disp.screen().root
root.change_attributes(event_mask=Xlib.X.SubstructureNotifyMask)

def getProp(win, prop):
    p = win.get_full_property(disp.intern_atom('_NET_WM_' + prop), 0)
    return [None] if (p is None) else p.value

while True:
    event = disp.next_event()
    if event.type == X.CreateNotify:
        newWin = event.window
        try:
            newWinName = getProp(newWin, 'NAME')
            newWinPID = getProp(newWin, 'PID')[0]

            if newWinName and newWinPID:
                print time.strftime('%H:%M:%S'), "- new window:", newWinPID, newWinName
            else:
                print 'NAME or PID property not found.'
            print

        except Xlib.error.BadWindow:
            print "BadWindow error"

此脚本正确捕获“新窗口”事件。 然而,脚本并没有完全按照我的想法输出,所以我有一些问题。在这个例子中,我打开了两次Firefox窗口。

  1. 为什么所有这些事件?我期望得到2个活动,我最后得到了6个。
  2. 哪些来自BadWindows的错误?
  3. 为什么有些窗口没有_NET_WM_ID_NET_WM_NAME属性?
  4. 由于某些软件(如Firefox)的多个实例具有相同的PID,如何选择特定窗口(例如仅更改一个firefox实例的属性)?
  5. 我使用Linux Mint Cinnamon(Muffin窗口管理器)。

    有输出:

    BadWindow error
    19:58:16 - new window: 10510 firefox
    
    NAME or PID property not found.
    
    19:58:16 - new window: 8417 Firefox
    
    19:58:16 - new window: 8417 Firefox
    
    BadWindow error
    NAME or PID property not found.
    
    BadWindow error
    BadWindow error
    19:58:20 - new window: 10519 firefox
    
    19:58:20 - new window: 8417 Firefox
    
    NAME or PID property not found.
    
    19:58:20 - new window: 8417 Firefox
    
    BadWindow error
    NAME or PID property not found.
    

1 个答案:

答案 0 :(得分:0)

  

为什么所有这些事件?我期望得到2个事件,我最后得到了6个。

当鼠标悬停在按钮上时,会弹出一个弹出窗口。此弹出窗口计为“窗口”。

  

哪些来自BadWindows的错误?

弹出窗口。

  

为什么有些窗口没有_NET_WM_ID和_NET_WM_NAME属性?

只有带边框的窗口才有_NET_WM_ID和_NET_WM_NAME属性。

没有边框的Windows没有它们。

弹出窗口是没有边框的窗口。