All pastes #125363 Raw Edit

Casanova

public text v1 · immutable
·published 2006-08-10 16:09 UTC
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
_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;

     xid = wnck_window_get_xid (window);
     XGetWindowAttributes(gdk_display, xid, &attrs);

     _wnck_activate (attrs.screen,
		     xid,
		     0);
}

/* 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;

     xid = wnck_window_get_xid (window);
     XGetWindowAttributes(gdk_display, xid, &attrs);

     _wnck_activate_workspace (attrs.screen,
			       wnck_workspace_get_number (space),
			       0);
}

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) {
	  fflush (stdout);
	  printf ("%d %s\n", index, wnck_window_get_name(window_list_entry->data));
	  fflush (stdout);
	  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;
}