shod

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

commit b9cc904dc83a3e73417f241333133c8650b44377
parent 316f01055d948eda06fc2897af313eb39170008a
Author: Lucas de Sena <lucas@seninha.org>
Date:   Sat, 22 Apr 2023 08:54:45 -0300

add menuupdate

menuupdate maps/unmaps the menus according to the focused tab

Diffstat:
Mshod.h | 2++
Mxcontainer.c | 37+------------------------------------
Mxevents.c | 9+++++----
Mxmenu.c | 28++++++++++++++++++++++++++++
4 files changed, 36 insertions(+), 40 deletions(-)

diff --git a/shod.h b/shod.h @@ -744,6 +744,8 @@ void menudecorate(struct Menu *menu, int titlepressed); void menufocusraise(struct Menu *menu); void menuraise(struct Menu *menu); void menuplace(struct Monitor *mon, struct Menu *menu); +void menuupdate(void); +int istabformenu(struct Tab *tab, struct Menu *menu); /* other object routines */ void dockappconfigure(struct Dockapp *dapp, unsigned int valuemask, XWindowChanges *wc); diff --git a/xcontainer.c b/xcontainer.c @@ -162,36 +162,6 @@ dialognew(Window win, int maxw, int maxh, int ignoreunmap) return dial; } -/* check if given tab accepts given menu */ -static int -istabformenu(struct Tab *tab, struct Menu *menu) -{ - return (menu->leader == tab->obj.win || menu->leader == tab->leader); -} - -/* map menus */ -static void -tabhidemenus(struct Tab *tab, int hide) -{ - struct Object *obj; - struct Menu *menu; - - if (tab == NULL) - return; - TAILQ_FOREACH(obj, &wm.menuq, entry) { - menu = ((struct Menu *)obj); - if (!istabformenu(tab, menu)) - continue; - if (hide) { - XUnmapWindow(dpy, ((struct Menu *)obj)->frame); - icccmwmstate(obj->win, IconicState); - } else { - XMapWindow(dpy, menu->frame); - icccmwmstate(obj->win, NormalState); - } - } -} - /* calculate position and width of tabs of a row */ static void rowcalctabs(struct Row *row) @@ -310,7 +280,6 @@ tabdel(struct Tab *tab) { struct Dialog *dial; - tabhidemenus(tab, ADD); while ((dial = (struct Dialog *)TAILQ_FIRST(&tab->dialq)) != NULL) { XDestroyWindow(dpy, dial->obj.win); unmanagedialog((struct Object *)dial, 0); @@ -602,10 +571,8 @@ containerhide(struct Container *c, int hide) c->ishidden = hide; if (hide) { XUnmapWindow(dpy, c->frame); - tabhidemenus(c->selcol->selrow->seltab, ADD); } else { XMapWindow(dpy, c->frame); - tabhidemenus(c->selcol->selrow->seltab, REMOVE); } TAB_FOREACH_BEGIN(c, t) { icccmwmstate(t->win, (hide ? IconicState : NormalState)); @@ -1680,8 +1647,6 @@ tabfocus(struct Tab *tab, int gotodesk) struct Dialog *dial; wm.prevfocused = wm.focused; - if (wm.prevfocused != NULL && tab != wm.prevfocused->selcol->selrow->seltab) - tabhidemenus(wm.prevfocused->selcol->selrow->seltab, ADD); if (tab == NULL) { wm.focused = NULL; XSetInputFocus(dpy, wm.focuswin, RevertToParent, CurrentTime); @@ -1712,7 +1677,6 @@ tabfocus(struct Tab *tab, int gotodesk) ewmhsetactivewindow(tab->obj.win); if (tab->isurgent) tabclearurgency(tab); - tabhidemenus(tab, REMOVE); containeraddfocus(c); containerdecorate(c, NULL, NULL, 1, 0); containerminimize(c, 0, 0); @@ -1725,6 +1689,7 @@ tabfocus(struct Tab *tab, int gotodesk) containerdecorate(wm.prevfocused, NULL, NULL, 1, 0); ewmhsetstate(wm.prevfocused); } + menuupdate(); } /* decorate tab */ diff --git a/xevents.c b/xevents.c @@ -679,6 +679,7 @@ deskshow(int show) splashhide((struct Splash *)obj, show); wm.showingdesk = show; ewmhsetshowingdesktop(show); + menuupdate(); } /* update desktop */ @@ -700,9 +701,9 @@ deskupdate(struct Monitor *mon, int desk) if (c->mon != mon) continue; if (!c->isminimized && c->desk == desk) { - containerhide(c, 0); + containerhide(c, REMOVE); } else if (!c->issticky && c->desk == mon->seldesk) { - containerhide(c, 1); + containerhide(c, ADD); } } TAILQ_FOREACH(obj, &wm.splashq, entry) { @@ -710,9 +711,9 @@ deskupdate(struct Monitor *mon, int desk) if (splash->mon != mon) continue; if (splash->desk == desk) { - splashhide(splash, 0); + splashhide(splash, REMOVE); } else if (splash->desk == mon->seldesk) { - splashhide(splash, 1); + splashhide(splash, ADD); } } } diff --git a/xmenu.c b/xmenu.c @@ -214,3 +214,31 @@ unmanagemenu(struct Object *obj, int ignoreunmap) free(menu); return 1; } + +/* check if given tab accepts given menu */ +int +istabformenu(struct Tab *tab, struct Menu *menu) +{ + return (menu->leader == tab->obj.win || menu->leader == tab->leader); +} + +/* map menus for current focused tab */ +void +menuupdate(void) +{ + struct Object *obj; + struct Menu *menu; + + TAILQ_FOREACH(obj, &wm.menuq, entry) { + menu = ((struct Menu *)obj); + if (menu->leader == None || wm.showingdesk) + continue; + if (wm.focused != NULL && istabformenu(wm.focused->selcol->selrow->seltab, menu)) { + XMapWindow(dpy, menu->frame); + icccmwmstate(obj->win, NormalState); + } else { + XUnmapWindow(dpy, ((struct Menu *)obj)->frame); + icccmwmstate(obj->win, IconicState); + } + } +}