allow hotkeys to affect other windows too
This commit is contained in:
parent
7a565e4764
commit
82d36c38f1
@ -15,9 +15,9 @@ SET(SOURCES
|
||||
"include/ncdc/textview.h"
|
||||
"src/cmds.c"
|
||||
"src/config.c"
|
||||
"src/emacs.c"
|
||||
"src/friends.c"
|
||||
"src/input.c"
|
||||
"src/keycodes.c"
|
||||
"src/login.c"
|
||||
"src/mainwindow.c"
|
||||
"src/msg.c"
|
||||
|
@ -2,19 +2,23 @@
|
||||
#define NCDC_KEYCODES_H
|
||||
|
||||
#include <ncdc/ncdc.h>
|
||||
#include <ncdc/input.h>
|
||||
|
||||
typedef void (*ncdc_keybinding_t)(void *p);
|
||||
typedef void (*ncdc_keyhandler_t)(void *p);
|
||||
|
||||
typedef struct {
|
||||
wchar_t key[10];
|
||||
wchar_t const *name;
|
||||
ncdc_keybinding_t handler;
|
||||
} ncdc_input_keybinding_t;
|
||||
ncdc_keyhandler_t handler;
|
||||
} ncdc_keybinding_t;
|
||||
|
||||
#define NCDC_BINDCUR(k, n, f) { .key = { k, '\0' }, .name = n, .handler = (ncdc_keybinding_t) f }
|
||||
#define NCDC_BINDING(k, n, f) { .key = k, .name = n, .handler = (ncdc_keybinding_t) f }
|
||||
#define NCDC_BINDCUR(k, n, f) { .key = { k, '\0' }, .name = n, .handler = (ncdc_keyhandler_t) f }
|
||||
#define NCDC_BINDING(k, n, f) { .key = k, .name = n, .handler = (ncdc_keyhandler_t) f }
|
||||
#define NCDC_BINDEND() { .key = {0}, .name = NULL, .handler = NULL }
|
||||
|
||||
extern ncdc_input_keybinding_t emacs[];
|
||||
extern ncdc_keybinding_t keys_emacs[];
|
||||
extern ncdc_keybinding_t keys_mainwin[];
|
||||
|
||||
ncdc_keybinding_t *ncdc_find_keybinding(ncdc_keybinding_t *keys,
|
||||
wchar_t const *key, size_t l);
|
||||
|
||||
#endif
|
||||
|
@ -20,4 +20,7 @@ void ncdc_mainwindow_switchview(ncdc_mainwindow_t n, int idx);
|
||||
void ncdc_mainwindow_refresh(ncdc_mainwindow_t n);
|
||||
void ncdc_mainwindow_input_ready(ncdc_mainwindow_t n);
|
||||
|
||||
void ncdc_mainwindow_rightview(ncdc_mainwindow_t n);
|
||||
void ncdc_mainwindow_leftview(ncdc_mainwindow_t n);
|
||||
|
||||
#endif
|
||||
|
@ -1,21 +0,0 @@
|
||||
#include <ncdc/keycodes.h>
|
||||
|
||||
ncdc_input_keybinding_t emacs[] = {
|
||||
/* key left
|
||||
*/
|
||||
NCDC_BINDCUR(KEY_LEFT, L"backward", ncdc_input_backward),
|
||||
/* key right
|
||||
*/
|
||||
NCDC_BINDCUR(KEY_RIGHT, L"forward", ncdc_input_forward),
|
||||
/* CTRL+F
|
||||
*/
|
||||
NCDC_BINDING(L"\x06", L"forward", ncdc_input_forward),
|
||||
/* CTRL+B
|
||||
*/
|
||||
NCDC_BINDING(L"\x02", L"backward", ncdc_input_backward),
|
||||
/* CTRL+D
|
||||
*/
|
||||
NCDC_BINDING(L"\x04", L"delete", ncdc_input_delete),
|
||||
NCDC_BINDCUR(KEY_BACKSPACE, L"delete", ncdc_input_delete_backward),
|
||||
NCDC_BINDING({0}, NULL, NULL)
|
||||
};
|
@ -8,7 +8,7 @@ struct ncdc_input_
|
||||
|
||||
GArray *buffer;
|
||||
int cursor;
|
||||
ncdc_input_keybinding_t *keys;
|
||||
ncdc_keybinding_t *keys;
|
||||
|
||||
ncdc_input_callback_t callback;
|
||||
void *callback_arg;
|
||||
@ -33,35 +33,20 @@ ncdc_input_t ncdc_input_new(void)
|
||||
p->buffer = g_array_new(TRUE, TRUE, sizeof(wchar_t));
|
||||
p->cursor = 0;
|
||||
|
||||
p->keys = emacs;
|
||||
p->keys = keys_emacs;
|
||||
|
||||
return p;
|
||||
}
|
||||
|
||||
static ncdc_keybinding_t
|
||||
has_binding(ncdc_input_t in, wchar_t const *key, size_t l)
|
||||
{
|
||||
size_t i = 0;
|
||||
|
||||
for (; in->keys[i].name != NULL; i++) {
|
||||
if ((l == sizeof(wchar_t) && key[0] == in->keys[i].key[0]) ||
|
||||
wcscmp(key, in->keys[i].key) == 0) {
|
||||
return in->keys[i].handler;
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void ncdc_input_feed(ncdc_input_t input, wchar_t const *c, size_t sz)
|
||||
{
|
||||
return_if_true(input == NULL,);
|
||||
ncdc_keybinding_t handler = NULL;
|
||||
ncdc_keybinding_t *bind = NULL;
|
||||
|
||||
if (c[0] == '\r') {
|
||||
ncdc_input_enter(input);
|
||||
} else if ((handler = has_binding(input, c, sz)) != NULL) {
|
||||
handler(input);
|
||||
} else if ((bind = ncdc_find_keybinding(input->keys, c, sz)) != NULL) {
|
||||
bind->handler(input);
|
||||
} else if (iswprint(c[0])) {
|
||||
g_array_insert_vals(input->buffer, input->cursor, &c[0], 1);
|
||||
input->cursor += wcswidth(&c[0], 1);
|
||||
|
49
ncdc/src/keycodes.c
Normal file
49
ncdc/src/keycodes.c
Normal file
@ -0,0 +1,49 @@
|
||||
#include <ncdc/keycodes.h>
|
||||
|
||||
#include <ncdc/mainwindow.h>
|
||||
#include <ncdc/input.h>
|
||||
|
||||
ncdc_keybinding_t *
|
||||
ncdc_find_keybinding(ncdc_keybinding_t *keys, wchar_t const *key, size_t l)
|
||||
{
|
||||
size_t i = 0;
|
||||
|
||||
for (i = 0; keys[i].name != NULL; i++) {
|
||||
if ((l == sizeof(wchar_t) && key[0] == keys[i].key[0]) ||
|
||||
wcscmp(key, keys[i].key) == 0) {
|
||||
return keys+i;
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ncdc_keybinding_t keys_mainwin[] = {
|
||||
/* ALT+KEY_RIGHT
|
||||
*/
|
||||
NCDC_BINDING(L"\x1B[1;3C", L"right-window", ncdc_mainwindow_rightview),
|
||||
/* ALT+KEY_LEFT
|
||||
*/
|
||||
NCDC_BINDING(L"\x1B[1;3D", L"left-window", ncdc_mainwindow_leftview),
|
||||
NCDC_BINDEND()
|
||||
};
|
||||
|
||||
ncdc_keybinding_t keys_emacs[] = {
|
||||
/* key left
|
||||
*/
|
||||
NCDC_BINDCUR(KEY_LEFT, L"backward", ncdc_input_backward),
|
||||
/* key right
|
||||
*/
|
||||
NCDC_BINDCUR(KEY_RIGHT, L"forward", ncdc_input_forward),
|
||||
/* CTRL+F
|
||||
*/
|
||||
NCDC_BINDING(L"\x06", L"forward", ncdc_input_forward),
|
||||
/* CTRL+B
|
||||
*/
|
||||
NCDC_BINDING(L"\x02", L"backward", ncdc_input_backward),
|
||||
/* CTRL+D
|
||||
*/
|
||||
NCDC_BINDING(L"\x04", L"delete", ncdc_input_delete),
|
||||
NCDC_BINDCUR(KEY_BACKSPACE, L"delete", ncdc_input_delete_backward),
|
||||
NCDC_BINDEND()
|
||||
};
|
@ -186,7 +186,9 @@ void ncdc_mainwindow_input_ready(ncdc_mainwindow_t n)
|
||||
{
|
||||
wint_t i = 0;
|
||||
wchar_t *key = NULL;
|
||||
size_t keylen = 0;
|
||||
WINDOW *win = NULL;
|
||||
ncdc_keybinding_t *k = NULL;
|
||||
|
||||
switch (n->focus) {
|
||||
case FOCUS_INPUT: win = n->input; break;
|
||||
@ -203,15 +205,23 @@ void ncdc_mainwindow_input_ready(ncdc_mainwindow_t n)
|
||||
return;
|
||||
}
|
||||
|
||||
if (i == KEY_ESCAPE &&
|
||||
(key = util_readkey(i, n->input)) == NULL) {
|
||||
return;
|
||||
if (i == KEY_ESCAPE) {
|
||||
if ((key = util_readkey(i, n->input)) == NULL) {
|
||||
return;
|
||||
}
|
||||
keylen = wcslen(key);
|
||||
}
|
||||
|
||||
FILE *f = fopen("keys.txt", "a+");
|
||||
fwprintf(f, L"%d - %ls\n", i, (key == NULL ? L"n/a" : key));
|
||||
fwprintf(f, L"%d - %ls\n", i, (key == NULL ? L"n/a" : &key[1]));
|
||||
fclose(f);
|
||||
|
||||
if (key != NULL &&
|
||||
(k = ncdc_find_keybinding(keys_mainwin, key, keylen)) != NULL) {
|
||||
k->handler(n);
|
||||
return;
|
||||
}
|
||||
|
||||
if (n->focus == FOCUS_INPUT) {
|
||||
if (key == NULL) {
|
||||
ncdc_input_feed(n->in, (wchar_t const *)&i, sizeof(wchar_t));
|
||||
@ -271,3 +281,15 @@ void ncdc_mainwindow_log(ncdc_mainwindow_t w, wchar_t const *fmt, ...)
|
||||
|
||||
ncdc_textview_append(w->log, buf);
|
||||
}
|
||||
|
||||
void ncdc_mainwindow_rightview(ncdc_mainwindow_t n)
|
||||
{
|
||||
return_if_true(n == NULL,);
|
||||
n->curview = (n->curview + 1) % n->views->len;
|
||||
}
|
||||
|
||||
void ncdc_mainwindow_leftview(ncdc_mainwindow_t n)
|
||||
{
|
||||
return_if_true(n == NULL,);
|
||||
n->curview = (n->curview - 1) % n->views->len;
|
||||
}
|
||||
|
@ -167,6 +167,7 @@ int main(int ac, char **av)
|
||||
}
|
||||
|
||||
initscr();
|
||||
cbreak();
|
||||
noecho();
|
||||
nonl();
|
||||
keypad(stdscr, TRUE);
|
||||
|
@ -8,7 +8,7 @@ wchar_t *util_readkey(int e, WINDOW *win)
|
||||
return_if_true(e != KEY_ESCAPE, NULL);
|
||||
|
||||
esc[0] = e;
|
||||
for (i = 1; i < 7; i++) {
|
||||
for (i = 1; i < 6; i++) {
|
||||
if (wget_wch(win, esc+i) == ERR) {
|
||||
return NULL;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user