diff options
Diffstat (limited to 'nx-X11/programs/xterm/print.c')
-rw-r--r-- | nx-X11/programs/xterm/print.c | 608 |
1 files changed, 0 insertions, 608 deletions
diff --git a/nx-X11/programs/xterm/print.c b/nx-X11/programs/xterm/print.c deleted file mode 100644 index c081f8ff9..000000000 --- a/nx-X11/programs/xterm/print.c +++ /dev/null @@ -1,608 +0,0 @@ -/* $XTermId: print.c,v 1.63 2005/08/05 01:25:40 tom Exp $ */ - -/* - * $XFree86: xc/programs/xterm/print.c,v 1.22 2005/08/05 01:25:40 dickey Exp $ - */ - -/************************************************************ - -Copyright 1997-2004,2005 by Thomas E. Dickey - - All Rights Reserved - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be included -in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -Except as contained in this notice, the name(s) of the above copyright -holders shall not be used in advertising or otherwise to promote the -sale, use or other dealings in this Software without prior written -authorization. - -********************************************************/ - -#include <xterm.h> -#include <data.h> -#include <menu.h> -#include <error.h> - -#include <stdio.h> - -#undef CTRL -#define CTRL(c) ((c) & 0x1f) - -#define SHIFT_IN '\017' -#define SHIFT_OUT '\016' - -#define CSET_IN 'A' -#define CSET_OUT '0' - -#define isForm(c) ((c) == '\r' || (c) == '\n' || (c) == '\f') -#define Strlen(a) strlen((char *)a) -#define Strcmp(a,b) strcmp((char *)a,(char *)b) -#define Strncmp(a,b,c) strncmp((char *)a,(char *)b,c) - -#ifdef VMS -#define VMS_TEMP_PRINT_FILE "sys$scratch:xterm_print.txt" -#endif - -static void charToPrinter(int chr); -static void printLine(int row, int chr); -static void send_CharSet(int row); -static void send_SGR(unsigned attr, unsigned fg, unsigned bg); -static void stringToPrinter(char *str); - -static FILE *Printer; -static pid_t Printer_pid; -static int initialized; - -static void -closePrinter(void) -{ - if (xtermHasPrinter() != 0) { -#ifdef VMS - TScreen *screen = &term->screen; - - char pcommand[256]; - (void) sprintf(pcommand, "%s %s;", - screen->printer_command, - VMS_TEMP_PRINT_FILE); -#endif - - if (Printer != 0) { - fclose(Printer); - TRACE(("closed printer, waiting...\n")); -#ifdef VMS /* This is a quick hack, really should use - spawn and check status or system services - and go straight to the queue */ - (void) system(pcommand); -#else /* VMS */ - while (nonblocking_wait() > 0) -#endif /* VMS */ - ; - Printer = 0; - initialized = 0; - TRACE(("closed printer\n")); - } - } -} - -static void -printCursorLine(void) -{ - TScreen *screen = &term->screen; - - TRACE(("printCursorLine\n")); - printLine(screen->cur_row, '\n'); -} - -#define NO_COLOR ((unsigned)-1) - -/* - * DEC's manual doesn't document whether trailing blanks are removed, or what - * happens with a line that is entirely blank. This function prints the - * characters that xterm would allow as a selection (which may include blanks). - */ -static void -printLine(int row, int chr) -{ - TScreen *screen = &term->screen; - Char *c = SCRN_BUF_CHARS(screen, row); - Char *a = SCRN_BUF_ATTRS(screen, row); - Char attr = 0; - unsigned ch; - int last = MaxCols(screen); - int col; -#if OPT_ISO_COLORS && OPT_PRINT_COLORS -#if OPT_EXT_COLORS - Char *fbf = 0; - Char *fbb = 0; -#define ColorOf(col) (unsigned)((fbf[col] << 8) | fbb[col]) -#else - Char *fb = 0; -#define ColorOf(col) (fb[col]) -#endif -#endif - unsigned fg = NO_COLOR, last_fg = NO_COLOR; - unsigned bg = NO_COLOR, last_bg = NO_COLOR; - int cs = CSET_IN; - int last_cs = CSET_IN; - - TRACE(("printLine(row=%d, top=%d:%d, chr=%d):%s\n", - row, screen->topline, screen->max_row, chr, - visibleChars(PAIRED_CHARS(c, - screen->utf8_mode - ? SCRN_BUF_WIDEC(screen, row) - : 0), (unsigned) last))); - - if_OPT_EXT_COLORS(screen, { - fbf = SCRN_BUF_FGRND(screen, row); - fbb = SCRN_BUF_BGRND(screen, row); - }); - if_OPT_ISO_TRADITIONAL_COLORS(screen, { - fb = SCRN_BUF_COLOR(screen, row); - }); - while (last > 0) { - if ((a[last - 1] & CHARDRAWN) == 0) - last--; - else - break; - } - if (last) { - if (screen->print_attributes) { - send_CharSet(row); - send_SGR(0, NO_COLOR, NO_COLOR); - } - for (col = 0; col < last; col++) { - ch = c[col]; - if_OPT_WIDE_CHARS(screen, { - ch = getXtermCell(screen, row, col); - }); -#if OPT_PRINT_COLORS - if (screen->colorMode) { - if (screen->print_attributes > 1) { - fg = (a[col] & FG_COLOR) - ? extract_fg(ColorOf(col), a[col]) - : NO_COLOR; - bg = (a[col] & BG_COLOR) - ? extract_bg(ColorOf(col), a[col]) - : NO_COLOR; - } - } -#endif - if ((((a[col] & SGR_MASK) != attr) -#if OPT_PRINT_COLORS - || (last_fg != fg) || (last_bg != bg) -#endif - ) - && ch) { - attr = (a[col] & SGR_MASK); - last_fg = fg; - last_bg = bg; - if (screen->print_attributes) - send_SGR(attr, fg, bg); - } - - if (ch == 0) - ch = ' '; - -#if OPT_WIDE_CHARS - if (screen->utf8_mode) - cs = CSET_IN; - else -#endif - cs = (ch >= ' ' && ch != 0x7f) ? CSET_IN : CSET_OUT; - if (last_cs != cs) { - if (screen->print_attributes) { - charToPrinter((cs == CSET_OUT) - ? SHIFT_OUT - : SHIFT_IN); - } - last_cs = cs; - } - - /* FIXME: we shouldn't have to map back from the - * alternate character set, except that the - * corresponding charset information is not encoded - * into the CSETS array. - */ - charToPrinter((int) ((cs == CSET_OUT) - ? (ch == 0x7f ? 0x5f : (ch + 0x5f)) - : ch)); - } - if (screen->print_attributes) { - send_SGR(0, NO_COLOR, NO_COLOR); - if (cs != CSET_IN) - charToPrinter(SHIFT_IN); - } - } - if (screen->print_attributes) - charToPrinter('\r'); - charToPrinter(chr); -} - -void -xtermPrintScreen(Bool use_DECPEX) -{ - if (XtIsRealized((Widget) term)) { - TScreen *screen = &term->screen; - Bool extent = (use_DECPEX && screen->printer_extent); - int top = extent ? 0 : screen->top_marg; - int bot = extent ? screen->max_row : screen->bot_marg; - int was_open = initialized; - - TRACE(("xtermPrintScreen, rows %d..%d\n", top, bot)); - - while (top <= bot) - printLine(top++, '\n'); - if (screen->printer_formfeed) - charToPrinter('\f'); - - if (!was_open || screen->printer_autoclose) { - closePrinter(); - } - } else { - Bell(XkbBI_MinorError, 0); - } -} - -/* - * If the alternate screen is active, we'll print only that. Otherwise, print - * the normal screen plus all scrolled-back lines. The distinction is made - * because the normal screen's buffer is part of the overall scrollback buffer. - */ -static void -xtermPrintEverything(void) -{ - TScreen *screen = &term->screen; - int top = 0; - int bot = screen->max_row; - int was_open = initialized; - - if (!screen->altbuf) - top = -screen->savedlines; - - TRACE(("xtermPrintEverything, rows %d..%d\n", top, bot)); - while (top <= bot) - printLine(top++, '\n'); - if (screen->printer_formfeed) - charToPrinter('\f'); - - if (!was_open || screen->printer_autoclose) { - closePrinter(); - } -} - -static void -send_CharSet(int row) -{ -#if OPT_DEC_CHRSET - TScreen *screen = &term->screen; - char *msg = 0; - - switch (SCRN_BUF_CSETS(screen, row)[0]) { - case CSET_SWL: - msg = "\033#5"; - break; - case CSET_DHL_TOP: - msg = "\033#3"; - break; - case CSET_DHL_BOT: - msg = "\033#4"; - break; - case CSET_DWL: - msg = "\033#6"; - break; - } - if (msg != 0) - stringToPrinter(msg); -#endif /* OPT_DEC_CHRSET */ -} - -static void -send_SGR(unsigned attr, unsigned fg, unsigned bg) -{ - char msg[80]; - strcpy(msg, "\033[0"); - if (attr & BOLD) - strcat(msg, ";1"); - if (attr & UNDERLINE) - strcat(msg, ";4"); /* typo? DEC documents this as '2' */ - if (attr & BLINK) - strcat(msg, ";5"); - if (attr & INVERSE) /* typo? DEC documents this as invisible */ - strcat(msg, ";7"); -#if OPT_PRINT_COLORS - if (bg != NO_COLOR) { - sprintf(msg + strlen(msg), ";%u", (bg < 8) ? (40 + bg) : (92 + bg)); - } - if (fg != NO_COLOR) { -#if OPT_PC_COLORS - if (term->screen.boldColors - && fg > 8 - && (attr & BOLD) != 0) - fg -= 8; -#endif - sprintf(msg + strlen(msg), ";%u", (fg < 8) ? (30 + fg) : (82 + fg)); - } -#endif - strcat(msg, "m"); - stringToPrinter(msg); -} - -/* - * This implementation only knows how to write to a pipe. - */ -static void -charToPrinter(int chr) -{ - TScreen *screen = &term->screen; - - if (!initialized && xtermHasPrinter()) { -#if defined(VMS) - /* - * This implementation only knows how to write to a file. When the - * file is closed the print command executes. Print command must be of - * the form: - * print/que=name/delete [/otherflags]. - */ - Printer = fopen(VMS_TEMP_PRINT_FILE, "w"); -#else - /* - * This implementation only knows how to write to a pipe. - */ - FILE *input; - int my_pipe[2]; - int c; - - if (pipe(my_pipe)) - SysError(ERROR_FORK); - if ((Printer_pid = fork()) < 0) - SysError(ERROR_FORK); - - if (Printer_pid == 0) { - TRACE(((char *) 0)); - close(my_pipe[1]); /* printer is silent */ - close(screen->respond); - - close(fileno(stdout)); - dup2(fileno(stderr), 1); - - if (fileno(stderr) != 2) { - dup2(fileno(stderr), 2); - close(fileno(stderr)); - } - /* don't want privileges! */ - if (setgid(screen->gid) == -1) - exit(2); - if (setuid(screen->uid) == -1) - exit(2); - - Printer = popen(screen->printer_command, "w"); - input = fdopen(my_pipe[0], "r"); - while ((c = fgetc(input)) != EOF) { - fputc(c, Printer); - if (isForm(c)) - fflush(Printer); - } - pclose(Printer); - exit(0); - } else { - close(my_pipe[0]); /* won't read from printer */ - Printer = fdopen(my_pipe[1], "w"); - TRACE(("opened printer from pid %d/%d\n", - (int) getpid(), Printer_pid)); - } -#endif - initialized++; - } - if (Printer != 0) { -#if OPT_WIDE_CHARS - if (chr > 127) { - Char temp[10]; - *convertToUTF8(temp, (unsigned) chr) = 0; - fputs((char *) temp, Printer); - } else -#endif - fputc(chr, Printer); - if (isForm(chr)) - fflush(Printer); - } -} - -static void -stringToPrinter(char *str) -{ - while (*str) - charToPrinter(*str++); -} - -/* - * This module implements the MC (Media Copy) and related printing control - * sequences for VTxxx emulation. This is based on the description in the - * VT330/VT340 Programmer Reference Manual EK-VT3XX-TP-001 (Digital Equipment - * Corp., March 1987). - */ -void -xtermMediaControl(int param, int private_seq) -{ - TRACE(("MediaCopy param=%d, private=%d\n", param, private_seq)); - - if (private_seq) { - switch (param) { - case 1: - printCursorLine(); - break; - case 4: - setPrinterControlMode(0); - break; - case 5: - setPrinterControlMode(1); - break; - case 10: /* VT320 */ - xtermPrintScreen(False); - break; - case 11: /* VT320 */ - xtermPrintEverything(); - break; - } - } else { - switch (param) { - case -1: - case 0: - xtermPrintScreen(True); - break; - case 4: - setPrinterControlMode(0); - break; - case 5: - setPrinterControlMode(2); - break; - } - } -} - -/* - * When in autoprint mode, the printer prints a line from the screen when you - * move the cursor off that line with an LF, FF, or VT character, or an - * autowrap occurs. The printed line ends with a CR and the character (LF, FF - * or VT) that moved the cursor off the previous line. - */ -void -xtermAutoPrint(int chr) -{ - TScreen *screen = &term->screen; - - if (screen->printer_controlmode == 1) { - TRACE(("AutoPrint %d\n", chr)); - printLine(screen->cursor_row, chr); - if (Printer != 0) - fflush(Printer); - } -} - -/* - * When in printer controller mode, the terminal sends received characters to - * the printer without displaying them on the screen. The terminal sends all - * characters and control sequences to the printer, except NUL, XON, XOFF, and - * the printer controller sequences. - * - * This function eats characters, returning 0 as long as it must buffer or - * divert to the printer. We're only invoked here when in printer controller - * mode, and handle the exit from that mode. - */ -#define LB '[' - -int -xtermPrinterControl(int chr) -{ - TScreen *screen = &term->screen; - /* *INDENT-OFF* */ - static struct { - Char seq[5]; - int active; - } tbl[] = { - { { CSI, '5', 'i' }, 2 }, - { { CSI, '4', 'i' }, 0 }, - { { ESC, LB, '5', 'i' }, 2 }, - { { ESC, LB, '4', 'i' }, 0 }, - }; - /* *INDENT-ON* */ - - static Char bfr[10]; - static size_t length; - size_t n; - - TRACE(("In printer:%04X\n", chr)); - - switch (chr) { - case 0: - case CTRL('Q'): - case CTRL('S'): - return 0; /* ignored by application */ - - case CSI: - case ESC: - case '[': - case '4': - case '5': - case 'i': - bfr[length++] = chr; - for (n = 0; n < sizeof(tbl) / sizeof(tbl[0]); n++) { - size_t len = Strlen(tbl[n].seq); - - if (length == len - && Strcmp(bfr, tbl[n].seq) == 0) { - setPrinterControlMode(tbl[n].active); - if (screen->printer_autoclose - && screen->printer_controlmode == 0) - closePrinter(); - length = 0; - return 0; - } else if (len > length - && Strncmp(bfr, tbl[n].seq, length) == 0) { - return 0; - } - } - length--; - - /* FALLTHRU */ - - default: - for (n = 0; n < length; n++) - charToPrinter(bfr[n]); - bfr[0] = chr; - length = 1; - return 0; - } -} - -/* - * If there is no printer command, we will ignore printer controls. - */ -Bool -xtermHasPrinter(void) -{ - TScreen *screen = &term->screen; - - return (strlen(screen->printer_command) != 0); -} - -#define showPrinterControlMode(mode) \ - (((mode) == 0) \ - ? "normal" \ - : ((mode) == 1 \ - ? "autoprint" \ - : "printer controller")) - -void -setPrinterControlMode(int mode) -{ - if (xtermHasPrinter() - && term->screen.printer_controlmode != mode) { - TRACE(("%s %s mode\n", - (mode - ? "set" - : "reset"), - (mode - ? showPrinterControlMode(mode) - : showPrinterControlMode(term->screen.printer_controlmode)))); - term->screen.printer_controlmode = mode; - update_print_redir(); - } -} |