00001 #region --- License ---
00002
00003
00004
00005 #endregion
00006
00007 using System;
00008 using System.Collections.Generic;
00009 using System.Text;
00010 using System.Diagnostics;
00011 using System.Runtime.InteropServices;
00012
00013 using OpenTK.Input;
00014 using System.Drawing;
00015
00016 namespace OpenTK.Platform.X11
00017 {
00023 internal sealed class X11Input : IInputDriver
00024 {
00025 X11Joystick joystick_driver = new X11Joystick();
00026
00027 KeyboardDevice keyboard = new KeyboardDevice();
00028 MouseDevice mouse = new MouseDevice();
00029 List<KeyboardDevice> dummy_keyboard_list = new List<KeyboardDevice>(1);
00030 List<MouseDevice> dummy_mice_list = new List<MouseDevice>(1);
00031
00032 X11KeyMap keymap = new X11KeyMap();
00033 int firstKeyCode, lastKeyCode;
00034 int keysyms_per_keycode;
00035 IntPtr[] keysyms;
00036
00037
00038
00039 #region --- Constructors ---
00040
00047 public X11Input(IWindowInfo attach)
00048 {
00049 Debug.WriteLine("Initalizing X11 input driver.");
00050 Debug.Indent();
00051
00052 if (attach == null)
00053 throw new ArgumentException("A valid parent window must be defined, in order to create an X11Input driver.");
00054
00055
00056 X11WindowInfo window = (X11WindowInfo)attach;
00057
00058
00059 mouse.Description = "Default X11 mouse";
00060 mouse.DeviceID = IntPtr.Zero;
00061 mouse.NumberOfButtons = 5;
00062 mouse.NumberOfWheels = 1;
00063 dummy_mice_list.Add(mouse);
00064
00065 using (new XLock(window.Display))
00066 {
00067
00068 API.DisplayKeycodes(window.Display, ref firstKeyCode, ref lastKeyCode);
00069 Debug.Print("First keycode: {0}, last {1}", firstKeyCode, lastKeyCode);
00070
00071 IntPtr keysym_ptr = API.GetKeyboardMapping(window.Display, (byte)firstKeyCode,
00072 lastKeyCode - firstKeyCode + 1, ref keysyms_per_keycode);
00073 Debug.Print("{0} keysyms per keycode.", keysyms_per_keycode);
00074
00075 keysyms = new IntPtr[(lastKeyCode - firstKeyCode + 1) * keysyms_per_keycode];
00076 Marshal.PtrToStructure(keysym_ptr, keysyms);
00077 API.Free(keysym_ptr);
00078
00079 KeyboardDevice kb = new KeyboardDevice();
00080 keyboard.Description = "Default X11 keyboard";
00081 keyboard.NumberOfKeys = lastKeyCode - firstKeyCode + 1;
00082 keyboard.DeviceID = IntPtr.Zero;
00083 dummy_keyboard_list.Add(keyboard);
00084
00085
00086
00087
00088
00089 bool supported;
00090 Functions.XkbSetDetectableAutoRepeat(window.Display, true, out supported);
00091 }
00092
00093 Debug.Unindent();
00094 }
00095
00096 #endregion
00097
00098 #region private void InternalPoll()
00099 #if false
00100 private void InternalPoll()
00101 {
00102 X11.XEvent e = new XEvent();
00103 try
00104 {
00105 while (!disposed)
00106 {
00107 Functions.XMaskEvent(window.Display,
00108 EventMask.PointerMotionMask | EventMask.PointerMotionHintMask |
00109 EventMask.ButtonPressMask | EventMask.ButtonReleaseMask |
00110 EventMask.KeyPressMask | EventMask.KeyReleaseMask |
00111 EventMask.StructureNotifyMask, ref e);
00112
00113 if (disposed)
00114 return;
00115
00116 switch (e.type)
00117 {
00118 case XEventName.KeyPress:
00119 case XEventName.KeyRelease:
00120 keyboardDriver.ProcessKeyboardEvent(ref e.KeyEvent);
00121 break;
00122
00123 case XEventName.ButtonPress:
00124 case XEventName.ButtonRelease:
00125 mouseDriver.ProcessButton(ref e.ButtonEvent);
00126 break;
00127
00128 case XEventName.MotionNotify:
00129 mouseDriver.ProcessMotion(ref e.MotionEvent);
00130 break;
00131
00132 case XEventName.DestroyNotify:
00133 Functions.XPutBackEvent(window.Display, ref e);
00134 Functions.XAutoRepeatOn(window.Display);
00135 return;
00136 }
00137 }
00138 }
00139 catch (ThreadAbortException expt)
00140 {
00141 Functions.XUnmapWindow(window.Display, window.Handle);
00142 Functions.XDestroyWindow(window.Display, window.Handle);
00143 return;
00144 }
00145 }
00146 #endif
00147 #endregion
00148
00149 #region internal void ProcessEvent(ref XEvent e)
00150
00151 internal void ProcessEvent(ref XEvent e)
00152 {
00153 switch (e.type)
00154 {
00155 case XEventName.KeyPress:
00156 case XEventName.KeyRelease:
00157 bool pressed = e.type == XEventName.KeyPress;
00158
00159 IntPtr keysym = API.LookupKeysym(ref e.KeyEvent, 0);
00160 IntPtr keysym2 = API.LookupKeysym(ref e.KeyEvent, 1);
00161
00162 if (keymap.ContainsKey((XKey)keysym))
00163 keyboard[keymap[(XKey)keysym]] = pressed;
00164 else if (keymap.ContainsKey((XKey)keysym2))
00165 keyboard[keymap[(XKey)keysym2]] = pressed;
00166 else
00167 Debug.Print("KeyCode {0} (Keysym: {1}, {2}) not mapped.", e.KeyEvent.keycode, (XKey)keysym, (XKey)keysym2);
00168 break;
00169
00170 case XEventName.ButtonPress:
00171 if (e.ButtonEvent.button == 1) mouse[OpenTK.Input.MouseButton.Left] = true;
00172 else if (e.ButtonEvent.button == 2) mouse[OpenTK.Input.MouseButton.Middle] = true;
00173 else if (e.ButtonEvent.button == 3) mouse[OpenTK.Input.MouseButton.Right] = true;
00174 else if (e.ButtonEvent.button == 4) mouse.Wheel++;
00175 else if (e.ButtonEvent.button == 5) mouse.Wheel--;
00176 else if (e.ButtonEvent.button == 6) mouse[OpenTK.Input.MouseButton.Button1] = true;
00177 else if (e.ButtonEvent.button == 7) mouse[OpenTK.Input.MouseButton.Button2] = true;
00178 else if (e.ButtonEvent.button == 8) mouse[OpenTK.Input.MouseButton.Button3] = true;
00179 else if (e.ButtonEvent.button == 9) mouse[OpenTK.Input.MouseButton.Button4] = true;
00180 else if (e.ButtonEvent.button == 10) mouse[OpenTK.Input.MouseButton.Button5] = true;
00181 else if (e.ButtonEvent.button == 11) mouse[OpenTK.Input.MouseButton.Button6] = true;
00182 else if (e.ButtonEvent.button == 12) mouse[OpenTK.Input.MouseButton.Button7] = true;
00183 else if (e.ButtonEvent.button == 13) mouse[OpenTK.Input.MouseButton.Button8] = true;
00184 else if (e.ButtonEvent.button == 14) mouse[OpenTK.Input.MouseButton.Button9] = true;
00185
00186
00187
00188 break;
00189
00190 case XEventName.ButtonRelease:
00191 if (e.ButtonEvent.button == 1) mouse[OpenTK.Input.MouseButton.Left] = false;
00192 else if (e.ButtonEvent.button == 2) mouse[OpenTK.Input.MouseButton.Middle] = false;
00193 else if (e.ButtonEvent.button == 3) mouse[OpenTK.Input.MouseButton.Right] = false;
00194 else if (e.ButtonEvent.button == 6) mouse[OpenTK.Input.MouseButton.Button1] = false;
00195 else if (e.ButtonEvent.button == 7) mouse[OpenTK.Input.MouseButton.Button2] = false;
00196 else if (e.ButtonEvent.button == 8) mouse[OpenTK.Input.MouseButton.Button3] = false;
00197 else if (e.ButtonEvent.button == 9) mouse[OpenTK.Input.MouseButton.Button4] = false;
00198 else if (e.ButtonEvent.button == 10) mouse[OpenTK.Input.MouseButton.Button5] = false;
00199 else if (e.ButtonEvent.button == 11) mouse[OpenTK.Input.MouseButton.Button6] = false;
00200 else if (e.ButtonEvent.button == 12) mouse[OpenTK.Input.MouseButton.Button7] = false;
00201 else if (e.ButtonEvent.button == 13) mouse[OpenTK.Input.MouseButton.Button8] = false;
00202 else if (e.ButtonEvent.button == 14) mouse[OpenTK.Input.MouseButton.Button9] = false;
00203 break;
00204
00205 case XEventName.MotionNotify:
00206 mouse.Position = new Point(e.MotionEvent.x, e.MotionEvent.y);
00207 break;
00208 }
00209 }
00210
00211 #endregion
00212
00213 #region --- IInputDriver Members ---
00214
00215 #region public IList<Keyboard> Keyboard
00216
00217 public IList<KeyboardDevice> Keyboard
00218 {
00219 get { return dummy_keyboard_list; }
00220 }
00221
00222 #endregion
00223
00224 #region public IList<Mouse> Mouse
00225
00226 public IList<MouseDevice> Mouse
00227 {
00228 get { return (IList<MouseDevice>)dummy_mice_list; }
00229 }
00230
00231 #endregion
00232
00233 #region public IList<JoystickDevice> Joysticks
00234
00235 public IList<JoystickDevice> Joysticks
00236 {
00237 get { return joystick_driver.Joysticks; }
00238 }
00239
00240 #endregion
00241
00242 #region public void Poll()
00243
00247 public void Poll()
00248 {
00249 joystick_driver.Poll();
00250 }
00251
00252 #endregion
00253
00254 #endregion
00255
00256 #region --- IDisposable Members ---
00257
00258 public void Dispose()
00259 {
00260
00261
00262 }
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284
00285 #endregion
00286 }
00287 }