CFRunLoopRun() private method

private CFRunLoopRun ( ) : void
return void
Example #1
0
        unsafe void ReadThread()
        {
            if (!HandleAcquire())
            {
                return;
            }
            _readRunLoop = NativeMethods.CFRunLoopGetCurrent();

            try
            {
                var inputCallback   = new NativeMethods.IOHIDReportCallback(ReadThreadCallback);
                var removalCallback = new NativeMethods.IOHIDCallback(RemovalCallback);

                byte[] inputReport = new byte[Device.GetMaxInputReportLength()];
                fixed(byte *inputReportBytes = inputReport)
                {
                    NativeMethods.IOHIDDeviceRegisterInputReportCallback(_handle,
                                                                         (IntPtr)inputReportBytes, (IntPtr)inputReport.Length,
                                                                         inputCallback, IntPtr.Zero);
                    NativeMethods.IOHIDDeviceRegisterRemovalCallback(_handle, removalCallback, IntPtr.Zero);
                    NativeMethods.IOHIDDeviceScheduleWithRunLoop(_handle, _readRunLoop, NativeMethods.kCFRunLoopDefaultMode);
                    NativeMethods.CFRunLoopRun();
                    NativeMethods.IOHIDDeviceUnscheduleFromRunLoop(_handle, _readRunLoop, NativeMethods.kCFRunLoopDefaultMode);
                }

                GC.KeepAlive(this);
                GC.KeepAlive(inputCallback);
                GC.KeepAlive(removalCallback);
                GC.KeepAlive(_inputQueue);
            }
            finally
            {
                HandleRelease();
            }
        }
Example #2
0
        protected override void Run(Action readyCallback)
        {
            using (var manager = NativeMethods.IOHIDManagerCreate(IntPtr.Zero).ToCFType())
            {
                RunAssert(manager.IsSet, "HidSharp IOHIDManagerCreate failed.");

                using (var matching = NativeMethods.IOServiceMatching("IOHIDDevice").ToCFType())
                {
                    RunAssert(matching.IsSet, "HidSharp IOServiceMatching failed.");

                    var devicesChangedCallback = new NativeMethods.IOHIDDeviceCallback(DevicesChangedCallback);
                    NativeMethods.IOHIDManagerSetDeviceMatching(manager.Handle, matching.Handle);
                    NativeMethods.IOHIDManagerRegisterDeviceMatchingCallback(manager.Handle, devicesChangedCallback, IntPtr.Zero);
                    NativeMethods.IOHIDManagerRegisterDeviceRemovalCallback(manager.Handle, devicesChangedCallback, IntPtr.Zero);

                    var runLoop = NativeMethods.CFRunLoopGetCurrent();
                    NativeMethods.CFRetain(runLoop);
                    NativeMethods.IOHIDManagerScheduleWithRunLoop(manager, runLoop, NativeMethods.kCFRunLoopDefaultMode);
                    try
                    {
                        readyCallback();
                        NativeMethods.CFRunLoopRun();
                    }
                    finally
                    {
                        NativeMethods.IOHIDManagerUnscheduleFromRunLoop(manager, runLoop, NativeMethods.kCFRunLoopDefaultMode);
                        NativeMethods.CFRelease(runLoop);
                    }

                    GC.KeepAlive(devicesChangedCallback);
                }
            }
        }