Index: configure
===================================================================
--- configure	(revision 22963)
+++ configure	(working copy)
@@ -4218,7 +4218,7 @@
 fi
 if test "$_ggi" = yes ; then
   _def_ggi='#define HAVE_GGI 1'
-  _libs_mplayer="$_libs_mplayer -lggi"
+  _libs_mplayer="$_libs_mplayer -lggi -lgii -lgg"
   _vosrc="$_vosrc vo_ggi.c"
   _vomodules="ggi $_vomodules"
 else
Index: libvo/vo_ggi.c
===================================================================
--- libvo/vo_ggi.c	(revision 22963)
+++ libvo/vo_ggi.c	(working copy)
@@ -29,6 +29,9 @@
 #include "mp_fifo.h"
 
 #include <ggi/ggi.h>
+#include <ggi/gii.h>
+#include <ggi/gii-keyboard.h>
+#include <ggi/gg.h>
 
 #ifdef HAVE_GGIWMH
 #include <ggi/wmh.h>
@@ -75,7 +78,7 @@
 static void window_ontop(void)
 {
     mp_msg(MSGT_VO, MSGL_V, "[ggi] debug: window_ontop() called\n");
-    ggiWmhZOrder(ggi_conf.vis, ZO_TOP);
+    ggiWmhZOrder(ggi_conf.vis, GGI_WMH_ZO_TOP);
     return;
 }
 #endif
@@ -122,7 +125,8 @@
 {
     ggi_mode mode = {
         1,                      /* frames */
-        {width, height},        /* visible */
+//        {width, height},        /* visible */
+        {d_width, d_height},        /* visible */
         {GGI_AUTO, GGI_AUTO},   /* virt */
         {GGI_AUTO, GGI_AUTO},   /* size */
         GT_AUTO,                /* graphtype */
@@ -173,14 +177,24 @@
         ggiSetColorfulPalette(ggi_conf.vis);
 
     if (GT_SCHEME(mode.graphtype) != GT_TRUECOLOR) {
+        int err;
         ggi_mode drawmode;
 
-        ggi_conf.drawvis = ggiOpen("display-memory", NULL);
+        ggi_conf.drawvis = ggNewStem(libggi, NULL);
         if (ggi_conf.drawvis == NULL) {
+            mp_msg(MSGT_VO, MSGL_FATAL,
+                   "[ggi] unable to create secondary stem with libggi\n");
+            return -1;
+        }
+
+        err = ggiOpen(ggi_conf.drawvis, "display-memory", NULL);
+        if (err < 0) {
             mp_msg(MSGT_VO, MSGL_ERR,
                    "[ggi] unable to get backbuffer for conversion\n");
+            ggDelStem(ggi_conf.drawvis);
             return -1;
         }
+
         memcpy(&drawmode, &mode, sizeof(ggi_mode));
         drawmode.graphtype = GT_32BIT;
         drawmode.size.x = GGI_AUTO;
@@ -392,16 +406,7 @@
 
 static int preinit(const char *arg)
 {
-    if (ggiInit() != 0) {
-        mp_msg(MSGT_VO, MSGL_FATAL, "[ggi] unable to initialize GGI\n");
-        return (-1);
-    }
-#ifdef HAVE_GGIWMH
-    if (ggiWmhInit() < 0) {
-        mp_msg(MSGT_VO, MSGL_FATAL, "[ggi] unable to initialize libggiwmh\n");
-        return (-1);
-    }
-#endif
+    int err;
 
     if (arg) {
         int i = 0;
@@ -415,8 +420,28 @@
         ggi_conf.driver = NULL;
     }
 
-    ggi_conf.vis = ggiOpen(ggi_conf.driver);
+    ggi_conf.vis = ggNewStem(libgii, libggi, NULL);
     if (ggi_conf.vis == NULL) {
+        mp_msg(MSGT_VO, MSGL_FATAL, "[ggi] unable to create a stem with libgii and libggi\n");
+        return (-1);
+    }
+
+#ifdef HAVE_GGIWMH
+    if (ggiWmhInit() < 0) {
+        mp_msg(MSGT_VO, MSGL_FATAL, "[ggi] unable to initialize libggiwmh\n");
+        return (-1);
+    }
+
+    err = ggiWmhAttach(ggi_conf.vis);
+    if (err < 0) {
+        /* XXX libggiwmh is optional. So disable it in case of failure */
+        mp_msg(MSGT_VO, MSGL_FATAL, "[ggi] unable to attach libggiwmh on stem\n");
+        return (-1);
+    }
+#endif
+
+    err = ggiOpen(ggi_conf.vis, ggi_conf.driver, NULL);
+    if (err != 0) {
         mp_msg(MSGT_VO, MSGL_FATAL, "[ggi] unable to open '%s' output\n",
                (ggi_conf.driver == NULL) ? "default" : ggi_conf.driver);
         ggiExit();
@@ -425,11 +450,6 @@
     ggi_conf.drawvis = ggi_conf.vis;
 
 
-#ifdef HAVE_GGIWMH
-    ggiWmhAttach(ggi_conf.vis);
-#endif
-
-
     mp_msg(MSGT_VO, MSGL_V, "[ggi] using '%s' output\n",
           (ggi_conf.driver == NULL) ? "default" : ggi_conf.driver);
 
@@ -438,19 +458,26 @@
 
 static void uninit(void)
 {
+    int err;
+
     if (ggi_conf.driver)
         free(ggi_conf.driver);
 
+    fprintf(stderr, "uninit: ggiClose()\n");
+    ggiClose(ggi_conf.vis);
+
+
+    if (ggi_conf.drawvis != NULL && ggi_conf.drawvis != ggi_conf.vis) {
+        ggiClose(ggi_conf.drawvis);
+        ggDelStem(ggi_conf.drawvis);
+    }
+
+    ggDelStem(ggi_conf.vis);
+
 #ifdef HAVE_GGIWMH
-    ggiWmhDetach(ggi_conf.vis);
     ggiWmhExit();
 #endif
 
-    if (ggi_conf.drawvis != NULL && ggi_conf.drawvis != ggi_conf.vis)
-        ggiClose(ggi_conf.drawvis);
-
-    ggiClose(ggi_conf.vis);
-    ggiExit();
 }
 
 static int control(uint32_t request, void *data, ...)
@@ -476,11 +503,11 @@
 static void check_events(void)
 {
     struct timeval  tv = {0, 0};
-    ggi_event       event;
-    ggi_event_mask  mask;
+    gii_event       event;
+    gii_event_mask  mask;
 
-    if ((mask = ggiEventPoll(ggi_conf.vis, emAll, &tv))) {
-        if (ggiEventRead(ggi_conf.vis, &event, emAll) != 0) {
+    if ((mask = giiEventPoll(ggi_conf.vis, emAll, &tv))) {
+        if (giiEventRead(ggi_conf.vis, &event, emAll) != 0) {
             mp_dbg(MSGT_VO, MSGL_DBG3,
                    "type: %4x, origin: %4x, "
                    "sym: %4x, label: %4x, button=%4x\n",
