Trevor McCort implemented desktop wallpaper changing
Modified: trunk/reactos/include/defines.h
Modified: trunk/reactos/lib/cpl/desk/Makefile
Added: trunk/reactos/lib/cpl/desk/appearance.c
Added: trunk/reactos/lib/cpl/desk/background.c
Modified: trunk/reactos/lib/cpl/desk/desk.c
Deleted: trunk/reactos/lib/cpl/desk/desk.dsp
Deleted: trunk/reactos/lib/cpl/desk/desk.dsw
Modified: trunk/reactos/lib/cpl/desk/desk.h
Modified: trunk/reactos/lib/cpl/desk/desk.rc
Added: trunk/reactos/lib/cpl/desk/dibitmap.c
Added: trunk/reactos/lib/cpl/desk/dibitmap.h
Added: trunk/reactos/lib/cpl/desk/en.rc
Modified: trunk/reactos/lib/cpl/desk/resource.h
Added: trunk/reactos/lib/cpl/desk/screensaver.c
Added: trunk/reactos/lib/cpl/desk/settings.c

Modified: trunk/reactos/include/defines.h
--- trunk/reactos/include/defines.h	2005-02-04 16:51:11 UTC (rev 13405)
+++ trunk/reactos/include/defines.h	2005-02-04 20:39:10 UTC (rev 13406)
@@ -771,6 +771,7 @@
 #define DS_SETFONT	(0x40L)
 #define DS_SETFOREGROUND	(0x200L)
 #define DS_SYSMODAL	(0x2L)
+#define DS_SHELLFONT	(DS_SETFONT | DS_FIXEDSYS)
 
 /* CreateWindowEx */
 #define WS_EX_ACCEPTFILES	(0x10L)

Modified: trunk/reactos/lib/cpl/desk/Makefile
--- trunk/reactos/lib/cpl/desk/Makefile	2005-02-04 16:51:11 UTC (rev 13405)
+++ trunk/reactos/lib/cpl/desk/Makefile	2005-02-04 20:39:10 UTC (rev 13406)
@@ -13,20 +13,20 @@
 TARGET_BASE = $(TARGET_BASE_LIB_CPL_DESK)
 
 TARGET_CFLAGS = \
- -I./include \
+  -I./include \
  -D_WIN32_IE=0x0600 \
  -D_WIN32_WINNT=0x0501 \
  -D__USE_W32API \
  -DUNICODE \
  -D_UNICODE \
- -D__REACTOS__ \
+ -D__USE_W32API \
  -Wall \
  -Werror \
  -fno-builtin
 
 TARGET_LFLAGS = -nostartfiles
 
-TARGET_SDKLIBS = kernel32.a user32.a comctl32.a
+TARGET_SDKLIBS = kernel32.a user32.a comctl32.a comdlg32.a advapi32.a gdi32.a
 
 TARGET_GCCLIBS = gcc
 
@@ -34,7 +34,12 @@
 
 TARGET_CLEAN = 
 
-TARGET_OBJECTS = desk.o
+TARGET_OBJECTS = desk.o \
+				 background.o \
+				 screensaver.o \
+				 appearance.o \
+				 settings.o \
+				 dibitmap.o
 
 DEP_OBJECTS = $(TARGET_OBJECTS)
 

Added: trunk/reactos/lib/cpl/desk/appearance.c
--- trunk/reactos/lib/cpl/desk/appearance.c	2005-02-04 16:51:11 UTC (rev 13405)
+++ trunk/reactos/lib/cpl/desk/appearance.c	2005-02-04 20:39:10 UTC (rev 13406)
@@ -0,0 +1,34 @@
+/* $Id$
+ *
+ * COPYRIGHT:       See COPYING in the top level directory
+ * PROJECT:         ReactOS Display Control Panel
+ * FILE:            lib/cpl/desk/appearance.c
+ * PURPOSE:         Appearance property page
+ * 
+ * PROGRAMMERS:     Trevor McCort (lycan359@gmail.com)
+ */
+
+#include <windows.h>
+#include <commctrl.h>
+
+#include "resource.h"
+
+INT_PTR CALLBACK AppearancePageProc(HWND hwndDlg,
+                                    UINT uMsg,
+                                    WPARAM wParam,
+                                    LPARAM lParam)
+{
+    switch(uMsg)
+    {
+        case WM_INITDIALOG:
+            {
+            } break;
+        
+        case WM_COMMAND:
+            {
+            } break;
+    }
+    
+    return FALSE;
+}
+
Property changes on: trunk/reactos/lib/cpl/desk/appearance.c
___________________________________________________________________
Name: svn:keywords
   + author date id revision
Name: svn:eol-style
   + native

Added: trunk/reactos/lib/cpl/desk/background.c
--- trunk/reactos/lib/cpl/desk/background.c	2005-02-04 16:51:11 UTC (rev 13405)
+++ trunk/reactos/lib/cpl/desk/background.c	2005-02-04 20:39:10 UTC (rev 13406)
@@ -0,0 +1,597 @@
+/* $Id$
+ *
+ * COPYRIGHT:       See COPYING in the top level directory
+ * PROJECT:         ReactOS Display Control Panel
+ * FILE:            lib/cpl/desk/background.c
+ * PURPOSE:         Background property page
+ * 
+ * PROGRAMMERS:     Trevor McCort (lycan359@gmail.com)
+ */
+
+#include <windows.h>
+#include <commctrl.h>
+#include <commdlg.h>
+#include <cpl.h>
+#include <tchar.h>
+
+#include "resource.h"
+
+#include "desk.h"
+#include "dibitmap.h"
+
+#define MAX_WALLPAPERS 100
+
+#define PLACEMENT_CENTER    0
+#define PLACEMENT_STRETCH   1
+#define PLACEMENT_TILE      2
+
+DIBitmap *g_pWallpaperBitmap = NULL;
+
+int g_placementSelection = 0;
+int g_wallpaperSelection = -1;
+
+int g_wallpaperCount = 0;
+int g_listViewItemCount = 0;
+
+int g_currentWallpaperItemId = 0;
+
+HWND g_hBackgroundTab = NULL;
+
+HWND g_hWallpaperList = NULL;
+HWND g_hWallpaperPreview = NULL;
+HIMAGELIST g_hShellImageList = NULL;
+
+HWND g_hPlacementCombo = NULL;
+
+TCHAR g_wallpapers[MAX_WALLPAPERS][MAX_PATH];
+
+/* Add the bitmaps in the C:\ReactOS directory and the current wallpaper if any */
+void AddListViewItems()
+{
+    WIN32_FIND_DATA fd;
+    HANDLE hFind;
+    TCHAR szBuffer[256];
+    TCHAR szSearchPath[MAX_PATH];
+    LV_ITEM listItem;
+    LV_COLUMN dummy;
+    RECT clientRect;
+    HKEY regKey;
+    SHFILEINFO sfi;
+    HIMAGELIST himl;
+    TCHAR wallpaperFilename[MAX_PATH];
+    DWORD bufferSize = sizeof(wallpaperFilename);
+    DWORD varType = REG_SZ;
+    LONG result;
+    UINT i = 0;
+
+    GetClientRect(g_hWallpaperList, &clientRect);
+    
+    ZeroMemory(&dummy, sizeof(LV_COLUMN));
+    dummy.mask      = LVCF_SUBITEM | LVCF_WIDTH;
+    dummy.iSubItem  = 0;
+    dummy.cx        = (clientRect.right - clientRect.left) - GetSystemMetrics(SM_CXVSCROLL);
+    
+    ListView_InsertColumn(g_hWallpaperList, 0, &dummy);
+
+    /* Add the "None" item */
+
+    LoadString(hApplet, IDS_NONE, szBuffer, sizeof(szBuffer) / sizeof(TCHAR));
+    
+    ZeroMemory(&listItem, sizeof(LV_ITEM));
+    listItem.mask       = LVIF_TEXT | LVIF_PARAM | LVIF_STATE | LVIF_IMAGE;
+    listItem.pszText    = szBuffer;
+    listItem.iItem      = g_listViewItemCount;
+    listItem.iImage     = -1;
+    listItem.state      = LVIS_SELECTED;
+    listItem.lParam     = -1;
+    
+    ListView_InsertItem(g_hWallpaperList, &listItem);
+    ListView_SetItemState(g_hWallpaperList, g_listViewItemCount, LVIS_SELECTED, LVIS_SELECTED);
+
+    g_listViewItemCount++;
+
+    /* Add current wallpaper if any */
+    
+    RegOpenKeyEx(HKEY_CURRENT_USER, TEXT("Control Panel\\Desktop"), 0, KEY_ALL_ACCESS, &regKey);
+    
+    result = RegQueryValueEx(regKey, TEXT("Wallpaper"), 0, &varType, (LPBYTE)wallpaperFilename, &bufferSize);
+    
+    if((result == ERROR_SUCCESS) && (_tcslen(wallpaperFilename) > 0))
+    {
+        himl = (HIMAGELIST)SHGetFileInfo(wallpaperFilename,
+                                         0,
+                                         &sfi,
+                                         sizeof(sfi),
+                                         SHGFI_SYSICONINDEX | SHGFI_SMALLICON |
+                                         SHGFI_DISPLAYNAME);
+
+        if(himl != NULL)
+        {
+            if(i++ == 0)
+            {
+                g_hShellImageList = himl;
+                ListView_SetImageList(g_hWallpaperList, himl, LVSIL_SMALL);
+            }
+
+            ZeroMemory(&listItem, sizeof(LV_ITEM));
+            listItem.mask       = LVIF_TEXT | LVIF_PARAM | LVIF_STATE | LVIF_IMAGE;
+            listItem.pszText    = sfi.szDisplayName;
+            listItem.state      = LVIS_SELECTED;
+            listItem.iItem      = g_listViewItemCount;
+            listItem.iImage     = sfi.iIcon;
+            listItem.lParam     = g_wallpaperCount;
+
+            ListView_InsertItem(g_hWallpaperList, &listItem);
+            _tcscpy(g_wallpapers[g_wallpaperCount], wallpaperFilename);
+
+            ListView_SetItemState(g_hWallpaperList, g_listViewItemCount, LVIS_SELECTED, LVIS_SELECTED);
+
+            g_currentWallpaperItemId = g_listViewItemCount;
+
+            g_listViewItemCount++;
+            g_wallpaperCount++;
+        }
+    }
+    
+    RegCloseKey(regKey);
+
+    /* Add all the bitmaps in the C:\ReactOS directory. */
+
+    GetWindowsDirectory(szSearchPath, MAX_PATH);
+    _tcscat(szSearchPath, TEXT("\\*.bmp"));
+    
+    hFind = FindFirstFile(szSearchPath, &fd);
+    while(hFind != INVALID_HANDLE_VALUE)
+    {
+        /* Don't add any hidden bitmaps */
+        if((fd.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN) == 0)
+        {
+            TCHAR filename[MAX_PATH];
+            
+            GetWindowsDirectory(filename, MAX_PATH);
+
+            _tcscat(filename, TEXT("\\"));
+            _tcscat(filename, fd.cFileName);
+            
+            himl = (HIMAGELIST)SHGetFileInfo(filename,
+                                             0,
+                                             &sfi,
+                                             sizeof(sfi),
+                                             SHGFI_SYSICONINDEX | SHGFI_SMALLICON |
+                                             SHGFI_DISPLAYNAME);
+
+            if(himl == NULL)
+            {
+                break;
+            }
+            
+            if(i++ == 0)
+            {
+                g_hShellImageList = himl;
+                ListView_SetImageList(g_hWallpaperList, himl, LVSIL_SMALL);
+            }
+
+            ZeroMemory(&listItem, sizeof(LV_ITEM));
+            listItem.mask       = LVIF_TEXT | LVIF_PARAM | LVIF_STATE | LVIF_IMAGE;
+            listItem.pszText    = sfi.szDisplayName;
+            listItem.state      = 0;
+            listItem.iItem      = g_listViewItemCount++;
+            listItem.iImage     = sfi.iIcon;
+            listItem.lParam     = g_wallpaperCount;
+            
+            ListView_InsertItem(g_hWallpaperList, &listItem);
+            
+            _tcscpy(g_wallpapers[g_wallpaperCount], filename);
+            
+            g_wallpaperCount++;
+        }
+        
+        if(!FindNextFile(hFind, &fd))
+            hFind = INVALID_HANDLE_VALUE;
+    }
+}
+
+void InitBackgroundDialog()
+{
+    g_hWallpaperList    = GetDlgItem(g_hBackgroundTab, IDC_WALLPAPER_LIST);
+    g_hWallpaperPreview = GetDlgItem(g_hBackgroundTab, IDC_WALLPAPER_PREVIEW);
+    g_hPlacementCombo   = GetDlgItem(g_hBackgroundTab, IDC_PLACEMENT_COMBO);
+
+    AddListViewItems();
+    
+    TCHAR szString[256];
+    
+    LoadString(hApplet, IDS_CENTER, szString, sizeof(szString) / sizeof(TCHAR));
+    SendMessage(g_hPlacementCombo, CB_INSERTSTRING, PLACEMENT_CENTER, (LPARAM)szString);
+
+    LoadString(hApplet, IDS_STRETCH, szString, sizeof(szString) / sizeof(TCHAR));
+    SendMessage(g_hPlacementCombo, CB_INSERTSTRING, PLACEMENT_STRETCH, (LPARAM)szString);
+
+    LoadString(hApplet, IDS_TILE, szString, sizeof(szString) / sizeof(TCHAR));
+    SendMessage(g_hPlacementCombo, CB_INSERTSTRING, PLACEMENT_TILE, (LPARAM)szString);
+
+    /* Load the default settings from the registry */
+    HKEY regKey;
+    
+    TCHAR szBuffer[2];
+    DWORD bufferSize = sizeof(szBuffer);
+    DWORD varType = REG_SZ;
+    LONG result;
+    
+    RegOpenKeyEx(HKEY_CURRENT_USER, TEXT("Control Panel\\Desktop"), 0, KEY_ALL_ACCESS, &regKey);
+    
+    result = RegQueryValueEx(regKey, TEXT("WallpaperStyle"), 0, &varType, (LPBYTE)szBuffer, &bufferSize);
+
+    if(result == ERROR_SUCCESS)
+    {
+        if(_ttoi(szBuffer) == 0)
+        {
+            SendMessage(g_hPlacementCombo, CB_SETCURSEL, PLACEMENT_CENTER, 0);
+            g_placementSelection = PLACEMENT_CENTER;
+        }
+        
+        if(_ttoi(szBuffer) == 2)
+        {
+            SendMessage(g_hPlacementCombo, CB_SETCURSEL, PLACEMENT_STRETCH, 0);
+            g_placementSelection = PLACEMENT_STRETCH;
+        }
+    }
+    else
+    {
+        SendMessage(g_hPlacementCombo, CB_SETCURSEL, PLACEMENT_CENTER, 0);
+        g_placementSelection = PLACEMENT_CENTER;
+    }
+    
+    result = RegQueryValueEx(regKey, TEXT("TileWallpaper"), 0, &varType, (LPBYTE)szBuffer, &bufferSize);
+
+    if(result == ERROR_SUCCESS)
+    {
+        if(_ttoi(szBuffer) == 1)
+        {
+            SendMessage(g_hPlacementCombo, CB_SETCURSEL, PLACEMENT_TILE, 0);
+            g_placementSelection = PLACEMENT_TILE;
+        }
+    }
+
+    RegCloseKey(regKey);
+}
+
+void OnPatternButton()
+{
+    MessageBox(NULL, TEXT("That button doesn't do anything yet"), TEXT("Whoops"), MB_OK);
+}
+
+BOOL CheckListBoxFilename(HWND list, TCHAR *filename)
+{
+    return FALSE;
+}
+
+void OnBrowseButton()
+{
+    OPENFILENAME ofn;
+    TCHAR filename[MAX_PATH];
+    TCHAR fileTitle[256];
+        
+    ZeroMemory(&ofn, sizeof(OPENFILENAME));
+
+    ofn.lStructSize = sizeof(OPENFILENAME);
+    ofn.hwndOwner = g_hBackgroundTab;
+    ofn.lpstrFile = filename;
+        
+    /* Set lpstrFile[0] to '\0' so that GetOpenFileName does not 
+     * use the contents of szFile to initialize itself */
+    ofn.lpstrFile[0] = TEXT('\0');
+    ofn.nMaxFile = MAX_PATH;
+    ofn.lpstrFilter = TEXT("Bitmap Files (*.bmp)\0*.bmp\0");
+    ofn.nFilterIndex = 0;
+    ofn.lpstrFileTitle = fileTitle;
+    ofn.nMaxFileTitle = 256;
+    ofn.lpstrInitialDir = NULL;
+    ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
+
+    if(GetOpenFileName(&ofn) == TRUE)
+    {   
+        /* Check if there is already a entry that holds this filename */
+        if(CheckListBoxFilename(g_hWallpaperList, filename) == FALSE)
+        {
+            SHFILEINFO sfi;
+            LV_ITEM listItem;
+            
+            if(g_wallpaperCount > (MAX_WALLPAPERS - 1))
+                return;
+                
+            _tcscpy(g_wallpapers[g_wallpaperCount], filename);
+            
+            SHGetFileInfo(filename,
+                          0,
+                          &sfi,
+                          sizeof(sfi),
+                          SHGFI_SYSICONINDEX | SHGFI_SMALLICON | SHGFI_DISPLAYNAME);
+                
+            ZeroMemory(&listItem, sizeof(LV_ITEM));
+            listItem.mask       = LVIF_TEXT | LVIF_PARAM | LVIF_STATE | LVIF_IMAGE;
+            listItem.pszText    = sfi.szDisplayName;
+            listItem.state      = 0;
+            listItem.iItem      = g_listViewItemCount++;
+            listItem.iImage     = sfi.iIcon;
+            listItem.lParam     = g_wallpaperCount;
+                
+            ListView_InsertItem(g_hWallpaperList, &listItem);
+
+            g_wallpaperCount++;
+        }
+    }
+}
+
+void ListViewItemChanged(int itemIndex)
+{    
+    if(g_pWallpaperBitmap != NULL)
+    {
+        DibFreeImage(g_pWallpaperBitmap);
+        g_pWallpaperBitmap = NULL;
+    }
+
+    LV_ITEM listItem;
+    
+    listItem.iItem = itemIndex;
+    listItem.mask = LVIF_PARAM;
+    ListView_GetItem(g_hWallpaperList, &listItem);
+    
+    if(listItem.lParam == -1)
+    {
+        g_wallpaperSelection = -1;
+        InvalidateRect(g_hWallpaperPreview, NULL, TRUE);
+    }
+    else
+    {
+        g_wallpaperSelection = listItem.lParam;
+        
+        g_pWallpaperBitmap = DibLoadImage(g_wallpapers[g_wallpaperSelection]);
+        
+        if(g_pWallpaperBitmap == NULL)
+        {
+        }
+        
+        InvalidateRect(g_hWallpaperPreview, NULL, TRUE);
+    }
+    
+    EnableWindow(g_hPlacementCombo, (listItem.lParam != -1 ? TRUE : FALSE));
+    
+    PropSheet_Changed(GetParent(g_hBackgroundTab), g_hBackgroundTab);
+}
+
+void DrawWallpaperPreview(LPDRAWITEMSTRUCT draw)
+{
+    if(g_wallpaperSelection == -1)
+    {
+        FillRect(draw->hDC, &draw->rcItem, GetSysColorBrush(COLOR_BACKGROUND));
+        return;
+    }
+    
+    if(g_pWallpaperBitmap == NULL)
+        return;
+
+    float scaleX = ((float)GetSystemMetrics(SM_CXSCREEN) - 1) / (float)draw->rcItem.right;
+    float scaleY = ((float)GetSystemMetrics(SM_CYSCREEN) - 1) / (float)draw->rcItem.bottom;
+
+    int scaledWidth = g_pWallpaperBitmap->width / scaleX;
+    int scaledHeight = g_pWallpaperBitmap->height / scaleY;
+    
+    int posX = (draw->rcItem.right / 2) - (scaledWidth / 2);
+    int posY = (draw->rcItem.bottom / 2) - (scaledHeight / 2);
+    
+    FillRect(draw->hDC, &draw->rcItem, GetSysColorBrush(COLOR_BACKGROUND));
+    
+    SetStretchBltMode(draw->hDC, COLORONCOLOR);
+    
+    if(g_placementSelection == PLACEMENT_CENTER)
+    {
+        StretchDIBits(draw->hDC,
+                      posX,
+                      posY,
+                      scaledWidth,
+                      scaledHeight,
+                      0,
+                      0,
+                      g_pWallpaperBitmap->width,
+                      g_pWallpaperBitmap->height,
+                      g_pWallpaperBitmap->bits,
+                      g_pWallpaperBitmap->info,
+                      DIB_RGB_COLORS,
+                      SRCCOPY);
+    }
+    
+    if(g_placementSelection == PLACEMENT_STRETCH)
+    {
+        StretchDIBits(draw->hDC,
+                      0,
+                      0,
+                      draw->rcItem.right,
+                      draw->rcItem.bottom,
+                      0,
+                      0,
+                      g_pWallpaperBitmap->width,
+                      g_pWallpaperBitmap->height,
+                      g_pWallpaperBitmap->bits,
+                      g_pWallpaperBitmap->info,
+                      DIB_RGB_COLORS,
+                      SRCCOPY);
+    }
+
+    if(g_placementSelection == PLACEMENT_TILE)
+    {
+        int x;
+        int y;
+        
+        for(y = 0; y < draw->rcItem.bottom; y += scaledHeight)
+        {
+            for(x = 0; x < draw->rcItem.right; x += scaledWidth)
+            {
+                StretchDIBits(draw->hDC,
+                              x,
+                              y,
+                              scaledWidth,
+                              scaledHeight,
+                              0,
+                              0,
+                              g_pWallpaperBitmap->width,
+                              g_pWallpaperBitmap->height,
+                              g_pWallpaperBitmap->bits,
+                              g_pWallpaperBitmap->info,
+                              DIB_RGB_COLORS,
+                              SRCCOPY);
+            }
+        }
+    }
+}
+
+void SetWallpaper()
+{
+    HKEY regKey;
+    
+    RegOpenKeyEx(HKEY_CURRENT_USER, TEXT("Control Panel\\Desktop"), 0, KEY_ALL_ACCESS, &regKey);
+
+    if(g_placementSelection == PLACEMENT_TILE)
+    {
+        RegSetValueEx(regKey, TEXT("TileWallpaper"), 0, REG_SZ, (BYTE *)TEXT("1"), sizeof(TCHAR) * 2);
+        RegSetValueEx(regKey, TEXT("WallpaperStyle"), 0, REG_SZ, (BYTE *)TEXT("0"), sizeof(TCHAR) * 2);
+    }
+    
+    if(g_placementSelection == PLACEMENT_CENTER)
+    {
+        RegSetValueEx(regKey, TEXT("TileWallpaper"), 0, REG_SZ, (BYTE *)TEXT("0"), sizeof(TCHAR) * 2);
+        RegSetValueEx(regKey, TEXT("WallpaperStyle"), 0, REG_SZ, (BYTE *)TEXT("0"), sizeof(TCHAR) * 2);
+    }
+
+    if(g_placementSelection == PLACEMENT_STRETCH)
+    {
+        RegSetValueEx(regKey, TEXT("TileWallpaper"), 0, REG_SZ, (BYTE *)TEXT("0"), sizeof(TCHAR) * 2);
+        RegSetValueEx(regKey, TEXT("WallpaperStyle"), 0, REG_SZ, (BYTE *)TEXT("2"), sizeof(TCHAR) * 2);
+    }
+    
+    RegCloseKey(regKey);
+    
+    if(g_wallpaperSelection == -1)
+    {                
+        SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, TEXT(""), SPIF_UPDATEINIFILE);
+    }
+    else
+    {   
+        SystemParametersInfo(SPI_SETDESKWALLPAPER,
+                             0,
+                             g_wallpapers[g_wallpaperSelection],
+                             SPIF_UPDATEINIFILE);
+    }
+}
+
+INT_PTR CALLBACK BackgroundPageProc(HWND hwndDlg,
+                                    UINT uMsg,
+                                    WPARAM wParam,
+                                    LPARAM lParam)
+{
+    g_hBackgroundTab = hwndDlg;
+
+    switch(uMsg)
+    {
+        case WM_INITDIALOG:
+            {
+                InitBackgroundDialog();
+            } break;
+        
+        case WM_COMMAND:
+            {              
+                DWORD controlId = LOWORD(wParam);
+                DWORD command   = HIWORD(wParam);
+                
+                switch(controlId)
+                {
+                    case IDC_PATTERN:
+                        {
+                            if(command == BN_CLICKED)
+                                OnPatternButton();
+                        } break;
+                    
+                    case IDC_BROWSE:
+                        {
+                            if(command == BN_CLICKED)
+                                OnBrowseButton();
+                        } break;
+                    
+                    case IDC_PLACEMENT_COMBO:
+                        {
+                            if(command == CBN_SELCHANGE)
+                            {
+                                g_placementSelection = SendMessage(g_hPlacementCombo, CB_GETCURSEL, 0, 0);
+                                
+                                InvalidateRect(g_hWallpaperPreview, NULL, TRUE);
+                                
+                                PropSheet_Changed(GetParent(g_hBackgroundTab), g_hBackgroundTab);
+                            }
+                            
+                        } break;
+                }
+            } break;
+
+        case WM_DRAWITEM:
+            {
+                LPDRAWITEMSTRUCT drawItem;
+                drawItem = (LPDRAWITEMSTRUCT)lParam;
+
+                if(drawItem->CtlID == IDC_WALLPAPER_PREVIEW)
+                {
+                    DrawWallpaperPreview(drawItem);
+                }
+
+            } break;
+        
+        case WM_NOTIFY:
+            {
+                LPNMHDR lpnm = (LPNMHDR)lParam;
+                
+                switch(lpnm->code)
+                {   
+                    case PSN_APPLY:
+                        {
+                            SetWallpaper();
+                            
+                            /* Update the current wallapaper list item to the 
+                             * currently selected wallpaper */
+                            LV_ITEM listItem;
+                            listItem.mask = LVIF_PARAM;
+                            listItem.iSubItem = 0;
+                            listItem.iItem = g_currentWallpaperItemId;
+                            listItem.lParam = g_wallpaperSelection;
+                            
+                            ListView_SetItem(g_hWallpaperList, &listItem);
+
+                            return TRUE;
+                        } break;
+
+                    case LVN_ITEMCHANGED:
+                        {
+                            LPNMLISTVIEW nm = (LPNMLISTVIEW)lParam;
+                            
+                            if((nm->uNewState & LVIS_SELECTED) == 0)
+                                return FALSE;
+                            
+                            ListViewItemChanged(nm->iItem);
+
+                        } break;
+                    
+                    default:
+                        break;
+                }
+                
+            } break;
+
+        case WM_DESTROY:
+            {
+                if(g_pWallpaperBitmap != NULL)
+                    DibFreeImage(g_pWallpaperBitmap);
+
+            } break;
+    }
+    
+    return FALSE;
+}
+
Property changes on: trunk/reactos/lib/cpl/desk/background.c
___________________________________________________________________
Name: svn:keywords
   + author date id revision
Name: svn:eol-style
   + native

Modified: trunk/reactos/lib/cpl/desk/desk.c
--- trunk/reactos/lib/cpl/desk/desk.c	2005-02-04 16:51:11 UTC (rev 13405)
+++ trunk/reactos/lib/cpl/desk/desk.c	2005-02-04 20:39:10 UTC (rev 13406)
@@ -1,214 +1,128 @@
-/*
- *  ReactOS
- *  Copyright (C) 2004 ReactOS Team
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 2 of the License, or
- *  (at your option) any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
 /* $Id$
  *
+ * COPYRIGHT:       See COPYING in the top level directory
  * PROJECT:         ReactOS Display Control Panel
  * FILE:            lib/cpl/desk/desk.c
  * PURPOSE:         ReactOS Display Control Panel
- * PROGRAMMER:      Gero Kuehn (reactos.filter@gkware.com)
- * UPDATE HISTORY:
- *      06-17-2004  Created
- *      08-07-2004  Initial Checkin
+ * 
+ * PROGRAMMERS:     Trevor McCort (lycan359@gmail.com)
  */
 
-#include <stdlib.h>
-#include <stdio.h>
-#include <stdarg.h>
-#include <tchar.h>
 #include <windows.h>
-
 #include <commctrl.h>
 #include <cpl.h>
 
-#include <process.h>
-
 #include "resource.h"
 #include "desk.h"
 
 #define NUM_APPLETS	(1)
 
-LONG CALLBACK DisplayApplet(VOID);
-INT_PTR CALLBACK BackgroundPageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
-INT_PTR CALLBACK ScreenSaverPageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
-INT_PTR CALLBACK AppearancePageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
-INT_PTR CALLBACK SettingsPageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
+LONG APIENTRY DisplayApplet(HWND hwnd, UINT uMsg, LONG wParam, LONG lParam);
 
+extern INT_PTR CALLBACK BackgroundPageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
+extern INT_PTR CALLBACK ScreenSaverPageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
+extern INT_PTR CALLBACK AppearancePageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
+extern INT_PTR CALLBACK SettingsPageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
 
 HINSTANCE hApplet = 0;
 
 /* Applets */
 APPLET Applets[NUM_APPLETS] = 
 {
-	{IDI_CPLSYSTEM, IDS_CPLSYSTEMNAME, IDS_CPLSYSTEMDESCRIPTION, DisplayApplet}
+    {
+        IDC_DESK_ICON,
+        IDS_CPLNAME,
+        IDS_CPLDESCRIPTION,
+        DisplayApplet
+    }
 };
 
-
-
-/* Property page dialog callback */
-INT_PTR CALLBACK
-BackgroundPageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
+static VOID InitPropSheetPage(PROPSHEETPAGE *psp, WORD idDlg, DLGPROC DlgProc)
 {
-	switch(uMsg)
-	{
-	case WM_INITDIALOG:
-		break;
-	case WM_COMMAND:
-		break;
-	}
-	return FALSE;
+    ZeroMemory(psp, sizeof(PROPSHEETPAGE));
+    psp->dwSize = sizeof(PROPSHEETPAGE);
+    psp->dwFlags = PSP_DEFAULT;
+    psp->hInstance = hApplet;
+    psp->pszTemplate = MAKEINTRESOURCE(idDlg);
+    psp->pfnDlgProc = DlgProc;
 }
 
-
-/* Property page dialog callback */
-INT_PTR CALLBACK
-ScreenSaverPageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
+/* Display Applet */
+LONG APIENTRY DisplayApplet(HWND hwnd, UINT uMsg, LONG wParam, LONG lParam)
 {
-	switch(uMsg)
-	{
-	case WM_INITDIALOG:
-		break;
-	case WM_COMMAND:
-		break;
-	}
-	return FALSE;
+    PROPSHEETPAGE psp[4];
+    PROPSHEETHEADER psh;
+    TCHAR Caption[1024];
+    
+    LoadString(hApplet, IDS_CPLNAME, Caption, sizeof(Caption) / sizeof(TCHAR));
+    
+    ZeroMemory(&psh, sizeof(PROPSHEETHEADER));
+    psh.dwSize = sizeof(PROPSHEETHEADER);
+    psh.dwFlags =  PSH_PROPSHEETPAGE | PSH_USECALLBACK | PSH_PROPTITLE;
+    psh.hwndParent = NULL;
+    psh.hInstance = hApplet;
+    psh.hIcon = LoadIcon(hApplet, MAKEINTRESOURCE(IDC_DESK_ICON));
+    psh.pszCaption = Caption;
+    psh.nPages = sizeof(psp) / sizeof(PROPSHEETPAGE);
+    psh.nStartPage = 0;
+    psh.ppsp = psp;
+    
+    InitPropSheetPage(&psp[0], IDD_BACKGROUND, BackgroundPageProc);
+    InitPropSheetPage(&psp[1], IDD_SCREENSAVER, ScreenSaverPageProc);
+    InitPropSheetPage(&psp[2], IDD_APPEARANCE, AppearancePageProc);
+    InitPropSheetPage(&psp[3], IDD_SETTINGS, SettingsPageProc);
+    
+    return (LONG)(PropertySheet(&psh) != -1);
 }
 
 
-/* Property page dialog callback */
-INT_PTR CALLBACK
-AppearancePageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
-{
-	switch(uMsg)
-	{
-	case WM_INITDIALOG:
-		break;
-	case WM_COMMAND:
-		break;
-	}
-	return FALSE;
-}
-
-
-/* Property page dialog callback */
-INT_PTR CALLBACK
-SettingsPageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
-{
-	switch(uMsg)
-	{
-	case WM_INITDIALOG:
-		break;
-	case WM_COMMAND:
-		break;
-	}
-	return FALSE;
-}
-
-
-static VOID
-InitPropSheetPage(PROPSHEETPAGE *psp, WORD idDlg, DLGPROC DlgProc)
-{
-	ZeroMemory(psp, sizeof(PROPSHEETPAGE));
-	psp->dwSize = sizeof(PROPSHEETPAGE);
-	psp->dwFlags = PSP_DEFAULT;
-	psp->hInstance = hApplet;
-	psp->pszTemplate = MAKEINTRESOURCE(idDlg);
-	psp->pfnDlgProc = DlgProc;
-}
-
-
-/* First Applet */
-
-LONG CALLBACK
-DisplayApplet(VOID)
-{
-	PROPSHEETPAGE psp[4];
-	PROPSHEETHEADER psh;
-	TCHAR Caption[1024];
-
-	LoadString(hApplet, IDS_CPLSYSTEMNAME, Caption, sizeof(Caption) / sizeof(TCHAR));
-
-	ZeroMemory(&psh, sizeof(PROPSHEETHEADER));
-	psh.dwSize = sizeof(PROPSHEETHEADER);
-	psh.dwFlags =  PSH_PROPSHEETPAGE | PSH_PROPTITLE;
-	psh.hwndParent = NULL;
-	psh.hInstance = hApplet;
-	psh.hIcon = LoadIcon(hApplet, MAKEINTRESOURCE(IDI_CPLSYSTEM));
-	psh.pszCaption = Caption;
-	psh.nPages = sizeof(psp) / sizeof(PROPSHEETPAGE);
-	psh.nStartPage = 0;
-	psh.ppsp = psp;
-	psh.pfnCallback = NULL;
-
-	InitPropSheetPage(&psp[0], IDD_PROPPAGEBACKGROUND, BackgroundPageProc);
-	InitPropSheetPage(&psp[1], IDD_PROPPAGESCREENSAVER, ScreenSaverPageProc);
-	InitPropSheetPage(&psp[2], IDD_PROPPAGEAPPEARANCE, AppearancePageProc);
-	InitPropSheetPage(&psp[3], IDD_PROPPAGESETTINGS, SettingsPageProc);
-
-	return (LONG)(PropertySheet(&psh) != -1);
-}
-
-
 /* Control Panel Callback */
-LONG CALLBACK
-CPlApplet(HWND hwndCPl, UINT uMsg, LPARAM lParam1, LPARAM lParam2)
+LONG CALLBACK CPlApplet(HWND hwndCPl, UINT uMsg, LPARAM lParam1, LPARAM lParam2)
 {
-	int i = (int)lParam1;
-
-	switch(uMsg)
-	{
-	case CPL_INIT:
-		{
-			return TRUE;
-		}
-	case CPL_GETCOUNT:
-		{
-			return NUM_APPLETS;
-		}
-	case CPL_INQUIRE:
-		{
-			CPLINFO *CPlInfo = (CPLINFO*)lParam2;
-			CPlInfo->lData = 0;
-			CPlInfo->idIcon = Applets[i].idIcon;
-			CPlInfo->idName = Applets[i].idName;
-			CPlInfo->idInfo = Applets[i].idDescription;
-			break;
-		}
-	case CPL_DBLCLK:
-		{
-			Applets[i].AppletProc();
-			break;
-		}
-	}
-	return FALSE;
+    int i = (int)lParam1;
+    
+    switch(uMsg)
+    {
+        case CPL_INIT:
+            {
+                return TRUE;
+            }
+        
+        case CPL_GETCOUNT:
+            {
+                return NUM_APPLETS;
+            }
+        
+        case CPL_INQUIRE:
+            {
+                CPLINFO *CPlInfo = (CPLINFO*)lParam2;
+                CPlInfo->lData = 0;
+                CPlInfo->idIcon = Applets[i].idIcon;
+                CPlInfo->idName = Applets[i].idName;
+                CPlInfo->idInfo = Applets[i].idDescription;
+            } break;
+        
+        case CPL_DBLCLK:
+            {
+                Applets[i].AppletProc(hwndCPl, uMsg, lParam1, lParam2);
+            } break;
+    }
+    
+    return FALSE;
 }
 
 
-BOOL WINAPI
-DllMain(HINSTANCE hinstDLL, DWORD dwReason, LPVOID lpvReserved)
+BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD dwReason, LPVOID lpvReserved)
 {
-	switch(dwReason)
-	{
-	case DLL_PROCESS_ATTACH:
-	case DLL_THREAD_ATTACH:
-		hApplet = hinstDLL;
-		break;
[truncated at 1000 lines; 704 more skipped]