Mercurial > emacs
changeset 708:030fb4635335
*** empty log message ***
author | Jim Blandy <jimb@redhat.com> |
---|---|
date | Wed, 10 Jun 1992 03:53:16 +0000 |
parents | e4253da532fb |
children | 829ba8707e86 |
files | src/=xselect.c.old src/dispnew.c src/frame.c src/keyboard.c src/search.c src/termhooks.h src/window.c src/xfns.c src/xterm.c |
diffstat | 9 files changed, 280 insertions(+), 91 deletions(-) [+] |
line wrap: on
line diff
--- a/src/=xselect.c.old Wed Jun 10 02:47:07 1992 +0000 +++ b/src/=xselect.c.old Wed Jun 10 03:53:16 1992 +0000 @@ -29,11 +29,8 @@ #define MAX_SELECTION(dpy) (((dpy)->max_request_size << 2) - 100) #define SELECTION_LENGTH(len,format) ((len) * ((format) >> 2)) -/* The last 23 bits of the timestamp of the last mouse button event. */ -extern Time mouse_timestamp; - -/* An expedient hack! Fix this! */ -#define last_event_timestamp CurrentTime +/* The timestamp of the last input event we received from the X server. */ +unsigned long last_event_timestamp; /* t if a mouse button is depressed. */ extern Lisp_Object Vmouse_grabbed; @@ -56,8 +53,10 @@ /* The value of the current SECONDARY selection. */ Lisp_Object Vx_secondary_selection_value; -/* Types of selections we may make. */ -Lisp_Object Qprimary, Qsecondary, Qclipboard; +/* Types of selections we may make. Note that Qcut_buffer0 isn't really + a selection, but it acts like one for the sake of Fx_own_selection and + Fx_selection_value. */ +Lisp_Object Qprimary, Qsecondary, Qclipboard, Qcut_buffer0; /* Emacs' selection property identifiers. */ Atom Xatom_emacs_selection; @@ -146,13 +145,18 @@ DEFUN ("x-own-selection", Fx_own_selection, Sx_own_selection, 1, 2, "", "Make STRING the selection value. Default is the primary selection,\n\ -but optional second argument TYPE may specify secondary or clipboard.") +but optional second argument TYPE may specify secondary or clipboard.\n\ +\n\ +TYPE may also be cut-buffer0, indicating that Emacs should set the X\n\ +cut buffer 0 to STRING. This is for compatibility with older X\n\ +applications which still use the cut buffers; new applications should\n\ +use X selections.") (string, type) register Lisp_Object string, type; { Atom selection_type; Lisp_Object val; - Time event_time = mouse_timestamp; + Time event_time = last_event_timestamp; CHECK_STRING (string, 0); if (NILP (type) || EQ (type, Qprimary)) @@ -163,7 +167,7 @@ x_begin_selection_own = event_time; val = Vx_selection_value = string; } - UNBLOCK_INPUT; + UNBLOCK_INPUT; } else if (EQ (type, Qsecondary)) { @@ -180,10 +184,18 @@ BLOCK_INPUT; if (own_selection (Xatom_clipboard, event_time)) { - x_begin_clipboard_own = event_time; + x_begin_clipboard_own = event_time; val = Vx_clipboard_value = string; } - UNBLOCK_INPUT; + UNBLOCK_INPUT; + } + else if (EQ (type, Qcut_buffer0)) + { + BLOCK_INPUT; + XStoreBytes (x_current_display, + XSTRING (string)->data, + XSTRING (string)->size); + UNBLOCK_INPUT; } else error ("Invalid X selection type"); @@ -230,7 +242,7 @@ int x_converting_selection; /* Reply to some client's request for our selection data. Data is - placed in a propery supplied by the requesting window. + placed in a property supplied by the requesting window. If the data exceeds the maximum amount the server can send, then prepare to send it incrementally, and reply to the client with @@ -518,7 +530,7 @@ Window requestor_window; BLOCK_INPUT; - requestor_time = mouse_timestamp; + requestor_time = last_event_timestamp; requestor_window = selected_screen->display.x->window_desc; XConvertSelection (x_current_display, type, XA_STRING, Xatom_emacs_selection, requestor_window, requestor_time); @@ -566,6 +578,22 @@ return get_selection_value (Xatom_clipboard); } + else if (EQ (type, Qcut_buffer0)) + { + char *data; + int size; + Lisp_Object string; + + BLOCK_INPUT; + data = XFetchBytes (x_current_display, &size); + if (data == 0) + string = Qnil; + else + string = make_string (data, size); + UNBLOCK_INPUT; + + return string; + } else error ("Invalid X selection type"); } @@ -704,6 +732,8 @@ staticpro (&Qsecondary); Qclipboard = intern ("clipboard"); staticpro (&Qclipboard); + Qcut_buffer0 = intern ("cut-buffer0"); + staticpro (&Qcut_buffer0); defsubr (&Sx_own_selection); defsubr (&Sx_selection_value);
--- a/src/dispnew.c Wed Jun 10 02:47:07 1992 +0000 +++ b/src/dispnew.c Wed Jun 10 03:53:16 1992 +0000 @@ -96,8 +96,9 @@ Lisp_Object Vstandard_display_table; /* Nonzero means reading single-character input with prompt - so put cursor on minibuffer after the prompt. */ - + so put cursor on minibuffer after the prompt. + positive means at end of text in echo area; + negative means at beginning of line. */ int cursor_in_echo_area; /* The currently selected screen. @@ -1056,16 +1057,19 @@ /* Now just clean up termcap drivers and set cursor, etc. */ if (!pause) { - - if (s == selected_screen && cursor_in_echo_area < 0) - cursor_to (SCREEN_HEIGHT (s) - 1, 0); - else if (s == selected_screen && cursor_in_echo_area - && !desired_screen->used[SCREEN_HEIGHT (s) - 1]) - cursor_to (SCREEN_HEIGHT (s), 0); - else if (cursor_in_echo_area) - cursor_to (SCREEN_HEIGHT (s) - 1, - min (SCREEN_WIDTH (s) - 1, - desired_screen->used[SCREEN_HEIGHT (s) - 1])); + if (cursor_in_echo_area) + { + if (s == selected_screen + && cursor_in_echo_area < 0) + cursor_to (SCREEN_HEIGHT (s) - 1, 0); + else if (s == selected_screen + && ! current_screen->enable[SCREEN_HEIGHT (s) - 1]) + cursor_to (SCREEN_HEIGHT (s) - 1, 0); + else + cursor_to (SCREEN_HEIGHT (s) - 1, + min (SCREEN_WIDTH (s) - 1, + current_screen->used[SCREEN_HEIGHT (s) - 1])); + } else cursor_to (SCREEN_CURSOR_Y (s), max (min (SCREEN_CURSOR_X (s), SCREEN_WIDTH (s) - 1), 0)); @@ -1906,9 +1910,10 @@ Lisp_Object arg, millisec, nodisp; { int usec = 0; - int sec = 0; + int sec; CHECK_NUMBER (arg, 0); + sec = XINT (arg); if (!NILP (millisec)) {
--- a/src/frame.c Wed Jun 10 02:47:07 1992 +0000 +++ b/src/frame.c Wed Jun 10 03:53:16 1992 +0000 @@ -1,11 +1,11 @@ /* Generic screen functions. - Copyright (C) 1989 Free Software Foundation. + Copyright (C) 1989, 1992 Free Software Foundation. This file is part of GNU Emacs. GNU Emacs is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 1, or (at your option) +the Free Software Foundation; either version 2, or (at your option) any later version. GNU Emacs is distributed in the hope that it will be useful, @@ -194,7 +194,9 @@ if (NILP (mini_window)) { if (XTYPE (Vdefault_minibuffer_screen) != Lisp_Screen) - error ("default-minibuffer-screen must be set when creating minibufferless screens."); + error ("default-minibuffer-screen must be set when creating minibufferless screens"); + if (! SCREEN_LIVE_P (XSCREEN (Vdefault_minibuffer_screen))) + error ("default-minibuffer-screen must be a live screen"); mini_window = XSCREEN (Vdefault_minibuffer_screen)->minibuffer_window; } else @@ -492,16 +494,22 @@ minibuffer for any other screen? */ if (SCREEN_HAS_MINIBUF (XSCREEN (screen))) { - Lisp_Object screen2; + Lisp_Object screens; + + for (screens = Vscreen_list; + CONSP (screens); + screens = XCONS (screens)->cdr) + { + Lisp_Object this = XCONS (screens)->car; - for (screen2 = Vscreen_list; CONSP (2); screen2 = XCONS (screen2)->cdr) - if (! EQ (screen2, screen) - && EQ (screen, - (WINDOW_SCREEN - (XWINDOW - (SCREEN_MINIBUF_WINDOW - (XSCREEN (screen2))))))) - error ("Attempt to delete a surrogate minibuffer screen"); + if (! EQ (this, screen) + && EQ (screen, + (WINDOW_SCREEN + (XWINDOW + (SCREEN_MINIBUF_WINDOW + (XSCREEN (this))))))) + error ("Attempt to delete a surrogate minibuffer screen"); + } } /* Don't let the screen remain selected. */ @@ -530,11 +538,15 @@ another one. */ if (s == last_nonminibuf_screen) { + Lisp_Object screens; + last_nonminibuf_screen = 0; - for (screen = Vscreen_list; CONSP (screen); screen = XCONS (screen)->cdr) + for (screens = Vscreen_list; + CONSP (screens); + screen = XCONS (screens)->cdr) { - s = XSCREEN (XCONS (screen)->car); + s = XSCREEN (XCONS (screens)->car); if (!SCREEN_MINIBUF_ONLY_P (s)) { last_nonminibuf_screen = s; @@ -543,6 +555,46 @@ } } + /* If we've deleted Vdefault_minibuffer_screen, try to find another + one. Prefer minibuffer-only screens, but also notice screens + with other windows. */ + if (EQ (screen, Vdefault_minibuffer_screen)) + { + Lisp_Object screens; + + /* The last screen we saw with a minibuffer, minibuffer-only or not. */ + Lisp_Object screen_with_minibuf = Qnil; + + for (screens = Vscreen_list; + CONSP (screens); + screens = XCONS (screens)->cdr) + { + Lisp_Object this = XCONS (screens)->car; + + if (XTYPE (this) != Lisp_Screen) + abort (); + s = XSCREEN (this); + + if (SCREEN_HAS_MINIBUF (s)) + { + screen_with_minibuf = this; + if (SCREEN_MINIBUF_ONLY_P (s)) + break; + } + } + + /* We know that there must be some screen with a minibuffer out + there. If this were not true, all of the screens present + would have to be minibufferless, which implies that at some + point their minibuffer screens must have been deleted, but + that is prohibited at the top; you can't delete surrogate + minibuffer screens. */ + if (NILP (screen_with_minibuf)) + abort (); + + Vdefault_minibuffer_screen = screen_with_minibuf; + } + return Qnil; }
--- a/src/keyboard.c Wed Jun 10 02:47:07 1992 +0000 +++ b/src/keyboard.c Wed Jun 10 03:53:16 1992 +0000 @@ -210,7 +210,8 @@ new screen. */ Lisp_Object Vlast_event_screen; -/* X Windows wants this for selection ownership. */ +/* The timestamp of the last input event we received from the X server. + X Windows wants this for selection ownership. */ unsigned long last_event_timestamp; Lisp_Object Qself_insert_command; @@ -1610,7 +1611,7 @@ if (kbd_fetch_ptr == kbd_buffer + KBD_BUFFER_SIZE) kbd_fetch_ptr = kbd_buffer; XSET (Vlast_event_screen, Lisp_Screen, kbd_fetch_ptr->screen); - last_event_timestamp = XINT (kbd_fetch_ptr->timestamp); + last_event_timestamp = kbd_fetch_ptr->timestamp; obj = make_lispy_event (kbd_fetch_ptr); kbd_fetch_ptr->kind = no_event; kbd_fetch_ptr++; @@ -1791,7 +1792,8 @@ Fcons (window, Fcons (posn, Fcons (Fcons (event->x, event->y), - Fcons (event->timestamp, + Fcons (make_number + (event->timestamp), Qnil))))); } @@ -1810,7 +1812,8 @@ Fcons (SCREEN_SELECTED_WINDOW (event->screen), Fcons (button, Fcons (Fcons (event->x, event->y), - Fcons (event->timestamp, + Fcons (make_number + (event->timestamp), Qnil))))); } @@ -1872,8 +1875,8 @@ { char *p = buf; + if (modifiers & ctrl_modifier) { *p++ = 'C'; *p++ = '-'; } if (modifiers & meta_modifier) { *p++ = 'M'; *p++ = '-'; } - if (modifiers & ctrl_modifier) { *p++ = 'C'; *p++ = '-'; } if (modifiers & shift_modifier) { *p++ = 'S'; *p++ = '-'; } if (modifiers & up_modifier) { *p++ = 'U'; *p++ = '-'; } *p = '\0'; @@ -2982,17 +2985,31 @@ Vobarray, Qcommandp, Qt, Qnil, Qnil); - /* Add the text read to this_command_keys. */ + /* Set this_command_keys to the concatenation of saved_keys and + function, followed by a RET. */ { - struct Lisp_String *func_str = XSTRING (function); + struct Lisp_String *str; int i; Lisp_Object tem; - for (i = 0; i < func_str->size; i++) + this_command_key_count = 0; + + str = XSTRING (saved_keys); + for (i = 0; i < str->size; i++) { - XSET (tem, Lisp_Int, func_str->data[i]); + XFASTINT (tem) = str->data[i]; add_command_key (tem); } + + str = XSTRING (function); + for (i = 0; i < str->size; i++) + { + XFASTINT (tem) = str->data[i]; + add_command_key (tem); + } + + XFASTINT (tem) = '\015'; + add_command_key (tem); } UNGCPRO;
--- a/src/search.c Wed Jun 10 02:47:07 1992 +0000 +++ b/src/search.c Wed Jun 10 03:53:16 1992 +0000 @@ -47,8 +47,16 @@ Since the registers are now dynamically allocated, we need to make sure not to refer to the Nth register before checking that it has - been allocated. */ + been allocated by checking search_regs.num_regs. + The regex code keeps track of whether it has allocated the search + buffer using bits in searchbuf. This means that whenever you + compile a new pattern, it completely forgets whether it has + allocated any registers, and will allocate new registers the next + time you call a searching or matching function. Therefore, we need + to call re_set_registers after compiling a new pattern or after + setting the match registers, so that the regex functions will be + able to free or re-allocate it properly. */ static struct re_registers search_regs; /* Nonzero if search_regs are indices in a string; 0 if in a buffer. */ @@ -73,9 +81,10 @@ /* Compile a regexp and signal a Lisp error if anything goes wrong. */ -compile_pattern (pattern, bufp, translate) +compile_pattern (pattern, bufp, regp, translate) Lisp_Object pattern; struct re_pattern_buffer *bufp; + struct re_registers *regp; char *translate; { CONST char *val; @@ -84,6 +93,7 @@ if (EQ (pattern, last_regexp) && translate == bufp->translate) return; + last_regexp = Qnil; bufp->translate = translate; val = re_compile_pattern ((char *) XSTRING (pattern)->data, @@ -95,7 +105,13 @@ while (1) Fsignal (Qinvalid_regexp, Fcons (dummy, Qnil)); } + last_regexp = pattern; + + /* Advise the searching functions about the space we have allocated + for register data. */ + re_set_registers (bufp, regp, regp->num_regs, regp->start, regp->end); + return; } @@ -124,7 +140,7 @@ register int i; CHECK_STRING (string, 0); - compile_pattern (string, &searchbuf, + compile_pattern (string, &searchbuf, &search_regs, !NILP (current_buffer->case_fold_search) ? DOWNCASE_TABLE : 0); immediate_quit = 1; @@ -196,7 +212,7 @@ args_out_of_range (string, start); } - compile_pattern (regexp, &searchbuf, + compile_pattern (regexp, &searchbuf, &search_regs, !NILP (current_buffer->case_fold_search) ? DOWNCASE_TABLE : 0); immediate_quit = 1; val = re_search (&searchbuf, (char *) XSTRING (string)->data, @@ -506,7 +522,7 @@ return pos; if (RE) - compile_pattern (string, &searchbuf, (char *) trt); + compile_pattern (string, &searchbuf, &search_regs, (char *) trt); if (RE /* Here we detect whether the */ /* generality of an RE search is */ @@ -768,6 +784,22 @@ if (i + direction == 0) { cursor -= direction; + + /* Make sure we have registers in which to store + the match position. */ + if (search_regs.num_regs == 0) + { + regoff_t *starts, *ends; + + starts = + (regoff_t *) xmalloc (2 * sizeof (regoff_t)); + ends = + (regoff_t *) xmalloc (2 * sizeof (regoff_t)); + re_set_registers (&searchbuf, + &search_regs, + 2, starts, ends); + } + search_regs.start[0] = pos + cursor - p2 + ((direction > 0) ? 1 - len : 0); @@ -827,6 +859,22 @@ if (i + direction == 0) { pos -= direction; + + /* Make sure we have registers in which to store + the match position. */ + if (search_regs.num_regs == 0) + { + regoff_t *starts, *ends; + + starts = + (regoff_t *) xmalloc (2 * sizeof (regoff_t)); + ends = + (regoff_t *) xmalloc (2 * sizeof (regoff_t)); + re_set_registers (&searchbuf, + &search_regs, + 2, starts, ends); + } + search_regs.start[0] = pos + ((direction > 0) ? 1 - len : 0); search_regs.end[0] = len + search_regs.start[0]; @@ -1004,6 +1052,7 @@ `\\N' means substitute what matched the Nth `\\(...\\)'.\n\ If Nth parens didn't match, substitute nothing.\n\ `\\\\' means insert one `\\'.\n\ +FIXEDCASE and LITERAL are optional arguments.\n\ Leaves point at end of replacement text.") (string, fixedcase, literal) Lisp_Object string, fixedcase, literal; @@ -1221,20 +1270,25 @@ if (length > search_regs.num_regs) { - if (search_regs.start) - search_regs.start = - (regoff_t *) realloc (search_regs.start, - length * sizeof (regoff_t)); + if (search_regs.num_regs == 0) + { + search_regs.start + = (regoff_t *) xmalloc (length * sizeof (regoff_t)); + search_regs.end + = (regoff_t *) xmalloc (length * sizeof (regoff_t)); + } else - search_regs.start = (regoff_t *) malloc (length * sizeof (regoff_t)); - if (search_regs.end) - search_regs.end = - (regoff_t *) realloc (search_regs.end, - length * sizeof (regoff_t)); - else - search_regs.end = (regoff_t *) malloc (length * sizeof (regoff_t)); + { + search_regs.start + = (regoff_t *) xrealloc (search_regs.start, + length * sizeof (regoff_t)); + search_regs.end + = (regoff_t *) xrealloc (search_regs.end, + length * sizeof (regoff_t)); + } - search_regs.num_regs = length; + re_set_registers (&searchbuf, &search_regs, length, + search_regs.start, search_regs.end); } }
--- a/src/termhooks.h Wed Jun 10 02:47:07 1992 +0000 +++ b/src/termhooks.h Wed Jun 10 03:53:16 1992 +0000 @@ -105,7 +105,7 @@ .modifiers holds the state of the modifier keys. .x and .y give the mouse position, - in pixels, within the window. + in characters, within the window. .screen gives the screen the mouse click occurred in. .timestamp gives a timestamp (in
--- a/src/window.c Wed Jun 10 02:47:07 1992 +0000 +++ b/src/window.c Wed Jun 10 03:53:16 1992 +0000 @@ -1,12 +1,12 @@ /* Window creation, deletion and examination for GNU Emacs. Does not include redisplay. - Copyright (C) 1985, 1986, 1987 Free Software Foundation, Inc. + Copyright (C) 1985, 1986, 1987, 1992 Free Software Foundation, Inc. This file is part of GNU Emacs. GNU Emacs is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 1, or (at your option) +the Free Software Foundation; either version 2, or (at your option) any later version. GNU Emacs is distributed in the hope that it will be useful, @@ -357,7 +357,10 @@ DEFUN ("coordinates-in-window-p", Fcoordinates_in_window_p, Scoordinates_in_window_p, 2, 2, 0, "Return non-nil if COORDINATES are in WINDOW.\n\ -COORDINATES is a cons of the form (X . Y), X and Y being screen-relative.\n\ +COORDINATES is a cons of the form (X . Y), X and Y being distances\n\ +measured in characters from the upper-left corner of the screen.\n\ +(0 . 0) denotes the character in the upper left corner of the\n\ +screen.\n\ If COORDINATES are in the text portion of WINDOW,\n\ the coordinates relative to the window are returned.\n\ If they are in the mode line of WINDOW, 'mode-line is returned.\n\
--- a/src/xfns.c Wed Jun 10 02:47:07 1992 +0000 +++ b/src/xfns.c Wed Jun 10 03:53:16 1992 +0000 @@ -1,11 +1,11 @@ /* Functions for the X window system. - Copyright (C) 1989 Free Software Foundation. + Copyright (C) 1989, 1992 Free Software Foundation. This file is part of GNU Emacs. GNU Emacs is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 1, or (at your option) +the Free Software Foundation; either version 2, or (at your option) any later version. GNU Emacs is distributed in the hope that it will be useful, @@ -1045,6 +1045,17 @@ if (s->display.x->window_desc) { +#ifdef HAVE_X11 + XTextProperty prop; + prop.value = XSTRING (arg)->data; + prop.encoding = XA_STRING; + prop.format = 8; + prop.nitems = XSTRING (arg)->size; + BLOCK_INPUT; + XSetWMName (XDISPLAY s->display.x->window_desc, &prop); + XSetWMIconName (XDISPLAY s->display.x->window_desc, &prop); + UNBLOCK_INPUT; +#else s->name = arg; BLOCK_INPUT; XStoreName (XDISPLAY s->display.x->window_desc, @@ -1052,6 +1063,7 @@ XSetIconName (XDISPLAY s->display.x->window_desc, (char *) XSTRING (arg)->data); UNBLOCK_INPUT; +#endif } } @@ -2102,8 +2114,19 @@ x_set_resize_hint (s); /* Tell the server the window's default name. */ - +#ifdef HAVE_X11 + { + XTextProperty prop; + prop.value = XSTRING (s->name)->data; + prop.encoding = XA_STRING; + prop.format = 8; + prop.nitems = XSTRING (s->name)->size; + XSetWMName (XDISPLAY s->display.x->window_desc, &prop); + } +#else XStoreName (XDISPLAY s->display.x->window_desc, XSTRING (s->name)->data); +#endif + /* Now override the defaults with all the rest of the specified parms. */ tem = x_get_arg (parms, intern ("unsplittable"), 0, 0);
--- a/src/xterm.c Wed Jun 10 02:47:07 1992 +0000 +++ b/src/xterm.c Wed Jun 10 03:53:16 1992 +0000 @@ -1465,10 +1465,9 @@ otherwise. */ result->kind = no_event; XSET (result->code, Lisp_Int, event->button); - XSET (result->timestamp, Lisp_Int, event->time); + result->timestamp = event->time; result->modifiers = (x_convert_modifiers (event->state) | (event->type == ButtonRelease ? up_modifier : 0)); - XSET (result->timestamp, Lisp_Int, (event->time & 0x7fffff)); /* Notice if the mouse is still grabbed. */ if (event->type == ButtonPress) @@ -1998,7 +1997,7 @@ XSET (bufp->code, Lisp_Int, (unsigned) keysym - 0xff50); bufp->screen = XSCREEN (SCREEN_FOCUS_SCREEN (s)); bufp->modifiers = x_convert_modifiers (modifiers); - XSET (bufp->timestamp, Lisp_Int, event.xkey.time); + bufp->timestamp = event.xkey.time; bufp++; count++; numchars--; @@ -2012,9 +2011,9 @@ if (modifiers & Mod1Mask) *copy_buffer |= METABIT; bufp->kind = ascii_keystroke; + XSET (bufp->code, Lisp_Int, *copy_buffer); bufp->screen = XSCREEN (SCREEN_FOCUS_SCREEN (s)); - XSET (bufp->code, Lisp_Int, *copy_buffer); - XSET (bufp->timestamp, Lisp_Int, event.xkey.time); + bufp->timestamp = event.xkey.time; bufp++; } else @@ -2022,8 +2021,8 @@ { bufp->kind = ascii_keystroke; XSET (bufp->code, Lisp_Int, copy_buffer[i]); - XSET (bufp->timestamp, Lisp_Int, event.xkey.time); bufp->screen = XSCREEN (SCREEN_FOCUS_SCREEN (s)); + bufp->timestamp = event.xkey.time; bufp++; } @@ -2167,14 +2166,12 @@ break; /* Entering our own subwindow. */ { - extern int waiting_for_input; struct screen *old_s = x_input_screen; s = x_window_to_screen (event.window); x_mouse_screen = s; - if (waiting_for_input && x_focus_screen == 0) - x_new_focus_screen (s); + x_new_focus_screen (s); } break; @@ -2592,6 +2589,14 @@ { struct screen_glyphs *current_glyphs = SCREEN_CURRENT_GLYPHS (s); + /* If we're not updating, then we want to use the current screen's + cursor position, not our local idea of where the cursor ought to be. */ + if (s != updating_screen) + { + curs_x = SCREEN_CURSOR_X (s); + curs_y = SCREEN_CURSOR_Y (s); + } + if (! s->visible) return; @@ -2605,8 +2610,8 @@ erase it. */ if (s->phys_cursor_x >= 0 && (!on - || s->phys_cursor_x != s->cursor_x - || s->phys_cursor_y != s->cursor_y + || s->phys_cursor_x != curs_x + || s->phys_cursor_y != curs_y || (s->display.x->text_cursor_kind != hollow_box_cursor && (s != x_highlight_screen)))) { @@ -2626,9 +2631,9 @@ && s == x_highlight_screen))) { s->phys_cursor_glyph - = ((current_glyphs->enable[s->cursor_y] - && s->cursor_x < current_glyphs->used[s->cursor_y]) - ? current_glyphs->glyphs[s->cursor_y][s->cursor_x] + = ((current_glyphs->enable[curs_y] + && curs_x < current_glyphs->used[curs_y]) + ? current_glyphs->glyphs[curs_y][curs_x] : SPACEGLYPH); if (s != x_highlight_screen) { @@ -2637,13 +2642,13 @@ } else { - x_draw_single_glyph (s, s->cursor_y, s->cursor_x, + x_draw_single_glyph (s, curs_y, curs_x, s->phys_cursor_glyph, 2); s->display.x->text_cursor_kind = filled_box_cursor; } - s->phys_cursor_x = s->cursor_x; - s->phys_cursor_y = s->cursor_y; + s->phys_cursor_x = curs_x; + s->phys_cursor_y = curs_y; } if (updating_screen != s)