From: gerd.moellmann@t-online.de (Gerd Moellmann)
Cc: emacs-devel@gnu.org, monnier@IRO.UMontreal.CA, rms@gnu.org
Subject: Re: question about frame local variable
Date: 10 Nov 2003 11:35:59 +0100 [thread overview]
Message-ID: <863ccwjysw.fsf@gerd.free-bsd.org> (raw)
In-Reply-To: <200311100105.KAA28811@etlken.m17n.org>
Kenichi Handa <handa@m17n.org> writes:
> I found this code in redisplay_window (xdisp.c).
>
> /* Really select the buffer, for the sake of buffer-local
> variables. */
> set_buffer_internal_1 (XBUFFER (w->buffer));
>
> Perhaps, we should call
> select_frame_internal_for_variables_only around there.
I think the best place is in redisplay_internal, which redisplays
frame by frame. Otherwise, we'd end up doing this for each window
on a frame again and again.
I can't work on this, but maybe this is helpful:
void
select_frame_for_redisplay (Lisp_Object frame)
{
Lisp_Object tail, sym, val;
selected_frame = frame;
for (tail = XFRAME (frame)->param_alist; CONSP (tail); tail = XCDR (tail))
if (CONSP (XCAR (tail))
&& (sym = XCAR (XCAR (tail)),
SYMBOLP (sym))
&& (sym = indirect_variable (sym),
val = SYMBOL_VALUE (sym),
(BUFFER_LOCAL_VALUEP (val)
|| SOME_BUFFER_LOCAL_VALUEP (val)))
&& XBUFFER_LOCAL_VALUE (val)->check_frame)
Fsymbol_value (sym);
}
This works analogous to what set_buffer does for buffer-local
variables (hopefully; I haven't tried anything): For all frame
parameters P, check if a frame-local variable P exists. If so, swap
P's value in by calling Fsymbol_value. That works because the innards
of Fsymbol_value compare the frame recorded in the local value with
the currently selected frame.
In redisplay_internal, call the function with the frame being
displayed, and in an unwind-protect handler (I think there is already
one), call it to restore the original selected frame and its values.
HTH
next prev parent reply other threads:[~2003-11-10 10:35 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2003-10-25 0:49 question about frame local variable Kenichi Handa
2003-10-26 11:46 ` Richard Stallman
2003-10-28 8:03 ` Kenichi Handa
2003-10-30 1:35 ` Kenichi Handa
2003-10-30 9:33 ` Gerd Moellmann
2003-10-30 10:46 ` Kenichi Handa
2003-10-30 16:27 ` Stefan Monnier
2003-10-30 19:33 ` Gerd Moellmann
2003-11-10 1:05 ` Kenichi Handa
2003-11-10 10:35 ` Gerd Moellmann [this message]
2003-11-11 8:38 ` Kenichi Handa
2003-11-12 20:02 ` Richard Stallman
2003-11-13 0:42 ` Kenichi Handa
2003-11-13 4:14 ` Richard Stallman
2003-11-13 4:32 ` Kenichi Handa
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=863ccwjysw.fsf@gerd.free-bsd.org \
--to=gerd.moellmann@t-online.de \
--cc=emacs-devel@gnu.org \
--cc=monnier@IRO.UMontreal.CA \
--cc=rms@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.