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
)
193 GetClientRect(hWnd
,&rect
);
194 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);
195 CTL_DEBUG((_T("Listview Window %08X\r\n"),hListView
));
197 memset(&column
,0x00,sizeof(column
));
198 column
.mask
= LVCF_FMT
| LVCF_WIDTH
| LVCF_SUBITEM
| LVCF_TEXT
;
199 column
.fmt
= LVCFMT_LEFT
;
200 column
.cx
= (rect
.right
- rect
.left
) / 3;
202 LoadString(hInst
, IDS_NAME
, szBuf
, sizeof(szBuf
) / sizeof(TCHAR
));
203 column
.pszText
= szBuf
;
204 (void)ListView_InsertColumn(hListView
,0,&column
);
205 column
.cx
= (rect
.right
- rect
.left
) - ((rect
.right
- rect
.left
) / 3) - 1;
207 LoadString(hInst
, IDS_COMMENT
, szBuf
, sizeof(szBuf
) / sizeof(TCHAR
));
208 column
.pszText
= szBuf
;
209 (void)ListView_InsertColumn(hListView
,1,&column
);
210 PopulateCPLList(hListView
);
211 (void)ListView_SetColumnWidth(hListView
,2,LVSCW_AUTOSIZE_USEHEADER
);
212 (void)ListView_Update(hListView
,0);
226 GetClientRect(hWnd
,&rect
);
227 MoveWindow(hListView
,0,0,rect
.right
,rect
.bottom
,TRUE
);
234 phdr
= (NMHDR
*)lParam
;
242 PCPLLISTENTRY pEntry
;
244 nSelect
=SendMessage(hListView
,LVM_GETNEXTITEM
,(WPARAM
)-1,LVNI_FOCUSED
);
249 LoadString(hInst
, IDS_NO_ITEMS
, szBuf
, sizeof(szBuf
) / sizeof(TCHAR
));
250 MessageBox(hWnd
,(LPCTSTR
)szBuf
,NULL
,MB_OK
|MB_ICONINFORMATION
);
254 CTL_DEBUG((_T("Select %d\r\n"),nSelect
));
255 memset(&lvi
,0x00,sizeof(lvi
));
257 lvi
.mask
= LVIF_PARAM
;
258 (void)ListView_GetItem(hListView
,&lvi
);
259 pEntry
= (PCPLLISTENTRY
)lvi
.lParam
;
260 CTL_DEBUG((_T("Listview DblClk Entry %08X\r\n"),pEntry
));
263 CTL_DEBUG((_T("Listview DblClk Entry Func %08X\r\n"),pEntry
->pFunc
));
266 if (pEntry
&& pEntry
->pFunc
)
267 pEntry
->pFunc(hListView
,CPL_DBLCLK
,pEntry
->CplInfo
.lData
,0);
274 switch (LOWORD(wParam
))
277 SetWindowLong(hListView
,GWL_STYLE
,LVS_ICON
| LVS_ALIGNLEFT
| LVS_AUTOARRANGE
| LVS_SINGLESEL
| WS_VISIBLE
| WS_CHILD
|WS_BORDER
|WS_TABSTOP
);
280 SetWindowLong(hListView
,GWL_STYLE
,LVS_SMALLICON
| LVS_ALIGNLEFT
| LVS_AUTOARRANGE
| LVS_SINGLESEL
| WS_VISIBLE
| WS_CHILD
|WS_BORDER
|WS_TABSTOP
);
283 SetWindowLong(hListView
,GWL_STYLE
,LVS_LIST
| LVS_ALIGNLEFT
| LVS_AUTOARRANGE
| LVS_SINGLESEL
| WS_VISIBLE
| WS_CHILD
|WS_BORDER
|WS_TABSTOP
);
286 SetWindowLong(hListView
,GWL_STYLE
,LVS_REPORT
| LVS_ALIGNLEFT
| LVS_AUTOARRANGE
| LVS_SINGLESEL
| WS_VISIBLE
| WS_CHILD
|WS_BORDER
|WS_TABSTOP
);
295 LoadString(hInst
, IDS_ABOUT
, szBuf
, sizeof(szBuf
) / sizeof(TCHAR
));
296 LoadString(hInst
, IDS_ABOUT_TITLE
, Title
, sizeof(Title
) / sizeof(TCHAR
));
298 MessageBox(hWnd
,(LPCTSTR
)szBuf
,(LPCTSTR
)Title
,MB_OK
| MB_ICONINFORMATION
);
305 return DefWindowProc(hWnd
,uMsg
,wParam
,lParam
);
313 RunControlPanelWindow(int nCmdShow
)
319 memset(&wc
,0x00,sizeof(wc
));
320 wc
.hIcon
= LoadIcon(hInst
,MAKEINTRESOURCE(IDI_MAINICON
));
321 wc
.lpszClassName
= MYWNDCLASS
;
322 wc
.lpszMenuName
= _T("MAINMENU");
323 wc
.lpfnWndProc
= MyWindowProc
;
326 InitCommonControls();
328 LoadString(hInst
, IDS_WINDOW_TITLE
, szBuf
, sizeof(szBuf
) / sizeof(TCHAR
));
329 hMainWnd
= CreateWindowEx(WS_EX_CLIENTEDGE
,
338 LoadMenu(hInst
, MAKEINTRESOURCE(IDM_MAINMENU
)),
343 CTL_DEBUG((_T("Unable to create window\r\n")));
347 ShowWindow(hMainWnd
, nCmdShow
);
348 while (GetMessage(&msg
, 0, 0, 0))
350 TranslateMessage(&msg
);
351 DispatchMessage(&msg
);
359 RunControlPanel(LPCTSTR lpName
, UINT uIndex
)
366 hDll
= LoadLibrary(lpName
);
371 CTL_DEBUG((_T("Handle %08X\r\n"), hDll
));
373 pFunc
= (CPLAPPLETFUNC
)GetProcAddress(hDll
, "CPlApplet");
379 CTL_DEBUG((_T("CPLFunc %08X\r\n"), pFunc
));
381 if (!pFunc(NULL
, CPL_INIT
, 0, 0))
387 uPanelCount
= (UINT
)pFunc(NULL
, CPL_GETCOUNT
, 0, 0);
388 if (uIndex
>= uPanelCount
)
394 pFunc(NULL
, CPL_INQUIRE
, (LPARAM
)uIndex
, (LPARAM
)&CplInfo
);
396 pFunc(NULL
, CPL_DBLCLK
, CplInfo
.lData
, 0);
404 _tmain(int argc
, const TCHAR
*argv
[])
411 hInst
= GetModuleHandle(NULL
);
415 /* No argument on the command line */
416 return RunControlPanelWindow(si
.wShowWindow
);
419 if (_tcsicmp(argv
[1], _T("desktop")) == 0)
421 return RunControlPanel(_T("desk.cpl"), 0);
423 else if (_tcsicmp(argv
[1], _T("date/time")) == 0)
425 return RunControlPanel(_T("timedate.cpl"), 0);
427 else if (_tcsicmp(argv
[1], _T("international")) == 0)
429 return RunControlPanel(_T("intl.cpl"), 0);
431 else if (_tcsicmp(argv
[1], _T("mouse")) == 0)
433 return RunControlPanel(_T("main.cpl"), 0);
435 else if (_tcsicmp(argv
[1], _T("keyboard")) == 0)
437 return RunControlPanel(_T("main.cpl"), 1);