如何强制应用程序窗口在启动应用程序后自动最大化?

如何强制应用程序窗口在启动应用程序后自动最大化?

我尝试使用 Docky,然后我将其删除,之后我的浏览器(Chromium)无法以最大高度打开,每次我都应该自己最大化它。(XFCE 桌面)

答案1

如何启动最大化的应用程序(任意)

通过下面的脚本启动应用程序,你可以强制任何应用程序*最大化启动。如果您替换主要的通过命令在文件(的副本)中.desktop运行该脚本(请参阅下文如何执行此操作)或将其添加为快速列表快捷方式,您就可以实现您想要的效果。

*有些应用程序具有固定的、不可更改的窗口大小,有些窗口会在可能已经打开的窗口中打开新选项卡

关于脚本

该脚本使用以下命令运行:

python3 /path/to/script <application>

剧本:

  • 首先运行命令来打开应用程序
  • 为了防止时间问题,它会等待应用程序(新)窗口出现在 -command的输出中(通过在其pid和相应窗口之间找到匹配项) (仅 15 秒,以防止无限循环)idwmctrl -lp
  • 一旦窗口出现,它会使用以下命令最大化窗口:

    xdotool windowsize <window_id> 100% 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(x).decode("utf-8")
ws1 = get(["wmctrl", "-lp"]); t = 0
subprocess.Popen(app)
while t < 30:      
    ws2 = [(w.split()[2], w.split()[0]) for w in get(["wmctrl", "-lp"]).splitlines() if not w in ws1]
    procs = sum([[(w[1], p) for p in get(["ps", "-u", user]).splitlines() \
              if app[:15].lower() in p.lower() and w[0] in p] for w in ws2], [])
    if len(procs) > 0:
        subprocess.call(["xdotool", "windowsize", "-sync", procs[0][0] , "100%", "100%"])
        break
    time.sleep(0.5)
    t = t+1

如何使用

  1. 脚本wmctrl需要xdotool

    sudo apt-get install wmctrl xdotool
    
  2. 将上述脚本复制到一个空文件中,另存为run_maximized.py

  3. 现在编辑您的.desktop文件:

    • 将全局.desktop文件复制到本地:

      cp /usr/share/applications/chromium-browser.desktop ~/.local/share/applications
      

XFCE 版本:

  1. 使用 gedit 打开文件:

    gedit ~/.local/share/applications/chromium-browser.desktop
    

    浏览至以下行:

    Exec=chromium-browser %U
    

    (这是第一行,以Exec=

    改成:

    Exec=python3 /path/to/script.py chromium-browser
    

    您需要/path/to/script.py用实际路径替换其中。

  2. 注销并重新登录。从现在开始,您的 Chromium 启动器将最大化打开 Chromium。

Unity 版本:

  1. 使用 gedit 打开文件:

    gedit ~/.local/share/applications/chromium-browser.desktop
    

    浏览至以下行:

    Actions=NewWindow;Incognito;TempProfile;
    

    改成:

    Actions=NewWindow;Incognito;TempProfile;divider1;Open maximized;
    

    在文件的最底部添加以下部分:

    [Desktop Action Open maximized]
    Name=Open maximized
    Exec=python3 /path/to/script.py chromium-browser
    OnlyShowIn=Unity;
    
    [Desktop Action divider1]
    Name=.....................................
    OnlyShowIn=Unity;
    

    您需要/path/to/script.py用实际路径替换其中。

  2. 注销并重新登录。从现在开始,您的 Chromium 启动器如下所示:

    在此处输入图片描述

重要的提示

.desktop文件中,您必须例如,使用绝对路径;~不起作用。这适用于.desktop中的文件/usr/share/applications~/.local/share/applications以及启动应用程序中的命令(实际上由.desktop中的文件调用~/.config/autostart)。

答案2

虽然这并非 100% 万无一失,但更简单的方法是修改Exec=现有.desktop文件中的行并直接在那里运行xdotool search --sync。这会等待窗口被映射,并避免硬编码延迟。并不是贬低辛苦的工作Jacob 将其放入 Python 脚本中, 但它对于 shell 中本质上只有一行代码的东西来说,这似乎太昂贵了。

下面是一个例子,使用点菜(系统菜单的 GUI 编辑器):

Exec=sh -c 'alacarte & xdotool search --sync --onlyvisible --class alacarte windowsize 100%% 100%%'

请注意,&这至关重要,它将应用程序置于后台。还请注意% 必须转义为%%在密钥内Exec

.desktop我说的“并非 100% 万无一失”是指手动编辑文件的过程很容易出现拼写错误,而且如果你搞砸了某些事情,你不太可能从任何地方得到好的错误消息。你通常只会得到......什么都没有。该实用程序dex(可在“universe”存储库中找到)可以.desktop直接从 shell 运行文件,其-v选项可能有助于调试。

可以.desktop直接/usr/share/applications(以 root 身份)编辑文件,但最好使用 Alacarte 或自由菜单在 中创建一个~/.local/share/applications,这样您的更改就不会被将来的软件包更新覆盖。两者都应该可以从 Ubuntu 及其衍生产品上的“universe”存储库中获得。

最后,如果您.desktop手动编辑文件,请update-desktop-database在包含目录中运行以更新缓存,否则可能看起来什么都没有发生。

相关内容