web-dev-qa-db-ja.com

ウィンドウのタイトルを永続的に変更するにはどうすればよいですか?

ウィンドウタイトルの生成に関係するファイルはどれですか?たとえば、Rhythmboxを開くと、ウィンドウタイトルとしてプログラム名が表示されます。ただし、.desktopファイルによって生成されるわけではありません。アプリケーションのタイトルにテキストを追加するには、どのファイルを編集する必要がありますか?変更を永続的にしたい

Ubuntu GNOME 15.04とGNOME 3.16を使用しています。

17
Maud Kon

通常、初期名はアプリケーション自体(内のコード)によって設定されます。ただし、変更することはできます。 xdotoolを使用して、最初にインストールする必要があります。

Sudo apt-get install xdotool

次に、インストールされたら、次のコマンドで別のウィンドウ名を設定できます(例)。

xdotool search --name "Unity LauncherSwitcher" set_window --name "Monkey"

これは変わります:

enter image description here

に:

enter image description here

注意

ご覧のとおり、次のコマンドが存在します。

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でテストを成功させました:

enter image description here

enter image description here

変更を永続的にしますか?

前述のように、デフォルトのウィンドウ名はアプリケーションのコードで定義されています。

デフォルトウィンドウのタイトルを変更するには、コードを変更する必要があります。それはできますifコードが利用可能であり、多くの場合、再コンパイルが必要であり、とりわけ使用言語に依存します。私の意見では、一般的な指導は非常に不可能であり、AUの範囲を超えています。


編集2

単一のファイルからアプリケーションごとにカスタムウィンドウ名を柔軟に管理/設定

元の質問では、特定のアプリケーションの新しいウィンドウのタイトルを設定するためのファイルがあるのではないかと思っていました。説明したように、そうではありませんが、canを作成できます。

以下のセットアップでは、アプリケーションごとベースで新しいウィンドウにどのように名前を付けるかを非常に簡単に定義できます。 ~という名前のファイルをwindow_names.txt(ホームディレクトリ)に作成するだけです。特定のウィンドウ名を設定するアプリケーションごとに、アプリケーションと目的のウィンドウ名の行を追加します:

アプリケーションごとにウィンドウ名を定義するテキストファイル

gnome-terminal Monkey eats
gedit Banana
rhythmbox if he runs out of peanuts

enter image description here

説明

セットアップは、単純なバックグラウンドスクリプトで行われます。このスクリプトは非常に軽量であるため、パフォーマンスに顕著な影響を与えることはありません。

スクリプトが開始されると、ファイル~/window_names.txtを読み取り、アプリケーションごとに設定を読み込みます。それからnew作成されたウィンドウに注目します。ファイルに定義されているアプリケーションのいずれかに属するウィンドウが表示される場合、それに応じてウィンドウ名が設定されます。

設定方法

  1. スクリプトはwmctrlxdotoolの両方を使用します。

    Sudo apt-get install wmctrl
    Sudo apt-get install xdotool
    
  2. スクリプトを空のファイルにコピーしてsetwindowname.pyとして保存します

  3. ファイル~/window_names.txt(正確にwindow_names.txtという名前)を作成し、次の形式でアプリケーションを追加します。

    <application> <window_name>
    

    例えば.

    gedit Text editor
    

    ウィンドウ名にはスペースを含めることができます。

  4. 次のコマンドにより、ターミナルからスクリプトをテスト実行します。

    python3 /path/to/setwindowname.py
    
  5. すべてが期待どおりに機能する場合は、起動アプリケーションに追加します:ダッシュ>起動アプリケーション>追加

    場合によっては、デスクトップがまだ完全にロードされていないときにスクリプトを開始すると、スクリプトが破損する可能性があることに注意してください。その場合、スタートアップアプリケーションに追加するコマンドは次のようになります。

    /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から実行される場合にも機能します。
  • any applicationの右クリックオプションと干渉しません。
  • また、スクリプトはウィンドウ名を「維持」します。別のプロセスが後でウィンドウ名を変更する場合(タブを開く、ディレクトリを変更するなど)、スクリプトはウィンドウを「新しいウィンドウ」と見なし、選択したウィンドウ名を維持します。
21
Jacob Vlijm

タイトルはアプリケーション実行可能ファイルによって生成され、編集する簡単な方法はありません。


アプリケーションが開いたら、タイトルを変更する:

  • Sudo apt-get install xdotoolxdotoolをインストールします
  • 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)
    
  • ファイルを新しいcustom-name.desktop fxとして保存します。 music.desktop。 元のファイルを上書きしないように注意してください!

「開く」機能に変更を有効にするには

  • gksudo gedit /usr/share/applications/rhythmbox-device.desktopを実行します
  • rhythmboxを前の.desktopファイルで使用されている名前に変更します。
  • ファイルを保存します。
  • システムモニターまたはSudo kill rhythmboxでrhythmboxのアクティブなプロセスを強制終了します
  • 電話/音楽プレーヤーをプラグインし、「開く(音楽アプリケーション)」を押して、機能するかどうかを確認します。

(概要)必要なファイルの概要

アプリケーションを完全に機能させるには、終了時に/usr/share/applicationsに3つの.desktopファイルが必要です。

  1. music.desktopまたはアプリケーションに付けた名前

    Exec=musicおよびHidden=true(存在しない場合は最後のものを追加)

  2. rhythmbox.desktop

    Exec=rhythmbox %UHidden=true

  3. rhythmbox-device.desktop

    Exec=music --select-source %UおよびWITHHiddenエントリなし

これは、常に最後のファイルを開き、タイトルが常にあることを意味します。唯一の方法は、Alt + F2 + Rでセッションを更新することです。

  1. そして、/usr/local/bin ofcourseにbashスクリプトがあるはずです。

最終ノート:

  • --name "\a\b\c"を使用して バグ を修正する場合、アプリケーション名に置き換えないでください!
  • スクリプトの最後の行のコメントを解除すると、アプリが閉じられるまでスクリプトは終了しません。
  • @ Maud Kon によって要求されたコードの${@:2}の説明

    1. $@は、すべての定位置パラメーターを格納する配列です。
    2. ${@:2}の意味:最初を除くすべての位置パラメータ
    3. この方法でプログラムを呼び出すとしましょう:

      awesome-program foo bar baz fooz
      
      • ${@: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
9
Helio

ウィンドウタイトル(の一部)をwmctrlに置き換えます

自分の答え アプリケーションの翻訳ファイルを使用するだけではいくつかのケースでは不十分だったため、 Jacob Vlijmのソリューション に基づいて、ウィンドウタイトルの特定の文字列を置き換えるスクリプトを変更しました。これを別の回答として投稿しても大丈夫だと思います。クレジットは ジェイコブ・ヴライム アイデアとスクリプトのセットアップのために!

たとえば、Some fancy websiteの代わりにSome fancy website - Mozilla Firefoxを読みたいです。 Compizスケールプラグインは、- File managerおよびその他の文字列も削除したため、より明確になりました。

私が行った変更:

  1. //の区切り文字としてwindow_names.txtを使用して、空白を許可します
  2. ウィンドウタイトルを変更するには、wmctrlの代わりにxdotoolを使用します(xdotoolは非ASCII文字をうまく処理できないため):wmctrl -i -r [WindowIdentifier] -N 'new Title'
  3. 文字列の置換などを行うためのスクリプト内の余分な行.

変更された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に送られ、アイデアとスクリプトのセットアップが行われました!

1
ronso0