(defvar riece-update-indicator-functions
'(riece-update-status-indicators
+ riece-update-channel-status-indicator
riece-update-channel-indicator
riece-update-long-channel-indicator
riece-update-channel-list-indicator)
'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-identity-server riece-current-channel))
(riece-with-server-buffer (riece-identity-server
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)))))
+ (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-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-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
(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))
(while pointer
(if (cdr pointer)
(setcdr pointer (cons "," (cdr pointer))))
- (setq pointer (cdr (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 "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))))
+ (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"
+ "-")
+ 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)
"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 (&optional buffers)
(unless buffers
(setq buffers riece-buffer-list))
(while buffers
- (save-excursion
- (set-buffer (car buffers))
- (run-hooks 'riece-update-buffer-functions))
+ (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)
(if channels
(setq identity (car channels))
(if riece-debug
- (message "%S is not a member of riece-current-channels" identity)))
+ (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
(current-buffer)))
(defun riece-channel-buffer (identity)
- (cdr (riece-identity-assoc identity riece-channel-buffer-alist)))
+ (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)
- (let ((last riece-current-channel))
+ (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)
(if pointer
(setcar pointer nil))
(if (riece-identity-equal identity riece-current-channel)
- (riece-switch-to-nearest-channel pointer))))
+ (riece-switch-to-nearest-channel pointer))
+ (funcall riece-buffer-dispose-function (riece-channel-buffer identity))))
(defun riece-redisplay-buffers (&optional force)
(riece-update-buffers)