]> code.delx.au - gnu-emacs/blobdiff - src/msdos.c
*** empty log message ***
[gnu-emacs] / src / msdos.c
index 88538686011679c649f0f1f6083e27c7399c9694..5bf608dc6a704b03518fd4727f9e01618b91ca8d 100644 (file)
@@ -1,5 +1,5 @@
 /* MS-DOS specific C utilities.          -*- coding: raw-text -*-
-   Copyright (C) 1993, 94, 95, 96, 97, 1999, 2000, 2001
+   Copyright (C) 1993, 94, 95, 96, 97, 1999, 2000, 01, 2003
    Free Software Foundation, Inc.
 
 This file is part of GNU Emacs.
@@ -109,14 +109,14 @@ event_timestamp ()
 {
   struct time t;
   unsigned long s;
-  
+
   gettime (&t);
   s = t.ti_min;
   s *= 60;
   s += t.ti_sec;
   s *= 1000;
   s += t.ti_hund * 10;
-  
+
   return s;
 }
 
@@ -412,9 +412,9 @@ static unsigned short screen_virtual_offset = 0;
 /* A flag to control how to display unibyte 8-bit characters.  */
 extern int unibyte_display_via_language_environment;
 
-Lisp_Object Qbar;
+Lisp_Object Qbar, Qhbar;
 
-/* The screen colors of the curent frame, which serve as the default
+/* The screen colors of the current frame, which serve as the default
    colors for newly-created frames.  */
 static int initial_screen_colors[2];
 
@@ -439,8 +439,7 @@ dosv_refresh_virtual_screen (int offset, int count)
 
 static void
 dos_direct_output (y, x, buf, len)
-     int y;
-     int x;
+     int x, y;
      char *buf;
      int len;
 {
@@ -568,10 +567,9 @@ dos_set_window_size (rows, cols)
      int *rows, *cols;
 {
   char video_name[30];
-  Lisp_Object video_mode;
-  int video_mode_value;
-  int have_vga = 0;
   union REGS regs;
+  Lisp_Object video_mode;
+  int video_mode_value, have_vga = 0;
   int current_rows = ScreenRows (), current_cols = ScreenCols ();
 
   if (*rows == current_rows && *cols == current_cols)
@@ -610,8 +608,7 @@ dos_set_window_size (rows, cols)
   else
     {
       static struct {
-       int rows;
-       int need_vga;
+       int rows, need_vga;
       }        std_dimension[] = {
          {25, 0},
          {28, 1},
@@ -720,14 +717,14 @@ static void
 mouse_off_maybe ()
 {
   int x, y;
-  
+
   if (!mouse_visible)
     return;
-  
+
   mouse_get_xy (&x, &y);
   if (y != new_pos_Y || x < new_pos_X)
     return;
-  
+
   mouse_off ();
 }
 
@@ -820,12 +817,14 @@ msdos_set_cursor_shape (struct frame *f, int start_line, int width)
 static void
 IT_set_cursor_type (struct frame *f, Lisp_Object cursor_type)
 {
-  if (EQ (cursor_type, Qbar))
+  if (EQ (cursor_type, Qbar) || EQ (cursor_type, Qhbar))
     {
       /* Just BAR means the normal EGA/VGA cursor.  */
       msdos_set_cursor_shape (f, DEFAULT_CURSOR_START, DEFAULT_CURSOR_WIDTH);
     }
-  else if (CONSP (cursor_type) && EQ (XCAR (cursor_type), Qbar))
+  else if (CONSP (cursor_type)
+          && (EQ (XCAR (cursor_type), Qbar)
+              || EQ (XCAR (cursor_type), Qhbar)))
     {
       Lisp_Object bar_parms = XCDR (cursor_type);
       int width;
@@ -975,7 +974,7 @@ IT_write_glyphs (struct glyph *str, int str_len)
   int conversion_buffer_size = sizeof conversion_buffer;
 
   if (str_len <= 0) return;
-  
+
   screen_buf = screen_bp = alloca (str_len * 2);
   screen_buf_end = screen_buf + str_len * 2;
   sf = SELECTED_FRAME();
@@ -986,7 +985,7 @@ IT_write_glyphs (struct glyph *str, int str_len)
      face of the frame, before writing glyphs, and let the glyphs
      set the right face if it's different from the default.  */
   IT_set_face (DEFAULT_FACE_ID);
-  
+
   /* The mode bit CODING_MODE_LAST_BLOCK should be set to 1 only at
      the tail.  */
   terminal_coding.mode &= ~CODING_MODE_LAST_BLOCK;
@@ -1181,23 +1180,7 @@ IT_write_glyphs (struct glyph *str, int str_len)
                          Mouse Highlight (and friends..)
  ************************************************************************/
 
-/* If non-nil, dos_rawgetc generates an event to display that string.
-   (The display is done in keyboard.c:read_char, by calling
-   show_help_echo.)  */
-static Lisp_Object help_echo;
-static Lisp_Object previous_help_echo; /* a helper temporary variable */
-
-/* These record the window, the object and the position where the help
-   echo string was generated.  */
-static Lisp_Object help_echo_window;
-static Lisp_Object help_echo_object;
-static int help_echo_pos;
-
-/* Non-zero means automatically select any window when the mouse
-   cursor moves into it.  */
-int x_autoselect_window_p;
-
-/* Last window where we saw the mouse.  Used by x-autoselect-window.  */
+/* Last window where we saw the mouse.  Used by mouse-autoselect-window.  */
 static Lisp_Object last_mouse_window;
 
 static int mouse_preempted = 0;        /* non-zero when XMenu gobbles mouse events */
@@ -1225,7 +1208,7 @@ show_mouse_face (struct display_info *dpyinfo, int hl)
   int i;
   struct face *fp;
 
-  
+
   /* If window is in the process of being destroyed, don't bother
      doing anything.  */
   if (w->current_matrix == NULL)
@@ -1277,8 +1260,8 @@ show_mouse_face (struct display_info *dpyinfo, int hl)
       row->mouse_face_p = hl > 0;
       if (hl > 0)
        {
-         int vpos = row->y + WINDOW_DISPLAY_TOP_EDGE_PIXEL_Y (w);
-         int kstart = start_hpos + WINDOW_DISPLAY_LEFT_EDGE_PIXEL_X (w);
+         int vpos = row->y + WINDOW_TOP_EDGE_Y (w);
+         int kstart = start_hpos + WINDOW_LEFT_EDGE_X (w);
          int nglyphs = end_hpos - start_hpos;
          int offset = ScreenPrimary + 2*(vpos*screen_size_X + kstart) + 1;
          int start_offset = offset;
@@ -1320,8 +1303,8 @@ show_mouse_face (struct display_info *dpyinfo, int hl)
          /* IT_write_glyphs writes at cursor position, so we need to
             temporarily move cursor coordinates to the beginning of
             the highlight region.  */
-         new_pos_X = start_hpos + WINDOW_DISPLAY_LEFT_EDGE_PIXEL_X (w);
-         new_pos_Y = row->y + WINDOW_DISPLAY_TOP_EDGE_PIXEL_Y (w);
+         new_pos_X = start_hpos + WINDOW_LEFT_EDGE_X (w);
+         new_pos_Y = row->y + WINDOW_TOP_EDGE_Y (w);
 
          if (termscript)
            fprintf (termscript, "<MH- %d-%d:%d>",
@@ -1335,7 +1318,6 @@ show_mouse_face (struct display_info *dpyinfo, int hl)
     }
 
  set_cursor_shape:
-  
   /* Change the mouse pointer shape.  */
   IT_set_mouse_pointer (hl);
 }
@@ -1360,13 +1342,9 @@ clear_mouse_face (struct display_info *dpyinfo)
 static int
 fast_find_position (struct window *w, int pos, int *hpos, int *vpos)
 {
-  int i;
-  int lastcol;
-  int maybe_next_line_p = 0;
-  int line_start_position;
+  int i, lastcol, line_start_position, maybe_next_line_p = 0;
   int yb = window_text_bottom_y (w);
-  struct glyph_row *row = MATRIX_ROW (w->current_matrix, 0);
-  struct glyph_row *best_row = row;
+  struct glyph_row *row = MATRIX_ROW (w->current_matrix, 0), *best_row = row;
 
   while (row->y < yb)
     {
@@ -1392,10 +1370,10 @@ fast_find_position (struct window *w, int pos, int *hpos, int *vpos)
         never-never land... */
       if (row->y + 1 >= yb)
        break;
-      
+
       ++row;
     }
-  
+
   /* Find the right column within BEST_ROW.  */
   lastcol = 0;
   row = best_row;
@@ -1447,22 +1425,24 @@ IT_note_mode_line_highlight (struct window *w, int x, int mode_line_p)
     row = MATRIX_MODE_LINE_ROW (w->current_matrix);
   else
     row = MATRIX_HEADER_LINE_ROW (w->current_matrix);
-  
+
   if (row->enabled_p)
     {
       extern Lisp_Object Qhelp_echo;
       struct glyph *glyph, *end;
       Lisp_Object help, map;
-      
+
       /* Find the glyph under X.  */
-      glyph = row->glyphs[TEXT_AREA]
-       + x - FRAME_LEFT_SCROLL_BAR_WIDTH (f) * CANON_X_UNIT (f);
+      glyph = (row->glyphs[TEXT_AREA]
+              + x
+              /* Does MS-DOG really support scroll-bars??  ++KFS */
+              - WINDOW_LEFT_SCROLL_BAR_AREA_WIDTH (w));
       end = glyph + row->used[TEXT_AREA];
       if (glyph < end
          && STRINGP (glyph->object)
-         && XSTRING (glyph->object)->intervals
+         && STRING_INTERVALS (glyph->object)
          && glyph->charpos >= 0
-         && glyph->charpos < XSTRING (glyph->object)->size)
+         && glyph->charpos < SCHARS (glyph->object))
        {
          /* If we're on a string with `help-echo' text property,
             arrange for the help to be displayed.  This is done by
@@ -1471,7 +1451,7 @@ IT_note_mode_line_highlight (struct window *w, int x, int mode_line_p)
                                     Qhelp_echo, glyph->object);
          if (!NILP (help))
            {
-             help_echo = help;
+             help_echo_string = help;
              XSETWINDOW (help_echo_window, w);
              help_echo_object = glyph->object;
              help_echo_pos = glyph->charpos;
@@ -1488,7 +1468,7 @@ static void
 IT_note_mouse_highlight (struct frame *f, int x, int y)
 {
   struct display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f);
-  int portion = -1;
+  enum window_part part = ON_NOTHING;
   Lisp_Object window;
   struct window *w;
 
@@ -1514,7 +1494,7 @@ IT_note_mouse_highlight (struct frame *f, int x, int y)
     }
 
   /* Which window is that in?  */
-  window = window_from_coordinates (f, x, y, &portion, 0);
+  window = window_from_coordinates (f, x, y, &part, &x, &y, 0);
 
   /* If we were displaying active text in another window, clear that.  */
   if (! EQ (window, dpyinfo->mouse_face_window))
@@ -1526,31 +1506,27 @@ IT_note_mouse_highlight (struct frame *f, int x, int y)
 
   /* Convert to window-relative coordinates.  */
   w = XWINDOW (window);
-  x -= WINDOW_DISPLAY_LEFT_EDGE_PIXEL_X (w);
-  y -= WINDOW_DISPLAY_TOP_EDGE_PIXEL_Y (w);
 
-  if (portion == 1 || portion == 3)
+  if (part == ON_MODE_LINE || part == ON_HEADER_LINE)
     {
       /* Mouse is on the mode or top line.  */
-      IT_note_mode_line_highlight (w, x, portion == 1);
+      IT_note_mode_line_highlight (w, x, part == ON_MODE_LINE);
       return;
     }
-  else
-    IT_set_mouse_pointer (0);
+
+  IT_set_mouse_pointer (0);
 
   /* Are we in a window whose display is up to date?
      And verify the buffer's text has not changed.  */
-  if (/* Within text portion of the window.  */
-      portion == 0
+  if (part == ON_TEXT
       && EQ (w->window_end_valid, w->buffer)
       && XFASTINT (w->last_modified) == BUF_MODIFF (XBUFFER (w->buffer))
       && (XFASTINT (w->last_overlay_modified)
          == BUF_OVERLAY_MODIFF (XBUFFER (w->buffer))))
     {
-      int pos, i;
+      int pos, i, nrows = w->current_matrix->nrows;
       struct glyph_row *row;
       struct glyph *glyph;
-      int nrows = w->current_matrix->nrows;
 
       /* Find the glyph under X/Y.  */
       glyph = NULL;
@@ -1592,11 +1568,9 @@ IT_note_mouse_highlight (struct frame *f, int x, int y)
       /* Check for mouse-face and help-echo.  */
       {
        extern Lisp_Object Qmouse_face;
-       Lisp_Object mouse_face, overlay, position;
-       Lisp_Object *overlay_vec;
-       int len, noverlays;
+       Lisp_Object mouse_face, overlay, position, *overlay_vec;
+       int len, noverlays, obegv, ozv;;
        struct buffer *obuf;
-       int obegv, ozv;
 
        /* If we get an out-of-range value, return now; avoid an error.  */
        if (pos > BUF_Z (XBUFFER (w->buffer)))
@@ -1627,7 +1601,7 @@ IT_note_mouse_highlight (struct frame *f, int x, int y)
            noverlays = overlays_at (pos,
                                     0, &overlay_vec, &len, NULL, NULL, 0);
          }
-         
+
        /* Sort overlays into increasing priority order.  */
        noverlays = sort_overlays (overlay_vec, noverlays, w);
 
@@ -1682,7 +1656,8 @@ IT_note_mouse_highlight (struct frame *f, int x, int y)
                dpyinfo->mouse_face_window = window;
                dpyinfo->mouse_face_face_id
                  = face_at_buffer_position (w, pos, 0, 0,
-                                            &ignore, pos + 1, 1);
+                                            &ignore, pos + 1,
+                                            !dpyinfo->mouse_face_hidden);
 
                /* Display it as active.  */
                show_mouse_face (dpyinfo, 1);
@@ -1716,7 +1691,8 @@ IT_note_mouse_highlight (struct frame *f, int x, int y)
                dpyinfo->mouse_face_window = window;
                dpyinfo->mouse_face_face_id
                  = face_at_buffer_position (w, pos, 0, 0,
-                                            &ignore, pos + 1, 1);
+                                            &ignore, pos + 1,
+                                            !dpyinfo->mouse_face_hidden);
 
                /* Display it as active.  */
                show_mouse_face (dpyinfo, 1);
@@ -1735,10 +1711,10 @@ IT_note_mouse_highlight (struct frame *f, int x, int y)
              overlay = overlay_vec[i];
              help = Foverlay_get (overlay, Qhelp_echo);
            }
-           
+
          if (!NILP (help))
            {
-             help_echo = help;
+             help_echo_string = help;
              help_echo_window = window;
              help_echo_object = overlay;
              help_echo_pos = pos;
@@ -1747,7 +1723,7 @@ IT_note_mouse_highlight (struct frame *f, int x, int y)
          else if (NILP (help)
                   && ((STRINGP (glyph->object)
                        && glyph->charpos >= 0
-                       && glyph->charpos < XSTRING (glyph->object)->size)
+                       && glyph->charpos < SCHARS (glyph->object))
                       || (BUFFERP (glyph->object)
                           && glyph->charpos >= BEGV
                           && glyph->charpos < ZV)))
@@ -1756,14 +1732,14 @@ IT_note_mouse_highlight (struct frame *f, int x, int y)
                                         Qhelp_echo, glyph->object);
              if (!NILP (help))
                {
-                 help_echo = help;
+                 help_echo_string = help;
                  help_echo_window = window;
                  help_echo_object = glyph->object;
                  help_echo_pos = glyph->charpos;
                }
            }
        }
-         
+
        BEGV = obegv;
        ZV = ozv;
        current_buffer = obuf;
@@ -1775,8 +1751,7 @@ static void
 IT_clear_end_of_line (int first_unused)
 {
   char *spaces, *sp;
-  int i, j;
-  int offset = 2 * (new_pos_X + screen_size_X * new_pos_Y);
+  int i, j, offset = 2 * (new_pos_X + screen_size_X * new_pos_Y);
   extern int fatal_error_in_progress;
 
   if (new_pos_X >= first_unused || fatal_error_in_progress)
@@ -1787,7 +1762,7 @@ IT_clear_end_of_line (int first_unused)
   if (termscript)
     fprintf (termscript, "<CLR:EOL[%d..%d)>", new_pos_X, first_unused);
   spaces = sp = alloca (i);
-  
+
   while (--j >= 0)
     {
       *sp++ = ' ';
@@ -1906,7 +1881,7 @@ IT_cmgoto (FRAME_PTR f)
   /* If we are in the echo area, put the cursor at the
      end of the echo area message.  */
   if (!update_cursor_pos
-      && XFASTINT (XWINDOW (FRAME_MINIBUF_WINDOW (f))->top) <= new_pos_Y)
+      && WINDOW_TOP_EDGE_LINE (XWINDOW (FRAME_MINIBUF_WINDOW (f))) <= new_pos_Y)
     {
       int tem_X = current_pos_X, dummy;
 
@@ -2154,14 +2129,14 @@ IT_set_terminal_modes (void)
   screen_size_X = ScreenCols ();
   screen_size_Y = ScreenRows ();
   screen_size = screen_size_X * screen_size_Y;
-  
+
   new_pos_X = new_pos_Y = 0;
   current_pos_X = current_pos_Y = -1;
 
   if (term_setup_done)
     return;
   term_setup_done = 1;
-  
+
   startup_screen_size_X = screen_size_X;
   startup_screen_size_Y = screen_size_Y;
   startup_screen_attrib = ScreenAttrib;
@@ -2217,19 +2192,17 @@ IT_reset_terminal_modes (void)
 {
   int display_row_start = (int) ScreenPrimary;
   int saved_row_len     = startup_screen_size_X * 2;
-  int update_row_len    = ScreenCols () * 2;
-  int current_rows      = ScreenRows ();
+  int update_row_len    = ScreenCols () * 2, current_rows = ScreenRows ();
   int to_next_row       = update_row_len;
   unsigned char *saved_row = startup_screen_buffer;
-  int cursor_pos_X = ScreenCols () - 1;
-  int cursor_pos_Y = ScreenRows () - 1;
+  int cursor_pos_X = ScreenCols () - 1, cursor_pos_Y = ScreenRows () - 1;
 
   if (termscript)
     fprintf (termscript, "\n<RESET_TERM>");
 
   if (!term_setup_done)
     return;
-  
+
   mouse_off ();
 
   /* Leave the video system in the same state as we found it,
@@ -2329,19 +2302,16 @@ IT_set_frame_parameters (f, alist)
      Lisp_Object alist;
 {
   Lisp_Object tail;
-  int length = XINT (Flength (alist));
-  int i, j;
+  int i, j, length = XINT (Flength (alist));
   Lisp_Object *parms
     = (Lisp_Object *) alloca (length * sizeof (Lisp_Object));
   Lisp_Object *values
     = (Lisp_Object *) alloca (length * sizeof (Lisp_Object));
   /* Do we have to reverse the foreground and background colors?  */
   int reverse = EQ (Fcdr (Fassq (Qreverse, f->param_alist)), Qt);
-  int was_reverse = reverse;
+  int need_to_reverse, was_reverse = reverse;
   int redraw = 0, fg_set = 0, bg_set = 0;
-  int need_to_reverse;
-  unsigned long orig_fg;
-  unsigned long orig_bg;
+  unsigned long orig_fg, orig_bg;
   Lisp_Object frame_bg, frame_fg;
   extern Lisp_Object Qdefault, QCforeground, QCbackground;
 
@@ -2398,8 +2368,7 @@ IT_set_frame_parameters (f, alist)
   /* Now process the alist elements in reverse of specified order.  */
   for (i--; i >= 0; i--)
     {
-      Lisp_Object prop, val;
-      Lisp_Object frame;
+      Lisp_Object prop, val, frame;
 
       prop = parms[i];
       val  = values[i];
@@ -2470,14 +2439,16 @@ IT_set_frame_parameters (f, alist)
        {
          x_set_title (f, val);
          if (termscript)
-           fprintf (termscript, "<TITLE: %s>\n", XSTRING (val)->data);
+           fprintf (termscript, "<TITLE: %s>\n", SDATA (val));
        }
       else if (EQ (prop, Qcursor_type))
        {
          IT_set_cursor_type (f, val);
          if (termscript)
            fprintf (termscript, "<CTYPE: %s>\n",
-                    EQ (val, Qbar) || CONSP (val) && EQ (XCAR (val), Qbar)
+                    EQ (val, Qbar) || EQ (val, Qhbar)
+                    || CONSP (val) && (EQ (XCAR (val), Qbar)
+                                       || EQ (XCAR (val), Qhbar))
                     ? "bar" : "box");
        }
       store_frame_param (f, prop, val);
@@ -2525,8 +2496,7 @@ extern void init_frame_faces (FRAME_PTR);
 void
 internal_terminal_init ()
 {
-  char *term = getenv ("TERM");
-  char *colors;
+  char *term = getenv ("TERM"), *colors;
   struct frame *sf = SELECTED_FRAME();
 
 #ifdef HAVE_X_WINDOWS
@@ -2539,7 +2509,7 @@ internal_terminal_init ()
 
   if (getenv ("EMACSTEST"))
     termscript = fopen (getenv ("EMACSTEST"), "wt");
-  
+
 #ifndef HAVE_X_WINDOWS
   if (!internal_terminal || inhibit_window_system)
     {
@@ -2578,7 +2548,6 @@ internal_terminal_init ()
       if (colors[1] >= 0 && colors[1] < 16)
         the_only_x_display.background_pixel = colors[1];
     }
-  the_only_x_display.line_height = 1;
   the_only_x_display.font = (XFontStruct *)1;   /* must *not* be zero */
   the_only_x_display.display_info.mouse_face_mouse_frame = NULL;
   the_only_x_display.display_info.mouse_face_deferred_gc = 0;
@@ -2627,7 +2596,7 @@ dos_get_saved_screen (screen, rows, cols)
   return *screen != (char *)0;
 #else
   return 0;
-#endif  
+#endif
 }
 
 #ifndef HAVE_X_WINDOWS
@@ -2797,7 +2766,7 @@ dos_set_keyboard (code, always)
   keyboard = keyboard_layout_list[0].keyboard_map;
   keyboard_map_all = always;
   dos_keyboard_layout = 1;
-  
+
   for (i = 0; i < (sizeof (keyboard_layout_list)/sizeof (struct keyboard_layout_list)); i++)
     if (code == keyboard_layout_list[i].country_code)
       {
@@ -2874,7 +2843,7 @@ ibmpc_translate_map[] =
   Map | 23,                    /* 'o' */
   Map | 24,                    /* 'p' */
   Map | 25,                    /* '[' */
-  Map | 26,                    /* ']' */ 
+  Map | 26,                    /* ']' */
   ModFct | 0x0d,               /* Return */
   Ignore,                      /* Ctrl */
   Map | 30,                    /* 'a' */
@@ -3050,23 +3019,22 @@ dos_get_modifiers (keymask)
      int *keymask;
 {
   union REGS regs;
-  int mask;
-  int modifiers = 0;
-  
+  int mask, modifiers = 0;
+
   /* Calculate modifier bits */
   regs.h.ah = extended_kbd ? 0x12 : 0x02;
   int86 (0x16, &regs, &regs);
 
   if (!extended_kbd)
     {
-      mask = regs.h.al & (SHIFT_P | CTRL_P | ALT_P | 
+      mask = regs.h.al & (SHIFT_P | CTRL_P | ALT_P |
                          SCRLOCK_P | NUMLOCK_P | CAPSLOCK_P);
     }
   else
     {
       mask = regs.h.al & (SHIFT_P |
                          SCRLOCK_P | NUMLOCK_P | CAPSLOCK_P);
-  
+
       /* Do not break international keyboard support.   */
       /* When Keyb.Com is loaded, the right Alt key is  */
       /* used for accessing characters like { and }      */
@@ -3094,7 +3062,7 @@ dos_get_modifiers (keymask)
              mask |= ALT_P;
            }
        }
-      
+
       if (regs.h.ah & 1)               /* Left CTRL pressed ? */
        mask |= CTRL_P;
 
@@ -3138,8 +3106,7 @@ Each input key receives two values in this vector: first the ASCII code,
 and then the scan code.  */)
      ()
 {
-  Lisp_Object *keys = XVECTOR (recent_doskeys)->contents;
-  Lisp_Object val;
+  Lisp_Object val, *keys = XVECTOR (recent_doskeys)->contents;
 
   if (total_doskeys < NUM_RECENT_DOSKEYS)
     return Fvector (total_doskeys, keys);
@@ -3163,6 +3130,7 @@ dos_rawgetc ()
   struct input_event event;
   union REGS regs;
   struct display_info *dpyinfo = FRAME_X_DISPLAY_INFO (SELECTED_FRAME());
+  EVENT_INIT (event);
   
 #ifndef HAVE_X_WINDOWS
   /* Maybe put the cursor where it should be.  */
@@ -3177,8 +3145,7 @@ dos_rawgetc ()
     {
       union REGS regs;
       register unsigned char c;
-      int sc, code = -1, mask, kp_mode;
-      int modifiers;
+      int modifiers, sc, code = -1, mask, kp_mode;
 
       regs.h.ah = extended_kbd ? 0x10 : 0x00;
       int86 (0x16, &regs, &regs);
@@ -3196,7 +3163,7 @@ dos_rawgetc ()
        recent_doskeys_index = 0;
 
       modifiers = dos_get_modifiers (&mask);
-      
+
 #ifndef HAVE_X_WINDOWS
       if (!NILP (Vdos_display_scancodes))
        {
@@ -3252,7 +3219,7 @@ dos_rawgetc ()
                continue;
            }
        }
-      
+
       if (c == 0)
        {
         /* We only look at the keyboard Ctrl/Shift/Alt keys when
@@ -3274,22 +3241,22 @@ dos_rawgetc ()
          if (code & Shift)
            modifiers |= shift_modifier;
        }
-      
+
       switch (code & 0xf000)
        {
        case ModFct:
          if (c && !(mask & (SHIFT_P | ALT_P | CTRL_P | HYPER_P | SUPER_P)))
            return c;
          c = 0;                /* Special */
-         
+
        case FctKey:
          if (c != 0)
            return c;
-           
+
        case Special:
          code |= 0xff00;
          break;
-         
+
        case Normal:
          if (sc == 0)
            {
@@ -3304,7 +3271,7 @@ dos_rawgetc ()
              code = c;
              break;
            }
-         
+
        case Map:
          if (c && !(mask & ALT_P) && !((mask & SHIFT_P) && (mask & CTRL_P)))
            if (!keyboard_map_all)
@@ -3313,7 +3280,7 @@ dos_rawgetc ()
          code &= 0xff;
          if (mask & ALT_P && code <= 10 && code > 0 && dos_keypad_mode & 0x200)
            mask |= SHIFT_P;    /* ALT-1 => M-! etc. */
-         
+
          if (mask & SHIFT_P)
            {
              code = keyboard->shifted[code];
@@ -3336,7 +3303,7 @@ dos_rawgetc ()
              kp_mode = dos_keypad_mode & 0x03;
            else
              kp_mode = (dos_keypad_mode >> 4) & 0x03;
-         
+
          switch (kp_mode)
            {
            case 0:
@@ -3352,13 +3319,13 @@ dos_rawgetc ()
              code = keypad_translate_map[code].meta_code;
              modifiers = meta_modifier;
              break;
-             
+
            case 3:
              code = 0xff00 | keypad_translate_map[code].editkey_code;
              break;
            }
          break;
-         
+
        case Grey:
          code &= 0xff;
          kp_mode = ((mask & (NUMLOCK_P|CTRL_P|SHIFT_P|ALT_P)) == NUMLOCK_P) ? 0x04 : 0x40;
@@ -3368,7 +3335,7 @@ dos_rawgetc ()
            code = grey_key_translate_map[code].char_code;
          break;
        }
-      
+
     make_event:
       if (code == 0)
        continue;
@@ -3380,9 +3347,9 @@ dos_rawgetc ()
        }
 
       if (code >= 0x100)
-       event.kind = non_ascii_keystroke;
+       event.kind = NON_ASCII_KEYSTROKE_EVENT;
       else
-       event.kind = ascii_keystroke;
+       event.kind = ASCII_KEYSTROKE_EVENT;
       event.code = code;
       event.modifiers =        modifiers;
       event.frame_or_window = selected_frame;
@@ -3395,6 +3362,7 @@ dos_rawgetc ()
     {
       int but, press, x, y, ok;
       int mouse_prev_x = mouse_last_x, mouse_prev_y = mouse_last_y;
+      Lisp_Object mouse_window = Qnil;
 
       /* Check for mouse movement *before* buttons.  */
       mouse_check_moved ();
@@ -3409,52 +3377,49 @@ dos_rawgetc ()
              clear_mouse_face (dpyinfo);
            }
 
-         if (x_autoselect_window_p)
+         /* Generate SELECT_WINDOW_EVENTs when needed.  */
+         if (mouse_autoselect_window)
            {
-             int mouse_area;
-             Lisp_Object mouse_window;
-
              mouse_window = window_from_coordinates (SELECTED_FRAME(),
                                                      mouse_last_x,
                                                      mouse_last_y,
-                                                     &mouse_area, 0);
+                                                     0, 0, 0, 0);
              /* A window will be selected only when it is not
-                selected now.  A minubuffer window will be selected
-                iff it is active.  */
-             if (!EQ (mouse_window, last_mouse_window)
-                 && !EQ (mouse_window, selected_window)
-                 && (!MINI_WINDOW_P (XWINDOW (mouse_window))
-                     || (EQ (mouse_window, minibuf_window)
-                         && minibuf_level > 0)))
+                selected now, and the last mouse movement event was
+                not in it.  A minibuffer window will be selected iff
+                it is active.  */
+             if (WINDOWP (mouse_window)
+                 && !EQ (mouse_window, last_mouse_window)
+                 && !EQ (mouse_window, selected_window))
                {
-                 Fselect_window (mouse_window);
+                 event.kind = SELECT_WINDOW_EVENT;
+                 event.frame_or_window = mouse_window;
+                 event.arg = Qnil;
+                 event.timestamp = event_timestamp ();
+                 kbd_buffer_store_event (&event);
                }
              last_mouse_window = mouse_window;
            }
          else
            last_mouse_window = Qnil;
 
-         previous_help_echo = help_echo;
-         help_echo = help_echo_object = help_echo_window = Qnil;
+         previous_help_echo_string = help_echo_string;
+         help_echo_string = help_echo_object = help_echo_window = Qnil;
          help_echo_pos = -1;
          IT_note_mouse_highlight (SELECTED_FRAME(),
                                   mouse_last_x, mouse_last_y);
          /* If the contents of the global variable help_echo has
             changed, generate a HELP_EVENT.  */
-         if (!NILP (help_echo) || !NILP (previous_help_echo))
+         if (!NILP (help_echo_string) || !NILP (previous_help_echo_string))
            {
-             /* HELP_EVENT takes 2 events in the event loop.  */
              event.kind = HELP_EVENT;
              event.frame_or_window = selected_frame;
              event.arg = help_echo_object;
-             event.x = make_number (help_echo_pos);
+             event.x = WINDOWP (help_echo_window)
+               ? help_echo_window : selected_frame;
+             event.y = help_echo_string;
              event.timestamp = event_timestamp ();
-             event.code = 0;
-             kbd_buffer_store_event (&event);
-             if (WINDOWP (help_echo_window))
-               event.frame_or_window = help_echo_window;
-             event.arg = help_echo;
-             event.code = 1;
+             event.code = help_echo_pos;
              kbd_buffer_store_event (&event);
            }
        }
@@ -3491,7 +3456,7 @@ dos_rawgetc ()
                      }
                  }
 
-               event.kind = mouse_click;
+               event.kind = MOUSE_CLICK_EVENT;
                event.code = button_num;
                event.modifiers = dos_get_modifiers (0)
                  | (press ? down_modifier : up_modifier);
@@ -3535,33 +3500,7 @@ dos_keyread ()
 }
 \f
 #ifndef HAVE_X_WINDOWS
-/* See xterm.c for more info.  */
-void
-pixel_to_glyph_coords (f, pix_x, pix_y, x, y, bounds, noclip)
-     FRAME_PTR f;
-     register int pix_x, pix_y;
-     register int *x, *y;
-     XRectangle *bounds;
-     int noclip;
-{
-  if (bounds) abort ();
-
-  /* Ignore clipping.  */
-
-  *x = pix_x;
-  *y = pix_y;
-}
 
-void
-glyph_to_pixel_coords (f, x, y, pix_x, pix_y)
-     FRAME_PTR f;
-     register int x, y;
-     register int *pix_x, *pix_y;
-{
-  *pix_x = x;
-  *pix_y = y;
-}
-\f
 /* Simulation of X's menus.  Nothing too fancy here -- just make it work
    for now.
 
@@ -3660,12 +3599,9 @@ IT_menu_calc_size (XMenu *menu, int *width, int *height)
 static void
 IT_menu_display (XMenu *menu, int y, int x, int pn, int *faces, int disp_help)
 {
-  int i, j, face, width;
+  int i, j, face, width,  mx, my, enabled, mousehere, row, col;
   struct glyph *text, *p;
   char *q;
-  int mx, my;
-  int enabled, mousehere;
-  int row, col;
   struct frame *sf = SELECTED_FRAME();
 
   menu_help_message = NULL;
@@ -3734,10 +3670,7 @@ IT_menu_display (XMenu *menu, int y, int x, int pn, int *faces, int disp_help)
 /* Report availability of menus.  */
 
 int
-have_menus_p ()
-{
-  return 1;
-}
+have_menus_p () {  return 1; }
 
 /* Create a brand new menu structure.  */
 
@@ -3839,16 +3772,11 @@ XMenuActivate (Display *foo, XMenu *menu, int *pane, int *selidx,
               void (*help_callback)(char *, int, int))
 {
   struct IT_menu_state *state;
-  int statecount;
-  int x, y, i, b;
-  int screensize;
-  int faces[4];
-  Lisp_Object selectface;
-  int leave, result, onepane;
+  int statecount, x, y, i, b, screensize, leave, result, onepane;
   int title_faces[4];          /* face to display the menu title */
-  int buffers_num_deleted = 0;
+  int faces[4], buffers_num_deleted = 0;
   struct frame *sf = SELECTED_FRAME();
-  Lisp_Object saved_echo_area_message;
+  Lisp_Object saved_echo_area_message, selectface;
 
   /* Just in case we got here without a mouse present...  */
   if (have_mouse <= 0)
@@ -3887,7 +3815,7 @@ XMenuActivate (Display *foo, XMenu *menu, int *pane, int *selidx,
 
   /* Don't let the title for the "Buffers" popup menu include a
      digit (which is ugly).
-     
+
      This is a terrible kludge, but I think the "Buffers" case is
      the only one where the title includes a number, so it doesn't
      seem to be necessary to make this more general.  */
@@ -3979,7 +3907,7 @@ XMenuActivate (Display *foo, XMenu *menu, int *pane, int *selidx,
                        state[statecount].x
                          = state[i].x + state[i].menu->width + 2;
                        state[statecount].y = y;
-                       statecount++;                     
+                       statecount++;
                      }
                  }
              }
@@ -4083,13 +4011,13 @@ XMenuDestroy (Display *foo, XMenu *menu)
 int
 x_pixel_width (struct frame *f)
 {
-  return FRAME_WIDTH (f);
+  return FRAME_COLS (f);
 }
 
 int
 x_pixel_height (struct frame *f)
 {
-  return FRAME_HEIGHT (f);
+  return FRAME_LINES (f);
 }
 #endif /* !HAVE_X_WINDOWS */
 \f
@@ -4140,8 +4068,7 @@ getdefdir (drive, dst)
      int drive;
      char *dst;
 {
-  char in_path[4], *p = in_path;
-  int e = errno;
+  char in_path[4], *p = in_path, e = errno;;
 
   /* Generate "X:." (when drive is X) or "." (when drive is 0).  */
   if (drive != 0)
@@ -4182,9 +4109,7 @@ crlf_to_lf (n, buf)
      register int n;
      register unsigned char *buf;
 {
-  unsigned char *np = buf;
-  unsigned char *startp = buf;
-  unsigned char *endp = buf + n;
+  unsigned char *np = buf, *startp = buf, *endp = buf + n;
 
   if (n == 0)
     return n;
@@ -4279,7 +4204,7 @@ __write (int handle, const void *buffer, size_t count)
    used when you compile with DJGPP v2.0.  */
 
 #include <io.h>
+
 int _rename(const char *old, const char *new)
 {
   __dpmi_regs r;
@@ -4439,7 +4364,7 @@ The argument object is never altered--the value is a copy.  */)
     return Qnil;
 
   tem = Fcopy_sequence (filename);
-  msdos_downcase_filename (XSTRING (tem)->data);
+  msdos_downcase_filename (SDATA (tem));
   return tem;
 }
 \f
@@ -4470,11 +4395,10 @@ init_environment (argc, argv, skip_args)
      int skip_args;
 {
   char *s, *t, *root;
-  int len;
+  int len, i;
   static const char * const tempdirs[] = {
     "$TMPDIR", "$TEMP", "$TMP", "c:/"
   };
-  int i;
   const int imax = sizeof (tempdirs) / sizeof (tempdirs[0]);
 
   /* Make sure they have a usable $TMPDIR.  Many Emacs functions use
@@ -4660,7 +4584,7 @@ dos_ttraw ()
 {
   union REGS inregs, outregs;
   static int first_time = 1;
-  
+
   break_stat = getcbrk ();
   setcbrk (0);
 #if __DJGPP__ < 2
@@ -4672,7 +4596,7 @@ dos_ttraw ()
       inregs.h.ah = 0xc0;
       int86 (0x15, &inregs, &outregs);
       extended_kbd = (!outregs.x.cflag) && (outregs.h.ah == 0);
-  
+
       have_mouse = 0;
 
       if (internal_terminal
@@ -4791,9 +4715,7 @@ run_msdos_command (argv, working_dir, tempin, tempout, temperr, envv)
 {
   char *saveargv1, *saveargv2, *lowcase_argv0, *pa, *pl;
   char oldwd[MAXPATHLEN + 1]; /* Fixed size is safe on MSDOS.  */
-  int msshell, result = -1;
-  int inbak, outbak, errbak;
-  int x, y;
+  int msshell, result = -1, inbak, outbak, errbak, x, y;
   Lisp_Object cmd;
 
   /* Get current directory as MSDOS cwd is not per-process.  */
@@ -4850,7 +4772,7 @@ run_msdos_command (argv, working_dir, tempin, tempout, temperr, envv)
     mouse_get_xy (&x, &y);
 
   dos_ttcooked ();     /* do it here while 0 = stdin */
-  
+
   dup2 (tempin, 0);
   dup2 (tempout, 1);
   dup2 (temperr, 2);
@@ -4901,7 +4823,7 @@ run_msdos_command (argv, working_dir, tempin, tempout, temperr, envv)
 #endif /* __DJGPP__ > 1 */
 
   result = spawnve (P_WAIT, argv[0], argv, envv);
-  
+
   dup2 (inbak, 0);
   dup2 (outbak, 1);
   dup2 (errbak, 2);
@@ -4920,7 +4842,7 @@ run_msdos_command (argv, working_dir, tempin, tempout, temperr, envv)
      text attribute byte, so we get blinking characters instead of the
      bright background colors.  Restore that.  */
   bright_bg ();
-  
+
  done:
   chdir (oldwd);
   if (msshell)
@@ -4931,6 +4853,7 @@ run_msdos_command (argv, working_dir, tempin, tempout, temperr, envv)
   return result;
 }
 
+void
 croak (badfunc)
      char *badfunc;
 {
@@ -4963,7 +4886,7 @@ gethostname (p, size)
 /* When time zones are set from Ms-Dos too many C-libraries are playing
    tricks with time values.  We solve this by defining our own version
    of `gettimeofday' bypassing GO32.  Our version needs to be initialized
-   once and after each call to `tzset' with TZ changed.  That is 
+   once and after each call to `tzset' with TZ changed.  That is
    accomplished by aliasing tzset to init_gettimeofday. */
 
 static struct tm time_rec;
@@ -4975,7 +4898,7 @@ gettimeofday (struct timeval *tp, struct timezone *tzp)
     {
       struct time t;
       struct tm tm;
-      
+
       gettime (&t);
       if (t.ti_hour < time_rec.tm_hour) /* midnight wrap */
        {
@@ -4985,14 +4908,14 @@ gettimeofday (struct timeval *tp, struct timezone *tzp)
          time_rec.tm_mon = d.da_mon - 1;
          time_rec.tm_mday = d.da_day;
        }
-      
+
       time_rec.tm_hour = t.ti_hour;
       time_rec.tm_min = t.ti_min;
       time_rec.tm_sec = t.ti_sec;
 
       tm = time_rec;
       tm.tm_gmtoff = dos_timezone_offset;
-      
+
       tp->tv_sec = mktime (&tm);       /* may modify tm */
       tp->tv_usec = t.ti_hund * (1000000 / 100);
     }
@@ -5013,7 +4936,7 @@ int kill (x, y) int x, y; { return -1; }
 nice (p) int p; {}
 void volatile pause () {}
 sigsetmask (x) int x; { return 0; }
-sigblock (mask) int mask; { return 0; } 
+sigblock (mask) int mask; { return 0; }
 #endif
 
 void request_sigio (void) {}
@@ -5022,6 +4945,7 @@ setpriority (x,y,z) int x,y,z; { return 0; }
 void unrequest_sigio (void) {}
 
 #if __DJGPP__ > 1
+#if __DJGPP_MINOR__ < 2
 
 #ifdef POSIX_SIGNALS
 
@@ -5043,7 +4967,7 @@ static sigset_t pending_signals;
 typedef void (*sighandler_t)(int);
 static sighandler_t prev_handlers[320];
 
-/* A signal handler which just records that a signal occured
+/* A signal handler which just records that a signal occurred
    (it will be raised later, if and when the signal is unblocked).  */
 static void
 sig_suspender (signo)
@@ -5125,9 +5049,10 @@ sigprocmask (how, new_set, old_set)
 #else /* not POSIX_SIGNALS */
 
 sigsetmask (x) int x; { return 0; }
-sigblock (mask) int mask; { return 0; } 
+sigblock (mask) int mask; { return 0; }
 
 #endif /* not POSIX_SIGNALS */
+#endif /* not __DJGPP_MINOR__ < 2 */
 #endif /* __DJGPP__ > 1 */
 
 #ifndef HAVE_SELECT
@@ -5185,7 +5110,7 @@ sys_select (nfds, rfds, wfds, efds, timeout)
 
   if (nfds != 1)
     abort ();
-  
+
   /* If we are looking only for the terminal, with no timeout,
      just read it and wait -- that's more efficient.  */
   if (!timeout)
@@ -5221,7 +5146,7 @@ sys_select (nfds, rfds, wfds, efds, timeout)
          dos_yield_time_slice ();
        }
     }
-  
+
   FD_SET (0, rfds);
   return 1;
 }
@@ -5253,7 +5178,7 @@ sys_chdir (path)
       tmp += 2;        /* strip drive: KFS 1995-07-06 */
       len -= 2;
     }
-  
+
   if (len > 1 && (tmp[len - 1] == '/'))
     {
       char *tmp1 = (char *) alloca (len + 1);
@@ -5294,7 +5219,7 @@ dos_abort (file, line)
 {
   char buffer1[200], buffer2[400];
   int i, j;
-  
+
   sprintf (buffer1, "<EMACS FATAL ERROR IN %s LINE %d>", file, line);
   for (i = j = 0; buffer1[i]; i++) {
     buffer2[j++] = buffer1[i];
@@ -5337,20 +5262,14 @@ syms_of_msdos ()
 {
   recent_doskeys = Fmake_vector (make_number (NUM_RECENT_DOSKEYS), Qnil);
   staticpro (&recent_doskeys);
+
 #ifndef HAVE_X_WINDOWS
-  help_echo = Qnil;
-  staticpro (&help_echo);
-  help_echo_object = Qnil;
-  staticpro (&help_echo_object);
-  help_echo_window = Qnil;
-  staticpro (&help_echo_window);
-  previous_help_echo = Qnil;
-  staticpro (&previous_help_echo);
-  help_echo_pos = -1;
 
   /* The following two are from xfns.c:  */
   Qbar = intern ("bar");
   staticpro (&Qbar);
+  Qhbar = intern ("hbar");
+  staticpro (&Qhbar);
   Qcursor_type = intern ("cursor-type");
   staticpro (&Qcursor_type);
   Qreverse = intern ("reverse");
@@ -5362,9 +5281,6 @@ syms_of_msdos ()
 This variable is used only by MSDOS terminals.  */);
   Vdos_unsupported_char_glyph = '\177';
 
-  DEFVAR_BOOL ("x-autoselect-window", &x_autoselect_window_p,
-    doc: /* *Non-nil means autoselect window with mouse pointer.  */);
-  x_autoselect_window_p = 0;
 #endif
 #ifndef subprocesses
   DEFVAR_BOOL ("delete-exited-processes", &delete_exited_processes,
@@ -5381,4 +5297,3 @@ nil means don't delete them until `list-processes' is run.  */);
 }
 
 #endif /* MSDOS */