Hello,

I have code that sends a message to the window manager to switch to a given desktop number.
I try converted this code from C to GDK on Ubuntu Linux.

# The code is this.
import gtk.gdk
import struct

# Switch to desktop number X

gdk_root = gtk.gdk.get_default_root_window() gdk_disp = gtk.gdk.display_get_default()
gdk_event = gtk.gdk.Event(gtk.gdk.CLIENT_EVENT)

atom_property = gtk.gdk.atom_intern("_NET_CURRENT_DESKTOP", False)
# atom_property = gtk.gdk.atom_intern("_NET_DESKTOP_VIEWPORT", False)

# event_send_client_message_for_display

gdk_event.window = gdk_root
gdk_event.send_event = True
gdk_event.message_type = atom_property
gdk_event.data_format = 32
# Data is: desktop number (0 based), time, 0, 0, 0
gdk_event.data = struct.pack("LLLLL", 1, gtk.get_current_event_time(), 0, 0, 0)

print"struct.calcsize(fmt)=", struct.calcsize("L")
# print gdk_event.data

mask = gtk.gdk.STRUCTURE_MASK | gtk.gdk.SUBSTRUCTURE_MASK
ret = gtk.gdk.event_send_client_message_for_display(gdk_disp, gdk_event, mask)
#ret = gdk_disp.put_event(gdk_event)
#ret = gdk_event.put()
print "ret=", ret
gdk_disp.sync()
gdk_disp.flush()

# ------------------------------------------

But the code doe not work. It does nothing.
It should switch to desktop number 1 (the second Metacity desktop).

This is the original C/Xlib code that works very well.
http://code.google.com/p/gscreendump/source/browse/trunk/src/sd_xutils.c

Function:
void metacity_set_active_desktop(guint desktop_num)
{
   /* Switch to/set active desktop.
      The desktop_num is zero-based: 0, 1, 2...
   */

   /* Metacity or other standards respecting window manager */
   if (desktop_num+1 > get_number_of_desktops()) return;

   Display *display = GDK_DISPLAY();
   Window root_win = GDK_WINDOW_XWINDOW(gdk_get_default_root_window());

Atom atom_net_current_desktop = XInternAtom(display, "_NET_CURRENT_DESKTOP", False);

   XEvent xevent;
   xevent.type   = ClientMessage;
   xevent.xclient.type = ClientMessage;
   xevent.xclient.display  = display;
   xevent.xclient.window = root_win;
   xevent.xclient.message_type = atom_net_current_desktop;
   xevent.xclient.format  = 32;
   xevent.xclient.data.l[0] = desktop_num;
   xevent.xclient.data.l[1] = CurrentTime;
   xevent.xclient.data.l[2] = 0;
   xevent.xclient.data.l[3] = 0;
   xevent.xclient.data.l[4] = 0;
XSendEvent(display, root_win, False, SubstructureNotifyMask | SubstructureRedirectMask, &xevent);

   XFlush(display);
}

---------------------
Notice: The atom "_NET_CURRENT_DESKTOP" works only with flat Metacity or equivalent window manager. Compiz uses "_NET_DESKTOP_VIEWPORT" atom. And the data values are not desktop numbers, but viewport widths. This is explained in the compiz_set_active_viewport(guint viewport_num) function in the above C code link.

You should absolutely switch to Metacity (or equivalent GNOME/KDE) window manager before testing this Python code. It will not work with Compiz WM. Type
$ metacity --replace
---------------------

I also send this question to [Python-xlib-users],  xlib version of the code
http://sourceforge.net/mailarchive/message.php?msg_name=4B7280E5.60300%40gmail.com

Thanks in advance.

Kindly Moma Antero.
Oslo, Norway




_______________________________________________
pygtk mailing list   pygtk@daa.com.au
http://www.daa.com.au/mailman/listinfo/pygtk
Read the PyGTK FAQ: http://faq.pygtk.org/

Reply via email to