diff --git a/apps/OpenSpace/ext/sgct b/apps/OpenSpace/ext/sgct index a29d90e30c..54f917a882 160000 --- a/apps/OpenSpace/ext/sgct +++ b/apps/OpenSpace/ext/sgct @@ -1 +1 @@ -Subproject commit a29d90e30cb15359a59179c57eecef0e8a23eec5 +Subproject commit 54f917a88203592f8b3389333a042b256ae6c9cf diff --git a/apps/OpenSpace/main.cpp b/apps/OpenSpace/main.cpp index 845b9d7848..57484252fc 100644 --- a/apps/OpenSpace/main.cpp +++ b/apps/OpenSpace/main.cpp @@ -548,11 +548,12 @@ void mainKeyboardCallback(int key, int, int action, int mods) { -void mainMouseButtonCallback(int key, int action) { +void mainMouseButtonCallback(int key, int action, int modifiers) { LTRACE("main::mainMouseButtonCallback(begin)"); openspace::global::openSpaceEngine.mouseButtonCallback( openspace::MouseButton(key), - openspace::MouseAction(action) + openspace::MouseAction(action), + openspace::KeyModifier(modifiers) ); LTRACE("main::mainMouseButtonCallback(end)"); } diff --git a/include/openspace/engine/globalscallbacks.h b/include/openspace/engine/globalscallbacks.h index 59f3d22e5d..414a7c471b 100644 --- a/include/openspace/engine/globalscallbacks.h +++ b/include/openspace/engine/globalscallbacks.h @@ -49,7 +49,7 @@ std::vector>& gPostDraw(); std::vector>& gKeyboard(); std::vector>& gCharacter(); -std::vector>& gMouseButton(); +std::vector>& gMouseButton(); std::vector>& gMousePosition(); std::vector>& gMouseScrollWheel(); @@ -70,8 +70,8 @@ static std::vector>& keyboard = detail::gKeyboard(); static std::vector>& character = detail::gCharacter(); -static std::vector>& mouseButton = - detail::gMouseButton(); +static std::vector>& + mouseButton = detail::gMouseButton(); static std::vector>& mousePosition = detail::gMousePosition(); static std::vector>& mouseScrollWheel = diff --git a/include/openspace/engine/openspaceengine.h b/include/openspace/engine/openspaceengine.h index 921a658c0c..f9c9c9a204 100644 --- a/include/openspace/engine/openspaceengine.h +++ b/include/openspace/engine/openspaceengine.h @@ -76,7 +76,7 @@ public: void postDraw(); void keyboardCallback(Key key, KeyModifier mod, KeyAction action); void charCallback(unsigned int codepoint, KeyModifier modifier); - void mouseButtonCallback(MouseButton button, MouseAction action); + void mouseButtonCallback(MouseButton button, MouseAction action, KeyModifier mods); void mousePositionCallback(double x, double y); void mouseScrollWheelCallback(double posX, double posY); void externalControlCallback(const char* receivedChars, int size, int clientId); diff --git a/modules/imgui/imguimodule.cpp b/modules/imgui/imguimodule.cpp index 539199cc06..f0d38e11aa 100644 --- a/modules/imgui/imguimodule.cpp +++ b/modules/imgui/imguimodule.cpp @@ -205,7 +205,7 @@ ImGUIModule::ImGUIModule() : OpenSpaceModule(Name) { ); global::callback::mouseButton.emplace_back( - [&](MouseButton button, MouseAction action) -> bool { + [&](MouseButton button, MouseAction action, KeyModifier) -> bool { // A list of all the windows that can show up by themselves if (gui.isEnabled() || gui._performance.isEnabled() || gui._sceneProperty.isEnabled()) diff --git a/modules/webbrowser/include/eventhandler.h b/modules/webbrowser/include/eventhandler.h index eb7e0725f6..c90cf98ebc 100644 --- a/modules/webbrowser/include/eventhandler.h +++ b/modules/webbrowser/include/eventhandler.h @@ -62,7 +62,7 @@ public: void detachBrowser(); private: - bool mouseButtonCallback(MouseButton button, MouseAction action); + bool mouseButtonCallback(MouseButton button, MouseAction action, KeyModifier mods); bool mousePositionCallback(double x, double y); bool mouseWheelCallback(glm::ivec2 delta); bool charCallback(unsigned int charCode, KeyModifier modifier); @@ -82,7 +82,7 @@ private: * * \return */ - CefMouseEvent mouseEvent(); + CefMouseEvent mouseEvent(KeyModifier mods = KeyModifier::NoModifier); /** * Find the CEF key event to use for a given action. diff --git a/modules/webbrowser/src/eventhandler.cpp b/modules/webbrowser/src/eventhandler.cpp index c263e1f92d..df9b6bdc7d 100644 --- a/modules/webbrowser/src/eventhandler.cpp +++ b/modules/webbrowser/src/eventhandler.cpp @@ -125,9 +125,9 @@ void EventHandler::initialize() { } ); global::callback::mouseButton.emplace_back( - [this](MouseButton button, MouseAction action) -> bool { + [this](MouseButton button, MouseAction action, KeyModifier mods) -> bool { if (_browserInstance) { - return mouseButtonCallback(button, action); + return mouseButtonCallback(button, action, mods); } return false; } @@ -143,7 +143,10 @@ void EventHandler::initialize() { ); } -bool EventHandler::mouseButtonCallback(MouseButton button, MouseAction action) { +bool EventHandler::mouseButtonCallback(MouseButton button, + MouseAction action, + KeyModifier mods) +{ if (button != MouseButton::Left && button != MouseButton::Right) { return false; } @@ -167,7 +170,7 @@ bool EventHandler::mouseButtonCallback(MouseButton button, MouseAction action) { } return _browserInstance->sendMouseClickEvent( - mouseEvent(), + mouseEvent(mods), (button == MouseButton::Left) ? MBT_LEFT : MBT_RIGHT, !state.down, clickCount @@ -250,7 +253,7 @@ cef_key_event_type_t EventHandler::keyEventType(KeyAction action) { } } -CefMouseEvent EventHandler::mouseEvent() { +CefMouseEvent EventHandler::mouseEvent(KeyModifier mods) { CefMouseEvent event; event.x = static_cast(_mousePosition.x); event.y = static_cast(_mousePosition.y); @@ -263,6 +266,7 @@ CefMouseEvent EventHandler::mouseEvent() { event.modifiers = EVENTFLAG_RIGHT_MOUSE_BUTTON; } + event.modifiers |= static_cast(mapToCefModifiers(mods)); return event; } diff --git a/src/engine/globalscallbacks.cpp b/src/engine/globalscallbacks.cpp index 1a70f5a19b..da64e6b45e 100644 --- a/src/engine/globalscallbacks.cpp +++ b/src/engine/globalscallbacks.cpp @@ -81,8 +81,8 @@ std::vector>& gCharacter() { return g; } -std::vector>& gMouseButton() { - static std::vector> g; +std::vector>& gMouseButton() { + static std::vector> g; return g; } diff --git a/src/engine/openspaceengine.cpp b/src/engine/openspaceengine.cpp index 460135707b..078814d518 100644 --- a/src/engine/openspaceengine.cpp +++ b/src/engine/openspaceengine.cpp @@ -1180,10 +1180,13 @@ void OpenSpaceEngine::charCallback(unsigned int codepoint, KeyModifier modifier) global::luaConsole.charCallback(codepoint, modifier); } -void OpenSpaceEngine::mouseButtonCallback(MouseButton button, MouseAction action) { - using F = std::function; +void OpenSpaceEngine::mouseButtonCallback(MouseButton button, + MouseAction action, + KeyModifier mods) +{ + using F = std::function; for (const F& func : global::callback::mouseButton) { - bool isConsumed = func(button, action); + bool isConsumed = func(button, action, mods); if (isConsumed) { // If the mouse was released, we still want to forward it to the navigation // handler in order to reliably terminate a rotation or zoom. Accidentally