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"
|
"include/ncdc/textview.h"
|
||||||
"src/cmds.c"
|
"src/cmds.c"
|
||||||
"src/config.c"
|
"src/config.c"
|
||||||
"src/emacs.c"
|
|
||||||
"src/friends.c"
|
"src/friends.c"
|
||||||
"src/input.c"
|
"src/input.c"
|
||||||
|
"src/keycodes.c"
|
||||||
"src/login.c"
|
"src/login.c"
|
||||||
"src/mainwindow.c"
|
"src/mainwindow.c"
|
||||||
"src/msg.c"
|
"src/msg.c"
|
||||||
|
@ -2,19 +2,23 @@
|
|||||||
#define NCDC_KEYCODES_H
|
#define NCDC_KEYCODES_H
|
||||||
|
|
||||||
#include <ncdc/ncdc.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 {
|
typedef struct {
|
||||||
wchar_t key[10];
|
wchar_t key[10];
|
||||||
wchar_t const *name;
|
wchar_t const *name;
|
||||||
ncdc_keybinding_t handler;
|
ncdc_keyhandler_t handler;
|
||||||
} ncdc_input_keybinding_t;
|
} ncdc_keybinding_t;
|
||||||
|
|
||||||
#define NCDC_BINDCUR(k, n, f) { .key = { k, '\0' }, .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_keybinding_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
|
#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_refresh(ncdc_mainwindow_t n);
|
||||||
void ncdc_mainwindow_input_ready(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
|
#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;
|
GArray *buffer;
|
||||||
int cursor;
|
int cursor;
|
||||||
ncdc_input_keybinding_t *keys;
|
ncdc_keybinding_t *keys;
|
||||||
|
|
||||||
ncdc_input_callback_t callback;
|
ncdc_input_callback_t callback;
|
||||||
void *callback_arg;
|
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->buffer = g_array_new(TRUE, TRUE, sizeof(wchar_t));
|
||||||
p->cursor = 0;
|
p->cursor = 0;
|
||||||
|
|
||||||
p->keys = emacs;
|
p->keys = keys_emacs;
|
||||||
|
|
||||||
return p;
|
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)
|
void ncdc_input_feed(ncdc_input_t input, wchar_t const *c, size_t sz)
|
||||||
{
|
{
|
||||||
return_if_true(input == NULL,);
|
return_if_true(input == NULL,);
|
||||||
ncdc_keybinding_t handler = NULL;
|
ncdc_keybinding_t *bind = NULL;
|
||||||
|
|
||||||
if (c[0] == '\r') {
|
if (c[0] == '\r') {
|
||||||
ncdc_input_enter(input);
|
ncdc_input_enter(input);
|
||||||
} else if ((handler = has_binding(input, c, sz)) != NULL) {
|
} else if ((bind = ncdc_find_keybinding(input->keys, c, sz)) != NULL) {
|
||||||
handler(input);
|
bind->handler(input);
|
||||||
} else if (iswprint(c[0])) {
|
} else if (iswprint(c[0])) {
|
||||||
g_array_insert_vals(input->buffer, input->cursor, &c[0], 1);
|
g_array_insert_vals(input->buffer, input->cursor, &c[0], 1);
|
||||||
input->cursor += wcswidth(&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;
|
wint_t i = 0;
|
||||||
wchar_t *key = NULL;
|
wchar_t *key = NULL;
|
||||||
|
size_t keylen = 0;
|
||||||
WINDOW *win = NULL;
|
WINDOW *win = NULL;
|
||||||
|
ncdc_keybinding_t *k = NULL;
|
||||||
|
|
||||||
switch (n->focus) {
|
switch (n->focus) {
|
||||||
case FOCUS_INPUT: win = n->input; break;
|
case FOCUS_INPUT: win = n->input; break;
|
||||||
@ -203,15 +205,23 @@ void ncdc_mainwindow_input_ready(ncdc_mainwindow_t n)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (i == KEY_ESCAPE &&
|
if (i == KEY_ESCAPE) {
|
||||||
(key = util_readkey(i, n->input)) == NULL) {
|
if ((key = util_readkey(i, n->input)) == NULL) {
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
keylen = wcslen(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
FILE *f = fopen("keys.txt", "a+");
|
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);
|
fclose(f);
|
||||||
|
|
||||||
|
if (key != NULL &&
|
||||||
|
(k = ncdc_find_keybinding(keys_mainwin, key, keylen)) != NULL) {
|
||||||
|
k->handler(n);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
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, sizeof(wchar_t));
|
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);
|
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();
|
initscr();
|
||||||
|
cbreak();
|
||||||
noecho();
|
noecho();
|
||||||
nonl();
|
nonl();
|
||||||
keypad(stdscr, TRUE);
|
keypad(stdscr, TRUE);
|
||||||
|
@ -8,7 +8,7 @@ wchar_t *util_readkey(int e, WINDOW *win)
|
|||||||
return_if_true(e != KEY_ESCAPE, NULL);
|
return_if_true(e != KEY_ESCAPE, NULL);
|
||||||
|
|
||||||
esc[0] = e;
|
esc[0] = e;
|
||||||
for (i = 1; i < 7; i++) {
|
for (i = 1; i < 6; i++) {
|
||||||
if (wget_wch(win, esc+i) == ERR) {
|
if (wget_wch(win, esc+i) == ERR) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user