summaryrefslogtreecommitdiff
path: root/src/window.cc
diff options
context:
space:
mode:
authorFabrice <fabrice@schaub-dev.xyz>2026-02-10 10:51:12 +0100
committerFabrice <fabrice@schaub-dev.xyz>2026-02-10 10:51:12 +0100
commit15159fb02332b33f2d239190e2233d41b63f8d6c (patch)
treecc8e623cb7bbaa01566e529c1ce80c9f77b1a531 /src/window.cc
parentb4f74dc349f024ed44d4228501d500ebb113d146 (diff)
creating windows
Diffstat (limited to 'src/window.cc')
-rw-r--r--src/window.cc84
1 files changed, 84 insertions, 0 deletions
diff --git a/src/window.cc b/src/window.cc
index 32055b1..e7f6397 100644
--- a/src/window.cc
+++ b/src/window.cc
@@ -1,2 +1,86 @@
#include "window.h"
+#include "events.h"
+#include "utils.h"
+#include "wlstate.h"
+#include "xdg-shell.h"
+#include <cstring>
+static void wayc_surface_configure(void *data, struct xdg_surface *xdg_surface,
+ u32 serial) {
+ (void)data;
+ xdg_surface_ack_configure(xdg_surface, serial);
+}
+
+static void wayc_toplevel_configure(void *data,
+ struct xdg_toplevel *xdg_toplevel,
+ i32 width, i32 height,
+ struct wl_array *states) {
+ (void)data;
+ (void)xdg_toplevel;
+ (void)width;
+ (void)height;
+ (void)states;
+}
+
+static void wayc_toplevel_close(void *data, struct xdg_toplevel *xdg_toplevel) {
+ (void)data;
+ (void)xdg_toplevel;
+}
+
+static struct xdg_surface_listener WAYC_SURFACE_LISTENER = {
+ wayc_surface_configure,
+};
+
+static struct xdg_toplevel_listener WAYC_TOPLEVEL_LISTENER = {
+ wayc_toplevel_configure, wayc_toplevel_close, nullptr, nullptr};
+
+bool wayc_window_init(struct window_s *window, struct eventloop_s *loop) {
+ wayc_notnull(window);
+ wayc_notnull(loop);
+ memset(window, 0, sizeof(*window));
+
+ struct wlstate_s *wlstate = &loop->state;
+
+ wl_surface_t surface = wl_compositor_create_surface(wlstate->compositor);
+ if (surface == nullptr)
+ return false;
+
+ xdg_surface_t xdg_surface =
+ xdg_wm_base_get_xdg_surface(wlstate->wm_base, surface);
+ if (xdg_surface == nullptr) {
+ wl_surface_destroy(surface);
+ return false;
+ }
+
+ xdg_surface_add_listener(xdg_surface, &WAYC_SURFACE_LISTENER, window);
+
+ xdg_toplevel_t xdg_toplevel = xdg_surface_get_toplevel(xdg_surface);
+ if (xdg_toplevel == nullptr) {
+ xdg_surface_destroy(xdg_surface);
+ wl_surface_destroy(surface);
+ return false;
+ }
+
+ xdg_toplevel_add_listener(xdg_toplevel, &WAYC_TOPLEVEL_LISTENER, window);
+
+ window->surface = surface;
+ window->xdg_surface = xdg_surface;
+ window->loop = loop;
+ return true;
+}
+
+void wayc_window_deinit(struct window_s *window) {
+ wayc_notnull(window);
+
+ if (window->surface == nullptr || window->xdg_surface == nullptr ||
+ window->xdg_toplevel == nullptr)
+ return;
+
+ xdg_toplevel_destroy(window->xdg_toplevel);
+ xdg_surface_destroy(window->xdg_surface);
+ wl_surface_destroy(window->surface);
+
+ window->xdg_toplevel = nullptr;
+ window->xdg_surface = nullptr;
+ window->surface = nullptr;
+}