instance check - bug fixes and refactoring based on code review.
This commit is contained in:
parent
0974d2a0e6
commit
8ea4b5fd78
1 changed files with 21 additions and 16 deletions
|
@ -64,21 +64,26 @@ namespace instance_check_internal
|
||||||
//BOOST_LOG_TRIVIAL(error) << "ewp: version: " << l_version_wstring;
|
//BOOST_LOG_TRIVIAL(error) << "ewp: version: " << l_version_wstring;
|
||||||
TCHAR wndText[1000];
|
TCHAR wndText[1000];
|
||||||
TCHAR className[1000];
|
TCHAR className[1000];
|
||||||
GetClassName(hwnd, className, 1000);
|
int err;
|
||||||
GetWindowText(hwnd, wndText, 1000);
|
err = GetClassName(hwnd, className, 1000);
|
||||||
|
if (err == 0)
|
||||||
|
return true;
|
||||||
|
err = GetWindowText(hwnd, wndText, 1000);
|
||||||
|
if (err == 0)
|
||||||
|
return true;
|
||||||
std::wstring classNameString(className);
|
std::wstring classNameString(className);
|
||||||
std::wstring wndTextString(wndText);
|
std::wstring wndTextString(wndText);
|
||||||
if (wndTextString.find(L"PrusaSlicer") != std::wstring::npos && classNameString == L"wxWindowNR") {
|
if (wndTextString.find(L"PrusaSlicer") == 0 && classNameString == L"wxWindowNR") {
|
||||||
//check if other instances has same instance hash
|
//check if other instances has same instance hash
|
||||||
//if not it is not same version(binary) as this version
|
//if not it is not same version(binary) as this version
|
||||||
HANDLE handle = GetProp(hwnd, L"Instance_Hash_Minor");
|
HANDLE handle = GetProp(hwnd, L"Instance_Hash_Minor");
|
||||||
size_t other_instance_hash = PtrToUint(handle);
|
unsigned long long other_instance_hash = PtrToUint(handle);
|
||||||
size_t other_instance_hash_major;
|
unsigned long long other_instance_hash_major;
|
||||||
|
unsigned long long my_instance_hash = GUI::wxGetApp().get_instance_hash_int();
|
||||||
handle = GetProp(hwnd, L"Instance_Hash_Major");
|
handle = GetProp(hwnd, L"Instance_Hash_Major");
|
||||||
other_instance_hash_major = PtrToUint(handle);
|
other_instance_hash_major = PtrToUint(handle);
|
||||||
other_instance_hash_major = other_instance_hash_major << 32;
|
other_instance_hash_major = other_instance_hash_major << 32;
|
||||||
other_instance_hash += other_instance_hash_major;
|
other_instance_hash += other_instance_hash_major;
|
||||||
size_t my_instance_hash = GUI::wxGetApp().get_instance_hash_int();
|
|
||||||
if(my_instance_hash == other_instance_hash)
|
if(my_instance_hash == other_instance_hash)
|
||||||
{
|
{
|
||||||
BOOST_LOG_TRIVIAL(debug) << "win enum - found correct instance";
|
BOOST_LOG_TRIVIAL(debug) << "win enum - found correct instance";
|
||||||
|
@ -95,19 +100,19 @@ namespace instance_check_internal
|
||||||
{
|
{
|
||||||
if (!EnumWindows(EnumWindowsProc, 0)) {
|
if (!EnumWindows(EnumWindowsProc, 0)) {
|
||||||
std::wstring wstr = boost::nowide::widen(message);
|
std::wstring wstr = boost::nowide::widen(message);
|
||||||
//LPWSTR command_line_args = wstr.c_str();//GetCommandLine();
|
std::unique_ptr<LPWSTR> command_line_args = std::make_unique<LPWSTR>(const_cast<LPWSTR>(wstr.c_str()));
|
||||||
LPWSTR command_line_args = new wchar_t[wstr.size() + 1];
|
/*LPWSTR command_line_args = new wchar_t[wstr.size() + 1];
|
||||||
copy(wstr.begin(), wstr.end(), command_line_args);
|
copy(wstr.begin(), wstr.end(), command_line_args);
|
||||||
command_line_args[wstr.size()] = 0;
|
command_line_args[wstr.size()] = 0;*/
|
||||||
|
|
||||||
//Create a COPYDATASTRUCT to send the information
|
//Create a COPYDATASTRUCT to send the information
|
||||||
//cbData represents the size of the information we want to send.
|
//cbData represents the size of the information we want to send.
|
||||||
//lpData represents the information we want to send.
|
//lpData represents the information we want to send.
|
||||||
//dwData is an ID defined by us(this is a type of ID different than WM_COPYDATA).
|
//dwData is an ID defined by us(this is a type of ID different than WM_COPYDATA).
|
||||||
COPYDATASTRUCT data_to_send = { 0 };
|
COPYDATASTRUCT data_to_send = { 0 };
|
||||||
data_to_send.dwData = 1;
|
data_to_send.dwData = 1;
|
||||||
data_to_send.cbData = sizeof(TCHAR) * (wcslen(command_line_args) + 1);
|
data_to_send.cbData = sizeof(TCHAR) * (wcslen(*command_line_args.get()) + 1);
|
||||||
data_to_send.lpData = command_line_args;
|
data_to_send.lpData = *command_line_args.get();
|
||||||
|
|
||||||
SendMessage(l_prusa_slicer_hwnd, WM_COPYDATA, 0, (LPARAM)&data_to_send);
|
SendMessage(l_prusa_slicer_hwnd, WM_COPYDATA, 0, (LPARAM)&data_to_send);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -242,7 +247,7 @@ bool instance_check(int argc, char** argv, bool app_config_single_instance)
|
||||||
GUI::wxGetApp().init_single_instance_checker(lock_name + ".lock", data_dir() + "/cache/");
|
GUI::wxGetApp().init_single_instance_checker(lock_name + ".lock", data_dir() + "/cache/");
|
||||||
if ((cla.should_send || app_config_single_instance) && GUI::wxGetApp().single_instance_checker()->IsAnotherRunning()) {
|
if ((cla.should_send || app_config_single_instance) && GUI::wxGetApp().single_instance_checker()->IsAnotherRunning()) {
|
||||||
#else // mac & linx
|
#else // mac & linx
|
||||||
if (instance_check_internal::get_lock(lock_name + ".lock", data_dir() + "/cache/") && (cla.should_send || app_config_single_instance)) {
|
if ((cla.should_send || app_config_single_instance) && instance_check_internal::get_lock(lock_name + ".lock", data_dir() + "/cache/")) {
|
||||||
#endif
|
#endif
|
||||||
instance_check_internal::send_message(cla.cl_string, lock_name);
|
instance_check_internal::send_message(cla.cl_string, lock_name);
|
||||||
BOOST_LOG_TRIVIAL(info) << "instance check: Another instance found. This instance will terminate.";
|
BOOST_LOG_TRIVIAL(info) << "instance check: Another instance found. This instance will terminate.";
|
||||||
|
@ -345,7 +350,7 @@ void OtherInstanceMessageHandler::print_window_info(HWND hwnd)
|
||||||
namespace MessageHandlerInternal
|
namespace MessageHandlerInternal
|
||||||
{
|
{
|
||||||
// returns ::path to possible model or empty ::path if input string is not existing path
|
// returns ::path to possible model or empty ::path if input string is not existing path
|
||||||
static boost::filesystem::path get_path(std::string possible_path)
|
static boost::filesystem::path get_path(const std::string& possible_path)
|
||||||
{
|
{
|
||||||
BOOST_LOG_TRIVIAL(debug) << "message part:" << possible_path;
|
BOOST_LOG_TRIVIAL(debug) << "message part:" << possible_path;
|
||||||
|
|
||||||
|
@ -434,7 +439,7 @@ namespace MessageHandlerDBusInternal
|
||||||
static void handle_method_another_instance(DBusConnection *connection, DBusMessage *request)
|
static void handle_method_another_instance(DBusConnection *connection, DBusMessage *request)
|
||||||
{
|
{
|
||||||
DBusError err;
|
DBusError err;
|
||||||
char* text= "";
|
char* text = nullptr;
|
||||||
wxEvtHandler* evt_handler;
|
wxEvtHandler* evt_handler;
|
||||||
|
|
||||||
dbus_error_init(&err);
|
dbus_error_init(&err);
|
||||||
|
|
Loading…
Reference in a new issue