diff options
| -rw-r--r-- | doc/emacs/ChangeLog | 7 | ||||
| -rw-r--r-- | doc/emacs/cmdargs.texi | 15 | ||||
| -rw-r--r-- | doc/emacs/xresources.texi | 4 | ||||
| -rw-r--r-- | doc/lispref/ChangeLog | 4 | ||||
| -rw-r--r-- | doc/lispref/frames.texi | 12 | ||||
| -rw-r--r-- | etc/ChangeLog | 4 | ||||
| -rw-r--r-- | etc/NEWS | 5 | ||||
| -rw-r--r-- | lisp/ChangeLog | 4 | ||||
| -rw-r--r-- | lisp/startup.el | 2 | ||||
| -rw-r--r-- | src/ChangeLog | 37 | ||||
| -rw-r--r-- | src/emacs.c | 2 | ||||
| -rw-r--r-- | src/frame.c | 108 | ||||
| -rw-r--r-- | src/frame.h | 13 | ||||
| -rw-r--r-- | src/gtkutil.c | 116 | ||||
| -rw-r--r-- | src/xterm.c | 162 | 
15 files changed, 226 insertions, 269 deletions
diff --git a/doc/emacs/ChangeLog b/doc/emacs/ChangeLog index c3cd2ed798f..7aa53be2d99 100644 --- a/doc/emacs/ChangeLog +++ b/doc/emacs/ChangeLog @@ -1,3 +1,10 @@ +2009-07-01  Jan Djärv  <jan.h.d@swipnet.se> + +	* xresources.texi (Table of Resources): Mention maximized for +	fullscreen. + +	* cmdargs.texi (Window Size X): -mm/--maximized is new. +  2009-07-01  Chong Yidong  <cyd@stupidchicken.com>  	* anti.texi (Antinews): Correct the list of removed platforms. diff --git a/doc/emacs/cmdargs.texi b/doc/emacs/cmdargs.texi index 2d4d8b3d1a1..1438c19c123 100644 --- a/doc/emacs/cmdargs.texi +++ b/doc/emacs/cmdargs.texi @@ -1184,7 +1184,16 @@ the initial frame.  @itemx --fullscreen  @opindex --fullscreen  @cindex fullscreen, command-line argument -Specify that width and height shall be the size of the screen. +Specify that width and height shall be the size of the screen. Normally +no window manager decorations are shown. + +@item -mm +@opindex -mm +@itemx --maximized +@opindex --maximized +@cindex maximized, command-line argument +Specify that the Emacs frame shall be maximized.  This normally +means that the frame has window manager decorations.  @item -fh  @opindex -fh @@ -1258,8 +1267,8 @@ size with no tool bar, use an X resource to specify ``no tool bar''  (@pxref{Table of Resources}); then Emacs will already know there's no  tool bar when it processes the specified geometry. -  When using one of @samp{--fullscreen}, @samp{--fullwidth} or -@samp{--fullheight} there may be some space around the frame +  When using one of @samp{--fullscreen}, @samp{--maximized}, @samp{--fullwidth} +or @samp{--fullheight} there may be some space around the frame  anyway.  That is because Emacs rounds the sizes so they are an  even number of character heights and widths. diff --git a/doc/emacs/xresources.texi b/doc/emacs/xresources.texi index a2deb1530ae..f471b9dd148 100644 --- a/doc/emacs/xresources.texi +++ b/doc/emacs/xresources.texi @@ -217,8 +217,8 @@ all frames.  @ifnottex  @item @code{fullscreen} (class @code{Fullscreen})  The desired fullscreen size.  The value can be one of @code{fullboth}, -@code{fullwidth} or @code{fullheight}, which correspond to -the command-line options @samp{-fs}, @samp{-fw}, and @samp{-fh} +@code{maximized}, @code{fullwidth} or @code{fullheight}, which correspond to +the command-line options @samp{-fs}, @samp{-mm}, @samp{-fw}, and @samp{-fh}  (@pxref{Window Size X}).  Note that this applies to the initial frame only. diff --git a/doc/lispref/ChangeLog b/doc/lispref/ChangeLog index dbff044e68c..e985de0cc37 100644 --- a/doc/lispref/ChangeLog +++ b/doc/lispref/ChangeLog @@ -1,3 +1,7 @@ +2009-07-01  Jan Djärv  <jan.h.d@swipnet.se> + +	* frames.texi (Size Parameters): Mention maximized for fullscreen. +  2009-06-24  Chong Yidong  <cyd@stupidchicken.com>  	* display.texi (Window Systems): Add ns to the list. diff --git a/doc/lispref/frames.texi b/doc/lispref/frames.texi index 87127c9cd66..85bf2bb75e7 100644 --- a/doc/lispref/frames.texi +++ b/doc/lispref/frames.texi @@ -609,11 +609,15 @@ the @code{user-position} parameter (see above) does for the position  parameters @code{top} and @code{left}.  @item fullscreen -Specify that width, height or both shall be set to the size of the screen. -The value @code{fullwidth} specifies that width shall be the size of the -screen.  The value @code{fullheight} specifies that height shall be the -size of the screen.  The value @code{fullboth} specifies that both the +Specify that width, height or both shall be maximized. +The value @code{fullwidth} specifies that width shall as wide as possible. +The value @code{fullheight} specifies that height shall be as tall as +possible.  The value @code{fullboth} specifies that both the  width and the height shall be set to the size of the screen. +The value @code{maximized} specifies that the frame shall be maximized. +The difference between @code{maximized} and @code{fullboth} is that +the first does have window manager decorations but the second does not +and thus really covers the whole screen.  @end table  @node Layout Parameters diff --git a/etc/ChangeLog b/etc/ChangeLog index 71edd4cde44..f376af7554d 100644 --- a/etc/ChangeLog +++ b/etc/ChangeLog @@ -1,3 +1,7 @@ +2009-07-01  Jan Djärv  <jan.h.d@swipnet.se> + +	* NEWS: Mention maximized. +  2009-06-30  Michael Albinus  <michael.albinus@gmx.de>  	* NEWS: Add "synce" connection method of Tramp. @@ -30,6 +30,11 @@ freedesktop.org specifications, the same method used by the Gnome,  KDE, and XFCE desktops.  (This change has no effect on Windows, which  uses `system-move-file-to-trash' for trashing.) ++++ +** Emacs frames can be maximized. +The command line arguments -mm/--maximized and the value maximized to the +frame parameter fullscreen makes the Emacs frame maximized. +  * Changes in Specialized Modes and Packages in Emacs 23.2 diff --git a/lisp/ChangeLog b/lisp/ChangeLog index f2327532354..c2d602380c1 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,7 @@ +2009-07-01  Jan Djärv  <jan.h.d@swipnet.se> + +	* startup.el (command-line-x-option-alist): Add -mm and --maximized. +  2009-07-01  Eduard Wiebe  <usenet@pusto.de>  (tiny change)  	* language/korean.el (set-language-info-alist): Add korean-cp949, diff --git a/lisp/startup.el b/lisp/startup.el index 15e65bd9eb4..c28a2fe599c 100644 --- a/lisp/startup.el +++ b/lisp/startup.el @@ -134,6 +134,7 @@ This is normally copied from `default-directory' when Emacs starts.")      ("-fs" 0 x-handle-initial-switch fullscreen fullboth)      ("-fw" 0 x-handle-initial-switch fullscreen fullwidth)      ("-fh" 0 x-handle-initial-switch fullscreen fullheight) +    ("-mm" 0 x-handle-initial-switch fullscreen maximized)      ("-ib" 1 x-handle-numeric-switch internal-border-width)      ("-g" 1 x-handle-geometry)      ("-lsp" 1 x-handle-numeric-switch line-spacing) @@ -159,6 +160,7 @@ This is normally copied from `default-directory' when Emacs starts.")      ("--fullscreen" 0 x-handle-initial-switch fullscreen fullboth)      ("--fullwidth" 0 x-handle-initial-switch fullscreen fullwidth)      ("--fullheight" 0 x-handle-initial-switch fullscreen fullheight) +    ("--maximized" 0 x-handle-initial-switch fullscreen maximized)      ("--internal-border" 1 x-handle-numeric-switch internal-border-width)      ("--geometry" 1 x-handle-geometry)      ("--foreground-color" 1 x-handle-switch foreground-color) diff --git a/src/ChangeLog b/src/ChangeLog index 61d2d1b7eba..9108cd39cc6 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,40 @@ +2009-07-01  Jan Djärv  <jan.h.d@swipnet.se> + +	* emacs.c (USAGE3, standard_args): Add -mm and --maximized. + +	* frame.c: Qmaximized is new. +	(x_set_frame_parameters): Do not handle fullscreen specially. +	Only set width and height if explicitly set. +	(x_set_fullscreen): Handle Qmaximized. +	(x_set_font, x_figure_window_size): Do not handle fullscreen specially. +	(syms_of_frame): Initialize Qmaximized. + +	* frame.h (fullscreen_type): Add FULLSCREEN_MAXIMIZED.  Declare +	Qfullwidth, Qfullheight, Qfullboth, Qmaximized. + +	* xterm.c (handle_one_xevent): Remove call to x_check_fullscreen +	for Expose event. Add call to x_check_fullscreen for MapNotify event. +	Remove all code w.r.t. fullscreen from ConfigureNotify event. Do not +	set gravity to NorthWestGravity when USE_GTK. +	(set_wm_state): New function. +	(do_ewmh_fullscreen): Use set_wm_state. Also handle FULLSCREEN_MAXIMIZED. +	(x_handle_net_wm_state): Handle FULLSCREEN_MAXIMIZED. +	(x_check_fullscreen): Simplify so we only handle EMWH type of fullscreen +	or the case when no window manager is running. That means remove calls +	to x_real_positions and x_fullscreen_adjust. + +	* gtkutil.c (flush_and_sync, x_wm_size_hint_off): Remove. +	(xg_frame_set_char_size): Remove calls to x_wm_size_hint_off and +	flush_and_sync. +	(xg_height_changed): New function. +	(xg_create_frame_widgets): Remove call to gtk_widget_set_size_request +	and gtk_window_set_policy.  Set frame gravity after parsing the geometry +	string. +	(xg_update_frame_menubar, free_frame_menubar) +	(xg_tool_bar_detach_callback, xg_tool_bar_attach_callback) +	(update_frame_tool_bar, free_frame_tool_bar): Call xg_height_changed. +	Remove calls to xg_frame_set_char_size. +  2009-07-01  Kenichi Handa  <handa@m17n.org>  	* keyboard.c (decode_keyboard_code): New function. diff --git a/src/emacs.c b/src/emacs.c index e6af0974c2a..7e9373d305c 100644 --- a/src/emacs.c +++ b/src/emacs.c @@ -321,6 +321,7 @@ Display options:\n\  --fullheight, -fh               make the first frame high as the screen\n\  --fullscreen, -fs               make first frame fullscreen\n\  --fullwidth, -fw                make the first frame wide as the screen\n\ +--maximized, -mm                make the first frame maximized\n\  --geometry, -g GEOMETRY         window geometry\n\  --no-bitmap-icon, -nbi          do not use picture of gnu for Emacs icon\n\  --iconic                        start Emacs in iconified state\n\ @@ -1917,6 +1918,7 @@ struct standard_args standard_args[] =    { "-fs", "--fullscreen", 10, 0 },    { "-fw", "--fullwidth", 10, 0 },    { "-fh", "--fullheight", 10, 0 }, +  { "-mm", "--maximized", 10, 0 },    { "-g", "--geometry", 10, 1 },    { "-geometry", 0, 10, 1 },    { "-T", "--title", 10, 1 }, diff --git a/src/frame.c b/src/frame.c index 9e05b1b8456..fa2807c150a 100644 --- a/src/frame.c +++ b/src/frame.c @@ -120,7 +120,7 @@ Lisp_Object Qbuffer_predicate, Qbuffer_list, Qburied_buffer_list;  Lisp_Object Qtty_color_mode;  Lisp_Object Qtty, Qtty_type; -Lisp_Object Qfullscreen, Qfullwidth, Qfullheight, Qfullboth; +Lisp_Object Qfullscreen, Qfullwidth, Qfullheight, Qfullboth, Qmaximized;  Lisp_Object Qfont_backend;  Lisp_Object Qalpha; @@ -2930,11 +2930,7 @@ x_set_frame_parameters (f, alist)    int i, p;    int left_no_change = 0, top_no_change = 0;    int icon_left_no_change = 0, icon_top_no_change = 0; -  int fullscreen_is_being_set = 0; -  int height_for_full_width = 0; -  int width_for_full_height = 0; -  enum fullscreen_type fullscreen_wanted = FULLSCREEN_NONE; - +  int size_changed = 0;    struct gcpro gcpro1, gcpro2;    i = 0; @@ -2976,7 +2972,6 @@ x_set_frame_parameters (f, alist)       They are independent of other properties, but other properties (e.g.,       cursor_color) are dependent upon them.  */    /* Process default font as well, since fringe widths depends on it.  */ -  /* Also, process fullscreen, width and height depend upon that.  */    for (p = 0; p < i; p++)      {        Lisp_Object prop, val; @@ -2985,26 +2980,11 @@ x_set_frame_parameters (f, alist)        val = values[p];        if (EQ (prop, Qforeground_color)  	  || EQ (prop, Qbackground_color) -	  || EQ (prop, Qfont) -          || EQ (prop, Qfullscreen)) +	  || EQ (prop, Qfont))  	{  	  register Lisp_Object param_index, old_value; -	  if (EQ (prop, Qfullscreen)) -	    { -	      /* The parameter handler can reset f->want_fullscreen to -	         FULLSCREEN_NONE.  But we need the requested value later -	         to decide whether a height or width parameter shall be -	         applied.  Therefore, we remember the requested value in -	         fullscreen_wanted for the following two cases.  */  -	      if (EQ (val, Qfullheight)) -		fullscreen_wanted = FULLSCREEN_HEIGHT; -	      else if (EQ (val, Qfullwidth)) -		fullscreen_wanted = FULLSCREEN_WIDTH; -	    } -  	  old_value = get_frame_param (f, prop); - 	  fullscreen_is_being_set |= EQ (prop, Qfullscreen);  	  if (NILP (Fequal (val, old_value)))  	    {  	      store_frame_param (f, prop, val); @@ -3028,9 +3008,15 @@ x_set_frame_parameters (f, alist)        val = values[i];        if (EQ (prop, Qwidth) && NATNUMP (val)) -	width_for_full_height = width = XFASTINT (val); +        { +          size_changed = 1; +          width = XFASTINT (val); +        }        else if (EQ (prop, Qheight) && NATNUMP (val)) -	height_for_full_width = height = XFASTINT (val); +        { +          size_changed = 1; +          height = XFASTINT (val); +        }        else if (EQ (prop, Qtop))  	top = val;        else if (EQ (prop, Qleft)) @@ -3041,8 +3027,7 @@ x_set_frame_parameters (f, alist)  	icon_left = val;        else if (EQ (prop, Qforeground_color)  	       || EQ (prop, Qbackground_color) -	       || EQ (prop, Qfont) -               || EQ (prop, Qfullscreen)) +	       || EQ (prop, Qfont))  	/* Processed above.  */  	continue;        else @@ -3096,31 +3081,6 @@ x_set_frame_parameters (f, alist)  	XSETINT (icon_top, 0);      } -  if (FRAME_VISIBLE_P (f) && fullscreen_is_being_set) -    { -      /* If the frame is visible already and the fullscreen parameter is -         being set, it is too late to set WM manager hints to specify -         size and position. -         Here we first get the width, height and position that applies to -         fullscreen.  We then move the frame to the appropriate -         position.  Resize of the frame is taken care of in the code after -         this if-statement. */ -      int new_left, new_top; - -      x_fullscreen_adjust (f, &width, &height, &new_top, &new_left); -      if (new_top != f->top_pos || new_left != f->left_pos) -        x_set_offset (f, new_left, new_top, 1); - -      /* When both height and fullwidth were requested, make sure the -	 requested value for height gets applied.  */ -      if (height_for_full_width && fullscreen_wanted == FULLSCREEN_WIDTH) -	height = height_for_full_width; -      /* When both width and fullheight were requested, make sure the -	 requested value for width gets applied.  */ -      if (width_for_full_height && fullscreen_wanted == FULLSCREEN_HEIGHT) -	width = width_for_full_height; -    } -    /* Don't set these parameters unless they've been explicitly       specified.  The window might be mapped or resized while we're in       this function, and we don't want to override that unless the lisp @@ -3136,10 +3096,11 @@ x_set_frame_parameters (f, alist)      XSETFRAME (frame, f); -    if (width != FRAME_COLS (f) -	|| height != FRAME_LINES (f) -	|| f->new_text_lines || f->new_text_cols) -      Fset_frame_size (frame, make_number (width), make_number (height)); +    if (size_changed +        && (width != FRAME_COLS (f) +            || height != FRAME_LINES (f) +            || f->new_text_lines || f->new_text_cols)) +        Fset_frame_size (frame, make_number (width), make_number (height));      if ((!NILP (left) || !NILP (top))  	&& ! (left_no_change && top_no_change) @@ -3299,12 +3260,14 @@ x_set_fullscreen (f, new_value, old_value)  {    if (NILP (new_value))      f->want_fullscreen = FULLSCREEN_NONE; -  else if (EQ (new_value, Qfullboth)) +  else if (EQ (new_value, Qfullboth) || EQ (new_value, Qfullscreen))      f->want_fullscreen = FULLSCREEN_BOTH;    else if (EQ (new_value, Qfullwidth))      f->want_fullscreen = FULLSCREEN_WIDTH;    else if (EQ (new_value, Qfullheight))      f->want_fullscreen = FULLSCREEN_HEIGHT; +  else if (EQ (new_value, Qmaximized)) +    f->want_fullscreen = FULLSCREEN_MAXIMIZED;    if (FRAME_TERMINAL (f)->fullscreen_hook != NULL)      FRAME_TERMINAL (f)->fullscreen_hook (f); @@ -3443,19 +3406,6 @@ x_set_font (f, arg, oldval)    if (CONSP (lval)) lval = CDR (lval);    x_new_font (f, font_object, fontset); -  /* If the fullscreen property is non-nil, adjust lines and columns so we -     keep the same pixel height and width.  */ -  if (! NILP (lval)) -    { -      int height = FRAME_LINES (f), width = FRAME_COLS (f); -      if (EQ (lval, Qfullboth) || EQ (lval, Qfullwidth)) -        width = FRAME_PIXEL_WIDTH_TO_TEXT_COLS (f, FRAME_PIXEL_WIDTH (f)); -      if (EQ (lval, Qfullboth) || EQ (lval, Qfullheight)) -        height = FRAME_PIXEL_HEIGHT_TO_TEXT_LINES (f, FRAME_PIXEL_HEIGHT (f)); -       -      change_frame_size (f, height, width, 0, 0, 1); -    } -    store_frame_param (f, Qfont, arg);    /* Recalculate toolbar height.  */    f->n_tool_bar_rows = 0; @@ -4374,22 +4324,6 @@ x_figure_window_size (f, parms, toolbar_p)  	window_prompting |= PPosition;      } -  if (f->want_fullscreen != FULLSCREEN_NONE) -    { -      int left, top; -      int width, height; - -      /* It takes both for some WM:s to place it where we want */ -      window_prompting |= USPosition | PPosition; -      x_fullscreen_adjust (f, &width, &height, &top, &left); -      FRAME_COLS (f) = width; -      FRAME_LINES (f) = height; -      FRAME_PIXEL_WIDTH (f) = FRAME_TEXT_COLS_TO_PIXEL_WIDTH (f, width); -      FRAME_PIXEL_HEIGHT (f) = FRAME_TEXT_LINES_TO_PIXEL_HEIGHT (f, height); -      f->left_pos = left; -      f->top_pos = top; -    } -    if (window_prompting & XNegative)      {        if (window_prompting & YNegative) @@ -4503,6 +4437,8 @@ syms_of_frame ()    staticpro (&Qfullheight);    Qfullboth = intern ("fullboth");    staticpro (&Qfullboth); +  Qmaximized = intern ("maximized"); +  staticpro (&Qmaximized);    Qx_resource_name = intern ("x-resource-name");    staticpro (&Qx_resource_name); diff --git a/src/frame.h b/src/frame.h index 9193da3edf3..808859e6612 100644 --- a/src/frame.h +++ b/src/frame.h @@ -75,12 +75,12 @@ enum text_cursor_kinds  enum fullscreen_type  { -  /* Values used as a bit mask, BOTH == WIDTH | HEIGHT.  */ -  FULLSCREEN_NONE       = 0, -  FULLSCREEN_WIDTH      = 1, -  FULLSCREEN_HEIGHT     = 2, -  FULLSCREEN_BOTH       = 3, -  FULLSCREEN_WAIT       = 4 +  FULLSCREEN_NONE, +  FULLSCREEN_WIDTH     = 0x001, +  FULLSCREEN_HEIGHT    = 0x002, +  FULLSCREEN_BOTH      = 0x003, +  FULLSCREEN_MAXIMIZED = 0x013, +  FULLSCREEN_WAIT      = 0x100  }; @@ -1038,6 +1038,7 @@ extern Lisp_Object Qscreen_gamma;  extern Lisp_Object Qline_spacing;  extern Lisp_Object Qwait_for_wm;  extern Lisp_Object Qfullscreen; +extern Lisp_Object Qfullwidth, Qfullheight, Qfullboth, Qmaximized;  extern Lisp_Object Qfont_backend;  extern Lisp_Object Qalpha; diff --git a/src/gtkutil.c b/src/gtkutil.c index 3ea7c14629a..1872aa74d39 100644 --- a/src/gtkutil.c +++ b/src/gtkutil.c @@ -308,7 +308,7 @@ xg_get_pixbuf_from_pix_and_mask (gpix, gmask, cmap)  }  static Lisp_Object -file_for_image(image) +file_for_image (image)       Lisp_Object image;  {    Lisp_Object specified_file = Qnil; @@ -655,48 +655,6 @@ xg_frame_resized (f, pixelwidth, pixelheight)      }  } -/* Process all pending events on the display for frame F.  */ - -static void -flush_and_sync (f) -     FRAME_PTR f; -{ -  gdk_window_process_all_updates (); -  x_sync (f); -  while (gtk_events_pending ()) -    { -      gtk_main_iteration (); -      gdk_window_process_all_updates (); -      x_sync (f); -    } -} - -/* Turn wm hints for resize off on frame F */ - -static void -x_wm_size_hint_off (f) -     FRAME_PTR f; -{ -  GdkGeometry size_hints; -  gint hint_flags = 0; -  memset (&size_hints, 0, sizeof (size_hints)); -  hint_flags |= GDK_HINT_RESIZE_INC | GDK_HINT_MIN_SIZE; -  size_hints.width_inc = 1; -  size_hints.height_inc = 1; -  hint_flags |= GDK_HINT_BASE_SIZE; -  size_hints.base_width = 1; -  size_hints.base_height = 1; -  size_hints.min_width  = 1; -  size_hints.min_height = 1; -  gtk_window_set_geometry_hints (GTK_WINDOW (FRAME_GTK_OUTER_WIDGET (f)), -                                 NULL, -                                 &size_hints, -                                 hint_flags); -  /* Make sure these get set again in next call to x_wm_set_size_hint. */ -  f->output_data.x->hint_flags &= ~hint_flags; -  flush_and_sync (f); -} -  /* Resize the outer window of frame F after chainging the height.     This happend when the menu bar or the tool bar is added or removed.     COLUMNS/ROWS is the size the edit area shall have after the resize.  */ @@ -729,13 +687,10 @@ xg_frame_set_char_size (f, cols, rows)    pixelwidth = FRAME_TEXT_COLS_TO_PIXEL_WIDTH (f, cols);    /* Must resize our top level widget.  Font size may have changed, -     but not rows/cols. -     Turn wm hints (min/max size and size increments) of temporarly. -     It interferes too much, when for example adding or removing the -     menu/tool bar.  */ -  x_wm_size_hint_off (f); +     but not rows/cols.  */    gtk_window_resize (GTK_WINDOW (FRAME_GTK_OUTER_WIDGET (f)),                       pixelwidth, pixelheight); +  x_wm_set_size_hint (f, 0, 0);    /* Now, strictly speaking, we can't be sure that this is accurate,       but the window manager will get around to dealing with the size @@ -759,7 +714,18 @@ xg_frame_set_char_size (f, cols, rows)       for, then the event won't cause the screen to become garbaged, so       we have to make sure to do it here.  */    SET_FRAME_GARBAGED (f); -  flush_and_sync (f); +} + +/* Handle height changes (i.e. add/remove menu/toolbar). +   The policy is to keep the number of editable lines.  */ + +static void +xg_height_changed (f) +     FRAME_PTR f; +{ +  gtk_window_resize (GTK_WINDOW (FRAME_GTK_OUTER_WIDGET (f)), +                     FRAME_PIXEL_WIDTH (f), FRAME_TOTAL_PIXEL_HEIGHT (f)); +  f->output_data.x->hint_flags = 0;    x_wm_set_size_hint (f, 0, 0);  } @@ -859,9 +825,6 @@ xg_create_frame_widgets (f)    gtk_fixed_set_has_window (GTK_FIXED (wfixed), TRUE); -  gtk_widget_set_size_request (wfixed, FRAME_PIXEL_WIDTH (f), -                               FRAME_PIXEL_HEIGHT (f)); -    gtk_container_add (GTK_CONTAINER (wtop), wvbox);    gtk_box_pack_end (GTK_BOX (wvbox), wfixed, TRUE, TRUE, 0); @@ -875,9 +838,6 @@ xg_create_frame_widgets (f)       a lot, so we turn off double buffering.  */    gtk_widget_set_double_buffered (wfixed, FALSE); -  /* GTK documents says use gtk_window_set_resizable.  But then a user -     can't shrink the window from its starting size.  */ -  gtk_window_set_policy (GTK_WINDOW (wtop), TRUE, TRUE, TRUE);    gtk_window_set_wmclass (GTK_WINDOW (wtop),                            SSDATA (Vx_resource_name),                            SSDATA (Vx_resource_class)); @@ -891,6 +851,8 @@ xg_create_frame_widgets (f)       and specify it.       GTK will itself handle calculating the real position this way.  */    xg_set_geometry (f); +  int grav = gtk_window_get_gravity (GTK_WINDOW (FRAME_GTK_OUTER_WIDGET (f))); +  f->win_gravity = grav;    gtk_widget_add_events (wfixed,                           GDK_POINTER_MOTION_MASK @@ -2987,14 +2949,8 @@ xg_update_frame_menubar (f)    gtk_widget_show_all (x->menubar_widget);    gtk_widget_size_request (x->menubar_widget, &req); -    FRAME_MENUBAR_HEIGHT (f) = req.height; - -  /* The height has changed, resize outer widget and set columns -     rows to what we had before adding the menu bar.  */ -  xg_frame_set_char_size (f, FRAME_COLS (f), FRAME_LINES (f)); - -  SET_FRAME_GARBAGED (f); +  xg_height_changed (f);    UNBLOCK_INPUT;    return 1; @@ -3018,12 +2974,7 @@ free_frame_menubar (f)            the container.  */        x->menubar_widget = 0;        FRAME_MENUBAR_HEIGHT (f) = 0; - -      /* The height has changed, resize outer widget and set columns -         rows to what we had before removing the menu bar.  */ -      xg_frame_set_char_size (f, FRAME_COLS (f), FRAME_LINES (f)); - -      SET_FRAME_GARBAGED (f); +      xg_height_changed (f);        UNBLOCK_INPUT;      }  } @@ -3627,11 +3578,8 @@ xg_tool_bar_detach_callback (wbox, w, client_data)        /* When detaching a tool bar, not everything dissapear.  There are           a few pixels left that are used to drop the tool bar back into           place.  */ -      FRAME_TOOLBAR_HEIGHT (f) = 2; - -      /* The height has changed, resize outer widget and set columns -         rows to what we had before detaching the tool bar.  */ -      xg_frame_set_char_size (f, FRAME_COLS (f), FRAME_LINES (f)); +      FRAME_TOOLBAR_HEIGHT (f) = 4; +      xg_height_changed (f);      }  } @@ -3659,10 +3607,7 @@ xg_tool_bar_attach_callback (wbox, w, client_data)        gtk_widget_size_request (w, &req);        FRAME_TOOLBAR_HEIGHT (f) = req.height; - -      /* The height has changed, resize outer widget and set columns -         rows to what we had before attaching the tool bar.  */ -      xg_frame_set_char_size (f, FRAME_COLS (f), FRAME_LINES (f)); +      xg_height_changed (f);      }  } @@ -4149,20 +4094,17 @@ update_frame_tool_bar (f)      } while (ti != NULL);    new_req.height = 0; -  gtk_widget_size_request (GTK_WIDGET (wtoolbar), &new_req); -    if (pack_tool_bar && f->n_tool_bar_items != 0) -    xg_pack_tool_bar (f); +      xg_pack_tool_bar (f); +   -  if (new_req.height != 0 -      && f->n_tool_bar_items != 0 -      && old_req.height != new_req.height +  gtk_widget_size_request (GTK_WIDGET (x->toolbar_widget), &new_req); +  if (old_req.height != new_req.height        && ! FRAME_X_OUTPUT (f)->toolbar_detached)      {        FRAME_TOOLBAR_HEIGHT (f) = new_req.height; -      xg_frame_set_char_size (f, FRAME_COLS (f), FRAME_LINES (f)); +      xg_height_changed (f);      } -    UNBLOCK_INPUT;  } @@ -4190,10 +4132,8 @@ free_frame_tool_bar (f)        x->toolbar_widget = 0;        x->handlebox_widget = 0;        FRAME_TOOLBAR_HEIGHT (f) = 0; +      xg_height_changed (f); -      /* The height has changed, resize outer widget and set columns -         rows to what we had before removing the tool bar.  */ -      xg_frame_set_char_size (f, FRAME_COLS (f), FRAME_LINES (f));        UNBLOCK_INPUT;      }  } diff --git a/src/xterm.c b/src/xterm.c index f0b4c2e983a..32ee1596679 100644 --- a/src/xterm.c +++ b/src/xterm.c @@ -6059,8 +6059,6 @@ handle_one_xevent (dpyinfo, eventp, finish, hold_quit)        f = x_window_to_frame (dpyinfo, event.xexpose.window);        if (f)          { -          x_check_fullscreen (f); -  #ifdef USE_GTK            /* This seems to be needed for GTK 2.6.  */            x_clear_area (event.xexpose.display, @@ -6205,6 +6203,9 @@ handle_one_xevent (dpyinfo, eventp, finish, hold_quit)                 to update the frame titles                 in case this is the second frame.  */              record_asynch_buffer_change (); + +          /* Check if fullscreen was specified before we where mapped. */ +          x_check_fullscreen (f);          }        goto OTHER; @@ -6705,19 +6706,9 @@ handle_one_xevent (dpyinfo, eventp, finish, hold_quit)          {  #ifndef USE_X_TOOLKIT  #ifndef USE_GTK -          /* If there is a pending resize for fullscreen, don't -             do this one, the right one will come later. -             The toolkit version doesn't seem to need this, but we -             need to reset it below.  */ -          int dont_resize -	    = ((f->want_fullscreen & FULLSCREEN_WAIT) -	       && f->new_text_cols != 0);            int rows = FRAME_PIXEL_HEIGHT_TO_TEXT_LINES (f, event.xconfigure.height);            int columns = FRAME_PIXEL_WIDTH_TO_TEXT_COLS (f, event.xconfigure.width); -          if (dont_resize) -            goto OTHER; -            /* In the toolkit version, change_frame_size               is called by the code that handles resizing               of the EmacsFrame widget.  */ @@ -6748,9 +6739,6 @@ handle_one_xevent (dpyinfo, eventp, finish, hold_quit)  #endif              {  	      x_real_positions (f, &f->left_pos, &f->top_pos); - -	      if (f->want_fullscreen & FULLSCREEN_WAIT) -		f->want_fullscreen &= ~(FULLSCREEN_WAIT|FULLSCREEN_BOTH);              }  #ifdef HAVE_X_I18N @@ -6758,6 +6746,7 @@ handle_one_xevent (dpyinfo, eventp, finish, hold_quit)              xic_set_statusarea (f);  #endif +#ifndef USE_GTK            if (f->output_data.x->parent_desc != FRAME_X_DISPLAY_INFO (f)->root_window)              {                /* Since the WM decorations come below top_pos now, @@ -6765,6 +6754,7 @@ handle_one_xevent (dpyinfo, eventp, finish, hold_quit)                f->win_gravity = NorthWestGravity;                x_wm_set_size_hint (f, (long) 0, 0);              } +#endif          }        goto OTHER; @@ -8444,6 +8434,28 @@ wm_supports (f, atomname)    return rc;  } +static void +set_wm_state (frame, add, what, what2) +     Lisp_Object frame; +     int add; +     const char *what; +     const char *what2; +{ +  const char *atom = "_NET_WM_STATE"; +  Fx_send_client_event (frame, make_number (0), frame, +                        make_unibyte_string (atom, strlen (atom)), +                        make_number (32), +                        /* 1 = add, 0 = remove */ +                        Fcons +                        (make_number (add ? 1 : 0), +                         Fcons +                         (make_unibyte_string (what, strlen (what)), +                          what2 != 0 +                          ? Fcons (make_unibyte_string (what2, strlen (what2)), +                                   Qnil) +                          : Qnil))); +} +  /* Do fullscreen as specified in extended window manager hints */  static int @@ -8460,66 +8472,36 @@ do_ewmh_fullscreen (f)    if (have_net_atom)      {        Lisp_Object frame; -      const char *atom = "_NET_WM_STATE";        const char *fs = "_NET_WM_STATE_FULLSCREEN";        const char *fw = "_NET_WM_STATE_MAXIMIZED_HORZ";        const char *fh = "_NET_WM_STATE_MAXIMIZED_VERT"; -      const char *what = NULL;        XSETFRAME (frame, f); +      set_wm_state (frame, 0, fs, NULL); +      set_wm_state (frame, 0, fh, NULL); +      set_wm_state (frame, 0, fw, NULL); +              /* If there are _NET_ atoms we assume we have extended window manager           hints.  */        switch (f->want_fullscreen)          {          case FULLSCREEN_BOTH: -          what = fs; +          set_wm_state (frame, 1, fs, NULL);            break;          case FULLSCREEN_WIDTH: -          what = fw; +          set_wm_state (frame, 1, fw, NULL);            break;          case FULLSCREEN_HEIGHT: -          what = fh; +          set_wm_state (frame, 1, fh, NULL); +          break; +        case FULLSCREEN_MAXIMIZED: +          set_wm_state (frame, 1, fw, fh);            break;          } -      if (what != NULL && !wm_supports (f, what)) return 0; - - -      Fx_send_client_event (frame, make_number (0), frame, -                            make_unibyte_string (atom, strlen (atom)), -                            make_number (32), -                            Fcons (make_number (0), /* Remove */ -                                   Fcons -                                   (make_unibyte_string (fs, -                                                         strlen (fs)), -                                    Qnil))); -      Fx_send_client_event (frame, make_number (0), frame, -                            make_unibyte_string (atom, strlen (atom)), -                            make_number (32), -                            Fcons (make_number (0), /* Remove */ -                                   Fcons -                                   (make_unibyte_string (fh, -                                                         strlen (fh)), -                                    Qnil))); -      Fx_send_client_event (frame, make_number (0), frame, -                            make_unibyte_string (atom, strlen (atom)), -                            make_number (32), -                            Fcons (make_number (0), /* Remove */ -                                   Fcons -                                   (make_unibyte_string (fw, -                                                         strlen (fw)), -                                    Qnil)));        f->want_fullscreen = FULLSCREEN_NONE; -      if (what != NULL) -        Fx_send_client_event (frame, make_number (0), frame, -                              make_unibyte_string (atom, strlen (atom)), -                              make_number (32), -                              Fcons (make_number (1), /* Add */ -                                     Fcons -                                     (make_unibyte_string (what, -                                                           strlen (what)), -                                      Qnil))); +      }    return have_net_atom; @@ -8532,14 +8514,13 @@ XTfullscreen_hook (f)    if (f->async_visible)      {        BLOCK_INPUT; -      do_ewmh_fullscreen (f); +      x_check_fullscreen (f);        x_sync (f);        UNBLOCK_INPUT;      }  } -extern Lisp_Object Qfullwidth, Qfullheight, Qfullboth;  static void  x_handle_net_wm_state (f, event)       struct frame *f; @@ -8547,7 +8528,7 @@ x_handle_net_wm_state (f, event)  {    Atom actual_type;    unsigned long actual_size, bytes_remaining; -  int i, rc, actual_format, value = 0; +  int i, rc, actual_format, value = FULLSCREEN_NONE;    struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f);    long max_len = 65536;    Display *dpy = FRAME_X_DISPLAY (f); @@ -8575,12 +8556,22 @@ x_handle_net_wm_state (f, event)    for (i = 0; i < actual_size; ++i)      {        Atom a = ((Atom*)tmp_data)[i]; -      if (a == dpyinfo->Xatom_net_wm_state_maximized_horz) -        value |= FULLSCREEN_WIDTH; +      if (a == dpyinfo->Xatom_net_wm_state_maximized_horz)  +        { +          if (value == FULLSCREEN_HEIGHT) +            value = FULLSCREEN_MAXIMIZED; +          else +            value = FULLSCREEN_WIDTH; +        }        else if (a == dpyinfo->Xatom_net_wm_state_maximized_vert) -        value |= FULLSCREEN_HEIGHT; +        { +          if (value == FULLSCREEN_WIDTH) +            value = FULLSCREEN_MAXIMIZED; +          else +            value = FULLSCREEN_HEIGHT; +        }        else if (a == dpyinfo->Xatom_net_wm_state_fullscreen_atom) -        value |= FULLSCREEN_BOTH; +        value = FULLSCREEN_BOTH;      }    lval = Qnil; @@ -8595,6 +8586,9 @@ x_handle_net_wm_state (f, event)      case FULLSCREEN_BOTH:        lval = Qfullboth;        break; +    case FULLSCREEN_MAXIMIZED: +      lval = Qmaximized; +      break;      }    store_frame_param (f, Qfullscreen, lval); @@ -8609,29 +8603,37 @@ static void  x_check_fullscreen (f)       struct frame *f;  { -  if (f->want_fullscreen & FULLSCREEN_BOTH) -    { -      int width, height, ign; - -      if (do_ewmh_fullscreen (f)) -        return; +  if (do_ewmh_fullscreen (f)) +    return; -      x_real_positions (f, &f->left_pos, &f->top_pos); +  if (f->output_data.x->parent_desc != FRAME_X_DISPLAY_INFO (f)->root_window) +    return; // Only fullscreen without WM or with EWM hints (above). -      x_fullscreen_adjust (f, &width, &height, &ign, &ign); +  if (f->want_fullscreen != FULLSCREEN_NONE) +    { +      int width = FRAME_COLS (f), height = FRAME_LINES (f); +      struct x_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f); -      /* We do not need to move the window, it shall be taken care of -         when setting WM manager hints. -         If the frame is visible already, the position is checked by -         x_check_expected_move. */ +      switch (f->want_fullscreen) +        { +          /* No difference between these two when there is no WM */ +        case FULLSCREEN_BOTH: +        case FULLSCREEN_MAXIMIZED: +          width = x_display_pixel_width (dpyinfo); +          height = x_display_pixel_height (dpyinfo); +          break; +        case FULLSCREEN_WIDTH: +          width = x_display_pixel_width (dpyinfo); +          break; +        case FULLSCREEN_HEIGHT: +          height = x_display_pixel_height (dpyinfo); +        } +              if (FRAME_COLS (f) != width || FRAME_LINES (f) != height)          {            change_frame_size (f, height, width, 0, 1, 0);            SET_FRAME_GARBAGED (f);            cancel_mouse_face (f); - -          /* Wait for the change of frame size to occur */ -          f->want_fullscreen |= FULLSCREEN_WAIT;          }      }  } @@ -8658,7 +8660,7 @@ x_check_expected_move (f, expected_left, expected_top)    x_real_positions (f, ¤t_left, ¤t_top);    if (current_left != expected_left || current_top != expected_top) -      { +    {        /* It's a "Type A" window manager. */        int adjusted_left; @@ -8677,7 +8679,7 @@ x_check_expected_move (f, expected_left, expected_top)                     adjusted_left, adjusted_top);        x_sync_with_move (f, expected_left, expected_top, 0); -      } +    }    else      /* It's a "Type B" window manager.  We don't have to adjust the         frame's position. */  | 
