1 ;;; riece-layout.el --- layout management
2 ;; Copyright (C) 1998-2003 Daiki Ueno
4 ;; Author: Daiki Ueno <ueno@unixuser.org>
5 ;; TAKAHASHI "beatmaria" Kaoru <kaoru@kaisei.org>
6 ;; Keywords: IRC, riece
8 ;; This file is part of Riece.
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 2, or (at your option)
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 GNU Emacs; see the file COPYING. If not, write to the
22 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
23 ;; Boston, MA 02111-1307, USA.
27 (require 'riece-globals)
30 (defgroup riece-layout nil
31 "Manage window layouts"
35 (defcustom riece-layout "default"
36 "Current layout setting."
40 (defcustom riece-layout-alist
41 '(("middle-right" riece-configure-windows right middle)
42 ("middle-left" riece-configure-windows left middle)
43 ("top-right" riece-configure-windows right top)
44 ("top-left" riece-configure-windows left top)
45 ("bottom-right" riece-configure-windows right bottom)
46 ("bottom-left" riece-configure-windows left bottom)
47 ("top" riece-configure-windows-top)
48 ("default" . "middle-right"))
49 "An alist mapping the names to layout functions.
50 An element of this alist is either in the following forms:
52 (NAME CONFIGURE-FUNCTION [PARAMETERS])
55 In the first form, NAME is a string which specifies the layout
56 setting, and CONFIGURE-FUNCTION is a function which does window
57 splitting, etc. PARAMETERS are collected and passed to CONFIGURE-FUNCTION.
58 In the second form, NAME1 is an alias for NAME2."
62 (defun riece-redraw-layout (&optional force)
63 "Reconfigure windows with the current layout.
64 If optional argument FORCE is non-nil, window reconfiguration will
65 happen unconditionally."
66 (let ((layout (cdr (assoc riece-layout riece-layout-alist))))
68 (error "No such layout!"))
70 (let ((riece-layout layout))
71 (riece-redraw-layout force))
73 (riece-reconfigure-windows-predicate))
74 (apply (car layout) (cdr layout))))))
76 (defun riece-set-window-points ()
77 (if (get-buffer-window riece-user-list-buffer)
78 (with-current-buffer riece-user-list-buffer
79 (unless (riece-frozen riece-user-list-buffer)
80 (set-window-start (get-buffer-window riece-user-list-buffer)
82 (if (get-buffer-window riece-channel-list-buffer)
83 (with-current-buffer riece-channel-list-buffer
84 (unless (riece-frozen riece-channel-list-buffer)
85 (set-window-start (get-buffer-window riece-channel-list-buffer)
87 (if (and riece-channel-buffer
88 (get-buffer-window riece-channel-buffer))
89 (with-current-buffer riece-channel-buffer
90 (unless (or (riece-frozen riece-channel-buffer)
91 (pos-visible-in-window-p
92 (point-max) (get-buffer-window riece-channel-buffer)))
93 (set-window-point (get-buffer-window riece-channel-buffer)
95 (if (get-buffer-window riece-others-buffer)
96 (with-current-buffer riece-others-buffer
97 (unless (or (riece-frozen riece-others-buffer)
98 (pos-visible-in-window-p
99 (point-max) (get-buffer-window riece-others-buffer)))
100 (set-window-point (get-buffer-window riece-others-buffer)
102 (if (get-buffer-window riece-dialogue-buffer)
103 (with-current-buffer riece-dialogue-buffer
104 (unless (or (riece-frozen riece-dialogue-buffer)
105 (pos-visible-in-window-p
106 (point-max) (get-buffer-window riece-dialogue-buffer)))
107 (set-window-point (get-buffer-window riece-dialogue-buffer)
110 (defun riece-reconfigure-windows-predicate ()
111 "Return t, if window reconfiguration is needed.
112 This function is used by \"default\" layout."
113 (memq (window-buffer (selected-window))
116 (defun riece-configure-windows (hpos vpos)
117 (let ((buffer (window-buffer))
119 (and riece-user-list-buffer-mode
120 riece-current-channel
121 ;; User list buffer is nuisance for private conversation.
122 (riece-channel-p (riece-identity-prefix
123 riece-current-channel)))))
124 ;; Can't expand minibuffer to full frame.
125 (if (eq (selected-window) (minibuffer-window))
127 (delete-other-windows)
128 (if (and riece-current-channel
129 (or show-user-list riece-channel-list-buffer-mode))
130 (let ((rest-window (split-window (selected-window)
133 (/ (window-width) 5))
134 (/ (window-width) 5))
136 (when (eq hpos 'left)
137 (setq rest-window (selected-window))
139 (if (and show-user-list riece-channel-list-buffer-mode)
141 (set-window-buffer (split-window)
142 riece-channel-list-buffer)
143 (set-window-buffer (selected-window)
144 riece-user-list-buffer))
146 (set-window-buffer (selected-window)
147 riece-user-list-buffer)
148 (if riece-channel-list-buffer-mode
149 (set-window-buffer (selected-window)
150 riece-channel-list-buffer))))
151 (select-window rest-window)))
152 (if (and riece-current-channel
153 riece-channel-buffer-mode)
156 (let ((rest-window (split-window nil 4)))
157 (set-window-buffer (selected-window)
158 riece-command-buffer)
159 (select-window rest-window)
160 (set-window-buffer (split-window rest-window)
162 (set-window-buffer (selected-window)
163 riece-channel-buffer))
164 (if (eq vpos 'middle)
165 (let ((rest-window (split-window)))
166 (set-window-buffer (selected-window)
167 riece-channel-buffer)
168 (set-window-buffer (split-window rest-window 4)
170 (set-window-buffer rest-window
171 riece-command-buffer))
172 (let ((rest-window (split-window nil (- (window-height) 4))))
173 (set-window-buffer (selected-window)
175 (set-window-buffer (split-window)
176 riece-channel-buffer)
177 (set-window-buffer rest-window
178 riece-command-buffer))))
179 (with-current-buffer riece-channel-buffer
180 (setq truncate-partial-width-windows nil))
181 (with-current-buffer riece-others-buffer
182 (setq truncate-partial-width-windows nil)))
183 (if (eq vpos 'bottom)
185 (set-window-buffer (selected-window)
186 riece-command-buffer)
187 (set-window-buffer (split-window (selected-window) 4)
188 riece-dialogue-buffer))
189 (set-window-buffer (split-window (selected-window) 4)
190 riece-dialogue-buffer)
191 (set-window-buffer (selected-window)
192 riece-command-buffer)))
193 (riece-set-window-points)
194 (select-window (or (get-buffer-window buffer)
195 (get-buffer-window riece-command-buffer)))))
197 (defun riece-configure-windows-top (&rest plist)
198 "Candidate of `riece-configure-windows-function'.
199 PLIST accept :command-height, :user-list-width, and :channel-list-width."
200 (let ((command-height (or (plist-get plist :command-height) 4))
201 (user-list-width (or (plist-get plist :user-list-width) (+ 9 1 1)))
202 (channel-list-width (or (plist-get plist :channel-list-width) 18))
203 (buffer (window-buffer))
205 (and riece-user-list-buffer-mode
206 riece-current-channel
207 ;; User list buffer is nuisance for private conversation.
208 (riece-channel-p (riece-identity-prefix
209 riece-current-channel)))))
210 ;; Can't expand minibuffer to full frame.
211 (when (eq (selected-window) (minibuffer-window))
213 (delete-other-windows)
215 (let ((rest-window (split-window (selected-window) command-height)))
216 (set-window-buffer (selected-window)
217 riece-command-buffer)
218 (select-window rest-window))
219 ;; middle of frame (vertical-spilit when need)
220 (when (or (and riece-current-channel riece-channel-buffer-mode)
223 (split-window (selected-window)
224 (/ (* 5 (+ (window-height) command-height)) 8))))
226 ;; channel-buffer + user-list
228 (and riece-current-channel riece-channel-buffer-mode))
229 (let ((user-list-window (split-window (selected-window) nil t)))
230 (set-window-buffer (selected-window) riece-channel-buffer)
231 (set-window-buffer user-list-window riece-user-list-buffer)
232 (select-window user-list-window)
233 (shrink-window-horizontally (- (window-width) user-list-width))
234 (setq truncate-partial-width-windows nil)))
237 (set-window-buffer (selected-window) riece-user-list-buffer))
238 ;; only channel-buffer
239 (riece-channel-buffer-mode
240 (set-window-buffer (selected-window) riece-channel-buffer)))
241 (select-window rest-window)))
243 (if (and riece-current-channel
244 riece-channel-list-buffer-mode)
245 (let ((channel-list-window (split-window (selected-window) nil t)))
246 (set-window-buffer (selected-window) riece-others-buffer)
247 (set-window-buffer channel-list-window riece-channel-list-buffer)
248 (select-window channel-list-window)
249 (shrink-window-horizontally (- (window-width) channel-list-width))
250 (setq truncate-partial-width-windows nil))
251 (set-window-buffer (selected-window) riece-dialogue-buffer))
252 (riece-set-window-points)
253 (select-window (or (get-buffer-window buffer)
254 (get-buffer-window riece-command-buffer)))))
256 (provide 'riece-layout)
258 ;;; riece-layout.el ends here