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