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

Re: Keyboard shortcuts



Hi,

Anyhow, here's a patch. Should be in CVS soon.

Havoc

Index: ChangeLog
===================================================================
RCS file: /cvs/gnome/gnome-control-center/capplets/keybindings/ChangeLog,v
retrieving revision 1.37
diff -u -p -u -r1.37 ChangeLog
--- ChangeLog	24 Nov 2002 05:14:58 -0000	1.37
+++ ChangeLog	4 Dec 2002 04:37:06 -0000
@@ -1,3 +1,20 @@
+2002-12-03  Havoc Pennington  <hp@pobox.com>
+
+	* gnome-keybinding-properties.c (append_keys_to_tree): store
+	description in the KeyEntry
+	(cb_check_for_uniqueness): don't complain if a key is a duplicate
+	of itself.
+	(accel_edited_callback): use human-readable key name in the error
+	message, not the gconf key. Reword error message to say "shortcut"
+	like the other text in the dialog. Allow duplicate disabled keys
+	(keyval == 0)
+	(accel_edited_callback): the passed-in mask is an
+	EggVirtualModifierType.
+	(struct KeyEntry): the mask is an EggVirtualModifierType
+	(binding_name): use egg_virtual_accelerator_name() not 
+	gtk_accelerator_name().
+	(binding_from_string): use egg_accelerator_parse_virtual
+
 2002-11-23  Jody Goldberg <jody@gnome.org>
 
 	* Release 2.1.3
Index: gnome-keybinding-properties.c
===================================================================
RCS file: /cvs/gnome/gnome-control-center/capplets/keybindings/gnome-keybinding-properties.c,v
retrieving revision 1.29
diff -u -p -u -r1.29 gnome-keybinding-properties.c
--- gnome-keybinding-properties.c	15 Nov 2002 00:34:48 -0000	1.29
+++ gnome-keybinding-properties.c	4 Dec 2002 04:37:06 -0000
@@ -110,10 +110,11 @@ typedef struct
 {
   char *gconf_key;
   guint keyval;
-  GdkModifierType mask;
+  EggVirtualModifierType mask;
   gboolean editable;
   GtkTreeModel *model;
   guint gconf_cnxn;
+  char *description;
 } KeyEntry;
 
 static void reload_key_entries (gpointer wm_name, GladeXML *dialog);
@@ -171,20 +172,20 @@ create_dialog (void)
 }
 
 static char*
-binding_name (guint            keyval,
-              GdkModifierType  mask,
-              gboolean         translate)
+binding_name (guint                   keyval,
+              EggVirtualModifierType  mask,
+              gboolean                translate)
 {
   if (keyval != 0)
-    return gtk_accelerator_name (keyval, mask);
+    return egg_virtual_accelerator_name (keyval, mask);
   else
     return translate ? g_strdup (_("Disabled")) : g_strdup ("disabled");
 }
 
 static gboolean
-binding_from_string (const char      *str,
-                     guint           *accelerator_key,
-                     GdkModifierType *accelerator_mods)
+binding_from_string (const char             *str,
+                     guint                  *accelerator_key,
+                     EggVirtualModifierType *accelerator_mods)
 {
   g_return_val_if_fail (accelerator_key != NULL, FALSE);
   
@@ -195,8 +196,8 @@ binding_from_string (const char      *st
       return TRUE;
     }
 
-  gtk_accelerator_parse (str, accelerator_key, accelerator_mods);
-
+  egg_accelerator_parse_virtual (str, accelerator_key, accelerator_mods);
+  
   if (*accelerator_key == 0)
     return FALSE;
   else
@@ -308,8 +309,9 @@ clear_old_model (GladeXML  *dialog,
 	    {
 	      gconf_client_notify_remove (client, key_entry->gconf_cnxn);
 	      g_free (key_entry->gconf_key);
+              g_free (key_entry->description);
 	      g_free (key_entry);
-	    }
+            }
 	}
       g_object_unref (model);
     }
@@ -425,6 +427,7 @@ append_keys_to_tree (GladeXML           
 						       key_entry, NULL, NULL);
       binding_from_string (key_value, &key_entry->keyval, &key_entry->mask);
       g_free (key_value);
+      key_entry->description = g_strdup (gconf_schema_get_short_desc (schema));
 
       if (i == MAX_ELEMENTS_BEFORE_SCROLLING)
 	{
@@ -440,7 +443,7 @@ append_keys_to_tree (GladeXML           
       if (gconf_schema_get_short_desc (schema))
 	gtk_tree_store_set (GTK_TREE_STORE (model), &iter,
 			    DESCRIPTION_COLUMN,
-                            gconf_schema_get_short_desc (schema),
+                            key_entry->description,
 			    KEYENTRY_COLUMN, key_entry,
 			    -1);
       else
@@ -539,22 +542,25 @@ cb_check_for_uniqueness (GtkTreeModel *m
 
   if (tmp_key_entry != NULL &&
       key_entry->keyval == tmp_key_entry->keyval &&
-      key_entry->mask   == tmp_key_entry->mask)
+      key_entry->mask   == tmp_key_entry->mask &&
+      /* be sure we don't claim a key is a dup of itself */
+      strcmp (key_entry->gconf_key, tmp_key_entry->gconf_key) != 0)
     {
       key_entry->editable = FALSE;
       key_entry->gconf_key = tmp_key_entry->gconf_key;
+      key_entry->description = tmp_key_entry->description;
       return TRUE;
     }
   return FALSE;
 }
 
 static void
-accel_edited_callback (GtkCellRendererText *cell,
-                       const char          *path_string,
-                       guint                keyval,
-                       GdkModifierType      mask,
-		       guint                keycode,
-                       gpointer             data)
+accel_edited_callback (GtkCellRendererText   *cell,
+                       const char            *path_string,
+                       guint                  keyval,
+                       EggVirtualModifierType mask,
+		       guint                  keycode,
+                       gpointer               data)
 {
   GtkTreeView *view = (GtkTreeView *)data;
   GtkTreeModel *model;
@@ -580,25 +586,39 @@ accel_edited_callback (GtkCellRendererTe
   tmp_key.model  = model;
   tmp_key.keyval = keyval;
   tmp_key.mask   = mask;
+  tmp_key.gconf_key = key_entry->gconf_key;
+  tmp_key.description = NULL;
   tmp_key.editable = TRUE; /* kludge to stuff in a return flag */
-  gtk_tree_model_foreach (model, cb_check_for_uniqueness, &tmp_key);
+
+  if (keyval != 0) /* any number of keys can be disabled */
+    gtk_tree_model_foreach (model, cb_check_for_uniqueness, &tmp_key);
 
   /* flag to see if the new accelerator was in use by something */
   if (!tmp_key.editable)
     {
-      GtkWidget *dialog = gtk_message_dialog_new (GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (view))),
-				       GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL,
-				       GTK_MESSAGE_WARNING,
-				       GTK_BUTTONS_OK,
-				       _("That accelerator key is already in use by: %s\n"),
-				       key_entry->gconf_key);
+      GtkWidget *dialog;
+      char *name;
+
+      name = egg_virtual_accelerator_name (keyval, mask);
+      
+      dialog =
+        gtk_message_dialog_new (GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (view))),
+                                GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL,
+                                GTK_MESSAGE_WARNING,
+                                GTK_BUTTONS_OK,
+                                _("The shortcut \"%s\" is already used for:\n \"%s\"\n"),
+                                name,
+                                tmp_key.description ?
+                                tmp_key.description : tmp_key.gconf_key);
+      g_free (name);
       gtk_dialog_run (GTK_DIALOG (dialog));
       gtk_widget_destroy (dialog);
 
+      /* set it back to its previous value. */
       egg_cell_renderer_keys_set_accelerator (EGG_CELL_RENDERER_KEYS (cell),
 					      key_entry->keyval, key_entry->mask);
       gtk_tree_path_free (path);
-    return;
+      return;
     }
 
   str = binding_name (keyval, mask, FALSE);



Reply to: