|
@@ -58,6 +58,22 @@ enum { WMProtocols, WMDelete, WMName, WMState, WMLast };/* default atoms */
|
|
|
/* typedefs */
|
|
/* typedefs */
|
|
|
typedef struct Client Client;
|
|
typedef struct Client Client;
|
|
|
|
|
|
|
|
|
|
+struct Client {
|
|
|
|
|
+ char name[256];
|
|
|
|
|
+ int x, y, w, h;
|
|
|
|
|
+ int rx, ry, rw, rh; /* revert geometry */
|
|
|
|
|
+ int basew, baseh, incw, inch, maxw, maxh, minw, minh;
|
|
|
|
|
+ int minax, maxax, minay, maxay;
|
|
|
|
|
+ long flags;
|
|
|
|
|
+ unsigned int border, oldborder;
|
|
|
|
|
+ Bool isbanned, isfixed, ismax, isfloating, wasfloating;
|
|
|
|
|
+ Bool *tags;
|
|
|
|
|
+ Client *next;
|
|
|
|
|
+ Client *prev;
|
|
|
|
|
+ Client *snext;
|
|
|
|
|
+ Window win;
|
|
|
|
|
+};
|
|
|
|
|
+
|
|
|
typedef struct {
|
|
typedef struct {
|
|
|
int x, y, w, h;
|
|
int x, y, w, h;
|
|
|
unsigned long norm[ColLast];
|
|
unsigned long norm[ColLast];
|
|
@@ -170,6 +186,7 @@ void updatebarpos(void);
|
|
|
void updatesizehints(Client *c);
|
|
void updatesizehints(Client *c);
|
|
|
void updatetitle(Client *c);
|
|
void updatetitle(Client *c);
|
|
|
void view(const char *arg);
|
|
void view(const char *arg);
|
|
|
|
|
+void viewprevtag(const char *arg); /* views previous selected tags */
|
|
|
int xerror(Display *dpy, XErrorEvent *ee);
|
|
int xerror(Display *dpy, XErrorEvent *ee);
|
|
|
int xerrordummy(Display *dsply, XErrorEvent *ee);
|
|
int xerrordummy(Display *dsply, XErrorEvent *ee);
|
|
|
int xerrorstart(Display *dsply, XErrorEvent *ee);
|
|
int xerrorstart(Display *dsply, XErrorEvent *ee);
|
|
@@ -219,22 +236,7 @@ Regs *regs = NULL;
|
|
|
/* Statically define the number of tags. */
|
|
/* Statically define the number of tags. */
|
|
|
unsigned int ntags = sizeof tags / sizeof tags[0];
|
|
unsigned int ntags = sizeof tags / sizeof tags[0];
|
|
|
Bool seltags[sizeof tags / sizeof tags[0]] = {[0] = True};
|
|
Bool seltags[sizeof tags / sizeof tags[0]] = {[0] = True};
|
|
|
-
|
|
|
|
|
-struct Client {
|
|
|
|
|
- char name[256];
|
|
|
|
|
- int x, y, w, h;
|
|
|
|
|
- int rx, ry, rw, rh; /* revert geometry */
|
|
|
|
|
- int basew, baseh, incw, inch, maxw, maxh, minw, minh;
|
|
|
|
|
- int minax, maxax, minay, maxay;
|
|
|
|
|
- long flags;
|
|
|
|
|
- unsigned int border, oldborder;
|
|
|
|
|
- Bool isbanned, isfixed, ismax, isfloating, wasfloating;
|
|
|
|
|
- Bool tags[sizeof tags / sizeof tags[0]];
|
|
|
|
|
- Client *next;
|
|
|
|
|
- Client *prev;
|
|
|
|
|
- Client *snext;
|
|
|
|
|
- Window win;
|
|
|
|
|
-};
|
|
|
|
|
|
|
+Bool prevtags[sizeof tags / sizeof tags[0]] = {[0] = True};
|
|
|
|
|
|
|
|
/* functions*/
|
|
/* functions*/
|
|
|
void
|
|
void
|
|
@@ -265,8 +267,7 @@ applyrules(Client *c) {
|
|
|
if(ch.res_name)
|
|
if(ch.res_name)
|
|
|
XFree(ch.res_name);
|
|
XFree(ch.res_name);
|
|
|
if(!matched)
|
|
if(!matched)
|
|
|
- for(i = 0; i < ntags; i++)
|
|
|
|
|
- c->tags[i] = seltags[i];
|
|
|
|
|
|
|
+ memcpy(c->tags, seltags, sizeof seltags);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void
|
|
void
|
|
@@ -1002,13 +1003,13 @@ leavenotify(XEvent *e) {
|
|
|
|
|
|
|
|
void
|
|
void
|
|
|
manage(Window w, XWindowAttributes *wa) {
|
|
manage(Window w, XWindowAttributes *wa) {
|
|
|
- unsigned int i;
|
|
|
|
|
Client *c, *t = NULL;
|
|
Client *c, *t = NULL;
|
|
|
Window trans;
|
|
Window trans;
|
|
|
Status rettrans;
|
|
Status rettrans;
|
|
|
XWindowChanges wc;
|
|
XWindowChanges wc;
|
|
|
|
|
|
|
|
c = emallocz(sizeof(Client));
|
|
c = emallocz(sizeof(Client));
|
|
|
|
|
+ c->tags = emallocz(sizeof seltags);
|
|
|
c->win = w;
|
|
c->win = w;
|
|
|
c->x = wa->x;
|
|
c->x = wa->x;
|
|
|
c->y = wa->y;
|
|
c->y = wa->y;
|
|
@@ -1043,8 +1044,7 @@ manage(Window w, XWindowAttributes *wa) {
|
|
|
if((rettrans = XGetTransientForHint(dpy, w, &trans) == Success))
|
|
if((rettrans = XGetTransientForHint(dpy, w, &trans) == Success))
|
|
|
for(t = clients; t && t->win != trans; t = t->next);
|
|
for(t = clients; t && t->win != trans; t = t->next);
|
|
|
if(t)
|
|
if(t)
|
|
|
- for(i = 0; i < ntags; i++)
|
|
|
|
|
- c->tags[i] = t->tags[i];
|
|
|
|
|
|
|
+ memcpy(c->tags, t->tags, sizeof seltags);
|
|
|
applyrules(c);
|
|
applyrules(c);
|
|
|
if(!c->isfloating)
|
|
if(!c->isfloating)
|
|
|
c->isfloating = (rettrans == Success) || c->isfixed;
|
|
c->isfloating = (rettrans == Success) || c->isfixed;
|
|
@@ -1702,6 +1702,7 @@ unmanage(Client *c) {
|
|
|
focus(NULL);
|
|
focus(NULL);
|
|
|
XUngrabButton(dpy, AnyButton, AnyModifier, c->win);
|
|
XUngrabButton(dpy, AnyButton, AnyModifier, c->win);
|
|
|
setclientstate(c, WithdrawnState);
|
|
setclientstate(c, WithdrawnState);
|
|
|
|
|
+ free(c->tags);
|
|
|
free(c);
|
|
free(c);
|
|
|
XSync(dpy, False);
|
|
XSync(dpy, False);
|
|
|
XSetErrorHandler(xerror);
|
|
XSetErrorHandler(xerror);
|
|
@@ -1838,6 +1839,7 @@ void
|
|
|
view(const char *arg) {
|
|
view(const char *arg) {
|
|
|
unsigned int i;
|
|
unsigned int i;
|
|
|
|
|
|
|
|
|
|
+ memcpy(prevtags, seltags, sizeof seltags);
|
|
|
for(i = 0; i < ntags; i++)
|
|
for(i = 0; i < ntags; i++)
|
|
|
seltags[i] = arg == NULL;
|
|
seltags[i] = arg == NULL;
|
|
|
i = idxoftag(arg);
|
|
i = idxoftag(arg);
|
|
@@ -1846,6 +1848,16 @@ view(const char *arg) {
|
|
|
arrange();
|
|
arrange();
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+void
|
|
|
|
|
+viewprevtag(const char *arg) {
|
|
|
|
|
+ static Bool tmptags[sizeof tags / sizeof tags[0]];
|
|
|
|
|
+
|
|
|
|
|
+ memcpy(tmptags, seltags, sizeof seltags);
|
|
|
|
|
+ memcpy(seltags, prevtags, sizeof seltags);
|
|
|
|
|
+ memcpy(prevtags, tmptags, sizeof seltags);
|
|
|
|
|
+ arrange();
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
void
|
|
void
|
|
|
zoom(const char *arg) {
|
|
zoom(const char *arg) {
|
|
|
Client *c;
|
|
Client *c;
|