[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