summaryrefslogtreecommitdiff
path: root/lib/renderers/wayland
diff options
context:
space:
mode:
Diffstat (limited to 'lib/renderers/wayland')
-rw-r--r--lib/renderers/wayland/wayland.c44
-rw-r--r--lib/renderers/wayland/wayland.h3
-rw-r--r--lib/renderers/wayland/window.c92
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);