ウィンドウタイトルの生成に関係するファイルはどれですか?たとえば、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 "<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
でテストを成功させました:
前述のように、デフォルトのウィンドウ名はアプリケーションのコードで定義されています。
デフォルトウィンドウのタイトルを変更するには、コードを変更する必要があります。それはできますifコードが利用可能であり、多くの場合、再コンパイルが必要であり、とりわけ使用言語に依存します。私の意見では、一般的な指導は非常に不可能であり、AUの範囲を超えています。
元の質問では、特定のアプリケーションの新しいウィンドウのタイトルを設定するためのファイルがあるのではないかと思っていました。説明したように、そうではありませんが、canを作成できます。
以下のセットアップでは、アプリケーションごとベースで新しいウィンドウにどのように名前を付けるかを非常に簡単に定義できます。 ~
という名前のファイルをwindow_names.txt
(ホームディレクトリ)に作成するだけです。特定のウィンドウ名を設定するアプリケーションごとに、アプリケーションと目的のウィンドウ名の行を追加します:
アプリケーションごとにウィンドウ名を定義するテキストファイル
gnome-terminal Monkey eats
gedit Banana
rhythmbox if he runs out of peanuts
セットアップは、単純なバックグラウンドスクリプトで行われます。このスクリプトは非常に軽量であるため、パフォーマンスに顕著な影響を与えることはありません。
スクリプトが開始されると、ファイル~/window_names.txt
を読み取り、アプリケーションごとに設定を読み込みます。それからnew作成されたウィンドウに注目します。ファイルに定義されているアプリケーションのいずれかに属するウィンドウが表示される場合、それに応じてウィンドウ名が設定されます。
スクリプトは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
すべてが期待どおりに機能する場合は、起動アプリケーションに追加します:ダッシュ>起動アプリケーション>追加
場合によっては、デスクトップがまだ完全にロードされていないときにスクリプトを開始すると、スクリプトが破損する可能性があることに注意してください。その場合、スタートアップアプリケーションに追加するコマンドは次のようになります。
/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
で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"
カスタムタイトルのアプリケーションを起動するスクリプトを作成する:
次の内容の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)
「開く」機能に変更を有効にするには
gksudo gedit /usr/share/applications/rhythmbox-device.desktop
を実行しますrhythmbox
を前の.desktopファイルで使用されている名前に変更します。Sudo kill rhythmbox
で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
およびWITHHiddenエントリなし
これは、常に最後のファイルを開き、タイトルが常にあることを意味します。唯一の方法は、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}
は同じものです:すべての定位置パラメーター。
自分の答え アプリケーションの翻訳ファイルを使用するだけではいくつかのケースでは不十分だったため、 Jacob Vlijmのソリューション に基づいて、ウィンドウタイトルの特定の文字列を置き換えるスクリプトを変更しました。これを別の回答として投稿しても大丈夫だと思います。クレジットは ジェイコブ・ヴライム アイデアとスクリプトのセットアップのために!
たとえば、Some fancy website
の代わりにSome fancy website - Mozilla Firefox
を読みたいです。 Compizスケールプラグインは、- 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に送られ、アイデアとスクリプトのセットアップが行われました!