global variables name

This commit is contained in:
Enrico Giordani
2019-10-03 10:34:16 +02:00
committed by Enrico Giordani
parent 799ac545a2
commit 7a94ee04c8

View File

@@ -34,8 +34,8 @@ using namespace winrt::Windows::System;
HINSTANCE g_hinst; HINSTANCE g_hinst;
HWND g_main_wnd = nullptr; HWND g_main_wnd = nullptr;
WebViewControl webview_control = nullptr; WebViewControl g_webview = nullptr;
WebViewControlProcess webview_process = nullptr; WebViewControlProcess g_webview_process = nullptr;
StreamUriResolverFromFile local_uri_resolver; StreamUriResolverFromFile local_uri_resolver;
// Windows message for receiving copied data to send to the webview. // Windows message for receiving copied data to send to the webview.
@@ -46,30 +46,30 @@ UINT wm_data_for_webview = 0;
// - WebView confirms that the Window can close. // - WebView confirms that the Window can close.
UINT wm_destroy_window = 0; UINT wm_destroy_window = 0;
// mutex for checking if the window has already been created. // Mutex for checking if the window has already been created.
std::mutex m_window_created_mutex; std::mutex g_window_created;
TwoWayPipeMessageIPC* current_settings_ipc = nullptr; TwoWayPipeMessageIPC* current_settings_ipc = nullptr;
// Set to true if waiting for webview confirmation before closing the Window. // Set to true if waiting for webview confirmation before closing the Window.
bool m_waiting_for_close_confirmation = false; bool g_waiting_for_close_confirmation = false;
#ifdef _DEBUG #ifdef _DEBUG
void NavigateToLocalhostReactServer() { void NavigateToLocalhostReactServer() {
// Useful for connecting to instance running in react development server. // Useful for connecting to instance running in react development server.
webview_control.Navigate(Uri(hstring(L"http://localhost:8080"))); g_webview.Navigate(Uri(hstring(L"http://localhost:8080")));
} }
#endif #endif
const std::wstring uriContentId = L"\\settings-html"; #define URI_CONTENT_ID L"\\settings-html"
void NavigateToUri(_In_ LPCWSTR uri_as_string) { void NavigateToUri(_In_ LPCWSTR uri_as_string) {
// initialize the base_path for the html content relative to the executable. // initialize the base_path for the html content relative to the executable.
GetModuleFileName(nullptr, local_uri_resolver.base_path, MAX_PATH); GetModuleFileName(nullptr, local_uri_resolver.base_path, MAX_PATH);
PathRemoveFileSpec(local_uri_resolver.base_path); PathRemoveFileSpec(local_uri_resolver.base_path);
wcscat_s(local_uri_resolver.base_path, uriContentId.c_str()); wcscat_s(local_uri_resolver.base_path, URI_CONTENT_ID);
Uri url = webview_control.BuildLocalStreamUri(hstring(uriContentId), hstring(uri_as_string)); Uri url = g_webview.BuildLocalStreamUri(hstring(URI_CONTENT_ID), hstring(uri_as_string));
webview_control.NavigateToLocalStreamUri(url, local_uri_resolver); g_webview.NavigateToLocalStreamUri(url, local_uri_resolver);
} }
Rect client_rect_to_bounds_rect(_In_ HWND hwnd) { Rect client_rect_to_bounds_rect(_In_ HWND hwnd) {
@@ -89,7 +89,7 @@ Rect client_rect_to_bounds_rect(_In_ HWND hwnd) {
void resize_web_view() { void resize_web_view() {
Rect bounds = client_rect_to_bounds_rect(g_main_wnd); Rect bounds = client_rect_to_bounds_rect(g_main_wnd);
IWebViewControlSite webViewControlSite = (IWebViewControlSite) webview_control; IWebViewControlSite webViewControlSite = (IWebViewControlSite) g_webview;
webViewControlSite.Bounds(bounds); webViewControlSite.Bounds(bounds);
} }
@@ -100,7 +100,7 @@ void send_message_to_webview(const std::wstring& msg) {
if (g_main_wnd != nullptr && wm_data_for_webview != 0) { if (g_main_wnd != nullptr && wm_data_for_webview != 0) {
// Allocate the COPYDATASTRUCT and message to pass to the Webview. // Allocate the COPYDATASTRUCT and message to pass to the Webview.
// This is needed in order to use PostMessage, since COM calls to // This is needed in order to use PostMessage, since COM calls to
// webview_control.InvokeScriptAsync can't be made from other threads. // g_webview.InvokeScriptAsync can't be made from other threads.
PCOPYDATASTRUCT message = new COPYDATASTRUCT(); PCOPYDATASTRUCT message = new COPYDATASTRUCT();
DWORD buff_size = (DWORD)(msg.length() + 1); DWORD buff_size = (DWORD)(msg.length() + 1);
@@ -199,42 +199,42 @@ void receive_message_from_webview(const std::wstring& msg) {
PostMessage(g_main_wnd, wm_destroy_window, 0, 0); PostMessage(g_main_wnd, wm_destroy_window, 0, 0);
} else if (msg == L"cancel-exit") { } else if (msg == L"cancel-exit") {
// WebView canceled the exit request. // WebView canceled the exit request.
m_waiting_for_close_confirmation = false; g_waiting_for_close_confirmation = false;
} }
} }
} }
void initialize_webview(HWND hwnd, int nCmdShow) { void initialize_webview(HWND hwnd, int nCmdShow) {
try { try {
if (!webview_process) { if (!g_webview_process) {
webview_process = WebViewControlProcess(); g_webview_process = WebViewControlProcess();
} }
auto asyncwebview = webview_process.CreateWebViewControlAsync((int64_t)g_main_wnd, client_rect_to_bounds_rect(g_main_wnd)); auto asyncwebview = g_webview_process.CreateWebViewControlAsync((int64_t)g_main_wnd, client_rect_to_bounds_rect(g_main_wnd));
asyncwebview.Completed([=](IAsyncOperation<WebViewControl> const& sender, AsyncStatus args) { asyncwebview.Completed([=](IAsyncOperation<WebViewControl> const& sender, AsyncStatus args) {
webview_control = sender.GetResults(); g_webview = sender.GetResults();
// In order to receive window.external.notify() calls in ScriptNotify // In order to receive window.external.notify() calls in ScriptNotify
webview_control.Settings().IsScriptNotifyAllowed(true); g_webview.Settings().IsScriptNotifyAllowed(true);
webview_control.Settings().IsJavaScriptEnabled(true); g_webview.Settings().IsJavaScriptEnabled(true);
webview_control.NewWindowRequested([=](IWebViewControl sender_requester, WebViewControlNewWindowRequestedEventArgs args ) { g_webview.NewWindowRequested([=](IWebViewControl sender_requester, WebViewControlNewWindowRequestedEventArgs args ) {
// Open the requested link in the default browser registered in the Shell // Open the requested link in the default browser registered in the Shell
ShellExecute(nullptr, L"open", args.Uri().AbsoluteUri().c_str(), nullptr, nullptr, SW_SHOWNORMAL); ShellExecute(nullptr, L"open", args.Uri().AbsoluteUri().c_str(), nullptr, nullptr, SW_SHOWNORMAL);
}); });
webview_control.DOMContentLoaded([=](IWebViewControl sender_loaded, WebViewControlDOMContentLoadedEventArgs const& args_loaded) { g_webview.DOMContentLoaded([=](IWebViewControl sender_loaded, WebViewControlDOMContentLoadedEventArgs const& args_loaded) {
// runs when the content has been loaded. // runs when the content has been loaded.
}); });
webview_control.ScriptNotify([=](IWebViewControl sender_script_notify, WebViewControlScriptNotifyEventArgs const& args_script_notify) { g_webview.ScriptNotify([=](IWebViewControl sender_script_notify, WebViewControlScriptNotifyEventArgs const& args_script_notify) {
// content called window.external.notify() // content called window.external.notify()
std::wstring message_sent = args_script_notify.Value().c_str(); std::wstring message_sent = args_script_notify.Value().c_str();
receive_message_from_webview(message_sent); receive_message_from_webview(message_sent);
}); });
webview_control.AcceleratorKeyPressed([&](IWebViewControl sender, WebViewControlAcceleratorKeyPressedEventArgs const& args) { g_webview.AcceleratorKeyPressed([&](IWebViewControl sender, WebViewControlAcceleratorKeyPressedEventArgs const& args) {
if (args.VirtualKey() == winrt::Windows::System::VirtualKey::F4) { if (args.VirtualKey() == winrt::Windows::System::VirtualKey::F4) {
// WebView swallows key-events. Detect Alt-F4 one and close the window manually. // WebView swallows key-events. Detect Alt-F4 one and close the window manually.
const auto _ = webview_control.InvokeScriptAsync(hstring(L"exit_settings_app"), {}); const auto _ = g_webview.InvokeScriptAsync(hstring(L"exit_settings_app"), {});
} }
}); });
resize_web_view(); resize_web_view();
@@ -258,15 +258,15 @@ void initialize_webview(HWND hwnd, int nCmdShow) {
LRESULT CALLBACK wnd_proc_static(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { LRESULT CALLBACK wnd_proc_static(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
switch (message) { switch (message) {
case WM_CLOSE: case WM_CLOSE:
if(m_waiting_for_close_confirmation) { if(g_waiting_for_close_confirmation) {
// If another WM_CLOSE is received while waiting for webview confirmation, // If another WM_CLOSE is received while waiting for webview confirmation,
// allow DefWindowProc to be called and destroy the window. // allow DefWindowProc to be called and destroy the window.
break; break;
} else { } else {
// Allow user to confirm exit in the WebView in case there's possible data loss. // Allow user to confirm exit in the WebView in case there's possible data loss.
m_waiting_for_close_confirmation = true; g_waiting_for_close_confirmation = true;
if (webview_control != nullptr) { if (g_webview != nullptr) {
const auto _ = webview_control.InvokeScriptAsync(hstring(L"exit_settings_app"), {}); const auto _ = g_webview.InvokeScriptAsync(hstring(L"exit_settings_app"), {});
} else { } else {
break; break;
} }
@@ -276,14 +276,14 @@ LRESULT CALLBACK wnd_proc_static(HWND hWnd, UINT message, WPARAM wParam, LPARAM
PostQuitMessage(0); PostQuitMessage(0);
break; break;
case WM_SIZE: case WM_SIZE:
if (webview_control != nullptr) { if (g_webview != nullptr) {
resize_web_view(); resize_web_view();
} }
break; break;
case WM_CREATE: case WM_CREATE:
wm_data_for_webview = RegisterWindowMessageW(L"PTSettingsCopyDataWebView"); wm_data_for_webview = RegisterWindowMessageW(L"PTSettingsCopyDataWebView");
wm_destroy_window = RegisterWindowMessageW(L"PTSettingsParentTerminated"); wm_destroy_window = RegisterWindowMessageW(L"PTSettingsParentTerminated");
m_window_created_mutex.unlock(); g_window_created.unlock();
break; break;
case WM_DPICHANGED: case WM_DPICHANGED:
{ {
@@ -309,8 +309,8 @@ LRESULT CALLBACK wnd_proc_static(HWND hWnd, UINT message, WPARAM wParam, LPARAM
PCOPYDATASTRUCT msg = (PCOPYDATASTRUCT)lParam; PCOPYDATASTRUCT msg = (PCOPYDATASTRUCT)lParam;
if (msg->dwData == SEND_TO_WEBVIEW_MSG) { if (msg->dwData == SEND_TO_WEBVIEW_MSG) {
wchar_t* json_message = (wchar_t*)(msg->lpData); wchar_t* json_message = (wchar_t*)(msg->lpData);
if (webview_control != nullptr) { if (g_webview != nullptr) {
const auto _ = webview_control.InvokeScriptAsync(hstring(L"receive_from_settings_app"), { hstring(json_message) }); const auto _ = g_webview.InvokeScriptAsync(hstring(L"receive_from_settings_app"), { hstring(json_message) });
} }
delete[] json_message; delete[] json_message;
} }
@@ -383,7 +383,7 @@ void wait_on_parent_process_thread(DWORD pid) {
CloseHandle(process); CloseHandle(process);
{ {
// Send a terminated message only after the window has finished initializing. // Send a terminated message only after the window has finished initializing.
std::unique_lock lock(m_window_created_mutex); std::unique_lock lock(g_window_created);
} }
PostMessage(g_main_wnd, wm_destroy_window, 0, 0); PostMessage(g_main_wnd, wm_destroy_window, 0, 0);
} else { } else {
@@ -422,7 +422,7 @@ void read_arguments() {
int start_webview_window(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) { int start_webview_window(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) {
// To be unlocked after the Window has finished being created. // To be unlocked after the Window has finished being created.
m_window_created_mutex.lock(); g_window_created.lock();
read_arguments(); read_arguments();
register_classes(hInstance); register_classes(hInstance);
init_instance(hInstance, nShowCmd); init_instance(hInstance, nShowCmd);