Page 1 sur 1

[DWM] Définir un Layout par Tag

Publié : mer. 07 nov. 2012, 15:03
par Ichigo-Roku
Bonjour,

J'ai installé le patch pertag, maintenant quand je modifie un Layout ça le modifie seulement dans le tag où je me trouve.

Par contre en me promenant sur les forums archlinux j'ai vu un config.h et dessus l'utilisateur donne un Layout pour chaque Tag, voici ce que j'ai reproduis ici.

Chez moi j'ai toujours le Tag par défaut alors que j'ai demandé à certains Tags d'être au Layout par défaut et à d'autres d'être à mon second Layout.

Merci d'avance.

Re: [DWM] Définir un Layout par Tag

Publié : mer. 07 nov. 2012, 17:17
par Ypnose
Voici la section provenant du mon config.h perso:

Code : Tout sélectionner

/* tagging */
	static const Tag tags[] = {
	/* name       layout           mfact    nmaster */
	{ "term",      &layouts[0],     0.35,    -1 },
	{ "net",       &layouts[2],     -1,      -1 },
	{ "gatw",      &layouts[1],     0.45,    -1 },
	{ "conf",      &layouts[0],     -1,      -1 },
	{ "harm",      &layouts[0],     0.45,    -1 },
	{ "foo",       &layouts[1],     0.4,     -1 },
};
J'utilise pertag2. Tu peux le trouver dans ce sujet: https://bbs.archlinux.org/viewtopic.php?pid=1032054

Re: [DWM] Définir un Layout par Tag

Publié : mer. 07 nov. 2012, 17:39
par Ichigo-Roku
Donc pertag ne le permet pas ? Par contre je dois enlever pertag pour mettre pertag2 ?

Re: [DWM] Définir un Layout par Tag

Publié : mer. 07 nov. 2012, 17:41
par Ypnose
Je ne connais pas ton pertag. J'ai toujours utilisé pertag2 et je n'ai jamais eu aucun soucis.
Sinon, recommence tout et patche uniquement avec pertag2, sur les sources vanilla de dwm (garde juste ton config.h).

Re: [DWM] Définir un Layout par Tag

Publié : mer. 07 nov. 2012, 18:43
par Ichigo-Roku
Petit problème à la compilation :

Code : Tout sélectionner

request for member "name" in something not a struction or union
Ça arrive aussi pour mfact, nmaster et layout, comme si la structure du début n'existait pas en fait...

Re: [DWM] Définir un Layout par Tag

Publié : mer. 07 nov. 2012, 18:58
par Ypnose
Donne ton config.h.
EDIT: Voici le patch:

Code : Tout sélectionner

--- a/dwm.c	2011-12-19 17:09:07.000000000 +0200
+++ b/dwm.c	2011-12-26 21:20:17.090865115 +0200
@@ -126,8 +126,6 @@ typedef struct {
 
 struct Monitor {
 	char ltsymbol[16];
-	float mfact;
-	int nmaster;
 	int num;
 	int by;               /* bar geometry */
 	int mx, my, mw, mh;   /* screen size */
@@ -143,9 +141,21 @@ struct Monitor {
 	Monitor *next;
 	Window barwin;
 	const Layout *lt[2];
+	int curtag;
+	int prevtag;
+	const Layout **lts;
+	double *mfacts;
+	int *nmasters;
 };
 
 typedef struct {
+	const char *name;
+	const Layout *layout;
+	float mfact;
+	int nmaster;
+} Tag;
+
+typedef struct {
 	const char *class;
 	const char *instance;
 	const char *title;
@@ -251,6 +261,7 @@ static int xerror(Display *dpy, XErrorEv
 static int xerrordummy(Display *dpy, XErrorEvent *ee);
 static int xerrorstart(Display *dpy, XErrorEvent *ee);
 static void zoom(const Arg *arg);
+static void bstack(Monitor *m);
 
 /* variables */
 static const char broken[] = "broken";
@@ -441,7 +452,7 @@ buttonpress(XEvent *e) {
 	if(ev->window == selmon->barwin) {
 		i = x = 0;
 		do
-			x += TEXTW(tags[i]);
+			x += TEXTW(tags[i].name);
 		while(ev->x >= x && ++i < LENGTH(tags));
 		if(i < LENGTH(tags)) {
 			click = ClkTagBar;
@@ -513,6 +524,9 @@ cleanupmon(Monitor *mon) {
 	}
 	XUnmapWindow(dpy, mon->barwin);
 	XDestroyWindow(dpy, mon->barwin);
+	free(mon->mfacts);
+	free(mon->nmasters);
+	free(mon->lts);
 	free(mon);
 }
 
@@ -646,17 +660,31 @@ configurerequest(XEvent *e) {
 Monitor *
 createmon(void) {
 	Monitor *m;
+	int i, numtags = LENGTH(tags) + 1;
 
 	if(!(m = (Monitor *)calloc(1, sizeof(Monitor))))
 		die("fatal: could not malloc() %u bytes\n", sizeof(Monitor));
+	if(!(m->mfacts = calloc(numtags, sizeof(double))))
+		die("fatal: could not malloc() %u bytes\n", sizeof(double) * numtags);
+	if(!(m->nmasters = calloc(numtags, sizeof(int))))
+		die("fatal: could not malloc() %u bytes\n", sizeof(int) * numtags);
+	if(!(m->lts = calloc(numtags, sizeof(Layout *))))
+		die("fatal: could not malloc() %u bytes\n", sizeof(Layout *) * numtags);
 	m->tagset[0] = m->tagset[1] = 1;
-	m->mfact = mfact;
-	m->nmaster = nmaster;
+	m->mfacts[0] = mfact;
+	m->nmasters[0] = nmaster;
+	m->lts[0] = &layouts[0];
 	m->showbar = showbar;
 	m->topbar = topbar;
-	m->lt[0] = &layouts[0];
+	m->curtag = m->prevtag = 1;
+	for(i = 1; i < numtags; i++) {
+		m->mfacts[i] = tags[i - 1].mfact < 0 ? mfact : tags[i - 1].mfact;
+		m->nmasters[i] = tags[i - 1].nmaster < 0 ? nmaster : tags[i - 1].nmaster;
+		m->lts[i] = tags[i - 1].layout;
+	}
+	m->lt[0] = m->lts[m->curtag];
 	m->lt[1] = &layouts[1 % LENGTH(layouts)];
-	strncpy(m->ltsymbol, layouts[0].symbol, sizeof m->ltsymbol);
+	strncpy(m->ltsymbol, m->lt[0]->symbol, sizeof m->ltsymbol);
 	return m;
 }
 
@@ -729,9 +757,9 @@ drawbar(Monitor *m) {
 	}
 	dc.x = 0;
 	for(i = 0; i < LENGTH(tags); i++) {
-		dc.w = TEXTW(tags[i]);
+		dc.w = TEXTW(tags[i].name);
 		col = m->tagset[m->seltags] & 1 << i ? dc.sel : dc.norm;
-		drawtext(tags[i], col, urg & 1 << i);
+		drawtext(tags[i].name, col, urg & 1 << i);
 		drawsquare(m == selmon && selmon->sel && selmon->sel->tags & 1 << i,
 		           occ & 1 << i, urg & 1 << i, col);
 		dc.x += dc.w;
@@ -1028,7 +1056,7 @@ grabkeys(void) {
 
 void
 incnmaster(const Arg *arg) {
-	selmon->nmaster = MAX(selmon->nmaster + arg->i, 0);
+	selmon->nmasters[selmon->curtag] = MAX(selmon->nmasters[selmon->curtag] + arg->i, 0);
 	arrange(selmon);
 }
 
@@ -1558,7 +1586,7 @@ setlayout(const Arg *arg) {
 	if(!arg || !arg->v || arg->v != selmon->lt[selmon->sellt])
 		selmon->sellt ^= 1;
 	if(arg && arg->v)
-		selmon->lt[selmon->sellt] = (Layout *)arg->v;
+		selmon->lt[selmon->sellt] = selmon->lts[selmon->curtag] = (Layout *)arg->v;
 	strncpy(selmon->ltsymbol, selmon->lt[selmon->sellt]->symbol, sizeof selmon->ltsymbol);
 	if(selmon->sel)
 		arrange(selmon);
@@ -1573,10 +1601,10 @@ setmfact(const Arg *arg) {
 
 	if(!arg || !selmon->lt[selmon->sellt]->arrange)
 		return;
-	f = arg->f < 1.0 ? arg->f + selmon->mfact : arg->f - 1.0;
+	f = arg->f < 1.0 ? arg->f + selmon->mfacts[selmon->curtag] : arg->f - 1.0;
 	if(f < 0.1 || f > 0.9)
 		return;
-	selmon->mfact = f;
+	selmon->mfacts[selmon->curtag] = f;
 	arrange(selmon);
 }
 
@@ -1710,13 +1738,13 @@ tile(Monitor *m) {
 	if(n == 0)
 		return;
 
-	if(n > m->nmaster)
-		mw = m->nmaster ? m->ww * m->mfact : 0;
+	if(n > m->nmasters[m->curtag])
+		mw = m->nmasters[m->curtag] ? m->ww * m->mfacts[m->curtag] : 0;
 	else
 		mw = m->ww;
 	for(i = my = ty = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++)
-		if(i < m->nmaster) {
-			h = (m->wh - my) / (MIN(n, m->nmaster) - i);
+		if(i < m->nmasters[m->curtag]) {
+			h = (m->wh - my) / (MIN(n, m->nmasters[m->curtag]) - i);
 			resize(c, m->wx, m->wy + my, mw - (2*c->bw), h - (2*c->bw), False);
 			my += HEIGHT(c);
 		}
@@ -1748,13 +1776,24 @@ togglefloating(const Arg *arg) {
 
 void
 toggletag(const Arg *arg) {
-	unsigned int newtags;
+	unsigned int i, newtags;
 
 	if(!selmon->sel)
 		return;
 	newtags = selmon->sel->tags ^ (arg->ui & TAGMASK);
 	if(newtags) {
 		selmon->sel->tags = newtags;
+		if(newtags == ~0) {
+			selmon->prevtag = selmon->curtag;
+			selmon->curtag = 0;
+		}
+		if(!(newtags & 1 << (selmon->curtag - 1))) {
+			selmon->prevtag = selmon->curtag;
+			for (i=0; !(newtags & 1 << i); i++);
+			selmon->curtag = i + 1;
+		}
+		selmon->sel->tags = newtags;
+		selmon->lt[selmon->sellt] = selmon->lts[selmon->curtag];
 		focus(NULL);
 		arrange(selmon);
 	}
@@ -2043,11 +2082,26 @@ updatewmhints(Client *c) {
 
 void
 view(const Arg *arg) {
+	unsigned int i;
+
 	if((arg->ui & TAGMASK) == selmon->tagset[selmon->seltags])
 		return;
 	selmon->seltags ^= 1; /* toggle sel tagset */
-	if(arg->ui & TAGMASK)
+	if(arg->ui & TAGMASK) {
 		selmon->tagset[selmon->seltags] = arg->ui & TAGMASK;
+		selmon->prevtag = selmon->curtag;
+		if(arg->ui == ~0)
+			selmon->curtag = 0;
+		else {
+			for (i=0; !(arg->ui & 1 << i); i++);
+			selmon->curtag = i + 1;
+		}
+	} else {
+		selmon->prevtag= selmon->curtag ^ selmon->prevtag;
+		selmon->curtag^= selmon->prevtag;
+		selmon->prevtag= selmon->curtag ^ selmon->prevtag;
+	}
+	selmon->lt[selmon->sellt]= selmon->lts[selmon->curtag];
 	focus(NULL);
 	arrange(selmon);
 }
@@ -2126,6 +2180,32 @@ zoom(const Arg *arg) {
 	pop(c);
 }
 
+void
+bstack(Monitor *m) {
+	unsigned int i, n, w, mh, mx, tx;
+	Client *c;
+
+	for(n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++);
+	if(n == 0)
+		return;
+
+	if(n > m->nmasters[m->curtag])
+		mh = m->nmasters[m->curtag] ? m->wh * m->mfacts[m->curtag] : 0;
+	else
+		mh = m->wh;
+	for(i = mx = tx = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++)
+		if(i < m->nmasters[m->curtag]) {
+			w = (m->ww - mx) / (MIN(n, m->nmasters[m->curtag]) - i);
+			resize(c, m->wx + mx, m->wy, w - (2*c->bw), mh - (2*c->bw), False);
+			mx += WIDTH(c);
+		}
+		else {
+			w = (m->ww - tx) / (n - i);
+			resize(c, m->wx + tx, m->wy + mh, w - (2*c->bw), m->wh - mh - (2*c->bw), False);
+			tx += WIDTH(c);
+		}
+}
+
 int
 main(int argc, char *argv[]) {
 	if(argc == 2 && !strcmp("-v", argv[1]))

Re: [DWM] Définir un Layout par Tag

Publié : mer. 07 nov. 2012, 19:10
par Ichigo-Roku
Voici mon config.h.

Par contre les erreurs viennent du dwm.c. Les erreurs surviennent aux lignes : 456, 682, 683, 684, 762 et 764. Toutes les erreurs viennent quand j'essaye d'accéder à un membre de la structure Tag si je ne me trompe pas.

Edit : c'est bien ce patch que j'ai utilisé.

Re: [DWM] Définir un Layout par Tag

Publié : mer. 07 nov. 2012, 19:21
par Ypnose
As-tu appliqué un patch avant celui-ci?

Re: [DWM] Définir un Layout par Tag

Publié : mer. 07 nov. 2012, 19:38
par Ichigo-Roku
Oui mais du coup je l'ai appliqué à la main, j'y suis allé doucement ligne par ligne. Au niveau des structures je suis bon j'ai vérifié plusieurs fois donc il devrait pouvoir accéder à la structure sans problème.

Re: [DWM] Définir un Layout par Tag

Publié : mer. 07 nov. 2012, 19:46
par Ypnose
Je te conseille d'appliquer ce patch en premier. C'est ce que je fais chez moi (avant les deux suivants).

Re: [DWM] Définir un Layout par Tag

Publié : mer. 07 nov. 2012, 20:43
par Ichigo-Roku
Non mais en fait j'ai fait un copié/collé de chaque ligne dans le .c, quand je veux appliquer un patch de manière "automatique" le patch s'applique une fois sur deux sans râler alors bon...