From: Tom Gillespie <tgbugs@gmail.com>
To: Emacs developers <emacs-devel@gnu.org>
Subject: [PATCH] Fix rendering issues on window managers without _NET_WM_STATE
Date: Fri, 14 May 2021 18:55:42 -0700 [thread overview]
Message-ID: <CA+G3_PMLyu8orBSDvVA9NO=v_oAAO4rH_mW+-Ky4Nfh9y0XYVQ@mail.gmail.com> (raw)
[-- 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
next reply other threads:[~2021-05-15 1:55 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-05-15 1:55 Tom Gillespie [this message]
2021-05-15 7:09 ` [PATCH] Fix rendering issues on window managers without _NET_WM_STATE 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
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.gnu.org/software/emacs/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to='CA+G3_PMLyu8orBSDvVA9NO=v_oAAO4rH_mW+-Ky4Nfh9y0XYVQ@mail.gmail.com' \
--to=tgbugs@gmail.com \
--cc=emacs-devel@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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).