wq.h revision 1a30de1f
11a30de1fSmrg/* $Xorg: wq.h,v 1.4 2001/02/09 02:05:56 xorgcvs Exp $ */
21a30de1fSmrg/*
31a30de1fSmrg
41a30de1fSmrgCopyright 1988, 1998  The Open Group
51a30de1fSmrg
61a30de1fSmrgPermission to use, copy, modify, distribute, and sell this software and its
71a30de1fSmrgdocumentation for any purpose is hereby granted without fee, provided that
81a30de1fSmrgthe above copyright notice appear in all copies and that both that
91a30de1fSmrgcopyright notice and this permission notice appear in supporting
101a30de1fSmrgdocumentation.
111a30de1fSmrg
121a30de1fSmrgThe above copyright notice and this permission notice shall be included
131a30de1fSmrgin all copies or substantial portions of the Software.
141a30de1fSmrg
151a30de1fSmrgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
161a30de1fSmrgOR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
171a30de1fSmrgMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
181a30de1fSmrgIN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR
191a30de1fSmrgOTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
201a30de1fSmrgARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
211a30de1fSmrgOTHER DEALINGS IN THE SOFTWARE.
221a30de1fSmrg
231a30de1fSmrgExcept as contained in this notice, the name of The Open Group shall
241a30de1fSmrgnot be used in advertising or otherwise to promote the sale, use or
251a30de1fSmrgother dealings in this Software without prior written authorization
261a30de1fSmrgfrom The Open Group.
271a30de1fSmrg
281a30de1fSmrg*/
291a30de1fSmrg/* $XFree86: xc/programs/xmodmap/wq.h,v 1.4 2001/01/17 23:46:21 dawes Exp $ */
301a30de1fSmrg
311a30de1fSmrg#ifndef _WQ_H
321a30de1fSmrg#define _WQ_H
331a30de1fSmrg
341a30de1fSmrg/*
351a30de1fSmrg * Input is parsed and a work queue is built that is executed later.  This
361a30de1fSmrg * allows us to swap keys as well as ensure that we don't mess up the keyboard
371a30de1fSmrg * by doing a partial rebind.
381a30de1fSmrg */
391a30de1fSmrg
401a30de1fSmrgenum opcode { doKeycode, doAddModifier, doRemoveModifier, doClearModifier,
411a30de1fSmrg	      doPointer };
421a30de1fSmrg
431a30de1fSmrgstruct op_generic {
441a30de1fSmrg    enum opcode type;			/* oneof enum opcode */
451a30de1fSmrg    union op *next;			/* next element in list or NULL */
461a30de1fSmrg};
471a30de1fSmrg
481a30de1fSmrg
491a30de1fSmrg/*
501a30de1fSmrg * keycode KEYCODE = KEYSYM
511a30de1fSmrg * keysym OLDKEYSYM = NEWKEYSYM
521a30de1fSmrg *
531a30de1fSmrg * want to eval the OLDKEYSYM before executing the work list so that it isn't
541a30de1fSmrg * effected by any assignments.
551a30de1fSmrg */
561a30de1fSmrg
571a30de1fSmrgstruct op_keycode {
581a30de1fSmrg    enum opcode type;			/* doKeycode */
591a30de1fSmrg    union op *next;			/* next element in list or NULL */
601a30de1fSmrg    KeyCode target_keycode;		/* key to which we are assigning */
611a30de1fSmrg    int count;				/* number of new keysyms */
621a30de1fSmrg    KeySym *keysyms;			/* new values to insert */
631a30de1fSmrg};
641a30de1fSmrg
651a30de1fSmrg
661a30de1fSmrg/*
671a30de1fSmrg * add MODIFIER = KEYSYM ...
681a30de1fSmrg */
691a30de1fSmrg
701a30de1fSmrgstruct op_addmodifier {
711a30de1fSmrg    enum opcode type;			/* doAddModifier */
721a30de1fSmrg    union op *next;			/* next element in list or NULL */
731a30de1fSmrg    int modifier;			/* index into modifier list */
741a30de1fSmrg    int count;				/* number of keysyms */
751a30de1fSmrg    KeySym *keysyms;			/* new values to insert */
761a30de1fSmrg};
771a30de1fSmrg
781a30de1fSmrg
791a30de1fSmrg/*
801a30de1fSmrg * remove MODIFIER = OLDKEYSYM ...
811a30de1fSmrg *
821a30de1fSmrg * want to eval the OLDKEYSYM before executing the work list so that it isn't
831a30de1fSmrg * effected by any assignments.
841a30de1fSmrg */
851a30de1fSmrg
861a30de1fSmrgstruct op_removemodifier {
871a30de1fSmrg    enum opcode type;			/* doRemoveModifier */
881a30de1fSmrg    union op *next;			/* next element in list or NULL */
891a30de1fSmrg    int modifier;			/* index into modifier list */
901a30de1fSmrg    int count;				/* number of keysyms */
911a30de1fSmrg    KeyCode *keycodes;			/* old values to remove */
921a30de1fSmrg};
931a30de1fSmrg
941a30de1fSmrg
951a30de1fSmrg/*
961a30de1fSmrg * clear MODIFIER
971a30de1fSmrg */
981a30de1fSmrg
991a30de1fSmrgstruct op_clearmodifier {
1001a30de1fSmrg    enum opcode type;			/* doClearModifier */
1011a30de1fSmrg    union op *next;			/* next element in list or NULL */
1021a30de1fSmrg    int modifier;			/* index into modifier list */
1031a30de1fSmrg};
1041a30de1fSmrg
1051a30de1fSmrg/*
1061a30de1fSmrg * pointer = NUMBER ...
1071a30de1fSmrg *
1081a30de1fSmrg * set pointer map to the positive numbers given on the right hand side
1091a30de1fSmrg */
1101a30de1fSmrg
1111a30de1fSmrg#define MAXBUTTONCODES 256		/* there are eight bits of buttons */
1121a30de1fSmrg
1131a30de1fSmrgstruct op_pointer {
1141a30de1fSmrg    enum opcode type;			/* doPointer */
1151a30de1fSmrg    union op *next;			/* next element in list or NULL */
1161a30de1fSmrg    int count;				/* number of new button codes */
1171a30de1fSmrg    unsigned char button_codes[MAXBUTTONCODES];
1181a30de1fSmrg};
1191a30de1fSmrg
1201a30de1fSmrg
1211a30de1fSmrg/*
1221a30de1fSmrg * all together now
1231a30de1fSmrg */
1241a30de1fSmrgunion op {
1251a30de1fSmrg    struct op_generic generic;
1261a30de1fSmrg    struct op_keycode keycode;
1271a30de1fSmrg    struct op_addmodifier addmodifier;
1281a30de1fSmrg    struct op_removemodifier removemodifier;
1291a30de1fSmrg    struct op_clearmodifier clearmodifier;
1301a30de1fSmrg    struct op_pointer pointer;
1311a30de1fSmrg};
1321a30de1fSmrg
1331a30de1fSmrgextern struct wq {
1341a30de1fSmrg    union op *head;
1351a30de1fSmrg    union op *tail;
1361a30de1fSmrg} work_queue;
1371a30de1fSmrg
1381a30de1fSmrg
1391a30de1fSmrgextern struct modtab {
1401a30de1fSmrg    char *name;
1411a30de1fSmrg    int length;
1421a30de1fSmrg    int value;
1431a30de1fSmrg} modifier_table[];
1441a30de1fSmrg
1451a30de1fSmrg#define AllocStruct(s) ((s *) malloc (sizeof (s)))
1461a30de1fSmrg
1471a30de1fSmrg#define MAXKEYSYMNAMESIZE 80		/* absurdly large */
1481a30de1fSmrg
1491a30de1fSmrg#endif
150