fix problems with non-char keyboard input causing more than one input -- pretty much complete and now back to needing a physical mac to test with

This commit is contained in:
camh 2022-01-27 23:45:14 -08:00
parent 111e717b15
commit 040d613e24
3 changed files with 31 additions and 18 deletions

View File

@ -7818,6 +7818,9 @@ nk_input_glyph(struct nk_context *ctx, const nk_glyph glyph)
NK_INPUT_MAX - in->keyboard.text_len); NK_INPUT_MAX - in->keyboard.text_len);
in->keyboard.text_len += len; in->keyboard.text_len += len;
} }
// in->keyboard.keys[key].clicked++;
// in->keyboard.keys[key].down = down;
} }
NK_API void NK_API void
nk_input_char(struct nk_context *ctx, char c) nk_input_char(struct nk_context *ctx, char c)
@ -15643,6 +15646,7 @@ nk_textedit_clamp(struct nk_text_edit *state)
NK_API void NK_API void
nk_textedit_delete(struct nk_text_edit *state, short where, short len) nk_textedit_delete(struct nk_text_edit *state, short where, short len)
{ {
/* delete characters while updating undo */ /* delete characters while updating undo */
nk_textedit_makeundo_delete(state, where, len); nk_textedit_makeundo_delete(state, where, len);
nk_str_delete_runes(&state->string, where, len); nk_str_delete_runes(&state->string, where, len);
@ -16046,9 +16050,10 @@ retry:
nk_textedit_delete_selection(state); nk_textedit_delete_selection(state);
else { else {
short n = state->string.len; short n = state->string.len;
if (state->cursor < n) if (state->cursor < n) {
nk_textedit_delete(state, state->cursor, 1); nk_textedit_delete(state, state->cursor, 1);
} }
}
state->has_preferred_x = 0; state->has_preferred_x = 0;
break; break;
@ -16706,18 +16711,29 @@ nk_do_edit(nk_flags *state, struct nk_command_buffer *out,
cursor_follow = nk_true; cursor_follow = nk_true;
} }
{short i; /* keyboard input */ { /* keyboard input */
short i;
short old_mode = edit->mode; short old_mode = edit->mode;
for (i = 0; i < NK_KEY_MAX; ++i) { for (i = 0; i < NK_KEY_MAX; ++i) {
if (i == NK_KEY_ENTER || i == NK_KEY_TAB) continue; /* special case */
if (i == NK_KEY_ENTER || i == NK_KEY_TAB) {
continue; /* special case */
}
if (nk_input_is_key_pressed(in, (enum nk_keys)i)) { if (nk_input_is_key_pressed(in, (enum nk_keys)i)) {
nk_textedit_key(edit, (enum nk_keys)i, shift_mod, font, row_height); nk_textedit_key(edit, (enum nk_keys)i, shift_mod, font, row_height);
cursor_follow = nk_true; cursor_follow = nk_true;
in->keyboard.keys[(enum nk_keys)i].down = nk_false;
in->keyboard.keys[(enum nk_keys)i].clicked--;
} }
} }
if (old_mode != edit->mode) { if (old_mode != edit->mode) {
in->keyboard.text_len = 0; in->keyboard.text_len = 0;
}} }
}
/* text input */ /* text input */
edit->filter = filter; edit->filter = filter;

View File

@ -1,7 +1,5 @@
// TODO: // TODO:
// - test, bug fixes, write blog posts // - test on physical, bug fixes, write blog posts
// - bug: messages start over-writing eachother in main chat -- need a way to force clear it
// - bug: delete key deletes infinitely
#define WINDOW_WIDTH 510 #define WINDOW_WIDTH 510
#define WINDOW_HEIGHT 302 #define WINDOW_HEIGHT 302

View File

@ -1184,7 +1184,7 @@ NK_API int nk_quickdraw_handle_event(EventRecord *event, struct nk_context *nukl
FindWindow(event->where, &window); FindWindow(event->where, &window);
// char logb[255]; // char logb[255];
// sprintf(logb, "nk_quickdraw_handle_event event %d", event->what); // sprintf(logb, "nk_quickdraw_handle_event event %d", event->what);
// // writeSerialPortDebug(boutRefNum, logb); // writeSerialPortDebug(boutRefNum, logb);
switch (event->what) { switch (event->what) {
case updateEvt: { case updateEvt: {
@ -1324,8 +1324,7 @@ NK_API int nk_quickdraw_handle_event(EventRecord *event, struct nk_context *nukl
nk_input_key(nuklear_context, NK_KEY_SHIFT, isKeyDown); nk_input_key(nuklear_context, NK_KEY_SHIFT, isKeyDown);
} else if (key == deleteKey && isKeyDown) { } else if (key == deleteKey && isKeyDown) {
nk_input_key(nuklear_context, NK_KEY_DEL, 1); nk_input_key(nuklear_context, NK_KEY_DEL, isKeyDown);
nk_input_key(nuklear_context, NK_KEY_DEL, 0);
} else if (key == enterKey) { } else if (key == enterKey) {
nk_input_key(nuklear_context, NK_KEY_ENTER, isKeyDown); nk_input_key(nuklear_context, NK_KEY_ENTER, isKeyDown);