Show
Ignore:
Timestamp:
04/07/07 15:49:28 (2 years ago)
Author:
miyoshi
Message:

Sync up with Emacs CVS HEAD.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/lisp/erc/erc-autoaway.el

    r4190 r4200  
    4141This is only used when `erc-autoaway-idle-method' is set to 'emacs.") 
    4242 
    43 ;;;###autoload (autoload 'erc-autoaway-mode "erc-autoaway") 
    44 (define-erc-module autoaway nil 
    45   "In ERC autoaway mode, you can be set away automatically. 
    46 If `erc-auto-set-away' is set, then you will be set away after 
    47 the number of seconds specified in `erc-autoaway-idle-seconds'. 
    48  
    49 There are several kinds of being idle: 
    50  
    51 User idle time measures how long you have not been sending any 
    52 commands to Emacs.  This is the default. 
    53  
    54 Emacs idle time measures how long Emacs has been idle.  This is 
    55 currently not useful, since Emacs is non-idle when it handles 
    56 ping-pong with IRC servers.  See `erc-autoaway-idle-method' 
    57 for more information. 
    58  
    59 IRC idle time measures how long since you last sent something (see 
    60 `erc-autoaway-last-sent-time'). 
    61  
    62 If `erc-auto-discard-away' is set, then typing anything, will 
    63 set you no longer away. 
    64  
    65 Related variables: `erc-public-away-p' and `erc-away-nickname'." 
    66   ;; Enable: 
    67   ((when (boundp 'erc-autoaway-idle-method) 
    68      (cond 
    69       ((eq erc-autoaway-idle-method 'irc) 
    70        (add-hook 'erc-send-completed-hook 'erc-autoaway-reset-idle-irc) 
    71        (add-hook 'erc-server-001-functions 'erc-autoaway-reset-idle-irc)) 
    72       ((eq erc-autoaway-idle-method 'user) 
    73        (add-hook 'post-command-hook 'erc-autoaway-reset-idle-user)) 
    74       ((eq erc-autoaway-idle-method 'emacs) 
    75        (erc-autoaway-reestablish-idletimer))) 
    76      (add-hook 'erc-timer-hook 'erc-autoaway-possibly-set-away) 
    77      (add-hook 'erc-server-305-functions 'erc-autoaway-reset-indicators))) 
    78   ;; Disable: 
    79   ((when (boundp 'erc-autoaway-idle-method) 
    80      (cond 
    81       ((eq erc-autoaway-idle-method 'irc) 
    82        (remove-hook 'erc-send-completed-hook 'erc-autoaway-reset-idle-irc) 
    83        (remove-hook 'erc-server-001-functions 'erc-autoaway-reset-idle-irc)) 
    84       ((eq erc-autoaway-idle-method 'user) 
    85        (remove-hook 'post-command-hook 'erc-autoaway-reset-idle-user)) 
    86       ((eq erc-autoaway-idle-method 'emacs) 
    87        (erc-cancel-timer erc-autoaway-idletimer) 
    88        (setq erc-autoaway-idletimer nil))) 
    89      (remove-hook 'erc-timer-hook 'erc-autoaway-possibly-set-away) 
    90      (remove-hook 'erc-server-305-functions 'erc-autoaway-reset-indicators)))) 
    91  
    92 (defcustom erc-autoaway-idle-method 'user 
    93   "*The method used to determine how long you have been idle. 
    94 If 'user, the time of the last command sent to Emacs is used. 
    95 If 'emacs, the idle time in Emacs is used. 
    96 If 'irc, the time of the last IRC command is used. 
    97  
    98 The time itself is specified by `erc-autoaway-idle-seconds'. 
    99  
    100 See `erc-autoaway-mode' for more information on the various 
    101 definitions of being idle." 
    102   :group 'erc-autoaway 
    103   :type '(choice (const :tag "User idle time" user) 
    104                  (const :tag "Emacs idle time" emacs) 
    105                  (const :tag "Last IRC action" irc)) 
    106   :set (lambda (sym val) 
    107          (erc-autoaway-disable) 
    108          (set-default sym val) 
    109          (erc-autoaway-enable))) 
    110  
    111 (defcustom erc-auto-set-away t 
    112   "*If non-nil, set away after `erc-autoaway-idle-seconds' seconds of idling. 
    113 ERC autoaway mode can set you away when you idle, and set you no 
    114 longer away when you type something.  This variable controls whether 
    115 you will be set away when you idle.  See `erc-auto-discard-away' for 
    116 the other half." 
    117   :group 'erc-autoaway 
    118   :type 'boolean) 
    119  
    120 (defcustom erc-auto-discard-away t 
    121   "*If non-nil, sending anything when away automatically discards away state. 
    122 ERC autoaway mode can set you away when you idle, and set you no 
    123 longer away when you type something.  This variable controls whether 
    124 you will be set no longer away when you type something.  See 
    125 `erc-auto-set-away' for the other half. 
    126 See also `erc-autoaway-no-auto-discard-regexp'." 
    127   :group 'erc-autoaway 
    128   :type 'boolean) 
    129  
    130 (defcustom erc-autoaway-no-auto-discard-regexp "^/g?away.*$" 
    131   "*Input that matches this will not automatically discard away status. 
    132 See `erc-auto-discard-away'." 
    133   :group 'erc-autoaway 
    134   :type 'regexp) 
     43(defvar erc-autoaway-last-sent-time (erc-current-time) 
     44  "The last time the user sent something.") 
     45 
     46(defvar erc-autoaway-caused-away nil 
     47  "Indicates whether this module was responsible for setting the 
     48user's away status.") 
    13549 
    13650(eval-when-compile (defvar erc-autoaway-idle-seconds)) 
     
    14963                             erc-autoaway-idle-seconds))) 
    15064 
     65(defun erc-autoaway-some-server-buffer () 
     66  "Return some ERC server buffer if its connection is alive. 
     67If none is found, return nil." 
     68  (car (erc-buffer-list #'erc-open-server-buffer-p))) 
     69 
     70(defun erc-autoaway-insinuate-maybe (&optional server &rest ignored) 
     71  "Add autoaway reset function to `post-command-hook' if at least one 
     72ERC process is alive. 
     73 
     74This is used when `erc-autoaway-idle-method' is 'user." 
     75  (when (or server (erc-autoaway-some-server-buffer)) 
     76    (add-hook 'post-command-hook 'erc-autoaway-reset-idle-user))) 
     77 
     78(defun erc-autoaway-remove-maybe (&rest ignored) 
     79  "Remove the autoaway reset function from `post-command-hook' if 
     80no ERC process is alive. 
     81 
     82This is used when `erc-autoaway-idle-method' is 'user." 
     83  (unless (erc-autoaway-some-server-buffer) 
     84    (remove-hook 'post-command-hook 'erc-autoaway-reset-idle-user))) 
     85 
     86;;;###autoload (autoload 'erc-autoaway-mode "erc-autoaway") 
     87(define-erc-module autoaway nil 
     88  "In ERC autoaway mode, you can be set away automatically. 
     89If `erc-auto-set-away' is set, then you will be set away after 
     90the number of seconds specified in `erc-autoaway-idle-seconds'. 
     91 
     92There are several kinds of being idle: 
     93 
     94User idle time measures how long you have not been sending any 
     95commands to Emacs.  This is the default. 
     96 
     97Emacs idle time measures how long Emacs has been idle.  This is 
     98currently not useful, since Emacs is non-idle when it handles 
     99ping-pong with IRC servers.  See `erc-autoaway-idle-method' 
     100for more information. 
     101 
     102IRC idle time measures how long since you last sent something (see 
     103`erc-autoaway-last-sent-time'). 
     104 
     105If `erc-auto-discard-away' is set, then typing anything, will 
     106set you no longer away. 
     107 
     108Related variables: `erc-public-away-p' and `erc-away-nickname'." 
     109  ;; Enable: 
     110  ((when (boundp 'erc-autoaway-idle-method) 
     111     (add-hook 'erc-connect-pre-hook 'erc-autoaway-reset-indicators) 
     112     (setq erc-autoaway-last-sent-time (erc-current-time)) 
     113     (cond 
     114      ((eq erc-autoaway-idle-method 'irc) 
     115       (add-hook 'erc-send-completed-hook 'erc-autoaway-reset-idle-irc) 
     116       (add-hook 'erc-server-001-functions 'erc-autoaway-reset-idle-irc)) 
     117      ((eq erc-autoaway-idle-method 'user) 
     118       (add-hook 'erc-after-connect 'erc-autoaway-insinuate-maybe) 
     119       (add-hook 'erc-disconnected-hook 'erc-autoaway-remove-maybe) 
     120       (erc-autoaway-insinuate-maybe)) 
     121      ((eq erc-autoaway-idle-method 'emacs) 
     122       (erc-autoaway-reestablish-idletimer))) 
     123     (add-hook 'erc-timer-hook 'erc-autoaway-possibly-set-away) 
     124     (add-hook 'erc-server-305-functions 'erc-autoaway-reset-indicators))) 
     125  ;; Disable: 
     126  ((when (boundp 'erc-autoaway-idle-method) 
     127     (remove-hook 'erc-connect-pre-hook 'erc-autoaway-reset-indicators) 
     128     (cond 
     129      ((eq erc-autoaway-idle-method 'irc) 
     130       (remove-hook 'erc-send-completed-hook 'erc-autoaway-reset-idle-irc) 
     131       (remove-hook 'erc-server-001-functions 'erc-autoaway-reset-idle-irc)) 
     132      ((eq erc-autoaway-idle-method 'user) 
     133       (remove-hook 'post-command-hook 'erc-autoaway-reset-idle-user) 
     134       (remove-hook 'erc-after-connect 'erc-autoaway-insinuate-maybe) 
     135       (remove-hook 'erc-disconnected-hook 'erc-autoaway-remove-maybe)) 
     136      ((eq erc-autoaway-idle-method 'emacs) 
     137       (erc-cancel-timer erc-autoaway-idletimer) 
     138       (setq erc-autoaway-idletimer nil))) 
     139     (remove-hook 'erc-timer-hook 'erc-autoaway-possibly-set-away) 
     140     (remove-hook 'erc-server-305-functions 'erc-autoaway-reset-indicators)))) 
     141 
     142(defcustom erc-autoaway-idle-method 'user 
     143  "*The method used to determine how long you have been idle. 
     144If 'user, the time of the last command sent to Emacs is used. 
     145If 'emacs, the idle time in Emacs is used. 
     146If 'irc, the time of the last IRC command is used. 
     147 
     148The time itself is specified by `erc-autoaway-idle-seconds'. 
     149 
     150See `erc-autoaway-mode' for more information on the various 
     151definitions of being idle." 
     152  :group 'erc-autoaway 
     153  :type '(choice (const :tag "User idle time" user) 
     154                 (const :tag "Emacs idle time" emacs) 
     155                 (const :tag "Last IRC action" irc)) 
     156  :set (lambda (sym val) 
     157         (if erc-autoaway-mode 
     158             (progn 
     159               (erc-autoaway-disable) 
     160               (set sym val) 
     161               (erc-autoaway-enable)) 
     162           (set sym val)))) 
     163 
     164(defcustom erc-auto-set-away t 
     165  "*If non-nil, set away after `erc-autoaway-idle-seconds' seconds of idling. 
     166ERC autoaway mode can set you away when you idle, and set you no 
     167longer away when you type something.  This variable controls whether 
     168you will be set away when you idle.  See `erc-auto-discard-away' for 
     169the other half." 
     170  :group 'erc-autoaway 
     171  :type 'boolean) 
     172 
     173(defcustom erc-auto-discard-away t 
     174  "*If non-nil, sending anything when away automatically discards away state. 
     175ERC autoaway mode can set you away when you idle, and set you no 
     176longer away when you type something.  This variable controls whether 
     177you will be set no longer away when you type something.  See 
     178`erc-auto-set-away' for the other half. 
     179See also `erc-autoaway-no-auto-discard-regexp'." 
     180  :group 'erc-autoaway 
     181  :type 'boolean) 
     182 
     183(defcustom erc-autoaway-no-auto-discard-regexp "^/g?away.*$" 
     184  "*Input that matches this will not automatically discard away status. 
     185See `erc-auto-discard-away'." 
     186  :group 'erc-autoaway 
     187  :type 'regexp) 
     188 
    151189(defcustom erc-autoaway-idle-seconds 1800 
    152190  "*Number of seconds after which ERC will set you automatically away. 
     
    168206  :type 'string) 
    169207 
    170 (defvar erc-autoaway-last-sent-time (erc-current-time) 
    171   "The last time the user sent something.") 
    172  
    173 (defvar erc-autoaway-caused-away nil 
    174   "Indicates whether this module was responsible for setting the 
    175 user's away status.") 
    176  
    177208(defun erc-autoaway-reset-idle-user (&rest stuff) 
    178209  "Reset the stored user idle time. 
     
    180211talk on another net too." 
    181212  (when erc-auto-discard-away 
    182     (erc-autoaway-set-back)) 
     213    (erc-autoaway-set-back #'erc-autoaway-remove-maybe)) 
    183214  (setq erc-autoaway-last-sent-time (erc-current-time))) 
    184215 
     
    193224  (setq erc-autoaway-last-sent-time (erc-current-time))) 
    194225 
    195 (defun erc-autoaway-set-back () 
    196   "Discard the away state globally." 
    197   (let ((server-buffer (car (erc-buffer-list #'erc-server-buffer-p)))) 
    198     (when (and erc-autoaway-caused-away 
    199                (with-current-buffer server-buffer (erc-away-p))) 
    200       (erc-cmd-GAWAY "")))) 
     226(defun erc-autoaway-set-back (&optional none-alive-func) 
     227  "Discard the away state globally. 
     228 
     229NONE-ALIVE-FUNC is the function to call if no ERC processes are alive." 
     230  (let ((server-buffer (erc-autoaway-some-server-buffer))) 
     231    (if (and erc-autoaway-caused-away 
     232             (buffer-live-p server-buffer) 
     233             (with-current-buffer server-buffer erc-away)) 
     234        (erc-cmd-GAWAY "") 
     235      (when none-alive-func (funcall none-alive-func))))) 
     236 
     237(defun erc-autoaway-some-open-server-buffer () 
     238  "Return some ERC server buffer if its connection is alive and the 
     239user is not away. 
     240If none is found, return nil." 
     241  (car (erc-buffer-list (lambda () 
     242                          (and (erc-open-server-buffer-p) 
     243                               (not erc-away)))))) 
    201244 
    202245(defun erc-autoaway-possibly-set-away (current-time) 
     
    208251  (when (and erc-auto-set-away 
    209252             (not erc-autoaway-caused-away) 
    210              (not (erc-away-p))) 
     253             (erc-autoaway-some-open-server-buffer)) 
    211254    (let ((idle-time (erc-time-diff erc-autoaway-last-sent-time 
    212255                                    current-time))) 
     
    216259         (format "Setting automatically away after %i seconds of idle-time" 
    217260                 idle-time)) 
    218         (erc-autoaway-set-away idle-time))))) 
    219  
    220 (defun erc-autoaway-set-away (idle-time) 
    221   "Set the away state globally." 
     261        (erc-autoaway-set-away idle-time t))))) 
     262 
     263(defun erc-autoaway-set-away (idle-time &optional notest) 
     264  "Set the away state globally. 
     265 
     266If NOTEST is specified, do not check to see whether there is an 
     267activer server buffer available." 
    222268  ;; Note that the idle timer runs, even when Emacs is inactive.  In 
    223269  ;; order to prevent flooding when we connect, we test for an 
    224270  ;; existing process. 
    225   (when (and (erc-server-process-alive) 
    226              (not (erc-away-p))) 
     271  (when (or notest (erc-autoaway-some-open-server-buffer)) 
    227272    (setq erc-autoaway-caused-away t) 
    228273    (erc-cmd-GAWAY (format erc-autoaway-message idle-time))))