WinHelp

Eric Pouech eric.pouech at wanadoo.fr
Sun Oct 20 04:50:14 CDT 2002


this patch improves a bit link handling in winhelp
- better parsing of information in files
- allowing links to be macros (and invoking them!)

A+
-------------- next part --------------
Name:          wh_link
ChangeLog:     improved a bit link handling (a few more link types loaded from file and support for link to a macro
License:       X11
GenDate:       2002/10/20 09:41:40 UTC
ModifiedFiles: programs/winhelp/hlpfile.c programs/winhelp/hlpfile.h  programs/winhelp/winhelp.c programs/winhelp/winhelp.h
AddedFiles:    
===================================================================
RCS file: /home/cvs/cvsroot/wine/wine/programs/winhelp/hlpfile.c,v
retrieving revision 1.10
diff -u -u -r1.10 hlpfile.c
--- programs/winhelp/hlpfile.c	19 Oct 2002 00:12:42 -0000	1.10
+++ programs/winhelp/hlpfile.c	19 Oct 2002 07:17:37 -0000
@@ -757,28 +757,31 @@
                     strcpy(paragraph->u.text.lpszText, text);
                 }
 
-                if (attributes.link.lpszPath)
+                if (attributes.link.lpszString)
                 {
                     /* FIXME: should build a string table for the attributes.link.lpszPath
                      * they are reallocated for each link
                      */
                     paragraph->link = HeapAlloc(GetProcessHeap(), 0,
-                                                sizeof(HLPFILE_LINK) + strlen(attributes.link.lpszPath) + 1);
+                                                sizeof(HLPFILE_LINK) + strlen(attributes.link.lpszString) + 1);
                     if (!paragraph->link) return FALSE;
 
-                    paragraph->link->lpszPath = (char*)paragraph->link + sizeof(HLPFILE_LINK);
-                    strcpy((char*)paragraph->link->lpszPath, attributes.link.lpszPath);
-                    paragraph->link->lHash    = attributes.link.lHash;
-
-                    paragraph->link->bPopup   = attributes.link.bPopup;
-                    WINE_TRACE("Link to %s/%08lx\n",
-                               paragraph->link->lpszPath, paragraph->link->lHash);
+                    paragraph->link->cookie     = attributes.link.cookie;
+                    paragraph->link->lpszString = (char*)paragraph->link + sizeof(HLPFILE_LINK);
+                    strcpy((char*)paragraph->link->lpszString, attributes.link.lpszString);
+                    paragraph->link->lHash      = attributes.link.lHash;
+                    paragraph->link->bClrChange = attributes.link.bClrChange;
+
+                    WINE_TRACE("Link[%d] to %s/%08lx\n",
+                               paragraph->link->cookie, paragraph->link->lpszString, paragraph->link->lHash);
                 }
 #if 0
                 memset(&attributes, 0, sizeof(attributes));
 #else
                 attributes.hBitmap = 0;
-                attributes.link.lpszPath = NULL;
+                attributes.link.lpszString = NULL;
+                attributes.link.bClrChange = FALSE;
+                attributes.link.lHash = 0;
                 attributes.wVSpace = 0;
                 attributes.wHSpace = 0;
                 attributes.wIndent = 0;
@@ -880,53 +883,67 @@
 
             case 0x8B:
             case 0x8C:
-                WINE_FIXME("NIY\n");
+                WINE_FIXME("NIY non-break space/hyphen\n");
                 format += 1;
                 break;
 
 #if 0
-	    case 0xa9:
+	    case 0xA9:
                 format += 2;
                 break;
 #endif
 
-            case 0xc8:
-            case 0xcc:
-                WINE_FIXME("macro NIY %s\n", format + 3);
-                format += GET_USHORT(format, 1) + 3;
+            case 0xC8:
+            case 0xCC:
+                WINE_TRACE("macro => %s\n", format + 3);
+                attributes.link.bClrChange = !(*format & 4);
+                attributes.link.cookie     = hlp_link_macro;
+                attributes.link.lpszString = format + 3;
+                format += 3 + GET_USHORT(format, 1);
                 break;
 
-            case 0xe0:
-            case 0xe1:
+            case 0xE0:
+            case 0xE1:
                 WINE_WARN("jump topic 1 => %u\n", GET_UINT(format, 1));
                 format += 5;
                 break;
 
-	    case 0xe2:
-	    case 0xe3:
-                attributes.link.lpszPath = hlpfile->lpszPath;
-                attributes.link.lHash    = GET_UINT(format, 1);
-                attributes.link.bPopup   = !(*format & 1);
+	    case 0xE2:
+	    case 0xE3:
+                attributes.link.bClrChange = TRUE;
+                /* fall thru */
+            case 0xE6:
+            case 0xE7:
+                attributes.link.cookie     = (*format & 1) ? hlp_link_link : hlp_link_popup;
+                attributes.link.lpszString = hlpfile->lpszPath;
+                attributes.link.lHash      = GET_UINT(format, 1);
                 format += 5;
                 break;
 
-            case 0xe6:
-            case 0xe7:
-                WINE_WARN("jump topic 2 => %u\n", GET_UINT(format, 1));
-                format += 5;
-                break;
-
-	    case 0xea:
-                attributes.link.lpszPath = format + 8;
-                attributes.link.lHash    = GET_UINT(format, 4);
-                attributes.link.bPopup   = !(*format & 1);
-                format += 3 + GET_USHORT(format, 1);
-                break;
-
-            case 0xee:
-            case 0xef:
-            case 0xeb:
-                WINE_WARN("jump to external file\n");
+	    case 0xEA:
+            case 0xEB:
+            case 0xEE:
+            case 0xEF:
+                {
+                    char* ptr = format + 8;
+                    BYTE  type = format[3];
+                    
+                    attributes.link.cookie     = hlp_link_link;
+                    attributes.link.lHash      = GET_UINT(format, 4);
+                    attributes.link.bClrChange = !(*format & 1);
+                    
+                    if (type == 1) 
+                    {WINE_FIXME("Unsupported wnd number %d for link\n", *ptr); ptr++;}
+                    if (type == 4 || type == 6)
+                    {
+                        attributes.link.lpszString = ptr;
+                        ptr += strlen(ptr) + 1;
+                    }
+                    else
+                        attributes.link.lpszString = hlpfile->lpszPath;
+                    if (type == 6)
+                        WINE_FIXME("Unsupported wnd name '%s' for link\n", ptr);
+                }
                 format += 3 + GET_USHORT(format, 1);
                 break;
 
Index: programs/winhelp/hlpfile.h
===================================================================
RCS file: /home/cvs/cvsroot/wine/wine/programs/winhelp/hlpfile.h,v
retrieving revision 1.3
diff -u -u -r1.3 hlpfile.h
--- programs/winhelp/hlpfile.h	16 Jul 2002 01:46:29 -0000	1.3
+++ programs/winhelp/hlpfile.h	18 Oct 2002 20:53:20 -0000
@@ -23,9 +23,10 @@
 
 typedef struct
 {
-    LPCSTR                      lpszPath;
-    LONG                        lHash;
-    BOOL                        bPopup;
+    enum {hlp_link_none, hlp_link_link, hlp_link_popup, hlp_link_macro} cookie;
+    LPCSTR    lpszString;
+    LONG      lHash;
+    BOOL      bClrChange;
 } HLPFILE_LINK;
 
 enum para_type {para_normal_text, para_debug_text, para_image};
Index: programs/winhelp/winhelp.c
===================================================================
RCS file: /home/cvs/cvsroot/wine/wine/programs/winhelp/winhelp.c,v
retrieving revision 1.15
diff -u -u -r1.15 winhelp.c
--- programs/winhelp/winhelp.c	19 Oct 2002 00:12:42 -0000	1.15
+++ programs/winhelp/winhelp.c	19 Oct 2002 08:42:03 -0000
@@ -701,8 +696,24 @@
             mouse.x = LOWORD(lParam);
             mouse.y = HIWORD(lParam);
 
-            WINHELP_CreateHelpWindowByHash(part->link.lpszPath, part->link.lHash, NULL,
-                                           part->link.bPopup, hWnd, &mouse, SW_NORMAL);
+            switch (part->link.cookie)
+            {
+            case hlp_link_none:
+                break;
+            case hlp_link_link:
+                WINHELP_CreateHelpWindowByHash(part->link.lpszString, part->link.lHash, NULL,
+                                               FALSE, hWnd, &mouse, SW_NORMAL);
+                break;
+            case hlp_link_popup:
+                WINHELP_CreateHelpWindowByHash(part->link.lpszString, part->link.lHash, NULL,
+                                               TRUE, hWnd, &mouse, SW_NORMAL);
+                break;
+            case hlp_link_macro:
+                MACRO_ExecuteMacro(part->link.lpszString);
+                break;
+            default:
+                WINE_FIXME("Unknown link cookie %d\n", part->link.cookie);
+            }
         }
 
         if (hPopupWnd)
@@ -773,7 +784,7 @@
         *line_ascent  = ascent;
 
         line = HeapAlloc(GetProcessHeap(), 0,
-                         sizeof(WINHELP_LINE) + textlen + (link ? lstrlen(link->lpszPath) + 1 : 0));
+                         sizeof(WINHELP_LINE) + textlen + (link ? lstrlen(link->lpszString) + 1 : 0));
         if (!line) return FALSE;
 
         line->next    = 0;
@@ -807,7 +818,7 @@
 
         part = HeapAlloc(GetProcessHeap(), 0,
                          sizeof(WINHELP_LINE_PART) + textlen +
-                         (link ? lstrlen(link->lpszPath) + 1 : 0));
+                         (link ? lstrlen(link->lpszString) + 1 : 0));
         if (!part) return FALSE;
         **partp = part;
         ptr     = (char*)part + sizeof(WINHELP_LINE_PART);
@@ -836,12 +847,13 @@
                part->rect.left, part->rect.top, part->rect.right, part->rect.bottom);
     if (link)
     {
-        strcpy(ptr + textlen, link->lpszPath);
-        part->link.lpszPath = ptr + textlen;
-        part->link.lHash    = link->lHash;
-        part->link.bPopup   = link->bPopup;
+        strcpy(ptr + textlen, link->lpszString);
+        part->link.lpszString = ptr + textlen;
+        part->link.cookie     = link->cookie;
+        part->link.lHash      = link->lHash;
+        part->link.bClrChange = link->bClrChange;
     }
-    else part->link.lpszPath = 0;
+    else part->link.cookie = hlp_link_none;
 
     part->next          = 0;
     *partp              = &part->next;
@@ -867,7 +879,7 @@
     if (!*partp || pos == 1) /* New line */
     {
         line = HeapAlloc(GetProcessHeap(), 0,
-                         sizeof(WINHELP_LINE) + (link ? lstrlen(link->lpszPath) + 1 : 0));
+                         sizeof(WINHELP_LINE) + (link ? lstrlen(link->lpszString) + 1 : 0));
         if (!line) return FALSE;
 
         line->next    = NULL;
@@ -890,7 +902,7 @@
 
         part = HeapAlloc(GetProcessHeap(), 0,
                          sizeof(WINHELP_LINE_PART) +
-                         (link ? lstrlen(link->lpszPath) + 1 : 0));
+                         (link ? lstrlen(link->lpszString) + 1 : 0));
         if (!part) return FALSE;
         **partp = part;
         ptr = (char*)part + sizeof(WINHELP_LINE_PART);
@@ -912,12 +924,13 @@
 
     if (link)
     {
-        strcpy(ptr, link->lpszPath);
-        part->link.lpszPath = ptr;
-        part->link.lHash    = link->lHash;
-        part->link.bPopup   = link->bPopup;
+        strcpy(ptr, link->lpszString);
+        part->link.lpszString = ptr;
+        part->link.cookie     = link->cookie;
+        part->link.lHash      = link->lHash;
+        part->link.bClrChange = link->bClrChange;
     }
-    else part->link.lpszPath = 0;
+    else part->link.cookie = hlp_link_none;
 
     part->next            = NULL;
     *partp                = &part->next;
@@ -996,7 +1009,7 @@
 
                 if (p->link)
                 {
-                    underline = (p->link->bPopup) ? 3 : 1;
+                    underline = (p->link->cookie == hlp_link_popup) ? 3 : 1;
                     color = RGB(0, 0x80, 0);
                 }
                 if (p->cookie == para_debug_text) color = RGB(0xff, 0, 0);
@@ -1274,7 +1287,8 @@
     {
         for (part = &line->first_part; part; part = part->next)
         {
-            if (part->link.lpszPath &&
+            if (part->link.cookie != hlp_link_none &&
+                part->link.lpszString &&
                 part->rect.left   <= mouse.x &&
                 part->rect.right  >= mouse.x &&
                 part->rect.top    <= mouse.y + scroll_pos &&
Index: programs/winhelp/winhelp.h
===================================================================
RCS file: /home/cvs/cvsroot/wine/wine/programs/winhelp/winhelp.h,v
retrieving revision 1.5
diff -u -u -r1.5 winhelp.h
--- programs/winhelp/winhelp.h	16 Jul 2002 01:46:29 -0000	1.5
+++ programs/winhelp/winhelp.h	18 Oct 2002 20:32:58 -0000
@@ -56,13 +56,7 @@
             HBITMAP     hBitmap;
         } image;
     } u;
-
-    struct
-    {
-        LPCSTR    lpszPath;
-        LONG      lHash;
-        BOOL      bPopup;
-    } link;
+    HLPFILE_LINK        link;
 
     struct tagHelpLinePart *next;
 } WINHELP_LINE_PART;


More information about the wine-patches mailing list