aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathan Reiner <nathan@nathanreiner.xyz>2023-04-21 14:58:55 +0200
committerNathan Reiner <nathan@nathanreiner.xyz>2023-04-21 14:58:55 +0200
commitdc8f8644293b17f056edefa9e0e4a786686816a1 (patch)
tree392b5a1769ee2bb8e18a57a006149b8d8d82e7d9
parenta46daccc110b6a43bf1dba928d7f1f1e72a14d81 (diff)
add resize_drw instead of free and create
-rw-r--r--drw.c97
-rw-r--r--drw.h6
-rw-r--r--swt.c16
3 files changed, 90 insertions, 29 deletions
diff --git a/drw.c b/drw.c
index 3e8fed5..6683cdb 100644
--- a/drw.c
+++ b/drw.c
@@ -1,3 +1,5 @@
+#include <wayland-client-protocol.h>
+#define _GNU_SOURCE
#include <stdint.h>
#include <sys/mman.h>
#include <unistd.h>
@@ -38,20 +40,18 @@ to_uint32_t(Color color)
Canvas*
create_drw(struct wl_shm *shm, unsigned width, unsigned height)
{
- struct wl_shm_pool *pool;
Canvas *canvas;
- int stride;
- int fd;
canvas = malloc(sizeof(Canvas));
canvas->width = width;
canvas->height = height;
+ canvas->shm = shm;
- stride = width * sizeof(uint32_t);
- canvas->size = stride * height;
+ canvas->stride = width * sizeof(uint32_t);
+ canvas->size = canvas->stride * height;
- fd = allocate_shm_file(canvas->size);
- if (fd == -1) {
+ canvas->buffer_data_fd = allocate_shm_file(canvas->size);
+ if (canvas->buffer_data_fd == -1) {
return NULL;
}
@@ -60,44 +60,93 @@ create_drw(struct wl_shm *shm, unsigned width, unsigned height)
canvas->size,
PROT_READ | PROT_WRITE,
MAP_SHARED,
- fd,
+ canvas->buffer_data_fd,
0
);
if (canvas->buffer_data == MAP_FAILED)
die("mmap failed: ");
- pool = wl_shm_create_pool(
+ canvas->pool = wl_shm_create_pool(
shm,
- fd,
+ canvas->buffer_data_fd,
canvas->size
);
- canvas->buffer = wl_shm_pool_create_buffer(
- pool,
- 0,
- width,
- height,
- stride,
- WL_SHM_FORMAT_XRGB8888
- );
+ canvas->buffer = wl_shm_pool_create_buffer(canvas->pool, 0, canvas->width, canvas->height, canvas->size / canvas->height, WL_SHM_FORMAT_XRGB8888);
- wl_shm_pool_destroy(pool);
- close(fd);
+ wl_shm_pool_destroy(canvas->pool);
- fd = allocate_shm_file(canvas->size);
- canvas->data = mmap(NULL, canvas->size, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);
+ canvas->data_fd = allocate_shm_file(canvas->size);
+ if (canvas->data_fd == -1) {
+ return NULL;
+ }
+ canvas->data = mmap(NULL, canvas->size, PROT_READ | PROT_WRITE, MAP_PRIVATE, canvas->data_fd, 0);
if (canvas->data == MAP_FAILED)
die("mmap failed: ");
- close(fd);
+ close(canvas->buffer_data_fd);
+ close(canvas->data_fd);
return canvas;
}
void
+resize_drw(Canvas *canvas, unsigned width, unsigned height)
+{
+ munmap(canvas->data, canvas->size);
+ munmap(canvas->buffer_data, canvas->size);
+
+ canvas->width = width;
+ canvas->height = height;
+
+ canvas->stride = width * sizeof(uint32_t);
+ canvas->size = canvas->stride * height;
+
+ canvas->buffer_data_fd = allocate_shm_file(canvas->size);
+ if (canvas->buffer_data_fd == -1) {
+ return;
+ }
+
+ canvas->buffer_data = mmap(
+ NULL,
+ canvas->size,
+ PROT_READ | PROT_WRITE,
+ MAP_SHARED,
+ canvas->buffer_data_fd,
+ 0
+ );
+
+ if (canvas->buffer_data == MAP_FAILED)
+ die("mmap failed: ");
+
+ canvas->pool = wl_shm_create_pool(
+ canvas->shm,
+ canvas->buffer_data_fd,
+ canvas->size
+ );
+
+ canvas->buffer = wl_shm_pool_create_buffer(canvas->pool, 0, canvas->width, canvas->height, canvas->size / canvas->height, WL_SHM_FORMAT_XRGB8888);
+
+ wl_shm_pool_destroy(canvas->pool);
+
+ canvas->data_fd = allocate_shm_file(canvas->size);
+ if (canvas->data_fd == -1) {
+ return;
+ }
+ canvas->data = mmap(NULL, canvas->size, PROT_READ | PROT_WRITE, MAP_PRIVATE, canvas->data_fd, 0);
+
+ if (canvas->data == MAP_FAILED)
+ die("mmap failed: ");
+
+ close(canvas->buffer_data_fd);
+ close(canvas->data_fd);
+}
+
+
+void
free_drw(Canvas *canvas)
{
munmap(canvas->data, canvas->size);
@@ -343,11 +392,9 @@ draw_char(Canvas *canvas, FontCache *fontcache, uint_least32_t charcode, unsigne
FT_BitmapGlyph bg;
FT_Glyph glyph;
-
font = get_font_with_charcode(fontcache, charcode);
FT_Set_Pixel_Sizes(font->face, 0, fontcache->fontsize);
-
if (boldstokemode && fontcache->fonttype == FONT_BOLD) {
FT_Stroker_Set(font->stroke, fontcache->fontsize * 2, FT_STROKER_LINECAP_ROUND, FT_STROKER_LINEJOIN_ROUND, fontcache->fontsize * 2);
diff --git a/drw.h b/drw.h
index 8417e15..4a0a25c 100644
--- a/drw.h
+++ b/drw.h
@@ -12,11 +12,16 @@
/* type definitions */
typedef struct {
uint32_t *data;
+ int data_fd;
uint32_t *buffer_data;
+ int buffer_data_fd;
unsigned width;
unsigned height;
+ unsigned stride;
unsigned size;
struct wl_buffer *buffer;
+ struct wl_shm *shm;
+ struct wl_shm_pool *pool;
} Canvas;
typedef struct {
@@ -63,6 +68,7 @@ typedef struct {
/* exported functions */
Canvas* create_drw(struct wl_shm *shm, unsigned width, unsigned height);
+void resize_drw(Canvas *canvas, unsigned width, unsigned height);
void free_drw(Canvas *canvas);
void push_buffer(Canvas *canvas);
diff --git a/swt.c b/swt.c
index b16447d..2b5720c 100644
--- a/swt.c
+++ b/swt.c
@@ -275,6 +275,9 @@ draw_glyph(Glyph g, int x, int y)
void
wdrawcursor(int cx, int cy, Glyph g, int ox, int oy, Glyph og) {
+ if (IS_SET(MODE_HIDE))
+ return;
+
draw_rect(
win.canvas,
borderpx + ox * win.fontcache->box.width,
@@ -431,6 +434,7 @@ void wximspot(int, int) {}
void
buffer_release(void *data, struct wl_buffer *buffer)
{
+ fprintf(stderr, "BUFFER RELEASE\n");
wl_buffer_destroy(buffer);
}
@@ -458,7 +462,7 @@ surface_configure(void *data, struct xdg_surface *surface, uint32_t serial)
int first_configure = win.canvas == 0;
xdg_surface_ack_configure(surface, serial);
- if (first_configure)
+ if (first_configure);
commit_surface();
}
@@ -475,11 +479,12 @@ toplevel_configure(void *data, struct xdg_toplevel *toplevel, int32_t width, int
win.height = height;
}
- if (win.canvas != 0) {
- free_drw(win.canvas);
+ if (win.canvas == 0) {
+ win.canvas = create_drw(client.shm, win.width, win.height);
+ } else {
+ resize_drw(win.canvas, width, height);
}
- win.canvas = create_drw(client.shm, win.width, win.height);
draw_frame();
win.tty.width = (win.width - 2 * borderpx) / win.fontcache->box.width;
win.tty.height = (win.height - 2 * borderpx) / win.fontcache->box.height;
@@ -521,6 +526,7 @@ registry_global(void *data, struct wl_registry *registry, uint32_t name, const c
void
registry_global_remove(void *data, struct wl_registry *registry, uint32_t name)
{
+ fprintf(stderr, "REMOVE %i\n", name);
/* TODO: Check if this is necessary */
}
@@ -910,12 +916,14 @@ run()
if (wl_display_flush(client.display) < 0) {
if (errno == EAGAIN)
continue;
+ die("wayland error:");
break;
}
if (poll(fds, sizeof(fds) / sizeof(*fds), -1) < 0) {
if (errno == EAGAIN)
continue;
+ die("poll error:");
break;
}