https://git.reactos.org/?p=reactos.git;a=commitdiff;h=171941ad185893f848bf915e869d5d3622695489

commit 171941ad185893f848bf915e869d5d3622695489
Author:     Hermès Bélusca-Maïto <hermes.belusca-ma...@reactos.org>
AuthorDate: Mon Oct 16 20:52:31 2023 +0200
Commit:     Hermès Bélusca-Maïto <hermes.belusca-ma...@reactos.org>
CommitDate: Wed Oct 18 21:46:15 2023 +0200

    [DESK] Add the current screensaver in the list if it isn't already present 
(#5766)
    
    - Introduce AddScreenSaver[Item] helpers for adding screensavers in
      the list (either given by file path or by item structure).
    
    - Rename "AddScreenSavers" to "EnumScreenSavers", and
      "ScreenSaverItem" type to "SCREEN_SAVER_ITEM".
    
    - Ensure the stored "SCRNSAVE.EXE" value is NULL-terminated.
    
    - Add the current screensaver, specified by the "SCRNSAVE.EXE" registry
      value, in the list if it isn't already present; otherwise select it
      in the list.
    
    - Make the filename comparison case-insensitive.
---
 dll/cpl/desk/screensaver.c | 339 ++++++++++++++++++++++-----------------------
 1 file changed, 166 insertions(+), 173 deletions(-)

diff --git a/dll/cpl/desk/screensaver.c b/dll/cpl/desk/screensaver.c
index 549422e5492..b99b35b5827 100644
--- a/dll/cpl/desk/screensaver.c
+++ b/dll/cpl/desk/screensaver.c
@@ -16,15 +16,15 @@ static const TCHAR szPreviewWndClass[] = 
TEXT("SSDemoParent");
 
 typedef struct
 {
-    BOOL  bIsScreenSaver; /* Is this background a wallpaper */
+    BOOL  bIsScreenSaver; /* Is this a valid screensaver */
     TCHAR szFilename[MAX_PATH];
     TCHAR szDisplayName[256];
-} ScreenSaverItem;
+} SCREEN_SAVER_ITEM;
 
 
 typedef struct _DATA
 {
-    ScreenSaverItem     ScreenSaverItems[MAX_SCREENSAVERS];
+    SCREEN_SAVER_ITEM   ScreenSaverItems[MAX_SCREENSAVERS];
     PROCESS_INFORMATION PrevWindowPi;
     int                 Selection;
     WNDPROC             OldPreviewProc;
@@ -411,136 +411,149 @@ CheckRegScreenSaverIsSecure(HWND hwndDlg)
 }
 
 
-static VOID
-SearchScreenSavers(HWND hwndScreenSavers,
-                   LPCTSTR pszSearchPath,
-                   PDATA pData)
+static BOOL
+AddScreenSaverItem(
+    _In_ HWND hwndScreenSavers,
+    _In_ PDATA pData,
+    _In_ SCREEN_SAVER_ITEM* ScreenSaverItem)
 {
-    WIN32_FIND_DATA  fd;
-    TCHAR            szSearchPath[MAX_PATH];
-    HANDLE           hFind;
-    ScreenSaverItem *ScreenSaverItem;
-    HANDLE           hModule;
-    UINT             i, ScreenSaverCount;
-    HRESULT hr;
+    UINT i;
 
-    ScreenSaverCount = pData->ScreenSaverCount;
+    if (pData->ScreenSaverCount >= MAX_SCREENSAVERS)
+        return FALSE;
 
-    hr = StringCbCopy(szSearchPath, sizeof(szSearchPath), pszSearchPath);
-    if (FAILED(hr))
-        return;
-    hr = StringCbCat(szSearchPath, sizeof(szSearchPath), TEXT("\\*.scr"));
-    if (FAILED(hr))
-        return;
+    i = SendMessage(hwndScreenSavers,
+                    CB_ADDSTRING,
+                    0,
+                    (LPARAM)ScreenSaverItem->szDisplayName);
+    if ((i == CB_ERR) || (i == CB_ERRSPACE))
+        return FALSE;
 
-    hFind = FindFirstFile(szSearchPath, &fd);
+    SendMessage(hwndScreenSavers,
+                CB_SETITEMDATA,
+                i,
+                (LPARAM)pData->ScreenSaverCount);
 
-    if (hFind == INVALID_HANDLE_VALUE)
-        return;
+    pData->ScreenSaverCount++;
+    return TRUE;
+}
+
+static BOOL
+AddScreenSaver(
+    _In_ HWND hwndScreenSavers,
+    _In_ PDATA pData,
+    _In_ LPCTSTR pszFilePath,
+    _In_ LPCTSTR pszFileName)
+{
+    SCREEN_SAVER_ITEM* ScreenSaverItem;
+    HANDLE hModule;
+    HRESULT hr;
+
+    if (pData->ScreenSaverCount >= MAX_SCREENSAVERS)
+        return FALSE;
 
-    while (ScreenSaverCount < MAX_SCREENSAVERS)
+    ScreenSaverItem = pData->ScreenSaverItems + pData->ScreenSaverCount;
+
+    ScreenSaverItem->bIsScreenSaver = TRUE;
+
+    hModule = LoadLibraryEx(pszFilePath,
+                            NULL,
+                            DONT_RESOLVE_DLL_REFERENCES | 
LOAD_LIBRARY_AS_DATAFILE);
+    if (hModule)
     {
-        /* Don't add any hidden screensavers */
-        if ((fd.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN) == 0)
+        if (LoadString(hModule,
+                       1,
+                       ScreenSaverItem->szDisplayName,
+                       _countof(ScreenSaverItem->szDisplayName)) == 0)
         {
-            TCHAR filename[MAX_PATH];
-
-            hr = StringCbCopy(filename, sizeof(filename), pszSearchPath);
+            /* If the string does not exist, copy the file name */
+            hr = StringCbCopy(ScreenSaverItem->szDisplayName,
+                              sizeof(ScreenSaverItem->szDisplayName),
+                              pszFileName);
             if (FAILED(hr))
             {
-                FindClose(hFind);
-                return;
-            }
-            hr = StringCbCat(filename, sizeof(filename), _T("\\"));
-            if (FAILED(hr))
-            {
-                FindClose(hFind);
-                return;
-            }
-            hr = StringCbCat(filename, sizeof(filename), fd.cFileName);
-            if (FAILED(hr))
-            {
-                FindClose(hFind);
-                return;
+                FreeLibrary(hModule);
+                return FALSE;
             }
+            /* Remove the .scr extension */
+            ScreenSaverItem->szDisplayName[_tcslen(pszFileName)-4] = _T('\0');
+        }
+        FreeLibrary(hModule);
+    }
+    else
+    {
+        hr = StringCbCopy(ScreenSaverItem->szDisplayName,
+                          sizeof(ScreenSaverItem->szDisplayName),
+                          _T("Unknown"));
+        if (FAILED(hr))
+            return FALSE;
+    }
 
-            ScreenSaverItem = pData->ScreenSaverItems + ScreenSaverCount;
+    hr = StringCbCopy(ScreenSaverItem->szFilename,
+                      sizeof(ScreenSaverItem->szFilename),
+                      pszFilePath);
+    if (FAILED(hr))
+        return FALSE;
 
-            ScreenSaverItem->bIsScreenSaver = TRUE;
+    return AddScreenSaverItem(hwndScreenSavers, pData, ScreenSaverItem);
+}
 
-            hModule = LoadLibraryEx(filename,
-                                    NULL,
-                                    DONT_RESOLVE_DLL_REFERENCES | 
LOAD_LIBRARY_AS_DATAFILE);
-            if (hModule)
-            {
-                if (0 == LoadString(hModule,
-                          1,
-                          ScreenSaverItem->szDisplayName,
-                          sizeof(ScreenSaverItem->szDisplayName) / 
sizeof(TCHAR)))
-                {
-                    // If the string does not exists, copy the name of the file
-                    hr = StringCbCopy(ScreenSaverItem->szDisplayName, 
sizeof(ScreenSaverItem->szDisplayName), fd.cFileName);
-                    if (FAILED(hr))
-                    {
-                        FreeLibrary(hModule);
-                        FindClose(hFind);
-                        return;
-                    }
-                    ScreenSaverItem->szDisplayName[_tcslen(fd.cFileName)-4] = 
'\0';
-                }
-                FreeLibrary(hModule);
-            }
-            else
-            {
-                hr = StringCbCopy(ScreenSaverItem->szDisplayName, 
sizeof(ScreenSaverItem->szDisplayName), _T("Unknown"));
-                if (FAILED(hr))
-                {
-                    FindClose(hFind);
-                    return;
-                }
-            }
+static VOID
+SearchScreenSavers(
+    _In_ HWND hwndScreenSavers,
+    _In_ PDATA pData,
+    _In_ LPCTSTR pszSearchPath)
+{
+    HRESULT hr;
+    WIN32_FIND_DATA fd;
+    HANDLE hFind;
+    TCHAR szFilePath[MAX_PATH];
 
-            hr = StringCbCopy(ScreenSaverItem->szFilename, 
sizeof(ScreenSaverItem->szFilename), filename);
-            if (FAILED(hr))
-            {
-                FindClose(hFind);
-                return;
-            }
+    hr = StringCbPrintf(szFilePath, sizeof(szFilePath),
+                        TEXT("%s\\*.scr"), pszSearchPath);
+    if (FAILED(hr))
+        return;
 
-            i = SendMessage(hwndScreenSavers,
-                            CB_ADDSTRING,
-                            0,
-                            (LPARAM)ScreenSaverItem->szDisplayName);
+    hFind = FindFirstFile(szFilePath, &fd);
+    if (hFind == INVALID_HANDLE_VALUE)
+        return;
 
-            SendMessage(hwndScreenSavers,
-                        CB_SETITEMDATA,
-                        i,
-                        (LPARAM)ScreenSaverCount);
+    do
+    {
+        /* Don't add any hidden screensavers */
+        if (fd.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN)
+            continue;
 
-            ScreenSaverCount++;
-        }
+        if (pData->ScreenSaverCount >= MAX_SCREENSAVERS)
+            break;
 
-        if (!FindNextFile(hFind, &fd))
+        hr = StringCbPrintf(szFilePath, sizeof(szFilePath),
+                            TEXT("%s\\%s"), pszSearchPath, fd.cFileName);
+        if (FAILED(hr))
             break;
-    }
 
-    FindClose(hFind);
+        if (!AddScreenSaver(hwndScreenSavers, pData, szFilePath, fd.cFileName))
+            break;
 
-    pData->ScreenSaverCount = ScreenSaverCount;
-}
+    } while (FindNextFile(hFind, &fd));
 
+    FindClose(hFind);
+}
 
 static VOID
-AddScreenSavers(HWND hwndDlg, PDATA pData)
+EnumScreenSavers(
+    _In_ HWND hwndScreenSavers,
+    _In_ PDATA pData)
 {
-    HWND hwndScreenSavers = GetDlgItem(hwndDlg, IDC_SCREENS_LIST);
+    SCREEN_SAVER_ITEM* ScreenSaverItem;
+    PTCHAR pBackSlash;
     TCHAR szSearchPath[MAX_PATH];
     TCHAR szLocalPath[MAX_PATH];
-    INT i;
-    ScreenSaverItem *ScreenSaverItem = NULL;
-    LPTSTR lpBackSlash;
 
-    /* Add the "None" item */
+    /* Initialize the number of list items */
+    pData->ScreenSaverCount = 0;
+
+    /* Add the "(None)" item */
     ScreenSaverItem = pData->ScreenSaverItems;
 
     ScreenSaverItem->bIsScreenSaver = FALSE;
@@ -548,39 +561,28 @@ AddScreenSavers(HWND hwndDlg, PDATA pData)
     LoadString(hApplet,
                IDS_NONE,
                ScreenSaverItem->szDisplayName,
-               sizeof(ScreenSaverItem->szDisplayName) / sizeof(TCHAR));
+               _countof(ScreenSaverItem->szDisplayName));
 
-    i = SendMessage(hwndScreenSavers,
-                    CB_ADDSTRING,
-                    0,
-                    (LPARAM)ScreenSaverItem->szDisplayName);
-
-    SendMessage(hwndScreenSavers,
-                CB_SETITEMDATA,
-                i,
-                (LPARAM)0);
+    AddScreenSaverItem(hwndScreenSavers, pData, ScreenSaverItem);
 
-    // Initialize number of items into the list
-    pData->ScreenSaverCount = 1;
-
-    // Add all the screensavers where the applet is stored.
-    GetModuleFileName(hApplet, szLocalPath, MAX_PATH);
-    lpBackSlash = _tcsrchr(szLocalPath, _T('\\'));
-    if (lpBackSlash != NULL)
+    /* Add all the screensavers where the applet is stored */
+    GetModuleFileName(hApplet, szLocalPath, _countof(szLocalPath));
+    pBackSlash = _tcsrchr(szLocalPath, _T('\\'));
+    if (pBackSlash != NULL)
     {
-        *lpBackSlash = '\0';
-        SearchScreenSavers(hwndScreenSavers, szLocalPath, pData);
+        *pBackSlash = _T('\0');
+        SearchScreenSavers(hwndScreenSavers, pData, szLocalPath);
     }
 
-    // Add all the screensavers in the C:\ReactOS\System32 directory.
-    GetSystemDirectory(szSearchPath, MAX_PATH);
-    if (lpBackSlash != NULL && _tcsicmp(szSearchPath, szLocalPath) != 0)
-        SearchScreenSavers(hwndScreenSavers, szSearchPath, pData);
+    /* Add all the screensavers in the C:\ReactOS\System32 directory */
+    GetSystemDirectory(szSearchPath, _countof(szSearchPath));
+    if (pBackSlash != NULL && _tcsicmp(szSearchPath, szLocalPath) != 0)
+        SearchScreenSavers(hwndScreenSavers, pData, szSearchPath);
 
-    // Add all the screensavers in the C:\ReactOS directory.
-    GetWindowsDirectory(szSearchPath, MAX_PATH);
-    if (lpBackSlash != NULL && _tcsicmp(szSearchPath, szLocalPath) != 0)
-        SearchScreenSavers(hwndScreenSavers, szSearchPath, pData);
+    /* Add all the screensavers in the C:\ReactOS directory */
+    GetWindowsDirectory(szSearchPath, _countof(szSearchPath));
+    if (pBackSlash != NULL && _tcsicmp(szSearchPath, szLocalPath) != 0)
+        SearchScreenSavers(hwndScreenSavers, pData, szSearchPath);
 }
 
 
@@ -606,7 +608,7 @@ SetScreenSaver(HWND hwndDlg, PDATA pData)
         /* Set the screensaver */
         if (pData->ScreenSaverItems[pData->Selection].bIsScreenSaver)
         {
-            SIZE_T Length = 
_tcslen(pData->ScreenSaverItems[pData->Selection].szFilename) * sizeof(TCHAR);
+            SIZE_T Length = 
(_tcslen(pData->ScreenSaverItems[pData->Selection].szFilename) + 1) * 
sizeof(TCHAR);
             RegSetValueEx(regKey,
                           _T("SCRNSAVE.EXE"),
                           0,
@@ -658,9 +660,9 @@ SetScreenSaver(HWND hwndDlg, PDATA pData)
 static BOOL
 OnInitDialog(HWND hwndDlg, PDATA pData)
 {
-    LPTSTR lpCurSs;
     HWND hwndSSCombo = GetDlgItem(hwndDlg, IDC_SCREENS_LIST);
-    INT Num;
+    LPTSTR pSsValue;
+    INT iCurSs;
     WNDCLASS wc = {0};
 
     pData = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(DATA));
@@ -712,76 +714,67 @@ OnInitDialog(HWND hwndDlg, PDATA pData)
                        IDC_SCREENS_TIME,
                        UDM_SETRANGE,
                        0,
-                       MAKELONG
-                       ((short) 240, (short) 1));
+                       MAKELONG(240, 1));
 
-    AddScreenSavers(hwndDlg,
-                    pData);
+    EnumScreenSavers(hwndSSCombo, pData);
 
     CheckRegScreenSaverIsSecure(hwndDlg);
 
     /* Set the current screensaver in the combo box */
-    lpCurSs = GetCurrentScreenSaverValue(_T("SCRNSAVE.EXE"));
-    if (lpCurSs)
+    iCurSs = 0; // Default to "(None)"
+    pSsValue = GetCurrentScreenSaverValue(_T("SCRNSAVE.EXE"));
+    if (pSsValue)
     {
         BOOL bFound = FALSE;
         INT i;
 
-        for (i = 0; i < MAX_SCREENSAVERS; i++)
+        /* Find whether the current screensaver is in the list */
+        for (i = 0; i < pData->ScreenSaverCount; i++)
         {
-            if (!_tcscmp(lpCurSs, pData->ScreenSaverItems[i].szFilename))
+            if (!_tcsicmp(pSsValue, pData->ScreenSaverItems[i].szFilename))
             {
                 bFound = TRUE;
                 break;
             }
         }
 
-        if (bFound)
+        if (!bFound)
         {
-            Num = SendMessage(hwndSSCombo,
-                              CB_FINDSTRINGEXACT,
-                              -1,
-                              
(LPARAM)pData->ScreenSaverItems[i].szDisplayName);
-            if (Num != CB_ERR)
-                SendMessage(hwndSSCombo,
-                            CB_SETCURSEL,
-                            Num,
-                            0);
+            /* The current screensaver is not in the list: add it */
+            // i = pData->ScreenSaverCount;
+            bFound = AddScreenSaver(hwndSSCombo, pData, pSsValue, 
_T("SCRNSAVE.EXE"));
+            if (bFound)
+                i = pData->ScreenSaverCount - 1;
         }
-        else
+
+        HeapFree(GetProcessHeap(), 0, pSsValue);
+
+        if (bFound)
         {
-            SendMessage(hwndSSCombo,
-                        CB_SETCURSEL,
-                        0,
-                        0);
+            /* The current screensaver should be in the list: select it */
+            iCurSs = SendMessage(hwndSSCombo,
+                                 CB_FINDSTRINGEXACT,
+                                 -1,
+                                 
(LPARAM)pData->ScreenSaverItems[i].szDisplayName);
+            if (iCurSs == CB_ERR)
+                iCurSs = 0; // Default to "(None)"
         }
-
-        HeapFree(GetProcessHeap(), 0, lpCurSs);
-    }
-    else
-    {
-        /* Set screensaver to (none) */
-        SendMessage(hwndSSCombo,
-                    CB_SETCURSEL,
-                    0,
-                    0);
     }
+    SendMessage(hwndSSCombo, CB_SETCURSEL, iCurSs, 0);
 
     /* Set the current timeout */
-    lpCurSs = GetCurrentScreenSaverValue(_T("ScreenSaveTimeOut"));
-    if (lpCurSs)
+    pSsValue = GetCurrentScreenSaverValue(_T("ScreenSaveTimeOut"));
+    if (pSsValue)
     {
-        UINT Time = _ttoi(lpCurSs);
+        UINT Time = _ttoi(pSsValue) / 60;
 
-        Time /= 60;
+        HeapFree(GetProcessHeap(), 0, pSsValue);
 
         SendDlgItemMessage(hwndDlg,
                            IDC_SCREENS_TIME,
                            UDM_SETPOS32,
                            0,
                            Time);
-
-        HeapFree(GetProcessHeap(), 0, lpCurSs);
     }
 
     SelectionChanged(hwndDlg, pData);

Reply via email to