xref: /reactos/dll/cpl/joy/joy.c (revision d6eebaa4)
1 /*
2  *  ReactOS
3  *  Copyright (C) 2004 ReactOS Team
4  *
5  *  This program is free software; you can redistribute it and/or modify
6  *  it under the terms of the GNU General Public License as published by
7  *  the Free Software Foundation; either version 2 of the License, or
8  *  (at your option) any later version.
9  *
10  *  This program is distributed in the hope that it will be useful,
11  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  *  GNU General Public License for more details.
14  *
15  *  You should have received a copy of the GNU General Public License along
16  *  with this program; if not, write to the Free Software Foundation, Inc.,
17  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18  */
19 /*
20  *
21  * PROJECT:         ReactOS Software Control Panel
22  * FILE:            dll/cpl/joy/joy.c
23  * PURPOSE:         ReactOS Software Control Panel
24  * PROGRAMMER:      Dmitry Chapyshev (lentind@yandex.ru)
25  * UPDATE HISTORY:
26  *    10-18-2007  Created
27  *    05-18-2020  Updated (init of dialog and combobox)
28  */
29 
30 #include "joy.h"
31 
32 #define NUM_APPLETS    (1)
33 
34 LONG CALLBACK SystemApplet(HWND hwnd, UINT uMsg, LPARAM lParam1, LPARAM lParam2);
35 HINSTANCE hApplet = 0;
36 
37 /* Applets */
38 
39 APPLET Applets[NUM_APPLETS] =
40 {
41     {IDI_CPLSYSTEM, IDS_CPLSYSTEMNAME, IDS_CPLSYSTEMDESCRIPTION, SystemApplet}
42 };
43 
44 VOID
45 AddColumns(HWND hList)
46 {
47     LV_COLUMN dummy;
48     RECT rect;
49     int Size;
50     TCHAR szBuf[256];
51 
52     GetClientRect(hList, &rect);
53     Size = rect.right - rect.left - 250;
54 
55     LoadString(hApplet, IDS_STATUS, szBuf, sizeof(szBuf) / sizeof(TCHAR));
56 
57     ZeroMemory(&dummy, sizeof(LV_COLUMN));
58     dummy.mask     = LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM;
59     dummy.iSubItem = 0;
60     dummy.pszText  = (LPTSTR)szBuf;
61     dummy.cx       = Size;
62     (void)ListView_InsertColumn(hList, 0, &dummy);
63 
64     GetClientRect(hList, &rect);
65 
66     LoadString(hApplet, IDS_CONTROLLER, szBuf, sizeof(szBuf) / sizeof(TCHAR));
67 
68     ZeroMemory(&dummy, sizeof(LV_COLUMN));
69     dummy.mask     = LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM;
70     dummy.iSubItem = 0;
71     dummy.pszText  = (LPTSTR)szBuf;
72     dummy.cx       = rect.right - rect.left - Size;
73     (void)ListView_InsertColumn(hList, 0, &dummy);
74 }
75 
76 INT_PTR CALLBACK
77 AdvancedPageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
78 {
79     UNREFERENCED_PARAMETER(lParam);
80 
81     switch (uMsg)
82     {
83         case WM_INITDIALOG:
84         {
85             WCHAR szBuf[256];
86             HWND hComboHwnd = GetDlgItem(hwndDlg,IDC_PREFERRED_DEV_COMBO);
87 
88             LoadStringW(hApplet, IDS_NONE, szBuf, _countof(szBuf));
89             SendMessageW(hComboHwnd, CB_ADDSTRING, 0, (LPARAM)szBuf);
90             SendMessageW(hComboHwnd, CB_SETCURSEL, 0, (LPARAM)NULL);
91             break;
92         }
93 
94         case WM_COMMAND:
95             switch (LOWORD(wParam))
96             {
97                 case IDOK:
98                     EndDialog(hwndDlg,LOWORD(wParam));
99                     break;
100 
101                 case IDCANCEL:
102                     EndDialog(hwndDlg,LOWORD(wParam));
103                     break;
104             }
105             break;
106 
107         case WM_NOTIFY:
108             break;
109 
110         case WM_SYSCOMMAND:
111             switch (LOWORD(wParam))
112             {
113                 case SC_CONTEXTHELP:
114                     // Not implemented yet
115                     break;
116             }
117             break;
118     }
119     return 0;
120 }
121 
122 INT_PTR CALLBACK
123 CustomPageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
124 {
125     UNREFERENCED_PARAMETER(lParam);
126 
127     switch (uMsg)
128     {
129         case WM_INITDIALOG:
130         {
131             WCHAR szBuf[2];
132             HWND hComboHwnd;
133             szBuf[1] = UNICODE_NULL;
134 
135             CheckDlgButton(hwndDlg, IDC_JOYSTICK_RADIO, BST_CHECKED);
136 
137             hComboHwnd = GetDlgItem(hwndDlg, IDC_AXES_COMBO);
138             szBuf[0] = L'2';
139             SendMessageW(hComboHwnd, CB_ADDSTRING, 0, (LPARAM)szBuf);
140             szBuf[0] = L'3';
141             SendMessageW(hComboHwnd, CB_ADDSTRING, 0, (LPARAM)szBuf);
142             szBuf[0] = L'4';
143             SendMessageW(hComboHwnd, CB_ADDSTRING, 0, (LPARAM)szBuf);
144             SendMessageW(hComboHwnd, CB_SETCURSEL, 0, 0);
145 
146             hComboHwnd = GetDlgItem(hwndDlg, IDC_BUTTONS_COMBO);
147             szBuf[0] = L'0';
148             SendMessageW(hComboHwnd, CB_ADDSTRING, 0, (LPARAM)szBuf);
149             szBuf[0] = L'1';
150             SendMessageW(hComboHwnd, CB_ADDSTRING, 0, (LPARAM)szBuf);
151             szBuf[0] = L'2';
152             SendMessageW(hComboHwnd, CB_ADDSTRING, 0, (LPARAM)szBuf);
153             szBuf[0] = L'3';
154             SendMessageW(hComboHwnd, CB_ADDSTRING, 0, (LPARAM)szBuf);
155             szBuf[0] = L'4';
156             SendMessageW(hComboHwnd, CB_ADDSTRING, 0, (LPARAM)szBuf);
157             SendMessageW(hComboHwnd, CB_SETCURSEL, 4, 0);
158 
159             break;
160         }
161 
162         case WM_COMMAND:
163             switch (LOWORD(wParam))
164             {
165                 case IDOK:
166                     EndDialog(hwndDlg,LOWORD(wParam));
167                     break;
168 
169                 case IDCANCEL:
170                     EndDialog(hwndDlg,LOWORD(wParam));
171                     break;
172             }
173             break;
174 
175         case WM_NOTIFY:
176             break;
177 
178         case WM_SYSCOMMAND:
179             switch (LOWORD(wParam))
180             {
181                 case SC_CONTEXTHELP:
182                     // Not implemented yet
183                     break;
184             }
185             break;
186     }
187     return 0;
188 }
189 
190 INT_PTR CALLBACK
191 AddPageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
192 {
193     UNREFERENCED_PARAMETER(lParam);
194 
195     switch (uMsg)
196     {
197         case WM_INITDIALOG:
198             break;
199 
200         case WM_COMMAND:
201             switch (LOWORD(wParam))
202             {
203                 case IDC_CUSTOM_BUTTON:
204                     DialogBox(hApplet,
205                               MAKEINTRESOURCE(IDD_CUSTOM),
206                               hwndDlg,
207                               CustomPageProc);
208                     break;
209 
210                 case IDOK:
211                     EndDialog(hwndDlg,LOWORD(wParam));
212                     break;
213 
214                 case IDCANCEL:
215                     EndDialog(hwndDlg,LOWORD(wParam));
216                     break;
217             }
218             break;
219 
220         case WM_NOTIFY:
221             break;
222 
223         case WM_SYSCOMMAND:
224             switch (LOWORD(wParam))
225             {
226                 case SC_CONTEXTHELP:
227                     // Not implemented yet
228                     break;
229             }
230             break;
231     }
232     return 0;
233 }
234 
235 /* Property page dialog callback */
236 INT_PTR CALLBACK
237 MainPageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
238 {
239     static HICON s_hIcon = NULL, s_hIconSm = NULL;
240     UNREFERENCED_PARAMETER(lParam);
241 
242     switch (uMsg)
243     {
244         case WM_INITDIALOG:
245             AddColumns(GetDlgItem(hwndDlg, IDC_CONTROLLER_LIST));
246             s_hIcon = LoadIconW(hApplet, MAKEINTRESOURCEW(IDI_CPLSYSTEM));
247             s_hIconSm = (HICON)LoadImageW(hApplet, MAKEINTRESOURCEW(IDI_CPLSYSTEM),
248                                           IMAGE_ICON,
249                                           GetSystemMetrics(SM_CXSMICON),
250                                           GetSystemMetrics(SM_CYSMICON), 0);
251             SendMessageW(hwndDlg, WM_SETICON, ICON_BIG, (LPARAM)s_hIcon);
252             SendMessageW(hwndDlg, WM_SETICON, ICON_SMALL, (LPARAM)s_hIconSm);
253             break;
254 
255         case WM_COMMAND:
256             switch (LOWORD(wParam))
257             {
258                 case IDC_ADD_BUTTON:
259                     DialogBox(hApplet,
260                               MAKEINTRESOURCE(IDD_ADD),
261                               hwndDlg,
262                               AddPageProc);
263                     break;
264 
265                 case IDC_ADVANCED_BUTTON:
266                     DialogBox(hApplet,
267                               MAKEINTRESOURCE(IDD_ADVANCED),
268                               hwndDlg,
269                               AdvancedPageProc);
270                     break;
271 
272                 case IDOK:
273                 case IDCANCEL:
274                     DestroyIcon(s_hIcon);
275                     DestroyIcon(s_hIconSm);
276                     EndDialog(hwndDlg,LOWORD(wParam));
277                     break;
278             }
279             break;
280 
281         case WM_NOTIFY:
282             break;
283 
284         case WM_SYSCOMMAND:
285             switch (LOWORD(wParam))
286             {
287                 case SC_CLOSE:
288                     DestroyIcon(s_hIcon);
289                     DestroyIcon(s_hIconSm);
290                     EndDialog(hwndDlg,LOWORD(wParam));
291                     break;
292 
293                 case SC_CONTEXTHELP:
294                     // Not implemented yet
295                     break;
296             }
297             break;
298     }
299     return 0;
300 }
301 
302 /* First Applet */
303 LONG CALLBACK
304 SystemApplet(HWND hwnd, UINT uMsg, LPARAM lParam1, LPARAM lParam2)
305 {
306     UNREFERENCED_PARAMETER(uMsg);
307     UNREFERENCED_PARAMETER(lParam1);
308     UNREFERENCED_PARAMETER(lParam2);
309 
310     DialogBox(hApplet,
311               MAKEINTRESOURCE(IDD_PROPPAGEMAIN),
312               hwnd,
313               MainPageProc);
314 
315     return (LONG)TRUE;
316 }
317 
318 /* Control Panel Callback */
319 LONG CALLBACK
320 CPlApplet(HWND hwndCPl, UINT uMsg, LPARAM lParam1, LPARAM lParam2)
321 {
322     CPLINFO *CPlInfo;
323     UINT i = (UINT)lParam1;
324     UNREFERENCED_PARAMETER(hwndCPl);
325 
326     switch (uMsg)
327     {
328         case CPL_INIT:
329             return TRUE;
330 
331         case CPL_GETCOUNT:
332             return NUM_APPLETS;
333 
334         case CPL_INQUIRE:
335             if (i < NUM_APPLETS)
336             {
337                 CPlInfo = (CPLINFO*)lParam2;
338                 CPlInfo->lData = 0;
339                 CPlInfo->idIcon = Applets[i].idIcon;
340                 CPlInfo->idName = Applets[i].idName;
341                 CPlInfo->idInfo = Applets[i].idDescription;
342             }
343             else
344             {
345                 return TRUE;
346             }
347             break;
348 
349         case CPL_DBLCLK:
350             if (i < NUM_APPLETS)
351                 Applets[i].AppletProc(hwndCPl, uMsg, lParam1, lParam2);
352             else
353                 return TRUE;
354             break;
355     }
356 
357     return FALSE;
358 }
359 
360 BOOL WINAPI
361 DllMain(HINSTANCE hinstDLL, DWORD dwReason, LPVOID lpvReserved)
362 {
363     UNREFERENCED_PARAMETER(lpvReserved);
364 
365     switch (dwReason)
366     {
367         case DLL_PROCESS_ATTACH:
368         case DLL_THREAD_ATTACH:
369             CoInitialize(NULL);
370             hApplet = hinstDLL;
371             break;
372     }
373 
374     return TRUE;
375 }
376