tAdd functions to find related frame/child window - glazier - window management experiments
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) Submodules
(DIR) README
(DIR) LICENSE
---
(DIR) commit 2c18dfb01cb31e56087de427032b75c9f4cfcd17
(DIR) parent 6618d5e46d1790e2e28cd0421a124ad853df8751
(HTM) Author: Willy Goiffon <dev@z3bra.org>
Date: Tue, 22 Oct 2019 08:16:02 +0200
Add functions to find related frame/child window
Diffstat:
M glazier.c | 49 +++++++++++++++++++++++++++----
1 file changed, 43 insertions(+), 6 deletions(-)
---
(DIR) diff --git a/glazier.c b/glazier.c
t@@ -76,12 +76,54 @@ frame_window(xcb_window_t child)
x, y, w, h, b, XCB_WINDOW_CLASS_INPUT_OUTPUT, scrn->root_visual,
XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK, val);
+ if (verbose)
+ fprintf(stderr, "frame: 0x%08x\n", parent);
+
xcb_reparent_window(conn, child, parent, 0, titlebar);
xcb_map_window(conn, parent);
return parent;
}
+xcb_window_t
+get_frame(xcb_window_t wid)
+{
+ xcb_window_t frame = wid;
+ xcb_query_tree_cookie_t c;
+ xcb_query_tree_reply_t *r;
+
+ for (;;) {
+ c = xcb_query_tree(conn, wid);
+ r = xcb_query_tree_reply(conn, c, NULL);
+ if (r == NULL)
+ return -1;
+
+ wid = r->parent;
+ free(r);
+
+ if (wid == scrn->root)
+ break;
+
+ frame = wid;
+ }
+
+ return frame;
+}
+
+xcb_window_t
+get_child(xcb_window_t wid)
+{
+ xcb_window_t child, *children;
+
+ if (wm_get_windows(wid, &children) != 1)
+ return -1;
+
+ child = children[0];
+ free(children);
+
+ return child;
+}
+
static int
cb_default(xcb_generic_event_t *ev)
{
t@@ -257,13 +299,8 @@ cb_motion(xcb_generic_event_t *ev)
wm_move(curwid, ABSOLUTE, x, y);
break;
case 3:
+ wm_resize(get_child(curwid), ABSOLUTE, x, y - titlebar);
wm_resize(curwid, ABSOLUTE, x, y);
- if (wm_get_windows(curwid, &child) == 1) {
- x = wm_get_attribute(curwid, ATTR_W);
- y = wm_get_attribute(curwid, ATTR_H);
- wm_resize(child[0], ABSOLUTE, x, y);
- free(child);
- }
break;
}