]> code.delx.au - gnu-emacs/blobdiff - src/xterm.c
(SYSTEM_TYPE): Use berkeley-unix.
[gnu-emacs] / src / xterm.c
index 43f59d03ad2ea18b84123fbfa568f634aa5a929b..c17bf1fc91eddc161cff3515b3c0eba03e29d5f1 100644 (file)
@@ -31,44 +31,46 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
 
 #include "lisp.h"
 
-/* On 4.3 this loses if it comes after xterm.h.  */
+/* On 4.3 these lose if they come after xterm.h.  */
+#include <stdio.h>
 #include <signal.h>
 
 /* This may include sys/types.h, and that somehow loses
    if this is not done before the other system files.  */
 #include "xterm.h"
 
+#ifndef USG
 /* Load sys/types.h if not already loaded.
    In some systems loading it twice is suicidal.  */
 #ifndef makedev
 #include <sys/types.h>
-#endif
+#endif /* makedev */
+#endif /* USG */
 
 #ifdef BSD
 #include <sys/ioctl.h>
 #include <strings.h>
-#else
+#else /* ! defined (BSD) */
 #include <sys/termio.h>
 #include <string.h>
-#endif
+#endif /* ! defined (BSD) */
 
 /* Allow m- file to inhibit use of FIONREAD.  */
 #ifdef BROKEN_FIONREAD
 #undef FIONREAD
-#endif
+#endif /* ! defined (BROKEN_FIONREAD) */
 
 /* 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
+#endif /* ! defined (SIGIO) */
+#endif /* FIONREAD */
 
 #include "systime.h"
 
 #include <fcntl.h>
-#include <stdio.h>
 #include <ctype.h>
 #include <errno.h>
 #include <setjmp.h>
@@ -82,18 +84,18 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #if 0
 #include "sink.h"
 #include "sinkmask.h"
-#endif
+#endif /* ! 0 */
 #include "gnu.h"
-#include "screen.h"
+#include "frame.h"
 #include "disptab.h"
 #include "buffer.h"
 
 #ifdef HAVE_X11
 #define XMapWindow XMapRaised          /* Raise them when mapping. */
-#else
+#else /* ! defined (HAVE_X11) */
 #include <X/Xkeyboard.h>
 /*#include <X/Xproto.h>        */
-#endif /* HAVE_X11 */
+#endif /* ! defined (HAVE_X11) */
 
 /* For sending Meta-characters.  Do we need this? */
 #define METABIT 0200
@@ -121,7 +123,7 @@ static struct event_queue x_expose_queue;
    are copied into this queue for later processing.  */
 
 struct event_queue x_mouse_queue;
-#endif
+#endif /* HAVE_X11 */
 
 /* Nonzero after BLOCK_INPUT; prevents input events from being
    processed until later.  */
@@ -130,17 +132,13 @@ int x_input_blocked;
 
 #if defined (SIGIO) && defined (FIONREAD)
 int BLOCK_INPUT_mask;
-#endif
+#endif /* ! defined (SIGIO) && defined (FIONREAD) */
 
 /* Nonzero if input events came in while x_input_blocked was nonzero.
    UNBLOCK_INPUT checks for this.  */
 
 int x_pending_input;
 
-/* Nonzero if in redisplay ();  prevents us from calling it recursively */
-
-int in_display;
-
 /* The id of a bitmap used for icon windows.
    One such map is shared by all Emacs icon windows.
    This is zero if we have not yet had a need to create the bitmap.  */
@@ -161,27 +159,27 @@ Lisp_Object invocation_name;
 
 Display *x_current_display;
 
-/* Screen being updated by update_screen.  */
+/* Frame being updated by update_frame.  */
 /* This is set by XTupdate_begin and looked at by all the
    XT functions.  It is zero while not inside an update.
-   In that case, the XT functions assume that `selected_screen'
-   is the screen to apply to.  */
+   In that case, the XT functions assume that `selected_frame'
+   is the frame to apply to.  */
 
-static struct screen *updating_screen;
+static struct frame *updating_frame;
 
-/* The screen (if any) which has the X window that has keyboard focus.
-   Zero if none.  This is examined by Ffocus_screen in screen.c.  */
-struct screen *x_focus_screen;
+/* The frame (if any) which has the X window that has keyboard focus.
+   Zero if none.  This is examined by Ffocus_frame in frame.c.  */
+struct frame *x_focus_frame;
 
-/* The screen which currently has the visual highlight, and should get
-   keyboard input (other sorts of input have the screen encoded in the
-   event).  It points to the X focus screen's selected window's
-   screen.  It differs from x_focus_screen when we're using a global
+/* The frame which currently has the visual highlight, and should get
+   keyboard input (other sorts of input have the frame encoded in the
+   event).  It points to the X focus frame's selected window's
+   frame.  It differs from x_focus_frame when we're using a global
    minibuffer.  */
-static struct screen *x_highlight_screen;
+static struct frame *x_highlight_frame;
 
 /* From .Xdefaults, the value of "emacs.WarpMouse".  If non-zero,
-   mouse is moved to inside of screen when screen is de-iconified.  */
+   mouse is moved to inside of frame when frame is de-iconified.  */
 
 static int warp_mouse_on_deiconify;
 
@@ -217,7 +215,7 @@ extern Window requestor_window;
 /* Nonzero enables some debugging for the X interface code. */
 extern int _Xdebug;
 
-#else /* X10 stuff */
+#else /* ! defined (HAVE_X11) */
 
 /* Bit patterns for the mouse cursor.  */
 
@@ -237,7 +235,7 @@ static short grey_bits[] = {
   0x0005, 0x000a, 0x0005, 0x000a};
 
 static Pixmap GreyPixmap = 0;
-#endif /* X10 stuff */
+#endif /* ! defined (HAVE_X11) */
 
 /* From time to time we get info on an Emacs window, here.  */
 
@@ -255,63 +253,64 @@ static void flashback ();
 
 #ifndef HAVE_X11
 static void dumpqueue ();
-#endif
+#endif /* HAVE_X11 */
 
 void dumpborder ();
 static int XTcursor_to ();
 static int XTclear_end_of_line ();
+
 \f
-/* These hooks are called by update_screen at the beginning and end
-   of a screen update.  We record in `updating_screen' the identity
-   of the screen being updated, so that the XT... functions do not
-   need to take a screen as argument.  Most of the XT... functions
+/* These hooks are called by update_frame at the beginning and end
+   of a frame update.  We record in `updating_frame' the identity
+   of the frame being updated, so that the XT... functions do not
+   need to take a frame as argument.  Most of the XT... functions
    should never be called except during an update, the only exceptions
    being XTcursor_to, XTwrite_char and XTreassert_line_highlight.  */
 
 extern int mouse_track_top, mouse_track_left, mouse_track_width;
 
 static
-XTupdate_begin (s)
-     struct screen *s;
+XTupdate_begin (f)
+     struct frame *f;
 {      
   int mask;
 
-  if (s == 0)
+  if (f == 0)
     abort ();
 
-  updating_screen = s;
-  flexlines = s->height;
+  updating_frame = f;
+  flexlines = f->height;
   highlight = 0;
 
   BLOCK_INPUT;
 #ifndef HAVE_X11
   dumpqueue ();
-#endif
+#endif /* HAVE_X11 */
   UNBLOCK_INPUT;
 }
 
 static void x_do_pending_expose ();
 
 static
-XTupdate_end (s)
-     struct screen *s;
+XTupdate_end (f)
+     struct frame *f;
 {      
   int mask;
 
-  if (updating_screen == 0
-      || updating_screen != s)
+  if (updating_frame == 0
+      || updating_frame != f)
     abort ();
 
   BLOCK_INPUT;
 #ifndef HAVE_X11
   dumpqueue ();
-#endif
-  adjust_scrollbars (s);
+#endif /* HAVE_X11 */
+  adjust_scrollbars (f);
   x_do_pending_expose ();
 
-  x_display_cursor (s, 1);
+  x_display_cursor (f, 1);
 
-  updating_screen = 0;
+  updating_frame = 0;
   XFlushQueue ();
   UNBLOCK_INPUT;
 }
@@ -335,7 +334,7 @@ XTchange_line_highlight (new_highlight, vpos, first_unused_hpos)
 {
   highlight = new_highlight;
   XTcursor_to (vpos, 0);
-  XTclear_end_of_line (updating_screen->width);
+  XTclear_end_of_line (updating_frame->width);
 }
 
 /* This is used when starting Emacs and when restarting after suspend.
@@ -354,10 +353,10 @@ XTset_terminal_modes ()
 static
 XTreset_terminal_modes ()
 {
-/*  XTclear_screen ();  */
+/*  XTclear_frame ();  */
 }
 \f
-/* Set the nominal cursor position of the screen:
+/* Set the nominal cursor position of the frame:
    where display update commands will take effect.
    This does not affect the place where the cursor-box is displayed.  */
 
@@ -371,10 +370,10 @@ XTcursor_to (row, col)
   curs_x = col;
   curs_y = row;
 
-  if (updating_screen == 0)
+  if (updating_frame == 0)
     {
       BLOCK_INPUT;
-      x_display_cursor (selected_screen, 1);
+      x_display_cursor (selected_frame, 1);
       XFlushQueue ();
       UNBLOCK_INPUT;
     }
@@ -387,8 +386,8 @@ XTcursor_to (row, col)
    FONT is the default font to use (for glyphs whose font-code is 0).  */
 
 static void
-dumpglyphs (s, left, top, gp, n, hl, font)
-     struct screen *s;
+dumpglyphs (f, left, top, gp, n, hl, font)
+     struct frame *f;
      int left, top;
      register GLYPH *gp; /* Points to first GLYPH. */
      register int n;  /* Number of glyphs to display. */
@@ -396,10 +395,10 @@ dumpglyphs (s, left, top, gp, n, hl, font)
      FONT_TYPE *font;
 {
   register int len;
-  Window window = s->display.x->window_desc;
-  GC drawing_gc =   (hl == 2 ? s->display.x->cursor_gc
-                            : (hl ? s->display.x->reverse_gc
-                                  : s->display.x->normal_gc));
+  Window window = FRAME_X_WINDOW (f);
+  GC drawing_gc =   (hl == 2 ? f->display.x->cursor_gc
+                            : (hl ? f->display.x->reverse_gc
+                                  : f->display.x->normal_gc));
 
   if (sizeof (GLYPH) == sizeof (XChar2b))
     XDrawImageString16 (x_current_display, window, drawing_gc,
@@ -415,23 +414,23 @@ dumpglyphs (s, left, top, gp, n, hl, font)
 
 #if 0
 static void
-dumpglyphs (s, left, top, gp, n, hl, font)
-     struct screen *s;
+dumpglyphs (f, left, top, gp, n, hl, font)
+     struct frame *f;
      int left, top;
      register GLYPH *gp; /* Points to first GLYPH. */
      register int n;  /* Number of glyphs to display. */
      int hl;
      FONT_TYPE *font;
 {
-  char buf[s->width]; /* Holds characters to be displayed. */
+  char buf[f->width]; /* Holds characters to be displayed. */
   register char *cp;           /* Steps through buf[]. */
   register int tlen = GLYPH_TABLE_LENGTH;
   register Lisp_Object *tbase = GLYPH_TABLE_BASE;
-  Window window = s->display.x->window_desc;
-  int cursor_pixel = s->display.x->cursor_pixel;
-  int fg_pixel = s->display.x->foreground_pixel;
-  int bg_pixel = s->display.x->background_pixel;
-  int intborder = s->display.x->internal_border_width;
+  Window window = FRAME_X_WINDOW (f);
+  int cursor_pixel = f->display.x->cursor_pixel;
+  int fg_pixel = f->display.x->foreground_pixel;
+  int bg_pixel = f->display.x->background_pixel;
+  int intborder = f->display.x->internal_border_width;
 
   while (n)
     {
@@ -468,16 +467,16 @@ dumpglyphs (s, left, top, gp, n, hl, font)
       if (cf == 0)
        {
 #ifdef HAVE_X11
-         GC GC_cursor = s->display.x->cursor_gc;
-         GC GC_reverse = s->display.x->reverse_gc;
-         GC GC_normal = s->display.x->normal_gc;
+         GC GC_cursor = f->display.x->cursor_gc;
+         GC GC_reverse = f->display.x->reverse_gc;
+         GC GC_normal = f->display.x->normal_gc;
 
          XDrawImageString (x_current_display, window,
                            (hl == 2
                             ? GC_cursor
                             : (hl ? GC_reverse : GC_normal)),
                            left, top + FONT_BASE (font), buf, len);
-#else
+#else /* ! defined (HAVE_X11) */
          XText (window, left, top,
                 buf,
                 len,
@@ -487,26 +486,26 @@ dumpglyphs (s, left, top, gp, n, hl, font)
                  : hl ? bg_pixel : fg_pixel),
                 (hl == 2 ? cursor_pixel
                  : hl ? fg_pixel : bg_pixel));
-#endif /* HAVE_X11 */
+#endif /* ! defined (HAVE_X11) */
        }
       else
        {
 #ifdef HAVE_X11
          if (FACE_IS_FONT (cf))
-           XDrawImageString (x_current_display, s->display.x->window_desc,
+           XDrawImageString (x_current_display, FRAME_X_WINDOW (f),
                              FACE_GC (cf),
                              left, top + FONT_BASE (FACE_FONT (cf)),
                              buf, len);
          else if (FACE_IS_IMAGE (cf))
            XCopyPlane (x_current_display, FACE_IMAGE (cf),
-                       s->display.x->window_desc,
-                       s->display.x->normal_gc,
+                       FRAME_X_WINDOW (f),
+                       f->display.x->normal_gc,
                        0, 0,
                        FACE_IMAGE_WIDTH (cf),
                        FACE_IMAGE_HEIGHT (cf), left, top);
          else
            abort ();
-#else
+#else /* ! defined (HAVE_X11) */
          register struct face *fp = x_face_table[cf];
 
          XText (window, left, top,
@@ -518,14 +517,14 @@ dumpglyphs (s, left, top, gp, n, hl, font)
                  : hl ? fp->bg : fp->fg),
                 (hl == 2 ? cursor_pixel
                  : hl ? fp->fg : fp->bg));
-#endif /* HAVE_X11 */
+#endif /* ! defined (HAVE_X11) */
        }
       left += len * FONT_WIDTH (font);
     }
 }
-#endif
+#endif /* ! 0 */
 \f
-/* Output some text at the nominal screen cursor position,
+/* Output some text at the nominal frame cursor position,
    advancing the cursor over the text.
    Output LEN glyphs at START.
 
@@ -539,38 +538,38 @@ XTwrite_glyphs (start, len)
 {
   register int temp_length;
   int mask;
-  struct screen *s;
+  struct frame *f;
 
   BLOCK_INPUT;
 
-  s = updating_screen;
-  if (s == 0)
+  f = updating_frame;
+  if (f == 0)
     {
-      s = selected_screen;
+      f = selected_frame;
       /* If not within an update,
-        output at the screen's visible cursor.  */
-      curs_x = s->cursor_x;
-      curs_y = s->cursor_y;
+        output at the frame's visible cursor.  */
+      curs_x = f->cursor_x;
+      curs_y = f->cursor_y;
     }
 
-  dumpglyphs (s,
-            (curs_x * FONT_WIDTH (s->display.x->font)
-             + s->display.x->internal_border_width),
-            (curs_y * FONT_HEIGHT (s->display.x->font)
-             + s->display.x->internal_border_width),
-            start, len, highlight, s->display.x->font);
+  dumpglyphs (f,
+            (curs_x * FONT_WIDTH (f->display.x->font)
+             + f->display.x->internal_border_width),
+            (curs_y * FONT_HEIGHT (f->display.x->font)
+             + f->display.x->internal_border_width),
+            start, len, highlight, f->display.x->font);
 
   /* If we drew on top of the cursor, note that it is turned off.  */
-  if (curs_y == s->phys_cursor_y
-      && curs_x <= s->phys_cursor_x
-      && curs_x + len > s->phys_cursor_x)
-    s->phys_cursor_x = -1;
+  if (curs_y == f->phys_cursor_y
+      && curs_x <= f->phys_cursor_x
+      && curs_x + len > f->phys_cursor_x)
+    f->phys_cursor_x = -1;
   
-  if (updating_screen == 0)
+  if (updating_frame == 0)
     {
-      s->cursor_x += len;
-      x_display_cursor (s, 1);
-      s->cursor_x -= len;
+      f->cursor_x += len;
+      x_display_cursor (f, 1);
+      f->cursor_x -= len;
     }
   else
     curs_x += len;
@@ -586,169 +585,169 @@ static int
 XTclear_end_of_line (first_unused)
      register int first_unused;
 {
-  struct screen *s = updating_screen;
+  struct frame *f = updating_frame;
   int mask;
 
-  if (s == 0)
+  if (f == 0)
     abort ();
 
-  if (curs_y < 0 || curs_y >= s->height)
+  if (curs_y < 0 || curs_y >= f->height)
     return;
   if (first_unused <= 0)
     return;
 
-  if (first_unused >= s->width)
-    first_unused = s->width;
+  if (first_unused >= f->width)
+    first_unused = f->width;
 
   BLOCK_INPUT;
 
   /* Notice if the cursor will be cleared by this operation.  */
-  if (curs_y == s->phys_cursor_y
-      && curs_x <= s->phys_cursor_x
-      && s->phys_cursor_x < first_unused)
-    s->phys_cursor_x = -1;
+  if (curs_y == f->phys_cursor_y
+      && curs_x <= f->phys_cursor_x
+      && f->phys_cursor_x < first_unused)
+    f->phys_cursor_x = -1;
 
 #ifdef HAVE_X11
-  XClearArea (x_current_display, s->display.x->window_desc,
-             curs_x * FONT_WIDTH (s->display.x->font)
-             + s->display.x->internal_border_width,
-             curs_y * FONT_HEIGHT (s->display.x->font)
-             + s->display.x->internal_border_width,
-             FONT_WIDTH (s->display.x->font) * (first_unused - curs_x),
-             FONT_HEIGHT (s->display.x->font), False);
+  XClearArea (x_current_display, FRAME_X_WINDOW (f),
+             curs_x * FONT_WIDTH (f->display.x->font)
+             + f->display.x->internal_border_width,
+             curs_y * FONT_HEIGHT (f->display.x->font)
+             + f->display.x->internal_border_width,
+             FONT_WIDTH (f->display.x->font) * (first_unused - curs_x),
+             FONT_HEIGHT (f->display.x->font), False);
              
-#else
-  XPixSet (s->display.x->window_desc,
-          curs_x * FONT_WIDTH (s->display.x->font) + s->display.x->internal_border_width,
-          curs_y * FONT_HEIGHT (s->display.x->font) + s->display.x->internal_border_width,
-          FONT_WIDTH (s->display.x->font) * (first_unused - curs_x),
-          FONT_HEIGHT (s->display.x->font),
-          s->display.x->background_pixel);     
-#endif /* HAVE_X11 */
+#else /* ! defined (HAVE_X11) */
+  XPixSet (FRAME_X_WINDOW (f),
+          curs_x * FONT_WIDTH (f->display.x->font) + f->display.x->internal_border_width,
+          curs_y * FONT_HEIGHT (f->display.x->font) + f->display.x->internal_border_width,
+          FONT_WIDTH (f->display.x->font) * (first_unused - curs_x),
+          FONT_HEIGHT (f->display.x->font),
+          f->display.x->background_pixel);     
+#endif /* ! defined (HAVE_X11) */
 
   UNBLOCK_INPUT;
 }
 
 static
-XTclear_screen ()
+XTclear_frame ()
 {
   int mask;
-  struct screen *s = updating_screen;
+  struct frame *f = updating_frame;
 
-  if (s == 0)
-    s = selected_screen;
+  if (f == 0)
+    f = selected_frame;
 
-  s->phys_cursor_x = -1;       /* Cursor not visible.  */
+  f->phys_cursor_x = -1;       /* Cursor not visible.  */
   curs_x = 0;                  /* Nominal cursor position is top left.  */
   curs_y = 0;
   
   BLOCK_INPUT;
-  XClear (s->display.x->window_desc);
+  XClear (FRAME_X_WINDOW (f));
 #ifndef HAVE_X11
-  dumpborder (s, 0);
-#endif
+  dumpborder (f, 0);
+#endif /* HAVE_X11 */
   XFlushQueue ();
   UNBLOCK_INPUT;
 }
 \f
-/* Paint horzontal bars down the screen for a visible bell.
+/* Paint horzontal bars down the frame for a visible bell.
    Note that this may be way too slow on some machines. */
 
-XTflash (s)
-     struct screen *s;
+XTflash (f)
+     struct frame *f;
 {
-  register struct screen_glyphs *active_screen = SCREEN_CURRENT_GLYPHS (s);
+  register struct frame_glyphs *active_frame = FRAME_CURRENT_GLYPHS (f);
   register int i;
   int x, y;
 
-  if (updating_screen != 0)
+  if (updating_frame != 0)
     abort ();
 
   BLOCK_INPUT;
 #ifdef HAVE_X11
 #if 0
-  for (i = s->height * FONT_HEIGHT (s->display.x->font) - 10;
+  for (i = f->height * FONT_HEIGHT (f->display.x->font) - 10;
        i >= 0;    
        i -= 100)          /* Should be NO LOWER than 75 for speed reasons. */
-    XFillRectangle (x_current_display, s->display.x->window_desc,
-                   s->display.x->cursor_gc,
-                   0, i, s->width * FONT_WIDTH (s->display.x->font)
-                   + 2 * s->display.x->internal_border_width, 25);
-#endif
-
-  x = (s->width * FONT_WIDTH (s->display.x->font)) / 4;
-  y = (s->height * FONT_HEIGHT (s->display.x->font)) / 4;
-  XFillRectangle (x_current_display, s->display.x->window_desc,
-                 s->display.x->cursor_gc,
+    XFillRectangle (x_current_display, FRAME_X_WINDOW (f),
+                   f->display.x->cursor_gc,
+                   0, i, f->width * FONT_WIDTH (f->display.x->font)
+                   + 2 * f->display.x->internal_border_width, 25);
+#endif /* ! 0 */
+
+  x = (f->width * FONT_WIDTH (f->display.x->font)) / 4;
+  y = (f->height * FONT_HEIGHT (f->display.x->font)) / 4;
+  XFillRectangle (x_current_display, FRAME_X_WINDOW (f),
+                 f->display.x->cursor_gc,
                  x, y, 2 * x, 2 * y);
-  dumpglyphs (s, (x + s->display.x->internal_border_width),
-            (y + s->display.x->internal_border_width),
-            &active_screen->glyphs[(s->height / 4) + 1][(s->width / 4)],
-            1, 0, s->display.x->font);
+  dumpglyphs (f, (x + f->display.x->internal_border_width),
+            (y + f->display.x->internal_border_width),
+            &active_frame->glyphs[(f->height / 4) + 1][(f->width / 4)],
+            1, 0, f->display.x->font);
 
-#else /* X10 */
-  for (i = s->height * FONT_HEIGHT (s->display.x->font) - 10;
+#else /* ! defined (HAVE_X11) */
+  for (i = f->height * FONT_HEIGHT (f->display.x->font) - 10;
        i >= 0;
        i -= 50)
-    XPixFill (s->display.x->window_desc, 0, i,
-             s->width * FONT_WIDTH (s->display.x->font)
-             + 2 * s->display.x->internal_border_width, 10,
+    XPixFill (FRAME_X_WINDOW (f), 0, i,
+             f->width * FONT_WIDTH (f->display.x->font)
+             + 2 * f->display.x->internal_border_width, 10,
              WHITE_PIX_DEFAULT, ClipModeClipped, GXinvert, AllPlanes);
-#endif /* X10 */
+#endif /* ! defined (HAVE_X11) */
 
   XFlushQueue ();
   UNBLOCK_INPUT;
 }
 
-/* Flip background and forground colors of the screen. */
+/* Flip background and forground colors of the frame. */
 
-x_invert_screen (s)
-     struct screen *s;
+x_invert_frame (f)
+     struct frame *f;
 {
 #ifdef HAVE_X11
   GC temp;
   unsigned long pix_temp;
 
-  x_display_cursor (s, 0);
-  XClearWindow (x_current_display, s->display.x->window_desc);
-  temp = s->display.x->normal_gc;
-  s->display.x->normal_gc = s->display.x->reverse_gc;
-  s->display.x->reverse_gc = temp;
-  pix_temp = s->display.x->foreground_pixel;
-  s->display.x->foreground_pixel = s->display.x->background_pixel;
-  s->display.x->background_pixel = pix_temp;
-
-  XSetWindowBackground (x_current_display, s->display.x->window_desc,
-                       s->display.x->background_pixel);
-  if (s->display.x->background_pixel == s->display.x->cursor_pixel)
+  x_display_cursor (f, 0);
+  XClearWindow (x_current_display, FRAME_X_WINDOW (f));
+  temp = f->display.x->normal_gc;
+  f->display.x->normal_gc = f->display.x->reverse_gc;
+  f->display.x->reverse_gc = temp;
+  pix_temp = f->display.x->foreground_pixel;
+  f->display.x->foreground_pixel = f->display.x->background_pixel;
+  f->display.x->background_pixel = pix_temp;
+
+  XSetWindowBackground (x_current_display, FRAME_X_WINDOW (f),
+                       f->display.x->background_pixel);
+  if (f->display.x->background_pixel == f->display.x->cursor_pixel)
     {
-      s->display.x->cursor_pixel = s->display.x->foreground_pixel;
-      XSetBackground (x_current_display, s->display.x->cursor_gc,
-                     s->display.x->cursor_pixel);
-      XSetForeground (x_current_display, s->display.x->cursor_gc,
-                     s->display.x->background_pixel);
+      f->display.x->cursor_pixel = f->display.x->foreground_pixel;
+      XSetBackground (x_current_display, f->display.x->cursor_gc,
+                     f->display.x->cursor_pixel);
+      XSetForeground (x_current_display, f->display.x->cursor_gc,
+                     f->display.x->background_pixel);
     }
-  redraw_screen (s);
-#endif /* X11 */
+  redraw_frame (f);
+#endif /* ! defined (HAVE_X11) */
 }
 
 /* Make audible bell.  */
 
 #ifdef HAVE_X11
 #define XRINGBELL XBell(x_current_display, 0)
-#else
+#else /* ! defined (HAVE_X11) */
 #define XRINGBELL XFeep(0);
-#endif
+#endif /* ! defined (HAVE_X11) */
 
 XTring_bell ()
 {
   if (visible_bell)
 #if 0
-    XTflash (selected_screen);
-#endif
+    XTflash (selected_frame);
+#endif /* ! 0 */
     {
-      x_invert_screen (selected_screen);
-      x_invert_screen (selected_screen);
+      x_invert_frame (selected_frame);
+      x_invert_frame (selected_frame);
     }
   else
     {
@@ -786,11 +785,11 @@ static
 XTset_terminal_window (n)
      register int n;
 {
-  if (updating_screen == 0)
+  if (updating_frame == 0)
     abort ();
 
-  if ((n <= 0) || (n > updating_screen->height))
-    flexlines = updating_screen->height;
+  if ((n <= 0) || (n > updating_frame->height))
+    flexlines = updating_frame->height;
   else
     flexlines = n;
 }
@@ -804,8 +803,8 @@ stufflines (n)
 {
   register int topregion, bottomregion;
   register int length, newtop, mask;
-  register struct screen *s = updating_screen;
-  int intborder = s->display.x->internal_border_width;
+  register struct frame *f = updating_frame;
+  int intborder = f->display.x->internal_border_width;
 
   if (curs_y >= flexlines)
     return;
@@ -817,29 +816,29 @@ stufflines (n)
 
 #ifndef HAVE_X11
   dumpqueue ();
-#endif
+#endif /* HAVE_X11 */
 
   if ((length > 0) && (newtop <= flexlines))
     {
 #ifdef HAVE_X11
-      XCopyArea (x_current_display, s->display.x->window_desc,
-                s->display.x->window_desc, s->display.x->normal_gc,
-                intborder, topregion * FONT_HEIGHT (s->display.x->font) + intborder,
-                s->width * FONT_WIDTH (s->display.x->font),
-                length * FONT_HEIGHT (s->display.x->font), intborder,
-                newtop * FONT_HEIGHT (s->display.x->font) + intborder);
-#else
-      XMoveArea (s->display.x->window_desc,
-                intborder, topregion * FONT_HEIGHT (s->display.x->font) + intborder,
-                intborder, newtop * FONT_HEIGHT (s->display.x->font) + intborder,
-                s->width * FONT_WIDTH (s->display.x->font),
-                length * FONT_HEIGHT (s->display.x->font));
+      XCopyArea (x_current_display, FRAME_X_WINDOW (f),
+                FRAME_X_WINDOW (f), f->display.x->normal_gc,
+                intborder, topregion * FONT_HEIGHT (f->display.x->font) + intborder,
+                f->width * FONT_WIDTH (f->display.x->font),
+                length * FONT_HEIGHT (f->display.x->font), intborder,
+                newtop * FONT_HEIGHT (f->display.x->font) + intborder);
+#else /* ! defined (HAVE_X11) */
+      XMoveArea (FRAME_X_WINDOW (f),
+                intborder, topregion * FONT_HEIGHT (f->display.x->font) + intborder,
+                intborder, newtop * FONT_HEIGHT (f->display.x->font) + intborder,
+                f->width * FONT_WIDTH (f->display.x->font),
+                length * FONT_HEIGHT (f->display.x->font));
       /* Now we must process any ExposeRegion events that occur
         if the area being copied from is obscured.
         We can't let it wait because further i/d operations
         may want to copy this area to another area.  */
       x_read_exposes ();
-#endif /* HAVE_X11 */
+#endif /* ! defined (HAVE_X11) */
     }
 
   newtop = min (newtop, (flexlines - 1));
@@ -847,18 +846,18 @@ stufflines (n)
   if (length > 0)
     {
 #ifdef HAVE_X11
-      XClearArea (x_current_display, s->display.x->window_desc, intborder, 
-                 topregion * FONT_HEIGHT (s->display.x->font) + intborder,
-                 s->width * FONT_WIDTH (s->display.x->font),
-                 n * FONT_HEIGHT (s->display.x->font), False);
-#else
-      XPixSet (s->display.x->window_desc,
+      XClearArea (x_current_display, FRAME_X_WINDOW (f), intborder, 
+                 topregion * FONT_HEIGHT (f->display.x->font) + intborder,
+                 f->width * FONT_WIDTH (f->display.x->font),
+                 n * FONT_HEIGHT (f->display.x->font), False);
+#else /* ! defined (HAVE_X11) */
+      XPixSet (FRAME_X_WINDOW (f),
               intborder,
-              topregion * FONT_HEIGHT (s->display.x->font) + intborder,
-              s->width * FONT_WIDTH (s->display.x->font),
-              n * FONT_HEIGHT (s->display.x->font),
-              s->display.x->background_pixel);
-#endif /* HAVE_X11 */
+              topregion * FONT_HEIGHT (f->display.x->font) + intborder,
+              f->width * FONT_WIDTH (f->display.x->font),
+              n * FONT_HEIGHT (f->display.x->font),
+              f->display.x->background_pixel);
+#endif /* ! defined (HAVE_X11) */
     }
 }
 
@@ -870,66 +869,66 @@ scraplines (n)
      register int n;
 {
   int mask;
-  register struct screen *s = updating_screen;
-  int intborder = s->display.x->internal_border_width;
+  register struct frame *f = updating_frame;
+  int intborder = f->display.x->internal_border_width;
 
   if (curs_y >= flexlines)
     return;
 
 #ifndef HAVE_X11
   dumpqueue ();
-#endif
+#endif /* HAVE_X11 */
 
   if ((curs_y + n) >= flexlines)
     {
       if (flexlines >= (curs_y + 1))
        {
 #ifdef HAVE_X11
-         XClearArea (x_current_display, s->display.x->window_desc, intborder,
-                     curs_y * FONT_HEIGHT (s->display.x->font) + intborder,
-                     s->width * FONT_WIDTH (s->display.x->font),
-                     (flexlines - curs_y) * FONT_HEIGHT (s->display.x->font), False);
-#else
-         XPixSet (s->display.x->window_desc,
-                  intborder, curs_y * FONT_HEIGHT (s->display.x->font) + intborder,
-                  s->width * FONT_WIDTH (s->display.x->font),
-                  (flexlines - curs_y) * FONT_HEIGHT (s->display.x->font),
-                  s->display.x->background_pixel);
-#endif /* HAVE_X11 */
+         XClearArea (x_current_display, FRAME_X_WINDOW (f), intborder,
+                     curs_y * FONT_HEIGHT (f->display.x->font) + intborder,
+                     f->width * FONT_WIDTH (f->display.x->font),
+                     (flexlines - curs_y) * FONT_HEIGHT (f->display.x->font), False);
+#else /* ! defined (HAVE_X11) */
+         XPixSet (FRAME_X_WINDOW (f),
+                  intborder, curs_y * FONT_HEIGHT (f->display.x->font) + intborder,
+                  f->width * FONT_WIDTH (f->display.x->font),
+                  (flexlines - curs_y) * FONT_HEIGHT (f->display.x->font),
+                  f->display.x->background_pixel);
+#endif /* ! defined (HAVE_X11) */
        }
     }
   else
     {
 #ifdef HAVE_X11
-      XCopyArea (x_current_display, s->display.x->window_desc,
-                s->display.x->window_desc, s->display.x->normal_gc,
+      XCopyArea (x_current_display, FRAME_X_WINDOW (f),
+                FRAME_X_WINDOW (f), f->display.x->normal_gc,
                 intborder,
-                (curs_y + n) * FONT_HEIGHT (s->display.x->font) + intborder,
-                s->width * FONT_WIDTH (s->display.x->font),
-                (flexlines - (curs_y + n)) * FONT_HEIGHT (s->display.x->font),
-                intborder, curs_y * FONT_HEIGHT (s->display.x->font) + intborder);
-      XClearArea (x_current_display, s->display.x->window_desc,
+                (curs_y + n) * FONT_HEIGHT (f->display.x->font) + intborder,
+                f->width * FONT_WIDTH (f->display.x->font),
+                (flexlines - (curs_y + n)) * FONT_HEIGHT (f->display.x->font),
+                intborder, curs_y * FONT_HEIGHT (f->display.x->font) + intborder);
+      XClearArea (x_current_display, FRAME_X_WINDOW (f),
                  intborder,
-                 (flexlines - n) * FONT_HEIGHT (s->display.x->font) + intborder,
-                 s->width * FONT_WIDTH (s->display.x->font),
-                 n * FONT_HEIGHT (s->display.x->font), False);
-#else
-      XMoveArea (s->display.x->window_desc,
+                 (flexlines - n) * FONT_HEIGHT (f->display.x->font) + intborder,
+                 f->width * FONT_WIDTH (f->display.x->font),
+                 n * FONT_HEIGHT (f->display.x->font), False);
+#else /* ! defined (HAVE_X11) */
+      XMoveArea (FRAME_X_WINDOW (f),
                 intborder,
-                (curs_y + n) * FONT_HEIGHT (s->display.x->font) + intborder,
-                intborder, curs_y * FONT_HEIGHT (s->display.x->font) + intborder,
-                s->width * FONT_WIDTH (s->display.x->font),
-                (flexlines - (curs_y + n)) * FONT_HEIGHT (s->display.x->font));
+                (curs_y + n) * FONT_HEIGHT (f->display.x->font) + intborder,
+                intborder, curs_y * FONT_HEIGHT (f->display.x->font) + intborder,
+                f->width * FONT_WIDTH (f->display.x->font),
+                (flexlines - (curs_y + n)) * FONT_HEIGHT (f->display.x->font));
       /* Now we must process any ExposeRegion events that occur
         if the area being copied from is obscured.
         We can't let it wait because further i/d operations
         may want to copy this area to another area.  */
       x_read_exposes ();
-      XPixSet (s->display.x->window_desc, intborder,
-              (flexlines - n) * FONT_HEIGHT (s->display.x->font) + intborder,
-              s->width * FONT_WIDTH (s->display.x->font),
-              n * FONT_HEIGHT (s->display.x->font), s->display.x->background_pixel);
-#endif /* HAVE_X11 */
+      XPixSet (FRAME_X_WINDOW (f), intborder,
+              (flexlines - n) * FONT_HEIGHT (f->display.x->font) + intborder,
+              f->width * FONT_WIDTH (f->display.x->font),
+              n * FONT_HEIGHT (f->display.x->font), f->display.x->background_pixel);
+#endif /* ! defined (HAVE_X11) */
     }
 }
 
@@ -939,11 +938,11 @@ scraplines (n)
 XTins_del_lines (vpos, n)
      int vpos, n;
 {
-  if (updating_screen == 0)
+  if (updating_frame == 0)
     abort ();
 
   /* Hide the cursor.  */
-  x_display_cursor (updating_screen, 0);
+  x_display_cursor (updating_frame, 0);
 
   XTcursor_to (vpos, 0);
 
@@ -958,26 +957,26 @@ XTins_del_lines (vpos, n)
 \f
 static void clear_cursor ();
 
-/* Output into a rectangle of an X-window (for screen S)
-   the characters in s->phys_lines that overlap that rectangle.
+/* Output into a rectangle of an X-window (for frame F)
+   the characters in f->phys_lines that overlap that rectangle.
    TOP and LEFT are the position of the upper left corner of the rectangle.
    ROWS and COLS are the size of the rectangle.  */
 
 static void
-dumprectangle (s, left, top, cols, rows)
-     struct screen *s;
+dumprectangle (f, left, top, cols, rows)
+     struct frame *f;
      register int left, top, cols, rows;
 {
-  register struct screen_glyphs *active_screen = SCREEN_CURRENT_GLYPHS (s);
+  register struct frame_glyphs *active_frame = FRAME_CURRENT_GLYPHS (f);
   int cursor_cleared = 0;
   int bottom, right;
   register int y;
 
-  if (SCREEN_GARBAGED_P (s))
+  if (FRAME_GARBAGED_P (f))
     return;
 
-  top -= s->display.x->internal_border_width;
-  left -= s->display.x->internal_border_width;
+  top -= f->display.x->internal_border_width;
+  left -= f->display.x->internal_border_width;
 
   /* Express rectangle as four edges, instead of position-and-size.  */
   bottom = top + rows;
@@ -987,29 +986,29 @@ dumprectangle (s, left, top, cols, rows)
   /* If the rectangle includes any of the internal border area,
      redisplay the border emphasis.  */
   if (top < 0 || left < 0
-      || bottom > s->height * FONT_HEIGHT (s->display.x->font)
-      || right > s->width * FONT_WIDTH (s->display.x->font))
-    dumpborder (s, 0);
-#endif /* HAVE_X11 */
+      || bottom > f->height * FONT_HEIGHT (f->display.x->font)
+      || right > f->width * FONT_WIDTH (f->display.x->font))
+    dumpborder (f, 0);
+#endif /* HAVE_X11             /* Window manger does this for X11. */ */
   
   /* Convert rectangle edges in pixels to edges in chars.
      Round down for left and top, up for right and bottom.  */
-  top /= FONT_HEIGHT (s->display.x->font);
-  left /= FONT_WIDTH (s->display.x->font);
-  bottom += (FONT_HEIGHT (s->display.x->font) - 1);
-  right += (FONT_WIDTH (s->display.x->font) - 1);
-  bottom /= FONT_HEIGHT (s->display.x->font);
-  right /= FONT_WIDTH (s->display.x->font);
+  top /= FONT_HEIGHT (f->display.x->font);
+  left /= FONT_WIDTH (f->display.x->font);
+  bottom += (FONT_HEIGHT (f->display.x->font) - 1);
+  right += (FONT_WIDTH (f->display.x->font) - 1);
+  bottom /= FONT_HEIGHT (f->display.x->font);
+  right /= FONT_WIDTH (f->display.x->font);
 
   /* Clip the rectangle to what can be visible.  */
   if (left < 0)
     left = 0;
   if (top < 0)
     top = 0;
-  if (right > s->width)
-    right = s->width;
-  if (bottom > s->height)
-    bottom = s->height;
+  if (right > f->width)
+    right = f->width;
+  if (bottom > f->height)
+    bottom = f->height;
 
   /* Get size in chars of the rectangle.  */
   cols = right - left;
@@ -1021,10 +1020,10 @@ dumprectangle (s, left, top, cols, rows)
 
   /* Turn off the cursor if it is in the rectangle.
      We will turn it back on afterward.  */
-  if ((s->phys_cursor_x >= left) && (s->phys_cursor_x < right)
-      && (s->phys_cursor_y >= top) && (s->phys_cursor_y < bottom))
+  if ((f->phys_cursor_x >= left) && (f->phys_cursor_x < right)
+      && (f->phys_cursor_y >= top) && (f->phys_cursor_y < bottom))
     {
-      clear_cursor (s);
+      clear_cursor (f);
       cursor_cleared = 1;
     }
 
@@ -1032,24 +1031,24 @@ dumprectangle (s, left, top, cols, rows)
 
   for (y = top; y < bottom; y++)
     {
-      GLYPH *line = &active_screen->glyphs[y][left];
+      GLYPH *line = &active_frame->glyphs[y][left];
 
-      if (! active_screen->enable[y] || left > active_screen->used[y])
+      if (! active_frame->enable[y] || left > active_frame->used[y])
        continue;
 
-      dumpglyphs (s,
-                (left * FONT_WIDTH (s->display.x->font)
-                 + s->display.x->internal_border_width),
-                (y * FONT_HEIGHT (s->display.x->font)
-                 + s->display.x->internal_border_width),
-                line, min (cols, active_screen->used[y] - left),
-                active_screen->highlight[y], s->display.x->font);
+      dumpglyphs (f,
+                (left * FONT_WIDTH (f->display.x->font)
+                 + f->display.x->internal_border_width),
+                (y * FONT_HEIGHT (f->display.x->font)
+                 + f->display.x->internal_border_width),
+                line, min (cols, active_frame->used[y] - left),
+                active_frame->highlight[y], f->display.x->font);
     }
 
   /* Turn the cursor on if we turned it off.  */
 
   if (cursor_cleared)
-    x_display_cursor (s, 1);
+    x_display_cursor (f, 1);
 }
 
 #ifndef HAVE_X11
@@ -1063,71 +1062,71 @@ dumpqueue ()
 
   while (dequeue_event (&r, &x_expose_queue))
     {
-      struct screen *s = x_window_to_screen (r.window);
-      if (s->display.x->icon_desc == r.window)
-       refreshicon (s);
+      struct frame *f = x_window_to_frame (r.window);
+      if (f->display.x->icon_desc == r.window)
+       refreshicon (f);
       else
-       dumprectangle (s, r.x, r.y, r.width, r.height);
+       dumprectangle (f, r.x, r.y, r.width, r.height);
     }
   XFlushQueue ();
 }
-#endif
+#endif /* HAVE_X11 */
 \f
 /* Process all expose events that are pending.
-   Redraws the cursor if necessary on any screen that
-   is not in the process of being updated with update_screen.  */
+   Redraws the cursor if necessary on any frame that
+   is not in the process of being updated with update_frame.  */
 
 static void
 x_do_pending_expose ()
 {
   int mask;
-  struct screen *s;
-  Lisp_Object tail, screen;
+  struct frame *f;
+  Lisp_Object tail, frame;
 
   if (expose_all_windows)
     {
       expose_all_windows = 0;
-      for (tail = Vscreen_list; CONSP (tail); tail = XCONS (tail)->cdr)
+      for (tail = Vframe_list; CONSP (tail); tail = XCONS (tail)->cdr)
        {
          register int temp_width, temp_height;
          int intborder;
 
-         screen = XCONS (tail)->car;
-         if (XTYPE (screen) != Lisp_Screen)
+         frame = XCONS (tail)->car;
+         if (XTYPE (frame) != Lisp_Frame)
            continue;
-         s = XSCREEN (screen);
-         if (! SCREEN_IS_X (s))
+         f = XFRAME (frame);
+         if (! FRAME_X_P (f))
            continue;
-         if (!s->visible)
+         if (!f->visible)
            continue;
-         if (!s->display.x->needs_exposure)
+         if (!f->display.x->needs_exposure)
            continue;
 
-         intborder = s->display.x->internal_border_width;
+         intborder = f->display.x->internal_border_width;
 
-         clear_cursor (s);
-         XGetWindowInfo (s->display.x->window_desc, &windowinfo);
+         clear_cursor (f);
+         XGetWindowInfo (FRAME_X_WINDOW (f), &windowinfo);
          temp_width = ((windowinfo.width - 2 * intborder
-                        - s->display.x->v_scrollbar_width)
-                       / FONT_WIDTH (s->display.x->font));
+                        - f->display.x->v_scrollbar_width)
+                       / FONT_WIDTH (f->display.x->font));
          temp_height = ((windowinfo.height- 2 * intborder
-                         - s->display.x->h_scrollbar_height)
-                        / FONT_HEIGHT (s->display.x->font));
-         if (temp_width != s->width || temp_height != s->height)
+                         - f->display.x->h_scrollbar_height)
+                        / FONT_HEIGHT (f->display.x->font));
+         if (temp_width != f->width || temp_height != f->height)
            {
-             change_screen_size (s, max (1, temp_height),
-                                 max (1, temp_width), 0);
-             x_resize_scrollbars (s);
+             change_frame_size (f, max (1, temp_height),
+                                 max (1, temp_width), 0, 1);
+             x_resize_scrollbars (f);
            }
-         s->display.x->left_pos = windowinfo.x;
-         s->display.x->top_pos = windowinfo.y;
-         dumprectangle (s, 0, 0, PIXEL_WIDTH (s), PIXEL_HEIGHT (s));
+         f->display.x->left_pos = windowinfo.x;
+         f->display.x->top_pos = windowinfo.y;
+         dumprectangle (f, 0, 0, PIXEL_WIDTH (f), PIXEL_HEIGHT (f));
 #if 0
-         dumpborder (s, 0);
-#endif
-         s->display.x->needs_exposure = 0;
-         if (updating_screen != s)
-           x_display_cursor (s, 1);
+         dumpborder (f, 0);
+#endif /* ! 0 */
+         f->display.x->needs_exposure = 0;
+         if (updating_frame != f)
+           x_display_cursor (f, 1);
          XFlushQueue ();
        }
     }
@@ -1136,140 +1135,140 @@ x_do_pending_expose ()
        for various windows.  */
 #ifdef HAVE_X11
     ;
-#else
+#else /* ! defined (HAVE_X11) */
     dumpqueue ();
-#endif
+#endif /* ! defined (HAVE_X11) */
 }
 
 #ifdef HAVE_X11
 static void
-screen_highlight (screen)
-     struct screen *screen;
+frame_highlight (frame)
+     struct frame *frame;
 {
   if (! EQ (Vx_no_window_manager, Qnil))
-    XSetWindowBorder (x_current_display, screen->display.x->window_desc,
-                     screen->display.x->border_pixel);
-  x_display_cursor (screen, 1);
+    XSetWindowBorder (x_current_display, FRAME_X_WINDOW (frame),
+                     frame->display.x->border_pixel);
+  x_display_cursor (frame, 1);
 }
 
 static void
-screen_unhighlight (screen)
-     struct screen *screen;
+frame_unhighlight (frame)
+     struct frame *frame;
 {
   if (! EQ (Vx_no_window_manager, Qnil))
-    XSetWindowBorderPixmap (x_current_display, screen->display.x->window_desc,
-                           screen->display.x->border_tile);
-  x_display_cursor (screen, 1);
+    XSetWindowBorderPixmap (x_current_display, FRAME_X_WINDOW (frame),
+                           frame->display.x->border_tile);
+  x_display_cursor (frame, 1);
 }
-#else  /* X10 */
-/* Dump the border-emphasis of screen S.
-   If S is selected, this is a lining of the same color as the border,
+#else /* ! defined (HAVE_X11) */
+/* Dump the border-emphasis of frame F.
+   If F is selected, this is a lining of the same color as the border,
    just within the border, occupying a portion of the internal border.
-   If S is not selected, it is background in the same place.
+   If F is not selected, it is background in the same place.
    If ALWAYS is 0, don't bother explicitly drawing if it's background.
 
-   ALWAYS = 1 is used when a screen becomes selected or deselected.
+   ALWAYS = 1 is used when a frame becomes selected or deselected.
    In that case, we also turn the cursor off and on again
    so it will appear in the proper shape (solid if selected; else hollow.)  */
 
 static void
-dumpborder (s, always)
-     struct screen *s;
+dumpborder (f, always)
+     struct frame *f;
      int always;
 {
-  int thickness = s->display.x->internal_border_width / 2;
-  int width = PIXEL_WIDTH (s);
-  int height = PIXEL_HEIGHT (s);
+  int thickness = f->display.x->internal_border_width / 2;
+  int width = PIXEL_WIDTH (f);
+  int height = PIXEL_HEIGHT (f);
   int pixel;
 
-  if (s != selected_screen)
+  if (f != selected_frame)
     {
       if (!always)
        return;
 
-      pixel = s->display.x->background_pixel;
+      pixel = f->display.x->background_pixel;
     }
   else
     {
-      pixel = s->display.x->border_pixel;
+      pixel = f->display.x->border_pixel;
     }
 
-  XPixSet (s->display.x->window_desc, 0, 0, width, thickness, pixel);
-  XPixSet (s->display.x->window_desc, 0, 0, thickness, height, pixel);
-  XPixSet (s->display.x->window_desc, 0, height - thickness, width,
+  XPixSet (FRAME_X_WINDOW (f), 0, 0, width, thickness, pixel);
+  XPixSet (FRAME_X_WINDOW (f), 0, 0, thickness, height, pixel);
+  XPixSet (FRAME_X_WINDOW (f), 0, height - thickness, width,
           thickness, pixel);
-  XPixSet (s->display.x->window_desc, width - thickness, 0, thickness,
+  XPixSet (FRAME_X_WINDOW (f), width - thickness, 0, thickness,
           height, pixel);
 
   if (always)
-    x_display_cursor (s, 1);
+    x_display_cursor (f, 1);
 }
-#endif /* X10 */
+#endif /* ! defined (HAVE_X11) */
 
-static void XTscreen_rehighlight ();
+static void XTframe_rehighlight ();
 
-/* The focus has changed.  Update the screens as necessary to reflect
-   the new situation.  Note that we can't change the selected screen
+/* The focus has changed.  Update the frames as necessary to reflect
+   the new situation.  Note that we can't change the selected frame
    here, because the lisp code we are interrupting might become confused.
-   Each event gets marked with the screen in which it occured, so the
+   Each event gets marked with the frame in which it occured, so the
    lisp code can tell when the switch took place by examining the events.  */
 
 static void
-x_new_focus_screen (screen)
-     struct screen *screen;
+x_new_focus_frame (frame)
+     struct frame *frame;
 {
-  struct screen *old_focus = x_focus_screen;
+  struct frame *old_focus = x_focus_frame;
   int events_enqueued = 0;
 
-  if (screen != x_focus_screen)
+  if (frame != x_focus_frame)
     {
       /* Set this before calling other routines, so that they see 
-        the correct value of x_focus_screen.  */
-      x_focus_screen = screen;
+        the correct value of x_focus_frame.  */
+      x_focus_frame = frame;
 
       if (old_focus && old_focus->auto_lower)
-       x_lower_screen (old_focus);
+       x_lower_frame (old_focus);
 
 #if 0
-      selected_screen = screen;
-      XSET (XWINDOW (selected_screen->selected_window)->screen,
-           Lisp_Screen, selected_screen);
-      Fselect_window (selected_screen->selected_window);
-      choose_minibuf_screen ();
-#endif
-
-      if (x_focus_screen && x_focus_screen->auto_raise)
-       x_raise_screen (x_focus_screen);
+      selected_frame = frame;
+      XSET (XWINDOW (selected_frame->selected_window)->frame,
+           Lisp_Frame, selected_frame);
+      Fselect_window (selected_frame->selected_window);
+      choose_minibuf_frame ();
+#endif /* ! 0 */
+
+      if (x_focus_frame && x_focus_frame->auto_raise)
+       x_raise_frame (x_focus_frame);
     }
 
-  XTscreen_rehighlight ();
+  XTframe_rehighlight ();
 }
 
 
-/* The focus has changed, or we have make a screen's selected window
-   point to a window on a different screen (this happens with global
-   minibuffer screens).  Shift the highlight as appropriate.  */
+/* The focus has changed, or we have make a frame's selected window
+   point to a window on a different frame (this happens with global
+   minibuffer frames).  Shift the highlight as appropriate.  */
 static void
-XTscreen_rehighlight ()
+XTframe_rehighlight ()
 {
-  struct screen *old_highlight = x_highlight_screen;
+  struct frame *old_highlight = x_highlight_frame;
 
-  if (x_focus_screen)
+  if (x_focus_frame)
     {
-      x_highlight_screen = XSCREEN (SCREEN_FOCUS_SCREEN (x_focus_screen));
-      if (x_highlight_screen->display.nothing == 0)
-       XSET (SCREEN_FOCUS_SCREEN (x_focus_screen), Lisp_Screen,
-             (x_highlight_screen = x_focus_screen));
+      x_highlight_frame = XFRAME (FRAME_FOCUS_FRAME (x_focus_frame));
+      if (x_highlight_frame->display.nothing == 0)
+       XSET (FRAME_FOCUS_FRAME (x_focus_frame), Lisp_Frame,
+             (x_highlight_frame = x_focus_frame));
     }
   else
-    x_highlight_screen = 0;
+    x_highlight_frame = 0;
 
-  if (x_highlight_screen != old_highlight)
+  if (x_highlight_frame != old_highlight)
     {
       if (old_highlight)
-       screen_unhighlight (old_highlight);
-      if (x_highlight_screen)
-       screen_highlight (x_highlight_screen);
+       frame_unhighlight (old_highlight);
+      if (x_highlight_frame)
+       frame_highlight (x_highlight_frame);
     }
 }
 \f
@@ -1293,7 +1292,7 @@ extern Lisp_Object Qmodeline_part, Qtext_part;
 
 #if 0
 /* Set *RESULT to an emacs input_event corresponding to MOTION_EVENT.
-   S is the screen in which the event occurred.
+   F is the frame in which the event occurred.
 
    WINDOW_TYPE says whether the event happened in a scrollbar window
    or a text window, affecting the format of the event created.
@@ -1305,10 +1304,10 @@ extern Lisp_Object Qmodeline_part, Qtext_part;
    don't return an event; set result->kind to no_event.  */
 
 static void
-notice_mouse_movement (result, motion_event, s, window_type, part)
+notice_mouse_movement (result, motion_event, f, window_type, part)
      struct input_event *result;
      XMotionEvent motion_event;
-     struct screen *s;
+     struct frame *f;
      int window_type;
      Lisp_Object part;
 {
@@ -1320,7 +1319,7 @@ notice_mouse_movement (result, motion_event, s, window_type, part)
   result->kind = no_event;
   
   if (XQueryPointer (x_current_display,
-                    s->display.x->window_desc,
+                    FRAME_X_WINDOW (f),
                     &root_window, &w,
                     &root_x, &root_y, &pix_x, &pix_y,
                     &keys_and_buttons)
@@ -1330,9 +1329,9 @@ notice_mouse_movement (result, motion_event, s, window_type, part)
 #if 0
   if (w == None)   /* Mouse no longer in window. */
     return Qnil;
-#endif
+#endif /* ! 0 */
 
-  pixel_to_glyph_translation (s, pix_x, pix_y, &x, &y);
+  pixel_to_glyph_translation (f, pix_x, pix_y, &x, &y);
   if (x == x_mouse_x && y == x_mouse_y)
     return;
 
@@ -1344,7 +1343,7 @@ notice_mouse_movement (result, motion_event, s, window_type, part)
     {
       int modeline_p;
 
-      Vmouse_window = window_from_coordinates (s, x, y, &modeline_p);
+      Vmouse_window = window_from_coordinates (f, x, y, &modeline_p);
 
       if (XTYPE (Vmouse_window) == Lisp_Window)
        mouse_buffer_offset
@@ -1353,11 +1352,11 @@ notice_mouse_movement (result, motion_event, s, window_type, part)
        mouse_buffer_offset = 0;
 
       if (EQ (Vmouse_window, Qnil))
-       Vmouse_screen_part = Qnil;
+       Vmouse_frame_part = Qnil;
       else if (modeline_p)
-       Vmouse_screen_part = Qmodeline_part;
+       Vmouse_frame_part = Qmodeline_part;
       else
-       Vmouse_screen_part = Qtext_part;
+       Vmouse_frame_part = Qtext_part;
       
       result->kind = window_sys_event;
       result->code = Qmouse_moved;
@@ -1366,9 +1365,9 @@ notice_mouse_movement (result, motion_event, s, window_type, part)
     }
   else if (window_type == scrollbar_window)  /* Scrollbar */
     {
-      Vmouse_window = s->selected_window;
+      Vmouse_window = f->selected_window;
       mouse_buffer_offset = 0;
-      Vmouse_screen_part = part;
+      Vmouse_frame_part = part;
 
       result->kind = window_sys_event;
       result->code = Qmouse_moved;
@@ -1378,25 +1377,25 @@ notice_mouse_movement (result, motion_event, s, window_type, part)
 
   return;
 }
-#endif
+#endif /* ! 0 */
 
 \f
 /* Mouse clicks and mouse movement.  Rah.  */
 #ifdef HAVE_X11
 
-/* Given a pixel position (PIX_X, PIX_Y) on the screen S, return
+/* Given a pixel position (PIX_X, PIX_Y) on the frame F, return
    glyph co-ordinates in (*X, *Y).  Set *BOUNDS to the rectangle
    that the glyph at X, Y occupies, if BOUNDS != 0.  */
 static void
-pixel_to_glyph_coords (s, pix_x, pix_y, x, y, bounds)
-     SCREEN_PTR s;
+pixel_to_glyph_coords (f, pix_x, pix_y, x, y, bounds)
+     FRAME_PTR f;
      register unsigned int pix_x, pix_y;
      register int *x, *y;
      XRectangle *bounds;
 {
-  int ibw = s->display.x->internal_border_width;
+  int ibw = f->display.x->internal_border_width;
   int width, height;
-  FONT_TYPE *font = s->display.x->font;
+  FONT_TYPE *font = f->display.x->font;
 
   width = FONT_WIDTH (font);
   height = FONT_HEIGHT (font);
@@ -1404,16 +1403,16 @@ pixel_to_glyph_coords (s, pix_x, pix_y, x, y, bounds)
   /* What line is it on?  */
   if (pix_y < ibw)
     *y = 0;
-  else if (pix_y > s->display.x->pixel_height - ibw)
-    *y = SCREEN_HEIGHT (s) - 1;
+  else if (pix_y > f->display.x->pixel_height - ibw)
+    *y = FRAME_HEIGHT (f) - 1;
   else
     *y = (pix_y - ibw) / height;
 
   /* And what column?  */
   if (pix_x < ibw)
     *x = 0;
-  else if (pix_x > s->display.x->pixel_width - ibw)
-    *x = SCREEN_WIDTH (s) - 1;
+  else if (pix_x > f->display.x->pixel_width - ibw)
+    *x = FRAME_WIDTH (f) - 1;
   else
     *x = (pix_x - ibw) / width;
 
@@ -1429,19 +1428,110 @@ pixel_to_glyph_coords (s, pix_x, pix_y, x, y, bounds)
 /* Any buttons grabbed. */
 unsigned int x_mouse_grabbed;
 
+/* Which modifier keys are on which modifier bits?
+
+   With each keystroke, X returns eight bits indicating which modifier
+   keys were held down when the key was pressed.  The interpretation
+   of the top five modifier bits depends on what keys are attached
+   to them.  If the Meta_L and Meta_R keysyms are on mod5, then mod5
+   is the meta bit.
+   
+   x_meta_mod_mask is a mask containing the bits used for the meta key.
+   It may have more than one bit set, if more than one modifier bit
+   has meta keys on it.  Basically, if EVENT is a KeyPress event,
+   the meta key is pressed if (EVENT.state & x_meta_mod_mask) != 0.  
+
+   x_shift_lock_mask is LockMask if the XK_Shift_Lock keysym is on the
+   lock modifier bit, or zero otherwise.  Non-alphabetic keys should
+   only be affected by the lock modifier bit if XK_Shift_Lock is in
+   use; XK_Caps_Lock should only affect alphabetic keys.  With this
+   arrangement, the lock modifier should shift the character if
+   (EVENT.state & x_shift_lock_mask) != 0.  */
+static int x_meta_mod_mask, x_shift_lock_mask;
+
+/* Initialize mode_switch_bit and modifier_meaning.  */
+static void
+x_find_modifier_meanings ()
+{
+  int min_code, max_code;
+  KeySym *syms;
+  int syms_per_code;
+  XModifierKeymap *mods;
+  int alt_mod_mask = 0;
+
+  x_meta_mod_mask = 0;
+  x_shift_lock_mask = 0;
+  
+  XDisplayKeycodes (x_current_display, &min_code, &max_code);
+  syms = XGetKeyboardMapping (x_current_display,
+                             min_code, max_code - min_code + 1,
+                             &syms_per_code);
+  mods = XGetModifierMapping (x_current_display);
+
+  /* Scan the modifier table to see which modifier bits the Meta and 
+     Alt keysyms are on.  */
+  {
+    int row, col;      /* The row and column in the modifier table. */
+
+    for (row = 3; row < 8; row++)
+      for (col = 0; col < mods->max_keypermod; col++)
+       {
+         KeyCode code =
+           mods->modifiermap[(row * mods->max_keypermod) + col];
+
+         /* Are any of this keycode's keysyms a meta key?  */
+         {
+           int code_col;
+
+           for (code_col = 0; code_col < syms_per_code; code_col++)
+             {
+               int sym = syms[((code - min_code) * syms_per_code) + code_col];
+
+               switch (sym)
+                 {
+                 case XK_Meta_L:
+                 case XK_Meta_R:
+                   x_meta_mod_mask |= (1 << row);
+                   break;
+
+                 case XK_Alt_L:
+                 case XK_Alt_R:
+                   alt_mod_mask |= (1 << row);
+                   break;
+
+                 case XK_Shift_Lock:
+                   /* Ignore this if it's not on the lock modifier.  */
+                   if ((1 << row) == LockMask)
+                     x_shift_lock_mask = LockMask;
+                   break;
+                 }
+             }
+         }
+       }
+  }
+
+  /* If we couldn't find any meta keys, accept any alt keys as meta keys.  */
+  if (! x_meta_mod_mask)
+    x_meta_mod_mask = alt_mod_mask;
+
+  XFree ((char *) syms);
+  XFreeModifiermap (mods);
+}
+
+
 /* Convert a set of X modifier bits to the proper form for a
    struct input_event modifiers value.  */
 
-static Lisp_Object
+static unsigned int
 x_convert_modifiers (state)
      unsigned int state;
 {
-  return (  ((state & (ShiftMask | LockMask)) ? shift_modifier : 0)
-         | ((state & ControlMask)            ? ctrl_modifier  : 0)
-         | ((state & Mod1Mask)               ? meta_modifier  : 0));
+  return (  ((state & (ShiftMask | x_shift_lock_mask)) ? shift_modifier : 0)
+         | ((state & ControlMask)                     ? ctrl_modifier  : 0)
+         | ((state & x_meta_mod_mask)                 ? meta_modifier  : 0));
 }
 
-extern struct screen *x_window_to_scrollbar ();
+extern struct frame *x_window_to_scrollbar ();
 extern Lisp_Object Vmouse_event;
 
 /* Prepare a mouse-event in *RESULT for placement in the input queue.
@@ -1453,10 +1543,10 @@ extern Lisp_Object Vmouse_event;
    otherwise it happened in a scrollbar. */
 
 static Lisp_Object
-construct_mouse_click (result, event, s, part, prefix)
+construct_mouse_click (result, event, f, part, prefix)
      struct input_event *result;
      XButtonEvent *event;
-     struct screen *s;
+     struct frame *f;
      int prefix;
      Lisp_Object part;
 {
@@ -1467,7 +1557,9 @@ construct_mouse_click (result, event, s, part, prefix)
   XSET (result->code, Lisp_Int, event->button);
   result->timestamp = event->time;
   result->modifiers = (x_convert_modifiers (event->state)
-                      | (event->type == ButtonRelease ? up_modifier : 0));
+                      | (event->type == ButtonRelease
+                         ? up_modifier 
+                         : down_modifier));
 
   /* Notice if the mouse is still grabbed.  */
   if (event->type == ButtonPress)
@@ -1483,32 +1575,32 @@ construct_mouse_click (result, event, s, part, prefix)
        Vmouse_depressed = Qnil;
     }
 
-  if (part)                    /* Scrollbar event */
+  if (! NILP (part))           /* Scrollbar event */
     {
       int pos, len;
 
-      pos = event->y - (s->display.x->v_scrollbar_width - 2);
-      XSET (x_mouse_x, Lisp_Int, pos);
-      len = ((FONT_HEIGHT (s->display.x->font) * s->height)
-            + s->display.x->internal_border_width
-            - (2 * (s->display.x->v_scrollbar_width - 2)));
-      XSET (x_mouse_y, Lisp_Int, len);
+      pos = event->y - (f->display.x->v_scrollbar_width - 2);
+      x_mouse_x = pos;
+      len = ((FONT_HEIGHT (f->display.x->font) * f->height)
+            + f->display.x->internal_border_width
+            - (2 * (f->display.x->v_scrollbar_width - 2)));
+      x_mouse_y = len;
 
       result->kind = scrollbar_click;
       result->part = part;
-      XSET (result->x, Lisp_Int, (s->display.x->top_pos - event->y));
-      XSET (result->y, Lisp_Int, s->display.x->pixel_height);
-      result->screen = s;
+      XSET (result->x, Lisp_Int, (f->display.x->top_pos - event->y));
+      XSET (result->y, Lisp_Int, f->display.x->pixel_height);
+      result->frame = f;
     }
   else                         /* Text Window Event */
     {
       int row, column;
 
-      pixel_to_glyph_coords (s, event->x, event->y, &column, &row, NULL);
+      pixel_to_glyph_coords (f, event->x, event->y, &column, &row, NULL);
       result->kind = mouse_click;
-      result->x = column;
-      result->y = row;
-      result->screen = s;
+      XFASTINT (result->x) = column;
+      XFASTINT (result->y) = row;
+      result->frame = f;
     }
 }
 
@@ -1533,7 +1625,7 @@ construct_mouse_click (result, event, s, part, prefix)
    the server, which is very important.  */
 
 /* Where the mouse was last time we reported a mouse event.  */
-static SCREEN_PTR last_mouse_screen;
+static FRAME_PTR last_mouse_frame;
 static XRectangle last_mouse_glyph;
 
 /* This is a hack.  We would really prefer that XTmouse_position would
@@ -1552,8 +1644,8 @@ static Time last_mouse_movement_time;
    the mainstream emacs code by setting mouse_moved.  If not, ask for
    another motion event, so we can check again the next time it moves.  */
 static void
-note_mouse_position (screen, event)
-     SCREEN_PTR screen;
+note_mouse_position (frame, event)
+     FRAME_PTR frame;
      XMotionEvent *event;
 
 {
@@ -1587,8 +1679,8 @@ note_mouse_position (screen, event)
    */
 
 static void
-XTmouse_position (s, x, y, time)
-     SCREEN_PTR *s;
+XTmouse_position (f, x, y, time)
+     FRAME_PTR *f;
      Lisp_Object *x, *y;
      unsigned long *time;
 {
@@ -1602,12 +1694,12 @@ XTmouse_position (s, x, y, time)
      innermost window containing the mouse.  
 
   /* There doesn't seem to be any way to just get the innermost window
-     containing the pointer, no matter what X screen it's on; you have
+     containing the pointer, no matter what X frame it's on; you have
      to guess a window, and then X will tell you which one of that
      window's children it's in.  If the pointer isn't in any of that
      window's children, it gives you a root window that contains it.
 
-     So we start with the selected screen's window and chase down
+     So we start with the selected frame's window and chase down
      branches under the guidance of XQueryPointer until we hit a leaf
      (all of the Emacs windows we care about are leaf windows).  If at
      any time XQueryPointer returns false, that means that the current
@@ -1615,7 +1707,7 @@ XTmouse_position (s, x, y, time)
      so we start with the root window XQueryPointer has given us and
      start again.  */
 
-  guess = selected_screen->display.x->window_desc;
+  guess = FRAME_X_WINDOW (selected_frame);
   for (;;)
     if (XQueryPointer (d, guess, &root, &child,
                       &dummy, &dummy, &ix, &iy, (unsigned int *) &dummy))
@@ -1628,16 +1720,16 @@ XTmouse_position (s, x, y, time)
       }
     else
       /* When XQueryPointer returns False, the pointer isn't in guess
-         anymore, but root is the root window of the screen we should
+         anymore, but root is the root window of the frame we should
          try instead.  */
       guess = root;
 
-  *s = last_mouse_screen = x_window_to_screen (guess);
-  if (! *s)
+  *f = last_mouse_frame = x_window_to_frame (guess);
+  if (! *f)
     *x = *y = Qnil;
   else
     {
-      pixel_to_glyph_coords (*s, ix, iy, &ix, &iy, &last_mouse_glyph);
+      pixel_to_glyph_coords (*f, ix, iy, &ix, &iy, &last_mouse_glyph);
       XSET (*x, Lisp_Int, ix);
       XSET (*y, Lisp_Int, iy);
     }
@@ -1654,55 +1746,25 @@ XTmouse_position (s, x, y, time)
   UNBLOCK_INPUT;
 }
 
-\f
-static char *events[] =
-{
-  "0: ERROR!",
-  "1: REPLY",
-  "KeyPress",
-  "KeyRelease",
-  "ButtonPress",
-  "ButtonRelease",
-  "MotionNotify",
-  "EnterNotify",
-  "LeaveNotify",
-  "FocusIn",
-  "FocusOut",
-  "KeymapNotify",
-  "Expose",
-  "GraphicsExpose",
-  "NoExpose",
-  "VisibilityNotify",
-  "CreateNotify",
-  "DestroyNotify",
-  "UnmapNotify",
-  "MapNotify",
-  "MapRequest",
-  "ReparentNotify",
-  "ConfigureNotify",
-  "ConfigureRequest",
-  "GravityNotify",
-  "ResizeRequest",
-  "CirculateNotify",
-  "CirculateRequest",
-  "PropertyNotify",
-  "SelectionClear",
-  "SelectionRequest",
-  "SelectionNotify",
-  "ColormapNotify",
-  "ClientMessage",
-  "MappingNotify",
-  "LASTEvent"
-};
-#else  /* X10 */
+#else /* ! defined (HAVE_X11) */
 #define XEvent XKeyPressedEvent
-#endif /* HAVE_X11 */ 
+#endif /* ! defined (HAVE_X11) */
+\f
 
 /* Timestamp of enter window event.  This is only used by XTread_socket,
    but we have to put it out here, since static variables within functions
    sometimes don't work.  */
 static Time enter_timestamp;
 
+/* This holds the state XLookupString needs to implement dead keys
+   and other tricks known as "compose processing".  _X Window System_ 
+   says that a portable program can't use this, but Stephen Gildea assures
+   me that letting the compiler initialize it to zeros will work okay.
+
+   This must be defined outside of XTread_socket, for the same reasons
+   given for enter_timestamp, above.  */
+static XComposeStatus compose_status;
+
 /* Communication with window managers. */
 Atom Xatom_wm_protocols;
 
@@ -1727,7 +1789,7 @@ Atom Xatom_wm_window_moved;         /* When the WM moves us. */
    WAITP is nonzero if we should block until input arrives.
    EXPECTED is nonzero if the caller knows input is available.  */
 
-Lisp_Object
+int
 XTread_socket (sd, bufp, numchars, waitp, expected)
      register int sd;
      register struct input_event *bufp;
@@ -1740,7 +1802,7 @@ XTread_socket (sd, bufp, numchars, waitp, expected)
   int mask;
   int items_pending;           /* How many items are in the X queue. */
   XEvent event;
-  struct screen *s;
+  struct frame *f;
   int event_found;
   int prefix;
   Lisp_Object part;
@@ -1763,7 +1825,7 @@ XTread_socket (sd, bufp, numchars, waitp, expected)
      FIOSNBIO is ignored, and instead of signalling EWOULDBLOCK,
      a read returns 0, which Xlib interprets as equivalent to EPIPE. */
   fcntl (fileno (stdin), F_SETFL, 0);
-#endif
+#endif /* ! defined (FIOSNBIO) */
 
 #ifndef SIGIO
 #ifndef HAVE_SELECT
@@ -1774,8 +1836,8 @@ XTread_socket (sd, bufp, numchars, waitp, expected)
       XPeekEvent (XDISPLAY &event);
       read_alarm_should_throw = 0;
     }
-#endif
-#endif
+#endif /* HAVE_SELECT */
+#endif /* SIGIO */
 
   while (XStuffPending () != 0)
     {
@@ -1792,9 +1854,9 @@ XTread_socket (sd, bufp, numchars, waitp, expected)
              {
                if (event.xclient.data.l[0] == Xatom_wm_take_focus)
                  {
-                   s = x_window_to_screen (event.xclient.window);
-                   if (s)
-                     x_focus_on_screen (s);
+                   f = x_window_to_frame (event.xclient.window);
+                   if (f)
+                     x_focus_on_frame (f);
                    /* Not certain about handling scrollbars here */
                  }
                else if (event.xclient.data.l[0] == Xatom_wm_save_yourself)
@@ -1810,9 +1872,9 @@ XTread_socket (sd, bufp, numchars, waitp, expected)
                  }
                else if (event.xclient.data.l[0] == Xatom_wm_delete_window)
                  {
-                   struct screen *s = x_window_to_screen (event.xclient.window);
+                   struct frame *f = x_window_to_frame (event.xclient.window);
 
-                   if (s)
+                   if (f)
                      if (numchars > 0)
                        {
                        }
@@ -1842,23 +1904,34 @@ XTread_socket (sd, bufp, numchars, waitp, expected)
          break;
 
        case PropertyNotify:
-         /* If we were to do this synchronously, there'd be no worry
-            about re-selecting. */
-         x_send_incremental (event);
+
+         /* If we're being told about a root window property, then it's
+            a cut buffer change.  */
+         if (event.xproperty.window == ROOT_WINDOW)
+           x_invalidate_cut_buffer_cache (&event.xproperty);
+
+         /* Otherwise, we're probably handling an incremental
+             selection transmission.  */
+         else
+           {
+             /* If we were to do this synchronously, there'd be no worry
+                about re-selecting. */
+             x_send_incremental (event);
+           }
          break;
 
        case Expose:
-         s = x_window_to_screen (event.xexpose.window);
-         if (s)
+         f = x_window_to_frame (event.xexpose.window);
+         if (f)
            {
-             if (s->visible == 0)
+             if (f->visible == 0)
                {
-                 s->visible = 1;
-                 s->iconified = 0;
-                 SET_SCREEN_GARBAGED (s);
+                 f->visible = 1;
+                 f->iconified = 0;
+                 SET_FRAME_GARBAGED (f);
                }
              else
-               dumprectangle (x_window_to_screen (event.xexpose.window),
+               dumprectangle (x_window_to_frame (event.xexpose.window),
                               event.xexpose.x, event.xexpose.y,
                               event.xexpose.width, event.xexpose.height);
            }
@@ -1867,7 +1940,7 @@ XTread_socket (sd, bufp, numchars, waitp, expected)
        case GraphicsExpose:    /* This occurs when an XCopyArea's
                                  source area was obscured or not
                                  available.*/
-         dumprectangle (x_window_to_screen (event.xgraphicsexpose.drawable),
+         dumprectangle (x_window_to_frame (event.xgraphicsexpose.drawable),
                         event.xgraphicsexpose.x, event.xgraphicsexpose.y,
                         event.xgraphicsexpose.width,
                         event.xgraphicsexpose.height);
@@ -1877,36 +1950,36 @@ XTread_socket (sd, bufp, numchars, waitp, expected)
                                  source area was completely
                                  available */
          break;
-#else /* not HAVE_X11 */
+#else /* ! defined (HAVE_X11) */
        case ExposeWindow:
          if (event.subwindow != 0)
            break;              /* duplicate event */
-         s = x_window_to_screen (event.window);
-         if (event.window == s->display.x->icon_desc)
+         f = x_window_to_frame (event.window);
+         if (event.window == f->display.x->icon_desc)
            {
-             refreshicon (s);
-             s->iconified = 1;
+             refreshicon (f);
+             f->iconified = 1;
            }
-         if (event.window == s->display.x->window_desc)
+         if (event.window == FRAME_X_WINDOW (f))
            {
              /* Say must check all windows' needs_exposure flags.  */
              expose_all_windows = 1;
-             s->display.x->needs_exposure = 1;
-             s->visible = 1;
+             f->display.x->needs_exposure = 1;
+             f->visible = 1;
            }
          break;
 
        case ExposeRegion:
          if (event.subwindow != 0)
            break;              /* duplicate event */
-         s = x_window_to_screen (event.window);
-         if (event.window == s->display.x->icon_desc)
+         f = x_window_to_frame (event.window);
+         if (event.window == f->display.x->icon_desc)
            {
-             refreshicon (s);
+             refreshicon (f);
              break;
            }
          /* If window already needs full redraw, ignore this rectangle.  */
-         if (expose_all_windows && s->display.x->needs_exposure)
+         if (expose_all_windows && f->display.x->needs_exposure)
            break;
          /* Put the event on the queue of rectangles to redraw.  */
          if (enqueue_event (&event, &x_expose_queue))
@@ -1915,7 +1988,7 @@ XTread_socket (sd, bufp, numchars, waitp, expected)
            {
              /* Say must check all windows' needs_exposure flags.  */
              expose_all_windows = 1;
-             s->display.x->needs_exposure = 1;
+             f->display.x->needs_exposure = 1;
            }
          break;
 
@@ -1923,36 +1996,36 @@ XTread_socket (sd, bufp, numchars, waitp, expected)
          /* This should happen only when we are expecting it,
             in x_read_exposes.  */
          abort ();
-#endif /* not HAVE_X11 */
+#endif /* ! defined (HAVE_X11) */
 
 #ifdef HAVE_X11
        case UnmapNotify:
          {
            XWMHints *hints;
 
-           s = x_window_to_screen (event.xunmap.window);
-           if (s)              /* S may no longer exist if
-                                  the screen was deleted.  */
+           f = x_window_to_frame (event.xunmap.window);
+           if (f)              /* F may no longer exist if
+                                  the frame was deleted.  */
              {
-               /* While a screen is unmapped, display generation is
+               /* While a frame is unmapped, display generation is
                   disabled; you don't want to spend time updating a
                   display that won't ever be seen.  */
-               s->visible = 0;
+               f->visible = 0;
                x_mouse_x = x_mouse_y = -1;
              }
          }
          break;
 
        case MapNotify:
-         s = x_window_to_screen (event.xmap.window);
-         if (s)
+         f = x_window_to_frame (event.xmap.window);
+         if (f)
            {
-             s->visible = 1;
-             s->iconified = 0;
+             f->visible = 1;
+             f->iconified = 0;
 
              /* wait_reading_process_input will notice this and update
-                the screen's display structures.  */
-             SET_SCREEN_GARBAGED (s);
+                the frame's display structures.  */
+             SET_FRAME_GARBAGED (f);
            }
          break;
 
@@ -1960,23 +2033,22 @@ XTread_socket (sd, bufp, numchars, waitp, expected)
        case VisibilityNotify:
          break;
 
-#else
+#else /* ! defined (HAVE_X11) */
        case UnmapWindow:
-         s = x_window_to_screen (event.window);
-         if (event.window == s->display.x->icon_desc)
-           s->iconified = 0;
-         if (event.window == s->display.x->window_desc)
-           s->visible = 0;
+         f = x_window_to_frame (event.window);
+         if (event.window == f->display.x->icon_desc)
+           f->iconified = 0;
+         if (event.window == FRAME_X_WINDOW (f))
+           f->visible = 0;
          break;
-#endif /* HAVE_X11 */
+#endif /* ! defined (HAVE_X11) */
 
 #ifdef HAVE_X11
        case KeyPress:
-         s = x_window_to_screen (event.xkey.window);
-         if (s != 0)
+         f = x_window_to_frame (event.xkey.window);
+         if (f != 0)
            {
              KeySym keysym;
-             XComposeStatus status;
              char copy_buffer[80];
              int modifiers = event.xkey.state;
 
@@ -1987,12 +2059,10 @@ XTread_socket (sd, bufp, numchars, waitp, expected)
                 just clear the meta-key flag to get the 'pure' character.  */
              event.xkey.state &= ~Mod1Mask;
 
-             /* This will have to go some day... */
-             nbytes = XLookupString (&event.xkey,
-                                     copy_buffer,
-                                     80,
-                                     &keysym,
-                                     &status);
+             /* This will have to go some day...  */
+             nbytes =
+               XLookupString (&event.xkey, copy_buffer, 80, &keysym,
+                              &compose_status);
 
              /* Strip off the vendor-specific keysym bit, and take a shot
                 at recognizing the codes.  HP servers have extra keysyms
@@ -2008,7 +2078,7 @@ XTread_socket (sd, bufp, numchars, waitp, expected)
                    {
                      bufp->kind = non_ascii_keystroke;
                      XSET (bufp->code, Lisp_Int, (unsigned) keysym - 0xff50);
-                     bufp->screen = s;
+                     bufp->frame = f;
                      bufp->modifiers = x_convert_modifiers (modifiers);
                      bufp->timestamp = event.xkey.time;
                      bufp++;
@@ -2021,11 +2091,11 @@ XTread_socket (sd, bufp, numchars, waitp, expected)
 
                      if (nbytes == 1)
                        {
-                         if (modifiers & Mod1Mask)
+                         if (modifiers & x_meta_mod_mask)
                            *copy_buffer |= METABIT;
                          bufp->kind = ascii_keystroke;
                          XSET (bufp->code, Lisp_Int, *copy_buffer);
-                         bufp->screen = s;
+                         bufp->frame = f;
                          bufp->timestamp = event.xkey.time;
                          bufp++;
                        }
@@ -2034,7 +2104,7 @@ XTread_socket (sd, bufp, numchars, waitp, expected)
                          {
                            bufp->kind = ascii_keystroke;
                            XSET (bufp->code, Lisp_Int, copy_buffer[i]);
-                           bufp->screen = s;
+                           bufp->frame = f;
                            bufp->timestamp = event.xkey.time;
                            bufp++;
                          }
@@ -2045,14 +2115,14 @@ XTread_socket (sd, bufp, numchars, waitp, expected)
                }
            }
          break;
-#else
+#else /* ! defined (HAVE_X11) */
        case KeyPressed:
          {
            register char *where_mapping;
 
-           s = x_window_to_screen (event.window);
+           f = x_window_to_frame (event.window);
            /* Ignore keys typed on icon windows.  */
-           if (s != 0 && event.window == s->display.x->icon_desc)
+           if (f != 0 && event.window == f->display.x->icon_desc)
              break;
            where_mapping = XLookupMapping (&event, &nbytes);
            /* Nasty fix for arrow keys */
@@ -2084,7 +2154,7 @@ XTread_socket (sd, bufp, numchars, waitp, expected)
                    bufp->kind = ascii_keystroke;
                    XSET (bufp->code, Lisp_Int, where_mapping[i]);
                    XSET (bufp->time, Lisp_Int, event.xkey.time);
-                   bufp->screen = s;
+                   bufp->frame = f;
                    bufp++;
                  }
                count += nbytes;
@@ -2092,11 +2162,11 @@ XTread_socket (sd, bufp, numchars, waitp, expected)
              }
          }
          break;
-#endif /* HAVE_X11 */
+#endif /* ! defined (HAVE_X11) */
 
 #ifdef HAVE_X11
        case EnterNotify:
-         s = x_window_to_screen (event.xcrossing.window);
+         f = x_window_to_frame (event.xcrossing.window);
 
          if (event.xcrossing.detail == NotifyInferior) /* Left Scrollbar */
            ;
@@ -2108,21 +2178,21 @@ XTread_socket (sd, bufp, numchars, waitp, expected)
              emacs_event.kind = no_event;
 
              /* Avoid nasty pop/raise loops. */
-             if (s && (!(s->auto_raise)
-                       || !(s->auto_lower)
+             if (f && (!(f->auto_raise)
+                       || !(f->auto_lower)
                        || (event.xcrossing.time - enter_timestamp) > 500))
                {
-                 x_new_focus_screen (s);
+                 x_new_focus_frame (f);
                  enter_timestamp = event.xcrossing.time;
                }
 #if 0
-             else if ((s = x_window_to_scrollbar (event.xcrossing.window,
+             else if ((f = x_window_to_scrollbar (event.xcrossing.window,
                                                   &part, &prefix)))
                /* Fake a motion event */
                notice_mouse_movement (&emacs_event,
-                                      event.xmotion, s, scrollbar_window,
+                                      event.xmotion, f, scrollbar_window,
                                       part);
-#endif
+#endif /* ! 0 */
 
 #if 0
              if (! EQ (Vx_send_mouse_movement_events, Qnil)
@@ -2134,21 +2204,21 @@ XTread_socket (sd, bufp, numchars, waitp, expected)
                  count++;
                  numchars--;
                }
-#endif
+#endif /* ! 0 */
            }
-         else if (s == x_focus_screen)
-           x_new_focus_screen (0);
+         else if (f == x_focus_frame)
+           x_new_focus_frame (0);
 #if 0
-         else if (s = x_window_to_screen (event.xcrossing.window))
-           x_mouse_screen = s;
-#endif
+         else if (f = x_window_to_frame (event.xcrossing.window))
+           x_mouse_frame = f;
+#endif /* ! 0 */
 
          break;
 
        case FocusIn:
-         s = x_window_to_screen (event.xfocus.window);
-         if (s)
-           x_new_focus_screen (s);
+         f = x_window_to_frame (event.xfocus.window);
+         if (f)
+           x_new_focus_frame (f);
          break;
 
        case LeaveNotify:
@@ -2156,21 +2226,22 @@ XTread_socket (sd, bufp, numchars, waitp, expected)
              && event.xcrossing.subwindow == None
              && event.xcrossing.mode == NotifyNormal)
            {
-             s = x_window_to_screen (event.xcrossing.window);
+             f = x_window_to_frame (event.xcrossing.window);
+
              if (event.xcrossing.focus)
-               x_new_focus_screen (s);
-             else if (s == x_focus_screen)
-               x_new_focus_screen (0);
+               x_new_focus_frame (f);
+             else if (f == x_focus_frame)
+               x_new_focus_frame (0);
            }
          break;
 
        case FocusOut:
-         s = x_window_to_screen (event.xfocus.window);
-         if (s && s == x_focus_screen)
-           x_new_focus_screen (0);
+         f = x_window_to_frame (event.xfocus.window);
+         if (f && f == x_focus_frame)
+           x_new_focus_frame (0);
          break;
 
-#else /* not HAVE_X11 */
+#else /* ! defined (HAVE_X11) */
 
        case EnterWindow:
          if ((event.detail & 0xFF) == 1)
@@ -2179,12 +2250,10 @@ XTread_socket (sd, bufp, numchars, waitp, expected)
            break;              /* Entering our own subwindow.  */
 
          {
-           struct screen *old_s = x_input_screen;
-
-           s = x_window_to_screen (event.window);
-           x_mouse_screen = s;
+           f = x_window_to_frame (event.window);
+           x_mouse_frame = f;
 
-           x_new_focus_screen (s);
+           x_new_focus_frame (f);
          }
          break;
 
@@ -2194,69 +2263,69 @@ XTread_socket (sd, bufp, numchars, waitp, expected)
          if (event.subwindow != 0)
            break;              /* Leaving our own subwindow.  */
 
-         x_mouse_screen = 0;
-         if (x_focus_screen == 0
-             && x_input_screen != 0
-             && x_input_screen == x_window_to_screen (event.window)
-             && event.window == x_input_screen->display.x->window_desc)
+         x_mouse_frame = 0;
+         if (x_focus_frame == 0
+             && x_input_frame != 0
+             && x_input_frame == x_window_to_frame (event.window)
+             && event.window == FRAME_X_WINDOW (x_input_frame))
            {
-             s = x_input_screen;
-             x_input_screen = 0;
-             if (s)
-               screen_unhighlight (s);
+             f = x_input_frame;
+             x_input_frame = 0;
+             if (f)
+               frame_unhighlight (f);
            }
          break;
-#endif /* not HAVE_X11 */
+#endif /* ! defined (HAVE_X11) */
 
 #ifdef HAVE_X11
        case MotionNotify:
          {
-           s = x_window_to_screen (event.xmotion.window);
-           if (s)
-             note_mouse_position (s, &event.xmotion);
+           f = x_window_to_frame (event.xmotion.window);
+           if (f)
+             note_mouse_position (f, &event.xmotion);
 #if 0
-           else if ((s = x_window_to_scrollbar (event.xmotion.window,
+           else if ((f = x_window_to_scrollbar (event.xmotion.window,
                                                 &part, &prefix)))
              {
                What should go here?
              }
-#endif
+#endif /* ! 0 */
          }
          break;
 
        case ConfigureNotify:
          {
            int rows, columns;
-           s = x_window_to_screen (event.xconfigure.window);
-           if (!s)
+           f = x_window_to_frame (event.xconfigure.window);
+           if (!f)
              break;
 
            columns = ((event.xconfigure.width -
-                       (2 * s->display.x->internal_border_width)
-                       - s->display.x->v_scrollbar_width)
-                      / FONT_WIDTH (s->display.x->font));
+                       (2 * f->display.x->internal_border_width)
+                       - f->display.x->v_scrollbar_width)
+                      / FONT_WIDTH (f->display.x->font));
            rows = ((event.xconfigure.height -
-                    (2 * s->display.x->internal_border_width)
-                    - s->display.x->h_scrollbar_height)
-                   / FONT_HEIGHT (s->display.x->font));
+                    (2 * f->display.x->internal_border_width)
+                    - f->display.x->h_scrollbar_height)
+                   / FONT_HEIGHT (f->display.x->font));
 
            /* Even if the number of character rows and columns has
               not changed, the font size may have changed, so we need
               to check the pixel dimensions as well.  */
-           if (columns != s->width
-               || rows != s->height
-               || event.xconfigure.width != s->display.x->pixel_width
-               || event.xconfigure.height != s->display.x->pixel_height)
+           if (columns != f->width
+               || rows != f->height
+               || event.xconfigure.width != f->display.x->pixel_width
+               || event.xconfigure.height != f->display.x->pixel_height)
              {
-               change_screen_size (s, rows, columns, 0);
-               x_resize_scrollbars (s);
-               SET_SCREEN_GARBAGED (s);
+               change_frame_size (f, rows, columns, 0, 1);
+               x_resize_scrollbars (f);
+               SET_FRAME_GARBAGED (f);
              }
 
-           s->display.x->pixel_width = event.xconfigure.width;
-           s->display.x->pixel_height = event.xconfigure.height;
-           s->display.x->left_pos = event.xconfigure.x;
-           s->display.x->top_pos = event.xconfigure.y;
+           f->display.x->pixel_width = event.xconfigure.width;
+           f->display.x->pixel_height = event.xconfigure.height;
+           f->display.x->left_pos = event.xconfigure.x;
+           f->display.x->top_pos = event.xconfigure.y;
            break;
          }
 
@@ -2268,20 +2337,20 @@ XTread_socket (sd, bufp, numchars, waitp, expected)
            struct input_event emacs_event;
            emacs_event.kind = no_event;
 
-           s = x_window_to_screen (event.xbutton.window);
-           if (s)
-             if (!x_focus_screen || (s == x_focus_screen))
+           f = x_window_to_frame (event.xbutton.window);
+           if (f)
+             if (!x_focus_frame || (f == x_focus_frame))
                construct_mouse_click (&emacs_event,
-                                      &event, s, 0, 0);
+                                      &event, f, Qnil, 0);
              else
                continue;
            else
-             if ((s = x_window_to_scrollbar (event.xbutton.window,
+             if ((f = x_window_to_scrollbar (event.xbutton.window,
                                              &part, &prefix)))
                {
-                 if (!x_focus_screen || (selected_screen == x_focus_screen))
+                 if (!x_focus_frame || (selected_frame == x_focus_frame))
                    construct_mouse_click (&emacs_event,
-                                          &event, s, part, prefix);
+                                          &event, f, part, prefix);
                  else
                    continue;
                }
@@ -2296,24 +2365,24 @@ XTread_socket (sd, bufp, numchars, waitp, expected)
          }
          break;
 
-#else /* not HAVE_X11 */
+#else /* ! defined (HAVE_X11) */
        case ButtonPressed:
        case ButtonReleased:
-         s = x_window_to_screen (event.window);
-         if (s)
+         f = x_window_to_frame (event.window);
+         if (f)
            {
-             if (event.window == s->display.x->icon_desc)
+             if (event.window == f->display.x->icon_desc)
                {
-                 x_make_screen_visible (s);
+                 x_make_frame_visible (f);
 
                  if (warp_mouse_on_deiconify)
-                   XWarpMouse (s->display.x->window_desc, 10, 10);
+                   XWarpMouse (FRAME_X_WINDOW (f), 10, 10);
                  break;
                }
-             if (event.window == s->display.x->window_desc)
+             if (event.window == FRAME_X_WINDOW (f))
                {
-                 if (s->auto_raise)
-                   x_raise_screen (s);
+                 if (f->auto_raise)
+                   x_raise_frame (f);
                }
            }
          enqueue_event (&event, &x_mouse_queue);
@@ -2321,13 +2390,13 @@ XTread_socket (sd, bufp, numchars, waitp, expected)
            {
              bufp->kind = ascii_keystroke;
              bufp->code = (char) 'X' & 037; /* C-x */
-             bufp->screen = s;
+             bufp->frame = f;
              XSET (bufp->time, Lisp_Int, event.xkey.time);
              bufp++;
 
              bufp->kind = ascii_keystroke;
              bufp->code = (char) 0; /* C-@ */
-             bufp->screen = s;
+             bufp->frame = f;
              XSET (bufp->time, Lisp_Int, event.xkey.time);
              bufp++;
 
@@ -2335,7 +2404,7 @@ XTread_socket (sd, bufp, numchars, waitp, expected)
              numchars -= 2;
            }
          break;
-#endif /* not HAVE_X11 */
+#endif /* ! defined (HAVE_X11) */
 
 #ifdef HAVE_X11
 
@@ -2344,13 +2413,19 @@ XTread_socket (sd, bufp, numchars, waitp, expected)
        case CirculateRequest:
          break;
 
-#endif /* HAVE_X11 */
+#endif /* ! defined (HAVE_X11) */
 
        case MappingNotify:
-         if (event.xmapping.request == MappingKeyboard)
-           /* Someone has changed the keyboard mapping - flush the
-              local cache.  */
-           XRefreshKeyboardMapping (&event.xmapping);
+         /* Someone has changed the keyboard mapping - update the
+            local cache.  */
+         switch (event.xmapping.request)
+           {
+           case MappingModifier:
+             x_find_modifier_meanings ();
+             /* This is meant to fall through.  */
+           case MappingKeyboard:
+             XRefreshKeyboardMapping (&event.xmapping);
+           }
          break;
 
        default:
@@ -2374,10 +2449,10 @@ XTread_socket (sd, bufp, numchars, waitp, expected)
          && !XStuffPending ())
        kill (getpid (), SIGHUP);
     }
-#endif /* HAVE_SELECT */
-#endif
+#endif /* ! defined (HAVE_SELECT) */
+#endif /* ! 0 */
 
-  if (updating_screen == 0)
+  if (updating_frame == 0)
     x_do_pending_expose ();
 
   UNBLOCK_INPUT;
@@ -2393,7 +2468,7 @@ XTread_socket (sd, bufp, numchars, waitp, expected)
 static void
 x_read_exposes ()
 {
-  struct screen *s;
+  struct frame *f;
   XKeyPressedEvent event;
 
   while (1)
@@ -2405,16 +2480,16 @@ x_read_exposes ()
        case ExposeWindow:
          if (event.subwindow != 0)
            break;                      /* duplicate event */
-         s = x_window_to_screen (event.window);
-         if (event.window == s->display.x->icon_desc)
+         f = x_window_to_frame (event.window);
+         if (event.window == f->display.x->icon_desc)
            {
-             refreshicon (s);
+             refreshicon (f);
              break;
            }
-         if (event.window == s->display.x->window_desc)
+         if (event.window == FRAME_X_WINDOW (f))
            {
              expose_all_windows = 1;
-             s->display.x->needs_exposure = 1;
+             f->display.x->needs_exposure = 1;
              break;
            }
          break;
@@ -2422,14 +2497,14 @@ x_read_exposes ()
        case ExposeRegion:
          if (event.subwindow != 0)
            break;                      /* duplicate event */
-         s = x_window_to_screen (event.window);
-         if (event.window == s->display.x->icon_desc)
+         f = x_window_to_frame (event.window);
+         if (event.window == f->display.x->icon_desc)
            {
-             refreshicon (s);
+             refreshicon (f);
              break;
            }
          /* If window already needs full redraw, ignore this rectangle.  */
-         if (expose_all_windows && s->display.x->needs_exposure)
+         if (expose_all_windows && f->display.x->needs_exposure)
            break;
          /* Put the event on the queue of rectangles to redraw.  */
          if (enqueue_event (&event, &x_expose_queue))
@@ -2438,7 +2513,7 @@ x_read_exposes ()
            {
              /* Say must check all windows' needs_exposure flags.  */
              expose_all_windows = 1;
-             s->display.x->needs_exposure = 1;
+             f->display.x->needs_exposure = 1;
            }
          break;
 
@@ -2453,286 +2528,286 @@ x_read_exposes ()
 /* Draw a hollow box cursor.  Don't change the inside of the box.  */
 
 static void
-x_draw_box (s)
-     struct screen *s;
+x_draw_box (f)
+     struct frame *f;
 {
-  int left = s->cursor_x * FONT_WIDTH (s->display.x->font)
-    + s->display.x->internal_border_width;
-  int top = s->cursor_y * FONT_HEIGHT (s->display.x->font)
-    + s->display.x->internal_border_width;
-  int width = FONT_WIDTH (s->display.x->font);
-  int height = FONT_HEIGHT (s->display.x->font);
+  int left = f->cursor_x * FONT_WIDTH (f->display.x->font)
+    + f->display.x->internal_border_width;
+  int top = f->cursor_y * FONT_HEIGHT (f->display.x->font)
+    + f->display.x->internal_border_width;
+  int width = FONT_WIDTH (f->display.x->font);
+  int height = FONT_HEIGHT (f->display.x->font);
 
 #ifdef HAVE_X11
   /* Perhaps we should subtract 1 from width and height... */
-  XDrawRectangle (x_current_display, s->display.x->window_desc,
-                 s->display.x->cursor_gc,
+  XDrawRectangle (x_current_display, FRAME_X_WINDOW (f),
+                 f->display.x->cursor_gc,
                  left, top, width - 1, height - 1);
-#else
-  XPixSet (s->display.x->window_desc,
+#else /* ! defined (HAVE_X11) */
+  XPixSet (FRAME_X_WINDOW (f),
           left, top, width, 1,
-          s->display.x->cursor_pixel);
+          f->display.x->cursor_pixel);
 
-  XPixSet (s->display.x->window_desc,
+  XPixSet (FRAME_X_WINDOW (f),
           left, top, 1, height,
-          s->display.x->cursor_pixel);
+          f->display.x->cursor_pixel);
 
-  XPixSet (s->display.x->window_desc,
+  XPixSet (FRAME_X_WINDOW (f),
           left+width-1, top, 1, height,
-          s->display.x->cursor_pixel);
+          f->display.x->cursor_pixel);
 
-  XPixSet (s->display.x->window_desc,
+  XPixSet (FRAME_X_WINDOW (f),
           left, top+height-1, width, 1,
-          s->display.x->cursor_pixel);
-#endif /* HAVE_X11 */
+          f->display.x->cursor_pixel);
+#endif /* ! defined (HAVE_X11) */
 }
 
-/* Clear the cursor of screen S to background color,
+/* Clear the cursor of frame F to background color,
    and mark the cursor as not shown.
    This is used when the text where the cursor is
    is about to be rewritten.  */
 
 static void
-clear_cursor (s)
-     struct screen *s;
+clear_cursor (f)
+     struct frame *f;
 {
   int mask;
 
-  if (! s->visible
-      || s->phys_cursor_x < 0)
+  if (! f->visible
+      || f->phys_cursor_x < 0)
     return;
 
 #ifdef HAVE_X11
-  x_display_cursor (s, 0);
+  x_display_cursor (f, 0);
 #if 0
-  XClearArea (x_current_display, s->display.x->window_desc,
-             s->phys_cursor_x * FONT_WIDTH (s->display.x->font)
-             + s->display.x->internal_border_width,
-             s->phys_cursor_y * FONT_HEIGHT (s->display.x->font)
-             + s->display.x->internal_border_width,
-             FONT_WIDTH (s->display.x->font) + 1, FONT_HEIGHT (s->display.x->font) + 1, False);
-#endif
-#else
-  XPixSet (s->display.x->window_desc,
-          s->phys_cursor_x * FONT_WIDTH (s->display.x->font) + s->display.x->internal_border_width,
-          s->phys_cursor_y * FONT_HEIGHT (s->display.x->font) + s->display.x->internal_border_width,
-          FONT_WIDTH (s->display.x->font), FONT_HEIGHT (s->display.x->font),
-          s->display.x->background_pixel);
-#endif /* HAVE_X11 */
-  s->phys_cursor_x = -1;
+  XClearArea (x_current_display, FRAME_X_WINDOW (f),
+             f->phys_cursor_x * FONT_WIDTH (f->display.x->font)
+             + f->display.x->internal_border_width,
+             f->phys_cursor_y * FONT_HEIGHT (f->display.x->font)
+             + f->display.x->internal_border_width,
+             FONT_WIDTH (f->display.x->font) + 1, FONT_HEIGHT (f->display.x->font) + 1, False);
+#endif /* ! 0 */
+#else /* ! defined (HAVE_X11) */
+  XPixSet (FRAME_X_WINDOW (f),
+          f->phys_cursor_x * FONT_WIDTH (f->display.x->font) + f->display.x->internal_border_width,
+          f->phys_cursor_y * FONT_HEIGHT (f->display.x->font) + f->display.x->internal_border_width,
+          FONT_WIDTH (f->display.x->font), FONT_HEIGHT (f->display.x->font),
+          f->display.x->background_pixel);
+#endif /* ! defined (HAVE_X11) */
+  f->phys_cursor_x = -1;
 }
 
 static void
-x_display_bar_cursor (s, on)
-     struct screen *s;
+x_display_bar_cursor (f, on)
+     struct frame *f;
      int on;
 {
-  register int phys_x = s->phys_cursor_x;
-  register int phys_y = s->phys_cursor_y;
+  register int phys_x = f->phys_cursor_x;
+  register int phys_y = f->phys_cursor_y;
   register int x1;
   register int y1;
   register int y2;
 
-  if (! s->visible || (! on && s->phys_cursor_x < 0))
+  if (! f->visible || (! on && f->phys_cursor_x < 0))
     return;
 
 #ifdef HAVE_X11
   if (phys_x >= 0 &&
-      (!on || phys_x != s->cursor_x || phys_y != s->cursor_y))
+      (!on || phys_x != f->cursor_x || phys_y != f->cursor_y))
     {
-      x1 = phys_x * FONT_WIDTH (s->display.x->font)
-       + s->display.x->internal_border_width;
-      y1 = phys_y * FONT_HEIGHT (s->display.x->font)
-       + s->display.x->internal_border_width - 1;
-      y2 = y1 + FONT_HEIGHT (s->display.x->font) + 1;
+      x1 = phys_x * FONT_WIDTH (f->display.x->font)
+       + f->display.x->internal_border_width;
+      y1 = phys_y * FONT_HEIGHT (f->display.x->font)
+       + f->display.x->internal_border_width - 1;
+      y2 = y1 + FONT_HEIGHT (f->display.x->font) + 1;
 
-      XDrawLine (x_current_display, s->display.x->window_desc,
-                s->display.x->reverse_gc, x1, y1, x1, y2);
+      XDrawLine (x_current_display, FRAME_X_WINDOW (f),
+                f->display.x->reverse_gc, x1, y1, x1, y2);
 
-      s->phys_cursor_x = phys_x = -1;
+      f->phys_cursor_x = phys_x = -1;
     }
 
-  if (on && s == x_highlight_screen)
+  if (on && f == x_highlight_frame)
     {
-      x1 = s->cursor_x * FONT_WIDTH (s->display.x->font)
-       + s->display.x->internal_border_width;
-      y1 = s->cursor_y * FONT_HEIGHT (s->display.x->font)
-       + s->display.x->internal_border_width - 1;
-      y2 = y1 + FONT_HEIGHT (s->display.x->font) + 1;
+      x1 = f->cursor_x * FONT_WIDTH (f->display.x->font)
+       + f->display.x->internal_border_width;
+      y1 = f->cursor_y * FONT_HEIGHT (f->display.x->font)
+       + f->display.x->internal_border_width - 1;
+      y2 = y1 + FONT_HEIGHT (f->display.x->font) + 1;
 
-      XDrawLine (x_current_display, s->display.x->window_desc,
-                s->display.x->cursor_gc, x1, y1, x1, y2);
+      XDrawLine (x_current_display, FRAME_X_WINDOW (f),
+                f->display.x->cursor_gc, x1, y1, x1, y2);
 
-      s->phys_cursor_x = s->cursor_x;
-      s->phys_cursor_y = s->cursor_y;
+      f->phys_cursor_x = f->cursor_x;
+      f->phys_cursor_y = f->cursor_y;
     }
-#else  /* X10 */
+#else /* ! defined (HAVE_X11) */
   Give it up, dude.
-#endif /* X10 */
+#endif /* ! defined (HAVE_X11) */
 }
 
 
-/* Redraw the glyph at ROW, COLUMN on screen S, in the style
+/* Redraw the glyph at ROW, COLUMN on frame F, in the style
    HIGHLIGHT.  HIGHLIGHT is as defined for dumpglyphs.  Return the
    glyph drawn.  */
 
 static void
-x_draw_single_glyph (s, row, column, glyph, highlight)
-     struct screen *s;
+x_draw_single_glyph (f, row, column, glyph, highlight)
+     struct frame *f;
      int row, column;
      GLYPH glyph;
      int highlight;
 {
-  dumpglyphs (s,
-             (column * FONT_WIDTH (s->display.x->font)
-              + s->display.x->internal_border_width),
-             (row * FONT_HEIGHT (s->display.x->font)
-              + s->display.x->internal_border_width),
-             &glyph, 1, highlight, s->display.x->font);
+  dumpglyphs (f,
+             (column * FONT_WIDTH (f->display.x->font)
+              + f->display.x->internal_border_width),
+             (row * FONT_HEIGHT (f->display.x->font)
+              + f->display.x->internal_border_width),
+             &glyph, 1, highlight, f->display.x->font);
 }
 
-/* Turn the displayed cursor of screen S on or off according to ON.
+/* Turn the displayed cursor of frame F on or off according to ON.
    If ON is nonzero, where to put the cursor is specified
-   by S->cursor_x and S->cursor_y.  */
+   by F->cursor_x and F->cursor_y.  */
 
 static void
-x_display_box_cursor (s, on)
-     struct screen *s;
+x_display_box_cursor (f, on)
+     struct frame *f;
      int on;
 {
-  struct screen_glyphs *current_glyphs = SCREEN_CURRENT_GLYPHS (s);
+  struct frame_glyphs *current_glyphs = FRAME_CURRENT_GLYPHS (f);
 
-  /* If we're not updating, then we want to use the current screen's
+  /* If we're not updating, then we want to use the current frame's
      cursor position, not our local idea of where the cursor ought to be.  */
-  if (s != updating_screen)
+  if (f != updating_frame)
     {
-      curs_x = SCREEN_CURSOR_X (s);
-      curs_y = SCREEN_CURSOR_Y (s);
+      curs_x = FRAME_CURSOR_X (f);
+      curs_y = FRAME_CURSOR_Y (f);
     }
 
-  if (! s->visible)
+  if (! f->visible)
     return;
 
   /* If cursor is off and we want it off, return quickly.  */
-  if (!on && s->phys_cursor_x < 0)
+  if (!on && f->phys_cursor_x < 0)
     return;
 
   /* If cursor is currently being shown and we don't want it to be
      or it is in the wrong place,
      or we want a hollow box and it's not so, (pout!)
      erase it.  */
-  if (s->phys_cursor_x >= 0
+  if (f->phys_cursor_x >= 0
       && (!on
-         || s->phys_cursor_x != curs_x
-         || s->phys_cursor_y != curs_y
-         || (s->display.x->text_cursor_kind != hollow_box_cursor
-             && (s != x_highlight_screen))))
+         || f->phys_cursor_x != curs_x
+         || f->phys_cursor_y != curs_y
+         || (f->display.x->text_cursor_kind != hollow_box_cursor
+             && (f != x_highlight_frame))))
     {
       /* Erase the cursor by redrawing the character underneath it.  */
-      x_draw_single_glyph (s, s->phys_cursor_y, s->phys_cursor_x,
-                          s->phys_cursor_glyph,
-                          current_glyphs->highlight[s->phys_cursor_y]);
-      s->phys_cursor_x = -1;
+      x_draw_single_glyph (f, f->phys_cursor_y, f->phys_cursor_x,
+                          f->phys_cursor_glyph,
+                          current_glyphs->highlight[f->phys_cursor_y]);
+      f->phys_cursor_x = -1;
     }
 
   /* If we want to show a cursor,
      or we want a box cursor and it's not so,
      write it in the right place.  */
   if (on
-      && (s->phys_cursor_x < 0
-         || (s->display.x->text_cursor_kind != filled_box_cursor
-             && s == x_highlight_screen)))
+      && (f->phys_cursor_x < 0
+         || (f->display.x->text_cursor_kind != filled_box_cursor
+             && f == x_highlight_frame)))
     {
-      s->phys_cursor_glyph
+      f->phys_cursor_glyph
        = ((current_glyphs->enable[curs_y]
            && curs_x < current_glyphs->used[curs_y])
           ? current_glyphs->glyphs[curs_y][curs_x]
           : SPACEGLYPH);
-      if (s != x_highlight_screen)
+      if (f != x_highlight_frame)
        {
-         x_draw_box (s);
-         s->display.x->text_cursor_kind = hollow_box_cursor;
+         x_draw_box (f);
+         f->display.x->text_cursor_kind = hollow_box_cursor;
        }
       else
        {
-         x_draw_single_glyph (s, curs_y, curs_x,
-                              s->phys_cursor_glyph, 2);
-         s->display.x->text_cursor_kind = filled_box_cursor;
+         x_draw_single_glyph (f, curs_y, curs_x,
+                              f->phys_cursor_glyph, 2);
+         f->display.x->text_cursor_kind = filled_box_cursor;
        }
 
-      s->phys_cursor_x = curs_x;
-      s->phys_cursor_y = curs_y;
+      f->phys_cursor_x = curs_x;
+      f->phys_cursor_y = curs_y;
     }
 
-  if (updating_screen != s)
+  if (updating_frame != f)
     XFlushQueue ();
 }
 
 extern Lisp_Object Vbar_cursor;
 
-x_display_cursor (s, on)
-     struct screen *s;
+x_display_cursor (f, on)
+     struct frame *f;
      int on;
 {
   if (EQ (Vbar_cursor, Qnil))
-    x_display_box_cursor (s, on);
+    x_display_box_cursor (f, on);
   else
-    x_display_bar_cursor (s, on);
+    x_display_bar_cursor (f, on);
 }
 \f
 /* Icons.  */
 
-/* Refresh bitmap kitchen sink icon for screen S
+/* Refresh bitmap kitchen sink icon for frame F
    when we get an expose event for it. */
 
-refreshicon (s)
-     struct screen *s;
+refreshicon (f)
+     struct frame *f;
 {
 #ifdef HAVE_X11
   /* Normally, the window manager handles this function. */
-#else
+#else /* ! defined (HAVE_X11) */
   int mask;
 
-  if (s->display.x->icon_bitmap_flag)
-    XBitmapBitsPut (s->display.x->icon_desc, 0,  0, sink_width, sink_height,
+  if (f->display.x->icon_bitmap_flag)
+    XBitmapBitsPut (f->display.x->icon_desc, 0,  0, sink_width, sink_height,
                    sink_bits, BlackPixel, WHITE_PIX_DEFAULT, 
                    icon_bitmap, GXcopy, AllPlanes);
   else
     {
-      extern struct screen *selected_screen;
+      extern struct frame *selected_frame;
       struct Lisp_String *str;
       unsigned char *string;
 
       string
-       = XSTRING (XBUFFER (XWINDOW (s->selected_window)->buffer)->name)->data;
+       = XSTRING (XBUFFER (XWINDOW (f->selected_window)->buffer)->name)->data;
 
-      if (s->display.x->icon_label != string)
+      if (f->display.x->icon_label != string)
        {
-         s->display.x->icon_label = string;
-         XChangeWindow (s->display.x->icon_desc,
+         f->display.x->icon_label = string;
+         XChangeWindow (f->display.x->icon_desc,
                         XQueryWidth (string, icon_font_info->id) + 10,
                         icon_font_info->height + 10);
        }
 
-      XText (s->display.x->icon_desc, 5, 5, string,
+      XText (f->display.x->icon_desc, 5, 5, string,
             str->size, icon_font_info->id,
             BLACK_PIX_DEFAULT, WHITE_PIX_DEFAULT);
     }
   XFlushQueue ();
-#endif /* HAVE_X11 */
+#endif /* ! defined (HAVE_X11) */
 }
 
-/* Make the x-window of screen S use the kitchen-sink icon
+/* Make the x-window of frame F use the kitchen-sink icon
    that's a window generated by Emacs.  */
 
 int
-x_bitmap_icon (s)
-     struct screen *s;
+x_bitmap_icon (f)
+     struct frame *f;
 {
   int mask;
   Window icon_window;
 
-  if (s->display.x->window_desc == 0)
+  if (FRAME_X_WINDOW (f) == 0)
     return 1;
 
 #ifdef HAVE_X11
@@ -2740,44 +2815,44 @@ x_bitmap_icon (s)
     XFreePixmap (x_current_display, icon_bitmap);
   
   icon_bitmap =
-    XCreateBitmapFromData (x_current_display, s->display.x->window_desc,
+    XCreateBitmapFromData (x_current_display, FRAME_X_WINDOW (f),
                           gnu_bits, gnu_width, gnu_height);
-  x_wm_set_icon_pixmap (s, icon_bitmap);
-  s->display.x->icon_bitmap_flag = 1;
-#else
-  if (s->display.x->icon_desc)
+  x_wm_set_icon_pixmap (f, icon_bitmap);
+  f->display.x->icon_bitmap_flag = 1;
+#else /* ! defined (HAVE_X11) */
+  if (f->display.x->icon_desc)
     {
-      XClearIconWindow (s->display.x->window_desc);
-      XDestroyWindow (s->display.x->icon_desc);
+      XClearIconWindow (FRAME_X_WINDOW (f));
+      XDestroyWindow (f->display.x->icon_desc);
     }
 
-  icon_window = XCreateWindow (s->display.x->parent_desc,
+  icon_window = XCreateWindow (f->display.x->parent_desc,
                               0, 0, sink_width, sink_height,
                               2, WhitePixmap, (Pixmap) NULL);
 
   if (icon_window == 0)
     return 1;
 
-  XSetIconWindow (s->display.x->window_desc, icon_window);
+  XSetIconWindow (FRAME_X_WINDOW (f), icon_window);
   XSelectInput (icon_window, ExposeWindow | UnmapWindow);
 
-  s->display.x->icon_desc = icon_window;
-  s->display.x->icon_bitmap_flag = 1;
+  f->display.x->icon_desc = icon_window;
+  f->display.x->icon_bitmap_flag = 1;
 
   if (icon_bitmap == 0)
     icon_bitmap
       = XStoreBitmap (sink_mask_width, sink_mask_height, sink_mask_bits);
-#endif /* HAVE_X11 */
+#endif /* ! defined (HAVE_X11) */
 
   return 0;
 }
 
 
-/* Make the x-window of screen S use a rectangle with text.  */
+/* Make the x-window of frame F use a rectangle with text.  */
 
 int
-x_text_icon (s, icon_name)
-     struct screen *s;
+x_text_icon (f, icon_name)
+     struct frame *f;
      char *icon_name;
 {
 #ifndef HAVE_X11
@@ -2789,14 +2864,14 @@ x_text_icon (s, icon_name)
 
 #ifndef WhitePixel
 #define WhitePixel 1
-#endif
+#endif /* WhitePixel */
 
 #ifndef BlackPixel
 #define BlackPixel 0
-#endif
-#endif /* not HAVE_X11 */
+#endif /* BlackPixel */
+#endif /* HAVE_X11 */
   
-  if (s->display.x->window_desc == 0)
+  if (FRAME_X_WINDOW (f) == 0)
     return 1;
 
   if (icon_font_info == 0)
@@ -2807,45 +2882,46 @@ x_text_icon (s, icon_name)
 
 #ifdef HAVE_X11
   if (icon_name)
-    s->display.x->icon_label = icon_name;
+    f->display.x->icon_label = icon_name;
   else
-    if (! s->display.x->icon_label)
-      s->display.x->icon_label = " *emacs* ";
+    if (! f->display.x->icon_label)
+      f->display.x->icon_label = " *emacs* ";
   
-  XSetIconName (x_current_display, s->display.x->window_desc,
-               (char *) s->display.x->icon_label);
+  XSetIconName (x_current_display, FRAME_X_WINDOW (f),
+               (char *) f->display.x->icon_label);
   
-  s->display.x->icon_bitmap_flag = 0;
-#else
-  if (s->display.x->icon_desc)
+  f->display.x->icon_bitmap_flag = 0;
+  x_wm_set_icon_pixmap (f, 0);
+#else /* ! defined (HAVE_X11) */
+  if (f->display.x->icon_desc)
     {
-      XClearIconWindow (XDISPLAY s->display.x->window_desc);
-      XDestroyWindow (XDISPLAY s->display.x->icon_desc);
+      XClearIconWindow (XDISPLAY FRAME_X_WINDOW (f));
+      XDestroyWindow (XDISPLAY f->display.x->icon_desc);
     }
 
   if (icon_name)
-    s->display.x->icon_label = (unsigned char *) icon_name;
+    f->display.x->icon_label = (unsigned char *) icon_name;
   else
-    if (! s->display.x->icon_label)
-      s->display.x->icon_label = XSTRING (s->name)->data;
+    if (! f->display.x->icon_label)
+      f->display.x->icon_label = XSTRING (f->name)->data;
 
-  width = XStringWidth (s->display.x->icon_label, icon_font_info, 0, 0);
-  icon_window = XCreateWindow (s->display.x->parent_desc,
-                              s->display.x->left_pos,
-                              s->display.x->top_pos,
+  width = XStringWidth (f->display.x->icon_label, icon_font_info, 0, 0);
+  icon_window = XCreateWindow (f->display.x->parent_desc,
+                              f->display.x->left_pos,
+                              f->display.x->top_pos,
                               width + 10, icon_font_info->height + 10,
                               2, BlackPixmap, WhitePixmap);
 
   if (icon_window == 0)
     return 1;
 
-  XSetIconWindow (s->display.x->window_desc, icon_window);
+  XSetIconWindow (FRAME_X_WINDOW (f), icon_window);
   XSelectInput (icon_window, ExposeWindow | ExposeRegion | UnmapWindow | ButtonPressed);
 
-  s->display.x->icon_desc = icon_window;
-  s->display.x->icon_bitmap_flag = 0;
-  s->display.x->icon_label = 0;
-#endif /* HAVE_X11 */
+  f->display.x->icon_desc = icon_window;
+  f->display.x->icon_bitmap_flag = 0;
+  f->display.x->icon_label = 0;
+#endif /* ! defined (HAVE_X11) */
 
   return 0;
 }
@@ -2854,8 +2930,9 @@ x_text_icon (s, icon_name)
 
 /* A handler for SIGPIPE, when it occurs on the X server's connection.
    This basically does an orderly shutdown of Emacs.  */
+
 static SIGTYPE
-x_death_handler ()
+x_connection_closed ()
 {
   if (_Xdebug)
     abort ();
@@ -2863,193 +2940,96 @@ x_death_handler ()
     Fkill_emacs (make_number (70));
 }
 
-static char *x_proto_requests[] =
-{
-  "CreateWindow",
-  "ChangeWindowAttributes",
-  "GetWindowAttributes",
-  "DestroyWindow",
-  "DestroySubwindows",
-  "ChangeSaveSet",
-  "ReparentWindow",
-  "MapWindow",
-  "MapSubwindows",
-  "UnmapWindow",
-  "UnmapSubwindows",
-  "ConfigureWindow",
-  "CirculateWindow",
-  "GetGeometry",
-  "QueryTree",
-  "InternAtom",
-  "GetAtomName",
-  "ChangeProperty",
-  "DeleteProperty",
-  "GetProperty",
-  "ListProperties",
-  "SetSelectionOwner",
-  "GetSelectionOwner",
-  "ConvertSelection",
-  "SendEvent",
-  "GrabPointer",
-  "UngrabPointer",
-  "GrabButton",
-  "UngrabButton",
-  "ChangeActivePointerGrab",
-  "GrabKeyboard",
-  "UngrabKeyboard",
-  "GrabKey",
-  "UngrabKey",
-  "AllowEvents",
-  "GrabServer",
-  "UngrabServer",
-  "QueryPointer",
-  "GetMotionEvents",
-  "TranslateCoords",
-  "WarpPointer",
-  "SetInputFocus",
-  "GetInputFocus",
-  "QueryKeymap",
-  "OpenFont",
-  "CloseFont",
-  "QueryFont",
-  "QueryTextExtents",
-  "ListFonts",
-  "ListFontsWithInfo",
-  "SetFontPath",
-  "GetFontPath",
-  "CreatePixmap",
-  "FreePixmap",
-  "CreateGC",
-  "ChangeGC",
-  "CopyGC",
-  "SetDashes",
-  "SetClipRectangles",
-  "FreeGC",
-  "ClearArea",
-  "CopyArea",
-  "CopyPlane",
-  "PolyPoint",
-  "PolyLine",
-  "PolySegment",
-  "PolyRectangle",
-  "PolyArc",
-  "FillPoly",
-  "PolyFillRectangle",
-  "PolyFillArc",
-  "PutImage",
-  "GetImage",
-  "PolyText",
-  "PolyText",
-  "ImageText",
-  "ImageText",
-  "CreateColormap",
-  "FreeColormap",
-  "CopyColormapAndFree",
-  "InstallColormap",
-  "UninstallColormap",
-  "ListInstalledColormaps",
-  "AllocColor",
-  "AllocNamedColor",
-  "AllocColorCells",
-  "AllocColorPlanes",
-  "FreeColors",
-  "StoreColors",
-  "StoreNamedColor",
-  "QueryColors",
-  "LookupColor",
-  "CreateCursor",
-  "CreateGlyphCursor",
-  "FreeCursor",
-  "RecolorCursor",
-  "QueryBestSize",
-  "QueryExtension",
-  "ListExtensions",
-  "ChangeKeyboardMapping",
-  "GetKeyboardMapping",
-  "ChangeKeyboardControl",
-  "GetKeyboardControl",
-  "Bell",
-  "ChangePointerControl",
-  "GetPointerControl",
-  "SetScreenSaver",
-  "GetScreenSaver",
-  "ChangeHosts",
-  "ListHosts",
-  "SetAccessControl",
-  "SetCloseDownMode",
-  "KillClient",
-  "RotateProperties",
-  "ForceScreenSaver",
-  "SetPointerMapping",
-  "GetPointerMapping",
-  "SetModifierMapping",
-  "GetModifierMapping",
-  "NoOperation"
-};
+/* An X error handler which prints an error message and then kills Emacs.  
+   This is what's normally installed as Xlib's handler for protocol and 
+   I/O errors.  */
+static int
+x_error_quitter (display, error)
+     Display *display;
+     XErrorEvent *error;
+{
+  char buf[256];
 
-#define acceptable_x_error_p(type) ((type) == 94)
+  /* Note that there is no real way portable across R3/R4 to get the 
+     original error handler.  */
 
-x_handle_error_gracefully (event)
-     XErrorEvent *event;
-{
-  char error_ptr[128];
-  char *proto_ptr = x_proto_requests[event->request_code];
-  char str[128];
+  XGetErrorText (display, error->error_code, buf, sizeof (buf));
+  fprintf (stderr, "X protocol error: %s on protocol request %d\n",
+          buf, error->request_code);
 
-  XGetErrorText (x_current_display, event->error_code, error_ptr, 128);
-  sprintf (str, "X Protocol Error: %s on request: %s", error_ptr, proto_ptr);
-  TOTALLY_UNBLOCK_INPUT;
-  error (str);
+  x_connection_closed ();
 }
 
-#if 0
-extern int x_selection_alloc_error;
-extern int x_converting_selection;
-#endif
+/* A buffer for storing X error messages.  */
+static char (*x_caught_error_message)[200];
 
-/* Handle X Errors.  If the error is not traumatic,
-   just call error ().  Otherwise print a (hopefully) interesting
-   message and quit.
+/* An X error handler which stores the error message in
+   x_caught_error_message.  This is what's installed when
+   x_catch_errors is in effect.  */
+static int
+x_error_catcher (display, error)
+     Display *display;
+     XErrorEvent *error;
+{
+  XGetErrorText (display, error->error_code,
+                *x_caught_error_message, sizeof (*x_caught_error_message));
+}
 
-   The arg to Fkill_emacs is an exit status value
-   and also prevents any questions.  */
 
-x_error_handler (disp, event)
-     Display *disp;
-#ifdef HAVE_X11
-     XErrorEvent *event;
+/* Begin trapping X errors.
 
-#define XlibDisplayIOError     (1L << 0)
+   After calling this function, X protocol errors no longer cause
+   Emacs to exit; instead, they are recorded in x_cfc_error_message.
 
-#else
-     struct _XErrorEvent *event;
-#endif
+   Calling x_check_errors signals an Emacs error if an X error has
+   occurred since the last call to x_catch_errors or x_check_errors.
+
+   Calling x_uncatch_errors resumes the normal error handling.  */
+
+void x_catch_errors(), x_check_errors (), x_uncatch_errors ();
+
+void
+x_catch_errors ()
 {
-  /* Here we use the standard X handlers. */
+  /* Make sure any errors from previous requests have been dealt with.  */
+  XSync (x_current_display, False);
 
-  BLOCK_INPUT;
-  if (event && event->type == 0) /* 0 is the XError Event type. */
-    {
-#if 0
-#ifdef HAVE_X11
-      if (event->request_code == BadAlloc && x_converting_selection)
-       x_selection_alloc_error = 1;
-      else
-#endif
-#endif
-      if (acceptable_x_error_p (event->request_code))
-       x_handle_error_gracefully (event);
-      else
-       _XDefaultError (disp, event);
-    }
-  else
+  /* Set up the error buffer.  */
+  x_caught_error_message =
+    (char (*)[]) xmalloc (sizeof (*x_caught_error_message));
+  (*x_caught_error_message)[0] = '\0';
+
+  /* Install our little error handler.  */
+  XHandleError (x_error_catcher);
+}
+
+/* If any X protocol errors have arrived since the last call to
+   x_catch_errors or x_check_errors, signal an Emacs error using
+   sprintf (a buffer, FORMAT, the x error message text) as the text.  */
+void
+x_check_errors (format)
+     char *format;
+{
+  /* Make sure to catch any errors incurred so far.  */
+  XSync (x_current_display, False);
+
+  if ((*x_caught_error_message)[0])
     {
-      disp->flags |= XlibDisplayIOError;
-      _XDefaultIOError (disp);
+      char buf[256];
+
+      sprintf (buf, format, *x_caught_error_message);
+      free (x_caught_error_message);
+
+      x_uncatch_errors ();
+      error (buf);
     }
-  UNBLOCK_INPUT;
+}
 
-  x_death_handler ();
+void
+x_uncatch_errors ()
+{
+  free (x_caught_error_message);
+  XHandleError (x_error_quitter);
 }
 
 #if 0
@@ -3058,12 +3038,12 @@ x_trace_wire ()
 {
   fprintf (stderr, "Lib call: %d\n", ++x_wire_count);
 }
-#endif
+#endif /* ! 0 */
 
 \f
-/* Set the font of the x-window specified by screen S
+/* Set the font of the x-window specified by frame F
    to the font named NEWNAME.  This is safe to use
-   even before S has an actual x-window.  */
+   even before F has an actual x-window.  */
 
 #ifdef HAVE_X11
 
@@ -3078,8 +3058,8 @@ static int x_font_table_size;
    0 <= n_fonts <= x_font_table_size.  */
 static int n_fonts;
 
-x_new_font (s, fontname)
-     struct screen *s;
+x_new_font (f, fontname)
+     struct frame *f;
      register char *fontname;
 {
   XFontStruct *temp;
@@ -3116,7 +3096,7 @@ x_new_font (s, fontname)
   
   /* If we have, just return it from the table.  */
   if (already_loaded)
-    s->display.x->font = x_font_table[already_loaded];
+    f->display.x->font = x_font_table[already_loaded];
   
   /* Otherwise, load the font and add it to the table.  */
   else
@@ -3145,31 +3125,31 @@ x_new_font (s, fontname)
                                          * sizeof (x_font_table[0])));
        }
 
-      s->display.x->font = x_font_table[n_fonts++] = font;
+      f->display.x->font = x_font_table[n_fonts++] = font;
     }
   
   /* Free the information from XListFontsWithInfo.  The data
      we actually retain comes from XLoadQueryFont.  */
   XFreeFontInfo (font_names, font_info, n_matching_fonts);
 
-  /* Now make the screen display the given font.  */
-  if (s->display.x->window_desc != 0)
+  /* Now make the frame display the given font.  */
+  if (FRAME_X_WINDOW (f) != 0)
     {
-      XSetFont (x_current_display, s->display.x->normal_gc,
-               s->display.x->font->fid);
-      XSetFont (x_current_display, s->display.x->reverse_gc,
-               s->display.x->font->fid);
-      XSetFont (x_current_display, s->display.x->cursor_gc,
-               s->display.x->font->fid);
-
-      x_set_window_size (s, s->width, s->height);
+      XSetFont (x_current_display, f->display.x->normal_gc,
+               f->display.x->font->fid);
+      XSetFont (x_current_display, f->display.x->reverse_gc,
+               f->display.x->font->fid);
+      XSetFont (x_current_display, f->display.x->cursor_gc,
+               f->display.x->font->fid);
+
+      x_set_window_size (f, f->width, f->height);
     }
 
   return 0;
 }
-#else
-x_new_font (s, newname)
-     struct screen *s;
+#else /* ! defined (HAVE_X11) */
+x_new_font (f, newname)
+     struct frame *f;
      register char *newname;
 {
   FONT_TYPE *temp;
@@ -3179,184 +3159,194 @@ x_new_font (s, newname)
   if (temp == (FONT_TYPE *) 0)
     return 1;
 
-  if (s->display.x->font)
-    XLoseFont (s->display.x->font);
+  if (f->display.x->font)
+    XLoseFont (f->display.x->font);
 
-  s->display.x->font = temp;
+  f->display.x->font = temp;
 
-  if (s->display.x->window_desc != 0)
-    x_set_window_size (s, s->width, s->height);
+  if (FRAME_X_WINDOW (f) != 0)
+    x_set_window_size (f, f->width, f->height);
 
   return 0;
 }
-#endif
+#endif /* ! defined (HAVE_X11) */
 \f
-x_calc_absolute_position (s)
-     struct screen *s;
+x_calc_absolute_position (f)
+     struct frame *f;
 {
 #ifdef HAVE_X11
-  if (s->display.x->left_pos < 0)
-    s->display.x->left_pos
-      = XINT (x_screen_width) - PIXEL_WIDTH (s) + s->display.x->left_pos;
-
-  if (s->display.x->top_pos < 0)
-    s->display.x->top_pos
-      = XINT (x_screen_height) - PIXEL_HEIGHT (s) + s->display.x->top_pos;
-#else /* X10 */
+  if (f->display.x->left_pos < 0)
+    f->display.x->left_pos
+      = x_screen_width - PIXEL_WIDTH (f) + f->display.x->left_pos;
+
+  if (f->display.x->top_pos < 0)
+    f->display.x->top_pos
+      = x_screen_height - PIXEL_HEIGHT (f) + f->display.x->top_pos;
+#else /* ! defined (HAVE_X11) */
   WINDOWINFO_TYPE parentinfo;
 
-  XGetWindowInfo (s->display.x->window_desc, &parentinfo);
+  XGetWindowInfo (FRAME_X_WINDOW (f), &parentinfo);
 
-  if (s->display.x->left_pos < 0)
-    s->display.x->left_pos = parentinfo.width + (s->display.x->left_pos + 1)
-      - PIXEL_WIDTH (s) - 2 * s->display.x->internal_border_width;
+  if (f->display.x->left_pos < 0)
+    f->display.x->left_pos = parentinfo.width + (f->display.x->left_pos + 1)
+      - PIXEL_WIDTH (f) - 2 * f->display.x->internal_border_width;
 
-  if (s->display.x->top_pos < 0)
-    s->display.x->top_pos = parentinfo.height + (s->display.x->top_pos + 1)
-      - PIXEL_HEIGHT (s) - 2 * s->display.x->internal_border_width;
-#endif /* X10 */
+  if (f->display.x->top_pos < 0)
+    f->display.x->top_pos = parentinfo.height + (f->display.x->top_pos + 1)
+      - PIXEL_HEIGHT (f) - 2 * f->display.x->internal_border_width;
+#endif /* ! defined (HAVE_X11) */
 }
 
-x_set_offset (s, xoff, yoff)
-     struct screen *s;
+x_set_offset (f, xoff, yoff)
+     struct frame *f;
      register int xoff, yoff;
 {
-  s->display.x->top_pos = yoff;
-  s->display.x->left_pos = xoff;
-  x_calc_absolute_position (s);
+  f->display.x->top_pos = yoff;
+  f->display.x->left_pos = xoff;
+  x_calc_absolute_position (f);
 
   BLOCK_INPUT;
-  XMoveWindow (XDISPLAY s->display.x->window_desc,
-              s->display.x->left_pos, s->display.x->top_pos);
+  XMoveWindow (XDISPLAY FRAME_X_WINDOW (f),
+              f->display.x->left_pos, f->display.x->top_pos);
 #ifdef HAVE_X11
-  x_wm_set_size_hint (s, 0);
-#endif
+  x_wm_set_size_hint (f, 0);
+#endif /* ! defined (HAVE_X11) */
   UNBLOCK_INPUT;
 }
 
-/* Call this to change the size of screen S's x-window. */
+/* Call this to change the size of frame F's x-window. */
 
-x_set_window_size (s, cols, rows)
-     struct screen *s;
-     register int cols, rows;
+x_set_window_size (f, cols, rows)
+     struct frame *f;
+     int cols, rows;
 {
   int pixelwidth, pixelheight;
   int mask;
-  int ibw = s->display.x->internal_border_width;
+  int ibw = f->display.x->internal_border_width;
 
   BLOCK_INPUT;
 
-  /* ??? Who DOES worry about minimum reasonable sizes?  */
-  pixelwidth =  (cols * FONT_WIDTH (s->display.x->font) + 2 * ibw
-                + s->display.x->v_scrollbar_width);
-  pixelheight = (rows * FONT_HEIGHT (s->display.x->font) + 2 * ibw
-                + s->display.x->h_scrollbar_height);
+  check_frame_size (f, &rows, &cols);
+  pixelwidth =  (cols * FONT_WIDTH (f->display.x->font) + 2 * ibw
+                + f->display.x->v_scrollbar_width);
+  pixelheight = (rows * FONT_HEIGHT (f->display.x->font) + 2 * ibw
+                + f->display.x->h_scrollbar_height);
 
 #ifdef HAVE_X11
-  x_wm_set_size_hint (s, 0);
-#endif /* HAVE_X11 */
-  XChangeWindowSize (s->display.x->window_desc, pixelwidth, pixelheight);
+  x_wm_set_size_hint (f, 0);
+#endif /* ! defined (HAVE_X11) */
+  XChangeWindowSize (FRAME_X_WINDOW (f), pixelwidth, pixelheight);
+
+  /* Now, strictly speaking, we can't be sure that this is accurate,
+     but the window manager will get around to dealing with the size
+     change request eventually, and we'll hear how it went when the
+     ConfigureNotify event gets here.  */
+  FRAME_WIDTH (f) = cols;
+  FRAME_WIDTH (f) = rows;
+  PIXEL_WIDTH (f) = pixelwidth;
+  PIXEL_HEIGHT (f) = pixelheight;
+
   XFlushQueue ();
   UNBLOCK_INPUT;
 }
 
 #ifndef HAVE_X11
-x_set_resize_hint (s)
-     struct screen *s;
+x_set_resize_hint (f)
+     struct frame *f;
 {
 
-  XSetResizeHint (s->display.x->window_desc, 2 * s->display.x->internal_border_width,
-                 2 * s->display.x->internal_border_width,
-                 FONT_WIDTH (s->display.x->font), FONT_HEIGHT (s->display.x->font));
+  XSetResizeHint (FRAME_X_WINDOW (f), 2 * f->display.x->internal_border_width,
+                 2 * f->display.x->internal_border_width,
+                 FONT_WIDTH (f->display.x->font), FONT_HEIGHT (f->display.x->font));
 }
-#endif /* not HAVE_X11 */
+#endif /* HAVE_X11 */
 \f
 
-x_set_mouse_position (s, x, y)
-     struct screen *s;
+x_set_mouse_position (f, x, y)
+     struct frame *f;
      int x, y;
 {
   int pix_x, pix_y;
 
-  x_raise_screen (s);
+  x_raise_frame (f);
 
   if (x < 0)
-    pix_x = (SCREEN_WIDTH (s)
-             * FONT_WIDTH (s->display.x->font)
-             + 2 * s->display.x->internal_border_width
-             + s->display.x->v_scrollbar_width) / 2;
+    pix_x = (FRAME_WIDTH (f)
+             * FONT_WIDTH (f->display.x->font)
+             + 2 * f->display.x->internal_border_width
+             + f->display.x->v_scrollbar_width) / 2;
   else
-    pix_x = x * FONT_WIDTH (s->display.x->font) + 2; /* add 2 pixels to each
+    pix_x = x * FONT_WIDTH (f->display.x->font) + 2; /* add 2 pixels to each
                                                         dimension to move the
                                                         mouse into the char
                                                         cell */
 
   if (y < 0)
-    pix_y = (SCREEN_HEIGHT (s)
-             * FONT_HEIGHT (s->display.x->font)
-             + 2 * s->display.x->internal_border_width
-             + s->display.x->h_scrollbar_height) / 2;
+    pix_y = (FRAME_HEIGHT (f)
+             * FONT_HEIGHT (f->display.x->font)
+             + 2 * f->display.x->internal_border_width
+             + f->display.x->h_scrollbar_height) / 2;
   else
-    pix_y = y * FONT_HEIGHT (s->display.x->font) + 2;
+    pix_y = y * FONT_HEIGHT (f->display.x->font) + 2;
 
   BLOCK_INPUT;
   x_mouse_x = x;
   x_mouse_y = y;
 
-  XWarpMousePointer (s->display.x->window_desc, pix_x, pix_y);
+  XWarpMousePointer (FRAME_X_WINDOW (f), pix_x, pix_y);
   UNBLOCK_INPUT;
 }
 
 #ifdef HAVE_X11
-x_focus_on_screen (s)
-     struct screen *s;
+x_focus_on_frame (f)
+     struct frame *f;
 {
-  x_raise_screen (s);
+  x_raise_frame (f);
 #if 0
   /* I don't think that the ICCCM allows programs to do things like this
      without the interaction of the window manager.  Whatever you end up
-     doing with this code, do it to x_unfocus_screen too.  */
-  XSetInputFocus (x_current_display, s->display.x->window_desc,
+     doing with this code, do it to x_unfocus_frame too.  */
+  XSetInputFocus (x_current_display, FRAME_X_WINDOW (f),
                  RevertToPointerRoot, CurrentTime);
-#endif
+#endif /* ! 0 */
 }
 
-x_unfocus_screen (s)
-     struct screen *s;
+x_unfocus_frame (f)
+     struct frame *f;
 {
 #if 0
-  /* Look at the remarks in x_focus_on_screen.  */
-  if (x_focus_screen == s)
+  /* Look at the remarks in x_focus_on_frame.  */
+  if (x_focus_frame == f)
     XSetInputFocus (x_current_display, PointerRoot,
                    RevertToPointerRoot, CurrentTime);
-#endif
+#endif /* ! 0 */
 }
 
-#endif
+#endif /* ! defined (HAVE_X11) */
 
-/* Raise screen S.  */
+/* Raise frame F.  */
 
-x_raise_screen (s)
-     struct screen *s;
+x_raise_frame (f)
+     struct frame *f;
 {
-  if (s->visible)
+  if (f->visible)
     {
       BLOCK_INPUT;
-      XRaiseWindow (XDISPLAY s->display.x->window_desc);
+      XRaiseWindow (XDISPLAY FRAME_X_WINDOW (f));
       XFlushQueue ();
       UNBLOCK_INPUT;
     }
 }
 
-/* Lower screen S.  */
+/* Lower frame F.  */
 
-x_lower_screen (s)
-     struct screen *s;
+x_lower_frame (f)
+     struct frame *f;
 {
-  if (s->visible)
+  if (f->visible)
     {
       BLOCK_INPUT;
-      XLowerWindow (XDISPLAY s->display.x->window_desc);
+      XLowerWindow (XDISPLAY FRAME_X_WINDOW (f));
       XFlushQueue ();
       UNBLOCK_INPUT;
     }
@@ -3364,34 +3354,34 @@ x_lower_screen (s)
 
 /* Change from withdrawn state to mapped state. */
 
-x_make_screen_visible (s)
-     struct screen *s;
+x_make_frame_visible (f)
+     struct frame *f;
 {
   int mask;
 
   BLOCK_INPUT;
 
-  if (! SCREEN_VISIBLE_P (s))
+  if (! FRAME_VISIBLE_P (f))
     {
 #ifdef HAVE_X11
       if (! EQ (Vx_no_window_manager, Qt))
-       x_wm_set_window_state (s, NormalState);
+       x_wm_set_window_state (f, NormalState);
 
-      XMapWindow (XDISPLAY s->display.x->window_desc);
-      if (s->display.x->v_scrollbar != 0 || s->display.x->h_scrollbar != 0)
-       XMapSubwindows (x_current_display, s->display.x->window_desc);
-#else
-      XMapWindow (XDISPLAY s->display.x->window_desc);
-      if (s->display.x->icon_desc != 0)
-       XUnmapWindow (s->display.x->icon_desc);
+      XMapWindow (XDISPLAY FRAME_X_WINDOW (f));
+      if (f->display.x->v_scrollbar != 0 || f->display.x->h_scrollbar != 0)
+       XMapSubwindows (x_current_display, FRAME_X_WINDOW (f));
+#else /* ! defined (HAVE_X11) */
+      XMapWindow (XDISPLAY FRAME_X_WINDOW (f));
+      if (f->display.x->icon_desc != 0)
+       XUnmapWindow (f->display.x->icon_desc);
 
       /* Handled by the MapNotify event for X11 */
-      s->visible = 1;
-      s->iconified = 0;
+      f->visible = 1;
+      f->iconified = 0;
 
-      /* NOTE: this may cause problems for the first screen. */
+      /* NOTE: this may cause problems for the first frame. */
       XTcursor_to (0, 0);
-#endif                         /* not HAVE_X11 */
+#endif /* ! defined (HAVE_X11) */
     }
 
   XFlushQueue ();
@@ -3401,124 +3391,132 @@ x_make_screen_visible (s)
 
 /* Change from mapped state to withdrawn state. */
 
-x_make_screen_invisible (s)
-     struct screen *s;
+x_make_frame_invisible (f)
+     struct frame *f;
 {
   int mask;
 
-  if (! s->visible)
+  if (! f->visible)
     return;
 
   BLOCK_INPUT;
-#ifdef HAVE_X11
-#if 0
-  if (! EQ (Vx_no_window_manager, Qt))
-    {
-      XUnmapEvent unmap;
-
-      unmap.type = UnmapNotify;
-      unmap.window = s->display.x->window_desc;
-      unmap.event = DefaultRootWindow (x_current_display);
-      unmap.from_configure = False;
-      XSendEvent (x_current_display, DefaultRootWindow (x_current_display),
-                 False, SubstructureRedirectMask|SubstructureNotifyMask,
-                 &unmap);
-    }
 
-  /* The new function below does the same as the above code, plus unmapping
-     the window.  Sending the event without actually unmapping can make
-     the window manager start ignoring the window (i.e., no more title bar,
-     icon manager stuff.) */
-#endif
+#ifdef HAVE_X11R4
 
-  /* New function available with R4 */
-  if (! XWithdrawWindow (x_current_display, s->display.x->window_desc,
+  if (! XWithdrawWindow (x_current_display, FRAME_X_WINDOW (f),
                         DefaultScreen (x_current_display)))
     {
       UNBLOCK_INPUT_RESIGNAL;
-      error ("Can't notify window manager of iconification.");
+      error ("can't notify window manager of window withdrawl");
     }
 
-#else
-  XUnmapWindow (XDISPLAY s->display.x->window_desc);
+#else /* ! defined (HAVE_X11R4) */
+#ifdef HAVE_X11
+
+  /*  Tell the window manager what we're going to do.  */
+  if (! EQ (Vx_no_window_manager, Qt))
+    {
+      XEvent unmap;
+
+      unmap.xunmap.type = UnmapNotify;
+      unmap.xunmap.window = FRAME_X_WINDOW (f);
+      unmap.xunmap.event = DefaultRootWindow (x_current_display);
+      unmap.xunmap.from_configure = False;
+      if (! XSendEvent (x_current_display,
+                       DefaultRootWindow (x_current_display),
+                       False,
+                       SubstructureRedirectMask|SubstructureNotifyMask,
+                       &unmap))
+       {
+         UNBLOCK_INPUT_RESIGNAL;
+         error ("can't notify window manager of withdrawal");
+       }
+    }
 
-  s->visible = 0;              /* Handled by the UnMap event for X11 */
-  if (s->display.x->icon_desc != 0)
-    XUnmapWindow (XDISPLAY s->display.x->icon_desc);
-#endif /* not HAVE_X11 */
+  /* Unmap the window ourselves.  Cheeky!  */
+  XUnmapWindow (x_current_display, FRAME_X_WINDOW (f));
+
+#else /* ! defined (HAVE_X11) */
+
+  XUnmapWindow (FRAME_X_WINDOW (f));
+  f->visible = 0;              /* Handled by the UnMap event for X11 */
+  if (f->display.x->icon_desc != 0)
+    XUnmapWindow (f->display.x->icon_desc);
+
+#endif /* ! defined (HAVE_X11) */
+#endif /* ! defined (HAVE_X11R4) */
 
   XFlushQueue ();
   UNBLOCK_INPUT;
 }
 
- /* Window manager communication.  Created in Fx_open_connection. */
+/* Window manager communication.  Created in Fx_open_connection. */
 extern Atom Xatom_wm_change_state;
 
 /* Change window state from mapped to iconified. */
 
-x_iconify_screen (s)
-     struct screen *s;
+x_iconify_frame (f)
+     struct frame *f;
 {
   int mask;
 
-  if (s->iconified)
+  if (f->iconified)
     return;
 
   BLOCK_INPUT;
 
 #ifdef HAVE_X11
-  if (! EQ (Vx_no_window_manager, Qt))
-    if (! XIconifyWindow (x_current_display, s->display.x->window_desc,
-                         DefaultScreen (x_current_display)))
+  /* Since we don't know which revision of X we're running, we'll use both
+     the X11R3 and X11R4 techniques.  I don't know if this is a good idea.  */
+
+  /* X11R4: send a ClientMessage to the window manager using the
+     WM_CHANGE_STATE type.  */
+  {
+    XEvent message;
+    
+    message.xclient.window = FRAME_X_WINDOW (f);
+    message.xclient.type = ClientMessage;
+    message.xclient.message_type = Xatom_wm_change_state;
+    message.xclient.format = 32;
+    message.xclient.data.l[0] = IconicState;
+
+    if (! XSendEvent (x_current_display,
+                     DefaultRootWindow (x_current_display),
+                     False,
+                     SubstructureRedirectMask | SubstructureNotifyMask,
+                     &message))
       {
        UNBLOCK_INPUT_RESIGNAL;
        error ("Can't notify window manager of iconification.");
       }
+  }
 
-  s->iconified = 1;
-  
-#if 0
-    {
-      XClientMessageEvent message;
-    
-      message.window = s->display.x->window_desc;
-      message.type = ClientMessage;
-      message.message_type = Xatom_wm_change_state;
-      message.format = 32;
-      message.data.l[0] = IconicState;
+  /* X11R3: set the initial_state field of the window manager hints to 
+     IconicState.  */
+  x_wm_set_window_state (f, IconicState);
 
-      if (! XSendEvent (x_current_display,
-                       DefaultRootWindow (x_current_display),
-                       False,
-                       SubstructureRedirectMask | SubstructureNotifyMask,
-                       &message))
-       {
-         UNBLOCK_INPUT_RESIGNAL;
-         error ("Can't notify window manager of iconification.");
-       }
-    }
-#endif
-#else /* X10 */
-  XUnmapWindow (XDISPLAY s->display.x->window_desc);
+  f->iconified = 1;
+#else /* ! defined (HAVE_X11) */
+  XUnmapWindow (XDISPLAY FRAME_X_WINDOW (f));
 
-  s->visible = 0;              /* Handled in the UnMap event for X11. */
-  if (s->display.x->icon_desc != 0)
+  f->visible = 0;              /* Handled in the UnMap event for X11. */
+  if (f->display.x->icon_desc != 0)
     {
-      XMapWindow (XDISPLAY s->display.x->icon_desc);
-      refreshicon (s);
+      XMapWindow (XDISPLAY f->display.x->icon_desc);
+      refreshicon (f);
     }
-#endif /* X10 */
+#endif /* ! defined (HAVE_X11) */
 
   XFlushQueue ();
   UNBLOCK_INPUT;
 }
 
-/* Destroy the X window of screen S.
-   DISPL is the former s->display (since s->display
+/* Destroy the X window of frame F.
+   DISPL is the former f->display (since f->display
    has already been nulled out).  */
 
-x_destroy_window (s, displ)
-     struct screen *s;
+x_destroy_window (f, displ)
+     struct frame *f;
      union display displ;
 {
   int mask;
@@ -3531,10 +3529,10 @@ x_destroy_window (s, displ)
   UNBLOCK_INPUT;
 
   free (displ.x);
-  if (s == x_focus_screen)
-    x_focus_screen = 0;
-  if (s == x_highlight_screen)
-    x_highlight_screen = 0;
+  if (f == x_focus_frame)
+    x_focus_frame = 0;
+  if (f == x_highlight_frame)
+    x_highlight_frame = 0;
 }
 \f
 #ifndef HAVE_X11
@@ -3607,42 +3605,68 @@ mouse_event_pending_p ()
 {
   return queue_event_count (&x_mouse_queue);
 }
-#endif
+#endif /* HAVE_X11 */
 \f
 #ifdef HAVE_X11
 
-x_wm_set_size_hint (s, prompting)
-     struct screen *s;
+x_wm_set_size_hint (f, prompting)
+     struct frame *f;
      long prompting;
 {
   XSizeHints size_hints;
-  Window window = s->display.x->window_desc;
+  Window window = FRAME_X_WINDOW (f);
 
   size_hints.flags = PResizeInc | PMinSize | PMaxSize;
-#ifdef PBaseSize
-  size_hints.flags |= PBaseSize;
+
+  flexlines = f->height;
+
+  size_hints.x = f->display.x->left_pos;
+  size_hints.y = f->display.x->top_pos;
+  size_hints.height = PIXEL_HEIGHT (f);
+  size_hints.width = PIXEL_WIDTH (f);
+  size_hints.width_inc = FONT_WIDTH (f->display.x->font);
+  size_hints.height_inc = FONT_HEIGHT (f->display.x->font);
+  size_hints.max_width =
+    (x_screen_width - ((2 * f->display.x->internal_border_width)
+                      + f->display.x->v_scrollbar_width));
+  size_hints.max_height =
+    (x_screen_height - ((2 * f->display.x->internal_border_width)
+                       + f->display.x->h_scrollbar_height));
+  {
+    int base_width, base_height;
+
+    base_width = ((2 * f->display.x->internal_border_width)
+                 + f->display.x->v_scrollbar_width);
+    base_height = ((2 * f->display.x->internal_border_width)
+                  + f->display.x->h_scrollbar_height);
+
+    {
+      int min_rows = 0, min_cols = 0;
+      check_frame_size (f, &min_rows, &min_cols);
+
+      /* The window manager uses the base width hints to calculate the
+        current number of rows and columns in the frame while
+        resizing; min_width and min_height aren't useful for this
+        purpose, since they might not give the dimensions for a
+        zero-row, zero-column frame.
+
+        We use the base_width and base_height members if we have
+        them; otherwise, we set the min_width and min_height members
+        to the size for a zero x zero frame.  */
+
+#ifdef HAVE_X11R4
+      size_hints.flags |= PBaseSize;
+      size_hints.base_width = base_width;
+      size_hints.base_height = base_height;
+      size_hints.min_width  = base_width + min_cols * size_hints.width_inc;
+      size_hints.min_height = base_height + min_rows * size_hints.height_inc;
+#else
+      size_hints.min_width = base_width;
+      size_hints.min_height = base_height;
 #endif
+    }
 
-  flexlines = s->height;
-
-  size_hints.x = s->display.x->left_pos;
-  size_hints.y = s->display.x->top_pos;
-  size_hints.height = PIXEL_HEIGHT (s);
-  size_hints.width = PIXEL_WIDTH (s);
-  size_hints.width_inc = FONT_WIDTH (s->display.x->font);
-  size_hints.height_inc = FONT_HEIGHT (s->display.x->font);
-  size_hints.base_width = (2 * s->display.x->internal_border_width)
-    + s->display.x->v_scrollbar_width;
-  size_hints.base_height = (2 * s->display.x->internal_border_width)
-    + s->display.x->h_scrollbar_height;
-  size_hints.min_width = size_hints.base_width + size_hints.width_inc;
-  size_hints.min_height = size_hints.base_height + size_hints.height_inc;
-  size_hints.max_width = x_screen_width
-    - ((2 * s->display.x->internal_border_width)
-       + s->display.x->v_scrollbar_width);
-  size_hints.max_height = x_screen_height
-    - ((2 * s->display.x->internal_border_width)
-       + s->display.x->h_scrollbar_height);
+  }
 
   if (prompting)
     size_hints.flags |= prompting;
@@ -3660,49 +3684,50 @@ x_wm_set_size_hint (s, prompting)
       if (hints.flags & USSize)
        size_hints.flags |= USSize;
     }
-  
-#if 0                          /* R3 */
+
+#ifdef HAVE_X11R4
+  XSetWMNormalHints (x_current_display, window, &size_hints);
+#else
   XSetNormalHints (x_current_display, window, &size_hints);
 #endif
-  XSetWMNormalHints (x_current_display, window, &size_hints);
 }
 
 /* Used for IconicState or NormalState */
-x_wm_set_window_state (s, state)
-     struct screen *s;
+x_wm_set_window_state (f, state)
+     struct frame *f;
      int state;
 {
-  XWMHints wm_hints;
-  Window window = s->display.x->window_desc;
+  Window window = FRAME_X_WINDOW (f);
 
-  wm_hints.flags = StateHint;
-  wm_hints.initial_state = state;
-  XSetWMHints (x_current_display, window, &wm_hints);
+  f->display.x->wm_hints.flags |= StateHint;
+  f->display.x->wm_hints.initial_state = state;
+
+  XSetWMHints (x_current_display, window, &f->display.x->wm_hints);
 }
 
-x_wm_set_icon_pixmap (s, icon_pixmap)
-     struct screen *s;
+x_wm_set_icon_pixmap (f, icon_pixmap)
+     struct frame *f;
      Pixmap icon_pixmap;
 {
-  XWMHints wm_hints;
-  Window window = s->display.x->window_desc;
+  Window window = FRAME_X_WINDOW (f);
+
+  f->display.x->wm_hints.flags |= IconPixmapHint;
+  f->display.x->wm_hints.icon_pixmap = icon_pixmap ? icon_pixmap : None;
 
-  wm_hints.flags = IconPixmapHint;
-  wm_hints.icon_pixmap = icon_pixmap;
-  XSetWMHints (x_current_display, window, &wm_hints);
+  XSetWMHints (x_current_display, window, &f->display.x->wm_hints);
 }
 
-x_wm_set_icon_position (s, icon_x, icon_y)
-     struct screen *s;
+x_wm_set_icon_position (f, icon_x, icon_y)
+     struct frame *f;
      int icon_x, icon_y;
 {
-  XWMHints wm_hints;
-  Window window = s->display.x->window_desc;
+  Window window = FRAME_X_WINDOW (f);
 
-  wm_hints.flags = IconPositionHint;
-  wm_hints.icon_x = icon_x;
-  wm_hints.icon_y = icon_y;
-  XSetWMHints (x_current_display, window, &wm_hints);
+  f->display.x->wm_hints.flags |= IconPositionHint;
+  f->display.x->wm_hints.icon_x = icon_x;
+  f->display.x->wm_hints.icon_y = icon_y;
+
+  XSetWMHints (x_current_display, window, &f->display.x->wm_hints);
 }
 
 \f
@@ -3710,13 +3735,13 @@ void
 x_term_init (display_name)
      char *display_name;
 {
-  Lisp_Object screen;
+  Lisp_Object frame;
   char *defaultvalue;
 #ifdef F_SETOWN
   extern int old_fcntl_owner;
-#endif
+#endif /* ! defined (F_SETOWN) */
   
-  x_focus_screen = x_highlight_screen = 0;
+  x_focus_frame = x_highlight_frame = 0;
 
   x_current_display = XOpenDisplay (display_name);
   if (x_current_display == 0)
@@ -3725,13 +3750,13 @@ x_term_init (display_name)
 
 #ifdef HAVE_X11
   {
-    int hostname_size = MAXHOSTNAMELEN + 1;
+    int hostname_size = 256;
 
     hostname = (char *) xmalloc (hostname_size);
 
 #if 0
     XSetAfterFunction (x_current_display, x_trace_wire);
-#endif
+#endif /* ! 0 */
 
     invocation_name = Ffile_name_nondirectory (Fcar (Vcommand_line_args));
 
@@ -3756,7 +3781,14 @@ x_term_init (display_name)
                                + 2);
     sprintf (x_id_name, "%s@%s", XSTRING (invocation_name)->data, hostname);
   }
+
+  /* Figure out which modifier bits mean what.  */
+  x_find_modifier_meanings ();
   
+  /* Watch for PropertyNotify events on the root window; we use them
+     to figure out when to invalidate our cache of the cut buffers.  */
+  x_watch_cut_buffer_cache ();
+
   dup2 (ConnectionNumber (x_current_display), 0);
 
 #ifndef SYSV_STREAMS
@@ -3767,22 +3799,22 @@ x_term_init (display_name)
   ConnectionNumber (x_current_display) = 0;    /* Looks a little strange?
                                                 * check the def of the macro;
                                                 * it is a genuine lvalue */
-#endif /* not SYSV_STREAMS */
+#endif /* SYSV_STREAMS */
 
-#endif /* HAVE_X11 */
+#endif /* ! defined (HAVE_X11) */
   
 #ifdef F_SETOWN
   old_fcntl_owner = fcntl (0, F_GETOWN, 0);
 #ifdef F_SETOWN_SOCK_NEG
   fcntl (0, F_SETOWN, -getpid ());     /* stdin is a socket here */
-#else
+#else /* ! defined (F_SETOWN_SOCK_NEG) */
   fcntl (0, F_SETOWN, getpid ());
-#endif /* F_SETOWN_SOCK_NEG */
-#endif /* F_SETOWN */
+#endif /* ! defined (F_SETOWN_SOCK_NEG) */
+#endif /* ! defined (F_SETOWN) */
 
 #ifdef SIGIO
   init_sigio ();
-#endif
+#endif /* ! defined (SIGIO) */
 
   /* Must use interrupt input because we cannot otherwise
      arrange for C-g to be noticed immediately.
@@ -3791,7 +3823,7 @@ x_term_init (display_name)
 
   expose_all_windows = 0;
 
-  clear_screen_hook = XTclear_screen;
+  clear_frame_hook = XTclear_frame;
   clear_end_of_line_hook = XTclear_end_of_line;
   ins_del_lines_hook = XTins_del_lines;
   change_line_highlight_hook = XTchange_line_highlight;
@@ -3807,26 +3839,28 @@ x_term_init (display_name)
   read_socket_hook = XTread_socket;
   cursor_to_hook = XTcursor_to;
   reassert_line_highlight_hook = XTreassert_line_highlight;
-  screen_rehighlight_hook = XTscreen_rehighlight;
+  frame_rehighlight_hook = XTframe_rehighlight;
   mouse_position_hook = XTmouse_position;
   
-  scroll_region_ok = 1;                /* we'll scroll partial screens */
+  scroll_region_ok = 1;                /* we'll scroll partial frames */
   char_ins_del_ok = 0;         /* just as fast to write the line */
   line_ins_del_ok = 1;         /* we'll just blt 'em */
   fast_clear_end_of_line = 1;  /* X does this well */
-  memory_below_screen = 0;     /* we don't remember what scrolls 
+  memory_below_frame = 0;      /* we don't remember what scrolls 
                                   off the bottom */
   baud_rate = 19200;
 
-  XHandleError (x_error_handler);
-  XHandleIOError (x_error_handler);
+  /* Note that there is no real way portable across R3/R4 to get the 
+     original error handler.  */
+  XHandleError (x_error_quitter);
+  XHandleIOError (x_error_quitter);
 
   /* Disable Window Change signals;  they are handled by X events. */
 #ifdef SIGWINCH
   signal (SIGWINCH, SIG_DFL);
-#endif /* SIGWINCH */
+#endif /* ! defined (SIGWINCH) */
 
-  signal (SIGPIPE, x_death_handler);
+  signal (SIGPIPE, x_connection_closed);
 }
 
 void
@@ -3835,5 +3869,5 @@ syms_of_xterm ()
   staticpro (&invocation_name);
   invocation_name = Qnil;
 }
-#endif /* HAVE_X11 */
-#endif /* HAVE_X_WINDOWS */
+#endif /* ! defined (HAVE_X11) */
+#endif /* ! defined (HAVE_X_WINDOWS) */