unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
* [PATCH] Fix rendering issues on window managers without _NET_WM_STATE
@ 2021-05-15  1:55 Tom Gillespie
  2021-05-15  7:09 ` Omar Polo
  2021-05-15  7:57 ` martin rudalics
  0 siblings, 2 replies; 14+ messages in thread
From: Tom Gillespie @ 2021-05-15  1:55 UTC (permalink / raw)
  To: Emacs developers

[-- Attachment #1: Type: text/plain, Size: 2115 bytes --]

Hi,
    This patch fixes a bug that occurs when running Emacs in a window
manager that does not set _NET_WM_STATE. The patch is simplest fix
that restores expected behavior for window managers that do not set
_NET_WM_STATE, but I have no idea whether there are other issues that
may be occurring.

I'm guessing that there are also likely issues with other logic in the
MapNotify case that uses not_hidden for window managers that does not
set _NET_WM_STATE.

Thus, the more complex solution, which I am not knowledgeable enough
to implement correctly, is to fix x_get_current_wm_state so that it
works on window managers that do not set _NET_WM_STATE.

I am unfamiliar with this section of the code, so my explanation may
be off and a sanity check would be appreciated. Best,
Tom


A description of the bug for the record.

The bug manifests as frames rendering as solid background after
changing desktops on window managers that do not set _NET_WM_STATE.

When changing desktops and returning to a desktop with Emacs frames,
any frame that is not focused will render the whole frame as only the
background color for the current theme.

I have run a git bisect and found that the first bad commit is
483c5e953c12a95382bef4a3b6769a680c32fe86 Fix two GTK3 event handling
issues.

I think that the bug is occurring because 483c5e953c1 changed calls to
SET_FRAME_VISIBLE and friends from being unconditional to being
conditional on not_hidden, which returns incorrect information when
_NET_WM_STATE is not set (I think).

I encountered the bug on fluxbox but the behavior should happen for
any window manager that does not set _NET_WM_STATE.

It should be possible to reproduce the bug using the following steps.
Run a window manager that does not set _NET_WM_STATE, e.g. fluxbox.
In a terminal run the following and when the newly built Emacs
launches alt-tab to the terminal window, and then leave and return to
the desktop with the Emacs frame.
#+begin_src bash
pushd ~/git/emacs
git checkout 483c5e953c12a95382bef4a3b6769a680c32fe86
git clean -dfx && ./autogen.sh && ./configure && make && \
src/emacs -q
#+end_src

[-- Attachment #2: 0001-Fix-rendering-issues-on-window-managers-without-_NET.patch --]
[-- Type: text/x-patch, Size: 2024 bytes --]

From a12f4a133aa4697494cdb04fbaaef2471fe72269 Mon Sep 17 00:00:00 2001
From: Tom Gillespie <tgbugs@gmail.com>
Date: Fri, 14 May 2021 18:47:48 -0700
Subject: [PATCH] Fix rendering issues on window managers without _NET_WM_STATE

* src/xterm.c (handle_one_xevent): MapNotify handle cases where window
manager is missing _NET_WM_STATE. Partially reverts a change
introduced in 483c5e953c12a95382bef4a3b6769a680c32fe86 which made
previously unconditional calls to SET_FRAME_VISIBLE, and
SET_FRAME_ICONIFIED conditional on the not_hidden variable. On window
managers missing _NET_WM_STATE it seems that not_hidden = false does
not imply visible = false because x_get_current_wm_state will return
false when _NET_WM_STATE and a frame is visible.
---
 src/xterm.c | 25 +++++++++++--------------
 1 file changed, 11 insertions(+), 14 deletions(-)

diff --git a/src/xterm.c b/src/xterm.c
index bdf0804f89..67c6eaa719 100644
--- a/src/xterm.c
+++ b/src/xterm.c
@@ -8440,22 +8440,19 @@ handle_one_xevent (struct x_display_info *dpyinfo,
 		x_set_z_group (f, Qbelow, Qnil);
 	    }
 
-	  if (not_hidden)
-	    {
-	      SET_FRAME_VISIBLE (f, 1);
-	      SET_FRAME_ICONIFIED (f, false);
+	    SET_FRAME_VISIBLE (f, 1);
+	    SET_FRAME_ICONIFIED (f, false);
 #if defined USE_GTK && defined HAVE_GTK3
-	      /* If GTK3 wants to impose some old size here (Bug#24526),
-		 tell it that the current size is what we want.  */
-	      if (f->was_invisible)
-		{
-		  xg_frame_set_char_size
-		    (f, FRAME_PIXEL_WIDTH (f), FRAME_PIXEL_HEIGHT (f));
-		  f->was_invisible = false;
-		}
-#endif
-	      f->output_data.x->has_been_visible = true;
+	    /* If GTK3 wants to impose some old size here (Bug#24526),
+		tell it that the current size is what we want.  */
+	    if (f->was_invisible)
+	    {
+		xg_frame_set_char_size
+		(f, FRAME_PIXEL_WIDTH (f), FRAME_PIXEL_HEIGHT (f));
+		f->was_invisible = false;
 	    }
+#endif
+	    f->output_data.x->has_been_visible = true;
 
           if (not_hidden && iconified)
             {
-- 
2.26.3


^ permalink raw reply related	[flat|nested] 14+ messages in thread

end of thread, other threads:[~2021-05-18 14:43 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-05-15  1:55 [PATCH] Fix rendering issues on window managers without _NET_WM_STATE Tom Gillespie
2021-05-15  7:09 ` Omar Polo
2021-05-16  8:30   ` martin rudalics
2021-05-16 13:45     ` Omar Polo
2021-05-16 14:51       ` martin rudalics
2021-05-16 16:14         ` Omar Polo
2021-05-18  3:45           ` Tom Gillespie
2021-05-18  8:01             ` martin rudalics
2021-05-18 13:03               ` Basil L. Contovounesios
2021-05-18 13:31                 ` martin rudalics
2021-05-18 14:43                   ` Basil L. Contovounesios
2021-05-15  7:57 ` martin rudalics
2021-05-15 17:40   ` Tom Gillespie
2021-05-16  8:30     ` martin rudalics

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).