void disable_mouse(void) { int h = get_output_handle(); /* XXX: Is this all right? -- Miciah */ if (!mouse_enabled) return; unhandle_mouse(ditrm->mouse_h); if (is_xterm()) send_mouse_done_sequence(h); mouse_enabled = 0; }
unsigned char *init_graphics(unsigned char *driver, unsigned char *param, unsigned char *display) { unsigned char *s = init_str(); int l = 0; struct graphics_driver **gd; #if defined(GRDRV_PMSHELL) && defined(GRDRV_X) if (is_xterm()) { static unsigned char swapped = 0; if (!swapped) { for (gd = graphics_drivers; *gd; gd++) { if (*gd == &pmshell_driver) *gd = &x_driver; else if (*gd == &x_driver) *gd = &pmshell_driver; } swapped = 1; } } #endif for (gd = graphics_drivers; *gd; gd++) { if (!driver || !*driver || !strcasecmp(cast_const_char (*gd)->name, cast_const_char driver)) { unsigned char *r; if ((!driver || !*driver) && (*gd)->flags & GD_NOAUTO) continue; if (!(r = init_graphics_driver(*gd, param, display))) { mem_free(s); return NULL; } if (!l) { if (!driver || !*driver) add_to_str(&s, &l, cast_uchar "Could not initialize any graphics driver. Tried the following drivers:\n"); else add_to_str(&s, &l, cast_uchar "Could not initialize graphics driver "); } add_to_str(&s, &l, (*gd)->name); add_to_str(&s, &l, cast_uchar ":\n"); add_to_str(&s, &l, r); mem_free(r); } } if (!l) { add_to_str(&s, &l, cast_uchar "Unknown graphics driver "); if (driver) add_to_str(&s, &l, driver); add_to_str(&s, &l, cast_uchar ".\nThe following graphics drivers are supported:\n"); add_graphics_drivers(&s, &l); add_to_str(&s, &l, cast_uchar "\n"); } return s; }
/* Create a bitmask consisting from system-independent envirnoment modifiers. * This is then complemented by system-specific modifiers in an appropriate * get_system_env() routine. */ static int get_common_env(void) { int env = 0; if (is_xterm()) env |= ENV_XWIN; if (is_twterm()) env |= ENV_TWIN; if (is_gnuscreen()) env |= ENV_SCREEN; /* ENV_CONSOLE is always set now and indicates that we are working w/ a * displaying-capable character-adressed terminal. Sounds purely * theoretically now, but it already makes some things easier and it * could give us interesting opportunities later (after graphical * frontends will be introduced, when working in some mysterious daemon * mode or who knows what ;). --pasky */ env |= ENV_CONSOLE; return env; }
static void _nc_mouse_init(void) /* initialize the mouse */ { int i; static int initialized; if (initialized) { return; } initialized = TRUE; TR(MY_TRACE, ("_nc_mouse_init() called")); for (i = 0; i < EV_MAX; i++) events[i].id = INVALID_EVENT; /* we know how to recognize mouse events under xterm */ if (key_mouse != 0 && is_xterm(cur_term->type.term_names)) mousetype = M_XTERM; #if USE_GPM_SUPPORT else if (!strncmp(cur_term->type.term_names, "linux", 5)) { /* GPM: initialize connection to gpm server */ gpm_connect.eventMask = GPM_DOWN|GPM_UP; gpm_connect.defaultMask = ~gpm_connect.eventMask; gpm_connect.minMod = 0; gpm_connect.maxMod = ~0; if (Gpm_Open (&gpm_connect, 0) >= 0) { /* returns the file-descriptor */ mousetype = M_GPM; SP->_mouse_fd = gpm_fd; } } #endif T(("_nc_mouse_init() set mousetype to %d", mousetype)); }
int resize_window(int width, int height, int old_width, int old_height) { #ifdef HAVE_X11 /* Following code is stolen from our beloved vim. */ unsigned char *winid; Display *display; Window window; Status status; XWindowAttributes attributes; if (!is_xterm()) return -1; winid = getenv("WINDOWID"); if (!winid) return -1; window = (Window) atol(winid); if (!window) return -1; display = XOpenDisplay(NULL); if (!display) return -1; /* If WINDOWID is bad, we don't want X to abort us. */ x_error = 0; XSetErrorHandler((int (*)(Display *, XErrorEvent *)) catch_x_error); status = XGetWindowAttributes(display, window, &attributes); while (!x_error && !status) { Window root, parent, *children; unsigned int num_children; if (!XQueryTree(display, window, &root, &parent, &children, &num_children)) break; if (children) XFree((void *) children); if (parent == root || parent == 0) break; window = parent; status = XGetWindowAttributes(display, window, &attributes); } if (!x_error && status) { double ratio_width = (double) attributes.width / old_width; double ratio_height = (double) attributes.height / old_height; width = (int) ((double) width * ratio_width); height = (int) ((double) height * ratio_height); status = XResizeWindow(display, window, width, height); while (!x_error && !status) { Window root, parent, *children; unsigned int num_children; if (!XQueryTree(display, window, &root, &parent, &children, &num_children)) break; if (children) XFree((void *) children); if (parent == root || parent == 0) break; window = parent; status = XResizeWindow(display, window, width, height); } } XCloseDisplay(display); return 0; #else return -1; #endif }
/* Set xterm-like term window's title. */ void set_window_title(unsigned char *title) { unsigned char *s; int xsize, ysize; int j = 0; #ifndef HAVE_SYS_CYGWIN_H /* Check if we're in a xterm-like terminal. */ if (!is_xterm() && !is_gnuscreen()) return; #endif /* Retrieve terminal dimensions. */ get_terminal_size(0, &xsize, &ysize); /* Check if terminal width is reasonnable. */ if (xsize < 1 || xsize > 1024) return; /* Allocate space for title + 3 ending points + null char. */ s = mem_alloc(xsize + 3 + 1); if (!s) return; /* Copy title to s if different from NULL */ if (title) { int i; /* We limit title length to terminal width and ignore control * chars if any. Note that in most cases window decoration * reduces printable width, so it's just a precaution. */ /* Note that this is the right place where to do it, since * potential alternative set_window_title() routines might * want to take different precautions. */ for (i = 0; title[i] && i < xsize; i++) { /* 0x80 .. 0x9f are ISO-8859-* control characters. * In some other encodings they could be used for * legitimate characters, though (ie. in Kamenicky). * We should therefore maybe check for these only * if the terminal is running in an ISO- encoding. */ if (iscntrl(title[i]) || (title[i] & 0x7f) < 0x20 || title[i] == 0x7f) continue; s[j++] = title[i]; } /* If title is truncated, add "..." */ if (i == xsize) { s[j++] = '.'; s[j++] = '.'; s[j++] = '.'; } } s[j] = '\0'; /* Send terminal escape sequence + title string */ printf("\033]0;%s\a", s); #if 0 /* Miciah don't like this so it is disabled because it changes the * default window name. --jonas */ /* Set the GNU screen window name */ if (is_gnuscreen()) printf("\033k%s\033\134", s); #endif fflush(stdout); mem_free(s); }
int InitScreen( void) { char *ptr; /* * we're going to assume a terminal here... */ _clearscreen = "\033[1;1H\033[J"; _moveto = "\033[%d;%dH"; /* not a termcap string! */ _cleartoeoln = "\033[K"; _setinverse = "\033[7m"; _clearinverse = "\033[0m"; _setunderline = "\033[4m"; _clearunderline = "\033[0m"; _keypadlocal = ""; _keypadxmit = ""; # ifdef M_AMIGA _terminalinit = "\033[12{\033[0 p"; _terminalend = "\033[12}\033[ p"; _cursoron = "\033[ p"; _cursoroff = "\033[0 p"; _cleartoeos = "\033[J"; _getwinsize = "\2330 q"; # endif /* M_AMIGA */ # ifdef VMS _cleartoeos = "\033[J"; _terminalinit = NULL; _terminalend = ""; # endif /* VMS */ /* needed for word highlighting */ _reset = "\033[0m"; _reversevideo = "\033[7m"; _blink = "\033[5m"; _dim = "\033[2m"; _bold = "\033[1m"; _lines = _columns = -1; /* * Get lines and columns from environment settings - useful when * you're using something other than an Amiga window */ if ((ptr = getenv("LINES")) != 0) { _lines = atol(ptr); } if ((ptr = getenv("COLUMNS")) != 0) { _columns = atol(ptr); } /* * If that failed, try get a response from the console itself */ # ifdef M_AMIGA if (_lines == -1 || _columns == -1) { _lines = DEFAULT_LINES_ON_TERMINAL; _columns = DEFAULT_COLUMNS_ON_TERMINAL; } else { _terminalinit = NULL; /* don't do fancy things on a non-amiga console */ _terminalend = NULL; _cursoroff = NULL; _cursoron = NULL; _getwinsize = NULL; } # endif /* M_AMIGA */ # ifdef VMS /* moved from below InitWin() M.St. 22.01.98 */ { int input_chan, status; int item_code, eightbit; struct sensemode { short status; unsigned char xmit_baud; unsigned char rcv_baud; unsigned char crfill; unsigned char lffill; unsigned char parity; unsigned char unused; char class; char type; short scr_wid; unsigned long tt_char : 24, scr_len : 8; unsigned long tt2_char; } tty; $DESCRIPTOR(input_dsc, "TT"); status = SYS$ASSIGN(&input_dsc, &input_chan, 0, 0); if (!(status & 1)) LIB$STOP(status); SYS$QIOW(0, input_chan, IO$_SENSEMODE, &tty, 0, 0, &tty.class, 12, 0, 0, 0, 0); item_code = DVI$_TT_EIGHTBIT; status = LIB$GETDVI(&item_code, &input_chan, 0, &eightbit, 0, 0); _columns = tty.scr_wid; _lines = tty.scr_len; if (eightbit) { /* if using eightbit then use CSI (octal 233) rather than ESC "[" */ _clearscreen = "\2331;1H\233J"; _moveto = "\233%d;%dH"; /* not a termcap string! */ _cleartoeoln = "\233K"; _cleartoeos = "\233J"; _setinverse = "\2337m"; _clearinverse = "\2330m"; _setunderline = "\2334m"; _clearunderline = "\2330m"; _keypadlocal = ""; _keypadxmit = ""; } else { _clearscreen = "\033[1;1H\033[J"; _moveto = "\033[%d;%dH"; /* not a termcap string! */ _cleartoeoln = "\033[K"; _cleartoeos = "\033[J"; _setinverse = "\033[7m"; _clearinverse = "\033[0m"; _setunderline = "\033[4m"; _clearunderline = "\033[0m"; _keypadlocal = ""; _keypadxmit = ""; } # ifdef HAVE_IS_XTERM if (is_xterm()) { xclicks = TRUE; if (!eightbit) { _xclickinit = "\033[?9h"; _xclickend = "\033[?9l"; } # if 0 else { /* * These are the settings for a DECterm but the reply can't easily be parsed * Reply is of the form - CSI Pe ; Pb ; Pr ; Pc & w * Where Pe is the event, Pb the button, Pr and Pc the row and column */ _xclickinit = "\2331;2'z"; _xclickend = "\2330;0'z"; } # endif /* 0 */ } # endif /* HAVE_IS_XTERM */ }
int resize_window(int width, int height, int old_width, int old_height) { #ifdef HAVE_X11 /* Following code is stolen from our beloved vim. */ unsigned char *winid; Display *display; Window window; Status status; XWindowAttributes attributes; if (!is_xterm()) return -1; winid = (unsigned char *)getenv("WINDOWID"); if (!winid) return -1; window = (Window) atol((const char *)winid); if (!window) return -1; display = XOpenDisplay(NULL); if (!display) return -1; /* If WINDOWID is bad, we don't want X to abort us. */ x_error = 0; XSetErrorHandler((int (*)(Display *, XErrorEvent *)) catch_x_error); status = XGetWindowAttributes(display, window, &attributes); while (!x_error && !status) { Window root, parent, *children; unsigned int num_children; if (!XQueryTree(display, window, &root, &parent, &children, &num_children)) break; if (children) XFree((void *) children); if (parent == root || parent == 0) break; window = parent; status = XGetWindowAttributes(display, window, &attributes); } if (!x_error && status) { XSizeHints *size_hints; long mask; int px_width = 0; int px_height = 0; /* With xterm 210, a window with 80x24 characters at * a 6x13 font appears to have 484x316 pixels; both * the width and height include four extra pixels. * Computing a new size by scaling these values often * results in windows that cannot display as many * characters as was intended. We can do better if we * can find out the actual size of character cells. * If the terminal emulator has set a window size * increment, assume that is the cell size. */ size_hints = XAllocSizeHints(); if (size_hints != NULL && XGetWMNormalHints(display, window, size_hints, &mask) && (mask & PResizeInc) != 0) { px_width = attributes.width + (width - old_width) * size_hints->width_inc; px_height = attributes.height + (height - old_height) * size_hints->height_inc; } if (px_width <= 0 || px_height <= 0) { double ratio_width = (double) attributes.width / old_width; double ratio_height = (double) attributes.height / old_height; px_width = (int) ((double) width * ratio_width); px_height = (int) ((double) height * ratio_height); } if (size_hints) XFree(size_hints); status = XResizeWindow(display, window, px_width, px_height); while (!x_error && !status) { Window root, parent, *children; unsigned int num_children; if (!XQueryTree(display, window, &root, &parent, &children, &num_children)) break; if (children) XFree((void *) children); if (parent == root || parent == 0) break; window = parent; status = XResizeWindow(display, window, px_width, px_height); } } XCloseDisplay(display); return 0; #else return -1; #endif }