# HG changeset patch # User Paper # Date 1701708690 18000 # Node ID bc8d2ccff09ceae9244573c46849fed899e950fb # Parent 122fad646f81a33fcd1df03d2943f9a1b075a81d win32/dark: use existing STL classes for dwmapi diff -r 122fad646f81 -r bc8d2ccff09c .clang-format --- a/.clang-format Fri Dec 01 13:32:29 2023 -0500 +++ b/.clang-format Mon Dec 04 11:51:30 2023 -0500 @@ -29,4 +29,4 @@ --- Language: Cpp -Standard: Cpp11 +Standard: Cpp17 diff -r 122fad646f81 -r bc8d2ccff09c include/core/strings.h --- a/include/core/strings.h Fri Dec 01 13:32:29 2023 -0500 +++ b/include/core/strings.h Mon Dec 04 11:51:30 2023 -0500 @@ -53,7 +53,7 @@ } else if constexpr (std::is_unsigned::value) { return clamp(std::stoull(str), std::numeric_limits::max(), std::numeric_limits::max()); } else { - throw std::invalid_argument("it no worky"); + throw std::invalid_argument("Invalid input to Strings::ToInt()!"); } } catch (std::invalid_argument const& ex) { return def; diff -r 122fad646f81 -r bc8d2ccff09c src/core/anime.cc --- a/src/core/anime.cc Fri Dec 01 13:32:29 2023 -0500 +++ b/src/core/anime.cc Mon Dec 04 11:51:30 2023 -0500 @@ -5,9 +5,8 @@ #include "core/anime.h" #include "core/date.h" #include "core/session.h" + #include -#include -#include #include #include diff -r 122fad646f81 -r bc8d2ccff09c src/gui/pages/anime_list.cc --- a/src/gui/pages/anime_list.cc Fri Dec 01 13:32:29 2023 -0500 +++ b/src/gui/pages/anime_list.cc Mon Dec 04 11:51:30 2023 -0500 @@ -17,6 +17,7 @@ #include "gui/dialog/information.h" #include "gui/translate/anime.h" #include "services/services.h" + #include #include #include @@ -27,6 +28,7 @@ #include #include #include + #include AnimeListPageSortFilter::AnimeListPageSortFilter(QObject* parent) : QSortFilterProxyModel(parent) { @@ -342,8 +344,8 @@ void AnimeListPage::RefreshTabs() { for (unsigned int i = 0; i < sort_models.size(); i++) - tab_bar->setTabText(i, Strings::ToQString(Translate::ToString(Anime::ListStatuses[i])) + " (" + - QString::number(Anime::db.GetListsAnimeAmount(Anime::ListStatuses[i])) + ")"); + tab_bar->setTabText(i, Strings::ToQString(Translate::ToString(Anime::ListStatuses[i]) + " (" + + std::to_string(Anime::db.GetListsAnimeAmount(Anime::ListStatuses[i])) + ")")); } void AnimeListPage::Refresh() { diff -r 122fad646f81 -r bc8d2ccff09c src/gui/pages/now_playing.cc --- a/src/gui/pages/now_playing.cc Fri Dec 01 13:32:29 2023 -0500 +++ b/src/gui/pages/now_playing.cc Mon Dec 04 11:51:30 2023 -0500 @@ -4,6 +4,7 @@ #include "gui/widgets/anime_info.h" #include "gui/widgets/text.h" #include "gui/widgets/poster.h" + #include #include #include diff -r 122fad646f81 -r bc8d2ccff09c src/gui/pages/statistics.cc --- a/src/gui/pages/statistics.cc Fri Dec 01 13:32:29 2023 -0500 +++ b/src/gui/pages/statistics.cc Mon Dec 04 11:51:30 2023 -0500 @@ -4,12 +4,14 @@ #include "gui/pages/anime_list.h" #include "gui/widgets/text.h" #include "gui/widgets/graph.h" + #include #include #include #include #include #include + #include StatisticsPage::StatisticsPage(QWidget* parent) : QFrame(parent) { diff -r 122fad646f81 -r bc8d2ccff09c src/gui/pages/torrents.cc --- a/src/gui/pages/torrents.cc Fri Dec 01 13:32:29 2023 -0500 +++ b/src/gui/pages/torrents.cc Mon Dec 04 11:51:30 2023 -0500 @@ -4,7 +4,7 @@ #include "core/session.h" #include "gui/widgets/text.h" #include "track/media.h" -#include "pugixml.hpp" + #include #include #include @@ -13,10 +13,12 @@ #include #include #include + #include #include #include +#include "pugixml.hpp" #include "anitomy/anitomy.h" /* This file is very, very similar to the anime list page. diff -r 122fad646f81 -r bc8d2ccff09c src/sys/win32/dark_theme.cc --- a/src/sys/win32/dark_theme.cc Fri Dec 01 13:32:29 2023 -0500 +++ b/src/sys/win32/dark_theme.cc Mon Dec 04 11:51:30 2023 -0500 @@ -1,84 +1,62 @@ #include "sys/win32/dark_theme.h" + #include -#include #include #include #include + #include +#include + #include -/* let's make a class wrapper around HINSTANCE, - so we don't fuck anything up :). */ -class Library { - public: - Library() {} - ~Library() { - Unload(); - } - void Unload() { - if (hInstance) { - FreeLibrary(hInstance); - hInstance = nullptr; - } - loaded = false; - } - void Load(LPCWSTR name) { - if (loaded) - Unload(); - hInstance = LoadLibraryW(name); - if (hInstance) - loaded = true; - } - HINSTANCE GetInstance() { - return hInstance; - } - bool IsLoaded() { - return loaded; - } - private: - HINSTANCE hInstance = nullptr; - bool loaded = false; +struct LibraryDeconstructor { + using pointer = HINSTANCE; + void operator()(pointer t) const { ::FreeLibrary(t); }; }; -Library dwmapi; +using Library = std::unique_ptr; + +class Dwmapi { + public: + Dwmapi() { library.reset( ::LoadLibraryW(L"dwmapi.dll")); } + + HRESULT SetWindowAttribute(HWND hWnd, DWORD key, LPCVOID data, DWORD sz_data) { + if (!library.get()) + return E_POINTER; + + /* GCC throws a fit here because C/C++ lacks a "generic" function pointer type. + Ignore. */ + auto set_wind_attrib = reinterpret_cast(GetProcAddress(library.get(), "DwmSetWindowAttribute")); + if (!set_wind_attrib) + return E_POINTER; + + return set_wind_attrib(hWnd, key, data, sz_data); + } + + protected: + Library library = nullptr; +}; + +Dwmapi dwmapi; namespace win32 { -#define GET_FUNCTION(f, i) \ - reinterpret_cast(GetProcAddress(i, #f)) - -static HRESULT SetWindowAttribute(HWND hWnd, DWORD key, LPCVOID data, DWORD sz_data) { - if (!dwmapi.IsLoaded()) { - dwmapi.Load(L"dwmapi.dll"); - if (!dwmapi.IsLoaded()) - return false; - } - - HINSTANCE hInstance = dwmapi.GetInstance(); - if (!hInstance) - return false; - - auto set_wind_attrib = GET_FUNCTION(DwmSetWindowAttribute, hInstance); - if (!set_wind_attrib) - return false; - - return set_wind_attrib(hWnd, key, data, sz_data); -} - +/* NOTE: explicit conversion from builtin `bool` and win32 `BOOL` IS allowed. */ bool SetTitleBarToBlack(QWidget* win, bool enabled) { BOOL b = enabled; /* MAGIC NUMBERS: 19 and 20 are both DWMWA_USE_IMMERSIVE_DARK_MODE. - clarification: it's 20 on newer versions of windows (i.e. win11 and late win10), - but it's 19 on very old versions of win10 nobody ought to be using. */ + For clarification: it's 20 on newer versions of windows (i.e. win11 and late win10), + but it's 19 on very old versions of win10 nobody ought to be using anymore. */ { - HRESULT result = SetWindowAttribute(reinterpret_cast(win->winId()), 20, &b, sizeof(b)); + HRESULT result = dwmapi.SetWindowAttribute(reinterpret_cast(win->winId()), 20, &b, sizeof(b)); if (result == S_OK) return b; } { - HRESULT result = SetWindowAttribute(reinterpret_cast(win->winId()), 19, &b, sizeof(b)); + HRESULT result = dwmapi.SetWindowAttribute(reinterpret_cast(win->winId()), 19, &b, sizeof(b)); if (result == S_OK) return b; }