这对我来说是非常奇怪的。 有人可以解释为什么activate()函数应该需要一个时间戳吗? 99.9%的时间不是NOW或ASAP还是“尽早”? 而且,如果你尝试w.activate(0),你会得到这个警告:
Wnck-WARNING: Received a timestamp of 0; window activation may not function properly
我已阅读有关此警告的每个论坛主题都没有答案。 但是,他们似乎都指出,除非你真的把时间戳放进去,否则代码不能正常工作。 如果你把(0)放进去,事情就不起作用,你就会得到警告。 但是,对于我来说,如果我把一个时间戳,那就是当事情不起作用。 如果我使用(0),程序工作除了我得到警告(只有当我运行在terminal窗口)。
为什么地球上激活()关心“时间”呢?
我是唯一认为这是疯了吗?
这实际上与X11和可串行化有关。 时间戳用于排序消息,并告诉哪些是迟到,可以安全地忽略。 否则,应该被忽略的过去的消息,因为它们的效果被新消息覆盖,将不正确地应用它们的效果。
在这种情况下,如果一条消息表示激活窗口X,另一条激活窗口Y没有时间戳,则不可能知道X的消息是在Y之前还是之后发生的。
请参阅第3节“ 为什么X不是我们的理想窗口系统” ,这是由于在X协议中缺少时间戳和可串行化的结果。
也不应该在window.activate(int(time.time()))
使用int(time.time())
,这是客户端的时间,而是服务器发送的最后一个时间戳。
Wnck包含这个功能。 这是需要服务器往返。 将其转换为Python可能会起作用,而且会是一个完全的另一个问题,但Wnck的Python绑定不会导出此函数,因为它是唯一的函数,它返回其他函数期望的时间戳作为参数:
/** * get_server_time: * @display: display from which to get the time * @window: a #Window, used for communication with the server. * The window must have PropertyChangeMask in its * events mask or a hang will result. * * Routine to get the current X server time stamp. * * Return value: the time stamp. **/ static Time get_server_time (Window window) { unsigned char c = 'a'; XEvent xevent; TimeStampInfo info; info.timestamp_prop_atom = _wnck_atom_get ("_TIMESTAMP_PROP"); info.window = window; XChangeProperty (_wnck_get_default_display (), window, info.timestamp_prop_atom, info.timestamp_prop_atom, 8, PropModeReplace, &c, 1); XIfEvent (_wnck_get_default_display (), &xevent, timestamp_predicate, (XPointer)&info); return xevent.xproperty.time; }
但是,如果处理X事件的循环只跟踪来自服务器消息的时间戳,则需要往返。 我认为Wnck或GDK做到了这一点,并具有获得价值的功能。
使用python包含有效时间戳的简单方法是使用以下内容:
now = gtk.gdk.x11_get_server_time(gtk.gdk.get_default_root_window())
w.activate(现)
这给了一个时间戳,以便警告不打印。