@@ -119,6 +119,7 @@ struct caca_context | |||
unsigned int (* get_window_height) (caca_t *); | |||
void (* display) (caca_t *); | |||
void (* handle_resize) (caca_t *, unsigned int *, unsigned int *); | |||
unsigned int (* get_event) (caca_t *); | |||
} driver; | |||
//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; | |||
} | |||
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 | |||
*/ | |||
@@ -135,6 +147,7 @@ void conio_init_driver(caca_t *kk) | |||
kk->driver.get_window_height = conio_get_window_height; | |||
kk->driver.display = conio_display; | |||
kk->driver.handle_resize = conio_handle_resize; | |||
kk->driver.get_event = conio_get_event; | |||
} | |||
#endif /* USE_CONIO */ | |||
@@ -292,6 +292,68 @@ static void gl_handle_resize(caca_t *kk, unsigned int *new_width, | |||
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 | |||
*/ | |||
@@ -361,6 +423,7 @@ void gl_init_driver(caca_t *kk) | |||
kk->driver.get_window_height = gl_get_window_height; | |||
kk->driver.display = gl_display; | |||
kk->driver.handle_resize = gl_handle_resize; | |||
kk->driver.get_event = gl_get_event; | |||
} | |||
#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 | |||
*/ | |||
@@ -236,6 +419,7 @@ void ncurses_init_driver(caca_t *kk) | |||
kk->driver.get_window_height = ncurses_get_window_height; | |||
kk->driver.display = ncurses_display; | |||
kk->driver.handle_resize = ncurses_handle_resize; | |||
kk->driver.get_event = ncurses_get_event; | |||
} | |||
#endif /* USE_NCURSES */ | |||
@@ -245,6 +245,88 @@ static void slang_handle_resize(caca_t *kk, unsigned int *new_width, | |||
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 | |||
*/ | |||
@@ -316,6 +398,7 @@ void slang_init_driver(caca_t *kk) | |||
kk->driver.get_window_height = slang_get_window_height; | |||
kk->driver.display = slang_display; | |||
kk->driver.handle_resize = slang_handle_resize; | |||
kk->driver.get_event = slang_get_event; | |||
} | |||
#endif /* USE_SLANG */ | |||
@@ -216,6 +216,80 @@ static void win32_handle_resize(caca_t *kk, unsigned int *new_width, | |||
*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 | |||
*/ | |||
@@ -231,6 +305,7 @@ void win32_init_driver(caca_t *kk) | |||
kk->driver.get_window_height = win32_get_window_height; | |||
kk->driver.display = win32_display; | |||
kk->driver.handle_resize = win32_handle_resize; | |||
kk->driver.get_event = win32_get_event; | |||
} | |||
#endif /* USE_WIN32 */ | |||
@@ -22,6 +22,8 @@ | |||
#if defined(USE_X11) | |||
#include <X11/Xlib.h> | |||
#include <X11/Xutil.h> | |||
#include <X11/keysym.h> | |||
#if defined(HAVE_X11_XKBLIB_H) | |||
# include <X11/XKBlib.h> | |||
#endif | |||
@@ -162,9 +164,9 @@ static int x11_init_graphics(caca_t *kk) | |||
for(;;) | |||
{ | |||
XEvent event; | |||
XNextEvent(kk->x11.dpy, &event); | |||
if (event.type == MapNotify) | |||
XEvent xevent; | |||
XNextEvent(kk->x11.dpy, &xevent); | |||
if (xevent.type == MapNotify) | |||
break; | |||
} | |||
@@ -311,11 +313,126 @@ static void x11_handle_resize(caca_t *kk, unsigned int *new_width, | |||
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 | |||
*/ | |||
static int x11_error_handler(Display *dpy, XErrorEvent *event) | |||
static int x11_error_handler(Display *dpy, XErrorEvent *xevent) | |||
{ | |||
/* Ignore the error */ | |||
return 0; | |||
@@ -336,6 +453,7 @@ void x11_init_driver(caca_t *kk) | |||
kk->driver.get_window_height = x11_get_window_height; | |||
kk->driver.display = x11_display; | |||
kk->driver.handle_resize = x11_handle_resize; | |||
kk->driver.get_event = x11_get_event; | |||
} | |||
#endif /* USE_X11 */ | |||
@@ -19,37 +19,6 @@ | |||
#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_internals.h" | |||
#include "caca.h" | |||
@@ -58,8 +27,8 @@ | |||
static unsigned int _get_next_event(caca_t *); | |||
static unsigned int _lowlevel_event(caca_t *); | |||
#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 | |||
#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) | |||
{ | |||
unsigned int event; | |||
#if defined(USE_SLANG) || defined(USE_NCURSES) || defined(USE_CONIO) | |||
event = _pop_event(kk); | |||
unsigned int event = _pop_event(kk); | |||
if(event) | |||
return event; | |||
#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) | |||
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) | |||
return; | |||
@@ -786,7 +217,7 @@ static void _push_event(caca_t *kk, unsigned int event) | |||
kk->events.queue++; | |||
} | |||
static unsigned int _pop_event(caca_t *kk) | |||
unsigned int _pop_event(caca_t *kk) | |||
{ | |||
int i; | |||
unsigned int event; | |||