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:
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);
+ }
+ }
+}