source: golgotha/src/i4/device/keys.cc @ 80

Last change on this file since 80 was 80, checked in by Sam Hocevar, 12 years ago
  • Adding the Golgotha source code. Not sure what's going to be interesting in there, but since it's all public domain, there's certainly stuff to pick up.
File size: 7.5 KB
Line 
1/********************************************************************** <BR>
2  This file is part of Crack dot Com's free source code release of
3  Golgotha. <a href="http://www.crack.com/golgotha_release"> <BR> for
4  information about compiling & licensing issues visit this URL</a>
5  <PRE> If that doesn't help, contact Jonathan Clark at
6  golgotha_source@usa.net (Subject should have "GOLG" in it)
7***********************************************************************/
8
9#include "device/keys.hh"
10#include <string.h>
11
12static char *i4_extended_key_names[]=
13//{{{
14{
15  "Up",
16  "Down",
17  "Left",
18  "Right",
19  "Left Ctrl",
20  "Right Ctrl",
21  "Left Alt",
22  "Right Alt",
23  "Left Shift",
24  "Right Shift",
25  "Caps Lock",
26  "Num Lock",
27  "Home",
28  "End",
29  "Del",
30  "F1",
31  "F2",
32  "F3",
33  "F4",
34  "F5",
35  "F6",
36  "F7",
37  "F8",
38  "F9",
39  "F10",
40  "F11",
41  "F12",
42  "F13",
43  "F14",
44  "F15",
45  "Insert",
46  "PageUp",
47  "PageDown",
48  "Command",
49  "Pad 0",
50  "Pad 1",
51  "Pad 2",
52  "Pad 3",
53  "Pad 4",
54  "Pad 5",
55  "Pad 6",
56  "Pad 7",
57  "Pad 8",
58  "Pad 9",
59  "Pad =",
60  "Pad /",
61  "Pad *",
62  "Pad -",
63  "Pad +",
64  "Pad Enter",
65  "Pad ."
66};
67//}}}
68
69static struct i4_key_alias_struct { i4_key key; char *name; }
70i4_key_alias[] =
71{
72  { I4_BACKSPACE,    "Backspace" },
73  { I4_TAB,          "Tab"       },
74  { I4_ENTER,        "Enter"     },
75  { I4_ESC,          "Escape"    },
76  { I4_SPACE,        "Space"     }
77};
78const int i4_key_aliases=sizeof(i4_key_alias)/sizeof(i4_key_alias_struct);
79
80static struct i4_modifier_map_struct { w16 modifier; char *name; }
81i4_modifier_map[] =
82{
83  { I4_MODIFIER_CTRL,    "Ctrl"  },
84  { I4_MODIFIER_ALT,     "Alt"   },
85  { I4_MODIFIER_SHIFT,   "Shift" },
86};
87const int i4_modifiers = sizeof(i4_modifier_map)/sizeof(i4_modifier_map_struct);
88
89
90char *i4_get_key_name(i4_key key, w16 modifiers, char *out)
91//{{{
92{
93  char *buffer,*p;
94  char sing[2];
95  w32 i;
96
97  if (key>255 && key<I4_NUM_KEYS)
98    // extended key name
99    buffer = i4_extended_key_names[key-256];
100  else
101  {
102    // search standard key aliases
103    i=0;
104    while (i<i4_key_aliases && key!=i4_key_alias[i].key)
105      i++;
106
107    if (i<i4_key_aliases)
108      // found key alias
109      buffer = i4_key_alias[i].name;
110    else
111    {
112      // not found, assume normal ascii key
113      buffer = sing;
114      buffer[0]=(key>='a' && key<='z') ? (key-'a'+'A') : key;
115      buffer[1]=0;
116    }
117  }
118
119  p=out;
120  for (i=0; i<i4_modifiers; i++)
121    if (modifiers & i4_modifier_map[i].modifier)
122    {
123      strcpy(p,i4_modifier_map[i].name);
124      p += strlen(p);
125      *p++='+';
126    }
127  strcpy(p,buffer);
128 
129  return out;
130}
131//}}}
132
133
134i4_str *i4_key_name(i4_key key, w16 modifiers)
135//{{{
136{
137  char buff[256];
138 
139  return i4_from_ascii(i4_get_key_name(key,modifiers,buff));
140}
141//}}}
142
143i4_bool i4_find_key(const i4_str& name, i4_key &key, w16 &mod)
144//{{{
145{
146  i4_str::iterator p(name.begin());
147  char buf[256];
148  w32 len=0;
149  w32 i;
150
151  // clear values
152  mod = key = 0;
153  int combo_key=0;
154
155  // parse key names & modifiers
156  buf[0]=0;
157  while ((*p).value() && len<sizeof(buf)-1)
158  {
159    while (len<sizeof(buf)-1 && (*p).value() && *p!=i4_char('+'))
160    {
161      buf[len] = (*p).value();
162      ++len;
163      ++p;
164    }
165    buf[len]=0;
166
167    if ((*p).value())
168    {
169      combo_key=1;
170      ++p;
171      if (!(*p).value())
172      {
173        buf[len++]='+';
174        buf[len]=0;
175      }
176      else
177        len = 0;
178    }
179
180    // scan for modifiers
181    for (i=0; i<i4_modifiers; i++)
182      if (!strcmp(buf, i4_modifier_map[i].name))
183        mod |= i4_modifier_map[i].modifier;
184  }
185  if (len>=sizeof(buf)-1 || len==0)
186    // no key name can be THAT long or THAT short
187    return i4_F;
188  if (len>1)
189  {
190    // found a named key
191
192    // search common key aliases
193    i=0;
194    while (i<i4_key_aliases && strcmp(buf, i4_key_alias[i].name))
195      i++;
196   
197    if (i<i4_key_aliases)
198      key = i4_key_alias[i].key;
199    else
200    {
201      // search extended key names
202      i=256;
203      while (i<I4_NUM_KEYS && strcmp(buf,i4_extended_key_names[i-256]))
204        i++;
205
206      if (i<I4_NUM_KEYS)
207        key = i;
208      else if (combo_key || mod==0)
209        return i4_F;
210      else
211        return i4_T;
212    }
213  }
214  else
215    // use ascii value for key (uppercase)
216    key=(buf[0]>='a' && buf[0]<='z') ? (buf[0]-'a'+'A') : buf[0];
217
218  return i4_T;
219}
220//}}}
221
222
223enum
224//{{{ Internal modifier key translation flags
225{
226  I4_SHIFT_L_FLAG = 1,
227  I4_SHIFT_R_FLAG = 2,
228  I4_CAPS_FLAG = 4,
229  I4_SHIFT_FLAGS = 7,
230  I4_NUM_LOCK_FLAG = 8,
231  I4_CTRL_L_FLAG = 16,
232  I4_CTRL_R_FLAG = 32,
233  I4_CTRL_FLAGS = 48
234};
235//}}}
236
237
238w16 i4_key_translate(i4_key raw_key, i4_bool press, w16 &state)
239//{{{
240{
241  switch (raw_key)
242  {
243    case I4_SHIFT_L:
244      if (press)
245        state |= I4_MODIFIER_SHIFT_L;
246      else
247        state &= ~I4_MODIFIER_SHIFT_L;
248      break;
249    case I4_SHIFT_R:
250      if (press)
251        state |= I4_MODIFIER_SHIFT_R;
252      else
253        state &= ~I4_MODIFIER_SHIFT_R;
254      break;
255
256    case I4_CAPS:
257      if (press)
258        state ^= I4_MODIFIER_CAPS;
259      break;
260
261    case I4_NUM_LOCK:
262      if (press)
263        state ^= I4_MODIFIER_NUMLOCK;
264      break;
265
266    case I4_CTRL_L:
267      if (press)
268        state |= I4_MODIFIER_CTRL_L;
269      else
270        state &= ~I4_MODIFIER_CTRL_L;
271      break;
272
273    case I4_CTRL_R:
274      if (press)
275        state |= I4_MODIFIER_CTRL_R;
276      else
277        state &= ~I4_MODIFIER_CTRL_R;
278      break;
279
280    case '1':  return (state & I4_MODIFIER_SHIFT)? '!' : '1';
281    case '2':  return (state & I4_MODIFIER_SHIFT)? '@' : '2';
282    case '3':  return (state & I4_MODIFIER_SHIFT)? '#' : '3';
283    case '4':  return (state & I4_MODIFIER_SHIFT)? '$' : '4';
284    case '5':  return (state & I4_MODIFIER_SHIFT)? '%' : '5';
285    case '6':  return (state & I4_MODIFIER_SHIFT)? '^' : '6';
286    case '7':  return (state & I4_MODIFIER_SHIFT)? '&' : '7';
287    case '8':  return (state & I4_MODIFIER_SHIFT)? '*' : '8';
288    case '9':  return (state & I4_MODIFIER_SHIFT)? '(' : '9';
289    case '0':  return (state & I4_MODIFIER_SHIFT)? ')' : '0';
290    case '-':  return (state & I4_MODIFIER_SHIFT)? '_' : '-';
291    case '=':  return (state & I4_MODIFIER_SHIFT)? '+' : '=';
292    case '[':  return (state & I4_MODIFIER_SHIFT)? '{' : '[';
293    case ']':  return (state & I4_MODIFIER_SHIFT)? '}' : ']';
294    case '\\': return (state & I4_MODIFIER_SHIFT)? '|' : '\\';
295    case ';':  return (state & I4_MODIFIER_SHIFT)? ':' : ';';
296    case '\'': return (state & I4_MODIFIER_SHIFT)? '"' : '\'';
297    case ',':  return (state & I4_MODIFIER_SHIFT)? '<' : ',';
298    case '.':  return (state & I4_MODIFIER_SHIFT)? '>' : '.';
299    case '/':  return (state & I4_MODIFIER_SHIFT)? '?' : '/';
300    case '`':  return (state & I4_MODIFIER_SHIFT)? '~' : '`';
301
302    case I4_KP0:
303    case I4_KP1:
304    case I4_KP2:
305    case I4_KP3:
306    case I4_KP4:
307    case I4_KP5:
308    case I4_KP6:
309    case I4_KP7:
310    case I4_KP8:
311    case I4_KP9:
312      if (((state & I4_MODIFIER_NUMLOCK)!=0) ^
313          ((state & I4_MODIFIER_SHIFT)!=0))
314        return raw_key - I4_KP0 + '0';
315      else
316        return raw_key;
317     
318     
319    default:
320      if (raw_key>='A' && raw_key<='Z')
321        if (state & I4_MODIFIER_CTRL)
322          return raw_key - 'A' + 1;
323        else if (!(state & I4_MODIFIER_SHIFT))
324          return raw_key - 'A' + 'a';
325     
326  }
327  return raw_key;
328}
329//}}}
330
331
332//{{{ Emacs Locals
333// Local Variables:
334// folded-file: t
335// End:
336//}}}
Note: See TracBrowser for help on using the repository browser.