5

ウィンドウマネージャーを使用して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などのウィンドウマネージャーによって提供される移動フィードバック(透明効果など)を提供しません。

私の質問は:

  1. PySideをQX11Info.display()に渡すことができる「ディスプレイ」に変換する方法kdeui.NETRootInfoまたは
  2. PythonとXlib( libX11.soを使用して、python-xlibまたはlibX11.soを介して)を使用して_NET_WM_MOVERESIZE、ウィンドウを移動するためのようなメッセージを使用するにはどうすればよいですか?
4

1 に答える 1

0

おそらく次のように、最後の呼び出しには実際には異なる署名があると思われます。

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

代わりにウィンドウID(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に押し込もうとしている間。

于 2012-09-30T16:50:35.007 に答える