Björn Stenberg | c7dd78e | 2002-04-19 14:12:31 +0000 | [diff] [blame] | 1 | /*************************************************************************** |
| 2 | * __________ __ ___. |
| 3 | * Open \______ \ ____ ____ | | _\_ |__ _______ ___ |
| 4 | * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / |
| 5 | * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < |
| 6 | * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ |
| 7 | * \/ \/ \/ \/ \/ |
| 8 | * $Id$ |
| 9 | * |
| 10 | * Copyright (C) 2002 by Björn Stenberg |
| 11 | * |
| 12 | * All files in this archive are subject to the GNU General Public License. |
| 13 | * See the file COPYING in the source tree root for full license agreement. |
| 14 | * |
| 15 | * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY |
| 16 | * KIND, either express or implied. |
| 17 | * |
| 18 | ****************************************************************************/ |
Jens Arnold | 74b731e | 2005-03-18 23:51:52 +0000 | [diff] [blame] | 19 | #include <stdlib.h> |
Björn Stenberg | 8b69504 | 2004-09-16 14:36:08 +0000 | [diff] [blame] | 20 | #include "config.h" |
Björn Stenberg | c7dd78e | 2002-04-19 14:12:31 +0000 | [diff] [blame] | 21 | #include "button.h" |
Daniel Stenberg | 132a09b | 2002-05-28 15:05:16 +0000 | [diff] [blame] | 22 | #include "kernel.h" |
Daniel Stenberg | eae5110 | 2003-04-23 18:49:57 +0000 | [diff] [blame] | 23 | #include "debug.h" |
Jens Arnold | b51f7df | 2005-11-21 23:55:39 +0000 | [diff] [blame] | 24 | #include "backlight.h" |
Linus Nielsen Feltzing | a8dab4c | 2004-06-30 13:31:14 +0000 | [diff] [blame] | 25 | #include "misc.h" |
Björn Stenberg | c7dd78e | 2002-04-19 14:12:31 +0000 | [diff] [blame] | 26 | |
| 27 | #include "X11/keysym.h" |
| 28 | |
Jens Arnold | 74b731e | 2005-03-18 23:51:52 +0000 | [diff] [blame] | 29 | extern int screenhack_handle_events(bool *release); |
| 30 | |
| 31 | struct event_queue button_queue; |
| 32 | |
| 33 | static int button_state = 0; /* keeps track of pressed keys */ |
| 34 | static long lastbtn; /* Last valid button status */ |
| 35 | |
| 36 | /* how often we check to see if a button is pressed */ |
| 37 | #define POLL_FREQUENCY HZ/25 |
| 38 | |
| 39 | /* how long until repeat kicks in */ |
| 40 | #define REPEAT_START 8 |
| 41 | |
| 42 | /* the speed repeat starts at */ |
| 43 | #define REPEAT_INTERVAL_START 4 |
| 44 | |
| 45 | /* speed repeat finishes at */ |
| 46 | #define REPEAT_INTERVAL_FINISH 2 |
| 47 | |
| 48 | /* mostly copied from real button.c */ |
| 49 | void button_read (void); |
| 50 | |
Jens Arnold | b51f7df | 2005-11-21 23:55:39 +0000 | [diff] [blame] | 51 | static void button_tick(void) |
Björn Stenberg | c7dd78e | 2002-04-19 14:12:31 +0000 | [diff] [blame] | 52 | { |
Jens Arnold | 74b731e | 2005-03-18 23:51:52 +0000 | [diff] [blame] | 53 | static int tick = 0; |
| 54 | static int count = 0; |
| 55 | static int repeat_speed = REPEAT_INTERVAL_START; |
| 56 | static int repeat_count = 0; |
| 57 | static bool repeat = false; |
Jens Arnold | 237d3c4 | 2006-02-19 13:34:12 +0000 | [diff] [blame] | 58 | static bool post = false; |
Jens Arnold | 74b731e | 2005-03-18 23:51:52 +0000 | [diff] [blame] | 59 | int diff; |
| 60 | int btn; |
| 61 | |
| 62 | /* only poll every X ticks */ |
| 63 | if ( ++tick >= POLL_FREQUENCY ) |
| 64 | { |
Jens Arnold | 74b731e | 2005-03-18 23:51:52 +0000 | [diff] [blame] | 65 | button_read(); |
| 66 | btn = button_state; |
| 67 | |
| 68 | /* Find out if a key has been released */ |
| 69 | diff = btn ^ lastbtn; |
| 70 | if(diff && (btn & diff) == 0) |
| 71 | { |
| 72 | queue_post(&button_queue, BUTTON_REL | diff, NULL); |
| 73 | } |
| 74 | else |
| 75 | { |
| 76 | if ( btn ) |
| 77 | { |
| 78 | /* normal keypress */ |
| 79 | if ( btn != lastbtn ) |
| 80 | { |
| 81 | post = true; |
| 82 | repeat = false; |
| 83 | repeat_speed = REPEAT_INTERVAL_START; |
| 84 | |
| 85 | } |
| 86 | else /* repeat? */ |
| 87 | { |
| 88 | if ( repeat ) |
| 89 | { |
| 90 | count--; |
| 91 | if (count == 0) { |
| 92 | post = true; |
| 93 | /* yes we have repeat */ |
| 94 | repeat_speed--; |
| 95 | if (repeat_speed < REPEAT_INTERVAL_FINISH) |
| 96 | repeat_speed = REPEAT_INTERVAL_FINISH; |
| 97 | count = repeat_speed; |
| 98 | |
| 99 | repeat_count++; |
| 100 | |
| 101 | } |
| 102 | } |
| 103 | else |
| 104 | { |
| 105 | if (count++ > REPEAT_START) |
| 106 | { |
| 107 | post = true; |
| 108 | repeat = true; |
| 109 | repeat_count = 0; |
| 110 | /* initial repeat */ |
| 111 | count = REPEAT_INTERVAL_START; |
| 112 | } |
| 113 | } |
| 114 | } |
| 115 | if ( post ) |
| 116 | { |
| 117 | if (repeat) |
Jens Arnold | 237d3c4 | 2006-02-19 13:34:12 +0000 | [diff] [blame] | 118 | { |
| 119 | if (queue_empty(&button_queue)) |
| 120 | { |
| 121 | queue_post(&button_queue, BUTTON_REPEAT | btn, NULL); |
| 122 | post = false; |
| 123 | } |
| 124 | } |
Jens Arnold | 74b731e | 2005-03-18 23:51:52 +0000 | [diff] [blame] | 125 | else |
Jens Arnold | 237d3c4 | 2006-02-19 13:34:12 +0000 | [diff] [blame] | 126 | { |
Jens Arnold | 74b731e | 2005-03-18 23:51:52 +0000 | [diff] [blame] | 127 | queue_post(&button_queue, btn, NULL); |
Jens Arnold | 237d3c4 | 2006-02-19 13:34:12 +0000 | [diff] [blame] | 128 | post = false; |
| 129 | } |
Jens Arnold | b51f7df | 2005-11-21 23:55:39 +0000 | [diff] [blame] | 130 | #ifdef HAVE_REMOTE_LCD |
| 131 | if(btn & BUTTON_REMOTE) |
| 132 | remote_backlight_on(); |
| 133 | else |
| 134 | #endif |
| 135 | backlight_on(); |
| 136 | |
Jens Arnold | 74b731e | 2005-03-18 23:51:52 +0000 | [diff] [blame] | 137 | } |
| 138 | } |
| 139 | else |
| 140 | { |
| 141 | repeat = false; |
| 142 | count = 0; |
| 143 | } |
| 144 | } |
| 145 | lastbtn = btn & ~(BUTTON_REL | BUTTON_REPEAT); |
| 146 | tick = 0; |
| 147 | } |
Björn Stenberg | c7dd78e | 2002-04-19 14:12:31 +0000 | [diff] [blame] | 148 | } |
| 149 | |
| 150 | /* |
Jens Arnold | 74b731e | 2005-03-18 23:51:52 +0000 | [diff] [blame] | 151 | * Read X keys and translate to rockbox buttons |
Björn Stenberg | c7dd78e | 2002-04-19 14:12:31 +0000 | [diff] [blame] | 152 | */ |
Daniel Stenberg | ed6c7e4 | 2002-06-14 11:00:13 +0000 | [diff] [blame] | 153 | |
Jens Arnold | 74b731e | 2005-03-18 23:51:52 +0000 | [diff] [blame] | 154 | void button_read (void) |
Björn Stenberg | c7dd78e | 2002-04-19 14:12:31 +0000 | [diff] [blame] | 155 | { |
Björn Stenberg | 9af5972 | 2002-08-21 14:13:53 +0000 | [diff] [blame] | 156 | int k; |
Jens Arnold | 74b731e | 2005-03-18 23:51:52 +0000 | [diff] [blame] | 157 | bool release = false; /* is this a release event */ |
| 158 | int ev = screenhack_handle_events(&release); |
| 159 | |
| 160 | switch (ev) |
Björn Stenberg | c7dd78e | 2002-04-19 14:12:31 +0000 | [diff] [blame] | 161 | { |
Jens Arnold | 31b28f5 | 2005-03-18 00:03:22 +0000 | [diff] [blame] | 162 | case XK_KP_Left: |
| 163 | case XK_Left: |
| 164 | case XK_KP_4: |
| 165 | k = BUTTON_LEFT; |
Björn Stenberg | 9af5972 | 2002-08-21 14:13:53 +0000 | [diff] [blame] | 166 | break; |
Björn Stenberg | 45e9494 | 2002-04-19 14:38:28 +0000 | [diff] [blame] | 167 | |
Jens Arnold | 31b28f5 | 2005-03-18 00:03:22 +0000 | [diff] [blame] | 168 | case XK_KP_Right: |
| 169 | case XK_Right: |
| 170 | case XK_KP_6: |
| 171 | k = BUTTON_RIGHT; |
Björn Stenberg | 9af5972 | 2002-08-21 14:13:53 +0000 | [diff] [blame] | 172 | break; |
Björn Stenberg | 45e9494 | 2002-04-19 14:38:28 +0000 | [diff] [blame] | 173 | |
Jens Arnold | 31b28f5 | 2005-03-18 00:03:22 +0000 | [diff] [blame] | 174 | case XK_KP_Up: |
| 175 | case XK_Up: |
| 176 | case XK_KP_8: |
Björn Stenberg | 6c33c51 | 2004-09-19 21:58:37 +0000 | [diff] [blame] | 177 | #ifdef BUTTON_UP |
Jens Arnold | 31b28f5 | 2005-03-18 00:03:22 +0000 | [diff] [blame] | 178 | k = BUTTON_UP; |
Björn Stenberg | 6c33c51 | 2004-09-19 21:58:37 +0000 | [diff] [blame] | 179 | #elif defined BUTTON_PLAY |
Jens Arnold | 31b28f5 | 2005-03-18 00:03:22 +0000 | [diff] [blame] | 180 | k = BUTTON_PLAY; |
Björn Stenberg | 6c33c51 | 2004-09-19 21:58:37 +0000 | [diff] [blame] | 181 | #endif |
Björn Stenberg | 9af5972 | 2002-08-21 14:13:53 +0000 | [diff] [blame] | 182 | break; |
Björn Stenberg | 45e9494 | 2002-04-19 14:38:28 +0000 | [diff] [blame] | 183 | |
Jens Arnold | 31b28f5 | 2005-03-18 00:03:22 +0000 | [diff] [blame] | 184 | case XK_KP_Down: |
| 185 | case XK_Down: |
| 186 | case XK_KP_2: |
Björn Stenberg | 6c33c51 | 2004-09-19 21:58:37 +0000 | [diff] [blame] | 187 | #ifdef BUTTON_DOWN |
Jens Arnold | 31b28f5 | 2005-03-18 00:03:22 +0000 | [diff] [blame] | 188 | k = BUTTON_DOWN; |
Björn Stenberg | 6c33c51 | 2004-09-19 21:58:37 +0000 | [diff] [blame] | 189 | #elif defined BUTTON_STOP |
Jens Arnold | 31b28f5 | 2005-03-18 00:03:22 +0000 | [diff] [blame] | 190 | k = BUTTON_STOP; |
Björn Stenberg | 6c33c51 | 2004-09-19 21:58:37 +0000 | [diff] [blame] | 191 | #endif |
Björn Stenberg | 9af5972 | 2002-08-21 14:13:53 +0000 | [diff] [blame] | 192 | break; |
Björn Stenberg | 45e9494 | 2002-04-19 14:38:28 +0000 | [diff] [blame] | 193 | |
Jens Arnold | e6f403f | 2005-01-17 21:14:34 +0000 | [diff] [blame] | 194 | #ifdef BUTTON_ON |
Jens Arnold | 31b28f5 | 2005-03-18 00:03:22 +0000 | [diff] [blame] | 195 | case XK_KP_Add: |
| 196 | case XK_Q: |
| 197 | case XK_q: |
| 198 | k = BUTTON_ON; |
Björn Stenberg | 9af5972 | 2002-08-21 14:13:53 +0000 | [diff] [blame] | 199 | break; |
Björn Stenberg | 6c33c51 | 2004-09-19 21:58:37 +0000 | [diff] [blame] | 200 | #endif |
Björn Stenberg | 45e9494 | 2002-04-19 14:38:28 +0000 | [diff] [blame] | 201 | |
Björn Stenberg | 6c33c51 | 2004-09-19 21:58:37 +0000 | [diff] [blame] | 202 | #ifdef BUTTON_OFF |
Jens Arnold | 31b28f5 | 2005-03-18 00:03:22 +0000 | [diff] [blame] | 203 | case XK_KP_Enter: |
| 204 | case XK_A: |
| 205 | case XK_a: |
| 206 | k = BUTTON_OFF; |
Björn Stenberg | 9af5972 | 2002-08-21 14:13:53 +0000 | [diff] [blame] | 207 | break; |
Björn Stenberg | 6c33c51 | 2004-09-19 21:58:37 +0000 | [diff] [blame] | 208 | #endif |
Björn Stenberg | 45e9494 | 2002-04-19 14:38:28 +0000 | [diff] [blame] | 209 | |
Björn Stenberg | 6c33c51 | 2004-09-19 21:58:37 +0000 | [diff] [blame] | 210 | #ifdef BUTTON_F1 |
Jens Arnold | 31b28f5 | 2005-03-18 00:03:22 +0000 | [diff] [blame] | 211 | case XK_KP_Divide: |
| 212 | case XK_1: |
| 213 | k = BUTTON_F1; |
Björn Stenberg | 9af5972 | 2002-08-21 14:13:53 +0000 | [diff] [blame] | 214 | break; |
Björn Stenberg | 45e9494 | 2002-04-19 14:38:28 +0000 | [diff] [blame] | 215 | |
Jens Arnold | 31b28f5 | 2005-03-18 00:03:22 +0000 | [diff] [blame] | 216 | case XK_KP_Multiply: |
| 217 | case XK_2: |
| 218 | k = BUTTON_F2; |
Björn Stenberg | 9af5972 | 2002-08-21 14:13:53 +0000 | [diff] [blame] | 219 | break; |
Björn Stenberg | 45e9494 | 2002-04-19 14:38:28 +0000 | [diff] [blame] | 220 | |
Jens Arnold | 31b28f5 | 2005-03-18 00:03:22 +0000 | [diff] [blame] | 221 | case XK_KP_Subtract: |
| 222 | case XK_3: |
| 223 | k = BUTTON_F3; |
Björn Stenberg | 9af5972 | 2002-08-21 14:13:53 +0000 | [diff] [blame] | 224 | break; |
Jens Arnold | e6f403f | 2005-01-17 21:14:34 +0000 | [diff] [blame] | 225 | #elif defined(BUTTON_REC) |
Jens Arnold | 31b28f5 | 2005-03-18 00:03:22 +0000 | [diff] [blame] | 226 | case XK_KP_Divide: |
| 227 | case XK_1: |
| 228 | k = BUTTON_REC; |
| 229 | break; |
Björn Stenberg | 6c33c51 | 2004-09-19 21:58:37 +0000 | [diff] [blame] | 230 | #endif |
Linus Nielsen Feltzing | a8dab4c | 2004-06-30 13:31:14 +0000 | [diff] [blame] | 231 | |
Jens Arnold | 31b28f5 | 2005-03-18 00:03:22 +0000 | [diff] [blame] | 232 | case XK_KP_Space: |
| 233 | case XK_KP_5: |
| 234 | case XK_KP_Begin: |
| 235 | case XK_space: |
Jens Arnold | e6f403f | 2005-01-17 21:14:34 +0000 | [diff] [blame] | 236 | #ifdef BUTTON_PLAY |
Jens Arnold | 31b28f5 | 2005-03-18 00:03:22 +0000 | [diff] [blame] | 237 | k = BUTTON_PLAY; |
Jens Arnold | e6f403f | 2005-01-17 21:14:34 +0000 | [diff] [blame] | 238 | #elif defined(BUTTON_SELECT) |
Jens Arnold | 31b28f5 | 2005-03-18 00:03:22 +0000 | [diff] [blame] | 239 | k = BUTTON_SELECT; |
Jens Arnold | e6f403f | 2005-01-17 21:14:34 +0000 | [diff] [blame] | 240 | #endif |
| 241 | break; |
| 242 | |
Björn Stenberg | 6c33c51 | 2004-09-19 21:58:37 +0000 | [diff] [blame] | 243 | #ifdef HAVE_LCD_BITMAP |
Jens Arnold | 31b28f5 | 2005-03-18 00:03:22 +0000 | [diff] [blame] | 244 | case XK_5: |
| 245 | if(!release) |
Jens Arnold | 31b28f5 | 2005-03-18 00:03:22 +0000 | [diff] [blame] | 246 | screen_dump(); |
Jens Arnold | 31b28f5 | 2005-03-18 00:03:22 +0000 | [diff] [blame] | 247 | break; |
Björn Stenberg | 6c33c51 | 2004-09-19 21:58:37 +0000 | [diff] [blame] | 248 | #endif |
Linus Nielsen Feltzing | a8dab4c | 2004-06-30 13:31:14 +0000 | [diff] [blame] | 249 | |
Jens Arnold | 31b28f5 | 2005-03-18 00:03:22 +0000 | [diff] [blame] | 250 | case XK_KP_Separator: |
| 251 | case XK_KP_Insert: |
| 252 | case XK_Insert: |
Björn Stenberg | 6c33c51 | 2004-09-19 21:58:37 +0000 | [diff] [blame] | 253 | #ifdef BUTTON_MENU |
Jens Arnold | 31b28f5 | 2005-03-18 00:03:22 +0000 | [diff] [blame] | 254 | k = BUTTON_MENU; |
Jens Arnold | e6f403f | 2005-01-17 21:14:34 +0000 | [diff] [blame] | 255 | #elif defined(BUTTON_MODE) |
Jens Arnold | 31b28f5 | 2005-03-18 00:03:22 +0000 | [diff] [blame] | 256 | k = BUTTON_MODE; |
Björn Stenberg | 6c33c51 | 2004-09-19 21:58:37 +0000 | [diff] [blame] | 257 | #endif |
Björn Stenberg | 9af5972 | 2002-08-21 14:13:53 +0000 | [diff] [blame] | 258 | break; |
Björn Stenberg | 45e9494 | 2002-04-19 14:38:28 +0000 | [diff] [blame] | 259 | |
Jens Arnold | 31b28f5 | 2005-03-18 00:03:22 +0000 | [diff] [blame] | 260 | default: |
| 261 | k = 0; |
Daniel Stenberg | eae5110 | 2003-04-23 18:49:57 +0000 | [diff] [blame] | 262 | if(ev) |
| 263 | DEBUGF("received ev %d\n", ev); |
Björn Stenberg | 9af5972 | 2002-08-21 14:13:53 +0000 | [diff] [blame] | 264 | break; |
Björn Stenberg | c7dd78e | 2002-04-19 14:12:31 +0000 | [diff] [blame] | 265 | } |
Björn Stenberg | 9af5972 | 2002-08-21 14:13:53 +0000 | [diff] [blame] | 266 | |
Jens Arnold | 74b731e | 2005-03-18 23:51:52 +0000 | [diff] [blame] | 267 | if (release) |
Linus Nielsen Feltzing | 15d04fd | 2004-07-23 21:38:43 +0000 | [diff] [blame] | 268 | button_state &= ~k; |
Jens Arnold | 74b731e | 2005-03-18 23:51:52 +0000 | [diff] [blame] | 269 | else |
| 270 | button_state |= k; |
Björn Stenberg | c7dd78e | 2002-04-19 14:12:31 +0000 | [diff] [blame] | 271 | } |
| 272 | |
Jens Arnold | 74b731e | 2005-03-18 23:51:52 +0000 | [diff] [blame] | 273 | /* Again copied from real button.c... */ |
Daniel Stenberg | a398aa4 | 2002-08-07 08:43:55 +0000 | [diff] [blame] | 274 | |
Jean-Philippe Bernardy | 5804664 | 2005-02-07 23:11:20 +0000 | [diff] [blame] | 275 | long button_get(bool block) |
Björn Stenberg | c7dd78e | 2002-04-19 14:12:31 +0000 | [diff] [blame] | 276 | { |
Jens Arnold | 74b731e | 2005-03-18 23:51:52 +0000 | [diff] [blame] | 277 | struct event ev; |
Daniel Stenberg | 132a09b | 2002-05-28 15:05:16 +0000 | [diff] [blame] | 278 | |
Jens Arnold | 74b731e | 2005-03-18 23:51:52 +0000 | [diff] [blame] | 279 | if ( block || !queue_empty(&button_queue) ) |
| 280 | { |
| 281 | queue_wait(&button_queue, &ev); |
| 282 | return ev.id; |
| 283 | } |
| 284 | return BUTTON_NONE; |
| 285 | } |
Daniel Stenberg | ea60436 | 2002-10-13 14:16:44 +0000 | [diff] [blame] | 286 | |
Jens Arnold | 74b731e | 2005-03-18 23:51:52 +0000 | [diff] [blame] | 287 | long button_get_w_tmo(int ticks) |
| 288 | { |
| 289 | struct event ev; |
| 290 | queue_wait_w_tmo(&button_queue, &ev, ticks); |
| 291 | return (ev.id != SYS_TIMEOUT)? ev.id: BUTTON_NONE; |
| 292 | } |
| 293 | |
| 294 | void button_init(void) |
| 295 | { |
Jens Arnold | b51f7df | 2005-11-21 23:55:39 +0000 | [diff] [blame] | 296 | tick_add_task(button_tick); |
Björn Stenberg | c7dd78e | 2002-04-19 14:12:31 +0000 | [diff] [blame] | 297 | } |
Linus Nielsen Feltzing | a754dd8 | 2004-07-21 08:02:23 +0000 | [diff] [blame] | 298 | |
| 299 | int button_status(void) |
| 300 | { |
Jens Arnold | 74b731e | 2005-03-18 23:51:52 +0000 | [diff] [blame] | 301 | return lastbtn; |
Linus Nielsen Feltzing | a754dd8 | 2004-07-21 08:02:23 +0000 | [diff] [blame] | 302 | } |
| 303 | |
| 304 | void button_clear_queue(void) |
| 305 | { |
Jens Arnold | 74b731e | 2005-03-18 23:51:52 +0000 | [diff] [blame] | 306 | queue_clear(&button_queue); |
Linus Nielsen Feltzing | a754dd8 | 2004-07-21 08:02:23 +0000 | [diff] [blame] | 307 | } |
Michiel Van Der Kolk | abacb23 | 2005-03-03 15:55:11 +0000 | [diff] [blame] | 308 | |
Kevin Ferrare | a3766bf | 2005-11-22 22:52:05 +0000 | [diff] [blame] | 309 | #ifdef HAS_BUTTON_HOLD |
Michiel Van Der Kolk | abacb23 | 2005-03-03 15:55:11 +0000 | [diff] [blame] | 310 | bool button_hold(void) { |
| 311 | /* temp fix for hold button on irivers */ |
Linus Nielsen Feltzing | a81f4c3 | 2005-08-21 19:56:49 +0000 | [diff] [blame] | 312 | return false; |
| 313 | } |
Kevin Ferrare | a3766bf | 2005-11-22 22:52:05 +0000 | [diff] [blame] | 314 | #endif |
| 315 | |
| 316 | #ifdef HAS_REMOTE_BUTTON_HOLD |
Linus Nielsen Feltzing | a81f4c3 | 2005-08-21 19:56:49 +0000 | [diff] [blame] | 317 | bool remote_button_hold(void) { |
| 318 | /* temp fix for hold button on irivers */ |
| 319 | return false; |
Michiel Van Der Kolk | abacb23 | 2005-03-03 15:55:11 +0000 | [diff] [blame] | 320 | } |
| 321 | #endif |