forked from aniani/vim
patch 8.0.1008: slow updating of terminal window in Motif
Problem: Slow updating of terminal window in Motif. Solution: Add a timeout to the wait-for-character loop.
This commit is contained in:
@@ -136,20 +136,11 @@ static guicolor_T prev_sp_color = INVALCOLOR;
|
|||||||
static XButtonPressedEvent last_mouse_event;
|
static XButtonPressedEvent last_mouse_event;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static void gui_x11_timer_cb(XtPointer timed_out, XtIntervalId *interval_id);
|
|
||||||
static void gui_x11_visibility_cb(Widget w, XtPointer dud, XEvent *event, Boolean *dum);
|
|
||||||
static void gui_x11_expose_cb(Widget w, XtPointer dud, XEvent *event, Boolean *dum);
|
|
||||||
static void gui_x11_resize_window_cb(Widget w, XtPointer dud, XEvent *event, Boolean *dum);
|
|
||||||
static void gui_x11_focus_change_cb(Widget w, XtPointer data, XEvent *event, Boolean *dum);
|
|
||||||
static void gui_x11_enter_cb(Widget w, XtPointer data, XEvent *event, Boolean *dum);
|
|
||||||
static void gui_x11_leave_cb(Widget w, XtPointer data, XEvent *event, Boolean *dum);
|
|
||||||
static void gui_x11_mouse_cb(Widget w, XtPointer data, XEvent *event, Boolean *dum);
|
|
||||||
static void gui_x11_check_copy_area(void);
|
static void gui_x11_check_copy_area(void);
|
||||||
#ifdef FEAT_CLIENTSERVER
|
#ifdef FEAT_CLIENTSERVER
|
||||||
static void gui_x11_send_event_handler(Widget, XtPointer, XEvent *, Boolean *);
|
static void gui_x11_send_event_handler(Widget, XtPointer, XEvent *, Boolean *);
|
||||||
#endif
|
#endif
|
||||||
static void gui_x11_wm_protocol_handler(Widget, XtPointer, XEvent *, Boolean *);
|
static void gui_x11_wm_protocol_handler(Widget, XtPointer, XEvent *, Boolean *);
|
||||||
static void gui_x11_blink_cb(XtPointer timed_out, XtIntervalId *interval_id);
|
|
||||||
static Cursor gui_x11_create_blank_mouse(void);
|
static Cursor gui_x11_create_blank_mouse(void);
|
||||||
static void draw_curl(int row, int col, int cells);
|
static void draw_curl(int row, int col, int cells);
|
||||||
|
|
||||||
@@ -574,6 +565,25 @@ gui_x11_timer_cb(
|
|||||||
*((int *)timed_out) = TRUE;
|
*((int *)timed_out) = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef FEAT_JOB_CHANNEL
|
||||||
|
static void
|
||||||
|
channel_poll_cb(
|
||||||
|
XtPointer client_data,
|
||||||
|
XtIntervalId *interval_id UNUSED)
|
||||||
|
{
|
||||||
|
XtIntervalId *channel_timer = (XtIntervalId *)client_data;
|
||||||
|
|
||||||
|
/* Using an event handler for a channel that may be disconnected does
|
||||||
|
* not work, it hangs. Instead poll for messages. */
|
||||||
|
channel_handle_events(TRUE);
|
||||||
|
parse_queued_messages();
|
||||||
|
|
||||||
|
/* repeat */
|
||||||
|
*channel_timer = XtAppAddTimeOut(app_context, (long_u)20,
|
||||||
|
channel_poll_cb, client_data);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gui_x11_visibility_cb(
|
gui_x11_visibility_cb(
|
||||||
Widget w UNUSED,
|
Widget w UNUSED,
|
||||||
@@ -2698,12 +2708,22 @@ gui_mch_wait_for_chars(long wtime)
|
|||||||
static int timed_out;
|
static int timed_out;
|
||||||
XtIntervalId timer = (XtIntervalId)0;
|
XtIntervalId timer = (XtIntervalId)0;
|
||||||
XtInputMask desired;
|
XtInputMask desired;
|
||||||
|
#ifdef FEAT_JOB_CHANNEL
|
||||||
|
XtIntervalId channel_timer = (XtIntervalId)0;
|
||||||
|
#endif
|
||||||
|
|
||||||
timed_out = FALSE;
|
timed_out = FALSE;
|
||||||
|
|
||||||
if (wtime > 0)
|
if (wtime > 0)
|
||||||
timer = XtAppAddTimeOut(app_context, (long_u)wtime, gui_x11_timer_cb,
|
timer = XtAppAddTimeOut(app_context, (long_u)wtime, gui_x11_timer_cb,
|
||||||
&timed_out);
|
&timed_out);
|
||||||
|
#ifdef FEAT_JOB_CHANNEL
|
||||||
|
/* If there is a channel with the keep_open flag we need to poll for input
|
||||||
|
* on them. */
|
||||||
|
if (channel_any_keep_open())
|
||||||
|
channel_timer = XtAppAddTimeOut(app_context, (long_u)20,
|
||||||
|
channel_poll_cb, (XtPointer)&channel_timer);
|
||||||
|
#endif
|
||||||
|
|
||||||
focus = gui.in_focus;
|
focus = gui.in_focus;
|
||||||
#ifdef ALT_X_INPUT
|
#ifdef ALT_X_INPUT
|
||||||
@@ -2755,6 +2775,10 @@ gui_mch_wait_for_chars(long wtime)
|
|||||||
|
|
||||||
if (timer != (XtIntervalId)0 && !timed_out)
|
if (timer != (XtIntervalId)0 && !timed_out)
|
||||||
XtRemoveTimeOut(timer);
|
XtRemoveTimeOut(timer);
|
||||||
|
#ifdef FEAT_JOB_CHANNEL
|
||||||
|
if (channel_timer != (XtIntervalId)0)
|
||||||
|
XtRemoveTimeOut(channel_timer);
|
||||||
|
#endif
|
||||||
|
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
@@ -3087,25 +3111,6 @@ gui_mch_stop_blink(void)
|
|||||||
blink_state = BLINK_NONE;
|
blink_state = BLINK_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Start the cursor blinking. If it was already blinking, this restarts the
|
|
||||||
* waiting time and shows the cursor.
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
gui_mch_start_blink(void)
|
|
||||||
{
|
|
||||||
if (blink_timer != (XtIntervalId)0)
|
|
||||||
XtRemoveTimeOut(blink_timer);
|
|
||||||
/* Only switch blinking on if none of the times is zero */
|
|
||||||
if (blink_waittime && blink_ontime && blink_offtime && gui.in_focus)
|
|
||||||
{
|
|
||||||
blink_timer = XtAppAddTimeOut(app_context, blink_waittime,
|
|
||||||
gui_x11_blink_cb, NULL);
|
|
||||||
blink_state = BLINK_ON;
|
|
||||||
gui_update_cursor(TRUE, FALSE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gui_x11_blink_cb(
|
gui_x11_blink_cb(
|
||||||
XtPointer timed_out UNUSED,
|
XtPointer timed_out UNUSED,
|
||||||
@@ -3127,6 +3132,25 @@ gui_x11_blink_cb(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Start the cursor blinking. If it was already blinking, this restarts the
|
||||||
|
* waiting time and shows the cursor.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
gui_mch_start_blink(void)
|
||||||
|
{
|
||||||
|
if (blink_timer != (XtIntervalId)0)
|
||||||
|
XtRemoveTimeOut(blink_timer);
|
||||||
|
/* Only switch blinking on if none of the times is zero */
|
||||||
|
if (blink_waittime && blink_ontime && blink_offtime && gui.in_focus)
|
||||||
|
{
|
||||||
|
blink_timer = XtAppAddTimeOut(app_context, blink_waittime,
|
||||||
|
gui_x11_blink_cb, NULL);
|
||||||
|
blink_state = BLINK_ON;
|
||||||
|
gui_update_cursor(TRUE, FALSE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Return the RGB value of a pixel as a long.
|
* Return the RGB value of a pixel as a long.
|
||||||
*/
|
*/
|
||||||
|
@@ -769,6 +769,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
1008,
|
||||||
/**/
|
/**/
|
||||||
1007,
|
1007,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user