Update.
[riece] / lisp / riece-display.el
index b3c2e6e..5a16cdf 100644 (file)
 (require 'riece-channel)
 (require 'riece-misc)
 (require 'riece-layout)
+(require 'riece-signal)
+
+(autoload 'derived-mode-class "derived")
+
+(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.")
 
 (defvar riece-update-buffer-functions nil
   "Functions to redisplay the buffer.
 Local to the buffer in `riece-buffer-list'.")
-  
+
 (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)
   "Functions to update modeline indicators.")
 
+(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)