summaryrefslogtreecommitdiff
path: root/src/frame.c
diff options
context:
space:
mode:
authorMartin Rudalics <rudalics@gmx.at>2015-02-07 11:51:03 +0100
committerMartin Rudalics <rudalics@gmx.at>2015-02-07 11:51:03 +0100
commitd1655783194f7b84ccac7114a2c341f10bc438b0 (patch)
tree1ee78b1870dfbe7baa45d8e0c4cebae582e13423 /src/frame.c
parentcf498e5b9a73329edea0bdbf1bd8dfe06fdd75e2 (diff)
downloademacs-d1655783194f7b84ccac7114a2c341f10bc438b0.tar.gz
Try to improve handling of fullwidth/-height frames.
* frame.el (frame-notice-user-settings): Update `frame-size-history'. (make-frame): Update `frame-size-history'. Call `frame-after-make-frame'. * faces.el (face-set-after-frame-default): Remove call to frame-can-run-window-configuration-change-hook. * frame.c (frame_size_history_add): New function. (frame_inhibit_resize): Consider frame_inhibit_implied_resize only after frame's after_make_frame slot is true. Inhibit resizing fullwidth-/height frames in one direction only. Update frame_size_history. (adjust_frame_size): Call frame_size_history_add. (make_frame): Initalize after_make_frame slot. (Fmake_terminal_frame): Adjust adjust_frame_size call. (Fcan_run_window_configuration_change_hook): Rename to Fframe_after_make_frame. Set after_make_frame slot. Return second argument. (x_set_frame_parameters): Postpone handling fullscreen parameter until after width and height parameters have been set. Apply width and height changes only if can_x_set_window_size is true. Update frame_size_history. (Qadjust_frame_size_1, Qadjust_frame_size_2) (Qadjust_frame_size_3, QEmacsFrameResize, Qframe_inhibit_resize) (Qx_set_fullscreen, Qx_check_fullscreen, Qx_set_window_size_1) (Qxg_frame_resized, Qxg_frame_set_char_size_1) (Qxg_frame_set_char_size_2, Qxg_frame_set_char_size_3) (Qxg_change_toolbar_position, Qx_net_wm_state) (Qx_handle_net_wm_state, Qtb_size_cb, Qupdate_frame_tool_bar) (Qfree_frame_tool_bar): New symbol for updating frame_size_history. (Qtip_frame, Qterminal_frame): New symbols. (Vframe_adjust_size_history): Rename to frame_size_history. * frame.h (struct frame): Rename can_run_window_configuration_change_hook slot to after_make_frame. (frame_size_history_add): Extern. * gtkutil.c (xg_frame_resized): Call frame_size_history_add. Don't set FRAME_PIXEL_WIDTH and FRAME_PIXEL_HEIGHT here. (xg_frame_set_char_size): Try to preserve the status of fullwidth/-height frames. Call frame_size_history_add. (tb_size_cb, update_frame_tool_bar, free_frame_tool_bar) (xg_change_toolbar_position): Call frame_size_history_add. * w32fns.c (x_change_tool_bar_height): Handle frame's fullscreen status. (Fx_create_frame): Process fullscreen parameter after frame has been resized. (x_create_tip_frame): Pass Qtip_frame to adjust_frame_size. (Fx_frame_geometry): Don't pollute pure storage. * w32term.c (w32_read_socket): For WM_WINDOWPOSCHANGED, WM_ACTIVATE and WM_ACTIVATEAPP set frame's visibility before calling w32fullscreen_hook. For WM_DISPLAYCHANGE call w32fullscreen_hook immediately. (x_fullscreen_adjust, x_check_fullscreen): Remove. (w32fullscreen_hook): Call change_frame_size just as with a "normal" frame resize operation. Call do_pending_window_change. (x_set_window_size): Try to handle fullwidth and fullheight more accurately. Don't rely on w32_enable_frame_resize_hack. (w32_enable_frame_resize_hack): Remove variable. * widget.c (EmacsFrameResize): Remove dead code. Call frame_size_history_add * window.c (run_window_configuration_change_hook): Check f->after_make_frame instead of f->can_run_window_configuration_change_hook. * xfns.c (x_change_tool_bar_height): Handle frame's fullscreen status. (Fx_create_frame): Process fullscreen parameter after frame has been resized. (Fx_frame_geometry): Don't pollute pure storage. * xterm.c (x_net_wm_state, x_handle_net_wm_state): Call frame_size_history_add. (do_ewmh_fullscreen): Handle x_frame_normalize_before_maximize. (x_check_fullscreen): Count in menubar when calling XResizeWindow. Wait for ConfigureNotify event. Call frame_size_history_add. (x_set_window_size_1): Remove PIXELWISE argument. Try to handle changing a fullheight frame's width or a fullwidth frame's height. Call frame_size_history_add. (x_set_window_size): Simplify xg_frame_set_char_size and x_set_window_size_1 calls. (x_frame_normalize_before_maximize): New variable.
Diffstat (limited to 'src/frame.c')
-rw-r--r--src/frame.c202
1 files changed, 142 insertions, 60 deletions
diff --git a/src/frame.c b/src/frame.c
index 890e8972617..96fe3778dbc 100644
--- a/src/frame.c
+++ b/src/frame.c
@@ -149,6 +149,33 @@ get_frame_param (register struct frame *frame, Lisp_Object prop)
return Fcdr (tem);
}
+
+void
+frame_size_history_add (struct frame *f, Lisp_Object fun_symbol,
+ int width, int height, Lisp_Object rest)
+{
+ Lisp_Object frame;
+ int number;
+
+ XSETFRAME (frame, f);
+ if (CONSP (frame_size_history)
+ && NUMBERP (Fcar (frame_size_history))
+ && ((number = XINT (Fcar (frame_size_history))) > 0))
+ frame_size_history =
+ Fcons (make_number (number - 1),
+ Fcons (list4
+ (frame, fun_symbol,
+ ((width > 0)
+ ? list4 (make_number (FRAME_TEXT_WIDTH (f)),
+ make_number (FRAME_TEXT_HEIGHT (f)),
+ make_number (width),
+ make_number (height))
+ : Qnil),
+ rest),
+ Fcdr (frame_size_history)));
+}
+
+
/* 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. PARAMETER is the symbol of the frame
@@ -156,11 +183,27 @@ get_frame_param (register struct frame *frame, Lisp_Object prop)
bool
frame_inhibit_resize (struct frame *f, bool horizontal, Lisp_Object parameter)
{
- 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));
+ Lisp_Object fullscreen = get_frame_param (f, Qfullscreen);
+ bool inhibit
+ = ((f->after_make_frame
+ && (EQ (frame_inhibit_implied_resize, Qt)
+ || (CONSP (frame_inhibit_implied_resize)
+ && !NILP (Fmemq (parameter, frame_inhibit_implied_resize)))))
+ || (horizontal
+ && !EQ (fullscreen, Qnil) && !EQ (fullscreen, Qfullheight))
+ || (!horizontal
+ && !EQ (fullscreen, Qnil) && !EQ (fullscreen, Qfullwidth))
+ || FRAME_TERMCAP_P (f) || FRAME_MSDOS_P (f));
+
+ if (inhibit && !FRAME_TERMCAP_P (f) && !FRAME_MSDOS_P (f))
+ frame_size_history_add
+ (f, Qframe_inhibit_resize, 0, 0,
+ list5 (horizontal ? Qt : Qnil, parameter,
+ f->after_make_frame ? Qt : Qnil,
+ frame_inhibit_implied_resize,
+ fullscreen));
+
+ return inhibit;
}
static void
@@ -369,18 +412,9 @@ adjust_frame_size (struct frame *f, int new_width, int new_height, int inhibit,
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)));
+ frame_size_history_add
+ (f, Qadjust_frame_size_1, new_text_width, new_text_height,
+ list2 (parameter, make_number (inhibit)));
/* The following two values are calculated from the old window body
sizes and any "new" settings for scroll bars, dividers, fringes and
@@ -391,7 +425,7 @@ adjust_frame_size (struct frame *f, int new_width, int new_height, int inhibit,
= frame_windows_min_size (frame, Qnil, (inhibit == 5) ? Qt : Qnil, Qt);
if (inhibit >= 2 && inhibit <= 4)
- /* If INHIBIT is in [2..4] inhibit if the "old" window sizes stay
+ /* When INHIBIT is in [2..4] inhibit if the "old" window sizes stay
within the limits and either frame_inhibit_resize tells us to do
so or INHIBIT equals 4. */
{
@@ -449,16 +483,10 @@ adjust_frame_size (struct frame *f, int new_width, int new_height, int inhibit,
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)));
+ frame_size_history_add
+ (f, Qadjust_frame_size_2, new_text_width, new_text_height,
+ list2 (inhibit_horizontal ? Qt : Qnil,
+ inhibit_vertical ? Qt : Qnil));
x_set_window_size (f, 0, new_text_width, new_text_height, 1);
f->resized_p = true;
@@ -525,6 +553,11 @@ adjust_frame_size (struct frame *f, int new_width, int new_height, int inhibit,
FrameRows (FRAME_TTY (f)) = new_lines + FRAME_TOP_MARGIN (f);
}
+ frame_size_history_add
+ (f, Qadjust_frame_size_3, new_text_width, new_text_height,
+ list4 (make_number (old_pixel_width), make_number (old_pixel_height),
+ make_number (new_pixel_width), make_number (new_pixel_height)));
+
/* Assign new sizes. */
FRAME_TEXT_WIDTH (f) = new_text_width;
FRAME_TEXT_HEIGHT (f) = new_text_height;
@@ -533,17 +566,6 @@ adjust_frame_size (struct frame *f, int new_width, int new_height, int inhibit,
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;
@@ -608,7 +630,7 @@ make_frame (bool mini_p)
f->redisplay = true;
f->garbaged = true;
f->can_x_set_window_size = false;
- f->can_run_window_configuration_change_hook = false;
+ f->after_make_frame = false;
f->tool_bar_redisplayed_once = false;
f->column_width = 1; /* !FRAME_WINDOW_P value. */
f->line_height = 1; /* !FRAME_WINDOW_P value. */
@@ -1020,7 +1042,8 @@ 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, Qnil);
+ adjust_frame_size (f, width, height - FRAME_MENU_BAR_LINES (f),
+ 5, 0, Qterminal_frame);
}
adjust_frame_glyphs (f);
@@ -2260,24 +2283,25 @@ If there is no window system support, this function does nothing. */)
return Qnil;
}
-DEFUN ("frame-can-run-window-configuration-change-hook",
- Fcan_run_window_configuration_change_hook,
- Scan_run_window_configuration_change_hook, 2, 2, 0,
- doc: /* Whether `window-configuration-change-hook' is run for frame FRAME.
-FRAME nil means use the selected frame. Second argument ALLOW non-nil
+DEFUN ("frame-after-make-frame",
+ Fframe_after_make_frame,
+ Sframe_after_make_frame, 2, 2, 0,
+ doc: /* Mark FRAME as made.
+FRAME nil means use the selected frame. Second argument MADE non-nil
means functions on `window-configuration-change-hook' are called
-whenever the window configuration of FRAME changes. ALLOW nil means
+whenever the window configuration of FRAME changes. MADE nil means
these functions are not called.
-This function is currently called by `face-set-after-frame-default' only
-and should be otherwise used with utter care to avoid that running
-functions on `window-configuration-change-hook' is impeded forever. */)
- (Lisp_Object frame, Lisp_Object allow)
+This function is currently called by `make-frame' only and should be
+otherwise used with utter care to avoid that running functions on
+`window-configuration-change-hook' is impeded forever. */)
+ (Lisp_Object frame, Lisp_Object made)
{
struct frame *f = decode_live_frame (frame);
- f->can_run_window_configuration_change_hook = NILP (allow) ? false : true;
- return Qnil;
+ f->after_make_frame = NILP (made) ? false : true;
+
+ return made;
}
@@ -3037,7 +3061,7 @@ x_set_frame_parameters (struct frame *f, Lisp_Object alist)
set them both at once. So we wait until we've looked at the
entire list before we set them. */
int width IF_LINT (= 0), height IF_LINT (= 0);
- bool width_change = 0, height_change = 0;
+ bool width_change = false, height_change = false;
/* Same here. */
Lisp_Object left, top;
@@ -3045,6 +3069,10 @@ x_set_frame_parameters (struct frame *f, Lisp_Object alist)
/* Same with these. */
Lisp_Object icon_left, icon_top;
+ /* And with this. */
+ Lisp_Object fullscreen;
+ bool fullscreen_change = false;
+
/* Record in these vectors all the parms specified. */
Lisp_Object *parms;
Lisp_Object *values;
@@ -3138,6 +3166,11 @@ x_set_frame_parameters (struct frame *f, Lisp_Object alist)
icon_top = val;
else if (EQ (prop, Qicon_left))
icon_left = val;
+ else if (EQ (prop, Qfullscreen))
+ {
+ fullscreen = val;
+ fullscreen_change = true;
+ }
else if (EQ (prop, Qforeground_color)
|| EQ (prop, Qbackground_color)
|| EQ (prop, Qfont))
@@ -3218,14 +3251,14 @@ x_set_frame_parameters (struct frame *f, Lisp_Object alist)
that here since otherwise a size change implied by an
intermittent font change may get lost as in Bug#17142. */
if (!width_change)
- width = (f->new_width
+ width = ((f->can_x_set_window_size && f->new_width)
? (f->new_pixelwise
? f->new_width
: (f->new_width * FRAME_COLUMN_WIDTH (f)))
: FRAME_TEXT_WIDTH (f));
if (!height_change)
- height = (f->new_height
+ height = ((f->can_x_set_window_size && f->new_height)
? (f->new_pixelwise
? f->new_height
: (f->new_height * FRAME_LINE_HEIGHT (f)))
@@ -3298,6 +3331,20 @@ x_set_frame_parameters (struct frame *f, Lisp_Object alist)
/* Actually set that position, and convert to absolute. */
x_set_offset (f, leftpos, toppos, -1);
}
+
+ if (fullscreen_change)
+ {
+ Lisp_Object old_value = get_frame_param (f, Qfullscreen);
+
+ frame_size_history_add
+ (f, Qx_set_fullscreen, 0, 0, list2 (old_value, fullscreen));
+
+ store_frame_param (f, Qfullscreen, fullscreen);
+ if (!EQ (fullscreen, old_value))
+ x_set_fullscreen (f, fullscreen, old_value);
+ }
+
+
#ifdef HAVE_X_WINDOWS
if ((!NILP (icon_left) || !NILP (icon_top))
&& ! (icon_left_no_change && icon_top_no_change))
@@ -4834,11 +4881,33 @@ syms_of_frame (void)
DEFSYM (Qtool_bar_external, "tool-bar-external");
DEFSYM (Qtool_bar_size, "tool-bar-size");
DEFSYM (Qframe_inner_size, "frame-inner-size");
+ /* The following are used for frame_size_history. */
+ DEFSYM (Qadjust_frame_size_1, "adjust-frame-size-1");
+ DEFSYM (Qadjust_frame_size_2, "adjust-frame-size-2");
+ DEFSYM (Qadjust_frame_size_3, "adjust-frame-size-3");
+ DEFSYM (QEmacsFrameResize, "EmacsFrameResize");
+ DEFSYM (Qframe_inhibit_resize, "frame-inhibit-resize");
+ DEFSYM (Qx_set_fullscreen, "x-set-fullscreen");
+ DEFSYM (Qx_check_fullscreen, "x-check-fullscreen");
+ DEFSYM (Qx_set_window_size_1, "x-set-window-size-1");
+ DEFSYM (Qxg_frame_resized, "xg-frame-resized");
+ DEFSYM (Qxg_frame_set_char_size_1, "xg-frame-set-char-size-1");
+ DEFSYM (Qxg_frame_set_char_size_2, "xg-frame-set-char-size-2");
+ DEFSYM (Qxg_frame_set_char_size_3, "xg-frame-set-char-size-3");
+ DEFSYM (Qxg_change_toolbar_position, "xg-change-toolbar-position");
+ DEFSYM (Qx_net_wm_state, "x-net-wm-state");
+ DEFSYM (Qx_handle_net_wm_state, "x-handle-net-wm-state");
+ DEFSYM (Qtb_size_cb, "tb-size-cb");
+ DEFSYM (Qupdate_frame_tool_bar, "update-frame-tool-bar");
+ DEFSYM (Qfree_frame_tool_bar, "free-frame-tool-bar");
+
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");
+ DEFSYM (Qtip_frame, "tip-frame");
+ DEFSYM (Qterminal_frame, "terminal-frame");
#ifdef HAVE_NS
DEFSYM (Qns_parse_geometry, "ns-parse-geometry");
@@ -5106,9 +5175,22 @@ even if this option is non-nil. */);
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;
+ DEFVAR_LISP ("frame-size-history", frame_size_history,
+ doc: /* History of frame size adjustments.
+If non-nil, list recording frame size adjustment. Adjustments are
+recorded only if the first element of this list is a positive number.
+Adding an adjustment decrements that number by one.
+
+The remaining elements are the adjustments. Each adjustment is a list
+of four elements `frame', `function', `sizes' and `more'. `frame' is
+the affected frame and `function' the invoking function. `sizes' is
+usually a list of four elements `old-width', `old-height', `new-width'
+and `new-height' representing the old and new sizes recorded/requested
+by `function'. `more' is a list with additional information.
+
+The function `frame--size-history' displays the value of this variable
+in a more readable form. */);
+ frame_size_history = Qnil;
staticpro (&Vframe_list);
@@ -5141,7 +5223,7 @@ even if this option is non-nil. */);
defsubr (&Sraise_frame);
defsubr (&Slower_frame);
defsubr (&Sx_focus_frame);
- defsubr (&Scan_run_window_configuration_change_hook);
+ defsubr (&Sframe_after_make_frame);
defsubr (&Sredirect_frame_focus);
defsubr (&Sframe_focus);
defsubr (&Sframe_parameters);