summary refs log tree commit diff
path: root/drw.c
diff options
context:
space:
mode:
authorJohn Sullivan <jsullivan@csumb.edu>2020-09-11 01:25:28 -0700
committerJohn Sullivan <jsullivan@csumb.edu>2020-09-13 04:44:15 -0700
commit470046a68cb21c69635d48d424b64b76148dac1c (patch)
treeb0bf94141b1e54489332641c503d17ff5845f4a5 /drw.c
downloadsuggpicker-470046a68cb21c69635d48d424b64b76148dac1c.tar.gz
Init
Diffstat (limited to 'drw.c')
-rw-r--r--drw.c71
1 files changed, 71 insertions, 0 deletions
diff --git a/drw.c b/drw.c
new file mode 100644
index 0000000..fef0686
--- /dev/null
+++ b/drw.c
@@ -0,0 +1,71 @@
+#include "wld/wayland.h"
+#include "wld/wld.h"
+#include <wayland-client.h>
+
+#include "drw.h"
+
+void
+drw_init(struct drw *d, const char *fc_pattern, struct wl_display *dpy,
+         void *iface) {
+	d->wld = wld_wayland_create_context(dpy, WLD_ANY, iface);
+	d->fctx = wld_font_create_context();
+	d->font = wld_font_open_name(d->fctx, fc_pattern);
+}
+
+void
+drwsurf_init(struct drw *d, struct drwsurf *ds, struct wl_surface *surf) {
+	ds->ctx = d;
+	ds->surf = surf;
+	ds->render = wld_create_renderer(d->wld);
+}
+
+void
+drwsurf_resize(struct drwsurf *ds, uint32_t w, uint32_t h) {
+	union wld_object obj;
+
+	if (ds->buf) {
+		wld_buffer_unreference(ds->buf);
+		ds->buf = NULL;
+		ds->ref = NULL;
+	}
+
+	ds->w = w;
+	ds->h = h;
+
+	ds->buf = wld_create_buffer(ds->ctx->wld, w, h, WLD_FORMAT_ARGB8888, 0);
+	wld_set_target_buffer(ds->render, ds->buf);
+
+	wld_export(ds->buf, WLD_WAYLAND_OBJECT_BUFFER, &obj);
+	ds->ref = obj.ptr;
+}
+
+static void surface_frame_callback(void *data, struct wl_callback *cb,
+                                   uint32_t time);
+
+static struct wl_callback_listener frame_listener = {.done =
+                                                       surface_frame_callback};
+
+void
+drwsurf_flip(struct drwsurf *ds) {
+	ds->cb = wl_surface_frame(ds->surf);
+	wl_callback_add_listener(ds->cb, &frame_listener, (void *)ds);
+
+	if (ds->dirty) {
+		wl_surface_damage(ds->surf, 0, 0, ds->w, ds->h);
+		wld_flush(ds->render);
+		wld_set_target_buffer(ds->render, ds->buf);
+		ds->dirty = false;
+	}
+
+	wl_surface_attach(ds->surf, ds->ref, 0, 0);
+	wl_surface_commit(ds->surf);
+}
+
+void
+surface_frame_callback(void *data, struct wl_callback *cb, uint32_t time) {
+	struct drwsurf *ds = (struct drwsurf *)data;
+	wl_callback_destroy(cb);
+	ds->cb = NULL;
+
+	drwsurf_flip(ds);
+}