+}
+
+static LRESULT WINAPI Control_WndProc(HWND hWnd, UINT wMsg,
+ WPARAM lParam1, LPARAM lParam2)
+{
+ CPanel* panel = (CPanel*)GetWindowLongPtrW(hWnd, 0);
+
+ if (panel || wMsg == WM_CREATE) {
+ switch (wMsg) {
+ case WM_CREATE:
+ Control_WndProc_Create(hWnd, (CREATESTRUCTW*)lParam2);
+ return 0;
+ case WM_DESTROY:
+ {
+ CPlApplet *applet, *next;
+ LIST_FOR_EACH_ENTRY_SAFE( applet, next, &panel->applets, CPlApplet, entry )
+ Control_UnloadApplet(applet);
+ }
+ Control_FreeCPlItems(hWnd, panel);
+ PostQuitMessage(0);
+ break;
+ case WM_COMMAND:
+ switch (LOWORD(lParam1))
+ {
+ case IDM_CPANEL_EXIT:
+ SendMessageW(hWnd, WM_CLOSE, 0, 0);
+ return 0;
+
+ case IDM_CPANEL_ABOUT:
+ {
+ WCHAR appName[MAX_STRING_LEN];
+ HICON icon = LoadImageW(shell32_hInstance, MAKEINTRESOURCEW(IDI_SHELL_CONTROL_PANEL),
+ IMAGE_ICON, 48, 48, LR_SHARED);
+
+ LoadStringW(shell32_hInstance, IDS_CPANEL_TITLE, appName,
+ sizeof(appName) / sizeof(appName[0]));
+ ShellAboutW(hWnd, appName, NULL, icon);
+
+ return 0;
+ }
+
+ case FCIDM_SHVIEW_BIGICON:
+ Control_UpdateListViewStyle(panel, LVS_ICON, FCIDM_SHVIEW_BIGICON);
+ return 0;
+
+ case FCIDM_SHVIEW_SMALLICON:
+ Control_UpdateListViewStyle(panel, LVS_SMALLICON, FCIDM_SHVIEW_SMALLICON);
+ return 0;
+
+ case FCIDM_SHVIEW_LISTVIEW:
+ Control_UpdateListViewStyle(panel, LVS_LIST, FCIDM_SHVIEW_LISTVIEW);
+ return 0;
+
+ case FCIDM_SHVIEW_REPORTVIEW:
+ Control_UpdateListViewStyle(panel, LVS_REPORT, FCIDM_SHVIEW_REPORTVIEW);
+ return 0;
+
+ default:
+ /* check if this is an applet */
+ if ((LOWORD(lParam1) >= IDM_CPANEL_APPLET_BASE) &&
+ (LOWORD(lParam1) <= IDM_CPANEL_APPLET_BASE + panel->total_subprogs))
+ {
+ Control_StartApplet(hWnd, Control_GetCPlItem_From_MenuID(hWnd, LOWORD(lParam1)));
+ return 0;
+ }
+
+ break;
+ }
+
+ break;
+
+ case WM_NOTIFY:
+ {
+ LPNMHDR nmh = (LPNMHDR) lParam2;
+
+ switch (nmh->idFrom)
+ {
+ case IDC_LISTVIEW:
+ switch (nmh->code)
+ {
+ case NM_RETURN:
+ case NM_DBLCLK:
+ {
+ Control_StartApplet(hWnd, Control_GetCPlItem_From_ListView(panel));
+ return 0;
+ }
+ case LVN_ITEMCHANGED:
+ {
+ CPlItem *item = Control_GetCPlItem_From_ListView(panel);
+
+ /* update the status bar if item is valid */
+ if (item)
+ SetWindowTextW(panel->hWndStatusBar, item->applet->info[item->id].info);
+ else
+ SetWindowTextW(panel->hWndStatusBar, NULL);
+
+ return 0;
+ }
+ }
+
+ break;
+ }
+
+ break;
+ }
+
+ case WM_MENUSELECT:
+ /* check if this is an applet */
+ if ((LOWORD(lParam1) >= IDM_CPANEL_APPLET_BASE) &&
+ (LOWORD(lParam1) <= IDM_CPANEL_APPLET_BASE + panel->total_subprogs))
+ {
+ CPlItem *item = Control_GetCPlItem_From_MenuID(hWnd, LOWORD(lParam1));
+
+ /* update the status bar if item is valid */
+ if (item)
+ SetWindowTextW(panel->hWndStatusBar, item->applet->info[item->id].info);
+ }
+ else if ((HIWORD(lParam1) == 0xFFFF) && (lParam2 == 0))
+ {
+ /* reset status bar description to that of the selected icon */
+ CPlItem *item = Control_GetCPlItem_From_ListView(panel);
+
+ if (item)
+ SetWindowTextW(panel->hWndStatusBar, item->applet->info[item->id].info);
+ else
+ SetWindowTextW(panel->hWndStatusBar, NULL);
+
+ return 0;
+ }
+ else
+ SetWindowTextW(panel->hWndStatusBar, NULL);
+
+ return 0;
+
+ case WM_SIZE:
+ {
+ HDWP hdwp;
+ RECT sb;
+
+ hdwp = BeginDeferWindowPos(2);
+
+ if (hdwp == NULL)
+ break;
+
+ GetClientRect(panel->hWndStatusBar, &sb);
+
+ hdwp = DeferWindowPos(hdwp, panel->hWndListView, NULL, 0, 0,
+ LOWORD(lParam2), HIWORD(lParam2) - (sb.bottom - sb.top),
+ SWP_NOZORDER | SWP_NOMOVE);
+
+ if (hdwp == NULL)
+ break;
+
+ hdwp = DeferWindowPos(hdwp, panel->hWndStatusBar, NULL, 0, 0,
+ LOWORD(lParam2), LOWORD(lParam1), SWP_NOZORDER | SWP_NOMOVE);
+
+ if (hdwp != NULL)
+ EndDeferWindowPos(hdwp);
+
+ return 0;
+ }
+ }
+ }