dmxinputinit.h revision 706f2543
1/* 2 * Copyright 2002 Red Hat Inc., Durham, North Carolina. 3 * 4 * All Rights Reserved. 5 * 6 * Permission is hereby granted, free of charge, to any person obtaining 7 * a copy of this software and associated documentation files (the 8 * "Software"), to deal in the Software without restriction, including 9 * without limitation on the rights to use, copy, modify, merge, 10 * publish, distribute, sublicense, and/or sell copies of the Software, 11 * and to permit persons to whom the Software is furnished to do so, 12 * subject to the following conditions: 13 * 14 * The above copyright notice and this permission notice (including the 15 * next paragraph) shall be included in all copies or substantial 16 * portions of the Software. 17 * 18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 19 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 21 * NON-INFRINGEMENT. IN NO EVENT SHALL RED HAT AND/OR THEIR SUPPLIERS 22 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 23 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 24 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 25 * SOFTWARE. 26 */ 27 28/* 29 * Authors: 30 * Rickard E. (Rik) Faith <faith@redhat.com> 31 * 32 */ 33 34/** \file 35 * Interface for low-level input support. \see dmxinputinit.c */ 36 37#ifndef _DMXINPUTINIT_H_ 38#define _DMXINPUTINIT_H_ 39 40#include "dmx.h" 41#include "dmxinput.h" 42#include "dmxlog.h" 43 44 45#define DMX_LOCAL_DEFAULT_KEYBOARD "kbd" 46#define DMX_LOCAL_DEFAULT_POINTER "ps2" 47#define DMX_MAX_BUTTONS 256 48#define DMX_MOTION_SIZE 256 49#define DMX_MAX_VALUATORS 32 50#define DMX_MAX_AXES 32 51#define DMX_MAX_XINPUT_EVENT_TYPES 100 52#define DMX_MAP_ENTRIES 16 /* Must be a power of 2 */ 53#define DMX_MAP_MASK (DMX_MAP_ENTRIES - 1) 54 55typedef enum { 56 DMX_FUNCTION_GRAB, 57 DMX_FUNCTION_TERMINATE, 58 DMX_FUNCTION_FINE 59} DMXFunctionType; 60 61typedef enum { 62 DMX_LOCAL_HIGHLEVEL, 63 DMX_LOCAL_KEYBOARD, 64 DMX_LOCAL_MOUSE, 65 DMX_LOCAL_OTHER 66} DMXLocalInputType; 67 68typedef enum { 69 DMX_LOCAL_TYPE_LOCAL, 70 DMX_LOCAL_TYPE_CONSOLE, 71 DMX_LOCAL_TYPE_BACKEND, 72 DMX_LOCAL_TYPE_COMMON 73} DMXLocalInputExtType; 74 75typedef enum { 76 DMX_RELATIVE, 77 DMX_ABSOLUTE, 78 DMX_ABSOLUTE_CONFINED 79} DMXMotionType; 80 81/** Stores information from low-level device that is used to initialize 82 * the device at the dix level. */ 83typedef struct _DMXLocalInitInfo { 84 int keyboard; /**< Non-zero if the device is a keyboard */ 85 86 int keyClass; /**< Non-zero if keys are present */ 87 KeySymsRec keySyms; /**< Key symbols */ 88 int freemap; /**< If non-zero, free keySyms.map */ 89 CARD8 modMap[MAP_LENGTH]; /**< Modifier map */ 90 XkbDescPtr xkb; /**< XKB description */ 91 XkbComponentNamesRec names; /**< XKB component names */ 92 int freenames; /**< Non-zero if names should be free'd */ 93 int force; /**< Do not allow command line override */ 94 95 int buttonClass; /**< Non-zero if buttons are present */ 96 int numButtons; /**< Number of buttons */ 97 unsigned char map[DMX_MAX_BUTTONS]; /**< Button map */ 98 99 int valuatorClass; /**< Non-zero if valuators are 100 * present */ 101 int numRelAxes; /**< Number of relative axes */ 102 int numAbsAxes; /**< Number of absolute axes */ 103 int minval[DMX_MAX_AXES]; /**< Minimum values */ 104 int maxval[DMX_MAX_AXES]; /**< Maximum values */ 105 int res[DMX_MAX_AXES]; /**< Resolution */ 106 int minres[DMX_MAX_AXES]; /**< Minimum resolutions */ 107 int maxres[DMX_MAX_AXES]; /**< Maximum resolutions */ 108 109 int focusClass; /**< Non-zero if device can 110 * cause focus */ 111 int proximityClass; /**< Non-zero if device 112 * causes proximity events */ 113 int kbdFeedbackClass; /**< Non-zero if device has 114 * keyboard feedback */ 115 int ptrFeedbackClass; /**< Non-zero if device has 116 * pointer feedback */ 117 int ledFeedbackClass; /**< Non-zero if device has 118 * LED indicators */ 119 int belFeedbackClass; /**< Non-zero if device has a 120 * bell */ 121 int intFeedbackClass; /**< Non-zero if device has 122 * integer feedback */ 123 int strFeedbackClass; /**< Non-zero if device has 124 * string feedback */ 125 126 int maxSymbols; /**< Maximum symbols */ 127 int maxSymbolsSupported; /**< Maximum symbols supported */ 128 KeySym *symbols; /**< Key symbols */ 129} DMXLocalInitInfo, *DMXLocalInitInfoPtr; 130 131typedef pointer (*dmxCreatePrivateProcPtr)(DeviceIntPtr); 132typedef void (*dmxDestroyPrivateProcPtr)(pointer); 133 134typedef void (*dmxInitProcPtr)(DevicePtr); 135typedef void (*dmxReInitProcPtr)(DevicePtr); 136typedef void (*dmxLateReInitProcPtr)(DevicePtr); 137typedef void (*dmxGetInfoProcPtr)(DevicePtr, DMXLocalInitInfoPtr); 138typedef int (*dmxOnProcPtr)(DevicePtr); 139typedef void (*dmxOffProcPtr)(DevicePtr); 140typedef void (*dmxUpdatePositionProcPtr)(pointer, int x, int y); 141 142typedef void (*dmxVTPreSwitchProcPtr)(pointer); /* Turn I/O Off */ 143typedef void (*dmxVTPostSwitchProcPtr)(pointer); /* Turn I/O On */ 144typedef void (*dmxVTSwitchReturnProcPtr)(pointer); 145typedef int (*dmxVTSwitchProcPtr)(pointer, int vt, 146 dmxVTSwitchReturnProcPtr, pointer); 147 148typedef void (*dmxMotionProcPtr)(DevicePtr, 149 int *valuators, 150 int firstAxis, 151 int axesCount, 152 DMXMotionType type, 153 DMXBlockType block); 154typedef void (*dmxEnqueueProcPtr)(DevicePtr, int type, int detail, 155 KeySym keySym, XEvent *e, 156 DMXBlockType block); 157typedef int (*dmxCheckSpecialProcPtr)(DevicePtr, KeySym keySym); 158typedef void (*dmxCollectEventsProcPtr)(DevicePtr, 159 dmxMotionProcPtr, 160 dmxEnqueueProcPtr, 161 dmxCheckSpecialProcPtr, 162 DMXBlockType); 163typedef void (*dmxProcessInputProcPtr)(pointer); 164typedef void (*dmxUpdateInfoProcPtr)(pointer, DMXUpdateType, WindowPtr); 165typedef int (*dmxFunctionsProcPtr)(pointer, DMXFunctionType); 166 167typedef void (*dmxKBCtrlProcPtr)(DevicePtr, KeybdCtrl *ctrl); 168typedef void (*dmxMCtrlProcPtr)(DevicePtr, PtrCtrl *ctrl); 169typedef void (*dmxKBBellProcPtr)(DevicePtr, int percent, 170 int volume, int pitch, int duration); 171 172/** Stores a mapping between the device id on the remote X server and 173 * the id on the DMX server */ 174typedef struct _DMXEventMap { 175 int remote; /**< Event number on remote X server */ 176 int server; /**< Event number (unbiased) on DMX server */ 177} DMXEventMap; 178 179/** This is the device-independent structure used by the low-level input 180 * routines. The contents are not exposed to top-level .c files (except 181 * dmxextensions.c). \see dmxinput.h \see dmxextensions.c */ 182typedef struct _DMXLocalInputInfo { 183 const char *name; /**< Device name */ 184 DMXLocalInputType type; /**< Device type */ 185 DMXLocalInputExtType extType; /**< Extended device type */ 186 int binding; /**< Count of how many consecutive 187 * structs are bound to the same 188 * device */ 189 190 /* Low-level (e.g., keyboard/mouse drivers) */ 191 192 dmxCreatePrivateProcPtr create_private; /**< Create 193 * device-dependent 194 * private */ 195 dmxDestroyPrivateProcPtr destroy_private; /**< Destroy 196 * device-dependent 197 * private */ 198 dmxInitProcPtr init; /**< Initialize device */ 199 dmxReInitProcPtr reinit; /**< Reinitialize device 200 * (during a 201 * reconfiguration) */ 202 dmxLateReInitProcPtr latereinit; /**< Reinitialize a device 203 * (called very late 204 * during a 205 * reconfiguration) */ 206 dmxGetInfoProcPtr get_info; /**< Get device information */ 207 dmxOnProcPtr on; /**< Turn device on */ 208 dmxOffProcPtr off; /**< Turn device off */ 209 dmxUpdatePositionProcPtr update_position; /**< Called when another 210 * device updates the 211 * cursor position */ 212 dmxVTPreSwitchProcPtr vt_pre_switch; /**< Called before a VT switch */ 213 dmxVTPostSwitchProcPtr vt_post_switch; /**< Called after a VT switch */ 214 dmxVTSwitchProcPtr vt_switch; /**< Causes a VT switch */ 215 216 dmxCollectEventsProcPtr collect_events; /**< Collect and enqueue 217 * events from the 218 * device*/ 219 dmxProcessInputProcPtr process_input; /**< Process event (from 220 * queue) */ 221 dmxFunctionsProcPtr functions; 222 dmxUpdateInfoProcPtr update_info; /**< Update window layout 223 * information */ 224 225 dmxMCtrlProcPtr mCtrl; /**< Pointer control */ 226 dmxKBCtrlProcPtr kCtrl; /**< Keyboard control */ 227 dmxKBBellProcPtr kBell; /**< Bell control */ 228 229 pointer private; /**< Device-dependent private */ 230 int isCore; /**< Is a DMX core device */ 231 int sendsCore; /**< Sends DMX core events */ 232 KeybdCtrl kctrl; /**< Keyboard control */ 233 PtrCtrl mctrl; /**< Pointer control */ 234 235 DeviceIntPtr pDevice; /**< X-level device */ 236 int inputIdx; /**< High-level index */ 237 int lastX, lastY; /**< Last known position; 238 * for XInput in 239 * dmxevents.c */ 240 241 int head; /**< XInput motion history 242 * head */ 243 int tail; /**< XInput motion history 244 * tail */ 245 unsigned long *history; /**< XInput motion history */ 246 int *valuators; /**< Cache of previous values */ 247 248 /* for XInput ChangePointerDevice */ 249 int (*savedMotionProc)(DeviceIntPtr, 250 xTimecoord *, 251 unsigned long, 252 unsigned long, 253 ScreenPtr); 254 int savedMotionEvents; /**< Saved motion events */ 255 int savedSendsCore; /**< Saved sends-core flag */ 256 257 DMXEventMap map[DMX_MAP_ENTRIES]; /**< XInput device id map */ 258 int mapOptimize; /**< XInput device id 259 * map 260 * optimization */ 261 262 long deviceId; /**< device id on remote side, 263 * if any */ 264 const char *deviceName; /**< devive name on remote 265 * side, if any */ 266} DMXLocalInputInfoRec; 267 268extern DMXLocalInputInfoPtr dmxLocalCorePointer, dmxLocalCoreKeyboard; 269 270extern void dmxLocalInitInput(DMXInputInfo *dmxInput); 271extern DMXLocalInputInfoPtr dmxInputCopyLocal(DMXInputInfo *dmxInput, 272 DMXLocalInputInfoPtr s); 273 274extern void dmxChangePointerControl(DeviceIntPtr pDevice, PtrCtrl *ctrl); 275extern void dmxKeyboardKbdCtrlProc(DeviceIntPtr pDevice, KeybdCtrl *ctrl); 276extern void dmxKeyboardBellProc(int percent, DeviceIntPtr pDevice, 277 pointer ctrl, int unknown); 278 279extern int dmxInputExtensionErrorHandler(Display *dsp, _Xconst char *name, 280 _Xconst char *reason); 281 282extern int dmxInputDetach(DMXInputInfo *dmxInput); 283extern void dmxInputDetachAll(DMXScreenInfo *dmxScreen); 284extern int dmxInputDetachId(int id); 285extern DMXInputInfo *dmxInputLocateId(int id); 286extern int dmxInputAttachConsole(const char *name, int isCore, 287 int *id); 288extern int dmxInputAttachBackend(int physicalScreen, int isCore, 289 int *id); 290 291#endif 292