4 * Copyright © 2007-2008 Julien Danjou <julien@danjou.info>
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License along
17 * with this program; if not, write to the Free Software Foundation, Inc.,
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
30 #include "layouts/tile.h"
32 extern AwesomeConf globalconf
;
35 uicb_tag_setnmaster(int screen
, char * arg
)
37 Tag
**curtags
= get_current_tags(screen
);
38 Layout
*curlay
= curtags
[0]->layout
;
40 if(!arg
|| (curlay
->arrange
!= layout_tile
&& curlay
->arrange
!= layout_tileleft
))
43 if((curtags
[0]->nmaster
= (int) compute_new_value_from_arg(arg
, (double) curtags
[0]->nmaster
)) < 0)
44 curtags
[0]->nmaster
= 0;
52 uicb_tag_setncol(int screen
, char * arg
)
54 Tag
**curtags
= get_current_tags(screen
);
55 Layout
*curlay
= curtags
[0]->layout
;
57 if(!arg
|| (curlay
->arrange
!= layout_tile
&& curlay
->arrange
!= layout_tileleft
))
60 if((curtags
[0]->ncol
= (int) compute_new_value_from_arg(arg
, (double) curtags
[0]->ncol
)) < 1)
69 uicb_tag_setmwfact(int screen
, char *arg
)
72 Tag
**curtags
= get_current_tags(screen
);
73 Layout
*curlay
= curtags
[0]->layout
;
75 if(!arg
|| (curlay
->arrange
!= layout_tile
&& curlay
->arrange
!= layout_tileleft
))
78 newarg
= a_strdup(arg
);
79 if(curlay
->arrange
== layout_tileleft
)
83 else if(arg
[0] == '-')
87 if((curtags
[0]->mwfact
= compute_new_value_from_arg(newarg
, curtags
[0]->mwfact
)) < 0.1)
88 curtags
[0]->mwfact
= 0.1;
89 else if(curtags
[0]->mwfact
> 0.9)
90 curtags
[0]->mwfact
= 0.9;
98 _tile(int screen
, const Bool right
)
100 /* windows area geometry */
101 int wah
= 0, waw
= 0, wax
= 0, way
= 0;
102 /* new coordinates */
104 unsigned int mw
= 0, mh
= 0;
105 int n
, i
, masterwin
= 0, otherwin
= 0;
106 int real_ncol
= 1, win_by_col
= 1, current_col
= 0;
109 Tag
**curtags
= get_current_tags(screen
);
111 area
= get_screen_area(screen
,
112 globalconf
.screens
[screen
].statusbar
,
113 &globalconf
.screens
[screen
].padding
);
115 for(n
= 0, c
= globalconf
.clients
; c
; c
= c
->next
)
116 if(IS_TILED(c
, screen
))
124 masterwin
= MIN(n
, curtags
[0]->nmaster
);
126 otherwin
= n
- masterwin
;
131 if(curtags
[0]->nmaster
)
133 mh
= masterwin
? wah
/ masterwin
: waw
;
134 mw
= otherwin
? waw
* curtags
[0]->mwfact
: waw
;
139 real_ncol
= curtags
[0]->ncol
> 0 ? MIN(otherwin
, curtags
[0]->ncol
) : MIN(otherwin
, 1);
141 for(i
= 0, c
= globalconf
.clients
; c
; c
= c
->next
)
143 if(!IS_TILED(c
, screen
))
147 if(i
< curtags
[0]->nmaster
)
149 geometry
.y
= way
+ i
* mh
;
150 geometry
.x
= wax
+ (right
? 0 : waw
- mw
);
151 geometry
.width
= mw
- 2 * c
->border
;
152 geometry
.height
= mh
- 2 * c
->border
;
153 client_resize(c
, geometry
, globalconf
.screens
[screen
].resize_hints
);
158 win_by_col
= otherwin
/ real_ncol
;
160 if((i
- curtags
[0]->nmaster
) && (i
- curtags
[0]->nmaster
) % win_by_col
== 0 && current_col
< real_ncol
- 1)
163 if(current_col
== real_ncol
- 1)
164 win_by_col
+= otherwin
% real_ncol
;
166 if(otherwin
<= real_ncol
)
167 geometry
.height
= wah
- 2 * c
->border
;
169 geometry
.height
= (wah
/ win_by_col
) - 2 * c
->border
;
171 geometry
.width
= (waw
- mw
) / real_ncol
- 2 * c
->border
;
173 if(i
== curtags
[0]->nmaster
|| otherwin
<= real_ncol
|| (i
- curtags
[0]->nmaster
) % win_by_col
== 0)
176 geometry
.y
= way
+ ((i
- curtags
[0]->nmaster
) % win_by_col
) * (geometry
.height
+ 2 * c
->border
);
178 geometry
.x
= wax
+ current_col
* (geometry
.width
+ 2 * c
->border
) + (right
? mw
: 0);
179 client_resize(c
, geometry
, globalconf
.screens
[screen
].resize_hints
);
188 layout_tile(int screen
)
194 layout_tileleft(int screen
)
196 _tile(screen
, False
);
199 // vim: filetype=c:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=80