アプリケーションで使用するすべての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にスニペットがあります。ここ

関連情報