Implemented INativeWindow.WindowBorderChanged and INativeWindow.WindowStateChanged events.
This commit is contained in:
parent
78df834e1d
commit
1bcc012f35
5 changed files with 354 additions and 279 deletions
|
@ -240,6 +240,8 @@ namespace OpenTK
|
||||||
glWindow.Closing += delegate(object sender, CancelEventArgs e) { OnClosingInternal(e); };
|
glWindow.Closing += delegate(object sender, CancelEventArgs e) { OnClosingInternal(e); };
|
||||||
glWindow.Closed += delegate(object sender, EventArgs e) { OnClosedInternal(e); };
|
glWindow.Closed += delegate(object sender, EventArgs e) { OnClosedInternal(e); };
|
||||||
//glWindow.WindowInfoChanged += delegate(object sender, EventArgs e) { OnWindowInfoChangedInternal(e); };
|
//glWindow.WindowInfoChanged += delegate(object sender, EventArgs e) { OnWindowInfoChangedInternal(e); };
|
||||||
|
glWindow.WindowBorderChanged += delegate(object sender, EventArgs e) { OnWindowBorderChangedInternal(e); };
|
||||||
|
glWindow.WindowStateChanged += delegate(object sender, EventArgs e) { OnWindowStateChangedInternal(e); };
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
|
@ -379,6 +381,28 @@ namespace OpenTK
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
#region OnWindowBorderChangedInternal
|
||||||
|
|
||||||
|
void OnWindowBorderChangedInternal(EventArgs e)
|
||||||
|
{
|
||||||
|
OnWindowBorderChanged(e);
|
||||||
|
|
||||||
|
WindowBorderChanged(this, EventArgs.Empty);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region OnWindowStateChangedInternal
|
||||||
|
|
||||||
|
void OnWindowStateChangedInternal(EventArgs e)
|
||||||
|
{
|
||||||
|
OnWindowStateChanged(e);
|
||||||
|
|
||||||
|
WindowStateChanged(this, e);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
#region OnUpdateFrameInternal
|
#region OnUpdateFrameInternal
|
||||||
|
|
||||||
private void OnUpdateFrameInternal(FrameEventArgs e)
|
private void OnUpdateFrameInternal(FrameEventArgs e)
|
||||||
|
@ -456,6 +480,20 @@ namespace OpenTK
|
||||||
protected virtual void OnWindowInfoChanged(EventArgs e)
|
protected virtual void OnWindowInfoChanged(EventArgs e)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Called when the WindowBorder for this GameWindow has changed.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="e">Not used.</param>
|
||||||
|
protected virtual void OnWindowBorderChanged(EventArgs e)
|
||||||
|
{ }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Called when the WindowState for this GameWindow has changed.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="e">Not used.</param>
|
||||||
|
protected virtual void OnWindowStateChanged(EventArgs e)
|
||||||
|
{ }
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region --- Public Members ---
|
#region --- Public Members ---
|
||||||
|
@ -1440,6 +1478,16 @@ namespace OpenTK
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public event EventHandler<EventArgs> FocusedChanged = delegate { };
|
public event EventHandler<EventArgs> FocusedChanged = delegate { };
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Occurs when the <see cref="WindowBorder"/> property of the window changes.
|
||||||
|
/// </summary>
|
||||||
|
public event EventHandler<EventArgs> WindowBorderChanged = delegate { };
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Occurs when the <see cref="WindowState"/> property of the window changes.
|
||||||
|
/// </summary>
|
||||||
|
public event EventHandler<EventArgs> WindowStateChanged = delegate { };
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Occurs whenever a character is typed.
|
/// Occurs whenever a character is typed.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
|
@ -196,6 +196,16 @@ namespace OpenTK
|
||||||
/// </summary>
|
/// </summary>
|
||||||
event EventHandler<EventArgs> FocusedChanged;
|
event EventHandler<EventArgs> FocusedChanged;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Occurs when the <see cref="WindowBorder"/> property of the window changes.
|
||||||
|
/// </summary>
|
||||||
|
event EventHandler<EventArgs> WindowBorderChanged;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Occurs when the <see cref="WindowState"/> property of the window changes.
|
||||||
|
/// </summary>
|
||||||
|
event EventHandler<EventArgs> WindowStateChanged;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Occurs whenever a character is typed.
|
/// Occurs whenever a character is typed.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
|
@ -678,103 +678,6 @@ namespace OpenTK.Platform.MacOS
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region INativeGLWindow Members
|
|
||||||
|
|
||||||
public WindowState WindowState
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
if (windowState == WindowState.Fullscreen)
|
|
||||||
return WindowState.Fullscreen;
|
|
||||||
|
|
||||||
if (Carbon.API.IsWindowCollapsed(window.WindowRef))
|
|
||||||
return WindowState.Minimized;
|
|
||||||
|
|
||||||
|
|
||||||
if (Carbon.API.IsWindowInStandardState(window.WindowRef))
|
|
||||||
{
|
|
||||||
return WindowState.Maximized;
|
|
||||||
}
|
|
||||||
|
|
||||||
return WindowState.Normal;
|
|
||||||
}
|
|
||||||
set
|
|
||||||
{
|
|
||||||
if (value == WindowState)
|
|
||||||
return;
|
|
||||||
|
|
||||||
Debug.Print("Switching window state from {0} to {1}", WindowState, value);
|
|
||||||
|
|
||||||
if (WindowState == WindowState.Fullscreen)
|
|
||||||
{
|
|
||||||
UnsetFullscreen();
|
|
||||||
}
|
|
||||||
if (WindowState == WindowState.Minimized)
|
|
||||||
{
|
|
||||||
API.CollapseWindow(window.WindowRef, false);
|
|
||||||
}
|
|
||||||
Point idealSize;
|
|
||||||
|
|
||||||
switch (value)
|
|
||||||
{
|
|
||||||
case WindowState.Fullscreen:
|
|
||||||
SetFullscreen();
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case WindowState.Maximized:
|
|
||||||
// hack because mac os has no concept of maximized. Instead windows are "zoomed"
|
|
||||||
// meaning they are maximized up to their reported ideal size. So we report a
|
|
||||||
// large ideal size.
|
|
||||||
idealSize = new Point(9000, 9000);
|
|
||||||
API.ZoomWindowIdeal(window.WindowRef, WindowPartCode.inZoomOut, ref idealSize);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case WindowState.Normal:
|
|
||||||
if (WindowState == WindowState.Maximized)
|
|
||||||
{
|
|
||||||
idealSize = new Point();
|
|
||||||
API.ZoomWindowIdeal(window.WindowRef, WindowPartCode.inZoomIn, ref idealSize);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case WindowState.Minimized:
|
|
||||||
API.CollapseWindow(window.WindowRef, true);
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
windowState = value;
|
|
||||||
|
|
||||||
OnResize();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public WindowBorder WindowBorder
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return windowBorder;
|
|
||||||
}
|
|
||||||
set
|
|
||||||
{
|
|
||||||
windowBorder = value;
|
|
||||||
|
|
||||||
if (windowBorder == WindowBorder.Resizable)
|
|
||||||
{
|
|
||||||
API.ChangeWindowAttributes(window.WindowRef, WindowAttributes.Resizable | WindowAttributes.FullZoom,
|
|
||||||
WindowAttributes.NoAttributes);
|
|
||||||
}
|
|
||||||
else if (windowBorder == WindowBorder.Fixed)
|
|
||||||
{
|
|
||||||
API.ChangeWindowAttributes(window.WindowRef, WindowAttributes.NoAttributes,
|
|
||||||
WindowAttributes.Resizable | WindowAttributes.FullZoom);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region INativeWindow Members
|
#region INativeWindow Members
|
||||||
|
|
||||||
public string Title
|
public string Title
|
||||||
|
@ -802,18 +705,6 @@ namespace OpenTK.Platform.MacOS
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public System.Drawing.Icon Icon
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
throw new NotImplementedException();
|
|
||||||
}
|
|
||||||
set
|
|
||||||
{
|
|
||||||
throw new NotImplementedException();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool Focused
|
public bool Focused
|
||||||
{
|
{
|
||||||
get { throw new NotImplementedException(); }
|
get { throw new NotImplementedException(); }
|
||||||
|
@ -921,6 +812,108 @@ namespace OpenTK.Platform.MacOS
|
||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public WindowState WindowState
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (windowState == WindowState.Fullscreen)
|
||||||
|
return WindowState.Fullscreen;
|
||||||
|
|
||||||
|
if (Carbon.API.IsWindowCollapsed(window.WindowRef))
|
||||||
|
return WindowState.Minimized;
|
||||||
|
|
||||||
|
|
||||||
|
if (Carbon.API.IsWindowInStandardState(window.WindowRef))
|
||||||
|
{
|
||||||
|
return WindowState.Maximized;
|
||||||
|
}
|
||||||
|
|
||||||
|
return WindowState.Normal;
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
if (value == WindowState)
|
||||||
|
return;
|
||||||
|
|
||||||
|
Debug.Print("Switching window state from {0} to {1}", WindowState, value);
|
||||||
|
|
||||||
|
if (WindowState == WindowState.Fullscreen)
|
||||||
|
{
|
||||||
|
UnsetFullscreen();
|
||||||
|
}
|
||||||
|
if (WindowState == WindowState.Minimized)
|
||||||
|
{
|
||||||
|
API.CollapseWindow(window.WindowRef, false);
|
||||||
|
}
|
||||||
|
Point idealSize;
|
||||||
|
|
||||||
|
switch (value)
|
||||||
|
{
|
||||||
|
case WindowState.Fullscreen:
|
||||||
|
SetFullscreen();
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case WindowState.Maximized:
|
||||||
|
// hack because mac os has no concept of maximized. Instead windows are "zoomed"
|
||||||
|
// meaning they are maximized up to their reported ideal size. So we report a
|
||||||
|
// large ideal size.
|
||||||
|
idealSize = new Point(9000, 9000);
|
||||||
|
API.ZoomWindowIdeal(window.WindowRef, WindowPartCode.inZoomOut, ref idealSize);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case WindowState.Normal:
|
||||||
|
if (WindowState == WindowState.Maximized)
|
||||||
|
{
|
||||||
|
idealSize = new Point();
|
||||||
|
API.ZoomWindowIdeal(window.WindowRef, WindowPartCode.inZoomIn, ref idealSize);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case WindowState.Minimized:
|
||||||
|
API.CollapseWindow(window.WindowRef, true);
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
windowState = value;
|
||||||
|
|
||||||
|
if (WindowStateChanged != null)
|
||||||
|
WindowStateChanged(this, EventArgs.Empty);
|
||||||
|
|
||||||
|
OnResize();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public WindowBorder WindowBorder
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return windowBorder;
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
if (windowBorder != value)
|
||||||
|
{
|
||||||
|
windowBorder = value;
|
||||||
|
|
||||||
|
if (windowBorder == WindowBorder.Resizable)
|
||||||
|
{
|
||||||
|
API.ChangeWindowAttributes(window.WindowRef, WindowAttributes.Resizable | WindowAttributes.FullZoom,
|
||||||
|
WindowAttributes.NoAttributes);
|
||||||
|
}
|
||||||
|
else if (windowBorder == WindowBorder.Fixed)
|
||||||
|
{
|
||||||
|
API.ChangeWindowAttributes(window.WindowRef, WindowAttributes.NoAttributes,
|
||||||
|
WindowAttributes.Resizable | WindowAttributes.FullZoom);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (WindowBorderChanged != null)
|
||||||
|
WindowBorderChanged(this, EventArgs.Empty);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public event EventHandler<EventArgs> Idle;
|
public event EventHandler<EventArgs> Idle;
|
||||||
|
|
||||||
public event EventHandler<EventArgs> Load;
|
public event EventHandler<EventArgs> Load;
|
||||||
|
@ -949,6 +942,10 @@ namespace OpenTK.Platform.MacOS
|
||||||
|
|
||||||
public event EventHandler<EventArgs> FocusedChanged;
|
public event EventHandler<EventArgs> FocusedChanged;
|
||||||
|
|
||||||
|
public event EventHandler<EventArgs> WindowBorderChanged;
|
||||||
|
|
||||||
|
public event EventHandler<EventArgs> WindowStateChanged;
|
||||||
|
|
||||||
public event EventHandler<KeyPressEventArgs> KeyPress;
|
public event EventHandler<KeyPressEventArgs> KeyPress;
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
|
@ -797,6 +797,9 @@ namespace OpenTK.Platform.Windows
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (WindowStateChanged != null)
|
||||||
|
WindowStateChanged(this, EventArgs.Empty);
|
||||||
|
|
||||||
if (command != 0)
|
if (command != 0)
|
||||||
Functions.ShowWindow(window.WindowHandle, command);
|
Functions.ShowWindow(window.WindowHandle, command);
|
||||||
}
|
}
|
||||||
|
@ -849,6 +852,9 @@ namespace OpenTK.Platform.Windows
|
||||||
SetWindowPosFlags.FRAMECHANGED);
|
SetWindowPosFlags.FRAMECHANGED);
|
||||||
|
|
||||||
Visible = true;
|
Visible = true;
|
||||||
|
|
||||||
|
if (WindowBorderChanged != null)
|
||||||
|
WindowBorderChanged(this, EventArgs.Empty);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -907,6 +913,10 @@ namespace OpenTK.Platform.Windows
|
||||||
|
|
||||||
public event EventHandler<EventArgs> FocusedChanged;
|
public event EventHandler<EventArgs> FocusedChanged;
|
||||||
|
|
||||||
|
public event EventHandler<EventArgs> WindowBorderChanged;
|
||||||
|
|
||||||
|
public event EventHandler<EventArgs> WindowStateChanged;
|
||||||
|
|
||||||
public event EventHandler<KeyPressEventArgs> KeyPress;
|
public event EventHandler<KeyPressEventArgs> KeyPress;
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
|
@ -839,6 +839,181 @@ namespace OpenTK.Platform.X11
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
#region WindowState
|
||||||
|
|
||||||
|
public OpenTK.WindowState WindowState
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
IntPtr actual_atom;
|
||||||
|
int actual_format;
|
||||||
|
IntPtr nitems;
|
||||||
|
IntPtr bytes_after;
|
||||||
|
IntPtr prop = IntPtr.Zero;
|
||||||
|
IntPtr atom;
|
||||||
|
//XWindowAttributes attributes;
|
||||||
|
bool fullscreen = false;
|
||||||
|
int maximized = 0;
|
||||||
|
bool minimized = false;
|
||||||
|
|
||||||
|
Functions.XGetWindowProperty(window.Display, window.WindowHandle,
|
||||||
|
_atom_net_wm_state, IntPtr.Zero, new IntPtr(256), false,
|
||||||
|
IntPtr.Zero, out actual_atom, out actual_format, out nitems, out bytes_after, ref prop);
|
||||||
|
|
||||||
|
if ((long)nitems > 0 && prop != IntPtr.Zero)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < (long)nitems; i++)
|
||||||
|
{
|
||||||
|
atom = (IntPtr)Marshal.ReadIntPtr(prop, i * IntPtr.Size);
|
||||||
|
|
||||||
|
if (atom == _atom_net_wm_state_maximized_horizontal ||
|
||||||
|
atom == _atom_net_wm_state_maximized_vertical)
|
||||||
|
maximized++;
|
||||||
|
else if (atom == _atom_net_wm_state_minimized)
|
||||||
|
minimized = true;
|
||||||
|
else if (atom == _atom_net_wm_state_fullscreen)
|
||||||
|
fullscreen = true;
|
||||||
|
}
|
||||||
|
Functions.XFree(prop);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (minimized)
|
||||||
|
return OpenTK.WindowState.Minimized;
|
||||||
|
else if (maximized == 2)
|
||||||
|
return OpenTK.WindowState.Maximized;
|
||||||
|
else if (fullscreen)
|
||||||
|
return OpenTK.WindowState.Fullscreen;
|
||||||
|
/*
|
||||||
|
attributes = new XWindowAttributes();
|
||||||
|
Functions.XGetWindowAttributes(window.Display, window.WindowHandle, ref attributes);
|
||||||
|
if (attributes.map_state == MapState.IsUnmapped)
|
||||||
|
return (OpenTK.WindowState)(-1);
|
||||||
|
*/
|
||||||
|
return OpenTK.WindowState.Normal;
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
OpenTK.WindowState current_state = this.WindowState;
|
||||||
|
|
||||||
|
if (current_state == value)
|
||||||
|
return;
|
||||||
|
|
||||||
|
Debug.Print("GameWindow {0} changing WindowState from {1} to {2}.", window.WindowHandle.ToString(),
|
||||||
|
current_state.ToString(), value.ToString());
|
||||||
|
|
||||||
|
if (current_state == OpenTK.WindowState.Minimized)
|
||||||
|
Functions.XMapWindow(window.Display, window.WindowHandle);
|
||||||
|
else if (current_state == OpenTK.WindowState.Fullscreen)
|
||||||
|
Functions.SendNetWMMessage(window, _atom_net_wm_state, _atom_remove,
|
||||||
|
_atom_net_wm_state_fullscreen,
|
||||||
|
IntPtr.Zero);
|
||||||
|
else if (current_state == OpenTK.WindowState.Maximized)
|
||||||
|
Functions.SendNetWMMessage(window, _atom_net_wm_state, _atom_toggle,
|
||||||
|
_atom_net_wm_state_maximized_horizontal,
|
||||||
|
_atom_net_wm_state_maximized_vertical);
|
||||||
|
|
||||||
|
Functions.XSync(window.Display, false);
|
||||||
|
|
||||||
|
// We can't resize the window if its border is fixed, so make it resizable first.
|
||||||
|
bool temporary_resizable = false;
|
||||||
|
WindowBorder previous_state = WindowBorder;
|
||||||
|
if (WindowBorder != WindowBorder.Resizable)
|
||||||
|
{
|
||||||
|
temporary_resizable = true;
|
||||||
|
WindowBorder = WindowBorder.Resizable;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (value)
|
||||||
|
{
|
||||||
|
case OpenTK.WindowState.Normal:
|
||||||
|
Functions.XRaiseWindow(window.Display, window.WindowHandle);
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OpenTK.WindowState.Maximized:
|
||||||
|
Functions.SendNetWMMessage(window, _atom_net_wm_state, _atom_add,
|
||||||
|
_atom_net_wm_state_maximized_horizontal,
|
||||||
|
_atom_net_wm_state_maximized_vertical);
|
||||||
|
Functions.XRaiseWindow(window.Display, window.WindowHandle);
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OpenTK.WindowState.Minimized:
|
||||||
|
// Todo: multiscreen support
|
||||||
|
Functions.XIconifyWindow(window.Display, window.WindowHandle, window.Screen);
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OpenTK.WindowState.Fullscreen:
|
||||||
|
//_previous_window_border = this.WindowBorder;
|
||||||
|
//this.WindowBorder = WindowBorder.Hidden;
|
||||||
|
Functions.SendNetWMMessage(window, _atom_net_wm_state, _atom_add,
|
||||||
|
_atom_net_wm_state_fullscreen, IntPtr.Zero);
|
||||||
|
Functions.XRaiseWindow(window.Display, window.WindowHandle);
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (temporary_resizable)
|
||||||
|
WindowBorder = previous_state;
|
||||||
|
|
||||||
|
if (WindowStateChanged != null)
|
||||||
|
WindowStateChanged(this, EventArgs.Empty);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region WindowBorder
|
||||||
|
|
||||||
|
public OpenTK.WindowBorder WindowBorder
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (IsWindowBorderHidden)
|
||||||
|
return WindowBorder.Hidden;
|
||||||
|
|
||||||
|
if (IsWindowBorderResizable)
|
||||||
|
return WindowBorder.Resizable;
|
||||||
|
else
|
||||||
|
return WindowBorder.Fixed;
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
if (WindowBorder == value)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (WindowBorder == WindowBorder.Hidden)
|
||||||
|
EnableWindowDecorations();
|
||||||
|
|
||||||
|
switch (value)
|
||||||
|
{
|
||||||
|
case WindowBorder.Fixed:
|
||||||
|
Debug.Print("Making WindowBorder fixed.");
|
||||||
|
SetWindowMinMax((short)Width, (short)Height, (short)Width, (short)Height);
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case WindowBorder.Resizable:
|
||||||
|
Debug.Print("Making WindowBorder resizable.");
|
||||||
|
SetWindowMinMax(_min_width, _min_height, -1, -1);
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case WindowBorder.Hidden:
|
||||||
|
Debug.Print("Making WindowBorder hidden.");
|
||||||
|
DisableWindowDecorations();
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (WindowBorderChanged != null)
|
||||||
|
WindowBorderChanged(this, EventArgs.Empty);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
#region Events
|
#region Events
|
||||||
|
|
||||||
public event EventHandler<EventArgs> Load;
|
public event EventHandler<EventArgs> Load;
|
||||||
|
@ -863,6 +1038,10 @@ namespace OpenTK.Platform.X11
|
||||||
|
|
||||||
public event EventHandler<EventArgs> FocusedChanged;
|
public event EventHandler<EventArgs> FocusedChanged;
|
||||||
|
|
||||||
|
public event EventHandler<EventArgs> WindowBorderChanged;
|
||||||
|
|
||||||
|
public event EventHandler<EventArgs> WindowStateChanged;
|
||||||
|
|
||||||
public event EventHandler<KeyPressEventArgs> KeyPress;
|
public event EventHandler<KeyPressEventArgs> KeyPress;
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
@ -1128,175 +1307,6 @@ namespace OpenTK.Platform.X11
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region publicOpenTK.WindowState WindowState
|
|
||||||
|
|
||||||
public OpenTK.WindowState WindowState
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
IntPtr actual_atom;
|
|
||||||
int actual_format;
|
|
||||||
IntPtr nitems;
|
|
||||||
IntPtr bytes_after;
|
|
||||||
IntPtr prop = IntPtr.Zero;
|
|
||||||
IntPtr atom;
|
|
||||||
//XWindowAttributes attributes;
|
|
||||||
bool fullscreen = false;
|
|
||||||
int maximized = 0;
|
|
||||||
bool minimized = false;
|
|
||||||
|
|
||||||
Functions.XGetWindowProperty(window.Display, window.WindowHandle,
|
|
||||||
_atom_net_wm_state, IntPtr.Zero, new IntPtr (256), false,
|
|
||||||
IntPtr.Zero, out actual_atom, out actual_format, out nitems, out bytes_after, ref prop);
|
|
||||||
|
|
||||||
if ((long)nitems > 0 && prop != IntPtr.Zero)
|
|
||||||
{
|
|
||||||
for (int i = 0; i < (long)nitems; i++)
|
|
||||||
{
|
|
||||||
atom = (IntPtr)Marshal.ReadIntPtr(prop, i * IntPtr.Size);
|
|
||||||
|
|
||||||
if (atom == _atom_net_wm_state_maximized_horizontal ||
|
|
||||||
atom == _atom_net_wm_state_maximized_vertical)
|
|
||||||
maximized++;
|
|
||||||
else if (atom == _atom_net_wm_state_minimized)
|
|
||||||
minimized = true;
|
|
||||||
else if (atom == _atom_net_wm_state_fullscreen)
|
|
||||||
fullscreen = true;
|
|
||||||
}
|
|
||||||
Functions.XFree(prop);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (minimized)
|
|
||||||
return OpenTK.WindowState.Minimized;
|
|
||||||
else if (maximized == 2)
|
|
||||||
return OpenTK.WindowState.Maximized;
|
|
||||||
else if (fullscreen)
|
|
||||||
return OpenTK.WindowState.Fullscreen;
|
|
||||||
/*
|
|
||||||
attributes = new XWindowAttributes();
|
|
||||||
Functions.XGetWindowAttributes(window.Display, window.WindowHandle, ref attributes);
|
|
||||||
if (attributes.map_state == MapState.IsUnmapped)
|
|
||||||
return (OpenTK.WindowState)(-1);
|
|
||||||
*/
|
|
||||||
return OpenTK.WindowState.Normal;
|
|
||||||
}
|
|
||||||
set
|
|
||||||
{
|
|
||||||
OpenTK.WindowState current_state = this.WindowState;
|
|
||||||
|
|
||||||
if (current_state == value)
|
|
||||||
return;
|
|
||||||
|
|
||||||
Debug.Print("GameWindow {0} changing WindowState from {1} to {2}.", window.WindowHandle.ToString(),
|
|
||||||
current_state.ToString(), value.ToString());
|
|
||||||
|
|
||||||
if (current_state == OpenTK.WindowState.Minimized)
|
|
||||||
Functions.XMapWindow(window.Display, window.WindowHandle);
|
|
||||||
else if (current_state == OpenTK.WindowState.Fullscreen)
|
|
||||||
Functions.SendNetWMMessage(window, _atom_net_wm_state, _atom_remove,
|
|
||||||
_atom_net_wm_state_fullscreen,
|
|
||||||
IntPtr.Zero);
|
|
||||||
else if (current_state == OpenTK.WindowState.Maximized)
|
|
||||||
Functions.SendNetWMMessage(window, _atom_net_wm_state, _atom_toggle,
|
|
||||||
_atom_net_wm_state_maximized_horizontal,
|
|
||||||
_atom_net_wm_state_maximized_vertical);
|
|
||||||
|
|
||||||
Functions.XSync(window.Display, false);
|
|
||||||
|
|
||||||
// We can't resize the window if its border is fixed, so make it resizable first.
|
|
||||||
bool temporary_resizable = false;
|
|
||||||
WindowBorder previous_state = WindowBorder;
|
|
||||||
if (WindowBorder != WindowBorder.Resizable)
|
|
||||||
{
|
|
||||||
temporary_resizable = true;
|
|
||||||
WindowBorder = WindowBorder.Resizable;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (value)
|
|
||||||
{
|
|
||||||
case OpenTK.WindowState.Normal:
|
|
||||||
Functions.XRaiseWindow(window.Display, window.WindowHandle);
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case OpenTK.WindowState.Maximized:
|
|
||||||
Functions.SendNetWMMessage(window, _atom_net_wm_state, _atom_add,
|
|
||||||
_atom_net_wm_state_maximized_horizontal,
|
|
||||||
_atom_net_wm_state_maximized_vertical);
|
|
||||||
Functions.XRaiseWindow(window.Display, window.WindowHandle);
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case OpenTK.WindowState.Minimized:
|
|
||||||
// Todo: multiscreen support
|
|
||||||
Functions.XIconifyWindow(window.Display, window.WindowHandle, window.Screen);
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case OpenTK.WindowState.Fullscreen:
|
|
||||||
//_previous_window_border = this.WindowBorder;
|
|
||||||
//this.WindowBorder = WindowBorder.Hidden;
|
|
||||||
Functions.SendNetWMMessage(window, _atom_net_wm_state, _atom_add,
|
|
||||||
_atom_net_wm_state_fullscreen, IntPtr.Zero);
|
|
||||||
Functions.XRaiseWindow(window.Display, window.WindowHandle);
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (temporary_resizable)
|
|
||||||
WindowBorder = previous_state;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region public OpenTK.WindowBorder WindowBorder
|
|
||||||
|
|
||||||
public OpenTK.WindowBorder WindowBorder
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
if (IsWindowBorderHidden)
|
|
||||||
return WindowBorder.Hidden;
|
|
||||||
|
|
||||||
if (IsWindowBorderResizable)
|
|
||||||
return WindowBorder.Resizable;
|
|
||||||
else
|
|
||||||
return WindowBorder.Fixed;
|
|
||||||
}
|
|
||||||
set
|
|
||||||
{
|
|
||||||
if (WindowBorder == value)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (WindowBorder == WindowBorder.Hidden)
|
|
||||||
EnableWindowDecorations();
|
|
||||||
|
|
||||||
switch (value)
|
|
||||||
{
|
|
||||||
case WindowBorder.Fixed:
|
|
||||||
Debug.Print("Making WindowBorder fixed.");
|
|
||||||
SetWindowMinMax((short)Width, (short)Height, (short)Width, (short)Height);
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case WindowBorder.Resizable:
|
|
||||||
Debug.Print("Making WindowBorder resizable.");
|
|
||||||
SetWindowMinMax(_min_width, _min_height, -1, -1);
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case WindowBorder.Hidden:
|
|
||||||
Debug.Print("Making WindowBorder hidden.");
|
|
||||||
DisableWindowDecorations();
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region IDisposable Members
|
#region IDisposable Members
|
||||||
|
|
Loading…
Reference in a new issue