2007-08-10 11:27:13 +02:00
|
|
|
|
#region --- License ---
|
|
|
|
|
/* Copyright (c) 2006, 2007 Stefanos Apostolopoulos
|
|
|
|
|
* See license.txt for license info
|
|
|
|
|
*/
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
using System;
|
2007-08-05 11:03:22 +02:00
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.Text;
|
|
|
|
|
|
|
|
|
|
using OpenTK.Input;
|
2007-08-05 15:42:31 +02:00
|
|
|
|
using System.Diagnostics;
|
2007-08-05 11:03:22 +02:00
|
|
|
|
|
|
|
|
|
namespace OpenTK.Platform.X11
|
|
|
|
|
{
|
2007-08-05 15:42:31 +02:00
|
|
|
|
/// <summary>
|
|
|
|
|
/// Drives the InputDriver on X11.
|
|
|
|
|
/// This class supports OpenTK, and is not intended for users of OpenTK.
|
|
|
|
|
/// </summary>
|
|
|
|
|
internal sealed class X11Input : IInputDriver
|
2007-08-05 11:03:22 +02:00
|
|
|
|
{
|
2007-08-05 15:42:31 +02:00
|
|
|
|
private X11Keyboard keyboardDriver;
|
2007-09-21 22:34:07 +02:00
|
|
|
|
private X11Mouse mouseDriver;
|
|
|
|
|
private X11.WindowInfo window;
|
2007-08-05 20:26:14 +02:00
|
|
|
|
|
2007-08-06 01:09:05 +02:00
|
|
|
|
XEvent e = new XEvent();
|
2007-08-05 20:26:14 +02:00
|
|
|
|
|
2007-08-05 15:42:31 +02:00
|
|
|
|
#region --- Constructors ---
|
|
|
|
|
|
2007-08-05 19:21:46 +02:00
|
|
|
|
/// <summary>
|
|
|
|
|
/// Constructs a new X11Input driver. Creates a hidden InputOnly window, child to
|
|
|
|
|
/// the main application window, which selects input events and routes them to
|
|
|
|
|
/// the device specific drivers (Keyboard, Mouse, Hid).
|
|
|
|
|
/// </summary>
|
2007-09-21 22:34:07 +02:00
|
|
|
|
/// <param name="attach">The window which the InputDriver will attach itself on.</param>
|
|
|
|
|
public X11Input(IWindowInfo attach)
|
2007-08-05 11:03:22 +02:00
|
|
|
|
{
|
2007-08-05 15:42:31 +02:00
|
|
|
|
Debug.WriteLine("Initalizing X11 input driver.");
|
|
|
|
|
Debug.Indent();
|
|
|
|
|
|
2007-09-21 22:34:07 +02:00
|
|
|
|
if (attach == null)
|
2007-08-05 19:45:59 +02:00
|
|
|
|
{
|
|
|
|
|
throw new ArgumentException("A valid parent window must be defined, in order to create an X11Input driver.");
|
|
|
|
|
}
|
2007-08-06 01:09:05 +02:00
|
|
|
|
/*
|
2007-08-05 15:42:31 +02:00
|
|
|
|
Debug.WriteLine("Creating hidden input window.");
|
|
|
|
|
|
|
|
|
|
SetWindowAttributes wnd_attributes = new SetWindowAttributes();
|
|
|
|
|
wnd_attributes.background_pixel = 0;
|
|
|
|
|
wnd_attributes.border_pixel = 0;
|
|
|
|
|
wnd_attributes.colormap = IntPtr.Zero;
|
2007-08-06 01:09:05 +02:00
|
|
|
|
wnd_attributes.event_mask = EventMask.KeyPressMask | EventMask.KeyReleaseMask |
|
|
|
|
|
EventMask.FocusChangeMask;
|
2007-08-05 15:42:31 +02:00
|
|
|
|
|
|
|
|
|
CreateWindowMask cw_mask =
|
|
|
|
|
CreateWindowMask.CWEventMask;
|
|
|
|
|
|
2007-08-05 20:26:14 +02:00
|
|
|
|
window = new WindowInfo(parent);
|
2007-08-05 15:42:31 +02:00
|
|
|
|
|
|
|
|
|
window.Handle = API.CreateWindow(
|
|
|
|
|
window.Display,
|
2007-08-05 19:21:46 +02:00
|
|
|
|
window.Parent.Handle,
|
2007-08-05 15:42:31 +02:00
|
|
|
|
0, 0,
|
2007-08-06 01:09:05 +02:00
|
|
|
|
1, 1,
|
2007-08-05 20:51:07 +02:00
|
|
|
|
0, 0,
|
2007-08-05 18:15:15 +02:00
|
|
|
|
Constants.InputOnly,
|
2007-08-06 01:09:05 +02:00
|
|
|
|
//window.VisualInfo.visual,
|
|
|
|
|
(IntPtr)0,
|
2007-08-05 15:42:31 +02:00
|
|
|
|
cw_mask,
|
|
|
|
|
wnd_attributes
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
if (window.Handle == IntPtr.Zero)
|
|
|
|
|
{
|
|
|
|
|
throw new Exception("Could not create input window.");
|
|
|
|
|
}
|
|
|
|
|
|
2007-08-05 21:04:06 +02:00
|
|
|
|
API.MapWindow(window.Display, window.Handle);
|
2007-08-06 01:09:05 +02:00
|
|
|
|
API.GrabKeyboard(window.Display, window.Handle, false, GrabMode.GrabModeAsync, GrabMode.GrabModeAsync, 0);
|
2007-08-05 21:04:06 +02:00
|
|
|
|
|
2007-08-05 15:42:31 +02:00
|
|
|
|
Debug.WriteLine("done! (id: " + window + ")");
|
2007-08-06 14:13:50 +02:00
|
|
|
|
|
2007-08-05 15:42:31 +02:00
|
|
|
|
keyboardDriver = new X11Keyboard(window);
|
2007-08-06 01:09:05 +02:00
|
|
|
|
*/
|
2007-08-06 14:13:50 +02:00
|
|
|
|
|
2007-09-21 22:34:07 +02:00
|
|
|
|
window = attach as Platform.WindowInfo ?? attach as X11.WindowInfo;
|
|
|
|
|
|
|
|
|
|
keyboardDriver = new X11Keyboard(window);
|
2007-09-24 23:23:27 +02:00
|
|
|
|
mouseDriver = new X11Mouse(window);
|
2007-09-21 22:34:07 +02:00
|
|
|
|
// Todo: mask is now specified by hand, hard to keep in sync.
|
|
|
|
|
API.SelectInput(window.Display, window.Handle, EventMask.StructureNotifyMask |
|
2007-08-06 14:13:50 +02:00
|
|
|
|
EventMask.SubstructureNotifyMask | EventMask.ExposureMask |
|
2007-09-24 23:23:27 +02:00
|
|
|
|
EventMask.KeyReleaseMask | EventMask.KeyPressMask |
|
|
|
|
|
EventMask.PointerMotionMask | EventMask.PointerMotionHintMask |
|
|
|
|
|
EventMask.ButtonPressMask | EventMask.ButtonReleaseMask);
|
2007-08-05 15:42:31 +02:00
|
|
|
|
|
|
|
|
|
Debug.Unindent();
|
2007-08-05 11:03:22 +02:00
|
|
|
|
}
|
|
|
|
|
|
2007-08-05 15:42:31 +02:00
|
|
|
|
#endregion
|
|
|
|
|
|
2007-08-05 11:03:22 +02:00
|
|
|
|
#region --- IInputDriver Members ---
|
|
|
|
|
|
|
|
|
|
#region public IList<IInputDevice> InputDevices
|
|
|
|
|
|
|
|
|
|
public IList<IInputDevice> InputDevices
|
|
|
|
|
{
|
|
|
|
|
get { throw new Exception("The method or operation is not implemented."); }
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region public IList<Keyboard> Keyboard
|
|
|
|
|
|
|
|
|
|
public IList<Keyboard> Keyboard
|
|
|
|
|
{
|
2007-08-05 18:30:44 +02:00
|
|
|
|
get { return keyboardDriver.Keyboard; }
|
2007-08-05 11:03:22 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region public IList<Mouse> Mouse
|
|
|
|
|
|
|
|
|
|
public IList<Mouse> Mouse
|
|
|
|
|
{
|
2007-09-24 23:10:52 +02:00
|
|
|
|
get { return mouseDriver.Mouse; }
|
2007-08-05 11:03:22 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
2007-09-24 23:10:52 +02:00
|
|
|
|
#region public void Poll()
|
|
|
|
|
|
2007-08-05 20:33:38 +02:00
|
|
|
|
/// <summary>
|
|
|
|
|
/// Consumes to keyboard, mouse, etc events, routing them to their
|
|
|
|
|
/// respective drivers.
|
|
|
|
|
/// </summary>
|
2007-09-22 15:13:17 +02:00
|
|
|
|
public void Poll()
|
2007-08-05 20:26:14 +02:00
|
|
|
|
{
|
2007-08-06 01:38:59 +02:00
|
|
|
|
while (API.CheckMaskEvent(window.Display, EventMask.KeyReleaseMask | EventMask.KeyPressMask, ref e))
|
|
|
|
|
{
|
|
|
|
|
keyboardDriver.ProcessKeyboardEvent(e.KeyEvent);
|
|
|
|
|
}
|
2007-09-24 22:56:50 +02:00
|
|
|
|
while (API.CheckMaskEvent(window.Display, EventMask.ButtonPressMask | EventMask.ButtonPressMask, ref e))
|
|
|
|
|
{
|
|
|
|
|
mouseDriver.ProcessButton(e.ButtonEvent);
|
|
|
|
|
}
|
|
|
|
|
while (API.CheckMaskEvent(window.Display, EventMask.PointerMotionMask | EventMask.PointerMotionHintMask, ref e))
|
|
|
|
|
{
|
|
|
|
|
mouseDriver.ProcessMotion(e.MotionEvent);
|
|
|
|
|
}
|
2007-08-20 15:45:04 +02:00
|
|
|
|
/*
|
|
|
|
|
if (API.Pending(window.Display) > 0)
|
|
|
|
|
{
|
|
|
|
|
Functions.XPeekEvent(window.Display, ref e);
|
|
|
|
|
if (e.type == XEventName.KeyRelease || e.type == XEventName.KeyPress)
|
|
|
|
|
{
|
|
|
|
|
keyboardDriver.ProcessKeyboardEvent(e.KeyEvent);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
*/
|
2007-08-05 20:26:14 +02:00
|
|
|
|
}
|
|
|
|
|
|
2007-08-05 11:03:22 +02:00
|
|
|
|
#endregion
|
2007-08-22 02:30:16 +02:00
|
|
|
|
|
2007-09-24 23:10:52 +02:00
|
|
|
|
#endregion
|
|
|
|
|
|
2007-08-22 02:30:16 +02:00
|
|
|
|
#region --- IDisposable Members ---
|
|
|
|
|
|
|
|
|
|
public void Dispose()
|
|
|
|
|
{
|
|
|
|
|
throw new Exception("The method or operation is not implemented.");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#endregion
|
2007-08-05 11:03:22 +02:00
|
|
|
|
}
|
|
|
|
|
}
|