57
57
#if OPT_TCAP_QUERY || OPT_TCAP_FKEYS
59
#define SHIFT (MOD_NONE + MOD_SHIFT)
61
#define NO_STRING (char *)(-1)
67
unsigned param; /* see xtermStateToParam() */
66
70
#define DATA(tc,ti,x,y) { tc, ti, x, y }
67
71
static TCAPINFO table[] = {
68
/* tcap terminfo code param */
72
/* tcap terminfo code state */
69
73
DATA( "%1", "khlp", XK_Help, 0 ),
70
DATA( "#1", "kHLP", XK_Help, 2 ),
74
DATA( "#1", "kHLP", XK_Help, SHIFT ),
71
75
DATA( "@0", "kfnd", XK_Find, 0 ),
72
DATA( "*0", "kFND", XK_Find, 2 ),
76
DATA( "*0", "kFND", XK_Find, SHIFT ),
73
77
DATA( "*6", "kslt", XK_Select, 0 ),
74
DATA( "#6", "kSLT", XK_Select, 2 ),
78
DATA( "#6", "kSLT", XK_Select, SHIFT ),
76
80
DATA( "kh", "khome", XK_Home, 0 ),
77
DATA( "#2", "kHOM", XK_Home, 2 ),
81
DATA( "#2", "kHOM", XK_Home, SHIFT ),
78
82
DATA( "@7", "kend", XK_End, 0 ),
79
DATA( "*7", "kEND", XK_End, 2 ),
83
DATA( "*7", "kEND", XK_End, SHIFT ),
81
85
DATA( "kl", "kcub1", XK_Left, 0 ),
82
86
DATA( "kr", "kcuf1", XK_Right, 0 ),
83
87
DATA( "ku", "kcuu1", XK_Up, 0 ),
84
88
DATA( "kd", "kcud1", XK_Down, 0 ),
86
DATA( "#4", "kLFT", XK_Left, 2 ),
87
DATA( "%i", "kRIT", XK_Right, 2 ),
88
DATA( "%e", "kPRV", XK_Up, 2 ),
89
DATA( "%c", "kNXT", XK_Down, 2 ),
90
DATA( "#4", "kLFT", XK_Left, SHIFT ),
91
DATA( "%i", "kRIT", XK_Right, SHIFT ),
92
DATA( "%e", "kPRV", XK_Up, SHIFT ),
93
DATA( "%c", "kNXT", XK_Down, SHIFT ),
91
95
DATA( "k1", "kf1", XK_Fn(1), 0 ),
92
96
DATA( "k2", "kf2", XK_Fn(2), 0 ),
219
lookupTcapByName(XtermWidget xw, const char *name)
221
TCAPINFO *result = 0;
254
keyIsDistinct(XtermWidget xw, int which)
256
Boolean result = True;
258
switch (xw->keyboard.type) {
259
case keyboardIsTermcap:
261
if (table[which].param == SHIFT) {
262
TScreen *screen = TScreenOf(xw);
266
loadTermcapStrings(screen);
267
if ((fkey = screen->tcap_fkeys[which]) != NO_STRING) {
268
for (k = 0; k < XtNumber(table); k++) {
269
if (table[k].code == table[which].code
270
&& table[k].param == 0) {
271
if ((fkey = screen->tcap_fkeys[k]) != NO_STRING
272
&& !strcmp(fkey, screen->tcap_fkeys[which])) {
273
TRACE(("shifted/unshifted keys do not differ\n"));
280
/* there is no data for the shifted key */
287
* The vt220-keyboard will not return distinct key sequences for
288
* shifted cursor-keys. Just pretend they do not exist, since some
289
* programs may be confused if we return the same data for
290
* shifted/unshifted keys.
292
case keyboardIsVT220:
293
if (table[which].param == SHIFT) {
294
TRACE(("shifted/unshifted keys do not differ\n"));
298
case keyboardIsLegacy:
299
case keyboardIsDefault:
310
lookupTcapByName(const char *name)
224
315
if (name != 0 && *name != '\0') {
225
for (n = 0; n < XtNumber(table); n++) {
226
if (!strcmp(table[n].ti, name) || !strcmp(table[n].tc, name)) {
316
for (j = 0; j < XtNumber(table); j++) {
317
if (!strcmp(table[j].ti, name) || !strcmp(table[j].tc, name)) {
234
* The vt220-keyboard will not return distinct key sequences for shifted
235
* cursor-keys. Just pretend they do not exist, since some programs may
236
* be confused if we return the same data for shifted/unshifted keys.
238
if (xw->keyboard.type == keyboardIsVT220
240
&& result->state == 2) {
245
TRACE(("lookupTcapByName(%s) tc=%s, ti=%s code %#x, state %#x\n",
246
name, result->tc, result->ti, result->code, result->state));
325
TRACE(("lookupTcapByName(%s) tc=%s, ti=%s code %#x, param %#x\n",
330
table[result].param));
248
332
TRACE(("lookupTcapByName(%s) FAIL\n", name));
286
if (*p == 0 || *p == ';') {
287
if ((data = lookupTcapByName(xw, name)) != 0) {
289
*state = xtermParamToState(xw, data->state);
290
if (IsFunctionKey(code)) {
292
} else if (code < 0) {
294
code = XK_Fn((-code));
371
if (len && (*p == 0 || *p == ';')) {
372
if ((which = lookupTcapByName(name)) >= 0) {
373
if (keyIsDistinct(xw, which)) {
374
data = table + which;
376
*state = xtermParamToState(xw, data->param);
377
if (IsFunctionKey(code)) {
379
} else if (code < 0) {
381
code = XK_Fn((-code));
296
383
#if OPT_SUN_FUNC_KEYS
297
if (*fkey && xw->keyboard.type == keyboardIsSun) {
298
int num = code - XK_Fn(0);
384
if (*fkey && xw->keyboard.type == keyboardIsSun) {
385
int num = code - XK_Fn(0);
300
/* match function-key case in sunfuncvalue() */
302
if (num <= 30 || num > 47) {
387
/* match function-key case in sunfuncvalue() */
389
if (num <= 30 || num > 47) {
407
TRACE(("... name ok, data not ok\n"));
411
TRACE(("... name not ok\n"));
415
TRACE(("... name not ok\n"));
322
419
TRACE(("... xtermcapKeycode(%s, %u, %d) -> %#06x\n",
328
425
#if OPT_TCAP_FKEYS
329
426
static TCAPINFO *
330
lookupTcapByCode(int code, unsigned mask)
427
lookupTcapByCode(int code, unsigned param)
332
429
TCAPINFO *result = 0;
335
TRACE(("lookupTcapByCode %d:%#x\n", code, mask));
432
TRACE(("lookupTcapByCode %#x:%#x\n", code, param));
336
433
for (n = 0; n < XtNumber(table); n++) {
337
434
if (table[n].code == code &&
338
table[n].state == mask) {
339
TRACE(("lookupTcapByCode %d:%s\n", n, table[n].ti));
435
table[n].param == param) {
436
TRACE(("->lookupTcapByCode %d:%s\n", n, table[n].ti));
340
437
result = table + n;
356
451
if ((data = lookupTcapByCode(keycode, param)) != 0) {
357
452
TScreen *screen = TScreenOf(xw);
358
Cardinal which = data - table;
453
Cardinal which = (Cardinal) (data - table);
361
if (screen->tcap_fkeys == 0) {
362
Cardinal want = XtNumber(table);
364
#if !(USE_TERMINFO && defined(HAVE_TIGETSTR))
365
char *area = screen->tcap_area;
368
if ((screen->tcap_fkeys = TypeCallocN(char *, want)) != 0) {
369
for (have = 0; have < want; ++have) {
370
#if USE_TERMINFO && defined(HAVE_TIGETSTR)
371
fkey = tigetstr(table[have].ti);
373
fkey = tgetstr(table[have].tc, &area);
375
if (fkey != 0 && fkey != NO_STRING) {
376
screen->tcap_fkeys[have] = x_strdup(fkey);
378
screen->tcap_fkeys[have] = NO_STRING;
456
loadTermcapStrings(screen);
383
457
if (screen->tcap_fkeys != 0) {
384
458
if ((fkey = screen->tcap_fkeys[which]) != NO_STRING) {
385
459
StringInput(xw, (Char *) fkey, strlen(fkey));