(require 'riece-channel)
(require 'riece-misc)
(require 'riece-layout)
+(require 'riece-signal)
(defvar riece-channel-buffer-format "*Channel:%s*"
"Format of channel message buffer.")
riece-update-channel-list-indicator)
"Functions to update modeline indicators.")
-;;; Qt like "signal-slot" abstraction for routing display events.
-(defvar riece-signal-slot-obarray
- (make-vector 31 0))
-
-(defun riece-make-slot (function &optional filter handback)
- "Make an instance of slot object.
-Arguments are corresponding to callback function, filter function, and
-a handback object, respectively.
-This function is for internal use only."
- (vector function filter handback))
-
-(defun riece-slot-function (slot)
- "Return the callback function of SLOT.
-This function is for internal use only."
- (aref slot 0))
-
-(defun riece-slot-filter (slot)
- "Return the filter function of SLOT.
-This function is for internal use only."
- (aref slot 1))
-
-(defun riece-slot-handback (slot)
- "Return the handback object of SLOT.
-This function is for internal use only."
- (aref slot 2))
-
-(defun riece-make-signal (name &rest args)
- "Make an instance of signal object.
-The 1st arguments is the name of the signal and the rest of arguments
-are the data of the signal."
- (vector name args))
-
-(defun riece-signal-name (signal)
- "Return the name of SIGNAL."
- (aref signal 0))
-
-(defun riece-signal-args (signal)
- "Return the data of SIGNAL."
- (aref signal 1))
-
-(defun riece-connect-signal (signal-name function &optional filter handback)
- "Add SLOT as a listener of a signal identified by SIGNAL-NAME."
- (let ((symbol (intern (symbol-name signal-name) riece-signal-slot-obarray)))
- (set symbol (cons (riece-make-slot function filter handback)
- (if (boundp symbol)
- (symbol-value symbol))))))
-
-(defun riece-emit-signal (signal)
- "Emit SIGNAL."
- (let ((symbol (intern-soft (symbol-name (riece-signal-name signal))
- riece-signal-slot-obarray))
- slots)
- (when symbol
- (setq slots (symbol-value symbol))
- (while slots
- (condition-case error
- (if (or (null (riece-slot-filter (car slots)))
- (condition-case error
- (funcall (riece-slot-filter (car slots)) signal)
- (if riece-debug
- (message
- "Error occurred in signal filter for \"%S\": %S"
- (riece-signal-name signal) error))
- nil))
- (funcall (riece-slot-function (car slots))
- signal (riece-slot-handback (car slots))))
- (error
- (if riece-debug
- (message "Error occurred in slot function for \"%S\": %S"
- (riece-signal-name signal) error))))
- (setq slots (cdr slots))))))
-
(defun riece-display-connect-signals ()
(riece-connect-signal
- 'switch-to-channel
+ 'channel-list-changed
(lambda (signal handback)
- (riece-update-status-indicators)
- (riece-update-channel-indicator)
- (riece-update-long-channel-indicator)
- (save-excursion
- (set-buffer riece-user-list-buffer)
- (run-hooks 'riece-update-buffer-functions))
(save-excursion
(set-buffer riece-channel-list-buffer)
(run-hooks 'riece-update-buffer-functions))
- (save-excursion
- (riece-redraw-layout))))
+ (riece-update-channel-list-indicator)))
(riece-connect-signal
- 'names
+ 'user-list-changed
(lambda (signal handback)
(save-excursion
(set-buffer riece-user-list-buffer)
(run-hooks 'riece-update-buffer-functions))))
(riece-connect-signal
- 'join
+ 'channel-switched
(lambda (signal handback)
+ (riece-update-status-indicators)
+ (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)
(save-excursion
- (set-buffer riece-user-list-buffer)
- (run-hooks 'riece-update-buffer-functions)))
+ (riece-redraw-layout))))
+ (riece-connect-signal
+ 'user-joined-channel
+ (lambda (signal handback)
+ (riece-emit-signal 'user-list-changed))
(lambda (signal)
- (and (riece-identity-equal (nth 1 (riece-signal-args 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
- 'part
+ 'user-joined-channel
(lambda (signal handback)
- (save-excursion
- (set-buffer riece-user-list-buffer)
- (run-hooks 'riece-update-buffer-functions)))
+ (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))
(lambda (signal)
- (and (riece-identity-equal (nth 1 (riece-signal-args 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
- 'rename
+ 'user-left-channel
(lambda (signal handback)
- (save-excursion
- (set-buffer riece-user-list-buffer)
- (run-hooks 'riece-update-buffer-functions)))
+ (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))
(lambda (signal)
- (and (equal (riece-identity-server (nth 1 (riece-signal-args 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)
riece-current-channel))
t)))))
(riece-connect-signal
- 'rename
+ 'user-renamed
(lambda (signal handback)
(riece-update-status-indicators)
- (riece-update-channel-indicator))
+ (riece-update-channel-indicator)
+ (force-mode-line-update t))
(lambda (signal)
(riece-identity-equal (nth 1 (riece-signal-args signal))
- (riece-current-nickname)))))
+ (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-status-indicators)
+ (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-emit-signal 'user-list-changed))
+ (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-emit-signal 'user-list-changed))
+ (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
"\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
(let ((inhibit-read-only t)
(riece-kill-all-overlays)
(while channels
(if (car channels)
- (insert (riece-format-channel-list-line
- index (car channels))))
+ (insert (riece-format-identity-for-channel-list-buffer
+ index (car channels))
+ "\n"))
(setq index (1+ index)
channels (cdr channels))))))
-(defun riece-format-channel-list-line (index channel)
- (or (run-hook-with-args-until-success
- 'riece-format-channel-list-line-functions index channel)
- (concat (format "%2d:%c" index
- (if (riece-identity-equal channel riece-current-channel)
- ?*
- ? ))
- (riece-format-identity channel)
- "\n")))
-
(defun riece-update-channel-indicator ()
(setq riece-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))
- ",")))
+ (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 "No channel")))
(defun riece-update-status-indicators ()
(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 (riece-make-signal 'switch-to-channel))))
+ (riece-emit-signal 'channel-switched)))
(defun riece-join-channel (identity)
(unless (riece-identity-member identity riece-current-channels)
(let ((last riece-current-channel))
(run-hook-with-args 'riece-after-switch-to-channel-functions last)
(setq riece-current-channel nil)
- (riece-emit-signal (riece-make-signal 'switch-to-channel))))))
+ (riece-emit-signal 'channel-switched)))))
(defun riece-part-channel (identity)
(let ((pointer (riece-identity-member identity riece-current-channels)))