views:

280

answers:

1

Hi all,
I have a Linux-only wxPython application with a wxFrame that acts as a menu/toolbar, it can open up new windows that are independent of the toolbar itself.
Since the user can move any of these windows to any virtual workspace, I'm looking for a way to move the toolbar to the current workspace whenever the user activates a window.
I tried using Raise(), but in this way the toolbar receives the focus too and I don't want that. Please note that I can't make the toolbar sticky, since I don't want it on every workspace.

Thanks!

(wxPython 2.8.9.1, Ubuntu 9.04)

Follow-up:

I checked the source code of xfwm4 to see how it does its "Move window to workspace N".. It uses the _NET_WM_DESKTOP hint, so I'm trying to do it using Python.. Here's my code right now:

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])

It looks like the code is somewhat successful, since xprop detects the change:

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

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

but the problem is that the window doesn't move to the desired workspace :/

Should I use python-xlib instead of pygtk? If that's the case, how can I get from a wxFrame (or gtk.Window, or XID) the corresponding Xlib.Window?

Follow-up 2:

The same happens using xprop..

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

It detects the changed _NET_WM_DESKTOP, but the window stays there :/ However, I noticed the following:

  • an iconified version of the window appears on the intended workspace
  • if I iconify the window on the "source" workspace, it disappears

So, maybe I should send some kind of "refresh" message to the window manager too..?

A: 

In the end I decided to just use wmctrl.

Joril