private static int WlProxyDispatcher(IntPtr implementation, IntPtr target, uint opcode, ref WlMessage message, WlArgument *arguments) { var id = unchecked ((UIntPtr)implementation.ToPointer()).ToUInt32(); WlProxy proxy; lock (Proxies) { if (!Proxies.TryGetValue(id, out var weakRef)) { return(0); } if (!weakRef.TryGetTarget(out proxy)) { Proxies.Remove(id); return(0); } } try { proxy.DispatchEvent(opcode, ref message, arguments); } catch (Exception e) { proxy.Display.OnUnhandledException(proxy, e); } return(0); }
internal unsafe void DispatchEvent(uint opcode, ref WlMessage message, WlArgument *arguments) { // Sanity checks // TODO: trigger a warning or something if this happens for some weird reason var iface = GetWlInterface(); if (opcode >= iface->EventCount) { return; } var protocolMsg = iface->Events[opcode]; if (!strcmp(protocolMsg.Name, message.Name)) { return; } if (!strcmp(protocolMsg.Signature, message.Signature)) { return; } DispatchEvent(opcode, arguments); }
protected abstract void DispatchEvent(uint opcode, WlArgument *arguments);
public static extern IntPtr wl_proxy_marshal_array_constructor(IntPtr p, uint opcode, WlArgument *args, ref WlInterface iface);
public static extern void wl_proxy_marshal_array(IntPtr p, uint opcode, WlArgument *args);