Changeset 331 for libcaca/trunk/src/io.c
- Timestamp:
- Jan 9, 2004, 10:51:53 AM (19 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
libcaca/trunk/src/io.c
r329 r331 55 55 56 56 static unsigned int _get_next_event(void); 57 static unsigned int _lowlevel_event(void); 57 58 static void _push_event(unsigned int); 58 59 static unsigned int _pop_event(void); … … 63 64 static unsigned int eventbuf[EVENTBUF_LEN]; 64 65 static int events = 0; 66 67 #if !defined(_DOXYGEN_SKIP_ME) 68 /* If no new key was pressed after AUTOREPEAT_THRESHOLD usec, assume the 69 * key was released */ 70 #define AUTOREPEAT_THRESHOLD 200000 71 /* Start repeating key after AUTOREPEAT_TRIGGER usec and send keypress 72 * events every AUTOREPEAT_RATE usec. */ 73 #define AUTOREPEAT_TRIGGER 300000 74 #define AUTOREPEAT_RATE 100000 75 #endif 65 76 66 77 /** \brief Get the next mouse or keyboard input event. … … 105 116 return event; 106 117 107 usleep(1000); 118 #if defined(HAVE_USLEEP) 119 usleep(10000); 120 #elif defined(HAVE_SLEEP) 121 Sleep(10); 122 #else 123 SLEEP 124 #endif 108 125 } 109 126 } … … 114 131 115 132 static unsigned int _get_next_event(void) 133 { 134 #if defined(USE_SLANG) || defined(USE_NCURSES) 135 static struct caca_timer key_timer = CACA_TIMER_INITIALIZER; 136 static unsigned int last_key_ticks = 0; 137 static unsigned int autorepeat_ticks = 0; 138 static unsigned int last_key = 0; 139 unsigned int ticks; 140 #endif 141 unsigned int event = _lowlevel_event(); 142 143 #if defined(USE_SLANG) 144 if(_caca_driver != CACA_DRIVER_SLANG) 145 #endif 146 #if defined(USE_NCURSES) 147 if(_caca_driver != CACA_DRIVER_NCURSES) 148 #endif 149 return event; 150 151 #if defined(USE_SLANG) || defined(USE_NCURSES) 152 /* Simulate long keypresses using autorepeat features */ 153 ticks = _caca_getticks(&key_timer); 154 last_key_ticks += ticks; 155 autorepeat_ticks += ticks; 156 157 /* Handle autorepeat */ 158 if(last_key && autorepeat_ticks > AUTOREPEAT_TRIGGER 159 && autorepeat_ticks > AUTOREPEAT_THRESHOLD 160 && autorepeat_ticks > AUTOREPEAT_RATE) 161 { 162 _push_event(event); 163 autorepeat_ticks -= AUTOREPEAT_RATE; 164 return CACA_EVENT_KEY_PRESS | last_key; 165 } 166 167 /* We are in autorepeat mode and the same key was just pressed, ignore 168 * this event and return the next one by calling ourselves. */ 169 if(event == (CACA_EVENT_KEY_PRESS | last_key)) 170 { 171 last_key_ticks = 0; 172 return _get_next_event(); 173 } 174 175 /* We are in autorepeat mode, but key has expired or a new key was 176 * pressed - store our event and return a key release event first */ 177 if(last_key && (last_key_ticks > AUTOREPEAT_THRESHOLD 178 || (event & CACA_EVENT_KEY_PRESS))) 179 { 180 _push_event(event); 181 event = CACA_EVENT_KEY_RELEASE | last_key; 182 last_key = 0; 183 return event; 184 } 185 186 /* A new key was pressed, enter autorepeat mode */ 187 if(event & CACA_EVENT_KEY_PRESS) 188 { 189 last_key_ticks = 0; 190 autorepeat_ticks = 0; 191 last_key = event & 0x00ffffff; 192 } 193 194 return event; 195 #endif 196 } 197 198 static unsigned int _lowlevel_event(void) 116 199 { 117 200 unsigned int event = _pop_event(); … … 214 297 if(intkey < 0x100) 215 298 { 216 _push_event(CACA_EVENT_KEY_RELEASE | intkey);217 299 return CACA_EVENT_KEY_PRESS | intkey; 218 300 } … … 361 443 } 362 444 363 _push_event(CACA_EVENT_KEY_RELEASE | event);364 445 return CACA_EVENT_KEY_PRESS | event; 365 446 } … … 378 459 if(intkey < 0x100) 379 460 { 380 _push_event(CACA_EVENT_KEY_RELEASE | intkey);381 461 return CACA_EVENT_KEY_PRESS | intkey; 382 462 } … … 413 493 } 414 494 415 _push_event(CACA_EVENT_KEY_RELEASE | event);416 495 return CACA_EVENT_KEY_PRESS | event; 417 496 }
Note: See TracChangeset
for help on using the changeset viewer.