Có cách nào để tìm tất cả tài nguyên X mà ứng dụng sử dụng không?


9

Tôi đang tìm cách để tự động liệt kê tất cả các tài nguyên X được sử dụng trong một ứng dụng. Để cho bạn một ví dụ, xtermtôi muốn có một danh sách tương tự như sau nhưng với tất cả các tài nguyên được sử dụng bởi xterm.

 background
 foreground
 cursorColor
 vt100.geometry
 scrollBar
 scrollTtyOutput
 ...

Phương thức này có thể hoạt động trên mã nguồn của ứng dụng nhưng nếu có thể thực hiện nó chỉ với nhị phân ứng dụng cũng sẽ rất thú vị.

Câu trả lời:


14

Bạn có thể khám phá các nguồn lực của một cửa sổ hiện tại với editres . Đó là một chương trình tương tác, cho phép bạn duyệt cây tài nguyên và tìm vị trí của một tiện ích trong cây đó bằng cách nhấp vào tiện ích trong ứng dụng. Bạn thậm chí có thể sửa đổi một tài nguyên nếu ứng dụng hỗ trợ nó. Tuy nhiên, điều đó yêu cầu ứng dụng hỗ trợ giao thức Editres, không phổ biến ngay cả trong tỷ lệ các ứng dụng sử dụng tài nguyên X ngày càng thu hẹp. Hơn nữa, máy khách chỉnh sửa GUI là ứng dụng duy nhất tôi biết biết cách gửi các truy vấn Editres, do đó không có danh sách dòng lệnh.

Bạn có thể xem những gì các thiết lập tài nguyên được định nghĩa cho một ứng dụng cụ thể với appres . Ứng dụng có thể hỗ trợ các cài đặt khác. Điều đó khác với xrdb -queryviệc chỉ liệt kê các cài đặt mà người dùng đã quá tải rõ ràng (appres cũng liệt kê các mặc định của hệ thống).



1

Nó khá dễ dàng để 'caputure' XrmParseCommandchức năng và liệt kê các tùy chọn trước khi thực hiện chức năng ban đầu.

/* G. Allen Morris III <gam3@gam3.net> */

#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

Để chạy nó

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

Có một đoạn trên phòng thí nghiệm Git ở đây .


Điều đó cho thấy các mẫu được yêu cầu , nhưng không phải là hệ thống phân cấp widget thực tế.
Thomas Dickey

Đây là chính xác những gì tôi đang tìm kiếm
Wayne Walker
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.