home *** CD-ROM | disk | FTP | other *** search
- /* x11_keys.c -- Event translation for X11
- Copyright (C) 1993, 1994 John Harper <jsh@ukc.ac.uk>
-
- This file is part of Jade.
-
- Jade is free software; you can redistribute it and/or modify it
- under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2, or (at your option)
- any later version.
-
- Jade is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with Jade; see the file COPYING. If not, write to
- the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
-
- #include "jade.h"
- #include "jade_protos.h"
-
- #include <string.h>
- #include <X11/keysym.h>
- #include <X11/Xutil.h>
-
- #ifdef SWAP_DELETE_KEYS
- # define XK_DELETE XK_BackSpace
- # define XK_BACKSPACE XK_Delete
- #else
- # define XK_DELETE XK_Delete
- # define XK_BACKSPACE XK_BackSpace
- #endif
-
- _PR void translateevent(Event *, XEvent *);
- _PR int cookkey(void *, u_char *, int);
- _PR bool lookupevent(EventDef *, u_char *);
-
- static void
- translatemods(EventDef *evd, unsigned int state)
- {
- if(state & ShiftMask)
- evd->evd_Mods |= EV_MOD_SHIFT;
- if(state & LockMask)
- evd->evd_Mods ^= EV_MOD_SHIFT;
- if(state & ControlMask)
- evd->evd_Mods |= EV_MOD_CTRL;
- if(state & Mod1Mask)
- evd->evd_Mods |= EV_MOD_MOD1;
- if(state & Mod2Mask)
- evd->evd_Mods |= EV_MOD_MOD2;
- if(state & Mod3Mask)
- evd->evd_Mods |= EV_MOD_MOD3;
- if(state & Mod4Mask)
- evd->evd_Mods |= EV_MOD_MOD4;
- if(state & Mod5Mask)
- evd->evd_Mods |= EV_MOD_MOD5;
- if(state & Button1Mask)
- evd->evd_Mods |= EV_MOD_BUTTON1;
- if(state & Button2Mask)
- evd->evd_Mods |= EV_MOD_BUTTON2;
- if(state & Button3Mask)
- evd->evd_Mods |= EV_MOD_BUTTON3;
- if(state & Button4Mask)
- evd->evd_Mods |= EV_MOD_BUTTON4;
- if(state & Button5Mask)
- evd->evd_Mods |= EV_MOD_BUTTON5;
- }
-
- void
- translateevent(Event *ev, XEvent *xev)
- {
- static Time LastClick;
- switch(xev->type)
- {
- case KeyPress:
- translatemods(&ev->ev_EventDef, xev->xkey.state);
- if(ev->ev_EventDef.evd_Mods & EV_MOD_SHIFT)
- {
- /*
- * some keys don't have keysym at index 1, if not treat it as
- * normal keysym shifted
- */
- ev->ev_EventDef.evd_Code = XKeycodeToKeysym(XDisplay,
- xev->xkey.keycode, 1);
- if(ev->ev_EventDef.evd_Code == NoSymbol)
- {
- ev->ev_EventDef.evd_Code = XKeycodeToKeysym(XDisplay,
- xev->xkey.keycode,
- 0);
- }
- else
- ev->ev_EventDef.evd_Mods &= ~EV_MOD_SHIFT;
- }
- else
- {
- ev->ev_EventDef.evd_Code = XKeycodeToKeysym(XDisplay,
- xev->xkey.keycode, 0);
- }
- if((ev->ev_EventDef.evd_Code != NoSymbol)
- && (!IsModifierKey(ev->ev_EventDef.evd_Code)))
- {
- ev->ev_EventDef.evd_Type = EV_TYPE_KEYBD;
- }
- break;
- case ButtonPress:
- if(xev->xbutton.time < (LastClick + DOUBLE_CLICK_TIME))
- ev->ev_EventDef.evd_Code = EV_CODE_MOUSE_CLICK2;
- else
- ev->ev_EventDef.evd_Code = EV_CODE_MOUSE_CLICK1;
- LastClick = xev->xbutton.time;
- goto button;
- break;
- case ButtonRelease:
- ev->ev_EventDef.evd_Code = EV_CODE_MOUSE_UP;
- button:
- ev->ev_EventDef.evd_Type = EV_TYPE_MOUSE;
- ev->ev_Data_MouseX = xev->xbutton.x;
- ev->ev_Data_MouseY = xev->xbutton.y;
- translatemods(&ev->ev_EventDef, xev->xbutton.state);
- switch(xev->xbutton.button)
- {
- case Button1:
- ev->ev_EventDef.evd_Mods |= EV_MOD_BUTTON1;
- break;
- case Button2:
- ev->ev_EventDef.evd_Mods |= EV_MOD_BUTTON2;
- break;
- case Button3:
- ev->ev_EventDef.evd_Mods |= EV_MOD_BUTTON3;
- break;
- case Button4:
- ev->ev_EventDef.evd_Mods |= EV_MOD_BUTTON4;
- break;
- case Button5:
- ev->ev_EventDef.evd_Mods |= EV_MOD_BUTTON5;
- break;
- }
- break;
- }
- }
-
- int
- cookkey(void *event, u_char *buf, int buflen)
- {
- XKeyEvent *xk = event;
- KeySym ks;
- return(XLookupString(xk, buf, buflen, &ks, NULL));
- }
-
- /*
- * Stuff to translate textual key descriptions into key codes
- */
-
- typedef struct
- {
- u_char *kd_Name;
- EventDef kd_Event;
- } KeyDesc;
-
- static const KeyDesc KeyDescr[] =
- {
- "SHIFT", { 0, EV_MOD_SHIFT, 0 },
- "SFT", { 0, EV_MOD_SHIFT, 0 },
- "CONTROL", { 0, EV_MOD_CTRL, 0 },
- "CTRL", { 0, EV_MOD_CTRL, 0 },
- "CTL", { 0, EV_MOD_CTRL, 0 },
- "MOD1", { 0, EV_MOD_MOD1, 0 },
- "META", { 0, EV_MOD_META, 0 },
- "MOD2", { 0, EV_MOD_MOD2, 0 },
- "AMIGA", { 0, EV_MOD_MOD2, 0 },
- "MOD3", { 0, EV_MOD_MOD3, 0 },
- "MOD4", { 0, EV_MOD_MOD4, 0 },
- "BUTTON1", { 0, EV_MOD_BUTTON1, 0 },
- "LMB", { 0, EV_MOD_LMB, 0 },
- "BUTTON2", { 0, EV_MOD_BUTTON2, 0 },
- "MMB", { 0, EV_MOD_MMB, 0 },
- "BUTTON3", { 0, EV_MOD_BUTTON3, 0 },
- "RMB", { 0, EV_MOD_RMB, 0 },
- "BUTTON4", { 0, EV_MOD_BUTTON4, 0 },
- "BUTTON5", { 0, EV_MOD_BUTTON5, 0 },
-
- "SPACE", { EV_TYPE_KEYBD, 0, XK_space },
- "SPACEBAR", { EV_TYPE_KEYBD, 0, XK_space },
- "SPC", { EV_TYPE_KEYBD, 0, XK_space },
- "TAB", { EV_TYPE_KEYBD, 0, XK_Tab },
- "RETURN", { EV_TYPE_KEYBD, 0, XK_Return },
- "RET", { EV_TYPE_KEYBD, 0, XK_Return },
- "ESC", { EV_TYPE_KEYBD, 0, XK_Escape },
- "ESCAPE", { EV_TYPE_KEYBD, 0, XK_Escape },
- "BACKSPACE", { EV_TYPE_KEYBD, 0, XK_BACKSPACE },
- "BS", { EV_TYPE_KEYBD, 0, XK_BACKSPACE },
- "DEL", { EV_TYPE_KEYBD, 0, XK_DELETE },
- "DELETE", { EV_TYPE_KEYBD, 0, XK_DELETE },
- "HELP", { EV_TYPE_KEYBD, 0, XK_Help },
- "UP", { EV_TYPE_KEYBD, 0, XK_Up },
- "DOWN", { EV_TYPE_KEYBD, 0, XK_Down },
- "RIGHT", { EV_TYPE_KEYBD, 0, XK_Right },
- "LEFT", { EV_TYPE_KEYBD, 0, XK_Left },
-
- /*
- * X defines lots of long names for these simple keys...
- */
- " ", { EV_TYPE_KEYBD, 0, XK_space },
- "!", { EV_TYPE_KEYBD, 0, XK_exclam },
- "\"", { EV_TYPE_KEYBD, 0, XK_quotedbl },
- "#", { EV_TYPE_KEYBD, 0, XK_numbersign },
- "$", { EV_TYPE_KEYBD, 0, XK_dollar },
- "%", { EV_TYPE_KEYBD, 0, XK_percent },
- "&", { EV_TYPE_KEYBD, 0, XK_ampersand },
- "'", { EV_TYPE_KEYBD, 0, XK_quoteright },
- "(", { EV_TYPE_KEYBD, 0, XK_parenleft },
- ")", { EV_TYPE_KEYBD, 0, XK_parenright },
- "*", { EV_TYPE_KEYBD, 0, XK_asterisk },
- "+", { EV_TYPE_KEYBD, 0, XK_plus },
- ",", { EV_TYPE_KEYBD, 0, XK_comma },
- "-", { EV_TYPE_KEYBD, 0, XK_minus },
- ".", { EV_TYPE_KEYBD, 0, XK_period },
- "/", { EV_TYPE_KEYBD, 0, XK_slash },
- ":", { EV_TYPE_KEYBD, 0, XK_colon },
- ";", { EV_TYPE_KEYBD, 0, XK_semicolon },
- "<", { EV_TYPE_KEYBD, 0, XK_less },
- "=", { EV_TYPE_KEYBD, 0, XK_equal },
- ">", { EV_TYPE_KEYBD, 0, XK_greater },
- "?", { EV_TYPE_KEYBD, 0, XK_question },
- "@", { EV_TYPE_KEYBD, 0, XK_at },
- "[", { EV_TYPE_KEYBD, 0, XK_bracketleft },
- "\\", { EV_TYPE_KEYBD, 0, XK_backslash },
- "]", { EV_TYPE_KEYBD, 0, XK_bracketright },
- "^", { EV_TYPE_KEYBD, 0, XK_asciicircum },
- "_", { EV_TYPE_KEYBD, 0, XK_underscore },
- "`", { EV_TYPE_KEYBD, 0, XK_quoteleft },
- "{", { EV_TYPE_KEYBD, 0, XK_braceleft },
- "|", { EV_TYPE_KEYBD, 0, XK_bar },
- "}", { EV_TYPE_KEYBD, 0, XK_braceright },
- "~", { EV_TYPE_KEYBD, 0, XK_asciitilde },
- "£", { EV_TYPE_KEYBD, 0, XK_sterling },
-
- /* mouse events
- */
- "CLICK1", { EV_TYPE_MOUSE, 0, EV_CODE_MOUSE_CLICK1 },
- "CLICK2", { EV_TYPE_MOUSE, 0, EV_CODE_MOUSE_CLICK2 },
- "OFF", { EV_TYPE_MOUSE, 0, EV_CODE_MOUSE_UP },
- "MOVE", { EV_TYPE_MOUSE, 0, EV_CODE_MOUSE_MOVE },
-
- NULL, 0, 0
- };
-
- /*
- */
- bool
- lookupevent(EventDef *ie, u_char *desc)
- {
- u_char *str = desc;
- bool rc = TRUE;
- for(;;)
- {
- u_char buff[100];
- u_char *tmp = buff;
- u_char c;
- const KeyDesc *kd = KeyDescr;
- /*
- * get this one token
- */
- while((c = *str) && (c != '-') && (c != ' '))
- {
- if(c == '\\')
- str++;
- *tmp++ = *str++;
- }
- *tmp = 0;
- if(*str)
- str++;
- while(kd->kd_Name)
- {
- if(!strcasecmp(kd->kd_Name, buff))
- {
- ie->evd_Type = kd->kd_Event.evd_Type;
- ie->evd_Mods |= kd->kd_Event.evd_Mods;
- ie->evd_Code = kd->kd_Event.evd_Code;
- if(ie->evd_Type)
- goto end;
- break;
- }
- kd++;
- }
- if(!kd->kd_Name)
- {
- unsigned int ks;
- if((ks = XStringToKeysym(buff)) != NoSymbol)
- {
- ie->evd_Type = EV_TYPE_KEYBD;
- ie->evd_Code = ks;
- goto end;
- }
- else
- {
- cmd_signal(sym_bad_event_desc, LIST_1(valstrdup(desc)));
- rc = FALSE;
- goto end;
- }
- }
- }
- end:
- return(rc);
- }
-