Allow derived classes to specify custom Visual and Colormap.
authorgb <gb@5584edef-b1fe-4b99-b61b-dd2bab72e969>
Thu, 25 Mar 2010 17:18:06 +0000 (17:18 +0000)
committergb <gb@5584edef-b1fe-4b99-b61b-dd2bab72e969>
Thu, 25 Mar 2010 17:18:06 +0000 (17:18 +0000)
gst-libs/gst/vaapi/gstvaapiutils_x11.c
gst-libs/gst/vaapi/gstvaapiutils_x11.h
gst-libs/gst/vaapi/gstvaapiwindow_x11.c
gst-libs/gst/vaapi/gstvaapiwindow_x11.h

index 317609a..dc161e1 100644 (file)
@@ -57,36 +57,38 @@ static const int x11_event_mask = (KeyPressMask |
 
 /**
  * x11_create_window:
- * @display: an X11 #Display
- * @width: the requested width, in pixels
- * @height: the requested height, in pixels
+ * @dpy: an X11 #Display
+ * @w: the requested width, in pixels
+ * @h: the requested height, in pixels
  * @vis: the request visual
+ * @cmap: the request colormap
  *
  * Creates a border-less window with the specified dimensions. If @vis
- * is %NULL, the default visual for @display will be used. The default
- * background color is black.
+ * is %NULL, the default visual for @display will be used. If @cmap is
+ * %None, no specific colormap will be bound to the window. Also note
+ * the default background color is black.
  *
  * Return value: the newly created X #Window.
  */
 Window
-x11_create_window(Display *display, guint width, guint height, Visual *vis)
+x11_create_window(Display *dpy, guint w, guint h, Visual *vis, Colormap cmap)
 {
-    Window root_window, window;
+    Window rootwin, win;
     int screen, depth;
     XSetWindowAttributes xswa;
     unsigned long xswa_mask;
     XWindowAttributes wattr;
     unsigned long black_pixel, white_pixel;
 
-    screen      = DefaultScreen(display);
-    root_window = RootWindow(display, screen);
-    black_pixel = BlackPixel(display, screen);
-    white_pixel = WhitePixel(display, screen);
+    screen      = DefaultScreen(dpy);
+    rootwin     = RootWindow(dpy, screen);
+    black_pixel = BlackPixel(dpy, screen);
+    white_pixel = WhitePixel(dpy, screen);
 
     if (!vis)
-        vis = DefaultVisual(display, screen);
+        vis = DefaultVisual(dpy, screen);
 
-    XGetWindowAttributes(display, root_window, &wattr);
+    XGetWindowAttributes(dpy, rootwin, &wattr);
     depth = wattr.depth;
     if (depth != 15 && depth != 16 && depth != 24 && depth != 32)
         depth = 24;
@@ -95,21 +97,26 @@ x11_create_window(Display *display, guint width, guint height, Visual *vis)
     xswa.border_pixel     = black_pixel;
     xswa.background_pixel = black_pixel;
 
-    window = XCreateWindow(
-        display,
-        root_window,
-        0, 0, width, height,
+    if (cmap) {
+        xswa_mask        |= CWColormap;
+        xswa.colormap     = cmap;
+    }
+
+    win = XCreateWindow(
+        dpy,
+        rootwin,
+        0, 0, w, h,
         0,
         depth,
         InputOutput,
         vis,
         xswa_mask, &xswa
     );
-    if (!window)
+    if (!win)
         return None;
 
-    XSelectInput(display, window, x11_event_mask);
-    return window;
+    XSelectInput(dpy, win, x11_event_mask);
+    return win;
 }
 
 gboolean
index 9ab0131..ab8fb5d 100644 (file)
@@ -32,7 +32,7 @@ int x11_untrap_errors(void)
     attribute_hidden;
 
 Window
-x11_create_window(Display *display, guint width, guint height, Visual *vis)
+x11_create_window(Display *dpy, guint w, guint h, Visual *vis, Colormap cmap)
     attribute_hidden;
 
 gboolean
index 2630836..213e725 100644 (file)
@@ -218,6 +218,9 @@ gst_vaapi_window_x11_create(GstVaapiWindow *window, guint *width, guint *height)
     GstVaapiWindowX11Private * const priv = GST_VAAPI_WINDOW_X11(window)->priv;
     Display * const                  dpy  = GST_VAAPI_OBJECT_XDISPLAY(window);
     Window                           xid  = GST_VAAPI_OBJECT_ID(window);
+    Visual                          *vis  = NULL;
+    Colormap                         cmap = None;
+    GstVaapiWindowX11Class          *klass;
     XWindowAttributes                wattr;
     Atom                             atoms[2];
     gboolean                         ok;
@@ -236,12 +239,25 @@ gst_vaapi_window_x11_create(GstVaapiWindow *window, guint *width, guint *height)
         return ok;
     }
 
+    klass = GST_VAAPI_WINDOW_X11_GET_CLASS(window);
+    if (klass) {
+        if (klass->get_visual)
+            vis = klass->get_visual(window);
+        if (klass->get_colormap)
+            cmap = klass->get_colormap(window);
+    }
+
     GST_VAAPI_OBJECT_LOCK_DISPLAY(window);
-    XInternAtoms(dpy, (char **)atom_names, G_N_ELEMENTS(atom_names), False, atoms);
+    XInternAtoms(
+        dpy,
+        (char **)atom_names, G_N_ELEMENTS(atom_names),
+        False,
+        atoms
+    );
     priv->atom_NET_WM_STATE            = atoms[0];
     priv->atom_NET_WM_STATE_FULLSCREEN = atoms[1];
 
-    xid = x11_create_window(dpy, *width, *height, NULL);
+    xid = x11_create_window(dpy, *width, *height, vis, cmap);
     if (xid)
         XRaiseWindow(dpy, xid);
     GST_VAAPI_OBJECT_UNLOCK_DISPLAY(window);
@@ -494,7 +510,7 @@ gst_vaapi_window_x11_new(GstVaapiDisplay *display, guint width, guint height)
     GST_DEBUG("new window, size %ux%u", width, height);
 
     g_return_val_if_fail(GST_VAAPI_IS_DISPLAY(display), NULL);
-    g_return_val_if_fail(width > 0, NULL);
+    g_return_val_if_fail(width  > 0, NULL);
     g_return_val_if_fail(height > 0, NULL);
 
     return g_object_new(GST_VAAPI_TYPE_WINDOW_X11,
@@ -544,7 +560,7 @@ gst_vaapi_window_x11_new_with_xid(GstVaapiDisplay *display, Window xid)
 Window
 gst_vaapi_window_x11_get_xid(GstVaapiWindowX11 *window)
 {
-    g_return_val_if_fail(GST_VAAPI_WINDOW_X11(window), None);
+    g_return_val_if_fail(GST_VAAPI_IS_WINDOW_X11(window), None);
 
     return GST_VAAPI_OBJECT_ID(window);
 }
index 59fe140..cf3da5d 100644 (file)
@@ -78,12 +78,19 @@ struct _GstVaapiWindowX11 {
 
 /**
  * GstVaapiWindowX11Class:
+ * @get_visual: virtual function to get the desired visual used to
+ *   create the window
+ * @get_colormap: virtual function to get the desired colormap used to
+ *   create the window
  *
  * An X11 #Window wrapper class.
  */
 struct _GstVaapiWindowX11Class {
     /*< private >*/
     GstVaapiWindowClass parent_class;
+
+    Visual *  (*get_visual)     (GstVaapiWindow *window);
+    Colormap  (*get_colormap)   (GstVaapiWindow *window);
 };
 
 GType