我如何修复(使)应用程序窗口在桌面的所需位置打开?

我如何修复(使)应用程序窗口在桌面的所需位置打开?

例如,我希望 SMPlayer 窗口始终在桌面中间打开,因为当我每次启动时将它放在中间时,它会随着时间的推移向左向上移动,所以我不得不将它拖回来,而且我不喜欢一遍又一遍地重复它。

那么,如何让打开的应用程序窗口放置在我想要的位置?

答案1

如果使用以下参数运行以下脚本:

<application> <x> <y>

应用程序的窗口将放置在屏幕上的 x,y 位置。

如何设置

该脚本同时使用了wmctrlxdotool

sudo apt-get install wmctrl
sudo apt-get install xdotool

然后:

  1. 最优雅的方法是将脚本复制到一个空文件中,并将其保存为~/bin(您可能必须创建目录)place_window(无扩展名)
  2. 使脚本可执行(!)
  3. 如果您刚刚创建~/bin,请注销/登录或运行以下命令:

    source ~/.profile
    
  4. 使用以下命令进行测试运行(例如):

    place_window gedit 100 100
    

    gedit 窗口应该出现在屏幕上 x = 100、y = 100 处。

如果一切正常,您可以将命令放在快捷方式组合下(选择:系统设置>“键盘”>“快捷方式”>“自定义快捷方式”),或者将其作为应用程序启动器的快速列表快捷方式。

剧本:

#!/usr/bin/env python3
import subprocess
import getpass
import time
import sys

app = sys.argv[1]
user = getpass.getuser()
get = lambda x: subprocess.check_output(["/bin/bash", "-c", x]).decode("utf-8")
ws1 = get("wmctrl -lp"); t = 0
subprocess.Popen(["/bin/bash", "-c", app])

while t < 30:      
    ws2 = [w.split()[0:3] for w in get("wmctrl -lp").splitlines() if not w in ws1]
    procs = [[(p, w[0]) for p in get("ps -u "+user).splitlines() \
              if app[:14] in p and w[2] in p] for w in ws2]
    if len(procs) > 0:
        w_id = procs[0][0][1]   
        cmd1 = "wmctrl -ir "+w_id+" -b remove,maximized_vert remove,maximized_horz"
        cmd2 = "xdotool windowmove "+w_id+" "+sys.argv[2]+" "+sys.argv[3]
        for cmd in [cmd1, cmd2]:
            subprocess.call(["/bin/bash", "-c", cmd])
        break
    time.sleep(0.5)
    t = t+1

怎么运行的

脚本运行启动应用程序的命令,等待相应的窗口出现(等待 pid 产生新窗口)并将其定位到您定义的坐标。

place_window gedit 50 150

在此处输入图片描述

place_window gedit 150 50

在此处输入图片描述

将命令设置为快捷列表项

最优雅的方法是将其添加为键盘快捷键,或者作为快速列表项:

在此处输入图片描述

在这种情况下,该行中使用的命令Exec=将是:

Exec=/bin/bash -c "place_window gedit 600 600"

相关内容