Wire up more of the mouse handling

This commit is contained in:
Miguel de Icaza
2018-01-08 08:47:04 -05:00
parent 626d58d52b
commit 7c8e67256d
3 changed files with 92 additions and 10 deletions

View File

@@ -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);

View File

@@ -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;
});

View File

@@ -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; }