Alexandre Julliard | 889f742 | 1997-04-15 17:19:52 +0000 | [diff] [blame] | 1 | /* |
| 2 | * Windows Help |
| 3 | */ |
| 4 | |
| 5 | #include <stdlib.h> |
| 6 | #include <stdio.h> |
| 7 | #include <string.h> |
| 8 | #include <unistd.h> |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 9 | #include "debugtools.h" |
Jeremy White | d3e22d9 | 2000-02-10 19:03:02 +0000 | [diff] [blame] | 10 | #include "windef.h" |
| 11 | #include "wingdi.h" |
Michael Veksler | ca1bc86 | 1999-01-01 18:57:33 +0000 | [diff] [blame] | 12 | #include "wine/winuser16.h" |
Michael Veksler | f935c59 | 1999-02-09 15:49:39 +0000 | [diff] [blame] | 13 | #include "wine/winbase16.h" |
Alexandre Julliard | 889f742 | 1997-04-15 17:19:52 +0000 | [diff] [blame] | 14 | #include "heap.h" |
| 15 | #include "ldt.h" |
Peter Ganten | 65b1f9f | 2000-01-05 02:41:12 +0000 | [diff] [blame] | 16 | #include "syslevel.h" |
Alexandre Julliard | 889f742 | 1997-04-15 17:19:52 +0000 | [diff] [blame] | 17 | |
Alexandre Julliard | d586dc9 | 2000-08-14 14:35:01 +0000 | [diff] [blame^] | 18 | DEFAULT_DEBUG_CHANNEL(win); |
Patrik Stridvall | b4b9fae | 1999-04-19 14:56:29 +0000 | [diff] [blame] | 19 | |
Alexandre Julliard | 889f742 | 1997-04-15 17:19:52 +0000 | [diff] [blame] | 20 | |
| 21 | /********************************************************************** |
| 22 | * WinHelp16 (USER.171) |
| 23 | */ |
Alexandre Julliard | 670cdc4 | 1997-08-24 16:00:30 +0000 | [diff] [blame] | 24 | BOOL16 WINAPI WinHelp16( HWND16 hWnd, LPCSTR lpHelpFile, UINT16 wCommand, |
| 25 | DWORD dwData ) |
Alexandre Julliard | 889f742 | 1997-04-15 17:19:52 +0000 | [diff] [blame] | 26 | { |
Peter Ganten | 65b1f9f | 2000-01-05 02:41:12 +0000 | [diff] [blame] | 27 | BOOL ret; |
| 28 | /* We might call WinExec() */ |
| 29 | SYSLEVEL_ReleaseWin16Lock(); |
Alexandre Julliard | d586dc9 | 2000-08-14 14:35:01 +0000 | [diff] [blame^] | 30 | |
| 31 | if (!(ret = WinHelpA( hWnd, lpHelpFile, wCommand, (DWORD)PTR_SEG_TO_LIN(dwData) ))) |
| 32 | { |
| 33 | /* try to start the 16-bit winhelp */ |
| 34 | if (WinExec( "winhelp.exe -x", SW_SHOWNORMAL ) >= 32) |
| 35 | { |
| 36 | Yield16(); |
| 37 | ret = WinHelpA( hWnd, lpHelpFile, wCommand, (DWORD)PTR_SEG_TO_LIN(dwData) ); |
| 38 | } |
| 39 | } |
| 40 | |
Peter Ganten | 65b1f9f | 2000-01-05 02:41:12 +0000 | [diff] [blame] | 41 | SYSLEVEL_RestoreWin16Lock(); |
| 42 | return ret; |
Alexandre Julliard | 889f742 | 1997-04-15 17:19:52 +0000 | [diff] [blame] | 43 | } |
| 44 | |
| 45 | |
| 46 | /********************************************************************** |
Patrik Stridvall | 2d6457c | 2000-03-28 20:22:59 +0000 | [diff] [blame] | 47 | * WinHelpA (USER32.579) |
Alexandre Julliard | 889f742 | 1997-04-15 17:19:52 +0000 | [diff] [blame] | 48 | */ |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 49 | BOOL WINAPI WinHelpA( HWND hWnd, LPCSTR lpHelpFile, UINT wCommand, |
Alexandre Julliard | 670cdc4 | 1997-08-24 16:00:30 +0000 | [diff] [blame] | 50 | DWORD dwData ) |
Alexandre Julliard | 889f742 | 1997-04-15 17:19:52 +0000 | [diff] [blame] | 51 | { |
Alexandre Julliard | 44ed71f | 1997-12-21 19:17:50 +0000 | [diff] [blame] | 52 | static WORD WM_WINHELP = 0; |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 53 | HWND hDest; |
Alexandre Julliard | 889f742 | 1997-04-15 17:19:52 +0000 | [diff] [blame] | 54 | LPWINHELP lpwh; |
| 55 | HGLOBAL16 hwh; |
| 56 | int size,dsize,nlen; |
Alexandre Julliard | 44ed71f | 1997-12-21 19:17:50 +0000 | [diff] [blame] | 57 | |
Alexandre Julliard | 44ed71f | 1997-12-21 19:17:50 +0000 | [diff] [blame] | 58 | |
| 59 | if(!WM_WINHELP) |
Peter Ganten | 65b1f9f | 2000-01-05 02:41:12 +0000 | [diff] [blame] | 60 | { |
| 61 | WM_WINHELP=RegisterWindowMessageA("WM_WINHELP"); |
| 62 | if(!WM_WINHELP) |
| 63 | return FALSE; |
| 64 | } |
Alexandre Julliard | 44ed71f | 1997-12-21 19:17:50 +0000 | [diff] [blame] | 65 | |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 66 | hDest = FindWindowA( "MS_WINHELP", NULL ); |
Peter Ganten | 65b1f9f | 2000-01-05 02:41:12 +0000 | [diff] [blame] | 67 | if(!hDest) { |
Alexandre Julliard | d586dc9 | 2000-08-14 14:35:01 +0000 | [diff] [blame^] | 68 | if(wCommand == HELP_QUIT) return TRUE; |
| 69 | if (WinExec ( "winhlp32.exe -x", SW_SHOWNORMAL ) < 32) return FALSE; |
Peter Ganten | 65b1f9f | 2000-01-05 02:41:12 +0000 | [diff] [blame] | 70 | if ( ! ( hDest = FindWindowA ( "MS_WINHELP", NULL ) )) return FALSE; |
Jesper Skov | 5c3e457 | 1998-11-01 19:27:22 +0000 | [diff] [blame] | 71 | } |
Peter Ganten | 65b1f9f | 2000-01-05 02:41:12 +0000 | [diff] [blame] | 72 | |
| 73 | |
Alexandre Julliard | 889f742 | 1997-04-15 17:19:52 +0000 | [diff] [blame] | 74 | switch(wCommand) |
| 75 | { |
| 76 | case HELP_CONTEXT: |
Alexandre Julliard | 889f742 | 1997-04-15 17:19:52 +0000 | [diff] [blame] | 77 | case HELP_SETCONTENTS: |
Alexandre Julliard | 77b9918 | 1997-09-14 17:17:23 +0000 | [diff] [blame] | 78 | case HELP_CONTENTS: |
Alexandre Julliard | 889f742 | 1997-04-15 17:19:52 +0000 | [diff] [blame] | 79 | case HELP_CONTEXTPOPUP: |
| 80 | case HELP_FORCEFILE: |
| 81 | case HELP_HELPONHELP: |
Alexandre Julliard | 77b9918 | 1997-09-14 17:17:23 +0000 | [diff] [blame] | 82 | case HELP_FINDER: |
Alexandre Julliard | 889f742 | 1997-04-15 17:19:52 +0000 | [diff] [blame] | 83 | case HELP_QUIT: |
| 84 | dsize=0; |
| 85 | break; |
| 86 | case HELP_KEY: |
| 87 | case HELP_PARTIALKEY: |
| 88 | case HELP_COMMAND: |
Rein Klazes | ba2c8d4 | 2000-04-29 14:15:11 +0000 | [diff] [blame] | 89 | dsize = dwData ? strlen( (LPSTR)dwData )+1: 0; |
Alexandre Julliard | 889f742 | 1997-04-15 17:19:52 +0000 | [diff] [blame] | 90 | break; |
| 91 | case HELP_MULTIKEY: |
| 92 | dsize = ((LPMULTIKEYHELP)dwData)->mkSize; |
| 93 | break; |
| 94 | case HELP_SETWINPOS: |
| 95 | dsize = ((LPHELPWININFO)dwData)->wStructSize; |
| 96 | break; |
| 97 | default: |
Alexandre Julliard | 359f497e | 1999-07-04 16:02:24 +0000 | [diff] [blame] | 98 | WARN("Unknown help command %d\n",wCommand); |
Alexandre Julliard | 889f742 | 1997-04-15 17:19:52 +0000 | [diff] [blame] | 99 | return FALSE; |
| 100 | } |
| 101 | if(lpHelpFile) |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 102 | nlen = strlen(lpHelpFile)+1; |
Alexandre Julliard | 889f742 | 1997-04-15 17:19:52 +0000 | [diff] [blame] | 103 | else |
| 104 | nlen = 0; |
| 105 | size = sizeof(WINHELP) + nlen + dsize; |
| 106 | hwh = GlobalAlloc16(0,size); |
| 107 | lpwh = GlobalLock16(hwh); |
| 108 | lpwh->size = size; |
| 109 | lpwh->command = wCommand; |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 110 | lpwh->data = dwData; |
Alexandre Julliard | 889f742 | 1997-04-15 17:19:52 +0000 | [diff] [blame] | 111 | if(nlen) { |
Alexandre Julliard | 889f742 | 1997-04-15 17:19:52 +0000 | [diff] [blame] | 112 | strcpy(((char*)lpwh) + sizeof(WINHELP),lpHelpFile); |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 113 | lpwh->ofsFilename = sizeof(WINHELP); |
| 114 | } else |
| 115 | lpwh->ofsFilename = 0; |
Alexandre Julliard | 889f742 | 1997-04-15 17:19:52 +0000 | [diff] [blame] | 116 | if(dsize) { |
| 117 | memcpy(((char*)lpwh)+sizeof(WINHELP)+nlen,(LPSTR)dwData,dsize); |
| 118 | lpwh->ofsData = sizeof(WINHELP)+nlen; |
| 119 | } else |
| 120 | lpwh->ofsData = 0; |
| 121 | GlobalUnlock16(hwh); |
| 122 | return SendMessage16(hDest,WM_WINHELP,hWnd,hwh); |
| 123 | } |
| 124 | |
| 125 | |
| 126 | /********************************************************************** |
Patrik Stridvall | 2d6457c | 2000-03-28 20:22:59 +0000 | [diff] [blame] | 127 | * WinHelpW (USER32.580) |
Alexandre Julliard | 889f742 | 1997-04-15 17:19:52 +0000 | [diff] [blame] | 128 | */ |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 129 | BOOL WINAPI WinHelpW( HWND hWnd, LPCWSTR helpFile, UINT command, |
Alexandre Julliard | 670cdc4 | 1997-08-24 16:00:30 +0000 | [diff] [blame] | 130 | DWORD dwData ) |
Alexandre Julliard | 889f742 | 1997-04-15 17:19:52 +0000 | [diff] [blame] | 131 | { |
| 132 | LPSTR file = HEAP_strdupWtoA( GetProcessHeap(), 0, helpFile ); |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 133 | BOOL ret = WinHelpA( hWnd, file, command, dwData ); |
Alexandre Julliard | 889f742 | 1997-04-15 17:19:52 +0000 | [diff] [blame] | 134 | HeapFree( GetProcessHeap(), 0, file ); |
| 135 | return ret; |
| 136 | } |