Release v0.6.49: Viber chat language profiles with local OCR

This commit is contained in:
agrynco committed 2026-11-05 23:52:50 +02:00
1 parent 4e7a683c47
commit 178573233b
15 files changed
+181 -63

No files matched your search

+20 -4
View File
@@ -963,7 +963,7 @@ void App::refreshChatContext()
HWND target = GetForegroundWindow();
chatWindow = target;
activeChatTitle = chatTitle(target);
activeChat = settings.chatCycles.empty() ? L"" : chatKey(processName(target), activeChatTitle);
activeChat = settings.chatCycles.empty() ? L"" : windowChatKey(target);
}
void App::switchChatLayout(bool reverse)
{
@@ -974,10 +974,11 @@ void App::switchChatLayout(bool reverse)
auto cycle = chatCycle(settings, key, layouts);
auto available = layouts;
resetInput();
enqueue([this, target, key, cycle, available, reverse]
enqueue([this, target, key, cycle, available, reverse, options = settings]
{
struct Reset { std::atomic<bool> &busy; ~Reset() { busy = false; } } reset{busy};
auto valid = [&] { return GetForegroundWindow() == target && windowChatKey(target) == key; };
if (key.starts_with(L"viber\n") && recognizeViberChat(target, options) != key) return;
if (!valid()) return;
auto next = nextChatLayout(cycle, available, windowLayout(target), reverse);
if (next) switchWindowLayout(target, next, valid);
@@ -1258,9 +1259,8 @@ void App::transform(int command, int snippet)
version = inputVersion;
}
const auto requestedChat = config.chatCycles.empty() ? L"" : windowChatKey(target);
config.cycle = chatCycle(config, requestedChat, available);
enqueue(
[this, target, recent, previous, config, available, version, command, snippet, attempt, manual, requestedAt, preDeferred]
[this, target, recent, previous, config, available, version, command, snippet, attempt, manual, requestedAt, preDeferred, requestedChat]() mutable
{
struct BusyReset
{
@@ -1275,6 +1275,10 @@ void App::transform(int command, int snippet)
b = false;
}
} reset{busy, window, preDeferred};
auto effectiveChat = requestedChat;
if (lower(processName(target)) == L"viber")
effectiveChat = recognizeViberChat(target, config);
config.cycle = chatCycle(config, effectiveChat, available);
auto start = GetTickCount64();
std::wstring reason = L"cancelled-before-selection";
std::wstring text, result, expected, actual, verification = L"not-attempted";
@@ -2178,6 +2182,17 @@ LRESULT CALLBACK App::windowProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
return TRUE;
}
case WM_TIMER:
if (wp == 7)
{
static std::atomic<bool> pending{false};
auto target = GetForegroundWindow();
if (!app->settings.chatCycles.empty() && lower(processName(target)) == L"viber" && !pending.exchange(true))
{
auto options = app->settings;
app->enqueue([target, options] { recognizeViberChat(target, options); pending = false; });
}
return 0;
}
if (wp == 6)
{
if (app->notificationRegistration && WaitForSingleObject(app->notificationRegistration, 0) == WAIT_OBJECT_0)
@@ -2318,6 +2333,7 @@ int App::execute()
scheduleHistoryOcr(settings);
addTray();
SetTimer(window, 1, 60000, nullptr);
if (!smoke) SetTimer(window, 7, 750, nullptr);
if (!smoke) SetTimer(window, 6, 1000, nullptr);
SetThreadExecutionState(ES_CONTINUOUS |
(settings.awake ? (ES_DISPLAY_REQUIRED | ES_SYSTEM_REQUIRED) : 0));