Skip to content

Commit b18181d

Browse files
committed
refactor: use C++23 "Deducing this" and modularize mini_gzip build
We replace recursive `std::function` usage in `src/iaccessible.cc` with C++23's explicit object parameter ("Deducing `this`"), which eliminates type erasure overhead and heap allocations associated with `std::function`. We change `find_hit_button(top)` to `TraversalAccessible(top, find_hit_button, false)`, since `top` cannot be `ROLE_SYSTEM_PUSHBUTTON` so that we can just skip that check. We also remove direct inclusion of `.c` files in `src/pakfile.cc` to fix compilation issues with `clang-cl` under C++23. `mini_gzip` is now a static library compiled in C.
1 parent 6906add commit b18181d

4 files changed

Lines changed: 30 additions & 28 deletions

File tree

mini_gzip

src/iaccessible.cc

Lines changed: 19 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,10 @@
44

55
#include <oleacc.h>
66

7-
#include <functional>
87
#include <memory>
98
#include <optional>
109
#include <string>
1110
#include <string_view>
12-
#include <thread>
1311
#include <vector>
1412

1513
#include "config.h"
@@ -495,8 +493,8 @@ bool IsOnNewTab(const NodePtr& top) {
495493
// Whether the mouse is on a bookmark.
496494
bool IsOnBookmark(HWND hwnd, POINT pt) {
497495
bool flag = false;
498-
std::function<bool(const NodePtr&)> LambdaEnumChild =
499-
[&pt, &flag, &LambdaEnumChild](const NodePtr& child) -> bool {
496+
auto find_bookmark = [&pt, &flag](this auto&& self,
497+
const NodePtr& child) -> bool {
500498
auto role = GetAccessibleRole(child);
501499
if (role == ROLE_SYSTEM_PUSHBUTTON || role == ROLE_SYSTEM_MENUITEM) {
502500
bool is_in_rect = false;
@@ -517,19 +515,19 @@ bool IsOnBookmark(HWND hwnd, POINT pt) {
517515
}
518516
}
519517
// traverse the child nodes.
520-
TraversalAccessible(child, LambdaEnumChild);
518+
TraversalAccessible(child, self);
521519
return flag;
522520
};
523521
// Start traversing.
524-
TraversalAccessible(GetChromeWidgetWin(hwnd), LambdaEnumChild);
522+
TraversalAccessible(GetChromeWidgetWin(hwnd), find_bookmark);
525523
return flag;
526524
}
527525

528526
// Expanded drop-down list in the address bar
529527
bool IsOnExpandedList(HWND hwnd, POINT pt) {
530528
bool flag = false;
531-
std::function<bool(const NodePtr&)> LambdaEnumChild =
532-
[&pt, &flag, &LambdaEnumChild](const NodePtr& child) -> bool {
529+
auto find_drop_down_list = [&pt, &flag](this auto&& self,
530+
const NodePtr& child) -> bool {
533531
if (GetAccessibleRole(child) == ROLE_SYSTEM_LIST &&
534532
(GetAccessibleState(child) & STATE_SYSTEM_EXPANDED)) {
535533
GetAccessibleSize(child, [&flag, &pt](RECT rect) {
@@ -541,10 +539,10 @@ bool IsOnExpandedList(HWND hwnd, POINT pt) {
541539
return true;
542540
}
543541
}
544-
TraversalAccessible(child, LambdaEnumChild);
542+
TraversalAccessible(child, self);
545543
return flag;
546544
};
547-
TraversalAccessible(GetChromeWidgetWin(hwnd), LambdaEnumChild);
545+
TraversalAccessible(GetChromeWidgetWin(hwnd), find_drop_down_list);
548546
return flag;
549547
}
550548

@@ -554,27 +552,26 @@ bool IsOmniboxFocus(const NodePtr& top) {
554552
}
555553

556554
bool is_focused = false;
557-
std::function<bool(const NodePtr&)> find_focused =
558-
[&is_focused, &find_focused](const NodePtr& node) -> bool {
555+
auto find_focused = [&is_focused](this auto&& self,
556+
const NodePtr& node) -> bool {
559557
if (GetAccessibleRole(node) == ROLE_SYSTEM_TEXT &&
560558
(GetAccessibleState(node) & STATE_SYSTEM_FOCUSED)) {
561559
is_focused = true;
562560
return true;
563561
}
564-
TraversalAccessible(node, find_focused, false);
562+
TraversalAccessible(node, self, false);
565563
return is_focused;
566564
};
567565

568-
std::function<bool(const NodePtr&)> find_toolbar =
569-
[&](const NodePtr& node) -> bool {
566+
auto find_toolbar = [&](this auto&& self, const NodePtr& node) -> bool {
570567
if (GetAccessibleRole(node) == ROLE_SYSTEM_TOOLBAR) {
571568
find_focused(node);
572569
if (is_focused) {
573570
return true;
574571
}
575572
return false;
576573
}
577-
TraversalAccessible(node, find_toolbar, false);
574+
TraversalAccessible(node, self, false);
578575

579576
return is_focused;
580577
};
@@ -590,8 +587,7 @@ bool IsOnCloseButton(const NodePtr& top, POINT pt) {
590587
}
591588

592589
bool found = false;
593-
std::function<bool(const NodePtr&)> find_hit_button =
594-
[&](const NodePtr& node) -> bool {
590+
auto find_hit_button = [&](this auto&& self, const NodePtr& node) -> bool {
595591
if (GetAccessibleRole(node) == ROLE_SYSTEM_PUSHBUTTON) {
596592
GetAccessibleSize(node, [&](RECT rect) {
597593
if (PtInRect(&rect, pt)) {
@@ -602,10 +598,10 @@ bool IsOnCloseButton(const NodePtr& top, POINT pt) {
602598
return true;
603599
}
604600
}
605-
TraversalAccessible(node, find_hit_button);
601+
TraversalAccessible(node, self);
606602
return found;
607603
};
608-
find_hit_button(top);
604+
TraversalAccessible(top, find_hit_button, false);
609605
return found;
610606
}
611607

@@ -625,14 +621,14 @@ bool IsOnFindBarPane(POINT pt) {
625621
// └─ PANE
626622
// └─ PANE
627623
// └─ TEXT (focused, the input field of find-in-page bar)
628-
std::function<bool(const NodePtr&)> find_focused =
629-
[&text_element, &find_focused](const NodePtr& node) -> bool {
624+
auto find_focused = [&text_element](this auto&& self,
625+
const NodePtr& node) -> bool {
630626
if (GetAccessibleRole(node) == ROLE_SYSTEM_TEXT &&
631627
(GetAccessibleState(node) & STATE_SYSTEM_FOCUSED)) {
632628
text_element = node;
633629
return true;
634630
}
635-
TraversalAccessible(node, find_focused, false);
631+
TraversalAccessible(node, self, false);
636632
return text_element != nullptr;
637633
};
638634
TraversalAccessible(root, find_focused, false);

src/pakfile.cc

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,10 @@
1515
#pragma warning(disable : 4838)
1616

1717
extern "C" {
18-
#include "..\mini_gzip\miniz.c" // Must be included first
19-
20-
#include "..\mini_gzip\mini_gzip.c"
2118
#include "..\mini_gzip\mini_gzip.h"
19+
void* gzip_compress(uint8_t* data, size_t len, size_t* out_len);
20+
int mini_gz_start(struct mini_gzip* gz_ptr, const void* mem, size_t mem_len);
21+
int mini_gz_unpack(struct mini_gzip* gz_ptr, void* mem_out, size_t mem_out_len);
2222
}
2323

2424
namespace {

xmake.lua

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ set_warnings("more")
44

55
add_defines("WIN32", "_WIN32", "UNICODE", "_UNICODE")
66
set_encodings("source:utf-8")
7-
set_languages("c++20")
7+
set_languages("c++23")
88
set_fpmodels("precise") -- Default
99
if is_mode("release") then
1010
set_exceptions("none")
@@ -44,11 +44,17 @@ target("detours")
4444
add_files("detours/src/disolarm64.cpp")
4545
end
4646

47+
target("mini_gzip")
48+
set_kind("static")
49+
add_includedirs("mini_gzip", {public = true})
50+
add_files("mini_gzip/miniz.c", "mini_gzip/mini_gzip.c")
51+
4752
target("chrome_plus")
4853
set_kind("shared")
4954
set_targetdir("$(builddir)/$(mode)")
5055
set_basename("version")
5156
add_deps("detours")
57+
add_deps("mini_gzip")
5258
add_files("src/*.cc")
5359
add_files("src/*.rc")
5460
add_links("onecore", "propsys", "oleacc")

0 commit comments

Comments
 (0)