Make custom keybinding editing work again
Only allow adding custom bindings in their section. Fix up memory management when removing bindings.
This commit is contained in:
parent
8effcb317c
commit
110b7fe8a8
1 changed files with 36 additions and 27 deletions
|
@ -852,6 +852,26 @@ description_set_func (GtkTreeViewColumn *tree_column,
|
||||||
"editable", FALSE, NULL);
|
"editable", FALSE, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
shortcut_selection_changed (GtkTreeSelection *selection, gpointer data)
|
||||||
|
{
|
||||||
|
GtkWidget *button = data;
|
||||||
|
GtkTreeModel *model;
|
||||||
|
GtkTreeIter iter;
|
||||||
|
KeyEntry *key;
|
||||||
|
gboolean can_remove;
|
||||||
|
|
||||||
|
can_remove = FALSE;
|
||||||
|
if (gtk_tree_selection_get_selected (selection, &model, &iter))
|
||||||
|
{
|
||||||
|
gtk_tree_model_get (model, &iter, DETAIL_KEYENTRY_COLUMN, &key, -1);
|
||||||
|
if (key && key->command != NULL && key->editable)
|
||||||
|
can_remove = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
gtk_widget_set_sensitive (button, can_remove);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
section_selection_changed (GtkTreeSelection *selection, gpointer data)
|
section_selection_changed (GtkTreeSelection *selection, gpointer data)
|
||||||
{
|
{
|
||||||
|
@ -865,9 +885,13 @@ section_selection_changed (GtkTreeSelection *selection, gpointer data)
|
||||||
GtkWidget *shortcut_treeview;
|
GtkWidget *shortcut_treeview;
|
||||||
GtkTreeModel *shortcut_model;
|
GtkTreeModel *shortcut_model;
|
||||||
gchar *description;
|
gchar *description;
|
||||||
|
gint group;
|
||||||
gint i;
|
gint i;
|
||||||
|
|
||||||
gtk_tree_model_get (model, &iter, SECTION_DESCRIPTION_COLUMN, &description, -1);
|
gtk_tree_model_get (model, &iter,
|
||||||
|
SECTION_DESCRIPTION_COLUMN, &description,
|
||||||
|
SECTION_GROUP_COLUMN, &group, -1);
|
||||||
|
|
||||||
keys = g_hash_table_lookup (kb_sections, description);
|
keys = g_hash_table_lookup (kb_sections, description);
|
||||||
if (keys == NULL)
|
if (keys == NULL)
|
||||||
{
|
{
|
||||||
|
@ -875,6 +899,10 @@ section_selection_changed (GtkTreeSelection *selection, gpointer data)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gtk_widget_set_sensitive (WID (builder, "add-toolbutton"),
|
||||||
|
group == BINDING_GROUP_USER);
|
||||||
|
gtk_widget_set_sensitive (WID (builder, "remove-toolbutton"), FALSE);
|
||||||
|
|
||||||
/* Fill the shortcut treeview with the keys for the selected section */
|
/* Fill the shortcut treeview with the keys for the selected section */
|
||||||
shortcut_treeview = GTK_WIDGET (gtk_builder_get_object (builder, "shortcut_treeview"));
|
shortcut_treeview = GTK_WIDGET (gtk_builder_get_object (builder, "shortcut_treeview"));
|
||||||
shortcut_model = gtk_tree_view_get_model (GTK_TREE_VIEW (shortcut_treeview));
|
shortcut_model = gtk_tree_view_get_model (GTK_TREE_VIEW (shortcut_treeview));
|
||||||
|
@ -894,26 +922,6 @@ section_selection_changed (GtkTreeSelection *selection, gpointer data)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
shortcut_selection_changed (GtkTreeSelection *selection, gpointer data)
|
|
||||||
{
|
|
||||||
GtkWidget *button = data;
|
|
||||||
GtkTreeModel *model;
|
|
||||||
GtkTreeIter iter;
|
|
||||||
KeyEntry *key;
|
|
||||||
gboolean can_remove;
|
|
||||||
|
|
||||||
can_remove = FALSE;
|
|
||||||
if (gtk_tree_selection_get_selected (selection, &model, &iter))
|
|
||||||
{
|
|
||||||
gtk_tree_model_get (model, &iter, DETAIL_KEYENTRY_COLUMN, &key, -1);
|
|
||||||
if (key && key->command != NULL && key->editable)
|
|
||||||
can_remove = TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
gtk_widget_set_sensitive (button, can_remove);
|
|
||||||
}
|
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
GtkTreeView *tree_view;
|
GtkTreeView *tree_view;
|
||||||
|
@ -960,10 +968,10 @@ edit_custom_shortcut (KeyEntry *key)
|
||||||
static gboolean
|
static gboolean
|
||||||
remove_custom_shortcut (GtkTreeModel *model, GtkTreeIter *iter)
|
remove_custom_shortcut (GtkTreeModel *model, GtkTreeIter *iter)
|
||||||
{
|
{
|
||||||
GtkTreeIter parent;
|
|
||||||
GConfClient *client;
|
GConfClient *client;
|
||||||
gchar *base;
|
gchar *base;
|
||||||
KeyEntry *key;
|
KeyEntry *key;
|
||||||
|
GPtrArray *keys_array;
|
||||||
|
|
||||||
gtk_tree_model_get (model, iter,
|
gtk_tree_model_get (model, iter,
|
||||||
DETAIL_KEYENTRY_COLUMN, &key,
|
DETAIL_KEYENTRY_COLUMN, &key,
|
||||||
|
@ -990,6 +998,9 @@ remove_custom_shortcut (GtkTreeModel *model, GtkTreeIter *iter)
|
||||||
gconf_client_suggest_sync (client, NULL);
|
gconf_client_suggest_sync (client, NULL);
|
||||||
g_object_unref (client);
|
g_object_unref (client);
|
||||||
|
|
||||||
|
keys_array = g_hash_table_lookup (kb_sections, _("Custom Shortcuts"));
|
||||||
|
g_ptr_array_remove (keys_array, key);
|
||||||
|
|
||||||
g_free (key->gconf_key);
|
g_free (key->gconf_key);
|
||||||
g_free (key->description);
|
g_free (key->description);
|
||||||
g_free (key->desc_gconf_key);
|
g_free (key->desc_gconf_key);
|
||||||
|
@ -997,10 +1008,7 @@ remove_custom_shortcut (GtkTreeModel *model, GtkTreeIter *iter)
|
||||||
g_free (key->cmd_gconf_key);
|
g_free (key->cmd_gconf_key);
|
||||||
g_free (key);
|
g_free (key);
|
||||||
|
|
||||||
gtk_tree_model_iter_parent (model, &parent, iter);
|
gtk_list_store_remove (GTK_LIST_STORE (model), iter);
|
||||||
gtk_tree_store_remove (GTK_TREE_STORE (model), iter);
|
|
||||||
if (!gtk_tree_model_iter_has_child (model, &parent))
|
|
||||||
gtk_tree_store_remove (GTK_TREE_STORE (model), &parent);
|
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
@ -1023,7 +1031,7 @@ update_custom_shortcut (GtkTreeModel *model, GtkTreeIter *iter)
|
||||||
{
|
{
|
||||||
GConfClient *client;
|
GConfClient *client;
|
||||||
|
|
||||||
gtk_tree_store_set (GTK_TREE_STORE (model), iter,
|
gtk_list_store_set (GTK_LIST_STORE (model), iter,
|
||||||
DETAIL_KEYENTRY_COLUMN, key, -1);
|
DETAIL_KEYENTRY_COLUMN, key, -1);
|
||||||
client = gconf_client_get_default ();
|
client = gconf_client_get_default ();
|
||||||
if (key->description != NULL)
|
if (key->description != NULL)
|
||||||
|
@ -1879,6 +1887,7 @@ setup_dialog (CcPanel *panel, GtkBuilder *builder)
|
||||||
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview));
|
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview));
|
||||||
g_signal_connect (selection, "changed",
|
g_signal_connect (selection, "changed",
|
||||||
G_CALLBACK (section_selection_changed), builder);
|
G_CALLBACK (section_selection_changed), builder);
|
||||||
|
section_selection_changed (selection, builder);
|
||||||
|
|
||||||
/* Setup the shortcut treeview */
|
/* Setup the shortcut treeview */
|
||||||
treeview = GTK_TREE_VIEW (gtk_builder_get_object (builder,
|
treeview = GTK_TREE_VIEW (gtk_builder_get_object (builder,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue