private unsafe int HandleSDLEvent(IntPtr userdata, IntPtr ptr) { SDL_Event *e = (SDL_Event *)ptr; switch (e->type) { case SDL.SDL_EventType.SDL_AUDIODEVICEADDED: Console.WriteLine("AUDIO ADDED: {0}", e->adevice.which); break; case SDL.SDL_EventType.SDL_AUDIODEVICEREMOVED: Console.WriteLine("AUDIO REMOVED: {0}", e->adevice.which); break; case SDL.SDL_EventType.SDL_WINDOWEVENT: switch (e->window.windowEvent) { case SDL.SDL_WindowEventID.SDL_WINDOWEVENT_ENTER: Mouse.MouseInWindow = true; break; case SDL.SDL_WindowEventID.SDL_WINDOWEVENT_LEAVE: Mouse.MouseInWindow = false; break; case SDL.SDL_WindowEventID.SDL_WINDOWEVENT_FOCUS_GAINED: Plugin.OnFocusGained(); break; case SDL.SDL_WindowEventID.SDL_WINDOWEVENT_FOCUS_LOST: Plugin.OnFocusLost(); break; } break; case SDL.SDL_EventType.SDL_KEYDOWN: Keyboard.OnKeyDown(e->key); if (Plugin.ProcessHotkeys((int)e->key.keysym.sym, (int)e->key.keysym.mod, true)) { _ignoreNextTextInput = false; UIManager.KeyboardFocusControl?.InvokeKeyDown(e->key.keysym.sym, e->key.keysym.mod); _scene.OnKeyDown(e->key); } else { _ignoreNextTextInput = true; } break; case SDL.SDL_EventType.SDL_KEYUP: Keyboard.OnKeyUp(e->key); UIManager.KeyboardFocusControl?.InvokeKeyUp(e->key.keysym.sym, e->key.keysym.mod); _scene.OnKeyUp(e->key); Plugin.ProcessHotkeys(0, 0, false); if (e->key.keysym.sym == SDL_Keycode.SDLK_PRINTSCREEN) { string path = Path.Combine(FileSystemHelper.CreateFolderIfNotExists(CUOEnviroment.ExecutablePath, "Data", "Client", "Screenshots"), $"screenshot_{DateTime.Now:yyyy-MM-dd_hh-mm-ss}.png"); using (Stream stream = File.Create(path)) { _buffer.SaveAsPng(stream, _buffer.Width, _buffer.Height); GameActions.Print($"Screenshot stored in: {path}", 0x44, MessageType.System); } } break; case SDL.SDL_EventType.SDL_TEXTINPUT: if (_ignoreNextTextInput) { break; } string s = StringHelper.ReadUTF8(e->text.text); if (!string.IsNullOrEmpty(s)) { UIManager.KeyboardFocusControl?.InvokeTextInput(s); _scene.OnTextInput(s); } break; case SDL.SDL_EventType.SDL_MOUSEMOTION: Mouse.Update(); if (Mouse.IsDragging) { UIManager.OnMouseDragging(); _scene.OnMouseDragging(); } if (Mouse.IsDragging && !_dragStarted) { _dragStarted = true; } break; case SDL.SDL_EventType.SDL_MOUSEWHEEL: Mouse.Update(); bool isup = e->wheel.y > 0; Plugin.ProcessMouse(0, e->wheel.y); UIManager.OnMouseWheel(isup); _scene.OnMouseWheel(isup); break; case SDL.SDL_EventType.SDL_MOUSEBUTTONUP: case SDL.SDL_EventType.SDL_MOUSEBUTTONDOWN: Mouse.Update(); bool isDown = e->type == SDL.SDL_EventType.SDL_MOUSEBUTTONDOWN; if (_dragStarted && !isDown) { _dragStarted = false; } SDL.SDL_MouseButtonEvent mouse = e->button; switch ((uint)mouse.button) { case SDL_BUTTON_LEFT: if (isDown) { Mouse.Begin(); Mouse.LButtonPressed = true; Mouse.LDropPosition = Mouse.Position; Mouse.CancelDoubleClick = false; uint ticks = Time.Ticks; if (Mouse.LastLeftButtonClickTime + Mouse.MOUSE_DELAY_DOUBLE_CLICK >= ticks) { Mouse.LastLeftButtonClickTime = 0; bool res = UIManager.ValidForDClick() ? UIManager.OnLeftMouseDoubleClick() : _scene.OnLeftMouseDoubleClick(); if (!res) { _scene.OnLeftMouseDown(); UIManager.OnLeftMouseButtonDown(); } else { Mouse.LastLeftButtonClickTime = 0xFFFF_FFFF; } break; } _scene.OnLeftMouseDown(); UIManager.OnLeftMouseButtonDown(); Mouse.LastLeftButtonClickTime = Mouse.CancelDoubleClick ? 0 : ticks; } else { if (Mouse.LastLeftButtonClickTime != 0xFFFF_FFFF) { if (!UIManager.HadMouseDownOnGump(MouseButtonType.Left)) { _scene.OnLeftMouseUp(); } UIManager.OnLeftMouseButtonUp(); } Mouse.LButtonPressed = false; Mouse.End(); } break; case SDL_BUTTON_MIDDLE: if (isDown) { Mouse.Begin(); Mouse.MButtonPressed = true; Mouse.MDropPosition = Mouse.Position; Mouse.CancelDoubleClick = false; uint ticks = Time.Ticks; if (Mouse.LastMidButtonClickTime + Mouse.MOUSE_DELAY_DOUBLE_CLICK >= ticks) { Mouse.LastMidButtonClickTime = 0; if (!_scene.OnMiddleMouseDoubleClick()) { _scene.OnMiddleMouseDown(); UIManager.OnMiddleMouseButtonDown(); } break; } Plugin.ProcessMouse(e->button.button, 0); _scene.OnMiddleMouseDown(); UIManager.OnMiddleMouseButtonDown(); Mouse.LastMidButtonClickTime = Mouse.CancelDoubleClick ? 0 : ticks; } else { if (Mouse.LastMidButtonClickTime != 0xFFFF_FFFF) { if (!UIManager.HadMouseDownOnGump(MouseButtonType.Middle)) { _scene.OnMiddleMouseUp(); } UIManager.OnMiddleMouseButtonUp(); } Mouse.MButtonPressed = false; Mouse.End(); } break; case SDL_BUTTON_RIGHT: if (isDown) { Mouse.Begin(); Mouse.RButtonPressed = true; Mouse.RDropPosition = Mouse.Position; Mouse.CancelDoubleClick = false; uint ticks = Time.Ticks; if (Mouse.LastRightButtonClickTime + Mouse.MOUSE_DELAY_DOUBLE_CLICK >= ticks) { Mouse.LastRightButtonClickTime = 0; bool res = _scene.OnRightMouseDoubleClick() || UIManager.OnRightMouseDoubleClick(); if (!res) { _scene.OnRightMouseDown(); UIManager.OnRightMouseButtonDown(); } else { Mouse.LastRightButtonClickTime = 0xFFFF_FFFF; } break; } _scene.OnRightMouseDown(); UIManager.OnRightMouseButtonDown(); Mouse.LastRightButtonClickTime = Mouse.CancelDoubleClick ? 0 : ticks; } else { if (Mouse.LastRightButtonClickTime != 0xFFFF_FFFF) { if (!UIManager.HadMouseDownOnGump(MouseButtonType.Right)) { _scene.OnRightMouseUp(); } UIManager.OnRightMouseButtonUp(); } Mouse.RButtonPressed = false; Mouse.End(); } break; case SDL_BUTTON_X1: case SDL_BUTTON_X2: if (isDown) { Mouse.Begin(); Mouse.XButtonPressed = true; Mouse.CancelDoubleClick = false; Plugin.ProcessMouse(e->button.button, 0); _scene.OnExtraMouseDown(mouse.button - 1); UIManager.OnExtraMouseButtonDown(mouse.button - 1); } else { if (!UIManager.HadMouseDownOnGump(MouseButtonType.XButton1) && !UIManager.HadMouseDownOnGump(MouseButtonType.XButton2)) { _scene.OnExtraMouseUp(mouse.button - 1); } UIManager.OnExtraMouseButtonUp(mouse.button - 1); Mouse.XButtonPressed = false; Mouse.End(); } break; } break; } return(0); }
private void SimulateMouse(bool leftMouseDown, bool leftMouseHeld, bool leftMouseUp, bool rightMouseDown, bool rightMouseHeld, bool rightMouseUp, bool mouseMotion) { Mouse.LButtonPressed = leftMouseDown || leftMouseHeld; Mouse.RButtonPressed = rightMouseDown || rightMouseHeld; Mouse.IsDragging = Mouse.LButtonPressed || Mouse.RButtonPressed; Mouse.RealPosition = Mouse.Position; if (_dragStarted && !Mouse.LButtonPressed) { _dragStarted = false; } if (leftMouseDown) { Mouse.Begin(); Mouse.LDropPosition = Mouse.Position; Mouse.CancelDoubleClick = false; uint ticks = Time.Ticks; if (Mouse.LastLeftButtonClickTime + Mouse.MOUSE_DELAY_DOUBLE_CLICK >= ticks) { Mouse.LastLeftButtonClickTime = 0; bool res = _scene.OnLeftMouseDoubleClick() || UIManager.OnLeftMouseDoubleClick(); if (!res) { if (!_scene.OnLeftMouseDown()) { UIManager.OnLeftMouseButtonDown(); } } else { Mouse.LastLeftButtonClickTime = 0xFFFF_FFFF; } } else { if (!_scene.OnLeftMouseDown()) { UIManager.OnLeftMouseButtonDown(); } Mouse.LastLeftButtonClickTime = Mouse.CancelDoubleClick ? 0 : ticks; } } else if (leftMouseUp) { if (Mouse.LastLeftButtonClickTime != 0xFFFF_FFFF) { if (!_scene.OnLeftMouseUp() || UIManager.LastControlMouseDown(MouseButtonType.Left) != null) { UIManager.OnLeftMouseButtonUp(); } } Mouse.End(); } if (rightMouseDown) { Mouse.Begin(); Mouse.RDropPosition = Mouse.Position; Mouse.CancelDoubleClick = false; uint ticks = Time.Ticks; if (Mouse.LastRightButtonClickTime + Mouse.MOUSE_DELAY_DOUBLE_CLICK >= ticks) { Mouse.LastRightButtonClickTime = 0; bool res = _scene.OnRightMouseDoubleClick() || UIManager.OnRightMouseDoubleClick(); if (!res) { if (!_scene.OnRightMouseDown()) { UIManager.OnRightMouseButtonDown(); } } else { Mouse.LastRightButtonClickTime = 0xFFFF_FFFF; } } else { if (!_scene.OnRightMouseDown()) { UIManager.OnRightMouseButtonDown(); } Mouse.LastRightButtonClickTime = Mouse.CancelDoubleClick ? 0 : ticks; } } else if (rightMouseUp) { if (Mouse.LastRightButtonClickTime != 0xFFFF_FFFF) { if (!_scene.OnRightMouseUp()) { UIManager.OnRightMouseButtonUp(); } } Mouse.End(); } if (mouseMotion) { if (Mouse.IsDragging) { if (!_scene.OnMouseDragging()) { UIManager.OnMouseDragging(); } } if (Mouse.IsDragging && !_dragStarted) { _dragStarted = true; } } }
private void UnityInputUpdate() { //Mouse handling var oneOverScale = 1f / scale; Mouse.Position.X = UnityEngine.Mathf.RoundToInt(UnityEngine.Input.mousePosition.x * oneOverScale); Mouse.Position.Y = UnityEngine.Mathf.RoundToInt((UnityEngine.Screen.height - UnityEngine.Input.mousePosition.y) * oneOverScale); Mouse.RealPosition = Mouse.Position; var leftMouseDown = UnityEngine.Input.GetMouseButtonDown(0); var leftMouseHeld = UnityEngine.Input.GetMouseButton(0); var leftMouseUp = UnityEngine.Input.GetMouseButtonUp(0); var rightMouseDown = UnityEngine.Input.GetMouseButtonDown(1); var rightMouseHeld = UnityEngine.Input.GetMouseButton(1); var rightMouseUp = UnityEngine.Input.GetMouseButtonUp(1); if (MouseOverGui) { Mouse.Position.X = 0; Mouse.Position.Y = 0; leftMouseDown = false; leftMouseHeld = false; leftMouseUp = false; rightMouseDown = false; rightMouseHeld = false; rightMouseUp = false; } Mouse.LButtonPressed = leftMouseDown || leftMouseHeld; Mouse.RButtonPressed = rightMouseDown || rightMouseHeld; Mouse.MButtonPressed = UnityEngine.Input.GetMouseButtonDown(2) || UnityEngine.Input.GetMouseButton(2); Mouse.IsDragging = Mouse.LButtonPressed || Mouse.RButtonPressed || Mouse.MButtonPressed; Mouse.RealPosition = Mouse.Position; //Added additional check for mouseWasDown because otherwise, on mobile, tapping somewhere would immediately //set mouseMotion to true since the previous tap position was almost guaranteed to be at another position //due to input inaccuracy. We do not want a new tap to be recognized as a mouseMotion. var mouseMotion = UnityEngine.Input.mousePosition != lastMousePosition && mouseWasDown; lastMousePosition = UnityEngine.Input.mousePosition; if (_dragStarted && !Mouse.LButtonPressed) { _dragStarted = false; } if (leftMouseDown) { mouseWasDown = true; Mouse.Begin(); Mouse.LDropPosition = Mouse.Position; Mouse.CancelDoubleClick = false; uint ticks = Time.Ticks; if (Mouse.LastLeftButtonClickTime + Mouse.MOUSE_DELAY_DOUBLE_CLICK >= ticks) { Mouse.LastLeftButtonClickTime = 0; bool res = UIManager.ValidForDClick() ? UIManager.OnLeftMouseDoubleClick() : _scene.OnLeftMouseDoubleClick(); if (!res) { _scene.OnLeftMouseDown(); UIManager.OnLeftMouseButtonDown(); } else { Mouse.LastLeftButtonClickTime = 0xFFFF_FFFF; } } else { _scene.OnLeftMouseDown(); UIManager.OnLeftMouseButtonDown(); Mouse.LastLeftButtonClickTime = Mouse.CancelDoubleClick ? 0 : ticks; } } else if (leftMouseUp) { mouseWasDown = false; if (Mouse.LastLeftButtonClickTime != 0xFFFF_FFFF) { if (!UIManager.HadMouseDownOnGump(MouseButtonType.Left)) { _scene.OnLeftMouseUp(); } UIManager.OnLeftMouseButtonUp(); } Mouse.End(); } if (rightMouseDown) { Mouse.Begin(); Mouse.RDropPosition = Mouse.Position; Mouse.CancelDoubleClick = false; uint ticks = Time.Ticks; if (Mouse.LastRightButtonClickTime + Mouse.MOUSE_DELAY_DOUBLE_CLICK >= ticks) { Mouse.LastRightButtonClickTime = 0; bool res = _scene.OnRightMouseDoubleClick() || UIManager.OnRightMouseDoubleClick(); if (!res) { _scene.OnRightMouseDown(); UIManager.OnRightMouseButtonDown(); } else { Mouse.LastRightButtonClickTime = 0xFFFF_FFFF; } } else { _scene.OnRightMouseDown(); UIManager.OnRightMouseButtonDown(); Mouse.LastRightButtonClickTime = Mouse.CancelDoubleClick ? 0 : ticks; } } else if (rightMouseUp) { if (Mouse.LastRightButtonClickTime != 0xFFFF_FFFF) { if (!UIManager.HadMouseDownOnGump(MouseButtonType.Right)) { _scene.OnRightMouseUp(); } UIManager.OnRightMouseButtonUp(); } Mouse.End(); } if (mouseMotion) { if (Mouse.IsDragging) { UIManager.OnMouseDragging(); _scene.OnMouseDragging(); } if (Mouse.IsDragging && !_dragStarted) { _dragStarted = true; } } //Keyboard handling var keymod = SDL.SDL_Keymod.KMOD_NONE; if (UnityEngine.Input.GetKey(UnityEngine.KeyCode.LeftAlt)) { keymod |= SDL_Keymod.KMOD_LALT; } if (UnityEngine.Input.GetKey(UnityEngine.KeyCode.RightAlt)) { keymod |= SDL_Keymod.KMOD_RALT; } if (UnityEngine.Input.GetKey(UnityEngine.KeyCode.LeftShift)) { keymod |= SDL_Keymod.KMOD_LSHIFT; } if (UnityEngine.Input.GetKey(UnityEngine.KeyCode.RightShift)) { keymod |= SDL_Keymod.KMOD_RSHIFT; } if (UnityEngine.Input.GetKey(UnityEngine.KeyCode.LeftControl)) { keymod |= SDL_Keymod.KMOD_LCTRL; } if (UnityEngine.Input.GetKey(UnityEngine.KeyCode.RightControl)) { keymod |= SDL_Keymod.KMOD_RCTRL; } foreach (var keyCode in _keyCodeEnumValues) { if (UnityEngine.Input.GetKeyDown(keyCode)) { var key = new SDL_KeyboardEvent() { keysym = new SDL_Keysym() { sym = (SDL_Keycode)keyCode, mod = keymod } }; Keyboard.OnKeyDown(key); if (Plugin.ProcessHotkeys((int)key.keysym.sym, (int)key.keysym.mod, true)) { _ignoreNextTextInput = false; //UIManager.MouseOverControl?.InvokeKeyDown(e.key.keysym.sym, e.key.keysym.mod); //if (UIManager.MouseOverControl != UIManager.KeyboardFocusControl) UIManager.KeyboardFocusControl?.InvokeKeyDown(key.keysym.sym, key.keysym.mod); _scene.OnKeyDown(key); } else { _ignoreNextTextInput = true; } } if (UnityEngine.Input.GetKeyUp(keyCode)) { var key = new SDL_KeyboardEvent() { keysym = new SDL_Keysym() { sym = (SDL_Keycode)keyCode } }; Keyboard.OnKeyUp(key); UIManager.KeyboardFocusControl?.InvokeKeyUp(key.keysym.sym, key.keysym.mod); _scene.OnKeyUp(key); } } //Input text handling if (UnityEngine.Application.isMobilePlatform) { var text = TouchScreenKeyboard?.text; if (_ignoreNextTextInput == false && string.IsNullOrEmpty(text) == false && TouchScreenKeyboard?.status == UnityEngine.TouchScreenKeyboard.Status.Done) { //Need to clear the existing text in textbox before "pasting" new text from TouchScreenKeyboard if (UIManager.KeyboardFocusControl is AbstractTextBox abstractTextBox) { abstractTextBox.EntryValue.Clear(); } UIManager.KeyboardFocusControl?.InvokeTextInput(text); _scene.OnTextInput(text); //When targeting SystemChat textbox, "auto-press" return key so that the text entered on the TouchScreenKeyboard is submitted right away if (UIManager.KeyboardFocusControl != null && UIManager.KeyboardFocusControl == UIManager.SystemChat?.TextBoxControl) { UIManager.KeyboardFocusControl.InvokeKeyDown(SDL_Keycode.SDLK_RETURN, SDL_Keymod.KMOD_NONE); } //Clear the text of TouchScreenKeyboard, otherwise it stays there and is re-evaluated every frame TouchScreenKeyboard.text = string.Empty; } } else { var text = UnityEngine.Input.inputString; if (_ignoreNextTextInput == false && string.IsNullOrEmpty(text) == false) { UIManager.KeyboardFocusControl?.InvokeTextInput(text); _scene.OnTextInput(text); } } }
private unsafe void HandleSDLEvent(ref SDL.SDL_Event e) { switch (e.type) { case SDL.SDL_EventType.SDL_AUDIODEVICEADDED: Console.WriteLine("AUDIO ADDED: {0}", e.adevice.which); break; case SDL.SDL_EventType.SDL_AUDIODEVICEREMOVED: Console.WriteLine("AUDIO REMOVED: {0}", e.adevice.which); break; case SDL.SDL_EventType.SDL_WINDOWEVENT: switch (e.window.windowEvent) { case SDL_WindowEventID.SDL_WINDOWEVENT_MOVED: break; case SDL.SDL_WindowEventID.SDL_WINDOWEVENT_ENTER: Mouse.MouseInWindow = true; break; case SDL.SDL_WindowEventID.SDL_WINDOWEVENT_LEAVE: Mouse.MouseInWindow = false; break; case SDL.SDL_WindowEventID.SDL_WINDOWEVENT_FOCUS_GAINED: Plugin.OnFocusGained(); // SDL_CaptureMouse(SDL_bool.SDL_TRUE); //Log.Debug("FOCUS"); break; case SDL.SDL_WindowEventID.SDL_WINDOWEVENT_FOCUS_LOST: Plugin.OnFocusLost(); //Log.Debug("NO FOCUS"); //SDL_CaptureMouse(SDL_bool.SDL_FALSE); break; case SDL.SDL_WindowEventID.SDL_WINDOWEVENT_TAKE_FOCUS: //Log.Debug("TAKE FOCUS"); break; case SDL.SDL_WindowEventID.SDL_WINDOWEVENT_HIT_TEST: break; } break; case SDL.SDL_EventType.SDL_SYSWMEVENT: break; case SDL.SDL_EventType.SDL_KEYDOWN: Keyboard.OnKeyDown(e.key); if (Plugin.ProcessHotkeys((int)e.key.keysym.sym, (int)e.key.keysym.mod, true)) { _ignoreNextTextInput = false; //UIManager.MouseOverControl?.InvokeKeyDown(e.key.keysym.sym, e.key.keysym.mod); //if (UIManager.MouseOverControl != UIManager.KeyboardFocusControl) UIManager.KeyboardFocusControl?.InvokeKeyDown(e.key.keysym.sym, e.key.keysym.mod); _scene.OnKeyDown(e.key); } else { _ignoreNextTextInput = true; } break; case SDL.SDL_EventType.SDL_KEYUP: Keyboard.OnKeyUp(e.key); //if (e.key.keysym.sym == SDL_Keycode.SDLK_0) //{ // byte[] firebreathcode = { // 0xC0, // 0x00, 0x00, 0x00, 0x00 , // source serial // 0x00 ,0x00 ,0x00 , 0x00, // target serial // 0x00, 0xAA, // graphic // 0xAC, 0x06, // src X // 0x74, 0x06, // src Y // 0x28, // src Z // 0x3F, 0x06, // targ X // 0x74, 0x06, // targY // 0x2B, // targZ // 0x3F, 0x01, 0xF0 , 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ,0x00, 0x00, // 0x00, 0x00, 0x00, 0x00, // }; // int xx = (0x06 << 8) | (0xAC ) ; // int yy = (0x06 << 8) | (0x74 ) ; // int txx = (0x06 << 8) | (0x3F); // int tyy = (0x06 << 8) | (0x74 ); // NetClient.EnqueuePacketFromPlugin(firebreathcode, 36); //} //UIManager.MouseOverControl?.InvokeKeyUp(e.key.keysym.sym, e.key.keysym.mod); //if (UIManager.MouseOverControl != UIManager.KeyboardFocusControl) UIManager.KeyboardFocusControl?.InvokeKeyUp(e.key.keysym.sym, e.key.keysym.mod); _scene.OnKeyUp(e.key); break; case SDL.SDL_EventType.SDL_TEXTINPUT: if (_ignoreNextTextInput) break; fixed(SDL.SDL_Event *ev = &e) { string s = StringHelper.ReadUTF8(ev->text.text); if (!string.IsNullOrEmpty(s)) { UIManager.KeyboardFocusControl?.InvokeTextInput(s); _scene.OnTextInput(s); } } break; case SDL.SDL_EventType.SDL_MOUSEMOTION: Mouse.Update(); if (Mouse.IsDragging) { UIManager.OnMouseDragging(); _scene.OnMouseDragging(); } if (Mouse.IsDragging && !_dragStarted) { _dragStarted = true; } break; case SDL.SDL_EventType.SDL_MOUSEWHEEL: Mouse.Update(); bool isup = e.wheel.y > 0; Plugin.ProcessMouse(0, e.wheel.y); UIManager.OnMouseWheel(isup); _scene.OnMouseWheel(isup); break; case SDL.SDL_EventType.SDL_MOUSEBUTTONUP: case SDL.SDL_EventType.SDL_MOUSEBUTTONDOWN: Mouse.Update(); bool isDown = e.type == SDL.SDL_EventType.SDL_MOUSEBUTTONDOWN; bool resetTime = false; if (_dragStarted && !isDown) { _dragStarted = false; resetTime = true; } SDL.SDL_MouseButtonEvent mouse = e.button; switch ((uint)mouse.button) { case SDL_BUTTON_LEFT: if (isDown) { Mouse.Begin(); Mouse.LButtonPressed = true; Mouse.LDropPosition = Mouse.Position; Mouse.CancelDoubleClick = false; uint ticks = SDL_GetTicks(); if (Mouse.LastLeftButtonClickTime + Mouse.MOUSE_DELAY_DOUBLE_CLICK >= ticks) { Mouse.LastLeftButtonClickTime = 0; bool res; if (UIManager.ValidForDClick()) { res = UIManager.OnLeftMouseDoubleClick(); } else { res = _scene.OnLeftMouseDoubleClick(); } //bool res = _scene.OnLeftMouseDoubleClick() || UIManager.OnLeftMouseDoubleClick(); MouseDoubleClickEventArgs arg = new MouseDoubleClickEventArgs(Mouse.Position.X, Mouse.Position.Y, MouseButton.Left); if (!arg.Result && !res) { _scene.OnLeftMouseDown(); UIManager.OnLeftMouseButtonDown(); } else { Mouse.LastLeftButtonClickTime = 0xFFFF_FFFF; } break; } _scene.OnLeftMouseDown(); UIManager.OnLeftMouseButtonDown(); Mouse.LastLeftButtonClickTime = Mouse.CancelDoubleClick ? 0 : ticks; } else { if (resetTime) { Mouse.LastLeftButtonClickTime = 0; } if (Mouse.LastLeftButtonClickTime != 0xFFFF_FFFF) { _scene.OnLeftMouseUp(); UIManager.OnLeftMouseButtonUp(); } Mouse.LButtonPressed = false; Mouse.End(); Mouse.LastClickPosition = Mouse.Position; } break; case SDL_BUTTON_MIDDLE: if (isDown) { Mouse.Begin(); Mouse.MButtonPressed = true; Mouse.MDropPosition = Mouse.Position; Mouse.CancelDoubleClick = false; uint ticks = SDL_GetTicks(); if (Mouse.LastMidButtonClickTime + Mouse.MOUSE_DELAY_DOUBLE_CLICK >= ticks) { Mouse.LastMidButtonClickTime = 0; var res = _scene.OnMiddleMouseDoubleClick(); MouseDoubleClickEventArgs arg = new MouseDoubleClickEventArgs(Mouse.Position.X, Mouse.Position.Y, MouseButton.Middle); if (!arg.Result && !res) { _scene.OnMiddleMouseDown(); } break; } Plugin.ProcessMouse(e.button.button, 0); _scene.OnMiddleMouseDown(); Mouse.LastMidButtonClickTime = Mouse.CancelDoubleClick ? 0 : ticks; } else { Mouse.MButtonPressed = false; Mouse.End(); } break; case SDL_BUTTON_RIGHT: if (isDown) { Mouse.Begin(); Mouse.RButtonPressed = true; Mouse.RDropPosition = Mouse.Position; Mouse.CancelDoubleClick = false; uint ticks = SDL_GetTicks(); if (Mouse.LastRightButtonClickTime + Mouse.MOUSE_DELAY_DOUBLE_CLICK >= ticks) { Mouse.LastRightButtonClickTime = 0; var res = _scene.OnRightMouseDoubleClick() || UIManager.OnRightMouseDoubleClick(); MouseDoubleClickEventArgs arg = new MouseDoubleClickEventArgs(Mouse.Position.X, Mouse.Position.Y, MouseButton.Right); if (!arg.Result && !res) { _scene.OnRightMouseDown(); UIManager.OnRightMouseButtonDown(); } else { Mouse.LastRightButtonClickTime = 0xFFFF_FFFF; } break; } _scene.OnRightMouseDown(); UIManager.OnRightMouseButtonDown(); Mouse.LastRightButtonClickTime = Mouse.CancelDoubleClick ? 0 : ticks; } else { if (resetTime) { Mouse.LastRightButtonClickTime = 0; } if (Mouse.LastRightButtonClickTime != 0xFFFF_FFFF) { _scene.OnRightMouseUp(); UIManager.OnRightMouseButtonUp(); } Mouse.RButtonPressed = false; Mouse.End(); } break; case SDL_BUTTON_X1: if (isDown) { Plugin.ProcessMouse(e.button.button, 0); } break; case SDL_BUTTON_X2: if (isDown) { Plugin.ProcessMouse(e.button.button, 0); } break; } break; } }
private int HandleSdlEvent(IntPtr userData, IntPtr ptr) { SDL_Event *sdlEvent = (SDL_Event *)ptr; if (Plugin.ProcessWndProc(sdlEvent) != 0) { if (sdlEvent->type == SDL_EventType.SDL_MOUSEMOTION) { if (UIManager.GameCursor != null) { UIManager.GameCursor.AllowDrawSDLCursor = false; } } return(0); } switch (sdlEvent->type) { case SDL_EventType.SDL_AUDIODEVICEADDED: Console.WriteLine("AUDIO ADDED: {0}", sdlEvent->adevice.which); break; case SDL_EventType.SDL_AUDIODEVICEREMOVED: Console.WriteLine("AUDIO REMOVED: {0}", sdlEvent->adevice.which); break; case SDL_EventType.SDL_WINDOWEVENT: switch (sdlEvent->window.windowEvent) { case SDL_WindowEventID.SDL_WINDOWEVENT_ENTER: Mouse.MouseInWindow = true; break; case SDL_WindowEventID.SDL_WINDOWEVENT_LEAVE: Mouse.MouseInWindow = false; break; case SDL_WindowEventID.SDL_WINDOWEVENT_FOCUS_GAINED: Plugin.OnFocusGained(); break; case SDL_WindowEventID.SDL_WINDOWEVENT_FOCUS_LOST: Plugin.OnFocusLost(); break; } break; case SDL_EventType.SDL_KEYDOWN: Keyboard.OnKeyDown(sdlEvent->key); if (Plugin.ProcessHotkeys((int)sdlEvent->key.keysym.sym, (int)sdlEvent->key.keysym.mod, true)) { _ignoreNextTextInput = false; UIManager.KeyboardFocusControl?.InvokeKeyDown(sdlEvent->key.keysym.sym, sdlEvent->key.keysym.mod); Scene.OnKeyDown(sdlEvent->key); } else { _ignoreNextTextInput = true; } break; case SDL_EventType.SDL_KEYUP: Keyboard.OnKeyUp(sdlEvent->key); UIManager.KeyboardFocusControl?.InvokeKeyUp(sdlEvent->key.keysym.sym, sdlEvent->key.keysym.mod); Scene.OnKeyUp(sdlEvent->key); Plugin.ProcessHotkeys(0, 0, false); if (sdlEvent->key.keysym.sym == SDL_Keycode.SDLK_PRINTSCREEN) { TakeScreenshot(); } break; case SDL_EventType.SDL_TEXTINPUT: if (_ignoreNextTextInput) { break; } string s = StringHelper.ReadUTF8(sdlEvent->text.text); if (!string.IsNullOrEmpty(s)) { UIManager.KeyboardFocusControl?.InvokeTextInput(s); Scene.OnTextInput(s); } break; case SDL_EventType.SDL_MOUSEMOTION: if (UIManager.GameCursor != null && !UIManager.GameCursor.AllowDrawSDLCursor) { UIManager.GameCursor.AllowDrawSDLCursor = true; UIManager.GameCursor.Graphic = 0xFFFF; } Mouse.Update(); if (Mouse.IsDragging) { if (!Scene.OnMouseDragging()) { UIManager.OnMouseDragging(); } } if (Mouse.IsDragging && !_dragStarted) { _dragStarted = true; } break; case SDL_EventType.SDL_MOUSEWHEEL: Mouse.Update(); bool isScrolledUp = sdlEvent->wheel.y > 0; Plugin.ProcessMouse(0, sdlEvent->wheel.y); if (!Scene.OnMouseWheel(isScrolledUp)) { UIManager.OnMouseWheel(isScrolledUp); } break; case SDL_EventType.SDL_MOUSEBUTTONUP: case SDL_EventType.SDL_MOUSEBUTTONDOWN: Mouse.Update(); bool isDown = sdlEvent->type == SDL_EventType.SDL_MOUSEBUTTONDOWN; if (_dragStarted && !isDown) { _dragStarted = false; } SDL_MouseButtonEvent mouse = sdlEvent->button; switch ((uint)mouse.button) { case SDL_BUTTON_LEFT: if (isDown) { Mouse.Begin(); Mouse.LButtonPressed = true; Mouse.LDropPosition = Mouse.Position; Mouse.CancelDoubleClick = false; uint ticks = Time.Ticks; if (Mouse.LastLeftButtonClickTime + Mouse.MOUSE_DELAY_DOUBLE_CLICK >= ticks) { Mouse.LastLeftButtonClickTime = 0; bool res = Scene.OnLeftMouseDoubleClick() || UIManager.OnLeftMouseDoubleClick(); if (!res) { if (!Scene.OnLeftMouseDown()) { UIManager.OnLeftMouseButtonDown(); } } else { Mouse.LastLeftButtonClickTime = 0xFFFF_FFFF; } break; } if (!Scene.OnLeftMouseDown()) { UIManager.OnLeftMouseButtonDown(); } Mouse.LastLeftButtonClickTime = Mouse.CancelDoubleClick ? 0 : ticks; } else { if (Mouse.LastLeftButtonClickTime != 0xFFFF_FFFF) { if (!Scene.OnLeftMouseUp() || UIManager.LastControlMouseDown(MouseButtonType.Left) != null) { UIManager.OnLeftMouseButtonUp(); } } Mouse.LButtonPressed = false; Mouse.End(); } break; case SDL_BUTTON_MIDDLE: if (isDown) { Mouse.Begin(); Mouse.MButtonPressed = true; Mouse.MDropPosition = Mouse.Position; Mouse.CancelDoubleClick = false; uint ticks = Time.Ticks; if (Mouse.LastMidButtonClickTime + Mouse.MOUSE_DELAY_DOUBLE_CLICK >= ticks) { Mouse.LastMidButtonClickTime = 0; bool res = Scene.OnMiddleMouseDoubleClick() || UIManager.OnMiddleMouseDoubleClick(); if (!res) { if (!Scene.OnMiddleMouseDown()) { UIManager.OnMiddleMouseButtonDown(); } } else { Mouse.LastMidButtonClickTime = 0xFFFF_FFFF; } break; } Plugin.ProcessMouse(sdlEvent->button.button, 0); if (!Scene.OnMiddleMouseDown()) { UIManager.OnMiddleMouseButtonDown(); } Mouse.LastMidButtonClickTime = Mouse.CancelDoubleClick ? 0 : ticks; } else { if (Mouse.LastMidButtonClickTime != 0xFFFF_FFFF) { if (!Scene.OnMiddleMouseUp()) { UIManager.OnMiddleMouseButtonUp(); } } Mouse.MButtonPressed = false; Mouse.End(); } break; case SDL_BUTTON_RIGHT: if (isDown) { Mouse.Begin(); Mouse.RButtonPressed = true; Mouse.RDropPosition = Mouse.Position; Mouse.CancelDoubleClick = false; uint ticks = Time.Ticks; if (Mouse.LastRightButtonClickTime + Mouse.MOUSE_DELAY_DOUBLE_CLICK >= ticks) { Mouse.LastRightButtonClickTime = 0; bool res = Scene.OnRightMouseDoubleClick() || UIManager.OnRightMouseDoubleClick(); if (!res) { if (!Scene.OnRightMouseDown()) { UIManager.OnRightMouseButtonDown(); } } else { Mouse.LastRightButtonClickTime = 0xFFFF_FFFF; } break; } if (!Scene.OnRightMouseDown()) { UIManager.OnRightMouseButtonDown(); } Mouse.LastRightButtonClickTime = Mouse.CancelDoubleClick ? 0 : ticks; } else { if (Mouse.LastRightButtonClickTime != 0xFFFF_FFFF) { if (!Scene.OnRightMouseUp()) { UIManager.OnRightMouseButtonUp(); } } Mouse.RButtonPressed = false; Mouse.End(); } break; case SDL_BUTTON_X1: case SDL_BUTTON_X2: if (isDown) { Mouse.Begin(); Mouse.XButtonPressed = true; Mouse.CancelDoubleClick = false; Plugin.ProcessMouse(sdlEvent->button.button, 0); if (!Scene.OnExtraMouseDown(mouse.button - 1)) { UIManager.OnExtraMouseButtonDown(mouse.button - 1); } // TODO: doubleclick? } else { if (!Scene.OnExtraMouseUp(mouse.button - 1)) { UIManager.OnExtraMouseButtonUp(mouse.button - 1); } Mouse.XButtonPressed = false; Mouse.End(); } break; } break; } return(0); }