Add workaround to handle a problem with Enlightenment WM (Bug#53298)

* src/xterm.c (handle_one_xevent): Handle setting of variable
'x_set_frame_visibility_more_laxly' when receiving an Expose or
FocusIn event (Bug#53298).
(Qexpose): Define symbol.
(x_set_frame_visibility_more_laxly): New Lisp variable.
* etc/PROBLEMS: Mention frame redraw problem with the
Enlightenment WM and 'x-set-frame-visibility-more-laxly'
workaround.
This commit is contained in:
Martin Rudalics 2022-01-20 10:30:08 +01:00
parent f393d0d441
commit ef0c1d4c2c
2 changed files with 56 additions and 20 deletions

View file

@ -1269,6 +1269,13 @@ and then Alt-F7). A bug for it is here:
https://bugs.launchpad.net/ubuntu/+source/metacity/+bug/231034. https://bugs.launchpad.net/ubuntu/+source/metacity/+bug/231034.
Note that a permanent fix seems to be to disable "assistive technologies". Note that a permanent fix seems to be to disable "assistive technologies".
*** Enlightenment: Frames not redrawn after switching virtual desktops
With Enlightenment version 0.25, Emacs frames may no be redrawn orderly
after switching back from another virtual desktop. Setting the variable
'x-set-frame-visibility-more-laxly' to one of 'focus-in', 'expose' or
't' should fix this.
*** Gnome: Emacs receives input directly from the keyboard, bypassing XIM. *** Gnome: Emacs receives input directly from the keyboard, bypassing XIM.
This seems to happen when gnome-settings-daemon version 2.12 or later This seems to happen when gnome-settings-daemon version 2.12 or later

View file

@ -8231,12 +8231,17 @@ handle_one_xevent (struct x_display_info *dpyinfo,
if (!FRAME_VISIBLE_P (f)) if (!FRAME_VISIBLE_P (f))
{ {
block_input (); block_input ();
/* The following two are commented out to avoid that a /* By default, do not set the frame's visibility here, see
plain invisible frame gets reported as iconified. That https://lists.gnu.org/archive/html/emacs-devel/2017-02/msg00133.html.
problem occurred first for Emacs 26 and is described in The default behavior can be overridden by setting
https://lists.gnu.org/archive/html/emacs-devel/2017-02/msg00133.html. */ 'x-set-frame-visibility-more-laxly' (Bug#49955,
/** SET_FRAME_VISIBLE (f, 1); **/ Bug#53298). */
/** SET_FRAME_ICONIFIED (f, false); **/ if (EQ (x_set_frame_visibility_more_laxly, Qexpose)
|| EQ (x_set_frame_visibility_more_laxly, Qt))
{
SET_FRAME_VISIBLE (f, 1);
SET_FRAME_ICONIFIED (f, false);
}
if (FRAME_X_DOUBLE_BUFFERED_P (f)) if (FRAME_X_DOUBLE_BUFFERED_P (f))
font_drop_xrender_surfaces (f); font_drop_xrender_surfaces (f);
@ -8824,16 +8829,23 @@ handle_one_xevent (struct x_display_info *dpyinfo,
goto OTHER; goto OTHER;
case FocusIn: case FocusIn:
#ifndef USE_GTK #ifdef USE_GTK
/* Some WMs (e.g. Mutter in Gnome Shell), don't unmap /* Some WMs (e.g. Mutter in Gnome Shell), don't unmap
minimized/iconified windows; thus, for those WMs we won't get minimized/iconified windows; thus, for those WMs we won't get
a MapNotify when unminimizing/deconifying. Check here if we a MapNotify when unminimizing/deiconifying. Check here if we
are deiconizing a window (Bug42655). are deiconizing a window (Bug42655).
But don't do that on GTK since it may cause a plain invisible But don't do that by default on GTK since it may cause a plain
frame get reported as iconified, compare invisible frame get reported as iconified, compare
https://lists.gnu.org/archive/html/emacs-devel/2017-02/msg00133.html. https://lists.gnu.org/archive/html/emacs-devel/2017-02/msg00133.html.
That is fixed above but bites us here again. */ That is fixed above but bites us here again.
The option x_set_frame_visibility_more_laxly allows to override
the default behavior (Bug#49955, Bug#53298). */
if (EQ (x_set_frame_visibility_more_laxly, Qfocus_in)
|| EQ (x_set_frame_visibility_more_laxly, Qt))
#endif /* USE_GTK */
{
f = any; f = any;
if (f && FRAME_ICONIFIED_P (f)) if (f && FRAME_ICONIFIED_P (f))
{ {
@ -8843,7 +8855,7 @@ handle_one_xevent (struct x_display_info *dpyinfo,
inev.ie.kind = DEICONIFY_EVENT; inev.ie.kind = DEICONIFY_EVENT;
XSETFRAME (inev.ie.frame_or_window, f); XSETFRAME (inev.ie.frame_or_window, f);
} }
#endif /* USE_GTK */ }
x_detect_focus_change (dpyinfo, any, event, &inev.ie); x_detect_focus_change (dpyinfo, any, event, &inev.ie);
goto OTHER; goto OTHER;
@ -13779,4 +13791,21 @@ gtk_window_move to set or store frame positions and disables some time
consuming frame position adjustments. In newer versions of GTK, Emacs consuming frame position adjustments. In newer versions of GTK, Emacs
always uses gtk_window_move and ignores the value of this variable. */); always uses gtk_window_move and ignores the value of this variable. */);
x_gtk_use_window_move = true; x_gtk_use_window_move = true;
DEFSYM (Qexpose, "expose");
DEFVAR_LISP ("x-set-frame-visibility-more-laxly",
x_set_frame_visibility_more_laxly,
doc: /* Non-nil means set frame visibility more laxly.
If this is nil, Emacs is more strict when marking a frame as visible.
Since this may cause problems on some window managers, this variable can
be also set as follows: The value `focus-in' means to mark a frame as
visible also when a FocusIn event is received for it on GTK builds. The
value `expose' means to mark a frame as visible also when an Expose
event is received for it on any X build. The value `t' means to mark a
frame as visible in either of these two cases.
Note that any non-nil setting may cause invisible frames get erroneously
reported as iconified. */);
x_set_frame_visibility_more_laxly = Qnil;
} }