update.
[chise/xemacs-chise.git.1] / src / frame.c
index c98d0c3..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);
+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 Emchar_dynarr *title_string_emchar_dynarr;
+static Charc_dynarr *title_string_charc_dynarr;
 
 \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
-   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 *
@@ -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))
-           abort ();
+           ABORT ();
 
          con->default_minibuffer_frame = frame_with_minibuf;
        }
@@ -1703,7 +1707,7 @@ mouse_pixel_position_1 (struct device *d, Lisp_Object *frame,
       break;
 
     default:
-      abort (); /* method is incorrectly written */
+      ABORT (); /* method is incorrectly written */
     }
 
   return 0;
@@ -2623,6 +2627,37 @@ but that the idea of the actual height of the frame should not be changed.
   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
@@ -2650,6 +2685,37 @@ but that the idea of the actual width of the frame should not be changed.
   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, /*
 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
@@ -2675,6 +2741,38 @@ but that the idea of the actual size of the frame should not be changed.
   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.
@@ -2731,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);
 
-  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;
@@ -2839,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)
-    abort ();
+    ABORT ();
 
   XSETFRAME (frame, f);
 
@@ -3051,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);
 
-  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)
-       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
-    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
@@ -3174,7 +3286,7 @@ init_frame (void)
   if (!initialized)
 #endif
     {
-      title_string_emchar_dynarr = Dynarr_new (Emchar);
+      title_string_charc_dynarr = Dynarr_new (Charc);
       xzero (title_string_display_line);
     }
 }
@@ -3293,6 +3405,9 @@ syms_of_frame (void)
   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);