(U-000239D1): Add `<-formed' for U+51F6.
[chise/xemacs-chise.git.1] / src / frame.c
index dbbaf63..5ab9b6d 100644 (file)
@@ -116,10 +116,14 @@ Lisp_Object Vframe_being_created;
 Lisp_Object Qframe_being_created;
 
 static void store_minibuf_frame_prop (struct frame *f, Lisp_Object val);
 Lisp_Object Qframe_being_created;
 
 static void store_minibuf_frame_prop (struct frame *f, Lisp_Object val);
+static void frame_conversion_internal (struct frame *f, int pixel_to_char,
+                                      int *pixel_width, int *pixel_height,
+                                      int *char_width, int *char_height,
+                                      int real_face);
 static struct display_line title_string_display_line;
 /* Used by generate_title_string. Global because they get used so much that
    the dynamic allocation time adds up. */
 static struct display_line title_string_display_line;
 /* Used by generate_title_string. Global because they get used so much that
    the dynamic allocation time adds up. */
-static Emchar_dynarr *title_string_emchar_dynarr;
+static Charc_dynarr *title_string_charc_dynarr;
 
 \f
 static Lisp_Object
 
 \f
 static Lisp_Object
@@ -775,7 +779,7 @@ selected_frame (void)
 /* use this instead of XFRAME (DEVICE_SELECTED_FRAME (d)) to catch
    the possibility of there being no frames on the device (just created).
    There is no point doing this inside of redisplay because errors
 /* use this instead of XFRAME (DEVICE_SELECTED_FRAME (d)) to catch
    the possibility of there being no frames on the device (just created).
    There is no point doing this inside of redisplay because errors
-   cause an abort(), indicating a flaw in the logic, and error_check_frame()
+   cause an ABORT(), indicating a flaw in the logic, and error_check_frame()
    will catch this just as well. */
 
 struct frame *
    will catch this just as well. */
 
 struct frame *
@@ -925,7 +929,7 @@ set_frame_selected_window (struct frame *f, Lisp_Object window)
 }
 
 DEFUN ("set-frame-selected-window", Fset_frame_selected_window, 2, 2, 0, /*
 }
 
 DEFUN ("set-frame-selected-window", Fset_frame_selected_window, 2, 2, 0, /*
-Set the selected window of frame object FRAME to WINDOW.
+Set the selected window of FRAME to WINDOW.
 If FRAME is nil, the selected frame is used.
 If FRAME is the selected frame, this makes WINDOW the selected window.
 */
 If FRAME is nil, the selected frame is used.
 If FRAME is the selected frame, this makes WINDOW the selected window.
 */
@@ -972,7 +976,7 @@ is_surrogate_for_selected_frame (struct frame *f)
 }
 
 static int
 }
 
 static int
-frame_matches_frametype (Lisp_Object frame, Lisp_Object type)
+frame_matches_frame_spec (Lisp_Object frame, Lisp_Object type)
 {
   struct frame *f = XFRAME (frame);
 
 {
   struct frame *f = XFRAME (frame);
 
@@ -1033,25 +1037,25 @@ frame_matches_frametype (Lisp_Object frame, Lisp_Object type)
 }
 
 int
 }
 
 int
-device_matches_console_spec (Lisp_Object device, Lisp_Object console)
+device_matches_device_spec (Lisp_Object device, Lisp_Object device_spec)
 {
 {
-  if (EQ (console, Qwindow_system))
+  if (EQ (device_spec, Qwindow_system))
     return DEVICE_WIN_P (XDEVICE (device));
     return DEVICE_WIN_P (XDEVICE (device));
-  if (DEVICEP (console))
-    return EQ (device, console);
-  if (CONSOLEP (console))
-    return EQ (DEVICE_CONSOLE (XDEVICE (device)), console);
-  if (valid_console_type_p (console))
-    return EQ (DEVICE_TYPE (XDEVICE (device)), console);
+  if (DEVICEP (device_spec))
+    return EQ (device, device_spec);
+  if (CONSOLEP (device_spec))
+    return EQ (DEVICE_CONSOLE (XDEVICE (device)), device_spec);
+  if (valid_console_type_p (device_spec))
+    return EQ (DEVICE_TYPE (XDEVICE (device)), device_spec);
   return 1;
 }
 
 /* Return the next frame in the frame list after FRAME.
   return 1;
 }
 
 /* Return the next frame in the frame list after FRAME.
-   FRAMETYPE and CONSOLE control which frames and devices
+   WHICH-FRAMES and WHICH-DEVICES control which frames and devices
    are considered; see `next-frame'. */
 
 Lisp_Object
    are considered; see `next-frame'. */
 
 Lisp_Object
-next_frame (Lisp_Object frame, Lisp_Object frametype, Lisp_Object console)
+next_frame (Lisp_Object frame, Lisp_Object which_frames, Lisp_Object which_devices)
 {
   Lisp_Object first = Qnil;
   Lisp_Object devcons, concons;
 {
   Lisp_Object first = Qnil;
   Lisp_Object devcons, concons;
@@ -1064,7 +1068,7 @@ next_frame (Lisp_Object frame, Lisp_Object frametype, Lisp_Object console)
       Lisp_Object device = XCAR (devcons);
       Lisp_Object frmcons;
 
       Lisp_Object device = XCAR (devcons);
       Lisp_Object frmcons;
 
-      if (!device_matches_console_spec (device, console))
+      if (!device_matches_device_spec (device, which_devices))
        {
          if (EQ (device, FRAME_DEVICE (XFRAME (frame))))
            passed = 1;
        {
          if (EQ (device, FRAME_DEVICE (XFRAME (frame))))
            passed = 1;
@@ -1077,7 +1081,7 @@ next_frame (Lisp_Object frame, Lisp_Object frametype, Lisp_Object console)
 
          if (passed)
            {
 
          if (passed)
            {
-             if (frame_matches_frametype (f, frametype))
+             if (frame_matches_frame_spec (f, which_frames))
                return f;
            }
          else
                return f;
            }
          else
@@ -1088,7 +1092,7 @@ next_frame (Lisp_Object frame, Lisp_Object frametype, Lisp_Object console)
                }
              else
                {
                }
              else
                {
-                 if (NILP (first) && frame_matches_frametype (f, frametype))
+                 if (NILP (first) && frame_matches_frame_spec (f, which_frames))
                    first = f;
                }
            }
                    first = f;
                }
            }
@@ -1107,11 +1111,11 @@ next_frame (Lisp_Object frame, Lisp_Object frametype, Lisp_Object console)
 }
 
 /* Return the previous frame in the frame list before FRAME.
 }
 
 /* Return the previous frame in the frame list before FRAME.
-   FRAMETYPE and CONSOLE control which frames and devices
+   WHICH-FRAMES and WHICH-DEVICES control which frames and devices
    are considered; see `next-frame'. */
 
 Lisp_Object
    are considered; see `next-frame'. */
 
 Lisp_Object
-previous_frame (Lisp_Object frame, Lisp_Object frametype, Lisp_Object console)
+previous_frame (Lisp_Object frame, Lisp_Object which_frames, Lisp_Object which_devices)
 {
   Lisp_Object devcons, concons;
   Lisp_Object last = Qnil;
 {
   Lisp_Object devcons, concons;
   Lisp_Object last = Qnil;
@@ -1123,7 +1127,7 @@ previous_frame (Lisp_Object frame, Lisp_Object frametype, Lisp_Object console)
       Lisp_Object device = XCAR (devcons);
       Lisp_Object frmcons;
 
       Lisp_Object device = XCAR (devcons);
       Lisp_Object frmcons;
 
-      if (!device_matches_console_spec (device, console))
+      if (!device_matches_device_spec (device, which_devices))
        {
          if (EQ (device, FRAME_DEVICE (XFRAME (frame)))
              && !NILP (last))
        {
          if (EQ (device, FRAME_DEVICE (XFRAME (frame)))
              && !NILP (last))
@@ -1142,7 +1146,7 @@ previous_frame (Lisp_Object frame, Lisp_Object frametype, Lisp_Object console)
            }
          else
            {
            }
          else
            {
-             if (frame_matches_frametype (f, frametype))
+             if (frame_matches_frame_spec (f, which_frames))
                last = f;
            }
        }
                last = f;
            }
        }
@@ -1161,13 +1165,13 @@ previous_frame (Lisp_Object frame, Lisp_Object frametype, Lisp_Object console)
 
 DEFUN ("next-frame", Fnext_frame, 0, 3, 0, /*
 Return the next frame of the right type in the frame list after FRAME.
 
 DEFUN ("next-frame", Fnext_frame, 0, 3, 0, /*
 Return the next frame of the right type in the frame list after FRAME.
-FRAMETYPE controls which frames are eligible to be returned; all
+WHICH-FRAMES controls which frames are eligible to be returned; all
 others will be skipped.  Note that if there is only one eligible
 frame, then `next-frame' called repeatedly will always return
 the same frame, and if there is no eligible frame, then FRAME is
 returned.
 
 others will be skipped.  Note that if there is only one eligible
 frame, then `next-frame' called repeatedly will always return
 the same frame, and if there is no eligible frame, then FRAME is
 returned.
 
-Possible values for FRAMETYPE are
+Possible values for WHICH-FRAMES are
 
 'visible                Consider only frames that are visible.
 'iconic                         Consider only frames that are iconic.
 
 'visible                Consider only frames that are visible.
 'iconic                         Consider only frames that are iconic.
@@ -1185,43 +1189,44 @@ Possible values for FRAMETYPE are
                         frames.
 any other value                 Consider all frames.
 
                         frames.
 any other value                 Consider all frames.
 
-If FRAMETYPE is omitted, 'nomini is used.  A FRAMETYPE of 0 (a number)
-is treated like 'iconic, for backwards compatibility.
+If WHICH-FRAMES is omitted, 'nomini is used.  A value for WHICH-FRAMES
+of 0 (a number) is treated like 'iconic, for backwards compatibility.
 
 
-If FRAMETYPE is a window, include only its own frame and any frame now
-using that window as the minibuffer.
+If WHICH-FRAMES is a window, include only its own frame and any frame
+now using that window as the minibuffer.
 
 
-Optional third argument CONSOLE controls which consoles or devices the
-returned frame may be on.  If CONSOLE is a console, return frames only
-on that console.  If CONSOLE is a device, return frames only on that
-device.  If CONSOLE is a console type, return frames only on consoles
-of that type.  If CONSOLE is 'window-system, return any frames on any
-window-system consoles.  If CONSOLE is nil or omitted, return frames only
-on the FRAME's console.  Otherwise, all frames are considered.
+The optional third argument WHICH-DEVICES further clarifies on which
+devices to search for frames as specified by WHICH-FRAMES.
+If nil or omitted, search all devices on FRAME's console.
+If a device, only search that device.
+If a console, search all devices on that console.
+If a device type, search all devices of that type.
+If `window-system', search all window-system devices.
+Any other non-nil value means search all devices.
 */
 */
-       (frame, frametype, console))
+       (frame, which_frames, which_devices))
 {
   XSETFRAME (frame, decode_frame (frame));
 
 {
   XSETFRAME (frame, decode_frame (frame));
 
-  return next_frame (frame, frametype, console);
+  return next_frame (frame, which_frames, which_devices);
 }
 
 DEFUN ("previous-frame", Fprevious_frame, 0, 3, 0, /*
 Return the next frame of the right type in the frame list after FRAME.
 }
 
 DEFUN ("previous-frame", Fprevious_frame, 0, 3, 0, /*
 Return the next frame of the right type in the frame list after FRAME.
-FRAMETYPE controls which frames are eligible to be returned; all
+WHICH-FRAMES controls which frames are eligible to be returned; all
 others will be skipped.  Note that if there is only one eligible
 frame, then `previous-frame' called repeatedly will always return
 the same frame, and if there is no eligible frame, then FRAME is
 returned.
 
 others will be skipped.  Note that if there is only one eligible
 frame, then `previous-frame' called repeatedly will always return
 the same frame, and if there is no eligible frame, then FRAME is
 returned.
 
-See `next-frame' for an explanation of the FRAMETYPE and CONSOLE
+See `next-frame' for an explanation of the WHICH-FRAMES and WHICH-DEVICES
 arguments.
 */
 arguments.
 */
-       (frame, frametype, console))
+       (frame, which_frames, which_devices))
 {
   XSETFRAME (frame, decode_frame (frame));
 
 {
   XSETFRAME (frame, decode_frame (frame));
 
-  return previous_frame (frame, frametype, console);
+  return previous_frame (frame, which_frames, which_devices);
 }
 
 /* Return any frame for which PREDICATE is non-zero, or return Qnil
 }
 
 /* Return any frame for which PREDICATE is non-zero, or return Qnil
@@ -1303,9 +1308,8 @@ delete_frame_internal (struct frame *f, int force,
   console = DEVICE_CONSOLE (d);
   con = XCONSOLE (console);
 
   console = DEVICE_CONSOLE (d);
   con = XCONSOLE (console);
 
-  if (!called_from_delete_device &&
-      !(MAYBE_INT_DEVMETH (d, device_implementation_flags, ())
-       & XDEVIMPF_FRAMELESS_OK))
+  if (!called_from_delete_device
+      && !DEVICE_IMPL_FLAG (d, XDEVIMPF_FRAMELESS_OK))
     {
       /* If we're deleting the only non-minibuffer frame on the
         device, delete the device. */
     {
       /* If we're deleting the only non-minibuffer frame on the
         device, delete the device. */
@@ -1629,7 +1633,7 @@ delete_frame_internal (struct frame *f, int force,
             that is prohibited at the top; you can't delete surrogate
             minibuffer frames.  */
          if (NILP (frame_with_minibuf))
             that is prohibited at the top; you can't delete surrogate
             minibuffer frames.  */
          if (NILP (frame_with_minibuf))
-           abort ();
+           ABORT ();
 
          con->default_minibuffer_frame = frame_with_minibuf;
        }
 
          con->default_minibuffer_frame = frame_with_minibuf;
        }
@@ -1703,7 +1707,7 @@ mouse_pixel_position_1 (struct device *d, Lisp_Object *frame,
       break;
 
     default:
       break;
 
     default:
-      abort (); /* method is incorrectly written */
+      ABORT (); /* method is incorrectly written */
     }
 
   return 0;
     }
 
   return 0;
@@ -1961,7 +1965,7 @@ Return non NIL if FRAME is now "visible" (actually in use for display).
 A frame that is not visible is not updated, and, if it works through a
 window system, may not show at all.
 N.B. Under X "visible" means Mapped. It the window is mapped but not
 A frame that is not visible is not updated, and, if it works through a
 window system, may not show at all.
 N.B. Under X "visible" means Mapped. It the window is mapped but not
-actually visible on screen then frame_visible returns 'hidden.
+actually visible on screen then `frame-visible-p' returns 'hidden.
 */
        (frame))
 {
 */
        (frame))
 {
@@ -2000,8 +2004,8 @@ frame is iconified, it will not be visible.
 DEFUN ("visible-frame-list", Fvisible_frame_list, 0, 1, 0, /*
 Return a list of all frames now "visible" (being updated).
 If DEVICE is specified only frames on that device will be returned.
 DEFUN ("visible-frame-list", Fvisible_frame_list, 0, 1, 0, /*
 Return a list of all frames now "visible" (being updated).
 If DEVICE is specified only frames on that device will be returned.
-Note that under virtual window managers not all these frame are necessarily
-really updated.
+Note that under virtual window managers not all these frames are
+necessarily really updated.
 */
        (device))
 {
 */
        (device))
 {
@@ -2405,6 +2409,7 @@ recognized for particular types of frames.
 
 DEFUN ("frame-property", Fframe_property, 2, 3, 0, /*
 Return FRAME's value for property PROPERTY.
 
 DEFUN ("frame-property", Fframe_property, 2, 3, 0, /*
 Return FRAME's value for property PROPERTY.
+Return DEFAULT if there is no such property.
 See `set-frame-properties' for the built-in property names.
 */
        (frame, property, default_))
 See `set-frame-properties' for the built-in property names.
 */
        (frame, property, default_))
@@ -2600,21 +2605,21 @@ Specify that the frame FRAME has LINES lines.
 Optional third arg non-nil means that redisplay should use LINES lines
 but that the idea of the actual height of the frame should not be changed.
 */
 Optional third arg non-nil means that redisplay should use LINES lines
 but that the idea of the actual height of the frame should not be changed.
 */
-       (frame, rows, pretend))
+       (frame, lines, pretend))
 {
   struct frame *f = decode_frame (frame);
   int height, width;
   XSETFRAME (frame, f);
 {
   struct frame *f = decode_frame (frame);
   int height, width;
   XSETFRAME (frame, f);
-  CHECK_INT (rows);
+  CHECK_INT (lines);
 
   if (window_system_pixelated_geometry (frame))
     {
 
   if (window_system_pixelated_geometry (frame))
     {
-      char_to_real_pixel_size (f, 0, XINT (rows), 0, &height);
+      char_to_real_pixel_size (f, 0, XINT (lines), 0, &height);
       width = FRAME_PIXWIDTH (f);
     }
   else
     {
       width = FRAME_PIXWIDTH (f);
     }
   else
     {
-      height = XINT (rows);
+      height = XINT (lines);
       width = FRAME_WIDTH (f);
     }
 
       width = FRAME_WIDTH (f);
     }
 
@@ -2622,6 +2627,37 @@ but that the idea of the actual height of the frame should not be changed.
   return frame;
 }
 
   return frame;
 }
 
+DEFUN ("set-frame-pixel-height", Fset_frame_pixel_height, 2, 3, 0, /*
+Specify that the frame FRAME is HEIGHT pixels tall.
+Optional third arg non-nil means that redisplay should be HEIGHT pixels tall
+but that the idea of the actual height of the frame should not be changed.
+*/
+       (frame, height, pretend))
+{
+  struct frame *f = decode_frame (frame);
+  int pheight, width;
+  XSETFRAME (frame, f);
+  CHECK_INT (height);
+
+  if (!window_system_pixelated_geometry (frame)) 
+    {
+      int h = XINT (height);
+      width = FRAME_WIDTH (f);
+      /* Simply using pixel_to_real_char_size here is not good
+        enough since we end up with a total frame size of HEIGHT
+        rather than a displayable height of HEIGHT. */
+      frame_conversion_internal (f, 2, 0, &h, 0, &pheight, 0);
+    }
+  else 
+    {
+      width = FRAME_PIXWIDTH (f);
+      pheight = XINT (height);
+    }
+
+  internal_set_frame_size (f, width, pheight, !NILP (pretend));
+  return frame;
+}
+
 DEFUN ("set-frame-width", Fset_frame_width, 2, 3, 0, /*
 Specify that the frame FRAME has COLS columns.
 Optional third arg non-nil means that redisplay should use COLS columns
 DEFUN ("set-frame-width", Fset_frame_width, 2, 3, 0, /*
 Specify that the frame FRAME has COLS columns.
 Optional third arg non-nil means that redisplay should use COLS columns
@@ -2649,8 +2685,39 @@ but that the idea of the actual width of the frame should not be changed.
   return frame;
 }
 
   return frame;
 }
 
+DEFUN ("set-frame-pixel-width", Fset_frame_pixel_width, 2, 3, 0, /*
+Specify that the frame FRAME is WIDTH pixels wide.
+Optional third arg non-nil means that redisplay should be WIDTH wide
+but that the idea of the actual height of the frame should not be changed.
+*/
+       (frame, width, pretend))
+{
+  struct frame *f = decode_frame (frame);
+  int height, pwidth;
+  XSETFRAME (frame, f);
+  CHECK_INT (width);
+
+  if (!window_system_pixelated_geometry (frame))
+    {
+      int w = XINT (width);
+      height = FRAME_HEIGHT (f);
+      /* Simply using pixel_to_real_char_size here is not good
+        enough since we end up with a total frame size of WIDTH
+        rather than a displayable height of WIDTH. */
+      frame_conversion_internal (f, 2, &w, 0, &pwidth, 0, 0);
+    }
+  else
+    {
+      height = FRAME_PIXHEIGHT (f);
+      pwidth = XINT (width);
+    }
+
+  internal_set_frame_size (f, pwidth, height, !NILP (pretend));
+  return frame;
+}
+
 DEFUN ("set-frame-size", Fset_frame_size, 3, 4, 0, /*
 DEFUN ("set-frame-size", Fset_frame_size, 3, 4, 0, /*
-Set the size of FRAME to COLS by ROWS.
+Set the size of FRAME to COLS by ROWS, measured in characters.
 Optional fourth arg non-nil means that redisplay should use COLS by ROWS
 but that the idea of the actual size of the frame should not be changed.
 */
 Optional fourth arg non-nil means that redisplay should use COLS by ROWS
 but that the idea of the actual size of the frame should not be changed.
 */
@@ -2674,6 +2741,38 @@ but that the idea of the actual size of the frame should not be changed.
   return frame;
 }
 
   return frame;
 }
 
+DEFUN ("set-frame-pixel-size", Fset_frame_pixel_size, 3, 4, 0, /*
+Set the size of FRAME to WIDTH by HEIGHT, measured in pixels.
+Optional fourth arg non-nil means that redisplay should use WIDTH by HEIGHT
+but that the idea of the actual size of the frame should not be changed.
+*/
+       (frame, width, height, pretend))
+{
+  struct frame *f = decode_frame (frame);
+  int pheight, pwidth;
+  XSETFRAME (frame, f);
+  CHECK_INT (width);
+  CHECK_INT (height);
+
+  if (!window_system_pixelated_geometry (frame)) 
+    {
+      int w = XINT (width);
+      int h = XINT (height);
+      /* Simply using pixel_to_real_char_size here is not good enough
+        since we end up with a total frame size of WIDTH x HEIGHT
+        rather than a displayable height of WIDTH x HEIGHT. */
+      frame_conversion_internal (f, 2, &w, &h, &pwidth, &pheight, 0);
+    }
+  else
+    {
+      pheight = XINT (height);
+      pwidth = XINT (width);
+    }
+
+  internal_set_frame_size (f, pwidth, pheight, !NILP (pretend));
+  return frame;
+}
+
 DEFUN ("set-frame-position", Fset_frame_position, 3, 3, 0, /*
 Set position of FRAME in pixels to XOFFSET by YOFFSET.
 This is actually the position of the upper left corner of the frame.
 DEFUN ("set-frame-position", Fset_frame_position, 3, 3, 0, /*
 Set position of FRAME in pixels to XOFFSET by YOFFSET.
 This is actually the position of the upper left corner of the frame.
@@ -2730,7 +2829,21 @@ frame_conversion_internal (struct frame *f, int pixel_to_char,
     2 * FRAME_THEORETICAL_TOP_TOOLBAR_BORDER_WIDTH (f) +
     2 * FRAME_THEORETICAL_BOTTOM_TOOLBAR_BORDER_WIDTH (f);
 
     2 * FRAME_THEORETICAL_TOP_TOOLBAR_BORDER_WIDTH (f) +
     2 * FRAME_THEORETICAL_BOTTOM_TOOLBAR_BORDER_WIDTH (f);
 
-  if (pixel_to_char)
+  /* Convert to chars so that the displayable area is pixel_width x
+     pixel_height.
+
+     #### Consider rounding up to 0.5 characters to avoid adding too
+     much space. */
+  if (pixel_to_char > 1)
+    {
+      if (char_width)
+       *char_width = ROUND_UP (*pixel_width, cpw) / cpw;
+      if (char_height)
+       *char_height = ROUND_UP (*pixel_height, cph) / cph;
+    }
+  /* Convert to chars so that the total frame size is pixel_width x
+     pixel_height. */
+  else if (pixel_to_char)
     {
       if (char_width)
        *char_width = 1 + ((*pixel_width - egw) - bdr - obw) / cpw;
     {
       if (char_width)
        *char_width = 1 + ((*pixel_width - egw) - bdr - obw) / cpw;
@@ -2838,7 +2951,7 @@ change_frame_size_1 (struct frame *f, int newheight, int newwidth)
      `left' coordinates to be recomputed even though no frame size
      change occurs. --kyle */
   if (in_display)
      `left' coordinates to be recomputed even though no frame size
      change occurs. --kyle */
   if (in_display)
-    abort ();
+    ABORT ();
 
   XSETFRAME (frame, f);
 
 
   XSETFRAME (frame, f);
 
@@ -3005,9 +3118,15 @@ change_frame_size (struct frame *f, int newheight, int newwidth, int delay)
      So deal. */
   check_frame_size (f, &newheight, &newwidth);
 
      So deal. */
   check_frame_size (f, &newheight, &newwidth);
 
+  /* Unconditionally mark that the frame has changed size. This is
+     because many things need to know after the
+     fact. f->size_change_pending will get reset below. The most that
+     can happen is that we will cycle through redisplay once more
+     --andy. */
+  MARK_FRAME_SIZE_CHANGED (f);
+
   if (delay || in_display || gc_in_progress)
     {
   if (delay || in_display || gc_in_progress)
     {
-      MARK_FRAME_SIZE_CHANGED (f);
       f->new_width = newwidth;
       f->new_height = newheight;
       return;
       f->new_width = newwidth;
       f->new_height = newheight;
       return;
@@ -3044,19 +3163,19 @@ generate_title_string (struct window *w, Lisp_Object format_str,
   generate_formatted_string_db (format_str, Qnil, w, dl, db, findex, 0,
                                 -1, type);
 
   generate_formatted_string_db (format_str, Qnil, w, dl, db, findex, 0,
                                 -1, type);
 
-  Dynarr_reset (title_string_emchar_dynarr);
+  Dynarr_reset (title_string_charc_dynarr);
   while (elt < Dynarr_length (db->runes))
     {
       if (Dynarr_atp (db->runes, elt)->type == RUNE_CHAR)
   while (elt < Dynarr_length (db->runes))
     {
       if (Dynarr_atp (db->runes, elt)->type == RUNE_CHAR)
-       Dynarr_add (title_string_emchar_dynarr,
-                   Dynarr_atp (db->runes, elt)->object.chr.ch);
+       Dynarr_add (title_string_charc_dynarr,
+                   Dynarr_atp (db->runes, elt)->object.cglyph);
       elt++;
     }
 
   return
       elt++;
     }
 
   return
-    convert_emchar_string_into_malloced_string
-    (Dynarr_atp (title_string_emchar_dynarr, 0),
-     Dynarr_length (title_string_emchar_dynarr), 0);
+    convert_charc_string_into_malloced_string
+    (Dynarr_atp (title_string_charc_dynarr, 0),
+     Dynarr_length (title_string_charc_dynarr), 0);
 }
 
 void
 }
 
 void
@@ -3167,7 +3286,7 @@ init_frame (void)
   if (!initialized)
 #endif
     {
   if (!initialized)
 #endif
     {
-      title_string_emchar_dynarr = Dynarr_new (Emchar);
+      title_string_charc_dynarr = Dynarr_new (Charc);
       xzero (title_string_display_line);
     }
 }
       xzero (title_string_display_line);
     }
 }
@@ -3286,6 +3405,9 @@ syms_of_frame (void)
   DEFSUBR (Fset_frame_height);
   DEFSUBR (Fset_frame_width);
   DEFSUBR (Fset_frame_size);
   DEFSUBR (Fset_frame_height);
   DEFSUBR (Fset_frame_width);
   DEFSUBR (Fset_frame_size);
+  DEFSUBR (Fset_frame_pixel_height);
+  DEFSUBR (Fset_frame_pixel_width);
+  DEFSUBR (Fset_frame_pixel_size);
   DEFSUBR (Fset_frame_position);
   DEFSUBR (Fset_frame_pointer);
   DEFSUBR (Fprint_job_page_number);
   DEFSUBR (Fset_frame_position);
   DEFSUBR (Fset_frame_pointer);
   DEFSUBR (Fprint_job_page_number);