diff options
| -rw-r--r-- | drw.c | 97 | ||||
| -rw-r--r-- | drw.h | 6 | ||||
| -rw-r--r-- | swt.c | 16 |
3 files changed, 90 insertions, 29 deletions
@@ -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); @@ -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); @@ -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; } |