From: John Lindgren Date: Mon, 16 Oct 2023 06:01:35 +0000 (-0400) Subject: common: add and use CONNECT_SIGNAL macro X-Git-Url: https://git.mdlowis.com/?a=commitdiff_plain;h=5cb1d0e83f34ff959098012ebc62464860916c25;p=proto%2Flabwc.git common: add and use CONNECT_SIGNAL macro This makes the code a bit more readable IMHO (and forces us to be consistent with event handler function names). Adjust scripts/checkpatch.pl to not complain. --- diff --git a/include/common/macros.h b/include/common/macros.h index 0fb62ca6..dc0eb65d 100644 --- a/include/common/macros.h +++ b/include/common/macros.h @@ -16,4 +16,20 @@ */ #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0])) +/** + * CONNECT_SIGNAL() - Connect a signal handler function to a wl_signal. + * + * @param src Signal emitter (struct containing wl_signal) + * @param dest Signal receiver (struct containing wl_listener) + * @param name Signal name + * + * This assumes that the common pattern is followed where: + * - the wl_signal is (*src).events. + * - the wl_listener is (*dest). + * - the signal handler function is named handle_ + */ +#define CONNECT_SIGNAL(src, dest, name) \ + (dest)->name.notify = handle_##name; \ + wl_signal_add(&(src)->events.name, &(dest)->name) + #endif /* LABWC_MACROS_H */ diff --git a/include/xwayland.h b/include/xwayland.h index 29c7da0c..40b831c8 100644 --- a/include/xwayland.h +++ b/include/xwayland.h @@ -20,7 +20,7 @@ struct xwayland_unmanaged { struct wl_listener map; struct wl_listener unmap; struct wl_listener destroy; - struct wl_listener override_redirect; + struct wl_listener set_override_redirect; }; struct xwayland_view { @@ -30,9 +30,9 @@ struct xwayland_view { /* Events unique to XWayland views */ struct wl_listener request_activate; struct wl_listener request_configure; - struct wl_listener set_app_id; /* TODO: s/set_app_id/class/ */ + struct wl_listener set_class; struct wl_listener set_decorations; - struct wl_listener override_redirect; + struct wl_listener set_override_redirect; /* Not (yet) implemented */ /* struct wl_listener set_role; */ diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl index e6b701f1..53d6d268 100755 --- a/scripts/checkpatch.pl +++ b/scripts/checkpatch.pl @@ -64,6 +64,7 @@ my @ignore = ( "PREFER_FALLTHROUGH", "INITIALISED_STATIC", "UNNECESSARY_ELSE", + "MACRO_ARG_PRECEDENCE", ); my $help = 0; my $configuration_file = ".checkpatch.conf"; diff --git a/src/xdg.c b/src/xdg.c index 88776198..6c4a87e8 100644 --- a/src/xdg.c +++ b/src/xdg.c @@ -1,5 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-only #include +#include "common/macros.h" #include "common/mem.h" #include "decorations.h" #include "labwc.h" @@ -39,7 +40,7 @@ xdg_toplevel_from_view(struct view *view) } static void -handle_new_xdg_popup(struct wl_listener *listener, void *data) +handle_new_popup(struct wl_listener *listener, void *data) { struct xdg_toplevel_view *xdg_toplevel_view = wl_container_of(listener, xdg_toplevel_view, new_popup); @@ -695,34 +696,21 @@ xdg_surface_new(struct wl_listener *listener, void *data) /* In support of xdg popups */ xdg_surface->surface->data = tree; - view->map.notify = handle_map; - wl_signal_add(&xdg_surface->events.map, &view->map); - view->unmap.notify = handle_unmap; - wl_signal_add(&xdg_surface->events.unmap, &view->unmap); - view->destroy.notify = handle_destroy; - wl_signal_add(&xdg_surface->events.destroy, &view->destroy); + CONNECT_SIGNAL(xdg_surface, view, map); + CONNECT_SIGNAL(xdg_surface, view, unmap); + CONNECT_SIGNAL(xdg_surface, view, destroy); struct wlr_xdg_toplevel *toplevel = xdg_surface->toplevel; - view->request_move.notify = handle_request_move; - wl_signal_add(&toplevel->events.request_move, &view->request_move); - view->request_resize.notify = handle_request_resize; - wl_signal_add(&toplevel->events.request_resize, &view->request_resize); - view->request_minimize.notify = handle_request_minimize; - wl_signal_add(&toplevel->events.request_minimize, &view->request_minimize); - view->request_maximize.notify = handle_request_maximize; - wl_signal_add(&toplevel->events.request_maximize, &view->request_maximize); - view->request_fullscreen.notify = handle_request_fullscreen; - wl_signal_add(&toplevel->events.request_fullscreen, &view->request_fullscreen); - - view->set_title.notify = handle_set_title; - wl_signal_add(&toplevel->events.set_title, &view->set_title); + CONNECT_SIGNAL(toplevel, view, request_move); + CONNECT_SIGNAL(toplevel, view, request_resize); + CONNECT_SIGNAL(toplevel, view, request_minimize); + CONNECT_SIGNAL(toplevel, view, request_maximize); + CONNECT_SIGNAL(toplevel, view, request_fullscreen); + CONNECT_SIGNAL(toplevel, view, set_title); /* Events specific to XDG toplevel views */ - xdg_toplevel_view->set_app_id.notify = handle_set_app_id; - wl_signal_add(&toplevel->events.set_app_id, &xdg_toplevel_view->set_app_id); - - xdg_toplevel_view->new_popup.notify = handle_new_xdg_popup; - wl_signal_add(&xdg_surface->events.new_popup, &xdg_toplevel_view->new_popup); + CONNECT_SIGNAL(toplevel, xdg_toplevel_view, set_app_id); + CONNECT_SIGNAL(xdg_surface, xdg_toplevel_view, new_popup); wl_list_insert(&server->views, &view->link); } diff --git a/src/xwayland-unmanaged.c b/src/xwayland-unmanaged.c index 8c0067bd..95e17086 100644 --- a/src/xwayland-unmanaged.c +++ b/src/xwayland-unmanaged.c @@ -2,12 +2,13 @@ #include #include #include "common/list.h" +#include "common/macros.h" #include "common/mem.h" #include "labwc.h" #include "xwayland.h" static void -unmanaged_handle_request_configure(struct wl_listener *listener, void *data) +handle_request_configure(struct wl_listener *listener, void *data) { struct xwayland_unmanaged *unmanaged = wl_container_of(listener, unmanaged, request_configure); @@ -21,7 +22,7 @@ unmanaged_handle_request_configure(struct wl_listener *listener, void *data) } static void -unmanaged_handle_set_geometry(struct wl_listener *listener, void *data) +handle_set_geometry(struct wl_listener *listener, void *data) { struct xwayland_unmanaged *unmanaged = wl_container_of(listener, unmanaged, set_geometry); @@ -33,7 +34,7 @@ unmanaged_handle_set_geometry(struct wl_listener *listener, void *data) } static void -unmanaged_handle_map(struct wl_listener *listener, void *data) +handle_map(struct wl_listener *listener, void *data) { struct xwayland_unmanaged *unmanaged = wl_container_of(listener, unmanaged, map); @@ -44,8 +45,7 @@ unmanaged_handle_map(struct wl_listener *listener, void *data) wlr_xwayland_surface_restack(xsurface, NULL, XCB_STACK_MODE_ABOVE); wl_list_append(&unmanaged->server->unmanaged_surfaces, &unmanaged->link); - wl_signal_add(&xsurface->events.set_geometry, &unmanaged->set_geometry); - unmanaged->set_geometry.notify = unmanaged_handle_set_geometry; + CONNECT_SIGNAL(xsurface, unmanaged, set_geometry); if (wlr_xwayland_or_surface_wants_focus(xsurface)) { seat_focus_surface(&unmanaged->server->seat, xsurface->surface); @@ -92,7 +92,7 @@ focus_next_surface(struct server *server, struct wlr_xwayland_surface *xsurface) } static void -unmanaged_handle_unmap(struct wl_listener *listener, void *data) +handle_unmap(struct wl_listener *listener, void *data) { struct xwayland_unmanaged *unmanaged = wl_container_of(listener, unmanaged, unmap); @@ -117,12 +117,12 @@ unmanaged_handle_unmap(struct wl_listener *listener, void *data) } static void -unmanaged_handle_destroy(struct wl_listener *listener, void *data) +handle_destroy(struct wl_listener *listener, void *data) { struct xwayland_unmanaged *unmanaged = wl_container_of(listener, unmanaged, destroy); wl_list_remove(&unmanaged->request_configure.link); - wl_list_remove(&unmanaged->override_redirect.link); + wl_list_remove(&unmanaged->set_override_redirect.link); wl_list_remove(&unmanaged->request_activate.link); wl_list_remove(&unmanaged->map.link); wl_list_remove(&unmanaged->unmap.link); @@ -131,25 +131,25 @@ unmanaged_handle_destroy(struct wl_listener *listener, void *data) } static void -unmanaged_handle_override_redirect(struct wl_listener *listener, void *data) +handle_set_override_redirect(struct wl_listener *listener, void *data) { wlr_log(WLR_DEBUG, "handle unmanaged override_redirect"); struct xwayland_unmanaged *unmanaged = - wl_container_of(listener, unmanaged, override_redirect); + wl_container_of(listener, unmanaged, set_override_redirect); struct wlr_xwayland_surface *xsurface = unmanaged->xwayland_surface; struct server *server = unmanaged->server; bool mapped = xsurface->mapped; if (mapped) { - unmanaged_handle_unmap(&unmanaged->unmap, NULL); + handle_unmap(&unmanaged->unmap, NULL); } - unmanaged_handle_destroy(&unmanaged->destroy, NULL); + handle_destroy(&unmanaged->destroy, NULL); xwayland_view_create(server, xsurface, mapped); } static void -unmanaged_handle_request_activate(struct wl_listener *listener, void *data) +handle_request_activate(struct wl_listener *listener, void *data) { wlr_log(WLR_DEBUG, "handle unmanaged request_activate"); struct xwayland_unmanaged *unmanaged = @@ -191,29 +191,14 @@ xwayland_unmanaged_create(struct server *server, */ assert(!xsurface->data); - wl_signal_add(&xsurface->events.request_configure, - &unmanaged->request_configure); - unmanaged->request_configure.notify = - unmanaged_handle_request_configure; - - wl_signal_add(&xsurface->events.map, &unmanaged->map); - unmanaged->map.notify = unmanaged_handle_map; - - wl_signal_add(&xsurface->events.unmap, &unmanaged->unmap); - unmanaged->unmap.notify = unmanaged_handle_unmap; - - wl_signal_add(&xsurface->events.destroy, &unmanaged->destroy); - unmanaged->destroy.notify = unmanaged_handle_destroy; - - wl_signal_add(&xsurface->events.set_override_redirect, - &unmanaged->override_redirect); - unmanaged->override_redirect.notify = unmanaged_handle_override_redirect; - - wl_signal_add(&xsurface->events.request_activate, - &unmanaged->request_activate); - unmanaged->request_activate.notify = unmanaged_handle_request_activate; + CONNECT_SIGNAL(xsurface, unmanaged, map); + CONNECT_SIGNAL(xsurface, unmanaged, unmap); + CONNECT_SIGNAL(xsurface, unmanaged, destroy); + CONNECT_SIGNAL(xsurface, unmanaged, request_activate); + CONNECT_SIGNAL(xsurface, unmanaged, request_configure); + CONNECT_SIGNAL(xsurface, unmanaged, set_override_redirect); if (mapped) { - unmanaged_handle_map(&unmanaged->map, xsurface); + handle_map(&unmanaged->map, xsurface); } } diff --git a/src/xwayland.c b/src/xwayland.c index 74f466c0..e6dfe5ed 100644 --- a/src/xwayland.c +++ b/src/xwayland.c @@ -3,6 +3,7 @@ #include #include #include +#include "common/macros.h" #include "common/mem.h" #include "labwc.h" #include "node.h" @@ -275,9 +276,9 @@ handle_destroy(struct wl_listener *listener, void *data) /* Remove XWayland view specific listeners */ 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); + wl_list_remove(&xwayland_view->set_class.link); wl_list_remove(&xwayland_view->set_decorations.link); - wl_list_remove(&xwayland_view->override_redirect.link); + wl_list_remove(&xwayland_view->set_override_redirect.link); view_destroy(view); } @@ -375,7 +376,7 @@ static void handle_set_class(struct wl_listener *listener, void *data) { struct xwayland_view *xwayland_view = - wl_container_of(listener, xwayland_view, set_app_id); + wl_container_of(listener, xwayland_view, set_class); struct view *view = &xwayland_view->base; view_update_app_id(view); } @@ -424,10 +425,10 @@ handle_set_decorations(struct wl_listener *listener, void *data) } static void -handle_override_redirect(struct wl_listener *listener, void *data) +handle_set_override_redirect(struct wl_listener *listener, void *data) { struct xwayland_view *xwayland_view = - wl_container_of(listener, xwayland_view, override_redirect); + wl_container_of(listener, xwayland_view, set_override_redirect); struct view *view = &xwayland_view->base; struct wlr_xwayland_surface *xsurface = xwayland_view->xwayland_surface; @@ -782,41 +783,22 @@ xwayland_view_create(struct server *server, view->scene_tree = wlr_scene_tree_create(view->workspace->tree); node_descriptor_create(&view->scene_tree->node, LAB_NODE_DESC_VIEW, view); - view->map.notify = handle_map; - wl_signal_add(&xsurface->events.map, &view->map); - view->unmap.notify = handle_unmap; - wl_signal_add(&xsurface->events.unmap, &view->unmap); - view->destroy.notify = handle_destroy; - wl_signal_add(&xsurface->events.destroy, &view->destroy); - view->request_minimize.notify = handle_request_minimize; - wl_signal_add(&xsurface->events.request_minimize, &view->request_minimize); - view->request_maximize.notify = handle_request_maximize; - wl_signal_add(&xsurface->events.request_maximize, &view->request_maximize); - view->request_fullscreen.notify = handle_request_fullscreen; - wl_signal_add(&xsurface->events.request_fullscreen, &view->request_fullscreen); - view->request_move.notify = handle_request_move; - wl_signal_add(&xsurface->events.request_move, &view->request_move); - view->request_resize.notify = handle_request_resize; - wl_signal_add(&xsurface->events.request_resize, &view->request_resize); - - view->set_title.notify = handle_set_title; - wl_signal_add(&xsurface->events.set_title, &view->set_title); + CONNECT_SIGNAL(xsurface, view, map); + CONNECT_SIGNAL(xsurface, view, unmap); + CONNECT_SIGNAL(xsurface, view, destroy); + CONNECT_SIGNAL(xsurface, view, request_minimize); + CONNECT_SIGNAL(xsurface, view, request_maximize); + CONNECT_SIGNAL(xsurface, view, request_fullscreen); + CONNECT_SIGNAL(xsurface, view, request_move); + CONNECT_SIGNAL(xsurface, view, request_resize); + CONNECT_SIGNAL(xsurface, view, set_title); /* 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); + CONNECT_SIGNAL(xsurface, xwayland_view, request_activate); + CONNECT_SIGNAL(xsurface, xwayland_view, request_configure); + CONNECT_SIGNAL(xsurface, xwayland_view, set_class); + CONNECT_SIGNAL(xsurface, xwayland_view, set_decorations); + CONNECT_SIGNAL(xsurface, xwayland_view, set_override_redirect); wl_list_insert(&view->server->views, &view->link);