diff --git a/src/findfile.c b/src/findfile.c
index 9ce733c..017e1c6 100644
--- a/src/findfile.c
+++ b/src/findfile.c
@@ -1426,11 +1426,11 @@
 {
     // check for NULL pointer, not to return an error to the user, but
     // to prevent a crash
-    if (stack_ptr != NULL)
-    {
-	stack_ptr->ffs_prev = search_ctx->ffsc_stack_ptr;
-	search_ctx->ffsc_stack_ptr = stack_ptr;
-    }
+    if (stack_ptr == NULL)
+	return;
+
+    stack_ptr->ffs_prev = search_ctx->ffsc_stack_ptr;
+    search_ctx->ffsc_stack_ptr = stack_ptr;
 }
 
 /*
diff --git a/src/fold.c b/src/fold.c
index d722a56..61bffb5 100644
--- a/src/fold.c
+++ b/src/fold.c
@@ -513,13 +513,14 @@
     void
 foldCheckClose(void)
 {
-    if (*p_fcl != NUL)	// can only be "all" right now
-    {
-	checkupdate(curwin);
-	if (checkCloseRec(&curwin->w_folds, curwin->w_cursor.lnum,
-							(int)curwin->w_p_fdl))
-	    changed_window_setting();
-    }
+    if (*p_fcl == NUL)
+	return;
+
+    // can only be "all" right now
+    checkupdate(curwin);
+    if (checkCloseRec(&curwin->w_folds, curwin->w_cursor.lnum,
+		(int)curwin->w_p_fdl))
+	changed_window_setting();
 }
 
 // checkCloseRec() {{{2
@@ -1077,16 +1078,17 @@
     }
     if (hasFolding(start->lnum, &start->lnum, NULL))
 	start->col = 0;
-    if (hasFolding(end->lnum, NULL, &end->lnum))
-    {
-	ptr = ml_get(end->lnum);
-	end->col = (colnr_T)STRLEN(ptr);
-	if (end->col > 0 && *p_sel == 'o')
-	    --end->col;
-	// prevent cursor from moving on the trail byte
-	if (has_mbyte)
-	    mb_adjust_cursor();
-    }
+
+    if (!hasFolding(end->lnum, NULL, &end->lnum))
+	return;
+
+    ptr = ml_get(end->lnum);
+    end->col = (colnr_T)STRLEN(ptr);
+    if (end->col > 0 && *p_sel == 'o')
+	--end->col;
+    // prevent cursor from moving on the trail byte
+    if (has_mbyte)
+	mb_adjust_cursor();
 }
 
 // cursor_foldstart() {{{2
@@ -1215,11 +1217,11 @@
     static void
 checkupdate(win_T *wp)
 {
-    if (wp->w_foldinvalid)
-    {
-	foldUpdate(wp, (linenr_T)1, (linenr_T)MAXLNUM); // will update all
-	wp->w_foldinvalid = FALSE;
-    }
+    if (!wp->w_foldinvalid)
+	return;
+
+    foldUpdate(wp, (linenr_T)1, (linenr_T)MAXLNUM); // will update all
+    wp->w_foldinvalid = FALSE;
 }
 
 // setFoldRepeat() {{{2
diff --git a/src/getchar.c b/src/getchar.c
index 3fd518b..2fb9baa 100644
--- a/src/getchar.c
+++ b/src/getchar.c
@@ -259,11 +259,11 @@
     if (buf->bh_curr == NULL)
 	return;  // nothing to delete
     len = (int)STRLEN(buf->bh_curr->b_str);
-    if (len >= slen)
-    {
-	buf->bh_curr->b_str[len - slen] = NUL;
-	buf->bh_space += slen;
-    }
+    if (len < slen)
+	return;
+
+    buf->bh_curr->b_str[len - slen] = NUL;
+    buf->bh_space += slen;
 }
 
 /*
@@ -478,12 +478,12 @@
     void
 ResetRedobuff(void)
 {
-    if (!block_redo)
-    {
-	free_buff(&old_redobuff);
-	old_redobuff = redobuff;
-	redobuff.bh_first.b_next = NULL;
-    }
+    if (block_redo)
+	return;
+
+    free_buff(&old_redobuff);
+    old_redobuff = redobuff;
+    redobuff.bh_first.b_next = NULL;
 }
 
 /*
@@ -493,15 +493,15 @@
     void
 CancelRedo(void)
 {
-    if (!block_redo)
-    {
-	free_buff(&redobuff);
-	redobuff = old_redobuff;
-	old_redobuff.bh_first.b_next = NULL;
-	start_stuff();
-	while (read_readbuffers(TRUE) != NUL)
-	    ;
-    }
+    if (block_redo)
+	return;
+
+    free_buff(&redobuff);
+    redobuff = old_redobuff;
+    old_redobuff.bh_first.b_next = NULL;
+    start_stuff();
+    while (read_readbuffers(TRUE) != NUL)
+	;
 }
 
 /*
@@ -520,11 +520,11 @@
 
     // Make a copy, so that ":normal ." in a function works.
     s = get_buffcont(&save_redo->sr_redobuff, FALSE);
-    if (s != NULL)
-    {
-	add_buff(&redobuff, s, -1L);
-	vim_free(s);
-    }
+    if (s == NULL)
+	return;
+
+    add_buff(&redobuff, s, -1L);
+    vim_free(s);
 }
 
 /*
@@ -944,15 +944,15 @@
     static void
 init_typebuf(void)
 {
-    if (typebuf.tb_buf == NULL)
-    {
-	typebuf.tb_buf = typebuf_init;
-	typebuf.tb_noremap = noremapbuf_init;
-	typebuf.tb_buflen = TYPELEN_INIT;
-	typebuf.tb_len = 0;
-	typebuf.tb_off = MAXMAPLEN + 4;
-	typebuf.tb_change_cnt = 1;
-    }
+    if (typebuf.tb_buf != NULL)
+	return;
+
+    typebuf.tb_buf = typebuf_init;
+    typebuf.tb_noremap = noremapbuf_init;
+    typebuf.tb_buflen = TYPELEN_INIT;
+    typebuf.tb_len = 0;
+    typebuf.tb_off = MAXMAPLEN + 4;
+    typebuf.tb_change_cnt = 1;
 }
 
 /*
@@ -1324,11 +1324,11 @@
     void
 ungetchars(int len)
 {
-    if (reg_recording != 0)
-    {
-	delete_buff_tail(&recordbuff, len);
-	last_recorded_len -= len;
-    }
+    if (reg_recording == 0)
+	return;
+
+    delete_buff_tail(&recordbuff, len);
+    last_recorded_len -= len;
 }
 
 /*
@@ -2230,23 +2230,23 @@
 {
     getchar_common(argvars, rettv);
 
-    if (rettv->v_type == VAR_NUMBER)
-    {
-	char_u		temp[7];   // mbyte-char: 6, NUL: 1
-	varnumber_T	n = rettv->vval.v_number;
-	int		i = 0;
+    if (rettv->v_type != VAR_NUMBER)
+	return;
 
-	if (n != 0)
-	{
-	    if (has_mbyte)
-		i += (*mb_char2bytes)(n, temp + i);
-	    else
-		temp[i++] = n;
-	}
-	temp[i++] = NUL;
-	rettv->v_type = VAR_STRING;
-	rettv->vval.v_string = vim_strsave(temp);
+    char_u		temp[7];   // mbyte-char: 6, NUL: 1
+    varnumber_T	n = rettv->vval.v_number;
+    int		i = 0;
+
+    if (n != 0)
+    {
+	if (has_mbyte)
+	    i += (*mb_char2bytes)(n, temp + i);
+	else
+	    temp[i++] = n;
     }
+    temp[i++] = NUL;
+    rettv->v_type = VAR_STRING;
+    rettv->vval.v_string = vim_strsave(temp);
 }
 
 /*
@@ -4031,10 +4031,10 @@
     void
 reset_last_used_map(mapblock_T *mp)
 {
-    if (last_used_map == mp)
-    {
-	last_used_map = NULL;
-	last_used_sid = -1;
-    }
+    if (last_used_map != mp)
+	return;
+
+    last_used_map = NULL;
+    last_used_sid = -1;
 }
 #endif
diff --git a/src/gui.c b/src/gui.c
index 585ead0..b891005 100644
--- a/src/gui.c
+++ b/src/gui.c
@@ -1171,71 +1171,73 @@
 	return;
 
     gui_check_pos();
-    if (!gui.cursor_is_valid || force
-		    || gui.row != gui.cursor_row || gui.col != gui.cursor_col)
-    {
-	gui_undraw_cursor();
 
-	// If a cursor-less sleep is ongoing, leave the cursor invisible
-	if (cursor_is_sleeping())
-	    return;
+    if (gui.cursor_is_valid && !force
+		&& gui.row == gui.cursor_row && gui.col == gui.cursor_col)
+	return;
 
-	if (gui.row < 0)
-	    return;
+    gui_undraw_cursor();
+
+    // If a cursor-less sleep is ongoing, leave the cursor invisible
+    if (cursor_is_sleeping())
+	return;
+
+    if (gui.row < 0)
+	return;
 #ifdef HAVE_INPUT_METHOD
-	if (gui.row != gui.cursor_row || gui.col != gui.cursor_col)
-	    im_set_position(gui.row, gui.col);
+    if (gui.row != gui.cursor_row || gui.col != gui.cursor_col)
+	im_set_position(gui.row, gui.col);
 #endif
-	gui.cursor_row = gui.row;
-	gui.cursor_col = gui.col;
+    gui.cursor_row = gui.row;
+    gui.cursor_col = gui.col;
 
-	// Only write to the screen after ScreenLines[] has been initialized
-	if (!screen_cleared || ScreenLines == NULL)
-	    return;
+    // Only write to the screen after ScreenLines[] has been initialized
+    if (!screen_cleared || ScreenLines == NULL)
+	return;
 
-	// Clear the selection if we are about to write over it
-	if (clear_selection)
-	    clip_may_clear_selection(gui.row, gui.row);
-	// Check that the cursor is inside the shell (resizing may have made
-	// it invalid)
-	if (gui.row >= screen_Rows || gui.col >= screen_Columns)
-	    return;
+    // Clear the selection if we are about to write over it
+    if (clear_selection)
+	clip_may_clear_selection(gui.row, gui.row);
+    // Check that the cursor is inside the shell (resizing may have made
+    // it invalid)
+    if (gui.row >= screen_Rows || gui.col >= screen_Columns)
+	return;
 
-	gui.cursor_is_valid = TRUE;
+    gui.cursor_is_valid = TRUE;
 
-	/*
-	 * How the cursor is drawn depends on the current mode.
-	 * When in a terminal window use the shape/color specified there.
-	 */
+    /*
+     * How the cursor is drawn depends on the current mode.
+     * When in a terminal window use the shape/color specified there.
+     */
 #ifdef FEAT_TERMINAL
-	if (terminal_is_active())
-	    shape = term_get_cursor_shape(&shape_fg, &shape_bg);
-	else
+    if (terminal_is_active())
+	shape = term_get_cursor_shape(&shape_fg, &shape_bg);
+    else
 #endif
-	    shape = &shape_table[get_shape_idx(FALSE)];
-	if (State & MODE_LANGMAP)
-	    id = shape->id_lm;
-	else
-	    id = shape->id;
+	shape = &shape_table[get_shape_idx(FALSE)];
+    if (State & MODE_LANGMAP)
+	id = shape->id_lm;
+    else
+	id = shape->id;
 
-	// get the colors and attributes for the cursor.  Default is inverted
-	cfg = INVALCOLOR;
-	cbg = INVALCOLOR;
-	cattr = HL_INVERSE;
-	gui_mch_set_blinking(shape->blinkwait,
-			     shape->blinkon,
-			     shape->blinkoff);
-	if (shape->blinkwait == 0 || shape->blinkon == 0
-						       || shape->blinkoff == 0)
-	    gui_mch_stop_blink(FALSE);
+    // get the colors and attributes for the cursor.  Default is inverted
+    cfg = INVALCOLOR;
+    cbg = INVALCOLOR;
+    cattr = HL_INVERSE;
+    gui_mch_set_blinking(shape->blinkwait,
+	    shape->blinkon,
+	    shape->blinkoff);
+    if (shape->blinkwait == 0 || shape->blinkon == 0
+	    || shape->blinkoff == 0)
+	gui_mch_stop_blink(FALSE);
 #ifdef FEAT_TERMINAL
-	if (shape_bg != INVALCOLOR)
-	{
-	    cattr = 0;
-	    cfg = shape_fg;
-	    cbg = shape_bg;
-	}
-	else
+    if (shape_bg != INVALCOLOR)
+    {
+	cattr = 0;
+	cfg = shape_fg;
+	cbg = shape_bg;
+    }
+    else
 #endif
 	if (id > 0)
 	{
@@ -1251,7 +1253,7 @@
 # else
 			im_get_status()
 # endif
-			)
+		   )
 		{
 		    iid = syn_name2id((char_u *)"CursorIM");
 		    if (iid > 0)
@@ -1267,132 +1269,131 @@
 #endif
 	}
 
-	/*
-	 * Get the attributes for the character under the cursor.
-	 * When no cursor color was given, use the character color.
-	 */
-	attr = ScreenAttrs[LineOffset[gui.row] + gui.col];
-	if (attr > HL_ALL)
-	    aep = syn_gui_attr2entry(attr);
-	if (aep != NULL)
-	{
-	    attr = aep->ae_attr;
-	    if (cfg == INVALCOLOR)
-		cfg = ((attr & HL_INVERSE)  ? aep->ae_u.gui.bg_color
-					    : aep->ae_u.gui.fg_color);
-	    if (cbg == INVALCOLOR)
-		cbg = ((attr & HL_INVERSE)  ? aep->ae_u.gui.fg_color
-					    : aep->ae_u.gui.bg_color);
-	}
+    /*
+     * Get the attributes for the character under the cursor.
+     * When no cursor color was given, use the character color.
+     */
+    attr = ScreenAttrs[LineOffset[gui.row] + gui.col];
+    if (attr > HL_ALL)
+	aep = syn_gui_attr2entry(attr);
+    if (aep != NULL)
+    {
+	attr = aep->ae_attr;
 	if (cfg == INVALCOLOR)
-	    cfg = (attr & HL_INVERSE) ? gui.back_pixel : gui.norm_pixel;
+	    cfg = ((attr & HL_INVERSE)  ? aep->ae_u.gui.bg_color
+		    : aep->ae_u.gui.fg_color);
 	if (cbg == INVALCOLOR)
-	    cbg = (attr & HL_INVERSE) ? gui.norm_pixel : gui.back_pixel;
+	    cbg = ((attr & HL_INVERSE)  ? aep->ae_u.gui.fg_color
+		    : aep->ae_u.gui.bg_color);
+    }
+    if (cfg == INVALCOLOR)
+	cfg = (attr & HL_INVERSE) ? gui.back_pixel : gui.norm_pixel;
+    if (cbg == INVALCOLOR)
+	cbg = (attr & HL_INVERSE) ? gui.norm_pixel : gui.back_pixel;
 
 #ifdef FEAT_XIM
-	if (aep != NULL)
-	{
-	    xim_bg_color = ((attr & HL_INVERSE) ? aep->ae_u.gui.fg_color
-						: aep->ae_u.gui.bg_color);
-	    xim_fg_color = ((attr & HL_INVERSE) ? aep->ae_u.gui.bg_color
-						: aep->ae_u.gui.fg_color);
-	    if (xim_bg_color == INVALCOLOR)
-		xim_bg_color = (attr & HL_INVERSE) ? gui.norm_pixel
-						   : gui.back_pixel;
-	    if (xim_fg_color == INVALCOLOR)
-		xim_fg_color = (attr & HL_INVERSE) ? gui.back_pixel
-						   : gui.norm_pixel;
-	}
-	else
-	{
+    if (aep != NULL)
+    {
+	xim_bg_color = ((attr & HL_INVERSE) ? aep->ae_u.gui.fg_color
+		: aep->ae_u.gui.bg_color);
+	xim_fg_color = ((attr & HL_INVERSE) ? aep->ae_u.gui.bg_color
+		: aep->ae_u.gui.fg_color);
+	if (xim_bg_color == INVALCOLOR)
 	    xim_bg_color = (attr & HL_INVERSE) ? gui.norm_pixel
-					       : gui.back_pixel;
+		: gui.back_pixel;
+	if (xim_fg_color == INVALCOLOR)
 	    xim_fg_color = (attr & HL_INVERSE) ? gui.back_pixel
-					       : gui.norm_pixel;
-	}
+		: gui.norm_pixel;
+    }
+    else
+    {
+	xim_bg_color = (attr & HL_INVERSE) ? gui.norm_pixel
+	    : gui.back_pixel;
+	xim_fg_color = (attr & HL_INVERSE) ? gui.back_pixel
+	    : gui.norm_pixel;
+    }
 #endif
 
-	attr &= ~HL_INVERSE;
-	if (cattr & HL_INVERSE)
-	{
-	    cc = cbg;
-	    cbg = cfg;
-	    cfg = cc;
-	}
-	cattr &= ~HL_INVERSE;
+    attr &= ~HL_INVERSE;
+    if (cattr & HL_INVERSE)
+    {
+	cc = cbg;
+	cbg = cfg;
+	cfg = cc;
+    }
+    cattr &= ~HL_INVERSE;
 
+    /*
+     * When we don't have window focus, draw a hollow cursor.
+     */
+    if (!gui.in_focus)
+    {
+	gui_mch_draw_hollow_cursor(cbg);
+	return;
+    }
+
+    old_hl_mask = gui.highlight_mask;
+    if (shape->shape == SHAPE_BLOCK)
+    {
 	/*
-	 * When we don't have window focus, draw a hollow cursor.
+	 * Draw the text character with the cursor colors.	Use the
+	 * character attributes plus the cursor attributes.
 	 */
-	if (!gui.in_focus)
+	gui.highlight_mask = (cattr | attr);
+	(void)gui_screenchar(LineOffset[gui.row] + gui.col,
+		GUI_MON_IS_CURSOR | GUI_MON_NOCLEAR, cfg, cbg, 0);
+    }
+    else
+    {
+#if defined(FEAT_RIGHTLEFT)
+	int	    col_off = FALSE;
+#endif
+	/*
+	 * First draw the partial cursor, then overwrite with the text
+	 * character, using a transparent background.
+	 */
+	if (shape->shape == SHAPE_VER)
 	{
-	    gui_mch_draw_hollow_cursor(cbg);
-	    return;
-	}
-
-	old_hl_mask = gui.highlight_mask;
-	if (shape->shape == SHAPE_BLOCK)
-	{
-	    /*
-	     * Draw the text character with the cursor colors.	Use the
-	     * character attributes plus the cursor attributes.
-	     */
-	    gui.highlight_mask = (cattr | attr);
-	    (void)gui_screenchar(LineOffset[gui.row] + gui.col,
-			GUI_MON_IS_CURSOR | GUI_MON_NOCLEAR, cfg, cbg, 0);
+	    cur_height = gui.char_height;
+	    cur_width = (gui.char_width * shape->percentage + 99) / 100;
 	}
 	else
 	{
-#if defined(FEAT_RIGHTLEFT)
-	    int	    col_off = FALSE;
-#endif
-	    /*
-	     * First draw the partial cursor, then overwrite with the text
-	     * character, using a transparent background.
-	     */
-	    if (shape->shape == SHAPE_VER)
-	    {
-		cur_height = gui.char_height;
-		cur_width = (gui.char_width * shape->percentage + 99) / 100;
-	    }
-	    else
-	    {
-		cur_height = (gui.char_height * shape->percentage + 99) / 100;
-		cur_width = gui.char_width;
-	    }
-	    if (has_mbyte && (*mb_off2cells)(LineOffset[gui.row] + gui.col,
-				    LineOffset[gui.row] + screen_Columns) > 1)
-	    {
-		// Double wide character.
-		if (shape->shape != SHAPE_VER)
-		    cur_width += gui.char_width;
+	    cur_height = (gui.char_height * shape->percentage + 99) / 100;
+	    cur_width = gui.char_width;
+	}
+	if (has_mbyte && (*mb_off2cells)(LineOffset[gui.row] + gui.col,
+		    LineOffset[gui.row] + screen_Columns) > 1)
+	{
+	    // Double wide character.
+	    if (shape->shape != SHAPE_VER)
+		cur_width += gui.char_width;
 #ifdef FEAT_RIGHTLEFT
-		if (CURSOR_BAR_RIGHT)
-		{
-		    // gui.col points to the left half of the character but
-		    // the vertical line needs to be on the right half.
-		    // A double-wide horizontal line is also drawn from the
-		    // right half in gui_mch_draw_part_cursor().
-		    col_off = TRUE;
-		    ++gui.col;
-		}
-#endif
+	    if (CURSOR_BAR_RIGHT)
+	    {
+		// gui.col points to the left half of the character but
+		// the vertical line needs to be on the right half.
+		// A double-wide horizontal line is also drawn from the
+		// right half in gui_mch_draw_part_cursor().
+		col_off = TRUE;
+		++gui.col;
 	    }
-	    gui_mch_draw_part_cursor(cur_width, cur_height, cbg);
+#endif
+	}
+	gui_mch_draw_part_cursor(cur_width, cur_height, cbg);
 #if defined(FEAT_RIGHTLEFT)
-	    if (col_off)
-		--gui.col;
+	if (col_off)
+	    --gui.col;
 #endif
 
 #ifndef FEAT_GUI_MSWIN	    // doesn't seem to work for MSWindows
-	    gui.highlight_mask = ScreenAttrs[LineOffset[gui.row] + gui.col];
-	    (void)gui_screenchar(LineOffset[gui.row] + gui.col,
-		    GUI_MON_TRS_CURSOR | GUI_MON_NOCLEAR,
-		    (guicolor_T)0, (guicolor_T)0, 0);
+	gui.highlight_mask = ScreenAttrs[LineOffset[gui.row] + gui.col];
+	(void)gui_screenchar(LineOffset[gui.row] + gui.col,
+		GUI_MON_TRS_CURSOR | GUI_MON_NOCLEAR,
+		(guicolor_T)0, (guicolor_T)0, 0);
 #endif
-	}
-	gui.highlight_mask = old_hl_mask;
     }
+    gui.highlight_mask = old_hl_mask;
 }
 
 #if defined(FEAT_MENU) || defined(PROTO)
@@ -2054,13 +2055,13 @@
     void
 gui_dont_update_cursor(int undraw)
 {
-    if (gui.in_use)
-    {
-	// Undraw the cursor now, we probably can't do it after the change.
-	if (undraw)
-	    gui_undraw_cursor();
-	can_update_cursor = FALSE;
-    }
+    if (!gui.in_use)
+	return;
+
+    // Undraw the cursor now, we probably can't do it after the change.
+    if (undraw)
+	gui_undraw_cursor();
+    can_update_cursor = FALSE;
 }
 
     void
@@ -2679,23 +2680,23 @@
     void
 gui_undraw_cursor(void)
 {
-    if (gui.cursor_is_valid)
-    {
-	// Always redraw the character just before if there is one, because
-	// with some fonts and characters there can be a one pixel overlap.
-	int startcol = gui.cursor_col > 0 ? gui.cursor_col - 1 : gui.cursor_col;
-	int endcol = gui.cursor_col;
+    if (!gui.cursor_is_valid)
+	return;
+
+    // Always redraw the character just before if there is one, because
+    // with some fonts and characters there can be a one pixel overlap.
+    int startcol = gui.cursor_col > 0 ? gui.cursor_col - 1 : gui.cursor_col;
+    int endcol = gui.cursor_col;
 
 #ifdef FEAT_GUI_GTK
-	gui_adjust_undraw_cursor_for_ligatures(&startcol, &endcol);
+    gui_adjust_undraw_cursor_for_ligatures(&startcol, &endcol);
 #endif
-	gui_redraw_block(gui.cursor_row, startcol,
-				      gui.cursor_row, endcol, GUI_MON_NOCLEAR);
+    gui_redraw_block(gui.cursor_row, startcol,
+	    gui.cursor_row, endcol, GUI_MON_NOCLEAR);
 
-	// Cursor_is_valid is reset when the cursor is undrawn, also reset it
-	// here in case it wasn't needed to undraw it.
-	gui.cursor_is_valid = FALSE;
-    }
+    // Cursor_is_valid is reset when the cursor is undrawn, also reset it
+    // here in case it wasn't needed to undraw it.
+    gui.cursor_is_valid = FALSE;
 }
 
     void
@@ -3559,137 +3560,137 @@
 		break;
 	}
 
-    if (gui.in_use)
-    {
-	need_set_size = 0;
-	fix_size = FALSE;
+    if (!gui.in_use)
+	return;
+
+    need_set_size = 0;
+    fix_size = FALSE;
 
 #ifdef FEAT_GUI_DARKTHEME
-	if (using_dark_theme != prev_dark_theme)
-	{
-	    gui_mch_set_dark_theme(using_dark_theme);
-	    prev_dark_theme = using_dark_theme;
-	}
+    if (using_dark_theme != prev_dark_theme)
+    {
+	gui_mch_set_dark_theme(using_dark_theme);
+	prev_dark_theme = using_dark_theme;
+    }
 #endif
 
 #ifdef FEAT_GUI_TABLINE
-	// Update the GUI tab line, it may appear or disappear.  This may
-	// cause the non-GUI tab line to disappear or appear.
-	using_tabline = gui_has_tabline();
-	if (!gui_mch_showing_tabline() != !using_tabline)
-	{
-	    // We don't want a resize event change "Rows" here, save and
-	    // restore it.  Resizing is handled below.
-	    i = Rows;
-	    gui_update_tabline();
-	    Rows = i;
-	    need_set_size |= RESIZE_VERT;
-	    if (using_tabline)
-		fix_size = TRUE;
-	    if (!gui_use_tabline())
-		redraw_tabline = TRUE;    // may draw non-GUI tab line
-	}
+    // Update the GUI tab line, it may appear or disappear.  This may
+    // cause the non-GUI tab line to disappear or appear.
+    using_tabline = gui_has_tabline();
+    if (!gui_mch_showing_tabline() != !using_tabline)
+    {
+	// We don't want a resize event change "Rows" here, save and
+	// restore it.  Resizing is handled below.
+	i = Rows;
+	gui_update_tabline();
+	Rows = i;
+	need_set_size |= RESIZE_VERT;
+	if (using_tabline)
+	    fix_size = TRUE;
+	if (!gui_use_tabline())
+	    redraw_tabline = TRUE;    // may draw non-GUI tab line
+    }
 #endif
 
-	for (i = 0; i < 3; i++)
+    for (i = 0; i < 3; i++)
+    {
+	// The scrollbar needs to be updated when it is shown/unshown and
+	// when switching tab pages.  But the size only changes when it's
+	// shown/unshown.  Thus we need two places to remember whether a
+	// scrollbar is there or not.
+	if (gui.which_scrollbars[i] != prev_which_scrollbars[i]
+		|| gui.which_scrollbars[i]
+		!= curtab->tp_prev_which_scrollbars[i])
 	{
-	    // The scrollbar needs to be updated when it is shown/unshown and
-	    // when switching tab pages.  But the size only changes when it's
-	    // shown/unshown.  Thus we need two places to remember whether a
-	    // scrollbar is there or not.
-	    if (gui.which_scrollbars[i] != prev_which_scrollbars[i]
-		    || gui.which_scrollbars[i]
-					!= curtab->tp_prev_which_scrollbars[i])
+	    if (i == SBAR_BOTTOM)
+		gui_mch_enable_scrollbar(&gui.bottom_sbar,
+			gui.which_scrollbars[i]);
+	    else
+	    {
+		FOR_ALL_WINDOWS(wp)
+		    gui_do_scrollbar(wp, i, gui.which_scrollbars[i]);
+	    }
+	    if (gui.which_scrollbars[i] != prev_which_scrollbars[i])
 	    {
 		if (i == SBAR_BOTTOM)
-		    gui_mch_enable_scrollbar(&gui.bottom_sbar,
-						     gui.which_scrollbars[i]);
+		    need_set_size |= RESIZE_VERT;
 		else
-		{
-		    FOR_ALL_WINDOWS(wp)
-			gui_do_scrollbar(wp, i, gui.which_scrollbars[i]);
-		}
-		if (gui.which_scrollbars[i] != prev_which_scrollbars[i])
-		{
-		    if (i == SBAR_BOTTOM)
-			need_set_size |= RESIZE_VERT;
-		    else
-			need_set_size |= RESIZE_HOR;
-		    if (gui.which_scrollbars[i])
-			fix_size = TRUE;
-		}
+		    need_set_size |= RESIZE_HOR;
+		if (gui.which_scrollbars[i])
+		    fix_size = TRUE;
 	    }
-	    curtab->tp_prev_which_scrollbars[i] = gui.which_scrollbars[i];
-	    prev_which_scrollbars[i] = gui.which_scrollbars[i];
 	}
+	curtab->tp_prev_which_scrollbars[i] = gui.which_scrollbars[i];
+	prev_which_scrollbars[i] = gui.which_scrollbars[i];
+    }
 
 #ifdef FEAT_MENU
-	if (gui.menu_is_active != prev_menu_is_active)
-	{
-	    // We don't want a resize event change "Rows" here, save and
-	    // restore it.  Resizing is handled below.
-	    i = Rows;
-	    gui_mch_enable_menu(gui.menu_is_active);
-	    Rows = i;
-	    prev_menu_is_active = gui.menu_is_active;
-	    need_set_size |= RESIZE_VERT;
-	    if (gui.menu_is_active)
-		fix_size = TRUE;
-	}
+    if (gui.menu_is_active != prev_menu_is_active)
+    {
+	// We don't want a resize event change "Rows" here, save and
+	// restore it.  Resizing is handled below.
+	i = Rows;
+	gui_mch_enable_menu(gui.menu_is_active);
+	Rows = i;
+	prev_menu_is_active = gui.menu_is_active;
+	need_set_size |= RESIZE_VERT;
+	if (gui.menu_is_active)
+	    fix_size = TRUE;
+    }
 #endif
 
 #ifdef FEAT_TOOLBAR
-	if (using_toolbar != prev_toolbar)
-	{
-	    gui_mch_show_toolbar(using_toolbar);
-	    prev_toolbar = using_toolbar;
-	    need_set_size |= RESIZE_VERT;
-	    if (using_toolbar)
-		fix_size = TRUE;
-	}
+    if (using_toolbar != prev_toolbar)
+    {
+	gui_mch_show_toolbar(using_toolbar);
+	prev_toolbar = using_toolbar;
+	need_set_size |= RESIZE_VERT;
+	if (using_toolbar)
+	    fix_size = TRUE;
+    }
 #endif
 #if defined(FEAT_MENU) && !(defined(MSWIN) && !defined(FEAT_TEAROFF))
-	if (using_tearoff != prev_tearoff)
-	{
-	    gui_mch_toggle_tearoffs(using_tearoff);
-	    prev_tearoff = using_tearoff;
-	}
+    if (using_tearoff != prev_tearoff)
+    {
+	gui_mch_toggle_tearoffs(using_tearoff);
+	prev_tearoff = using_tearoff;
+    }
 #endif
-	if (need_set_size != 0)
-	{
+    if (need_set_size != 0)
+    {
 #ifdef FEAT_GUI_GTK
-	    long    prev_Columns = Columns;
-	    long    prev_Rows = Rows;
+	long    prev_Columns = Columns;
+	long    prev_Rows = Rows;
 #endif
-	    // Adjust the size of the window to make the text area keep the
-	    // same size and to avoid that part of our window is off-screen
-	    // and a scrollbar can't be used, for example.
-	    gui_set_shellsize(FALSE, fix_size, need_set_size);
+	// Adjust the size of the window to make the text area keep the
+	// same size and to avoid that part of our window is off-screen
+	// and a scrollbar can't be used, for example.
+	gui_set_shellsize(FALSE, fix_size, need_set_size);
 
 #ifdef FEAT_GUI_GTK
-	    // GTK has the annoying habit of sending us resize events when
-	    // changing the window size ourselves.  This mostly happens when
-	    // waiting for a character to arrive, quite unpredictably, and may
-	    // change Columns and Rows when we don't want it.  Wait for a
-	    // character here to avoid this effect.
-	    // If you remove this, please test this command for resizing
-	    // effects (with optional left scrollbar): ":vsp|q|vsp|q|vsp|q".
-	    // Don't do this while starting up though.
-	    // Don't change Rows when adding menu/toolbar/tabline.
-	    // Don't change Columns when adding vertical toolbar.
-	    if (!gui.starting && need_set_size != (RESIZE_VERT | RESIZE_HOR))
-		(void)char_avail();
-	    if ((need_set_size & RESIZE_VERT) == 0)
-		Rows = prev_Rows;
-	    if ((need_set_size & RESIZE_HOR) == 0)
-		Columns = prev_Columns;
+	// GTK has the annoying habit of sending us resize events when
+	// changing the window size ourselves.  This mostly happens when
+	// waiting for a character to arrive, quite unpredictably, and may
+	// change Columns and Rows when we don't want it.  Wait for a
+	// character here to avoid this effect.
+	// If you remove this, please test this command for resizing
+	// effects (with optional left scrollbar): ":vsp|q|vsp|q|vsp|q".
+	// Don't do this while starting up though.
+	// Don't change Rows when adding menu/toolbar/tabline.
+	// Don't change Columns when adding vertical toolbar.
+	if (!gui.starting && need_set_size != (RESIZE_VERT | RESIZE_HOR))
+	    (void)char_avail();
+	if ((need_set_size & RESIZE_VERT) == 0)
+	    Rows = prev_Rows;
+	if ((need_set_size & RESIZE_HOR) == 0)
+	    Columns = prev_Columns;
 #endif
-	}
-	// When the console tabline appears or disappears the window positions
-	// change.
-	if (firstwin->w_winrow != tabline_height())
-	    shell_new_rows();	// recompute window positions and heights
     }
+    // When the console tabline appears or disappears the window positions
+    // change.
+    if (firstwin->w_winrow != tabline_height())
+	shell_new_rows();	// recompute window positions and heights
 }
 
 #if defined(FEAT_GUI_TABLINE) || defined(PROTO)
@@ -4768,7 +4769,7 @@
 	    return;
 
 	/*
-	 * format a mouse click on status line input
+	 * Format a mouse click on status line input,
 	 * ala gui_send_mouse_event(0, x, y, 0, 0);
 	 * Trick: Use a column number -1, so that get_pseudo_mouse_code() will
 	 * generate a K_LEFTMOUSE_NM key code.
@@ -4852,13 +4853,14 @@
     need_mouse_correct = FALSE;
 
     wp = gui_mouse_window(IGNORE_POPUP);
-    if (wp != curwin && wp != NULL)	// If in other than current window
-    {
-	validate_cline_row();
-	gui_mch_setmouse((int)W_ENDCOL(curwin) * gui.char_width - 3,
-		(W_WINROW(curwin) + curwin->w_wrow) * gui.char_height
-						     + (gui.char_height) / 2);
-    }
+    if (wp == curwin || wp == NULL)
+	return;
+
+    // If in other than current window
+    validate_cline_row();
+    gui_mch_setmouse((int)W_ENDCOL(curwin) * gui.char_width - 3,
+	    (W_WINROW(curwin) + curwin->w_wrow) * gui.char_height
+	    + (gui.char_height) / 2);
 }
 
 /*
@@ -5014,22 +5016,26 @@
     char_u	*p;
 
     if (isatty(2))
-	fflush(stderr);
-    else if (error_ga.ga_data != NULL)
     {
-	// avoid putting up a message box with blanks only
-	for (p = (char_u *)error_ga.ga_data; *p != NUL; ++p)
-	    if (!isspace(*p))
-	    {
-		// Truncate a very long message, it will go off-screen.
-		if (STRLEN(p) > 2000)
-		    STRCPY(p + 2000 - 14, "...(truncated)");
-		(void)do_dialog(VIM_ERROR, (char_u *)_("Error"),
-				       p, (char_u *)_("&Ok"), 1, NULL, FALSE);
-		break;
-	    }
-	ga_clear(&error_ga);
+	fflush(stderr);
+	return;
     }
+
+    if (error_ga.ga_data == NULL)
+	return;
+
+    // avoid putting up a message box with blanks only
+    for (p = (char_u *)error_ga.ga_data; *p != NUL; ++p)
+	if (!isspace(*p))
+	{
+	    // Truncate a very long message, it will go off-screen.
+	    if (STRLEN(p) > 2000)
+		STRCPY(p + 2000 - 14, "...(truncated)");
+	    (void)do_dialog(VIM_ERROR, (char_u *)_("Error"),
+		    p, (char_u *)_("&Ok"), 1, NULL, FALSE);
+	    break;
+	}
+    ga_clear(&error_ga);
 }
 #endif
 
@@ -5339,12 +5345,12 @@
     int		col = X_2_COL(x);
     win_T	*wp;
 
-    if (row >= 0 && col >= 0)
-    {
-	wp = mouse_find_win(&row, &col, FAIL_POPUP);
-	if (wp != NULL && wp != curwin)
-	    win_goto(wp);
-    }
+    if (row < 0 || col < 0)
+	return;
+
+    wp = mouse_find_win(&row, &col, FAIL_POPUP);
+    if (wp != NULL && wp != curwin)
+	win_goto(wp);
 }
 
 /*
diff --git a/src/gui_beval.c b/src/gui_beval.c
index e1b0e4b..daeac8f 100644
--- a/src/gui_beval.c
+++ b/src/gui_beval.c
@@ -373,39 +373,39 @@
 
     distance = ABS(x - beval->x) + ABS(y - beval->y);
 
-    if (distance > 4)
+    if (distance <= 4)
+	return;
+
+    /*
+     * Moved out of the balloon location: cancel it.
+     * Remember button state
+     */
+    beval->state = state;
+    cancelBalloon(beval);
+
+    // Mouse buttons are pressed - no balloon now
+    if (!(state & ((int)GDK_BUTTON1_MASK | (int)GDK_BUTTON2_MASK
+		    | (int)GDK_BUTTON3_MASK)))
     {
-	/*
-	 * Moved out of the balloon location: cancel it.
-	 * Remember button state
-	 */
-	beval->state = state;
-	cancelBalloon(beval);
+	beval->x = x;
+	beval->y = y;
 
-	// Mouse buttons are pressed - no balloon now
-	if (!(state & ((int)GDK_BUTTON1_MASK | (int)GDK_BUTTON2_MASK
-						    | (int)GDK_BUTTON3_MASK)))
+	if (state & (int)GDK_MOD1_MASK)
 	{
-	    beval->x = x;
-	    beval->y = y;
-
-	    if (state & (int)GDK_MOD1_MASK)
+	    /*
+	     * Alt is pressed -- enter super-evaluate-mode,
+	     * where there is no time delay
+	     */
+	    if (beval->msgCB != NULL)
 	    {
-		/*
-		 * Alt is pressed -- enter super-evaluate-mode,
-		 * where there is no time delay
-		 */
-		if (beval->msgCB != NULL)
-		{
-		    beval->showState = ShS_PENDING;
-		    (*beval->msgCB)(beval, state);
-		}
+		beval->showState = ShS_PENDING;
+		(*beval->msgCB)(beval, state);
 	    }
-	    else
-	    {
-		beval->timerID = g_timeout_add((guint)p_bdlay,
-					       &timeout_cb, beval);
-	    }
+	}
+	else
+	{
+	    beval->timerID = g_timeout_add((guint)p_bdlay,
+		    &timeout_cb, beval);
 	}
     }
 }
@@ -698,17 +698,17 @@
     static void
 requestBalloon(BalloonEval *beval)
 {
-    if (beval->showState != ShS_PENDING)
+    if (beval->showState == ShS_PENDING)
+	return;
+
+    // Determine the beval to display
+    if (beval->msgCB != NULL)
     {
-	// Determine the beval to display
-	if (beval->msgCB != NULL)
-	{
-	    beval->showState = ShS_PENDING;
-	    (*beval->msgCB)(beval, beval->state);
-	}
-	else if (beval->msg != NULL)
-	    drawBalloon(beval);
+	beval->showState = ShS_PENDING;
+	(*beval->msgCB)(beval, beval->state);
     }
+    else if (beval->msg != NULL)
+	drawBalloon(beval);
 }
 
 #ifdef FEAT_GUI_GTK
@@ -900,85 +900,85 @@
     static void
 drawBalloon(BalloonEval *beval)
 {
-    if (beval->msg != NULL)
-    {
-	GtkRequisition	requisition;
-	int		screen_w;
-	int		screen_h;
-	int		screen_x;
-	int		screen_y;
-	int		x;
-	int		y;
-	int		x_offset = EVAL_OFFSET_X;
-	int		y_offset = EVAL_OFFSET_Y;
-	PangoLayout	*layout;
+    if (beval->msg == NULL)
+	return;
+
+    GtkRequisition	requisition;
+    int		screen_w;
+    int		screen_h;
+    int		screen_x;
+    int		screen_y;
+    int		x;
+    int		y;
+    int		x_offset = EVAL_OFFSET_X;
+    int		y_offset = EVAL_OFFSET_Y;
+    PangoLayout	*layout;
 
 # if !GTK_CHECK_VERSION(3,22,2)
-	GdkScreen	*screen;
+    GdkScreen	*screen;
 
-	screen = gtk_widget_get_screen(beval->target);
-	gtk_window_set_screen(GTK_WINDOW(beval->balloonShell), screen);
+    screen = gtk_widget_get_screen(beval->target);
+    gtk_window_set_screen(GTK_WINDOW(beval->balloonShell), screen);
 # endif
-	gui_gtk_get_screen_geom_of_win(beval->target, 0, 0,
-				    &screen_x, &screen_y, &screen_w, &screen_h);
+    gui_gtk_get_screen_geom_of_win(beval->target, 0, 0,
+	    &screen_x, &screen_y, &screen_w, &screen_h);
 # if !GTK_CHECK_VERSION(3,0,0)
-	gtk_widget_ensure_style(beval->balloonShell);
-	gtk_widget_ensure_style(beval->balloonLabel);
+    gtk_widget_ensure_style(beval->balloonShell);
+    gtk_widget_ensure_style(beval->balloonLabel);
 # endif
 
-	set_printable_label_text(GTK_LABEL(beval->balloonLabel), beval->msg);
-	/*
-	 * Dirty trick:  Enable wrapping mode on the label's layout behind its
-	 * back.  This way GtkLabel won't try to constrain the wrap width to a
-	 * builtin maximum value of about 65 Latin characters.
-	 */
-	layout = gtk_label_get_layout(GTK_LABEL(beval->balloonLabel));
+    set_printable_label_text(GTK_LABEL(beval->balloonLabel), beval->msg);
+    /*
+     * Dirty trick:  Enable wrapping mode on the label's layout behind its
+     * back.  This way GtkLabel won't try to constrain the wrap width to a
+     * builtin maximum value of about 65 Latin characters.
+     */
+    layout = gtk_label_get_layout(GTK_LABEL(beval->balloonLabel));
 # ifdef PANGO_WRAP_WORD_CHAR
-	pango_layout_set_wrap(layout, PANGO_WRAP_WORD_CHAR);
+    pango_layout_set_wrap(layout, PANGO_WRAP_WORD_CHAR);
 # else
-	pango_layout_set_wrap(layout, PANGO_WRAP_WORD);
+    pango_layout_set_wrap(layout, PANGO_WRAP_WORD);
 # endif
-	pango_layout_set_width(layout,
-		// try to come up with some reasonable width
-		PANGO_SCALE * CLAMP(gui.num_cols * gui.char_width,
-				    screen_w / 2,
-				    MAX(20, screen_w - 20)));
+    pango_layout_set_width(layout,
+	    // try to come up with some reasonable width
+	    PANGO_SCALE * CLAMP(gui.num_cols * gui.char_width,
+		screen_w / 2,
+		MAX(20, screen_w - 20)));
 
-	// Calculate the balloon's width and height.
+    // Calculate the balloon's width and height.
 # if GTK_CHECK_VERSION(3,0,0)
-	gtk_widget_get_preferred_size(beval->balloonShell, &requisition, NULL);
+    gtk_widget_get_preferred_size(beval->balloonShell, &requisition, NULL);
 # else
-	gtk_widget_size_request(beval->balloonShell, &requisition);
+    gtk_widget_size_request(beval->balloonShell, &requisition);
 # endif
 
-	// Compute position of the balloon area
-	gdk_window_get_origin(gtk_widget_get_window(beval->target), &x, &y);
-	x += beval->x;
-	y += beval->y;
+    // Compute position of the balloon area
+    gdk_window_get_origin(gtk_widget_get_window(beval->target), &x, &y);
+    x += beval->x;
+    y += beval->y;
 
-	// Get out of the way of the mouse pointer
-	if (x + x_offset + requisition.width > screen_x + screen_w)
-	    y_offset += 15;
-	if (y + y_offset + requisition.height > screen_y + screen_h)
-	    y_offset = -requisition.height - EVAL_OFFSET_Y;
+    // Get out of the way of the mouse pointer
+    if (x + x_offset + requisition.width > screen_x + screen_w)
+	y_offset += 15;
+    if (y + y_offset + requisition.height > screen_y + screen_h)
+	y_offset = -requisition.height - EVAL_OFFSET_Y;
 
-	// Sanitize values
-	x = CLAMP(x + x_offset, 0,
-			    MAX(0, screen_x + screen_w - requisition.width));
-	y = CLAMP(y + y_offset, 0,
-			    MAX(0, screen_y + screen_h - requisition.height));
+    // Sanitize values
+    x = CLAMP(x + x_offset, 0,
+	    MAX(0, screen_x + screen_w - requisition.width));
+    y = CLAMP(y + y_offset, 0,
+	    MAX(0, screen_y + screen_h - requisition.height));
 
-	// Show the balloon
+    // Show the balloon
 # if GTK_CHECK_VERSION(3,0,0)
-	gtk_window_move(GTK_WINDOW(beval->balloonShell), x, y);
+    gtk_window_move(GTK_WINDOW(beval->balloonShell), x, y);
 # else
-	gtk_widget_set_uposition(beval->balloonShell, x, y);
+    gtk_widget_set_uposition(beval->balloonShell, x, y);
 # endif
-	gtk_widget_show(beval->balloonShell);
+    gtk_widget_show(beval->balloonShell);
 
-	beval->showState = ShS_SHOWING;
-	gui_mch_update();
-    }
+    beval->showState = ShS_SHOWING;
+    gui_mch_update();
 }
 
 /*
@@ -1060,65 +1060,65 @@
     Position tx;
     Position ty;
 
-    if (beval->msg != NULL)
+    if (beval->msg == NULL)
+	return;
+
+    XmString s;
+    // Show the Balloon
+
+    // Calculate the label's width and height
+
+    // For the callback function we parse NL characters to create a
+    // multi-line label.  This doesn't work for all languages, but
+    // XmStringCreateLocalized() doesn't do multi-line labels...
+    if (beval->msgCB != NULL)
+	s = XmStringCreateLtoR((char *)beval->msg, XmFONTLIST_DEFAULT_TAG);
+    else
+	s = XmStringCreateLocalized((char *)beval->msg);
     {
-	XmString s;
-	// Show the Balloon
+	XmFontList fl;
 
-	// Calculate the label's width and height
-
-	// For the callback function we parse NL characters to create a
-	// multi-line label.  This doesn't work for all languages, but
-	// XmStringCreateLocalized() doesn't do multi-line labels...
-	if (beval->msgCB != NULL)
-	    s = XmStringCreateLtoR((char *)beval->msg, XmFONTLIST_DEFAULT_TAG);
-	else
-	    s = XmStringCreateLocalized((char *)beval->msg);
+	fl = gui_motif_fontset2fontlist(&gui.tooltip_fontset);
+	if (fl == NULL)
 	{
-	    XmFontList fl;
-
-	    fl = gui_motif_fontset2fontlist(&gui.tooltip_fontset);
-	    if (fl == NULL)
-	    {
-		XmStringFree(s);
-		return;
-	    }
-	    XmStringExtent(fl, s, &w, &h);
-	    XmFontListFree(fl);
+	    XmStringFree(s);
+	    return;
 	}
-	w += gui.border_offset << 1;
-	h += gui.border_offset << 1;
-	XtVaSetValues(beval->balloonLabel, XmNlabelString, s, NULL);
-	XmStringFree(s);
-
-	// Compute position of the balloon area
-	tx = beval->x_root + EVAL_OFFSET_X;
-	ty = beval->y_root + EVAL_OFFSET_Y;
-	if ((tx + w) > beval->screen_width)
-	    tx = beval->screen_width - w;
-	if ((ty + h) > beval->screen_height)
-	    ty = beval->screen_height - h;
-	XtVaSetValues(beval->balloonShell,
-		XmNx, tx,
-		XmNy, ty,
-		NULL);
-	// Set tooltip colors
-	{
-	    Arg args[2];
-
-	    args[0].name = XmNbackground;
-	    args[0].value = gui.tooltip_bg_pixel;
-	    args[1].name = XmNforeground;
-	    args[1].value = gui.tooltip_fg_pixel;
-	    XtSetValues(beval->balloonLabel, &args[0], XtNumber(args));
-	}
-
-	XtPopup(beval->balloonShell, XtGrabNone);
-
-	beval->showState = ShS_SHOWING;
-
-	current_beval = beval;
+	XmStringExtent(fl, s, &w, &h);
+	XmFontListFree(fl);
     }
+    w += gui.border_offset << 1;
+    h += gui.border_offset << 1;
+    XtVaSetValues(beval->balloonLabel, XmNlabelString, s, NULL);
+    XmStringFree(s);
+
+    // Compute position of the balloon area
+    tx = beval->x_root + EVAL_OFFSET_X;
+    ty = beval->y_root + EVAL_OFFSET_Y;
+    if ((tx + w) > beval->screen_width)
+	tx = beval->screen_width - w;
+    if ((ty + h) > beval->screen_height)
+	ty = beval->screen_height - h;
+    XtVaSetValues(beval->balloonShell,
+	    XmNx, tx,
+	    XmNy, ty,
+	    NULL);
+    // Set tooltip colors
+    {
+	Arg args[2];
+
+	args[0].name = XmNbackground;
+	args[0].value = gui.tooltip_bg_pixel;
+	args[1].name = XmNforeground;
+	args[1].value = gui.tooltip_fg_pixel;
+	XtSetValues(beval->balloonLabel, &args[0], XtNumber(args));
+    }
+
+    XtPopup(beval->balloonShell, XtGrabNone);
+
+    beval->showState = ShS_SHOWING;
+
+    current_beval = beval;
 }
 
 /*
@@ -1161,18 +1161,16 @@
     beval->balloonShell = XtAppCreateShell("balloonEval", "BalloonEval",
 		    overrideShellWidgetClass, gui.dpy, args, n);
 
-    {
-	XmFontList fl;
+    XmFontList fl;
 
-	n = 0;
-	fl = gui_motif_fontset2fontlist(&gui.tooltip_fontset);
-	XtSetArg(args[n], XmNforeground, gui.tooltip_fg_pixel); n++;
-	XtSetArg(args[n], XmNbackground, gui.tooltip_bg_pixel); n++;
-	XtSetArg(args[n], XmNfontList, fl); n++;
-	XtSetArg(args[n], XmNalignment, XmALIGNMENT_BEGINNING); n++;
-	beval->balloonLabel = XtCreateManagedWidget("balloonLabel",
-			xmLabelWidgetClass, beval->balloonShell, args, n);
-    }
+    n = 0;
+    fl = gui_motif_fontset2fontlist(&gui.tooltip_fontset);
+    XtSetArg(args[n], XmNforeground, gui.tooltip_fg_pixel); n++;
+    XtSetArg(args[n], XmNbackground, gui.tooltip_bg_pixel); n++;
+    XtSetArg(args[n], XmNfontList, fl); n++;
+    XtSetArg(args[n], XmNalignment, XmALIGNMENT_BEGINNING); n++;
+    beval->balloonLabel = XtCreateManagedWidget("balloonLabel",
+	    xmLabelWidgetClass, beval->balloonShell, args, n);
 }
 
 #endif // !FEAT_GUI_GTK
diff --git a/src/gui_gtk.c b/src/gui_gtk.c
index 1ae15ca..6dbaf24 100644
--- a/src/gui_gtk.c
+++ b/src/gui_gtk.c
@@ -924,22 +924,22 @@
     void
 gui_mch_menu_set_tip(vimmenu_T *menu)
 {
-    if (menu->id != NULL && menu->parent != NULL && gui.toolbar != NULL)
-    {
-	char_u *tooltip;
+    if (menu->id == NULL || menu->parent == NULL || gui.toolbar == NULL)
+	return;
 
-	tooltip = CONVERT_TO_UTF8(menu->strings[MENU_INDEX_TIP]);
-	if (tooltip != NULL && utf_valid_string(tooltip, NULL))
+    char_u *tooltip;
+
+    tooltip = CONVERT_TO_UTF8(menu->strings[MENU_INDEX_TIP]);
+    if (tooltip != NULL && utf_valid_string(tooltip, NULL))
 # if GTK_CHECK_VERSION(3,0,0)
-	    // Only set the tooltip when it's valid utf-8.
-	    gtk_widget_set_tooltip_text(menu->id, (const gchar *)tooltip);
+	// Only set the tooltip when it's valid utf-8.
+	gtk_widget_set_tooltip_text(menu->id, (const gchar *)tooltip);
 # else
-	    // Only set the tooltip when it's valid utf-8.
-	    gtk_tooltips_set_tip(GTK_TOOLBAR(gui.toolbar)->tooltips,
-				 menu->id, (const char *)tooltip, NULL);
+    // Only set the tooltip when it's valid utf-8.
+    gtk_tooltips_set_tip(GTK_TOOLBAR(gui.toolbar)->tooltips,
+	    menu->id, (const char *)tooltip, NULL);
 # endif
-	CONVERT_TO_UTF8_FREE(tooltip);
-    }
+    CONVERT_TO_UTF8_FREE(tooltip);
 }
 #endif // FEAT_TOOLBAR
 
@@ -1007,34 +1007,34 @@
     void
 gui_mch_set_scrollbar_thumb(scrollbar_T *sb, long val, long size, long max)
 {
-    if (sb->id != NULL)
-    {
-	GtkAdjustment *adjustment;
+    if (sb->id == NULL)
+	return;
 
-	// ignore events triggered by moving the thumb (happens in GTK 3)
-	++hold_gui_events;
+    GtkAdjustment *adjustment;
 
-	adjustment = gtk_range_get_adjustment(GTK_RANGE(sb->id));
+    // ignore events triggered by moving the thumb (happens in GTK 3)
+    ++hold_gui_events;
 
-	gtk_adjustment_set_lower(adjustment, 0.0);
-	gtk_adjustment_set_value(adjustment, val);
-	gtk_adjustment_set_upper(adjustment, max + 1);
-	gtk_adjustment_set_page_size(adjustment, size);
-	gtk_adjustment_set_page_increment(adjustment,
-					  size < 3L ? 1L : size - 2L);
-	gtk_adjustment_set_step_increment(adjustment, 1.0);
+    adjustment = gtk_range_get_adjustment(GTK_RANGE(sb->id));
 
-	g_signal_handler_block(G_OBJECT(adjustment), (gulong)sb->handler_id);
+    gtk_adjustment_set_lower(adjustment, 0.0);
+    gtk_adjustment_set_value(adjustment, val);
+    gtk_adjustment_set_upper(adjustment, max + 1);
+    gtk_adjustment_set_page_size(adjustment, size);
+    gtk_adjustment_set_page_increment(adjustment,
+	    size < 3L ? 1L : size - 2L);
+    gtk_adjustment_set_step_increment(adjustment, 1.0);
 
-	--hold_gui_events;
+    g_signal_handler_block(G_OBJECT(adjustment), (gulong)sb->handler_id);
+
+    --hold_gui_events;
 
 #if !GTK_CHECK_VERSION(3,18,0)
-	gtk_adjustment_changed(adjustment);
+    gtk_adjustment_changed(adjustment);
 #endif
 
-	g_signal_handler_unblock(G_OBJECT(adjustment),
-						      (gulong)sb->handler_id);
-    }
+    g_signal_handler_unblock(G_OBJECT(adjustment),
+	    (gulong)sb->handler_id);
 }
 
     void
@@ -1157,21 +1157,21 @@
 	sb->id = gtk_vscrollbar_new(NULL);
 #endif
 
-    if (sb->id != NULL)
-    {
-	GtkAdjustment *adjustment;
+    if (sb->id == NULL)
+	return;
 
-	gtk_widget_set_can_focus(sb->id, FALSE);
-	gui_gtk_form_put(GTK_FORM(gui.formwin), sb->id, 0, 0);
+    GtkAdjustment *adjustment;
 
-	adjustment = gtk_range_get_adjustment(GTK_RANGE(sb->id));
+    gtk_widget_set_can_focus(sb->id, FALSE);
+    gui_gtk_form_put(GTK_FORM(gui.formwin), sb->id, 0, 0);
 
-	sb->handler_id = g_signal_connect(
-			     G_OBJECT(adjustment), "value-changed",
-			     G_CALLBACK(adjustment_value_changed),
-			     GINT_TO_POINTER(sb->ident));
-	gui_mch_update();
-    }
+    adjustment = gtk_range_get_adjustment(GTK_RANGE(sb->id));
+
+    sb->handler_id = g_signal_connect(
+	    G_OBJECT(adjustment), "value-changed",
+	    G_CALLBACK(adjustment_value_changed),
+	    GINT_TO_POINTER(sb->ident));
+    gui_mch_update();
 }
 
     void
@@ -1994,59 +1994,58 @@
     popup_mouse_pos = mouse_pos;
 
     menu = gui_find_menu(path_name);
+    if (menu == NULL || menu->submenu_id == NULL)
+	return;
 
-    if (menu != NULL && menu->submenu_id != NULL)
-    {
 # if GTK_CHECK_VERSION(3,22,2)
-	GdkWindow * const win = gtk_widget_get_window(gui.drawarea);
-	GdkEventButton trigger;
+    GdkWindow * const win = gtk_widget_get_window(gui.drawarea);
+    GdkEventButton trigger;
 
-	// A pseudo event to have gtk_menu_popup_at_*() functions work. Since
-	// the position where the menu pops up is automatically adjusted by
-	// the functions, none of the fields x, y, x_root and y_root has to be
-	// set to a specific value here; therefore, they are set to zero for
-	// convenience.
-	trigger.type       = GDK_BUTTON_PRESS;
-	trigger.window     = win;
-	trigger.send_event = FALSE;
-	trigger.time       = GDK_CURRENT_TIME;
-	trigger.x	   = 0.0;
-	trigger.y	   = 0.0;
-	trigger.axes       = NULL;
-	trigger.state      = 0;
-	trigger.button     = 0;
-	trigger.device     = NULL;
-	trigger.x_root     = 0.0;
-	trigger.y_root     = 0.0;
+    // A pseudo event to have gtk_menu_popup_at_*() functions work. Since
+    // the position where the menu pops up is automatically adjusted by
+    // the functions, none of the fields x, y, x_root and y_root has to be
+    // set to a specific value here; therefore, they are set to zero for
+    // convenience.
+    trigger.type       = GDK_BUTTON_PRESS;
+    trigger.window     = win;
+    trigger.send_event = FALSE;
+    trigger.time       = GDK_CURRENT_TIME;
+    trigger.x	   = 0.0;
+    trigger.y	   = 0.0;
+    trigger.axes       = NULL;
+    trigger.state      = 0;
+    trigger.button     = 0;
+    trigger.device     = NULL;
+    trigger.x_root     = 0.0;
+    trigger.y_root     = 0.0;
 
-	if (mouse_pos)
-	    gtk_menu_popup_at_pointer(GTK_MENU(menu->submenu_id),
-				      (GdkEvent *)&trigger);
-	else
-	{
-	    gint origin_x, origin_y;
-	    GdkRectangle rect = { 0, 0, 0, 0 };
+    if (mouse_pos)
+	gtk_menu_popup_at_pointer(GTK_MENU(menu->submenu_id),
+		(GdkEvent *)&trigger);
+    else
+    {
+	gint origin_x, origin_y;
+	GdkRectangle rect = { 0, 0, 0, 0 };
 
-	    gdk_window_get_origin(win, &origin_x, &origin_y);
-	    popup_menu_position_func(NULL, &rect.x, &rect.y, NULL, NULL);
+	gdk_window_get_origin(win, &origin_x, &origin_y);
+	popup_menu_position_func(NULL, &rect.x, &rect.y, NULL, NULL);
 
-	    rect.x -= origin_x;
-	    rect.y -= origin_y;
+	rect.x -= origin_x;
+	rect.y -= origin_y;
 
-	    gtk_menu_popup_at_rect(GTK_MENU(menu->submenu_id),
-				   win,
-				   &rect,
-				   GDK_GRAVITY_SOUTH_EAST,
-				   GDK_GRAVITY_NORTH_WEST,
-				   (GdkEvent *)&trigger);
-	}
-# else
-	gtk_menu_popup(GTK_MENU(menu->submenu_id),
-		       NULL, NULL,
-		       &popup_menu_position_func, NULL,
-		       0U, (guint32)GDK_CURRENT_TIME);
-# endif
+	gtk_menu_popup_at_rect(GTK_MENU(menu->submenu_id),
+		win,
+		&rect,
+		GDK_GRAVITY_SOUTH_EAST,
+		GDK_GRAVITY_NORTH_WEST,
+		(GdkEvent *)&trigger);
     }
+# else
+    gtk_menu_popup(GTK_MENU(menu->submenu_id),
+	    NULL, NULL,
+	    &popup_menu_position_func, NULL,
+	    0U, (guint32)GDK_CURRENT_TIME);
+# endif
 }
 
 #endif // FEAT_MENU
diff --git a/src/gui_gtk_f.c b/src/gui_gtk_f.c
index c8f90c2..1ae1bd7 100644
--- a/src/gui_gtk_f.c
+++ b/src/gui_gtk_f.c
@@ -188,13 +188,13 @@
 {
     g_return_if_fail(GTK_IS_FORM(form));
 
-    if (form->freeze_count)
+    if (!form->freeze_count)
+	return;
+
+    if (!(--form->freeze_count))
     {
-	if (!(--form->freeze_count))
-	{
-	    form_position_children(form);
-	    gtk_widget_queue_draw(GTK_WIDGET(form));
-	}
+	form_position_children(form);
+	gtk_widget_queue_draw(GTK_WIDGET(form));
     }
 }
 
@@ -610,32 +610,32 @@
 	tmp_list = tmp_list->next;
     }
 
-    if (tmp_list)
-    {
-#if GTK_CHECK_VERSION(3,0,0)
-	const gboolean was_visible = gtk_widget_get_visible(widget);
-#endif
-	if (child->window)
-	{
-	    g_signal_handlers_disconnect_by_func(G_OBJECT(child->widget),
-		    FUNC2GENERIC(&form_child_map), child);
-	    g_signal_handlers_disconnect_by_func(G_OBJECT(child->widget),
-		    FUNC2GENERIC(&form_child_unmap), child);
+    if (tmp_list == NULL)
+	return;
 
-	    // FIXME: This will cause problems for reparenting NO_WINDOW
-	    // widgets out of a GtkForm
-	    gdk_window_set_user_data(child->window, NULL);
-	    gdk_window_destroy(child->window);
-	}
-	gtk_widget_unparent(widget);
 #if GTK_CHECK_VERSION(3,0,0)
-	if (was_visible)
-	    gtk_widget_queue_resize(GTK_WIDGET(container));
+    const gboolean was_visible = gtk_widget_get_visible(widget);
 #endif
-	form->children = g_list_remove_link(form->children, tmp_list);
-	g_list_free_1(tmp_list);
-	g_free(child);
+    if (child->window)
+    {
+	g_signal_handlers_disconnect_by_func(G_OBJECT(child->widget),
+		FUNC2GENERIC(&form_child_map), child);
+	g_signal_handlers_disconnect_by_func(G_OBJECT(child->widget),
+		FUNC2GENERIC(&form_child_unmap), child);
+
+	// FIXME: This will cause problems for reparenting NO_WINDOW
+	// widgets out of a GtkForm
+	gdk_window_set_user_data(child->window, NULL);
+	gdk_window_destroy(child->window);
     }
+    gtk_widget_unparent(widget);
+#if GTK_CHECK_VERSION(3,0,0)
+    if (was_visible)
+	gtk_widget_queue_resize(GTK_WIDGET(container));
+#endif
+    form->children = g_list_remove_link(form->children, tmp_list);
+    g_list_free_1(tmp_list);
+    g_free(child);
 }
 
     static void
diff --git a/src/gui_gtk_x11.c b/src/gui_gtk_x11.c
index ea76e33..b8e08f5 100644
--- a/src/gui_gtk_x11.c
+++ b/src/gui_gtk_x11.c
@@ -2435,16 +2435,15 @@
     GnomeClient *client;
 
     client = gnome_master_client();
+    if (client == NULL)
+	return;
 
-    if (client != NULL)
-    {
-	// Must use the deprecated gtk_signal_connect() for compatibility
-	// with GNOME 1.  Arrgh, zombies!
-	gtk_signal_connect(GTK_OBJECT(client), "save_yourself",
-			   GTK_SIGNAL_FUNC(&sm_client_save_yourself), NULL);
-	gtk_signal_connect(GTK_OBJECT(client), "die",
-			   GTK_SIGNAL_FUNC(&sm_client_die), NULL);
-    }
+    // Must use the deprecated gtk_signal_connect() for compatibility
+    // with GNOME 1.  Arrgh, zombies!
+    gtk_signal_connect(GTK_OBJECT(client), "save_yourself",
+	    GTK_SIGNAL_FUNC(&sm_client_save_yourself), NULL);
+    gtk_signal_connect(GTK_OBJECT(client), "die",
+	    GTK_SIGNAL_FUNC(&sm_client_die), NULL);
 }
 
 #else // !USE_GNOME_SESSION
@@ -3379,13 +3378,13 @@
 	gint		idx,
 	gpointer	data UNUSED)
 {
-    if (!ignore_tabline_evt)
-    {
-	if ((tabpage_index(curtab) - 1) < idx)
-	    tabpage_move(idx + 1);
-	else
-	    tabpage_move(idx);
-    }
+    if (ignore_tabline_evt)
+	return;
+
+    if ((tabpage_index(curtab) - 1) < idx)
+	tabpage_move(idx + 1);
+    else
+	tabpage_move(idx);
 }
 # endif
 
@@ -4069,15 +4068,15 @@
     void
 gui_mch_forked(void)
 {
-    if (using_gnome)
-    {
-	GnomeClient *client;
+    if (!using_gnome)
+	return;
 
-	client = gnome_master_client();
+    GnomeClient *client;
 
-	if (client != NULL)
-	    gnome_client_set_process_id(client, getpid());
-    }
+    client = gnome_master_client();
+
+    if (client != NULL)
+	gnome_client_set_process_id(client, getpid());
 }
 #endif // USE_GNOME_SESSION
 
@@ -6860,11 +6859,11 @@
     void
 clip_mch_lose_selection(Clipboard_T *cbd UNUSED)
 {
-    if (!in_selection_clear_event)
-    {
-	gtk_selection_owner_set(NULL, cbd->gtk_sel_atom, gui.event_time);
-	gui_mch_update();
-    }
+    if (in_selection_clear_event)
+	return;
+
+    gtk_selection_owner_set(NULL, cbd->gtk_sel_atom, gui.event_time);
+    gui_mch_update();
 }
 
 /*
@@ -7029,21 +7028,21 @@
     void
 gui_mch_mousehide(int hide)
 {
-    if (gui.pointer_hidden != hide)
+    if (gui.pointer_hidden == hide)
+	return;
+
+    gui.pointer_hidden = hide;
+    if (gtk_widget_get_window(gui.drawarea) && gui.blank_pointer != NULL)
     {
-	gui.pointer_hidden = hide;
-	if (gtk_widget_get_window(gui.drawarea) && gui.blank_pointer != NULL)
-	{
-	    if (hide)
-		gdk_window_set_cursor(gtk_widget_get_window(gui.drawarea),
-			gui.blank_pointer);
-	    else
+	if (hide)
+	    gdk_window_set_cursor(gtk_widget_get_window(gui.drawarea),
+		    gui.blank_pointer);
+	else
 #ifdef FEAT_MOUSESHAPE
-		mch_set_mouse_shape(last_shape);
+	    mch_set_mouse_shape(last_shape);
 #else
-		gdk_window_set_cursor(gtk_widget_get_window(gui.drawarea), NULL);
+	gdk_window_set_cursor(gtk_widget_get_window(gui.drawarea), NULL);
 #endif
-	}
     }
 }
 
@@ -7132,141 +7131,141 @@
 
     sign = (GdkPixbuf *)sign_get_image(typenr);
 
-    if (sign != NULL && gui.drawarea != NULL
-	    && gtk_widget_get_window(gui.drawarea) != NULL)
+    if (sign == NULL || gui.drawarea == NULL
+	    || gtk_widget_get_window(gui.drawarea) == NULL)
+	return;
+
+    int width;
+    int height;
+    int xoffset;
+    int yoffset;
+    int need_scale;
+
+    width  = gdk_pixbuf_get_width(sign);
+    height = gdk_pixbuf_get_height(sign);
+    /*
+     * Decide whether we need to scale.  Allow one pixel of border
+     * width to be cut off, in order to avoid excessive scaling for
+     * tiny differences in font size.
+     * Do scale to fit the height to avoid gaps because of linespacing.
+     */
+    need_scale = (width > SIGN_WIDTH + 2
+	    || height != SIGN_HEIGHT
+	    || (width < 3 * SIGN_WIDTH / 4
+		&& height < 3 * SIGN_HEIGHT / 4));
+    if (need_scale)
     {
-	int width;
-	int height;
-	int xoffset;
-	int yoffset;
-	int need_scale;
+	double  aspect;
+	int	    w = width;
+	int	    h = height;
 
-	width  = gdk_pixbuf_get_width(sign);
-	height = gdk_pixbuf_get_height(sign);
-	/*
-	 * Decide whether we need to scale.  Allow one pixel of border
-	 * width to be cut off, in order to avoid excessive scaling for
-	 * tiny differences in font size.
-	 * Do scale to fit the height to avoid gaps because of linespacing.
-	 */
-	need_scale = (width > SIGN_WIDTH + 2
-		      || height != SIGN_HEIGHT
-		      || (width < 3 * SIGN_WIDTH / 4
-			  && height < 3 * SIGN_HEIGHT / 4));
-	if (need_scale)
+	// Keep the original aspect ratio
+	aspect = (double)height / (double)width;
+	width  = (double)SIGN_WIDTH * SIGN_ASPECT / aspect;
+	width  = MIN(width, SIGN_WIDTH);
+	if (((double)(MAX(height, SIGN_HEIGHT)) /
+		    (double)(MIN(height, SIGN_HEIGHT))) < 1.15)
 	{
-	    double  aspect;
-	    int	    w = width;
-	    int	    h = height;
-
-	    // Keep the original aspect ratio
-	    aspect = (double)height / (double)width;
-	    width  = (double)SIGN_WIDTH * SIGN_ASPECT / aspect;
-	    width  = MIN(width, SIGN_WIDTH);
-	    if (((double)(MAX(height, SIGN_HEIGHT)) /
-		 (double)(MIN(height, SIGN_HEIGHT))) < 1.15)
-	    {
-		// Change the aspect ratio by at most 15% to fill the
-		// available space completely.
-		height = (double)SIGN_HEIGHT * SIGN_ASPECT / aspect;
-		height = MIN(height, SIGN_HEIGHT);
-	    }
-	    else
-		height = (double)width * aspect;
-
-	    if (w == width && h == height)
-	    {
-		// no change in dimensions; don't decrease reference counter
-		// (below)
-		need_scale = FALSE;
-	    }
-	    else
-	    {
-		// This doesn't seem to be worth caching, and doing so would
-		// complicate the code quite a bit.
-		sign = gdk_pixbuf_scale_simple(sign, width, height,
-							 GDK_INTERP_BILINEAR);
-		if (sign == NULL)
-		    return; // out of memory
-	    }
+	    // Change the aspect ratio by at most 15% to fill the
+	    // available space completely.
+	    height = (double)SIGN_HEIGHT * SIGN_ASPECT / aspect;
+	    height = MIN(height, SIGN_HEIGHT);
 	}
+	else
+	    height = (double)width * aspect;
 
-	// The origin is the upper-left corner of the pixmap.  Therefore
-	// these offset may become negative if the pixmap is smaller than
-	// the 2x1 cells reserved for the sign icon.
-	xoffset = (width  - SIGN_WIDTH)  / 2;
-	yoffset = (height - SIGN_HEIGHT) / 2;
+	if (w == width && h == height)
+	{
+	    // no change in dimensions; don't decrease reference counter
+	    // (below)
+	    need_scale = FALSE;
+	}
+	else
+	{
+	    // This doesn't seem to be worth caching, and doing so would
+	    // complicate the code quite a bit.
+	    sign = gdk_pixbuf_scale_simple(sign, width, height,
+		    GDK_INTERP_BILINEAR);
+	    if (sign == NULL)
+		return; // out of memory
+	}
+    }
+
+    // The origin is the upper-left corner of the pixmap.  Therefore
+    // these offset may become negative if the pixmap is smaller than
+    // the 2x1 cells reserved for the sign icon.
+    xoffset = (width  - SIGN_WIDTH)  / 2;
+    yoffset = (height - SIGN_HEIGHT) / 2;
 
 # if GTK_CHECK_VERSION(3,0,0)
-	{
-	    cairo_t	    *cr;
-	    cairo_surface_t *bg_surf;
-	    cairo_t	    *bg_cr;
-	    cairo_surface_t *sign_surf;
-	    cairo_t	    *sign_cr;
+    {
+	cairo_t	    *cr;
+	cairo_surface_t *bg_surf;
+	cairo_t	    *bg_cr;
+	cairo_surface_t *sign_surf;
+	cairo_t	    *sign_cr;
 
-	    cr = cairo_create(gui.surface);
+	cr = cairo_create(gui.surface);
 
-	    bg_surf = cairo_surface_create_similar(gui.surface,
-		    cairo_surface_get_content(gui.surface),
-		    SIGN_WIDTH, SIGN_HEIGHT);
-	    bg_cr = cairo_create(bg_surf);
-	    cairo_set_source_rgba(bg_cr,
-		    gui.bgcolor->red, gui.bgcolor->green, gui.bgcolor->blue,
-		    gui.bgcolor->alpha);
-	    cairo_paint(bg_cr);
+	bg_surf = cairo_surface_create_similar(gui.surface,
+		cairo_surface_get_content(gui.surface),
+		SIGN_WIDTH, SIGN_HEIGHT);
+	bg_cr = cairo_create(bg_surf);
+	cairo_set_source_rgba(bg_cr,
+		gui.bgcolor->red, gui.bgcolor->green, gui.bgcolor->blue,
+		gui.bgcolor->alpha);
+	cairo_paint(bg_cr);
 
-	    sign_surf = cairo_surface_create_similar(gui.surface,
-		    cairo_surface_get_content(gui.surface),
-		    SIGN_WIDTH, SIGN_HEIGHT);
-	    sign_cr = cairo_create(sign_surf);
-	    gdk_cairo_set_source_pixbuf(sign_cr, sign, -xoffset, -yoffset);
-	    cairo_paint(sign_cr);
+	sign_surf = cairo_surface_create_similar(gui.surface,
+		cairo_surface_get_content(gui.surface),
+		SIGN_WIDTH, SIGN_HEIGHT);
+	sign_cr = cairo_create(sign_surf);
+	gdk_cairo_set_source_pixbuf(sign_cr, sign, -xoffset, -yoffset);
+	cairo_paint(sign_cr);
 
-	    cairo_set_operator(sign_cr, CAIRO_OPERATOR_DEST_OVER);
-	    cairo_set_source_surface(sign_cr, bg_surf, 0, 0);
-	    cairo_paint(sign_cr);
+	cairo_set_operator(sign_cr, CAIRO_OPERATOR_DEST_OVER);
+	cairo_set_source_surface(sign_cr, bg_surf, 0, 0);
+	cairo_paint(sign_cr);
 
-	    cairo_set_source_surface(cr, sign_surf, FILL_X(col), FILL_Y(row));
-	    cairo_paint(cr);
+	cairo_set_source_surface(cr, sign_surf, FILL_X(col), FILL_Y(row));
+	cairo_paint(cr);
 
-	    cairo_destroy(sign_cr);
-	    cairo_surface_destroy(sign_surf);
-	    cairo_destroy(bg_cr);
-	    cairo_surface_destroy(bg_surf);
-	    cairo_destroy(cr);
+	cairo_destroy(sign_cr);
+	cairo_surface_destroy(sign_surf);
+	cairo_destroy(bg_cr);
+	cairo_surface_destroy(bg_surf);
+	cairo_destroy(cr);
 
-	    gtk_widget_queue_draw_area(gui.drawarea,
-		    FILL_X(col), FILL_Y(col), width, height);
+	gtk_widget_queue_draw_area(gui.drawarea,
+		FILL_X(col), FILL_Y(col), width, height);
 
-	}
-# else // !GTK_CHECK_VERSION(3,0,0)
-	gdk_gc_set_foreground(gui.text_gc, gui.bgcolor);
-
-	gdk_draw_rectangle(gui.drawarea->window,
-			   gui.text_gc,
-			   TRUE,
-			   FILL_X(col),
-			   FILL_Y(row),
-			   SIGN_WIDTH,
-			   SIGN_HEIGHT);
-
-	gdk_pixbuf_render_to_drawable_alpha(sign,
-					    gui.drawarea->window,
-					    MAX(0, xoffset),
-					    MAX(0, yoffset),
-					    FILL_X(col) - MIN(0, xoffset),
-					    FILL_Y(row) - MIN(0, yoffset),
-					    MIN(width,	SIGN_WIDTH),
-					    MIN(height, SIGN_HEIGHT),
-					    GDK_PIXBUF_ALPHA_BILEVEL,
-					    127,
-					    GDK_RGB_DITHER_NORMAL,
-					    0, 0);
-# endif // !GTK_CHECK_VERSION(3,0,0)
-	if (need_scale)
-	    g_object_unref(sign);
     }
+# else // !GTK_CHECK_VERSION(3,0,0)
+    gdk_gc_set_foreground(gui.text_gc, gui.bgcolor);
+
+    gdk_draw_rectangle(gui.drawarea->window,
+	    gui.text_gc,
+	    TRUE,
+	    FILL_X(col),
+	    FILL_Y(row),
+	    SIGN_WIDTH,
+	    SIGN_HEIGHT);
+
+    gdk_pixbuf_render_to_drawable_alpha(sign,
+	    gui.drawarea->window,
+	    MAX(0, xoffset),
+	    MAX(0, yoffset),
+	    FILL_X(col) - MIN(0, xoffset),
+	    FILL_Y(row) - MIN(0, yoffset),
+	    MIN(width,	SIGN_WIDTH),
+	    MIN(height, SIGN_HEIGHT),
+	    GDK_PIXBUF_ALPHA_BILEVEL,
+	    127,
+	    GDK_RGB_DITHER_NORMAL,
+	    0, 0);
+# endif // !GTK_CHECK_VERSION(3,0,0)
+    if (need_scale)
+	g_object_unref(sign);
 }
 
     void *
diff --git a/src/gui_motif.c b/src/gui_motif.c
index 55c026e..5e18f20 100644
--- a/src/gui_motif.c
+++ b/src/gui_motif.c
@@ -979,14 +979,14 @@
     XmString	label;
 
     // Add accelerator text, if there is one
-    if (menu->actext != NULL && menu->id != (Widget)0)
-    {
-	label = XmStringCreate((char *)menu->actext, STRING_TAG);
-	if (label == NULL)
-	    return;
-	XtVaSetValues(menu->id, XmNacceleratorText, label, NULL);
-	XmStringFree(label);
-    }
+    if (menu->actext == NULL || menu->id == (Widget)0)
+	return;
+
+    label = XmStringCreate((char *)menu->actext, STRING_TAG);
+    if (label == NULL)
+	return;
+    XtVaSetValues(menu->id, XmNacceleratorText, label, NULL);
+    XmStringFree(label);
 }
 
     void
@@ -1573,44 +1573,44 @@
 	menu->submenu_id = (Widget)0;
     }
 
-    if (menu->id != (Widget)0)
-    {
-	Widget	    parent;
+    if (menu->id == (Widget)0)
+	return;
 
-	parent = XtParent(menu->id);
+    Widget	    parent;
+
+    parent = XtParent(menu->id);
 #if defined(FEAT_TOOLBAR) && defined(FEAT_BEVAL_GUI)
-	if (parent == toolBar && menu->tip != NULL)
-	{
-	    // We try to destroy this before the actual menu, because there are
-	    // callbacks, etc. that will be unregistered during the tooltip
-	    // destruction.
-	    //
-	    // If you call "gui_mch_destroy_beval_area()" after destroying
-	    // menu->id, then the tooltip's window will have already been
-	    // deallocated by Xt, and unknown behaviour will ensue (probably
-	    // a core dump).
-	    gui_mch_destroy_beval_area(menu->tip);
-	    menu->tip = NULL;
-	}
-#endif
-	XtDestroyWidget(menu->id);
-	menu->id = (Widget)0;
-	if (parent == menuBar)
-	    gui_mch_compute_menu_height((Widget)0);
-#ifdef FEAT_TOOLBAR
-	else if (parent == toolBar)
-	{
-	    Cardinal    num_children;
-
-	    // When removing last toolbar item, don't display the toolbar.
-	    XtVaGetValues(toolBar, XmNnumChildren, &num_children, NULL);
-	    if (num_children == 0)
-		gui_mch_show_toolbar(FALSE);
-	    else
-		gui.toolbar_height = gui_mch_compute_toolbar_height();
-	}
-#endif
+    if (parent == toolBar && menu->tip != NULL)
+    {
+	// We try to destroy this before the actual menu, because there are
+	// callbacks, etc. that will be unregistered during the tooltip
+	// destruction.
+	//
+	// If you call "gui_mch_destroy_beval_area()" after destroying
+	// menu->id, then the tooltip's window will have already been
+	// deallocated by Xt, and unknown behaviour will ensue (probably
+	// a core dump).
+	gui_mch_destroy_beval_area(menu->tip);
+	menu->tip = NULL;
     }
+#endif
+    XtDestroyWidget(menu->id);
+    menu->id = (Widget)0;
+    if (parent == menuBar)
+	gui_mch_compute_menu_height((Widget)0);
+#ifdef FEAT_TOOLBAR
+    else if (parent == toolBar)
+    {
+	Cardinal    num_children;
+
+	// When removing last toolbar item, don't display the toolbar.
+	XtVaGetValues(toolBar, XmNnumChildren, &num_children, NULL);
+	if (num_children == 0)
+	    gui_mch_show_toolbar(FALSE);
+	else
+	    gui.toolbar_height = gui_mch_compute_toolbar_height();
+    }
+#endif
 }
 
     void
@@ -1630,19 +1630,19 @@
     void
 gui_mch_def_colors(void)
 {
-    if (gui.in_use)
-    {
-	gui.menu_fg_pixel = gui_get_color((char_u *)gui.rsrc_menu_fg_name);
-	gui.menu_bg_pixel = gui_get_color((char_u *)gui.rsrc_menu_bg_name);
-	gui.scroll_fg_pixel = gui_get_color((char_u *)gui.rsrc_scroll_fg_name);
-	gui.scroll_bg_pixel = gui_get_color((char_u *)gui.rsrc_scroll_bg_name);
+    if (!gui.in_use)
+	return;
+
+    gui.menu_fg_pixel = gui_get_color((char_u *)gui.rsrc_menu_fg_name);
+    gui.menu_bg_pixel = gui_get_color((char_u *)gui.rsrc_menu_bg_name);
+    gui.scroll_fg_pixel = gui_get_color((char_u *)gui.rsrc_scroll_fg_name);
+    gui.scroll_bg_pixel = gui_get_color((char_u *)gui.rsrc_scroll_bg_name);
 #ifdef FEAT_BEVAL_GUI
-	gui.tooltip_fg_pixel =
-			gui_get_color((char_u *)gui.rsrc_tooltip_fg_name);
-	gui.tooltip_bg_pixel =
-			gui_get_color((char_u *)gui.rsrc_tooltip_bg_name);
+    gui.tooltip_fg_pixel =
+	gui_get_color((char_u *)gui.rsrc_tooltip_fg_name);
+    gui.tooltip_bg_pixel =
+	gui_get_color((char_u *)gui.rsrc_tooltip_bg_name);
 #endif
-    }
 }
 
 
@@ -1674,30 +1674,30 @@
     int		w,
     int		h)
 {
-    if (sb->id != (Widget)0)
+    if (sb->id == (Widget)0)
+	return;
+
+    if (sb->type == SBAR_LEFT || sb->type == SBAR_RIGHT)
     {
-	if (sb->type == SBAR_LEFT || sb->type == SBAR_RIGHT)
-	{
-	    if (y == 0)
-		h -= gui.border_offset;
-	    else
-		y -= gui.border_offset;
-	    XtVaSetValues(sb->id,
-			  XmNtopOffset, y,
-			  XmNbottomOffset, -y - h,
-			  XmNwidth, w,
-			  NULL);
-	}
+	if (y == 0)
+	    h -= gui.border_offset;
 	else
-	    XtVaSetValues(sb->id,
-			  XmNtopOffset, y,
-			  XmNleftOffset, x,
-			  XmNrightOffset, gui.which_scrollbars[SBAR_RIGHT]
-						    ? gui.scrollbar_width : 0,
-			  XmNheight, h,
-			  NULL);
-	XtManageChild(sb->id);
+	    y -= gui.border_offset;
+	XtVaSetValues(sb->id,
+		XmNtopOffset, y,
+		XmNbottomOffset, -y - h,
+		XmNwidth, w,
+		NULL);
     }
+    else
+	XtVaSetValues(sb->id,
+		XmNtopOffset, y,
+		XmNleftOffset, x,
+		XmNrightOffset, gui.which_scrollbars[SBAR_RIGHT]
+		? gui.scrollbar_width : 0,
+		XmNheight, h,
+		NULL);
+    XtManageChild(sb->id);
 }
 
     int
@@ -1732,52 +1732,52 @@
     Arg		args[16];
     int		n;
 
-    if (sb->id != (Widget)0)
+    if (sb->id == (Widget)0)
+	return;
+
+    n = 0;
+    if (flag)
     {
-	n = 0;
-	if (flag)
+	switch (sb->type)
 	{
+	    case SBAR_LEFT:
+		XtSetArg(args[n], XmNleftOffset, gui.scrollbar_width); n++;
+		break;
+
+	    case SBAR_RIGHT:
+		XtSetArg(args[n], XmNrightOffset, gui.scrollbar_width); n++;
+		break;
+
+	    case SBAR_BOTTOM:
+		XtSetArg(args[n], XmNbottomOffset, gui.scrollbar_height);n++;
+		break;
+	}
+	XtSetValues(textArea, args, n);
+	XtManageChild(sb->id);
+    }
+    else
+    {
+	if (!gui.which_scrollbars[sb->type])
+	{
+	    // The scrollbars of this type are all disabled, adjust the
+	    // textArea attachment offset.
 	    switch (sb->type)
 	    {
 		case SBAR_LEFT:
-		    XtSetArg(args[n], XmNleftOffset, gui.scrollbar_width); n++;
+		    XtSetArg(args[n], XmNleftOffset, 0); n++;
 		    break;
 
 		case SBAR_RIGHT:
-		    XtSetArg(args[n], XmNrightOffset, gui.scrollbar_width); n++;
+		    XtSetArg(args[n], XmNrightOffset, 0); n++;
 		    break;
 
 		case SBAR_BOTTOM:
-		    XtSetArg(args[n], XmNbottomOffset, gui.scrollbar_height);n++;
+		    XtSetArg(args[n], XmNbottomOffset, 0);n++;
 		    break;
 	    }
 	    XtSetValues(textArea, args, n);
-	    XtManageChild(sb->id);
 	}
-	else
-	{
-	    if (!gui.which_scrollbars[sb->type])
-	    {
-		// The scrollbars of this type are all disabled, adjust the
-		// textArea attachment offset.
-		switch (sb->type)
-		{
-		    case SBAR_LEFT:
-			XtSetArg(args[n], XmNleftOffset, 0); n++;
-			break;
-
-		    case SBAR_RIGHT:
-			XtSetArg(args[n], XmNrightOffset, 0); n++;
-			break;
-
-		    case SBAR_BOTTOM:
-			XtSetArg(args[n], XmNbottomOffset, 0);n++;
-			break;
-		}
-		XtSetValues(textArea, args, n);
-	    }
-	    XtUnmanageChild(sb->id);
-	}
+	XtUnmanageChild(sb->id);
     }
 }
 
@@ -1817,17 +1817,16 @@
 
     sb->id = XtCreateWidget("scrollBar",
 	    xmScrollBarWidgetClass, textAreaForm, args, n);
+    if (sb->id == (Widget)0)
+	return;
 
-    if (sb->id != (Widget)0)
-    {
-	gui_mch_set_scrollbar_colors(sb);
-	XtAddCallback(sb->id, XmNvalueChangedCallback,
-		      scroll_cb, (XtPointer)sb->ident);
-	XtAddCallback(sb->id, XmNdragCallback,
-		      scroll_cb, (XtPointer)sb->ident);
-	XtAddEventHandler(sb->id, KeyPressMask, FALSE, gui_x11_key_hit_cb,
+    gui_mch_set_scrollbar_colors(sb);
+    XtAddCallback(sb->id, XmNvalueChangedCallback,
+	    scroll_cb, (XtPointer)sb->ident);
+    XtAddCallback(sb->id, XmNdragCallback,
+	    scroll_cb, (XtPointer)sb->ident);
+    XtAddEventHandler(sb->id, KeyPressMask, FALSE, gui_x11_key_hit_cb,
 	    (XtPointer)0);
-    }
 }
 
     void
diff --git a/src/gui_photon.c b/src/gui_photon.c
index d48a153..5671890 100644
--- a/src/gui_photon.c
+++ b/src/gui_photon.c
@@ -992,19 +992,19 @@
     char **new_titles = NULL;
 
     new_titles = ALLOC_MULT(char *, (num_panels + 1));
-    if (new_titles != NULL)
-    {
-	if (num_panels > 0)
-	    memcpy(new_titles, panel_titles, num_panels * sizeof(char **));
+    if (new_titles == NULL)
+	return;
 
-	new_titles[ num_panels++ ] = name;
+    if (num_panels > 0)
+	memcpy(new_titles, panel_titles, num_panels * sizeof(char **));
 
-	PtSetResource(gui.vimPanelGroup, Pt_ARG_PG_PANEL_TITLES, new_titles,
-		num_panels);
+    new_titles[ num_panels++ ] = name;
 
-	vim_free(panel_titles);
-	panel_titles = new_titles;
-    }
+    PtSetResource(gui.vimPanelGroup, Pt_ARG_PG_PANEL_TITLES, new_titles,
+	    num_panels);
+
+    vim_free(panel_titles);
+    panel_titles = new_titles;
 }
 
     static void
@@ -1901,21 +1901,21 @@
     void
 gui_mch_mousehide(int hide)
 {
-    if (gui.pointer_hidden != hide)
-    {
-	gui.pointer_hidden = hide;
+    if (gui.pointer_hidden == hide)
+	return;
+
+    gui.pointer_hidden = hide;
 #ifdef FEAT_MOUSESHAPE
-	if (hide)
-	    PtSetResource(gui.vimTextArea, Pt_ARG_CURSOR_TYPE,
-		    Ph_CURSOR_NONE, 0);
-	else
-	    mch_set_mouse_shape(last_shape);
-#else
+    if (hide)
 	PtSetResource(gui.vimTextArea, Pt_ARG_CURSOR_TYPE,
-		(hide == MOUSE_SHOW) ? GUI_PH_MOUSE_TYPE : Ph_CURSOR_NONE,
-		0);
+		Ph_CURSOR_NONE, 0);
+    else
+	mch_set_mouse_shape(last_shape);
+#else
+    PtSetResource(gui.vimTextArea, Pt_ARG_CURSOR_TYPE,
+	    (hide == MOUSE_SHOW) ? GUI_PH_MOUSE_TYPE : Ph_CURSOR_NONE,
+	    0);
 #endif
-    }
 }
 
     void
diff --git a/src/gui_w32.c b/src/gui_w32.c
index dfbb661..206645a 100644
--- a/src/gui_w32.c
+++ b/src/gui_w32.c
@@ -434,12 +434,12 @@
     static void
 directx_binddc(void)
 {
-    if (s_textArea != NULL)
-    {
-	RECT	rect;
-	GetClientRect(s_textArea, &rect);
-	DWriteContext_BindDC(s_dwc, s_hdc, &rect);
-    }
+    if (s_textArea == NULL)
+	return;
+
+    RECT	rect;
+    GetClientRect(s_textArea, &rect);
+    DWriteContext_BindDC(s_dwc, s_hdc, &rect);
 }
 #endif
 
@@ -663,14 +663,14 @@
 {
     MSG msg;
 
-    if (blink_timer != 0)
-    {
-	KillTimer(NULL, blink_timer);
-	// Eat spurious WM_TIMER messages
-	while (PeekMessageW(&msg, s_hwnd, WM_TIMER, WM_TIMER, PM_REMOVE))
-	    ;
-	blink_timer = 0;
-    }
+    if (blink_timer == 0)
+	return;
+
+    KillTimer(NULL, blink_timer);
+    // Eat spurious WM_TIMER messages
+    while (PeekMessageW(&msg, s_hwnd, WM_TIMER, WM_TIMER, PM_REMOVE))
+	;
+    blink_timer = 0;
 }
 
 /*
@@ -888,7 +888,7 @@
     modifiers = get_active_modifiers();
 
     ch = simplify_key(ch, &modifiers);
-    
+
     // Some keys need adjustment when the Ctrl modifier is used.
     ++no_reduce_keys;
     ch = may_adjust_key_for_ctrl(modifiers, ch);
@@ -1034,63 +1034,64 @@
 	else
 	    button = MOUSE_LEFT;
     }
-    if (button >= 0)
+
+    if (button < 0)
+	return;
+
+    repeated_click = ((int)(currentTime - s_prevTime) < p_mouset);
+
+    /*
+     * Holding down the left and right buttons simulates pushing the middle
+     * button.
+     */
+    if (repeated_click
+	    && ((button == MOUSE_LEFT && s_button_pending == MOUSE_RIGHT)
+		|| (button == MOUSE_RIGHT
+		    && s_button_pending == MOUSE_LEFT)))
     {
-	repeated_click = ((int)(currentTime - s_prevTime) < p_mouset);
-
 	/*
-	 * Holding down the left and right buttons simulates pushing the middle
-	 * button.
+	 * Hmm, gui.c will ignore more than one button down at a time, so
+	 * pretend we let go of it first.
 	 */
-	if (repeated_click
-		&& ((button == MOUSE_LEFT && s_button_pending == MOUSE_RIGHT)
-		    || (button == MOUSE_RIGHT
-					  && s_button_pending == MOUSE_LEFT)))
-	{
-	    /*
-	     * Hmm, gui.c will ignore more than one button down at a time, so
-	     * pretend we let go of it first.
-	     */
-	    gui_send_mouse_event(MOUSE_RELEASE, x, y, FALSE, 0x0);
-	    button = MOUSE_MIDDLE;
-	    repeated_click = FALSE;
-	    s_button_pending = -1;
-	    _OnMouseEvent(button, x, y, repeated_click, keyFlags);
-	}
-	else if ((repeated_click)
-		|| (mouse_model_popup() && (button == MOUSE_RIGHT)))
-	{
-	    if (s_button_pending > -1)
-	    {
-		_OnMouseEvent(s_button_pending, x, y, FALSE, keyFlags);
-		s_button_pending = -1;
-	    }
-	    // TRACE("Button down at x %d, y %d\n", x, y);
-	    _OnMouseEvent(button, x, y, repeated_click, keyFlags);
-	}
-	else
-	{
-	    /*
-	     * If this is the first press (i.e. not a multiple click) don't
-	     * action immediately, but store and wait for:
-	     * i) button-up
-	     * ii) mouse move
-	     * iii) another button press
-	     * before using it.
-	     * This enables us to make left+right simulate middle button,
-	     * without left or right being actioned first.  The side-effect is
-	     * that if you click and hold the mouse without dragging, the
-	     * cursor doesn't move until you release the button. In practice
-	     * this is hardly a problem.
-	     */
-	    s_button_pending = button;
-	    s_x_pending = x;
-	    s_y_pending = y;
-	    s_kFlags_pending = keyFlags;
-	}
-
-	s_prevTime = currentTime;
+	gui_send_mouse_event(MOUSE_RELEASE, x, y, FALSE, 0x0);
+	button = MOUSE_MIDDLE;
+	repeated_click = FALSE;
+	s_button_pending = -1;
+	_OnMouseEvent(button, x, y, repeated_click, keyFlags);
     }
+    else if ((repeated_click)
+	    || (mouse_model_popup() && (button == MOUSE_RIGHT)))
+    {
+	if (s_button_pending > -1)
+	{
+	    _OnMouseEvent(s_button_pending, x, y, FALSE, keyFlags);
+	    s_button_pending = -1;
+	}
+	// TRACE("Button down at x %d, y %d\n", x, y);
+	_OnMouseEvent(button, x, y, repeated_click, keyFlags);
+    }
+    else
+    {
+	/*
+	 * If this is the first press (i.e. not a multiple click) don't
+	 * action immediately, but store and wait for:
+	 * i) button-up
+	 * ii) mouse move
+	 * iii) another button press
+	 * before using it.
+	 * This enables us to make left+right simulate middle button,
+	 * without left or right being actioned first.  The side-effect is
+	 * that if you click and hold the mouse without dragging, the
+	 * cursor doesn't move until you release the button. In practice
+	 * this is hardly a problem.
+	 */
+	s_button_pending = button;
+	s_x_pending = x;
+	s_y_pending = y;
+	s_kFlags_pending = keyFlags;
+    }
+
+    s_prevTime = currentTime;
 }
 
     static void
@@ -1233,23 +1234,23 @@
 	flags = FRD_REPLACEALL;
     }
 
-    if (flags != 0)
-    {
-	char_u	*p, *q;
+    if (flags == 0)
+	return;
 
-	// Call the generic GUI function to do the actual work.
-	if (s_findrep_struct.Flags & FR_WHOLEWORD)
-	    flags |= FRD_WHOLE_WORD;
-	if (s_findrep_struct.Flags & FR_MATCHCASE)
-	    flags |= FRD_MATCH_CASE;
-	down = (s_findrep_struct.Flags & FR_DOWN) != 0;
-	p = utf16_to_enc(s_findrep_struct.lpstrFindWhat, NULL);
-	q = utf16_to_enc(s_findrep_struct.lpstrReplaceWith, NULL);
-	if (p != NULL && q != NULL)
-	    gui_do_findrepl(flags, p, q, down);
-	vim_free(p);
-	vim_free(q);
-    }
+    char_u	*p, *q;
+
+    // Call the generic GUI function to do the actual work.
+    if (s_findrep_struct.Flags & FR_WHOLEWORD)
+	flags |= FRD_WHOLE_WORD;
+    if (s_findrep_struct.Flags & FR_MATCHCASE)
+	flags |= FRD_MATCH_CASE;
+    down = (s_findrep_struct.Flags & FR_DOWN) != 0;
+    p = utf16_to_enc(s_findrep_struct.lpstrFindWhat, NULL);
+    q = utf16_to_enc(s_findrep_struct.lpstrReplaceWith, NULL);
+    if (p != NULL && q != NULL)
+	gui_do_findrepl(flags, p, q, down);
+    vim_free(p);
+    vim_free(q);
 }
 #endif
 
@@ -2932,11 +2933,11 @@
     void
 gui_mch_mousehide(int hide)
 {
-    if (hide != gui.pointer_hidden)
-    {
-	ShowCursor(!hide);
-	gui.pointer_hidden = hide;
-    }
+    if (hide == gui.pointer_hidden)
+	return;
+
+    ShowCursor(!hide);
+    gui.pointer_hidden = hide;
 }
 
 #ifdef FEAT_MENU
@@ -2993,33 +2994,33 @@
 _OnPaint(
     HWND hwnd)
 {
-    if (!IsMinimized(hwnd))
+    if (IsMinimized(hwnd))
+	return;
+
+    PAINTSTRUCT ps;
+
+    out_flush();	    // make sure all output has been processed
+    (void)BeginPaint(hwnd, &ps);
+
+    // prevent multi-byte characters from misprinting on an invalid
+    // rectangle
+    if (has_mbyte)
     {
-	PAINTSTRUCT ps;
+	RECT rect;
 
-	out_flush();	    // make sure all output has been processed
-	(void)BeginPaint(hwnd, &ps);
-
-	// prevent multi-byte characters from misprinting on an invalid
-	// rectangle
-	if (has_mbyte)
-	{
-	    RECT rect;
-
-	    GetClientRect(hwnd, &rect);
-	    ps.rcPaint.left = rect.left;
-	    ps.rcPaint.right = rect.right;
-	}
-
-	if (!IsRectEmpty(&ps.rcPaint))
-	{
-	    gui_redraw(ps.rcPaint.left, ps.rcPaint.top,
-		    ps.rcPaint.right - ps.rcPaint.left + 1,
-		    ps.rcPaint.bottom - ps.rcPaint.top + 1);
-	}
-
-	EndPaint(hwnd, &ps);
+	GetClientRect(hwnd, &rect);
+	ps.rcPaint.left = rect.left;
+	ps.rcPaint.right = rect.right;
     }
+
+    if (!IsRectEmpty(&ps.rcPaint))
+    {
+	gui_redraw(ps.rcPaint.left, ps.rcPaint.top,
+		ps.rcPaint.right - ps.rcPaint.left + 1,
+		ps.rcPaint.bottom - ps.rcPaint.top + 1);
+    }
+
+    EndPaint(hwnd, &ps);
 }
 
     static void
@@ -3904,21 +3905,21 @@
 
     DragFinish(hDrop);
 
-    if (fnames != NULL)
-    {
-	int kbd_modifiers = get_active_modifiers();
+    if (fnames == NULL)
+	return;
 
-	if ((kbd_modifiers & MOD_MASK_SHIFT) != 0)
-	    modifiers |= MOUSE_SHIFT;
-	if ((kbd_modifiers & MOD_MASK_CTRL) != 0)
-	    modifiers |= MOUSE_CTRL;
-	if ((kbd_modifiers & MOD_MASK_ALT) != 0)
-	    modifiers |= MOUSE_ALT;
+    int kbd_modifiers = get_active_modifiers();
 
-	gui_handle_drop(pt.x, pt.y, modifiers, fnames, cFiles);
+    if ((kbd_modifiers & MOD_MASK_SHIFT) != 0)
+	modifiers |= MOUSE_SHIFT;
+    if ((kbd_modifiers & MOD_MASK_CTRL) != 0)
+	modifiers |= MOUSE_CTRL;
+    if ((kbd_modifiers & MOD_MASK_ALT) != 0)
+	modifiers |= MOUSE_ALT;
 
-	s_need_activate = TRUE;
-    }
+    gui_handle_drop(pt.x, pt.y, modifiers, fnames, cFiles);
+
+    s_need_activate = TRUE;
 }
 
     static int
@@ -4461,11 +4462,11 @@
     static void
 destroy_sizing_tip(void)
 {
-    if (hwndTip != NULL)
-    {
-	DestroyWindow(hwndTip);
-	hwndTip = NULL;
-    }
+    if (hwndTip == NULL)
+	return;
+
+    DestroyWindow(hwndTip);
+    hwndTip = NULL;
 }
 
     static int
@@ -5844,64 +5845,64 @@
     }
 # endif
 
-    if (pImmGetContext)	    // if NULL imm32.dll wasn't loaded (yet)
+    if (!pImmGetContext)    // if NULL imm32.dll wasn't loaded (yet)
+	return;
+
+    if (p_imdisable)
     {
-	if (p_imdisable)
+	if (hImcOld == (HIMC)0)
 	{
-	    if (hImcOld == (HIMC)0)
-	    {
-		hImcOld = pImmGetContext(s_hwnd);
-		if (hImcOld)
-		    pImmAssociateContext(s_hwnd, (HIMC)0);
-	    }
-	    active = FALSE;
+	    hImcOld = pImmGetContext(s_hwnd);
+	    if (hImcOld)
+		pImmAssociateContext(s_hwnd, (HIMC)0);
 	}
-	else if (hImcOld != (HIMC)0)
+	active = FALSE;
+    }
+    else if (hImcOld != (HIMC)0)
+    {
+	pImmAssociateContext(s_hwnd, hImcOld);
+	hImcOld = (HIMC)0;
+    }
+
+    hImc = pImmGetContext(s_hwnd);
+    if (!hImc)
+	return;
+
+    /*
+     * for Korean ime
+     */
+    HKL hKL = GetKeyboardLayout(0);
+
+    if (LOWORD(hKL) == MAKELANGID(LANG_KOREAN, SUBLANG_KOREAN))
+    {
+	static DWORD dwConversionSaved = 0, dwSentenceSaved = 0;
+	static BOOL bSaved = FALSE;
+
+	if (active)
 	{
-	    pImmAssociateContext(s_hwnd, hImcOld);
-	    hImcOld = (HIMC)0;
+	    // if we have a saved conversion status, restore it
+	    if (bSaved)
+		pImmSetConversionStatus(hImc, dwConversionSaved,
+			dwSentenceSaved);
+	    bSaved = FALSE;
 	}
-
-	hImc = pImmGetContext(s_hwnd);
-	if (hImc)
+	else
 	{
-	    /*
-	     * for Korean ime
-	     */
-	    HKL hKL = GetKeyboardLayout(0);
-
-	    if (LOWORD(hKL) == MAKELANGID(LANG_KOREAN, SUBLANG_KOREAN))
+	    // save conversion status and disable korean
+	    if (pImmGetConversionStatus(hImc, &dwConversionSaved,
+			&dwSentenceSaved))
 	    {
-		static DWORD dwConversionSaved = 0, dwSentenceSaved = 0;
-		static BOOL bSaved = FALSE;
-
-		if (active)
-		{
-		    // if we have a saved conversion status, restore it
-		    if (bSaved)
-			pImmSetConversionStatus(hImc, dwConversionSaved,
-							     dwSentenceSaved);
-		    bSaved = FALSE;
-		}
-		else
-		{
-		    // save conversion status and disable korean
-		    if (pImmGetConversionStatus(hImc, &dwConversionSaved,
-							    &dwSentenceSaved))
-		    {
-			bSaved = TRUE;
-			pImmSetConversionStatus(hImc,
-				dwConversionSaved & ~(IME_CMODE_NATIVE
-						       | IME_CMODE_FULLSHAPE),
-				dwSentenceSaved);
-		    }
-		}
+		bSaved = TRUE;
+		pImmSetConversionStatus(hImc,
+			dwConversionSaved & ~(IME_CMODE_NATIVE
+			    | IME_CMODE_FULLSHAPE),
+			dwSentenceSaved);
 	    }
-
-	    pImmSetOpenStatus(hImc, active);
-	    pImmReleaseContext(s_hwnd, hImc);
 	}
     }
+
+    pImmSetOpenStatus(hImc, active);
+    pImmReleaseContext(s_hwnd, hImc);
 }
 
 /*
@@ -6459,28 +6460,28 @@
 {
     vimmenu_T	*menu = gui_find_menu(path_name);
 
-    if (menu != NULL)
+    if (menu == NULL)
+	return;
+
+    POINT	p;
+
+    // Find the position of the current cursor
+    GetDCOrgEx(s_hdc, &p);
+    if (mouse_pos)
     {
-	POINT	p;
+	int	mx, my;
 
-	// Find the position of the current cursor
-	GetDCOrgEx(s_hdc, &p);
-	if (mouse_pos)
-	{
-	    int	mx, my;
-
-	    gui_mch_getmouse(&mx, &my);
-	    p.x += mx;
-	    p.y += my;
-	}
-	else if (curwin != NULL)
-	{
-	    p.x += TEXT_X(curwin->w_wincol + curwin->w_wcol + 1);
-	    p.y += TEXT_Y(W_WINROW(curwin) + curwin->w_wrow + 1);
-	}
-	msg_scroll = FALSE;
-	gui_mch_show_popupmenu_at(menu, (int)p.x, (int)p.y);
+	gui_mch_getmouse(&mx, &my);
+	p.x += mx;
+	p.y += my;
     }
+    else if (curwin != NULL)
+    {
+	p.x += TEXT_X(curwin->w_wincol + curwin->w_wcol + 1);
+	p.y += TEXT_Y(W_WINROW(curwin) + curwin->w_wrow + 1);
+    }
+    msg_scroll = FALSE;
+    gui_mch_show_popupmenu_at(menu, (int)p.x, (int)p.y);
 }
 
 # if defined(FEAT_TEAROFF) || defined(PROTO)
@@ -8274,25 +8275,27 @@
     static void
 close_signicon_image(signicon_t *sign)
 {
-    if (sign)
-	switch (sign->uType)
-	{
-	    case IMAGE_BITMAP:
-		DeleteObject((HGDIOBJ)sign->hImage);
-		break;
-	    case IMAGE_CURSOR:
-		DestroyCursor((HCURSOR)sign->hImage);
-		break;
-	    case IMAGE_ICON:
-		DestroyIcon((HICON)sign->hImage);
-		break;
+    if (sign == NULL)
+	return;
+
+    switch (sign->uType)
+    {
+	case IMAGE_BITMAP:
+	    DeleteObject((HGDIOBJ)sign->hImage);
+	    break;
+	case IMAGE_CURSOR:
+	    DestroyCursor((HCURSOR)sign->hImage);
+	    break;
+	case IMAGE_ICON:
+	    DestroyIcon((HICON)sign->hImage);
+	    break;
 # ifdef FEAT_XPM_W32
-	    case IMAGE_XPM:
-		DeleteObject((HBITMAP)sign->hImage);
-		DeleteObject((HBITMAP)sign->hShape);
-		break;
+	case IMAGE_XPM:
+	    DeleteObject((HBITMAP)sign->hImage);
+	    DeleteObject((HBITMAP)sign->hShape);
+	    break;
 # endif
-	}
+    }
 }
 
     void *
@@ -8347,11 +8350,11 @@
     void
 gui_mch_destroy_sign(void *sign)
 {
-    if (sign)
-    {
-	close_signicon_image((signicon_t *)sign);
-	vim_free(sign);
-    }
+    if (sign == NULL)
+	return;
+
+    close_signicon_image((signicon_t *)sign);
+    vim_free(sign);
 }
 #endif
 
@@ -8561,10 +8564,11 @@
     if (pnmh->idFrom != ID_BEVAL_TOOLTIP) // it is not our tooltip
 	return;
 
-    if (cur_beval != NULL)
+    if (cur_beval == NULL)
+	return;
+
+    switch (pnmh->code)
     {
-	switch (pnmh->code)
-	{
 	case TTN_SHOW:
 	    break;
 	case TTN_POP: // Before tooltip disappear
@@ -8589,7 +8593,6 @@
 		info->uFlags |= TTF_DI_SETITEM;
 	    }
 	    break;
-	}
     }
 }
 
diff --git a/src/gui_x11.c b/src/gui_x11.c
index fa81875..a239e0b 100644
--- a/src/gui_x11.c
+++ b/src/gui_x11.c
@@ -2194,11 +2194,11 @@
     void
 gui_mch_set_fg_color(guicolor_T color)
 {
-    if (color != prev_fg_color)
-    {
-	XSetForeground(gui.dpy, gui.text_gc, (Pixel)color);
-	prev_fg_color = color;
-    }
+    if (color == prev_fg_color)
+	return;
+
+    XSetForeground(gui.dpy, gui.text_gc, (Pixel)color);
+    prev_fg_color = color;
 }
 
 /*
@@ -2207,11 +2207,11 @@
     void
 gui_mch_set_bg_color(guicolor_T color)
 {
-    if (color != prev_bg_color)
-    {
-	XSetBackground(gui.dpy, gui.text_gc, (Pixel)color);
-	prev_bg_color = color;
-    }
+    if (color == prev_bg_color)
+	return;
+
+    XSetBackground(gui.dpy, gui.text_gc, (Pixel)color);
+    prev_bg_color = color;
 }
 
 /*
@@ -2814,18 +2814,18 @@
     void
 gui_mch_menu_grey(vimmenu_T *menu, int grey)
 {
-    if (menu->id != (Widget)0)
-    {
-	gui_mch_menu_hidden(menu, False);
-	if (grey
+    if (menu->id == (Widget)0)
+	return;
+
+    gui_mch_menu_hidden(menu, False);
+    if (grey
 #ifdef FEAT_GUI_MOTIF
-		|| !menu->sensitive
+	    || !menu->sensitive
 #endif
-		)
-	    XtSetSensitive(menu->id, False);
-	else
-	    XtSetSensitive(menu->id, True);
-    }
+       )
+	XtSetSensitive(menu->id, False);
+    else
+	XtSetSensitive(menu->id, True);
 }
 
 /*
@@ -2834,13 +2834,13 @@
     void
 gui_mch_menu_hidden(vimmenu_T *menu, int hidden)
 {
-    if (menu->id != (Widget)0)
-    {
-	if (hidden)
-	    XtUnmanageChild(menu->id);
-	else
-	    XtManageChild(menu->id);
-    }
+    if (menu->id == (Widget)0)
+	return;
+
+    if (hidden)
+	XtUnmanageChild(menu->id);
+    else
+	XtManageChild(menu->id);
 }
 
 /*
@@ -3130,15 +3130,15 @@
 {
     XImage	*sign;
 
-    if (gui.in_use && (sign = (XImage *)sign_get_image(typenr)) != NULL)
-    {
-	XClearArea(gui.dpy, gui.wid, TEXT_X(col), TEXT_Y(row) - sign->height,
-		SIGN_WIDTH, gui.char_height, FALSE);
-	XPutImage(gui.dpy, gui.wid, gui.text_gc, sign, 0, 0,
-		TEXT_X(col) + (SIGN_WIDTH - sign->width) / 2,
-		TEXT_Y(row) - sign->height,
-		sign->width, sign->height);
-    }
+    if (!gui.in_use || (sign = (XImage *)sign_get_image(typenr)) == NULL)
+	return;
+
+    XClearArea(gui.dpy, gui.wid, TEXT_X(col), TEXT_Y(row) - sign->height,
+	    SIGN_WIDTH, gui.char_height, FALSE);
+    XPutImage(gui.dpy, gui.wid, gui.text_gc, sign, 0, 0,
+	    TEXT_X(col) + (SIGN_WIDTH - sign->width) / 2,
+	    TEXT_Y(row) - sign->height,
+	    sign->width, sign->height);
 }
 
     void *
@@ -3202,18 +3202,18 @@
 gui_mch_mousehide(
     int		hide)	// TRUE = use blank ptr, FALSE = use parent ptr
 {
-    if (gui.pointer_hidden != hide)
-    {
-	gui.pointer_hidden = hide;
-	if (hide)
-	    XDefineCursor(gui.dpy, gui.wid, gui.blank_pointer);
-	else
+    if (gui.pointer_hidden == hide)
+	return;
+
+    gui.pointer_hidden = hide;
+    if (hide)
+	XDefineCursor(gui.dpy, gui.wid, gui.blank_pointer);
+    else
 #ifdef FEAT_MOUSESHAPE
-	    mch_set_mouse_shape(last_shape);
+	mch_set_mouse_shape(last_shape);
 #else
-	    XUndefineCursor(gui.dpy, gui.wid);
+    XUndefineCursor(gui.dpy, gui.wid);
 #endif
-    }
 }
 
 #if defined(FEAT_MOUSESHAPE) || defined(PROTO)
@@ -3280,22 +3280,22 @@
     void
 gui_mch_menu_set_tip(vimmenu_T *menu)
 {
-    if (menu->id != NULL && menu->parent != NULL
-				       && menu_is_toolbar(menu->parent->name))
+    if (menu->id == NULL || menu->parent == NULL
+				|| !menu_is_toolbar(menu->parent->name))
+	return;
+
+    // Always destroy and create the balloon, in case the string was
+    // changed.
+    if (menu->tip != NULL)
     {
-	// Always destroy and create the balloon, in case the string was
-	// changed.
-	if (menu->tip != NULL)
-	{
-	    gui_mch_destroy_beval_area(menu->tip);
-	    menu->tip = NULL;
-	}
-	if (menu->strings[MENU_INDEX_TIP] != NULL)
-	    menu->tip = gui_mch_create_beval_area(
-		    menu->id,
-		    menu->strings[MENU_INDEX_TIP],
-		    NULL,
-		    NULL);
+	gui_mch_destroy_beval_area(menu->tip);
+	menu->tip = NULL;
     }
+    if (menu->strings[MENU_INDEX_TIP] != NULL)
+	menu->tip = gui_mch_create_beval_area(
+		menu->id,
+		menu->strings[MENU_INDEX_TIP],
+		NULL,
+		NULL);
 }
 #endif
diff --git a/src/gui_xim.c b/src/gui_xim.c
index 6998f0c..163cbda 100644
--- a/src/gui_xim.c
+++ b/src/gui_xim.c
@@ -199,32 +199,32 @@
     void
 xim_set_focus(int focus)
 {
-    if (xic != NULL)
-    {
-	if (focus)
-	    gtk_im_context_focus_in(xic);
-	else
-	    gtk_im_context_focus_out(xic);
-    }
+    if (xic == NULL)
+	return;
+
+    if (focus)
+	gtk_im_context_focus_in(xic);
+    else
+	gtk_im_context_focus_out(xic);
 }
 
     void
 im_set_position(int row, int col)
 {
-    if (xic != NULL)
-    {
-	GdkRectangle area;
+    if (xic == NULL)
+	return;
 
-	area.x = FILL_X(col);
-	area.y = FILL_Y(row);
-	area.width  = gui.char_width * (mb_lefthalve(row, col) ? 2 : 1);
-	area.height = gui.char_height;
+    GdkRectangle area;
 
-	gtk_im_context_set_cursor_location(xic, &area);
+    area.x = FILL_X(col);
+    area.y = FILL_Y(row);
+    area.width  = gui.char_width * (mb_lefthalve(row, col) ? 2 : 1);
+    area.height = gui.char_height;
 
-	if (p_imst == IM_OVER_THE_SPOT)
-	    im_preedit_window_set_position();
-    }
+    gtk_im_context_set_cursor_location(xic, &area);
+
+    if (p_imst == IM_OVER_THE_SPOT)
+	im_preedit_window_set_position();
 }
 
 #  if 0 || defined(PROTO) // apparently only used in gui_x11.c
diff --git a/src/version.c b/src/version.c
index d2efc12..560fb9d 100644
--- a/src/version.c
+++ b/src/version.c
@@ -696,6 +696,8 @@
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1158,
+/**/
     1157,
 /**/
     1156,
