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: