summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorvimboss <devnull@localhost>2004-12-12 11:33:30 +0000
committervimboss <devnull@localhost>2004-12-12 11:33:30 +0000
commit878624cd682fc1217624a80051cc46bd947f0939 (patch)
treeef1ddd7a76427ea943296528bce82c73d5c34a1d
parentc11dabd25ac704f693dbe189f8cdfd8f9db26302 (diff)
downloadvim-878624cd682fc1217624a80051cc46bd947f0939.tar.gz
updated for version 7.0022
-rw-r--r--runtime/doc/eval.txt17
-rw-r--r--runtime/doc/tags2
-rw-r--r--src/ex_docmd.c10
-rw-r--r--src/gui.c5
-rw-r--r--src/gui_amiga.c17
-rw-r--r--src/gui_beos.cc9
-rw-r--r--src/gui_kde_x11.cc57
-rw-r--r--src/gui_mac.c78
-rw-r--r--src/gui_photon.c15
-rw-r--r--src/gui_riscos.c14
-rw-r--r--src/gui_w48.c112
-rw-r--r--src/os_mswin.c38
-rw-r--r--src/os_unix.c70
-rw-r--r--src/proto/gui_gtk.pro1
-rw-r--r--src/proto/gui_gtk_x11.pro1
-rw-r--r--src/proto/gui_photon.pro1
-rw-r--r--src/proto/gui_w16.pro2
-rw-r--r--src/proto/gui_w32.pro1
-rw-r--r--src/proto/os_unix.pro2
-rw-r--r--src/vim.h9
20 files changed, 344 insertions, 117 deletions
diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt
index afb43a4f..ae2c043a 100644
--- a/runtime/doc/eval.txt
+++ b/runtime/doc/eval.txt
@@ -1,4 +1,4 @@
-*eval.txt* For Vim version 7.0aa. Last change: 2004 Oct 24
+*eval.txt* For Vim version 7.0aa. Last change: 2004 Dec 10
VIM REFERENCE MANUAL by Bram Moolenaar
@@ -856,6 +856,7 @@ getcmdpos() Number return cursor position in command-line
getcwd() String the current working directory
getfperm( {fname}) String file permissions of file {fname}
getfsize( {fname}) Number size in bytes of file {fname}
+getfontname( [{name}]) String name of font being used
getftime( {fname}) Number last modification time of file
getftype( {fname}) String description of type of file {fname}
getline( {lnum}) String line {lnum} from current buffer
@@ -1633,6 +1634,20 @@ getfsize({fname}) *getfsize()*
If {fname} is a directory, 0 is returned.
If the file {fname} can't be found, -1 is returned.
+getfontname([{name}]) *getfontname()*
+ Without an argument returns the name of the normal font being
+ used. Like what is used for the Normal highlight group
+ |hl-Normal|.
+ With an argument a check is done whether {name} is a valid
+ font name. If not then an empty string is returned.
+ Otherwise the actual font name is returned, or {name} if the
+ GUI does not support obtaining the real name.
+ Only works when the GUI is running, thus not you your vimrc or
+ Note that the GTK 2 GUI accepts any font name, thus checking
+ for a valid name does not work.
+ gvimrc file. Use the |GUIEnter| autocommand to use this
+ function just after the GUI has started.
+
getfperm({fname}) *getfperm()*
The result is a String, which is the read, write, and execute
permissions of the given file {fname}.
diff --git a/runtime/doc/tags b/runtime/doc/tags
index 4c020a1e..eb84af45 100644
--- a/runtime/doc/tags
+++ b/runtime/doc/tags
@@ -4803,6 +4803,7 @@ getcharmod() eval.txt /*getcharmod()*
getcmdline() eval.txt /*getcmdline()*
getcmdpos() eval.txt /*getcmdpos()*
getcwd() eval.txt /*getcwd()*
+getfontname() eval.txt /*getfontname()*
getfperm() eval.txt /*getfperm()*
getfsize() eval.txt /*getfsize()*
getftime() eval.txt /*getftime()*
@@ -4932,6 +4933,7 @@ hebrew hebrew.txt /*hebrew*
hebrew.txt hebrew.txt /*hebrew.txt*
help various.txt /*help*
help-context help.txt /*help-context*
+help-tags tags 1
help-translated various.txt /*help-translated*
help-xterm-window various.txt /*help-xterm-window*
help.txt help.txt /*help.txt*
diff --git a/src/ex_docmd.c b/src/ex_docmd.c
index 7ad5513b..3126c6a6 100644
--- a/src/ex_docmd.c
+++ b/src/ex_docmd.c
@@ -3958,6 +3958,16 @@ expand_filename(eap, cmdlinep, errormsgp)
continue;
}
+ /* Wildcards won't be expanded below, the replacement is taken
+ * literally. But do expand "~/file", "~user/file" and "$HOME/file". */
+ if (vim_strchr(repl, '$') != NULL || vim_strchr(repl, '~') != NULL)
+ {
+ char_u *l = repl;
+
+ repl = expand_env_save(repl);
+ vim_free(l);
+ }
+
/* Need to escape white space et al. with a backslash. Don't do this
* for shell commands (may have to use quotes instead). Don't do this
* for non-unix systems when there is a single argument (spaces don't
diff --git a/src/gui.c b/src/gui.c
index 71b738ce..8701d08a 100644
--- a/src/gui.c
+++ b/src/gui.c
@@ -546,6 +546,10 @@ gui_init()
if (!im_xim_isvalid_imactivate())
EMSG(_("E599: Value of 'imactivatekey' is invalid"));
#endif
+ /* When 'cmdheight' was set during startup it may not have taken
+ * effect yet. */
+ if (p_ch != 1L)
+ command_height(1L);
return;
}
@@ -741,6 +745,7 @@ set_guifontwide(name)
font = gui_mch_get_font(wide_name, FALSE);
if (font != NOFONT)
{
+ gui_mch_free_font(gui.wide_font);
gui.wide_font = font;
set_string_option_direct((char_u *)"gfw", -1,
wide_name, OPT_FREE);
diff --git a/src/gui_amiga.c b/src/gui_amiga.c
index 28786aa6..9ce44ed3 100644
--- a/src/gui_amiga.c
+++ b/src/gui_amiga.c
@@ -1209,6 +1209,11 @@ gui_mch_destroy_scrollbar(scrollbar_T *sb)
}
#endif
+char_u *gui_mch_getfontname(GuiFont font)
+{
+ return vim_strsave((char_u *)"default");
+}
+
int gui_mch_init_font(char_u *font_name, int fontset)
{
/*D("gui_mch_init_font");*/
@@ -1227,12 +1232,22 @@ gui_mch_adjust_charsize()
}
GuiFont
-gui_mch_get_font( char_u *name, int giveErrorIfMissing)
+gui_mch_get_font(char_u *name, int giveErrorIfMissing)
{
/*D("gui_mch_get_font");*/
return NULL;
}
+/*
+ * Return the name of font "font" in allocated memory.
+ * We always use the default font.
+ */
+ char_u *
+gui_mch_get_fontname(GuiFont font, char_u *name)
+{
+ return vim_strsave((char_u *)"default");
+}
+
void
gui_mch_set_font(GuiFont font)
{
diff --git a/src/gui_beos.cc b/src/gui_beos.cc
index e2c65984..32e4db0c 100644
--- a/src/gui_beos.cc
+++ b/src/gui_beos.cc
@@ -2397,6 +2397,15 @@ error:
}
/*
+ * Return the name of font "font" in allocated memory.
+ */
+ char_u *
+gui_mch_get_fontname(GuiFont font, char_u *name)
+{
+ return vim_strsave(((VimFont *)font)->name);
+}
+
+/*
* Set the current text font.
*/
void
diff --git a/src/gui_kde_x11.cc b/src/gui_kde_x11.cc
index 4fe2eee1..77a7f807 100644
--- a/src/gui_kde_x11.cc
+++ b/src/gui_kde_x11.cc
@@ -384,7 +384,7 @@ gui_mch_open()//{{{
vmw->menuBar()->insertItem("&KVim", vmw->w->menu);
#endif
if (startfont!=NULL)
- gui_mch_init_font((char_u*)startfont->latin1(),0);
+ gui_mch_init_font((char_u*)startfont->latin1(), FALSE);
if (startsize!=NULL)
vmw->resize(startsize->width(), startsize->height());
@@ -558,9 +558,9 @@ char_u *gui_mch_font_dialog (char_u *oldval)//{{{
gui_mch_init_font(char_u * font_name, int fontset)//{{{
{
QString fontname;
- GuiFont font=NULL;
+ GuiFont font = NULL;
- if (font_name==NULL)
+ if (font_name == NULL)
{
#if 0
#if QT_VERSION>=300
@@ -589,31 +589,30 @@ gui_mch_init_font(char_u * font_name, int fontset)//{{{
font = new QFont();
font->fromString( fontname );
*/
- gui_mch_free_font(gui.norm_font);
#ifdef FEAT_XFONTSET
- gui_mch_free_fontset(gui.fontset);
if (fontset)
- font = gui_mch_get_fontset(font_name,TRUE,TRUE);
-#endif
- if (font == NULL) {
- font = gui_mch_get_font(font_name,FALSE);
- gui.norm_font = font;
-#ifdef FEAT_XFONTSET
- gui.fontset=NOFONTSET;
-#endif
- }
-#ifdef FEAT_XFONTSET
- else {
- gui.fontset=font;
- gui.norm_font=NOFONT;
- }
+ font = gui_mch_get_fontset(font_name, TRUE, TRUE);
+ if (font == NULL)
#endif
+ font = gui_mch_get_font(font_name, FALSE);
if (font == NULL)
- return FAIL;
-
+ return FAIL;
if (fontname.contains('*') && fontname.contains('-'))
- return FAIL;
+ return FAIL;
+
+ gui_mch_free_font(gui.norm_font);
+#ifdef FEAT_XFONTSET
+ gui_mch_free_fontset(gui.fontset);
+ gui.fontset = NOFONTSET;
+ if (fontset)
+ {
+ gui.fontset = font;
+ gui.norm_font = NOFONT;
+ }
+ else
+#endif
+ gui.norm_font = font;
/* Compute the width of the character cell. Some fonts include
* double-width characters. Use the width of ASCII characters to find
@@ -661,6 +660,20 @@ gui_mch_get_font(char_u * name, int report_error)//{{{
}//}}}
/*
+ * 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);
+}
+
+/*
* Set the current text font.
* Since we create all GC on demand, we use just gui.current_font to
* indicate the desired current font.
diff --git a/src/gui_mac.c b/src/gui_mac.c
index 7ad96fc2..f5e29abf 100644
--- a/src/gui_mac.c
+++ b/src/gui_mac.c
@@ -548,7 +548,7 @@ char_u **new_fnames_from_AEDesc(AEDesc *theList, long *numFiles, OSErr *error)
/* Caller is able to clean up */
/* TODO: Should be clean up or not? For safety. */
#ifdef USE_SIOUX
- printf("aevt_odoc: AEGetNthPtr error: %d\n", newError);
+ printf("aevt_odoc: AEGetNthPtr error: %ld\n", (long)newError);
#endif
return(fnames);
}
@@ -1130,7 +1130,7 @@ HandleODocAE(const AppleEvent *theAEvent, AppleEvent *theReply, long refCon)
if (error)
{
#ifdef USE_SIOUX
- printf("aevt_odoc: AEGetParamDesc error: %d\n", error);
+ printf("aevt_odoc: AEGetParamDesc error: %ld\n", (long)error);
#endif
return(error);
}
@@ -1144,15 +1144,16 @@ HandleODocAE(const AppleEvent *theAEvent, AppleEvent *theReply, long refCon)
if (error)
{
#ifdef USE_SIOUX
- printf("aevt_odoc: AEGetParamPtr error: %d\n", error);
+ printf("aevt_odoc: AEGetParamPtr error: %ld\n", (long)error);
#endif
return(error);
}
#ifdef USE_SIOUX
- printf("aevt_odoc: lineNum: %d, startRange %d, endRange %d, [date %lx]\n",
- thePosition.lineNum, thePosition.startRange, thePosition.endRange,
- thePosition.theDate);
+ printf("aevt_odoc: lineNum: %d, startRange %ld, endRange %ld, [date %lx]\n",
+ (int)thePosition.lineNum,
+ (long)thePosition.startRange, (long)thePosition.endRange,
+ (long)thePosition.theDate);
#endif
/*
error = AEGetParamDesc(theAEvent, keyAEPosition, typeChar, &thePosition);
@@ -1209,7 +1210,7 @@ HandleODocAE(const AppleEvent *theAEvent, AppleEvent *theReply, long refCon)
{
if (thePosition.lineNum >= 0)
{
- lnum = thePosition.lineNum;
+ lnum = thePosition.lineNum + 1;
/* oap->motion_type = MLINE;
setpcmark();*/
if (lnum < 1L)
@@ -1217,6 +1218,7 @@ HandleODocAE(const AppleEvent *theAEvent, AppleEvent *theReply, long refCon)
else if (lnum > curbuf->b_ml.ml_line_count)
lnum = curbuf->b_ml.ml_line_count;
curwin->w_cursor.lnum = lnum;
+ curwin->w_cursor.col = 0;
/* beginline(BL_SOL | BL_FIX);*/
}
else
@@ -1225,9 +1227,32 @@ HandleODocAE(const AppleEvent *theAEvent, AppleEvent *theReply, long refCon)
/* Update the screen display */
update_screen(NOT_VALID);
+#ifdef FEAT_VISUAL
+ /* Select the text if possible */
+ if (gotPosition)
+ {
+ VIsual_active = TRUE;
+ VIsual_select = FALSE;
+ if (thePosition.lineNum < 0)
+ {
+ VIsual_mode = 'v';
+ VIsual = curwin->w_cursor;
+ goto_byte(thePosition.endRange);
+ }
+ else
+ {
+ VIsual_mode = 'V';
+ VIsual = curwin->w_cursor;
+ VIsual.col = 0;
+ }
+ }
+#endif
setcursor();
out_flush();
+ /* Fake mouse event to wake from stall */
+ PostEvent(mouseUp, 0);
+
finished:
AEDisposeDesc(&theList); /* dispose what we allocated */
@@ -1235,7 +1260,7 @@ HandleODocAE(const AppleEvent *theAEvent, AppleEvent *theReply, long refCon)
if (error)
{
#ifdef USE_SIOUX
- printf("aevt_odoc: HandleUnusedParms error: %d\n", error);
+ printf("aevt_odoc: HandleUnusedParms error: %ld\n", (long)error);
#endif
return(error);
}
@@ -2513,6 +2538,8 @@ gui_mac_mouse_wheel(EventHandlerCallRef nextHandler, EventRef theEvent,
kEventPriorityLow))
goto bail;
+ ReleaseEvent(bogusEvent);
+
if (noErr == GetWindowBounds(gui.VimWindow, kWindowContentRgn, &bounds))
{
point.h -= bounds.left;
@@ -3028,6 +3055,10 @@ receiveHandler(WindowRef theWindow, void* handlerRefCon, DragRef theDrag)
count = j;
gui_handle_drop(x, y, modifiers, fnames, count);
+
+ /* Fake mouse event to wake from stall */
+ PostEvent(mouseUp, 0);
+
return noErr;
}
@@ -3433,6 +3464,7 @@ gui_mch_init_font(font_name, fontset)
FontInfo font_info;
short font_id;
GuiFont font;
+ char_u used_font_name[512];
if (font_name == NULL)
{
@@ -3443,23 +3475,26 @@ gui_mch_init_font(font_name, fontset)
{
/* Then pickup the standard application font */
font_id = GetAppFont();
+ STRCPY(used_font_name, "default");
}
+ else
+ STRCPY(used_font_name, "Monaco");
font = (suggestedSize << 16) + ((long) font_id & 0xFFFF);
}
#if defined(USE_CARBONIZED) && defined(MACOS_X)
else if (STRCMP(font_name, "*") == 0)
{
- char_u *new_p_guifont, font_name[512];
+ char_u *new_p_guifont;
- font = gui_mac_select_font(font_name);
+ font = gui_mac_select_font(used_font_name);
if (font == NOFONT)
return FAIL;
/* Set guifont to the name of the selected font. */
- new_p_guifont = alloc(STRLEN(font_name) + 1);
+ new_p_guifont = alloc(STRLEN(used_font_name) + 1);
if (new_p_guifont != NULL)
{
- STRCPY(new_p_guifont, font_name);
+ STRCPY(new_p_guifont, used_font_name);
vim_free(p_guifont);
p_guifont = new_p_guifont;
/* Replace spaces in the font name with underscores. */
@@ -3474,12 +3509,17 @@ gui_mch_init_font(font_name, fontset)
else
{
font = gui_mac_find_font(font_name);
+ STRNCPY(used_font_name, font_name, sizeof(used_font_name));
+ used_font_name[sizeof(used_font_name) - 1] = NUL;
if (font == NOFONT)
return FAIL;
}
+
gui.norm_font = font;
+ hl_set_font_name(used_font_name);
+
TextSize(font >> 16);
TextFont(font & 0xFFFF);
@@ -3530,6 +3570,20 @@ gui_mch_get_font(name, giveErrorIfMissing)
}
/*
+ * 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);
+}
+
+/*
* Set the current text font.
*/
void
diff --git a/src/gui_photon.c b/src/gui_photon.c
index f2bd5f09..b7c92df3 100644
--- a/src/gui_photon.c
+++ b/src/gui_photon.c
@@ -2986,6 +2986,7 @@ gui_mch_init_font(char_u *vim_font_name, int fontset)
vim_free( font_name );
return( FAIL );
}
+
gui_mch_free_font( gui.norm_font );
gui.norm_font = font_tag;
}
@@ -3046,6 +3047,20 @@ gui_mch_get_font(char_u *vim_font_name, int report_error)
return( FAIL );
}
+/*
+ * 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);
+}
+
void
gui_mch_set_font(GuiFont font)
{
diff --git a/src/gui_riscos.c b/src/gui_riscos.c
index b823a79f..7c9555e6 100644
--- a/src/gui_riscos.c
+++ b/src/gui_riscos.c
@@ -1053,6 +1053,20 @@ gui_mch_get_font(name, giveErrorIfMissing)
}
/*
+ * 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);
+}
+
+/*
* Set the current text font.
*/
void
diff --git a/src/gui_w48.c b/src/gui_w48.c
index 516d070e..b3948ce3 100644
--- a/src/gui_w48.c
+++ b/src/gui_w48.c
@@ -1240,14 +1240,29 @@ gui_mch_get_font(
int giveErrorIfMissing)
{
LOGFONT lf;
- GuiFont font;
+ GuiFont font = NOFONT;
- get_logfont(&lf, name, NULL);
- font = get_font_handle(&lf);
+ if (get_logfont(&lf, name, NULL, giveErrorIfMissing) == OK)
+ font = get_font_handle(&lf);
if (font == NOFONT && giveErrorIfMissing)
EMSG2(_(e_font), name);
return 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);
+}
+
void
gui_mch_free_font(GuiFont font)
{
@@ -2600,21 +2615,65 @@ gui_mch_exit(int rc)
#endif
}
+ static char_u *
+logfont2name(LOGFONT lf)
+{
+ char *p;
+ char *res;
+ char *charset_name;
+
+ charset_name = charset_id2name((int)lf.lfCharSet);
+ res = alloc((unsigned)(strlen(lf.lfFaceName) + 20
+ + (charset_name == NULL ? 0 : strlen(charset_name) + 2)));
+ if (res != NULL)
+ {
+ p = res;
+ /* make a normal font string out of the lf thing:*/
+ sprintf((char *)p, "%s:h%d", lf.lfFaceName, pixels_to_points(
+ lf.lfHeight < 0 ? -lf.lfHeight : lf.lfHeight, TRUE));
+ while (*p)
+ {
+ if (*p == ' ')
+ *p = '_';
+ ++p;
+ }
+#ifndef MSWIN16_FASTTEXT
+ if (lf.lfItalic)
+ STRCAT(p, ":i");
+ if (lf.lfWeight >= FW_BOLD)
+ STRCAT(p, ":b");
+#endif
+ if (lf.lfUnderline)
+ STRCAT(p, ":u");
+ if (lf.lfStrikeOut)
+ STRCAT(p, ":s");
+ if (charset_name != NULL)
+ {
+ STRCAT(p, ":c");
+ STRCAT(p, charset_name);
+ }
+ }
+
+ return res;
+}
+
/*
- * Initialise vim to use the font with the given name. Return FAIL if the font
- * could not be loaded, OK otherwise.
+ * Initialise vim to use the font with the given name.
+ * Return FAIL if the font could not be loaded, OK otherwise.
*/
int
gui_mch_init_font(char_u *font_name, int fontset)
{
LOGFONT lf;
GuiFont font = NOFONT;
+ char_u *p;
/* Load the font */
- if (get_logfont(&lf, font_name, NULL))
+ if (get_logfont(&lf, font_name, NULL, TRUE) == OK)
font = get_font_handle(&lf);
if (font == NOFONT)
return FAIL;
+
if (font_name == NULL)
font_name = lf.lfFaceName;
#if defined(FEAT_MBYTE_IME) || defined(GLOBAL_IME)
@@ -2627,46 +2686,21 @@ gui_mch_init_font(char_u *font_name, int fontset)
gui.norm_font = font;
current_font_height = lf.lfHeight;
GetFontSize(font);
- hl_set_font_name(lf.lfFaceName);
- /* When setting 'guifont' to "*" replace it with the actual font name. */
- if (STRCMP(font_name, "*") == 0 && STRCMP(p_guifont, "*") == 0)
+ p = logfont2name(lf);
+ if (p != NULL)
{
- char *charset_name;
- char_u *p;
+ hl_set_font_name(p);
- charset_name = charset_id2name((int)lf.lfCharSet);
- p = alloc((unsigned)(strlen(lf.lfFaceName) + 20
- + (charset_name == NULL ? 0 : strlen(charset_name) + 2)));
- if (p != NULL)
+ /* When setting 'guifont' to "*" replace it with the actual font name.
+ * */
+ if (STRCMP(font_name, "*") == 0 && STRCMP(p_guifont, "*") == 0)
{
- /* make a normal font string out of the lf thing:*/
- sprintf((char *)p, "%s:h%d", lf.lfFaceName, pixels_to_points(
- lf.lfHeight < 0 ? -lf.lfHeight : lf.lfHeight, TRUE));
vim_free(p_guifont);
p_guifont = p;
- while (*p)
- {
- if (*p == ' ')
- *p = '_';
- ++p;
- }
-#ifndef MSWIN16_FASTTEXT
- if (lf.lfItalic)
- STRCAT(p, ":i");
- if (lf.lfWeight >= FW_BOLD)
- STRCAT(p, ":b");
-#endif
- if (lf.lfUnderline)
- STRCAT(p, ":u");
- if (lf.lfStrikeOut)
- STRCAT(p, ":s");
- if (charset_name != NULL)
- {
- STRCAT(p, ":c");
- STRCAT(p, charset_name);
- }
}
+ else
+ vim_free(p);
}
#ifndef MSWIN16_FASTTEXT
diff --git a/src/os_mswin.c b/src/os_mswin.c
index 7f2288ee..409803fe 100644
--- a/src/os_mswin.c
+++ b/src/os_mswin.c
@@ -2096,7 +2096,7 @@ mch_print_init(prt_settings_T *psettings, char_u *jobname, int forceit)
* Initialise the font according to 'printfont'
*/
memset(&fLogFont, 0, sizeof(fLogFont));
- if (!get_logfont(&fLogFont, p_pfn, prt_dlg.hDC))
+ if (get_logfont(&fLogFont, p_pfn, prt_dlg.hDC, TRUE) == FAIL)
{
EMSG2(_("E613: Unknown printer font: %s"), p_pfn);
mch_print_cleanup();
@@ -3161,11 +3161,16 @@ init_logfont(LOGFONT *lf)
return OK;
}
+/*
+ * Get font info from "name" into logfont "lf".
+ * Return OK for a valid name, FAIL otherwise.
+ */
int
get_logfont(
- LOGFONT *lf,
- char_u *name,
- HDC printer_dc)
+ LOGFONT *lf,
+ char_u *name,
+ HDC printer_dc,
+ int verbose)
{
char_u *p;
int i;
@@ -3173,7 +3178,7 @@ get_logfont(
*lf = s_lfDefault;
if (name == NULL)
- return 1;
+ return OK;
if (STRCMP(name, "*") == 0)
{
@@ -3191,7 +3196,7 @@ get_logfont(
if (ChooseFont(&cf))
goto theend;
#else
- return 0;
+ return FAIL;
#endif
}
@@ -3201,7 +3206,7 @@ get_logfont(
for (p = name; *p && *p != ':'; p++)
{
if (p - name + 1 > LF_FACESIZE)
- return 0; /* Name too long */
+ return FAIL; /* Name too long */
lf->lfFaceName[p - name] = *p;
}
if (p != name)
@@ -3229,7 +3234,7 @@ get_logfont(
did_replace = TRUE;
}
if (!did_replace || init_logfont(lf) == FAIL)
- return 0;
+ return FAIL;
}
while (*p == ':')
@@ -3273,7 +3278,7 @@ get_logfont(
p += strlen(cp->name);
break;
}
- if (cp->name == NULL)
+ if (cp->name == NULL && verbose)
{
sprintf((char *)IObuff, _("E244: Illegal charset name \"%s\" in font name \"%s\""), p, name);
EMSG(IObuff);
@@ -3282,11 +3287,14 @@ get_logfont(
break;
}
default:
- sprintf((char *)IObuff,
- _("E245: Illegal char '%c' in font name \"%s\""),
- p[-1], name);
- EMSG(IObuff);
- break;
+ if (verbose)
+ {
+ sprintf((char *)IObuff,
+ _("E245: Illegal char '%c' in font name \"%s\""),
+ p[-1], name);
+ EMSG(IObuff);
+ }
+ return FAIL;
}
while (*p == ':')
p++;
@@ -3304,7 +3312,7 @@ theend:
mch_memmove(lastlf, lf, sizeof(LOGFONT));
}
- return 1;
+ return OK;
}
#endif /* defined(FEAT_GUI) || defined(FEAT_PRINTER) */
diff --git a/src/os_unix.c b/src/os_unix.c
index 373dce1c..e808d6e7 100644
--- a/src/os_unix.c
+++ b/src/os_unix.c
@@ -800,6 +800,8 @@ catch_sigint SIGDEFARG(sigarg)
static RETSIGTYPE
catch_sigpwr SIGDEFARG(sigarg)
{
+ /* this is not required on all systems, but it doesn't hurt anybody */
+ signal(SIGPWR, (RETSIGTYPE (*)())catch_sigpwr);
/*
* I'm not sure we get the SIGPWR signal when the system is really going
* down or when the batteries are almost empty. Just preserve the swap
@@ -904,9 +906,31 @@ deathtrap SIGDEFARG(sigarg)
#endif
#ifdef SIGHASARG
- /* When SIGHUP is blocked: postpone its effect and return here. This
- * avoids that a non-reentrant function is interrupted, e.g., free(). */
- if (entered == 0 && sigarg == SIGHUP && !handle_sighup(SIGHUP_RCV))
+ /* When SIGHUP, SIGQUIT, etc. are blocked: postpone the effect and return
+ * here. This avoids that a non-reentrant function is interrupted, e.g.,
+ * free(). Calling free() again may then cause a crash. */
+ if (entered == 0
+ && (0
+# ifdef SIGHUP
+ || sigarg == SIGHUP
+# endif
+# ifdef SIGQUIT
+ || sigarg == SIGQUIT
+# endif
+# ifdef SIGTERM
+ || sigarg == SIGTERM
+# endif
+# ifdef SIGPWR
+ || sigarg == SIGPWR
+# endif
+# ifdef SIGUSR1
+ || sigarg == SIGUSR1
+# endif
+# ifdef SIGUSR2
+ || sigarg == SIGUSR2
+# endif
+ )
+ && !handle_signal(sigarg))
SIGRETURN;
#endif
@@ -1181,33 +1205,39 @@ catch_signals(func_deadly, func_other)
}
/*
- * Handling of SIGHUP:
- * "when" == SIGHUP_RCV: when busy, postpone, otherwise return TRUE
- * "when" == SIGHUP_BLOCK: Going to be busy, block SIGHUP
- * "when" == SIGHUP_UNBLOCK: Going wait, unblock SIGHUP
+ * Handling of SIGHUP, SIGQUIT and SIGTERM:
+ * "when" == a signal: when busy, postpone, otherwise return TRUE
+ * "when" == SIGNAL_BLOCK: Going to be busy, block signals
+ * "when" == SIGNAL_UNBLOCK: Going wait, unblock signals
* Returns TRUE when Vim should exit.
*/
int
-handle_sighup(when)
- int when;
+handle_signal(sig)
+ int sig;
{
- static int got_sighup = FALSE;
- static int blocked = FALSE;
+ static int got_signal = 0;
+ static int blocked = TRUE;
- switch (when)
+ switch (sig)
{
- case SIGHUP_RCV: if (!blocked)
- return TRUE; /* exit! */
- got_sighup = TRUE;
- got_int = TRUE; /* break any loops */
+ case SIGNAL_BLOCK: blocked = TRUE;
break;
- case SIGHUP_BLOCK: blocked = TRUE;
+ case SIGNAL_UNBLOCK: blocked = FALSE;
+ if (got_signal != 0)
+ {
+ kill(getpid(), got_signal);
+ got_signal = 0;
+ }
break;
- case SIGHUP_UNBLOCK: blocked = FALSE;
- if (got_sighup)
- kill(getpid(), SIGHUP);
+ default: if (!blocked)
+ return TRUE; /* exit! */
+ got_signal = sig;
+#ifdef SIGPWR
+ if (sig != SIGPWR)
+#endif
+ got_int = TRUE; /* break any loops */
break;
}
return FALSE;
diff --git a/src/proto/gui_gtk.pro b/src/proto/gui_gtk.pro
index 882587e5..afe38dc2 100644
--- a/src/proto/gui_gtk.pro
+++ b/src/proto/gui_gtk.pro
@@ -14,7 +14,6 @@ void gui_mch_destroy_scrollbar __ARGS((scrollbar_T *sb));
char_u *gui_mch_browse __ARGS((int saving, char_u *title, char_u *dflt, char_u *ext, char_u *initdir, char_u *filter));
char_u *gui_mch_browsedir __ARGS((char_u *title, char_u *initdir));
int gui_mch_dialog __ARGS((int type, char_u *title, char_u *message, char_u *buttons, int def_but, char_u *textfield));
-int gui_mch_dialog __ARGS((int type, char_u *title, char_u *message, char_u *buttons, int def_but, char_u *textfield));
void gui_mch_show_popupmenu __ARGS((vimmenu_T *menu));
void gui_make_popup __ARGS((char_u *path_name));
void gui_mch_find_dialog __ARGS((exarg_T *eap));
diff --git a/src/proto/gui_gtk_x11.pro b/src/proto/gui_gtk_x11.pro
index a3bfaa46..d70a7b8a 100644
--- a/src/proto/gui_gtk_x11.pro
+++ b/src/proto/gui_gtk_x11.pro
@@ -21,6 +21,7 @@ GuiFontset gui_mch_get_fontset __ARGS((char_u *name, int report_error, int fixed
char_u *gui_mch_font_dialog __ARGS((char_u *oldval));
int gui_mch_init_font __ARGS((char_u *font_name, int fontset));
GuiFont gui_mch_get_font __ARGS((char_u *name, int report_error));
+char_u *gui_mch_get_fontname __ARGS((GuiFont font, char_u *name));
void gui_mch_set_font __ARGS((GuiFont font));
void gui_mch_set_fontset __ARGS((GuiFontset fontset));
void gui_mch_free_font __ARGS((GuiFont font));
diff --git a/src/proto/gui_photon.pro b/src/proto/gui_photon.pro
index c7354a19..54a56591 100644
--- a/src/proto/gui_photon.pro
+++ b/src/proto/gui_photon.pro
@@ -61,6 +61,7 @@ void gui_mch_show_toolbar __ARGS((int showit));
int gui_mch_init_font __ARGS((char_u *vim_font_name, int fontset));
int gui_mch_adjust_charsize __ARGS((void));
GuiFont gui_mch_get_font __ARGS((char_u *vim_font_name, int report_error));
+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));
/* vim: set ft=c : */
diff --git a/src/proto/gui_w16.pro b/src/proto/gui_w16.pro
index b43c606a..f6b1b4a3 100644
--- a/src/proto/gui_w16.pro
+++ b/src/proto/gui_w16.pro
@@ -14,6 +14,7 @@ void gui_mch_set_scrollbar_pos __ARGS((scrollbar_T *sb, int x, int y, int w, int
void gui_mch_create_scrollbar __ARGS((scrollbar_T *sb, int orient));
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_free_font __ARGS((GuiFont font));
guicolor_T gui_mch_get_color __ARGS((char_u *name));
int gui_mch_haskey __ARGS((char_u *name));
@@ -51,6 +52,7 @@ int gui_mch_maximized __ARGS((void));
void gui_mch_newfont __ARGS((void));
void gui_mch_settitle __ARGS((char_u *title, char_u *icon));
void mch_set_mouse_shape __ARGS((int shape));
+char_u *gui_mch_browsedir __ARGS((char_u *title, char_u *initdir));
char_u *gui_mch_browse __ARGS((int saving, char_u *title, char_u *dflt, char_u *ext, char_u *initdir, char_u *filter));
int get_cmd_args __ARGS((char *prog, char *cmdline, char ***argvp, char **tofree));
void gui_mch_prepare __ARGS((int *argc, char **argv));
diff --git a/src/proto/gui_w32.pro b/src/proto/gui_w32.pro
index a953a1d3..a8c97931 100644
--- a/src/proto/gui_w32.pro
+++ b/src/proto/gui_w32.pro
@@ -14,6 +14,7 @@ void gui_mch_set_scrollbar_pos __ARGS((scrollbar_T *sb, int x, int y, int w, int
void gui_mch_create_scrollbar __ARGS((scrollbar_T *sb, int orient));
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_free_font __ARGS((GuiFont font));
guicolor_T gui_mch_get_color __ARGS((char_u *name));
int gui_mch_haskey __ARGS((char_u *name));
diff --git a/src/proto/os_unix.pro b/src/proto/os_unix.pro
index 6018c8fc..3554040b 100644
--- a/src/proto/os_unix.pro
+++ b/src/proto/os_unix.pro
@@ -11,7 +11,7 @@ void mch_didjmp __ARGS((void));
void mch_suspend __ARGS((void));
void mch_init __ARGS((void));
void reset_signals __ARGS((void));
-int handle_sighup __ARGS((int when));
+int handle_signal __ARGS((int sig));
int mch_check_win __ARGS((int argc, char **argv));
int mch_input_isatty __ARGS((void));
int mch_can_restore_title __ARGS((void));
diff --git a/src/vim.h b/src/vim.h
index cd283d23..798d80d7 100644
--- a/src/vim.h
+++ b/src/vim.h
@@ -1843,12 +1843,11 @@ typedef int VimClipboard; /* This is required for the prototypes. */
# include <XSUB.h>
#endif
-/* values for handle_sighup() */
-#define SIGHUP_RCV 1
-#define SIGHUP_BLOCK 2
-#define SIGHUP_UNBLOCK 3
+/* values for handle_signal() that are not a signal */
+#define SIGNAL_BLOCK -1
+#define SIGNAL_UNBLOCK -2
#ifndef UNIX
-# define handle_sighup(x) /* nothing */
+# define handle_signal(x) 0
#endif
#endif /* VIM__H */