input: Overwrite font substitutes settings on lang change
authorKatayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
Mon, 13 Nov 2017 01:36:52 +0000 (10:36 +0900)
committerMark Jansen <mark.jansen@reactos.org>
Sun, 19 Nov 2017 13:36:32 +0000 (14:36 +0100)
25 files changed:
dll/cpl/input/input_list.c
dll/cpl/input/input_list.h
dll/cpl/input/lang/bg-BG.rc
dll/cpl/input/lang/cs-CZ.rc
dll/cpl/input/lang/de-DE.rc
dll/cpl/input/lang/el-GR.rc
dll/cpl/input/lang/en-US.rc
dll/cpl/input/lang/es-ES.rc
dll/cpl/input/lang/fr-FR.rc
dll/cpl/input/lang/he-IL.rc
dll/cpl/input/lang/it-IT.rc
dll/cpl/input/lang/ja-JP.rc
dll/cpl/input/lang/no-NO.rc
dll/cpl/input/lang/pl-PL.rc
dll/cpl/input/lang/pt-BR.rc
dll/cpl/input/lang/ro-RO.rc
dll/cpl/input/lang/ru-RU.rc
dll/cpl/input/lang/sk-SK.rc
dll/cpl/input/lang/sq-AL.rc
dll/cpl/input/lang/tr-TR.rc
dll/cpl/input/lang/uk-UA.rc
dll/cpl/input/lang/zh-CN.rc
dll/cpl/input/lang/zh-TW.rc
dll/cpl/input/resource.h
dll/cpl/input/settings_page.c

index 0d9718d..1de3246 100644 (file)
 * PROJECT:         input.dll
 * FILE:            dll/cpl/input/input_list.c
 * PURPOSE:         input.dll
 * PROJECT:         input.dll
 * FILE:            dll/cpl/input/input_list.c
 * PURPOSE:         input.dll
-* PROGRAMMER:      Dmitry Chapyshev (dmitry@reactos.org)
+* PROGRAMMERS:     Dmitry Chapyshev (dmitry@reactos.org)
+*                  Katayama Hirofumi MZ (katayama.hirofumi.mz@gmail.com)
 */
 
 #include "input_list.h"
 
 */
 
 #include "input_list.h"
 
+typedef struct
+{
+    PWCHAR FontName;
+    PWCHAR SubFontName;
+} MUI_SUBFONT;
+
+#include "../../../base/setup/usetup/muifonts.h"
+
+BOOL UpdateRegistryForFontSubstitutes(MUI_SUBFONT *pSubstitutes)
+{
+    DWORD cbData;
+    HKEY hKey;
+    static const WCHAR pszKey[] =
+        L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\FontSubstitutes";
+
+    hKey = NULL;
+    RegOpenKeyExW(HKEY_LOCAL_MACHINE, pszKey, 0, KEY_ALL_ACCESS, &hKey);
+    if (hKey == NULL)
+        return FALSE;
+
+    /* Overwrite only */
+    for (; pSubstitutes->FontName; ++pSubstitutes)
+    {
+        cbData = (lstrlenW(pSubstitutes->SubFontName) + 1) * sizeof(WCHAR);
+        RegSetValueExW(hKey, pSubstitutes->FontName, 0,
+            REG_SZ, (LPBYTE)pSubstitutes->SubFontName, cbData);
+    }
+
+    RegCloseKey(hKey);
+
+    return TRUE;
+}
+
+BOOL
+InputList_SetFontSubstitutes(LCID dwLocaleId)
+{
+    MUI_SUBFONT *pSubstitutes;
+    WORD wLangID, wPrimaryLangID, wSubLangID;
+
+    wLangID = LANGIDFROMLCID(dwLocaleId);
+    wPrimaryLangID = PRIMARYLANGID(wLangID);
+    wSubLangID = SUBLANGID(wLangID);
+
+    /* FIXME: Add more if necessary */
+    switch (wPrimaryLangID)
+    {
+        default:
+            pSubstitutes = LatinFonts;
+            break;
+        case LANG_AZERI:
+        case LANG_BELARUSIAN:
+        case LANG_BULGARIAN:
+        case LANG_KAZAK:
+        case LANG_RUSSIAN:
+        case LANG_SERBIAN:
+        case LANG_TATAR:
+        case LANG_UKRAINIAN:
+        case LANG_UZBEK:
+            pSubstitutes = CyrillicFonts;
+            break;
+        case LANG_GREEK:
+            pSubstitutes = GreekFonts;
+            break;
+        case LANG_HEBREW:
+            pSubstitutes = HebrewFonts;
+            break;
+        case LANG_CHINESE:
+            switch (wSubLangID)
+            {
+                case SUBLANG_CHINESE_SIMPLIFIED:
+                case SUBLANG_CHINESE_SINGAPORE:
+                case SUBLANG_CHINESE_MACAU:
+                    pSubstitutes = ChineseSimplifiedFonts;
+                    break;
+                case SUBLANG_CHINESE_TRADITIONAL:
+                case SUBLANG_CHINESE_HONGKONG:
+                    pSubstitutes = ChineseTraditionalFonts;
+                    break;
+                default:
+                    pSubstitutes = NULL;
+                    DebugBreak();
+                    break;
+            }
+            break;
+        case LANG_JAPANESE:
+            pSubstitutes = JapaneseFonts;
+            break;
+        case LANG_KOREAN:
+            pSubstitutes = KoreanFonts;
+            break;
+        case LANG_ARABIC:
+        case LANG_ARMENIAN:
+        case LANG_BENGALI:
+        case LANG_FARSI:
+        case LANG_GEORGIAN:
+        case LANG_GUJARATI:
+        case LANG_HINDI:
+        case LANG_KONKANI:
+        case LANG_MARATHI:
+        case LANG_PUNJABI:
+        case LANG_SANSKRIT:
+        case LANG_TAMIL:
+        case LANG_TELUGU:
+        case LANG_THAI:
+        case LANG_URDU:
+        case LANG_VIETNAMESE:
+            pSubstitutes = UnicodeFonts;
+            break;
+    }
+
+    if (pSubstitutes)
+    {
+        UpdateRegistryForFontSubstitutes(pSubstitutes);
+        return TRUE;
+    }
+    return FALSE;
+}
 
 static INPUT_LIST_NODE *_InputList = NULL;
 
 
 static INPUT_LIST_NODE *_InputList = NULL;
 
@@ -216,11 +334,12 @@ InputList_AddInputMethodToUserRegistry(DWORD dwIndex, INPUT_LIST_NODE *pNode)
 /*
  * Writes any changes in input methods to the registry
  */
 /*
  * Writes any changes in input methods to the registry
  */
-VOID
+BOOL
 InputList_Process(VOID)
 {
     INPUT_LIST_NODE *pCurrent;
     DWORD dwIndex;
 InputList_Process(VOID)
 {
     INPUT_LIST_NODE *pCurrent;
     DWORD dwIndex;
+    BOOL bRet = FALSE;
 
     /* Process deleted and edited input methods */
     for (pCurrent = _InputList; pCurrent != NULL; pCurrent = pCurrent->pNext)
 
     /* Process deleted and edited input methods */
     for (pCurrent = _InputList; pCurrent != NULL; pCurrent = pCurrent->pNext)
@@ -246,6 +365,7 @@ InputList_Process(VOID)
     {
         if (pCurrent->wFlags & INPUT_LIST_NODE_FLAG_DEFAULT)
         {
     {
         if (pCurrent->wFlags & INPUT_LIST_NODE_FLAG_DEFAULT)
         {
+            bRet = InputList_SetFontSubstitutes(pCurrent->pLocale->dwId);
             InputList_AddInputMethodToUserRegistry(1, pCurrent);
             break;
         }
             InputList_AddInputMethodToUserRegistry(1, pCurrent);
             break;
         }
@@ -279,6 +399,8 @@ InputList_Process(VOID)
 
         dwIndex++;
     }
 
         dwIndex++;
     }
+
+    return bRet;
 }
 
 
 }
 
 
index d2659f3..e578cc7 100644 (file)
@@ -30,7 +30,7 @@ typedef struct _INPUT_LIST_NODE
 VOID
 InputList_Create(VOID);
 
 VOID
 InputList_Create(VOID);
 
-VOID
+BOOL
 InputList_Process(VOID);
 
 BOOL
 InputList_Process(VOID);
 
 BOOL
index 4b119fb..97e73c5 100644 (file)
@@ -106,6 +106,7 @@ BEGIN
     IDS_CTRL_SHIFT "Ctrl+Shift"
     IDS_LEFT_ALT_SHIFT       "Ляв Alt+Shift"
     IDS_SWITCH_BET_INLANG    "Превключване на езиците за въвеждане"
     IDS_CTRL_SHIFT "Ctrl+Shift"
     IDS_LEFT_ALT_SHIFT       "Ляв Alt+Shift"
     IDS_SWITCH_BET_INLANG    "Превключване на езиците за въвеждане"
+    IDS_REBOOT_NOW, "Reboot now?"
 END
 
 STRINGTABLE
 END
 
 STRINGTABLE
index 8d6d8e6..54e97bf 100644 (file)
@@ -111,6 +111,7 @@ BEGIN
     IDS_CTRL_SHIFT "Ctrl+Shift"
     IDS_LEFT_ALT_SHIFT "Levý Alt+Shift"
     IDS_SWITCH_BET_INLANG "Přepnout mezi vstupními jazyky"
     IDS_CTRL_SHIFT "Ctrl+Shift"
     IDS_LEFT_ALT_SHIFT "Levý Alt+Shift"
     IDS_SWITCH_BET_INLANG "Přepnout mezi vstupními jazyky"
+    IDS_REBOOT_NOW, "Reboot now?"
 END
 
 STRINGTABLE
 END
 
 STRINGTABLE
index 69dd9e5..705148a 100644 (file)
@@ -106,6 +106,7 @@ BEGIN
     IDS_CTRL_SHIFT "Strg+Umschalt"
     IDS_LEFT_ALT_SHIFT "Alt links+Umschalt"
     IDS_SWITCH_BET_INLANG "Zwischen Eingabesprachen umschalten"
     IDS_CTRL_SHIFT "Strg+Umschalt"
     IDS_LEFT_ALT_SHIFT "Alt links+Umschalt"
     IDS_SWITCH_BET_INLANG "Zwischen Eingabesprachen umschalten"
+    IDS_REBOOT_NOW, "Reboot now?"
 END
 
 STRINGTABLE
 END
 
 STRINGTABLE
index 2eee60d..332277b 100644 (file)
@@ -106,6 +106,7 @@ BEGIN
     IDS_CTRL_SHIFT "Ctrl+Shift"
     IDS_LEFT_ALT_SHIFT "Left Alt+Shift"
     IDS_SWITCH_BET_INLANG "Switch between input languages"
     IDS_CTRL_SHIFT "Ctrl+Shift"
     IDS_LEFT_ALT_SHIFT "Left Alt+Shift"
     IDS_SWITCH_BET_INLANG "Switch between input languages"
+    IDS_REBOOT_NOW, "Reboot now?"
 END
 
 STRINGTABLE
 END
 
 STRINGTABLE
index 8df67e0..4d73479 100644 (file)
@@ -106,6 +106,7 @@ BEGIN
     IDS_CTRL_SHIFT "Ctrl+Shift"
     IDS_LEFT_ALT_SHIFT "Left Alt+Shift"
     IDS_SWITCH_BET_INLANG "Switch between input languages"
     IDS_CTRL_SHIFT "Ctrl+Shift"
     IDS_LEFT_ALT_SHIFT "Left Alt+Shift"
     IDS_SWITCH_BET_INLANG "Switch between input languages"
+    IDS_REBOOT_NOW, "Reboot now?"
 END
 
 STRINGTABLE
 END
 
 STRINGTABLE
index e18eb8e..3a77680 100644 (file)
@@ -108,6 +108,7 @@ BEGIN
     IDS_CTRL_SHIFT "Ctrl+Mayús"
     IDS_LEFT_ALT_SHIFT "Alt Izq+Mayús"
     IDS_SWITCH_BET_INLANG "Cambiar entre los idiomas de entrada"
     IDS_CTRL_SHIFT "Ctrl+Mayús"
     IDS_LEFT_ALT_SHIFT "Alt Izq+Mayús"
     IDS_SWITCH_BET_INLANG "Cambiar entre los idiomas de entrada"
+    IDS_REBOOT_NOW, "Reboot now?"
 END
 
 STRINGTABLE
 END
 
 STRINGTABLE
index 96584a9..e8da479 100644 (file)
@@ -106,6 +106,7 @@ BEGIN
     IDS_CTRL_SHIFT "Ctrl+Maj"
     IDS_LEFT_ALT_SHIFT "Alt Gauche+Maj"
     IDS_SWITCH_BET_INLANG "Changer les langues de saisie"
     IDS_CTRL_SHIFT "Ctrl+Maj"
     IDS_LEFT_ALT_SHIFT "Alt Gauche+Maj"
     IDS_SWITCH_BET_INLANG "Changer les langues de saisie"
+    IDS_REBOOT_NOW, "Reboot now?"
 END
 
 /* FIXME : À améliorer/compléter */
 END
 
 /* FIXME : À améliorer/compléter */
index 515b5ee..076ba17 100644 (file)
@@ -108,6 +108,7 @@ BEGIN
     IDS_CTRL_SHIFT "Ctrl+Shift"
     IDS_LEFT_ALT_SHIFT "Left Alt+Shift"
     IDS_SWITCH_BET_INLANG "החלף בין שפות כתיבה"
     IDS_CTRL_SHIFT "Ctrl+Shift"
     IDS_LEFT_ALT_SHIFT "Left Alt+Shift"
     IDS_SWITCH_BET_INLANG "החלף בין שפות כתיבה"
+    IDS_REBOOT_NOW, "Reboot now?"
 END
 
 STRINGTABLE
 END
 
 STRINGTABLE
index bc9c07c..dd6314f 100644 (file)
@@ -106,6 +106,7 @@ BEGIN
     IDS_CTRL_SHIFT "Ctrl+Shift"
     IDS_LEFT_ALT_SHIFT "Alt sinistro+Shift"
     IDS_SWITCH_BET_INLANG "Cambia lingua di digitazione"
     IDS_CTRL_SHIFT "Ctrl+Shift"
     IDS_LEFT_ALT_SHIFT "Alt sinistro+Shift"
     IDS_SWITCH_BET_INLANG "Cambia lingua di digitazione"
+    IDS_REBOOT_NOW, "Reboot now?"
 END
 
 STRINGTABLE
 END
 
 STRINGTABLE
index 100f79f..8952da8 100644 (file)
@@ -106,6 +106,7 @@ BEGIN
     IDS_CTRL_SHIFT "Ctrl+Shift"
     IDS_LEFT_ALT_SHIFT "左Alt+Shift"
     IDS_SWITCH_BET_INLANG "入力言語の切り替え"
     IDS_CTRL_SHIFT "Ctrl+Shift"
     IDS_LEFT_ALT_SHIFT "左Alt+Shift"
     IDS_SWITCH_BET_INLANG "入力言語の切り替え"
+    IDS_REBOOT_NOW, "Reboot now?"
 END
 
 STRINGTABLE
 END
 
 STRINGTABLE
index d271504..e860a67 100644 (file)
@@ -106,6 +106,7 @@ BEGIN
     IDS_CTRL_SHIFT "Ctrl+Shift"
     IDS_LEFT_ALT_SHIFT "Venstre Alt+Shift"
     IDS_SWITCH_BET_INLANG "Bytt mellom inndataspråk"
     IDS_CTRL_SHIFT "Ctrl+Shift"
     IDS_LEFT_ALT_SHIFT "Venstre Alt+Shift"
     IDS_SWITCH_BET_INLANG "Bytt mellom inndataspråk"
+    IDS_REBOOT_NOW, "Reboot now?"
 END
 
 STRINGTABLE
 END
 
 STRINGTABLE
index e7aee52..c303000 100644 (file)
@@ -114,6 +114,7 @@ BEGIN
     IDS_CTRL_SHIFT "Ctrl+Shift"
     IDS_LEFT_ALT_SHIFT "Lewy Alt+Shift"
     IDS_SWITCH_BET_INLANG "Przełącza pomiędzy układami klawiatury"
     IDS_CTRL_SHIFT "Ctrl+Shift"
     IDS_LEFT_ALT_SHIFT "Lewy Alt+Shift"
     IDS_SWITCH_BET_INLANG "Przełącza pomiędzy układami klawiatury"
+    IDS_REBOOT_NOW, "Reboot now?"
 END
 
 STRINGTABLE
 END
 
 STRINGTABLE
index 4ac6977..36a281b 100644 (file)
@@ -106,6 +106,7 @@ BEGIN
     IDS_CTRL_SHIFT "CTRL+SHIFT"
     IDS_LEFT_ALT_SHIFT "ALT esquerdo+SHIFT"
     IDS_SWITCH_BET_INLANG "Alternar entre idiomas de entrada"
     IDS_CTRL_SHIFT "CTRL+SHIFT"
     IDS_LEFT_ALT_SHIFT "ALT esquerdo+SHIFT"
     IDS_SWITCH_BET_INLANG "Alternar entre idiomas de entrada"
+    IDS_REBOOT_NOW, "Reboot now?"
 END
 
 STRINGTABLE
 END
 
 STRINGTABLE
index b7bf516..63dde21 100644 (file)
@@ -108,6 +108,7 @@ BEGIN
     IDS_CTRL_SHIFT "«Ctrl» + «Shift»"
     IDS_LEFT_ALT_SHIFT "«Alt» (stâng) + «Shift»"
     IDS_SWITCH_BET_INLANG "Comutarea între limbile de intrare"
     IDS_CTRL_SHIFT "«Ctrl» + «Shift»"
     IDS_LEFT_ALT_SHIFT "«Alt» (stâng) + «Shift»"
     IDS_SWITCH_BET_INLANG "Comutarea între limbile de intrare"
+    IDS_REBOOT_NOW, "Reboot now?"
 END
 
 STRINGTABLE
 END
 
 STRINGTABLE
index 057e302..ffd6e37 100644 (file)
@@ -106,6 +106,7 @@ BEGIN
     IDS_CTRL_SHIFT "Ctrl+Shift"
     IDS_LEFT_ALT_SHIFT "Alt слева+Shift"
     IDS_SWITCH_BET_INLANG "Переключение между языками ввода"
     IDS_CTRL_SHIFT "Ctrl+Shift"
     IDS_LEFT_ALT_SHIFT "Alt слева+Shift"
     IDS_SWITCH_BET_INLANG "Переключение между языками ввода"
+    IDS_REBOOT_NOW, "Reboot now?"
 END
 
 STRINGTABLE
 END
 
 STRINGTABLE
index 09069c1..4adb139 100644 (file)
@@ -111,6 +111,7 @@ BEGIN
     IDS_CTRL_SHIFT "Ctrl+Shift"
     IDS_LEFT_ALT_SHIFT "Ľavý Alt+Shift"
     IDS_SWITCH_BET_INLANG "Switch between input languages"
     IDS_CTRL_SHIFT "Ctrl+Shift"
     IDS_LEFT_ALT_SHIFT "Ľavý Alt+Shift"
     IDS_SWITCH_BET_INLANG "Switch between input languages"
+    IDS_REBOOT_NOW, "Reboot now?"
 END
 
 STRINGTABLE
 END
 
 STRINGTABLE
index 2c7051f..02566a8 100644 (file)
@@ -110,6 +110,7 @@ BEGIN
     IDS_CTRL_SHIFT "Ctrl+Shift"
     IDS_LEFT_ALT_SHIFT "Left Alt+Shift"
     IDS_SWITCH_BET_INLANG "Ndërro ndër gjuhët hyrese"
     IDS_CTRL_SHIFT "Ctrl+Shift"
     IDS_LEFT_ALT_SHIFT "Left Alt+Shift"
     IDS_SWITCH_BET_INLANG "Ndërro ndër gjuhët hyrese"
+    IDS_REBOOT_NOW, "Reboot now?"
 END
 
 STRINGTABLE
 END
 
 STRINGTABLE
index 1234b8c..0caed2b 100644 (file)
@@ -108,6 +108,7 @@ BEGIN
     IDS_CTRL_SHIFT "Denetim + Üst Damga"
     IDS_LEFT_ALT_SHIFT "Sol Seçenek + Üst Damga"
     IDS_SWITCH_BET_INLANG "Giriş dilleri arasında geçiş yap."
     IDS_CTRL_SHIFT "Denetim + Üst Damga"
     IDS_LEFT_ALT_SHIFT "Sol Seçenek + Üst Damga"
     IDS_SWITCH_BET_INLANG "Giriş dilleri arasında geçiş yap."
+    IDS_REBOOT_NOW, "Reboot now?"
 END
 
 STRINGTABLE
 END
 
 STRINGTABLE
index af336dd..bea4493 100644 (file)
@@ -114,6 +114,7 @@ BEGIN
     IDS_CTRL_SHIFT "Ctrl+Shift"
     IDS_LEFT_ALT_SHIFT "Alt зліва+Shift"
     IDS_SWITCH_BET_INLANG "Перемикання мов вводу"
     IDS_CTRL_SHIFT "Ctrl+Shift"
     IDS_LEFT_ALT_SHIFT "Alt зліва+Shift"
     IDS_SWITCH_BET_INLANG "Перемикання мов вводу"
+    IDS_REBOOT_NOW, "Reboot now?"
 END
 
 STRINGTABLE
 END
 
 STRINGTABLE
index cb25920..3781324 100644 (file)
@@ -108,6 +108,7 @@ BEGIN
     IDS_CTRL_SHIFT "Ctrl+Shift"
     IDS_LEFT_ALT_SHIFT "左 Alt+Shift"
     IDS_SWITCH_BET_INLANG "在输入语言间切换"
     IDS_CTRL_SHIFT "Ctrl+Shift"
     IDS_LEFT_ALT_SHIFT "左 Alt+Shift"
     IDS_SWITCH_BET_INLANG "在输入语言间切换"
+    IDS_REBOOT_NOW, "Reboot now?"
 END
 
 STRINGTABLE
 END
 
 STRINGTABLE
index 01ec0c4..39cc993 100644 (file)
@@ -108,6 +108,7 @@ BEGIN
     IDS_CTRL_SHIFT "Ctrl+Shift"
     IDS_LEFT_ALT_SHIFT "左 Alt+Shift"
     IDS_SWITCH_BET_INLANG "在輸入語言間切換"
     IDS_CTRL_SHIFT "Ctrl+Shift"
     IDS_LEFT_ALT_SHIFT "左 Alt+Shift"
     IDS_SWITCH_BET_INLANG "在輸入語言間切換"
+    IDS_REBOOT_NOW, "Reboot now?"
 END
 
 STRINGTABLE
 END
 
 STRINGTABLE
index b5ae953..fee7e9c 100644 (file)
@@ -57,6 +57,7 @@
 #define IDS_LEFT_ALT_SHIFT       15
 #define IDS_SWITCH_BET_INLANG    16
 #define IDC_TURNOFFTEXTSVCS_CB   17
 #define IDS_LEFT_ALT_SHIFT       15
 #define IDS_SWITCH_BET_INLANG    16
 #define IDC_TURNOFFTEXTSVCS_CB   17
+#define IDS_REBOOT_NOW           18
 
 /* Layouts */
 #define IDS_US_LAYOUT                                  5000
 
 /* Layouts */
 #define IDS_US_LAYOUT                                  5000
index 0404b63..72260a8 100644 (file)
@@ -2,7 +2,8 @@
  * PROJECT:         input.dll
  * FILE:            dll/cpl/input/settings_page.c
  * PURPOSE:         input.dll
  * PROJECT:         input.dll
  * FILE:            dll/cpl/input/settings_page.c
  * PURPOSE:         input.dll
- * PROGRAMMER:      Dmitry Chapyshev (dmitry@reactos.org)
+ * PROGRAMMERS:     Dmitry Chapyshev (dmitry@reactos.org)
+ *                  Katayama Hirofumi MZ (katayama.hirofumi.mz@gmail.com)
  */
 
 #include "input.h"
  */
 
 #include "input.h"
@@ -357,6 +358,32 @@ OnCommandSettingsPage(HWND hwndDlg, WPARAM wParam)
     }
 }
 
     }
 }
 
+BOOL EnableProcessPrivileges(LPCWSTR lpPrivilegeName, BOOL bEnable)
+{
+    HANDLE hToken;
+    LUID luid;
+    TOKEN_PRIVILEGES tokenPrivileges;
+    BOOL Ret;
+
+    Ret = OpenProcessToken(GetCurrentProcess(),
+                           TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,
+                           &hToken);
+    if (!Ret)
+        return Ret;     // failure
+
+    Ret = LookupPrivilegeValueW(NULL, lpPrivilegeName, &luid);
+    if (Ret)
+    {
+        tokenPrivileges.PrivilegeCount = 1;
+        tokenPrivileges.Privileges[0].Luid = luid;
+        tokenPrivileges.Privileges[0].Attributes = bEnable ? SE_PRIVILEGE_ENABLED : 0;
+
+        Ret = AdjustTokenPrivileges(hToken, FALSE, &tokenPrivileges, 0, 0, 0);
+    }
+
+    CloseHandle(hToken);
+    return Ret;
+}
 
 static VOID
 OnNotifySettingsPage(HWND hwndDlg, LPARAM lParam)
 
 static VOID
 OnNotifySettingsPage(HWND hwndDlg, LPARAM lParam)
@@ -405,7 +432,20 @@ OnNotifySettingsPage(HWND hwndDlg, LPARAM lParam)
         case PSN_APPLY:
         {
             /* Write Input Methods list to registry */
         case PSN_APPLY:
         {
             /* Write Input Methods list to registry */
-            InputList_Process();
+            if (InputList_Process())
+            {
+                /* Needs reboot */
+                WCHAR szNeedsReboot[128], szLanguage[64];
+                LoadStringW(hApplet, IDS_REBOOT_NOW, szNeedsReboot, _countof(szNeedsReboot));
+                LoadStringW(hApplet, IDS_LANGUAGE, szLanguage, _countof(szLanguage));
+
+                if (MessageBoxW(hwndDlg, szNeedsReboot, szLanguage,
+                                MB_ICONINFORMATION | MB_YESNOCANCEL) == IDYES)
+                {
+                    EnableProcessPrivileges(SE_SHUTDOWN_NAME, TRUE);
+                    ExitWindowsEx(EWX_REBOOT | EWX_FORCE, 0);
+                }
+            }
         }
         break;
     }
         }
         break;
     }