fvwmorg / fvwm3

FVWM version 3 -- the successor to fvwm2
Other
505 stars 79 forks source link

Vim/Gtk3 crashes with BadMatch after Alt-Tabbing to a different desktop #18

Open jmacloue opened 4 years ago

jmacloue commented 4 years ago

Possibly related to fvwmorg/fvwm#59

I'm using Slackware64-current, FVWM 2.6.9 and Vim 8.2.0050 - both sufficiently recent though not the bleeding edge. FVWM configured with 4 desktops with 2x2 screens.

gVim is built with Gtk3 GUI and works as expected most of the time - until I try to Alt-Tab to another desktop and WindowList is drawn over gVim window. The xscope output is as follows:

96.50: Client 1 -->   12 bytes
     ............REQUEST: SetInputFocus
               revert-to: Parent
                   focus: WIN 04400008
                    time: TIM 00a9b8a0
96.51:                    32 bytes <-- X11 Server 1
                     ..............ERROR: Match
                            minor opcode: 0000
                            major opcode: 2a
96.51:                    32 bytes <-- X11 Server 1
                     ..............EVENT: ClientMessage
                                  source: SendEvent
                                  format: 20
                                  window: WIN 04400007
                                    type: <WM_PROTOCOLS>

As far as I understand, it happens as follows. WindowList steals the input focus and informs gVim of it by sending a PartiallyObscured NotifyEvent, and as gVim tries to get it back from it - it is no longer visible as another desktop is already shown, which is in line with X11 Proto spec .

According to gVim bug #1392, Gtk3 is already handling this scenario by guarding XSetInputFocus() invocation but somehow it is not enough for FVWM.

Alt-Tabbing over the same desktop works as expected, so I believe it is related to how FVWM implements multiple desktops. Though I don't see such problems with other Gtk3 applications - it looks quite generic so it may surface elsewhere as well, and a fix or a good workaround would certainly be nice: maybe guarding XSetInputFocus() in fvwm/focus.c same as Gtk3 does?

PS Previous gVim version built against Gtk2 does not have this problem - most likely building current gVim against Gtk2 will also "fix" - or, rather, obscure it, but eventually Gtk2 will become obsolete.

ThomasAdam commented 4 years ago

Can you provide me with a backtrace, please? I've tried to reproduce this, but cannot.

jmacloue commented 4 years ago

Can you provide me with a backtrace, please? I've tried to reproduce this, but cannot.

Hm-m, that's strange - I have the same issue consistently on three workstations (all Slackware64-current). Among other things it means that my configuration (almost identical) may be to blame for this, so I need to review it first.

And, of all the possible stack traces, which one would be the most useful?

To my understanding, it could be that gVim receives a BadMatch event actually intended to something /under/ its window: like, root window trying to get focus back and not expecting this to fail. Sorry if it is utter heresy, I'm not a programmer. But if I am correct - the answer may lie in stack traces issued by gVim (and all underlying Gtk3 multi-threaded orchestra), main FVWM process, or FvwmPager. Posting all three would certainly be an overkill.

ThomasAdam commented 4 years ago

And, of all the possible stack traces, which one would be the most useful?

If it's vim which is crashing, that'll definitely help me. Any/all strack traces which are coredumping will help, especially if it's FVWM.

jmacloue commented 4 years ago

Sorry, did too much reading on the matter to post a proper bug report. Let's start from the way to reproduce.

OS details:

Steps to reproduce:

  1. Start FVWM with default config: /opt/jmcl/bin/fvm -f /opt/jmcl/share/fvwm/default-config/config
  2. Switch to Desktop 2 and start an xterm
  3. Switch to Desktop 0 and invoke gVim: /opt/jmcl/bin/vim -f -g
  4. With focus in gVim window use Alt-Tab to switch to xterm at Desktop 2
  5. gVim exits with an error:

BadMatch (invalid parameter attributes) Vim: Got X error Vim: Finished.


**Details**

gdb's `threads apply all bt` after Vim exited is not particularly interesting:

Thread 3 (Thread 0x7fffe962e700 (LWP 3738)):

0 0x00007ffff47692fd in poll () at /lib64/libc.so.6

fvwmorg/fvwm#1 0x00007ffff5fbf964 in () at /usr/lib64/libglib-2.0.so.0 fvwmorg/fvwm#2 0x00007ffff5fbfce2 in g_main_loop_run () at /usr/lib64/libglib-2.0.so.0 fvwmorg/fvwm#3 0x00007ffff65db986 in () at /usr/lib64/libgio-2.0.so.0 fvwmorg/fvwm#4 0x00007ffff5fe5275 in () at /usr/lib64/libglib-2.0.so.0 fvwmorg/fvwm#5 0x00007fffed7fc684 in start_thread () at /lib64/libpthread.so.0 fvwmorg/fvwm#6 0x00007ffff4774eed in clone () at /lib64/libc.so.6

Thread 2 (Thread 0x7fffe9e2f700 (LWP 3737)):

0 0x00007ffff47692fd in poll () at /lib64/libc.so.6

fvwmorg/fvwm#1 0x00007ffff5fbf964 in () at /usr/lib64/libglib-2.0.so.0 fvwmorg/fvwm#2 0x00007ffff5fbfa6c in g_main_context_iteration () at /usr/lib64/libglib-2.0.so.0 fvwmorg/fvwm#3 0x00007ffff5fbfaa9 in () at /usr/lib64/libglib-2.0.so.0 fvwmorg/fvwm#4 0x00007ffff5fe5275 in () at /usr/lib64/libglib-2.0.so.0 fvwmorg/fvwm#5 0x00007fffed7fc684 in start_thread () at /lib64/libpthread.so.0 fvwmorg/fvwm#6 0x00007ffff4774eed in clone () at /lib64/libc.so.6

Thread 1 (Thread 0x7ffff7f81900 (LWP 3733)):

0 0x00007ffff46a7ff0 in exit () at /lib64/libc.so.6

fvwmorg/fvwm#1 0x0000000000518fc8 in mch_exit (r=r@entry=1) at os_unix.c:3360 fvwmorg/fvwm#2 0x0000000000612b59 in getout (exitval=exitval@entry=1) at main.c:1708 fvwmorg/fvwm#3 0x00000000004dfce1 in preserve_exit () at misc1.c:2151 fvwmorg/fvwm#4 0x00000000005160dc in x_error_handler (dpy=, error_event=) at os_unix.c:1550 fvwmorg/fvwm#5 0x00007ffff55f74b5 in _XError () at /usr/lib64/libX11.so.6 fvwmorg/fvwm#6 0x00007ffff55f4537 in () at /usr/lib64/libX11.so.6 fvwmorg/fvwm#7 0x00007ffff55f45e5 in () at /usr/lib64/libX11.so.6 fvwmorg/fvwm#8 0x00007ffff55f4e85 in _XEventsQueued () at /usr/lib64/libX11.so.6 fvwmorg/fvwm#9 0x00007ffff55e70e7 in XPending () at /usr/lib64/libX11.so.6 fvwmorg/fvwm#10 0x00007ffff726c7c1 in () at /usr/lib64/libgdk-3.so.0 fvwmorg/fvwm#11 0x00007ffff5fbf3e1 in g_main_context_check () at /usr/lib64/libglib-2.0.so.0 fvwmorg/fvwm#12 0x00007ffff5fbf908 in () at /usr/lib64/libglib-2.0.so.0 fvwmorg/fvwm#13 0x00007ffff5fbfa6c in g_main_context_iteration () at /usr/lib64/libglib-2.0.so.0 fvwmorg/fvwm#14 0x00000000005ed144 in gui_mch_wait_for_chars (wtime=4000) at gui_gtk_x11.c:6293 fvwmorg/fvwm#15 0x00000000005b7181 in ui_wait_for_chars_or_timer (wtime=4000, wait_func= 0x5dcb40 , interrupted=0x7fffffffd4cc, ignore_input=0) at ui.c:487 fvwmorg/fvwm#16 0x00000000005b8f0c in inchar_loop (buf=buf@entry=0x8c50bc <typebuf_init+60> "", maxlen=maxlen@entry=68, wtime=wtime@entry=-1, tb_change_cnt=tb_change_cnt@entry=9, wait_func=wait_func@entry= 0x5dcb20 , resize_func=resize_func@entry=0x0) at ui.c:383 fvwmorg/fvwm#17 0x00000000005dd285 in gui_wait_for_chars_buf (buf=0x8c50bc <typebuf_init+60> "", maxlen=68, wtime=-1, tb_change_cnt=9) at gui.c:2964 fvwmorg/fvwm#18 0x00000000005b8956 in ui_inchar (buf=buf@entry=0x8c50bc <typebuf_init+60> "", maxlen=maxlen@entry=68, wtime=wtime@entry=-1, tb_change_cnt=tb_change_cnt@entry=9) at ui.c:225 fvwmorg/fvwm#19 0x00000000004a8bb1 in inchar (buf=0x8c50bc <typebuf_init+60> "", maxlen=204, wait_time=-1) at getchar.c:3364 fvwmorg/fvwm#20 0x00000000004a9867 in vgetorpeek (advance=advance@entry=1) at getchar.c:3143 fvwmorg/fvwm#21 0x00000000004aa92d in vgetc () at getchar.c:1616 fvwmorg/fvwm#22 0x00000000004aadb9 in safe_vgetc () at getchar.c:1850 fvwmorg/fvwm#23 0x00000000004f9589 in normal_cmd (oap=oap@entry=0x7fffffffd900, toplevel=toplevel@entry=1) at normal.c:569 fvwmorg/fvwm#24 0x0000000000613ada in main_loop (cmdwin=cmdwin@entry=0, noexmode=noexmode@entry=0) at main.c:1511 fvwmorg/fvwm#25 0x0000000000615142 in vim_main2 () at main.c:901 fvwmorg/fvwm#26 0x000000000041400e in main (argc=, argv=) at main.c:444



(just indicates Vim received an X error which triggered an unclean exit, no indication on what was the request that caused the error)

I have tried using xscope to get the X11 exchange that led to the error - here's the event dump:

[xscope-vim.txt.gz](https://github.com/fvwmorg/fvwm/files/4053094/xscope-vim.txt.gz)

(note an exchange at the end of file - SetInputFocus to parent and subsequent BadMatch - supposedly as the target is not visible)

Must be some kind of race condition as with GDK_SYNCHRONIZE=1 the error doesn't happen, and sometimes (very rare - 5% of time) it takes more than one Alt-Tab to crash Vim. Here's xscope output taken with GDK_SYNCHRONIZE=1 in the same scenario:

[xscope-sync.txt.gz](https://github.com/fvwmorg/fvwm/files/4053093/xscope-sync.txt.gz)

Also when the WindowList menu pops outside of gVim window - Alt-Tab doesn't crash gVim.

Using mouse binding to show WindowList works the same as Alt-Tab: almost always a crash when it paints over gVim, works without a crash if outside gVim.

To re-iterate, nothing I have seen so far indicates that the issue is isolated to Vim, looks more a general Gtk3 problem with FVWM.

PS I have used Xephyr in a window to run the tests: `Xephyr -screen 1024x768 :2`, with xscope in front of it: `xscope -i1 -o2`, and set DISPLAY to ":1".

PPS And, no, GDK_SYNCHRONIZE=1 is not a proper fix and not too good a workaround.
ThomasAdam commented 4 years ago

Perfect. Thank you -- I'll try and get round to looking at this soon.

I'm moving this to the fvwm3 repository so I don't lose it -- any fixes I have, I will backport to fvwm2, as it's a common bug in the core.