【问题标题】:How to detect if xlib application running from xinit?如何检测 xlib 应用程序是否从 xinit 运行?
【发布时间】:2018-12-05 05:49:16
【问题描述】:

我编写了一个 xlib C 应用程序。我需要它的不同行为,这取决于它是否在没有 X 服务器启动时从 CLI 使用 xinit ./myapp 运行,而不是在普通 KDE 桌面中运行。

argv[0] 在两种情况下都返回相同的值(即没有看到 xinit 前缀)。

我如何确定xinit 何时用于启动我的应用程序?

【问题讨论】:

  • 不确定我是否理解这个问题。 xinit 将启动 X 服务器,因此在这两种情况下,您都可以假设 X 服务器正在运行。据我所知,没有办法确定这样的事情。
  • 您是否只是在寻找窗口管理器是否正在运行?如果是这样,那么this question 可能会有所帮助。除了使用 xinit 之外,还有其他方法可以在没有 DE/窗口管理器的情况下启动 X,因此检查 xinit 可能不是一个好主意。

标签: c command-line-interface x11 xlib kde


【解决方案1】:

感谢 cmets。我不知道如何更准确地描述我的任务,我实际上并不需要 xinit(或 X 服务器左右)。也许是的,我需要知道窗口管理器是否正在运行。事实上,我只需要确定 kwin颜色反转 是否处于活动状态(这就是为什么我需要检测的原因,即使我知道 AX 程序不应该关心它显示在哪个窗口管理器下。在上面的 URL 中)。但是准确地确定反演是相当复杂的。但是因为对我来说,KDE 中的反转是永久开启的,所以我也许可以测试窗口管理器是否正在运行...

目前,使用建议的解决方案,我至少能够针对我的特定情况解决它。但不确定它是否足够便携。

fp = popen("/usr/bin/xprop -root _NET_SUPPORTING_WM_CHECK", "r");
if (fp == NULL) {
    printf("Failed to run `/usr/bin/xprop -root _NET_SUPPORTING_WM_CHECK`\n" );
    exit(1);
}
fgets(cmdout, sizeof(cmdout), fp);
pclose(fp);
i = strncmp(cmdout, "_NET_SUPPORTING_WM_CHECK(WINDOW): window id #", 40);
if (i == 0) {
    inverted_colors = 1;
    printf ("Window manager detected.\n");
} else {
    inverted_colors = 0;
    printf ("No window manager detected.\n");
}

【讨论】:

    猜你喜欢
    • 2012-08-18
    • 1970-01-01
    • 2010-09-26
    • 2015-06-27
    • 2016-01-15
    • 2015-01-30
    • 2021-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多