diff options
| author | Jari Vetoniemi <mailroxas@gmail.com> | 2014-10-25 20:02:34 +0300 | 
|---|---|---|
| committer | Jari Vetoniemi <mailroxas@gmail.com> | 2014-10-25 20:02:34 +0300 | 
| commit | d3db039136ad66d2c83c1c0fbf0964bfbb5afb16 (patch) | |
| tree | 93af6d73ad168e0169183a9c4f625acd5492e08c /lib/renderers/wayland | |
| parent | 2820734ec01ad6d2e1a0611fa480c3dd533588c7 (diff) | |
| download | bemenu-d3db039136ad66d2c83c1c0fbf0964bfbb5afb16.tar.gz bemenu-d3db039136ad66d2c83c1c0fbf0964bfbb5afb16.tar.bz2 bemenu-d3db039136ad66d2c83c1c0fbf0964bfbb5afb16.zip  | |
Single line mode, color customization, etc..
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);  | 
