File gsd-speed-mouse.patch of Package gnome-settings-daemon

diff -u -r a/plugins/mouse/gsd-locate-pointer.h b/plugins/mouse/gsd-locate-pointer.h
--- a/plugins/mouse/gsd-locate-pointer.h	2008-08-04 15:25:52.000000000 +0100
+++ b/plugins/mouse/gsd-locate-pointer.h	2009-01-30 11:40:07.000000000 +0000
@@ -17,7 +17,7 @@
 #ifndef LOCATE_POINTER_H
 #define LOCATE_POINTER_H
 
-#include <gdk/gdkscreen.h>
+#include <gdk/gdk.h>
 
 void gsd_locate_pointer (GdkScreen *screen);
 
diff -u -r a/plugins/mouse//gsd-mouse-manager.c b/plugins/mouse//gsd-mouse-manager.c
--- a/plugins/mouse/gsd-mouse-manager.c	2008-08-04 15:25:52.000000000 +0100
+++ b/plugins/mouse/gsd-mouse-manager.c	2009-01-30 11:40:07.000000000 +0000
@@ -39,7 +39,7 @@
 #include <gdk/gdkkeysyms.h>
 #include <X11/keysym.h>
 
-#ifdef HAVE_XINPUT
+#ifdef HAVE_X11_EXTENSIONS_XINPUT_H
 #include <X11/extensions/XInput.h>
 #endif
 #include <gconf/gconf.h>
@@ -55,11 +55,14 @@
 {
         guint notify;
         guint notify_a11y;
+
+        gboolean mousetweaks_daemon_running;
 };
 
 static void     gsd_mouse_manager_class_init  (GsdMouseManagerClass *klass);
 static void     gsd_mouse_manager_init        (GsdMouseManager      *mouse_manager);
 static void     gsd_mouse_manager_finalize    (GObject             *object);
+static void     set_mouse_settings            (GsdMouseManager      *manager);
 
 G_DEFINE_TYPE (GsdMouseManager, gsd_mouse_manager, G_TYPE_OBJECT)
 
@@ -152,7 +155,7 @@
 }
 
 
-#ifdef HAVE_XINPUT
+#ifdef HAVE_X11_EXTENSIONS_XINPUT_H
 static gboolean
 supports_xinput_devices (void)
 {
@@ -223,7 +226,7 @@
         }
 }
 
-#ifdef HAVE_XINPUT
+#ifdef HAVE_X11_EXTENSIONS_XINPUT_H
 static gboolean
 xinput_device_has_buttons (XDeviceInfo *device_info)
 {
@@ -302,6 +305,49 @@
         if (device_info != NULL)
                 XFreeDeviceList (device_info);
 }
+
+static GdkFilterReturn
+devicepresence_filter (GdkXEvent *xevent,
+                       GdkEvent  *event,
+                       gpointer   data)
+{
+        XEvent *xev = (XEvent *) xevent;
+        XEventClass class_presence;
+        int xi_presence;
+
+        DevicePresence (gdk_x11_get_default_xdisplay (), xi_presence, class_presence);
+
+        if (xev->type == xi_presence)
+        {
+            XDevicePresenceNotifyEvent *dpn = (XDevicePresenceNotifyEvent *) xev;
+            if (dpn->devchange == DeviceEnabled)
+                set_mouse_settings ((GsdMouseManager *) data);
+        }
+        return GDK_FILTER_CONTINUE;
+}
+
+static void
+set_devicepresence_handler (GsdMouseManager *manager)
+{
+        Display *display;
+        XEventClass class_presence;
+        int xi_presence;
+
+        if (!supports_xinput_devices ())
+                return;
+
+        display = gdk_x11_get_default_xdisplay ();
+
+        gdk_error_trap_push ();
+        DevicePresence (display, xi_presence, class_presence);
+        XSelectExtensionEvent (display,
+                               RootWindow (display, DefaultScreen (display)),
+                               &class_presence, 1);
+
+        gdk_flush ();
+        if (!gdk_error_trap_pop ())
+                gdk_window_add_filter (NULL, devicepresence_filter, manager);
+}
 #endif
 
 static void
@@ -312,7 +358,7 @@
         gsize buttons_capacity = 16;
         gint n_buttons, i;
 
-#ifdef HAVE_XINPUT
+#ifdef HAVE_X11_EXTENSIONS_XINPUT_H
         if (supports_xinput_devices ()) {
                 set_xinput_devices_left_handed (left_handed);
         }
@@ -544,9 +590,17 @@
 {
         GError *error = NULL;
         gchar *comm;
+        gboolean run_daemon = dwell_enable || delay_enable;
+
+        if (run_daemon || manager->priv->mousetweaks_daemon_running)
+                comm = g_strdup_printf ("mousetweaks %s",
+                                        run_daemon ? "" : "-s");
+        else
+                return;
+
+        if (run_daemon)
+                manager->priv->mousetweaks_daemon_running = TRUE;
 
-        comm = g_strdup_printf ("mousetweaks %s",
-                                (dwell_enable || delay_enable) ? "" : "-s");
 
         if (! g_spawn_command_line_async (comm, &error)) {
                 if (error->code == G_SPAWN_ERROR_NOENT &&
@@ -585,6 +639,18 @@
 }
 
 static void
+set_mouse_settings (GsdMouseManager *manager)
+{
+        GConfClient *client = gconf_client_get_default ();
+
+        set_left_handed (manager, gconf_client_get_bool (client, KEY_LEFT_HANDED, NULL));
+        set_motion_acceleration (manager, gconf_client_get_float (client, KEY_MOTION_ACCELERATION , NULL));
+        set_motion_threshold (manager, gconf_client_get_int (client, KEY_MOTION_THRESHOLD, NULL));
+
+        g_object_unref (client);
+}
+
+static void
 mouse_callback (GConfClient        *client,
                 guint               cnxn_id,
                 GConfEntry         *entry,
@@ -637,13 +703,11 @@
         manager->priv = GSD_MOUSE_MANAGER_GET_PRIVATE (manager);
 }
 
-gboolean
-gsd_mouse_manager_start (GsdMouseManager *manager,
-                         GError         **error)
+static gboolean
+gsd_mouse_manager_idle_cb (GsdMouseManager *manager)
 {
         GConfClient *client;
 
-        g_debug ("Starting mouse manager");
         gnome_settings_profile_start (NULL);
 
         client = gconf_client_get_default ();
@@ -659,9 +723,10 @@
                                           GCONF_MOUSE_A11Y_DIR,
                                           (GConfClientNotifyFunc) mouse_callback);
 
-        set_left_handed (manager, gconf_client_get_bool (client, KEY_LEFT_HANDED, NULL));
-        set_motion_acceleration (manager, gconf_client_get_float (client, KEY_MOTION_ACCELERATION , NULL));
-        set_motion_threshold (manager, gconf_client_get_int (client, KEY_MOTION_THRESHOLD, NULL));
+#ifdef HAVE_X11_EXTENSIONS_XINPUT_H
+        set_devicepresence_handler (manager);
+#endif
+        set_mouse_settings (manager);
         set_locate_pointer (manager, gconf_client_get_bool (client, KEY_LOCATE_POINTER, NULL));
         set_mousetweaks_daemon (manager,
                                 gconf_client_get_bool (client, KEY_DWELL_ENABLE, NULL),
@@ -671,6 +736,19 @@
 
         gnome_settings_profile_end (NULL);
 
+        return FALSE;
+}
+
+gboolean
+gsd_mouse_manager_start (GsdMouseManager *manager,
+                         GError         **error)
+{
+        gnome_settings_profile_start (NULL);
+
+        g_idle_add ((GSourceFunc) gsd_mouse_manager_idle_cb, manager);
+
+        gnome_settings_profile_end (NULL);
+
         return TRUE;
 }
 
@@ -699,6 +777,10 @@
         g_object_unref (client);
 
         set_locate_pointer (manager, FALSE);
+
+#ifdef HAVE_X11_EXTENSIONS_XINPUT_H
+        gdk_window_remove_filter (NULL, devicepresence_filter, manager);
+#endif
 }
 
 static void
openSUSE Build Service is sponsored by