Commit 1c50b3ad authored by Martin Rudalics's avatar Martin Rudalics
Browse files

Improve inhibiting of implied frame resizes.

* frames.texi (Size and Position): Rewrite description of
`frame-inhibit-implied-resize'.
* cus-start.el (frame-resize-pixelwise): Fix group.
(frame-inhibit-implied-resize): Add entry.
* dispnew.c (change_frame_size_1): Fix call of
adjust_frame_size.
* frame.c (Qsize, Qframe_position, Qframe_outer_size)
(Qframe_inner_size, Qexternal_border_size, Qtitle_height)
(Qmenu_bar_external, Qmenu_bar_size, Qtool_bar_external)
(Qtool_bar_size): New constants.
(frame_inhibit_resize, adjust_frame_size): New argument to
handle case where frame_inhibit_implied_resize is a list.
(Fmake_terminal_frame, Fset_frame_height, Fset_frame_width)
(Fset_frame_size, x_set_left_fringe, x_set_right_fringe)
(x_set_right_divider_width, x_set_bottom_divider_width)
(x_set_vertical_scroll_bars, x_set_horizontal_scroll_bars)
(x_set_scroll_bar_width, x_set_scroll_bar_height): Update
callers.
(frame-inhibit-implied-resize): Rewrite doc-string.
* frame.h (frame_inhibit_resize, adjust_frame_size): Fix
external declarations.
(Qframe_position, Qframe_outer_size)
(Qframe_inner_size, Qexternal_border_size, Qtitle_height)
(Qmenu_bar_external, Qmenu_bar_size, Qtool_bar_external)
(Qtool_bar_size): Extern them.
* gtkutil.c (FRAME_TOTAL_PIXEL_HEIGHT, FRAME_TOTAL_PIXEL_WIDTH)
(xg_height_or_width_changed): Remove.
(xg_frame_set_char_size): Adjust adjust_frame_size calls.
(menubar_map_cb, xg_update_frame_menubar, free_frame_menubar)
(tb_size_cb, update_frame_tool_bar, free_frame_tool_bar)
(xg_change_toolbar_position): Call adjust_frame_size directly.
* nsfns.m (x_set_internal_border_width, Fx_create_frame): Fix
calls of adjust_frame_size.
* w32fns.c (x_set_internal_border_width, x_set_menu_bar_lines)
(Fx_create_frame, x_create_tip_frame): Adjust adjust_frame_size
calls.
(x_set_tool_bar_lines, x_change_tool_bar_height): Make sure that
frame can get resized when tool-bar-lines parameter changes from
or to zero.
(Fw32_frame_menu_bar_size): Return fourth value.
(Fw32_frame_rect): Block input around system calls
(Fx_frame_geometry): New function.
* w32menu.c (set_frame_menubar): Adjust adjust_frame_size call.
* w32term.c (x_new_font): Adjust adjust_frame_size call.
* widget.c (EmacsFrameSetCharSize): Adjust frame_inhibit_resize
call.
* window.c (Fset_window_configuration): Adjust adjust_frame_size
call.
* xfns.c (x_set_menu_bar_lines, x_set_internal_border_width)
(Fx_create_frame): Adjust adjust_frame_size calls.
(x_set_tool_bar_lines, x_change_tool_bar_height): Make sure that
frame can get resized when tool-bar-lines parameter changes from
or to zero.
(Fx_frame_geometry): New function.
* xmenu.c (update_frame_menubar): On Lucid call
adjust_frame_size with one pixel less height to avoid that
repeatedly adding/removing the menu bar grows the frame.
(free_frame_menubar): On Motif arrange to optionally preserve
the old frame height when removing the menu bar.
* xterm.c (x_new_font): Adjust adjust_frame_size call.
parent a067ef9a
2014-11-07 Martin Rudalics <rudalics@gmx.at>
* frames.texi (Size and Position): Rewrite description of
`frame-inhibit-implied-resize'.
2014-10-22 Martin Rudalics <rudalics@gmx.at>
* frames.texi (Size Parameters): Replace "frame contents" by
......
......@@ -1350,10 +1350,9 @@ frame's text area unaltered when, for example, adding or removing a menu
bar, changing the default font or setting the width of the frame's
scroll bars. This means, however, that in such case Emacs must ask the
window manager to resize the display area of the frame in order to
accommodate the size change. (Note that with the exception of GTK+
builds, adding, removing or wrapping the tool bar usually do not resize
the frame's display area, hence these may alter the number of displayed
lines.)
accommodate the size change. Note that wrapping a menu or tool bar
usually does not resize the frame's display area, hence this will alter
the number of displayed lines.
Occasionally, such implied resizing of the display area may be
unwanted, for example, when the frame is maximized or made fullscreen
......@@ -1361,15 +1360,40 @@ where it's turned off by default. In other cases you can disable
implied resizing with the following option:
@defopt frame-inhibit-implied-resize
If this option is @code{nil}, changing default font, menu bar mode,
fringe width, or scroll bars of a specific frame may resize the frame's
display area in order to preserve the number of columns or lines the
frame displays. If this option is non-@code{nil}, no such resizing is
done.
When you add a tool bar or scroll bar to a frame that is not large
enough to accommodate one, Emacs will try to enlarge the frame even if
this option is non-@code{nil}.
If this option is @code{nil}, changing font, menu bar, tool bar,
internal borders, fringes or scroll bars of a specific frame may
implicitly resize the frame's display area in order to preserve the
number of columns or lines the frame displays. If this option is
non-@code{nil}, no implied resizing is done.
The value of this option can be also be a list of frame parameters. In
that case, implied resizing is inhibited when changing a parameter that
appears in this list. The frame parameters currently handled by this
option are: @code{font}, @code{font-backend},
@code{internal-border-width}, @code{menu-bar-lines} and
@code{tool-bar-lines}.
Changing any of the @code{scroll-bar-width}, @code{scroll-bar-height},
@code{vertical-scroll-bars}, @code{horizontal-scroll-bars},
@code{left-fringe} and @code{right-fringe} frame parameters is handled
as if the frame contained just one live window. This means, for
example, that removing vertical scroll bars on a frame containing
several side by side windows will shrink the frame width by the width of
one scroll bar provided this option is @code{nil} and keep it unchanged
if this option is either @code{t} or a list containing
@code{vertical-scroll-bars}.
The default value is @code{'(tool-bar-lines)} for Lucid, Motif and
Windows (which means that adding/removing a tool bar there does not
change the frame height), @code{nil} on all other window systems
including GTK+ (which means that changing any of the parameters listed
above may change the size of the frame), and @code{t} otherwise (which
means the frame size never changes implicitly when there's no window
system support).
Note that when a frame is not large enough to accommodate a change of
any of the parameters listed above, Emacs may try to enlarge the frame
even if this option is non-@code{nil}.
@end defopt
@c FIXME? Belongs more in Emacs manual than here?
......
2014-11-07 Martin Rudalics <rudalics@gmx.at>
* cus-start.el (frame-resize-pixelwise): Fix group.
(frame-inhibit-implied-resize): Add entry.
2014-11-07 Daiki Ueno <ueno@gnu.org>
* epa.el (epa-pinentry-mode): New user option.
......
......@@ -274,7 +274,13 @@ Leaving \"Default\" unchecked is equivalent with specifying a default of
(tool-bar-mode (frames mouse) boolean nil
; :initialize custom-initialize-default
:set custom-set-minor-mode)
(frame-resize-pixelwise windows boolean "24.4")
(frame-resize-pixelwise frames boolean "24.4")
(frame-inhibit-implied-resize frames
(choice
(const :tag "Never" nil)
(const :tag "Always" t)
(repeat (symbol :tag "Parameter")))
"25.1")
;; fringe.c
(overflow-newline-into-fringe fringe boolean)
;; image.c
......
2014-11-07 Martin Rudalics <rudalics@gmx.at>
* dispnew.c (change_frame_size_1): Fix call of
adjust_frame_size.
* frame.c (Qsize, Qframe_position, Qframe_outer_size)
(Qframe_inner_size, Qexternal_border_size, Qtitle_height)
(Qmenu_bar_external, Qmenu_bar_size, Qtool_bar_external)
(Qtool_bar_size): New constants.
(frame_inhibit_resize, adjust_frame_size): New argument to
handle case where frame_inhibit_implied_resize is a list.
(Fmake_terminal_frame, Fset_frame_height, Fset_frame_width)
(Fset_frame_size, x_set_left_fringe, x_set_right_fringe)
(x_set_right_divider_width, x_set_bottom_divider_width)
(x_set_vertical_scroll_bars, x_set_horizontal_scroll_bars)
(x_set_scroll_bar_width, x_set_scroll_bar_height): Update
callers.
(frame-inhibit-implied-resize): Rewrite doc-string.
* frame.h (frame_inhibit_resize, adjust_frame_size): Fix
external declarations.
(Qframe_position, Qframe_outer_size)
(Qframe_inner_size, Qexternal_border_size, Qtitle_height)
(Qmenu_bar_external, Qmenu_bar_size, Qtool_bar_external)
(Qtool_bar_size): Extern them.
* gtkutil.c (FRAME_TOTAL_PIXEL_HEIGHT, FRAME_TOTAL_PIXEL_WIDTH)
(xg_height_or_width_changed): Remove.
(xg_frame_set_char_size): Adjust adjust_frame_size calls.
(menubar_map_cb, xg_update_frame_menubar, free_frame_menubar)
(tb_size_cb, update_frame_tool_bar, free_frame_tool_bar)
(xg_change_toolbar_position): Call adjust_frame_size directly.
* nsfns.m (x_set_internal_border_width, Fx_create_frame): Fix
calls of adjust_frame_size.
* w32fns.c (x_set_internal_border_width, x_set_menu_bar_lines)
(Fx_create_frame, x_create_tip_frame): Adjust adjust_frame_size
calls.
(x_set_tool_bar_lines, x_change_tool_bar_height): Make sure that
frame can get resized when tool-bar-lines parameter changes from
or to zero.
(Fw32_frame_menu_bar_size): Return fourth value.
(Fw32_frame_rect): Block input around system calls
(Fx_frame_geometry): New function.
* w32menu.c (set_frame_menubar): Adjust adjust_frame_size call.
* w32term.c (x_new_font): Adjust adjust_frame_size call.
* widget.c (EmacsFrameSetCharSize): Adjust frame_inhibit_resize
call.
* window.c (Fset_window_configuration): Adjust adjust_frame_size
call.
* xfns.c (x_set_menu_bar_lines, x_set_internal_border_width)
(Fx_create_frame): Adjust adjust_frame_size calls.
(x_set_tool_bar_lines, x_change_tool_bar_height): Make sure that
frame can get resized when tool-bar-lines parameter changes from
or to zero.
(Fx_frame_geometry): New function.
* xmenu.c (update_frame_menubar): On Lucid call
adjust_frame_size with one pixel less height to avoid that
repeatedly adding/removing the menu bar grows the frame.
(free_frame_menubar): On Motif arrange to optionally preserve
the old frame height when removing the menu bar.
* xterm.c (x_new_font): Adjust adjust_frame_size call.
2014-11-03 Eli Zaretskii <eliz@gnu.org>
* xdisp.c (Fdump_glyph_matrix, Fdump_frame_glyph_matrix): Doc fix.
......
......@@ -5528,7 +5528,7 @@ change_frame_size_1 (struct frame *f, int new_width, int new_height,
/* Adjust frame size but make sure x_set_window_size does not
get called. */
adjust_frame_size (f, new_width, new_height, 5, pretend);
adjust_frame_size (f, new_width, new_height, 5, pretend, Qnil);
}
}
......
......@@ -77,7 +77,7 @@ Lisp_Object Qterminal;
Lisp_Object Qauto_raise, Qauto_lower;
Lisp_Object Qborder_color, Qborder_width;
Lisp_Object Qcursor_color, Qcursor_type;
Lisp_Object Qheight, Qwidth;
Lisp_Object Qheight, Qwidth, Qsize;
Lisp_Object Qicon_left, Qicon_top, Qicon_type, Qicon_name;
Lisp_Object Qtooltip;
Lisp_Object Qinternal_border_width;
......@@ -120,6 +120,11 @@ static Lisp_Object Qdelete_frame_functions;
static Lisp_Object Qframe_windows_min_size;
static Lisp_Object Qgeometry, Qworkarea, Qmm_size, Qframes, Qsource;
Lisp_Object Qframe_position, Qframe_outer_size, Qframe_inner_size;
Lisp_Object Qexternal_border_size, Qtitle_height;
Lisp_Object Qmenu_bar_external, Qmenu_bar_size;
Lisp_Object Qtool_bar_external, Qtool_bar_size;
/* The currently selected frame. */
Lisp_Object selected_frame;
......@@ -209,12 +214,14 @@ get_frame_param (register struct frame *frame, Lisp_Object prop)
/* Return 1 if `frame-inhibit-implied-resize' is non-nil or fullscreen
state of frame F would be affected by a vertical (horizontal if
HORIZONTAL is true) resize. */
HORIZONTAL is true) resize. PARAMETER is the symbol of the frame
parameter that is changed. */
bool
frame_inhibit_resize (struct frame *f, bool horizontal)
frame_inhibit_resize (struct frame *f, bool horizontal, Lisp_Object parameter)
{
return (frame_inhibit_implied_resize
return (EQ (frame_inhibit_implied_resize, Qt)
|| (CONSP (frame_inhibit_implied_resize)
&& !NILP (Fmemq (parameter, frame_inhibit_implied_resize)))
|| !NILP (get_frame_param (f, Qfullscreen))
|| FRAME_TERMCAP_P (f) || FRAME_MSDOS_P (f));
}
......@@ -337,40 +344,46 @@ frame_windows_min_size (Lisp_Object frame, Lisp_Object horizontal, Lisp_Object p
/* Make sure windows sizes of frame F are OK. new_width and new_height
are in pixels. A value of -1 means no change is requested for that
size (but the frame may still have to be resized to accommodate
windows with their minimum sizes.
windows with their minimum sizes). This can either issue a request
to resize the frame externally (via x_set_window_size), to resize the
frame internally (via resize_frame_windows) or do nothing at all.
The argument INHIBIT can assume the following values:
0 means to unconditionally call x_set_window_size even if sizes
apparently do not change. Fx_create_frame uses this to pass the
initial size to the window manager.
apparently do not change. Fx_create_frame uses this to pass the
initial size to the window manager.
1 means to call x_set_window_size iff the pixel size really changes.
Fset_frame_size, Fset_frame_height, ... use this.
1 means to call x_set_window_size if the outer frame size really
changes. Fset_frame_size, Fset_frame_height, ... use this.
2 means to unconditionally call x_set_window_size provided
frame_inhibit_resize allows it. The menu bar code uses this.
2 means to call x_set_window_size provided frame_inhibit_resize
allows it. The menu and tool bar code use this ("3" won't work
here in general because menu and tool bar are often not counted in
the frame's text height).
3 means call x_set_window_size iff window minimum sizes must be
preserved or frame_inhibit_resize allows it, x_set_left_fringe,
x_set_scroll_bar_width, ... use this.
3 means call x_set_window_size if window minimum sizes must be
preserved or frame_inhibit_resize allows it. x_set_left_fringe,
x_set_scroll_bar_width, x_new_font ... use (or should use) this.
4 means call x_set_window_size iff window minimum sizes must be
preserved. x_set_tool_bar_lines, x_set_right_divider_width, ... use
this. BUT maybe the toolbar code shouldn't ....
4 means call x_set_window_size only if window minimum sizes must be
preserved. x_set_right_divider_width, x_set_border_width and the
code responsible for wrapping the tool bar use this.
5 means to never call x_set_window_size. change_frame_size uses
this.
this.
For 2 and 3 note that if frame_inhibit_resize inhibits resizing and
minimum sizes are not violated no internal resizing takes place
either. For 2, 3, 4 and 5 note that even if no x_set_window_size
call is issued, window sizes may have to be adjusted in order to
support minimum size constraints for the frame's windows.
Note that even when x_set_window_size is not called, individual
windows may have to be resized (via `window--sanitize-window-sizes')
in order to support minimum size constraints.
PRETEND is as for change_frame_size. */
PRETEND is as for change_frame_size. PARAMETER, if non-nil, is the
symbol of the parameter changed (like `menu-bar-lines', `font', ...).
This is passed on to frame_inhibit_resize to let the latter decide on
a case-by-case basis whether the frame may be resized externally. */
void
adjust_frame_size (struct frame *f, int new_width, int new_height, int inhibit, bool pretend)
adjust_frame_size (struct frame *f, int new_width, int new_height, int inhibit,
bool pretend, Lisp_Object parameter)
{
int unit_width = FRAME_COLUMN_WIDTH (f);
int unit_height = FRAME_LINE_HEIGHT (f);
......@@ -415,10 +428,12 @@ adjust_frame_size (struct frame *f, int new_width, int new_height, int inhibit,
so or INHIBIT equals 4. */
{
inhibit_horizontal = ((windows_width >= min_windows_width
&& (inhibit == 4 || frame_inhibit_resize (f, true)))
&& (inhibit == 4
|| frame_inhibit_resize (f, true, parameter)))
? true : false);
inhibit_vertical = ((windows_height >= min_windows_height
&& (inhibit == 4 || frame_inhibit_resize (f, false)))
&& (inhibit == 4
|| frame_inhibit_resize (f, false, parameter)))
? true : false);
}
else
......@@ -1004,7 +1019,7 @@ affects all frames on the same terminal device. */)
{
int width, height;
get_tty_size (fileno (FRAME_TTY (f)->input), &width, &height);
adjust_frame_size (f, width, height - FRAME_MENU_BAR_LINES (f), 5, 0);
adjust_frame_size (f, width, height - FRAME_MENU_BAR_LINES (f), 5, 0, Qnil);
}
adjust_frame_glyphs (f);
......@@ -2848,7 +2863,7 @@ multiple of the default frame font height. */)
? XINT (height)
: XINT (height) * FRAME_LINE_HEIGHT (f));
if (pixel_height != FRAME_TEXT_HEIGHT (f))
adjust_frame_size (f, -1, pixel_height, 1, !NILP (pretend));
adjust_frame_size (f, -1, pixel_height, 1, !NILP (pretend), Qheight);
return Qnil;
}
......@@ -2874,7 +2889,7 @@ multiple of the default frame font width. */)
? XINT (width)
: XINT (width) * FRAME_COLUMN_WIDTH (f));
if (pixel_width != FRAME_TEXT_WIDTH (f))
adjust_frame_size (f, pixel_width, -1, 1, !NILP (pretend));
adjust_frame_size (f, pixel_width, -1, 1, !NILP (pretend), Qwidth);
return Qnil;
}
......@@ -2903,7 +2918,7 @@ font height. */)
if (pixel_width != FRAME_TEXT_WIDTH (f)
|| pixel_height != FRAME_TEXT_HEIGHT (f))
adjust_frame_size (f, pixel_width, pixel_height, 1, 0);
adjust_frame_size (f, pixel_width, pixel_height, 1, 0, Qsize);
return Qnil;
}
......@@ -3627,7 +3642,7 @@ x_set_left_fringe (struct frame *f, Lisp_Object new_value, Lisp_Object old_value
= (new_width + FRAME_RIGHT_FRINGE_WIDTH (f) + unit - 1) / unit;
if (FRAME_X_WINDOW (f) != 0)
adjust_frame_size (f, -1, -1, 3, 0);
adjust_frame_size (f, -1, -1, 3, 0, Qleft_fringe);
SET_FRAME_GARBAGED (f);
}
......@@ -3651,7 +3666,7 @@ x_set_right_fringe (struct frame *f, Lisp_Object new_value, Lisp_Object old_valu
= (new_width + FRAME_LEFT_FRINGE_WIDTH (f) + unit - 1) / unit;
if (FRAME_X_WINDOW (f) != 0)
adjust_frame_size (f, -1, -1, 3, 0);
adjust_frame_size (f, -1, -1, 3, 0, Qright_fringe);
SET_FRAME_GARBAGED (f);
}
......@@ -3683,7 +3698,7 @@ x_set_right_divider_width (struct frame *f, Lisp_Object arg, Lisp_Object oldval)
FRAME_RIGHT_DIVIDER_WIDTH (f) = 0;
if (FRAME_RIGHT_DIVIDER_WIDTH (f) != old)
{
adjust_frame_size (f, -1, -1, 4, 0);
adjust_frame_size (f, -1, -1, 4, 0, Qright_divider_width);
adjust_frame_glyphs (f);
SET_FRAME_GARBAGED (f);
}
......@@ -3701,7 +3716,7 @@ x_set_bottom_divider_width (struct frame *f, Lisp_Object arg, Lisp_Object oldval
FRAME_BOTTOM_DIVIDER_WIDTH (f) = 0;
if (FRAME_BOTTOM_DIVIDER_WIDTH (f) != old)
{
adjust_frame_size (f, -1, -1, 4, 0);
adjust_frame_size (f, -1, -1, 4, 0, Qbottom_divider_width);
adjust_frame_glyphs (f);
SET_FRAME_GARBAGED (f);
}
......@@ -3765,7 +3780,7 @@ x_set_vertical_scroll_bars (struct frame *f, Lisp_Object arg, Lisp_Object oldval
However, if the window hasn't been created yet, we shouldn't
call x_set_window_size. */
if (FRAME_X_WINDOW (f))
adjust_frame_size (f, -1, -1, 3, 0);
adjust_frame_size (f, -1, -1, 3, 0, Qvertical_scroll_bars);
SET_FRAME_GARBAGED (f);
}
......@@ -3785,7 +3800,7 @@ x_set_horizontal_scroll_bars (struct frame *f, Lisp_Object arg, Lisp_Object oldv
However, if the window hasn't been created yet, we shouldn't
call x_set_window_size. */
if (FRAME_X_WINDOW (f))
adjust_frame_size (f, -1, -1, 3, 0);
adjust_frame_size (f, -1, -1, 3, 0, Qhorizontal_scroll_bars);
SET_FRAME_GARBAGED (f);
}
......@@ -3802,7 +3817,7 @@ x_set_scroll_bar_width (struct frame *f, Lisp_Object arg, Lisp_Object oldval)
x_set_scroll_bar_default_width (f);
if (FRAME_X_WINDOW (f))
adjust_frame_size (f, -1, -1, 3, 0);
adjust_frame_size (f, -1, -1, 3, 0, Qscroll_bar_width);
SET_FRAME_GARBAGED (f);
}
......@@ -3812,7 +3827,7 @@ x_set_scroll_bar_width (struct frame *f, Lisp_Object arg, Lisp_Object oldval)
FRAME_CONFIG_SCROLL_BAR_WIDTH (f) = XFASTINT (arg);
FRAME_CONFIG_SCROLL_BAR_COLS (f) = (XFASTINT (arg) + unit - 1) / unit;
if (FRAME_X_WINDOW (f))
adjust_frame_size (f, -1, -1, 3, 0);
adjust_frame_size (f, -1, -1, 3, 0, Qscroll_bar_width);
SET_FRAME_GARBAGED (f);
}
......@@ -3832,7 +3847,7 @@ x_set_scroll_bar_height (struct frame *f, Lisp_Object arg, Lisp_Object oldval)
x_set_scroll_bar_default_height (f);
if (FRAME_X_WINDOW (f))
adjust_frame_size (f, -1, -1, 3, 0);
adjust_frame_size (f, -1, -1, 3, 0, Qscroll_bar_height);
SET_FRAME_GARBAGED (f);
}
......@@ -3842,7 +3857,7 @@ x_set_scroll_bar_height (struct frame *f, Lisp_Object arg, Lisp_Object oldval)
FRAME_CONFIG_SCROLL_BAR_HEIGHT (f) = XFASTINT (arg);
FRAME_CONFIG_SCROLL_BAR_LINES (f) = (XFASTINT (arg) + unit - 1) / unit;
if (FRAME_X_WINDOW (f))
adjust_frame_size (f, -1, -1, 3, 0);
adjust_frame_size (f, -1, -1, 3, 0, Qscroll_bar_height);
SET_FRAME_GARBAGED (f);
}
......@@ -4785,12 +4800,21 @@ syms_of_frame (void)
DEFSYM (Qterminal, "terminal");
DEFSYM (Qgeometry, "geometry");
DEFSYM (Qworkarea, "workarea");
DEFSYM (Qmm_size, "mm-size");
DEFSYM (Qframes, "frames");
DEFSYM (Qsource, "source");
DEFSYM (Qframe_position, "frame-position");
DEFSYM (Qframe_outer_size, "frame-outer-size");
DEFSYM (Qexternal_border_size, "external-border-size");
DEFSYM (Qtitle_height, "title-height");
DEFSYM (Qmenu_bar_external, "menu-bar-external");
DEFSYM (Qmenu_bar_size, "menu-bar-size");
DEFSYM (Qtool_bar_external, "tool-bar-external");
DEFSYM (Qtool_bar_size, "tool-bar-size");
DEFSYM (Qframe_inner_size, "frame-inner-size");
#ifdef HAVE_NS
DEFSYM (Qns_parse_geometry, "ns-parse-geometry");
#endif
......@@ -4985,13 +5009,49 @@ fullscreen. To resize your initial frame pixelwise, set this option to
a non-nil value in your init file. */);
frame_resize_pixelwise = 0;
DEFVAR_BOOL ("frame-inhibit-implied-resize", frame_inhibit_implied_resize,
doc: /* Non-nil means do not resize frames implicitly.
If this option is nil, setting default font, menubar mode, fringe width,
or scroll bar mode of a specific frame may resize the frame in order to
preserve the number of columns or lines it displays. If this option is
non-nil, no such resizing is done. */);
frame_inhibit_implied_resize = 0;
DEFVAR_LISP ("frame-inhibit-implied-resize", frame_inhibit_implied_resize,
doc: /* Whether frames should be resized implicitly.
If this option is nil, setting font, menu bar, tool bar, internal
borders, fringes or scroll bars of a specific frame may resize the frame
in order to preserve the number of columns or lines it displays. If
this option is `t', no such resizing is done. Note that the size of
fullscreen and maximized frames, the height of fullheight frames and the
width of fullwidth frames never change implicitly.
The value of this option can be also be a list of frame parameters. In
this case, resizing is inhibited when changing a parameter that appears
in that list. The parameters currently handled by this option include
`font', `font-backend', `internal-border-width', `menu-bar-lines' and
`tool-bar-lines'.
Changing any of the parameters `scroll-bar-width', `scroll-bar-height',
`vertical-scroll-bars', `horizontal-scroll-bars', `left-fringe' and
`right-fringe' is handled as if the frame contained just one live
window. This means, for example, that removing vertical scroll bars on
a frame containing several side by side windows will shrink the frame
width by the width of one scroll bar provided this option is nil and
keep it unchanged if this option is either `t' or a list containing
`vertical-scroll-bars'.
The default value is '(tool-bar-lines) on Lucid, Motif and Windows
(which means that adding/removing a tool bar does not change the frame
height), nil on all other window systems including GTK+ (which means
that changing any of the parameters listed above may change the size of
the frame), and `t' otherwise (which means the frame size never changes
implicitly when there's no window system support).
Note that when a frame is not large enough to accommodate a change of
any of the parameters listed above, Emacs may try to enlarge the frame
even if this option is non-nil. */);
#if defined (HAVE_WINDOW_SYSTEM)
#if defined (USE_LUCID) || defined (USE_MOTIF) || defined (HAVE_NTGUI)
frame_inhibit_implied_resize = list1 (Qtool_bar_lines);
#else
frame_inhibit_implied_resize = Qnil;
#endif
#else
frame_inhibit_implied_resize = Qt;
#endif
staticpro (&Vframe_list);
......
......@@ -1117,8 +1117,8 @@ extern void check_window_system (struct frame *);
extern void frame_make_pointer_invisible (struct frame *);
extern void frame_make_pointer_visible (struct frame *);
extern Lisp_Object delete_frame (Lisp_Object, Lisp_Object);
extern bool frame_inhibit_resize (struct frame *, bool);
extern void adjust_frame_size (struct frame *, int, int, int, bool);
extern bool frame_inhibit_resize (struct frame *, bool, Lisp_Object);
extern void adjust_frame_size (struct frame *, int, int, int, bool, Lisp_Object);
extern Lisp_Object Vframe_list;
......@@ -1380,6 +1380,11 @@ extern Lisp_Object Qx_resource_name;
extern Lisp_Object Qtop, Qbox, Qbottom;
extern Lisp_Object Qdisplay;
extern Lisp_Object Qframe_position, Qframe_outer_size, Qframe_inner_size;
extern Lisp_Object Qexternal_border_size, Qtitle_height;
extern Lisp_Object Qmenu_bar_external, Qmenu_bar_size;
extern Lisp_Object Qtool_bar_external, Qtool_bar_size;
extern Lisp_Object Qrun_hook_with_args;
#ifdef HAVE_WINDOW_SYSTEM
......
......@@ -50,11 +50,11 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
#include "emacsgtkfixed.h"
#endif
#define FRAME_TOTAL_PIXEL_HEIGHT(f) \
(FRAME_PIXEL_HEIGHT (f) + FRAME_MENUBAR_HEIGHT (f) + FRAME_TOOLBAR_HEIGHT (f))
/** #define FRAME_TOTAL_PIXEL_HEIGHT(f) \ **/
/** (FRAME_PIXEL_HEIGHT (f) + FRAME_MENUBAR_HEIGHT (f) + FRAME_TOOLBAR_HEIGHT (f)) **/
#define FRAME_TOTAL_PIXEL_WIDTH(f) \
(FRAME_PIXEL_WIDTH (f) + FRAME_TOOLBAR_WIDTH (f))
/** #define FRAME_TOTAL_PIXEL_WIDTH(f) \ **/
/** (FRAME_PIXEL_WIDTH (f) + FRAME_TOOLBAR_WIDTH (f)) **/
#ifndef HAVE_GTK_WIDGET_SET_HAS_WINDOW
#define gtk_widget_set_has_window(w, b) \
......@@ -940,12 +940,13 @@ xg_frame_set_char_size (struct frame *f, int width, int height)
x_wait_for_event (f, ConfigureNotify);
}
else
adjust_frame_size (f, -1, -1, 5, 0);
adjust_frame_size (f, -1, -1, 5, 0, Qnil);
}
/* Handle height/width changes (i.e. add/remove/move menu/toolbar).
The policy is to keep the number of editable lines. */
#if 0
static void
xg_height_or_width_changed (struct frame *f)
{
......@@ -955,6 +956,7 @@ xg_height_or_width_changed (struct frame *f)
f->output_data.x->hint_flags = 0;
x_wm_set_size_hint (f, 0, 0);
}
#endif
/* Convert an X Window WSESC on display DPY to its corresponding GtkWidget.
Must be done like this, because GtkWidget:s can have "hidden"
......@@ -3241,7 +3243,7 @@ menubar_map_cb (GtkWidget *w, gpointer user_data)
if (FRAME_MENUBAR_HEIGHT (f) != req.height)
{
FRAME_MENUBAR_HEIGHT (f) = req.height;
xg_height_or_width_changed (f);
adjust_frame_size (f, -1, -1, 2, 0, Qmenu_bar_lines);
}
}
......@@ -3273,7 +3275,7 @@ xg_update_frame_menubar (struct frame *f)
if (FRAME_MENUBAR_HEIGHT (f) != req.height)
{
FRAME_MENUBAR_HEIGHT (f) = req.height;
xg_height_or_width_changed (f);
adjust_frame_size (f, -1, -1, 2, 0, Qmenu_bar_lines);
}
unblock_input ();
}
......@@ -3295,7 +3297,7 @@ free_frame_menubar (struct frame *f)
the container. */
x->menubar_widget = 0;
FRAME_MENUBAR_HEIGHT (f) = 0;
xg_height_or_width_changed (f);
adjust_frame_size (f, -1, -1, 2, 0, Qmenu_bar_lines);
unblock_input ();
}
}
......@@ -4219,7 +4221,7 @@ tb_size_cb (GtkWidget *widget,
size hints if tool bar size changes. Seen on Fedora 18 at least. */
struct frame *f = user_data;
if (xg_update_tool_bar_sizes (f))
xg_height_or_width_changed (f);
adjust_frame_size (f, -1, -1, 2, 0, Qtool_bar_lines);
}
/* Create a tool bar for frame F. */
......@@ -4819,7 +4821,7 @@ update_frame_tool_bar (struct frame *f)
xg_pack_tool_bar (f, FRAME_TOOL_BAR_POSITION (f));
gtk_widget_show_all (x->toolbar_widget);
if (xg_update_tool_bar_sizes (f))
xg_height_or_width_changed (f);
adjust_frame_size (f, -1, -1, 2, 0, Qtool_bar_lines);
}
unblock_input ();
......@@ -4867,7 +4869,7 @@ free_frame_tool_bar (struct frame *f)
NULL);
}
xg_height_or_width_changed (f);
adjust_frame_size (f, -1, -1, 2, 0, Qtool_bar_lines);
unblock_input ();
}
......@@ -4897,7 +4899,7 @@ xg_change_toolbar_position (struct frame *f, Lisp_Object pos)
xg_pack_tool_bar (f, pos);
g_object_unref (top_widget);
if (xg_update_tool_bar_sizes (f))
xg_height_or_width_changed (f);
adjust_frame_size (f, -1, -1, 2, 0, Qtool_bar_lines);
unblock_input ();
}
......
......@@ -731,7 +731,7 @@ Turn the input menu (an NSMenu) into a lisp list for tracking on lisp side
return;
if (FRAME_X_WINDOW (f) != 0)
adjust_frame_size (f, -1, -1, 3, 0);
adjust_frame_size (f, -1, -1, 3, 0, Qinternal_border_width);
SET_FRAME_GARBAGED (f);
}
......@@ -1275,7 +1275,7 @@ Turn the input menu (an NSMenu) into a lisp list for tracking on lisp side
/* Read comment about this code in corresponding place in xfns.c. */
adjust_frame_size (f, FRAME_COLS (f) * FRAME_COLUMN_WIDTH (f),
FRAME_LINES (f) * FRAME_LINE_HEIGHT (f), 5, 1);
FRAME_LINES (f) * FRAME_LINE_HEIGHT (f), 5, 1, Qnil);