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