* Sync up to trunk head (r64716).
[reactos.git] / base / applications / rapps / misc.c
index b0c01e9..7f7ba20 100644 (file)
@@ -8,7 +8,6 @@
 
 #include "rapps.h"
 
-
 /* SESSION Operation */
 #define EXTRACT_FILLFILELIST  0x00000001
 #define EXTRACT_EXTRACTFILES  0x00000002
@@ -112,18 +111,23 @@ GetClientWindowHeight(HWND hwnd)
 VOID
 CopyTextToClipboard(LPCWSTR lpszText)
 {
-    if(OpenClipboard(NULL))
+    HRESULT hr;
+
+    if (OpenClipboard(NULL))
     {
         HGLOBAL ClipBuffer;
         WCHAR *Buffer;
+        DWORD cchBuffer;
 
         EmptyClipboard();
-        ClipBuffer = GlobalAlloc(GMEM_DDESHARE, (wcslen(lpszText) + 1) * sizeof(TCHAR));
-        Buffer = (WCHAR*)GlobalLock(ClipBuffer);
-        wcscpy(Buffer, lpszText);
+        cchBuffer = wcslen(lpszText) + 1;
+        ClipBuffer = GlobalAlloc(GMEM_DDESHARE, cchBuffer * sizeof(WCHAR));
+        Buffer = GlobalLock(ClipBuffer);
+        hr = StringCchCopyW(Buffer, cchBuffer, lpszText);
         GlobalUnlock(ClipBuffer);
 
-        SetClipboardData(CF_UNICODETEXT, ClipBuffer);
+        if (SUCCEEDED(hr))
+            SetClipboardData(CF_UNICODETEXT, ClipBuffer);
 
         CloseClipboard();
     }
@@ -145,17 +149,35 @@ SetWelcomeText(VOID)
 }
 
 VOID
-ShowPopupMenu(HWND hwnd, UINT MenuID)
+ShowPopupMenu(HWND hwnd, UINT MenuID, UINT DefaultItem)
 {
-    HMENU hPopupMenu = GetSubMenu(LoadMenuW(hInst, MAKEINTRESOURCEW(MenuID)), 0);
+    HMENU hMenu = NULL;
+    HMENU hPopupMenu;
+    MENUITEMINFO mii;
     POINT pt;
 
+    if (MenuID)
+    {
+        hMenu = LoadMenuW(hInst, MAKEINTRESOURCEW(MenuID));
+        hPopupMenu = GetSubMenu(hMenu, 0);
+    }
+    else
+        hPopupMenu = GetMenu(hwnd);
+
+    ZeroMemory(&mii, sizeof(mii));
+    mii.cbSize = sizeof(mii);
+    mii.fMask = MIIM_STATE;
+    GetMenuItemInfo(hPopupMenu, DefaultItem, FALSE, &mii);
+    if (!(mii.fState & MFS_GRAYED))
+        SetMenuDefaultItem(hPopupMenu, DefaultItem, FALSE);
+
     GetCursorPos(&pt);
 
     SetForegroundWindow(hwnd);
     TrackPopupMenu(hPopupMenu, 0, pt.x, pt.y, 0, hMainWnd, NULL);
 
-    DestroyMenu(hPopupMenu);
+    if (hMenu)
+        DestroyMenu(hMenu);
 }
 
 BOOL
@@ -168,6 +190,7 @@ StartProcess(LPWSTR lpPath, BOOL Wait)
 
     ZeroMemory(&si, sizeof(si));
     si.cb = sizeof(si);
+    si.dwFlags = STARTF_USESHOWWINDOW;
     si.wShowWindow = SW_SHOW;
 
     if (!CreateProcessW(NULL, lpPath, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
@@ -208,6 +231,26 @@ StartProcess(LPWSTR lpPath, BOOL Wait)
     return TRUE;
 }
 
+BOOL
+GetStorageDirectory(PWCHAR lpDirectory, DWORD cch)
+{
+    if (cch < MAX_PATH)
+        return FALSE;
+
+    if (!SHGetSpecialFolderPathW(NULL, lpDirectory, CSIDL_LOCAL_APPDATA, TRUE))
+        return FALSE;
+
+    if (FAILED(StringCchCatW(lpDirectory, cch, L"\\rapps")))
+        return FALSE;
+
+    if (!CreateDirectoryW(lpDirectory, NULL) &&
+        GetLastError() != ERROR_ALREADY_EXISTS)
+    {
+        return FALSE;
+    }
+
+    return TRUE;
+}
 
 BOOL
 ExtractFilesFromCab(LPWSTR lpCabName, LPWSTR lpOutputPath)
@@ -250,7 +293,7 @@ ExtractFilesFromCab(LPWSTR lpCabName, LPWSTR lpOutputPath)
 VOID
 InitLogs(VOID)
 {
-    WCHAR szBuf[MAX_PATH] = L"SYSTEM\\CurrentControlSet\\Services\\EventLog\\ReactOS Application Manager\\ReactOS Application Manager";
+    WCHAR szBuf[MAX_PATH] = L"SYSTEM\\CurrentControlSet\\Services\\EventLog\\Application\\ReactOS Application Manager";
     WCHAR szPath[MAX_PATH];
     DWORD dwCategoryNum = 1;
     DWORD dwDisp, dwData;
@@ -261,13 +304,13 @@ InitLogs(VOID)
     if (RegCreateKeyExW(HKEY_LOCAL_MACHINE,
                         szBuf, 0, NULL,
                         REG_OPTION_NON_VOLATILE,
-                        KEY_WRITE, NULL, &hKey, &dwDisp) != ERROR_SUCCESS) 
+                        KEY_WRITE, NULL, &hKey, &dwDisp) != ERROR_SUCCESS)
     {
         return;
     }
 
-    if (!GetCurrentDirectoryW(MAX_PATH, szPath)) return;
-    wcscat(szPath, L"\\rapps.exe");
+    if (!GetModuleFileName(NULL, szPath, sizeof(szPath) / sizeof(szPath[0])))
+        return;
 
     if (RegSetValueExW(hKey,
                        L"EventMessageFile",
@@ -276,13 +319,13 @@ InitLogs(VOID)
                        (LPBYTE)szPath,
                        (DWORD)(wcslen(szPath) + 1) * sizeof(WCHAR)) != ERROR_SUCCESS)
     {
-        RegCloseKey(hKey); 
+        RegCloseKey(hKey);
         return;
     }
 
-    dwData = EVENTLOG_ERROR_TYPE | EVENTLOG_WARNING_TYPE | 
-             EVENTLOG_INFORMATION_TYPE; 
+    dwData = EVENTLOG_ERROR_TYPE | EVENTLOG_WARNING_TYPE |
+             EVENTLOG_INFORMATION_TYPE;
+
     if (RegSetValueExW(hKey,
                        L"TypesSupported",
                        0,
@@ -290,7 +333,7 @@ InitLogs(VOID)
                        (LPBYTE)&dwData,
                        sizeof(DWORD)) != ERROR_SUCCESS)
     {
-        RegCloseKey(hKey); 
+        RegCloseKey(hKey);
         return;
     }
 
@@ -301,7 +344,7 @@ InitLogs(VOID)
                        (LPBYTE)szPath,
                        (DWORD)(wcslen(szPath) + 1) * sizeof(WCHAR)) != ERROR_SUCCESS)
     {
-        RegCloseKey(hKey); 
+        RegCloseKey(hKey);
         return;
     }
 
@@ -312,7 +355,7 @@ InitLogs(VOID)
                        (LPBYTE)&dwCategoryNum,
                        sizeof(DWORD)) != ERROR_SUCCESS)
     {
-        RegCloseKey(hKey); 
+        RegCloseKey(hKey);
         return;
     }