哪些文件与生成窗口标题有关?例如,如果您打开 Rhythmbox,您会看到程序名称作为窗口标题。但它不是由文件生成的.desktop
。我需要编辑哪些文件才能将文本添加到应用程序的标题中?我希望更改是永久的
我使用带有 GNOME 3.16 的 Ubuntu GNOME 15.04。
答案1
初始名称通常由应用程序本身(内部代码)设置。但是您可以更改它,例如通过使用xdotool
,但您必须先安装它:
sudo apt-get install xdotool
然后,一旦安装完成,您可以通过以下命令设置另一个窗口名称:
xdotool search --name "Unity LauncherSwitcher" set_window --name "Monkey"
这将改变:
进入:
笔记
如您所见,存在以下命令:
xdotool search --name "<current_name>" set_window --name "<new_name>"
必须<current_name>
完全匹配。
编辑或者
从您的评论中,我了解到上述命令不起作用。我用不同的应用程序测试了它,并且它起作用了...
但出于我无法理解的原因,不是Rhytmbox
(!!可能是个错误)
另一种方法是使用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
。对于您要为其设置特定窗口名称的每个应用程序,添加一行,随后添加应用程序和所需的窗口名称:
一个文本文件,定义每个应用程序的窗口名称
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
),按以下格式添加您的应用程序:<application> <window_name>
例如
gedit Text editor
窗口名称可能包含空格。
使用以下命令从终端测试运行脚本:
python3 /path/to/setwindowname.py
如果一切正常,请将其添加到启动应用程序:Dash > 启动应用程序 > 添加
请注意,在某些情况下,如果在桌面尚未完全加载时启动脚本,则脚本可能会中断。如果是这种情况,则要添加到启动应用程序的命令将是:
/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
。 - 它不会干扰右键单击选项任何应用。
- 该脚本还“维护”窗口名称;如果另一个进程随后更改了窗口名称(打开选项卡、更改目录等),则脚本会将该窗口视为“新窗口”并维护您选择的窗口名称。
答案2
标题是由应用程序可执行文件生成的,没有简单的方法来编辑它。
应用程序打开后更改其标题:
- 安装
xdotool
sudo apt-get install xdotool
- 使用以下方式获取应用程序的 pid
pgrep myapp
(即pgrep rythmbox
) 更改窗口标题(替换
HERE_THE_PID
为应用程序的进程 ID):xdotool search --onlyvisible --pid HERE_THE_PID --name "\a\b\c" set_window --name "$new_name"
制作脚本来启动具有自定义标题的任何应用程序:
创建一个名为 bash 脚本,
change-title
内容如下:#!/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。请小心不要覆盖原始文件!
使更改对“打开方式”功能生效
- 跑步
gksudo gedit /usr/share/applications/rhythmbox-device.desktop
- 更改
rhythmbox
为先前 .desktop 文件中使用的名称。 - 保存文件。
- 使用系统监视器或者使用以下命令终止 rhythmbox 的活动进程
sudo kill rhythmbox
- 插入您的手机/音乐播放器并按“使用(音乐应用程序)打开”以查看它是否有效。
(摘要)您应该拥有的文件概述
/usr/share/applications
为了使应用程序完全正常运行,完成后应该有 3 个 .desktop 文件:
music.desktop
或您为应用程序指定的名称与
Exec=music
和Hidden=true
(如果没有则添加最后一个)节奏盒.桌面
与
Exec=rhythmbox %U
和Hidden=true
rhythmbox-device.desktop
与
Exec=music --select-source %U
和没有隐藏入口
这意味着您总是打开最后一个文件,并且标题始终如一。重置的唯一方法是使用 ALT+F2+R 刷新会话。
- 当然,您应该有 bash 脚本
/usr/local/bin
。
最后说明:
- 当我使用时
--name "\a\b\c"
是为了修复一个错误,不要用应用程序名称替换! - 如果取消注释脚本的最后一行,则脚本将直到应用程序关闭才会结束。
${@:2}
请求的代码中的解释@Maud Kon:$@
是一个存储所有位置参数的数组。${@: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
答案3
只需使用翻译文件!
我在使用 Thunar 时遇到了这个问题:当 Compiz Scale 将 Thunar 窗口标题显示为“AnyFolder - 文件管理器”并且不必要的信息占用空间时,情况变得很烦人。
我尝试了上述方法xdotool
,但wmctrl
它们不是永久的,因为每次我转到另一个文件夹时,Thunar 都会更改其窗口标题。而且,每次 Thunar 更改标题时,后台都会有一个脚本将其改回,这感觉有点夸张。
一个更简单的解决方案是使用翻译文件msgfmt
它随每个应用程序一起提供。您只需使用软件包中包含的工具重新编译翻译源文件即可gettext
。我只是为了好玩才对 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
语言包将其翻译成什么。更改
msgstr
为您喜欢的任何内容,即msgstr "o_-"
。我了解到,如果您像这样将翻译留空,
msgstr ""
应用程序将恢复为msgid
。如果您希望它是“空的”,请使用空格。或一个点。或任何时髦的 ASCII 符号。
3. 获取编译器
如上所述,您需要msgfmt
来自gettext
包,因此您需要输入
$ 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/您的语言/LC_MESSAGES/ 或者/usr/share/locale-langpack/您的语言/LC_MESSAGES/命名并将文件放在那里。如果两个地方都不存在,请将其放在其中一个地方,并对文件名进行一些试验:小写、驼峰式或类似 ,即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
答案4
使用 wmctrl 替换(部分)窗口标题
自从我自己的答案在某些情况下,使用该应用程序的翻译文件对我来说是不够的,我在此基础上Jacob 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 提出这个想法并制定脚本!