응용 프로그램에서 사용하는 모든 X 리소스를 찾는 방법이 있습니까?

응용 프로그램에서 사용하는 모든 X 리소스를 찾는 방법이 있습니까?

모든 것을 자동으로 나열하는 방법을 찾고 있습니다.XResources응용 프로그램에 사용됩니다. 예를 들어 보겠습니다. xterm다음과 유사한 목록을 갖고 싶지만모두사용된 자원 xterm.

 background
 foreground
 cursorColor
 vt100.geometry
 scrollBar
 scrollTtyOutput
 ...

이 방법은 애플리케이션의 소스 코드에서 작동하지만 애플리케이션 바이너리만 사용하여 구현할 수도 있다면 흥미로울 것입니다.

답변1

다음 명령을 사용하여 기존 창의 리소스를 탐색할 수 있습니다.편집하다. 이것은 리소스 트리를 탐색하고 애플리케이션에서 위젯을 클릭하여 트리에 있는 위젯의 위치를 ​​찾을 수 있는 대화형 프로그램입니다. 애플리케이션이 지원하는 경우 리소스를 수정할 수도 있습니다. 그러나 이를 위해서는 응용 프로그램이 Editres 프로토콜을 지원해야 하며, 이는 X 리소스를 사용하는 응용 프로그램의 비율이 계속 감소하고 있음에도 불구하고 흔하지 않습니다. 또한 GUI editres 클라이언트는 Editres 쿼리를 보내는 방법을 아는 유일한 응용 프로그램이므로 명령줄 목록이 없습니다.

다음 명령을 사용하여 특정 애플리케이션에 정의된 리소스 설정을 확인할 수 있습니다. 어프리. 애플리케이션이 추가 설정을 지원할 수도 있습니다. 이는 xrdb -query사용자가 명시적으로 재정의한 설정만 나열하는 것과는 다릅니다(appres는 시스템 기본값도 나열함).

답변2

답변3

XrmParseCommand원래 기능을 실행하기 전에 기능을 "캡처"하고 옵션을 나열하는 것은 매우 쉽습니다.

/* G. Allen Morris III <[email protected]> */

#define _GNU_SOURCE

#include <X11/Xresource.h>
#include <stdio.h>
#include <dlfcn.h>

static char *types[] = {
    "XrmoptionNoArg",
    "XrmoptionIsArg",
    "XrmoptionStickyArg",
    "XrmoptionSepArg",
    "XrmoptionResArg",
    "XrmoptionSkipArg",
    "XrmoptionSkipLine",
    "XrmoptionSkipNArgs"
};

void XrmParseCommand(XrmDatabase * database,
                     XrmOptionDescList table,
                     int table_count,
                     _Xconst char *name, int *argc_in_out, char **argv_in_out)
{
    void (*original_XrmParseCommand) (XrmDatabase * database,
                                      XrmOptionDescList table,
                                      int table_count,
                                      _Xconst char *name, int *argc_in_out,
                                      char **argv_in_out);

    int argc = *argc_in_out;
    printf("'XrmParseCommand's %s\n", name); 
    for (int i = 0; i < table_count; i++) {
        switch (table[i].argKind) {
        case XrmoptionNoArg:
        case XrmoptionIsArg:
        case XrmoptionStickyArg:
        case XrmoptionResArg:
        case XrmoptionSkipArg:
        case XrmoptionSkipLine:
        case XrmoptionSkipNArgs:
        case XrmoptionSepArg:
            printf("%20s %30s %s \n", types[table[i].argKind], table[i].option,
                   table[i].specifier);
            break;
        default:
            printf("%20s %30s %s \n", "UNKNOWN", table[i].option,
                   table[i].specifier);
        }
    }
    original_XrmParseCommand = dlsym(RTLD_NEXT, "XrmParseCommand");
    (*original_XrmParseCommand) (database,
                                 table,
                                 table_count, name, argc_in_out, argv_in_out);
} 
/* eof */

파일 생성

myXrmParseCommand.so : myXrmParseCommand.c
        gcc -Wall -fPIC -shared -o $@ $< -ldl

실행해

#/bin/sh
make && LD_PRELOAD=./myXrmParseCommand.so  xterm -e :;

Git Labs에 스니펫이 있습니다.여기.

관련 정보