|  |  | @@ -35,13 +35,6 @@ GLFWAPI int glfwGetKeyScancode(int key) { return 0; } | 
		
	
		
			
			|  |  |  | namespace rack { | 
		
	
		
			
			|  |  |  | namespace window { | 
		
	
		
			
			|  |  |  | DISTRHO_NAMESPACE::UI* lastUI = nullptr; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | void mouseButtonCallback(Context* ctx, int button, int action, int mods); | 
		
	
		
			
			|  |  |  | void cursorPosCallback(Context* ctx, double xpos, double ypos); | 
		
	
		
			
			|  |  |  | void cursorEnterCallback(Context* ctx, int entered); | 
		
	
		
			
			|  |  |  | void scrollCallback(Context* ctx, double x, double y); | 
		
	
		
			
			|  |  |  | void charCallback(Context* ctx, unsigned int codepoint); | 
		
	
		
			
			|  |  |  | void keyCallback(Context* ctx, int key, int scancode, int action, int mods); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
	
		
			
				|  |  | @@ -54,6 +47,7 @@ rack::Context* getRackContextFromPlugin(void* ptr); | 
		
	
		
			
			|  |  |  | class CardinalUI : public UI | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | rack::Context* const fContext; | 
		
	
		
			
			|  |  |  | rack::math::Vec fLastMousePos; | 
		
	
		
			
			|  |  |  | ResizeHandle fResizeHandle; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | struct ScopedContext { | 
		
	
	
		
			
				|  |  | @@ -93,6 +87,12 @@ public: | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | delete fContext->window; | 
		
	
		
			
			|  |  |  | fContext->window = nullptr; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | delete fContext->scene; | 
		
	
		
			
			|  |  |  | fContext->scene = nullptr; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | delete fContext->event; | 
		
	
		
			
			|  |  |  | fContext->event = nullptr; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | void onNanoDisplay() override | 
		
	
	
		
			
				|  |  | @@ -127,7 +127,7 @@ protected: | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | int button; | 
		
	
		
			
			|  |  |  | int mods = 0; | 
		
	
		
			
			|  |  |  | int action = ev.press; | 
		
	
		
			
			|  |  |  | int action = ev.press ? GLFW_PRESS : GLFW_RELEASE; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | if (ev.mod & kModifierControl) | 
		
	
		
			
			|  |  |  | mods |= GLFW_MOD_CONTROL; | 
		
	
	
		
			
				|  |  | @@ -176,35 +176,57 @@ protected: | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | #endif | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | rack::window::mouseButtonCallback(fContext, button, action, mods); | 
		
	
		
			
			|  |  |  | return true; | 
		
	
		
			
			|  |  |  | /* | 
		
	
		
			
			|  |  |  | #if defined ARCH_MAC | 
		
	
		
			
			|  |  |  | // Remap Ctrl-left click to right click on Mac | 
		
	
		
			
			|  |  |  | if (button == GLFW_MOUSE_BUTTON_LEFT && (mods & RACK_MOD_MASK) == GLFW_MOD_CONTROL) { | 
		
	
		
			
			|  |  |  | button = GLFW_MOUSE_BUTTON_RIGHT; | 
		
	
		
			
			|  |  |  | mods &= ~GLFW_MOD_CONTROL; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | // Remap Ctrl-shift-left click to middle click on Mac | 
		
	
		
			
			|  |  |  | if (button == GLFW_MOUSE_BUTTON_LEFT && (mods & RACK_MOD_MASK) == (GLFW_MOD_CONTROL | GLFW_MOD_SHIFT)) { | 
		
	
		
			
			|  |  |  | button = GLFW_MOUSE_BUTTON_MIDDLE; | 
		
	
		
			
			|  |  |  | mods &= ~(GLFW_MOD_CONTROL | GLFW_MOD_SHIFT); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | #endif | 
		
	
		
			
			|  |  |  | */ | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | return fContext->event->handleButton(fLastMousePos, button, action, mods); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | bool onMotion(const MotionEvent& ev) override | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | const ScopedContext sc(this); | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | rack::window::cursorPosCallback(fContext, ev.pos.getX(), ev.pos.getY()); | 
		
	
		
			
			|  |  |  | return true; | 
		
	
		
			
			|  |  |  | rack::math::Vec mousePos = rack::math::Vec(ev.pos.getX(), ev.pos.getY()); | 
		
	
		
			
			|  |  |  | // .div(ctx->window->pixelRatio / ctx->window->windowRatio).round(); | 
		
	
		
			
			|  |  |  | rack::math::Vec mouseDelta = mousePos.minus(fLastMousePos); | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | /* | 
		
	
		
			
			|  |  |  | // Workaround for GLFW warping mouse to a different position when the cursor is locked or unlocked. | 
		
	
		
			
			|  |  |  | if (ctx->window->internal->ignoreNextMouseDelta) | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | ctx->window->internal->ignoreNextMouseDelta = false; | 
		
	
		
			
			|  |  |  | mouseDelta = math::Vec(); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | */ | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | fLastMousePos = mousePos; | 
		
	
		
			
			|  |  |  | return fContext->event->handleHover(mousePos, mouseDelta); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | bool onScroll(const ScrollEvent& ev) override | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | const ScopedContext sc(this); | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | rack::window::scrollCallback(fContext, ev.delta.getX(), ev.delta.getY()); | 
		
	
		
			
			|  |  |  | return true; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | #if 0 | 
		
	
		
			
			|  |  |  | void onResize(const ResizeEvent& ev) override | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | UI::onResize(ev); | 
		
	
		
			
			|  |  |  | // APP->window->setSize(rack::math::Vec(ev.size.getWidth(), ev.size.getHeight())); | 
		
	
		
			
			|  |  |  | rack::math::Vec scrollDelta = rack::math::Vec(ev.delta.getX(), ev.delta.getY()); | 
		
	
		
			
			|  |  |  | #ifdef DISTRHO_OS_MAC | 
		
	
		
			
			|  |  |  | scrollDelta = scrollDelta.mult(10.0); | 
		
	
		
			
			|  |  |  | #else | 
		
	
		
			
			|  |  |  | scrollDelta = scrollDelta.mult(50.0); | 
		
	
		
			
			|  |  |  | #endif | 
		
	
		
			
			|  |  |  | return fContext->event->handleScroll(fLastMousePos, scrollDelta); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | #endif | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | // TODO uiFocus | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | bool onCharacterInput(const CharacterInputEvent& ev) override | 
		
	
		
			
			|  |  |  | { | 
		
	
	
		
			
				|  |  | @@ -213,8 +235,7 @@ protected: | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | const ScopedContext sc(this); | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | rack::window::charCallback(fContext, ev.character); | 
		
	
		
			
			|  |  |  | return true; | 
		
	
		
			
			|  |  |  | return fContext->event->handleText(fLastMousePos, ev.character); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | bool onKeyboard(const KeyboardEvent& ev) override | 
		
	
	
		
			
				|  |  | @@ -223,7 +244,7 @@ protected: | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | int key; | 
		
	
		
			
			|  |  |  | int mods = 0; | 
		
	
		
			
			|  |  |  | int action = ev.press; | 
		
	
		
			
			|  |  |  | int action = ev.press ? GLFW_PRESS : GLFW_RELEASE; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | /* These are unsupported in pugl right now | 
		
	
		
			
			|  |  |  | #define GLFW_KEY_KP_0               320 | 
		
	
	
		
			
				|  |  | @@ -297,9 +318,15 @@ protected: | 
		
	
		
			
			|  |  |  | if (ev.mod & kModifierAlt) | 
		
	
		
			
			|  |  |  | mods |= GLFW_MOD_ALT; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | // TODO special key conversion | 
		
	
		
			
			|  |  |  | rack::window::keyCallback(fContext, key, ev.keycode, action, mods); | 
		
	
		
			
			|  |  |  | return true; | 
		
	
		
			
			|  |  |  | return fContext->event->handleKey(fLastMousePos, key, ev.keycode, action, mods); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | void uiFocus(const bool focus, CrossingMode) override | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | const ScopedContext sc(this); | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | if (! focus) | 
		
	
		
			
			|  |  |  | fContext->event->handleLeave(); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | private: | 
		
	
	
		
			
				|  |  | 
 |