是否可以使用wmctrl
或其他方法使特定窗口自动显示在所有桌面上?
我用Prime Player Google Play 音乐迷你播放器 Chrome 扩展程序控制音乐播放。我已经有一个可以调用的 bash 别名,使迷你播放器停留在其他窗口之上,但我想让它将迷你播放器窗口发送到所有桌面,这样我就不必右键单击并选择发送到桌面→所有台式机(通过 openbox)。
理想情况下,我会让脚本在后台运行某些内容,一旦检测到迷你播放器窗口,它就会将其置于顶部并发送到所有桌面。这可能吗?
答案1
实际上,您无需第三方脚本即可完成此操作。Openbox 支持广泛的每个应用程序的设置。
创建特定于应用程序的规则
应用程序规则根据不同的属性进行匹配,例如窗口名称、类、角色或标题。可以通过运行以下代码获取特定窗口的大多数属性:
obxprop | grep "^_OB_APP"
并单击相关窗口。
考虑到您计划如何为 Chrome 扩展程序窗口指定规则,您可能希望提供尽可能多的匹配属性,以使规则尽可能具体。您不希望它适用于所有 Chrome 窗口。尝试不同的匹配属性,看看哪种最适合您。
定义匹配窗口后,您可以设置专门应用于相关窗口/应用程序的不同属性。以下是默认设置的摘录,rc.xml
其中描述了所有可用属性:
# each rule element can be left out or set to 'default' to specify to not
# change that attribute of the window
<decor>yes</decor>
# enable or disable window decorations
<shade>no</shade>
# make the window shaded when it appears, or not
<position force="no">
# the position is only used if both an x and y coordinate are provided
# (and not set to 'default')
# when force is "yes", then the window will be placed here even if it
# says you want it placed elsewhere. this is to override buggy
# applications who refuse to behave
<x>center</x>
# a number like 50, or 'center' to center on screen. use a negative number
# to start from the right (or bottom for <y>), ie -50 is 50 pixels from
# the right edge (or bottom). use 'default' to specify using value
# provided by the application, or chosen by openbox, instead.
<y>200</y>
<monitor>1</monitor>
# specifies the monitor in a xinerama setup.
# 1 is the first head, or 'mouse' for wherever the mouse is
</position>
<size>
# the size to make the window.
<width>20</width>
# a number like 20, or 'default' to use the size given by the application.
# you can use fractions such as 1/2 or percentages such as 75% in which
# case the value is relative to the size of the monitor that the window
# appears on.
<height>30%</height>
</size>
<focus>yes</focus>
# if the window should try be given focus when it appears. if this is set
# to yes it doesn't guarantee the window will be given focus. some
# restrictions may apply, but Openbox will try to
<desktop>1</desktop>
# 1 is the first desktop, 'all' for all desktops
<layer>normal</layer>
# 'above', 'normal', or 'below'
<iconic>no</iconic>
# make the window iconified when it appears, or not
<skip_pager>no</skip_pager>
# asks to not be shown in pagers
<skip_taskbar>no</skip_taskbar>
# asks to not be shown in taskbars. window cycling actions will also
# skip past such windows
<fullscreen>yes</fullscreen>
# make the window in fullscreen mode when it appears
<maximized>true</maximized>
# 'Horizontal', 'Vertical' or boolean (yes/no)
在您的特定情况下,您将有兴趣指定应用程序的layer
和desktop
。以下是一条规则的示例,该规则将指定特定应用程序的所有窗口始终位于所有可用桌面的顶部并无处不在:
<application name="miniplayer" class="miniplayer" type="normal">
<layer>above</layer>
<desktop>all</desktop>
</application>
我为这个例子选择了任意的应用程序名称和类别。如前所述,您必须确保为您的特定应用程序找到正确的值。
编辑:我研究了您的具体应用程序并得出了一条适用于我的系统的规则:
<application name="crx_npngaakpdgeaajbnidkkginekmnaejbi" class="Google-chrome" type="normal" role="pop-up">
<layer>above</layer>
<desktop>all</desktop>
</application>
我希望这对你也有效。
修改 openbox 配置以添加应用程序特定规则
要添加应用程序规则,请打开您的 openbox rc.xml
(~/.config/openbox/rc.xml
在 stock openbox 或~/.config/openbox/lxde-rc.xml
LXDE 下找到)并导航到<applications>
文件最末尾的部分。
在标签之间插入特定于应用程序的规则<applications>..</applications>
。然后保存文件并通过执行以下命令重新加载配置:
openbox --reconfigure
应用程序特定规则应在此之后生效,并将自动应用于新生成的窗口。
答案2
使用 Python 2.7 和库 python-wnck 找到了更通用的解决方案。
如果没有,请执行以下步骤。步骤 1-2 应该已经在 Ubuntu 中完成:
安装python2.7。
sudo apt-get install python2.7
安装 python-wnck。
sudo apt-get install python-wnck
创建文件 stick_player.py。
touch stick_player.py
添加 python shebang。
回显‘#!’
which python
> stick_player.py
使其可执行。
chmod +x stick_player.py
将此脚本粘贴到 stick_player.py 中。它应该看起来像
#!/usr/bin/python import wnck screen = wnck.screen_get_default() screen.force_update() for win in screen.get_windows(): if win.get_name() == 'Prime Player': win.stick()
在新窗口中运行您的播放器。在我的例子中,窗口名称是“Prime Player”。如果不是,请告诉我。
运行脚本。
./stick_player.py
如果您还想撤消“在所有工作区上可见”,请执行此操作。再次执行步骤 3-7,但是。
创建文件 unstick_player.py。
touch unstick_player.py
添加 python shebang。
回显‘#!’
which python
> unstick_player.py
使其可执行。
chmod +x unstick_player.py
将最后一行从 更改
win.stick()
为win.unstick()
运行脚本。
./unstick_player.py
还
您可以使用此脚本查找所有窗口名称:
#!/usr/bin/python import wnck screen = wnck.screen_get_default() screen.force_update() for win in screen.get_windows(): print win.get_name()