Tray menu
This commit is contained in:
12
3rd_party/CEF/create.cmd
vendored
12
3rd_party/CEF/create.cmd
vendored
@@ -11,7 +11,7 @@ if not exist "%MODE%.complete" (
|
||||
|
||||
set CEF_USE_GN=1
|
||||
if "%MODE%"=="Debug" (
|
||||
set GN_DEFINES=is_win_fastlink=true fatal_linker_warnings=false
|
||||
set GN_DEFINES=fatal_linker_warnings=false
|
||||
) else (
|
||||
set GN_DEFINES=fatal_linker_warnings=false
|
||||
)
|
||||
@@ -68,12 +68,10 @@ if not exist "%MODE%.complete" (
|
||||
copy /y chromium_git\chromium\src\out\%MODE%_GN_x64\cef.pak bin\%MODE%\
|
||||
copy /y chromium_git\chromium\src\out\%MODE%_GN_x64\*.bin bin\%MODE%\
|
||||
copy /y chromium_git\chromium\src\out\%MODE%_GN_x64\cef_*.pak bin\%MODE%\
|
||||
|
||||
if "%MODE%"=="Release" (
|
||||
echo "Cleaning build output... Please wait..."
|
||||
rd /s /q chromium_git\chromium\src\out\%MODE%_GN_x64
|
||||
rd /s /q chromium_git\chromium\src\out\%MODE%_GN_x86
|
||||
)
|
||||
|
||||
echo "Cleaning build output... Please wait..."
|
||||
rd /s /q chromium_git\chromium\src\out\%MODE%_GN_x64
|
||||
rd /s /q chromium_git\chromium\src\out\%MODE%_GN_x86
|
||||
|
||||
echo "1">%MODE%.complete
|
||||
)
|
||||
|
@@ -28,6 +28,8 @@ public:
|
||||
JProperty(bool, LaunchBundledSiad, public, public, _configDocument)
|
||||
JProperty(bool, LaunchFileMgrOnMount, public, public, _configDocument)
|
||||
JProperty(std::string, EventLevel, public, public, _configDocument)
|
||||
JProperty(bool, PromptOnClose, public, public, _configDocument)
|
||||
JProperty(bool, CloseToTray, public, public, _configDocument)
|
||||
|
||||
private:
|
||||
const bool _autoSave;
|
||||
|
@@ -12,7 +12,80 @@ using namespace Sia::Api;
|
||||
CSiaDriveHandler* g_instance = nullptr;
|
||||
|
||||
#ifdef _WIN32
|
||||
#define WM_SIA_TRAY_ICON (WM_USER+2048)
|
||||
#define MENU_ITEM_SHOW_HIDE 0x00010000;
|
||||
#define MENU_ITEM_EXIT 0x00010001;
|
||||
static HMENU g_trayMenu = nullptr;
|
||||
static WNDPROC g_defProc;
|
||||
static NOTIFYICONDATA g_notifyIcon = { 0 };
|
||||
static LRESULT CALLBACK SiaWndProc(HWND wnd, UINT msg, WPARAM wparam, LPARAM lparam)
|
||||
{
|
||||
if (msg == WM_SIA_TRAY_ICON)
|
||||
{
|
||||
switch (lparam)
|
||||
{
|
||||
case WM_LBUTTONDBLCLK:
|
||||
{
|
||||
::ShowWindow(wnd, ::IsWindowVisible(wnd) ? SW_HIDE : SW_RESTORE);
|
||||
if (::IsWindowVisible(wnd))
|
||||
{
|
||||
::SetForegroundWindow(wnd);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case WM_CONTEXTMENU:
|
||||
{
|
||||
// Create menu
|
||||
if (g_trayMenu)
|
||||
{
|
||||
::DestroyMenu(g_trayMenu);
|
||||
g_trayMenu = nullptr;
|
||||
}
|
||||
g_trayMenu = ::CreatePopupMenu();
|
||||
|
||||
// Add menu items
|
||||
{
|
||||
MENUITEMINFO menuItem = { 0 };
|
||||
menuItem.cbSize = sizeof(menuItem);
|
||||
menuItem.fMask = MIIM_STRING | MIIM_ID | MIIM_CHECKMARKS | MIIM_STATE | MIIM_TYPE;
|
||||
menuItem.wID = MENU_ITEM_SHOW_HIDE;
|
||||
menuItem.fType = MFT_RADIOCHECK;
|
||||
menuItem.fState = ::IsWindowVisible(wnd) ? MFS_CHECKED : MFS_UNCHECKED;
|
||||
menuItem.dwTypeData = ::IsWindowVisible(wnd) ? L"Hide" : L"Show";
|
||||
::InsertMenuItem(g_trayMenu, 0, FALSE, &menuItem);
|
||||
}
|
||||
|
||||
{
|
||||
MENUITEMINFO menuItem = { 0 };
|
||||
menuItem.cbSize = sizeof(menuItem);
|
||||
menuItem.fMask = MIIM_TYPE;
|
||||
menuItem.fType = MFT_SEPARATOR;
|
||||
::InsertMenuItem(g_trayMenu, 0, FALSE, &menuItem);
|
||||
}
|
||||
|
||||
{
|
||||
MENUITEMINFO menuItem = { 0 };
|
||||
menuItem.cbSize = sizeof(menuItem);
|
||||
menuItem.fMask = MIIM_STRING | MIIM_ID | MIIM_TYPE;
|
||||
menuItem.wID = MENU_ITEM_EXIT;
|
||||
menuItem.fType = MFT_STRING;
|
||||
menuItem.dwTypeData = L"Exit";
|
||||
::InsertMenuItem(g_trayMenu, 0, FALSE, &menuItem);
|
||||
}
|
||||
|
||||
// Display menu
|
||||
POINT pt = { 0 };
|
||||
::GetCursorPos(&pt);
|
||||
::SetForegroundWindow(wnd);
|
||||
::TrackPopupMenu(g_trayMenu, 0, pt.x, pt.y, 0, wnd, nullptr);
|
||||
::PostMessage(wnd, WM_NULL, 0, 0);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
return ::CallWindowProc(g_defProc, wnd, msg, wparam, lparam);
|
||||
}
|
||||
#endif
|
||||
|
||||
CSiaDriveHandler::CSiaDriveHandler(const bool& useViews) :
|
||||
@@ -71,6 +144,9 @@ void CSiaDriveHandler::OnAfterCreated(CefRefPtr<CefBrowser> browser)
|
||||
CEF_REQUIRE_UI_THREAD();
|
||||
#ifdef _WIN32
|
||||
HWND hwnd = browser->GetHost()->GetWindowHandle();
|
||||
g_defProc = reinterpret_cast<WNDPROC>(::GetWindowLongPtr(hwnd, GWLP_WNDPROC));
|
||||
::SetWindowLongPtr(hwnd, GWLP_WNDPROC,reinterpret_cast<LONG_PTR>(SiaWndProc));
|
||||
|
||||
HINSTANCE hinstance = ::GetModuleHandle(nullptr);
|
||||
HICON icon = ::LoadIcon(hinstance, L"IDI_ICON");
|
||||
|
||||
@@ -82,11 +158,12 @@ void CSiaDriveHandler::OnAfterCreated(CefRefPtr<CefBrowser> browser)
|
||||
g_notifyIcon.cbSize = sizeof(g_notifyIcon);
|
||||
g_notifyIcon.hWnd = hwnd;
|
||||
g_notifyIcon.hIcon = icon;
|
||||
g_notifyIcon.uCallbackMessage = WM_SIA_TRAY_ICON;
|
||||
GUID g = { 0 };
|
||||
::CoCreateGuid(&g);
|
||||
g_notifyIcon.guidItem = g;
|
||||
g_notifyIcon.uVersion = NOTIFYICON_VERSION_4;
|
||||
g_notifyIcon.uFlags = NIF_ICON | NIF_GUID;
|
||||
g_notifyIcon.uFlags = NIF_ICON | NIF_GUID | NIF_MESSAGE;
|
||||
::Shell_NotifyIcon(NIM_ADD, &g_notifyIcon);
|
||||
#else
|
||||
a
|
||||
@@ -130,6 +207,11 @@ void CSiaDriveHandler::OnBeforeClose(CefRefPtr<CefBrowser> browser)
|
||||
if (_browserList.size() == 0)
|
||||
{
|
||||
::Shell_NotifyIcon(NIM_DELETE, &g_notifyIcon);
|
||||
if (g_trayMenu)
|
||||
{
|
||||
::DestroyMenu(g_trayMenu);
|
||||
g_trayMenu = nullptr;
|
||||
}
|
||||
CefQuitMessageLoop();
|
||||
}
|
||||
}
|
||||
|
@@ -166,6 +166,18 @@ bool CSiaDriveConfig::LoadDefaults()
|
||||
changed = true;
|
||||
}
|
||||
|
||||
if (!CheckPromptOnClose())
|
||||
{
|
||||
SetPromptOnClose(false);
|
||||
changed = true;
|
||||
}
|
||||
|
||||
if (!CheckCloseToTray())
|
||||
{
|
||||
SetCloseToTray(true);
|
||||
changed = true;
|
||||
}
|
||||
|
||||
return changed;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user