[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
master 0e662f33e1: Rewrite desktop workarea computation to avoid too man
From: |
Po Lu |
Subject: |
master 0e662f33e1: Rewrite desktop workarea computation to avoid too many calls to XSync |
Date: |
Tue, 29 Mar 2022 06:33:10 -0400 (EDT) |
branch: master
commit 0e662f33e1a5b1c88fb3e0bf8be906c1937114d3
Author: Po Lu <luangruo@yahoo.com>
Commit: Po Lu <luangruo@yahoo.com>
Rewrite desktop workarea computation to avoid too many calls to XSync
* src/xfns.c (x_get_net_workarea): Rewrite using XCB without
using long_offset and long_length, since the data transfer is
usually negligible compared to the roundtrip delay.
---
src/xfns.c | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 64 insertions(+)
diff --git a/src/xfns.c b/src/xfns.c
index 534fb7c544..37e0628464 100644
--- a/src/xfns.c
+++ b/src/xfns.c
@@ -5459,6 +5459,7 @@ On MS Windows, this just returns nil. */)
static bool
x_get_net_workarea (struct x_display_info *dpyinfo, XRectangle *rect)
{
+#ifndef USE_XCB
Display *dpy = dpyinfo->display;
long offset, max_len;
Atom target_type, actual_type;
@@ -5512,6 +5513,69 @@ x_get_net_workarea (struct x_display_info *dpyinfo,
XRectangle *rect)
x_uncatch_errors ();
return result;
+#else
+ xcb_get_property_cookie_t current_desktop_cookie;
+ xcb_get_property_cookie_t workarea_cookie;
+ xcb_get_property_reply_t *reply;
+ xcb_generic_error_t *error;
+ bool rc;
+ uint32_t current_workspace, *values;
+
+ current_desktop_cookie
+ = xcb_get_property (dpyinfo->xcb_connection, 0,
+ (xcb_window_t) dpyinfo->root_window,
+ (xcb_atom_t) dpyinfo->Xatom_net_current_desktop,
+ XCB_ATOM_CARDINAL, 0, 1);
+
+ workarea_cookie
+ = xcb_get_property (dpyinfo->xcb_connection, 0,
+ (xcb_window_t) dpyinfo->root_window,
+ (xcb_atom_t) dpyinfo->Xatom_net_workarea,
+ XCB_ATOM_CARDINAL, 0, UINT32_MAX);
+
+ reply = xcb_get_property_reply (dpyinfo->xcb_connection,
+ current_desktop_cookie, &error);
+ rc = true;
+
+ if (!reply)
+ free (error), rc = false;
+ else
+ {
+ if (xcb_get_property_value_length (reply) != 4
+ || reply->type != XCB_ATOM_CARDINAL || reply->format != 32)
+ rc = false;
+ else
+ current_workspace = *(uint32_t *) xcb_get_property_value (reply);
+
+ free (reply);
+ }
+
+ reply = xcb_get_property_reply (dpyinfo->xcb_connection,
+ workarea_cookie, &error);
+
+ if (!reply)
+ free (error), rc = false;
+ else
+ {
+ if (rc && reply->type == XCB_ATOM_CARDINAL && reply->format == 32
+ && (xcb_get_property_value_length (reply) / sizeof (uint32_t)
+ >= current_workspace + 4))
+ {
+ values = xcb_get_property_value (reply);
+
+ rect->x = values[current_workspace];
+ rect->y = values[current_workspace + 1];
+ rect->width = values[current_workspace + 2];
+ rect->height = values[current_workspace + 3];
+ }
+ else
+ rc = false;
+
+ free (reply);
+ }
+
+ return rc;
+#endif
}
#endif /* !(USE_GTK && HAVE_GTK3) */
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- master 0e662f33e1: Rewrite desktop workarea computation to avoid too many calls to XSync,
Po Lu <=