2012-09-23 14 views
5

Jak powinienem wykonać przesuwanie okna utworzonego za pomocą PySide za pomocą menedżera okien?Przenoszenie okna za pomocą PySide i PyKDE4

Widzę, że kdeui ma klasę NETRootInfo z metodą moveResizeRequest, która robi dokładnie to, co chcę. Poniższy:

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) 

daje mi:

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' 

Ten błąd jest spowodowany z powodu QX11Info.display() zwraca długo (wskaźnik), a nie strukturę wyświetlacza.

mogę używać PyQt4 na QX11Info.display() jako pierwszy parametr do konstruktora NETRootInfo „s zamiast PySide jednej, jak:

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

Ale to dodaje zależność PyQt4 oprócz PySide.

Dodatkowo, próbowałem użyć funkcji Xlib's XMoveWindow, ale to zapobiega przeciągnięciu okna częściowo z ekranu i nie daje sprzężenia zwrotnego ruchu (na przykład efektów przezroczystości) dostarczanego przez menedżery okien, takie jak Compiz lub KWin.

Moje pytanie brzmi:

  1. Jak przekonwertować PySide na QX11Info.display() w "Display", które mogą być przekazywane do kdeui.NETRootInfo, lub
  2. Jak używać Python i Xlib (albo z python-xlib lub poprzez libX11.so), aby użyć komunikatu, takiego jak _NET_WM_MOVERESIZE, aby przenieść okno?
+0

Z pewnością PyKDE4 wymaga już PyQt4 - więc nie ma * dodatkowej * zależności dla opcji (1). – ekhumoro

+0

Niezupełnie. PyKDE4 to opakowanie dla KDE4. KDE4 wymaga Qt4 do działania, ale nie ** Py ** Qt4. Opakowanie Pythona jest czystym opakowaniem C++ i dlatego nie ma zależności od PyQt4. –

+0

Nie. PyKDE jest teraz utrzymywany jako część KDE, ale zawsze wymagał zarówno PyQt, jak i SIP i który się nie zmienił: patrz [tutaj] (http://www.riverbankcomputing.com/software/pykde/intro) i [tutaj] (http://techbase.kde.org/Development/Languages/Python) w celu uzyskania szczegółowych informacji. – ekhumoro

Odpowiedz

0

Podejrzewam ostatniego połączenia rzeczywiście ma inny podpis, może tak:

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

podczas próbują wycisnąć identyfikator okna (int) zamiast.

Mając trochę doświadczenia z pygtk (i nie pykde), prawdopodobnie trzeba wyliczyć wszystkie okna wysokiego poziomu na danym ekranie, aby uzyskać obiekt uchwytu okna.

Podobnie z 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. 

podczas starają się wcisnąć niektóre stały się SupportWindow.

Powiązane problemy