|
|
@@ -21,7 +21,7 @@ char * curses_screen = NULL; |
|
|
|
|
|
|
|
char curses_format [CURSES_LENGTH + 1] = "\033[-;3-m-\033[0m"; |
|
|
|
|
|
|
|
void (* curses_action ['~' - ' ' + 1]) (void) = { 0 }; |
|
|
|
void (* curses_action [SIGNAL_COUNT]) (void) = { 0 }; |
|
|
|
|
|
|
|
struct termios curses_old_terminal; |
|
|
|
struct termios curses_new_terminal; |
|
|
@@ -29,7 +29,8 @@ struct termios curses_new_terminal; |
|
|
|
void curses_initialize (void) { |
|
|
|
struct winsize screen_dimension; |
|
|
|
|
|
|
|
char i = 0; |
|
|
|
char signal = 0; |
|
|
|
char offset = 0; |
|
|
|
|
|
|
|
fatal_failure (ioctl (STDOUT_FILENO, TIOCGWINSZ, & screen_dimension) == -1, "ioctl: Failed to get terminal dimensions."); |
|
|
|
|
|
|
@@ -52,16 +53,16 @@ void curses_initialize (void) { |
|
|
|
|
|
|
|
curses_screen = allocate (CURSES_OFFSET + CURSES_LENGTH * curses_screen_width * curses_screen_height + (curses_screen_height - 1) * CURSES_RETURN + 1); |
|
|
|
|
|
|
|
for (i = ' '; i != '~'; ++i) { |
|
|
|
curses_unbind ((char) i); |
|
|
|
for (signal = SIGNAL_NONE; signal != SIGNAL_COUNT; ++signal) { |
|
|
|
curses_unbind ((char) signal); |
|
|
|
} |
|
|
|
|
|
|
|
terminal_clear (); |
|
|
|
|
|
|
|
curses_screen_offset (); |
|
|
|
|
|
|
|
for (i = 0; i != curses_screen_height - 1; ++i) { |
|
|
|
string_copy_limit (& curses_screen [CURSES_LENGTH * curses_screen_width * i + CURSES_OFFSET], "\r\n", string_length ("\r\n")); |
|
|
|
for (offset = 0; offset != curses_screen_height - 1; ++offset) { |
|
|
|
string_copy (& curses_screen [CURSES_LENGTH * curses_screen_width * offset + CURSES_OFFSET], "\r\n"); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
@@ -78,19 +79,32 @@ void curses_synchronize (void) { |
|
|
|
/* |
|
|
|
out (curses_screen, curses_screen_size); |
|
|
|
*/ |
|
|
|
out (curses_screen, CURSES_OFFSET + CURSES_LENGTH * curses_screen_width * curses_screen_height); |
|
|
|
out (curses_screen, CURSES_OFFSET + CURSES_LENGTH * curses_screen_width * curses_screen_height/* + curses_screen_height * CURSES_RETURN*/); |
|
|
|
|
|
|
|
in (& curses_signal, 1); |
|
|
|
|
|
|
|
if ((curses_signal >= ' ') && (curses_signal <= '~')) { |
|
|
|
curses_action [curses_signal - ' '] (); |
|
|
|
switch (curses_signal) { |
|
|
|
case '0': curses_signal = SIGNAL_0; break; |
|
|
|
case 'Q': curses_signal = SIGNAL_Q | SIGNAL_SHIFT; break; |
|
|
|
case 'q': curses_signal = SIGNAL_Q; break; |
|
|
|
default: curses_signal = SIGNAL_NONE; break; |
|
|
|
} |
|
|
|
|
|
|
|
if ((curses_signal > SIGNAL_ANY) && (curses_signal < SIGNAL_COUNT)) { |
|
|
|
curses_action [curses_signal] (); |
|
|
|
} |
|
|
|
|
|
|
|
curses_screen_offset (); |
|
|
|
} |
|
|
|
|
|
|
|
void curses_configure (void) { |
|
|
|
atexit (curses_deinitialize); |
|
|
|
|
|
|
|
curses_initialize (); |
|
|
|
} |
|
|
|
|
|
|
|
void curses_screen_offset (void) { |
|
|
|
string_copy_limit (& curses_screen [0], "\033[H", CURSES_OFFSET); |
|
|
|
string_copy (& curses_screen [0], "\033[H"); |
|
|
|
curses_screen_size = CURSES_OFFSET; |
|
|
|
} |
|
|
|
|
|
|
@@ -173,12 +187,12 @@ void curses_blank (void) { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
void curses_bind (char key, void (* action) (void)) { |
|
|
|
curses_action [key - ' '] = action; |
|
|
|
void curses_bind (int signal, void (* action) (void)) { |
|
|
|
curses_action [signal] = action; |
|
|
|
} |
|
|
|
|
|
|
|
void curses_unbind (char key) { |
|
|
|
curses_action [key - ' '] = curses_idle; |
|
|
|
void curses_unbind (int signal) { |
|
|
|
curses_action [signal] = curses_idle; |
|
|
|
} |
|
|
|
|
|
|
|
void curses_idle (void) { |
|
|
|