diff --git a/libvo/vo_ggi.c b/libvo/vo_ggi.c index 69d84fe053..0e9103e04d 100644 --- a/libvo/vo_ggi.c +++ b/libvo/vo_ggi.c @@ -35,6 +35,14 @@ #include +#ifdef HAVE_GGIWMH +#include +#endif + +#ifdef HAVE_GGIWMH +extern int vo_ontop; /* Window on top */ +#endif + /* maximum buffers */ #undef GGI_FLIP @@ -53,7 +61,6 @@ static struct ggi_conf_s { ggi_visual_t parentvis; ggi_visual_t vis; - ggi_mode gmode; /* source image format */ int srcwidth; @@ -78,6 +85,16 @@ static struct ggi_conf_s { } ggi_conf; +#ifdef HAVE_GGIWMH +static void window_ontop(void) +{ + mp_msg(MSGT_VO, MSGL_V, "[ggi] debug: window_ontop() called\n"); + ggiWmhZOrder(ggi_conf.parentvis, ZO_TOP); + return; +} +#endif + + static void set_graphtype(uint32_t format, ggi_mode *mode) { switch(format) @@ -117,9 +134,6 @@ static void set_graphtype(uint32_t format, ggi_mode *mode) static uint32_t config(uint32_t width, uint32_t height, uint32_t d_width, uint32_t d_height, uint32_t flags, char *title, uint32_t format) { - int i; - int rc; - ggi_mode mode = { 1, /* frames */ { 0, 0 }, /* top, left corner */ @@ -144,6 +158,10 @@ static uint32_t config(uint32_t width, uint32_t height, uint32_t d_width, printf("[ggi] mode: "); ggiPrintMode(&parentmode); printf("\n"); + + printf("[ggi] submode: "); + ggiPrintMode(&mode); + printf("\n"); #endif ggiCheckMode(ggi_conf.parentvis, &parentmode); @@ -166,13 +184,19 @@ static uint32_t config(uint32_t width, uint32_t height, uint32_t d_width, return(-1); } +#if 0 + printf("[ggi] mode: "); + ggiPrintMode(&parentmode); + printf("\n"); +#endif + /* calculate top, left corner */ mode.visible.x = (parentmode.virt.x - width) / 2; mode.visible.y = (parentmode.virt.y - height) / 2; /* calculate bottom, right corner */ - mode.virt.x = mode.visible.x + width; - mode.virt.y = mode.visible.y + height; + mode.virt.x = width; + mode.virt.y = height; ggiCheckMode(ggi_conf.vis, &mode); @@ -188,11 +212,13 @@ static uint32_t config(uint32_t width, uint32_t height, uint32_t d_width, return(-1); } - - ggi_conf.gmode = mode; +#ifdef HAVE_GGIWMH + ggiWmhSetTitle(ggi_conf.parentvis, title); + if (vo_ontop) window_ontop(); +#endif #if 0 - printf("[ggi] mode: "); + printf("[ggi] submode: "); ggiPrintMode(&mode); printf("\n"); #endif @@ -209,6 +235,9 @@ static uint32_t config(uint32_t width, uint32_t height, uint32_t d_width, ggi_conf.srcwidth = width; ggi_conf.srcheight = height; ggi_conf.srcformat = format; + + ggi_conf.dstwidth = mode.virt.x; + ggi_conf.dstheight = mode.virt.y; ggi_conf.voflags = flags; @@ -228,9 +257,6 @@ static uint32_t config(uint32_t width, uint32_t height, uint32_t d_width, return(-1); } - vo_dwidth = ggi_conf.dstwidth = ggi_conf.gmode.virt.x; - vo_dheight = ggi_conf.dstheight = ggi_conf.gmode.virt.y; - ggiSetFlags(ggi_conf.vis, GGIFLAG_ASYNC); if (GT_SCHEME(mode.graphtype) == GT_PALETTE) @@ -315,8 +341,9 @@ static void flip_page(void) ggiFlushRegion(ggi_conf.vis, ggi_conf.flushregion.x1, ggi_conf.flushregion.y1, ggi_conf.flushregion.x2 - ggi_conf.flushregion.x1, ggi_conf.flushregion.y2 - ggi_conf.flushregion.y1); - ggi_conf.flushregion.x1 = ggi_conf.flushregion.x2 = ggi_conf.dstwidth / 2; - ggi_conf.flushregion.y1 = ggi_conf.flushregion.y2 = ggi_conf.dstheight / 2; + + ggi_conf.flushregion.x1 = ggi_conf.flushregion.x2 = -1; + ggi_conf.flushregion.y1 = ggi_conf.flushregion.y2 = -1; } static uint32_t draw_slice(uint8_t *src[], int stride[], int w, int h, @@ -324,13 +351,13 @@ static uint32_t draw_slice(uint8_t *src[], int stride[], int w, int h, { ggiPutBox(ggi_conf.vis, x, y, w, h, src[0]); - if (x < ggi_conf.flushregion.x1) + if ((ggi_conf.flushregion.x1 == -1) || (x < ggi_conf.flushregion.x1)) ggi_conf.flushregion.x1 = x; - if (y < ggi_conf.flushregion.y1) + if ((ggi_conf.flushregion.y1 == -1) || (y < ggi_conf.flushregion.y1)) ggi_conf.flushregion.y1 = y; - if ((x + w) > ggi_conf.flushregion.x2) + if ((ggi_conf.flushregion.x2 == -1) || ((x + w) > ggi_conf.flushregion.x2)) ggi_conf.flushregion.x2 = x + w; - if ((y + h) > ggi_conf.flushregion.y2) + if ((ggi_conf.flushregion.y2 == -1) || ((y + h) > ggi_conf.flushregion.y2)) ggi_conf.flushregion.y2 = y + h; return(1); @@ -380,6 +407,14 @@ static uint32_t preinit(const char *arg) return(-1); } +#ifdef HAVE_GGIWMH + if (ggiWmhInit() < 0) + { + mp_msg(MSGT_VO, MSGL_FATAL, "[ggi] unable to initialize libggiwmh\n"); + return(-1); + } +#endif + if ((char *)arg) { int i = 0; @@ -410,6 +445,10 @@ static uint32_t preinit(const char *arg) return(-1); } +#ifdef HAVE_GGIWMH + ggiWmhAttach(ggi_conf.parentvis); +#endif + mp_msg(MSGT_VO, MSGL_V, "[ggi] using '%s' output\n", (ggi_conf.driver == NULL) ? "default" : ggi_conf.driver); @@ -421,6 +460,12 @@ static void uninit(void) { if (ggi_conf.driver) free(ggi_conf.driver); + +#ifdef HAVE_GGIWMH + ggiWmhDetach(ggi_conf.parentvis); + ggiWmhExit(); +#endif + ggiClose(ggi_conf.vis); ggiClose(ggi_conf.parentvis); ggiExit(); @@ -434,6 +479,12 @@ static uint32_t control(uint32_t request, void *data, ...) return query_format(*((uint32_t*)data)); case VOCTRL_GET_IMAGE: return get_image(data); +#ifdef HAVE_GGIWMH + case VOCTRL_ONTOP: + vo_ontop = (!(vo_ontop)); + window_ontop(); + return VO_TRUE; +#endif } return VO_NOTIMPL; }