Переместить окно, используя 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.

Мой вопрос:

  1. Как я могу конвертировать PySide's QX11Info.display() в "Дисплей", который может быть передан kdeui.NETRootInfoили
  2. Как мне использовать 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.

Другие вопросы по тегам