X-Git-Url: http://git.chise.org/gitweb/?p=elisp%2Friece.git;a=blobdiff_plain;f=lisp%2Friece-display.el;h=5d20012e8309d2a63b1fbd042d8886e8112c5c38;hp=31a3bf68bcc5d002ca6b9c811229702bd465505e;hb=1427368d25257dfe250b57a26e157a35783a8207;hpb=a5b26ac26ff5e110dc6880d15bd3f472248021e5 diff --git a/lisp/riece-display.el b/lisp/riece-display.el index 31a3bf6..5d20012 100644 --- a/lisp/riece-display.el +++ b/lisp/riece-display.el @@ -19,312 +19,448 @@ ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. +;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +;; Boston, MA 02110-1301, USA. ;;; Code: (require 'riece-options) (require 'riece-channel) (require 'riece-misc) +(require 'riece-layout) +(require 'riece-signal) +(require 'riece-mcat) -(defcustom riece-configure-windows-function #'riece-configure-windows - "Function to configure windows." - :type 'function - :group 'riece-looks) +(defvar riece-channel-buffer-format "*Channel:%s*" + "Format of channel message buffer.") +(defvar riece-channel-buffer-alist nil + "An alist mapping identities to channel buffers.") -(defcustom riece-configure-windows-predicate - #'riece-configure-windows-predicate - "Function to check whether window reconfiguration is needed." - :type 'function - :group 'riece-looks) +(defvar riece-update-buffer-functions nil + "Functions to redisplay the buffer. +Local to the buffer in `riece-buffer-list'.") -(defvar riece-update-buffer-functions - '(riece-update-user-list-buffer - riece-update-channel-list-buffer - riece-update-status-indicators +(defvar riece-update-indicator-functions + '(riece-update-status-indicators + riece-update-channel-status-indicator riece-update-channel-indicator - riece-update-short-channel-indicator - riece-update-channel-list-indicator)) + riece-update-long-channel-indicator + riece-update-channel-list-indicator) + "Functions to update modeline indicators.") -(defvar riece-redisplay-buffer nil - "Non-nil means the buffer needs to be updated. -Local to the buffers.") - -(defun riece-configure-windows () - (let ((buffer (window-buffer)) - (show-user-list - (and riece-user-list-buffer-mode - riece-current-channel - ;; User list buffer is nuisance for private conversation. - (riece-channel-p (riece-identity-prefix - riece-current-channel))))) - ;; Can't expand minibuffer to full frame. - (if (eq (selected-window) (minibuffer-window)) - (other-window 1)) - (delete-other-windows) - (if (and riece-current-channel - (or show-user-list riece-channel-list-buffer-mode)) - (let ((rest-window (split-window (selected-window) - (/ (window-width) 5) t))) - (if (and show-user-list riece-channel-list-buffer-mode) - (progn - (set-window-buffer (split-window) - riece-channel-list-buffer) - (set-window-buffer (selected-window) - riece-user-list-buffer)) - (if show-user-list - (set-window-buffer (selected-window) - riece-user-list-buffer) - (if riece-channel-list-buffer-mode - (set-window-buffer (selected-window) - riece-channel-list-buffer)))) - (select-window rest-window))) - (if (and riece-current-channel - riece-channel-buffer-mode) - (let ((rest-window (split-window))) - (set-window-buffer (selected-window) - riece-channel-buffer) - (set-window-buffer (split-window rest-window 4) - riece-others-buffer) - (with-current-buffer riece-channel-buffer - (setq truncate-partial-width-windows nil)) - (with-current-buffer riece-others-buffer - (setq truncate-partial-width-windows nil)) - (set-window-buffer rest-window - riece-command-buffer)) - (set-window-buffer (split-window (selected-window) 4) - riece-dialogue-buffer) - (set-window-buffer (selected-window) - riece-command-buffer)) - (riece-set-window-points) - (select-window (or (get-buffer-window buffer) - (get-buffer-window riece-command-buffer))))) - -(defun riece-configure-windows-top (&optional plist) - "Candidate of `riece-configure-windows-function'. -PLIST accept :command-height, :user-list-width, and :channel-list-width." - (let ((command-height (or (plist-get plist :command-height) 4)) - (user-list-width (or (plist-get plist :user-list-width) (+ 9 1 1))) - (channel-list-width (or (plist-get plist :channel-list-width) 18)) - (buffer (window-buffer)) - (show-user-list - (and riece-user-list-buffer-mode - riece-current-channel - ;; User list buffer is nuisance for private conversation. - (riece-channel-p (riece-identity-prefix - riece-current-channel))))) - ;; Can't expand minibuffer to full frame. - (when (eq (selected-window) (minibuffer-window)) - (other-window 1)) - (delete-other-windows) - ;; top of frame - (let ((rest-window (split-window (selected-window) command-height))) - (set-window-buffer (selected-window) - riece-command-buffer) - (select-window rest-window)) - ;; middle of frame (vertical-spilit when need) - (when (or (and riece-current-channel riece-channel-buffer-mode) - show-user-list) - (let ((rest-window - (split-window (selected-window) - (/ (* 5 (+ (window-height) command-height)) 8)))) - (cond - ;; channel-buffer + user-list - ((and show-user-list - (and riece-current-channel riece-channel-buffer-mode)) - (let ((user-list-window (split-window (selected-window) nil t))) - (set-window-buffer (selected-window) riece-channel-buffer) - (set-window-buffer user-list-window riece-user-list-buffer) - (select-window user-list-window) - (shrink-window-horizontally (- (window-width) user-list-width)))) - ;; only user-list - (show-user-list - (set-window-buffer (selected-window) riece-user-list-buffer)) - ;; only channel-buffer - (riece-channel-buffer-mode - (set-window-buffer (selected-window) riece-channel-buffer))) - (select-window rest-window))) - ;; bottom of frame - (if (and riece-current-channel - riece-channel-list-buffer-mode) - (let ((channel-list-window (split-window (selected-window) nil t))) - (set-window-buffer (selected-window) riece-others-buffer) - (set-window-buffer channel-list-window riece-channel-list-buffer) - (select-window channel-list-window) - (shrink-window-horizontally (- (window-width) channel-list-width))) - (set-window-buffer (selected-window) riece-dialogue-buffer)) - (riece-set-window-points) - (select-window (or (get-buffer-window buffer) - (get-buffer-window riece-command-buffer))))) - -(defun riece-set-window-points () - (if (get-buffer-window riece-user-list-buffer) - (with-current-buffer riece-user-list-buffer - (unless (riece-frozen riece-user-list-buffer) - (set-window-start (get-buffer-window riece-user-list-buffer) - (point-min))))) - (if (get-buffer-window riece-channel-list-buffer) - (with-current-buffer riece-channel-list-buffer - (unless (riece-frozen riece-channel-list-buffer) - (set-window-start (get-buffer-window riece-channel-list-buffer) - (point-min)))))) +(defun riece-display-connect-signals () + (riece-connect-signal + 'channel-list-changed + (lambda (signal handback) + (save-excursion + (set-buffer riece-channel-list-buffer) + (run-hooks 'riece-update-buffer-functions)) + (riece-update-channel-list-indicator))) + (riece-connect-signal + 'user-list-changed + (lambda (signal handback) + (save-excursion + (set-buffer riece-user-list-buffer) + (run-hooks 'riece-update-buffer-functions))) + (lambda (signal) + (and riece-current-channel + (riece-identity-equal (car (riece-signal-args signal)) + riece-current-channel)))) + (riece-connect-signal + 'channel-switched + (lambda (signal handback) + (riece-update-status-indicators) + (riece-update-channel-status-indicator) + (riece-update-channel-indicator) + (riece-update-long-channel-indicator) + (force-mode-line-update t) + (riece-emit-signal 'channel-list-changed) + (riece-emit-signal 'user-list-changed riece-current-channel) + (save-excursion + (riece-redraw-layout)))) + (riece-connect-signal + 'user-joined-channel + (lambda (signal handback) + (riece-emit-signal 'user-list-changed riece-current-channel)) + (lambda (signal) + (and riece-current-channel + (riece-identity-equal (nth 1 (riece-signal-args signal)) + riece-current-channel) + (not (riece-identity-equal (car (riece-signal-args signal)) + (riece-current-nickname)))))) + (riece-connect-signal + 'user-joined-channel + (lambda (signal handback) + (riece-join-channel (nth 1 (riece-signal-args signal))) + (riece-switch-to-channel (nth 1 (riece-signal-args signal))) + (setq riece-join-channel-candidate nil)) + (lambda (signal) + (riece-identity-equal (car (riece-signal-args signal)) + (riece-current-nickname)))) + (riece-connect-signal + 'user-left-channel + (lambda (signal handback) + (riece-emit-signal 'user-list-changed riece-current-channel)) + (lambda (signal) + (and riece-current-channel + (riece-identity-equal (nth 1 (riece-signal-args signal)) + riece-current-channel) + (not (riece-identity-equal (car (riece-signal-args signal)) + (riece-current-nickname)))))) + (riece-connect-signal + 'user-left-channel + (lambda (signal handback) + (riece-part-channel (nth 1 (riece-signal-args signal)))) + (lambda (signal) + (riece-identity-equal (car (riece-signal-args signal)) + (riece-current-nickname)))) + (riece-connect-signal + 'user-renamed + (lambda (signal handback) + (riece-emit-signal 'user-list-changed riece-current-channel)) + (lambda (signal) + (and riece-current-channel + (equal (riece-identity-server (nth 1 (riece-signal-args signal))) + (riece-identity-server riece-current-channel)) + (riece-with-server-buffer (riece-identity-server + riece-current-channel) + (when (riece-channel-p (riece-identity-prefix + riece-current-channel)) + (riece-identity-assoc + (riece-identity-prefix (nth 1 (riece-signal-args signal))) + (riece-channel-get-users (riece-identity-prefix + riece-current-channel)) + t)))))) + (riece-connect-signal + 'user-renamed + (lambda (signal handback) + (riece-update-status-indicators) + (riece-update-channel-indicator) + (force-mode-line-update t)) + (lambda (signal) + (riece-identity-equal (nth 1 (riece-signal-args signal)) + (riece-current-nickname)))) + (riece-connect-signal + 'user-renamed + (lambda (signal handback) + (riece-switch-to-channel (nth 1 (riece-signal-args signal)))) + (lambda (signal) + (and riece-current-channel + (riece-identity-equal (car (riece-signal-args signal)) + riece-current-channel)))) + (riece-connect-signal + 'user-renamed + (lambda (signal handback) + (let* ((old-identity (car (riece-signal-args signal))) + (new-identity (nth 1 (riece-signal-args signal))) + (pointer (riece-identity-member old-identity + riece-current-channels))) + ;; Rename the channel buffer. + (when pointer + (setcar pointer new-identity) + (with-current-buffer (riece-channel-buffer old-identity) + (rename-buffer (riece-channel-buffer-name new-identity) t) + (setq riece-channel-buffer-alist + (cons (cons new-identity (current-buffer)) + (delq (riece-identity-assoc old-identity + riece-channel-buffer-alist) + riece-channel-buffer-alist)))))))) + (riece-connect-signal + 'user-away-changed + (lambda (signal handback) + (riece-update-status-indicators) + (force-mode-line-update t)) + (lambda (signal) + (riece-identity-equal (car (riece-signal-args signal)) + (riece-current-nickname)))) + (riece-connect-signal + 'user-operator-changed + (lambda (signal handback) + (riece-update-status-indicators) + (force-mode-line-update t)) + (lambda (signal) + (riece-identity-equal (car (riece-signal-args signal)) + (riece-current-nickname)))) + (riece-connect-signal + 'channel-topic-changed + (lambda (signal handback) + (riece-update-long-channel-indicator) + (force-mode-line-update t)) + (lambda (signal) + (and riece-current-channel + (riece-identity-equal (car (riece-signal-args signal)) + riece-current-channel)))) + (riece-connect-signal + 'channel-modes-changed + (lambda (signal handback) + (riece-update-long-channel-indicator) + (force-mode-line-update t)) + (lambda (signal) + (and riece-current-channel + (riece-identity-equal (car (riece-signal-args signal)) + riece-current-channel)))) + (riece-connect-signal + 'channel-operators-changed + (lambda (signal handback) + (riece-update-channel-status-indicator) + (riece-emit-signal 'user-list-changed riece-current-channel)) + (lambda (signal) + (and riece-current-channel + (riece-identity-equal (car (riece-signal-args signal)) + riece-current-channel)))) + (riece-connect-signal + 'channel-speakers-changed + (lambda (signal handback) + (riece-update-channel-status-indicator) + (riece-emit-signal 'user-list-changed riece-current-channel)) + (lambda (signal) + (and riece-current-channel + (riece-identity-equal (car (riece-signal-args signal)) + riece-current-channel)))) + (riece-connect-signal + 'buffer-freeze-changed + (lambda (signal handback) + (riece-update-status-indicators) + (force-mode-line-update t)))) (defun riece-update-user-list-buffer () (save-excursion - (set-buffer riece-user-list-buffer) - (when (and riece-redisplay-buffer - riece-current-channel - (riece-channel-p (riece-identity-prefix riece-current-channel))) - (let (users operators speakers) - (with-current-buffer (process-buffer (riece-server-process - (riece-identity-server - riece-current-channel))) - (setq users - (riece-channel-get-users - (riece-identity-prefix riece-current-channel)) - operators - (riece-channel-get-operators - (riece-identity-prefix riece-current-channel)) - speakers - (riece-channel-get-speakers - (riece-identity-prefix riece-current-channel)))) - (let ((inhibit-read-only t) - buffer-read-only) + (if (and riece-current-channel + (riece-channel-p (riece-identity-prefix riece-current-channel))) + (let* ((users + (riece-with-server-buffer (riece-identity-server + riece-current-channel) + (riece-channel-get-users (riece-identity-prefix + riece-current-channel)))) + (inhibit-read-only t) + buffer-read-only) (erase-buffer) + (riece-kill-all-overlays) (while users - (if (member (car users) operators) - (insert "@" (car users) "\n") - (if (member (car users) speakers) - (insert "+" (car users) "\n") - (insert " " (car users) "\n"))) - (setq users (cdr users))))) - (setq riece-redisplay-buffer nil)))) + (insert (if (memq ?o (cdr (car users))) + "@" + (if (memq ?v (cdr (car users))) + "+" + " ")) + (riece-format-identity + (riece-make-identity (car (car users)) + (riece-identity-server + riece-current-channel)) + t) + "\n") + (setq users (cdr users))))))) + +(defun riece-format-identity-for-channel-list-buffer (index identity) + (or (run-hook-with-args-until-success + 'riece-format-identity-for-channel-list-buffer-functions index identity) + (concat (format "%2d:%c" index + (if (riece-identity-equal identity riece-current-channel) + ?* + ? )) + (riece-format-identity identity)))) (defun riece-update-channel-list-buffer () (save-excursion - (set-buffer riece-channel-list-buffer) - (when riece-redisplay-buffer - (let ((inhibit-read-only t) - buffer-read-only - (index 1) - (channels riece-current-channels)) - (erase-buffer) - (while channels - (if (car channels) - (let ((point (point))) - (insert (format "%2d: %s\n" index - (riece-format-identity (car channels)))) - (put-text-property point (point) 'riece-identity - (car channels)))) - (setq index (1+ index) - channels (cdr channels)))) - (setq riece-redisplay-buffer nil)))) + (let ((inhibit-read-only t) + buffer-read-only + (index 1) + (channels riece-current-channels)) + (erase-buffer) + (riece-kill-all-overlays) + (while channels + (if (car channels) + (insert (riece-format-identity-for-channel-list-buffer + index (car channels)) + "\n")) + (setq index (1+ index) + channels (cdr channels)))))) (defun riece-update-channel-indicator () (setq riece-channel-indicator (if riece-current-channel + (riece-format-identity riece-current-channel) + (riece-mcat "None")))) + +(defun riece-update-long-channel-indicator () + (setq riece-long-channel-indicator + (if riece-current-channel (if (riece-channel-p (riece-identity-prefix riece-current-channel)) - (riece-concat-channel-modes + (riece-concat-channel-topic riece-current-channel - (riece-concat-channel-topic + (riece-concat-channel-modes riece-current-channel (riece-format-identity riece-current-channel))) (riece-format-identity riece-current-channel)) - "None"))) + (riece-mcat "None")))) -(defun riece-update-short-channel-indicator () - (setq riece-short-channel-indicator - (if riece-current-channel - (riece-format-identity riece-current-channel) - "None"))) +(defun riece-format-identity-for-channel-list-indicator (index identity) + (or (run-hook-with-args-until-success + 'riece-format-identity-for-channel-list-indicator-functions + index identity) + (let ((string (riece-format-identity identity)) + (start 0)) + ;; Escape % -> %%. + (while (string-match "%" string start) + (setq start (1+ (match-end 0)) + string (replace-match "%%" nil nil string))) + (format "%d:%s" index string)))) (defun riece-update-channel-list-indicator () (if (and riece-current-channels ;; There is at least one channel. (delq nil (copy-sequence riece-current-channels))) - (let ((index 1)) + (let ((index 1) + pointer) (setq riece-channel-list-indicator - (mapconcat - #'identity - (delq nil - (mapcar - (lambda (channel) - (prog1 (if channel - (format "%d:%s" index - (riece-format-identity channel))) - (setq index (1+ index)))) - riece-current-channels)) - ","))) - (setq riece-channel-list-indicator "No channel"))) + (delq + nil + (mapcar + (lambda (channel) + (prog1 + (if channel + (riece-format-identity-for-channel-list-indicator + index channel)) + (setq index (1+ index)))) + riece-current-channels)) + pointer riece-channel-list-indicator) + (while pointer + (if (cdr pointer) + (setcdr pointer (cons "," (cdr pointer)))) + (setq pointer (cdr (cdr pointer)))) + (setq riece-channel-list-indicator + (riece-normalize-modeline-string riece-channel-list-indicator))) + (setq riece-channel-list-indicator (riece-mcat "No channel")))) (defun riece-update-status-indicators () - (if riece-current-channel - (with-current-buffer riece-command-buffer - (riece-with-server-buffer (riece-identity-server riece-current-channel) - (setq riece-away-indicator - (if (and riece-real-nickname - (riece-user-get-away riece-real-nickname)) - "A" - "-") - riece-operator-indicator - (if (and riece-real-nickname - (riece-user-get-operator riece-real-nickname)) - "O" - "-") - riece-user-indicator riece-real-nickname)))) - (setq riece-freeze-indicator - (with-current-buffer (if (and riece-channel-buffer-mode - riece-channel-buffer) - riece-channel-buffer - riece-dialogue-buffer) - (if (eq riece-freeze 'own) - "f" - (if riece-freeze - "F" - "-"))))) + (let ((server-name (riece-current-server-name))) + (if server-name + (with-current-buffer riece-command-buffer + (riece-with-server-buffer server-name + (setq riece-away-indicator + (if (and riece-real-nickname + (riece-user-get-away riece-real-nickname)) + "A" + "-") + riece-operator-indicator + (if (and riece-real-nickname + (riece-user-get-operator riece-real-nickname)) + "O" + "-") + ) + (if riece-real-nickname + (setq riece-user-indicator + (riece-format-identity + (riece-make-identity riece-real-nickname + riece-server-name) + t))))))) + (walk-windows + (lambda (window) + (with-current-buffer (window-buffer window) + (if (riece-derived-mode-p 'riece-dialogue-mode) + (setq riece-freeze-indicator + (if (eq riece-freeze 'own) + "f" + (if riece-freeze + "F" + "-")))))))) + +(defun riece-update-channel-status-indicator () + (if (and riece-current-channel + (riece-channel-p (riece-identity-prefix riece-current-channel))) + (let ((users + (riece-with-server-buffer (riece-identity-server + riece-current-channel) + (riece-channel-get-users (riece-identity-prefix + riece-current-channel)))) + (nickname + (riece-with-server-buffer (riece-identity-server + riece-current-channel) + riece-real-nickname))) + (with-current-buffer riece-command-buffer + (setq riece-channel-status-indicator + (if nickname + (let ((user (cdr (riece-identity-assoc nickname users t)))) + (if (memq ?o user) + "@" + (if (memq ?v user) + "+" + "-"))) + "-")))))) -(defun riece-update-buffers () - (if riece-current-channel - (setq riece-channel-buffer (get-buffer (riece-channel-buffer-name - riece-current-channel)))) - (run-hooks 'riece-update-buffer-functions) - (force-mode-line-update t)) +(defun riece-update-buffers (&optional buffers) + (unless buffers + (setq buffers riece-buffer-list)) + (while buffers + (if (buffer-live-p (car buffers)) + (save-excursion + (set-buffer (car buffers)) + (run-hooks 'riece-update-buffer-functions))) + (setq buffers (cdr buffers))) + (run-hooks 'riece-update-indicator-functions) + (force-mode-line-update t) + (run-hooks 'riece-update-buffer-hook)) (defun riece-channel-buffer-name (identity) - (format riece-channel-buffer-format (riece-format-identity identity))) + (let ((channels (riece-identity-member identity riece-current-channels))) + (if channels + (setq identity (car channels)) + (if riece-debug + (riece-debug (format "%S is not a member of riece-current-channels" + identity)))) + (format riece-channel-buffer-format (riece-format-identity identity)))) (eval-when-compile (autoload 'riece-channel-mode "riece")) (defun riece-channel-buffer-create (identity) (with-current-buffer - (riece-get-buffer-create (riece-channel-buffer-name identity)) + (riece-get-buffer-create (riece-channel-buffer-name identity) + 'riece-channel-mode) + (setq riece-channel-buffer-alist + (cons (cons identity (current-buffer)) + riece-channel-buffer-alist)) (unless (eq major-mode 'riece-channel-mode) (riece-channel-mode) (let (buffer-read-only) (riece-insert-info (current-buffer) - (concat "Created on " + (format (riece-mcat "Created on %s\n") (funcall riece-format-time-function - (current-time)) - "\n")) + (current-time)))) (run-hook-with-args 'riece-channel-buffer-create-functions identity))) (current-buffer))) +(defun riece-channel-buffer (identity) + (let ((entry (riece-identity-assoc identity riece-channel-buffer-alist))) + (if entry + (if (buffer-live-p (cdr entry)) + (cdr entry) + (if riece-debug + (riece-debug + (format "riece-channel-buffer: nonexistent buffer: %s" + (riece-format-identity identity)))))))) + (defun riece-switch-to-channel (identity) - (setq riece-last-channel riece-current-channel - riece-current-channel identity) - (with-current-buffer riece-user-list-buffer - (setq riece-redisplay-buffer t)) - (run-hooks 'riece-channel-switch-hook)) + (let ((last riece-current-channel) + window) + (if (and riece-channel-buffer + (setq window (get-buffer-window riece-channel-buffer))) + (with-current-buffer riece-channel-buffer + (setq riece-channel-buffer-window-point (window-point window)))) + (setq riece-current-channel identity + riece-channel-buffer (riece-channel-buffer riece-current-channel)) + (run-hook-with-args 'riece-after-switch-to-channel-functions last) + (riece-emit-signal 'channel-switched))) (defun riece-join-channel (identity) (unless (riece-identity-member identity riece-current-channels) (setq riece-current-channels - (riece-identity-assign-binding identity riece-current-channels - riece-default-channel-binding)) - (riece-channel-buffer-create identity) - (with-current-buffer riece-channel-list-buffer - (setq riece-redisplay-buffer t)))) + (riece-identity-assign-binding + identity riece-current-channels + (mapcar + (lambda (channel) + (if channel + (riece-parse-identity channel))) + riece-default-channel-binding))) + (riece-channel-buffer-create identity))) (defun riece-switch-to-nearest-channel (pointer) (let ((start riece-current-channels) @@ -340,34 +476,24 @@ PLIST accept :command-height, :user-list-width, and :channel-list-width." (setq identity (car pointer))) (if identity (riece-switch-to-channel identity) - (setq riece-last-channel riece-current-channel - riece-current-channel nil)))) + (let ((last riece-current-channel)) + (run-hook-with-args 'riece-after-switch-to-channel-functions last) + (setq riece-current-channel nil) + (riece-emit-signal 'channel-switched))))) (defun riece-part-channel (identity) (let ((pointer (riece-identity-member identity riece-current-channels))) - (if pointer - (setcar pointer nil)) + (unless pointer + (error "No such channel!")) + (setcar pointer nil) (if (riece-identity-equal identity riece-current-channel) - (riece-switch-to-nearest-channel pointer)) - (with-current-buffer riece-channel-list-buffer - (setq riece-redisplay-buffer t)))) - -(defun riece-configure-windows-predicate () - ;; The current channel is changed, and some buffers are visible. - (unless (equal riece-last-channel riece-current-channel) - (let ((buffers riece-buffer-list)) - (catch 'found - (while buffers - (if (and (buffer-live-p (car buffers)) - (get-buffer-window (car buffers))) - (throw 'found t) - (setq buffers (cdr buffers)))))))) + (riece-switch-to-nearest-channel pointer) + (riece-emit-signal 'channel-list-changed)) + (funcall riece-buffer-dispose-function (riece-channel-buffer identity)))) (defun riece-redisplay-buffers (&optional force) (riece-update-buffers) - (if (or force - (funcall riece-configure-windows-predicate)) - (funcall riece-configure-windows-function)) + (riece-redraw-layout force) (run-hooks 'riece-redisplay-buffers-hook)) (provide 'riece-display)