private static void DebugCallbackThunk(UInt32 source, UInt32 type, UInt32 id, UInt32 severity, Int32 length, IntPtr message, IntPtr userParam) { var messageString = Marshal.PtrToStringAnsi(message, length); var messageLevel = DebugLevels.Info; switch (severity) { case gl.DEBUG_SEVERITY_MEDIUM: messageLevel = DebugLevels.Warning; break; case gl.DEBUG_SEVERITY_HIGH: messageLevel = DebugLevels.Error; break; } var uv = UltravioletContext.RequestCurrent(); if (uv == null) { return; } var gfx = uv.GetGraphics() as OpenGLUltravioletGraphics; if (gfx == null) { return; } gfx.debugCallback?.Invoke(uv, messageLevel, messageString); }
protected UltravioletContext Foo(Func <UltravioletContext> uv) { try { return(uv()); } catch { var current = UltravioletContext.RequestCurrent(); if (current != null) { current.Dispose(); } throw; } }
/// <summary> /// Initializes the singleton resource. /// </summary> private void InitializeResource() { var uv = UltravioletContext.RequestCurrent(); if (uv == null) { return; } if (resource == null || resource.Ultraviolet != uv) { if (ShouldInitializeResource(uv)) { resource = initializer(uv); } } }
/// <summary> /// Initializes a new instance of the <see cref="UltravioletSingleton{T}"/> class. /// </summary> /// <param name="flags">A set of flags which modify the singleton's behavior.</param> /// <param name="initializer">A function which initializes a new instance of the bound resource.</param> public UltravioletSingleton(UltravioletSingletonFlags flags, Func <UltravioletContext, T> initializer) { Contract.Require(initializer, nameof(initializer)); this.flags = flags; this.initializer = initializer; var uv = UltravioletContext.RequestCurrent(); if (uv != null && uv.IsInitialized && ShouldInitializeResource(uv)) { resource = initializer(uv); } UltravioletContext.ContextInitialized += UltravioletContext_ContextInitialized; UltravioletContext.ContextInvalidated += UltravioletContext_ContextInvalidated; }