From 040d613e243aaf3a8e49f799e272371620c776ba Mon Sep 17 00:00:00 2001 From: camh Date: Thu, 27 Jan 2022 23:45:14 -0800 Subject: [PATCH] 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 --- nuklear.h | 38 +++++++++++++++++++++++++++----------- nuklear_app.c | 4 +--- nuklear_quickdraw.h | 7 +++---- 3 files changed, 31 insertions(+), 18 deletions(-) diff --git a/nuklear.h b/nuklear.h index 7725665..af1e906 100644 --- a/nuklear.h +++ b/nuklear.h @@ -7818,6 +7818,9 @@ nk_input_glyph(struct nk_context *ctx, const nk_glyph glyph) NK_INPUT_MAX - in->keyboard.text_len); in->keyboard.text_len += len; } + + // in->keyboard.keys[key].clicked++; + // in->keyboard.keys[key].down = down; } NK_API void 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_textedit_delete(struct nk_text_edit *state, short where, short len) { + /* delete characters while updating undo */ nk_textedit_makeundo_delete(state, where, len); nk_str_delete_runes(&state->string, where, len); @@ -16046,8 +16050,9 @@ retry: nk_textedit_delete_selection(state); else { short n = state->string.len; - if (state->cursor < n) + if (state->cursor < n) { nk_textedit_delete(state, state->cursor, 1); + } } state->has_preferred_x = 0; break; @@ -16706,18 +16711,29 @@ nk_do_edit(nk_flags *state, struct nk_command_buffer *out, cursor_follow = nk_true; } - {short i; /* keyboard input */ - short old_mode = edit->mode; - for (i = 0; i < NK_KEY_MAX; ++i) { - if (i == NK_KEY_ENTER || i == NK_KEY_TAB) continue; /* special case */ - if (nk_input_is_key_pressed(in, (enum nk_keys)i)) { - nk_textedit_key(edit, (enum nk_keys)i, shift_mod, font, row_height); - cursor_follow = nk_true; + { /* keyboard input */ + short i; + short old_mode = edit->mode; + for (i = 0; i < NK_KEY_MAX; ++i) { + + if (i == NK_KEY_ENTER || i == NK_KEY_TAB) { + + continue; /* special case */ + } + + if (nk_input_is_key_pressed(in, (enum nk_keys)i)) { + + nk_textedit_key(edit, (enum nk_keys)i, shift_mod, font, row_height); + 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) { + in->keyboard.text_len = 0; } } - if (old_mode != edit->mode) { - in->keyboard.text_len = 0; - }} /* text input */ edit->filter = filter; diff --git a/nuklear_app.c b/nuklear_app.c index 6b912c2..d45f433 100644 --- a/nuklear_app.c +++ b/nuklear_app.c @@ -1,7 +1,5 @@ // TODO: -// - test, 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 +// - test on physical, bug fixes, write blog posts #define WINDOW_WIDTH 510 #define WINDOW_HEIGHT 302 diff --git a/nuklear_quickdraw.h b/nuklear_quickdraw.h index 7581a4e..3fe6cd7 100644 --- a/nuklear_quickdraw.h +++ b/nuklear_quickdraw.h @@ -1184,7 +1184,7 @@ NK_API int nk_quickdraw_handle_event(EventRecord *event, struct nk_context *nukl FindWindow(event->where, &window); // char logb[255]; // sprintf(logb, "nk_quickdraw_handle_event event %d", event->what); - // // writeSerialPortDebug(boutRefNum, logb); + // writeSerialPortDebug(boutRefNum, logb); switch (event->what) { case updateEvt: { @@ -1323,9 +1323,8 @@ NK_API int nk_quickdraw_handle_event(EventRecord *event, struct nk_context *nukl nk_input_key(nuklear_context, NK_KEY_SHIFT, isKeyDown); } else if (key == deleteKey && isKeyDown) { - - nk_input_key(nuklear_context, NK_KEY_DEL, 1); - nk_input_key(nuklear_context, NK_KEY_DEL, 0); + + nk_input_key(nuklear_context, NK_KEY_DEL, isKeyDown); } else if (key == enterKey) { nk_input_key(nuklear_context, NK_KEY_ENTER, isKeyDown);