wxEVT_CREATE and wxEVT_ACTIVATE is not being called on the main frame
on application start-up, at least not on Windows. wxEVT_CREATE was called for some control deep in the Plater, however the event was delivered to the main frame and only for slicer, not for G-code viewer. Thus the callbacks for 3D Mouse were not registered for and the 3D mouse did not work on Windows. Fixed by calling the callback registration from the first execution of the Idle function.
This commit is contained in:
parent
d7686d7e6a
commit
e0c5309bc3
6 changed files with 71 additions and 66 deletions
|
@ -588,9 +588,9 @@ int CLI::run(int argc, char **argv)
|
|||
// gui->autosave = m_config.opt_string("autosave");
|
||||
GUI::GUI_App::SetInstance(gui);
|
||||
#if ENABLE_GCODE_VIEWER
|
||||
gui->m_after_init_loads.set_params(load_configs, m_extra_config, m_input_files, start_as_gcodeviewer);
|
||||
gui->after_init_loads.set_params(load_configs, m_extra_config, m_input_files, start_as_gcodeviewer);
|
||||
#else
|
||||
gui->m_after_init_loads.set_params(load_configs, m_extra_config, m_input_files);
|
||||
gui->after_init_loads.set_params(load_configs, m_extra_config, m_input_files);
|
||||
#endif // ENABLE_GCODE_VIEWER
|
||||
/*
|
||||
#if ENABLE_GCODE_VIEWER
|
||||
|
|
|
@ -406,7 +406,7 @@ public:
|
|||
// set to an ObjectID of a Print or a PrintObject based on flags
|
||||
// (whether UPDATE_PRINT_STEP_WARNINGS or UPDATE_PRINT_OBJECT_STEP_WARNINGS is set).
|
||||
ObjectID warning_object_id;
|
||||
// For which Print or PrintObject step a new warning is beeing issued?
|
||||
// For which Print or PrintObject step a new warning is being issued?
|
||||
int warning_step { -1 };
|
||||
};
|
||||
typedef std::function<void(const SlicingStatus&)> status_callback_type;
|
||||
|
|
|
@ -533,7 +533,7 @@ static void generic_exception_handle()
|
|||
}
|
||||
}
|
||||
|
||||
void GUI_App::AFTER_INIT_LOADS::on_loads(GUI_App* gui)
|
||||
void GUI_App::AfterInitLoads::on_loads(GUI_App* gui)
|
||||
{
|
||||
if (!gui->initialized())
|
||||
return;
|
||||
|
@ -847,7 +847,10 @@ bool GUI_App::on_init_inner()
|
|||
static bool update_gui_after_init = true;
|
||||
if (update_gui_after_init) {
|
||||
update_gui_after_init = false;
|
||||
m_after_init_loads.on_loads(this);
|
||||
#ifdef WIN32
|
||||
this->mainframe->register_win32_callbacks();
|
||||
#endif
|
||||
this->after_init_loads.on_loads(this);
|
||||
}
|
||||
|
||||
// Preset updating & Configwizard are done after the above initializations,
|
||||
|
|
|
@ -143,7 +143,7 @@ private:
|
|||
size_t m_instance_hash_int;
|
||||
|
||||
// parameters needed for the after OnInit() loads
|
||||
struct AFTER_INIT_LOADS
|
||||
struct AfterInitLoads
|
||||
{
|
||||
std::vector<std::string> m_load_configs;
|
||||
DynamicPrintConfig m_extra_config;
|
||||
|
@ -272,7 +272,7 @@ public:
|
|||
PresetUpdater* preset_updater{ nullptr };
|
||||
MainFrame* mainframe{ nullptr };
|
||||
Plater* plater_{ nullptr };
|
||||
AFTER_INIT_LOADS m_after_init_loads;
|
||||
AfterInitLoads after_init_loads;
|
||||
|
||||
PresetUpdater* get_preset_updater() { return preset_updater; }
|
||||
|
||||
|
|
|
@ -217,65 +217,6 @@ DPIFrame(NULL, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_S
|
|||
update_title();
|
||||
|
||||
// declare events
|
||||
Bind(wxEVT_CREATE, [this](wxWindowCreateEvent& event) {
|
||||
|
||||
#ifdef _WIN32
|
||||
//static GUID GUID_DEVINTERFACE_USB_DEVICE = { 0xA5DCBF10, 0x6530, 0x11D2, 0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED };
|
||||
//static GUID GUID_DEVINTERFACE_DISK = { 0x53f56307, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b };
|
||||
//static GUID GUID_DEVINTERFACE_VOLUME = { 0x71a27cdd, 0x812a, 0x11d0, 0xbe, 0xc7, 0x08, 0x00, 0x2b, 0xe2, 0x09, 0x2f };
|
||||
static GUID GUID_DEVINTERFACE_HID = { 0x4D1E55B2, 0xF16F, 0x11CF, 0x88, 0xCB, 0x00, 0x11, 0x11, 0x00, 0x00, 0x30 };
|
||||
|
||||
// Register USB HID (Human Interface Devices) notifications to trigger the 3DConnexion enumeration.
|
||||
DEV_BROADCAST_DEVICEINTERFACE NotificationFilter = { 0 };
|
||||
NotificationFilter.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
|
||||
NotificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
|
||||
NotificationFilter.dbcc_classguid = GUID_DEVINTERFACE_HID;
|
||||
m_hDeviceNotify = ::RegisterDeviceNotification(this->GetHWND(), &NotificationFilter, DEVICE_NOTIFY_WINDOW_HANDLE);
|
||||
|
||||
// or register for file handle change?
|
||||
// DEV_BROADCAST_HANDLE NotificationFilter = { 0 };
|
||||
// NotificationFilter.dbch_size = sizeof(DEV_BROADCAST_HANDLE);
|
||||
// NotificationFilter.dbch_devicetype = DBT_DEVTYP_HANDLE;
|
||||
|
||||
// Using Win32 Shell API to register for media insert / removal events.
|
||||
LPITEMIDLIST ppidl;
|
||||
if (SHGetSpecialFolderLocation(this->GetHWND(), CSIDL_DESKTOP, &ppidl) == NOERROR) {
|
||||
SHChangeNotifyEntry shCNE;
|
||||
shCNE.pidl = ppidl;
|
||||
shCNE.fRecursive = TRUE;
|
||||
// Returns a positive integer registration identifier (ID).
|
||||
// Returns zero if out of memory or in response to invalid parameters.
|
||||
m_ulSHChangeNotifyRegister = SHChangeNotifyRegister(this->GetHWND(), // Hwnd to receive notification
|
||||
SHCNE_DISKEVENTS, // Event types of interest (sources)
|
||||
SHCNE_MEDIAINSERTED | SHCNE_MEDIAREMOVED,
|
||||
//SHCNE_UPDATEITEM, // Events of interest - use SHCNE_ALLEVENTS for all events
|
||||
WM_USER_MEDIACHANGED, // Notification message to be sent upon the event
|
||||
1, // Number of entries in the pfsne array
|
||||
&shCNE); // Array of SHChangeNotifyEntry structures that
|
||||
// contain the notifications. This array should
|
||||
// always be set to one when calling SHChnageNotifyRegister
|
||||
// or SHChangeNotifyDeregister will not work properly.
|
||||
assert(m_ulSHChangeNotifyRegister != 0); // Shell notification failed
|
||||
} else {
|
||||
// Failed to get desktop location
|
||||
assert(false);
|
||||
}
|
||||
|
||||
{
|
||||
static constexpr int device_count = 1;
|
||||
RAWINPUTDEVICE devices[device_count] = { 0 };
|
||||
// multi-axis mouse (SpaceNavigator, etc.)
|
||||
devices[0].usUsagePage = 0x01;
|
||||
devices[0].usUsage = 0x08;
|
||||
if (! RegisterRawInputDevices(devices, device_count, sizeof(RAWINPUTDEVICE)))
|
||||
BOOST_LOG_TRIVIAL(error) << "RegisterRawInputDevices failed";
|
||||
}
|
||||
#endif // _WIN32
|
||||
|
||||
// propagate event
|
||||
event.Skip();
|
||||
});
|
||||
|
||||
Bind(wxEVT_CLOSE_WINDOW, [this](wxCloseEvent& event) {
|
||||
if (event.CanVeto() && !wxGetApp().check_unsaved_changes()) {
|
||||
event.Veto();
|
||||
|
@ -286,6 +227,8 @@ DPIFrame(NULL, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_S
|
|||
event.Skip();
|
||||
});
|
||||
|
||||
//FIXME it seems this method is not called on application start-up, at least not on Windows. Why?
|
||||
// The same applies to wxEVT_CREATE, it is not being called on startup on Windows.
|
||||
Bind(wxEVT_ACTIVATE, [this](wxActivateEvent& event) {
|
||||
if (m_plater != nullptr && event.GetActive())
|
||||
m_plater->on_activate();
|
||||
|
@ -656,6 +599,62 @@ void MainFrame::init_tabpanel()
|
|||
}
|
||||
}
|
||||
|
||||
#ifdef WIN32
|
||||
void MainFrame::register_win32_callbacks()
|
||||
{
|
||||
//static GUID GUID_DEVINTERFACE_USB_DEVICE = { 0xA5DCBF10, 0x6530, 0x11D2, 0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED };
|
||||
//static GUID GUID_DEVINTERFACE_DISK = { 0x53f56307, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b };
|
||||
//static GUID GUID_DEVINTERFACE_VOLUME = { 0x71a27cdd, 0x812a, 0x11d0, 0xbe, 0xc7, 0x08, 0x00, 0x2b, 0xe2, 0x09, 0x2f };
|
||||
static GUID GUID_DEVINTERFACE_HID = { 0x4D1E55B2, 0xF16F, 0x11CF, 0x88, 0xCB, 0x00, 0x11, 0x11, 0x00, 0x00, 0x30 };
|
||||
|
||||
// Register USB HID (Human Interface Devices) notifications to trigger the 3DConnexion enumeration.
|
||||
DEV_BROADCAST_DEVICEINTERFACE NotificationFilter = { 0 };
|
||||
NotificationFilter.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
|
||||
NotificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
|
||||
NotificationFilter.dbcc_classguid = GUID_DEVINTERFACE_HID;
|
||||
m_hDeviceNotify = ::RegisterDeviceNotification(this->GetHWND(), &NotificationFilter, DEVICE_NOTIFY_WINDOW_HANDLE);
|
||||
|
||||
// or register for file handle change?
|
||||
// DEV_BROADCAST_HANDLE NotificationFilter = { 0 };
|
||||
// NotificationFilter.dbch_size = sizeof(DEV_BROADCAST_HANDLE);
|
||||
// NotificationFilter.dbch_devicetype = DBT_DEVTYP_HANDLE;
|
||||
|
||||
// Using Win32 Shell API to register for media insert / removal events.
|
||||
LPITEMIDLIST ppidl;
|
||||
if (SHGetSpecialFolderLocation(this->GetHWND(), CSIDL_DESKTOP, &ppidl) == NOERROR) {
|
||||
SHChangeNotifyEntry shCNE;
|
||||
shCNE.pidl = ppidl;
|
||||
shCNE.fRecursive = TRUE;
|
||||
// Returns a positive integer registration identifier (ID).
|
||||
// Returns zero if out of memory or in response to invalid parameters.
|
||||
m_ulSHChangeNotifyRegister = SHChangeNotifyRegister(this->GetHWND(), // Hwnd to receive notification
|
||||
SHCNE_DISKEVENTS, // Event types of interest (sources)
|
||||
SHCNE_MEDIAINSERTED | SHCNE_MEDIAREMOVED,
|
||||
//SHCNE_UPDATEITEM, // Events of interest - use SHCNE_ALLEVENTS for all events
|
||||
WM_USER_MEDIACHANGED, // Notification message to be sent upon the event
|
||||
1, // Number of entries in the pfsne array
|
||||
&shCNE); // Array of SHChangeNotifyEntry structures that
|
||||
// contain the notifications. This array should
|
||||
// always be set to one when calling SHChnageNotifyRegister
|
||||
// or SHChangeNotifyDeregister will not work properly.
|
||||
assert(m_ulSHChangeNotifyRegister != 0); // Shell notification failed
|
||||
} else {
|
||||
// Failed to get desktop location
|
||||
assert(false);
|
||||
}
|
||||
|
||||
{
|
||||
static constexpr int device_count = 1;
|
||||
RAWINPUTDEVICE devices[device_count] = { 0 };
|
||||
// multi-axis mouse (SpaceNavigator, etc.)
|
||||
devices[0].usUsagePage = 0x01;
|
||||
devices[0].usUsage = 0x08;
|
||||
if (! RegisterRawInputDevices(devices, device_count, sizeof(RAWINPUTDEVICE)))
|
||||
BOOST_LOG_TRIVIAL(error) << "RegisterRawInputDevices failed";
|
||||
}
|
||||
}
|
||||
#endif // _WIN32
|
||||
|
||||
void MainFrame::create_preset_tabs()
|
||||
{
|
||||
wxGetApp().update_label_colours_from_appconfig();
|
||||
|
|
|
@ -156,6 +156,9 @@ public:
|
|||
void create_preset_tabs();
|
||||
void add_created_tab(Tab* panel);
|
||||
bool is_active_and_shown_tab(Tab* tab);
|
||||
// Register Win32 RawInput callbacks (3DConnexion) and removable media insert / remove callbacks.
|
||||
// Called from wxEVT_ACTIVATE, as wxEVT_CREATE was not reliable (bug in wxWidgets?).
|
||||
void register_win32_callbacks();
|
||||
#if ENABLE_GCODE_VIEWER
|
||||
void init_menubar_as_editor();
|
||||
void init_menubar_as_gcodeviewer();
|
||||
|
|
Loading…
Reference in a new issue