[PATCH 06/11] [WinHelp]: always create a main window, even for popups

Eric Pouech eric.pouech at orange.fr
Fri Apr 18 14:34:17 CDT 2008




A+
---

 programs/winhelp/winhelp.c |   83 ++++++++++++++++++++++----------------------
 1 files changed, 41 insertions(+), 42 deletions(-)


diff --git a/programs/winhelp/winhelp.c b/programs/winhelp/winhelp.c
index 75559b2..3bf5492 100644
--- a/programs/winhelp/winhelp.c
+++ b/programs/winhelp/winhelp.c
@@ -3,7 +3,7 @@
  *
  * Copyright    1996 Ulrich Schmid <uschmid at mail.hh.provi.de>
  *              2002 Sylvain Petreolle <spetreolle at yahoo.fr>
- *              2002 Eric Pouech <eric.pouech at wanadoo.fr>
+ *              2002-2008 Eric Pouech <eric.pouech at wanadoo.fr>
  *              2004 Ken Belleau <jamez at ivic.qc.ca>
  *
  * This library is free software; you can redistribute it and/or
@@ -57,6 +57,8 @@ static WINHELP_LINE_PART* WINHELP_IsOverLink(WINHELP_WINDOW*, WPARAM, LPARAM);
 
 WINHELP_GLOBALS Globals = {3, NULL, NULL, TRUE, NULL, NULL, NULL, NULL};
 
+#define CTL_ID_BUTTON   0x700
+#define CTL_ID_TEXT     0x701
 
 /***********************************************************************
  *
@@ -452,7 +454,7 @@ static LRESULT  WINHELP_HandleCommand(HWND hSrcWnd, LPARAM lParam)
 void            WINHELP_LayoutMainWindow(WINHELP_WINDOW* win)
 {
     RECT        rect, button_box_rect;
-    INT         text_top;
+    INT         text_top = 0;
 
     GetClientRect(win->hMainWnd, &rect);
 
@@ -462,8 +464,8 @@ void            WINHELP_LayoutMainWindow(WINHELP_WINDOW* win)
                  rect.right - rect.left,
                  rect.bottom - rect.top, 0);
 
-    GetWindowRect(win->hButtonBoxWnd, &button_box_rect);
-    text_top = rect.top + button_box_rect.bottom - button_box_rect.top;
+    if (GetWindowRect(win->hButtonBoxWnd, &button_box_rect))
+        text_top = rect.top + button_box_rect.bottom - button_box_rect.top;
 
     SetWindowPos(win->hTextWnd, HWND_TOP,
                  rect.left, text_top,
@@ -578,7 +580,7 @@ BOOL WINHELP_CreateHelpWindow(HLPFILE_PAGE* page, HLPFILE_WINDOWINFO* wi,
     DWORD ex_style;
 
     bPrimary = !lstrcmpi(wi->name, "main");
-    bPopup = wi->win_style & WS_POPUP;
+    bPopup = !bPrimary && (wi->win_style & WS_POPUP);
 
     /* Initialize WINHELP_WINDOW struct */
     win = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
@@ -650,12 +652,22 @@ BOOL WINHELP_CreateHelpWindow(HLPFILE_PAGE* page, HLPFILE_WINDOWINFO* wi,
 
     ex_style = 0;
     if (bPopup) ex_style = WS_EX_TOOLWINDOW;
-    hWnd = CreateWindowEx(ex_style, bPopup ? TEXT_WIN_CLASS_NAME : MAIN_WIN_CLASS_NAME,
-                        wi->caption, 
-                        bPrimary ? WS_OVERLAPPEDWINDOW : wi->win_style,
-                        wi->origin.x, wi->origin.y, wi->size.cx, wi->size.cy,
-                        NULL, bPrimary ? LoadMenu(Globals.hInstance, MAKEINTRESOURCE(MAIN_MENU)) : 0,
-                        Globals.hInstance, win);
+    hWnd = CreateWindowEx(ex_style, MAIN_WIN_CLASS_NAME,
+                          wi->caption,
+                          bPrimary ? WS_OVERLAPPEDWINDOW : wi->win_style,
+                          wi->origin.x, wi->origin.y, wi->size.cx, wi->size.cy,
+                          NULL, bPrimary ? LoadMenu(Globals.hInstance, MAKEINTRESOURCE(MAIN_MENU)) : 0,
+                          Globals.hInstance, win);
+    /* Create button box and text Window */
+    if (!bPopup)
+        CreateWindow(BUTTON_BOX_WIN_CLASS_NAME, "", WS_CHILD | WS_VISIBLE,
+                     0, 0, 0, 0, hWnd, (HMENU)CTL_ID_BUTTON, Globals.hInstance, win);
+
+    CreateWindow(TEXT_WIN_CLASS_NAME, "", WS_CHILD | WS_VISIBLE,
+                 0, 0, 0, 0, hWnd, (HMENU)CTL_ID_TEXT, Globals.hInstance, win);
+
+    WINHELP_LayoutMainWindow(win);
+    if (bPopup) Globals.hPopupWnd = hWnd;
 
     ShowWindow(hWnd, nCmdShow);
     UpdateWindow(hWnd);
@@ -728,23 +740,12 @@ static LRESULT CALLBACK WINHELP_MainWndProc(HWND hWnd, UINT msg, WPARAM wParam,
         win->hMainWnd = hWnd;
         break;
 
-    case WM_CREATE:
-        win = (WINHELP_WINDOW*) GetWindowLongPtr(hWnd, 0);
-
-        /* Create button box and text Window */
-        CreateWindow(BUTTON_BOX_WIN_CLASS_NAME, "", WS_CHILD | WS_VISIBLE,
-                     0, 0, 0, 0, hWnd, 0, Globals.hInstance, win);
-
-        CreateWindow(TEXT_WIN_CLASS_NAME, "", WS_CHILD | WS_VISIBLE,
-                     0, 0, 0, 0, hWnd, 0, Globals.hInstance, win);
-
-        /* Fall through */
     case WM_WINDOWPOSCHANGED:
         WINHELP_LayoutMainWindow((WINHELP_WINDOW*) GetWindowLongPtr(hWnd, 0));
         break;
 
     case WM_COMMAND:
-        Globals.active_win = win = (WINHELP_WINDOW*) GetWindowLongPtr(hWnd, 0);
+        win = (WINHELP_WINDOW*) GetWindowLongPtr(hWnd, 0);
         switch (wParam)
 	{
             /* Menu FILE */
@@ -772,7 +773,7 @@ static LRESULT CALLBACK WINHELP_MainWndProc(HWND hWnd, UINT msg, WPARAM wParam,
                 if (wParam == button->wParam) break;
             if (button)
                 MACRO_ExecuteMacro(button->lpszMacro);
-            else
+            else if (!HIWORD(wParam))
                 WINHELP_MessageBoxIDS(STID_NOT_IMPLEMENTED, 0x121, MB_OK);
             break;
 	}
@@ -825,6 +826,19 @@ static LRESULT CALLBACK WINHELP_MainWndProc(HWND hWnd, UINT msg, WPARAM wParam,
             return 0;
         }
         break;
+    case WM_NCDESTROY:
+        {
+            BOOL bExit;
+            win = (WINHELP_WINDOW*) GetWindowLongPtr(hWnd, 0);
+            if (hWnd == Globals.hPopupWnd) Globals.hPopupWnd = 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);
 }
@@ -955,7 +969,6 @@ static LRESULT CALLBACK WINHELP_TextWndProc(HWND hWnd, UINT msg, WPARAM wParam,
     POINT mouse;
     INT   scroll_pos;
     HWND  hPopupWnd;
-    BOOL  bExit;
 
     if (msg != WM_LBUTTONDOWN)
         WINHELP_CheckPopup(msg);
@@ -967,7 +980,6 @@ static LRESULT CALLBACK WINHELP_TextWndProc(HWND hWnd, UINT msg, WPARAM wParam,
         SetWindowLongPtr(hWnd, 0, (ULONG_PTR) win);
         win->hTextWnd = hWnd;
         win->hBrush = CreateSolidBrush(win->info->sr_color);
-        if (win->info->win_style & WS_POPUP) Globals.hPopupWnd = win->hMainWnd = hWnd;
         WINHELP_InitFonts(hWnd);
         break;
 
@@ -985,12 +997,13 @@ static LRESULT CALLBACK WINHELP_TextWndProc(HWND hWnd, UINT msg, WPARAM wParam,
             SIZE new_client_size;
             SIZE new_window_size;
 
-            GetWindowRect(hWnd, &old_window_rect);
+            GetWindowRect(GetParent(hWnd), &old_window_rect);
             origin.x = old_window_rect.left;
             origin.y = old_window_rect.top;
             old_window_size.cx = old_window_rect.right  - old_window_rect.left;
             old_window_size.cy = old_window_rect.bottom - old_window_rect.top;
 
+            WINHELP_LayoutMainWindow(win);
             GetClientRect(hWnd, &old_client_rect);
             old_client_size.cx = old_client_rect.right  - old_client_rect.left;
             old_client_size.cy = old_client_rect.bottom - old_client_rect.top;
@@ -1012,7 +1025,7 @@ static LRESULT CALLBACK WINHELP_TextWndProc(HWND hWnd, UINT msg, WPARAM wParam,
                              new_window_size.cx, new_window_size.cy,
                              0, 0, Globals.hInstance, 0);
 
-            SetWindowPos(hWnd, HWND_TOP, origin.x, origin.y,
+            SetWindowPos(GetParent(hWnd), HWND_TOP, origin.x, origin.y,
                          new_window_size.cx, new_window_size.cy,
                          0);
             SetWindowPos(win->hShadowWnd, hWnd, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE);
@@ -1253,20 +1266,6 @@ static LRESULT CALLBACK WINHELP_TextWndProc(HWND hWnd, UINT msg, WPARAM wParam,
             DestroyWindow(hPopupWnd);
         break;
 
-    case WM_NCDESTROY:
-        win = (WINHELP_WINDOW*) GetWindowLongPtr(hWnd, 0);
-
-        if (hWnd == Globals.hPopupWnd) Globals.hPopupWnd = 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);





More information about the wine-patches mailing list