[SHELL32]
[reactos.git] / reactos / dll / cpl / input / keysettings.c
1 /*
2 *
3 * PROJECT: input.dll
4 * FILE: dll/win32/input/keysettings.c
5 * PURPOSE: input.dll
6 * PROGRAMMER: Dmitry Chapyshev (dmitry@reactos.org)
7 * Colin Finck
8 * UPDATE HISTORY:
9 * 06-09-2007 Created
10 */
11
12 #include "input.h"
13
14 static HWND hKeySettingsWnd;
15
16 static VOID
17 AddListColumn(HWND hDlg)
18 {
19 LV_COLUMN column;
20 HWND hList = GetDlgItem(hDlg, IDC_KEY_LISTVIEW);
21
22 ZeroMemory(&column, sizeof(LV_COLUMN));
23 column.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM;
24
25 column.fmt = LVCFMT_LEFT;
26 column.iSubItem = 0;
27 column.pszText = _T("");
28 column.cx = 210;
29 (VOID) ListView_InsertColumn(hList, 0, &column);
30
31 column.fmt = LVCFMT_RIGHT;
32 column.cx = 145;
33 column.iSubItem = 1;
34 column.pszText = _T("");
35 (VOID) ListView_InsertColumn(hList, 1, &column);
36 }
37
38 static DWORD
39 GetAttributes()
40 {
41 DWORD dwValue, dwType, dwSize;
42 HKEY hKey;
43
44 if (RegOpenKeyEx(HKEY_CURRENT_USER, _T("Keyboard Layout"), 0, KEY_QUERY_VALUE, &hKey) != ERROR_SUCCESS)
45 return 0x0;
46
47 dwType = REG_DWORD;
48 dwSize = sizeof(DWORD);
49
50 if (RegQueryValueEx(hKey, _T("Attributes"), NULL, &dwType, (LPBYTE)&dwValue, &dwSize) != ERROR_SUCCESS)
51 {
52 RegCloseKey(hKey);
53 return 0x0;
54 }
55
56 RegCloseKey(hKey);
57 return dwValue;
58 }
59
60 static VOID
61 SaveKeySettings(HWND hDlg)
62 {
63 HKEY hKey;
64 DWORD dwValue;
65
66 if (SendDlgItemMessage(hDlg, IDC_PRESS_CL_KEY_RB, BM_GETCHECK, 0, 0) == BST_CHECKED)
67 dwValue = 0x0;
68 else
69 dwValue = 0x10000;
70
71 if (RegCreateKeyEx(HKEY_CURRENT_USER, _T("Keyboard Layout"), 0, NULL,
72 REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS,
73 NULL, &hKey, NULL) == ERROR_SUCCESS)
74 {
75 RegSetValueEx(hKey, _T("Attributes"), 0, REG_DWORD, (LPBYTE)&dwValue, sizeof(DWORD));
76
77 RegCloseKey(hKey);
78 }
79 }
80
81 static VOID
82 InitKeySettingsDlg(HWND hDlg)
83 {
84 TCHAR szHotkey[1 + 1], szLangHotkey[1 + 1], szLayoutHotkey[1 + 1],
85 szTitle[MAX_PATH], szText[MAX_PATH];
86 LV_ITEM item = {0};
87 HWND hHotkeyList = GetDlgItem(hDlg, IDC_KEY_LISTVIEW);
88 INT i;
89
90 if (GetAttributes() != 0x0)
91 SendDlgItemMessage(hDlg, IDC_PRESS_SHIFT_KEY_RB, BM_SETCHECK, 1, 1);
92 else
93 SendDlgItemMessage(hDlg, IDC_PRESS_CL_KEY_RB, BM_SETCHECK, 1, 1);
94
95 if (!GetHotkeys(szHotkey, szLangHotkey, szLayoutHotkey))
96 return;
97
98 if (!LoadString(hApplet, IDS_SWITCH_BET_INLANG, szTitle, sizeof(szTitle) / sizeof(TCHAR)))
99 return;
100
101 if (_tcscmp(szLangHotkey, _T("2")) == 0)
102 LoadString(hApplet, IDS_CTRL_SHIFT, szText, sizeof(szText) / sizeof(TCHAR));
103 else if (_tcscmp(szLangHotkey, _T("1")) == 0)
104 LoadString(hApplet, IDS_LEFT_ALT_SHIFT, szText, sizeof(szText) / sizeof(TCHAR));
105 else
106 LoadString(hApplet, IDS_NONE, szText, sizeof(szText) / sizeof(TCHAR));
107
108 item.mask = LVIF_TEXT | LVIF_PARAM | LVIF_STATE;
109 item.pszText = szTitle;
110 item.iItem = 0;
111 i = ListView_InsertItem(hHotkeyList, &item);
112
113 ListView_SetItemText(hHotkeyList, i, 1, szText);
114
115 (VOID) ListView_SetHotItem(hHotkeyList, i);
116 ListView_SetItemState(hHotkeyList, i, LVIS_SELECTED, LVIS_OVERLAYMASK);
117 }
118
119 VOID
120 UpdateKeySettingsList()
121 {
122 (VOID) ListView_DeleteAllItems(GetDlgItem(hKeySettingsWnd, IDC_KEY_LISTVIEW));
123 InitKeySettingsDlg(hKeySettingsWnd);
124 }
125
126 INT_PTR CALLBACK
127 KeySettingsDlgProc(HWND hDlg,
128 UINT message,
129 WPARAM wParam,
130 LPARAM lParam)
131 {
132 UNREFERENCED_PARAMETER(lParam);
133
134 switch (message)
135 {
136 case WM_INITDIALOG:
137 hKeySettingsWnd = hDlg;
138 AddListColumn(hDlg);
139 (VOID) ListView_SetExtendedListViewStyle(GetDlgItem(hDlg, IDC_KEY_LISTVIEW),
140 LVS_EX_FULLROWSELECT);
141 InitKeySettingsDlg(hDlg);
142 break;
143
144 case WM_COMMAND:
145 switch (LOWORD(wParam))
146 {
147 case IDC_CHANGE_KEY_SEQ_BTN:
148 DialogBox(hApplet,
149 MAKEINTRESOURCE(IDD_CHANGE_KEY_SEQ),
150 hDlg,
151 ChangeKeySeqDlgProc);
152 break;
153
154 case IDOK:
155 SaveKeySettings(hDlg);
156 EndDialog(hDlg, LOWORD(wParam));
157 break;
158
159 case IDCANCEL:
160 EndDialog(hDlg, LOWORD(wParam));
161 break;
162 }
163 break;
164 }
165
166 return FALSE;
167 }
168
169 /* EOF */