[1/2] winhlp32: Reorder some functions to avoid forward declarations in winhelp.c.
Francois Gouget
fgouget at free.fr
Thu Jan 8 07:13:17 CST 2009
---
programs/winhlp32/winhelp.c | 1290 +++++++++++++++++++++----------------------
1 files changed, 639 insertions(+), 651 deletions(-)
diff --git a/programs/winhlp32/winhelp.c b/programs/winhlp32/winhelp.c
index 34f93ee..9a54f33 100644
--- a/programs/winhlp32/winhelp.c
+++ b/programs/winhlp32/winhelp.c
@@ -46,24 +46,99 @@
WINE_DEFAULT_DEBUG_CHANNEL(winhelp);
-static BOOL WINHELP_RegisterWinClasses(void);
-static LRESULT CALLBACK WINHELP_MainWndProc(HWND, UINT, WPARAM, LPARAM);
-static LRESULT CALLBACK WINHELP_ButtonBoxWndProc(HWND, UINT, WPARAM, LPARAM);
-static LRESULT CALLBACK WINHELP_ButtonWndProc(HWND, UINT, WPARAM, LPARAM);
-static LRESULT CALLBACK WINHELP_HistoryWndProc(HWND, UINT, WPARAM, LPARAM);
-static LRESULT CALLBACK WINHELP_ShadowWndProc(HWND, UINT, WPARAM, LPARAM);
-static BOOL WINHELP_CheckPopup(HWND, UINT, WPARAM, LPARAM, LRESULT*);
-static void WINHELP_InitFonts(HWND hWnd);
-static void WINHELP_DeleteWindow(WINHELP_WINDOW*);
-static void WINHELP_DeleteButtons(WINHELP_WINDOW*);
-static void WINHELP_SetupText(HWND hWnd, WINHELP_WINDOW *win, ULONG relative);
-static void WINHELP_DeletePageLinks(HLPFILE_PAGE* page);
-
WINHELP_GLOBALS Globals = {3, NULL, TRUE, NULL, NULL, NULL, NULL, NULL, {{{NULL,NULL}},0}, NULL};
#define CTL_ID_BUTTON 0x700
#define CTL_ID_TEXT 0x701
+
+/***********************************************************************
+ *
+ * WINHELP_InitFonts
+ */
+static void WINHELP_InitFonts(HWND hWnd)
+{
+ WINHELP_WINDOW *win = (WINHELP_WINDOW*) GetWindowLongPtr(hWnd, 0);
+ LOGFONT logfontlist[] = {
+ {-10, 0, 0, 0, 400, 0, 0, 0, DEFAULT_CHARSET, 0, 0, 0, 32, "Helv"},
+ {-12, 0, 0, 0, 700, 0, 0, 0, DEFAULT_CHARSET, 0, 0, 0, 32, "Helv"},
+ {-12, 0, 0, 0, 700, 0, 0, 0, DEFAULT_CHARSET, 0, 0, 0, 32, "Helv"},
+ {-12, 0, 0, 0, 400, 0, 0, 0, DEFAULT_CHARSET, 0, 0, 0, 32, "Helv"},
+ {-12, 0, 0, 0, 700, 0, 0, 0, DEFAULT_CHARSET, 0, 0, 0, 32, "Helv"},
+ {-10, 0, 0, 0, 700, 0, 0, 0, DEFAULT_CHARSET, 0, 0, 0, 32, "Helv"},
+ { -8, 0, 0, 0, 400, 0, 0, 0, DEFAULT_CHARSET, 0, 0, 0, 32, "Helv"}};
+#define FONTS_LEN (sizeof(logfontlist)/sizeof(*logfontlist))
+
+ static HFONT fonts[FONTS_LEN];
+ static BOOL init = 0;
+
+ win->fonts_len = FONTS_LEN;
+ win->fonts = fonts;
+
+ if (!init)
+ {
+ UINT i;
+
+ for (i = 0; i < FONTS_LEN; i++)
+ {
+ fonts[i] = CreateFontIndirect(&logfontlist[i]);
+ }
+
+ init = 1;
+ }
+}
+
+static DWORD CALLBACK WINHELP_RtfStreamIn(DWORD_PTR cookie, BYTE* buff,
+ LONG cb, LONG* pcb)
+{
+ struct RtfData* rd = (struct RtfData*)cookie;
+
+ if (rd->where >= rd->ptr) return 1;
+ if (rd->where + cb > rd->ptr)
+ cb = rd->ptr - rd->where;
+ memcpy(buff, rd->where, cb);
+ rd->where += cb;
+ *pcb = cb;
+ return 0;
+}
+
+static void WINHELP_SetupText(HWND hTextWnd, WINHELP_WINDOW* win, ULONG relative)
+{
+ /* At first clear area - needed by EM_POSFROMCHAR/EM_SETSCROLLPOS */
+ SendMessage(hTextWnd, WM_SETTEXT, 0, (LPARAM)"");
+ SendMessage(hTextWnd, WM_SETREDRAW, FALSE, 0);
+ SendMessage(hTextWnd, EM_SETBKGNDCOLOR, 0, (LPARAM)win->info->sr_color);
+ /* set word-wrap to window size (undocumented) */
+ SendMessage(hTextWnd, EM_SETTARGETDEVICE, 0, 0);
+ if (win->page)
+ {
+ struct RtfData rd;
+ EDITSTREAM es;
+ unsigned cp = 0;
+ POINTL ptl;
+ POINT pt;
+
+
+ if (HLPFILE_BrowsePage(win->page, &rd, win->font_scale, relative))
+ {
+ rd.where = rd.data;
+ es.dwCookie = (DWORD_PTR)&rd;
+ es.dwError = 0;
+ es.pfnCallback = WINHELP_RtfStreamIn;
+
+ SendMessageW(hTextWnd, EM_STREAMIN, SF_RTF, (LPARAM)&es);
+ cp = rd.char_pos_rel;
+ }
+ /* FIXME: else leaking potentially the rd.first_link chain */
+ HeapFree(GetProcessHeap(), 0, rd.data);
+ SendMessage(hTextWnd, EM_POSFROMCHAR, (WPARAM)&ptl, cp ? cp - 1 : 0);
+ pt.x = 0; pt.y = ptl.y;
+ SendMessage(hTextWnd, EM_SETSCROLLPOS, 0, (LPARAM)&pt);
+ }
+ SendMessage(hTextWnd, WM_SETREDRAW, TRUE, 0);
+ InvalidateRect(hTextWnd, NULL, TRUE);
+}
+
/***********************************************************************
*
* WINHELP_GetOpenFileName
@@ -115,10 +190,19 @@ BOOL WINHELP_GetOpenFileName(LPSTR lpszFile, int len)
return GetOpenFileName(&openfilename);
}
-static char* WINHELP_GetCaption(WINHELP_WNDPAGE* wpage)
+/***********************************************************************
+ *
+ * WINHELP_MessageBoxIDS_s
+ */
+INT WINHELP_MessageBoxIDS_s(UINT ids_text, LPCSTR str, UINT ids_title, WORD type)
{
- if (wpage->wininfo->caption[0]) return wpage->wininfo->caption;
- return wpage->page->file->lpszTitle;
+ CHAR text[MAX_STRING_LEN];
+ CHAR newtext[MAX_STRING_LEN + MAX_PATH];
+
+ LoadString(Globals.hInstance, ids_text, text, sizeof(text));
+ wsprintf(newtext, text, str);
+
+ return MessageBox(0, newtext, MAKEINTRESOURCE(ids_title), type);
}
/***********************************************************************
@@ -238,142 +322,6 @@ static HLPFILE_WINDOWINFO* WINHELP_GetPopupWindowInfo(HLPFILE* hlpfile,
return &wi;
}
-/***********************************************************************
- *
- * WinMain
- */
-int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE prev, LPSTR cmdline, int show)
-{
- MSG msg;
- LONG lHash = 0;
- HLPFILE* hlpfile;
- static CHAR default_wndname[] = "main";
- LPSTR wndname = default_wndname;
- WINHELP_DLL* dll;
-
- Globals.hInstance = hInstance;
-
- if (LoadLibrary("riched20.dll") == NULL)
- return MessageBox(0, MAKEINTRESOURCE(STID_NO_RICHEDIT),
- MAKEINTRESOURCE(STID_WHERROR), MB_OK);
-
- /* Get options */
- while (*cmdline && (*cmdline == ' ' || *cmdline == '-'))
- {
- CHAR option;
- LPCSTR topic_id;
- if (*cmdline++ == ' ') continue;
-
- option = *cmdline;
- if (option) cmdline++;
- while (*cmdline && *cmdline == ' ') cmdline++;
- switch (option)
- {
- case 'i':
- case 'I':
- topic_id = cmdline;
- while (*cmdline && *cmdline != ' ') cmdline++;
- if (*cmdline) *cmdline++ = '\0';
- lHash = HLPFILE_Hash(topic_id);
- break;
-
- case '3':
- case '4':
- Globals.wVersion = option - '0';
- break;
-
- case 'x':
- show = SW_HIDE;
- Globals.isBook = FALSE;
- break;
-
- default:
- WINE_FIXME("Unsupported cmd line: %s\n", cmdline);
- break;
- }
- }
-
- /* Create primary window */
- if (!WINHELP_RegisterWinClasses())
- {
- WINE_FIXME("Couldn't register classes\n");
- return 0;
- }
-
- if (*cmdline)
- {
- char* ptr;
- if ((*cmdline == '"') && (ptr = strchr(cmdline+1, '"')))
- {
- cmdline++;
- *ptr = '\0';
- }
- if ((ptr = strchr(cmdline, '>')))
- {
- *ptr = '\0';
- wndname = ptr + 1;
- }
- hlpfile = WINHELP_LookupHelpFile(cmdline);
- if (!hlpfile) return 0;
- }
- else hlpfile = NULL;
- WINHELP_OpenHelpWindow(HLPFILE_PageByHash, hlpfile, lHash,
- WINHELP_GetWindowInfo(hlpfile, wndname), show);
-
- /* Message loop */
- while (GetMessage(&msg, 0, 0, 0))
- {
- TranslateMessage(&msg);
- DispatchMessage(&msg);
- }
- for (dll = Globals.dlls; dll; dll = dll->next)
- {
- if (dll->class & DC_INITTERM) dll->handler(DW_TERM, 0, 0);
- }
- return 0;
-}
-
-/***********************************************************************
- *
- * RegisterWinClasses
- */
-static BOOL WINHELP_RegisterWinClasses(void)
-{
- WNDCLASS class_main, class_button_box, class_shadow, class_history;
-
- class_main.style = CS_HREDRAW | CS_VREDRAW;
- class_main.lpfnWndProc = WINHELP_MainWndProc;
- class_main.cbClsExtra = 0;
- class_main.cbWndExtra = sizeof(LONG);
- class_main.hInstance = Globals.hInstance;
- class_main.hIcon = LoadIcon(Globals.hInstance, MAKEINTRESOURCE(IDI_WINHELP));
- class_main.hCursor = LoadCursor(0, IDC_ARROW);
- class_main.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
- class_main.lpszMenuName = 0;
- class_main.lpszClassName = MAIN_WIN_CLASS_NAME;
-
- class_button_box = class_main;
- class_button_box.lpfnWndProc = WINHELP_ButtonBoxWndProc;
- class_button_box.cbWndExtra = 0;
- class_button_box.hbrBackground = (HBRUSH)(COLOR_BTNFACE+1);
- class_button_box.lpszClassName = BUTTON_BOX_WIN_CLASS_NAME;
-
- class_shadow = class_main;
- class_shadow.lpfnWndProc = WINHELP_ShadowWndProc;
- class_shadow.cbWndExtra = 0;
- class_shadow.hbrBackground = (HBRUSH)(COLOR_3DDKSHADOW+1);
- class_shadow.lpszClassName = SHADOW_WIN_CLASS_NAME;
-
- class_history = class_main;
- class_history.lpfnWndProc = WINHELP_HistoryWndProc;
- class_history.lpszClassName = HISTORY_WIN_CLASS_NAME;
-
- return (RegisterClass(&class_main) &&
- RegisterClass(&class_button_box) &&
- RegisterClass(&class_shadow) &&
- RegisterClass(&class_history));
-}
-
typedef struct
{
WORD size;
@@ -502,7 +450,104 @@ void WINHELP_LayoutMainWindow(WINHELP_WINDOW* win)
}
-static void WINHELP_RememberPage(WINHELP_WINDOW* win, WINHELP_WNDPAGE* wpage)
+/******************************************************************
+ * WINHELP_DeleteButtons
+ *
+ */
+static void WINHELP_DeleteButtons(WINHELP_WINDOW* win)
+{
+ WINHELP_BUTTON* b;
+ WINHELP_BUTTON* bp;
+
+ for (b = win->first_button; b; b = bp)
+ {
+ DestroyWindow(b->hWnd);
+ bp = b->next;
+ HeapFree(GetProcessHeap(), 0, b);
+ }
+ win->first_button = NULL;
+}
+
+/******************************************************************
+ * WINHELP_DeleteBackSet
+ *
+ */
+void WINHELP_DeleteBackSet(WINHELP_WINDOW* win)
+{
+ unsigned int i;
+
+ for (i = 0; i < win->back.index; i++)
+ {
+ HLPFILE_FreeHlpFile(win->back.set[i].page->file);
+ win->back.set[i].page = NULL;
+ }
+ win->back.index = 0;
+}
+
+/******************************************************************
+ * WINHELP_DeletePageLinks
+ *
+ */
+static void WINHELP_DeletePageLinks(HLPFILE_PAGE* page)
+{
+ HLPFILE_LINK* curr;
+ HLPFILE_LINK* next;
+
+ for (curr = page->first_link; curr; curr = next)
+ {
+ next = curr->next;
+ HeapFree(GetProcessHeap(), 0, curr);
+ }
+}
+
+/***********************************************************************
+ *
+ * WINHELP_DeleteWindow
+ */
+static void WINHELP_DeleteWindow(WINHELP_WINDOW* win)
+{
+ WINHELP_WINDOW** w;
+
+ for (w = &Globals.win_list; *w; w = &(*w)->next)
+ {
+ if (*w == win)
+ {
+ *w = win->next;
+ break;
+ }
+ }
+
+ if (Globals.active_win == win)
+ {
+ Globals.active_win = Globals.win_list;
+ if (Globals.win_list)
+ SetActiveWindow(Globals.win_list->hMainWnd);
+ }
+
+ if (win == Globals.active_popup)
+ Globals.active_popup = NULL;
+
+ WINHELP_DeleteButtons(win);
+
+ if (win->page) WINHELP_DeletePageLinks(win->page);
+ if (win->hShadowWnd) DestroyWindow(win->hShadowWnd);
+ if (win->hHistoryWnd) DestroyWindow(win->hHistoryWnd);
+
+ DeleteObject(win->hBrush);
+
+ WINHELP_DeleteBackSet(win);
+
+ if (win->page) HLPFILE_FreeHlpFile(win->page->file);
+ HeapFree(GetProcessHeap(), 0, win);
+}
+
+static char* WINHELP_GetCaption(WINHELP_WNDPAGE* wpage)
+{
+ if (wpage->wininfo->caption[0]) return wpage->wininfo->caption;
+ return wpage->page->file->lpszTitle;
+}
+
+static void WINHELP_RememberPage(WINHELP_WINDOW* win, WINHELP_WNDPAGE* wpage)
{
unsigned num;
@@ -828,313 +873,73 @@ static BOOL WINHELP_HandleTextMouse(WINHELP_WINDOW* win, UINT msg, LPARAM lParam
/***********************************************************************
*
- * WINHELP_MainWndProc
+ * WINHELP_CheckPopup
*/
-static LRESULT CALLBACK WINHELP_MainWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
+static BOOL WINHELP_CheckPopup(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, LRESULT* lret)
{
- WINHELP_WINDOW *win;
- WINHELP_BUTTON *button;
- RECT rect;
- INT curPos, min, max, dy, keyDelta;
- HWND hTextWnd;
- LRESULT ret;
+ HWND hPopup;
- if (WINHELP_CheckPopup(hWnd, msg, wParam, lParam, &ret)) return ret;
+ if (!Globals.active_popup) return FALSE;
switch (msg)
{
- case WM_NCCREATE:
- win = (WINHELP_WINDOW*) ((LPCREATESTRUCT) lParam)->lpCreateParams;
- SetWindowLongPtr(hWnd, 0, (ULONG_PTR) win);
- if (!win->page && Globals.isBook)
- PostMessage(hWnd, WM_COMMAND, MNID_FILE_OPEN, 0);
- win->hMainWnd = hWnd;
- break;
-
- case WM_WINDOWPOSCHANGED:
- WINHELP_LayoutMainWindow((WINHELP_WINDOW*) GetWindowLongPtr(hWnd, 0));
- break;
-
- case WM_COMMAND:
- win = (WINHELP_WINDOW*) GetWindowLongPtr(hWnd, 0);
- switch (wParam)
- {
- /* Menu FILE */
- case MNID_FILE_OPEN: MACRO_FileOpen(); break;
- case MNID_FILE_PRINT: MACRO_Print(); break;
- case MNID_FILE_SETUP: MACRO_PrinterSetup(); break;
- case MNID_FILE_EXIT: MACRO_Exit(); break;
-
- /* Menu EDIT */
- case MNID_EDIT_COPYDLG:
- SendMessage(GetDlgItem(hWnd, CTL_ID_TEXT), WM_COPY, 0, 0);
- break;
- case MNID_EDIT_ANNOTATE:MACRO_Annotate(); break;
-
- /* Menu Bookmark */
- case MNID_BKMK_DEFINE: MACRO_BookmarkDefine(); break;
-
- /* Menu Help */
- case MNID_HELP_HELPON: MACRO_HelpOn(); break;
- case MNID_HELP_HELPTOP: MACRO_HelpOnTop(); break;
- case MNID_HELP_ABOUT: MACRO_About(); break;
- case MNID_HELP_WINE: ShellAbout(hWnd, "WINE", "Help", 0); break;
-
- /* Context help */
- case MNID_CTXT_ANNOTATE:MACRO_Annotate(); break;
- case MNID_CTXT_COPY: MACRO_CopyDialog(); break;
- case MNID_CTXT_PRINT: MACRO_Print(); break;
- case MNID_OPTS_HISTORY: MACRO_History(); break;
- case MNID_OPTS_FONTS_SMALL:
- case MNID_CTXT_FONTS_SMALL:
- win = (WINHELP_WINDOW*) GetWindowLongPtr(hWnd, 0);
- if (win->font_scale != 0)
- {
- win->font_scale = 0;
- WINHELP_SetupText(GetDlgItem(hWnd, CTL_ID_TEXT), win, 0 /* FIXME */);
- }
- break;
- case MNID_OPTS_FONTS_NORMAL:
- case MNID_CTXT_FONTS_NORMAL:
- win = (WINHELP_WINDOW*) GetWindowLong(hWnd, 0);
- if (win->font_scale != 1)
- {
- win->font_scale = 1;
- WINHELP_SetupText(GetDlgItem(hWnd, CTL_ID_TEXT), win, 0 /* FIXME */);
- }
- break;
- case MNID_OPTS_FONTS_LARGE:
- case MNID_CTXT_FONTS_LARGE:
- win = (WINHELP_WINDOW*) GetWindowLong(hWnd, 0);
- if (win->font_scale != 2)
+ case WM_NOTIFY:
+ {
+ MSGFILTER* msgf = (MSGFILTER*)lParam;
+ if (msgf->nmhdr.code == EN_MSGFILTER)
{
- win->font_scale = 2;
- WINHELP_SetupText(GetDlgItem(hWnd, CTL_ID_TEXT), win, 0 /* FIXME */);
+ if (!WINHELP_CheckPopup(hWnd, msgf->msg, msgf->wParam, msgf->lParam, NULL))
+ return FALSE;
+ if (lret) *lret = 1;
+ return TRUE;
}
- break;
- case MNID_OPTS_HELP_DEFAULT:
- case MNID_OPTS_HELP_VISIBLE:
- case MNID_OPTS_HELP_NONVISIBLE:
- case MNID_OPTS_SYSTEM_COLORS:
- case MNID_CTXT_HELP_DEFAULT:
- case MNID_CTXT_HELP_VISIBLE:
- case MNID_CTXT_HELP_NONVISIBLE:
- case MNID_CTXT_SYSTEM_COLORS:
- /* FIXME: NIY */
-
- default:
- /* Buttons */
- for (button = win->first_button; button; button = button->next)
- if (wParam == button->wParam) break;
- if (button)
- MACRO_ExecuteMacro(button->lpszMacro);
- else if (!HIWORD(wParam))
- MessageBox(0, MAKEINTRESOURCE(STID_NOT_IMPLEMENTED),
- MAKEINTRESOURCE(STID_WHERROR), MB_OK);
- break;
- }
- break;
-/* EPP case WM_DESTROY: */
-/* EPP if (Globals.hPopupWnd) DestroyWindow(Globals.hPopupWnd); */
-/* EPP break; */
- case WM_COPYDATA:
- return WINHELP_HandleCommand((HWND)wParam, lParam);
-
- case WM_CHAR:
- if (wParam == 3)
- {
- SendMessage(GetDlgItem(hWnd, CTL_ID_TEXT), WM_COPY, 0, 0);
- return 0;
}
break;
+ case WM_ACTIVATE:
+ if (wParam != WA_INACTIVE || (HWND)lParam == Globals.active_win->hMainWnd ||
+ (HWND)lParam == Globals.active_popup->hMainWnd ||
+ GetWindow((HWND)lParam, GW_OWNER) == Globals.active_win->hMainWnd)
+ break;
+ case WM_LBUTTONUP:
+ case WM_LBUTTONDOWN:
+ if (WINHELP_HandleTextMouse(Globals.active_popup, msg, lParam) && msg == WM_LBUTTONDOWN)
+ return FALSE;
+ /* fall through */
+ case WM_MBUTTONDOWN:
+ case WM_RBUTTONDOWN:
+ case WM_NCLBUTTONDOWN:
+ case WM_NCMBUTTONDOWN:
+ case WM_NCRBUTTONDOWN:
+ hPopup = Globals.active_popup->hMainWnd;
+ Globals.active_popup = NULL;
+ DestroyWindow(hPopup);
+ return TRUE;
+ }
+ return FALSE;
+}
- case WM_KEYDOWN:
- keyDelta = 0;
+/***********************************************************************
+ *
+ * WINHELP_ButtonWndProc
+ */
+static LRESULT CALLBACK WINHELP_ButtonWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ if (WINHELP_CheckPopup(hWnd, msg, wParam, lParam, NULL)) return 0;
+ if (msg == WM_KEYDOWN)
+ {
switch (wParam)
{
case VK_UP:
case VK_DOWN:
- keyDelta = GetSystemMetrics(SM_CXVSCROLL);
- if (wParam == VK_UP)
- keyDelta = -keyDelta;
-
case VK_PRIOR:
case VK_NEXT:
- win = (WINHELP_WINDOW*) GetWindowLongPtr(hWnd, 0);
- hTextWnd = GetDlgItem(win->hMainWnd, CTL_ID_TEXT);
- curPos = GetScrollPos(hTextWnd, SB_VERT);
- GetScrollRange(hTextWnd, SB_VERT, &min, &max);
-
- if (keyDelta == 0)
- {
- GetClientRect(hTextWnd, &rect);
- keyDelta = (rect.bottom - rect.top) / 2;
- if (wParam == VK_PRIOR)
- keyDelta = -keyDelta;
- }
-
- curPos += keyDelta;
- if (curPos > max)
- curPos = max;
- else if (curPos < min)
- curPos = min;
-
- dy = GetScrollPos(hTextWnd, SB_VERT) - curPos;
- SetScrollPos(hTextWnd, SB_VERT, curPos, TRUE);
- ScrollWindow(hTextWnd, 0, dy, NULL, NULL);
- UpdateWindow(hTextWnd);
- return 0;
-
case VK_ESCAPE:
- MACRO_Exit();
- return 0;
- }
- break;
-
- case WM_NOTIFY:
- if (wParam == CTL_ID_TEXT)
- {
- RECT rc;
-
- switch (((NMHDR*)lParam)->code)
- {
- case EN_MSGFILTER:
- {
- const MSGFILTER* msgf = (const MSGFILTER*)lParam;
- switch (msgf->msg)
- {
- case WM_KEYUP:
- if (msgf->wParam == VK_ESCAPE) DestroyWindow(hWnd);
- break;
- case WM_RBUTTONDOWN:
- {
- HMENU hMenu;
- POINT pt;
-
- win = (WINHELP_WINDOW*) GetWindowLong(hWnd, 0);
- hMenu = LoadMenu(Globals.hInstance, (LPSTR)CONTEXT_MENU);
- switch (win->font_scale)
- {
- case 0:
- CheckMenuItem(hMenu, MNID_CTXT_FONTS_SMALL,
- MF_BYCOMMAND|MF_CHECKED);
- break;
- default:
- WINE_FIXME("Unsupported %d\n", win->font_scale);
- case 1:
- CheckMenuItem(hMenu, MNID_CTXT_FONTS_NORMAL,
- MF_BYCOMMAND|MF_CHECKED);
- break;
- case 2:
- CheckMenuItem(hMenu, MNID_CTXT_FONTS_LARGE,
- MF_BYCOMMAND|MF_CHECKED);
- break;
- }
- pt.x = (int)(short)LOWORD(msgf->lParam);
- pt.y = (int)(short)HIWORD(msgf->lParam);
- ClientToScreen(msgf->nmhdr.hwndFrom, &pt);
- TrackPopupMenu(GetSubMenu(hMenu, 0), TPM_LEFTALIGN|TPM_TOPALIGN,
- pt.x, pt.y, 0, hWnd, NULL);
- DestroyMenu(hMenu);
- }
- break;
- default:
- return WINHELP_HandleTextMouse((WINHELP_WINDOW*)GetWindowLongPtr(hWnd, 0),
- msgf->msg, msgf->lParam);
- }
- }
- break;
-
- case EN_REQUESTRESIZE:
- rc = ((REQRESIZE*)lParam)->rc;
- win = (WINHELP_WINDOW*) GetWindowLong(hWnd, 0);
- AdjustWindowRect(&rc, GetWindowLong(win->hMainWnd, GWL_STYLE),
- FALSE);
- SetWindowPos(win->hMainWnd, HWND_TOP, 0, 0,
- rc.right - rc.left, rc.bottom - rc.top,
- SWP_NOMOVE | SWP_NOZORDER);
- WINHELP_LayoutMainWindow(win);
- break;
- }
- }
- break;
-
- case WM_INITMENUPOPUP:
- win = (WINHELP_WINDOW*) GetWindowLong(hWnd, 0);
- CheckMenuItem((HMENU)wParam, MNID_OPTS_FONTS_SMALL,
- MF_BYCOMMAND | (win->font_scale == 0) ? MF_CHECKED : 0);
- CheckMenuItem((HMENU)wParam, MNID_OPTS_FONTS_NORMAL,
- MF_BYCOMMAND | (win->font_scale == 1) ? MF_CHECKED : 0);
- CheckMenuItem((HMENU)wParam, MNID_OPTS_FONTS_LARGE,
- MF_BYCOMMAND | (win->font_scale == 2) ? MF_CHECKED : 0);
- break;
-
- case WM_NCDESTROY:
- {
- BOOL bExit;
- win = (WINHELP_WINDOW*) GetWindowLongPtr(hWnd, 0);
- bExit = (Globals.wVersion >= 4 && !lstrcmpi(win->lpszName, "main"));
- WINHELP_DeleteWindow(win);
-
- if (bExit) MACRO_Exit();
- if (!Globals.win_list)
- PostQuitMessage(0);
+ return SendMessage(GetParent(hWnd), msg, wParam, lParam);
}
- break;
}
- return DefWindowProc(hWnd, msg, wParam, lParam);
-}
-
-static DWORD CALLBACK WINHELP_RtfStreamIn(DWORD_PTR cookie, BYTE* buff,
- LONG cb, LONG* pcb)
-{
- struct RtfData* rd = (struct RtfData*)cookie;
-
- if (rd->where >= rd->ptr) return 1;
- if (rd->where + cb > rd->ptr)
- cb = rd->ptr - rd->where;
- memcpy(buff, rd->where, cb);
- rd->where += cb;
- *pcb = cb;
- return 0;
-}
-
-static void WINHELP_SetupText(HWND hTextWnd, WINHELP_WINDOW* win, ULONG relative)
-{
- /* At first clear area - needed by EM_POSFROMCHAR/EM_SETSCROLLPOS */
- SendMessage(hTextWnd, WM_SETTEXT, 0, (LPARAM)"");
- SendMessage(hTextWnd, WM_SETREDRAW, FALSE, 0);
- SendMessage(hTextWnd, EM_SETBKGNDCOLOR, 0, (LPARAM)win->info->sr_color);
- /* set word-wrap to window size (undocumented) */
- SendMessage(hTextWnd, EM_SETTARGETDEVICE, 0, 0);
- if (win->page)
- {
- struct RtfData rd;
- EDITSTREAM es;
- unsigned cp = 0;
- POINTL ptl;
- POINT pt;
-
- if (HLPFILE_BrowsePage(win->page, &rd, win->font_scale, relative))
- {
- rd.where = rd.data;
- es.dwCookie = (DWORD_PTR)&rd;
- es.dwError = 0;
- es.pfnCallback = WINHELP_RtfStreamIn;
-
- SendMessageW(hTextWnd, EM_STREAMIN, SF_RTF, (LPARAM)&es);
- cp = rd.char_pos_rel;
- }
- /* FIXME: else leaking potentially the rd.first_link chain */
- HeapFree(GetProcessHeap(), 0, rd.data);
- SendMessage(hTextWnd, EM_POSFROMCHAR, (WPARAM)&ptl, cp ? cp - 1 : 0);
- pt.x = 0; pt.y = ptl.y;
- SendMessage(hTextWnd, EM_SETSCROLLPOS, 0, (LPARAM)&pt);
- }
- SendMessage(hTextWnd, WM_SETREDRAW, TRUE, 0);
- InvalidateRect(hTextWnd, NULL, TRUE);
+ return CallWindowProc(Globals.button_proc, hWnd, msg, wParam, lParam);
}
/***********************************************************************
@@ -1231,30 +1036,6 @@ static LRESULT CALLBACK WINHELP_ButtonBoxWndProc(HWND hWnd, UINT msg, WPARAM wPa
return DefWindowProc(hWnd, msg, wParam, lParam);
}
-/***********************************************************************
- *
- * WINHELP_ButtonWndProc
- */
-static LRESULT CALLBACK WINHELP_ButtonWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
-{
- if (WINHELP_CheckPopup(hWnd, msg, wParam, lParam, NULL)) return 0;
-
- if (msg == WM_KEYDOWN)
- {
- switch (wParam)
- {
- case VK_UP:
- case VK_DOWN:
- case VK_PRIOR:
- case VK_NEXT:
- case VK_ESCAPE:
- return SendMessage(GetParent(hWnd), msg, wParam, lParam);
- }
- }
-
- return CallWindowProc(Globals.button_proc, hWnd, msg, wParam, lParam);
-}
-
/******************************************************************
* WINHELP_HistoryWndProc
*
@@ -1354,195 +1135,6 @@ static LRESULT CALLBACK WINHELP_ShadowWndProc(HWND hWnd, UINT msg, WPARAM wParam
return WINHELP_CheckPopup(hWnd, msg, wParam, lParam, NULL) ? 0L : DefWindowProc(hWnd, msg, wParam, lParam);
}
-/***********************************************************************
- *
- * WINHELP_CheckPopup
- */
-static BOOL WINHELP_CheckPopup(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, LRESULT* lret)
-{
- HWND hPopup;
-
- if (!Globals.active_popup) return FALSE;
-
- switch (msg)
- {
- case WM_NOTIFY:
- {
- MSGFILTER* msgf = (MSGFILTER*)lParam;
- if (msgf->nmhdr.code == EN_MSGFILTER)
- {
- if (!WINHELP_CheckPopup(hWnd, msgf->msg, msgf->wParam, msgf->lParam, NULL))
- return FALSE;
- if (lret) *lret = 1;
- return TRUE;
- }
- }
- break;
- case WM_ACTIVATE:
- if (wParam != WA_INACTIVE || (HWND)lParam == Globals.active_win->hMainWnd ||
- (HWND)lParam == Globals.active_popup->hMainWnd ||
- GetWindow((HWND)lParam, GW_OWNER) == Globals.active_win->hMainWnd)
- break;
- case WM_LBUTTONUP:
- case WM_LBUTTONDOWN:
- if (WINHELP_HandleTextMouse(Globals.active_popup, msg, lParam) && msg == WM_LBUTTONDOWN)
- return FALSE;
- /* fall through */
- case WM_MBUTTONDOWN:
- case WM_RBUTTONDOWN:
- case WM_NCLBUTTONDOWN:
- case WM_NCMBUTTONDOWN:
- case WM_NCRBUTTONDOWN:
- hPopup = Globals.active_popup->hMainWnd;
- Globals.active_popup = NULL;
- DestroyWindow(hPopup);
- return TRUE;
- }
- return FALSE;
-}
-
-/******************************************************************
- * WINHELP_DeleteButtons
- *
- */
-static void WINHELP_DeleteButtons(WINHELP_WINDOW* win)
-{
- WINHELP_BUTTON* b;
- WINHELP_BUTTON* bp;
-
- for (b = win->first_button; b; b = bp)
- {
- DestroyWindow(b->hWnd);
- bp = b->next;
- HeapFree(GetProcessHeap(), 0, b);
- }
- win->first_button = NULL;
-}
-
-/******************************************************************
- * WINHELP_DeleteBackSet
- *
- */
-void WINHELP_DeleteBackSet(WINHELP_WINDOW* win)
-{
- unsigned int i;
-
- for (i = 0; i < win->back.index; i++)
- {
- HLPFILE_FreeHlpFile(win->back.set[i].page->file);
- win->back.set[i].page = NULL;
- }
- win->back.index = 0;
-}
-
-/******************************************************************
- * WINHELP_DeletePageLinks
- *
- */
-static void WINHELP_DeletePageLinks(HLPFILE_PAGE* page)
-{
- HLPFILE_LINK* curr;
- HLPFILE_LINK* next;
-
- for (curr = page->first_link; curr; curr = next)
- {
- next = curr->next;
- HeapFree(GetProcessHeap(), 0, curr);
- }
-}
-
-/***********************************************************************
- *
- * WINHELP_DeleteWindow
- */
-static void WINHELP_DeleteWindow(WINHELP_WINDOW* win)
-{
- WINHELP_WINDOW** w;
-
- for (w = &Globals.win_list; *w; w = &(*w)->next)
- {
- if (*w == win)
- {
- *w = win->next;
- break;
- }
- }
-
- if (Globals.active_win == win)
- {
- Globals.active_win = Globals.win_list;
- if (Globals.win_list)
- SetActiveWindow(Globals.win_list->hMainWnd);
- }
-
- if (win == Globals.active_popup)
- Globals.active_popup = NULL;
-
- WINHELP_DeleteButtons(win);
-
- if (win->page) WINHELP_DeletePageLinks(win->page);
- if (win->hShadowWnd) DestroyWindow(win->hShadowWnd);
- if (win->hHistoryWnd) DestroyWindow(win->hHistoryWnd);
-
- DeleteObject(win->hBrush);
-
- WINHELP_DeleteBackSet(win);
-
- if (win->page) HLPFILE_FreeHlpFile(win->page->file);
- HeapFree(GetProcessHeap(), 0, win);
-}
-
-/***********************************************************************
- *
- * WINHELP_InitFonts
- */
-static void WINHELP_InitFonts(HWND hWnd)
-{
- WINHELP_WINDOW *win = (WINHELP_WINDOW*) GetWindowLongPtr(hWnd, 0);
- LOGFONT logfontlist[] = {
- {-10, 0, 0, 0, 400, 0, 0, 0, DEFAULT_CHARSET, 0, 0, 0, 32, "Helv"},
- {-12, 0, 0, 0, 700, 0, 0, 0, DEFAULT_CHARSET, 0, 0, 0, 32, "Helv"},
- {-12, 0, 0, 0, 700, 0, 0, 0, DEFAULT_CHARSET, 0, 0, 0, 32, "Helv"},
- {-12, 0, 0, 0, 400, 0, 0, 0, DEFAULT_CHARSET, 0, 0, 0, 32, "Helv"},
- {-12, 0, 0, 0, 700, 0, 0, 0, DEFAULT_CHARSET, 0, 0, 0, 32, "Helv"},
- {-10, 0, 0, 0, 700, 0, 0, 0, DEFAULT_CHARSET, 0, 0, 0, 32, "Helv"},
- { -8, 0, 0, 0, 400, 0, 0, 0, DEFAULT_CHARSET, 0, 0, 0, 32, "Helv"}};
-#define FONTS_LEN (sizeof(logfontlist)/sizeof(*logfontlist))
-
- static HFONT fonts[FONTS_LEN];
- static BOOL init = 0;
-
- win->fonts_len = FONTS_LEN;
- win->fonts = fonts;
-
- if (!init)
- {
- UINT i;
-
- for (i = 0; i < FONTS_LEN; i++)
- {
- fonts[i] = CreateFontIndirect(&logfontlist[i]);
- }
-
- init = 1;
- }
-}
-
-/***********************************************************************
- *
- * WINHELP_MessageBoxIDS_s
- */
-INT WINHELP_MessageBoxIDS_s(UINT ids_text, LPCSTR str, UINT ids_title, WORD type)
-{
- CHAR text[MAX_STRING_LEN];
- CHAR newtext[MAX_STRING_LEN + MAX_PATH];
-
- LoadString(Globals.hInstance, ids_text, text, sizeof(text));
- wsprintf(newtext, text, str);
-
- return MessageBox(0, newtext, MAKEINTRESOURCE(ids_title), type);
-}
-
/**************************************************************************
* cb_KWBTree
*
@@ -1665,6 +1257,266 @@ INT_PTR CALLBACK WINHELP_SearchDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARA
return FALSE;
}
+/***********************************************************************
+ *
+ * WINHELP_MainWndProc
+ */
+static LRESULT CALLBACK WINHELP_MainWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ WINHELP_WINDOW *win;
+ WINHELP_BUTTON *button;
+ RECT rect;
+ INT curPos, min, max, dy, keyDelta;
+ HWND hTextWnd;
+ LRESULT ret;
+
+ if (WINHELP_CheckPopup(hWnd, msg, wParam, lParam, &ret)) return ret;
+
+ switch (msg)
+ {
+ case WM_NCCREATE:
+ win = (WINHELP_WINDOW*) ((LPCREATESTRUCT) lParam)->lpCreateParams;
+ SetWindowLongPtr(hWnd, 0, (ULONG_PTR) win);
+ if (!win->page && Globals.isBook)
+ PostMessage(hWnd, WM_COMMAND, MNID_FILE_OPEN, 0);
+ win->hMainWnd = hWnd;
+ break;
+
+ case WM_WINDOWPOSCHANGED:
+ WINHELP_LayoutMainWindow((WINHELP_WINDOW*) GetWindowLongPtr(hWnd, 0));
+ break;
+
+ case WM_COMMAND:
+ win = (WINHELP_WINDOW*) GetWindowLongPtr(hWnd, 0);
+ switch (wParam)
+ {
+ /* Menu FILE */
+ case MNID_FILE_OPEN: MACRO_FileOpen(); break;
+ case MNID_FILE_PRINT: MACRO_Print(); break;
+ case MNID_FILE_SETUP: MACRO_PrinterSetup(); break;
+ case MNID_FILE_EXIT: MACRO_Exit(); break;
+
+ /* Menu EDIT */
+ case MNID_EDIT_COPYDLG:
+ SendMessage(GetDlgItem(hWnd, CTL_ID_TEXT), WM_COPY, 0, 0);
+ break;
+ case MNID_EDIT_ANNOTATE:MACRO_Annotate(); break;
+
+ /* Menu Bookmark */
+ case MNID_BKMK_DEFINE: MACRO_BookmarkDefine(); break;
+
+ /* Menu Help */
+ case MNID_HELP_HELPON: MACRO_HelpOn(); break;
+ case MNID_HELP_HELPTOP: MACRO_HelpOnTop(); break;
+ case MNID_HELP_ABOUT: MACRO_About(); break;
+ case MNID_HELP_WINE: ShellAbout(hWnd, "WINE", "Help", 0); break;
+
+ /* Context help */
+ case MNID_CTXT_ANNOTATE:MACRO_Annotate(); break;
+ case MNID_CTXT_COPY: MACRO_CopyDialog(); break;
+ case MNID_CTXT_PRINT: MACRO_Print(); break;
+ case MNID_OPTS_HISTORY: MACRO_History(); break;
+ case MNID_OPTS_FONTS_SMALL:
+ case MNID_CTXT_FONTS_SMALL:
+ win = (WINHELP_WINDOW*) GetWindowLongPtr(hWnd, 0);
+ if (win->font_scale != 0)
+ {
+ win->font_scale = 0;
+ WINHELP_SetupText(GetDlgItem(hWnd, CTL_ID_TEXT), win, 0 /* FIXME */);
+ }
+ break;
+ case MNID_OPTS_FONTS_NORMAL:
+ case MNID_CTXT_FONTS_NORMAL:
+ win = (WINHELP_WINDOW*) GetWindowLong(hWnd, 0);
+ if (win->font_scale != 1)
+ {
+ win->font_scale = 1;
+ WINHELP_SetupText(GetDlgItem(hWnd, CTL_ID_TEXT), win, 0 /* FIXME */);
+ }
+ break;
+ case MNID_OPTS_FONTS_LARGE:
+ case MNID_CTXT_FONTS_LARGE:
+ win = (WINHELP_WINDOW*) GetWindowLong(hWnd, 0);
+ if (win->font_scale != 2)
+ {
+ win->font_scale = 2;
+ WINHELP_SetupText(GetDlgItem(hWnd, CTL_ID_TEXT), win, 0 /* FIXME */);
+ }
+ break;
+ case MNID_OPTS_HELP_DEFAULT:
+ case MNID_OPTS_HELP_VISIBLE:
+ case MNID_OPTS_HELP_NONVISIBLE:
+ case MNID_OPTS_SYSTEM_COLORS:
+ case MNID_CTXT_HELP_DEFAULT:
+ case MNID_CTXT_HELP_VISIBLE:
+ case MNID_CTXT_HELP_NONVISIBLE:
+ case MNID_CTXT_SYSTEM_COLORS:
+ /* FIXME: NIY */
+
+ default:
+ /* Buttons */
+ for (button = win->first_button; button; button = button->next)
+ if (wParam == button->wParam) break;
+ if (button)
+ MACRO_ExecuteMacro(button->lpszMacro);
+ else if (!HIWORD(wParam))
+ MessageBox(0, MAKEINTRESOURCE(STID_NOT_IMPLEMENTED),
+ MAKEINTRESOURCE(STID_WHERROR), MB_OK);
+ break;
+ }
+ break;
+/* EPP case WM_DESTROY: */
+/* EPP if (Globals.hPopupWnd) DestroyWindow(Globals.hPopupWnd); */
+/* EPP break; */
+ case WM_COPYDATA:
+ return WINHELP_HandleCommand((HWND)wParam, lParam);
+
+ case WM_CHAR:
+ if (wParam == 3)
+ {
+ SendMessage(GetDlgItem(hWnd, CTL_ID_TEXT), WM_COPY, 0, 0);
+ return 0;
+ }
+ break;
+
+ case WM_KEYDOWN:
+ keyDelta = 0;
+
+ switch (wParam)
+ {
+ case VK_UP:
+ case VK_DOWN:
+ keyDelta = GetSystemMetrics(SM_CXVSCROLL);
+ if (wParam == VK_UP)
+ keyDelta = -keyDelta;
+
+ case VK_PRIOR:
+ case VK_NEXT:
+ win = (WINHELP_WINDOW*) GetWindowLongPtr(hWnd, 0);
+ hTextWnd = GetDlgItem(win->hMainWnd, CTL_ID_TEXT);
+ curPos = GetScrollPos(hTextWnd, SB_VERT);
+ GetScrollRange(hTextWnd, SB_VERT, &min, &max);
+
+ if (keyDelta == 0)
+ {
+ GetClientRect(hTextWnd, &rect);
+ keyDelta = (rect.bottom - rect.top) / 2;
+ if (wParam == VK_PRIOR)
+ keyDelta = -keyDelta;
+ }
+
+ curPos += keyDelta;
+ if (curPos > max)
+ curPos = max;
+ else if (curPos < min)
+ curPos = min;
+
+ dy = GetScrollPos(hTextWnd, SB_VERT) - curPos;
+ SetScrollPos(hTextWnd, SB_VERT, curPos, TRUE);
+ ScrollWindow(hTextWnd, 0, dy, NULL, NULL);
+ UpdateWindow(hTextWnd);
+ return 0;
+
+ case VK_ESCAPE:
+ MACRO_Exit();
+ return 0;
+ }
+ break;
+
+ case WM_NOTIFY:
+ if (wParam == CTL_ID_TEXT)
+ {
+ RECT rc;
+
+ switch (((NMHDR*)lParam)->code)
+ {
+ case EN_MSGFILTER:
+ {
+ const MSGFILTER* msgf = (const MSGFILTER*)lParam;
+ switch (msgf->msg)
+ {
+ case WM_KEYUP:
+ if (msgf->wParam == VK_ESCAPE) DestroyWindow(hWnd);
+ break;
+ case WM_RBUTTONDOWN:
+ {
+ HMENU hMenu;
+ POINT pt;
+
+ win = (WINHELP_WINDOW*) GetWindowLong(hWnd, 0);
+ hMenu = LoadMenu(Globals.hInstance, (LPSTR)CONTEXT_MENU);
+ switch (win->font_scale)
+ {
+ case 0:
+ CheckMenuItem(hMenu, MNID_CTXT_FONTS_SMALL,
+ MF_BYCOMMAND|MF_CHECKED);
+ break;
+ default:
+ WINE_FIXME("Unsupported %d\n", win->font_scale);
+ case 1:
+ CheckMenuItem(hMenu, MNID_CTXT_FONTS_NORMAL,
+ MF_BYCOMMAND|MF_CHECKED);
+ break;
+ case 2:
+ CheckMenuItem(hMenu, MNID_CTXT_FONTS_LARGE,
+ MF_BYCOMMAND|MF_CHECKED);
+ break;
+ }
+ pt.x = (int)(short)LOWORD(msgf->lParam);
+ pt.y = (int)(short)HIWORD(msgf->lParam);
+ ClientToScreen(msgf->nmhdr.hwndFrom, &pt);
+ TrackPopupMenu(GetSubMenu(hMenu, 0), TPM_LEFTALIGN|TPM_TOPALIGN,
+ pt.x, pt.y, 0, hWnd, NULL);
+ DestroyMenu(hMenu);
+ }
+ break;
+ default:
+ return WINHELP_HandleTextMouse((WINHELP_WINDOW*)GetWindowLongPtr(hWnd, 0),
+ msgf->msg, msgf->lParam);
+ }
+ }
+ break;
+
+ case EN_REQUESTRESIZE:
+ rc = ((REQRESIZE*)lParam)->rc;
+ win = (WINHELP_WINDOW*) GetWindowLong(hWnd, 0);
+ AdjustWindowRect(&rc, GetWindowLong(win->hMainWnd, GWL_STYLE),
+ FALSE);
+ SetWindowPos(win->hMainWnd, HWND_TOP, 0, 0,
+ rc.right - rc.left, rc.bottom - rc.top,
+ SWP_NOMOVE | SWP_NOZORDER);
+ WINHELP_LayoutMainWindow(win);
+ break;
+ }
+ }
+ break;
+
+ case WM_INITMENUPOPUP:
+ win = (WINHELP_WINDOW*) GetWindowLong(hWnd, 0);
+ CheckMenuItem((HMENU)wParam, MNID_OPTS_FONTS_SMALL,
+ MF_BYCOMMAND | (win->font_scale == 0) ? MF_CHECKED : 0);
+ CheckMenuItem((HMENU)wParam, MNID_OPTS_FONTS_NORMAL,
+ MF_BYCOMMAND | (win->font_scale == 1) ? MF_CHECKED : 0);
+ CheckMenuItem((HMENU)wParam, MNID_OPTS_FONTS_LARGE,
+ MF_BYCOMMAND | (win->font_scale == 2) ? MF_CHECKED : 0);
+ break;
+
+ case WM_NCDESTROY:
+ {
+ BOOL bExit;
+ win = (WINHELP_WINDOW*) GetWindowLongPtr(hWnd, 0);
+ bExit = (Globals.wVersion >= 4 && !lstrcmpi(win->lpszName, "main"));
+ WINHELP_DeleteWindow(win);
+
+ if (bExit) MACRO_Exit();
+ if (!Globals.win_list)
+ PostQuitMessage(0);
+ }
+ break;
+ }
+ return DefWindowProc(hWnd, msg, wParam, lParam);
+}
+
/**************************************************************************
* WINHELP_CreateIndexWindow
*
@@ -1730,3 +1582,139 @@ BOOL WINHELP_CreateIndexWindow(BOOL is_search)
}
return TRUE;
}
+
+/***********************************************************************
+ *
+ * RegisterWinClasses
+ */
+static BOOL WINHELP_RegisterWinClasses(void)
+{
+ WNDCLASS class_main, class_button_box, class_shadow, class_history;
+
+ class_main.style = CS_HREDRAW | CS_VREDRAW;
+ class_main.lpfnWndProc = WINHELP_MainWndProc;
+ class_main.cbClsExtra = 0;
+ class_main.cbWndExtra = sizeof(LONG);
+ class_main.hInstance = Globals.hInstance;
+ class_main.hIcon = LoadIcon(Globals.hInstance, MAKEINTRESOURCE(IDI_WINHELP));
+ class_main.hCursor = LoadCursor(0, IDC_ARROW);
+ class_main.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
+ class_main.lpszMenuName = 0;
+ class_main.lpszClassName = MAIN_WIN_CLASS_NAME;
+
+ class_button_box = class_main;
+ class_button_box.lpfnWndProc = WINHELP_ButtonBoxWndProc;
+ class_button_box.cbWndExtra = 0;
+ class_button_box.hbrBackground = (HBRUSH)(COLOR_BTNFACE+1);
+ class_button_box.lpszClassName = BUTTON_BOX_WIN_CLASS_NAME;
+
+ class_shadow = class_main;
+ class_shadow.lpfnWndProc = WINHELP_ShadowWndProc;
+ class_shadow.cbWndExtra = 0;
+ class_shadow.hbrBackground = (HBRUSH)(COLOR_3DDKSHADOW+1);
+ class_shadow.lpszClassName = SHADOW_WIN_CLASS_NAME;
+
+ class_history = class_main;
+ class_history.lpfnWndProc = WINHELP_HistoryWndProc;
+ class_history.lpszClassName = HISTORY_WIN_CLASS_NAME;
+
+ return (RegisterClass(&class_main) &&
+ RegisterClass(&class_button_box) &&
+ RegisterClass(&class_shadow) &&
+ RegisterClass(&class_history));
+}
+
+/***********************************************************************
+ *
+ * WinMain
+ */
+int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE prev, LPSTR cmdline, int show)
+{
+ MSG msg;
+ LONG lHash = 0;
+ HLPFILE* hlpfile;
+ static CHAR default_wndname[] = "main";
+ LPSTR wndname = default_wndname;
+ WINHELP_DLL* dll;
+
+ Globals.hInstance = hInstance;
+
+ if (LoadLibrary("riched20.dll") == NULL)
+ return MessageBox(0, MAKEINTRESOURCE(STID_NO_RICHEDIT),
+ MAKEINTRESOURCE(STID_WHERROR), MB_OK);
+
+ /* Get options */
+ while (*cmdline && (*cmdline == ' ' || *cmdline == '-'))
+ {
+ CHAR option;
+ LPCSTR topic_id;
+ if (*cmdline++ == ' ') continue;
+
+ option = *cmdline;
+ if (option) cmdline++;
+ while (*cmdline && *cmdline == ' ') cmdline++;
+ switch (option)
+ {
+ case 'i':
+ case 'I':
+ topic_id = cmdline;
+ while (*cmdline && *cmdline != ' ') cmdline++;
+ if (*cmdline) *cmdline++ = '\0';
+ lHash = HLPFILE_Hash(topic_id);
+ break;
+
+ case '3':
+ case '4':
+ Globals.wVersion = option - '0';
+ break;
+
+ case 'x':
+ show = SW_HIDE;
+ Globals.isBook = FALSE;
+ break;
+
+ default:
+ WINE_FIXME("Unsupported cmd line: %s\n", cmdline);
+ break;
+ }
+ }
+
+ /* Create primary window */
+ if (!WINHELP_RegisterWinClasses())
+ {
+ WINE_FIXME("Couldn't register classes\n");
+ return 0;
+ }
+
+ if (*cmdline)
+ {
+ char* ptr;
+ if ((*cmdline == '"') && (ptr = strchr(cmdline+1, '"')))
+ {
+ cmdline++;
+ *ptr = '\0';
+ }
+ if ((ptr = strchr(cmdline, '>')))
+ {
+ *ptr = '\0';
+ wndname = ptr + 1;
+ }
+ hlpfile = WINHELP_LookupHelpFile(cmdline);
+ if (!hlpfile) return 0;
+ }
+ else hlpfile = NULL;
+ WINHELP_OpenHelpWindow(HLPFILE_PageByHash, hlpfile, lHash,
+ WINHELP_GetWindowInfo(hlpfile, wndname), show);
+
+ /* Message loop */
+ while (GetMessage(&msg, 0, 0, 0))
+ {
+ TranslateMessage(&msg);
+ DispatchMessage(&msg);
+ }
+ for (dll = Globals.dlls; dll; dll = dll->next)
+ {
+ if (dll->class & DC_INITTERM) dll->handler(DW_TERM, 0, 0);
+ }
+ return 0;
+}
--
1.5.6.5
More information about the wine-patches
mailing list