forked from ycccccccy/echotrace
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.cpp
More file actions
109 lines (95 loc) · 3.07 KB
/
main.cpp
File metadata and controls
109 lines (95 loc) · 3.07 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#include <flutter/dart_project.h>
#include <flutter/flutter_view_controller.h>
#include <windows.h>
#include <shellapi.h>
#include <string>
#include "flutter_window.h"
#include "utils.h"
int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev,
_In_ wchar_t *command_line, _In_ int show_command) {
auto set_current_directory_to_executable = []() {
wchar_t path[MAX_PATH];
const DWORD length = ::GetModuleFileNameW(nullptr, path, MAX_PATH);
if (length == 0 || length == MAX_PATH) {
return;
}
std::wstring full_path(path, length);
const size_t last_slash = full_path.find_last_of(L"\\/");
if (last_slash == std::wstring::npos) {
return;
}
const std::wstring exe_dir = full_path.substr(0, last_slash);
::SetCurrentDirectoryW(exe_dir.c_str());
};
set_current_directory_to_executable();
std::vector<std::string> command_line_arguments;
int argc = 0;
wchar_t** argv = ::CommandLineToArgvW(::GetCommandLineW(), &argc);
if (argv != nullptr) {
for (int i = 1; i < argc; i++) {
command_line_arguments.push_back(Utf8FromUtf16(argv[i]));
}
::LocalFree(argv);
}
auto has_cli_flag = [&command_line_arguments]() {
for (const auto& arg : command_line_arguments) {
if (arg == "-e" || arg == "--export" || arg == "-export") {
return true;
}
}
return false;
};
const bool cliMode = has_cli_flag();
if (cliMode) {
// CLI: force attach/create console and redirect output
bool consoleAttached = AttachToParentConsole();
if (!consoleAttached) {
CreateAndAttachConsole();
consoleAttached = true;
}
if (consoleAttached) {
printf("EchoTrace Windows runner detected CLI flags, launching in console mode...\n");
fflush(stdout);
}
// Handle console signals for CLI (Ctrl+C/close)
SetConsoleCtrlHandler(
[](DWORD ctrlType) -> BOOL {
switch (ctrlType) {
case CTRL_C_EVENT:
case CTRL_BREAK_EVENT:
case CTRL_CLOSE_EVENT:
case CTRL_LOGOFF_EVENT:
case CTRL_SHUTDOWN_EVENT:
PostQuitMessage(0);
return TRUE;
default:
return FALSE;
}
},
TRUE);
} else {
// Non-CLI: keep default behavior, create console when debugging
if (!::AttachConsole(ATTACH_PARENT_PROCESS) && ::IsDebuggerPresent()) {
CreateAndAttachConsole();
}
}
// Initialize COM, so that it is available for use in the library and/or
// plugins.
::CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED);
flutter::DartProject project(L"data");
project.set_dart_entrypoint_arguments(std::move(command_line_arguments));
FlutterWindow window(project);
Win32Window::Point origin(10, 10);
Win32Window::Size size(1280, 720);
if (!window.Create(L"echotrace", origin, size)) {
return EXIT_FAILURE;
}
window.SetQuitOnClose(true);
::MSG msg;
while (::GetMessage(&msg, nullptr, 0, 0)) {
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
::CoUninitialize();
return EXIT_SUCCESS;
}