[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
master 7d7a6f6719 1/2: Better respect window manager stacking order
From: |
Po Lu |
Subject: |
master 7d7a6f6719 1/2: Better respect window manager stacking order |
Date: |
Sun, 5 Jun 2022 01:06:07 -0400 (EDT) |
branch: master
commit 7d7a6f6719ddf99a4afefe6ae44f7cba48707d45
Author: Po Lu <luangruo@yahoo.com>
Commit: Po Lu <luangruo@yahoo.com>
Better respect window manager stacking order
* src/xfns.c (x_frame_list_z_order, Fx_frame_list_z_order): Use
_NET_CLIENT_LIST_STACKING if supported.
* src/xterm.c (x_wm_supports_1): New function. Accept dpyinfo
instead of frame.
(x_wm_supports): Use that function instead.
* src/xterm.h: Update prototypes.
---
src/xfns.c | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++----------
src/xterm.c | 12 +++++++++---
src/xterm.h | 1 +
3 files changed, 62 insertions(+), 13 deletions(-)
diff --git a/src/xfns.c b/src/xfns.c
index e3763a5589..cfc6d4c212 100644
--- a/src/xfns.c
+++ b/src/xfns.c
@@ -6600,17 +6600,61 @@ menu bar or tool bar of FRAME. */)
* WINDOW to FRAMES and return FRAMES.
*/
static Lisp_Object
-x_frame_list_z_order (Display* dpy, Window window)
+x_frame_list_z_order (struct x_display_info *dpyinfo, Window window)
{
+ Display *dpy;
Window root, parent, *children;
unsigned int nchildren;
- int i;
- Lisp_Object frames = Qnil;
+ unsigned long i;
+ Lisp_Object frames, val;
+ Atom type;
+ Window *toplevels;
+ int format, rc;
+ unsigned long nitems, bytes_after;
+ unsigned char *data;
+ struct frame *f;
+
+ dpy = dpyinfo->display;
+ data = NULL;
+ frames = Qnil;
+
+ if (window == dpyinfo->root_window
+ && x_wm_supports_1 (dpyinfo,
+ dpyinfo->Xatom_net_client_list_stacking))
+ {
+ rc = XGetWindowProperty (dpyinfo->display, dpyinfo->root_window,
+ dpyinfo->Xatom_net_client_list_stacking,
+ 0, LONG_MAX, False, XA_WINDOW, &type,
+ &format, &nitems, &bytes_after, &data);
+
+ if (rc != Success)
+ return Qnil;
+
+ if (format != 32 || type != XA_WINDOW)
+ {
+ XFree (data);
+ return Qnil;
+ }
+
+ toplevels = (Window *) data;
+
+ for (i = 0; i < nitems; ++i)
+ {
+ f = x_top_window_to_frame (dpyinfo, toplevels[i]);
+
+ if (f)
+ {
+ XSETFRAME (val, f);
+ frames = Fcons (val, frames);
+ }
+ }
+
+ XFree (data);
+ return frames;
+ }
- block_input ();
if (XQueryTree (dpy, window, &root, &parent, &children, &nchildren))
{
- unblock_input ();
for (i = 0; i < nchildren; i++)
{
Lisp_Object frame, tail;
@@ -6628,10 +6672,9 @@ x_frame_list_z_order (Display* dpy, Window window)
}
}
- if (children) XFree ((char *)children);
+ if (children)
+ XFree (children);
}
- else
- unblock_input ();
return frames;
}
@@ -6652,7 +6695,6 @@ Frames are listed from topmost (first) to bottommost
(last). */)
(Lisp_Object terminal)
{
struct x_display_info *dpyinfo = check_x_display_info (terminal);
- Display *dpy = dpyinfo->display;
Window window;
if (FRAMEP (terminal) && FRAME_LIVE_P (XFRAME (terminal)))
@@ -6660,7 +6702,7 @@ Frames are listed from topmost (first) to bottommost
(last). */)
else
window = dpyinfo->root_window;
- return x_frame_list_z_order (dpy, window);
+ return x_frame_list_z_order (dpyinfo, window);
}
/**
diff --git a/src/xterm.c b/src/xterm.c
index 2bf37e94d6..3b60dba69b 100644
--- a/src/xterm.c
+++ b/src/xterm.c
@@ -22591,17 +22591,16 @@ x_set_offset (struct frame *f, int xoff, int yoff,
int change_gravity)
https://freedesktop.org/wiki/Specifications/wm-spec/. */
bool
-x_wm_supports (struct frame *f, Atom want_atom)
+x_wm_supports_1 (struct x_display_info *dpyinfo, Atom want_atom)
{
Atom actual_type;
unsigned long actual_size, bytes_remaining;
int i, rc, actual_format;
bool ret;
Window wmcheck_window;
- struct x_display_info *dpyinfo = FRAME_DISPLAY_INFO (f);
Window target_window = dpyinfo->root_window;
int max_len = 65536;
- Display *dpy = FRAME_X_DISPLAY (f);
+ Display *dpy = dpyinfo->display;
unsigned char *tmp_data = NULL;
Atom target_type = XA_WINDOW;
@@ -22675,6 +22674,13 @@ x_wm_supports (struct frame *f, Atom want_atom)
return ret;
}
+bool
+x_wm_supports (struct frame *f, Atom want_atom)
+{
+ return x_wm_supports_1 (FRAME_DISPLAY_INFO (f),
+ want_atom);
+}
+
static void
set_wm_state (Lisp_Object frame, bool add, Atom atom, Atom value)
{
diff --git a/src/xterm.h b/src/xterm.h
index d7e184ed9f..878cb5fd87 100644
--- a/src/xterm.h
+++ b/src/xterm.h
@@ -1497,6 +1497,7 @@ extern void x_set_shaded (struct frame *, Lisp_Object,
Lisp_Object);
extern void x_set_skip_taskbar (struct frame *, Lisp_Object, Lisp_Object);
extern void x_set_z_group (struct frame *, Lisp_Object, Lisp_Object);
extern bool x_wm_supports (struct frame *, Atom);
+extern bool x_wm_supports_1 (struct x_display_info *, Atom);
extern void x_wait_for_event (struct frame *, int);
extern void x_clear_under_internal_border (struct frame *f);