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


17

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

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


こんにちはモード。私はあなたの質問が大好きで、非常に素晴らしい解決策につながりました。ただし、今後の質問に留意する必要があることを1つ挙げることに抵抗することはできません。回答を投稿した、質問の意味を大幅に変更しないでください。もともと質問の最初のバージョンに適切に投稿されていたが、編集されたバージョンでは見当違いだったように、回答を作成します。それが私の答えで実際に起こったことだと思います。代わりに新しい質問を投稿することをお勧めします。質問を再考する場合は、より具体的には実際の質問に投稿してください。
ジェイコブVlijm

1
私はあなたの意見を理解しており、人々にとって非常に混乱するかもしれないことを見ることができるので、私は確かに将来の質問でそれを行います。スレッドに対するあなたの貢献を過小評価していないことは確かです。それを明確にしましょう。元のタイトルでは実際の質問が実際にはカバーされず、このスレッドでの私の目標が少し不確実だったため、タイトルをより具体的にしたかったのです。ご協力いただきありがとうございます!:)
モードコン

回答:


21

通常、初期名はアプリケーション自体(内のコード)によって設定されます。ただし、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を読み取り、アプリケーションごとに設定を読み込みます。次に、新しく作成されたウィンドウを監視します。ファイルに定義されているアプリケーションのいずれかに属するウィンドウが表示される場合、それに応じてウィンドウ名が設定されます。

設定方法

  1. スクリプトは、wmctrlとの両方を使用しますxdotool

    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
  • どのアプリケーションの右クリックオプションとも干渉しません。
  • また、スクリプトはウィンドウ名を「維持」します。別のプロセスが後でウィンドウ名を変更する(タブを開く、ディレクトリを変更するなど)場合、スクリプトはウィンドウを「新しいウィンドウ」と見なし、選択したウィンドウ名を維持します。

申し訳ありませんが、これはうまくいきませんでした。
モードコン

xdotool search --name "Rhythmbox" set_window --name "Music" アプリケーションを開いて閉じた状態でコマンドを実行し、再起動(alt + f2 + r)を実行して機能するかどうかを確認しましたが、同じウィンドウタイトルが表示されたままです。
モードコン

うわー!今回は本当に感動しました!朝一番に試してみます。私は言わなければならない、これは非常に宣伝しているように見える:)あなたの努力とこれを投稿してくれてありがとう、ヤコブ
モードコン

あなたが言ったとおりにスクリプトを試しましたが、うまくいきません。これはGNOME 3.16で機能しない可能性がありますか、それとも私のセットアップにあるはずですか?私は今困惑しており、うまくいけば私のシステムで動作するようにします。まだ機能しない理由が見つかった場合は、できるだけ早くご連絡いたします。
モードコン

1
@MaudKon設定ファイルを編集し、おそらく最後に、意図せずに1つ以上のホワイトラインを追加しておく必要があります。そのためのスクリプトを「予防接種」しました。あなたが今好きなだけ多くの
ホワイトライン

9

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


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

  • インストールxdotoolsudo 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"
    

カスタムタイトルを持つアプリケーションを起動するスクリプトを作成します。

  • 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
  • 携帯電話/音楽プレーヤーをプラグインし、[(音楽アプリケーション)で開く]を押して、機能するかどうかを確認します。

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

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

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

    Exec=musicし、Hidden=true(存在しない場合は、最後の1を追加します)

  2. rhythmbox.desktop

    Exec=rhythmbox %UHidden=true

  3. rhythmbox-device.desktop

    Exec=music --select-source %Uし、WITHOUT隠されたエントリ

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

  1. そして/usr/local/binもちろん、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をご覧ください。

私は両方の方法(ここでも同じ)を試しましたが、bashスクリプトは部分的に機能します。新しい名前で新しいウィンドウが起動しますが、概要からもう一度起動すると、古いエントリがまだあります...何か間違っていますか?
モードコン

@MaudKon:概要は何ですか?今すぐスクリプトを試してください。ダッシュ(多くのアプリを備えた大きなパネル)に「概要」を呼び出すと、私のスクリプトは永続的な変更を行わないことになります。
ヘリオ

私はアプリケーションの概要を意味します、私はすでにダッシュ自体を隠しました、ハハ。うーん、ええ、スクリプトが機能するより。とにかく変更を永続的にする方法はありますか?fxで実行可能ファイルを編集するようなものです。GHex?または、.desktopファイルの実行可能ファイルを変更しますか?
モードコン

今すぐやってみて下さい。新しいスクリプトを使用し、セクション「変更を永続的にするには」の方法に従います。これで、Ubuntuのカモフラージュを作成していることがわかりました;
Helio

1
@Helioあなたのために働いた手順であなたの投稿を更新しました。また、「開く」機能を機能させるプロセスを追加しました。
モードコン

2

翻訳ファイルを使用するだけです!

Thunarでこの非常に問題のある課題に遭遇しました。CompizScaleがThunarウィンドウのタイトルを「AnyFolder-File Manager」と表示し、不要な情報でスペースを使い果たしたとき、面倒になりました。

私は、上記の方法を試してみましたxdotoolし、wmctrlしかしThunarでは、私は別のフォルダに移動するたびに、そのウィンドウのタイトルを変更するので、彼らは永続的ではありませんでした。そして、Thunarがタイトルを変更するたびにタイトルを元に戻すスクリプトをバックグラウンドに配置するのは誇張されたように感じました。

より簡単な解決策は、すべてのアプリケーションに付属する翻訳ファイルを使用することでした。パッケージにmsgfmt含まれていると呼ばれるツールを使用して、翻訳ソースファイルを再コンパイルするだけですgettext。これをgThumbで-ただ楽しみのために-実行しただけで、うまくいきます。

1.関係するアプリケーションのソースコードを取得します。
入力する か、http://packages.ubuntu.comにアクセスして、ソースを取得し、次のフォルダーを探します。これには、プレーンテキスト言語ファイルが含まれています。あなたの言語を探してください。あなたがブラジルから来たとしましょう、そのファイルは$ sudo apt-get source APPLICATIONpopt_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.コンパイラを入手する
前述のようにmsgfmtgettextパッケージから必要なので、入力する必要があります
$ sudo apt-get install gettext

4.コンパイル
ターミナルを開き、変更したフォルダーに移動して、pt_BR.pomsgfmtにエラーがないかファイルをチェックさせます。問題が
$ 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 /にある元の翻訳の名前を確認して、そこにファイルを配置します。それは両方の場所に存在しない場合は、そのうちの一つで、それを入れて、ファイル名で少し実験:小文字、キャメルケースまたはのようなもの、すなわち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


記録のためだけに。答えに記載されているように、名前を保持しているため、実際にスクリプトを試したのではないかと思います。
ジェイコブVlijm

そうです、私はこのスクリプトを試したのではなく、他のどこかからの似た(単純な)スクリプトと、xdotoolとwmctrlのトリックを試しました。前述したように、私にとっては、ソースファイルの1行を変更するのに比べて、大砲でスズメを撃つようなものです。それでも、スクリプトから多くのことを学ぶことができます。
ronso0

アプリケーションがアップグレードされたらどうなるのか興味があります。* .desktopファイルとローカライズファイルは上書きされますか?
ronso0

ここaskubuntu.com/a/703942/72216で説明しているように、よく書かれてて重要な機能追加されている場合、バックグラウンドスクリプトのフォビアを共有しません。ファイルについて:繰り返しますが、あなたは私の答えをあなたが読んだかもしれない別の答えと混同しなければなりません。答えはファイルを編集せず、アプリケーションを再インストールするときにアクションは必要ありません。.desktop.desktop
ジェイコブVlijm

これは回答#2が.desktopファイルを変更するため、一般的な質問でしたが、翻訳ファイルを使用して変更しました。あなたはそれを知っていますか?そして、「mu__Incoming-File Manager」があった「mu__Incoming- 」を読んだので、スクリプトソリューションにもう一度チャンスを与えることができます。「path / to / folder」のない静的なウィンドウタイトルを持つアプリケーションの場合、私のソリューションは正常に機能します。
ronso0

1

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

以来、私自身の答えのアプリケーションの翻訳ファイルを使用しては私のためにいくつかの例には十分ではなかった、私は上に構築されたジェイコブVlijmのソリューションとウィンドウタイトルに特定の文字列を置き換えるために、彼のスクリプトを修正しました。これを別の回答として投稿しても大丈夫だと思います。クレジットに行くヤコブ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のアイデアとスクリプトのセットアップに使用されます!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.