C-Menu 0.2.9
A User Interface Toolkit
Loading...
Searching...
No Matches
curskeys.c File Reference

Test Curses Keys. More...

#include "common.h"
#include "ui_backend.h"
#include <unistd.h>
#include "ui_notcurses_internal.h"
Include dependency graph for curskeys.c:

Go to the source code of this file.

Macros

#define KSTRLEN   100
#define MAXLEN   256

Functions

int notcurses_input (UiSurface *s, uint w)
 Display Curses Keys Responds to curses keys and mouse events, displaying the key code and description.
int popup_ckeys ()

Detailed Description

Test Curses Keys.

Author
Bill Waller Copyright (c) 2025 MIT License billx.nosp@m.wall.nosp@m.er@gm.nosp@m.ail..nosp@m.com
Date
2026-02-09

Definition in file curskeys.c.

Macro Definition Documentation

◆ KSTRLEN

#define KSTRLEN   100

Definition at line 14 of file curskeys.c.

◆ MAXLEN

#define MAXLEN   256

Definition at line 15 of file curskeys.c.

Function Documentation

◆ notcurses_input()

int notcurses_input ( UiSurface * s,
uint w )

Display Curses Keys Responds to curses keys and mouse events, displaying the key code and description.

Returns
0 on success, non-zero on failure

Definition at line 584 of file curskeys.c.

584 {
585 char kstr[KSTRLEN];
586 int c = -1;
587 char action[MAXLEN];
588 uint key_id = 0;
589 UiEvent ev;
590 while (!c) {
591 kstr[0] = '\0';
592 ui_cursor_move(sfc, WIN, 1, 39);
593 do {
594 ui_render();
595 c = ui_get_event(sfc, WIN, &ev, -1);
596 if (sig_received != 0) {
598 c = display_error(em0, em1, em2, NULL);
599 if (c == 'q' || c == KEY_F09)
600 exit(EXIT_FAILURE);
601 continue;
602 }
603 } while (c == -1);
604 switch (c) {
605 case NCKEY_INVALID:
606 strcpy(kstr, "NCKEY_INVALID");
607 break;
608 case NCKEY_RESIZE:
609 strcpy(kstr, "NCKEY_RESIZE");
610 break;
611 case NCKEY_UP:
612 strcpy(kstr, "NCKEY_UP");
613 break;
614 case NCKEY_RIGHT:
615 strcpy(kstr, "NCKEY_RIGHT");
616 break;
617 case NCKEY_DOWN:
618 strcpy(kstr, "NCKEY_DOWN");
619 break;
620 case NCKEY_LEFT:
621 strcpy(kstr, "NCKEY_LEFT");
622 break;
623 case NCKEY_INS:
624 strcpy(kstr, "NCKEY_INS");
625 break;
626 case NCKEY_DEL:
627 strcpy(kstr, "NCKEY_DEL");
628 break;
629 case NCKEY_BACKSPACE:
630 strcpy(kstr, "NCKEY_BACKSPACE");
631 break;
632 case NCKEY_PGDOWN:
633 strcpy(kstr, "NCKEY_PGDOWN");
634 break;
635 case NCKEY_PGUP:
636 strcpy(kstr, "NCKEY_PGUP");
637 break;
638 case NCKEY_HOME:
639 strcpy(kstr, "NCKEY_HOME");
640 break;
641 case NCKEY_END:
642 strcpy(kstr, "NCKEY_END");
643 break;
644 case NCKEY_F00:
645 strcpy(kstr, "NCKEY_F00");
646 break;
647 case NCKEY_F01:
648 strcpy(kstr, "NCKEY_F01");
649 break;
650 case NCKEY_F02:
651 strcpy(kstr, "NCKEY_F02");
652 break;
653 case NCKEY_F03:
654 strcpy(kstr, "NCKEY_F03");
655 break;
656 case NCKEY_F04:
657 strcpy(kstr, "NCKEY_F04");
658 break;
659 case NCKEY_F05:
660 strcpy(kstr, "NCKEY_F05");
661 break;
662 case NCKEY_F06:
663 strcpy(kstr, "NCKEY_F06");
664 break;
665 case NCKEY_F07:
666 strcpy(kstr, "NCKEY_F07");
667 break;
668 case NCKEY_F08:
669 strcpy(kstr, "NCKEY_F08");
670 break;
671 case NCKEY_F09:
672 strcpy(kstr, "NCKEY_F09");
673 break;
674 case NCKEY_F10:
675 strcpy(kstr, "NCKEY_F10");
676 break;
677 case NCKEY_F11:
678 strcpy(kstr, "NCKEY_F11");
679 break;
680 case NCKEY_F12:
681 strcpy(kstr, "NCKEY_F12");
682 break;
683 case NCKEY_F13:
684 strcpy(kstr, "NCKEY_F13");
685 break;
686 case NCKEY_F14:
687 strcpy(kstr, "NCKEY_F14");
688 break;
689 case NCKEY_F15:
690 strcpy(kstr, "NCKEY_F15");
691 break;
692 case NCKEY_F16:
693 strcpy(kstr, "NCKEY_F16");
694 break;
695 case NCKEY_F17:
696 strcpy(kstr, "NCKEY_F17");
697 break;
698 case NCKEY_F18:
699 strcpy(kstr, "NCKEY_F18");
700 break;
701 case NCKEY_F19:
702 strcpy(kstr, "NCKEY_F19");
703 break;
704 case NCKEY_F20:
705 strcpy(kstr, "NCKEY_F20");
706 break;
707 case NCKEY_F21:
708 strcpy(kstr, "NCKEY_F21");
709 break;
710 case NCKEY_F22:
711 strcpy(kstr, "NCKEY_F22");
712 break;
713 case NCKEY_F23:
714 strcpy(kstr, "NCKEY_F23");
715 break;
716 case NCKEY_F24:
717 strcpy(kstr, "NCKEY_F24");
718 break;
719 case NCKEY_F25:
720 strcpy(kstr, "NCKEY_F25");
721 break;
722 case NCKEY_F26:
723 strcpy(kstr, "NCKEY_F26");
724 break;
725 case NCKEY_F27:
726 strcpy(kstr, "NCKEY_F27");
727 break;
728 case NCKEY_F28:
729 strcpy(kstr, "NCKEY_F28");
730 break;
731 case NCKEY_F29:
732 strcpy(kstr, "NCKEY_F29");
733 break;
734 case NCKEY_F30:
735 strcpy(kstr, "NCKEY_F30");
736 break;
737 case NCKEY_F31:
738 strcpy(kstr, "NCKEY_F31");
739 break;
740 case NCKEY_F32:
741 strcpy(kstr, "NCKEY_F32");
742 break;
743 case NCKEY_F33:
744 strcpy(kstr, "NCKEY_F33");
745 break;
746 case NCKEY_F34:
747 strcpy(kstr, "NCKEY_F34");
748 break;
749 case NCKEY_F35:
750 strcpy(kstr, "NCKEY_F35");
751 break;
752 case NCKEY_F36:
753 strcpy(kstr, "NCKEY_F36");
754 break;
755 case NCKEY_F37:
756 strcpy(kstr, "NCKEY_F37");
757 break;
758 case NCKEY_F38:
759 strcpy(kstr, "NCKEY_F38");
760 break;
761 case NCKEY_F39:
762 strcpy(kstr, "NCKEY_F39");
763 break;
764 case NCKEY_F40:
765 strcpy(kstr, "NCKEY_F40");
766 break;
767 case NCKEY_F41:
768 strcpy(kstr, "NCKEY_F41");
769 break;
770 case NCKEY_F42:
771 strcpy(kstr, "NCKEY_F42");
772 break;
773 case NCKEY_F43:
774 strcpy(kstr, "NCKEY_F43");
775 break;
776 case NCKEY_F44:
777 strcpy(kstr, "NCKEY_F44");
778 break;
779 case NCKEY_F45:
780 strcpy(kstr, "NCKEY_F45");
781 break;
782 case NCKEY_F46:
783 strcpy(kstr, "NCKEY_F46");
784 break;
785 case NCKEY_F47:
786 strcpy(kstr, "NCKEY_F47");
787 break;
788 case NCKEY_F48:
789 strcpy(kstr, "NCKEY_F48");
790 break;
791 case NCKEY_F49:
792 strcpy(kstr, "NCKEY_F49");
793 break;
794 case NCKEY_F50:
795 strcpy(kstr, "NCKEY_F50");
796 break;
797 case NCKEY_F51:
798 strcpy(kstr, "NCKEY_F51");
799 break;
800 case NCKEY_F52:
801 strcpy(kstr, "NCKEY_F52");
802 break;
803 case NCKEY_F53:
804 strcpy(kstr, "NCKEY_F53");
805 break;
806 case NCKEY_F54:
807 strcpy(kstr, "NCKEY_F54");
808 break;
809 case NCKEY_F55:
810 strcpy(kstr, "NCKEY_F55");
811 break;
812 case NCKEY_F56:
813 strcpy(kstr, "NCKEY_F56");
814 break;
815 case NCKEY_F57:
816 strcpy(kstr, "NCKEY_F57");
817 break;
818 case NCKEY_F58:
819 strcpy(kstr, "NCKEY_F58");
820 break;
821 case NCKEY_F59:
822 strcpy(kstr, "NCKEY_F59");
823 break;
824 case NCKEY_F60:
825 strcpy(kstr, "NCKEY_F60");
826 break;
827 case NCKEY_ENTER:
828 strcpy(kstr, "NCKEY_ENTER");
829 break;
830 case NCKEY_CLS:
831 strcpy(kstr, "NCKEY_CLS");
832 break;
833 case NCKEY_DLEFT:
834 strcpy(kstr, "NCKEY_DLEFT");
835 break;
836 case NCKEY_DRIGHT:
837 strcpy(kstr, "NCKEY_DRIGHT");
838 break;
839 case NCKEY_ULEFT:
840 strcpy(kstr, "NCKEY_ULEFT");
841 break;
842 case NCKEY_URIGHT:
843 strcpy(kstr, "NCKEY_URIGHT");
844 break;
845 case NCKEY_CENTER:
846 strcpy(kstr, "NCKEY_CENTER");
847 break;
848 case NCKEY_BEGIN:
849 strcpy(kstr, "NCKEY_BEGIN");
850 break;
851 case NCKEY_CANCEL:
852 strcpy(kstr, "NCKEY_CANCEL");
853 break;
854 case NCKEY_CLOSE:
855 strcpy(kstr, "NCKEY_CLOSE");
856 break;
857 case NCKEY_COMMAND:
858 strcpy(kstr, "NCKEY_COMMAND");
859 break;
860 case NCKEY_COPY:
861 strcpy(kstr, "NCKEY_COPY");
862 break;
863 case NCKEY_EXIT:
864 strcpy(kstr, "NCKEY_EXIT");
865 break;
866 case NCKEY_PRINT:
867 strcpy(kstr, "NCKEY_PRINT");
868 break;
869 case NCKEY_REFRESH:
870 strcpy(kstr, "NCKEY_REFRESH");
871 break;
872 case NCKEY_SEPARATOR:
873 strcpy(kstr, "NCKEY_SEPARATOR");
874 break;
875 case NCKEY_CAPS_LOCK:
876 strcpy(kstr, "NCKEY_CAPS_LOCK");
877 break;
878 case NCKEY_SCROLL_LOCK:
879 strcpy(kstr, "NCKEY_SCROLL_LOCK");
880 break;
881 case NCKEY_NUM_LOCK:
882 strcpy(kstr, "NCKEY_NUM_LOCK");
883 break;
884 case NCKEY_PRINT_SCREEN:
885 strcpy(kstr, "NCKEY_PRINT_SCREEN");
886 break;
887 case NCKEY_PAUSE:
888 strcpy(kstr, "NCKEY_PAUSE");
889 break;
890 case NCKEY_MENU:
891 strcpy(kstr, "NCKEY_MENU");
892 break;
893 case NCKEY_MEDIA_PLAY:
894 strcpy(kstr, "NCKEY_MEDIA_PLAY");
895 break;
896 case NCKEY_MEDIA_PAUSE:
897 strcpy(kstr, "NCKEY_MEDIA_PAUSE");
898 break;
899 case NCKEY_MEDIA_PPAUSE:
900 strcpy(kstr, "NCKEY_MEDIA_PPAUSE");
901 break;
902 case NCKEY_MEDIA_REV:
903 strcpy(kstr, "NCKEY_MEDIA_REV");
904 break;
905 case NCKEY_MEDIA_STOP:
906 strcpy(kstr, "NCKEY_MEDIA_STOP");
907 break;
908 case NCKEY_MEDIA_FF:
909 strcpy(kstr, "NCKEY_MEDIA_FF");
910 break;
911 case NCKEY_MEDIA_REWIND:
912 strcpy(kstr, "NCKEY_MEDIA_REWIND");
913 break;
914 case NCKEY_MEDIA_NEXT:
915 strcpy(kstr, "NCKEY_MEDIA_NEXT");
916 break;
917 case NCKEY_MEDIA_PREV:
918 strcpy(kstr, "NCKEY_MEDIA_PREV");
919 break;
920 case NCKEY_MEDIA_RECORD:
921 strcpy(kstr, "NCKEY_MEDIA_RECORD");
922 break;
923 case NCKEY_MEDIA_LVOL:
924 strcpy(kstr, "NCKEY_MEDIA_LVOL");
925 break;
926 case NCKEY_MEDIA_RVOL:
927 strcpy(kstr, "NCKEY_MEDIA_RVOL");
928 break;
929 case NCKEY_MEDIA_MUTE:
930 strcpy(kstr, "NCKEY_MEDIA_MUTE");
931 break;
932 case NCKEY_LSHIFT:
933 strcpy(kstr, "NCKEY_LSHIFT");
934 break;
935 case NCKEY_LCTRL:
936 strcpy(kstr, "NCKEY_LCTRL");
937 break;
938 case NCKEY_LALT:
939 strcpy(kstr, "NCKEY_LALT");
940 break;
941 case NCKEY_LSUPER:
942 strcpy(kstr, "NCKEY_LSUPER");
943 break;
944 case NCKEY_LHYPER:
945 strcpy(kstr, "NCKEY_LHYPER");
946 break;
947 case NCKEY_LMETA:
948 strcpy(kstr, "NCKEY_LMETA");
949 break;
950 case NCKEY_RSHIFT:
951 strcpy(kstr, "NCKEY_RSHIFT");
952 break;
953 case NCKEY_RCTRL:
954 strcpy(kstr, "NCKEY_RCTRL");
955 break;
956 case NCKEY_RALT:
957 strcpy(kstr, "NCKEY_RALT");
958 break;
959 case NCKEY_RSUPER:
960 strcpy(kstr, "NCKEY_RSUPER");
961 break;
962 case NCKEY_RHYPER:
963 strcpy(kstr, "NCKEY_RHYPER");
964 break;
965 case NCKEY_RMETA:
966 strcpy(kstr, "NCKEY_RMETA");
967 break;
968 case NCKEY_L3SHIFT:
969 strcpy(kstr, "NCKEY_L3SHIFT");
970 break;
971 case NCKEY_L5SHIFT:
972 strcpy(kstr, "NCKEY_L5SHIFT");
973 break;
974 case NCKEY_MOTION:
975 strcpy(kstr, "NCKEY_MOTION");
976 break;
977 case NCKEY_BUTTON1:
978 strcpy(kstr, "NCKEY_BUTTON1");
979 break;
980 case NCKEY_BUTTON2:
981 strcpy(kstr, "NCKEY_BUTTON2");
982 break;
983 case NCKEY_BUTTON3:
984 strcpy(kstr, "NCKEY_BUTTON3");
985 break;
986 case NCKEY_BUTTON4:
987 strcpy(kstr, "NCKEY_BUTTON4");
988 break;
989 case NCKEY_BUTTON5:
990 strcpy(kstr, "NCKEY_BUTTON5");
991 break;
992 case NCKEY_BUTTON6:
993 strcpy(kstr, "NCKEY_BUTTON6");
994 break;
995 case NCKEY_BUTTON7:
996 strcpy(kstr, "NCKEY_BUTTON7");
997 break;
998 case NCKEY_BUTTON8:
999 strcpy(kstr, "NCKEY_BUTTON8");
1000 break;
1001 case NCKEY_BUTTON9:
1002 strcpy(kstr, "NCKEY_BUTTON9");
1003 break;
1004 case NCKEY_BUTTON10:
1005 strcpy(kstr, "NCKEY_BUTTON10");
1006 break;
1007 case NCKEY_BUTTON11:
1008 strcpy(kstr, "NCKEY_BUTTON11");
1009 break;
1010 case NCKEY_SIGNAL:
1011 strcpy(kstr, "NCKEY_SIGNAL");
1012 break;
1013 case NCKEY_EOF:
1014 strcpy(kstr, "NCKEY_EOF");
1015 break;
1016 default:
1017 snprintf(kstr, 32, "NCKEY_%d", key_id);
1018 break;
1019 }
1020 ui_mvwaddstr(sfc, w, 6, 3, " Action:");
1021 ui_mvwaddstr(sfc, w, 6, 16, action);
1022 ui_wclrtoeol(sfc, w);
1023 char tmp[MAXLEN];
1024 if (ev.mouse_inside) {
1025 sprintf(tmp, " Inside Win: y: %3d, x: %3d",
1026 ev.y, ev.x);
1027 } else {
1028 sprintf(tmp, " stdwin: y: %3d, x: %3d",
1029 ev.y, ev.x);
1030 }
1031 ui_mvwaddstr(sfc, w, 4, 4, tmp);
1032 ui_wclrtoeol(sfc, w);
1033 ui_cursor_move(sfc, w, 5, 0);
1034 ui_wclrtoeol(sfc, w);
1035 ui_cursor_move(sfc, w, 7, 0);
1036 ui_wclrtoeol(sfc, w);
1037 if (c != KEY_MOUSE) {
1038 sprintf(tmp, " Octal: %3o", c);
1039 ui_mvwaddstr(sfc, w, 3, 4, tmp);
1040 ui_wclrtoeol(sfc, w);
1041
1042 sprintf(tmp, " Decimal: %3d", c);
1043 ui_mvwaddstr(sfc, w, 4, 4, tmp);
1044 ui_wclrtoeol(sfc, w);
1045
1046 sprintf(tmp, " Hex: %3x", c);
1047 ui_mvwaddstr(sfc, w, 5, 4, tmp);
1048 ui_wclrtoeol(sfc, w);
1049
1050 if (kstr[0]) {
1051 sprintf(tmp, "Description: %s", kstr);
1052 } else {
1053 sprintf(tmp, " ASCII: %c", c);
1054 }
1055 ui_mvwaddstr(sfc, w, 6, 3, tmp);
1056 ui_wclrtoeol(sfc, w);
1057 ui_render();
1058 }
1059 if (c == KEY_ALTEND) {
1060 usleep(100000);
1061 break;
1062 }
1063 c = '\0';
1064 }
1065#endif
1066 return 0;
1067}
volatile sig_atomic_t sig_received
Definition sig.c:31
bool handle_signal(sig_atomic_t)
#define KEY_ALTEND
Definition cm.h:560
void ui_render()
Definition ui_ncurses.c:800
int ui_cursor_move(UiSurface *s, uint w, uint y, uint x)
Definition ui_ncurses.c:727
int ui_mvwaddstr(UiSurface *s, uint w, uint y, uint x, const char *text)
int ui_get_event(UiSurface *s, uint w, UiEvent *ev, int timeout_ms)
Wait for an input event on target (or stdscr if NULL).
int ui_wclrtoeol(UiSurface *s, uint w)
#define KEY_F09
#define KEY_MOUSE
#define KSTRLEN
Definition curskeys.c:14
#define MAXLEN
Definition curskeys.c:15
char em1[MAXLEN]
Definition dwin.c:143
char em2[MAXLEN]
Definition dwin.c:144
char em0[MAXLEN]
Definition dwin.c:142
int display_error(char *msg0, char *msg1, char *msg2, char *msg3)
Display an error message window or print to stderr.
Definition dwin.c:778
bool mouse_inside
Definition ui_backend.h:113

References display_error(), em0, em1, em2, handle_signal(), UiEvent::mouse_inside, sig_received, ui_cursor_move(), ui_get_event(), ui_mvwaddstr(), ui_render(), ui_wclrtoeol(), WIN, UiEvent::x, and UiEvent::y.

Referenced by popup_ckeys().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ popup_ckeys()

int popup_ckeys ( )

Definition at line 31 of file curskeys.c.

31 {
32 char Title[] = "TEST CURSES KEYS";
33 unsigned lines = 10;
34 unsigned cols = 55;
35 char tmp[MAXLEN];
36 uint maxy, maxx;
37 ui_get_screen_size(&maxy, &maxx);
38 uint begy = (maxy - lines) / 3;
39 uint begx = (maxx - cols) / 2;
40 if (surface_box_win_new(lines, cols, begy, begx, Title)) {
41 strnz__cpy(tmp, "surface_box_win_new failed: ", MAXLEN - 1);
42 strnz__cat(tmp, Title, MAXLEN - 1);
43 Perror(tmp);
44 exit(EXIT_FAILURE);
45 }
47 ui_keypad(sfc, WIN, true);
49 ui_mvwaddstr(sfc, WIN, lines - 1, 0, " <ALT>END to exit ");
50 ui_bkgdset(sfc, WIN, &cell_nt);
51 ui_mvwaddstr(sfc, WIN, 1, 4, "Press a key or activate the mouse:");
52#ifdef UAL_UI
53 ncurses_input(sfc, WIN);
54#else
55 notcurses_input(sfc, WIN);
56#endif
58 return 0;
59}
int ui_bkgdset(UiSurface *s, uint w, const UiCell *cell)
Definition ui_ncurses.c:760
void ui_surface_destroy(UiSurface *s)
Definition ui_ncurses.c:377
UiSurface * ui_surface[UI_SFC_MAX]
Definition ui_ncurses.c:28
void ui_get_screen_size(uint *lines, uint *cols)
Definition ui_ncurses.c:692
int sfc_ptr
Definition nckeys.c:47
int ui_keypad(UiSurface *s, uint w, bool enable)
Definition ui_ncurses.c:635
int notcurses_input(UiSurface *s, uint w)
Display Curses Keys Responds to curses keys and mouse events, displaying the key code and description...
Definition curskeys.c:584
int surface_box_win_new(uint wlines, uint wcols, uint wbegy, uint wbegx, char *wtitle)
Definition dwin.c:521
UiCell cell_nt
Definition dwin.c:94
UiCell cell_nt_rev
Definition dwin.c:95
int Perror(char *emsg_str)
Display a simple error message window or print to stderr.
Definition dwin.c:841
size_t strnz__cpy(char *, const char *, size_t)
safer alternative to strncpy
Definition futil.c:537
size_t strnz__cat(char *, const char *, size_t)
safer alternative to strncat
Definition futil.c:566
A drawable surface in the NotCurses backend.

References cell_nt, cell_nt_rev, notcurses_input(), Perror(), sfc_ptr, strnz__cat(), strnz__cpy(), surface_box_win_new(), ui_bkgdset(), ui_get_screen_size(), ui_keypad(), ui_mvwaddstr(), ui_surface, ui_surface_destroy(), and WIN.

Referenced by main(), and menu_cmd_processor().

Here is the call graph for this function:
Here is the caller graph for this function: