summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Make_cyg.mak2
-rw-r--r--src/ex_getln.c36
-rw-r--r--src/gui_w32.c188
-rw-r--r--src/po/Make_mvc.mak52
-rw-r--r--src/search.c8
-rw-r--r--src/version.h4
6 files changed, 251 insertions, 39 deletions
diff --git a/src/Make_cyg.mak b/src/Make_cyg.mak
index 51e36189a..c7f833797 100644
--- a/src/Make_cyg.mak
+++ b/src/Make_cyg.mak
@@ -353,7 +353,7 @@ EXE = gvim$(DEBUG_SUFFIX).exe
OUTDIR = gobj$(DEBUG_SUFFIX)
DEFINES += -DFEAT_GUI_W32 -DFEAT_CLIPBOARD
EXTRA_OBJS += $(OUTDIR)/gui.o $(OUTDIR)/gui_w32.o $(OUTDIR)/gui_beval.o $(OUTDIR)/os_w32exe.o
-EXTRA_LIBS += -mwindows -lcomctl32
+EXTRA_LIBS += -mwindows -lcomctl32 -lversion
else
EXE = vim$(DEBUG_SUFFIX).exe
OUTDIR = obj$(DEBUG_SUFFIX)
diff --git a/src/ex_getln.c b/src/ex_getln.c
index c96f11488..a876508c0 100644
--- a/src/ex_getln.c
+++ b/src/ex_getln.c
@@ -92,6 +92,7 @@ static void redrawcmdprompt __ARGS((void));
static void cursorcmd __ARGS((void));
static int ccheck_abbr __ARGS((int));
static int nextwild __ARGS((expand_T *xp, int type, int options));
+static void escape_fname __ARGS((char_u **pp));
static int showmatches __ARGS((expand_T *xp, int wildmenu));
static void set_expand_context __ARGS((expand_T *xp));
static int ExpandFromContext __ARGS((expand_T *xp, char_u *, int *, char_u ***, int));
@@ -3365,18 +3366,14 @@ ExpandEscape(xp, str, numfiles, files, options)
/* If 'str' starts with "\~", replace "~" at start of
* files[i] with "\~". */
if (str[0] == '\\' && str[1] == '~' && files[i][0] == '~')
- {
- p = alloc((unsigned)(STRLEN(files[i]) + 2));
- if (p != NULL)
- {
- p[0] = '\\';
- STRCPY(p + 1, files[i]);
- vim_free(files[i]);
- files[i] = p;
- }
- }
+ escape_fname(&files[i]);
}
xp->xp_backslash = XP_BS_NONE;
+
+ /* If the first file starts with a '+' escape it. Otherwise it
+ * could be seen as "+cmd". */
+ if (*files[0] == '+')
+ escape_fname(&files[0]);
}
else if (xp->xp_context == EXPAND_TAGS)
{
@@ -3398,6 +3395,25 @@ ExpandEscape(xp, str, numfiles, files, options)
}
/*
+ * Put a backslash before the file name in "pp", which is in allocated memory.
+ */
+ static void
+escape_fname(pp)
+ char_u **pp;
+{
+ char_u *p;
+
+ p = alloc((unsigned)(STRLEN(*pp) + 2));
+ if (p != NULL)
+ {
+ p[0] = '\\';
+ STRCPY(p + 1, *pp);
+ vim_free(*pp);
+ *pp = p;
+ }
+}
+
+/*
* For each file name in files[num_files]:
* If 'orig_pat' starts with "~/", replace the home directory with "~".
*/
diff --git a/src/gui_w32.c b/src/gui_w32.c
index f0b47172e..52c8abeaf 100644
--- a/src/gui_w32.c
+++ b/src/gui_w32.c
@@ -188,8 +188,61 @@ static VOID CALLBACK BevalTimerProc __ARGS((HWND hwnd, UINT uMsg, UINT idEvent,
static BalloonEval *cur_beval = NULL;
static UINT BevalTimerId = 0;
static DWORD LastActivity = 0;
+
+/*
+ * excerpts from headers since this may not be presented
+ * in the extremelly old compilers
+ */
+#include <pshpack1.h>
+
+typedef struct _DllVersionInfo
+{
+ DWORD cbSize;
+ DWORD dwMajorVersion;
+ DWORD dwMinorVersion;
+ DWORD dwBuildNumber;
+ DWORD dwPlatformID;
+} DLLVERSIONINFO;
+
+typedef struct tagTOOLINFOA_NEW
+{
+ UINT cbSize;
+ UINT uFlags;
+ HWND hwnd;
+ UINT uId;
+ RECT rect;
+ HINSTANCE hinst;
+ LPSTR lpszText;
+ LPARAM lParam;
+} TOOLINFO_NEW;
+
+typedef struct tagNMTTDISPINFO_NEW
+{
+ NMHDR hdr;
+ LPTSTR lpszText;
+ char szText[80];
+ HINSTANCE hinst;
+ UINT uFlags;
+ LPARAM lParam;
+} NMTTDISPINFO_NEW;
+
+#include <poppack.h>
+
+typedef HRESULT (WINAPI* DLLGETVERSIONPROC)(DLLVERSIONINFO *);
+#ifndef TTM_SETMAXTIPWIDTH
+# define TTM_SETMAXTIPWIDTH (WM_USER+24)
+#endif
+
+#ifndef TTF_DI_SETITEM
+# define TTF_DI_SETITEM 0x8000
#endif
+#ifndef TTN_GETDISPINFO
+# define TTN_GETDISPINFO (TTN_FIRST - 0)
+#endif
+
+#endif /* defined(FEAT_BEVAL) */
+
/* Local variables: */
#ifdef FEAT_MENU
@@ -4021,13 +4074,93 @@ gui_mch_destroy_sign(sign)
* 5) WM_NOTOFY:TTN_POP destroys created tooltip
*/
+/*
+ * determine whether installed Common Controls support multiline tooltips
+ * (i.e. their version is >= 4.70
+ */
+ int
+multiline_balloon_available(void)
+{
+ HINSTANCE hDll;
+ static char comctl_dll[] = "comctl32.dll";
+ static int multiline_tip = MAYBE;
+
+ if (multiline_tip != MAYBE)
+ return multiline_tip;
+
+ hDll = GetModuleHandle(comctl_dll);
+ if (hDll != NULL)
+ {
+ DLLGETVERSIONPROC pGetVer;
+ pGetVer = (DLLGETVERSIONPROC)GetProcAddress(hDll, "DllGetVersion");
+
+ if (pGetVer != NULL)
+ {
+ DLLVERSIONINFO dvi;
+ HRESULT hr;
+
+ ZeroMemory(&dvi, sizeof(dvi));
+ dvi.cbSize = sizeof(dvi);
+
+ hr = (*pGetVer)(&dvi);
+
+ if (SUCCEEDED(hr)
+ && (dvi.dwMajorVersion > 4
+ || (dvi.dwMajorVersion == 4 && dvi.dwMinorVersion >= 70)))
+ {
+ multiline_tip = TRUE;
+ return multiline_tip;
+ }
+ }
+ else
+ {
+ /* there is chance we have ancient CommCtl 4.70
+ which doesn't export DllGetVersion */
+ DWORD dwHandle = 0;
+ DWORD len = GetFileVersionInfoSize(comctl_dll, &dwHandle);
+ if (len > 0)
+ {
+ VS_FIXEDFILEINFO *ver;
+ UINT vlen = 0;
+ void *data = alloc(len);
+
+ if (data != NULL
+ && GetFileVersionInfo(comctl_dll, 0, len, data)
+ && VerQueryValue(data, "\\", (void **)&ver, &vlen)
+ && vlen
+ && HIWORD(ver->dwFileVersionMS) > 4
+ || (HIWORD(ver->dwFileVersionMS) == 4
+ && LOWORD(ver->dwFileVersionMS) >= 70))
+ {
+ vim_free(data);
+ multiline_tip = TRUE;
+ return multiline_tip;
+ }
+ vim_free(data);
+ }
+ }
+ }
+ multiline_tip = FALSE;
+ return multiline_tip;
+}
+
static void
make_tooltip(beval, text, pt)
BalloonEval *beval;
char *text;
POINT pt;
{
- TOOLINFO ti;
+ TOOLINFO *pti;
+ int ToolInfoSize;
+
+ if (multiline_balloon_available() == TRUE)
+ ToolInfoSize = sizeof(TOOLINFO_NEW);
+ else
+ ToolInfoSize = sizeof(TOOLINFO);
+
+ pti = (TOOLINFO *)alloc(ToolInfoSize);
+ if (pti == NULL)
+ return;
beval->balloon = CreateWindowEx(WS_EX_TOPMOST, TOOLTIPS_CLASS,
NULL, WS_POPUP | TTS_NOPREFIX | TTS_ALWAYSTIP,
@@ -4037,20 +4170,32 @@ make_tooltip(beval, text, pt)
SetWindowPos(beval->balloon, HWND_TOPMOST, 0, 0, 0, 0,
SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
- ti.cbSize = sizeof(TOOLINFO);
- ti.uFlags = TTF_SUBCLASS;
- ti.hwnd = beval->target;
- ti.hinst = 0; /* Don't use string resources */
- ti.uId = ID_BEVAL_TOOLTIP;
- ti.lpszText = text;
+ pti->cbSize = ToolInfoSize;
+ pti->uFlags = TTF_SUBCLASS;
+ pti->hwnd = beval->target;
+ pti->hinst = 0; /* Don't use string resources */
+ pti->uId = ID_BEVAL_TOOLTIP;
+
+ if (multiline_balloon_available() == TRUE)
+ {
+ RECT rect;
+ TOOLINFO_NEW *ptin = (TOOLINFO_NEW *)pti;
+ pti->lpszText = LPSTR_TEXTCALLBACK;
+ ptin->lParam = (LPARAM)text;
+ if (GetClientRect(s_textArea, &rect)) /* switch multiline tooltips on */
+ SendMessage(beval->balloon, TTM_SETMAXTIPWIDTH, 0,
+ (LPARAM)rect.right);
+ }
+ else
+ pti->lpszText = text; /* do this old way */
/* Limit ballooneval bounding rect to CursorPos neighbourhood */
- ti.rect.left = pt.x - 3;
- ti.rect.top = pt.y - 3;
- ti.rect.right = pt.x + 3;
- ti.rect.bottom = pt.y + 3;
+ pti->rect.left = pt.x - 3;
+ pti->rect.top = pt.y - 3;
+ pti->rect.right = pt.x + 3;
+ pti->rect.bottom = pt.y + 3;
- SendMessage(beval->balloon, TTM_ADDTOOL, 0, (LPARAM)&ti);
+ SendMessage(beval->balloon, TTM_ADDTOOL, 0, (LPARAM)pti);
/* Make tooltip appear sooner */
SendMessage(beval->balloon, TTM_SETDELAYTIME, TTDT_INITIAL, 10);
/*
@@ -4059,6 +4204,7 @@ make_tooltip(beval, text, pt)
*/
mouse_event(MOUSEEVENTF_MOVE, 1, 1, 0, 0);
mouse_event(MOUSEEVENTF_MOVE, (DWORD)-1, (DWORD)-1, 0, 0);
+ vim_free(pti);
}
static void
@@ -4187,7 +4333,6 @@ gui_mch_create_beval_area(target, mesg, mesgCB, clientData)
beval->clientData = clientData;
InitCommonControls();
-
cur_beval = beval;
if (p_beval)
@@ -4208,19 +4353,28 @@ Handle_WM_Notify(hwnd, pnmh)
if (cur_beval != NULL)
{
- if (pnmh->code == TTN_SHOW)
+ switch (pnmh->code)
{
+ case TTN_SHOW:
// TRACE0("TTN_SHOW {{{");
// TRACE0("TTN_SHOW }}}");
- }
- else if (pnmh->code == TTN_POP) /* Before tooltip disappear */
- {
+ break;
+ case TTN_POP: /* Before tooltip disappear */
// TRACE0("TTN_POP {{{");
delete_tooltip(cur_beval);
gui_mch_enable_beval_area(cur_beval);
// TRACE0("TTN_POP }}}");
cur_beval->showState = ShS_NEUTRAL;
+ break;
+ case TTN_GETDISPINFO:
+ {
+ /* if you get there then we have new common controls */
+ NMTTDISPINFO_NEW *info = (NMTTDISPINFO_NEW *)pnmh;
+ info->lpszText = (LPSTR)info->lParam;
+ info->uFlags |= TTF_DI_SETITEM;
+ }
+ break;
}
}
}
diff --git a/src/po/Make_mvc.mak b/src/po/Make_mvc.mak
index 607cf5e9e..5448bee7a 100644
--- a/src/po/Make_mvc.mak
+++ b/src/po/Make_mvc.mak
@@ -6,11 +6,53 @@
# Please read README_mvc.txt before using this file.
#
-LANGUAGES = af ca cs de en_GB es fr ga it ja ko no pl ru sk sv uk vi zh_TW \
- zh_TW.UTF-8 zh_CN zh_CN.UTF-8
-MOFILES = af.mo ca.mo cs.mo de.mo en_GB.mo es.mo fr.mo ga.mo it.mo ja.mo \
- ko.mo no.mo pl.mo ru.mo sk.mo sv.mo uk.mo vi.mo \
- zh_TW.mo zh_TW.UTF-8.mo zh_CN.mo zh_CN.UTF-8.mo
+LANGUAGES = \
+ af \
+ ca \
+ cs \
+ de \
+ en_GB \
+ es \
+ fr \
+ ga \
+ it \
+ ja \
+ ko \
+ no \
+ pl \
+ ru \
+ sk \
+ sv \
+ uk \
+ vi \
+ zh_CN \
+ zh_CN.UTF-8 \
+ zh_TW \
+ zh_TW.UTF-8 \
+
+MOFILES = \
+ af.mo \
+ ca.mo \
+ cs.mo \
+ de.mo \
+ en_GB.mo \
+ es.mo \
+ fr.mo \
+ ga.mo \
+ it.mo \
+ ja.mo \
+ ko.mo \
+ no.mo \
+ pl.mo \
+ ru.mo \
+ sk.mo \
+ sv.mo \
+ uk.mo \
+ vi.mo \
+ zh_CN.UTF-8.mo \
+ zh_CN.mo \
+ zh_TW.UTF-8.mo \
+ zh_TW.mo \
PACKAGE = vim
diff --git a/src/search.c b/src/search.c
index b2de02763..288197cca 100644
--- a/src/search.c
+++ b/src/search.c
@@ -3666,7 +3666,7 @@ current_tagblock(oap, count_arg, include)
old_start = old_end;
/*
- * If we start on "<aaa>" use the whole block inclusive.
+ * If we start on "<aaa>" select that block.
*/
#ifdef FEAT_VISUAL
if (!VIsual_active || equalpos(VIsual, curwin->w_cursor))
@@ -3713,7 +3713,7 @@ again:
*/
for (n = 0; n < count; ++n)
{
- if (do_searchpair((char_u *)"<[^ \t>/!]\\+\\%(\\_s\\_[^>]\\{-}[^/]>\\|$\\|>\\)",
+ if (do_searchpair((char_u *)"<[^ \t>/!]\\+\\%(\\_s\\_[^>]\\{-}[^/]>\\|$\\|\\_s\\=>\\)",
(char_u *)"",
(char_u *)"</[^>]*>", BACKWARD, (char_u *)"", 0) <= 0)
{
@@ -3791,9 +3791,9 @@ again:
}
curwin->w_cursor = end_pos;
- /* If we now have the same start as before reset "do_include" and try
+ /* If we now have the same text as before reset "do_include" and try
* again. */
- if (equalpos(start_pos, old_start))
+ if (equalpos(start_pos, old_start) && equalpos(end_pos, old_end))
{
do_include = TRUE;
curwin->w_cursor = old_start;
diff --git a/src/version.h b/src/version.h
index 7df4ee1f5..0352cd37c 100644
--- a/src/version.h
+++ b/src/version.h
@@ -36,5 +36,5 @@
#define VIM_VERSION_NODOT "vim70aa"
#define VIM_VERSION_SHORT "7.0aa"
#define VIM_VERSION_MEDIUM "7.0aa ALPHA"
-#define VIM_VERSION_LONG "VIM - Vi IMproved 7.0aa ALPHA (2005 Jul 20)"
-#define VIM_VERSION_LONG_DATE "VIM - Vi IMproved 7.0aa ALPHA (2005 Jul 20, compiled "
+#define VIM_VERSION_LONG "VIM - Vi IMproved 7.0aa ALPHA (2005 Jul 21)"
+#define VIM_VERSION_LONG_DATE "VIM - Vi IMproved 7.0aa ALPHA (2005 Jul 21, compiled "