rendered paste body#define WNCK_I_KNOW_THIS_IS_UNSTABLE#include <libwnck/libwnck.h>#include <stdio.h>#include "gdk/gdkx.h"static GList* m_window_list = NULL;/* private cut-n-paste functions from libwnck/xutils.c */void _wnck_activate (Screen *screen, Window xwindow, Time timestamp);void _wnck_activate_workspace (Screen *screen, int new_active_space, Time timestamp);void _modified_wnck_window_activate (WnckWindow *window);void _modified_wnck_workspace_activate (WnckWorkspace *space, WnckWindow *window);void_wnck_activate (Screen *screen, Window xwindow, Time timestamp){ XEvent xev; Atom net_active_window_atom; /* Deviating from libwnck here because copying _wnck_atom_get sounds like * overkill. This is slightly slower, but oh well. */ net_active_window_atom = XInternAtom (gdk_display, "_NET_ACTIVE_WINDOW", FALSE); xev.xclient.type = ClientMessage; xev.xclient.serial = 0; xev.xclient.send_event = True; xev.xclient.display = gdk_display; xev.xclient.window = xwindow; xev.xclient.message_type = net_active_window_atom; xev.xclient.format = 32; xev.xclient.data.l[0] = 2; xev.xclient.data.l[1] = timestamp; xev.xclient.data.l[2] = 0; xev.xclient.data.l[3] = 0; xev.xclient.data.l[4] = 0; XSendEvent (gdk_display, RootWindowOfScreen (screen), False, SubstructureRedirectMask | SubstructureNotifyMask, &xev); }void_wnck_activate_workspace (Screen *screen, int new_active_space, Time timestamp){ XEvent xev; Atom net_current_desktop_atom; /* Deviating from libwnck here because copying _wnck_atom_get sounds like * overkill. This is slightly slower, but oh well. */ net_current_desktop_atom = XInternAtom (gdk_display, "_NET_CURRENT_DESKTOP", FALSE); xev.xclient.type = ClientMessage; xev.xclient.serial = 0; xev.xclient.send_event = True; xev.xclient.display = gdk_display; xev.xclient.window = RootWindowOfScreen (screen); xev.xclient.message_type = net_current_desktop_atom; xev.xclient.format = 32; xev.xclient.data.l[0] = new_active_space; xev.xclient.data.l[1] = timestamp; xev.xclient.data.l[2] = 0; xev.xclient.data.l[3] = 0; xev.xclient.data.l[4] = 0; XSendEvent (gdk_display, RootWindowOfScreen (screen), False, SubstructureRedirectMask | SubstructureNotifyMask, &xev);}void_modified_wnck_window_activate (WnckWindow *window){ Screen *screen; Window xid; XWindowAttributes attrs; guint32 temp=gtk_get_current_event_time(); xid = wnck_window_get_xid (window); XGetWindowAttributes(gdk_display, xid, &attrs); printf ("in window value: %d",temp); _wnck_activate (attrs.screen, xid, temp);}/* The WnckWindow is merely used to get the x screen */void_modified_wnck_workspace_activate (WnckWorkspace *space, WnckWindow *window){ Screen *screen; Window xid; XWindowAttributes attrs; guint32 temp=gtk_get_current_event_time(); xid = wnck_window_get_xid (window); XGetWindowAttributes(gdk_display, xid, &attrs); printf ("in workspace value: %d",temp); _wnck_activate_workspace (attrs.screen, wnck_workspace_get_number (space), temp);}void refreshList(){ WnckScreen *screen;#ifdef HAVE_WNCK_CLIENT_TYPE static gboolean client_type_set = FALSE;#endif#ifdef HAVE_WNCK_CLIENT_TYPE /* Register as a pager, so that the window manager treats us the * same as a taskbar (i.e. having global awareness of apps) rather * than as a normal app (i.e. primarily only knowing about and * having UI for dealing with my own windows). Doesn't matter for * most cases, but some WMs in some cases treat the two * differently. */ if (!client_type_set) { wnck_set_client_type (WNCK_CLIENT_TYPE_PAGER); client_type_set = TRUE; }#endif screen = wnck_screen_get_default (); wnck_screen_force_update (screen); m_window_list = wnck_screen_get_windows (screen);} int main (int argc, char **argv){ WnckWorkspace *workspace; gboolean bSuccess; int index = 0, a=0; bSuccess = FALSE; char* keyLabel; GList *window_list_entry; gdk_init(&argc, &argv); gtk_init(&argc, &argv); refreshList(); window_list_entry = m_window_list; while (window_list_entry != NULL) { printf ("%d %s\n", index, wnck_window_get_name(window_list_entry->data)); window_list_entry = window_list_entry->next; index++; } printf ("Enter choice: "); scanf ("%d",&index); window_list_entry = m_window_list; while (a<index) { window_list_entry = window_list_entry->next; a++; } workspace = wnck_window_get_workspace (window_list_entry->data); if (workspace != NULL) _modified_wnck_workspace_activate (workspace, window_list_entry->data); _modified_wnck_window_activate (window_list_entry->data); return 0;}