diff --git a/ChangeLog b/ChangeLog index 5363cd65cd..8a51d12321 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2007-02-13 Sven Neumann + + * modules/gimpinputdevicestore.[ch] + * modules/controller_linux_input.c: improved error handling. + 2007-02-13 Sven Neumann * modules/gimpinputdevicestore.c: keep devices sorted alphabetically. diff --git a/modules/controller_linux_input.c b/modules/controller_linux_input.c index 98fe2f0d87..6fc8a7e352 100644 --- a/modules/controller_linux_input.c +++ b/modules/controller_linux_input.c @@ -598,9 +598,19 @@ linux_input_set_device (ControllerLinuxInput *controller, g_free (filename); } - else + else if (controller->store) { - g_object_set (controller, "state", _("Device not available"), NULL); + GError *error = gimp_input_device_store_get_error (controller->store); + + if (error) + { + g_object_set (controller, "state", error->message, NULL); + g_error_free (error); + } + else + { + g_object_set (controller, "state", _("Device not available"), NULL); + } } return FALSE; diff --git a/modules/gimpinputdevicestore.c b/modules/gimpinputdevicestore.c index 8274163217..fb1eabf746 100644 --- a/modules/gimpinputdevicestore.c +++ b/modules/gimpinputdevicestore.c @@ -43,6 +43,12 @@ enum NUM_COLUMNS }; +enum +{ + PROP_0, + PROP_CONSTRUCT_ERROR +}; + enum { DEVICE_ADDED, @@ -54,9 +60,10 @@ typedef struct _GimpInputDeviceStoreClass GimpInputDeviceStoreClass; struct _GimpInputDeviceStore { - GtkListStore parent_instance; + GtkListStore parent_instance; - LibHalContext *context; + LibHalContext *context; + GError *error; }; @@ -74,7 +81,6 @@ struct _GimpInputDeviceStoreClass static void gimp_input_device_store_class_init (GimpInputDeviceStoreClass *klass); static void gimp_input_device_store_init (GimpInputDeviceStore *store); static void gimp_input_device_store_finalize (GObject *object); - static gboolean gimp_input_device_store_add (GimpInputDeviceStore *store, const gchar *udi); static gboolean gimp_input_device_store_remove (GimpInputDeviceStore *store, @@ -153,21 +159,17 @@ gimp_input_device_store_class_init (GimpInputDeviceStoreClass *klass) static void gimp_input_device_store_init (GimpInputDeviceStore *store) { - DBusGConnection *connection; GType types[] = { G_TYPE_STRING, G_TYPE_STRING }; - GError *error = NULL; + DBusGConnection *connection; + DBusError dbus_error; gtk_list_store_set_column_types (GTK_LIST_STORE (store), G_N_ELEMENTS (types), types); - connection = dbus_g_bus_get (DBUS_BUS_SYSTEM, &error); + connection = dbus_g_bus_get (DBUS_BUS_SYSTEM, &store->error); if (! connection) - { - g_printerr (error->message); - g_error_free (error); - return; - } + return; store->context = libhal_ctx_new (); @@ -175,7 +177,9 @@ gimp_input_device_store_init (GimpInputDeviceStore *store) dbus_g_connection_get_connection (connection)); dbus_g_connection_unref (connection); - if (libhal_ctx_init (store->context, NULL)) + dbus_error_init (&dbus_error); + + if (libhal_ctx_init (store->context, &dbus_error)) { char **devices; int i, num_devices; @@ -189,11 +193,27 @@ gimp_input_device_store_init (GimpInputDeviceStore *store) libhal_free_string_array (devices); libhal_ctx_set_user_data (store->context, store); + libhal_ctx_set_device_added (store->context, gimp_input_device_store_device_added); libhal_ctx_set_device_removed (store->context, gimp_input_device_store_device_removed); } + else + { + if (dbus_error_is_set (&dbus_error)) + { + dbus_set_g_error (&store->error, &dbus_error); + dbus_error_free (&dbus_error); + } + else + { + g_set_error (&store->error, 0, 0, "Unable to connect to hald"); + } + + libhal_ctx_free (store->context); + store->context = NULL; + } } static void @@ -208,6 +228,12 @@ gimp_input_device_store_finalize (GObject *object) store->context = NULL; } + if (store->error) + { + g_error_free (store->error); + store->error = NULL; + } + G_OBJECT_CLASS (parent_class)->finalize (object); } @@ -385,6 +411,9 @@ gimp_input_device_store_get_device_file (GimpInputDeviceStore *store, g_return_val_if_fail (GIMP_IS_INPUT_DEVICE_STORE (store), NULL); g_return_val_if_fail (udi != NULL, NULL); + if (! store->context) + return NULL; + if (gimp_input_device_store_lookup (store, udi, &iter)) { char *str = libhal_device_get_property_string (store->context, @@ -404,6 +433,14 @@ gimp_input_device_store_get_device_file (GimpInputDeviceStore *store, return NULL; } +GError * +gimp_input_device_store_get_error (GimpInputDeviceStore *store) +{ + g_return_val_if_fail (GIMP_IS_INPUT_DEVICE_STORE (store), NULL); + + return store->error ? g_error_copy (store->error) : NULL; +} + #else GType @@ -413,7 +450,7 @@ gimp_input_device_store_get_type (GTypeModule *module) } GtkListStore * -gimp_input_device_store_new (void) +gimp_input_device_store_new (GError **error) { return NULL; } @@ -425,4 +462,10 @@ gimp_input_device_store_get_device_file (GimpInputDeviceStore *store, return NULL; } +GError * +gimp_input_device_store_get_error (GimpInputDeviceStore *store) +{ + return NULL; +} + #endif diff --git a/modules/gimpinputdevicestore.h b/modules/gimpinputdevicestore.h index e8325f55c0..5ce90f4179 100644 --- a/modules/gimpinputdevicestore.h +++ b/modules/gimpinputdevicestore.h @@ -32,12 +32,13 @@ typedef struct _GimpInputDeviceStore GimpInputDeviceStore; extern GType gimp_input_device_store_type; -GType gimp_input_device_store_get_type (GTypeModule *module); +GType gimp_input_device_store_get_type (GTypeModule *module); GimpInputDeviceStore * gimp_input_device_store_new (void); -gchar * gimp_input_device_store_get_device_file (GimpInputDeviceStore *store, - const gchar *udi); +gchar * gimp_input_device_store_get_device_file (GimpInputDeviceStore *store, + const gchar *udi); +GError * gimp_input_device_store_get_error (GimpInputDeviceStore *store); #endif /* __GIMP_INPUT_DEVICE_STORE_H__ */