[PATCH 02/21] [WinHelp]: added the notion of WINHELP_WNDPAGE and use it to move the history to the global variables

Eric Pouech eric.pouech at orange.fr
Mon Apr 21 14:06:58 CDT 2008




A+
---

 programs/winhelp/macro.c   |   39 ++++++------
 programs/winhelp/winhelp.c |  140 ++++++++++++++++++++++----------------------
 programs/winhelp/winhelp.h |   22 +++++--
 3 files changed, 107 insertions(+), 94 deletions(-)


diff --git a/programs/winhelp/macro.c b/programs/winhelp/macro.c
index 1f824f8..ca11b5a 100644
--- a/programs/winhelp/macro.c
+++ b/programs/winhelp/macro.c
@@ -220,9 +220,8 @@ void CALLBACK MACRO_Back(void)
 
     WINE_TRACE("()\n");
 
-    if (win && win->backIndex >= 2)
-        WINHELP_CreateHelpWindow(win->back[--win->backIndex - 1],
-                                 win->info, SW_SHOW);
+    if (win && win->back.index >= 2)
+        WINHELP_CreateHelpWindow(&win->back.set[--win->back.index - 1], SW_SHOW);
 }
 
 void CALLBACK MACRO_BackFlush(void)
@@ -235,12 +234,12 @@ void CALLBACK MACRO_BackFlush(void)
     {
         unsigned int i;
 
-        for (i = 0; i < win->backIndex; i++)
+        for (i = 0; i < win->back.index; i++)
         {
-            HLPFILE_FreeHlpFile(win->back[i]->file);
-            win->back[i] = NULL;
+            HLPFILE_FreeHlpFile(win->back.set[i].page->file);
+            win->back.set[i].page = NULL;
         }
-        win->backIndex = 0;
+        win->back.index = 0;
     }
 }
 
@@ -701,15 +700,16 @@ void CALLBACK MACRO_MPrintID(LPCSTR str)
 
 void CALLBACK MACRO_Next(void)
 {
-    HLPFILE_PAGE*   page;
+    WINHELP_WNDPAGE     wp;
 
     WINE_TRACE("()\n");
-    page = Globals.active_win->page;
-    page = HLPFILE_PageByOffset(page->file, page->browse_fwd);
-    if (page)
+    wp.page = Globals.active_win->page;
+    wp.page = HLPFILE_PageByOffset(wp.page->file, wp.page->browse_fwd);
+    if (wp.page)
     {
-        page->file->wRefCount++;
-        WINHELP_CreateHelpWindow(page, Globals.active_win->info, SW_NORMAL);
+        wp.page->file->wRefCount++;
+        wp.wininfo = Globals.active_win->info;
+        WINHELP_CreateHelpWindow(&wp, SW_NORMAL);
     }
 }
 
@@ -740,15 +740,16 @@ void CALLBACK MACRO_PositionWindow(LONG i1, LONG i2, LONG u1, LONG u2, LONG u3,
 
 void CALLBACK MACRO_Prev(void)
 {
-    HLPFILE_PAGE*   page;
+    WINHELP_WNDPAGE     wp;
 
     WINE_TRACE("()\n");
-    page = Globals.active_win->page;
-    page = HLPFILE_PageByOffset(page->file, page->browse_bwd);
-    if (page)
+    wp.page = Globals.active_win->page;
+    wp.page = HLPFILE_PageByOffset(wp.page->file, wp.page->browse_bwd);
+    if (wp.page)
     {
-        page->file->wRefCount++;
-        WINHELP_CreateHelpWindow(page, Globals.active_win->info, SW_NORMAL);
+        wp.page->file->wRefCount++;
+        wp.wininfo = Globals.active_win->info;
+        WINHELP_CreateHelpWindow(&wp, SW_NORMAL);
     }
 }
 
diff --git a/programs/winhelp/winhelp.c b/programs/winhelp/winhelp.c
index 05c9439..5a6877b 100644
--- a/programs/winhelp/winhelp.c
+++ b/programs/winhelp/winhelp.c
@@ -56,7 +56,7 @@ static void    WINHELP_DeleteButtons(WINHELP_WINDOW*);
 static void    WINHELP_SetupText(HWND hWnd);
 static WINHELP_LINE_PART* WINHELP_IsOverLink(WINHELP_WINDOW*, WPARAM, LPARAM);
 
-WINHELP_GLOBALS Globals = {3, NULL, NULL, TRUE, NULL, NULL, NULL, NULL};
+WINHELP_GLOBALS Globals = {3, NULL, NULL, TRUE, NULL, NULL, NULL, NULL, {{{NULL,NULL}},0}};
 
 #define CTL_ID_BUTTON   0x700
 #define CTL_ID_TEXT     0x701
@@ -484,35 +484,38 @@ static void     WINHELP_AddHistory(WINHELP_WINDOW* win, HLPFILE_PAGE* page)
     unsigned        i, num;
 
     /* FIXME: when using back, we shouldn't update the history... */
-    for (i = 0; i < win->histIndex; i++)
-        if (win->history[i] == page) break;
+    for (i = 0; i < Globals.history.index; i++)
+        if (Globals.history.set[i].page == page) break;
 
     /* if the new page is already in the history, do nothing */
-    if (i == win->histIndex)
+    if (i == Globals.history.index)
     {
-        num = sizeof(win->history) / sizeof(win->history[0]);
-        if (win->histIndex == num)
+        num = sizeof(Globals.history.set) / sizeof(Globals.history.set[0]);
+        if (Globals.history.index == num)
         {
             /* we're full, remove latest entry */
-            HLPFILE_FreeHlpFile(win->history[0]->file);
-            memmove(&win->history[0], &win->history[1],
-                    (num - 1) * sizeof(win->history[0]));
-            win->histIndex--;
+            HLPFILE_FreeHlpFile(Globals.history.set[0].page->file);
+            memmove(&Globals.history.set[0], &Globals.history.set[1],
+                    (num - 1) * sizeof(Globals.history.set[0]));
+            Globals.history.index--;
         }
-        win->history[win->histIndex++] = page;
+        Globals.history.set[Globals.history.index].page = page;
+        Globals.history.set[Globals.history.index++].wininfo = win->info;
         page->file->wRefCount++;
         if (win->hHistoryWnd) InvalidateRect(win->hHistoryWnd, NULL, TRUE);
     }
 
-    num = sizeof(win->back) / sizeof(win->back[0]);
-    if (win->backIndex == num)
+    num = sizeof(win->back.set) / sizeof(win->back.set[0]);
+    if (win->back.index == num)
     {
         /* we're full, remove latest entry */
-        HLPFILE_FreeHlpFile(win->back[0]->file);
-        memmove(&win->back[0], &win->back[1], (num - 1) * sizeof(win->back[0]));
-        win->backIndex--;
+        HLPFILE_FreeHlpFile(win->back.set[0].page->file);
+        memmove(&win->back.set[0], &win->back.set[1],
+                (num - 1) * sizeof(win->back.set[0]));
+        win->back.index--;
     }
-    win->back[win->backIndex++] = page;
+    win->back.set[win->back.index].page = page;
+    win->back.set[win->back.index++].wininfo = win->info;
     page->file->wRefCount++;
 }
 
@@ -520,35 +523,34 @@ static void     WINHELP_AddHistory(WINHELP_WINDOW* win, HLPFILE_PAGE* page)
  *
  *           WINHELP_CreateHelpWindow
  */
-BOOL WINHELP_CreateHelpWindow(HLPFILE_PAGE* page, HLPFILE_WINDOWINFO* wi,
-                              int nCmdShow)
+BOOL WINHELP_CreateHelpWindow(WINHELP_WNDPAGE* wpage, int nCmdShow)
 {
     WINHELP_WINDOW*     win = NULL;
     BOOL                bPrimary, bPopup, bReUsed = FALSE;
     LPSTR               name;
 
-    bPrimary = !lstrcmpi(wi->name, "main");
-    bPopup = !bPrimary && (wi->win_style & WS_POPUP);
+    bPrimary = !lstrcmpi(wpage->wininfo->name, "main");
+    bPopup = !bPrimary && (wpage->wininfo->win_style & WS_POPUP);
 
-    if (page && !page->first_paragraph) HLPFILE_BrowsePage(page);
+    if (wpage->page && !wpage->page->first_paragraph) HLPFILE_BrowsePage(wpage->page);
 
     if (!bPopup)
     {
         for (win = Globals.win_list; win; win = win->next)
         {
-            if (!lstrcmpi(win->lpszName, wi->name))
+            if (!lstrcmpi(win->lpszName, wpage->wininfo->name))
             {
                 WINHELP_DeleteButtons(win);
                 bReUsed = TRUE;
-                SetWindowText(win->hMainWnd, wi->caption);
-                if (wi->origin.x != CW_USEDEFAULT &&
-                    wi->origin.y != CW_USEDEFAULT)
+                SetWindowText(win->hMainWnd, wpage->wininfo->caption);
+                if (wpage->wininfo->origin.x != CW_USEDEFAULT &&
+                    wpage->wininfo->origin.y != CW_USEDEFAULT)
                     SetWindowPos(win->hMainWnd, HWND_TOP,
-                                 wi->origin.x, wi->origin.y, 0, 0, SWP_NOSIZE);
-                if (wi->size.cx != CW_USEDEFAULT &&
-                    wi->size.cy != CW_USEDEFAULT)
+                                 wpage->wininfo->origin.x, wpage->wininfo->origin.y, 0, 0, SWP_NOSIZE);
+                if (wpage->wininfo->size.cx != CW_USEDEFAULT &&
+                    wpage->wininfo->size.cy != CW_USEDEFAULT)
                     SetWindowPos(win->hMainWnd, HWND_TOP,
-                                 0, 0, wi->size.cx, wi->size.cy, SWP_NOMOVE);
+                                 0, 0, wpage->wininfo->size.cx, wpage->wininfo->size.cy, SWP_NOMOVE);
                 WINHELP_InitFonts(win->hMainWnd);
 
                 WINHELP_SetupText(GetDlgItem(win->hMainWnd, CTL_ID_TEXT));
@@ -563,33 +565,33 @@ BOOL WINHELP_CreateHelpWindow(HLPFILE_PAGE* page, HLPFILE_WINDOWINFO* wi,
     {
         /* Initialize WINHELP_WINDOW struct */
         win = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
-                        sizeof(WINHELP_WINDOW) + strlen(wi->name) + 1);
+                        sizeof(WINHELP_WINDOW) + strlen(wpage->wininfo->name) + 1);
         if (!win) return FALSE;
         win->next = Globals.win_list;
         Globals.win_list = win;
 
         name = (char*)win + sizeof(WINHELP_WINDOW);
-        lstrcpy(name, wi->name);
+        lstrcpy(name, wpage->wininfo->name);
         win->lpszName = name;
         win->hHandCur = LoadCursorW(0, (LPWSTR)IDC_HAND);
-        win->histIndex = win->backIndex = 0;
+        win->back.index = 0;
     }
-    win->page = page;
-    win->info = wi;
+    win->page = wpage->page;
+    win->info = wpage->wininfo;
 
     win->hArrowCur = LoadCursorA(0, (LPSTR)IDC_ARROW);
     win->hHandCur = LoadCursorA(0, (LPSTR)IDC_HAND);
 
-    if (!bPopup && page)
+    if (!bPopup && wpage->page)
     {
-        WINHELP_AddHistory(win, page);
+        WINHELP_AddHistory(win, wpage->page);
     }
 
     if (!bPopup)
         Globals.active_win = win;
 
     /* Initialize default pushbuttons */
-    if (bPrimary && page)
+    if (bPrimary && wpage->page)
     {
         CHAR    buffer[MAX_STRING_LEN];
 
@@ -606,22 +608,23 @@ BOOL WINHELP_CreateHelpWindow(HLPFILE_PAGE* page, HLPFILE_WINDOWINFO* wi,
     }
 
     /* Initialize file specific pushbuttons */
-    if (!(wi->win_style & WS_POPUP) && page)
+    if (!(wpage->wininfo->win_style & WS_POPUP) && wpage->page)
     {
         HLPFILE_MACRO  *macro;
-        for (macro = page->file->first_macro; macro; macro = macro->next)
+        for (macro = wpage->page->file->first_macro; macro; macro = macro->next)
             MACRO_ExecuteMacro(macro->lpszMacro);
 
-        for (macro = page->first_macro; macro; macro = macro->next)
+        for (macro = wpage->page->first_macro; macro; macro = macro->next)
             MACRO_ExecuteMacro(macro->lpszMacro);
     }
 
     if (!bReUsed)
     {
         win->hMainWnd = CreateWindowEx((bPopup) ? WS_EX_TOOLWINDOW : 0, MAIN_WIN_CLASS_NAME,
-                                       wi->caption,
-                                       bPrimary ? WS_OVERLAPPEDWINDOW : wi->win_style,
-                                       wi->origin.x, wi->origin.y, wi->size.cx, wi->size.cy,
+                                       wpage->wininfo->caption,
+                                       bPrimary ? WS_OVERLAPPEDWINDOW : wpage->wininfo->win_style,
+                                       wpage->wininfo->origin.x, wpage->wininfo->origin.y,
+                                       wpage->wininfo->size.cx, wpage->wininfo->size.cy,
                                        bPopup ? Globals.active_win->hMainWnd : NULL,
                                        bPrimary ? LoadMenu(Globals.hInstance, MAKEINTRESOURCE(MAIN_MENU)) : 0,
                                        Globals.hInstance, win);
@@ -650,13 +653,15 @@ BOOL WINHELP_CreateHelpWindow(HLPFILE_PAGE* page, HLPFILE_WINDOWINFO* wi,
 BOOL WINHELP_CreateHelpWindowByHash(HLPFILE* hlpfile, LONG lHash, 
                                     HLPFILE_WINDOWINFO* wi, int nCmdShow)
 {
-    HLPFILE_PAGE*       page = NULL;
+    WINHELP_WNDPAGE     wpage;
 
+    wpage.page = NULL;
     if (hlpfile)
-        page = lHash ? HLPFILE_PageByHash(hlpfile, lHash) : 
+        wpage.page = lHash ? HLPFILE_PageByHash(hlpfile, lHash) : 
             HLPFILE_Contents(hlpfile);
-    if (page) page->file->wRefCount++;
-    return WINHELP_CreateHelpWindow(page, wi, nCmdShow);
+    if (wpage.page) wpage.page->file->wRefCount++;
+    wpage.wininfo = wi;
+    return WINHELP_CreateHelpWindow(&wpage, nCmdShow);
 }
 
 /***********************************************************************
@@ -666,11 +671,12 @@ BOOL WINHELP_CreateHelpWindowByHash(HLPFILE* hlpfile, LONG lHash,
 BOOL WINHELP_CreateHelpWindowByMap(HLPFILE* hlpfile, LONG lMap,
                                    HLPFILE_WINDOWINFO* wi, int nCmdShow)
 {
-    HLPFILE_PAGE*       page = NULL;
+    WINHELP_WNDPAGE     wpage;
 
-    page = HLPFILE_PageByMap(hlpfile, lMap);
-    if (page) page->file->wRefCount++;
-    return WINHELP_CreateHelpWindow(page, wi, nCmdShow);
+    wpage.page = HLPFILE_PageByMap(hlpfile, lMap);
+    if (wpage.page) wpage.page->file->wRefCount++;
+    wpage.wininfo = wi;
+    return WINHELP_CreateHelpWindow(&wpage, nCmdShow);
 }
 
 /***********************************************************************
@@ -680,11 +686,12 @@ BOOL WINHELP_CreateHelpWindowByMap(HLPFILE* hlpfile, LONG lMap,
 BOOL WINHELP_CreateHelpWindowByOffset(HLPFILE* hlpfile, LONG lOffset,
                                       HLPFILE_WINDOWINFO* wi, int nCmdShow)
 {
-    HLPFILE_PAGE*       page = NULL;
+    WINHELP_WNDPAGE     wpage;
 
-    page = HLPFILE_PageByOffset(hlpfile, lOffset);
-    if (page) page->file->wRefCount++;
-    return WINHELP_CreateHelpWindow(page, wi, nCmdShow);
+    wpage.page = HLPFILE_PageByOffset(hlpfile, lOffset);
+    if (wpage.page) wpage.page->file->wRefCount++;
+    wpage.wininfo = wi;
+    return WINHELP_CreateHelpWindow(&wpage, nCmdShow);
 }
 
 /***********************************************************************
@@ -1264,7 +1271,7 @@ static LRESULT CALLBACK WINHELP_HistoryWndProc(HWND hWnd, UINT msg, WPARAM wPara
         GetWindowRect(hWnd, &r);
 
         r.right = r.left + 30 * tm.tmAveCharWidth;
-        r.bottom = r.top + (sizeof(win->history) / sizeof(win->history[0])) * tm.tmHeight;
+        r.bottom = r.top + (sizeof(Globals.history.set) / sizeof(Globals.history.set[0])) * tm.tmHeight;
         AdjustWindowRect(&r, GetWindowLong(hWnd, GWL_STYLE), FALSE);
         if (r.left < 0) {r.right -= r.left; r.left = 0;}
         if (r.top < 0) {r.bottom -= r.top; r.top = 0;}
@@ -1277,8 +1284,8 @@ static LRESULT CALLBACK WINHELP_HistoryWndProc(HWND hWnd, UINT msg, WPARAM wPara
         hDc = GetDC(hWnd);
         GetTextMetrics(hDc, &tm);
         i = HIWORD(lParam) / tm.tmHeight;
-        if (i < win->histIndex)
-            WINHELP_CreateHelpWindow(win->history[i], win->info, SW_SHOW);
+        if (i < Globals.history.index)
+            WINHELP_CreateHelpWindow(&Globals.history.set[i], SW_SHOW);
         ReleaseDC(hWnd, hDc);
         break;
     case WM_PAINT:
@@ -1286,10 +1293,10 @@ static LRESULT CALLBACK WINHELP_HistoryWndProc(HWND hWnd, UINT msg, WPARAM wPara
         win = (WINHELP_WINDOW*) GetWindowLongPtr(hWnd, 0);
         GetTextMetrics(hDc, &tm);
 
-        for (i = 0; i < win->histIndex; i++)
+        for (i = 0; i < Globals.history.index; i++)
         {
-            TextOut(hDc, 0, i * tm.tmHeight, win->history[i]->lpszTitle, 
-                    strlen(win->history[i]->lpszTitle));
+            TextOut(hDc, 0, i * tm.tmHeight, Globals.history.set[i].page->lpszTitle,
+                    strlen(Globals.history.set[i].page->lpszTitle));
         }
         EndPaint(hWnd, &ps);
         break;
@@ -1816,13 +1823,8 @@ static void WINHELP_DeleteWindow(WINHELP_WINDOW* win)
 
     DeleteObject(win->hBrush);
 
-    for (i = 0; i < win->histIndex; i++)
-    {
-        HLPFILE_FreeHlpFile(win->history[i]->file);
-    }
-
-    for (i = 0; i < win->backIndex; i++)
-        HLPFILE_FreeHlpFile(win->back[i]->file);
+    for (i = 0; i < win->back.index; i++)
+        HLPFILE_FreeHlpFile(win->back.set[i].page->file);
 
     if (win->page) HLPFILE_FreeHlpFile(win->page->file);
     WINHELP_DeleteLines(win);
diff --git a/programs/winhelp/winhelp.h b/programs/winhelp/winhelp.h
index 551b880..5b23994 100644
--- a/programs/winhelp/winhelp.h
+++ b/programs/winhelp/winhelp.h
@@ -91,6 +91,19 @@ typedef struct tagHelpButton
     struct tagHelpButton*next;
 } WINHELP_BUTTON;
 
+typedef struct
+{
+    HLPFILE_PAGE*       page;
+    HLPFILE_WINDOWINFO* wininfo;
+} WINHELP_WNDPAGE;
+
+typedef struct tagPageSet
+{
+    /* FIXME: for now it's a fixed size */
+    WINHELP_WNDPAGE     set[40];
+    unsigned            index;
+} WINHELP_PAGESET;
+
 typedef struct tagWinHelp
 {
     LPCSTR              lpszName;
@@ -113,11 +126,7 @@ typedef struct tagWinHelp
 
     HLPFILE_WINDOWINFO* info;
 
-    /* FIXME: for now it's a fixed size */
-    HLPFILE_PAGE*       history[40];
-    unsigned            histIndex;
-    HLPFILE_PAGE*       back[40];
-    unsigned            backIndex;
+    WINHELP_PAGESET     back;
 
     struct tagWinHelp*  next;
 } WINHELP_WINDOW;
@@ -162,6 +171,7 @@ typedef struct
     WINHELP_WINDOW*     win_list;
     WNDPROC             button_proc;
     WINHELP_DLL*        dlls;
+    WINHELP_PAGESET     history;
 } WINHELP_GLOBALS;
 
 extern WINHELP_GLOBALS Globals;
@@ -170,7 +180,7 @@ extern FARPROC         Callbacks[];
 BOOL WINHELP_CreateHelpWindowByHash(HLPFILE*, LONG, HLPFILE_WINDOWINFO*, int);
 BOOL WINHELP_CreateHelpWindowByMap(HLPFILE*, LONG, HLPFILE_WINDOWINFO*, int);
 BOOL WINHELP_CreateHelpWindowByOffset(HLPFILE*, LONG, HLPFILE_WINDOWINFO*, int);
-BOOL WINHELP_CreateHelpWindow(HLPFILE_PAGE*, HLPFILE_WINDOWINFO*, int);
+BOOL WINHELP_CreateHelpWindow(WINHELP_WNDPAGE*, int);
 BOOL WINHELP_GetOpenFileName(LPSTR, int);
 BOOL WINHELP_CreateIndexWindow(void);
 INT  WINHELP_MessageBoxIDS(UINT, UINT, WORD);





More information about the wine-patches mailing list