diff options
Diffstat (limited to 'misc/mc/files/patch-src-cons.handler.c')
-rw-r--r-- | misc/mc/files/patch-src-cons.handler.c | 725 |
1 files changed, 725 insertions, 0 deletions
diff --git a/misc/mc/files/patch-src-cons.handler.c b/misc/mc/files/patch-src-cons.handler.c new file mode 100644 index 000000000000..ae2e1b659a59 --- /dev/null +++ b/misc/mc/files/patch-src-cons.handler.c @@ -0,0 +1,725 @@ +--- src/cons.handler.c.orig Mon Sep 23 13:43:23 2002 ++++ src/cons.handler.c Tue Jun 15 03:14:17 2004 +@@ -15,8 +15,6 @@ + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +-/* The cons saver can't have a pid of 1, used to prevent bunches of */ +-/*#ifdef linux */ + #include <config.h> + + #ifdef HAVE_UNISTD_H +@@ -24,6 +22,21 @@ + #endif + #include <sys/types.h> + #include <signal.h> ++#include <stdio.h> ++ ++#ifdef SCO_FLAVOR ++#include <sys/types.h> ++#include <sys/vid.h> ++#include <sys/console.h> ++#include <sys/vtkd.h> ++#include <memory.h> ++#include <signal.h> ++#endif /* SCO_FLAVOR */ ++ ++#ifdef __FreeBSD__ ++#include <sys/consio.h> ++#include <sys/ioctl.h> ++#endif /* __FreeBSD__ */ + + #include "global.h" + #include "tty.h" +@@ -31,30 +44,28 @@ + + signed char console_flag = 0; + +-#if defined(linux) || defined(__linux__) +-#include "main.h" ++#ifdef __linux__ ++ ++/* The cons saver can't have a pid of 1, used to prevent bunches of ++ * #ifdef linux */ + +-int cons_saver_pid = 1; +-static int pipefd1 [2] = {-1, -1}, pipefd2 [2] = {-1, -1}; ++int cons_saver_pid = 1; ++static int pipefd1[2] = { -1, -1 }; ++static int pipefd2[2] = { -1, -1 }; + +-void show_console_contents (int starty, unsigned char begin_line, unsigned char end_line) ++static void ++show_console_contents_linux (int starty, unsigned char begin_line, ++ unsigned char end_line) + { + unsigned char message = 0; + unsigned short bytes = 0; + int i; + +- standend (); +- +- if (look_for_rxvt_extensions ()) { +- show_rxvt_contents (starty, begin_line, end_line); +- return; +- } +- + /* Is tty console? */ + if (!console_flag) + return; + /* Paranoid: Is the cons.saver still running? */ +- if (cons_saver_pid < 1 || kill (cons_saver_pid, SIGCONT)){ ++ if (cons_saver_pid < 1 || kill (cons_saver_pid, SIGCONT)) { + cons_saver_pid = 0; + console_flag = 0; + return; +@@ -75,9 +86,9 @@ + read (pipefd2[0], &bytes, 2); + + /* Read the bytes and output them */ +- for (i = 0; i < bytes; i++){ ++ for (i = 0; i < bytes; i++) { + if ((i % COLS) == 0) +- move (starty+(i/COLS), 0); ++ move (starty + (i / COLS), 0); + read (pipefd2[0], &message, 1); + addch (message); + } +@@ -86,16 +97,15 @@ + read (pipefd2[0], &message, 1); + } + +-void handle_console (unsigned char action) ++static void ++handle_console_linux (unsigned char action) + { + char *tty_name; + char *mc_conssaver; + int status; + +- switch (action){ ++ switch (action) { + case CONSOLE_INIT: +- if (look_for_rxvt_extensions ()) +- return; + /* Close old pipe ends in case it is the 2nd time we run cons.saver */ + close (pipefd1[1]); + close (pipefd2[0]); +@@ -104,7 +114,7 @@ + pipe (pipefd2); + /* Get the console saver running */ + cons_saver_pid = fork (); +- if (cons_saver_pid < 0){ ++ if (cons_saver_pid < 0) { + /* Cannot fork */ + /* Delete pipes */ + close (pipefd1[1]); +@@ -112,14 +122,14 @@ + close (pipefd2[1]); + close (pipefd2[0]); + console_flag = 0; +- } else if (cons_saver_pid > 0){ ++ } else if (cons_saver_pid > 0) { + /* Parent */ + /* Close the extra pipe ends */ + close (pipefd1[0]); + close (pipefd2[1]); + /* Was the child successful? */ + read (pipefd2[0], &console_flag, 1); +- if (!console_flag){ ++ if (!console_flag) { + close (pipefd1[1]); + close (pipefd2[0]); + waitpid (cons_saver_pid, &status, 0); +@@ -152,33 +162,31 @@ + close (1); + close (0); + _exit (3); +- } /* if (cons_saver_pid ...) */ ++ } /* if (cons_saver_pid ...) */ + break; + + case CONSOLE_DONE: + case CONSOLE_SAVE: + case CONSOLE_RESTORE: +- if (look_for_rxvt_extensions ()) +- return; + /* Is tty console? */ + if (!console_flag) + return; + /* Paranoid: Is the cons.saver still running? */ +- if (cons_saver_pid < 1 || kill (cons_saver_pid, SIGCONT)){ ++ if (cons_saver_pid < 1 || kill (cons_saver_pid, SIGCONT)) { + cons_saver_pid = 0; + console_flag = 0; + return; + } + /* Send command to the console handler */ + write (pipefd1[1], &action, 1); +- if (action != CONSOLE_DONE){ ++ if (action != CONSOLE_DONE) { + /* Wait the console handler to do its job */ + read (pipefd2[0], &console_flag, 1); + } +- if (action == CONSOLE_DONE || !console_flag){ ++ if (action == CONSOLE_DONE || !console_flag) { + /* We are done -> Let's clean up */ +- close (pipefd1 [1]); +- close (pipefd2 [0]); ++ close (pipefd1[1]); ++ close (pipefd2[0]); + waitpid (cons_saver_pid, &status, 0); + console_flag = 0; + } +@@ -186,221 +194,371 @@ + } + } + +-#endif /* #ifdef linux */ ++#elif defined(SCO_FLAVOR) + +-#ifdef SCO_FLAVOR + /* + ** SCO console save/restore handling routines + ** Copyright (C) 1997 Alex Tkachenko <alex@bcs.zaporizhzhe.ua> + */ + +-#include <stdio.h> +-#include <sys/types.h> +-#include <sys/vid.h> +-#include <sys/console.h> +-#include <sys/vtkd.h> +-#include <memory.h> +-#include <signal.h> +-#include "tty.h" +-#include "util.h" + #include "color.h" +-#include "cons.saver.h" + + static int FD_OUT = 2; + +-static unsigned short* vidbuf = NULL; +-static unsigned short* screen = NULL; ++static unsigned short *vidbuf = NULL; ++static unsigned short *screen = NULL; + static int height = 0, width = 0, saved_attr = 0; + static int mode = 0; + +-#define SIG_ACQUIRE 21 /* originally: handset, line status change (?) */ ++#define SIG_ACQUIRE 21 /* originally: handset, line status change (?) */ + + static int +-vt_active() ++vt_active () ++{ ++ struct vid_info vi; ++ int adapter = ioctl (FD_OUT, CONS_CURRENT, 0); ++ ++ vi.size = sizeof (struct vid_info); ++ ioctl (FD_OUT, CONS_GETINFO, &(vi)); ++ return (vi.m_num == ioctl (FD_OUT, CONSADP, adapter)); ++} ++ ++static void ++console_acquire_vt () + { +- struct vid_info vi; +- int adapter = ioctl(FD_OUT, CONS_CURRENT, 0); ++ struct vt_mode smode; + +- vi.size = sizeof(struct vid_info); +- ioctl(FD_OUT, CONS_GETINFO, &(vi)); +- return (vi.m_num == ioctl(FD_OUT,CONSADP,adapter)); ++ signal (SIG_ACQUIRE, SIG_DFL); ++ smode.mode = VT_AUTO; ++ smode.waitv = smode.relsig = smode.acqsig = smode.frsig = 0; ++ ioctl (FD_OUT, VT_SETMODE, &smode); ++ ioctl (FD_OUT, VT_RELDISP, VT_ACKACQ); ++} ++ ++static void ++console_shutdown () ++{ ++ if (!console_flag) { ++ return; ++ } ++ if (screen != NULL) { ++ g_free (screen); ++ } ++ console_flag = 0; + } + + static void +-console_acquire_vt() ++console_save () + { ++ struct m6845_info mi; ++ ++ if (!console_flag) { ++ return; ++ } ++ ++ if (!vt_active ()) { + struct vt_mode smode; + +- signal(SIG_ACQUIRE, SIG_DFL); +- smode.mode = VT_AUTO; +- smode.waitv = smode.relsig = smode.acqsig = smode.frsig = 0; +- ioctl(FD_OUT, VT_SETMODE, &smode); +- ioctl(FD_OUT, VT_RELDISP, VT_ACKACQ); ++ /* ++ ** User switched out of our vt. Let's wait until we get SIG_ACQUIRE, ++ ** otherwise we could save wrong screen image ++ */ ++ signal (SIG_ACQUIRE, console_acquire_vt); ++ smode.mode = VT_PROCESS; ++ smode.waitv = 0; ++ smode.waitv = smode.relsig = smode.acqsig = smode.frsig = ++ SIG_ACQUIRE; ++ ioctl (FD_OUT, VT_SETMODE, &smode); ++ ++ pause (); ++ } ++ ++ saved_attr = ioctl (FD_OUT, GIO_ATTR, 0); ++ ++ vidbuf = (unsigned short *) ioctl (FD_OUT, MAPCONS, 0); ++ ++ mi.size = sizeof (struct m6845_info); ++ ioctl (FD_OUT, CONS_6845INFO, &mi); ++ ++ { ++ unsigned short *start = vidbuf + mi.screen_top; ++ memcpy (screen, start, width * height * 2); ++ } ++ ++ write (FD_OUT, "\0337", 2); /* save cursor position */ + } + + static void +-console_shutdown() ++console_restore () + { +- if (!console_flag) +- { +- return; +- } +- if (screen != NULL) +- { +- g_free (screen); +- } +- console_flag = 0; ++ struct m6845_info mi; ++ unsigned short *start; ++ ++ if (!console_flag) { ++ return; ++ } ++ ++ write (FD_OUT, "\033[2J", 4); ++ ++ mi.size = sizeof (struct m6845_info); ++ ioctl (FD_OUT, CONS_6845INFO, &mi); ++ ++ start = vidbuf + mi.screen_top; ++ memcpy (start, screen, width * height * 2); ++ write (FD_OUT, "\0338", 2); /* restore cursor position */ + } + + static void +-console_save() ++console_init () + { +- struct m6845_info mi; ++ struct vid_info vi; ++ int adapter = ioctl (FD_OUT, CONS_CURRENT, 0); + +- if (!console_flag) +- { ++ console_flag = 0; ++ ++ if (adapter != -1) { ++ vi.size = sizeof (struct vid_info); ++ ioctl (FD_OUT, CONS_GETINFO, &(vi)); ++ ++ if (vt_active ()) { ++ console_flag = 1; ++ ++ height = vi.mv_rsz; ++ width = vi.mv_csz; ++ ++ screen = (unsigned short *) g_malloc (height * width * 2); ++ if (screen == NULL) { ++ console_shutdown (); + return; ++ } ++ console_save (); ++ mode = ioctl (FD_OUT, CONS_GET, 0); ++ ioctl (FD_OUT, MODESWITCH | mode, 0); ++ console_restore (); + } ++ } ++} + +- if (!vt_active()) +- { +- struct vt_mode smode; +- +- /* +- ** User switched out of our vt. Let's wait until we get SIG_ACQUIRE, +- ** otherwise we could save wrong screen image +- */ +- signal(SIG_ACQUIRE, console_acquire_vt); +- smode.mode = VT_PROCESS; +- smode.waitv = 0; +- smode.waitv = smode.relsig = smode.acqsig = smode.frsig = SIG_ACQUIRE; +- ioctl(FD_OUT, VT_SETMODE, &smode); ++static void ++handle_console_sco (unsigned char action) ++{ ++ switch (action) { ++ case CONSOLE_INIT: ++ console_init (); ++ break; + +- pause(); +- } ++ case CONSOLE_DONE: ++ console_shutdown (); ++ break; ++ ++ case CONSOLE_SAVE: ++ console_save (); ++ break; ++ ++ case CONSOLE_RESTORE: ++ console_restore (); ++ break; ++ default: ++ /* Nothing */ ; ++ } ++} + +- saved_attr = ioctl(FD_OUT, GIO_ATTR, 0); ++static void ++show_console_contents_sco (int starty, unsigned char begin_line, ++ unsigned char end_line) ++{ ++ register int i, len = (end_line - begin_line) * width; + +- vidbuf = (unsigned short*) ioctl(FD_OUT, MAPCONS, 0); ++ attrset (DEFAULT_COLOR); ++ for (i = 0; i < len; i++) { ++ if ((i % width) == 0) ++ move (starty + (i / width), 0); ++ addch ((unsigned char) screen[width * starty + i]); ++ } ++} + +- mi.size = sizeof(struct m6845_info); +- ioctl(FD_OUT, CONS_6845INFO, &mi); ++#elif defined(__FreeBSD__) + +- { +- unsigned short* start = vidbuf + mi.screen_top; +- memcpy(screen, start, width * height * 2); +- } ++/* ++ * FreeBSD support copyright (C) 2003 Alexander Serkov <serkov@ukrpost.net>. ++ * Support for screenmaps by Max Khon <fjoe@FreeBSD.org> ++ */ ++ ++#define FD_OUT 1 ++ ++static struct scrshot screen_shot; ++static struct vid_info screen_info; + +- write(FD_OUT,"\0337",2); /* save cursor position */ ++static void ++console_init (void) ++{ ++ if (console_flag) ++ return; ++ ++ screen_info.size = sizeof (screen_info); ++ if (ioctl (FD_OUT, CONS_GETINFO, &screen_info) == -1) ++ return; ++ ++ memset (&screen_shot, 0, sizeof (screen_shot)); ++ screen_shot.xsize = screen_info.mv_csz; ++ screen_shot.ysize = screen_info.mv_rsz; ++ if ((screen_shot.buf = ++ g_malloc (screen_info.mv_csz * screen_info.mv_rsz * 2)) == NULL) ++ return; ++ ++ console_flag = 1; + } + + static void +-console_restore() ++set_attr (unsigned attr) + { +- struct m6845_info mi; +- unsigned short* start; ++ /* ++ * Convert color indices returned by SCRSHOT (red=4, green=2, blue=1) ++ * to indices for ANSI sequences (red=1, green=2, blue=4). ++ */ ++ static const int color_map[8] = { 0, 4, 2, 6, 1, 5, 3, 7 }; ++ char cmd[17]; ++ int bc, tc; ++ ++ tc = attr & 0xF; ++ bc = (attr >> 4) & 0xF; ++ ++ strcpy (cmd, "\x1B["); ++ strcat (cmd, (bc & 8) ? "5;" : "25;"); ++ strcat (cmd, (tc & 8) ? "1;" : "22;"); ++ strcat (cmd, "3%d;4%dm"); ++ printf (cmd, color_map[tc & 7], color_map[bc & 7]); ++} ++ ++#define cursor_to(x, y) do { \ ++ printf("\x1B[%d;%df", (y) + 1, (x) + 1); \ ++ fflush(stdout); \ ++} while (0) + +- if (!console_flag) +- { +- return; +- } ++static void ++console_restore (void) ++{ ++ int i, last; + +- write (FD_OUT, "\033[2J", 4); ++ if (!console_flag) ++ return; + +- mi.size = sizeof(struct m6845_info); +- ioctl(FD_OUT, CONS_6845INFO, &mi); ++ cursor_to (0, 0); + +- start = vidbuf + mi.screen_top; +- memcpy(start, screen, width * height * 2); +- write(FD_OUT,"\0338",2); /* restore cursor position */ ++ /* restoring all content up to cursor position */ ++ last = screen_info.mv_row * screen_info.mv_csz + screen_info.mv_col; ++ for (i = 0; i < last; ++i) { ++ set_attr ((screen_shot.buf[i] >> 8) & 0xFF); ++ putc (screen_shot.buf[i] & 0xFF, stdout); ++ } ++ ++ /* restoring cursor color */ ++ set_attr ((screen_shot.buf[last] >> 8) & 0xFF); ++ ++ fflush (stdout); + } + + static void +-console_init() ++console_shutdown (void) + { +- struct vid_info vi; +- int adapter = ioctl(FD_OUT, CONS_CURRENT, 0); ++ if (!console_flag) ++ return; + +- console_flag = 0; ++ g_free (screen_shot.buf); + +- if (adapter != -1) +- { +- vi.size = sizeof(struct vid_info); +- ioctl(FD_OUT, CONS_GETINFO, &(vi)); +- +- if (vt_active()) +- { +- console_flag = 1; +- +- height = vi.mv_rsz; +- width = vi.mv_csz; +- +- screen = (unsigned short*) g_malloc (height * width * 2); +- if (screen == NULL) +- { +- console_shutdown(); +- return; +- } +- console_save(); +- mode = ioctl(FD_OUT, CONS_GET, 0); +- ioctl(FD_OUT, MODESWITCH | mode, 0); +- console_restore(); +- } +- } ++ console_flag = 0; + } + +-void +-handle_console (unsigned char action) ++static void ++console_save (void) + { +- if (look_for_rxvt_extensions ()) +- return; +- switch (action){ +- case CONSOLE_INIT: +- console_init(); +- break; +- +- case CONSOLE_DONE: +- console_shutdown(); +- break; +- +- case CONSOLE_SAVE: +- console_save(); +- break; +- +- case CONSOLE_RESTORE: +- console_restore(); +- break; +- default: +- /* Nothing */; ++ int i; ++ scrmap_t map; ++ scrmap_t revmap; ++ ++ if (!console_flag) ++ return; ++ ++ /* screen_info.size is already set in console_init() */ ++ if (ioctl (FD_OUT, CONS_GETINFO, &screen_info) == -1) { ++ console_shutdown (); ++ return; ++ } ++ ++ /* handle console resize */ ++ if (screen_info.mv_csz != screen_shot.xsize ++ || screen_info.mv_rsz != screen_shot.ysize) { ++ console_shutdown (); ++ console_init (); ++ } ++ ++ if (ioctl (FD_OUT, CONS_SCRSHOT, &screen_shot) == -1) { ++ console_shutdown (); ++ return; ++ } ++ ++ if (ioctl (FD_OUT, GIO_SCRNMAP, &map) == -1) { ++ console_shutdown (); ++ return; ++ } ++ ++ for (i = 0; i < 256; i++) { ++ char *p = memchr (map.scrmap, i, 256); ++ revmap.scrmap[i] = p ? p - map.scrmap : i; ++ } ++ ++ for (i = 0; i < screen_shot.xsize * screen_shot.ysize; i++) { ++ screen_shot.buf[i] = ++ (screen_shot.buf[i] & 0xff00) | (unsigned char) revmap. ++ scrmap[screen_shot.buf[i] & 0xff]; + } + } + +-void +-show_console_contents (int starty, unsigned char begin_line, unsigned char end_line) ++static void ++show_console_contents_freebsd (int starty, unsigned char begin_line, ++ unsigned char end_line) + { +- register int i, len = (end_line - begin_line) * width; ++ int col, line; ++ char c; + +- if (look_for_rxvt_extensions ()) { +- show_rxvt_contents (starty, begin_line, end_line); +- return; +- } +- attrset(DEFAULT_COLOR); +- for (i = 0; i < len; i++) +- { +- if ((i % width) == 0) +- move (starty+(i/width), 0); +- addch ((unsigned char)screen[width*starty + i]); ++ if (!console_flag) ++ return; ++ ++ for (line = begin_line; line <= end_line; line++) { ++ move (starty + line - begin_line, 0); ++ for (col = 0; col < min (COLS, screen_info.mv_csz); col++) { ++ c = screen_shot.buf[line * screen_info.mv_csz + col] & 0xFF; ++ addch (c); + } ++ } + } + +-#endif /* SCO_FLAVOR */ ++static void ++handle_console_freebsd (unsigned char action) ++{ ++ switch (action) { ++ case CONSOLE_INIT: ++ console_init (); ++ break; + ++ case CONSOLE_DONE: ++ console_shutdown (); ++ break; + +-#if !defined(linux) && !defined(__linux__) && !defined(SCO_FLAVOR) ++ case CONSOLE_SAVE: ++ console_save (); ++ break; + +-#include "tty.h" ++ case CONSOLE_RESTORE: ++ console_restore (); ++ break; ++ } ++} ++#endif /* __FreeBSD__ */ + +-void show_console_contents (int starty, unsigned char begin_line, unsigned char end_line) ++void ++show_console_contents (int starty, unsigned char begin_line, ++ unsigned char end_line) + { + standend (); + +@@ -408,14 +566,28 @@ + show_rxvt_contents (starty, begin_line, end_line); + return; + } ++#ifdef __linux__ ++ show_console_contents_linux (starty, begin_line, end_line); ++#elif defined (__FreeBSD__) ++ show_console_contents_freebsd (starty, begin_line, end_line); ++#elif defined (SCO_FLAVOR) ++ show_console_contents_sco (starty, begin_line, end_line); ++#else + console_flag = 0; ++#endif + } + +-void handle_console (unsigned char action) ++void ++handle_console (unsigned char action) + { +- look_for_rxvt_extensions (); +-} +- +-#endif /* !defined(linux) && !defined(__linux__) && !defined(SCO_FLAVOR) */ +- ++ if (look_for_rxvt_extensions ()) ++ return; + ++#ifdef __linux__ ++ handle_console_linux (action); ++#elif defined (__FreeBSD__) ++ handle_console_freebsd (action); ++#elif defined (SCO_FLAVOR) ++ handle_console_sco (action); ++#endif ++} |