Browse Source

Implemented WindowState for GTK3

Nikita Tsukanov 8 years ago
parent
commit
f2f30fe006
2 changed files with 54 additions and 8 deletions
  1. 21 0
      src/Gtk/Avalonia.Gtk3/Interop/Native.cs
  2. 33 8
      src/Gtk/Avalonia.Gtk3/WindowImpl.cs

+ 21 - 0
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;

+ 33 - 8
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()
+            {
+
+            }
         }
     }
 }