summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGeorge Hazan <george.hazan@gmail.com>2025-06-28 13:16:21 +0300
committerGeorge Hazan <george.hazan@gmail.com>2025-06-28 13:16:21 +0300
commit603e8738b37583473102f0964c826678d790d764 (patch)
treed54b3e4473de5607fb9901b331e8d55ba7ee50c3 /src
parentd73824121408b3386f990246c9e06682b711492a (diff)
Wine fix for menu icons
Diffstat (limited to 'src')
-rw-r--r--src/mir_app/src/menu_utils.cpp18
-rw-r--r--src/mir_core/src/Windows/miranda.cpp2
-rw-r--r--src/mir_core/src/Windows/threads.cpp2
-rw-r--r--src/mir_core/src/Windows/winver.cpp17
-rw-r--r--src/mir_core/src/mir_core.def1
-rw-r--r--src/mir_core/src/mir_core64.def1
-rw-r--r--src/mir_core/src/miranda.h2
7 files changed, 24 insertions, 19 deletions
diff --git a/src/mir_app/src/menu_utils.cpp b/src/mir_app/src/menu_utils.cpp
index 33baa03ddb..2dad01211a 100644
--- a/src/mir_app/src/menu_utils.cpp
+++ b/src/mir_app/src/menu_utils.cpp
@@ -97,7 +97,7 @@ HBITMAP ConvertIconToBitmap(HIMAGELIST hIml, int iconId)
endBufferedPaint = (pfnEndBufferedPaint)GetProcAddress(hThemeAPI, "EndBufferedPaint");
}
- BITMAPINFO bmi = { 0 };
+ BITMAPINFO bmi = {};
bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biCompression = BI_RGB;
@@ -110,7 +110,7 @@ HBITMAP ConvertIconToBitmap(HIMAGELIST hIml, int iconId)
HBITMAP hbmpOld = (HBITMAP)SelectObject(hdc, hbmp);
BLENDFUNCTION bfAlpha = { AC_SRC_OVER, 0, 255, AC_SRC_ALPHA };
- BP_PAINTPARAMS paintParams = { 0 };
+ BP_PAINTPARAMS paintParams = {};
paintParams.cbSize = sizeof(paintParams);
paintParams.dwFlags = BPPF_ERASE;
paintParams.pBlendFunction = &bfAlpha;
@@ -901,7 +901,7 @@ MIR_APP_DLL(HGENMENU) Menu_AddItem(int hMenuObject, TMO_MenuItem *pmi, void *pUs
static int WhereToPlace(HMENU hMenu, TMO_MenuItem *mi)
{
- MENUITEMINFO mii = { 0 };
+ MENUITEMINFO mii = {};
mii.cbSize = sizeof(mii);
mii.fMask = MIIM_SUBMENU | MIIM_DATA;
for (int i = GetMenuItemCount(hMenu) - 1; i >= 0; i--) {
@@ -921,7 +921,7 @@ static int WhereToPlace(HMENU hMenu, TMO_MenuItem *mi)
static uint32_t GetMenuItemType(HMENU hMenu, int uItem)
{
- MENUITEMINFO mii = { 0 };
+ MENUITEMINFO mii = {};
mii.cbSize = sizeof(mii);
mii.fMask = MIIM_TYPE;
GetMenuItemInfo(hMenu, uItem, TRUE, &mii);
@@ -930,7 +930,7 @@ static uint32_t GetMenuItemType(HMENU hMenu, int uItem)
static UINT GetMenuItemTypeData(HMENU hMenu, int uItem, TMO_IntMenuItem *&p)
{
- MENUITEMINFO mii = { 0 };
+ MENUITEMINFO mii = {};
mii.cbSize = sizeof(mii);
mii.fMask = MIIM_DATA | MIIM_TYPE;
GetMenuItemInfo(hMenu, uItem, TRUE, &mii);
@@ -940,7 +940,7 @@ static UINT GetMenuItemTypeData(HMENU hMenu, int uItem, TMO_IntMenuItem *&p)
static void InsertSeparator(HMENU hMenu, int uItem)
{
- MENUITEMINFO mii = { 0 };
+ MENUITEMINFO mii = {};
mii.cbSize = sizeof(mii);
mii.fMask = MIIM_TYPE;
mii.fType = MFT_SEPARATOR;
@@ -1129,7 +1129,7 @@ static HMENU BuildRecursiveMenu(HMENU hMenu, const TMO_LinkedList &pList, WPARAM
mii.fMask = MIIM_DATA | MIIM_ID | MIIM_STRING | MIIM_STATE;
if (pmi->iconId != -1 && g_bMenuIconsEnabled) {
mii.fMask |= MIIM_BITMAP;
- if (IsWinVerVistaPlus() && IsThemeActive()) {
+ if (IsWinVerVistaPlus() && IsThemeActive() && !IsWine()) {
if (pmi->hBmp == nullptr)
pmi->hBmp = ConvertIconToBitmap(pmi->parent->m_hMenuIcons, pmi->iconId);
mii.hbmpItem = pmi->hBmp;
@@ -1232,8 +1232,8 @@ static int MO_ReloadIcon(TMO_IntMenuItem *pmi, const void *)
int OnIconLibChanges(WPARAM, LPARAM)
{
- {
- mir_cslock lck(csMenuHook);
+ { mir_cslock lck(csMenuHook);
+
for (auto &p : g_menus)
if (hStatusMenuObject != p->id) //skip status menu
MO_RecursiveWalkMenu(p->m_items, MO_ReloadIcon);
diff --git a/src/mir_core/src/Windows/miranda.cpp b/src/mir_core/src/Windows/miranda.cpp
index dc867b89fe..0e4bd9d344 100644
--- a/src/mir_core/src/Windows/miranda.cpp
+++ b/src/mir_core/src/Windows/miranda.cpp
@@ -39,7 +39,7 @@ void InitHyperlink();
void InitTimeZones();
void InitWinver();
-HINSTANCE g_hInst = nullptr;
+HINSTANCE g_hInst = nullptr, g_hNtdll = GetModuleHandleA("ntdll.dll");
HCURSOR g_hCursorNS, g_hCursorWE;
HANDLE hThreadQueueEmpty;
diff --git a/src/mir_core/src/Windows/threads.cpp b/src/mir_core/src/Windows/threads.cpp
index 1685d8c31a..898c6c0455 100644
--- a/src/mir_core/src/Windows/threads.cpp
+++ b/src/mir_core/src/Windows/threads.cpp
@@ -305,7 +305,7 @@ typedef LONG (WINAPI *pNtQIT)(HANDLE, LONG, PVOID, ULONG, PULONG);
static void* GetCurrentThreadEntryPoint()
{
- pNtQIT NtQueryInformationThread = (pNtQIT)GetProcAddress(GetModuleHandle(L"ntdll.dll"), "NtQueryInformationThread");
+ pNtQIT NtQueryInformationThread = (pNtQIT)GetProcAddress(g_hNtdll, "NtQueryInformationThread");
if (NtQueryInformationThread == nullptr)
return nullptr;
diff --git a/src/mir_core/src/Windows/winver.cpp b/src/mir_core/src/Windows/winver.cpp
index 704464d5f3..b3fadf2043 100644
--- a/src/mir_core/src/Windows/winver.cpp
+++ b/src/mir_core/src/Windows/winver.cpp
@@ -30,11 +30,13 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#endif
static int dwWinVer;
+static bool bIsWine = false;
void InitWinver()
{
uint32_t dwVer = LOWORD(GetVersion());
dwWinVer = MAKEWORD(HIBYTE(dwVer), LOBYTE(dwVer));
+ bIsWine = GetProcAddress(g_hNtdll, "wine_get_version") != 0;
}
MIR_CORE_DLL(BOOL) IsWinVerVistaPlus()
@@ -62,17 +64,21 @@ MIR_CORE_DLL(BOOL) IsWinVer10Plus()
return dwWinVer >= _WIN32_WINNT_WIN10;
}
-MIR_CORE_DLL(BOOL) IsFullScreen()
+MIR_CORE_DLL(BOOL) IsWine()
{
- RECT rcScreen = { 0 };
+ return bIsWine;
+}
+MIR_CORE_DLL(BOOL) IsFullScreen()
+{
+ RECT rcScreen = {};
rcScreen.right = GetSystemMetrics(SM_CXSCREEN);
rcScreen.bottom = GetSystemMetrics(SM_CYSCREEN);
HMONITOR hMon = MonitorFromWindow(GetForegroundWindow(), MONITOR_DEFAULTTONEAREST);
MONITORINFO mi;
mi.cbSize = sizeof(mi);
- if (GetMonitorInfo(hMon, &mi))
+ if (GetMonitorInfoW(hMon, &mi))
rcScreen = mi.rcMonitor;
HWND hWndDesktop = GetDesktopWindow();
@@ -362,11 +368,8 @@ MIR_CORE_DLL(BOOL) OS_GetDisplayString(char *buf, size_t bufSize)
ret.AppendFormat(" (build %d)", osvi.dwBuildNumber);
- HMODULE hNtDll = GetModuleHandleA("ntdll.dll");
- if (WGV wine_get_version = (WGV)GetProcAddress(hNtDll, "wine_get_version"))
- {
+ if (WGV wine_get_version = (WGV)GetProcAddress(g_hNtdll, "wine_get_version"))
ret.AppendFormat(" (Wine %s)", wine_get_version());
- }
mir_strncpy(buf, ret, bufSize);
return true;
diff --git a/src/mir_core/src/mir_core.def b/src/mir_core/src/mir_core.def
index 2c91438bee..f0ce0a70db 100644
--- a/src/mir_core/src/mir_core.def
+++ b/src/mir_core/src/mir_core.def
@@ -1589,3 +1589,4 @@ _db_event_delivered@8 @1806 NONAME
??6MBinBuffer@@QAEAAV0@_K@Z @1814 NONAME
_Utils_IsoToUnixTime@4 @1815 NONAME
?db_event_setJson@@YGHIPBD@Z @1816 NONAME
+_IsWine@0 @1817 NONAME
diff --git a/src/mir_core/src/mir_core64.def b/src/mir_core/src/mir_core64.def
index 2f83d9c0b0..935c5d83cb 100644
--- a/src/mir_core/src/mir_core64.def
+++ b/src/mir_core/src/mir_core64.def
@@ -1589,3 +1589,4 @@ db_event_delivered @1806 NONAME
??6MBinBuffer@@QEAAAEAV0@_K@Z @1814 NONAME
Utils_IsoToUnixTime @1815 NONAME
?db_event_setJson@@YAHIPEBD@Z @1816 NONAME
+IsWine @1817 NONAME
diff --git a/src/mir_core/src/miranda.h b/src/mir_core/src/miranda.h
index c76d55c2c6..cedf24e528 100644
--- a/src/mir_core/src/miranda.h
+++ b/src/mir_core/src/miranda.h
@@ -31,7 +31,7 @@ void DestroyModularEngine(void);
int InitPathUtils(void);
-extern HINSTANCE g_hInst;
+extern HINSTANCE g_hInst, g_hNtdll;
extern HWND hAPCWindow;
extern HANDLE hThreadQueueEmpty;
extern HCURSOR g_hCursorNS, g_hCursorWE;