and simplified the handle_resize() API. Still can be polished.tags/v0.99.beta14
@@ -79,11 +79,12 @@ caca_t * caca_attach(cucul_t * qq) | |||
kk->timer.last_usec = 0; | |||
kk->lastticks = 0; | |||
/* Mouse position */ | |||
kk->mouse.x = kk->qq->width / 2; | |||
kk->mouse.y = kk->qq->height / 2; | |||
kk->resize = 0; | |||
kk->resize_event = 0; | |||
/* Resize events */ | |||
kk->resize.resized = 0; | |||
return kk; | |||
} | |||
@@ -101,7 +101,7 @@ struct caca_context | |||
unsigned int (* get_window_width) (caca_t *); | |||
unsigned int (* get_window_height) (caca_t *); | |||
void (* display) (caca_t *); | |||
void (* handle_resize) (caca_t *, unsigned int *, unsigned int *); | |||
void (* handle_resize) (caca_t *); | |||
unsigned int (* get_event) (caca_t *); | |||
} drv; | |||
@@ -112,8 +112,12 @@ struct caca_context | |||
} mouse; | |||
/* Window resize handling */ | |||
int resize; | |||
int resize_event; | |||
struct resize | |||
{ | |||
int resized; /* A resize event was requested */ | |||
//int acked; /* The event has been acknowledged by the user */ | |||
unsigned w, h; /* Requested width and height */ | |||
} resize; | |||
/* Framerate handling */ | |||
unsigned int delay, rendertime; | |||
@@ -113,11 +113,11 @@ static void conio_display(caca_t *kk) | |||
# endif | |||
} | |||
static void conio_handle_resize(caca_t *kk, unsigned int *new_width, | |||
unsigned int *new_height) | |||
static void conio_handle_resize(caca_t *kk) | |||
{ | |||
*new_width = kk->qq->width; | |||
*new_height = kk->qq->height; | |||
/* We know nothing about our window */ | |||
kk->resize.w = kk->qq->width; | |||
kk->resize.h = kk->qq->height; | |||
} | |||
static unsigned int conio_get_event(caca_t *kk) | |||
@@ -75,18 +75,17 @@ struct driver_private | |||
{ | |||
int window; | |||
unsigned int width, height; | |||
unsigned int new_width, new_height; | |||
float font_width, font_height; | |||
float incx, incy; | |||
int id[94]; | |||
unsigned char resized, bit; | |||
unsigned char bit; | |||
unsigned char mouse_changed, mouse_clicked; | |||
unsigned int mouse_x, mouse_y; | |||
unsigned int mouse_button, mouse_state; | |||
unsigned char key; | |||
int special_key; | |||
int new_width; | |||
int new_height; | |||
float sw, sh; | |||
}; | |||
@@ -117,7 +116,6 @@ static int gl_init_graphics(caca_t *kk) | |||
kk->drv.p->width = kk->qq->width * kk->drv.p->font_width; | |||
kk->drv.p->height = kk->qq->height * kk->drv.p->font_height; | |||
kk->drv.p->resized = 0; | |||
kk->drv.p->bit = 0; | |||
kk->drv.p->mouse_changed = kk->drv.p->mouse_clicked = 0; | |||
@@ -293,15 +291,11 @@ static void gl_display(caca_t *kk) | |||
glutPostRedisplay(); | |||
} | |||
static void gl_handle_resize(caca_t *kk, unsigned int *new_width, | |||
unsigned int *new_height) | |||
static void gl_handle_resize(caca_t *kk) | |||
{ | |||
kk->drv.p->width = kk->drv.p->new_width; | |||
kk->drv.p->height = kk->drv.p->new_height; | |||
*new_width = kk->drv.p->width / kk->drv.p->font_width; | |||
*new_height = (kk->drv.p->height / kk->drv.p->font_height) + 1; | |||
glMatrixMode(GL_PROJECTION); | |||
glPushMatrix(); | |||
glLoadIdentity(); | |||
@@ -317,12 +311,8 @@ static unsigned int gl_get_event(caca_t *kk) | |||
glutMainLoopEvent(); | |||
if(kk->drv.p->resized && !kk->resize) | |||
{ | |||
kk->resize = 1; | |||
kk->drv.p->resized = 0; | |||
if(kk->resize.resized) | |||
return CACA_EVENT_RESIZE; | |||
} | |||
if(kk->drv.p->mouse_changed) | |||
{ | |||
@@ -400,7 +390,10 @@ static void gl_handle_reshape(int w, int h) | |||
kk->drv.p->new_width = w; | |||
kk->drv.p->new_height = h; | |||
kk->drv.p->resized = 1; | |||
kk->resize.w = w / kk->drv.p->font_width; | |||
kk->resize.h = (h / kk->drv.p->font_height) + 1; | |||
kk->resize.resized = 1; | |||
} | |||
else | |||
kk->drv.p->bit = 1; | |||
@@ -199,25 +199,26 @@ static void ncurses_display(caca_t *kk) | |||
refresh(); | |||
} | |||
static void ncurses_handle_resize(caca_t *kk, unsigned int *new_width, | |||
unsigned int *new_height) | |||
static void ncurses_handle_resize(caca_t *kk) | |||
{ | |||
struct winsize size; | |||
*new_width = kk->qq->width; | |||
*new_height = kk->qq->height; | |||
if(ioctl(fileno(stdout), TIOCGWINSZ, &size) == 0) | |||
{ | |||
*new_width = size.ws_col; | |||
*new_height = size.ws_row; | |||
kk->resize.w = size.ws_col; | |||
kk->resize.h = size.ws_row; | |||
#if defined(HAVE_RESIZE_TERM) | |||
resize_term(*new_height, *new_width); | |||
resize_term(kk->resize.h, kk->resize.w); | |||
#else | |||
resizeterm(*new_height, *new_width); | |||
resizeterm(*kk->resize.h, *kk->resize.w); | |||
#endif | |||
wrefresh(curscr); | |||
return; | |||
} | |||
/* Fallback */ | |||
kk->resize.w = kk->qq->width; | |||
kk->resize.h = kk->qq->height; | |||
} | |||
static unsigned int ncurses_get_event(caca_t *kk) | |||
@@ -225,13 +226,6 @@ 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; | |||
@@ -410,7 +404,7 @@ static unsigned int ncurses_get_event(caca_t *kk) | |||
#if defined(HAVE_SIGNAL) | |||
static RETSIGTYPE sigwinch_handler(int sig) | |||
{ | |||
sigwinch_kk->resize_event = 1; | |||
sigwinch_kk->resize.resized = 1; | |||
signal(SIGWINCH, sigwinch_handler);; | |||
} | |||
@@ -236,14 +236,13 @@ static void slang_display(caca_t *kk) | |||
SLsmg_refresh(); | |||
} | |||
static void slang_handle_resize(caca_t *kk, unsigned int *new_width, | |||
unsigned int *new_height) | |||
static void slang_handle_resize(caca_t *kk) | |||
{ | |||
SLtt_get_screen_size(); | |||
*new_width = SLtt_Screen_Cols; | |||
*new_height = SLtt_Screen_Rows; | |||
kk->resize.w = SLtt_Screen_Cols; | |||
kk->resize.h = SLtt_Screen_Rows; | |||
if(*new_width != kk->qq->width || *new_height != kk->qq->height) | |||
if(kk->resize.w != kk->qq->width || kk->resize.h != kk->qq->height) | |||
SLsmg_reinit_smg(); | |||
} | |||
@@ -252,13 +251,6 @@ 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; | |||
@@ -379,7 +371,7 @@ static void slang_init_palette(void) | |||
#if defined(HAVE_SIGNAL) | |||
static RETSIGTYPE sigwinch_handler(int sig) | |||
{ | |||
sigwinch_kk->resize_event = 1; | |||
sigwinch_kk->resize.resized = 1; | |||
signal(SIGWINCH, sigwinch_handler);; | |||
} | |||
@@ -214,12 +214,11 @@ static void win32_display(caca_t *kk) | |||
WriteConsoleOutput(kk->drv.p->front, kk->drv.p->buffer, size, pos, &rect); | |||
} | |||
static void win32_handle_resize(caca_t *kk, unsigned int *new_width, | |||
unsigned int *new_height) | |||
static void win32_handle_resize(caca_t *kk) | |||
{ | |||
/* Nothing to do here. */ | |||
*new_width = kk->qq->width; | |||
*new_height = kk->qq->height; | |||
/* FIXME: I don't know what to do here. */ | |||
kk->resize.w = kk->qq->width; | |||
kk->resize.h = kk->qq->height; | |||
} | |||
static unsigned int win32_get_event(caca_t *kk) | |||
@@ -49,7 +49,6 @@ struct driver_private | |||
GC gc; | |||
long int event_mask; | |||
int font_width, font_height; | |||
unsigned int new_width, new_height; | |||
int colors[16]; | |||
Font font; | |||
XFontStruct *font_struct; | |||
@@ -206,8 +205,6 @@ static int x11_init_graphics(caca_t *kk) | |||
DefaultDepth(kk->drv.p->dpy, | |||
DefaultScreen(kk->drv.p->dpy))); | |||
kk->drv.p->new_width = kk->drv.p->new_height = 0; | |||
return 0; | |||
} | |||
@@ -310,22 +307,19 @@ static void x11_display(caca_t *kk) | |||
XFlush(kk->drv.p->dpy); | |||
} | |||
static void x11_handle_resize(caca_t *kk, unsigned int *new_width, | |||
unsigned int *new_height) | |||
static void x11_handle_resize(caca_t *kk) | |||
{ | |||
Pixmap new_pixmap; | |||
*new_width = kk->drv.p->new_width; | |||
*new_height = kk->drv.p->new_height; | |||
new_pixmap = XCreatePixmap(kk->drv.p->dpy, kk->drv.p->window, | |||
kk->qq->width * kk->drv.p->font_width, | |||
kk->qq->height * kk->drv.p->font_height, | |||
kk->resize.w * kk->drv.p->font_width, | |||
kk->resize.h * kk->drv.p->font_height, | |||
DefaultDepth(kk->drv.p->dpy, | |||
DefaultScreen(kk->drv.p->dpy))); | |||
XCopyArea(kk->drv.p->dpy, kk->drv.p->pixmap, new_pixmap, kk->drv.p->gc, 0, 0, | |||
kk->qq->width * kk->drv.p->font_width, | |||
kk->qq->height * kk->drv.p->font_height, 0, 0); | |||
XCopyArea(kk->drv.p->dpy, kk->drv.p->pixmap, new_pixmap, | |||
kk->drv.p->gc, 0, 0, | |||
kk->resize.w * kk->drv.p->font_width, | |||
kk->resize.h * kk->drv.p->font_height, 0, 0); | |||
XFreePixmap(kk->drv.p->dpy, kk->drv.p->pixmap); | |||
kk->drv.p->pixmap = new_pixmap; | |||
} | |||
@@ -364,16 +358,11 @@ static unsigned int x11_get_event(caca_t *kk) | |||
if(!w || !h || (w == kk->qq->width && h == kk->qq->height)) | |||
continue; | |||
kk->drv.p->new_width = w; | |||
kk->drv.p->new_height = h; | |||
kk->resize.w = w; | |||
kk->resize.h = h; | |||
kk->resize.resized = 1; | |||
/* If we are already resizing, ignore the new signal */ | |||
if(kk->resize) | |||
continue; | |||
kk->resize = 1; | |||
return CACA_EVENT_RESIZE; | |||
continue; | |||
} | |||
/* Check for mouse motion events */ | |||
@@ -137,6 +137,14 @@ static unsigned int _get_next_event(caca_t *kk) | |||
#endif | |||
unsigned int event; | |||
/* If we are about to return a resize event, acknowledge it */ | |||
if(kk->resize.resized) | |||
{ | |||
kk->resize.resized = 0; | |||
_caca_handle_resize(kk); | |||
return CACA_EVENT_RESIZE; | |||
} | |||
event = _lowlevel_event(kk); | |||
#if defined(USE_SLANG) | |||
@@ -35,7 +35,7 @@ | |||
/* | |||
* Local functions | |||
*/ | |||
static void caca_handle_resize(caca_t *kk); | |||
void _caca_handle_resize(caca_t *kk); | |||
/** \brief Set the window title. | |||
* | |||
@@ -130,11 +130,11 @@ void caca_display(caca_t *kk) | |||
kk->drv.display(kk); | |||
/* FIXME handle this somewhere else */ | |||
if(kk->resize) | |||
/* Once the display is finished, we can ack resizes */ | |||
if(kk->resize.resized) | |||
{ | |||
kk->resize = 0; | |||
caca_handle_resize(kk); | |||
kk->resize.resized = 0; | |||
_caca_handle_resize(kk); | |||
} | |||
/* Wait until kk->delay + time of last call */ | |||
@@ -160,14 +160,12 @@ void caca_display(caca_t *kk) | |||
* XXX: following functions are local | |||
*/ | |||
static void caca_handle_resize(caca_t *kk) | |||
void _caca_handle_resize(caca_t *kk) | |||
{ | |||
unsigned int new_width, new_height; | |||
kk->drv.handle_resize(kk, &new_width, &new_height); | |||
kk->drv.handle_resize(kk); | |||
/* Tell libcucul we changed size */ | |||
if(new_width != kk->qq->width || new_height != kk->qq->height) | |||
cucul_set_size(kk->qq, new_width, new_height); | |||
if(kk->resize.w != kk->qq->width || kk->resize.h != kk->qq->height) | |||
_cucul_set_size(kk->qq, kk->resize.w, kk->resize.h); | |||
} | |||
@@ -96,7 +96,7 @@ void cucul_set_size(cucul_t *qq, unsigned int width, unsigned int height) | |||
if(qq->refcount) | |||
return; | |||
cucul_set_size_internal(qq, width, height); | |||
_cucul_set_size(qq, width, height); | |||
} | |||
/** \brief Get the canvas width. | |||