/* * PROJECT: ReactOS Applications Manager * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+) * FILE: base/applications/rapps/winmain.cpp * PURPOSE: Main program * COPYRIGHT: Copyright 2009 Dmitry Chapyshev (dmitry@reactos.org) * Copyright 2015 Ismael Ferreras Morezuelas (swyterzone+ros@gmail.com) * Copyright 2017 Alexander Shaposhnikov (sanchaez@reactos.org) */ #include "rapps.h" #include "unattended.h" #include HWND hMainWnd; HINSTANCE hInst; INT SelectedEnumType = ENUM_ALL_INSTALLED; SETTINGS_INFO SettingsInfo; ATL::CStringW szSearchPattern; class CRAppsModule : public CComModule { public: }; BEGIN_OBJECT_MAP(ObjectMap) END_OBJECT_MAP() CRAppsModule gModule; CAtlWinModule gWinModule; static VOID InitializeAtlModule(HINSTANCE hInstance, BOOL bInitialize) { if (bInitialize) { gModule.Init(ObjectMap, hInstance, NULL); } else { gModule.Term(); } } VOID FillDefaultSettings(PSETTINGS_INFO pSettingsInfo) { ATL::CStringW szDownloadDir; ZeroMemory(pSettingsInfo, sizeof(SETTINGS_INFO)); pSettingsInfo->bSaveWndPos = TRUE; pSettingsInfo->bUpdateAtStart = FALSE; pSettingsInfo->bLogEnabled = TRUE; if (FAILED(SHGetFolderPathW(NULL, CSIDL_PERSONAL, NULL, SHGFP_TYPE_CURRENT, szDownloadDir.GetBuffer(MAX_PATH)))) { szDownloadDir.ReleaseBuffer(); if (!szDownloadDir.GetEnvironmentVariableW(L"SystemDrive")) { szDownloadDir = L"C:"; } } else { szDownloadDir.ReleaseBuffer(); } szDownloadDir += L"\\RAPPS Downloads"; ATL::CStringW::CopyChars(pSettingsInfo->szDownloadDir, _countof(pSettingsInfo->szDownloadDir), szDownloadDir.GetString(), szDownloadDir.GetLength() + 1); pSettingsInfo->bDelInstaller = FALSE; pSettingsInfo->Maximized = FALSE; pSettingsInfo->Left = CW_USEDEFAULT; pSettingsInfo->Top = CW_USEDEFAULT; pSettingsInfo->Width = 680; pSettingsInfo->Height = 450; } static BOOL LoadSettings() { ATL::CRegKey RegKey; DWORD dwSize; BOOL bResult = FALSE; if (RegKey.Open(HKEY_CURRENT_USER, L"Software\\ReactOS\\rapps", KEY_READ) == ERROR_SUCCESS) { dwSize = sizeof(SettingsInfo); bResult = (RegKey.QueryBinaryValue(L"Settings", (PVOID) &SettingsInfo, &dwSize) == ERROR_SUCCESS); RegKey.Close(); } return bResult; } VOID SaveSettings(HWND hwnd) { WINDOWPLACEMENT wp; ATL::CRegKey RegKey; if (SettingsInfo.bSaveWndPos) { wp.length = sizeof(wp); GetWindowPlacement(hwnd, &wp); SettingsInfo.Left = wp.rcNormalPosition.left; SettingsInfo.Top = wp.rcNormalPosition.top; SettingsInfo.Width = wp.rcNormalPosition.right - wp.rcNormalPosition.left; SettingsInfo.Height = wp.rcNormalPosition.bottom - wp.rcNormalPosition.top; SettingsInfo.Maximized = (wp.showCmd == SW_MAXIMIZE || (wp.showCmd == SW_SHOWMINIMIZED && (wp.flags & WPF_RESTORETOMAXIMIZED))); } if (RegKey.Create(HKEY_CURRENT_USER, L"Software\\ReactOS\\rapps", NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, NULL) == ERROR_SUCCESS) { RegKey.SetBinaryValue(L"Settings", (const PVOID) &SettingsInfo, sizeof(SettingsInfo)); RegKey.Close(); } } INT WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, INT nShowCmd) { LPCWSTR szWindowClass = L"ROSAPPMGR"; HANDLE hMutex; HACCEL KeyBrd; MSG Msg; BOOL bIsFirstLaunch; InitializeAtlModule(hInstance, TRUE); if (GetUserDefaultUILanguage() == MAKELANGID(LANG_HEBREW, SUBLANG_DEFAULT)) { SetProcessDefaultLayout(LAYOUT_RTL); } hInst = hInstance; hMutex = CreateMutexW(NULL, FALSE, szWindowClass); if ((!hMutex) || (GetLastError() == ERROR_ALREADY_EXISTS)) { /* If already started, it is found its window */ HWND hWindow = FindWindowW(szWindowClass, NULL); /* Activate window */ ShowWindow(hWindow, SW_SHOWNORMAL); SetForegroundWindow(hWindow); return 1; } bIsFirstLaunch = !LoadSettings(); if (bIsFirstLaunch) { FillDefaultSettings(&SettingsInfo); } InitLogs(); InitCommonControls(); // skip window creation if there were some keys if (!UseCmdParameters(GetCommandLineW())) { if (SettingsInfo.bUpdateAtStart || bIsFirstLaunch) CAvailableApps::ForceUpdateAppsDB(); hMainWnd = CreateMainWindow(); if (hMainWnd) { /* Maximize it if we must */ ShowWindow(hMainWnd, ((SettingsInfo.bSaveWndPos && SettingsInfo.Maximized) ? SW_MAXIMIZE : nShowCmd)); UpdateWindow(hMainWnd); /* Load the menu hotkeys */ KeyBrd = LoadAcceleratorsW(NULL, MAKEINTRESOURCEW(HOTKEYS)); /* Message Loop */ while (GetMessageW(&Msg, NULL, 0, 0)) { if (!TranslateAcceleratorW(hMainWnd, KeyBrd, &Msg)) { TranslateMessage(&Msg); DispatchMessageW(&Msg); } } } } if (hMutex) CloseHandle(hMutex); InitializeAtlModule(hInstance, FALSE); return 0; }