2
3
4
5
6
7
8
13#define _XOPEN_SOURCE_EXTENDED 1
14#define NCURSES_WIDECHAR 1
17#include <ncursesw/ncurses.h>
24#if __STDC_VERSION__
< 202311L
33#define SCREEN_MAX_LINES 100
34#define Ctrl(c) ((c) & 0x1f
)
37
38
39
40
41
42
43
44
45
46
47
48
64
66
67
68
69
70
71
72
73
74
75
76
77
78
86
87
88
97
98
99
100
101
102
103
106 __typeof__(x) _a = (x);
112 (__c >= 'A' && __c <= 'Z') ? (__c + ('a' - 'A')) : __c;
117 (__c >= 'a' && __c <= 'z') ? (__c - ('a' - 'A')) : __c;
121
122
187
188
189
190
191
192
193
194
195
196
197
198
199
204
205
206
207
208
209
210
211
212
213
214
217#define DEFAULTSHELL "/bin/bash"
219#define S_QUIET 0x2000
222
223
224
225
226
227
228
229
233 rc = atexit(end_pgm);
235 fprintf(stderr
, "\nCannot set exit function\n");
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263#define CHYRON_KEY_MAXLEN
265
266#define CHYRON_KEYS 20
270
283extern int xwgetch(WINDOW *, Chyron *,
int);
284extern int dxwgetch(WINDOW *, WINDOW *, Chyron *,
int);
297extern int dmon(
char **);
300
302
336
337
338
339
340
341
342
369extern int box_new(
int,
int,
int,
int,
char *, bool);
370extern int box2_new(
int,
int,
int,
int,
char *, bool);
371extern int win_new(
int,
int,
int,
int);
372extern int win2_new(
int,
int,
int,
int);
380extern bool
mk_dir(
char *dir);
382extern cchar_t
mkccc(
int, attr_t,
char *);
402#define KEY_ALTF0 0x138
404#define XTERM_256COLOR
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
456#define KEY_ALTINS 0x223
457#define KEY_ALTHOME 0x21e
458#define KEY_ALTPGUP 0x232
459#define KEY_ALTDEL 0x20e
460#define KEY_ALTEND 0x219
461#define KEY_ALTPGDN 0x22d
462#define KEY_ALTUP 0x23d
463#define KEY_ALTLEFT 0x228
464#define KEY_ALTDOWN 0x214
465#define KEY_ALTRIGHT 0x237
466#elif defined(XTERM_GHOSTTY)
467#define KEY_ALTINS 0x228
468#define KEY_ALTHOME 0x223
469#define KEY_ALTPGUP 0x237
470#define KEY_ALTDEL 0x213
471#define KEY_ALTEND 0x21e
472#define KEY_ALTPGDN 0x232
473#define KEY_ALTUP 0x242
474#define KEY_ALTLEFT 0x22d
475#define KEY_ALTDOWN 0x219
476#define KEY_ALTRIGHT 0x23c
480#define BW_HO L'\x2500'
481#define BW_VE L'\x2502'
482#define BW_TL L'\x250C'
483#define BW_TR L'\x2510'
484#define BW_BL L'\x2514'
485#define BW_BR L'\x2518'
486#define BW_RTL L'\x256d'
487#define BW_RTR L'\x256e'
488#define BW_RBL L'\x2570'
489#define BW_RBR L'\x256f'
490#define BW_LT L'\x251C'
491#define BW_TT L'\x252C'
492#define BW_RT L'\x2524'
493#define BW_CR L'\x253C'
494#define BW_BT L'\x2534'
496#define BW_RA L'\x2192'
497#define BW_LA L'\x2190'
498#define BW_UA L'\x2191'
499#define BW_DA L'\x2193'
500#define BW_RAN L'\x276F'
501#define BW_LAN L'\x276E'
504
505
506
507
508
510extern const wchar_t
bw_ho;
511extern const wchar_t
bw_ve;
512extern const wchar_t
bw_tl;
513extern const wchar_t
bw_tr;
514extern const wchar_t
bw_bl;
515extern const wchar_t
bw_br;
516extern const wchar_t
bw_lt;
517extern const wchar_t
bw_tt;
518extern const wchar_t
bw_rt;
519extern const wchar_t
bw_cr;
520extern const wchar_t
bw_bt;
521extern const wchar_t
bw_sp;
522extern const wchar_t
bw_ra;
523extern const wchar_t
bw_la;
524extern const wchar_t
bw_ua;
525extern const wchar_t
bw_da;
526extern const wchar_t
bw_ran;
527extern const wchar_t
bw_lan;
536
538
556
559
562
563
566
567
569
570
572
575
576
579
580
583
586
588
589
591
592
595
597#define to_uppercase(c)
598 if (c >= 'a' && c <= 'z')
601#define to_lowercase(c)
602 if (c >= 'A' && c <= 'Z')
605
609
611
619
625extern void cbox(WINDOW *);
636
637
643
644
647
651
652
658
659
660
661
667
668
669
670
671
672
673
679#define to_uppercase(c)
680 if (c >= 'a' && c <= 'z')
683
684
685
686
687
688
689
690
691
692
693
694
695
763extern int a_toi(
char *, bool *);
764extern bool
chrep(
char *,
char,
char);
765extern char *
rep_substring(
const char *,
const char *,
const char *);
774extern bool
strnfill(
char *,
char,
int);
775extern bool
str_subc(
char *,
char *,
char,
char *,
int);
776extern size_t
strnz(
char *, size_t);
777extern size_t
strnlf(
char *, size_t);
779extern size_t
ssnprintf(
char *, size_t,
const char *, ...);
780extern size_t
strnz__cpy(
char *,
const char *, size_t);
781extern size_t
strnz__cat(
char *,
const char *, size_t);
783extern size_t
string_cpy(String *,
const String *);
784extern size_t
string_cat(String *,
const String *);
785extern size_t
string_ncat(String *,
const String *, size_t);
786extern size_t
string_ncpy(String *,
const String *, size_t);
787extern size_t
trim(
char *);
788extern size_t
rtrim(
char *);
804extern int shell(
char *);
818extern void abend(
int,
char *);
821extern int answer_yn(
char *,
char *,
char *,
char *);
825extern unsigned long a_to_ul(
const char *);
833extern bool
dir_name(
char *,
char *);
838extern bool
trim_ext(
char *,
char *);
int cmd_processor(Init *)
int popup_form(Init *, int, char **, int, int)
instantiate a form popup window
int popup_menu(Init *, int, char **, int, int)
instantiate a menu popup window
int popup_view(Init *, int, char **, int, int, int, int)
instantiate a view popup window
int popup_pick(Init *, int, char **, int, int)
instantiate a pick popup window
volatile sig_atomic_t sig_received
size_t rtrim(char *)
Trims trailing spaces from string s in place.
bool handle_signal(sig_atomic_t)
void get_rfc3339_s(char *, size_t)
void mouse_getch(int *, int *, int *, int *)
int display_ok_message(char *)
void destroy_win(WINDOW *)
struct termios shell_tioctl curses_tioctl
bool verify_dir_q(char *, int)
String mk_string(size_t)
Create a String struct with a dynamically allocated string.
bool construct_file_spec(char *, char *, char *, char *, char *, int)
#define CHYRON_KEY_MAXLEN
bool verify_file_q(char *, int)
void dump_opts_by_use(char *, char *)
void destroy_box(WINDOW *)
bool f_have_curses_tioctl
void w_mouse_getch(WINDOW *, int *, int *, int *, int *)
bool str_to_bool(const char *)
Converts String to boolean true or false.
#define __atexit
This macro registers the end_pgm function to be called when the program exits.
struct termios shell_out_tioctl curses_out_tioctl
int display_curses_keys()
void display_argv_error_msg(char *, char **)
struct termios shell_in_tioctl curses_in_tioctl
struct termios shell_err_tioctl curses_err_tioctl
int popup_ckeys()
Display Curses Keys Responds to curses keys and mouse events, displaying the key code and description...
WINDOW * win_win2[MAXWIN]
int dxwgetch(WINDOW *win, WINDOW *win2, Chyron *chyron, int n)
char const colors_text[][10]
Color names for .minitrc overrides.
struct termios shell_tioctl
bool open_curses(SIO *)
Initialize NCurses and color settings.
void view_win_resize(Init *, char *)
Resize the current window and its box, and update the title.
int xwgetch(WINDOW *, Chyron *, int)
Wrapper for wgetch that handles signals, mouse events, checks for clicks on the chyron line,...
int box_new(int, int, int, int, char *, bool)
Create a new window with optional box and title.
int box2_new(int, int, int, int, char *, bool)
Create a new window with optional box and title.
void restore_wins()
Restore all windows after a screen resize.
void view_full_screen_resize(Init *)
Resize the full screen view and its components.
void win_init_attrs()
Initialize window attributes.
WINDOW * win_del()
Delete the current window and its associated box window.
void mvwaddstr_fill(WINDOW *, int, int, char *, int)
For lines shorter than their display area, fill the rest with spaces.
int win2_new(int wlines, int wcols, int wbegy, int wbegx)
Create a new window with specified dimensions and position.
void cbox(WINDOW *)
Draw a box around the specified window.
int win_new(int, int, int, int)
Create a new window with specified dimensions and position.
void win_resize(int, int, char *)
Resize the current window and its box, and update the title.
void destroy_curses()
Gracefully shut down NCurses and restore terminal settings.
void win_redraw(WINDOW *)
Redraw the specified window.
RGB xterm256_idx_to_rgb(int)
Convert XTerm 256 color index to RGB color.
int clr_name_to_idx(char *)
Get color index from color name.
int rgb_to_curses_clr(RGB *)
Get color index for RGB color.
bool init_clr_palette(SIO *)
Initialize color palette based on SIO settings.
void apply_gamma(RGB *)
Apply gamma correction to RGB color.
int rgb_to_xterm256_idx(RGB *)
Convert RGB color to XTerm 256 color index.
cchar_t mkccc(int, attr_t, char *)
Create a cchar_t with the specified color pair index.
int get_clr_pair(int fg, int bg)
Get color pair index for foreground and background colors.
bool wait_destroy(Chyron *)
Destroy the waiting message window and chyron.
bool waitpid_with_timeout(pid_t pid, int timeout)
Wait for a process to finish with a timeout and optional user cancellation.
bool action_disposition(char *title, char *action_str)
Display a simple action disposition message window or print to stderr.
int wait_continue(WINDOW *, Chyron *, int)
Update the waiting message with remaining time and check for user input.
int answer_yn(char *em0, char *em1, char *em2, char *em3)
Accept a single letter answer.
WINDOW * wait_mk_win(Chyron *, char *)
Display a popup waiting message.
int Perror(char *)
Display a simple error message window or print to stderr.
int display_error(char *em0, char *em1, char *em2, char *em3)
Display an error message window or print to stderr.
void abend(int, char *)
Abnormal program termination.
Chyron * wait_mk_chyron()
Create a Chyron struct for the waiting message.
bool is_set_chyron_key(Chyron *, int)
Check if function key label is set.
void set_chyron_key(Chyron *, int, char *, int)
Set chyron key with default color pair (cp_nt_rev).
void display_chyron(WINDOW *win, Chyron *chyron, int line, int col)
Display chyron on window.
Chyron * destroy_chyron(Chyron *chyron)
Destroy Chyron structure.
int get_chyron_key(Chyron *, int)
Get keycode from chyron.
void set_chyron_key_cp(Chyron *, int, char *, int, int)
Set chyron key with color pair (cp).
void compile_chyron(Chyron *)
construct the chyron string from the chyron structure
void unset_chyron_key(Chyron *, int)
Unset chyron key.
Chyron * new_chyron()
Create and initialize Chyron structure.
int fork_exec(char **)
Fork and exec a command.
int shell(char *)
Execute a shell command.
int dmon(char **)
Fork and execute a command as a daemon.
int full_screen_fork_exec(char **)
Execute a command in full screen mode.
int full_screen_shell(char *)
Execute a shell command in full screen mode.
int init_form(Init *, int, char **, int, int)
Initialize form data structure and parse description file.
bool locate_file_in_path(char *, char *)
Locates a file in the system PATH.
size_t canonicalize_file_spec(char *)
Removes quotes and trims at first space.
size_t strnz__cpy(char *, const char *, size_t)
safer alternative to strncpy
int destroy_argv(int argc, char **argv)
Deallocates memory allocated for argument strings in argv.
bool parse_local_timestamp(const char *, time_t *)
Parses an ISO 8601 timestamp string in local time and converts it to time_t.
bool trim_ext(char *, char *)
trims the file extension from "filename" and copies the result to "buf"
bool stripz_quotes(char *)
removes leading and trailing double quotes if present
void write_cmenu_log(char *)
Write message to C-Menu log file with timestamp.
size_t trim(char *)
Trims leading and trailing spaces from string s in place.
char * get_local_timestamp()
Returns the current local time as an ISO 8601 formatted string.
bool is_directory(const char *)
Checks if the given path is a directory.
bool file_spec_path(char *, char *)
extracts the path component of a file specification
bool str_to_upper(char *)
Converts a string to uppercase.
bool dir_name(char *, char *)
Returns the directory name of a file specification.
double str_to_double(char *)
converts string to double
bool str_to_lower(char *)
Converts a string to lowercase.
bool strnfill(char *, char, int)
Fills string s with character c n.
size_t strnz(char *, size_t)
terminates string at New Line, Carriage Return, or max_len
size_t ssnprintf(char *, size_t, const char *,...)
ssnprintf was designed to be a safer alternative to snprintf.
bool expand_tilde(char *, int)
Replaces "~/" in string with the user's home directory.
bool strip_quotes(char *)
removes leading and trailing double quotes if present
bool is_valid_regex(const char *)
Checks if the given regular expression pattern is valid.
void open_cmenu_log()
Open new C-Menu log file.
char * strnz_dup(char *, size_t)
Allocates memory for and duplicates string s up to length l or until line feed or carriage return.
size_t strip_ansi(char *, char *)
Strips ANSI SGR escape sequences (ending in 'm') from string s to d.
bool mk_dir(char *dir)
If directory doesn't exist, make it.
size_t strnz__cat(char *, const char *, size_t)
safer alternative to strncat
bool str_subc(char *, char *, char, char *, int)
Replaces "ReplaceChr" in "s" with "Withstr" in "d" won't copy more than "l" bytes to "d" Replaces all...
bool verify_file(char *, int)
Verifies that the file specified by "in_spec" exists and is accessible with the permissions specified...
char * rep_substring(const char *, const char *, const char *)
Replace all occurrences of "tgt_s" in "org_s" with "rep_s".
bool is_symlink_to_dir(const char *)
Checks if the given path is a symbolic link to a directory.
size_t strnlf(char *, size_t)
terminates string with line feed
int a_toi(char *, bool *)
a safer alternative to atoi() for converting ASCII strings to integers.
bool file_spec_name(char *, char *)
extracts the file name component of a file specification
void write_cmenu_log_nt(char *)
Write message to C-Menu log file without timestamp.
bool verify_dir(char *, int)
Verifies that the directory specified by "spec" exists and is accessible with the permissions specifi...
bool chrep(char *, char, char)
Replaces all occurrences of old_chr in s with new_chr in place.
bool base_name(char *, char *)
Returns the base name of a file specification.
char * get_ip_addresses(char *, int)
Retrieves the IP addresses of the local machine and formats them into a string.
bool normalize_file_spec(char *)
replace backslashes with forward lashes
char * format_local_timestamp(time_t, char *, size_t)
Formats a time_t as an ISO 8601 string in local time.
int str_to_args(char **, char *, int)
Converts a string into an array of argument strings.
char * get_user_str(char *, size_t)
Retrieves the current user's name and UID, and formats it into a string.
bool trim_path(char *)
Trims trailing spaces and slashes from directory path in place.
unsigned long a_to_ul(const char *)
Converts a string to an unsigned long long integer, with support for suffixes K, M,...
char * iso8601_time(char *, int, time_t *, bool)
Formats a struct tm as an ISO 8601 string.
size_t string_cpy(String *, const String *)
Copy src String to dest String, allocating additional memory for dest String if necessary.
String to_string(const char *)
String functions provide a simple string library to facilitate string manipulation in C,...
size_t string_ncpy(String *, const String *, size_t)
copies up to n characters from src String to dest String, allocating additional memory for dest Strin...
size_t string_cat(String *, const String *)
Concatenates src String to dest String, allocating additional memory for dest String if necessary.
String free_string(String)
Free the dynamically allocated String.
size_t string_ncat(String *, const String *, size_t)
Concatenates up to n characters from src String to dest String, allocating additional memory for dest...
int segmentation_fault()
Function to intentionally cause a segmentation fault for testing purposes.
int parse_opt_args(Init *, int, char **)
Parse command-line options and set Init struct values accordingly.
bool derive_file_spec(char *, char *, char *)
Derive full file specification from directory and file name.
int write_config(Init *)
Write the current configuration to a file specified in init->minitrc.
void mapp_initialization(Init *, int, char **)
Main initialization function for MAPP - Menu Application.
void zero_opt_args(Init *)
Initialize optional arguments in the Init struct to default values.
void view_calc_win_dimensions(Init *, char *title)
Calculate the dimensions and position of the box window for C-Menu View.
int init_view_full_screen(Init *)
Initialize C-Menu View in full screen mode.
int init_view_boxwin(Init *, char *)
Initialize the C-Menu View in box window mode.
void view_calc_full_screen_dimensions(Init *)
Calculate the dimensions for full screen mode.
int view_init_input(View *, char *)
Initialize the input for a C-Menu View.
View * destroy_view(Init *init)
Destroy View structure.
Form * new_form(Init *, int, char **, int, int)
Create and initialize Form structure.
bool init_menu_files(Init *, int, char **)
Initialize Menu file specifications.
bool verify_spec_arg(char *, char *, char *, char *, int)
Verify file specification argument.
Init * new_init(int, char **)
Create and initialize Init structure.
Menu * new_menu(Init *, int, char **, int, int)
Create and initialize Menu structure.
Menu * destroy_menu(Init *init)
Destroy Menu structure.
Form * destroy_form(Init *init)
Destroy Form structure.
View * new_view(Init *)
Create and initialize View structure.
Pick * new_pick(Init *, int, char **, int, int)
Create and initialize Pick structure.
Init * destroy_init(Init *init)
Destroy Init structure.
Pick * destroy_pick(Init *init)
Destroy Pick structure.
unsigned int menu_engine(Init *)
The main loop of the menu system.
unsigned int parse_menu_description(Init *)
Parse menu description file and create Menu.
int init_pick(Init *, int, char **, int, int)
Initializes pick structure and opens pick input file or pipe.
int pick_engine(Init *)
Initializes pick interface, calculates window size and position, and enters picker loop.
int open_pick_win(Init *)
Initializes the pick window based on the parameters specified in the Pick structure.
bool capture_shell_tioctl()
capture_shell_tioctl() - capture shell terminal settings
char di_getch()
get single character from terminal in raw mode
bool restore_curses_tioctl()
restore_curses_tioctl() - restore curses terminal settings
bool capture_curses_tioctl()
capture_curses_tioctl() - capture curses terminal settings
bool mk_raw_tioctl(struct termios *)
mk_raw_tioctl() - set terminal to raw mode
bool set_sane_tioctl(struct termios *)
set_sane_tioctl() - set terminal to sane settings for C-MENU
bool restore_shell_tioctl()
restore_shell_tioctl() - restore shell terminal settings
void sig_dfl_mode()
Set signal handlers to default behavior.
void signal_handler(int)
Signal handler for interrupt signals.
void sig_prog_mode()
Set up signal handlers for interrupt signals.
int view_file(Init *)
Start view.
char receiver_cmd[MAXLEN]
char provider_cmd[MAXLEN]
char text[CHYRON_KEY_MAXLEN]
cchar_t cmplx_buf[MAXLEN]
ChyronKey * key[CHYRON_KEYS]
char nt_hl_rev_bg[COLOR_LEN]
char nt_rev_bg[COLOR_LEN]
char nt_rev_fg[COLOR_LEN]
char ln_bg_clr_x[COLOR_LEN]
char nt_hl_rev_fg[COLOR_LEN]