diff --git a/include/view.h b/include/view.h index 631ceeb8..6dab44c1 100644 --- a/include/view.h +++ b/include/view.h @@ -38,10 +38,8 @@ struct view_impl { void (*maximize)(struct view *view, bool maximize); void (*move_to_front)(struct view *view); void (*move_to_back)(struct view *view); - void (*setup_common_listeners)(struct view *view); - void (*setup_specific_listeners)(struct view *view); - void (*remove_common_listeners)(struct view *view); - void (*remove_specific_listeners)(struct view *view); + void (*listeners_init)(struct view *view); + void (*listeners_remove)(struct view *view); }; struct view { diff --git a/src/view-impl-common.c b/src/view-impl-common.c index 08d0caae..8157cc43 100644 --- a/src/view-impl-common.c +++ b/src/view-impl-common.c @@ -119,8 +119,7 @@ view_init(struct view *view) node_descriptor_create(&view->scene_tree->node, LAB_NODE_DESC_VIEW, view); - view->impl->setup_common_listeners(view); - view->impl->setup_specific_listeners(view); + view->impl->listeners_init(view); wl_list_insert(&view->server->views, &view->link); } @@ -132,8 +131,7 @@ view_destroy(struct view *view) struct server *server = view->server; bool need_cursor_update = false; - view->impl->remove_common_listeners(view); - view->impl->remove_specific_listeners(view); + view->impl->listeners_remove(view); if (view->toplevel.handle) { wlr_foreign_toplevel_handle_v1_destroy(view->toplevel.handle); diff --git a/src/xdg.c b/src/xdg.c index 07084db4..02430d64 100644 --- a/src/xdg.c +++ b/src/xdg.c @@ -481,7 +481,22 @@ xdg_activation_handle_request(struct wl_listener *listener, void *data) } static void -xdg_setup_common_listeners(struct view *view) +xdg_listeners_init_specific(struct view *view) +{ + struct xdg_toplevel_view *xdg_view = xdg_toplevel_view_from_view(view); + struct wlr_xdg_surface *xdg_surface = xdg_view->xdg_surface; + struct wlr_xdg_toplevel *toplevel = xdg_surface->toplevel; + + /* Events specific to XDG toplevel views */ + xdg_view->set_app_id.notify = handle_set_app_id; + wl_signal_add(&toplevel->events.set_app_id, &xdg_view->set_app_id); + + xdg_view->new_popup.notify = handle_new_xdg_popup; + wl_signal_add(&xdg_surface->events.new_popup, &xdg_view->new_popup); +} + +static void +xdg_listeners_init(struct view *view) { struct wlr_xdg_surface *xdg_surface = xdg_surface_from_view(view); struct wlr_xdg_toplevel *toplevel = xdg_surface->toplevel; @@ -513,29 +528,19 @@ xdg_setup_common_listeners(struct view *view) view->set_title.notify = handle_set_title; wl_signal_add(&toplevel->events.set_title, &view->set_title); -} - -static void -xdg_setup_specific_listeners(struct view *view) -{ - struct xdg_toplevel_view *xdg_view = xdg_toplevel_view_from_view(view); - struct wlr_xdg_surface *xdg_surface = xdg_view->xdg_surface; - struct wlr_xdg_toplevel *toplevel = xdg_surface->toplevel; /* Events specific to XDG toplevel views */ - xdg_view->set_app_id.notify = handle_set_app_id; - wl_signal_add(&toplevel->events.set_app_id, &xdg_view->set_app_id); - - xdg_view->new_popup.notify = handle_new_xdg_popup; - wl_signal_add(&xdg_surface->events.new_popup, &xdg_view->new_popup); + xdg_listeners_init_specific(view); } static void -xdg_remove_specific_listeners(struct view *view) +xdg_listeners_remove(struct view *view) { - struct xdg_toplevel_view *xdg_view = xdg_toplevel_view_from_view(view); + /* Remove common listeners */ + view_impl_remove_common_listeners(view); /* Remove xdg-shell view specific listeners */ + struct xdg_toplevel_view *xdg_view = xdg_toplevel_view_from_view(view); wl_list_remove(&xdg_view->set_app_id.link); wl_list_remove(&xdg_view->new_popup.link); } @@ -551,10 +556,8 @@ static const struct view_impl xdg_toplevel_view_impl = { .maximize = xdg_toplevel_view_maximize, .move_to_front = view_impl_move_to_front, .move_to_back = view_impl_move_to_back, - .setup_common_listeners = xdg_setup_common_listeners, - .setup_specific_listeners = xdg_setup_specific_listeners, - .remove_common_listeners = view_impl_remove_common_listeners, - .remove_specific_listeners = xdg_remove_specific_listeners, + .listeners_init = xdg_listeners_init, + .listeners_remove = xdg_listeners_remove, }; /* diff --git a/src/xwayland.c b/src/xwayland.c index afc27a73..a630a78b 100644 --- a/src/xwayland.c +++ b/src/xwayland.c @@ -575,7 +575,34 @@ xwayland_view_set_fullscreen(struct view *view, bool fullscreen) } static void -xwayland_setup_common_listeners(struct view *view) +xwayland_listeners_init_specific(struct view *view) +{ + struct xwayland_view *xwayland_view = xwayland_view_from_view(view); + struct wlr_xwayland_surface *xsurface = xwayland_view->xwayland_surface; + + /* Events specific to XWayland views */ + xwayland_view->request_activate.notify = handle_request_activate; + wl_signal_add(&xsurface->events.request_activate, + &xwayland_view->request_activate); + + xwayland_view->request_configure.notify = handle_request_configure; + wl_signal_add(&xsurface->events.request_configure, + &xwayland_view->request_configure); + + xwayland_view->set_app_id.notify = handle_set_class; + wl_signal_add(&xsurface->events.set_class, &xwayland_view->set_app_id); + + xwayland_view->set_decorations.notify = handle_set_decorations; + wl_signal_add(&xsurface->events.set_decorations, + &xwayland_view->set_decorations); + + xwayland_view->override_redirect.notify = handle_override_redirect; + wl_signal_add(&xsurface->events.set_override_redirect, + &xwayland_view->override_redirect); +} + +static void +xwayland_listeners_init(struct view *view) { struct wlr_xwayland_surface *xsurface = xwayland_surface_from_view(view); @@ -606,41 +633,19 @@ xwayland_setup_common_listeners(struct view *view) view->set_title.notify = handle_set_title; wl_signal_add(&xsurface->events.set_title, &view->set_title); -} - -static void -xwayland_setup_specific_listeners(struct view *view) -{ - struct xwayland_view *xwayland_view = xwayland_view_from_view(view); - struct wlr_xwayland_surface *xsurface = xwayland_view->xwayland_surface; /* Events specific to XWayland views */ - xwayland_view->request_activate.notify = handle_request_activate; - wl_signal_add(&xsurface->events.request_activate, - &xwayland_view->request_activate); - - xwayland_view->request_configure.notify = handle_request_configure; - wl_signal_add(&xsurface->events.request_configure, - &xwayland_view->request_configure); - - xwayland_view->set_app_id.notify = handle_set_class; - wl_signal_add(&xsurface->events.set_class, &xwayland_view->set_app_id); - - xwayland_view->set_decorations.notify = handle_set_decorations; - wl_signal_add(&xsurface->events.set_decorations, - &xwayland_view->set_decorations); - - xwayland_view->override_redirect.notify = handle_override_redirect; - wl_signal_add(&xsurface->events.set_override_redirect, - &xwayland_view->override_redirect); + xwayland_listeners_init_specific(view); } static void -xwayland_remove_specific_listeners(struct view *view) +xwayland_listeners_remove(struct view *view) { - struct xwayland_view *xwayland_view = xwayland_view_from_view(view); + /* Remove common listeners */ + view_impl_remove_common_listeners(view); /* Remove XWayland view specific listeners */ + struct xwayland_view *xwayland_view = xwayland_view_from_view(view); wl_list_remove(&xwayland_view->request_activate.link); wl_list_remove(&xwayland_view->request_configure.link); wl_list_remove(&xwayland_view->set_app_id.link); @@ -659,10 +664,8 @@ static const struct view_impl xwayland_view_impl = { .maximize = xwayland_view_maximize, .move_to_front = xwayland_view_move_to_front, .move_to_back = xwayland_view_move_to_back, - .setup_common_listeners = xwayland_setup_common_listeners, - .setup_specific_listeners = xwayland_setup_specific_listeners, - .remove_common_listeners = view_impl_remove_common_listeners, - .remove_specific_listeners = xwayland_remove_specific_listeners, + .listeners_init = xwayland_listeners_init, + .listeners_remove = xwayland_listeners_remove, }; struct xwayland_view *