X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/d4aca72ead4c1e53819e6e3249e26400a9879a0e..45577d548d3abfe504d3f936b3c9b997d0cf7f9c:/src/widget.c
diff --git a/src/widget.c b/src/widget.c
index 0986ba61db..28bb475ddf 100644
--- a/src/widget.c
+++ b/src/widget.c
@@ -1,12 +1,12 @@
/* The emacs frame widget.
- Copyright (C) 1992-1993, 2000-2015 Free Software Foundation, Inc.
+ Copyright (C) 1992-1993, 2000-2016 Free Software Foundation, Inc.
This file is part of GNU Emacs.
GNU Emacs is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
GNU Emacs is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -29,17 +29,13 @@ along with GNU Emacs. If not, see . */
*/
#include
+#include "widget.h"
+
#include
#include "lisp.h"
#include "xterm.h"
-
-#include "keyboard.h"
#include "frame.h"
-#include "window.h"
-
-#include "dispextern.h"
-#include "blockinput.h"
#include
#include
@@ -50,10 +46,6 @@ along with GNU Emacs. If not, see . */
#include
#include "../lwlib/lwlib.h"
-#include "character.h"
-#include "font.h"
-
-
static void EmacsFrameInitialize (Widget request, Widget new, ArgList dum1, Cardinal *dum2);
static void EmacsFrameDestroy (Widget widget);
static void EmacsFrameRealize (Widget widget, XtValueMask *mask, XSetWindowAttributes *attrs);
@@ -268,167 +260,26 @@ set_frame_size (EmacsFrame ew)
*/
/* Hairily merged geometry */
- int w = FRAME_COLS (ew->emacs_frame.frame);
- int h = FRAME_LINES (ew->emacs_frame.frame);
-
+ struct frame *f = ew->emacs_frame.frame;
+ int w = FRAME_COLS (f);
+ int h = FRAME_LINES (f);
Widget wmshell = get_wm_shell ((Widget) ew);
+ Dimension pixel_width, pixel_height;
/* Each Emacs shell is now independent and top-level. */
if (! XtIsSubclass (wmshell, shellWidgetClass)) emacs_abort ();
- /* We don't need this for the moment. The geometry is computed in
- xfns.c. */
-#if 0
- /* If the EmacsFrame doesn't have a geometry but the shell does,
- treat that as the geometry of the frame. (Is this bogus?
- I'm not sure.) */
- if (ew->emacs_frame.geometry == 0)
- XtVaGetValues (wmshell, XtNgeometry, &ew->emacs_frame.geometry, NULL);
-
- /* If the Shell is iconic, then the EmacsFrame is iconic. (Is
- this bogus? I'm not sure.) */
- if (!ew->emacs_frame.iconic)
- XtVaGetValues (wmshell, XtNiconic, &ew->emacs_frame.iconic, NULL);
-
-
- {
- char *geom = 0;
- XtVaGetValues (app_shell, XtNgeometry, &geom, NULL);
- if (geom)
- app_flags = XParseGeometry (geom, &app_x, &app_y, &app_w, &app_h);
- }
-
- if (ew->emacs_frame.geometry)
- frame_flags = XParseGeometry (ew->emacs_frame.geometry,
- &frame_x, &frame_y,
- &frame_w, &frame_h);
-
- if (first_frame_p)
- {
- /* If this is the first frame created:
- ====================================
-
- - Use the ApplicationShell's size/position, if specified.
- (This is "Emacs.geometry", or the "-geometry" command line arg.)
- - Else use the EmacsFrame's size/position.
- (This is "*Frame-NAME.geometry")
-
- - If the AppShell is iconic, the frame should be iconic.
-
- AppShell comes first so that -geometry always applies to the first
- frame created, even if there is an "every frame" entry in the
- resource database.
- */
- if (app_flags & (XValue | YValue))
- {
- x = app_x; y = app_y;
- flags |= (app_flags & (XValue | YValue | XNegative | YNegative));
- }
- else if (frame_flags & (XValue | YValue))
- {
- x = frame_x; y = frame_y;
- flags |= (frame_flags & (XValue | YValue | XNegative | YNegative));
- }
-
- if (app_flags & (WidthValue | HeightValue))
- {
- w = app_w; h = app_h;
- flags |= (app_flags & (WidthValue | HeightValue));
- }
- else if (frame_flags & (WidthValue | HeightValue))
- {
- w = frame_w; h = frame_h;
- flags |= (frame_flags & (WidthValue | HeightValue));
- }
-
- /* If the AppShell is iconic, then the EmacsFrame is iconic. */
- if (!ew->emacs_frame.iconic)
- XtVaGetValues (app_shell, XtNiconic, &ew->emacs_frame.iconic, NULL);
+ char_to_pixel_size (ew, w, h, &pixel_width, &pixel_height);
+ ew->core.width = (frame_resize_pixelwise
+ ? FRAME_PIXEL_WIDTH (f)
+ : pixel_width);
+ ew->core.height = (frame_resize_pixelwise
+ ? FRAME_PIXEL_HEIGHT (f)
+ : pixel_height);
- first_frame_p = False;
- }
- else
- {
- /* If this is not the first frame created:
- ========================================
-
- - use the EmacsFrame's size/position if specified
- - Otherwise, use the ApplicationShell's size, but not position.
-
- So that means that one can specify the position of the first frame
- with "Emacs.geometry" or `-geometry'; but can only specify the
- position of subsequent frames with "*Frame-NAME.geometry".
-
- AppShell comes second so that -geometry does not apply to subsequent
- frames when there is an "every frame" entry in the resource db,
- but does apply to the first frame.
- */
- if (frame_flags & (XValue | YValue))
- {
- x = frame_x; y = frame_y;
- flags |= (frame_flags & (XValue | YValue | XNegative | YNegative));
- }
-
- if (frame_flags & (WidthValue | HeightValue))
- {
- w = frame_w; h = frame_h;
- flags |= (frame_flags & (WidthValue | HeightValue));
- }
- else if (app_flags & (WidthValue | HeightValue))
- {
- w = app_w;
- h = app_h;
- flags |= (app_flags & (WidthValue | HeightValue));
- }
- }
-#endif /* 0 */
- {
- Dimension pixel_width, pixel_height;
-
- /* Take into account the size of the scrollbar. Always use the
- number of columns occupied by the scroll bar here otherwise we
- 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. */
-
-#if 0 /* This can run Lisp code, and it is dangerous to give
- out the frame to Lisp code before it officially exists.
- This is handled in Fx_create_frame so not needed here. */
- change_frame_size (f, w, h, 1, 0, 0, 0);
-#endif
- char_to_pixel_size (ew, w, h, &pixel_width, &pixel_height);
- ew->core.width = pixel_width;
- ew->core.height = pixel_height;
-
-#if 0 /* xfns.c takes care of this now. */
- /* If a position was specified, assign it to the shell widget.
- (Else WM won't do anything with it.)
- */
- if (flags & (XValue | YValue))
- {
- /* the tricky things with the sign is to make sure that
- -0 is printed -0. */
- sprintf (shell_position, "=%c%d%c%d",
- flags & XNegative ? '-' : '+', x < 0 ? -x : x,
- flags & YNegative ? '-' : '+', y < 0 ? -y : y);
- XtVaSetValues (wmshell, XtNgeometry, xstrdup (shell_position), NULL);
- }
- else if (flags & (WidthValue | HeightValue))
- {
- sprintf (shell_position, "=%dx%d", pixel_width, pixel_height);
- XtVaSetValues (wmshell, XtNgeometry, xstrdup (shell_position), NULL);
- }
-
- /* If the geometry spec we're using has W/H components, mark the size
- in the WM_SIZE_HINTS as user specified. */
- if (flags & (WidthValue | HeightValue))
- mark_shell_size_user_specified (wmshell);
-
- /* Also assign the iconic status of the frame to the Shell, so that
- the WM sees it. */
- XtVaSetValues (wmshell, XtNiconic, ew->emacs_frame.iconic, NULL);
-#endif /* 0 */
- }
+ frame_size_history_add
+ (f, Qset_frame_size, FRAME_TEXT_WIDTH (f), FRAME_TEXT_HEIGHT (f),
+ list2 (make_number (ew->core.width), make_number (ew->core.height)));
}
static void
@@ -486,16 +337,6 @@ update_various_frame_slots (EmacsFrame ew)
{
struct frame *f = ew->emacs_frame.frame;
- /* Don't do that: It confuses the check in change_frame_size_1 whether
- the pixel size of the frame changed due to a change of the internal
- border width. Bug#16736. */
- if (false)
- {
- struct x_output *x = f->output_data.x;
- FRAME_PIXEL_HEIGHT (f) = ew->core.height + x->menubar_height;
- FRAME_PIXEL_WIDTH (f) = ew->core.width;
- }
-
f->internal_border_width = ew->emacs_frame.internal_border_width;
}
@@ -504,6 +345,7 @@ update_from_various_frame_slots (EmacsFrame ew)
{
struct frame *f = ew->emacs_frame.frame;
struct x_output *x = f->output_data.x;
+
ew->core.height = FRAME_PIXEL_HEIGHT (f) - x->menubar_height;
ew->core.width = FRAME_PIXEL_WIDTH (f);
ew->core.background_pixel = FRAME_BACKGROUND_PIXEL (f);
@@ -576,7 +418,10 @@ EmacsFrameResize (Widget widget)
frame_size_history_add
(f, QEmacsFrameResize, width, height,
- list2 (make_number (ew->core.width), make_number (ew->core.height)));
+ list5 (make_number (ew->core.width), make_number (ew->core.height),
+ make_number (FRAME_TOP_MARGIN_HEIGHT (f)),
+ make_number (FRAME_SCROLL_BAR_AREA_HEIGHT (f)),
+ make_number (2 * FRAME_INTERNAL_BORDER_WIDTH (f))));
change_frame_size (f, width, height, 0, 1, 0, 1);
@@ -596,11 +441,12 @@ EmacsFrameQueryGeometry (Widget widget, XtWidgetGeometry *request, XtWidgetGeome
if (mask & (CWWidth | CWHeight))
{
- round_size_to_char (ew,
- (mask & CWWidth) ? request->width : ew->core.width,
- ((mask & CWHeight) ? request->height
- : ew->core.height),
- &ok_width, &ok_height);
+ if (!frame_resize_pixelwise)
+ round_size_to_char (ew,
+ (mask & CWWidth) ? request->width : ew->core.width,
+ ((mask & CWHeight) ? request->height
+ : ew->core.height),
+ &ok_width, &ok_height);
if ((mask & CWWidth) && (ok_width != request->width))
{
result->request_mode |= CWWidth;