diff --git a/reactos/base/applications/winhlp32/lang/it-IT.rc b/reactos/base/applications/winhlp32/lang/it-IT.rc index c929727791b..70c158780e9 100644 --- a/reactos/base/applications/winhlp32/lang/it-IT.rc +++ b/reactos/base/applications/winhlp32/lang/it-IT.rc @@ -39,21 +39,21 @@ MAIN_MENU MENU LANGUAGE LANG_ITALIAN, SUBLANG_NEUTRAL POPUP "&Segnalibro" { MENUITEM "&Definisci...", MNID_BKMK_DEFINE } - POPUP "&Options" { - POPUP "Help always visible" + POPUP "&Opzioni" { + POPUP "Aiuto sempre visibile" BEGIN - MENUITEM "Default", MNID_OPTS_HELP_DEFAULT - MENUITEM "Visible", MNID_OPTS_HELP_VISIBLE - MENUITEM "Non visible", MNID_OPTS_HELP_NONVISIBLE + MENUITEM "Predefinito", MNID_OPTS_HELP_DEFAULT + MENUITEM "Visibile", MNID_OPTS_HELP_VISIBLE + MENUITEM "Non visibile", MNID_OPTS_HELP_NONVISIBLE END - MENUITEM "History", MNID_OPTS_HISTORY - POPUP "Fonts" + MENUITEM "Cronologia", MNID_OPTS_HISTORY + POPUP "Caratteri" BEGIN - MENUITEM "Small", MNID_OPTS_FONTS_SMALL - MENUITEM "Normal", MNID_OPTS_FONTS_NORMAL - MENUITEM "Large", MNID_OPTS_FONTS_LARGE + MENUITEM "Piccolo", MNID_OPTS_FONTS_SMALL + MENUITEM "Normale", MNID_OPTS_FONTS_NORMAL + MENUITEM "Grande", MNID_OPTS_FONTS_LARGE END - MENUITEM "Use system colors", MNID_OPTS_SYSTEM_COLORS + MENUITEM "Usa colori di sistema", MNID_OPTS_SYSTEM_COLORS } POPUP "&?" { MENUITEM "&Aiuto sulla guida", MNID_HELP_HELPON @@ -61,7 +61,7 @@ MAIN_MENU MENU LANGUAGE LANG_ITALIAN, SUBLANG_NEUTRAL MENUITEM SEPARATOR MENUITEM "&Informazioni su...", MNID_HELP_ABOUT #ifdef WINELIB - MENUITEM "&Informazion su WINE", MNID_HELP_WINE + MENUITEM "&Informazioni su WINE", MNID_HELP_WINE #endif } } @@ -76,12 +76,12 @@ STID_WARNING, "ATTENZIONE" STID_INFO, "Informazione" STID_NOT_IMPLEMENTED, "Non ancora implementato" STID_HLPFILE_ERROR_s, "Errore di lettura del file della Guida `%s'" -STID_INDEX, "Index" +STID_INDEX, "Indice" STID_CONTENTS, "&Sommario" STID_BACK, "&Precedente" STID_ALL_FILES, "Tutti i file (*.*)" STID_HELP_FILES_HLP, "File della Guida (*.hlp)" -STID_FILE_NOT_FOUND_s "Cannot find '%s'. Do you want to find this file yourself?" -STID_NO_RICHEDIT "Cannot find a richedit implementation... Aborting" -STID_PSH_INDEX, "Help topics: " +STID_FILE_NOT_FOUND_s "Non è stato possibile trovare '%s'. Vuoi cercare questo file?" +STID_NO_RICHEDIT "Non è stato possibile trovare un'implementazione richedit... Annullando" +STID_PSH_INDEX, "Argomenti di aiuto: " } diff --git a/reactos/base/applications/winhlp32/lex.yy.c b/reactos/base/applications/winhlp32/lex.yy.c index b1d60a8d97b..bf0be672d32 100644 --- a/reactos/base/applications/winhlp32/lex.yy.c +++ b/reactos/base/applications/winhlp32/lex.yy.c @@ -380,9 +380,9 @@ static char *yy_last_accepting_cpos; #define YY_MORE_ADJ 0 #define YY_RESTORE_YY_MORE_OFFSET char *yytext; -#line 1 "macro.lex.l" +#line 1 ".\\macro.lex.l" #define INITIAL 0 -#line 2 "macro.lex.l" +#line 2 ".\\macro.lex.l" /* * Help Viewer * @@ -407,15 +407,20 @@ char *yytext; #define YY_NO_UNPUT 1 #define quote 1 -#line 26 "macro.lex.l" +#line 26 ".\\macro.lex.l" #include "config.h" #include +#include #ifndef HAVE_UNISTD_H #define YY_NO_UNISTD_H #endif -#include "macro.h" +#include "windef.h" +#include "winbase.h" +#include "wingdi.h" +#include "winuser.h" +#include "winhelp.h" #include "wine/debug.h" @@ -428,6 +433,7 @@ struct lex_data { unsigned quote_stk_idx; LPSTR cache_string[32]; int cache_used; + WINHELP_WINDOW* window; }; static struct lex_data* lex_data = NULL; @@ -436,7 +442,7 @@ struct lexret yylval; #define YY_INPUT(buf,result,max_size)\ if ((result = *lex_data->macroptr ? 1 : 0)) buf[0] = *lex_data->macroptr++; -#line 440 "lex.yy.c" +#line 446 "lex.yy.c" /* Macros after this point can all be overridden by user definitions in * section 1. @@ -587,10 +593,10 @@ YY_DECL register char *yy_cp, *yy_bp; register int yy_act; -#line 55 "macro.lex.l" +#line 61 ".\\macro.lex.l" -#line 594 "lex.yy.c" +#line 600 "lex.yy.c" if ( yy_init ) { @@ -675,32 +681,32 @@ do_action: /* This label is used only to access EOF actions. */ case 1: YY_RULE_SETUP -#line 57 "macro.lex.l" +#line 63 ".\\macro.lex.l" yylval.integer = strtol(yytext, NULL, 10); return INTEGER; YY_BREAK case 2: YY_RULE_SETUP -#line 58 "macro.lex.l" +#line 64 ".\\macro.lex.l" yylval.integer = strtol(yytext, NULL, 16); return INTEGER; YY_BREAK case 3: YY_RULE_SETUP -#line 60 "macro.lex.l" +#line 66 ".\\macro.lex.l" return MACRO_Lookup(yytext, &yylval); YY_BREAK case 4: -#line 63 "macro.lex.l" +#line 69 ".\\macro.lex.l" case 5: -#line 64 "macro.lex.l" +#line 70 ".\\macro.lex.l" case 6: -#line 65 "macro.lex.l" +#line 71 ".\\macro.lex.l" case 7: -#line 66 "macro.lex.l" +#line 72 ".\\macro.lex.l" case 8: -#line 67 "macro.lex.l" +#line 73 ".\\macro.lex.l" case 9: YY_RULE_SETUP -#line 67 "macro.lex.l" +#line 73 ".\\macro.lex.l" { if (lex_data->quote_stk_idx == 0 || (yytext[0] == '\"' && lex_data->quote_stack[lex_data->quote_stk_idx - 1] != '\"') || @@ -735,34 +741,34 @@ YY_RULE_SETUP YY_BREAK case 10: YY_RULE_SETUP -#line 99 "macro.lex.l" +#line 105 ".\\macro.lex.l" *lex_data->strptr++ = yytext[0]; YY_BREAK case 11: YY_RULE_SETUP -#line 100 "macro.lex.l" +#line 106 ".\\macro.lex.l" *lex_data->strptr++ = yytext[1]; YY_BREAK case YY_STATE_EOF(quote): -#line 101 "macro.lex.l" +#line 107 ".\\macro.lex.l" return 0; YY_BREAK case 12: YY_RULE_SETUP -#line 103 "macro.lex.l" +#line 109 ".\\macro.lex.l" YY_BREAK case 13: YY_RULE_SETUP -#line 104 "macro.lex.l" +#line 110 ".\\macro.lex.l" return yytext[0]; YY_BREAK case 14: YY_RULE_SETUP -#line 105 "macro.lex.l" +#line 111 ".\\macro.lex.l" ECHO; YY_BREAK -#line 766 "lex.yy.c" +#line 772 "lex.yy.c" case YY_STATE_EOF(INITIAL): yyterminate(); @@ -1648,7 +1654,7 @@ int main() return 0; } #endif -#line 105 "macro.lex.l" +#line 111 ".\\macro.lex.l" #if 0 @@ -1813,7 +1819,7 @@ static int MACRO_CallVoidFunc(FARPROC fn, const char* args) return 1; } -BOOL MACRO_ExecuteMacro(LPCSTR macro) +BOOL MACRO_ExecuteMacro(WINHELP_WINDOW* window, LPCSTR macro) { struct lex_data curr_lex_data, *prev_lex_data; BOOL ret = TRUE; @@ -1826,6 +1832,7 @@ BOOL MACRO_ExecuteMacro(LPCSTR macro) memset(lex_data, 0, sizeof(*lex_data)); lex_data->macroptr = macro; + lex_data->window = WINHELP_GrabWindow(window); while ((t = yylex()) != EMPTY) { @@ -1840,13 +1847,15 @@ BOOL MACRO_ExecuteMacro(LPCSTR macro) break; default: WINE_WARN("got unexpected type %s\n", ts(t)); - return 0; + YY_FLUSH_BUFFER; + ret = FALSE; + goto done; } switch (t = yylex()) { case EMPTY: goto done; case ';': break; - default: ret = FALSE; goto done; + default: ret = FALSE; YY_FLUSH_BUFFER; goto done; } } @@ -1854,10 +1863,16 @@ done: for (t = 0; t < lex_data->cache_used; t++) HeapFree(GetProcessHeap(), 0, lex_data->cache_string[t]); lex_data = prev_lex_data; + WINHELP_ReleaseWindow(window); return ret; } +WINHELP_WINDOW* MACRO_CurrentWindow(void) +{ + return lex_data ? lex_data->window : Globals.active_win; +} + #ifndef yywrap int yywrap(void) { return 1; } #endif diff --git a/reactos/base/applications/winhlp32/macro.c b/reactos/base/applications/winhlp32/macro.c index 9e6e5f8865e..c2fc3ccc710 100644 --- a/reactos/base/applications/winhlp32/macro.c +++ b/reactos/base/applications/winhlp32/macro.c @@ -68,7 +68,7 @@ static WINHELP_BUTTON** MACRO_LookupButton(WINHELP_WINDOW* win, LPCSTR na void CALLBACK MACRO_CreateButton(LPCSTR id, LPCSTR name, LPCSTR macro) { - WINHELP_WINDOW *win = Globals.active_win; + WINHELP_WINDOW *win = MACRO_CurrentWindow(); WINHELP_BUTTON *button, **b; LONG size; LPSTR ptr; @@ -115,7 +115,7 @@ void CALLBACK MACRO_DisableButton(LPCSTR id) WINE_TRACE("(\"%s\")\n", id); - b = MACRO_LookupButton(Globals.active_win, id); + b = MACRO_LookupButton(MACRO_CurrentWindow(), id); if (!*b) {WINE_FIXME("Couldn't find button '%s'\n", id); return;} EnableWindow((*b)->hWnd, FALSE); @@ -127,7 +127,7 @@ static void CALLBACK MACRO_EnableButton(LPCSTR id) WINE_TRACE("(\"%s\")\n", id); - b = MACRO_LookupButton(Globals.active_win, id); + b = MACRO_LookupButton(MACRO_CurrentWindow(), id); if (!*b) {WINE_FIXME("Couldn't find button '%s'\n", id); return;} EnableWindow((*b)->hWnd, TRUE); @@ -172,7 +172,7 @@ static void CALLBACK MACRO_AppendItem(LPCSTR str1, LPCSTR str2, LPCSTR str3, LPC static void CALLBACK MACRO_Back(void) { - WINHELP_WINDOW* win = Globals.active_win; + WINHELP_WINDOW* win = MACRO_CurrentWindow(); WINE_TRACE("()\n"); @@ -182,7 +182,7 @@ static void CALLBACK MACRO_Back(void) static void CALLBACK MACRO_BackFlush(void) { - WINHELP_WINDOW* win = Globals.active_win; + WINHELP_WINDOW* win = MACRO_CurrentWindow(); WINE_TRACE("()\n"); @@ -201,7 +201,7 @@ static void CALLBACK MACRO_BookmarkMore(void) static void CALLBACK MACRO_BrowseButtons(void) { - HLPFILE_PAGE* page = Globals.active_win->page; + HLPFILE_PAGE* page = MACRO_CurrentWindow()->page; ULONG relative; WINE_TRACE("()\n"); @@ -217,7 +217,7 @@ static void CALLBACK MACRO_BrowseButtons(void) static void CALLBACK MACRO_ChangeButtonBinding(LPCSTR id, LPCSTR macro) { - WINHELP_WINDOW* win = Globals.active_win; + WINHELP_WINDOW* win = MACRO_CurrentWindow(); WINHELP_BUTTON* button; WINHELP_BUTTON** b; LONG size; @@ -280,8 +280,8 @@ static void CALLBACK MACRO_CloseSecondarys(void) WINE_TRACE("()\n"); for (win = Globals.win_list; win; win = win->next) - if (win->lpszName && lstrcmpi(win->lpszName, "main")) - DestroyWindow(win->hMainWnd); + if (lstrcmpi(win->info->name, "main")) + WINHELP_ReleaseWindow(win); } static void CALLBACK MACRO_CloseWindow(LPCSTR lpszWindow) @@ -293,8 +293,8 @@ static void CALLBACK MACRO_CloseWindow(LPCSTR lpszWindow) if (!lpszWindow || !lpszWindow[0]) lpszWindow = "main"; for (win = Globals.win_list; win; win = win->next) - if (win->lpszName && !lstrcmpi(win->lpszName, lpszWindow)) - DestroyWindow(win->hMainWnd); + if (!lstrcmpi(win->info->name, lpszWindow)) + WINHELP_ReleaseWindow(win); } static void CALLBACK MACRO_Compare(LPCSTR str) @@ -304,10 +304,12 @@ static void CALLBACK MACRO_Compare(LPCSTR str) static void CALLBACK MACRO_Contents(void) { + HLPFILE_PAGE* page = MACRO_CurrentWindow()->page; + WINE_TRACE("()\n"); - if (Globals.active_win->page) - MACRO_JumpContents(Globals.active_win->page->file->lpszPath, NULL); + if (page) + MACRO_JumpContents(page->file->lpszPath, NULL); } static void CALLBACK MACRO_ControlPanel(LPCSTR str1, LPCSTR str2, LONG u) @@ -365,7 +367,7 @@ void CALLBACK MACRO_Exit(void) WINE_TRACE("()\n"); while (Globals.win_list) - DestroyWindow(Globals.win_list->hMainWnd); + WINHELP_ReleaseWindow(Globals.win_list); } static void CALLBACK MACRO_ExtAbleItem(LPCSTR str, LONG u) @@ -428,7 +430,7 @@ static void CALLBACK MACRO_FocusWindow(LPCSTR lpszWindow) if (!lpszWindow || !lpszWindow[0]) lpszWindow = "main"; for (win = Globals.win_list; win; win = win->next) - if (win->lpszName && !lstrcmpi(win->lpszName, lpszWindow)) + if (!lstrcmpi(win->info->name, lpszWindow)) SetFocus(win->hMainWnd); } @@ -447,7 +449,7 @@ void CALLBACK MACRO_HelpOn(void) LPCSTR file; WINE_TRACE("()\n"); - file = Globals.active_win->page->file->help_on_file; + file = MACRO_CurrentWindow()->page->file->help_on_file; if (!file) file = (Globals.wVersion > 4) ? "winhlp32.hlp" : "winhelp.hlp"; @@ -473,12 +475,13 @@ void CALLBACK MACRO_History(void) static void CALLBACK MACRO_IfThen(BOOL b, LPCSTR t) { - if (b) MACRO_ExecuteMacro(t); + if (b) MACRO_ExecuteMacro(MACRO_CurrentWindow(), t); } static void CALLBACK MACRO_IfThenElse(BOOL b, LPCSTR t, LPCSTR f) { - if (b) MACRO_ExecuteMacro(t); else MACRO_ExecuteMacro(f); + if (b) MACRO_ExecuteMacro(MACRO_CurrentWindow(), t); + else MACRO_ExecuteMacro(MACRO_CurrentWindow(), f); } static BOOL CALLBACK MACRO_InitMPrint(void) @@ -532,7 +535,10 @@ void CALLBACK MACRO_JumpHash(LPCSTR lpszPath, LPCSTR lpszWindow, LONG lHash) HLPFILE* hlpfile; WINE_TRACE("(\"%s\", \"%s\", %u)\n", lpszPath, lpszWindow, lHash); - hlpfile = WINHELP_LookupHelpFile(lpszPath); + if (!lpszPath || !lpszPath[0]) + hlpfile = MACRO_CurrentWindow()->page->file; + else + hlpfile = WINHELP_LookupHelpFile(lpszPath); WINHELP_OpenHelpWindow(HLPFILE_PageByHash, hlpfile, lHash, WINHELP_GetWindowInfo(hlpfile, lpszWindow), SW_NORMAL); @@ -599,12 +605,12 @@ static void CALLBACK MACRO_Next(void) WINHELP_WNDPAGE wp; WINE_TRACE("()\n"); - wp.page = Globals.active_win->page; + wp.page = MACRO_CurrentWindow()->page; wp.page = HLPFILE_PageByOffset(wp.page->file, wp.page->browse_fwd, &wp.relative); if (wp.page) { wp.page->file->wRefCount++; - wp.wininfo = Globals.active_win->info; + wp.wininfo = MACRO_CurrentWindow()->info; WINHELP_CreateHelpWindow(&wp, SW_NORMAL, TRUE); } } @@ -639,12 +645,12 @@ static void CALLBACK MACRO_Prev(void) WINHELP_WNDPAGE wp; WINE_TRACE("()\n"); - wp.page = Globals.active_win->page; + wp.page = MACRO_CurrentWindow()->page; wp.page = HLPFILE_PageByOffset(wp.page->file, wp.page->browse_bwd, &wp.relative); if (wp.page) { wp.page->file->wRefCount++; - wp.wininfo = Globals.active_win->info; + wp.wininfo = MACRO_CurrentWindow()->info; WINHELP_CreateHelpWindow(&wp, SW_NORMAL, TRUE); } } @@ -656,7 +662,7 @@ void CALLBACK MACRO_Print(void) WINE_TRACE("()\n"); printer.lStructSize = sizeof(printer); - printer.hwndOwner = Globals.active_win->hMainWnd; + printer.hwndOwner = MACRO_CurrentWindow()->hMainWnd; printer.hInstance = Globals.hInstance; printer.hDevMode = 0; printer.hDevNames = 0; @@ -774,19 +780,23 @@ void CALLBACK MACRO_SetContents(LPCSTR str, LONG u) static void CALLBACK MACRO_SetHelpOnFile(LPCSTR str) { + HLPFILE_PAGE* page = MACRO_CurrentWindow()->page; + WINE_TRACE("(\"%s\")\n", str); - HeapFree(GetProcessHeap(), 0, Globals.active_win->page->file->help_on_file); - Globals.active_win->page->file->help_on_file = HeapAlloc(GetProcessHeap(), 0, strlen(str) + 1); - if (Globals.active_win->page->file->help_on_file) - strcpy(Globals.active_win->page->file->help_on_file, str); + HeapFree(GetProcessHeap(), 0, page->file->help_on_file); + page->file->help_on_file = HeapAlloc(GetProcessHeap(), 0, strlen(str) + 1); + if (page->file->help_on_file) + strcpy(page->file->help_on_file, str); } static void CALLBACK MACRO_SetPopupColor(LONG r, LONG g, LONG b) { + HLPFILE_PAGE* page = MACRO_CurrentWindow()->page; + WINE_TRACE("(%x, %x, %x)\n", r, g, b); - Globals.active_win->page->file->has_popup_color = TRUE; - Globals.active_win->page->file->popup_color = RGB(r, g, b); + page->file->has_popup_color = TRUE; + page->file->popup_color = RGB(r, g, b); } static void CALLBACK MACRO_ShellExecute(LPCSTR str1, LPCSTR str2, LONG u1, LONG u2, LPCSTR str3, LPCSTR str4) @@ -911,7 +921,7 @@ static struct MacroDesc MACRO_Builtins[] = { {"MPrintHash", NULL, 0, "U", (FARPROC)MACRO_MPrintHash}, {"MPrintID", NULL, 0, "S", (FARPROC)MACRO_MPrintID}, {"Next", NULL, 0, "", (FARPROC)MACRO_Next}, - {"NoShow", NULL, 0, "", (FARPROC)MACRO_NoShow}, + {"NoShow", "NS", 0, "", (FARPROC)MACRO_NoShow}, {"PopupContext", "PC", 0, "SU", (FARPROC)MACRO_PopupContext}, {"PopupHash", NULL, 0, "SU", (FARPROC)MACRO_PopupHash}, {"PopupId", "PI", 0, "SS", (FARPROC)MACRO_PopupId}, diff --git a/reactos/base/applications/winhlp32/macro.h b/reactos/base/applications/winhlp32/macro.h index 8b157197ca5..910782db60c 100644 --- a/reactos/base/applications/winhlp32/macro.h +++ b/reactos/base/applications/winhlp32/macro.h @@ -33,9 +33,11 @@ struct lexret { }; extern struct lexret yylval; +struct tagWinHelp; -BOOL MACRO_ExecuteMacro(LPCSTR); -int MACRO_Lookup(const char* name, struct lexret* lr); +BOOL MACRO_ExecuteMacro(struct tagWinHelp*, LPCSTR); +int MACRO_Lookup(const char* name, struct lexret* lr); +struct tagWinHelp* MACRO_CurrentWindow(void); enum token_types {EMPTY, VOID_FUNCTION, BOOL_FUNCTION, INTEGER, STRING, IDENTIFIER}; void CALLBACK MACRO_About(void); diff --git a/reactos/base/applications/winhlp32/macro.lex.l b/reactos/base/applications/winhlp32/macro.lex.l index f3366b02bbd..67926cb9c63 100644 --- a/reactos/base/applications/winhlp32/macro.lex.l +++ b/reactos/base/applications/winhlp32/macro.lex.l @@ -25,12 +25,17 @@ %{ #include "config.h" #include +#include #ifndef HAVE_UNISTD_H #define YY_NO_UNISTD_H #endif -#include "macro.h" +#include "windef.h" +#include "winbase.h" +#include "wingdi.h" +#include "winuser.h" +#include "winhelp.h" #include "wine/debug.h" @@ -43,6 +48,7 @@ struct lex_data { unsigned quote_stk_idx; LPSTR cache_string[32]; int cache_used; + WINHELP_WINDOW* window; }; static struct lex_data* lex_data = NULL; @@ -266,7 +272,7 @@ static int MACRO_CallVoidFunc(FARPROC fn, const char* args) return 1; } -BOOL MACRO_ExecuteMacro(LPCSTR macro) +BOOL MACRO_ExecuteMacro(WINHELP_WINDOW* window, LPCSTR macro) { struct lex_data curr_lex_data, *prev_lex_data; BOOL ret = TRUE; @@ -279,6 +285,7 @@ BOOL MACRO_ExecuteMacro(LPCSTR macro) memset(lex_data, 0, sizeof(*lex_data)); lex_data->macroptr = macro; + lex_data->window = WINHELP_GrabWindow(window); while ((t = yylex()) != EMPTY) { @@ -293,13 +300,15 @@ BOOL MACRO_ExecuteMacro(LPCSTR macro) break; default: WINE_WARN("got unexpected type %s\n", ts(t)); - return 0; + YY_FLUSH_BUFFER; + ret = FALSE; + goto done; } switch (t = yylex()) { case EMPTY: goto done; case ';': break; - default: ret = FALSE; goto done; + default: ret = FALSE; YY_FLUSH_BUFFER; goto done; } } @@ -307,10 +316,16 @@ done: for (t = 0; t < lex_data->cache_used; t++) HeapFree(GetProcessHeap(), 0, lex_data->cache_string[t]); lex_data = prev_lex_data; + WINHELP_ReleaseWindow(window); return ret; } +WINHELP_WINDOW* MACRO_CurrentWindow(void) +{ + return lex_data ? lex_data->window : Globals.active_win; +} + #ifndef yywrap int yywrap(void) { return 1; } #endif diff --git a/reactos/base/applications/winhlp32/winhelp.c b/reactos/base/applications/winhlp32/winhelp.c index 7f74d8b75df..08d3875aba1 100644 --- a/reactos/base/applications/winhlp32/winhelp.c +++ b/reactos/base/applications/winhlp32/winhelp.c @@ -257,11 +257,11 @@ HLPFILE_WINDOWINFO* WINHELP_GetWindowInfo(HLPFILE* hlpfile, LPCSTR name) unsigned int i; if (!name || !name[0]) - name = Globals.active_win->lpszName; + name = Globals.active_win->info->name; if (hlpfile) for (i = 0; i < hlpfile->numWindows; i++) - if (!strcmp(hlpfile->windows[i].name, name)) + if (!lstrcmpi(hlpfile->windows[i].name, name)) return &hlpfile->windows[i]; if (strcmp(name, "main") != 0) @@ -274,11 +274,19 @@ HLPFILE_WINDOWINFO* WINHELP_GetWindowInfo(HLPFILE* hlpfile, LPCSTR name) { strcpy(mwi.type, "primary"); strcpy(mwi.name, "main"); - LoadString(Globals.hInstance, STID_WINE_HELP, mwi.caption, sizeof(mwi.caption)); + if (hlpfile && hlpfile->lpszTitle[0]) + { + char tmp[128]; + LoadString(Globals.hInstance, STID_WINE_HELP, tmp, sizeof(tmp)); + snprintf(mwi.caption, sizeof(mwi.caption), "%s %s - %s", + hlpfile->lpszTitle, tmp, hlpfile->lpszPath); + } + else + LoadString(Globals.hInstance, STID_WINE_HELP, mwi.caption, sizeof(mwi.caption)); mwi.origin.x = mwi.origin.y = mwi.size.cx = mwi.size.cy = CW_USEDEFAULT; mwi.style = SW_SHOW; mwi.win_style = WS_OVERLAPPEDWINDOW; - mwi.sr_color = mwi.sr_color = 0xFFFFFF; + mwi.sr_color = mwi.nsr_color = 0xFFFFFF; } return &mwi; } @@ -498,6 +506,33 @@ static void WINHELP_DeletePageLinks(HLPFILE_PAGE* page) } } +/*********************************************************************** + * + * WINHELP_GrabWindow + */ +WINHELP_WINDOW* WINHELP_GrabWindow(WINHELP_WINDOW* win) +{ + WINE_TRACE("Grab %p#%d++\n", win, win->ref_count); + win->ref_count++; + return win; +} + +/*********************************************************************** + * + * WINHELP_RelaseWindow + */ +BOOL WINHELP_ReleaseWindow(WINHELP_WINDOW* win) +{ + WINE_TRACE("Release %p#%d--\n", win, win->ref_count); + + if (!--win->ref_count) + { + DestroyWindow(win->hMainWnd); + return FALSE; + } + return TRUE; +} + /*********************************************************************** * * WINHELP_DeleteWindow @@ -505,6 +540,7 @@ static void WINHELP_DeletePageLinks(HLPFILE_PAGE* page) static void WINHELP_DeleteWindow(WINHELP_WINDOW* win) { WINHELP_WINDOW** w; + BOOL bExit; for (w = &Globals.win_list; *w; w = &(*w)->next) { @@ -514,6 +550,7 @@ static void WINHELP_DeleteWindow(WINHELP_WINDOW* win) break; } } + bExit = (Globals.wVersion >= 4 && !lstrcmpi(win->info->name, "main")); if (Globals.active_win == win) { @@ -537,6 +574,10 @@ static void WINHELP_DeleteWindow(WINHELP_WINDOW* win) if (win->page) HLPFILE_FreeHlpFile(win->page->file); HeapFree(GetProcessHeap(), 0, win); + + if (bExit) MACRO_Exit(); + if (!Globals.win_list) + PostQuitMessage(0); } static char* WINHELP_GetCaption(WINHELP_WNDPAGE* wpage) @@ -645,7 +686,6 @@ BOOL WINHELP_CreateHelpWindow(WINHELP_WNDPAGE* wpage, int nCmdShow, BOOL remembe { WINHELP_WINDOW* win = NULL; BOOL bPrimary, bPopup, bReUsed = FALSE; - LPSTR name; HICON hIcon; HWND hTextWnd = NULL; @@ -656,7 +696,7 @@ BOOL WINHELP_CreateHelpWindow(WINHELP_WNDPAGE* wpage, int nCmdShow, BOOL remembe { for (win = Globals.win_list; win; win = win->next) { - if (!lstrcmpi(win->lpszName, wpage->wininfo->name)) + if (!lstrcmpi(win->info->name, wpage->wininfo->name)) { POINT pt = {0, 0}; SIZE sz = {0, 0}; @@ -699,21 +739,19 @@ BOOL WINHELP_CreateHelpWindow(WINHELP_WNDPAGE* wpage, int nCmdShow, BOOL remembe if (!win) { /* Initialize WINHELP_WINDOW struct */ - win = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, - sizeof(WINHELP_WINDOW) + strlen(wpage->wininfo->name) + 1); + win = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(WINHELP_WINDOW)); if (!win) return FALSE; win->next = Globals.win_list; Globals.win_list = win; - name = (char*)win + sizeof(WINHELP_WINDOW); - lstrcpy(name, wpage->wininfo->name); - win->lpszName = name; win->hHandCur = LoadCursorW(0, (LPWSTR)IDC_HAND); win->back.index = 0; win->font_scale = 1; + WINHELP_GrabWindow(win); } win->page = wpage->page; win->info = wpage->wininfo; + WINHELP_GrabWindow(win); if (!bPopup && wpage->page && remember) { @@ -772,11 +810,19 @@ BOOL WINHELP_CreateHelpWindow(WINHELP_WNDPAGE* wpage, int nCmdShow, BOOL remembe { HLPFILE_MACRO *macro; for (macro = wpage->page->file->first_macro; macro; macro = macro->next) - MACRO_ExecuteMacro(macro->lpszMacro); + MACRO_ExecuteMacro(win, macro->lpszMacro); for (macro = wpage->page->first_macro; macro; macro = macro->next) - MACRO_ExecuteMacro(macro->lpszMacro); + MACRO_ExecuteMacro(win, macro->lpszMacro); } + /* See #17681, in some cases, the newly created window is closed by the macros it contains + * (braindead), so deal with this case + */ + for (win = Globals.win_list; win; win = win->next) + { + if (!lstrcmpi(win->info->name, wpage->wininfo->name)) break; + } + if (!win || !WINHELP_ReleaseWindow(win)) return TRUE; if (bPopup) { @@ -870,7 +916,7 @@ static BOOL WINHELP_HandleTextMouse(WINHELP_WINDOW* win, UINT msg, LPARAM lParam SW_NORMAL); break; case hlp_link_macro: - MACRO_ExecuteMacro(link->string); + MACRO_ExecuteMacro(win, link->string); break; default: WINE_FIXME("Unknown link cookie %d\n", link->cookie); @@ -888,7 +934,7 @@ static BOOL WINHELP_HandleTextMouse(WINHELP_WINDOW* win, UINT msg, LPARAM lParam */ static BOOL WINHELP_CheckPopup(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam, LRESULT* lret) { - HWND hPopup; + WINHELP_WINDOW* popup; if (!Globals.active_popup) return FALSE; @@ -921,9 +967,9 @@ static BOOL WINHELP_CheckPopup(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam case WM_NCLBUTTONDOWN: case WM_NCMBUTTONDOWN: case WM_NCRBUTTONDOWN: - hPopup = Globals.active_popup->hMainWnd; + popup = Globals.active_popup; Globals.active_popup = NULL; - DestroyWindow(hPopup); + WINHELP_ReleaseWindow(popup); return TRUE; } return FALSE; @@ -1368,7 +1414,7 @@ static LRESULT CALLBACK WINHELP_MainWndProc(HWND hWnd, UINT msg, WPARAM wParam, for (button = win->first_button; button; button = button->next) if (wParam == button->wParam) break; if (button) - MACRO_ExecuteMacro(button->lpszMacro); + MACRO_ExecuteMacro(win, button->lpszMacro); else if (!HIWORD(wParam)) MessageBox(0, MAKEINTRESOURCE(STID_NOT_IMPLEMENTED), MAKEINTRESOURCE(STID_WHERROR), MB_OK); @@ -1427,7 +1473,8 @@ static LRESULT CALLBACK WINHELP_MainWndProc(HWND hWnd, UINT msg, WPARAM wParam, switch (msgf->msg) { case WM_KEYUP: - if (msgf->wParam == VK_ESCAPE) DestroyWindow(hWnd); + if (msgf->wParam == VK_ESCAPE) + WINHELP_ReleaseWindow((WINHELP_WINDOW*)GetWindowLongPtr(hWnd, 0)); break; case WM_RBUTTONDOWN: { @@ -1491,18 +1538,9 @@ static LRESULT CALLBACK WINHELP_MainWndProc(HWND hWnd, UINT msg, WPARAM wParam, CheckMenuItem((HMENU)wParam, MNID_OPTS_FONTS_LARGE, MF_BYCOMMAND | (win->font_scale == 2) ? MF_CHECKED : 0); break; - - case WM_NCDESTROY: - { - BOOL bExit; - win = (WINHELP_WINDOW*) GetWindowLongPtr(hWnd, 0); - bExit = (Globals.wVersion >= 4 && !lstrcmpi(win->lpszName, "main")); - WINHELP_DeleteWindow(win); - - if (bExit) MACRO_Exit(); - if (!Globals.win_list) - PostQuitMessage(0); - } + case WM_DESTROY: + win = (WINHELP_WINDOW*) GetWindowLongPtr(hWnd, 0); + WINHELP_DeleteWindow(win); break; } return DefWindowProc(hWnd, msg, wParam, lParam); diff --git a/reactos/base/applications/winhlp32/winhelp.h b/reactos/base/applications/winhlp32/winhelp.h index 994547bf31b..e770cb5794b 100644 --- a/reactos/base/applications/winhlp32/winhelp.h +++ b/reactos/base/applications/winhlp32/winhelp.h @@ -71,8 +71,7 @@ typedef struct tagPageSet typedef struct tagWinHelp { - LPCSTR lpszName; - + unsigned ref_count; WINHELP_BUTTON* first_button; HLPFILE_PAGE* page; @@ -153,6 +152,8 @@ void WINHELP_DeleteBackSet(WINHELP_WINDOW*); HLPFILE* WINHELP_LookupHelpFile(LPCSTR lpszFile); HLPFILE_WINDOWINFO* WINHELP_GetWindowInfo(HLPFILE* hlpfile, LPCSTR name); void WINHELP_LayoutMainWindow(WINHELP_WINDOW* win); +WINHELP_WINDOW* WINHELP_GrabWindow(WINHELP_WINDOW*); +BOOL WINHELP_ReleaseWindow(WINHELP_WINDOW*); extern const char MAIN_WIN_CLASS_NAME[]; extern const char BUTTON_BOX_WIN_CLASS_NAME[]; diff --git a/reactos/base/applications/wordpad/De.rc b/reactos/base/applications/wordpad/De.rc index 5b4b176a905..a2fcceb61c4 100644 --- a/reactos/base/applications/wordpad/De.rc +++ b/reactos/base/applications/wordpad/De.rc @@ -242,6 +242,7 @@ BEGIN STRING_OPEN_FAILED, "Die Datei konnte nicht geöffnet werden." STRING_OPEN_ACCESS_DENIED, "Sie haben keine ausreichende Zugriffsberechtigung um die Datei zu öffnen." STRING_PRINTING_NOT_IMPLEMENTED, "Drucken ist nicht implementiert" + STRING_MAX_TAB_STOPS, "Es können nur maximal 32 Tabstopps definiert werden." END #pragma code_page(default) diff --git a/reactos/base/applications/wordpad/Fr.rc b/reactos/base/applications/wordpad/Fr.rc index 459dd0ed82b..72f7c70e845 100644 --- a/reactos/base/applications/wordpad/Fr.rc +++ b/reactos/base/applications/wordpad/Fr.rc @@ -1,5 +1,5 @@ /* - * Copyright 2006-2007 by Jonathan Ernst + * Copyright 2006-2009 by Jonathan Ernst * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -240,4 +240,5 @@ BEGIN STRING_OPEN_FAILED, "Impossible d'ouvrir le fichier." STRING_OPEN_ACCESS_DENIED, "Vous ne disposez pas des accs ncessaires l'ouverture du fichier." STRING_PRINTING_NOT_IMPLEMENTED, "L'impression n'est pas implmente" + STRING_MAX_TAB_STOPS, "Impossible d'ajouter plus de 32 taquets de tabulation." END diff --git a/reactos/base/applications/wordpad/Si.rc b/reactos/base/applications/wordpad/Si.rc index 3be81b82c45..5e349580a24 100644 --- a/reactos/base/applications/wordpad/Si.rc +++ b/reactos/base/applications/wordpad/Si.rc @@ -242,7 +242,8 @@ BEGIN STRING_WRITE_ACCESS_DENIED, "Nimate pravic za shranjevanje te datoteke." STRING_OPEN_FAILED, "Napaka pri odpiranju datoteke." STRING_OPEN_ACCESS_DENIED, "Nimate pravic za odpiranje te datoteke." - STRING_PRINTING_NOT_IMPLEMENTED, "Tiskanje (še) ni na voljo" + STRING_PRINTING_NOT_IMPLEMENTED, "Tiskanje (še) ni na voljo" + STRING_MAX_TAB_STOPS, "Ne morem vstaviti več kot 32 položajev tabulatorja." END #pragma code_page(default)