diff --git a/clutter/clutter-device-manager.c b/clutter/clutter-device-manager.c
index 8b4a5b8a5..5bde10dd8 100644
--- a/clutter/clutter-device-manager.c
+++ b/clutter/clutter-device-manager.c
@@ -1,3 +1,36 @@
+/*
+ * Clutter.
+ *
+ * An OpenGL based 'interactive canvas' library.
+ *
+ * Copyright (C) 2009 Intel Corp.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see .
+ *
+ * Author: Emmanuele Bassi
+ */
+
+/**
+ * SECTION:clutter-device-manager:
+ * @short_description: Maintains the list of input devices
+ *
+ * #ClutterDeviceManager is a singleton object, owned by Clutter, which
+ * maintains the list of #ClutterInputDevices.
+ *
+ * #ClutterDeviceManager is available since Clutter 1.2
+ */
+
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
@@ -62,6 +95,17 @@ clutter_device_manager_init (ClutterDeviceManager *self)
{
}
+/**
+ * clutter_device_manager_get_default:
+ *
+ * Retrieves the device manager singleton
+ *
+ * Return value: (transfer none): the #ClutterDeviceManager singleton.
+ * The returned instance is owned by Clutter and it should not be
+ * modified or freed
+ *
+ * Since: 1.2
+ */
ClutterDeviceManager *
clutter_device_manager_get_default (void)
{
@@ -71,6 +115,18 @@ clutter_device_manager_get_default (void)
return default_manager;
}
+/**
+ * clutter_device_manager_list_devices:
+ * @device_manager: a #ClutterDeviceManager
+ *
+ * Lists all currently registered input devices
+ *
+ * Return value: (transfer container) (element-type ClutterInputDevice):
+ * a newly allocated list of #ClutterInputDevice objects. Use
+ * g_slist_free() to deallocate it when done
+ *
+ * Since: 1.2
+ */
GSList *
clutter_device_manager_list_devices (ClutterDeviceManager *device_manager)
{
@@ -79,6 +135,19 @@ clutter_device_manager_list_devices (ClutterDeviceManager *device_manager)
return g_slist_copy (device_manager->devices);
}
+/**
+ * clutter_device_manager_peek_devices:
+ * @device_manager: a #ClutterDeviceManager
+ *
+ * Lists all currently registered input devices
+ *
+ * Return value: (transfer none) (element-type ClutterInputDevice):
+ * a pointer to the internal list of #ClutterInputDevice objects. The
+ * returned list is owned by the #ClutterDeviceManager and should never
+ * be modified or freed
+ *
+ * Since: 1.2
+ */
const GSList *
clutter_device_manager_peek_devices (ClutterDeviceManager *device_manager)
{
@@ -87,6 +156,19 @@ clutter_device_manager_peek_devices (ClutterDeviceManager *device_manager)
return device_manager->devices;
}
+/**
+ * clutter_device_manager_get_device:
+ * @device_manager: a #ClutterDeviceManager
+ * @device_id: the integer id of a device
+ *
+ * Retrieves the #ClutterInputDevice with the given @device_id
+ *
+ * Return value: (transfer none): a #ClutterInputDevice or %NULL. The
+ * returned device is owned by the #ClutterDeviceManager and should
+ * never be modified or freed
+ *
+ * Since: 1.2
+ */
ClutterInputDevice *
clutter_device_manager_get_device (ClutterDeviceManager *device_manager,
gint device_id)
@@ -122,6 +204,19 @@ input_device_cmp (gconstpointer a,
return 0;
}
+/*
+ * _clutter_device_manager_add_device:
+ * @device_manager: a #ClutterDeviceManager
+ * @device: a #ClutterInputDevice
+ *
+ * Adds @device to the list of #ClutterInputDevices maintained
+ * by @device_manager
+ *
+ * The reference count of @device is not increased
+ *
+ * The #ClutterDeviceManager::device-added signal is emitted after
+ * adding @device to the list
+ */
void
_clutter_device_manager_add_device (ClutterDeviceManager *device_manager,
ClutterInputDevice *device)
@@ -131,8 +226,23 @@ _clutter_device_manager_add_device (ClutterDeviceManager *device_manager,
device_manager->devices = g_slist_insert_sorted (device_manager->devices,
device,
input_device_cmp);
+
+ g_signal_emit (device_manager, manager_signals[DEVICE_ADDED], 0, device);
}
+/*
+ * _clutter_device_manager_remobe_device:
+ * @device_manager: a #ClutterDeviceManager
+ * @device: a #ClutterInputDevice
+ *
+ * Removes @device from the list of #ClutterInputDevices
+ * maintained by @device_manager
+ *
+ * The reference count of @device is not decreased
+ *
+ * The #ClutterDeviceManager::device-removed signal is emitted after
+ * removing @device from the list
+ */
void
_clutter_device_manager_remove_device (ClutterDeviceManager *device_manager,
ClutterInputDevice *device)
@@ -143,25 +253,34 @@ _clutter_device_manager_remove_device (ClutterDeviceManager *device_manager,
return;
device_manager->devices = g_slist_remove (device_manager->devices, device);
+
+ g_signal_emit (device_manager, manager_signals[DEVICE_REMOVED], 0, device);
}
+/*
+ * _clutter_device_manager_update_devices:
+ * @device_manager: a #ClutterDeviceManager
+ *
+ * Updates every #ClutterInputDevice handled by @device_manager
+ * by performing a pick paint at the coordinates of each pointer
+ * device
+ */
void
_clutter_device_manager_update_devices (ClutterDeviceManager *device_manager)
{
GSList *d;
- /* perform a pick() on the stage at the coordinates of every
- * input device, and store the actor currently under the pointer
- */
for (d = device_manager->devices; d != NULL; d = d->next)
{
ClutterInputDevice *device = d->data;
ClutterInputDeviceType device_type;
+ /* we only care about pointer devices */
device_type = clutter_input_device_get_device_type (device);
if (device_type != CLUTTER_POINTER_DEVICE)
continue;
+ /* out of stage */
if (device->stage == NULL)
continue;
diff --git a/clutter/clutter-device-manager.h b/clutter/clutter-device-manager.h
index 6d4893d73..66df18932 100644
--- a/clutter/clutter-device-manager.h
+++ b/clutter/clutter-device-manager.h
@@ -1,3 +1,26 @@
+/*
+ * Clutter.
+ *
+ * An OpenGL based 'interactive canvas' library.
+ *
+ * Copyright (C) 2009 Intel Corp.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see .
+ *
+ * Author: Emmanuele Bassi
+ */
+
#if !defined(__CLUTTER_H_INSIDE__) && !defined(CLUTTER_COMPILATION)
#error "Only can be included directly."
#endif
@@ -14,6 +37,12 @@ G_BEGIN_DECLS
#define CLUTTER_DEVICE_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), CLUTTER_TYPE_DEVICE_MANAGER, ClutterDeviceManager))
#define CLUTTER_IS_DEVICE_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CLUTTER_TYPE_DEVICE_MANAGER))
+/**
+ * ClutterDeviceManager:
+ *
+ * The #ClutterDeviceManager structure contains only
+ * private data
+ */
typedef struct _ClutterDeviceManager ClutterDeviceManager;
GType clutter_stage_manager_get_type (void) G_GNUC_CONST;
diff --git a/clutter/clutter-input-device.c b/clutter/clutter-input-device.c
index d2a298394..913ba13e8 100644
--- a/clutter/clutter-input-device.c
+++ b/clutter/clutter-input-device.c
@@ -1,3 +1,36 @@
+/*
+ * Clutter.
+ *
+ * An OpenGL based 'interactive canvas' library.
+ *
+ * Copyright (C) 2009 Intel Corp.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see .
+ *
+ * Author: Emmanuele Bassi
+ */
+
+/**
+ * SECTION:clutter-input-device
+ * @short_description: An input device managed by Clutter
+ *
+ * #ClutterInputDevice represents an input device known to Clutter.
+ *
+ * The #ClutterInputDevice class holds the state of the device, but
+ * its contents are usually defined by the Clutter backend in use.
+ */
+
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
@@ -74,6 +107,13 @@ clutter_input_device_class_init (ClutterInputDeviceClass *klass)
gobject_class->set_property = clutter_input_device_set_property;
gobject_class->get_property = clutter_input_device_get_property;
+ /**
+ * ClutterInputDevice:id:
+ *
+ * The unique identifier of the device
+ *
+ * Since: 1.2
+ */
pspec = g_param_spec_int ("id",
"Id",
"Unique identifier of the device",
@@ -83,6 +123,13 @@ clutter_input_device_class_init (ClutterInputDeviceClass *klass)
G_PARAM_CONSTRUCT_ONLY);
g_object_class_install_property (gobject_class, PROP_ID, pspec);
+ /**
+ * ClutterInputDevice:device-type:
+ *
+ * The type of the device
+ *
+ * Since: 1.2
+ */
pspec = g_param_spec_enum ("device-type",
"Device Type",
"The type of the device",
@@ -108,6 +155,14 @@ clutter_input_device_init (ClutterInputDevice *self)
self->previous_state = 0;
}
+/*
+ * _clutter_input_device_set_coords:
+ * @device: a #ClutterInputDevice
+ * @x: X coordinate of the device
+ * @y: Y coordinate of the device
+ *
+ * Stores the last known coordinates of the device
+ */
void
_clutter_input_device_set_coords (ClutterInputDevice *device,
gint x,
@@ -115,10 +170,20 @@ _clutter_input_device_set_coords (ClutterInputDevice *device,
{
g_return_if_fail (CLUTTER_IS_INPUT_DEVICE (device));
- device->previous_x = x;
- device->previous_y = y;
+ if (device->previous_x != x)
+ device->previous_x = x;
+
+ if (device->previous_y != y)
+ device->previous_y = y;
}
+/*
+ * _clutter_input_device_set_state:
+ * @device: a #ClutterInputDevice
+ * @state: a bitmask of modifiers
+ *
+ * Stores the last known modifiers state of the device
+ */
void
_clutter_input_device_set_state (ClutterInputDevice *device,
ClutterModifierType state)
@@ -128,15 +193,30 @@ _clutter_input_device_set_state (ClutterInputDevice *device,
device->previous_state = state;
}
+/*
+ * _clutter_input_device_set_time:
+ * @device: a #ClutterInputDevice
+ * @time_: the time
+ *
+ * Stores the last known event time of the device
+ */
void
_clutter_input_device_set_time (ClutterInputDevice *device,
guint32 time_)
{
g_return_if_fail (CLUTTER_IS_INPUT_DEVICE (device));
- device->previous_time = time_;
+ if (device->previous_time != time_)
+ device->previous_time = time_;
}
+/*
+ * _clutter_input_device_set_stage:
+ * @device: a #ClutterInputDevice
+ * @stage: a #ClutterStage
+ *
+ * Stores the stage under the device
+ */
void
_clutter_input_device_set_stage (ClutterInputDevice *device,
ClutterStage *stage)
@@ -146,6 +226,13 @@ _clutter_input_device_set_stage (ClutterInputDevice *device,
device->stage = stage;
}
+/*
+ * cursor_weak_unref:
+ *
+ * #ClutterInputDevice keeps a weak reference on the actor
+ * under its pointer; this function unsets the reference on
+ * the actor to avoid keeping around stale pointers
+ */
static void
cursor_weak_unref (gpointer user_data,
GObject *object_pointer)
@@ -213,12 +300,23 @@ clutter_input_device_get_device_id (ClutterInputDevice *device)
return device->id;
}
+/**
+ * clutter_input_device_get_device_coords:
+ * @device: a #ClutterInputDevice of type %CLUTTER_POINTER_DEVICE
+ * @x: (out): return location for the X coordinate
+ * @y: (out): return location for the Y coordinate
+ *
+ * Retrieves the latest coordinates of the pointer of @device
+ *
+ * Since: 1.2
+ */
void
clutter_input_device_get_device_coords (ClutterInputDevice *device,
gint *x,
gint *y)
{
g_return_if_fail (CLUTTER_IS_INPUT_DEVICE (device));
+ g_return_if_fail (device->device_type == CLUTTER_POINTER_DEVICE);
if (x)
*x = device->previous_x;
@@ -241,6 +339,11 @@ _clutter_input_device_update (ClutterInputDevice *device)
old_cursor_actor = device->cursor_actor;
new_cursor_actor = _clutter_do_pick (stage, x, y, CLUTTER_PICK_REACTIVE);
+ /* if the pick could not find an actor then we do not update the
+ * input device, to avoid ghost enter/leave events; the pick should
+ * never fail, except for bugs in the glReadPixels() implementation
+ * in which case this is the safest course of action anyway
+ */
if (new_cursor_actor == NULL)
new_cursor_actor = CLUTTER_ACTOR (stage);
diff --git a/clutter/clutter-input-device.h b/clutter/clutter-input-device.h
index 3d372bcf6..c0641c44f 100644
--- a/clutter/clutter-input-device.h
+++ b/clutter/clutter-input-device.h
@@ -1,3 +1,26 @@
+/*
+ * Clutter.
+ *
+ * An OpenGL based 'interactive canvas' library.
+ *
+ * Copyright (C) 2009 Intel Corp.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see .
+ *
+ * Author: Emmanuele Bassi
+ */
+
#if !defined(__CLUTTER_H_INSIDE__) && !defined(CLUTTER_COMPILATION)
#error "Only can be included directly."
#endif
@@ -48,6 +71,14 @@ typedef enum {
CLUTTER_N_DEVICE_TYPES
} ClutterInputDeviceType;
+/**
+ * ClutterInputDeviceClass:
+ *
+ * The #ClutterInputDeviceClass structure contains only private
+ * data and should not be accessed directly
+ *
+ * Since: 1.2
+ */
struct _ClutterInputDeviceClass
{
/*< private >*/