about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--client.c17
-rw-r--r--dwm.h3
-rw-r--r--event.c4
-rw-r--r--layout.c41
4 files changed, 31 insertions, 34 deletions
diff --git a/client.c b/client.c
index f3d31cb..90399ae 100644
--- a/client.c
+++ b/client.c
@@ -129,8 +129,8 @@ detach(Client *c) {
 
 void
 focus(Client *c) {
-	if(c && !isvisible(c))
-		return;
+	if( !c && selscreen || c && !isvisible(c))
+		for(c = stack; c && !isvisible(c); c = c->snext);
 	if(sel && sel != c) {
 		grabbuttons(sel, False);
 		XSetWindowBorder(dpy, sel->win, dc.norm[ColBorder]);
@@ -153,14 +153,6 @@ focus(Client *c) {
 }
 
 void
-focustopvisible(void) {
-	Client *c;
-
-	for(c = stack; c && !isvisible(c); c = c->snext);
-	focus(c);
-}
-
-void
 killclient(const char *arg) {
 	XEvent ev;
 
@@ -230,8 +222,7 @@ manage(Window w, XWindowAttributes *wa) {
 	XMoveWindow(dpy, w, c->x + 2 * sw, c->y);
 	XMapWindow(dpy, w);
 	setclientstate(c, NormalState);
-	if(isvisible(c))
-		focus(c);
+	focus(c);
 	lt->arrange();
 }
 
@@ -401,7 +392,7 @@ unmanage(Client *c) {
 	detach(c);
 	detachstack(c);
 	if(sel == c)
-		focustopvisible();
+		focus(NULL);
 	XUngrabButton(dpy, AnyButton, AnyModifier, c->win);
 	setclientstate(c, WithdrawnState);
 	free(c->tags);
diff --git a/dwm.h b/dwm.h
index 769d1b1..2c1d41b 100644
--- a/dwm.h
+++ b/dwm.h
@@ -100,8 +100,7 @@ Window root, barwin;
 void attach(Client *c);			/* attaches c to global client list */
 void configure(Client *c);		/* send synthetic configure event */
 void detach(Client *c);			/* detaches c from global client list */
-void focus(Client *c);			/* focus c, c may be NULL */
-void focustopvisible(void);		/* focus top visible window on stack */
+void focus(Client *c);			/* focus c if visible && !NULL, or focus top visible */
 void killclient(const char *arg);	/* kill sel  nicely */
 void manage(Window w, XWindowAttributes *wa);	/* manage new client */
 void resize(Client *c, int x, int y,
diff --git a/event.c b/event.c
index 2773c6f..f9d2e0c 100644
--- a/event.c
+++ b/event.c
@@ -242,11 +242,11 @@ enternotify(XEvent *e) {
 
 	if(ev->mode != NotifyNormal || ev->detail == NotifyInferior)
 		return;
-	if((c = getclient(ev->window)) && isvisible(c))
+	if(c = getclient(ev->window))
 		focus(c);
 	else if(ev->window == root) {
 		selscreen = True;
-		focustopvisible();
+		focus(NULL);
 	}
 }
 
diff --git a/layout.c b/layout.c
index 4b4e908..de6aef6 100644
--- a/layout.c
+++ b/layout.c
@@ -14,6 +14,22 @@ static unsigned int masterw = MASTERWIDTH;
 static unsigned int nmaster = NMASTER;
 
 static void
+ban(Client *c) {
+	if (c->isbanned)
+		return;
+	XMoveWindow(dpy, c->win, c->x + 2 * sw, c->y);
+	c->isbanned = True;
+}
+
+static void
+unban(Client *c) {
+	if (!c->isbanned)
+		return;
+	XMoveWindow(dpy, c->win, c->x, c->y);
+	c->isbanned = False;
+}
+
+static void
 tile(void) {
 	unsigned int i, n, nx, ny, nw, nh, mw, mh, tw, th;
 	Client *c;
@@ -28,9 +44,7 @@ tile(void) {
 
 	for(i = 0, c = clients; c; c = c->next)
 		if(isvisible(c)) {
-			if(c->isbanned)
-				XMoveWindow(dpy, c->win, c->x, c->y);
-			c->isbanned = False;
+			unban(c);
 			if(c->isfloating)
 				continue;
 			c->ismax = False;
@@ -60,12 +74,9 @@ tile(void) {
 			resize(c, nx, ny, nw, nh, False);
 			i++;
 		}
-		else {
-			c->isbanned = True;
-			XMoveWindow(dpy, c->win, c->x + 2 * sw, c->y);
-		}
-	if(!sel || !isvisible(sel)) 
-		focustopvisible();
+		else
+			ban(c);
+	focus(NULL);
 	restack();
 }
 
@@ -77,20 +88,16 @@ void
 floating(void) {
 	Client *c;
 
-	for(c = clients; c; c = c->next) {
+	for(c = clients; c; c = c->next)
 		if(isvisible(c)) {
 			if(c->isbanned)
 				XMoveWindow(dpy, c->win, c->x, c->y);
 			c->isbanned = False;
 			resize(c, c->x, c->y, c->w, c->h, True);
 		}
-		else {
-			c->isbanned = True;
-			XMoveWindow(dpy, c->win, c->x + 2 * sw, c->y);
-		}
-	}
-	if(!sel || !isvisible(sel))
-		focustopvisible();
+		else
+			ban(c);
+	focus(NULL);
 	restack();
 }
 
m.msg.Filename()) if err != nil { return nil, err } defer f.Close() b, err := ioutil.ReadAll(f) if err != nil { return nil, err } return bytes.NewReader(b), nil } // MessageInfo populates a models.MessageInfo struct for the message. func (m Message) MessageInfo() (*models.MessageInfo, error) { return lib.MessageInfo(m) } // NewBodyPartReader creates a new io.Reader for the requested body part(s) of // the message. func (m Message) NewBodyPartReader(requestedParts []int) (io.Reader, error) { f, err := os.Open(m.msg.Filename()) if err != nil { return nil, err } defer f.Close() msg, err := message.Read(f) if err != nil { return nil, fmt.Errorf("could not read message: %v", err) } return lib.FetchEntityPartReader(msg, requestedParts) } // MarkRead either adds or removes the maildir.FlagSeen flag from the message. func (m Message) MarkRead(seen bool) error { haveUnread := false for _, t := range m.tags() { if t == "unread" { haveUnread = true break } } if (haveUnread && !seen) || (!haveUnread && seen) { // we already have the desired state return nil } if haveUnread { err := m.msg.RemoveTag("unread") if err != nil { return err } return nil } err := m.msg.AddTag("unread") if err != nil { return err } return nil } // tags returns the notmuch tags of a message func (m Message) tags() []string { ts := m.msg.Tags() var tags []string var tag *notmuch.Tag for ts.Next(&tag) { tags = append(tags, tag.Value) } return tags } func (m Message) ModelFlags() ([]models.Flag, error) { var flags []models.Flag seen := true for _, tag := range m.tags() { switch tag { case "replied": flags = append(flags, models.AnsweredFlag) case "flagged": flags = append(flags, models.FlaggedFlag) case "unread": seen = false default: continue } } if seen { flags = append(flags, models.SeenFlag) } return flags, nil } func (m Message) UID() uint32 { return m.uid }