winhelp
Eric Pouech
eric.pouech at wanadoo.fr
Sun Nov 17 14:07:27 CST 2002
this patch adds most the needed code for correct windows handling:
- reads window information from .hlp file
- uses this info for opening the window(s)
- adds window information in links, so that a link can jump from one
window to another
A+
-------------- next part --------------
Name: wh_win
ChangeLog: added support for window information from the .hlp file
added support for window numbers in link
License: X11
GenDate: 2002/11/17 19:56:53 UTC
ModifiedFiles: programs/winhelp/hlpfile.c programs/winhelp/hlpfile.h programs/winhelp/macro.c programs/winhelp/winhelp.c programs/winhelp/winhelp.h
AddedFiles:
===================================================================
RCS file: /home/cvs/cvsroot/wine/wine/programs/winhelp/hlpfile.c,v
retrieving revision 1.13
diff -u -u -r1.13 hlpfile.c
--- programs/winhelp/hlpfile.c 13 Nov 2002 04:09:35 -0000 1.13
+++ programs/winhelp/hlpfile.c 17 Nov 2002 19:50:31 -0000
@@ -227,6 +227,9 @@
hlpfile->numFonts = 0;
hlpfile->fonts = NULL;
+ hlpfile->numWindows = 0;
+ hlpfile->windows = NULL;
+
strcpy(hlpfile->lpszPath, lpszPath);
first_hlpfile = hlpfile;
@@ -800,21 +803,20 @@
strcpy((char*)paragraph->link->lpszString, attributes.link.lpszString);
paragraph->link->lHash = attributes.link.lHash;
paragraph->link->bClrChange = attributes.link.bClrChange;
+ paragraph->link->window = attributes.link.window;
- WINE_TRACE("Link[%d] to %s@%08lx\n",
- paragraph->link->cookie, paragraph->link->lpszString, paragraph->link->lHash);
+ WINE_TRACE("Link[%d] to %s@%08lx:%d\n",
+ paragraph->link->cookie, paragraph->link->lpszString,
+ paragraph->link->lHash, paragraph->link->window);
}
-#if 0
- memset(&attributes, 0, sizeof(attributes));
-#else
attributes.hBitmap = 0;
attributes.link.lpszString = NULL;
attributes.link.bClrChange = FALSE;
attributes.link.lHash = 0;
+ attributes.link.window = -1;
attributes.wVSpace = 0;
attributes.wHSpace = 0;
attributes.wIndent = 0;
-#endif
}
/* else: null text, keep on storing attributes */
text += textsize;
@@ -969,7 +975,7 @@
attributes.link.bClrChange = !(*format & 1);
if (type == 1)
- {WINE_FIXME("Unsupported wnd number %d for link\n", *ptr); ptr++;}
+ attributes.link.window = *ptr++;
if (type == 4 || type == 6)
{
attributes.link.lpszString = ptr;
@@ -978,7 +984,20 @@
else
attributes.link.lpszString = hlpfile->lpszPath;
if (type == 6)
- WINE_FIXME("Unsupported wnd name '%s' for link\n", ptr);
+ {
+ int i;
+
+ for (i = 0; i < hlpfile->numWindows; i++)
+ {
+ if (!strcmp(ptr, hlpfile->windows[i].name))
+ {
+ attributes.link.window = i;
+ break;
+ }
+ }
+ if (attributes.link.window == -1)
+ WINE_WARN("Couldn't find window info for %s\n", ptr);
+ }
}
format += 3 + GET_USHORT(format, 1);
break;
@@ -1257,10 +1276,35 @@
case 6:
if (GET_USHORT(ptr, 2) != 90) {WINE_WARN("system6\n");break;}
- WINE_FIXME("System-Window: flags=%4x type=%s name=%s caption=%s (%d,%d)x(%d,%d)\n",
- GET_USHORT(ptr, 4), ptr + 6, ptr + 16, ptr + 25,
- GET_SHORT(ptr, 76), GET_USHORT(ptr, 78),
- GET_SHORT(ptr, 80), GET_USHORT(ptr, 82));
+ hlpfile->windows = HeapReAlloc(GetProcessHeap(), 0, hlpfile->windows,
+ sizeof(HLPFILE_WINDOWINFO) * ++hlpfile->numWindows);
+ if (hlpfile->windows)
+ {
+ unsigned flags = GET_USHORT(ptr, 4);
+ HLPFILE_WINDOWINFO* wi = &hlpfile->windows[hlpfile->numWindows - 1];
+
+ if (flags & 0x0001) strcpy(wi->type, ptr + 6); else wi->type[0] = '\0';
+ if (flags & 0x0002) strcpy(wi->name, ptr + 16); else wi->name[0] = '\0';
+ if (flags & 0x0004) strcpy(wi->caption, ptr + 25); else strncpy(wi->caption, hlpfile->lpszTitle, sizeof(wi->caption));
+ wi->origin.x = (flags & 0x0008) ? GET_USHORT(ptr, 76) : CW_USEDEFAULT;
+ wi->origin.y = (flags & 0x0010) ? GET_USHORT(ptr, 78) : CW_USEDEFAULT;
+ wi->size.cx = (flags & 0x0020) ? GET_USHORT(ptr, 80) : CW_USEDEFAULT;
+ wi->size.cy = (flags & 0x0040) ? GET_USHORT(ptr, 82) : CW_USEDEFAULT;
+ wi->style = (flags & 0x0080) ? GET_USHORT(ptr, 84) : SW_SHOW;
+ wi->sr_color = (flags & 0x0100) ? GET_UINT(ptr, 86) : 0xFFFFFF;
+ wi->nsr_color = (flags & 0x0200) ? GET_UINT(ptr, 90) : 0xFFFFFF;
+ WINE_FIXME("System-Window: flags=%c%c%c%c%c%c%c%c type=%s name=%s caption=%s (%ld,%ld)x(%ld,%ld)\n",
+ flags & 0x0001 ? 'T' : 't',
+ flags & 0x0002 ? 'N' : 'n',
+ flags & 0x0004 ? 'C' : 'c',
+ flags & 0x0008 ? 'X' : 'x',
+ flags & 0x0010 ? 'Y' : 'y',
+ flags & 0x0020 ? 'W' : 'w',
+ flags & 0x0040 ? 'H' : 'h',
+ flags & 0x0080 ? 'S' : 's',
+ wi->type, wi->name, wi->caption, wi->origin.x, wi->origin.y,
+ wi->size.cx, wi->size.cy);
+ }
break;
default:
WINE_WARN("Unsupported SystemRecord[%d]\n", GET_USHORT(ptr, 0));
@@ -1790,6 +1834,7 @@
HLPFILE_DeletePage(hlpfile->first_page);
HLPFILE_DeleteMacro(hlpfile->first_macro);
+ if (hlpfile->numWindows) HeapFree(GetProcessHeap(), 0, hlpfile->windows);
if (hlpfile->Context) HeapFree(GetProcessHeap(), 0, hlpfile->Context);
if (hlpfile->lpszTitle) HeapFree(GetProcessHeap(), 0, hlpfile->lpszTitle);
if (hlpfile->lpszCopyright) HeapFree(GetProcessHeap(), 0, hlpfile->lpszCopyright);
Index: programs/winhelp/hlpfile.h
===================================================================
RCS file: /home/cvs/cvsroot/wine/wine/programs/winhelp/hlpfile.h,v
retrieving revision 1.5
diff -u -u -r1.5 hlpfile.h
--- programs/winhelp/hlpfile.h 13 Nov 2002 04:09:35 -0000 1.5
+++ programs/winhelp/hlpfile.h 17 Nov 2002 18:13:11 -0000
@@ -21,12 +21,26 @@
struct tagHelpFile;
+typedef struct
+{
+ char type[10];
+ char name[9];
+ char caption[51];
+ POINT origin;
+ SIZE size;
+ int style;
+ DWORD win_style;
+ COLORREF sr_color; /* color for scrollable region */
+ COLORREF nsr_color; /* color for non scrollable region */
+} HLPFILE_WINDOWINFO;
+
typedef struct
{
enum {hlp_link_none, hlp_link_link, hlp_link_popup, hlp_link_macro} cookie;
- LPCSTR lpszString;
- LONG lHash;
- BOOL bClrChange;
+ LPCSTR lpszString;
+ LONG lHash;
+ BOOL bClrChange;
+ unsigned window;
} HLPFILE_LINK;
enum para_type {para_normal_text, para_debug_text, para_image};
@@ -113,6 +127,9 @@
unsigned numFonts;
HLPFILE_FONT* fonts;
+
+ unsigned numWindows;
+ HLPFILE_WINDOWINFO* windows;
} HLPFILE;
HLPFILE *HLPFILE_ReadHlpFile(LPCSTR lpszPath);
Index: programs/winhelp/macro.c
===================================================================
RCS file: /home/cvs/cvsroot/wine/wine/programs/winhelp/macro.c,v
retrieving revision 1.14
diff -u -u -r1.14 macro.c
--- programs/winhelp/macro.c 15 Nov 2002 01:34:57 -0000 1.14
+++ programs/winhelp/macro.c 17 Nov 2002 18:22:35 -0000
@@ -535,7 +535,12 @@
openfilename.lpTemplateName = 0;
if (GetOpenFileName(&openfilename))
- WINHELP_CreateHelpWindowByHash(szPath, 0, "main", FALSE, 0, NULL, SW_SHOWNORMAL);
+ {
+ HLPFILE* hlpfile = WINHELP_LookupHelpFile(szPath);
+
+ WINHELP_CreateHelpWindowByHash(hlpfile, 0,
+ WINHELP_GetWindowInfo(hlpfile, "main"), SW_SHOWNORMAL);
+ }
}
void MACRO_Find(void)
@@ -643,8 +648,13 @@
void MACRO_JumpContents(LPCSTR lpszPath, LPCSTR lpszWindow)
{
+ HLPFILE* hlpfile;
+
WINE_TRACE("(\"%s\", \"%s\")\n", lpszPath, lpszWindow);
- WINHELP_CreateHelpWindowByHash(lpszPath, 0, lpszWindow, FALSE, 0, NULL, SW_NORMAL);
+ hlpfile = WINHELP_LookupHelpFile(lpszPath);
+ WINHELP_CreateHelpWindowByHash(hlpfile, 0,
+ WINHELP_GetWindowInfo(hlpfile, lpszWindow),
+ SW_NORMAL);
}
void MACRO_JumpContext(LPCSTR lpszPath, LPCSTR lpszWindow, LONG context)
@@ -654,8 +664,13 @@
void MACRO_JumpHash(LPCSTR lpszPath, LPCSTR lpszWindow, LONG lHash)
{
+ HLPFILE* hlpfile;
+
WINE_TRACE("(\"%s\", \"%s\", %lu)\n", lpszPath, lpszWindow, lHash);
- WINHELP_CreateHelpWindowByHash(lpszPath, lHash, lpszWindow, FALSE, 0, NULL, SW_NORMAL);
+ hlpfile = WINHELP_LookupHelpFile(lpszPath);
+ WINHELP_CreateHelpWindowByHash(hlpfile, lHash,
+ WINHELP_GetWindowInfo(hlpfile, lpszWindow),
+ SW_NORMAL);
}
void MACRO_JumpHelpOn(void)
@@ -699,9 +714,14 @@
void MACRO_Next(void)
{
+ HLPFILE_PAGE* page;
+
WINE_TRACE("()\n");
- if (Globals.active_win->page->next)
- WINHELP_CreateHelpWindowByPage(Globals.active_win->page->next, "main", FALSE, 0, NULL, SW_NORMAL);
+ if ((page = Globals.active_win->page->next) != NULL)
+ {
+ page->file->wRefCount++;
+ WINHELP_CreateHelpWindow(page, Globals.active_win->info, SW_NORMAL);
+ }
}
void MACRO_NoShow(void)
@@ -731,9 +751,14 @@
void MACRO_Prev(void)
{
+ HLPFILE_PAGE* page;
+
WINE_TRACE("()\n");
- if (Globals.active_win->page->prev)
- WINHELP_CreateHelpWindowByPage(Globals.active_win->page->prev, "main", FALSE, 0, NULL, SW_NORMAL);
+ if ((page = Globals.active_win->page->prev) != NULL)
+ {
+ page->file->wRefCount++;
+ WINHELP_CreateHelpWindow(page, Globals.active_win->info, SW_NORMAL);
+ }
}
void MACRO_Print(void)
Index: programs/winhelp/winhelp.c
===================================================================
RCS file: /home/cvs/cvsroot/wine/wine/programs/winhelp/winhelp.c,v
retrieving revision 1.20
diff -u -u -r1.20 winhelp.c
--- programs/winhelp/winhelp.c 15 Nov 2002 01:34:57 -0000 1.20
+++ programs/winhelp/winhelp.c 17 Nov 2002 19:54:44 -0000
@@ -20,6 +20,7 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
+#include <assert.h>
#include <stdio.h>
#include <string.h>
#include "winbase.h"
@@ -47,7 +48,102 @@
WINHELP_GLOBALS Globals = {3, 0, 0, 0, 1, 0, 0};
-static BOOL MacroTest = FALSE;
+/***********************************************************************
+ *
+ * WINHELP_LookupHelpFile
+ */
+HLPFILE* WINHELP_LookupHelpFile(LPCSTR lpszFile)
+{
+ HLPFILE* hlpfile;
+
+ hlpfile = HLPFILE_ReadHlpFile(lpszFile);
+
+ /* Add Suffix `.hlp' */
+ if (!hlpfile && lstrcmpi(lpszFile + strlen(lpszFile) - 4, ".hlp") != 0)
+ {
+ char szFile_hlp[MAX_PATHNAME_LEN];
+
+ lstrcpyn(szFile_hlp, lpszFile, sizeof(szFile_hlp) - 4);
+ szFile_hlp[sizeof(szFile_hlp) - 5] = '\0';
+ lstrcat(szFile_hlp, ".hlp");
+
+ hlpfile = HLPFILE_ReadHlpFile(szFile_hlp);
+ }
+ if (!hlpfile)
+ {
+ WINHELP_MessageBoxIDS_s(STID_HLPFILE_ERROR_s, lpszFile, STID_WHERROR, MB_OK);
+ if (Globals.win_list) return NULL;
+ }
+ return hlpfile;
+}
+
+/******************************************************************
+ * WINHELP_GetWindowInfo
+ *
+ *
+ */
+HLPFILE_WINDOWINFO* WINHELP_GetWindowInfo(HLPFILE* hlpfile, LPCSTR name)
+{
+ static HLPFILE_WINDOWINFO mwi;
+ int i;
+
+ if (!name || !name[0])
+ name = Globals.active_win->lpszName;
+
+ for (i = 0; i < hlpfile->numWindows; i++)
+ if (!strcmp(hlpfile->windows[i].name, name))
+ return &hlpfile->windows[i];
+
+ if (strcmp(name, "main") != 0)
+ {
+ WINE_FIXME("Couldn't find window info for %s\n", name);
+ assert(0);
+ return NULL;
+ }
+ if (!mwi.name[0])
+ {
+ strcpy(mwi.type, "primary");
+ strcpy(mwi.name, "main");
+ LoadString(Globals.hInstance, STID_WINE_HELP,
+ mwi.caption, sizeof(mwi.caption));
+ //strcpy(mwi.caption, hlpfile->lpszTitle);
+ mwi.origin.x = mwi.origin.y = mwi.size.cx = mwi.size.cy = CW_USEDEFAULT;
+ mwi.style = SW_SHOW;
+ mwi.sr_color = mwi.sr_color = 0xFFFFFF;
+ }
+ return &mwi;
+}
+
+/******************************************************************
+ * HLPFILE_GetPopupWindowInfo
+ *
+ *
+ */
+HLPFILE_WINDOWINFO* WINHELP_GetPopupWindowInfo(HLPFILE* hlpfile, HWND hParentWnd, POINT* mouse)
+{
+ static HLPFILE_WINDOWINFO wi;
+
+ RECT parent_rect;
+
+ wi.type[0] = wi.name[0] = wi.caption[0] = '\0';
+
+ /* Calculate horizontal size and position of a popup window */
+ GetWindowRect(hParentWnd, &parent_rect);
+ wi.size.cx = (parent_rect.right - parent_rect.left) / 2;
+ wi.size.cy = 10; /* need a non null value, so that border are taken into account while computing */
+
+ wi.origin = *mouse;
+ ClientToScreen(hParentWnd, &wi.origin);
+ wi.origin.x -= wi.size.cx / 2;
+ wi.origin.x = min(wi.origin.x, GetSystemMetrics(SM_CXSCREEN) - wi.size.cx);
+ wi.origin.x = max(wi.origin.x, 0);
+
+ wi.style = SW_SHOW;
+ wi.win_style = WS_POPUPWINDOW;
+ wi.sr_color = wi.sr_color = 0xFFFFFF;
+
+ return &wi;
+}
/***********************************************************************
*
@@ -57,6 +153,7 @@
{
MSG msg;
LONG lHash = 0;
+ HLPFILE* hlpfile;
Globals.hInstance = hInstance;
@@ -85,10 +182,6 @@
Globals.wVersion = option - '0';
break;
- case 't':
- MacroTest = TRUE;
- break;
-
case 'x':
show = SW_HIDE;
Globals.isBook = FALSE;
@@ -102,7 +195,9 @@
/* Create primary window */
WINHELP_RegisterWinClasses();
- WINHELP_CreateHelpWindowByHash(cmdline, lHash, "main", FALSE, NULL, NULL, show);
+ hlpfile = WINHELP_LookupHelpFile(cmdline);
+ WINHELP_CreateHelpWindowByHash(hlpfile, lHash,
+ WINHELP_GetWindowInfo(hlpfile, "main"), show);
/* Message loop */
while (GetMessage(&msg, 0, 0, 0))
@@ -219,54 +314,25 @@
*
* WINHELP_CreateHelpWindow
*/
-
-static BOOL WINHELP_CreateHelpWindow(HLPFILE_PAGE* page, LPCSTR lpszWindow,
- BOOL bPopup, HWND hParentWnd, LPPOINT mouse, INT nCmdShow)
+BOOL WINHELP_CreateHelpWindow(HLPFILE_PAGE* page, HLPFILE_WINDOWINFO* wi,
+ int nCmdShow)
{
- CHAR szCaption[MAX_STRING_LEN];
- SIZE size = {CW_USEDEFAULT, 0/*CW_USEDEFAULT*/};
- POINT origin = {240, 0};
- LPSTR ptr;
WINHELP_WINDOW *win, *oldwin;
- HLPFILE_MACRO *macro;
HWND hWnd;
BOOL bPrimary;
- if (bPopup)
- lpszWindow = NULL;
- else if (!lpszWindow || !lpszWindow[0])
- lpszWindow = Globals.active_win->lpszName;
- bPrimary = lpszWindow && !lstrcmpi(lpszWindow, "main");
-
- /* Calculate horizontal size and position of a popup window */
- if (bPopup)
- {
- RECT parent_rect;
- GetWindowRect(hParentWnd, &parent_rect);
- size.cx = (parent_rect.right - parent_rect.left) / 2;
- size.cy = 10; /* need a non null value, so that border are taken into account while computing */
-
- origin = *mouse;
- ClientToScreen(hParentWnd, &origin);
- origin.x -= size.cx / 2;
- origin.x = min(origin.x, GetSystemMetrics(SM_CXSCREEN) - size.cx);
- origin.x = max(origin.x, 0);
- }
+ bPrimary = !lstrcmpi(wi->name, "main");
/* Initialize WINHELP_WINDOW struct */
win = HeapAlloc(GetProcessHeap(), 0,
- sizeof(WINHELP_WINDOW) + (lpszWindow ? strlen(lpszWindow) + 1 : 0));
+ sizeof(WINHELP_WINDOW) + strlen(wi->name) + 1);
if (!win) return FALSE;
win->next = Globals.win_list;
Globals.win_list = win;
- if (lpszWindow)
- {
- ptr = (char*)win + sizeof(WINHELP_WINDOW);
- lstrcpy(ptr, (LPSTR) lpszWindow);
- win->lpszName = ptr;
- }
- else win->lpszName = NULL;
+
+ win->lpszName = (char*)win + sizeof(WINHELP_WINDOW);
+ lstrcpy((char*)win->lpszName, wi->name);
win->page = page;
win->first_button = 0;
@@ -279,11 +345,11 @@
win->hArrowCur = LoadCursorA(0, IDC_ARROWA);
win->hHandCur = LoadCursorA(0, IDC_HANDA);
+ win->info = wi;
+
Globals.active_win = win;
/* Initialize default pushbuttons */
- if (MacroTest && !bPopup)
- MACRO_CreateButton("BTN_TEST", "&Test", "MacroTest");
if (bPrimary && page)
{
CHAR buffer[MAX_STRING_LEN];
@@ -301,14 +367,19 @@
}
/* Initialize file specific pushbuttons */
- if (!bPopup && page)
+ if (!(wi->win_style & WS_POPUP) && page)
+ {
+ HLPFILE_MACRO *macro;
for (macro = page->file->first_macro; macro; macro = macro->next)
MACRO_ExecuteMacro(macro->lpszMacro);
+ }
/* Reuse existing window */
- if (lpszWindow)
+ if (!(wi->win_style & WS_POPUP))
+ {
for (oldwin = win->next; oldwin; oldwin = oldwin->next)
- if (oldwin->lpszName && !lstrcmpi(oldwin->lpszName, lpszWindow))
+ {
+ if (!lstrcmpi(oldwin->lpszName, wi->name))
{
WINHELP_BUTTON *button;
@@ -317,9 +388,9 @@
win->hTextWnd = oldwin->hTextWnd;
oldwin->hMainWnd = oldwin->hButtonBoxWnd = oldwin->hTextWnd = 0;
- SetWindowLong(win->hMainWnd, 0, (LONG) win);
- SetWindowLong(win->hButtonBoxWnd, 0, (LONG) win);
- SetWindowLong(win->hTextWnd, 0, (LONG) win);
+ SetWindowLong(win->hMainWnd, 0, (LONG)win);
+ SetWindowLong(win->hButtonBoxWnd, 0, (LONG)win);
+ SetWindowLong(win->hTextWnd, 0, (LONG)win);
WINHELP_InitFonts(win->hMainWnd);
@@ -340,13 +411,12 @@
WINHELP_DeleteWindow(oldwin);
return TRUE;
}
+ }
+ }
- /* Create main Window */
- if (!page) LoadString(Globals.hInstance, STID_WINE_HELP, szCaption, sizeof(szCaption));
- hWnd = CreateWindow(bPopup ? TEXT_WIN_CLASS_NAME : MAIN_WIN_CLASS_NAME,
- page ? page->file->lpszTitle : szCaption,
- bPopup ? WS_POPUPWINDOW | WS_BORDER : WS_OVERLAPPEDWINDOW,
- origin.x, origin.y, size.cx, size.cy,
+ hWnd = CreateWindow((wi->win_style & WS_POPUP) ? TEXT_WIN_CLASS_NAME : MAIN_WIN_CLASS_NAME,
+ wi->caption, wi->win_style,
+ wi->origin.x, wi->origin.y, wi->size.cx, wi->size.cy,
0, bPrimary ? LoadMenu(Globals.hInstance, MAKEINTRESOURCE(MAIN_MENU)) : 0,
Globals.hInstance, win);
@@ -358,53 +428,18 @@
/***********************************************************************
*
- * WINHELP_CreateHelpWindowByPage
- */
-BOOL WINHELP_CreateHelpWindowByPage(HLPFILE_PAGE* page, LPCSTR lpszWindow,
- BOOL bPopup, HWND hParentWnd, LPPOINT mouse, INT nCmdShow)
-{
- if (page) page->file->wRefCount++;
- return WINHELP_CreateHelpWindow(page, lpszWindow, bPopup, hParentWnd, mouse, nCmdShow);
-}
-
-/***********************************************************************
- *
* WINHELP_CreateHelpWindowByHash
*/
-BOOL WINHELP_CreateHelpWindowByHash(LPCSTR lpszFile, LONG lHash, LPCSTR lpszWindow,
- BOOL bPopup, HWND hParentWnd, LPPOINT mouse, INT nCmdShow)
+BOOL WINHELP_CreateHelpWindowByHash(HLPFILE* hlpfile, LONG lHash,
+ HLPFILE_WINDOWINFO* wi, int nCmdShow)
{
HLPFILE_PAGE* page = NULL;
- /* Read help file */
- if (lpszFile[0])
- {
- HLPFILE* hlpfile;
-
- hlpfile = HLPFILE_ReadHlpFile(lpszFile);
-
- /* Add Suffix `.hlp' */
- if (!hlpfile && lstrcmpi(lpszFile + strlen(lpszFile) - 4, ".hlp") != 0)
- {
- CHAR szFile_hlp[MAX_PATHNAME_LEN];
-
- lstrcpyn(szFile_hlp, lpszFile, sizeof(szFile_hlp) - 4);
- szFile_hlp[sizeof(szFile_hlp) - 5] = '\0';
- lstrcat(szFile_hlp, ".hlp");
-
- hlpfile = HLPFILE_ReadHlpFile(szFile_hlp);
- }
- if (!hlpfile)
- {
- WINHELP_MessageBoxIDS_s(STID_HLPFILE_ERROR_s, lpszFile, STID_WHERROR, MB_OK);
- if (Globals.win_list) return FALSE;
- }
- else
- page = lHash ? HLPFILE_PageByHash(hlpfile, lHash) :
- HLPFILE_Contents(hlpfile);
- }
- else page = NULL;
- return WINHELP_CreateHelpWindowByPage(page, lpszWindow, bPopup, hParentWnd, mouse, nCmdShow);
+ if (hlpfile)
+ page = lHash ? HLPFILE_PageByHash(hlpfile, lHash) :
+ HLPFILE_Contents(hlpfile);
+ if (page) page->file->wRefCount++;
+ return WINHELP_CreateHelpWindow(page, wi, nCmdShow);
}
/***********************************************************************
@@ -599,7 +634,7 @@
win = (WINHELP_WINDOW*) ((LPCREATESTRUCT) lParam)->lpCreateParams;
SetWindowLong(hWnd, 0, (LONG) win);
win->hTextWnd = hWnd;
- if (!win->lpszName) Globals.hPopupWnd = win->hMainWnd = hWnd;
+ if (win->info->win_style & WS_POPUP) Globals.hPopupWnd = win->hMainWnd = hWnd;
WINHELP_InitFonts(hWnd);
break;
@@ -607,7 +642,7 @@
win = (WINHELP_WINDOW*) GetWindowLong(hWnd, 0);
/* Calculate vertical size and position of a popup window */
- if (!win->lpszName)
+ if (win->info->win_style & WS_POPUP)
{
POINT origin;
RECT old_window_rect;
@@ -773,6 +808,9 @@
part = WINHELP_IsOverLink(hWnd, wParam, lParam);
if (part)
{
+ HLPFILE* hlpfile;
+ HLPFILE_WINDOWINFO* wi;
+
mouse.x = LOWORD(lParam);
mouse.y = HIWORD(lParam);
@@ -781,12 +819,24 @@
case hlp_link_none:
break;
case hlp_link_link:
- WINHELP_CreateHelpWindowByHash(part->link.lpszString, part->link.lHash, NULL,
- FALSE, hWnd, &mouse, SW_NORMAL);
+ hlpfile = WINHELP_LookupHelpFile(part->link.lpszString);
+ if (part->link.window == -1)
+ wi = win->info;
+ else if (part->link.window < hlpfile->numWindows)
+ wi = &hlpfile->windows[part->link.window];
+ else
+ {
+ WINE_WARN("link to window %d/%d\n", part->link.window, hlpfile->numWindows);
+ break;
+ }
+ WINHELP_CreateHelpWindowByHash(hlpfile, part->link.lHash, wi,
+ SW_NORMAL);
break;
case hlp_link_popup:
- WINHELP_CreateHelpWindowByHash(part->link.lpszString, part->link.lHash, NULL,
- TRUE, hWnd, &mouse, SW_NORMAL);
+ hlpfile = WINHELP_LookupHelpFile(part->link.lpszString);
+ WINHELP_CreateHelpWindowByHash(hlpfile, part->link.lHash,
+ WINHELP_GetPopupWindowInfo(hlpfile, hWnd, &mouse),
+ SW_NORMAL);
break;
case hlp_link_macro:
MACRO_ExecuteMacro(part->link.lpszString);
@@ -932,6 +982,7 @@
part->link.cookie = link->cookie;
part->link.lHash = link->lHash;
part->link.bClrChange = link->bClrChange;
+ part->link.window = link->window;
}
else part->link.cookie = hlp_link_none;
@@ -1009,6 +1060,7 @@
part->link.cookie = link->cookie;
part->link.lHash = link->lHash;
part->link.bClrChange = link->bClrChange;
+ part->link.window = link->window;
}
else part->link.cookie = hlp_link_none;
Index: programs/winhelp/winhelp.h
===================================================================
RCS file: /home/cvs/cvsroot/wine/wine/programs/winhelp/winhelp.h,v
retrieving revision 1.7
diff -u -u -r1.7 winhelp.h
--- programs/winhelp/winhelp.h 15 Nov 2002 01:34:57 -0000 1.7
+++ programs/winhelp/winhelp.h 17 Nov 2002 18:22:49 -0000
@@ -85,7 +85,7 @@
typedef struct tagWinHelp
{
- LPCSTR lpszName;
+ LPCSTR lpszName;
WINHELP_BUTTON* first_button;
HLPFILE_PAGE* page;
@@ -102,6 +102,8 @@
HCURSOR hArrowCur;
HCURSOR hHandCur;
+ HLPFILE_WINDOWINFO* info;
+
struct tagWinHelp* next;
} WINHELP_WINDOW;
@@ -118,10 +120,12 @@
extern WINHELP_GLOBALS Globals;
-BOOL WINHELP_CreateHelpWindowByHash(LPCSTR, LONG, LPCSTR, BOOL, HWND, LPPOINT, INT);
-BOOL WINHELP_CreateHelpWindowByPage(HLPFILE_PAGE*, LPCSTR, BOOL, HWND, LPPOINT, INT);
+BOOL WINHELP_CreateHelpWindowByHash(HLPFILE*, LONG, HLPFILE_WINDOWINFO*, int);
+BOOL WINHELP_CreateHelpWindow(HLPFILE_PAGE*, HLPFILE_WINDOWINFO*, int);
INT WINHELP_MessageBoxIDS(UINT, UINT, WORD);
INT WINHELP_MessageBoxIDS_s(UINT, LPCSTR, UINT, WORD);
+HLPFILE* WINHELP_LookupHelpFile(LPCSTR lpszFile);
+HLPFILE_WINDOWINFO* WINHELP_GetWindowInfo(HLPFILE* hlpfile, LPCSTR name);
extern char MAIN_WIN_CLASS_NAME[];
extern char BUTTON_BOX_WIN_CLASS_NAME[];
More information about the wine-patches
mailing list