]> git.sesse.net Git - vlc/blobdiff - modules/video_output/wayland/shm.c
Mark unreachable code on GCC even if NDEBUG
[vlc] / modules / video_output / wayland / shm.c
index 380a881937316c0fd9eea0825b5daea8456fbace..32a1f3e3c779516f9d79ae9c425bcf6e69080aed 100644 (file)
@@ -61,12 +61,11 @@ struct vout_display_sys_t
 
 static void PictureDestroy(picture_t *pic)
 {
-    struct wl_buffer *buf = (struct wl_buffer *)pic->p_sys;
     const long pagemask = sysconf(_SC_PAGE_SIZE) - 1;
     size_t picsize = pic->p[0].i_pitch * pic->p[0].i_lines;
 
     munmap(pic->p[0].p_pixels, (picsize + pagemask) & ~pagemask);
-    wl_buffer_destroy(buf); /* XXX: what if wl_display is already gone? */
+    free(pic);
 }
 
 static void buffer_release_cb(void *data, struct wl_buffer *buffer)
@@ -82,6 +81,22 @@ static const struct wl_buffer_listener buffer_cbs =
     buffer_release_cb,
 };
 
+static void PictureAttach(void *data, picture_t *pic)
+{
+    struct wl_buffer *buf = (struct wl_buffer *)pic->p_sys;
+
+    wl_buffer_add_listener(buf, &buffer_cbs, pic);
+    (void) data;
+}
+
+static void PictureDetach(void *data, picture_t *pic)
+{
+    struct wl_buffer *buf = (struct wl_buffer *)pic->p_sys;
+
+    wl_buffer_destroy(buf);
+    (void) data;
+}
+
 static picture_pool_t *Pool(vout_display_t *vd, unsigned req)
 {
     vout_display_sys_t *sys = vd->sys;
@@ -174,7 +189,6 @@ static picture_pool_t *Pool(vout_display_t *vd, unsigned req)
             break;
         }
 
-        wl_buffer_add_listener(buf, &buffer_cbs, pic);
         pics[count++] = pic;
     }
 
@@ -193,6 +207,8 @@ static picture_pool_t *Pool(vout_display_t *vd, unsigned req)
             picture_Release(pics[--count]);
         return NULL;
     }
+
+    picture_pool_Enum(sys->pool, PictureAttach, NULL);
     return sys->pool;
 }
 
@@ -233,7 +249,8 @@ static void ResetPictures(vout_display_t *vd)
     if (sys->pool == NULL)
         return;
 
-    picture_pool_Delete(sys->pool);
+    picture_pool_Enum(sys->pool, PictureDetach, NULL);
+    picture_pool_Release(sys->pool);
     sys->pool = NULL;
 }
 
@@ -271,19 +288,6 @@ static int Control(vout_display_t *vd, int query, va_list ap)
             break;
         }
 
-        case VOUT_DISPLAY_CHANGE_FULLSCREEN:
-        {
-            const vout_display_cfg_t *cfg =
-                va_arg(ap, const vout_display_cfg_t *);
-            return vout_window_SetFullScreen(sys->embed, cfg->is_fullscreen);
-        }
-
-        case VOUT_DISPLAY_CHANGE_WINDOW_STATE:
-        {
-            unsigned state = va_arg(ap, unsigned);
-            return vout_window_SetState(sys->embed, state);
-        }
-
         case VOUT_DISPLAY_CHANGE_DISPLAY_SIZE:
         case VOUT_DISPLAY_CHANGE_DISPLAY_FILLED:
         case VOUT_DISPLAY_CHANGE_ZOOM:
@@ -409,12 +413,7 @@ static int Open(vlc_object_t *obj)
     sys->use_buffer_transform = false;
 
     /* Get window */
-    vout_window_cfg_t wcfg = {
-        .type = VOUT_WINDOW_TYPE_WAYLAND,
-        .width  = vd->cfg->display.width,
-        .height = vd->cfg->display.height,
-    };
-    sys->embed = vout_display_NewWindow(vd, &wcfg);
+    sys->embed = vout_display_NewWindow(vd, VOUT_WINDOW_TYPE_WAYLAND);
     if (sys->embed == NULL)
         goto error;
 
@@ -479,10 +478,6 @@ static int Open(vlc_object_t *obj)
     vd->control = Control;
     vd->manage = NULL;
 
-    bool is_fullscreen = vd->cfg->is_fullscreen;
-    if (is_fullscreen && vout_window_SetFullScreen(sys->embed, true))
-        is_fullscreen = false;
-    vout_display_SendEventFullscreen(vd, is_fullscreen);
     return VLC_SUCCESS;
 
 error:
@@ -517,7 +512,7 @@ vlc_module_begin()
     set_description(N_("Wayland shared memory video output"))
     set_category(CAT_VIDEO)
     set_subcategory(SUBCAT_VIDEO_VOUT)
-    set_capability("vout display", 120)
+    set_capability("vout display", 170)
     set_callbacks(Open, Close)
     add_shortcut("wl")
 vlc_module_end()