[gimp] app: make device management more dynamic in preparation of XI2
- From: Michael Natterer <mitch src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [gimp] app: make device management more dynamic in preparation of XI2
- Date: Fri, 12 Feb 2010 16:14:42 +0000 (UTC)
commit 20e4936d3e96d44ca7e8350b2c525d16f73cc5e5
Author: Michael Natterer <mitch gimp org>
Date: Fri Feb 12 17:10:54 2010 +0100
app: make device management more dynamic in preparation of XI2
Add functions that are similar to the "device-added" and
"device-removed" of GdkDeviceManager in the XI2 branch. Add "device"
and "display" properties to GimpDeviceInfp and distunguish between
creating device info objects from scratch for never-seen devices, and
setting a GdkDevice on them when a previously known device gets
plugged in.
app/widgets/gimpdeviceinfo.c | 136 ++++++++++++++++++++++++++++++++----------
app/widgets/gimpdeviceinfo.h | 10 ++-
app/widgets/gimpdevices.c | 56 +++++++++++++++---
3 files changed, 158 insertions(+), 44 deletions(-)
---
diff --git a/app/widgets/gimpdeviceinfo.c b/app/widgets/gimpdeviceinfo.c
index e9b7b17..10ef9cf 100644
--- a/app/widgets/gimpdeviceinfo.c
+++ b/app/widgets/gimpdeviceinfo.c
@@ -45,6 +45,8 @@ enum
enum
{
PROP_0,
+ PROP_DEVICE,
+ PROP_DISPLAY,
PROP_MODE,
PROP_AXES,
PROP_KEYS
@@ -94,6 +96,22 @@ gimp_device_info_class_init (GimpDeviceInfoClass *klass)
object_class->set_property = gimp_device_info_set_property;
object_class->get_property = gimp_device_info_get_property;
+ g_object_class_install_property (object_class, PROP_DEVICE,
+ g_param_spec_object ("device",
+ NULL, NULL,
+ GDK_TYPE_DEVICE,
+ GIMP_PARAM_STATIC_STRINGS |
+ G_PARAM_READWRITE |
+ G_PARAM_CONSTRUCT));
+
+ g_object_class_install_property (object_class, PROP_DISPLAY,
+ g_param_spec_object ("display",
+ NULL, NULL,
+ GDK_TYPE_DISPLAY,
+ GIMP_PARAM_STATIC_STRINGS |
+ G_PARAM_READWRITE |
+ G_PARAM_CONSTRUCT));
+
GIMP_CONFIG_INSTALL_PROP_ENUM (object_class, PROP_MODE, "mode", NULL,
GDK_TYPE_INPUT_MODE,
GDK_MODE_DISABLED,
@@ -140,15 +158,33 @@ gimp_device_info_constructor (GType type,
guint n_params,
GObjectConstructParam *params)
{
- GObject *object;
- Gimp *gimp;
+ GObject *object;
+ GimpDeviceInfo *info;
+ Gimp *gimp;
object = G_OBJECT_CLASS (parent_class)->constructor (type, n_params, params);
+ info = GIMP_DEVICE_INFO (object);
+
+ g_assert ((info->device == NULL && info->display == NULL) ||
+ (GDK_IS_DEVICE (info->device) && GDK_IS_DISPLAY (info->display)));
+
gimp = GIMP_CONTEXT (object)->gimp;
g_assert (GIMP_IS_GIMP (gimp));
+ if (info->device)
+ {
+ g_object_set_data (G_OBJECT (info->device), GIMP_DEVICE_INFO_DATA_KEY,
+ info);
+
+ gimp_object_set_name (GIMP_OBJECT (info), info->device->name);
+
+ info->mode = info->device->mode;
+ info->n_axes = info->device->num_axes;
+ info->n_keys = info->device->num_keys;
+ }
+
gimp_context_define_properties (GIMP_CONTEXT (object),
GIMP_DEVICE_INFO_CONTEXT_MASK,
FALSE);
@@ -209,6 +245,14 @@ gimp_device_info_set_property (GObject *object,
switch (property_id)
{
+ case PROP_DEVICE:
+ device_info->device = g_value_get_object (value);
+ break;
+
+ case PROP_DISPLAY:
+ device_info->display = g_value_get_object (value);
+ break;
+
case PROP_MODE:
gimp_device_info_set_mode (device_info, g_value_get_enum (value));
break;
@@ -299,6 +343,14 @@ gimp_device_info_get_property (GObject *object,
switch (property_id)
{
+ case PROP_DEVICE:
+ g_value_set_object (value, device_info->device);
+ break;
+
+ case PROP_DISPLAY:
+ g_value_set_object (value, device_info->display);
+ break;
+
case PROP_MODE:
g_value_set_enum (value, gimp_device_info_get_mode (device_info));
break;
@@ -384,18 +436,63 @@ gimp_device_info_get_property (GObject *object,
/* public functions */
GimpDeviceInfo *
-gimp_device_info_new (Gimp *gimp,
- const gchar *name)
+gimp_device_info_new (Gimp *gimp,
+ GdkDevice *device,
+ GdkDisplay *display)
{
g_return_val_if_fail (GIMP_IS_GIMP (gimp), NULL);
- g_return_val_if_fail (name != NULL, NULL);
+ g_return_val_if_fail (GDK_IS_DEVICE (device), NULL);
+ g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL);
return g_object_new (GIMP_TYPE_DEVICE_INFO,
- "name", name,
- "gimp", gimp,
+ "gimp", gimp,
+ "device", device,
+ "display", display,
NULL);
}
+void
+gimp_device_info_set_device (GimpDeviceInfo *device_info,
+ GdkDevice *device,
+ GdkDisplay *display)
+{
+ gint i;
+
+ g_return_if_fail (GIMP_IS_DEVICE_INFO (device_info));
+ g_return_if_fail (GDK_IS_DEVICE (device));
+ g_return_if_fail (GDK_IS_DISPLAY (display));
+ g_return_if_fail (device_info->device == NULL);
+ g_return_if_fail (device_info->display == NULL);
+ g_return_if_fail (strcmp (device->name,
+ gimp_object_get_name (device_info)) == 0);
+
+ g_object_set_data (G_OBJECT (device), GIMP_DEVICE_INFO_DATA_KEY, device_info);
+
+ device_info->device = device;
+ device_info->display = display;
+
+ gdk_device_set_mode (device, device_info->mode);
+
+ if (device_info->n_axes != device->num_axes)
+ g_printerr ("%s: stored 'num-axes' for device '%s' doesn't match "
+ "number of axes present in device\n",
+ G_STRFUNC, device->name);
+
+ for (i = 0; i < MIN (device_info->n_axes, device->num_axes); i++)
+ gimp_device_info_set_axis_use (device_info, i,
+ device_info->axes[i]);
+
+ if (device_info->n_keys != device->num_keys)
+ g_printerr ("%s: stored 'num-keys' for device '%s' doesn't match "
+ "number of keys present in device\n",
+ G_STRFUNC, device->name);
+
+ for (i = 0; i < MIN (device_info->n_keys, device->num_keys); i++)
+ gimp_device_info_set_key (device_info, i,
+ device_info->keys[i].keyval,
+ device_info->keys[i].modifiers);
+}
+
GdkInputMode
gimp_device_info_get_mode (GimpDeviceInfo *info)
{
@@ -534,31 +631,6 @@ gimp_device_info_set_key (GimpDeviceInfo *info,
}
}
-GimpDeviceInfo *
-gimp_device_info_set_from_device (GimpDeviceInfo *device_info,
- GdkDevice *device,
- GdkDisplay *display)
-{
- g_return_val_if_fail (GIMP_IS_DEVICE_INFO (device_info), NULL);
- g_return_val_if_fail (GDK_IS_DEVICE (device), NULL);
- g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL);
-
- g_object_set_data (G_OBJECT (device), GIMP_DEVICE_INFO_DATA_KEY, device_info);
-
- device_info->device = device;
- device_info->display = display;
-
- device_info->mode = device->mode;
-
- device_info->n_axes = device->num_axes;
- device_info->axes = NULL;
-
- device_info->n_keys = device->num_keys;
- device_info->keys = NULL;
-
- return device_info;
-}
-
void
gimp_device_info_changed (GimpDeviceInfo *device_info)
{
diff --git a/app/widgets/gimpdeviceinfo.h b/app/widgets/gimpdeviceinfo.h
index 71203a2..d83719a 100644
--- a/app/widgets/gimpdeviceinfo.h
+++ b/app/widgets/gimpdeviceinfo.h
@@ -72,7 +72,12 @@ struct _GimpDeviceInfoClass
GType gimp_device_info_get_type (void) G_GNUC_CONST;
GimpDeviceInfo * gimp_device_info_new (Gimp *gimp,
- const gchar *name);
+ GdkDevice *device,
+ GdkDisplay *display);
+
+void gimp_device_info_set_device (GimpDeviceInfo *info,
+ GdkDevice *device,
+ GdkDisplay *display);
GdkInputMode gimp_device_info_get_mode (GimpDeviceInfo *info);
void gimp_device_info_set_mode (GimpDeviceInfo *info,
@@ -95,9 +100,6 @@ void gimp_device_info_set_key (GimpDeviceInfo *info,
guint keyval,
GdkModifierType modifiers);
-GimpDeviceInfo * gimp_device_info_set_from_device (GimpDeviceInfo *info,
- GdkDevice *device,
- GdkDisplay *display);
void gimp_device_info_changed (GimpDeviceInfo *info);
GimpDeviceInfo * gimp_device_info_get_by_device (GdkDevice *device);
diff --git a/app/widgets/gimpdevices.c b/app/widgets/gimpdevices.c
index b9e99e8..822b7f9 100644
--- a/app/widgets/gimpdevices.c
+++ b/app/widgets/gimpdevices.c
@@ -76,6 +76,13 @@ static void gimp_devices_display_closed (GdkDisplay *display,
gboolean is_error,
GimpDeviceManager *manager);
+static void gimp_devices_device_added (GdkDisplay *gdk_display,
+ GdkDevice *device,
+ GimpDeviceManager *manager);
+static void gimp_devices_device_removed (GdkDisplay *gdk_display,
+ GdkDevice *device,
+ GimpDeviceManager *manager);
+
/* public functions */
@@ -422,15 +429,9 @@ gimp_devices_display_opened (GdkDisplayManager *disp_manager,
/* create device info structures for present devices */
for (list = gdk_display_list_devices (gdk_display); list; list = list->next)
{
- GdkDevice *device = list->data;
- GimpDeviceInfo *device_info;
-
- device_info = gimp_device_info_new (manager->gimp, device->name);
- gimp_device_info_set_from_device (device_info, device, gdk_display);
-
- gimp_container_add (manager->device_info_list, GIMP_OBJECT (device_info));
- g_object_unref (device_info);
+ GdkDevice *device = list->data;
+ gimp_devices_device_added (gdk_display, device, manager);
}
g_signal_connect (gdk_display, "closed",
@@ -443,4 +444,43 @@ gimp_devices_display_closed (GdkDisplay *gdk_display,
gboolean is_error,
GimpDeviceManager *manager)
{
+ GList *list;
+
+ for (list = gdk_display_list_devices (gdk_display); list; list = list->next)
+ {
+ GdkDevice *device = list->data;
+
+ gimp_devices_device_removed (gdk_display, device, manager);
+ }
+}
+
+static void
+gimp_devices_device_added (GdkDisplay *gdk_display,
+ GdkDevice *device,
+ GimpDeviceManager *manager)
+{
+ GimpDeviceInfo *device_info;
+
+ device_info =
+ GIMP_DEVICE_INFO (gimp_container_get_child_by_name (manager->device_info_list,
+ device->name));
+
+ if (device_info)
+ {
+ gimp_device_info_set_device (device_info, device, gdk_display);
+ }
+ else
+ {
+ device_info = gimp_device_info_new (manager->gimp, device, gdk_display);
+
+ gimp_container_add (manager->device_info_list, GIMP_OBJECT (device_info));
+ g_object_unref (device_info);
+ }
+}
+
+static void
+gimp_devices_device_removed (GdkDisplay *gdk_display,
+ GdkDevice *device,
+ GimpDeviceManager *manager)
+{
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]