aboutsummaryrefslogtreecommitdiff
path: root/Src/auth/Loginbox/loginGui.cpp
diff options
context:
space:
mode:
authorJef <jef@targetspot.com>2024-09-24 08:54:57 -0400
committerJef <jef@targetspot.com>2024-09-24 08:54:57 -0400
commit20d28e80a5c861a9d5f449ea911ab75b4f37ad0d (patch)
tree12f17f78986871dd2cfb0a56e5e93b545c1ae0d0 /Src/auth/Loginbox/loginGui.cpp
parent537bcbc86291b32fc04ae4133ce4d7cac8ebe9a7 (diff)
downloadwinamp-20d28e80a5c861a9d5f449ea911ab75b4f37ad0d.tar.gz
Initial community commit
Diffstat (limited to 'Src/auth/Loginbox/loginGui.cpp')
-rw-r--r--Src/auth/Loginbox/loginGui.cpp277
1 files changed, 277 insertions, 0 deletions
diff --git a/Src/auth/Loginbox/loginGui.cpp b/Src/auth/Loginbox/loginGui.cpp
new file mode 100644
index 00000000..7ca17ddc
--- /dev/null
+++ b/Src/auth/Loginbox/loginGui.cpp
@@ -0,0 +1,277 @@
+#include "./loginGui.h"
+#include "./common.h"
+#include "./imageLoader.h"
+
+#include "../resource.h"
+#include "../api.h"
+
+#include <strsafe.h>
+
+static size_t threadStorage = TLS_OUT_OF_INDEXES;
+
+LoginGuiObject::LoginGuiObject()
+: ref(1), bitmapIcons(NULL), fontTitle(NULL), fontEditor(NULL), fontText(NULL)
+{
+}
+
+LoginGuiObject::~LoginGuiObject()
+{
+ Reset();
+}
+
+HRESULT LoginGuiObject::InitializeThread()
+{
+
+ if (TLS_OUT_OF_INDEXES == threadStorage)
+ {
+ if (NULL == WASABI_API_APP)
+ return E_UNEXPECTED;
+
+ threadStorage = WASABI_API_APP->AllocateThreadStorage();
+ if (TLS_OUT_OF_INDEXES == threadStorage)
+ return E_UNEXPECTED;
+ }
+
+ LoginGuiObject *cache = (LoginGuiObject*)WASABI_API_APP->GetThreadStorage(threadStorage);
+ if (NULL != cache)
+ {
+ cache->AddRef();
+ return S_FALSE;
+ }
+
+ if (NULL == cache)
+ {
+ cache = new LoginGuiObject();
+ if (NULL == cache) return E_OUTOFMEMORY;
+ WASABI_API_APP->SetThreadStorage(threadStorage, cache);
+ }
+
+ return S_OK;
+}
+
+HRESULT LoginGuiObject::UninitializeThread()
+{
+ if (TLS_OUT_OF_INDEXES == threadStorage)
+ return E_FAIL;
+
+ if (NULL == WASABI_API_APP)
+ return E_UNEXPECTED;
+
+ LoginGuiObject *cache = (LoginGuiObject*)WASABI_API_APP->GetThreadStorage(threadStorage);
+ if (NULL != cache && 0 == cache->Release())
+ WASABI_API_APP->SetThreadStorage(threadStorage, NULL);
+
+ return S_OK;
+}
+
+HRESULT LoginGuiObject::QueryInstance(LoginGuiObject **instance)
+{
+ if (NULL == instance)
+ return E_POINTER;
+
+ if (TLS_OUT_OF_INDEXES == threadStorage)
+ return E_UNEXPECTED;
+
+ *instance = (LoginGuiObject*)WASABI_API_APP->GetThreadStorage(threadStorage);
+ if (NULL == *instance) return E_FAIL;
+ (*instance)->AddRef();
+
+ return S_OK;
+}
+
+ULONG LoginGuiObject::AddRef()
+{
+ return InterlockedIncrement((LONG*)&ref);
+}
+
+ULONG LoginGuiObject::Release()
+{
+ if (0 == ref)
+ return ref;
+
+ LONG r = InterlockedDecrement((LONG*)&ref);
+ if (0 == r)
+ delete(this);
+
+ return r;
+}
+
+HRESULT LoginGuiObject::Reset()
+{
+ if (NULL != bitmapIcons)
+ {
+ DeleteObject(bitmapIcons);
+ bitmapIcons = NULL;
+ }
+
+ if (NULL != fontTitle)
+ {
+ DeleteObject(fontTitle);
+ fontTitle = NULL;
+ }
+
+ if (NULL != fontEditor)
+ {
+ DeleteObject(fontEditor);
+ fontEditor = NULL;
+ }
+
+ if (NULL != fontText)
+ {
+ DeleteObject(fontText);
+ fontText = NULL;
+ }
+
+ return S_OK;
+}
+
+HRESULT LoginGuiObject::GetIconDimensions(INT *pWidth, INT *pHeight)
+{
+ if (NULL == bitmapIcons)
+ {
+ INT width, height;
+ bitmapIcons = ImageLoader_LoadBitmap(WASABI_API_ORIG_HINST, MAKEINTRESOURCE(IDR_NOTIFIERICONS_IMAGE),
+ TRUE, &width, &height);
+
+ if (NULL == bitmapIcons)
+ return E_FAIL;
+
+ if (height < 0) height = -height;
+
+ if (NULL != pWidth) *pWidth = width;
+ if (NULL != pHeight) *pHeight = width;
+
+ return S_OK;
+ }
+
+ BITMAP bm;
+ if (sizeof(bm) != GetObject(bitmapIcons, sizeof(bm), &bm))
+ return E_FAIL;
+
+ if (NULL != pWidth) *pWidth = bm.bmWidth;
+ if (NULL != pHeight) *pHeight = bm.bmWidth;
+
+ return S_OK;
+}
+
+HBITMAP LoginGuiObject::GetIcon(INT iconId, RECT *prcIcon)
+{
+ if (NULL == prcIcon || iconId < 0)
+ return NULL;
+
+ INT width, height;
+
+ if (NULL != bitmapIcons)
+ {
+ BITMAP bm;
+ if (sizeof(bm) != GetObject(bitmapIcons, sizeof(bm), &bm))
+ bitmapIcons = NULL;
+ else
+ {
+ width = bm.bmWidth;
+ height = bm.bmHeight;
+ }
+ }
+
+ if (NULL == bitmapIcons)
+ {
+ bitmapIcons = ImageLoader_LoadBitmap(WASABI_API_ORIG_HINST, MAKEINTRESOURCE(IDR_NOTIFIERICONS_IMAGE),
+ TRUE, &width, &height);
+
+ if (NULL == bitmapIcons)
+ return NULL;
+ }
+
+ if (height < 0) height = -height;
+
+ if (width * (iconId + 1) > height)
+ return NULL;
+
+ prcIcon->left = 0;
+ prcIcon->right = width;
+ prcIcon->top = width * iconId;
+ prcIcon->bottom = prcIcon->top + width;
+
+ return bitmapIcons;
+}
+
+
+static HFONT LoginGuiObject_DuplicateFont(HFONT fontBase, INT heightDeltaPt)
+{
+ if (NULL == fontBase) return NULL;
+
+ LOGFONT lf;
+ if (sizeof(lf) != GetObject(fontBase, sizeof(lf), &lf))
+ return NULL;
+
+ if (0 != heightDeltaPt)
+ {
+ HDC hdc = GetDCEx(NULL, NULL, DCX_WINDOW | DCX_CACHE | DCX_NORESETATTRS);
+ HDC hdcTmp = NULL;
+
+ if (NULL != hdc)
+ {
+ hdcTmp = CreateCompatibleDC(hdc);
+ ReleaseDC(NULL, hdc);
+ }
+
+ if (NULL == hdcTmp)
+ return NULL;
+
+ LONG pixelsY = GetDeviceCaps (hdcTmp, LOGPIXELSY);
+ HFONT fontOrig = (HFONT)SelectObject(hdcTmp, fontBase);
+
+ TEXTMETRIC tm;
+ if (FALSE != GetTextMetrics(hdcTmp, &tm))
+ {
+ INT basePt = MulDiv(tm.tmHeight - tm.tmInternalLeading, 72, pixelsY);
+ lf.lfHeight = -MulDiv((basePt + heightDeltaPt), pixelsY, 72);
+
+ }
+
+ SelectObject(hdcTmp, fontOrig);
+ DeleteDC(hdcTmp);
+ }
+
+ return CreateFontIndirect(&lf);
+}
+
+HFONT LoginGuiObject::GetTitleFont()
+{
+ if (NULL == fontTitle)
+ {
+ HFONT fontBase = GetTextFont();
+ if (NULL != fontBase)
+ {
+ fontTitle = LoginGuiObject_DuplicateFont(fontBase, 3);
+ }
+ }
+ return fontTitle;
+}
+
+HFONT LoginGuiObject::GetEditorFont()
+{
+ if (NULL == fontEditor)
+ {
+ HFONT fontBase = GetTextFont();
+ if (NULL != fontBase)
+ {
+ fontEditor = LoginGuiObject_DuplicateFont(fontBase, 0);
+ }
+ }
+ return fontEditor;
+}
+
+HFONT LoginGuiObject::GetTextFont()
+{
+ if (NULL == fontText)
+ {
+ LOGFONT lf;
+ if (FALSE != SystemParametersInfo(SPI_GETICONTITLELOGFONT, sizeof(lf), &lf, 0))
+ {
+ lf.lfQuality = LoginBox_GetSysFontQuality();
+ fontText = CreateFontIndirect(&lf);
+ }
+ }
+ return fontText;
+}