Re: [Patch] Keyboard accelerators for actions



On Fr, 03.04.2009 14:00, Alexander Larsson wrote:

>Is there some way we can get told of when the user changes an
>accelerator so that we can queue a writeout of the file maybe?

Unfortunately, not really. There's a signal for the change of the
accelerator map, but I don't know of any way to determine whether this
is a manual change or a programmatic one. So, during startup, dozen of
signal emissions occur. Emissions also occur from time to time during
normal usage, for example when opening a new tab in browser mode.

Attached is a modified patch that saves the accelerator map for every
batch of signal emissions in an idle callback. As said above, it will
happen from time to time even without a manual change of the keyboard
shortcuts, though.

Holger
From a3bc9babf79c40673c8e916c74d129966ced21ab Mon Sep 17 00:00:00 2001
From: Holger Berndt <berndth gmx de>
Date: Sat, 28 Mar 2009 23:14:35 +0100
Subject: [PATCH] save and restore custom keyboard shortcuts

---
 libnautilus-private/nautilus-file-utilities.c |   21 +++++++++++++
 libnautilus-private/nautilus-file-utilities.h |    2 +
 src/nautilus-main.c                           |   38 +++++++++++++++++++++++++
 3 files changed, 61 insertions(+), 0 deletions(-)

diff --git a/libnautilus-private/nautilus-file-utilities.c b/libnautilus-private/nautilus-file-utilities.c
index b3ccc53..755598a 100644
--- a/libnautilus-private/nautilus-file-utilities.c
+++ b/libnautilus-private/nautilus-file-utilities.c
@@ -111,6 +111,27 @@ nautilus_get_user_directory (void)
 	return user_directory;
 }
 
+/**
+ * nautilus_get_accel_map_file:
+ * 
+ * Get the path for the filename containing nautilus accelerator map.
+ * The filename need not exist.
+ *
+ * Return value: the filename path, or NULL if the home directory could not be found
+ **/
+char *
+nautilus_get_accel_map_file (void)
+{
+	const gchar *home;
+
+	home = g_get_home_dir();
+	if (home != NULL) {
+		return g_build_filename (home, ".gnome2/accels/nautilus", NULL);
+	}
+
+	return NULL;
+}
+
 typedef struct {
 	char *type;
 	char *path;
diff --git a/libnautilus-private/nautilus-file-utilities.h b/libnautilus-private/nautilus-file-utilities.h
index 245d106..53c397d 100644
--- a/libnautilus-private/nautilus-file-utilities.h
+++ b/libnautilus-private/nautilus-file-utilities.h
@@ -95,4 +95,6 @@ GFile *  nautilus_find_existing_uri_in_hierarchy     (GFile *location);
 GFile *
 nautilus_find_file_insensitive (GFile *parent, const gchar *name);
 
+char * nautilus_get_accel_map_file (void);
+
 #endif /* NAUTILUS_FILE_UTILITIES_H */
diff --git a/src/nautilus-main.c b/src/nautilus-main.c
index b9b1fd8..fe02e65 100644
--- a/src/nautilus-main.c
+++ b/src/nautilus-main.c
@@ -50,6 +50,7 @@
 #include <libnautilus-private/nautilus-global-preferences.h>
 #include <libnautilus-private/nautilus-lib-self-check-functions.h>
 #include <libnautilus-private/nautilus-icon-names.h>
+#include <libnautilus-private/nautilus-file-utilities.h>
 #include <libxml/parser.h>
 #ifdef HAVE_LOCALE_H
 #include <locale.h>
@@ -64,6 +65,7 @@
 
 /* Keeps track of everyone who wants the main event loop kept active */
 static GSList *event_loop_registrants;
+static gboolean save_of_accel_map_requested = FALSE;
 
 static gboolean
 is_event_loop_needed (void)
@@ -298,6 +300,34 @@ setup_debug_log (void)
 	setup_debug_log_glog ();
 }
 
+
+static 
+gboolean save_accel_map_callback (gpointer data)
+{
+	if (save_of_accel_map_requested) {
+		char *accel_map_filename;
+	 	accel_map_filename = nautilus_get_accel_map_file ();
+	 	if (accel_map_filename) {
+	 		gtk_accel_map_save (accel_map_filename);
+	 		g_free (accel_map_filename);
+	 	}
+		save_of_accel_map_requested = FALSE;
+	}
+
+	return FALSE;
+}
+
+static
+void accel_map_changed_callback (GtkAccelMap *object, gchar *accel_path,
+		guint accel_key, GdkModifierType accel_mods,
+		gpointer user_data)
+{
+	if (!save_of_accel_map_requested) {
+		save_of_accel_map_requested = TRUE;
+		g_idle_add (save_accel_map_callback, FALSE);
+	}
+}
+
 int
 main (int argc, char *argv[])
 {
@@ -319,6 +349,7 @@ main (int argc, char *argv[])
 	GPtrArray *uris_array;
 	GError *error;
 	int i;
+	char *accel_map_filename;
 	
 	const GOptionEntry options[] = {
 #ifndef NAUTILUS_OMIT_SELF_CHECK
@@ -492,6 +523,13 @@ main (int argc, char *argv[])
 			 uris);
 		g_strfreev (uris);
 
+		accel_map_filename = nautilus_get_accel_map_file ();
+		if (accel_map_filename) {
+			gtk_accel_map_load (accel_map_filename);
+			g_free (accel_map_filename);
+		}
+		g_signal_connect (gtk_accel_map_get (), "changed", G_CALLBACK (accel_map_changed_callback), NULL);
+
 		if (is_event_loop_needed ()) {
 			gtk_main ();
 		}
-- 
1.5.6.3

Attachment: signature.asc
Description: PGP signature



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]