| @@ -119,6 +119,7 @@ struct caca_context | |||||
| unsigned int (* get_window_height) (caca_t *); | unsigned int (* get_window_height) (caca_t *); | ||||
| void (* display) (caca_t *); | void (* display) (caca_t *); | ||||
| void (* handle_resize) (caca_t *, unsigned int *, unsigned int *); | void (* handle_resize) (caca_t *, unsigned int *, unsigned int *); | ||||
| unsigned int (* get_event) (caca_t *); | |||||
| } driver; | } driver; | ||||
| //unsigned int width, height; | //unsigned int width, height; | ||||
| @@ -120,6 +120,18 @@ static void conio_handle_resize(caca_t *kk, unsigned int *new_width, | |||||
| *new_height = kk->qq->height; | *new_height = kk->qq->height; | ||||
| } | } | ||||
| static unsigned int conio_get_event(caca_t *kk) | |||||
| { | |||||
| unsigned int event; | |||||
| if(!_conio_kbhit()) | |||||
| return CACA_EVENT_NONE; | |||||
| event = getch(); | |||||
| _push_event(kk, CACA_EVENT_KEY_RELEASE | event); | |||||
| return CACA_EVENT_KEY_PRESS | event; | |||||
| } | |||||
| /* | /* | ||||
| * Driver initialisation | * Driver initialisation | ||||
| */ | */ | ||||
| @@ -135,6 +147,7 @@ void conio_init_driver(caca_t *kk) | |||||
| kk->driver.get_window_height = conio_get_window_height; | kk->driver.get_window_height = conio_get_window_height; | ||||
| kk->driver.display = conio_display; | kk->driver.display = conio_display; | ||||
| kk->driver.handle_resize = conio_handle_resize; | kk->driver.handle_resize = conio_handle_resize; | ||||
| kk->driver.get_event = conio_get_event; | |||||
| } | } | ||||
| #endif /* USE_CONIO */ | #endif /* USE_CONIO */ | ||||
| @@ -292,6 +292,68 @@ static void gl_handle_resize(caca_t *kk, unsigned int *new_width, | |||||
| glMatrixMode(GL_MODELVIEW); | glMatrixMode(GL_MODELVIEW); | ||||
| } | } | ||||
| static unsigned int gl_get_event(caca_t *kk) | |||||
| { | |||||
| unsigned int event = 0; | |||||
| glutMainLoopEvent(); | |||||
| if(kk->gl.resized && !kk->resize) | |||||
| { | |||||
| kk->resize = 1; | |||||
| kk->gl.resized = 0; | |||||
| return CACA_EVENT_RESIZE; | |||||
| } | |||||
| if(kk->gl.mouse_changed) | |||||
| { | |||||
| if(kk->gl.mouse_clicked) | |||||
| { | |||||
| event |= CACA_EVENT_MOUSE_PRESS | kk->gl.mouse_button; | |||||
| kk->gl.mouse_clicked = 0; | |||||
| } | |||||
| kk->mouse_x = kk->gl.mouse_x; | |||||
| kk->mouse_y = kk->gl.mouse_y; | |||||
| event |= CACA_EVENT_MOUSE_MOTION | (kk->mouse_x << 12) | kk->mouse_y; | |||||
| kk->gl.mouse_changed = 0; | |||||
| } | |||||
| if(kk->gl.key != 0) | |||||
| { | |||||
| event |= CACA_EVENT_KEY_PRESS; | |||||
| event |= kk->gl.key; | |||||
| kk->gl.key = 0; | |||||
| return event; | |||||
| } | |||||
| if(kk->gl.special_key != 0) | |||||
| { | |||||
| event |= CACA_EVENT_KEY_PRESS; | |||||
| switch(kk->gl.special_key) | |||||
| { | |||||
| case GLUT_KEY_F1 : kk->gl.special_key = 0; return event | CACA_KEY_F1; | |||||
| case GLUT_KEY_F2 : kk->gl.special_key = 0; return event | CACA_KEY_F2; | |||||
| case GLUT_KEY_F3 : kk->gl.special_key = 0; return event | CACA_KEY_F3; | |||||
| case GLUT_KEY_F4 : kk->gl.special_key = 0; return event | CACA_KEY_F4; | |||||
| case GLUT_KEY_F5 : kk->gl.special_key = 0; return event | CACA_KEY_F5; | |||||
| case GLUT_KEY_F6 : kk->gl.special_key = 0; return event | CACA_KEY_F6; | |||||
| case GLUT_KEY_F7 : kk->gl.special_key = 0; return event | CACA_KEY_F7; | |||||
| case GLUT_KEY_F8 : kk->gl.special_key = 0; return event | CACA_KEY_F8; | |||||
| case GLUT_KEY_F9 : kk->gl.special_key = 0; return event | CACA_KEY_F9; | |||||
| case GLUT_KEY_F10: kk->gl.special_key = 0; return event | CACA_KEY_F10; | |||||
| case GLUT_KEY_F11: kk->gl.special_key = 0; return event | CACA_KEY_F11; | |||||
| case GLUT_KEY_F12: kk->gl.special_key = 0; return event | CACA_KEY_F12; | |||||
| case GLUT_KEY_LEFT : kk->gl.special_key = 0; return event | CACA_KEY_LEFT; | |||||
| case GLUT_KEY_RIGHT: kk->gl.special_key = 0; return event | CACA_KEY_RIGHT; | |||||
| case GLUT_KEY_UP : kk->gl.special_key = 0; return event | CACA_KEY_UP; | |||||
| case GLUT_KEY_DOWN : kk->gl.special_key = 0; return event | CACA_KEY_DOWN; | |||||
| default: return CACA_EVENT_NONE; | |||||
| } | |||||
| } | |||||
| return CACA_EVENT_NONE; | |||||
| } | |||||
| /* | /* | ||||
| * XXX: following functions are local | * XXX: following functions are local | ||||
| */ | */ | ||||
| @@ -361,6 +423,7 @@ void gl_init_driver(caca_t *kk) | |||||
| kk->driver.get_window_height = gl_get_window_height; | kk->driver.get_window_height = gl_get_window_height; | ||||
| kk->driver.display = gl_display; | kk->driver.display = gl_display; | ||||
| kk->driver.handle_resize = gl_handle_resize; | kk->driver.handle_resize = gl_handle_resize; | ||||
| kk->driver.get_event = gl_get_event; | |||||
| } | } | ||||
| #endif /* USE_GL */ | #endif /* USE_GL */ | ||||
| @@ -208,6 +208,189 @@ static void ncurses_handle_resize(caca_t *kk, unsigned int *new_width, | |||||
| } | } | ||||
| } | } | ||||
| static unsigned int ncurses_get_event(caca_t *kk) | |||||
| { | |||||
| unsigned int event; | |||||
| int intkey; | |||||
| if(kk->resize_event) | |||||
| { | |||||
| kk->resize_event = 0; | |||||
| kk->resize = 1; | |||||
| return CACA_EVENT_RESIZE; | |||||
| } | |||||
| intkey = getch(); | |||||
| if(intkey == ERR) | |||||
| return CACA_EVENT_NONE; | |||||
| if(intkey < 0x100) | |||||
| { | |||||
| return CACA_EVENT_KEY_PRESS | intkey; | |||||
| } | |||||
| if(intkey == KEY_MOUSE) | |||||
| { | |||||
| MEVENT mevent; | |||||
| getmouse(&mevent); | |||||
| switch(mevent.bstate) | |||||
| { | |||||
| case BUTTON1_PRESSED: | |||||
| _push_event(kk, CACA_EVENT_MOUSE_PRESS | 1); | |||||
| break; | |||||
| case BUTTON1_RELEASED: | |||||
| _push_event(kk, CACA_EVENT_MOUSE_RELEASE | 1); | |||||
| break; | |||||
| case BUTTON1_CLICKED: | |||||
| _push_event(kk, CACA_EVENT_MOUSE_PRESS | 1); | |||||
| _push_event(kk, CACA_EVENT_MOUSE_RELEASE | 1); | |||||
| break; | |||||
| case BUTTON1_DOUBLE_CLICKED: | |||||
| _push_event(kk, CACA_EVENT_MOUSE_PRESS | 1); | |||||
| _push_event(kk, CACA_EVENT_MOUSE_RELEASE | 1); | |||||
| _push_event(kk, CACA_EVENT_MOUSE_PRESS | 1); | |||||
| _push_event(kk, CACA_EVENT_MOUSE_RELEASE | 1); | |||||
| break; | |||||
| case BUTTON1_TRIPLE_CLICKED: | |||||
| _push_event(kk, CACA_EVENT_MOUSE_PRESS | 1); | |||||
| _push_event(kk, CACA_EVENT_MOUSE_RELEASE | 1); | |||||
| _push_event(kk, CACA_EVENT_MOUSE_PRESS | 1); | |||||
| _push_event(kk, CACA_EVENT_MOUSE_RELEASE | 1); | |||||
| _push_event(kk, CACA_EVENT_MOUSE_PRESS | 1); | |||||
| _push_event(kk, CACA_EVENT_MOUSE_RELEASE | 1); | |||||
| break; | |||||
| case BUTTON1_RESERVED_EVENT: | |||||
| break; | |||||
| case BUTTON2_PRESSED: | |||||
| _push_event(kk, CACA_EVENT_MOUSE_PRESS | 2); | |||||
| break; | |||||
| case BUTTON2_RELEASED: | |||||
| _push_event(kk, CACA_EVENT_MOUSE_RELEASE | 2); | |||||
| break; | |||||
| case BUTTON2_CLICKED: | |||||
| _push_event(kk, CACA_EVENT_MOUSE_PRESS | 2); | |||||
| _push_event(kk, CACA_EVENT_MOUSE_RELEASE | 2); | |||||
| break; | |||||
| case BUTTON2_DOUBLE_CLICKED: | |||||
| _push_event(kk, CACA_EVENT_MOUSE_PRESS | 2); | |||||
| _push_event(kk, CACA_EVENT_MOUSE_RELEASE | 2); | |||||
| _push_event(kk, CACA_EVENT_MOUSE_PRESS | 2); | |||||
| _push_event(kk, CACA_EVENT_MOUSE_RELEASE | 2); | |||||
| break; | |||||
| case BUTTON2_TRIPLE_CLICKED: | |||||
| _push_event(kk, CACA_EVENT_MOUSE_PRESS | 2); | |||||
| _push_event(kk, CACA_EVENT_MOUSE_RELEASE | 2); | |||||
| _push_event(kk, CACA_EVENT_MOUSE_PRESS | 2); | |||||
| _push_event(kk, CACA_EVENT_MOUSE_RELEASE | 2); | |||||
| _push_event(kk, CACA_EVENT_MOUSE_PRESS | 2); | |||||
| _push_event(kk, CACA_EVENT_MOUSE_RELEASE | 2); | |||||
| break; | |||||
| case BUTTON2_RESERVED_EVENT: | |||||
| break; | |||||
| case BUTTON3_PRESSED: | |||||
| _push_event(kk, CACA_EVENT_MOUSE_PRESS | 3); | |||||
| break; | |||||
| case BUTTON3_RELEASED: | |||||
| _push_event(kk, CACA_EVENT_MOUSE_RELEASE | 3); | |||||
| break; | |||||
| case BUTTON3_CLICKED: | |||||
| _push_event(kk, CACA_EVENT_MOUSE_PRESS | 3); | |||||
| _push_event(kk, CACA_EVENT_MOUSE_RELEASE | 3); | |||||
| break; | |||||
| case BUTTON3_DOUBLE_CLICKED: | |||||
| _push_event(kk, CACA_EVENT_MOUSE_PRESS | 3); | |||||
| _push_event(kk, CACA_EVENT_MOUSE_RELEASE | 3); | |||||
| _push_event(kk, CACA_EVENT_MOUSE_PRESS | 3); | |||||
| _push_event(kk, CACA_EVENT_MOUSE_RELEASE | 3); | |||||
| break; | |||||
| case BUTTON3_TRIPLE_CLICKED: | |||||
| _push_event(kk, CACA_EVENT_MOUSE_PRESS | 3); | |||||
| _push_event(kk, CACA_EVENT_MOUSE_RELEASE | 3); | |||||
| _push_event(kk, CACA_EVENT_MOUSE_PRESS | 3); | |||||
| _push_event(kk, CACA_EVENT_MOUSE_RELEASE | 3); | |||||
| _push_event(kk, CACA_EVENT_MOUSE_PRESS | 3); | |||||
| _push_event(kk, CACA_EVENT_MOUSE_RELEASE | 3); | |||||
| break; | |||||
| case BUTTON3_RESERVED_EVENT: | |||||
| break; | |||||
| case BUTTON4_PRESSED: | |||||
| _push_event(kk, CACA_EVENT_MOUSE_PRESS | 4); | |||||
| break; | |||||
| case BUTTON4_RELEASED: | |||||
| _push_event(kk, CACA_EVENT_MOUSE_RELEASE | 4); | |||||
| break; | |||||
| case BUTTON4_CLICKED: | |||||
| _push_event(kk, CACA_EVENT_MOUSE_PRESS | 4); | |||||
| _push_event(kk, CACA_EVENT_MOUSE_RELEASE | 4); | |||||
| break; | |||||
| case BUTTON4_DOUBLE_CLICKED: | |||||
| _push_event(kk, CACA_EVENT_MOUSE_PRESS | 4); | |||||
| _push_event(kk, CACA_EVENT_MOUSE_RELEASE | 4); | |||||
| _push_event(kk, CACA_EVENT_MOUSE_PRESS | 4); | |||||
| _push_event(kk, CACA_EVENT_MOUSE_RELEASE | 4); | |||||
| break; | |||||
| case BUTTON4_TRIPLE_CLICKED: | |||||
| _push_event(kk, CACA_EVENT_MOUSE_PRESS | 4); | |||||
| _push_event(kk, CACA_EVENT_MOUSE_RELEASE | 4); | |||||
| _push_event(kk, CACA_EVENT_MOUSE_PRESS | 4); | |||||
| _push_event(kk, CACA_EVENT_MOUSE_RELEASE | 4); | |||||
| _push_event(kk, CACA_EVENT_MOUSE_PRESS | 4); | |||||
| _push_event(kk, CACA_EVENT_MOUSE_RELEASE | 4); | |||||
| break; | |||||
| case BUTTON4_RESERVED_EVENT: | |||||
| break; | |||||
| default: | |||||
| break; | |||||
| } | |||||
| if(kk->mouse_x == (unsigned int)mevent.x && | |||||
| kk->mouse_y == (unsigned int)mevent.y) | |||||
| return _pop_event(kk); | |||||
| kk->mouse_x = mevent.x; | |||||
| kk->mouse_y = mevent.y; | |||||
| return CACA_EVENT_MOUSE_MOTION | (kk->mouse_x << 12) | kk->mouse_y; | |||||
| } | |||||
| event = CACA_EVENT_KEY_PRESS; | |||||
| switch(intkey) | |||||
| { | |||||
| case KEY_UP: return event | CACA_KEY_UP; | |||||
| case KEY_DOWN: return event | CACA_KEY_DOWN; | |||||
| case KEY_LEFT: return event | CACA_KEY_LEFT; | |||||
| case KEY_RIGHT: return event | CACA_KEY_RIGHT; | |||||
| case KEY_IC: return event | CACA_KEY_INSERT; | |||||
| case KEY_DC: return event | CACA_KEY_DELETE; | |||||
| case KEY_HOME: return event | CACA_KEY_HOME; | |||||
| case KEY_END: return event | CACA_KEY_END; | |||||
| case KEY_PPAGE: return event | CACA_KEY_PAGEUP; | |||||
| case KEY_NPAGE: return event | CACA_KEY_PAGEDOWN; | |||||
| case KEY_F(1): return event | CACA_KEY_F1; | |||||
| case KEY_F(2): return event | CACA_KEY_F2; | |||||
| case KEY_F(3): return event | CACA_KEY_F3; | |||||
| case KEY_F(4): return event | CACA_KEY_F4; | |||||
| case KEY_F(5): return event | CACA_KEY_F5; | |||||
| case KEY_F(6): return event | CACA_KEY_F6; | |||||
| case KEY_F(7): return event | CACA_KEY_F7; | |||||
| case KEY_F(8): return event | CACA_KEY_F8; | |||||
| case KEY_F(9): return event | CACA_KEY_F9; | |||||
| case KEY_F(10): return event | CACA_KEY_F10; | |||||
| case KEY_F(11): return event | CACA_KEY_F11; | |||||
| case KEY_F(12): return event | CACA_KEY_F12; | |||||
| } | |||||
| return CACA_EVENT_NONE; | |||||
| } | |||||
| /* | /* | ||||
| * XXX: following functions are local | * XXX: following functions are local | ||||
| */ | */ | ||||
| @@ -236,6 +419,7 @@ void ncurses_init_driver(caca_t *kk) | |||||
| kk->driver.get_window_height = ncurses_get_window_height; | kk->driver.get_window_height = ncurses_get_window_height; | ||||
| kk->driver.display = ncurses_display; | kk->driver.display = ncurses_display; | ||||
| kk->driver.handle_resize = ncurses_handle_resize; | kk->driver.handle_resize = ncurses_handle_resize; | ||||
| kk->driver.get_event = ncurses_get_event; | |||||
| } | } | ||||
| #endif /* USE_NCURSES */ | #endif /* USE_NCURSES */ | ||||
| @@ -245,6 +245,88 @@ static void slang_handle_resize(caca_t *kk, unsigned int *new_width, | |||||
| SLsmg_reinit_smg(); | SLsmg_reinit_smg(); | ||||
| } | } | ||||
| static unsigned int slang_get_event(caca_t *kk) | |||||
| { | |||||
| unsigned int event; | |||||
| int intkey; | |||||
| if(kk->resize_event) | |||||
| { | |||||
| kk->resize_event = 0; | |||||
| kk->resize = 1; | |||||
| return CACA_EVENT_RESIZE; | |||||
| } | |||||
| if(!SLang_input_pending(0)) | |||||
| return CACA_EVENT_NONE; | |||||
| /* We first use SLang_getkey() to see whether Esc was pressed | |||||
| * alone, then (if it wasn't) we unget the key and use SLkp_getkey() | |||||
| * instead, so that escape sequences are interpreted. */ | |||||
| intkey = SLang_getkey(); | |||||
| if(intkey != 0x1b /* Esc */ || SLang_input_pending(0)) | |||||
| { | |||||
| SLang_ungetkey(intkey); | |||||
| intkey = SLkp_getkey(); | |||||
| } | |||||
| /* If the key was ASCII, return it immediately */ | |||||
| if(intkey < 0x100) | |||||
| { | |||||
| return CACA_EVENT_KEY_PRESS | intkey; | |||||
| } | |||||
| if(intkey == 0x3e9) | |||||
| { | |||||
| int button = (SLang_getkey() - ' ' + 1) & 0xf; | |||||
| unsigned int x = SLang_getkey() - '!'; | |||||
| unsigned int y = SLang_getkey() - '!'; | |||||
| _push_event(kk, CACA_EVENT_MOUSE_PRESS | button); | |||||
| _push_event(kk, CACA_EVENT_MOUSE_RELEASE | button); | |||||
| if(kk->mouse_x == x && kk->mouse_y == y) | |||||
| return _pop_event(kk); | |||||
| kk->mouse_x = x; | |||||
| kk->mouse_y = y; | |||||
| return CACA_EVENT_MOUSE_MOTION | (kk->mouse_x << 12) | kk->mouse_y; | |||||
| } | |||||
| event = CACA_EVENT_KEY_PRESS; | |||||
| switch(intkey) | |||||
| { | |||||
| case SL_KEY_UP: return event | CACA_KEY_UP; | |||||
| case SL_KEY_DOWN: return event | CACA_KEY_DOWN; | |||||
| case SL_KEY_LEFT: return event | CACA_KEY_LEFT; | |||||
| case SL_KEY_RIGHT: return event | CACA_KEY_RIGHT; | |||||
| case SL_KEY_IC: return event | CACA_KEY_INSERT; | |||||
| case SL_KEY_DELETE: return event | CACA_KEY_DELETE; | |||||
| case SL_KEY_HOME: return event | CACA_KEY_HOME; | |||||
| case SL_KEY_END: return event | CACA_KEY_END; | |||||
| case SL_KEY_PPAGE: return event | CACA_KEY_PAGEUP; | |||||
| case SL_KEY_NPAGE: return event | CACA_KEY_PAGEDOWN; | |||||
| case SL_KEY_F(1): return event | CACA_KEY_F1; | |||||
| case SL_KEY_F(2): return event | CACA_KEY_F2; | |||||
| case SL_KEY_F(3): return event | CACA_KEY_F3; | |||||
| case SL_KEY_F(4): return event | CACA_KEY_F4; | |||||
| case SL_KEY_F(5): return event | CACA_KEY_F5; | |||||
| case SL_KEY_F(6): return event | CACA_KEY_F6; | |||||
| case SL_KEY_F(7): return event | CACA_KEY_F7; | |||||
| case SL_KEY_F(8): return event | CACA_KEY_F8; | |||||
| case SL_KEY_F(9): return event | CACA_KEY_F9; | |||||
| case SL_KEY_F(10): return event | CACA_KEY_F10; | |||||
| case SL_KEY_F(11): return event | CACA_KEY_F11; | |||||
| case SL_KEY_F(12): return event | CACA_KEY_F12; | |||||
| } | |||||
| return CACA_EVENT_NONE; | |||||
| } | |||||
| /* | /* | ||||
| * XXX: following functions are local | * XXX: following functions are local | ||||
| */ | */ | ||||
| @@ -316,6 +398,7 @@ void slang_init_driver(caca_t *kk) | |||||
| kk->driver.get_window_height = slang_get_window_height; | kk->driver.get_window_height = slang_get_window_height; | ||||
| kk->driver.display = slang_display; | kk->driver.display = slang_display; | ||||
| kk->driver.handle_resize = slang_handle_resize; | kk->driver.handle_resize = slang_handle_resize; | ||||
| kk->driver.get_event = slang_get_event; | |||||
| } | } | ||||
| #endif /* USE_SLANG */ | #endif /* USE_SLANG */ | ||||
| @@ -216,6 +216,80 @@ static void win32_handle_resize(caca_t *kk, unsigned int *new_width, | |||||
| *new_height = kk->qq->height; | *new_height = kk->qq->height; | ||||
| } | } | ||||
| static unsigned int win32_get_event(caca_t *kk) | |||||
| { | |||||
| INPUT_RECORD rec; | |||||
| DWORD num; | |||||
| for( ; ; ) | |||||
| { | |||||
| GetNumberOfConsoleInputEvents(kk->win32.hin, &num); | |||||
| if(num == 0) | |||||
| break; | |||||
| ReadConsoleInput(kk->win32.hin, &rec, 1, &num); | |||||
| if(rec.EventType == KEY_EVENT) | |||||
| { | |||||
| unsigned int event; | |||||
| if(rec.Event.KeyEvent.bKeyDown) | |||||
| event = CACA_EVENT_KEY_PRESS; | |||||
| else | |||||
| event = CACA_EVENT_KEY_RELEASE; | |||||
| if(rec.Event.KeyEvent.uChar.AsciiChar) | |||||
| return event | rec.Event.KeyEvent.uChar.AsciiChar; | |||||
| } | |||||
| if(rec.EventType == MOUSE_EVENT) | |||||
| { | |||||
| if(rec.Event.MouseEvent.dwEventFlags == 0) | |||||
| { | |||||
| if(rec.Event.MouseEvent.dwButtonState & 0x01) | |||||
| return CACA_EVENT_MOUSE_PRESS | 0x000001; | |||||
| if(rec.Event.MouseEvent.dwButtonState & 0x02) | |||||
| return CACA_EVENT_MOUSE_PRESS | 0x000002; | |||||
| } | |||||
| else if(rec.Event.MouseEvent.dwEventFlags == MOUSE_MOVED) | |||||
| { | |||||
| COORD pos = rec.Event.MouseEvent.dwMousePosition; | |||||
| if(kk->mouse_x == (unsigned int)pos.X && | |||||
| kk->mouse_y == (unsigned int)pos.Y) | |||||
| continue; | |||||
| kk->mouse_x = pos.X; | |||||
| kk->mouse_y = pos.Y; | |||||
| return CACA_EVENT_MOUSE_MOTION | (kk->mouse_x << 12) | kk->mouse_y; | |||||
| } | |||||
| #if 0 | |||||
| else if(rec.Event.MouseEvent.dwEventFlags == DOUBLE_CLICK) | |||||
| { | |||||
| cout << rec.Event.MouseEvent.dwMousePosition.X << "," << | |||||
| rec.Event.MouseEvent.dwMousePosition.Y << " " << flush; | |||||
| } | |||||
| else if(rec.Event.MouseEvent.dwEventFlags == MOUSE_WHEELED) | |||||
| { | |||||
| SetConsoleCursorPosition(hOut, | |||||
| WheelWhere); | |||||
| if(rec.Event.MouseEvent.dwButtonState & 0xFF000000) | |||||
| cout << "Down" << flush; | |||||
| else | |||||
| cout << "Up " << flush; | |||||
| } | |||||
| #endif | |||||
| } | |||||
| /* Unknown event */ | |||||
| return CACA_EVENT_NONE; | |||||
| } | |||||
| /* No event */ | |||||
| return CACA_EVENT_NONE; | |||||
| } | |||||
| /* | /* | ||||
| * Driver initialisation | * Driver initialisation | ||||
| */ | */ | ||||
| @@ -231,6 +305,7 @@ void win32_init_driver(caca_t *kk) | |||||
| kk->driver.get_window_height = win32_get_window_height; | kk->driver.get_window_height = win32_get_window_height; | ||||
| kk->driver.display = win32_display; | kk->driver.display = win32_display; | ||||
| kk->driver.handle_resize = win32_handle_resize; | kk->driver.handle_resize = win32_handle_resize; | ||||
| kk->driver.get_event = win32_get_event; | |||||
| } | } | ||||
| #endif /* USE_WIN32 */ | #endif /* USE_WIN32 */ | ||||
| @@ -22,6 +22,8 @@ | |||||
| #if defined(USE_X11) | #if defined(USE_X11) | ||||
| #include <X11/Xlib.h> | #include <X11/Xlib.h> | ||||
| #include <X11/Xutil.h> | |||||
| #include <X11/keysym.h> | |||||
| #if defined(HAVE_X11_XKBLIB_H) | #if defined(HAVE_X11_XKBLIB_H) | ||||
| # include <X11/XKBlib.h> | # include <X11/XKBlib.h> | ||||
| #endif | #endif | ||||
| @@ -162,9 +164,9 @@ static int x11_init_graphics(caca_t *kk) | |||||
| for(;;) | for(;;) | ||||
| { | { | ||||
| XEvent event; | |||||
| XNextEvent(kk->x11.dpy, &event); | |||||
| if (event.type == MapNotify) | |||||
| XEvent xevent; | |||||
| XNextEvent(kk->x11.dpy, &xevent); | |||||
| if (xevent.type == MapNotify) | |||||
| break; | break; | ||||
| } | } | ||||
| @@ -311,11 +313,126 @@ static void x11_handle_resize(caca_t *kk, unsigned int *new_width, | |||||
| kk->x11.pixmap = new_pixmap; | kk->x11.pixmap = new_pixmap; | ||||
| } | } | ||||
| static unsigned int x11_get_event(caca_t *kk) | |||||
| { | |||||
| unsigned int event = 0; | |||||
| XEvent xevent; | |||||
| char key; | |||||
| while(XCheckWindowEvent(kk->x11.dpy, kk->x11.window, | |||||
| kk->x11.event_mask, &xevent) == True) | |||||
| { | |||||
| KeySym keysym; | |||||
| /* Expose event */ | |||||
| if(xevent.type == Expose) | |||||
| { | |||||
| XCopyArea(kk->x11.dpy, kk->x11.pixmap, | |||||
| kk->x11.window, kk->x11.gc, 0, 0, | |||||
| kk->qq->width * kk->x11.font_width, | |||||
| kk->qq->height * kk->x11.font_height, 0, 0); | |||||
| continue; | |||||
| } | |||||
| /* Resize event */ | |||||
| if(xevent.type == ConfigureNotify) | |||||
| { | |||||
| unsigned int w, h; | |||||
| w = (xevent.xconfigure.width + kk->x11.font_width / 3) | |||||
| / kk->x11.font_width; | |||||
| h = (xevent.xconfigure.height + kk->x11.font_height / 3) | |||||
| / kk->x11.font_height; | |||||
| if(!w || !h || (w == kk->qq->width && h == kk->qq->height)) | |||||
| continue; | |||||
| kk->x11.new_width = w; | |||||
| kk->x11.new_height = h; | |||||
| /* If we are already resizing, ignore the new signal */ | |||||
| if(kk->resize) | |||||
| continue; | |||||
| kk->resize = 1; | |||||
| return CACA_EVENT_RESIZE; | |||||
| } | |||||
| /* Check for mouse motion events */ | |||||
| if(xevent.type == MotionNotify) | |||||
| { | |||||
| unsigned int newx = xevent.xmotion.x / kk->x11.font_width; | |||||
| unsigned int newy = xevent.xmotion.y / kk->x11.font_height; | |||||
| if(newx >= kk->qq->width) | |||||
| newx = kk->qq->width - 1; | |||||
| if(newy >= kk->qq->height) | |||||
| newy = kk->qq->height - 1; | |||||
| if(kk->mouse_x == newx && kk->mouse_y == newy) | |||||
| continue; | |||||
| kk->mouse_x = newx; | |||||
| kk->mouse_y = newy; | |||||
| return CACA_EVENT_MOUSE_MOTION | (kk->mouse_x << 12) | kk->mouse_y; | |||||
| } | |||||
| /* Check for mouse press and release events */ | |||||
| if(xevent.type == ButtonPress) | |||||
| return CACA_EVENT_MOUSE_PRESS | |||||
| | ((XButtonEvent *)&xevent)->button; | |||||
| if(xevent.type == ButtonRelease) | |||||
| return CACA_EVENT_MOUSE_RELEASE | |||||
| | ((XButtonEvent *)&xevent)->button; | |||||
| /* Check for key press and release events */ | |||||
| if(xevent.type == KeyPress) | |||||
| event |= CACA_EVENT_KEY_PRESS; | |||||
| else if(xevent.type == KeyRelease) | |||||
| event |= CACA_EVENT_KEY_RELEASE; | |||||
| else | |||||
| continue; | |||||
| if(XLookupString(&xevent.xkey, &key, 1, NULL, NULL)) | |||||
| return event | key; | |||||
| keysym = XKeycodeToKeysym(kk->x11.dpy, xevent.xkey.keycode, 0); | |||||
| switch(keysym) | |||||
| { | |||||
| case XK_F1: return event | CACA_KEY_F1; | |||||
| case XK_F2: return event | CACA_KEY_F2; | |||||
| case XK_F3: return event | CACA_KEY_F3; | |||||
| case XK_F4: return event | CACA_KEY_F4; | |||||
| case XK_F5: return event | CACA_KEY_F5; | |||||
| case XK_F6: return event | CACA_KEY_F6; | |||||
| case XK_F7: return event | CACA_KEY_F7; | |||||
| case XK_F8: return event | CACA_KEY_F8; | |||||
| case XK_F9: return event | CACA_KEY_F9; | |||||
| case XK_F10: return event | CACA_KEY_F10; | |||||
| case XK_F11: return event | CACA_KEY_F11; | |||||
| case XK_F12: return event | CACA_KEY_F12; | |||||
| case XK_F13: return event | CACA_KEY_F13; | |||||
| case XK_F14: return event | CACA_KEY_F14; | |||||
| case XK_F15: return event | CACA_KEY_F15; | |||||
| case XK_Left: return event | CACA_KEY_LEFT; | |||||
| case XK_Right: return event | CACA_KEY_RIGHT; | |||||
| case XK_Up: return event | CACA_KEY_UP; | |||||
| case XK_Down: return event | CACA_KEY_DOWN; | |||||
| default: return CACA_EVENT_NONE; | |||||
| } | |||||
| } | |||||
| return CACA_EVENT_NONE; | |||||
| } | |||||
| /* | /* | ||||
| * XXX: following functions are local | * XXX: following functions are local | ||||
| */ | */ | ||||
| static int x11_error_handler(Display *dpy, XErrorEvent *event) | |||||
| static int x11_error_handler(Display *dpy, XErrorEvent *xevent) | |||||
| { | { | ||||
| /* Ignore the error */ | /* Ignore the error */ | ||||
| return 0; | return 0; | ||||
| @@ -336,6 +453,7 @@ void x11_init_driver(caca_t *kk) | |||||
| kk->driver.get_window_height = x11_get_window_height; | kk->driver.get_window_height = x11_get_window_height; | ||||
| kk->driver.display = x11_display; | kk->driver.display = x11_display; | ||||
| kk->driver.handle_resize = x11_handle_resize; | kk->driver.handle_resize = x11_handle_resize; | ||||
| kk->driver.get_event = x11_get_event; | |||||
| } | } | ||||
| #endif /* USE_X11 */ | #endif /* USE_X11 */ | ||||
| @@ -19,37 +19,6 @@ | |||||
| #include "config.h" | #include "config.h" | ||||
| #if defined(USE_SLANG) | |||||
| # if defined(HAVE_SLANG_SLANG_H) | |||||
| # include <slang/slang.h> | |||||
| # else | |||||
| # include <slang.h> | |||||
| # endif | |||||
| #endif | |||||
| #if defined(USE_NCURSES) | |||||
| # if defined(HAVE_NCURSES_H) | |||||
| # include <ncurses.h> | |||||
| # else | |||||
| # include <curses.h> | |||||
| # endif | |||||
| #endif | |||||
| #if defined(USE_CONIO) | |||||
| # include <conio.h> | |||||
| #endif | |||||
| #if defined(USE_X11) | |||||
| # include <X11/Xlib.h> | |||||
| # include <X11/Xutil.h> | |||||
| # include <X11/keysym.h> | |||||
| #endif | |||||
| #if defined(USE_WIN32) | |||||
| # include <windows.h> | |||||
| #endif | |||||
| #if defined(USE_GL) | |||||
| #include <GL/gl.h> | |||||
| #include <GL/glut.h> | |||||
| #include <GL/freeglut_ext.h> | |||||
| #endif | |||||
| #include "cucul.h" | #include "cucul.h" | ||||
| #include "cucul_internals.h" | #include "cucul_internals.h" | ||||
| #include "caca.h" | #include "caca.h" | ||||
| @@ -58,8 +27,8 @@ | |||||
| static unsigned int _get_next_event(caca_t *); | static unsigned int _get_next_event(caca_t *); | ||||
| static unsigned int _lowlevel_event(caca_t *); | static unsigned int _lowlevel_event(caca_t *); | ||||
| #if defined(USE_SLANG) || defined(USE_NCURSES) || defined(USE_CONIO) | #if defined(USE_SLANG) || defined(USE_NCURSES) || defined(USE_CONIO) | ||||
| static void _push_event(caca_t *, unsigned int); | |||||
| static unsigned int _pop_event(caca_t *); | |||||
| void _push_event(caca_t *, unsigned int); | |||||
| unsigned int _pop_event(caca_t *); | |||||
| #endif | #endif | ||||
| #if !defined(_DOXYGEN_SKIP_ME) | #if !defined(_DOXYGEN_SKIP_ME) | ||||
| @@ -229,556 +198,18 @@ static unsigned int _get_next_event(caca_t *kk) | |||||
| static unsigned int _lowlevel_event(caca_t *kk) | static unsigned int _lowlevel_event(caca_t *kk) | ||||
| { | { | ||||
| unsigned int event; | |||||
| #if defined(USE_SLANG) || defined(USE_NCURSES) || defined(USE_CONIO) | #if defined(USE_SLANG) || defined(USE_NCURSES) || defined(USE_CONIO) | ||||
| event = _pop_event(kk); | |||||
| unsigned int event = _pop_event(kk); | |||||
| if(event) | if(event) | ||||
| return event; | return event; | ||||
| #endif | #endif | ||||
| #if defined(USE_X11) | |||||
| /* The X11 event check routine */ | |||||
| if(kk->driver.driver == CACA_DRIVER_X11) | |||||
| { | |||||
| XEvent xevent; | |||||
| char key; | |||||
| while(XCheckWindowEvent(kk->x11.dpy, kk->x11.window, kk->x11.event_mask, &xevent) | |||||
| == True) | |||||
| { | |||||
| KeySym keysym; | |||||
| /* Expose event */ | |||||
| if(xevent.type == Expose) | |||||
| { | |||||
| XCopyArea(kk->x11.dpy, kk->x11.pixmap, | |||||
| kk->x11.window, kk->x11.gc, 0, 0, | |||||
| kk->qq->width * kk->x11.font_width, | |||||
| kk->qq->height * kk->x11.font_height, 0, 0); | |||||
| continue; | |||||
| } | |||||
| /* Resize event */ | |||||
| if(xevent.type == ConfigureNotify) | |||||
| { | |||||
| unsigned int w, h; | |||||
| w = (xevent.xconfigure.width + kk->x11.font_width / 3) | |||||
| / kk->x11.font_width; | |||||
| h = (xevent.xconfigure.height + kk->x11.font_height / 3) | |||||
| / kk->x11.font_height; | |||||
| if(!w || !h || (w == kk->qq->width && h == kk->qq->height)) | |||||
| continue; | |||||
| kk->x11.new_width = w; | |||||
| kk->x11.new_height = h; | |||||
| /* If we are already resizing, ignore the new signal */ | |||||
| if(kk->resize) | |||||
| continue; | |||||
| kk->resize = 1; | |||||
| return CACA_EVENT_RESIZE; | |||||
| } | |||||
| /* Check for mouse motion events */ | |||||
| if(xevent.type == MotionNotify) | |||||
| { | |||||
| unsigned int newx = xevent.xmotion.x / kk->x11.font_width; | |||||
| unsigned int newy = xevent.xmotion.y / kk->x11.font_height; | |||||
| if(newx >= kk->qq->width) | |||||
| newx = kk->qq->width - 1; | |||||
| if(newy >= kk->qq->height) | |||||
| newy = kk->qq->height - 1; | |||||
| if(kk->mouse_x == newx && kk->mouse_y == newy) | |||||
| continue; | |||||
| kk->mouse_x = newx; | |||||
| kk->mouse_y = newy; | |||||
| return CACA_EVENT_MOUSE_MOTION | (kk->mouse_x << 12) | kk->mouse_y; | |||||
| } | |||||
| /* Check for mouse press and release events */ | |||||
| if(xevent.type == ButtonPress) | |||||
| return CACA_EVENT_MOUSE_PRESS | |||||
| | ((XButtonEvent *)&xevent)->button; | |||||
| if(xevent.type == ButtonRelease) | |||||
| return CACA_EVENT_MOUSE_RELEASE | |||||
| | ((XButtonEvent *)&xevent)->button; | |||||
| /* Check for key press and release events */ | |||||
| if(xevent.type == KeyPress) | |||||
| event |= CACA_EVENT_KEY_PRESS; | |||||
| else if(xevent.type == KeyRelease) | |||||
| event |= CACA_EVENT_KEY_RELEASE; | |||||
| else | |||||
| continue; | |||||
| if(XLookupString(&xevent.xkey, &key, 1, NULL, NULL)) | |||||
| return event | key; | |||||
| keysym = XKeycodeToKeysym(kk->x11.dpy, xevent.xkey.keycode, 0); | |||||
| switch(keysym) | |||||
| { | |||||
| case XK_F1: return event | CACA_KEY_F1; | |||||
| case XK_F2: return event | CACA_KEY_F2; | |||||
| case XK_F3: return event | CACA_KEY_F3; | |||||
| case XK_F4: return event | CACA_KEY_F4; | |||||
| case XK_F5: return event | CACA_KEY_F5; | |||||
| case XK_F6: return event | CACA_KEY_F6; | |||||
| case XK_F7: return event | CACA_KEY_F7; | |||||
| case XK_F8: return event | CACA_KEY_F8; | |||||
| case XK_F9: return event | CACA_KEY_F9; | |||||
| case XK_F10: return event | CACA_KEY_F10; | |||||
| case XK_F11: return event | CACA_KEY_F11; | |||||
| case XK_F12: return event | CACA_KEY_F12; | |||||
| case XK_F13: return event | CACA_KEY_F13; | |||||
| case XK_F14: return event | CACA_KEY_F14; | |||||
| case XK_F15: return event | CACA_KEY_F15; | |||||
| case XK_Left: return event | CACA_KEY_LEFT; | |||||
| case XK_Right: return event | CACA_KEY_RIGHT; | |||||
| case XK_Up: return event | CACA_KEY_UP; | |||||
| case XK_Down: return event | CACA_KEY_DOWN; | |||||
| default: return CACA_EVENT_NONE; | |||||
| } | |||||
| } | |||||
| return CACA_EVENT_NONE; | |||||
| } | |||||
| else | |||||
| #endif | |||||
| #if defined(USE_NCURSES) | |||||
| if(kk->driver.driver == CACA_DRIVER_NCURSES) | |||||
| { | |||||
| int intkey; | |||||
| if(kk->resize_event) | |||||
| { | |||||
| kk->resize_event = 0; | |||||
| kk->resize = 1; | |||||
| return CACA_EVENT_RESIZE; | |||||
| } | |||||
| intkey = getch(); | |||||
| if(intkey == ERR) | |||||
| return CACA_EVENT_NONE; | |||||
| if(intkey < 0x100) | |||||
| { | |||||
| return CACA_EVENT_KEY_PRESS | intkey; | |||||
| } | |||||
| if(intkey == KEY_MOUSE) | |||||
| { | |||||
| MEVENT mevent; | |||||
| getmouse(&mevent); | |||||
| switch(mevent.bstate) | |||||
| { | |||||
| case BUTTON1_PRESSED: | |||||
| _push_event(kk, CACA_EVENT_MOUSE_PRESS | 1); | |||||
| break; | |||||
| case BUTTON1_RELEASED: | |||||
| _push_event(kk, CACA_EVENT_MOUSE_RELEASE | 1); | |||||
| break; | |||||
| case BUTTON1_CLICKED: | |||||
| _push_event(kk, CACA_EVENT_MOUSE_PRESS | 1); | |||||
| _push_event(kk, CACA_EVENT_MOUSE_RELEASE | 1); | |||||
| break; | |||||
| case BUTTON1_DOUBLE_CLICKED: | |||||
| _push_event(kk, CACA_EVENT_MOUSE_PRESS | 1); | |||||
| _push_event(kk, CACA_EVENT_MOUSE_RELEASE | 1); | |||||
| _push_event(kk, CACA_EVENT_MOUSE_PRESS | 1); | |||||
| _push_event(kk, CACA_EVENT_MOUSE_RELEASE | 1); | |||||
| break; | |||||
| case BUTTON1_TRIPLE_CLICKED: | |||||
| _push_event(kk, CACA_EVENT_MOUSE_PRESS | 1); | |||||
| _push_event(kk, CACA_EVENT_MOUSE_RELEASE | 1); | |||||
| _push_event(kk, CACA_EVENT_MOUSE_PRESS | 1); | |||||
| _push_event(kk, CACA_EVENT_MOUSE_RELEASE | 1); | |||||
| _push_event(kk, CACA_EVENT_MOUSE_PRESS | 1); | |||||
| _push_event(kk, CACA_EVENT_MOUSE_RELEASE | 1); | |||||
| break; | |||||
| case BUTTON1_RESERVED_EVENT: | |||||
| break; | |||||
| case BUTTON2_PRESSED: | |||||
| _push_event(kk, CACA_EVENT_MOUSE_PRESS | 2); | |||||
| break; | |||||
| case BUTTON2_RELEASED: | |||||
| _push_event(kk, CACA_EVENT_MOUSE_RELEASE | 2); | |||||
| break; | |||||
| case BUTTON2_CLICKED: | |||||
| _push_event(kk, CACA_EVENT_MOUSE_PRESS | 2); | |||||
| _push_event(kk, CACA_EVENT_MOUSE_RELEASE | 2); | |||||
| break; | |||||
| case BUTTON2_DOUBLE_CLICKED: | |||||
| _push_event(kk, CACA_EVENT_MOUSE_PRESS | 2); | |||||
| _push_event(kk, CACA_EVENT_MOUSE_RELEASE | 2); | |||||
| _push_event(kk, CACA_EVENT_MOUSE_PRESS | 2); | |||||
| _push_event(kk, CACA_EVENT_MOUSE_RELEASE | 2); | |||||
| break; | |||||
| case BUTTON2_TRIPLE_CLICKED: | |||||
| _push_event(kk, CACA_EVENT_MOUSE_PRESS | 2); | |||||
| _push_event(kk, CACA_EVENT_MOUSE_RELEASE | 2); | |||||
| _push_event(kk, CACA_EVENT_MOUSE_PRESS | 2); | |||||
| _push_event(kk, CACA_EVENT_MOUSE_RELEASE | 2); | |||||
| _push_event(kk, CACA_EVENT_MOUSE_PRESS | 2); | |||||
| _push_event(kk, CACA_EVENT_MOUSE_RELEASE | 2); | |||||
| break; | |||||
| case BUTTON2_RESERVED_EVENT: | |||||
| break; | |||||
| case BUTTON3_PRESSED: | |||||
| _push_event(kk, CACA_EVENT_MOUSE_PRESS | 3); | |||||
| break; | |||||
| case BUTTON3_RELEASED: | |||||
| _push_event(kk, CACA_EVENT_MOUSE_RELEASE | 3); | |||||
| break; | |||||
| case BUTTON3_CLICKED: | |||||
| _push_event(kk, CACA_EVENT_MOUSE_PRESS | 3); | |||||
| _push_event(kk, CACA_EVENT_MOUSE_RELEASE | 3); | |||||
| break; | |||||
| case BUTTON3_DOUBLE_CLICKED: | |||||
| _push_event(kk, CACA_EVENT_MOUSE_PRESS | 3); | |||||
| _push_event(kk, CACA_EVENT_MOUSE_RELEASE | 3); | |||||
| _push_event(kk, CACA_EVENT_MOUSE_PRESS | 3); | |||||
| _push_event(kk, CACA_EVENT_MOUSE_RELEASE | 3); | |||||
| break; | |||||
| case BUTTON3_TRIPLE_CLICKED: | |||||
| _push_event(kk, CACA_EVENT_MOUSE_PRESS | 3); | |||||
| _push_event(kk, CACA_EVENT_MOUSE_RELEASE | 3); | |||||
| _push_event(kk, CACA_EVENT_MOUSE_PRESS | 3); | |||||
| _push_event(kk, CACA_EVENT_MOUSE_RELEASE | 3); | |||||
| _push_event(kk, CACA_EVENT_MOUSE_PRESS | 3); | |||||
| _push_event(kk, CACA_EVENT_MOUSE_RELEASE | 3); | |||||
| break; | |||||
| case BUTTON3_RESERVED_EVENT: | |||||
| break; | |||||
| case BUTTON4_PRESSED: | |||||
| _push_event(kk, CACA_EVENT_MOUSE_PRESS | 4); | |||||
| break; | |||||
| case BUTTON4_RELEASED: | |||||
| _push_event(kk, CACA_EVENT_MOUSE_RELEASE | 4); | |||||
| break; | |||||
| case BUTTON4_CLICKED: | |||||
| _push_event(kk, CACA_EVENT_MOUSE_PRESS | 4); | |||||
| _push_event(kk, CACA_EVENT_MOUSE_RELEASE | 4); | |||||
| break; | |||||
| case BUTTON4_DOUBLE_CLICKED: | |||||
| _push_event(kk, CACA_EVENT_MOUSE_PRESS | 4); | |||||
| _push_event(kk, CACA_EVENT_MOUSE_RELEASE | 4); | |||||
| _push_event(kk, CACA_EVENT_MOUSE_PRESS | 4); | |||||
| _push_event(kk, CACA_EVENT_MOUSE_RELEASE | 4); | |||||
| break; | |||||
| case BUTTON4_TRIPLE_CLICKED: | |||||
| _push_event(kk, CACA_EVENT_MOUSE_PRESS | 4); | |||||
| _push_event(kk, CACA_EVENT_MOUSE_RELEASE | 4); | |||||
| _push_event(kk, CACA_EVENT_MOUSE_PRESS | 4); | |||||
| _push_event(kk, CACA_EVENT_MOUSE_RELEASE | 4); | |||||
| _push_event(kk, CACA_EVENT_MOUSE_PRESS | 4); | |||||
| _push_event(kk, CACA_EVENT_MOUSE_RELEASE | 4); | |||||
| break; | |||||
| case BUTTON4_RESERVED_EVENT: | |||||
| break; | |||||
| default: | |||||
| break; | |||||
| } | |||||
| if(kk->mouse_x == (unsigned int)mevent.x && | |||||
| kk->mouse_y == (unsigned int)mevent.y) | |||||
| return _pop_event(kk); | |||||
| kk->mouse_x = mevent.x; | |||||
| kk->mouse_y = mevent.y; | |||||
| return CACA_EVENT_MOUSE_MOTION | (kk->mouse_x << 12) | kk->mouse_y; | |||||
| } | |||||
| event = CACA_EVENT_KEY_PRESS; | |||||
| switch(intkey) | |||||
| { | |||||
| case KEY_UP: return event | CACA_KEY_UP; | |||||
| case KEY_DOWN: return event | CACA_KEY_DOWN; | |||||
| case KEY_LEFT: return event | CACA_KEY_LEFT; | |||||
| case KEY_RIGHT: return event | CACA_KEY_RIGHT; | |||||
| case KEY_IC: return event | CACA_KEY_INSERT; | |||||
| case KEY_DC: return event | CACA_KEY_DELETE; | |||||
| case KEY_HOME: return event | CACA_KEY_HOME; | |||||
| case KEY_END: return event | CACA_KEY_END; | |||||
| case KEY_PPAGE: return event | CACA_KEY_PAGEUP; | |||||
| case KEY_NPAGE: return event | CACA_KEY_PAGEDOWN; | |||||
| case KEY_F(1): return event | CACA_KEY_F1; | |||||
| case KEY_F(2): return event | CACA_KEY_F2; | |||||
| case KEY_F(3): return event | CACA_KEY_F3; | |||||
| case KEY_F(4): return event | CACA_KEY_F4; | |||||
| case KEY_F(5): return event | CACA_KEY_F5; | |||||
| case KEY_F(6): return event | CACA_KEY_F6; | |||||
| case KEY_F(7): return event | CACA_KEY_F7; | |||||
| case KEY_F(8): return event | CACA_KEY_F8; | |||||
| case KEY_F(9): return event | CACA_KEY_F9; | |||||
| case KEY_F(10): return event | CACA_KEY_F10; | |||||
| case KEY_F(11): return event | CACA_KEY_F11; | |||||
| case KEY_F(12): return event | CACA_KEY_F12; | |||||
| } | |||||
| return CACA_EVENT_NONE; | |||||
| } | |||||
| else | |||||
| #endif | |||||
| #if defined(USE_SLANG) | |||||
| if(kk->driver.driver == CACA_DRIVER_SLANG) | |||||
| { | |||||
| int intkey; | |||||
| if(kk->resize_event) | |||||
| { | |||||
| kk->resize_event = 0; | |||||
| kk->resize = 1; | |||||
| return CACA_EVENT_RESIZE; | |||||
| } | |||||
| if(!SLang_input_pending(0)) | |||||
| return CACA_EVENT_NONE; | |||||
| /* We first use SLang_getkey() to see whether Esc was pressed | |||||
| * alone, then (if it wasn't) we unget the key and use SLkp_getkey() | |||||
| * instead, so that escape sequences are interpreted. */ | |||||
| intkey = SLang_getkey(); | |||||
| if(intkey != 0x1b /* Esc */ || SLang_input_pending(0)) | |||||
| { | |||||
| SLang_ungetkey(intkey); | |||||
| intkey = SLkp_getkey(); | |||||
| } | |||||
| /* If the key was ASCII, return it immediately */ | |||||
| if(intkey < 0x100) | |||||
| { | |||||
| return CACA_EVENT_KEY_PRESS | intkey; | |||||
| } | |||||
| if(intkey == 0x3e9) | |||||
| { | |||||
| int button = (SLang_getkey() - ' ' + 1) & 0xf; | |||||
| unsigned int x = SLang_getkey() - '!'; | |||||
| unsigned int y = SLang_getkey() - '!'; | |||||
| _push_event(kk, CACA_EVENT_MOUSE_PRESS | button); | |||||
| _push_event(kk, CACA_EVENT_MOUSE_RELEASE | button); | |||||
| if(kk->mouse_x == x && kk->mouse_y == y) | |||||
| return _pop_event(kk); | |||||
| kk->mouse_x = x; | |||||
| kk->mouse_y = y; | |||||
| return CACA_EVENT_MOUSE_MOTION | (kk->mouse_x << 12) | kk->mouse_y; | |||||
| } | |||||
| event = CACA_EVENT_KEY_PRESS; | |||||
| switch(intkey) | |||||
| { | |||||
| case SL_KEY_UP: return event | CACA_KEY_UP; | |||||
| case SL_KEY_DOWN: return event | CACA_KEY_DOWN; | |||||
| case SL_KEY_LEFT: return event | CACA_KEY_LEFT; | |||||
| case SL_KEY_RIGHT: return event | CACA_KEY_RIGHT; | |||||
| case SL_KEY_IC: return event | CACA_KEY_INSERT; | |||||
| case SL_KEY_DELETE: return event | CACA_KEY_DELETE; | |||||
| case SL_KEY_HOME: return event | CACA_KEY_HOME; | |||||
| case SL_KEY_END: return event | CACA_KEY_END; | |||||
| case SL_KEY_PPAGE: return event | CACA_KEY_PAGEUP; | |||||
| case SL_KEY_NPAGE: return event | CACA_KEY_PAGEDOWN; | |||||
| case SL_KEY_F(1): return event | CACA_KEY_F1; | |||||
| case SL_KEY_F(2): return event | CACA_KEY_F2; | |||||
| case SL_KEY_F(3): return event | CACA_KEY_F3; | |||||
| case SL_KEY_F(4): return event | CACA_KEY_F4; | |||||
| case SL_KEY_F(5): return event | CACA_KEY_F5; | |||||
| case SL_KEY_F(6): return event | CACA_KEY_F6; | |||||
| case SL_KEY_F(7): return event | CACA_KEY_F7; | |||||
| case SL_KEY_F(8): return event | CACA_KEY_F8; | |||||
| case SL_KEY_F(9): return event | CACA_KEY_F9; | |||||
| case SL_KEY_F(10): return event | CACA_KEY_F10; | |||||
| case SL_KEY_F(11): return event | CACA_KEY_F11; | |||||
| case SL_KEY_F(12): return event | CACA_KEY_F12; | |||||
| } | |||||
| return CACA_EVENT_NONE; | |||||
| } | |||||
| else | |||||
| #endif | |||||
| #if defined(USE_CONIO) | |||||
| if(kk->driver.driver == CACA_DRIVER_CONIO) | |||||
| { | |||||
| if(!_conio_kbhit()) | |||||
| return CACA_EVENT_NONE; | |||||
| event = getch(); | |||||
| _push_event(kk, CACA_EVENT_KEY_RELEASE | event); | |||||
| return CACA_EVENT_KEY_PRESS | event; | |||||
| } | |||||
| else | |||||
| #endif | |||||
| #if defined(USE_WIN32) | |||||
| if(kk->driver.driver == CACA_DRIVER_WIN32) | |||||
| { | |||||
| INPUT_RECORD rec; | |||||
| DWORD num; | |||||
| for( ; ; ) | |||||
| { | |||||
| GetNumberOfConsoleInputEvents(kk->win32.hin, &num); | |||||
| if(num == 0) | |||||
| break; | |||||
| ReadConsoleInput(kk->win32.hin, &rec, 1, &num); | |||||
| if(rec.EventType == KEY_EVENT) | |||||
| { | |||||
| if(rec.Event.KeyEvent.bKeyDown) | |||||
| event = CACA_EVENT_KEY_PRESS; | |||||
| else | |||||
| event = CACA_EVENT_KEY_RELEASE; | |||||
| if(rec.Event.KeyEvent.uChar.AsciiChar) | |||||
| return event | rec.Event.KeyEvent.uChar.AsciiChar; | |||||
| } | |||||
| if(rec.EventType == MOUSE_EVENT) | |||||
| { | |||||
| if(rec.Event.MouseEvent.dwEventFlags == 0) | |||||
| { | |||||
| if(rec.Event.MouseEvent.dwButtonState & 0x01) | |||||
| return CACA_EVENT_MOUSE_PRESS | 0x000001; | |||||
| if(rec.Event.MouseEvent.dwButtonState & 0x02) | |||||
| return CACA_EVENT_MOUSE_PRESS | 0x000002; | |||||
| } | |||||
| else if(rec.Event.MouseEvent.dwEventFlags == MOUSE_MOVED) | |||||
| { | |||||
| COORD pos = rec.Event.MouseEvent.dwMousePosition; | |||||
| if(kk->mouse_x == (unsigned int)pos.X && | |||||
| kk->mouse_y == (unsigned int)pos.Y) | |||||
| continue; | |||||
| kk->mouse_x = pos.X; | |||||
| kk->mouse_y = pos.Y; | |||||
| return CACA_EVENT_MOUSE_MOTION | (kk->mouse_x << 12) | kk->mouse_y; | |||||
| } | |||||
| #if 0 | |||||
| else if(rec.Event.MouseEvent.dwEventFlags == DOUBLE_CLICK) | |||||
| { | |||||
| cout << rec.Event.MouseEvent.dwMousePosition.X << "," << | |||||
| rec.Event.MouseEvent.dwMousePosition.Y << " " << flush; | |||||
| } | |||||
| else if(rec.Event.MouseEvent.dwEventFlags == MOUSE_WHEELED) | |||||
| { | |||||
| SetConsoleCursorPosition(hOut, | |||||
| WheelWhere); | |||||
| if(rec.Event.MouseEvent.dwButtonState & 0xFF000000) | |||||
| cout << "Down" << flush; | |||||
| else | |||||
| cout << "Up " << flush; | |||||
| } | |||||
| #endif | |||||
| } | |||||
| /* Unknown event */ | |||||
| return CACA_EVENT_NONE; | |||||
| } | |||||
| /* No event */ | |||||
| return CACA_EVENT_NONE; | |||||
| } | |||||
| else | |||||
| #endif | |||||
| #if defined(USE_GL) | |||||
| if(kk->driver.driver == CACA_DRIVER_GL) | |||||
| { | |||||
| glutMainLoopEvent(); | |||||
| if(kk->gl.resized && !kk->resize) | |||||
| { | |||||
| kk->resize = 1; | |||||
| kk->gl.resized = 0; | |||||
| return CACA_EVENT_RESIZE; | |||||
| } | |||||
| if(kk->gl.mouse_changed) | |||||
| { | |||||
| if(kk->gl.mouse_clicked) | |||||
| { | |||||
| event|= CACA_EVENT_MOUSE_PRESS | kk->gl.mouse_button; | |||||
| kk->gl.mouse_clicked=0; | |||||
| } | |||||
| kk->mouse_x = kk->gl.mouse_x; | |||||
| kk->mouse_y = kk->gl.mouse_y; | |||||
| event |= CACA_EVENT_MOUSE_MOTION | (kk->mouse_x << 12) | kk->mouse_y; | |||||
| kk->gl.mouse_changed = 0; | |||||
| } | |||||
| if(kk->gl.key != 0) | |||||
| { | |||||
| event |= CACA_EVENT_KEY_PRESS; | |||||
| event |= kk->gl.key; | |||||
| kk->gl.key = 0; | |||||
| return event; | |||||
| } | |||||
| if(kk->gl.special_key != 0) | |||||
| { | |||||
| event |= CACA_EVENT_KEY_PRESS; | |||||
| switch(kk->gl.special_key) | |||||
| { | |||||
| case GLUT_KEY_F1 : kk->gl.special_key = 0; return event | CACA_KEY_F1; | |||||
| case GLUT_KEY_F2 : kk->gl.special_key = 0; return event | CACA_KEY_F2; | |||||
| case GLUT_KEY_F3 : kk->gl.special_key = 0; return event | CACA_KEY_F3; | |||||
| case GLUT_KEY_F4 : kk->gl.special_key = 0; return event | CACA_KEY_F4; | |||||
| case GLUT_KEY_F5 : kk->gl.special_key = 0; return event | CACA_KEY_F5; | |||||
| case GLUT_KEY_F6 : kk->gl.special_key = 0; return event | CACA_KEY_F6; | |||||
| case GLUT_KEY_F7 : kk->gl.special_key = 0; return event | CACA_KEY_F7; | |||||
| case GLUT_KEY_F8 : kk->gl.special_key = 0; return event | CACA_KEY_F8; | |||||
| case GLUT_KEY_F9 : kk->gl.special_key = 0; return event | CACA_KEY_F9; | |||||
| case GLUT_KEY_F10: kk->gl.special_key = 0; return event | CACA_KEY_F10; | |||||
| case GLUT_KEY_F11: kk->gl.special_key = 0; return event | CACA_KEY_F11; | |||||
| case GLUT_KEY_F12: kk->gl.special_key = 0; return event | CACA_KEY_F12; | |||||
| case GLUT_KEY_LEFT : kk->gl.special_key = 0; return event | CACA_KEY_LEFT; | |||||
| case GLUT_KEY_RIGHT: kk->gl.special_key = 0; return event | CACA_KEY_RIGHT; | |||||
| case GLUT_KEY_UP : kk->gl.special_key = 0; return event | CACA_KEY_UP; | |||||
| case GLUT_KEY_DOWN : kk->gl.special_key = 0; return event | CACA_KEY_DOWN; | |||||
| default: return CACA_EVENT_NONE; | |||||
| } | |||||
| } | |||||
| return CACA_EVENT_NONE; | |||||
| } | |||||
| else | |||||
| #endif | |||||
| { | |||||
| /* Dummy */ | |||||
| } | |||||
| return CACA_EVENT_NONE; | |||||
| return kk->driver.get_event(kk); | |||||
| } | } | ||||
| #if defined(USE_SLANG) || defined(USE_NCURSES) || defined(USE_CONIO) | #if defined(USE_SLANG) || defined(USE_NCURSES) || defined(USE_CONIO) | ||||
| static void _push_event(caca_t *kk, unsigned int event) | |||||
| void _push_event(caca_t *kk, unsigned int event) | |||||
| { | { | ||||
| if(!event || kk->events.queue == EVENTBUF_LEN) | if(!event || kk->events.queue == EVENTBUF_LEN) | ||||
| return; | return; | ||||
| @@ -786,7 +217,7 @@ static void _push_event(caca_t *kk, unsigned int event) | |||||
| kk->events.queue++; | kk->events.queue++; | ||||
| } | } | ||||
| static unsigned int _pop_event(caca_t *kk) | |||||
| unsigned int _pop_event(caca_t *kk) | |||||
| { | { | ||||
| int i; | int i; | ||||
| unsigned int event; | unsigned int event; | ||||