From 0ee7d8c5b3bb63fbed9264eb3facab010b136ca1 Mon Sep 17 00:00:00 2001 From: Philip Date: Sun, 23 Aug 2015 14:37:41 +0000 Subject: [PATCH] Fix full-screen code when there is no window manager. * xterm.c (wm_suppports): Export function. (x_check_fullscreen): Call `x_wm_set_size_hint', restore `fullscreen' frame parameter. * gtkutil.c (x_wm_set_size_hint): Set size hints when running without a window manager. --- src/gtkutil.c | 6 +++++- src/xterm.c | 19 +++++++++++++++++-- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/src/gtkutil.c b/src/gtkutil.c index d684cd9..33f2a02 100644 --- a/src/gtkutil.c +++ b/src/gtkutil.c @@ -135,6 +135,8 @@ along with GNU Emacs. If not, see . */ static void update_theme_scrollbar_width (void); static void update_theme_scrollbar_height (void); +bool wm_supports (struct frame *f, Atom want_atom); + #define TB_INFO_KEY "xg_frame_tb_info" struct xg_frame_tb_info { @@ -1375,7 +1377,9 @@ x_wm_set_size_hint (struct frame *f, long int flags, bool user_position) XSETFRAME (frame, f); fs_state = Fframe_parameter (frame, Qfullscreen); - if (EQ (fs_state, Qmaximized) || EQ (fs_state, Qfullboth)) + if ((EQ (fs_state, Qmaximized) || EQ (fs_state, Qfullboth)) && + (wm_supports (f, FRAME_DISPLAY_INFO (f)->Xatom_net_wm_state) || + wm_supports (f, FRAME_DISPLAY_INFO (f)->Xatom_net_wm_state_fullscreen))) { /* Don't set hints when maximized or fullscreen. Apparently KWin and Gtk3 don't get along and the frame shrinks (!). diff --git a/src/xterm.c b/src/xterm.c index b7aacfa..9139758 100644 --- a/src/xterm.c +++ b/src/xterm.c @@ -9782,7 +9782,7 @@ x_set_offset (struct frame *f, register int xoff, register int yoff, int change_ Specification/Extended Window Manager Hints at http://freedesktop.org/wiki/Specifications/wm-spec. */ -static bool +bool wm_supports (struct frame *f, Atom want_atom) { Atom actual_type; @@ -10155,6 +10155,8 @@ x_handle_net_wm_state (struct frame *f, const XPropertyEvent *event) static void x_check_fullscreen (struct frame *f) { + Lisp_Object lval = Qnil; + if (do_ewmh_fullscreen (f)) return; @@ -10173,22 +10175,31 @@ x_check_fullscreen (struct frame *f) switch (f->want_fullscreen) { /* No difference between these two when there is no WM */ - case FULLSCREEN_BOTH: case FULLSCREEN_MAXIMIZED: + lval = Qmaximized; + width = x_display_pixel_width (dpyinfo); + height = x_display_pixel_height (dpyinfo); + break; + case FULLSCREEN_BOTH: + lval = Qfullboth; width = x_display_pixel_width (dpyinfo); height = x_display_pixel_height (dpyinfo); break; case FULLSCREEN_WIDTH: + lval = Qfullwidth; width = x_display_pixel_width (dpyinfo); height = height + FRAME_MENUBAR_HEIGHT (f); break; case FULLSCREEN_HEIGHT: + lval = Qfullheight; height = x_display_pixel_height (dpyinfo); } frame_size_history_add (f, Qx_check_fullscreen, width, height, Qnil); + x_wm_set_size_hint (f, 0, false); + XResizeWindow (FRAME_X_DISPLAY (f), FRAME_OUTER_WINDOW (f), width, height); @@ -10201,6 +10212,10 @@ x_check_fullscreen (struct frame *f) x_sync (f); } } + + /* `x_net_wm_state' might have reset the fullscreen frame parameter, + restore it. */ + store_frame_param (f, Qfullscreen, lval); } /* This function is called by x_set_offset to determine whether the window -- 2.5.0