From 9a23cf7b42015a758d5352eccf492ff0b35ab1aa Mon Sep 17 00:00:00 2001 From: Dario Manesku Date: Thu, 5 Mar 2015 21:48:28 +0100 Subject: [PATCH 1/8] OSX prefers scroll be implemented this way. --- examples/common/entry/entry_osx.mm | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/examples/common/entry/entry_osx.mm b/examples/common/entry/entry_osx.mm index d09ccb4b4..200791870 100644 --- a/examples/common/entry/entry_osx.mm +++ b/examples/common/entry/entry_osx.mm @@ -77,7 +77,8 @@ namespace entry struct Context { Context() - : m_scroll(0) + : m_scrollf(0.0f) + , m_scroll(0) , m_exit(false) { s_translateKey[27] = Key::Esc; @@ -292,9 +293,11 @@ namespace entry case NSScrollWheel: { + m_scrollf += [event deltaY]; + int x, y; getMousePos(&x, &y); - m_scroll += ([event deltaY] > 0.0f) ? 1 : -1; + m_scroll = (int32_t)m_scrollf; m_eventQueue.postMouseEvent(s_defaultWindow, x, y, m_scroll); break; } @@ -443,8 +446,9 @@ namespace entry bx::HandleAllocT m_windowAlloc; NSWindow* m_window[ENTRY_CONFIG_MAX_WINDOWS]; + float m_scrollf; int32_t m_scroll; - bool m_exit; + bool m_exit; }; static Context s_ctx; From 97e9d2db6c09d93a5a27d1b81aca449c88d37e75 Mon Sep 17 00:00:00 2001 From: Dario Manesku Date: Thu, 5 Mar 2015 22:22:51 +0100 Subject: [PATCH 2/8] Temporary solution for middle click. --- examples/common/entry/entry_osx.mm | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/examples/common/entry/entry_osx.mm b/examples/common/entry/entry_osx.mm index 200791870..186d3bf0e 100644 --- a/examples/common/entry/entry_osx.mm +++ b/examples/common/entry/entry_osx.mm @@ -247,7 +247,12 @@ namespace entry { int x, y; getMousePos(&x, &y); - m_eventQueue.postMouseEvent(s_defaultWindow, x, y, m_scroll, MouseButton::Left, true); + + // TODO: remove! + // Shift + Left Mouse Button acts as middle! This just a temporary solution! + // This is becase the average OSX user doesn't have middle mouse click. + MouseButton::Enum mb = ([event modifierFlags] & NSShiftKeyMask) ? MouseButton::Middle : MouseButton::Left; + m_eventQueue.postMouseEvent(s_defaultWindow, x, y, m_scroll, mb, true); break; } @@ -256,6 +261,7 @@ namespace entry int x, y; getMousePos(&x, &y); m_eventQueue.postMouseEvent(s_defaultWindow, x, y, m_scroll, MouseButton::Left, false); + m_eventQueue.postMouseEvent(s_defaultWindow, x, y, m_scroll, MouseButton::Middle, false); // TODO: remove! break; } From a96ba40b03c690bf02eb8c50e2e7390e9964e1ba Mon Sep 17 00:00:00 2001 From: Dario Manesku Date: Fri, 6 Mar 2015 00:15:40 +0100 Subject: [PATCH 3/8] Imgui input now accepts, and interprets in the same way, 'delete' and 'backspace'. --- examples/common/imgui/imgui.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/common/imgui/imgui.cpp b/examples/common/imgui/imgui.cpp index 7fa19965b..cdd918c0f 100644 --- a/examples/common/imgui/imgui.cpp +++ b/examples/common/imgui/imgui.cpp @@ -1405,7 +1405,7 @@ struct Imgui { const size_t cursor = size_t(strlen(_str)); - if (m_char == 0x08) //backspace + if (m_char == 0x08 || m_char == 0x7f) //backspace or delete { _str[cursor-1] = '\0'; } From 701cd3b3c9b90eef9b4e152893dcb3d3e2b7b6db Mon Sep 17 00:00:00 2001 From: Dario Manesku Date: Fri, 6 Mar 2015 00:17:15 +0100 Subject: [PATCH 4/8] Adding postCharEvent() to OSX entry. --- examples/common/entry/entry_osx.mm | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/examples/common/entry/entry_osx.mm b/examples/common/entry/entry_osx.mm index 186d3bf0e..c1fa7b7bc 100644 --- a/examples/common/entry/entry_osx.mm +++ b/examples/common/entry/entry_osx.mm @@ -171,20 +171,19 @@ namespace entry return mask; } - Key::Enum handleKeyEvent(NSEvent* event, uint8_t* specialKeys) + Key::Enum handleKeyEvent(NSEvent* event, uint8_t* specialKeys, uint8_t* _pressedChar) { NSString* key = [event charactersIgnoringModifiers]; unichar keyChar = 0; -//DBG("keyChar %d", keyChar); if ([key length] == 0) { return Key::None; } keyChar = [key characterAtIndex:0]; + *_pressedChar = (uint8_t)keyChar; int keyCode = keyChar; -//DBG("keyCode %d", keyCode); *specialKeys = translateModifiers([event modifierFlags]); // if this is a unhandled key just return None @@ -311,14 +310,20 @@ namespace entry case NSKeyDown: { uint8_t modifiers = 0; - Key::Enum key = handleKeyEvent(event, &modifiers); + uint8_t pressedChar[4]; + Key::Enum key = handleKeyEvent(event, &modifiers, &pressedChar[0]); // If KeyCode is none we don't don't handle the key and special case for cmd+q (quit) // Note that return false here means that we take care of the key (instead of the default behavior) if (key != Key::None) { - if (key != Key::KeyQ - && !(modifiers & Modifier::RightMeta) ) + if ( (Key::Key0 <= key && key <= Key::KeyZ) + || (Key::Esc <= key && key <= Key::Minus) ) + { + m_eventQueue.postCharEvent(s_defaultWindow, 1, pressedChar); + } + else if (key != Key::KeyQ + && !(modifiers & Modifier::RightMeta) ) { m_eventQueue.postKeyEvent(s_defaultWindow, key, modifiers, true); return false; @@ -331,7 +336,10 @@ namespace entry case NSKeyUp: { uint8_t modifiers = 0; - Key::Enum key = handleKeyEvent(event, &modifiers); + uint8_t pressedChar[4]; + Key::Enum key = handleKeyEvent(event, &modifiers, &pressedChar[0]); + + BX_UNUSED(pressedChar); if (key != Key::None) { From 382c0b685b0808cb81143cf733aefad42412f0c8 Mon Sep 17 00:00:00 2001 From: Dario Manesku Date: Fri, 6 Mar 2015 01:04:49 +0100 Subject: [PATCH 5/8] Calling postExitEvent() for Meta+Q as in other entries. --- examples/common/entry/entry_osx.mm | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/examples/common/entry/entry_osx.mm b/examples/common/entry/entry_osx.mm index c1fa7b7bc..b95293ee2 100644 --- a/examples/common/entry/entry_osx.mm +++ b/examples/common/entry/entry_osx.mm @@ -313,17 +313,20 @@ namespace entry uint8_t pressedChar[4]; Key::Enum key = handleKeyEvent(event, &modifiers, &pressedChar[0]); - // If KeyCode is none we don't don't handle the key and special case for cmd+q (quit) - // Note that return false here means that we take care of the key (instead of the default behavior) + // Returning false means that we take care of the key (instead of the default behavior) if (key != Key::None) { - if ( (Key::Key0 <= key && key <= Key::KeyZ) - || (Key::Esc <= key && key <= Key::Minus) ) + if (key == Key::KeyQ && (modifiers & Modifier::RightMeta) ) + { + m_eventQueue.postExitEvent(); + } + else if ( (Key::Key0 <= key && key <= Key::KeyZ) + || (Key::Esc <= key && key <= Key::Minus) ) { m_eventQueue.postCharEvent(s_defaultWindow, 1, pressedChar); + return false; } - else if (key != Key::KeyQ - && !(modifiers & Modifier::RightMeta) ) + else { m_eventQueue.postKeyEvent(s_defaultWindow, key, modifiers, true); return false; @@ -446,7 +449,6 @@ namespace entry } } - m_eventQueue.postExitEvent(); while (bgfx::RenderFrame::NoContext != bgfx::renderFrame() ) {}; From f47bd56d52fa4ba17323b693e51de2b8c8d5b76c Mon Sep 17 00:00:00 2001 From: Dario Manesku Date: Fri, 6 Mar 2015 01:42:33 +0100 Subject: [PATCH 6/8] Fixing content display on window resize. --- examples/common/entry/entry_osx.mm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/examples/common/entry/entry_osx.mm b/examples/common/entry/entry_osx.mm index b95293ee2..356b6fa07 100644 --- a/examples/common/entry/entry_osx.mm +++ b/examples/common/entry/entry_osx.mm @@ -367,7 +367,8 @@ namespace entry { WindowHandle handle = { 0 }; NSWindow* window = m_window[handle.idx]; - NSRect rect = [window frame]; + NSRect originalFrame = [window frame]; + NSRect rect = [NSWindow contentRectForFrameRect: originalFrame styleMask: NSTitledWindowMask]; uint32_t width = uint32_t(rect.size.width); uint32_t height = uint32_t(rect.size.height); m_eventQueue.postSizeEvent(handle, width, height); From c5943ded1208575126c66a67b872e7c2de8aa55a Mon Sep 17 00:00:00 2001 From: Dario Manesku Date: Fri, 6 Mar 2015 01:59:41 +0100 Subject: [PATCH 7/8] Make sure mouse button state is 'up' after window resize. --- examples/common/entry/entry_osx.mm | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/examples/common/entry/entry_osx.mm b/examples/common/entry/entry_osx.mm index 356b6fa07..909ace089 100644 --- a/examples/common/entry/entry_osx.mm +++ b/examples/common/entry/entry_osx.mm @@ -372,6 +372,12 @@ namespace entry uint32_t width = uint32_t(rect.size.width); uint32_t height = uint32_t(rect.size.height); m_eventQueue.postSizeEvent(handle, width, height); + + // Make sure mouse button state is 'up' after resize. + int x, y; + getMousePos(&x, &y); + m_eventQueue.postMouseEvent(s_defaultWindow, x, y, m_scroll, MouseButton::Left, false); + m_eventQueue.postMouseEvent(s_defaultWindow, x, y, m_scroll, MouseButton::Right, false); } int32_t run(int _argc, char** _argv) From 52008569effed19467fb2939fb63b53a2105931f Mon Sep 17 00:00:00 2001 From: Dario Manesku Date: Fri, 6 Mar 2015 02:02:02 +0100 Subject: [PATCH 8/8] Get mouse position only once and store it. --- examples/common/entry/entry_osx.mm | 46 +++++++++++------------------- 1 file changed, 16 insertions(+), 30 deletions(-) diff --git a/examples/common/entry/entry_osx.mm b/examples/common/entry/entry_osx.mm index 909ace089..51e9d86be 100644 --- a/examples/common/entry/entry_osx.mm +++ b/examples/common/entry/entry_osx.mm @@ -78,6 +78,8 @@ namespace entry { Context() : m_scrollf(0.0f) + , m_mx(0) + , m_my(0) , m_scroll(0) , m_exit(false) { @@ -236,63 +238,49 @@ namespace entry case NSRightMouseDragged: case NSOtherMouseDragged: { - int x, y; - getMousePos(&x, &y); - m_eventQueue.postMouseEvent(s_defaultWindow, x, y, m_scroll); + getMousePos(&m_mx, &m_my); + m_eventQueue.postMouseEvent(s_defaultWindow, m_mx, m_my, m_scroll); break; } case NSLeftMouseDown: { - int x, y; - getMousePos(&x, &y); - // TODO: remove! // Shift + Left Mouse Button acts as middle! This just a temporary solution! // This is becase the average OSX user doesn't have middle mouse click. MouseButton::Enum mb = ([event modifierFlags] & NSShiftKeyMask) ? MouseButton::Middle : MouseButton::Left; - m_eventQueue.postMouseEvent(s_defaultWindow, x, y, m_scroll, mb, true); + m_eventQueue.postMouseEvent(s_defaultWindow, m_mx, m_my, m_scroll, mb, true); break; } case NSLeftMouseUp: { - int x, y; - getMousePos(&x, &y); - m_eventQueue.postMouseEvent(s_defaultWindow, x, y, m_scroll, MouseButton::Left, false); - m_eventQueue.postMouseEvent(s_defaultWindow, x, y, m_scroll, MouseButton::Middle, false); // TODO: remove! + m_eventQueue.postMouseEvent(s_defaultWindow, m_mx, m_my, m_scroll, MouseButton::Left, false); + m_eventQueue.postMouseEvent(s_defaultWindow, m_mx, m_my, m_scroll, MouseButton::Middle, false); // TODO: remove! break; } case NSRightMouseDown: { - int x, y; - getMousePos(&x, &y); - m_eventQueue.postMouseEvent(s_defaultWindow, x, y, m_scroll, MouseButton::Right, true); + m_eventQueue.postMouseEvent(s_defaultWindow, m_mx, m_my, m_scroll, MouseButton::Right, true); break; } case NSRightMouseUp: { - int x, y; - getMousePos(&x, &y); - m_eventQueue.postMouseEvent(s_defaultWindow, x, y, m_scroll, MouseButton::Right, false); + m_eventQueue.postMouseEvent(s_defaultWindow, m_mx, m_my, m_scroll, MouseButton::Right, false); break; } case NSOtherMouseDown: { - int x, y; - getMousePos(&x, &y); - m_eventQueue.postMouseEvent(s_defaultWindow, x, y, m_scroll, MouseButton::Middle, true); + m_eventQueue.postMouseEvent(s_defaultWindow, m_mx, m_my, m_scroll, MouseButton::Middle, true); break; } case NSOtherMouseUp: { - int x, y; - getMousePos(&x, &y); - m_eventQueue.postMouseEvent(s_defaultWindow, x, y, m_scroll, MouseButton::Middle, false); + m_eventQueue.postMouseEvent(s_defaultWindow, m_mx, m_my, m_scroll, MouseButton::Middle, false); break; } @@ -300,10 +288,8 @@ namespace entry { m_scrollf += [event deltaY]; - int x, y; - getMousePos(&x, &y); m_scroll = (int32_t)m_scrollf; - m_eventQueue.postMouseEvent(s_defaultWindow, x, y, m_scroll); + m_eventQueue.postMouseEvent(s_defaultWindow, m_mx, m_my, m_scroll); break; } @@ -374,10 +360,8 @@ namespace entry m_eventQueue.postSizeEvent(handle, width, height); // Make sure mouse button state is 'up' after resize. - int x, y; - getMousePos(&x, &y); - m_eventQueue.postMouseEvent(s_defaultWindow, x, y, m_scroll, MouseButton::Left, false); - m_eventQueue.postMouseEvent(s_defaultWindow, x, y, m_scroll, MouseButton::Right, false); + m_eventQueue.postMouseEvent(s_defaultWindow, m_mx, m_my, m_scroll, MouseButton::Left, false); + m_eventQueue.postMouseEvent(s_defaultWindow, m_mx, m_my, m_scroll, MouseButton::Right, false); } int32_t run(int _argc, char** _argv) @@ -470,6 +454,8 @@ namespace entry NSWindow* m_window[ENTRY_CONFIG_MAX_WINDOWS]; float m_scrollf; + int32_t m_mx; + int32_t m_my; int32_t m_scroll; bool m_exit; };