Как определить высокоуровневые X11 окна с помощью xlib?

Просто добавьте атрибут runAllManagedModulesForAllRequests="true" к system.webServer\modules в web.config.

Этот атрибут включен по умолчанию в MVC и Динамических проектах Данных.

13
задан Josh Lee 5 October 2010 в 05:33
поделиться

3 ответа

У меня есть решение!

Ну, вроде того.

Если ваш оконный менеджер использует подсказки расширенного оконного менеджера (EWMH), вы можете запросить корневое окно, используя " _NET_CLIENT_LIST " атом. Это возвращает список клиентских окон, которыми управляет оконный менеджер. Для получения дополнительной информации см. здесь .

Однако с этим есть некоторые проблемы. Для начала, используемый оконный менеджер должен поддерживать EWMH. KDE и GNOME делают, и я уверен, что некоторые другие тоже. Однако я уверен, что многие этого не делают. Кроме того, я заметил несколько проблем с KDE. Как правило, некоторые приложения, не относящиеся к KDE, не попадают в список. Например, если вы запустите xcalc под KDE, он не будет отображаться в этом списке.

Если кто-нибудь может предложить какие-либо улучшения этого метода, я был бы рад их услышать. Для справки, код, который я использую, приведен ниже:

    Atom a = XInternAtom(m_pDisplay, "_NET_CLIENT_LIST" , true);
    Atom actualType;
    int format;
    unsigned long numItems, bytesAfter;
    unsigned char *data =0;
    int status = XGetWindowProperty(m_pDisplay,
                                rootWindow,
                                a,
                                0L,
                                (~0L),
                                false,
                                AnyPropertyType,
                                &actualType,
                                &format,
                                &numItems,
                                &bytesAfter,
                                &data);

    if (status >= Success && numItems)
    {
        // success - we have data: Format should always be 32:
        Q_ASSERT(format == 32);
        // cast to proper format, and iterate through values:
        quint32 *array = (quint32*) data;
        for (quint32 k = 0; k < numItems; k++)
        {
            // get window Id:
            Window w = (Window) array[k];

            qDebug() << "Scanned client window:" << w;
        }
        XFree(data);
    }
11
ответ дан 1 December 2019 в 23:32
поделиться

Если вам не нужно использовать Xlib, используйте GDK's gdk_screen_get_window_stack () и gdk_window_get_window_type () может помочь вам в ваших нуждах.

1
ответ дан 1 December 2019 в 23:32
поделиться

Чтобы расширить предыдущее решение, если вы хотите получить имена окон:

// get window Id:
Window w = (Window) array[k];

char* name = '\0';
status = XFetchName(display, w, &name);
if (status >= Success)
{
    if (name == NULL)
        printf("Found: %ul  NULL\n", w);
    else
        printf("Found: %ul  %s\n", w, name);
}
XFree(name);
6
ответ дан 1 December 2019 в 23:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: