layout.c
changeset 961 edfafdb7084d
parent 958 8b502be8b8e0
child 963 7416c26a14db
equal deleted inserted replaced
960:b5f856fcef4c 961:edfafdb7084d
     8 	const char *symbol;
     8 	const char *symbol;
     9 	void (*arrange)(void);
     9 	void (*arrange)(void);
    10 } Layout;
    10 } Layout;
    11 
    11 
    12 unsigned int blw = 0;
    12 unsigned int blw = 0;
    13 static Layout *lt = NULL;
    13 static unsigned int sellayout = 0; /* default */
    14 
    14 
    15 static void
    15 static void
    16 floating(void) { /* default floating layout */
    16 floating(void) { /* default floating layout */
    17 	Client *c;
    17 	Client *c;
    18 
    18 
    34 	for(c = clients; c; c = c->next)
    34 	for(c = clients; c; c = c->next)
    35 		if(isvisible(c))
    35 		if(isvisible(c))
    36 			unban(c);
    36 			unban(c);
    37 		else
    37 		else
    38 			ban(c);
    38 			ban(c);
    39 	lt->arrange();
    39 	layouts[sellayout].arrange();
    40 	focus(NULL);
    40 	focus(NULL);
    41 	restack();
    41 	restack();
    42 }
    42 }
    43 
    43 
    44 void
    44 void
    74 }
    74 }
    75 
    75 
    76 const char *
    76 const char *
    77 getsymbol(void)
    77 getsymbol(void)
    78 {
    78 {
    79 	return lt->symbol;
    79 	return layouts[sellayout].symbol;
    80 }
    80 }
    81 
    81 
    82 Bool
    82 Bool
    83 isfloating(void) {
    83 isfloating(void) {
    84 	return lt->arrange == floating;
    84 	return layouts[sellayout].arrange == floating;
    85 }
    85 }
    86 
    86 
    87 Bool
    87 Bool
    88 isarrange(void (*func)())
    88 isarrange(void (*func)())
    89 {
    89 {
    90 	return func == lt->arrange;
    90 	return func == layouts[sellayout].arrange;
    91 }
    91 }
    92 
    92 
    93 void
    93 void
    94 initlayouts(void) {
    94 initlayouts(void) {
    95 	unsigned int i, w;
    95 	unsigned int i, w;
    96 
    96 
    97 	lt = &layouts[0];
    97 	/* TODO deserialize sellayout if present */
    98 	nlayouts = sizeof layouts / sizeof layouts[0];
    98 	nlayouts = sizeof layouts / sizeof layouts[0];
    99 	for(blw = i = 0; i < nlayouts; i++) {
    99 	for(blw = i = 0; i < nlayouts; i++) {
   100 		w = textw(layouts[i].symbol);
   100 		w = textw(layouts[i].symbol);
   101 		if(w > blw)
   101 		if(w > blw)
   102 			blw = w;
   102 			blw = w;
   116 	XWindowChanges wc;
   116 	XWindowChanges wc;
   117 
   117 
   118 	drawstatus();
   118 	drawstatus();
   119 	if(!sel)
   119 	if(!sel)
   120 		return;
   120 		return;
   121 	if(sel->isfloating || lt->arrange == floating)
   121 	if(sel->isfloating || isfloating())
   122 		XRaiseWindow(dpy, sel->win);
   122 		XRaiseWindow(dpy, sel->win);
   123 	if(lt->arrange != floating) {
   123 	if(!isfloating()) {
   124 		wc.stack_mode = Below;
   124 		wc.stack_mode = Below;
   125 		wc.sibling = barwin;
   125 		wc.sibling = barwin;
   126 		if(!sel->isfloating) {
   126 		if(!sel->isfloating) {
   127 			XConfigureWindow(dpy, sel->win, CWSibling | CWStackMode, &wc);
   127 			XConfigureWindow(dpy, sel->win, CWSibling | CWStackMode, &wc);
   128 			wc.sibling = sel->win;
   128 			wc.sibling = sel->win;
   141 void
   141 void
   142 setlayout(const char *arg) {
   142 setlayout(const char *arg) {
   143 	int i;
   143 	int i;
   144 
   144 
   145 	if(!arg) {
   145 	if(!arg) {
   146 		lt++;
   146 		if(++sellayout == nlayouts)
   147 		if(lt == layouts + nlayouts)
   147 			sellayout = 0;;
   148 			lt = layouts;
       
   149 	}
   148 	}
   150 	else {
   149 	else {
   151 		i = atoi(arg);
   150 		i = atoi(arg);
   152 		if(i < 0 || i >= nlayouts)
   151 		if(i < 0 || i >= nlayouts)
   153 			return;
   152 			return;
   154 		lt = &layouts[i];
   153 		sellayout = i;
   155 	}
   154 	}
   156 	if(sel)
   155 	if(sel)
   157 		arrange();
   156 		arrange();
   158 	else
   157 	else
   159 		drawstatus();
   158 		drawstatus();
   171 
   170 
   172 void
   171 void
   173 togglemax(const char *arg) {
   172 togglemax(const char *arg) {
   174 	XEvent ev;
   173 	XEvent ev;
   175 
   174 
   176 	if(!sel || (lt->arrange != floating && !sel->isfloating) || sel->isfixed)
   175 	if(!sel || (!isfloating() && !sel->isfloating) || sel->isfixed)
   177 		return;
   176 		return;
   178 	if((sel->ismax = !sel->ismax)) {
   177 	if((sel->ismax = !sel->ismax)) {
   179 		sel->rx = sel->x;
   178 		sel->rx = sel->x;
   180 		sel->ry = sel->y;
   179 		sel->ry = sel->y;
   181 		sel->rw = sel->w;
   180 		sel->rw = sel->w;