/*
* Copyright 2002 Red Hat Inc., Durham, North Carolina.
*
* All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation on the rights to use, copy, modify, merge,
* publish, distribute, sublicense, and/or sell copies of the Software,
* and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions:
*
* The above copyright notice and this permission notice (including the
* next paragraph) shall be included in all copies or substantial
* portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NON-INFRINGEMENT. IN NO EVENT SHALL RED HAT AND/OR THEIR SUPPLIERS
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
/*
* Authors:
* Rickard E. (Rik) Faith <[email protected]>
*
*/
/** \file
* Interface for low-level input support. \see dmxinputinit.c */
#ifndef _DMXINPUTINIT_H_
#define _DMXINPUTINIT_H_
#include "dmx.h"
#include "dmxinput.h"
#include "dmxlog.h"
#define DMX_LOCAL_DEFAULT_KEYBOARD "kbd"
#define DMX_LOCAL_DEFAULT_POINTER "ps2"
#define DMX_MAX_BUTTONS 256
#define DMX_MOTION_SIZE 256
#define DMX_MAX_VALUATORS 32
#define DMX_MAX_AXES 32
#define DMX_MAX_XINPUT_EVENT_TYPES 100
#define DMX_MAP_ENTRIES 16 /* Must be a power of 2 */
#define DMX_MAP_MASK (DMX_MAP_ENTRIES - 1)
typedef enum {
DMX_FUNCTION_GRAB,
DMX_FUNCTION_TERMINATE,
DMX_FUNCTION_FINE
} DMXFunctionType;
typedef enum {
DMX_LOCAL_HIGHLEVEL,
DMX_LOCAL_KEYBOARD,
DMX_LOCAL_MOUSE,
DMX_LOCAL_OTHER
} DMXLocalInputType;
typedef enum {
DMX_LOCAL_TYPE_LOCAL,
DMX_LOCAL_TYPE_CONSOLE,
DMX_LOCAL_TYPE_BACKEND,
DMX_LOCAL_TYPE_COMMON
} DMXLocalInputExtType;
typedef enum {
DMX_RELATIVE,
DMX_ABSOLUTE,
DMX_ABSOLUTE_CONFINED
} DMXMotionType;
/** Stores information from low-level device that is used to initialize
* the device at the dix level. */
typedef struct _DMXLocalInitInfo {
int keyboard; /**< Non-zero if the device is a keyboard */
int keyClass; /**< Non-zero if keys are present */
KeySymsRec keySyms; /**< Key symbols */
int freemap; /**< If non-zero, free keySyms.map */
CARD8 modMap[MAP_LENGTH]; /**< Modifier map */
#ifdef XKB
XkbDescPtr xkb; /**< XKB description */
XkbComponentNamesRec names; /**< XKB component names */
int freenames; /**< Non-zero if names should be free'd */
int force; /**< Do not allow command line override */
#endif
int buttonClass; /**< Non-zero if buttons are present */
int numButtons; /**< Number of buttons */
unsigned char map[DMX_MAX_BUTTONS]; /**< Button map */
int valuatorClass; /**< Non-zero if valuators are
* present */
int numRelAxes; /**< Number of relative axes */
int numAbsAxes; /**< Number of absolute axes */
int minval[DMX_MAX_AXES]; /**< Minimum values */
int maxval[DMX_MAX_AXES]; /**< Maximum values */
int res[DMX_MAX_AXES]; /**< Resolution */
int minres[DMX_MAX_AXES]; /**< Minimum resolutions */
int maxres[DMX_MAX_AXES]; /**< Maximum resolutions */
int focusClass; /**< Non-zero if device can
* cause focus */
int proximityClass; /**< Non-zero if device
* causes proximity events */
int kbdFeedbackClass; /**< Non-zero if device has
* keyboard feedback */
int ptrFeedbackClass; /**< Non-zero if device has
* pointer feedback */
int ledFeedbackClass; /**< Non-zero if device has
* LED indicators */
int belFeedbackClass; /**< Non-zero if device has a
* bell */
int intFeedbackClass; /**< Non-zero if device has
* integer feedback */
int strFeedbackClass; /**< Non-zero if device has
* string feedback */
int maxSymbols; /**< Maximum symbols */
int maxSymbolsSupported; /**< Maximum symbols supported */
KeySym *symbols; /**< Key symbols */
} DMXLocalInitInfo, *DMXLocalInitInfoPtr;
typedef pointer (*dmxCreatePrivateProcPtr)(DeviceIntPtr);
typedef void (*dmxDestroyPrivateProcPtr)(pointer);
typedef void (*dmxInitProcPtr)(DevicePtr);
typedef void (*dmxReInitProcPtr)(DevicePtr);
typedef void (*dmxLateReInitProcPtr)(DevicePtr);
typedef void (*dmxGetInfoProcPtr)(DevicePtr, DMXLocalInitInfoPtr);
typedef int (*dmxOnProcPtr)(DevicePtr);
typedef void (*dmxOffProcPtr)(DevicePtr);
typedef void (*dmxUpdatePositionProcPtr)(pointer, int x, int y);
typedef void (*dmxVTPreSwitchProcPtr)(pointer); /* Turn I/O Off */
typedef void (*dmxVTPostSwitchProcPtr)(pointer); /* Turn I/O On */
typedef void (*dmxVTSwitchReturnProcPtr)(pointer);
typedef int (*dmxVTSwitchProcPtr)(pointer, int vt,
dmxVTSwitchReturnProcPtr, pointer);
typedef void (*dmxMotionProcPtr)(DevicePtr,
int *valuators,
int firstAxis,
int axesCount,
DMXMotionType type,
DMXBlockType block);
typedef void (*dmxEnqueueProcPtr)(DevicePtr, int type, int detail,
KeySym keySym, XEvent *e,
DMXBlockType block);
typedef int (*dmxCheckSpecialProcPtr)(DevicePtr, KeySym keySym);
typedef void (*dmxCollectEventsProcPtr)(DevicePtr,
dmxMotionProcPtr,
dmxEnqueueProcPtr,
dmxCheckSpecialProcPtr,
DMXBlockType);
typedef void (*dmxProcessInputProcPtr)(pointer);
typedef void (*dmxUpdateInfoProcPtr)(pointer, DMXUpdateType, WindowPtr);
typedef int (*dmxFunctionsProcPtr)(pointer, DMXFunctionType);
typedef void (*dmxKBCtrlProcPtr)(DevicePtr, KeybdCtrl *ctrl);
typedef void (*dmxMCtrlProcPtr)(DevicePtr, PtrCtrl *ctrl);
typedef void (*dmxKBBellProcPtr)(DevicePtr, int percent,
int volume, int pitch, int duration);
/** Stores a mapping between the device id on the remote X server and
* the id on the DMX server */
typedef struct _DMXEventMap {
int remote; /**< Event number on remote X server */
int server; /**< Event number (unbiased) on DMX server */
} DMXEventMap;
/** This is the device-independent structure used by the low-level input
* routines. The contents are not exposed to top-level .c files (except
* dmxextensions.c). \see dmxinput.h \see dmxextensions.c */
typedef struct _DMXLocalInputInfo {
const char *name; /**< Device name */
DMXLocalInputType type; /**< Device type */
DMXLocalInputExtType extType; /**< Extended device type */
int binding; /**< Count of how many consecutive
* structs are bound to the same
* device */
/* Low-level (e.g., keyboard/mouse drivers) */
dmxCreatePrivateProcPtr create_private; /**< Create
* device-dependent
* private */
dmxDestroyPrivateProcPtr destroy_private; /**< Destroy
* device-dependent
* private */
dmxInitProcPtr init; /**< Initialize device */
dmxReInitProcPtr reinit; /**< Reinitialize device
* (during a
* reconfiguration) */
dmxLateReInitProcPtr latereinit; /**< Reinitialize a device
* (called very late
* during a
* reconfiguration) */
dmxGetInfoProcPtr get_info; /**< Get device information */
dmxOnProcPtr on; /**< Turn device on */
dmxOffProcPtr off; /**< Turn device off */
dmxUpdatePositionProcPtr update_position; /**< Called when another
* device updates the
* cursor position */
dmxVTPreSwitchProcPtr vt_pre_switch; /**< Called before a VT switch */
dmxVTPostSwitchProcPtr vt_post_switch; /**< Called after a VT switch */
dmxVTSwitchProcPtr vt_switch; /**< Causes a VT switch */
dmxCollectEventsProcPtr collect_events; /**< Collect and enqueue
* events from the
* device*/
dmxProcessInputProcPtr process_input; /**< Process event (from
* queue) */
dmxFunctionsProcPtr functions;
dmxUpdateInfoProcPtr update_info; /**< Update window layout
* information */
dmxMCtrlProcPtr mCtrl; /**< Pointer control */
dmxKBCtrlProcPtr kCtrl; /**< Keyboard control */
dmxKBBellProcPtr kBell; /**< Bell control */
pointer private; /**< Device-dependent private */
int isCore; /**< Is a DMX core device */
int sendsCore; /**< Sends DMX core events */
KeybdCtrl kctrl; /**< Keyboard control */
PtrCtrl mctrl; /**< Pointer control */
DeviceIntPtr pDevice; /**< X-level device */
int inputIdx; /**< High-level index */
int lastX, lastY; /**< Last known position;
* for XInput in
* dmxevents.c */
int head; /**< XInput motion history
* head */
int tail; /**< XInput motion history
* tail */
unsigned long *history; /**< XInput motion history */
int *valuators; /**< Cache of previous values */
/* for XInput ChangePointerDevice */
int (*savedMotionProc)(DeviceIntPtr,
xTimecoord *,
unsigned long,
unsigned long,
ScreenPtr);
int savedMotionEvents; /**< Saved motion events */
int savedSendsCore; /**< Saved sends-core flag */
DMXEventMap map[DMX_MAP_ENTRIES]; /**< XInput device id map */
int mapOptimize; /**< XInput device id
* map
* optimization */
long deviceId; /**< device id on remote side,
* if any */
const char *deviceName; /**< devive name on remote
* side, if any */
} DMXLocalInputInfoRec;
extern DMXLocalInputInfoPtr dmxLocalCorePointer, dmxLocalCoreKeyboard;
extern void dmxLocalInitInput(DMXInputInfo *dmxInput);
extern DMXLocalInputInfoPtr dmxInputCopyLocal(DMXInputInfo *dmxInput,
DMXLocalInputInfoPtr s);
extern void dmxChangePointerControl(DeviceIntPtr pDevice, PtrCtrl *ctrl);
extern void dmxKeyboardKbdCtrlProc(DeviceIntPtr pDevice, KeybdCtrl *ctrl);
extern void dmxKeyboardBellProc(int percent, DeviceIntPtr pDevice,
pointer ctrl, int unknown);
extern int dmxInputExtensionErrorHandler(Display *dsp, char *name,
char *reason);
extern int dmxInputDetach(DMXInputInfo *dmxInput);
extern void dmxInputDetachAll(DMXScreenInfo *dmxScreen);
extern int dmxInputDetachId(int id);
extern DMXInputInfo *dmxInputLocateId(int id);
extern int dmxInputAttachConsole(const char *name, int isCore,
int *id);
extern int dmxInputAttachBackend(int physicalScreen, int isCore,
int *id);
#endif
|