diff options
| -rw-r--r-- | Makefile | 3 | ||||
| -rw-r--r-- | src/utils.h | 50 | ||||
| -rw-r--r-- | src/wayclock.cc | 12 | ||||
| -rw-r--r-- | src/wlstate.cc | 19 | ||||
| -rw-r--r-- | src/wlstate.h | 13 | ||||
| -rw-r--r-- | src/xdg-shell.h | 167 |
6 files changed, 168 insertions, 96 deletions
@@ -34,7 +34,8 @@ XDG_SHELL_PROT = $(WORK_DIR)/xdg-shell.xml WAYCLOCK = $(WORK_DIR)/wayclock SOURCES = \ $(SRC_DIR)/wayclock.cc \ - $(SRC_DIR)/xdg-shell.c + $(SRC_DIR)/xdg-shell.c \ + $(SRC_DIR)/wlstate.c OBJECTS := $(SOURCES:.cc=.o) OBJECTS := $(OBJECTS:.c=.o) diff --git a/src/utils.h b/src/utils.h new file mode 100644 index 0000000..a89f498 --- /dev/null +++ b/src/utils.h @@ -0,0 +1,50 @@ +#pragma once + +#include <cstdio> +#include <cstdlib> +#include <stdint.h> + +extern "C" { +#include "xdg-shell.h" +#include <wayland-client.h> +} + +typedef uint8_t u8; +typedef uint16_t u16; +typedef uint32_t u32; +typedef uint64_t u64; + +typedef int8_t i8; +typedef int16_t i16; +typedef int32_t i32; +typedef int64_t i64; + +typedef struct wl_display *wl_display_t; +typedef struct wl_registry *wl_registry_t; +typedef struct wl_compositor *wl_compositor_t; +typedef struct wl_surface *wl_surface_t; + +typedef struct xdg_wm_base *xdg_wm_base_t; +typedef struct xdg_surface *xdg_surface_t; +typedef struct xdg_toplevel *xdg_toplevel_t; + +[[noreturn]] static inline void wayc_panic_impl(const char *file, int line, + const char *func, + const char *fmt, ...) { + fprintf(stderr, "Panic at %s:%d in %s: ", file, line, func); + va_list args; + va_start(args, fmt); + vfprintf(stderr, fmt, args); + va_end(args); + fprintf(stderr, "\n"); + exit(EXIT_FAILURE); +} + +#define wayc_panic(...) \ + wayc_panic_impl(__FILE__, __LINE__, __func__, __VA_ARGS__) + +#define wayc_assert(expr) \ + do { \ + if (!(expr)) \ + wayc_panic("Assertion failed: %s", #expr); \ + } while (0) diff --git a/src/wayclock.cc b/src/wayclock.cc index 0e39169..ecfb784 100644 --- a/src/wayclock.cc +++ b/src/wayclock.cc @@ -1,10 +1,10 @@ -#include <wayland-client.h> +#include "wlstate.h" int main() { - struct wl_display *disp = wl_display_connect(NULL); - if (!disp) { - return -1; - } - wl_display_disconnect(disp); + wl_state_s state; + if (!wayc_wl_state_init(&state)) + wayc_panic("Failed to initialize Wayland state", nullptr); + + wayc_wl_state_deinit(&state); return 0; }
\ No newline at end of file diff --git a/src/wlstate.cc b/src/wlstate.cc new file mode 100644 index 0000000..e78aad1 --- /dev/null +++ b/src/wlstate.cc @@ -0,0 +1,19 @@ +#include "wlstate.h" +#include "utils.h" + +bool wayc_wl_state_init(struct wl_state_s *state) { + wayc_assert(state != NULL); + + wl_display_t display = wl_display_connect(NULL); + if (display == NULL) + return false; + + state->display = display; + return true; +} + +void wayc_wl_state_deinit(struct wl_state_s *state) { + wayc_assert(state != NULL); + + wl_display_disconnect(state->display); +} diff --git a/src/wlstate.h b/src/wlstate.h new file mode 100644 index 0000000..4143a74 --- /dev/null +++ b/src/wlstate.h @@ -0,0 +1,13 @@ +#pragma once + +#include "utils.h" + +struct wl_state_s { + wl_display_t display; + wl_compositor_t compositor; + xdg_wm_base_t wm_base; + wl_surface_t surface; +}; + +bool wayc_wl_state_init(struct wl_state_s *state); +void wayc_wl_state_deinit(struct wl_state_s *state); diff --git a/src/xdg-shell.h b/src/xdg-shell.h index 9f796f0..30be540 100644 --- a/src/xdg-shell.h +++ b/src/xdg-shell.h @@ -28,10 +28,10 @@ * DEALINGS IN THE SOFTWARE. */ +#include "wayland-util.h" #include <stdbool.h> -#include <stdlib.h> #include <stdint.h> -#include "wayland-util.h" +#include <stdlib.h> extern const struct wl_interface wl_output_interface; extern const struct wl_interface wl_seat_interface; @@ -42,133 +42,122 @@ extern const struct wl_interface xdg_surface_interface; extern const struct wl_interface xdg_toplevel_interface; static const struct wl_interface *xdg_shell_types[] = { - NULL, - NULL, - NULL, - NULL, - &xdg_positioner_interface, - &xdg_surface_interface, - &wl_surface_interface, - &xdg_toplevel_interface, - &xdg_popup_interface, - &xdg_surface_interface, - &xdg_positioner_interface, - &xdg_toplevel_interface, - &wl_seat_interface, - NULL, - NULL, - NULL, - &wl_seat_interface, - NULL, - &wl_seat_interface, - NULL, - NULL, - &wl_output_interface, - &wl_seat_interface, - NULL, - &xdg_positioner_interface, - NULL, + NULL, + NULL, + NULL, + NULL, + &xdg_positioner_interface, + &xdg_surface_interface, + &wl_surface_interface, + &xdg_toplevel_interface, + &xdg_popup_interface, + &xdg_surface_interface, + &xdg_positioner_interface, + &xdg_toplevel_interface, + &wl_seat_interface, + NULL, + NULL, + NULL, + &wl_seat_interface, + NULL, + &wl_seat_interface, + NULL, + NULL, + &wl_output_interface, + &wl_seat_interface, + NULL, + &xdg_positioner_interface, + NULL, }; static const struct wl_message xdg_wm_base_requests[] = { - { "destroy", "", xdg_shell_types + 0 }, - { "create_positioner", "n", xdg_shell_types + 4 }, - { "get_xdg_surface", "no", xdg_shell_types + 5 }, - { "pong", "u", xdg_shell_types + 0 }, + {"destroy", "", xdg_shell_types + 0}, + {"create_positioner", "n", xdg_shell_types + 4}, + {"get_xdg_surface", "no", xdg_shell_types + 5}, + {"pong", "u", xdg_shell_types + 0}, }; static const struct wl_message xdg_wm_base_events[] = { - { "ping", "u", xdg_shell_types + 0 }, + {"ping", "u", xdg_shell_types + 0}, }; WL_EXPORT const struct wl_interface xdg_wm_base_interface = { - "xdg_wm_base", 7, - 4, xdg_wm_base_requests, - 1, xdg_wm_base_events, + "xdg_wm_base", 7, 4, xdg_wm_base_requests, 1, xdg_wm_base_events, }; static const struct wl_message xdg_positioner_requests[] = { - { "destroy", "", xdg_shell_types + 0 }, - { "set_size", "ii", xdg_shell_types + 0 }, - { "set_anchor_rect", "iiii", xdg_shell_types + 0 }, - { "set_anchor", "u", xdg_shell_types + 0 }, - { "set_gravity", "u", xdg_shell_types + 0 }, - { "set_constraint_adjustment", "u", xdg_shell_types + 0 }, - { "set_offset", "ii", xdg_shell_types + 0 }, - { "set_reactive", "3", xdg_shell_types + 0 }, - { "set_parent_size", "3ii", xdg_shell_types + 0 }, - { "set_parent_configure", "3u", xdg_shell_types + 0 }, + {"destroy", "", xdg_shell_types + 0}, + {"set_size", "ii", xdg_shell_types + 0}, + {"set_anchor_rect", "iiii", xdg_shell_types + 0}, + {"set_anchor", "u", xdg_shell_types + 0}, + {"set_gravity", "u", xdg_shell_types + 0}, + {"set_constraint_adjustment", "u", xdg_shell_types + 0}, + {"set_offset", "ii", xdg_shell_types + 0}, + {"set_reactive", "3", xdg_shell_types + 0}, + {"set_parent_size", "3ii", xdg_shell_types + 0}, + {"set_parent_configure", "3u", xdg_shell_types + 0}, }; WL_EXPORT const struct wl_interface xdg_positioner_interface = { - "xdg_positioner", 7, - 10, xdg_positioner_requests, - 0, NULL, + "xdg_positioner", 7, 10, xdg_positioner_requests, 0, NULL, }; static const struct wl_message xdg_surface_requests[] = { - { "destroy", "", xdg_shell_types + 0 }, - { "get_toplevel", "n", xdg_shell_types + 7 }, - { "get_popup", "n?oo", xdg_shell_types + 8 }, - { "set_window_geometry", "iiii", xdg_shell_types + 0 }, - { "ack_configure", "u", xdg_shell_types + 0 }, + {"destroy", "", xdg_shell_types + 0}, + {"get_toplevel", "n", xdg_shell_types + 7}, + {"get_popup", "n?oo", xdg_shell_types + 8}, + {"set_window_geometry", "iiii", xdg_shell_types + 0}, + {"ack_configure", "u", xdg_shell_types + 0}, }; static const struct wl_message xdg_surface_events[] = { - { "configure", "u", xdg_shell_types + 0 }, + {"configure", "u", xdg_shell_types + 0}, }; WL_EXPORT const struct wl_interface xdg_surface_interface = { - "xdg_surface", 7, - 5, xdg_surface_requests, - 1, xdg_surface_events, + "xdg_surface", 7, 5, xdg_surface_requests, 1, xdg_surface_events, }; static const struct wl_message xdg_toplevel_requests[] = { - { "destroy", "", xdg_shell_types + 0 }, - { "set_parent", "?o", xdg_shell_types + 11 }, - { "set_title", "s", xdg_shell_types + 0 }, - { "set_app_id", "s", xdg_shell_types + 0 }, - { "show_window_menu", "ouii", xdg_shell_types + 12 }, - { "move", "ou", xdg_shell_types + 16 }, - { "resize", "ouu", xdg_shell_types + 18 }, - { "set_max_size", "ii", xdg_shell_types + 0 }, - { "set_min_size", "ii", xdg_shell_types + 0 }, - { "set_maximized", "", xdg_shell_types + 0 }, - { "unset_maximized", "", xdg_shell_types + 0 }, - { "set_fullscreen", "?o", xdg_shell_types + 21 }, - { "unset_fullscreen", "", xdg_shell_types + 0 }, - { "set_minimized", "", xdg_shell_types + 0 }, + {"destroy", "", xdg_shell_types + 0}, + {"set_parent", "?o", xdg_shell_types + 11}, + {"set_title", "s", xdg_shell_types + 0}, + {"set_app_id", "s", xdg_shell_types + 0}, + {"show_window_menu", "ouii", xdg_shell_types + 12}, + {"move", "ou", xdg_shell_types + 16}, + {"resize", "ouu", xdg_shell_types + 18}, + {"set_max_size", "ii", xdg_shell_types + 0}, + {"set_min_size", "ii", xdg_shell_types + 0}, + {"set_maximized", "", xdg_shell_types + 0}, + {"unset_maximized", "", xdg_shell_types + 0}, + {"set_fullscreen", "?o", xdg_shell_types + 21}, + {"unset_fullscreen", "", xdg_shell_types + 0}, + {"set_minimized", "", xdg_shell_types + 0}, }; static const struct wl_message xdg_toplevel_events[] = { - { "configure", "iia", xdg_shell_types + 0 }, - { "close", "", xdg_shell_types + 0 }, - { "configure_bounds", "4ii", xdg_shell_types + 0 }, - { "wm_capabilities", "5a", xdg_shell_types + 0 }, + {"configure", "iia", xdg_shell_types + 0}, + {"close", "", xdg_shell_types + 0}, + {"configure_bounds", "4ii", xdg_shell_types + 0}, + {"wm_capabilities", "5a", xdg_shell_types + 0}, }; WL_EXPORT const struct wl_interface xdg_toplevel_interface = { - "xdg_toplevel", 7, - 14, xdg_toplevel_requests, - 4, xdg_toplevel_events, + "xdg_toplevel", 7, 14, xdg_toplevel_requests, 4, xdg_toplevel_events, }; static const struct wl_message xdg_popup_requests[] = { - { "destroy", "", xdg_shell_types + 0 }, - { "grab", "ou", xdg_shell_types + 22 }, - { "reposition", "3ou", xdg_shell_types + 24 }, + {"destroy", "", xdg_shell_types + 0}, + {"grab", "ou", xdg_shell_types + 22}, + {"reposition", "3ou", xdg_shell_types + 24}, }; static const struct wl_message xdg_popup_events[] = { - { "configure", "iiii", xdg_shell_types + 0 }, - { "popup_done", "", xdg_shell_types + 0 }, - { "repositioned", "3u", xdg_shell_types + 0 }, + {"configure", "iiii", xdg_shell_types + 0}, + {"popup_done", "", xdg_shell_types + 0}, + {"repositioned", "3u", xdg_shell_types + 0}, }; WL_EXPORT const struct wl_interface xdg_popup_interface = { - "xdg_popup", 7, - 3, xdg_popup_requests, - 3, xdg_popup_events, + "xdg_popup", 7, 3, xdg_popup_requests, 3, xdg_popup_events, }; - |
