창 제목을 영구적으로 변경하려면 어떻게합니까?


17

창 제목을 생성하는 데 어떤 파일이 관련됩니까? 예를 들어 리듬 박스를 열면 프로그램 이름이 창 제목으로 표시됩니다. 그러나 .desktop파일에 의해 생성되지는 않습니다 . 응용 프로그램 제목에 텍스트를 추가하려면 어떤 파일을 편집해야합니까? 변경 사항을 영구적으로 유지하고 싶습니다.

나는 그놈 3.16과 함께 우분투 그놈 15.04를 사용합니다.


안녕 Maud. 나는 당신의 질문을 사랑했고, 그것은 아주 좋은 해결책으로 이어졌습니다. 그러나 향후 질문에 대해 명심해야 할 사항은 언급 할 수 없습니다 . 답변이 게시 된 질문의 의미를 크게 변경하지 마십시오 . 처음에는 질문의 첫 번째 버전에 적절하게 게시 된 답변을 편집 된 버전에 잘못 배치 된 것처럼 보입니다. 나는 그것이 실제로 내 대답으로 일어난 것이라고 생각합니다. 질문을 다시 생각하면 실제 질문에 대해 더 구체적으로 새 질문을 게시하는 것이 좋습니다.
Jacob Vlijm

1
나는 당신의 의견을 이해하고 나는 그것이 사람들에게 어떻게 혼란 스러울 수 있는지 알 수 있기 때문에 미래의 질문으로 그것을 할 것입니다. 나는 분명히 스레드에 대한 귀하의 기여를 과소 평가하지는 않습니다. 원래 제목이 실제로 내 실제 질문을 다루지 않았고이 스레드의 목표가 무엇인지에 대한 약간의 불확실성을 제기했기 때문에 제목이 더 구체적이기를 원했습니다. 당신의 도움을 주셔서 감사합니다! :)
Maud Kon

답변:


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. 스크립트는 모두 사용 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.
  • 응용 프로그램 의 마우스 오른쪽 버튼 클릭 옵션과는 관련이 없습니다 .
  • 스크립트는 또한 창 이름을 "유지 관리"합니다. 다른 프로세스가 나중에 창 이름을 변경하면 (예 : 탭 열기, 디렉토리 변경) 스크립트는 창을 "새 창"으로보고 선택한 창 이름을 유지합니다.

죄송합니다.이 기능이 작동하지 않습니다.
Maud Kon

xdotool search --name "Rhythmbox" set_window --name "Music" 응용 프로그램을 열고 닫은 상태에서 명령을 수행하고 다시 시작 (alt + f2 + r)하여 작동하는지 확인했지만 여전히 동일한 창 제목을 표시합니다.
Maud Kon

와! 이번에는 정말 감동합니다! 아침에 먼저 시도해 볼게요. 당신의 노고에 감사드립니다. 야곱!
Maud Kon

당신이 말한대로 정확하게 스크립트를 시도했지만 작동하지 않습니다. 이것이 GNOME 3.16에서 작동하지 않을 수 있습니까, 아니면 설정에 문제가 있습니까? 나는 지금 당황하고 있으며 내 시스템에서 잘 작동하도록 노력하고 있습니다. 아직 작동하지 않는 이유를 찾으면 최대한 빨리 연락 드리겠습니다.
Maud Kon

1
@MaudKon 설정 파일을 편집하고 우연히 하나 이상의 화이트 라인을 추가했을 수 있습니다. 나는 그 대본을“면역”했다. 당신은 지금 원하는만큼 많은 화이트 라인을 사용할 수 있습니다 :)
Jacob Vlijm

9

제목은 응용 프로그램 실행 파일에 의해 생성되며 쉽게 편집 할 수있는 방법이 없습니다.


응용 프로그램이 열린 후 제목 변경 :

  • 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"
    

사용자 정의 제목으로 모든 응용 프로그램을 시작하기위한 스크립트 만들기 :

  • 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로 저장하십시오. 음악. 바탕 화면. 원본 파일을 덮어 쓰지 않도록주의하십시오!

"열기"기능에 대한 변경을 적용하려면

  • 운영 gksudo gedit /usr/share/applications/rhythmbox-device.desktop
  • rhythmbox이전 .desktop 파일에서 사용 된 이름으로 변경 하십시오.
  • 파일을 저장하십시오.
  • 시스템 모니터 또는 sudo kill rhythmbox
  • 휴대 전화 / 음악 플레이어를 플러그인하고 '(애플리케이션으로 연결)'을 눌러 작동하는지 확인합니다.

(요약) 필요한 파일 개요

응용 프로그램을 완전히 작동 시키려면 /usr/share/applications완료되면 3 개의 .desktop 파일이 있어야합니다 .

  1. music.desktop 또는 신청 한 이름

    Exec=musicHidden=true(마지막 하나를 추가하지 않을 경우 현재)

  2. rhythmbox.desktop

    Exec=rhythmbox %UHidden=true

  3. rhythmbox-device.desktop

    Exec=music --select-source %U없이 숨겨진 항목

즉, 항상 마지막 파일을 열고 제목은 항상 그대로 있어야합니다. 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 스크립트는 부분적으로 작동합니다. 새 이름으로 새 창을 시작하지만 개요에서 다시 시작하면 여전히 오래된 항목이 있습니다 ... 내가 잘못하고 있습니까?
Maud Kon

@MaudKon : 개요는 무엇입니까? 지금 스크립트를 사용해보십시오. 대시 (대부분의 앱이있는 큰 패널)에 대해 "개요"를 호출하면 내 스크립트가 영구적으로 변경되지 않는다고 말할 것입니다.
Helio

나는 응용 프로그램 개요를 의미합니다. 나는 이미 대시 자체를 숨겼습니다. 흠, 스크립트보다 작동합니다. 어쨌든 변경을 영구적으로 만들 수 있습니까? fx로 실행 파일을 편집하는 것과 같습니다. GHex? 또는 .desktop 파일에서 실행 파일을 변경 하시겠습니까?
Maud Kon

지금 시도하십시오. 새 스크립트 를 사용하고 변경 내용을 영구적으로 만들려면 섹션의 방법을 따르십시오 . 이제 나는 당신이 우분투 위장 을 만들고 있음을 이해했습니다 ;-)
Helio

1
@Helio 나는 당신을 위해 일한 단계로 게시물을 업데이트했습니다. 또한 "열기"기능을 작동시키는 프로세스를 추가했습니다.
Maud Kon

2

번역 파일을 사용하십시오!

나는 Thunar와 함께이 문제에 직면했습니다. Compiz Scale이 Thunar 창 제목을 "AnyFolder-파일 관리자"로 표시하고 불필요한 정보가있는 공간을 차지했을 때 성가 시게되었습니다.

내가 가진 위에서 언급 한 방법을 시도 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응용 프로그램이 보내는 신호와 msgstrlangpack이 변환 하는 신호는 어디에 있습니까 ? 원하는대로
변경하십시오 ( 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.moYOUR-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 현지화로 우분투를 실행하고 있다면, * .po를 사용하고, 변경되지 않은 모든 msgid / msgstr 커플을 삭제하거나 주석을 달고 / usr / share / locale / en / LC_MESSAGES /에 넣으십시오 .

출처 :
http://wiki.xfce.org/translations/translation_guidance_in_xfce


기록만을 위해서; 답에 언급 된 것처럼 이름을 유지 하기 때문에 실제로 스크립트 를 사용해 보지 않았을 것입니다.
Jacob Vlijm

맞습니다. 스크립트 는 시도하지 않았지만 다른 곳에서 비슷한 (간단한) 스크립트와 xdotool 및 wmctrl의 트릭을 시도했습니다. 언급했듯이, 소스 파일에서 한 줄 을 변경하는 것과 비교하여 대포로 참새를 촬영하는 것처럼 느껴집니다 . 그럼에도 불구하고 스크립트에서 많은 것을 배울 수 있습니다.
ronso0

응용 프로그램을 업그레이드하면 어떻게되는지 궁금합니다. * .desktop 파일 및 현지화 파일을 덮어 쓰나요?
ronso0

로 여기에 설명 askubuntu.com/a/703942/72216 나는, 배경 스크립트의 fobia를 공유하지 않는 경우 가 잘 기록되고 않는 중요한 기능을 추가 할 수 있습니다. .desktop파일에 관하여 : 다시, 당신은 내가 읽은 다른 답변과 내 대답을 혼동해야합니다. 대답은 .desktop파일을 편집하지 않으며 응용 프로그램을 다시 설치할 때 필요한 작업이 없습니다.
Jacob Vlijm

이것은 대답 # 2가 .desktop파일을 수정 하고 번역 파일을 그렇게 할 때 일반적인 질문이었습니다 . 당신은 그것을 알고 있습니까? 그리고 지금 "mu__Incoming-File Manager" 가있는 "mu__Incoming- "을 읽은 이후로 모든 스크립트 솔루션에 두 번째 기회를 줄 수 있습니다 . "경로 / 폴더 / 폴더"가없는 정적 창 제목을 가진 응용 프로그램의 경우 내 솔루션이 제대로 작동합니다.
ronso0

1

창 제목을 (일부) wmctrl으로 바꾸십시오

때문에 내 자신의 대답은 응용 프로그램의 번역 파일을 사용하여 나에게 몇 가지 경우에 충분하지, 난 기반으로 구축 야곱 Vlijm의 솔루션 및 창 제목에 특정 문자열을 대체하는 자신의 스크립트를 수정했습니다. 이 답변을 별도로 게시해도 괜찮습니다. 아이디어를 얻고 스크립트를 설정하는 것에 대한 크레딧은 Jacob Vlijm 에게 갑니다 !

예를 들어, Some fancy website대신에 읽고 싶습니다 Some fancy website - Mozilla Firefox. Compiz scale plugin은 이제 - File manager다른 문자열과 다른 문자열 도 제거 하여 훨씬 명확 해졌습니다 .

내가 변경 한 사항 :

  1. 공백을 허용하기 위해 //구분 기호로 사용window_names.txt
  2. xdotool이 ASCII가 아닌 문자를 잘 처리하지 않기 때문에 창 제목을 수정하는 wmctrl대신 사용하십시오 xdotool.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.