Mercurial > emacs
annotate lisp/userlock.el @ 1717:aa7d6d57504b
* frame.h (struct frame): New fields `can_have_scrollbars' and
`has_vertical_scrollbars'.
(FRAME_CAN_HAVE_SCROLLBARS, FRAME_HAS_VERTICAL_SCROLLBARS): New
accessors, for both the MULTI_FRAME and non-MULTI_FRAME.
(VERTICAL_SCROLLBAR_WIDTH, WINDOW_VERTICAL_SCROLLBAR,
WINDOW_VERTICAL_SCROLLBAR_COLUMN,
WINDOW_VERTICAL_SCROLLBAR_HEIGHT): New macros.
* window.h (struct window): New field `vertical_scrollbar'.
* xterm.h (struct x_display): vertical_scrollbars,
judge_timestamp, vertical_scrollbar_extra: New fields.
(struct scrollbar): New struct.
(VERTICAL_SCROLLBAR_PIXEL_WIDTH, VERTICAL_SCROLLBAR_PIXEL_HEIGHT,
VERTICAL_SCROLLBAR_LEFT_BORDER, VERTICAL_SCROLLBAR_RIGHT_BORDER,
VERTICAL_SCROLLBAR_TOP_BORDER, VERTICAL_SCROLLBAR_BOTTOM_BORDER,
CHAR_TO_PIXEL_WIDTH, CHAR_TO_PIXEL_HEIGHT, PIXEL_TO_CHAR_WIDTH,
PIXEL_TO_CHAR_HEIGHT): New accessors and macros.
* frame.c (make_frame): Initialize the `can_have_scrollbars' and
`has_vertical_scrollbars' fields of the frame.
* term.c (term_init): Note that TERMCAP terminals don't support
scrollbars.
(mouse_position_hook): Document new args.
(set_vertical_scrollbar_hook, condemn_scrollbars_hook,
redeem_scrollbar_hook, judge_scrollbars_hook): New hooks.
* termhooks.h: Declare and document them.
(enum scrollbar_part): New type.
(struct input_event): Describe the new form of the scrollbar_click
event type. Change `part' from a Lisp_Object to an enum
scrollbar_part. Add a new field `scrollbar'.
* keyboard.c (kbd_buffer_get_event): Pass appropriate new
parameters to *mouse_position_hook, and make_lispy_movement.
* xfns.c (x_set_vertical_scrollbar): New function.
(x_figure_window_size): Use new macros to calculate frame size.
(Fx_create_frame): Note that X Windows frames do support scroll
bars. Default to "yes".
* xterm.c: #include <X11/cursorfont.h> and "window.h".
(x_vertical_scrollbar_cursor): New variable.
(x_term_init): Initialize it.
(last_mouse_bar, last_mouse_bar_frame, last_mouse_part,
last_mouse_scroll_range_start, last_mouse_scroll_range_end): New
variables.
(XTmouse_position): Use them to return scrollbar movement events.
Take new arguments, for that purpose.
(x_window_to_scrollbar, x_scrollbar_create,
x_scrollbar_set_handle, x_scrollbar_remove, x_scrollbar_move,
XTset_scrollbar, XTcondemn_scrollbars, XTredeem_scrollbar,
XTjudge_scrollbars, x_scrollbar_expose,
x_scrollbar_background_expose, x_scrollbar_handle_click,
x_scrollbar_handle_motion): New functions to implement scrollbars.
(x_term_init): Set the termhooks.h hooks to point to them.
(x_set_window_size): Use new macros to calculate frame size. Set
vertical_scrollbar_extra field.
(x_make_frame_visible): Use the frame accessor
FRAME_HAS_VERTICAL_SCROLLBARS to decide if we need to map the
frame's subwindows as well.
(XTread_socket): Use new size-calculation macros from xterm.h when
processing ConfigureNotify events.
(x_wm_set_size_hint): Use PIXEL_TO_CHAR_WIDTH and
PIXEL_TO_CHAR_HEIGHT macros.
* ymakefile (xdisp.o): This now depends on termhooks.h.
(xterm.o): This now depends on window.h.
| author | Jim Blandy <jimb@redhat.com> |
|---|---|
| date | Thu, 24 Dec 1992 06:17:18 +0000 |
| parents | 2cdce064065f |
| children | 14d8646c61c4 |
| rev | line source |
|---|---|
|
657
fec3f9a1e3e5
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
258
diff
changeset
|
1 ;;; userlock.el --- handle file access contention between multiple users |
|
fec3f9a1e3e5
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
258
diff
changeset
|
2 |
| 841 | 3 ;; Copyright (C) 1985, 1986 Free Software Foundation, inc. |
| 4 | |
|
812
485e82a8acb5
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
807
diff
changeset
|
5 ;; Maintainer: FSF |
|
485e82a8acb5
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
807
diff
changeset
|
6 ;; Keywords: internal |
|
807
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
657
diff
changeset
|
7 |
| 36 | 8 ;; This file is part of GNU Emacs. |
| 9 | |
| 10 ;; GNU Emacs is free software; you can redistribute it and/or modify | |
| 11 ;; it under the terms of the GNU General Public License as published by | |
|
807
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
657
diff
changeset
|
12 ;; the Free Software Foundation; either version 2, or (at your option) |
| 36 | 13 ;; any later version. |
| 14 | |
| 15 ;; GNU Emacs is distributed in the hope that it will be useful, | |
| 16 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 17 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 18 ;; GNU General Public License for more details. | |
| 19 | |
| 20 ;; You should have received a copy of the GNU General Public License | |
| 21 ;; along with GNU Emacs; see the file COPYING. If not, write to | |
| 22 ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. | |
| 23 | |
|
807
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
657
diff
changeset
|
24 ;;; Commentary: |
| 36 | 25 |
|
807
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
657
diff
changeset
|
26 ;; This file is autoloaded to handle certain conditions |
| 36 | 27 ;; detected by the file-locking code within Emacs. |
| 28 ;; The two entry points are `ask-user-about-lock' and | |
| 29 ;; `ask-user-about-supersession-threat'. | |
| 30 | |
|
807
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
657
diff
changeset
|
31 ;;; Code: |
| 36 | 32 |
| 33 (put 'file-locked 'error-conditions '(file-locked file-error error)) | |
| 34 | |
| 258 | 35 ;;;###autoload |
| 36 | 36 (defun ask-user-about-lock (fn opponent) |
| 37 "Ask user what to do when he wants to edit FILE but it is locked by USER. | |
| 38 This function has a choice of three things to do: | |
| 39 do (signal 'buffer-file-locked (list FILE USER)) | |
| 40 to refrain from editing the file | |
| 41 return t (grab the lock on the file) | |
| 42 return nil (edit the file even though it is locked). | |
| 43 You can rewrite it to use any criterion you like to choose which one to do." | |
| 44 (discard-input) | |
| 45 (save-window-excursion | |
| 46 (let (answer) | |
| 47 (while (null answer) | |
| 48 (message "%s is locking %s: action (s, q, p, ?)? " opponent fn) | |
| 49 (let ((tem (let ((inhibit-quit t) | |
| 50 (cursor-in-echo-area t)) | |
| 51 (prog1 (downcase (read-char)) | |
| 52 (setq quit-flag nil))))) | |
| 53 (if (= tem help-char) | |
| 54 (ask-user-about-lock-help) | |
| 55 (setq answer (assoc tem '((?s . t) | |
| 56 (?q . yield) | |
| 57 (?\C-g . yield) | |
| 58 (?p . nil) | |
| 59 (?? . help)))) | |
| 60 (cond ((null answer) | |
| 61 (beep) | |
| 62 (message "Please type q, s, or p; or ? for help") | |
| 63 (sit-for 3)) | |
| 64 ((eq (cdr answer) 'help) | |
| 65 (ask-user-about-lock-help) | |
| 66 (setq answer nil)) | |
| 67 ((eq (cdr answer) 'yield) | |
| 68 (signal 'file-locked (list "File is locked" fn opponent))))))) | |
| 69 (cdr answer)))) | |
| 70 | |
| 71 (defun ask-user-about-lock-help () | |
| 72 (with-output-to-temp-buffer "*Help*" | |
| 73 (princ "It has been detected that you want to modify a file that someone else has | |
| 74 already started modifying in EMACS. | |
| 75 | |
| 76 You can <s>teal the file; The other user becomes the | |
| 77 intruder if (s)he ever unmodifies the file and then changes it again. | |
| 78 You can <p>roceed; you edit at your own (and the other user's) risk. | |
| 79 You can <q>uit; don't modify this file."))) | |
| 80 | |
| 81 (put | |
| 82 'file-supersession 'error-conditions '(file-supersession file-error error)) | |
| 83 | |
| 258 | 84 ;;;###autoload |
| 36 | 85 (defun ask-user-about-supersession-threat (fn) |
| 86 "Ask a user who is about to modify an obsolete buffer what to do. | |
| 87 This function has two choices: it can return, in which case the modification | |
| 88 of the buffer will proceed, or it can (signal 'file-supersession (file)), | |
| 89 in which case the proposed buffer modification will not be made. | |
| 90 | |
| 91 You can rewrite this to use any criterion you like to choose which one to do. | |
| 92 The buffer in question is current when this function is called." | |
| 93 (discard-input) | |
| 94 (save-window-excursion | |
| 95 (let (answer) | |
| 96 (while (null answer) | |
| 97 (message "File has changed on disk; really want to edit the buffer? (y, n or C-h) ") | |
| 98 (let ((tem (downcase (let ((cursor-in-echo-area t)) | |
| 99 (read-char))))) | |
| 100 (setq answer | |
| 101 (if (= tem help-char) | |
| 102 'help | |
| 103 (cdr (assoc tem '((?n . yield) | |
| 104 (?\C-g . yield) | |
| 105 (?y . proceed) | |
| 106 (?? . help)))))) | |
| 107 (cond ((null answer) | |
| 108 (beep) | |
| 109 (message "Please type y or n; or ? for help") | |
| 110 (sit-for 3)) | |
| 111 ((eq answer 'help) | |
| 112 (ask-user-about-supersession-help) | |
| 113 (setq answer nil)) | |
| 114 ((eq answer 'yield) | |
| 115 (signal 'file-supersession | |
| 116 (list "File changed on disk" fn)))))) | |
| 117 (message | |
| 118 "File on disk now will become a backup file if you save these changes.") | |
| 119 (setq buffer-backed-up nil)))) | |
| 120 | |
| 121 (defun ask-user-about-supersession-help () | |
| 122 (with-output-to-temp-buffer "*Help*" | |
| 123 (princ "You want to modify a buffer whose disk file has changed | |
| 124 since you last read it in or saved it with this buffer. | |
| 125 | |
| 126 If you say `y' to go ahead and modify this buffer, | |
| 127 you risk ruining the work of whoever rewrote the file. | |
| 128 If you say `n', the change you started to make will be aborted. | |
| 129 | |
| 130 Usually, you should type `n' and then `M-x revert-buffer', | |
| 131 to get the latest version of the file, then make the change again."))) | |
| 132 | |
|
657
fec3f9a1e3e5
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
258
diff
changeset
|
133 ;;; userlock.el ends here |
