From af8d69d52190a98264cfc0ef9ceedcfbd2f0d37d Mon Sep 17 00:00:00 2001 From: Philip Date: Sun, 23 Aug 2015 12:24:04 +0000 Subject: [PATCH] Fix fullscreen issue --- src/gtkutil.c | 16 +++++++++------- src/xterm.c | 27 +++++++++++++++++++++++++-- 2 files changed, 34 insertions(+), 9 deletions(-) diff --git a/src/gtkutil.c b/src/gtkutil.c index d684cd9..8e53a16 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 get_current_wm_state (struct frame *, Window, int *, bool *); + #define TB_INFO_KEY "xg_frame_tb_info" struct xg_frame_tb_info { @@ -1364,7 +1366,8 @@ x_wm_set_size_hint (struct frame *f, long int flags, bool user_position) int base_width, base_height; int min_rows = 0, min_cols = 0; int win_gravity = f->win_gravity; - Lisp_Object fs_state, frame; + int state = FULLSCREEN_NONE; + bool sticky = false; int scale = xg_get_gdk_scale (); /* Don't set size hints during initialization; that apparently leads @@ -1373,13 +1376,12 @@ x_wm_set_size_hint (struct frame *f, long int flags, bool user_position) if (NILP (Vafter_init_time) || !FRAME_GTK_OUTER_WIDGET (f)) return; - XSETFRAME (frame, f); - fs_state = Fframe_parameter (frame, Qfullscreen); - if (EQ (fs_state, Qmaximized) || EQ (fs_state, Qfullboth)) + get_current_wm_state (f, FRAME_OUTER_WINDOW (f), &state, &sticky); + if (state != FULLSCREEN_NONE) { - /* Don't set hints when maximized or fullscreen. Apparently KWin and - Gtk3 don't get along and the frame shrinks (!). - */ + /* Don't set hints when the frame currently is maximized or + fullscreen. Apparently KWin and Gtk3 don't get along and the + frame shrinks (!). */ return; } diff --git a/src/xterm.c b/src/xterm.c index b7aacfa..60e72a9 100644 --- a/src/xterm.c +++ b/src/xterm.c @@ -247,7 +247,7 @@ static void x_wm_set_window_state (struct frame *, int); static void x_wm_set_icon_pixmap (struct frame *, ptrdiff_t); static void x_initialize (void); -static bool get_current_wm_state (struct frame *, Window, int *, bool *); +bool get_current_wm_state (struct frame *, Window, int *, bool *); /* Flush display of frame F. */ @@ -9904,7 +9904,7 @@ x_set_sticky (struct frame *f, Lisp_Object new_value, Lisp_Object old_value) Return true iff we are not hidden. */ -static bool +bool get_current_wm_state (struct frame *f, Window window, int *size_state, @@ -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; + if (do_ewmh_fullscreen (f)) return; @@ -10189,6 +10191,8 @@ x_check_fullscreen (struct frame *f) 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 +10205,25 @@ x_check_fullscreen (struct frame *f) x_sync (f); } } + + lval = Qnil; + switch (f->want_fullscreen) + { + case FULLSCREEN_WIDTH: + lval = Qfullwidth; + break; + case FULLSCREEN_HEIGHT: + lval = Qfullheight; + break; + case FULLSCREEN_BOTH: + lval = Qfullboth; + break; + case FULLSCREEN_MAXIMIZED: + lval = Qmaximized; + break; + } + + store_frame_param (f, Qfullscreen, lval); } /* This function is called by x_set_offset to determine whether the window -- 2.5.0