diff --git a/capplets/mouse/ChangeLog b/capplets/mouse/ChangeLog index a9aabd1d0..d7eebd870 100644 --- a/capplets/mouse/ChangeLog +++ b/capplets/mouse/ChangeLog @@ -1,3 +1,19 @@ +2001-12-19 Bradford Hovinen + + * mouse-properties-capplet.c (double_click_from_gconf): Divide by + 1000.0, use floats + (double_click_to_gconf): Implement + (drawing_area_button_press_event): Don't call + double_click_from_gconf + (drawing_area_button_press_event): Use response of + gconf_change_set_check_value to determine if value is in changeset + +2001-12-18 Bradford Hovinen + + * mouse-properties-capplet.c (double_click_from_gconf): Single + closed-form formula here + Code reorganization; many changes + 2001-10-18 Bradford Hovinen * mouse-properties-capplet.c (apply_settings): Only swap buttons 1 diff --git a/capplets/mouse/gnome-mouse-properties.c b/capplets/mouse/gnome-mouse-properties.c index 4b3057b9f..a25452410 100644 --- a/capplets/mouse/gnome-mouse-properties.c +++ b/capplets/mouse/gnome-mouse-properties.c @@ -1,8 +1,40 @@ +/* -*- mode: c; style: linux -*- */ + +/* mouse-properties-capplet.c + * Copyright (C) 2001 Red Hat, Inc. + * Copyright (C) 2001 Ximian, Inc. + * + * Written by: Jonathon Blandford , + * Bradford Hovinen , + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + * 02111-1307, USA. + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + #include #include #include #include +#include "capplet-util.h" +#include "gconf-property-editor.h" + enum { DOUBLE_CLICK_TEST_OFF, @@ -10,111 +42,119 @@ enum DOUBLE_CLICK_TEST_ON, }; -GladeXML *xml; +/* We use this in at least half a dozen places, so it makes sense just to + * define the macro */ + +#define DOUBLE_CLICK_KEY "/desktop/gnome/peripherals/mouse/double_click" + +/* Write-once data; global for convenience. Set only by load_pixbufs */ + GdkPixbuf *left_handed_pixbuf; GdkPixbuf *right_handed_pixbuf; GdkPixbuf *double_click_on_pixbuf; GdkPixbuf *double_click_maybe_pixbuf; GdkPixbuf *double_click_off_pixbuf; -GConfClient *client; + +/* State in testing the double-click speed. Global for a great deal of + * convenience + */ gint double_click_state = DOUBLE_CLICK_TEST_OFF; -guint32 double_click_timestamp = 0; -guint test_maybe_timeout_id = 0; -guint test_on_timeout_id = 0; - -#define LEFT_HANDED_KEY "/desktop/gnome/peripherals/mouse/left_handed" -#define DOUBLE_CLICK_KEY "/desktop/gnome/peripherals/mouse/double_click" -#define MOTION_ACCELERATION_KEY "/desktop/gnome/peripherals/mouse/motion_acceleration" -#define MOTION_THRESHOLD_KEY "/desktop/gnome/peripherals/mouse/motion_threshold" -#define DRAG_THRESHOLD_KEY "/desktop/gnome/peripherals/mouse/drag_threshold" - - /* normalilzation routines */ /* All of our scales but double_click are on the range 1->10 as a result, we * have a few routines to convert from whatever the gconf key is to our range. */ -static gint -double_click_from_gconf (gint double_click) +static gfloat +double_click_from_gconf (gfloat double_click) { - /* watch me be lazy */ - if (double_click < 150) - return 100; - else if (double_click < 250) - return 200; - else if (double_click < 350) - return 300; - else if (double_click < 450) - return 400; - else if (double_click < 550) - return 500; - else if (double_click < 650) - return 600; - else if (double_click < 750) - return 700; - else if (double_click < 850) - return 800; - else if (double_click < 950) - return 900; - else - return 1000; + return CLAMP (floor ((double_click + 50) / 100) * 100, 0, 1000) / 1000.0; +} + +static gfloat +double_click_to_gconf (gfloat double_click) +{ + return double_click * 1000.0; } static gfloat motion_acceleration_from_gconf (gfloat motion_acceleration) { motion_acceleration = CLAMP (motion_acceleration, 0.2, 6.0); - if (motion_acceleration >=1) + + if (motion_acceleration >= 1) return motion_acceleration + 4; - return motion_acceleration * 5; + else + return motion_acceleration * 5; } static gfloat motion_acceleration_to_gconf (gfloat motion_acceleration) { motion_acceleration = CLAMP (motion_acceleration, 1.0, 10.0); + if (motion_acceleration < 5) return motion_acceleration / 5.0; - return motion_acceleration - 4; + else + return motion_acceleration - 4; } + static gfloat threshold_from_gconf (gfloat drag_threshold) { return CLAMP (drag_threshold, 1, 10); } +/* Retrieve legacy settings */ + +static void +get_legacy_settings (void) +{ +} /* Double Click handling */ -static gboolean -test_maybe_timeout (gpointer data) +struct test_data_t { + gint *timeout_id; GtkWidget *darea; - darea = glade_xml_get_widget (xml, "double_click_darea"); - double_click_state = DOUBLE_CLICK_TEST_OFF; - gtk_widget_queue_draw (darea); +}; - *((gint *)data) = 0; +/* Timeout for the double click test */ + +static gboolean +test_maybe_timeout (struct test_data_t *data) +{ + double_click_state = DOUBLE_CLICK_TEST_OFF; + gtk_widget_queue_draw (data->darea); + + *data->timeout_id = 0; return FALSE; } +/* Callback issued when the user clicks the double click testing area. */ + static gint drawing_area_button_press_event (GtkWidget *widget, GdkEventButton *event, - gpointer data) + GConfChangeSet *changeset) { - GtkWidget *scale; - GtkWidget *darea; - gint double_click_time; + gint double_click_time; + GConfValue *value; + + static struct test_data_t data; + static guint test_on_timeout_id = 0; + static guint test_maybe_timeout_id = 0; + static guint32 double_click_timestamp = 0; if (event->type != GDK_BUTTON_PRESS) return FALSE; - scale = glade_xml_get_widget (xml, "delay_scale"); - double_click_time = 1000 * gtk_range_get_value (GTK_RANGE (scale)); - darea = glade_xml_get_widget (xml, "double_click_darea"); + if (!gconf_change_set_check_value (changeset, DOUBLE_CLICK_KEY, &value)) + double_click_time = gconf_client_get_int (gconf_client_get_default (), DOUBLE_CLICK_KEY, NULL); + else + double_click_time = gconf_value_get_int (value); if (test_maybe_timeout_id != 0) gtk_timeout_remove (test_maybe_timeout_id); @@ -124,12 +164,16 @@ drawing_area_button_press_event (GtkWidget *widget, switch (double_click_state) { case DOUBLE_CLICK_TEST_OFF: double_click_state = DOUBLE_CLICK_TEST_MAYBE; - test_maybe_timeout_id = gtk_timeout_add (double_click_time, test_maybe_timeout, &test_maybe_timeout_id); + data.darea = widget; + data.timeout_id = &test_maybe_timeout_id; + test_maybe_timeout_id = gtk_timeout_add (double_click_time, (GtkFunction) test_maybe_timeout, &data); break; case DOUBLE_CLICK_TEST_MAYBE: if (event->time - double_click_timestamp < double_click_time) { double_click_state = DOUBLE_CLICK_TEST_ON; - test_on_timeout_id = gtk_timeout_add (2500, test_maybe_timeout, &test_on_timeout_id); + data.darea = widget; + data.timeout_id = &test_on_timeout_id; + test_on_timeout_id = gtk_timeout_add (2500, (GtkFunction) test_maybe_timeout, &data); } break; case DOUBLE_CLICK_TEST_ON: @@ -138,27 +182,29 @@ drawing_area_button_press_event (GtkWidget *widget, } double_click_timestamp = event->time; - gtk_widget_queue_draw (darea); + gtk_widget_queue_draw (widget); return TRUE; } +/* Callback to display the appropriate image on the double click testing area. */ + static gint drawing_area_expose_event (GtkWidget *widget, GdkEventExpose *event, - gpointer data) + GConfChangeSet *changeset) { - static gboolean first_time = 1; - GdkPixbuf *pixbuf; + static gboolean first_time = TRUE; + + GdkPixbuf *pixbuf; if (first_time) { gdk_window_set_events (widget->window, gdk_window_get_events (widget->window) | GDK_BUTTON_PRESS_MASK); - g_signal_connect (widget, "button_press_event", (GCallback) drawing_area_button_press_event, NULL); - first_time = 0; + g_signal_connect (G_OBJECT (widget), "button_press_event", (GCallback) drawing_area_button_press_event, changeset); + first_time = FALSE; } - gdk_draw_rectangle (widget->window, - widget->style->white_gc, + gdk_draw_rectangle (widget->window, widget->style->white_gc, TRUE, 0, 0, widget->allocation.width, widget->allocation.height); @@ -175,30 +221,24 @@ drawing_area_expose_event (GtkWidget *widget, break; } - gdk_pixbuf_render_to_drawable_alpha (pixbuf, - widget->window, - 0, 0, - (widget->allocation.width - gdk_pixbuf_get_width (pixbuf))/2, - (widget->allocation.height - gdk_pixbuf_get_height (pixbuf))/2, - -1, -1, - GDK_PIXBUF_ALPHA_FULL, - 0, - GDK_RGB_DITHER_NORMAL, - 0, 0); + gdk_pixbuf_render_to_drawable_alpha + (pixbuf, widget->window, + 0, 0, + (widget->allocation.width - gdk_pixbuf_get_width (pixbuf)) / 2, + (widget->allocation.height - gdk_pixbuf_get_height (pixbuf)) / 2, + -1, -1, GDK_PIXBUF_ALPHA_FULL, 0, GDK_RGB_DITHER_NORMAL, 0, 0); return TRUE; } - - -/* capplet->gconf settings */ +/* Callback issued when the user switches between left- and right-handed button + * mappings. Updates the appropriate image on the dialog. + */ static void -left_handed_toggle_callback (GtkWidget *toggle, gpointer data) +left_handed_toggle_cb (GConfPropertyEditor *peditor, const gchar *key, const GConfValue *value, GtkWidget *image) { - GtkWidget *image; - image = glade_xml_get_widget (xml, "orientation_image"); - if (GTK_TOGGLE_BUTTON (toggle)->active) + if (gconf_value_get_bool (value)) g_object_set (G_OBJECT (image), "pixbuf", left_handed_pixbuf, NULL); @@ -206,238 +246,170 @@ left_handed_toggle_callback (GtkWidget *toggle, gpointer data) g_object_set (G_OBJECT (image), "pixbuf", right_handed_pixbuf, NULL); - gconf_client_set_bool (client, LEFT_HANDED_KEY, - GTK_TOGGLE_BUTTON (toggle)->active, - NULL); } +/* Load the pixbufs we are going to use */ + static void -double_click_callback (GtkAdjustment *adjustment, gpointer data) +load_pixbufs (void) { - gint double_click; + static gboolean called = FALSE; - double_click = gtk_adjustment_get_value (adjustment) * 1000; - /* we normalize this to avoid loops */ - if (double_click != double_click_from_gconf (double_click)) { - gtk_adjustment_set_value (adjustment, (double_click_from_gconf (double_click))/1000.0); - return; - } + if (called) return; - gconf_client_set_int (client, DOUBLE_CLICK_KEY, - double_click, - NULL); + left_handed_pixbuf = gdk_pixbuf_new_from_file ("mouse-left.png", NULL); + right_handed_pixbuf = gdk_pixbuf_new_from_file ("mouse-right.png", NULL); + double_click_on_pixbuf = gdk_pixbuf_new_from_file ("double-click-on.png", NULL); + double_click_maybe_pixbuf = gdk_pixbuf_new_from_file ("double-click-maybe.png", NULL); + double_click_off_pixbuf = gdk_pixbuf_new_from_file ("double-click-off.png", NULL); + + /* Let's be paranoid here. I like this feature :-) */ + g_object_add_weak_pointer (G_OBJECT (left_handed_pixbuf), (gpointer *) &left_handed_pixbuf); + g_object_add_weak_pointer (G_OBJECT (right_handed_pixbuf), (gpointer *) &right_handed_pixbuf); + g_object_add_weak_pointer (G_OBJECT (double_click_on_pixbuf), (gpointer *) &double_click_on_pixbuf); + g_object_add_weak_pointer (G_OBJECT (double_click_maybe_pixbuf), (gpointer *) &double_click_maybe_pixbuf); + g_object_add_weak_pointer (G_OBJECT (double_click_off_pixbuf), (gpointer *) &double_click_off_pixbuf); + + called = TRUE; } -static void -threshold_callback (GtkAdjustment *adjustment, gpointer key) -{ - gint threshold; - - threshold = (gint) rint (gtk_adjustment_get_value (adjustment)); - - gconf_client_set_int (client, (char *) key, - threshold, - NULL); -} +/* Set up the property editors in the dialog. */ static void -acceleration_callback (GtkAdjustment *adjustment, gpointer data) +setup_dialog (GladeXML *dialog, GConfChangeSet *changeset) { - gfloat acceleration; + GtkWidget *widget; + GObject *peditor; + GConfValue *value; - acceleration = gtk_adjustment_get_value (adjustment); - gconf_client_set_float (client, MOTION_ACCELERATION_KEY, - motion_acceleration_to_gconf (acceleration), - NULL); -} - -/* gconf->capplet */ -static void -gconf_changed_callback (GConfClient *client, - guint cnxn_id, - GConfEntry *entry, - gpointer user_data) -{ - GtkWidget *widget; - const gchar *key = gconf_entry_get_key (entry); - - if (! strcmp (key, LEFT_HANDED_KEY)) { - gboolean left_handed; - - left_handed = gconf_value_get_bool (gconf_entry_get_value (entry)); - widget = glade_xml_get_widget (xml, "left_handed_toggle"); - if (left_handed != GTK_TOGGLE_BUTTON (widget)->active) - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), left_handed); - } else if (! strcmp (key, DOUBLE_CLICK_KEY)) { - int double_click; - - double_click = gconf_value_get_int (gconf_entry_get_value (entry)); - double_click = double_click_from_gconf (double_click); - widget = glade_xml_get_widget (xml, "delay_scale"); - if (double_click != (gint) 1000*gtk_range_get_value (GTK_RANGE (widget))) - gtk_range_set_value (GTK_RANGE (widget), (gfloat)double_click/1000.0); - } else if (! strcmp (key, MOTION_ACCELERATION_KEY)) { - gfloat acceleration; - - acceleration = gconf_value_get_float (gconf_entry_get_value (entry)); - acceleration = motion_acceleration_from_gconf (acceleration); - widget = glade_xml_get_widget (xml, "accel_scale"); - if (ABS (acceleration - gtk_range_get_value (GTK_RANGE (widget))) > 0.001) - gtk_range_set_value (GTK_RANGE (widget), acceleration); - } else if (! strcmp (key, MOTION_THRESHOLD_KEY)) { - int threshold; - - threshold = gconf_value_get_int (gconf_entry_get_value (entry)); - threshold = threshold_from_gconf (threshold); - widget = glade_xml_get_widget (xml, "sensitivity_scale"); - if (ABS (threshold - gtk_range_get_value (GTK_RANGE (widget))) > 0.001) - gtk_range_set_value (GTK_RANGE (widget), (gfloat)threshold); - } else if (! strcmp (key, DRAG_THRESHOLD_KEY)) { - int threshold; - - threshold = gconf_value_get_int (gconf_entry_get_value (entry)); - threshold = threshold_from_gconf (threshold); - widget = glade_xml_get_widget (xml, "drag_threshold_scale"); - if (ABS (threshold - gtk_range_get_value (GTK_RANGE (widget))) > 0.001) - gtk_range_set_value (GTK_RANGE (widget), (gfloat)threshold); - } -} - -static void -setup_dialog (void) -{ - GtkSizeGroup *size_group; - GtkWidget *widget; - int double_click; - int threshold; - gfloat acceleration; - - client = gconf_client_get_default (); - gconf_client_add_dir (client, "/desktop/gnome/peripherals/mouse", GCONF_CLIENT_PRELOAD_ONELEVEL, NULL); - gconf_client_notify_add (client, "/desktop/gnome/peripherals/mouse", - gconf_changed_callback, - NULL, NULL, NULL); + int double_click; + int threshold; + gfloat acceleration; /* Buttons page */ /* Left-handed toggle */ - left_handed_pixbuf = gdk_pixbuf_new_from_file ("mouse-left.png", NULL); - right_handed_pixbuf = gdk_pixbuf_new_from_file ("mouse-right.png", NULL); - widget = glade_xml_get_widget (xml, "left_handed_toggle"); - if (gconf_client_get_bool (client, LEFT_HANDED_KEY, NULL)) - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), TRUE); - else - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), FALSE); - g_signal_connect (widget, "toggled", (GCallback) left_handed_toggle_callback, NULL); + peditor = gconf_peditor_new_boolean + (changeset, "/desktop/gnome/peripherals/mouse/left_handed", WID ("left_handed_toggle")); + g_signal_connect (peditor, "value-changed", (GCallback) left_handed_toggle_cb, WID ("orientation_image")); - widget = glade_xml_get_widget (xml, "orientation_image"); - if (gconf_client_get_bool (client, LEFT_HANDED_KEY, NULL)) - g_object_set (G_OBJECT (widget), - "pixbuf", left_handed_pixbuf, - NULL); - else - g_object_set (G_OBJECT (widget), - "pixbuf", right_handed_pixbuf, - NULL); + /* Make sure the image gets initialized correctly */ + value = gconf_client_get (gconf_client_get_default (), "/desktop/gnome/peripherals/mouse/left_handed", NULL); + left_handed_toggle_cb (GCONF_PROPERTY_EDITOR (peditor), NULL, value, WID ("orientation_image")); + gconf_value_free (value); /* Double-click time */ - double_click_on_pixbuf = gdk_pixbuf_new_from_file ("double-click-on.png", NULL); - double_click_maybe_pixbuf = gdk_pixbuf_new_from_file ("double-click-maybe.png", NULL); - double_click_off_pixbuf = gdk_pixbuf_new_from_file ("double-click-off.png", NULL); - widget = glade_xml_get_widget (xml, "double_click_darea"); - g_signal_connect (widget, "expose_event", (GCallback) drawing_area_expose_event, NULL); + g_signal_connect (WID ("double_click_darea"), "expose_event", (GCallback) drawing_area_expose_event, changeset); - double_click = gconf_client_get_int (client, DOUBLE_CLICK_KEY, NULL); - double_click = double_click_from_gconf (double_click); - widget = glade_xml_get_widget (xml, "delay_scale"); - gtk_range_set_value (GTK_RANGE (widget), (gfloat)double_click/1000.0); - g_signal_connect (G_OBJECT (gtk_range_get_adjustment (GTK_RANGE (widget))), - "value_changed", - (GCallback) double_click_callback, - NULL); + gconf_peditor_new_int_range + (changeset, DOUBLE_CLICK_KEY, WID ("delay_scale"), + double_click_from_gconf, double_click_to_gconf); + gconf_peditor_new_float_range + (changeset, "/desktop/gnome/peripherals/mouse/motion_acceleration", WID ("accel_scale"), + motion_acceleration_from_gconf, motion_acceleration_to_gconf); + gconf_peditor_new_float_range + (changeset, "/desktop/gnome/peripherals/mouse/motion_threshold", + WID ("sensitivity_scale"), NULL, NULL); + gconf_peditor_new_int_range + (changeset, "/desktop/gnome/peripherals/mouse/drag_threshold", WID ("drag_threshold_scale"), + threshold_from_gconf, NULL); +} - /* Cursors page */ - widget = glade_xml_get_widget (xml, "main_notebook"); +/* Construct the dialog */ + +static GladeXML * +create_dialog (void) +{ + GtkWidget *widget; + GladeXML *dialog; + GtkSizeGroup *size_group; + + dialog = glade_xml_new (GNOMECC_GLADE_DIR "/mouse-properties.glade", "prefs_widget", NULL); + widget = glade_xml_get_widget (dialog, "prefs_widget"); + + size_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL); + gtk_size_group_add_widget (size_group, WID ("acceleration_label")); + gtk_size_group_add_widget (size_group, WID ("sensitivity_label")); + gtk_size_group_add_widget (size_group, WID ("threshold_label")); + + size_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL); + gtk_size_group_add_widget (size_group, WID ("high_label")); + gtk_size_group_add_widget (size_group, WID ("fast_label")); + gtk_size_group_add_widget (size_group, WID ("large_label")); + + size_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL); + gtk_size_group_add_widget (size_group, WID ("low_label")); + gtk_size_group_add_widget (size_group, WID ("slow_label")); + gtk_size_group_add_widget (size_group, WID ("small_label")); + + /* Remove cursors page */ + widget = glade_xml_get_widget (dialog, "main_notebook"); gtk_notebook_remove_page (GTK_NOTEBOOK (widget), 1); - /* Motion page */ - size_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL); - gtk_size_group_add_widget (size_group, - glade_xml_get_widget (xml, "acceleration_label")); - gtk_size_group_add_widget (size_group, - glade_xml_get_widget (xml, "sensitivity_label")); - gtk_size_group_add_widget (size_group, - glade_xml_get_widget (xml, "threshold_label")); + g_object_weak_ref (G_OBJECT (widget), (GWeakNotify) g_object_unref, dialog); - size_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL); - gtk_size_group_add_widget (size_group, - glade_xml_get_widget (xml, "high_label")); - gtk_size_group_add_widget (size_group, - glade_xml_get_widget (xml, "fast_label")); - gtk_size_group_add_widget (size_group, - glade_xml_get_widget (xml, "large_label")); + return dialog; +} - size_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL); - gtk_size_group_add_widget (size_group, - glade_xml_get_widget (xml, "low_label")); - gtk_size_group_add_widget (size_group, - glade_xml_get_widget (xml, "slow_label")); - gtk_size_group_add_widget (size_group, - glade_xml_get_widget (xml, "small_label")); +/* Callback issued when a button is clicked on the dialog */ - widget = glade_xml_get_widget (xml, "accel_scale"); - acceleration = gconf_client_get_float (client, MOTION_ACCELERATION_KEY, NULL); - acceleration = motion_acceleration_from_gconf (acceleration); - gtk_range_set_value (GTK_RANGE (widget), acceleration); - g_signal_connect (G_OBJECT (gtk_range_get_adjustment (GTK_RANGE (widget))), - "value_changed", - (GCallback) acceleration_callback, - NULL); - - widget = glade_xml_get_widget (xml, "sensitivity_scale"); - threshold = gconf_client_get_int (client, MOTION_THRESHOLD_KEY, NULL); - threshold = threshold_from_gconf (threshold); - gtk_range_set_value (GTK_RANGE (widget), threshold); - g_signal_connect (G_OBJECT (gtk_range_get_adjustment (GTK_RANGE (widget))), - "value_changed", - (GCallback) threshold_callback, - MOTION_THRESHOLD_KEY); - - widget = glade_xml_get_widget (xml, "drag_threshold_scale"); - threshold = gconf_client_get_int (client, DRAG_THRESHOLD_KEY, NULL); - threshold = threshold_from_gconf (threshold); - gtk_range_set_value (GTK_RANGE (widget), threshold); - g_signal_connect (G_OBJECT (gtk_range_get_adjustment (GTK_RANGE (widget))), - "value_changed", - (GCallback) threshold_callback, - DRAG_THRESHOLD_KEY); - - /* main dialog */ - widget = glade_xml_get_widget (xml, "mouse_properties_dialog"); - g_signal_connect (G_OBJECT (widget), - "destroy", - gtk_main_quit, NULL); - widget = glade_xml_get_widget (xml, "close_button"); - g_signal_connect (G_OBJECT (widget), - "clicked", - gtk_main_quit, NULL); +static void +dialog_button_clicked_cb (GnomeDialog *dialog, gint button_number, GConfChangeSet *changeset) +{ + if (button_number == 0) + gconf_client_commit_change_set (gconf_client_get_default (), changeset, TRUE, NULL); + else if (button_number == 1) + gnome_dialog_close (dialog); } int -main (int argc, char *argv[]) +main (int argc, char **argv) { - gnome_program_init ("mouse-properties", - "0.1", - gnome_gtk_module_info_get (), - argc, argv, + GConfClient *client; + GConfChangeSet *changeset; + GladeXML *dialog; + GtkWidget *dialog_win; + + static gboolean apply_only; + static gboolean get_legacy; + static struct poptOption cap_options[] = { + { "apply", '\0', POPT_ARG_NONE, &apply_only, 0, + N_("Just apply settings and quit (compatibility only; now handled by daemon)"), NULL }, + { "init-session-settings", '\0', POPT_ARG_NONE, &apply_only, 0, + N_("Just apply settings and quit (compatibility only; now handled by daemon)"), NULL }, + { "get-legacy", '\0', POPT_ARG_NONE, &get_legacy, 0, + N_("Retrieve and store legacy settings"), NULL }, + { NULL, '\0', 0, NULL, 0, NULL, NULL } + }; + + bindtextdomain (PACKAGE, GNOMELOCALEDIR); + bind_textdomain_codeset (PACKAGE, "UTF-8"); + textdomain (PACKAGE); + + gnome_program_init (argv[0], VERSION, LIBGNOMEUI_MODULE, argc, argv, + GNOME_PARAM_POPT_TABLE, cap_options, NULL); - xml = glade_xml_new ("gnome-mouse-properties.glade", NULL, NULL); - setup_dialog (); - gtk_widget_show_all (glade_xml_get_widget (xml, "mouse_properties_dialog")); + client = gconf_client_get_default (); + gconf_client_add_dir (client, "/desktop/gnome/peripherals/mouse", GCONF_CLIENT_PRELOAD_ONELEVEL, NULL); - gtk_main (); + if (get_legacy) { + get_legacy_settings (); + } else { + changeset = gconf_change_set_new (); + dialog = create_dialog (); + load_pixbufs (); + setup_dialog (dialog, changeset); + + dialog_win = gnome_dialog_new (_("Mouse properties"), GTK_STOCK_APPLY, GTK_STOCK_CLOSE, NULL); + g_signal_connect (G_OBJECT (dialog_win), "clicked", (GCallback) dialog_button_clicked_cb, changeset); + g_object_weak_ref (G_OBJECT (dialog_win), (GWeakNotify) gtk_main_quit, NULL); + gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (dialog_win)->vbox), WID ("prefs_widget"), TRUE, TRUE, GNOME_PAD_SMALL); + gtk_widget_show_all (dialog_win); + + gtk_main (); + gconf_change_set_unref (changeset); + } - g_object_unref (G_OBJECT (client)); return 0; } diff --git a/capplets/mouse/mouse-properties-capplet.c b/capplets/mouse/mouse-properties-capplet.c index 4b3057b9f..a25452410 100644 --- a/capplets/mouse/mouse-properties-capplet.c +++ b/capplets/mouse/mouse-properties-capplet.c @@ -1,8 +1,40 @@ +/* -*- mode: c; style: linux -*- */ + +/* mouse-properties-capplet.c + * Copyright (C) 2001 Red Hat, Inc. + * Copyright (C) 2001 Ximian, Inc. + * + * Written by: Jonathon Blandford , + * Bradford Hovinen , + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + * 02111-1307, USA. + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + #include #include #include #include +#include "capplet-util.h" +#include "gconf-property-editor.h" + enum { DOUBLE_CLICK_TEST_OFF, @@ -10,111 +42,119 @@ enum DOUBLE_CLICK_TEST_ON, }; -GladeXML *xml; +/* We use this in at least half a dozen places, so it makes sense just to + * define the macro */ + +#define DOUBLE_CLICK_KEY "/desktop/gnome/peripherals/mouse/double_click" + +/* Write-once data; global for convenience. Set only by load_pixbufs */ + GdkPixbuf *left_handed_pixbuf; GdkPixbuf *right_handed_pixbuf; GdkPixbuf *double_click_on_pixbuf; GdkPixbuf *double_click_maybe_pixbuf; GdkPixbuf *double_click_off_pixbuf; -GConfClient *client; + +/* State in testing the double-click speed. Global for a great deal of + * convenience + */ gint double_click_state = DOUBLE_CLICK_TEST_OFF; -guint32 double_click_timestamp = 0; -guint test_maybe_timeout_id = 0; -guint test_on_timeout_id = 0; - -#define LEFT_HANDED_KEY "/desktop/gnome/peripherals/mouse/left_handed" -#define DOUBLE_CLICK_KEY "/desktop/gnome/peripherals/mouse/double_click" -#define MOTION_ACCELERATION_KEY "/desktop/gnome/peripherals/mouse/motion_acceleration" -#define MOTION_THRESHOLD_KEY "/desktop/gnome/peripherals/mouse/motion_threshold" -#define DRAG_THRESHOLD_KEY "/desktop/gnome/peripherals/mouse/drag_threshold" - - /* normalilzation routines */ /* All of our scales but double_click are on the range 1->10 as a result, we * have a few routines to convert from whatever the gconf key is to our range. */ -static gint -double_click_from_gconf (gint double_click) +static gfloat +double_click_from_gconf (gfloat double_click) { - /* watch me be lazy */ - if (double_click < 150) - return 100; - else if (double_click < 250) - return 200; - else if (double_click < 350) - return 300; - else if (double_click < 450) - return 400; - else if (double_click < 550) - return 500; - else if (double_click < 650) - return 600; - else if (double_click < 750) - return 700; - else if (double_click < 850) - return 800; - else if (double_click < 950) - return 900; - else - return 1000; + return CLAMP (floor ((double_click + 50) / 100) * 100, 0, 1000) / 1000.0; +} + +static gfloat +double_click_to_gconf (gfloat double_click) +{ + return double_click * 1000.0; } static gfloat motion_acceleration_from_gconf (gfloat motion_acceleration) { motion_acceleration = CLAMP (motion_acceleration, 0.2, 6.0); - if (motion_acceleration >=1) + + if (motion_acceleration >= 1) return motion_acceleration + 4; - return motion_acceleration * 5; + else + return motion_acceleration * 5; } static gfloat motion_acceleration_to_gconf (gfloat motion_acceleration) { motion_acceleration = CLAMP (motion_acceleration, 1.0, 10.0); + if (motion_acceleration < 5) return motion_acceleration / 5.0; - return motion_acceleration - 4; + else + return motion_acceleration - 4; } + static gfloat threshold_from_gconf (gfloat drag_threshold) { return CLAMP (drag_threshold, 1, 10); } +/* Retrieve legacy settings */ + +static void +get_legacy_settings (void) +{ +} /* Double Click handling */ -static gboolean -test_maybe_timeout (gpointer data) +struct test_data_t { + gint *timeout_id; GtkWidget *darea; - darea = glade_xml_get_widget (xml, "double_click_darea"); - double_click_state = DOUBLE_CLICK_TEST_OFF; - gtk_widget_queue_draw (darea); +}; - *((gint *)data) = 0; +/* Timeout for the double click test */ + +static gboolean +test_maybe_timeout (struct test_data_t *data) +{ + double_click_state = DOUBLE_CLICK_TEST_OFF; + gtk_widget_queue_draw (data->darea); + + *data->timeout_id = 0; return FALSE; } +/* Callback issued when the user clicks the double click testing area. */ + static gint drawing_area_button_press_event (GtkWidget *widget, GdkEventButton *event, - gpointer data) + GConfChangeSet *changeset) { - GtkWidget *scale; - GtkWidget *darea; - gint double_click_time; + gint double_click_time; + GConfValue *value; + + static struct test_data_t data; + static guint test_on_timeout_id = 0; + static guint test_maybe_timeout_id = 0; + static guint32 double_click_timestamp = 0; if (event->type != GDK_BUTTON_PRESS) return FALSE; - scale = glade_xml_get_widget (xml, "delay_scale"); - double_click_time = 1000 * gtk_range_get_value (GTK_RANGE (scale)); - darea = glade_xml_get_widget (xml, "double_click_darea"); + if (!gconf_change_set_check_value (changeset, DOUBLE_CLICK_KEY, &value)) + double_click_time = gconf_client_get_int (gconf_client_get_default (), DOUBLE_CLICK_KEY, NULL); + else + double_click_time = gconf_value_get_int (value); if (test_maybe_timeout_id != 0) gtk_timeout_remove (test_maybe_timeout_id); @@ -124,12 +164,16 @@ drawing_area_button_press_event (GtkWidget *widget, switch (double_click_state) { case DOUBLE_CLICK_TEST_OFF: double_click_state = DOUBLE_CLICK_TEST_MAYBE; - test_maybe_timeout_id = gtk_timeout_add (double_click_time, test_maybe_timeout, &test_maybe_timeout_id); + data.darea = widget; + data.timeout_id = &test_maybe_timeout_id; + test_maybe_timeout_id = gtk_timeout_add (double_click_time, (GtkFunction) test_maybe_timeout, &data); break; case DOUBLE_CLICK_TEST_MAYBE: if (event->time - double_click_timestamp < double_click_time) { double_click_state = DOUBLE_CLICK_TEST_ON; - test_on_timeout_id = gtk_timeout_add (2500, test_maybe_timeout, &test_on_timeout_id); + data.darea = widget; + data.timeout_id = &test_on_timeout_id; + test_on_timeout_id = gtk_timeout_add (2500, (GtkFunction) test_maybe_timeout, &data); } break; case DOUBLE_CLICK_TEST_ON: @@ -138,27 +182,29 @@ drawing_area_button_press_event (GtkWidget *widget, } double_click_timestamp = event->time; - gtk_widget_queue_draw (darea); + gtk_widget_queue_draw (widget); return TRUE; } +/* Callback to display the appropriate image on the double click testing area. */ + static gint drawing_area_expose_event (GtkWidget *widget, GdkEventExpose *event, - gpointer data) + GConfChangeSet *changeset) { - static gboolean first_time = 1; - GdkPixbuf *pixbuf; + static gboolean first_time = TRUE; + + GdkPixbuf *pixbuf; if (first_time) { gdk_window_set_events (widget->window, gdk_window_get_events (widget->window) | GDK_BUTTON_PRESS_MASK); - g_signal_connect (widget, "button_press_event", (GCallback) drawing_area_button_press_event, NULL); - first_time = 0; + g_signal_connect (G_OBJECT (widget), "button_press_event", (GCallback) drawing_area_button_press_event, changeset); + first_time = FALSE; } - gdk_draw_rectangle (widget->window, - widget->style->white_gc, + gdk_draw_rectangle (widget->window, widget->style->white_gc, TRUE, 0, 0, widget->allocation.width, widget->allocation.height); @@ -175,30 +221,24 @@ drawing_area_expose_event (GtkWidget *widget, break; } - gdk_pixbuf_render_to_drawable_alpha (pixbuf, - widget->window, - 0, 0, - (widget->allocation.width - gdk_pixbuf_get_width (pixbuf))/2, - (widget->allocation.height - gdk_pixbuf_get_height (pixbuf))/2, - -1, -1, - GDK_PIXBUF_ALPHA_FULL, - 0, - GDK_RGB_DITHER_NORMAL, - 0, 0); + gdk_pixbuf_render_to_drawable_alpha + (pixbuf, widget->window, + 0, 0, + (widget->allocation.width - gdk_pixbuf_get_width (pixbuf)) / 2, + (widget->allocation.height - gdk_pixbuf_get_height (pixbuf)) / 2, + -1, -1, GDK_PIXBUF_ALPHA_FULL, 0, GDK_RGB_DITHER_NORMAL, 0, 0); return TRUE; } - - -/* capplet->gconf settings */ +/* Callback issued when the user switches between left- and right-handed button + * mappings. Updates the appropriate image on the dialog. + */ static void -left_handed_toggle_callback (GtkWidget *toggle, gpointer data) +left_handed_toggle_cb (GConfPropertyEditor *peditor, const gchar *key, const GConfValue *value, GtkWidget *image) { - GtkWidget *image; - image = glade_xml_get_widget (xml, "orientation_image"); - if (GTK_TOGGLE_BUTTON (toggle)->active) + if (gconf_value_get_bool (value)) g_object_set (G_OBJECT (image), "pixbuf", left_handed_pixbuf, NULL); @@ -206,238 +246,170 @@ left_handed_toggle_callback (GtkWidget *toggle, gpointer data) g_object_set (G_OBJECT (image), "pixbuf", right_handed_pixbuf, NULL); - gconf_client_set_bool (client, LEFT_HANDED_KEY, - GTK_TOGGLE_BUTTON (toggle)->active, - NULL); } +/* Load the pixbufs we are going to use */ + static void -double_click_callback (GtkAdjustment *adjustment, gpointer data) +load_pixbufs (void) { - gint double_click; + static gboolean called = FALSE; - double_click = gtk_adjustment_get_value (adjustment) * 1000; - /* we normalize this to avoid loops */ - if (double_click != double_click_from_gconf (double_click)) { - gtk_adjustment_set_value (adjustment, (double_click_from_gconf (double_click))/1000.0); - return; - } + if (called) return; - gconf_client_set_int (client, DOUBLE_CLICK_KEY, - double_click, - NULL); + left_handed_pixbuf = gdk_pixbuf_new_from_file ("mouse-left.png", NULL); + right_handed_pixbuf = gdk_pixbuf_new_from_file ("mouse-right.png", NULL); + double_click_on_pixbuf = gdk_pixbuf_new_from_file ("double-click-on.png", NULL); + double_click_maybe_pixbuf = gdk_pixbuf_new_from_file ("double-click-maybe.png", NULL); + double_click_off_pixbuf = gdk_pixbuf_new_from_file ("double-click-off.png", NULL); + + /* Let's be paranoid here. I like this feature :-) */ + g_object_add_weak_pointer (G_OBJECT (left_handed_pixbuf), (gpointer *) &left_handed_pixbuf); + g_object_add_weak_pointer (G_OBJECT (right_handed_pixbuf), (gpointer *) &right_handed_pixbuf); + g_object_add_weak_pointer (G_OBJECT (double_click_on_pixbuf), (gpointer *) &double_click_on_pixbuf); + g_object_add_weak_pointer (G_OBJECT (double_click_maybe_pixbuf), (gpointer *) &double_click_maybe_pixbuf); + g_object_add_weak_pointer (G_OBJECT (double_click_off_pixbuf), (gpointer *) &double_click_off_pixbuf); + + called = TRUE; } -static void -threshold_callback (GtkAdjustment *adjustment, gpointer key) -{ - gint threshold; - - threshold = (gint) rint (gtk_adjustment_get_value (adjustment)); - - gconf_client_set_int (client, (char *) key, - threshold, - NULL); -} +/* Set up the property editors in the dialog. */ static void -acceleration_callback (GtkAdjustment *adjustment, gpointer data) +setup_dialog (GladeXML *dialog, GConfChangeSet *changeset) { - gfloat acceleration; + GtkWidget *widget; + GObject *peditor; + GConfValue *value; - acceleration = gtk_adjustment_get_value (adjustment); - gconf_client_set_float (client, MOTION_ACCELERATION_KEY, - motion_acceleration_to_gconf (acceleration), - NULL); -} - -/* gconf->capplet */ -static void -gconf_changed_callback (GConfClient *client, - guint cnxn_id, - GConfEntry *entry, - gpointer user_data) -{ - GtkWidget *widget; - const gchar *key = gconf_entry_get_key (entry); - - if (! strcmp (key, LEFT_HANDED_KEY)) { - gboolean left_handed; - - left_handed = gconf_value_get_bool (gconf_entry_get_value (entry)); - widget = glade_xml_get_widget (xml, "left_handed_toggle"); - if (left_handed != GTK_TOGGLE_BUTTON (widget)->active) - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), left_handed); - } else if (! strcmp (key, DOUBLE_CLICK_KEY)) { - int double_click; - - double_click = gconf_value_get_int (gconf_entry_get_value (entry)); - double_click = double_click_from_gconf (double_click); - widget = glade_xml_get_widget (xml, "delay_scale"); - if (double_click != (gint) 1000*gtk_range_get_value (GTK_RANGE (widget))) - gtk_range_set_value (GTK_RANGE (widget), (gfloat)double_click/1000.0); - } else if (! strcmp (key, MOTION_ACCELERATION_KEY)) { - gfloat acceleration; - - acceleration = gconf_value_get_float (gconf_entry_get_value (entry)); - acceleration = motion_acceleration_from_gconf (acceleration); - widget = glade_xml_get_widget (xml, "accel_scale"); - if (ABS (acceleration - gtk_range_get_value (GTK_RANGE (widget))) > 0.001) - gtk_range_set_value (GTK_RANGE (widget), acceleration); - } else if (! strcmp (key, MOTION_THRESHOLD_KEY)) { - int threshold; - - threshold = gconf_value_get_int (gconf_entry_get_value (entry)); - threshold = threshold_from_gconf (threshold); - widget = glade_xml_get_widget (xml, "sensitivity_scale"); - if (ABS (threshold - gtk_range_get_value (GTK_RANGE (widget))) > 0.001) - gtk_range_set_value (GTK_RANGE (widget), (gfloat)threshold); - } else if (! strcmp (key, DRAG_THRESHOLD_KEY)) { - int threshold; - - threshold = gconf_value_get_int (gconf_entry_get_value (entry)); - threshold = threshold_from_gconf (threshold); - widget = glade_xml_get_widget (xml, "drag_threshold_scale"); - if (ABS (threshold - gtk_range_get_value (GTK_RANGE (widget))) > 0.001) - gtk_range_set_value (GTK_RANGE (widget), (gfloat)threshold); - } -} - -static void -setup_dialog (void) -{ - GtkSizeGroup *size_group; - GtkWidget *widget; - int double_click; - int threshold; - gfloat acceleration; - - client = gconf_client_get_default (); - gconf_client_add_dir (client, "/desktop/gnome/peripherals/mouse", GCONF_CLIENT_PRELOAD_ONELEVEL, NULL); - gconf_client_notify_add (client, "/desktop/gnome/peripherals/mouse", - gconf_changed_callback, - NULL, NULL, NULL); + int double_click; + int threshold; + gfloat acceleration; /* Buttons page */ /* Left-handed toggle */ - left_handed_pixbuf = gdk_pixbuf_new_from_file ("mouse-left.png", NULL); - right_handed_pixbuf = gdk_pixbuf_new_from_file ("mouse-right.png", NULL); - widget = glade_xml_get_widget (xml, "left_handed_toggle"); - if (gconf_client_get_bool (client, LEFT_HANDED_KEY, NULL)) - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), TRUE); - else - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), FALSE); - g_signal_connect (widget, "toggled", (GCallback) left_handed_toggle_callback, NULL); + peditor = gconf_peditor_new_boolean + (changeset, "/desktop/gnome/peripherals/mouse/left_handed", WID ("left_handed_toggle")); + g_signal_connect (peditor, "value-changed", (GCallback) left_handed_toggle_cb, WID ("orientation_image")); - widget = glade_xml_get_widget (xml, "orientation_image"); - if (gconf_client_get_bool (client, LEFT_HANDED_KEY, NULL)) - g_object_set (G_OBJECT (widget), - "pixbuf", left_handed_pixbuf, - NULL); - else - g_object_set (G_OBJECT (widget), - "pixbuf", right_handed_pixbuf, - NULL); + /* Make sure the image gets initialized correctly */ + value = gconf_client_get (gconf_client_get_default (), "/desktop/gnome/peripherals/mouse/left_handed", NULL); + left_handed_toggle_cb (GCONF_PROPERTY_EDITOR (peditor), NULL, value, WID ("orientation_image")); + gconf_value_free (value); /* Double-click time */ - double_click_on_pixbuf = gdk_pixbuf_new_from_file ("double-click-on.png", NULL); - double_click_maybe_pixbuf = gdk_pixbuf_new_from_file ("double-click-maybe.png", NULL); - double_click_off_pixbuf = gdk_pixbuf_new_from_file ("double-click-off.png", NULL); - widget = glade_xml_get_widget (xml, "double_click_darea"); - g_signal_connect (widget, "expose_event", (GCallback) drawing_area_expose_event, NULL); + g_signal_connect (WID ("double_click_darea"), "expose_event", (GCallback) drawing_area_expose_event, changeset); - double_click = gconf_client_get_int (client, DOUBLE_CLICK_KEY, NULL); - double_click = double_click_from_gconf (double_click); - widget = glade_xml_get_widget (xml, "delay_scale"); - gtk_range_set_value (GTK_RANGE (widget), (gfloat)double_click/1000.0); - g_signal_connect (G_OBJECT (gtk_range_get_adjustment (GTK_RANGE (widget))), - "value_changed", - (GCallback) double_click_callback, - NULL); + gconf_peditor_new_int_range + (changeset, DOUBLE_CLICK_KEY, WID ("delay_scale"), + double_click_from_gconf, double_click_to_gconf); + gconf_peditor_new_float_range + (changeset, "/desktop/gnome/peripherals/mouse/motion_acceleration", WID ("accel_scale"), + motion_acceleration_from_gconf, motion_acceleration_to_gconf); + gconf_peditor_new_float_range + (changeset, "/desktop/gnome/peripherals/mouse/motion_threshold", + WID ("sensitivity_scale"), NULL, NULL); + gconf_peditor_new_int_range + (changeset, "/desktop/gnome/peripherals/mouse/drag_threshold", WID ("drag_threshold_scale"), + threshold_from_gconf, NULL); +} - /* Cursors page */ - widget = glade_xml_get_widget (xml, "main_notebook"); +/* Construct the dialog */ + +static GladeXML * +create_dialog (void) +{ + GtkWidget *widget; + GladeXML *dialog; + GtkSizeGroup *size_group; + + dialog = glade_xml_new (GNOMECC_GLADE_DIR "/mouse-properties.glade", "prefs_widget", NULL); + widget = glade_xml_get_widget (dialog, "prefs_widget"); + + size_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL); + gtk_size_group_add_widget (size_group, WID ("acceleration_label")); + gtk_size_group_add_widget (size_group, WID ("sensitivity_label")); + gtk_size_group_add_widget (size_group, WID ("threshold_label")); + + size_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL); + gtk_size_group_add_widget (size_group, WID ("high_label")); + gtk_size_group_add_widget (size_group, WID ("fast_label")); + gtk_size_group_add_widget (size_group, WID ("large_label")); + + size_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL); + gtk_size_group_add_widget (size_group, WID ("low_label")); + gtk_size_group_add_widget (size_group, WID ("slow_label")); + gtk_size_group_add_widget (size_group, WID ("small_label")); + + /* Remove cursors page */ + widget = glade_xml_get_widget (dialog, "main_notebook"); gtk_notebook_remove_page (GTK_NOTEBOOK (widget), 1); - /* Motion page */ - size_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL); - gtk_size_group_add_widget (size_group, - glade_xml_get_widget (xml, "acceleration_label")); - gtk_size_group_add_widget (size_group, - glade_xml_get_widget (xml, "sensitivity_label")); - gtk_size_group_add_widget (size_group, - glade_xml_get_widget (xml, "threshold_label")); + g_object_weak_ref (G_OBJECT (widget), (GWeakNotify) g_object_unref, dialog); - size_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL); - gtk_size_group_add_widget (size_group, - glade_xml_get_widget (xml, "high_label")); - gtk_size_group_add_widget (size_group, - glade_xml_get_widget (xml, "fast_label")); - gtk_size_group_add_widget (size_group, - glade_xml_get_widget (xml, "large_label")); + return dialog; +} - size_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL); - gtk_size_group_add_widget (size_group, - glade_xml_get_widget (xml, "low_label")); - gtk_size_group_add_widget (size_group, - glade_xml_get_widget (xml, "slow_label")); - gtk_size_group_add_widget (size_group, - glade_xml_get_widget (xml, "small_label")); +/* Callback issued when a button is clicked on the dialog */ - widget = glade_xml_get_widget (xml, "accel_scale"); - acceleration = gconf_client_get_float (client, MOTION_ACCELERATION_KEY, NULL); - acceleration = motion_acceleration_from_gconf (acceleration); - gtk_range_set_value (GTK_RANGE (widget), acceleration); - g_signal_connect (G_OBJECT (gtk_range_get_adjustment (GTK_RANGE (widget))), - "value_changed", - (GCallback) acceleration_callback, - NULL); - - widget = glade_xml_get_widget (xml, "sensitivity_scale"); - threshold = gconf_client_get_int (client, MOTION_THRESHOLD_KEY, NULL); - threshold = threshold_from_gconf (threshold); - gtk_range_set_value (GTK_RANGE (widget), threshold); - g_signal_connect (G_OBJECT (gtk_range_get_adjustment (GTK_RANGE (widget))), - "value_changed", - (GCallback) threshold_callback, - MOTION_THRESHOLD_KEY); - - widget = glade_xml_get_widget (xml, "drag_threshold_scale"); - threshold = gconf_client_get_int (client, DRAG_THRESHOLD_KEY, NULL); - threshold = threshold_from_gconf (threshold); - gtk_range_set_value (GTK_RANGE (widget), threshold); - g_signal_connect (G_OBJECT (gtk_range_get_adjustment (GTK_RANGE (widget))), - "value_changed", - (GCallback) threshold_callback, - DRAG_THRESHOLD_KEY); - - /* main dialog */ - widget = glade_xml_get_widget (xml, "mouse_properties_dialog"); - g_signal_connect (G_OBJECT (widget), - "destroy", - gtk_main_quit, NULL); - widget = glade_xml_get_widget (xml, "close_button"); - g_signal_connect (G_OBJECT (widget), - "clicked", - gtk_main_quit, NULL); +static void +dialog_button_clicked_cb (GnomeDialog *dialog, gint button_number, GConfChangeSet *changeset) +{ + if (button_number == 0) + gconf_client_commit_change_set (gconf_client_get_default (), changeset, TRUE, NULL); + else if (button_number == 1) + gnome_dialog_close (dialog); } int -main (int argc, char *argv[]) +main (int argc, char **argv) { - gnome_program_init ("mouse-properties", - "0.1", - gnome_gtk_module_info_get (), - argc, argv, + GConfClient *client; + GConfChangeSet *changeset; + GladeXML *dialog; + GtkWidget *dialog_win; + + static gboolean apply_only; + static gboolean get_legacy; + static struct poptOption cap_options[] = { + { "apply", '\0', POPT_ARG_NONE, &apply_only, 0, + N_("Just apply settings and quit (compatibility only; now handled by daemon)"), NULL }, + { "init-session-settings", '\0', POPT_ARG_NONE, &apply_only, 0, + N_("Just apply settings and quit (compatibility only; now handled by daemon)"), NULL }, + { "get-legacy", '\0', POPT_ARG_NONE, &get_legacy, 0, + N_("Retrieve and store legacy settings"), NULL }, + { NULL, '\0', 0, NULL, 0, NULL, NULL } + }; + + bindtextdomain (PACKAGE, GNOMELOCALEDIR); + bind_textdomain_codeset (PACKAGE, "UTF-8"); + textdomain (PACKAGE); + + gnome_program_init (argv[0], VERSION, LIBGNOMEUI_MODULE, argc, argv, + GNOME_PARAM_POPT_TABLE, cap_options, NULL); - xml = glade_xml_new ("gnome-mouse-properties.glade", NULL, NULL); - setup_dialog (); - gtk_widget_show_all (glade_xml_get_widget (xml, "mouse_properties_dialog")); + client = gconf_client_get_default (); + gconf_client_add_dir (client, "/desktop/gnome/peripherals/mouse", GCONF_CLIENT_PRELOAD_ONELEVEL, NULL); - gtk_main (); + if (get_legacy) { + get_legacy_settings (); + } else { + changeset = gconf_change_set_new (); + dialog = create_dialog (); + load_pixbufs (); + setup_dialog (dialog, changeset); + + dialog_win = gnome_dialog_new (_("Mouse properties"), GTK_STOCK_APPLY, GTK_STOCK_CLOSE, NULL); + g_signal_connect (G_OBJECT (dialog_win), "clicked", (GCallback) dialog_button_clicked_cb, changeset); + g_object_weak_ref (G_OBJECT (dialog_win), (GWeakNotify) gtk_main_quit, NULL); + gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (dialog_win)->vbox), WID ("prefs_widget"), TRUE, TRUE, GNOME_PAD_SMALL); + gtk_widget_show_all (dialog_win); + + gtk_main (); + gconf_change_set_unref (changeset); + } - g_object_unref (G_OBJECT (client)); return 0; } diff --git a/capplets/mouse/mouse-properties.glade b/capplets/mouse/mouse-properties.glade index 062ae4b29..99b905b1f 100644 --- a/capplets/mouse/mouse-properties.glade +++ b/capplets/mouse/mouse-properties.glade @@ -1,489 +1,790 @@ - - + + - - New-mouse-properties-mockup - new-mouse-properties-mockup- - - src - - C - True - True - + + + Mouse Properties + GTK_WINDOW_TOPLEVEL + no + no + no + no + GTK_WIN_POS_NONE - - GnomeDialog - Mouse Configuration - Mouse Configuration - GTK_WINDOW_TOPLEVEL - GTK_WIN_POS_NONE - False - 448 - 272 - True - True - False - False - False + + + no + 8 + yes - - GtkVBox - GnomeDialog:vbox - dialog-vbox1 - False - 8 - - 4 - True - True + + + GTK_BUTTONBOX_END + 8 + yes + + + + yes + yes + yes + gtk-help + yes + yes + + + + + + yes + yes + yes + gtk-close + yes + yes + + + + + 0 + no + yes + GTK_PACK_END + + + + + + yes + yes + yes + GTK_POS_TOP + no + 2 + 2 + no + yes + + + + 4 + no + 4 + yes + + + + Mouse Orientation + 0 + GTK_SHADOW_ETCHED_IN + yes + + + + 8 + no + 8 + yes + + + + no + 8 + yes + + + + yes + _Left-handed mouse + no + yes + yes + yes + + + 0 + no + no + + + + + + Left-handed mouse mode switches the left and right buttons on the mouse. + GTK_JUSTIFY_LEFT + yes + 0 + 0 + 0 + 0 + yes + + + 0 + yes + yes + + + + + 0 + yes + yes + + + + + + 0.5 + 0.5 + 0 + 0 + yes + + + 0 + no + yes + + + + + + + 0 + yes + yes + + + + + + Double-click Delay + 0 + GTK_SHADOW_ETCHED_IN + yes + + + + 8 + no + 8 + yes + + + + no + 8 + yes + + + + no + 4 + yes + + + + _Delay (sec): + GTK_JUSTIFY_CENTER + no + 0.5 + 1 + 0 + 0 + delay_scale + yes + yes + + + 0 + no + no + + + + + + yes + yes + GTK_POS_TOP + 1 + GTK_UPDATE_DISCONTINUOUS + yes + 0.4 0.1 1.1 0.1 0.1 0.1 + + + 0 + yes + yes + + + + + 0 + no + yes + + + + + + Maximum time allowed between clicks when double-clicking. Use the box on the right to test. + GTK_JUSTIFY_LEFT + yes + 0 + 0 + 0 + 0 + yes + + + 0 + yes + yes + + + + + 0 + yes + yes + + + + + + 0.5 + 0.5 + 0 + 0 + yes + + + + 0 + GTK_SHADOW_ETCHED_OUT + yes + + + + 100 + 100 + yes + + + + + + + 0 + no + yes + + + + + + + 0 + yes + yes + + + + + + + + _Buttons + yes + GTK_JUSTIFY_CENTER + no + 0.5 + 0.5 + 0 + 0 + yes + + + tab + + + + + + 4 + Mouse Cursor + 0 + GTK_SHADOW_ETCHED_IN + yes + + + + 4 + no + 4 + yes + + + + yes + + + + + + You will need to restart your login session for this setting to take effect. + GTK_JUSTIFY_LEFT + yes + 0 + 0.5 + 0 + 0 + yes + + + 0 + no + no + + + + + + + + + + _Cursors + yes + GTK_JUSTIFY_CENTER + no + 0.5 + 0.5 + 0 + 0 + yes + + + tab + + + + + + 4 + no + 4 + yes + + + + Speed + 0 + GTK_SHADOW_ETCHED_IN + yes + + + + 8 + no + 8 + yes + + + + no + 4 + 4 + 2 + 4 + yes + + + + _Acceleration: + GTK_JUSTIFY_CENTER + no + accel_scale + 0 + 0.5 + 0 + 0 + yes + yes + + + 0 + 1 + 0 + 1 + 0 + 0 + fill + fill + + + + + + _Sensitivity: + GTK_JUSTIFY_CENTER + no + sensitivity_scale + 0 + 0.5 + 0 + 0 + yes + yes + + + 0 + 1 + 1 + 2 + 0 + 0 + fill + fill + + + + + + <i>Fast</i> + yes + GTK_JUSTIFY_CENTER + no + 0 + 0.5 + 0 + 0 + yes + + + 3 + 4 + 0 + 1 + 0 + 0 + fill + + + + + + + <i>High</i> + yes + GTK_JUSTIFY_CENTER + no + 0 + 0.5 + 0 + 0 + yes + + + 3 + 4 + 1 + 2 + 0 + 0 + fill + + + + + + + yes + GTK_UPDATE_DISCONTINUOUS + no + GTK_POS_TOP + 0 + yes + 1 1 10 1 1 1 + + + 2 + 3 + 1 + 2 + 0 + 0 + expand|fill + fill + + + + + + yes + GTK_UPDATE_DISCONTINUOUS + no + GTK_POS_RIGHT + 1 + yes + 1 1 10 1 1 1 + + + 2 + 3 + 0 + 1 + 0 + 0 + fill + fill + + + + + + <i>Slow</i> + yes + GTK_JUSTIFY_CENTER + no + 1 + 0.5 + 0 + 0 + yes + + + 1 + 2 + 0 + 1 + 0 + 0 + fill + + + + + + + <i>Low</i> + yes + GTK_JUSTIFY_CENTER + no + 1 + 0.5 + 0 + 0 + yes + + + 1 + 2 + 1 + 2 + 0 + 0 + fill + + + + + + 0 + no + yes + + + + + + Set the speed of your pointing device. + GTK_JUSTIFY_LEFT + yes + 0 + 0.5 + 0 + 0 + yes + + + 0 + yes + yes + + + + + + + 0 + yes + yes + + + + + + Drag and Drop + 0 + GTK_SHADOW_ETCHED_IN + yes + + + + 8 + no + 8 + yes + + + + no + 4 + yes + + + + _Threshold: + GTK_JUSTIFY_CENTER + no + drag_threshold_scale + 0 + 0.5 + 0 + 0 + yes + yes + + + 0 + no + no + + + + + + <i>Small</i> + yes + GTK_JUSTIFY_CENTER + no + 0.0 + 0.5 + 0 + 0 + yes + + + 0 + no + no + + + + + + yes + no + GTK_POS_TOP + 0 + yes + GTK_UPDATE_DISCONTINUOUS + 1 1 10 1 1 1 + + + 0 + yes + yes + + + + + + <i>Large</i> + yes + GTK_JUSTIFY_CENTER + no + 1 + 0.5 + 0 + 0 + yes + + + 0 + no + no + + + + + 0 + no + yes + + + + + + Set the distance you need to move your cursor before dragging an item. + GTK_JUSTIFY_LEFT + yes + 0 + 0.5 + 0 + 0 + yes + + + 0 + yes + yes + + + + + + + 0 + yes + yes + + + + + + + + _Motion + yes + GTK_JUSTIFY_CENTER + no + 0.5 + 0.5 + 0 + 0 + yes + + + tab + + + + + 0 + yes + yes + + + + + 4 + yes + yes + - - - GtkHButtonBox - GnomeDialog:action_area - dialog-action_area1 - GTK_BUTTONBOX_END - 8 - 85 - 27 - 7 - 0 - - 0 - False - True - GTK_PACK_END - - - - GtkButton - button1 - True - True - GNOME_STOCK_BUTTON_OK - - - - GtkButton - button3 - True - True - GNOME_STOCK_BUTTON_CANCEL - - - - - GtkVBox - prefs_widget - False - 0 - - 0 - True - True - - - - GtkLabel - label16 - - GTK_JUSTIFY_LEFT - False - 7.45058e-09 - 0.5 - 0 - 0 - - 0 - False - False - - - - - GtkTable - table3 - 2 - 2 - False - 0 - 12 - - 0 - False - False - - - - GtkRadioButton - left_handed_select - True - - toggled - left_handed_selected_cb - Wed, 27 Jun 2001 15:46:37 GMT - - - False - True - radio_group - - 0 - 1 - 1 - 2 - 0 - 0 - False - False - False - False - False - False - - - - - GtkRadioButton - right_handed_select - True - - toggled - right_handed_selected_cb - Wed, 27 Jun 2001 15:47:00 GMT - - - False - True - radio_group - - 1 - 2 - 1 - 2 - 0 - 0 - False - False - False - False - False - False - - - - - Custom - pixmap_left - mouse_capplet_create_image_widget - mouse-left.png - 0 - 0 - Fri, 07 Sep 2001 21:24:35 GMT - - 0 - 1 - 0 - 1 - 0 - 0 - False - False - False - False - True - True - - - - - Custom - custom2 - mouse_capplet_create_image_widget - mouse-right.png - 0 - 0 - Fri, 07 Sep 2001 21:39:40 GMT - - 1 - 2 - 0 - 1 - 0 - 0 - False - False - False - False - True - True - - - - - - GtkHSeparator - hseparator1 - - 4 - False - False - - - - - GtkTable - table2 - 3 - 5 - 3 - False - 3 - 3 - - 0 - False - False - - - - GtkLabel - label10 - - GTK_JUSTIFY_CENTER - False - 0 - 0.5 - 0 - 0 - - 0 - 1 - 1 - 2 - 0 - 0 - False - False - False - False - True - False - - - - - GtkHScale - acceleration_entry - True - False - GTK_POS_TOP - 0 - GTK_UPDATE_DISCONTINUOUS - 0 - 0 - 7 - 0 - 0 - 0 - - 1 - 2 - 1 - 2 - 0 - 0 - True - False - False - False - True - True - - - - - GtkLabel - label11 - - GTK_JUSTIFY_CENTER - False - 0 - 0.5 - 0 - 0 - - 2 - 3 - 1 - 2 - 0 - 0 - False - False - False - False - True - False - - - - - GtkLabel - label12 - - GTK_JUSTIFY_CENTER - False - 0 - 0.5 - 0 - 0 - - 0 - 3 - 0 - 1 - 0 - 0 - False - False - False - False - True - False - - - - - GtkLabel - label15 - - GTK_JUSTIFY_CENTER - False - 0 - 0.5 - 0 - 0 - - 0 - 3 - 3 - 4 - 0 - 0 - False - False - False - False - True - False - - - - - GtkLabel - label13 - - GTK_JUSTIFY_CENTER - False - 0 - 0.5 - 0 - 0 - - 0 - 1 - 4 - 5 - 0 - 0 - False - False - False - False - True - False - - - - - GtkHScale - sensitivity_entry - True - False - GTK_POS_TOP - 0 - GTK_UPDATE_DISCONTINUOUS - 0 - 0 - 7 - 0 - 0 - 0 - - 1 - 2 - 4 - 5 - 0 - 0 - False - False - False - False - True - True - - - - - GtkLabel - label14 - - GTK_JUSTIFY_CENTER - False - 0 - 0.5 - 0 - 0 - - 2 - 3 - 4 - 5 - 0 - 0 - False - False - False - False - True - False - - - - - GtkHSeparator - hseparator2 - - 0 - 3 - 2 - 3 - 0 - 0 - False - True - False - False - True - True - - - - - - - +