2010-10-04 7 views
4

J'ai une application Python/Linux qui affiche des informations dont j'ai besoin dans une fenêtre GTK. Pour les besoins de cette discussion, il devrait se comporter exactement comme un dock - existe sur tous les bureaux virtuels, et les fenêtres maximisées ne se chevauchent pas.Empêcher le chevauchement des fenêtres dans GTK

Le premier point est assez facile, mais j'ai passé des jours à dénigrer mon écran en essayant d'obtenir le second point, évitant ainsi le chevauchement. Mon application ne doit pas être couverte si une autre fenêtre est agrandie. Régler "toujours sur le dessus" ne suffit pas, car les autres fenêtres restent juste derrière ma barre d'info au lieu de s'arrêter à son bord. En bref: avec une fenêtre de style dock/panneau, comment pouvez-vous empêcher d'autres fenêtres de maximiser ou de réduire la fenêtre?

Mise à jour: Problème résolu grâce à vsemenov

Répondre

12

Utilisez _NET_WM_STRUT et _NET_WM_STRUT_PARTIAL propriétés (pour la compatibilité arrière) pour réserver un espace au bord du bureau X Window System.

Avec PyGtk vous pouvez définir ces propriétés comme si, en supposant self.window est une instance de 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]) 

Précision sur le paramètre de données dans [0, 0, 0, bottom_width] ci-dessus:

Ce paramètre indique la largeur de l'espace réservé à chaque bordure de l'écran du bureau dans l'ordre: [left, right, top, bottom]. Donc, [0, 0, 0, 50] réserverait 50 pixels au bas de l'écran du bureau pour votre widget.

Voici un exemple simple travail:

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() 
+0

C'est une grande aide, et clarifie une partie du code que je trouve dans PyPanel en essayant de résoudre ce problème. Je vois les documents montrent que property_change (propriété, type, format, mode, données) pouvez-vous clarifier les données envoyées? J'ai la taille, pouvez-vous me parler des zéros? – Josh

+0

@Josh: mis à jour mon post avec réponse à votre question. – vls

+0

Hmm merci pour la réponse. J'utilise \t écran = gtk.gdk.screen_get_default() \t root = screen.get_root_window() \t root.property_change ("_ NET_WM_STRUT", "CARDINAL", 32, gtk.gdk.PROP_MODE_REPLACE, [0, 0, 0, 64]) sans chance. C'est la fenêtre racine à laquelle vous faites référence? Ou la fenêtre de mon application? Je n'ai pas de chance de toute façon. – Josh

Questions connexes