*/
#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.<name>
+ * - the wl_listener is (*dest).<name>
+ * - the signal handler function is named handle_<name>
+ */
+#define CONNECT_SIGNAL(src, dest, name) \
+ (dest)->name.notify = handle_##name; \
+ wl_signal_add(&(src)->events.name, &(dest)->name)
+
#endif /* LABWC_MACROS_H */
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 {
/* 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; */
"PREFER_FALLTHROUGH",
"INITIALISED_STATIC",
"UNNECESSARY_ELSE",
+ "MACRO_ARG_PRECEDENCE",
);
my $help = 0;
my $configuration_file = ".checkpatch.conf";
// SPDX-License-Identifier: GPL-2.0-only
#include <assert.h>
+#include "common/macros.h"
#include "common/mem.h"
#include "decorations.h"
#include "labwc.h"
}
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);
/* 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);
}
#include <assert.h>
#include <wlr/xwayland.h>
#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);
}
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);
}
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);
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);
}
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);
}
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);
}
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 =
*/
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);
}
}
#include <assert.h>
#include <stdlib.h>
#include <wlr/xwayland.h>
+#include "common/macros.h"
#include "common/mem.h"
#include "labwc.h"
#include "node.h"
/* 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);
}
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);
}
}
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;
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);