]> git.eshelyaron.com Git - emacs.git/commitdiff
Some more fixes for pixelwise resizing.
authorMartin Rudalics <rudalics@gmx.at>
Fri, 20 Dec 2013 10:48:36 +0000 (11:48 +0100)
committerMartin Rudalics <rudalics@gmx.at>
Fri, 20 Dec 2013 10:48:36 +0000 (11:48 +0100)
Remove scroll_bar_actual_width from frames.
* frame.h (struct frame): Remove scroll_bar_actual_width slot.
* frame.c (Fscroll_bar_width): Return scroll bar area width.
(x_figure_window_size):
* nsterm.m (x_set_window_size):
* widget.c (set_frame_size):
* w32term.c (x_set_window_size):
* xterm.c (x_set_window_size, x_set_window_size_1): Don't set
scroll_bar_actual_width.

Convert scroll_bar members to integers on Windows.
* w32term.h (struct scroll_bar): Convert top, left, width,
height, start, end and dragging to integers.
* w32fns.c (w32_createscrollbar): Remove XINT conversions for
scroll_bar members.
* w32term.c (w32_set_scroll_bar_thumb)
(w32_scroll_bar_handle_click): Remove XINT conversions for
scroll_bar members.  Treat bar->dragging as integer.
(x_scroll_bar_create): Call ALLOCATE_PSEUDOVECTOR with "top" as
first element.  Remove XINT conversions for scroll_bar members.
(w32_set_vertical_scroll_bar, x_scroll_bar_report_motion):
Remove XINT conversions for scroll_bar members.

Fix assignment for new window total sizes.
* window.c (Fwindow_resize_apply_total): Assign values for
minibuffer window.
* window.el (window--pixel-to-size): Remove function.
(window--pixel-to-total-1, window--pixel-to-total): Fix
calculation of new total sizes.

13 files changed:
lisp/ChangeLog
lisp/window.el
src/ChangeLog
src/dispnew.c
src/frame.c
src/frame.h
src/nsterm.m
src/w32fns.c
src/w32term.c
src/w32term.h
src/widget.c
src/window.c
src/xterm.c

index 2e0db47df473488b7bb2853f5e5177e472f3a3a2..00e0864a5fd456e28ca018ac962d5a3093bedc59 100644 (file)
@@ -1,3 +1,10 @@
+2013-12-20  Martin Rudalics  <rudalics@gmx.at>
+
+       Fix assignment for new window total sizes.
+       * window.el (window--pixel-to-size): Remove function.
+       (window--pixel-to-total-1, window--pixel-to-total): Fix
+       calculation of new total sizes.
+
 2013-12-20  Vitalie Spinu  <spinuvit@gmail.com>
 
        * comint.el (comint-output-filter): Fix rear-nonsticky property
index ffc129307286b0894974fa49ffb86acf2e52822d..3b841747205fb6061d1681082feca0ae0cd097c1 100644 (file)
@@ -2079,30 +2079,16 @@ WINDOW's frame if the option `window-resize-pixelwise' is nil."
          size)
       (* size char-size))))
 
-(defun window--pixel-to-size (window size &optional horizontal round-up)
-  "For WINDOW convert SIZE pixels to lines.
-WINDOW must be a valid window and defaults to the selected one.
-Optional argument HORIZONTAL non-nil means convert SIZE pixels to
-columns.  Optional argument ROUND-UP means to round up the return
-value."
-  (let ((char-size (frame-char-size
-                   (window-normalize-window window) horizontal)))
-    (if round-up
-       (/ (+ size char-size -1) char-size)
-      (/ size char-size))))
-
 (defun window--pixel-to-total-1 (window horizontal char-size)
   "Subroutine of `window--pixel-to-total'."
   (let ((child (window-child window)))
     (if (window-combination-p window horizontal)
        ;; In an iso-combination distribute sizes proportionally.
        (let ((remainder (window-new-total window))
-             size best-child best-size)
+             size best-child rem best-rem)
          ;; Initialize total sizes to each child's floor.
          (while child
-           (setq size (window--pixel-to-size
-                       child (window-size child horizontal t)
-                       horizontal))
+           (setq size (max (/ (window-size child horizontal t) char-size) 1))
            (set-window-new-total child size)
            (setq remainder (- remainder size))
            (setq child (window-next-sibling child)))
@@ -2110,15 +2096,15 @@ value."
          (while (> remainder 0)
            (setq child (window-last-child window))
            (setq best-child nil)
-           (setq best-size 0)
-           ;; We want those auxiliary fields in the window structure to
-           ;; avoid this.
+           (setq best-rem 0)
            (while child
-             (setq size (- (/ (window-size child horizontal t) char-size)
-                           (window-new-total child)))
-             (when (> size best-size)
-               (setq best-child child)
-               (setq best-size size))
+             (when (and (<= (window-new-total child)
+                            (/ (window-size child horizontal t) char-size))
+                        (> (setq rem (% (window-size child horizontal t)
+                                        char-size))
+                           best-rem))
+                  (setq best-child child)
+                  (setq best-rem rem))
              (setq child (window-prev-sibling child)))
            ;; We MUST have a best-child here.
            (set-window-new-total best-child 1 t)
@@ -2142,14 +2128,39 @@ FRAME must be a live frame and defaults to the selected frame.
 Optional argument HORIZONTAL non-nil means assign new total
 window widths from pixel widths."
   (setq frame (window-normalize-frame frame))
-  (let ((root (frame-root-window))
-       (char-size (frame-char-size frame horizontal)))
-    (set-window-new-total
-     root (window--pixel-to-size
-          root (window-size root horizontal t) horizontal))
+  (let* ((char-size (frame-char-size frame horizontal))
+        (root (frame-root-window))
+        (root-size (window-size root horizontal t))
+        ;; We have to care about the minibuffer window only if it
+        ;; appears together with the root window on this frame.
+        (mini (let ((mini (minibuffer-window frame)))
+                (and (eq (window-frame mini) frame)
+                     (not (eq mini root)) mini)))
+        (mini-size (and mini (window-size mini horizontal t))))
+    ;; We round the line/column sizes of windows here to the nearest
+    ;; integer.  In some cases this can make windows appear _larger_
+    ;; than the containing frame (line/column-wise) because the latter's
+    ;; sizes are not (yet) rounded.  We might eventually fix that.
+    (if (and mini (not horizontal))
+       (let (lines)
+         (set-window-new-total root (max (/ root-size char-size) 1))
+         (set-window-new-total mini (max (/ mini-size char-size) 1))
+         (setq lines (- (round (+ root-size mini-size) char-size)
+                        (+ (window-new-total root) (window-new-total mini))))
+         (while (> lines 0)
+           (if (>= (% root-size (window-new-total root))
+                   (% mini-size (window-new-total mini)))
+               (set-window-new-total root 1 t)
+             (set-window-new-total mini 1 t))
+           (setq lines (1- lines))))
+      (set-window-new-total root (round root-size char-size))
+      (when mini
+       ;; This is taken in the horizontal case only.
+       (set-window-new-total mini (round mini-size char-size))))
     (unless (window-buffer root)
-      (window--pixel-to-total-1 root horizontal char-size)))
-  (window-resize-apply-total frame horizontal))
+      (window--pixel-to-total-1 root horizontal char-size))
+    ;; Apply the new sizes.
+    (window-resize-apply-total frame horizontal)))
 
 (defun window--resize-reset (&optional frame horizontal)
   "Reset resize values for all windows on FRAME.
index 23857e33a6d41f8eb90f886ffdb628c6d2286e35..dbb77ae1646829194d05b67a422a12d4401d3eff 100644 (file)
@@ -1,3 +1,32 @@
+2013-12-20  Martin Rudalics  <rudalics@gmx.at>
+
+       Remove scroll_bar_actual_width from frames.
+       * frame.h (struct frame): Remove scroll_bar_actual_width slot.
+       * frame.c (Fscroll_bar_width): Return scroll bar area width.
+       (x_figure_window_size):
+       * nsterm.m (x_set_window_size):
+       * widget.c (set_frame_size):
+       * w32term.c (x_set_window_size):
+       * xterm.c (x_set_window_size, x_set_window_size_1): Don't set
+       scroll_bar_actual_width.
+
+       Convert scroll_bar members to integers on Windows.
+       * w32term.h (struct scroll_bar): Convert top, left, width,
+       height, start, end and dragging to integers.
+       * w32fns.c (w32_createscrollbar): Remove XINT conversions for
+       scroll_bar members.
+       * w32term.c (w32_set_scroll_bar_thumb)
+       (w32_scroll_bar_handle_click): Remove XINT conversions for
+       scroll_bar members.  Treat bar->dragging as integer.
+       (x_scroll_bar_create): Call ALLOCATE_PSEUDOVECTOR with "top" as
+       first element.  Remove XINT conversions for scroll_bar members.
+       (w32_set_vertical_scroll_bar, x_scroll_bar_report_motion):
+       Remove XINT conversions for scroll_bar members.
+
+       Fix assignment for new window total sizes.
+       * window.c (Fwindow_resize_apply_total): Assign values for
+       minibuffer window.
+
 2013-12-20  Chong Yidong  <cyd@gnu.org>
 
        * textprop.c (Fadd_face_text_property): Doc fix.  Rename `appendp'
index 967fffe469b4f47c8e00cb41bf5918dc2ea3ce11..cbf1963feca0d1c14a61f449e90dc9d6501c6508 100644 (file)
@@ -5488,6 +5488,8 @@ change_frame_size_1 (struct frame *f, int new_width, int new_height,
     {
       new_text_width = (new_width == 0) ? FRAME_TEXT_WIDTH (f) : new_width;
       new_text_height = (new_height == 0) ? FRAME_TEXT_HEIGHT (f) : new_height;
+      /* Consider rounding here: Currently, the root window can be
+        larger than the frame in terms of columns/lines.  */
       new_cols = new_text_width / FRAME_COLUMN_WIDTH (f);
       new_lines = new_text_height / FRAME_LINE_HEIGHT (f);
     }
@@ -5507,7 +5509,6 @@ change_frame_size_1 (struct frame *f, int new_width, int new_height,
      fringe columns.  Do this after rounding - see discussion of
      bug#9723.  */
   new_root_width = (new_text_width
-                   /* PXM: Use the configured scrollbar width !??  */
                    + FRAME_SCROLL_BAR_AREA_WIDTH (f)
                    + FRAME_TOTAL_FRINGE_WIDTH (f));
   /* If we're not changing the frame size, quit now.  */
index 7699f24fbb1c60fed835f7ab495da58fd4c37d79..25e0f2727ca0e3b8224d4d8916f6dbd41de32ade 100644 (file)
@@ -2515,7 +2515,7 @@ DEFUN ("frame-scroll-bar-width", Fscroll_bar_width, Sscroll_bar_width, 0, 1, 0,
        doc: /* Return scroll bar width of FRAME in pixels.  */)
   (Lisp_Object frame)
 {
-  return make_number (decode_any_frame (frame)->scroll_bar_actual_width);
+  return make_number (FRAME_SCROLL_BAR_AREA_WIDTH (decode_any_frame (frame)));
 }
 
 DEFUN ("frame-fringe-width", Ffringe_width, Sfringe_width, 0, 1, 0,
@@ -4237,8 +4237,6 @@ x_figure_window_size (struct frame *f, Lisp_Object parms, bool toolbar_p)
        window_prompting |= PSize;
     }
 
-  f->scroll_bar_actual_width
-    = FRAME_SCROLL_BAR_COLS (f) * FRAME_COLUMN_WIDTH (f);
 
   /* This used to be done _before_ calling x_figure_window_size, but
      since the height is reset here, this was really a no-op.  I
index f9b368fb5ecc390b38dcf67c692ea71bdb01c480..d7bbbd0686bf29e7c5f7c468c86533a2e4e718db 100644 (file)
@@ -436,10 +436,6 @@ struct frame
   int config_scroll_bar_width;
   int config_scroll_bar_cols;
 
-  /* The size of the extra width currently allotted for vertical
-     scroll bars in this frame, in pixels.  */
-  int scroll_bar_actual_width;
-
   /* The baud rate that was used to calculate costs for this frame.  */
   int cost_calculation_baud_rate;
 
index 8047bca1f60b62b31bd908fa93eb2be3ea9607b6..10780b054d93351252869e950d80bc14834bf6ca 100644 (file)
@@ -1289,7 +1289,6 @@ x_set_window_size (struct frame *f,
 
   check_frame_size (f, &width, &height, pixelwise);
 
-  f->scroll_bar_actual_width = NS_SCROLL_BAR_WIDTH (f);
   compute_fringe_widths (f, 0);
 
   if (pixelwise)
index 73197c6a8f2777cfdf41e3306232903b0fdde213..59526936afe0e6306810716a7e682144d83acad8 100644 (file)
@@ -1912,8 +1912,7 @@ w32_createscrollbar (struct frame *f, struct scroll_bar * bar)
 {
   return CreateWindow ("SCROLLBAR", "", SBS_VERT | WS_CHILD | WS_VISIBLE,
                       /* Position and size of scroll bar.  */
-                      XINT (bar->left), XINT (bar->top),
-                      XINT (bar->width), XINT (bar->height),
+                      bar->left, bar->top, bar->width, bar->height,
                       FRAME_W32_WINDOW (f), NULL, hinst, NULL);
 }
 
index a66aca1e84648463edf974205a48693091c2cbc7..a39ab37768cd4af5d8de6808286c25cbbc219c1b 100644 (file)
@@ -3451,9 +3451,7 @@ w32_mouse_position (struct frame **fp, int insist, Lisp_Object *bar_window,
               = x_window_to_scroll_bar (WindowFromPoint (pt));
 
            if (bar)
-             {
-               f1 = XFRAME (WINDOW_FRAME (XWINDOW (bar->window)));
-             }
+             f1 = XFRAME (WINDOW_FRAME (XWINDOW (bar->window)));
          }
 
        if (f1 == 0 && insist > 0)
@@ -3560,10 +3558,10 @@ w32_set_scroll_bar_thumb (struct scroll_bar *bar,
   /* We use the whole scroll-bar height in the calculations below, to
      avoid strange effects like scrolling backwards when just clicking
      on the handle (without moving it).  */
-  double range = VERTICAL_SCROLL_BAR_TOP_RANGE (f, XINT (bar->height))
+  double range = VERTICAL_SCROLL_BAR_TOP_RANGE (f, bar->height)
                  + VERTICAL_SCROLL_BAR_MIN_HANDLE;
   int sb_page, sb_pos;
-  BOOL draggingp = !NILP (bar->dragging) ? TRUE : FALSE;
+  BOOL draggingp = bar->dragging ? TRUE : FALSE;
   SCROLLINFO si;
 
   /* We used to change the nPage setting while dragging the handle,
@@ -3708,19 +3706,19 @@ x_scroll_bar_create (struct window *w, int top, int left, int width, int height)
   HWND hwnd;
   SCROLLINFO si;
   struct scroll_bar *bar
-    = ALLOCATE_PSEUDOVECTOR (struct scroll_bar, fringe_extended_p, PVEC_OTHER);
+    = ALLOCATE_PSEUDOVECTOR (struct scroll_bar, top, PVEC_OTHER);
   Lisp_Object barobj;
 
   block_input ();
 
   XSETWINDOW (bar->window, w);
-  XSETINT (bar->top, top);
-  XSETINT (bar->left, left);
-  XSETINT (bar->width, width);
-  XSETINT (bar->height, height);
-  XSETINT (bar->start, 0);
-  XSETINT (bar->end, 0);
-  bar->dragging = Qnil;
+  bar->top = top;
+  bar->left = left;
+  bar->width = width;
+  bar->height = height;
+  bar->start = 0;
+  bar->end = 0;
+  bar->dragging = 0;
   bar->fringe_extended_p = 0;
 
   /* Requires geometry to be set before call to create the real window */
@@ -3838,10 +3836,10 @@ w32_set_vertical_scroll_bar (struct window *w,
       hwnd = SCROLL_BAR_W32_WINDOW (bar);
 
       /* If already correctly positioned, do nothing.  */
-      if (XINT (bar->left) == sb_left
-         && XINT (bar->top) == top
-         && XINT (bar->width) == sb_width
-         && XINT (bar->height) == height
+      if (bar->left == sb_left
+         && bar->top == top
+         && bar->width == sb_width
+         && bar->height == height
          && bar->fringe_extended_p == fringe_extended_p)
         {
           /* Redraw after clear_frame. */
@@ -3883,10 +3881,10 @@ w32_set_vertical_scroll_bar (struct window *w,
           /* InvalidateRect (w, NULL, FALSE);  */
 
           /* Remember new settings.  */
-          XSETINT (bar->left, sb_left);
-          XSETINT (bar->top, top);
-          XSETINT (bar->width, sb_width);
-          XSETINT (bar->height, height);
+          bar->left = sb_left;
+          bar->top = top;
+          bar->width = sb_width;
+          bar->height = height;
 
           unblock_input ();
         }
@@ -4026,9 +4024,9 @@ w32_scroll_bar_handle_click (struct scroll_bar *bar, W32Msg *msg,
   emacs_event->timestamp = msg->msg.time;
 
   {
-    int top_range = VERTICAL_SCROLL_BAR_TOP_RANGE (f, XINT (bar->height));
+    int top_range = VERTICAL_SCROLL_BAR_TOP_RANGE (f, bar->height);
     int y;
-    int dragging = !NILP (bar->dragging);
+    int dragging = bar->dragging;
     SCROLLINFO si;
 
     si.cbSize = sizeof (si);
@@ -4037,7 +4035,7 @@ w32_scroll_bar_handle_click (struct scroll_bar *bar, W32Msg *msg,
     GetScrollInfo ((HWND) msg->msg.lParam, SB_CTL, &si);
     y = si.nPos;
 
-    bar->dragging = Qnil;
+    bar->dragging = 0;
     FRAME_DISPLAY_INFO (f)->last_mouse_scroll_bar_pos = msg->msg.wParam;
 
     switch (LOWORD (msg->msg.wParam))
@@ -4064,9 +4062,9 @@ w32_scroll_bar_handle_click (struct scroll_bar *bar, W32Msg *msg,
        break;
       case SB_THUMBTRACK:
       case SB_THUMBPOSITION:
-       if (VERTICAL_SCROLL_BAR_TOP_RANGE (f, XINT (bar->height)) <= 0xffff)
+       if (VERTICAL_SCROLL_BAR_TOP_RANGE (f, bar->height) <= 0xffff)
           y = HIWORD (msg->msg.wParam);
-       bar->dragging = Qt;
+       bar->dragging = 1; /* ??????? */
        emacs_event->part = scroll_bar_handle;
 
        /* "Silently" update current position.  */
@@ -4090,8 +4088,8 @@ w32_scroll_bar_handle_click (struct scroll_bar *bar, W32Msg *msg,
        if (dragging)
          {
            SCROLLINFO si;
-           int start = XINT (bar->start);
-           int end = XINT (bar->end);
+           int start = bar->start;
+           int end = bar->end;
 
            si.cbSize = sizeof (si);
            si.fMask = SIF_PAGE | SIF_POS;
@@ -4126,7 +4124,7 @@ x_scroll_bar_report_motion (struct frame **fp, Lisp_Object *bar_window,
   Window w = SCROLL_BAR_W32_WINDOW (bar);
   struct frame *f = XFRAME (WINDOW_FRAME (XWINDOW (bar->window)));
   int pos;
-  int top_range = VERTICAL_SCROLL_BAR_TOP_RANGE (f, XINT (bar->height));
+  int top_range = VERTICAL_SCROLL_BAR_TOP_RANGE (f, bar->height);
   SCROLLINFO si;
 
   block_input ();
@@ -4146,7 +4144,7 @@ x_scroll_bar_report_motion (struct frame **fp, Lisp_Object *bar_window,
   case SB_THUMBPOSITION:
   case SB_THUMBTRACK:
       *part = scroll_bar_handle;
-      if (VERTICAL_SCROLL_BAR_TOP_RANGE (f, XINT (bar->height)) <= 0xffff)
+      if (VERTICAL_SCROLL_BAR_TOP_RANGE (f, bar->height) <= 0xffff)
        pos = HIWORD (dpyinfo->last_mouse_scroll_bar_pos);
       break;
   case SB_LINEDOWN:
@@ -5710,8 +5708,6 @@ x_set_window_size (struct frame *f, int change_gravity, int width, int height, b
   block_input ();
 
   check_frame_size (f, &width, &height, pixelwise);
-  f->scroll_bar_actual_width
-    = FRAME_SCROLL_BAR_COLS (f) * FRAME_COLUMN_WIDTH (f);
 
   compute_fringe_widths (f, 0);
 
index 89008b7348c5b14771e4d7161978592c86042bcf..b8a1823d7b02f38b7c095923c557eb0aa3e7fef4 100644 (file)
@@ -429,7 +429,7 @@ struct scroll_bar {
 
   /* The position and size of the scroll bar in pixels, relative to the
      frame.  */
-  Lisp_Object top, left, width, height;
+  int top, left, width, height;
 
   /* The starting and ending positions of the handle, relative to the
      handle area (i.e. zero is the top position, not
@@ -442,13 +442,13 @@ struct scroll_bar {
      drawing handle bottoms VERTICAL_SCROLL_BAR_MIN_HANDLE pixels below
      where they would be normally; the bottom and top are in a
      different co-ordinate system.  */
-  Lisp_Object start, end;
+  int start, end;
 
   /* If the scroll bar handle is currently being dragged by the user,
      this is the number of pixels from the top of the handle to the
      place where the user grabbed it.  If the handle isn't currently
      being dragged, this is Qnil.  */
-  Lisp_Object dragging;
+  int dragging;
 
   /* 1 if the background of the fringe that is adjacent to a scroll
      bar is extended to the gap between the fringe and the bar.  */
index 89b43fdae76f456fd2d7fcbcddfa095a26e562f5..73c5149e2cdd1b385c6db9a02173fa0fe7ac0165 100644 (file)
@@ -404,8 +404,6 @@ set_frame_size (EmacsFrame ew)
        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);
 
index 9bf6ad4b8f3cc6415b86e6deb81c8a39fd4b3b8b..e0c44ad344b223248ffccd924d2bea5448317dd8 100644 (file)
@@ -4001,6 +4001,20 @@ values.  */)
   r->left_col = 0;
   r->top_line = FRAME_TOP_MARGIN (f);
   window_resize_apply_total (r, !NILP (horizontal));
+  /* Handle the mini window.  */
+  if (FRAME_HAS_MINIBUF_P (f) && !FRAME_MINIBUF_ONLY_P (f))
+    {
+      struct window *m = XWINDOW (f->minibuffer_window);
+
+      if (NILP (horizontal))
+       {
+         m->top_line = r->top_line + r->total_lines;
+         m->total_lines = XFASTINT (m->new_total);
+       }
+      else
+       m->total_cols = XFASTINT (m->new_total);
+    }
+
   unblock_input ();
 
   return Qt;
index 20157acca2ed0632ff7415a6a6e204b1ece60215..f634feb21f9d619b048bec8d9ec43eb78f961325 100644 (file)
@@ -8537,10 +8537,6 @@ x_set_window_size_1 (struct frame *f, int change_gravity, int width, int height,
   int pixelwidth, pixelheight;
 
   check_frame_size (f, &width, &height, pixelwise);
-  f->scroll_bar_actual_width
-    = (!FRAME_HAS_VERTICAL_SCROLL_BARS (f)
-       ? 0
-       : FRAME_CONFIG_SCROLL_BAR_COLS (f) * FRAME_COLUMN_WIDTH (f));
 
   compute_fringe_widths (f, 0);
 
@@ -8623,10 +8619,7 @@ x_set_window_size (struct frame *f, int change_gravity, int width, int height, b
 #endif
       text_width = FRAME_PIXEL_TO_TEXT_WIDTH (f, FRAME_PIXEL_WIDTH (f));
       text_height = FRAME_PIXEL_TO_TEXT_HEIGHT (f, pixelh);
-      /* Update f->scroll_bar_actual_width because it is used in
-         FRAME_PIXEL_WIDTH_TO_TEXT_COLS.  */
-      f->scroll_bar_actual_width
-        = FRAME_SCROLL_BAR_COLS (f) * FRAME_COLUMN_WIDTH (f);
+
       change_frame_size (f, text_width, text_height, 0, 1, 0, 1);
     }