Перемещение окна между рабочими пространствами / виртуальными рабочими столами - PullRequest
2 голосов
/ 25 января 2010

У меня есть приложение wxPython только для Linux с wxFrame, которое действует как меню / панель инструментов, оно может открывать новые окна, которые не зависят от самой панели инструментов.
Поскольку пользователь может переместить любое из этих окон в любое виртуальное рабочее пространство, я ищу способ переместить панель инструментов в текущее рабочее пространство всякий раз, когда пользователь активирует окно.
Я пытался использовать Raise (), но таким образом панель инструментов тоже получает фокус, и я этого не хочу. Обратите внимание, что я не могу сделать панель инструментов липкой, поскольку не хочу, чтобы она работала в в каждом рабочем пространстве.

Спасибо!

(wxPython 2.8.9.1, Ubuntu 9.04)

Последующий:

Я проверил исходный код xfwm4 , чтобы увидеть, как работает его «Переместить окно в рабочую область N». Он использует подсказку _NET_WM_DESKTOP , поэтому я пытаюсь сделать это с использованием Python .. Вот мой код прямо сейчас:

import gtk

def move_to_workspace(frame, ws):
    gdkwin = gtk.gdk.window_lookup(frame.GetHandle())
    win = gdkwin.get_user_data()
    while not isinstance(win, gtk.Window): # Find parent Window object
        win = win.get_parent()
    win.window.property_change(gtk.gdk.atom_intern("_NET_WM_DESKTOP"),
                                                        gtk.gdk.atom_intern("CARDINAL"), 32,
                                                        gtk.gdk.PROP_MODE_REPLACE,
                                                        [ws])

Похоже, код несколько успешен, поскольку xprop обнаруживает изменение:

(before execution)
$ xprop | grep WM_DESKTOP
_NET_WM_DESKTOP(CARDINAL) = 0

(after)
$xprop | grep WM_DESKTOP
_NET_WM_DESKTOP(CARDINAL) = 1

но проблема в том, что окно не перемещается в нужное рабочее пространство: /

Должен ли я использовать python-xlib вместо pygtk? Если это так, как я могу получить из wxFrame (или gtk.Window, или XID) соответствующий Xlib.Window?

Продолжение 2:

То же самое происходит с использованием xprop ..

$ xprop -id <id> -f _NET_WM_DESKTOP 32c -set _NET_WM_DESKTOP 1

Он обнаруживает измененную _NET_WM_DESKTOP, но окно остается там: / Однако я заметил следующее:

  • в предназначенном рабочем пространстве появляется иконизированная версия окна
  • если я обозначу окно в рабочем пространстве «источник», оно исчезнет

Итак, может быть, мне следует отправить какое-то сообщение "обновить" оконному менеджеру тоже??

Ответы [ 2 ]

1 голос
/ 16 января 2014

Это довольно старое, но все же ... Вам нужно вызвать flush метод экземпляра display.Display после установки свойств окна и отправки событий.

1 голос
/ 01 февраля 2010

В итоге я решил просто использовать wmctrl .

...