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)
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;
break;
}
- wl_buffer_add_listener(buf, &buffer_cbs, pic);
pics[count++] = pic;
}
picture_Release(pics[--count]);
return NULL;
}
+
+ picture_pool_Enum(sys->pool, PictureAttach, NULL);
return sys->pool;
}
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;
}
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:
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;
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:
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()