tCleanup code style and add comments - spkp - Stacking wayland compositor
(HTM) git clone git://git.z3bra.org/spkp.git
(DIR) Log
(DIR) Files
(DIR) Refs
---
(DIR) commit 309db35851509a986a45ced6182bb73f2ff18af5
(DIR) parent 04b58256de532860bd83b89a2137732da40f057b
(HTM) Author: Willy Goiffon <dev@z3bra.org>
Date: Tue, 10 Nov 2020 10:37:40 +0100
Cleanup code style and add comments
Diffstat:
M compositor.c | 102 ++++++++++++++++++++++---------
1 file changed, 74 insertions(+), 28 deletions(-)
---
(DIR) diff --git a/compositor.c b/compositor.c
t@@ -34,7 +34,7 @@ enum {
RESIZE,
};
-/* keep track of internal compositor state */
+/* Internal compositor state */
struct state {
struct wl_display *dpy;
struct wlr_backend *backend;
t@@ -67,7 +67,7 @@ struct state {
struct wl_list keyboards;
};
-/* compositor output */
+/* Display output (usually a monitor) */
struct output {
struct state *server;
struct wlr_output *wlr_output;
t@@ -80,7 +80,7 @@ struct output {
struct wl_list link;
};
-/* client surface window */
+/* Client surface window */
struct window {
struct state *server;
struct wlr_xdg_surface *surface;
t@@ -106,6 +106,7 @@ struct keyboard {
struct wl_list link;
};
+/* Rendering data, used to render window's surfaces */
struct rdata {
struct wlr_output *output;
struct window *window;
t@@ -113,6 +114,7 @@ struct rdata {
struct timespec when;
};
+
static void usage(char *);
/* callback functions triggered when a new event occur */
t@@ -136,6 +138,7 @@ static void cb_click(struct wl_listener *, void *);
static void cb_scroll(struct wl_listener *, void *);
static void cb_paint_cursor(struct wl_listener *, void *);
+/* helper functions, used inside callbacks */
static void add_keyboard(struct state *, struct wlr_input_device *);
static void add_pointer(struct state *, struct wlr_input_device *);
static void render(struct wlr_surface *, int, int, void *);
t@@ -151,7 +154,8 @@ usage(char *pgm)
}
/*
- * A new input device is available
+ * A new input device is available. Each new input type is added to the
+ * capabilities of the seat.
*/
void
cb_new_input(struct wl_listener *listener, void *data)
t@@ -226,18 +230,16 @@ cb_new_output(struct wl_listener *listener, void *data)
/* create global and arrange outputs from left to right */
wlr_output_layout_add_auto(server->layout, wlr_output);
- wlr_xcursor_manager_load(server->cursor_mgr, 1);
- wlr_xcursor_manager_set_cursor_image(server->cursor_mgr, "left_ptr", server->cursor);
}
/*
- * Output gets disconnected. Remove it from the list and release memory
+ * Output gets disconnected. Remove it from the list and release memory.
*/
void
cb_destroy_output(struct wl_listener *listener, void *data)
{
- struct output *output;
(void)data;
+ struct output *output;
output = wl_container_of(listener, output, destroy);
t@@ -251,6 +253,10 @@ cb_destroy_output(struct wl_listener *listener, void *data)
/*
* Output is displaying a frame. This would be called 60 times per
* seconds on a 60Hz monitor.
+ * Windows will be rendered on top of each others, starting from the
+ * bottom of the window list.
+ *
+ * TODO: damage tracking
*/
void
cb_frame_output(struct wl_listener *listener, void *data)
t@@ -298,7 +304,11 @@ cb_frame_output(struct wl_listener *listener, void *data)
}
/*
- * A new application window (or view) is created.
+ * A new application window is created. Only top-level windows are
+ * supported and rendered.
+ *
+ * TODO: better window placement
+ * TODO: client size/position hint support
*/
void
cb_new_window(struct wl_listener *listener, void *data)
t@@ -335,14 +345,13 @@ cb_new_window(struct wl_listener *listener, void *data)
}
/*
- * Request from a client to be mapped on-screen
+ * Request from a client to be mapped on-screen.
*/
void
cb_map_window(struct wl_listener *listener, void *data)
{
- struct window *w;
-
(void)data;
+ struct window *w;
w = wl_container_of(listener, w, map);
w->mapped = 1;
t@@ -351,40 +360,40 @@ cb_map_window(struct wl_listener *listener, void *data)
}
/*
- * Request from a client to be unmapped on-screen
+ * Request from a client to be unmapped on-screen.
*/
void
cb_unmap_window(struct wl_listener *listener, void *data)
{
- struct window *w;
-
(void)data;
+ struct window *w;
w = wl_container_of(listener, w, map);
w->mapped = 0;
}
/*
- * Release all resources associated to a window
+ * Release all resources associated to a window.
*/
void
cb_destroy_window(struct wl_listener *listener, void *data)
{
- struct window *w;
-
(void)data;
+ struct window *w;
w = wl_container_of(listener, w, destroy);
wl_list_remove(&w->link);
free(w);
}
+/*
+ * A modifier key is pressed, or depressed.
+ */
void
cb_kb_mod(struct wl_listener *listener, void *data)
{
- struct keyboard *kb;
-
(void)data;
+ struct keyboard *kb;
kb = wl_container_of(listener, kb, modifiers);
t@@ -392,6 +401,9 @@ cb_kb_mod(struct wl_listener *listener, void *data)
wlr_seat_keyboard_notify_modifiers(kb->server->seat, &kb->device->keyboard->modifiers);
}
+/*
+ * A key is pressed, or depressed.
+ */
void
cb_kb_key(struct wl_listener *listener, void *data)
{
t@@ -425,6 +437,9 @@ cb_kb_key(struct wl_listener *listener, void *data)
}
}
+/*
+ * Client request to change the cursor frame.
+ */
void
cb_req_cursor(struct wl_listener *listener, void *data)
{
t@@ -440,7 +455,12 @@ cb_req_cursor(struct wl_listener *listener, void *data)
wlr_cursor_set_surface(server->cursor, ev->surface, ev->hotspot_x, ev->hotspot_y);
}
-
+/*
+ * Generic callback for pointer motion (relative or absolute).
+ * Depending on the server grab mode, windows will be moved or resized.
+ * If no grab mode is set, motion events are simply passed down to
+ * the client underneath the pointer.
+ */
void
cb_motion(struct state *server, uint32_t time)
{
t@@ -497,7 +517,9 @@ cb_motion(struct state *server, uint32_t time)
}
/*
- * Cursor moved, reporting relative coordinates.
+ * Move the cursor according to input device request. This event is
+ * triggered when the cursor is moving from a relative offset from its
+ * current position.
*/
void
cb_motion_relative(struct wl_listener *listener, void *data)
t@@ -512,6 +534,10 @@ cb_motion_relative(struct wl_listener *listener, void *data)
cb_motion(server, ev->time_msec);
}
+/*
+ * Move the cursor according to input device request. This event is
+ * triggered when the cursor is given an absolute position to move to.
+ */
void
cb_motion_absolute(struct wl_listener *listener, void *data)
{
t@@ -525,6 +551,12 @@ cb_motion_absolute(struct wl_listener *listener, void *data)
cb_motion(server, ev->time_msec);
}
+/*
+ * A mouse button is pressed, or released. If the given modifiers are
+ * pressed wilst pressing the button, the underlying window (if any!) will
+ * be moved or resized.
+ * Any mouse event will be ignored until the button is released.
+ */
void
cb_click(struct wl_listener *listener, void *data)
{
t@@ -577,9 +609,11 @@ cb_click(struct wl_listener *listener, void *data)
wlr_seat_pointer_notify_enter(server->seat, surface, sx, sy);
focus(w, surface);
-
}
+/*
+ * Mouse scroll. Passed down to the underlying client.
+ */
void
cb_scroll(struct wl_listener *listener, void *data)
{
t@@ -593,12 +627,14 @@ cb_scroll(struct wl_listener *listener, void *data)
ev->delta, ev->delta_discrete, ev->source);
}
+/*
+ * Request to re-paint the cursor.
+ */
void
cb_paint_cursor(struct wl_listener *listener, void *data)
{
- struct state *server;
-
(void)data;
+ struct state *server;
server = wl_container_of(listener, server, paint_cursor);
t@@ -606,7 +642,7 @@ cb_paint_cursor(struct wl_listener *listener, void *data)
}
/*
- * Configure a newly added keyboard
+ * Configure a newly added keyboard.
*/
void
add_keyboard(struct state *server, struct wlr_input_device *device)
t@@ -641,7 +677,7 @@ add_keyboard(struct state *server, struct wlr_input_device *device)
}
/*
- * Configure a newly added pointer device
+ * Configure a newly added pointer device.
*/
void
add_pointer(struct state *server, struct wlr_input_device *device)
t@@ -650,6 +686,9 @@ add_pointer(struct state *server, struct wlr_input_device *device)
wlr_cursor_attach_input_device(server->cursor, device);
}
+/*
+ * Render a full surface on-screen, at the given position.
+ */
void
render(struct wlr_surface *surface, int x, int y, void *data)
{
t@@ -683,7 +722,7 @@ render(struct wlr_surface *surface, int x, int y, void *data)
}
/*
- * Set keyboard focus on the given top-level window
+ * Set keyboard focus on the given top-level window.
*/
void
focus(struct window *window, struct wlr_surface *surface)
t@@ -714,6 +753,9 @@ focus(struct window *window, struct wlr_surface *surface)
kb->keycodes, kb->num_keycodes, &kb->modifiers);
}
+/*
+ * Execute specific functions when an modifier/key combination is pressed.
+ */
int
keybinding(struct state *server, uint32_t mod, uint32_t key)
{
t@@ -729,6 +771,9 @@ keybinding(struct state *server, uint32_t mod, uint32_t key)
return 0;
}
+/*
+ * Return the topmost window pointer at the given position.
+ */
struct window *
underneath(struct state *server, double x, double y)
{
t@@ -803,6 +848,7 @@ main(int argc, char *argv[])
wl_display_init_shm(server.dpy);
wlr_renderer_init_wl_display(server.renderer, server.dpy);
+ wlr_xcursor_manager_load(server.cursor_mgr, 1);
wlr_cursor_attach_output_layout(server.cursor, server.layout);
wlr_compositor_create(server.dpy, server.renderer);