From 456470fb7d3905e3cd8d9cf96e4baac14782ad10 Mon Sep 17 00:00:00 2001 From: Levent Duivel Date: Mon, 11 Nov 2024 03:22:39 +0500 Subject: [PATCH] optional garbage tuning --- screendump/FrameUpdater.m | 20 ++++++++++++++----- screendump/ScreenDumpVNC.m | 4 +++- .../Preferences/screendump/Preferences.plist | 20 +++++++++++++++++++ 3 files changed, 38 insertions(+), 6 deletions(-) diff --git a/screendump/FrameUpdater.m b/screendump/FrameUpdater.m index 8498585..17f9b40 100644 --- a/screendump/FrameUpdater.m +++ b/screendump/FrameUpdater.m @@ -15,9 +15,10 @@ IOSurfaceRef _staticBuffer; size_t _width; size_t _height; + BOOL _useCADisplayLink; } --(instancetype)initWithSurfaceInfo:(IOSurfaceRef)screenSurface rfbScreenInfo:(rfbScreenInfoPtr)rfbScreenInfo accelerator:(IOSurfaceAcceleratorRef)accelerator staticBuffer:(IOSurfaceRef)staticBuffer width:(size_t)width height:(size_t)height { +-(instancetype)initWithSurfaceInfo:(IOSurfaceRef)screenSurface rfbScreenInfo:(rfbScreenInfoPtr)rfbScreenInfo accelerator:(IOSurfaceAcceleratorRef)accelerator staticBuffer:(IOSurfaceRef)staticBuffer width:(size_t)width height:(size_t)height useCADisplayLink:(BOOL)useCADisplayLink { if ((self = [super init])) { _q = [[NSOperationQueue alloc] init]; _updatingFrames = NO; @@ -30,6 +31,7 @@ _staticBuffer = staticBuffer; _width = width; _height = height; + _useCADisplayLink = useCADisplayLink; } return self; } @@ -58,17 +60,25 @@ dispatch_async(dispatch_get_main_queue(), ^(void){ [_updateFrameTimer invalidate]; + _updateFrameTimer = nil; _updatingFrames = NO; }); } -(void)startFrameLoop { - // if (size_image == 0) VNCSetup(); [self stopFrameLoop]; _updatingFrames = YES; - dispatch_async(dispatch_get_main_queue(), ^(void){ - _updateFrameTimer = [NSTimer scheduledTimerWithTimeInterval:1/400 target:self selector:@selector(_updateFrame) userInfo:nil repeats:YES]; - }); + + if (_useCADisplayLink) { + CADisplayLink *displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(_updateFrame)]; + displayLink.preferredFramesPerSecond = 60; // Adjust as needed + [displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode]; + _updateFrameTimer = (NSTimer *)displayLink; + } else { + dispatch_async(dispatch_get_main_queue(), ^(void){ + _updateFrameTimer = [NSTimer scheduledTimerWithTimeInterval:1/400 target:self selector:@selector(_updateFrame) userInfo:nil repeats:YES]; + }); + } } -(void)dealloc { diff --git a/screendump/ScreenDumpVNC.m b/screendump/ScreenDumpVNC.m index bd2c50e..176f4ec 100644 --- a/screendump/ScreenDumpVNC.m +++ b/screendump/ScreenDumpVNC.m @@ -142,7 +142,9 @@ free(arg0); - _frameUpdater = [[FrameUpdater alloc] initWithSurfaceInfo:_screenSurface rfbScreenInfo:_rfbScreenInfo accelerator:_accelerator staticBuffer:_staticBuffer width:_width height:_height]; + NSDictionary* defaults = getPrefsForAppId(@"ru.mostmodest.screendump"); + bool useCADisplayLink = [[defaults objectForKey:@"displaysync"]?:@NO boolValue]; + _frameUpdater = [[FrameUpdater alloc] initWithSurfaceInfo:_screenSurface rfbScreenInfo:_rfbScreenInfo accelerator:_accelerator staticBuffer:_staticBuffer width:_width height:_height useCADisplayLink:useCADisplayLink]; } -(rfbBool)handleVNCAuthorization:(rfbClientPtr)client data:(const char *)data size:(int)size { diff --git a/screendump/layout/Library/PreferenceLoader/Preferences/screendump/Preferences.plist b/screendump/layout/Library/PreferenceLoader/Preferences/screendump/Preferences.plist index 968f93c..bae2474 100644 --- a/screendump/layout/Library/PreferenceLoader/Preferences/screendump/Preferences.plist +++ b/screendump/layout/Library/PreferenceLoader/Preferences/screendump/Preferences.plist @@ -81,6 +81,26 @@ isNumeric + + cell + PSGroupCell + label + Tuning + + + PostNotification + ru.mostmodest.screendump/restart + cell + PSSwitchCell + default + + defaults + ru.mostmodest.screendump + key + displaysync + label + Update screen using CADisplayLink +