[vlc-devel] commit: XCB: subscribe to parent window resize event only once ( Rémi Denis-Courmont )

git version control git at videolan.org
Sat Apr 18 15:47:45 CEST 2009


vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Sat Apr 18 12:07:15 2009 +0300| [a7454a52b35016baa7ba76a9d17d26321cafdcd9] | committer: Rémi Denis-Courmont 

XCB: subscribe to parent window resize event only once

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

 modules/video_output/xcb/x11.c |   50 +++++++++++++++++----------------------
 1 files changed, 22 insertions(+), 28 deletions(-)

diff --git a/modules/video_output/xcb/x11.c b/modules/video_output/xcb/x11.c
index b598edd..12c545b 100644
--- a/modules/video_output/xcb/x11.c
+++ b/modules/video_output/xcb/x11.c
@@ -78,7 +78,6 @@ struct vout_sys_t
     vout_window_t *embed; /* VLC window (when windowed) */
 
     xcb_visualid_t vid; /* selected visual */
-    xcb_window_t parent; /* parent X window */
     xcb_colormap_t cmap; /* colormap for selected visual */
     xcb_window_t window; /* drawable X window */
     xcb_gcontext_t gc; /* context to put images */
@@ -296,6 +295,9 @@ static int Open (vlc_object_t *obj)
         msg_Err (vout, "parent window not available");
         goto error;
     }
+    /* Subscribe to parent window resize events */
+    xcb_change_window_attributes (p_sys->conn, p_sys->embed->handle.xid,
+        XCB_CW_EVENT_MASK, &(uint32_t){ XCB_EVENT_MASK_STRUCTURE_NOTIFY });
 
     vout->pf_init = Init;
     vout->pf_end = Deinit;
@@ -437,6 +439,22 @@ static void PictureDeinit (picture_t *pic)
     free (p_sys);
 }
 
+static void get_window_size (xcb_connection_t *conn, xcb_window_t win,
+                             unsigned *width, unsigned *height)
+{
+    xcb_get_geometry_cookie_t ck = xcb_get_geometry (conn, win);
+    xcb_get_geometry_reply_t *geo = xcb_get_geometry_reply (conn, ck, NULL);
+
+    if (geo)
+    {
+        *width = geo->width;
+        *height = geo->height;
+        free (geo);
+    }
+    else
+        *width = *height = 0;
+}
+
 /**
  * Allocate drawable window and picture buffers.
  */
@@ -445,35 +463,11 @@ static int Init (vout_thread_t *vout)
     vout_sys_t *p_sys = vout->p_sys;
     const xcb_screen_t *screen = p_sys->screen;
     unsigned x, y, width, height;
+    xcb_window_t parent = p_sys->embed->handle.xid;
 
     I_OUTPUTPICTURES = 0;
 
-    /* Determine parent window and size */
-    if (vout->b_fullscreen)
-    {
-        p_sys->parent = screen->root;
-        width = screen->width_in_pixels;
-        height = screen->height_in_pixels;
-    }
-    else
-    {
-        p_sys->parent = p_sys->embed->handle.xid;
-
-        /* Subscribe to parent window resize events */
-        const uint32_t value = XCB_EVENT_MASK_STRUCTURE_NOTIFY;
-        xcb_change_window_attributes (p_sys->conn, p_sys->parent,
-                                      XCB_CW_EVENT_MASK, &value);
-
-        xcb_get_geometry_cookie_t ck;
-        ck = xcb_get_geometry (p_sys->conn, p_sys->parent);
-
-        xcb_get_geometry_reply_t *geo;
-        geo = xcb_get_geometry_reply (p_sys->conn, ck, NULL);
-        width = geo->width;
-        height = geo->height;
-        free (geo);
-    }
-
+    get_window_size (p_sys->conn, parent, &width, &height);
     vout_PlacePicture (vout, width, height, &x, &y, &width, &height);
 
     /* FIXME: I don't get the subtlety between output and fmt_out here */
@@ -510,7 +504,7 @@ static int Init (vout_thread_t *vout)
     xcb_window_t window = xcb_generate_id (p_sys->conn);
 
     c = xcb_create_window_checked (p_sys->conn, screen->root_depth, window,
-                                   p_sys->parent, x, y, width, height, 0,
+                                   parent, x, y, width, height, 0,
                                    XCB_WINDOW_CLASS_INPUT_OUTPUT,
                                    p_sys->vid, mask, values);
     if (CheckError (vout, "cannot create X11 window", c))




More information about the vlc-devel mailing list