Skip to content

Commit 86178a8

Browse files
authored
Merge pull request #844 from Immediate-Mode-UI/fix_insert_replace_reset
Fix Insert Replace Reset
2 parents 831f8d7 + dfe2ab7 commit 86178a8

File tree

26 files changed

+470
-53
lines changed

26 files changed

+470
-53
lines changed

demo/allegro5/nuklear_allegro5.h

Lines changed: 41 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -347,6 +347,7 @@ NK_API int
347347
nk_allegro5_handle_event(ALLEGRO_EVENT *ev)
348348
{
349349
struct nk_context *ctx = &allegro5.ctx;
350+
static int insert_toggle = 0;
350351
switch (ev->type) {
351352
case ALLEGRO_EVENT_DISPLAY_RESIZE: {
352353
allegro5.width = (unsigned int)ev->display.width;
@@ -415,19 +416,21 @@ nk_allegro5_handle_event(ALLEGRO_EVENT *ev)
415416
int kc = ev->keyboard.keycode;
416417
int down = ev->type == ALLEGRO_EVENT_KEY_DOWN;
417418

419+
/* do we need this? */
418420
if (kc == ALLEGRO_KEY_LSHIFT || kc == ALLEGRO_KEY_RSHIFT) nk_input_key(ctx, NK_KEY_SHIFT, down);
419-
else if (kc == ALLEGRO_KEY_DELETE) nk_input_key(ctx, NK_KEY_DEL, down);
420-
else if (kc == ALLEGRO_KEY_ENTER || kc == ALLEGRO_KEY_PAD_ENTER) nk_input_key(ctx, NK_KEY_ENTER, down);
421-
else if (kc == ALLEGRO_KEY_TAB) nk_input_key(ctx, NK_KEY_TAB, down);
422-
else if (kc == ALLEGRO_KEY_LEFT) nk_input_key(ctx, NK_KEY_LEFT, down);
423-
else if (kc == ALLEGRO_KEY_RIGHT) nk_input_key(ctx, NK_KEY_RIGHT, down);
424-
else if (kc == ALLEGRO_KEY_UP) nk_input_key(ctx, NK_KEY_UP, down);
425-
else if (kc == ALLEGRO_KEY_DOWN) nk_input_key(ctx, NK_KEY_DOWN, down);
426-
else if (kc == ALLEGRO_KEY_BACKSPACE) nk_input_key(ctx, NK_KEY_BACKSPACE, down);
427421
else if (kc == ALLEGRO_KEY_ESCAPE) nk_input_key(ctx, NK_KEY_TEXT_RESET_MODE, down);
428422
else if (kc == ALLEGRO_KEY_PGUP) nk_input_key(ctx, NK_KEY_SCROLL_UP, down);
429423
else if (kc == ALLEGRO_KEY_PGDN) nk_input_key(ctx, NK_KEY_SCROLL_DOWN, down);
430-
else if (kc == ALLEGRO_KEY_HOME) {
424+
else if (kc == ALLEGRO_KEY_INSERT) {
425+
if (down) insert_toggle = !insert_toggle;
426+
if (insert_toggle) {
427+
nk_input_key(ctx, NK_KEY_TEXT_INSERT_MODE, down);
428+
/* nk_input_key(ctx, NK_KEY_TEXT_REPLACE_MODE, !down); */
429+
} else {
430+
nk_input_key(ctx, NK_KEY_TEXT_REPLACE_MODE, down);
431+
/* nk_input_key(ctx, NK_KEY_TEXT_INSERT_MODE, !down); */
432+
}
433+
} else if (kc == ALLEGRO_KEY_HOME) {
431434
nk_input_key(ctx, NK_KEY_TEXT_START, down);
432435
nk_input_key(ctx, NK_KEY_SCROLL_START, down);
433436
} else if (kc == ALLEGRO_KEY_END) {
@@ -438,32 +441,52 @@ nk_allegro5_handle_event(ALLEGRO_EVENT *ev)
438441
} break;
439442
case ALLEGRO_EVENT_KEY_CHAR: {
440443
int kc = ev->keyboard.keycode;
444+
int repeat = ev->keyboard.repeat;
441445
int control_mask = (ev->keyboard.modifiers & ALLEGRO_KEYMOD_CTRL) ||
442446
(ev->keyboard.modifiers & ALLEGRO_KEYMOD_COMMAND);
443447

444-
if (kc == ALLEGRO_KEY_C && control_mask) {
448+
if (kc == ALLEGRO_KEY_C && control_mask && !repeat) {
445449
nk_input_key(ctx, NK_KEY_COPY, 1);
446450
} else if (kc == ALLEGRO_KEY_V && control_mask) {
447451
nk_input_key(ctx, NK_KEY_PASTE, 1);
448-
} else if (kc == ALLEGRO_KEY_X && control_mask) {
452+
} else if (kc == ALLEGRO_KEY_X && control_mask && !repeat) {
449453
nk_input_key(ctx, NK_KEY_CUT, 1);
450454
} else if (kc == ALLEGRO_KEY_Z && control_mask) {
451455
nk_input_key(ctx, NK_KEY_TEXT_UNDO, 1);
452456
} else if (kc == ALLEGRO_KEY_R && control_mask) {
453457
nk_input_key(ctx, NK_KEY_TEXT_REDO, 1);
454-
} else if (kc == ALLEGRO_KEY_A && control_mask) {
458+
} else if (kc == ALLEGRO_KEY_A && control_mask && !repeat) {
455459
nk_input_key(ctx, NK_KEY_TEXT_SELECT_ALL, 1);
460+
} else if (kc == ALLEGRO_KEY_BACKSPACE) {
461+
nk_input_key(ctx, NK_KEY_BACKSPACE, 1);
462+
} else if (kc == ALLEGRO_KEY_LEFT) {
463+
if (control_mask) {
464+
nk_input_key(ctx, NK_KEY_TEXT_WORD_LEFT, 1);
465+
} else {
466+
nk_input_key(ctx, NK_KEY_LEFT, 1);
467+
}
468+
} else if (kc == ALLEGRO_KEY_RIGHT) {
469+
if (control_mask) {
470+
nk_input_key(ctx, NK_KEY_TEXT_WORD_RIGHT, 1);
471+
} else {
472+
nk_input_key(ctx, NK_KEY_RIGHT, 1);
473+
}
474+
} else if (kc == ALLEGRO_KEY_UP) {
475+
nk_input_key(ctx, NK_KEY_UP, 1);
476+
} else if (kc == ALLEGRO_KEY_DOWN) {
477+
nk_input_key(ctx, NK_KEY_DOWN, 1);
478+
} else if (kc == ALLEGRO_KEY_DELETE) {
479+
nk_input_key(ctx, NK_KEY_DEL, 1);
480+
} else if (kc == ALLEGRO_KEY_ENTER || kc == ALLEGRO_KEY_PAD_ENTER) {
481+
nk_input_key(ctx, NK_KEY_ENTER, 1);
482+
} else if (kc == ALLEGRO_KEY_TAB) {
483+
nk_input_key(ctx, NK_KEY_TAB, 1);
456484
} else {
457485
if (kc != ALLEGRO_KEY_BACKSPACE &&
458-
kc != ALLEGRO_KEY_LEFT &&
459-
kc != ALLEGRO_KEY_RIGHT &&
460-
kc != ALLEGRO_KEY_UP &&
461-
kc != ALLEGRO_KEY_DOWN &&
462486
kc != ALLEGRO_KEY_HOME &&
463-
kc != ALLEGRO_KEY_DELETE &&
464-
kc != ALLEGRO_KEY_ENTER &&
465487
kc != ALLEGRO_KEY_END &&
466488
kc != ALLEGRO_KEY_ESCAPE &&
489+
kc != ALLEGRO_KEY_INSERT &&
467490
kc != ALLEGRO_KEY_PGDN &&
468491
kc != ALLEGRO_KEY_PGUP) {
469492
nk_input_unicode(ctx, ev->keyboard.unichar);

demo/common/overview.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ overview(struct nk_context *ctx)
1818

1919
#ifdef INCLUDE_STYLE
2020
/* styles */
21-
static const char* themes[] = {"Black", "White", "Red", "Blue", "Dark", "Dracula",
21+
static const char* themes[] = {"Black", "White", "Red", "Blue", "Dark", "Dracula",
2222
"Catppucin Latte", "Catppucin Frappe", "Catppucin Macchiato", "Catppucin Mocha"};
2323
static int current_theme = 0;
2424
#endif
@@ -592,10 +592,12 @@ overview(struct nk_context *ctx)
592592
{
593593
static const float ratio[] = {120, 150};
594594
static char field_buffer[64];
595+
static char field_w_overwrite_buf[64];
595596
static char text[9][64];
596597
static int text_len[9];
597598
static char box_buffer[512];
598599
static int field_len;
600+
static int field_ow_len;
599601
static int box_len;
600602
nk_flags active;
601603

@@ -628,6 +630,9 @@ overview(struct nk_context *ctx)
628630
nk_label(ctx, "Field:", NK_TEXT_LEFT);
629631
nk_edit_string(ctx, NK_EDIT_FIELD, field_buffer, &field_len, 64, nk_filter_default);
630632

633+
nk_label(ctx, "Field 2:", NK_TEXT_LEFT);
634+
nk_edit_string(ctx, NK_EDIT_SELECTABLE|NK_EDIT_CLIPBOARD, field_w_overwrite_buf, &field_ow_len, 64, nk_filter_default);
635+
631636
nk_label(ctx, "Box:", NK_TEXT_LEFT);
632637
nk_layout_row_static(ctx, 180, 278, 1);
633638
nk_edit_string(ctx, NK_EDIT_BOX, box_buffer, &box_len, 512, nk_filter_default);

demo/d3d11/nuklear_d3d11.h

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,7 @@ nk_d3d11_resize(ID3D11DeviceContext *context, int width, int height)
209209
NK_API int
210210
nk_d3d11_handle_event(HWND wnd, UINT msg, WPARAM wparam, LPARAM lparam)
211211
{
212+
static int insert_toggle = 0;
212213
switch (msg)
213214
{
214215
case WM_KEYDOWN:
@@ -284,6 +285,34 @@ nk_d3d11_handle_event(HWND wnd, UINT msg, WPARAM wparam, LPARAM lparam)
284285
nk_input_key(&d3d11.ctx, NK_KEY_SCROLL_UP, down);
285286
return 1;
286287

288+
case VK_ESCAPE:
289+
nk_input_key(&d3d11.ctx, NK_KEY_TEXT_RESET_MODE, down);
290+
return 1;
291+
292+
case VK_INSERT:
293+
/* Only switch on release to avoid repeat issues
294+
* kind of confusing since we have to negate it but we're already
295+
* hacking it since Nuklear treats them as two separate keys rather
296+
* than a single toggle state */
297+
if (!down) {
298+
insert_toggle = !insert_toggle;
299+
if (insert_toggle) {
300+
nk_input_key(&d3d11.ctx, NK_KEY_TEXT_INSERT_MODE, !down);
301+
/* nk_input_key(&d3d11.ctx, NK_KEY_TEXT_REPLACE_MODE, down); */
302+
} else {
303+
nk_input_key(&d3d11.ctx, NK_KEY_TEXT_REPLACE_MODE, !down);
304+
/* nk_input_key(&d3d11.ctx, NK_KEY_TEXT_INSERT_MODE, down); */
305+
}
306+
}
307+
return 1;
308+
309+
case 'A':
310+
if (ctrl) {
311+
nk_input_key(&d3d11.ctx, NK_KEY_TEXT_SELECT_ALL, down);
312+
return 1;
313+
}
314+
break;
315+
287316
case 'B':
288317
if (ctrl) {
289318
nk_input_key(&d3d11.ctx, NK_KEY_TEXT_LINE_START, down);

demo/d3d12/nuklear_d3d12.h

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -341,6 +341,7 @@ nk_d3d12_resize(int width, int height)
341341
NK_API int
342342
nk_d3d12_handle_event(HWND wnd, UINT msg, WPARAM wparam, LPARAM lparam)
343343
{
344+
static int insert_toggle = 0;
344345
switch (msg)
345346
{
346347
case WM_KEYDOWN:
@@ -408,6 +409,48 @@ nk_d3d12_handle_event(HWND wnd, UINT msg, WPARAM wparam, LPARAM lparam)
408409
nk_input_key(&d3d12.ctx, NK_KEY_SCROLL_UP, down);
409410
return 1;
410411

412+
case VK_ESCAPE:
413+
nk_input_key(&d3d12.ctx, NK_KEY_TEXT_RESET_MODE, down);
414+
return 1;
415+
416+
case VK_INSERT:
417+
/* Only switch on release to avoid repeat issues
418+
* kind of confusing since we have to negate it but we're already
419+
* hacking it since Nuklear treats them as two separate keys rather
420+
* than a single toggle state */
421+
if (!down) {
422+
insert_toggle = !insert_toggle;
423+
if (insert_toggle) {
424+
nk_input_key(&d3d12.ctx, NK_KEY_TEXT_INSERT_MODE, !down);
425+
/* nk_input_key(&d3d12.ctx, NK_KEY_TEXT_REPLACE_MODE, down); */
426+
} else {
427+
nk_input_key(&d3d12.ctx, NK_KEY_TEXT_REPLACE_MODE, !down);
428+
/* nk_input_key(&d3d12.ctx, NK_KEY_TEXT_INSERT_MODE, down); */
429+
}
430+
}
431+
return 1;
432+
433+
case 'A':
434+
if (ctrl) {
435+
nk_input_key(&d3d12.ctx, NK_KEY_TEXT_SELECT_ALL, down);
436+
return 1;
437+
}
438+
break;
439+
440+
case 'B':
441+
if (ctrl) {
442+
nk_input_key(&d3d12.ctx, NK_KEY_TEXT_LINE_START, down);
443+
return 1;
444+
}
445+
break;
446+
447+
case 'E':
448+
if (ctrl) {
449+
nk_input_key(&d3d12.ctx, NK_KEY_TEXT_LINE_END, down);
450+
return 1;
451+
}
452+
break;
453+
411454
case 'C':
412455
if (ctrl) {
413456
nk_input_key(&d3d12.ctx, NK_KEY_COPY, down);

demo/d3d9/nuklear_d3d9.h

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -269,6 +269,7 @@ nk_d3d9_resize(int width, int height)
269269
NK_API int
270270
nk_d3d9_handle_event(HWND wnd, UINT msg, WPARAM wparam, LPARAM lparam)
271271
{
272+
static int insert_toggle = 0;
272273
switch (msg)
273274
{
274275
case WM_KEYDOWN:
@@ -336,6 +337,48 @@ nk_d3d9_handle_event(HWND wnd, UINT msg, WPARAM wparam, LPARAM lparam)
336337
nk_input_key(&d3d9.ctx, NK_KEY_SCROLL_UP, down);
337338
return 1;
338339

340+
case VK_ESCAPE:
341+
nk_input_key(&d3d9.ctx, NK_KEY_TEXT_RESET_MODE, down);
342+
return 1;
343+
344+
case VK_INSERT:
345+
/* Only switch on release to avoid repeat issues
346+
* kind of confusing since we have to negate it but we're already
347+
* hacking it since Nuklear treats them as two separate keys rather
348+
* than a single toggle state */
349+
if (!down) {
350+
insert_toggle = !insert_toggle;
351+
if (insert_toggle) {
352+
nk_input_key(&d3d9.ctx, NK_KEY_TEXT_INSERT_MODE, !down);
353+
/* nk_input_key(&d3d9.ctx, NK_KEY_TEXT_REPLACE_MODE, down); */
354+
} else {
355+
nk_input_key(&d3d9.ctx, NK_KEY_TEXT_REPLACE_MODE, !down);
356+
/* nk_input_key(&d3d9.ctx, NK_KEY_TEXT_INSERT_MODE, down); */
357+
}
358+
}
359+
return 1;
360+
361+
case 'A':
362+
if (ctrl) {
363+
nk_input_key(&d3d9.ctx, NK_KEY_TEXT_SELECT_ALL, down);
364+
return 1;
365+
}
366+
break;
367+
368+
case 'B':
369+
if (ctrl) {
370+
nk_input_key(&d3d9.ctx, NK_KEY_TEXT_LINE_START, down);
371+
return 1;
372+
}
373+
break;
374+
375+
case 'E':
376+
if (ctrl) {
377+
nk_input_key(&d3d9.ctx, NK_KEY_TEXT_LINE_END, down);
378+
return 1;
379+
}
380+
break;
381+
339382
case 'C':
340383
if (ctrl) {
341384
nk_input_key(&d3d9.ctx, NK_KEY_COPY, down);

demo/gdi/nuklear_gdi.h

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -687,6 +687,7 @@ nk_gdi_set_font(GdiFont *gdifont)
687687
NK_API int
688688
nk_gdi_handle_event(HWND wnd, UINT msg, WPARAM wparam, LPARAM lparam)
689689
{
690+
static int insert_toggle = 0;
690691
switch (msg)
691692
{
692693
case WM_SIZE:
@@ -778,13 +779,48 @@ nk_gdi_handle_event(HWND wnd, UINT msg, WPARAM wparam, LPARAM lparam)
778779
nk_input_key(&gdi.ctx, NK_KEY_SCROLL_UP, down);
779780
return 1;
780781

782+
case VK_ESCAPE:
783+
nk_input_key(&gdi.ctx, NK_KEY_TEXT_RESET_MODE, down);
784+
return 1;
785+
786+
case VK_INSERT:
787+
/* Only switch on release to avoid repeat issues
788+
* kind of confusing since we have to negate it but we're already
789+
* hacking it since Nuklear treats them as two separate keys rather
790+
* than a single toggle state */
791+
if (!down) {
792+
insert_toggle = !insert_toggle;
793+
if (insert_toggle) {
794+
nk_input_key(&gdi.ctx, NK_KEY_TEXT_INSERT_MODE, !down);
795+
/* nk_input_key(&gdi.ctx, NK_KEY_TEXT_REPLACE_MODE, down); */
796+
} else {
797+
nk_input_key(&gdi.ctx, NK_KEY_TEXT_REPLACE_MODE, !down);
798+
/* nk_input_key(&gdi.ctx, NK_KEY_TEXT_INSERT_MODE, down); */
799+
}
800+
}
801+
return 1;
802+
781803
case 'A':
782804
if (ctrl) {
783805
nk_input_key(&gdi.ctx, NK_KEY_TEXT_SELECT_ALL, down);
784806
return 1;
785807
}
786808
break;
787809

810+
case 'B':
811+
if (ctrl) {
812+
nk_input_key(&gdi.ctx, NK_KEY_TEXT_LINE_START, down);
813+
return 1;
814+
}
815+
break;
816+
817+
case 'E':
818+
if (ctrl) {
819+
nk_input_key(&gdi.ctx, NK_KEY_TEXT_LINE_END, down);
820+
return 1;
821+
}
822+
break;
823+
788824
case 'C':
789825
if (ctrl) {
790826
nk_input_key(&gdi.ctx, NK_KEY_COPY, down);

0 commit comments

Comments
 (0)