コード例 #1
0
        internal X11PlatformLifetimeEvents(AvaloniaX11Platform platform)
        {
            _platform = platform;

            if (ICELib.IceAddConnectionWatch(
                    Marshal.GetFunctionPointerForDelegate(s_iceWatchProcDelegate),
                    IntPtr.Zero) == 0)
            {
                Logger.TryGet(LogEventLevel.Warning, LogArea.X11Platform)?.Log(this,
                                                                               "SMLib was unable to add an ICE connection watcher.");
                return;
            }

            byte[] errorBuf    = new byte[255];
            IntPtr clientIdRet = IntPtr.Zero;
            var    smcConn     = SMLib.SmcOpenConnection(null,
                                                         IntPtr.Zero, 1, 0,
                                                         SmcSaveYourselfProcMask |
                                                         SmcSaveCompleteProcMask |
                                                         SmcShutdownCancelledProcMask |
                                                         SmcDieProcMask,
                                                         ref s_callbacks,
                                                         null,
                                                         ref clientIdRet,
                                                         errorBuf.Length,
                                                         errorBuf);

            if (smcConn == IntPtr.Zero)
            {
                Logger.TryGet(LogEventLevel.Warning, LogArea.X11Platform)?.Log(this,
                                                                               $"SMLib/ICELib reported a new error: {Encoding.ASCII.GetString(errorBuf)}");
                return;
            }

            if (!s_nativeToManagedMapper.TryAdd(smcConn, this))
            {
                Logger.TryGet(LogEventLevel.Warning, LogArea.X11Platform)?.Log(this,
                                                                               "SMLib was unable to add this instance to the native to managed map.");
                return;
            }

            _ = SMLib.SmcSetErrorHandler(Marshal.GetFunctionPointerForDelegate(s_smcErrorHandlerDelegate));
            _ = ICELib.IceSetErrorHandler(Marshal.GetFunctionPointerForDelegate(s_iceErrorHandlerDelegate));
            _ = ICELib.IceSetIOErrorHandler(Marshal.GetFunctionPointerForDelegate(s_iceIoErrorHandlerDelegate));

            _currentSmcConn = smcConn;
            _currentIceConn = SMLib.SmcGetIceConnection(smcConn);

            Task.Run(() =>
            {
                var token = _cancellationTokenSource.Token;
                while (!token.IsCancellationRequested)
                {
                    HandleRequests();
                }
            }, _cancellationTokenSource.Token);
        }
コード例 #2
0
        private static void IceWatchHandler(IntPtr iceConn, IntPtr clientData, bool opening, IntPtr *watchData)
        {
            if (!opening)
            {
                return;
            }

            ICELib.IceRemoveConnectionWatch(Marshal.GetFunctionPointerForDelegate(s_iceWatchProcDelegate),
                                            IntPtr.Zero);
        }
コード例 #3
0
 private void HandleRequests()
 {
     if (ICELib.IceProcessMessages(_currentIceConn, out _, out _) ==
         ICELib.IceProcessMessagesStatus.IceProcessMessagesIoError)
     {
         Logger.TryGet(LogEventLevel.Warning, LogArea.X11Platform)?.Log(this,
                                                                        "SMLib lost its underlying ICE connection.");
         Dispose();
     }
 }