Alexandre Julliard | 889f742 | 1997-04-15 17:19:52 +0000 | [diff] [blame] | 1 | /* |
| 2 | * Windows Help |
Alexandre Julliard | 0799c1a | 2002-03-09 23:29:33 +0000 | [diff] [blame] | 3 | * |
| 4 | * Copyright 1996 Martin von Loewis |
| 5 | * |
| 6 | * This library is free software; you can redistribute it and/or |
| 7 | * modify it under the terms of the GNU Lesser General Public |
| 8 | * License as published by the Free Software Foundation; either |
| 9 | * version 2.1 of the License, or (at your option) any later version. |
| 10 | * |
| 11 | * This library is distributed in the hope that it will be useful, |
| 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| 14 | * Lesser General Public License for more details. |
| 15 | * |
| 16 | * You should have received a copy of the GNU Lesser General Public |
| 17 | * License along with this library; if not, write to the Free Software |
| 18 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
Alexandre Julliard | 889f742 | 1997-04-15 17:19:52 +0000 | [diff] [blame] | 19 | */ |
| 20 | |
| 21 | #include <stdlib.h> |
| 22 | #include <stdio.h> |
| 23 | #include <string.h> |
| 24 | #include <unistd.h> |
Alexandre Julliard | 0799c1a | 2002-03-09 23:29:33 +0000 | [diff] [blame] | 25 | #include "wine/debug.h" |
Jeremy White | d3e22d9 | 2000-02-10 19:03:02 +0000 | [diff] [blame] | 26 | #include "windef.h" |
| 27 | #include "wingdi.h" |
Michael Veksler | ca1bc86 | 1999-01-01 18:57:33 +0000 | [diff] [blame] | 28 | #include "wine/winuser16.h" |
Michael Veksler | f935c59 | 1999-02-09 15:49:39 +0000 | [diff] [blame] | 29 | #include "wine/winbase16.h" |
Alexandre Julliard | d23a82b | 2001-09-19 20:37:04 +0000 | [diff] [blame] | 30 | #include "win.h" |
Alexandre Julliard | 889f742 | 1997-04-15 17:19:52 +0000 | [diff] [blame] | 31 | |
Alexandre Julliard | 0799c1a | 2002-03-09 23:29:33 +0000 | [diff] [blame] | 32 | WINE_DEFAULT_DEBUG_CHANNEL(win); |
Patrik Stridvall | b4b9fae | 1999-04-19 14:56:29 +0000 | [diff] [blame] | 33 | |
Alexandre Julliard | 889f742 | 1997-04-15 17:19:52 +0000 | [diff] [blame] | 34 | |
Francois Gouget | 67c9691 | 2000-10-12 23:18:55 +0000 | [diff] [blame] | 35 | /* WinHelp internal structure */ |
| 36 | typedef struct |
| 37 | { |
| 38 | WORD size; |
| 39 | WORD command; |
| 40 | LONG data; |
| 41 | LONG reserved; |
| 42 | WORD ofsFilename; |
| 43 | WORD ofsData; |
| 44 | } WINHELP,*LPWINHELP; |
| 45 | |
Alexandre Julliard | 889f742 | 1997-04-15 17:19:52 +0000 | [diff] [blame] | 46 | /********************************************************************** |
Patrik Stridvall | 2ece70e | 2000-12-22 01:38:01 +0000 | [diff] [blame] | 47 | * WinHelp (USER.171) |
Alexandre Julliard | 889f742 | 1997-04-15 17:19:52 +0000 | [diff] [blame] | 48 | */ |
Alexandre Julliard | 670cdc4 | 1997-08-24 16:00:30 +0000 | [diff] [blame] | 49 | BOOL16 WINAPI WinHelp16( HWND16 hWnd, LPCSTR lpHelpFile, UINT16 wCommand, |
| 50 | DWORD dwData ) |
Alexandre Julliard | 889f742 | 1997-04-15 17:19:52 +0000 | [diff] [blame] | 51 | { |
Peter Ganten | 65b1f9f | 2000-01-05 02:41:12 +0000 | [diff] [blame] | 52 | BOOL ret; |
Alexandre Julliard | ab68797 | 2000-11-15 23:41:46 +0000 | [diff] [blame] | 53 | DWORD mutex_count; |
| 54 | |
Peter Ganten | 65b1f9f | 2000-01-05 02:41:12 +0000 | [diff] [blame] | 55 | /* We might call WinExec() */ |
Alexandre Julliard | ab68797 | 2000-11-15 23:41:46 +0000 | [diff] [blame] | 56 | ReleaseThunkLock( &mutex_count ); |
Alexandre Julliard | d586dc9 | 2000-08-14 14:35:01 +0000 | [diff] [blame] | 57 | |
Alexandre Julliard | d23a82b | 2001-09-19 20:37:04 +0000 | [diff] [blame] | 58 | if (!(ret = WinHelpA( WIN_Handle32(hWnd), lpHelpFile, wCommand, (DWORD)MapSL(dwData) ))) |
Alexandre Julliard | d586dc9 | 2000-08-14 14:35:01 +0000 | [diff] [blame] | 59 | { |
| 60 | /* try to start the 16-bit winhelp */ |
| 61 | if (WinExec( "winhelp.exe -x", SW_SHOWNORMAL ) >= 32) |
| 62 | { |
Eric Pouech | 4d24e0f | 2000-12-22 23:25:47 +0000 | [diff] [blame] | 63 | K32WOWYield16(); |
Alexandre Julliard | d23a82b | 2001-09-19 20:37:04 +0000 | [diff] [blame] | 64 | ret = WinHelpA( WIN_Handle32(hWnd), lpHelpFile, wCommand, (DWORD)MapSL(dwData) ); |
Alexandre Julliard | d586dc9 | 2000-08-14 14:35:01 +0000 | [diff] [blame] | 65 | } |
| 66 | } |
| 67 | |
Alexandre Julliard | ab68797 | 2000-11-15 23:41:46 +0000 | [diff] [blame] | 68 | RestoreThunkLock( mutex_count ); |
Peter Ganten | 65b1f9f | 2000-01-05 02:41:12 +0000 | [diff] [blame] | 69 | return ret; |
Alexandre Julliard | 889f742 | 1997-04-15 17:19:52 +0000 | [diff] [blame] | 70 | } |
| 71 | |
| 72 | |
| 73 | /********************************************************************** |
Patrik Stridvall | 2ece70e | 2000-12-22 01:38:01 +0000 | [diff] [blame] | 74 | * WinHelpA (USER32.@) |
Alexandre Julliard | 889f742 | 1997-04-15 17:19:52 +0000 | [diff] [blame] | 75 | */ |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 76 | BOOL WINAPI WinHelpA( HWND hWnd, LPCSTR lpHelpFile, UINT wCommand, |
Alexandre Julliard | 670cdc4 | 1997-08-24 16:00:30 +0000 | [diff] [blame] | 77 | DWORD dwData ) |
Alexandre Julliard | 889f742 | 1997-04-15 17:19:52 +0000 | [diff] [blame] | 78 | { |
Alexandre Julliard | 44ed71f | 1997-12-21 19:17:50 +0000 | [diff] [blame] | 79 | static WORD WM_WINHELP = 0; |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 80 | HWND hDest; |
Alexandre Julliard | 889f742 | 1997-04-15 17:19:52 +0000 | [diff] [blame] | 81 | LPWINHELP lpwh; |
| 82 | HGLOBAL16 hwh; |
| 83 | int size,dsize,nlen; |
Alexandre Julliard | 44ed71f | 1997-12-21 19:17:50 +0000 | [diff] [blame] | 84 | |
Alexandre Julliard | 44ed71f | 1997-12-21 19:17:50 +0000 | [diff] [blame] | 85 | |
Vincent BĂ©ron | 9a62491 | 2002-05-31 23:06:46 +0000 | [diff] [blame] | 86 | if(!WM_WINHELP) |
Peter Ganten | 65b1f9f | 2000-01-05 02:41:12 +0000 | [diff] [blame] | 87 | { |
| 88 | WM_WINHELP=RegisterWindowMessageA("WM_WINHELP"); |
| 89 | if(!WM_WINHELP) |
| 90 | return FALSE; |
| 91 | } |
Alexandre Julliard | 44ed71f | 1997-12-21 19:17:50 +0000 | [diff] [blame] | 92 | |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 93 | hDest = FindWindowA( "MS_WINHELP", NULL ); |
Peter Ganten | 65b1f9f | 2000-01-05 02:41:12 +0000 | [diff] [blame] | 94 | if(!hDest) { |
Alexandre Julliard | d586dc9 | 2000-08-14 14:35:01 +0000 | [diff] [blame] | 95 | if(wCommand == HELP_QUIT) return TRUE; |
Marcus Meissner | 6f9c840 | 2000-10-29 01:17:24 +0000 | [diff] [blame] | 96 | if (WinExec ( "winhlp32.exe -x", SW_SHOWNORMAL ) < 32) { |
Andreas Mohr | c9cf70d | 2001-01-26 20:40:50 +0000 | [diff] [blame] | 97 | ERR("can't start winhlp32.exe -x ?\n"); |
Marcus Meissner | 6f9c840 | 2000-10-29 01:17:24 +0000 | [diff] [blame] | 98 | return FALSE; |
| 99 | } |
| 100 | if ( ! ( hDest = FindWindowA ( "MS_WINHELP", NULL ) )) { |
Andreas Mohr | c9cf70d | 2001-01-26 20:40:50 +0000 | [diff] [blame] | 101 | FIXME("did not find MS_WINHELP (FindWindow() failed, maybe global window handling still unimplemented)\n"); |
Marcus Meissner | 6f9c840 | 2000-10-29 01:17:24 +0000 | [diff] [blame] | 102 | return FALSE; |
| 103 | } |
Jesper Skov | 5c3e457 | 1998-11-01 19:27:22 +0000 | [diff] [blame] | 104 | } |
Peter Ganten | 65b1f9f | 2000-01-05 02:41:12 +0000 | [diff] [blame] | 105 | |
| 106 | |
Alexandre Julliard | 889f742 | 1997-04-15 17:19:52 +0000 | [diff] [blame] | 107 | switch(wCommand) |
| 108 | { |
| 109 | case HELP_CONTEXT: |
Alexandre Julliard | 889f742 | 1997-04-15 17:19:52 +0000 | [diff] [blame] | 110 | case HELP_SETCONTENTS: |
Alexandre Julliard | 77b9918 | 1997-09-14 17:17:23 +0000 | [diff] [blame] | 111 | case HELP_CONTENTS: |
Alexandre Julliard | 889f742 | 1997-04-15 17:19:52 +0000 | [diff] [blame] | 112 | case HELP_CONTEXTPOPUP: |
| 113 | case HELP_FORCEFILE: |
| 114 | case HELP_HELPONHELP: |
Alexandre Julliard | 77b9918 | 1997-09-14 17:17:23 +0000 | [diff] [blame] | 115 | case HELP_FINDER: |
Alexandre Julliard | 889f742 | 1997-04-15 17:19:52 +0000 | [diff] [blame] | 116 | case HELP_QUIT: |
| 117 | dsize=0; |
| 118 | break; |
| 119 | case HELP_KEY: |
| 120 | case HELP_PARTIALKEY: |
| 121 | case HELP_COMMAND: |
Rein Klazes | ba2c8d4 | 2000-04-29 14:15:11 +0000 | [diff] [blame] | 122 | dsize = dwData ? strlen( (LPSTR)dwData )+1: 0; |
Alexandre Julliard | 889f742 | 1997-04-15 17:19:52 +0000 | [diff] [blame] | 123 | break; |
| 124 | case HELP_MULTIKEY: |
Francois Gouget | 67c9691 | 2000-10-12 23:18:55 +0000 | [diff] [blame] | 125 | dsize = ((LPMULTIKEYHELPA)dwData)->mkSize; |
Alexandre Julliard | 889f742 | 1997-04-15 17:19:52 +0000 | [diff] [blame] | 126 | break; |
| 127 | case HELP_SETWINPOS: |
Francois Gouget | 67c9691 | 2000-10-12 23:18:55 +0000 | [diff] [blame] | 128 | dsize = ((LPHELPWININFOA)dwData)->wStructSize; |
Alexandre Julliard | 889f742 | 1997-04-15 17:19:52 +0000 | [diff] [blame] | 129 | break; |
| 130 | default: |
Marcus Meissner | 6f9c840 | 2000-10-29 01:17:24 +0000 | [diff] [blame] | 131 | FIXME("Unknown help command %d\n",wCommand); |
Alexandre Julliard | 889f742 | 1997-04-15 17:19:52 +0000 | [diff] [blame] | 132 | return FALSE; |
| 133 | } |
| 134 | if(lpHelpFile) |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 135 | nlen = strlen(lpHelpFile)+1; |
Alexandre Julliard | 889f742 | 1997-04-15 17:19:52 +0000 | [diff] [blame] | 136 | else |
| 137 | nlen = 0; |
| 138 | size = sizeof(WINHELP) + nlen + dsize; |
| 139 | hwh = GlobalAlloc16(0,size); |
| 140 | lpwh = GlobalLock16(hwh); |
| 141 | lpwh->size = size; |
| 142 | lpwh->command = wCommand; |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 143 | lpwh->data = dwData; |
Alexandre Julliard | 889f742 | 1997-04-15 17:19:52 +0000 | [diff] [blame] | 144 | if(nlen) { |
Alexandre Julliard | 889f742 | 1997-04-15 17:19:52 +0000 | [diff] [blame] | 145 | strcpy(((char*)lpwh) + sizeof(WINHELP),lpHelpFile); |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 146 | lpwh->ofsFilename = sizeof(WINHELP); |
| 147 | } else |
| 148 | lpwh->ofsFilename = 0; |
Alexandre Julliard | 889f742 | 1997-04-15 17:19:52 +0000 | [diff] [blame] | 149 | if(dsize) { |
| 150 | memcpy(((char*)lpwh)+sizeof(WINHELP)+nlen,(LPSTR)dwData,dsize); |
| 151 | lpwh->ofsData = sizeof(WINHELP)+nlen; |
| 152 | } else |
| 153 | lpwh->ofsData = 0; |
| 154 | GlobalUnlock16(hwh); |
| 155 | return SendMessage16(hDest,WM_WINHELP,hWnd,hwh); |
| 156 | } |
| 157 | |
| 158 | |
| 159 | /********************************************************************** |
Patrik Stridvall | 2ece70e | 2000-12-22 01:38:01 +0000 | [diff] [blame] | 160 | * WinHelpW (USER32.@) |
Alexandre Julliard | 889f742 | 1997-04-15 17:19:52 +0000 | [diff] [blame] | 161 | */ |
Alexandre Julliard | 193cf50 | 2002-01-01 00:24:30 +0000 | [diff] [blame] | 162 | BOOL WINAPI WinHelpW( HWND hWnd, LPCWSTR helpFile, UINT command, DWORD dwData ) |
Alexandre Julliard | 889f742 | 1997-04-15 17:19:52 +0000 | [diff] [blame] | 163 | { |
Alexandre Julliard | 193cf50 | 2002-01-01 00:24:30 +0000 | [diff] [blame] | 164 | INT len; |
| 165 | LPSTR file; |
| 166 | BOOL ret = FALSE; |
| 167 | |
| 168 | if (!helpFile) return WinHelpA( hWnd, NULL, command, dwData ); |
| 169 | |
| 170 | len = WideCharToMultiByte( CP_ACP, 0, helpFile, -1, NULL, 0, NULL, NULL ); |
| 171 | if ((file = HeapAlloc( GetProcessHeap(), 0, len ))) |
| 172 | { |
| 173 | WideCharToMultiByte( CP_ACP, 0, helpFile, -1, file, len, NULL, NULL ); |
| 174 | ret = WinHelpA( hWnd, file, command, dwData ); |
| 175 | HeapFree( GetProcessHeap(), 0, file ); |
| 176 | } |
Alexandre Julliard | 889f742 | 1997-04-15 17:19:52 +0000 | [diff] [blame] | 177 | return ret; |
| 178 | } |