(Fx_pixel_width, Fx_pixel_height): Fns deleted.
[bpt/emacs.git] / src / xfns.c
index d3943a5..307aa35 100644 (file)
@@ -1,5 +1,5 @@
 /* Functions for the X window system.
-   Copyright (C) 1989, 1992 Free Software Foundation.
+   Copyright (C) 1989, 1992, 1993 Free Software Foundation.
 
 This file is part of GNU Emacs.
 
@@ -28,17 +28,16 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #include "config.h"
 #include "lisp.h"
 #include "xterm.h"
-#include "screen.h"
+#include "frame.h"
 #include "window.h"
 #include "buffer.h"
 #include "dispextern.h"
-#include "xscrollbar.h"
 #include "keyboard.h"
 
 #ifdef HAVE_X_WINDOWS
 extern void abort ();
 
-void x_set_screen_param ();
+#include <X11/bitmaps/gray>
 
 #define min(a,b) ((a) < (b) ? (a) : (b))
 #define max(a,b) ((a) > (b) ? (a) : (b))
@@ -50,10 +49,6 @@ static XrmDatabase xrdb;
 /* The class of this X application.  */
 #define EMACS_CLASS "Emacs"
 
-/* The class of Emacs screens.  */
-#define SCREEN_CLASS "Screen"
-Lisp_Object screen_class;
-
 /* Title name and application name for X stuff. */
 extern char *x_id_name;
 extern Lisp_Object invocation_name;
@@ -65,9 +60,6 @@ Lisp_Object Vx_pointer_shape, Vx_nontext_pointer_shape, Vx_mode_pointer_shape;
 /* Color of chars displayed in cursor box. */
 Lisp_Object Vx_cursor_fore_pixel;
 
-/* If non-nil, use vertical bar cursor. */
-Lisp_Object Vbar_cursor;
-
 /* The X Visual we are using for X windows (the default) */
 Visual *screen_visual;
 
@@ -121,15 +113,14 @@ static char *x_visual_strings[] =
 
 Lisp_Object Vmouse_depressed;
 
+extern unsigned int x_mouse_x, x_mouse_y, x_mouse_grabbed;
+
 /* Atom for indicating window state to the window manager. */
 Atom Xatom_wm_change_state;
 
 /* When emacs became the selection owner. */
 extern Time x_begin_selection_own;
 
-/* The value of the current emacs selection. */
-extern Lisp_Object Vx_selection_value;
-
 /* Emacs' selection property identifier. */
 extern Atom Xatom_emacs_selection;
 
@@ -166,9 +157,21 @@ extern Atom Xatom_insert_property;
 /* Atom for indicating property type TEXT */
 extern Atom Xatom_text;
 
+/* Communication with window managers. */
+extern Atom Xatom_wm_protocols;
+
+/* Kinds of protocol things we may receive. */
+extern Atom Xatom_wm_take_focus;
+extern Atom Xatom_wm_save_yourself;
+extern Atom Xatom_wm_delete_window;
+
+/* Other WM communication */
+extern Atom Xatom_wm_configure_denied; /* When our config request is denied */
+extern Atom Xatom_wm_window_moved;     /* When the WM moves us. */
+
 #else  /* X10 */
 
-/* Default size of an Emacs window without scroll bar.  */
+/* Default size of an Emacs window.  */
 static char *default_window = "=80x24+0+0";
 
 #define MAXICID 80
@@ -182,8 +185,73 @@ char minibuffer_iconidentity[MAXICID];
 /* The last 23 bits of the timestamp of the last mouse button event. */
 Time mouse_timestamp;
 
+/* Evaluate this expression to rebuild the section of syms_of_xfns
+   that initializes and staticpros the symbols declared below.  Note
+   that Emacs 18 has a bug that keeps C-x C-e from being able to
+   evaluate this expression.
+
+(progn
+  ;; Accumulate a list of the symbols we want to initialize from the
+  ;; declarations at the top of the file.
+  (goto-char (point-min))
+  (search-forward "/\*&&& symbols declared here &&&*\/\n")
+  (let (symbol-list)
+    (while (looking-at "Lisp_Object \\(Q[a-z_]+\\)")
+      (setq symbol-list
+           (cons (buffer-substring (match-beginning 1) (match-end 1))
+                 symbol-list))
+      (forward-line 1))
+    (setq symbol-list (nreverse symbol-list))
+    ;; Delete the section of syms_of_... where we initialize the symbols.
+    (search-forward "\n  /\*&&& init symbols here &&&*\/\n")
+    (let ((start (point)))
+      (while (looking-at "^  Q")
+       (forward-line 2))
+      (kill-region start (point)))
+    ;; Write a new symbol initialization section.
+    (while symbol-list
+      (insert (format "  %s = intern (\"" (car symbol-list)))
+      (let ((start (point)))
+       (insert (substring (car symbol-list) 1))
+       (subst-char-in-region start (point) ?_ ?-))
+      (insert (format "\");\n  staticpro (&%s);\n" (car symbol-list)))
+      (setq symbol-list (cdr symbol-list)))))
+
+  */        
+
+/*&&& symbols declared here &&&*/
+Lisp_Object Qauto_raise;
+Lisp_Object Qauto_lower;
+Lisp_Object Qbackground_color;
+Lisp_Object Qbar;
+Lisp_Object Qborder_color;
+Lisp_Object Qborder_width;
+Lisp_Object Qbox;
+Lisp_Object Qcursor_color;
+Lisp_Object Qcursor_type;
+Lisp_Object Qfont;
+Lisp_Object Qforeground_color;
+Lisp_Object Qgeometry;
+Lisp_Object Qicon_left;
+Lisp_Object Qicon_top;
+Lisp_Object Qicon_type;
+Lisp_Object Qiconic_startup;
+Lisp_Object Qinternal_border_width;
+Lisp_Object Qleft;
+Lisp_Object Qmouse_color;
+Lisp_Object Qnone;
+Lisp_Object Qparent_id;
+Lisp_Object Qsuppress_icon;
+Lisp_Object Qsuppress_initial_map;
+Lisp_Object Qtop;
 Lisp_Object Qundefined_color;
-Lisp_Object Qx_screen_parameter;
+Lisp_Object Qvertical_scroll_bars;
+Lisp_Object Qwindow_id;
+Lisp_Object Qx_frame_parameter;
+
+/* The below are defined in frame.c. */
+extern Lisp_Object Qheight, Qminibuffer, Qname, Qonly, Qwidth;
+extern Lisp_Object Qunsplittable;
 
 extern Lisp_Object Vwindow_system_version;
 
@@ -193,112 +261,38 @@ extern Lisp_Object Vglobal_mouse_map;
 /* Points to table of defined typefaces.  */
 struct face *x_face_table[MAX_FACES_AND_GLYPHS];
 \f
-/* Return the Emacs screen-object corresponding to an X window.
-   It could be the screen's main window or an icon window.  */
+/* Return the Emacs frame-object corresponding to an X window.
+   It could be the frame's main window or an icon window.  */
 
-struct screen *
-x_window_to_screen (wdesc)
+struct frame *
+x_window_to_frame (wdesc)
      int wdesc;
 {
-  Lisp_Object tail, screen;
-  struct screen *s;
+  Lisp_Object tail, frame;
+  struct frame *f;
 
-  for (tail = Vscreen_list; CONSP (tail); tail = XCONS (tail)->cdr)
+  for (tail = Vframe_list; CONSP (tail); tail = XCONS (tail)->cdr)
     {
-      screen = XCONS (tail)->car;
-      if (XTYPE (screen) != Lisp_Screen)
+      frame = XCONS (tail)->car;
+      if (XTYPE (frame) != Lisp_Frame)
         continue;
-      s = XSCREEN (screen);
-      if (s->display.x->window_desc == wdesc
-          || s->display.x->icon_desc == wdesc)
-        return s;
+      f = XFRAME (frame);
+      if (FRAME_X_WINDOW (f) == wdesc
+          || f->display.x->icon_desc == wdesc)
+        return f;
     }
   return 0;
 }
 
-/* Map an X window that implements a scroll bar to the Emacs screen it
-   belongs to.  Also store in *PART a symbol identifying which part of
-   the scroll bar it is.  */
-
-struct screen *
-x_window_to_scrollbar (wdesc, part_ptr, prefix_ptr)
-     int wdesc;
-     Lisp_Object *part_ptr;
-     enum scroll_bar_prefix *prefix_ptr;
-{
-  Lisp_Object tail, screen;
-  struct screen *s;
-
-  for (tail = Vscreen_list; CONSP (tail); tail = XCONS (tail)->cdr)
-    {
-      screen = XCONS (tail)->car;
-      if (XTYPE (screen) != Lisp_Screen)
-        continue;
-
-      s = XSCREEN (screen);
-      if (part_ptr == 0 && prefix_ptr == 0)
-        return s;
-
-      if (s->display.x->v_scrollbar == wdesc)
-        {
-         *part_ptr = Qvscrollbar_part;
-          *prefix_ptr = VSCROLL_BAR_PREFIX;
-          return s;
-        }
-      else if (s->display.x->v_slider == wdesc)
-        {
-          *part_ptr = Qvslider_part;
-          *prefix_ptr = VSCROLL_SLIDER_PREFIX;
-          return s;
-        }
-      else if (s->display.x->v_thumbup == wdesc)
-        {
-          *part_ptr = Qvthumbup_part;
-          *prefix_ptr = VSCROLL_THUMBUP_PREFIX;
-          return s;
-        }
-      else if (s->display.x->v_thumbdown == wdesc)
-        {
-          *part_ptr = Qvthumbdown_part;
-          *prefix_ptr = VSCROLL_THUMBDOWN_PREFIX;
-          return s;
-        }
-      else if (s->display.x->h_scrollbar == wdesc)
-        {
-          *part_ptr = Qhscrollbar_part;
-          *prefix_ptr = HSCROLL_BAR_PREFIX;
-          return s;
-        }
-      else if (s->display.x->h_slider == wdesc)
-        {
-          *part_ptr = Qhslider_part;
-          *prefix_ptr = HSCROLL_SLIDER_PREFIX;
-          return s;
-        }
-      else if (s->display.x->h_thumbleft == wdesc)
-        {
-          *part_ptr = Qhthumbleft_part;
-          *prefix_ptr = HSCROLL_THUMBLEFT_PREFIX;
-          return s;
-        }
-      else if (s->display.x->h_thumbright == wdesc)
-        {
-          *part_ptr = Qhthumbright_part;
-          *prefix_ptr = HSCROLL_THUMBRIGHT_PREFIX;
-          return s;
-        }
-    }
-  return 0;
-}
 \f
-/* Connect the screen-parameter names for X screens
+/* Connect the frame-parameter names for X frames
    to the ways of passing the parameter values to the window system.
 
    The name of a parameter, as a Lisp symbol,
-   has an `x-screen-parameter' property which is an integer in Lisp
-   but can be interpreted as an `enum x_screen_parm' in C.  */
+   has an `x-frame-parameter' property which is an integer in Lisp
+   but can be interpreted as an `enum x_frame_parm' in C.  */
 
-enum x_screen_parm
+enum x_frame_parm
 {
   X_PARM_FOREGROUND_COLOR,
   X_PARM_BACKGROUND_COLOR,
@@ -312,15 +306,14 @@ enum x_screen_parm
   X_PARM_NAME,
   X_PARM_AUTORAISE,
   X_PARM_AUTOLOWER,
-  X_PARM_VERT_SCROLLBAR,
-  X_PARM_HORIZ_SCROLLBAR,
+  X_PARM_VERT_SCROLL_BAR,
 };
 
 
-struct x_screen_parm_table
+struct x_frame_parm_table
 {
   char *name;
-  void (*setter)( /* struct screen *screen, Lisp_Object val, oldval */ );
+  void (*setter)( /* struct frame *frame, Lisp_Object val, oldval */ );
 };
 
 void x_set_foreground_color ();
@@ -328,49 +321,116 @@ void x_set_background_color ();
 void x_set_mouse_color ();
 void x_set_cursor_color ();
 void x_set_border_color ();
+void x_set_cursor_type ();
 void x_set_icon_type ();
 void x_set_font ();
 void x_set_border_width ();
 void x_set_internal_border_width ();
-void x_set_name ();
+void x_explicitly_set_name ();
 void x_set_autoraise ();
 void x_set_autolower ();
-void x_set_vertical_scrollbar ();
-void x_set_horizontal_scrollbar ();
+void x_set_vertical_scroll_bars ();
 
-static struct x_screen_parm_table x_screen_parms[] =
+static struct x_frame_parm_table x_frame_parms[] =
 {
   "foreground-color", x_set_foreground_color,
   "background-color", x_set_background_color,
   "mouse-color", x_set_mouse_color,
   "cursor-color", x_set_cursor_color,
   "border-color", x_set_border_color,
+  "cursor-type", x_set_cursor_type,
   "icon-type", x_set_icon_type,
   "font", x_set_font,
   "border-width", x_set_border_width,
   "internal-border-width", x_set_internal_border_width,
-  "name", x_set_name,
-  "autoraise", x_set_autoraise,
-  "autolower", x_set_autolower,
-  "vertical-scrollbar", x_set_vertical_scrollbar,
-  "horizontal-scrollbar", x_set_horizontal_scrollbar,
+  "name", x_explicitly_set_name,
+  "auto-raise", x_set_autoraise,
+  "auto-lower", x_set_autolower,
+  "vertical-scroll-bars", x_set_vertical_scroll_bars,
 };
 
-/* Attach the `x-screen-parameter' properties to
+/* Attach the `x-frame-parameter' properties to
    the Lisp symbol names of parameters relevant to X.  */
 
 init_x_parm_symbols ()
 {
   int i;
 
-  Qx_screen_parameter = intern ("x-screen-parameter");
-
-  for (i = 0; i < sizeof (x_screen_parms)/sizeof (x_screen_parms[0]); i++)
-    Fput (intern (x_screen_parms[i].name), Qx_screen_parameter,
+  for (i = 0; i < sizeof (x_frame_parms)/sizeof (x_frame_parms[0]); i++)
+    Fput (intern (x_frame_parms[i].name), Qx_frame_parameter,
          make_number (i));
 }
 \f
-/* Report to X that a screen parameter of screen S is being set or changed.
+#if 1
+/* Change the parameters of FRAME as specified by ALIST.
+   If a parameter is not specially recognized, do nothing;
+   otherwise call the `x_set_...' function for that parameter.  */
+void
+x_set_frame_parameters (f, alist)
+     FRAME_PTR f;
+     Lisp_Object alist;
+{
+  Lisp_Object tail;
+
+  /* If both of these parameters are present, it's more efficient to
+     set them both at once.  So we wait until we've looked at the
+     entire list before we set them.  */
+  Lisp_Object width, height;
+
+  /* Same here.  */
+  Lisp_Object left, top;
+  
+  XSET (width,  Lisp_Int, FRAME_WIDTH  (f));
+  XSET (height, Lisp_Int, FRAME_HEIGHT (f));
+
+  XSET (top, Lisp_Int, f->display.x->top_pos);
+  XSET (left, Lisp_Int, f->display.x->left_pos);
+
+  for (tail = alist; CONSP (tail); tail = Fcdr (tail))
+    {
+      Lisp_Object elt, prop, val;
+
+      elt = Fcar (tail);
+      prop = Fcar (elt);
+      val = Fcdr (elt);
+
+      if (EQ (prop, Qwidth))
+       width = val;
+      else if (EQ (prop, Qheight))
+       height = val;
+      else if (EQ (prop, Qtop))
+       top = val;
+      else if (EQ (prop, Qleft))
+       left = val;
+      else
+       {
+         register Lisp_Object tem;
+         tem = Fget (prop, Qx_frame_parameter);
+         if (XTYPE (tem) == Lisp_Int
+             && XINT (tem) >= 0
+             && XINT (tem) < sizeof (x_frame_parms)/sizeof (x_frame_parms[0]))
+           (*x_frame_parms[XINT (tem)].setter)(f, val,
+                                               get_frame_param (f, prop));
+         store_frame_param (f, prop, val);
+       }
+    }
+
+  /* Don't call these unless they've changed; the window may not actually
+     exist yet.  */
+  {
+    Lisp_Object frame;
+
+    XSET (frame, Lisp_Frame, f);
+    if (XINT (width) != FRAME_WIDTH (f)
+       || XINT (height) != FRAME_HEIGHT (f))
+      Fset_frame_size (frame, width, height);
+    if (XINT (left) != f->display.x->left_pos
+       || XINT (top) != f->display.x->top_pos)
+      Fset_frame_position (frame, left, top);
+  }
+}
+#else
+/* Report to X that a frame parameter of frame F is being set or changed.
    PARAM is the symbol that says which parameter.
    VAL is the new value.
    OLDVAL is the old value.
@@ -378,45 +438,45 @@ init_x_parm_symbols ()
    otherwise the `x_set_...' function for this parameter.  */
 
 void
-x_set_screen_param (s, param, val, oldval)
-     register struct screen *s;
+x_set_frame_param (f, param, val, oldval)
+     register struct frame *f;
      Lisp_Object param;
      register Lisp_Object val;
      register Lisp_Object oldval;
 {
   register Lisp_Object tem;
-  tem = Fget (param, Qx_screen_parameter);
+  tem = Fget (param, Qx_frame_parameter);
   if (XTYPE (tem) == Lisp_Int
       && XINT (tem) >= 0
-      && XINT (tem) < sizeof (x_screen_parms)/sizeof (x_screen_parms[0]))
-    (*x_screen_parms[XINT (tem)].setter)(s, val, oldval);
+      && XINT (tem) < sizeof (x_frame_parms)/sizeof (x_frame_parms[0]))
+    (*x_frame_parms[XINT (tem)].setter)(f, val, oldval);
 }
-
-/* Insert a description of internally-recorded parameters of screen X
+#endif
+/* Insert a description of internally-recorded parameters of frame X
    into the parameter alist *ALISTPTR that is to be given to the user.
    Only parameters that are specific to the X window system
-   and whose values are not correctly recorded in the screen's
+   and whose values are not correctly recorded in the frame's
    param_alist need to be considered here.  */
 
-x_report_screen_params (s, alistptr)
-     struct screen *s;
+x_report_frame_params (f, alistptr)
+     struct frame *f;
      Lisp_Object *alistptr;
 {
   char buf[16];
 
-  store_in_alist (alistptr, "left", make_number (s->display.x->left_pos));
-  store_in_alist (alistptr, "top", make_number (s->display.x->top_pos));
-  store_in_alist (alistptr, "border-width",
-                  make_number (s->display.x->border_width));
-  store_in_alist (alistptr, "internal-border-width",
-                  make_number (s->display.x->internal_border_width));
-  sprintf (buf, "%d", s->display.x->window_desc);
-  store_in_alist (alistptr, "window-id",
+  store_in_alist (alistptr, Qleft, make_number (f->display.x->left_pos));
+  store_in_alist (alistptr, Qtop, make_number (f->display.x->top_pos));
+  store_in_alist (alistptr, Qborder_width,
+                  make_number (f->display.x->border_width));
+  store_in_alist (alistptr, Qinternal_border_width,
+                  make_number (f->display.x->internal_border_width));
+  sprintf (buf, "%d", FRAME_X_WINDOW (f));
+  store_in_alist (alistptr, Qwindow_id,
                   build_string (buf));
 }
 \f
 /* Decide if color named COLOR is valid for the display
-   associated with the selected screen. */
+   associated with the selected frame. */
 int
 defined_color (color, color_def)
      char *color;
@@ -445,8 +505,8 @@ defined_color (color, color_def)
 }
 
 /* Given a string ARG naming a color, compute a pixel value from it
-   suitable for screen S.
-   If S is not a color screen, return DEF (default) regardless of what
+   suitable for screen F.
+   If F is not a color screen, return DEF (default) regardless of what
    ARG says.  */
 
 int
@@ -464,7 +524,7 @@ x_decode_color (arg, def)
     return WHITE_PIX_DEFAULT;
 
 #ifdef HAVE_X11
-  if (XFASTINT (x_screen_planes) == 1)
+  if (x_screen_planes == 1)
     return def;
 #else
   if (DISPLAY_CELLS == 1)
@@ -477,266 +537,91 @@ x_decode_color (arg, def)
     Fsignal (Qundefined_color, Fcons (arg, Qnil));
 }
 \f
-/* Functions called only from `x_set_screen_param'
+/* Functions called only from `x_set_frame_param'
    to set individual parameters.
 
-   If s->display.x->window_desc is 0,
-   the screen is being created and its X-window does not exist yet.
+   If FRAME_X_WINDOW (f) is 0,
+   the frame is being created and its X-window does not exist yet.
    In that case, just record the parameter's new value
    in the standard place; do not attempt to change the window.  */
 
 void
-x_set_foreground_color (s, arg, oldval)
-     struct screen *s;
+x_set_foreground_color (f, arg, oldval)
+     struct frame *f;
      Lisp_Object arg, oldval;
 {
-  s->display.x->foreground_pixel = x_decode_color (arg, BLACK_PIX_DEFAULT);
-  if (s->display.x->window_desc != 0)
+  f->display.x->foreground_pixel = x_decode_color (arg, BLACK_PIX_DEFAULT);
+  if (FRAME_X_WINDOW (f) != 0)
     {
 #ifdef HAVE_X11
       BLOCK_INPUT;
-      XSetForeground (x_current_display, s->display.x->normal_gc,
-                     s->display.x->foreground_pixel);
-      XSetBackground (x_current_display, s->display.x->reverse_gc,
-                     s->display.x->foreground_pixel);
-      if (s->display.x->v_scrollbar)
-        {
-          Pixmap  up_arrow_pixmap, down_arrow_pixmap, slider_pixmap;
-
-          XSetWindowBorder (x_current_display, s->display.x->v_scrollbar,
-                           s->display.x->foreground_pixel);
-
-          slider_pixmap =
-            XCreatePixmapFromBitmapData (XDISPLAY s->display.x->window_desc,
-                                        gray_bits, 16, 16,
-                                        s->display.x->foreground_pixel,
-                                        s->display.x->background_pixel,
-                                        DefaultDepth (x_current_display,
-                                                      XDefaultScreen (x_current_display)));
-          up_arrow_pixmap =
-            XCreatePixmapFromBitmapData (XDISPLAY s->display.x->window_desc,
-                                        up_arrow_bits, 16, 16,
-                                        s->display.x->foreground_pixel,
-                                        s->display.x->background_pixel,
-                                        DefaultDepth (x_current_display,
-                                                      XDefaultScreen (x_current_display)));
-          down_arrow_pixmap =
-            XCreatePixmapFromBitmapData (XDISPLAY s->display.x->window_desc,
-                                        down_arrow_bits, 16, 16,
-                                        s->display.x->foreground_pixel,
-                                        s->display.x->background_pixel,
-                                        DefaultDepth (x_current_display,
-                                                      XDefaultScreen (x_current_display)));
-
-          XSetWindowBackgroundPixmap (XDISPLAY s->display.x->v_thumbup,
-                                     up_arrow_pixmap);
-          XSetWindowBackgroundPixmap (XDISPLAY s->display.x->v_thumbdown,
-                                     down_arrow_pixmap);
-          XSetWindowBackgroundPixmap (XDISPLAY s->display.x->v_slider,
-                                     slider_pixmap);
-
-          XClearWindow (XDISPLAY s->display.x->v_thumbup);
-          XClearWindow (XDISPLAY s->display.x->v_thumbdown);
-          XClearWindow (XDISPLAY s->display.x->v_slider);
-
-          XFreePixmap (x_current_display, down_arrow_pixmap);
-          XFreePixmap (x_current_display, up_arrow_pixmap);
-          XFreePixmap (x_current_display, slider_pixmap);
-        }
-      if (s->display.x->h_scrollbar)
-        {
-          Pixmap left_arrow_pixmap, right_arrow_pixmap, slider_pixmap;
-
-          XSetWindowBorder (x_current_display, s->display.x->h_scrollbar,
-                           s->display.x->foreground_pixel);
-
-          slider_pixmap =
-            XCreatePixmapFromBitmapData (XDISPLAY s->display.x->window_desc,
-                                        gray_bits, 16, 16,
-                                        s->display.x->foreground_pixel,
-                                        s->display.x->background_pixel,
-                                        DefaultDepth (x_current_display,
-                                                      XDefaultScreen (x_current_display)));
-
-          left_arrow_pixmap =
-            XCreatePixmapFromBitmapData (XDISPLAY s->display.x->window_desc,
-                                        up_arrow_bits, 16, 16,
-                                        s->display.x->foreground_pixel,
-                                        s->display.x->background_pixel,
-                                        DefaultDepth (x_current_display,
-                                                      XDefaultScreen (x_current_display)));
-          right_arrow_pixmap =
-            XCreatePixmapFromBitmapData (XDISPLAY s->display.x->window_desc,
-                                        down_arrow_bits, 16, 16,
-                                        s->display.x->foreground_pixel,
-                                        s->display.x->background_pixel,
-                                        DefaultDepth (x_current_display,
-                                                      XDefaultScreen (x_current_display)));
-
-          XSetWindowBackgroundPixmap (XDISPLAY s->display.x->h_slider,
-                                     slider_pixmap);
-          XSetWindowBackgroundPixmap (XDISPLAY s->display.x->h_thumbleft,
-                                     left_arrow_pixmap);
-          XSetWindowBackgroundPixmap (XDISPLAY s->display.x->h_thumbright,
-                                     right_arrow_pixmap);
-
-          XClearWindow (XDISPLAY s->display.x->h_thumbleft);
-          XClearWindow (XDISPLAY s->display.x->h_thumbright);
-          XClearWindow (XDISPLAY s->display.x->h_slider);
-
-          XFreePixmap (x_current_display, slider_pixmap);
-          XFreePixmap (x_current_display, left_arrow_pixmap);
-          XFreePixmap (x_current_display, right_arrow_pixmap);
-        }
+      XSetForeground (x_current_display, f->display.x->normal_gc,
+                     f->display.x->foreground_pixel);
+      XSetBackground (x_current_display, f->display.x->reverse_gc,
+                     f->display.x->foreground_pixel);
       UNBLOCK_INPUT;
 #endif                         /* HAVE_X11 */
-      if (s->visible)
-        redraw_screen (s);
+      if (FRAME_VISIBLE_P (f))
+        redraw_frame (f);
     }
 }
 
 void
-x_set_background_color (s, arg, oldval)
-     struct screen *s;
+x_set_background_color (f, arg, oldval)
+     struct frame *f;
      Lisp_Object arg, oldval;
 {
   Pixmap temp;
   int mask;
 
-  s->display.x->background_pixel = x_decode_color (arg, WHITE_PIX_DEFAULT);
+  f->display.x->background_pixel = x_decode_color (arg, WHITE_PIX_DEFAULT);
 
-  if (s->display.x->window_desc != 0)
+  if (FRAME_X_WINDOW (f) != 0)
     {
       BLOCK_INPUT;
 #ifdef HAVE_X11
-      /* The main screen. */
-      XSetBackground (x_current_display, s->display.x->normal_gc,
-                     s->display.x->background_pixel);
-      XSetForeground (x_current_display, s->display.x->reverse_gc,
-                     s->display.x->background_pixel);
-      XSetWindowBackground (x_current_display, s->display.x->window_desc,
-                           s->display.x->background_pixel);
-
-      /* Scroll bars. */
-      if (s->display.x->v_scrollbar)
-        {
-          Pixmap  up_arrow_pixmap, down_arrow_pixmap, slider_pixmap;
-
-          XSetWindowBackground (x_current_display, s->display.x->v_scrollbar,
-                               s->display.x->background_pixel);
-
-          slider_pixmap =
-            XCreatePixmapFromBitmapData (XDISPLAY s->display.x->window_desc,
-                                        gray_bits, 16, 16,
-                                        s->display.x->foreground_pixel,
-                                        s->display.x->background_pixel,
-                                        DefaultDepth (x_current_display,
-                                                      XDefaultScreen (x_current_display)));
-          up_arrow_pixmap =
-            XCreatePixmapFromBitmapData (XDISPLAY s->display.x->window_desc,
-                                        up_arrow_bits, 16, 16,
-                                        s->display.x->foreground_pixel,
-                                        s->display.x->background_pixel,
-                                        DefaultDepth (x_current_display,
-                                                      XDefaultScreen (x_current_display)));
-          down_arrow_pixmap =
-            XCreatePixmapFromBitmapData (XDISPLAY s->display.x->window_desc,
-                                        down_arrow_bits, 16, 16,
-                                        s->display.x->foreground_pixel,
-                                        s->display.x->background_pixel,
-                                        DefaultDepth (x_current_display,
-                                                      XDefaultScreen (x_current_display)));
-
-          XSetWindowBackgroundPixmap (XDISPLAY s->display.x->v_thumbup,
-                                     up_arrow_pixmap);
-          XSetWindowBackgroundPixmap (XDISPLAY s->display.x->v_thumbdown,
-                                     down_arrow_pixmap);
-          XSetWindowBackgroundPixmap (XDISPLAY s->display.x->v_slider,
-                                     slider_pixmap);
-
-          XClearWindow (XDISPLAY s->display.x->v_thumbup);
-          XClearWindow (XDISPLAY s->display.x->v_thumbdown);
-          XClearWindow (XDISPLAY s->display.x->v_slider);
-
-          XFreePixmap (x_current_display, down_arrow_pixmap);
-          XFreePixmap (x_current_display, up_arrow_pixmap);
-          XFreePixmap (x_current_display, slider_pixmap);
-        }
-      if (s->display.x->h_scrollbar)
-        {
-          Pixmap left_arrow_pixmap, right_arrow_pixmap, slider_pixmap;
-
-          XSetWindowBackground (x_current_display, s->display.x->h_scrollbar,
-                               s->display.x->background_pixel);
-
-          slider_pixmap =
-            XCreatePixmapFromBitmapData (XDISPLAY s->display.x->window_desc,
-                                        gray_bits, 16, 16,
-                                        s->display.x->foreground_pixel,
-                                        s->display.x->background_pixel,
-                                        DefaultDepth (x_current_display,
-                                                      XDefaultScreen (x_current_display)));
-
-          left_arrow_pixmap =
-            XCreatePixmapFromBitmapData (XDISPLAY s->display.x->window_desc,
-                                        up_arrow_bits, 16, 16,
-                                        s->display.x->foreground_pixel,
-                                        s->display.x->background_pixel,
-                                        DefaultDepth (x_current_display,
-                                                      XDefaultScreen (x_current_display)));
-          right_arrow_pixmap =
-            XCreatePixmapFromBitmapData (XDISPLAY s->display.x->window_desc,
-                                        down_arrow_bits, 16, 16,
-                                        s->display.x->foreground_pixel,
-                                        s->display.x->background_pixel,
-                                        DefaultDepth (x_current_display,
-                                                      XDefaultScreen (x_current_display)));
-
-          XSetWindowBackgroundPixmap (XDISPLAY s->display.x->h_slider,
-                                     slider_pixmap);
-          XSetWindowBackgroundPixmap (XDISPLAY s->display.x->h_thumbleft,
-                                     left_arrow_pixmap);
-          XSetWindowBackgroundPixmap (XDISPLAY s->display.x->h_thumbright,
-                                     right_arrow_pixmap);
-
-          XClearWindow (XDISPLAY s->display.x->h_thumbleft);
-          XClearWindow (XDISPLAY s->display.x->h_thumbright);
-          XClearWindow (XDISPLAY s->display.x->h_slider);
-
-          XFreePixmap (x_current_display, slider_pixmap);
-          XFreePixmap (x_current_display, left_arrow_pixmap);
-          XFreePixmap (x_current_display, right_arrow_pixmap);
-        }
+      /* The main frame area. */
+      XSetBackground (x_current_display, f->display.x->normal_gc,
+                     f->display.x->background_pixel);
+      XSetForeground (x_current_display, f->display.x->reverse_gc,
+                     f->display.x->background_pixel);
+      XSetWindowBackground (x_current_display, FRAME_X_WINDOW (f),
+                           f->display.x->background_pixel);
+
 #else
-      temp = XMakeTile (s->display.x->background_pixel);
-      XChangeBackground (s->display.x->window_desc, temp);
+      temp = XMakeTile (f->display.x->background_pixel);
+      XChangeBackground (FRAME_X_WINDOW (f), temp);
       XFreePixmap (temp);
 #endif                         /* not HAVE_X11 */
       UNBLOCK_INPUT;
 
-      if (s->visible)
-        redraw_screen (s);
+      if (FRAME_VISIBLE_P (f))
+        redraw_frame (f);
     }
 }
 
 void
-x_set_mouse_color (s, arg, oldval)
-     struct screen *s;
+x_set_mouse_color (f, arg, oldval)
+     struct frame *f;
      Lisp_Object arg, oldval;
 {
   Cursor cursor, nontext_cursor, mode_cursor;
   int mask_color;
 
   if (!EQ (Qnil, arg))
-    s->display.x->mouse_pixel = x_decode_color (arg, BLACK_PIX_DEFAULT);
-  mask_color = s->display.x->background_pixel;
+    f->display.x->mouse_pixel = x_decode_color (arg, BLACK_PIX_DEFAULT);
+  mask_color = f->display.x->background_pixel;
                                /* No invisible pointers. */
-  if (mask_color == s->display.x->mouse_pixel
-       && mask_color == s->display.x->background_pixel)
-    s->display.x->mouse_pixel = s->display.x->foreground_pixel;
+  if (mask_color == f->display.x->mouse_pixel
+       && mask_color == f->display.x->background_pixel)
+    f->display.x->mouse_pixel = f->display.x->foreground_pixel;
 
   BLOCK_INPUT;
 #ifdef HAVE_X11
+
+  /* It's not okay to crash if the user selects a screwey cursor.  */
+  x_catch_errors ();
+
   if (!EQ (Qnil, Vx_pointer_shape))
     {
       CHECK_NUMBER (Vx_pointer_shape, 0);
@@ -744,6 +629,7 @@ x_set_mouse_color (s, arg, oldval)
     }
   else
     cursor = XCreateFontCursor (x_current_display, XC_xterm);
+  x_check_errors ("bad text pointer cursor: %s");
 
   if (!EQ (Qnil, Vx_nontext_pointer_shape))
     {
@@ -753,6 +639,7 @@ x_set_mouse_color (s, arg, oldval)
     }
   else
     nontext_cursor = XCreateFontCursor (x_current_display, XC_left_ptr);
+  x_check_errors ("bad nontext pointer cursor: %s");
 
   if (!EQ (Qnil, Vx_mode_pointer_shape))
     {
@@ -763,10 +650,14 @@ x_set_mouse_color (s, arg, oldval)
   else
     mode_cursor = XCreateFontCursor (x_current_display, XC_xterm);
 
+  /* Check and report errors with the above calls.  */
+  x_check_errors ("can't set cursor shape: %s");
+  x_uncatch_errors ();
+
   {
     XColor fore_color, back_color;
 
-    fore_color.pixel = s->display.x->mouse_pixel;
+    fore_color.pixel = f->display.x->mouse_pixel;
     back_color.pixel = mask_color;
     XQueryColor (x_current_display,
                 DefaultColormap (x_current_display,
@@ -786,29 +677,29 @@ x_set_mouse_color (s, arg, oldval)
 #else /* X10 */
   cursor = XCreateCursor (16, 16, MouseCursor, MouseMask,
                          0, 0,
-                         s->display.x->mouse_pixel,
-                         s->display.x->background_pixel,
+                         f->display.x->mouse_pixel,
+                         f->display.x->background_pixel,
                          GXcopy);
 #endif /* X10 */
 
-  if (s->display.x->window_desc != 0)
+  if (FRAME_X_WINDOW (f) != 0)
     {
-      XDefineCursor (XDISPLAY s->display.x->window_desc, cursor);
+      XDefineCursor (XDISPLAY FRAME_X_WINDOW (f), cursor);
     }
 
-  if (cursor != s->display.x->text_cursor && s->display.x->text_cursor != 0)
-      XFreeCursor (XDISPLAY s->display.x->text_cursor);
-  s->display.x->text_cursor = cursor;
+  if (cursor != f->display.x->text_cursor && f->display.x->text_cursor != 0)
+      XFreeCursor (XDISPLAY f->display.x->text_cursor);
+  f->display.x->text_cursor = cursor;
 #ifdef HAVE_X11
-  if (nontext_cursor != s->display.x->nontext_cursor
-      && s->display.x->nontext_cursor != 0)
-      XFreeCursor (XDISPLAY s->display.x->nontext_cursor);
-  s->display.x->nontext_cursor = nontext_cursor;
-
-  if (mode_cursor != s->display.x->modeline_cursor
-      && s->display.x->modeline_cursor != 0)
-      XFreeCursor (XDISPLAY s->display.x->modeline_cursor);
-  s->display.x->modeline_cursor = mode_cursor;
+  if (nontext_cursor != f->display.x->nontext_cursor
+      && f->display.x->nontext_cursor != 0)
+      XFreeCursor (XDISPLAY f->display.x->nontext_cursor);
+  f->display.x->nontext_cursor = nontext_cursor;
+
+  if (mode_cursor != f->display.x->modeline_cursor
+      && f->display.x->modeline_cursor != 0)
+      XFreeCursor (XDISPLAY f->display.x->modeline_cursor);
+  f->display.x->modeline_cursor = mode_cursor;
 #endif /* HAVE_X11 */
 
   XFlushQueue ();
@@ -816,8 +707,8 @@ x_set_mouse_color (s, arg, oldval)
 }
 
 void
-x_set_cursor_color (s, arg, oldval)
-     struct screen *s;
+x_set_cursor_color (f, arg, oldval)
+     struct frame *f;
      Lisp_Object arg, oldval;
 {
   unsigned long fore_pixel;
@@ -825,40 +716,41 @@ x_set_cursor_color (s, arg, oldval)
   if (!EQ (Vx_cursor_fore_pixel, Qnil))
     fore_pixel = x_decode_color (Vx_cursor_fore_pixel, WHITE_PIX_DEFAULT);
   else
-    fore_pixel = s->display.x->background_pixel;
-  s->display.x->cursor_pixel = x_decode_color (arg, BLACK_PIX_DEFAULT);
-                               /* No invisible cursors */
-  if (s->display.x->cursor_pixel == s->display.x->background_pixel)
+    fore_pixel = f->display.x->background_pixel;
+  f->display.x->cursor_pixel = x_decode_color (arg, BLACK_PIX_DEFAULT);
+  
+  /* Make sure that the cursor color differs from the background color.  */
+  if (f->display.x->cursor_pixel == f->display.x->background_pixel)
     {
-      s->display.x->cursor_pixel == s->display.x->mouse_pixel;
-      if (s->display.x->cursor_pixel == fore_pixel)
-       fore_pixel = s->display.x->background_pixel;
+      f->display.x->cursor_pixel == f->display.x->mouse_pixel;
+      if (f->display.x->cursor_pixel == fore_pixel)
+       fore_pixel = f->display.x->background_pixel;
     }
 
-  if (s->display.x->window_desc != 0)
+  if (FRAME_X_WINDOW (f) != 0)
     {
 #ifdef HAVE_X11
       BLOCK_INPUT;
-      XSetBackground (x_current_display, s->display.x->cursor_gc,
-                     s->display.x->cursor_pixel);
-      XSetForeground (x_current_display, s->display.x->cursor_gc,
+      XSetBackground (x_current_display, f->display.x->cursor_gc,
+                     f->display.x->cursor_pixel);
+      XSetForeground (x_current_display, f->display.x->cursor_gc,
                      fore_pixel);
       UNBLOCK_INPUT;
 #endif /* HAVE_X11 */
 
-      if (s->visible)
+      if (FRAME_VISIBLE_P (f))
        {
-         x_display_cursor (s, 0);
-         x_display_cursor (s, 1);
+         x_display_cursor (f, 0);
+         x_display_cursor (f, 1);
        }
     }
 }
 
-/* Set the border-color of screen S to value described by ARG.
+/* Set the border-color of frame F to value described by ARG.
    ARG can be a string naming a color.
    The border-color is used for the border that is drawn by the X server.
    Note that this does not fully take effect if done before
-   S has an x-window; it must be redone when the window is created.
+   F has an x-window; it must be redone when the window is created.
 
    Note: this is done in two routines because of the way X10 works.
 
@@ -866,8 +758,8 @@ x_set_cursor_color (s, arg, oldval)
    and so emacs' border colors may be overridden. */
 
 void
-x_set_border_color (s, arg, oldval)
-     struct screen *s;
+x_set_border_color (f, arg, oldval)
+     struct frame *f;
      Lisp_Object arg, oldval;
 {
   unsigned char *str;
@@ -885,53 +777,66 @@ x_set_border_color (s, arg, oldval)
 
     pix = x_decode_color (arg, BLACK_PIX_DEFAULT);
 
-  x_set_border_pixel (s, pix);
+  x_set_border_pixel (f, pix);
 }
 
-/* Set the border-color of screen S to pixel value PIX.
+/* Set the border-color of frame F to pixel value PIX.
    Note that this does not fully take effect if done before
-   S has an x-window.  */
+   F has an x-window.  */
 
-x_set_border_pixel (s, pix)
-     struct screen *s;
+x_set_border_pixel (f, pix)
+     struct frame *f;
      int pix;
 {
-  s->display.x->border_pixel = pix;
+  f->display.x->border_pixel = pix;
 
-  if (s->display.x->window_desc != 0 && s->display.x->border_width > 0)
+  if (FRAME_X_WINDOW (f) != 0 && f->display.x->border_width > 0)
     {
       Pixmap temp;
       int mask;
 
       BLOCK_INPUT;
 #ifdef HAVE_X11
-      XSetWindowBorder (x_current_display, s->display.x->window_desc,
+      XSetWindowBorder (x_current_display, FRAME_X_WINDOW (f),
                         pix);
-      if (s->display.x->h_scrollbar)
-        XSetWindowBorder (x_current_display, s->display.x->h_slider,
-                          pix);
-      if (s->display.x->v_scrollbar)
-        XSetWindowBorder (x_current_display, s->display.x->v_slider,
-                          pix);
 #else
       if (pix < 0)
-        temp = XMakePixmap ((Bitmap) XStoreBitmap (16, 16, gray_bits),
+        temp = XMakePixmap ((Bitmap) XStoreBitmap (gray_width, gray_height,
+                                                  gray_bits),
                             BLACK_PIX_DEFAULT, WHITE_PIX_DEFAULT);
       else
         temp = XMakeTile (pix);
-      XChangeBorder (s->display.x->window_desc, temp);
+      XChangeBorder (FRAME_X_WINDOW (f), temp);
       XFreePixmap (XDISPLAY temp);
 #endif /* not HAVE_X11 */
       UNBLOCK_INPUT;
 
-      if (s->visible)
-        redraw_screen (s);
+      if (FRAME_VISIBLE_P (f))
+        redraw_frame (f);
     }
 }
 
 void
-x_set_icon_type (s, arg, oldval)
-     struct screen *s;
+x_set_cursor_type (f, arg, oldval)
+     FRAME_PTR f;
+     Lisp_Object arg, oldval;
+{
+  if (EQ (arg, Qbar))
+    FRAME_DESIRED_CURSOR (f) = bar_cursor;
+  else if (EQ (arg, Qbox))
+    FRAME_DESIRED_CURSOR (f) = filled_box_cursor;
+  else
+    error
+      ("the `cursor-type' frame parameter should be either `bar' or `box'");
+
+  /* Make sure the cursor gets redrawn.  This is overkill, but how
+     often do people change cursor types?  */
+  update_mode_lines++;
+}
+
+void
+x_set_icon_type (f, arg, oldval)
+     struct frame *f;
      Lisp_Object arg, oldval;
 {
   Lisp_Object tem;
@@ -942,28 +847,28 @@ x_set_icon_type (s, arg, oldval)
 
   BLOCK_INPUT;
   if (NILP (arg))
-    result = x_text_icon (s, 0);
+    result = x_text_icon (f, 0);
   else
-    result = x_bitmap_icon (s, 0);
+    result = x_bitmap_icon (f);
 
   if (result)
     {
-      error ("No icon window available.");
       UNBLOCK_INPUT;
+      error ("No icon window available.");
     }
 
   /* If the window was unmapped (and its icon was mapped),
      the new icon is not mapped, so map the window in its stead.  */
-  if (s->visible)
-    XMapWindow (XDISPLAY s->display.x->window_desc);
+  if (FRAME_VISIBLE_P (f))
+    XMapWindow (XDISPLAY FRAME_X_WINDOW (f));
 
   XFlushQueue ();
   UNBLOCK_INPUT;
 }
 
 void
-x_set_font (s, arg, oldval)
-     struct screen *s;
+x_set_font (f, arg, oldval)
+     struct frame *f;
      Lisp_Object arg, oldval;
 {
   unsigned char *name;
@@ -973,7 +878,7 @@ x_set_font (s, arg, oldval)
   name = XSTRING (arg)->data;
 
   BLOCK_INPUT;
-  result = x_new_font (s, name);
+  result = x_new_font (f, name);
   UNBLOCK_INPUT;
   
   if (result)
@@ -981,90 +886,182 @@ x_set_font (s, arg, oldval)
 }
 
 void
-x_set_border_width (s, arg, oldval)
-     struct screen *s;
+x_set_border_width (f, arg, oldval)
+     struct frame *f;
      Lisp_Object arg, oldval;
 {
   CHECK_NUMBER (arg, 0);
 
-  if (XINT (arg) == s->display.x->border_width)
+  if (XINT (arg) == f->display.x->border_width)
     return;
 
-  if (s->display.x->window_desc != 0)
+  if (FRAME_X_WINDOW (f) != 0)
     error ("Cannot change the border width of a window");
 
-  s->display.x->border_width = XINT (arg);
+  f->display.x->border_width = XINT (arg);
 }
 
 void
-x_set_internal_border_width (s, arg, oldval)
-     struct screen *s;
+x_set_internal_border_width (f, arg, oldval)
+     struct frame *f;
      Lisp_Object arg, oldval;
 {
   int mask;
-  int old = s->display.x->internal_border_width;
+  int old = f->display.x->internal_border_width;
 
   CHECK_NUMBER (arg, 0);
-  s->display.x->internal_border_width = XINT (arg);
-  if (s->display.x->internal_border_width < 0)
-    s->display.x->internal_border_width = 0;
+  f->display.x->internal_border_width = XINT (arg);
+  if (f->display.x->internal_border_width < 0)
+    f->display.x->internal_border_width = 0;
 
-  if (s->display.x->internal_border_width == old)
+  if (f->display.x->internal_border_width == old)
     return;
 
-  if (s->display.x->window_desc != 0)
+  if (FRAME_X_WINDOW (f) != 0)
     {
       BLOCK_INPUT;
-      x_set_window_size (s, s->width, s->height);
+      x_set_window_size (f, f->width, f->height);
 #if 0
-      x_set_resize_hint (s);
+      x_set_resize_hint (f);
 #endif
       XFlushQueue ();
       UNBLOCK_INPUT;
-      SET_SCREEN_GARBAGED (s);
+      SET_FRAME_GARBAGED (f);
     }
 }
 
+/* Change the name of frame F to ARG.  If ARG is nil, set F's name to
+       x_id_name.
+
+   If EXPLICIT is non-zero, that indicates that lisp code is setting the
+       name; if ARG is a string, set F's name to ARG and set
+       F->explicit_name; if ARG is Qnil, then clear F->explicit_name.
+
+   If EXPLICIT is zero, that indicates that Emacs redisplay code is
+       suggesting a new name, which lisp code should override; if
+       F->explicit_name is set, ignore the new name; otherwise, set it.  */
+
 void
-x_set_name (s, arg, oldval)
-     struct screen *s;
-     Lisp_Object arg, oldval;
+x_set_name (f, name, explicit)
+     struct frame *f;
+     Lisp_Object name;
+     int explicit;
 {
-  CHECK_STRING (arg, 0);
+  /* Make sure that requests from lisp code override requests from 
+     Emacs redisplay code.  */
+  if (explicit)
+    {
+      /* If we're switching from explicit to implicit, we had better
+        update the mode lines and thereby update the title.  */
+      if (f->explicit_name && NILP (name))
+       update_mode_lines = 1;
+
+      f->explicit_name = ! NILP (name);
+    }
+  else if (f->explicit_name)
+    return;
+
+  /* If NAME is nil, set the name to the x_id_name.  */
+  if (NILP (name))
+    name = build_string (x_id_name);
+  else
+    CHECK_STRING (name, 0);
 
-  if (s->display.x->window_desc)
+  /* Don't change the name if it's already NAME.  */
+  if (! NILP (Fstring_equal (name, f->name)))
+    return;
+
+  if (FRAME_X_WINDOW (f))
     {
-      s->name = arg;
       BLOCK_INPUT;
-      XStoreName (XDISPLAY s->display.x->window_desc,
-                 (char *) XSTRING (arg)->data);
-      XSetIconName (XDISPLAY s->display.x->window_desc,
-                   (char *) XSTRING (arg)->data);
+
+#ifdef HAVE_X11R4
+      {
+       XTextProperty text;
+       text.value = XSTRING (name)->data;
+       text.encoding = XA_STRING;
+       text.format = 8;
+       text.nitems = XSTRING (name)->size;
+       XSetWMName (x_current_display, FRAME_X_WINDOW (f), &text);
+       XSetWMIconName (x_current_display, FRAME_X_WINDOW (f), &text);
+      }
+#else
+      XSetIconName (XDISPLAY FRAME_X_WINDOW (f),
+                   XSTRING (name)->data);
+      XStoreName (XDISPLAY FRAME_X_WINDOW (f),
+                 XSTRING (name)->data);
+#endif
+
       UNBLOCK_INPUT;
     }
+
+  f->name = name;
 }
 
+/* This function should be called when the user's lisp code has
+   specified a name for the frame; the name will override any set by the
+   redisplay code.  */
 void
-x_set_autoraise (s, arg, oldval)
-     struct screen *s;
+x_explicitly_set_name (f, arg, oldval)
+     FRAME_PTR f;
      Lisp_Object arg, oldval;
 {
-  s->auto_raise = !EQ (Qnil, arg);
+  x_set_name (f, arg, 1);
 }
 
+/* This function should be called by Emacs redisplay code to set the
+   name; names set this way will never override names set by the user's
+   lisp code.  */
 void
-x_set_autolower (s, arg, oldval)
-     struct screen *s;
+x_implicitly_set_name (f, arg, oldval)
+     FRAME_PTR f;
      Lisp_Object arg, oldval;
 {
-  s->auto_lower = !EQ (Qnil, arg);
+  x_set_name (f, arg, 0);
+}
+
+void
+x_set_autoraise (f, arg, oldval)
+     struct frame *f;
+     Lisp_Object arg, oldval;
+{
+  f->auto_raise = !EQ (Qnil, arg);
+}
+
+void
+x_set_autolower (f, arg, oldval)
+     struct frame *f;
+     Lisp_Object arg, oldval;
+{
+  f->auto_lower = !EQ (Qnil, arg);
+}
+
+void
+x_set_vertical_scroll_bars (f, arg, oldval)
+     struct frame *f;
+     Lisp_Object arg, oldval;
+{
+  if (NILP (arg) != ! FRAME_HAS_VERTICAL_SCROLL_BARS (f))
+    {
+      FRAME_HAS_VERTICAL_SCROLL_BARS (f) = ! NILP (arg);
+
+      /* We set this parameter before creating the X window for the
+        frame, so we can get the geometry right from the start.
+        However, if the window hasn't been created yet, we shouldn't
+        call x_set_window_size.  */
+      if (FRAME_X_WINDOW (f))
+       x_set_window_size (f, FRAME_WIDTH (f), FRAME_HEIGHT (f));
+    }
 }
 \f
 #ifdef HAVE_X11
 int n_faces;
 
+#if 0
+/* I believe this function is obsolete with respect to the new face display
+   changes.  */
 x_set_face (scr, font, background, foreground, stipple)
-     struct screen *scr;
+     struct frame *scr;
      XFontStruct *font;
      unsigned long background, foreground;
      Pixmap stipple;
@@ -1093,7 +1090,7 @@ x_set_face (scr, font, background, foreground, stipple)
       gc_mask |= GCStipple;
     }
 
-  temp_gc = XCreateGC (x_current_display, scr->display.x->window_desc,
+  temp_gc = XCreateGC (x_current_display, FRAME_X_WINDOW (scr),
                       gc_mask, &gc_values);
   if (!temp_gc)
     return 1;
@@ -1114,6 +1111,7 @@ x_set_face (scr, font, background, foreground, stipple)
   x_face_table[++n_faces] = new_face;
   return 1;
 }
+#endif
 
 x_set_glyph (scr, glyph)
 {
@@ -1138,15 +1136,15 @@ DEFUN ("x-set-face-font", Fx_set_face_font, Sx_set_face_font, 4, 2, 0,
   XGCValues gc_values;
 
   /* Need to do something about this. */
-  Drawable drawable = selected_screen->display.x->window_desc;
+  Drawable drawable = FRAME_X_WINDOW (selected_frame);
 
   CHECK_NUMBER (face_code, 1);
   CHECK_STRING (font_name,  2);
 
   if (EQ (foreground, Qnil) || EQ (background, Qnil))
     {
-      fg = selected_screen->display.x->foreground_pixel;
-      bg = selected_screen->display.x->background_pixel;
+      fg = selected_frame->display.x->foreground_pixel;
+      bg = selected_frame->display.x->background_pixel;
     }
   else
     {
@@ -1290,61 +1288,76 @@ The value is a list (FONT FG-COLOR BG-COLOR).")
 }
 #endif /* 0 */
 \f
-/* Subroutines of creating an X screen.  */
+/* Subroutines of creating an X frame.  */
 
 #ifdef HAVE_X11
 extern char *x_get_string_resource ();
 extern XrmDatabase x_load_resources ();
 
-DEFUN ("x-get-resource", Fx_get_resource, Sx_get_resource, 1, 3, 0,
-  "Retrieve the value of ATTRIBUTE from the X defaults database.  This\n\
-searches using a key of the form \"INSTANCE.ATTRIBUTE\", with class\n\
-\"Emacs\", where INSTANCE is the name under which Emacs was invoked.\n\
+DEFUN ("x-get-resource", Fx_get_resource, Sx_get_resource, 2, 4, 0,
+  "Return the value of ATTRIBUTE, of class CLASS, from the X defaults database.\n\
+This uses `INSTANCE.ATTRIBUTE' as the key and `Emacs.CLASS' as the\n\
+class, where INSTANCE is the name under which Emacs was invoked.\n\
 \n\
-Optional arguments COMPONENT and CLASS specify the component for which\n\
-we should look up ATTRIBUTE.  When specified, Emacs searches using a\n\
-key of the form INSTANCE.COMPONENT.ATTRIBUTE, with class \"Emacs.CLASS\".")
-  (attribute, name, class)
-     Lisp_Object attribute, name, class;
+The optional arguments COMPONENT and SUBCLASS add to the key and the\n\
+class, respectively.  You must specify both of them or neither.\n\
+If you specify them, the key is `INSTANCE.COMPONENT.ATTRIBUTE'\n\
+and the class is `Emacs.CLASS.SUBCLASS'.")
+  (attribute, class, component, subclass)
+     Lisp_Object attribute, class, component, subclass;
 {
   register char *value;
   char *name_key;
   char *class_key;
 
   CHECK_STRING (attribute, 0);
-  if (!NILP (name))
-    CHECK_STRING (name, 1);
-  if (!NILP (class))
-    CHECK_STRING (class, 2);
-  if (NILP (name) != NILP (class))
-    error ("x-get-resource: must specify both NAME and CLASS or neither");
-
-  if (NILP (name))
-    {
-      name_key = (char *) alloca (XSTRING (invocation_name)->size + 1
-                                 + XSTRING (attribute)->size + 1);
+  CHECK_STRING (class, 0);
+
+  if (!NILP (component))
+    CHECK_STRING (component, 1);
+  if (!NILP (subclass))
+    CHECK_STRING (subclass, 2);
+  if (NILP (component) != NILP (subclass))
+    error ("x-get-resource: must specify both COMPONENT and SUBCLASS or neither");
+
+  if (NILP (component))
+    {
+      /* Allocate space for the components, the dots which separate them,
+        and the final '\0'.  */
+      name_key = (char *) alloca (XSTRING (invocation_name)->size
+                                 + XSTRING (attribute)->size
+                                 + 2);
+      class_key = (char *) alloca ((sizeof (EMACS_CLASS) - 1)
+                                  + XSTRING (class)->size
+                                  + 2);
 
       sprintf (name_key, "%s.%s",
               XSTRING (invocation_name)->data,
               XSTRING (attribute)->data);
-      class_key = EMACS_CLASS;
+      sprintf (class_key, "%s.%s",
+              EMACS_CLASS,
+              XSTRING (class)->data);
     }
   else
     {
-      name_key = (char *) alloca (XSTRING (invocation_name)->size + 1
-                                 + XSTRING (name)->size + 1
-                                 + XSTRING (attribute)->size + 1);
+      name_key = (char *) alloca (XSTRING (invocation_name)->size
+                                 + XSTRING (component)->size
+                                 + XSTRING (attribute)->size
+                                 + 3);
 
-      class_key = (char *) alloca (sizeof (EMACS_CLASS)
-                                  + XSTRING (class)->size + 1);
+      class_key = (char *) alloca ((sizeof (EMACS_CLASS) - 1)
+                                  + XSTRING (class)->size
+                                  + XSTRING (subclass)->size
+                                  + 3);
 
       sprintf (name_key, "%s.%s.%s",
               XSTRING (invocation_name)->data,
-              XSTRING (name)->data,
+              XSTRING (component)->data,
               XSTRING (attribute)->data);
       sprintf (class_key, "%s.%s",
-              XSTRING (invocation_name)->data,
-              XSTRING (class)->data);
+              EMACS_CLASS,
+              XSTRING (class)->data,
+              XSTRING (subclass)->data);
     }
 
   value = x_get_string_resource (xrdb, name_key, class_key);
@@ -1358,7 +1371,7 @@ key of the form INSTANCE.COMPONENT.ATTRIBUTE, with class \"Emacs.CLASS\".")
 #else  /* X10 */
 
 DEFUN ("x-get-default", Fx_get_default, Sx_get_default, 1, 1, 0,
-       "Get X default ATTRIBUTE from the system, or nil if no default.\n\
+  "Get X default ATTRIBUTE from the system, or nil if no default.\n\
 Value is a string (when not nil) and ATTRIBUTE is also a string.\n\
 The defaults are specified in the file `~/.Xdefaults'.")
   (arg)
@@ -1382,125 +1395,103 @@ The defaults are specified in the file `~/.Xdefaults'.")
     return (Qnil);
 }
 
-#define Fx_get_resource(attribute, name, class) Fx_get_default(attribute)
+#define Fx_get_resource(attribute, class, component, subclass) \
+  Fx_get_default(attribute)
 
 #endif /* X10 */
 
 /* Types we might convert a resource string into.  */
 enum resource_types
   {
-    number, boolean, string,
+    number, boolean, string, symbol,
   };
 
 /* Return the value of parameter PARAM.
 
-   First search ALIST, then Vdefault_screen_alist, then the X defaults
-   database, using SCREEN_NAME as the subcomponent of emacs and
-   ATTRIBUTE as the attribute name.
+   First search ALIST, then Vdefault_frame_alist, then the X defaults
+   database, using ATTRIBUTE as the attribute name and CLASS as its class.
 
    Convert the resource to the type specified by desired_type.
 
-   If no default is specified, return nil.  */
+   If no default is specified, return Qunbound.  If you call
+   x_get_arg, make sure you deal with Qunbound in a reasonable way,
+   and don't let it get stored in any lisp-visible variables!  */
 
 static Lisp_Object
-x_get_arg (alist, param, screen_name, attribute, type)
-     Lisp_Object alist, param, screen_name;
+x_get_arg (alist, param, attribute, class, type)
+     Lisp_Object alist, param;
      char *attribute;
+     char *class;
      enum resource_types type;
 {
   register Lisp_Object tem;
 
   tem = Fassq (param, alist);
   if (EQ (tem, Qnil))
-    tem = Fassq (param, Vdefault_screen_alist);
-  if (EQ (tem, Qnil) && attribute)
+    tem = Fassq (param, Vdefault_frame_alist);
+  if (EQ (tem, Qnil))
     {
-      Lisp_Object sterile_name;
 
-      /* Build a version of screen name that is safe to use as a
-        component name.  */
-      if (XTYPE (screen_name) == Lisp_String)
+      if (attribute)
        {
-         int i;
+         tem = Fx_get_resource (build_string (attribute),
+                                build_string (class),
+                                Qnil, Qnil);
 
-         sterile_name = make_uninit_string (XSTRING (screen_name)->size);
-         for (i = 0; i < XSTRING (screen_name)->size; i++)
+         if (NILP (tem))
+           return Qunbound;
+
+         switch (type)
            {
-             int c = XSTRING (screen_name)->data[i];
+           case number:
+             return make_number (atoi (XSTRING (tem)->data));
 
-             switch (c)
-               {
-               case ':':
-               case '.':
-               case '*':
-               case ' ':
-               case '\t':
-               case '\n':
-                 c = '_';
-                 break;
-               default:
-                 break;
-               }
+           case boolean:
+             tem = Fdowncase (tem);
+             if (!strcmp (XSTRING (tem)->data, "on")
+                 || !strcmp (XSTRING (tem)->data, "true"))
+               return Qt;
+             else 
+               return Qnil;
 
-             XSTRING (sterile_name)->data[i] = c;
-           }
-       }
-      else
-       sterile_name = Qnil;
+           case string:
+             return tem;
 
-      tem = Fx_get_resource (build_string (attribute),
-                            sterile_name,
-                            (NILP (sterile_name) ? Qnil : screen_class));
+           case symbol:
+             return intern (tem);
 
-      if (NILP (tem))
-       return Qnil;
-
-      switch (type)
-       {
-       case number:
-         return make_number (atoi (XSTRING (tem)->data));
-
-       case boolean:
-         tem = Fdowncase (tem);
-         if (!strcmp (XSTRING (tem)->data, "on")
-             || !strcmp (XSTRING (tem)->data, "true"))
-           return Qt;
-         else 
-           return Qnil;
-
-       case string:
-         return tem;
-
-       default:
-         abort ();
+           default:
+             abort ();
+           }
        }
+      else
+       return Qunbound;
     }
   return Fcdr (tem);
 }
 
-/* Record in screen S the specified or default value according to ALIST
+/* Record in frame F the specified or default value according to ALIST
    of the parameter named PARAM (a Lisp symbol).
    If no value is specified for PARAM, look for an X default for XPROP
-   on the screen named NAME.
+   on the frame named NAME.
    If that is not found either, use the value DEFLT.  */
 
 static Lisp_Object
-x_default_parameter (s, alist, propname, deflt, xprop, type)
-     struct screen *s;
+x_default_parameter (f, alist, prop, deflt, xprop, xclass, type)
+     struct frame *f;
      Lisp_Object alist;
-     char *propname;
+     Lisp_Object prop;
      Lisp_Object deflt;
      char *xprop;
+     char *xclass;
      enum resource_types type;
 {
-  Lisp_Object propsym = intern (propname);
   Lisp_Object tem;
 
-  tem = x_get_arg (alist, propsym, s->name, xprop, type);
-  if (EQ (tem, Qnil))
+  tem = x_get_arg (alist, prop, xprop, xclass, type);
+  if (EQ (tem, Qunbound))
     tem = deflt;
-  store_screen_param (s, propsym, tem);
-  x_set_screen_param (s, propsym, tem, Qnil);
+  x_set_frame_parameters (f, Fcons (Fcons (prop, tem), Qnil));
   return tem;
 }
 \f
@@ -1508,6 +1499,7 @@ DEFUN ("x-geometry", Fx_geometry, Sx_geometry, 1, 1, 0,
        "Parse an X-style geometry string STRING.\n\
 Returns an alist of the form ((top . TOP), (left . LEFT) ... ).")
      (string)
+     Lisp_Object string;
 {
   int geometry, x, y;
   unsigned int width, height;
@@ -1527,14 +1519,14 @@ Returns an alist of the form ((top . TOP), (left . LEFT) ... ).")
        x = -1;
       if (y == 0 && (geometry & YNegative))
        y = -1;
-      values[0] = Fcons (intern ("left"), make_number (x));
-      values[1] = Fcons (intern ("top"), make_number (y));
+      values[0] = Fcons (Qleft, make_number (x));
+      values[1] = Fcons (Qtop, make_number (y));
       return Flist (2, values);
       break;
 
     case (WidthValue | HeightValue):
-      values[0] = Fcons (intern ("width"), make_number (width));
-      values[1] = Fcons (intern ("height"), make_number (height));
+      values[0] = Fcons (Qwidth, make_number (width));
+      values[1] = Fcons (Qheight, make_number (height));
       return Flist (2, values);
       break;
 
@@ -1543,10 +1535,10 @@ Returns an alist of the form ((top . TOP), (left . LEFT) ... ).")
        x = -1;
       if (y == 0 && (geometry & YNegative))
        y = -1;
-      values[0] = Fcons (intern ("width"), make_number (width));
-      values[1] = Fcons (intern ("height"), make_number (height));
-      values[2] = Fcons (intern ("left"), make_number (x));
-      values[3] = Fcons (intern ("top"), make_number (y));
+      values[0] = Fcons (Qwidth, make_number (width));
+      values[1] = Fcons (Qheight, make_number (height));
+      values[2] = Fcons (Qleft, make_number (x));
+      values[3] = Fcons (Qtop, make_number (y));
       return Flist (4, values);
       break;
 
@@ -1565,9 +1557,9 @@ Returns an alist of the form ((top . TOP), (left . LEFT) ... ).")
 #define DEFAULT_ROWS 40
 #define DEFAULT_COLS 80
 
-static
-x_figure_window_size (s, parms)
-     struct screen *s;
+static int
+x_figure_window_size (f, parms)
+     struct frame *f;
      Lisp_Object parms;
 {
   register Lisp_Object tem0, tem1;
@@ -1578,41 +1570,43 @@ x_figure_window_size (s, parms)
   /* Default values if we fall through.
      Actually, if that happens we should get
      window manager prompting. */
-  s->width = DEFAULT_COLS;
-  s->height = DEFAULT_ROWS;
-  s->display.x->top_pos = 1;
-  s->display.x->left_pos = 1;
-
-  tem0 = x_get_arg (parms, intern ("height"), s->name, 0, 0);
-  tem1 = x_get_arg (parms, intern ("width"), s->name, 0, 0);
-  if (! EQ (tem0, Qnil) && ! EQ (tem1, Qnil))
+  f->width = DEFAULT_COLS;
+  f->height = DEFAULT_ROWS;
+  f->display.x->top_pos = 1;
+  f->display.x->left_pos = 1;
+
+  tem0 = x_get_arg (parms, Qheight, 0, 0, number);
+  tem1 = x_get_arg (parms, Qwidth, 0, 0, number);
+  if (! EQ (tem0, Qunbound) && ! EQ (tem1, Qunbound))
     {
       CHECK_NUMBER (tem0, 0);
       CHECK_NUMBER (tem1, 0);
-      s->height = XINT (tem0);
-      s->width = XINT (tem1);
+      f->height = XINT (tem0);
+      f->width = XINT (tem1);
       window_prompting |= USSize;
     }
-  else if (! EQ (tem0, Qnil) || ! EQ (tem1, Qnil))
+  else if (! EQ (tem0, Qunbound) || ! EQ (tem1, Qunbound))
     error ("Must specify *both* height and width");
 
-  s->display.x->pixel_width = (FONT_WIDTH (s->display.x->font) * s->width
-                              + 2 * s->display.x->internal_border_width);
-  s->display.x->pixel_height = (FONT_HEIGHT (s->display.x->font) * s->height
-                               + 2 * s->display.x->internal_border_width);
+  f->display.x->vertical_scroll_bar_extra =
+    (FRAME_HAS_VERTICAL_SCROLL_BARS (f)
+     ? VERTICAL_SCROLL_BAR_PIXEL_WIDTH (f)
+     : 0);
+  f->display.x->pixel_width = CHAR_TO_PIXEL_WIDTH (f, f->width);
+  f->display.x->pixel_height = CHAR_TO_PIXEL_HEIGHT (f, f->height);
 
-  tem0 = x_get_arg (parms, intern ("top"), s->name, 0, 0);
-  tem1 = x_get_arg (parms, intern ("left"), s->name, 0, 0);
-  if (! EQ (tem0, Qnil) && ! EQ (tem1, Qnil))
+  tem0 = x_get_arg (parms, Qtop, 0, 0, number);
+  tem1 = x_get_arg (parms, Qleft, 0, 0, number);
+  if (! EQ (tem0, Qunbound) && ! EQ (tem1, Qunbound))
     {
       CHECK_NUMBER (tem0, 0);
       CHECK_NUMBER (tem1, 0);
-      s->display.x->top_pos = XINT (tem0);
-      s->display.x->left_pos = XINT (tem1);
-      x_calc_absolute_position (s);
+      f->display.x->top_pos = XINT (tem0);
+      f->display.x->left_pos = XINT (tem1);
+      x_calc_absolute_position (f);
       window_prompting |= USPosition;
     }
-  else if (! EQ (tem0, Qnil) || ! EQ (tem1, Qnil))
+  else if (! EQ (tem0, Qunbound) || ! EQ (tem1, Qunbound))
     error ("Must specify *both* top and left corners");
 
   switch (window_prompting)
@@ -1644,15 +1638,15 @@ x_figure_window_size (s, parms)
 }
 
 static void
-x_window (s)
-     struct screen *s;
+x_window (f)
+     struct frame *f;
 {
   XSetWindowAttributes attributes;
   unsigned long attribute_mask;
   XClassHint class_hints;
 
-  attributes.background_pixel = s->display.x->background_pixel;
-  attributes.border_pixel = s->display.x->border_pixel;
+  attributes.background_pixel = f->display.x->background_pixel;
+  attributes.border_pixel = f->display.x->border_pixel;
   attributes.bit_gravity = StaticGravity;
   attributes.backing_store = NotUseful;
   attributes.save_under = True;
@@ -1664,26 +1658,48 @@ x_window (s)
                    | CWEventMask);
 
   BLOCK_INPUT;
-  s->display.x->window_desc
+  FRAME_X_WINDOW (f)
     = XCreateWindow (x_current_display, ROOT_WINDOW,
-                    s->display.x->left_pos,
-                    s->display.x->top_pos,
-                    PIXEL_WIDTH (s), PIXEL_HEIGHT (s),
-                    s->display.x->border_width,
+                    f->display.x->left_pos,
+                    f->display.x->top_pos,
+                    PIXEL_WIDTH (f), PIXEL_HEIGHT (f),
+                    f->display.x->border_width,
                     CopyFromParent, /* depth */
                     InputOutput, /* class */
                     screen_visual, /* set in Fx_open_connection */
                     attribute_mask, &attributes);
 
-  class_hints.res_name = (char *) XSTRING (s->name)->data;
+  class_hints.res_name = (char *) XSTRING (f->name)->data;
   class_hints.res_class = EMACS_CLASS;
-  XSetClassHint (x_current_display, s->display.x->window_desc, &class_hints);
+  XSetClassHint (x_current_display, FRAME_X_WINDOW (f), &class_hints);
+
+  /* This indicates that we use the "Passive Input" input model.
+     Unless we do this, we don't get the Focus{In,Out} events that we
+     need to draw the cursor correctly.  Accursed bureaucrats.
+   XWhipsAndChains (x_current_display, IronMaiden, &TheRack);  */
+
+  f->display.x->wm_hints.input = True;
+  f->display.x->wm_hints.flags |= InputHint;
+  XSetWMHints (x_current_display, FRAME_X_WINDOW (f), &f->display.x->wm_hints);
 
-  XDefineCursor (XDISPLAY s->display.x->window_desc,
-                s->display.x->text_cursor);
+  /* x_set_name normally ignores requests to set the name if the
+     requested name is the same as the current name.  This is the one
+     place where that assumption isn't correct; f->name is set, but
+     the X server hasn't been told.  */
+  {
+    Lisp_Object name = f->name;
+    int explicit = f->explicit_name;
+
+    f->name = Qnil;
+    f->explicit_name = 0;
+    x_set_name (f, name, explicit);
+  }
+
+  XDefineCursor (XDISPLAY FRAME_X_WINDOW (f),
+                f->display.x->text_cursor);
   UNBLOCK_INPUT;
 
-  if (s->display.x->window_desc == 0)
+  if (FRAME_X_WINDOW (f) == 0)
     error ("Unable to create window.");
 }
 
@@ -1692,43 +1708,37 @@ x_window (s)
    well. */
 
 static void
-x_icon (s, parms)
-     struct screen *s;
+x_icon (f, parms)
+     struct frame *f;
      Lisp_Object parms;
 {
-  register Lisp_Object tem0,tem1;
-  XWMHints hints;
+  Lisp_Object icon_x, icon_y;
 
   /* Set the position of the icon.  Note that twm groups all
      icons in an icon window. */
-  tem0 = x_get_arg (parms, intern ("icon-left"), s->name, 0, 0);
-  tem1 = x_get_arg (parms, intern ("icon-top"), s->name, 0, 0);
-  if (!EQ (tem0, Qnil) && !EQ (tem1, Qnil))
+  icon_x = x_get_arg (parms, Qicon_left, 0, 0, number);
+  icon_y = x_get_arg (parms, Qicon_top, 0, 0, number);
+  if (!EQ (icon_x, Qunbound) && !EQ (icon_y, Qunbound))
     {
-      CHECK_NUMBER (tem0, 0);
-      CHECK_NUMBER (tem1, 0);
-      hints.icon_x = XINT (tem0);
-      hints.icon_x = XINT (tem0);
+      CHECK_NUMBER (icon_x, 0);
+      CHECK_NUMBER (icon_y, 0);
     }
-  else if (!EQ (tem0, Qnil) || !EQ (tem1, Qnil))
+  else if (!EQ (icon_x, Qunbound) || !EQ (icon_y, Qunbound))
     error ("Both left and top icon corners of icon must be specified");
-  else
-    {
-      hints.icon_x = s->display.x->left_pos;
-      hints.icon_y = s->display.x->top_pos;
-    }
+
+  BLOCK_INPUT;
+
+  if (! EQ (icon_x, Qunbound))
+    x_wm_set_icon_position (f, XINT (icon_x), XINT (icon_y));
 
   /* Start up iconic or window? */
-  tem0 = x_get_arg (parms, intern ("iconic-startup"), s->name, 0, 0);
-  if (!EQ (tem0, Qnil))
-    hints.initial_state = IconicState;
-  else
-    hints.initial_state = NormalState; /* the default, actually. */
-  hints.input = False;
+  x_wm_set_window_state (f,
+                        (EQ (x_get_arg (parms, Qiconic_startup,
+                                        0, 0, boolean),
+                             Qt)
+                         ? IconicState
+                         : NormalState));
 
-  BLOCK_INPUT;
-  hints.flags = StateHint | IconPositionHint | InputHint;
-  XSetWMHints (x_current_display, s->display.x->window_desc, &hints);
   UNBLOCK_INPUT;
 }
 
@@ -1736,105 +1746,86 @@ x_icon (s, parms)
    background, border and mouse colors; also create the
    mouse cursor and the gray border tile.  */
 
+static char cursor_bits[] =
+  {
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+  };
+
 static void
-x_make_gc (s)
-     struct screen *s;
+x_make_gc (f)
+     struct frame *f;
 {
   XGCValues gc_values;
   GC temp_gc;
   XImage tileimage;
-  static char cursor_bits[] =
-    {
-      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
-    };
 
-  /* Create the GC's of this screen.
+  /* Create the GC's of this frame.
      Note that many default values are used. */
 
   /* Normal video */
-  gc_values.font = s->display.x->font->fid;
-  gc_values.foreground = s->display.x->foreground_pixel;
-  gc_values.background = s->display.x->background_pixel;
+  gc_values.font = f->display.x->font->fid;
+  gc_values.foreground = f->display.x->foreground_pixel;
+  gc_values.background = f->display.x->background_pixel;
   gc_values.line_width = 0;    /* Means 1 using fast algorithm. */
-  s->display.x->normal_gc = XCreateGC (x_current_display,
-                                      s->display.x->window_desc,
+  f->display.x->normal_gc = XCreateGC (x_current_display,
+                                      FRAME_X_WINDOW (f),
                                       GCLineWidth | GCFont
                                       | GCForeground | GCBackground,
                                       &gc_values);
 
   /* Reverse video style. */
-  gc_values.foreground = s->display.x->background_pixel;
-  gc_values.background = s->display.x->foreground_pixel;
-  s->display.x->reverse_gc = XCreateGC (x_current_display,
-                                       s->display.x->window_desc,
+  gc_values.foreground = f->display.x->background_pixel;
+  gc_values.background = f->display.x->foreground_pixel;
+  f->display.x->reverse_gc = XCreateGC (x_current_display,
+                                       FRAME_X_WINDOW (f),
                                        GCFont | GCForeground | GCBackground
                                        | GCLineWidth,
                                        &gc_values);
 
   /* Cursor has cursor-color background, background-color foreground. */
-  gc_values.foreground = s->display.x->background_pixel;
-  gc_values.background = s->display.x->cursor_pixel;
+  gc_values.foreground = f->display.x->background_pixel;
+  gc_values.background = f->display.x->cursor_pixel;
   gc_values.fill_style = FillOpaqueStippled;
   gc_values.stipple
     = XCreateBitmapFromData (x_current_display, ROOT_WINDOW,
                             cursor_bits, 16, 16);
-  s->display.x->cursor_gc
-    = XCreateGC (x_current_display, s->display.x->window_desc,
+  f->display.x->cursor_gc
+    = XCreateGC (x_current_display, FRAME_X_WINDOW (f),
                 (GCFont | GCForeground | GCBackground
                  | GCFillStyle | GCStipple | GCLineWidth),
                 &gc_values);
 
   /* Create the gray border tile used when the pointer is not in
-     the screen.  Since this depends on the screen's pixel values,
-     this must be done on a per-screen basis. */
-  s->display.x->border_tile =
-    XCreatePixmap (x_current_display, ROOT_WINDOW, 16, 16,
-                  DefaultDepth (x_current_display,
-                                XDefaultScreen (x_current_display)));
-  gc_values.foreground = s->display.x->foreground_pixel;
-  gc_values.background = s->display.x->background_pixel;
-  temp_gc = XCreateGC (x_current_display,
-                      (Drawable) s->display.x->border_tile,
-                      GCForeground | GCBackground, &gc_values);
-
-  /* These are things that should be determined by the server, in
-     Fx_open_connection */
-  tileimage.height = 16;
-  tileimage.width = 16;
-  tileimage.xoffset = 0;
-  tileimage.format = XYBitmap;
-  tileimage.data = gray_bits;
-  tileimage.byte_order = LSBFirst;
-  tileimage.bitmap_unit = 8;
-  tileimage.bitmap_bit_order = LSBFirst;
-  tileimage.bitmap_pad = 8;
-  tileimage.bytes_per_line = (16 + 7) >> 3;
-  tileimage.depth = 1;
-  XPutImage (x_current_display, s->display.x->border_tile, temp_gc,
-            &tileimage, 0, 0, 0, 0, 16, 16);
-  XFreeGC (x_current_display, temp_gc);
+     the frame.  Since this depends on the frame's pixel values,
+     this must be done on a per-frame basis. */
+  f->display.x->border_tile =
+    XCreatePixmapFromBitmapData
+      (x_current_display, ROOT_WINDOW, 
+       gray_bits, gray_width, gray_height,
+       f->display.x->foreground_pixel,
+       f->display.x->background_pixel,
+       DefaultDepth (x_current_display, XDefaultScreen (x_current_display)));
 }
 #endif /* HAVE_X11 */
 
-DEFUN ("x-create-screen", Fx_create_screen, Sx_create_screen,
+DEFUN ("x-create-frame", Fx_create_frame, Sx_create_frame,
        1, 1, 0,
-  "Make a new X window, which is called a \"screen\" in Emacs terms.\n\
-Return an Emacs screen object representing the X window.\n\
-ALIST is an alist of screen parameters.\n\
-The value of ``x-screen-defaults'' is an additional alist\n\
-of default parameters which apply when not overridden by ALIST.\n\
-If the parameters specify that the screen should not have a minibuffer,\n\
-then ``default-minibuffer-screen'' must be a screen whose minibuffer can\n\
-be shared by the new screen.")
+  "Make a new X window, which is called a \"frame\" in Emacs terms.\n\
+Return an Emacs frame object representing the X window.\n\
+ALIST is an alist of frame parameters.\n\
+If the parameters specify that the frame should not have a minibuffer,\n\
+and do not specify a specific minibuffer window to use,\n\
+then `default-minibuffer-frame' must be a frame whose minibuffer can\n\
+be shared by the new frame.")
   (parms)
      Lisp_Object parms;
 {
 #ifdef HAVE_X11
-  struct screen *s;
-  Lisp_Object screen, tem;
+  struct frame *f;
+  Lisp_Object frame, tem;
   Lisp_Object name;
   int minibuffer_only = 0;
   long window_prompting = 0;
@@ -1843,95 +1834,114 @@ be shared by the new screen.")
   if (x_current_display == 0)
     error ("X windows are not in use or not initialized");
 
-  name = x_get_arg (parms, intern ("name"), Qnil, "Title", string);
-  if (NILP (name))
-    name = build_string (x_id_name);
-  if (XTYPE (name) != Lisp_String)
-    error ("x-create-screen: name parameter must be a string");
+  name = x_get_arg (parms, Qname, "title", "Title", string);
+  if (XTYPE (name) != Lisp_String
+      && ! EQ (name, Qunbound)
+      && ! NILP (name))
+    error ("x-create-frame: name parameter must be a string");
 
-  tem = x_get_arg (parms, intern ("minibuffer"), name, 0, 0);
-  if (EQ (tem, intern ("none")))
-    s = make_screen_without_minibuffer (Qnil);
-  else if (EQ (tem, intern ("only")))
+  tem = x_get_arg (parms, Qminibuffer, 0, 0, symbol);
+  if (EQ (tem, Qnone) || NILP (tem))
+    f = make_frame_without_minibuffer (Qnil);
+  else if (EQ (tem, Qonly))
     {
-      s = make_minibuffer_screen ();
+      f = make_minibuffer_frame ();
       minibuffer_only = 1;
     }
-  else if (EQ (tem, Qnil) || EQ (tem, Qt))
-    s = make_screen (1);
+  else if (XTYPE (tem) == Lisp_Window)
+    f = make_frame_without_minibuffer (tem);
   else
-    s = make_screen_without_minibuffer (tem);
+    f = make_frame (1);
 
-  /* Set the name; the functions to which we pass s expect the
-     name to be set.  */
-  XSET (s->name, Lisp_String, name);
+  /* Note that X Windows does support scroll bars.  */
+  FRAME_CAN_HAVE_SCROLL_BARS (f) = 1;
 
-  XSET (screen, Lisp_Screen, s);
-  s->output_method = output_x_window;
-  s->display.x = (struct x_display *) xmalloc (sizeof (struct x_display));
-  bzero (s->display.x, sizeof (struct x_display));
+  /* Set the name; the functions to which we pass f expect the name to
+     be set.  */
+  if (EQ (name, Qunbound) || NILP (name))
+    {
+      f->name = build_string (x_id_name);
+      f->explicit_name = 0;
+    }
+  else
+    {
+      f->name = name;
+      f->explicit_name = 1;
+    }
+
+  XSET (frame, Lisp_Frame, f);
+  f->output_method = output_x_window;
+  f->display.x = (struct x_display *) xmalloc (sizeof (struct x_display));
+  bzero (f->display.x, sizeof (struct x_display));
 
-  /* Note that the screen has no physical cursor right now.  */
-  s->phys_cursor_x = -1;
+  /* Note that the frame has no physical cursor right now.  */
+  f->phys_cursor_x = -1;
 
   /* Extract the window parameters from the supplied values
      that are needed to determine window geometry.  */
-  x_default_parameter (s, parms, "font",
-                      build_string ("9x15"), "font", string);
-  x_default_parameter (s, parms, "background-color",
-                     build_string ("white"), "background", string);
-  x_default_parameter (s, parms, "border-width",
-                     make_number (2), "BorderWidth", number);
-  x_default_parameter (s, parms, "internal-border-width",
-                     make_number (1), "InternalBorderWidth", number);
+  x_default_parameter (f, parms, Qfont, build_string ("9x15"),
+                      "font", "Font", string);
+  x_default_parameter (f, parms, Qborder_width, make_number (2),
+                      "borderwidth", "BorderWidth", number);
+  /* This defaults to 2 in order to match xterm.  */
+  x_default_parameter (f, parms, Qinternal_border_width, make_number (2),
+                      "internalBorderWidth", "BorderWidth", number);
+  x_default_parameter (f, parms, Qvertical_scroll_bars, Qt,
+                      "verticalScrollBars", "ScrollBars", boolean);
 
   /* Also do the stuff which must be set before the window exists. */
-  x_default_parameter (s, parms, "foreground-color",
-                      build_string ("black"), "foreground", string);
-  x_default_parameter (s, parms, "mouse-color",
-                     build_string ("black"), "mouse", string);
-  x_default_parameter (s, parms, "cursor-color",
-                     build_string ("black"), "cursor", string);
-  x_default_parameter (s, parms, "border-color",
-                     build_string ("black"), "border", string);
-
-  /* Need to do icon type, auto-raise, auto-lower. */
-
-  s->display.x->parent_desc = ROOT_WINDOW;
-  window_prompting = x_figure_window_size (s, parms);
-
-  x_window (s);
-  x_icon (s, parms);
-  x_make_gc (s);
-
-  /* Dimensions, especially s->height, must be done via change_screen_size.
+  x_default_parameter (f, parms, Qforeground_color, build_string ("black"),
+                      "foreground", "Foreground", string);
+  x_default_parameter (f, parms, Qbackground_color, build_string ("white"),
+                      "background", "Background", string);
+  x_default_parameter (f, parms, Qmouse_color, build_string ("black"),
+                      "pointerColor", "Foreground", string);
+  x_default_parameter (f, parms, Qcursor_color, build_string ("black"),
+                      "cursorColor", "Foreground", string);
+  x_default_parameter (f, parms, Qborder_color, build_string ("black"),
+                      "borderColor", "BorderColor", string);
+
+  f->display.x->parent_desc = ROOT_WINDOW;
+  window_prompting = x_figure_window_size (f, parms);
+
+  x_window (f);
+  x_icon (f, parms);
+  x_make_gc (f);
+
+  /* We need to do this after creating the X window, so that the
+     icon-creation functions can say whose icon they're describing.  */
+  x_default_parameter (f, parms, Qicon_type, Qnil,
+                      "iconType", "IconType", symbol);
+
+  x_default_parameter (f, parms, Qauto_raise, Qnil,
+                      "autoRaise", "AutoRaiseLower", boolean);
+  x_default_parameter (f, parms, Qauto_lower, Qnil,
+                      "autoLower", "AutoRaiseLower", boolean);
+  x_default_parameter (f, parms, Qcursor_type, Qbox,
+                      "cursorType", "CursorType", symbol);
+
+  /* Dimensions, especially f->height, must be done via change_frame_size.
      Change will not be effected unless different from the current
-     s->height. */
-  width = s->width;
-  height = s->height;
-  s->height = s->width = 0;
-  change_screen_size (s, height, width, 1);
+     f->height. */
+  width = f->width;
+  height = f->height;
+  f->height = f->width = 0;
+  change_frame_size (f, height, width, 1, 0);
   BLOCK_INPUT;
-  x_wm_set_size_hint (s, window_prompting);
+  x_wm_set_size_hint (f, window_prompting);
   UNBLOCK_INPUT;
 
-  tem = x_get_arg (parms, intern ("unsplittable"), name, 0, 0);
-  s->no_split = minibuffer_only || EQ (tem, Qt);
-
-  /* Now handle the rest of the parameters. */
-  x_default_parameter (s, parms, "horizontal-scroll-bar",
-                      Qnil, "?HScrollBar", string);
-  x_default_parameter (s, parms, "vertical-scroll-bar",
-                      Qnil, "?VScrollBar", string);
+  tem = x_get_arg (parms, Qunsplittable, 0, 0, boolean);
+  f->no_split = minibuffer_only || EQ (tem, Qt);
 
-  /* Make the window appear on the screen and enable display.  */
-  if (!EQ (x_get_arg (parms, intern ("suppress-initial-map"), name, 0, 0), Qt))
-    x_make_screen_visible (s);
+  /* Make the window appear on the frame and enable display.  */
+  if (!EQ (x_get_arg (parms, Qsuppress_initial_map, 0, 0, boolean), Qt))
+    x_make_frame_visible (f);
 
-  return screen;
+  return frame;
 #else /* X10 */
-  struct screen *s;
-  Lisp_Object screen, tem;
+  struct frame *f;
+  Lisp_Object frame, tem;
   Lisp_Object name;
   int pixelwidth, pixelheight;
   Cursor cursor;
@@ -1944,262 +1954,250 @@ be shared by the new screen.")
   if (x_current_display == 0)
     error ("X windows are not in use or not initialized");
 
-  name = Fassq (intern ("name"), parms);
+  name = Fassq (Qname, parms);
 
-  tem = x_get_arg (parms, intern ("minibuffer"), name, 0, 0);
-  if (EQ (tem, intern ("none")))
-    s = make_screen_without_minibuffer (Qnil);
-  else if (EQ (tem, intern ("only")))
+  tem = x_get_arg (parms, Qminibuffer, 0, 0, symbol);
+  if (EQ (tem, Qnone))
+    f = make_frame_without_minibuffer (Qnil);
+  else if (EQ (tem, Qonly))
     {
-      s = make_minibuffer_screen ();
+      f = make_minibuffer_frame ();
       minibuffer_only = 1;
     }
-  else if (! EQ (tem, Qnil))
-    s = make_screen_without_minibuffer (tem);
+  else if (EQ (tem, Qnil) || EQ (tem, Qunbound))
+    f = make_frame (1);
   else
-    s = make_screen (1);
+    f = make_frame_without_minibuffer (tem);
 
   parent = ROOT_WINDOW;
 
-  XSET (screen, Lisp_Screen, s);
-  s->output_method = output_x_window;
-  s->display.x = (struct x_display *) xmalloc (sizeof (struct x_display));
-  bzero (s->display.x, sizeof (struct x_display));
+  XSET (frame, Lisp_Frame, f);
+  f->output_method = output_x_window;
+  f->display.x = (struct x_display *) xmalloc (sizeof (struct x_display));
+  bzero (f->display.x, sizeof (struct x_display));
 
   /* Some temprorary default values for height and width. */
   width = 80;
   height = 40;
-  s->display.x->left_pos = -1;
-  s->display.x->top_pos = -1;
+  f->display.x->left_pos = -1;
+  f->display.x->top_pos = -1;
 
-  /* Give the screen a default name (which may be overridden with PARMS).  */
+  /* Give the frame a default name (which may be overridden with PARMS).  */
 
   strncpy (iconidentity, ICONTAG, MAXICID);
   if (gethostname (&iconidentity[sizeof (ICONTAG) - 1],
                   (MAXICID - 1) - sizeof (ICONTAG)))
     iconidentity[sizeof (ICONTAG) - 2] = '\0';
-  s->name = build_string (iconidentity);
+  f->name = build_string (iconidentity);
 
   /* Extract some window parameters from the supplied values.
      These are the parameters that affect window geometry.  */
 
-  tem = x_get_arg (parms, intern ("font"), name, "BodyFont", string);
-  if (EQ (tem, Qnil))
+  tem = x_get_arg (parms, Qfont, "BodyFont", 0, string);
+  if (EQ (tem, Qunbound))
     tem = build_string ("9x15");
-  x_set_font (s, tem);
-  x_default_parameter (s, parms, "border-color",
-                     build_string ("black"), "Border", string);
-  x_default_parameter (s, parms, "background-color",
-                     build_string ("white"), "Background", string);
-  x_default_parameter (s, parms, "foreground-color",
-                     build_string ("black"), "Foreground", string);
-  x_default_parameter (s, parms, "mouse-color",
-                     build_string ("black"), "Mouse", string);
-  x_default_parameter (s, parms, "cursor-color",
-                     build_string ("black"), "Cursor", string);
-  x_default_parameter (s, parms, "border-width",
-                     make_number (2), "BorderWidth", number);
-  x_default_parameter (s, parms, "internal-border-width",
-                     make_number (4), "InternalBorderWidth", number);
-  x_default_parameter (s, parms, "auto-raise",
-                      Qnil, "AutoRaise", boolean);
-
-  hscroll = x_get_arg (parms, intern ("horizontal-scroll-bar"), name, 0, 0);
-  vscroll = x_get_arg (parms, intern ("vertical-scroll-bar"), name, 0, 0);
-
-  if (s->display.x->internal_border_width < 0)
-    s->display.x->internal_border_width = 0;
-
-  tem = x_get_arg (parms, intern ("window-id"), name, 0, 0);
-  if (!EQ (tem, Qnil))
+  x_set_font (f, tem, Qnil);
+  x_default_parameter (f, parms, Qborder_color,
+                      build_string ("black"), "Border", 0, string);
+  x_default_parameter (f, parms, Qbackground_color,
+                      build_string ("white"), "Background", 0, string);
+  x_default_parameter (f, parms, Qforeground_color,
+                      build_string ("black"), "Foreground", 0, string);
+  x_default_parameter (f, parms, Qmouse_color,
+                      build_string ("black"), "Mouse", 0, string);
+  x_default_parameter (f, parms, Qcursor_color,
+                      build_string ("black"), "Cursor", 0, string);
+  x_default_parameter (f, parms, Qborder_width,
+                      make_number (2), "BorderWidth", 0, number);
+  x_default_parameter (f, parms, Qinternal_border_width,
+                      make_number (4), "InternalBorderWidth", 0, number);
+  x_default_parameter (f, parms, Qauto_raise,
+                      Qnil, "AutoRaise", 0, boolean);
+
+  hscroll = EQ (x_get_arg (parms, Qhorizontal_scroll_bar, 0, 0, boolean), Qt);
+  vscroll = EQ (x_get_arg (parms, Qvertical_scroll_bar, 0, 0, boolean), Qt);
+
+  if (f->display.x->internal_border_width < 0)
+    f->display.x->internal_border_width = 0;
+
+  tem = x_get_arg (parms, Qwindow_id, 0, 0, number);
+  if (!EQ (tem, Qunbound))
     {
       WINDOWINFO_TYPE wininfo;
       int nchildren;
       Window *children, root;
 
-      CHECK_STRING (tem, 0);
-      s->display.x->window_desc = (Window) atoi (XSTRING (tem)->data);
+      CHECK_NUMBER (tem, 0);
+      FRAME_X_WINDOW (f) = (Window) XINT (tem);
 
       BLOCK_INPUT;
-      XGetWindowInfo (s->display.x->window_desc, &wininfo);
-      XQueryTree (s->display.x->window_desc, &parent, &nchildren, &children);
+      XGetWindowInfo (FRAME_X_WINDOW (f), &wininfo);
+      XQueryTree (FRAME_X_WINDOW (f), &parent, &nchildren, &children);
       free (children);
       UNBLOCK_INPUT;
 
-      height = (wininfo.height - 2 * s->display.x->internal_border_width)
-       / FONT_HEIGHT (s->display.x->font);
-      width = (wininfo.width - 2 * s->display.x->internal_border_width)
-       / FONT_WIDTH (s->display.x->font);
-      s->display.x->left_pos = wininfo.x;
-      s->display.x->top_pos = wininfo.y;
-      s->visible = wininfo.mapped != 0;
-      s->display.x->border_width = wininfo.bdrwidth;
-      s->display.x->parent_desc = parent;
+      height = PIXEL_TO_CHAR_HEIGHT (f, wininfo.height);
+      width  = PIXEL_TO_CHAR_WIDTH  (f, wininfo.width);
+      f->display.x->left_pos = wininfo.x;
+      f->display.x->top_pos = wininfo.y;
+      FRAME_SET_VISIBILITY (f, wininfo.mapped != 0);
+      f->display.x->border_width = wininfo.bdrwidth;
+      f->display.x->parent_desc = parent;
     }
   else
     {
-      tem = x_get_arg (parms, intern ("parent-id"), name, 0, 0);
-      if (!EQ (tem, Qnil))
+      tem = x_get_arg (parms, Qparent_id, 0, 0, number);
+      if (!EQ (tem, Qunbound))
        {
-         CHECK_STRING (tem, 0);
-         parent = (Window) atoi (XSTRING (tem)->data);
+         CHECK_NUMBER (tem, 0);
+         parent = (Window) XINT (tem);
        }
-      s->display.x->parent_desc = parent;
-      tem = x_get_arg (parms, intern ("height"), name, 0, 0);
-      if (EQ (tem, Qnil))
+      f->display.x->parent_desc = parent;
+      tem = x_get_arg (parms, Qheight, 0, 0, number);
+      if (EQ (tem, Qunbound))
        {
-         tem = x_get_arg (parms, intern ("width"), name, 0, 0);
-         if (EQ (tem, Qnil))
+         tem = x_get_arg (parms, Qwidth, 0, 0, number);
+         if (EQ (tem, Qunbound))
            {
-             tem = x_get_arg (parms, intern ("top"), name, 0, 0);
-             if (EQ (tem, Qnil))
-               tem = x_get_arg (parms, intern ("left"), name, 0, 0);
+             tem = x_get_arg (parms, Qtop, 0, 0, number);
+             if (EQ (tem, Qunbound))
+               tem = x_get_arg (parms, Qleft, 0, 0, number);
            }
        }
-      /* Now TEM is nil if no edge or size was specified.
+      /* Now TEM is Qunbound if no edge or size was specified.
         In that case, we must do rubber-banding.  */
-      if (EQ (tem, Qnil))
+      if (EQ (tem, Qunbound))
        {
-         tem = x_get_arg (parms, intern ("geometry"), name, 0, 0);
-         x_rubber_band (s,
-                        &s->display.x->left_pos, &s->display.x->top_pos,
+         tem = x_get_arg (parms, Qgeometry, 0, 0, number);
+         x_rubber_band (f,
+                        &f->display.x->left_pos, &f->display.x->top_pos,
                         &width, &height,
                         (XTYPE (tem) == Lisp_String
                          ? (char *) XSTRING (tem)->data : ""),
-                        XSTRING (s->name)->data,
+                        XSTRING (f->name)->data,
                         !NILP (hscroll), !NILP (vscroll));
        }
       else
        {
          /* Here if at least one edge or size was specified.
             Demand that they all were specified, and use them.  */
-         tem = x_get_arg (parms, intern ("height"), name, 0, 0);
-         if (EQ (tem, Qnil))
+         tem = x_get_arg (parms, Qheight, 0, 0, number);
+         if (EQ (tem, Qunbound))
            error ("Height not specified");
          CHECK_NUMBER (tem, 0);
          height = XINT (tem);
 
-         tem = x_get_arg (parms, intern ("width"), name, 0, 0);
-         if (EQ (tem, Qnil))
+         tem = x_get_arg (parms, Qwidth, 0, 0, number);
+         if (EQ (tem, Qunbound))
            error ("Width not specified");
          CHECK_NUMBER (tem, 0);
          width = XINT (tem);
 
-         tem = x_get_arg (parms, intern ("top"), name, 0, 0);
-         if (EQ (tem, Qnil))
+         tem = x_get_arg (parms, Qtop, 0, 0, number);
+         if (EQ (tem, Qunbound))
            error ("Top position not specified");
          CHECK_NUMBER (tem, 0);
-         s->display.x->left_pos = XINT (tem);
+         f->display.x->left_pos = XINT (tem);
 
-         tem = x_get_arg (parms, intern ("left"), name, 0, 0);
-         if (EQ (tem, Qnil))
+         tem = x_get_arg (parms, Qleft, 0, 0, number);
+         if (EQ (tem, Qunbound))
            error ("Left position not specified");
          CHECK_NUMBER (tem, 0);
-         s->display.x->top_pos = XINT (tem);
+         f->display.x->top_pos = XINT (tem);
        }
 
-      pixelwidth = (width * FONT_WIDTH (s->display.x->font)
-                   + 2 * s->display.x->internal_border_width
-                   + (!NILP (vscroll) ? VSCROLL_WIDTH : 0));
-      pixelheight = (height * FONT_HEIGHT (s->display.x->font)
-                    + 2 * s->display.x->internal_border_width
-                    + (!NILP (hscroll) ? HSCROLL_HEIGHT : 0));
+      pixelwidth  = CHAR_TO_PIXEL_WIDTH  (f, width);
+      pixelheight = CHAR_TO_PIXEL_HEIGHT (f, height);
       
       BLOCK_INPUT;
-      s->display.x->window_desc
+      FRAME_X_WINDOW (f)
        = XCreateWindow (parent,
-                        s->display.x->left_pos,   /* Absolute horizontal offset */
-                        s->display.x->top_pos,    /* Absolute Vertical offset */
+                        f->display.x->left_pos,   /* Absolute horizontal offset */
+                        f->display.x->top_pos,    /* Absolute Vertical offset */
                         pixelwidth, pixelheight,
-                        s->display.x->border_width,
+                        f->display.x->border_width,
                         BLACK_PIX_DEFAULT, WHITE_PIX_DEFAULT);
       UNBLOCK_INPUT;
-      if (s->display.x->window_desc == 0)
+      if (FRAME_X_WINDOW (f) == 0)
        error ("Unable to create window.");
     }
 
   /* Install the now determined height and width
      in the windows and in phys_lines and desired_lines.  */
-  /* ??? jla version had 1 here instead of 0.  */
-  change_screen_size (s, height, width, 1);
-  XSelectInput (s->display.x->window_desc, KeyPressed | ExposeWindow
+  change_frame_size (f, height, width, 1, 0);
+  XSelectInput (FRAME_X_WINDOW (f), KeyPressed | ExposeWindow
                | ButtonPressed | ButtonReleased | ExposeRegion | ExposeCopy
                | EnterWindow | LeaveWindow | UnmapWindow );
-  x_set_resize_hint (s);
+  x_set_resize_hint (f);
 
   /* Tell the server the window's default name.  */
+  XStoreName (XDISPLAY FRAME_X_WINDOW (f), XSTRING (f->name)->data);
 
-  XStoreName (XDISPLAY s->display.x->window_desc, XSTRING (s->name)->data);
   /* Now override the defaults with all the rest of the specified
      parms.  */
-  tem = x_get_arg (parms, intern ("unsplittable"), name, 0, 0);
-  s->no_split = minibuffer_only || EQ (tem, Qt);
+  tem = x_get_arg (parms, Qunsplittable, 0, 0, boolean);
+  f->no_split = minibuffer_only || EQ (tem, Qt);
 
   /* Do not create an icon window if the caller says not to */
-  if (!EQ (x_get_arg (parms, intern ("suppress-icon"), name, 0, 0), Qt)
-      || s->display.x->parent_desc != ROOT_WINDOW)
+  if (!EQ (x_get_arg (parms, Qsuppress_icon, 0, 0, boolean), Qt)
+      || f->display.x->parent_desc != ROOT_WINDOW)
     {
-      x_text_icon (s, iconidentity);
-      x_default_parameter (s, parms, "icon-type", Qnil,
-                          "BitmapIcon", boolean);
+      x_text_icon (f, iconidentity);
+      x_default_parameter (f, parms, Qicon_type, Qnil,
+                          "BitmapIcon", 0, symbol);
     }
 
   /* Tell the X server the previously set values of the
      background, border and mouse colors; also create the mouse cursor.  */
   BLOCK_INPUT;
-  temp = XMakeTile (s->display.x->background_pixel);
-  XChangeBackground (s->display.x->window_desc, temp);
+  temp = XMakeTile (f->display.x->background_pixel);
+  XChangeBackground (FRAME_X_WINDOW (f), temp);
   XFreePixmap (temp);
   UNBLOCK_INPUT;
-  x_set_border_pixel (s, s->display.x->border_pixel);
+  x_set_border_pixel (f, f->display.x->border_pixel);
 
-  x_set_mouse_color (s, Qnil, Qnil);
+  x_set_mouse_color (f, Qnil, Qnil);
 
   /* Now override the defaults with all the rest of the specified parms.  */
 
-  Fmodify_screen_parameters (screen, parms);
+  Fmodify_frame_parameters (frame, parms);
 
-  if (!NILP (vscroll))
-    install_vertical_scrollbar (s, pixelwidth, pixelheight);
-  if (!NILP (hscroll))
-    install_horizontal_scrollbar (s, pixelwidth, pixelheight);
+  /* Make the window appear on the frame and enable display.  */
 
-  /* Make the window appear on the screen and enable display.  */
+  if (!EQ (x_get_arg (parms, Qsuppress_initial_map, 0, 0, boolean), Qt))
+    x_make_window_visible (f);
+  SET_FRAME_GARBAGED (f);
 
-  if (!EQ (x_get_arg (parms, intern ("suppress-initial-map"), name, 0, 0), Qt))
-    x_make_window_visible (s);
-  SCREEN_GARBAGED (s);
-
-  return screen;
+  return frame;
 #endif /* X10 */
 }
 
-DEFUN ("focus-screen", Ffocus_screen, Sfocus_screen, 1, 1, 0,
-  "Set the focus on SCREEN.")
-  (screen)
-     Lisp_Object screen;
+DEFUN ("focus-frame", Ffocus_frame, Sfocus_frame, 1, 1, 0,
+  "Set the focus on FRAME.")
+  (frame)
+     Lisp_Object frame;
 {
-  CHECK_LIVE_SCREEN (screen, 0);
+  CHECK_LIVE_FRAME (frame, 0);
 
-  if (SCREEN_IS_X (XSCREEN (screen)))
+  if (FRAME_X_P (XFRAME (frame)))
     {
       BLOCK_INPUT;
-      x_focus_on_screen (XSCREEN (screen));
+      x_focus_on_frame (XFRAME (frame));
       UNBLOCK_INPUT;
-      return screen;
+      return frame;
     }
 
   return Qnil;
 }
 
-DEFUN ("unfocus-screen", Funfocus_screen, Sunfocus_screen, 0, 0, 0,
-  "If a screen has been focused, release it.")
+DEFUN ("unfocus-frame", Funfocus_frame, Sunfocus_frame, 0, 0, 0,
+  "If a frame has been focused, release it.")
   ()
 {
-  if (x_focus_screen)
+  if (x_focus_frame)
     {
       BLOCK_INPUT;
-      x_unfocus_screen (x_focus_screen);
+      x_unfocus_frame (x_focus_frame);
       UNBLOCK_INPUT;
     }
 
@@ -2210,7 +2208,7 @@ DEFUN ("unfocus-screen", Funfocus_screen, Sunfocus_screen, 0, 0, 0,
 /* Computes an X-window size and position either from geometry GEO
    or with the mouse.
 
-   S is a screen.  It specifies an X window which is used to
+   F is a frame.  It specifies an X window which is used to
    determine which display to compute for.  Its font, borders
    and colors control how the rectangle will be displayed.
 
@@ -2222,8 +2220,8 @@ DEFUN ("unfocus-screen", Funfocus_screen, Sunfocus_screen, 0, 0, 0,
    HSCROLL and VSCROLL say whether we have horiz and vert scroll bars.  */
 
 int
-x_rubber_band (s, x, y, width, height, geo, str, hscroll, vscroll)
-     struct screen *s;
+x_rubber_band (f, x, y, width, height, geo, str, hscroll, vscroll)
+     struct frame *f;
      int *x, *y, *width, *height;
      char *geo;
      char *str;
@@ -2239,20 +2237,20 @@ x_rubber_band (s, x, y, width, height, geo, str, hscroll, vscroll)
 
   BLOCK_INPUT;
 
-  background_color = s->display.x->background_pixel;
-  border_color = s->display.x->border_pixel;
+  background_color = f->display.x->background_pixel;
+  border_color = f->display.x->border_pixel;
 
-  frame.bdrwidth = s->display.x->border_width;
+  frame.bdrwidth = f->display.x->border_width;
   frame.border = XMakeTile (border_color);
   frame.background = XMakeTile (background_color);
   tempwindow = XCreateTerm (str, "emacs", geo, default_window, &frame, 10, 5,
-                           (2 * s->display.x->internal_border_width
+                           (2 * f->display.x->internal_border_width
                             + (vscroll ? VSCROLL_WIDTH : 0)),
-                           (2 * s->display.x->internal_border_width
+                           (2 * f->display.x->internal_border_width
                             + (hscroll ? HSCROLL_HEIGHT : 0)),
-                           width, height, s->display.x->font,
-                           FONT_WIDTH (s->display.x->font),
-                           FONT_HEIGHT (s->display.x->font));
+                           width, height, f->display.x->font,
+                           FONT_WIDTH (f->display.x->font),
+                           FONT_HEIGHT (f->display.x->font));
   XFreePixmap (frame.border);
   XFreePixmap (frame.background);
 
@@ -2267,7 +2265,7 @@ x_rubber_band (s, x, y, width, height, geo, str, hscroll, vscroll)
   /* Coordinates we got are relative to the root window.
      Convert them to coordinates relative to desired parent window
      by scanning from there up to the root.  */
-  tempwindow = s->display.x->parent_desc;
+  tempwindow = f->display.x->parent_desc;
   while (tempwindow != ROOT_WINDOW)
     {
       int nchildren;
@@ -2284,561 +2282,6 @@ x_rubber_band (s, x, y, width, height, geo, str, hscroll, vscroll)
 }
 #endif /* not HAVE_X11 */
 \f
-/* Set whether screen S has a horizontal scroll bar.
-   VAL is t or nil to specify it. */
-
-static void
-x_set_horizontal_scrollbar (s, val, oldval)
-     struct screen *s;
-     Lisp_Object val, oldval;
-{
-  if (!NILP (val))
-    {
-      if (s->display.x->window_desc != 0)
-       {
-         BLOCK_INPUT;
-         s->display.x->h_scrollbar_height = HSCROLL_HEIGHT;
-         x_set_window_size (s, s->width, s->height);
-         install_horizontal_scrollbar (s);
-         SET_SCREEN_GARBAGED (s);
-         UNBLOCK_INPUT;
-       }
-    }
-  else
-    if (s->display.x->h_scrollbar)
-      {
-       BLOCK_INPUT;
-       s->display.x->h_scrollbar_height = 0;
-       XDestroyWindow (XDISPLAY s->display.x->h_scrollbar);
-       s->display.x->h_scrollbar = 0;
-       x_set_window_size (s, s->width, s->height);
-       s->garbaged++;
-       screen_garbaged++;
-       BLOCK_INPUT;
-      }
-}
-
-/* Set whether screen S has a vertical scroll bar.
-   VAL is t or nil to specify it. */
-
-static void
-x_set_vertical_scrollbar (s, val, oldval)
-     struct screen *s;
-     Lisp_Object val, oldval;
-{
-  if (!NILP (val))
-    {
-      if (s->display.x->window_desc != 0)
-       {
-         BLOCK_INPUT;
-         s->display.x->v_scrollbar_width = VSCROLL_WIDTH;
-         x_set_window_size (s, s->width, s->height);
-         install_vertical_scrollbar (s);
-         SET_SCREEN_GARBAGED (s);
-         UNBLOCK_INPUT;
-       }
-    }
-  else
-    if (s->display.x->v_scrollbar != 0)
-      {
-       BLOCK_INPUT;
-       s->display.x->v_scrollbar_width = 0;
-       XDestroyWindow (XDISPLAY s->display.x->v_scrollbar);
-       s->display.x->v_scrollbar = 0;
-       x_set_window_size (s, s->width, s->height);
-       SET_SCREEN_GARBAGED (s);
-       UNBLOCK_INPUT;
-      }
-}
-\f
-/* Create the X windows for a vertical scroll bar
-   for a screen X that already has an X window but no scroll bar.  */
-
-static void
-install_vertical_scrollbar (s)
-     struct screen *s;
-{
-  int ibw = s->display.x->internal_border_width;
-  Window parent;
-  XColor fore_color, back_color;
-  Pixmap up_arrow_pixmap, down_arrow_pixmap, slider_pixmap;
-  int pix_x, pix_y, width, height, border;
-
-  height = s->display.x->pixel_height - ibw - 2;
-  width = VSCROLL_WIDTH - 2;
-  pix_x = s->display.x->pixel_width - ibw/2;
-  pix_y = ibw / 2;
-  border = 1;
-
-#ifdef HAVE_X11
-  up_arrow_pixmap =
-    XCreatePixmapFromBitmapData (x_current_display, s->display.x->window_desc,
-                                up_arrow_bits, 16, 16,
-                                s->display.x->foreground_pixel,
-                                s->display.x->background_pixel,
-                                DefaultDepth (x_current_display,
-                                              XDefaultScreen (x_current_display)));
-
-  down_arrow_pixmap =
-    XCreatePixmapFromBitmapData (x_current_display, s->display.x->window_desc,
-                                down_arrow_bits, 16, 16,
-                                s->display.x->foreground_pixel,
-                                s->display.x->background_pixel,
-                                DefaultDepth (x_current_display,
-                                              XDefaultScreen (x_current_display)));
-
-  slider_pixmap =
-    XCreatePixmapFromBitmapData (x_current_display, s->display.x->window_desc,
-                                gray_bits, 16, 16,
-                                s->display.x->foreground_pixel,
-                                s->display.x->background_pixel,
-                                DefaultDepth (x_current_display,
-                                              XDefaultScreen (x_current_display)));
-
-  /* These cursor shapes will be installed when the mouse enters
-     the appropriate window.  */
-
-  up_arrow_cursor = XCreateFontCursor (x_current_display, XC_sb_up_arrow);
-  down_arrow_cursor = XCreateFontCursor (x_current_display, XC_sb_down_arrow);
-  v_double_arrow_cursor = XCreateFontCursor (x_current_display, XC_sb_v_double_arrow);
-
-  s->display.x->v_scrollbar =
-    XCreateSimpleWindow (x_current_display, s->display.x->window_desc,
-                        pix_x, pix_y, width, height, border,
-                        s->display.x->foreground_pixel,
-                        s->display.x->background_pixel);
-  XFlush (x_current_display);
-  XDefineCursor (x_current_display, s->display.x->v_scrollbar,
-                v_double_arrow_cursor);
-  
-  /* Create slider window */
-  s->display.x->v_slider =
-    XCreateSimpleWindow (x_current_display, s->display.x->v_scrollbar,
-                        0, VSCROLL_WIDTH - 2,
-                        VSCROLL_WIDTH - 4, VSCROLL_WIDTH - 4,
-                        1, s->display.x->border_pixel,
-                        s->display.x->foreground_pixel);
-  XFlush (x_current_display);
-  XDefineCursor (x_current_display, s->display.x->v_slider,
-                v_double_arrow_cursor);
-  XSetWindowBackgroundPixmap (x_current_display, s->display.x->v_slider,
-                             slider_pixmap);
-
-  s->display.x->v_thumbup =
-    XCreateSimpleWindow (x_current_display, s->display.x->v_scrollbar,
-                        0, 0,
-                        VSCROLL_WIDTH - 2, VSCROLL_WIDTH - 2,
-                        0, s->display.x->foreground_pixel,
-                        s->display.x-> background_pixel);
-  XFlush (x_current_display);
-  XDefineCursor (x_current_display, s->display.x->v_thumbup,
-                up_arrow_cursor);
-  XSetWindowBackgroundPixmap (x_current_display, s->display.x->v_thumbup,
-                             up_arrow_pixmap);
-
-  s->display.x->v_thumbdown =
-    XCreateSimpleWindow (x_current_display, s->display.x->v_scrollbar,
-                        0, height - VSCROLL_WIDTH + 2,
-                        VSCROLL_WIDTH - 2, VSCROLL_WIDTH - 2,
-                        0, s->display.x->foreground_pixel,
-                        s->display.x->background_pixel);
-  XFlush (x_current_display);
-  XDefineCursor (x_current_display, s->display.x->v_thumbdown,
-                down_arrow_cursor);
-  XSetWindowBackgroundPixmap (x_current_display, s->display.x->v_thumbdown,
-                             down_arrow_pixmap);
-  
-  fore_color.pixel = s->display.x->mouse_pixel;
-  back_color.pixel = s->display.x->background_pixel;
-  XQueryColor (x_current_display,
-              DefaultColormap (x_current_display,
-                               DefaultScreen (x_current_display)),
-              &fore_color);
-  XQueryColor (x_current_display,
-              DefaultColormap (x_current_display,
-                               DefaultScreen (x_current_display)),
-              &back_color);
-  XRecolorCursor (x_current_display, up_arrow_cursor,
-                 &fore_color, &back_color);
-  XRecolorCursor (x_current_display, down_arrow_cursor,
-                 &fore_color, &back_color);
-  XRecolorCursor (x_current_display, v_double_arrow_cursor,
-                 &fore_color, &back_color);
-
-  XFreePixmap (x_current_display, slider_pixmap);
-  XFreePixmap (x_current_display, up_arrow_pixmap);
-  XFreePixmap (x_current_display, down_arrow_pixmap);
-  XFlush (x_current_display);
-
-  XSelectInput (x_current_display, s->display.x->v_scrollbar,
-               ButtonPressMask | ButtonReleaseMask
-               | PointerMotionMask | PointerMotionHintMask
-               | EnterWindowMask);
-  XSelectInput (x_current_display, s->display.x->v_slider,
-               ButtonPressMask | ButtonReleaseMask);
-  XSelectInput (x_current_display, s->display.x->v_thumbdown,
-               ButtonPressMask | ButtonReleaseMask);
-  XSelectInput (x_current_display, s->display.x->v_thumbup,
-               ButtonPressMask | ButtonReleaseMask);
-  XFlush (x_current_display);
-
-  /* This should be done at the same time as the main window. */
-  XMapWindow (x_current_display, s->display.x->v_scrollbar);
-  XMapSubwindows (x_current_display, s->display.x->v_scrollbar);
-  XFlush (x_current_display);
-#else /* not HAVE_X11 */
-  Bitmap b;
-  Pixmap fore_tile, back_tile, bord_tile;
-  static short up_arrow_bits[] = {
-    0x0000, 0x0180, 0x03c0, 0x07e0,
-    0x0ff0, 0x1ff8, 0x3ffc, 0x7ffe,
-    0x0180, 0x0180, 0x0180, 0x0180,
-    0x0180, 0x0180, 0x0180, 0xffff};
-  static short down_arrow_bits[] = {
-    0xffff, 0x0180, 0x0180, 0x0180,
-    0x0180, 0x0180, 0x0180, 0x0180,
-    0x7ffe, 0x3ffc, 0x1ff8, 0x0ff0,
-    0x07e0, 0x03c0, 0x0180, 0x0000};
-
-  fore_tile = XMakeTile (s->display.x->foreground_pixel);
-  back_tile = XMakeTile (s->display.x->background_pixel);
-  bord_tile = XMakeTile (s->display.x->border_pixel);
-
-  b = XStoreBitmap (VSCROLL_WIDTH - 2, VSCROLL_WIDTH - 2, up_arrow_bits);
-  up_arrow_pixmap = XMakePixmap (b, 
-                                s->display.x->foreground_pixel,
-                                s->display.x->background_pixel);
-  XFreeBitmap (b);
-
-  b = XStoreBitmap (VSCROLL_WIDTH - 2, VSCROLL_WIDTH - 2, down_arrow_bits);
-  down_arrow_pixmap = XMakePixmap (b,
-                                  s->display.x->foreground_pixel,
-                                  s->display.x->background_pixel);
-  XFreeBitmap (b);
-
-  ibw = s->display.x->internal_border_width;
-
-  s->display.x->v_scrollbar = XCreateWindow (s->display.x->window_desc,
-                                            width - VSCROLL_WIDTH - ibw/2,
-                                            ibw/2,
-                                            VSCROLL_WIDTH - 2,
-                                            height - ibw - 2,
-                                            1, bord_tile, back_tile);
-
-  s->display.x->v_scrollbar_width = VSCROLL_WIDTH;
-
-  s->display.x->v_thumbup = XCreateWindow (s->display.x->v_scrollbar,
-                                          0, 0,
-                                          VSCROLL_WIDTH - 2,
-                                          VSCROLL_WIDTH - 2,
-                                          0, 0, up_arrow_pixmap);
-  XTileAbsolute (s->display.x->v_thumbup);
-
-  s->display.x->v_thumbdown = XCreateWindow (s->display.x->v_scrollbar,
-                                            0,
-                                            height - ibw - VSCROLL_WIDTH,
-                                            VSCROLL_WIDTH - 2,
-                                            VSCROLL_WIDTH - 2,
-                                            0, 0, down_arrow_pixmap);
-  XTileAbsolute (s->display.x->v_thumbdown);
-
-  s->display.x->v_slider = XCreateWindow (s->display.x->v_scrollbar,
-                                         0, VSCROLL_WIDTH - 2,
-                                         VSCROLL_WIDTH - 4,
-                                         VSCROLL_WIDTH - 4,
-                                         1, back_tile, fore_tile);
-
-  XSelectInput (s->display.x->v_scrollbar,
-               (ButtonPressed | ButtonReleased | KeyPressed));
-  XSelectInput (s->display.x->v_thumbup,
-               (ButtonPressed | ButtonReleased | KeyPressed));
-
-  XSelectInput (s->display.x->v_thumbdown,
-               (ButtonPressed | ButtonReleased | KeyPressed));
-
-  XMapWindow (s->display.x->v_thumbup);
-  XMapWindow (s->display.x->v_thumbdown);
-  XMapWindow (s->display.x->v_slider);
-  XMapWindow (s->display.x->v_scrollbar);
-
-  XFreePixmap (fore_tile);
-  XFreePixmap (back_tile);
-  XFreePixmap (up_arrow_pixmap);
-  XFreePixmap (down_arrow_pixmap);
-#endif /* not HAVE_X11 */
-}                                     
-
-static void
-install_horizontal_scrollbar (s)
-     struct screen *s;
-{
-  int ibw = s->display.x->internal_border_width;
-  Window parent;
-  Pixmap left_arrow_pixmap, right_arrow_pixmap, slider_pixmap;
-  int pix_x, pix_y;
-  int width;
-
-  pix_x = ibw;
-  pix_y = PIXEL_HEIGHT (s) - HSCROLL_HEIGHT - ibw ;
-  width = PIXEL_WIDTH (s) - 2 * ibw;
-  if (s->display.x->v_scrollbar_width)
-    width -= (s->display.x->v_scrollbar_width + 1);
-
-#ifdef HAVE_X11
-  left_arrow_pixmap =
-    XCreatePixmapFromBitmapData (x_current_display, s->display.x->window_desc,
-                                left_arrow_bits, 16, 16,
-                                s->display.x->foreground_pixel,
-                                s->display.x->background_pixel,
-                                DefaultDepth (x_current_display,
-                                              XDefaultScreen (x_current_display)));
-
-  right_arrow_pixmap =
-    XCreatePixmapFromBitmapData (x_current_display, s->display.x->window_desc,
-                                right_arrow_bits, 16, 16,
-                                s->display.x->foreground_pixel,
-                                s->display.x->background_pixel,
-                                DefaultDepth (x_current_display,
-                                              XDefaultScreen (x_current_display)));
-
-  slider_pixmap =
-    XCreatePixmapFromBitmapData (x_current_display, s->display.x->window_desc,
-                                gray_bits, 16, 16,
-                                s->display.x->foreground_pixel,
-                                s->display.x->background_pixel,
-                                DefaultDepth (x_current_display,
-                                              XDefaultScreen (x_current_display)));
-
-  left_arrow_cursor = XCreateFontCursor (x_current_display, XC_sb_left_arrow);
-  right_arrow_cursor = XCreateFontCursor (x_current_display, XC_sb_right_arrow);
-  h_double_arrow_cursor = XCreateFontCursor (x_current_display, XC_sb_h_double_arrow);
-
-  s->display.x->h_scrollbar =
-    XCreateSimpleWindow (x_current_display, s->display.x->window_desc,
-                        pix_x, pix_y,
-                        width - ibw - 2, HSCROLL_HEIGHT - 2, 1,
-                        s->display.x->foreground_pixel,
-                        s->display.x->background_pixel);
-  XDefineCursor (x_current_display, s->display.x->h_scrollbar,
-                h_double_arrow_cursor);
-
-  s->display.x->h_slider =
-    XCreateSimpleWindow (x_current_display, s->display.x->h_scrollbar,
-                        0, 0,
-                        HSCROLL_HEIGHT - 4, HSCROLL_HEIGHT - 4,
-                        1, s->display.x->foreground_pixel,
-                        s->display.x->background_pixel);
-  XDefineCursor (x_current_display, s->display.x->h_slider,
-                h_double_arrow_cursor);
-  XSetWindowBackgroundPixmap (x_current_display, s->display.x->h_slider,
-                             slider_pixmap);
-
-  s->display.x->h_thumbleft =
-    XCreateSimpleWindow (x_current_display, s->display.x->h_scrollbar,
-                        0, 0,
-                        HSCROLL_HEIGHT - 2, HSCROLL_HEIGHT - 2,
-                        0, s->display.x->foreground_pixel,
-                        s->display.x->background_pixel);
-  XDefineCursor (x_current_display, s->display.x->h_thumbleft,
-                left_arrow_cursor);
-  XSetWindowBackgroundPixmap (x_current_display, s->display.x->h_thumbleft,
-                             left_arrow_pixmap);
-
-  s->display.x->h_thumbright =
-    XCreateSimpleWindow (x_current_display, s->display.x->h_scrollbar,
-                        width - ibw - HSCROLL_HEIGHT, 0,
-                        HSCROLL_HEIGHT - 2, HSCROLL_HEIGHT -2,
-                        0, s->display.x->foreground_pixel,
-                        s->display.x->background_pixel);
-  XDefineCursor (x_current_display, s->display.x->h_thumbright,
-                right_arrow_cursor);
-  XSetWindowBackgroundPixmap (x_current_display, s->display.x->h_thumbright,
-                             right_arrow_pixmap);
-
-  XFreePixmap (x_current_display, slider_pixmap);
-  XFreePixmap (x_current_display, left_arrow_pixmap);
-  XFreePixmap (x_current_display, right_arrow_pixmap);
-
-  XSelectInput (x_current_display, s->display.x->h_scrollbar,
-               ButtonPressMask | ButtonReleaseMask
-               | PointerMotionMask | PointerMotionHintMask
-               | EnterWindowMask);
-  XSelectInput (x_current_display, s->display.x->h_slider,
-               ButtonPressMask | ButtonReleaseMask);
-  XSelectInput (x_current_display, s->display.x->h_thumbright,
-               ButtonPressMask | ButtonReleaseMask);
-  XSelectInput (x_current_display, s->display.x->h_thumbleft,
-               ButtonPressMask | ButtonReleaseMask);
-
-  XMapWindow (x_current_display, s->display.x->h_scrollbar);
-  XMapSubwindows (x_current_display, s->display.x->h_scrollbar);
-#else /* not HAVE_X11 */
-  Bitmap b;
-  Pixmap fore_tile, back_tile, bord_tile;
-#endif
-}
-\f
-#ifndef HAVE_X11                       /* X10 */
-#define XMoveResizeWindow XConfigureWindow
-#endif /* not HAVE_X11 */
-
-/* Adjust the displayed position in the scroll bar for window W.  */
-
-void
-adjust_scrollbars (s)
-     struct screen *s;
-{
-  int pos;
-  int first_char_in_window, char_beyond_window, chars_in_window;
-  int chars_in_buffer, buffer_size;
-  struct window *w = XWINDOW (SCREEN_SELECTED_WINDOW (s));
-
-  if (! SCREEN_IS_X (s))
-    return;
-
-  if (s->display.x->v_scrollbar != 0)
-    {
-      int h, height;
-      struct buffer *b = XBUFFER (w->buffer);
-
-      buffer_size = Z - BEG;
-      chars_in_buffer = ZV - BEGV;
-      first_char_in_window = marker_position (w->start);
-      char_beyond_window = buffer_size + 1 - XFASTINT (w->window_end_pos);
-      chars_in_window = char_beyond_window - first_char_in_window;
-
-      /* Calculate height of scrollbar area */
-
-      height = s->height * FONT_HEIGHT (s->display.x->font)
-       + s->display.x->internal_border_width
-         - 2 * (s->display.x->v_scrollbar_width);
-
-      /* Figure starting position for the scrollbar slider */
-
-      if (chars_in_buffer <= 0)
-       pos = 0;
-      else
-       pos = ((first_char_in_window - BEGV - BEG) * height
-              / chars_in_buffer);
-      pos = max (0, pos);
-      pos = min (pos, height - 2);
-
-      /* Figure length of the slider */
-
-      if (chars_in_buffer <= 0)
-       h = height;
-      else
-       h = (chars_in_window * height) / chars_in_buffer;
-      h = min (h, height - pos);
-      h = max (h, 1);
-
-      /* Add thumbup offset to starting position of slider */
-
-      pos += (s->display.x->v_scrollbar_width - 2);
-
-      XMoveResizeWindow (XDISPLAY
-                        s->display.x->v_slider,
-                        0, pos,
-                        s->display.x->v_scrollbar_width - 4, h);
-    }
-      
-  if (s->display.x->h_scrollbar != 0)
-    {
-      int l, length;      /* Length of the scrollbar area */
-
-      length = s->width * FONT_WIDTH (s->display.x->font)
-       + s->display.x->internal_border_width
-         - 2 * (s->display.x->h_scrollbar_height);
-
-      /* Starting position for horizontal slider */
-      if (! w->hscroll)
-       pos = 0;
-      else
-       pos = (w->hscroll * length) / (w->hscroll + s->width);
-      pos = max (0, pos);
-      pos = min (pos, length - 2);
-
-      /* Length of slider */
-      l = length - pos;
-
-      /* Add thumbup offset */
-      pos += (s->display.x->h_scrollbar_height - 2);
-
-      XMoveResizeWindow (XDISPLAY
-                        s->display.x->h_slider,
-                        pos, 0,
-                        l, s->display.x->h_scrollbar_height - 4);
-    }
-}
-\f
-/* Adjust the size of the scroll bars of screen S,
-   when the screen size has changed.  */
-
-void
-x_resize_scrollbars (s)
-     struct screen *s;
-{
-  int ibw = s->display.x->internal_border_width;
-  int pixelwidth, pixelheight;
-
-  if (s == 0
-      || s->display.x == 0
-      || (s->display.x->v_scrollbar == 0
-         && s->display.x->h_scrollbar == 0))
-    return;
-
-  /* Get the size of the screen.  */
-  pixelwidth = (s->width * FONT_WIDTH (s->display.x->font)
-               + 2 * ibw + s->display.x->v_scrollbar_width);
-  pixelheight = (s->height * FONT_HEIGHT (s->display.x->font)
-                + 2 * ibw + s->display.x->h_scrollbar_height);
-
-  if (s->display.x->v_scrollbar_width && s->display.x->v_scrollbar)
-    {
-      BLOCK_INPUT;
-      XMoveResizeWindow (XDISPLAY
-                        s->display.x->v_scrollbar,
-                        pixelwidth - s->display.x->v_scrollbar_width - ibw/2,
-                        ibw/2,
-                        s->display.x->v_scrollbar_width - 2,
-                        pixelheight - ibw - 2);
-      XMoveWindow (XDISPLAY
-                  s->display.x->v_thumbdown, 0,
-                  pixelheight - ibw - s->display.x->v_scrollbar_width);
-      UNBLOCK_INPUT;
-    }
-
-  if (s->display.x->h_scrollbar_height && s->display.x->h_scrollbar)
-    {
-      if (s->display.x->v_scrollbar_width)
-       pixelwidth -= s->display.x->v_scrollbar_width + 1;
-
-      BLOCK_INPUT;
-      XMoveResizeWindow (XDISPLAY
-                        s->display.x->h_scrollbar,
-                        ibw / 2,
-                        pixelheight - s->display.x->h_scrollbar_height - ibw / 2,
-                        pixelwidth - ibw - 2,
-                        s->display.x->h_scrollbar_height - 2);
-      XMoveWindow (XDISPLAY
-                  s->display.x->h_thumbright,
-                  pixelwidth - ibw - s->display.x->h_scrollbar_height, 0);
-      UNBLOCK_INPUT;
-    }
-}
-
-x_pixel_width (s)
-     register struct screen *s;
-{
-  return PIXEL_WIDTH (s);
-}
-
-x_pixel_height (s)
-     register struct screen *s;
-{
-  return PIXEL_HEIGHT (s);
-}
-\f
 DEFUN ("x-defined-color", Fx_defined_color, Sx_defined_color, 1, 1, 0,
   "Return t if the current X display supports the color named COLOR.")
   (color)
@@ -2858,7 +2301,7 @@ DEFUN ("x-color-display-p", Fx_color_display_p, Sx_color_display_p, 0, 0, 0,
   "Return t if the X display used currently supports color.")
   ()
 {
-  if (XINT (x_screen_planes) <= 2)
+  if (x_screen_planes <= 2)
     return Qnil;
 
   switch (screen_visual->class)
@@ -2874,63 +2317,71 @@ DEFUN ("x-color-display-p", Fx_color_display_p, Sx_color_display_p, 0, 0, 0,
     }
 }
 
-DEFUN ("x-pixel-width", Fx_pixel_width, Sx_pixel_width, 1, 1, 0,
-  "Return the width in pixels of screen S.")
-  (screen)
-     Lisp_Object screen;
+x_pixel_width (f)
+     register struct frame *f;
 {
-  CHECK_LIVE_SCREEN (screen, 0);
-  return make_number (XSCREEN (screen)->display.x->pixel_width);
+  return PIXEL_WIDTH (f);
 }
 
-DEFUN ("x-pixel-height", Fx_pixel_height, Sx_pixel_height, 1, 1, 0,
-  "Return the height in pixels of screen S.")
-  (screen)
-     Lisp_Object screen;
+x_pixel_height (f)
+     register struct frame *f;
 {
-  CHECK_LIVE_SCREEN (screen, 0);
-  return make_number (XSCREEN (screen)->display.x->pixel_height);
+  return PIXEL_HEIGHT (f);
+}
+
+x_char_width (f)
+     register struct frame *f;
+{
+  return FONT_WIDTH (f->display.x->font);
+}
+
+x_char_height (f)
+     register struct frame *f;
+{
+  return FONT_HEIGHT (f->display.x->font);
 }
 \f
-/* Draw a rectangle on the screen with left top corner including
+#if 0  /* These no longer seem like the right way to do things.  */
+
+/* Draw a rectangle on the frame with left top corner including
    the character specified by LEFT_CHAR and TOP_CHAR.  The rectangle is
    CHARS by LINES wide and long and is the color of the cursor. */
 
 void
-x_rectangle (s, gc, left_char, top_char, chars, lines)
-     register struct screen *s;
+x_rectangle (f, gc, left_char, top_char, chars, lines)
+     register struct frame *f;
      GC gc;
      register int top_char, left_char, chars, lines;
 {
   int width;
   int height;
-  int left = (left_char * FONT_WIDTH (s->display.x->font)
-                   + s->display.x->internal_border_width);
-  int top = (top_char *  FONT_HEIGHT (s->display.x->font)
-                  + s->display.x->internal_border_width);
+  int left = (left_char * FONT_WIDTH (f->display.x->font)
+                   + f->display.x->internal_border_width);
+  int top = (top_char *  FONT_HEIGHT (f->display.x->font)
+                  + f->display.x->internal_border_width);
 
   if (chars < 0)
-    width = FONT_WIDTH (s->display.x->font) / 2;
+    width = FONT_WIDTH (f->display.x->font) / 2;
   else
-    width = FONT_WIDTH (s->display.x->font) * chars;
+    width = FONT_WIDTH (f->display.x->font) * chars;
   if (lines < 0)
-    height = FONT_HEIGHT (s->display.x->font) / 2;
+    height = FONT_HEIGHT (f->display.x->font) / 2;
   else
-    height = FONT_HEIGHT (s->display.x->font) * lines;
+    height = FONT_HEIGHT (f->display.x->font) * lines;
 
-  XDrawRectangle (x_current_display, s->display.x->window_desc,
+  XDrawRectangle (x_current_display, FRAME_X_WINDOW (f),
                  gc, left, top, width, height);
 }
 
 DEFUN ("x-draw-rectangle", Fx_draw_rectangle, Sx_draw_rectangle, 5, 5, 0,
-  "Draw a rectangle on SCREEN between coordinates specified by\n\
+  "Draw a rectangle on FRAME between coordinates specified by\n\
 numbers X0, Y0, X1, Y1 in the cursor pixel.")
-  (screen, X0, Y0, X1, Y1)
-     register Lisp_Object screen, X0, X1, Y0, Y1;
+  (frame, X0, Y0, X1, Y1)
+     register Lisp_Object frame, X0, X1, Y0, Y1;
 {
   register int x0, y0, x1, y1, top, left, n_chars, n_lines;
 
-  CHECK_LIVE_SCREEN (screen, 0);
+  CHECK_LIVE_FRAME (frame, 0);
   CHECK_NUMBER (X0, 0);
   CHECK_NUMBER (Y0, 1);
   CHECK_NUMBER (X1, 2);
@@ -2964,7 +2415,7 @@ numbers X0, Y0, X1, Y1 in the cursor pixel.")
     }
 
   BLOCK_INPUT;
-  x_rectangle (XSCREEN (screen), XSCREEN (screen)->display.x->cursor_gc,
+  x_rectangle (XFRAME (frame), XFRAME (frame)->display.x->cursor_gc,
               left, top, n_chars, n_lines);
   UNBLOCK_INPUT;
 
@@ -2972,14 +2423,14 @@ numbers X0, Y0, X1, Y1 in the cursor pixel.")
 }
 
 DEFUN ("x-erase-rectangle", Fx_erase_rectangle, Sx_erase_rectangle, 5, 5, 0,
-  "Draw a rectangle drawn on SCREEN between coordinates\n\
+  "Draw a rectangle drawn on FRAME between coordinates\n\
 X0, Y0, X1, Y1 in the regular background-pixel.")
-  (screen, X0, Y0, X1, Y1)
-  register Lisp_Object screen, X0, Y0, X1, Y1;
+  (frame, X0, Y0, X1, Y1)
+  register Lisp_Object frame, X0, Y0, X1, Y1;
 {
   register int x0, y0, x1, y1, top, left, n_chars, n_lines;
 
-  CHECK_SCREEN (screen, 0);
+  CHECK_FRAME (frame, 0);
   CHECK_NUMBER (X0, 0);
   CHECK_NUMBER (Y0, 1);
   CHECK_NUMBER (X1, 2);
@@ -3013,7 +2464,7 @@ X0, Y0, X1, Y1 in the regular background-pixel.")
     }
 
   BLOCK_INPUT;
-  x_rectangle (XSCREEN (screen), XSCREEN (screen)->display.x->reverse_gc,
+  x_rectangle (XFRAME (frame), XFRAME (frame)->display.x->reverse_gc,
               left, top, n_chars, n_lines);
   UNBLOCK_INPUT;
 
@@ -3024,17 +2475,17 @@ X0, Y0, X1, Y1 in the regular background-pixel.")
    TOP_X, TOP_Y and ending at BOTTOM_X and BOTTOM_Y.  GC specifies the
    pixel and line characteristics. */
 
-#define line_len(line) (SCREEN_CURRENT_GLYPHS (s)->used[(line)])
+#define line_len(line) (FRAME_CURRENT_GLYPHS (f)->used[(line)])
 
 static void
-outline_region (s, gc, top_x, top_y, bottom_x, bottom_y)
-     register struct screen *s;
+outline_region (f, gc, top_x, top_y, bottom_x, bottom_y)
+     register struct frame *f;
      GC gc;
      int  top_x, top_y, bottom_x, bottom_y;
 {
-  register int ibw = s->display.x->internal_border_width;
-  register int font_w = FONT_WIDTH (s->display.x->font);
-  register int font_h = FONT_HEIGHT (s->display.x->font);
+  register int ibw = f->display.x->internal_border_width;
+  register int font_w = FONT_WIDTH (f->display.x->font);
+  register int font_h = FONT_HEIGHT (f->display.x->font);
   int y = top_y;
   int x = line_len (y);
   XPoint *pixel_points = (XPoint *)
@@ -3099,19 +2550,19 @@ outline_region (s, gc, top_x, top_y, bottom_x, bottom_y)
   this_point->x = pixel_points->x;
   this_point->y = pixel_points->y;
 
-  XDrawLines (x_current_display, s->display.x->window_desc,
+  XDrawLines (x_current_display, FRAME_X_WINDOW (f),
              gc, pixel_points,
              (this_point - pixel_points + 1), CoordModeOrigin);
 }
 
 DEFUN ("x-contour-region", Fx_contour_region, Sx_contour_region, 1, 1, 0,
   "Highlight the region between point and the character under the mouse\n\
-selected screen.")
+selected frame.")
   (event)
      register Lisp_Object event;
 {
   register int x0, y0, x1, y1;
-  register struct screen *s = selected_screen;
+  register struct frame *f = selected_frame;
   register int p1, p2;
 
   CHECK_CONS (event, 0);
@@ -3123,22 +2574,22 @@ selected screen.")
   /* If the mouse is past the end of the line, don't that area. */
   /* ReWrite this... */
 
-  x1 = s->cursor_x;
-  y1 = s->cursor_y;
+  x1 = f->cursor_x;
+  y1 = f->cursor_y;
 
   if (y1 > y0)                 /* point below mouse */
-    outline_region (s, s->display.x->cursor_gc,
+    outline_region (f, f->display.x->cursor_gc,
                    x0, y0, x1, y1);
   else if (y1 < y0)            /* point above mouse */
-    outline_region (s, s->display.x->cursor_gc,
+    outline_region (f, f->display.x->cursor_gc,
                    x1, y1, x0, y0);
   else                         /* same line: draw horizontal rectangle */
     {
       if (x1 > x0)
-       x_rectangle (s, s->display.x->cursor_gc,
+       x_rectangle (f, f->display.x->cursor_gc,
                     x0, y0, (x1 - x0 + 1), 1);
       else if (x1 < x0)
-         x_rectangle (s, s->display.x->cursor_gc,
+         x_rectangle (f, f->display.x->cursor_gc,
                       x1, y1, (x0 - x1 + 1), 1);
     }
 
@@ -3150,32 +2601,32 @@ selected screen.")
 
 DEFUN ("x-uncontour-region", Fx_uncontour_region, Sx_uncontour_region, 1, 1, 0,
   "Erase any highlighting of the region between point and the character\n\
-at X, Y on the selected screen.")
+at X, Y on the selected frame.")
   (event)
      register Lisp_Object event;
 {
   register int x0, y0, x1, y1;
-  register struct screen *s = selected_screen;
+  register struct frame *f = selected_frame;
 
   BLOCK_INPUT;
   x0 = XINT (Fcar (Fcar (event)));
   y0 = XINT (Fcar (Fcdr (Fcar (event))));
-  x1 = s->cursor_x;
-  y1 = s->cursor_y;
+  x1 = f->cursor_x;
+  y1 = f->cursor_y;
 
   if (y1 > y0)                 /* point below mouse */
-    outline_region (s, s->display.x->reverse_gc,
+    outline_region (f, f->display.x->reverse_gc,
                      x0, y0, x1, y1);
   else if (y1 < y0)            /* point above mouse */
-    outline_region (s, s->display.x->reverse_gc,
+    outline_region (f, f->display.x->reverse_gc,
                      x1, y1, x0, y0);
   else                         /* same line: draw horizontal rectangle */
     {
       if (x1 > x0)
-       x_rectangle (s, s->display.x->reverse_gc,
+       x_rectangle (f, f->display.x->reverse_gc,
                     x0, y0, (x1 - x0 + 1), 1);
       else if (x1 < x0)
-       x_rectangle (s, s->display.x->reverse_gc,
+       x_rectangle (f, f->display.x->reverse_gc,
                     x1, y1, (x0 - x1 + 1), 1);
     }
   UNBLOCK_INPUT;
@@ -3183,9 +2634,6 @@ at X, Y on the selected screen.")
   return Qnil;
 }
 
-extern unsigned int x_mouse_x, x_mouse_y, x_mouse_grabbed;
-extern Lisp_Object unread_command_char;
-
 #if 0
 int contour_begin_x, contour_begin_y;
 int contour_end_x, contour_end_y;
@@ -3201,7 +2649,7 @@ clip_contour_top (y_pos, x_pos)
   register XPoint *begin = contour_lines[y_pos].top_left;
   register XPoint *end;
   register int npoints;
-  register struct display_line *line = selected_screen->phys_lines[y_pos + 1];
+  register struct display_line *line = selected_frame->phys_lines[y_pos + 1];
 
   if (x_pos >= line->len - 1)  /* Draw one, straight horizontal line. */
     {
@@ -3266,9 +2714,9 @@ DEFUN ("x-select-region", Fx_select_region, Sx_select_region, 1, 1, "e",
   (event)
      Lisp_Object event;
 {
- register struct screen *s = selected_screen;
- register int point_x = s->cursor_x;
- register int point_y = s->cursor_y;
+ register struct frame *f = selected_frame;
+ register int point_x = f->cursor_x;
+ register int point_y = f->cursor_y;
  register int mouse_below_point;
  register Lisp_Object obj;
  register int x_contour_x, x_contour_y;
@@ -3279,19 +2727,19 @@ DEFUN ("x-select-region", Fx_select_region, Sx_select_region, 1, 1, "e",
                               && x_contour_x > point_x))
    {
      mouse_below_point = 1;
-     outline_region (s, s->display.x->cursor_gc, point_x, point_y,
+     outline_region (f, f->display.x->cursor_gc, point_x, point_y,
                     x_contour_x, x_contour_y);
    }
  else
    {
      mouse_below_point = 0;
-     outline_region (s, s->display.x->cursor_gc, x_contour_x, x_contour_y,
+     outline_region (f, f->display.x->cursor_gc, x_contour_x, x_contour_y,
                     point_x, point_y);
    }
 
  while (1)
    {
-     obj = read_char (-1);
+     obj = read_char (-1, 0, 0, Qnil, 0);
      if (XTYPE (obj) != Lisp_Cons)
        break;
 
@@ -3301,9 +2749,9 @@ DEFUN ("x-select-region", Fx_select_region, Sx_select_region, 1, 1, "e",
           {
             mouse_below_point = 0;
 
-            outline_region (s, s->display.x->reverse_gc, point_x, point_y,
+            outline_region (f, f->display.x->reverse_gc, point_x, point_y,
                             x_contour_x, x_contour_y);
-            outline_region (s, s->display.x->cursor_gc, x_mouse_x, x_mouse_y,
+            outline_region (f, f->display.x->cursor_gc, x_mouse_x, x_mouse_y,
                             point_x, point_y);
           }
         else if (x_mouse_y < x_contour_y)        /* Bottom clipped. */
@@ -3324,9 +2772,9 @@ DEFUN ("x-select-region", Fx_select_region, Sx_select_region, 1, 1, "e",
           {
             mouse_below_point = 1;
 
-            outline_region (s, s->display.x->reverse_gc,
+            outline_region (f, f->display.x->reverse_gc,
                             x_contour_x, x_contour_y, point_x, point_y);
-            outline_region (s, s->display.x->cursor_gc, point_x, point_y,
+            outline_region (f, f->display.x->cursor_gc, point_x, point_y,
                             x_mouse_x, x_mouse_y);
           }
         else if (x_mouse_y > x_contour_y)        /* Top clipped. */
@@ -3340,7 +2788,7 @@ DEFUN ("x-select-region", Fx_select_region, Sx_select_region, 1, 1, "e",
        }
    }
 
- unread_command_char = obj;
+ unread_command_event = obj;
  if (mouse_below_point)
    {
      contour_begin_x = point_x;
@@ -3364,42 +2812,42 @@ DEFUN ("x-horizontal-line", Fx_horizontal_line, Sx_horizontal_line, 1, 1, "e",
      Lisp_Object event;
 {
   register Lisp_Object obj;
-  struct screen *s = selected_screen;
+  struct frame *f = selected_frame;
   register struct window *w = XWINDOW (selected_window);
-  register GC line_gc = s->display.x->cursor_gc;
-  register GC erase_gc = s->display.x->reverse_gc;
+  register GC line_gc = f->display.x->cursor_gc;
+  register GC erase_gc = f->display.x->reverse_gc;
 #if 0
   char dash_list[] = {6, 4, 6, 4};
   int dashes = 4;
   XGCValues gc_values;
 #endif
   register int previous_y;
-  register int line = (x_mouse_y + 1) * FONT_HEIGHT (s->display.x->font)
-    + s->display.x->internal_border_width;
-  register int left = s->display.x->internal_border_width
+  register int line = (x_mouse_y + 1) * FONT_HEIGHT (f->display.x->font)
+    + f->display.x->internal_border_width;
+  register int left = f->display.x->internal_border_width
     + (w->left
-       * FONT_WIDTH (s->display.x->font));
+       * FONT_WIDTH (f->display.x->font));
   register int right = left + (w->width
-                              * FONT_WIDTH (s->display.x->font))
-    - s->display.x->internal_border_width;
+                              * FONT_WIDTH (f->display.x->font))
+    - f->display.x->internal_border_width;
 
 #if 0
   BLOCK_INPUT;
-  gc_values.foreground = s->display.x->cursor_pixel;
-  gc_values.background = s->display.x->background_pixel;
+  gc_values.foreground = f->display.x->cursor_pixel;
+  gc_values.background = f->display.x->background_pixel;
   gc_values.line_width = 1;
   gc_values.line_style = LineOnOffDash;
   gc_values.cap_style = CapRound;
   gc_values.join_style = JoinRound;
 
-  line_gc = XCreateGC (x_current_display, s->display.x->window_desc,
+  line_gc = XCreateGC (x_current_display, FRAME_X_WINDOW (f),
                       GCLineStyle | GCJoinStyle | GCCapStyle
                       | GCLineWidth | GCForeground | GCBackground,
                       &gc_values);
   XSetDashes (x_current_display, line_gc, 0, dash_list, dashes);
-  gc_values.foreground = s->display.x->background_pixel;
-  gc_values.background = s->display.x->foreground_pixel;
-  erase_gc = XCreateGC (x_current_display, s->display.x->window_desc,
+  gc_values.foreground = f->display.x->background_pixel;
+  gc_values.background = f->display.x->foreground_pixel;
+  erase_gc = XCreateGC (x_current_display, FRAME_X_WINDOW (f),
                       GCLineStyle | GCJoinStyle | GCCapStyle
                       | GCLineWidth | GCForeground | GCBackground,
                       &gc_values);
@@ -3413,9 +2861,9 @@ DEFUN ("x-horizontal-line", Fx_horizontal_line, Sx_horizontal_line, 1, 1, "e",
          && x_mouse_y < XINT (w->top) + XINT (w->height) - 1)
        {
          previous_y = x_mouse_y;
-         line = (x_mouse_y + 1) * FONT_HEIGHT (s->display.x->font)
-           + s->display.x->internal_border_width;
-         XDrawLine (x_current_display, s->display.x->window_desc,
+         line = (x_mouse_y + 1) * FONT_HEIGHT (f->display.x->font)
+           + f->display.x->internal_border_width;
+         XDrawLine (x_current_display, FRAME_X_WINDOW (f),
                     line_gc, left, line, right, line);
        }
       XFlushQueue ();
@@ -3423,17 +2871,17 @@ DEFUN ("x-horizontal-line", Fx_horizontal_line, Sx_horizontal_line, 1, 1, "e",
 
       do
        {
-         obj = read_char (-1);
+         obj = read_char (-1, 0, 0, Qnil, 0);
          if ((XTYPE (obj) != Lisp_Cons)
              || (! EQ (Fcar (Fcdr (Fcdr (obj))),
-                      intern ("vertical-scroll-bar")))
+                      Qvertical_scroll_bar))
              || x_mouse_grabbed)
            {
              BLOCK_INPUT;
-             XDrawLine (x_current_display, s->display.x->window_desc,
+             XDrawLine (x_current_display, FRAME_X_WINDOW (f),
                         erase_gc, left, line, right, line);
              UNBLOCK_INPUT;
-             unread_command_char = obj;
+             unread_command_event = obj;
 #if 0
              XFreeGC (x_current_display, line_gc);
              XFreeGC (x_current_display, erase_gc);
@@ -3444,11 +2892,12 @@ DEFUN ("x-horizontal-line", Fx_horizontal_line, Sx_horizontal_line, 1, 1, "e",
       while (x_mouse_y == previous_y);
 
       BLOCK_INPUT;
-      XDrawLine (x_current_display, s->display.x->window_desc,
+      XDrawLine (x_current_display, FRAME_X_WINDOW (f),
                 erase_gc, left, line, right, line);
       UNBLOCK_INPUT;
     }
 }
+#endif
 \f
 /* Offset in buffer of character under the pointer, or 0. */
 int mouse_buffer_offset;
@@ -3462,29 +2911,29 @@ DEFUN ("x-track-pointer", Fx_track_pointer, Sx_track_pointer, 0, 0, 0,
   ()
 {
   static Cursor current_pointer_shape;
-  SCREEN_PTR s = x_mouse_screen;
+  FRAME_PTR f = x_mouse_frame;
 
   BLOCK_INPUT;
-  if (EQ (Vmouse_screen_part, Qtext_part)
-      && (current_pointer_shape != s->display.x->nontext_cursor))
+  if (EQ (Vmouse_frame_part, Qtext_part)
+      && (current_pointer_shape != f->display.x->nontext_cursor))
     {
       unsigned char c;
       struct buffer *buf;
 
-      current_pointer_shape = s->display.x->nontext_cursor;
+      current_pointer_shape = f->display.x->nontext_cursor;
       XDefineCursor (x_current_display,
-                    s->display.x->window_desc,
+                    FRAME_X_WINDOW (f),
                     current_pointer_shape);
 
       buf = XBUFFER (XWINDOW (Vmouse_window)->buffer);
       c = *(BUF_CHAR_ADDRESS (buf, mouse_buffer_offset));
     }
-  else if (EQ (Vmouse_screen_part, Qmodeline_part)
-          && (current_pointer_shape != s->display.x->modeline_cursor))
+  else if (EQ (Vmouse_frame_part, Qmodeline_part)
+          && (current_pointer_shape != f->display.x->modeline_cursor))
     {
-      current_pointer_shape = s->display.x->modeline_cursor;
+      current_pointer_shape = f->display.x->modeline_cursor;
       XDefineCursor (x_current_display,
-                    s->display.x->window_desc,
+                    FRAME_X_WINDOW (f),
                     current_pointer_shape);
     }
 
@@ -3500,7 +2949,7 @@ DEFUN ("x-track-pointer", Fx_track_pointer, Sx_track_pointer, 1, 1, "e",
      Lisp_Object event;
 {
   struct window *w = XWINDOW (Vmouse_window);
-  struct screen *s = XSCREEN (WINDOW_SCREEN (w));
+  struct frame *f = XFRAME (WINDOW_FRAME (w));
   struct buffer *b = XBUFFER (w->buffer);
   Lisp_Object obj;
 
@@ -3511,7 +2960,7 @@ DEFUN ("x-track-pointer", Fx_track_pointer, Sx_track_pointer, 1, 1, "e",
     {
       int x, y;
 
-      x_read_mouse_position (selected_screen, &x, &y);
+      x_read_mouse_position (selected_frame, &x, &y);
     }
 
   BLOCK_INPUT;
@@ -3526,29 +2975,29 @@ DEFUN ("x-track-pointer", Fx_track_pointer, Sx_track_pointer, 1, 1, "e",
          || x_mouse_y != mouse_track_top)
        {
          int hp = 0;           /* Horizontal position */
-         int len = SCREEN_CURRENT_GLYPHS (s)->used[x_mouse_y];
-         int p = SCREEN_CURRENT_GLYPHS (s)->bufp[x_mouse_y];
+         int len = FRAME_CURRENT_GLYPHS (f)->used[x_mouse_y];
+         int p = FRAME_CURRENT_GLYPHS (f)->bufp[x_mouse_y];
          int tab_width = XINT (b->tab_width);
          int ctl_arrow_p = !NILP (b->ctl_arrow);
          unsigned char c;
          int mode_line_vpos = XFASTINT (w->height) + XFASTINT (w->top) - 1;
          int in_mode_line = 0;
 
-         if (! SCREEN_CURRENT_GLYPHS (s)->enable[x_mouse_y])
+         if (! FRAME_CURRENT_GLYPHS (f)->enable[x_mouse_y])
            break;
 
          /* Erase previous rectangle. */
          if (mouse_track_width)
            {
-             x_rectangle (s, s->display.x->reverse_gc,
+             x_rectangle (f, f->display.x->reverse_gc,
                           mouse_track_left, mouse_track_top,
                           mouse_track_width, 1);
 
-             if ((mouse_track_left == s->phys_cursor_x
-                  || mouse_track_left == s->phys_cursor_x - 1)
-                 && mouse_track_top == s->phys_cursor_y)
+             if ((mouse_track_left == f->phys_cursor_x
+                  || mouse_track_left == f->phys_cursor_x - 1)
+                 && mouse_track_top == f->phys_cursor_y)
                {
-                 x_display_cursor (s, 1);
+                 x_display_cursor (f, 1);
                }
            }
 
@@ -3569,7 +3018,7 @@ DEFUN ("x-track-pointer", Fx_track_pointer, Sx_track_pointer, 1, 1, "e",
          do
            {
              c = FETCH_CHAR (p);
-             if (len == s->width && hp == len - 1 && c != '\n')
+             if (len == f->width && hp == len - 1 && c != '\n')
                goto draw_or_not;
 
              switch (c)
@@ -3619,52 +3068,52 @@ DEFUN ("x-track-pointer", Fx_track_pointer, Sx_track_pointer, 1, 1, "e",
          if (mouse_track_width) /* Over text; use text pointer shape. */
            {
              XDefineCursor (x_current_display,
-                            s->display.x->window_desc,
-                            s->display.x->text_cursor);
-             x_rectangle (s, s->display.x->cursor_gc,
+                            FRAME_X_WINDOW (f),
+                            f->display.x->text_cursor);
+             x_rectangle (f, f->display.x->cursor_gc,
                           mouse_track_left, mouse_track_top,
                           mouse_track_width, 1);
            }
          else if (in_mode_line)
            XDefineCursor (x_current_display,
-                          s->display.x->window_desc,
-                          s->display.x->modeline_cursor);
+                          FRAME_X_WINDOW (f),
+                          f->display.x->modeline_cursor);
          else
            XDefineCursor (x_current_display,
-                          s->display.x->window_desc,
-                          s->display.x->nontext_cursor);
+                          FRAME_X_WINDOW (f),
+                          f->display.x->nontext_cursor);
        }
 
       XFlush (x_current_display);
       UNBLOCK_INPUT;
 
-      obj = read_char (-1);
+      obj = read_char (-1, 0, 0, Qnil, 0);
       BLOCK_INPUT;
     }
   while (XTYPE (obj) == Lisp_Cons                 /* Mouse event */
-        && EQ (Fcar (Fcdr (Fcdr (obj))), Qnil)    /* Not scrollbar */
+        && EQ (Fcar (Fcdr (Fcdr (obj))), Qnil)    /* Not scroll bar */
         && EQ (Vmouse_depressed, Qnil)              /* Only motion events */
         && EQ (Vmouse_window, selected_window)    /* In this window */
-        && x_mouse_screen);
+        && x_mouse_frame);
 
-  unread_command_char = obj;
+  unread_command_event = obj;
 
   if (mouse_track_width)
     {
-      x_rectangle (s, s->display.x->reverse_gc,
+      x_rectangle (f, f->display.x->reverse_gc,
                   mouse_track_left, mouse_track_top,
                   mouse_track_width, 1);
       mouse_track_width = 0;
-      if ((mouse_track_left == s->phys_cursor_x
-          || mouse_track_left - 1 == s->phys_cursor_x)
-         && mouse_track_top == s->phys_cursor_y)
+      if ((mouse_track_left == f->phys_cursor_x
+          || mouse_track_left - 1 == f->phys_cursor_x)
+         && mouse_track_top == f->phys_cursor_y)
        {
-         x_display_cursor (s, 1);
+         x_display_cursor (f, 1);
        }
     }
   XDefineCursor (x_current_display,
-                s->display.x->window_desc,
-                s->display.x->nontext_cursor);
+                FRAME_X_WINDOW (f),
+                f->display.x->nontext_cursor);
   XFlush (x_current_display);
   UNBLOCK_INPUT;
 
@@ -3676,20 +3125,20 @@ DEFUN ("x-track-pointer", Fx_track_pointer, Sx_track_pointer, 1, 1, "e",
 #include "glyphs.h"
 
 /* Draw a pixmap specified by IMAGE_DATA of dimensions WIDTH and HEIGHT
-   on the screen S at position X, Y. */
+   on the frame F at position X, Y. */
 
-x_draw_pixmap (s, x, y, image_data, width, height)
-     struct screen *s;
+x_draw_pixmap (f, x, y, image_data, width, height)
+     struct frame *f;
      int x, y, width, height;
      char *image_data;
 {
   Pixmap image;
 
   image = XCreateBitmapFromData (x_current_display,
-                                s->display.x->window_desc, image_data,
+                                FRAME_X_WINDOW (f), image_data,
                                 width, height);
-  XCopyPlane (x_current_display, image, s->display.x->window_desc,
-             s->display.x->normal_gc, 0, 0, width, height, x, y);
+  XCopyPlane (x_current_display, image, FRAME_X_WINDOW (f),
+             f->display.x->normal_gc, 0, 0, width, height, x, y);
 }
 #endif
 \f
@@ -3742,18 +3191,18 @@ DEFUN ("x-get-mouse-event", Fx_get_mouse_event, Sx_get_mouse_event,
   "Get next mouse event out of mouse event buffer.\n\
 Optional ARG non-nil means return nil immediately if no pending event;\n\
 otherwise, wait for an event.  Returns a four-part list:\n\
-  ((X-POS Y-POS) WINDOW SCREEN-PART KEYSEQ TIMESTAMP).\n\
-Normally X-POS and Y-POS are the position of the click on the screen\n\
+  ((X-POS Y-POS) WINDOW FRAME-PART KEYSEQ TIMESTAMP).\n\
+Normally X-POS and Y-POS are the position of the click on the frame\n\
  (measured in characters and lines), and WINDOW is the window clicked in.\n\
 KEYSEQ is a string, the key sequence to be looked up in the mouse maps.\n\
-If SCREEN-PART is non-nil, the event was on a scrollbar;\n\
-then Y-POS is really the total length of the scrollbar, while X-POS is\n\
-the relative position of the scrollbar's value within that total length,\n\
+If FRAME-PART is non-nil, the event was on a scroll bar;\n\
+then Y-POS is really the total length of the scroll bar, while X-POS is\n\
+the relative position of the scroll bar's value within that total length,\n\
 and a third element OFFSET appears in that list: the height of the thumb-up\n\
 area at the top of the scroll bar.\n\
-SCREEN-PART is one of the following symbols:\n\
- `vertical-scrollbar', `vertical-thumbup', `vertical-thumbdown',\n\
- `horizontal-scrollbar', `horizontal-thumbleft', `horizontal-thumbright'.\n\
+FRAME-PART is one of the following symbols:\n\
+ `vertical-scroll-bar', `vertical-thumbup', `vertical-thumbdown',\n\
+ `horizontal-scroll-bar', `horizontal-thumbleft', `horizontal-thumbright'.\n\
 TIMESTAMP is the lower 23 bits of the X-server's timestamp for\n\
 the mouse event.")
   (arg)
@@ -3765,7 +3214,7 @@ the mouse event.")
   register Lisp_Object tempy;
   Lisp_Object part, pos, timestamp;
   int prefix;
-  struct screen *s;
+  struct frame *f;
   
   int tem;
   
@@ -3785,26 +3234,26 @@ the mouse event.")
              com_letter = encode_mouse_button (xrep);
              mouse_timestamp = xrep.MouseTime;
 
-             if ((s = x_window_to_screen (xrep.MouseWindow)) != 0)
+             if ((f = x_window_to_frame (xrep.MouseWindow)) != 0)
                {
-                 Lisp_Object screen;
+                 Lisp_Object frame;
                  
-                 if (s->display.x->icon_desc == xrep.MouseWindow)
+                 if (f->display.x->icon_desc == xrep.MouseWindow)
                    {
-                     x_make_screen_visible (s);
+                     x_make_frame_visible (f);
                      continue;
                    }
 
                  XSET (tempx, Lisp_Int,
-                       min (s->width-1, max (0, (xrep.MouseX - s->display.x->internal_border_width)/FONT_WIDTH (s->display.x->font))));
+                       min (f->width-1, max (0, (xrep.MouseX - f->display.x->internal_border_width)/FONT_WIDTH (f->display.x->font))));
                  XSET (tempy, Lisp_Int,
-                       min (s->height-1, max (0, (xrep.MouseY - s->display.x->internal_border_width)/FONT_HEIGHT (s->display.x->font))));
+                       min (f->height-1, max (0, (xrep.MouseY - f->display.x->internal_border_width)/FONT_HEIGHT (f->display.x->font))));
                  XSET (timestamp, Lisp_Int, (xrep.MouseTime & 0x7fffff));
-                 XSET (screen, Lisp_Screen, s);
+                 XSET (frame, Lisp_Frame, f);
                  
                  pos = Fcons (tempx, Fcons (tempy, Qnil));
                  Vmouse_window
-                   = Flocate_window_from_coordinates (screen, pos);
+                   = Flocate_window_from_coordinates (frame, pos);
                  
                  Vmouse_event
                    = Fcons (pos,
@@ -3814,7 +3263,7 @@ the mouse event.")
                                                  Fcons (timestamp, Qnil)))));
                  return Vmouse_event;
                }
-             else if ((s = x_window_to_scrollbar (xrep.MouseWindow, &part, &prefix)) != 0)
+             else if ((f = x_window_to_scroll_bar (xrep.MouseWindow, &part, &prefix)) != 0)
                {
                  int pos, len;
                  Lisp_Object keyseq;
@@ -3823,17 +3272,17 @@ the mouse event.")
                  keyseq = concat2 (Fchar_to_string (make_number (prefix)),
                                    Fchar_to_string (make_number (com_letter)));
                  
-                 pos = xrep.MouseY - (s->display.x->v_scrollbar_width - 2);
+                 pos = xrep.MouseY - (f->display.x->v_scroll_bar_width - 2);
                  XSET (tempx, 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)));
+                 len = ((FONT_HEIGHT (f->display.x->font) * f->height)
+                        + f->display.x->internal_border_width
+                        - (2 * (f->display.x->v_scroll_bar_width - 2)));
                  XSET (tempy, Lisp_Int, len);
                  XSET (timestamp, Lisp_Int, (xrep.MouseTime & 0x7fffff));
-                 Vmouse_window = s->selected_window;
+                 Vmouse_window = f->selected_window;
                  Vmouse_event
                    = Fcons (Fcons (tempx, Fcons (tempy, 
-                                                 Fcons (make_number (s->display.x->v_scrollbar_width - 2),
+                                                 Fcons (make_number (f->display.x->v_scroll_bar_width - 2),
                                                         Qnil))),
                             Fcons (Vmouse_window,
                                    Fcons (intern (part),
@@ -3848,25 +3297,25 @@ the mouse event.")
            case MotionNotify:
 
              com_letter = x11_encode_mouse_button (xrep);
-             if ((s = x_window_to_screen (xrep.MouseWindow)) != 0)
+             if ((f = x_window_to_frame (xrep.MouseWindow)) != 0)
                {
-                 Lisp_Object screen;
+                 Lisp_Object frame;
                  
                  XSET (tempx, Lisp_Int,
-                       min (s->width-1,
-                            max (0, (xrep.MouseX - s->display.x->internal_border_width)
-                                 / FONT_WIDTH (s->display.x->font))));
+                       min (f->width-1,
+                            max (0, (xrep.MouseX - f->display.x->internal_border_width)
+                                 / FONT_WIDTH (f->display.x->font))));
                  XSET (tempy, Lisp_Int,
-                       min (s->height-1,
-                            max (0, (xrep.MouseY - s->display.x->internal_border_width)
-                                 / FONT_HEIGHT (s->display.x->font))));
+                       min (f->height-1,
+                            max (0, (xrep.MouseY - f->display.x->internal_border_width)
+                                 / FONT_HEIGHT (f->display.x->font))));
                                  
-                 XSET (screen, Lisp_Screen, s);
+                 XSET (frame, Lisp_Frame, f);
                  XSET (timestamp, Lisp_Int, (xrep.MouseTime & 0x7fffff));
                  
                  pos = Fcons (tempx, Fcons (tempy, Qnil));
                  Vmouse_window
-                   = Flocate_window_from_coordinates (screen, pos);
+                   = Flocate_window_from_coordinates (frame, pos);
                  
                  Vmouse_event
                    = Fcons (pos,
@@ -3881,10 +3330,10 @@ the mouse event.")
 #endif /* HAVE_X11 */
 
            default:
-             if (s = x_window_to_screen (xrep.MouseWindow))
-               Vmouse_window = s->selected_window;
-             else if (s = x_window_to_scrollbar (xrep.MouseWindow, &part, &prefix))
-               Vmouse_window = s->selected_window;
+             if (f = x_window_to_frame (xrep.MouseWindow))
+               Vmouse_window = f->selected_window;
+             else if (f = x_window_to_scroll_bar (xrep.MouseWindow, &part, &prefix))
+               Vmouse_window = f->selected_window;
              return Vmouse_event = Qnil;
            }
        }
@@ -3909,8 +3358,8 @@ DEFUN ("x-store-cut-buffer", Fx_store_cut_buffer, Sx_store_cut_buffer,
   int mask;
 
   CHECK_STRING (string, 1);
-  if (SCREEN_IS_X (selected_screen))
-    error ("Selected screen does not understand X protocol.");
+  if (! FRAME_X_P (selected_frame))
+    error ("Selected frame does not understand X protocol.");
 
   BLOCK_INPUT;
   XStoreBytes ((char *) XSTRING (string)->data, XSTRING (string)->size);
@@ -4117,7 +3566,13 @@ select_visual (screen, depth)
   int n_visuals;
 
   v = DefaultVisualOfScreen (screen);
+
+#ifdef HAVE_X11R4
   vinfo_template.visualid = XVisualIDFromVisual (v);
+#else
+  vinfo_template.visualid = x->visualid;
+#endif
+
   vinfo = XGetVisualInfo (x_current_display, VisualIDMask, &vinfo_template,
                          &n_visuals);
   if (n_visuals != 1)
@@ -4176,14 +3631,14 @@ arg XRM_STRING is a string of resources in xrdb format.")
 
   x_screen = DefaultScreenOfDisplay (x_current_display);
 
-  x_screen_count = make_number (ScreenCount (x_current_display));
+  x_screen_count = ScreenCount (x_current_display);
   Vx_vendor = build_string (ServerVendor (x_current_display));
-  x_release = make_number (VendorRelease (x_current_display));
+  x_release = VendorRelease (x_current_display);
                     
-  x_screen_height = make_number (HeightOfScreen (x_screen));
-  x_screen_height_mm = make_number (HeightMMOfScreen (x_screen));
-  x_screen_width = make_number (WidthOfScreen (x_screen));
-  x_screen_width_mm = make_number (WidthMMOfScreen (x_screen));
+  x_screen_height = HeightOfScreen (x_screen);
+  x_screen_height_mm = HeightMMOfScreen (x_screen);
+  x_screen_width = WidthOfScreen (x_screen);
+  x_screen_width_mm = WidthMMOfScreen (x_screen);
 
   switch (DoesBackingStore (x_screen))
     {
@@ -4205,12 +3660,12 @@ arg XRM_STRING is a string of resources in xrdb format.")
     }
 
   if (DoesSaveUnders (x_screen) == True)
-    x_save_under = Qt;
+    x_save_under = 1;
   else
-    x_save_under = Qnil;
+    x_save_under = 0;
 
   screen_visual = select_visual (x_screen, &n_planes);
-  x_screen_planes = make_number (n_planes);
+  x_screen_planes = n_planes;
   Vx_screen_visual = intern (x_visual_strings [screen_visual->class]);
 
   /* X Atoms used by emacs. */
@@ -4241,6 +3696,20 @@ arg XRM_STRING is a string of resources in xrdb format.")
                                        False);
   Xatom_text =             XInternAtom (x_current_display, "TEXT",
                                        False);
+  Xatom_wm_protocols =     XInternAtom (x_current_display, "WM_PROTOCOLS",
+                                       False);
+  Xatom_wm_take_focus =    XInternAtom (x_current_display, "WM_TAKE_FOCUS",
+                                       False);
+  Xatom_wm_save_yourself = XInternAtom (x_current_display, "WM_SAVE_YOURSELF",
+                                       False);
+  Xatom_wm_delete_window = XInternAtom (x_current_display, "WM_DELETE_WINDOW",
+                                       False);
+  Xatom_wm_change_state =  XInternAtom (x_current_display, "WM_CHANGE_STATE",
+                                       False);
+  Xatom_wm_configure_denied =  XInternAtom (x_current_display,
+                                           "WM_CONFIGURE_DENIED", False);
+  Xatom_wm_window_moved =  XInternAtom (x_current_display, "WM_MOVED",
+                                       False);
   UNBLOCK_INPUT;
 #else /* not HAVE_X11 */
   XFASTINT (Vwindow_system_version) = 10;
@@ -4286,30 +3755,80 @@ easier.")
 \f
 syms_of_xfns ()
 {
-  init_x_parm_symbols ();
-
   /* This is zero if not using X windows.  */
   x_current_display = 0;
 
+  /* The section below is built by the lisp expression at the top of the file,
+     just above where these variables are declared.  */
+  /*&&& init symbols here &&&*/
+  Qauto_raise = intern ("auto-raise");
+  staticpro (&Qauto_raise);
+  Qauto_lower = intern ("auto-lower");
+  staticpro (&Qauto_lower);
+  Qbackground_color = intern ("background-color");
+  staticpro (&Qbackground_color);
+  Qbar = intern ("bar");
+  staticpro (&Qbar);
+  Qborder_color = intern ("border-color");
+  staticpro (&Qborder_color);
+  Qborder_width = intern ("border-width");
+  staticpro (&Qborder_width);
+  Qbox = intern ("box");
+  staticpro (&Qbox);
+  Qcursor_color = intern ("cursor-color");
+  staticpro (&Qcursor_color);
+  Qcursor_type = intern ("cursor-type");
+  staticpro (&Qcursor_type);
+  Qfont = intern ("font");
+  staticpro (&Qfont);
+  Qforeground_color = intern ("foreground-color");
+  staticpro (&Qforeground_color);
+  Qgeometry = intern ("geometry");
+  staticpro (&Qgeometry);
+  Qicon_left = intern ("icon-left");
+  staticpro (&Qicon_left);
+  Qicon_top = intern ("icon-top");
+  staticpro (&Qicon_top);
+  Qicon_type = intern ("icon-type");
+  staticpro (&Qicon_type);
+  Qiconic_startup = intern ("iconic-startup");
+  staticpro (&Qiconic_startup);
+  Qinternal_border_width = intern ("internal-border-width");
+  staticpro (&Qinternal_border_width);
+  Qleft = intern ("left");
+  staticpro (&Qleft);
+  Qmouse_color = intern ("mouse-color");
+  staticpro (&Qmouse_color);
+  Qnone = intern ("none");
+  staticpro (&Qnone);
+  Qparent_id = intern ("parent-id");
+  staticpro (&Qparent_id);
+  Qsuppress_icon = intern ("suppress-icon");
+  staticpro (&Qsuppress_icon);
+  Qsuppress_initial_map = intern ("suppress-initial-map");
+  staticpro (&Qsuppress_initial_map);
+  Qtop = intern ("top");
+  staticpro (&Qtop);
   Qundefined_color = intern ("undefined-color");
+  staticpro (&Qundefined_color);
+  Qvertical_scroll_bars = intern ("vertical-scroll-bars");
+  staticpro (&Qvertical_scroll_bars);
+  Qwindow_id = intern ("window-id");
+  staticpro (&Qwindow_id);
+  Qx_frame_parameter = intern ("x-frame-parameter");
+  staticpro (&Qx_frame_parameter);
+  /* This is the end of symbol initialization.  */
+
   Fput (Qundefined_color, Qerror_conditions,
        Fcons (Qundefined_color, Fcons (Qerror, Qnil)));
   Fput (Qundefined_color, Qerror_message,
        build_string ("Undefined color"));
 
-  screen_class = make_pure_string (SCREEN_CLASS, sizeof (SCREEN_CLASS)-1);
-
-  DEFVAR_INT ("mouse-x-position", &x_mouse_x,
-             "The X coordinate of the mouse position, in characters.");
-  x_mouse_x = Qnil;
-
-  DEFVAR_INT ("mouse-y-position", &x_mouse_y,
-             "The Y coordinate of the mouse position, in characters.");
-  x_mouse_y = Qnil;
+  init_x_parm_symbols ();
 
   DEFVAR_INT ("mouse-buffer-offset", &mouse_buffer_offset,
              "The buffer offset of the character under the pointer.");
-  mouse_buffer_offset = Qnil;
+  mouse_buffer_offset = 0;
 
   DEFVAR_INT ("x-pointer-shape", &Vx_pointer_shape,
              "The shape of the pointer when over text.");
@@ -4320,13 +3839,9 @@ syms_of_xfns ()
   Vx_nontext_pointer_shape = Qnil;
 
   DEFVAR_INT ("x-mode-pointer-shape", &Vx_mode_pointer_shape,
-             "The shape of the pointer when not over text.");
+             "The shape of the pointer when over the mode line.");
   Vx_mode_pointer_shape = Qnil;
 
-  DEFVAR_LISP ("x-bar-cursor", &Vbar_cursor,
-              "*If non-nil, use a vertical bar cursor.  Otherwise, use the traditional box.");
-  Vbar_cursor = Qnil;
-
   DEFVAR_LISP ("x-cursor-fore-pixel", &Vx_cursor_fore_pixel,
               "A string indicating the foreground color of the cursor box.");
   Vx_cursor_fore_pixel = Qnil;
@@ -4363,12 +3878,12 @@ Values can be the symbols Always, WhenMapped, or NotUseful.");
 
 #ifdef HAVE_X11
   defsubr (&Sx_get_resource);
-  defsubr (&Sx_pixel_width);
-  defsubr (&Sx_pixel_height);
+#if 0
   defsubr (&Sx_draw_rectangle);
   defsubr (&Sx_erase_rectangle);
   defsubr (&Sx_contour_region);
   defsubr (&Sx_uncontour_region);
+#endif
   defsubr (&Sx_color_display_p);
   defsubr (&Sx_defined_color);
 #if 0
@@ -4383,10 +3898,12 @@ Values can be the symbols Always, WhenMapped, or NotUseful.");
   defsubr (&Sx_set_face);
 #endif
   defsubr (&Sx_geometry);
-  defsubr (&Sx_create_screen);
-  defsubr (&Sfocus_screen);
-  defsubr (&Sunfocus_screen);
+  defsubr (&Sx_create_frame);
+  defsubr (&Sfocus_frame);
+  defsubr (&Sunfocus_frame);
+#if 0
   defsubr (&Sx_horizontal_line);
+#endif
   defsubr (&Sx_rebind_key);
   defsubr (&Sx_rebind_keys);
   defsubr (&Sx_open_connection);