Created
July 21, 2025 06:11
-
-
Save i8degrees/b86bb66b8dca42d3bdf522bf2ed2a23b to your computer and use it in GitHub Desktop.
wxWidgets Singleton Example
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* Copyright (C) 2023 - 2024 Vadym Hrynchyshyn <[email protected]> | |
*/ | |
#include "app.h" | |
#include "utils.h" | |
#include "wusbip.h" | |
#include <libusbip/src/file_ver.h> | |
using namespace usbip; | |
App::App() | |
{ | |
Bind(wxEVT_END_SESSION, &App::on_end_session, this); | |
} | |
bool App::OnInit() | |
{ | |
/* wxString app_instance = */ | |
auto app_instance = wxString::Format(wxT("my_app_instance_%s"), | |
wxGetUserId().c_str()); | |
// 1. https://docs.wxwidgets.org/3.0/classwx_single_instance_checker.html# | |
m_checker = new wxSingleInstanceChecker(app_instance); | |
if (m_checker->IsAnotherRunning()) { | |
wxLogError(wxT("Another instance is already running.")); | |
return false; // Don't start a new instance | |
} | |
if (wxApp::OnInit()) { | |
set_names(); | |
} else { | |
return false; | |
} | |
wxString err; | |
if (auto read = init(err) ? vhci::open() : Handle()) { | |
if (auto &frame = *new MainFrame(std::move(read)); frame.start_in_tray()) { | |
frame.iconize_to_tray(); | |
} else { | |
frame.Show(); | |
} | |
return true; | |
} | |
if (err.empty()) { | |
err = GetLastErrorMsg(); | |
} | |
wxSafeShowMessage(_("Fatal error"), err); | |
return false; | |
} | |
void App::set_names() | |
{ | |
auto &v = win::get_file_version(); | |
SetAppName(wx_string(v.GetProductName())); | |
SetVendorName(wx_string(v.GetCompanyName())); | |
} | |
/* | |
* wxEVT_CLOSE_WINDOW will not be sent to MainFrame, but m_read_thread must be joined. | |
* @see MainFrame::on_close | |
*/ | |
void App::on_end_session(_In_ wxCloseEvent&) | |
{ | |
if (auto wnd = GetMainTopWindow()) { | |
wnd->Close(true); | |
} | |
} | |
bool App::OnExit() | |
{ | |
delete m_checker; | |
return false; // 0 | |
} | |
wxIMPLEMENT_APP(App); |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* Copyright (C) 2023 - 2024 Vadym Hrynchyshyn <[email protected]> | |
*/ | |
#pragma once | |
#include <wx/app.h> | |
#include <wx/singleinst.h> | |
#include <wx/log.h> | |
class App : public wxApp | |
{ | |
public: | |
App(); | |
bool OnInit() override; | |
// 1. https://docs.wxwidgets.org/3.0/classwx_single_instance_checker.html# | |
bool OnExit() override; | |
private: | |
void set_names(); | |
void on_end_session(_In_ wxCloseEvent &event); | |
// 1. https://docs.wxwidgets.org/3.0/classwx_single_instance_checker.html# | |
wxSingleInstanceChecker *m_checker; | |
}; | |
wxDECLARE_APP(App); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment