Kaynağa Gözat

* Fixed async issues between the driver and libcaca when resizing windows,

and simplified the handle_resize() API. Still can be polished.
tags/v0.99.beta14
Sam Hocevar sam 19 yıl önce
ebeveyn
işleme
da30961a0e
11 değiştirilmiş dosya ile 71 ekleme ve 93 silme
  1. +3
    -2
      caca/caca.c
  2. +7
    -3
      caca/caca_internals.h
  3. +4
    -4
      caca/driver_conio.c
  4. +8
    -15
      caca/driver_gl.c
  5. +11
    -17
      caca/driver_ncurses.c
  6. +5
    -13
      caca/driver_slang.c
  7. +4
    -5
      caca/driver_win32.c
  8. +11
    -22
      caca/driver_x11.c
  9. +8
    -0
      caca/event.c
  10. +9
    -11
      caca/graphics.c
  11. +1
    -1
      cucul/cucul.c

+ 3
- 2
caca/caca.c Dosyayı Görüntüle

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


+ 7
- 3
caca/caca_internals.h Dosyayı Görüntüle

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


+ 4
- 4
caca/driver_conio.c Dosyayı Görüntüle

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


+ 8
- 15
caca/driver_gl.c Dosyayı Görüntüle

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


+ 11
- 17
caca/driver_ncurses.c Dosyayı Görüntüle

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


+ 5
- 13
caca/driver_slang.c Dosyayı Görüntüle

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


+ 4
- 5
caca/driver_win32.c Dosyayı Görüntüle

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


+ 11
- 22
caca/driver_x11.c Dosyayı Görüntüle

@@ -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 */


+ 8
- 0
caca/event.c Dosyayı Görüntüle

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


+ 9
- 11
caca/graphics.c Dosyayı Görüntüle

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


+ 1
- 1
cucul/cucul.c Dosyayı Görüntüle

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


Yükleniyor…
İptal
Kaydet