Pregunta

Tengo una aplicación Python / Linux que muestra los bits de información que necesitan en una ventana GTK. A los efectos de esta discusión, debe comportarse exactamente como un muelle - existe en todos los escritorios virtuales, y las ventanas maximizadas no se traslapan ella.

El primer punto es bastante fácil, pero he pasado días golpeando mi cabeza contra mi monitor tratando de conseguir el segundo punto - la prevención de solapamiento. Mi aplicación no debe estar cubierto si se maximiza otra ventana. Ajuste "siempre visible" no es suficiente, ya que las otras ventanas apenas se sientan detrás de mi barra de información en lugar de detenerse en su borde.

En resumen: con una ventana de estilo muelle / tabla, ¿cómo se puede evitar que otras ventanas de la maximización sobre / debajo de ella?

Actualización: Problema resuelto gracias a vsemenov

¿Fue útil?

Solución

_NET_WM_STRUT y _NET_WM_STRUT_PARTIAL (para hacia atrás compatibilidad) propiedades para reservar espacio en el borde de X Window escritorio del sistema.

Con PyGtk se puede establecer estas propiedades como tal, asumiendo self.window es una instancia 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]) 

Aclaración sobre el [0, 0, 0, bottom_width] parámetro de datos en arriba:

Este parámetro especifica el ancho del espacio reservado en cada borde de la pantalla de escritorio en orden: [left, right, top, bottom]. Así [0, 0, 0, 50] reservaría 50 píxeles en la parte inferior de la pantalla de escritorio para el widget.

Aquí está un ejemplo simple de trabajo:

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()
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top