mirror of
https://github.com/Gnucash/gnucash.git
synced 2025-02-25 18:55:30 -06:00
Merge branch 'block-pref' of https://github.com/Bob-IT/gnucash into maint
This commit is contained in:
commit
2094282790
@ -1166,9 +1166,8 @@ gnc_prefs_connect_one (const gchar *name,
|
|||||||
GList* child = gtk_container_get_children(GTK_CONTAINER(widget));
|
GList* child = gtk_container_get_children(GTK_CONTAINER(widget));
|
||||||
widget_child = child->data;
|
widget_child = child->data;
|
||||||
g_list_free(child);
|
g_list_free(child);
|
||||||
DEBUG(" %s - hbox", name);
|
DEBUG(" %s - box", name);
|
||||||
DEBUG("Hbox widget type is %s and name is %s", gtk_widget_get_name(GTK_WIDGET(widget_child)), name);
|
DEBUG("Box widget type is %s and name is %s", gtk_widget_get_name(GTK_WIDGET(widget_child)), name);
|
||||||
|
|
||||||
if (GNC_IS_CURRENCY_EDIT(widget_child))
|
if (GNC_IS_CURRENCY_EDIT(widget_child))
|
||||||
{
|
{
|
||||||
DEBUG(" %s - currency_edit", name);
|
DEBUG(" %s - currency_edit", name);
|
||||||
@ -1176,7 +1175,7 @@ gnc_prefs_connect_one (const gchar *name,
|
|||||||
}
|
}
|
||||||
else if (GNC_IS_PERIOD_SELECT(widget_child))
|
else if (GNC_IS_PERIOD_SELECT(widget_child))
|
||||||
{
|
{
|
||||||
DEBUG(" %s - period_Select", name);
|
DEBUG(" %s - period_select", name);
|
||||||
gnc_prefs_connect_period_select(GNC_PERIOD_SELECT(widget_child), name );
|
gnc_prefs_connect_period_select(GNC_PERIOD_SELECT(widget_child), name );
|
||||||
}
|
}
|
||||||
else if (GNC_IS_DATE_EDIT(widget_child))
|
else if (GNC_IS_DATE_EDIT(widget_child))
|
||||||
@ -1186,7 +1185,7 @@ gnc_prefs_connect_one (const gchar *name,
|
|||||||
}
|
}
|
||||||
else if (GTK_FILE_CHOOSER_BUTTON(widget_child))
|
else if (GTK_FILE_CHOOSER_BUTTON(widget_child))
|
||||||
{
|
{
|
||||||
DEBUG(" %s - file chooser buuton", name);
|
DEBUG(" %s - file chooser button", name);
|
||||||
gnc_prefs_connect_file_chooser_button(GTK_FILE_CHOOSER_BUTTON(widget_child), name );
|
gnc_prefs_connect_file_chooser_button(GTK_FILE_CHOOSER_BUTTON(widget_child), name );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1360,7 +1359,9 @@ gnc_preferences_dialog_create(GtkWindow *parent)
|
|||||||
gtk_notebook_set_current_page(GTK_NOTEBOOK(notebook), 0);
|
gtk_notebook_set_current_page(GTK_NOTEBOOK(notebook), 0);
|
||||||
|
|
||||||
DEBUG("We have the following interesting widgets:");
|
DEBUG("We have the following interesting widgets:");
|
||||||
|
gnc_prefs_block_all(); // Block All Registered callbacks
|
||||||
g_hash_table_foreach(prefs_table, (GHFunc)gnc_prefs_connect_one, dialog);
|
g_hash_table_foreach(prefs_table, (GHFunc)gnc_prefs_connect_one, dialog);
|
||||||
|
gnc_prefs_unblock_all(); // UnBlock All Registered callbacks
|
||||||
DEBUG("Done with interesting widgets.");
|
DEBUG("Done with interesting widgets.");
|
||||||
|
|
||||||
/* Other stuff */
|
/* Other stuff */
|
||||||
|
@ -53,6 +53,8 @@ static GHashTable *schema_hash = NULL;
|
|||||||
static const gchar *gsettings_prefix;
|
static const gchar *gsettings_prefix;
|
||||||
static xmlExternalEntityLoader defaultEntityLoader = NULL;
|
static xmlExternalEntityLoader defaultEntityLoader = NULL;
|
||||||
|
|
||||||
|
static GHashTable *registered_handlers_hash = NULL;
|
||||||
|
|
||||||
/* This static indicates the debugging module that this .o belongs to. */
|
/* This static indicates the debugging module that this .o belongs to. */
|
||||||
static QofLogModule log_module = "gnc.app-utils.gsettings";
|
static QofLogModule log_module = "gnc.app-utils.gsettings";
|
||||||
|
|
||||||
@ -131,6 +133,19 @@ static GSettings * gnc_gsettings_get_settings_ptr (const gchar *schema_str)
|
|||||||
return gset;
|
return gset;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
handlers_hash_block_helper (gpointer key, gpointer settings_ptr, gpointer pointer)
|
||||||
|
{
|
||||||
|
g_signal_handler_block (settings_ptr, (gulong)key); // block signal_handler
|
||||||
|
PINFO("Block handler_id %ld for settings_ptr %p", (gulong)key, settings_ptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
handlers_hash_unblock_helper (gpointer key, gpointer settings_ptr, gpointer pointer)
|
||||||
|
{
|
||||||
|
g_signal_handler_unblock (settings_ptr, (gulong)key); // unblock signal_handler
|
||||||
|
PINFO("UnBlock handler_id %ld for settings_ptr %p", (gulong)key, settings_ptr);
|
||||||
|
}
|
||||||
|
|
||||||
/************************************************************/
|
/************************************************************/
|
||||||
/* GSettings Utilities */
|
/* GSettings Utilities */
|
||||||
@ -203,6 +218,17 @@ gnc_gsettings_register_cb (const gchar *schema,
|
|||||||
|
|
||||||
retval = g_signal_connect (settings_ptr, signal, G_CALLBACK (func), user_data);
|
retval = g_signal_connect (settings_ptr, signal, G_CALLBACK (func), user_data);
|
||||||
|
|
||||||
|
if (!registered_handlers_hash)
|
||||||
|
registered_handlers_hash = g_hash_table_new (g_direct_hash, g_direct_equal);
|
||||||
|
|
||||||
|
if (retval != 0)
|
||||||
|
{
|
||||||
|
g_hash_table_insert (registered_handlers_hash,
|
||||||
|
GINT_TO_POINTER(retval), settings_ptr); //key, value
|
||||||
|
|
||||||
|
PINFO("schema: %s, key: %s, settings_ptr: %p, handler_id: %ld",
|
||||||
|
schema, key, settings_ptr, retval);
|
||||||
|
}
|
||||||
g_free (signal);
|
g_free (signal);
|
||||||
|
|
||||||
LEAVE("");
|
LEAVE("");
|
||||||
@ -218,6 +244,7 @@ gnc_gsettings_remove_cb_by_func (const gchar *schema,
|
|||||||
{
|
{
|
||||||
gint matched = 0;
|
gint matched = 0;
|
||||||
GQuark quark = 0;
|
GQuark quark = 0;
|
||||||
|
gulong handler_id = 0;
|
||||||
|
|
||||||
GSettings *settings_ptr = gnc_gsettings_get_settings_ptr (schema);
|
GSettings *settings_ptr = gnc_gsettings_get_settings_ptr (schema);
|
||||||
g_return_if_fail (G_IS_SETTINGS (settings_ptr));
|
g_return_if_fail (G_IS_SETTINGS (settings_ptr));
|
||||||
@ -228,7 +255,7 @@ gnc_gsettings_remove_cb_by_func (const gchar *schema,
|
|||||||
if ((key) && (gnc_gsettings_is_valid_key(settings_ptr, key)))
|
if ((key) && (gnc_gsettings_is_valid_key(settings_ptr, key)))
|
||||||
quark = g_quark_from_string (key);
|
quark = g_quark_from_string (key);
|
||||||
|
|
||||||
matched = g_signal_handlers_disconnect_matched (
|
handler_id = g_signal_handler_find (
|
||||||
settings_ptr,
|
settings_ptr,
|
||||||
G_SIGNAL_MATCH_DETAIL | G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA,
|
G_SIGNAL_MATCH_DETAIL | G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA,
|
||||||
g_signal_lookup ("changed", G_TYPE_SETTINGS), /* signal_id */
|
g_signal_lookup ("changed", G_TYPE_SETTINGS), /* signal_id */
|
||||||
@ -236,7 +263,24 @@ gnc_gsettings_remove_cb_by_func (const gchar *schema,
|
|||||||
NULL, /* closure */
|
NULL, /* closure */
|
||||||
G_CALLBACK (func), /* callback function */
|
G_CALLBACK (func), /* callback function */
|
||||||
user_data);
|
user_data);
|
||||||
LEAVE ("Schema: %s, key: %s - removed %d handlers for 'changed' signal", schema, key, matched);
|
|
||||||
|
while (handler_id)
|
||||||
|
{
|
||||||
|
matched ++;
|
||||||
|
gnc_gsettings_remove_cb_by_id (schema, handler_id);
|
||||||
|
|
||||||
|
handler_id = g_signal_handler_find (
|
||||||
|
settings_ptr,
|
||||||
|
G_SIGNAL_MATCH_DETAIL | G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA,
|
||||||
|
g_signal_lookup ("changed", G_TYPE_SETTINGS), /* signal_id */
|
||||||
|
quark, /* signal_detail */
|
||||||
|
NULL, /* closure */
|
||||||
|
G_CALLBACK (func), /* callback function */
|
||||||
|
user_data);
|
||||||
|
}
|
||||||
|
|
||||||
|
LEAVE ("Schema: %s, key: %s, hashtable size: %d - removed %d handlers for 'changed' signal",
|
||||||
|
schema, key, g_hash_table_size (registered_handlers_hash), matched);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -247,7 +291,15 @@ gnc_gsettings_remove_cb_by_id (const gchar *schema,
|
|||||||
GSettings *settings_ptr = gnc_gsettings_get_settings_ptr (schema);
|
GSettings *settings_ptr = gnc_gsettings_get_settings_ptr (schema);
|
||||||
g_return_if_fail (G_IS_SETTINGS (settings_ptr));
|
g_return_if_fail (G_IS_SETTINGS (settings_ptr));
|
||||||
|
|
||||||
|
ENTER ();
|
||||||
|
|
||||||
g_signal_handler_disconnect (settings_ptr, handlerid);
|
g_signal_handler_disconnect (settings_ptr, handlerid);
|
||||||
|
|
||||||
|
// remove the handlerid from the registerered_handlers_hash
|
||||||
|
g_hash_table_remove (registered_handlers_hash, GINT_TO_POINTER(handlerid));
|
||||||
|
|
||||||
|
LEAVE ("Schema: %s, handlerid: %d, hashtable size: %d - removed for handler",
|
||||||
|
schema, handlerid, g_hash_table_size (registered_handlers_hash));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -600,6 +652,8 @@ void gnc_gsettings_load_backend (void)
|
|||||||
prefsbackend->set_value = gnc_gsettings_set_value;
|
prefsbackend->set_value = gnc_gsettings_set_value;
|
||||||
prefsbackend->reset = gnc_gsettings_reset;
|
prefsbackend->reset = gnc_gsettings_reset;
|
||||||
prefsbackend->reset_group = gnc_gsettings_reset_schema;
|
prefsbackend->reset_group = gnc_gsettings_reset_schema;
|
||||||
|
prefsbackend->block_all = gnc_gsettings_block_all;
|
||||||
|
prefsbackend->unblock_all = gnc_gsettings_unblock_all;
|
||||||
|
|
||||||
LEAVE("Prefsbackend bind = %p", prefsbackend->bind);
|
LEAVE("Prefsbackend bind = %p", prefsbackend->bind);
|
||||||
}
|
}
|
||||||
@ -850,3 +904,21 @@ void gnc_gsettings_version_upgrade (void)
|
|||||||
if (cur_maj_min > old_maj_min)
|
if (cur_maj_min > old_maj_min)
|
||||||
gnc_gsettings_set_int (GNC_PREFS_GROUP_GENERAL, GNC_PREF_VERSION, cur_maj_min);
|
gnc_gsettings_set_int (GNC_PREFS_GROUP_GENERAL, GNC_PREF_VERSION, cur_maj_min);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void gnc_gsettings_block_all (void)
|
||||||
|
{
|
||||||
|
PINFO("block registered_handlers_hash list size is %d",
|
||||||
|
g_hash_table_size (registered_handlers_hash));
|
||||||
|
g_hash_table_foreach (registered_handlers_hash,
|
||||||
|
handlers_hash_block_helper, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void gnc_gsettings_unblock_all (void)
|
||||||
|
{
|
||||||
|
PINFO("unblock registered_handlers_hash list size is %d",
|
||||||
|
g_hash_table_size (registered_handlers_hash));
|
||||||
|
g_hash_table_foreach (registered_handlers_hash,
|
||||||
|
handlers_hash_unblock_helper, NULL);
|
||||||
|
}
|
||||||
|
@ -86,6 +86,16 @@ void gnc_gsettings_set_prefix (const gchar *prefix);
|
|||||||
const gchar *gnc_gsettings_get_prefix (void);
|
const gchar *gnc_gsettings_get_prefix (void);
|
||||||
|
|
||||||
|
|
||||||
|
/** Block all prefs callbacks, used while preference dialog is loaded.
|
||||||
|
*/
|
||||||
|
void gnc_gsettings_block_all (void);
|
||||||
|
|
||||||
|
|
||||||
|
/** UnBlock all prefs callbacks, used while preference dialog is loaded.
|
||||||
|
*/
|
||||||
|
void gnc_gsettings_unblock_all (void);
|
||||||
|
|
||||||
|
|
||||||
/** @name Listening for changes
|
/** @name Listening for changes
|
||||||
@{
|
@{
|
||||||
*/
|
*/
|
||||||
|
@ -104,6 +104,10 @@ typedef struct
|
|||||||
|
|
||||||
void (*reset_group) (const gchar *group);
|
void (*reset_group) (const gchar *group);
|
||||||
|
|
||||||
|
void (*block_all) (void);
|
||||||
|
|
||||||
|
void (*unblock_all) (void);
|
||||||
|
|
||||||
} PrefsBackend;
|
} PrefsBackend;
|
||||||
|
|
||||||
extern PrefsBackend *prefsbackend;
|
extern PrefsBackend *prefsbackend;
|
||||||
|
@ -368,3 +368,14 @@ gboolean gnc_prefs_is_set_up (void)
|
|||||||
return (prefsbackend !=NULL);
|
return (prefsbackend !=NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void gnc_prefs_block_all (void)
|
||||||
|
{
|
||||||
|
if (prefsbackend && prefsbackend->block_all)
|
||||||
|
(prefsbackend->block_all) ();
|
||||||
|
}
|
||||||
|
|
||||||
|
void gnc_prefs_unblock_all (void)
|
||||||
|
{
|
||||||
|
if (prefsbackend && prefsbackend->unblock_all)
|
||||||
|
(prefsbackend->unblock_all) ();
|
||||||
|
}
|
||||||
|
@ -124,6 +124,14 @@ guint gnc_prefs_get_long_version( void );
|
|||||||
*/
|
*/
|
||||||
gboolean gnc_prefs_is_set_up (void);
|
gboolean gnc_prefs_is_set_up (void);
|
||||||
|
|
||||||
|
/** Block all preference callbacks
|
||||||
|
*/
|
||||||
|
void gnc_prefs_block_all (void);
|
||||||
|
|
||||||
|
/** Unblock all preferences callbacks
|
||||||
|
*/
|
||||||
|
void gnc_prefs_unblock_all (void);
|
||||||
|
|
||||||
/** @name Listening for changes
|
/** @name Listening for changes
|
||||||
@{
|
@{
|
||||||
*/
|
*/
|
||||||
|
Loading…
Reference in New Issue
Block a user