Как получить список всех окон на моем рабочем столе gnome2 с помощью pygtk? - PullRequest
5 голосов
/ 20 февраля 2012

Я немного запутался с некоторыми понятиями gtk и gnome.Я пытаюсь получить список не свернутых окон на моем рабочем столе gnome2, но после прочтения документации pygtk и проверки результатов я не могу понять результаты.

Ни один из двух приведенных ниже фрагментов не работает.

Сначала я попробовал это ..

>>> gtk.gdk.window_get_toplevels()
[<gtk.gdk.Window object at 0xb74339b4 (GdkWindow at 0x8a4c170)>]

>>> gtk.gdk.window_get_toplevels()[0].get_children()
[]

, затем это

>>> d = gtk.gdk.DisplayManager()   
>>> d.get_default_display().get_screen(0).get_root_window().get_children() 
[<gtk.gdk.Window object at 0x89dcc84 (GdkWindow at 0x8a4c170)>, <gtk.gdk.Window object at 0x89dccac (GdkWindow at 0x8a4c0c0)>] 

Как видно из вывода консоли, второй параметр возвращает два окна.Но я не смог понять, кто они.Ни у кого из них нет детей, и я всегда получаю эти два окна независимо от того, сколько окон у меня на рабочем столе.

Может ли кто-нибудь объяснить иерархию объектов типичной среды рабочего стола на основе gtk?Я не могу понять, почему вышеприведенный код не работает.

Пожалуйста, воздержитесь от публикации альтернативных решений, использующих ресурсы для wnck, xlib, qt и т. Д.в получении совета, например, мы проверяем другие библиотеки.

Ответы [ 2 ]

9 голосов
/ 21 февраля 2012

Ваше ограничение - это как сказать: «Я хочу собрать проигрыватель компакт-дисков, используя только банан. Пожалуйста, воздержитесь от публикации альтернативных решений, использующих лазеры». GTK не может этого сделать, вы используете не тот инструмент для работы.

Вот объяснение того, что на самом деле означает «окно» и почему ваш код не работает:

Прежде всего, вам необходимо понять разницу между gtk.Window и gtk.gdk.Window. Окно GTK - это виджет GTK верхнего уровня, который может содержать другие виджеты. Обычно он связан с окном на вашем рабочем столе, но не обязательно - в GTK 3 есть OffscreenWindow.

Окно

A GDK , с другой стороны, зависит от платформы. На рабочем столе X это тонкая обертка вокруг окна X, которая не обязательно является полноуровневым окном рабочего стола. В других системах существует абстрагирование оконной системы. Окно GDK получает события, поэтому некоторые неоконные виджеты GTK имеют свои собственные окна GDK. «Окно» - действительно ужасное название для этих объектов, но оно унаследовано от X и, вероятно, не изменится.

Каждый процесс GTK знает только о своих собственных окнах. Вы можете получить список окон верхнего уровня GTK вашего собственного приложения, используя gtk.window_list_toplevels(). Получение дочерних элементов этих окон должно вернуть вам виджеты GTK, которые они содержат. Однако вы не можете спуститься в иерархию виджетов окон других процессов. Например, что если другой процесс имеет окно с дочерним виджетом, который является пользовательским виджетом, о котором ваш процесс не знает? Что он должен сообщить как тип этого виджета?

Получение списка окон верхнего уровня GDK с помощью gtk.gdk.window_get_toplevels() в основном такое же, как получение списка окон верхнего уровня X, насколько я понимаю. У вас нет возможности узнать, что это за окна - это может быть панель Gnome, или они могут быть окнами Qt, или они вообще могут быть чем-то еще, что не соответствует окну рабочего стола.

Libwnck ( ссылка на обзор того, что он делает) может получить список не свернутых окон и их заголовки, но не позволит увидеть их внутри. Там нет никакого способа сделать это. Libwnck использует GDK внутренне, так что технически вы можете сделать это с помощью GDK, но зачем вам беспокоиться, если уже есть библиотека, которая делает это для вас? Если вы действительно хотите сделать это самостоятельно, посмотрите исходный код libwnck.

7 голосов
/ 04 июля 2012

Окна, которые вы получаете, являются окнами, которые были созданы в вашем процессе.Чтобы получить список окон, вам нужно запросить свойства корневого окна, например:

import gtk.gdk
root = gtk.gdk.get_default_root_window()
for id in root.property_get('_NET_CLIENT_LIST')[2]:
    w = gtk.gdk.window_foreign_new(id)
    if w:
        print(w.property_get('WM_NAME')[2])

Обратите внимание, что GDK представляет собой тонкий слой над графическим ядром операционной системы (X11 / Quartz / Aqua /GDI и т. Д.) И результат может отличаться на разных устройствах NIX.

...