To: vim_dev@googlegroups.com Subject: Patch 8.0.1450 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.0.1450 Problem: Endless loop when gui_mch_stop_blink() is called while blink_state is BLINK_OFF. (zdohnal) Solution: Avoid calling gui_update_cursor() recursively. Files: src/gui.c, src/gui_gtk_x11.c, src/proto/gui_gtk_x11.pro, src/gui_mac.c, src/proto/gui_mac.pro, src/gui_photon.c, src/proto/gui_photon.pro, src/gui_w32.c, src/proto/gui_w32.pro, src/gui_x11.c, src/proto/gui_x11.pro *** ../vim-8.0.1449/src/gui.c 2018-01-31 20:51:40.301835954 +0100 --- src/gui.c 2018-01-31 21:02:15.659779202 +0100 *************** *** 1124,1130 **** shape->blinkoff); if (shape->blinkwait == 0 || shape->blinkon == 0 || shape->blinkoff == 0) ! gui_mch_stop_blink(); #ifdef FEAT_TERMINAL if (shape_bg != INVALCOLOR) { --- 1124,1130 ---- shape->blinkoff); if (shape->blinkwait == 0 || shape->blinkon == 0 || shape->blinkoff == 0) ! gui_mch_stop_blink(FALSE); #ifdef FEAT_TERMINAL if (shape_bg != INVALCOLOR) { *************** *** 2982,2988 **** * for showmatch() */ gui_mch_start_blink(); retval = gui_wait_for_chars_or_timer(wtime); ! gui_mch_stop_blink(); return retval; } --- 2982,2988 ---- * for showmatch() */ gui_mch_start_blink(); retval = gui_wait_for_chars_or_timer(wtime); ! gui_mch_stop_blink(TRUE); return retval; } *************** *** 3029,3035 **** retval = gui_wait_for_chars_or_timer(-1L); } ! gui_mch_stop_blink(); return retval; } --- 3029,3035 ---- retval = gui_wait_for_chars_or_timer(-1L); } ! gui_mch_stop_blink(TRUE); return retval; } *** ../vim-8.0.1449/src/gui_gtk_x11.c 2017-11-09 18:33:22.408374709 +0100 --- src/gui_gtk_x11.c 2018-01-31 21:04:26.406643871 +0100 *************** *** 893,906 **** * Stop the cursor blinking. Show the cursor if it wasn't shown. */ void ! gui_mch_stop_blink(void) { if (blink_timer) { timeout_remove(blink_timer); blink_timer = 0; } ! if (blink_state == BLINK_OFF) { gui_update_cursor(TRUE, FALSE); gui_mch_flush(); --- 893,906 ---- * Stop the cursor blinking. Show the cursor if it wasn't shown. */ void ! gui_mch_stop_blink(int may_call_gui_update_cursor) { if (blink_timer) { timeout_remove(blink_timer); blink_timer = 0; } ! if (blink_state == BLINK_OFF && may_call_gui_update_cursor) { gui_update_cursor(TRUE, FALSE); gui_mch_flush(); *************** *** 975,981 **** gpointer data UNUSED) { if (blink_state != BLINK_NONE) ! gui_mch_stop_blink(); return FALSE; } --- 975,981 ---- gpointer data UNUSED) { if (blink_state != BLINK_NONE) ! gui_mch_stop_blink(TRUE); return FALSE; } *************** *** 1006,1012 **** gui_focus_change(FALSE); if (blink_state != BLINK_NONE) ! gui_mch_stop_blink(); return TRUE; } --- 1006,1012 ---- gui_focus_change(FALSE); if (blink_state != BLINK_NONE) ! gui_mch_stop_blink(TRUE); return TRUE; } *************** *** 1145,1151 **** #if GTK_CHECK_VERSION(3,0,0) is_key_pressed = TRUE; ! gui_mch_stop_blink(); #endif gui.event_time = event->time; --- 1145,1151 ---- #if GTK_CHECK_VERSION(3,0,0) is_key_pressed = TRUE; ! gui_mch_stop_blink(TRUE); #endif gui.event_time = event->time; *************** *** 6677,6683 **** if (gui.in_focus) gui_mch_start_blink(); else ! gui_mch_stop_blink(); focus = gui.in_focus; } --- 6677,6683 ---- if (gui.in_focus) gui_mch_start_blink(); else ! gui_mch_stop_blink(TRUE); focus = gui.in_focus; } *** ../vim-8.0.1449/src/proto/gui_gtk_x11.pro 2017-09-09 18:45:20.418225738 +0200 --- src/proto/gui_gtk_x11.pro 2018-01-31 21:03:52.606935233 +0100 *************** *** 4,10 **** int gui_mch_is_blinking(void); int gui_mch_is_blink_off(void); void gui_mch_set_blinking(long waittime, long on, long off); ! void gui_mch_stop_blink(void); void gui_mch_start_blink(void); int gui_mch_early_init_check(int give_message); int gui_mch_init_check(void); --- 4,10 ---- int gui_mch_is_blinking(void); int gui_mch_is_blink_off(void); void gui_mch_set_blinking(long waittime, long on, long off); ! void gui_mch_stop_blink(int may_call_gui_update_cursor); void gui_mch_start_blink(void); int gui_mch_early_init_check(int give_message); int gui_mch_init_check(void); *************** *** 25,31 **** void gui_mch_unmaximize(void); void gui_mch_newfont(void); void gui_mch_set_shellsize(int width, int height, int min_width, int min_height, int base_width, int base_height, int direction); ! void gui_gtk_get_screen_size_of_win(GtkWidget *win, int *width, int *height); void gui_mch_get_screen_dimensions(int *screen_w, int *screen_h); void gui_mch_settitle(char_u *title, char_u *icon); void gui_mch_enable_menu(int showit); --- 25,31 ---- void gui_mch_unmaximize(void); void gui_mch_newfont(void); void gui_mch_set_shellsize(int width, int height, int min_width, int min_height, int base_width, int base_height, int direction); ! void gui_gtk_get_screen_size_of_win(GtkWidget *wid, int *width, int *height); void gui_mch_get_screen_dimensions(int *screen_w, int *screen_h); void gui_mch_settitle(char_u *title, char_u *icon); void gui_mch_enable_menu(int showit); *** ../vim-8.0.1449/src/gui_mac.c 2017-11-25 17:14:29.604189538 +0100 --- src/gui_mac.c 2018-01-31 21:04:57.058380802 +0100 *************** *** 5156,5164 **** * Stop the cursor blinking. Show the cursor if it wasn't shown. */ void ! gui_mch_stop_blink(void) { ! gui_update_cursor(TRUE, FALSE); /* TODO: TODO: TODO: TODO: */ /* gui_w32_rm_blink_timer(); if (blink_state == BLINK_OFF) --- 5156,5165 ---- * Stop the cursor blinking. Show the cursor if it wasn't shown. */ void ! gui_mch_stop_blink(int may_call_gui_update_cursor) { ! if (may_call_gui_update_cursor) ! gui_update_cursor(TRUE, FALSE); /* TODO: TODO: TODO: TODO: */ /* gui_w32_rm_blink_timer(); if (blink_state == BLINK_OFF) *** ../vim-8.0.1449/src/proto/gui_mac.pro 2017-07-23 16:45:05.673761155 +0200 --- src/proto/gui_mac.pro 2018-01-31 21:05:31.058090206 +0100 *************** *** 17,23 **** int gui_mch_is_blinking(void); int gui_mch_is_blink_off(void); void gui_mch_set_blinking(long wait, long on, long off); ! void gui_mch_stop_blink(void); void gui_mch_start_blink(void); void gui_mch_getmouse(int *x, int *y); void gui_mch_setmouse(int x, int y); --- 17,23 ---- int gui_mch_is_blinking(void); int gui_mch_is_blink_off(void); void gui_mch_set_blinking(long wait, long on, long off); ! void gui_mch_stop_blink(int may_call_gui_update_cursor); void gui_mch_start_blink(void); void gui_mch_getmouse(int *x, int *y); void gui_mch_setmouse(int x, int y); *** ../vim-8.0.1449/src/gui_photon.c 2017-07-23 16:45:05.673761155 +0200 --- src/gui_photon.c 2018-01-31 21:06:15.765709889 +0100 *************** *** 383,389 **** else { gui_focus_change(FALSE); ! gui_mch_stop_blink(); } break; --- 383,389 ---- else { gui_focus_change(FALSE); ! gui_mch_stop_blink(TRUE); } break; *************** *** 2273,2283 **** } void ! gui_mch_stop_blink(void) { PtSetResource(gui_ph_timer_cursor, Pt_ARG_TIMER_INITIAL, 0, 0); ! if (blink_state == BLINK_OFF) gui_update_cursor(TRUE, FALSE); blink_state = BLINK_NONE; --- 2273,2283 ---- } void ! gui_mch_stop_blink(int may_call_gui_update_cursor) { PtSetResource(gui_ph_timer_cursor, Pt_ARG_TIMER_INITIAL, 0, 0); ! if (blink_state == BLINK_OFF && may_call_gui_update_cursor) gui_update_cursor(TRUE, FALSE); blink_state = BLINK_NONE; *** ../vim-8.0.1449/src/proto/gui_photon.pro 2017-07-23 16:45:05.673761155 +0200 --- src/proto/gui_photon.pro 2018-01-31 21:06:28.401602749 +0100 *************** *** 44,50 **** int gui_mch_is_blink_off(void); void gui_mch_set_blinking(long wait, long on, long off); void gui_mch_start_blink(void); ! void gui_mch_stop_blink(void); void gui_mch_beep(void); void gui_mch_flash(int msec); void gui_mch_flush(void); --- 44,50 ---- int gui_mch_is_blink_off(void); void gui_mch_set_blinking(long wait, long on, long off); void gui_mch_start_blink(void); ! void gui_mch_stop_blink(int may_call_gui_update_cursor); void gui_mch_beep(void); void gui_mch_flash(int msec); void gui_mch_flush(void); *** ../vim-8.0.1449/src/gui_w32.c 2018-01-31 20:51:40.305835913 +0100 --- src/gui_w32.c 2018-01-31 21:07:03.301307582 +0100 *************** *** 638,647 **** * Stop the cursor blinking. Show the cursor if it wasn't shown. */ void ! gui_mch_stop_blink(void) { gui_mswin_rm_blink_timer(); ! if (blink_state == BLINK_OFF) { gui_update_cursor(TRUE, FALSE); gui_mch_flush(); --- 638,647 ---- * Stop the cursor blinking. Show the cursor if it wasn't shown. */ void ! gui_mch_stop_blink(int may_call_gui_update_cursor) { gui_mswin_rm_blink_timer(); ! if (blink_state == BLINK_OFF && may_call_gui_update_cursor) { gui_update_cursor(TRUE, FALSE); gui_mch_flush(); *************** *** 2111,2117 **** if (gui.in_focus) gui_mch_start_blink(); else ! gui_mch_stop_blink(); focus = gui.in_focus; } --- 2111,2117 ---- if (gui.in_focus) gui_mch_start_blink(); else ! gui_mch_stop_blink(TRUE); focus = gui.in_focus; } *** ../vim-8.0.1449/src/proto/gui_w32.pro 2017-11-26 14:29:24.847931598 +0100 --- src/proto/gui_w32.pro 2018-01-31 21:07:08.057267442 +0100 *************** *** 3,9 **** int gui_mch_is_blinking(void); int gui_mch_is_blink_off(void); void gui_mch_set_blinking(long wait, long on, long off); ! void gui_mch_stop_blink(void); void gui_mch_start_blink(void); LRESULT WINAPI vim_WindowProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); void gui_mch_new_colors(void); --- 3,9 ---- int gui_mch_is_blinking(void); int gui_mch_is_blink_off(void); void gui_mch_set_blinking(long wait, long on, long off); ! void gui_mch_stop_blink(int may_call_gui_update_cursor); void gui_mch_start_blink(void); LRESULT WINAPI vim_WindowProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); void gui_mch_new_colors(void); *** ../vim-8.0.1449/src/gui_x11.c 2017-11-18 22:13:04.745908763 +0100 --- src/gui_x11.c 2018-01-31 21:07:56.388860580 +0100 *************** *** 2746,2752 **** if (gui.in_focus) gui_mch_start_blink(); else ! gui_mch_stop_blink(); focus = gui.in_focus; } --- 2746,2752 ---- if (gui.in_focus) gui_mch_start_blink(); else ! gui_mch_stop_blink(TRUE); focus = gui.in_focus; } *************** *** 3105,3118 **** * Stop the cursor blinking. Show the cursor if it wasn't shown. */ void ! gui_mch_stop_blink(void) { if (blink_timer != (XtIntervalId)0) { XtRemoveTimeOut(blink_timer); blink_timer = (XtIntervalId)0; } ! if (blink_state == BLINK_OFF) gui_update_cursor(TRUE, FALSE); blink_state = BLINK_NONE; } --- 3105,3118 ---- * Stop the cursor blinking. Show the cursor if it wasn't shown. */ void ! gui_mch_stop_blink(int may_call_gui_update_cursor) { if (blink_timer != (XtIntervalId)0) { XtRemoveTimeOut(blink_timer); blink_timer = (XtIntervalId)0; } ! if (blink_state == BLINK_OFF && may_call_gui_update_cursor) gui_update_cursor(TRUE, FALSE); blink_state = BLINK_NONE; } *** ../vim-8.0.1449/src/proto/gui_x11.pro 2017-07-23 16:45:05.669761183 +0200 --- src/proto/gui_x11.pro 2018-01-31 21:08:00.552825615 +0100 *************** *** 57,63 **** int gui_mch_is_blinking(void); int gui_mch_is_blink_off(void); void gui_mch_set_blinking(long waittime, long on, long off); ! void gui_mch_stop_blink(void); void gui_mch_start_blink(void); guicolor_T gui_mch_get_rgb(guicolor_T pixel); void gui_x11_callbacks(Widget textArea, Widget vimForm); --- 57,63 ---- int gui_mch_is_blinking(void); int gui_mch_is_blink_off(void); void gui_mch_set_blinking(long waittime, long on, long off); ! void gui_mch_stop_blink(int may_call_gui_update_cursor); void gui_mch_start_blink(void); guicolor_T gui_mch_get_rgb(guicolor_T pixel); void gui_x11_callbacks(Widget textArea, Widget vimForm); *** ../vim-8.0.1449/src/version.c 2018-01-31 20:51:40.313835826 +0100 --- src/version.c 2018-01-31 21:08:35.376533705 +0100 *************** *** 773,774 **** --- 773,776 ---- { /* Add new patch number below this line */ + /**/ + 1450, /**/ -- FIRST HEAD: Oh! quick! get the sword out I want to cut his head off. THIRD HEAD: Oh, cut your own head off. SECOND HEAD: Yes - do us all a favour. "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ an exciting new programming language -- http://www.Zimbu.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///