mirror of
https://github.com/gui-cs/Terminal.Gui.git
synced 2025-12-26 15:57:56 +01:00
Wire up more of the mouse handling
This commit is contained in:
6
Core.cs
6
Core.cs
@@ -946,6 +946,10 @@ namespace Terminal {
|
||||
return;
|
||||
}
|
||||
|
||||
static void ProcessMouseEvent (MouseEvent me)
|
||||
{
|
||||
}
|
||||
|
||||
static public RunState Begin (Toplevel toplevel)
|
||||
{
|
||||
if (toplevel == null)
|
||||
@@ -955,7 +959,7 @@ namespace Terminal {
|
||||
Init ();
|
||||
toplevels.Push (toplevel);
|
||||
Current = toplevel;
|
||||
Driver.PrepareToRun (MainLoop, ProcessKeyEvent);
|
||||
Driver.PrepareToRun (MainLoop, ProcessKeyEvent, ProcessMouseEvent);
|
||||
toplevel.LayoutSubviews ();
|
||||
toplevel.FocusFirst ();
|
||||
Redraw (toplevel);
|
||||
|
||||
26
Driver.cs
26
Driver.cs
@@ -78,7 +78,7 @@ namespace Terminal {
|
||||
public abstract void Move (int col, int row);
|
||||
public abstract void AddCh (int ch);
|
||||
public abstract void AddStr (string str);
|
||||
public abstract void PrepareToRun (MainLoop mainLoop, Action<KeyEvent> target);
|
||||
public abstract void PrepareToRun (MainLoop mainLoop, Action<KeyEvent> target, Action<MouseEvent> mouse);
|
||||
public abstract void Refresh ();
|
||||
public abstract void End ();
|
||||
public abstract void RedrawTop ();
|
||||
@@ -226,7 +226,16 @@ namespace Terminal {
|
||||
}
|
||||
}
|
||||
|
||||
void ProcessInput (Action<KeyEvent> keyHandler)
|
||||
static MouseEvent ToDriverMouse (Curses.MouseEvent cev)
|
||||
{
|
||||
return new MouseEvent () {
|
||||
X = cev.X,
|
||||
Y = cev.Y,
|
||||
Flags = (MouseFlags)cev.ButtonState
|
||||
};
|
||||
}
|
||||
|
||||
void ProcessInput (Action<KeyEvent> keyHandler, Action<MouseEvent> mouseHandler)
|
||||
{
|
||||
int wch;
|
||||
var code = Curses.get_wch (out wch);
|
||||
@@ -238,15 +247,14 @@ namespace Terminal {
|
||||
}
|
||||
}
|
||||
if (code == Curses.KeyMouse) {
|
||||
// TODO
|
||||
// Curses.MouseEvent ev;
|
||||
// Curses.getmouse (out ev);
|
||||
// handler.HandleMouse ();
|
||||
Curses.MouseEvent ev;
|
||||
Curses.getmouse (out ev);
|
||||
mouseHandler (ToDriverMouse (ev));
|
||||
return;
|
||||
}
|
||||
keyHandler (new KeyEvent (MapCursesKey (wch)));
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// Special handling for ESC, we want to try to catch ESC+letter to simulate alt-letter as well as Alt-Fkey
|
||||
if (wch == 27) {
|
||||
@@ -274,12 +282,12 @@ namespace Terminal {
|
||||
keyHandler (new KeyEvent ((Key)wch));
|
||||
}
|
||||
|
||||
public override void PrepareToRun (MainLoop mainLoop, Action<KeyEvent> keyHandler)
|
||||
public override void PrepareToRun (MainLoop mainLoop, Action<KeyEvent> keyHandler, Action<MouseEvent> mouseHandler)
|
||||
{
|
||||
Curses.timeout (-1);
|
||||
|
||||
mainLoop.AddWatch (0, Mono.Terminal.MainLoop.Condition.PollIn, x => {
|
||||
ProcessInput (keyHandler);
|
||||
ProcessInput (keyHandler, mouseHandler);
|
||||
return true;
|
||||
});
|
||||
|
||||
|
||||
70
Event.cs
70
Event.cs
@@ -4,6 +4,8 @@
|
||||
// Authors:
|
||||
// Miguel de Icaza (miguel@gnome.org)
|
||||
//
|
||||
using System;
|
||||
|
||||
namespace Terminal {
|
||||
|
||||
/// <summary>
|
||||
@@ -81,10 +83,23 @@ namespace Terminal {
|
||||
Unknown
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Describes a keyboard event
|
||||
/// </summary>
|
||||
public struct KeyEvent {
|
||||
public Key Key;
|
||||
public int KeyValue => (int)Key;
|
||||
|
||||
/// <summary>
|
||||
/// Gets a value indicating whether the Alt key was pressed (real or synthesized)
|
||||
/// </summary>
|
||||
/// <value><c>true</c> if is alternate; otherwise, <c>false</c>.</value>
|
||||
public bool IsAlt => (Key & Key.AltMask) != 0;
|
||||
|
||||
/// <summary>
|
||||
/// Determines whether the value is a control key
|
||||
/// </summary>
|
||||
/// <value><c>true</c> if is ctrl; otherwise, <c>false</c>.</value>
|
||||
public bool IsCtrl => ((uint)Key >= 1) && ((uint)Key <= 26);
|
||||
|
||||
public KeyEvent (Key k)
|
||||
@@ -93,6 +108,61 @@ namespace Terminal {
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Mouse flags reported in MouseEvent.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// They just happen to map to the ncurses ones.
|
||||
/// </remarks>
|
||||
[Flags]
|
||||
public enum MouseFlags {
|
||||
Button1Pressed = unchecked((int)0x2),
|
||||
Button1Released = unchecked((int)0x1),
|
||||
Button1Clicked = unchecked((int)0x4),
|
||||
Button1DoubleClicked = unchecked((int)0x8),
|
||||
Button1TripleClicked = unchecked((int)0x10),
|
||||
Button2Pressed = unchecked((int)0x80),
|
||||
Button2Released = unchecked((int)0x40),
|
||||
Button2Clicked = unchecked((int)0x100),
|
||||
Button2DoubleClicked = unchecked((int)0x200),
|
||||
Button2TrippleClicked = unchecked((int)0x400),
|
||||
Button3Pressed = unchecked((int)0x2000),
|
||||
Button3Released = unchecked((int)0x1000),
|
||||
Button3Clicked = unchecked((int)0x4000),
|
||||
Button3DoubleClicked = unchecked((int)0x8000),
|
||||
Button3TripleClicked = unchecked((int)0x10000),
|
||||
Button4Pressed = unchecked((int)0x80000),
|
||||
Button4Released = unchecked((int)0x40000),
|
||||
Button4Clicked = unchecked((int)0x100000),
|
||||
Button4DoubleClicked = unchecked((int)0x200000),
|
||||
Button4TripleClicked = unchecked((int)0x400000),
|
||||
ButtonShift = unchecked((int)0x2000000),
|
||||
ButtonCtrl = unchecked((int)0x1000000),
|
||||
ButtonAlt = unchecked((int)0x4000000),
|
||||
ReportMousePosition = unchecked((int)0x8000000),
|
||||
AllEvents = unchecked((int)0x7ffffff),
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Describes a mouse event
|
||||
/// </summary>
|
||||
public struct MouseEvent {
|
||||
/// <summary>
|
||||
/// The X (column) location for the mouse event.
|
||||
/// </summary>
|
||||
public int X;
|
||||
|
||||
/// <summary>
|
||||
/// The Y (column) location for the mouse event.
|
||||
/// </summary>
|
||||
public int Y;
|
||||
|
||||
/// <summary>
|
||||
/// Flags indicating the kind of mouse event that is being posted.
|
||||
/// </summary>
|
||||
public MouseFlags Flags;
|
||||
}
|
||||
|
||||
public class Event {
|
||||
public class Key : Event {
|
||||
public int Code { get; private set; }
|
||||
|
||||
Reference in New Issue
Block a user