--- gnome-settings-daemon-2.27.4/plugins/mouse/gsd-mouse-manager.c	2009-07-21 20:59:56.686332813 -0400
+++ gnome-settings-daemon-2.27.4.hacked/plugins/mouse/gsd-mouse-manager.c	2009-07-21 20:56:10.516337831 -0400
@@ -50,8 +50,6 @@
 #include "gnome-settings-profile.h"
 #include "gsd-mouse-manager.h"
 
-#include "gsd-locate-pointer.h"
-
 #define GSD_MOUSE_MANAGER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GSD_TYPE_MOUSE_MANAGER, GsdMouseManagerPrivate))
 
 #define GCONF_MOUSE_DIR         "/desktop/gnome/peripherals/mouse"
@@ -78,6 +76,8 @@
         gboolean mousetweaks_daemon_running;
         gboolean syndaemon_spawned;
         GPid syndaemon_pid;
+	gboolean locate_pointer_spawned;
+	GPid locate_pointer_pid;
 };
 
 static void     gsd_mouse_manager_class_init  (GsdMouseManagerClass *klass);
@@ -714,149 +714,39 @@
         return 0;
 }
 
-#define KEYBOARD_GROUP_SHIFT 13
-#define KEYBOARD_GROUP_MASK ((1 << 13) | (1 << 14))
-
-/* Owen magic */
-static GdkFilterReturn
-filter (GdkXEvent *xevent,
-        GdkEvent  *event,
-        gpointer   data)
+static void
+set_locate_pointer (GsdMouseManager *manager,
+                    gboolean         state)
 {
-        XEvent *xev = (XEvent *) xevent;
-        guint keyval;
-        gint group;
+        if (state) {
+                GError        *error = NULL;
+                const char *args[2];
 
-        GdkScreen *screen = (GdkScreen *)data;
+                if (manager->priv->locate_pointer_spawned)
+                        return 0;
 
-        if (xev->type == KeyPress ||
-            xev->type == KeyRelease) {
-                /* get the keysym */
-                group = (xev->xkey.state & KEYBOARD_GROUP_MASK) >> KEYBOARD_GROUP_SHIFT;
-                gdk_keymap_translate_keyboard_state (gdk_keymap_get_default (),
-                                                     xev->xkey.keycode,
-                                                     xev->xkey.state,
-                                                     group,
-                                                     &keyval,
-                                                     NULL, NULL, NULL);
-                if (keyval == GDK_Control_L || keyval == GDK_Control_R) {
-                        if (xev->type == KeyPress) {
-                                XAllowEvents (xev->xkey.display,
-                                              SyncKeyboard,
-                                              xev->xkey.time);
-                        } else {
-                                XAllowEvents (xev->xkey.display,
-                                              AsyncKeyboard,
-                                              xev->xkey.time);
-                                gsd_locate_pointer (screen);
-                        }
-                } else {
-                        XAllowEvents (xev->xkey.display,
-                                      ReplayKeyboard,
-                                      xev->xkey.time);
-                        XUngrabKeyboard (gdk_x11_get_default_xdisplay (),
-                                         xev->xkey.time);
-                }
-        }
-        return GDK_FILTER_CONTINUE;
-}
+                args[0] = "/usr/libexec/gsd-locate-pointer";
+                args[1] = NULL;
 
-static void
-set_locate_pointer (GsdMouseManager *manager,
-                    gboolean         locate_pointer)
-{
-        GdkKeymapKey *keys;
-        GdkDisplay *display;
-        int n_screens;
-        int n_keys;
-        gboolean has_entries;
-        static const guint keyvals[] = { GDK_Control_L, GDK_Control_R };
-        unsigned j;
-
-        display = gdk_display_get_default ();
-        n_screens = gdk_display_get_n_screens (display);
-
-        for (j = 0 ; j < G_N_ELEMENTS (keyvals) ; j++) {
-                has_entries = gdk_keymap_get_entries_for_keyval (gdk_keymap_get_default (),
-                                                                 keyvals[j],
-                                                                 &keys,
-                                                                 &n_keys);
-                if (has_entries) {
-                        gint i, j;
-
-                        for (i = 0; i < n_keys; i++) {
-                                for(j=0; j< n_screens; j++) {
-                                        GdkScreen *screen = gdk_display_get_screen (display, j);
-                                        Window xroot = gdk_x11_drawable_get_xid (gdk_screen_get_root_window (screen));
-
-                                        if (locate_pointer) {
-                                                XGrabKey (GDK_DISPLAY_XDISPLAY (display),
-                                                          keys[i].keycode,
-                                                          0,
-                                                          xroot,
-                                                          False,
-                                                          GrabModeAsync,
-                                                          GrabModeSync);
-                                                XGrabKey (GDK_DISPLAY_XDISPLAY (display),
-                                                          keys[i].keycode,
-                                                          LockMask,
-                                                          xroot,
-                                                          False,
-                                                          GrabModeAsync,
-                                                          GrabModeSync);
-                                                XGrabKey (GDK_DISPLAY_XDISPLAY (display),
-                                                          keys[i].keycode,
-                                                          Mod2Mask,
-                                                          xroot,
-                                                          False,
-                                                          GrabModeAsync,
-                                                          GrabModeSync);
-                                                XGrabKey (GDK_DISPLAY_XDISPLAY (display),
-                                                          keys[i].keycode,
-                                                          Mod4Mask,
-                                                          xroot,
-                                                          False,
-                                                          GrabModeAsync,
-                                                          GrabModeSync);
-                                        } else {
-                                                XUngrabKey (GDK_DISPLAY_XDISPLAY (display),
-                                                            keys[i].keycode,
-                                                            Mod4Mask,
-                                                            xroot);
-                                                XUngrabKey (GDK_DISPLAY_XDISPLAY (display),
-                                                            keys[i].keycode,
-                                                            Mod2Mask,
-                                                            xroot);
-                                                XUngrabKey (GDK_DISPLAY_XDISPLAY (display),
-                                                            keys[i].keycode,
-                                                            LockMask,
-                                                            xroot);
-                                                XUngrabKey (GDK_DISPLAY_XDISPLAY (display),
-                                                            keys[i].keycode,
-                                                            0,
-                                                            xroot);
-                                        }
-                                }
-                        }
-                        g_free (keys);
-                        if (locate_pointer) {
-                                for (i = 0; i < n_screens; i++) {
-                                        GdkScreen *screen;
-                                        screen = gdk_display_get_screen (display, i);
-                                        gdk_window_add_filter (gdk_screen_get_root_window (screen),
-                                                               filter,
-                                                               screen);
-                                }
-                        } else {
-                                for (i = 0; i < n_screens; i++) {
-                                        GdkScreen *screen;
-                                        screen = gdk_display_get_screen (display, i);
-                                        gdk_window_remove_filter (gdk_screen_get_root_window (screen),
-                                                                  filter,
-                                                                  screen);
-                                }
-                        }
+                g_spawn_async (NULL, args, NULL,
+                               0, NULL, NULL,
+                               &manager->priv->locate_pointer_pid, &error);
+
+                manager->priv->locate_pointer_spawned = (error == NULL);
+
+                if (error) {
+                        GConfClient *client;
+                        client = gconf_client_get_default ();
+                        gconf_client_set_bool (client, KEY_LOCATE_POINTER, FALSE, NULL);
+                        g_object_unref (client);
+                        g_error_free (error);
                 }
+
+        }
+	else if (manager->priv->locate_pointer_spawned) {
+                kill (manager->priv->locate_pointer_pid, SIGHUP);
+                g_spawn_close_pid (manager->priv->locate_pointer_pid);
+                manager->priv->locate_pointer_spawned = FALSE;
         }
 }
 
--- gnome-settings-daemon-2.27.4/plugins/mouse/gsd-locate-pointer.c	2009-06-15 05:09:35.000000000 -0400
+++ gnome-settings-daemon-2.27.4.hacked/plugins/mouse/gsd-locate-pointer.c	2009-07-21 20:54:29.284087108 -0400
@@ -21,6 +21,10 @@
 #include "gsd-timeline.h"
 #include "gsd-locate-pointer.h"
 
+#include <gdk/gdkkeysyms.h>
+#include <gdk/gdkx.h>
+#include <X11/keysym.h>
+
 #define ANIMATION_LENGTH 750
 #define WINDOW_SIZE 101
 #define N_CIRCLES 4
@@ -343,3 +347,132 @@
 
   gsd_timeline_start (data->timeline);
 }
+
+
+#define KEYBOARD_GROUP_SHIFT 13
+#define KEYBOARD_GROUP_MASK ((1 << 13) | (1 << 14))
+
+/* Owen magic */
+static GdkFilterReturn
+filter (GdkXEvent *xevent,
+        GdkEvent  *event,
+        gpointer   data)
+{
+        XEvent *xev = (XEvent *) xevent;
+        guint keyval;
+        gint group;
+
+        GdkScreen *screen = (GdkScreen *)data;
+
+        if (xev->type == KeyPress ||
+            xev->type == KeyRelease) {
+                /* get the keysym */
+                group = (xev->xkey.state & KEYBOARD_GROUP_MASK) >> KEYBOARD_GROUP_SHIFT;
+                gdk_keymap_translate_keyboard_state (gdk_keymap_get_default (),
+                                                     xev->xkey.keycode,
+                                                     xev->xkey.state,
+                                                     group,
+                                                     &keyval,
+                                                     NULL, NULL, NULL);
+                if (keyval == GDK_Control_L || keyval == GDK_Control_R) {
+                        if (xev->type == KeyPress) {
+                                XAllowEvents (xev->xkey.display,
+                                              SyncKeyboard,
+                                              xev->xkey.time);
+                        } else {
+                                XAllowEvents (xev->xkey.display,
+                                              AsyncKeyboard,
+                                              xev->xkey.time);
+                                gsd_locate_pointer (screen);
+                        }
+                } else {
+                        XAllowEvents (xev->xkey.display,
+                                      ReplayKeyboard,
+                                      xev->xkey.time);
+                        XUngrabKeyboard (gdk_x11_get_default_xdisplay (),
+                                         xev->xkey.time);
+                }
+        }
+        return GDK_FILTER_CONTINUE;
+}
+
+set_locate_pointer (void)
+{
+        GdkKeymapKey *keys;
+        GdkDisplay *display;
+        int n_screens;
+        int n_keys;
+        gboolean has_entries;
+        static const guint keyvals[] = { GDK_Control_L, GDK_Control_R };
+        unsigned j;
+
+        display = gdk_display_get_default ();
+        n_screens = gdk_display_get_n_screens (display);
+
+        for (j = 0 ; j < G_N_ELEMENTS (keyvals) ; j++) {
+                has_entries = gdk_keymap_get_entries_for_keyval (gdk_keymap_get_default (),
+                                                                 keyvals[j],
+                                                                 &keys,
+                                                                 &n_keys);
+                if (has_entries) {
+                       gint i, j;
+                       for (i = 0; i < n_keys; i++) {
+                                for(j=0; j< n_screens; j++) {
+                                        GdkScreen *screen = gdk_display_get_screen (display, j);
+                                        Window xroot = gdk_x11_drawable_get_xid (gdk_screen_get_root_window (screen));
+
+                                        XGrabKey (GDK_DISPLAY_XDISPLAY (display),
+                                                  keys[i].keycode,
+                                                  0,
+                                                  xroot,
+                                                  False,
+                                                  GrabModeAsync,
+                                                  GrabModeSync);
+                                        XGrabKey (GDK_DISPLAY_XDISPLAY (display),
+                                                  keys[i].keycode,
+                                                  LockMask,
+                                                  xroot,
+                                                  False,
+                                                  GrabModeAsync,
+                                                  GrabModeSync);
+                                        XGrabKey (GDK_DISPLAY_XDISPLAY (display),
+                                                  keys[i].keycode,
+                                                  Mod2Mask,
+                                                  xroot,
+                                                  False,
+                                                  GrabModeAsync,
+                                                  GrabModeSync);
+                                        XGrabKey (GDK_DISPLAY_XDISPLAY (display),
+                                                  keys[i].keycode,
+                                                  Mod4Mask,
+                                                  xroot,
+                                                  False,
+                                                  GrabModeAsync,
+                                                  GrabModeSync);
+                                }
+                        }
+                        g_free (keys);
+                        for (i = 0; i < n_screens; i++) {
+                                GdkScreen *screen;
+                                screen = gdk_display_get_screen (display, i);
+                                gdk_window_add_filter (gdk_screen_get_root_window (screen),
+                                                       filter,
+                                                       screen);
+                        }
+                }
+        }
+}
+
+
+int
+main (int argc, char *argv[])
+{
+	gtk_init (&argc, &argv);
+
+        set_locate_pointer ();
+
+        gtk_main ();
+
+        return 0;
+}
+
--- gnome-settings-daemon-2.27.4/plugins/mouse/Makefile.am	2009-05-03 14:15:30.000000000 -0400
+++ gnome-settings-daemon-2.27.4.hacked/plugins/mouse/Makefile.am	2009-07-21 20:58:10.619086849 -0400
@@ -4,11 +4,7 @@
 	gsd-mouse-plugin.h	\
 	gsd-mouse-plugin.c	\
 	gsd-mouse-manager.h	\
-	gsd-mouse-manager.c	\
-	gsd-locate-pointer.h	\
-	gsd-locate-pointer.c	\
-	gsd-timeline.h		\
-	gsd-timeline.c
+	gsd-mouse-manager.c
 
 libmouse_la_CPPFLAGS = \
 	-I$(top_srcdir)/gnome-settings-daemon		\
@@ -30,6 +26,21 @@
 
 plugin_DATA = $(plugin_in_files:.gnome-settings-plugin.in=.gnome-settings-plugin)
 
+libexec_PROGRAMS = gsd-locate-pointer
+
+gsd_locate_pointer_SOURCES = 	\
+	gsd-locate-pointer.h	\
+	gsd-locate-pointer.c	\
+	gsd-timeline.h		\
+	gsd-timeline.c
+
+gsd_locate_pointer_CFLAGS = \
+	$(SETTINGS_PLUGIN_CFLAGS)	\
+	$(AM_CFLAGS)
+
+gsd_locate_pointer_LDADD  = 		\
+	$(SETTINGS_PLUGIN_LIBS)
+
 EXTRA_DIST = $(plugin_in_files)
 CLEANFILES = $(plugin_DATA)
 DISTCLEANFILES = $(plugin_DATA)
