]> code.delx.au - gnu-emacs/blobdiff - src/msdos.c
Add description of +LINE:COLUMN.
[gnu-emacs] / src / msdos.c
index 85ff6dd94a625e08d9bf79d84bc65ec563609be3..79ac0b9026cde148247df699e8ed88065eb51fdb 100644 (file)
@@ -1,5 +1,6 @@
 /* MS-DOS specific C utilities.          -*- coding: raw-text -*-
-   Copyright (C) 1993, 94, 95, 96, 97, 1999 Free Software Foundation, Inc.
+   Copyright (C) 1993, 94, 95, 96, 97, 1999, 2000, 2001
+   Free Software Foundation, Inc.
 
 This file is part of GNU Emacs.
 
@@ -195,8 +196,15 @@ them.  This happens with wheeled mice on Windows 9X, for example.")
   (nbuttons)
      Lisp_Object nbuttons;
 {
+  int n;
+
   CHECK_NUMBER (nbuttons, 0);
-  mouse_setup_buttons (XINT (nbuttons));
+  n = XINT (nbuttons);
+  if (n < 2 || n > 3)
+    Fsignal (Qargs_out_of_range,
+            Fcons (build_string ("only 2 or 3 mouse buttons are supported"),
+                   Fcons (nbuttons, Qnil)));
+  mouse_setup_buttons (n);
   return Qnil;
 }
 
@@ -460,29 +468,29 @@ do_visible_bell (xorattr)
      unsigned char xorattr;
 {
   asm volatile
-    ("  movb   $1,%%dl
-visible_bell_0:
-       movl   _ScreenPrimary,%%eax
-       call   dosmemsetup
-       movl   %%eax,%%ebx
-       movl   %1,%%ecx
-       movb   %0,%%al
-       incl   %%ebx
-visible_bell_1:
-       xorb   %%al,%%gs:(%%ebx)
-       addl   $2,%%ebx
-       decl   %%ecx
-       jne    visible_bell_1
-       decb   %%dl
-       jne    visible_bell_3
-visible_bell_2:
-       movzwl %%ax,%%eax
-        movzwl %%ax,%%eax
-       movzwl %%ax,%%eax
-       movzwl %%ax,%%eax
-       decw   %%cx
-       jne    visible_bell_2
-       jmp    visible_bell_0
+    ("  movb   $1,%%dl                         \n\
+visible_bell_0:                                        \n\
+       movl   _ScreenPrimary,%%eax             \n\
+       call   dosmemsetup                      \n\
+       movl   %%eax,%%ebx                      \n\
+       movl   %1,%%ecx                         \n\
+       movb   %0,%%al                          \n\
+       incl   %%ebx                            \n\
+visible_bell_1:                                        \n\
+       xorb   %%al,%%gs:(%%ebx)                \n\
+       addl   $2,%%ebx                         \n\
+       decl   %%ecx                            \n\
+       jne    visible_bell_1                   \n\
+       decb   %%dl                             \n\
+       jne    visible_bell_3                   \n\
+visible_bell_2:                                        \n\
+       movzwl %%ax,%%eax                       \n\
+        movzwl %%ax,%%eax                      \n\
+       movzwl %%ax,%%eax                       \n\
+       movzwl %%ax,%%eax                       \n\
+       decw   %%cx                             \n\
+       jne    visible_bell_2                   \n\
+       jmp    visible_bell_0                   \n\
 visible_bell_3:"
      : /* no output */
      : "m" (xorattr), "g" (screen_size)
@@ -911,6 +919,14 @@ IT_set_face (int face)
       fg = bg;
       bg = tem;
     }
+  /* If the user requested inverse video, obey.  */
+  if (inverse_video)
+    {
+      unsigned long tem2 = fg;
+
+      fg = bg;
+      bg = tem2;
+    }
   if (termscript)
     fprintf (termscript, "<FACE %d%s: %d/%d[FG:%d/BG:%d]>", face,
             highlight ? "H" : "", fp->foreground, fp->background, fg, bg);
@@ -992,6 +1008,9 @@ IT_write_glyphs (struct glyph *str, int str_len)
          register GLYPH g = GLYPH_FROM_CHAR_GLYPH (*str);
          int glyph_not_in_table = 0;
 
+         /* If g is negative, it means we have a multibyte character
+            in *str.  That's what GLYPH_FROM_CHAR_GLYPH returns for
+            multibyte characters.  */
          if (g < 0 || g >= tlen)
            {
              /* This glyph doesn't have an entry in Vglyph_table.  */
@@ -1027,7 +1046,7 @@ IT_write_glyphs (struct glyph *str, int str_len)
 
          /* If the face of this glyph is different from the current
             screen face, update the screen attribute byte.  */
-         cf = FAST_GLYPH_FACE (g);
+         cf = str->face_id;
          if (cf != screen_face)
            IT_set_face (cf);   /* handles invalid faces gracefully */
 
@@ -2294,8 +2313,20 @@ DEFUN ("msdos-remember-default-colors", Fmsdos_remember_default_colors,
   CHECK_FRAME (frame, 0);
   f= XFRAME (frame);
 
-  initial_screen_colors[0] = FRAME_FOREGROUND_PIXEL (f);
-  initial_screen_colors[1] = FRAME_BACKGROUND_PIXEL (f);
+  /* This function is called after applying default-frame-alist to the
+     initial frame.  At that time, if reverse-colors option was
+     specified in default-frame-alist, it was already applied, and
+     frame colors are reversed.  We need to account for that.  */
+  if (EQ (Fcdr (Fassq (Qreverse, f->param_alist)), Qt))
+    {
+      initial_screen_colors[0] = FRAME_BACKGROUND_PIXEL (f);
+      initial_screen_colors[1] = FRAME_FOREGROUND_PIXEL (f);
+    }
+  else
+    {
+      initial_screen_colors[0] = FRAME_FOREGROUND_PIXEL (f);
+      initial_screen_colors[1] = FRAME_BACKGROUND_PIXEL (f);
+    }
 }
 
 void
@@ -2397,14 +2428,15 @@ IT_set_frame_parameters (f, alist)
                  Finternal_set_lisp_face_attribute (Qdefault, QCbackground,
                                                     val, frame);
                  prop = Qbackground_color;
+                 bg_set = 1;
                }
              else
                {
                  Finternal_set_lisp_face_attribute (Qdefault, QCforeground,
                                                     val, frame);
+                 fg_set = 1;
                }
              redraw = 1;
-             fg_set = 1;
              if (termscript)
                fprintf (termscript, "<FGCOLOR %lu>\n", new_color);
            }
@@ -2427,14 +2459,15 @@ IT_set_frame_parameters (f, alist)
                  Finternal_set_lisp_face_attribute (Qdefault, QCforeground,
                                                     val, frame);
                  prop = Qforeground_color;
+                 fg_set = 1;
                }
              else
                {
                  Finternal_set_lisp_face_attribute (Qdefault, QCbackground,
                                                     val, frame);
+                 bg_set = 1;
                }
              redraw = 1;
-             bg_set = 1;
              if (termscript)
                fprintf (termscript, "<BGCOLOR %lu>\n", new_color);
            }
@@ -2465,19 +2498,17 @@ IT_set_frame_parameters (f, alist)
       if (!fg_set)
        {
          XSETFRAME (frame, f);
-         Finternal_set_lisp_face_attribute (Qdefault, QCbackground,
-                                            tty_color_name (f, orig_fg),
+         Finternal_set_lisp_face_attribute (Qdefault, QCforeground,
+                                            tty_color_name (f, orig_bg),
                                             frame);
-         store_frame_param (f, Qbackground_color, frame_fg);
          redraw = 1;
        }
       if (!bg_set)
        {
          XSETFRAME (frame, f);
-         Finternal_set_lisp_face_attribute (Qdefault, QCforeground,
-                                            tty_color_name (f, orig_bg),
+         Finternal_set_lisp_face_attribute (Qdefault, QCbackground,
+                                            tty_color_name (f, orig_fg),
                                             frame);
-         store_frame_param (f, Qforeground_color, frame_bg);
          redraw = 1;
        }
     }
@@ -5301,7 +5332,7 @@ wide as that tab on the display.  (No effect on MS-DOS.)");
 
   DEFVAR_LISP ("dos-unsupported-char-glyph", &Vdos_unsupported_char_glyph,
    "*Glyph to display instead of chars not supported by current codepage.\n\
-
+\n\
 This variable is used only by MSDOS terminals.");
     Vdos_unsupported_char_glyph = '\177';
 #endif