2012-09-23 5 views
5

Wie gehe ich vor, um ein mit PySide erstelltes Fenster mit dem Fenstermanager zu verschieben?Fenster mit PySide und PyKDE4 verschieben

Ich sehe, dass Kdeui hat die NETRootInfo Klasse mit einer moveResizeRequest Methode, die genau das tut, was ich will. Die folgende:

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) 

gibt mir:

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' 

Dieser Fehler wird verursacht, weil QX11Info.display() einen langen (Zeiger) gibt, und kein Display-Struktur.

kann ich PyQt4 die QX11Info.display() als ersten Parameter zu NETRootInfo ‚s Konstruktor anstelle des pyside ein, wie:

... 
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) 

Aber das fügt eine Abhängigkeit von PyQt4 zusätzlich zu pyside.

Zusätzlich habe ich versucht, Xlibs XMoveWindow Funktion zu verwenden, aber dies verhindert, dass das Fenster teilweise vom Bildschirm ziehen, und gibt nicht die Bewegung Feedback (z. B. Transparenzeffekte) von Fenster-Manager wie Compiz oder KWin.

Meine Frage ist:

  1. Wie ich pyside die QX11Info.display() in eine „Anzeige“ umwandeln, den kdeui.NETRootInfo übergeben werden kann, oder
  2. Wie verwende ich Python und Xlib (entweder mit python-xlib oder durch libX11.so) um eine Nachricht wie _NET_WM_MOVERESIZE zu verwenden, um das Fenster zu verschieben?
+0

Sicher PyKDE4 erfordert bereits PyQt4 - so gibt es keine * zusätzliche * Abhängigkeit für Option (1). – ekhumoro

+0

Nicht ganz. PyKDE4 ist ein Wrapper für KDE4. KDE4 benötigt Qt4, aber nicht ** Py ** Qt4. Der Python-Wrapper ist ein reiner C++ - Wrapper und hat daher keine Abhängigkeit von PyQt4. –

+0

Nein. PyKDE wird jetzt als Teil von KDE gepflegt, aber es hat immer sowohl PyQt als auch SIP benötigt und das hat sich nicht geändert: siehe [hier] (http://www.riverbankcomputing.com/software/pykde/intro) und [hier] (http://techbase.kde.org/Development/Languages/Python) für Details. – ekhumoro

Antwort

0

ich vermuten, dass Ihr tatsächlich letzte Anruf andere Signatur hat, vielleicht so:

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

während Sie versuchen, Fenster-ID (int) statt zu drücken.

mit ein bisschen Erfahrung mit pygtk (und nicht pykde), müssen Sie wahrscheinlich alle High-Level-Fenster in bestimmten Bildschirm auflisten, um ein Fenster-Handle-Objekt zu erhalten.

ähnlich von 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. 

, während Sie eine Konstante in Supportwindow zu drücken versuchen.

Verwandte Themen