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 594 of file curskeys.c.

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

◆ popup_ckeys()

int popup_ckeys ( )

Definition at line 31 of file curskeys.c.

31 {
32
33 char Title[] = _("TEST CURSES KEYS");
34 unsigned lines = 10;
35 unsigned cols = 55;
36 char tmp[MAXLEN];
37 uint maxy, maxx;
38 ui_get_screen_size(&maxy, &maxx);
39 uint begy = (maxy - lines) / 3;
40 uint begx = (maxx - cols) / 2;
41 if (ui_tracked_sfc_box(lines, cols, begy, begx, Title)) {
42 strnz__cpy(tmp, _("ui_tracked_sfc_box failed: "), MAXLEN - 1);
43 strnz__cat(tmp, Title, MAXLEN - 1);
44 ui_perror(tmp);
45 exit(EXIT_FAILURE);
46 }
48 ui_keypad(sfc, WIN, true);
49 ui_bkgdset(sfc, WIN, &cell_nt_rev);
50 ui_mvwaddstr(sfc, WIN, lines - 1, 0, _(" <ALT>END to exit "));
51 ui_bkgdset(sfc, WIN, &cell_nt);
52 ui_mvwaddstr(sfc, WIN, 1, 4, _("Press a key or activate the mouse:"));
53#ifdef UAL_UI
54 ncurses_input(sfc, WIN);
55#else
56 notcurses_input(sfc, WIN);
57#endif
58 return 0;
59}
UiCell cell_nt
Definition ui_common.c:106
void ui_get_screen_size(uint *lines, uint *cols)
Get the current screen size (number of lines and columns).
Definition ui_ncurses.c:722
int sfc_ptr
Definition ui_ncurses.c:42
int ui_tracked_sfc_box(uint wlines, uint wcols, uint wbegy, uint wbegx, const char *wtitle)
Create a new surface with a box window.
Definition ui_common.c:387
int ui_bkgdset(UiSurface *s, ss_t w, const UiCell *cell)
Set the background for new content to be written to a specific window within a UiSurface.
Definition ui_ncurses.c:941
UiCell cell_nt_rev
Definition ui_common.c:107
int ui_keypad(UiSurface *s, ss_t w, bool enable)
Enable or disable the keypad for a UiSurface.
Definition ui_ncurses.c:771
UiSurface * ui_surface[UI_SFC_MAX]
Definition ui_ncurses.c:40
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:594
size_t strnz__cpy(char *, const char *, size_t)
safer alternative to strncpy
Definition whence.c:291
size_t strnz__cat(char *, const char *, size_t)
safer alternative to strncat
Definition whence.c:320
int ui_perror(char *emsg_str)
Display a simple error message window or print to stderr.
Definition ui_common.c:1257

References cell_nt, cell_nt_rev, sfc_ptr, strnz__cat(), strnz__cpy(), ui_bkgdset(), ui_get_screen_size(), ui_keypad(), ui_mvwaddstr(), ui_perror(), ui_surface, and ui_tracked_sfc_box().

Referenced by main(), and menu_cmd_processor().

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