changeset 16837:7370bcad5cb1

(bright_bg): Save the original state of video blink bit. (maybe_enable_blinking): New function, restores the original state of the blink bit. (IT_reset_terminal_modes): Restore the original state of the blink bit when suspending/exiting. (run_msdos_command): Make sure bright background colors are again enabled after subsidiary program returns.
author Richard M. Stallman <rms@gnu.org>
date Mon, 06 Jan 1997 21:23:25 +0000
parents ba46af9fd00d
children 9bcab3c812bb
files src/msdos.c
diffstat 1 files changed, 35 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/msdos.c	Mon Jan 06 06:51:29 1997 +0000
+++ b/src/msdos.c	Mon Jan 06 21:23:25 1997 +0000
@@ -62,6 +62,10 @@
 #define _USE_LFN 0
 #endif
 
+#ifndef _dos_ds
+#define _dos_ds _go32_info_block.selector_for_linear_memory
+#endif
+
 #if __DJGPP__ > 1
 
 #include <signal.h>
@@ -370,17 +374,39 @@
 
 #ifndef HAVE_X_WINDOWS
 
+static int blink_bit = -1;	/* the state of the blink bit at startup */
+
 /* Enable bright background colors.  */
 static void
 bright_bg (void)
 {
   union REGS regs;
 
+  /* Remember the original state of the blink/bright-background bit.
+     It is stored at 0040:0065h in the BIOS data area.  */
+  if (blink_bit == -1)
+    blink_bit = (_farpeekb (_dos_ds, 0x465) & 0x20) == 0x20;
+
   regs.h.bl = 0;
   regs.x.ax = 0x1003;
   int86 (0x10, &regs, &regs);
 }
 
+/* Disable bright background colors (and enable blinking) if we found
+   the video system in that state at startup.  */
+static void
+maybe_enable_blinking (void)
+{
+  if (blink_bit == 1)
+    {
+      union REGS regs;
+
+      regs.h.bl = 1;
+      regs.x.ax = 0x1003;
+      int86 (0x10, &regs, &regs);
+    }
+}
+
 /* Set the screen dimensions so that it can show no less than
    ROWS x COLS frame.  */
 
@@ -869,6 +895,10 @@
     return;
   
   mouse_off ();
+
+  /* Leave the video system in the same state as we found it,
+     as far as the blink/bright-background bit is concerned.  */
+  maybe_enable_blinking ();
  
   /* We have a situation here.
      We cannot just do ScreenUpdate(startup_screen_buffer) because
@@ -3010,6 +3040,11 @@
       mouse_init ();
       mouse_moveto (x, y);
     }
+
+  /* Some programs might change the meaning of the highest bit of the
+     text attribute byte, so we get blinking characters instead of the
+     bright background colors.  Restore that.  */
+  bright_bg ();
   
  done:
   chdir (oldwd);