[nautilus-actions] Only send the 'status-changed' signal once when the two status change



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]