[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