diff options
Diffstat (limited to 'src/x11fns.c')
-rw-r--r-- | src/x11fns.c | 1019 |
1 files changed, 1019 insertions, 0 deletions
diff --git a/src/x11fns.c b/src/x11fns.c new file mode 100644 index 00000000000..e7ff4f8e174 --- /dev/null +++ b/src/x11fns.c @@ -0,0 +1,1019 @@ +/* Functions for the X window system. + Copyright (C) 1988, 1990, 1992 Free Software Foundation. + +This file is part of GNU Emacs. + +GNU Emacs is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 1, or (at your option) +any later version. + +GNU Emacs is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with GNU Emacs; see the file COPYING. If not, write to +the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ + +/* Written by Yakim Martillo; rearranged by Richard Stallman. */ +/* Color and other features added by Robert Krawitz*/ +/* Converted to X11 by Robert French */ + +#include <stdio.h> +#include <signal.h> +#include "config.h" + +/* Get FIONREAD, if it is available. */ +#ifdef USG +#include <termio.h> +#endif /* USG */ +#include <fcntl.h> + +#ifndef VMS +#include <sys/ioctl.h> +#endif /* not VMS */ + +/* Allow m- file to inhibit use of interrupt-driven input. */ +#ifdef BROKEN_FIONREAD +#undef FIONREAD +#endif + +/* We are unable to use interrupts if FIONREAD is not available, + so flush SIGIO so we won't try. */ +#ifndef FIONREAD +#ifdef SIGIO +#undef SIGIO +#endif +#endif + +#include "x11term.h" +#include "dispextern.h" +#include "termchar.h" + +#ifdef HAVE_SOCKETS +#include <sys/socket.h> /* Must be done before gettime.h. */ +#endif +/* Include time.h or sys/time.h or both. */ +#include "gettime.h" +#include <setjmp.h> + +/* Prepare for lisp.h definition of NULL. + Sometimes x11term.h includes stddef.h. */ +#ifdef NULL +#undef NULL +#endif + +#include "lisp.h" +#include "window.h" + +#ifdef HAVE_X_WINDOWS + +#define abs(x) ((x < 0) ? ((x)) : (x)) +#define sgn(x) ((x < 0) ? (-1) : (1)) +#define min(a,b) ((a) < (b) ? (a) : (b)) +#define max(a,b) ((a) > (b) ? (a) : (b)) + +/* Non-nil if Emacs is running with an X window for display. + Nil if Emacs is run on an ordinary terminal. */ + +Lisp_Object Vxterm; + +Lisp_Object Vx_mouse_pos; +Lisp_Object Vx_mouse_abs_pos; + +Lisp_Object Vx_mouse_item; + +/* These are standard "white" and "black" strings, used in the + *_color variables when the color was not specially allocated for them. */ +char *white_color = "white"; +char *black_color = "black"; + +extern Lisp_Object MouseMap; + +extern Lisp_Object minibuf_window; +extern int minibuf_prompt_width; + +extern XEvent *XXm_queue[XMOUSEBUFSIZE]; +extern int XXm_queue_num; +extern int XXm_queue_in; +extern int XXm_queue_out; +extern char *fore_color; +extern char *back_color; +extern char *brdr_color; +extern char *mous_color; +extern char *curs_color; + +extern unsigned long fore; +extern unsigned long back; +extern unsigned long brdr; +extern unsigned long curs; + +extern int XXborder; +extern int XXInternalBorder; + +extern char *progname; + +extern XFontStruct *fontinfo; +extern Font XXfid; +extern GC XXgc_norm,XXgc_rev,XXgc_curs,XXgc_temp,XXgc_curs_rev; +extern XGCValues XXgcv; +extern int XXfontw,XXfonth,XXbase,XXisColor; +extern Colormap XXColorMap; + +extern int PendingExposure; +extern char *default_window; +extern char *desiredwindow; + +extern int XXscreen; +extern Window XXwindow; +extern Cursor EmacsCursor; +extern short MouseCursor[], MouseMask[]; +extern char *XXcurrentfont; +extern int informflag; + +extern int WindowMapped; +extern int CurHL; +extern int pixelwidth, pixelheight; +extern int XXpid; + +extern char *XXidentity; + +extern Display *XXdisplay; +extern int bitblt, CursorExists, VisibleX, VisibleY; + +check_xterm () +{ + if (NULL (Vxterm)) + error ("Terminal does not understand X protocol."); +} + +DEFUN ("x-set-bell", Fx_set_bell, Sx_set_bell, 1, 1, "P", + "For X window system, set audible vs visible bell.\n\ +With non-nil argument (prefix arg), use visible bell; otherwise, audible bell.") + (arg) + Lisp_Object arg; +{ + BLOCK_INPUT_DECLARE (); + + check_xterm (); + BLOCK_INPUT (); + if (!NULL (arg)) + XSetFlash (); + else + XSetFeep (); + UNBLOCK_INPUT (); + return arg; +} + +DEFUN ("x-flip-color", Fx_flip_color, Sx_flip_color, 0, 0, "", + "Toggle the background and foreground colors") + () +{ + check_xterm (); + XFlipColor (); + return Qt; +} + +DEFUN ("x-set-foreground-color", Fx_set_foreground_color, + Sx_set_foreground_color, 1, 1, "sSet foreground color: ", + "Set foreground (text) color to COLOR.") + (arg) + Lisp_Object arg; +{ + XColor cdef; + BLOCK_INPUT_DECLARE (); + char *save_color; + unsigned long save; + + save_color = fore_color; + save = fore; + check_xterm (); + CHECK_STRING (arg,1); + fore_color = (char *) xmalloc (XSTRING (arg)->size + 1); + bcopy (XSTRING (arg)->data, fore_color, XSTRING (arg)->size + 1); + + BLOCK_INPUT (); + + if (fore_color && XXisColor && + XParseColor (XXdisplay, XXColorMap, fore_color, &cdef) && + XAllocColor(XXdisplay, XXColorMap, &cdef)) + fore = cdef.pixel; + else if (fore_color && !strcmp (fore_color, "white")) + fore = WhitePixel (XXdisplay, XXscreen), fore_color = white_color; + else if (fore_color && !strcmp (fore_color, "black")) + fore = BlackPixel (XXdisplay, XXscreen), fore_color = black_color; + else + fore_color = save_color; + + /* Now free the old background color + if it was specially allocated and we are not still using it. */ + if (save_color != white_color && save_color != black_color + && save_color != fore_color) + { + XFreeColors (XXdisplay, XXColorMap, &save, 1, 0); + free (save_color); + } + + XSetForeground(XXdisplay, XXgc_norm, fore); + XSetBackground(XXdisplay, XXgc_rev, fore); + + Fredraw_display (); + UNBLOCK_INPUT (); + + XFlush (XXdisplay); + return Qt; +} + +DEFUN ("x-set-background-color", Fx_set_background_color, + Sx_set_background_color, 1, 1, "sSet background color: ", + "Set background color to COLOR.") + (arg) + Lisp_Object arg; +{ + XColor cdef; + BLOCK_INPUT_DECLARE (); + char *save_color; + unsigned long save; + + check_xterm (); + CHECK_STRING (arg,1); + save_color = back_color; + save = back; + back_color = (char *) xmalloc (XSTRING (arg)->size + 1); + bcopy (XSTRING (arg)->data, back_color, XSTRING (arg)->size + 1); + + BLOCK_INPUT (); + + if (back_color && XXisColor && + XParseColor (XXdisplay, XXColorMap, back_color, &cdef) && + XAllocColor(XXdisplay, XXColorMap, &cdef)) + back = cdef.pixel; + else if (back_color && !strcmp (back_color, "white")) + back = WhitePixel (XXdisplay, XXscreen), back_color = white_color; + else if (back_color && !strcmp (back_color, "black")) + back = BlackPixel (XXdisplay, XXscreen), back_color = black_color; + else + back_color = save_color; + + /* Now free the old background color + if it was specially allocated and we are not still using it. */ + if (save_color != white_color && save_color != black_color + && save_color != back_color) + { + XFreeColors (XXdisplay, XXColorMap, &save, 1, 0); + free (save_color); + } + + XSetBackground (XXdisplay, XXgc_norm, back); + XSetForeground (XXdisplay, XXgc_rev, back); + XSetForeground (XXdisplay, XXgc_curs, back); + XSetBackground (XXdisplay, XXgc_curs_rev, back); + XSetWindowBackground(XXdisplay, XXwindow, back); + XClearArea (XXdisplay, XXwindow, 0, 0, + screen_width*XXfontw+2*XXInternalBorder, + screen_height*XXfonth+2*XXInternalBorder, 0); + + UNBLOCK_INPUT (); + Fredraw_display (); + + XFlush (XXdisplay); + return Qt; +} + +DEFUN ("x-set-border-color", Fx_set_border_color, Sx_set_border_color, 1, 1, + "sSet border color: ", + "Set border color to COLOR.") + (arg) + Lisp_Object arg; +{ + XColor cdef; + BLOCK_INPUT_DECLARE (); + unsigned long save; + char *save_color; + + check_xterm (); + CHECK_STRING (arg,1); + brdr_color= (char *) xmalloc (XSTRING (arg)->size + 1); + save = brdr; + save_color = brdr_color; + bcopy (XSTRING (arg)->data, brdr_color, XSTRING (arg)->size + 1); + + BLOCK_INPUT (); + + if (brdr_color && XXisColor && + XParseColor (XXdisplay, XXColorMap, brdr_color, &cdef) && + XAllocColor(XXdisplay, XXColorMap, &cdef)) + brdr = cdef.pixel; + else + { + if (brdr_color && !strcmp (brdr_color, "black")) + { + brdr = BlackPixel (XXdisplay, XXscreen); + brdr_color = black_color; + } + else + if (brdr_color && !strcmp (brdr_color, "white")) + { + brdr = WhitePixel (XXdisplay, XXscreen); + brdr_color = white_color; + } + else { + brdr_color = black_color; + brdr = BlackPixel (XXdisplay, XXscreen); + } + } + + /* Now free the old background color + if it was specially allocated and we are not still using it. */ + if (save_color != white_color && save_color != black_color + && save_color != brdr_color) + { + XFreeColors (XXdisplay, XXColorMap, &save, 1, 0); + free (save_color); + } + + if (XXborder) { + XSetWindowBorder(XXdisplay, XXwindow, brdr); + XFlush (XXdisplay); + } + + UNBLOCK_INPUT (); + + return Qt; +} + +DEFUN ("x-set-cursor-color", Fx_set_cursor_color, Sx_set_cursor_color, 1, 1, + "sSet text cursor color: ", + "Set text cursor color to COLOR.") + (arg) + Lisp_Object arg; +{ + XColor cdef; + BLOCK_INPUT_DECLARE (); + char *save_color; + unsigned long save; + + check_xterm (); + CHECK_STRING (arg,1); + save_color = curs_color; + save = curs; + curs_color = (char *) xmalloc (XSTRING (arg)->size + 1); + bcopy (XSTRING (arg)->data, curs_color, XSTRING (arg)->size + 1); + + BLOCK_INPUT (); + + if (curs_color && XXisColor && + XParseColor (XXdisplay, XXColorMap, curs_color, &cdef) && + XAllocColor(XXdisplay, XXColorMap, &cdef)) + curs = cdef.pixel; + else if (curs_color && !strcmp (curs_color, "white")) + curs = WhitePixel (XXdisplay, XXscreen), curs_color = white_color; + else if (curs_color && !strcmp (curs_color, "black")) + curs = BlackPixel (XXdisplay, XXscreen), curs_color = black_color; + else + curs_color = save_color; + + /* Now free the old background color + if it was specially allocated and we are not still using it. */ + if (save_color != white_color && save_color != black_color + && save_color != curs_color) + { + XFreeColors (XXdisplay, XXColorMap, &save, 1, 0); + free (save_color); + } + + XSetBackground(XXdisplay, XXgc_curs, curs); + XSetForeground(XXdisplay, XXgc_curs_rev, curs); + + CursorToggle (); + CursorToggle (); + + UNBLOCK_INPUT (); + return Qt; +} + +DEFUN ("x-set-mouse-color", Fx_set_mouse_color, Sx_set_mouse_color, 1, 1, + "sSet mouse cursor color: ", + "Set mouse cursor color to COLOR.") + (arg) + Lisp_Object arg; +{ + BLOCK_INPUT_DECLARE (); + char *save_color; + + check_xterm (); + CHECK_STRING (arg,1); + save_color = mous_color; + mous_color = (char *) xmalloc (XSTRING (arg)->size + 1); + bcopy (XSTRING (arg)->data, mous_color, XSTRING (arg)->size + 1); + + BLOCK_INPUT (); + + if (! x_set_cursor_colors ()) + mous_color = save_color; + else if (save_color != white_color && save_color != black_color + && save_color != mous_color) + free (save_color); + + XFlush (XXdisplay); + + UNBLOCK_INPUT (); + return Qt; +} + +/* Set the actual X cursor colors from `mous_color' and `back_color'. */ + +int +x_set_cursor_colors () +{ + XColor forec, backc; + + char *useback; + + /* USEBACK is the background color, but on monochrome screens + changed if necessary not to match the mouse. */ + + useback = back_color; + + if (!XXisColor && !strcmp (mous_color, back_color)) + { + if (strcmp (back_color, "white")) + useback = white_color; + else + useback = black_color; + } + + if (XXisColor && mous_color + && XParseColor (XXdisplay, XXColorMap, mous_color, &forec) + && XParseColor (XXdisplay, XXColorMap, useback, &backc)) + { + XRecolorCursor (XXdisplay, EmacsCursor, &forec, &backc); + return 1; + } + else return 0; +} + +DEFUN ("x-color-p", Fx_color_p, Sx_color_p, 0, 0, 0, + "Returns t if the display is a color X terminal.") + () +{ + check_xterm (); + + if (XXisColor) + return Qt; + else + return Qnil; +} + +DEFUN ("x-get-foreground-color", Fx_get_foreground_color, + Sx_get_foreground_color, 0, 0, 0, + "Returns the color of the foreground, as a string.") + () +{ + Lisp_Object string; + + check_xterm (); + string = build_string (fore_color); + return string; +} + +DEFUN ("x-get-background-color", Fx_get_background_color, + Sx_get_background_color, 0, 0, 0, + "Returns the color of the background, as a string.") + () +{ + Lisp_Object string; + + check_xterm (); + string = build_string (back_color); + return string; +} + +DEFUN ("x-get-border-color", Fx_get_border_color, + Sx_get_border_color, 0, 0, 0, + "Returns the color of the border, as a string.") + () +{ + Lisp_Object string; + + check_xterm (); + string = build_string (brdr_color); + return string; +} + +DEFUN ("x-get-cursor-color", Fx_get_cursor_color, + Sx_get_cursor_color, 0, 0, 0, + "Returns the color of the cursor, as a string.") + () +{ + Lisp_Object string; + + check_xterm (); + string = build_string (curs_color); + return string; +} + +DEFUN ("x-get-mouse-color", Fx_get_mouse_color, + Sx_get_mouse_color, 0, 0, 0, + "Returns the color of the mouse cursor, as a string.") + () +{ + Lisp_Object string; + + check_xterm (); + string = build_string (mous_color); + return string; +} + +DEFUN ("x-get-default", Fx_get_default, Sx_get_default, 1, 1, 0, + "Get default for X-window attribute ATTRIBUTE from the system.\n\ +ATTRIBUTE must be a string.\n\ +Returns nil if attribute default isn't specified.") + (arg) + Lisp_Object arg; +{ + char *default_name, *value; + + check_xterm (); + CHECK_STRING (arg, 1); + default_name = (char *) XSTRING (arg)->data; + +#ifdef XBACKWARDS + /* Some versions of X11R4, at least, have the args backwards. */ + if (XXidentity && *XXidentity) + value = XGetDefault (XXdisplay, default_name, XXidentity); + else + value = XGetDefault (XXdisplay, default_name, CLASS); +#else + if (XXidentity && *XXidentity) + value = XGetDefault (XXdisplay, XXidentity, default_name); + else + value = XGetDefault (XXdisplay, CLASS, default_name); +#endif + + if (value) + return build_string (value); + return (Qnil); +} + +DEFUN ("x-set-font", Fx_set_font, Sx_set_font, 1, 1, "sFont Name: ", + "Sets the font to be used for the X window.") + (arg) + Lisp_Object arg; +{ + register char *newfontname; + + CHECK_STRING (arg, 1); + check_xterm (); + + newfontname = (char *) xmalloc (XSTRING (arg)->size + 1); + bcopy (XSTRING (arg)->data, newfontname, XSTRING (arg)->size + 1); + if (XSTRING (arg)->size == 0) + goto badfont; + + if (!XNewFont (newfontname)) { + free (XXcurrentfont); + XXcurrentfont = newfontname; + return Qt; + } +badfont: + error ("Font \"%s\" is not defined", newfontname); + free (newfontname); + + return Qnil; +} + +DEFUN ("coordinates-in-window-p", Fcoordinates_in_window_p, + Scoordinates_in_window_p, 2, 2, 0, + "Return non-nil if POSITIONS (a list, (SCREEN-X SCREEN-Y)) is in WINDOW.\n\ +Returned value is list of positions expressed\n\ +relative to window upper left corner.") + (coordinate, window) + register Lisp_Object coordinate, window; +{ + register Lisp_Object xcoord, ycoord; + int height; + + if (!CONSP (coordinate)) + wrong_type_argument (Qlistp, coordinate); + + CHECK_WINDOW (window, 2); + xcoord = Fcar (coordinate); + ycoord = Fcar (Fcdr (coordinate)); + CHECK_NUMBER (xcoord, 0); + CHECK_NUMBER (ycoord, 1); + if ((XINT (xcoord) < XINT (XWINDOW (window)->left)) || + (XINT (xcoord) >= (XINT (XWINDOW (window)->left) + + XINT (XWINDOW (window)->width)))) + return Qnil; + + XFASTINT (xcoord) -= XFASTINT (XWINDOW (window)->left); + + height = XINT (XWINDOW (window)->height); + + if (window != minibuf_window) + height --; + + if ((XINT (ycoord) < XINT (XWINDOW (window)->top)) || + (XINT (ycoord) >= XINT (XWINDOW (window)->top) + height)) + return Qnil; + + XFASTINT (ycoord) -= XFASTINT (XWINDOW (window)->top); + return Fcons (xcoord, Fcons (ycoord, Qnil)); +} + +DEFUN ("x-mouse-events", Fx_mouse_events, Sx_mouse_events, 0, 0, 0, + "Return number of pending mouse events from X window system.") + () +{ + register Lisp_Object tem; + + check_xterm (); + + XSET (tem, Lisp_Int, XXm_queue_num); + + return tem; +} + +DEFUN ("x-proc-mouse-event", Fx_proc_mouse_event, Sx_proc_mouse_event, + 0, 0, 0, + "Pulls a mouse event out of the mouse event buffer and dispatches\n\ +the appropriate function to act upon this event.") + () +{ + XEvent event; + register Lisp_Object mouse_cmd; + register char com_letter; + register char key_mask; + register Lisp_Object tempx; + register Lisp_Object tempy; + extern Lisp_Object get_keyelt (); + extern int meta_prefix_char; + + check_xterm (); + + if (XXm_queue_num) { + event = *XXm_queue[XXm_queue_out]; + free (XXm_queue[XXm_queue_out]); + XXm_queue_out = (XXm_queue_out + 1) % XMOUSEBUFSIZE; + XXm_queue_num--; + com_letter = 3-(event.xbutton.button & 3); + key_mask = (event.xbutton.state & 15) << 4; + /* Get rid of the shift-lock bit. */ + key_mask &= ~0x20; + /* Report meta in 2 bit, not in 8 bit. */ + if (key_mask & 0x80) + { + key_mask |= 0x20; + key_mask &= ~0x80; + } + com_letter |= key_mask; + if (event.type == ButtonRelease) + com_letter |= 0x04; + XSET (tempx, Lisp_Int, + min (screen_width-1, + max (0, (event.xbutton.x-XXInternalBorder)/ + XXfontw))); + XSET (tempy, Lisp_Int, + min (screen_height-1, + max (0, (event.xbutton.y-XXInternalBorder)/ + XXfonth))); + Vx_mouse_pos = Fcons (tempx, Fcons (tempy, Qnil)); + XSET (tempx, Lisp_Int, event.xbutton.x_root); + XSET (tempy, Lisp_Int, event.xbutton.y_root); + Vx_mouse_abs_pos = Fcons (tempx, Fcons (tempy, Qnil)); + Vx_mouse_item = make_number (com_letter); + mouse_cmd + = get_keyelt (access_keymap (MouseMap, com_letter)); + if (NULL (mouse_cmd)) { + if (event.type != ButtonRelease) + bell (); + Vx_mouse_pos = Qnil; + } + else + return call1 (mouse_cmd, Vx_mouse_pos); + } + return Qnil; +} + +DEFUN ("x-get-mouse-event", Fx_get_mouse_event, Sx_get_mouse_event, + 1, 1, 0, + "Get next mouse event out of mouse event buffer (com-letter (x y)).\n\ +ARG non-nil means return nil immediately if no pending event;\n\ +otherwise, wait for an event.") + (arg) + Lisp_Object arg; +{ + XEvent event; + register char com_letter; + register char key_mask; + + register Lisp_Object tempx; + register Lisp_Object tempy; + + check_xterm (); + + if (NULL (arg)) + while (!XXm_queue_num) + { + consume_available_input (); + Fsleep_for (make_number (1)); + } + /*** ??? Surely you don't mean to busy wait??? */ + + if (XXm_queue_num) { + event = *XXm_queue[XXm_queue_out]; + free (XXm_queue[XXm_queue_out]); + XXm_queue_out = (XXm_queue_out + 1) % XMOUSEBUFSIZE; + XXm_queue_num--; + com_letter = 3-(event.xbutton.button & 3); + key_mask = (event.xbutton.state & 15) << 4; + /* Report meta in 2 bit, not in 8 bit. */ + if (key_mask & 0x80) + { + key_mask |= 0x20; + key_mask &= ~0x80; + } + com_letter |= key_mask; + if (event.type == ButtonRelease) + com_letter |= 0x04; + XSET (tempx, Lisp_Int, + min (screen_width-1, + max (0, (event.xbutton.x-XXInternalBorder)/ + XXfontw))); + XSET (tempy, Lisp_Int, + min (screen_height-1, + max (0, (event.xbutton.y-XXInternalBorder)/ + XXfonth))); + Vx_mouse_pos = Fcons (tempx, Fcons (tempy, Qnil)); + XSET (tempx, Lisp_Int, event.xbutton.x_root); + XSET (tempy, Lisp_Int, event.xbutton.y_root); + Vx_mouse_abs_pos = Fcons (tempx, Fcons (tempy, Qnil)); + Vx_mouse_item = make_number (com_letter); + return Fcons (com_letter, Fcons (Vx_mouse_pos, Qnil)); + } + return Qnil; +} + +DEFUN ("x-store-cut-buffer", Fx_store_cut_buffer, Sx_store_cut_buffer, + 1, 1, "sSend string to X:", + "Store contents of STRING into the cut buffer of the X window system.") + (string) + register Lisp_Object string; +{ + BLOCK_INPUT_DECLARE (); + + CHECK_STRING (string, 1); + check_xterm (); + + BLOCK_INPUT (); + XStoreBytes (XXdisplay, (char *) XSTRING (string)->data, + XSTRING (string)->size); + /* Clear the selection owner, so that other applications + will use the cut buffer rather than a selection. */ + XSetSelectionOwner (XXdisplay, XA_PRIMARY, None, CurrentTime); + UNBLOCK_INPUT (); + + return Qnil; +} + +DEFUN ("x-get-cut-buffer", Fx_get_cut_buffer, Sx_get_cut_buffer, 0, 0, 0, + "Return contents of cut buffer of the X window system, as a string.") + () +{ + int len; + register Lisp_Object string; + BLOCK_INPUT_DECLARE (); + register char *d; + + check_xterm (); + BLOCK_INPUT (); + d = XFetchBytes (XXdisplay, &len); + string = make_string (d, len); + UNBLOCK_INPUT (); + + return string; +} + +DEFUN ("x-set-border-width", Fx_set_border_width, Sx_set_border_width, + 1, 1, "nBorder width: ", + "Set width of border to WIDTH, in the X window system.") + (borderwidth) + register Lisp_Object borderwidth; +{ + BLOCK_INPUT_DECLARE (); + + CHECK_NUMBER (borderwidth, 0); + + check_xterm (); + + if (XINT (borderwidth) < 0) + XSETINT (borderwidth, 0); + + BLOCK_INPUT (); + XSetWindowBorderWidth(XXdisplay, XXwindow, XINT(borderwidth)); + XFlush(XXdisplay); + UNBLOCK_INPUT (); + + return Qt; +} + + +DEFUN ("x-set-internal-border-width", Fx_set_internal_border_width, + Sx_set_internal_border_width, 1, 1, "nInternal border width: ", + "Set width of internal border to WIDTH, in the X window system.") + (internalborderwidth) + register Lisp_Object internalborderwidth; +{ + BLOCK_INPUT_DECLARE (); + + CHECK_NUMBER (internalborderwidth, 0); + + check_xterm (); + + if (XINT (internalborderwidth) < 0) + XSETINT (internalborderwidth, 0); + + BLOCK_INPUT (); + XXInternalBorder = XINT(internalborderwidth); + XSetWindowSize(screen_height,screen_width); + UNBLOCK_INPUT (); + + return Qt; +} + +#ifdef foobar +DEFUN ("x-rebind-key", Fx_rebind_key, Sx_rebind_key, 3, 3, 0, + "Rebind KEYCODE, with shift bits SHIFT-MASK, to new string NEWSTRING.\n\ +KEYCODE and SHIFT-MASK should be numbers representing the X keyboard code\n\ +and shift mask respectively. NEWSTRING is an arbitrary string of keystrokes.\n\ +If SHIFT-MASK is nil, then KEYCODE's key will be bound to NEWSTRING for\n\ +all shift combinations.\n\ +Shift Lock 1 Shift 2\n\ +Meta 4 Control 8\n\ +\n\ +For values of KEYCODE, see /usr/lib/Xkeymap.txt (remember that the codes\n\ +in that file are in octal!)\n") + + (keycode, shift_mask, newstring) + register Lisp_Object keycode; + register Lisp_Object shift_mask; + register Lisp_Object newstring; +{ +#ifdef notdef + char *rawstring; + int rawkey, rawshift; + int i; + int strsize; + + CHECK_NUMBER (keycode, 1); + if (!NULL (shift_mask)) + CHECK_NUMBER (shift_mask, 2); + CHECK_STRING (newstring, 3); + strsize = XSTRING (newstring) ->size; + rawstring = (char *) xmalloc (strsize); + bcopy (XSTRING (newstring)->data, rawstring, strsize); + rawkey = ((unsigned) (XINT (keycode))) & 255; + if (NULL (shift_mask)) + for (i = 0; i <= 15; i++) + XRebindCode (rawkey, i<<11, rawstring, strsize); + else + { + rawshift = (((unsigned) (XINT (shift_mask))) & 15) << 11; + XRebindCode (rawkey, rawshift, rawstring, strsize); + } +#endif notdef + return Qnil; +} + +DEFUN ("x-rebind-keys", Fx_rebind_keys, Sx_rebind_keys, 2, 2, 0, + "Rebind KEYCODE to list of strings STRINGS.\n\ +STRINGS should be a list of 16 elements, one for each all shift combination.\n\ +nil as element means don't change.\n\ +See the documentation of x-rebind-key for more information.") + (keycode, strings) + register Lisp_Object keycode; + register Lisp_Object strings; +{ +#ifdef notdef + register Lisp_Object item; + register char *rawstring; + int rawkey, strsize; + register unsigned i; + + CHECK_NUMBER (keycode, 1); + CHECK_CONS (strings, 2); + rawkey = ((unsigned) (XINT (keycode))) & 255; + for (i = 0; i <= 15; strings = Fcdr (strings), i++) + { + item = Fcar (strings); + if (!NULL (item)) + { + CHECK_STRING (item, 2); + strsize = XSTRING (item)->size; + rawstring = (char *) xmalloc (strsize); + bcopy (XSTRING (item)->data, rawstring, strsize); + XRebindCode (rawkey, i << 11, rawstring, strsize); + } + } +#endif notdef + return Qnil; +} + +#endif foobar + +XExitWithCoreDump () +{ + XCleanUp (); + abort (); +} + +DEFUN ("x-debug", Fx_debug, Sx_debug, 1, 1, 0, + "ARG non-nil means that X errors should generate a coredump.") + (arg) + register Lisp_Object arg; +{ + int (*handler)(); + + check_xterm (); + if (!NULL (arg)) + handler = XExitWithCoreDump; + else + { + extern int XIgnoreError (); + handler = XIgnoreError; + } + XSetErrorHandler(handler); + XSetIOErrorHandler(handler); + return (Qnil); +} + +XRedrawDisplay () +{ + Fredraw_display (); +} + +XCleanUp () +{ + Fdo_auto_save (Qt); + +#ifdef subprocesses + kill_buffer_processes (Qnil); +#endif /* subprocesses */ +} + +syms_of_xfns () +{ + /* If not dumping, init_display ran before us, so don't override it. */ +#ifdef CANNOT_DUMP + if (noninteractive) +#endif + Vxterm = Qnil; + + DEFVAR_LISP ("x-mouse-item", &Vx_mouse_item, + "Encoded representation of last mouse click, corresponding to\n\ +numerical entries in x-mouse-map."); + Vx_mouse_item = Qnil; + DEFVAR_LISP ("x-mouse-pos", &Vx_mouse_pos, + "Current x-y position of mouse by row, column as specified by font."); + Vx_mouse_pos = Qnil; + DEFVAR_LISP ("x-mouse-abs-pos", &Vx_mouse_abs_pos, + "Current x-y position of mouse relative to root window."); + Vx_mouse_abs_pos = Qnil; + + defsubr (&Sx_set_bell); + defsubr (&Sx_flip_color); + defsubr (&Sx_set_font); +#ifdef notdef + defsubr (&Sx_set_icon); +#endif notdef + defsubr (&Scoordinates_in_window_p); + defsubr (&Sx_mouse_events); + defsubr (&Sx_proc_mouse_event); + defsubr (&Sx_get_mouse_event); + defsubr (&Sx_store_cut_buffer); + defsubr (&Sx_get_cut_buffer); + defsubr (&Sx_set_border_width); + defsubr (&Sx_set_internal_border_width); + defsubr (&Sx_set_foreground_color); + defsubr (&Sx_set_background_color); + defsubr (&Sx_set_border_color); + defsubr (&Sx_set_cursor_color); + defsubr (&Sx_set_mouse_color); + defsubr (&Sx_get_foreground_color); + defsubr (&Sx_get_background_color); + defsubr (&Sx_get_border_color); + defsubr (&Sx_get_cursor_color); + defsubr (&Sx_get_mouse_color); + defsubr (&Sx_color_p); + defsubr (&Sx_get_default); +#ifdef notdef + defsubr (&Sx_rebind_key); + defsubr (&Sx_rebind_keys); +#endif notdef + defsubr (&Sx_debug); +} + +#endif /* HAVE_X_WINDOWS */ |