X-Git-Url: https://git.xinqibao.xyz/dwm.git/blobdiff_plain/0937cc78bf5d8855dcd757b18e10c7dd49e7a1ab..04dec4c94390fdf57893615de5b5872dd5abbce4:/layout.c

diff --git a/layout.c b/layout.c
index fe12e1e..46e82c2 100644
--- a/layout.c
+++ b/layout.c
@@ -2,10 +2,24 @@
 #include "dwm.h"
 #include <stdlib.h>
 
+/* static */
+
+typedef struct {
+	const char *symbol;
+	void (*arrange)(void);
+} Layout;
+
 unsigned int blw = 0;
-Layout *lt = NULL;
+static Layout *lt = NULL;
 
-/* static */
+static void
+floating(void) { /* default floating layout */
+	Client *c;
+
+	for(c = clients; c; c = c->next)
+		if(isvisible(c))
+			resize(c, c->x, c->y, c->w, c->h, True);
+}
 
 static unsigned int nlayouts = 0;
 
@@ -14,40 +28,44 @@ LAYOUTS
 /* extern */
 
 void
-floating(void) {
+arrange(void) {
 	Client *c;
 
-	if(lt->arrange != floating)
-		return;
-
 	for(c = clients; c; c = c->next)
-		if(isvisible(c)) {
+		if(isvisible(c))
 			unban(c);
-			resize(c, c->x, c->y, c->w, c->h, True);
-		}
 		else
 			ban(c);
+	lt->arrange();
 	focus(NULL);
 	restack();
 }
 
 void
-focusclient(const char *arg) {
+focusnext(const char *arg) {
 	Client *c;
-   
-	if(!sel || !arg)
+
+	if(!sel)
 		return;
-	if(atoi(arg) < 0) {
-		for(c = sel->prev; c && !isvisible(c); c = c->prev);
-		if(!c) {
-			for(c = clients; c && c->next; c = c->next);
-			for(; c && !isvisible(c); c = c->prev);
-		}
+	for(c = sel->next; c && !isvisible(c); c = c->next);
+	if(!c)
+		for(c = clients; c && !isvisible(c); c = c->next);
+	if(c) {
+		focus(c);
+		restack();
 	}
-	else {
-		for(c = sel->next; c && !isvisible(c); c = c->next);
-		if(!c)
-			for(c = clients; c && !isvisible(c); c = c->next);
+}
+
+void
+focusprev(const char *arg) {
+	Client *c;
+
+	if(!sel)
+		return;
+	for(c = sel->prev; c && !isvisible(c); c = c->prev);
+	if(!c) {
+		for(c = clients; c && c->next; c = c->next);
+		for(; c && !isvisible(c); c = c->prev);
 	}
 	if(c) {
 		focus(c);
@@ -55,14 +73,31 @@ focusclient(const char *arg) {
 	}
 }
 
+const char *
+getsymbol(void)
+{
+	return lt->symbol;
+}
+
+Bool
+isfloating(void) {
+	return lt->arrange == floating;
+}
+
+Bool
+isarrange(void (*func)())
+{
+	return func == lt->arrange;
+}
+
 void
 initlayouts(void) {
 	unsigned int i, w;
 
-	lt = &layout[0];
-	nlayouts = sizeof layout / sizeof layout[0];
+	lt = &layouts[0];
+	nlayouts = sizeof layouts / sizeof layouts[0];
 	for(blw = i = 0; i < nlayouts; i++) {
-		w = textw(layout[i].symbol);
+		w = textw(layouts[i].symbol);
 		if(w > blw)
 			blw = w;
 	}
@@ -109,17 +144,17 @@ setlayout(const char *arg) {
 
 	if(!arg) {
 		lt++;
-		if(lt == layout + nlayouts)
-			lt = layout;
+		if(lt == layouts + nlayouts)
+			lt = layouts;
 	}
 	else {
 		i = atoi(arg);
 		if(i < 0 || i >= nlayouts)
 			return;
-		lt = &layout[i];
+		lt = &layouts[i];
 	}
 	if(sel)
-		lt->arrange();
+		arrange();
 	else
 		drawstatus();
 }
@@ -131,7 +166,7 @@ togglebar(const char *arg) {
 	else
 		bpos = BarOff;
 	updatebarpos();
-	lt->arrange();
+	arrange();
 }
 
 void