xprop를 사용하여 사용자 정의 속성을 설정하고 한 줄로 프로그램을 여는 방법은 무엇입니까?

xprop를 사용하여 사용자 정의 속성을 설정하고 한 줄로 프로그램을 여는 방법은 무엇입니까?

나는 이것을 시도했습니다 :

xprop -id $(gedit & echo $!) -f MY_VAR1 8s -set MY_VAR1 MyCustomVar

xprop을 시도하고 gedit 창을 클릭합니다. MY_VAR1이 존재하지 않습니다.

그래서 나는 거기서 자야겠다고 생각했습니다... 나는 다음과 같이 노력했습니다.

xprop -id $(gedit & sleep 5 & echo $!) -f MY_VAR1 8s -set MY_VAR1 MyCustomVar

5초 동안 기다렸다가 xprop를 시도하고 새 창을 클릭했습니다. 여전히 결과가 없습니다.

감사해요

답변1

Jeff가 지적했듯이 PID와창구번호다른 것들이 있고 거기에는서로 매핑하는 것이 항상 간단한 방법은 아닙니다.— 일부 프로세스에는 창이 없고 일부는 하나의 창을 공유하며 다른 프로세스에는 여전히 많은 창이 있습니다(창이 하나만 표시되더라도 적어도 X 수준에서는 그렇습니다).

시작했을 때 gedit보이는 창이 있었지만 xwininfo -root -tree -all이름이나 클래스가 "gedit"인 3개의 개별 X Windows( "클라이언트 리더" 및 실제로 사용자 인터페이스의 일부인 최대 20개의 기타 익명 "창"( gedit버전, 탭 수 및 GTK+에 따라 다름).

조정 문제를 부분적으로 해결하려면 속성을 사용할 수 있습니다._NET_WM_PID그리고WM_CLIENT_LEADER, 이는 소유 프로세스의 PID를 보유해야 하며, 여러 개의 창이 있는 경우 리더 ID를 보유해야 합니다(후자는 실제로는세션 관리, 여기서 도움이 될 수 있습니다). 이제 _NET_WM_PID프로세스와 창 관리자가 올바르게 작동해야 하는 데 몇 가지 문제가 있을 수 있지만 일반적으로 최신 데스크톱에서는 신뢰할 수 있습니다(예를 들어 일부 이전 프로그램 제외 rxvt). 환경 변수와 같은 속성을 생각해 보세요.~해야 한다PID로 설정되어 있지만 일부 WM이 다른 WM보다 더 적극적이라고 확신하더라도 이를 강제하는 것은 없습니다.

gedit일반적으로 이런 종류의 문제에 대해서는 Windows를 열거하고 루프에서 속성을 쿼리하여 방금 시작한 프로세스의 PID를 가져온 다음 속성을 설정하는 짧은 스크립트를 작성할 수 있습니다 . _NET_WM_PID하지만,모든 것이 당신에게 불리하게 음모를 꾸밀 것입니다:

  • 창 ID를 포함하는 X 속성이 없습니다.
  • xprop이상하게도 쿼리한 창의 ID가 출력되지 않습니다.
  • 창 이름은 gedit열려 있는 내용에 따라 변경되며 xprop와일드카드/패턴은 지원되지 않으며 창 카테고리와 일치하지 않습니다.
  • xwininfo및 둘 다 모든 창이 아닌 일치하는 첫 번째 창만 출력하며 xprop(예: by ) 출력을 구문 분석하기 쉽게 만들지 않습니다.-name
  • X "창"의 수는 다음을 초과할 수 있습니다.보이는창 50배 확장
  • gedit기본적으로 단일 프로세스로 실행되므로 두 번째 프로세스를 시작하면 gedit해당 프로세스는 기본 프로세스에 연결되는 즉시 종료됩니다. 그러나 최신 버전에서는 이를 사용하여 gedit -s독립적인 프로세스/창을 실행할 수 있습니다.

xdotool이것이 xwit바로 , 및 , 같은 유틸리티가 존재하는 이유 입니다 wmctl. ;-) 불행히도 이러한 유틸리티는 어떤 도움 없이도 제대로 작동하지 않습니다.

독립 실행형 인스턴스를 실행하는 경우 이는 쉘 스크립트로 작동하므로 이해하기 쉽습니다(파일 이름 매개변수 지원).

#!/bin/bash
gedit  -s "$@" &
_pid=$!
_wid=$(xdotool search --sync --onlyvisible --pid $_pid)
xprop -f MY_VAR1 8s -set MY_VAR1 MyCustomVar -id $_wid
# xprop -id $_wid MY_VAR1  ## for testing

이는 xdotool무거운 작업을 수행하는 데 사용되며 "동기화" 모드에서 창을 시작하고 속성을 설정할 시간을 제공하므로 gedit -s프로세스는 기존 인스턴스에 넘겨진 다음 사라지는 대신 자체 포함되고 오래 지속됩니다( 주변에 매달아 두십시오 xdotool).

또는 동등한 문장:

gedit -s & xdotool search --sync --onlyvisible --pid $! | 
   xargs -r xprop -f MY_VAR1 8s -set MY_VAR1 MyCustomVar -id

메모:

  • xdotoolPID로 검색할 수 있고 일부 속성을 이름으로 설정할 수도 있지만 필요에 따라 임의의 속성 이름을 설정할 수는 없습니다.
  • xprop열악한 검색 및 출력 옵션
  • xdotool10진수 창 ID 출력, xprop10진수 또는 16진수 허용
  • 오류 처리가 많지 않음

할 수 있다를 사용하지 않고 이 작업을 수행 xdotool하지만 시스템의 모든 창을 나열하고 각 창을 차례로 처리해야 하는 상황이 발생할 수 있습니다. 해봤는데 여기에 붙여넣기엔 너무 흉하네요 :-)

또 다른 접근 방식: 표준 GTK+ 클라이언트를 사용하면 애플리케이션이 속성을 기록하지 않더라도 명령줄 옵션을 통해 속성을 설정할 수 있습니다( gedit --help-gtk). 불행하게도 임의의 속성은 아니지만 "Class"를 임의의 문자열로 설정할 수 있습니다. 클래스는 다중 값 속성이므로 각 창에는 여전히 "gedit" 클래스가 있습니다. 따라서 이 방법을 선택하면 설정/리소스가 계속 적용되지만 "Gedit" 설정이 적용되지 않을 수 있습니다. 이것이 효과가 있지만 장점도 있습니다).

$ gedit --class MyCustomVar
$ xprop -notype -name gedit WM_CLASS _NET_WM_PID
WM_CLASS = "gedit", "MyCustomVar"
_NET_WM_PID = 1517
WM_NAME = "gedit"

창/프로세스 매핑을 위한 몇 가지 다른 옵션이 있습니다( /proc/PID/environin for 검색 WINDOWID, 이는 해당 규칙을 준수하는 터미널 에뮬레이터에 의해 시작된 프로세스에만 적용되지만 가능함).gedit플러그인 작성) 하지만 둘 다 매력적이지 않습니다. 당신은 또한 볼 수 있습니다https://stackoverflow.com/questions/151407/how-to-get-an-x11-window-from-a-process-id- 가장 흥미로운 답변 중 하나는 LD_PRELOAD링크 XCreateWindow()와 기타 여러 API 함수를 래핑하여 임의의 속성을 설정하는 해킹입니다.

관련 정보