mirror of
https://git.savannah.gnu.org/git/emacs.git
synced 2024-11-21 06:55:39 +00:00
Bring back the busy wait after x_make_frame_visible (Bug#25521)
But wait specfically for a MapNotify event, and only for a configurable amount of time. * src/xterm.c (syms_of_xterm) [x-wait-for-event-timeout]: New variable. (x_wait_for_event): Use it instead of hardcoding the wait to 0.1s. (x_make_frame_visible): Call x_wait_for_event at the end. * etc/NEWS: Announce x_wait_for_event.
This commit is contained in:
parent
bccf635217
commit
e1f6e3127a
5
etc/NEWS
5
etc/NEWS
@ -600,6 +600,11 @@ The two new variables, 'bidi-paragraph-start-re' and
|
||||
'bidi-paragraph-separate-re', allow customization of what exactly are
|
||||
paragraphs, for the purposes of bidirectional display.
|
||||
|
||||
---
|
||||
** New variable 'x-wait-for-event-timeout'.
|
||||
This controls how long Emacs will wait for updates to the graphical
|
||||
state to take effect (making a frame visible, for example).
|
||||
|
||||
|
||||
* Changes in Specialized Modes and Packages in Emacs 26.1
|
||||
|
||||
|
40
src/xterm.c
40
src/xterm.c
@ -11029,17 +11029,22 @@ x_sync_with_move (struct frame *f, int left, int top, bool fuzzy)
|
||||
void
|
||||
x_wait_for_event (struct frame *f, int eventtype)
|
||||
{
|
||||
int level = interrupt_input_blocked;
|
||||
if (!FLOATP (Vx_wait_for_event_timeout))
|
||||
return;
|
||||
|
||||
int level = interrupt_input_blocked;
|
||||
fd_set fds;
|
||||
struct timespec tmo, tmo_at, time_now;
|
||||
int fd = ConnectionNumber (FRAME_X_DISPLAY (f));
|
||||
|
||||
f->wait_event_type = eventtype;
|
||||
|
||||
/* Set timeout to 0.1 second. Hopefully not noticeable.
|
||||
Maybe it should be configurable. */
|
||||
tmo = make_timespec (0, 100 * 1000 * 1000);
|
||||
/* Default timeout is 0.1 second. Hopefully not noticeable. */
|
||||
double timeout = XFLOAT_DATA (Vx_wait_for_event_timeout);
|
||||
time_t timeout_seconds = (time_t) timeout;
|
||||
tmo = make_timespec
|
||||
(timeout_seconds, (long int) ((timeout - timeout_seconds)
|
||||
* 1000 * 1000 * 1000));
|
||||
tmo_at = timespec_add (current_timespec (), tmo);
|
||||
|
||||
while (f->wait_event_type)
|
||||
@ -11365,8 +11370,13 @@ xembed_send_message (struct frame *f, Time t, enum xembed_message msg,
|
||||
|
||||
/* Change of visibility. */
|
||||
|
||||
/* This function sends the request to make the frame visible, but may
|
||||
return before it the frame's visibility is changed. */
|
||||
/* This tries to wait until the frame is really visible, depending on
|
||||
the value of Vx_wait_for_event_timeout.
|
||||
However, if the window manager asks the user where to position
|
||||
the frame, this will return before the user finishes doing that.
|
||||
The frame will not actually be visible at that time,
|
||||
but it will become visible later when the window manager
|
||||
finishes with it. */
|
||||
|
||||
void
|
||||
x_make_frame_visible (struct frame *f)
|
||||
@ -11437,11 +11447,14 @@ x_make_frame_visible (struct frame *f)
|
||||
before we do anything else. We do this loop with input not blocked
|
||||
so that incoming events are handled. */
|
||||
{
|
||||
Lisp_Object frame;
|
||||
/* This must be before UNBLOCK_INPUT
|
||||
since events that arrive in response to the actions above
|
||||
will set it when they are handled. */
|
||||
bool previously_visible = f->output_data.x->has_been_visible;
|
||||
|
||||
XSETFRAME (frame, f);
|
||||
|
||||
int original_left = f->left_pos;
|
||||
int original_top = f->top_pos;
|
||||
|
||||
@ -11488,6 +11501,10 @@ x_make_frame_visible (struct frame *f)
|
||||
|
||||
unblock_input ();
|
||||
}
|
||||
|
||||
/* Try to wait for a MapNotify event (that is what tells us when a
|
||||
frame becomes visible). */
|
||||
x_wait_for_event (f, MapNotify);
|
||||
}
|
||||
}
|
||||
|
||||
@ -13283,6 +13300,17 @@ This should be one of the symbols `ctrl', `alt', `hyper', `meta',
|
||||
keysyms. The default is nil, which is the same as `super'. */);
|
||||
Vx_super_keysym = Qnil;
|
||||
|
||||
DEFVAR_LISP ("x-wait-for-event-timeout", Vx_wait_for_event_timeout,
|
||||
doc: /* How long to wait for X events.
|
||||
|
||||
Emacs will wait up to this many seconds to receive X events after
|
||||
making changes which affect the state of the graphical interface.
|
||||
Under some window managers this can take an indefinite amount of time,
|
||||
so it is important to limit the wait.
|
||||
|
||||
If set to a non-float value, there will be no wait at all. */);
|
||||
Vx_wait_for_event_timeout = make_float (0.1);
|
||||
|
||||
DEFVAR_LISP ("x-keysym-table", Vx_keysym_table,
|
||||
doc: /* Hash table of character codes indexed by X keysym codes. */);
|
||||
Vx_keysym_table = make_hash_table (hashtest_eql, 900,
|
||||
|
Loading…
Reference in New Issue
Block a user