gnome-panel r11449 - trunk/gnome-panel



Author: vuntz
Date: Tue Jan 20 06:18:42 2009
New Revision: 11449
URL: http://svn.gnome.org/viewvc/gnome-panel?rev=11449&view=rev

Log:
2009-01-20  Vincent Untz  <vuntz gnome org>

	Only move panel with the mouse when a mouse button modifier is used
	(the same one as in metacity). Ie: you can drag the panel to move it
	when pressing Alt.
	Fix bug #309721.
	Based on patch by William Lachance <wrlach gmail com>

	* panel-bindings.[ch]: monitor the gconf key for the mouse button
	modifier and provide an API to access it
	(panel_binding_set_from_string): fix typo in warning
	(panel_binding_watch): don't translate warning
	(panel_bindings_mouse_modifier_set_from_string): new
	(panel_bindings_mouse_modifier_changed): new
	(panel_bindings_initialise): don't translate warning, handle the mouse
	button modifier stuff too
	(panel_bindings_set_entries): trivial update
	(panel_bindings_get_mouse_button_modifier_keymask): new
	* panel-toplevel.c: (panel_toplevel_button_press_event): look at the
	modifier mask before starting the move


Modified:
   trunk/gnome-panel/ChangeLog
   trunk/gnome-panel/panel-bindings.c
   trunk/gnome-panel/panel-bindings.h
   trunk/gnome-panel/panel-toplevel.c

Modified: trunk/gnome-panel/panel-bindings.c
==============================================================================
--- trunk/gnome-panel/panel-bindings.c	(original)
+++ trunk/gnome-panel/panel-bindings.c	Tue Jan 20 06:18:42 2009
@@ -32,7 +32,10 @@
 #include "panel-gconf.h"
 #include "panel-profile.h"
 
-#define BINDINGS_PREFIX "/apps/metacity/window_keybindings"
+#define BINDINGS_PREFIX    "/apps/metacity/window_keybindings"
+#define MOUSE_MODIFIER_DIR "/apps/metacity/general"
+#define MOUSE_MODIFIER_KEY "/apps/metacity/general/mouse_button_modifier"
+#define DEFAULT_MOUSE_MODIFIER GDK_MOD1_MASK
 
 typedef struct {
 	char            *key;
@@ -53,6 +56,8 @@
 	{ "begin_resize",         "begin-resize",     0, 0 },
 };
 
+static guint mouse_button_modifier_keymask = DEFAULT_MOUSE_MODIFIER;
+
 static void
 panel_binding_set_from_string (PanelBinding *binding,
 			       const char   *str)
@@ -68,7 +73,7 @@
 
 	gtk_accelerator_parse (str, &binding->keyval, &binding->modifiers);
 	if (binding->keyval == 0 && binding->modifiers == 0) {
-		g_warning ("Enable to parse binding '%s'\n", str);
+		g_warning ("Unable to parse binding '%s'\n", str);
 		return;
 	}
 }
@@ -150,17 +155,59 @@
 				(GConfClientNotifyFunc) panel_binding_changed,
 				binding, NULL, &error);
 	if (error) {
-		g_warning (_("Error watching gconf key '%s': %s"), key, error->message);
+		g_warning ("Error watching gconf key '%s': %s",
+			   key, error->message);
 		g_error_free (error);
 	}
 }
 
 static void
+panel_bindings_mouse_modifier_set_from_string (const char *str)
+{
+	guint modifier_keysym;
+	guint modifier_keymask;
+
+	gtk_accelerator_parse (str, &modifier_keysym, &modifier_keymask);
+
+	if (modifier_keysym == 0 && modifier_keymask == 0) {
+		g_warning ("Unable to parse mouse modifier '%s'\n", str);
+		return;
+	}
+
+	if (modifier_keymask)
+		mouse_button_modifier_keymask = modifier_keymask;
+	else
+		mouse_button_modifier_keymask = DEFAULT_MOUSE_MODIFIER;
+}
+
+static void
+panel_bindings_mouse_modifier_changed (GConfClient  *client,
+				       guint         cnxn_id,
+				       GConfEntry   *entry,
+				       gpointer      user_data)
+{
+	GConfValue *value;
+	const char *str;
+
+	value = gconf_entry_get_value (entry);
+
+	if (!value || value->type != GCONF_VALUE_STRING)
+		return;
+
+	str = gconf_value_get_string (value);
+	panel_bindings_mouse_modifier_set_from_string (str);
+}
+
+static void
 panel_bindings_initialise (void)
 {
 	GConfClient *client;
 	GError      *error;
 	int          i;
+	char        *str;
+
+	if (initialised)
+		return;
 
 	client = panel_gconf_get_client ();
 
@@ -168,22 +215,22 @@
 	gconf_client_add_dir (client, BINDINGS_PREFIX,
 			      GCONF_CLIENT_PRELOAD_ONELEVEL, &error);
 	if (error) {
-		g_warning (_("Error loading gconf directory '%s': %s"),
+		g_warning ("Error loading gconf directory '%s': %s",
 			   BINDINGS_PREFIX, error->message),
 		g_error_free (error);
 	}
 
 	for (i = 0; i < G_N_ELEMENTS (bindings); i++) {
 		const char *key;
-		char       *str;
 
 		key = panel_gconf_sprintf ("%s/%s", BINDINGS_PREFIX, bindings [i].key);
 
 		error = NULL;
 		str = gconf_client_get_string (client, key, &error);
 		if (error) {
-			g_warning (_("Error getting value for '%s': %s"),
+			g_warning ("Error getting value for '%s': %s",
 				   key, error->message);
+			g_error_free (error);
 			continue;
 		}
 
@@ -192,6 +239,39 @@
 
 		g_free (str);
 	}
+
+	/* mouse button modifier */
+	error = NULL;
+	gconf_client_add_dir (client, MOUSE_MODIFIER_DIR,
+			      GCONF_CLIENT_PRELOAD_NONE, &error);
+	if (error) {
+		g_warning ("Error loading gconf directory '%s': %s",
+			   MOUSE_MODIFIER_DIR, error->message),
+		g_error_free (error);
+	}
+
+	error = NULL;
+	gconf_client_notify_add (client, MOUSE_MODIFIER_KEY,
+				 panel_bindings_mouse_modifier_changed,
+				 NULL, NULL, &error);
+	if (error) {
+		g_warning ("Error watching gconf key '%s': %s",
+			   MOUSE_MODIFIER_KEY, error->message);
+		g_error_free (error);
+	}
+
+	error = NULL;
+	str = gconf_client_get_string (client, MOUSE_MODIFIER_KEY, &error);
+	if (error) {
+		g_warning ("Error getting value for '%s': %s",
+			   MOUSE_MODIFIER_KEY, error->message);
+		g_error_free (error);
+	} else {
+		panel_bindings_mouse_modifier_set_from_string (str);
+		g_free (str);
+	}
+
+	initialised = TRUE;
 }
 
 void
@@ -199,10 +279,8 @@
 {
 	int i;
 
-	if (!initialised) {
+	if (!initialised)
 		panel_bindings_initialise ();
-		initialised = TRUE;
-	}
 
 	for (i = 0; i < G_N_ELEMENTS (bindings); i++) {
 		if (!bindings [i].keyval)
@@ -211,3 +289,14 @@
 		panel_binding_set_entry (&bindings [i], binding_set);
 	}
 }
+
+guint
+panel_bindings_get_mouse_button_modifier_keymask (void)
+{
+	g_assert (mouse_button_modifier_keymask != 0);
+
+	if (!initialised)
+		panel_bindings_initialise ();
+
+	return mouse_button_modifier_keymask;
+}

Modified: trunk/gnome-panel/panel-bindings.h
==============================================================================
--- trunk/gnome-panel/panel-bindings.h	(original)
+++ trunk/gnome-panel/panel-bindings.h	Tue Jan 20 06:18:42 2009
@@ -31,6 +31,7 @@
 G_BEGIN_DECLS
 
 void panel_bindings_set_entries (GtkBindingSet *binding_set);
+guint panel_bindings_get_mouse_button_modifier_keymask (void);
 
 G_END_DECLS
 

Modified: trunk/gnome-panel/panel-toplevel.c
==============================================================================
--- trunk/gnome-panel/panel-toplevel.c	(original)
+++ trunk/gnome-panel/panel-toplevel.c	Tue Jan 20 06:18:42 2009
@@ -3215,6 +3215,11 @@
 	if (toplevel->priv->animating)
 		return FALSE;
 
+	/* Get the mouse-button modifier from metacity so that only intentional
+	 * moves are considered */
+	if ((event->state & gtk_accelerator_get_default_mod_mask ()) != panel_bindings_get_mouse_button_modifier_keymask ())
+		return FALSE;
+
 	gdk_window_get_user_data (event->window, (gpointer)&event_widget);
 	g_assert (GTK_IS_WIDGET (event_widget));
 	gtk_widget_translate_coordinates (event_widget,



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]