* riece-unread.el (riece-unread-after-display-message-function):
authorDaiki Ueno <ueno@unixuser.org>
Mon, 13 Oct 2003 04:44:37 +0000 (04:44 +0000)
committerDaiki Ueno <ueno@unixuser.org>
Mon, 13 Oct 2003 04:44:37 +0000 (04:44 +0000)
Do nothing when message-target is already in
riece-unread-channels; call riece-redisplay-buffers.
(riece-unread-update-channel-list-buffer): Abolish.
(riece-unread-after-switch-to-channel-function): Don't call
riece-unread-update-channel-list-buffer.
(riece-unread-format-channel-list-line): New function.
(riece-unread-insinuate): Add
riece-unread-format-channel-list-line to
riece-format-channel-list-line; don't add
riece-unread-update-channel-list-buffer to
riece-update-buffer-functions.

* riece-highlight.el (riece-channel-list-mark-current-channel):
Abolish; merged into riece-update-channel-list-buffer.
(riece-highlight-insinuate): Don't add
riece-channel-list-mark-current-channel to
riece-after-switch-to-channel-functions.

* riece-display.el (riece-channel-list-changed): Abolish.
(riece-update-channel-list-buffer): Always redisplay channel-list
buffer.
(riece-update-channel-list-indicator): Always redisplay
channel-list indicator.
(riece-format-channel-list-line): New function.
(riece-update-buffers): Don't clear riece-channel-list-changed.
(riece-join-channel): Don't set riece-channel-list-changed.
(riece-part-channel): Ditto.

lisp/ChangeLog
lisp/riece-button.el [new file with mode: 0644]
lisp/riece-display.el
lisp/riece-highlight.el
lisp/riece-unread.el

index 718ea81..d455de5 100644 (file)
@@ -1,3 +1,34 @@
+2003-10-13  Daiki Ueno  <ueno@unixuser.org>
+
+       * riece-unread.el (riece-unread-after-display-message-function):
+       Do nothing when message-target is already in
+       riece-unread-channels; call riece-redisplay-buffers.
+       (riece-unread-update-channel-list-buffer): Abolish.
+       (riece-unread-after-switch-to-channel-function): Don't call
+       riece-unread-update-channel-list-buffer.
+       (riece-unread-format-channel-list-line): New function.
+       (riece-unread-insinuate): Add
+       riece-unread-format-channel-list-line to
+       riece-format-channel-list-line; don't add
+       riece-unread-update-channel-list-buffer to
+       riece-update-buffer-functions.
+
+       * riece-highlight.el (riece-channel-list-mark-current-channel):
+       Abolish; merged into riece-update-channel-list-buffer.
+       (riece-highlight-insinuate): Don't add
+       riece-channel-list-mark-current-channel to
+       riece-after-switch-to-channel-functions.
+
+       * riece-display.el (riece-channel-list-changed): Abolish.
+       (riece-update-channel-list-buffer): Always redisplay channel-list
+       buffer.
+       (riece-update-channel-list-indicator): Always redisplay
+       channel-list indicator.
+       (riece-format-channel-list-line): New function.
+       (riece-update-buffers): Don't clear riece-channel-list-changed.
+       (riece-join-channel): Don't set riece-channel-list-changed.
+       (riece-part-channel): Ditto.
+
 2003-10-13  Daiki Ueno  <ueno@unixuser.org>
 
        * riece-options.el (riece-addons): Add riece-button.
diff --git a/lisp/riece-button.el b/lisp/riece-button.el
new file mode 100644 (file)
index 0000000..f65e7bf
--- /dev/null
@@ -0,0 +1,102 @@
+;;; riece-button.el --- adding buttons in channel buffers
+;; Copyright (C) 1998-2003 Daiki Ueno
+
+;; Author: Daiki Ueno <ueno@unixuser.org>
+;; Created: 1998-09-28
+;; Keywords: IRC, riece
+
+;; This file is part of Riece.
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 2, or (at your option)
+;; any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.         See the
+;; GNU General Public License for more details.
+
+;; 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.
+
+;;; Commentary:
+
+;; To use, add the following line to your ~/.riece/init.el:
+;; (add-to-list 'riece-addons 'riece-button)
+
+;;; Code:
+
+(require 'riece-commands)
+(require 'riece-identity)
+(require 'riece-misc)
+(require 'wid-edit)
+
+(defvar help-echo-owns-message)
+(define-widget 'riece-channel-button 'push-button
+  "A channel button."
+  :action 'riece-channel-button-action
+  :help-echo
+  (lambda (widget/window &optional overlay pos)
+    ;; Needed to properly clear the message due to a bug in
+    ;; wid-edit (XEmacs only).
+    (if (boundp 'help-echo-owns-message)
+       (setq help-echo-owns-message t))
+    (format "Switch to %s"
+           ;; XEmacs will get a single widget arg; Emacs 21 will get
+           ;; window, overlay, position.
+           (riece-format-identity
+            (if overlay
+                (with-current-buffer (overlay-buffer overlay)
+                  (widget-value (widget-at (overlay-start overlay))))
+              (widget-value widget/window))))))
+
+(defun riece-channel-button-action (widget &optional event)
+  (let ((channel (widget-value widget)))
+    (if (riece-identity-member channel riece-current-channels)
+       (riece-command-switch-to-channel channel)
+      (message "%s" (substitute-command-keys
+                    "Type \\[riece-command-join] to join the channel")))))
+
+(defun riece-button-add-channel-buttons (start end length)
+  (save-excursion
+    (catch 'done
+      (while t
+       ;; Search for the beginning of the button region.
+       (unless (get-text-property start 'riece-identity)
+         (setq start (next-single-property-change start 'riece-identity
+                                                  nil end)))
+       ;; Search for the end of the button region.
+       (let* ((identity (get-text-property start 'riece-identity))
+              (button-end (next-single-property-change start 'riece-identity
+                                                       nil end)))
+         (if (= button-end end)
+             (throw 'done nil)
+           (if (riece-channel-p (riece-identity-prefix identity))
+               (widget-convert-button
+                'riece-channel-button start button-end identity))
+           (setq start button-end)))))))
+
+(defun riece-button-update-channel-list-buffer ()
+  (if riece-channel-list-buffer-mode
+      (save-excursion
+       (set-buffer riece-channel-list-buffer)
+       (let ((inhibit-read-only t)
+             buffer-read-only)
+         (riece-button-add-channel-buttons (point-min) (point-max) nil)))))
+
+(defun riece-button-requires ()
+  '(riece-highlight))
+
+(defun riece-button-insinuate ()
+  (add-hook 'riece-channel-list-mode-hook
+           (lambda ()
+             (set-keymap-parent riece-channel-list-mode-map widget-keymap)
+             (add-hook 'riece-update-buffer-functions
+                       'riece-button-update-channel-list-buffer t))))
+
+(provide 'riece-button)
+
+;;; riece-button.el ends here
index d29f785..288b46c 100644 (file)
@@ -37,8 +37,6 @@
     riece-update-short-channel-indicator
     riece-update-channel-list-indicator))
 
-(defvar riece-channel-list-changed nil)
-
 (defun riece-update-user-list-buffer ()
   (save-excursion
     (set-buffer riece-user-list-buffer)
            (setq users (cdr users))))))))
 
 (defun riece-update-channel-list-buffer ()
-  (if riece-channel-list-changed
-      (save-excursion
-       (set-buffer riece-channel-list-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: " index)
-                         (riece-format-identity (car channels))
-                         "\n")))
-           (setq index (1+ index)
-                 channels (cdr channels)))))))
+  (save-excursion
+    (set-buffer riece-channel-list-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 (riece-format-channel-list-line
+                      index (car channels)))))
+       (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
          "None")))
 
 (defun riece-update-channel-list-indicator ()
-  (if riece-channel-list-changed
-      (if (and riece-current-channels
-              ;; There is at least one channel.
-              (delq nil (copy-sequence riece-current-channels)))
-         (let ((index 1))
-           (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"))))
+  (if (and riece-current-channels
+          ;; There is at least one channel.
+          (delq nil (copy-sequence riece-current-channels)))
+      (let ((index 1))
+       (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")))
 
 (defun riece-update-status-indicators ()
   (if riece-current-channel
       (setq riece-channel-buffer (get-buffer (riece-channel-buffer-name
                                              riece-current-channel))))
   (run-hooks 'riece-update-buffer-functions)
-  (setq riece-channel-list-changed nil)
   (force-mode-line-update t))
 
 (defun riece-channel-buffer-name (identity)
              (if channel
                  (riece-parse-identity channel)))
            riece-default-channel-binding)))
-    (riece-channel-buffer-create identity)
-    (setq riece-channel-list-changed t)))
+    (riece-channel-buffer-create identity)))
 
 (defun riece-switch-to-nearest-channel (pointer)
   (let ((start riece-current-channels)
     (if pointer
        (setcar pointer nil))
     (if (riece-identity-equal identity riece-current-channel)
-       (riece-switch-to-nearest-channel pointer))
-    (setq riece-channel-list-changed t)))
+       (riece-switch-to-nearest-channel pointer))))
 
 (defun riece-redisplay-buffers (&optional force)
   (riece-update-buffers)
index addb260..a56b4fa 100644 (file)
     (if (looking-at riece-prefix-regexp)
        (put-text-property (match-beginning 1) (match-end 1) 'invisible t))))
 
-(defun riece-channel-list-mark-current-channel (last)
-  (if (and riece-channel-list-buffer-mode
-          riece-current-channel)
-      (save-excursion
-       (set-buffer riece-channel-list-buffer)
-       (let ((inhibit-read-only t)
-             buffer-read-only)
-         (goto-char (point-min))
-         (if (re-search-forward "^\\( ?[0-9]+:\\)\\*" nil t)
-             (replace-match "\\1 "))
-         (goto-char (point-min))
-         (if (re-search-forward
-              (concat
-               "^\\( ?[0-9]+:\\).\\("
-               (regexp-quote (riece-format-identity riece-current-channel))
-               "\\)$") nil t)
-             (replace-match "\\1*\\2"))))))
-
 (defun riece-channel-list-turn-on-font-lock ()
   (make-local-variable 'font-lock-defaults)
   (setq font-lock-defaults '(riece-channel-list-font-lock-keywords t))
            'riece-dialogue-schedule-turn-on-font-lock)
   (put 'riece-channel-list-mode 'font-lock-defaults
        '(riece-channel-list-font-lock-keywords t))
-  (add-hook 'riece-after-switch-to-channel-functions
-           'riece-channel-list-mark-current-channel)
   (add-hook 'riece-after-load-startup-hook
            'riece-channel-list-schedule-turn-on-font-lock))
 
index 9e89695..47c998a 100644 (file)
 
 (defun riece-unread-after-display-message-function (message)
   (unless (or (riece-message-own-p message)
-             (equal (riece-message-target message) riece-current-channel))
+             (riece-identity-equal (riece-message-target message)
+                                   riece-current-channel)
+             (riece-identity-member (riece-message-target message)
+                                    riece-unread-channels))
     (setq riece-unread-channels
-         (cons (riece-message-target message)
-               (delete (riece-message-target message) riece-unread-channels)))
-    (riece-unread-update-channel-list-buffer)))
+         (cons (riece-message-target message) riece-unread-channels))
+    (riece-redisplay-buffers)))
 
 (defun riece-unread-after-switch-to-channel-function (last)
   (setq riece-unread-channels
        (delete riece-current-channel
-               riece-unread-channels))
-  (riece-unread-update-channel-list-buffer))
-
-(defun riece-unread-update-channel-list-buffer ()
-  (if riece-channel-list-buffer-mode
-      (save-excursion
-       (set-buffer riece-channel-list-buffer)
-       (let ((inhibit-read-only t)
-             buffer-read-only)
-         (goto-char (point-min))
-         (while (not (eobp))
-           (if (looking-at "\\( ?[0-9]+:\\)\\(.\\)")
-               (let ((channel (get-text-property (match-end 0)
-                                                 'riece-identity)))
-                 (replace-match
-                  (concat "\\1"
-                          (if (riece-identity-member channel
-                                                     riece-unread-channels)
-                              "!"
-                            "\\2")))))
-           (forward-line))))))
-      
+               riece-unread-channels)))
+
+(defun riece-unread-format-channel-list-line (index channel)
+  (if (riece-identity-member channel riece-unread-channels)
+      (concat (format "%2d:!" index)
+             (riece-format-identity channel)
+             "\n")))
+
 (defun riece-unread-switch-to-channel ()
   (interactive)
   (if (car riece-unread-channels)
            'riece-unread-after-display-message-function)
   (add-hook 'riece-after-switch-to-channel-functions
            'riece-unread-after-switch-to-channel-function)
-  (add-hook 'riece-channel-list-mode-hook
-           (lambda ()
-             (add-hook 'riece-update-buffer-functions
-                       'riece-unread-update-channel-list-buffer t)))
+  (add-hook 'riece-format-channel-list-line-functions
+           'riece-unread-format-channel-list-line)
   (define-key riece-command-mode-map
     "\C-c\C-u" 'riece-unread-switch-to-channel)
   (define-key riece-dialogue-mode-map