[gnome-control-center] keyboard: Rework stupid conflict detection code
- From: Bastien Nocera <hadess src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-control-center] keyboard: Rework stupid conflict detection code
- Date: Thu, 24 Feb 2011 04:36:16 +0000 (UTC)
commit a13cf931a9bb49f612104b4e4fd08a6c439fc147
Author: Bastien Nocera <hadess hadess net>
Date: Thu Feb 24 04:33:17 2011 +0000
keyboard: Rework stupid conflict detection code
https://bugzilla.gnome.org/show_bug.cgi?id=643124
panels/keyboard/keyboard-shortcuts.c | 105 +++++++++++++++------------------
1 files changed, 48 insertions(+), 57 deletions(-)
---
diff --git a/panels/keyboard/keyboard-shortcuts.c b/panels/keyboard/keyboard-shortcuts.c
index 3a26237..90cfe77 100644
--- a/panels/keyboard/keyboard-shortcuts.c
+++ b/panels/keyboard/keyboard-shortcuts.c
@@ -1181,34 +1181,41 @@ show_error (GtkWindow *parent,
gtk_widget_destroy (dialog);
}
+typedef struct {
+ CcKeyboardItem *orig_item;
+ CcKeyboardItem *conflict_item;
+ guint new_keyval;
+ EggVirtualModifierType new_mask;
+ guint new_keycode;
+} CcUniquenessData;
+
static gboolean
cb_check_for_uniqueness (GtkTreeModel *model,
GtkTreePath *path,
GtkTreeIter *iter,
- CcKeyboardItem *new_item)
+ CcUniquenessData *data)
{
CcKeyboardItem *element;
+ CcKeyboardItem *orig_item;
- gtk_tree_model_get (new_item->model, iter,
+ orig_item = data->orig_item;
+ gtk_tree_model_get (orig_item->model, iter,
DETAIL_KEYENTRY_COLUMN, &element,
-1);
/* no conflict for : blanks, different modifiers, or ourselves */
- if (element == NULL || new_item->mask != element->mask ||
- !strcmp (new_item->gconf_key, element->gconf_key))
+ if (element == NULL || data->new_mask != element->mask ||
+ cc_keyboard_item_equal (orig_item, element))
return FALSE;
- if (new_item->keyval != 0) {
- if (new_item->keyval != element->keyval)
+ if (data->new_keyval != 0) {
+ if (data->new_keyval != element->keyval)
return FALSE;
- } else if (element->keyval != 0 || new_item->keycode != element->keycode)
+ } else if (element->keyval != 0 || data->new_keycode != element->keycode)
return FALSE;
- new_item->editable = FALSE;
- new_item->gconf_key = element->gconf_key;
- new_item->description = element->description;
- new_item->desc_gconf_key = element->desc_gconf_key;
- new_item->desc_editable = element->desc_editable;
+ data->conflict_item = element;
+
return TRUE;
}
@@ -1218,13 +1225,13 @@ accel_edited_callback (GtkCellRendererText *cell,
guint keyval,
EggVirtualModifierType mask,
guint keycode,
- gpointer data)
+ GtkTreeView *view)
{
- GtkTreeView *view = (GtkTreeView *)data;
GtkTreeModel *model;
GtkTreePath *path = gtk_tree_path_new_from_string (path_string);
GtkTreeIter iter;
- CcKeyboardItem *item, *tmp_item;
+ CcUniquenessData data;
+ CcKeyboardItem *item;
char *str;
block_accels = FALSE;
@@ -1243,41 +1250,32 @@ accel_edited_callback (GtkCellRendererText *cell,
/* CapsLock isn't supported as a keybinding modifier, so keep it from confusing us */
mask &= ~EGG_VIRTUAL_LOCK_MASK;
- /* FIXME: implement copy */
- tmp_item = cc_keyboard_item_new (item->type);
- tmp_item->model = model;
- tmp_item->keyval = keyval;
- tmp_item->keycode = keycode;
- tmp_item->mask = mask;
- tmp_item->gconf_key = g_strdup (item->gconf_key);
- tmp_item->binding_gconf_key = g_strdup (item->binding_gconf_key);
- tmp_item->schema = g_strdup (tmp_item->schema);
- tmp_item->key = g_strdup (tmp_item->key);
- if (item->settings != NULL)
- tmp_item->settings = g_object_ref (item->settings);
- tmp_item->description = NULL;
- tmp_item->editable = TRUE; /* kludge to stuff in a return flag */
-
- if (keyval != 0 || keycode != 0) /* any number of keys can be disabled */
+ data.orig_item = item;
+ data.new_keyval = keyval;
+ data.new_mask = mask;
+ data.new_keycode = keycode;
+ data.conflict_item = NULL;
+
+ if (keyval != 0 || keycode != 0) /* any number of shortcuts can be disabled */
gtk_tree_model_foreach (model,
(GtkTreeModelForeachFunc) cb_check_for_uniqueness,
- tmp_item);
+ &data);
/* Check for unmodified keys */
- if (tmp_item->mask == 0 && tmp_item->keycode != 0)
+ if (mask == 0 && keycode != 0)
{
- if ((tmp_item->keyval >= GDK_KEY_a && tmp_item->keyval <= GDK_KEY_z)
- || (tmp_item->keyval >= GDK_KEY_A && tmp_item->keyval <= GDK_KEY_Z)
- || (tmp_item->keyval >= GDK_KEY_0 && tmp_item->keyval <= GDK_KEY_9)
- || (tmp_item->keyval >= GDK_KEY_kana_fullstop && tmp_item->keyval <= GDK_KEY_semivoicedsound)
- || (tmp_item->keyval >= GDK_KEY_Arabic_comma && tmp_item->keyval <= GDK_KEY_Arabic_sukun)
- || (tmp_item->keyval >= GDK_KEY_Serbian_dje && tmp_item->keyval <= GDK_KEY_Cyrillic_HARDSIGN)
- || (tmp_item->keyval >= GDK_KEY_Greek_ALPHAaccent && tmp_item->keyval <= GDK_KEY_Greek_omega)
- || (tmp_item->keyval >= GDK_KEY_hebrew_doublelowline && tmp_item->keyval <= GDK_KEY_hebrew_taf)
- || (tmp_item->keyval >= GDK_KEY_Thai_kokai && tmp_item->keyval <= GDK_KEY_Thai_lekkao)
- || (tmp_item->keyval >= GDK_KEY_Hangul && tmp_item->keyval <= GDK_KEY_Hangul_Special)
- || (tmp_item->keyval >= GDK_KEY_Hangul_Kiyeog && tmp_item->keyval <= GDK_KEY_Hangul_J_YeorinHieuh)
- || keyval_is_forbidden (tmp_item->keyval)) {
+ if ((keyval >= GDK_KEY_a && keyval <= GDK_KEY_z)
+ || (keyval >= GDK_KEY_A && keyval <= GDK_KEY_Z)
+ || (keyval >= GDK_KEY_0 && keyval <= GDK_KEY_9)
+ || (keyval >= GDK_KEY_kana_fullstop && keyval <= GDK_KEY_semivoicedsound)
+ || (keyval >= GDK_KEY_Arabic_comma && keyval <= GDK_KEY_Arabic_sukun)
+ || (keyval >= GDK_KEY_Serbian_dje && keyval <= GDK_KEY_Cyrillic_HARDSIGN)
+ || (keyval >= GDK_KEY_Greek_ALPHAaccent && keyval <= GDK_KEY_Greek_omega)
+ || (keyval >= GDK_KEY_hebrew_doublelowline && keyval <= GDK_KEY_hebrew_taf)
+ || (keyval >= GDK_KEY_Thai_kokai && keyval <= GDK_KEY_Thai_lekkao)
+ || (keyval >= GDK_KEY_Hangul && keyval <= GDK_KEY_Hangul_Special)
+ || (keyval >= GDK_KEY_Hangul_Kiyeog && keyval <= GDK_KEY_Hangul_J_YeorinHieuh)
+ || keyval_is_forbidden (keyval)) {
GtkWidget *dialog;
char *name;
@@ -1300,13 +1298,12 @@ accel_edited_callback (GtkCellRendererText *cell,
egg_cell_renderer_keys_set_accelerator
(EGG_CELL_RENDERER_KEYS (cell),
item->keyval, item->keycode, item->mask);
- g_object_unref (tmp_item);
return;
}
}
/* flag to see if the new accelerator was in use by something */
- if (!tmp_item->editable)
+ if (data.conflict_item != NULL)
{
GtkWidget *dialog;
char *name;
@@ -1314,24 +1311,20 @@ accel_edited_callback (GtkCellRendererText *cell,
name = binding_name (keyval, keycode, mask, TRUE);
- /* FIXME: gconf_key could be NULL */
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_CANCEL,
_("The shortcut \"%s\" is already used for\n\"%s\""),
- name, tmp_item->description ?
- tmp_item->description : tmp_item->gconf_key);
+ name, data.conflict_item->description);
g_free (name);
gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
_("If you reassign the shortcut to \"%s\", the \"%s\" shortcut "
"will be disabled."),
- item->description ?
- item->description : item->gconf_key,
- tmp_item->description ?
- tmp_item->description : tmp_item->gconf_key);
+ item->description,
+ data.conflict_item->description);
gtk_dialog_add_button (GTK_DIALOG (dialog),
_("_Reassign"),
@@ -1345,7 +1338,7 @@ accel_edited_callback (GtkCellRendererText *cell,
if (response == GTK_RESPONSE_ACCEPT)
{
- g_object_set (G_OBJECT (tmp_item), "binding", "", NULL);
+ g_object_set (G_OBJECT (data.conflict_item), "binding", "", NULL);
str = binding_name (keyval, keycode, mask, FALSE);
g_object_set (G_OBJECT (item), "binding", str, NULL);
@@ -1361,7 +1354,6 @@ accel_edited_callback (GtkCellRendererText *cell,
item->mask);
}
- g_object_unref (tmp_item);
return;
}
@@ -1369,7 +1361,6 @@ accel_edited_callback (GtkCellRendererText *cell,
g_object_set (G_OBJECT (item), "binding", str, NULL);
g_free (str);
- g_object_unref (tmp_item);
}
static void
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]