Commit 9b2cd403 authored by Stefan Monnier's avatar Stefan Monnier

* xdisp.c (redisplay_internal): Reset tty's color_mode when switching

to another frame.
* frame.c (do_switch_frame): Refine the top_frame/async_visible code.
Don't call set_tty_color_mode.
(store_frame_param): Reset previous_frame rather than call
set_tty_color_mode.
* term.c (set_tty_color_mode): Rewrite.
* dispextern.h (set_tty_color_mode): New type.
* termchar.h (struct tty_display_info): Add `previous_color_mode'.
parent 84cb7b45
2008-04-09 Stefan Monnier <monnier@iro.umontreal.ca>
* xdisp.c (redisplay_internal): Reset tty's color_mode when switching
to another frame.
* frame.c (do_switch_frame): Refine the top_frame/async_visible code.
Don't call set_tty_color_mode.
(store_frame_param): Reset previous_frame rather than call
set_tty_color_mode.
* term.c (set_tty_color_mode): Rewrite.
* dispextern.h (set_tty_color_mode): New type.
* termchar.h (struct tty_display_info): Add `previous_color_mode'.
2008-04-08 Stefan Monnier <monnier@iro.umontreal.ca>
* keymap.c (access_keymap): Remove the value 2 for t_ok which was used
......
......@@ -3057,7 +3057,7 @@ extern void calculate_costs P_ ((struct frame *));
extern void produce_glyphs P_ ((struct it *));
extern void produce_special_glyphs P_ ((struct it *, enum display_element_type));
extern int tty_capable_p P_ ((struct tty_display_info *, unsigned, unsigned long, unsigned long));
extern void set_tty_color_mode P_ ((struct frame *, Lisp_Object));
extern void set_tty_color_mode (struct tty_display_info *, struct frame *);
extern struct terminal *get_tty_terminal P_ ((Lisp_Object, int));
extern struct terminal *get_named_tty P_ ((char *));
EXFUN (Ftty_type, 1);
......
......@@ -869,11 +869,11 @@ do_switch_frame (frame, track, for_deletion)
if (!for_deletion && FRAME_HAS_MINIBUF_P (sf))
resize_mini_window (XWINDOW (FRAME_MINIBUF_WINDOW (sf)), 1);
if (FRAME_TERMCAP_P (XFRAME (selected_frame))
&& FRAME_TERMCAP_P (XFRAME (frame))
&& FRAME_TTY (XFRAME (selected_frame)) == FRAME_TTY (XFRAME (frame)))
if (FRAME_TERMCAP_P (XFRAME (frame)))
{
XFRAME (selected_frame)->async_visible = 2; /* obscured */
if (FRAMEP (FRAME_TTY (XFRAME (frame))->top_frame))
/* Mark previously displayed frame as now obscured. */
XFRAME (FRAME_TTY (XFRAME (frame))->top_frame)->async_visible = 2;
XFRAME (frame)->async_visible = 1;
FRAME_TTY (XFRAME (frame))->top_frame = frame;
}
......@@ -884,23 +884,6 @@ do_switch_frame (frame, track, for_deletion)
Fselect_window (XFRAME (frame)->selected_window, Qnil);
#ifndef WINDOWSNT
/* Make sure to switch the tty color mode to that of the newly
selected frame. */
sf = SELECTED_FRAME ();
if (FRAME_TERMCAP_P (sf))
{
Lisp_Object color_mode_spec, color_mode;
color_mode_spec = assq_no_quit (Qtty_color_mode, sf->param_alist);
if (CONSP (color_mode_spec))
color_mode = XCDR (color_mode_spec);
else
color_mode = make_number (0);
set_tty_color_mode (sf, color_mode);
}
#endif /* !WINDOWSNT */
/* We want to make sure that the next event generates a frame-switch
event to the appropriate frame. This seems kludgy to me, but
before you take it out, make sure that evaluating something like
......@@ -2302,11 +2285,13 @@ store_frame_param (f, prop, val)
}
#ifndef WINDOWSNT
/* The tty color mode needs to be set before the frame's parameter
alist is updated with the new value, because set_tty_color_mode
wants to look at the old mode. */
if (FRAME_TERMCAP_P (f) && EQ (prop, Qtty_color_mode))
set_tty_color_mode (f, val);
/* The tty color needed to be set before the frame's parameter
alist was updated with the new value. This is not true any more,
but we still do this test early on. */
if (FRAME_TERMCAP_P (f) && EQ (prop, Qtty_color_mode)
&& f == FRAME_TTY (f)->previous_frame)
/* Force redisplay of this tty. */
FRAME_TTY (f)->previous_frame = NULL;
#endif
/* Update the frame parameter alist. */
......
......@@ -2161,56 +2161,38 @@ tty_setup_colors (struct tty_display_info *tty, int mode)
}
void
set_tty_color_mode (f, val)
set_tty_color_mode (tty, f)
struct tty_display_info *tty;
struct frame *f;
Lisp_Object val;
{
Lisp_Object color_mode_spec, current_mode_spec;
Lisp_Object color_mode, current_mode;
int mode, old_mode;
Lisp_Object tem, val, color_mode_spec;
Lisp_Object color_mode;
int mode;
extern Lisp_Object Qtty_color_mode;
Lisp_Object tty_color_mode_alist;
Lisp_Object tty_color_mode_alist
= Fintern_soft (build_string ("tty-color-mode-alist"), Qnil);
tty_color_mode_alist = Fintern_soft (build_string ("tty-color-mode-alist"),
Qnil);
tem = assq_no_quit (Qtty_color_mode, XFRAME (val)->param_alist);
val = CONSP (tem) ? XCDR (tem) : Qnil;
if (INTEGERP (val))
color_mode = val;
else
{
if (NILP (tty_color_mode_alist))
color_mode_spec = Qnil;
else
color_mode_spec = Fassq (val, XSYMBOL (tty_color_mode_alist)->value);
if (CONSP (color_mode_spec))
color_mode = XCDR (color_mode_spec);
else
color_mode = Qnil;
tem = (NILP (tty_color_mode_alist) ? Qnil
: Fassq (val, XSYMBOL (tty_color_mode_alist)->value));
color_mode = CONSP (tem) ? XCDR (tem) : Qnil;
}
current_mode_spec = assq_no_quit (Qtty_color_mode, f->param_alist);
if (CONSP (current_mode_spec))
current_mode = XCDR (current_mode_spec);
else
current_mode = Qnil;
if (INTEGERP (color_mode))
mode = XINT (color_mode);
else
mode = 0; /* meaning default */
if (INTEGERP (current_mode))
old_mode = XINT (current_mode);
else
old_mode = 0;
mode = INTEGERP (color_mode) ? XINT (color_mode) : 0;
if (mode != old_mode)
if (mode != tty->previous_color_mode)
{
tty_setup_colors (FRAME_TTY (f), mode);
/* This recomputes all the faces given the new color
definitions. */
call0 (intern ("tty-set-up-initial-frame-faces"));
redraw_frame (f);
Lisp_Object funsym = intern ("tty-set-up-initial-frame-faces");
tty->previous_color_mode = mode;
tty_setup_colors (tty , mode);
/* This recomputes all the faces given the new color definitions. */
safe_call (1, &funsym);
}
}
......
......@@ -70,6 +70,7 @@ struct tty_display_info
/* The previous frame we displayed on this tty. */
struct frame *previous_frame;
int previous_color_mode;
/* Strings, numbers and flags taken from the termcap entry. */
......
......@@ -11188,6 +11188,7 @@ redisplay_internal (preserve_echo_area)
the whole thing. */
windows_or_buffers_changed++;
SET_FRAME_GARBAGED (sf);
set_tty_color_mode (FRAME_TTY (sf), sf);
FRAME_TTY (sf)->previous_frame = sf;
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment