From 2d9a0eaf55ceca3c3bb93a508f115b4d9ee28a95 Mon Sep 17 00:00:00 2001 From: Philip Date: Sun, 23 Aug 2015 12:24:04 +0000 Subject: [PATCH] Fix full-screen code when there is no window manager. * xterm.c (get_current_wm_state): 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 | 16 +++++++++------- src/xterm.c | 21 ++++++++++++++++++--- 2 files changed, 27 insertions(+), 10 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..dcd457f 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 = 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