LINUX.ORG.RU

Xlib, свойства окна

 ,


0

1

Есть ли в Xlib возможность задавать какой то свой клаc окна или идентификатор по аналогии с ClassName в win api? Или может есть другой подход для такой задачи: нужно найти все окна браузеров в системе.

Чо сделать хочешь, напиши лучше.

Окна браузеров создаются на X-сервере, а не в системе. Браузеры могут работать и с разных систем.

kike
()

Открываем дисплей с помощью XOpenDisplay, получаем корневое окно с помощью XDefaultRootWindow и рекурсивно обходим всё дерево окон с помощью XQueryTree, получая имена и классы окон с помощью XGetClassHint.

#include <cstdio>
#include <string>

#include <X11/Xutil.h>

class WindowFolder {
  protected:
    Display *display;
    Window root_window;
  public:
    WindowFolder() {
        display = XOpenDisplay(NULL);
        root_window = XDefaultRootWindow(display);
    }
    ~WindowFolder() { XCloseDisplay(display); }
    virtual void action(Window) = 0;
    void sub_fold(Window);
    void fold() { sub_fold(root_window); }
};

void WindowFolder::sub_fold(Window window)
{
    action(window);

    unsigned n;
    Window root, parent, *childs;
    XQueryTree(display, window, &root, &parent, &childs, &n);

    for (unsigned i = 0; i < n; ++i)
        sub_fold(childs[i]);

    XFree(childs);
}

class WindowClassFinderPrinter : public WindowFolder {
    std::string res_class;
  public:
    WindowClassFinderPrinter(std::string res_class_) : res_class(res_class_) {}
    virtual void action(Window);
};

void WindowClassFinderPrinter::action(Window window)
{
    XClassHint *hint = XAllocClassHint();
    XGetClassHint(display, window, hint);

    if (hint->res_class && !res_class.compare(hint->res_class))
        printf("WINDOW = %lu, NAME = %s, CLASS = %s\n",
               window, hint->res_name, hint->res_class);

    XFree(hint);
}

int main()
{
    WindowClassFinderPrinter browserFinder("Google-chrome");
    browserFinder.fold();
}

(нет проверки возвращаемых значений). Имена и классы можно изменять с помощью XSetClassHint. Если приложения при этом выставляют атом _NET_WM_PID (а они обычно выставляют), то по Window можно узнать ещё и pid клиента которому принадлежит окно.

quasimoto ★★★★
()
Ответ на: комментарий от quasimoto

Список окон можно просто запросить у wm (_NET_CLIENT_LIST)

baverman ★★★
()
Ответ на: комментарий от geekless

Он то ли deprecated, то ли вообще уже выкинут.

Где говорят что deprecated? На freedesktop вроде ничего не написано. Сейчас попробовал - только у трети окошек выставлен, но это как раз все «нормальные» окошки. Как я понимаю, он на уровне тулкита выставляется.

Но для данной задачи достаточно просто матчить имя/класс окошек с заранее известной для разных браузеров строкой.

quasimoto ★★★★
()
Ответ на: комментарий от quasimoto

Где говорят что deprecated?

Ух, ошибся. Спутал с WM_COMMAND. Старческий маразм берет своё.

geekless ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.