/// <summary> /// Setup the native platform and creates a window. /// </summary> /// <param name="config">Configuration for the platform - usually passed from the engine.</param> internal virtual void Setup(Configurator config) { OnMouseScroll.AddListener(scroll => { _mouseScrollAccum += scroll; return(true); }); PopulateKeyCodes(); SetupPlatform(config); // Check if the platform initialization was successful. if (Window == null) { Engine.SubmitError(new Exception("Platform couldn't create window.")); return; } if (Window.Context == null) { Engine.SubmitError(new Exception("Platform couldn't create context.")); return; } // Bind this window and its context. // "There /can/ be only one." Window.Context.MakeCurrent(); Gl.BindAPI(Window.Context.GetProcAddress); // Set display mode, show and focus. Window.DisplayMode = config.InitialDisplayMode; Window.WindowState = WindowState.Normal; // Attach default key behavior. OnKey.AddListener(DefaultButtonBehavior); IsSetup = true; IsOpen = true; }
protected void UpdateScroll(float amount) { _mouseScrollAccum += amount; OnMouseScroll.Invoke(amount); }
public override void PollEvents() { while (SDL.PollEvent(out ev) == 1) { switch (ev.Type) { case EventType.Quit: OnQuit?.Invoke(); break; case EventType.KeyDown: OnKeyDown?.Invoke(ev.Key.Keysym.Sym, ev.Key.Keysym.ScanCode); break; case EventType.KeyUp: OnKeyUp?.Invoke(ev.Key.Keysym.Sym, ev.Key.Keysym.ScanCode); break; case EventType.MouseMotion: OnMouseMove?.Invoke(ev.Motion.X, ev.Motion.Y); break; case EventType.MouseButtonDown: OnMouseButtonDown?.Invoke(ev.Button.Button); break; case EventType.MouseButtonUp: OnMouseButtonUp?.Invoke(ev.Button.Button); break; case EventType.MouseWheel: OnMouseScroll?.Invoke(ev.Wheel.X, ev.Wheel.Y); break; case EventType.JoyDeviceAdded: OnJoyDeviceAdd?.Invoke(ev.JDevice.Which); break; case EventType.JoyDeviceRemoved: OnJoyDeviceRemove?.Invoke(ev.JDevice.Which); break; case EventType.JoyButtonDown: OnJoyButtonDown?.Invoke(ev.JButton.Which, ev.JButton.Button); break; case EventType.JoyButtonUp: OnJoyButtonDown?.Invoke(ev.JButton.Which, ev.JButton.Button); break; case EventType.JoyAxisMotion: OnJoyAxisMove?.Invoke(ev.JAxis.Which, ev.JAxis.Axis, ev.JAxis.Value / (float)short.MaxValue); break; case EventType.WindowEvent: if (ev.Window.WindowID == windowID) { switch (ev.Window.Event) { case WindowEventID.Close: OnWinClose?.Invoke(); break; case WindowEventID.Shown: OnWinShown?.Invoke(); break; case WindowEventID.Hidden: OnWinHidden?.Invoke(); break; case WindowEventID.Exposed: OnWinExposed?.Invoke(); break; case WindowEventID.Moved: OnWinMoved?.Invoke(); break; case WindowEventID.Resized: OnWinResized?.Invoke(); break; case WindowEventID.Minimized: OnWinMinimized?.Invoke(); break; case WindowEventID.Maximized: OnWinMaximized?.Invoke(); break; case WindowEventID.Restored: OnWinRestored?.Invoke(); break; case WindowEventID.Enter: OnWinEnter?.Invoke(); break; case WindowEventID.Leave: OnWinLeave?.Invoke(); break; case WindowEventID.FocusGained: OnWinFocusGained?.Invoke(); break; case WindowEventID.FocusLost: OnWinFocusLost?.Invoke(); break; default: OnWinOtherEvent?.Invoke((int)ev.Window.Event); break; } } break; default: OnOtherEvent?.Invoke((int)ev.Type); break; } } }
private void TriggerMouseScroll(int value) { OnMouseScroll?.Invoke(value); }
public void MouseScroll(object sender, MouseEventArgs scrollEventArgs) { OnMouseScroll?.Invoke(sender, scrollEventArgs); }
/// <summary> /// mousehook callback happens. /// </summary> /// <param name="nCode"></param> /// <param name="wParam"></param> /// <param name="lParam"></param> /// <returns></returns> private IntPtr MHookCallback(int nCode, IntPtr wParam, IntPtr lParam) { if (nCode < 0) { return(CallNextHookEx(_kbHookID, nCode, wParam, lParam)); } MSLLHOOKSTRUCT hookStruct = (MSLLHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(MSLLHOOKSTRUCT)); switch ((int)wParam) { case WM_LBUTTONDOWN: MarkMouseButtonAsPressed(hookStruct, MouseEventArgs.Buttons.LMB, true); break; case WM_RBUTTONDOWN: MarkMouseButtonAsPressed(hookStruct, MouseEventArgs.Buttons.RMB, true); break; case WM_MBUTTONDOWN: MarkMouseButtonAsPressed(hookStruct, MouseEventArgs.Buttons.MMB, true); break; case WM_XBUTTONDOWN: switch (((uint)hookStruct.mouseData >> 16 & (uint)ushort.MaxValue)) { case 1: MarkMouseButtonAsPressed(hookStruct, MouseEventArgs.Buttons.XMB1, true); break; case 2: MarkMouseButtonAsPressed(hookStruct, MouseEventArgs.Buttons.XMB2, true); break; } break; case WM_LBUTTONUP: MarkMouseButtonAsPressed(hookStruct, MouseEventArgs.Buttons.LMB, false); break; case WM_RBUTTONUP: MarkMouseButtonAsPressed(hookStruct, MouseEventArgs.Buttons.RMB, false); break; case WM_MBUTTONUP: MarkMouseButtonAsPressed(hookStruct, MouseEventArgs.Buttons.MMB, false); break; case WM_XBUTTONUP: switch (((uint)hookStruct.mouseData >> 16 & (uint)ushort.MaxValue)) { case 1: MarkMouseButtonAsPressed(hookStruct, MouseEventArgs.Buttons.XMB1, false); break; case 2: MarkMouseButtonAsPressed(hookStruct, MouseEventArgs.Buttons.XMB2, false); break; } break; case WM_MOUSEWHEEL: if (hookStruct.mouseData >> 16 > 0) { OnMouseScroll?.Invoke(this, new ScrollEventArgs(ScrollEventArgs.Directions.Up)); } else { OnMouseScroll?.Invoke(this, new ScrollEventArgs(ScrollEventArgs.Directions.Down)); } break; case WM_MOUSEHWHEEL: if (hookStruct.mouseData >> 16 > 0) { OnMouseScroll?.Invoke(this, new ScrollEventArgs(ScrollEventArgs.Directions.Right)); } else { OnMouseScroll?.Invoke(this, new ScrollEventArgs(ScrollEventArgs.Directions.Left)); } break; case WM_MOUSEMOVE: break; } return(CallNextHookEx(_mHookID, nCode, wParam, lParam)); }
private void InputThread() { // if there is no console available, no need to display anything. if (_screenLogBuilder == null) { return; } // get pointer to the console var hWnd = GetStdHandle(STD_INPUT_HANDLE); // disable quick edit mode as it steals mouse input var wasQuickEditModeEnabled = IsQuickEditModeEnabled(hWnd); if (wasQuickEditModeEnabled) { DisableQuickEditMode(hWnd); } EnableConsoleInputs(hWnd); // read initial key state CapsLockEnabled = GetKeyState(VirtualKeyStates.VK_CAPITAL) == 1; NumLockEnabled = GetKeyState(VirtualKeyStates.VK_NUMLOCK) == 1; ScrollLockEnabled = GetKeyState(VirtualKeyStates.VK_SCROLL) == 1; while (!_isRunning.WaitOne(100)) { var buffer = new INPUT_RECORD[128]; var eventsRead = 0U; var success = GetNumberOfConsoleInputEvents(hWnd, out eventsRead); if (eventsRead > 0) { var keyRead = ReadConsoleInput(hWnd, buffer, (uint)buffer.Length, out eventsRead); if (keyRead) { for (var z = 0; z < eventsRead; z++) { switch (buffer[z].EventType) { case KEYBOARD_EVENT: var keyEvent = buffer[z].KeyEvent; var key = (ConsoleKey)keyEvent.wVirtualKeyCode; CapsLockEnabled = keyEvent.dwControlKeyState.HasFlag(ControlKeyState.CAPSLOCK_ON); ScrollLockEnabled = keyEvent.dwControlKeyState.HasFlag(ControlKeyState.SCROLLLOCK_ON); NumLockEnabled = keyEvent.dwControlKeyState.HasFlag(ControlKeyState.NUMLOCK_ON); if (Options.InputOptions == InputOptions.UseBuiltInKeyOperations) { // internal keyboard handling events if (_isSearchEnabled && keyEvent.bKeyDown && !keyEvent.dwControlKeyState.HasFlag(ControlKeyState.LEFT_CTRL_PRESSED) && !keyEvent.dwControlKeyState.HasFlag(ControlKeyState.RIGHT_CTRL_PRESSED) && !keyEvent.dwControlKeyState.HasFlag(ControlKeyState.LEFT_ALT_PRESSED) && !keyEvent.dwControlKeyState.HasFlag(ControlKeyState.RIGHT_ALT_PRESSED) ) { AddSearchString(keyEvent.UnicodeChar); } if (keyEvent.bKeyDown) { switch (key) { case ConsoleKey.H: if (!_isSearchEnabled) { ToggleHelp(); } break; case ConsoleKey.Home: // scroll to start _bufferYCursor = Configuration.MaxHistoryLines; _hasLogUpdates = true; break; case ConsoleKey.Escape: case ConsoleKey.End: // scroll to end _bufferYCursor = 0; _searchLineIndex = -1; _hasLogUpdates = true; SetSearch(false); break; case ConsoleKey.PageUp: if (Options.InputOptions == InputOptions.UseBuiltInKeyOperations) { _hasLogUpdates = true; if (_bufferYCursor < _fullLogHistory.Count - LogDisplayHeight) { _bufferYCursor += LogDisplayHeight; } else { _bufferYCursor = _fullLogHistory.Count; } } break; case ConsoleKey.PageDown: if (Options.InputOptions == InputOptions.UseBuiltInKeyOperations) { _hasLogUpdates = true; if (_bufferYCursor - LogDisplayHeight > 0) { _bufferYCursor -= LogDisplayHeight; } else { _bufferYCursor = 0; } } break; case ConsoleKey.Enter: if (_isSearchEnabled) { FindNext(); } break; case ConsoleKey.S: // find/search if (keyEvent.dwControlKeyState.HasFlag(ControlKeyState.LEFT_CTRL_PRESSED)) { ToggleSearch(); } break; case ConsoleKey.F3: // find/search control keys if (keyEvent.dwControlKeyState.HasFlag(ControlKeyState.SHIFT_PRESSED)) { FindPrevious(); } else { FindNext(); } break; case ConsoleKey.Q: // quit if (!_isSearchEnabled) { System.Diagnostics.Debug.WriteLine("Quitting...."); Close(); Dispose(); } break; } } } OnKeyPress?.Invoke(new KeyPressEventArgs(key, keyEvent.dwControlKeyState)); break; case MOUSE_EVENT: var mouseEvent = buffer[z].MouseEvent; if (mouseEvent.dwEventFlags == MOUSE_MOVED) { // mouse move OnMouseMove?.Invoke(new MouseMoveEventArgs(mouseEvent.dwMousePosition.x, mouseEvent.dwMousePosition.y)); } else if (mouseEvent.dwEventFlags == MOUSE_BUTTON) { // mouse button press OnMousePress?.Invoke(new MousePressEventArgs((MouseButtonState)mouseEvent.dwButtonState, mouseEvent.dwControlKeyState)); } else if (mouseEvent.dwEventFlags == MOUSE_WHEELED) { // mouse wheel scroll var isWheelUp = mouseEvent.dwButtonState == MOUSE_WHEELUP; var isWheelDown = mouseEvent.dwButtonState == MOUSE_WHEELDOWN; if (isWheelUp) { if (Options.InputOptions == InputOptions.UseBuiltInKeyOperations) { _hasLogUpdates = true; if (_bufferYCursor > 0) { _bufferYCursor--; } } OnMouseScroll?.Invoke(new MouseScrollEventArgs(MouseScrollDirection.Up)); } if (isWheelDown) { if (Options.InputOptions == InputOptions.UseBuiltInKeyOperations) { _hasLogUpdates = true; if (_bufferYCursor < _fullLogHistory.Count - LogDisplayHeight) { _bufferYCursor++; } } OnMouseScroll?.Invoke(new MouseScrollEventArgs(MouseScrollDirection.Down)); } } break; } } } } } if (wasQuickEditModeEnabled) { EnableQuickEditMode(hWnd); } }