Skip to content

Commit 76b10f0

Browse files
authored
Merge pull request #786 from rswinkle/fix_glfw_repeat_behavior
Fix glfw repeat behavior
2 parents c98aa92 + fd2c65e commit 76b10f0

File tree

8 files changed

+339
-122
lines changed

8 files changed

+339
-122
lines changed

demo/glfw_opengl2/main.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
#define NK_INCLUDE_DEFAULT_FONT
2121
#define NK_IMPLEMENTATION
2222
#define NK_GLFW_GL2_IMPLEMENTATION
23-
#define NK_KEYSTATE_BASED_INPUT
2423
#include "../../nuklear.h"
2524
#include "nuklear_glfw_gl2.h"
2625

demo/glfw_opengl2/nuklear_glfw_gl2.h

Lines changed: 81 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,9 @@ NK_API void nk_glfw3_render(enum nk_anti_aliasing);
2828
NK_API void nk_glfw3_shutdown(void);
2929

3030
NK_API void nk_glfw3_char_callback(GLFWwindow *win, unsigned int codepoint);
31+
NK_API void nk_glfw3_key_callback(GLFWwindow *win, int key, int scancode, int action, int mods);
3132
NK_API void nk_gflw3_scroll_callback(GLFWwindow *win, double xoff, double yoff);
33+
NK_API void nk_glfw3_mouse_button_callback(GLFWwindow* window, int button, int action, int mods);
3234

3335
#endif
3436

@@ -74,6 +76,7 @@ static struct nk_glfw {
7476
struct nk_font_atlas atlas;
7577
struct nk_vec2 fb_scale;
7678
unsigned int text[NK_GLFW_TEXT_MAX];
79+
nk_char key_events[NK_KEY_MAX];
7780
int text_len;
7881
struct nk_vec2 scroll;
7982
double last_button_click;
@@ -209,6 +212,56 @@ nk_glfw3_char_callback(GLFWwindow *win, unsigned int codepoint)
209212
glfw.text[glfw.text_len++] = codepoint;
210213
}
211214

215+
NK_API void
216+
nk_glfw3_key_callback(GLFWwindow *win, int key, int scancode, int action, int mods)
217+
{
218+
/*
219+
* convert GLFW_REPEAT to down (technically GLFW_RELEASE, GLFW_PRESS, GLFW_REPEAT are
220+
* already 0, 1, 2 but just to be clearer)
221+
*/
222+
nk_char a = (action == GLFW_RELEASE) ? nk_false : nk_true;
223+
224+
NK_UNUSED(win);
225+
NK_UNUSED(scancode);
226+
NK_UNUSED(mods);
227+
228+
switch (key) {
229+
case GLFW_KEY_DELETE: glfw.key_events[NK_KEY_DEL] = a; break;
230+
case GLFW_KEY_TAB: glfw.key_events[NK_KEY_TAB] = a; break;
231+
case GLFW_KEY_BACKSPACE: glfw.key_events[NK_KEY_BACKSPACE] = a; break;
232+
case GLFW_KEY_UP: glfw.key_events[NK_KEY_UP] = a; break;
233+
case GLFW_KEY_DOWN: glfw.key_events[NK_KEY_DOWN] = a; break;
234+
case GLFW_KEY_LEFT: glfw.key_events[NK_KEY_LEFT] = a; break;
235+
case GLFW_KEY_RIGHT: glfw.key_events[NK_KEY_RIGHT] = a; break;
236+
237+
case GLFW_KEY_PAGE_UP: glfw.key_events[NK_KEY_SCROLL_UP] = a; break;
238+
case GLFW_KEY_PAGE_DOWN: glfw.key_events[NK_KEY_SCROLL_DOWN] = a; break;
239+
240+
/* have to add all keys used for nuklear to get correct repeat behavior
241+
* NOTE these are scancodes so your custom layout won't matter unfortunately
242+
* Also while including everything will prevent unnecessary input calls,
243+
* only the ones with visible effects really matter, ie paste, undo, redo
244+
* selecting all, copying or cutting 40 times before you release the keys
245+
* doesn't actually cause any visible problems */
246+
247+
case GLFW_KEY_C: glfw.key_events[NK_KEY_COPY] = a; break;
248+
case GLFW_KEY_V: glfw.key_events[NK_KEY_PASTE] = a; break;
249+
case GLFW_KEY_X: glfw.key_events[NK_KEY_CUT] = a; break;
250+
case GLFW_KEY_Z: glfw.key_events[NK_KEY_TEXT_UNDO] = a; break;
251+
case GLFW_KEY_R: glfw.key_events[NK_KEY_TEXT_REDO] = a; break;
252+
case GLFW_KEY_B: glfw.key_events[NK_KEY_TEXT_LINE_START] = a; break;
253+
case GLFW_KEY_E: glfw.key_events[NK_KEY_TEXT_LINE_END] = a; break;
254+
case GLFW_KEY_A: glfw.key_events[NK_KEY_TEXT_SELECT_ALL] = a; break;
255+
256+
case GLFW_KEY_ENTER:
257+
case GLFW_KEY_KP_ENTER:
258+
glfw.key_events[NK_KEY_ENTER] = a;
259+
break;
260+
default:
261+
;
262+
}
263+
}
264+
212265
NK_API void
213266
nk_gflw3_scroll_callback(GLFWwindow *win, double xoff, double yoff)
214267
{
@@ -263,6 +316,7 @@ nk_glfw3_init(GLFWwindow *win, enum nk_glfw_init_state init_state)
263316
if (init_state == NK_GLFW3_INSTALL_CALLBACKS) {
264317
glfwSetScrollCallback(win, nk_gflw3_scroll_callback);
265318
glfwSetCharCallback(win, nk_glfw3_char_callback);
319+
glfwSetKeyCallback(win, nk_glfw3_key_callback);
266320
glfwSetMouseButtonCallback(win, nk_glfw3_mouse_button_callback);
267321
}
268322
nk_init_default(&glfw.ctx, 0);
@@ -305,6 +359,7 @@ nk_glfw3_new_frame(void)
305359
double x, y;
306360
struct nk_context *ctx = &glfw.ctx;
307361
struct GLFWwindow *win = glfw.win;
362+
nk_char* k_state = glfw.key_events;
308363

309364
/* update the timer */
310365
float delta_time_now = (float)glfwGetTime();
@@ -326,38 +381,39 @@ nk_glfw3_new_frame(void)
326381
else if (ctx->input.mouse.ungrab)
327382
glfwSetInputMode(glfw.win, GLFW_CURSOR, GLFW_CURSOR_NORMAL);
328383

329-
nk_input_key(ctx, NK_KEY_DEL, glfwGetKey(win, GLFW_KEY_DELETE) == GLFW_PRESS);
330-
nk_input_key(ctx, NK_KEY_ENTER, glfwGetKey(win, GLFW_KEY_ENTER) == GLFW_PRESS ||
331-
glfwGetKey(win, GLFW_KEY_KP_ENTER) == GLFW_PRESS);
384+
if (k_state[NK_KEY_DEL] >= 0) nk_input_key(ctx, NK_KEY_DEL, k_state[NK_KEY_DEL]);
385+
if (k_state[NK_KEY_ENTER] >= 0) nk_input_key(ctx, NK_KEY_ENTER, k_state[NK_KEY_ENTER]);
386+
387+
if (k_state[NK_KEY_TAB] >= 0) nk_input_key(ctx, NK_KEY_TAB, k_state[NK_KEY_TAB]);
388+
if (k_state[NK_KEY_BACKSPACE] >= 0) nk_input_key(ctx, NK_KEY_BACKSPACE, k_state[NK_KEY_BACKSPACE]);
389+
if (k_state[NK_KEY_UP] >= 0) nk_input_key(ctx, NK_KEY_UP, k_state[NK_KEY_UP]);
390+
if (k_state[NK_KEY_DOWN] >= 0) nk_input_key(ctx, NK_KEY_DOWN, k_state[NK_KEY_DOWN]);
391+
if (k_state[NK_KEY_SCROLL_UP] >= 0) nk_input_key(ctx, NK_KEY_SCROLL_UP, k_state[NK_KEY_SCROLL_UP]);
392+
if (k_state[NK_KEY_SCROLL_DOWN] >= 0) nk_input_key(ctx, NK_KEY_SCROLL_DOWN, k_state[NK_KEY_SCROLL_DOWN]);
332393

333-
nk_input_key(ctx, NK_KEY_TAB, glfwGetKey(win, GLFW_KEY_TAB) == GLFW_PRESS);
334-
nk_input_key(ctx, NK_KEY_BACKSPACE, glfwGetKey(win, GLFW_KEY_BACKSPACE) == GLFW_PRESS);
335-
nk_input_key(ctx, NK_KEY_UP, glfwGetKey(win, GLFW_KEY_UP) == GLFW_PRESS);
336-
nk_input_key(ctx, NK_KEY_DOWN, glfwGetKey(win, GLFW_KEY_DOWN) == GLFW_PRESS);
337394
nk_input_key(ctx, NK_KEY_TEXT_START, glfwGetKey(win, GLFW_KEY_HOME) == GLFW_PRESS);
338395
nk_input_key(ctx, NK_KEY_TEXT_END, glfwGetKey(win, GLFW_KEY_END) == GLFW_PRESS);
339396
nk_input_key(ctx, NK_KEY_SCROLL_START, glfwGetKey(win, GLFW_KEY_HOME) == GLFW_PRESS);
340397
nk_input_key(ctx, NK_KEY_SCROLL_END, glfwGetKey(win, GLFW_KEY_END) == GLFW_PRESS);
341-
nk_input_key(ctx, NK_KEY_SCROLL_DOWN, glfwGetKey(win, GLFW_KEY_PAGE_DOWN) == GLFW_PRESS);
342-
nk_input_key(ctx, NK_KEY_SCROLL_UP, glfwGetKey(win, GLFW_KEY_PAGE_UP) == GLFW_PRESS);
343398
nk_input_key(ctx, NK_KEY_SHIFT, glfwGetKey(win, GLFW_KEY_LEFT_SHIFT) == GLFW_PRESS||
344399
glfwGetKey(win, GLFW_KEY_RIGHT_SHIFT) == GLFW_PRESS);
345400

346401
if (glfwGetKey(win, GLFW_KEY_LEFT_CONTROL) == GLFW_PRESS ||
347402
glfwGetKey(win, GLFW_KEY_RIGHT_CONTROL) == GLFW_PRESS) {
348-
nk_input_key(ctx, NK_KEY_COPY, glfwGetKey(win, GLFW_KEY_C) == GLFW_PRESS);
349-
nk_input_key(ctx, NK_KEY_PASTE, glfwGetKey(win, GLFW_KEY_V) == GLFW_PRESS);
350-
nk_input_key(ctx, NK_KEY_CUT, glfwGetKey(win, GLFW_KEY_X) == GLFW_PRESS);
351-
nk_input_key(ctx, NK_KEY_TEXT_UNDO, glfwGetKey(win, GLFW_KEY_Z) == GLFW_PRESS);
352-
nk_input_key(ctx, NK_KEY_TEXT_REDO, glfwGetKey(win, GLFW_KEY_R) == GLFW_PRESS);
353-
nk_input_key(ctx, NK_KEY_TEXT_WORD_LEFT, glfwGetKey(win, GLFW_KEY_LEFT) == GLFW_PRESS);
354-
nk_input_key(ctx, NK_KEY_TEXT_WORD_RIGHT, glfwGetKey(win, GLFW_KEY_RIGHT) == GLFW_PRESS);
355-
nk_input_key(ctx, NK_KEY_TEXT_LINE_START, glfwGetKey(win, GLFW_KEY_B) == GLFW_PRESS);
356-
nk_input_key(ctx, NK_KEY_TEXT_LINE_END, glfwGetKey(win, GLFW_KEY_E) == GLFW_PRESS);
357-
nk_input_key(ctx, NK_KEY_TEXT_SELECT_ALL, glfwGetKey(win, GLFW_KEY_A) == GLFW_PRESS);
403+
/* Note these are physical keys and won't respect any layouts/key mapping */
404+
if (k_state[NK_KEY_COPY] >= 0) nk_input_key(ctx, NK_KEY_COPY, k_state[NK_KEY_COPY]);
405+
if (k_state[NK_KEY_PASTE] >= 0) nk_input_key(ctx, NK_KEY_PASTE, k_state[NK_KEY_PASTE]);
406+
if (k_state[NK_KEY_CUT] >= 0) nk_input_key(ctx, NK_KEY_CUT, k_state[NK_KEY_CUT]);
407+
if (k_state[NK_KEY_TEXT_UNDO] >= 0) nk_input_key(ctx, NK_KEY_TEXT_UNDO, k_state[NK_KEY_TEXT_UNDO]);
408+
if (k_state[NK_KEY_TEXT_REDO] >= 0) nk_input_key(ctx, NK_KEY_TEXT_REDO, k_state[NK_KEY_TEXT_REDO]);
409+
if (k_state[NK_KEY_TEXT_LINE_START] >= 0) nk_input_key(ctx, NK_KEY_TEXT_LINE_START, k_state[NK_KEY_TEXT_LINE_START]);
410+
if (k_state[NK_KEY_TEXT_LINE_END] >= 0) nk_input_key(ctx, NK_KEY_TEXT_LINE_END, k_state[NK_KEY_TEXT_LINE_END]);
411+
if (k_state[NK_KEY_TEXT_SELECT_ALL] >= 0) nk_input_key(ctx, NK_KEY_TEXT_SELECT_ALL, k_state[NK_KEY_TEXT_SELECT_ALL]);
412+
if (k_state[NK_KEY_LEFT] >= 0) nk_input_key(ctx, NK_KEY_TEXT_WORD_LEFT, k_state[NK_KEY_LEFT]);
413+
if (k_state[NK_KEY_RIGHT] >= 0) nk_input_key(ctx, NK_KEY_TEXT_WORD_RIGHT, k_state[NK_KEY_RIGHT]);
358414
} else {
359-
nk_input_key(ctx, NK_KEY_LEFT, glfwGetKey(win, GLFW_KEY_LEFT) == GLFW_PRESS);
360-
nk_input_key(ctx, NK_KEY_RIGHT, glfwGetKey(win, GLFW_KEY_RIGHT) == GLFW_PRESS);
415+
if (k_state[NK_KEY_LEFT] >= 0) nk_input_key(ctx, NK_KEY_LEFT, k_state[NK_KEY_LEFT]);
416+
if (k_state[NK_KEY_RIGHT] >= 0) nk_input_key(ctx, NK_KEY_RIGHT, k_state[NK_KEY_RIGHT]);
361417
nk_input_key(ctx, NK_KEY_COPY, 0);
362418
nk_input_key(ctx, NK_KEY_PASTE, 0);
363419
nk_input_key(ctx, NK_KEY_CUT, 0);
@@ -377,6 +433,10 @@ nk_glfw3_new_frame(void)
377433
nk_input_button(ctx, NK_BUTTON_DOUBLE, (int)glfw.double_click_pos.x, (int)glfw.double_click_pos.y, glfw.is_double_click_down);
378434
nk_input_scroll(ctx, glfw.scroll);
379435
nk_input_end(&glfw.ctx);
436+
437+
/* clear after nk_input_end (-1 since we're doing up/down boolean) */
438+
memset(glfw.key_events, -1, sizeof(glfw.key_events));
439+
380440
glfw.text_len = 0;
381441
glfw.scroll = nk_vec2(0,0);
382442
}

demo/glfw_opengl3/main.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
#define NK_INCLUDE_DEFAULT_FONT
2222
#define NK_IMPLEMENTATION
2323
#define NK_GLFW_GL3_IMPLEMENTATION
24-
#define NK_KEYSTATE_BASED_INPUT
2524
#include "../../nuklear.h"
2625
#include "nuklear_glfw_gl3.h"
2726

demo/glfw_opengl3/nuklear_glfw_gl3.h

Lines changed: 73 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ struct nk_glfw {
4848
struct nk_font_atlas atlas;
4949
struct nk_vec2 fb_scale;
5050
unsigned int text[NK_GLFW_TEXT_MAX];
51+
nk_char key_events[NK_KEY_MAX];
5152
int text_len;
5253
struct nk_vec2 scroll;
5354
double last_button_click;
@@ -67,6 +68,7 @@ NK_API void nk_glfw3_device_destroy(struct nk_glfw* glfw);
6768
NK_API void nk_glfw3_device_create(struct nk_glfw* glfw);
6869

6970
NK_API void nk_glfw3_char_callback(GLFWwindow *win, unsigned int codepoint);
71+
NK_API void nk_glfw3_key_callback(GLFWwindow *win, int key, int scancode, int action, int mods);
7072
NK_API void nk_gflw3_scroll_callback(GLFWwindow *win, double xoff, double yoff);
7173
NK_API void nk_glfw3_mouse_button_callback(GLFWwindow *win, int button, int action, int mods);
7274

@@ -320,6 +322,49 @@ nk_glfw3_char_callback(GLFWwindow *win, unsigned int codepoint)
320322
glfw->text[glfw->text_len++] = codepoint;
321323
}
322324

325+
NK_API void
326+
nk_glfw3_key_callback(GLFWwindow *win, int key, int scancode, int action, int mods)
327+
{
328+
struct nk_glfw* glfw = (struct nk_glfw *)glfwGetWindowUserPointer(win);
329+
/*
330+
* convert GLFW_REPEAT to down (technically GLFW_RELEASE, GLFW_PRESS, GLFW_REPEAT are
331+
* already 0, 1, 2 but just to be clearer)
332+
*/
333+
nk_char a = (action == GLFW_RELEASE) ? nk_false : nk_true;
334+
335+
NK_UNUSED(scancode);
336+
NK_UNUSED(mods);
337+
338+
switch (key) {
339+
case GLFW_KEY_DELETE: glfw->key_events[NK_KEY_DEL] = a; break;
340+
case GLFW_KEY_TAB: glfw->key_events[NK_KEY_TAB] = a; break;
341+
case GLFW_KEY_BACKSPACE: glfw->key_events[NK_KEY_BACKSPACE] = a; break;
342+
case GLFW_KEY_UP: glfw->key_events[NK_KEY_UP] = a; break;
343+
case GLFW_KEY_DOWN: glfw->key_events[NK_KEY_DOWN] = a; break;
344+
case GLFW_KEY_LEFT: glfw->key_events[NK_KEY_LEFT] = a; break;
345+
case GLFW_KEY_RIGHT: glfw->key_events[NK_KEY_RIGHT] = a; break;
346+
347+
case GLFW_KEY_PAGE_UP: glfw->key_events[NK_KEY_SCROLL_UP] = a; break;
348+
case GLFW_KEY_PAGE_DOWN: glfw->key_events[NK_KEY_SCROLL_DOWN] = a; break;
349+
350+
case GLFW_KEY_C: glfw->key_events[NK_KEY_COPY] = a; break;
351+
case GLFW_KEY_V: glfw->key_events[NK_KEY_PASTE] = a; break;
352+
case GLFW_KEY_X: glfw->key_events[NK_KEY_CUT] = a; break;
353+
case GLFW_KEY_Z: glfw->key_events[NK_KEY_TEXT_UNDO] = a; break;
354+
case GLFW_KEY_R: glfw->key_events[NK_KEY_TEXT_REDO] = a; break;
355+
case GLFW_KEY_B: glfw->key_events[NK_KEY_TEXT_LINE_START] = a; break;
356+
case GLFW_KEY_E: glfw->key_events[NK_KEY_TEXT_LINE_END] = a; break;
357+
case GLFW_KEY_A: glfw->key_events[NK_KEY_TEXT_SELECT_ALL] = a; break;
358+
359+
case GLFW_KEY_ENTER:
360+
case GLFW_KEY_KP_ENTER:
361+
glfw->key_events[NK_KEY_ENTER] = a;
362+
break;
363+
default:
364+
;
365+
}
366+
}
367+
323368
NK_API void
324369
nk_gflw3_scroll_callback(GLFWwindow *win, double xoff, double yoff)
325370
{
@@ -378,6 +423,7 @@ nk_glfw3_init(struct nk_glfw* glfw, GLFWwindow *win, enum nk_glfw_init_state ini
378423
if (init_state == NK_GLFW3_INSTALL_CALLBACKS) {
379424
glfwSetScrollCallback(win, nk_gflw3_scroll_callback);
380425
glfwSetCharCallback(win, nk_glfw3_char_callback);
426+
glfwSetKeyCallback(win, nk_glfw3_key_callback);
381427
glfwSetMouseButtonCallback(win, nk_glfw3_mouse_button_callback);
382428
}
383429
nk_init_default(&glfw->ctx, 0);
@@ -421,6 +467,7 @@ nk_glfw3_new_frame(struct nk_glfw* glfw)
421467
double x, y;
422468
struct nk_context *ctx = &glfw->ctx;
423469
struct GLFWwindow *win = glfw->win;
470+
nk_char* k_state = glfw->key_events;
424471

425472
/* update the timer */
426473
float delta_time_now = (float)glfwGetTime();
@@ -444,38 +491,39 @@ nk_glfw3_new_frame(struct nk_glfw* glfw)
444491
glfwSetInputMode(glfw->win, GLFW_CURSOR, GLFW_CURSOR_NORMAL);
445492
#endif
446493

447-
nk_input_key(ctx, NK_KEY_DEL, glfwGetKey(win, GLFW_KEY_DELETE) == GLFW_PRESS);
448-
nk_input_key(ctx, NK_KEY_ENTER, glfwGetKey(win, GLFW_KEY_ENTER) == GLFW_PRESS ||
449-
glfwGetKey(win, GLFW_KEY_KP_ENTER) == GLFW_PRESS);
494+
if (k_state[NK_KEY_DEL] >= 0) nk_input_key(ctx, NK_KEY_DEL, k_state[NK_KEY_DEL]);
495+
if (k_state[NK_KEY_ENTER] >= 0) nk_input_key(ctx, NK_KEY_ENTER, k_state[NK_KEY_ENTER]);
496+
497+
if (k_state[NK_KEY_TAB] >= 0) nk_input_key(ctx, NK_KEY_TAB, k_state[NK_KEY_TAB]);
498+
if (k_state[NK_KEY_BACKSPACE] >= 0) nk_input_key(ctx, NK_KEY_BACKSPACE, k_state[NK_KEY_BACKSPACE]);
499+
if (k_state[NK_KEY_UP] >= 0) nk_input_key(ctx, NK_KEY_UP, k_state[NK_KEY_UP]);
500+
if (k_state[NK_KEY_DOWN] >= 0) nk_input_key(ctx, NK_KEY_DOWN, k_state[NK_KEY_DOWN]);
501+
if (k_state[NK_KEY_SCROLL_UP] >= 0) nk_input_key(ctx, NK_KEY_SCROLL_UP, k_state[NK_KEY_SCROLL_UP]);
502+
if (k_state[NK_KEY_SCROLL_DOWN] >= 0) nk_input_key(ctx, NK_KEY_SCROLL_DOWN, k_state[NK_KEY_SCROLL_DOWN]);
450503

451-
nk_input_key(ctx, NK_KEY_TAB, glfwGetKey(win, GLFW_KEY_TAB) == GLFW_PRESS);
452-
nk_input_key(ctx, NK_KEY_BACKSPACE, glfwGetKey(win, GLFW_KEY_BACKSPACE) == GLFW_PRESS);
453-
nk_input_key(ctx, NK_KEY_UP, glfwGetKey(win, GLFW_KEY_UP) == GLFW_PRESS);
454-
nk_input_key(ctx, NK_KEY_DOWN, glfwGetKey(win, GLFW_KEY_DOWN) == GLFW_PRESS);
455504
nk_input_key(ctx, NK_KEY_TEXT_START, glfwGetKey(win, GLFW_KEY_HOME) == GLFW_PRESS);
456505
nk_input_key(ctx, NK_KEY_TEXT_END, glfwGetKey(win, GLFW_KEY_END) == GLFW_PRESS);
457506
nk_input_key(ctx, NK_KEY_SCROLL_START, glfwGetKey(win, GLFW_KEY_HOME) == GLFW_PRESS);
458507
nk_input_key(ctx, NK_KEY_SCROLL_END, glfwGetKey(win, GLFW_KEY_END) == GLFW_PRESS);
459-
nk_input_key(ctx, NK_KEY_SCROLL_DOWN, glfwGetKey(win, GLFW_KEY_PAGE_DOWN) == GLFW_PRESS);
460-
nk_input_key(ctx, NK_KEY_SCROLL_UP, glfwGetKey(win, GLFW_KEY_PAGE_UP) == GLFW_PRESS);
461508
nk_input_key(ctx, NK_KEY_SHIFT, glfwGetKey(win, GLFW_KEY_LEFT_SHIFT) == GLFW_PRESS||
462509
glfwGetKey(win, GLFW_KEY_RIGHT_SHIFT) == GLFW_PRESS);
463510

464511
if (glfwGetKey(win, GLFW_KEY_LEFT_CONTROL) == GLFW_PRESS ||
465512
glfwGetKey(win, GLFW_KEY_RIGHT_CONTROL) == GLFW_PRESS) {
466-
nk_input_key(ctx, NK_KEY_COPY, glfwGetKey(win, GLFW_KEY_C) == GLFW_PRESS);
467-
nk_input_key(ctx, NK_KEY_PASTE, glfwGetKey(win, GLFW_KEY_V) == GLFW_PRESS);
468-
nk_input_key(ctx, NK_KEY_CUT, glfwGetKey(win, GLFW_KEY_X) == GLFW_PRESS);
469-
nk_input_key(ctx, NK_KEY_TEXT_UNDO, glfwGetKey(win, GLFW_KEY_Z) == GLFW_PRESS);
470-
nk_input_key(ctx, NK_KEY_TEXT_REDO, glfwGetKey(win, GLFW_KEY_R) == GLFW_PRESS);
471-
nk_input_key(ctx, NK_KEY_TEXT_WORD_LEFT, glfwGetKey(win, GLFW_KEY_LEFT) == GLFW_PRESS);
472-
nk_input_key(ctx, NK_KEY_TEXT_WORD_RIGHT, glfwGetKey(win, GLFW_KEY_RIGHT) == GLFW_PRESS);
473-
nk_input_key(ctx, NK_KEY_TEXT_LINE_START, glfwGetKey(win, GLFW_KEY_B) == GLFW_PRESS);
474-
nk_input_key(ctx, NK_KEY_TEXT_LINE_END, glfwGetKey(win, GLFW_KEY_E) == GLFW_PRESS);
475-
nk_input_key(ctx, NK_KEY_TEXT_SELECT_ALL, glfwGetKey(win, GLFW_KEY_A) == GLFW_PRESS);
513+
/* Note these are physical keys and won't respect any layouts/key mapping */
514+
if (k_state[NK_KEY_COPY] >= 0) nk_input_key(ctx, NK_KEY_COPY, k_state[NK_KEY_COPY]);
515+
if (k_state[NK_KEY_PASTE] >= 0) nk_input_key(ctx, NK_KEY_PASTE, k_state[NK_KEY_PASTE]);
516+
if (k_state[NK_KEY_CUT] >= 0) nk_input_key(ctx, NK_KEY_CUT, k_state[NK_KEY_CUT]);
517+
if (k_state[NK_KEY_TEXT_UNDO] >= 0) nk_input_key(ctx, NK_KEY_TEXT_UNDO, k_state[NK_KEY_TEXT_UNDO]);
518+
if (k_state[NK_KEY_TEXT_REDO] >= 0) nk_input_key(ctx, NK_KEY_TEXT_REDO, k_state[NK_KEY_TEXT_REDO]);
519+
if (k_state[NK_KEY_TEXT_LINE_START] >= 0) nk_input_key(ctx, NK_KEY_TEXT_LINE_START, k_state[NK_KEY_TEXT_LINE_START]);
520+
if (k_state[NK_KEY_TEXT_LINE_END] >= 0) nk_input_key(ctx, NK_KEY_TEXT_LINE_END, k_state[NK_KEY_TEXT_LINE_END]);
521+
if (k_state[NK_KEY_TEXT_SELECT_ALL] >= 0) nk_input_key(ctx, NK_KEY_TEXT_SELECT_ALL, k_state[NK_KEY_TEXT_SELECT_ALL]);
522+
if (k_state[NK_KEY_LEFT] >= 0) nk_input_key(ctx, NK_KEY_TEXT_WORD_LEFT, k_state[NK_KEY_LEFT]);
523+
if (k_state[NK_KEY_RIGHT] >= 0) nk_input_key(ctx, NK_KEY_TEXT_WORD_RIGHT, k_state[NK_KEY_RIGHT]);
476524
} else {
477-
nk_input_key(ctx, NK_KEY_LEFT, glfwGetKey(win, GLFW_KEY_LEFT) == GLFW_PRESS);
478-
nk_input_key(ctx, NK_KEY_RIGHT, glfwGetKey(win, GLFW_KEY_RIGHT) == GLFW_PRESS);
525+
if (k_state[NK_KEY_LEFT] >= 0) nk_input_key(ctx, NK_KEY_LEFT, k_state[NK_KEY_LEFT]);
526+
if (k_state[NK_KEY_RIGHT] >= 0) nk_input_key(ctx, NK_KEY_RIGHT, k_state[NK_KEY_RIGHT]);
479527
nk_input_key(ctx, NK_KEY_COPY, 0);
480528
nk_input_key(ctx, NK_KEY_PASTE, 0);
481529
nk_input_key(ctx, NK_KEY_CUT, 0);
@@ -496,6 +544,10 @@ nk_glfw3_new_frame(struct nk_glfw* glfw)
496544
nk_input_button(ctx, NK_BUTTON_DOUBLE, (int)glfw->double_click_pos.x, (int)glfw->double_click_pos.y, glfw->is_double_click_down);
497545
nk_input_scroll(ctx, glfw->scroll);
498546
nk_input_end(&glfw->ctx);
547+
548+
/* clear after nk_input_end (-1 since we're doing up/down boolean) */
549+
memset(glfw->key_events, -1, sizeof(glfw->key_events));
550+
499551
glfw->text_len = 0;
500552
glfw->scroll = nk_vec2(0,0);
501553
}

demo/glfw_opengl4/main.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
#define NK_INCLUDE_DEFAULT_FONT
2222
#define NK_IMPLEMENTATION
2323
#define NK_GLFW_GL4_IMPLEMENTATION
24-
#define NK_KEYSTATE_BASED_INPUT
2524
#include "../../nuklear.h"
2625
#include "nuklear_glfw_gl4.h"
2726

0 commit comments

Comments
 (0)