* src/frame.h (SET_FRAME_VISIBLE): Keep frame_garbaged up to date.

* src/xterm.c (handle_one_xevent) <MapNotify>: Don't garbage the frame.
* src/frame.c (frame_garbaged): Make "docstring" more precise.
This commit is contained in:
Stefan Monnier 2014-03-20 10:09:37 -04:00
parent 7b9cb54487
commit caecb91c58
7 changed files with 42 additions and 40 deletions

View file

@ -1,3 +1,9 @@
2014-03-20 Stefan Monnier <monnier@iro.umontreal.ca>
* frame.h (SET_FRAME_VISIBLE): Keep frame_garbaged up to date.
* xterm.c (handle_one_xevent) <MapNotify>: Don't garbage the frame.
* frame.c (frame_garbaged): Make "docstring" more precise.
2014-03-20 Glenn Morris <rgm@gnu.org>
* charset.c (init_charset): When we cannot find the charsets directory,
@ -74,8 +80,8 @@
we eventually back up the iterator to the wrap point. This avoids
delusional behavior of move_it_to, whereby it proceeds to the next
display line, but sets current_x to zero for all the glyphs that
without word-wrap would fit on the previous display line. One
result was that visual-order cursor movement behaved erratically
without word-wrap would fit on the previous display line.
One result was that visual-order cursor movement behaved erratically
under word-wrap.
(Fmove_point_visually): Add code to find the x coordinate of the
last character before wrap point, under word-wrap on a TTY.
@ -107,8 +113,8 @@
SSDATA (Vx_resource_name), which may be changed from Lisp.
(xim_close_display): For XUnregisterIMInstantiateCallback,
always eassert return value and pass exactly the same values
as were used for XRegisterIMInstantiateCallback. Otherwise
XUnregisterIMInstantiateCallback will always fail. See Xlib
as were used for XRegisterIMInstantiateCallback.
Otherwise XUnregisterIMInstantiateCallback will always fail. See Xlib
sources to check why if you are interested.
2014-03-05 Martin Rudalics <rudalics@gmx.at>

View file

@ -1138,8 +1138,8 @@ lisp_align_malloc (size_t nbytes, enum mem_type type)
}
abase = ABLOCK_ABASE (free_ablock);
ABLOCKS_BUSY (abase) =
(struct ablocks *) (2 + (intptr_t) ABLOCKS_BUSY (abase));
ABLOCKS_BUSY (abase)
= (struct ablocks *) (2 + (intptr_t) ABLOCKS_BUSY (abase));
val = free_ablock;
free_ablock = free_ablock->x.next_free;

View file

@ -125,8 +125,7 @@ Lisp_Object selected_frame;
static struct frame *last_nonminibuf_frame;
/* Nonzero means there is at least one garbaged frame. */
/* False means there are no visible garbaged frames. */
bool frame_garbaged;
#ifdef HAVE_WINDOW_SYSTEM
@ -621,7 +620,7 @@ make_terminal_frame (struct terminal *terminal)
FRAME_MENU_BAR_LINES (f) = NILP (Vmenu_bar_mode) ? 0 : 1;
FRAME_MENU_BAR_HEIGHT (f) = FRAME_MENU_BAR_LINES (f) * FRAME_LINE_HEIGHT (f);
/* Set the top frame to the newly created frame. */
/* Set the top frame to the newly created frame. */
if (FRAMEP (FRAME_TTY (f)->top_frame)
&& FRAME_LIVE_P (XFRAME (FRAME_TTY (f)->top_frame)))
SET_FRAME_VISIBLE (XFRAME (FRAME_TTY (f)->top_frame), 2); /* obscured */

View file

@ -439,7 +439,7 @@ struct frame
/* The baud rate that was used to calculate costs for this frame. */
int cost_calculation_baud_rate;
/* frame opacity
/* Frame opacity
alpha[0]: alpha transparency of the active frame
alpha[1]: alpha transparency of inactive frames
Negative values mean not to change alpha. */
@ -453,7 +453,7 @@ struct frame
/* Additional space to put between text lines on this frame. */
int extra_line_spacing;
/* All display backends seem to need these two pixel values. */
/* All display backends seem to need these two pixel values. */
unsigned long background_pixel;
unsigned long foreground_pixel;
};
@ -946,6 +946,9 @@ default_pixels_per_inch_y (void)
} \
} while (false)
/* False means there are no visible garbaged frames. */
extern bool frame_garbaged;
/* Set visibility of frame F.
We call redisplay_other_windows to make sure the frame gets redisplayed
if some changes were applied to it while it wasn't visible (and hence
@ -955,8 +958,13 @@ INLINE void
SET_FRAME_VISIBLE (struct frame *f, int v)
{
eassert (0 <= v && v <= 2);
if (v == 1 && f->visible != 1)
redisplay_other_windows ();
if (v)
{
if (v == 1 && f->visible != 1)
redisplay_other_windows ();
if (FRAME_GARBAGED_P (f))
frame_garbaged = true;
}
f->visible = v;
}
@ -972,9 +980,6 @@ extern Lisp_Object Qtty_color_mode;
extern Lisp_Object Qterminal;
extern Lisp_Object Qnoelisp;
/* True means there is at least one garbaged frame. */
extern bool frame_garbaged;
extern void set_menu_bar_lines (struct frame *, Lisp_Object, Lisp_Object);
extern struct frame *decode_window_system_frame (Lisp_Object);
extern struct frame *decode_live_frame (Lisp_Object);

View file

@ -3054,7 +3054,7 @@ free_saved_screen (struct glyph_matrix *saved)
int i;
if (!saved)
return; /* already freed */
return; /* Already freed! */
for (i = 0; i < saved->nrows; ++i)
{
@ -3170,7 +3170,7 @@ tty_menu_activate (tty_menu *menu, int *pane, int *selidx,
int statecount, x, y, i;
bool leave, onepane;
int result IF_LINT (= 0);
int title_faces[4]; /* face to display the menu title */
int title_faces[4]; /* Face to display the menu title. */
int faces[4], buffers_num_deleted = 0;
struct frame *sf = SELECTED_FRAME ();
struct tty_display_info *tty = FRAME_TTY (sf);
@ -3332,7 +3332,7 @@ tty_menu_activate (tty_menu *menu, int *pane, int *selidx,
have been opened. That does not include an open and
active submenu. */
if (i != statecount - 2
|| state[i].menu->submenu[dy] != state[i+1].menu)
|| state[i].menu->submenu[dy] != state[i + 1].menu)
while (i != statecount - 1)
{
statecount--;
@ -3383,7 +3383,7 @@ tty_menu_activate (tty_menu *menu, int *pane, int *selidx,
screen_update (sf, state[0].screen_behind);
while (statecount--)
free_saved_screen (state[statecount].screen_behind);
tty_show_cursor (tty); /* turn cursor back on */
tty_show_cursor (tty); /* Turn cursor back on. */
fflush (tty->output);
/* Clean up any mouse events that are waiting inside Emacs event queue.
@ -3474,7 +3474,7 @@ tty_menu_last_menubar_item (struct frame *f)
break;
i += 4;
}
i -= 4; /* went one too far */
i -= 4; /* Went one too far! */
}
return i;
}
@ -3519,7 +3519,7 @@ tty_menu_new_item_coords (struct frame *f, int which, int *x, int *y)
if (i < last_i)
*x = XINT (AREF (items, i + 4 + 3));
else
*x = 0; /* wrap around to the first item */
*x = 0; /* Wrap around to the first item. */
}
else if (prev_x < 0)
{
@ -3647,7 +3647,7 @@ tty_menu_show (struct frame *f, int x, int y, bool for_click, bool keymaps,
if (!NILP (descrip))
{
/* if alloca is fast, use that to make the space,
/* If alloca is fast, use that to make the space,
to reduce gc needs. */
item_data = (char *) alloca (maxwidth + SBYTES (descrip) + 1);
memcpy (item_data, SSDATA (item_name), SBYTES (item_name));
@ -3694,7 +3694,7 @@ tty_menu_show (struct frame *f, int x, int y, bool for_click, bool keymaps,
uly = dispheight - height;
}
if (FRAME_HAS_MINIBUF_P (f) && uly+height > dispheight - 2)
if (FRAME_HAS_MINIBUF_P (f) && uly + height > dispheight - 2)
{
/* Move the menu away of the echo area, to avoid overwriting the
menu with help echo messages or vice versa. */
@ -3723,8 +3723,8 @@ tty_menu_show (struct frame *f, int x, int y, bool for_click, bool keymaps,
/* If position was not given by a mouse click, adjust so upper left
corner of the menu as a whole ends up at given coordinates. This
is what x-popup-menu says in its documentation. */
x += width/2;
y += 1.5*height/(maxlines+2);
x += width / 2;
y += 1.5 * height / (maxlines + 2);
}
#endif

View file

@ -27253,7 +27253,7 @@ show_mouse_face (Mouse_HLInfo *hlinfo, enum draw_glyphs_face draw)
if (/* If window is in the process of being destroyed, don't bother
to do anything. */
w->current_matrix != NULL
/* Don't update mouse highlight if hidden */
/* Don't update mouse highlight if hidden. */
&& (draw != DRAW_MOUSE_FACE || !hlinfo->mouse_face_hidden)
/* Recognize when we are called to operate on rows that don't exist
anymore. This can happen when a window is split. */

View file

@ -5667,7 +5667,7 @@ static struct input_event *current_hold_quit;
/* This is the filter function invoked by the GTK event loop.
It is invoked before the XEvent is translated to a GdkEvent,
so we have a chance to act on the event before GTK. */
so we have a chance to act on the event before GTK. */
static GdkFilterReturn
event_handler_gdk (GdkXEvent *gxev, GdkEvent *ev, gpointer data)
{
@ -5696,9 +5696,9 @@ event_handler_gdk (GdkXEvent *gxev, GdkEvent *ev, gpointer data)
if (! dpyinfo)
current_finish = X_EVENT_NORMAL;
else
current_count +=
handle_one_xevent (dpyinfo, xev, &current_finish,
current_hold_quit);
current_count
+= handle_one_xevent (dpyinfo, xev, &current_finish,
current_hold_quit);
}
else
current_finish = x_dispatch_event (xev, xev->xany.display);
@ -6142,14 +6142,6 @@ handle_one_xevent (struct x_display_info *dpyinfo,
if (f)
{
bool iconified = FRAME_ICONIFIED_P (f);
/* wait_reading_process_output will notice this and update
the frame's display structures.
If we where iconified, we should not set garbaged,
because that stops redrawing on Expose events. This looks
bad if we are called from a recursive event loop
(x_dispatch_event), for example when a dialog is up. */
if (!iconified)
SET_FRAME_GARBAGED (f);
/* Check if fullscreen was specified before we where mapped the
first time, i.e. from the command line. */
@ -6700,7 +6692,7 @@ handle_one_xevent (struct x_display_info *dpyinfo,
#ifdef USE_GTK
/* GTK creates windows but doesn't map them.
Only get real positions when mapped. */
Only get real positions when mapped. */
if (FRAME_GTK_OUTER_WIDGET (f)
&& gtk_widget_get_mapped (FRAME_GTK_OUTER_WIDGET (f)))
#endif