首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么使用python Wnck window.activate(time.time())

为什么使用python Wnck window.activate(time.time())
EN

Stack Overflow用户
提问于 2014-12-13 00:45:34
回答 3查看 1.2K关注 0票数 6

这对我来说非常奇怪。有人能解释一下为什么activate()函数需要一个时间戳吗?99.9%的时间不就是现在或者尽快或者“在你方便的时候”吗?此外,如果您尝试使用w.activate(0),则会收到以下警告:

代码语言:javascript
复制
Wnck-WARNING: Received a timestamp of 0; window activation may not function properly

我读过的每一篇关于这个警告的论坛帖子都以没有答案结束。但它们似乎都表明,除非您实际输入时间戳,否则代码无法正常工作。如果你放入(0),事情就不起作用了,你就会得到警告。然而,对于我来说,如果我输入一个时间戳,那就是事情不起作用的时候。如果我使用(0),程序将正常运行,除非我收到警告(只有在终端窗口中运行它时)。

为什么activate()要关心“时间”呢?

我是唯一一个认为这很疯狂的人吗?

EN

回答 3

Stack Overflow用户

发布于 2014-12-13 01:01:08

这实际上与X11和可序列化有关。时间戳用于对消息进行排序,并告知哪些消息是延迟的,可以安全地忽略。否则,来自过去的消息应该被忽略,因为它们的效果已经被新的消息覆盖,将不正确地应用它们的效果。

在这种情况下,如果一条消息显示激活窗口X,而另一条消息显示激活窗口Y而没有时间戳,则无法判断X的消息是发生在Y之前还是之后。

有关由于X协议中缺乏时间戳和可序列化而导致的竞争,请参阅中的第3节。

此外,在window.activate(int(time.time()))中不应该使用int(time.time()),它是客户端上的时间,而应该使用从服务器发送的最后一个时间戳。

Wnck包含此函数。这需要服务器往返。将其转换为Python是可行的,并且完全是另一个问题,但是Wnck的Python绑定没有导出这个函数是愚蠢的,因为它是唯一一个返回其他函数期望作为参数的时间戳的函数:

代码语言:javascript
复制
/**
 * 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做到了这一点,并且有一个用于获取值的函数。

票数 4
EN

Stack Overflow用户

发布于 2015-01-29 11:27:54

在python中包含有效时间戳的一种简单方法是使用以下代码:

now = gtk.gdk.x11_get_server_time(gtk.gdk.get_default_root_window())

W.activate(现在)

这为wnck提供了一个时间戳,这样就不会打印警告。

票数 3
EN

Stack Overflow用户

发布于 2020-10-04 19:43:17

我正在使用这个设置

代码语言:javascript
复制
import gi
gi.require_version("Wnck", "3.0")
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, Wnck, GdkX11, Gdk

所以我不得不用这个来代替

代码语言:javascript
复制
now = GdkX11.x11_get_server_time(GdkX11.X11Window.lookup_for_display(Gdk.Display.get_default(),
GdkX11.x11_get_default_root_xwindow()))
window.activate(now)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27448224

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档