X-Git-Url: http://git.hcoop.net/bpt/emacs.git/blobdiff_plain/ffe832ea680b4820f5ff399191f7f2d41350ee2e..0b22a5e17ba44f559664af2d59c4828bfe56baaa:/lisp/ps-samp.el
diff --git a/lisp/ps-samp.el b/lisp/ps-samp.el
index ffe434b181..5e5738cf0f 100644
--- a/lisp/ps-samp.el
+++ b/lisp/ps-samp.el
@@ -13,19 +13,18 @@
;; 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 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 of the License, 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.
+;; 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.
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs. If not, see .
;;; Commentary:
@@ -235,6 +234,77 @@
'ps-jack-setup)
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+;; If zeroconf is enabled, all CUPS printers can be detected. The
+;; "Postscript printer" menu will be modified dynamically, as printers
+;; are added or removed.
+
+;; Preconditions:
+;;
+;; * Emacs has D-Bus support enabled. That is, D-Bus is installed on
+;; the system, and Emacs has been configured and built with the
+;; --with-dbus option.
+;;
+;; * The zeroconf daemon avahi-daemon is running.
+;;
+;; * CUPS has enabled the option "Share published printers connected
+;; to this system" (see ).
+
+(eval-when-compile
+ (require 'cl))
+
+(eval-and-compile
+ (require 'printing)
+ (require 'zeroconf))
+
+;; Add a Postscript printer to the "Postscript printer" menu.
+(defun ps-add-printer (service)
+ (let ((name (zeroconf-service-name service))
+ (text (zeroconf-service-txt service))
+ (addr (zeroconf-service-address service))
+ (port (zeroconf-service-port service))
+ is-ps cups-queue)
+ ;; `text' is an array of key=value strings like ("Duplex=T" "Copies=T").
+ (dolist (string text)
+ (let ((split (split-string string "=" t)))
+ ;; If it is a Postscript printer, there must be a string like
+ ;; "pdl=application/postscript,application/vnd.hp-PCL,...".
+ (when (and (string-equal "pdl" (car split))
+ (string-match "application/postscript" (cadr split)))
+ (setq is-ps t))
+ ;; A CUPS printer queue is coded as "rp=printers/".
+ (when (and (string-equal "rp" (car split))
+ (string-match "printers/\\(.+\\)" (cadr split)))
+ (setq cups-queue (match-string 1 (cadr split))))))
+ ;; Add the printer.
+ (when is-ps
+ (if cups-queue
+ (add-to-list
+ 'pr-ps-printer-alist (list (intern name) "lpr" nil "-P" cups-queue))
+ ;; No CUPS printer, but a network printer.
+ (add-to-list
+ 'pr-ps-printer-alist (list (intern name) "cupsdoprint"
+ '("-P" "default")
+ "-H" (format "%s:%s" addr port))))
+ (pr-update-menus t))))
+
+;; Remove a printer from the "Postscript printer" menu.
+(defun ps-remove-printer (service)
+ (setq pr-ps-printer-alist
+ (delete (assoc (intern (zeroconf-service-name service))
+ pr-ps-printer-alist)
+ pr-ps-printer-alist))
+ (pr-update-menus t))
+
+;; Activate the functions in zeroconf.
+(defun ps-make-dynamic-printer-menu ()
+ (when (featurep 'dbusbind)
+ (zeroconf-init)
+ (zeroconf-service-add-hook "_ipp._tcp" :new 'ps-add-printer)
+ (zeroconf-service-add-hook "_ipp._tcp" :removed 'ps-remove-printer)))
+
+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(provide 'ps-samp)