diff options
author | Martin Rudalics <rudalics@gmx.at> | 2021-04-27 09:53:42 +0200 |
---|---|---|
committer | Martin Rudalics <rudalics@gmx.at> | 2021-04-27 09:53:42 +0200 |
commit | a190b4cfd8b6f42a91678ac7292e1cceccd168e7 (patch) | |
tree | a9e0d6af2a038ba3d506218c2866255c90818f46 /lisp | |
parent | 40a1e94f4c0cbe6633bc7ed42b006271c4e4b114 (diff) | |
download | emacs-a190b4cfd8b6f42a91678ac7292e1cceccd168e7.tar.gz emacs-a190b4cfd8b6f42a91678ac7292e1cceccd168e7.tar.bz2 emacs-a190b4cfd8b6f42a91678ac7292e1cceccd168e7.zip |
Major rewrite of adjust_frame_size
Have adjust_frame_size pass native frame sizes to backends
instead of text sizes. Expand frame size history management.
Drop PIXELWISE argument from change_frame_size and convert
native to text sizes only when calling adjust_frame_size. Use
convention in arguments that -1 instead of 0 means that no size
change is required. When adjusting frame sizes pick up delayed
size changes (Bug#46827).
* lisp/frame.el (frame-notice-user-settings, make-frame): Don't
set frame size history.
(frame--size-history): Rewrite doc-string. Handle new formats
of `frame-size-history' entries.
* src/dispextern.h (delayed_size_change): Extern it.
(change_frame_size): Drop last argument from extern.
* src/dispnew.c (delayed_size_change): Make it global.
(handle_window_change_signal): Reformat. Drop last argument
from change_frame_size call.
(do_pending_window_change, init_display_interactive): Drop last
argument from change_frame_size call.
(change_frame_size_1): NEW_WIDTH and NEW_HEIGHT now specify
native sizes. Drop last argument PIXELWISE. Queue a change
when it either differs from F's current pixel sizes or F's
previously queued sizes. Inject frame_size_history_extra call
when queuing. Adopt convention that for queued sizes -1 means
that no size change is required. Convert from native to text
sizes when calling adjust_frame_size.
(change_frame_size): Drop last argument PIXELWISE and drop it
also in change_frame_size_1 calls.
* src/frame.c (frame_size_history_add): Remove.
(frame_inhibit_resize): Remove call to frame_size_history_add.
(set_menu_bar_lines, set_tab_bar_lines): Simplify. Drop last
argument from change_frame_size call.
(frame_windows_min_size): No more static.
(keep_ratio): Minor rewrite using macros.
(frame_size_history_adjust, frame_size_history_plain)
(frame_size_history_extra): New functions.
(adjust_frame_size): Major rewrite. Adopt new convention that
negative values for new sizes mean no change. Pick up delayed
size changes from F's new_width and new_height slots
(Bug#46827). Call set_window_size_hook with native instead of
text sizes. Do not sanitize window sizes any more. Call
frame_size_history_adjust instead of frame_size_history_add.
Always set F's resized_p slot to true.
(make_frame): Initialize new_width and new_height slots to -1.
Simplify setup of initial sizes and an adjust_frame_size call.
(Fframe_parameters): Drop processing F's new_pixelwise slot.
(check_frame_pixels): Reorder to make declarations appear first.
(Fset_frame_height, Fset_frame_width, Fset_frame_size): Pass
explicit width and height values to adjust_frame_size instead of
-1.
(gui_set_frame_parameters): Minor rewrite making sure that
explicit sizes and the corresponding parameter are passed to
adjust_frame_size. Remove frame_size_history_add call.
(gui_figure_window_size): Drop last two arguments. Simplify
assignment of initial size. Set new_height and new_width slots
to -1. Use adjust_frame_size to set sizes instead of returning
them to caller.
(syms_of_frame): Drop symbols used by frame size history; these
are now built on-the-fly. Also drop some menu bar related
symbols in favor of Qmenu_bar_lines.
* src/frame.h (struct frame): Remove new_pixelwise.
(SET_FRAME_COLS, SET_FRAME_LINES, SET_FRAME_WIDTH)
(SET_FRAME_HEIGHT): Remove macros.
(frame_size_history_add): Remove externs.
(frame_windows_min_size, frame_size_history_plain)
(frame_size_history_extra): Add externs.
(FRAME_WINDOWS_WIDTH, FRAME_WINDOWS_HEIGHT): Rename to
FRAME_INNER_WIDTH and FRAME_INNER_HEIGHT.
(gui_figure_window_size): Drop last two arguments from
extern.
* src/gtkutil.c (xg_frame_resized): Rename arguments to WIDTH
and HEIGHT. Consult delayed_size_change to handle case where
WIDTH and HEIGHT do not match F's new_width and new_height
values. Call change_frame_size with native sizes and without
PIXELWISE argument. Instead of frame_size_history_add call
frame_size_history_extra.
(xg_frame_set_char_size): WIDTH and HEIGHT are native sizes now;
fix adjust_frame_size call accordingly. Instead of
frame_size_history_add call frame_size_history_extra.
(style_changed_cb): Call xg_frame_set_char_size with native
instead of text sizes.
(tb_size_cb): Remove frame_size_history_add call. Call
adjust_frame_size with INHIBIT 5.
(free_frame_tool_bar, xg_change_toolbar_position): Remove
frame_size_history_add call.
(update_frame_tool_bar): Call adjust_frame_size with INHIBIT 2
and let it handle frame_inhibit_implied_resize and
fullheight/-width. Remove frame_size_history_add call.
* src/keyboard.c (Fsuspend_emacs): Call change_frame_size with
native sizes.
* src/nsfns.m (ns_set_tool_bar_lines): Call adjust_frame_size
with INHIBIT 2 and let it handle frame_inhibit_implied_resize
and fullheight/-width. Remove frame_size_history_add call.
(Fx_create_frame): Drop two last arguments in
gui_figure_window_size call. Do not SET_FRAME_WIDTH and
SET_FRAME_HEIGHT, the adjust_frame_size in
gui_figure_window_size did that already.
* src/nsterm.m (ns_set_window_size): Drop PIXELWISE argument and
its processing; WIDTH and HEIGHT represent native pixel sizes
now. Call change_frame_size with native sizes. Remove call to
frame_size_history_add.
([EmacsView viewDidResize:]): Call change_frame_size with native
sizes.
* src/term.c (Fresume_tty): Call change_frame_size with native
sizes.
* src/termhooks.h (*set_window_size_hook): Drop last argument
PIXELWISE.
* src/w32fns.c (w32_change_tab_bar_height)
(w32_change_tool_bar_height): Fix handling of these in the initial
phase before they have been resized at least once.
(Fx_create_frame, w32_create_tip_frame): Drop two last arguments
in gui_figure_window_size call. Do not SET_FRAME_WIDTH and
SET_FRAME_HEIGHT (or SET_FRAME_COLS and SET_FRAME_LINES), the
adjust_frame_size in gui_figure_window_size did that already.
* src/w32inevt.c (resize_event, maybe_generate_resize_event):
Pass native sizes to change_frame_size.
* src/w32term.c (w32_read_socket): When WM_WINDOWPOSCHANGED pass
native sizes to change_frame_size.
(w32_new_font): Recalculate FRAME_TAB_BAR_HEIGHT. Simplify
code.
(w32fullscreen_hook): Call change_frame_size with native sizes.
(w32_set_window_size): Drop argument PIXELWISE and its
processing; WIDTH and HEIGHT are native sizes now. Remove
frame_size_history_add calls. Pass native sizes to
change_frame_size.
* src/widget.c (set_frame_size): Set width and height of widget
directly. Call frame_size_history_plain instead of
frame_size_history_add.
(update_from_various_frame_slots): Call
frame_size_history_extra.
(EmacsFrameRealize): Call frame_size_history_plain.
(EmacsFrameResize): Call change_frame_size with native sizes.
Call frame_size_history_extra instead of frame_size_history_add.
(EmacsFrameSetCharSize): Call frame_size_history_extra. Drop
PIXELWISE argument in x_set_window_size call and specify pixels.
(pixel_to_text_size): Remove function.
* src/xdisp.c (resize_mini_window): Replace FRAME_WINDOWS_HEIGHT
with FRAME_INNER_HEIGHT.
(redisplay_tab_bar): Don't set tab_bar_redisplayed when we did
not redisplay it.
(redisplay_tool_bar): Don't call it for external tool bar.
Don't set tool_bar_redisplayed when we did not redisplay it.
(redisplay_window): When the tool bar is external call
update_frame_tool_bar directly.
* src/xfns.c (x_set_menu_bar_lines): Call adjust_frame_size only
if number of menu bar lines changed and fix 6th argument.
(x_change_tab_bar_height, x_change_tool_bar_height): Fix
handling of these in the initial phase before they have been
resized at least once.
(Fx_create_frame, x_create_tip_frame): Drop two last arguments
in gui_figure_window_size call. Do not SET_FRAME_WIDTH and
SET_FRAME_HEIGHT (or SET_FRAME_COLS and SET_FRAME_LINES), the
adjust_frame_size in gui_figure_window_size did that already.
* src/xmenu.c (update_frame_menubar): Fix 6th arg of
adjust_frame_size call.
(free_frame_menubar): For Motif frames fix fullscreen and
`frame-inhibit-implied-resize' handling. Fix 6th arg of
adjust_frame_size calls.
* src/xterm.c (x_net_wm_state): Remove call to
frame_size_history_add.
(handle_one_xevent): For PropertyNotify and UnmapNotify events
add frame_size_history_plain calls. For MapNotify and
ConfigureNotify events add a frame_size_history_extra call. For
ConfigureNotify events also handle delayed size changes and call
change_frame_size with native sizes.
(x_new_font): Recalculate FRAME_TAB_BAR_HEIGHT. Simplify code.
(x_handle_net_wm_state): Remove frame_size_history_add call.
(x_check_fullscreen): Remove frame_size_history_add call. Call
change_frame_size with native height.
(x_set_window_size_1): WIDTH and HEIGHT are now native. Remove
some frame_size_history_add calls and add frame_size_history_extra
calls instead. If the frame is not visible call adjust_frame_size
directly instead of calling change_frame_size.
(x_set_window_size): Drop PIXELWISE argument. WIDTH and HEIGHT
represent native sizes now.
(x_make_frame_visible, x_make_frame_invisible): Call
frame_size_history_plain.
* src/xterm.h (x_set_window_size): Drop last argument from
extern declaration.
Diffstat (limited to 'lisp')
-rw-r--r-- | lisp/frame.el | 121 |
1 files changed, 92 insertions, 29 deletions
diff --git a/lisp/frame.el b/lisp/frame.el index bca160175a5..aff1d479eca 100644 --- a/lisp/frame.el +++ b/lisp/frame.el @@ -615,15 +615,6 @@ there (in decreasing order of priority)." (face-set-after-frame-default frame-initial-frame) (setq newparms (delq new-bg newparms))) - (when (numberp (car frame-size-history)) - (setq frame-size-history - (cons (1- (car frame-size-history)) - (cons - (list frame-initial-frame - "FRAME-NOTICE-USER" - nil newparms) - (cdr frame-size-history))))) - (modify-frame-parameters frame-initial-frame newparms))))) ;; Restore the original buffer. @@ -926,12 +917,6 @@ the new frame according to its own rules." (let ((val (frame-parameter oldframe param))) (when val (set-frame-parameter frame param val))))) - (when (numberp (car frame-size-history)) - (setq frame-size-history - (cons (1- (car frame-size-history)) - (cons (list frame "MAKE-FRAME") - (cdr frame-size-history))))) - ;; We can run `window-configuration-change-hook' for this frame now. (frame-after-make-frame frame t) (run-hook-with-args 'after-make-frame-functions frame) @@ -1695,26 +1680,104 @@ and width values are in pixels. (defun frame--size-history (&optional frame) "Print history of resize operations for FRAME. -Print prettified version of `frame-size-history' into a buffer -called *frame-size-history*. Optional argument FRAME denotes the -frame whose history will be printed. FRAME defaults to the -selected frame." +This function dumps a prettified version of `frame-size-history' +into a buffer called *frame-size-history*. The optional argument +FRAME denotes the frame whose history will be dumped; it defaults +to the selected frame. + +Storing information about resize operations is off by default. +If you set the variable `frame-size-history' like this + +(setq frame-size-history '(100)) + +then Emacs will save information about the next 100 significant +operations affecting any frame's size in that variable. This +function prints the entries for FRAME stored in that variable in +a more legible way. + +All lines start with an indication of the requested action. An +entry like `menu-bar-lines' or `scroll-bar-width' indicates that +a change of the corresponding frame parameter or Lisp variable +was requested. An entry like gui_figure_window_size indicates +that that C function was executed, an entry like ConfigureNotify +indicates that that event was received. + +In long entries, a number in parentheses displays the INHIBIT +parameter passed to the C function adjust_frame_size. Such +entries may also display changes of frame rectangles in a form +like R=n1xn2~>n3xn4 where R denotes the rectangle type (TS for +text, NS for native and IS for inner frame rectangle sizes, all +in pixels, TC for text rectangle sizes in frame columns and +lines), n1 and n2 denote the old width and height and n3 and n4 +the new width and height in the according units. MS stands for +the minimum inner frame size in pixels, IH and IV, if present, +indicate that resizing horizontally and/or vertically was +inhibited (either by `frame-inhibit-implied-resize' or because of +the frame's fullscreen state). + +Shorter entries represent C functions that process width and +height changes of the native rectangle where PS stands for the +frame's present pixel width and height, XS for a requested pixel +width and height and DS for some earlier requested but so far +delayed pixel width and height. + +Very short entries represent calls of C functions that do not +directly ask for size changes but may indirectly affect the size +of frames like calls to map a frame or change its visibility." (let ((history (reverse frame-size-history)) - entry) + entry item) (setq frame (window-normalize-frame frame)) (with-current-buffer (get-buffer-create "*frame-size-history*") (erase-buffer) (insert (format "Frame size history of %s\n" frame)) (while (consp (setq entry (pop history))) - (when (eq (car entry) frame) - (pop entry) - (insert (format "%s" (pop entry))) - (move-to-column 24 t) - (while entry - (insert (format " %s" (pop entry)))) - (insert "\n"))) - (unless frame-size-history - (insert "Frame size history is nil.\n"))))) + (setq item (car entry)) + (cond + ((not (consp item)) + ;; An item added quickly for debugging purposes. + (insert (format "%s\n" entry))) + ((and (eq (nth 0 item) frame) (= (nth 1 item) 1)) + ;; Length 1 is a "plain event". + (insert (format "%s\n" (nth 2 item)))) + ((and (eq (nth 0 item) frame) (= (nth 1 item) 2)) + ;; Length 2 is an "extra" item. + (insert (format "%s" (nth 2 item))) + (setq item (nth 0 (cdr entry))) + (insert (format ", PS=%sx%s" (nth 0 item) (nth 1 item))) + (when (or (>= (nth 2 item) 0) (>= (nth 3 item) 0)) + (insert (format ", XS=%sx%s" (nth 2 item) (nth 3 item)))) + (setq item (nth 1 (cdr entry))) + (when (or (>= (nth 0 item) 0) (>= (nth 1 item) 0)) + (insert (format ", DS=%sx%s" (nth 0 item) (nth 1 item)))) + (insert "\n")) + ((and (eq (nth 0 item) frame) (= (nth 1 item) 5)) + ;; Length 5 is an `adjust-frame-size' item. + (insert (format "%s (%s)" (nth 3 item) (nth 2 item))) + (setq item (nth 0 (cdr entry))) + (unless (and (= (nth 0 item) (nth 2 item)) + (= (nth 1 item) (nth 3 item))) + (insert (format ", TS=%sx%s~>%sx%s" + (nth 0 item) (nth 1 item) (nth 2 item) (nth 3 item)))) + (setq item (nth 1 (cdr entry))) + (unless (and (= (nth 0 item) (nth 2 item)) + (= (nth 1 item) (nth 3 item))) + (insert (format ", TC=%sx%s~>%sx%s" + (nth 0 item) (nth 1 item) (nth 2 item) (nth 3 item)))) + (setq item (nth 2 (cdr entry))) + (unless (and (= (nth 0 item) (nth 2 item)) + (= (nth 1 item) (nth 3 item))) + (insert (format ", NS=%sx%s~>%sx%s" + (nth 0 item) (nth 1 item) (nth 2 item) (nth 3 item)))) + (setq item (nth 3 (cdr entry))) + (unless (and (= (nth 0 item) (nth 2 item)) + (= (nth 1 item) (nth 3 item))) + (insert (format ", IS=%sx%s~>%sx%s" + (nth 0 item) (nth 1 item) (nth 2 item) (nth 3 item)))) + (setq item (nth 4 (cdr entry))) + (insert (format ", MS=%sx%s" (nth 0 item) (nth 1 item))) + (when (nth 2 item) (insert " IH")) + (when (nth 3 item) (insert " IV")) + (insert "\n"))))))) (declare-function x-frame-edges "xfns.c" (&optional frame type)) (declare-function w32-frame-edges "w32fns.c" (&optional frame type)) |