All pastes #132623 Raw Edit

Casanova

public text v1 · immutable
#132623 ·published 2006-08-15 11:43 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 _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;
}