keyboard: Rework stupid conflict detection code
https://bugzilla.gnome.org/show_bug.cgi?id=643124
This commit is contained in:
parent
b77df51384
commit
a13cf931a9
1 changed files with 47 additions and 56 deletions
|
@ -1181,34 +1181,41 @@ show_error (GtkWindow *parent,
|
||||||
gtk_widget_destroy (dialog);
|
gtk_widget_destroy (dialog);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
CcKeyboardItem *orig_item;
|
||||||
|
CcKeyboardItem *conflict_item;
|
||||||
|
guint new_keyval;
|
||||||
|
EggVirtualModifierType new_mask;
|
||||||
|
guint new_keycode;
|
||||||
|
} CcUniquenessData;
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
cb_check_for_uniqueness (GtkTreeModel *model,
|
cb_check_for_uniqueness (GtkTreeModel *model,
|
||||||
GtkTreePath *path,
|
GtkTreePath *path,
|
||||||
GtkTreeIter *iter,
|
GtkTreeIter *iter,
|
||||||
CcKeyboardItem *new_item)
|
CcUniquenessData *data)
|
||||||
{
|
{
|
||||||
CcKeyboardItem *element;
|
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,
|
DETAIL_KEYENTRY_COLUMN, &element,
|
||||||
-1);
|
-1);
|
||||||
|
|
||||||
/* no conflict for : blanks, different modifiers, or ourselves */
|
/* no conflict for : blanks, different modifiers, or ourselves */
|
||||||
if (element == NULL || new_item->mask != element->mask ||
|
if (element == NULL || data->new_mask != element->mask ||
|
||||||
!strcmp (new_item->gconf_key, element->gconf_key))
|
cc_keyboard_item_equal (orig_item, element))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
if (new_item->keyval != 0) {
|
if (data->new_keyval != 0) {
|
||||||
if (new_item->keyval != element->keyval)
|
if (data->new_keyval != element->keyval)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
} else if (element->keyval != 0 || new_item->keycode != element->keycode)
|
} else if (element->keyval != 0 || data->new_keycode != element->keycode)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
new_item->editable = FALSE;
|
data->conflict_item = element;
|
||||||
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;
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1218,13 +1225,13 @@ accel_edited_callback (GtkCellRendererText *cell,
|
||||||
guint keyval,
|
guint keyval,
|
||||||
EggVirtualModifierType mask,
|
EggVirtualModifierType mask,
|
||||||
guint keycode,
|
guint keycode,
|
||||||
gpointer data)
|
GtkTreeView *view)
|
||||||
{
|
{
|
||||||
GtkTreeView *view = (GtkTreeView *)data;
|
|
||||||
GtkTreeModel *model;
|
GtkTreeModel *model;
|
||||||
GtkTreePath *path = gtk_tree_path_new_from_string (path_string);
|
GtkTreePath *path = gtk_tree_path_new_from_string (path_string);
|
||||||
GtkTreeIter iter;
|
GtkTreeIter iter;
|
||||||
CcKeyboardItem *item, *tmp_item;
|
CcUniquenessData data;
|
||||||
|
CcKeyboardItem *item;
|
||||||
char *str;
|
char *str;
|
||||||
|
|
||||||
block_accels = FALSE;
|
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 */
|
/* CapsLock isn't supported as a keybinding modifier, so keep it from confusing us */
|
||||||
mask &= ~EGG_VIRTUAL_LOCK_MASK;
|
mask &= ~EGG_VIRTUAL_LOCK_MASK;
|
||||||
|
|
||||||
/* FIXME: implement copy */
|
data.orig_item = item;
|
||||||
tmp_item = cc_keyboard_item_new (item->type);
|
data.new_keyval = keyval;
|
||||||
tmp_item->model = model;
|
data.new_mask = mask;
|
||||||
tmp_item->keyval = keyval;
|
data.new_keycode = keycode;
|
||||||
tmp_item->keycode = keycode;
|
data.conflict_item = NULL;
|
||||||
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 */
|
if (keyval != 0 || keycode != 0) /* any number of shortcuts can be disabled */
|
||||||
gtk_tree_model_foreach (model,
|
gtk_tree_model_foreach (model,
|
||||||
(GtkTreeModelForeachFunc) cb_check_for_uniqueness,
|
(GtkTreeModelForeachFunc) cb_check_for_uniqueness,
|
||||||
tmp_item);
|
&data);
|
||||||
|
|
||||||
/* Check for unmodified keys */
|
/* 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)
|
if ((keyval >= GDK_KEY_a && keyval <= GDK_KEY_z)
|
||||||
|| (tmp_item->keyval >= GDK_KEY_A && tmp_item->keyval <= GDK_KEY_Z)
|
|| (keyval >= GDK_KEY_A && keyval <= GDK_KEY_Z)
|
||||||
|| (tmp_item->keyval >= GDK_KEY_0 && tmp_item->keyval <= GDK_KEY_9)
|
|| (keyval >= GDK_KEY_0 && keyval <= GDK_KEY_9)
|
||||||
|| (tmp_item->keyval >= GDK_KEY_kana_fullstop && tmp_item->keyval <= GDK_KEY_semivoicedsound)
|
|| (keyval >= GDK_KEY_kana_fullstop && keyval <= GDK_KEY_semivoicedsound)
|
||||||
|| (tmp_item->keyval >= GDK_KEY_Arabic_comma && tmp_item->keyval <= GDK_KEY_Arabic_sukun)
|
|| (keyval >= GDK_KEY_Arabic_comma && keyval <= GDK_KEY_Arabic_sukun)
|
||||||
|| (tmp_item->keyval >= GDK_KEY_Serbian_dje && tmp_item->keyval <= GDK_KEY_Cyrillic_HARDSIGN)
|
|| (keyval >= GDK_KEY_Serbian_dje && keyval <= GDK_KEY_Cyrillic_HARDSIGN)
|
||||||
|| (tmp_item->keyval >= GDK_KEY_Greek_ALPHAaccent && tmp_item->keyval <= GDK_KEY_Greek_omega)
|
|| (keyval >= GDK_KEY_Greek_ALPHAaccent && keyval <= GDK_KEY_Greek_omega)
|
||||||
|| (tmp_item->keyval >= GDK_KEY_hebrew_doublelowline && tmp_item->keyval <= GDK_KEY_hebrew_taf)
|
|| (keyval >= GDK_KEY_hebrew_doublelowline && keyval <= GDK_KEY_hebrew_taf)
|
||||||
|| (tmp_item->keyval >= GDK_KEY_Thai_kokai && tmp_item->keyval <= GDK_KEY_Thai_lekkao)
|
|| (keyval >= GDK_KEY_Thai_kokai && keyval <= GDK_KEY_Thai_lekkao)
|
||||||
|| (tmp_item->keyval >= GDK_KEY_Hangul && tmp_item->keyval <= GDK_KEY_Hangul_Special)
|
|| (keyval >= GDK_KEY_Hangul && keyval <= GDK_KEY_Hangul_Special)
|
||||||
|| (tmp_item->keyval >= GDK_KEY_Hangul_Kiyeog && tmp_item->keyval <= GDK_KEY_Hangul_J_YeorinHieuh)
|
|| (keyval >= GDK_KEY_Hangul_Kiyeog && keyval <= GDK_KEY_Hangul_J_YeorinHieuh)
|
||||||
|| keyval_is_forbidden (tmp_item->keyval)) {
|
|| keyval_is_forbidden (keyval)) {
|
||||||
GtkWidget *dialog;
|
GtkWidget *dialog;
|
||||||
char *name;
|
char *name;
|
||||||
|
|
||||||
|
@ -1300,13 +1298,12 @@ accel_edited_callback (GtkCellRendererText *cell,
|
||||||
egg_cell_renderer_keys_set_accelerator
|
egg_cell_renderer_keys_set_accelerator
|
||||||
(EGG_CELL_RENDERER_KEYS (cell),
|
(EGG_CELL_RENDERER_KEYS (cell),
|
||||||
item->keyval, item->keycode, item->mask);
|
item->keyval, item->keycode, item->mask);
|
||||||
g_object_unref (tmp_item);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* flag to see if the new accelerator was in use by something */
|
/* flag to see if the new accelerator was in use by something */
|
||||||
if (!tmp_item->editable)
|
if (data.conflict_item != NULL)
|
||||||
{
|
{
|
||||||
GtkWidget *dialog;
|
GtkWidget *dialog;
|
||||||
char *name;
|
char *name;
|
||||||
|
@ -1314,24 +1311,20 @@ accel_edited_callback (GtkCellRendererText *cell,
|
||||||
|
|
||||||
name = binding_name (keyval, keycode, mask, TRUE);
|
name = binding_name (keyval, keycode, mask, TRUE);
|
||||||
|
|
||||||
/* FIXME: gconf_key could be NULL */
|
|
||||||
dialog =
|
dialog =
|
||||||
gtk_message_dialog_new (GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (view))),
|
gtk_message_dialog_new (GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (view))),
|
||||||
GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL,
|
GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL,
|
||||||
GTK_MESSAGE_WARNING,
|
GTK_MESSAGE_WARNING,
|
||||||
GTK_BUTTONS_CANCEL,
|
GTK_BUTTONS_CANCEL,
|
||||||
_("The shortcut \"%s\" is already used for\n\"%s\""),
|
_("The shortcut \"%s\" is already used for\n\"%s\""),
|
||||||
name, tmp_item->description ?
|
name, data.conflict_item->description);
|
||||||
tmp_item->description : tmp_item->gconf_key);
|
|
||||||
g_free (name);
|
g_free (name);
|
||||||
|
|
||||||
gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
|
gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
|
||||||
_("If you reassign the shortcut to \"%s\", the \"%s\" shortcut "
|
_("If you reassign the shortcut to \"%s\", the \"%s\" shortcut "
|
||||||
"will be disabled."),
|
"will be disabled."),
|
||||||
item->description ?
|
item->description,
|
||||||
item->description : item->gconf_key,
|
data.conflict_item->description);
|
||||||
tmp_item->description ?
|
|
||||||
tmp_item->description : tmp_item->gconf_key);
|
|
||||||
|
|
||||||
gtk_dialog_add_button (GTK_DIALOG (dialog),
|
gtk_dialog_add_button (GTK_DIALOG (dialog),
|
||||||
_("_Reassign"),
|
_("_Reassign"),
|
||||||
|
@ -1345,7 +1338,7 @@ accel_edited_callback (GtkCellRendererText *cell,
|
||||||
|
|
||||||
if (response == GTK_RESPONSE_ACCEPT)
|
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);
|
str = binding_name (keyval, keycode, mask, FALSE);
|
||||||
g_object_set (G_OBJECT (item), "binding", str, NULL);
|
g_object_set (G_OBJECT (item), "binding", str, NULL);
|
||||||
|
@ -1361,7 +1354,6 @@ accel_edited_callback (GtkCellRendererText *cell,
|
||||||
item->mask);
|
item->mask);
|
||||||
}
|
}
|
||||||
|
|
||||||
g_object_unref (tmp_item);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1369,7 +1361,6 @@ accel_edited_callback (GtkCellRendererText *cell,
|
||||||
g_object_set (G_OBJECT (item), "binding", str, NULL);
|
g_object_set (G_OBJECT (item), "binding", str, NULL);
|
||||||
|
|
||||||
g_free (str);
|
g_free (str);
|
||||||
g_object_unref (tmp_item);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue