1 ;;; riece-display.el --- buffer arrangement
2 ;; Copyright (C) 1998-2003 Daiki Ueno
4 ;; Author: Daiki Ueno <ueno@unixuser.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-options)
28 (require 'riece-channel)
31 (defvar riece-update-buffer-functions
32 '(riece-update-user-list-buffer
33 riece-update-channel-list-buffer
34 riece-update-status-indicators
35 riece-update-channel-indicator
36 riece-update-channel-list-indicator))
38 (defcustom riece-configure-windows-function #'riece-configure-windows
39 "Function to configure windows."
43 (defcustom riece-configure-windows-predicate
44 #'riece-configure-windows-predicate
45 "Function to check whether window reconfiguration is needed."
49 (defun riece-configure-windows ()
50 (let ((buffer (window-buffer))
52 (and riece-user-list-buffer-mode
54 ;; User list buffer is nuisance for private conversation.
55 (riece-channel-p riece-current-channel))))
56 ;; Can't expand minibuffer to full frame.
57 (if (eq (selected-window) (minibuffer-window))
59 (delete-other-windows)
60 (if (and riece-current-channel
61 (or show-user-list riece-channel-list-buffer-mode))
62 (let ((rest-window (split-window (selected-window)
63 (/ (window-width) 5) t)))
64 (if (and show-user-list riece-channel-list-buffer-mode)
66 (set-window-buffer (split-window)
67 riece-channel-list-buffer)
68 (set-window-buffer (selected-window)
69 riece-user-list-buffer))
71 (set-window-buffer (selected-window)
72 riece-user-list-buffer)
73 (if riece-channel-list-buffer-mode
74 (set-window-buffer (selected-window)
75 riece-channel-list-buffer))))
76 (select-window rest-window)))
77 (if (and riece-current-channel
78 riece-channel-buffer-mode)
79 (let ((rest-window (split-window)))
80 (set-window-buffer (selected-window)
82 (set-window-buffer (split-window rest-window 4)
84 (with-current-buffer riece-channel-buffer
85 (setq truncate-partial-width-windows nil))
86 (with-current-buffer riece-others-buffer
87 (setq truncate-partial-width-windows nil))
88 (set-window-buffer rest-window
89 riece-command-buffer))
90 (set-window-buffer (split-window (selected-window) 4)
91 riece-dialogue-buffer)
92 (set-window-buffer (selected-window)
93 riece-command-buffer))
94 (riece-set-window-points)
95 (select-window (or (get-buffer-window buffer)
96 (get-buffer-window riece-command-buffer)))))
98 (defun riece-set-window-points ()
99 (if (and riece-user-list-buffer
100 (get-buffer-window riece-user-list-buffer))
101 (with-current-buffer riece-user-list-buffer
102 (unless (riece-frozen riece-user-list-buffer)
103 (set-window-start (get-buffer-window riece-user-list-buffer)
105 (if (and riece-channel-list-buffer
106 (get-buffer-window riece-channel-list-buffer))
107 (with-current-buffer riece-channel-list-buffer
108 (unless (riece-frozen riece-channel-list-buffer)
109 (set-window-start (get-buffer-window riece-channel-list-buffer)
112 (defun riece-update-user-list-buffer ()
113 (if (and riece-user-list-buffer
114 (get-buffer riece-user-list-buffer))
116 (set-buffer riece-user-list-buffer)
117 (when (and riece-current-channel
118 (riece-channel-p riece-current-channel))
119 (let ((inhibit-read-only t)
121 (users (riece-channel-get-users riece-current-channel))
122 (operators (riece-channel-get-operators riece-current-channel))
123 (speakers (riece-channel-get-speakers riece-current-channel)))
126 (if (member (car users) operators)
127 (insert "@" (car users) "\n")
128 (if (member (car users) speakers)
129 (insert "+" (car users) "\n")
130 (insert " " (car users) "\n")))
131 (setq users (cdr users))))))))
133 (defun riece-update-channel-list-buffer ()
134 (if (and riece-channel-list-buffer
135 (get-buffer riece-channel-list-buffer))
137 (set-buffer riece-channel-list-buffer)
138 (let ((inhibit-read-only t)
141 (channels riece-current-channels))
145 (insert (format "%2d: %s\n" index (car channels))))
146 (setq index (1+ index)
147 channels (cdr channels)))))))
149 (defun riece-update-channel-indicator ()
150 (setq riece-channel-indicator
151 (if riece-current-channel
152 (riece-concat-current-channel-modes
153 (if (and riece-current-channel
154 (riece-channel-p riece-current-channel)
155 (riece-channel-get-topic riece-current-channel))
156 (concat riece-current-channel ": "
157 (riece-channel-get-topic riece-current-channel))
158 riece-current-channel))
161 (defun riece-update-channel-list-indicator ()
162 (if (and riece-current-channels
163 ;; There is at least one channel.
164 (delq nil (copy-sequence riece-current-channels)))
166 (setq riece-channel-list-indicator
173 (format "%d:%s" index channel))
174 (setq index (1+ index))))
175 riece-current-channels))
177 (setq riece-channel-list-indicator "No channel")))
179 (defun riece-update-status-indicators ()
180 (with-current-buffer riece-command-buffer
181 (riece-with-server-buffer
182 (setq riece-away-indicator
183 (if (and riece-real-nickname
184 (riece-user-get-away riece-real-nickname))
187 riece-operator-indicator
188 (if (and riece-real-nickname
189 (riece-user-get-operator riece-real-nickname))
192 riece-user-indicator riece-real-nickname)))
193 (setq riece-freeze-indicator
194 (with-current-buffer (if (and riece-channel-buffer-mode
195 riece-channel-buffer)
197 riece-dialogue-buffer)
198 (if (eq riece-freeze 'own)
204 (defun riece-update-buffers ()
205 (run-hooks 'riece-update-buffer-functions)
206 (force-mode-line-update t)
207 (run-hooks 'riece-update-buffers-hook))
210 (autoload 'riece-channel-mode "riece"))
211 (defun riece-channel-buffer-create (identity)
213 (riece-get-buffer-create (format riece-channel-buffer-format identity))
214 (unless (eq major-mode 'riece-channel-mode)
216 (let (buffer-read-only)
217 (riece-insert-info (current-buffer)
218 (concat "Created on "
219 (funcall riece-format-time-function
222 (run-hook-with-args 'riece-channel-buffer-create-functions identity)))
226 (autoload 'riece-user-list-mode "riece"))
227 (defun riece-user-list-buffer-create (identity)
229 (riece-get-buffer-create (format riece-user-list-buffer-format identity))
230 (unless (eq major-mode 'riece-user-list-mode)
231 (riece-user-list-mode))
234 (defun riece-switch-to-channel (identity)
235 (setq riece-last-channel riece-current-channel
236 riece-current-channel identity
238 (cdr (riece-identity-assoc
239 identity riece-channel-buffer-alist))
240 riece-user-list-buffer
241 (cdr (riece-identity-assoc
242 identity riece-user-list-buffer-alist)))
243 (run-hooks 'riece-channel-switch-hook))
245 (defun riece-join-channel (channel-name)
246 (let ((identity (riece-make-identity channel-name)))
247 (unless (riece-identity-member
248 identity riece-current-channels)
249 (setq riece-current-channels
250 (riece-identity-assign-binding
251 identity riece-current-channels
252 riece-default-channel-binding)))
253 (unless (riece-identity-assoc
254 identity riece-channel-buffer-alist)
255 (let ((buffer (riece-channel-buffer-create identity)))
256 (setq riece-channel-buffer-alist
257 (cons (cons identity buffer)
258 riece-channel-buffer-alist))))
259 (unless (riece-identity-assoc
260 identity riece-user-list-buffer-alist)
261 (let ((buffer (riece-user-list-buffer-create identity)))
262 (setq riece-user-list-buffer-alist
263 (cons (cons identity buffer)
264 riece-user-list-buffer-alist))))))
266 (defun riece-switch-to-nearest-channel (pointer)
267 (let ((start riece-current-channels)
269 (while (and start (not (eq start pointer)))
271 (setq identity (car start)))
272 (setq start (cdr start)))
275 (null (car pointer)))
276 (setq pointer (cdr pointer)))
277 (setq identity (car pointer)))
279 (riece-switch-to-channel identity)
280 (setq riece-last-channel riece-current-channel
281 riece-current-channel nil))))
283 (defun riece-part-channel (channel-name)
284 (let* ((identity (riece-make-identity channel-name))
285 (pointer (riece-identity-member
286 identity riece-current-channels)))
288 (setcar pointer nil))
289 (if (riece-identity-equal identity riece-current-channel)
290 (riece-switch-to-nearest-channel pointer))))
292 (defun riece-configure-windows-predicate ()
293 ;; The current channel is changed, and some buffers are visible.
294 (unless (equal riece-last-channel riece-current-channel)
295 (let ((buffers riece-buffer-list))
298 (if (and (buffer-live-p (car buffers))
299 (get-buffer-window (car buffers)))
301 (setq buffers (cdr buffers))))))))
303 (defun riece-redisplay-buffers (&optional force)
304 (riece-update-buffers)
306 (funcall riece-configure-windows-predicate))
307 (funcall riece-configure-windows-function))
308 (run-hooks 'riece-redisplay-buffers-hook))
310 (provide 'riece-display)
312 ;;; riece-display.el ends here