Erich Hoover : hhctrl.ocx: Implement HH_CLOSE_ALL.
Alexandre Julliard
julliard at winehq.org
Mon Jul 16 14:14:30 CDT 2012
Module: wine
Branch: master
Commit: 97bcef997fdd53137ab250448ac15bb9d4b40ee3
URL: http://source.winehq.org/git/wine.git/?a=commit;h=97bcef997fdd53137ab250448ac15bb9d4b40ee3
Author: Erich Hoover <ehoover at mines.edu>
Date: Thu Jul 12 10:21:36 2012 -0600
hhctrl.ocx: Implement HH_CLOSE_ALL.
---
dlls/hhctrl.ocx/chm.c | 6 ++++--
dlls/hhctrl.ocx/help.c | 5 +++++
dlls/hhctrl.ocx/hhctrl.c | 31 +++++++++++++++++++++++++------
dlls/hhctrl.ocx/hhctrl.h | 3 +++
4 files changed, 37 insertions(+), 8 deletions(-)
diff --git a/dlls/hhctrl.ocx/chm.c b/dlls/hhctrl.ocx/chm.c
index cc92b89..82b8d9a 100644
--- a/dlls/hhctrl.ocx/chm.c
+++ b/dlls/hhctrl.ocx/chm.c
@@ -138,7 +138,8 @@ static BOOL ReadChmSystem(CHMInfo *chm)
chm->codePage = CP_ACP;
break;
case 0x5:
- TRACE("Default window is %s\n", debugstr_an(buf, entry.len));
+ TRACE("Window name is %s\n", debugstr_an(buf, entry.len));
+ chm->defWindow = strdupnAtoW(buf, entry.len);
break;
case 0x6:
TRACE("Compiled file is %s\n", debugstr_an(buf, entry.len));
@@ -268,7 +269,7 @@ BOOL LoadWinTypeFromCHM(HHInfo *info)
memset((void*)&(info->WinType), 0, sizeof(info->WinType));
info->WinType.cbStruct=sizeof(info->WinType);
info->WinType.fUniCodeStrings=TRUE;
- info->WinType.pszType=strdupW(defaultwinW);
+ info->WinType.pszType = strdupW(info->pCHMInfo->defWindow ? info->pCHMInfo->defWindow : defaultwinW);
info->WinType.pszToc = strdupW(info->pCHMInfo->defToc ? info->pCHMInfo->defToc : null);
info->WinType.pszIndex = strdupW(null);
info->WinType.fsValidMembers=0;
@@ -530,6 +531,7 @@ CHMInfo *CloseCHM(CHMInfo *chm)
}
heap_free(chm->strings);
+ heap_free(chm->defWindow);
heap_free(chm->defTitle);
heap_free(chm->defTopic);
heap_free(chm->defToc);
diff --git a/dlls/hhctrl.ocx/help.c b/dlls/hhctrl.ocx/help.c
index 87ea94f..2f2fba1 100644
--- a/dlls/hhctrl.ocx/help.c
+++ b/dlls/hhctrl.ocx/help.c
@@ -48,6 +48,8 @@ static void ExpandContract(HHInfo *pHHInfo);
#define TAB_MARGIN 8
#define EDIT_HEIGHT 20
+struct list window_list = LIST_INIT(window_list);
+
static const WCHAR szEmpty[] = {0};
struct html_encoded_symbol {
@@ -1740,6 +1742,8 @@ void ReleaseHelpViewer(HHInfo *info)
if (!info)
return;
+ list_remove(&info->entry);
+
/* Free allocated strings */
heap_free(info->pszType);
heap_free(info->pszCaption);
@@ -1798,6 +1802,7 @@ HHInfo *CreateHelpViewer(LPCWSTR filename)
return NULL;
}
+ list_add_tail(&window_list, &info->entry);
return info;
}
diff --git a/dlls/hhctrl.ocx/hhctrl.c b/dlls/hhctrl.ocx/hhctrl.c
index 7647abb..a5e7e37 100644
--- a/dlls/hhctrl.ocx/hhctrl.c
+++ b/dlls/hhctrl.ocx/hhctrl.c
@@ -41,6 +41,8 @@ WINE_DEFAULT_DEBUG_CHANNEL(htmlhelp);
HINSTANCE hhctrl_hinstance;
BOOL hh_process = FALSE;
+extern struct list window_list;
+
BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD fdwReason, LPVOID lpvReserved)
{
TRACE("(%p,%d,%p)\n", hInstance, fdwReason, lpvReserved);
@@ -98,7 +100,7 @@ static const char *command_to_string(UINT command)
#undef X
}
-static BOOL resolve_filename(const WCHAR *filename, WCHAR *fullname, DWORD buflen, const WCHAR **index, const WCHAR **window)
+static BOOL resolve_filename(const WCHAR *filename, WCHAR *fullname, DWORD buflen, WCHAR **index, WCHAR **window)
{
const WCHAR *extra;
WCHAR chm_file[MAX_PATH];
@@ -164,14 +166,15 @@ HWND WINAPI HtmlHelpW(HWND caller, LPCWSTR filename, UINT command, DWORD_PTR dat
HHInfo *info;
BOOL res;
NMHDR nmhdr;
+ WCHAR *window = NULL;
const WCHAR *index = NULL;
+ WCHAR *default_index = NULL;
int tab_index = TAB_CONTENTS;
- const WCHAR *default_index = NULL;
if (!filename)
return NULL;
- if (!resolve_filename(filename, fullname, MAX_PATH, &default_index, NULL))
+ if (!resolve_filename(filename, fullname, MAX_PATH, &default_index, &window))
{
WARN("can't find %s\n", debugstr_w(filename));
return 0;
@@ -180,10 +183,18 @@ HWND WINAPI HtmlHelpW(HWND caller, LPCWSTR filename, UINT command, DWORD_PTR dat
info = CreateHelpViewer(fullname);
if(!info)
+ {
+ heap_free(default_index);
+ heap_free(window);
return NULL;
+ }
if(!index)
index = info->WinType.pszFile;
+ if(!info->pszType)
+ info->WinType.pszType = info->pszType = window;
+ else
+ heap_free(window);
/* called to load a specified topic */
switch(command)
@@ -196,9 +207,7 @@ HWND WINAPI HtmlHelpW(HWND caller, LPCWSTR filename, UINT command, DWORD_PTR dat
}
res = NavigateToChm(info, info->pCHMInfo->szFile, index);
-
- if (default_index)
- heap_free((WCHAR*)default_index);
+ heap_free(default_index);
if(!res)
{
@@ -269,6 +278,16 @@ HWND WINAPI HtmlHelpW(HWND caller, LPCWSTR filename, UINT command, DWORD_PTR dat
}
return 0;
}
+ case HH_CLOSE_ALL: {
+ HHInfo *info, *next;
+
+ LIST_FOR_EACH_ENTRY_SAFE(info, next, &window_list, HHInfo, entry)
+ {
+ TRACE("Destroying window %s.\n", debugstr_w(info->WinType.pszType));
+ ReleaseHelpViewer(info);
+ }
+ return 0;
+ }
default:
FIXME("HH case %s not handled.\n", command_to_string( command ));
}
diff --git a/dlls/hhctrl.ocx/hhctrl.h b/dlls/hhctrl.ocx/hhctrl.h
index 8959748..f03d476 100644
--- a/dlls/hhctrl.ocx/hhctrl.h
+++ b/dlls/hhctrl.ocx/hhctrl.h
@@ -40,6 +40,7 @@
#include "wine/itss.h"
#include "wine/unicode.h"
+#include "wine/list.h"
#define WB_GOBACK 0
#define WB_GOFORWARD 1
@@ -103,6 +104,7 @@ typedef struct CHMInfo
DWORD strings_size;
WCHAR *compiledFile;
+ WCHAR *defWindow;
WCHAR *defTopic;
WCHAR *defTitle;
WCHAR *defToc;
@@ -157,6 +159,7 @@ typedef struct {
LPWSTR pszUrlJump2;
LPWSTR pszCustomTabs;
+ struct list entry;
CHMInfo *pCHMInfo;
ContentItem *content;
IndexItem *index;
More information about the wine-cvs
mailing list