+2015-01-12 Martin Rudalics <rudalics@gmx.at>
+
+ * frame.el (frame-notice-user-settings): Remove code dealing with
+ frame-initial-frame-tool-bar-height. Turn off `tool-bar-mode'
+ only if `window-system-frame-alist' or `default-frame-alist' ask
+ for it.
+ (make-frame): Update frame-adjust-size-history if needed.
+
2015-01-12 Paul Eggert <eggert@cs.ucla.edu>
Have 'make' output better GEN names
;; by the lines added in x-create-frame for the tool-bar and
;; switch `tool-bar-mode' off.
(when (display-graphic-p)
- (let ((tool-bar-lines
- (or (assq 'tool-bar-lines initial-frame-alist)
- (assq 'tool-bar-lines window-system-frame-alist)
- (assq 'tool-bar-lines default-frame-alist))))
- ;; Shrink frame by its initial tool bar height iff either zero
- ;; tool bar lines have been requested in one of the frame's
- ;; alists or tool bar mode has been turned off explicitly in
- ;; the user's init file.
- (when (and tool-bar-lines
- (> frame-initial-frame-tool-bar-height 0)
- (or (not tool-bar-mode)
- (null (cdr tool-bar-lines))
- (eq 0 (cdr tool-bar-lines))))
- (set-frame-height
- frame-initial-frame (- (frame-text-height frame-initial-frame)
- frame-initial-frame-tool-bar-height)
- nil t)
+ (let* ((init-lines
+ (assq 'tool-bar-lines initial-frame-alist))
+ (other-lines
+ (or (assq 'tool-bar-lines window-system-frame-alist)
+ (assq 'tool-bar-lines default-frame-alist)))
+ (lines (or init-lines other-lines))
+ (height (tool-bar-height frame-initial-frame t)))
+ ;; Adjust frame top if either zero (nil) tool bar lines have
+ ;; been requested in the most relevant of the frame's alists
+ ;; or tool bar mode has been explicitly turned off in the
+ ;; user's init file.
+ (when (and (> height 0)
+ (or (and lines
+ (or (null (cdr lines))
+ (eq 0 (cdr lines))))
+ (not tool-bar-mode)))
(let* ((initial-top
(cdr (assq 'top frame-initial-geometry-arguments)))
(top (frame-parameter frame-initial-frame 'top)))
(let ((adjusted-top
(cond
((and (consp top) (eq '+ (car top)))
- (list '+ (+ (cadr top)
- frame-initial-frame-tool-bar-height)))
+ (list '+ (+ (cadr top) height)))
((and (consp top) (eq '- (car top)))
- (list '- (- (cadr top)
- frame-initial-frame-tool-bar-height)))
- (t (+ top frame-initial-frame-tool-bar-height)))))
+ (list '- (- (cadr top) height)))
+ (t (+ top height)))))
(modify-frame-parameters
frame-initial-frame `((top . ,adjusted-top))))))
- (tool-bar-mode -1))))
+ ;; Reset `tool-bar-mode' when zero tool bar lines have been
+ ;; requested for the window-system or default frame alists.
+ (when (and tool-bar-mode
+ (and other-lines
+ (or (null (cdr other-lines))
+ (eq 0 (cdr other-lines)))))
+ (tool-bar-mode -1)))))
;; The initial frame we create above always has a minibuffer.
;; If the user wants to remove it, or make it a minibuffer-only
(push p params)))
;; Now make the frame.
(run-hooks 'before-make-frame-hook)
+
+;; (setq frame-adjust-size-history '(t))
+
(setq frame
(funcall (gui-method frame-creation-function w) params))
(normal-erase-is-backspace-setup-frame frame)
(unless (assq param parameters) ;Overridden by explicit parameters.
(let ((val (frame-parameter oldframe param)))
(when val (set-frame-parameter frame param val)))))
+
+ (when (eq (car frame-adjust-size-history) t)
+ (setq frame-adjust-size-history
+ (cons t (cons (list "Frame made")
+ (cdr frame-adjust-size-history)))))
+
(run-hook-with-args 'after-make-frame-functions frame)
frame))
+2015-01-12 Martin Rudalics <rudalics@gmx.at>
+
+ * dispnew.c (change_frame_size_1): Pass Qchange_frame_size to
+ adjust_frame_size.
+ * frame.c (frame_default_tool_bar_height): New variable.
+ (adjust_frame_size): Possibly add requested adjustment to
+ Vframe_adjust_size_history.
+ (make_frame): Initialize tool_bar_redisplayed_once slot.
+ (Fset_frame_height, Fset_frame_width, Fset_frame_size): Clarify
+ doc-string. Call adjust_frame_size unconditionally (the frame's
+ text size may remain unaltered but the pixel size may change).
+ (x_figure_window_size): If frame_default_tool_bar_height was
+ set, use it instead of calculating the tool bar height from
+ DEFAULT_TOOL_BAR_IMAGE_HEIGHT. Don't set
+ Vframe_initial_frame_tool_bar_height.
+ (Qchange_frame_size, Qxg_frame_set_char_size)
+ (Qset_window_configuration, Qx_create_frame_1)
+ (Qx_create_frame_2): New symbols.
+ (Vframe_initial_frame_tool_bar_height): Remove.
+ (Vframe_adjust_size_history): New history variable for debugging
+ frame size adjustments.
+ * frame.h (struct frame): New boolean slot
+ tool_bar_redisplayed_once.
+ (frame_default_tool_bar_height): Extern.
+ * gtkutil.c (xg_frame_set_char_size): Pass Qxg_frame_set_char_size
+ to adjust_frame_size.
+ * nsfns.m (Fx_create_frame): Pass Pass Qx_create_frame_1 and
+ Qx_create_frame_2 to adjust_frame_size.
+ * w32fns.c (x_change_tool_bar_height): Call adjust_frame_size with
+ inhibit 1 when we have not redisplayed the tool bar yet.
+ (Fx_create_frame): Pass Pass Qx_create_frame_1 and
+ Qx_create_frame_2 to adjust_frame_size.
+ * w32menu.c (set_frame_menubar): Simplify adjust_frame_size
+ call.
+ * window.c (Fset_window_configuration): Pass
+ Qset_window_configuration to adjust_frame_size.
+ * xdisp.c (redisplay_tool_bar): Assign new height to
+ frame_default_tool_bar_height.
+ (redisplay_internal): If we haven't redisplayed this frame's
+ tool bar, call redisplay_tool_bar early so we can adjust the
+ frame size accordingly.
+ * xfns.c (x_change_tool_bar_height): Call adjust_frame_size with
+ inhibit 1 when we have not redisplayed the tool bar yet.
+ (Fx_create_frame): Pass Pass Qx_create_frame_1 and
+ Qx_create_frame_2 to adjust_frame_size.
+
2015-01-12 Paul Eggert <eggert@cs.ucla.edu>
Have 'make' output better GEN names
/* Adjust frame size but make sure x_set_window_size does not
get called. */
- adjust_frame_size (f, new_width, new_height, 5, pretend, Qnil);
+ adjust_frame_size (f, new_width, new_height, 5, pretend,
+ Qchange_frame_size);
}
}
/* False means there are no visible garbaged frames. */
bool frame_garbaged;
+/* The default tool bar height for future frames. */
+int frame_default_tool_bar_height;
+
#ifdef HAVE_WINDOW_SYSTEM
static void x_report_frame_params (struct frame *, Lisp_Object *);
#endif
Lisp_Object frame;
XSETFRAME (frame, f);
+
+ /* `make-frame' initializes Vframe_adjust_size_history to (Qt) and
+ strips its car when exiting. Just in case make sure its size never
+ exceeds 100. */
+ if (!NILP (Fconsp (Vframe_adjust_size_history))
+ && EQ (Fcar (Vframe_adjust_size_history), Qt)
+ && XFASTINT (Fsafe_length (Vframe_adjust_size_history)) <= 100)
+ Vframe_adjust_size_history =
+ Fcons (Qt, Fcons (list5 (make_number (0),
+ make_number (new_text_width),
+ make_number (new_text_height),
+ make_number (inhibit), parameter),
+ Fcdr (Vframe_adjust_size_history)));
+
/* The following two values are calculated from the old window body
sizes and any "new" settings for scroll bars, dividers, fringes and
margins (though the latter should have been processed already). */
else if (inhibit_vertical)
new_text_height = old_text_height;
+ if (!NILP (Fconsp (Vframe_adjust_size_history))
+ && EQ (Fcar (Vframe_adjust_size_history), Qt)
+ && XFASTINT (Fsafe_length (Vframe_adjust_size_history)) <= 100)
+ Vframe_adjust_size_history =
+ Fcons (Qt, Fcons (list5 (make_number (1),
+ make_number (new_text_width),
+ make_number (new_text_height),
+ make_number (new_cols),
+ make_number (new_lines)),
+ Fcdr (Vframe_adjust_size_history)));
+
x_set_window_size (f, 0, new_text_width, new_text_height, 1);
f->resized_p = true;
SET_FRAME_COLS (f, new_cols);
SET_FRAME_LINES (f, new_lines);
+ if (!NILP (Fconsp (Vframe_adjust_size_history))
+ && EQ (Fcar (Vframe_adjust_size_history), Qt)
+ && XFASTINT (Fsafe_length (Vframe_adjust_size_history)) <= 100)
+ Vframe_adjust_size_history =
+ Fcons (Qt, Fcons (list5 (make_number (2),
+ make_number (new_text_width),
+ make_number (new_text_height),
+ make_number (new_cols),
+ make_number (new_lines)),
+ Fcdr (Vframe_adjust_size_history)));
+
{
struct window *w = XWINDOW (FRAME_SELECTED_WINDOW (f));
int text_area_x, text_area_y, text_area_width, text_area_height;
f->garbaged = true;
f->can_x_set_window_size = false;
f->can_run_window_configuration_change_hook = false;
+ f->tool_bar_redisplayed_once = false;
f->column_width = 1; /* !FRAME_WINDOW_P value. */
f->line_height = 1; /* !FRAME_WINDOW_P value. */
#ifdef HAVE_WINDOW_SYSTEM
}
DEFUN ("set-frame-height", Fset_frame_height, Sset_frame_height, 2, 4, 0,
- doc: /* Set height of frame FRAME to HEIGHT lines.
+ doc: /* Set text height of frame FRAME to HEIGHT lines.
Optional third arg PRETEND non-nil means that redisplay should use
HEIGHT lines but that the idea of the actual height of the frame should
not be changed.
pixel_height = (!NILP (pixelwise)
? 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), Qheight);
+ adjust_frame_size (f, -1, pixel_height, 1, !NILP (pretend), Qheight);
return Qnil;
}
DEFUN ("set-frame-width", Fset_frame_width, Sset_frame_width, 2, 4, 0,
- doc: /* Set width of frame FRAME to WIDTH columns.
+ doc: /* Set text width of frame FRAME to WIDTH columns.
Optional third arg PRETEND non-nil means that redisplay should use WIDTH
columns but that the idea of the actual width of the frame should not
be changed.
pixel_width = (!NILP (pixelwise)
? 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), Qwidth);
+ adjust_frame_size (f, pixel_width, -1, 1, !NILP (pretend), Qwidth);
return Qnil;
}
DEFUN ("set-frame-size", Fset_frame_size, Sset_frame_size, 3, 4, 0,
- doc: /* Set size of FRAME to WIDTH by HEIGHT, measured in characters.
+ doc: /* Set text size of FRAME to WIDTH by HEIGHT, measured in characters.
Optional argument PIXELWISE non-nil means to measure in pixels. Note:
When `frame-resize-pixelwise' is nil, some window managers may refuse to
honor a WIDTH that is not an integer multiple of the default frame font
pixel_height = (!NILP (pixelwise)
? XINT (height)
: XINT (height) * FRAME_LINE_HEIGHT (f));
-
- if (pixel_width != FRAME_TEXT_WIDTH (f)
- || pixel_height != FRAME_TEXT_HEIGHT (f))
- adjust_frame_size (f, pixel_width, pixel_height, 1, 0, Qsize);
+ adjust_frame_size (f, pixel_width, pixel_height, 1, 0, Qsize);
return Qnil;
}
frames without having to guess how tall the tool bar will get. */
if (toolbar_p && FRAME_TOOL_BAR_LINES (f))
{
- int margin, relief;
+ if (frame_default_tool_bar_height)
+ FRAME_TOOL_BAR_HEIGHT (f) = frame_default_tool_bar_height;
+ else
+ {
+ int margin, relief;
- relief = (tool_bar_button_relief >= 0
- ? tool_bar_button_relief
- : DEFAULT_TOOL_BAR_BUTTON_RELIEF);
+ relief = (tool_bar_button_relief >= 0
+ ? tool_bar_button_relief
+ : DEFAULT_TOOL_BAR_BUTTON_RELIEF);
- if (RANGED_INTEGERP (1, Vtool_bar_button_margin, INT_MAX))
- margin = XFASTINT (Vtool_bar_button_margin);
- else if (CONSP (Vtool_bar_button_margin)
- && RANGED_INTEGERP (1, XCDR (Vtool_bar_button_margin), INT_MAX))
- margin = XFASTINT (XCDR (Vtool_bar_button_margin));
- else
- margin = 0;
+ if (RANGED_INTEGERP (1, Vtool_bar_button_margin, INT_MAX))
+ margin = XFASTINT (Vtool_bar_button_margin);
+ else if (CONSP (Vtool_bar_button_margin)
+ && RANGED_INTEGERP (1, XCDR (Vtool_bar_button_margin), INT_MAX))
+ margin = XFASTINT (XCDR (Vtool_bar_button_margin));
+ else
+ margin = 0;
- FRAME_TOOL_BAR_HEIGHT (f)
- = DEFAULT_TOOL_BAR_IMAGE_HEIGHT + 2 * margin + 2 * relief;
- Vframe_initial_frame_tool_bar_height = make_number (FRAME_TOOL_BAR_HEIGHT (f));
+ FRAME_TOOL_BAR_HEIGHT (f)
+ = DEFAULT_TOOL_BAR_IMAGE_HEIGHT + 2 * margin + 2 * relief;
+ }
}
top = x_get_arg (dpyinfo, parms, Qtop, 0, 0, RES_TYPE_NUMBER);
DEFSYM (Qtool_bar_external, "tool-bar-external");
DEFSYM (Qtool_bar_size, "tool-bar-size");
DEFSYM (Qframe_inner_size, "frame-inner-size");
+ DEFSYM (Qchange_frame_size, "change-frame-size");
+ DEFSYM (Qxg_frame_set_char_size, "xg-frame-set-char-size");
+ DEFSYM (Qset_window_configuration, "set-window-configuration");
+ DEFSYM (Qx_create_frame_1, "x-create-frame-1");
+ DEFSYM (Qx_create_frame_2, "x-create-frame-2");
#ifdef HAVE_NS
DEFSYM (Qns_parse_geometry, "ns-parse-geometry");
Vtool_bar_mode = Qnil;
#endif
- DEFVAR_LISP ("frame-initial-frame-tool-bar-height", Vframe_initial_frame_tool_bar_height,
- doc: /* Height of tool bar of initial frame. */);
- Vframe_initial_frame_tool_bar_height = make_number (0);
-
DEFVAR_KBOARD ("default-minibuffer-frame", Vdefault_minibuffer_frame,
doc: /* Minibufferless frames use this frame's minibuffer.
Emacs cannot create minibufferless frames unless this is set to an
frame_inhibit_implied_resize = Qt;
#endif
+ DEFVAR_LISP ("frame-adjust-size-history", Vframe_adjust_size_history,
+ doc: /* History of frame size adjustments. */);
+ Vframe_adjust_size_history = Qnil;
+
staticpro (&Vframe_list);
defsubr (&Sframep);
for this frame. */
bool_bf can_run_window_configuration_change_hook : 1;
+ /* True means tool bar has been redisplayed at least once in current
+ session. */
+ bool_bf tool_bar_redisplayed_once : 1;
+
/* Bitfield area ends here. */
/* Number of lines (rounded up) of tool bar. REMOVE THIS */
extern Lisp_Object selected_frame;
+extern int frame_default_tool_bar_height;
+
extern struct frame *decode_window_system_frame (Lisp_Object);
extern struct frame *decode_live_frame (Lisp_Object);
extern struct frame *decode_any_frame (Lisp_Object);
x_wait_for_event (f, ConfigureNotify);
}
else
- adjust_frame_size (f, -1, -1, 5, 0, Qnil);
+ adjust_frame_size (f, -1, -1, 5, 0, Qxg_frame_set_char_size);
}
/* Handle height/width changes (i.e. add/remove/move menu/toolbar).
/* 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, Qnil);
+ FRAME_LINES (f) * FRAME_LINE_HEIGHT (f), 5, 1,
+ Qx_create_frame_1);
/* The resources controlling the menu-bar and tool-bar are
processed specially at startup, and reflected in the mode
/* Allow x_set_window_size, now. */
f->can_x_set_window_size = true;
- adjust_frame_size (f, FRAME_TEXT_WIDTH (f), FRAME_TEXT_HEIGHT (f), 0, 1, Qnil);
+ adjust_frame_size (f, FRAME_TEXT_WIDTH (f), FRAME_TEXT_HEIGHT (f), 0, 1,
+ Qx_create_frame_2);
if (! f->output_data.ns->explicit_parent)
{
/* Recalculate toolbar height. */
f->n_tool_bar_rows = 0;
- adjust_frame_size (f, -1, -1, (old_height == 0 || height == 0) ? 2 : 4, 0,
- Qtool_bar_lines);
+ adjust_frame_size (f, -1, -1,
+ (!f->tool_bar_redisplayed_once ? 1
+ : (old_height == 0 || height == 0) ? 2
+ : 4),
+ 0, Qtool_bar_lines);
/* adjust_frame_size might not have done anything, garbage frame
here. */
had one frame line vs one toolbar line which left us with a zero
root window height which was obviously wrong as well ... */
adjust_frame_size (f, FRAME_COLS (f) * FRAME_COLUMN_WIDTH (f),
- FRAME_LINES (f) * FRAME_LINE_HEIGHT (f), 5, 1, Qnil);
+ FRAME_LINES (f) * FRAME_LINE_HEIGHT (f), 5, 1,
+ Qx_create_frame_1);
/* The X resources controlling the menu-bar and tool-bar are
processed specially at startup, and reflected in the mode
/* Allow x_set_window_size, now. */
f->can_x_set_window_size = true;
- adjust_frame_size (f, FRAME_TEXT_WIDTH (f), FRAME_TEXT_HEIGHT (f), 0, 1, Qnil);
+ adjust_frame_size (f, FRAME_TEXT_WIDTH (f), FRAME_TEXT_HEIGHT (f), 0, 1,
+ Qx_create_frame_2);
/* Tell the server what size and position, etc, we want, and how
badly we want them. This should be done after we have the menu
/* Force the window size to be recomputed so that the frame's text
area remains the same, if menubar has just been created. */
if (old_widget == NULL)
- adjust_frame_size (f, FRAME_TEXT_WIDTH (f),
- FRAME_TEXT_HEIGHT (f), 2, 0, Qmenu_bar_lines);
+ adjust_frame_size (f, -1, -1, 2, 0, Qmenu_bar_lines);
}
unblock_input ();
/* Allow x_set_window_size again and apply frame size changes if
needed. */
f->can_x_set_window_size = true;
- adjust_frame_size (f, -1, -1, 1, 0, Qnil);
+ adjust_frame_size (f, -1, -1, 1, 0, Qset_window_configuration);
adjust_frame_glyphs (f);
unblock_input ();
if (new_height != WINDOW_PIXEL_HEIGHT (w))
{
x_change_tool_bar_height (f, new_height);
+ frame_default_tool_bar_height = new_height;
/* Always do that now. */
clear_glyph_matrix (w->desired_matrix);
f->fonts_changed = 1;
if (change_height_p)
{
x_change_tool_bar_height (f, new_height);
+ frame_default_tool_bar_height = new_height;
clear_glyph_matrix (w->desired_matrix);
f->n_tool_bar_rows = nrows;
f->fonts_changed = 1;
retry_frame:
+#if defined (HAVE_WINDOW_SYSTEM) && !defined (USE_GTK) && !defined (HAVE_NS)
+ /* Redisplay internal tool bar if this is the first time so we
+ can adjust the frame height right now, if necessary. */
+ if (!f->tool_bar_redisplayed_once)
+ {
+ if (redisplay_tool_bar (f))
+ adjust_frame_glyphs (f);
+ f->tool_bar_redisplayed_once = true;
+ }
+#endif
+
if (FRAME_WINDOW_P (f) || FRAME_TERMCAP_P (f) || f == sf)
{
bool gcscrollbars
/* Recalculate toolbar height. */
f->n_tool_bar_rows = 0;
- adjust_frame_size (f, -1, -1, (old_height == 0 || height == 0) ? 2 : 4, 0,
- Qtool_bar_lines);
+ adjust_frame_size (f, -1, -1,
+ (!f->tool_bar_redisplayed_once ? 1
+ : (old_height == 0 || height == 0) ? 2
+ : 4),
+ 0, Qtool_bar_lines);
/* adjust_frame_size might not have done anything, garbage frame
here. */
had one frame line vs one toolbar line which left us with a zero
root window height which was obviously wrong as well ... */
adjust_frame_size (f, FRAME_COLS (f) * FRAME_COLUMN_WIDTH (f),
- FRAME_LINES (f) * FRAME_LINE_HEIGHT (f), 5, 1, Qnil);
+ FRAME_LINES (f) * FRAME_LINE_HEIGHT (f), 5, 1,
+ Qx_create_frame_1);
/* Set the menu-bar-lines and tool-bar-lines parameters. We don't
look up the X resources controlling the menu-bar and tool-bar
/* Consider frame official, now. */
f->can_x_set_window_size = true;
- adjust_frame_size (f, FRAME_TEXT_WIDTH (f), FRAME_TEXT_HEIGHT (f), 0, 1, Qnil);
+ adjust_frame_size (f, FRAME_TEXT_WIDTH (f), FRAME_TEXT_HEIGHT (f), 0, 1,
+ Qx_create_frame_2);
#if defined (USE_X_TOOLKIT) || defined (USE_GTK)
/* Create the menu bar. */