From 4eb2881b5b356043f529cf6b973034a14a82ed6b Mon Sep 17 00:00:00 2001 From: kichik Date: Sat, 6 Dec 2003 20:45:35 +0000 Subject: [PATCH] - Better RTL support: * use RTL reading wherever possible (shows the dots, commas, etc. in the correct order) * Message boxes are now RTL too * Fixed RTL for links in InstallOptions - Fixed tab order in StartMenu - Made StartMenu use SHGetSpecialFolderLocation (soon to be in NSIS core too) git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@3259 212acab6-be3b-0410-9dea-997c60f758d6 --- Contrib/InstallOptions/InstallerOptions.cpp | 141 ++++++++++---------- Contrib/Language files/Hebrew.nlf | 30 ++--- Contrib/Modern UI/Language files/Hebrew.nsh | 66 ++++----- Contrib/StartMenu/StartMenu.c | 65 ++++----- Plugins/InstallOptions.dll | Bin 12288 -> 12288 bytes Plugins/StartMenu.dll | Bin 6656 -> 6656 bytes Source/DialogTemplate.cpp | 25 ++-- Source/exehead/Ui.c | 3 +- Source/exehead/fileform.h | 1 + Source/exehead/util.c | 5 +- Source/lang.cpp | 8 ++ 11 files changed, 186 insertions(+), 158 deletions(-) diff --git a/Contrib/InstallOptions/InstallerOptions.cpp b/Contrib/InstallOptions/InstallerOptions.cpp index 23ab8f17..4f755631 100644 --- a/Contrib/InstallOptions/InstallerOptions.cpp +++ b/Contrib/InstallOptions/InstallerOptions.cpp @@ -566,8 +566,8 @@ int WINAPI ReadSettings(void) { LRESULT WINAPI WMCommandProc(HWND hWnd, UINT id, HWND hwndCtl, UINT codeNotify) { - switch (codeNotify) { - case BN_CLICKED: + switch (codeNotify) { + case BN_CLICKED: { char szBrowsePath[MAX_PATH]; int nIdx = FindControlIdx(id); @@ -659,8 +659,8 @@ LRESULT WINAPI WMCommandProc(HWND hWnd, UINT id, HWND hwndCtl, UINT codeNotify) } } break; - } - return 0; + } + return 0; } @@ -691,61 +691,66 @@ BOOL CALLBACK ParentWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lPara return bRes; } -BOOL CALLBACK cfgDlgProc(HWND hwndDlg, - UINT uMsg, - WPARAM wParam, - LPARAM lParam) +BOOL CALLBACK cfgDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { HANDLE_MSG(hwndDlg, WM_COMMAND, WMCommandProc); case WM_DRAWITEM: { - DRAWITEMSTRUCT* lpdis = (DRAWITEMSTRUCT*)lParam; - int nIdx = FindControlIdx(lpdis->CtlID); + DRAWITEMSTRUCT* lpdis = (DRAWITEMSTRUCT*)lParam; + int nIdx = FindControlIdx(lpdis->CtlID); #ifdef IO_LINK_UNDERLINED - HFONT OldFont; - LOGFONT lf; + HFONT OldFont; + LOGFONT lf; #endif - if (nIdx < 0) - break; - FieldType *pField = pFields + nIdx; - -#ifdef IO_LINK_UNDERLINED - GetObject(GetCurrentObject(lpdis->hDC, OBJ_FONT), sizeof(lf), &lf); - lf.lfUnderline = TRUE; - OldFont = (HFONT)SelectObject(lpdis->hDC, CreateFontIndirect(&lf)); -#endif - // Set up tranparent background - HBRUSH brush = (HBRUSH)GetWindowLong(lpdis->hwndItem, GWL_USERDATA); - if ( brush ) - FillRect(lpdis->hDC, &lpdis->rcItem, brush); - - if ( ( lpdis->itemState & ODS_FOCUS && lpdis->itemAction & ODA_DRAWENTIRE) || (lpdis->itemAction & ODA_FOCUS) || - (lpdis->itemAction & ODA_SELECT)) - DrawFocusRect(lpdis->hDC, &pField->rect); - - SetTextColor(lpdis->hDC, (COLORREF)pField->hImage); - - pField->rect = lpdis->rcItem; - // Calculate needed size of the control - DrawText(lpdis->hDC, pField->pszText, -1, &pField->rect, DT_LEFT | DT_VCENTER | DT_SINGLELINE | DT_CALCRECT); - pField->rect.right += 4; - pField->rect.bottom = lpdis->rcItem.bottom; - // Resize but don't move - SetWindowPos(lpdis->hwndItem, NULL, 0, 0, pField->rect.right - pField->rect.left, - pField->rect.bottom - pField->rect.top, SWP_NOZORDER | SWP_NOMOVE | SWP_NOACTIVATE); - // Draw the text - lpdis->rcItem = pField->rect; - // Add little margin to avoid focus rect over text - lpdis->rcItem.right += 2; lpdis->rcItem.left += 2; - - DrawText(lpdis->hDC, pField->pszText, -1, &lpdis->rcItem, DT_LEFT | DT_VCENTER | DT_SINGLELINE ); -#ifdef IO_LINK_UNDERLINED - DeleteObject(SelectObject(lpdis->hDC, OldFont)); -#endif + if (nIdx < 0) break; + FieldType *pField = pFields + nIdx; + +#ifdef IO_LINK_UNDERLINED + GetObject(GetCurrentObject(lpdis->hDC, OBJ_FONT), sizeof(lf), &lf); + lf.lfUnderline = TRUE; + OldFont = (HFONT)SelectObject(lpdis->hDC, CreateFontIndirect(&lf)); +#endif + + // We need lpdis->rcItem later + RECT rc = lpdis->rcItem; + + // Get TxtColor unless the user has set another using SetCtlColors + if (!GetWindowLong(lpdis->hwndItem, GWL_USERDATA)) + SetTextColor(lpdis->hDC, (COLORREF) pField->hImage); + + // Calculate needed size of the control + DrawText(lpdis->hDC, pField->pszText, -1, &rc, DT_VCENTER | DT_SINGLELINE | DT_CALCRECT); + + // Move rect to right if in RTL mode + if (bRTL) + { + rc.left += lpdis->rcItem.right - rc.right; + rc.right += lpdis->rcItem.right - rc.right; + } + + // Make some more room so the focus rect won't cut letters off + rc.left = max(rc.left - 2, lpdis->rcItem.left); + rc.right = min(rc.right + 2, lpdis->rcItem.right); + /*rc.top = max(rc.top - 2, lpdis->rcItem.top); + rc.bottom = min(rc.bottom + 2, lpdis->rcItem.bottom);*/ + + // Draw the text + DrawText(lpdis->hDC, pField->pszText, -1, &rc, DT_CENTER | DT_VCENTER | DT_SINGLELINE | (bRTL ? DT_RTLREADING : 0)); + + // Draw the focus rect if needed + if (((lpdis->itemState & ODS_FOCUS) && (lpdis->itemAction & ODA_DRAWENTIRE)) || (lpdis->itemAction & ODA_FOCUS) || (lpdis->itemAction & ODA_SELECT)) + { + DrawFocusRect(lpdis->hDC, &rc); + } + +#ifdef IO_LINK_UNDERLINED + DeleteObject(SelectObject(lpdis->hDC, OldFont)); +#endif + break; } case WM_CTLCOLORSTATIC: case WM_CTLCOLOREDIT: @@ -753,7 +758,7 @@ BOOL CALLBACK cfgDlgProc(HWND hwndDlg, case WM_CTLCOLORBTN: case WM_CTLCOLORLISTBOX: { - ctlcolors *c = (ctlcolors *)GetWindowLong((HWND)lParam, GWL_USERDATA); + ctlcolors *c = (ctlcolors *) GetWindowLong((HWND) lParam, GWL_USERDATA); if (c) { SetBkMode((HDC)wParam, c->bkmode); @@ -766,7 +771,7 @@ BOOL CALLBACK cfgDlgProc(HWND hwndDlg, } } } - return 0; + return 0; } #ifdef IO_ENABLE_LINK @@ -908,47 +913,47 @@ int WINAPI createCfgDlg() DEFAULT_STYLES /*| WS_TABSTOP*/, DEFAULT_STYLES | SS_RIGHT /*| WS_TABSTOP*/, WS_EX_TRANSPARENT, - WS_EX_TRANSPARENT }, + WS_EX_TRANSPARENT | WS_EX_RTLREADING }, { "STATIC", // FIELD_ICON DEFAULT_STYLES /*| WS_TABSTOP*/ | SS_ICON, DEFAULT_STYLES /*| WS_TABSTOP*/ | SS_ICON, 0, - 0 }, + WS_EX_RTLREADING }, { "STATIC", // FIELD_BITMAP DEFAULT_STYLES /*| WS_TABSTOP*/ | SS_BITMAP | SS_CENTERIMAGE, DEFAULT_STYLES /*| WS_TABSTOP*/ | SS_BITMAP | SS_CENTERIMAGE, 0, - 0 }, + WS_EX_RTLREADING }, { "BUTTON", // FIELD_BROWSEBUTTON DEFAULT_STYLES | WS_TABSTOP, DEFAULT_STYLES | WS_TABSTOP, 0, - 0 }, + WS_EX_RTLREADING }, { "BUTTON", // FIELD_CHECKBOX DEFAULT_STYLES | WS_TABSTOP | BS_TEXT | BS_VCENTER | BS_AUTOCHECKBOX | BS_MULTILINE, DEFAULT_STYLES | WS_TABSTOP | BS_TEXT | BS_VCENTER | BS_AUTOCHECKBOX | BS_MULTILINE | BS_RIGHT | BS_LEFTTEXT, 0, - 0 }, + WS_EX_RTLREADING }, { "BUTTON", // FIELD_RADIOBUTTON DEFAULT_STYLES | WS_TABSTOP | BS_TEXT | BS_VCENTER | BS_AUTORADIOBUTTON | BS_MULTILINE, DEFAULT_STYLES | WS_TABSTOP | BS_TEXT | BS_VCENTER | BS_AUTORADIOBUTTON | BS_MULTILINE | BS_RIGHT | BS_LEFTTEXT, 0, - 0 }, + WS_EX_RTLREADING }, { "EDIT", // FIELD_TEXT DEFAULT_STYLES | WS_TABSTOP | ES_AUTOHSCROLL, DEFAULT_STYLES | WS_TABSTOP | ES_AUTOHSCROLL | ES_RIGHT, WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE, - WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE }, + WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE | WS_EX_RTLREADING }, { "EDIT", // FIELD_FILEREQUEST DEFAULT_STYLES | WS_TABSTOP | ES_AUTOHSCROLL, DEFAULT_STYLES | WS_TABSTOP | ES_AUTOHSCROLL | ES_RIGHT, WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE, - WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE }, + WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE | WS_EX_RTLREADING }, { "EDIT", // FIELD_DIRREQUEST DEFAULT_STYLES | WS_TABSTOP | ES_AUTOHSCROLL, DEFAULT_STYLES | WS_TABSTOP | ES_AUTOHSCROLL | ES_RIGHT, WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE, - WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE }, + WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE | WS_EX_RTLREADING }, { "COMBOBOX", // FIELD_COMBOBOX DEFAULT_STYLES | WS_TABSTOP | WS_VSCROLL | WS_CLIPCHILDREN | CBS_AUTOHSCROLL | CBS_HASSTRINGS, DEFAULT_STYLES | WS_TABSTOP | WS_VSCROLL | WS_CLIPCHILDREN | CBS_AUTOHSCROLL | CBS_HASSTRINGS, @@ -963,17 +968,17 @@ int WINAPI createCfgDlg() DEFAULT_STYLES | BS_GROUPBOX, DEFAULT_STYLES | BS_GROUPBOX | BS_RIGHT, WS_EX_TRANSPARENT, - WS_EX_TRANSPARENT }, + WS_EX_TRANSPARENT | WS_EX_RTLREADING }, { "BUTTON", // FIELD_LINK DEFAULT_STYLES | WS_TABSTOP | BS_OWNERDRAW, DEFAULT_STYLES | WS_TABSTOP | BS_OWNERDRAW | BS_RIGHT, 0, - 0 }, + WS_EX_RTLREADING }, { "BUTTON", // FIELD_BUTTON DEFAULT_STYLES | WS_TABSTOP, - DEFAULT_STYLES | WS_TABSTOP | BS_RIGHT, + DEFAULT_STYLES | WS_TABSTOP, 0, - 0 } + WS_EX_RTLREADING } }; FieldType *pField = pFields + nIdx; @@ -1233,12 +1238,12 @@ void WINAPI showCfgDlg() g_done = g_NotifyField = 0; - while (!g_done) { + while (!g_done) { MSG msg; int nResult = GetMessage(&msg, NULL, 0, 0); if (!IsDialogMessage(hConfigWindow,&msg) && !IsDialogMessage(hMainWindow,&msg) && !TranslateMessage(&msg)) - DispatchMessage(&msg); - } + DispatchMessage(&msg); + } // we don't save settings on cancel since that means your installer will likely // quit soon, which means the ini might get flushed late and cause crap. :) anwyay. @@ -1325,7 +1330,7 @@ extern "C" BOOL WINAPI DllMain(HANDLE hInst, ULONG ul_reason_for_call, LPVOID lp m_hInstance=(HINSTANCE) hInst; if (ul_reason_for_call == DLL_THREAD_DETACH || ul_reason_for_call == DLL_PROCESS_DETACH) DestroyWindow(hConfigWindow); - return TRUE; + return TRUE; } diff --git a/Contrib/Language files/Hebrew.nlf b/Contrib/Language files/Hebrew.nlf index d70fe75a..d48779cb 100644 --- a/Contrib/Language files/Hebrew.nlf +++ b/Contrib/Language files/Hebrew.nlf @@ -37,9 +37,9 @@ Nullsoft Install System %s # ^UnCompletedSubCaption : ההסרה הושלמה # ^BackBtn -ה&קודם > +< ה&קודם # ^NextBtn -< ה&בא +ה&בא > # ^AgreeBtn אני &מסכים # ^AcceptBtn @@ -55,7 +55,7 @@ Nullsoft Install System %s # ^CloseBtn סגור& # ^BrowseBtn -...&עיין +&עיין... # ^ShowDetailsBtn ה&צג פרטים # ^ClickNext @@ -85,31 +85,31 @@ Nullsoft Install System %s # ^ComponentsText סמן את הרכיבים שברצונך להתקין ובטל את הסימון של רכיבים שאין ברצונך להתקין. $_CLICK # ^ComponentsSubText1 -:בחר סוג התקנה +בחר סוג התקנה: # ^ComponentsSubText2_NoInstTypes -:בחר רכיבים להתקנה +בחר רכיבים להתקנה: # ^ComponentsSubText2 -:או, בחר רכיבי רשות להתקנה +או, בחר רכיבי רשות להתקנה: # ^UnComponentsText סמן את הרכיבים שברצונך להסיר ובטל את הסימון של רכיבים שאין ברצונך להסיר. $_CLICK # ^UnComponentsSubText1 -:בחר סוג הסרה +בחר סוג הסרה: # ^UnComponentsSubText2_NoInstTypes -:בחר רכיבים להסרה +בחר רכיבים להסרה: # ^UnComponentsSubText2 -:או, בחר רכיבי רשות להסרה +או, בחר רכיבי רשות להסרה: # ^DirText תוכנית זו תתקין את $(^Name) לתיקייה שלהלן. כדי להתקין לתיקייה אחרת, לחץ על 'עיין' ובחר תיקייה אחרת. $_CLICK # ^DirSubText תיקיית יעד # ^DirBrowseText -:בחר תיקייה להתקנת $(^Name) +בחר תיקייה להתקנת $(^Name): # ^UnDirText תוכנית זו תסיר את $(^Name) מהתיקייה שלהלן. כדי להסיר מתיקייה אחרת, לחץ על 'עיין' ובחר תיקייה אחרת. $_CLICK # ^UnDirSubText "" # ^UnDirBrowseText -:בחר תיקייה ממנה תוסר $(^Name) +בחר תיקייה ממנה תוסר $(^Name): # ^SpaceAvailable "מקום פנוי: " # ^SpaceRequired @@ -117,7 +117,7 @@ Nullsoft Install System %s # ^UninstallingText הסרת $(^Name) תתבצע מהתיקייה שלהלן. $_CLICK # ^UninstallingSubText -:מסיר מ +מסיר מ: # ^FileError ארעה שגיאה בעת פתיחת קובץ לכתיבה:\r\n\t"$0"\r\nלחץ על ביטול כדי לבטל את ההתקנה,\r\nנסה שנית כדי לנסות לפתוח את הקובץ שוב, או\r\nהתעלם כדי לדלג על הקובץ # ^FileError_NoIgnore @@ -183,8 +183,8 @@ Nullsoft Install System %s # ^Byte "ב # ^Kilo -ק +" ק" # ^Mega -מ +" מ" # ^Giga -ג \ No newline at end of file +" ג" \ No newline at end of file diff --git a/Contrib/Modern UI/Language files/Hebrew.nsh b/Contrib/Modern UI/Language files/Hebrew.nsh index 7b0ea0a7..a5a460e4 100644 --- a/Contrib/Modern UI/Language files/Hebrew.nsh +++ b/Contrib/Modern UI/Language files/Hebrew.nsh @@ -14,77 +14,77 @@ !define MUI_TEXT_WELCOME_INFO_TEXT "אשף זה ינחה אותכם במהלך ההתקנה של $(^Name).\r\n\r\nמומלץ לסגור כל תוכנית אחרת לפני התחלת ההתקנה. פעולה זו תאפשר לאשף לעדכן קבצי מערכת ללא איתחול המחשב.\r\n\r\n$_CLICK" !define MUI_TEXT_LICENSE_TITLE "הסכם רישוי" - !define MUI_TEXT_LICENSE_SUBTITLE ". $(^Name) אנא עיין בתנאי הרשיון לפני התקנת" - !define MUI_INNERTEXT_LICENSE_TOP ".בכדי לצפות בשאר הרשיון Page Down לחץ על" - !define MUI_INNERTEXT_LICENSE_BOTTOM ".אם לא תסכים לתנאי הרשיון$(^Name) אם אתה מקבל את תנאי הרשיון, לחץ על 'אני מסכים' כדי להמשיך. לא תוכל להתקין את" - !define MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "$_CLICK .$(^Name) אם אתה מקבל את תנאי ההסכם, סמן את תיבת הבחירה שלהלן. עלייך לקבל את תנאי ההסכם בכדי להתקין את" - !define MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "$_CLICK .$(^Name) אם אתה מקבל את תנאי ההסכם, בחר באפשרות הראשונה שלהלן. עלייך לקבל את ההסכם בכדי להתקין את" + !define MUI_TEXT_LICENSE_SUBTITLE "אנא עיין בתנאי הרשיון לפני התקנת $(^Name)." + !define MUI_INNERTEXT_LICENSE_TOP "בכדי לצפות בשאר הרשיון לחץ על Page Down." + !define MUI_INNERTEXT_LICENSE_BOTTOM "אם אתה מקבל את תנאי הרשיון, לחץ על 'אני מסכים' כדי להמשיך. אם לא תסכים לתנאי הרשיון לא תוכל להתקין את $(^Name)." + !define MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "אם אתה מקבל את תנאי ההסכם, סמן את תיבת הבחירה שלהלן. עלייך לקבל את תנאי ההסכם בכדי להתקין את $(^Name). $_CLICK" + !define MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "אם אתה מקבל את תנאי ההסכם, בחר באפשרות הראשונה שלהלן. עלייך לקבל את ההסכם בכדי להתקין את $(^Name). $_CLICK" !define MUI_TEXT_COMPONENTS_TITLE "בחר רכיבים" - !define MUI_TEXT_COMPONENTS_SUBTITLE ".ברצונך להתקין $(^Name) בחר אילו רכיבים של" + !define MUI_TEXT_COMPONENTS_SUBTITLE "בחר אילו רכיבים של $(^Name) ברצונך להתקין." !define MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "תיאור" - !define MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO ".העבר את העכבר מעל רכיב כלשהו בכדי לצפות בתיאורו" + !define MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "העבר את העכבר מעל רכיב כלשהו בכדי לצפות בתיאורו." !define MUI_TEXT_DIRECTORY_TITLE "בחר מיקום להתקנה" - !define MUI_TEXT_DIRECTORY_SUBTITLE ".$(^Name) בחר את התיקייה בה אתה מעוניין להתקין את" + !define MUI_TEXT_DIRECTORY_SUBTITLE "בחר את התיקייה בה אתה מעוניין להתקין את $(^Name)." !define MUI_TEXT_INSTALLING_TITLE "מתקין" - !define MUI_TEXT_INSTALLING_SUBTITLE ".מותקן $(^Name) -אנא המתן בזמן ש " + !define MUI_TEXT_INSTALLING_SUBTITLE "אנא המתן בזמן ש-$(^Name) מותקן." !define MUI_TEXT_FINISH_TITLE "ההתקנה הושלמה" - !define MUI_TEXT_FINISH_SUBTITLE ".ההתקנה הושלמה במלואה" + !define MUI_TEXT_FINISH_SUBTITLE "ההתקנה הושלמה במלואה." !define MUI_TEXT_ABORT_TITLE "ההתקנה בוטלה" - !define MUI_TEXT_ABORT_SUBTITLE ".ההתקנה לא הושלמה המלואה" + !define MUI_TEXT_ABORT_SUBTITLE "ההתקנה לא הושלמה המלואה." !define MUI_BUTTONTEXT_FINISH "&סיים" - !define MUI_TEXT_FINISH_INFO_TITLE "$(^Name) משלים את אשף ההתקנה של" - !define MUI_TEXT_FINISH_INFO_TEXT "הותקן בהצלחה $(^Name)\r\n\r\nלחץ על סיום בכדי .לסגור את האשף" - !define MUI_TEXT_FINISH_INFO_REBOOT "?האם ברצונך לאתחל כעת .$(^Name) עלייך לאתחל את המחשב בכדי לסיים את התקנת" + !define MUI_TEXT_FINISH_INFO_TITLE "משלים את אשף ההתקנה של $(^Name)" + !define MUI_TEXT_FINISH_INFO_TEXT "$(^Name) הותקן בהצלחה.\r\n\r\nלחץ על סיום בכדי לסגור את האשף." + !define MUI_TEXT_FINISH_INFO_REBOOT "עלייך לאתחל את המחשב בכדי לסיים את התקנת $(^Name). האם ברצונך לאתחל כעת?" !define MUI_TEXT_FINISH_REBOOTNOW "אתחל כעת" !define MUI_TEXT_FINISH_REBOOTLATER "ברצוני לאתחל ידנית מאוחר יותר" - !define MUI_TEXT_FINISH_RUN "$(^Name) &הרץ את" + !define MUI_TEXT_FINISH_RUN "&הרץ את $(^Name)" !define MUI_TEXT_FINISH_SHOWREADME "'&הצג מסמך 'קרא אותי" !define MUI_TEXT_STARTMENU_TITLE "בחר תיקייה בתפריט התחל" - !define MUI_TEXT_STARTMENU_SUBTITLE ".בחר בתיקיית תפריט התחל בכדי לשים בה את קיצורי הדרך של התוכנית" - !define MUI_INNERTEXT_STARTMENU_TOP ".בחר בתיקייה בתפריט התחל בה ברצונך למקם את קיצורי הדרך עבור התוכנית. באפשרותך גם להקיש את שם התיקייה בכדי ליצור תיקייה חדשה" + !define MUI_TEXT_STARTMENU_SUBTITLE "בחר בתיקיית תפריט התחל בכדי לשים בה את קיצורי הדרך של התוכנית." + !define MUI_INNERTEXT_STARTMENU_TOP "בחר בתיקייה בתפריט התחל בה ברצונך למקם את קיצורי הדרך עבור התוכנית. באפשרותך גם להקיש את שם התיקייה בכדי ליצור תיקייה חדשה." !define MUI_INNERTEXT_STARTMENU_CHECKBOX "אל תיצור קיצורי דרך" - !define MUI_TEXT_ABORTWARNING "?$(^Name) האם אתה בטוח שברצונך לצאת מהתקנת המוצר" + !define MUI_TEXT_ABORTWARNING "האם אתה בטוח שברצונך לצאת מהתקנת $(^Name)?" !define MUI_UNTEXT_WELCOME_INFO_TITLE "ברוכים הבאים לאשף ההסרה של $(^Name)" !define MUI_UNTEXT_WELCOME_INFO_TEXT "אשף זה ינחה אותכם במהלך ההסרה של $(^Name).\r\n\r\nמומלץ לסגור כל תוכנית אחרת לפני התחלת ההתקנה. פעולה זו תאפשר לאשף לעדכן קבצי מערכת ללא איתחול המחשב.\r\n\r\n$_CLICK" - !define MUI_UNTEXT_CONFIRM_TITLE "$(^Name) הסר את" - !define MUI_UNTEXT_CONFIRM_SUBTITLE ".מהמחשב $(^Name) הסר את" + !define MUI_UNTEXT_CONFIRM_TITLE "הסר את $(^Name)" + !define MUI_UNTEXT_CONFIRM_SUBTITLE "הסר את $(^Name) מהמחשב." !define MUI_UNTEXT_LICENSE_TITLE "הסכם רישוי" - !define MUI_UNTEXT_LICENSE_SUBTITLE ". $(^Name) אנא עיין בתנאי הרשיון לפני הסרת" - !define MUI_UNINNERTEXT_LICENSE_BOTTOM ".אם לא תסכים לתנאי הרשיון$(^Name) אם אתה מקבל את תנאי הרשיון, לחץ על 'אני מסכים' כדי להמשיך. לא תוכל להסיר את" - !define MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "$_CLICK .$(^Name) אם אתה מקבל את תנאי ההסכם, סמן את תיבת הבחירה שלהלן. עלייך לקבל את תנאי ההסכם בכדי להסיר את" - !define MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "$_CLICK .$(^Name) אם אתה מקבל את תנאי ההסכם, בחר באפשרות הראשונה שלהלן. עלייך לקבל את ההסכם בכדי להסיר את" + !define MUI_UNTEXT_LICENSE_SUBTITLE "אנא עיין בתנאי הרשיון לפני הסרת $(^Name)." + !define MUI_UNINNERTEXT_LICENSE_BOTTOM "אם אתה מקבל את תנאי הרשיון, לחץ על 'אני מסכים' כדי להמשיך. אם לא תסכים לתנאי הרשיון לא תוכל להסיר את $(^Name)." + !define MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "אם אתה מקבל את תנאי ההסכם, סמן את תיבת הבחירה שלהלן. עלייך לקבל את תנאי ההסכם בכדי להסיר את $(^Name). $_CLICK" + !define MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "אם אתה מקבל את תנאי ההסכם, בחר באפשרות הראשונה שלהלן. עלייך לקבל את ההסכם בכדי להסיר את $(^Name). $_CLICK" !define MUI_UNTEXT_COMPONENTS_TITLE "בחר רכיבים" - !define MUI_UNTEXT_COMPONENTS_SUBTITLE ".ברצונך להסיר $(^Name) בחר אילו תכונות של" + !define MUI_UNTEXT_COMPONENTS_SUBTITLE "בחר אילו תכונות של $(^Name) ברצונך להסיר." !define MUI_UNTEXT_DIRECTORY_TITLE "בחר מיקום להסרה" - !define MUI_UNTEXT_DIRECTORY_SUBTITLE ".$(^Name) בחר את התיקייה ממנה אתה מעוניין להסיר את" + !define MUI_UNTEXT_DIRECTORY_SUBTITLE "בחר את התיקייה ממנה אתה מעוניין להסיר את $(^Name)." !define MUI_UNTEXT_UNINSTALLING_TITLE "מסיר" - !define MUI_UNTEXT_UNINSTALLING_SUBTITLE ".מוסר מהמחשב $(^Name) אנא המתן בזמן ש-" + !define MUI_UNTEXT_UNINSTALLING_SUBTITLE "אנא המתן בזמן ש-$(^Name) מוסר מהמחשב." !define MUI_UNTEXT_FINISH_TITLE "ההסרה הושלמה" - !define MUI_UNTEXT_FINISH_SUBTITLE ".ההסרה הושלמה במלואה" + !define MUI_UNTEXT_FINISH_SUBTITLE "ההסרה הושלמה במלואה." !define MUI_UNTEXT_ABORT_TITLE "ההסרה בוטלה" - !define MUI_UNTEXT_ABORT_SUBTITLE ".ההסרה לא הושלמה במלואה" + !define MUI_UNTEXT_ABORT_SUBTITLE "ההסרה לא הושלמה במלואה." - !define MUI_UNTEXT_FINISH_INFO_TITLE "$(^Name) משלים את אשף ההסרה של" - !define MUI_UNTEXT_FINISH_INFO_TEXT "הותקן בהצלחה $(^Name)\r\n\r\nלחץ על סיום בכדי .לסגור את האשף" - !define MUI_UNTEXT_FINISH_INFO_REBOOT "?האם ברצונך לאתחל כעת .$(^Name) עלייך לאתחל את המחשב בכדי לסיים את הסרת" + !define MUI_UNTEXT_FINISH_INFO_TITLE "משלים את אשף ההסרה של $(^Name)" + !define MUI_UNTEXT_FINISH_INFO_TEXT "$(^Name) הוסר בהצלחה.\r\n\r\nלחץ על סיום בכדי לסגור את האשף." + !define MUI_UNTEXT_FINISH_INFO_REBOOT "עלייך לאתחל את המחשב בכדי לסיים את הסרת $(^Name). האם ברצונך לאתחל כעת?" - !define MUI_UNTEXT_ABORTWARNING "?$(^Name) האם אתה בטוח שברצונך לצאת מהסרת" + !define MUI_UNTEXT_ABORTWARNING "האם אתה בטוח שברצונך לצאת מהסרת $(^Name)?" !insertmacro MUI_LANGUAGEFILE_END diff --git a/Contrib/StartMenu/StartMenu.c b/Contrib/StartMenu/StartMenu.c index c07b44ce..39df9097 100644 --- a/Contrib/StartMenu/StartMenu.c +++ b/Contrib/StartMenu/StartMenu.c @@ -1,4 +1,5 @@ #include +#include #include "../exdll/exdll.h" #include "resource.h" @@ -9,7 +10,7 @@ HWND hwChild; HWND g_hwStartMenuSelect; HWND g_hwDirList; -char buf[MAX_PATH]; +char buf[1024]; char text[1024]; char progname[1024]; char lastused[1024]; @@ -24,7 +25,7 @@ void *lpWndProcOld; BOOL CALLBACK dlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); BOOL CALLBACK ParentWndProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); -void AddFolderFromReg(HKEY rootKey); +void AddFolderFromReg(int nFolder); void __declspec(dllexport) Select(HWND hwndParent, int string_size, char *variables, stack_t **stacktop) { @@ -125,7 +126,7 @@ static BOOL CALLBACK ParentWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARA y_offset, \ cx, \ cy, \ - SWP_NOACTIVATE \ + SWP_NOACTIVATE | SWP_NOZORDER \ ); \ \ y_offset += cy + 5; @@ -182,14 +183,24 @@ BOOL CALLBACK dlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) if (rtl) { long s; + s = GetWindowLong(hwText, GWL_STYLE); SetWindowLong(hwText, GWL_STYLE, (s & ~SS_LEFT) | SS_RIGHT); + s = GetWindowLong(hwText, GWL_EXSTYLE); + SetWindowLong(hwText, GWL_EXSTYLE, s | WS_EX_RTLREADING); + s = GetWindowLong(hwLocation, GWL_STYLE); SetWindowLong(hwLocation, GWL_STYLE, (s & ~ES_LEFT) | ES_RIGHT); + s = GetWindowLong(hwLocation, GWL_EXSTYLE); + SetWindowLong(hwLocation, GWL_EXSTYLE, s | WS_EX_RTLREADING); + s = GetWindowLong(hwDirList, GWL_EXSTYLE); SetWindowLong(hwDirList, GWL_EXSTYLE, s | WS_EX_RIGHT | WS_EX_RTLREADING); + s = GetWindowLong(hwCheckBox, GWL_STYLE); SetWindowLong(hwCheckBox, GWL_STYLE, s | BS_RIGHT | BS_LEFTTEXT); + s = GetWindowLong(hwCheckBox, GWL_EXSTYLE); + SetWindowLong(hwCheckBox, GWL_EXSTYLE, s | WS_EX_RTLREADING); } if (!noicon) @@ -211,7 +222,7 @@ BOOL CALLBACK dlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) 0, temp_r.right, temp_r.bottom, - SWP_NOACTIVATE | (noicon ? SWP_HIDEWINDOW : 0) + SWP_NOZORDER | SWP_NOACTIVATE | (noicon ? SWP_HIDEWINDOW : 0) ); if (rtl) @@ -278,8 +289,8 @@ BOOL CALLBACK dlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) SetWindowText(hwCheckBox, checkbox); } - AddFolderFromReg(HKEY_LOCAL_MACHINE); - AddFolderFromReg(HKEY_CURRENT_USER); + AddFolderFromReg(CSIDL_COMMON_PROGRAMS); + AddFolderFromReg(CSIDL_PROGRAMS); // Tell NSIS to remove old inner dialog and pass handle of the new inner dialog SendMessage(hwParent, WM_NOTIFY_CUSTOM_READY, (WPARAM)hwndDlg, 0); @@ -329,40 +340,30 @@ BOOL WINAPI DllMain(HANDLE hInst, ULONG ul_reason_for_call, LPVOID lpReserved) return TRUE; } -void AddFolderFromReg(HKEY rootKey) +void AddFolderFromReg(int nFolder) { - DWORD dwResult; - DWORD dwLength = MAX_PATH; - DWORD dwType = REG_SZ; - HKEY hKey; - //DWORD idx; WIN32_FIND_DATA FileData; HANDLE hSearch; - char szName[20] = "Common Programs"; - - dwResult = RegOpenKeyEx( - rootKey, - "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders", - 0, - KEY_READ, - &hKey - ); - - if (dwResult == ERROR_SUCCESS) + LPMALLOC ppMalloc; + if (SHGetMalloc(&ppMalloc) == NOERROR) { - dwResult = RegQueryValueEx( - hKey, - rootKey == HKEY_LOCAL_MACHINE ? szName : szName + 7, - NULL, - &dwType, - (BYTE *) buf, - &dwLength - ); - RegCloseKey(hKey); + LPITEMIDLIST ppidl; + + buf[0] = 0; + if (SHGetSpecialFolderLocation(hwParent, nFolder, &ppidl) == S_OK) + { + SHGetPathFromIDList(ppidl, buf); + ppMalloc->lpVtbl->Free(ppMalloc, ppidl); + } + + ppMalloc->lpVtbl->Release(ppMalloc); } + if (!buf[0]) + return; + lstrcat(buf, "\\*.*"); hSearch = FindFirstFile(buf, &FileData); if (hSearch != INVALID_HANDLE_VALUE) diff --git a/Plugins/InstallOptions.dll b/Plugins/InstallOptions.dll index 7dea31596dc4dfc62802b294e588c143480297ab..3c950eebf354f85312770655ebccbce9735510d6 100644 GIT binary patch delta 3076 zcmd^>i&NCs702&g7F}S4AIS0$ROIc8vi=^ZyT1i>L0h%m%B!sr6-3w7RFGYytt}|f zu(P7zby}TCeYBclV@B)RN!nOlADP&MT4SxTFKeRBtb&$0grG6G{r(o5>P-HF+?mhs z+;F$wy%XbWuFCosAj9Ta>MJ0-))+&w zXMS`@E?ZyY)aH=U<|rm)2@NMj%GK__Pt@shx*vZ%Vn89J4h{nQCe6^1FxIUT!}Bqw z-BTt+bYqN21SnG6^;glgPR;|wtgiIvc39Ukpr;u#@XD|&&=T$p&Sa|K$o!UF`H8Dn#r9R zU+MHxLdt_b{w%aYd<8ez+5ItQI>;uEtxg<-TkAz5mwVO`p~5NIiBQQ+i`d?=`6*vu zbLPT9v)>-8(jqp+V5L@nl_8yCxor_ii92HnX%Bcy;$zxALfBGgM-dT%P3%NO3jH(d zjVPfGHa>D8wX@}ssmVnMZh70C+Zxb0f=!P&FLiiJu)KqHMb^@d{-Ma}lx}3{#zL(q zV|BqAOz;i2^O&~3VMjaL+dk*qfqYj%-yU!aqngl`+=8yN_z8Bbj(uvZnI6P=s6^3q z7I!$@25vH#iO@HOn+Rlkz%yxfXf<~>H|d#o++=!-9UZrh-e9rOi^u;1b65HkhZH!JW`4(za6$~{q!b1xL!98YZfsuN&>lpVq z%_Ef4HDr)12CA0-VPtnJDp5H%orc;Gw6ITNimY{?;`DmrVK8d8#v*RI0rSc#?S{1S z2+xNu;==9*pv)pIsLhqjS@`QCq#bg0WsZLlJ?0Rk?*0X&9!^gG+#@Nr<2#(o|r(s*_~ zuA1ih=ZwEfX$v!&lIa|lZOSvfn}La$oyRrd8AP$h%HR-NZ*tK>cFmNXxaI-p3tB8& z-H&}2Ac^NM+;c7Xki{lUrJ2lrh1U=~ z+sC;W=nE4AMOE6Hu|Ku6yuv4Uu;ocJ$6klgH*qi9m1G**k9j`z4fbkMGCjrKN}3^@ zfCfiCs?(mS?e{T8ljCUuOGutfdzg}(JM-{8?WP>l?$5qZ_k`Bn8S0+Wx~-w^8(O!C z`I6I@mTQVeeQ;?=8iU0lDFoG!Gz4YH)*r=(c_MhDotuov07KpA@GyppJ+ERCaC{jsIx!Jr&##aI8@%@+p-a-EiI0+7e4}sRoL_(@S5!gG6kZF){UHGgSFr^xD0NBL7+qMIFJVNfDJ4IYk?b7 zz-JMd3-UlJ5C8!WkibpQ3);XQ@CrBy0^peDM>gS8ii{+%YBaMGX3a3t8sV6WuP8x9 zPg@59<5-f8XZ)sVb2Z&Fer`<%pWriocUb+zlrQ_9M?JIW{(X}+(G)+iZ(hBnWK)f& zVOedBo16}f%ka-Kj}@kM$86V?*19X#e|OEMEsjkM#Q&$XIl4Lc{VCM$iBdoaUJfK| zlq8HZK|YYP3E2iNfv;lh0L$6Z3_m-lOFNmlnl`85w`o2RFu6EVnI>EaR*eYpK;~ zZM6Q(+G9Oy?X_OD{>ysT8m{K3Gu8QOnOddRs2kKe)uXnkFR8oLed=NLRrS~E@70Uy z74?1fo;sj@tcKg7ZHcx?HnXk3R%_c}YqGW4ytXde%eG(H&e-0v-E6kqu?^WK7v>bs zER+i^h4Tu3qunvoatq>4{y=_|Io>Rq=a?6oSD4qB`)56zMMZ-+Nz4%yah~`Mu}u87 zxLSNs+$?@i>=yTn$3?&Ry7;DeR=gm-E&f&fKztw$ih3zRijyWvsx)7!k=9G~()Xop z(hjNlr_urGm(pvJU;3?dR{EoKL%J(HmLlXBIZ@7#^X1vHO}5KRh4{LEE^ir%#8>%Y7h|>H&}e^qA^xT zfR^n_1&^`L)QKiBjxoluuC-3$wD?FQtxc#U9ord|?E2Uo zl?P5IMdkce%j)$Q@;^;2CFEf)mV{n;r|6F9GD(`6$i)$210#>HUuHq_gme#;#q))P ztbuBw-{qzmj4`y^AjIZF=enm(q&=L88=!A-Gq@IdliR=@j;u0lWDoHaxnG@ z&P!|K8Z+FwDPXr$)rUAjDzqQ{Cz`=h$*gXAJ6tna_Cf(o6C+=n=(11dph2h)}BI0dr!z`Np8D}Vaw|~ ziV3eZ(j)Qd+;8dmcpq0r$0t0+lJJ@8MUS86Nk#Y?ZA{AW%}0TXj7L+V;)F>n)w`Q=uPX1btkrM3UNBlA*HoHfFu1k6FU=fw;jE zGZ)mKae=X&586h|9WXbu4c@3PfdWhC`i$^UJ&q%J2`wDtRX<~L)T0L;t-dM7a7lLf zktrdceU>ky^-Y^Ubykup^gODn$cpmM>WNA+{PysWs^@4W2GrMDVmBaD{@0n72tE3m zj*l*CWff{>){O{NHSc!5*!|>foY|lSyjeFj6*FrutV^o(ZD?ij!7F~^N70)>PA4sd zsQzpwZN<81U(n6`RP!Miuo`=C2wLdN{2HtJujmT4t;02DQXf3S(mtA(qF}olQcAhK z^k|BQ-;J;ry(KrE& z>vj7%7QE=sXOix#{qrVjh<2HEE3BAG1_WHfH*gni=y$dU;G;sb&{xI@oSA+&u9nM> z%pHG$OCN@Ve&j=2oXKtR1{|=F^i|qidcQT#dU_g?**o{^B6thyVXo2`U1#;!{8yGcOb>T(odLGgo^nOMMZF^ejSc>mG&6o2U6;T*g~8J8cHmQ%#$R zx5B10X~Hiu3IEhoY#h)4JPTMb;pwzDEsIm>Khmt+0vc;`&L~6b=Qrxxl2jQoX}trC z2|WWbLQiqE{))VoQC?9QmTu8HTdwjUjN$wAz4DtzSNM-i+Kphm55b0&lX!-5H-ib~ zInUBr^zz*~ReZUpqbHId&qykw$G4yI+KKd(wO+W`=)BS)!40sjj2YP|mfWyFU zU@IWPSA^eO$e%#&29Ar(BeMx$Ry9D`=h1ww7h${cyKfC;_8vF1#!>lv7@upxy)}P@8zf=%QX|D=|d$V zJkfCPP|@jp%|%vZJr~OziNxlN=bB%d^ZK0M&$%=w-Iec}>ssns?b_x#?)tOqhRf(K za6jZ;;$H3E;ojpu?mpvw%l#+!W%saql44h8EAx~JWua25tW+A54aycJq;x4iS6)yK zD94o7m2=A5%3qaFlxxbc66;CwSUuUEJkMfJt*6nm$8t7s^}YHn~&YDesZ@%SYumvX<_c+D+9KFYDB;n>5JOqLmIeu!SIy*fK)938|AR&CKZ(?GNaxjJNN* zv!m|cIeIVO_kG{*_kF%U?G&Hlr$1~uec(?AQ2FyAs%v_bszzudFuW$SPp7D-D6ig2 zwOZOKJ#XRk^VDwYS^Wdpzp7J~-Ih08`sXc2s9(>0%kq6HX=9N?>v2Z=2eP$xgLcTD zZa_$yo#{l5Y^?)$*wyVtj!a>8B#0b|jq+&*Iqu~tgx(qPBS*A217s>h=r7b~eg!}@ ze-$WP9tDmpgYW=e&J+^%1*-?FfiNn?<&y?KS-$XAE@JY~x_gAQhEo zLd0bR9w6Twn=+359iWL_Vc=`qJIKD8xu5l)Br$Qz9(cF71o{ish6+GgPJp&j z1^Rd?9U^=*`%?&O;)oV%2Mb(5|E~4GUgJW&*pFT3fQkJ?q^woiC?jH-B>lwjGmBU9 zcKturh9p6!nF*`z&r;ZBGt8AXaD|TH`6`qSkz^t@m?sJDPZw;G(t%wL!@iO8RjktX zTvwHZU3TE+jpUBk8tPCx|g#0di#cD?G=r>i|%iRaiAAxQo(e0<)4 z(kpya8=~9w-&a3z(2JL|VcMyM>Bt_E^ZGN7!QQRDuqSJUQ$~cHyWf?bqNV4veiDL2 zy}U|%wL(hnZMEu5je85pR;iLTuJAi@7Of-t@tSS1w;y6Ge*_w(pTR5AL}+D0V(7i1 zV{R>r4hoKapGnBZ$_D7@gS%A=o??`giB!b&XHK}eb)Bu8zdHrV1R`(dFPV8H# z&m04S7|ayvGe`8bnqA4=#HycIRS^8K*iYKTa5a(()4YWJq)D(#C1DAjhP})-fcOrvK5_NDb*9+ZvNJUN*%P25ull=@98WNKPIKOxq(9 z$4F(w@NKim?H0*k4B{na#k@$}@Ja?vctqHVZ&$<`%3{D;7pw3*_z*A|Q`cM8ZNRrD zYQ5!0JY{WQu4@C&3<5;Un+|#ObC0wnX~}@^8Ueg{GE}si58iJqv_|N*ohk6d?v(Px zF_7XPyifMVLi2kHk`xFc&Eq9*5dt5hne@ChSW6_;9S}7>U9d=oJ!0*_t>$^{cI&O9 zy}c#R|8SF_%BSZoN6l-g7mUh)GYkd`HK`C8TL>}{xk#vl_2OBmQUW=KT~h!Vs=)BT zY1Roqfwx=3belwSKS)Xo{>5K* zCOu-#uMWxJRE8PY^kCQXAZXZ!*9mRfMHh*6fJ&wxfeN>uh1y_3HIeUDNgbApyNyVf zk27TCf;$m#2Xdj0Jh~&vKvE3{wQIyh!cP~hy)V@g+4~2+^F9-nvZWYh1 z_!@&y#lYr?;p1H4nenC%YI!BH@N{X~QlaPFm+0(3(wZ!M#p6NSY1z+Sb2mUIWxJ0vBQElhKpQ zT+-jQZ%bZ+ndVTV6I!MS)WkmP8dQ#Y2#8OBNIa5y_aDGVDw{I|Bn8Vq0i@V(H2ZS; z6P$2Yu8^Gi%oV%}bqm%< zuvTHM!LmPYDpb=56`SF{Sr61Hn^wIho9sJ?h2r1xHRyUj@uq0Sel4yiRa|bq`r!F{c)ZFWq zYHF^|eVxy~#zcbR+4 zL&nN(W*=jBvTdxuhS)=F4;y1ounPN4_S{H_@4E>=*#)u^qu!zOZpnQ$2p$c&xN@N7vqj`liUm354az3zvbq+1?~oS zm&05QPxB0akUz}#@Pqs~Kh5X)-|&lkqrb%;@L%>X`j`E8{h#`=-yP@(JQWxZOb31# z$OnEIcqj1pzy`r4)C!*ywh3OLO%R3sLRk2+&@YS&s_FVa8Iy1I2arY!mre;{{`}+h+F^w delta 2814 zcmbVOe{2)?75|<|h(~@I6o(&4kwXkk36MMAoqZ{onUF-;>d*^L95UPx)Hpp{6KCe! zf(o^faff&E#CGepKQ=9CR;}tPRgkTUwvM?8YRI4+UABZy8pH`|iDS zjQD#Oeed4S&-Z=bd*A0IgoJQuzUEJ_1-?pFpLtSNQ_QR-WE}{$=7igIhIy8;=p9VG zshQD7OuT-Xd6GG#e+utzoiROWTG*iPG#z5b$Ih5uXW{{lShV&EpT9d@+Go%fD?Pvk^-wJNh#xvBcIXLoBh}dy^sLH^U;a_!f{%xRGw?DNnr%k!a#B z@c7*bh!h2^yXkBy8!MSA90EA7CW|MPew4@a3N^3jQUZ@0ij?{N#Im?g>3k#t3?*;6 zQ)zo7FH*7)+~RsgcqA%T5@5MthW&bc3k-Zx*&ekhu^l5_4LIIVejz|9&4o|OFWi9O ze9HXOcxnO85F*NNHvkhehk{g0fG4#!gIs&UgYV_kN?Lpi)3Q;ihMgB?z`tjzFr1H3 zQCbier@ejP1STZ-E7~aHQU>EWA)1~Y=d{3dTw{R5V%wky!n;Z zJU4c#bySP{)xGY>D0e4SH*2~HfI)ML1U-0 zNjF|VqDDg41YT-Y0KCK`8>~#N9$*a`^76Q9)2eC-ynsek;wCGHkgtBs4QSL2l-dxp z6tuRSHt8PHfB%)bUYneg^?}t0P6_R!`?ssI^^)va)THkmcaBSX5p&KgHl#Jqp2b^(4_UHOr zhdbmB!04kh;IJ#1ElRj?><~zycO0o$;rK;p4vY{ogKYt&GXjQeU~yq**s8wSUMFMG zj$l8)w=RdMdF@`%#q9|<&ZzyFW~LCaW33@Z`65?8zzqP9F~k&X?A&$s$c7|8iU1Rm zd>VH|eApf794r|}a0nG=7lyjp!TC_D`CP1d9y(~XBkRz5l^w>B3CHomaUk{j4~n;IjcD(uFychQ-I8?|ufjzEO!`jEMc z&KdK#E0;mV1iu*z-B4MDL8=`GT#s?AHl-BqTK+bL;$|bfIcV72T`_)*peH*4`B?9B zeD-Ma8VfTAYEUqW6PnL@CQ1kltMf~J0PgR;>V;S`=jPvphtFotE&n3Z@^Gr<%L35K z%4TAMm=!bFz)YKJc>q#Etpxy|f+=$V5M#T~pEF~`nU;BVO{V3uO#7D|nf3?%4(LD{ zdq}MWtPR2pghBud#yJj`OlnyFOUahvVVF=B)i_YPA^w#=Zw63*@oh=}Gv(zv8@8OUOTA-GYVBL=Die z?!tNx)7{}pP2h!_y%mjwJiSRRbj0tLn|@u|n7YI|@nh5%#7HjFU(CB|~4!p!)5 zkpcDPIe9WNXp^In7ox{co`O1zjg?idF!5#xtBl>k*0Fn7f!)hCv0nBFJHWok z4zcIhi|p&{F#8TW#%9?Y>>PWC{hVbuGiT+tadlh+_cZ6>S~;2P=AP#UxmURJT$=k4 z_iOGt_c3>yyTdJU4>_x&%CW;CI^2%0J7h<4r=4*K;@8Mhd zL%g34@ZaQL<$uDz!C&P+!tIOtUaP4=syAHd4==zoGeb;r@A6zRgvs5NorJa&T>X%gM6=_6zTY6V| ZPr4?3A}vV&kSvY$je8qg8zGnP{|_R6n9cwI diff --git a/Source/DialogTemplate.cpp b/Source/DialogTemplate.cpp index 99760295..b76a6950 100644 --- a/Source/DialogTemplate.cpp +++ b/Source/DialogTemplate.cpp @@ -21,6 +21,7 @@ */ #include "DialogTemplate.h" +#include ////////////////////////////////////////////////////////////////////// // Utilities @@ -424,10 +425,9 @@ void CDialogTemplate::CTrimToString(WORD id, char *str, int margins) { void CDialogTemplate::ConvertToRTL() { for (unsigned int i = 0; i < m_vItems.size(); i++) { bool addExStyle = false; - if (m_vItems[i]->dwExtStyle & WS_EX_LEFT) - addExStyle = true; + // Button - else if (int(m_vItems[i]->szClass) == 0x80) { + if (int(m_vItems[i]->szClass) == 0x80) { m_vItems[i]->dwStyle ^= BS_LEFTTEXT; m_vItems[i]->dwStyle ^= BS_RIGHT; m_vItems[i]->dwStyle ^= BS_LEFT; @@ -435,14 +435,16 @@ void CDialogTemplate::ConvertToRTL() { if ((m_vItems[i]->dwStyle & (BS_LEFT|BS_RIGHT)) == (BS_LEFT|BS_RIGHT)) { m_vItems[i]->dwStyle ^= BS_LEFT; m_vItems[i]->dwStyle ^= BS_RIGHT; - if (m_vItems[i]->dwStyle & (BS_RADIOBUTTON|BS_CHECKBOX|BS_USERBUTTON)) + if (m_vItems[i]->dwStyle & (BS_RADIOBUTTON|BS_CHECKBOX|BS_USERBUTTON)) { m_vItems[i]->dwStyle |= BS_RIGHT; + } } } // Edit else if (int(m_vItems[i]->szClass) == 0x81) { - if ((m_vItems[i]->dwStyle & ES_CENTER) == 0) + if ((m_vItems[i]->dwStyle & ES_CENTER) == 0) { m_vItems[i]->dwStyle ^= ES_RIGHT; + } } // Static else if (int(m_vItems[i]->szClass) == 0x82) { @@ -455,14 +457,21 @@ void CDialogTemplate::ConvertToRTL() { m_vItems[i]->dwStyle |= SS_CENTERIMAGE; } } - else if (!IS_INTRESOURCE(m_vItems[i]->szClass) && strcmpi(m_vItems[i]->szClass, "RichEdit20A")) { - if ((m_vItems[i]->dwStyle & ES_CENTER) == 0) + else if (!IS_INTRESOURCE(m_vItems[i]->szClass) && !strcmpi(m_vItems[i]->szClass, "RichEdit20A")) { + if ((m_vItems[i]->dwStyle & ES_CENTER) == 0) { m_vItems[i]->dwStyle ^= ES_RIGHT; + } + } + else if (!IS_INTRESOURCE(m_vItems[i]->szClass) && !strcmpi(m_vItems[i]->szClass, "SysTreeView32")) { + m_vItems[i]->dwStyle |= TVS_RTLREADING; + addExStyle = true; } else addExStyle = true; if (addExStyle) - m_vItems[i]->dwExtStyle |= WS_EX_RIGHT | WS_EX_RTLREADING; + m_vItems[i]->dwExtStyle |= WS_EX_RIGHT; + + m_vItems[i]->dwExtStyle |= WS_EX_RTLREADING; m_vItems[i]->sX = m_sWidth - m_vItems[i]->sWidth - m_vItems[i]->sX; } diff --git a/Source/exehead/Ui.c b/Source/exehead/Ui.c index 06cd8841..e625c197 100644 --- a/Source/exehead/Ui.c +++ b/Source/exehead/Ui.c @@ -146,7 +146,8 @@ lang_again: language_table=((char*)g_blocks[NB_LANGTABLES].offset)+lang_num*g_header->langtable_size; if (!((lang ^ *(LANGID*)language_table) & lang_mask)) { dlg_offset=*(int*)(language_table+sizeof(LANGID)); - cur_langtable=(int*)(language_table+sizeof(LANGID)+sizeof(int)); + g_exec_flags.rtl=*(int*)(language_table+sizeof(LANGID)+sizeof(int)); + cur_langtable=(int*)(language_table+sizeof(LANGID)+2*sizeof(int)); break; } } diff --git a/Source/exehead/fileform.h b/Source/exehead/fileform.h index 4b8c5912..0fc8f70e 100644 --- a/Source/exehead/fileform.h +++ b/Source/exehead/fileform.h @@ -467,6 +467,7 @@ union exec_flags { int silent; #endif int instdir_error; + int rtl; }; int flags[1]; }; diff --git a/Source/exehead/util.c b/Source/exehead/util.c index fbe342c9..14c02bc5 100644 --- a/Source/exehead/util.c +++ b/Source/exehead/util.c @@ -85,7 +85,10 @@ int NSISCALL my_MessageBox(const char *text, UINT type) { if (g_exec_flags.silent && type >> 20) return type >> 20; // no silent or no default, just show - return MessageBox(g_hwnd, text, g_caption, type & 0x000FFFFF); + if (!g_exec_flags.rtl) + return MessageBox(g_hwnd, text, g_caption, type & 0x000FFFFF); + else + return MessageBox(g_hwnd, text, g_caption, (type & 0x000FFFFF) ^ (MB_RIGHT | MB_RTLREADING)); } void * NSISCALL my_GlobalAlloc(DWORD dwBytes) { diff --git a/Source/lang.cpp b/Source/lang.cpp index ed72220f..e0ff9dfe 100644 --- a/Source/lang.cpp +++ b/Source/lang.cpp @@ -405,6 +405,10 @@ int CEXEBuild::GenerateLangTables() { while (i--) { build_langtables.add(<[i].lang_id, sizeof(LANGID)); build_langtables.add(<[i].dlg_offset, sizeof(int)); + { + int rtl = lt[i].nlf.m_bRTL ? 1 : 0; + build_langtables.add(&rtl, sizeof(int)); + } int *lst = (int *)((char *)build_langtables.get() + build_langtables.getlen()); cnt = 0; @@ -488,6 +492,10 @@ int CEXEBuild::GenerateLangTables() { while (i--) { ubuild_langtables.add(<[i].lang_id, sizeof(LANGID)); ubuild_langtables.add(<[i].dlg_offset, sizeof(int)); + { + int rtl = lt[i].nlf.m_bRTL ? 1 : 0; + ubuild_langtables.add(&rtl, sizeof(int)); + } int *lst = (int *)((char *)ubuild_langtables.get() + ubuild_langtables.getlen()); cnt = 0;