updated for version 7.0022
diff --git a/src/eval.c b/src/eval.c
index 2778379..b5b4b79 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -300,6 +300,7 @@
 static void f_getcmdline __ARGS((VAR argvars, VAR retvar));
 static void f_getcmdpos __ARGS((VAR argvars, VAR retvar));
 static void f_getcwd __ARGS((VAR argvars, VAR retvar));
+static void f_getfontname __ARGS((VAR argvars, VAR retvar));
 static void f_getfperm __ARGS((VAR argvars, VAR retvar));
 static void f_getfsize __ARGS((VAR argvars, VAR retvar));
 static void f_getftime __ARGS((VAR argvars, VAR retvar));
@@ -2864,6 +2865,7 @@
     {"getcmdline",	0, 0, f_getcmdline},
     {"getcmdpos",	0, 0, f_getcmdpos},
     {"getcwd",		0, 0, f_getcwd},
+    {"getfontname",	0, 1, f_getfontname},
     {"getfperm",	1, 1, f_getfperm},
     {"getfsize",	1, 1, f_getfsize},
     {"getftime",	1, 1, f_getftime},
@@ -4732,6 +4734,45 @@
 }
 
 /*
+ * "getfontname()" function
+ */
+    static void
+f_getfontname(argvars, retvar)
+    VAR		argvars;
+    VAR		retvar;
+{
+    retvar->var_type = VAR_STRING;
+    retvar->var_val.var_string = NULL;
+#ifdef FEAT_GUI
+    if (gui.in_use)
+    {
+	GuiFont font;
+	char_u	*name = NULL;
+
+	if (argvars[0].var_type == VAR_UNKNOWN)
+	{
+	    /* Get the "Normal" font.  Either the name saved by
+	     * hl_set_font_name() or from the font ID. */
+	    font = gui.norm_font;
+	    name = hl_get_font_name();
+	}
+	else
+	{
+	    name = get_var_string(&argvars[0]);
+	    if (STRCMP(name, "*") == 0)	    /* don't use font dialog */
+		return;
+	    font = gui_mch_get_font(name, FALSE);
+	    if (font == NOFONT)
+		return;	    /* Invalid font name, return empty string. */
+	}
+	retvar->var_val.var_string = gui_mch_get_fontname(font, name);
+	if (argvars[0].var_type != VAR_UNKNOWN)
+	    gui_mch_free_font(font);
+    }
+#endif
+}
+
+/*
  * "getfperm({fname})" function
  */
     static void
diff --git a/src/gui_gtk_x11.c b/src/gui_gtk_x11.c
index b67b6f2..34bbed5 100644
--- a/src/gui_gtk_x11.c
+++ b/src/gui_gtk_x11.c
@@ -2722,7 +2722,7 @@
 
     if (gui.norm_font != NULL)
     {
-	gui_mch_init_font(p_guifont, 0);
+	gui_mch_init_font(p_guifont, FALSE);
 	gui_set_shellsize(FALSE, FALSE);
     }
 }
@@ -4792,6 +4792,34 @@
     return font;
 }
 
+/*
+ * Return the name of font "font" in allocated memory.
+ */
+/*ARGSUSED*/
+    char_u *
+gui_mch_get_fontname(GuiFont font, char_u *name)
+{
+#ifdef HAVE_GTK2
+    if (font != NOFONT)
+    {
+	char	*name = pango_font_description_to_string(font);
+
+	if (name != NULL)
+	{
+	    char_u	*s = vim_strsave((char_u *)name);
+
+	    g_free(name);
+	    return s;
+	}
+    }
+#else
+    /* Don't know how to get the name, return what we got. */
+    if (name != NULL)
+	return vim_strsave(name);
+#endif
+    return NULL;
+}
+
 #if !defined(HAVE_GTK2) || defined(PROTO)
 /*
  * Set the current text font.
diff --git a/src/gui_x11.c b/src/gui_x11.c
index e57bb92..90e6fbd 100644
--- a/src/gui_x11.c
+++ b/src/gui_x11.c
@@ -1988,6 +1988,20 @@
     return (GuiFont)font;
 }
 
+/*
+ * Return the name of font "font" in allocated memory.
+ * Don't know how to get the actual name, thus use the provided name.
+ */
+    char_u *
+gui_mch_get_fontname(font, name)
+    GuiFont font;
+    char_u  *name;
+{
+    if (name == NULL)
+	return NULL;
+    return vim_strsave(name);
+}
+
     int
 gui_mch_adjust_charsize()
 {
diff --git a/src/proto/gui_amiga.pro b/src/proto/gui_amiga.pro
index ec70bc1..2f8d2ac 100644
--- a/src/proto/gui_amiga.pro
+++ b/src/proto/gui_amiga.pro
@@ -20,9 +20,11 @@
 void gui_mch_set_scrollbar_pos __ARGS((scrollbar_T *sb, int x, int y, int w, int h));
 void gui_mch_create_scrollbar __ARGS((scrollbar_T *sb, int orient));
 void gui_mch_destroy_scrollbar __ARGS((scrollbar_T *sb));
+char_u *gui_mch_getfontname __ARGS((GuiFont font));
 int gui_mch_init_font __ARGS((char_u *font_name, int fontset));
 int gui_mch_adjust_charsize __ARGS((void));
 GuiFont gui_mch_get_font __ARGS((char_u *name, int giveErrorIfMissing));
+char_u *gui_mch_get_fontname __ARGS((GuiFont font, char_u *name));
 void gui_mch_set_font __ARGS((GuiFont font));
 void gui_mch_free_font __ARGS((GuiFont font));
 guicolor_T gui_mch_get_color __ARGS((char_u *name));
diff --git a/src/proto/gui_x11.pro b/src/proto/gui_x11.pro
index 6524c26..035c27f 100644
--- a/src/proto/gui_x11.pro
+++ b/src/proto/gui_x11.pro
@@ -15,6 +15,7 @@
 void gui_mch_get_screen_dimensions __ARGS((int *screen_w, int *screen_h));
 int gui_mch_init_font __ARGS((char_u *font_name, int do_fontset));
 GuiFont gui_mch_get_font __ARGS((char_u *name, int giveErrorIfMissing));
+char_u *gui_mch_get_fontname __ARGS((GuiFont font, char_u *name));
 int gui_mch_adjust_charsize __ARGS((void));
 void gui_mch_set_font __ARGS((GuiFont font));
 void gui_mch_set_fontset __ARGS((GuiFontset fontset));
diff --git a/src/ui.c b/src/ui.c
index 3963bd5..ac88dc6 100644
--- a/src/ui.c
+++ b/src/ui.c
@@ -177,11 +177,11 @@
     else
 # endif
     {
-	if (wtime == -1)
-	    handle_sighup(SIGHUP_UNBLOCK);  /* allow SIGHUP to kill us */
+	if (wtime == -1 || wtime > 100L)
+	    (void)handle_signal(SIGNAL_UNBLOCK);  /* allow signals to kill us */
 	retval = mch_inchar(buf, maxlen, wtime, tb_change_cnt);
-	if (wtime == -1)
-	    handle_sighup(SIGHUP_BLOCK);    /* block SIGHUP */
+	if (wtime == -1 || wtime > 100L)
+	    (void)handle_signal(SIGNAL_BLOCK);    /* block SIGHUP et al. */
     }
 #endif