diff options
Diffstat (limited to 'lib/renderers/wayland')
-rw-r--r-- | lib/renderers/wayland/wayland.c | 44 | ||||
-rw-r--r-- | lib/renderers/wayland/wayland.h | 3 | ||||
-rw-r--r-- | lib/renderers/wayland/window.c | 92 |
3 files changed, 87 insertions, 52 deletions
diff --git a/lib/renderers/wayland/wayland.c b/lib/renderers/wayland/wayland.c index 0d5fcde..c6f8f8b 100644 --- a/lib/renderers/wayland/wayland.c +++ b/lib/renderers/wayland/wayland.c @@ -11,6 +11,9 @@ static void render(const struct bm_menu *menu) { struct wayland *wayland = menu->renderer->internal; + uint32_t count; + bm_menu_get_filtered_items(menu, &count); + wayland->window.height = ((count < menu->lines ? count : menu->lines) + 1) * menu->font.size + 4; bm_wl_window_render(&wayland->window, menu); wl_display_dispatch(wayland->display); } @@ -25,6 +28,7 @@ poll_key(const struct bm_menu *menu, unsigned int *unicode) if (wayland->input.sym == XKB_KEY_NoSymbol) return BM_KEY_UNICODE; + uint32_t mods = wayland->input.modifiers; *unicode = xkb_state_key_get_utf32(wayland->input.xkb.state, wayland->input.code); switch (wayland->input.sym) { @@ -47,16 +51,16 @@ poll_key(const struct bm_menu *menu, unsigned int *unicode) return BM_KEY_END; case XKB_KEY_SunPageUp: - return BM_KEY_PAGE_UP; + return (mods & MOD_SHIFT ? BM_KEY_SHIFT_PAGE_UP : BM_KEY_PAGE_UP); case XKB_KEY_SunPageDown: - return BM_KEY_PAGE_DOWN; + return (mods & MOD_SHIFT ? BM_KEY_SHIFT_PAGE_DOWN : BM_KEY_PAGE_DOWN); case XKB_KEY_BackSpace: return BM_KEY_BACKSPACE; case XKB_KEY_Delete: - return BM_KEY_DELETE; + return (mods & MOD_SHIFT ? BM_KEY_LINE_DELETE_LEFT : BM_KEY_DELETE); case XKB_KEY_Tab: return BM_KEY_TAB; @@ -65,11 +69,41 @@ poll_key(const struct bm_menu *menu, unsigned int *unicode) return BM_KEY_SHIFT_RETURN; case XKB_KEY_Return: - return BM_KEY_RETURN; + return (mods & MOD_CTRL ? BM_KEY_CONTROL_RETURN : (mods & MOD_SHIFT ? BM_KEY_SHIFT_RETURN : BM_KEY_RETURN)); case XKB_KEY_Escape: return BM_KEY_ESCAPE; + case XKB_KEY_p: + return (mods & MOD_CTRL ? BM_KEY_UP : BM_KEY_UNICODE); + + case XKB_KEY_n: + return (mods & MOD_CTRL ? BM_KEY_DOWN : BM_KEY_UNICODE); + + case XKB_KEY_l: + return (mods & MOD_CTRL ? BM_KEY_LEFT : BM_KEY_UNICODE); + + case XKB_KEY_f: + return (mods & MOD_CTRL ? BM_KEY_RIGHT : BM_KEY_UNICODE); + + case XKB_KEY_a: + return (mods & MOD_CTRL ? BM_KEY_HOME : BM_KEY_UNICODE); + + case XKB_KEY_e: + return (mods & MOD_CTRL ? BM_KEY_END : BM_KEY_UNICODE); + + case XKB_KEY_h: + return (mods & MOD_CTRL ? BM_KEY_BACKSPACE : BM_KEY_UNICODE); + + case XKB_KEY_u: + return (mods & MOD_CTRL ? BM_KEY_LINE_DELETE_LEFT : BM_KEY_UNICODE); + + case XKB_KEY_k: + return (mods & MOD_CTRL ? BM_KEY_LINE_DELETE_RIGHT : BM_KEY_UNICODE); + + case XKB_KEY_w: + return (mods & MOD_CTRL ? BM_KEY_WORD_DELETE : BM_KEY_UNICODE); + default: break; } @@ -81,7 +115,7 @@ get_displayed_count(const struct bm_menu *menu) { struct wayland *wayland = menu->renderer->internal; assert(wayland); - return wayland->window.height / 12; + return wayland->window.displayed; } static void diff --git a/lib/renderers/wayland/wayland.h b/lib/renderers/wayland/wayland.h index fd29405..d698218 100644 --- a/lib/renderers/wayland/wayland.h +++ b/lib/renderers/wayland/wayland.h @@ -70,9 +70,10 @@ struct window { struct wl_shm *shm; struct buffer buffers[2]; uint32_t width, height; + uint32_t displayed; struct { - void (*render)(struct cairo *cairo, uint32_t width, uint32_t height, const struct bm_menu *menu); + uint32_t (*render)(struct cairo *cairo, uint32_t width, uint32_t height, const struct bm_menu *menu); } notify; }; diff --git a/lib/renderers/wayland/window.c b/lib/renderers/wayland/window.c index 9234ef2..21555b8 100644 --- a/lib/renderers/wayland/window.c +++ b/lib/renderers/wayland/window.c @@ -13,79 +13,79 @@ static int set_cloexec_or_close(int fd) { - if (fd == -1) - return -1; + if (fd == -1) + return -1; - long flags = fcntl(fd, F_GETFD); - if (flags == -1) - goto err; + long flags = fcntl(fd, F_GETFD); + if (flags == -1) + goto err; - if (fcntl(fd, F_SETFD, flags | FD_CLOEXEC) == -1) - goto err; + if (fcntl(fd, F_SETFD, flags | FD_CLOEXEC) == -1) + goto err; - return fd; + return fd; err: - close(fd); - return -1; + close(fd); + return -1; } static int create_tmpfile_cloexec(char *tmpname) { - int fd; + int fd; #ifdef HAVE_MKOSTEMP - if ((fd = mkostemp(tmpname, O_CLOEXEC)) >= 0) - unlink(tmpname); + if ((fd = mkostemp(tmpname, O_CLOEXEC)) >= 0) + unlink(tmpname); #else - if ((fd = mkstemp(tmpname)) >= 0) { - fd = set_cloexec_or_close(fd); - unlink(tmpname); - } + if ((fd = mkstemp(tmpname)) >= 0) { + fd = set_cloexec_or_close(fd); + unlink(tmpname); + } #endif - return fd; + return fd; } static int os_create_anonymous_file(off_t size) { - static const char template[] = "/bemenu-shared-XXXXXX"; - int fd; - int ret; - - const char *path; - if (!(path = getenv("XDG_RUNTIME_DIR")) || strlen(path) <= 0) { - errno = ENOENT; - return -1; - } + static const char template[] = "/bemenu-shared-XXXXXX"; + int fd; + int ret; + + const char *path; + if (!(path = getenv("XDG_RUNTIME_DIR")) || strlen(path) <= 0) { + errno = ENOENT; + return -1; + } - char *name; - int ts = (path[strlen(path) - 1] == '/'); - if (!(name = bm_dprintf("%s%s%s", path, (ts ? "" : "/"), template))) - return -1; + char *name; + int ts = (path[strlen(path) - 1] == '/'); + if (!(name = bm_dprintf("%s%s%s", path, (ts ? "" : "/"), template))) + return -1; - fd = create_tmpfile_cloexec(name); - free(name); + fd = create_tmpfile_cloexec(name); + free(name); - if (fd < 0) - return -1; + if (fd < 0) + return -1; #ifdef HAVE_POSIX_FALLOCATE - if ((ret = posix_fallocate(fd, 0, size)) != 0) { - close(fd); - errno = ret; - return -1; - } + if ((ret = posix_fallocate(fd, 0, size)) != 0) { + close(fd); + errno = ret; + return -1; + } #else - if ((ret = ftruncate(fd, size)) < 0) { - close(fd); - return -1; - } + if ((ret = ftruncate(fd, size)) < 0) { + close(fd); + return -1; + } #endif - return fd; + return fd; } static void @@ -256,7 +256,7 @@ bm_wl_window_render(struct window *window, const struct bm_menu *menu) return; if (window->notify.render) - window->notify.render(&buffer->cairo, buffer->width, buffer->height, menu); + window->displayed = window->notify.render(&buffer->cairo, buffer->width, buffer->height, menu); wl_surface_damage(window->surface, 0, 0, buffer->width, buffer->height); wl_surface_attach(window->surface, buffer->buffer, 0, 0); |