[vlc-devel] commit: XCB/GLX: resize ( Rémi Denis-Courmont )

git version control git at videolan.org
Sat Dec 12 17:23:48 CET 2009


vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Sat Dec 12 18:23:32 2009 +0200| [439eed0f4d55150e0d2beb1d9679e8365717a7cd] | committer: Rémi Denis-Courmont 

XCB/GLX: resize

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=439eed0f4d55150e0d2beb1d9679e8365717a7cd
---

 modules/video_output/xcb/glx.c |   67 +++++++++++++++++++++++++++++++++------
 1 files changed, 56 insertions(+), 11 deletions(-)

diff --git a/modules/video_output/xcb/glx.c b/modules/video_output/xcb/glx.c
index 774cfe1..8e5ae3a 100644
--- a/modules/video_output/xcb/glx.c
+++ b/modules/video_output/xcb/glx.c
@@ -66,6 +66,8 @@ struct vout_display_sys_t
     xcb_cursor_t cursor; /* blank cursor */
     xcb_window_t window; /* drawable X window */
     xcb_window_t glwin; /* GLX window */
+    uint16_t width; /* render pixel width */
+    uint16_t height; /* render pixel height */
     bool visible; /* whether to draw */
     bool v1_3; /* whether GLX >= 1.3 is available */
 
@@ -100,7 +102,8 @@ static vout_window_t *MakeWindow (vout_display_t *vd)
 
 static const xcb_screen_t *
 FindWindow (vout_display_t *vd, xcb_connection_t *conn,
-            unsigned *restrict pnum, uint8_t *restrict pdepth)
+            unsigned *restrict pnum, uint8_t *restrict pdepth,
+            uint16_t *restrict pwidth, uint16_t *restrict pheight)
 {
     vout_display_sys_t *sys = vd->sys;
 
@@ -115,6 +118,8 @@ FindWindow (vout_display_t *vd, xcb_connection_t *conn,
 
     xcb_window_t root = geo->root;
     *pdepth = geo->depth;
+    *pwidth = geo->width;
+    *pheight = geo->height;
     free (geo);
 
     /* Find the selected screen */
@@ -170,11 +175,6 @@ static int CreateWindow (vout_display_t *vd, xcb_connection_t *conn,
                          uint_fast8_t depth, xcb_visualid_t vid)
 {
     vout_display_sys_t *sys = vd->sys;
-
-    unsigned width, height;
-    if (GetWindowSize (sys->embed, conn, &width, &height))
-        return VLC_EGENERIC;
-
     const uint32_t mask = XCB_CW_EVENT_MASK;
     const uint32_t values[] = {
         /* XCB_CW_EVENT_MASK */
@@ -183,7 +183,8 @@ static int CreateWindow (vout_display_t *vd, xcb_connection_t *conn,
     xcb_void_cookie_t cc, cm;
 
     cc = xcb_create_window_checked (conn, depth, sys->window,
-                                    sys->embed->xid, 0, 0, width, height, 0,
+                                    sys->embed->xid, 0, 0,
+                                    sys->width, sys->height, 0,
                                     XCB_WINDOW_CLASS_INPUT_OUTPUT,
                                     vid, mask, values);
     cm = xcb_map_window_checked (conn, sys->window);
@@ -240,7 +241,8 @@ static int Open (vlc_object_t *obj)
     /* Find window parameters */
     unsigned snum;
     uint8_t depth;
-    const xcb_screen_t *scr = FindWindow (vd, conn, &snum, &depth);
+    const xcb_screen_t *scr = FindWindow (vd, conn, &snum, &depth,
+                                          &sys->width, &sys->height);
     if (scr == NULL)
         goto error;
 
@@ -353,7 +355,7 @@ static int Open (vlc_object_t *obj)
 
     /* */
     vout_display_SendEventFullscreen (vd, false);
-    //vout_display_SendEventDisplaySize (vd, width, height, false);
+    vout_display_SendEventDisplaySize (vd, sys->width, sys->height, false);
 
     return VLC_SUCCESS;
 
@@ -395,6 +397,7 @@ static void SwapBuffers (vout_opengl_t *gl)
 {
     vout_display_sys_t *sys = gl->sys;
 
+    glViewport (0, 0, sys->width, sys->height);
     glXSwapBuffers (sys->display, sys->glwin);
 }
 
@@ -452,8 +455,50 @@ static int Control (vout_display_t *vd, int query, va_list ap)
     case VOUT_DISPLAY_CHANGE_ZOOM:
     case VOUT_DISPLAY_CHANGE_SOURCE_ASPECT:
     case VOUT_DISPLAY_CHANGE_SOURCE_CROP:
-        msg_Err (vd, "unimplemented control request");
-        return VLC_EGENERIC;
+    {
+        xcb_connection_t *conn = XGetXCBConnection (sys->display);
+        const vout_display_cfg_t *cfg;
+        const video_format_t *source;
+        bool is_forced = false;
+
+        if (query == VOUT_DISPLAY_CHANGE_SOURCE_ASPECT
+         || query == VOUT_DISPLAY_CHANGE_SOURCE_CROP)
+        {
+            source = (const video_format_t *)va_arg (ap, const video_format_t *);
+            cfg = vd->cfg;
+        }
+        else
+        {
+            source = &vd->source;
+            cfg = (const vout_display_cfg_t*)va_arg (ap, const vout_display_cfg_t *);
+            if (query == VOUT_DISPLAY_CHANGE_DISPLAY_SIZE)
+                is_forced = (bool)va_arg (ap, int);
+        }
+
+        /* */
+        if (query == VOUT_DISPLAY_CHANGE_DISPLAY_SIZE
+         && is_forced
+         && (cfg->display.width  != vd->cfg->display.width
+           ||cfg->display.height != vd->cfg->display.height)
+         && vout_window_SetSize (sys->embed,
+                                 cfg->display.width, cfg->display.height))
+            return VLC_EGENERIC;
+
+        vout_display_place_t place;
+        vout_display_PlacePicture (&place, source, cfg, false);
+        sys->width  = place.width;
+        sys->height = place.height;
+
+        /* Move the picture within the window */
+        const uint32_t values[] = { place.x, place.y,
+                                    place.width, place.height, };
+        xcb_configure_window (conn, sys->window,
+                              XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y
+                            | XCB_CONFIG_WINDOW_WIDTH | XCB_CONFIG_WINDOW_HEIGHT,
+                              values);
+        xcb_flush (conn);
+        return VLC_SUCCESS;
+    }
 
     /* Hide the mouse. It will be send when
      * vout_display_t::info.b_hide_mouse is false */




More information about the vlc-devel mailing list