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