2009-11-16 19:45:41 +01:00
#region License
//
// The Open Toolkit Library License
//
// Copyright (c) 2006 - 2009 the Open Toolkit library.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights to
// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
// the Software, and to permit persons to whom the Software is furnished to do
// so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
// OTHER DEALINGS IN THE SOFTWARE.
//
#endregion
using System ;
2009-09-03 21:01:11 +02:00
using System.ComponentModel ;
2011-12-08 01:03:14 +01:00
#if ! MINIMAL
2009-09-03 21:01:11 +02:00
using System.Drawing ;
2011-12-08 01:03:14 +01:00
#endif
2009-09-03 21:01:11 +02:00
using OpenTK.Graphics ;
using OpenTK.Input ;
using OpenTK.Platform ;
namespace OpenTK
{
/// <summary>
/// Instances of this class implement the <see cref="OpenTK.INativeWindow"/> interface on the current platform.
/// </summary>
public class NativeWindow : INativeWindow
{
#region - - - Fields - - -
2009-09-04 23:27:05 +02:00
private readonly GameWindowFlags options ;
private readonly DisplayDevice device ;
2009-09-03 21:01:11 +02:00
private readonly INativeWindow implementation ;
2009-09-04 23:27:05 +02:00
private bool disposed , events ;
2010-10-18 17:25:25 +02:00
private bool cursor_visible = true ;
2010-11-08 22:48:00 +01:00
private bool previous_cursor_visible = true ;
2009-09-04 23:27:05 +02:00
2009-09-03 21:01:11 +02:00
#endregion
#region - - - Contructors - - -
/// <summary>Constructs a new NativeWindow with default attributes without enabling events.</summary>
public NativeWindow ( )
2009-09-04 23:27:05 +02:00
: this ( 640 , 480 , "OpenTK Native Window" , GameWindowFlags . Default , GraphicsMode . Default , DisplayDevice . Default ) { }
2009-09-03 21:01:11 +02:00
// TODO: Remaining constructors.
/// <summary>Constructs a new centered NativeWindow with the specified attributes.</summary>
/// <param name="width">The width of the NativeWindow in pixels.</param>
/// <param name="height">The height of the NativeWindow in pixels.</param>
/// <param name="title">The title of the NativeWindow.</param>
/// <param name="options">GameWindow options specifying window appearance and behavior.</param>
/// <param name="mode">The OpenTK.Graphics.GraphicsMode of the NativeWindow.</param>
/// <param name="device">The OpenTK.Graphics.DisplayDevice to construct the NativeWindow in.</param>
/// <exception cref="System.ArgumentOutOfRangeException">If width or height is less than 1.</exception>
/// <exception cref="System.ArgumentNullException">If mode or device is null.</exception>
2009-09-04 23:27:05 +02:00
public NativeWindow ( int width , int height , string title , GameWindowFlags options , GraphicsMode mode , DisplayDevice device )
2009-09-03 21:01:11 +02:00
: this ( device . Bounds . Left + ( device . Bounds . Width - width ) / 2 ,
device . Bounds . Top + ( device . Bounds . Height - height ) / 2 ,
2009-09-04 23:27:05 +02:00
width , height , title , options , mode , device ) { }
2009-09-03 21:01:11 +02:00
/// <summary>Constructs a new NativeWindow with the specified attributes.</summary>
/// <param name="x">Horizontal screen space coordinate of the NativeWindow's origin.</param>
/// <param name="y">Vertical screen space coordinate of the NativeWindow's origin.</param>
/// <param name="width">The width of the NativeWindow in pixels.</param>
/// <param name="height">The height of the NativeWindow in pixels.</param>
/// <param name="title">The title of the NativeWindow.</param>
/// <param name="options">GameWindow options specifying window appearance and behavior.</param>
/// <param name="mode">The OpenTK.Graphics.GraphicsMode of the NativeWindow.</param>
/// <param name="device">The OpenTK.Graphics.DisplayDevice to construct the NativeWindow in.</param>
/// <exception cref="System.ArgumentOutOfRangeException">If width or height is less than 1.</exception>
/// <exception cref="System.ArgumentNullException">If mode or device is null.</exception>
2009-09-04 23:27:05 +02:00
public NativeWindow ( int x , int y , int width , int height , string title , GameWindowFlags options , GraphicsMode mode , DisplayDevice device )
2009-09-03 21:01:11 +02:00
{
// TODO: Should a constraint be added for the position?
if ( width < 1 )
throw new ArgumentOutOfRangeException ( "width" , "Must be greater than zero." ) ;
if ( height < 1 )
throw new ArgumentOutOfRangeException ( "height" , "Must be greater than zero." ) ;
if ( mode = = null )
throw new ArgumentNullException ( "mode" ) ;
if ( device = = null )
throw new ArgumentNullException ( "device" ) ;
2009-09-04 23:27:05 +02:00
this . options = options ;
this . device = device ;
implementation = Factory . Default . CreateNativeWindow ( x , y , width , height , title , mode , options , this . device ) ;
2009-09-03 21:01:11 +02:00
if ( ( options & GameWindowFlags . Fullscreen ) ! = 0 )
{
2009-09-04 23:27:05 +02:00
this . device . ChangeResolution ( width , height , mode . ColorFormat . BitsPerPixel , 0 ) ;
2009-09-03 21:01:11 +02:00
WindowState = WindowState . Fullscreen ;
}
}
#endregion
#region - - - INativeWindow Members - - -
#region Methods
#region Close
/// <summary>
/// Closes the NativeWindow.
/// </summary>
public void Close ( )
{
EnsureUndisposed ( ) ;
implementation . Close ( ) ;
}
#endregion
#region PointToClient
/// <summary>
/// Transforms the specified point from screen to client coordinates.
/// </summary>
/// <param name="point">
/// A <see cref="System.Drawing.Point"/> to transform.
/// </param>
/// <returns>
/// The point transformed to client coordinates.
/// </returns>
2009-11-01 13:44:38 +01:00
public Point PointToClient ( Point point )
2009-09-03 21:01:11 +02:00
{
return implementation . PointToClient ( point ) ;
}
#endregion
#region PointToScreen
/// <summary>
/// Transforms the specified point from client to screen coordinates.
/// </summary>
/// <param name="point">
/// A <see cref="System.Drawing.Point"/> to transform.
/// </param>
/// <returns>
/// The point transformed to screen coordinates.
/// </returns>
2009-11-01 13:44:38 +01:00
public Point PointToScreen ( Point point )
2009-09-03 21:01:11 +02:00
{
// Here we use the fact that PointToClient just translates the point, and PointToScreen
// should perform the inverse operation.
2009-11-01 13:44:38 +01:00
Point trans = PointToClient ( Point . Empty ) ;
2009-09-03 21:01:11 +02:00
point . X - = trans . X ;
point . Y - = trans . Y ;
return point ;
}
#endregion
#region ProcessEvents
/// <summary>
/// Processes operating system events until the NativeWindow becomes idle.
/// </summary>
public void ProcessEvents ( )
{
2009-09-04 23:27:05 +02:00
ProcessEvents ( false ) ;
2009-09-03 21:01:11 +02:00
}
#endregion
#endregion
#region Properties
#region Bounds
/// <summary>
/// Gets or sets a <see cref="System.Drawing.Rectangle"/> structure that contains the external bounds of this window, in screen coordinates.
/// External bounds include the title bar, borders and drawing area of the window.
/// </summary>
public Rectangle Bounds
{
get
{
EnsureUndisposed ( ) ;
return implementation . Bounds ;
}
set
{
EnsureUndisposed ( ) ;
implementation . Bounds = value ;
}
}
#endregion
#region ClientRectangle
/// <summary>
/// Gets or sets a <see cref="System.Drawing.Rectangle"/> structure that contains the internal bounds of this window, in client coordinates.
/// The internal bounds include the drawing area of the window, but exclude the titlebar and window borders.
/// </summary>
public Rectangle ClientRectangle
{
get
{
EnsureUndisposed ( ) ;
return implementation . ClientRectangle ;
}
set
{
EnsureUndisposed ( ) ;
implementation . ClientRectangle = value ;
}
}
#endregion
#region ClientSize
/// <summary>
/// Gets or sets a <see cref="System.Drawing.Size"/> structure that contains the internal size this window.
/// </summary>
public Size ClientSize
{
get
{
EnsureUndisposed ( ) ;
return implementation . ClientSize ;
}
set
{
EnsureUndisposed ( ) ;
implementation . ClientSize = value ;
}
}
#endregion
#region Exists
/// <summary>
/// Gets a value indicating whether a render window exists.
/// </summary>
public bool Exists
{
get
{
2009-09-05 01:18:47 +02:00
return IsDisposed ? false : implementation . Exists ; // TODO: Should disposed be ignored instead?
2009-09-03 21:01:11 +02:00
}
}
#endregion
#region Focused
/// <summary>
/// Gets a System.Boolean that indicates whether this NativeWindow has input focus.
/// </summary>
public bool Focused
{
get
{
EnsureUndisposed ( ) ;
return implementation . Focused ;
}
}
#endregion
#region Height
/// <summary>
/// Gets or sets the external height of this window.
/// </summary>
public int Height
{
get
{
EnsureUndisposed ( ) ;
return implementation . Height ;
}
set
{
EnsureUndisposed ( ) ;
implementation . Height = value ;
}
}
#endregion
2009-10-18 18:52:07 +02:00
#region Icon
/// <summary>
/// Gets or sets the System.Drawing.Icon for this GameWindow.
/// </summary>
public Icon Icon
{
get
{
EnsureUndisposed ( ) ;
return implementation . Icon ;
}
set
{
EnsureUndisposed ( ) ;
implementation . Icon = value ;
}
}
#endregion
2009-09-03 21:01:11 +02:00
#region InputDriver
/// <summary>
/// This property is deprecated.
/// </summary>
[Obsolete]
public IInputDriver InputDriver
{
get
{
EnsureUndisposed ( ) ;
return implementation . InputDriver ;
}
}
#endregion
#region Location
/// <summary>
/// Gets or sets a <see cref="System.Drawing.Point"/> structure that contains the location of this window on the desktop.
/// </summary>
public Point Location
{
get
{
EnsureUndisposed ( ) ;
return implementation . Location ;
}
set
{
EnsureUndisposed ( ) ;
implementation . Location = value ;
}
}
#endregion
#region Size
/// <summary>
/// Gets or sets a <see cref="System.Drawing.Size"/> structure that contains the external size of this window.
/// </summary>
public Size Size
{
get
{
EnsureUndisposed ( ) ;
return implementation . Size ;
}
set
{
EnsureUndisposed ( ) ;
implementation . Size = value ;
}
}
#endregion
#region Title
/// <summary>
/// Gets or sets the NativeWindow title.
/// </summary>
public string Title
{
get
{
EnsureUndisposed ( ) ;
return implementation . Title ;
}
set
{
EnsureUndisposed ( ) ;
implementation . Title = value ;
}
}
#endregion
#region Visible
/// <summary>
/// Gets or sets a System.Boolean that indicates whether this NativeWindow is visible.
/// </summary>
public bool Visible
{
get
{
EnsureUndisposed ( ) ;
return implementation . Visible ;
}
set
{
EnsureUndisposed ( ) ;
implementation . Visible = value ;
}
}
#endregion
#region Width
/// <summary>
/// Gets or sets the external width of this window.
/// </summary>
public int Width
{
get
{
EnsureUndisposed ( ) ;
return implementation . Width ;
}
set
{
EnsureUndisposed ( ) ;
implementation . Width = value ;
}
}
#endregion
#region WindowBorder
/// <summary>
/// Gets or states the border of the NativeWindow.
/// </summary>
public WindowBorder WindowBorder
{
get
{
return implementation . WindowBorder ;
}
set
{
implementation . WindowBorder = value ;
}
}
#endregion
#region WindowInfo
/// <summary>
/// Gets the <see cref="OpenTK.Platform.IWindowInfo"/> of this window.
/// </summary>
public IWindowInfo WindowInfo
{
get
{
EnsureUndisposed ( ) ;
return implementation . WindowInfo ;
}
}
#endregion
#region WindowState
/// <summary>
/// Gets or states the state of the NativeWindow.
/// </summary>
2010-02-03 20:04:42 +01:00
public virtual WindowState WindowState
2009-09-03 21:01:11 +02:00
{
get
{
return implementation . WindowState ;
}
set
{
implementation . WindowState = value ;
}
}
#endregion
#region X
/// <summary>
/// Gets or sets the horizontal location of this window on the desktop.
/// </summary>
public int X
{
get
{
EnsureUndisposed ( ) ;
return implementation . X ;
}
set
{
EnsureUndisposed ( ) ;
implementation . X = value ;
}
}
#endregion
#region Y
/// <summary>
/// Gets or sets the vertical location of this window on the desktop.
/// </summary>
public int Y
{
get
{
EnsureUndisposed ( ) ;
return implementation . Y ;
}
set
{
EnsureUndisposed ( ) ;
implementation . Y = value ;
}
}
#endregion
2010-10-18 17:25:25 +02:00
#region CursorVisible
/// <summary>
/// Gets or sets a value indicating whether the mouse cursor is visible.
/// </summary>
public bool CursorVisible
{
get { return cursor_visible ; }
set
{
cursor_visible = value ;
implementation . CursorVisible = value ;
}
}
#endregion
2009-09-03 21:01:11 +02:00
#endregion
#region Events
/// <summary>
/// Occurs after the window has closed.
/// </summary>
2010-10-28 11:37:57 +02:00
public event EventHandler < EventArgs > Closed = delegate { } ;
2009-09-03 21:01:11 +02:00
/// <summary>
/// Occurs when the window is about to close.
/// </summary>
2010-10-28 11:37:57 +02:00
public event EventHandler < CancelEventArgs > Closing = delegate { } ;
2009-09-03 21:01:11 +02:00
/// <summary>
/// Occurs when the window is disposed.
/// </summary>
2010-10-28 11:37:57 +02:00
public event EventHandler < EventArgs > Disposed = delegate { } ;
2009-09-03 21:01:11 +02:00
/// <summary>
/// Occurs when the <see cref="Focused"/> property of the window changes.
/// </summary>
2010-10-28 11:37:57 +02:00
public event EventHandler < EventArgs > FocusedChanged = delegate { } ;
2009-09-03 21:01:11 +02:00
2009-10-18 18:52:07 +02:00
/// <summary>
/// Occurs when the <see cref="Icon"/> property of the window changes.
/// </summary>
2010-10-28 11:37:57 +02:00
public event EventHandler < EventArgs > IconChanged = delegate { } ;
2009-10-18 18:52:07 +02:00
2010-11-08 22:48:00 +01:00
/// <summary>
/// Occurs whenever a keybord key is pressed.
/// </summary>
public event EventHandler < OpenTK . Input . KeyboardKeyEventArgs > KeyDown = delegate { } ;
2009-09-03 21:01:11 +02:00
/// <summary>
/// Occurs whenever a character is typed.
/// </summary>
2010-10-28 11:37:57 +02:00
public event EventHandler < KeyPressEventArgs > KeyPress = delegate { } ;
2009-09-03 21:01:11 +02:00
2010-11-08 22:48:00 +01:00
/// <summary>
/// Occurs whenever a keyboard key is released.
/// </summary>
public event EventHandler < OpenTK . Input . KeyboardKeyEventArgs > KeyUp = delegate { } ;
2009-09-03 21:01:11 +02:00
/// <summary>
/// Occurs whenever the window is moved.
/// </summary>
2010-10-28 11:37:57 +02:00
public event EventHandler < EventArgs > Move = delegate { } ;
2009-09-03 21:01:11 +02:00
2009-10-28 00:57:44 +01:00
/// <summary>
/// Occurs whenever the mouse cursor enters the window <see cref="Bounds"/>.
/// </summary>
2010-10-28 11:37:57 +02:00
public event EventHandler < EventArgs > MouseEnter = delegate { } ;
2009-10-28 00:57:44 +01:00
/// <summary>
/// Occurs whenever the mouse cursor leaves the window <see cref="Bounds"/>.
/// </summary>
2010-10-28 11:37:57 +02:00
public event EventHandler < EventArgs > MouseLeave = delegate { } ;
2009-10-28 00:57:44 +01:00
2009-09-03 21:01:11 +02:00
/// <summary>
/// Occurs whenever the window is resized.
/// </summary>
2010-10-28 11:37:57 +02:00
public event EventHandler < EventArgs > Resize = delegate { } ;
2009-09-03 21:01:11 +02:00
/// <summary>
/// Occurs when the <see cref="Title"/> property of the window changes.
/// </summary>
2010-10-28 11:37:57 +02:00
public event EventHandler < EventArgs > TitleChanged = delegate { } ;
2009-09-03 21:01:11 +02:00
/// <summary>
/// Occurs when the <see cref="Visible"/> property of the window changes.
/// </summary>
2010-10-28 11:37:57 +02:00
public event EventHandler < EventArgs > VisibleChanged = delegate { } ;
2009-09-03 21:01:11 +02:00
/// <summary>
/// Occurs when the <see cref="WindowBorder"/> property of the window changes.
/// </summary>
2010-10-28 11:37:57 +02:00
public event EventHandler < EventArgs > WindowBorderChanged = delegate { } ;
2009-09-03 21:01:11 +02:00
/// <summary>
/// Occurs when the <see cref="WindowState"/> property of the window changes.
/// </summary>
2010-10-28 11:37:57 +02:00
public event EventHandler < EventArgs > WindowStateChanged = delegate { } ;
2009-09-03 21:01:11 +02:00
#endregion
#endregion
#region - - - IDisposable Members - - -
#region Dispose
/// <summary>
/// Releases all non-managed resources belonging to this NativeWindow.
/// </summary>
2009-09-04 23:27:05 +02:00
public virtual void Dispose ( )
2009-09-03 21:01:11 +02:00
{
2009-09-05 01:18:47 +02:00
if ( ! IsDisposed )
2009-09-03 21:01:11 +02:00
{
2009-09-04 23:27:05 +02:00
if ( ( options & GameWindowFlags . Fullscreen ) ! = 0 )
{
//if (WindowState == WindowState.Fullscreen) WindowState = WindowState.Normal; // TODO: Revise.
device . RestoreResolution ( ) ;
}
2009-09-03 21:01:11 +02:00
implementation . Dispose ( ) ;
GC . SuppressFinalize ( this ) ;
2009-09-05 01:18:47 +02:00
IsDisposed = true ;
2009-09-03 21:01:11 +02:00
}
}
#endregion
#endregion
#region - - - Protected Members - - -
#region Methods
#region EnsureUndisposed
/// <summary>
/// Ensures that this NativeWindow has not been disposed.
/// </summary>
/// <exception cref="System.ObjectDisposedException">
/// If this NativeWindow has been disposed.
/// </exception>
protected void EnsureUndisposed ( )
{
2009-09-05 01:18:47 +02:00
if ( IsDisposed ) throw new ObjectDisposedException ( GetType ( ) . Name ) ;
2009-09-03 21:01:11 +02:00
}
#endregion
#region IsDisposed
2009-09-05 01:18:47 +02:00
/// <summary>
/// Gets or sets a <see cref="System.Boolean"/>, which indicates whether
/// this instance has been disposed.
/// </summary>
protected bool IsDisposed
2009-09-03 21:01:11 +02:00
{
2009-09-05 01:18:47 +02:00
get { return disposed ; }
set { disposed = value ; }
2009-09-03 21:01:11 +02:00
}
#endregion
#region OnClosed
/// <summary>
/// Called when the NativeWindow has closed.
/// </summary>
/// <param name="e">Not used.</param>
2009-09-04 23:27:05 +02:00
protected virtual void OnClosed ( EventArgs e )
{
2010-10-28 11:37:57 +02:00
Closed ( this , e ) ;
2009-09-04 23:27:05 +02:00
}
2009-09-03 21:01:11 +02:00
#endregion
#region OnClosing
/// <summary>
/// Called when the NativeWindow is about to close.
/// </summary>
/// <param name="e">
/// The <see cref="System.ComponentModel.CancelEventArgs" /> for this event.
/// Set e.Cancel to true in order to stop the NativeWindow from closing.</param>
2009-09-04 23:27:05 +02:00
protected virtual void OnClosing ( CancelEventArgs e )
{
2010-10-28 11:37:57 +02:00
Closing ( this , e ) ;
2009-09-04 23:27:05 +02:00
}
#endregion
#region OnDisposed
/// <summary>
/// Called when the NativeWindow is disposed.
/// </summary>
/// <param name="e">Not used.</param>
protected virtual void OnDisposed ( EventArgs e )
{
2010-10-28 11:37:57 +02:00
Disposed ( this , e ) ;
2009-09-04 23:27:05 +02:00
}
#endregion
#region OnFocusedChanged
/// <summary>
/// Called when the <see cref="OpenTK.INativeWindow.Focused"/> property of the NativeWindow has changed.
/// </summary>
/// <param name="e">Not used.</param>
protected virtual void OnFocusedChanged ( EventArgs e )
{
2010-11-08 22:48:00 +01:00
if ( ! Focused )
{
// Release cursor when losing focus, to ensure
// IDEs continue working as expected.
previous_cursor_visible = CursorVisible ;
CursorVisible = true ;
}
else if ( ! previous_cursor_visible )
{
// Make cursor invisible when focus is regained
// if cursor was invisible on previous focus loss.
previous_cursor_visible = true ;
CursorVisible = false ;
}
2010-10-28 11:37:57 +02:00
FocusedChanged ( this , e ) ;
2009-09-04 23:27:05 +02:00
}
#endregion
2009-10-18 18:52:07 +02:00
#region OnIconChanged
/// <summary>
/// Called when the <see cref="OpenTK.INativeWindow.Icon"/> property of the NativeWindow has changed.
/// </summary>
/// <param name="e">Not used.</param>
protected virtual void OnIconChanged ( EventArgs e )
{
2010-10-28 11:37:57 +02:00
IconChanged ( this , e ) ;
2009-10-18 18:52:07 +02:00
}
#endregion
2010-11-08 22:48:00 +01:00
#region OnKeyDown
/// <summary>
/// Occurs whenever a keybord key is pressed.
/// </summary>
protected virtual void OnKeyDown ( KeyboardKeyEventArgs e )
{
KeyDown ( this , e ) ;
}
#endregion
2009-09-04 23:27:05 +02:00
#region OnKeyPress
/// <summary>
/// Called when a character is typed.
/// </summary>
/// <param name="e">The <see cref="OpenTK.KeyPressEventArgs"/> for this event.</param>
protected virtual void OnKeyPress ( KeyPressEventArgs e )
{
2010-10-28 11:37:57 +02:00
KeyPress ( this , e ) ;
2009-09-04 23:27:05 +02:00
}
2009-09-03 21:01:11 +02:00
#endregion
2010-11-08 22:48:00 +01:00
#region OnKeyUp
/// <summary>
/// Called when a keybord key is released.
/// </summary>
2013-01-24 01:26:33 +01:00
/// <param name="e">The <see cref="OpenTK.Input.KeyboardKeyEventArgs"/> for this event.</param>
2010-11-08 22:48:00 +01:00
protected virtual void OnKeyUp ( KeyboardKeyEventArgs e )
{
KeyUp ( this , e ) ;
}
#endregion
2009-09-03 21:01:11 +02:00
#region OnMove
/// <summary>
/// Called when the NativeWindow is moved.
/// </summary>
/// <param name="e">Not used.</param>
2009-09-04 23:27:05 +02:00
protected virtual void OnMove ( EventArgs e )
{
2010-10-28 11:37:57 +02:00
Move ( this , e ) ;
2009-09-04 23:27:05 +02:00
}
2009-09-03 21:01:11 +02:00
#endregion
2009-10-28 00:57:44 +01:00
#region OnMouseEnter
/// <summary>
/// Called whenever the mouse cursor reenters the window <see cref="Bounds"/>.
/// </summary>
/// <param name="e">Not used.</param>
protected virtual void OnMouseEnter ( EventArgs e )
{
2010-10-28 11:37:57 +02:00
MouseEnter ( this , e ) ;
2009-10-28 00:57:44 +01:00
}
#endregion
#region OnMouseLeave
/// <summary>
/// Called whenever the mouse cursor leaves the window <see cref="Bounds"/>.
/// </summary>
/// <param name="e">Not used.</param>
protected virtual void OnMouseLeave ( EventArgs e )
{
2010-10-28 11:37:57 +02:00
MouseLeave ( this , e ) ;
2009-10-28 00:57:44 +01:00
}
#endregion
2009-09-03 21:01:11 +02:00
#region OnResize
/// <summary>
/// Called when the NativeWindow is resized.
/// </summary>
/// <param name="e">Not used.</param>
2009-09-04 23:27:05 +02:00
protected virtual void OnResize ( EventArgs e )
{
2010-10-28 11:37:57 +02:00
Resize ( this , e ) ;
2009-09-04 23:27:05 +02:00
}
#endregion
#region OnTitleChanged
/// <summary>
/// Called when the <see cref="OpenTK.INativeWindow.Title"/> property of the NativeWindow has changed.
/// </summary>
/// <param name="e">Not used.</param>
protected virtual void OnTitleChanged ( EventArgs e )
{
2010-10-28 11:37:57 +02:00
TitleChanged ( this , e ) ;
2009-09-04 23:27:05 +02:00
}
#endregion
#region OnVisibleChanged
/// <summary>
/// Called when the <see cref="OpenTK.INativeWindow.Visible"/> property of the NativeWindow has changed.
/// </summary>
/// <param name="e">Not used.</param>
protected virtual void OnVisibleChanged ( EventArgs e )
{
2010-10-28 11:37:57 +02:00
VisibleChanged ( this , e ) ;
2009-09-04 23:27:05 +02:00
}
2009-09-03 21:01:11 +02:00
#endregion
#region OnWindowBorderChanged
/// <summary>
/// Called when the WindowBorder of this NativeWindow has changed.
/// </summary>
/// <param name="e">Not used.</param>
2009-09-04 23:27:05 +02:00
protected virtual void OnWindowBorderChanged ( EventArgs e )
{
2010-10-28 11:37:57 +02:00
WindowBorderChanged ( this , e ) ;
2009-09-04 23:27:05 +02:00
}
2009-09-03 21:01:11 +02:00
#endregion
#region OnWindowStateChanged
/// <summary>
/// Called when the WindowState of this NativeWindow has changed.
/// </summary>
/// <param name="e">Not used.</param>
2009-09-04 23:27:05 +02:00
protected virtual void OnWindowStateChanged ( EventArgs e )
{
2010-10-28 11:37:57 +02:00
WindowStateChanged ( this , e ) ;
2009-09-04 23:27:05 +02:00
}
#endregion
#region ProcessEvents
/// <summary>
/// Processes operating system events until the NativeWindow becomes idle.
/// </summary>
/// <param name="retainEvents">If true, the state of underlying system event propagation will be preserved, otherwise event propagation will be enabled if it has not been already.</param>
protected void ProcessEvents ( bool retainEvents )
{
EnsureUndisposed ( ) ;
2010-03-11 23:53:11 +01:00
if ( ! retainEvents & & ! events ) Events = true ;
2009-09-04 23:27:05 +02:00
implementation . ProcessEvents ( ) ;
}
2009-09-03 21:01:11 +02:00
#endregion
#endregion
#endregion
#region - - - Private Members - - -
2009-09-04 23:27:05 +02:00
#region Methods
2009-09-03 21:01:11 +02:00
#region OnClosedInternal
private void OnClosedInternal ( object sender , EventArgs e )
{
OnClosed ( e ) ;
2009-09-04 23:27:05 +02:00
Events = false ;
2009-09-03 21:01:11 +02:00
}
#endregion
#region OnClosingInternal
2009-09-04 23:27:05 +02:00
private void OnClosingInternal ( object sender , CancelEventArgs e ) { OnClosing ( e ) ; }
2009-09-03 21:01:11 +02:00
#endregion
#region OnDisposedInternal
2009-09-04 23:27:05 +02:00
private void OnDisposedInternal ( object sender , EventArgs e ) { OnDisposed ( e ) ; }
2009-09-03 21:01:11 +02:00
#endregion
#region OnFocusedChangedInternal
2009-09-04 23:27:05 +02:00
private void OnFocusedChangedInternal ( object sender , EventArgs e ) { OnFocusedChanged ( e ) ; }
2009-09-03 21:01:11 +02:00
#endregion
2009-10-18 18:52:07 +02:00
#region OnIconChangedInternal
private void OnIconChangedInternal ( object sender , EventArgs e ) { OnIconChanged ( e ) ; }
#endregion
2009-09-03 21:01:11 +02:00
#region OnKeyPressInternal
2009-09-04 23:27:05 +02:00
private void OnKeyPressInternal ( object sender , KeyPressEventArgs e ) { OnKeyPress ( e ) ; }
2009-09-03 21:01:11 +02:00
#endregion
2009-10-28 00:57:44 +01:00
#region OnMouseEnterInternal
private void OnMouseEnterInternal ( object sender , EventArgs e ) { OnMouseEnter ( e ) ; }
#endregion
#region OnMouseLeaveInternal
private void OnMouseLeaveInternal ( object sender , EventArgs e ) { OnMouseLeave ( e ) ; }
#endregion
2009-09-03 21:01:11 +02:00
#region OnMoveInternal
2009-09-04 23:27:05 +02:00
private void OnMoveInternal ( object sender , EventArgs e ) { OnMove ( e ) ; }
2009-09-03 21:01:11 +02:00
#endregion
#region OnResizeInternal
2009-09-04 23:27:05 +02:00
private void OnResizeInternal ( object sender , EventArgs e ) { OnResize ( e ) ; }
2009-09-03 21:01:11 +02:00
#endregion
#region OnTitleChangedInternal
2009-09-04 23:27:05 +02:00
private void OnTitleChangedInternal ( object sender , EventArgs e ) { OnTitleChanged ( e ) ; }
2009-09-03 21:01:11 +02:00
#endregion
#region OnVisibleChangedInternal
2009-09-04 23:27:05 +02:00
private void OnVisibleChangedInternal ( object sender , EventArgs e ) { OnVisibleChanged ( e ) ; }
2009-09-03 21:01:11 +02:00
#endregion
#region OnWindowBorderChangedInternal
2009-09-04 23:27:05 +02:00
private void OnWindowBorderChangedInternal ( object sender , EventArgs e ) { OnWindowBorderChanged ( e ) ; }
2009-09-03 21:01:11 +02:00
#endregion
#region OnWindowStateChangedInternal
2009-09-04 23:27:05 +02:00
private void OnWindowStateChangedInternal ( object sender , EventArgs e ) { OnWindowStateChanged ( e ) ; }
2009-09-03 21:01:11 +02:00
2009-09-04 23:27:05 +02:00
#endregion
#endregion
#region Properties
#region Events
private bool Events
{
set
{
if ( value )
{
if ( events )
{
throw new InvalidOperationException ( "Event propagation is already enabled." ) ;
}
implementation . Closed + = OnClosedInternal ;
implementation . Closing + = OnClosingInternal ;
implementation . Disposed + = OnDisposedInternal ;
implementation . FocusedChanged + = OnFocusedChangedInternal ;
2009-10-18 18:52:07 +02:00
implementation . IconChanged + = OnIconChangedInternal ;
2009-09-04 23:27:05 +02:00
implementation . KeyPress + = OnKeyPressInternal ;
2009-10-28 00:57:44 +01:00
implementation . MouseEnter + = OnMouseEnterInternal ;
implementation . MouseLeave + = OnMouseLeaveInternal ;
2009-09-04 23:27:05 +02:00
implementation . Move + = OnMoveInternal ;
implementation . Resize + = OnResizeInternal ;
implementation . TitleChanged + = OnTitleChangedInternal ;
implementation . VisibleChanged + = OnVisibleChangedInternal ;
implementation . WindowBorderChanged + = OnWindowBorderChangedInternal ;
implementation . WindowStateChanged + = OnWindowStateChangedInternal ;
events = true ;
}
else if ( events )
{
implementation . Closed - = OnClosedInternal ;
implementation . Closing - = OnClosingInternal ;
implementation . Disposed - = OnDisposedInternal ;
implementation . FocusedChanged - = OnFocusedChangedInternal ;
2009-10-18 18:52:07 +02:00
implementation . IconChanged - = OnIconChangedInternal ;
2009-09-04 23:27:05 +02:00
implementation . KeyPress - = OnKeyPressInternal ;
2009-10-28 00:57:44 +01:00
implementation . MouseEnter - = OnMouseEnterInternal ;
implementation . MouseLeave - = OnMouseLeaveInternal ;
2009-09-04 23:27:05 +02:00
implementation . Move - = OnMoveInternal ;
implementation . Resize - = OnResizeInternal ;
implementation . TitleChanged - = OnTitleChangedInternal ;
implementation . VisibleChanged - = OnVisibleChangedInternal ;
implementation . WindowBorderChanged - = OnWindowBorderChangedInternal ;
implementation . WindowStateChanged - = OnWindowStateChangedInternal ;
events = false ;
}
else
{
throw new InvalidOperationException ( "Event propagation is already disabled." ) ;
}
}
2009-09-03 21:01:11 +02:00
}
#endregion
#endregion
2009-09-04 23:27:05 +02:00
#endregion
2009-09-03 21:01:11 +02:00
}
}