2
3
4
5
6
7
8
13#define _XOPEN_SOURCE_EXTENDED 1
14#define NCURSES_WIDECHAR 1
18#include "../ui/ui_ncurses_internal.h"
19#include "ui_backend.h"
20#include <ncursesw/ncurses.h>
21#include <ncursesw/panel.h>
24#include "ui_backend.h"
25#include "ui_notcurses_internal.h"
26#include <notcurses/notcurses.h>
38#if __STDC_VERSION__
< 202311L
53#define SCREEN_MAX_LINES 100
54#define Ctrl(c) ((c) & 0x1f
)
69#define DIV_ROUND_UP(n, d) (((n) + (d) - 1
) / (d))
72
73
74
75
76
77
78
79
80
81
82
83
86 __typeof__(a) _a = (a);
87 __typeof__(a) _b = (b);
99
101
102
103
104
105
106
107
108
109
110
111
112
113
121
122
123
132
133
134
135
136
137
138
141 __typeof__(x) _a = (x);
147 (__c >= 'A' && __c <= 'Z') ? (__c + ('a' - 'A')) : __c;
152 (__c >= 'a' && __c <= 'z') ? (__c - ('a' - 'A')) : __c;
156#define to_uppercase(c)
157 if (c >= 'a' && c <= 'z')
160#define to_lowercase(c)
161 if (c >= 'A' && c <= 'Z')
164
165
295
296
297
298
299
300
301
302
303
304
305
306
307
308
313
314
315
316
317
318
319
320
321
322
323
326#define DEFAULTSHELL "/bin/bash"
328#define S_QUIET 0x2000
331
332
333
334
335
336
337
338
342 rc = atexit(end_pgm);
344 fprintf(stderr
, "\nCannot set exit function\n");
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372#define CHYRON_KEY_MAXLEN
374
375#define CHYRON_KEYS 20
380
414
449
450
451
452
453
454
455
492extern bool mk_dir(
char *dir);
500extern bool is_newer(
char *,
char *);
502#define KEY_ALTF0 0x138
504#define XTERM_256COLOR
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
556#define KEY_ALTINS 0x223
557#define KEY_ALTHOME 0x21e
558#define KEY_ALTPGUP 0x232
559#define KEY_ALTDEL 0x20e
560#define KEY_ALTEND 0x219
561#define KEY_ALTPGDN 0x22d
562#define KEY_ALTUP 0x23d
563#define KEY_ALTLEFT 0x228
564#define KEY_ALTDOWN 0x214
565#define KEY_ALTRIGHT 0x237
566#elif defined(XTERM_GHOSTTY)
567#define KEY_ALTINS 0x228
568#define KEY_ALTHOME 0x223
569#define KEY_ALTPGUP 0x237
570#define KEY_ALTDEL 0x213
571#define KEY_ALTEND 0x21e
572#define KEY_ALTPGDN 0x232
573#define KEY_ALTUP 0x242
574#define KEY_ALTLEFT 0x22d
575#define KEY_ALTDOWN 0x219
576#define KEY_ALTRIGHT 0x23c
602
607
608
611
612
615
618
620
621
623
624
626
630
634
636
644
671#define to_uppercase(c)
672 if (c >= 'a' && c <= 'z')
675
676
677
678
679
680
681
682
683
684
685
686
687
779extern int a_toi(
char *,
bool *);
780extern bool chrep(
char *,
char,
char);
781extern char *
rep_substring(
const char *,
const char *,
const char *);
791extern bool str_subc(
char *,
char *,
char,
char *, uint);
792extern size_t
strnz(
char *, size_t);
793extern size_t
strnlf(
char *, size_t);
795extern size_t
ssnprintf(
char *, size_t,
const char *, ...);
796extern size_t
strnz__cpy(
char *,
const char *, size_t);
797extern size_t
strnz__cat(
char *,
const char *, size_t);
799extern size_t
string_cpy(String *,
const String *);
800extern size_t
string_cat(String *,
const String *);
801extern size_t
string_ncat(String *,
const String *, size_t);
802extern size_t
string_ncpy(String *,
const String *, size_t);
803extern size_t
trim(
char *);
804extern size_t
rtrim(
char *);
818extern int shell(
char *);
824extern void display_chyron(UiSurface *, uint n, Chyron *, uint, uint);
832extern void abend(
int,
char *);
835extern int answer_yn(
char *,
char *,
char *,
char *);
839extern unsigned long a_to_ul(
const char *);
847extern bool dir_name(
char *,
char *);
852extern bool trim_ext(
char *,
char *);
860extern char *
fdname(
int,
char *);
872extern void numeric(
char *d,
char *s);
873extern int cf_accept(UiSurface *, uint w,
char *, uint, uint, uint);
874extern char *
fill_field(
char *,
char *,
char, uint);
882extern void mbc_to_wc(wchar_t wc[2],
const char mbc);
int cmd_processor(Init *)
bool view_stack_peek(const ViewStack *, View *)
int popup_form(Init *, int, char **, uint, uint)
instantiate a form popup window
bool view_stack_push(ViewStack *, View)
int popup_menu(Init *, int, char **, uint, uint)
instantiate a menu popup window
void view_stack_free(ViewStack *)
bool view_stack_pop(ViewStack *, View *)
int popup_pick(Init *, int, char **, uint, uint)
instantiate a pick popup window
bool view_stack_init(ViewStack *, size_t)
void destroy_view_win(Init *)
int popup_view(Init *, int, char **, uint, uint, uint, uint)
instantiate a view 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)
uint rgb_to_curses_clr(RGB *)
bool strnfill(char *, char, uint)
void get_rfc3339_s(char *, size_t)
bool waitpid_with_timeout(pid_t, uint)
bool wait_destroy(Chyron *)
int bare_box_new(uint, uint, uint, uint, char *)
char stdio_names_str[4096]
int display_ok_message(char *)
bool verify_dir_q(char *, uint)
struct termios shell_tioctl curses_tioctl
void win_resize(uint, uint, char *)
bool construct_file_spec(char *, char *, char *, char *, char *, uint)
char * stdio_names(char *, char *)
String mk_string(size_t)
Create a String struct with a dynamically allocated string.
bool verify_file_q(char *, uint)
#define CHYRON_KEY_MAXLEN
void dump_opts_by_use(char *, char *)
Chyron * wait_mk_chyron()
uint rgb_clr_to_cube(uint)
#define min(x, y)
min macro evaluates two expressions, returning least result
bool f_have_curses_tioctl
int wccp_to_str(wchar_t, uint8_t *)
bool str_to_bool(const char *)
Converts String to boolean true or false.
int win2_box_new(uint, uint, uint, uint, char *)
#define __atexit
This macro registers the end_pgm function to be called when the program exits.
char * fill_field(char *, char *, char, uint)
struct termios shell_out_tioctl curses_out_tioctl
size_t codepoint_to_utf8(uint32_t codepoint, uint8_t *utf8)
char * stdio_fdnames(char *, char *)
int display_curses_keys()
void initialize_styles(SIO *)
void display_argv_error_msg(char *, char **)
struct termios shell_in_tioctl curses_in_tioctl
struct termios shell_err_tioctl curses_err_tioctl
int ui_cursor_move(UiSurface *s, uint w, uint y, uint x)
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)
int ui_curs_set(int visibility)
int cf_accept(UiSurface *sfc, uint w, char *accept_s, uint flin, uint fcol, uint flen)
Accepts input for a field in a C-Menu window.
bool f_erase_remainder
Structure to hold field information for C-Menu.
int process_config_file(char *, Init *)
uint rgb_to_xterm256_idx(RGB *rgb)
Convert RGB color to XTerm 256 color index.
int surface_box_win_new(uint wlines, uint wcols, uint wbegy, uint wbegx, char *wtitle)
char const colors_text[][10]
Color names for .minitrc overrides.
wchar_t * mbstr_to_wcstr(const char *mb_str)
void initialize_cells(SIO *sio)
Initialize local color variables and color pairs based on SIO settings.
int border_draw(UiSurface *sfc)
bool init_clr_palette(SIO *sio)
Initialize color palette based on SIO settings.
int surface_split_box_win_new(uint wlines, uint wcols, uint split_y, uint split_x, uint wbegy, uint wbegx, char *wtitle)
void mbc_to_wc(wchar_t wc[2], const char mbc)
void apply_gamma(RGB *rgb)
Apply gamma correction to RGB color.
RGB xterm256_idx_to_rgb(uint idx)
Convert XTerm 256 color index to RGB.
int assign_chyron_win(Chyron *chyron, UiSurface *sfc, uint win, char *y)
struct termios shell_tioctl
int border_ysplit(UiSurface *sfc, uint y)
Draw a box with a separator line around the specified window.
int border_ysplit_text(UiSurface *sfc, char *text, uint separator_line)
Draw a box with a separator line and text around the specified window.
void view_full_screen_resize(Init *)
Resize the full screen view and its components.
void view_boxwin_resize(Init *)
Resize the current window and its box.
int cm_surface_destroy(UiSurface *sfc)
Destroy the most recently created surface.
int border_title(UiSurface *sfc, char *title)
Draw a box with a title around the specified window.
void destroy_curses()
Gracefully shut down NCurses and restore terminal settings.
bool action_disposition(char *title, char *action_str)
Display a simple action disposition message window or print to stderr.
int answer_yn(char *msg0, char *msg1, char *msg2, char *msg3)
Accept a single letter answer.
int Perror(char *emsg_str)
Display a simple error message window or print to stderr.
void abend(int ec, char *s)
Abnormal program termination.
int display_error(char *msg0, char *msg1, char *msg2, char *msg3)
Display an error message window or print to stderr.
void set_chyron_key_cb(Chyron *chyron, uint k, char *s, uint kc, UiCell cell_base)
Set chyron key with color pair (cp).
Chyron * destroy_chyron(Chyron *chyron)
Destroy Chyron structure.
void compile_chyron(Chyron *chyron)
construct the chyron string from the chyron structure
int get_chyron_key(Chyron *chyron, uint x)
Get keycode from chyron.
void activate_all_chyron_keys(Chyron *chyron)
Deactivate chyron key.
void unset_chyron_key(Chyron *chyron, uint k)
Unset chyron key.
void activate_chyron_key(Chyron *chyron, uint k)
Activate chyron key.
void deactivate_all_chyron_keys(Chyron *chyron)
Deactivate all chyron keys.
Chyron * new_chyron()
Create and initialize Chyron structure.
bool is_set_chyron_key(Chyron *chyron, uint k)
Check if function key label is set.
void display_chyron(UiSurface *sfc, uint w, Chyron *chyron, uint line, uint col)
Display chyron on the specified line and column of the surface.
void deactivate_chyron_key(Chyron *chyron, uint k)
Deactivate chyron key.
void set_chyron_key(Chyron *chyron, uint k, char *s, uint kc)
Set chyron key with default color pair (cp_nt_rev).
int fork_exec(char **)
Fork and exec a command.
int shell(char *)
Execute a shell command.
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 fork_detach_execvp(char **eargv)
Fork, set new session ID, close files, and execute detached command.
bool is_valid_date(uint yyyy, uint mm, uint dd)
Check if a given date is valid, including leap years.
void numeric(char *d, char *s)
Extract numeric characters from source string to destination string.
bool is_valid_time(uint hh, uint mm, uint ss)
Check if a given time is valid.
void right_justify(char *, uint)
Right justify string by removing trailing spaces and adding leadingspaces.
void left_justify(char *s)
Left justify string by removing leading spaces.
int init_form(Init *, int, char **, uint, uint)
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
char * iso8601_time(char *, uint, time_t *, bool)
Formats a struct tm as an ISO 8601 string.
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 without 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.
bool is_hex_str(char *, uint)
Validates that a string consists of exactly len hexadecimal digits.
double str_to_double(char *)
converts string to double
bool str_to_lower(char *)
Converts a string to lowercase.
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 strip_quotes(char *)
removes leading and trailing double quotes if present
int str_to_args(char **, char *, uint)
Converts a string into an array of argument strings.
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.
bool expand_tilde(char *, uint)
Replaces "~/" in string with the user's home directory.
char * strnz_dup(char *, size_t)
Allocates memory for and duplicates string s up to length l or until line feed or carriage return.
bool file_spec_name(char *, char *)
extracts the file name component of a file specification
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 get_argp_doc_by_name(char *comment, const struct argp_option *, const char *)
Retrieves the documentation string for a given key name from an argp options array.
char * get_ip_addresses(char *, uint)
Retrieves the IP addresses of the local machine and formats them into a string.
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.
bool verify_file(char *, uint)
Verifies that the file specified by "in_spec" exists and is accessible with the permissions specified...
size_t strnlf(char *, size_t)
terminates string with line feed
void write_cmenu_log_ts(char *)
Write message to C-Menu log file with timestamp.
int a_toi(char *, bool *)
a safer alternative to atoi() for converting ASCII strings to integers.
bool str_subc(char *, char *, char, char *, uint)
Replaces "ReplaceChr" in "s" with "Withstr" in "d" won't copy more than "l" bytes to "d" Replaces all...
int destroy_argv(uint argc, char **argv)
Deallocates memory allocated for argument strings in argv.
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.
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.
bool is_newer(char *, char *)
Checks if the file specified by "fut" is newer than the file specified by "control".
char * fdname(int, char *)
Retrieves the file path associated with a given file descriptor.
bool verify_dir(char *, uint)
Verifies that the directory specified by "spec" exists and is accessible with the permissions specifi...
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,...
bool unstr_hex_clr(char *, char *)
Validates that a string is a hex color code in the format "#RRGGBB".
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 *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_boxwin_dimensions(Init *)
Calculate the dimensions and position of the box window for C-Menu View.
int init_view_full_screen(Init *init)
Initialize C-Menu View in full screen mode.
int init_view_boxwin(Init *init)
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(Init *init, char *file_name)
Initialize the input for the C-Menu View.
bool verify_spec_arg(char *, char *, char *, char *, uint)
Verify file specification argument.
Pick * new_pick(Init *init, int argc, char **argv, uint begy, uint begx)
Create and initialize Pick structure.
View * destroy_view(Init *init)
Destroy View structure.
Menu * new_menu(Init *init, int argc, char **argv, uint begy, uint begx)
Create and initialize Menu structure.
Init * new_init(int argc, char **argv)
Create and initialize Init structure.
Menu * destroy_menu(Init *init)
Destroy Menu structure.
Form * destroy_form(Init *init)
Destroy Form structure.
View * new_view(Init *init)
Create and initialize View structure.
Init * destroy_init(Init *init)
Destroy Init structure.
Form * new_form(Init *init, int argc, char **argv, uint begy, uint begx)
Create and initialize Form 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 **, uint, uint)
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.
int view_cmd_processor(Init *)
Main Command Processing Loop for View.
void build_prompt(View *)
Build Prompt String.
void initialize_line_table(View *)
Initialize Line Table.
void destroy_line_table(View *)
Destroy Line Table.
void next_page(View *)
Advance to Next Page.
int pad_refresh(View *)
Refresh Pad and Line Number Window.
int display_prompt(View *, char *)
Display Command Line Prompt.
char text[CHYRON_KEY_MAXLEN]
ChyronKey * key[CHYRON_KEYS]
char receiver_cmd[MAXLEN]
char provider_cmd[MAXLEN]