Browse Source

Merge pull request #1231 from AvaloniaUI/override-redirect-for-popups

[GTK3] Special resize handling for popups
pull/1236/head
danwalmsley 9 years ago
committed by GitHub
parent
commit
f796b33df4
  1. 4
      src/Gtk/Avalonia.Gtk3/Interop/Native.cs
  2. 1
      src/Gtk/Avalonia.Gtk3/PopupImpl.cs
  3. 36
      src/Gtk/Avalonia.Gtk3/WindowBaseImpl.cs

4
src/Gtk/Avalonia.Gtk3/Interop/Native.cs

@ -102,6 +102,9 @@ namespace Avalonia.Gtk3.Interop
[UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gdk)] [UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gdk)]
public delegate void gdk_window_resize(IntPtr gtkWindow, int width, int height); public delegate void gdk_window_resize(IntPtr gtkWindow, int width, int height);
[UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gdk)]
public delegate void gdk_window_set_override_redirect(IntPtr gdkWindow, bool value);
[UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gtk)] [UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Gtk)]
public delegate void gtk_widget_realize(GtkWidget gtkWidget); public delegate void gtk_widget_realize(GtkWidget gtkWidget);
@ -402,6 +405,7 @@ namespace Avalonia.Gtk3.Interop
public static D.gtk_window_get_size GtkWindowGetSize; public static D.gtk_window_get_size GtkWindowGetSize;
public static D.gtk_window_resize GtkWindowResize; public static D.gtk_window_resize GtkWindowResize;
public static D.gdk_window_resize GdkWindowResize; public static D.gdk_window_resize GdkWindowResize;
public static D.gdk_window_set_override_redirect GdkWindowSetOverrideRedirect;
public static D.gtk_widget_set_size_request GtkWindowSetSizeRequest; public static D.gtk_widget_set_size_request GtkWindowSetSizeRequest;
public static D.gtk_window_set_default_size GtkWindowSetDefaultSize; public static D.gtk_window_set_default_size GtkWindowSetDefaultSize;
public static D.gtk_window_get_position GtkWindowGetPosition; public static D.gtk_window_get_position GtkWindowGetPosition;

1
src/Gtk/Avalonia.Gtk3/PopupImpl.cs

@ -19,6 +19,7 @@ namespace Avalonia.Gtk3
public PopupImpl() : base(CreateWindow()) public PopupImpl() : base(CreateWindow())
{ {
OverrideRedirect = true;
} }
} }
} }

36
src/Gtk/Avalonia.Gtk3/WindowBaseImpl.cs

@ -32,6 +32,7 @@ namespace Avalonia.Gtk3
private IDeferredRenderOperation _nextRenderOperation; private IDeferredRenderOperation _nextRenderOperation;
private readonly AutoResetEvent _canSetNextOperation = new AutoResetEvent(true); private readonly AutoResetEvent _canSetNextOperation = new AutoResetEvent(true);
internal IntPtr? GdkWindowHandle; internal IntPtr? GdkWindowHandle;
private bool _overrideRedirect;
public WindowBaseImpl(GtkWindow gtkWidget) public WindowBaseImpl(GtkWindow gtkWidget)
{ {
@ -69,12 +70,15 @@ namespace Avalonia.Gtk3
private bool OnConfigured(IntPtr gtkwidget, IntPtr ev, IntPtr userdata) private bool OnConfigured(IntPtr gtkwidget, IntPtr ev, IntPtr userdata)
{ {
int w, h; int w, h;
Native.GtkWindowGetSize(GtkWidget, out w, out h); if (!OverrideRedirect)
var size = ClientSize = new Size(w, h);
if (_lastSize != size)
{ {
Resized?.Invoke(size); Native.GtkWindowGetSize(GtkWidget, out w, out h);
_lastSize = size; var size = ClientSize = new Size(w, h);
if (_lastSize != size)
{
Resized?.Invoke(size);
_lastSize = size;
}
} }
var pos = Position; var pos = Position;
if (_lastPosition != pos) if (_lastPosition != pos)
@ -406,6 +410,28 @@ namespace Avalonia.Gtk3
if (GtkWidget.IsClosed) if (GtkWidget.IsClosed)
return; return;
Native.GtkWindowResize(GtkWidget, (int)value.Width, (int)value.Height); Native.GtkWindowResize(GtkWidget, (int)value.Width, (int)value.Height);
if (OverrideRedirect)
{
var size = ClientSize = value;
if (_lastSize != size)
{
Resized?.Invoke(size);
_lastSize = size;
}
}
}
public bool OverrideRedirect
{
get => _overrideRedirect;
set
{
if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
{
Native.GdkWindowSetOverrideRedirect(Native.GtkWidgetGetWindow(GtkWidget), value);
_overrideRedirect = value;
}
}
} }
public IScreenImpl Screen public IScreenImpl Screen

Loading…
Cancel
Save