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; } // Fix for linux OS: https://github.com/andreakarasho/ClassicUO/pull/1263 if (Keyboard.Alt || Keyboard.Ctrl) { break; } string s = UTF8_ToManaged((IntPtr)sdlEvent->text.text, false); 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_MOUSEBUTTONDOWN: { Mouse.Update(); SDL_MouseButtonEvent mouse = sdlEvent->button; // The values in MouseButtonType are chosen to exactly match the SDL values MouseButtonType buttonType = (MouseButtonType)mouse.button; uint lastClickTime = 0; switch (buttonType) { case MouseButtonType.Left: lastClickTime = Mouse.LastLeftButtonClickTime; break; case MouseButtonType.Middle: lastClickTime = Mouse.LastMidButtonClickTime; break; case MouseButtonType.Right: lastClickTime = Mouse.LastRightButtonClickTime; break; } Mouse.ButtonPress(buttonType); uint ticks = Time.Ticks; if (lastClickTime + Mouse.MOUSE_DELAY_DOUBLE_CLICK >= ticks) { lastClickTime = 0; bool res = Scene.OnMouseDoubleClick(buttonType) || UIManager.OnMouseDoubleClick(buttonType); if (!res) { if (!Scene.OnMouseDown(buttonType)) { UIManager.OnMouseButtonDown(buttonType); } } else { lastClickTime = 0xFFFF_FFFF; } } else { if (buttonType != MouseButtonType.Left && buttonType != MouseButtonType.Right) { Plugin.ProcessMouse(sdlEvent->button.button, 0); } if (!Scene.OnMouseDown(buttonType)) { UIManager.OnMouseButtonDown(buttonType); } lastClickTime = Mouse.CancelDoubleClick ? 0 : ticks; } switch (buttonType) { case MouseButtonType.Left: Mouse.LastLeftButtonClickTime = lastClickTime; break; case MouseButtonType.Middle: Mouse.LastMidButtonClickTime = lastClickTime; break; case MouseButtonType.Right: Mouse.LastRightButtonClickTime = lastClickTime; break; } break; } case SDL_EventType.SDL_MOUSEBUTTONUP: { Mouse.Update(); if (_dragStarted) { _dragStarted = false; } SDL_MouseButtonEvent mouse = sdlEvent->button; // The values in MouseButtonType are chosen to exactly match the SDL values MouseButtonType buttonType = (MouseButtonType)mouse.button; uint lastClickTime = 0; switch (buttonType) { case MouseButtonType.Left: lastClickTime = Mouse.LastLeftButtonClickTime; break; case MouseButtonType.Middle: lastClickTime = Mouse.LastMidButtonClickTime; break; case MouseButtonType.Right: lastClickTime = Mouse.LastRightButtonClickTime; break; } if (lastClickTime != 0xFFFF_FFFF) { if (!Scene.OnMouseUp(buttonType) || UIManager.LastControlMouseDown(buttonType) != null) { UIManager.OnMouseButtonUp(buttonType); } } Mouse.ButtonRelease(buttonType); break; } } return(0); }
//private unsafe int HookFunc(IntPtr userdata, IntPtr ev) public unsafe void EventHandler(ref SDL_Event e) { // SDL_Event* e = (SDL_Event*) ev; switch (e.type) { case SDL_EventType.SDL_AUDIODEVICEADDED: Console.WriteLine("AUDIO ADDED: {0}", e.adevice.which); break; case SDL_EventType.SDL_AUDIODEVICEREMOVED: Console.WriteLine("AUDIO REMOVED: {0}", e.adevice.which); break; case SDL_EventType.SDL_WINDOWEVENT: switch (e.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(); // SDL_CaptureMouse(SDL_bool.SDL_TRUE); //Log.Message(LogTypes.Debug, "FOCUS"); break; case SDL_WindowEventID.SDL_WINDOWEVENT_FOCUS_LOST: Plugin.OnFocusLost(); //Log.Message(LogTypes.Debug, "NO FOCUS"); //SDL_CaptureMouse(SDL_bool.SDL_FALSE); break; case SDL_WindowEventID.SDL_WINDOWEVENT_TAKE_FOCUS: //Log.Message(LogTypes.Debug, "TAKE FOCUS"); break; case SDL_WindowEventID.SDL_WINDOWEVENT_HIT_TEST: break; } break; case SDL_EventType.SDL_SYSWMEVENT: break; case SDL_EventType.SDL_KEYDOWN: if (Plugin.ProcessHotkeys((int)e.key.keysym.sym, (int)e.key.keysym.mod, true)) { _ignoreNextTextInput = false; Engine.SceneManager.CurrentScene.OnKeyDown(e.key); KeyDown?.Raise(e.key); } else { _ignoreNextTextInput = true; } break; case SDL_EventType.SDL_KEYUP: Engine.SceneManager.CurrentScene.OnKeyUp(e.key); KeyUp.Raise(e.key); break; case SDL_EventType.SDL_TEXTINPUT: if (_ignoreNextTextInput) break; fixed(SDL_Event *ev = &e) { string s = StringHelper.ReadUTF8(ev->text.text); if (!string.IsNullOrEmpty(s)) { Engine.SceneManager.CurrentScene.OnTextInput(s); TextInput.Raise(s); } } break; case SDL_EventType.SDL_MOUSEMOTION: Mouse.Update(); if (Mouse.IsDragging) { Engine.SceneManager.CurrentScene.OnMouseDragging(); MouseDragging.Raise(); } if (Mouse.IsDragging && !_dragStarted) { DragBegin.Raise(); _dragStarted = true; } break; case SDL_EventType.SDL_MOUSEWHEEL: Mouse.Update(); bool isup = e.wheel.y > 0; Plugin.ProcessMouse(0, e.wheel.y); Engine.SceneManager.CurrentScene.OnMouseWheel(isup); MouseWheel.Raise(isup); break; case SDL_EventType.SDL_MOUSEBUTTONUP: case SDL_EventType.SDL_MOUSEBUTTONDOWN: Mouse.Update(); bool isDown = e.type == SDL_EventType.SDL_MOUSEBUTTONDOWN; bool resetTime = false; if (_dragStarted && !isDown) { DragEnd.Raise(); _dragStarted = false; resetTime = true; } 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; var res = Engine.SceneManager.CurrentScene.OnLeftMouseDoubleClick(); MouseDoubleClickEventArgs arg = new MouseDoubleClickEventArgs(Mouse.Position.X, Mouse.Position.Y, MouseButton.Left); LeftMouseDoubleClick.Raise(arg); if (!arg.Result && !res) { Engine.SceneManager.CurrentScene.OnLeftMouseDown(); LeftMouseButtonDown.Raise(); } else { Mouse.LastLeftButtonClickTime = 0xFFFF_FFFF; } break; } Engine.SceneManager.CurrentScene.OnLeftMouseDown(); LeftMouseButtonDown.Raise(); Mouse.LastLeftButtonClickTime = Mouse.CancelDoubleClick ? 0 : ticks; } else { if (resetTime) { Mouse.LastLeftButtonClickTime = 0; } if (Mouse.LastLeftButtonClickTime != 0xFFFF_FFFF) { Engine.SceneManager.CurrentScene.OnLeftMouseUp(); LeftMouseButtonUp.Raise(); } 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 = Engine.SceneManager.CurrentScene.OnMiddleMouseDoubleClick(); MouseDoubleClickEventArgs arg = new MouseDoubleClickEventArgs(Mouse.Position.X, Mouse.Position.Y, MouseButton.Middle); MidMouseDoubleClick.Raise(arg); if (!arg.Result && !res) { Engine.SceneManager.CurrentScene.OnMiddleMouseDown(); MidMouseButtonDown.Raise(); } break; } Plugin.ProcessMouse(e.button.button, 0); Engine.SceneManager.CurrentScene.OnMiddleMouseDown(); MidMouseButtonDown.Raise(); Mouse.LastMidButtonClickTime = Mouse.CancelDoubleClick ? 0 : ticks; } else { MidMouseButtonUp.Raise(); 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 = Engine.SceneManager.CurrentScene.OnRightMouseDoubleClick(); MouseDoubleClickEventArgs arg = new MouseDoubleClickEventArgs(Mouse.Position.X, Mouse.Position.Y, MouseButton.Right); RightMouseDoubleClick.Raise(arg); if (!arg.Result && !res) { Engine.SceneManager.CurrentScene.OnRightMouseDown(); RightMouseButtonDown.Raise(); } else { Mouse.LastRightButtonClickTime = 0xFFFF_FFFF; } break; } Engine.SceneManager.CurrentScene.OnRightMouseDown(); RightMouseButtonDown.Raise(); Mouse.LastRightButtonClickTime = Mouse.CancelDoubleClick ? 0 : ticks; } else { if (resetTime) { Mouse.LastRightButtonClickTime = 0; } if (Mouse.LastRightButtonClickTime != 0xFFFF_FFFF) { Engine.SceneManager.CurrentScene.OnRightMouseUp(); RightMouseButtonUp.Raise(); } 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; } }
public SdlMouseButtonEvent(SDL_MouseButtonEvent handle) { _handle = handle; }
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); }
private unsafe int HookFunc(IntPtr userdata, IntPtr ev) { SDL_Event *e = (SDL_Event *)ev; switch (e->type) { case SDL_EventType.SDL_WINDOWEVENT: switch (e->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(); // SDL_CaptureMouse(SDL_bool.SDL_TRUE); //Log.Message(LogTypes.Debug, "FOCUS"); break; case SDL_WindowEventID.SDL_WINDOWEVENT_FOCUS_LOST: Plugin.OnFocusLost(); //Log.Message(LogTypes.Debug, "NO FOCUS"); //SDL_CaptureMouse(SDL_bool.SDL_FALSE); break; case SDL_WindowEventID.SDL_WINDOWEVENT_TAKE_FOCUS: //Log.Message(LogTypes.Debug, "TAKE FOCUS"); break; case SDL_WindowEventID.SDL_WINDOWEVENT_HIT_TEST: break; } break; case SDL_EventType.SDL_SYSWMEVENT: break; case SDL_EventType.SDL_KEYDOWN: if (Plugin.ProcessHotkeys((int)e->key.keysym.sym, (int)e->key.keysym.mod, true)) { Keyboard.IgnoreNextTextInput = false; KeyDown?.Raise(e->key); } else { Keyboard.IgnoreNextTextInput = true; } break; case SDL_EventType.SDL_KEYUP: //if (Plugin.ProcessHotkeys((int)e->key.keysym.sym, (int)e->key.keysym.mod, false)) KeyUp.Raise(e->key); break; case SDL_EventType.SDL_TEXTINPUT: if (Keyboard.IgnoreNextTextInput) { break; } string s = StringHelper.ReadUTF8(e->text.text); if (!string.IsNullOrEmpty(s)) { TextInput.Raise(s); } break; case SDL_EventType.SDL_MOUSEMOTION: Mouse.Update(); MouseMoving.Raise(); if (Mouse.IsDragging) { MouseDragging.Raise(); } if (Mouse.IsDragging && !_dragStarted) { DragBegin.Raise(); _dragStarted = true; } break; case SDL_EventType.SDL_MOUSEWHEEL: Mouse.Update(); bool isup = e->wheel.y > 0; Plugin.ProcessMouse(0, e->wheel.y); MouseWheel.Raise(isup); break; case SDL_EventType.SDL_MOUSEBUTTONUP: case SDL_EventType.SDL_MOUSEBUTTONDOWN: Mouse.Update(); bool isDown = e->type == SDL_EventType.SDL_MOUSEBUTTONDOWN; if (_dragStarted && !isDown) { DragEnd.Raise(); _dragStarted = false; } 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; MouseDoubleClickEventArgs arg = new MouseDoubleClickEventArgs(Mouse.Position.X, Mouse.Position.Y, MouseButton.Left); LeftMouseDoubleClick.Raise(arg); if (!arg.Result) { LeftMouseButtonDown.Raise(); } else { Mouse.LastLeftButtonClickTime = 0xFFFF_FFFF; } break; } LeftMouseButtonDown.Raise(); Mouse.LastLeftButtonClickTime = Mouse.CancelDoubleClick ? 0 : ticks; } else { if (Mouse.LastLeftButtonClickTime != 0xFFFF_FFFF) { LeftMouseButtonUp.Raise(); } 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 = SDL_GetTicks(); if (Mouse.LastMidButtonClickTime + Mouse.MOUSE_DELAY_DOUBLE_CLICK >= ticks) { MouseDoubleClickEventArgs arg = new MouseDoubleClickEventArgs(Mouse.Position.X, Mouse.Position.Y, MouseButton.Middle); MidMouseDoubleClick.Raise(arg); if (!arg.Result) { MidMouseButtonDown.Raise(); } Mouse.LastMidButtonClickTime = 0; break; } Plugin.ProcessMouse(e->button.button, 0); MidMouseButtonDown.Raise(); Mouse.LastMidButtonClickTime = Mouse.CancelDoubleClick ? 0 : ticks; } else { MidMouseButtonUp.Raise(); 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; MouseDoubleClickEventArgs arg = new MouseDoubleClickEventArgs(Mouse.Position.X, Mouse.Position.Y, MouseButton.Middle); RightMouseDoubleClick.Raise(arg); if (!arg.Result) { RightMouseButtonDown.Raise(); } else { Mouse.LastRightButtonClickTime = 0xFFFF_FFFF; } break; } RightMouseButtonDown.Raise(); Mouse.LastRightButtonClickTime = Mouse.CancelDoubleClick ? 0 : ticks; } else { if (Mouse.LastRightButtonClickTime != 0xFFFF_FFFF) { RightMouseButtonUp.Raise(); } 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; } return(1); }
/// <summary> /// 直接转换相关事件 /// </summary> /// <param name="ev"></param> public static unsafe void HandleEvent(SDL_Event *ev) { if (_host == null) { return; } switch (ev->type) { case SDL_EventType.Quit: //Close(); break; case SDL_EventType.Terminating: //Close(); break; case SDL_EventType.WindowEvent: //SDL_WindowEvent windowEvent = Unsafe.Read<SDL_WindowEvent>(ev); //HandleWindowEvent(windowEvent); break; case SDL_EventType.KeyDown: case SDL_EventType.KeyUp: SDL_KeyboardEvent keyboardEvent = Unsafe.Read <SDL_KeyboardEvent>(ev); HandleKeyboardEvent(keyboardEvent); break; case SDL_EventType.TextEditing: break; case SDL_EventType.TextInput: SDL_TextInputEvent textInputEvent = Unsafe.Read <SDL_TextInputEvent>(ev); HandleTextInputEvent(textInputEvent); break; case SDL_EventType.KeyMapChanged: break; case SDL_EventType.MouseMotion: SDL_MouseMotionEvent mouseMotionEvent = Unsafe.Read <SDL_MouseMotionEvent>(ev); HandleMouseMotionEvent(mouseMotionEvent); break; case SDL_EventType.MouseButtonDown: case SDL_EventType.MouseButtonUp: SDL_MouseButtonEvent mouseButtonEvent = Unsafe.Read <SDL_MouseButtonEvent>(ev); HandleMouseButtonEvent(mouseButtonEvent); break; case SDL_EventType.MouseWheel: SDL_MouseWheelEvent mouseWheelEvent = Unsafe.Read <SDL_MouseWheelEvent>(ev); HandleMouseWheelEvent(mouseWheelEvent); break; case SDL_EventType.JoyAxisMotion: break; case SDL_EventType.JoyBallMotion: break; case SDL_EventType.JoyHatMotion: break; case SDL_EventType.JoyButtonDown: break; case SDL_EventType.JoyButtonUp: break; case SDL_EventType.JoyDeviceAdded: break; case SDL_EventType.JoyDeviceRemoved: break; case SDL_EventType.ControllerAxisMotion: break; case SDL_EventType.ControllerButtonDown: break; case SDL_EventType.ControllerButtonUp: break; case SDL_EventType.ControllerDeviceAdded: break; case SDL_EventType.ControllerDeviceRemoved: break; case SDL_EventType.ControllerDeviceRemapped: break; case SDL_EventType.FingerDown: break; case SDL_EventType.FingerUp: break; case SDL_EventType.FingerMotion: break; case SDL_EventType.DollarGesture: break; case SDL_EventType.DollarRecord: break; case SDL_EventType.MultiGesture: break; case SDL_EventType.ClipboardUpdate: break; case SDL_EventType.DropFile: break; case SDL_EventType.DropTest: break; case SDL_EventType.DropBegin: break; case SDL_EventType.DropComplete: break; case SDL_EventType.AudioDeviceAdded: break; case SDL_EventType.AudioDeviceRemoved: break; case SDL_EventType.RenderTargetsReset: break; case SDL_EventType.RenderDeviceReset: break; case SDL_EventType.UserEvent: break; case SDL_EventType.LastEvent: break; default: // Ignore break; } }