1 ;;; --------------------------------------------------------------------------
2 ;;; CLFSWM - FullScreen Window Manager
4 ;;; --------------------------------------------------------------------------
5 ;;; Documentation: Tile, pack and fill functions
6 ;;; --------------------------------------------------------------------------
8 ;;; (C) 2011 Philippe Brochard <hocwp@free.fr>
10 ;;; This program is free software; you can redistribute it and/or modify
11 ;;; it under the terms of the GNU General Public License as published by
12 ;;; the Free Software Foundation; either version 3 of the License, or
13 ;;; (at your option) any later version.
15 ;;; This program is distributed in the hope that it will be useful,
16 ;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
17 ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 ;;; GNU General Public License for more details.
20 ;;; You should have received a copy of the GNU General Public License
21 ;;; along with this program; if not, write to the Free Software
22 ;;; Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
24 ;;; --------------------------------------------------------------------------
32 (defun frame-x2 (frame)
33 (+ (frame-x frame
) (frame-w frame
)))
35 (defun frame-y2 (frame)
36 (+ (frame-y frame
) (frame-h frame
)))
39 (defun find-edge-up (current-frame parent
)
41 (dolist (frame (frame-child parent
))
42 (when (and (frame-p frame
)
43 (not (equal frame current-frame
))
44 (<= (frame-y2 frame
) (frame-y current-frame
))
45 (>= (frame-x2 frame
) (frame-x current-frame
))
46 (<= (frame-x frame
) (frame-x2 current-frame
)))
47 (setf y-found
(max y-found
(frame-y2 frame
)))))
50 (defun find-edge-down (current-frame parent
)
52 (dolist (frame (frame-child parent
))
53 (when (and (frame-p frame
)
54 (not (equal frame current-frame
))
55 (>= (frame-y frame
) (frame-y2 current-frame
))
56 (>= (frame-x2 frame
) (frame-x current-frame
))
57 (<= (frame-x frame
) (frame-x2 current-frame
)))
58 (setf y-found
(min y-found
(frame-y frame
)))))
61 (defun find-edge-right (current-frame parent
)
63 (dolist (frame (frame-child parent
))
64 (when (and (frame-p frame
)
65 (not (equal frame current-frame
))
66 (>= (frame-x frame
) (frame-x2 current-frame
))
67 (>= (frame-y2 frame
) (frame-y current-frame
))
68 (<= (frame-y frame
) (frame-y2 current-frame
)))
69 (setf x-found
(min x-found
(frame-x frame
)))))
73 (defun find-edge-left (current-frame parent
)
75 (dolist (frame (frame-child parent
))
76 (when (and (frame-p frame
)
77 (not (equal frame current-frame
))
78 (<= (frame-x2 frame
) (frame-x current-frame
))
79 (>= (frame-y2 frame
) (frame-y current-frame
))
80 (<= (frame-y frame
) (frame-y2 current-frame
)))
81 (setf x-found
(max x-found
(frame-x2 frame
)))))
89 (defun pack-frame-up (frame parent
)
91 (let ((y-found (find-edge-up frame parent
)))
92 (setf (frame-y frame
) y-found
)))
95 (defun pack-frame-down (frame parent
)
97 (let ((y-found (find-edge-down frame parent
)))
98 (setf (frame-y frame
) (- y-found
(frame-h frame
)))))
100 (defun pack-frame-right (frame parent
)
101 "Pack frame to right"
102 (let ((x-found (find-edge-right frame parent
)))
103 (setf (frame-x frame
) (- x-found
(frame-w frame
)))))
106 (defun pack-frame-left (frame parent
)
108 (let ((x-found (find-edge-left frame parent
)))
109 (setf (frame-x frame
) x-found
)))
113 (defun center-frame (frame)
115 (setf (frame-x frame
) (/ (- 1 (frame-w frame
)) 2)
116 (frame-y frame
) (/ (- 1 (frame-h frame
)) 2)))
121 (defun fill-frame-up (frame parent
)
123 (let* ((y-found (find-edge-up frame parent
))
124 (dy (- (frame-y frame
) y-found
)))
125 (setf (frame-y frame
) y-found
126 (frame-h frame
) (+ (frame-h frame
) dy
))))
128 (defun fill-frame-down (frame parent
)
130 (let* ((y-found (find-edge-down frame parent
))
131 (dy (- y-found
(frame-y2 frame
))))
132 (setf (frame-h frame
) (+ (frame-h frame
) dy
))))
135 (defun fill-frame-left (frame parent
)
137 (let* ((x-found (find-edge-left frame parent
))
138 (dx (- (frame-x frame
) x-found
)))
139 (setf (frame-x frame
) x-found
140 (frame-w frame
) (+ (frame-w frame
) dx
))))
142 (defun fill-frame-right (frame parent
)
144 (let* ((x-found (find-edge-right frame parent
))
145 (dx (- x-found
(frame-x2 frame
))))
146 (setf (frame-w frame
) (+ (frame-w frame
) dx
))))
152 (defun resize-frame-down (frame)
153 "Resize down a frame"
154 (when (> (frame-w frame
) 0.1)
155 (setf (frame-x frame
) (+ (frame-x frame
) 0.01)
156 (frame-w frame
) (max (- (frame-w frame
) 0.02) 0.01)))
157 (when (> (frame-h frame
) 0.1)
158 (setf (frame-y frame
) (+ (frame-y frame
) 0.01)
159 (frame-h frame
) (max (- (frame-h frame
) 0.02) 0.01))))
162 (defun resize-minimal-frame (frame)
163 "Resize down a frame to its minimal size"
165 (resize-frame-down frame
)))
171 (defun resize-half-width-left (frame)
172 (setf (frame-w frame
)(/ (frame-w frame
) 2)))
175 (defun resize-half-width-right (frame)
176 (let* ((new-size (/ (frame-w frame
) 2))
177 (dx (- (frame-w frame
) new-size
)))
178 (setf (frame-w frame
) new-size
)
179 (incf (frame-x frame
) (max dx
0))))
182 (defun resize-half-height-up (frame)
183 (setf (frame-h frame
) (/ (frame-h frame
) 2)))
185 (defun resize-half-height-down (frame)
186 (let* ((new-size (/ (frame-h frame
) 2))
187 (dy (- (frame-h frame
) new-size
)))
188 (setf (frame-h frame
) new-size
)
189 (incf (frame-y frame
) (max dy
0))))
195 ;;;;;| Explode/Implode functions
197 (defun explode-frame (frame)
198 "Create a new frame for each window in frame"
199 (when (frame-p frame
)
200 (let ((windows (loop :for child
:in
(frame-child frame
)
201 :when
(xlib:window-p child
)
203 (dolist (win windows
)
204 (add-frame (create-frame :child
(list win
)) frame
)
205 (remove-child-in-frame win frame
)))))
208 (defun explode-current-frame ()
209 "Create a new frame for each window in frame"
210 (explode-frame *current-child
*)
216 ;;;;;| Constrained move/resize frames
218 (defun move-frame-constrained (frame parent orig-x orig-y
)
219 (when (and frame parent
(not (child-equal-p frame
*current-root
*)))
220 (hide-all-children frame
)
221 (with-slots (window) frame
224 (move-window window orig-x orig-y
228 (multiple-value-bind (x y
) (xlib:query-pointer
*root
*)
229 (setf (frame-x frame
) (x-px->fl
(xlib:drawable-x window
) parent
)
230 (frame-y frame
) (y-px->fl
(xlib:drawable-y window
) parent
))
232 (let ((x-found (find-edge-right frame parent
)))
233 (when (< (abs (- x-found
(frame-x2 frame
))) *snap-size
*)
234 (setf (frame-x frame
) (- x-found
(frame-w frame
))
235 (xlib:drawable-x window
) (adj-border-xy (x-fl->px
(frame-x frame
) parent
) frame
)
238 (let ((x-found (find-edge-left frame parent
)))
239 (when (< (abs (- x-found
(frame-x frame
))) *snap-size
*)
240 (setf (frame-x frame
) x-found
241 (xlib:drawable-x window
) (adj-border-xy (x-fl->px
(frame-x frame
) parent
) frame
)
244 (let ((y-found (find-edge-down frame parent
)))
245 (when (< (abs (- y-found
(frame-y2 frame
))) *snap-size
*)
246 (setf (frame-y frame
) (- y-found
(frame-h frame
))
247 (xlib:drawable-y window
) (adj-border-xy (y-fl->px
(frame-y frame
) parent
) frame
)
250 (let ((y-found (find-edge-up frame parent
)))
251 (when (< (abs (- y-found
(frame-y frame
))) *snap-size
*)
252 (setf (frame-y frame
) y-found
253 (xlib:drawable-y window
) (adj-border-xy (y-fl->px
(frame-y frame
) parent
) frame
)
255 (display-frame-info frame
)
256 (when move-x
(setf lx x
))
257 (when move-y
(setf ly y
))
258 (values move-x move-y
))))))
259 (setf (frame-x frame
) (x-px->fl
(xlib:drawable-x window
) parent
)
260 (frame-y frame
) (y-px->fl
(xlib:drawable-y window
) parent
)))
261 (show-all-children)))
264 (defun resize-frame-constrained (frame parent orig-x orig-y
)
265 (when (and frame parent
(not (child-equal-p frame
*current-root
*)))
266 (hide-all-children frame
)
267 (with-slots (window) frame
270 (resize-window window orig-x orig-y
274 (multiple-value-bind (x y
) (xlib:query-pointer
*root
*)
275 (setf (frame-w frame
) (w-px->fl
(xlib:drawable-width window
) parent
)
276 (frame-h frame
) (h-px->fl
(xlib:drawable-height window
) parent
))
278 (let ((x-found (find-edge-right frame parent
)))
279 (when (< (abs (- x-found
(frame-x2 frame
))) *snap-size
*)
280 (setf (frame-w frame
) (+ (frame-w frame
) (- x-found
(frame-x2 frame
)))
281 (xlib:drawable-width window
) (adj-border-wh (w-fl->px
(frame-w frame
) parent
) frame
)
284 (let ((y-found (find-edge-down frame parent
)))
285 (when (< (abs (- y-found
(frame-y2 frame
))) *snap-size
*)
286 (setf (frame-h frame
) (+ (frame-h frame
) (- y-found
(frame-y2 frame
)))
287 (xlib:drawable-height window
) (adj-border-wh (h-fl->px
(frame-h frame
) parent
) frame
)
289 (display-frame-info frame
)
290 (when resize-w
(setf lx x
))
291 (when resize-h
(setf ly y
))
292 (values resize-w resize-h
))))))
293 (setf (frame-w frame
) (w-px->fl
(xlib:drawable-width window
) parent
)
294 (frame-h frame
) (h-px->fl
(xlib:drawable-height window
) parent
)))
295 (show-all-children)))