[nautilus-actions] Only send the 'status-changed' signal once when the two status change
- From: Pierre Wieser <pwieser src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [nautilus-actions] Only send the 'status-changed' signal once when the two status change
- Date: Wed, 14 Oct 2009 17:31:37 +0000 (UTC)
commit 31f8c9cc9e0c79615329e7b18456b23c894c3e57
Author: Pierre Wieser <pwieser trychlos org>
Date: Wed Oct 14 00:20:31 2009 +0200
Only send the 'status-changed' signal once when the two status change
ChangeLog | 4 ++
src/nact/nact-iactions-list.c | 8 +---
src/runtime/na-iduplicable.c | 103 +++++++++++++----------------------------
src/runtime/na-iduplicable.h | 3 +-
4 files changed, 38 insertions(+), 80 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index dd35af8..64428dd 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,9 @@
2009-10-13 Pierre Wieser <pwieser trychlos org>
+ * src/runtime/na-iduplicable.c:
+ * src/runtime/na-iduplicable.h: Only define one signal which is
+ sent when one of the status has changed.
+
* src/common/na-object-api.h (na_object_get_topmost_parent):
Removed alias.
diff --git a/src/nact/nact-iactions-list.c b/src/nact/nact-iactions-list.c
index fbc4009..307d62b 100644
--- a/src/nact/nact-iactions-list.c
+++ b/src/nact/nact-iactions-list.c
@@ -548,13 +548,7 @@ nact_iactions_list_runtime_init_toplevel( NactIActionsList *instance, GList *ite
base_window_signal_connect(
BASE_WINDOW( instance ),
G_OBJECT( instance ),
- NA_IDUPLICABLE_SIGNAL_MODIFIED_CHANGED,
- G_CALLBACK( on_edition_status_changed ));
-
- base_window_signal_connect(
- BASE_WINDOW( instance ),
- G_OBJECT( instance ),
- NA_IDUPLICABLE_SIGNAL_VALID_CHANGED,
+ NA_IDUPLICABLE_SIGNAL_STATUS_CHANGED,
G_CALLBACK( on_edition_status_changed ));
}
diff --git a/src/runtime/na-iduplicable.c b/src/runtime/na-iduplicable.c
index c075059..5f3c4df 100644
--- a/src/runtime/na-iduplicable.c
+++ b/src/runtime/na-iduplicable.c
@@ -43,8 +43,7 @@ struct NAIDuplicableInterfacePrivate {
/* signal handlers set on an object
*/
typedef struct {
- gulong modified_changed_handler_id;
- gulong valid_changed_handler_id;
+ gulong status_changed_handler_id;
}
HandlersStruct;
@@ -58,8 +57,7 @@ typedef struct {
/* signals emitted on NAIDuplicable when a status changes
*/
enum {
- MODIFIED_CHANGED,
- VALID_CHANGED,
+ STATUS_CHANGED,
LAST_SIGNAL
};
@@ -80,12 +78,11 @@ static gboolean v_is_valid( const NAIDuplicable *object );
static gboolean get_modified( const NAIDuplicable *object );
static NAIDuplicable *get_origin( const NAIDuplicable *object );
static gboolean get_valid( const NAIDuplicable *object );
-static void set_modified( const NAIDuplicable *object, gboolean is_modified );
+static gboolean set_modified( const NAIDuplicable *object, gboolean is_modified );
static void set_origin( const NAIDuplicable *object, const NAIDuplicable *origin );
-static void set_valid( const NAIDuplicable *object, gboolean is_valid );
+static gboolean set_valid( const NAIDuplicable *object, gboolean is_valid );
-static void modified_changed_handler( NAIDuplicable *instance, gpointer user_data );
-static void valid_changed_handler( NAIDuplicable *instance, gpointer user_data );
+static void status_changed_handler( NAIDuplicable *instance, gpointer user_data );
static void propagate_signal_to_consumers( const gchar *signal, NAIDuplicable *instance, gpointer user_data );
static void release_signal_consumers( GList *consumers );
@@ -141,41 +138,13 @@ interface_base_init( NAIDuplicableInterface *klass )
klass->private->consumers = NULL;
/**
- * na-iduplicable-modified-changed:
+ * na-iduplicable-status-changed:
*
* This signal is emitted by NAIDuplicable when the modification
- * status of an object has been modified.
- *
- * The default class handler propagates this same signal to
- * registered consumers ; the consumer should have taken care
- * of overriding the class handler if he doesn't want create an
- * infinite loop.
- */
- st_signals[ MODIFIED_CHANGED ] = g_signal_new(
- NA_IDUPLICABLE_SIGNAL_MODIFIED_CHANGED,
- G_TYPE_OBJECT,
- G_SIGNAL_RUN_LAST,
- 0, /* no default handler */
- NULL,
- NULL,
- g_cclosure_marshal_VOID__POINTER,
- G_TYPE_NONE,
- 1,
- G_TYPE_POINTER );
-
- /**
- * na-iduplicable-valid-changed:
- *
- * This signal is emitted byIDuplicable when the validity
- * status of an object has been modified.
- *
- * The default class handler propagates this same signal to
- * registered consumers ; the consumer should have taken care
- * of overriding the class handler if he doesn't want create an
- * infinite loop.
+ * or the validity status of an object has been modified.
*/
- st_signals[ VALID_CHANGED ] = g_signal_new(
- NA_IDUPLICABLE_SIGNAL_VALID_CHANGED,
+ st_signals[ STATUS_CHANGED ] = g_signal_new(
+ NA_IDUPLICABLE_SIGNAL_STATUS_CHANGED,
G_TYPE_OBJECT,
G_SIGNAL_RUN_LAST,
0, /* no default handler */
@@ -231,16 +200,10 @@ na_iduplicable_init( NAIDuplicable *object )
str = g_new0( HandlersStruct, 1 );
- str->modified_changed_handler_id = g_signal_connect(
- G_OBJECT( object ),
- NA_IDUPLICABLE_SIGNAL_MODIFIED_CHANGED,
- G_CALLBACK( modified_changed_handler ),
- object );
-
- str->valid_changed_handler_id = g_signal_connect(
+ str->status_changed_handler_id = g_signal_connect(
G_OBJECT( object ),
- NA_IDUPLICABLE_SIGNAL_VALID_CHANGED,
- G_CALLBACK( valid_changed_handler ),
+ NA_IDUPLICABLE_SIGNAL_STATUS_CHANGED,
+ G_CALLBACK( status_changed_handler ),
object );
g_object_set_data( G_OBJECT( object ), NA_IDUPLICABLE_PROP_SIGNAL_HANDLERS, str );
@@ -262,8 +225,7 @@ na_iduplicable_dispose( NAIDuplicable *object )
str = g_object_get_data( G_OBJECT( object ), NA_IDUPLICABLE_PROP_SIGNAL_HANDLERS );
- g_signal_handler_disconnect( object, str->modified_changed_handler_id );
- g_signal_handler_disconnect( object, str->valid_changed_handler_id );
+ g_signal_handler_disconnect( object, str->status_changed_handler_id );
g_free( str );
}
@@ -326,6 +288,7 @@ na_iduplicable_check_status( const NAIDuplicable *object )
gboolean modified = TRUE;
NAIDuplicable *origin;
gboolean valid;
+ gboolean was_modified, was_valid;
g_debug( "%s: object=%p (%s)", thisfn, ( void * ) object, G_OBJECT_TYPE_NAME( object ));
g_return_if_fail( st_initialized && !st_finalized );
@@ -339,12 +302,16 @@ na_iduplicable_check_status( const NAIDuplicable *object )
*/
modified = !v_are_equal( origin, object );
}
- set_modified( object, modified );
+ was_modified = set_modified( object, modified );
valid = v_is_valid( object );
- set_valid( object, valid );
+ was_valid = set_valid( object, valid );
-#if NA_IDUPLICABLE_EDITION_STATUS_DEBUG
+ if(( was_valid && !valid ) || ( !was_valid && valid ) || ( was_modified && !modified ) || ( !was_modified && modified )){
+ g_signal_emit_by_name( G_OBJECT( object ), NA_IDUPLICABLE_SIGNAL_STATUS_CHANGED, object );
+ }
+
+ #if NA_IDUPLICABLE_EDITION_STATUS_DEBUG
g_debug( "%s: object=%p (%s), modified=%s, valid=%s", thisfn,
( void * ) object, G_OBJECT_TYPE_NAME( object ),
modified ? "True":"False", valid ? "True":"False" );
@@ -563,20 +530,23 @@ get_valid( const NAIDuplicable *object )
* send a message each time a property is changed ; but these data are
* not properties of NAObject
*/
-static void
+static gboolean
set_modified( const NAIDuplicable *object, gboolean is_modified )
{
- gboolean was_modified = get_modified( object );
+ gboolean was_modified;
+
+ was_modified = get_modified( object );
if( was_modified != is_modified ){
g_object_set_data( G_OBJECT( object ), NA_IDUPLICABLE_PROP_IS_MODIFIED, GUINT_TO_POINTER( is_modified ));
- g_signal_emit_by_name( G_OBJECT( object ), NA_IDUPLICABLE_SIGNAL_MODIFIED_CHANGED, object );
#if NA_IDUPLICABLE_EDITION_STATUS_DEBUG
g_debug( "na_iduplicable_set_modified: object=%p (%s) modified=%s",
( void * ) object, G_OBJECT_TYPE_NAME( object ), is_modified ? "True":"False" );
#endif
}
+
+ return( was_modified );
}
static void
@@ -585,7 +555,7 @@ set_origin( const NAIDuplicable *object, const NAIDuplicable *origin )
g_object_set_data( G_OBJECT( object ), NA_IDUPLICABLE_PROP_ORIGIN, ( gpointer ) origin );
}
-static void
+static gboolean
set_valid( const NAIDuplicable *object, gboolean is_valid )
{
gboolean was_valid;
@@ -594,33 +564,24 @@ set_valid( const NAIDuplicable *object, gboolean is_valid )
if( was_valid != is_valid ){
g_object_set_data( G_OBJECT( object ), NA_IDUPLICABLE_PROP_IS_VALID, GUINT_TO_POINTER( is_valid ));
- g_signal_emit_by_name( G_OBJECT( object ), NA_IDUPLICABLE_SIGNAL_VALID_CHANGED, object );
#if NA_IDUPLICABLE_EDITION_STATUS_DEBUG
g_debug( "na_iduplicable_set_valid: object=%p (%s) valid=%s",
( void * ) object, G_OBJECT_TYPE_NAME( object ), is_valid ? "True":"False" );
#endif
}
-}
-
-static void
-modified_changed_handler( NAIDuplicable *instance, gpointer user_data )
-{
- /*g_debug( "na_iduplicable_propagate_modified_changed: instance=%p (%s), user_data=%p (%s)",
- ( void * ) instance, G_OBJECT_TYPE_NAME( instance ),
- ( void * ) user_data, G_OBJECT_TYPE_NAME( user_data ));*/
- propagate_signal_to_consumers( NA_IDUPLICABLE_SIGNAL_MODIFIED_CHANGED, instance, user_data );
+ return( was_valid );
}
static void
-valid_changed_handler( NAIDuplicable *instance, gpointer user_data )
+status_changed_handler( NAIDuplicable *instance, gpointer user_data )
{
- /*g_debug( "na_iduplicable_propagate_valid_changed: instance=%p (%s), user_data=%p (%s)",
+ /*g_debug( "na_iduplicable_propagate_modified_changed: instance=%p (%s), user_data=%p (%s)",
( void * ) instance, G_OBJECT_TYPE_NAME( instance ),
( void * ) user_data, G_OBJECT_TYPE_NAME( user_data ));*/
- propagate_signal_to_consumers( NA_IDUPLICABLE_SIGNAL_VALID_CHANGED, instance, user_data );
+ propagate_signal_to_consumers( NA_IDUPLICABLE_SIGNAL_STATUS_CHANGED, instance, user_data );
}
/*
diff --git a/src/runtime/na-iduplicable.h b/src/runtime/na-iduplicable.h
index 38d83e2..661763f 100644
--- a/src/runtime/na-iduplicable.h
+++ b/src/runtime/na-iduplicable.h
@@ -142,8 +142,7 @@ typedef struct {
}
NAIDuplicableInterface;
-#define NA_IDUPLICABLE_SIGNAL_MODIFIED_CHANGED "na-iduplicable-modified-changed"
-#define NA_IDUPLICABLE_SIGNAL_VALID_CHANGED "na-iduplicable-valid-changed"
+#define NA_IDUPLICABLE_SIGNAL_STATUS_CHANGED "na-iduplicable-status-changed"
#define NA_IDUPLICABLE_EDITION_STATUS_DEBUG 0
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]