]> git.eshelyaron.com Git - emacs.git/commitdiff
* xdisp.c (redisplay_internal): Reset tty's color_mode when switching
authorStefan Monnier <monnier@iro.umontreal.ca>
Wed, 9 Apr 2008 03:25:14 +0000 (03:25 +0000)
committerStefan Monnier <monnier@iro.umontreal.ca>
Wed, 9 Apr 2008 03:25:14 +0000 (03:25 +0000)
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'.

src/ChangeLog
src/dispextern.h
src/frame.c
src/term.c
src/termchar.h
src/xdisp.c

index e1ef9ffb52ae163796809f54315c7a673cc26b3c..68e50dd376fdefcf283b3e4712a91eb128fb4d50 100644 (file)
@@ -1,3 +1,15 @@
+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
index 8e8d85619847860d289cef995f28699a8439e75c..88373c7dddcde52bcbd94d20580e0f7b9bf9ac53 100644 (file)
@@ -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);
index 81b91924d2f0e2bbf29f81acaedc94cfe03154a2..188e1d18717f58d64d525f5cc552d7fb03ea5e13 100644 (file)
@@ -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.  */
index 272e8d333267276be81eb569c43b652e5066572b..f76d0a5e5b1fc60db464de3b22627cc8eacc3fc4 100644 (file)
@@ -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);
     }
 }
 
index 390b6490b6346e6a0d7546496438c4d2d1fa99b1..735758ac910725d55a5a480b34c6380089e2ad3a 100644 (file)
@@ -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.  */
 
index d311cc646b7d5910a190250ede238b3bdb2d023a..8b6ed37df918b570573eebae50b30eec5a955027 100644 (file)
@@ -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;
     }