From b9862369040384c42959a41206d9344830f306d8 Mon Sep 17 00:00:00 2001 From: Eric Pouech Date: Fri, 18 Apr 2008 21:34:17 +0200 Subject: [PATCH] winhelp: Always create a main window, even for popups. --- programs/winhelp/winhelp.c | 83 +++++++++++++++++++------------------- 1 file changed, 41 insertions(+), 42 deletions(-) diff --git a/programs/winhelp/winhelp.c b/programs/winhelp/winhelp.c index 75559b2f620..27c2ead3642 100644 --- a/programs/winhelp/winhelp.c +++ b/programs/winhelp/winhelp.c @@ -3,7 +3,7 @@ * * Copyright 1996 Ulrich Schmid * 2002 Sylvain Petreolle - * 2002 Eric Pouech + * 2002, 2008 Eric Pouech * 2004 Ken Belleau * * 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);