* Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
*
* This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
+ * 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
- * Library General Public License for more details.
+ * Lesser General Public License for more details.
*
- * You should have received a copy of the GNU Library General Public
+ * You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
/*
- * Modified by the GTK+ Team and others 1997-1999. See the AUTHORS
+ * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS
* file for a list of people on the GTK+ Team. See the ChangeLog
* files for a list of changes. These files are distributed with
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
#ifndef __GDK_INPUT_H__
#define __GDK_INPUT_H__
-#ifndef XINPUT_NONE
-#include <X11/extensions/XInput.h>
-#endif
-
-typedef struct _GdkAxisInfo GdkAxisInfo;
-typedef struct _GdkInputVTable GdkInputVTable;
-typedef struct _GdkDevicePrivate GdkDevicePrivate;
-typedef struct _GdkInputWindow GdkInputWindow;
-
-struct _GdkInputVTable {
- gint (*set_mode) (guint32 deviceid, GdkInputMode mode);
- void (*set_axes) (guint32 deviceid, GdkAxisUse *axes);
- void (*set_key) (guint32 deviceid,
- guint index,
- guint keyval,
- GdkModifierType modifiers);
-
- GdkTimeCoord* (*motion_events) (GdkWindow *window,
- guint32 deviceid,
- guint32 start,
- guint32 stop,
- gint *nevents_return);
- void (*get_pointer) (GdkWindow *window,
- guint32 deviceid,
- gdouble *x,
- gdouble *y,
- gdouble *pressure,
- gdouble *xtilt,
- gdouble *ytilt,
- GdkModifierType *mask);
- gint (*grab_pointer) (GdkWindow * window,
- gint owner_events,
- GdkEventMask event_mask,
- GdkWindow * confine_to,
- guint32 time);
- void (*ungrab_pointer) (guint32 time);
-
- void (*configure_event) (XConfigureEvent *xevent, GdkWindow *window);
- void (*enter_event) (XCrossingEvent *xevent, GdkWindow *window);
- gint (*other_event) (GdkEvent *event, XEvent *xevent, GdkWindow *window);
- /* Handle an unidentified event. Returns TRUE if handled, FALSE
- otherwise */
- gint (*window_none_event) (GdkEvent *event, XEvent *xevent);
- gint (*enable_window) (GdkWindow *window, GdkDevicePrivate *gdkdev);
- gint (*disable_window) (GdkWindow *window, GdkDevicePrivate *gdkdev);
-};
-
-/* information about a device axis */
-struct _GdkAxisInfo
-{
- /* reported x resolution */
- gint xresolution;
-
- /* reported x minimum/maximum values */
- gint xmin_value, xmax_value;
-
- /* calibrated resolution (for aspect ration) - only relative values
- between axes used */
- gint resolution;
-
- /* calibrated minimum/maximum values */
- gint min_value, max_value;
-};
+#include <gdk/gdktypes.h>
-#define GDK_INPUT_NUM_EVENTC 6
+G_BEGIN_DECLS
-struct _GdkDevicePrivate {
- GdkDeviceInfo info;
+#define GDK_TYPE_DEVICE (gdk_device_get_type ())
+#define GDK_DEVICE(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), GDK_TYPE_DEVICE, GdkDevice))
+#define GDK_DEVICE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GDK_TYPE_DEVICE, GdkDeviceClass))
+#define GDK_IS_DEVICE(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), GDK_TYPE_DEVICE))
+#define GDK_IS_DEVICE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GDK_TYPE_DEVICE))
+#define GDK_DEVICE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GDK_TYPE_DEVICE, GdkDeviceClass))
-#ifndef XINPUT_NONE
- /* information about the axes */
- GdkAxisInfo *axes;
+typedef struct _GdkDeviceKey GdkDeviceKey;
+typedef struct _GdkDeviceAxis GdkDeviceAxis;
+typedef struct _GdkDevice GdkDevice;
+typedef struct _GdkDeviceClass GdkDeviceClass;
+typedef struct _GdkTimeCoord GdkTimeCoord;
- /* reverse lookup on axis use type */
- gint axis_for_use[GDK_AXIS_LAST];
-
- /* Information about XInput device */
- XDevice *xdevice;
-
- /* minimum key code for device */
- gint min_keycode;
-
- int buttonpress_type, buttonrelease_type, keypress_type,
- keyrelease_type, motionnotify_type, proximityin_type,
- proximityout_type, changenotify_type;
+typedef enum
+{
+ GDK_EXTENSION_EVENTS_NONE,
+ GDK_EXTENSION_EVENTS_ALL,
+ GDK_EXTENSION_EVENTS_CURSOR
+} GdkExtensionMode;
- /* true if we need to select a different set of events, but
- can't because this is the core pointer */
- gint needs_update;
+typedef enum
+{
+ GDK_SOURCE_MOUSE,
+ GDK_SOURCE_PEN,
+ GDK_SOURCE_ERASER,
+ GDK_SOURCE_CURSOR
+} GdkInputSource;
- /* Mask of buttons (used for button grabs) */
- gint button_state;
+typedef enum
+{
+ GDK_MODE_DISABLED,
+ GDK_MODE_SCREEN,
+ GDK_MODE_WINDOW
+} GdkInputMode;
- /* true if we've claimed the device as active. (used only for XINPUT_GXI) */
- gint claimed;
-#endif /* !XINPUT_NONE */
+typedef enum
+{
+ GDK_AXIS_IGNORE,
+ GDK_AXIS_X,
+ GDK_AXIS_Y,
+ GDK_AXIS_PRESSURE,
+ GDK_AXIS_XTILT,
+ GDK_AXIS_YTILT,
+ GDK_AXIS_WHEEL,
+ GDK_AXIS_LAST
+} GdkAxisUse;
+
+struct _GdkDeviceKey
+{
+ guint keyval;
+ GdkModifierType modifiers;
};
-struct _GdkInputWindow
+struct _GdkDeviceAxis
{
- /* gdk window */
- GdkWindow *window;
-
- /* Extension mode (GDK_EXTENSION_EVENTS_ALL/CURSOR) */
- GdkExtensionMode mode;
-
- /* position relative to root window */
- gint16 root_x;
- gint16 root_y;
-
- /* rectangles relative to window of windows obscuring this one */
- GdkRectangle *obscuring;
- gint num_obscuring;
-
- /* Is there a pointer grab for this window ? */
- gint grabbed;
+ GdkAxisUse use;
+ gdouble min;
+ gdouble max;
};
-/* Global data */
+struct _GdkDevice
+{
+ GObject parent_instance;
+ /* All fields are read-only */
+
+ gchar *name;
+ GdkInputSource source;
+ GdkInputMode mode;
+ gboolean has_cursor; /* TRUE if the X pointer follows device motion */
+
+ gint num_axes;
+ GdkDeviceAxis *axes;
+
+ gint num_keys;
+ GdkDeviceKey *keys;
+};
-extern GdkInputVTable gdk_input_vtable;
-/* information about network port and host for gxid daemon */
-extern gchar *gdk_input_gxid_host;
-extern gint gdk_input_gxid_port;
-extern gint gdk_input_ignore_core;
+/* We don't allocate each coordinate this big, but we use it to
+ * be ANSI compliant and avoid accessing past the defined limits.
+ */
+#define GDK_MAX_TIMECOORD_AXES 128
-/* Function declarations */
+struct _GdkTimeCoord
+{
+ guint32 time;
+ gdouble axes[GDK_MAX_TIMECOORD_AXES];
+};
-void gdk_input_window_destroy (GdkWindow *window);
+GType gdk_device_get_type (void) G_GNUC_CONST;
+
+#ifndef GDK_MULTIHEAD_SAFE
+/* Returns a list of GdkDevice * */
+GList * gdk_devices_list (void);
+#endif /* GDK_MULTIHEAD_SAFE */
+
+/* Functions to configure a device */
+void gdk_device_set_source (GdkDevice *device,
+ GdkInputSource source);
+
+gboolean gdk_device_set_mode (GdkDevice *device,
+ GdkInputMode mode);
+
+void gdk_device_set_key (GdkDevice *device,
+ guint index_,
+ guint keyval,
+ GdkModifierType modifiers);
+
+void gdk_device_set_axis_use (GdkDevice *device,
+ guint index_,
+ GdkAxisUse use);
+void gdk_device_get_state (GdkDevice *device,
+ GdkWindow *window,
+ gdouble *axes,
+ GdkModifierType *mask);
+gboolean gdk_device_get_history (GdkDevice *device,
+ GdkWindow *window,
+ guint32 start,
+ guint32 stop,
+ GdkTimeCoord ***events,
+ gint *n_events);
+void gdk_device_free_history (GdkTimeCoord **events,
+ gint n_events);
+gboolean gdk_device_get_axis (GdkDevice *device,
+ gdouble *axes,
+ GdkAxisUse use,
+ gdouble *value);
+
+void gdk_input_set_extension_events (GdkWindow *window,
+ gint mask,
+ GdkExtensionMode mode);
+
+#ifndef GDK_MULTIHEAD_SAFE
+GdkDevice *gdk_device_get_core_pointer (void);
+#endif
+
+G_END_DECLS
#endif /* __GDK_INPUT_H__ */