shod

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

commit 7bfc3acf400c9ea3f51cea948a06fbfa6e63015a
parent 50ea9637fe94099336045526258320b14f944a72
Author: Lucas de Sena <lucas@seninha.org>
Date:   Sun,  9 Apr 2023 21:33:37 -0300

reorganize dockapps on resources reload; fix #36

Diffstat:
Mshod.h | 2++
Mxdock.c | 78+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------------
Mxevents.c | 4++--
3 files changed, 63 insertions(+), 21 deletions(-)

diff --git a/shod.h b/shod.h @@ -753,6 +753,7 @@ void splashhide(struct Splash *splash, int hide); void splashrise(struct Splash *splash); void dockupdate(void); void dockdecorate(void); +void dockreset(void); /* monitor routines */ struct Monitor *getmon(int x, int y); @@ -818,6 +819,7 @@ Unmanagefunc unmanagebar; void setmod(void); void scan(void); void deskupdate(struct Monitor *mon, int desk); +int getwintype(Window *win_ret, Window *leader, struct Tab **tab, int *state, XRectangle *rect, int *desk); /* function tables */ extern void (*managefuncs[])(struct Tab *, struct Monitor *, int, Window, Window, XRectangle, int, int); diff --git a/xdock.c b/xdock.c @@ -43,25 +43,11 @@ dockappconfigure(struct Dockapp *dapp, unsigned int valuemask, XWindowChanges *w } } -/* create dockapp */ static void -dockappnew(Window win, int w, int h, int dockpos, int state, int ignoreunmap) +dockappinsert(struct Dockapp *dapp) { - struct Dockapp *dapp; struct Object *prev; - dapp = emalloc(sizeof(*dapp)); - *dapp = (struct Dockapp){ - .obj.type = TYPE_DOCKAPP, - .obj.win = win, - .x = 0, - .y = 0, - .w = 0, - .h = 0, - .ignoreunmap = ignoreunmap, - .dockpos = dockpos, - .state = state, - }; TAILQ_FOREACH_REVERSE(prev, &dock.dappq, Queue, entry) if (((struct Dockapp *)prev)->dockpos <= dapp->dockpos) break; @@ -74,12 +60,33 @@ dockappnew(Window win, int w, int h, int dockpos, int state, int ignoreunmap) dapp, CWWidth | CWHeight, &(XWindowChanges){ - .width = w, - .height = h, + .width = dapp->w, + .height = dapp->h, } ); } +/* create dockapp */ +static void +dockappnew(Window win, int w, int h, int dockpos, int state, int ignoreunmap) +{ + struct Dockapp *dapp; + + dapp = emalloc(sizeof(*dapp)); + *dapp = (struct Dockapp){ + .obj.type = TYPE_DOCKAPP, + .obj.win = win, + .x = 0, + .y = 0, + .w = w, + .h = h, + .ignoreunmap = ignoreunmap, + .dockpos = dockpos, + .state = state, + }; + dockappinsert(dapp); +} + /* compute dockapp position given its width or height */ static int dockapppos(int pos) @@ -88,7 +95,7 @@ dockapppos(int pos) } /* update dock position; create it, if necessary */ -void +static void dockupdateresizeable(void) { struct Monitor *mon; @@ -207,7 +214,7 @@ dockupdateresizeable(void) } /* update dock position; create it, if necessary */ -void +static void dockupdatefull(void) { struct Object *p; @@ -380,3 +387,36 @@ unmanagedockapp(struct Object *obj, int ignoreunmap) monupdatearea(); return 0; } + +void +dockreset(void) +{ + struct Queue dappq; + struct Object *obj; + struct Dockapp *dapp; + Window win, dummyw; + struct Tab *dummyt; + XRectangle rect; + int state, desk; + + if (TAILQ_EMPTY(&dock.dappq)) + return; + TAILQ_INIT(&dappq); + while ((obj = TAILQ_FIRST(&dock.dappq)) != NULL) { + TAILQ_REMOVE(&dock.dappq, obj, entry); + TAILQ_INSERT_TAIL(&dappq, obj, entry); + } + while ((obj = TAILQ_FIRST(&dappq)) != NULL) { + TAILQ_REMOVE(&dappq, obj, entry); + win = obj->win; + getwintype(&win, &dummyw, &dummyt, &state, &rect, &desk); + dapp = (struct Dockapp *)obj; + if (rect.x > 0) + dapp->dockpos = rect.x; + if (state != 0) + dapp->state = state; + dockappinsert(dapp); + } + dockupdate(); + dockdecorate(); +} diff --git a/xevents.c b/xevents.c @@ -379,7 +379,7 @@ getextrahints(Window win, Atom prop, unsigned long nmemb, size_t size, void *hin #define STRCMP(a, b) ((a) != NULL && (b) != NULL && strcmp((a), (b)) == 0) /* get window info based on its type */ -static int +int getwintype(Window *win_ret, Window *leader, struct Tab **tab, int *state, XRectangle *rect, int *desk) { /* rules for identifying windows */ @@ -1792,7 +1792,7 @@ xeventpropertynotify(XEvent *e) menudecorate((struct Menu *)obj, 0); TAILQ_FOREACH(obj, &wm.notifq, entry) notifdecorate((struct Notification *)obj); - dockdecorate(); + dockreset(); return; } if (ev->state == PropertyDelete)