Переместить окно, используя PySide и PyKDE4
Как мне переместить окно, созданное с помощью 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()
возвращает long (указатель), а не структуру Display.
Я могу использовать PyQt4 QX11Info.display()
в качестве первого параметра NETRootInfo
конструктор вместо PySide, например:
...
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)
Но это добавляет зависимость от PyQt4 в дополнение к PySide.
Кроме того, я попытался использовать Xlib XMoveWindow
функции, но это предотвращает частичное перетаскивание окна за пределы экрана и не обеспечивает обратную связь по перемещению (например, эффекты прозрачности), предоставляемую оконными менеджерами, такими как Compiz или KWin.
Мой вопрос:
- Как я могу конвертировать PySide's
QX11Info.display()
в "Дисплей", который может быть переданkdeui.NETRootInfo
или - Как мне использовать Python и Xlib (либо с
python-xlib
или через libX11.so) использовать сообщение вроде_NET_WM_MOVERESIZE
для того, чтобы переместить окно?
1 ответ
Я подозреваю, что ваш последний звонок на самом деле имеет другую подпись, возможно, так:
moveResizeRequest(<window object>, <int>, <int>, <const>)
пока вы пытаетесь сжать идентификатор окна (int) вместо этого.
имея небольшой опыт работы с pygtk (а не с pykde), вам, вероятно, придется перечислить все высокоуровневые окна на данном экране, чтобы получить объект дескриптора окна.
Аналогично, из C++ kde документов:
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.
пока вы пытаетесь втиснуть некоторую константу в supportWindow.