Skip to content

Commit

Permalink
wl: Use cog_view_get_viewport() to get the View's Viewport
Browse files Browse the repository at this point in the history
Allow to use the CogViewport assigned to the CogView instead of the
global CogViewport reference inside of the Platform.
  • Loading branch information
psaavedra committed Nov 22, 2023
1 parent ca7aebc commit 01b0cf0
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 21 deletions.
41 changes: 20 additions & 21 deletions platform/wayland/cog-view-wl.c
Original file line number Diff line number Diff line change
Expand Up @@ -178,7 +178,6 @@ static WebKitWebViewBackend *
cog_wl_view_create_backend(CogView *view)
{
CogWlPlatform *platform = (CogWlPlatform *) cog_platform_get();
CogWlViewport *viewport = COG_WL_VIEWPORT(platform->viewport);
CogWlView *self = COG_WL_VIEW(view);

static const struct wpe_view_backend_exportable_fdo_egl_client client = {
Expand All @@ -188,8 +187,7 @@ cog_wl_view_create_backend(CogView *view)
#endif
};

self->exportable =
wpe_view_backend_exportable_fdo_egl_create(&client, self, viewport->window.width, viewport->window.height);
self->exportable = wpe_view_backend_exportable_fdo_egl_create(&client, self, DEFAULT_WIDTH, DEFAULT_HEIGHT);

/* init WPE view backend */
struct wpe_view_backend *view_backend = wpe_view_backend_exportable_fdo_get_view_backend(self->exportable);
Expand All @@ -214,8 +212,7 @@ cog_wl_view_create_backend(CogView *view)
bool
cog_wl_view_does_image_match_win_size(CogWlView *view)
{
CogWlPlatform *platform = (CogWlPlatform *) cog_platform_get();
CogWlViewport *viewport = COG_WL_VIEWPORT(platform->viewport);
CogWlViewport *viewport = COG_WL_VIEWPORT(cog_view_get_viewport((CogView *) view));
return view->image && wpe_fdo_egl_exported_image_get_width(view->image) == viewport->window.width &&
wpe_fdo_egl_exported_image_get_height(view->image) == viewport->window.height;
}
Expand All @@ -228,8 +225,7 @@ cog_wl_view_enter_fullscreen(CogWlView *view)
return;

#if HAVE_FULLSCREEN_HANDLING
CogWlPlatform *platform = (CogWlPlatform *) cog_platform_get();
CogWlViewport *viewport = COG_WL_VIEWPORT(platform->viewport);
CogWlViewport *viewport = COG_WL_VIEWPORT(cog_view_get_viewport((CogView *) view));
if (viewport->window.was_fullscreen_requested_from_dom)
wpe_view_backend_dispatch_did_enter_fullscreen(cog_view_get_backend(COG_VIEW(view)));
#endif
Expand All @@ -250,8 +246,8 @@ cog_wl_view_exit_fullscreen(CogWlView *view)
static bool
cog_wl_view_handle_dom_fullscreen_request(void *data, bool fullscreen)
{
CogWlPlatform *platform = (CogWlPlatform *) cog_platform_get();
CogWlViewport *viewport = COG_WL_VIEWPORT(platform->viewport);
CogWlView *view = data;
CogWlViewport *viewport = COG_WL_VIEWPORT(cog_view_get_viewport((CogView *) view));

viewport->window.was_fullscreen_requested_from_dom = true;
if (fullscreen != viewport->window.is_fullscreen)
Expand All @@ -278,7 +274,7 @@ static void
cog_wl_view_request_frame(CogWlView *view)
{
CogWlPlatform *platform = (CogWlPlatform *) cog_platform_get();
CogWlViewport *viewport = COG_WL_VIEWPORT(platform->viewport);
CogWlViewport *viewport = COG_WL_VIEWPORT(cog_view_get_viewport((CogView *) view));

if (!view->frame_callback) {
static const struct wl_callback_listener listener = {.done = on_wl_surface_frame};
Expand All @@ -301,7 +297,12 @@ void
cog_wl_view_resize(CogWlView *view)
{
CogWlPlatform *platform = (CogWlPlatform *) cog_platform_get();
CogWlViewport *viewport = COG_WL_VIEWPORT(platform->viewport);
g_assert(platform);

if (!platform->display || !platform->display->current_output)
return;

CogWlViewport *viewport = COG_WL_VIEWPORT(cog_view_get_viewport((CogView *) view));
view->should_update_opaque_region = true;

int32_t pixel_width = viewport->window.width * platform->display->current_output->scale;
Expand All @@ -319,7 +320,7 @@ void
cog_wl_view_update_surface_contents(CogWlView *view)
{
CogWlPlatform *platform = (CogWlPlatform *) cog_platform_get();
CogWlViewport *viewport = COG_WL_VIEWPORT(platform->viewport);
CogWlViewport *viewport = COG_WL_VIEWPORT(cog_view_get_viewport((CogView *) view));
g_assert(view);

struct wl_surface *surface = viewport->window.wl_surface;
Expand Down Expand Up @@ -370,10 +371,9 @@ cog_wl_view_update_surface_contents(CogWlView *view)
}

static bool
validate_exported_geometry(uint32_t width, uint32_t height)
validate_exported_geometry(CogWlViewport *viewport, uint32_t width, uint32_t height)
{
CogWlPlatform *platform = (CogWlPlatform *) cog_platform_get();
CogWlViewport *viewport = COG_WL_VIEWPORT(platform->viewport);

const uint32_t surface_pixel_width = platform->display->current_output->scale * viewport->window.width;
const uint32_t surface_pixel_height = platform->display->current_output->scale * viewport->window.height;
Expand All @@ -392,16 +392,15 @@ validate_exported_geometry(uint32_t width, uint32_t height)
static void
on_export_shm_buffer(void *data, struct wpe_fdo_shm_exported_buffer *exported_buffer)
{
CogWlPlatform *platform = (CogWlPlatform *) cog_platform_get();
CogWlViewport *viewport = COG_WL_VIEWPORT(platform->viewport);
CogWlView *view = data;
CogWlViewport *viewport = COG_WL_VIEWPORT(cog_view_get_viewport((CogView *) view));

struct wl_resource *exported_resource = wpe_fdo_shm_exported_buffer_get_resource(exported_buffer);
struct wl_shm_buffer *exported_shm_buffer = wpe_fdo_shm_exported_buffer_get_shm_buffer(exported_buffer);

uint32_t image_width = wl_shm_buffer_get_width(exported_shm_buffer);
uint32_t image_height = wl_shm_buffer_get_height(exported_shm_buffer);
if (!validate_exported_geometry(image_width, image_height)) {
if (!validate_exported_geometry(viewport, image_width, image_height)) {
wpe_view_backend_exportable_fdo_dispatch_frame_complete(view->exportable);
wpe_view_backend_exportable_fdo_egl_dispatch_release_shm_exported_buffer(view->exportable, exported_buffer);
return;
Expand Down Expand Up @@ -451,11 +450,12 @@ on_export_shm_buffer(void *data, struct wpe_fdo_shm_exported_buffer *exported_bu
static void
on_export_wl_egl_image(void *data, struct wpe_fdo_egl_exported_image *image)
{
CogWlView *self = data;
CogWlView *self = data;
CogWlViewport *viewport = COG_WL_VIEWPORT(cog_view_get_viewport((CogView *) self));

uint32_t image_width = wpe_fdo_egl_exported_image_get_width(image);
uint32_t image_height = wpe_fdo_egl_exported_image_get_height(image);
if (!validate_exported_geometry(image_width, image_height)) {
if (!validate_exported_geometry(viewport, image_width, image_height)) {
wpe_view_backend_exportable_fdo_dispatch_frame_complete(self->exportable);
wpe_view_backend_exportable_fdo_egl_dispatch_release_exported_image(self->exportable, image);
return;
Expand Down Expand Up @@ -492,8 +492,7 @@ on_mouse_target_changed(WebKitWebView *view, WebKitHitTestResult *hitTestResult,
static void
on_run_file_chooser(WebKitWebView *view, WebKitFileChooserRequest *request)
{
CogWlPlatform *platform = (CogWlPlatform *) cog_platform_get();
CogWlViewport *viewport = COG_WL_VIEWPORT(platform->viewport);
CogWlViewport *viewport = COG_WL_VIEWPORT(cog_view_get_viewport((CogView *) view));

g_autoptr(XdpParent) xdp_parent = NULL;
if (viewport->window.xdp_parent_wl_data.zxdg_exporter && viewport->window.xdp_parent_wl_data.wl_surface) {
Expand Down
9 changes: 9 additions & 0 deletions platform/wayland/cog-viewport-wl.c
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
G_DEFINE_DYNAMIC_TYPE(CogWlViewport, cog_wl_viewport, COG_TYPE_VIEWPORT)

static void cog_wl_viewport_dispose(GObject *);
static void cog_wl_viewport_on_add(CogWlViewport *, CogView *);
static void destroy_window(CogWlViewport *);
static void noop();

Expand Down Expand Up @@ -201,6 +202,8 @@ cog_wl_viewport_init(CogWlViewport *viewport)

viewport->window.width_before_fullscreen = viewport->window.width;
viewport->window.height_before_fullscreen = viewport->window.height;

g_signal_connect(COG_VIEWPORT(viewport), "add", G_CALLBACK(cog_wl_viewport_on_add), NULL);
}

/*
Expand Down Expand Up @@ -382,6 +385,12 @@ cog_wl_viewport_exit_fullscreen(CogWlViewport *viewport)
#endif
}

static void
cog_wl_viewport_on_add(CogWlViewport *viewport G_GNUC_UNUSED, CogView *view)
{
cog_wl_view_resize((CogWlView *) view);
}

void
cog_wl_viewport_resize_to_largest_output(CogWlViewport *viewport)
{
Expand Down

0 comments on commit 01b0cf0

Please sign in to comment.