From f2f30fe0068f7c739ea9fe39c6edb6f214827a29 Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Tue, 7 Feb 2017 23:47:08 +0300 Subject: [PATCH] Implemented WindowState for GTK3 --- src/Gtk/Avalonia.Gtk3/Interop/Native.cs | 21 +++++++++++++ src/Gtk/Avalonia.Gtk3/WindowImpl.cs | 41 ++++++++++++++++++++----- 2 files changed, 54 insertions(+), 8 deletions(-) diff --git a/src/Gtk/Avalonia.Gtk3/Interop/Native.cs b/src/Gtk/Avalonia.Gtk3/Interop/Native.cs index cffdebeeab..45c197e71d 100644 --- a/src/Gtk/Avalonia.Gtk3/Interop/Native.cs +++ b/src/Gtk/Avalonia.Gtk3/Interop/Native.cs @@ -156,6 +156,22 @@ namespace Avalonia.Gtk3.Interop [UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gdk)] public delegate IntPtr gdk_window_get_pointer(IntPtr raw, out int x, out int y, out int mask); + + [UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gdk)] + public delegate GdkWindowState gdk_window_get_state(IntPtr window); + + [UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gdk)] + public delegate void gdk_window_iconify(IntPtr window); + + [UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gdk)] + public delegate void gdk_window_deiconify(IntPtr window); + + [UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gdk)] + public delegate void gdk_window_maximize(IntPtr window); + + [UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gdk)] + public delegate void gdk_window_unmaximize(IntPtr window); + [UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gdk)] public delegate void gtk_window_set_geometry_hints(GtkWindow window, IntPtr geometry_widget, ref GdkGeometry geometry, GdkWindowHints geom_mask); @@ -303,6 +319,11 @@ namespace Avalonia.Gtk3.Interop public static D.gdk_cursor_new GdkCursorNew; public static D.gdk_window_get_origin GdkWindowGetOrigin; public static D.gdk_window_get_pointer GdkWindowGetPointer; + public static D.gdk_window_get_state GdkWindowGetState; + public static D.gdk_window_iconify GdkWindowIconify; + public static D.gdk_window_deiconify GdkWindowDeiconify; + public static D.gdk_window_maximize GdkWindowMaximize; + public static D.gdk_window_unmaximize GdkWindowUnmaximize; public static D.gdk_window_begin_move_drag GdkWindowBeginMoveDrag; public static D.gdk_window_begin_resize_drag GdkWindowBeginResizeDrag; public static D.gdk_event_request_motions GdkEventRequestMotions; diff --git a/src/Gtk/Avalonia.Gtk3/WindowImpl.cs b/src/Gtk/Avalonia.Gtk3/WindowImpl.cs index d1a689b75f..631944872f 100644 --- a/src/Gtk/Avalonia.Gtk3/WindowImpl.cs +++ b/src/Gtk/Avalonia.Gtk3/WindowImpl.cs @@ -7,21 +7,42 @@ namespace Avalonia.Gtk3 { class WindowImpl : TopLevelImpl, IWindowImpl { - public WindowState WindowState { get; set; } //STUB + public WindowImpl() : base(Native.GtkWindowNew(GtkWindowType.TopLevel)) + { + } + public void SetTitle(string title) { using (var t = new Utf8Buffer(title)) Native.GtkWindowSetTitle(GtkWidget, t); } - class EmptyDisposable : IDisposable + public WindowState WindowState { - public void Dispose() + get + { + var state = Native.GdkWindowGetState(Native.GtkWidgetGetWindow(GtkWidget)); + if (state.HasFlag(GdkWindowState.Iconified)) + return WindowState.Minimized; + if (state.HasFlag(GdkWindowState.Maximized)) + return WindowState.Maximized; + return WindowState.Normal; + } + set { - + var w = Native.GtkWidgetGetWindow(GtkWidget); + if (value == WindowState.Minimized) + Native.GdkWindowIconify(w); + else if (value == WindowState.Maximized) + Native.GdkWindowMaximize(w); + else + { + Native.GdkWindowUnmaximize(w); + Native.GdkWindowDeiconify(w); + } } } - + public IDisposable ShowDialog() { Native.GtkWindowSetModal(GtkWidget, true); @@ -33,13 +54,17 @@ namespace Avalonia.Gtk3 public void SetIcon(IWindowIconImpl icon) => Native.GtkWindowSetIcon(GtkWidget, (Pixbuf) icon); - public WindowImpl() : base(Native.GtkWindowNew(GtkWindowType.TopLevel)) + public void SetCoverTaskbarWhenMaximized(bool enable) { + //Why do we even have that? } - public void SetCoverTaskbarWhenMaximized(bool enable) + class EmptyDisposable : IDisposable { - //Why do we even have that? + public void Dispose() + { + + } } } }