File: keyb.cc

package info (click to toggle)
ht 2.0.14-1
  • links: PTS, VCS
  • area: main
  • in suites: lenny
  • size: 6,296 kB
  • ctags: 17,147
  • sloc: cpp: 97,008; ansic: 16,159; sh: 3,455; lex: 226; makefile: 213; yacc: 127
file content (235 lines) | stat: -rw-r--r-- 7,272 bytes parent folder | download | duplicates (8)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
/* 
 *	HT Editor
 *	keyb.cc
 *
 *	Copyright (C) 1999-2002 Stefan Weyergraf (stefan@weyergraf.de)
 *
 *	This program is free software; you can redistribute it and/or modify
 *	it under the terms of the GNU General Public License version 2 as
 *	published by the Free Software Foundation.
 *
 *	This program 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 this program; if not, write to the Free Software
 *	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */

#include <cstdio>
#include <cstring>

#include "keyb.h"
#include "strtools.h"

ht_key keyb_unmetakey(ht_key key)
{
	switch (key) {
		case K_Meta_A: return K_A;
		case K_Meta_B: return K_B;
		case K_Meta_C: return K_C;
		case K_Meta_D: return K_D;
		case K_Meta_E: return K_E;
		case K_Meta_F: return K_F;
		case K_Meta_G: return K_G;
		case K_Meta_H: return K_H;
		case K_Meta_I: return K_I;
		case K_Meta_J: return K_J;
		case K_Meta_K: return K_K;
		case K_Meta_L: return K_L;
		case K_Meta_M: return K_M;
		case K_Meta_N: return K_N;
		case K_Meta_O: return K_O;
		case K_Meta_P: return K_P;
		case K_Meta_Q: return K_Q;
		case K_Meta_R: return K_R;
		case K_Meta_S: return K_S;
		case K_Meta_T: return K_T;
		case K_Meta_U: return K_U;
		case K_Meta_V: return K_V;
		case K_Meta_W: return K_W;
		case K_Meta_X: return K_X;
		case K_Meta_Y: return K_Y;
		case K_Meta_Z: return K_Z;
		default: return K_INVALID;
	}
}

static ht_key keyb_lmetakey(ht_key key)
{
	switch (key) {
		case K_A: return K_Meta_A;
		case K_B: return K_Meta_B;
		case K_C: return K_Meta_C;
		case K_D: return K_Meta_D;
		case K_E: return K_Meta_E;
		case K_F: return K_Meta_F;
		case K_G: return K_Meta_G;
		case K_H: return K_Meta_H;
		case K_I: return K_Meta_I;
		case K_J: return K_Meta_J;
		case K_K: return K_Meta_K;
		case K_L: return K_Meta_L;
		case K_M: return K_Meta_M;
		case K_N: return K_Meta_N;
		case K_O: return K_Meta_O;
		case K_P: return K_Meta_P;
		case K_Q: return K_Meta_Q;
		case K_R: return K_Meta_R;
		case K_S: return K_Meta_S;
		case K_T: return K_Meta_T;
		case K_U: return K_Meta_U;
		case K_V: return K_Meta_V;
		case K_W: return K_Meta_W;
		case K_X: return K_Meta_X;
		case K_Y: return K_Meta_Y;
		case K_Z: return K_Meta_Z;
		default: return K_INVALID;
	}
}

ht_key keyb_metakey(ht_key key)
{
	if ((key>=K_A) && (key<=K_Z)) {
		return keyb_lmetakey(key);
/*	} else if ((key>=K_Shift_A) && (key<=K_Shift_Z)) {
		return ht_lmetakey( (ht_key) ((int)key-(int)K_Meta_A+(int)K_A));*/
	}
	return K_INVALID;
}

static int ht_keys1[K_COUNT];
static int ht_keys2[K_COUNT];
static int ht_keys3[K_COUNT];

ht_key keyb_rawkey2key(int rawkey)
{
	for (int i=0; i<K_COUNT; i++) {
		if (ht_keys1[i]==(int)rawkey) return (ht_key)i;
		if (ht_keys2[i]==(int)rawkey) return (ht_key)i;
		if (ht_keys3[i]==(int)rawkey) return (ht_key)i;
	}
	return K_INVALID;
}

void keyb_setkey(ht_key key, int rawkey)
{
	int i = (int)key;
	if (i<K_COUNT) {
		if (rawkey == -1) {
			ht_keys1[i] = -1;
			ht_keys2[i] = -1;
			ht_keys3[i] = -1;
		}
		else if ((ht_keys1[i] == -1) || (ht_keys1[i] == rawkey)) ht_keys1[i] = rawkey;
		else if ((ht_keys2[i] == -1) || (ht_keys2[i] == rawkey)) ht_keys2[i] = rawkey;
		else if ((ht_keys3[i] == -1) || (ht_keys3[i] == rawkey)) ht_keys3[i] = rawkey;
	}
}

#if defined(WIN32) || defined(__WIN32__)
#define META_KEY_NAME "Alt"
#else
#define META_KEY_NAME "Meta"
#endif

bool keyb_getkeydesc(char *buf, int bufsize, ht_key k)
{
	char b2[64];
	const char *b;
	bool r = true;
	switch (k) {
		case K_Backspace: b = "Backspace"; break;
		case K_Meta_Backspace: b = "Alt+Backspace"; break;
		case K_Return: b = "Enter"; break;
		case K_Tab: b = "Tab"; break;
		case K_Escape: b = "Escape"; break;

		case K_Left: b = "Left"; break;
		case K_Right: b = "Right"; break;
		case K_Up: b = "Up"; break;
		case K_Down: b = "Down"; break;
		case K_PageUp: b = "PgUp"; break;
		case K_PageDown: b = "PgDn"; break;
		case K_Insert: b = "Insert"; break;
		case K_Delete: b = "Delete"; break;
		case K_Home: b = "Home"; break;
		case K_End: b = "End"; break;

		case K_Meta_Left: b = META_KEY_NAME"+Left"; break;
		case K_Meta_Right: b = META_KEY_NAME"+Right"; break;
		case K_Meta_Up: b = META_KEY_NAME"+Up"; break;
		case K_Meta_Down: b = META_KEY_NAME"+Down"; break;
		case K_Meta_PageUp: b = META_KEY_NAME"+PgUp"; break;
		case K_Meta_PageDown: b = META_KEY_NAME"+PgDn"; break;
		case K_Meta_Insert: b = META_KEY_NAME"+Insert"; break;
		case K_Meta_Delete: b = META_KEY_NAME"+Delete"; break;
		case K_Meta_Home: b = META_KEY_NAME"+Home"; break;
		case K_Meta_End: b = META_KEY_NAME"+End"; break;

		case K_Control_Up: b = "Ctrl+Up"; break;
		case K_Control_Down: b = "Ctrl+Down"; break;
		case K_Control_Left: b = "Ctrl+Left"; break;
		case K_Control_Right: b = "Ctrl+Right"; break;
		case K_Control_PageUp: b = "Ctrl+PgUp"; break;
		case K_Control_PageDown: b = "Ctrl+PgDn"; break;
		case K_Control_Insert: b = "Ctrl+Insert"; break;
		case K_Control_Delete: b = "Ctrl+Delete"; break;
		case K_Control_Home: b = "Ctrl+Home"; break;
		case K_Control_End: b = "Ctrl+End"; break;
		case K_Control_Tab: b = "Ctrl+Tab"; break;

		case K_Shift_Left: b = "Shift+Left"; break;
		case K_Shift_Right: b = "Shift+Right"; break;
		case K_Shift_Up: b = "Shift+Up"; break;
		case K_Shift_Down: b = "Shift+Down"; break;
		case K_Shift_PageUp: b = "Shift+PgUp"; break;
		case K_Shift_PageDown: b = "Shift+PgDn"; break;
		case K_Shift_Insert: b = "Shift+Insert"; break;
		case K_Shift_Delete: b = "Shift+Delete"; break;
		case K_Shift_Home: b = "Shift+Home"; break;
		case K_Shift_End: b = "Shift+End"; break;
		case K_Shift_Tab: b = "Shift+Tab"; break;
		default: {
			char kk = (char)k;
			b = b2;
			if (!(k & ~0xff) &&
			(((kk>='a') && (kk<='z'))
			|| ((kk>='A') && (kk<='Z'))
			|| ((kk>='0') && (kk<='9'))
			|| ((strchr("[]{}()/\\'\"$%&?!.:,;-_=*+-#~<>|", kk) != NULL)))) {
				b2[0] = kk;
				b2[1] = 0;
			} else if ((k>=K_F1) && (k<=K_F12)) {
				sprintf(b2, "F%d", (int)k-(int)K_F1+1);
			} else if ((k>=K_Shift_F1) && (k<=K_Shift_F12)) {
				sprintf(b2, "Shift-F%d", (int)k-(int)K_Shift_F1+1);
			} else if ((k>=K_Control_F1) && (k<=K_Control_F12)) {
				sprintf(b2, "Ctrl-F%d", (int)k-(int)K_Control_F1+1);
			} else if ((k>=K_Control_Shift_F1) && (k<=K_Control_Shift_F12)) {
				sprintf(b2, "Ctrl-Shift-F%d", (int)k-(int)K_Control_Shift_F1+1);
			} else if ((k>=K_Meta_F1) && (k<=K_Meta_F12)) {
				sprintf(b2, META_KEY_NAME"-F%d", (int)k-(int)K_Meta_F1+1);
			} else if ((k>=K_Meta_1) && (k<=K_Meta_0)) {
				sprintf(b2, META_KEY_NAME"-%d", ((int)k-(int)K_Meta_1+1)%10);
			} else if ((k>=K_Control_A) && (k<=K_Control_Z)) {
				sprintf(b2, "Ctrl-%c", (int)k-(int)K_Control_A+'A');
			} else if ((k>=K_Meta_A) && (k<=K_Meta_Z)) {
				sprintf(b2, META_KEY_NAME"-%c", (int)k-(int)K_Meta_A+'A');
			} else {
				if ((unsigned int)k>255) {
					sprintf(b2, "key <%x>", (int)k);
				} else {
					sprintf(b2, "key <%x> '%c'", (int)k, (int)k);
				}
				r = false;
			}
		}			
	}
	if (bufsize > 0) {
		ht_strlcpy(buf, b, bufsize);
	}
	return r;
}