如何永久更改窗口标题?
生成窗口标题涉及哪些文件? 例如,如果打开Rhythmbox,则会将程序名称视为窗口标题。 但它不是由.desktop
文件生成的。 我需要编辑哪些文件才能将文本添加到应用程序的标题中? 我希望这些变化是永久性的
我使用Ubuntu GNOME 15.04和GNOME 3.16。
初始名称通常由应用程序本身的(代码)设置。 但是你可以改变它,例如使用xdotool
,你必须先安装它:
sudo apt-get install xdotool
然后,一旦安装,您可以通过(例如)命令设置另一个窗口名称:
xdotool search --name "Unity LauncherSwitcher" set_window --name "Monkey"
这会改变:
成:
注意
如您所见,该命令存在:
xdotool search --name "" set_window --name ""
必须完全匹配。
另外编辑
从你的评论中,我理解上面的命令不起作用。 我用不同的应用程序测试它,它工作…
但由于一个我不明白的原因,不是Rhytmbox
(!!可能是一个bug)
另一种方法是使用wmctrl
,你也必须安装它:
sudo apt-get install wmctrl
然后使用命令:
xprop -id "$(wmctrl -l | grep 'Rhythmbox' | awk '{ print $1 }')" -set WM_NAME "Music"
我在Rhythmbox
上成功测试了它:
永久改变?
如上所述,默认窗口名称在应用程序的代码中定义。
更改默认窗口标题需要更改代码。 如果代码可用,则需要重新编译,并且取决于所使用的语言等等。 在我看来,一般指令是非常不可能的,超出(超出)AU的范围。
编辑2
从单个文件灵活地管理/设置每个应用程序的自定义窗口名称
在您的原始问题中,您想知道是否存在某种文件来设置特定应用程序的新窗口的标题。 如上所述,情况并非如此,但可以创建它。
在下面的设置中,您可以非常轻松地在每个应用程序基础上定义新窗口的命名方式。 只需在~
(您的主目录)中创建一个名为window_names.txt
。 对于要为其设置特定windowname的每个应用程序,添加一行,后续应用程序和所需的窗口名称:
文本文件,定义每个应用程序的窗口名称
gnome-terminal Monkey eats gedit Banana rhythmbox if he runs out of peanuts
说明
该设置存在简单的后台脚本。 脚本很轻,因此不会对性能产生任何明显的影响。
脚本启动后,会读取文件~/window_names.txt
并加载每个应用程序的设置。 然后它会关注新创建的窗口。 如果出现属于其中一个应用程序的窗口,在该文件中定义,则会相应地设置窗口名称。
如何设置
-
该脚本使用
wmctrl
和xdotool
:sudo apt-get install wmctrl sudo apt-get install xdotool
-
将脚本复制到空文件中,将其另存为
setwindowname.py
-
创建文件
~/window_names.txt
(名为window_names.txt
),以下列格式添加应用程序:例如
gedit Text editor
窗口名称可以包含空格。
-
通过以下命令从终端测试脚本:
python3 /path/to/setwindowname.py
-
如果一切正常,请将其添加到启动应用程序:Dash> Startup Applications> Add
请注意,在某些情况下,如果桌面尚未完全加载,则脚本可能会中断。 如果情况确实如此,添加到启动应用程序的命令将是:
/bin/bash -c "sleep 15&&python3 /path/to/setwindowname.py"
剧本
#!/usr/bin/env python3 import subprocess import time import os f = os.environ["HOME"]+"/"+"window_names.txt" change = [] lines = open(f).read().splitlines() for l in lines: try: change.append([l.split()[0], (" ").join(l.split()[1:])]) except IndexError: pass get = lambda cmd: subprocess.check_output(cmd).decode("utf-8").strip() curr_1 = [] while True: try: curr_2 = get(["wmctrl", "-lp"]).splitlines() new = [w for w in curr_2 if not w in curr_1] for item in new: line = item.split(); pid = line[2] procs = get(["ps", "-e"]).splitlines() match = [l for l in procs if pid in l][0] for app in [app for app in change if app[0] in match]: subprocess.Popen(["xdotool", "set_window", "--name", app[1], line[0]]) curr_1 = curr_2 time.sleep(0.3) except: pass
笔记
- 如果编辑了
~/window_names.txt
文件,则需要重新启动脚本。 - 无论应用程序如何启动,它都可以工作; 当应用程序从终端/和/或
sudo
运行时,它也可以工作。 - 它不会干扰任何应用程序的右键单击选项。
- 该脚本还“维护”窗口名称; 如果另一个进程随后更改了窗口名称(打开选项卡,更改目录等),脚本会将窗口视为“新窗口”并保留您选择的窗口名称。
标题由应用程序可执行文件生成,并且没有简单的方法来编辑它。
一旦应用程序打开,就更改它的标题:
- 使用
sudo apt-get install xdotool
- 用
pgrep myapp
获取应用程序的pid(即pgrep rythmbox
) -
更改窗口标题(将
HERE_THE_PID
替换为应用程序的进程ID):xdotool search --onlyvisible --pid HERE_THE_PID --name "\a\b\c" set_window --name "$new_name"
制作脚本以启动具有自定义标题的任何应用程序:
-
使用以下内容创建名为
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
-
使用
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
-
将其替换为创建文件的名称:
Exec=custom title (fx. Exec=music)
- 将文件另存为新的custom-name.desktop fx。 music.desktop。 请注意不要覆盖原始文件!
使更改对“打开方式”function有效
- 运行
gksudo gedit /usr/share/applications/rhythmbox-device.desktop
- 将
rhythmbox
更改为上一个.desktop文件中使用的名称。 - 保存文件。
- 使用系统监视器或使用
sudo kill rhythmbox
活动进程 - 插入您的手机/音乐播放器并按“打开方式(音乐应用程序)”以查看它是否有效。
(摘要)您应该拥有的文件概述
要使应用程序完全正常运行,完成后, /usr/share/applications
应该有3个.desktop文件:
-
music.desktop
或您为应用程序提供的名称使用
Exec=music
和Hidden=true
(如果不存在则添加最后一个) -
rhythmbox.desktop
使用
Exec=rhythmbox %U
和Hidden=true
-
Rhythmbox的-device.desktop
使用
Exec=music --select-source %U
并且没有隐藏条目
这意味着您始终打开最后一个文件,标题始终如此。 当您使用ALT + F2 + R刷新会话时,唯一的方法是重置。
- 你应该在
/usr/local/bin
ofcourse中使用bash脚本。
最后的说明:
- 当我使用
--name "\a\b\c"
修复错误时 ,请不要替换为应用程序名称! - 如果取消注释脚本的最后一行,则在应用程序关闭之前,脚本不会结束。
-
在@Maud Kon请求的代码中解释
${@:2}
:-
$@
是一个存储所有位置参数的数组。 -
${@:2}
表示: 所有位置参数,但第一个 -
假设我以这种方式调用程序:
awesome-program foo bar baz fooz
-
${@:1}
将是foo bar baz fooz
-
${@:2}
将是bar baz fooz
-
${@:3}
将是baz fooz
-
${@:4}
将是fooz
-
${@:5}
为空,因为没有更多的位置参数。
-
-
$@
,${@}
和${@:1}
是一回事:所有位置参数。 - 在此处了解有关此主题的更多信息: http : //wiki.bash-hackers.org/scripting/posparams
-
只需使用翻译文件!
我遇到了Thunar遇到的这个非常棘手的问题 :当Compiz Scale将Thunar窗口标题显示为“AnyFolder – 文件管理器”并且带有不必要信息的空间时,它变得很烦人。
我用xdotool
和wmctrl
尝试了上面提到的方法但是它们不是永久性的,因为Thunar每次去另一个文件夹时都会改变它的窗口标题。 每当Thunar改变它时,让背景中的脚本改变标题会让人感到夸张。
更简单的解决方案是使用每个应用程序附带的翻译文件 。 您只需使用gettext
包中包含的名为msgfmt
的工具重新编译转换源文件。 我只是为gThumb做了这个 – 只是为了好玩 – 它也有效。
1.获取相关应用程序的源代码。
键入$ sudo apt-get source APPLICATION
或转到http://packages.ubuntu.com ,获取源代码并查找名为po
的文件夹:它包含纯文本语言文件。 寻找你的语言。 假设你来自巴西,那个文件就是pt_BR.po
2.根据您的需要更改文件
寻找确切的! 您希望摆脱或更改的窗口标题。 在Thunar的案例中,它是“文件管理器” ,在pt_BR.po
我找到了
:. set window title : ../thunar/thunar-window.c:3154 ../Thunar.desktop.in.in.h:3 : ../thunar/thunar-settings.desktop.in.h:1 msgid " File Manager " msgstr " Gerenciador de arquivos "
其中msgid
是应用程序发送的信号, msgstr
是langpack将其转换为的信号。
将msgstr
更改为您喜欢的任何内容,即msgstr "o_-"
。
我了解到,如果你将翻译留空,就像这样msgstr ""
应用程序将回归到msgid
。 如果你想让它“空”使用空格。 或点。 或任何时髦的ASCII符号。
3.获取编译器
如前所述,您需要来自gettext
包的msgfmt
,因此您需要输入
$ sudo apt-get install gettext
4.编译
打开终端,转到包含已更改的pt_BR.po
的文件夹,让msgfmt检查文件是否有错误:
$ msgfmt --check --check-accelerators=_ -o /dev/null pt_BR.po
如果没问题,请继续编译:
$ msgfmt -c -o pt_BR.mo pt_BR.po
5.放置文件
看看如何命名/ usr / share / locale / YOUR_LANGUAGE / LC_MESSAGES /或/ usr / share / locale-langpack / YOUR_LANGUAGE / LC_MESSAGES /中的原始翻译并将文件放在那里。 如果它在两个地方都不存在,请将其放入其中一个并使用文件名进行一些实验:小写,Camelcase或类似的东西,即gthumb.mo
或YOUR-APP.mo
。
首先备份原始文件:
$ sudo cp /usr/share/locale/ YOUR_LANGUAGE /LC_MESSAGES/ YOUR-APP.mo /usr/share/locale/ YOUR_LANGUAGE /LC_MESSAGES/ YOUR-APP.mo.BAK
然后在那里复制你的新翻译
$ sudo cp pt_BR.mo /usr/share/locale/ YOUR_LANGUAGE /LC_MESSAGES/YOUR-APP.mo
如果YOUR_APP正在运行,请关闭它的所有实例。
测试吧!
提示如果您正在使用EN本地化运行Ubuntu,只需使用任何* .po,删除或注释所有未更改的msgid / msgstr对,并将其放入/ usr / share / locale / en / LC_MESSAGES / 。
资料来源:
http://wiki.xfce.org/translations/translation_guidance_in_xfce
用wmctrl替换(部分)窗口标题
由于我自己使用应用程序的翻译文件的答案对于我来说不适合我的几个案例,我建立在Jacob Vlijm的解决方案上并修改了他的脚本来替换窗口标题中的某些字符串。 我希望可以发布一个单独的答案。 积分转到雅各布Vlijm的想法和设置脚本!
例如,我喜欢阅读Some fancy website
而不是Some fancy website - Mozilla Firefox
。 Compiz scale插件现在更加清晰,因为我也删除了- File manager
和其他字符串。
我做的改变:
- 使用
//
作为window_names.txt
分隔符以允许使用空格 - 使用
wmctrl
而不是xdotool
来修改窗口标题(因为xdotool不能很好地处理非ASCII字符):wmctrl -i -r [WindowIdentifier] -N 'new Title'
- 脚本中的一些额外行来进行字符串替换等。
修改后的window_names.txt
的结构如下:
[process name]//[exact text to replace]//[replacement text]
firefox// - Mozilla Firefox// (whitespace!) thunar// - File Manager// ° xyz gedit// - gedit// - 123
拉皮条剧:
#!/usr/bin/env python3 import subprocess import time import os f = os.environ["HOME"]+"window_names.txt" change = [] lines = open(f).read().splitlines() for l in lines: try: change.append(l.split("//")) except IndexError: pass get = lambda cmd: subprocess.check_output(cmd).decode("utf-8").strip() curr_1 = [] while True: try: curr_2 = get(["wmctrl", "-lp"]).splitlines() new = [w for w in curr_2 if not w in curr_1] for item in new: line = item.split(None, 4) winID = line[0] ; pid = line[2] ; currentTitle = line[4] procs = get(["ps", "-e"]).splitlines() match = [l for l in procs if pid in l][0] for app in [app for app in change if app[0] in match]: newTitle = str.replace(currentTitle, app[1], app[2]) subprocess.Popen(["wmctrl", "-i", "-r", winID, "-N", newTitle]) curr_1 = curr_2 time.sleep(0.3) except: pass
再说一遍:致记Jacob Vlijm的想法并设置剧本!