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-user-list-update-buffer
33 riece-channel-list-update-buffer
34 riece-update-channel-indicator
35 riece-update-channel-list-indicator))
37 (defcustom riece-configure-windows-function #'riece-configure-windows
38 "Function to configure windows."
42 (defcustom riece-configure-windows-predicate
43 #'riece-configure-windows-predicate
44 "Function to check whether window reconfiguration is needed."
48 (defun riece-configure-windows ()
49 (let ((buffer (current-buffer))
51 (and riece-user-list-buffer-mode
53 ;; User list buffer is nuisance for private conversation.
54 (riece-channel-p riece-current-channel))))
55 ;; Can't expand minibuffer to full frame.
56 (if (eq (selected-window) (minibuffer-window))
58 (delete-other-windows)
59 (if (and riece-current-channel
60 (or show-user-list riece-channel-list-buffer-mode))
61 (let ((rest-window (split-window (selected-window)
62 (/ (window-width) 5) t)))
63 (if (and show-user-list riece-channel-list-buffer-mode)
65 (set-window-buffer (split-window)
66 riece-channel-list-buffer)
67 (set-window-buffer (selected-window)
68 riece-user-list-buffer))
70 (set-window-buffer (selected-window)
71 riece-user-list-buffer)
72 (if riece-channel-list-buffer-mode
73 (set-window-buffer (selected-window)
74 riece-channel-list-buffer))))
75 (select-window rest-window)))
76 (if (and riece-current-channel
77 riece-channel-buffer-mode)
78 (let ((rest-window (split-window)))
79 (set-window-buffer (selected-window)
81 (set-window-buffer (split-window rest-window 4)
83 (with-current-buffer riece-channel-buffer
84 (setq truncate-partial-width-windows nil))
85 (with-current-buffer riece-others-buffer
86 (setq truncate-partial-width-windows nil))
87 (set-window-buffer rest-window
88 riece-command-buffer))
89 (set-window-buffer (split-window (selected-window) 4)
90 riece-dialogue-buffer)
91 (set-window-buffer (selected-window)
92 riece-command-buffer))
93 (riece-set-window-points)
94 (select-window (or (get-buffer-window buffer)
95 (get-buffer-window riece-command-buffer)))))
97 (defun riece-set-window-points ()
98 (if (and riece-user-list-buffer
99 (get-buffer-window riece-user-list-buffer))
100 (with-current-buffer riece-user-list-buffer
101 (unless (riece-frozen riece-user-list-buffer)
102 (set-window-start (get-buffer-window riece-user-list-buffer)
104 (if (get-buffer-window riece-channel-list-buffer)
105 (with-current-buffer riece-channel-list-buffer
106 (unless (riece-frozen riece-channel-list-buffer)
107 (set-window-start (get-buffer-window riece-channel-list-buffer)
110 (defun riece-user-list-update-buffer ()
111 (if (get-buffer riece-user-list-buffer)
113 (set-buffer riece-user-list-buffer)
114 (when (and riece-current-channel
115 (riece-channel-p riece-current-channel))
116 (let ((inhibit-read-only t)
118 (users (riece-channel-get-users riece-current-channel))
119 (operators (riece-channel-get-operators riece-current-channel))
120 (speakers (riece-channel-get-speakers riece-current-channel)))
123 (if (member (car users) operators)
124 (insert "@" (car users) "\n")
125 (if (member (car users) speakers)
126 (insert "+" (car users) "\n")
127 (insert " " (car users) "\n")))
128 (setq users (cdr users))))))))
130 (defun riece-channel-list-update-buffer ()
131 (if (get-buffer riece-channel-list-buffer)
133 (set-buffer riece-channel-list-buffer)
134 (let ((inhibit-read-only t)
137 (channels riece-current-channels))
141 (insert (format "%2d:%s\n" index (car channels))))
142 (setq index (1+ index)
143 channels (cdr channels)))))))
145 (defsubst riece-update-channel-indicator ()
146 (setq riece-channel-indicator
147 (if riece-current-channel
148 (riece-concat-current-channel-modes
149 (if (and riece-current-channel
150 (riece-channel-p riece-current-channel)
151 (riece-channel-get-topic riece-current-channel))
152 (concat riece-current-channel ": "
153 (riece-channel-get-topic riece-current-channel))
154 riece-current-channel))
156 (with-current-buffer riece-command-buffer
157 (force-mode-line-update)))
159 (defun riece-update-channel-list-indicator ()
160 (if (and riece-current-channels
161 ;; There is at least one channel.
162 (delq nil (copy-sequence riece-current-channels)))
164 (setq riece-channel-list-indicator
171 (format "%d:%s" index channel))
172 (setq index (1+ index))))
173 riece-current-channels))
175 (setq riece-channel-list-indicator "No channel")))
177 (defun riece-update-buffers ()
178 (run-hooks 'riece-update-buffer-functions)
179 (force-mode-line-update t))
182 (autoload 'riece-channel-mode "riece"))
183 (defun riece-channel-buffer-create (identity)
185 (riece-get-buffer-create (format riece-channel-buffer-format identity))
186 (unless (eq major-mode 'riece-channel-mode)
188 (let (buffer-read-only)
189 (riece-insert-info (current-buffer)
190 (concat "Created on "
191 (funcall riece-format-time-function
197 (autoload 'riece-user-list-mode "riece"))
198 (defun riece-user-list-buffer-create (identity)
200 (riece-get-buffer-create (format riece-user-list-buffer-format identity))
201 (unless (eq major-mode 'riece-user-list-mode)
202 (riece-user-list-mode))
205 (defun riece-switch-to-channel (identity)
206 (setq riece-last-channel riece-current-channel
207 riece-current-channel identity
209 (cdr (riece-identity-assoc-no-server
210 identity riece-channel-buffer-alist))
211 riece-user-list-buffer
212 (cdr (riece-identity-assoc-no-server
213 identity riece-user-list-buffer-alist))))
215 (defun riece-join-channel (channel-name)
216 (let ((identity (riece-make-identity channel-name)))
217 (unless (riece-identity-member-no-server
218 identity riece-current-channels)
219 (setq riece-current-channels
220 (riece-identity-assign-binding
221 identity riece-current-channels
222 riece-default-channel-binding)))
223 (unless (riece-identity-assoc-no-server
224 identity riece-channel-buffer-alist)
225 (let ((buffer (riece-channel-buffer-create identity)))
226 (setq riece-channel-buffer-alist
227 (cons (cons identity buffer)
228 riece-channel-buffer-alist))))
229 (unless (riece-identity-assoc-no-server
230 identity riece-user-list-buffer-alist)
231 (let ((buffer (riece-user-list-buffer-create identity)))
232 (setq riece-user-list-buffer-alist
233 (cons (cons identity buffer)
234 riece-user-list-buffer-alist))))))
236 (defun riece-switch-to-nearest-channel (pointer)
237 (let ((start riece-current-channels)
239 (while (and start (not (eq start pointer)))
241 (setq identity (car start)))
242 (setq start (cdr start)))
245 (null (car pointer)))
246 (setq pointer (cdr pointer)))
247 (setq identity (car pointer)))
249 (riece-switch-to-channel identity)
250 (setq riece-last-channel riece-current-channel
251 riece-current-channel nil))))
253 (defun riece-part-channel (channel-name)
254 (let* ((identity (riece-make-identity channel-name))
255 (pointer (riece-identity-member-no-server
256 identity riece-current-channels)))
258 (setcar pointer nil))
260 (if (riece-identity-equal-no-server identity riece-current-channel)
261 (riece-switch-to-nearest-channel pointer))))
263 (defun riece-configure-windows-predicate ()
264 ;; The current channel is changed, and some buffers are visible.
265 (unless (equal riece-last-channel riece-current-channel)
266 (let ((buffers riece-buffer-list))
269 (if (and (buffer-live-p (car buffers))
270 (get-buffer-window (car buffers)))
272 (setq buffers (cdr buffers))))))))
274 (defun riece-redisplay-buffers (&optional force)
275 (riece-update-buffers)
277 (funcall riece-configure-windows-predicate))
278 (funcall riece-configure-windows-function)))
280 (provide 'riece-display)