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