support app icon by reusing x11 sdl code
[sdl_omap.git] / src / video / omapdss / linux / xenv.c
index 40bf92c..5a81cc7 100644 (file)
@@ -58,12 +58,16 @@ struct xstuff {
        FPTR(XPending);
        FPTR(XLookupKeysym);
        FPTR(XkbSetDetectableAutoRepeat);
+       FPTR(XkbKeycodeToKeysym);
        FPTR(XStoreName);
        FPTR(XIconifyWindow);
        FPTR(XMoveResizeWindow);
        FPTR(XInternAtom);
+       FPTR(XAllocWMHints);
+       FPTR(XGetWMHints);
        FPTR(XSetWMHints);
        FPTR(XSync);
+       FPTR(XFree);
 };
 
 static struct xstuff g_xstuff;
@@ -117,12 +121,16 @@ static int x11h_init(int *xenv_flags, const char *window_title)
        FPTR_LINK(g_xstuff, x11lib, XPending);
        FPTR_LINK(g_xstuff, x11lib, XLookupKeysym);
        FPTR_LINK(g_xstuff, x11lib, XkbSetDetectableAutoRepeat);
+       FPTR_LINK(g_xstuff, x11lib, XkbKeycodeToKeysym);
        FPTR_LINK(g_xstuff, x11lib, XStoreName);
        FPTR_LINK(g_xstuff, x11lib, XIconifyWindow);
        FPTR_LINK(g_xstuff, x11lib, XMoveResizeWindow);
        FPTR_LINK(g_xstuff, x11lib, XInternAtom);
+       FPTR_LINK(g_xstuff, x11lib, XAllocWMHints);
+       FPTR_LINK(g_xstuff, x11lib, XGetWMHints);
        FPTR_LINK(g_xstuff, x11lib, XSetWMHints);
        FPTR_LINK(g_xstuff, x11lib, XSync);
+       FPTR_LINK(g_xstuff, x11lib, XFree);
 
        //XInitThreads();
 
@@ -259,7 +267,7 @@ static int x11h_minimize(void)
        Window window = g_xstuff.window;
        int screen = DefaultScreen(g_xstuff.display);
        int display_width, display_height;
-       XWMHints wm_hints;
+       XWMHints *wm_hints;
        XEvent evt;
 
        g_xstuff.pXWithdrawWindow(display, window, screen);
@@ -268,9 +276,16 @@ static int x11h_minimize(void)
        g_xstuff.pXChangeWindowAttributes(display, window,
                CWOverrideRedirect, &attributes);
 
-       wm_hints.flags = StateHint;
-       wm_hints.initial_state = IconicState;
-       g_xstuff.pXSetWMHints(display, window, &wm_hints);
+       wm_hints = g_xstuff.pXGetWMHints(display, window);
+       if (wm_hints == NULL) {
+               wm_hints = XAllocWMHints();
+               wm_hints->flags = 0;
+       }
+       wm_hints->flags |= StateHint;
+       wm_hints->initial_state = IconicState;
+       g_xstuff.pXSetWMHints(display, window, wm_hints);
+       g_xstuff.pXFree(wm_hints);
+       wm_hints = NULL;
 
        g_xstuff.pXMapWindow(display, window);
 
@@ -424,6 +439,29 @@ int xenv_minimize(void)
        return -1;
 }
 
+int xenv_keycode_to_keysym(int kc, int shift)
+{
+       if (g_xstuff.display)
+               return g_xstuff.pXkbKeycodeToKeysym(g_xstuff.display,
+                       kc, 0, shift);
+
+       return -1;
+}
+
+int xenv_get_window(void **display, int *screen, void **window)
+{
+       *display = *window = NULL;
+       *screen = 0;
+       if (g_xstuff.display && g_xstuff.window) {
+               *display = g_xstuff.display;
+               *screen = DefaultScreen(g_xstuff.display);
+               *window = (void *)g_xstuff.window;
+               return 0;
+       }
+
+       return -1;
+}
+
 void xenv_finish(void)
 {
        // TODO: cleanup X?