有没有办法找到应用程序使用的所有 X 资源?

有没有办法找到应用程序使用的所有 X 资源?

我正在寻找一种自动列出所有内容的方法X资源在应用程序中使用的。给你一个例子,因为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 实验室上有一个片段这里

相关内容