KDE - 在启动时在特定工作区中运行特定命令

KDE - 在启动时在特定工作区中运行特定命令

我同时处理很多文档。基本上,我使用 3-5 个工作区,每次都使用相同的文件 - 在特定文件夹中打开终端,使用 gedit 处理特定文件并使用 evince 查看结果(我使用 latex)。问题是 - 如何自动化打开文件的过程?我想要的是使用 gedit 和 evince 打开我的工作来启动 Ubuntu。

有一段时间,KDE 尝试打开最后保存的程序,但效果不佳——我打开了 gedit 和 evince,但文件为空白。

我已经看过一些关于 devilspie 的文章(不是我指定的方式,我想获取特定的命令,而不仅仅是在工作区 2 中打开 Firefox)以及在启动时运行命令(似乎更好,但我仍然不知道如何告诉终端有关工作区的信息)。

答案1

1)安装wmctrl

sudo apt-get install wmctrl

2)创建包含以下内容的文件并使其可执行

#!/bin/bash
wmctrl -s 0 #Switches to workspace 0 [workspaces are numbered from 0]
gnome-terminal & #Say you want a terminal in the 0th workspace
nautilus & #Maybe a file browser too
sleep 2 #Windows take some time to open. If you switch immediately, they'll open up in wrong workspaces. May have to change the value 2.
wmctrl -s 1 #Switches to workspace 1
firefox & #You get the idea. Continue for all workspaces
sleep 2
wmctrl -s 0 #You will be left at this workspace when the script finishes executing

3) 从.xsessionrc您的主目录中调用此脚本(如果您必须创建此文件)以在每次登录时自动执行该过程。或者,您可以在需要时从终端调用它。编辑:将其放在“启动应用程序”中,而不是 .xsessionrc 中。.xsessionrc 甚至会在桌面环境加载完成之前执行。


您可能希望创建一个自定义 xsession,以便有两个会话可供选择,一个会话会自动打开这些应用程序,另一个会话则不会。但我觉得这没有必要。


如果您觉得切换到工作区、打开相应的应用程序,然后切换到下一个工作区很耗时,您可以一次性打开所有应用程序,然后使用 移动窗口wmctrl。例如

wmctrl -r 'Firefox' -t 1

将标题中带有 Firefox 的窗口移至工作区 1。如果存在多个窗口,wmctrl则将移动由 管理的窗口列表中的第一个窗口。您需要知道应用程序将创建的窗口的标题才能使用它。这就是为什么我不建议将其作为主要选项的原因。如果标题明确无误,就像大多数常用应用程序的情况一样,那么这就是可行的方法。


以全屏方式打开应用程序:

某些应用程序(例如 gnome-terminal)具有命令行参数,用于以最大化状态或全屏模式打开窗口。如果存在此类选项,请使用它们。否则,请使用wmctrl以下方法

wmctrl -r 'username@machinename' -b add,maximized_vert,maximized_horz

这会最大化我的(已经存在的)终端窗口。

wmctrl -r 'username@machinename' -b add,fullscreen

这将使窗口进入全屏模式。


浏览wmctrl的手册页。您可能会发现它的更多功能。

这个答案取自此来源

答案2

我一直没能找到一种一致的方法,通过搜索打开程序并定位到特定位置。似乎没有直接的方法将命令绑定到其窗口。所以我编写了一个小型 bash 函数,它使用 wmctrl 和 sleep 的组合来识别和定位窗口。

此函数利用了最后创建的窗口出现在 wmctrl 列表最后的事实。由于将 wmctrl 和 sleep 结合起来识别窗口的本质是黑客行为,我无法解决在启动脚本中使用此函数的问题。我怀疑它是否能正常工作。

功能

position_program ()
{
    $1 &
    sleep $2
    window_id=`wmctrl -l | tail -n1 | cut -f1 -d " "`
    wmctrl -ir $window_id  -e 0,$3
    if [ ! -z "$4" ]; then
        wmctrl -ir $window_id -t $4
    fi
}

参数 1 应该是需要执行的命令,用引号引起来。

参数 2 是等待的时间。脚本需要知道从运行命令到窗口实际出现之间要等待多长时间。

参数 3 是 x、y、高度、宽度的几何规范。您可以使用命令

xwininfo | grep geometry

帮助您获得正确的值。(运行命令,单击具有所需几何图形的窗口)

参数 4 是可选的,并根据你的问题添加。它需要一个整数来表示将窗口移动到哪个桌面。枚举从 0 开始,因此你的第一个桌面是 0,第二个是 1,依此类推

例子

#! /bin/dash
position_program ()
{
    $1 &
    sleep $2
    window_id=`wmctrl -l | tail -n1 | cut -f1 -d " "`
    wmctrl -ir $window_id  -e 0,$3
    if [ ! -z "$4" ]; then
        wmctrl -ir $window_id -t $4
    fi
}

# open gedit, position to the upper left corner, sized as 1000x1000
position_program  "gedit --new-window my_text.txt" 1 "0,0,1000,1000" 0

#open another gedit window, same as before but on desktop 2
position_program  "gedit --new-window my_othertext.txt" 1 "0,0,1000,1000" 1

显然,不同程序的睡眠时间会有所不同。更有趣的是,如果您第二次使用同一程序,但针对的是新窗口,睡眠时间也会有所不同。因此有时可能需要进行实验。

希望您能了解脚本的工作原理,并可能根据需要编辑它或重新使用策略。我已经在 lubuntu 和 kubuntu 上进行了测试,它应该也可以在其他基于 x 的环境中工作。

相关内容