Subject: Re: bug#16013: 24.3.50; Rows in height is interpreted as pixels.

From: martin rudalics <[email-masked]>
Date: Sat, 30 Nov 2013 16:00:24 +0100

> Can't do this from -Q, but with a minimal .emacs:
 >
 > (custom-set-variables
 >  '(default-frame-alist (quote ((height . 50))))
 > )
 >
 > start emacs and it won't be 50 rows, but 50 pixels.

Bad luck.  Please try the attached, pretty unripe patch.

Thanks, martin
=== modified file 'src/gtkutil.c'
--- src/gtkutil.c	2013-11-30 09:25:31 +0000
+++ src/gtkutil.c	2013-11-30 14:44:13 +0000
@@ -938,27 +938,30 @@
    COLUMNS/ROWS is the size the edit area shall have after the resize.  */

 void
-xg_frame_set_char_size (struct frame *f, int width, int height)
+xg_frame_set_char_size (struct frame *f, int width, int height, bool pixelwise)
 {
-  int pixelwidth;
-  int pixelheight = FRAME_TEXT_TO_PIXEL_HEIGHT (f, height);
+  int pixelwidth = pixelwise ? width : 0;
+  int pixelheight = pixelwise ? height : FRAME_TEXT_TO_PIXEL_HEIGHT (f, height);

   if (FRAME_PIXEL_HEIGHT (f) == 0)
     return;

-  /* Take into account the size of the scroll bar.  Always use the
-     number of columns occupied by the scroll bar here otherwise we
-     might end up with a frame width that is not a multiple of the
-     frame's character width which is bad for vertically split
-     windows.  */
-  f->scroll_bar_actual_width
-    = FRAME_SCROLL_BAR_COLS (f) * FRAME_COLUMN_WIDTH (f);
-
-  compute_fringe_widths (f, 0);
-
-  /* FRAME_TEXT_COLS_TO_PIXEL_WIDTH uses scroll_bar_actual_width, so call it
-     after calculating that value.  */
-  pixelwidth = FRAME_TEXT_TO_PIXEL_WIDTH (f, width);
+  if (! pixelwise)
+    {
+      /* Take into account the size of the scroll bar.  Always use the
+	 number of columns occupied by the scroll bar here otherwise we
+	 might end up with a frame width that is not a multiple of the
+	 frame's character width which is bad for vertically split
+	 windows.  */
+      f->scroll_bar_actual_width
+	= FRAME_SCROLL_BAR_COLS (f) * FRAME_COLUMN_WIDTH (f);
+
+      compute_fringe_widths (f, 0);
+
+      /* FRAME_TEXT_COLS_TO_PIXEL_WIDTH uses scroll_bar_actual_width, so call it
+	 after calculating that value.  */
+      pixelwidth = FRAME_TEXT_TO_PIXEL_WIDTH (f, width);
+    }

   /* Do this before resize, as we don't know yet if we will be resized.  */
   xg_clear_under_internal_border (f);
@@ -988,7 +991,7 @@
     }
   else
     {
-      change_frame_size (f, width, height, 0, 1, 0, 1);
+      change_frame_size (f, pixelwidth, pixelheight, 0, 1, 0, 1);
       FRAME_PIXEL_WIDTH (f) = pixelwidth;
       FRAME_PIXEL_HEIGHT (f) = pixelheight;
      }
@@ -1095,7 +1098,7 @@
               && FRAME_X_DISPLAY (f) == dpy)
             {
               x_set_scroll_bar_default_width (f);
-              xg_frame_set_char_size (f, FRAME_COLS (f), FRAME_LINES (f));
+              xg_frame_set_char_size (f, FRAME_COLS (f), FRAME_LINES (f), 0);
             }
         }
     }

=== modified file 'src/gtkutil.h'
--- src/gtkutil.h	2013-09-17 07:06:42 +0000
+++ src/gtkutil.h	2013-11-30 14:43:32 +0000
@@ -139,7 +139,7 @@
 extern void xg_frame_resized (struct frame *f,
                               int pixelwidth,
                               int pixelheight);
-extern void xg_frame_set_char_size (struct frame *f, int cols, int rows);
+extern void xg_frame_set_char_size (struct frame *f, int cols, int rows, bool pixelwise);
 extern GtkWidget * xg_win_to_widget (Display *dpy, Window wdesc);

 extern void xg_display_open (char *display_name, Display **dpy);

=== modified file 'src/xterm.c'
--- src/xterm.c	2013-11-30 09:25:31 +0000
+++ src/xterm.c	2013-11-30 14:42:43 +0000
@@ -8743,8 +8743,12 @@
 void
 x_set_window_size (struct frame *f, int change_gravity, int width, int height, bool pixelwise)
 {
+  int pixelwidth, pixelheight;
+
   block_input ();

+  check_frame_size (f, &width, &height, pixelwise);
+
   if (NILP (tip_frame) || XFRAME (tip_frame) != f)
     {
       int r, c, text_width, text_height;
@@ -8773,14 +8777,25 @@
       change_frame_size (f, text_width, text_height, 0, 1, 0, 1);
     }

+  if (pixelwise)
+    {
+      pixelwidth = FRAME_TEXT_TO_PIXEL_WIDTH (f, width);
+      pixelheight = FRAME_TEXT_TO_PIXEL_HEIGHT (f, height);
+    }
+  else
+    {
+      pixelwidth = FRAME_TEXT_COLS_TO_PIXEL_WIDTH (f, width);
+      pixelheight = FRAME_TEXT_LINES_TO_PIXEL_HEIGHT (f, height);
+    }
+
 #ifdef USE_GTK
   if (FRAME_GTK_WIDGET (f))
-    xg_frame_set_char_size (f, width, height);
+    xg_frame_set_char_size (f, pixelwidth, pixelheight, 1);
   else
-    x_set_window_size_1 (f, change_gravity, width, height, pixelwise);
+    x_set_window_size_1 (f, change_gravity, pixelwidth, pixelheight, 1);
 #else /* not USE_GTK */

-  x_set_window_size_1 (f, change_gravity, width, height, pixelwise);
+  x_set_window_size_1 (f, change_gravity, pixelwidth, pixelheight, 1);

 #endif /* not USE_GTK */