Mercurial > emacs
changeset 97657:24f1cb4150ef
Include frame.h before termhooks.h.
(mouse_on, mouse_off, mouse_moveto, mouse_init)
(msdos_set_cursor_shape, IT_set_face, IT_write_glyphs)
(show_mouse_face, IT_clear_end_of_line, IT_clear_screen)
(IT_clear_to_end, IT_cursor_to, IT_display_cursor, IT_cmgoto)
(IT_set_terminal_modes, IT_reset_terminal_modes)
(IT_set_frame_parameters): Use tty->termscript instead of a global variable
termscript.
(IT_write_glyphs): Use tty->terminal->terminal_coding instead of a global
variable terminal_coding. Don't refer to Vnonascii_translation_table.
(internal_terminal_init): Set Vwindow_system in current_kboard. Don't use
TTY_CHAR_INS_DEL_OK. Set Vinitial_window_system. Announce date and time
of session start, if termscript is open. Don't zero out
the_only_display_info (it is done in term.c:init_tty). Open termscript
only of not already open. Log "SCREEN SAVED" here, instead of
IT_set_terminal_modes. Init mouse here instead of dos_ttraw.
Don't initialize display if this is an initial tty. Don't set FRAME_FONT.
(Vwindow_system_version): Bump to 23.
(dos_ttraw): Accept a TTY argument; all callers fixed. If mouse is
available, set up mouse_position_hook.
(dos_ttraw, IT_set_terminal_modes): If called with initial terminal, do
nothing.
(IT_set_frame_parameters): Handle the Qtty_type frame parameter by calling
internal_terminal_init.
(dos_set_window_size, show_mouse_face)
(clear_mouse_face, IT_note_mode_line_highlight)
(IT_note_mouse_highlight, IT_update_begin, IT_frame_up_to_date)
(dos_rawgetc): Use tty_display_info instead of x_display_info.
(initialize_msdos_display): New function.
(IT_cursor_to, IT_clear_to_end, IT_clear_screen)
(IT_clear_end_of_line, IT_insert_glyphs, IT_write_glyphs)
(IT_delete_glyphs, IT_ring_bell, IT_reset_terminal_modes)
(IT_set_terminal_modes, IT_set_terminal_window, IT_update_begin):
Accept additional argument: a pointer to a frame. All callers changed.
(request_sigio, unrequest_sigio): Don't define, now defined on sysdep.c.
(IT_write_glyphs): Rewrite to use encode_terminal_code.
author | Eli Zaretskii <eliz@gnu.org> |
---|---|
date | Sat, 23 Aug 2008 16:54:45 +0000 |
parents | 0ddcae8d4119 |
children | 53d01aafa957 |
files | src/msdos.c |
diffstat | 1 files changed, 258 insertions(+), 302 deletions(-) [+] |
line wrap: on
line diff
--- a/src/msdos.c Sat Aug 23 16:52:37 2008 +0000 +++ b/src/msdos.c Sat Aug 23 16:54:45 2008 +0000 @@ -50,6 +50,7 @@ #include "msdos.h" #include "systime.h" +#include "frame.h" #include "termhooks.h" #include "termchar.h" #include "dispextern.h" @@ -58,7 +59,6 @@ #include "character.h" #include "coding.h" #include "disptab.h" -#include "frame.h" #include "window.h" #include "buffer.h" #include "commands.h" @@ -80,6 +80,8 @@ #define _dos_ds _go32_info_block.selector_for_linear_memory #endif +extern FILE *prdebug; + #if __DJGPP__ > 1 #include <signal.h> @@ -148,8 +150,10 @@ if (have_mouse > 0 && !mouse_visible) { - if (termscript) - fprintf (termscript, "<M_ON>"); + struct tty_display_info *tty = CURTTY (); + + if (tty->termscript) + fprintf (tty->termscript, "<M_ON>"); regs.x.ax = 0x0001; int86 (0x33, ®s, ®s); mouse_visible = 1; @@ -163,8 +167,10 @@ if (have_mouse > 0 && mouse_visible) { - if (termscript) - fprintf (termscript, "<M_OFF>"); + struct tty_display_info *tty = CURTTY (); + + if (tty->termscript) + fprintf (tty->termscript, "<M_OFF>"); regs.x.ax = 0x0002; int86 (0x33, ®s, ®s); mouse_visible = 0; @@ -226,9 +232,10 @@ int x, y; { union REGS regs; - - if (termscript) - fprintf (termscript, "<M_XY=%dx%d>", x, y); + struct tty_display_info *tty = CURTTY (); + + if (tty->termscript) + fprintf (tty->termscript, "<M_XY=%dx%d>", x, y); regs.x.ax = 0x0004; mouse_last_x = regs.x.cx = x * 8; mouse_last_y = regs.x.dx = y * 8; @@ -340,9 +347,10 @@ mouse_init () { union REGS regs; - - if (termscript) - fprintf (termscript, "<M_INIT>"); + struct tty_display_info *tty = CURTTY (); + + if (tty->termscript) + fprintf (tty->termscript, "<M_INIT>"); regs.x.ax = 0x0021; int86 (0x33, ®s, ®s); @@ -400,7 +408,7 @@ static unsigned short outside_cursor; /* Similar to the_only_frame. */ -struct x_output the_only_x_display; +struct tty_display_info the_only_display_info; /* Support for DOS/V (allows Japanese characters to be displayed on standard, non-Japanese, ATs). Only supported for DJGPP v2 and later. */ @@ -691,7 +699,7 @@ if (current_rows != *rows || current_cols != *cols) { struct frame *f = SELECTED_FRAME(); - struct display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f); + struct tty_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f); Lisp_Object window = dpyinfo->mouse_face_window; if (! NILP (window) && XFRAME (XWINDOW (window)->frame) == f) @@ -744,6 +752,7 @@ unsigned desired_cursor; __dpmi_regs regs; int max_line, top_line, bot_line; + struct tty_display_info *tty = FRAME_TTY (f); /* Avoid the costly BIOS call if F isn't the currently selected frame. Allow for NULL as unconditionally meaning the selected @@ -751,8 +760,8 @@ if (f && f != SELECTED_FRAME()) return; - if (termscript) - fprintf (termscript, "\nCURSOR SHAPE=(%d,%d)", start_line, width); + if (tty->termscript) + fprintf (tty->termscript, "\nCURSOR SHAPE=(%d,%d)", start_line, width); /* The character cell size in scan lines is stored at 40:85 in the BIOS data area. */ @@ -862,7 +871,7 @@ } static void -IT_ring_bell (void) +IT_ring_bell (struct frame *f) { if (visible_bell) { @@ -890,6 +899,7 @@ 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; + struct tty_display_info *tty = FRAME_TTY (sf); if (!fp) { @@ -934,8 +944,8 @@ fg = bg; bg = tem2; } - if (termscript) - fprintf (termscript, "<FACE %d: %d/%d[FG:%d/BG:%d]>", face, + if (tty->termscript) + fprintf (tty->termscript, "<FACE %d: %d/%d[FG:%d/BG:%d]>", face, fp->foreground, fp->background, fg, bg); if (fg >= 0 && fg < 16) { @@ -950,9 +960,10 @@ } Lisp_Object Vdos_unsupported_char_glyph; - +extern unsigned char *encode_terminal_code (struct glyph *, int, + struct coding_system *); static void -IT_write_glyphs (struct glyph *str, int str_len) +IT_write_glyphs (struct frame *f, struct glyph *str, int str_len) { unsigned char *screen_buf, *screen_bp, *screen_buf_end, *bp; int unsupported_face = 0; @@ -961,15 +972,9 @@ register int sl = str_len; register int tlen = GLYPH_TABLE_LENGTH; register Lisp_Object *tbase = GLYPH_TABLE_BASE; - - /* If terminal_coding does any conversion, use it, otherwise use - safe_terminal_coding. We can't use CODING_REQUIRE_ENCODING here - because it always returns 1 if terminal_coding.src_multibyte is 1. */ - struct coding_system *coding = - (terminal_coding.common_flags & CODING_REQUIRE_ENCODING_MASK - ? &terminal_coding - : &safe_terminal_coding); + struct tty_display_info *tty = FRAME_TTY (f); struct frame *sf; + unsigned char *conversion_buffer; /* Do we need to consider conversion of unibyte characters to multibyte? */ @@ -977,18 +982,16 @@ = (NILP (current_buffer->enable_multibyte_characters) && unibyte_display_via_language_environment); - unsigned char conversion_buffer[256]; - int conversion_buffer_size = sizeof conversion_buffer; + /* If terminal_coding does any conversion, use it, otherwise use + safe_terminal_coding. We can't use CODING_REQUIRE_ENCODING here + because it always returns 1 if terminal_coding.src_multibyte is 1. */ + struct coding_system *coding = FRAME_TERMINAL_CODING (f); + + if (!(coding->common_flags & CODING_REQUIRE_ENCODING_MASK)) + coding = &safe_terminal_coding; if (str_len <= 0) return; - /* Set up the unsupported character glyph */ - if (!NILP (Vdos_unsupported_char_glyph)) - { - unsupported_char = GLYPH_CHAR (XINT (Vdos_unsupported_char_glyph)); - unsupported_face = GLYPH_FACE (XINT (Vdos_unsupported_char_glyph)); - } - screen_buf = screen_bp = alloca (str_len * 2); screen_buf_end = screen_buf + str_len * 2; sf = SELECTED_FRAME(); @@ -1002,12 +1005,10 @@ /* The mode bit CODING_MODE_LAST_BLOCK should be set to 1 only at the tail. */ - terminal_coding.mode &= ~CODING_MODE_LAST_BLOCK; - while (sl) + coding->mode &= ~CODING_MODE_LAST_BLOCK; + while (sl > 0) { - int cf, chlen, enclen; - unsigned char workbuf[MAX_MULTIBYTE_LENGTH], *buf; - unsigned ch; + int cf; /* Glyphs with GLYPH_MASK_PADDING bit set are actually there only for the redisplay code to know how many columns does @@ -1019,139 +1020,55 @@ } else { - GLYPH g; - int glyph_not_in_table = 0; - - SET_GLYPH_FROM_CHAR_GLYPH (g, *str); - - if (GLYPH_INVALID_P (g) || GLYPH_SIMPLE_P (tbase, tlen, g)) - { - /* This glyph doesn't have an entry in Vglyph_table. */ - ch = str->u.ch; - glyph_not_in_table = 1; - } - else - { - /* This glyph has an entry in Vglyph_table, so process - any aliases before testing for simpleness. */ - GLYPH_FOLLOW_ALIASES (tbase, tlen, g); - ch = GLYPH_CHAR (g); - } - - /* Convert the character code to multibyte, if they - requested display via language environment. We only want - to convert unibyte characters to multibyte in unibyte - buffers! Otherwise, the 8-bit value in CH came from the - display table set up to display foreign characters. */ - if (SINGLE_BYTE_CHAR_P (ch) && convert_unibyte_characters - && (ch >= 0240 - || (ch >= 0200 && !NILP (Vnonascii_translation_table)))) - ch = unibyte_char_to_multibyte (ch); - - /* Invalid characters are displayed with a special glyph. */ - if (! CHAR_VALID_P (ch, 0)) - { - ch = !NILP (Vdos_unsupported_char_glyph) - ? XINT (Vdos_unsupported_char_glyph) - : '\177'; - SET_GLYPH_CHAR (g, ch); - } - /* If the face of this glyph is different from the current screen face, update the screen attribute byte. */ cf = str->face_id; if (cf != screen_face) IT_set_face (cf); /* handles invalid faces gracefully */ - if (glyph_not_in_table || GLYPH_SIMPLE_P (tbase, tlen, g)) - { - /* We generate the multi-byte form of CH in WORKBUF. */ - chlen = CHAR_STRING (ch, workbuf); - buf = workbuf; - } - else - { - /* We have a string in Vglyph_table. */ - chlen = GLYPH_LENGTH (tbase, g); - buf = GLYPH_STRING (tbase, g); - } - - /* If the character is not multibyte, don't bother converting it. */ - if (chlen == 1) + if (sl <= 1) + /* This is the last glyph. */ + coding->mode |= CODING_MODE_LAST_BLOCK; + + conversion_buffer = encode_terminal_code (str, 1, coding); + if (coding->produced > 0) { - *conversion_buffer = (unsigned char)ch; - chlen = 0; - enclen = 1; - } - else - { - coding->src_multibyte = 1; - encode_coding (coding, buf, conversion_buffer, chlen, - conversion_buffer_size); - chlen -= coding->consumed; - enclen = coding->produced; - - /* Replace glyph codes that cannot be converted by - terminal_coding with Vdos_unsupported_char_glyph. */ - if (*conversion_buffer == '?') + if (2*coding->produced > screen_buf_end - screen_bp) { - unsigned char *cbp = conversion_buffer; - - while (cbp < conversion_buffer + enclen && *cbp == '?') - *cbp++ = unsupported_char; - if (unsupported_face != screen_face) - IT_set_face (unsupported_face); + /* The allocated buffer for screen writes is too small. + Flush it and loop again without incrementing STR, so + that the next loop will begin with the same glyph. */ + int nbytes = screen_bp - screen_buf; + + mouse_off_maybe (); + dosmemput (screen_buf, nbytes, (int)ScreenPrimary + offset); + if (screen_virtual_segment) + dosv_refresh_virtual_screen (offset, nbytes / 2); + new_pos_X += nbytes / 2; + offset += nbytes; + + /* Prepare to reuse the same buffer again. */ + screen_bp = screen_buf; + continue; + } + else + { + /* There's enough place in the allocated buffer to add + the encoding of this glyph. */ + + /* Copy the encoded bytes to the allocated buffer. */ + for (bp = conversion_buffer; coding->produced--; bp++) + { + *screen_bp++ = (unsigned char)*bp; + *screen_bp++ = ScreenAttrib; + if (tty->termscript) + fputc (*bp, tty->termscript); + } } } - - if (enclen + chlen > screen_buf_end - screen_bp) - { - /* The allocated buffer for screen writes is too small. - Flush it and loop again without incrementing STR, so - that the next loop will begin with the same glyph. */ - int nbytes = screen_bp - screen_buf; - - mouse_off_maybe (); - dosmemput (screen_buf, nbytes, (int)ScreenPrimary + offset); - if (screen_virtual_segment) - dosv_refresh_virtual_screen (offset, nbytes / 2); - new_pos_X += nbytes / 2; - offset += nbytes; - - /* Prepare to reuse the same buffer again. */ - screen_bp = screen_buf; - } - else - { - /* There's enough place in the allocated buffer to add - the encoding of this glyph. */ - - /* First, copy the encoded bytes. */ - for (bp = conversion_buffer; enclen--; bp++) - { - *screen_bp++ = (unsigned char)*bp; - *screen_bp++ = ScreenAttrib; - if (termscript) - fputc (*bp, termscript); - } - - /* Now copy the bytes not consumed by the encoding. */ - if (chlen > 0) - { - buf += coding->consumed; - while (chlen--) - { - if (termscript) - fputc (*buf, termscript); - *screen_bp++ = (unsigned char)*buf++; - *screen_bp++ = ScreenAttrib; - } - } - - /* Update STR and its remaining length. */ - str++; - sl--; - } + /* Update STR and its remaining length. */ + str++; + sl--; } } @@ -1161,32 +1078,6 @@ if (screen_virtual_segment) dosv_refresh_virtual_screen (offset, (screen_bp - screen_buf) / 2); new_pos_X += (screen_bp - screen_buf) / 2; - - /* We may have to output some codes to terminate the writing. */ - if (CODING_REQUIRE_FLUSHING (coding)) - { - coding->mode |= CODING_MODE_LAST_BLOCK; - encode_coding (coding, "", conversion_buffer, 0, conversion_buffer_size); - if (coding->produced > 0) - { - screen_buf = alloca (coding->produced * 2); - for (screen_bp = screen_buf, bp = conversion_buffer; - coding->produced--; bp++) - { - *screen_bp++ = (unsigned char)*bp; - *screen_bp++ = ScreenAttrib; - if (termscript) - fputc (*bp, termscript); - } - offset += screen_bp - screen_buf; - mouse_off_maybe (); - dosmemput (screen_buf, screen_bp - screen_buf, - (int)ScreenPrimary + offset); - if (screen_virtual_segment) - dosv_refresh_virtual_screen (offset, (screen_bp - screen_buf) / 2); - new_pos_X += (screen_bp - screen_buf) / 2; - } - } } /************************************************************************ @@ -1214,12 +1105,13 @@ /* Display the active region described by mouse_face_* in its mouse-face if HL > 0, in its normal face if HL = 0. */ static void -show_mouse_face (struct display_info *dpyinfo, int hl) +show_mouse_face (struct tty_display_info *dpyinfo, int hl) { struct window *w = XWINDOW (dpyinfo->mouse_face_window); struct frame *f = XFRAME (WINDOW_FRAME (w)); int i; struct face *fp; + struct tty_display_info *tty = FRAME_TTY (f); /* If window is in the process of being destroyed, don't bother @@ -1279,8 +1171,8 @@ int offset = ScreenPrimary + 2*(vpos*screen_size_X + kstart) + 1; int start_offset = offset; - if (termscript) - fprintf (termscript, "\n<MH+ %d-%d:%d>", + if (tty->termscript) + fprintf (tty->termscript, "\n<MH+ %d-%d:%d>", kstart, kstart + nglyphs - 1, vpos); mouse_off (); @@ -1319,12 +1211,12 @@ 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>", + if (tty->termscript) + fprintf (tty->termscript, "<MH- %d-%d:%d>", new_pos_X, new_pos_X + nglyphs - 1, new_pos_Y); - IT_write_glyphs (row->glyphs[TEXT_AREA] + start_hpos, nglyphs); - if (termscript) - fputs ("\n", termscript); + IT_write_glyphs (f, row->glyphs[TEXT_AREA] + start_hpos, nglyphs); + if (tty->termscript) + fputs ("\n", tty->termscript); new_pos_X = save_x; new_pos_Y = save_y; } @@ -1338,7 +1230,7 @@ /* Clear out the mouse-highlighted active region. Redraw it un-highlighted first. */ static void -clear_mouse_face (struct display_info *dpyinfo) +clear_mouse_face (struct tty_display_info *dpyinfo) { if (!dpyinfo->mouse_face_hidden && ! NILP (dpyinfo->mouse_face_window)) show_mouse_face (dpyinfo, 0); @@ -1431,7 +1323,7 @@ IT_note_mode_line_highlight (struct window *w, int x, int mode_line_p) { struct frame *f = XFRAME (w->frame); - struct display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f); + struct tty_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f); struct glyph_row *row; if (mode_line_p) @@ -1480,7 +1372,7 @@ static void IT_note_mouse_highlight (struct frame *f, int x, int y) { - struct display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f); + struct tty_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f); enum window_part part = ON_NOTHING; Lisp_Object window; struct window *w; @@ -1749,19 +1641,20 @@ } static void -IT_clear_end_of_line (int first_unused) +IT_clear_end_of_line (struct frame *f, int first_unused) { char *spaces, *sp; int i, j, offset = 2 * (new_pos_X + screen_size_X * new_pos_Y); extern int fatal_error_in_progress; + struct tty_display_info *tty = FRAME_TTY (f); if (new_pos_X >= first_unused || fatal_error_in_progress) return; IT_set_face (0); i = (j = first_unused - new_pos_X) * 2; - if (termscript) - fprintf (termscript, "<CLR:EOL[%d..%d)>", new_pos_X, first_unused); + if (tty->termscript) + fprintf (tty->termscript, "<CLR:EOL[%d..%d)>", new_pos_X, first_unused); spaces = sp = alloca (i); while (--j >= 0) @@ -1781,10 +1674,12 @@ } static void -IT_clear_screen (void) +IT_clear_screen (struct frame *f) { - if (termscript) - fprintf (termscript, "<CLR:SCR>"); + struct tty_display_info *tty = FRAME_TTY (f); + + if (tty->termscript) + fprintf (tty->termscript, "<CLR:SCR>"); /* We are sometimes called (from clear_garbaged_frames) when a new frame is being created, but its faces are not yet realized. In such a case we cannot call IT_set_face, since it will fail to find @@ -1803,23 +1698,27 @@ } static void -IT_clear_to_end (void) +IT_clear_to_end (struct frame *f) { - if (termscript) - fprintf (termscript, "<CLR:EOS>"); + struct tty_display_info *tty = FRAME_TTY (f); + + if (tty->termscript) + fprintf (tty->termscript, "<CLR:EOS>"); while (new_pos_Y < screen_size_Y) { new_pos_X = 0; - IT_clear_end_of_line (screen_size_X); + IT_clear_end_of_line (f, screen_size_X); new_pos_Y++; } } static void -IT_cursor_to (int y, int x) +IT_cursor_to (struct frame *f, int y, int x) { - if (termscript) - fprintf (termscript, "\n<XY=%dx%d>", x, y); + struct tty_display_info *tty = FRAME_TTY (f); + + if (tty->termscript) + fprintf (tty->termscript, "\n<XY=%dx%d>", x, y); new_pos_X = x; new_pos_Y = y; } @@ -1829,8 +1728,10 @@ static void IT_display_cursor (int on) { - if (termscript) - fprintf (termscript, "\nCURSOR %s", on ? "ON" : "OFF"); + struct tty_display_info *tty = CURTTY (); + + if (tty->termscript) + fprintf (tty->termscript, "\nCURSOR %s", on ? "ON" : "OFF"); if (on && cursor_cleared) { ScreenSetCursor (current_pos_Y, current_pos_X); @@ -1868,6 +1769,7 @@ /* Only set the cursor to where it should be if the display is already in sync with the window contents. */ int update_cursor_pos = 1; /* MODIFF == unchanged_modified; */ + struct tty_display_info *tty = FRAME_TTY (f); /* FIXME: This needs to be rewritten for the new redisplay, or removed. */ @@ -1917,8 +1819,8 @@ && (current_pos_X != new_pos_X || current_pos_Y != new_pos_Y)) { ScreenSetCursor (current_pos_Y = new_pos_Y, current_pos_X = new_pos_X); - if (termscript) - fprintf (termscript, "\n<CURSOR:%dx%d>", current_pos_X, current_pos_Y); + if (tty->termscript) + fprintf (tty->termscript, "\n<CURSOR:%dx%d>", current_pos_X, current_pos_Y); } /* Maybe cursor is invisible, so make it visible. */ @@ -1933,7 +1835,7 @@ static void IT_update_begin (struct frame *f) { - struct display_info *display_info = FRAME_X_DISPLAY_INFO (f); + struct tty_display_info *display_info = FRAME_X_DISPLAY_INFO (f); struct frame *mouse_face_frame = display_info->mouse_face_mouse_frame; BLOCK_INPUT; @@ -1998,7 +1900,7 @@ static void IT_frame_up_to_date (struct frame *f) { - struct display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f); + struct tty_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f); Lisp_Object new_cursor, frame_desired_cursor; struct window *sw; @@ -2081,7 +1983,8 @@ /* Insert and delete glyphs. */ static void -IT_insert_glyphs (start, len) +IT_insert_glyphs (f, start, len) + struct frame *f; register struct glyph *start; register int len; { @@ -2092,11 +1995,12 @@ IT_copy_glyphs (new_pos_X, new_pos_X + len, shift_by_width, new_pos_Y); /* Now write the glyphs to be inserted. */ - IT_write_glyphs (start, len); + IT_write_glyphs (f, start, len); } static void -IT_delete_glyphs (n) +IT_delete_glyphs (f, n) + struct frame *f; register int n; { abort (); @@ -2122,10 +2026,19 @@ resumed, and whenever the screen is redrawn! */ static void -IT_set_terminal_modes (void) +IT_set_terminal_modes (struct terminal *term) { - if (termscript) - fprintf (termscript, "\n<SET_TERM>"); + struct tty_display_info *tty; + + /* If called with initial terminal, it's too early to do anything + useful. */ + if (term->type == output_initial) + return; + + tty = term->display_info.tty; + + if (tty->termscript) + fprintf (tty->termscript, "\n<SET_TERM>"); screen_size_X = ScreenCols (); screen_size_Y = ScreenRows (); @@ -2178,10 +2091,6 @@ ScreenGetCursor (&startup_pos_Y, &startup_pos_X); ScreenRetrieve (startup_screen_buffer = xmalloc (screen_size * 2)); - if (termscript) - fprintf (termscript, "<SCREEN SAVED (dimensions=%dx%d)>\n", - screen_size_X, screen_size_Y); - bright_bg (); } @@ -2189,7 +2098,7 @@ suspended or killed. */ static void -IT_reset_terminal_modes (void) +IT_reset_terminal_modes (struct terminal *term) { int display_row_start = (int) ScreenPrimary; int saved_row_len = startup_screen_size_X * 2; @@ -2197,9 +2106,10 @@ int to_next_row = update_row_len; unsigned char *saved_row = startup_screen_buffer; int cursor_pos_X = ScreenCols () - 1, cursor_pos_Y = ScreenRows () - 1; - - if (termscript) - fprintf (termscript, "\n<RESET_TERM>"); + struct tty_display_info *tty = term->display_info.tty; + + if (tty->termscript) + fprintf (tty->termscript, "\n<RESET_TERM>"); if (!term_setup_done) return; @@ -2238,8 +2148,8 @@ if (current_rows > startup_screen_size_Y) current_rows = startup_screen_size_Y; - if (termscript) - fprintf (termscript, "<SCREEN RESTORED (dimensions=%dx%d)>\n", + if (tty->termscript) + fprintf (tty->termscript, "<SCREEN RESTORED (dimensions=%dx%d)>\n", update_row_len / 2, current_rows); while (current_rows--) @@ -2259,12 +2169,13 @@ ScreenSetCursor (cursor_pos_Y, cursor_pos_X); xfree (startup_screen_buffer); + startup_screen_buffer = NULL; term_setup_done = 0; } static void -IT_set_terminal_window (int foo) +IT_set_terminal_window (struct frame *f, int foo) { } @@ -2315,6 +2226,7 @@ unsigned long orig_fg, orig_bg; Lisp_Object frame_bg, frame_fg; extern Lisp_Object Qdefault, QCforeground, QCbackground; + struct tty_display_info *tty = FRAME_TTY (f); /* If we are creating a new frame, begin with the original screen colors used for the initial frame. */ @@ -2363,8 +2275,8 @@ } need_to_reverse = reverse && !was_reverse; - if (termscript && need_to_reverse) - fprintf (termscript, "<INVERSE-VIDEO>\n"); + if (tty->termscript && need_to_reverse) + fprintf (tty->termscript, "<INVERSE-VIDEO>\n"); /* Now process the alist elements in reverse of specified order. */ for (i--; i >= 0; i--) @@ -2401,8 +2313,8 @@ fg_set = 1; } redraw = 1; - if (termscript) - fprintf (termscript, "<FGCOLOR %lu>\n", new_color); + if (tty->termscript) + fprintf (tty->termscript, "<FGCOLOR %lu>\n", new_color); } } else if (EQ (prop, Qbackground_color)) @@ -2432,26 +2344,33 @@ bg_set = 1; } redraw = 1; - if (termscript) - fprintf (termscript, "<BGCOLOR %lu>\n", new_color); + if (tty->termscript) + fprintf (tty->termscript, "<BGCOLOR %lu>\n", new_color); } } else if (EQ (prop, Qtitle)) { x_set_title (f, val); - if (termscript) - fprintf (termscript, "<TITLE: %s>\n", SDATA (val)); + if (tty->termscript) + fprintf (tty->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", + if (tty->termscript) + fprintf (tty->termscript, "<CTYPE: %s>\n", EQ (val, Qbar) || EQ (val, Qhbar) || CONSP (val) && (EQ (XCAR (val), Qbar) || EQ (XCAR (val), Qhbar)) ? "bar" : "box"); } + else if (EQ (prop, Qtty_type)) + { + internal_terminal_init (); + if (tty->termscript) + fprintf (tty->termscript, "<TERM_INIT done, TTY_TYPE: %.*s>\n", + SBYTES (val), SDATA (val)); + } store_frame_param (f, prop, val); } @@ -2499,18 +2418,20 @@ { char *term = getenv ("TERM"), *colors; struct frame *sf = SELECTED_FRAME(); + struct tty_display_info *tty; #ifdef HAVE_X_WINDOWS if (!inhibit_window_system) return; #endif + /* If this is the initial terminal, we are done here. */ + if (sf->output_method == output_initial) + return; + internal_terminal = (!noninteractive) && term && !strcmp (term, "internal"); - if (getenv ("EMACSTEST")) - termscript = fopen (getenv ("EMACSTEST"), "wt"); - #ifndef HAVE_X_WINDOWS if (!internal_terminal || inhibit_window_system) { @@ -2518,9 +2439,24 @@ return; } - Vwindow_system = intern ("pc"); - Vwindow_system_version = make_number (1); + tty = FRAME_TTY (sf); + if (!tty->termscript && getenv ("EMACSTEST")) + tty->termscript = fopen (getenv ("EMACSTEST"), "wt"); + if (tty->termscript) + { + time_t now = time (NULL); + struct tm *tnow = localtime (&now); + char tbuf[100]; + + strftime (tbuf, sizeof (tbuf) - 1, "%a %b %e %Y %H:%M:%S %Z", tnow); + fprintf (tty->termscript, "\nEmacs session started at %s\n", tbuf); + fprintf (tty->termscript, "=====================\n\n"); + } + + Vinitial_window_system = current_kboard->Vwindow_system = Qpc; + Vwindow_system_version = make_number (23); /* RE Emacs version */ sf->output_method = output_msdos_raw; + tty->terminal->type = output_msdos_raw; /* If Emacs was dumped on DOS/V machine, forget the stale VRAM address. */ screen_old_address = 0; @@ -2528,7 +2464,6 @@ /* Forget the stale screen colors as well. */ initial_screen_colors[0] = initial_screen_colors[1] = -1; - bzero (&the_only_x_display, sizeof the_only_x_display); FRAME_BACKGROUND_PIXEL (SELECTED_FRAME ()) = 7; /* White */ FRAME_FOREGROUND_PIXEL (SELECTED_FRAME ()) = 0; /* Black */ bright_bg (); @@ -2549,42 +2484,65 @@ if (colors[1] >= 0 && colors[1] < 16) FRAME_BACKGROUND_PIXEL (SELECTED_FRAME ()) = colors[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; - the_only_x_display.display_info.mouse_face_beg_row = - the_only_x_display.display_info.mouse_face_beg_col = -1; - the_only_x_display.display_info.mouse_face_end_row = - the_only_x_display.display_info.mouse_face_end_col = -1; - the_only_x_display.display_info.mouse_face_face_id = DEFAULT_FACE_ID; - the_only_x_display.display_info.mouse_face_window = Qnil; - the_only_x_display.display_info.mouse_face_mouse_x = - the_only_x_display.display_info.mouse_face_mouse_y = 0; - the_only_x_display.display_info.mouse_face_defer = 0; - the_only_x_display.display_info.mouse_face_hidden = 0; + the_only_display_info.mouse_face_mouse_frame = NULL; + the_only_display_info.mouse_face_deferred_gc = 0; + the_only_display_info.mouse_face_beg_row = + the_only_display_info.mouse_face_beg_col = -1; + the_only_display_info.mouse_face_end_row = + the_only_display_info.mouse_face_end_col = -1; + the_only_display_info.mouse_face_face_id = DEFAULT_FACE_ID; + the_only_display_info.mouse_face_window = Qnil; + the_only_display_info.mouse_face_mouse_x = + the_only_display_info.mouse_face_mouse_y = 0; + the_only_display_info.mouse_face_defer = 0; + the_only_display_info.mouse_face_hidden = 0; + + if (have_mouse) /* detected in dos_ttraw, which see */ + { + have_mouse = 1; /* enable mouse */ + mouse_visible = 0; + mouse_setup_buttons (mouse_button_count); + tty->terminal->mouse_position_hook = &mouse_get_pos; + mouse_init (); + } + + if (tty->termscript && screen_size) + fprintf (tty->termscript, "<SCREEN SAVED (dimensions=%dx%d)>\n", + screen_size_X, screen_size_Y); init_frame_faces (sf); - - ring_bell_hook = IT_ring_bell; - insert_glyphs_hook = IT_insert_glyphs; - delete_glyphs_hook = IT_delete_glyphs; - write_glyphs_hook = IT_write_glyphs; - cursor_to_hook = raw_cursor_to_hook = IT_cursor_to; - clear_to_end_hook = IT_clear_to_end; - clear_end_of_line_hook = IT_clear_end_of_line; - clear_frame_hook = IT_clear_screen; - update_begin_hook = IT_update_begin; - update_end_hook = IT_update_end; - frame_up_to_date_hook = IT_frame_up_to_date; - - /* These hooks are called by term.c without being checked. */ - set_terminal_modes_hook = IT_set_terminal_modes; - reset_terminal_modes_hook = IT_reset_terminal_modes; - set_terminal_window_hook = IT_set_terminal_window; - TTY_CHAR_INS_DEL_OK (CURTTY ()) = 0; #endif } +void +initialize_msdos_display (struct terminal *term) +{ + term->rif = 0; /* we don't support window-based display */ + term->cursor_to_hook = term->raw_cursor_to_hook = IT_cursor_to; + term->clear_to_end_hook = IT_clear_to_end; + term->clear_frame_hook = IT_clear_screen; + term->clear_end_of_line_hook = IT_clear_end_of_line; + term->ins_del_lines_hook = 0; + term->insert_glyphs_hook = IT_insert_glyphs; + term->write_glyphs_hook = IT_write_glyphs; + term->delete_glyphs_hook = IT_delete_glyphs; + term->ring_bell_hook = IT_ring_bell; + term->reset_terminal_modes_hook = IT_reset_terminal_modes; + term->set_terminal_modes_hook = IT_set_terminal_modes; + term->set_terminal_window_hook = IT_set_terminal_window; + term->update_begin_hook = IT_update_begin; + term->update_end_hook = IT_update_end; + term->frame_up_to_date_hook = IT_frame_up_to_date; + term->mouse_position_hook = 0; /* set later by dos_ttraw */ + term->frame_rehighlight_hook = 0; + term->frame_raise_lower_hook = 0; + term->set_vertical_scroll_bar_hook = 0; + term->condemn_scroll_bars_hook = 0; + term->redeem_scroll_bar_hook = 0; + term->judge_scroll_bars_hook = 0; + term->read_socket_hook = &tty_read_avail_input; /* from keyboard.c */ +} + dos_get_saved_screen (screen, rows, cols) char **screen; int *rows; @@ -3130,7 +3088,7 @@ { struct input_event event; union REGS regs; - struct display_info *dpyinfo = FRAME_X_DISPLAY_INFO (SELECTED_FRAME()); + struct tty_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (SELECTED_FRAME()); EVENT_INIT (event); #ifndef HAVE_X_WINDOWS @@ -3616,7 +3574,7 @@ { int max_width = width + 2; - IT_cursor_to (y + i, x); + IT_cursor_to (sf, y + i, x); enabled = (!menu->submenu[i] && menu->panenumber[i]) || (menu->submenu[i]); mousehere = (y + i == my && x <= mx && mx < x + width + 2); @@ -3659,10 +3617,10 @@ SET_CHAR_GLYPH (*p, menu->submenu[i] ? 16 : ' ', face, 0); p++; - IT_write_glyphs (text, max_width); + IT_write_glyphs (sf, text, max_width); } IT_update_end (sf); - IT_cursor_to (row, col); + IT_cursor_to (sf, row, col); xfree (text); } @@ -4600,11 +4558,18 @@ control chars by DOS. Determine the keyboard type. */ int -dos_ttraw () +dos_ttraw (struct tty_display_info *tty) { union REGS inregs, outregs; static int first_time = 1; + fprintf (prdebug, "dos_ttraw: output = %d\n", tty->terminal->type); fflush (prdebug); + + /* If we are called for the initial terminal, it's too early to do + anything, and termscript isn't set up. */ + if (tty->terminal->type == output_initial) + return; + break_stat = getcbrk (); setcbrk (0); #if __DJGPP__ < 2 @@ -4619,7 +4584,7 @@ have_mouse = 0; - if (internal_terminal + if (1 #ifdef HAVE_X_WINDOWS && inhibit_window_system #endif @@ -4637,15 +4602,8 @@ int86 (0x33, &inregs, &outregs); have_mouse = (outregs.x.ax & 0xffff) == 0xffff; } - if (have_mouse) - { - have_mouse = 1; /* enable mouse */ - mouse_visible = 0; - mouse_setup_buttons (outregs.x.bx); - mouse_position_hook = &mouse_get_pos; - mouse_init (); - } + mouse_button_count = outregs.x.bx; #ifndef HAVE_X_WINDOWS #if __DJGPP__ >= 2 @@ -4851,7 +4809,7 @@ emacs_close (outbak); emacs_close (errbak); - dos_ttraw (); + dos_ttraw (CURTTY ()); if (have_mouse > 0) { mouse_init (); @@ -4959,10 +4917,8 @@ sigblock (mask) int mask; { return 0; } #endif -void request_sigio (void) {} setpgrp () {return 0; } setpriority (x,y,z) int x,y,z; { return 0; } -void unrequest_sigio (void) {} #if __DJGPP__ > 1 #if __DJGPP_MINOR__ < 2