ウィンドウマネージャーを使用してPySideで作成されたウィンドウを移動するにはどうすればよいですか?
kdeuiには、私が望むことを正確に実行NETRootInfo
するメソッドを持つクラスがあることがわかりますmoveResizeRequest
。以下:
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)
私に与える:
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'
このエラーはQX11Info.display()
、表示構造ではなく、長い(ポインター)を返すために発生します。
次のように、PySideコンストラクターの代わりに、コンストラクターのQX11Info.display()
最初のパラメーターとしてPyQt4を使用できます。NETRootInfo
...
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)
ただし、これにより、PySideに加えてPyQt4への依存関係が追加されます。
さらに、XlibのXMoveWindow
機能を使用してみましたが、これにより、ウィンドウが画面から部分的にドラッグされるのを防ぎ、CompizやKWinなどのウィンドウマネージャーによって提供される移動フィードバック(透明効果など)を提供しません。
私の質問は:
- PySideを
QX11Info.display()
に渡すことができる「ディスプレイ」に変換する方法kdeui.NETRootInfo
、または - PythonとXlib( libX11.soを使用して、
python-xlib
またはlibX11.soを介して)を使用して_NET_WM_MOVERESIZE
、ウィンドウを移動するためのようなメッセージを使用するにはどうすればよいですか?