Mercurial > emacs
view lisp/gnus/gnus-dup.el @ 80456:04e1df7268f0
(FRAME_OUTER_TO_INNER_DIFF_X, FRAME_OUTER_TO_INNER_DIFF_Y):
Move to mactoolbox.c.
(HOURGLASS_WIDTH, HOURGLASS_HEIGHT): Change to 15.
(Fx_selection_owner_p): Add EXFUN.
(install_window_handler, remove_window_handler, XSetWindowBackground):
Remove externs.
(do_apple_menu) [!TARGET_API_MAC_CARBON]: Likewise.
(mac_prepare_for_quickdraw) [USE_CG_DRAWING]: Likewise.
(x_raise_frame, x_lower_frame, mac_alert_sound_play)
(install_application_handler, mac_get_frame_bounds, mac_get_frame_mouse)
(mac_convert_frame_point_to_global, mac_set_frame_window_background)
(mac_update_begin mac_update_end, mac_frame_up_to_date, x_flush)
(mac_create_frame_window, mac_dispose_frame_window, mac_begin_clip)
(mac_end_clip, mac_create_scroll_bar, mac_dispose_scroll_bar)
(mac_set_scroll_bar_bounds, mac_redraw_scroll_bar, mac_fill_menubar)
(create_and_show_popup_menu, mac_get_selection_from_symbol)
(mac_valid_selection_target_p, mac_clear_selection)
(mac_get_selection_ownership_info, mac_valid_selection_value_p)
(mac_put_selection_value, mac_selection_has_target_p)
(mac_get_selection_value, mac_get_selection_target_list): Add externs.
(mac_update_proxy_icon, mac_show_hourglass, mac_hide_hourglass)
(mac_reposition_hourglass, mac_file_dialog, create_and_show_dialog)
(mac_dnd_default_known_types) [TARGET_API_MAC_CARBON]: Likewise.
(mac_run_loop_run_once) [MAC_OSX]: Likewise.
(mac_dialog) [!TARGET_API_MAC_CARBON]: Likewise.
(mac_begin_cg_clip, mac_end_cg_clip) [USE_CG_DRAWING]: Likewise.
(x_set_toolkit_scroll_bar_thumb) [!USE_TOOLKIT_SCROLL_BARS]: Likewise.
(x_scroll_bar_set_handle) [!USE_TOOLKIT_SCROLL_BARS]: Likewise.
author | YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp> |
---|---|
date | Sun, 06 Apr 2008 01:59:20 +0000 |
parents | 1cb31606209f |
children | 107ccd98fa12 |
line wrap: on
line source
;;; gnus-dup.el --- suppression of duplicate articles in Gnus ;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, ;; 2005, 2006, 2007, 2008 Free Software Foundation, Inc. ;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org> ;; Keywords: news ;; This file is part of GNU Emacs. ;; GNU Emacs 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 3, or (at your option) ;; any later version. ;; GNU Emacs 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., 51 Franklin Street, Fifth Floor, ;; Boston, MA 02110-1301, USA. ;;; Commentary: ;; This package tries to mark articles as read the second time the ;; user reads a copy. This is useful if the server doesn't support ;; Xref properly, or if the user reads the same group from several ;; servers. ;;; Code: (eval-when-compile (require 'cl)) (require 'gnus) (require 'gnus-art) (defgroup gnus-duplicate nil "Suppression of duplicate articles." :group 'gnus) (defcustom gnus-save-duplicate-list nil "*If non-nil, save the duplicate list when shutting down Gnus. If nil, duplicate suppression will only work on duplicates seen in the same session." :group 'gnus-duplicate :type 'boolean) (defcustom gnus-duplicate-list-length 10000 "*The number of Message-IDs to keep in the duplicate suppression list." :group 'gnus-duplicate :type 'integer) (defcustom gnus-duplicate-file (nnheader-concat gnus-directory "suppression") "*The name of the file to store the duplicate suppression list." :group 'gnus-duplicate :type 'file) ;;; Internal variables (defvar gnus-dup-list nil) (defvar gnus-dup-hashtb nil) (defvar gnus-dup-list-dirty nil) ;;; ;;; Starting and stopping ;;; (gnus-add-shutdown 'gnus-dup-close 'gnus) (defun gnus-dup-close () "Possibly save the duplicate suppression list and shut down the subsystem." (gnus-dup-save) (setq gnus-dup-list nil gnus-dup-hashtb nil gnus-dup-list-dirty nil)) (defun gnus-dup-open () "Possibly read the duplicate suppression list and start the subsystem." (if gnus-save-duplicate-list (gnus-dup-read) (setq gnus-dup-list nil)) (setq gnus-dup-hashtb (gnus-make-hashtable gnus-duplicate-list-length)) ;; Enter all Message-IDs into the hash table. (let ((list gnus-dup-list) (obarray gnus-dup-hashtb)) (while list (intern (pop list))))) (defun gnus-dup-read () "Read the duplicate suppression list." (setq gnus-dup-list nil) (when (file-exists-p gnus-duplicate-file) (load gnus-duplicate-file t t t))) (defun gnus-dup-save () "Save the duplicate suppression list." (when (and gnus-save-duplicate-list gnus-dup-list-dirty) (with-temp-file gnus-duplicate-file (gnus-prin1 `(setq gnus-dup-list ',gnus-dup-list)))) (setq gnus-dup-list-dirty nil)) ;;; ;;; Interface functions ;;; (defun gnus-dup-enter-articles () "Enter articles from the current group for future duplicate suppression." (unless gnus-dup-list (gnus-dup-open)) (setq gnus-dup-list-dirty t) ; mark list for saving (let ((data gnus-newsgroup-data) datum msgid) ;; Enter the Message-IDs of all read articles into the list ;; and hash table. (while (setq datum (pop data)) (when (and (not (gnus-data-pseudo-p datum)) (> (gnus-data-number datum) 0) (not (memq (gnus-data-number datum) gnus-newsgroup-unreads)) (not (= (gnus-data-mark datum) gnus-canceled-mark)) (setq msgid (mail-header-id (gnus-data-header datum))) (not (nnheader-fake-message-id-p msgid)) (not (intern-soft msgid gnus-dup-hashtb))) (push msgid gnus-dup-list) (intern msgid gnus-dup-hashtb)))) ;; Chop off excess Message-IDs from the list. (let ((end (nthcdr gnus-duplicate-list-length gnus-dup-list))) (when end (setcdr end nil)))) (defun gnus-dup-suppress-articles () "Mark duplicate articles as read." (unless gnus-dup-list (gnus-dup-open)) (gnus-message 6 "Suppressing duplicates...") (let ((headers gnus-newsgroup-headers) (auto (and gnus-newsgroup-auto-expire (memq gnus-duplicate-mark gnus-auto-expirable-marks))) number header) (while (setq header (pop headers)) (when (and (intern-soft (mail-header-id header) gnus-dup-hashtb) (gnus-summary-article-unread-p (mail-header-number header))) (setq gnus-newsgroup-unreads (delq (setq number (mail-header-number header)) gnus-newsgroup-unreads)) (if (not auto) (push (cons number gnus-duplicate-mark) gnus-newsgroup-reads) (push number gnus-newsgroup-expirable) (push (cons number gnus-expirable-mark) gnus-newsgroup-reads))))) (gnus-message 6 "Suppressing duplicates...done")) (defun gnus-dup-unsuppress-article (article) "Stop suppression of ARTICLE." (let ((id (mail-header-id (gnus-data-header (gnus-data-find article))))) (when id (setq gnus-dup-list-dirty t) (setq gnus-dup-list (delete id gnus-dup-list)) (unintern id gnus-dup-hashtb)))) (provide 'gnus-dup) ;;; arch-tag: 903e94db-7b00-4d19-83ee-cf34a81fa5fb ;;; gnus-dup.el ends here