Browse Source

[GTK3] Lock and sync X11 display

visual-extensions-fallback
Nikita Tsukanov 9 years ago
parent
commit
fe8aae2244
  1. 2
      src/Gtk/Avalonia.Gtk3/FramebufferManager.cs
  2. 4
      src/Gtk/Avalonia.Gtk3/Gtk3Platform.cs
  3. 28
      src/Gtk/Avalonia.Gtk3/X11.cs
  4. 3
      src/Gtk/Avalonia.Gtk3/X11Framebuffer.cs

2
src/Gtk/Avalonia.Gtk3/FramebufferManager.cs

@ -40,7 +40,7 @@ namespace Avalonia.Gtk3
return new ImageSurfaceFramebuffer(_window, width, height, _window.LastKnownScaleFactor); return new ImageSurfaceFramebuffer(_window, width, height, _window.LastKnownScaleFactor);
} }
private static int X11ErrorHandler(IntPtr d, IntPtr e) private static int X11ErrorHandler(IntPtr d, ref X11.XErrorEvent e)
{ {
return 0; return 0;
} }

4
src/Gtk/Avalonia.Gtk3/Gtk3Platform.cs

@ -30,6 +30,10 @@ namespace Avalonia.Gtk3
{ {
if (!s_gtkInitialized) if (!s_gtkInitialized)
{ {
try
{
X11.XInitThreads();
}catch{}
Resolver.Resolve(); Resolver.Resolve();
Native.GtkInit(0, IntPtr.Zero); Native.GtkInit(0, IntPtr.Zero);
var disp = Native.GdkGetDefaultDisplay(); var disp = Native.GdkGetDefaultDisplay();

28
src/Gtk/Avalonia.Gtk3/X11.cs

@ -5,9 +5,18 @@ namespace Avalonia.Gtk3
{ {
class X11 class X11
{ {
[DllImport("libX11.so.6")]
public static extern IntPtr XInitThreads();
[DllImport("libX11.so.6")] [DllImport("libX11.so.6")]
public static extern IntPtr XOpenDisplay(IntPtr name); public static extern IntPtr XOpenDisplay(IntPtr name);
[DllImport("libX11.so.6")]
public static extern IntPtr XLockDisplay(IntPtr display);
[DllImport("libX11.so.6")]
public static extern IntPtr XUnlockDisplay(IntPtr display);
[DllImport("libX11.so.6")] [DllImport("libX11.so.6")]
public static extern IntPtr XFreeGC(IntPtr display, IntPtr gc); public static extern IntPtr XFreeGC(IntPtr display, IntPtr gc);
@ -23,13 +32,28 @@ namespace Avalonia.Gtk3
[DllImport("libX11.so.6")] [DllImport("libX11.so.6")]
public static extern IntPtr XSetErrorHandler(XErrorHandler handler); public static extern IntPtr XSetErrorHandler(XErrorHandler handler);
public delegate int XErrorHandler(IntPtr display, IntPtr error); [DllImport("libX11.so.6")]
public static extern int XSync(IntPtr display, bool discard);
public delegate int XErrorHandler(IntPtr display, ref XErrorEvent error);
[DllImport("libX11.so.6")] [DllImport("libX11.so.6")]
public static extern int XPutImage(IntPtr display, IntPtr drawable, IntPtr gc, ref XImage image, public static extern int XPutImage(IntPtr display, IntPtr drawable, IntPtr gc, ref XImage image,
int srcx, int srcy, int destx, int desty, uint width, uint height); int srcx, int srcy, int destx, int desty, uint width, uint height);
[StructLayout(LayoutKind.Sequential)]
public unsafe struct XErrorEvent
{
public int type;
public IntPtr* display; /* Display the event was read from */
public ulong serial; /* serial number of failed request */
public byte error_code; /* error code of failed request */
public byte request_code; /* Major op-code of failed request */
public byte minor_code; /* Minor op-code of failed request */
public IntPtr resourceid; /* resource id */
}
[StructLayout(LayoutKind.Sequential)]
public unsafe struct XImage public unsafe struct XImage
{ {
public int width, height; /* size of image */ public int width, height; /* size of image */

3
src/Gtk/Avalonia.Gtk3/X11Framebuffer.cs

@ -38,10 +38,13 @@ namespace Avalonia.Gtk3
image.depth = 24; image.depth = 24;
image.bytes_per_line = RowBytes - Width * 4; image.bytes_per_line = RowBytes - Width * 4;
image.bits_per_pixel = bitsPerPixel; image.bits_per_pixel = bitsPerPixel;
X11.XLockDisplay(_display);
X11.XInitImage(ref image); X11.XInitImage(ref image);
var gc = X11.XCreateGC(_display, _xid, 0, IntPtr.Zero); var gc = X11.XCreateGC(_display, _xid, 0, IntPtr.Zero);
X11.XPutImage(_display, _xid, gc, ref image, 0, 0, 0, 0, (uint) Width, (uint) Height); X11.XPutImage(_display, _xid, gc, ref image, 0, 0, 0, 0, (uint) Width, (uint) Height);
X11.XFreeGC(_display, gc); X11.XFreeGC(_display, gc);
X11.XSync(_display, true);
X11.XUnlockDisplay(_display);
_blob.Dispose(); _blob.Dispose();
} }

Loading…
Cancel
Save