[DWM] Définir un Layout par Tag

Xorg, Compiz, KDE / Gnome / Xfce / Fluxbox / e17 / fvwm ... GDM/KDM/XDM...
Répondre
Avatar de l’utilisateur
Ichigo-Roku
yeomen
Messages : 259
Inscription : jeu. 04 févr. 2010, 19:15

[DWM] Définir un Layout par Tag

Message 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.
Macbook Pro Retina 13" late-2014 (Archlinux + OS X Yosemite)
Avatar de l’utilisateur
Ypnose
Maître du Kyudo
Messages : 1363
Inscription : sam. 01 mai 2010, 13:17

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

Message 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
Avatar de l’utilisateur
Ichigo-Roku
yeomen
Messages : 259
Inscription : jeu. 04 févr. 2010, 19:15

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

Message par Ichigo-Roku »

Donc pertag ne le permet pas ? Par contre je dois enlever pertag pour mettre pertag2 ?
Macbook Pro Retina 13" late-2014 (Archlinux + OS X Yosemite)
Avatar de l’utilisateur
Ypnose
Maître du Kyudo
Messages : 1363
Inscription : sam. 01 mai 2010, 13:17

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

Message 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).
Avatar de l’utilisateur
Ichigo-Roku
yeomen
Messages : 259
Inscription : jeu. 04 févr. 2010, 19:15

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

Message 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...
Macbook Pro Retina 13" late-2014 (Archlinux + OS X Yosemite)
Avatar de l’utilisateur
Ypnose
Maître du Kyudo
Messages : 1363
Inscription : sam. 01 mai 2010, 13:17

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

Message 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]))
Avatar de l’utilisateur
Ichigo-Roku
yeomen
Messages : 259
Inscription : jeu. 04 févr. 2010, 19:15

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

Message 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é.
Macbook Pro Retina 13" late-2014 (Archlinux + OS X Yosemite)
Avatar de l’utilisateur
Ypnose
Maître du Kyudo
Messages : 1363
Inscription : sam. 01 mai 2010, 13:17

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

Message par Ypnose »

As-tu appliqué un patch avant celui-ci?
Avatar de l’utilisateur
Ichigo-Roku
yeomen
Messages : 259
Inscription : jeu. 04 févr. 2010, 19:15

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

Message 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.
Macbook Pro Retina 13" late-2014 (Archlinux + OS X Yosemite)
Avatar de l’utilisateur
Ypnose
Maître du Kyudo
Messages : 1363
Inscription : sam. 01 mai 2010, 13:17

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

Message par Ypnose »

Je te conseille d'appliquer ce patch en premier. C'est ce que je fais chez moi (avant les deux suivants).
Avatar de l’utilisateur
Ichigo-Roku
yeomen
Messages : 259
Inscription : jeu. 04 févr. 2010, 19:15

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

Message 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...
Macbook Pro Retina 13" late-2014 (Archlinux + OS X Yosemite)
Répondre