Ignore:
Timestamp:
Nov 19, 2003, 6:32:10 PM (19 years ago)
Author:
Sam Hocevar
Message:
  • src/io.c: + Renamed sdl_get_key() into sdl_get_event(). + Handle mouse clicks.
  • src/caca.c: + Activate the terminal's mouse handling if supported.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • libcaca/trunk/src/io.c

    r198 r199  
    3737#include "caca_internals.h"
    3838
     39static void _push_key(unsigned char);
     40static unsigned char _pop_key(void);
     41static unsigned char _read_key(void);
     42
    3943static unsigned char back[5] = {0, 0, 0, 0, 0};
     44
     45int caca_get_event(void)
     46{
     47    unsigned char key[6];
     48
     49    /* If there were legacy keys, pop them */
     50    key[0] = _pop_key();
     51    if(key[0])
     52        return CACA_EVENT_KEY_PRESS | key[0];
     53
     54    key[0] = _read_key();
     55    if(!key[0])
     56        return 0;
     57
     58    if(key[0] != 0x1b)
     59        return CACA_EVENT_KEY_PRESS | key[0];
     60
     61    /*
     62     * Handle escape sequences
     63     */
     64
     65    key[1] = _read_key();
     66    if(!key[1])
     67        return CACA_EVENT_KEY_PRESS | key[0];
     68
     69    key[2] = _read_key();
     70    if(!key[2])
     71    {
     72        _push_key(key[1]);
     73        return CACA_EVENT_KEY_PRESS | key[0];
     74    }
     75
     76    if(key[1] == 'O')
     77    {
     78        switch(key[2])
     79        {
     80        case 'P': return CACA_EVENT_KEY_PRESS | CACA_KEY_F1;
     81        case 'Q': return CACA_EVENT_KEY_PRESS | CACA_KEY_F2;
     82        case 'R': return CACA_EVENT_KEY_PRESS | CACA_KEY_F3;
     83        case 'S': return CACA_EVENT_KEY_PRESS | CACA_KEY_F4;
     84        }
     85    }
     86    else if(key[1] == '[')
     87    {
     88        switch(key[2])
     89        {
     90        case 'A': return CACA_EVENT_KEY_PRESS | CACA_KEY_UP;
     91        case 'B': return CACA_EVENT_KEY_PRESS | CACA_KEY_DOWN;
     92        case 'C': return CACA_EVENT_KEY_PRESS | CACA_KEY_LEFT;
     93        case 'D': return CACA_EVENT_KEY_PRESS | CACA_KEY_RIGHT;
     94        }
     95
     96        key[3] = _read_key();
     97        key[4] = _read_key();
     98
     99        if(key[2] == 'M')
     100        {
     101            int event = CACA_EVENT_MOUSE_CLICK;
     102
     103            key[5] = _read_key();
     104
     105            event |= (int)(key[3] - ' ') << 8;
     106            event |= (int)(key[4] - ' ') << 4;
     107            event |= (int)(key[5] - ' ') << 0;
     108
     109            return event;
     110        }
     111
     112        if(key[2] == '1' && key[4] == '~')
     113            switch(key[3])
     114            {
     115            case '5': return CACA_EVENT_KEY_PRESS | CACA_KEY_F5;
     116            case '7': return CACA_EVENT_KEY_PRESS | CACA_KEY_F6;
     117            case '8': return CACA_EVENT_KEY_PRESS | CACA_KEY_F7;
     118            case '9': return CACA_EVENT_KEY_PRESS | CACA_KEY_F8;
     119            }
     120
     121        if(key[2] == '2' && key[4] == '~')
     122            switch(key[3])
     123            {
     124            case '0': return CACA_EVENT_KEY_PRESS | CACA_KEY_F9;
     125            case '1': return CACA_EVENT_KEY_PRESS | CACA_KEY_F10;
     126            case '3': return CACA_EVENT_KEY_PRESS | CACA_KEY_F11;
     127            case '4': return CACA_EVENT_KEY_PRESS | CACA_KEY_F12;
     128            }
     129
     130        _push_key(key[4]);
     131        _push_key(key[3]);
     132    }
     133
     134    /* Unknown escape sequence: return each key one after the other */
     135    _push_key(key[2]);
     136    _push_key(key[1]);
     137    return CACA_EVENT_KEY_PRESS | key[0];
     138}
    40139
    41140static void _push_key(unsigned char key)
     
    70169}
    71170
    72 int caca_get_key(void)
    73 {
    74     unsigned char key[5];
    75 
    76     /* If there were legacy keys, pop them */
    77     key[0] = _pop_key();
    78     if(key[0])
    79         return key[0];
    80 
    81     key[0] = _read_key();
    82     if(key[0] != 0x1b)
    83         return key[0];
    84 
    85     key[1] = _read_key();
    86     if(!key[1])
    87         return key[0];
    88 
    89     key[2] = _read_key();
    90     if(!key[2])
    91     {
    92         _push_key(key[1]);
    93         return key[0];
    94     }
    95 
    96     if(key[1] == 0x4f)
    97     {
    98         switch(key[2])
    99         {
    100         case 0x50: return CACA_KEY_F1;
    101         case 0x51: return CACA_KEY_F2;
    102         case 0x52: return CACA_KEY_F3;
    103         case 0x53: return CACA_KEY_F4;
    104         }
    105     }
    106     else if(key[1] == 0x5b)
    107     {
    108         switch(key[2])
    109         {
    110         case 0x41: return CACA_KEY_UP;
    111         case 0x42: return CACA_KEY_DOWN;
    112         case 0x43: return CACA_KEY_LEFT;
    113         case 0x44: return CACA_KEY_RIGHT;
    114         }
    115 
    116         key[3] = _read_key();
    117         key[4] = _read_key();
    118 
    119         if(key[2] == 0x31 && key[4] == 0x7e)
    120             switch(key[3])
    121             {
    122             case 0x35: return CACA_KEY_F5;
    123             case 0x37: return CACA_KEY_F6;
    124             case 0x38: return CACA_KEY_F7;
    125             case 0x39: return CACA_KEY_F8;
    126             }
    127 
    128         if(key[2] == 0x32 && key[4] == 0x7e)
    129             switch(key[3])
    130             {
    131             case 0x30: return CACA_KEY_F9;
    132             case 0x31: return CACA_KEY_F10;
    133             case 0x33: return CACA_KEY_F11;
    134             case 0x34: return CACA_KEY_F12;
    135             }
    136 
    137         _push_key(key[4]);
    138         _push_key(key[3]);
    139     }
    140 
    141     /* Unknown escape sequence: return 0 */
    142     _push_key(key[2]);
    143     _push_key(key[1]);
    144     return key[0];
    145 }
    146 
Note: See TracChangeset for help on using the changeset viewer.