struct frame *last_nonminibuf_frame;
-/* Structure for info on cursor positioning. */
-
-struct cm Wcm;
-
/* 1 means SIGWINCH happened when not safe. */
int delayed_size_change;
update_begin (f);
if (FRAME_MSDOS_P (f))
- set_terminal_modes (0);
+ set_terminal_modes ();
clear_frame ();
clear_current_matrices (f);
update_end (f);
- fflush (stdout);
+ fflush (TTY_OUTPUT (FRAME_TTY (f)));
windows_or_buffers_changed++;
/* Mark all windows as inaccurate, so that every window will have
its redisplay done. */
/* If we can't insert glyphs, we can use this method only
at the end of a line. */
- if (!TTY_CHAR_INS_DEL_OK (CURTTY ()))
+ if (!TTY_CHAR_INS_DEL_OK (FRAME_TTY (f)))
if (PT != ZV && FETCH_BYTE (PT_BYTE) != '\n')
return 0;
rif->update_window_end_hook (w, 1, 0);
update_end (f);
updated_row = NULL;
- fflush (stdout);
+ fflush (TTY_OUTPUT (CURTTY ()));
TRACE ((stderr, "direct output for insert\n"));
mark_window_display_accurate (it.window, 1);
cursor_to (y, x);
}
- fflush (stdout);
+ fflush (TTY_OUTPUT (CURTTY ()));
redisplay_performed_directly_p = 1;
return 1;
}
Also flush out if likely to have more than 1k buffered
otherwise. I'm told that some telnet connections get
really screwed by more than 1k output at once. */
- int outq = PENDING_OUTPUT_COUNT (stdout);
+ int outq = PENDING_OUTPUT_COUNT (TTY_OUTPUT (FRAME_TTY (f)));
if (outq > 900
|| (outq > 20 && ((i - 1) % preempt_count == 0)))
{
- fflush (stdout);
+ fflush (TTY_OUTPUT (FRAME_TTY (f)));
if (preempt_count == 1)
{
#ifdef EMACS_OUTQSIZE
if (EMACS_OUTQSIZE (0, &outq) < 0)
/* Probably not a tty. Ignore the error and reset
the outq count. */
- outq = PENDING_OUTPUT_COUNT (stdout);
+ outq = PENDING_OUTPUT_COUNT (TTY_OUTPUT (FRAME_TTY (f)));
#endif
outq *= 10;
if (baud_rate <= outq && baud_rate > 0)
struct it it;
struct buffer *old_current_buffer = current_buffer;
struct text_pos startp;
- struct glyph_row *row;
- struct image *img;
int x0, x1;
current_buffer = XBUFFER (w->buffer);
move_it_to (&it, -1, x0 + it.first_visible_x, *y, -1,
MOVE_TO_X | MOVE_TO_Y);
- /* Add extra (default width) columns if clicked after EOL. */
- x1 = max(0, it.current_x + it.pixel_width - it.first_visible_x);
- if (x0 > x1)
- it.hpos += (x0 - x1) / WINDOW_FRAME_COLUMN_WIDTH (w);
-
current_buffer = old_current_buffer;
*dx = x0 + it.first_visible_x - it.current_x;
*dy = *y - it.current_y;
+ *object = w->buffer;
+
#ifdef HAVE_WINDOW_SYSTEM
- if (it.what == IT_IMAGE
- && (img = IMAGE_FROM_ID (it.f, it.image_id)) != NULL
- && !NILP (img->spec))
- *object = img->spec;
+ if (it.what == IT_IMAGE)
+ {
+ struct image *img;
+ if ((img = IMAGE_FROM_ID (it.f, it.image_id)) != NULL
+ && !NILP (img->spec))
+ {
+ struct glyph_row *row = MATRIX_ROW (w->current_matrix, it.vpos);
+ struct glyph *glyph;
+
+ if (it.hpos < row->used[TEXT_AREA]
+ && (glyph = row->glyphs[TEXT_AREA] + it.hpos,
+ glyph->type == IMAGE_GLYPH))
+ {
+ *dy -= row->ascent - glyph->ascent;
+ *object = img->spec;
+ }
+ }
+ }
else
#endif
- *object = STRINGP (it.string) ? it.string : w->buffer;
+ if (STRINGP (it.string))
+ *object = it.string;
+
*pos = it.current;
+
+ /* Add extra (default width) columns if clicked after EOL. */
+ x1 = max(0, it.current_x + it.pixel_width - it.first_visible_x);
+ if (x0 > x1)
+ it.hpos += (x0 - x1) / WINDOW_FRAME_COLUMN_WIDTH (w);
+
*x = it.hpos;
*y = it.vpos;
}
{
string = glyph->object;
*charpos = glyph->charpos;
+#ifdef HAVE_WINDOW_SYSTEM
+ if (glyph->type == IMAGE_GLYPH)
+ {
+ struct image *img;
+ img = IMAGE_FROM_ID (WINDOW_XFRAME (w), glyph->u.img_id);
+ if (img != NULL)
+ string = img->spec;
+ y0 -= row->ascent - glyph->ascent;
+ }
+#endif
}
else
/* Add extra (default width) columns if clicked after EOL. */
#endif
int old_errno = errno;
- get_frame_size (&width, &height);
-
- /* The frame size change obviously applies to a termcap-controlled
- frame. Find such a frame in the list, and assume it's the only
- one (since the redisplay code always writes to stdout, not a
- FILE * specified in the frame structure). Record the new size,
- but don't reallocate the data structures now. Let that be done
- later outside of the signal handler. */
-
- {
- Lisp_Object tail, frame;
+ struct tty_output *tty;
+
+ /* The frame size change obviously applies to a single
+ termcap-controlled terminal, but we can't decide which.
+ Therefore, we resize the frames corresponding to each tty.
+ */
+ for (tty = tty_list; tty; tty = tty->next) {
- FOR_EACH_FRAME (tail, frame)
- {
- if (FRAME_TERMCAP_P (XFRAME (frame)))
- {
- change_frame_size (XFRAME (frame), height, width, 0, 1, 0);
- break;
- }
- }
+ if (! tty->term_initted)
+ continue;
+
+ get_tty_size (tty, &width, &height);
+
+ {
+ Lisp_Object tail, frame;
+
+ FOR_EACH_FRAME (tail, frame)
+ {
+ if (FRAME_TERMCAP_P (XFRAME (frame)) && FRAME_TTY (XFRAME (frame)) == tty)
+ {
+ /* Record the new sizes, but don't reallocate the data structures
+ now. Let that be done later outside of the signal handler. */
+ change_frame_size (XFRAME (frame), height, width, 0, 1, 0);
+ break;
+ }
+ }
+ }
}
-
+
signal (SIGWINCH, window_change_signal);
errno = old_errno;
}
{
Lisp_Object tail, frame;
- if (! FRAME_WINDOW_P (f))
+ if (FRAME_MSDOS_P (f))
{
- /* When using termcap, or on MS-DOS, all frames use
- the same screen, so a change in size affects all frames. */
+ /* On MS-DOS, all frames use the same screen, so a change in
+ size affects all frames. Termcap now supports multiple
+ ttys. */
FOR_EACH_FRAME (tail, frame)
if (! FRAME_WINDOW_P (XFRAME (frame)))
change_frame_size_1 (XFRAME (frame), newheight, newwidth,
newheight - FRAME_TOP_MARGIN (f), 0);
if (FRAME_TERMCAP_P (f) && !pretend)
- FrameRows = newheight;
+ FrameRows (FRAME_TTY (f)) = newheight;
}
if (new_frame_total_cols != FRAME_TOTAL_COLS (f))
set_window_width (FRAME_MINIBUF_WINDOW (f), new_frame_total_cols, 0);
if (FRAME_TERMCAP_P (f) && !pretend)
- FrameCols = newwidth;
+ FrameCols (FRAME_TTY (f)) = newwidth;
if (WINDOWP (f->tool_bar_window))
XSETFASTINT (XWINDOW (f->tool_bar_window)->total_cols, newwidth);
putchar (07);
else
ring_bell ();
- fflush (stdout);
+ fflush (TTY_OUTPUT (CURTTY ()));
}
else
bitch_at_user ();
error ("Keyboard macro terminated by a command ringing the bell");
else
ring_bell ();
- fflush (stdout);
+ fflush (TTY_OUTPUT (CURTTY ()));
}
SET_CHAR_GLYPH_FROM_GLYPH (space_glyph, ' ');
space_glyph.charpos = -1;
- meta_key = 0;
inverse_video = 0;
cursor_in_echo_area = 0;
terminal_type = (char *) 0;
}
#endif /* VMS */
- term_init (0, terminal_type);
-
+ {
+ struct tty_output *tty;
+
+ tty = term_init (selected_frame, 0, terminal_type);
+ change_frame_size (XFRAME (selected_frame), FrameRows (tty), FrameCols (tty), 0, 0, 0);
+ }
+
{
struct frame *sf = SELECTED_FRAME ();
int width = FRAME_TOTAL_COLS (sf);