mirror of
https://github.com/Gnucash/gnucash.git
synced 2025-02-25 18:55:30 -06:00
GSettings: add functions to listen for changes
git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@23218 57a11ea4-9604-0410-9ed3-97b8803252fd
This commit is contained in:
parent
a51380fa5e
commit
588218f554
@ -27,6 +27,7 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "gnc-gsettings.h"
|
#include "gnc-gsettings.h"
|
||||||
|
#include "libqof/qof/qof.h"
|
||||||
|
|
||||||
#define CLIENT_TAG "%s-%s-client"
|
#define CLIENT_TAG "%s-%s-client"
|
||||||
#define NOTIFY_TAG "%s-%s-notify_id"
|
#define NOTIFY_TAG "%s-%s-notify_id"
|
||||||
@ -34,6 +35,9 @@
|
|||||||
static GHashTable *schema_hash = NULL;
|
static GHashTable *schema_hash = NULL;
|
||||||
static const gchar *gsettings_prefix;
|
static const gchar *gsettings_prefix;
|
||||||
|
|
||||||
|
/* This static indicates the debugging module that this .o belongs to. */
|
||||||
|
static QofLogModule log_module = G_LOG_DOMAIN;
|
||||||
|
|
||||||
/************************************************************/
|
/************************************************************/
|
||||||
/* Internal helper functions */
|
/* Internal helper functions */
|
||||||
/************************************************************/
|
/************************************************************/
|
||||||
@ -89,7 +93,6 @@ static GSettings * gnc_gsettings_get_schema_ptr (const gchar *schema_str)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/************************************************************/
|
/************************************************************/
|
||||||
/* GSettings Utilities */
|
/* GSettings Utilities */
|
||||||
/************************************************************/
|
/************************************************************/
|
||||||
@ -122,3 +125,98 @@ gnc_gsettings_normalize_schema_name (const gchar *name)
|
|||||||
|
|
||||||
return g_strjoin(".", gnc_gsettings_get_prefix(), name, NULL);
|
return g_strjoin(".", gnc_gsettings_get_prefix(), name, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/************************************************************/
|
||||||
|
/* Change notification */
|
||||||
|
/************************************************************/
|
||||||
|
|
||||||
|
gulong
|
||||||
|
gnc_gsettings_register_cb (const gchar *schema,
|
||||||
|
const gchar *key,
|
||||||
|
GCallback func,
|
||||||
|
gpointer user_data)
|
||||||
|
{
|
||||||
|
gulong retval = 0;
|
||||||
|
gchar *signal = NULL;
|
||||||
|
|
||||||
|
GSettings *schema_ptr = gnc_gsettings_get_schema_ptr (schema);
|
||||||
|
g_return_val_if_fail (G_IS_SETTINGS (schema_ptr), retval);
|
||||||
|
|
||||||
|
if ((!key) || (*key == '\0'))
|
||||||
|
signal = g_strdup ("changed");
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (gnc_gsettings_is_valid_key(schema_ptr, key))
|
||||||
|
signal = g_strconcat ("changed::", key, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
retval = g_signal_connect (schema_ptr, signal, func, user_data);
|
||||||
|
|
||||||
|
g_free (signal);
|
||||||
|
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
gnc_gsettings_remove_cb_by_func (const gchar *schema,
|
||||||
|
const gchar *key,
|
||||||
|
GCallback func,
|
||||||
|
gpointer user_data)
|
||||||
|
{
|
||||||
|
gint matched = 0;
|
||||||
|
gchar *signal = NULL;
|
||||||
|
|
||||||
|
GSettings *schema_ptr = gnc_gsettings_get_schema_ptr (schema);
|
||||||
|
g_return_if_fail (G_IS_SETTINGS (schema_ptr));
|
||||||
|
|
||||||
|
if ((!key) || (*key == '\0'))
|
||||||
|
signal = g_strdup ("changed");
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (gnc_gsettings_is_valid_key(schema_ptr, key))
|
||||||
|
signal = g_strconcat ("changed::", key, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
matched = g_signal_handlers_disconnect_matched (
|
||||||
|
schema_ptr,
|
||||||
|
G_SIGNAL_MATCH_DETAIL ||G_SIGNAL_MATCH_FUNC || G_SIGNAL_MATCH_DATA,
|
||||||
|
0, /* signal_id */
|
||||||
|
g_quark_from_string (signal), /* signal_detail */
|
||||||
|
NULL, /* closure */
|
||||||
|
func, /* callback function */
|
||||||
|
user_data);
|
||||||
|
DEBUG ("Removed %d handlers for signal '%s' from schema '%s'", matched, signal, schema);
|
||||||
|
|
||||||
|
g_free (signal);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
gnc_gsettings_remove_cb_by_id (const gchar *schema,
|
||||||
|
guint handlerid)
|
||||||
|
{
|
||||||
|
GSettings *schema_ptr = gnc_gsettings_get_schema_ptr (schema);
|
||||||
|
g_return_if_fail (G_IS_SETTINGS (schema_ptr));
|
||||||
|
|
||||||
|
g_signal_handler_disconnect (schema_ptr, handlerid);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
guint
|
||||||
|
gnc_gsettings_register_any_cb (const gchar *schema,
|
||||||
|
GCallback func,
|
||||||
|
gpointer user_data)
|
||||||
|
{
|
||||||
|
return gnc_gsettings_register_cb (schema, NULL, func, user_data);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
gnc_gsettings_remove_any_cb_by_func (const gchar *schema,
|
||||||
|
GCallback func,
|
||||||
|
gpointer user_data)
|
||||||
|
{
|
||||||
|
gnc_gsettings_remove_cb_by_func (schema, NULL, func, user_data);
|
||||||
|
}
|
||||||
|
@ -108,6 +108,121 @@ void gnc_gsettings_set_prefix (const gchar *prefix);
|
|||||||
*/
|
*/
|
||||||
const gchar *gnc_gsettings_get_prefix (void);
|
const gchar *gnc_gsettings_get_prefix (void);
|
||||||
|
|
||||||
|
|
||||||
|
/** @name Listening for changes
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** Register a callback for when a specific key in the settings
|
||||||
|
* schema is changed. Any time the key's value changes, the routine
|
||||||
|
* will be invoked and will be passed both the changed gsettings entry
|
||||||
|
* and the user data passed to this function.
|
||||||
|
*
|
||||||
|
* @param schema This value contains the schema name of the key
|
||||||
|
* to watch.
|
||||||
|
*
|
||||||
|
* @param key This value contains the name of the key to watch.
|
||||||
|
*
|
||||||
|
* @param func This is a pointer to the function to call when the key
|
||||||
|
* changes.
|
||||||
|
*
|
||||||
|
* @param user_data This pointer will be passed to the callback
|
||||||
|
* function.
|
||||||
|
*
|
||||||
|
* @return This function returns the handler id for the registered
|
||||||
|
* callback.
|
||||||
|
*/
|
||||||
|
gulong gnc_gsettings_register_cb (const char *schema,
|
||||||
|
const gchar *key,
|
||||||
|
GCallback func,
|
||||||
|
gpointer user_data);
|
||||||
|
|
||||||
|
|
||||||
|
/** Remove a function that was registered for a callback when a
|
||||||
|
* specific key in the settings schema changed. Both the func and
|
||||||
|
* user_data arguments are used to match up the callback to remove.
|
||||||
|
* If no matching func and user_data are found to be registered
|
||||||
|
* for the given key, nothing will happen.
|
||||||
|
*
|
||||||
|
* @param schema This value contains the schema name of the key
|
||||||
|
* that is being watched.
|
||||||
|
*
|
||||||
|
* @param key This value contains the name of the key being watched.
|
||||||
|
*
|
||||||
|
* @param func This is a pointer to the function that was registered
|
||||||
|
* earlier.
|
||||||
|
*
|
||||||
|
* @param user_data This pointer was passed to the callback
|
||||||
|
* function when it was registered.
|
||||||
|
*/
|
||||||
|
void gnc_gsettings_remove_cb_by_func (const gchar *schema,
|
||||||
|
const gchar *key,
|
||||||
|
GCallback func,
|
||||||
|
gpointer user_data);
|
||||||
|
|
||||||
|
|
||||||
|
/** Remove a function that was registered for a callback when a
|
||||||
|
* specific key in the settings schema changed. The handler id
|
||||||
|
* that was generated when the callback was registered is
|
||||||
|
* use to find the callback to remove.
|
||||||
|
* If no handler id is found nothing will happen.
|
||||||
|
*
|
||||||
|
* @param schema This value contains the schema name of the key
|
||||||
|
* that is being watched.
|
||||||
|
*
|
||||||
|
* @param id The handler id of the callback to be removed.
|
||||||
|
*/
|
||||||
|
void gnc_gsettings_remove_cb_by_id (const gchar *schema,
|
||||||
|
guint id);
|
||||||
|
|
||||||
|
|
||||||
|
/** Register a callback for when any key in the settings schema
|
||||||
|
* is changed. Any time the value of a key in this schema changes,
|
||||||
|
* the routine will be invoked and will be passed the specified
|
||||||
|
* user data.
|
||||||
|
*
|
||||||
|
* @param schema This value contains the name of the schema
|
||||||
|
* that is being watched.
|
||||||
|
*
|
||||||
|
* @param func This is a pointer to the function to call when a key
|
||||||
|
* changes.
|
||||||
|
*
|
||||||
|
* @param user_data This pointer will be passed to the callback
|
||||||
|
* function.
|
||||||
|
*/
|
||||||
|
guint gnc_gsettings_register_any_cb (const gchar *schema,
|
||||||
|
GCallback func,
|
||||||
|
gpointer user_data);
|
||||||
|
|
||||||
|
|
||||||
|
/** Remove a function that was registered for a callback when any key
|
||||||
|
* in the given settings schema changed. Both the func and user_data
|
||||||
|
* arguments are used to match up the callback to remove.
|
||||||
|
* If no matching func and user_data are found to be registered
|
||||||
|
* for the given key, nothing will happen.
|
||||||
|
*
|
||||||
|
* @param schema This value contains the name of the schema
|
||||||
|
* that is being watched.
|
||||||
|
*
|
||||||
|
* @param func This is a pointer to the function that was registered
|
||||||
|
* earlier.
|
||||||
|
*
|
||||||
|
* @param user_data This pointer was passed to the callback
|
||||||
|
* function when it was registered.
|
||||||
|
*
|
||||||
|
* @note there is no gnc_settings_remove_any_cb_by_id. Use
|
||||||
|
* gnc_settings_remove_cb_by_id instead if you want to
|
||||||
|
* remove a callback set with gnc_settings_register_any_cb
|
||||||
|
* by its handler id.
|
||||||
|
*/
|
||||||
|
void gnc_gsettings_remove_any_cb_by_func (const gchar *schema,
|
||||||
|
GCallback func,
|
||||||
|
gpointer user_data);
|
||||||
|
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
|
||||||
#endif /* GNC_GSETTINGS_H */
|
#endif /* GNC_GSETTINGS_H */
|
||||||
/** @} */
|
/** @} */
|
||||||
/** @} */
|
/** @} */
|
||||||
|
Loading…
Reference in New Issue
Block a user