gnome-scan r675 - in trunk: . modules/gsane



Author: bersace
Date: Sun Dec 14 13:56:32 2008
New Revision: 675
URL: http://svn.gnome.org/viewvc/gnome-scan?rev=675&view=rev

Log:
Added option reloading upon option value setting.

Modified:
   trunk/ChangeLog
   trunk/modules/gsane/gsane-option-handler-generic.c
   trunk/modules/gsane/gsane-option-handler.c
   trunk/modules/gsane/gsane-option-handler.h

Modified: trunk/modules/gsane/gsane-option-handler-generic.c
==============================================================================
--- trunk/modules/gsane/gsane-option-handler-generic.c	(original)
+++ trunk/modules/gsane/gsane-option-handler-generic.c	Sun Dec 14 13:56:32 2008
@@ -50,9 +50,14 @@
 	self->priv->index = n;
 	self->priv->desc = desc;
 
-	/* don't trust SANE test backend */
+	/* don't trust SANE test backend for primary/secondary
+	   options. Most primary options are swallowed in
+	   special/high-level OptionHandler. Might make sense to have
+	   a generic primary option handler subclassing Generic
+	   handler, with rules by name. */
 	GnomeScanOptionHint hint = GNOME_SCAN_OPTION_HINT_SECONDARY;
 
+	/* instanciate option with default value depending on SANE_Value_Type */
 	switch(desc->type) {
 	case SANE_TYPE_BOOL:
 		boolval = gsane_option_handler_get_bool(GSANE_OPTION_HANDLER(self), desc, n, NULL);
@@ -61,6 +66,7 @@
 		g_debug("\toption %d : boolean %s = %s", n, desc->name, GSANE_BOOLEAN_TO_STRING(boolval));
 		break;
 	default:
+		g_debug("\toption %d : <unhandled> %s", n, desc->name);
 		break;
 	}
 
@@ -74,13 +80,24 @@
 	gnome_scan_node_install_option(GNOME_SCAN_NODE(handler->scanner), self->priv->option);
 }
 
-void
+static void
+gsane_option_handler_generic_reload_options(GSaneOptionHandler *handler)
+{
+	GSaneOptionHandlerGeneric*self = GSANE_OPTION_HANDLER_GENERIC(handler);
+	if (!self->priv->option) {
+		return;
+	}
+	g_object_set(self->priv->option, "active", SANE_OPTION_IS_ACTIVE(self->priv->desc->cap), NULL);
+}
+
+static void
 gsane_option_handler_generic_class_init(gpointer g_class, gpointer class_data)
 {
 	gsane_option_handler_generic_parent_class = g_type_class_peek_parent(g_class);
 	g_type_class_add_private(g_class, sizeof(GSaneOptionHandlerGenericPrivate));
 	GSaneOptionHandlerClass* oh_class = GSANE_OPTION_HANDLER_CLASS(g_class);
-	oh_class->handle_option = gsane_option_handler_generic_handle_option;
+	oh_class->handle_option 	= gsane_option_handler_generic_handle_option;
+	oh_class->reload_options	= gsane_option_handler_generic_reload_options;
 }
 
 void

Modified: trunk/modules/gsane/gsane-option-handler.c
==============================================================================
--- trunk/modules/gsane/gsane-option-handler.c	(original)
+++ trunk/modules/gsane/gsane-option-handler.c	Sun Dec 14 13:56:32 2008
@@ -40,13 +40,13 @@
 	}
 }
 
-
 GSaneOptionHandler*
 gsane_option_handler_new(GType type, GnomeScanScanner* scanner, SANE_Handle handle)
 {
 	GSaneOptionHandler *self = GSANE_OPTION_HANDLER(g_type_create_instance(type));
 	self->priv->handle = handle;
 	self->scanner = scanner;
+	g_signal_connect_swapped(scanner, "reload-options", G_CALLBACK(gsane_option_handler_reload_options), self);
 	return self;
 }
 
@@ -57,7 +57,7 @@
 }
 
 static void
-gsane_option_handler_do_handle_option(GSaneOptionHandler *self, SANE_Int n, const SANE_Option_Descriptor* desc, const gchar* group)
+gsane_option_handler_default_handle_option(GSaneOptionHandler *self, SANE_Int n, const SANE_Option_Descriptor* desc, const gchar* group)
 {
 	g_warning("gsane_option_handler_handle_option not implemented by %s", g_type_name(G_TYPE_FROM_INSTANCE(self)));
 }
@@ -69,6 +69,18 @@
 }
 
 static void
+gsane_option_handler_default_reload_options(GSaneOptionHandler *self)
+{
+	g_warning("gsane_option_handler_reload_option not implemented by %s", g_type_name(G_TYPE_FROM_INSTANCE(self)));
+}
+
+void
+gsane_option_handler_reload_options(GSaneOptionHandler *self)
+{
+	GSANE_OPTION_HANDLER_GET_CLASS(self)->reload_options(self);
+}
+
+static void
 gsane_option_handler_control_option(GSaneOptionHandler*self, const SANE_Option_Descriptor* desc, SANE_Int index, SANE_Action action, gpointer data, GError**error)
 {
 	SANE_Status status;
@@ -97,7 +109,7 @@
 	if (flags & SANE_INFO_INEXACT)
 		g_debug("Value inexact");
 	if (flags & SANE_INFO_RELOAD_OPTIONS)
-		g_debug("Reload options");
+		g_signal_emit_by_name(self->scanner, "reload-options");
 	if (flags & SANE_INFO_RELOAD_PARAMS)
 		g_debug("Reload params");
 }
@@ -131,7 +143,8 @@
 	GSaneOptionHandlerClass *oh_class = GSANE_OPTION_HANDLER_CLASS(g_class);
 	g_type_class_add_private(g_class, sizeof(GSaneOptionHandlerPrivate));
 	oh_class->unique = FALSE;
-	oh_class->handle_option	= gsane_option_handler_do_handle_option;
+	oh_class->handle_option		= gsane_option_handler_default_handle_option;
+	oh_class->reload_options	= gsane_option_handler_default_reload_options;
 }
 
 GType

Modified: trunk/modules/gsane/gsane-option-handler.h
==============================================================================
--- trunk/modules/gsane/gsane-option-handler.h	(original)
+++ trunk/modules/gsane/gsane-option-handler.h	Sun Dec 14 13:56:32 2008
@@ -42,7 +42,7 @@
 {
 	GTypeClass	parent_class;
 	void		(*handle_option) (GSaneOptionHandler*self, SANE_Int n, const SANE_Option_Descriptor*desc, const gchar* group);
-
+	void		(*reload_options) (GSaneOptionHandler*self);
 	/* Whether the scanner must have a unique instance of the
 	   option handler */
 	gboolean	unique;
@@ -63,6 +63,7 @@
 GSaneOptionHandler* gsane_option_handler_new(GType type, GnomeScanScanner *scanner, SANE_Handle handle);
 void gsane_option_handler_destroy(GSaneOptionHandler *self);
 void gsane_option_handler_handle_option(GSaneOptionHandler *self, SANE_Int n, const SANE_Option_Descriptor* desc, const gchar*group);
+void gsane_option_handler_reload_options(GSaneOptionHandler *self);
 gboolean gsane_option_handler_get_bool(GSaneOptionHandler *self, const SANE_Option_Descriptor* desc, SANE_Int index, GError **error);
 void gsane_option_handler_set_bool(GSaneOptionHandler *self, const SANE_Option_Descriptor* desc, SANE_Int index, gboolean value, GError **error);
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]