diff options
| author | Abhinav <abhinav.prsai@gmail.com> | 2025-06-07 14:10:32 +0100 |
|---|---|---|
| committer | Abhinav <abhinav.prsai@gmail.com> | 2025-06-07 14:10:32 +0100 |
| commit | ab02de0e72dcc454a1697fbbe9b56652889deb0b (patch) | |
| tree | 68e12525f3f4760953b6f730100c0547e039a0a6 /src | |
| parent | f1d4ec42e9e7552862016a44437977b4c86116ac (diff) | |
add find_toplevel function
This function correctly handles windows like firefox by finding the root
window so that clicking on it will focus the window
Diffstat (limited to 'src')
| -rw-r--r-- | src/sxwm.c | 26 |
1 files changed, 26 insertions, 0 deletions
@@ -42,6 +42,7 @@ int clean_mask(int mask); /* void close_focused(void); */ /* void dec_gaps(void); */ void startup_exec(void); +Window find_toplevel(Window w); /* void focus_next(void); */ /* void focus_prev(void); */ int get_monitor_for(Client *c); @@ -323,6 +324,29 @@ void startup_exec(void) } } +Window find_toplevel(Window w) +{ + Window root = None; + Window parent; + Window *kids; + unsigned nkids; + + while (True) { + if (w == root) { + break; + } + if (XQueryTree(dpy, w, &root, &parent, &kids, &nkids) == 0) { + break; + } + XFree(kids); + if (parent == root || parent == None) { + break; + } + w = parent; + } + return w; +} + void focus_next(void) { if (!focused || !workspaces[current_ws]) { @@ -586,6 +610,8 @@ void hdl_button(XEvent *xev) { XButtonEvent *e = &xev->xbutton; Window w = (e->subwindow != None) ? e->subwindow : e->window; + w = find_toplevel(w); + XAllowEvents(dpy, ReplayPointer, e->time); if (!w) { return; |
