如何在应用程序启动时设置 X11 窗口类

如何在应用程序启动时设置 X11 窗口类

我有一个没有设置自己的 x11 窗口类的应用程序,有没有一种简单的方法可以从命令行执行此操作?我已经搜索了 x11 命令来执行此操作,但没有找到任何内容。

例子:

some_command --window-class 'NewWindowClass' --run MY_PROGRAM

答案1

应用程序在创建窗口时设置类。

这意味着应用程序最终会确定您是否可以设置该类,如果可以,则使用什么命令行选项。没有通用的选择。

特别是,您不能从另一个应用程序执行此操作(除非您开始通过预加载库以及拦截 XCreateWindow 调用等来执行棘手的操作)

但是,如果应用程序使用 Xt 命令行解析,则该选项-class通常会起作用(除非被应用程序禁用)。

答案2

我也需要这个功能。怎么样:

xclock &
PID=$!
xdotool search --sync --all --pid ${PID} --name '.*' set_window --classname "A" set_window --class "B"

它的工作原理是:

  • MY_PROGRAM在后台启动 X 应用程序(在您的情况下是)
  • 将启动的应用程序的进程 ID (PID) 保存到变量中
  • 用于xdotool从 PID 中查找 X 窗口 ID(它甚至会等到窗口第一次出现时使用该sync选项)
  • 用于xdotool设置窗口的classnameclass

注意:我们必须这样做,xdotool search --sync --all --pid ${PID} --name '.*'因为似乎xdotool不支持更短的调用,例如xdotool search --sync --pid ${PID}仅基于 PID 进行搜索。

此外,这可能无法像文档中所述那样工作xdotool

这可能不适用于某些未在其窗口上设置此元数据的 X 应用程序

如果您有可靠的方法自己获取 X 窗口 ID,您可以简单地执行以下操作(更改0x0620000a为您自己的 X 窗口 ID):

xdotool set_window --classname "A" 0x0620000a set_window --class "B" 0x0620000a

要检查它是否有效,您可以执行以下操作:

wmctrl -l -x -p | grep xclock

应该输出如下内容:

0x0640000a  0 993355 A.B                   pc xclock

相关内容