X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/53704a07648ea8d4f2fa146c9a5d745c96aea25f..660872b63b75b61d11b09471b5a254e1e5db3c1c:/src/msdos.c diff --git a/src/msdos.c b/src/msdos.c index ca38e8b75d..79ac0b9026 100644 --- a/src/msdos.c +++ b/src/msdos.c @@ -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) @@ -670,6 +678,11 @@ dos_set_window_size (rows, cols) *rows = ScreenRows (); *cols = ScreenCols (); + /* Update Emacs' notion of screen dimensions. */ + screen_size_X = *cols; + screen_size_Y = *rows; + screen_size = *cols * *rows; + #if __DJGPP__ > 1 /* If the dimensions changed, the mouse highlight info is invalid. */ if (current_rows != *rows || current_cols != *cols) @@ -864,12 +877,13 @@ static void IT_set_face (int face) { struct frame *sf = SELECTED_FRAME(); - struct face *fp = FACE_FROM_ID (sf, face); - unsigned long fg, bg; + struct face *fp = FACE_FROM_ID (sf, face); + struct face *dfp = FACE_FROM_ID (sf, DEFAULT_FACE_ID); + unsigned long fg, bg, dflt_fg, dflt_bg; if (!fp) { - fp = FACE_FROM_ID (sf, DEFAULT_FACE_ID); + fp = dfp; /* The default face for the frame should always be realized and cached. */ if (!fp) @@ -878,6 +892,8 @@ IT_set_face (int face) screen_face = face; fg = fp->foreground; bg = fp->background; + dflt_fg = dfp->foreground; + dflt_bg = dfp->background; /* Don't use invalid colors. In particular, FACE_TTY_DEFAULT_* colors mean use the colors of the default face, except that if @@ -896,14 +912,21 @@ IT_set_face (int face) /* Make sure highlighted lines really stand out, come what may. */ if ((highlight || fp->tty_reverse_p) - && (fg == FRAME_FOREGROUND_PIXEL (sf) - && bg == FRAME_BACKGROUND_PIXEL (sf))) + && (fg == dflt_fg && bg == dflt_bg)) { unsigned long tem = fg; 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, highlight ? "H" : "", fp->foreground, fp->background, fg, bg); @@ -985,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. */ @@ -1020,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 */ @@ -1353,6 +1379,11 @@ fast_find_position (struct window *w, int pos, int *hpos, int *vpos) } else if (line_start_position > 0) best_row = row; + + /* Don't overstep the last matrix row, lest we get into the + never-never land... */ + if (row->y + 1 >= yb) + break; ++row; } @@ -1449,7 +1480,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; + int portion = -1; Lisp_Object window; struct window *w; @@ -1508,16 +1539,22 @@ IT_note_mouse_highlight (struct frame *f, int x, int y) && (XFASTINT (w->last_overlay_modified) == BUF_OVERLAY_MODIFF (XBUFFER (w->buffer)))) { - int pos, i, area; + int pos, i; struct glyph_row *row; struct glyph *glyph; + int nrows = w->current_matrix->nrows; /* Find the glyph under X/Y. */ glyph = NULL; - if (y < w->current_matrix->nrows) + if (y >= 0 && y < nrows) { row = MATRIX_ROW (w->current_matrix, y); - if (row->enabled_p + /* Give up if some row before the one we are looking for is + not enabled. */ + for (i = 0; i <= y; i++) + if (!MATRIX_ROW (w->current_matrix, i)->enabled_p) + break; + if (i > y /* all rows upto and including the one at Y are enabled */ && row->displays_text_p && x < window_box_width (w, TEXT_AREA)) { @@ -2271,17 +2308,25 @@ DEFUN ("msdos-remember-default-colors", Fmsdos_remember_default_colors, (frame) Lisp_Object frame; { - int reverse; struct frame *f; CHECK_FRAME (frame, 0); f= XFRAME (frame); - reverse = EQ (Fcdr (Fassq (intern ("reverse"), f->param_alist)), Qt); - initial_screen_colors[0] - = reverse ? FRAME_BACKGROUND_PIXEL (f) : FRAME_FOREGROUND_PIXEL (f); - initial_screen_colors[1] - = reverse ? FRAME_FOREGROUND_PIXEL (f) : 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 @@ -2300,8 +2345,10 @@ IT_set_frame_parameters (f, alist) int reverse = EQ (Fcdr (Fassq (Qreverse, f->param_alist)), Qt); int was_reverse = reverse; int redraw = 0, fg_set = 0, bg_set = 0; + int need_to_reverse; unsigned long orig_fg; unsigned long orig_bg; + Lisp_Object frame_bg, frame_fg; extern Lisp_Object Qdefault, QCforeground, QCbackground; /* If we are creating a new frame, begin with the original screen colors @@ -2314,6 +2361,15 @@ IT_set_frame_parameters (f, alist) } orig_fg = FRAME_FOREGROUND_PIXEL (f); orig_bg = FRAME_BACKGROUND_PIXEL (f); + frame_fg = Fcdr (Fassq (Qforeground_color, f->param_alist)); + frame_bg = Fcdr (Fassq (Qbackground_color, f->param_alist)); + /* frame_fg and frame_bg could be nil if, for example, + f->param_alist is nil, e.g. if we are called from + Fmake_terminal_frame. */ + if (NILP (frame_fg)) + frame_fg = build_string (unspecified_fg); + if (NILP (frame_bg)) + frame_bg = build_string (unspecified_bg); /* Extract parm names and values into those vectors. */ i = 0; @@ -2340,8 +2396,9 @@ IT_set_frame_parameters (f, alist) if (EQ (prop, Qreverse)) reverse = EQ (val, Qt); } - - if (termscript && reverse && !was_reverse) + + need_to_reverse = reverse && !was_reverse; + if (termscript && need_to_reverse) fprintf (termscript, "\n"); /* Now process the alist elements in reverse of specified order. */ @@ -2355,60 +2412,62 @@ IT_set_frame_parameters (f, alist) if (EQ (prop, Qforeground_color)) { - unsigned long new_color = load_color (f, NULL, val, reverse + unsigned long new_color = load_color (f, NULL, val, need_to_reverse ? LFACE_BACKGROUND_INDEX : LFACE_FOREGROUND_INDEX); if (new_color != FACE_TTY_DEFAULT_COLOR && new_color != FACE_TTY_DEFAULT_FG_COLOR && new_color != FACE_TTY_DEFAULT_BG_COLOR) { + FRAME_FOREGROUND_PIXEL (f) = new_color; /* Make sure the foreground of the default face for this frame is changed as well. */ XSETFRAME (frame, f); - if (reverse) + if (need_to_reverse) { - FRAME_BACKGROUND_PIXEL (f) = new_color; Finternal_set_lisp_face_attribute (Qdefault, QCbackground, val, frame); + prop = Qbackground_color; + bg_set = 1; } else { - FRAME_FOREGROUND_PIXEL (f) = new_color; Finternal_set_lisp_face_attribute (Qdefault, QCforeground, val, frame); + fg_set = 1; } redraw = 1; - fg_set = 1; if (termscript) fprintf (termscript, "\n", new_color); } } else if (EQ (prop, Qbackground_color)) { - unsigned long new_color = load_color (f, NULL, val, reverse + unsigned long new_color = load_color (f, NULL, val, need_to_reverse ? LFACE_FOREGROUND_INDEX : LFACE_BACKGROUND_INDEX); if (new_color != FACE_TTY_DEFAULT_COLOR && new_color != FACE_TTY_DEFAULT_FG_COLOR && new_color != FACE_TTY_DEFAULT_BG_COLOR) { + FRAME_BACKGROUND_PIXEL (f) = new_color; /* Make sure the background of the default face for this frame is changed as well. */ XSETFRAME (frame, f); - if (reverse) + if (need_to_reverse) { - FRAME_FOREGROUND_PIXEL (f) = new_color; Finternal_set_lisp_face_attribute (Qdefault, QCforeground, val, frame); + prop = Qforeground_color; + fg_set = 1; } else { - FRAME_BACKGROUND_PIXEL (f) = new_color; Finternal_set_lisp_face_attribute (Qdefault, QCbackground, val, frame); + bg_set = 1; } redraw = 1; - bg_set = 1; if (termscript) fprintf (termscript, "\n", new_color); } @@ -2432,25 +2491,23 @@ IT_set_frame_parameters (f, alist) /* If they specified "reverse", but not the colors, we need to swap the current frame colors. */ - if (reverse && !was_reverse) + if (need_to_reverse) { Lisp_Object frame; if (!fg_set) { - FRAME_BACKGROUND_PIXEL (f) = orig_fg; 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); redraw = 1; } if (!bg_set) { - FRAME_FOREGROUND_PIXEL (f) = orig_bg; 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); redraw = 1; } @@ -5275,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