[geany/geany] 2559cd: prefs: Remove some global state in keybinding-related code

Colomban Wendling git-noreply at xxxxx
Sun Aug 10 13:47:18 UTC 2014


Branch:      refs/heads/master
Author:      Colomban Wendling <ban at herbesfolles.org>
Committer:   Colomban Wendling <ban at herbesfolles.org>
Date:        Sun, 10 Aug 2014 13:47:18 UTC
Commit:      2559cda95408bd8b32a96baff1918a78ce649c75
             https://github.com/geany/geany/commit/2559cda95408bd8b32a96baff1918a78ce649c75

Log Message:
-----------
prefs: Remove some global state in keybinding-related code

Use gtk_dialog_run() to run the key input dialog, which is modal anyway.
This avoids having to pass the label and the iter around for the dialog
response callback to have them, as they now only are used directly in the
function setting them in the first place.


Modified Paths:
--------------
    src/prefs.c

Modified: src/prefs.c
53 lines changed, 25 insertions(+), 28 deletions(-)
===================================================================
@@ -70,21 +70,19 @@ GeanyToolPrefs tool_prefs;
 
 typedef struct
 {
-	GtkTreeIter iter;
 	GtkTreeStore *store;
 	GtkTreeView *tree;
-	GtkWidget *dialog_label;
 	gboolean edited;
 }
 KbData;
 
-static KbData global_kb_data = { {0}, NULL, NULL, NULL, FALSE };
+static KbData global_kb_data = { NULL, NULL, FALSE };
 static GtkTreeView *various_treeview = NULL;
 
 static GeanyKeyBinding *kb_index(guint gidx, guint kid);
 static void kb_cell_edited_cb(GtkCellRendererText *cellrenderertext, gchar *path, gchar *new_text, KbData *kbdata);
-static gboolean kb_grab_key_dialog_key_press_cb(GtkWidget *dialog, GdkEventKey *event, KbData *kbdata);
-static void kb_grab_key_dialog_response_cb(GtkWidget *dialog, gint response, KbData *kbdata);
+static gboolean kb_grab_key_dialog_key_press_cb(GtkWidget *dialog, GdkEventKey *event, GtkLabel *label);
+static void kb_change_iter_shortcut(KbData *kbdata, GtkTreeIter *iter, const gchar *new_text);
 static gboolean kb_find_duplicate(GtkTreeStore *store, GtkWidget *parent, GtkTreeIter *old_iter,
 		guint key, GdkModifierType mods, const gchar *shortcut);
 static void on_toolbar_show_toggled(GtkToggleButton *togglebutton, gpointer user_data);
@@ -151,15 +149,16 @@ enum
 static void kb_tree_view_change_button_clicked_cb(GtkWidget *button, KbData *kbdata)
 {
 	GtkTreeModel *model;
+	GtkTreeIter iter;
 	GtkTreeSelection *selection;
 	gchar *name;
 
 	selection = gtk_tree_view_get_selection(kbdata->tree);
-	if (gtk_tree_selection_get_selected(selection, &model, &kbdata->iter))
+	if (gtk_tree_selection_get_selected(selection, &model, &iter))
 	{
-		if (gtk_tree_model_iter_has_child(model, &kbdata->iter))
+		if (gtk_tree_model_iter_has_child(model, &iter))
 		{	/* double click on a section to expand or collapse it */
-			GtkTreePath *path = gtk_tree_model_get_path(model, &kbdata->iter);
+			GtkTreePath *path = gtk_tree_model_get_path(model, &iter);
 
 			if (gtk_tree_view_row_expanded(kbdata->tree, path))
 				gtk_tree_view_collapse_row(kbdata->tree, path);
@@ -170,11 +169,12 @@ static void kb_tree_view_change_button_clicked_cb(GtkWidget *button, KbData *kbd
 			return;
 		}
 
-		gtk_tree_model_get(model, &kbdata->iter, KB_TREE_ACTION, &name, -1);
+		gtk_tree_model_get(model, &iter, KB_TREE_ACTION, &name, -1);
 		if (name != NULL)
 		{
 			GtkWidget *dialog;
 			GtkWidget *label;
+			GtkWidget *accel_label;
 			gchar *str;
 
 			dialog = gtk_dialog_new_with_buttons(_("Grab Key"), GTK_WINDOW(ui_widgets.prefs_dialog),
@@ -188,15 +188,22 @@ static void kb_tree_view_change_button_clicked_cb(GtkWidget *button, KbData *kbd
 			gtk_misc_set_padding(GTK_MISC(label), 5, 10);
 			gtk_container_add(GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), label);
 
-			kbdata->dialog_label = gtk_label_new("");
-			gtk_misc_set_padding(GTK_MISC(kbdata->dialog_label), 5, 10);
-			gtk_container_add(GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), kbdata->dialog_label);
+			accel_label = gtk_label_new("");
+			gtk_misc_set_padding(GTK_MISC(accel_label), 5, 10);
+			gtk_container_add(GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), accel_label);
 
 			g_signal_connect(dialog, "key-press-event",
-								G_CALLBACK(kb_grab_key_dialog_key_press_cb), kbdata);
-			g_signal_connect(dialog, "response", G_CALLBACK(kb_grab_key_dialog_response_cb), kbdata);
+								G_CALLBACK(kb_grab_key_dialog_key_press_cb), accel_label);
 
 			gtk_widget_show_all(dialog);
+			if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT)
+			{
+				const gchar *new_text = gtk_label_get_text(GTK_LABEL(accel_label));
+
+				kb_change_iter_shortcut(kbdata, &iter, new_text);
+			}
+			gtk_widget_destroy(dialog);
+
 			g_free(str);
 			g_free(name);
 		}
@@ -1400,11 +1407,13 @@ static void kb_cell_edited_cb(GtkCellRendererText *cellrenderertext,
 }
 
 
-static gboolean kb_grab_key_dialog_key_press_cb(GtkWidget *dialog, GdkEventKey *event, KbData *kbdata)
+static gboolean kb_grab_key_dialog_key_press_cb(GtkWidget *dialog, GdkEventKey *event, GtkLabel *label)
 {
 	gchar *str;
 	guint state;
 
+	g_return_val_if_fail(GTK_IS_LABEL(label), FALSE);
+
 	state = event->state & gtk_accelerator_get_default_mod_mask();
 
 	if (event->keyval == GDK_Escape)
@@ -1412,25 +1421,13 @@ static gboolean kb_grab_key_dialog_key_press_cb(GtkWidget *dialog, GdkEventKey *
 
 	str = gtk_accelerator_name(event->keyval, state);
 
-	gtk_label_set_text(GTK_LABEL(kbdata->dialog_label), str);
+	gtk_label_set_text(label, str);
 	g_free(str);
 
 	return TRUE;
 }
 
 
-static void kb_grab_key_dialog_response_cb(GtkWidget *dialog, gint response, KbData *kbdata)
-{
-	if (response == GTK_RESPONSE_ACCEPT)
-	{
-		const gchar *new_text = gtk_label_get_text(GTK_LABEL(kbdata->dialog_label));
-
-		kb_change_iter_shortcut(kbdata, &kbdata->iter, new_text);
-	}
-	gtk_widget_destroy(dialog);
-}
-
-
 /* test if the entered key combination is already used
  * returns true if cancelling duplicate */
 static gboolean kb_find_duplicate(GtkTreeStore *store, GtkWidget *parent, GtkTreeIter *old_iter,



--------------
This E-Mail was brought to you by github_commit_mail.py (Source: https://github.com/geany/infrastructure).


More information about the Commits mailing list