/[rdesktop]/sourceforge.net/trunk/rdesktop/xkeymap.c
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Annotation of /sourceforge.net/trunk/rdesktop/xkeymap.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 39 - (hide annotations)
Fri Apr 5 07:57:43 2002 UTC (22 years, 1 month ago) by matthewc
File MIME type: text/plain
File size: 4194 byte(s)
Code to save and load licence (not quite working yet - server still seems
to reissue the licence).
Small clean-up in xkeymap.

1 matthewc 38 /*
2     rdesktop: A Remote Desktop Protocol client.
3     User interface services - X keyboard mapping
4     Copyright (C) Matthew Chapman 1999-2001
5    
6     This program is free software; you can redistribute it and/or modify
7     it under the terms of the GNU General Public License as published by
8     the Free Software Foundation; either version 2 of the License, or
9     (at your option) any later version.
10    
11     This program is distributed in the hope that it will be useful,
12     but WITHOUT ANY WARRANTY; without even the implied warranty of
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14     GNU General Public License for more details.
15    
16     You should have received a copy of the GNU General Public License
17     along with this program; if not, write to the Free Software
18     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19     */
20    
21     #include <X11/Xlib.h>
22     #include <X11/keysym.h>
23     #include <stdio.h>
24     #include <stdlib.h>
25     #include <string.h>
26 matthewc 39 #include <limits.h>
27 matthewc 38 #include "rdesktop.h"
28    
29     #define KEYMAP_SIZE 4096
30     #define KEYMAP_MASK (KEYMAP_SIZE - 1)
31    
32     extern char keymapname[16];
33     extern int keylayout;
34    
35     static uint8 keymap[KEYMAP_SIZE];
36     static unsigned int min_keycode;
37    
38     static BOOL xkeymap_read(char *mapname)
39     {
40     FILE *fp;
41 matthewc 39 char line[PATH_MAX], path[PATH_MAX];
42 matthewc 38 char *keyname, *p;
43     KeySym keysym;
44     unsigned char keycode;
45     unsigned int mapcode = 0;
46    
47     strcpy(path, KEYMAP_PATH);
48     strncat(path, mapname, sizeof(path) - sizeof(KEYMAP_PATH));
49    
50     fp = fopen(path, "r");
51     if (fp == NULL)
52     {
53     error("Failed to open keymap %s\n", path);
54     return False;
55     }
56    
57     while (fgets(line, sizeof(line), fp) != NULL)
58     {
59     p = strchr(line, '\n');
60     if (p != NULL)
61     *p = 0;
62    
63     keycode = strtol(line, &keyname, 16);
64     if ((keycode != 0) && (*keyname == ' '))
65     {
66     do
67     {
68     keyname++;
69     p = strchr(keyname, ' ');
70     if (p != NULL)
71     *p = 0;
72    
73     keysym = XStringToKeysym(keyname);
74     if (keysym == NoSymbol)
75     error("Bad keysym %s in keymap %s\n", keyname, mapname);
76    
77     keymap[keysym & KEYMAP_MASK] = keycode;
78     keyname = p;
79    
80     } while (keyname != NULL);
81     }
82     else if (strncmp(line, "include ", 8) == 0)
83     {
84     if (!xkeymap_read(line+8))
85     return False;
86     }
87     else if (strncmp(line, "map ", 4) == 0)
88     {
89     keylayout = strtol(line+4, NULL, 16);
90     }
91     else if (line[0] != '#')
92     {
93     error("Malformed line in keymap %s\n", mapname);
94     }
95     }
96    
97     fclose(fp);
98     return True;
99     }
100    
101     void xkeymap_init(Display *display)
102     {
103     unsigned int max_keycode;
104    
105     XDisplayKeycodes(display, &min_keycode, &max_keycode);
106    
107     if (strcmp(keymapname, "none"))
108     xkeymap_read(keymapname);
109     }
110    
111     uint8 xkeymap_translate_key(KeySym keysym, unsigned int keycode)
112     {
113     uint8 scancode;
114    
115     scancode = keymap[keysym & KEYMAP_MASK];
116     if (scancode != 0)
117     return scancode;
118    
119     /* not in keymap, try to interpret the raw scancode */
120    
121     if ((keycode >= min_keycode) && (keycode <= 0x60))
122     return (uint8)(keycode - min_keycode);
123    
124     switch (keycode)
125     {
126     case 0x61: /* home */
127     return 0x47 | 0x80;
128     case 0x62: /* up arrow */
129     return 0x48 | 0x80;
130     case 0x63: /* page up */
131     return 0x49 | 0x80;
132     case 0x64: /* left arrow */
133     return 0x4b | 0x80;
134     case 0x66: /* right arrow */
135     return 0x4d | 0x80;
136     case 0x67: /* end */
137     return 0x4f | 0x80;
138     case 0x68: /* down arrow */
139     return 0x50 | 0x80;
140     case 0x69: /* page down */
141     return 0x51 | 0x80;
142     case 0x6a: /* insert */
143     return 0x52 | 0x80;
144     case 0x6b: /* delete */
145     return 0x53 | 0x80;
146     case 0x6c: /* keypad enter */
147     return 0x1c | 0x80;
148     case 0x6d: /* right ctrl */
149     return 0x1d | 0x80;
150     case 0x6f: /* ctrl - print screen */
151     return 0x37 | 0x80;
152     case 0x70: /* keypad '/' */
153     return 0x35 | 0x80;
154     case 0x71: /* right alt */
155     return 0x38 | 0x80;
156     case 0x72: /* ctrl break */
157     return 0x46 | 0x80;
158     case 0x73: /* left window key */
159     return 0x5b | 0x80;
160     case 0x74: /* right window key */
161     return 0x5c | 0x80;
162     case 0x75: /* menu key */
163     return 0x5d | 0x80;
164     }
165    
166     return 0;
167     }
168    
169     uint16 xkeymap_translate_button(unsigned int button)
170     {
171     switch (button)
172     {
173     case Button1: /* left */
174     return MOUSE_FLAG_BUTTON1;
175     case Button2: /* middle */
176     return MOUSE_FLAG_BUTTON3;
177     case Button3: /* right */
178     return MOUSE_FLAG_BUTTON2;
179     }
180    
181     return 0;
182     }

  ViewVC Help
Powered by ViewVC 1.1.26