3 * Copyright (C) 2004 ReactOS Team
4 * Copyright (C) 2004 GkWare e.K.
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
22 * PROJECT: ReactOS System Control Panel
23 * FILE: lib/cpl/system/control.c
24 * PURPOSE: ReactOS System Control Panel
25 * PROGRAMMER: Gero Kuehn (reactos.filter@gkware.com)
40 //#define CONTROL_DEBUG_ENABLE
42 #ifdef CONTROL_DEBUG_ENABLE
43 #define CTL_DEBUG(x) dbgprint x
48 #define MYWNDCLASS _T("CTLPANELCLASS")
50 typedef LONG (CALLBACK
*CPLAPPLETFUNC
)(HWND hwndCPL
, UINT uMsg
, LPARAM lParam1
, LPARAM lParam2
);
52 typedef struct CPLLISTENTRY
54 TCHAR pszPath
[MAX_PATH
];
59 } CPLLISTENTRY
, *PCPLLISTENTRY
;
67 VOID
dbgprint(TCHAR
*format
,...)
73 _vstprintf(buf
,format
,va
);
74 OutputDebugString(buf
);
78 VOID
PopulateCPLList(HWND hLisCtrl
)
82 TCHAR pszSearchPath
[MAX_PATH
];
83 HIMAGELIST hImgListSmall
;
84 HIMAGELIST hImgListLarge
;
88 TCHAR pszPath
[MAX_PATH
];
90 /* Icon drawing mode */
91 pDevMode
.dmSize
= sizeof(DEVMODE
);
92 pDevMode
.dmDriverExtra
= 0;
94 EnumDisplaySettings(NULL
,ENUM_CURRENT_SETTINGS
,&pDevMode
);
95 switch (pDevMode
.dmBitsPerPel
)
97 case 32: ColorDepth
= ILC_COLOR32
; break;
98 case 24: ColorDepth
= ILC_COLOR24
; break;
99 case 16: ColorDepth
= ILC_COLOR16
; break;
100 case 8: ColorDepth
= ILC_COLOR8
; break;
101 case 4: ColorDepth
= ILC_COLOR4
; break;
102 default: ColorDepth
= ILC_COLOR
; break;
105 hImgListSmall
= ImageList_Create(16,16,ColorDepth
| ILC_MASK
,5,5);
106 hImgListLarge
= ImageList_Create(32,32,ColorDepth
| ILC_MASK
,5,5);
108 GetSystemDirectory(pszSearchPath
,MAX_PATH
);
109 _tcscat(pszSearchPath
,_T("\\*.cpl"));
111 hFind
= FindFirstFile(pszSearchPath
,&fd
);
112 while (hFind
!= INVALID_HANDLE_VALUE
)
114 PCPLLISTENTRY pEntry
;
115 CTL_DEBUG((_T("Found %s\r\n"), fd
.cFileName
));
117 _tcscpy(pszPath
, pszSearchPath
);
118 *_tcsrchr(pszPath
, '\\')=0;
119 _tcscat(pszPath
, _T("\\"));
120 _tcscat(pszPath
, fd
.cFileName
);
122 hDll
= LoadLibrary(pszPath
);
123 CTL_DEBUG((_T("Handle %08X\r\n"), hDll
));
125 pFunc
= (CPLAPPLETFUNC
)GetProcAddress(hDll
, "CPlApplet");
126 CTL_DEBUG((_T("CPLFunc %08X\r\n"), pFunc
));
128 if (pFunc
&& pFunc(hLisCtrl
, CPL_INIT
, 0, 0))
132 uPanelCount
= (UINT
)pFunc(hLisCtrl
, CPL_GETCOUNT
, 0, 0);
133 for (i
= 0; i
< uPanelCount
; i
++)
136 TCHAR Name
[MAX_PATH
];
139 pEntry
= (PCPLLISTENTRY
)malloc(sizeof(CPLLISTENTRY
));
143 memset(pEntry
, 0, sizeof(CPLLISTENTRY
));
145 pEntry
->pFunc
= pFunc
;
146 _tcscpy(pEntry
->pszPath
, pszPath
);
148 pEntry
->pFunc(hLisCtrl
, CPL_INQUIRE
, (LPARAM
)i
, (LPARAM
)&pEntry
->CplInfo
);
149 hIcon
= LoadImage(pEntry
->hDll
,MAKEINTRESOURCE(pEntry
->CplInfo
.idIcon
),IMAGE_ICON
,16,16,LR_DEFAULTCOLOR
);
150 index
= ImageList_AddIcon(hImgListSmall
,hIcon
);
152 hIcon
= LoadImage(pEntry
->hDll
,MAKEINTRESOURCE(pEntry
->CplInfo
.idIcon
),IMAGE_ICON
,32,32,LR_DEFAULTCOLOR
);
153 ImageList_AddIcon(hImgListLarge
,hIcon
);
156 if (LoadString(pEntry
->hDll
, pEntry
->CplInfo
.idName
, Name
, MAX_PATH
))
160 memset(&lvi
,0x00,sizeof(lvi
));
161 lvi
.mask
= LVIF_TEXT
| LVIF_PARAM
| LVIF_STATE
| LVIF_IMAGE
;
165 lvi
.lParam
= (LPARAM
)pEntry
;
166 pEntry
->nIndex
= ListView_InsertItem(hLisCtrl
,&lvi
);
168 if (LoadString(pEntry
->hDll
, pEntry
->CplInfo
.idInfo
, Name
, MAX_PATH
))
169 ListView_SetItemText(hLisCtrl
, pEntry
->nIndex
, 1, Name
);
174 if (!FindNextFile(hFind
,&fd
))
175 hFind
= INVALID_HANDLE_VALUE
;
178 (void)ListView_SetImageList(hLisCtrl
,hImgListSmall
,LVSIL_SMALL
);
179 (void)ListView_SetImageList(hLisCtrl
,hImgListLarge
,LVSIL_NORMAL
);
182 LRESULT CALLBACK
MyWindowProc(HWND hWnd
,UINT uMsg
,WPARAM wParam
,LPARAM lParam
)
191 GetClientRect(hWnd
,&rect
);
192 hListView
= CreateWindow(WC_LISTVIEW
,_T(""),LVS_REPORT
| LVS_ALIGNLEFT
| LVS_SORTASCENDING
| LVS_AUTOARRANGE
| LVS_SINGLESEL
| WS_VISIBLE
| WS_CHILD
| WS_TABSTOP
,0,0,rect
.right
,rect
.bottom
,hWnd
,NULL
,hInst
,0);
193 CTL_DEBUG((_T("Listview Window %08X\r\n"),hListView
));
195 memset(&column
,0x00,sizeof(column
));
196 column
.mask
= LVCF_FMT
| LVCF_WIDTH
| LVCF_SUBITEM
| LVCF_TEXT
;
197 column
.fmt
= LVCFMT_LEFT
;
198 column
.cx
= (rect
.right
- rect
.left
) / 3;
200 column
.pszText
= _T("Name");
201 (void)ListView_InsertColumn(hListView
,0,&column
);
202 column
.cx
= (rect
.right
- rect
.left
) - ((rect
.right
- rect
.left
) / 3) - 1;
204 column
.pszText
= _T("Comment");
205 (void)ListView_InsertColumn(hListView
,1,&column
);
206 PopulateCPLList(hListView
);
207 (void)ListView_SetColumnWidth(hListView
,2,LVSCW_AUTOSIZE_USEHEADER
);
208 (void)ListView_Update(hListView
,0);
222 GetClientRect(hWnd
,&rect
);
223 MoveWindow(hListView
,0,0,rect
.right
,rect
.bottom
,TRUE
);
230 phdr
= (NMHDR
*)lParam
;
238 PCPLLISTENTRY pEntry
;
240 nSelect
=SendMessage(hListView
,LVM_GETNEXTITEM
,(WPARAM
)-1,LVNI_FOCUSED
);
245 MessageBox(hWnd
,_T("No Items in ListView"),_T("Error"),MB_OK
|MB_ICONINFORMATION
);
249 CTL_DEBUG((_T("Select %d\r\n"),nSelect
));
250 memset(&lvi
,0x00,sizeof(lvi
));
252 lvi
.mask
= LVIF_PARAM
;
253 (void)ListView_GetItem(hListView
,&lvi
);
254 pEntry
= (PCPLLISTENTRY
)lvi
.lParam
;
255 CTL_DEBUG((_T("Listview DblClk Entry %08X\r\n"),pEntry
));
258 CTL_DEBUG((_T("Listview DblClk Entry Func %08X\r\n"),pEntry
->pFunc
));
261 if (pEntry
&& pEntry
->pFunc
)
262 pEntry
->pFunc(hListView
,CPL_DBLCLK
,pEntry
->CplInfo
.lData
,0);
269 switch (LOWORD(wParam
))
272 SetWindowLong(hListView
,GWL_STYLE
,LVS_ICON
| LVS_ALIGNLEFT
| LVS_AUTOARRANGE
| LVS_SINGLESEL
| WS_VISIBLE
| WS_CHILD
|WS_BORDER
|WS_TABSTOP
);
275 SetWindowLong(hListView
,GWL_STYLE
,LVS_SMALLICON
| LVS_ALIGNLEFT
| LVS_AUTOARRANGE
| LVS_SINGLESEL
| WS_VISIBLE
| WS_CHILD
|WS_BORDER
|WS_TABSTOP
);
278 SetWindowLong(hListView
,GWL_STYLE
,LVS_LIST
| LVS_ALIGNLEFT
| LVS_AUTOARRANGE
| LVS_SINGLESEL
| WS_VISIBLE
| WS_CHILD
|WS_BORDER
|WS_TABSTOP
);
281 SetWindowLong(hListView
,GWL_STYLE
,LVS_REPORT
| LVS_ALIGNLEFT
| LVS_AUTOARRANGE
| LVS_SINGLESEL
| WS_VISIBLE
| WS_CHILD
|WS_BORDER
|WS_TABSTOP
);
287 MessageBox(hWnd
,_T("Simple Control Panel (not Shell-namespace based)\rCopyright 2004 GkWare e.K.\rhttp://www.gkware.com\rReleased under the GPL"),_T("About the Control Panel"),MB_OK
| MB_ICONINFORMATION
);
293 return DefWindowProc(hWnd
,uMsg
,wParam
,lParam
);
301 RunControlPanelWindow(int nCmdShow
)
306 memset(&wc
,0x00,sizeof(wc
));
307 wc
.hIcon
= LoadIcon(hInst
,MAKEINTRESOURCE(IDI_MAINICON
));
308 wc
.lpszClassName
= MYWNDCLASS
;
309 wc
.lpszMenuName
= _T("MAINMENU");
310 wc
.lpfnWndProc
= MyWindowProc
;
313 InitCommonControls();
315 hMainWnd
= CreateWindowEx(WS_EX_CLIENTEDGE
,
324 LoadMenu(hInst
, MAKEINTRESOURCE(IDM_MAINMENU
)),
329 CTL_DEBUG((_T("Unable to create window\r\n")));
333 ShowWindow(hMainWnd
, nCmdShow
);
334 while (GetMessage(&msg
, 0, 0, 0))
336 TranslateMessage(&msg
);
337 DispatchMessage(&msg
);
345 RunControlPanel(LPCTSTR lpName
, UINT uIndex
)
352 hDll
= LoadLibrary(lpName
);
357 CTL_DEBUG((_T("Handle %08X\r\n"), hDll
));
359 pFunc
= (CPLAPPLETFUNC
)GetProcAddress(hDll
, "CPlApplet");
365 CTL_DEBUG((_T("CPLFunc %08X\r\n"), pFunc
));
367 if (!pFunc(NULL
, CPL_INIT
, 0, 0))
373 uPanelCount
= (UINT
)pFunc(NULL
, CPL_GETCOUNT
, 0, 0);
374 if (uIndex
>= uPanelCount
)
380 pFunc(NULL
, CPL_INQUIRE
, (LPARAM
)uIndex
, (LPARAM
)&CplInfo
);
382 pFunc(NULL
, CPL_DBLCLK
, CplInfo
.lData
, 0);
390 _tmain(int argc
, const TCHAR
*argv
[])
397 hInst
= GetModuleHandle(NULL
);
401 /* No argument on the command line */
402 return RunControlPanelWindow(si
.wShowWindow
);
405 if (_tcsicmp(argv
[1], _T("desktop")) == 0)
407 return RunControlPanel(_T("desk.cpl"), 0);
409 else if (_tcsicmp(argv
[1], _T("date/time")) == 0)
411 return RunControlPanel(_T("timedate.cpl"), 0);
413 else if (_tcsicmp(argv
[1], _T("international")) == 0)
415 return RunControlPanel(_T("intl.cpl"), 0);
417 else if (_tcsicmp(argv
[1], _T("mouse")) == 0)
419 return RunControlPanel(_T("main.cpl"), 0);
421 else if (_tcsicmp(argv
[1], _T("keyboard")) == 0)
423 return RunControlPanel(_T("main.cpl"), 1);