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:
M | shod.h | | | 2 | ++ |
M | xdock.c | | | 78 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------- |
M | xevents.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)