switch to meson build + refactor code to remove compile warning

This commit is contained in:
DanyLE
2025-07-05 20:33:49 +02:00
parent 13543e1382
commit 0a77ed8d91
13 changed files with 128 additions and 66 deletions

6
.gitignore vendored
View File

@ -139,7 +139,5 @@ m4/lt~obsolete.m4
# can automatically generate from config.status script
# (which is called by configure script))
# Makefile
xdg-shell-protocol.*
diyac
.vscode
wlr-layer-shell-unstable-v1-protocol*
build
.vscode

View File

@ -1,53 +0,0 @@
WAYLAND_PROTOCOLS=$(shell pkg-config --variable=pkgdatadir wayland-protocols)
WAYLAND_SCANNER=$(shell pkg-config --variable=wayland_scanner wayland-scanner)
LIBS=\
$(shell pkg-config --cflags --libs wlroots) \
$(shell pkg-config --cflags --libs wayland-server) \
$(shell pkg-config --cflags --libs xkbcommon)
OBJS=\
diyac.c \
cursor.c \
output.c \
seat.c \
node.c \
view.c \
foreign.c \
xdg.c \
xdg-shell-protocol.c \
layer.c \
session.c \
wlr-layer-shell-unstable-v1-protocol.c
# wayland-scanner is a tool which generates C headers and rigging for Wayland
# protocols, which are specified in XML. wlroots requires you to rig these up
# to your build system yourself and provide them in the include path.
xdg-shell-protocol.h:
$(WAYLAND_SCANNER) server-header \
$(WAYLAND_PROTOCOLS)/stable/xdg-shell/xdg-shell.xml $@
xdg-shell-protocol.c: xdg-shell-protocol.h
$(WAYLAND_SCANNER) private-code \
$(WAYLAND_PROTOCOLS)/stable/xdg-shell/xdg-shell.xml $@
wlr-layer-shell-unstable-v1-protocol.c: wlr-layer-shell-unstable-v1-protocol.h
$(WAYLAND_SCANNER) private-code \
protocol/wlr-layer-shell-unstable-v1.xml $@
wlr-layer-shell-unstable-v1-protocol.h:
$(WAYLAND_SCANNER) server-header \
protocol/wlr-layer-shell-unstable-v1.xml $@
diyac: $(OBJS)
echo "Object is $(OBJS)"
$(CC) $(CFLAGS) \
-g -Werror -I. \
-DWLR_USE_UNSTABLE \
-o $@ $(OBJS) \
$(LIBS)
clean:
rm -f diyac xdg-shell-protocol.* wlr-layer-shell-unstable-v1-protocol.*
.DEFAULT_GOAL=diyac
.PHONY: clean

View File

@ -13,7 +13,7 @@ void diyac_cursor_focus(struct diyac_server *server)
struct diyac_node_descriptor *desc = diyac_node_at(server,
server->seat.cursor->x, server->seat.cursor->y, &surface, &sx, &sy);
struct diyac_layer_surface *layer;
struct diyac_view *root = NULL;
// struct diyac_view *root = NULL;
if (!desc)
{
return;
@ -55,6 +55,7 @@ void diyac_reset_cursor_mode(struct diyac_server *server)
static void process_cursor_move(struct diyac_server *server, uint32_t time)
{
(void) time;
struct diyac_view *toplevel = server->grabbed_view;
/* Move the grabbed toplevel to the new position. */
if(!toplevel->output)
@ -84,6 +85,7 @@ static void process_cursor_move(struct diyac_server *server, uint32_t time)
static void process_cursor_resize(struct diyac_server *server, uint32_t time)
{
(void) time;
/*
* Resizing the grabbed toplevel can be a little bit complicated, because we
* could be resizing from any corner or edge. This not only resizes the
@ -252,7 +254,7 @@ static void server_cursor_button(struct wl_listener *listener, void *data)
wlr_seat_pointer_notify_button(seat->wlr_seat,
event->time_msec, event->button, event->state);
if (event->state == WLR_BUTTON_RELEASED)
if (event->state == WL_POINTER_BUTTON_STATE_RELEASED)
{
/* If you released any buttons, we exit interactive move/resize mode. */
diyac_reset_cursor_mode(seat->server);
@ -278,6 +280,7 @@ static void server_cursor_axis(struct wl_listener *listener, void *data)
static void server_cursor_frame(struct wl_listener *listener, void *data)
{
(void) data;
/* This event is forwarded by the cursor when a pointer emits an frame
* event. Frame events are sent after regular pointer events to group
* multiple events together. For instance, two axis events may happen at the

View File

@ -24,9 +24,15 @@
void help()
{
printf("diyac - a simple Wayland compositor\n");
printf("Usage: diyac [-x] [startup command]\n");
printf("Options:\n");
printf(" -x exit with the session\n");
printf(" -v increase log level\n");
printf(" -h show this help message\n");
#ifdef __COMPOSITOR_VERSION__
printf("Version: %s\n", __COMPOSITOR_VERSION__);
#endif
}
/**

View File

@ -29,6 +29,7 @@ static void handle_request_fullscreen(struct wl_listener *listener, void *data)
static void handle_request_activate(struct wl_listener *listener, void *data)
{
(void) data;
struct diyac_view *view = wl_container_of(listener, view, toplevel.activate);
// struct wlr_foreign_toplevel_handle_v1_activated_event *event = data;
/* In a multi-seat world we would select seat based on event->seat here. */
@ -39,6 +40,7 @@ static void handle_request_activate(struct wl_listener *listener, void *data)
static void
handle_request_close(struct wl_listener *listener, void *data)
{
(void) data;
struct diyac_view *view = wl_container_of(listener, view, toplevel.close);
wlr_xdg_toplevel_send_close(view->xdg_toplevel);
}
@ -46,6 +48,7 @@ handle_request_close(struct wl_listener *listener, void *data)
static void
handle_destroy(struct wl_listener *listener, void *data)
{
(void) data;
struct diyac_view *view = wl_container_of(listener, view, toplevel.destroy);
struct foreign_toplevel *toplevel = &view->toplevel;
wl_list_remove(&toplevel->maximize.link);

View File

@ -53,6 +53,7 @@ static void process_keyboard_interactivity(struct diyac_layer_surface *layer)
}
static void layer_surface_commit(struct wl_listener *listener, void *data)
{
(void) data;
struct diyac_layer_surface *layer =
wl_container_of(listener, layer, surface_commit);
struct wlr_layer_surface_v1 *layer_surface =
@ -94,6 +95,7 @@ static void layer_surface_commit(struct wl_listener *listener, void *data)
}
static void layer_surface_unmap(struct wl_listener *listener, void *data)
{
(void) data;
struct diyac_layer_surface *layer = wl_container_of(listener, layer, unmap);
struct wlr_layer_surface_v1 *layer_surface =
layer->scene_layer_surface->layer_surface;
@ -109,6 +111,7 @@ static void layer_surface_unmap(struct wl_listener *listener, void *data)
static void layer_surface_map(struct wl_listener *listener, void *data)
{
(void) data;
struct diyac_layer_surface *layer = wl_container_of(listener, layer, map);
struct wlr_output *wlr_output =
layer->scene_layer_surface->layer_surface->output;
@ -127,6 +130,7 @@ static void layer_surface_map(struct wl_listener *listener, void *data)
}
static void layer_surface_node_destroy(struct wl_listener *listener, void *data)
{
(void) data;
struct diyac_layer_surface *layer =
wl_container_of(listener, layer, node_destroy);
@ -142,6 +146,7 @@ static void layer_surface_node_destroy(struct wl_listener *listener, void *data)
}
static void layer_surface_output_destroy(struct wl_listener *listener, void *data)
{
(void) data;
struct diyac_layer_surface *layer =
wl_container_of(listener, layer, output_destroy);
layer->scene_layer_surface->layer_surface->output = NULL;
@ -150,6 +155,7 @@ static void layer_surface_output_destroy(struct wl_listener *listener, void *dat
static void
popup_handle_destroy(struct wl_listener *listener, void *data)
{
(void)data;
struct diyac_popup *popup = wl_container_of(listener, popup, destroy);
wl_list_remove(&popup->destroy.link);
wl_list_remove(&popup->new_popup.link);
@ -165,6 +171,7 @@ popup_handle_destroy(struct wl_listener *listener, void *data)
static void popup_handle_commit(struct wl_listener *listener, void *data)
{
(void)data;
struct diyac_popup *popup =
wl_container_of(listener, popup, commit);
struct wlr_box popup_box ;

73
meson.build Normal file
View File

@ -0,0 +1,73 @@
project('diyac',
['c'],
version: '0.1.0',
license: 'MIT',
meson_version: '>=0.58.0',
default_options: ['c_std=gnu11', 'warning_level=3'])
lib_so_version = '0'
add_project_arguments(
[
'-Wno-pedantic',
'-Werror=implicit-function-declaration',
'-Werror=return-type',
'-DWLR_USE_UNSTABLE',
'-D__COMPOSITOR_VERSION__="@0@"'.format(meson.project_version())
],
language: 'c')
wlroots = dependency('wlroots')
wayland_server = dependency('wayland-server', version: '>=1.10.0')
xkbcommon = dependency('xkbcommon')
# wayland_scanner is required, but we can find it without pkg-config
wayland_scanner = find_program('wayland-scanner')
wayland_protocols = dependency('wayland-protocols', version: '>=1.16')
wl_protocol_dir = wayland_protocols.get_variable('pkgdatadir')
wayland_targets=[]
wl_protocols = [
wl_protocol_dir / 'stable/xdg-shell/xdg-shell',
'protocol/wlr-layer-shell-unstable-v1',
]
foreach proto : wl_protocols
xml = ''.join([proto,'.xml'])
header = ''.join([proto.split('/').get(-1),'.h'])
cfile = ''.join([proto.split('/').get(-1),'.c'])
wayland_targets += custom_target(header,output:header,input:xml,
command: [ wayland_scanner, 'server-header', '@INPUT@', '@OUTPUT@' ] )
wayland_targets += custom_target(cfile,output:cfile,input:xml,
command: [ wayland_scanner, 'private-code', '@INPUT@', '@OUTPUT@' ] )
endforeach
incdir = include_directories([
])
src = [
'diyac.c',
'cursor.c',
'output.c',
'seat.c',
'node.c',
'view.c',
'foreign.c',
'xdg.c',
'layer.c',
'session.c',
wayland_targets
]
buil_dep = [wlroots, wayland_server, xkbcommon]
executable(
'diyac',
src,
dependencies: buil_dep,
include_directories : incdir)

1
node.c
View File

@ -5,6 +5,7 @@
static void destroy_notify(struct wl_listener *listener, void *data)
{
(void)data;
struct diyac_node_descriptor *node_descriptor =
wl_container_of(listener, node_descriptor, destroy);
wl_list_remove(&node_descriptor->destroy.link);

View File

@ -11,6 +11,7 @@
static void output_frame(struct wl_listener *listener, void *data)
{
(void) data;
/* This function is called every time an output is ready to display a frame,
* generally at the output's refresh rate (e.g. 60Hz). */
struct diyac_output *output = wl_container_of(listener, output, frame);
@ -39,6 +40,7 @@ static void output_request_state(struct wl_listener *listener, void *data)
static void output_destroy(struct wl_listener *listener, void *data)
{
(void)data;
struct diyac_output *output = wl_container_of(listener, output, destroy);
if(output->lock_handle)
{

3
seat.c
View File

@ -10,6 +10,7 @@
static void configure_keyboard(struct diyac_seat* seat, struct diyac_input* input, bool force)
{
(void) seat;
struct wlr_input_device *device = input->device;
assert(device->type == WLR_INPUT_DEVICE_KEYBOARD);
struct diyac_keyboard *keyboard = (struct diyac_keyboard *)input;
@ -41,6 +42,7 @@ static void configure_keyboard(struct diyac_seat* seat, struct diyac_input* inpu
static void keyboard_handle_modifiers(
struct wl_listener *listener, void *data)
{
(void) data;
/* This event is raised when a modifier key, such as shift or alt, is
* pressed. We simply communicate this to the client. */
struct diyac_keyboard *keyboard =
@ -128,6 +130,7 @@ static void keyboard_handle_key(
static void input_handle_destroy(struct wl_listener *listener, void *data)
{
(void) data;
/* This event is raised by the keyboard base wlr_input_device to signal
* the destruction of the wlr_keyboard. It will no longer receive events
* and should be destroyed.

View File

@ -39,6 +39,7 @@ static void session_lock_update_geometry(struct diyac_output *output, bool align
static void handle_surface_map(struct wl_listener *listener, void *data)
{
(void) data;
struct diyac_output_lock_handle *handle = wl_container_of(listener, handle, surface_map);
if (!g_server->lock->focused)
{
@ -49,6 +50,7 @@ static void handle_surface_map(struct wl_listener *listener, void *data)
static void handle_surface_destroy(struct wl_listener *listener, void *data)
{
(void) data;
struct diyac_output_lock_handle *handle = wl_container_of(listener, handle, surface_destroy);
if (g_server->lock->focused == handle->surface->surface)
@ -123,6 +125,7 @@ static void session_lock_destroy(struct diyac_session_lock *lock)
static void handle_unlock(struct wl_listener *listener, void *data)
{
(void) data;
struct diyac_session_lock *lock = wl_container_of(listener, lock, unlock);
wlr_log(WLR_INFO, "handle_unlock: Lock session is unlocked");
session_lock_destroy(lock);
@ -131,6 +134,7 @@ static void handle_unlock(struct wl_listener *listener, void *data)
static void handle_session_lock_destroy(struct wl_listener *listener, void *data)
{
(void) data;
struct diyac_session_lock *lock = wl_container_of(listener, lock, destroy);
lock->abandoned = true;
wlr_log(WLR_INFO, "handle_session_lock_destroy: Lock session is destroyed without unlocking, session abandoned");
@ -141,6 +145,7 @@ static void handle_session_lock_destroy(struct wl_listener *listener, void *data
static void handle_new_session_lock(struct wl_listener *listener, void *data)
{
(void) listener;
struct wlr_session_lock_v1 *lock = data;
if (g_server->lock)
{
@ -200,6 +205,8 @@ static void handle_commit(struct wl_listener *listener, void *data)
static void handle_lock_manager_destroy(struct wl_listener *listener, void *data)
{
(void) data;
(void) listener;
if (g_server->lock)
{
session_lock_destroy(g_server->lock);
@ -245,9 +252,9 @@ void diyac_session_lock_output(struct diyac_output *output)
handle->background = wlr_scene_rect_create(handle->tree, 0, 0, black);
if (!handle->background)
{
wlr_scene_node_destroy(&handle->tree->node);
free(handle);
wlr_log(WLR_ERROR, "diyac_session_lock_output:Unable to create lock background");
wlr_scene_node_destroy(&handle->tree->node);
exit(EXIT_FAILURE);
}
handle->surface = NULL;

4
view.c
View File

@ -183,8 +183,8 @@ void diyac_focus_topmost_view(struct diyac_server *server, bool raise)
struct diyac_view *diyac_topmost_focusable_view(struct diyac_server *server)
{
struct wlr_surface *prev =
server->seat.wlr_seat->keyboard_state.focused_surface;
//struct wlr_surface *prev =
// server->seat.wlr_seat->keyboard_state.focused_surface;
struct diyac_view *view;
struct wl_list *node_list;
struct wlr_scene_node *node;

20
xdg.c
View File

@ -55,6 +55,7 @@ static void begin_interactive(struct diyac_view *toplevel,
}
static void xdg_toplevel_commit(struct wl_listener *listener, void *data)
{
(void)data;
struct diyac_view *toplevel = wl_container_of(listener, toplevel, commit);
uint32_t serial = toplevel->configuration_serial;
@ -84,6 +85,7 @@ static void xdg_toplevel_commit(struct wl_listener *listener, void *data)
}
static void xdg_toplevel_map(struct wl_listener *listener, void *data)
{
(void)data;
wlr_log(WLR_INFO, "xdg_toplevel_map: %p", listener);
/* Called when the surface is mapped, or ready to display on-screen. */
struct diyac_view *toplevel = wl_container_of(listener, toplevel, map);
@ -120,6 +122,7 @@ static void xdg_toplevel_map(struct wl_listener *listener, void *data)
static void xdg_toplevel_unmap(struct wl_listener *listener, void *data)
{
(void)data;
/* Called when the surface is unmapped, and should no longer be shown. */
struct diyac_view *toplevel = wl_container_of(listener, toplevel, unmap);
toplevel->mapped = false;
@ -158,6 +161,7 @@ static void xdg_toplevel_unmap(struct wl_listener *listener, void *data)
static void xdg_toplevel_request_move(
struct wl_listener *listener, void *data)
{
(void)data;
/* This event is raised when a client would like to begin an interactive
* move, typically because the user clicked on their client-side
* decorations. Note that a more sophisticated compositor should check the
@ -184,6 +188,7 @@ static void xdg_toplevel_request_resize(
static void xdg_toplevel_request_maximize(
struct wl_listener *listener, void *data)
{
(void)data;
/* This event is raised when a client would like to maximize itself,
* typically because the user clicked on the maximize button on
* client-side decorations. diyac doesn't support maximization, but
@ -197,6 +202,7 @@ static void xdg_toplevel_request_maximize(
static void xdg_toplevel_request_fullscreen(struct wl_listener *listener, void *data)
{
(void)data;
struct diyac_view *toplevel =
wl_container_of(listener, toplevel, request_fullscreen);
diyac_view_set_fullscreen(toplevel, toplevel->xdg_toplevel->requested.fullscreen);
@ -204,6 +210,7 @@ static void xdg_toplevel_request_fullscreen(struct wl_listener *listener, void *
static void xdg_toplevel_request_minimize(struct wl_listener *listener, void *data)
{
(void)data;
struct diyac_view *toplevel =
wl_container_of(listener, toplevel, request_minimize);
diyac_view_set_mimimize(toplevel, toplevel->xdg_toplevel->requested.minimized);
@ -211,6 +218,7 @@ static void xdg_toplevel_request_minimize(struct wl_listener *listener, void *da
static void xdg_toplevel_destroy(struct wl_listener *listener, void *data)
{
(void)data;
/* Called when the xdg_toplevel is destroyed. */
struct diyac_view *toplevel = wl_container_of(listener, toplevel, destroy);
if (toplevel->toplevel.handle)
@ -243,6 +251,7 @@ static void xdg_toplevel_destroy(struct wl_listener *listener, void *data)
static void handle_xdg_popup_destroy(struct wl_listener *listener, void *data)
{
(void)data;
struct diyac_popup *popup = wl_container_of(listener, popup, destroy);
wl_list_remove(&popup->destroy.link);
wl_list_remove(&popup->new_popup.link);
@ -262,9 +271,9 @@ static void popup_unconstrain(struct diyac_popup *popup)
{
return;
}
struct diyac_server *server = view->server;
struct wlr_output_layout *output_layout = server->output_layout;
struct wlr_output *wlr_output = view->output->wlr_output;
// struct diyac_server *server = view->server;
//struct wlr_output_layout *output_layout = server->output_layout;
//struct wlr_output *wlr_output = view->output->wlr_output;
struct wlr_box usable = {
.x = 0,
.y = 0,
@ -287,6 +296,7 @@ static void popup_unconstrain(struct diyac_popup *popup)
static void handle_xdg_popup_commit(struct wl_listener *listener, void *data)
{
(void)data;
struct diyac_popup *popup = wl_container_of(listener, popup, commit);
struct wlr_box popup_box;
wlr_xdg_surface_get_geometry(popup->wlr_popup->base, &popup_box);
@ -294,7 +304,7 @@ static void handle_xdg_popup_commit(struct wl_listener *listener, void *data)
if (!wlr_box_empty(&popup_box))
// if (popup->wlr_popup->base->initial_commit)
{
struct diyac_view *view = popup->parent;
// struct diyac_view *view = popup->parent;
// wlr_output_commit(view->output->wlr_output);
/* Prevent getting called over and over again */
wl_list_remove(&popup->commit.link);
@ -366,12 +376,14 @@ static void xdg_popup_create(struct diyac_view *view, struct wlr_xdg_popup *wlr_
static void xdg_set_appid_notify(struct wl_listener *listener, void *data)
{
(void)data;
struct diyac_view *view = wl_container_of(listener, view, set_app_id);
diyac_view_update_app_id(view);
}
static void xdg_set_title_notify(struct wl_listener *listener, void *data)
{
(void)data;
struct diyac_view *view = wl_container_of(listener, view, set_title);
diyac_view_update_title(view);
}