285 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			285 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			C
		
	
	
	
/*
 | 
						|
 * 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 <faith@redhat.com>
 | 
						|
 *
 | 
						|
 */
 | 
						|
 | 
						|
/** \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 */
 | 
						|
    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 */
 | 
						|
 | 
						|
    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 void *(*dmxCreatePrivateProcPtr) (DeviceIntPtr);
 | 
						|
typedef void (*dmxDestroyPrivateProcPtr) (void *);
 | 
						|
 | 
						|
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) (void *, int x, int y);
 | 
						|
 | 
						|
typedef void (*dmxVTPreSwitchProcPtr) (void *);        /* Turn I/O Off */
 | 
						|
typedef void (*dmxVTPostSwitchProcPtr) (void *);       /* Turn I/O On */
 | 
						|
typedef void (*dmxVTSwitchReturnProcPtr) (void *);
 | 
						|
typedef int (*dmxVTSwitchProcPtr) (void *, int vt,
 | 
						|
                                   dmxVTSwitchReturnProcPtr, void *);
 | 
						|
 | 
						|
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) (void *);
 | 
						|
typedef void (*dmxUpdateInfoProcPtr) (void *, DMXUpdateType, WindowPtr);
 | 
						|
typedef int (*dmxFunctionsProcPtr) (void *, 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 */
 | 
						|
 | 
						|
    void *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,
 | 
						|
                                void *ctrl, int unknown);
 | 
						|
 | 
						|
extern int dmxInputExtensionErrorHandler(Display * dsp, _Xconst char *name,
 | 
						|
                                         _Xconst 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
 |