Existe uma maneira de encontrar todos os recursos do X que um aplicativo usa?

6

Estou procurando uma maneira de listar automaticamente todos os recursos X que são usados em um aplicativo. Para dar um exemplo, para xterm , esperaria uma lista semelhante à seguinte, mas com todos os recursos usados por xterm .

 background
 foreground
 cursorColor
 vt100.geometry
 scrollBar
 scrollTtyOutput
 ...

O método pode funcionar no código-fonte do aplicativo, mas se for possível fazê-lo apenas com o binário do aplicativo, isso também seria interessante.

    
por bbuser 04.05.2011 / 17:26

3 respostas

12

Você pode explorar os recursos de uma janela existente com editres . Esse é um programa interativo, que permite navegar na árvore de recursos e localizar o local de um widget nessa árvore, clicando no widget no aplicativo. Você pode até modificar um recurso se o aplicativo o suportar. Isso, no entanto, exige que o aplicativo suporte o protocolo Editres, que não é tão comum, mesmo entre a proporção cada vez menor de aplicativos que usam recursos do X. Além disso, o cliente de edição de GUI é o único aplicativo que eu conheço que sabe como enviar consultas de Editres, portanto nenhuma listagem de linha de comando.

Você pode ver quais configurações de recursos estão definidas para um aplicativo específico com appres . O aplicativo pode suportar outras configurações. Isso é diferente de xrdb -query , que lista apenas as configurações que o usuário sobrecarregou explicitamente (o appres também lista os padrões do sistema).

    
por 04.05.2011 / 22:10
3

editres

    
por 04.05.2011 / 18:29
0

É muito fácil "caputar" a função XrmParseCommand e listar as opções antes de executar a função original.

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

Para executá-lo

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

Há um snippit no laboratório do Git aqui .

    
por 28.10.2018 / 13:47