如何永久更改窗口标题?

Mau*_*Kon 22 window-manager xdotool wmctrl xprop

生成窗口标题涉及哪些文件?例如,如果您打开 Rhythmbox,您会看到程序名称作为窗口标题。但它不是由.desktop文件生成的。我需要编辑哪些文件才能在应用程序的标题中添加文本?我希望更改是永久性的

我使用 Ubuntu GNOME 15.04 和 GNOME 3.16。

Jac*_*ijm 23

初始名称通常由应用程序本身(内部代码)设置。但是,您可以更改它,例如使用xdotool,您必须先安装它:

sudo apt-get install xdotool
Run Code Online (Sandbox Code Playgroud)

然后,一旦安装,您可以通过(例如)命令设置另一个窗口名称:

xdotool search --name "Unity LauncherSwitcher" set_window --name "Monkey"
Run Code Online (Sandbox Code Playgroud)

这将改变:

在此处输入图片说明

进入:

在此处输入图片说明

笔记

如您所见,该命令存在于:

xdotool search --name "<current_name>" set_window --name "<new_name>"
Run Code Online (Sandbox Code Playgroud)

<current_name>具有完全匹配。


交替编辑

从您的评论中,我了解到上面的命令不起作用。我用不同的应用程序对其进行了测试,它有效......

但出于某种原因,我不明白,而不是Rhytmbox(!! 可能是一个错误)

另一种方法是使用wmctrl,您还必须安装:

sudo apt-get install wmctrl
Run Code Online (Sandbox Code Playgroud)

然后使用命令:

xprop -id "$(wmctrl -l | grep 'Rhythmbox' | awk '{ print $1 }')" -set WM_NAME "Music"
Run Code Online (Sandbox Code Playgroud)

我成功地测试了它Rhythmbox

在此处输入图片说明

在此处输入图片说明

使更改永久化?

如前所述,默认窗口名称是在应用程序代码中定义的。

更改默认窗口标题需要更改代码。如果代码可用,这可以完成,在许多情况下需要重新编译并且取决于所使用的语言等。在我看来,一般性指令是完全不可能的,并且超出(超出)AU 的范围。


编辑 2

从单个文件灵活地管理/设置每个应用程序的自定义窗口名称

在您最初的问题中,您想知道是否有某种文件可以设置特定应用程序的新窗口的标题。正如所解释的,情况并非如此,但是,它可以被创建。

在下面的设置中,您可以非常轻松地基于每个应用程序定义新窗口的命名方式。只需在~(您的主目录)中创建一个名为window_names.txt. 对于要为其设置特定窗口名称的每个应用程序,添加一行,随后,应用程序和所需的窗口名称:

一个文本文件,定义每个应用程序的窗口名称

gnome-terminal Monkey eats
gedit Banana
rhythmbox if he runs out of peanuts
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

解释

设置存在一个简单的后台脚本。脚本非常轻巧,因此不会对性能产生任何显着影响。

脚本启动后,它会读取文件~/window_names.txt并加载每个应用程序的设置。然后它会关注创建的窗口。如果出现属于文件中定义的应用程序之一的窗口,它会相应地设置窗口名称。

如何设置

  1. 该脚本同时使用wmctrlxdotool

    sudo apt-get install wmctrl
    sudo apt-get install xdotool
    
    Run Code Online (Sandbox Code Playgroud)
  2. 将脚本复制到一个空文件中,另存为 setwindowname.py

  3. 创建文件~/window_names.txt(完全命名window_names.txt),按以下格式添加您的应用程序:

    <application> <window_name>
    
    Run Code Online (Sandbox Code Playgroud)

    例如

    gedit Text editor
    
    Run Code Online (Sandbox Code Playgroud)

    窗口名称可能包含空格。

  4. 通过以下命令从终端测试运行脚本:

    python3 /path/to/setwindowname.py
    
    Run Code Online (Sandbox Code Playgroud)
  5. 如果一切正常,请将其添加到启动应用程序:Dash > Startup Applications > Add

    请注意,在某些情况下,如果在桌面尚未完全加载时启动脚本,脚本可能会中断。如果可能是这种情况,添加到启​​动应用程序的命令将是:

    /bin/bash -c "sleep 15&&python3 /path/to/setwindowname.py"
    
    Run Code Online (Sandbox Code Playgroud)

剧本

sudo apt-get install xdotool
Run Code Online (Sandbox Code Playgroud)

笔记

  • 如果文件~/window_names.txt被编辑,脚本需要重新启动。
  • 无论应用程序如何启动,它都可以工作;当应用程序从终端 / 和或使用sudo.
  • 它不会干扰任何应用程序的右键单击选项。
  • 该脚本还“维护”了窗口名称;如果之后另一个进程更改了窗口名称(例如打开选项卡、更改目录),脚本会将窗口视为“新窗口”并保留您选择的窗口名称。


0x2*_*fa0 10

标题是由应用程序可执行文件生成的,并且没有一种简单的方法来编辑它。


打开应用程序后更改其标题:

  • 安装xdotool使用sudo apt-get install xdotool
  • 使用pgrep myapp(即pgrep rythmbox)获取应用程序的pid
  • 更改窗口标题(替换HERE_THE_PID为应用程序的进程 ID):

    xdotool search --onlyvisible --pid HERE_THE_PID --name "\a\b\c" set_window --name "$new_name"
    
    Run Code Online (Sandbox Code Playgroud)

制作脚本以启动具有自定义标题的任何应用程序:

  • 创建一个change-title使用以下内容调用的 bash 脚本:

    #!/bin/bash
    
    ## The new name of the window is the first argument passed to the script:
    new_name="${1}"
    
    ## application is all arguments but the first (the title)
    application=${@:2}
    
    ## Run the app in background and in quiet mode:
    $application &> /dev/null &
    
    ## Get the pid of the app:
    app_pid=$!
    
    ## Wait until the window appears:
    until xdotool search --onlyvisible --pid $app_pid &> /dev/null; do sleep 0.01; done
    
    ## Change the window name:
    xdotool \
             search \
                    --onlyvisible \
                    --pid $app_pid \
                    --name "\a\b\c" \
             set_window \
                    --name "$new_name"
    
    ## Comment this line to run the app in background:
    wait $app_pid
    
    Run Code Online (Sandbox Code Playgroud)
  • 使其可执行 chmod a+x change-title

  • 运行它 ./change-title "NewTitle" theapp --its-arguments

要使更改永久化:

  • 运行gksudo gedit /usr/local/bin/custom-title(fx.user/local/bin/music)
  • 在文本编辑器上粘贴上述脚本并保存。
  • sudo chmod a+x /usr/local/bin/custom-title
  • gksudo gedit /usr/share/applications/rhythmbox.desktop
  • 在这个文件中,有一行(我的行号是 35)说:

    Exec=rhythmbox %U
    
    Run Code Online (Sandbox Code Playgroud)
  • 将其替换为所创建文件的名称:

    Exec=custom title (fx. Exec=music)
    
    Run Code Online (Sandbox Code Playgroud)
  • 将文件另存为新的 custom-name.desktop fx。音乐.桌面。请注意不要覆盖原始文件!

使更改对“打开方式”功能生效

  • gksudo gedit /usr/share/applications/rhythmbox-device.desktop
  • 更改rhythmbox为先前 .desktop 文件中使用的名称。
  • 保存文件。
  • 使用系统监视器或使用杀死 rhythmbox 的活动进程 sudo kill rhythmbox
  • 插入您的手机/音乐播放器,然后按“打开方式(音乐应用程序)”查看它是否有效。

(摘要)您应该拥有的文件概述

为了使应用程序完全正常运行,完成后您应该有 3 个 .desktop 文件/usr/share/applications

  1. music.desktop 或您为应用程序提供的名称

    Exec=musicHidden=true(添加的最后一个,如果不存在)

  2. rhythmbox.desktop

    Exec=rhythmbox %UHidden=true

  3. rhythmbox-device.desktop

    Exec=music --select-source %U没有隐藏条目

这意味着你总是打开最后一个文件,标题总是应该的。唯一的方法是在您使用 ALT+F2+R 刷新会话时自行重置。

  1. 而且你当然应该有 bash 脚本/usr/local/bin

最后说明:

  • 当我使用--name "\a\b\c"is 修复bug 时,不要替换为应用程序名称!
  • 如果您取消对脚本最后一行的注释,则该脚本在应用程序关闭之前不会结束。
  • 的交代${@:2}中所要求的代码@Maud昆

    1. $@ 是一个存储所有位置参数的数组。
    2. ${@:2}意思是:除了第一个之外的所有位置参数
    3. 假设我这样调用程序:

      awesome-program foo bar baz fooz
      
      Run Code Online (Sandbox Code Playgroud)
      • ${@:1} 将是 foo bar baz fooz
      • ${@:2} 将是 bar baz fooz
      • ${@:3} 将是 baz fooz
      • ${@:4} 将是 fooz
      • ${@:5} 是空的,因为没有更多的位置参数。
    4. $@${@}并且${@:1}是同一件事:所有位置参数。

    5. 在此处了解有关此主题的更多信息:http : //wiki.bash-hackers.org/scripting/posparams