make editing the shortcut action work for custom bindings
2008-06-01 Jens Granseuer <jensgr@gmx.net> * gnome-keybinding-properties.c: (create_dialog), (accel_set_func), (description_set_func), (keybinding_key_changed), (keybinding_description_changed), (clear_old_model), (append_keys_to_tree), (parse_start_tag), (append_keys_to_tree_from_file), (append_keys_to_tree_from_gconf), (cb_check_for_uniqueness), (accel_edited_callback), (accel_cleared_callback), (description_edited_callback), (real_start_editing_cb), (start_editing_cb), (setup_dialog): make editing the shortcut action work for custom bindings svn path=/trunk/; revision=8740
This commit is contained in:
parent
9cccf17fe8
commit
727f99a6a9
2 changed files with 173 additions and 71 deletions
|
@ -1,3 +1,15 @@
|
||||||
|
2008-06-01 Jens Granseuer <jensgr@gmx.net>
|
||||||
|
|
||||||
|
* gnome-keybinding-properties.c: (create_dialog), (accel_set_func),
|
||||||
|
(description_set_func), (keybinding_key_changed),
|
||||||
|
(keybinding_description_changed), (clear_old_model),
|
||||||
|
(append_keys_to_tree), (parse_start_tag),
|
||||||
|
(append_keys_to_tree_from_file), (append_keys_to_tree_from_gconf),
|
||||||
|
(cb_check_for_uniqueness), (accel_edited_callback),
|
||||||
|
(accel_cleared_callback), (description_edited_callback),
|
||||||
|
(real_start_editing_cb), (start_editing_cb), (setup_dialog):
|
||||||
|
make editing the shortcut action work for custom bindings
|
||||||
|
|
||||||
2008-05-31 Jens Granseuer <jensgr@gmx.net>
|
2008-05-31 Jens Granseuer <jensgr@gmx.net>
|
||||||
|
|
||||||
* gnome-keybinding-properties.c: (append_keys_to_tree),
|
* gnome-keybinding-properties.c: (append_keys_to_tree),
|
||||||
|
|
|
@ -39,9 +39,9 @@ typedef enum {
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
char *name;
|
char *name;
|
||||||
char *description;
|
|
||||||
int value;
|
int value;
|
||||||
char *key;
|
char *key;
|
||||||
|
char *description_name;
|
||||||
Comparison comparison;
|
Comparison comparison;
|
||||||
} KeyListEntry;
|
} KeyListEntry;
|
||||||
|
|
||||||
|
@ -60,8 +60,11 @@ typedef struct
|
||||||
EggVirtualModifierType mask;
|
EggVirtualModifierType mask;
|
||||||
gboolean editable;
|
gboolean editable;
|
||||||
GtkTreeModel *model;
|
GtkTreeModel *model;
|
||||||
guint gconf_cnxn;
|
|
||||||
char *description;
|
char *description;
|
||||||
|
char *desc_gconf_key;
|
||||||
|
gboolean desc_editable;
|
||||||
|
guint gconf_cnxn;
|
||||||
|
guint gconf_cnxn_desc;
|
||||||
} KeyEntry;
|
} KeyEntry;
|
||||||
|
|
||||||
static gboolean block_accels = FALSE;
|
static gboolean block_accels = FALSE;
|
||||||
|
@ -69,13 +72,8 @@ static gboolean block_accels = FALSE;
|
||||||
static GladeXML *
|
static GladeXML *
|
||||||
create_dialog (void)
|
create_dialog (void)
|
||||||
{
|
{
|
||||||
GladeXML *dialog;
|
return glade_xml_new (GNOMECC_GLADE_DIR "/gnome-keybinding-properties.glade",
|
||||||
|
"gnome-keybinding-dialog", NULL);
|
||||||
dialog = glade_xml_new (GNOMECC_GLADE_DIR "/gnome-keybinding-properties.glade", "gnome-keybinding-dialog", NULL);
|
|
||||||
if (!dialog)
|
|
||||||
dialog = glade_xml_new ("gnome-keybinding-properties.glade", "gnome-keybinding-dialog", NULL);
|
|
||||||
|
|
||||||
return dialog;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static char*
|
static char*
|
||||||
|
@ -130,11 +128,11 @@ accel_set_func (GtkTreeViewColumn *tree_column,
|
||||||
-1);
|
-1);
|
||||||
|
|
||||||
if (key_entry == NULL)
|
if (key_entry == NULL)
|
||||||
g_object_set (G_OBJECT (cell),
|
g_object_set (cell,
|
||||||
"visible", FALSE,
|
"visible", FALSE,
|
||||||
NULL);
|
NULL);
|
||||||
else if (! key_entry->editable)
|
else if (! key_entry->editable)
|
||||||
g_object_set (G_OBJECT (cell),
|
g_object_set (cell,
|
||||||
"visible", TRUE,
|
"visible", TRUE,
|
||||||
"editable", FALSE,
|
"editable", FALSE,
|
||||||
"accel_key", key_entry->keyval,
|
"accel_key", key_entry->keyval,
|
||||||
|
@ -143,7 +141,7 @@ accel_set_func (GtkTreeViewColumn *tree_column,
|
||||||
"style", PANGO_STYLE_ITALIC,
|
"style", PANGO_STYLE_ITALIC,
|
||||||
NULL);
|
NULL);
|
||||||
else
|
else
|
||||||
g_object_set (G_OBJECT (cell),
|
g_object_set (cell,
|
||||||
"visible", TRUE,
|
"visible", TRUE,
|
||||||
"editable", TRUE,
|
"editable", TRUE,
|
||||||
"accel_key", key_entry->keyval,
|
"accel_key", key_entry->keyval,
|
||||||
|
@ -153,6 +151,27 @@ accel_set_func (GtkTreeViewColumn *tree_column,
|
||||||
NULL);
|
NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
description_set_func (GtkTreeViewColumn *tree_column,
|
||||||
|
GtkCellRenderer *cell,
|
||||||
|
GtkTreeModel *model,
|
||||||
|
GtkTreeIter *iter,
|
||||||
|
gpointer data)
|
||||||
|
{
|
||||||
|
KeyEntry *key_entry;
|
||||||
|
|
||||||
|
gtk_tree_model_get (model, iter,
|
||||||
|
KEYENTRY_COLUMN, &key_entry,
|
||||||
|
-1);
|
||||||
|
|
||||||
|
if (key_entry != NULL)
|
||||||
|
g_object_set (cell,
|
||||||
|
"editable", key_entry->desc_editable,
|
||||||
|
"text", key_entry->description != NULL ?
|
||||||
|
key_entry->description : _("<Unknown Action>"),
|
||||||
|
NULL);
|
||||||
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
keybinding_key_changed_foreach (GtkTreeModel *model,
|
keybinding_key_changed_foreach (GtkTreeModel *model,
|
||||||
GtkTreePath *path,
|
GtkTreePath *path,
|
||||||
|
@ -184,8 +203,8 @@ keybinding_key_changed (GConfClient *client,
|
||||||
KeyEntry *key_entry;
|
KeyEntry *key_entry;
|
||||||
const gchar *key_value;
|
const gchar *key_value;
|
||||||
|
|
||||||
key_entry = (KeyEntry *)user_data;
|
key_entry = (KeyEntry *) user_data;
|
||||||
key_value = gconf_value_get_string (entry->value);
|
key_value = entry->value ? gconf_value_get_string (entry->value) : NULL;
|
||||||
|
|
||||||
binding_from_string (key_value, &key_entry->keyval, &key_entry->keycode, &key_entry->mask);
|
binding_from_string (key_value, &key_entry->keyval, &key_entry->keycode, &key_entry->mask);
|
||||||
key_entry->editable = gconf_entry_get_is_writable (entry);
|
key_entry->editable = gconf_entry_get_is_writable (entry);
|
||||||
|
@ -194,6 +213,26 @@ keybinding_key_changed (GConfClient *client,
|
||||||
gtk_tree_model_foreach (key_entry->model, keybinding_key_changed_foreach, key_entry);
|
gtk_tree_model_foreach (key_entry->model, keybinding_key_changed_foreach, key_entry);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
keybinding_description_changed (GConfClient *client,
|
||||||
|
guint cnxn_id,
|
||||||
|
GConfEntry *entry,
|
||||||
|
gpointer user_data)
|
||||||
|
{
|
||||||
|
KeyEntry *key_entry;
|
||||||
|
const gchar *key_value;
|
||||||
|
|
||||||
|
key_entry = (KeyEntry *) user_data;
|
||||||
|
key_value = entry->value ? gconf_value_get_string (entry->value) : NULL;
|
||||||
|
|
||||||
|
g_free (key_entry->description);
|
||||||
|
key_entry->description = key_value ? g_strdup (key_value) : NULL;
|
||||||
|
key_entry->desc_editable = gconf_entry_get_is_writable (entry);
|
||||||
|
|
||||||
|
/* update the model */
|
||||||
|
gtk_tree_model_foreach (key_entry->model, keybinding_key_changed_foreach, key_entry);
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
keyentry_sort_func (GtkTreeModel *model,
|
keyentry_sort_func (GtkTreeModel *model,
|
||||||
GtkTreeIter *a,
|
GtkTreeIter *a,
|
||||||
|
@ -299,9 +338,13 @@ clear_old_model (GladeXML *dialog)
|
||||||
|
|
||||||
if (key_entry != NULL)
|
if (key_entry != NULL)
|
||||||
{
|
{
|
||||||
|
gconf_client_remove_dir (client, key_entry->gconf_key, NULL);
|
||||||
gconf_client_notify_remove (client, key_entry->gconf_cnxn);
|
gconf_client_notify_remove (client, key_entry->gconf_cnxn);
|
||||||
|
if (key_entry->gconf_cnxn_desc != 0)
|
||||||
|
gconf_client_notify_remove (client, key_entry->gconf_cnxn_desc);
|
||||||
g_free (key_entry->gconf_key);
|
g_free (key_entry->gconf_key);
|
||||||
g_free (key_entry->description);
|
g_free (key_entry->description);
|
||||||
|
g_free (key_entry->desc_gconf_key);
|
||||||
g_free (key_entry);
|
g_free (key_entry);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -451,9 +494,9 @@ append_keys_to_tree (GladeXML *dialog,
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (keys_list[j].description != NULL)
|
if (keys_list[j].description_name != NULL)
|
||||||
{
|
{
|
||||||
description = g_strdup (keys_list[j].description);
|
description = gconf_client_get_string (client, keys_list[j].description_name, NULL);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -474,38 +517,40 @@ append_keys_to_tree (GladeXML *dialog,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
key_value = gconf_client_get_string (client, key_string, NULL);
|
|
||||||
|
|
||||||
key_entry = g_new0 (KeyEntry, 1);
|
key_entry = g_new0 (KeyEntry, 1);
|
||||||
key_entry->gconf_key = g_strdup (key_string);
|
key_entry->gconf_key = g_strdup (key_string);
|
||||||
key_entry->description = description;
|
|
||||||
key_entry->editable = gconf_entry_get_is_writable (entry);
|
key_entry->editable = gconf_entry_get_is_writable (entry);
|
||||||
key_entry->model = model;
|
key_entry->model = model;
|
||||||
|
key_entry->description = description;
|
||||||
|
if (keys_list[j].description_name != NULL)
|
||||||
|
{
|
||||||
|
key_entry->desc_gconf_key = g_strdup (keys_list[j].description_name);
|
||||||
|
key_entry->desc_editable = gconf_client_key_is_writable (client, key_entry->desc_gconf_key, NULL);
|
||||||
|
key_entry->gconf_cnxn_desc = gconf_client_notify_add (client,
|
||||||
|
key_entry->desc_gconf_key,
|
||||||
|
(GConfClientNotifyFunc) &keybinding_description_changed,
|
||||||
|
key_entry, NULL, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
gconf_client_add_dir (client, key_string, GCONF_CLIENT_PRELOAD_ONELEVEL, NULL);
|
gconf_client_add_dir (client, key_string, GCONF_CLIENT_PRELOAD_ONELEVEL, NULL);
|
||||||
key_entry->gconf_cnxn = gconf_client_notify_add (client,
|
key_entry->gconf_cnxn = gconf_client_notify_add (client,
|
||||||
key_string,
|
key_string,
|
||||||
(GConfClientNotifyFunc) &keybinding_key_changed,
|
(GConfClientNotifyFunc) &keybinding_key_changed,
|
||||||
key_entry, NULL, NULL);
|
key_entry, NULL, NULL);
|
||||||
|
|
||||||
|
key_value = gconf_client_get_string (client, key_string, NULL);
|
||||||
binding_from_string (key_value, &key_entry->keyval, &key_entry->keycode, &key_entry->mask);
|
binding_from_string (key_value, &key_entry->keyval, &key_entry->keycode, &key_entry->mask);
|
||||||
g_free (key_value);
|
g_free (key_value);
|
||||||
|
|
||||||
gconf_entry_free (entry);
|
gconf_entry_free (entry);
|
||||||
ensure_scrollbar (dialog, i);
|
ensure_scrollbar (dialog, i);
|
||||||
|
|
||||||
i++;
|
++i;
|
||||||
gtk_tree_store_append (GTK_TREE_STORE (model), &iter, &parent_iter);
|
gtk_tree_store_append (GTK_TREE_STORE (model), &iter, &parent_iter);
|
||||||
if (key_entry->description != NULL)
|
/* we use the DESCRIPTION_COLUMN only for the section headers */
|
||||||
gtk_tree_store_set (GTK_TREE_STORE (model), &iter,
|
gtk_tree_store_set (GTK_TREE_STORE (model), &iter,
|
||||||
DESCRIPTION_COLUMN,
|
KEYENTRY_COLUMN, key_entry,
|
||||||
key_entry->description,
|
-1);
|
||||||
KEYENTRY_COLUMN, key_entry,
|
|
||||||
-1);
|
|
||||||
else
|
|
||||||
gtk_tree_store_set (GTK_TREE_STORE (model), &iter,
|
|
||||||
DESCRIPTION_COLUMN, _("<Unknown Action>"),
|
|
||||||
KEYENTRY_COLUMN, key_entry,
|
|
||||||
-1);
|
|
||||||
gtk_tree_view_expand_all (GTK_TREE_VIEW (WID ("shortcut_treeview")));
|
gtk_tree_view_expand_all (GTK_TREE_VIEW (WID ("shortcut_treeview")));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -624,7 +669,7 @@ parse_start_tag (GMarkupParseContext *ctx,
|
||||||
return;
|
return;
|
||||||
|
|
||||||
key.name = g_strdup (name);
|
key.name = g_strdup (name);
|
||||||
key.description = NULL;
|
key.description_name = NULL;
|
||||||
key.value = value;
|
key.value = value;
|
||||||
if (gconf_key)
|
if (gconf_key)
|
||||||
key.key = g_strdup (gconf_key);
|
key.key = g_strdup (gconf_key);
|
||||||
|
@ -691,7 +736,7 @@ append_keys_to_tree_from_file (GladeXML *dialog,
|
||||||
|
|
||||||
/* Empty KeyListEntry to end the array */
|
/* Empty KeyListEntry to end the array */
|
||||||
key.name = NULL;
|
key.name = NULL;
|
||||||
key.description = NULL;
|
key.description_name = NULL;
|
||||||
key.key = NULL;
|
key.key = NULL;
|
||||||
key.value = 0;
|
key.value = 0;
|
||||||
key.comparison = COMPARISON_NONE;
|
key.comparison = COMPARISON_NONE;
|
||||||
|
@ -735,14 +780,8 @@ append_keys_to_tree_from_gconf (GladeXML *dialog, const gchar *gconf_path)
|
||||||
|
|
||||||
for (l = custom_list; l != NULL; l = l->next)
|
for (l = custom_list; l != NULL; l = l->next)
|
||||||
{
|
{
|
||||||
gchar *gconf_key;
|
|
||||||
|
|
||||||
key.name = g_strconcat (l->data, "/binding", NULL);
|
key.name = g_strconcat (l->data, "/binding", NULL);
|
||||||
|
key.description_name = g_strconcat (l->data, "/action", NULL);
|
||||||
gconf_key = g_strconcat (l->data, "/action", NULL);
|
|
||||||
key.description = gconf_client_get_string (client, gconf_key, NULL);
|
|
||||||
g_free (gconf_key);
|
|
||||||
|
|
||||||
g_array_append_val (entries, key);
|
g_array_append_val (entries, key);
|
||||||
|
|
||||||
g_free (l->data);
|
g_free (l->data);
|
||||||
|
@ -758,7 +797,7 @@ append_keys_to_tree_from_gconf (GladeXML *dialog, const gchar *gconf_path)
|
||||||
|
|
||||||
/* Empty KeyListEntry to end the array */
|
/* Empty KeyListEntry to end the array */
|
||||||
key.name = NULL;
|
key.name = NULL;
|
||||||
key.description = NULL;
|
key.description_name = NULL;
|
||||||
g_array_append_val (entries, key);
|
g_array_append_val (entries, key);
|
||||||
|
|
||||||
keys = (KeyListEntry *) entries->data;
|
keys = (KeyListEntry *) entries->data;
|
||||||
|
@ -766,7 +805,7 @@ append_keys_to_tree_from_gconf (GladeXML *dialog, const gchar *gconf_path)
|
||||||
for (i = 0; i < entries->len; ++i)
|
for (i = 0; i < entries->len; ++i)
|
||||||
{
|
{
|
||||||
g_free (keys[i].name);
|
g_free (keys[i].name);
|
||||||
g_free (keys[i].description);
|
g_free (keys[i].description_name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -848,6 +887,8 @@ cb_check_for_uniqueness (GtkTreeModel *model,
|
||||||
new_key->editable = FALSE;
|
new_key->editable = FALSE;
|
||||||
new_key->gconf_key = element->gconf_key;
|
new_key->gconf_key = element->gconf_key;
|
||||||
new_key->description = element->description;
|
new_key->description = element->description;
|
||||||
|
new_key->desc_gconf_key = element->desc_gconf_key;
|
||||||
|
new_key->desc_editable = element->desc_editable;
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -956,7 +997,7 @@ accel_edited_callback (GtkCellRendererText *cell,
|
||||||
GTK_MESSAGE_WARNING,
|
GTK_MESSAGE_WARNING,
|
||||||
GTK_BUTTONS_CANCEL,
|
GTK_BUTTONS_CANCEL,
|
||||||
_("The shortcut \"%s\" cannot be used because it will become impossible to type using this key.\n"
|
_("The shortcut \"%s\" cannot be used because it will become impossible to type using this key.\n"
|
||||||
"Please try with a key such as Control, Alt or Shift at the same time.\n"),
|
"Please try with a key such as Control, Alt or Shift at the same time."),
|
||||||
name);
|
name);
|
||||||
|
|
||||||
g_free (name);
|
g_free (name);
|
||||||
|
@ -984,7 +1025,7 @@ accel_edited_callback (GtkCellRendererText *cell,
|
||||||
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\"\n"),
|
_("The shortcut \"%s\" is already used for:\n \"%s\""),
|
||||||
name,
|
name,
|
||||||
tmp_key.description ?
|
tmp_key.description ?
|
||||||
tmp_key.description : tmp_key.gconf_key);
|
tmp_key.description : tmp_key.gconf_key);
|
||||||
|
@ -1000,13 +1041,13 @@ accel_edited_callback (GtkCellRendererText *cell,
|
||||||
|
|
||||||
str = binding_name (keyval, keycode, mask, FALSE);
|
str = binding_name (keyval, keycode, mask, FALSE);
|
||||||
|
|
||||||
client = gconf_client_get_default();
|
client = gconf_client_get_default ();
|
||||||
gconf_client_set_string (client,
|
gconf_client_set_string (client,
|
||||||
key_entry->gconf_key,
|
key_entry->gconf_key,
|
||||||
str,
|
str,
|
||||||
&err);
|
&err);
|
||||||
g_free (str);
|
g_free (str);
|
||||||
g_object_unref (G_OBJECT (client));
|
g_object_unref (client);
|
||||||
|
|
||||||
if (err != NULL)
|
if (err != NULL)
|
||||||
{
|
{
|
||||||
|
@ -1016,7 +1057,7 @@ accel_edited_callback (GtkCellRendererText *cell,
|
||||||
GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL,
|
GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL,
|
||||||
GTK_MESSAGE_WARNING,
|
GTK_MESSAGE_WARNING,
|
||||||
GTK_BUTTONS_OK,
|
GTK_BUTTONS_OK,
|
||||||
_("Error setting new accelerator in configuration database: %s\n"),
|
_("Error setting new accelerator in configuration database: %s"),
|
||||||
err->message);
|
err->message);
|
||||||
gtk_dialog_run (GTK_DIALOG (dialog));
|
gtk_dialog_run (GTK_DIALOG (dialog));
|
||||||
|
|
||||||
|
@ -1058,7 +1099,7 @@ accel_cleared_callback (GtkCellRendererText *cell,
|
||||||
key_entry->gconf_key,
|
key_entry->gconf_key,
|
||||||
"disabled",
|
"disabled",
|
||||||
&err);
|
&err);
|
||||||
g_object_unref (G_OBJECT (client));
|
g_object_unref (client);
|
||||||
|
|
||||||
if (err != NULL)
|
if (err != NULL)
|
||||||
{
|
{
|
||||||
|
@ -1068,7 +1109,7 @@ accel_cleared_callback (GtkCellRendererText *cell,
|
||||||
GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL,
|
GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL,
|
||||||
GTK_MESSAGE_WARNING,
|
GTK_MESSAGE_WARNING,
|
||||||
GTK_BUTTONS_OK,
|
GTK_BUTTONS_OK,
|
||||||
_("Error unsetting accelerator in configuration database: %s\n"),
|
_("Error unsetting accelerator in configuration database: %s"),
|
||||||
err->message);
|
err->message);
|
||||||
gtk_dialog_run (GTK_DIALOG (dialog));
|
gtk_dialog_run (GTK_DIALOG (dialog));
|
||||||
|
|
||||||
|
@ -1078,11 +1119,44 @@ accel_cleared_callback (GtkCellRendererText *cell,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
description_edited_callback (GtkCellRendererText *renderer,
|
||||||
|
gchar *path_string,
|
||||||
|
gchar *new_text,
|
||||||
|
gpointer user_data)
|
||||||
|
{
|
||||||
|
GConfClient *client;
|
||||||
|
GtkTreeView *view = GTK_TREE_VIEW (user_data);
|
||||||
|
GtkTreeModel *model;
|
||||||
|
GtkTreePath *path = gtk_tree_path_new_from_string (path_string);
|
||||||
|
GtkTreeIter iter;
|
||||||
|
KeyEntry *key_entry;
|
||||||
|
|
||||||
|
model = gtk_tree_view_get_model (view);
|
||||||
|
gtk_tree_model_get_iter (model, &iter, path);
|
||||||
|
gtk_tree_path_free (path);
|
||||||
|
|
||||||
|
gtk_tree_model_get (model, &iter,
|
||||||
|
KEYENTRY_COLUMN, &key_entry,
|
||||||
|
-1);
|
||||||
|
|
||||||
|
/* sanity check */
|
||||||
|
if (key_entry == NULL || key_entry->desc_gconf_key == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
client = gconf_client_get_default ();
|
||||||
|
if (!gconf_client_set_string (client, key_entry->desc_gconf_key, new_text, NULL))
|
||||||
|
key_entry->desc_editable = FALSE;
|
||||||
|
|
||||||
|
g_object_unref (client);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
GtkTreeView *tree_view;
|
GtkTreeView *tree_view;
|
||||||
GtkTreePath *path;
|
GtkTreePath *path;
|
||||||
|
GtkTreeViewColumn *column;
|
||||||
} IdleData;
|
} IdleData;
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
|
@ -1091,9 +1165,8 @@ real_start_editing_cb (IdleData *idle_data)
|
||||||
gtk_widget_grab_focus (GTK_WIDGET (idle_data->tree_view));
|
gtk_widget_grab_focus (GTK_WIDGET (idle_data->tree_view));
|
||||||
gtk_tree_view_set_cursor (idle_data->tree_view,
|
gtk_tree_view_set_cursor (idle_data->tree_view,
|
||||||
idle_data->path,
|
idle_data->path,
|
||||||
gtk_tree_view_get_column (idle_data->tree_view, 1),
|
idle_data->column,
|
||||||
TRUE);
|
TRUE);
|
||||||
|
|
||||||
gtk_tree_path_free (idle_data->path);
|
gtk_tree_path_free (idle_data->path);
|
||||||
g_free (idle_data);
|
g_free (idle_data);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
@ -1120,6 +1193,7 @@ start_editing_cb (GtkTreeView *tree_view,
|
||||||
gpointer user_data)
|
gpointer user_data)
|
||||||
{
|
{
|
||||||
GtkTreePath *path;
|
GtkTreePath *path;
|
||||||
|
GtkTreeViewColumn *column;
|
||||||
|
|
||||||
if (event->window != gtk_tree_view_get_bin_window (tree_view))
|
if (event->window != gtk_tree_view_get_bin_window (tree_view))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
@ -1127,10 +1201,13 @@ start_editing_cb (GtkTreeView *tree_view,
|
||||||
if (gtk_tree_view_get_path_at_pos (tree_view,
|
if (gtk_tree_view_get_path_at_pos (tree_view,
|
||||||
(gint) event->x,
|
(gint) event->x,
|
||||||
(gint) event->y,
|
(gint) event->y,
|
||||||
&path, NULL,
|
&path, &column,
|
||||||
NULL, NULL))
|
NULL, NULL))
|
||||||
{
|
{
|
||||||
IdleData *idle_data;
|
IdleData *idle_data;
|
||||||
|
GtkTreeModel *model;
|
||||||
|
GtkTreeIter iter;
|
||||||
|
KeyEntry *key;
|
||||||
|
|
||||||
if (gtk_tree_path_get_depth (path) == 1)
|
if (gtk_tree_path_get_depth (path) == 1)
|
||||||
{
|
{
|
||||||
|
@ -1138,10 +1215,20 @@ start_editing_cb (GtkTreeView *tree_view,
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
model = gtk_tree_view_get_model (tree_view);
|
||||||
|
gtk_tree_model_get_iter (model, &iter, path);
|
||||||
|
gtk_tree_model_get (model, &iter,
|
||||||
|
KEYENTRY_COLUMN, &key,
|
||||||
|
-1);
|
||||||
|
|
||||||
idle_data = g_new (IdleData, 1);
|
idle_data = g_new (IdleData, 1);
|
||||||
idle_data->tree_view = tree_view;
|
idle_data->tree_view = tree_view;
|
||||||
idle_data->path = path;
|
idle_data->path = path;
|
||||||
g_signal_stop_emission_by_name (G_OBJECT (tree_view), "button_press_event");
|
/* if only the accel can be edited on the selected row
|
||||||
|
* always select the accel column */
|
||||||
|
idle_data->column = key->desc_editable ? column :
|
||||||
|
gtk_tree_view_get_column (tree_view, 1);
|
||||||
|
g_signal_stop_emission_by_name (tree_view, "button_press_event");
|
||||||
g_idle_add ((GSourceFunc) real_start_editing_cb, idle_data);
|
g_idle_add ((GSourceFunc) real_start_editing_cb, idle_data);
|
||||||
block_accels = TRUE;
|
block_accels = TRUE;
|
||||||
}
|
}
|
||||||
|
@ -1188,49 +1275,52 @@ setup_dialog (GladeXML *dialog)
|
||||||
GtkCellRenderer *renderer;
|
GtkCellRenderer *renderer;
|
||||||
GtkTreeViewColumn *column;
|
GtkTreeViewColumn *column;
|
||||||
GtkWidget *widget;
|
GtkWidget *widget;
|
||||||
|
GtkTreeView *treeview = GTK_TREE_VIEW (WID ("shortcut_treeview"));
|
||||||
gchar *wm_name;
|
gchar *wm_name;
|
||||||
|
|
||||||
client = gconf_client_get_default ();
|
client = gconf_client_get_default ();
|
||||||
|
|
||||||
g_signal_connect (GTK_TREE_VIEW (WID ("shortcut_treeview")),
|
g_signal_connect (treeview, "button_press_event",
|
||||||
"button_press_event",
|
|
||||||
G_CALLBACK (start_editing_cb), NULL);
|
G_CALLBACK (start_editing_cb), NULL);
|
||||||
g_signal_connect (GTK_TREE_VIEW (WID ("shortcut_treeview")),
|
g_signal_connect (treeview, "row-activated",
|
||||||
"row-activated",
|
|
||||||
G_CALLBACK (start_editing_kb_cb), NULL);
|
G_CALLBACK (start_editing_kb_cb), NULL);
|
||||||
|
|
||||||
|
renderer = gtk_cell_renderer_text_new ();
|
||||||
|
|
||||||
|
g_signal_connect (renderer, "edited",
|
||||||
|
G_CALLBACK (description_edited_callback),
|
||||||
|
treeview);
|
||||||
|
|
||||||
column = gtk_tree_view_column_new_with_attributes (_("Action"),
|
column = gtk_tree_view_column_new_with_attributes (_("Action"),
|
||||||
gtk_cell_renderer_text_new (),
|
renderer,
|
||||||
"text", DESCRIPTION_COLUMN,
|
"text", DESCRIPTION_COLUMN,
|
||||||
NULL);
|
NULL);
|
||||||
|
gtk_tree_view_column_set_cell_data_func (column, renderer, description_set_func, NULL, NULL);
|
||||||
gtk_tree_view_column_set_resizable (column, FALSE);
|
gtk_tree_view_column_set_resizable (column, FALSE);
|
||||||
|
|
||||||
gtk_tree_view_append_column (GTK_TREE_VIEW (WID ("shortcut_treeview")), column);
|
gtk_tree_view_append_column (treeview, column);
|
||||||
gtk_tree_view_column_set_sort_column_id (column, DESCRIPTION_COLUMN);
|
gtk_tree_view_column_set_sort_column_id (column, DESCRIPTION_COLUMN);
|
||||||
|
|
||||||
renderer = (GtkCellRenderer *) g_object_new (EGG_TYPE_CELL_RENDERER_KEYS,
|
renderer = (GtkCellRenderer *) g_object_new (EGG_TYPE_CELL_RENDERER_KEYS,
|
||||||
"editable", TRUE,
|
|
||||||
"accel_mode", EGG_CELL_RENDERER_KEYS_MODE_X,
|
"accel_mode", EGG_CELL_RENDERER_KEYS_MODE_X,
|
||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
g_signal_connect (G_OBJECT (renderer),
|
g_signal_connect (renderer, "accel_edited",
|
||||||
"accel_edited",
|
|
||||||
G_CALLBACK (accel_edited_callback),
|
G_CALLBACK (accel_edited_callback),
|
||||||
WID ("shortcut_treeview"));
|
treeview);
|
||||||
|
|
||||||
g_signal_connect (G_OBJECT (renderer),
|
g_signal_connect (renderer, "accel_cleared",
|
||||||
"accel_cleared",
|
|
||||||
G_CALLBACK (accel_cleared_callback),
|
G_CALLBACK (accel_cleared_callback),
|
||||||
WID ("shortcut_treeview"));
|
treeview);
|
||||||
|
|
||||||
column = gtk_tree_view_column_new_with_attributes (_("Shortcut"), renderer, NULL);
|
column = gtk_tree_view_column_new_with_attributes (_("Shortcut"), renderer, NULL);
|
||||||
gtk_tree_view_column_set_cell_data_func (column, renderer, accel_set_func, NULL, NULL);
|
gtk_tree_view_column_set_cell_data_func (column, renderer, accel_set_func, NULL, NULL);
|
||||||
gtk_tree_view_column_set_resizable (column, FALSE);
|
gtk_tree_view_column_set_resizable (column, FALSE);
|
||||||
|
|
||||||
gtk_tree_view_append_column (GTK_TREE_VIEW (WID ("shortcut_treeview")), column);
|
gtk_tree_view_append_column (treeview, column);
|
||||||
gtk_tree_view_column_set_sort_column_id (column, KEYENTRY_COLUMN);
|
gtk_tree_view_column_set_sort_column_id (column, KEYENTRY_COLUMN);
|
||||||
|
|
||||||
gconf_client_add_dir (client, "/apps/gnome_keybinding_properties", GCONF_CLIENT_PRELOAD_ONELEVEL, NULL);
|
gconf_client_add_dir (client, GCONF_BINDING_DIR, GCONF_CLIENT_PRELOAD_ONELEVEL, NULL);
|
||||||
gconf_client_add_dir (client, "/apps/metacity/general", GCONF_CLIENT_PRELOAD_ONELEVEL, NULL);
|
gconf_client_add_dir (client, "/apps/metacity/general", GCONF_CLIENT_PRELOAD_ONELEVEL, NULL);
|
||||||
gconf_client_notify_add (client,
|
gconf_client_notify_add (client,
|
||||||
"/apps/metacity/general/num_workspaces",
|
"/apps/metacity/general/num_workspaces",
|
||||||
|
@ -1247,8 +1337,8 @@ setup_dialog (GladeXML *dialog)
|
||||||
capplet_set_icon (widget, "gnome-settings-keybindings");
|
capplet_set_icon (widget, "gnome-settings-keybindings");
|
||||||
gtk_widget_show (widget);
|
gtk_widget_show (widget);
|
||||||
|
|
||||||
g_signal_connect (G_OBJECT (widget), "key_press_event", G_CALLBACK (maybe_block_accels), NULL);
|
g_signal_connect (widget, "key_press_event", G_CALLBACK (maybe_block_accels), NULL);
|
||||||
g_signal_connect (G_OBJECT (widget), "response", G_CALLBACK (cb_dialog_response), dialog);
|
g_signal_connect (widget, "response", G_CALLBACK (cb_dialog_response), dialog);
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue