Предотвращение перекрытия окон в GTK - PullRequest
4 голосов
/ 05 октября 2010

У меня есть приложение на Python / Linux, которое отображает нужную мне информацию в окне GTK.Для целей этого обсуждения он должен вести себя точно так же, как док-станция - он существует на всех виртуальных рабочих столах, и развернутые окна не перекрывают его.

Первый пункт довольно прост, но я потратил несколько дней, стуча головой о монитор, пытаясь получить вторую точку - предотвращая наложение.Мое приложение не должно быть закрыто, если развернуто другое окно.Установка «всегда сверху» не достаточна, так как другие окна просто сидят за моей информационной панелью, а не останавливаются на ее краю.

Короче говоря: с окном в стиле док-панели, как вы можете предотвратить максимальное увеличение других окон над / под ним?

Обновление: проблема решена благодаря всеменов

1 Ответ

12 голосов
/ 05 октября 2010

Используйте свойства _NET_WM_STRUT и _NET_WM_STRUT_PARTIAL (для обратной совместимости), чтобы зарезервировать пространство на краю рабочего стола X Window System.

С PyGtk вы можете установить эти свойства следующим образом, предполагая, что self.window является экземпляром gtk.Window:

self.window.get_toplevel().show() # must call show() before property_change()
self.window.get_toplevel().window.property_change("_NET_WM_STRUT", 
    "CARDINAL", 32, gtk.gdk.PROP_MODE_REPLACE, [0, 0, 0, bottom_width]) 

Разъяснение по параметру данных [0, 0, 0, bottom_width] выше:

Этот параметр указывает ширину зарезервированного пространства на каждой границе экрана рабочего стола в следующем порядке: [left, right, top, bottom]. Так что [0, 0, 0, 50] зарезервирует 50 пикселей внизу экрана рабочего стола для вашего виджета.

Вот простой рабочий пример:

import gtk

class PyGtkWidgetDockExample:
    def __init__(self):
        self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
        self.window.set_default_size(100, gtk.gdk.screen_height())
        self.window.move(gtk.gdk.screen_width()-100, 0)
        self.window.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_DOCK)        
        self.window.show()          
        self.window.window.property_change("_NET_WM_STRUT", "CARDINAL", 32, 
            gtk.gdk.PROP_MODE_REPLACE, [0, 100, 0, 0])               

app = PyGtkWidgetDockExample()
gtk.main()
...