[TASKMGR] Process page: Allow using "Open File Location" functionality without runnin...
[reactos.git] / base / applications / rapps / winmain.cpp
1 /*
2 * PROJECT: ReactOS Applications Manager
3 * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
4 * FILE: base/applications/rapps/winmain.cpp
5 * PURPOSE: Main program
6 * COPYRIGHT: Copyright 2009 Dmitry Chapyshev (dmitry@reactos.org)
7 * Copyright 2015 Ismael Ferreras Morezuelas (swyterzone+ros@gmail.com)
8 * Copyright 2017 Alexander Shaposhnikov (sanchaez@reactos.org)
9 */
10 #include "rapps.h"
11
12 #include "unattended.h"
13
14 #include <atlcom.h>
15
16 HWND hMainWnd;
17 HINSTANCE hInst;
18 SETTINGS_INFO SettingsInfo;
19
20 class CRAppsModule : public CComModule
21 {
22 public:
23 };
24
25 BEGIN_OBJECT_MAP(ObjectMap)
26 END_OBJECT_MAP()
27
28 CRAppsModule gModule;
29 CAtlWinModule gWinModule;
30
31 static VOID InitializeAtlModule(HINSTANCE hInstance, BOOL bInitialize)
32 {
33 if (bInitialize)
34 {
35 gModule.Init(ObjectMap, hInstance, NULL);
36 }
37 else
38 {
39 gModule.Term();
40 }
41 }
42
43 VOID FillDefaultSettings(PSETTINGS_INFO pSettingsInfo)
44 {
45 ATL::CStringW szDownloadDir;
46 ZeroMemory(pSettingsInfo, sizeof(SETTINGS_INFO));
47
48 pSettingsInfo->bSaveWndPos = TRUE;
49 pSettingsInfo->bUpdateAtStart = FALSE;
50 pSettingsInfo->bLogEnabled = TRUE;
51
52 if (FAILED(SHGetFolderPathW(NULL, CSIDL_PERSONAL, NULL, SHGFP_TYPE_CURRENT, szDownloadDir.GetBuffer(MAX_PATH))))
53 {
54 szDownloadDir.ReleaseBuffer();
55 if (!szDownloadDir.GetEnvironmentVariableW(L"SystemDrive"))
56 {
57 szDownloadDir = L"C:";
58 }
59 }
60 else
61 {
62 szDownloadDir.ReleaseBuffer();
63 }
64
65 szDownloadDir += L"\\RAPPS Downloads";
66 ATL::CStringW::CopyChars(pSettingsInfo->szDownloadDir,
67 _countof(pSettingsInfo->szDownloadDir),
68 szDownloadDir.GetString(),
69 szDownloadDir.GetLength() + 1);
70
71 pSettingsInfo->bDelInstaller = FALSE;
72 pSettingsInfo->Maximized = FALSE;
73 pSettingsInfo->Left = CW_USEDEFAULT;
74 pSettingsInfo->Top = CW_USEDEFAULT;
75 pSettingsInfo->Width = 680;
76 pSettingsInfo->Height = 450;
77 }
78
79 static BOOL LoadSettings()
80 {
81 ATL::CRegKey RegKey;
82 DWORD dwSize;
83 BOOL bResult = FALSE;
84 if (RegKey.Open(HKEY_CURRENT_USER, L"Software\\ReactOS\\rapps", KEY_READ) == ERROR_SUCCESS)
85 {
86 dwSize = sizeof(SettingsInfo);
87 bResult = (RegKey.QueryBinaryValue(L"Settings", (PVOID) &SettingsInfo, &dwSize) == ERROR_SUCCESS);
88
89 RegKey.Close();
90 }
91
92 return bResult;
93 }
94
95 VOID SaveSettings(HWND hwnd)
96 {
97 WINDOWPLACEMENT wp;
98 ATL::CRegKey RegKey;
99
100 if (SettingsInfo.bSaveWndPos)
101 {
102 wp.length = sizeof(wp);
103 GetWindowPlacement(hwnd, &wp);
104
105 SettingsInfo.Left = wp.rcNormalPosition.left;
106 SettingsInfo.Top = wp.rcNormalPosition.top;
107 SettingsInfo.Width = wp.rcNormalPosition.right - wp.rcNormalPosition.left;
108 SettingsInfo.Height = wp.rcNormalPosition.bottom - wp.rcNormalPosition.top;
109 SettingsInfo.Maximized = (wp.showCmd == SW_MAXIMIZE
110 || (wp.showCmd == SW_SHOWMINIMIZED
111 && (wp.flags & WPF_RESTORETOMAXIMIZED)));
112 }
113
114 if (RegKey.Create(HKEY_CURRENT_USER, L"Software\\ReactOS\\rapps", NULL,
115 REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, NULL) == ERROR_SUCCESS)
116 {
117 RegKey.SetBinaryValue(L"Settings", (const PVOID) &SettingsInfo, sizeof(SettingsInfo));
118 RegKey.Close();
119 }
120 }
121
122 INT WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, INT nShowCmd)
123 {
124 LPCWSTR szWindowClass = L"ROSAPPMGR";
125 HANDLE hMutex;
126 BOOL bIsFirstLaunch;
127
128 InitializeAtlModule(hInstance, TRUE);
129
130 if (GetUserDefaultUILanguage() == MAKELANGID(LANG_HEBREW, SUBLANG_DEFAULT))
131 {
132 SetProcessDefaultLayout(LAYOUT_RTL);
133 }
134
135 hInst = hInstance;
136
137 hMutex = CreateMutexW(NULL, FALSE, szWindowClass);
138 if ((!hMutex) || (GetLastError() == ERROR_ALREADY_EXISTS))
139 {
140 /* If already started, it is found its window */
141 HWND hWindow = FindWindowW(szWindowClass, NULL);
142
143 /* Activate window */
144 ShowWindow(hWindow, SW_SHOWNORMAL);
145 SetForegroundWindow(hWindow);
146 return 1;
147 }
148 bIsFirstLaunch = !LoadSettings();
149 if (bIsFirstLaunch)
150 {
151 FillDefaultSettings(&SettingsInfo);
152 }
153
154 InitLogs();
155 InitCommonControls();
156
157 // skip window creation if there were some keys
158 if (!UseCmdParameters(GetCommandLineW()))
159 {
160 if (SettingsInfo.bUpdateAtStart || bIsFirstLaunch)
161 CAvailableApps::ForceUpdateAppsDB();
162
163 ShowMainWindow(nShowCmd);
164 }
165
166 if (hMutex)
167 CloseHandle(hMutex);
168
169 InitializeAtlModule(hInstance, FALSE);
170
171 return 0;
172 }