diff options
author | Miles Bader <miles@gnu.org> | 2007-10-11 16:24:58 +0000 |
---|---|---|
committer | Miles Bader <miles@gnu.org> | 2007-10-11 16:24:58 +0000 |
commit | c73bd236f75b742ad4642ec94798987ae6e3e1e8 (patch) | |
tree | ef5edc8db557fc1d25a17c379e4ae63a38b3ba5c /src/data.c | |
parent | ecb21060d5c1752d41d7a742be565c59b5fcb855 (diff) | |
parent | 58ade22bf16a9ec2ff0aee6c59d8db4d1703e94f (diff) | |
download | emacs-c73bd236f75b742ad4642ec94798987ae6e3e1e8.tar.gz |
Merge from emacs--devo--0
Patches applied:
* emacs--devo--0 (patch 866-879)
- Merge multi-tty branch
- Update from CVS
- Merge from emacs--rel--22
Revision: emacs@sv.gnu.org/emacs--unicode--0--patch-257
Diffstat (limited to 'src/data.c')
-rw-r--r-- | src/data.c | 74 |
1 files changed, 69 insertions, 5 deletions
diff --git a/src/data.c b/src/data.c index b262f6e2b92..6439686dcd9 100644 --- a/src/data.c +++ b/src/data.c @@ -30,6 +30,7 @@ Boston, MA 02110-1301, USA. */ #include "keyboard.h" #include "frame.h" #include "syssignal.h" +#include "termhooks.h" /* For FRAME_KBOARD reference in y-or-n-p. */ #ifdef STDC_HEADERS #include <float.h> @@ -769,8 +770,11 @@ Value, if non-nil, is a list \(interactive SPEC). */) if (SUBRP (fun)) { - if (XSUBR (fun)->prompt) - return list2 (Qinteractive, build_string (XSUBR (fun)->prompt)); + char *spec = XSUBR (fun)->intspec; + if (spec) + return list2 (Qinteractive, + (*spec != '(') ? build_string (spec) : + Fcar (Fread_from_string (build_string (spec), Qnil, Qnil))); } else if (COMPILEDP (fun)) { @@ -873,7 +877,18 @@ do_symval_forwarding (valcontents) case Lisp_Misc_Kboard_Objfwd: offset = XKBOARD_OBJFWD (valcontents)->offset; - return *(Lisp_Object *)(offset + (char *)current_kboard); + /* We used to simply use current_kboard here, but from Lisp + code, it's value is often unexpected. It seems nicer to + allow constructions like this to work as intuitively expected: + + (with-selected-frame frame + (define-key local-function-map "\eOP" [f1])) + + On the other hand, this affects the semantics of + last-command and real-last-command, and people may rely on + that. I took a quick look at the Lisp codebase, and I + don't think anything will break. --lorentey */ + return *(Lisp_Object *)(offset + (char *)FRAME_KBOARD (SELECTED_FRAME ())); } return valcontents; } @@ -961,7 +976,7 @@ store_symval_forwarding (symbol, valcontents, newval, buf) case Lisp_Misc_Kboard_Objfwd: { - char *base = (char *) current_kboard; + char *base = (char *) FRAME_KBOARD (SELECTED_FRAME ()); char *p = base + XKBOARD_OBJFWD (valcontents)->offset; *(Lisp_Object *) p = newval; } @@ -1107,7 +1122,7 @@ find_symbol_value (symbol) case Lisp_Misc_Kboard_Objfwd: return *(Lisp_Object *)(XKBOARD_OBJFWD (valcontents)->offset - + (char *)current_kboard); + + (char *)FRAME_KBOARD (SELECTED_FRAME ())); } } @@ -1868,6 +1883,51 @@ If the current binding is global (the default), the value is nil. */) return Qnil; } + +/* This code is disabled now that we use the selected frame to return + keyboard-local-values. */ +#if 0 +extern struct terminal *get_terminal P_ ((Lisp_Object display, int)); + +DEFUN ("terminal-local-value", Fterminal_local_value, Sterminal_local_value, 2, 2, 0, + doc: /* Return the terminal-local value of SYMBOL on TERMINAL. +If SYMBOL is not a terminal-local variable, then return its normal +value, like `symbol-value'. + +TERMINAL may be a terminal id, a frame, or nil (meaning the +selected frame's terminal device). */) + (symbol, terminal) + Lisp_Object symbol; + Lisp_Object terminal; +{ + Lisp_Object result; + struct terminal *t = get_terminal (terminal, 1); + push_kboard (t->kboard); + result = Fsymbol_value (symbol); + pop_kboard (); + return result; +} + +DEFUN ("set-terminal-local-value", Fset_terminal_local_value, Sset_terminal_local_value, 3, 3, 0, + doc: /* Set the terminal-local binding of SYMBOL on TERMINAL to VALUE. +If VARIABLE is not a terminal-local variable, then set its normal +binding, like `set'. + +TERMINAL may be a terminal id, a frame, or nil (meaning the +selected frame's terminal device). */) + (symbol, terminal, value) + Lisp_Object symbol; + Lisp_Object terminal; + Lisp_Object value; +{ + Lisp_Object result; + struct terminal *t = get_terminal (terminal, 1); + push_kboard (d->kboard); + result = Fset (symbol, value); + pop_kboard (); + return result; +} +#endif /* Find the function at the end of a chain of symbol function indirections. */ @@ -3173,6 +3233,10 @@ syms_of_data () defsubr (&Slocal_variable_p); defsubr (&Slocal_variable_if_set_p); defsubr (&Svariable_binding_locus); +#if 0 /* XXX Remove this. --lorentey */ + defsubr (&Sterminal_local_value); + defsubr (&Sset_terminal_local_value); +#endif defsubr (&Saref); defsubr (&Saset); defsubr (&Snumber_to_string); |