reintroduce focus, as I ran out of keycodes for the input

This commit is contained in:
Florian Stinglmayr 2019-07-20 11:57:06 +02:00
parent 9a90773210
commit ec41ec2c87
6 changed files with 114 additions and 51 deletions

View File

@ -17,7 +17,8 @@ typedef struct {
extern ncdc_keybinding_t keys_guilds[]; extern ncdc_keybinding_t keys_guilds[];
extern ncdc_keybinding_t keys_emacs[]; extern ncdc_keybinding_t keys_emacs[];
extern ncdc_keybinding_t keys_mainwin[]; extern ncdc_keybinding_t keys_chat[];
extern ncdc_keybinding_t keys_global[];
ncdc_keybinding_t *ncdc_find_keybinding(ncdc_keybinding_t *keys, ncdc_keybinding_t *ncdc_find_keybinding(ncdc_keybinding_t *keys,
wchar_t const *key, size_t l); wchar_t const *key, size_t l);

View File

@ -23,6 +23,9 @@ void ncdc_mainwindow_input_ready(ncdc_mainwindow_t n);
void ncdc_mainwindow_rightview(ncdc_mainwindow_t n); void ncdc_mainwindow_rightview(ncdc_mainwindow_t n);
void ncdc_mainwindow_leftview(ncdc_mainwindow_t n); void ncdc_mainwindow_leftview(ncdc_mainwindow_t n);
void ncdc_mainwindow_switch_guilds(ncdc_mainwindow_t n);
void ncdc_mainwindow_switch_input(ncdc_mainwindow_t n);
void ncdc_mainwindow_switch_chat(ncdc_mainwindow_t n);
void ncdc_mainwindow_update_guilds(ncdc_mainwindow_t n); void ncdc_mainwindow_update_guilds(ncdc_mainwindow_t n);

View File

@ -56,7 +56,7 @@ extern void *mainwindow;
bool is_logged_in(void); bool is_logged_in(void);
wchar_t *util_readkey(int esc, WINDOW *win); wchar_t *util_readkey(int esc);
void exit_main(void); void exit_main(void);

View File

@ -23,35 +23,56 @@ ncdc_keybinding_t keys_guilds[] = {
/* CTRL+KEY_UP /* CTRL+KEY_UP
*/ */
NCDC_BINDING(L"\x1B[1;5A", L"previous-item", ncdc_treeview_previous), NCDC_BINDING(L"\x1B[1;5A", L"previous-item", ncdc_treeview_previous),
NCDC_BINDING(L"\x1BOA", L"previous-item", ncdc_treeview_previous),
/* CTRL+KEY_DOWN /* CTRL+KEY_DOWN
*/ */
NCDC_BINDING(L"\x1B[1;5B", L"next-item", ncdc_treeview_next), NCDC_BINDING(L"\x1B[1;5B", L"next-item", ncdc_treeview_next),
NCDC_BINDING(L"\x1BOB", L"next-item", ncdc_treeview_next),
/* CTRL+KEY_RIGHT /* CTRL+KEY_RIGHT
*/ */
NCDC_BINDING(L"\x1B[1;5C", L"expand-item", ncdc_treeview_expand), NCDC_BINDING(L"\x1B[1;5C", L"expand-item", ncdc_treeview_expand),
NCDC_BINDING(L"\x1BOC", L"expand-item", ncdc_treeview_expand),
/* CTRL+KEY_LEFT /* CTRL+KEY_LEFT
*/ */
NCDC_BINDING(L"\x1B[1;5D", L"collapse-item", ncdc_treeview_collapse), NCDC_BINDING(L"\x1B[1;5D", L"collapse-item", ncdc_treeview_collapse),
NCDC_BINDING(L"\x1BOD", L"collapse-item", ncdc_treeview_collapse),
NCDC_BINDEND() NCDC_BINDEND()
}; };
ncdc_keybinding_t keys_mainwin[] = { ncdc_keybinding_t keys_chat[] = {
/* ALT+KEY_RIGHT /* ALT+KEY_RIGHT
*/ */
NCDC_BINDING(L"\x1B[1;3C", L"right-window", ncdc_mainwindow_rightview), NCDC_BINDING(L"\x1B[1;3C", L"right-window", ncdc_mainwindow_rightview),
NCDC_BINDING(L"\x1B0C", L"right-window", ncdc_mainwindow_rightview),
/* ALT+KEY_LEFT /* ALT+KEY_LEFT
*/ */
NCDC_BINDING(L"\x1B[1;3D", L"left-window", ncdc_mainwindow_leftview), NCDC_BINDING(L"\x1B[1;3D", L"left-window", ncdc_mainwindow_leftview),
NCDC_BINDING(L"\x1B0D", L"left-window", ncdc_mainwindow_leftview),
NCDC_BINDEND()
};
ncdc_keybinding_t keys_global[] = {
/* F1
*/
NCDC_BINDING(L"\x1BOP", L"select-input", ncdc_mainwindow_switch_input),
/* F2
*/
NCDC_BINDING(L"\x1BOQ", L"select-guilds", ncdc_mainwindow_switch_guilds),
/* F3
*/
NCDC_BINDING(L"\x1BOR", L"select-chat", ncdc_mainwindow_switch_chat),
NCDC_BINDEND() NCDC_BINDEND()
}; };
ncdc_keybinding_t keys_emacs[] = { ncdc_keybinding_t keys_emacs[] = {
/* key left /* key left
*/ */
NCDC_BINDCUR(KEY_LEFT, L"backward", ncdc_input_backward), NCDC_BINDING(L"\x1BOD", L"backward", ncdc_input_backward),
/* key right /* key right
*/ */
NCDC_BINDCUR(KEY_RIGHT, L"forward", ncdc_input_forward), NCDC_BINDING(L"\x1BOC", L"forward", ncdc_input_forward),
/* CTRL+F /* CTRL+F
*/ */
NCDC_BINDING(L"\x06", L"forward", ncdc_input_forward), NCDC_BINDING(L"\x06", L"forward", ncdc_input_forward),
@ -70,6 +91,8 @@ ncdc_keybinding_t keys_emacs[] = {
/* CTRL+D /* CTRL+D
*/ */
NCDC_BINDING(L"\x04", L"delete", ncdc_input_delete), NCDC_BINDING(L"\x04", L"delete", ncdc_input_delete),
NCDC_BINDCUR(KEY_BACKSPACE, L"delete", ncdc_input_delete_backward), /* BACKSPACE
*/
NCDC_BINDING(L"\x7F", L"delete", ncdc_input_delete_backward),
NCDC_BINDEND() NCDC_BINDEND()
}; };

View File

@ -184,14 +184,17 @@ static void ncdc_mainwindow_update_focus(ncdc_mainwindow_t n)
switch (n->focus) { switch (n->focus) {
case FOCUS_GUILDS: case FOCUS_GUILDS:
{ {
curs_set(0);
} break; } break;
case FOCUS_CHAT: case FOCUS_CHAT:
{ {
curs_set(0);
} break; } break;
case FOCUS_INPUT: case FOCUS_INPUT:
{ {
curs_set(1);
wmove(n->input, 0, ncdc_input_cursor(n->in)); wmove(n->input, 0, ncdc_input_cursor(n->in));
wrefresh(n->input); wrefresh(n->input);
} break; } break;
@ -343,26 +346,12 @@ void ncdc_mainwindow_input_ready(ncdc_mainwindow_t n)
wint_t i = 0; wint_t i = 0;
wchar_t *key = NULL; wchar_t *key = NULL;
size_t keylen = 0; size_t keylen = 0;
WINDOW *win = NULL;
ncdc_keybinding_t *k = NULL; ncdc_keybinding_t *k = NULL;
switch (n->focus) { i = fgetwc(stdin);
case FOCUS_INPUT: win = n->input; break;
case FOCUS_CHAT: win = n->chat; break;
case FOCUS_GUILDS: win = n->guilds; break;
}
if (wget_wch(win, &i) == ERR) {
return;
}
if (i == KEY_RESIZE) {
ncdc_mainwindow_resize(n);
return;
}
if (i == KEY_ESCAPE) { if (i == KEY_ESCAPE) {
if ((key = util_readkey(i, n->input)) == NULL) { if ((key = util_readkey(i)) == NULL) {
return; return;
} }
keylen = wcslen(key); keylen = wcslen(key);
@ -379,17 +368,30 @@ void ncdc_mainwindow_input_ready(ncdc_mainwindow_t n)
fclose(f); fclose(f);
if (key != NULL && if (key != NULL &&
(k = ncdc_find_keybinding(keys_mainwin, key, keylen)) != NULL) { (k = ncdc_find_keybinding(keys_global, key, keylen)) != NULL) {
k->handler(n); k->handler(n);
return; return;
} }
switch (n->focus) {
case FOCUS_CHAT:
{
if (key != NULL &&
(k = ncdc_find_keybinding(keys_chat, key, keylen)) != NULL) {
k->handler(n->guildview);
}
} break;
case FOCUS_GUILDS:
{
if (key != NULL && if (key != NULL &&
(k = ncdc_find_keybinding(keys_guilds, key, keylen)) != NULL) { (k = ncdc_find_keybinding(keys_guilds, key, keylen)) != NULL) {
k->handler(n->guildview); k->handler(n->guildview);
return;
} }
} break;
case FOCUS_INPUT:
{
if (n->focus == FOCUS_INPUT) { if (n->focus == FOCUS_INPUT) {
if (key == NULL) { if (key == NULL) {
ncdc_input_feed(n->in, (wchar_t const *)&i, 1); ncdc_input_feed(n->in, (wchar_t const *)&i, 1);
@ -397,6 +399,8 @@ void ncdc_mainwindow_input_ready(ncdc_mainwindow_t n)
ncdc_input_feed(n->in, key, wcslen(key)); ncdc_input_feed(n->in, key, wcslen(key));
} }
} }
} break;
}
free(key); free(key);
} }
@ -469,6 +473,27 @@ static void ncdc_mainwindow_ack_view(ncdc_mainwindow_t n)
#endif #endif
} }
void ncdc_mainwindow_switch_guilds(ncdc_mainwindow_t n)
{
return_if_true(n == NULL,);
n->focus = FOCUS_GUILDS;
ncdc_mainwindow_update_focus(n);
}
void ncdc_mainwindow_switch_input(ncdc_mainwindow_t n)
{
return_if_true(n == NULL,);
n->focus = FOCUS_INPUT;
ncdc_mainwindow_update_focus(n);
}
void ncdc_mainwindow_switch_chat(ncdc_mainwindow_t n)
{
return_if_true(n == NULL,);
n->focus = FOCUS_CHAT;
ncdc_mainwindow_update_focus(n);
}
void ncdc_mainwindow_rightview(ncdc_mainwindow_t n) void ncdc_mainwindow_rightview(ncdc_mainwindow_t n)
{ {
return_if_true(n == NULL,); return_if_true(n == NULL,);

View File

@ -6,18 +6,29 @@ bool is_logged_in(void)
return dc_session_has_token(current_session); return dc_session_has_token(current_session);
} }
wchar_t *util_readkey(int e, WINDOW *win) wchar_t *util_readkey(int e)
{ {
wint_t esc[7] = {0}; wint_t esc[7] = {0};
int i = 0; int i = 0;
int len = 0;
return_if_true(e != KEY_ESCAPE, NULL); return_if_true(e != KEY_ESCAPE, NULL);
esc[0] = e; esc[0] = e;
for (i = 1; i < 6; i++) { esc[1] = fgetwc(stdin);
if (wget_wch(win, esc+i) == ERR) {
return NULL; switch (esc[1]) {
/* here it depends on the next character we read
*/
case L'[': len = 3; break;
/* O codes move the cursor, and have one additional bit set
*/
case L'O': len = 1; break;
default: len = 5;
} }
for (i = 0; i < len; i++) {
esc[i+2] = fgetwc(stdin);
} }
return wcsdup((wchar_t const *)esc); return wcsdup((wchar_t const *)esc);