~ubuntu-branches/debian/sid/ncurses/sid-200908151540

« back to all changes in this revision

Viewing changes to ncurses/base/lib_getch.c

  • Committer: Bazaar Package Importer
  • Author(s): Daniel Baumann
  • Date: 2008-11-30 03:43:00 UTC
  • mfrom: (1.1.5 upstream)
  • Revision ID: james.westby@ubuntu.com-20081130034300-lw6qrujyjmv6e32x
Tags: 5.7+20081122-2
Adding patch from Samuel Thibault to ensure that aalib checks the
value returned by Gpm_GetEvent() and only proceeds if value == 1
(Closes: #506717).

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
/****************************************************************************
2
 
 * Copyright (c) 1998-2008,2009 Free Software Foundation, Inc.              *
 
2
 * Copyright (c) 1998-2007,2008 Free Software Foundation, Inc.              *
3
3
 *                                                                          *
4
4
 * Permission is hereby granted, free of charge, to any person obtaining a  *
5
5
 * copy of this software and associated documentation files (the            *
30
30
 *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
31
31
 *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
32
32
 *     and: Thomas E. Dickey                        1996-on                 *
33
 
 *     and: Juergen Pfeifer                         2009                    *
34
33
 ****************************************************************************/
35
34
 
36
35
/*
42
41
 
43
42
#include <curses.priv.h>
44
43
 
45
 
MODULE_ID("$Id: lib_getch.c,v 1.102 2009/04/18 20:32:33 tom Exp $")
 
44
MODULE_ID("$Id: lib_getch.c,v 1.99 2008/09/20 19:46:13 tom Exp $")
46
45
 
47
46
#include <fifo_defs.h>
48
47
 
55
54
}
56
55
#else
57
56
#define GetEscdelay(sp) ESCDELAY
58
 
NCURSES_EXPORT_VAR (int)
59
 
  ESCDELAY = 1000;              /* max interval betw. chars in funkeys, in millisecs */
 
57
NCURSES_EXPORT_VAR(int)
 
58
ESCDELAY = 1000;                /* max interval betw. chars in funkeys, in millisecs */
60
59
#endif
61
60
 
62
61
#if NCURSES_EXT_FUNCS
63
62
NCURSES_EXPORT(int)
64
 
NCURSES_SP_NAME(set_escdelay) (NCURSES_SP_DCLx int value)
 
63
set_escdelay(int value)
65
64
{
66
65
    int code = OK;
67
66
#if USE_REENTRANT
68
 
    if (SP_PARM) {
69
 
        SP_PARM->_ESCDELAY = value;
 
67
    if (SP) {
 
68
        SP->_ESCDELAY = value;
70
69
    } else {
71
70
        code = ERR;
72
71
    }
73
72
#else
74
 
    (void) SP_PARM;
75
73
    ESCDELAY = value;
76
74
#endif
77
75
    return code;
78
76
}
79
 
 
80
 
#if NCURSES_SP_FUNCS
81
 
NCURSES_EXPORT(int)
82
 
set_escdelay(int value)
83
 
{
84
 
    return NCURSES_SP_NAME(set_escdelay) (CURRENT_SCREEN, value);
85
 
}
86
77
#endif
87
 
#endif /* NCURSES_EXT_FUNCS */
88
78
 
89
79
static int
90
80
_nc_use_meta(WINDOW *win)
94
84
}
95
85
 
96
86
#ifdef NCURSES_WGETCH_EVENTS
97
 
#define TWAIT_MASK (TW_ANY | TW_EVENT)
 
87
#define TWAIT_MASK 7
98
88
#else
99
 
#define TWAIT_MASK TW_ANY
 
89
#define TWAIT_MASK 3
100
90
#endif
101
91
 
102
92
/*
119
109
        && (sp->_sysmouse_head < sp->_sysmouse_tail)
120
110
        && (rc == 0)
121
111
        && (errno == EINTR)) {
122
 
        rc |= TW_MOUSE;
 
112
        rc |= 2;
123
113
    }
124
114
#endif
125
115
    return rc;
183
173
    } else
184
174
        mask = 0;
185
175
 
186
 
    if (mask & TW_EVENT) {
 
176
    if (mask & 4) {
187
177
        T(("fifo_push: ungetch KEY_EVENT"));
188
 
        safe_ungetch(sp, KEY_EVENT);
 
178
        _nc_ungetch(sp, KEY_EVENT);
189
179
        return KEY_EVENT;
190
180
    }
191
181
#elif USE_GPM_SUPPORT || USE_EMX_MOUSE || USE_SYSMOUSE
195
185
#endif
196
186
 
197
187
#if USE_GPM_SUPPORT || USE_EMX_MOUSE
198
 
    if ((sp->_mouse_fd >= 0) && (mask & TW_MOUSE)) {
 
188
    if ((sp->_mouse_fd >= 0) && (mask & 2)) {
199
189
        sp->_mouse_event(sp);
200
190
        ch = KEY_MOUSE;
201
191
        n = 1;
270
260
{
271
261
#ifdef USE_PTHREADS
272
262
    SCREEN *sp = _nc_screen_of(win);
273
 
    if (_nc_use_pthreads && sp != CURRENT_SCREEN) {
 
263
    if (_nc_use_pthreads && sp != SP) {
274
264
        SCREEN *save_SP;
275
265
 
276
266
        /* temporarily switch to the window's screen to check/refresh */
277
267
        _nc_lock_global(curses);
278
 
        save_SP = CURRENT_SCREEN;
 
268
        save_SP = SP;
279
269
        _nc_set_screen(sp);
280
270
        recur_wrefresh(win);
281
271
        _nc_set_screen(save_SP);
296
286
 
297
287
    if (sp != 0) {
298
288
#ifdef USE_PTHREADS
299
 
        if (_nc_use_pthreads && sp != CURRENT_SCREEN) {
 
289
        if (_nc_use_pthreads && sp != SP) {
300
290
            SCREEN *save_SP;
301
291
 
302
292
            /* temporarily switch to the window's screen to get cooked input */
303
293
            _nc_lock_global(curses);
304
 
            save_SP = CURRENT_SCREEN;
 
294
            save_SP = SP;
305
295
            _nc_set_screen(sp);
306
296
            rc = recur_wgetnstr(win, buf);
307
297
            _nc_set_screen(save_SP);
372
362
#ifdef NCURSES_WGETCH_EVENTS
373
363
        if (rc != KEY_EVENT)
374
364
#endif
375
 
            safe_ungetch(sp, '\n');
 
365
            _nc_ungetch(sp, '\n');
376
366
        for (bufp = buf + strlen(buf); bufp > buf; bufp--)
377
 
            safe_ungetch(sp, bufp[-1]);
 
367
            _nc_ungetch(sp, bufp[-1]);
378
368
 
379
369
#ifdef NCURSES_WGETCH_EVENTS
380
370
        /* Return it first */
412
402
            rc = check_mouse_activity(sp, delay EVENTLIST_2nd(evl));
413
403
 
414
404
#ifdef NCURSES_WGETCH_EVENTS
415
 
            if (rc & TW_EVENT) {
 
405
            if (rc & 4) {
416
406
                *result = KEY_EVENT;
417
407
                returnCode(KEY_CODE_YES);
418
408
            }
437
427
         * increase the wait with mouseinterval().
438
428
         */
439
429
        int runcount = 0;
440
 
        int rc = 0;
 
430
        int rc;
441
431
 
442
432
        do {
443
433
            ch = kgetch(sp EVENTLIST_2nd(evl));
452
442
            (ch == KEY_MOUSE
453
443
             && (((rc = check_mouse_activity(sp, sp->_maxclick
454
444
                                             EVENTLIST_2nd(evl))) != 0
455
 
                  && !(rc & TW_EVENT))
 
445
                  && !(rc & 4))
456
446
                 || !sp->_mouse_parse(sp, runcount)));
457
447
#ifdef NCURSES_WGETCH_EVENTS
458
 
        if ((rc & TW_EVENT) && !(ch == KEY_EVENT)) {
459
 
            safe_ungetch(sp, ch);
 
448
        if ((rc & 4) && !ch == KEY_EVENT) {
 
449
            _nc_ungetch(sp, ch);
460
450
            ch = KEY_EVENT;
461
451
        }
462
452
#endif
464
454
#ifdef NCURSES_WGETCH_EVENTS
465
455
            /* mouse event sequence ended by an event, report event */
466
456
            if (ch == KEY_EVENT) {
467
 
                safe_ungetch(sp, KEY_MOUSE);    /* FIXME This interrupts a gesture... */
 
457
                _nc_ungetch(sp, KEY_MOUSE);     /* FIXME This interrupts a gesture... */
468
458
            } else
469
459
#endif
470
460
            {
471
461
                /* mouse event sequence ended by keystroke, store keystroke */
472
 
                safe_ungetch(sp, ch);
 
462
                _nc_ungetch(sp, ch);
473
463
                ch = KEY_MOUSE;
474
464
            }
475
465
        }
655
645
            TR(TRACE_IEVENT, ("waiting for rest of sequence"));
656
646
            rc = check_mouse_activity(sp, timeleft EVENTLIST_2nd(evl));
657
647
#ifdef NCURSES_WGETCH_EVENTS
658
 
            if (rc & TW_EVENT) {
 
648
            if (rc & 4) {
659
649
                TR(TRACE_IEVENT, ("interrupted by a user event"));
660
650
                /* FIXME Should have preserved remainder timeleft for reuse... */
661
651
                peek = head;    /* Restart interpreting later */