Mercurial > hg > xemacs-beta
comparison lisp/packages/gnuserv.el @ 165:5a88923fcbfe r20-3b9
Import from CVS: tag r20-3b9
author | cvs |
---|---|
date | Mon, 13 Aug 2007 09:44:42 +0200 |
parents | 25f70ba0133c |
children | 85ec50267440 |
comparison
equal
deleted
inserted
replaced
164:4e0740e5aab2 | 165:5a88923fcbfe |
---|---|
1 ;;; gnuserv.el --- Lisp interface code between Emacs and gnuserv | 1 ;;; gnuserv.el --- Lisp interface code between Emacs and gnuserv |
2 ;; Copyright (C) 1989-1997 Free Software Foundation, Inc. | 2 ;; Copyright (C) 1989-1997 Free Software Foundation, Inc. |
3 | 3 |
4 ;; Version: 3.3 | 4 ;; Version: 3.4 |
5 ;; Author: Andy Norman (ange@hplb.hpl.hp.com), originally based on server.el | 5 ;; Author: Andy Norman (ange@hplb.hpl.hp.com), originally based on server.el |
6 ;; Hrvoje Niksic <hniksic@srce.hr> | 6 ;; Hrvoje Niksic <hniksic@srce.hr> |
7 ;; Maintainer: Jan Vroonhof <vroonhof@math.ethz.ch>, | 7 ;; Maintainer: Jan Vroonhof <vroonhof@math.ethz.ch>, |
8 ;; Hrvoje Niksic <hniksic@srce.hr> | 8 ;; Hrvoje Niksic <hniksic@srce.hr> |
9 ;; Keywords: environment, processes, terminals | 9 ;; Keywords: environment, processes, terminals |
72 ;; Jan Vroonhof | 72 ;; Jan Vroonhof |
73 ;; Customized. | 73 ;; Customized. |
74 ;; | 74 ;; |
75 ;; Hrvoje Niksic <hniksic@srce.hr> May/1997 | 75 ;; Hrvoje Niksic <hniksic@srce.hr> May/1997 |
76 ;; Completely rewritten. Now uses `defstruct' and other CL stuff | 76 ;; Completely rewritten. Now uses `defstruct' and other CL stuff |
77 ;; to define clients cleanly. Dave, thanks! | 77 ;; to define clients cleanly. Many thanks to Dave Gillespie! |
78 | 78 |
79 | 79 |
80 ;;; Code: | 80 ;;; Code: |
81 | 81 |
82 (defconst gnuserv-rcs-version | 82 (defconst gnuserv-rcs-version |
83 "$Id: gnuserv.el,v 1.10 1997/05/29 23:50:05 steve Exp $") | 83 "$Id: gnuserv.el,v 1.11 1997/06/26 02:31:17 steve Exp $") |
84 | 84 |
85 (defgroup gnuserv nil | 85 (defgroup gnuserv nil |
86 "The gnuserv suite of programs to talk to Emacs from outside." | 86 "The gnuserv suite of programs to talk to Emacs from outside." |
87 :group 'environment | 87 :group 'environment |
88 :group 'processes | 88 :group 'processes |
185 | 185 |
186 | 186 |
187 ;; The old functions are provided as aliases, to avoid breaking .emacs | 187 ;; The old functions are provided as aliases, to avoid breaking .emacs |
188 ;; files. However, they are obsolete and should be avoided. | 188 ;; files. However, they are obsolete and should be avoided. |
189 | 189 |
190 (defvaralias 'server-frame 'gnuserv-frame) | 190 (define-obsolete-variable-alias 'server-frame 'gnuserv-frame) |
191 (defvaralias 'server-done-function 'gnuserv-done-function) | 191 (define-obsolete-variable-alias 'server-done-function 'gnuserv-done-function) |
192 (defvaralias 'server-done-temp-file-function 'gnuserv-done-temp-file-function) | 192 (define-obsolete-variable-alias 'server-done-temp-file-function |
193 (defvaralias 'server-find-file-function 'gnuserv-find-file-function) | 193 'gnuserv-done-temp-file-function) |
194 (defvaralias 'server-program 'gnuserv-program) | 194 (define-obsolete-variable-alias 'server-find-file-function |
195 (defvaralias 'server-visit-hook 'gnuserv-visit-hook) | 195 'gnuserv-find-file-function) |
196 (defvaralias 'server-done-hook 'gnuserv-done-hook) | 196 (define-obsolete-variable-alias 'server-program |
197 (defvaralias 'server-kill-quietly 'gnuserv-kill-quietly) | 197 'gnuserv-program) |
198 (defvaralias 'server-temp-file-regexp 'gnuserv-temp-file-regexp) | 198 (define-obsolete-variable-alias 'server-visit-hook |
199 (defvaralias 'server-make-temp-file-backup 'gnuserv-make-temp-file-backup) | 199 'gnuserv-visit-hook) |
200 (define-obsolete-variable-alias 'server-done-hook | |
201 'gnuserv-done-hook) | |
202 (define-obsolete-variable-alias 'server-kill-quietly | |
203 'gnuserv-kill-quietly) | |
204 (define-obsolete-variable-alias 'server-temp-file-regexp | |
205 'gnuserv-temp-file-regexp) | |
206 (define-obsolete-variable-alias 'server-make-temp-file-backup | |
207 'gnuserv-make-temp-file-backup) | |
200 | 208 |
201 | 209 |
202 ;;; Internal variables: | 210 ;;; Internal variables: |
203 | 211 |
204 (defstruct gnuclient | 212 (defstruct gnuclient |
473 ;; A helper function; used by others. Try avoiding it whenever | 481 ;; A helper function; used by others. Try avoiding it whenever |
474 ;; possible, because it is slow, and conses a list. Use | 482 ;; possible, because it is slow, and conses a list. Use |
475 ;; `gnuserv-buffer-p' when appropriate, for instance. | 483 ;; `gnuserv-buffer-p' when appropriate, for instance. |
476 (defun gnuserv-buffer-clients (buffer) | 484 (defun gnuserv-buffer-clients (buffer) |
477 "Returns a list of clients to which BUFFER belongs." | 485 "Returns a list of clients to which BUFFER belongs." |
478 (let ((client gnuserv-clients) | 486 (let (res) |
479 res) | 487 (dolist (client gnuserv-clients) |
480 (while client | 488 (when (memq buffer (gnuclient-buffers client)) |
481 (if (memq buffer (gnuclient-buffers (car client))) | 489 (push client res))) |
482 (push (car client) res)) | |
483 (pop client)) | |
484 res)) | 490 res)) |
485 | 491 |
486 ;; Like `gnuserv-buffer-clients', but returns a boolean; doesn't | 492 ;; Like `gnuserv-buffer-clients', but returns a boolean; doesn't |
487 ;; collect a list. | 493 ;; collect a list. |
488 (defun gnuserv-buffer-p (buffer) | 494 (defun gnuserv-buffer-p (buffer) |
497 ;; `kill-buffer' (thanks God). | 503 ;; `kill-buffer' (thanks God). |
498 (defun gnuserv-kill-buffer-function () | 504 (defun gnuserv-kill-buffer-function () |
499 "Remove the buffer from the buffer lists of all the clients it belongs to. | 505 "Remove the buffer from the buffer lists of all the clients it belongs to. |
500 Any client that remains \"empty\" after the removal is informed that the | 506 Any client that remains \"empty\" after the removal is informed that the |
501 editing has ended." | 507 editing has ended." |
502 (let* ((buf (current-buffer)) | 508 (let* ((buf (current-buffer))) |
503 (clients (gnuserv-buffer-clients buf))) | 509 (dolist (client (gnuserv-buffer-clients buf)) |
504 (while clients | 510 (callf2 delq buf (gnuclient-buffers client)) |
505 (callf2 delq buf (gnuclient-buffers (car clients))) | |
506 ;; If no more buffers, kill the client. | 511 ;; If no more buffers, kill the client. |
507 (when (null (gnuclient-buffers (car clients))) | 512 (when (null (gnuclient-buffers client)) |
508 (gnuserv-kill-client (car clients))) | 513 (gnuserv-kill-client client))))) |
509 (pop clients)))) | |
510 | 514 |
511 (add-hook 'kill-buffer-hook 'gnuserv-kill-buffer-function) | 515 (add-hook 'kill-buffer-hook 'gnuserv-kill-buffer-function) |
512 | 516 |
513 ;; Ask for confirmation before killing a buffer that belongs to a | 517 ;; Ask for confirmation before killing a buffer that belongs to a |
514 ;; living client. | 518 ;; living client. |
532 | 536 |
533 ;; If the device of a client is to be deleted, the client should die | 537 ;; If the device of a client is to be deleted, the client should die |
534 ;; as well. This is why we hook into `delete-device-hook'. | 538 ;; as well. This is why we hook into `delete-device-hook'. |
535 (defun gnuserv-check-device (device) | 539 (defun gnuserv-check-device (device) |
536 (when (memq device gnuserv-devices) | 540 (when (memq device gnuserv-devices) |
537 (let ((client gnuserv-clients)) | 541 (dolist (client gnuserv-clients) |
538 (while client | 542 (when (eq device (gnuclient-device client)) |
539 (when (eq device (gnuclient-device (car client))) | 543 ;; we must make sure that the server kill doesn't result in |
540 ;; we must make sure that the server kill doesn't result in | 544 ;; killing the device, because it would cause a device-dead |
541 ;; killing the device, because it would cause a device-dead | 545 ;; error when `delete-device' tries to do the job later. |
542 ;; error when `delete-device' tries to do the job later. | 546 (gnuserv-kill-client (car client) t)))) |
543 (gnuserv-kill-client (car client) t)) | 547 (callf2 delq device gnuserv-devices)) |
544 (pop client))) | |
545 (callf2 delq device gnuserv-devices))) | |
546 | 548 |
547 (add-hook 'delete-device-hook 'gnuserv-check-device) | 549 (add-hook 'delete-device-hook 'gnuserv-check-device) |
548 | 550 |
549 (defun gnuserv-temp-file-p (buffer) | 551 (defun gnuserv-temp-file-p (buffer) |
550 "Return non-nil if BUFFER contains a file considered temporary. | 552 "Return non-nil if BUFFER contains a file considered temporary. |
587 ;; Notify the client. | 589 ;; Notify the client. |
588 (gnuserv-write-to-client (gnuclient-id client) nil)) | 590 (gnuserv-write-to-client (gnuclient-id client) nil)) |
589 | 591 |
590 ;; Do away with the buffer. | 592 ;; Do away with the buffer. |
591 (defun gnuserv-buffer-done-1 (buffer) | 593 (defun gnuserv-buffer-done-1 (buffer) |
592 (let ((clients (gnuserv-buffer-clients buffer))) | 594 (dolist (client (gnuserv-buffer-clients buffer)) |
593 (while clients | 595 (callf2 delq buffer (gnuclient-buffers client)) |
594 (callf2 delq buffer (gnuclient-buffers (car clients))) | 596 (when (null (gnuclient-buffers client)) |
595 (when (null (gnuclient-buffers (car clients))) | 597 (gnuserv-kill-client client))) |
596 (gnuserv-kill-client (car clients))) | 598 ;; Get rid of the buffer |
597 (pop clients)) | 599 (save-excursion |
598 ;; Get rid of the buffer | 600 (set-buffer buffer) |
599 (save-excursion | 601 (run-hooks 'gnuserv-done-hook) |
600 (set-buffer buffer) | 602 (setq gnuserv-minor-mode nil) |
601 (run-hooks 'gnuserv-done-hook) | 603 (funcall (if (gnuserv-temp-file-p buffer) |
602 (setq gnuserv-minor-mode nil) | 604 gnuserv-done-temp-file-function |
603 (funcall (if (gnuserv-temp-file-p buffer) | 605 gnuserv-done-function) |
604 gnuserv-done-temp-file-function | 606 buffer))) |
605 gnuserv-done-function) | |
606 buffer)))) | |
607 | 607 |
608 | 608 |
609 ;;; Higher-level functions | 609 ;;; Higher-level functions |
610 | 610 |
611 ;; Choose a `next' server buffer, according to several criteria, and | 611 ;; Choose a `next' server buffer, according to several criteria, and |
627 (car (member* device gnuserv-clients :key 'gnuclient-device)))) | 627 (car (member* device gnuserv-clients :key 'gnuclient-device)))) |
628 (car (gnuclient-buffers client))) | 628 (car (gnuclient-buffers client))) |
629 ;; Else, try to find any client with at least one buffer, and | 629 ;; Else, try to find any client with at least one buffer, and |
630 ;; return its first buffer. | 630 ;; return its first buffer. |
631 ((setq client | 631 ((setq client |
632 (car (member-if-not 'null gnuserv-clients | 632 (car (member-if-not #'null gnuserv-clients |
633 :key 'gnuclient-buffers))) | 633 :key 'gnuclient-buffers))) |
634 (car (gnuclient-buffers client))) | 634 (car (gnuclient-buffers client))) |
635 ;; Oh, give up. | 635 ;; Oh, give up. |
636 (t nil)))) | 636 (t nil)))) |
637 | 637 |