[Xfce4-commits] [apps/xfdashboard] 01/03: Changed loading key bindings to one-or-nothing to incremental loading.
noreply at xfce.org
noreply at xfce.org
Fri May 4 12:24:09 CEST 2018
This is an automated email from the git hooks/post-receive script.
n o m a d p u s h e d a c o m m i t t o b r a n c h m a s t e r
in repository apps/xfdashboard.
commit 518691b1472640b0fa18de776b8bc86795e3c341
Author: Stephan Haller <nomad at froevel.de>
Date: Fri May 4 09:42:58 2018 +0200
Changed loading key bindings to one-or-nothing to incremental loading.
The default behaviour how bindings are loaded has been changed. Previsouly it tried to the first bindings configuration file from these location (in this order): The full path defined at environment variable XFDASHBOARD_BINDINGS_POOL_FILE (if debug mode was enable at configure script), the user's configuration folder (usually $HOME/.config/xfdashboard) and at last the system-wide folder. Now it tries to laod the system-wide one first, then the one at user's configuration folder and me [...]
This commit addresses issue GH #167
---
libxfdashboard/bindings-pool.c | 187 +++++++++++++++++++++++++++++------------
libxfdashboard/bindings-pool.h | 3 +-
2 files changed, 134 insertions(+), 56 deletions(-)
diff --git a/libxfdashboard/bindings-pool.c b/libxfdashboard/bindings-pool.c
index b9983bb..79015e4 100644
--- a/libxfdashboard/bindings-pool.c
+++ b/libxfdashboard/bindings-pool.c
@@ -307,7 +307,7 @@ static gboolean _xfdashboard_bindings_pool_parse_keycode(const gchar *inText,
if(!key && !modifiers)
{
- g_warning(_("Invalid key-binding '%s' as either a key nor a modifier was assigned."), inText);
+ g_warning(_("Invalid key-binding '%s' as neither a key nor a modifier was assigned."), inText);
return(FALSE);
}
@@ -784,6 +784,26 @@ static void _xfdashboard_bindings_pool_parse_document_end(GMarkupParseContext *i
g_markup_parse_context_pop(inContext);
}
+/* Merge bindings from one hash-table into another one */
+static void _xfdashboard_bindings_pool_merge_bindings(gpointer inKey,
+ gpointer inValue,
+ gpointer inUserData)
+{
+ GHashTable *targetBindingsHashTable;
+ XfdashboardBinding *binding;
+
+ g_return_if_fail(XFDASHBOARD_IS_BINDING(inKey));
+ g_return_if_fail(inUserData);
+
+ targetBindingsHashTable=(GHashTable*)inUserData;
+ binding=XFDASHBOARD_BINDING(inKey);
+
+ /* Insert binding into target hash table which will either insert a new key
+ * with the binding value or replaces the binding value at the existing key.
+ */
+ g_hash_table_insert(targetBindingsHashTable, g_object_ref(binding), inValue);
+}
+
/* Load bindings from XML file */
static gboolean _xfdashboard_bindings_pool_load_bindings_from_file(XfdashboardBindingsPool *self,
const gchar *inPath,
@@ -914,17 +934,19 @@ static gboolean _xfdashboard_bindings_pool_load_bindings_from_file(XfdashboardBi
/* Handle collected data if parsing was successful */
if(success)
{
- /* Destroy bindings used currently */
- if(priv->bindings)
- {
- g_hash_table_destroy(priv->bindings);
- priv->bindings=NULL;
- }
+ guint oldBindingsCount;
- /* Take a reference at newly read-in bindings now as it will be unreffed
- * in clean-up code block within this function.
- */
- priv->bindings=g_hash_table_ref(data->bindings);
+ /* Get current number of bindings */
+ oldBindingsCount=g_hash_table_size(priv->bindings);
+
+ /* Merge newly read-in bindings into global ones */
+ g_hash_table_foreach(data->bindings, _xfdashboard_bindings_pool_merge_bindings, priv->bindings);
+ XFDASHBOARD_DEBUG(self, MISC,
+ "Merged %u bindings from file '%s', now having a total of %u bindings (was %u bindings before)",
+ g_hash_table_size(data->bindings),
+ inPath,
+ g_hash_table_size(priv->bindings),
+ oldBindingsCount);
}
/* Clean up resources */
@@ -1042,69 +1064,134 @@ XfdashboardBindingsPool* xfdashboard_bindings_pool_get_default(void)
/* Load bindings from configuration file */
gboolean xfdashboard_bindings_pool_load(XfdashboardBindingsPool *self, GError **outError)
{
- gchar *configFile;
- GError *error;
- gboolean success;
+ XfdashboardBindingsPoolPrivate *priv;
+ gchar *configFile;
+ GError *error;
+ gboolean success;
+ gint numberSources;
g_return_val_if_fail(XFDASHBOARD_IS_BINDINGS_POOL(self), FALSE);
g_return_val_if_fail(outError==NULL || *outError==NULL, FALSE);
+ priv=self->priv;
configFile=NULL;
error=NULL;
success=TRUE;
+ numberSources=0;
-#ifdef DEBUG
- /* If compile with debug mode enabled allow specifiing an alternate
- * configuration path. The path must contain the path and file to load.
- */
- if(!configFile)
+ /* Destroy bindings used currently */
+ if(priv->bindings)
{
- const gchar *envFile;
+ g_hash_table_destroy(priv->bindings);
+ priv->bindings=NULL;
- envFile=g_getenv("XFDASHBOARD_BINDINGS_POOL_FILE");
- if(envFile)
+ XFDASHBOARD_DEBUG(self, MISC, "Removed current bindings because of reloading bindings configuration files");
+ }
+
+ /* Create hash-table to store bindings at */
+ priv->bindings=g_hash_table_new_full(xfdashboard_binding_hash,
+ xfdashboard_binding_compare,
+ (GDestroyNotify)g_object_unref,
+ NULL);
+ if(!priv->bindings)
+ {
+ /* Set error */
+ g_set_error(outError,
+ XFDASHBOARD_BINDINGS_POOL_ERROR,
+ XFDASHBOARD_BINDINGS_POOL_ERROR_INTERNAL_ERROR,
+ _("Could not set up hash-table to store bindings"));
+
+ /* Return error result */
+ return(FALSE);
+ }
+
+ /* First try to load bindings configuration file from system-wide path,
+ * usually located at /usr/share/xfdashboard. The file is called "bindings.xml".
+ */
+ if(success)
+ {
+ configFile=g_build_filename(PACKAGE_DATADIR, "xfdashboard", "bindings.xml", NULL);
+ XFDASHBOARD_DEBUG(self, MISC,
+ "Trying system bindings configuration file: %s",
+ configFile);
+ if(g_file_test(configFile, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_REGULAR))
{
- configFile=g_strdup(envFile);
- XFDASHBOARD_DEBUG(self, MISC,
- "Trying bindings configuration file: %s",
- configFile);
- if(!g_file_test(configFile, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_REGULAR))
+ if(!_xfdashboard_bindings_pool_load_bindings_from_file(self, configFile, &error))
{
- g_free(configFile);
- configFile=NULL;
+ /* Propagate error if available */
+ if(error) g_propagate_error(outError, error);
+
+ /* Set error status */
+ success=FALSE;
}
+
+ /* Increase source counter regardless if loading succeeded or failed */
+ numberSources++;
}
+
+ g_free(configFile);
+ configFile=NULL;
}
-#endif
- /* User configuration should be tried first. This file is located in
+ /* Next try to load user configuration file. This file is located in
* the folder 'xfdashboard' at configuration directory in user's home
* path (usually ~/.config/xfdashboard). The file is called "bindings.xml".
*/
- if(!configFile)
+ if(success)
{
configFile=g_build_filename(g_get_user_config_dir(), "xfdashboard", "bindings.xml", NULL);
XFDASHBOARD_DEBUG(self, MISC,
- "Trying bindings configuration file: %s",
+ "Trying user bindings configuration file: %s",
configFile);
- if(!g_file_test(configFile, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_REGULAR))
+ if(g_file_test(configFile, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_REGULAR))
{
- g_free(configFile);
- configFile=NULL;
+ if(!_xfdashboard_bindings_pool_load_bindings_from_file(self, configFile, &error))
+ {
+ /* Propagate error if available */
+ if(error) g_propagate_error(outError, error);
+
+ /* Set error status */
+ success=FALSE;
+ }
+
+ /* Increase source counter regardless if loading succeeded or failed */
+ numberSources++;
}
+
+ g_free(configFile);
+ configFile=NULL;
}
- /* Next try to load bindings configuration file from system-wide path,
- * usually located at /usr/share/xfdashboard. The file is called "bindings.xml".
+ /* At last tro to load a user defined configuration file from an alternate
+ * configuration path provided by an environment variable. This environment
+ * variable must contain the full path (path and file name) to load.
*/
- if(!configFile)
+ if(success)
{
- configFile=g_build_filename(PACKAGE_DATADIR, "xfdashboard", "bindings.xml", NULL);
- XFDASHBOARD_DEBUG(self, MISC,
- "Trying bindings configuration file: %s",
- configFile);
- if(!g_file_test(configFile, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_REGULAR))
+ const gchar *envFile;
+
+ envFile=g_getenv("XFDASHBOARD_BINDINGS_POOL_FILE");
+ if(envFile)
{
+ configFile=g_strdup(envFile);
+ XFDASHBOARD_DEBUG(self, MISC,
+ "Trying alternate bindings configuration file: %s",
+ configFile);
+ if(g_file_test(configFile, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_REGULAR))
+ {
+ if(!_xfdashboard_bindings_pool_load_bindings_from_file(self, configFile, &error))
+ {
+ /* Propagate error if available */
+ if(error) g_propagate_error(outError, error);
+
+ /* Set error status */
+ success=FALSE;
+ }
+
+ /* Increase source counter regardless if loading succeeded or failed */
+ numberSources++;
+ }
+
g_free(configFile);
configFile=NULL;
}
@@ -1113,7 +1200,7 @@ gboolean xfdashboard_bindings_pool_load(XfdashboardBindingsPool *self, GError **
/* If we get here and if we have still not found any bindings file we could load
* then return error.
*/
- if(!configFile)
+ if(numberSources==0)
{
/* Set error */
g_set_error(outError,
@@ -1125,16 +1212,6 @@ gboolean xfdashboard_bindings_pool_load(XfdashboardBindingsPool *self, GError **
return(FALSE);
}
- /* Load, parse and set up bindings from configuration file found */
- if(!_xfdashboard_bindings_pool_load_bindings_from_file(self, configFile, &error))
- {
- /* Propagate error if available */
- if(error) g_propagate_error(outError, error);
-
- /* Set error status */
- success=FALSE;
- }
-
/* Release allocated resources */
g_free(configFile);
diff --git a/libxfdashboard/bindings-pool.h b/libxfdashboard/bindings-pool.h
index 15f9174..5f73003 100644
--- a/libxfdashboard/bindings-pool.h
+++ b/libxfdashboard/bindings-pool.h
@@ -72,7 +72,8 @@ typedef enum /*< prefix=XFDASHBOARD_BINDINGS_POOL_ERROR >*/
{
XFDASHBOARD_BINDINGS_POOL_ERROR_FILE_NOT_FOUND,
XFDASHBOARD_BINDINGS_POOL_ERROR_PARSER_INTERNAL_ERROR,
- XFDASHBOARD_BINDINGS_POOL_ERROR_MALFORMED
+ XFDASHBOARD_BINDINGS_POOL_ERROR_MALFORMED,
+ XFDASHBOARD_BINDINGS_POOL_ERROR_INTERNAL_ERROR
} XfdashboardBindingsPoolErrorEnum;
/* Public API */
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.
More information about the Xfce4-commits
mailing list