>> Does anyone know what _NET_FRAME_EXTENTS is supposed to mean?
> It is used to notify the client about the width(s) of the
> window decoration added by the window manager.
> https://standards.freedesktop.org/wm-spec/wm-spec-latest.html
[...]
Thanks.
AFAICT, that doesn't explain why this is needed for Firefox's popups.
Oh well.
In any case, I'm now running with the patch below (i.e. Maxime's but
without the KDE part, with a few comments added, and using the {...}
syntax to initialize the array) and it also fixes the problem for me.
Stefan
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 00000000..378eac25
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+build
diff --git a/add_window.c b/add_window.c
index 72da035d..b3bc2faa 100644
--- a/add_window.c
+++ b/add_window.c
@@ -575,6 +575,9 @@ AddWindow(Window w, AWType wtype, IconMgr *iconp,
VirtualScreen *vs)
else {
tmp_win->title_height = 0;
}
+#ifdef EWMH
+ EwmhSet_NET_FRAME_EXTENTS(tmp_win);
+#endif /* EWMH */
}
diff --git a/ewmh.c b/ewmh.c
index 6d88e27f..6444792d 100644
--- a/ewmh.c
+++ b/ewmh.c
@@ -2048,6 +2048,26 @@ static void EwmhRemoveStrut(TwmWindow *twm_win)
}
}
+void EwmhSet_NET_FRAME_EXTENTS(TwmWindow *twm_win)
+{
+ long w = twm_win->frame_bw3D + twm_win->frame_bw;
+
+ /* Apparently, it's important to set this property to indicate
+ * to applications like Firefox where their content starts/ends,
+ * otherwise, popup menus appear at the wrong place, typically
+ * right over the text you're typing! */
+ unsigned long data[4]
+ /* left, right, top, bottom */
+ = { w, w, twm_win->title_height + w, w};
+
+ /* This is take from fvwm, which also sets _KDE_NET_WM_FRAME_STRUT to
+ * the same value, tho in my tests, it seems this is sufficient. */
+ XChangeProperty(dpy, twm_win->w,
+ XA__NET_FRAME_EXTENTS, XA_CARDINAL,
+ 32, PropModeReplace,
+ (unsigned char *)data, 4);
+}
+
void EwmhSet_NET_SHOWING_DESKTOP(int state)
{
unsigned long prop[1];
diff --git a/ewmh.h b/ewmh.h
index 5d9d4fe0..1d9e70f0 100644
--- a/ewmh.h
+++ b/ewmh.h
@@ -77,6 +77,7 @@ int EwmhGetInitPriority(TwmWindow *twm_win);
bool EwmhHasBorder(TwmWindow *twm_win);
bool EwmhHasTitle(TwmWindow *twm_win);
bool EwmhOnWindowRing(TwmWindow *twm_win);
+void EwmhSet_NET_FRAME_EXTENTS(TwmWindow *twm_win);
void EwmhSet_NET_SHOWING_DESKTOP(int state);
void EwmhSet_NET_WM_STATE(TwmWindow *twm_win, int changes);
diff --git a/ewmh_atoms.in b/ewmh_atoms.in
index 6cd5397e..0a6e24f9 100644
--- a/ewmh_atoms.in
+++ b/ewmh_atoms.in
@@ -31,3 +31,4 @@ _NET_WM_WINDOW_TYPE_DESKTOP
_NET_WM_WINDOW_TYPE_DOCK
_NET_WM_WINDOW_TYPE_NORMAL
_NET_WORKAREA
+_NET_FRAME_EXTENTS