2008-06-10 15:55:40 +09:30
|
|
|
/*
|
|
|
|
|
* Copyright © 2004-2008 Red Hat, Inc.
|
|
|
|
|
* Copyright © 2008 University of South Australia
|
|
|
|
|
*
|
|
|
|
|
* Permission to use, copy, modify, distribute, and sell this software
|
|
|
|
|
* and its documentation for any purpose is hereby granted without
|
|
|
|
|
* fee, provided that the above copyright notice appear in all copies
|
|
|
|
|
* and that both that copyright notice and this permission notice
|
|
|
|
|
* appear in supporting documentation, and that the name of Red Hat
|
|
|
|
|
* not be used in advertising or publicity pertaining to distribution
|
|
|
|
|
* of the software without specific, written prior permission. Red
|
|
|
|
|
* Hat makes no representations about the suitability of this software
|
|
|
|
|
* for any purpose. It is provided "as is" without express or implied
|
|
|
|
|
* warranty.
|
|
|
|
|
*
|
|
|
|
|
* THE AUTHORS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
|
|
|
|
|
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN
|
|
|
|
|
* NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
|
|
|
|
|
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
|
|
|
|
|
* OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
|
|
|
|
|
* NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
|
|
|
|
|
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
|
|
|
*
|
|
|
|
|
* Authors:
|
|
|
|
|
* Kristian Høgsberg (krh@redhat.com)
|
|
|
|
|
* Adam Jackson (ajax@redhat.com)
|
|
|
|
|
* Peter Hutterer (peter@cs.unisa.edu.au)
|
2009-08-02 12:03:04 +03:00
|
|
|
* Oliver McFadden (oliver.mcfadden@nokia.com)
|
2008-06-10 15:55:40 +09:30
|
|
|
*/
|
|
|
|
|
|
2011-12-24 12:31:34 +10:00
|
|
|
#ifdef HAVE_CONFIG_H
|
|
|
|
|
#include "config.h"
|
|
|
|
|
#endif
|
|
|
|
|
|
2008-06-10 15:55:40 +09:30
|
|
|
#ifndef EVDEV_H
|
|
|
|
|
#define EVDEV_H
|
|
|
|
|
|
|
|
|
|
#include <linux/input.h>
|
2008-11-17 10:03:11 +10:00
|
|
|
#include <linux/types.h>
|
2008-06-10 15:55:40 +09:30
|
|
|
|
2010-04-28 10:41:06 +10:00
|
|
|
#include <xorg-server.h>
|
2008-06-10 15:55:40 +09:30
|
|
|
#include <xf86Xinput.h>
|
|
|
|
|
#include <xf86_OSproc.h>
|
2009-02-19 10:02:49 +10:00
|
|
|
#include <xkbstr.h>
|
2008-06-10 15:55:40 +09:30
|
|
|
|
2010-11-08 14:35:02 -05:00
|
|
|
#ifdef MULTITOUCH
|
|
|
|
|
#include <mtdev.h>
|
|
|
|
|
#endif
|
|
|
|
|
|
2009-11-27 14:29:52 +10:00
|
|
|
#ifndef EV_CNT /* linux 2.6.23 kernels and earlier lack _CNT defines */
|
2009-01-11 18:36:59 -08:00
|
|
|
#define EV_CNT (EV_MAX+1)
|
|
|
|
|
#endif
|
|
|
|
|
#ifndef KEY_CNT
|
|
|
|
|
#define KEY_CNT (KEY_MAX+1)
|
|
|
|
|
#endif
|
|
|
|
|
#ifndef REL_CNT
|
|
|
|
|
#define REL_CNT (REL_MAX+1)
|
|
|
|
|
#endif
|
|
|
|
|
#ifndef ABS_CNT
|
|
|
|
|
#define ABS_CNT (ABS_MAX+1)
|
|
|
|
|
#endif
|
|
|
|
|
#ifndef LED_CNT
|
|
|
|
|
#define LED_CNT (LED_MAX+1)
|
|
|
|
|
#endif
|
|
|
|
|
|
2011-08-19 11:15:09 +10:00
|
|
|
#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 14
|
|
|
|
|
#define HAVE_SMOOTH_SCROLLING 1
|
|
|
|
|
#endif
|
|
|
|
|
|
2012-05-25 13:39:32 +10:00
|
|
|
#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) < 18
|
|
|
|
|
#define LogMessageVerbSigSafe xf86MsgVerb
|
|
|
|
|
#endif
|
|
|
|
|
|
2008-08-07 16:57:06 +09:30
|
|
|
#define EVDEV_MAXBUTTONS 32
|
2009-07-23 13:19:49 +03:00
|
|
|
#define EVDEV_MAXQUEUE 32
|
2008-08-07 16:57:06 +09:30
|
|
|
|
2010-02-25 07:11:21 +02:00
|
|
|
/* evdev flags */
|
|
|
|
|
#define EVDEV_KEYBOARD_EVENTS (1 << 0)
|
|
|
|
|
#define EVDEV_BUTTON_EVENTS (1 << 1)
|
|
|
|
|
#define EVDEV_RELATIVE_EVENTS (1 << 2)
|
|
|
|
|
#define EVDEV_ABSOLUTE_EVENTS (1 << 3)
|
|
|
|
|
#define EVDEV_TOUCHPAD (1 << 4)
|
|
|
|
|
#define EVDEV_INITIALIZED (1 << 5) /* WheelInit etc. called already? */
|
|
|
|
|
#define EVDEV_TOUCHSCREEN (1 << 6)
|
|
|
|
|
#define EVDEV_CALIBRATED (1 << 7) /* run-time calibrated? */
|
|
|
|
|
#define EVDEV_TABLET (1 << 8) /* device looks like a tablet? */
|
|
|
|
|
#define EVDEV_UNIGNORE_ABSOLUTE (1 << 9) /* explicitly unignore abs axes */
|
|
|
|
|
#define EVDEV_UNIGNORE_RELATIVE (1 << 10) /* explicitly unignore rel axes */
|
|
|
|
|
#define EVDEV_RELATIVE_MODE (1 << 11) /* Force relative events for devices with absolute axes */
|
|
|
|
|
|
2009-03-09 09:29:48 +10:00
|
|
|
#ifndef MAX_VALUATORS
|
|
|
|
|
#define MAX_VALUATORS 36
|
|
|
|
|
#endif
|
|
|
|
|
|
2011-01-31 14:11:44 +10:00
|
|
|
#ifndef XI_PROP_DEVICE_NODE
|
|
|
|
|
#define XI_PROP_DEVICE_NODE "Device Node"
|
|
|
|
|
#endif
|
|
|
|
|
|
2008-08-26 14:33:40 +09:30
|
|
|
#define LONG_BITS (sizeof(long) * 8)
|
2009-01-11 18:04:40 -08:00
|
|
|
|
|
|
|
|
/* Number of longs needed to hold the given number of bits */
|
|
|
|
|
#define NLONGS(x) (((x) + LONG_BITS - 1) / LONG_BITS)
|
2008-09-04 18:22:56 +09:30
|
|
|
|
2011-05-18 12:20:19 +10:00
|
|
|
/* Function key mode */
|
|
|
|
|
enum fkeymode {
|
|
|
|
|
FKEYMODE_UNKNOWN = 0,
|
|
|
|
|
FKEYMODE_FKEYS, /* function keys send function keys */
|
|
|
|
|
FKEYMODE_MMKEYS, /* function keys send multimedia keys */
|
|
|
|
|
};
|
|
|
|
|
|
2011-10-26 13:09:30 +10:00
|
|
|
enum SlotState {
|
|
|
|
|
SLOTSTATE_OPEN = 8,
|
|
|
|
|
SLOTSTATE_CLOSE,
|
2011-10-26 13:21:18 +10:00
|
|
|
SLOTSTATE_UPDATE,
|
2011-10-26 13:09:30 +10:00
|
|
|
SLOTSTATE_EMPTY,
|
|
|
|
|
};
|
|
|
|
|
|
2011-10-31 08:58:18 +10:00
|
|
|
enum ButtonAction {
|
|
|
|
|
BUTTON_RELEASE = 0,
|
|
|
|
|
BUTTON_PRESS = 1
|
|
|
|
|
};
|
|
|
|
|
|
2008-08-06 22:08:13 -05:00
|
|
|
/* axis specific data for wheel emulation */
|
|
|
|
|
typedef struct {
|
|
|
|
|
int up_button;
|
|
|
|
|
int down_button;
|
|
|
|
|
int traveled_distance;
|
|
|
|
|
} WheelAxis, *WheelAxisPtr;
|
|
|
|
|
|
2009-07-23 13:19:49 +03:00
|
|
|
/* Event queue used to defer keyboard/button events until EV_SYN time. */
|
|
|
|
|
typedef struct {
|
|
|
|
|
enum {
|
|
|
|
|
EV_QUEUE_KEY, /* xf86PostKeyboardEvent() */
|
|
|
|
|
EV_QUEUE_BTN, /* xf86PostButtonEvent() */
|
2010-10-11 09:33:28 +10:00
|
|
|
EV_QUEUE_PROXIMITY, /* xf86PostProximityEvent() */
|
2010-11-08 11:08:01 -05:00
|
|
|
#ifdef MULTITOUCH
|
|
|
|
|
EV_QUEUE_TOUCH, /*xf86PostTouchEvent() */
|
|
|
|
|
#endif
|
2009-07-23 13:19:49 +03:00
|
|
|
} type;
|
2010-11-08 11:08:01 -05:00
|
|
|
union {
|
|
|
|
|
int key; /* May be either a key code or button number. */
|
|
|
|
|
#ifdef MULTITOUCH
|
|
|
|
|
unsigned int touch; /* Touch ID */
|
|
|
|
|
#endif
|
|
|
|
|
} detail;
|
|
|
|
|
int val; /* State of the key/button/touch; pressed or released. */
|
|
|
|
|
#ifdef MULTITOUCH
|
|
|
|
|
ValuatorMask *touchMask;
|
|
|
|
|
#endif
|
2009-07-23 13:19:49 +03:00
|
|
|
} EventQueueRec, *EventQueuePtr;
|
|
|
|
|
|
2008-06-10 15:55:40 +09:30
|
|
|
typedef struct {
|
2011-05-18 12:20:00 +10:00
|
|
|
unsigned short id_vendor;
|
|
|
|
|
unsigned short id_product;
|
|
|
|
|
|
2011-03-08 11:23:47 +02:00
|
|
|
char *device;
|
2008-10-16 15:23:06 +10:30
|
|
|
int grabDevice; /* grab the event device? */
|
2009-02-16 11:18:50 +10:00
|
|
|
|
|
|
|
|
int num_vals; /* number of valuators */
|
2012-06-06 12:07:12 -07:00
|
|
|
int num_mt_vals; /* number of multitouch valuators */
|
2013-01-16 08:38:52 +10:00
|
|
|
int abs_axis_map[ABS_CNT]; /* Map evdev ABS_* to index */
|
|
|
|
|
int rel_axis_map[REL_CNT]; /* Map evdev REL_* to index */
|
2011-01-24 11:49:05 -05:00
|
|
|
ValuatorMask *vals; /* new values coming in */
|
|
|
|
|
ValuatorMask *old_vals; /* old values for calculating relative motion */
|
|
|
|
|
ValuatorMask *prox; /* last values set while not in proximity */
|
2010-11-08 11:08:01 -05:00
|
|
|
ValuatorMask *mt_mask;
|
2012-01-19 14:17:34 -08:00
|
|
|
ValuatorMask **last_mt_vals;
|
2010-11-08 11:08:01 -05:00
|
|
|
int cur_slot;
|
2011-10-26 13:09:30 +10:00
|
|
|
enum SlotState slot_state;
|
2011-12-24 12:18:16 +10:00
|
|
|
#ifdef MULTITOUCH
|
2010-11-08 14:35:02 -05:00
|
|
|
struct mtdev *mtdev;
|
2010-11-08 11:08:01 -05:00
|
|
|
#endif
|
2009-02-16 11:18:50 +10:00
|
|
|
|
2008-06-10 15:55:40 +09:30
|
|
|
int flags;
|
2010-12-21 10:40:45 +10:00
|
|
|
int in_proximity; /* device in proximity */
|
Add use_proximity bit for BTN_TOOL handling.
Touchpads send garbage data between BTN_TOOL_FINGER and BTN_TOUCH. This
leads to cursor movement towards invalid positions (bottom left corner,
usually).
Add a new flag "use_proximity" as a delimiter for BTN_TOUCH handling. If
unset, the actual proximity bits are ignored, no proximity events are sent
and BTN_TOUCH is used for the tool handling.
Example event stream for synaptics:
Event: time 1292893041.002731, -------------- Report Sync ------------
Event: time 1292893041.015807, type 1 (Key), code 330 (Touch), value 0
Event: time 1292893041.015812, type 3 (Absolute), code 0 (X), value 4283
Event: time 1292893041.015813, type 3 (Absolute), code 1 (Y), value 4860
Event: time 1292893041.015815, type 3 (Absolute), code 24 (Pressure), value 23
Event: time 1292893041.015817, type 3 (Absolute), code 28 (Tool Width), value 5
Event: time 1292893041.027537, -------------- Report Sync ------------
Event: time 1292893041.038854, type 3 (Absolute), code 0 (X), value 1
Event: time 1292893041.038857, type 3 (Absolute), code 1 (Y), value 5855
Event: time 1292893041.038859, type 3 (Absolute), code 24 (Pressure), value 1
Event: time 1292893041.038861, type 3 (Absolute), code 28 (Tool Width), value 5
Event: time 1292893041.038864, -------------- Report Sync ------------
Event: time 1292893041.062432, type 3 (Absolute), code 24 (Pressure), value 0
Event: time 1292893041.062435, type 3 (Absolute), code 28 (Tool Width), value 0
Event: time 1292893041.062437, type 1 (Key), code 325 (ToolFinger), value 0
Event: time 1292893041.062438, -------------- Report Sync ------------
Reported-by: Dave Airlie <airlied@redhat.com>
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Chris Bagwell <chris@cnpbagwell.com>
2010-12-21 10:53:06 +10:00
|
|
|
int use_proximity; /* using the proximity bit? */
|
2009-05-21 09:51:57 +10:00
|
|
|
int num_buttons; /* number of buttons */
|
2008-11-03 13:25:06 +10:30
|
|
|
BOOL swap_axes;
|
2008-10-01 11:07:57 +09:30
|
|
|
BOOL invert_x;
|
|
|
|
|
BOOL invert_y;
|
2008-06-10 15:55:40 +09:30
|
|
|
|
2009-07-23 13:19:49 +03:00
|
|
|
int delta[REL_CNT];
|
2010-10-20 10:20:26 +10:00
|
|
|
unsigned int abs_queued, rel_queued, prox_queued;
|
2009-07-23 13:19:49 +03:00
|
|
|
|
2008-06-10 15:55:40 +09:30
|
|
|
/* Middle mouse button emulation */
|
|
|
|
|
struct {
|
|
|
|
|
BOOL enabled;
|
|
|
|
|
BOOL pending; /* timer waiting? */
|
|
|
|
|
int buttonstate; /* phys. button state */
|
|
|
|
|
int state; /* state machine (see bt3emu.c) */
|
|
|
|
|
Time expires; /* time of expiry */
|
|
|
|
|
Time timeout;
|
|
|
|
|
} emulateMB;
|
2011-01-26 12:11:00 +10:00
|
|
|
/* Third mouse button emulation */
|
|
|
|
|
struct emulate3B {
|
|
|
|
|
BOOL enabled;
|
|
|
|
|
BOOL state; /* current state */
|
|
|
|
|
Time timeout; /* timeout until third button press */
|
|
|
|
|
int buttonstate; /* phys. button state */
|
|
|
|
|
int button; /* phys button to emit */
|
|
|
|
|
int threshold; /* move threshold in dev coords */
|
|
|
|
|
OsTimerPtr timer;
|
|
|
|
|
int delta[2]; /* delta x/y, accumulating */
|
|
|
|
|
int startpos[2]; /* starting pos for abs devices */
|
|
|
|
|
int flags; /* remember if we had rel or abs movement */
|
|
|
|
|
} emulate3B;
|
2008-08-17 12:31:23 -05:00
|
|
|
struct {
|
|
|
|
|
int meta; /* meta key to lock any button */
|
|
|
|
|
BOOL meta_state; /* meta_button state */
|
|
|
|
|
unsigned int lock_pair[EVDEV_MAXBUTTONS]; /* specify a meta/lock pair */
|
|
|
|
|
BOOL lock_state[EVDEV_MAXBUTTONS]; /* state of any locked buttons */
|
|
|
|
|
} dragLock;
|
2008-08-06 22:08:13 -05:00
|
|
|
struct {
|
|
|
|
|
BOOL enabled;
|
|
|
|
|
int button;
|
|
|
|
|
int button_state;
|
|
|
|
|
int inertia;
|
|
|
|
|
WheelAxis X;
|
|
|
|
|
WheelAxis Y;
|
2008-08-20 18:16:40 -07:00
|
|
|
Time expires; /* time of expiry */
|
|
|
|
|
Time timeout;
|
2008-08-06 22:08:13 -05:00
|
|
|
} emulateWheel;
|
2008-10-30 16:55:29 +10:30
|
|
|
/* run-time calibration */
|
|
|
|
|
struct {
|
|
|
|
|
int min_x;
|
|
|
|
|
int max_x;
|
|
|
|
|
int min_y;
|
|
|
|
|
int max_y;
|
|
|
|
|
} calibration;
|
2008-07-21 18:15:35 +09:30
|
|
|
|
|
|
|
|
unsigned char btnmap[32]; /* config-file specified button mapping */
|
2008-08-26 14:33:40 +09:30
|
|
|
|
|
|
|
|
int reopen_attempts; /* max attempts to re-open after read failure */
|
|
|
|
|
int reopen_left; /* number of attempts left to re-open the device */
|
|
|
|
|
OsTimerPtr reopen_timer;
|
|
|
|
|
|
|
|
|
|
/* Cached info from device. */
|
|
|
|
|
char name[1024];
|
2009-02-16 11:15:25 +10:00
|
|
|
unsigned long bitmask[NLONGS(EV_CNT)];
|
|
|
|
|
unsigned long key_bitmask[NLONGS(KEY_CNT)];
|
|
|
|
|
unsigned long rel_bitmask[NLONGS(REL_CNT)];
|
|
|
|
|
unsigned long abs_bitmask[NLONGS(ABS_CNT)];
|
|
|
|
|
unsigned long led_bitmask[NLONGS(LED_CNT)];
|
2009-01-11 18:36:59 -08:00
|
|
|
struct input_absinfo absinfo[ABS_CNT];
|
2008-11-17 10:03:11 +10:00
|
|
|
|
|
|
|
|
/* minor/major number */
|
|
|
|
|
dev_t min_maj;
|
2009-07-23 13:19:49 +03:00
|
|
|
|
|
|
|
|
/* Event queue used to defer keyboard/button events until EV_SYN time. */
|
|
|
|
|
int num_queue;
|
|
|
|
|
EventQueueRec queue[EVDEV_MAXQUEUE];
|
2011-05-18 12:20:19 +10:00
|
|
|
|
|
|
|
|
enum fkeymode fkeymode;
|
2013-04-02 14:12:26 +10:00
|
|
|
|
|
|
|
|
char *type_name;
|
2008-06-10 15:55:40 +09:30
|
|
|
} EvdevRec, *EvdevPtr;
|
|
|
|
|
|
2009-08-02 12:03:04 +03:00
|
|
|
/* Event posting functions */
|
2009-08-13 10:16:18 +10:00
|
|
|
void EvdevQueueKbdEvent(InputInfoPtr pInfo, struct input_event *ev, int value);
|
|
|
|
|
void EvdevQueueButtonEvent(InputInfoPtr pInfo, int button, int value);
|
2010-10-11 09:33:28 +10:00
|
|
|
void EvdevQueueProximityEvent(InputInfoPtr pInfo, int value);
|
2010-11-08 11:08:01 -05:00
|
|
|
#ifdef MULTITOUCH
|
|
|
|
|
void EvdevQueueTouchEvent(InputInfoPtr pInfo, unsigned int touch,
|
|
|
|
|
ValuatorMask *mask, uint16_t type);
|
|
|
|
|
#endif
|
2011-10-31 08:58:18 +10:00
|
|
|
void EvdevPostButtonEvent(InputInfoPtr pInfo, int button, enum ButtonAction act);
|
2009-08-13 10:16:18 +10:00
|
|
|
void EvdevQueueButtonClicks(InputInfoPtr pInfo, int button, int count);
|
2010-09-08 11:28:27 +10:00
|
|
|
void EvdevPostRelativeMotionEvents(InputInfoPtr pInfo, int num_v, int first_v,
|
2009-08-02 12:03:04 +03:00
|
|
|
int v[MAX_VALUATORS]);
|
2010-09-08 11:28:27 +10:00
|
|
|
void EvdevPostAbsoluteMotionEvents(InputInfoPtr pInfo, int num_v, int first_v,
|
2009-08-02 12:03:04 +03:00
|
|
|
int v[MAX_VALUATORS]);
|
2008-10-29 13:50:07 +10:30
|
|
|
unsigned int EvdevUtilButtonEventToButtonNumber(EvdevPtr pEvdev, int code);
|
2008-10-14 16:21:00 +10:30
|
|
|
|
2008-06-10 15:55:40 +09:30
|
|
|
/* Middle Button emulation */
|
|
|
|
|
int EvdevMBEmuTimer(InputInfoPtr);
|
|
|
|
|
BOOL EvdevMBEmuFilterEvent(InputInfoPtr, int, BOOL);
|
|
|
|
|
void EvdevMBEmuWakeupHandler(pointer, int, pointer);
|
|
|
|
|
void EvdevMBEmuBlockHandler(pointer, struct timeval**, pointer);
|
|
|
|
|
void EvdevMBEmuPreInit(InputInfoPtr);
|
2008-10-27 15:54:49 +10:30
|
|
|
void EvdevMBEmuOn(InputInfoPtr);
|
2008-06-11 10:36:00 +09:30
|
|
|
void EvdevMBEmuFinalize(InputInfoPtr);
|
2008-08-04 20:19:47 -05:00
|
|
|
|
2011-01-26 12:11:00 +10:00
|
|
|
/* Third button emulation */
|
|
|
|
|
CARD32 Evdev3BEmuTimer(OsTimerPtr timer, CARD32 time, pointer arg);
|
|
|
|
|
BOOL Evdev3BEmuFilterEvent(InputInfoPtr, int, BOOL);
|
|
|
|
|
void Evdev3BEmuPreInit(InputInfoPtr pInfo);
|
|
|
|
|
void Evdev3BEmuOn(InputInfoPtr);
|
|
|
|
|
void Evdev3BEmuFinalize(InputInfoPtr);
|
|
|
|
|
void Evdev3BEmuProcessRelMotion(InputInfoPtr pInfo, int dx, int dy);
|
|
|
|
|
void Evdev3BEmuProcessAbsMotion(InputInfoPtr pInfo, ValuatorMask *vals);
|
|
|
|
|
|
2008-08-06 22:08:13 -05:00
|
|
|
/* Mouse Wheel emulation */
|
|
|
|
|
void EvdevWheelEmuPreInit(InputInfoPtr pInfo);
|
|
|
|
|
BOOL EvdevWheelEmuFilterButton(InputInfoPtr pInfo, unsigned int button, int value);
|
|
|
|
|
BOOL EvdevWheelEmuFilterMotion(InputInfoPtr pInfo, struct input_event *pEv);
|
|
|
|
|
|
2008-08-17 12:31:23 -05:00
|
|
|
/* Draglock code */
|
2008-10-14 16:14:13 +10:30
|
|
|
void EvdevDragLockPreInit(InputInfoPtr pInfo);
|
2008-08-17 12:31:23 -05:00
|
|
|
BOOL EvdevDragLockFilterEvent(InputInfoPtr pInfo, unsigned int button, int value);
|
2008-10-14 16:21:00 +10:30
|
|
|
|
|
|
|
|
void EvdevMBEmuInitProperty(DeviceIntPtr);
|
2011-01-26 12:11:00 +10:00
|
|
|
void Evdev3BEmuInitProperty(DeviceIntPtr);
|
2008-10-14 16:21:00 +10:30
|
|
|
void EvdevWheelEmuInitProperty(DeviceIntPtr);
|
|
|
|
|
void EvdevDragLockInitProperty(DeviceIntPtr);
|
2011-05-18 12:20:19 +10:00
|
|
|
void EvdevAppleInitProperty(DeviceIntPtr);
|
2008-10-14 16:21:00 +10:30
|
|
|
#endif
|