Add dmenu's Meta (Alt) keybindings
This change adds dmenu's mixture of Emacs+vim-style Meta keybindings. Also 'Page_Up' and 'Page_Down' were deprecated in upstream xkbcommon, so replace them with the new 'Prior' and 'Next' names respectively.
This commit is contained in:
parent
04dfc06379
commit
c37c3fe38e
2 changed files with 86 additions and 18 deletions
|
@ -148,3 +148,27 @@ arrow keys, page up, page down, home, and end.
|
||||||
|[ *C-w*
|
|[ *C-w*
|
||||||
:[ Delete word left
|
:[ Delete word left
|
||||||
|
|
||||||
|
|[ *M-b*
|
||||||
|
:[ Move cursor to the start of the current word.
|
||||||
|
|
||||||
|
|[ *M-f*
|
||||||
|
:[ Move cursor to the end of the current word.
|
||||||
|
|
||||||
|
|[ *M-g*
|
||||||
|
:[ Home
|
||||||
|
|
||||||
|
|[ *M-G*
|
||||||
|
:[ End
|
||||||
|
|
||||||
|
|[ *M-h*
|
||||||
|
:[ Up
|
||||||
|
|
||||||
|
|[ *M-j*
|
||||||
|
:[ Page down
|
||||||
|
|
||||||
|
|[ *M-k*
|
||||||
|
:[ Page up
|
||||||
|
|
||||||
|
|[ *M-l*
|
||||||
|
:[ Down
|
||||||
|
|
||||||
|
|
80
main.c
80
main.c
|
@ -291,6 +291,27 @@ static size_t nextrune(struct menu *menu, int incr) {
|
||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void movewordedge(struct menu *menu, int dir) {
|
||||||
|
if (dir < 0) {
|
||||||
|
// Move to beginning of word
|
||||||
|
while (menu->cursor > 0 && menu->input[nextrune(menu, -1)] == ' ') {
|
||||||
|
menu->cursor = nextrune(menu, -1);
|
||||||
|
}
|
||||||
|
while (menu->cursor > 0 && menu->input[nextrune(menu, -1)] != ' ') {
|
||||||
|
menu->cursor = nextrune(menu, -1);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Move to end of word
|
||||||
|
size_t len = strlen(menu->input);
|
||||||
|
while (menu->cursor < len && menu->input[menu->cursor] == ' ') {
|
||||||
|
menu->cursor = nextrune(menu, +1);
|
||||||
|
}
|
||||||
|
while (menu->cursor < len && menu->input[menu->cursor] != ' ') {
|
||||||
|
menu->cursor = nextrune(menu, +1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Calculate text widths.
|
// Calculate text widths.
|
||||||
static void calc_widths(struct menu *menu) {
|
static void calc_widths(struct menu *menu) {
|
||||||
cairo_t *cairo = menu->current->cairo;
|
cairo_t *cairo = menu->current->cairo;
|
||||||
|
@ -573,6 +594,9 @@ static void keypress(struct menu *menu, enum wl_keyboard_key_state key_state,
|
||||||
bool ctrl = xkb_state_mod_name_is_active(menu->xkb_state,
|
bool ctrl = xkb_state_mod_name_is_active(menu->xkb_state,
|
||||||
XKB_MOD_NAME_CTRL,
|
XKB_MOD_NAME_CTRL,
|
||||||
XKB_STATE_MODS_DEPRESSED | XKB_STATE_MODS_LATCHED);
|
XKB_STATE_MODS_DEPRESSED | XKB_STATE_MODS_LATCHED);
|
||||||
|
bool meta = xkb_state_mod_name_is_active(menu->xkb_state,
|
||||||
|
XKB_MOD_NAME_ALT,
|
||||||
|
XKB_STATE_MODS_DEPRESSED | XKB_STATE_MODS_LATCHED);
|
||||||
bool shift = xkb_state_mod_name_is_active(menu->xkb_state,
|
bool shift = xkb_state_mod_name_is_active(menu->xkb_state,
|
||||||
XKB_MOD_NAME_SHIFT,
|
XKB_MOD_NAME_SHIFT,
|
||||||
XKB_STATE_MODS_DEPRESSED | XKB_STATE_MODS_LATCHED);
|
XKB_STATE_MODS_DEPRESSED | XKB_STATE_MODS_LATCHED);
|
||||||
|
@ -682,24 +706,12 @@ static void keypress(struct menu *menu, enum wl_keyboard_key_state key_state,
|
||||||
return;
|
return;
|
||||||
case XKB_KEY_Left:
|
case XKB_KEY_Left:
|
||||||
case XKB_KEY_KP_Left:
|
case XKB_KEY_KP_Left:
|
||||||
// Move to beginning of word
|
movewordedge(menu, -1);
|
||||||
while (menu->cursor > 0 && menu->input[nextrune(menu, -1)] == ' ') {
|
|
||||||
menu->cursor = nextrune(menu, -1);
|
|
||||||
}
|
|
||||||
while (menu->cursor > 0 && menu->input[nextrune(menu, -1)] != ' ') {
|
|
||||||
menu->cursor = nextrune(menu, -1);
|
|
||||||
}
|
|
||||||
render_frame(menu);
|
render_frame(menu);
|
||||||
return;
|
return;
|
||||||
case XKB_KEY_Right:
|
case XKB_KEY_Right:
|
||||||
case XKB_KEY_KP_Right:
|
case XKB_KEY_KP_Right:
|
||||||
// Move to end of word
|
movewordedge(menu, +1);
|
||||||
while (menu->cursor < len && menu->input[menu->cursor] == ' ') {
|
|
||||||
menu->cursor = nextrune(menu, +1);
|
|
||||||
}
|
|
||||||
while (menu->cursor < len && menu->input[menu->cursor] != ' ') {
|
|
||||||
menu->cursor = nextrune(menu, +1);
|
|
||||||
}
|
|
||||||
render_frame(menu);
|
render_frame(menu);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -709,6 +721,38 @@ static void keypress(struct menu *menu, enum wl_keyboard_key_state key_state,
|
||||||
default:
|
default:
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
} else if (meta) {
|
||||||
|
// Emacs-style line editing bindings
|
||||||
|
switch (sym) {
|
||||||
|
case XKB_KEY_b:
|
||||||
|
movewordedge(menu, -1);
|
||||||
|
render_frame(menu);
|
||||||
|
return;
|
||||||
|
case XKB_KEY_f:
|
||||||
|
movewordedge(menu, +1);
|
||||||
|
render_frame(menu);
|
||||||
|
return;
|
||||||
|
case XKB_KEY_g:
|
||||||
|
sym = XKB_KEY_Home;
|
||||||
|
break;
|
||||||
|
case XKB_KEY_G:
|
||||||
|
sym = XKB_KEY_End;
|
||||||
|
break;
|
||||||
|
case XKB_KEY_h:
|
||||||
|
sym = XKB_KEY_Up;
|
||||||
|
break;
|
||||||
|
case XKB_KEY_j:
|
||||||
|
sym = XKB_KEY_Next;
|
||||||
|
break;
|
||||||
|
case XKB_KEY_k:
|
||||||
|
sym = XKB_KEY_Prior;
|
||||||
|
break;
|
||||||
|
case XKB_KEY_l:
|
||||||
|
sym = XKB_KEY_Down;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
char buf[8];
|
char buf[8];
|
||||||
|
@ -752,15 +796,15 @@ static void keypress(struct menu *menu, enum wl_keyboard_key_state key_state,
|
||||||
render_frame(menu);
|
render_frame(menu);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case XKB_KEY_Page_Up:
|
case XKB_KEY_Prior:
|
||||||
case XKB_KEY_KP_Page_Up:
|
case XKB_KEY_KP_Prior:
|
||||||
if (menu->sel && menu->sel->page->prev) {
|
if (menu->sel && menu->sel->page->prev) {
|
||||||
menu->sel = menu->sel->page->prev->first;
|
menu->sel = menu->sel->page->prev->first;
|
||||||
render_frame(menu);
|
render_frame(menu);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case XKB_KEY_Page_Down:
|
case XKB_KEY_Next:
|
||||||
case XKB_KEY_KP_Page_Down:
|
case XKB_KEY_KP_Next:
|
||||||
if (menu->sel && menu->sel->page->next) {
|
if (menu->sel && menu->sel->page->next) {
|
||||||
menu->sel = menu->sel->page->next->first;
|
menu->sel = menu->sel->page->next->first;
|
||||||
render_frame(menu);
|
render_frame(menu);
|
||||||
|
|
Loading…
Add table
Reference in a new issue