diff --git a/src/gui.c b/src/gui.c
index d7ff155..d6b9eb1 100644
--- a/src/gui.c
+++ b/src/gui.c
@@ -73,7 +73,7 @@
  * recursive call.
  */
     void
-gui_start()
+gui_start(void)
 {
     char_u	*old_term;
     static int	recursive = 0;
@@ -152,7 +152,7 @@
  * full_screen will be set to TRUE again by a successful termcapinit().
  */
     static void
-gui_attempt_start()
+gui_attempt_start(void)
 {
     static int recursive = 0;
 
@@ -204,7 +204,7 @@
  * and the child will return.
  */
     static void
-gui_do_fork()
+gui_do_fork(void)
 {
     int		pipefd[2];	/* pipe between parent and child */
     int		pipe_error;
@@ -345,9 +345,7 @@
  * Call this when vim starts up, whether or not the GUI is started
  */
     void
-gui_prepare(argc, argv)
-    int	    *argc;
-    char    **argv;
+gui_prepare(int *argc, char **argv)
 {
     gui.in_use = FALSE;		    /* No GUI yet (maybe later) */
     gui.starting = FALSE;	    /* No GUI yet (maybe later) */
@@ -361,7 +359,7 @@
  * Returns FAIL or OK.
  */
     int
-gui_init_check()
+gui_init_check(void)
 {
     static int result = MAYBE;
 
@@ -461,7 +459,7 @@
  * This is the call which starts the GUI.
  */
     void
-gui_init()
+gui_init(void)
 {
     win_T	*wp;
     static int	recursive = 0;
@@ -789,8 +787,7 @@
 
 
     void
-gui_exit(rc)
-    int		rc;
+gui_exit(int rc)
 {
     /* don't free the fonts, it leads to a BUS error
      * richard@whitequeen.com Jul 99 */
@@ -809,7 +806,7 @@
  * When this function returns, Vim should NOT exit!
  */
     void
-gui_shell_closed()
+gui_shell_closed(void)
 {
     cmdmod_T	    save_cmdmod;
 
@@ -843,9 +840,7 @@
  * the fonts are unchanged.
  */
     int
-gui_init_font(font_list, fontset)
-    char_u	*font_list;
-    int		fontset UNUSED;
+gui_init_font(char_u *font_list, int fontset UNUSED)
 {
 #define FONTLEN 320
     char_u	font_name[FONTLEN];
@@ -926,8 +921,7 @@
  * Try setting 'guifontwide' to a font twice as wide as "name".
  */
     static void
-set_guifontwide(name)
-    char_u	*name;
+set_guifontwide(char_u *name)
 {
     int		i = 0;
     char_u	wide_name[FONTLEN + 10]; /* room for 2 * width and '*' */
@@ -976,7 +970,7 @@
  * Return FAIL for an invalid font name.
  */
     int
-gui_get_wide_font()
+gui_get_wide_font(void)
 {
     GuiFont	font = NOFONT;
     char_u	font_name[FONTLEN];
@@ -1024,9 +1018,7 @@
 #endif
 
     void
-gui_set_cursor(row, col)
-    int	    row;
-    int	    col;
+gui_set_cursor(int row, int col)
 {
     gui.row = row;
     gui.col = col;
@@ -1036,7 +1028,7 @@
  * gui_check_pos - check if the cursor is on the screen.
  */
     static void
-gui_check_pos()
+gui_check_pos(void)
 {
     if (gui.row >= screen_Rows)
 	gui.row = screen_Rows - 1;
@@ -1052,9 +1044,9 @@
  * otherwise this goes wrong.  May need to call out_flush() first.
  */
     void
-gui_update_cursor(force, clear_selection)
-    int		force;		/* when TRUE, update even when not moved */
-    int		clear_selection;/* clear selection under cursor */
+gui_update_cursor(
+    int		force,		/* when TRUE, update even when not moved */
+    int		clear_selection)/* clear selection under cursor */
 {
     int		cur_width = 0;
     int		cur_height = 0;
@@ -1301,7 +1293,7 @@
 
 #if defined(FEAT_MENU) || defined(PROTO)
     void
-gui_position_menu()
+gui_position_menu(void)
 {
 # if !defined(FEAT_GUI_GTK) && !defined(FEAT_GUI_MOTIF)
     if (gui.menu_is_active && gui.in_use)
@@ -1315,8 +1307,7 @@
  * scrollbars are NOT handled here.  See gui_update_scrollbars().
  */
     static void
-gui_position_components(total_width)
-    int	    total_width UNUSED;
+gui_position_components(int total_width UNUSED)
 {
     int	    text_area_x;
     int	    text_area_y;
@@ -1388,7 +1379,7 @@
  * Get the width of the widgets and decorations to the side of the text area.
  */
     int
-gui_get_base_width()
+gui_get_base_width(void)
 {
     int	    base_width;
 
@@ -1404,7 +1395,7 @@
  * Get the height of the widgets and decorations above and below the text area.
  */
     int
-gui_get_base_height()
+gui_get_base_height(void)
 {
     int	    base_height;
 
@@ -1449,9 +1440,7 @@
  * the new width and height of the shell in pixels.
  */
     void
-gui_resize_shell(pixel_width, pixel_height)
-    int		pixel_width;
-    int		pixel_height;
+gui_resize_shell(int pixel_width, int pixel_height)
 {
     static int	busy = FALSE;
 
@@ -1520,7 +1509,7 @@
  * Check if gui_resize_shell() must be called.
  */
     void
-gui_may_resize_shell()
+gui_may_resize_shell(void)
 {
     int		h, w;
 
@@ -1537,7 +1526,7 @@
 }
 
     int
-gui_get_shellsize()
+gui_get_shellsize(void)
 {
     Rows = gui.num_rows;
     Columns = gui.num_cols;
@@ -1550,10 +1539,10 @@
  * on the screen.
  */
     void
-gui_set_shellsize(mustset, fit_to_display, direction)
-    int		mustset UNUSED;		/* set by the user */
-    int		fit_to_display;
-    int		direction;		/* RESIZE_HOR, RESIZE_VER */
+gui_set_shellsize(
+    int		mustset UNUSED,		/* set by the user */
+    int		fit_to_display,
+    int		direction)		/* RESIZE_HOR, RESIZE_VER */
 {
     int		base_width;
     int		base_height;
@@ -1676,7 +1665,7 @@
  * Called when Rows and/or Columns has changed.
  */
     void
-gui_new_shellsize()
+gui_new_shellsize(void)
 {
     gui_reset_scroll_region();
 }
@@ -1685,7 +1674,7 @@
  * Make scroll region cover whole screen.
  */
     void
-gui_reset_scroll_region()
+gui_reset_scroll_region(void)
 {
     gui.scroll_region_top = 0;
     gui.scroll_region_bot = gui.num_rows - 1;
@@ -1694,8 +1683,7 @@
 }
 
     void
-gui_start_highlight(mask)
-    int	    mask;
+gui_start_highlight(int mask)
 {
     if (mask > HL_ALL)		    /* highlight code */
 	gui.highlight_mask = mask;
@@ -1704,8 +1692,7 @@
 }
 
     void
-gui_stop_highlight(mask)
-    int	    mask;
+gui_stop_highlight(int mask)
 {
     if (mask > HL_ALL)		    /* highlight code */
 	gui.highlight_mask = HL_NORMAL;
@@ -1718,11 +1705,11 @@
  * (row2, col2) inclusive.
  */
     void
-gui_clear_block(row1, col1, row2, col2)
-    int	    row1;
-    int	    col1;
-    int	    row2;
-    int	    col2;
+gui_clear_block(
+    int	    row1,
+    int	    col1,
+    int	    row2,
+    int	    col2)
 {
     /* Clear the selection if we are about to write over it */
     clip_may_clear_selection(row1, row2);
@@ -1740,15 +1727,15 @@
  * output buffer before calling gui_update_cursor().
  */
     void
-gui_update_cursor_later()
+gui_update_cursor_later(void)
 {
-    OUT_STR(IF_EB("\033|s", ESC_STR "|s"));
+ OUT_STR(IF_EB("\033|s", ESC_STR "|s"));
 }
 
     void
-gui_write(s, len)
-    char_u	*s;
-    int		len;
+gui_write(
+    char_u	*s,
+    int		len)
 {
     char_u	*p;
     int		arg1 = 0, arg2 = 0;
@@ -1977,7 +1964,7 @@
  * gui_can_update_cursor() afterwards.
  */
     void
-gui_dont_update_cursor()
+gui_dont_update_cursor(void)
 {
     if (gui.in_use)
     {
@@ -1988,7 +1975,7 @@
 }
 
     void
-gui_can_update_cursor()
+gui_can_update_cursor(void)
 {
     can_update_cursor = TRUE;
     /* No need to update the cursor right now, there is always more output
@@ -1996,9 +1983,7 @@
 }
 
     static void
-gui_outstr(s, len)
-    char_u  *s;
-    int	    len;
+gui_outstr(char_u *s, int len)
 {
     int	    this_len;
 #ifdef FEAT_MBYTE
@@ -2060,11 +2045,12 @@
  * Returns FAIL or OK, just like gui_outstr_nowrap().
  */
     static int
-gui_screenchar(off, flags, fg, bg, back)
-    int		off;	    /* Offset from start of screen */
-    int		flags;
-    guicolor_T	fg, bg;	    /* colors for cursor */
-    int		back;	    /* backup this many chars when using bold trick */
+gui_screenchar(
+    int		off,	    /* Offset from start of screen */
+    int		flags,
+    guicolor_T	fg,	    /* colors for cursor */
+    guicolor_T	bg,	    /* colors for cursor */
+    int		back)	    /* backup this many chars when using bold trick */
 {
 #ifdef FEAT_MBYTE
     char_u	buf[MB_MAXBYTES + 1];
@@ -2101,12 +2087,13 @@
  * as possible to work nicely.  It's a lot faster as well.
  */
     static int
-gui_screenstr(off, len, flags, fg, bg, back)
-    int		off;	    /* Offset from start of screen */
-    int		len;	    /* string length in screen cells */
-    int		flags;
-    guicolor_T	fg, bg;	    /* colors for cursor */
-    int		back;	    /* backup this many chars when using bold trick */
+gui_screenstr(
+    int		off,	    /* Offset from start of screen */
+    int		len,	    /* string length in screen cells */
+    int		flags,
+    guicolor_T	fg,	    /* colors for cursor */
+    guicolor_T	bg,	    /* colors for cursor */
+    int		back)	    /* backup this many chars when using bold trick */
 {
     char_u  *buf;
     int	    outlen = 0;
@@ -2184,12 +2171,13 @@
  * FAIL (the caller should start drawing "back" chars back).
  */
     int
-gui_outstr_nowrap(s, len, flags, fg, bg, back)
-    char_u	*s;
-    int		len;
-    int		flags;
-    guicolor_T	fg, bg;	    /* colors for cursor */
-    int		back;	    /* backup this many chars when using bold trick */
+gui_outstr_nowrap(
+    char_u	*s,
+    int		len,
+    int		flags,
+    guicolor_T	fg,	    /* colors for cursor */
+    guicolor_T	bg,	    /* colors for cursor */
+    int		back)	    /* backup this many chars when using bold trick */
 {
     long_u	highlight_mask;
     long_u	hl_mask_todo;
@@ -2576,7 +2564,7 @@
  * position.  The character just before it too, for when it was in bold.
  */
     void
-gui_undraw_cursor()
+gui_undraw_cursor(void)
 {
     if (gui.cursor_is_valid)
     {
@@ -2617,11 +2605,11 @@
 }
 
     void
-gui_redraw(x, y, w, h)
-    int		x;
-    int		y;
-    int		w;
-    int		h;
+gui_redraw(
+    int		x,
+    int		y,
+    int		w,
+    int		h)
 {
     int		row1, col1, row2, col2;
 
@@ -2650,12 +2638,12 @@
  * different attributes (may have to be redrawn too).
  */
     int
-gui_redraw_block(row1, col1, row2, col2, flags)
-    int		row1;
-    int		col1;
-    int		row2;
-    int		col2;
-    int		flags;	/* flags for gui_outstr_nowrap() */
+gui_redraw_block(
+    int		row1,
+    int		col1,
+    int		row2,
+    int		col2,
+    int		flags)	/* flags for gui_outstr_nowrap() */
 {
     int		old_row, old_col;
     long_u	old_hl_mask;
@@ -2814,9 +2802,7 @@
 }
 
     static void
-gui_delete_lines(row, count)
-    int	    row;
-    int	    count;
+gui_delete_lines(int row, int count)
 {
     if (count <= 0)
 	return;
@@ -2844,9 +2830,7 @@
 }
 
     static void
-gui_insert_lines(row, count)
-    int	    row;
-    int	    count;
+gui_insert_lines(int row, int count)
 {
     if (count <= 0)
 	return;
@@ -2880,8 +2864,7 @@
  * or FAIL otherwise.
  */
     int
-gui_wait_for_chars(wtime)
-    long    wtime;
+gui_wait_for_chars(long wtime)
 {
     int	    retval;
 
@@ -2956,10 +2939,7 @@
  * Fill p[4] with mouse coordinates encoded for check_termcode().
  */
     static void
-fill_mouse_coord(p, col, row)
-    char_u	*p;
-    int		col;
-    int		row;
+fill_mouse_coord(char_u *p, int col, int row)
 {
     p[0] = (char_u)(col / 128 + ' ' + 1);
     p[1] = (char_u)(col % 128 + ' ' + 1);
@@ -2984,12 +2964,12 @@
  * character.
  */
     void
-gui_send_mouse_event(button, x, y, repeated_click, modifiers)
-    int	    button;
-    int	    x;
-    int	    y;
-    int	    repeated_click;
-    int_u   modifiers;
+gui_send_mouse_event(
+    int	    button,
+    int	    x,
+    int	    y,
+    int	    repeated_click,
+    int_u   modifiers)
 {
     static int	    prev_row = 0, prev_col = 0;
     static int	    prev_button = -1;
@@ -3299,10 +3279,7 @@
  * returns column in "*colp" and row as return value;
  */
     int
-gui_xy2colrow(x, y, colp)
-    int		x;
-    int		y;
-    int		*colp;
+gui_xy2colrow(int x, int y, int *colp)
 {
     int		col = check_col(X_2_COL(x));
     int		row = check_row(Y_2_ROW(y));
@@ -3320,8 +3297,7 @@
  * Callback function for when a menu entry has been selected.
  */
     void
-gui_menu_cb(menu)
-    vimmenu_T *menu;
+gui_menu_cb(vimmenu_T *menu)
 {
     char_u  bytes[sizeof(long_u)];
 
@@ -3346,8 +3322,7 @@
  * in p_go.
  */
     void
-gui_init_which_components(oldval)
-    char_u	*oldval UNUSED;
+gui_init_which_components(char_u *oldval UNUSED)
 {
 #ifdef FEAT_MENU
     static int	prev_menu_is_active = -1;
@@ -3599,7 +3574,7 @@
  * It may still be hidden if 'showtabline' is zero.
  */
     int
-gui_use_tabline()
+gui_use_tabline(void)
 {
     return gui.in_use && vim_strchr(p_go, GO_TABLINE) != NULL;
 }
@@ -3609,7 +3584,7 @@
  * This uses 'showtabline'.
  */
     static int
-gui_has_tabline()
+gui_has_tabline(void)
 {
     if (!gui_use_tabline()
 	    || p_stal == 0
@@ -3623,7 +3598,7 @@
  * This may display/undisplay the tabline and update the labels.
  */
     void
-gui_update_tabline()
+gui_update_tabline(void)
 {
     int	    showit = gui_has_tabline();
     int	    shown = gui_mch_showing_tabline();
@@ -3651,9 +3626,9 @@
  * Get the label or tooltip for tab page "tp" into NameBuff[].
  */
     void
-get_tabline_label(tp, tooltip)
-    tabpage_T	*tp;
-    int		tooltip;	/* TRUE: get tooltip */
+get_tabline_label(
+    tabpage_T	*tp,
+    int		tooltip)	/* TRUE: get tooltip */
 {
     int		modified = FALSE;
     char_u	buf[40];
@@ -3744,8 +3719,7 @@
  * that tab page or the cmdline window is open.
  */
     int
-send_tabline_event(nr)
-    int	    nr;
+send_tabline_event(int nr)
 {
     char_u string[3];
 
@@ -3777,9 +3751,7 @@
  * Send a tabline menu event
  */
     void
-send_tabline_menu_event(tabidx, event)
-    int	    tabidx;
-    int	    event;
+send_tabline_menu_event(int tabidx, int event)
 {
     char_u	    string[3];
 
@@ -3807,7 +3779,7 @@
  * Remove all scrollbars.  Used before switching to another tab page.
  */
     void
-gui_remove_scrollbars()
+gui_remove_scrollbars(void)
 {
     int	    i;
     win_T   *wp;
@@ -3829,10 +3801,7 @@
 #endif
 
     void
-gui_create_scrollbar(sb, type, wp)
-    scrollbar_T	*sb;
-    int		type;
-    win_T	*wp;
+gui_create_scrollbar(scrollbar_T *sb, int type, win_T *wp)
 {
     static int	sbar_ident = 0;
 
@@ -3858,8 +3827,7 @@
  * Find the scrollbar with the given index.
  */
     scrollbar_T *
-gui_find_scrollbar(ident)
-    long	ident;
+gui_find_scrollbar(long ident)
 {
     win_T	*wp;
 
@@ -3891,10 +3859,7 @@
  * are still characters to be processed.
  */
     void
-gui_drag_scrollbar(sb, value, still_dragging)
-    scrollbar_T	*sb;
-    long	value;
-    int		still_dragging;
+gui_drag_scrollbar(scrollbar_T *sb, long value, int still_dragging)
 {
 #ifdef FEAT_WINDOWS
     win_T	*wp;
@@ -4112,7 +4077,7 @@
  * Called when something in the window layout has changed.
  */
     void
-gui_may_update_scrollbars()
+gui_may_update_scrollbars(void)
 {
     if (gui.in_use && starting == 0)
     {
@@ -4125,8 +4090,8 @@
 #endif
 
     void
-gui_update_scrollbars(force)
-    int		force;	    /* Force all scrollbars to get updated */
+gui_update_scrollbars(
+    int		force)	    /* Force all scrollbars to get updated */
 {
     win_T	*wp;
     scrollbar_T	*sb;
@@ -4340,10 +4305,10 @@
  * sometimes.
  */
     static void
-gui_do_scrollbar(wp, which, enable)
-    win_T	*wp;
-    int		which;	    /* SBAR_LEFT or SBAR_RIGHT */
-    int		enable;	    /* TRUE to enable scrollbar */
+gui_do_scrollbar(
+    win_T	*wp,
+    int		which,	    /* SBAR_LEFT or SBAR_RIGHT */
+    int		enable)	    /* TRUE to enable scrollbar */
 {
 #ifdef FEAT_VERTSPLIT
     int		midcol = curwin->w_wincol + curwin->w_width / 2;
@@ -4386,7 +4351,7 @@
  * or FALSE otherwise.
  */
     int
-gui_do_scroll()
+gui_do_scroll(void)
 {
     win_T	*wp, *save_wp;
     int		i;
@@ -4498,8 +4463,7 @@
  * Return length of line "lnum" for horizontal scrolling.
  */
     static colnr_T
-scroll_line_len(lnum)
-    linenr_T	lnum;
+scroll_line_len(linenr_T lnum)
 {
     char_u	*p;
     colnr_T	col;
@@ -4528,7 +4492,7 @@
  * by setting 'h' in "guioptions") then the current line number is returned.
  */
     static linenr_T
-gui_find_longest_lnum()
+gui_find_longest_lnum(void)
 {
     linenr_T ret = 0;
 
@@ -4569,8 +4533,7 @@
 }
 
     static void
-gui_update_horiz_scrollbar(force)
-    int		force;
+gui_update_horiz_scrollbar(int force)
 {
     long	value, size, max;	/* need 32 bit ints here */
 
@@ -4662,9 +4625,7 @@
  * Do a horizontal scroll.  Return TRUE if the cursor moved, FALSE otherwise.
  */
     int
-gui_do_horiz_scroll(leftcol, compute_longest_lnum)
-    long_u	leftcol;
-    int		compute_longest_lnum;
+gui_do_horiz_scroll(long_u leftcol, int compute_longest_lnum)
 {
     /* no wrapping, no scrolling */
     if (curwin->w_p_wrap)
@@ -4702,7 +4663,7 @@
  * Check that none of the colors are the same as the background color
  */
     void
-gui_check_colors()
+gui_check_colors(void)
 {
     if (gui.norm_pixel == gui.back_pixel || gui.norm_pixel == INVALCOLOR)
     {
@@ -4713,16 +4674,14 @@
 }
 
     static void
-gui_set_fg_color(name)
-    char_u	*name;
+gui_set_fg_color(char_u *name)
 {
     gui.norm_pixel = gui_get_color(name);
     hl_set_fg_color_name(vim_strsave(name));
 }
 
     static void
-gui_set_bg_color(name)
-    char_u	*name;
+gui_set_bg_color(char_u *name)
 {
     gui.back_pixel = gui_get_color(name);
     hl_set_bg_color_name(vim_strsave(name));
@@ -4733,8 +4692,7 @@
  * Returns INVALCOLOR and gives an error message when failed.
  */
     guicolor_T
-gui_get_color(name)
-    char_u	*name;
+gui_get_color(char_u *name)
 {
     guicolor_T	t;
 
@@ -4755,8 +4713,7 @@
  * Return the grey value of a color (range 0-255).
  */
     int
-gui_get_lightness(pixel)
-    guicolor_T	pixel;
+gui_get_lightness(guicolor_T pixel)
 {
     long_u	rgb = gui_mch_get_rgb(pixel);
 
@@ -4767,7 +4724,7 @@
 
 #if defined(FEAT_GUI_X11) || defined(PROTO)
     void
-gui_new_scrollbar_colors()
+gui_new_scrollbar_colors(void)
 {
     win_T	*wp;
 
@@ -4788,8 +4745,7 @@
  * Call this when focus has changed.
  */
     void
-gui_focus_change(in_focus)
-    int		in_focus;
+gui_focus_change(int in_focus)
 {
 /*
  * Skip this code to avoid drawing the cursor when debugging and switching
@@ -4823,9 +4779,7 @@
  * Called when the mouse moved (but not when dragging).
  */
     void
-gui_mouse_moved(x, y)
-    int		x;
-    int		y;
+gui_mouse_moved(int x, int y)
 {
     win_T	*wp;
     char_u	st[8];
@@ -4902,7 +4856,7 @@
  * Called when mouse should be moved to window with focus.
  */
     void
-gui_mouse_correct()
+gui_mouse_correct(void)
 {
     int		x, y;
     win_T	*wp = NULL;
@@ -4935,9 +4889,7 @@
  * Find window where the mouse pointer "y" coordinate is in.
  */
     static win_T *
-xy2win(x, y)
-    int		x UNUSED;
-    int		y UNUSED;
+xy2win(int x UNUSED, int y UNUSED)
 {
 #ifdef FEAT_WINDOWS
     int		row;
@@ -4981,8 +4933,7 @@
  * File names may be given to redefine the args list.
  */
     void
-ex_gui(eap)
-    exarg_T	*eap;
+ex_gui(exarg_T *eap)
 {
     char_u	*arg = eap->arg;
 
@@ -5023,9 +4974,7 @@
  * Callback function for do_in_runtimepath().
  */
     static void
-gfp_setname(fname, cookie)
-    char_u	*fname;
-    void	*cookie;
+gfp_setname(char_u *fname, void *cookie)
 {
     char_u	*gfp_buffer = cookie;
 
@@ -5040,10 +4989,7 @@
  * Return FAIL for failure and OK if buffer[MAXPATHL] contains the result.
  */
     int
-gui_find_bitmap(name, buffer, ext)
-    char_u	*name;
-    char_u	*buffer;
-    char	*ext;
+gui_find_bitmap(char_u *name, char_u *buffer, char *ext)
 {
     if (STRLEN(name) > MAXPATHL - 14)
 	return FAIL;
@@ -5063,10 +5009,7 @@
  * contains "name".
  */
     void
-gui_find_iconfile(name, buffer, ext)
-    char_u	*name;
-    char_u	*buffer;
-    char	*ext;
+gui_find_iconfile(char_u *name, char_u *buffer, char *ext)
 {
     char_u	buf[MAXPATHL + 1];
 
@@ -5079,7 +5022,7 @@
 
 #if defined(FEAT_GUI_GTK) || defined(FEAT_GUI_X11) || defined(PROTO)
     void
-display_errors()
+display_errors(void)
 {
     char_u	*p;
 
@@ -5111,7 +5054,7 @@
  * allow typing on stdin.
  */
     int
-no_console_input()
+no_console_input(void)
 {
     return ((!gui.in_use || gui.starting)
 # ifndef NO_CONSOLE
@@ -5128,7 +5071,7 @@
  * Update the current window and the screen.
  */
     void
-gui_update_screen()
+gui_update_screen(void)
 {
 #ifdef FEAT_CONCEAL
     linenr_T	conceal_old_cursor_line = 0;
@@ -5199,10 +5142,10 @@
  * Returns an allocated string.
  */
     char_u *
-get_find_dialog_text(arg, wwordp, mcasep)
-    char_u	*arg;
-    int		*wwordp;	/* return: TRUE if \< \> found */
-    int		*mcasep;	/* return: TRUE if \C found */
+get_find_dialog_text(
+    char_u	*arg,
+    int		*wwordp,	/* return: TRUE if \< \> found */
+    int		*mcasep)	/* return: TRUE if \C found */
 {
     char_u	*text;
 
@@ -5260,10 +5203,7 @@
  * Concatenate "text" to grow array "gap", escaping "what" with a backslash.
  */
     static void
-concat_esc(gap, text, what)
-    garray_T	*gap;
-    char_u	*text;
-    int		what;
+concat_esc(garray_T *gap, char_u *text, int what)
 {
     while (*text != NUL)
     {
@@ -5289,11 +5229,11 @@
  * Return TRUE when something was added to the input buffer.
  */
     int
-gui_do_findrepl(flags, find_text, repl_text, down)
-    int		flags;		/* one of FRD_REPLACE, FRD_FINDNEXT, etc. */
-    char_u	*find_text;
-    char_u	*repl_text;
-    int		down;		/* Search downwards. */
+gui_do_findrepl(
+    int		flags,		/* one of FRD_REPLACE, FRD_FINDNEXT, etc. */
+    char_u	*find_text,
+    char_u	*repl_text,
+    int		down)		/* Search downwards. */
 {
     garray_T	ga;
     int		i;
@@ -5422,9 +5362,7 @@
  * Jump to the window at specified point (x, y).
  */
     static void
-gui_wingoto_xy(x, y)
-    int x;
-    int y;
+gui_wingoto_xy(int x, int y)
 {
     int		row = Y_2_ROW(y);
     int		col = X_2_COL(x);
@@ -5446,12 +5384,12 @@
  * fnames after call this function.
  */
     void
-gui_handle_drop(x, y, modifiers, fnames, count)
-    int		x UNUSED;
-    int		y UNUSED;
-    int_u	modifiers;
-    char_u	**fnames;
-    int		count;
+gui_handle_drop(
+    int		x UNUSED,
+    int		y UNUSED,
+    int_u	modifiers,
+    char_u	**fnames,
+    int		count)
 {
     int		i;
     char_u	*p;
