# HG changeset patch # User Paper # Date 1718866985 14400 # Node ID adb79bdde32967933ba498f9aa65b1c1e8e37af1 # Parent 052ec053ee37f3b9166a71aa89df418a48d82316 dep/animone: fix tons of issues for example, the window ID stuff was just... completely wrong. since we're supporting multiple different window systems, it *has* to be a union rather than just a single integer type. HWND is also not a DWORD, it's a pointer(!), so now it's stored as a std::uintptr_t. (this probably breaks things) diff -r 052ec053ee37 -r adb79bdde329 configure.ac --- a/configure.ac Wed Jun 19 23:21:19 2024 -0400 +++ b/configure.ac Thu Jun 20 03:03:05 2024 -0400 @@ -100,6 +100,8 @@ dnl Check for windres AC_CHECK_TOOL([WINDRES], [windres]) AC_SUBST([WINDRES]) + + AC_DEFINE([ANIMONE_STATIC], [1], [stupid windows thing]) elif test "x$build_osx" = "xyes"; then AC_DEFINE([MACOSX]) else diff -r 052ec053ee37 -r adb79bdde329 dep/animone/Makefile.am --- a/dep/animone/Makefile.am Wed Jun 19 23:21:19 2024 -0400 +++ b/dep/animone/Makefile.am Thu Jun 20 03:03:05 2024 -0400 @@ -29,7 +29,7 @@ if BUILD_WIN files_win = src/a11y/win32.cc src/fd/win32.cc src/win/win32.cc src/util/win32.cc -libs_win = -lole32 -luuid +libs_win = -lole32 -loleaut32 -luuid endif if BUILD_OSX @@ -83,8 +83,8 @@ libanimone_la_CPPFLAGS = -I$(top_srcdir)/include $(DEFS) libanimone_la_CXXFLAGS = -std=c++17 $(cflags_osx) $(cflags_x11) $(cflags_wayland) -libanimone_la_LDFLAGS = -version-info 0:0:0 $(ldflags_osx) +libanimone_la_LDFLAGS = -no-undefined -version-info 0:0:0 $(ldflags_osx) -libanimone_la_LIBADD = $(libs_win) $(libs_wayland) $(libs_x11) $(libs_osx) $(libs_libutil) $(libs_libkvm) +libanimone_la_LIBADD = $(libs_win) $(libs_wayland) $(libs_x11) $(libs_osx) $(libs_freebsd) $(libs_openbsd) ACLOCAL_AMFLAGS = -I m4 diff -r 052ec053ee37 -r adb79bdde329 dep/animone/configure.ac --- a/dep/animone/configure.ac Wed Jun 19 23:21:19 2024 -0400 +++ b/dep/animone/configure.ac Thu Jun 20 03:03:05 2024 -0400 @@ -1,4 +1,4 @@ -AC_INIT([animone], [2.0.0]) +AC_INIT([animone], [0.2.0]) AC_CANONICAL_HOST @@ -12,7 +12,7 @@ AC_PROG_CXX AM_PROG_AR -LT_INIT +LT_INIT([win32-dll]) build_win32=no build_osx=no @@ -70,7 +70,6 @@ AM_CONDITIONAL([BUILD_LINUX], [test "x$build_linux" = "xyes"]) AM_CONDITIONAL([BUILD_FREEBSD], [test "x$build_libutil" = "xyes"]) AM_CONDITIONAL([BUILD_OPENBSD], [test "x$build_kvm" = "xyes"]) -AM_CONDITIONAL([BUILD_BSD], [test "x$build_bsd" = "xyes"]) AM_CONDITIONAL([BUILD_XCB], [test "x$build_x11" = "xyes"]) diff -r 052ec053ee37 -r adb79bdde329 dep/animone/include/animone.h --- a/dep/animone/include/animone.h Wed Jun 19 23:21:19 2024 -0400 +++ b/dep/animone/include/animone.h Thu Jun 20 03:03:05 2024 -0400 @@ -9,27 +9,27 @@ namespace animone { -struct Process { +struct ANIMONE_API Process { internal::pid_t pid = 0; /* platform-dependent PID */ ExecutablePlatform platform = ExecutablePlatform::Unknown; /* platform of the executable */ std::string comm; /* the full filename of the executable */ }; -struct Window { - std::uint32_t id = 0; /* platform-dependent window id */ +struct ANIMONE_API Window { + internal::wid_t id = {0}; /* union of window IDs. depends on the platform which one is correct */ WindowPlatform platform = WindowPlatform::Unknown; /* platform of the window */ std::string class_name; /* class name on win32 and x11, bundle ID on macos */ std::string text; /* title bar text if available */ }; -struct Result { +struct ANIMONE_API Result { Player player; Process process; Window window; /* has nothing under process mode */ std::vector media; }; -bool GetResults(const std::vector& players, std::vector& results); +ANIMONE_API bool GetResults(const std::vector& players, std::vector& results); } // namespace animone diff -r 052ec053ee37 -r adb79bdde329 dep/animone/include/animone/media.h --- a/dep/animone/include/animone/media.h Wed Jun 19 23:21:19 2024 -0400 +++ b/dep/animone/include/animone/media.h Thu Jun 20 03:03:05 2024 -0400 @@ -1,6 +1,8 @@ #ifndef ANIMONE_ANIMONE_MEDIA_H_ #define ANIMONE_ANIMONE_MEDIA_H_ +#include "animone/types.h" + #include #include #include @@ -19,12 +21,12 @@ Url }; -struct MediaInfo { +struct ANIMONE_API MediaInfo { MediaInfoType type = MediaInfoType::Unknown; std::string value; }; -struct Media { +struct ANIMONE_API Media { std::vector information; }; diff -r 052ec053ee37 -r adb79bdde329 dep/animone/include/animone/player.h --- a/dep/animone/include/animone/player.h Wed Jun 19 23:21:19 2024 -0400 +++ b/dep/animone/include/animone/player.h Thu Jun 20 03:03:05 2024 -0400 @@ -1,6 +1,8 @@ #ifndef ANIMONE_ANIMONE_PLAYER_H_ #define ANIMONE_ANIMONE_PLAYER_H_ +#include "animone/types.h" + #include #include #include @@ -32,7 +34,7 @@ WebBrowser // unused }; -struct Player { +struct ANIMONE_API Player { PlayerType type = PlayerType::Default; std::string name; std::string window_title_format; @@ -41,8 +43,8 @@ std::vector strategies; }; -bool ParsePlayersData(const std::string& data, std::vector& players); -bool ParsePlayersFile(const std::string& path, std::vector& players); +ANIMONE_API bool ParsePlayersData(const std::string& data, std::vector& players); +ANIMONE_API bool ParsePlayersFile(const std::string& path, std::vector& players); } // namespace animone diff -r 052ec053ee37 -r adb79bdde329 dep/animone/include/animone/types.h --- a/dep/animone/include/animone/types.h Wed Jun 19 23:21:19 2024 -0400 +++ b/dep/animone/include/animone/types.h Thu Jun 20 03:03:05 2024 -0400 @@ -1,20 +1,43 @@ #ifndef ANIMONE_ANIMONE_TYPES_H_ #define ANIMONE_ANIMONE_TYPES_H_ -/* define this as unsigned long (DWORD) on win32 so we - * don't force the user to include or */ -#ifdef _WIN32 -# include +#include + +/* windows is so annoying */ +#ifdef ANIMONE_STATIC +# define ANIMONE_API +#else +# ifdef _WIN32 +# ifdef DLL_EXPORT +# define ANIMONE_API __declspec(dllexport) +# else +# define ANIMONE_API __declspec(dllimport) +# endif +# else +# define ANIMONE_API +# endif +#endif + +/* FIXME configure this in autoconf */ +#ifndef _WIN32 +#include +#endif namespace animone::internal { + +#ifdef _WIN32 using pid_t = std::uint32_t; -} #else -/* shouldn't be that big, right? */ -# include -namespace animone::internal { using pid_t = ::pid_t; -} #endif +/* different window systems have different sized IDs */ +union ANIMONE_API wid_t { + std::uintptr_t win32; + std::int64_t quartz; // FIXME is this correct? + std::uint32_t x11; +}; + +} + #endif // ANIMONE_ANIMONE_TYPES_H_ diff -r 052ec053ee37 -r adb79bdde329 dep/animone/include/animone/util/win32.h --- a/dep/animone/include/animone/util/win32.h Wed Jun 19 23:21:19 2024 -0400 +++ b/dep/animone/include/animone/util/win32.h Thu Jun 20 03:03:05 2024 -0400 @@ -23,10 +23,6 @@ std::string ToUtf8String(const UNICODE_STRING& string); std::wstring ToWstring(const std::string& string); -/* XXX can this stuff be moved to fd/win32.cc? */ -bool IsSystemDirectory(const std::string& path); -bool IsSystemDirectory(std::wstring path); - } // namespace animone::internal::win32 #endif // ANIMONE_ANIMONE_UTIL_WIN32_H_ \ No newline at end of file diff -r 052ec053ee37 -r adb79bdde329 dep/animone/src/a11y/win32.cc --- a/dep/animone/src/a11y/win32.cc Wed Jun 19 23:21:19 2024 -0400 +++ b/dep/animone/src/a11y/win32.cc Thu Jun 20 03:03:05 2024 -0400 @@ -1,12 +1,14 @@ #include #include #include +#include #include #include #include "animone/a11y.h" #include "animone/a11y/win32.h" +#include "animone/util/win32.h" namespace animone::internal::win32 { @@ -25,9 +27,9 @@ template struct ComInterfaceDeleter { - static_assert(std::is_base_of::value, "Invalid COM interface"); - using pointer = T*; - void operator()(pointer p) const { if (p) p->Release(); } + static_assert(std::is_base_of::value, "Invalid COM interface"); + using pointer = T*; + void operator()(pointer p) const { if (p) p->Release(); } }; template @@ -234,7 +236,7 @@ if (!InitializeUIAutomation()) return false; - ComInterface parent(GetElementFromHandle(hwnd)); + ComInterface parent(GetElementFromHandle(reinterpret_cast(window.id.win32))); if (!parent) return false; diff -r 052ec053ee37 -r adb79bdde329 dep/animone/src/fd/win32.cc --- a/dep/animone/src/fd/win32.cc Wed Jun 19 23:21:19 2024 -0400 +++ b/dep/animone/src/fd/win32.cc Thu Jun 20 03:03:05 2024 -0400 @@ -12,6 +12,7 @@ * then they're pretty much forced to keeping this the same anyway. */ #include "animone/fd/win32.h" +#include "animone/util.h" #include "animone.h" #include "animone/util/win32.h" @@ -19,6 +20,7 @@ #include #include #include +#include #include #include @@ -141,19 +143,9 @@ /* ------------------------------------------------------------------- */ static bool GetSystemDirectory(std::wstring& str) { - PWSTR path_wch; - - if (FAILED(::SHGetFolderPathW(NULL, CSIDL_WINDOWS, NULL, SHGFP_TYPE_CURRENT, &path_wch))) - return false; - - str.assign(path_wch); + str.assign(MAX_PATH, '\0'); - ::CoTaskMemFree(path_wch); - return true; -} - -static bool IsSystemDirectory(const std::string& path) { - return IsSystemDirectory(ToWstring(path)); + return SUCCEEDED(::SHGetFolderPathW(NULL, CSIDL_WINDOWS, NULL, SHGFP_TYPE_CURRENT, &str.front())); } static bool IsSystemDirectory(std::wstring path) { @@ -168,6 +160,10 @@ return path.find(windir) == 4; } +static bool IsSystemDirectory(const std::string& path) { + return IsSystemDirectory(ToWstring(path)); +} + static bool IsFileHandle(HANDLE handle, unsigned short object_type_index) { /* this is filled in at runtime because it's not guaranteed to be (and isn't) * constant between different versions of Windows */ @@ -179,7 +175,7 @@ /* XXX what? */ return true; } else if (GetHandleType(handle) == L"File") { - file_type_index.reset(object_type_index); + file_type_index = object_type_index; return true; } @@ -212,7 +208,7 @@ /* ------------------------------------------------------------------- */ -static std::string GetProcessPath(DWORD process_id) { +static bool GetProcessPath(DWORD process_id, std::string& path) { // If we try to open a SYSTEM process, this function fails and the last error // code is ERROR_ACCESS_DENIED. // @@ -222,7 +218,7 @@ Handle process_handle(::OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, process_id)); if (!process_handle) - return std::wstring(); + return false; std::wstring buffer(MAX_PATH, L'\0'); DWORD buf_size = buffer.length(); @@ -230,14 +226,15 @@ // Note that this function requires Windows Vista or above. You may use // GetProcessImageFileName or GetModuleFileNameEx on earlier versions. if (!::QueryFullProcessImageNameW(process_handle.get(), 0, &buffer.front(), &buf_size)) - return std::wstring(); + return false; buffer.resize(buf_size); - return ToUtf8String(buffer); + path = ToUtf8String(buffer); + return true; } static std::string GetFilenameFromPath(const std::string& path) { - const auto pos = path.find_last_of(L"/\\"); + const auto pos = path.find_last_of("/\\"); return pos != std::wstring::npos ? path.substr(pos + 1) : path; } @@ -270,11 +267,10 @@ /* extern functions */ bool GetProcessName(pid_t pid, std::string& name) { - std::string path = GetProcessPath(pid); - if (path.empty() || !VerifyProcessPath(path)) + if (!GetProcessPath(pid, name) || !VerifyProcessPath(name)) return false; - name = GetFilenameFromPath(path); + name = GetFilenameFromPath(name); if (!VerifyProcessFilename(name)) return false; @@ -297,7 +293,7 @@ if (!GetProcessName(pe32.th32ProcessID, name)) continue; - if (!process_proc({.platform = ExecutablePlatform::Win32, .pid = pe32.th32ProcessID, .comm = name})) + if (!process_proc({.pid = pe32.th32ProcessID, .platform = ExecutablePlatform::Win32, .comm = name})) return false; } while (::Process32Next(process_snap.get(), &pe32)); diff -r 052ec053ee37 -r adb79bdde329 dep/animone/src/win/quartz.cc --- a/dep/animone/src/win/quartz.cc Wed Jun 19 23:21:19 2024 -0400 +++ b/dep/animone/src/win/quartz.cc Thu Jun 20 03:03:05 2024 -0400 @@ -272,7 +272,7 @@ Window win; win.platform = WindowPlatform::Quartz; - CFDictionaryGetValue(window, CFSTR("kCGWindowNumber"), win.id); + CFDictionaryGetValue(window, CFSTR("kCGWindowNumber"), win.id.quartz); GetProcessBundleIdentifier(proc.pid, win.class_name); GetWindowTitle(win.id, proc.pid, win.text); diff -r 052ec053ee37 -r adb79bdde329 dep/animone/src/win/win32.cc --- a/dep/animone/src/win/win32.cc Wed Jun 19 23:21:19 2024 -0400 +++ b/dep/animone/src/win/win32.cc Thu Jun 20 03:03:05 2024 -0400 @@ -63,8 +63,8 @@ return true; } -static bool VerifyClassName(const std::wstring& name) { - static const std::set invalid_names = { +static bool VerifyClassName(const std::string& name) { + static const std::set invalid_names = { // System classes "#32770", // Dialog box "CabinetWClass", // Windows Explorer @@ -93,7 +93,7 @@ Window window; window.platform = WindowPlatform::Win32; - window.id = static_cast(reinterpret_cast(hwnd)); + window.id.win32 = reinterpret_cast(hwnd); window.text = ToUtf8String(GetWindowText(hwnd)); window.class_name = ToUtf8String(GetWindowClassName(hwnd)); if (!VerifyClassName(window.class_name)) diff -r 052ec053ee37 -r adb79bdde329 dep/animone/src/win/x11.cc --- a/dep/animone/src/win/x11.cc Wed Jun 19 23:21:19 2024 -0400 +++ b/dep/animone/src/win/x11.cc Thu Jun 20 03:03:05 2024 -0400 @@ -238,7 +238,7 @@ for (const auto& window_cookie : window_cookies) { Window win; - win.id = window_cookie.window; + win.id.x11 = window_cookie.window; { /* Class name */ XcbPtr reply(::xcb_get_property_reply(connection, window_cookie.class_name, NULL)); diff -r 052ec053ee37 -r adb79bdde329 dep/anitomy/configure.ac --- a/dep/anitomy/configure.ac Wed Jun 19 23:21:19 2024 -0400 +++ b/dep/anitomy/configure.ac Thu Jun 20 03:03:05 2024 -0400 @@ -12,7 +12,7 @@ # Need this because libtool is weird AM_PROG_AR -LT_INIT +LT_INIT([win32-dll]) AC_CONFIG_FILES([Makefile]) AC_OUTPUT \ No newline at end of file diff -r 052ec053ee37 -r adb79bdde329 dep/pugixml/configure.ac --- a/dep/pugixml/configure.ac Wed Jun 19 23:21:19 2024 -0400 +++ b/dep/pugixml/configure.ac Thu Jun 20 03:03:05 2024 -0400 @@ -12,7 +12,7 @@ # Need this because libtool is weird AM_PROG_AR -LT_INIT +LT_INIT([win32-dll]) AC_CONFIG_FILES([Makefile]) AC_OUTPUT diff -r 052ec053ee37 -r adb79bdde329 rc/sys/win32/dark/dark.qss --- a/rc/sys/win32/dark/dark.qss Wed Jun 19 23:21:19 2024 -0400 +++ b/rc/sys/win32/dark/dark.qss Thu Jun 20 03:03:05 2024 -0400 @@ -82,7 +82,7 @@ border-left: 0.04em solid #808080; border-right: 0.04em solid #808080; border-top: 0.04em solid #808080; - background-color: #353535; + background-color: #191919; min-width: 50px; padding-top: 0.23em; padding-bottom: 0.23em; @@ -95,7 +95,7 @@ QTabBar::tab:top:!selected { color: white; - background-color: #353535; + background-color: #191919; border: 0.04em solid #808080; border-radius: 0.09em; border-bottom-left-radius: 0em; @@ -104,13 +104,13 @@ } QTabBar::tab:top:next-selected { - border-right: 0.04em transparent #353535; + border-right: 0.04em transparent #191919; border-bottom-left-radius: 0em; border-bottom-right-radius: 0em; } QTabBar::tab:top:previous-selected { - border-left: 0.04em transparent #353535; + border-left: 0.04em transparent #191919; border-bottom-left-radius: 0em; border-bottom-right-radius: 0em; }