2012-09-23 13 views
5

¿Cómo debo mover una ventana creada con PySide usando el administrador de ventanas?Mover ventana usando PySide y PyKDE4

Veo que kdeui tiene la clase NETRootInfo con un método moveResizeRequest, que hace exactamente lo que yo quiero. En el siguiente:

from PySide.QtCore import Qt 
from PyKDE4 import kdeui 
from PySide.QtGui import QX11Info 
import sys 
from ctypes import CDLL 
Xlib = CDLL('libX11.so.6') 

def move_window(window, event): 
    if event.buttons() & Qt.LeftButton: 
     pos = event.buttonDownScreenPos(Qt.LeftButton) 
     Xlib.XUngrabPointer(QX11Info.display(), QX11Info.appTime()) 
     rootinfo = kdeui.NETRootInfo(QX11Info.display(), kdeui.NET.WMMoveResize) 
     rootinfo.moveResizeRequest(window.winId(), pos.x(), pos.y(), kdeui.NET.Move) 

me da:

TypeError: NETRootInfo(): arguments did not match any overloaded call: 
    overload 1: argument 1 has unexpected type 'int' 
    overload 2: argument 1 has unexpected type 'int' 
    overload 3: argument 1 has unexpected type 'int' 
    overload 4: argument 1 has unexpected type 'int' 

Este error se produce porque QX11Info.display() devuelve un largo (puntero), y no una estructura de visualización.

puedo usar de QX11Info.display() como el primer parámetro para el constructor en lugar de la PySide uno NETRootInfo 's, como PyQt4:

... 
from PySide.QtGui import QX11Info 
from PyQt4.QtGui import QX11Info as QX11InfoQt 
... 

def move_window(window, event): 
    if event.buttons() & Qt.LeftButton: 
     pos = event.buttonDownScreenPos(Qt.LeftButton) 
     Xlib.XUngrabPointer(QX11Info.display(), QX11Info.appTime()) 
     rootinfo = kdeui.NETRootInfo(QX11InfoQt.display(), kdeui.NET.WMMoveResize) 
     rootinfo.moveResizeRequest(window.winId(), pos.x(), pos.y(), kdeui.NET.Move) 

Pero esto añade una dependencia de PyQt4 además de PySide.

Además, he intentado usar la función XMoveWindow de Xlib, pero esto evita que la ventana se arrastre parcialmente fuera de la pantalla, y no da la retroalimentación del movimiento (por ejemplo, efectos de transparencia) proporcionada por administradores de ventanas como Compiz o KWin.

Mi pregunta es:

  1. Cómo convierto PySide de QX11Info.display() en una "pantalla" que se puede pasar a kdeui.NETRootInfo, o
  2. ¿Cómo uso Python y Xlib (ya sea con python-xlib o a través de libX11.so) para usar un mensaje como _NET_WM_MOVERESIZE para mover la ventana?
+0

Seguramente PyKDE4 ya requiere PyQt4, por lo que no hay * dependencia * adicional para la opción (1). – ekhumoro

+0

No del todo. PyKDE4 es un contenedor para KDE4. KDE4 requiere Qt4 para operar, pero no ** Py ** Qt4. El contenedor de Python es puramente un contenedor de C++, y por lo tanto no tiene dependencia de PyQt4. –

+0

No. PyKDE ahora se mantiene como parte de KDE, pero siempre ha requerido tanto PyQt como SIP y eso no ha cambiado: vea [aquí] (http://www.riverbankcomputing.com/software/pykde/intro) y [aquí] (http://techbase.kde.org/Development/Languages/Python) para más detalles. – ekhumoro

Respuesta

0

que sospecha que su última llamada en realidad tiene diferentes firmas, tal vez así:

moveResizeRequest(<window object>, <int>, <int>, <const>)

mientras está tratando de exprimir ventana Identificación (int) en su lugar.

habiendo tenido un poco de experiencia con pygtk (y no pykde), probablemente tenga que enumerar todas las ventanas de alto nivel en una pantalla dada para obtener un objeto de control de ventana.

Del mismo modo, a partir de C++ kde docs:

display  An X11 Display struct. 
supportWindow The Window id of the supportWindow. The supportWindow must be created by the window manager as a child of the rootWindow. The supportWindow must not be destroyed until the Window Manager exits. 

mientras está tratando de exprimir alguna constante en SupportWindow.

Cuestiones relacionadas