3 * FILE: dll/cpl/input/settings_page.c
5 * PROGRAMMERS: Dmitry Chapyshev (dmitry@reactos.org)
6 * Katayama Hirofumi MZ (katayama.hirofumi.mz@gmail.com)
10 #include "layout_list.h"
11 #include "locale_list.h"
12 #include "input_list.h"
16 CreateLayoutIcon(LPWSTR szLayout
, BOOL bIsDefault
)
18 INT width
= GetSystemMetrics(SM_CXSMICON
) * 2;
19 INT height
= GetSystemMetrics(SM_CYSMICON
);
26 hdc
= CreateCompatibleDC(hdcsrc
);
27 hBitmap
= CreateCompatibleBitmap(hdcsrc
, width
, height
);
29 ReleaseDC(NULL
, hdcsrc
);
35 hBmpNew
= CreateBitmap(width
, height
, 1, 1, NULL
);
40 if (SystemParametersInfoW(SPI_GETICONTITLELOGFONT
, sizeof(lf
), &lf
, 0))
45 hFont
= CreateFontIndirectW(&lf
);
51 hBmpOld
= SelectObject(hdc
, hBitmap
);
57 SetRect(&rect
, 0, 0, width
/ 2, height
);
59 if (bIsDefault
!= FALSE
)
61 SetBkColor(hdc
, GetSysColor(COLOR_WINDOW
));
62 SetTextColor(hdc
, GetSysColor(COLOR_WINDOWTEXT
));
64 ExtTextOutW(hdc
, rect
.left
, rect
.top
, ETO_OPAQUE
, &rect
, L
"", 0, NULL
);
66 SelectObject(hdc
, hFont
);
67 DrawTextW(hdc
, L
"\x2022", 1, &rect
, DT_SINGLELINE
| DT_CENTER
| DT_VCENTER
);
71 FillRect(hdc
, &rect
, GetSysColorBrush(COLOR_WINDOW
));
74 SetRect(&rect
, width
/ 2, 0, width
, height
);
76 SetBkColor(hdc
, GetSysColor(COLOR_HIGHLIGHT
));
77 SetTextColor(hdc
, GetSysColor(COLOR_HIGHLIGHTTEXT
));
79 ExtTextOutW(hdc
, rect
.left
, rect
.top
, ETO_OPAQUE
, &rect
, L
"", 0, NULL
);
81 SelectObject(hdc
, hFont
);
82 DrawTextW(hdc
, szLayout
, 2, &rect
, DT_SINGLELINE
| DT_CENTER
| DT_VCENTER
);
84 SelectObject(hdc
, hBmpNew
);
86 PatBlt(hdc
, 0, 0, width
, height
, BLACKNESS
);
88 SelectObject(hdc
, hBmpOld
);
90 IconInfo
.hbmColor
= hBitmap
;
91 IconInfo
.hbmMask
= hBmpNew
;
92 IconInfo
.fIcon
= TRUE
;
94 hIcon
= CreateIconIndirect(&IconInfo
);
96 DeleteObject(hBmpOld
);
103 DeleteObject(hBmpNew
);
108 DeleteObject(hBitmap
);
115 SetControlsState(HWND hwndDlg
, BOOL bIsEnabled
)
117 EnableWindow(GetDlgItem(hwndDlg
, IDC_REMOVE_BUTTON
), bIsEnabled
);
118 EnableWindow(GetDlgItem(hwndDlg
, IDC_PROP_BUTTON
), bIsEnabled
);
119 EnableWindow(GetDlgItem(hwndDlg
, IDC_SET_DEFAULT
), bIsEnabled
);
124 AddToInputListView(HWND hwndList
, INPUT_LIST_NODE
*pInputNode
)
129 HIMAGELIST hImageList
;
131 hImageList
= ListView_GetImageList(hwndList
, LVSIL_SMALL
);
133 if (hImageList
!= NULL
)
137 hLayoutIcon
= CreateLayoutIcon(pInputNode
->pszIndicator
,
138 (pInputNode
->wFlags
& INPUT_LIST_NODE_FLAG_DEFAULT
));
140 if (hLayoutIcon
!= NULL
)
142 ImageIndex
= ImageList_AddIcon(hImageList
, hLayoutIcon
);
143 DestroyIcon(hLayoutIcon
);
147 ZeroMemory(&item
, sizeof(item
));
149 item
.mask
= LVIF_TEXT
| LVIF_PARAM
| LVIF_IMAGE
;
150 item
.pszText
= pInputNode
->pLocale
->pszName
;
151 item
.iItem
= ListView_GetItemCount(hwndList
) + 1;
152 item
.lParam
= (LPARAM
)pInputNode
;
153 item
.iImage
= ImageIndex
;
155 ItemIndex
= ListView_InsertItem(hwndList
, &item
);
157 ListView_SetItemText(hwndList
, ItemIndex
, 1, pInputNode
->pLayout
->pszName
);
162 UpdateInputListView(HWND hwndList
)
164 INPUT_LIST_NODE
*pCurrentInputNode
;
165 HIMAGELIST hImageList
;
167 hImageList
= ListView_GetImageList(hwndList
, LVSIL_SMALL
);
168 if (hImageList
!= NULL
)
170 ImageList_RemoveAll(hImageList
);
173 ListView_DeleteAllItems(hwndList
);
175 for (pCurrentInputNode
= InputList_GetFirst();
176 pCurrentInputNode
!= NULL
;
177 pCurrentInputNode
= pCurrentInputNode
->pNext
)
179 if (!(pCurrentInputNode
->wFlags
& INPUT_LIST_NODE_FLAG_DELETED
))
181 AddToInputListView(hwndList
, pCurrentInputNode
);
188 OnInitSettingsPage(HWND hwndDlg
)
196 hwndInputList
= GetDlgItem(hwndDlg
, IDC_KEYLAYOUT_LIST
);
198 if (hwndInputList
!= NULL
)
200 WCHAR szBuffer
[MAX_STR_LEN
];
201 HIMAGELIST hLayoutImageList
;
204 ListView_SetExtendedListViewStyle(hwndInputList
, LVS_EX_FULLROWSELECT
);
206 ZeroMemory(&column
, sizeof(column
));
208 column
.mask
= LVCF_FMT
| LVCF_TEXT
| LVCF_WIDTH
| LVCF_SUBITEM
;
210 LoadStringW(hApplet
, IDS_LANGUAGE
, szBuffer
, ARRAYSIZE(szBuffer
));
211 column
.fmt
= LVCFMT_LEFT
;
213 column
.pszText
= szBuffer
;
215 ListView_InsertColumn(hwndInputList
, 0, &column
);
217 LoadStringW(hApplet
, IDS_LAYOUT
, szBuffer
, ARRAYSIZE(szBuffer
));
218 column
.fmt
= LVCFMT_RIGHT
;
221 column
.pszText
= szBuffer
;
222 ListView_InsertColumn(hwndInputList
, 1, &column
);
224 hLayoutImageList
= ImageList_Create(GetSystemMetrics(SM_CXSMICON
) * 2,
225 GetSystemMetrics(SM_CYSMICON
),
226 ILC_COLOR8
| ILC_MASK
, 0, 0);
227 if (hLayoutImageList
!= NULL
)
229 ListView_SetImageList(hwndInputList
, hLayoutImageList
, LVSIL_SMALL
);
232 UpdateInputListView(hwndInputList
);
235 SetControlsState(hwndDlg
, FALSE
);
240 OnDestroySettingsPage(HWND hwndDlg
)
242 HIMAGELIST hImageList
;
244 LayoutList_Destroy();
245 LocaleList_Destroy();
248 hImageList
= ListView_GetImageList(GetDlgItem(hwndDlg
, IDC_KEYLAYOUT_LIST
),
250 if (hImageList
!= NULL
)
252 ImageList_Destroy(hImageList
);
258 OnCommandSettingsPage(HWND hwndDlg
, WPARAM wParam
)
260 switch (LOWORD(wParam
))
264 if (DialogBoxW(hApplet
,
265 MAKEINTRESOURCEW(IDD_ADD
),
267 AddDialogProc
) == IDOK
)
269 UpdateInputListView(GetDlgItem(hwndDlg
, IDC_KEYLAYOUT_LIST
));
270 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
275 case IDC_REMOVE_BUTTON
:
279 hwndList
= GetDlgItem(hwndDlg
, IDC_KEYLAYOUT_LIST
);
281 if (hwndList
!= NULL
)
285 item
.mask
= LVIF_PARAM
;
286 item
.iItem
= ListView_GetNextItem(hwndList
, -1, LVNI_SELECTED
);
288 if (ListView_GetItem(hwndList
, &item
) != FALSE
)
290 InputList_Remove((INPUT_LIST_NODE
*) item
.lParam
);
291 UpdateInputListView(hwndList
);
292 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
298 case IDC_PROP_BUTTON
:
302 hwndList
= GetDlgItem(hwndDlg
, IDC_KEYLAYOUT_LIST
);
304 if (hwndList
!= NULL
)
308 item
.mask
= LVIF_PARAM
;
309 item
.iItem
= ListView_GetNextItem(hwndList
, -1, LVNI_SELECTED
);
311 if (ListView_GetItem(hwndList
, &item
) != FALSE
)
313 if (DialogBoxParamW(hApplet
,
314 MAKEINTRESOURCEW(IDD_INPUT_LANG_PROP
),
317 item
.lParam
) == IDOK
)
319 UpdateInputListView(hwndList
);
320 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
327 case IDC_SET_DEFAULT
:
331 hwndList
= GetDlgItem(hwndDlg
, IDC_KEYLAYOUT_LIST
);
333 if (hwndList
!= NULL
)
337 item
.mask
= LVIF_PARAM
;
338 item
.iItem
= ListView_GetNextItem(hwndList
, -1, LVNI_SELECTED
);
340 if (ListView_GetItem(hwndList
, &item
) != FALSE
)
342 InputList_SetDefault((INPUT_LIST_NODE
*) item
.lParam
);
343 UpdateInputListView(hwndList
);
344 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
350 case IDC_KEY_SET_BTN
:
353 MAKEINTRESOURCEW(IDD_KEYSETTINGS
),
355 KeySettingsDialogProc
);
361 BOOL
EnableProcessPrivileges(LPCWSTR lpPrivilegeName
, BOOL bEnable
)
365 TOKEN_PRIVILEGES tokenPrivileges
;
368 Ret
= OpenProcessToken(GetCurrentProcess(),
369 TOKEN_ADJUST_PRIVILEGES
| TOKEN_QUERY
,
372 return Ret
; // failure
374 Ret
= LookupPrivilegeValueW(NULL
, lpPrivilegeName
, &luid
);
377 tokenPrivileges
.PrivilegeCount
= 1;
378 tokenPrivileges
.Privileges
[0].Luid
= luid
;
379 tokenPrivileges
.Privileges
[0].Attributes
= bEnable
? SE_PRIVILEGE_ENABLED
: 0;
381 Ret
= AdjustTokenPrivileges(hToken
, FALSE
, &tokenPrivileges
, 0, 0, 0);
389 OnNotifySettingsPage(HWND hwndDlg
, LPARAM lParam
)
393 header
= (LPNMHDR
)lParam
;
395 switch (header
->code
)
399 if (header
->idFrom
== IDC_KEYLAYOUT_LIST
)
401 INT iSelected
= ListView_GetNextItem(header
->hwndFrom
, -1, LVNI_SELECTED
);
407 SetControlsState(hwndDlg
, TRUE
);
409 item
.mask
= LVIF_PARAM
;
410 item
.iItem
= iSelected
;
412 if (ListView_GetItem(header
->hwndFrom
, &item
) != FALSE
)
414 INPUT_LIST_NODE
*pInput
;
416 pInput
= (INPUT_LIST_NODE
*) item
.lParam
;
418 if (pInput
!= NULL
&& pInput
->wFlags
& INPUT_LIST_NODE_FLAG_DEFAULT
)
420 EnableWindow(GetDlgItem(hwndDlg
, IDC_SET_DEFAULT
), FALSE
);
426 SetControlsState(hwndDlg
, FALSE
);
434 /* Write Input Methods list to registry */
435 if (InputList_Process())
438 WCHAR szNeedsReboot
[128], szLanguage
[64];
439 LoadStringW(hApplet
, IDS_REBOOT_NOW
, szNeedsReboot
, _countof(szNeedsReboot
));
440 LoadStringW(hApplet
, IDS_LANGUAGE
, szLanguage
, _countof(szLanguage
));
442 if (MessageBoxW(hwndDlg
, szNeedsReboot
, szLanguage
,
443 MB_ICONINFORMATION
| MB_YESNOCANCEL
) == IDYES
)
445 EnableProcessPrivileges(SE_SHUTDOWN_NAME
, TRUE
);
446 ExitWindowsEx(EWX_REBOOT
| EWX_FORCE
, 0);
456 SettingsPageProc(HWND hwndDlg
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
461 OnInitSettingsPage(hwndDlg
);
465 OnDestroySettingsPage(hwndDlg
);
469 OnCommandSettingsPage(hwndDlg
, wParam
);
473 OnNotifySettingsPage(hwndDlg
, lParam
);