Gibt es eine Möglichkeit, alle von einer Anwendung verwendeten X-Ressourcen zu finden?

9

Ich suche nach einer Möglichkeit, alle X-Ressourcen , die in einer Anwendung verwendet werden, automatisch aufzulisten. Um Ihnen ein Beispiel zu geben, denn xtermich würde eine Liste ähnlich der folgenden erwarten, jedoch mit allen Ressourcen, die von verwendet werden xterm.

 background
 foreground
 cursorColor
 vt100.geometry
 scrollBar
 scrollTtyOutput
 ...

Die Methode kann mit dem Quellcode der Anwendung arbeiten, aber wenn es möglich ist, dies nur mit der Anwendungsbinärdatei zu tun, wäre dies ebenfalls interessant.

bbuser
quelle

Antworten:

14

Sie können die Ressourcen eines vorhandenen Fensters mit Editres erkunden . Dies ist ein interaktives Programm, mit dem Sie den Ressourcenbaum durchsuchen und den Speicherort eines Widgets in diesem Baum finden können, indem Sie auf das Widget in der Anwendung klicken. Sie können eine Ressource sogar ändern, wenn die Anwendung dies unterstützt. Dies erfordert jedoch, dass die Anwendung das Editres-Protokoll unterstützt, was selbst bei dem schwindenden Anteil von Anwendungen, die X-Ressourcen verwenden, nicht so häufig ist. Darüber hinaus ist der GUI-Editres-Client die einzige mir bekannte Anwendung, die weiß, wie Editres-Abfragen gesendet werden, also keine Befehlszeilenliste.

Sie können sehen, welche Ressourceneinstellungen für eine bestimmte Anwendung mit appres definiert sind . Die Anwendung unterstützt möglicherweise andere Einstellungen. xrdb -queryDies unterscheidet sich von den Listeneinstellungen, die der Benutzer explizit überladen hat (appres listet auch die Systemstandards auf).

Gilles 'SO - hör auf böse zu sein'
quelle
4

Editres

h0tw1r3
quelle
1

Es ist ziemlich einfach, die XrmParseCommandFunktion zu "kapabeln" und die Optionen aufzulisten, bevor die ursprüngliche Funktion ausgeführt wird.

/* 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 */

Makefile

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

Um es auszuführen

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

Es gibt eine snippit auf Git Labor hier .

gam3
quelle
Das zeigt die angeforderten Muster , aber nicht die tatsächliche Widget-Hierarchie.
Thomas Dickey
Dies ist genau das, wonach ich suche
Wayne Walker