@@ -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; | ||||