diff --git a/DiscreteScroll.xcodeproj/project.pbxproj b/DiscreteScroll.xcodeproj/project.pbxproj index 70f3a6f..0fa84c5 100644 --- a/DiscreteScroll.xcodeproj/project.pbxproj +++ b/DiscreteScroll.xcodeproj/project.pbxproj @@ -3,19 +3,19 @@ archiveVersion = 1; classes = { }; - objectVersion = 50; + objectVersion = 54; objects = { /* Begin PBXBuildFile section */ - C3F94D482C0406330051923E /* main.c in Sources */ = {isa = PBXBuildFile; fileRef = C3F94D472C0406330051923E /* main.c */; }; + 948CB3262CE4B90D0024F5A6 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 948CB3252CE4B2410024F5A6 /* main.m */; }; C3F94D562C0408930051923E /* LICENSE in Resources */ = {isa = PBXBuildFile; fileRef = C3F94D542C0408930051923E /* LICENSE */; }; C3F94D572C0408930051923E /* README.md in Resources */ = {isa = PBXBuildFile; fileRef = C3F94D552C0408930051923E /* README.md */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ + 948CB3252CE4B2410024F5A6 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; C3F94D3B2C0406320051923E /* DiscreteScroll.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = DiscreteScroll.app; sourceTree = BUILT_PRODUCTS_DIR; }; C3F94D462C0406330051923E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - C3F94D472C0406330051923E /* main.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = main.c; sourceTree = ""; }; C3F94D542C0408930051923E /* LICENSE */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = LICENSE; sourceTree = ""; }; C3F94D552C0408930051923E /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; /* End PBXFileReference section */ @@ -53,7 +53,7 @@ isa = PBXGroup; children = ( C3F94D462C0406330051923E /* Info.plist */, - C3F94D472C0406330051923E /* main.c */, + 948CB3252CE4B2410024F5A6 /* main.m */, ); path = DiscreteScroll; sourceTree = ""; @@ -84,7 +84,8 @@ C3F94D332C0406320051923E /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 1240; + BuildIndependentTargetsInParallel = YES; + LastUpgradeCheck = 1610; TargetAttributes = { C3F94D3A2C0406320051923E = { CreatedOnToolsVersion = 12.4; @@ -126,7 +127,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - C3F94D482C0406330051923E /* main.c in Sources */, + 948CB3262CE4B90D0024F5A6 /* main.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -167,9 +168,11 @@ CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; @@ -226,9 +229,11 @@ CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; @@ -250,12 +255,13 @@ CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; CURRENT_PROJECT_VERSION = 5; + DEAD_CODE_STRIPPING = YES; INFOPLIST_FILE = DiscreteScroll/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/../Frameworks", ); - MACOSX_DEPLOYMENT_TARGET = 10.9; + MACOSX_DEPLOYMENT_TARGET = 11.5; MARKETING_VERSION = 1.2.1; PRODUCT_BUNDLE_IDENTIFIER = com.emreyolcu.DiscreteScroll; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -268,12 +274,13 @@ CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; CURRENT_PROJECT_VERSION = 5; + DEAD_CODE_STRIPPING = YES; INFOPLIST_FILE = DiscreteScroll/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/../Frameworks", ); - MACOSX_DEPLOYMENT_TARGET = 10.9; + MACOSX_DEPLOYMENT_TARGET = 11.5; MARKETING_VERSION = 1.2.1; PRODUCT_BUNDLE_IDENTIFIER = com.emreyolcu.DiscreteScroll; PRODUCT_NAME = "$(TARGET_NAME)"; diff --git a/DiscreteScroll.xcodeproj/xcshareddata/xcschemes/DiscreteScroll.xcscheme b/DiscreteScroll.xcodeproj/xcshareddata/xcschemes/DiscreteScroll.xcscheme new file mode 100644 index 0000000..dcce0b7 --- /dev/null +++ b/DiscreteScroll.xcodeproj/xcshareddata/xcschemes/DiscreteScroll.xcscheme @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/DiscreteScroll/main.c b/DiscreteScroll/main.m similarity index 80% rename from DiscreteScroll/main.c rename to DiscreteScroll/main.m index 52fbc36..3ba3cfa 100644 --- a/DiscreteScroll/main.c +++ b/DiscreteScroll/main.m @@ -1,3 +1,5 @@ +#import + #include #define DEFAULT_LINES 3 @@ -8,10 +10,16 @@ static bool TRUSTED; static int LINES; +static CFArrayRef EXCEPTIONS; + static CGEventRef tapCallback(CGEventTapProxy proxy, CGEventType type, CGEventRef event, void *userInfo) { - if (CGEventGetIntegerValueField(event, kCGScrollWheelEventIsContinuous) == 0) { + NSRunningApplication *focused = [[NSWorkspace sharedWorkspace] frontmostApplication]; + CFRange range = CFRangeMake(0, CFArrayGetCount(EXCEPTIONS)); + bool exceptFlag = CFArrayContainsValue(EXCEPTIONS, range, (__bridge const void *)(focused.localizedName)); + + if (CGEventGetIntegerValueField(event, kCGScrollWheelEventIsContinuous) == 0 && !exceptFlag) { int delta = (int)CGEventGetIntegerValueField(event, kCGScrollWheelEventPointDeltaAxis1); CGEventSetIntegerValueField(event, kCGScrollWheelEventDeltaAxis1, SIGN(delta) * LINES); } @@ -44,6 +52,17 @@ static void notificationCallback(CFNotificationCenterRef center, void *observer, ); } +static bool getExceptionApps(CFStringRef key) +{ + EXCEPTIONS = (CFArrayRef)CFPreferencesCopyAppValue(key, kCFPreferencesCurrentApplication); + bool got = false; + if (EXCEPTIONS && CFGetTypeID(EXCEPTIONS) == CFArrayGetTypeID()) { + got = (int)CFArrayGetCount(EXCEPTIONS); + } + + return got; +} + static bool getIntPreference(CFStringRef key, int *valuePtr) { CFNumberRef number = (CFNumberRef)CFPreferencesCopyAppValue( @@ -78,6 +97,9 @@ int main(void) CFRunLoopRun(); CFNotificationCenterRemoveObserver(center, &observer, AX_NOTIFICATION, NULL); + if (!getExceptionApps(CFSTR("except"))) + EXCEPTIONS = CFArrayCreate(kCFAllocatorDefault, NULL, 0, &kCFTypeArrayCallBacks); + if (!getIntPreference(CFSTR("lines"), &LINES)) LINES = DEFAULT_LINES; diff --git a/README.md b/README.md index d0125fe..cda1d4b 100644 --- a/README.md +++ b/README.md @@ -54,7 +54,12 @@ defaults write com.emreyolcu.DiscreteScroll lines -int LINES > If you set `lines` to some value other than an integer, > then the default value of 3 is used as a fallback. -You should restart the application for the setting to take effect. +You may configure exception applications if you do not want DiscreteScroll to run on every application. Running this command repeatedly will append its arguments to the existing list of exception applications. Replace `APPLICATION` with the name of the exception application you would like to configure, e.g. `Finder`. +``` +defaults write com.emreyolcu.DiscreteScroll except -array-add "APPLICATION" +``` + +You should restart the application for changes in settings to take effect. ### Uninstallation