[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Emacs-diffs] master 6a788d2: Don't wait for frame to become visible
From: |
Noam Postavsky |
Subject: |
[Emacs-diffs] master 6a788d2: Don't wait for frame to become visible |
Date: |
Sat, 21 Jan 2017 04:46:28 +0000 (UTC) |
branch: master
commit 6a788d2fc18c23dcfc5d0352649b2f690e9cbff7
Author: Noam Postavsky <address@hidden>
Commit: Noam Postavsky <address@hidden>
Don't wait for frame to become visible
* src/xterm.c (x_make_frame_visible): Remove code that waits for the
frame to become visible. We have to deal with invisible frames anyway,
the loop could sometimes before the frame turned visible, and for some
window managers (e.g., XMonad, i3wm) it caused Emacs to get stuck in a
busy loop (Bug#24091).
---
src/xterm.c | 58 ++++------------------------------------------------------
1 file changed, 4 insertions(+), 54 deletions(-)
diff --git a/src/xterm.c b/src/xterm.c
index adc02e2..db561c9 100644
--- a/src/xterm.c
+++ b/src/xterm.c
@@ -10993,19 +10993,12 @@ xembed_send_message (struct frame *f, Time t, enum
xembed_message msg,
/* Change of visibility. */
-/* This tries to wait until the frame is really visible.
- 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. */
+/* This function sends the request to make the frame visible, but may
+ return before it the frame's visibility is changed. */
void
x_make_frame_visible (struct frame *f)
{
- int original_top, original_left;
- int tries = 0;
-
block_input ();
x_set_bitmap_icon (f);
@@ -11052,16 +11045,13 @@ 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);
-
- original_left = f->left_pos;
- original_top = f->top_pos;
+ int original_left = f->left_pos;
+ int original_top = f->top_pos;
/* This must come after we set COUNT. */
unblock_input ();
@@ -11105,46 +11095,6 @@ x_make_frame_visible (struct frame *f)
unblock_input ();
}
-
- /* Process X events until a MapNotify event has been seen. */
- while (!FRAME_VISIBLE_P (f))
- {
- /* Force processing of queued events. */
- x_sync (f);
-
- /* If on another desktop, the deiconify/map may be ignored and the
- frame never becomes visible. XMonad does this.
- Prevent an endless loop. */
- if (FRAME_ICONIFIED_P (f) && ++tries > 100)
- break;
-
- /* This hack is still in use at least for Cygwin. See
- http://lists.gnu.org/archive/html/emacs-devel/2013-12/msg00351.html.
-
- Machines that do polling rather than SIGIO have been
- observed to go into a busy-wait here. So we'll fake an
- alarm signal to let the handler know that there's something
- to be read. We used to raise a real alarm, but it seems
- that the handler isn't always enabled here. This is
- probably a bug. */
- if (input_polling_used ())
- {
- /* It could be confusing if a real alarm arrives while
- processing the fake one. Turn it off and let the
- handler reset it. */
- int old_poll_suppress_count = poll_suppress_count;
- poll_suppress_count = 1;
- poll_for_input_1 ();
- poll_suppress_count = old_poll_suppress_count;
- }
-
- if (XPending (FRAME_X_DISPLAY (f)))
- {
- XEvent xev;
- XNextEvent (FRAME_X_DISPLAY (f), &xev);
- x_dispatch_event (&xev, FRAME_X_DISPLAY (f));
- }
- }
}
}
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Emacs-diffs] master 6a788d2: Don't wait for frame to become visible,
Noam Postavsky <=