From 77bc8e171adc0b0aa2be7bb2edbab953227cc790 Mon Sep 17 00:00:00 2001 From: Ivan Date: Sun, 9 May 2021 18:50:20 +0300 Subject: [PATCH 1/3] Updated to v0.0.6. Added config support - Updated to v0.0.6 - Added config support - Now possible to describe key combination for brightness change without installing XCode and recompile App - just edit config. --- .../project.pbxproj | 15 +++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++ .../UserInterfaceState.xcuserstate | Bin 0 -> 28023 bytes .../xcschemes/xcschememanagement.plist | 14 ++ NativeDisplayBrightness/AppDelegate.h | 4 + NativeDisplayBrightness/AppDelegate.m | 97 +++++++++++++- NativeDisplayBrightness/ButtonControl.h | 29 +++++ NativeDisplayBrightness/ButtonControl.m | 30 +++++ NativeDisplayBrightness/Info.plist | 6 +- NativeDisplayBrightness/config.json | 30 +++++ NativeDisplayBrightness/macOSKeyCodes.json | 123 ++++++++++++++++++ 11 files changed, 350 insertions(+), 6 deletions(-) create mode 100644 NativeDisplayBrightness.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 NativeDisplayBrightness.xcodeproj/project.xcworkspace/xcuserdata/ivan_alone.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 NativeDisplayBrightness.xcodeproj/xcuserdata/ivan_alone.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 NativeDisplayBrightness/ButtonControl.h create mode 100644 NativeDisplayBrightness/ButtonControl.m create mode 100644 NativeDisplayBrightness/config.json create mode 100644 NativeDisplayBrightness/macOSKeyCodes.json diff --git a/NativeDisplayBrightness.xcodeproj/project.pbxproj b/NativeDisplayBrightness.xcodeproj/project.pbxproj index ba50f8d..134cbaf 100644 --- a/NativeDisplayBrightness.xcodeproj/project.pbxproj +++ b/NativeDisplayBrightness.xcodeproj/project.pbxproj @@ -12,6 +12,9 @@ 9DBE37561DB7990900ABE422 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 9DBE37551DB7990900ABE422 /* Assets.xcassets */; }; 9DBE37591DB7990900ABE422 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 9DBE37571DB7990900ABE422 /* MainMenu.xib */; }; 9DBE37621DB7996100ABE422 /* DDC.m in Sources */ = {isa = PBXBuildFile; fileRef = 9DBE37601DB7996100ABE422 /* DDC.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + E20E58922648360200C1F30B /* config.json in Resources */ = {isa = PBXBuildFile; fileRef = E20E58902648360200C1F30B /* config.json */; }; + E20E58932648360200C1F30B /* macOSKeyCodes.json in Resources */ = {isa = PBXBuildFile; fileRef = E20E58912648360200C1F30B /* macOSKeyCodes.json */; }; + E20E58952648362800C1F30B /* ButtonControl.m in Sources */ = {isa = PBXBuildFile; fileRef = E20E58942648362800C1F30B /* ButtonControl.m */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -29,6 +32,10 @@ 9DBE37631DB79A4000ABE422 /* BezelServices.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = BezelServices.h; sourceTree = ""; }; 9DBE37641DB7A87200ABE422 /* Readme.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = Readme.md; sourceTree = ""; }; 9DBE37661DB7A9D600ABE422 /* License.txt */ = {isa = PBXFileReference; lastKnownFileType = text; path = License.txt; sourceTree = ""; }; + E20E58902648360200C1F30B /* config.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = config.json; sourceTree = ""; }; + E20E58912648360200C1F30B /* macOSKeyCodes.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = macOSKeyCodes.json; sourceTree = ""; }; + E20E58942648362800C1F30B /* ButtonControl.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ButtonControl.m; sourceTree = ""; }; + E20E58962648363300C1F30B /* ButtonControl.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ButtonControl.h; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -61,6 +68,8 @@ 9DBE374E1DB7990900ABE422 /* NativeDisplayBrightness */ = { isa = PBXGroup; children = ( + E20E58902648360200C1F30B /* config.json */, + E20E58912648360200C1F30B /* macOSKeyCodes.json */, 9DBE374F1DB7990900ABE422 /* AppDelegate.h */, 9DBE37501DB7990900ABE422 /* AppDelegate.m */, 9DBE37551DB7990900ABE422 /* Assets.xcassets */, @@ -74,6 +83,8 @@ 9DBE37631DB79A4000ABE422 /* BezelServices.h */, 9D1F75421DBD44310039345A /* OSD.h */, 9D1F75431DBD48310039345A /* CoreGraphicsPriv.h */, + E20E58942648362800C1F30B /* ButtonControl.m */, + E20E58962648363300C1F30B /* ButtonControl.h */, ); path = NativeDisplayBrightness; sourceTree = ""; @@ -126,6 +137,7 @@ developmentRegion = English; hasScannedForEncodings = 0; knownRegions = ( + English, en, Base, ); @@ -144,8 +156,10 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + E20E58932648360200C1F30B /* macOSKeyCodes.json in Resources */, 9DBE37561DB7990900ABE422 /* Assets.xcassets in Resources */, 9DBE37591DB7990900ABE422 /* MainMenu.xib in Resources */, + E20E58922648360200C1F30B /* config.json in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -159,6 +173,7 @@ 9DBE37621DB7996100ABE422 /* DDC.m in Sources */, 9DBE37541DB7990900ABE422 /* main.m in Sources */, 9DBE37511DB7990900ABE422 /* AppDelegate.m in Sources */, + E20E58952648362800C1F30B /* ButtonControl.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/NativeDisplayBrightness.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/NativeDisplayBrightness.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/NativeDisplayBrightness.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/NativeDisplayBrightness.xcodeproj/project.xcworkspace/xcuserdata/ivan_alone.xcuserdatad/UserInterfaceState.xcuserstate b/NativeDisplayBrightness.xcodeproj/project.xcworkspace/xcuserdata/ivan_alone.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..ce6fbcc01f5f6726dabb7290544c7fb76cefd73f GIT binary patch literal 28023 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 literal 0 HcmV?d00001 diff --git a/NativeDisplayBrightness.xcodeproj/xcuserdata/ivan_alone.xcuserdatad/xcschemes/xcschememanagement.plist b/NativeDisplayBrightness.xcodeproj/xcuserdata/ivan_alone.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..dbf9a3e --- /dev/null +++ b/NativeDisplayBrightness.xcodeproj/xcuserdata/ivan_alone.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,14 @@ + + + + + SchemeUserState + + NativeDisplayBrightness.xcscheme_^#shared#^_ + + orderHint + 0 + + + + diff --git a/NativeDisplayBrightness/AppDelegate.h b/NativeDisplayBrightness/AppDelegate.h index 249e960..25ae257 100644 --- a/NativeDisplayBrightness/AppDelegate.h +++ b/NativeDisplayBrightness/AppDelegate.h @@ -5,8 +5,12 @@ // Created by Benno Krauss on 19.10.16. // Copyright © 2016 Benno Krauss. All rights reserved. // +// Updated by Ivan_Alone on 09.05.21 +// Made with GNU GPL v3 permission +// #import +#import "ButtonControl.h" @interface AppDelegate : NSObject diff --git a/NativeDisplayBrightness/AppDelegate.m b/NativeDisplayBrightness/AppDelegate.m index 34d7721..5ec98e5 100644 --- a/NativeDisplayBrightness/AppDelegate.m +++ b/NativeDisplayBrightness/AppDelegate.m @@ -5,6 +5,9 @@ // Created by Benno Krauss on 19.10.16. // Copyright © 2016 Benno Krauss. All rights reserved. // +// Updated by Ivan_Alone on 09.05.21 +// Made with GNU GPL v3 permission +// #import "AppDelegate.h" #import "DDC.h" @@ -21,6 +24,8 @@ #pragma mark - variables void *(*_BSDoGraphicWithMeterAndTimeout)(CGDirectDisplayID arg0, BSGraphic arg1, int arg2, float v, int timeout) = NULL; +ButtonControl *globalButtonBrightnessUp = NULL, *globalButtonBrightnessDown = NULL; +NSDictionary* keyCodesAll = NULL; #pragma mark - functions @@ -45,7 +50,9 @@ CGEventRef keyboardCGEventCallback(CGEventTapProxy proxy, if (type == NX_KEYDOWN || type == NX_KEYUP || type == NX_FLAGSCHANGED) { int64_t keyCode = CGEventGetIntegerValueField(event, kCGKeyboardEventKeycode); - if (keyCode == kVK_F2 || keyCode == kVK_F1) + int64_t modifierFlags = CGEventGetFlags(event); + + if ([globalButtonBrightnessDown verifyKey:keyCode arg2: modifierFlags] || [globalButtonBrightnessUp verifyKey:keyCode arg2: modifierFlags]) { return NULL; } @@ -102,7 +109,7 @@ - (void)_registerGlobalKeyboardEvents { [NSEvent addGlobalMonitorForEventsMatchingMask:NSEventMaskKeyDown | NSEventMaskKeyUp handler:^(NSEvent *_Nonnull event) { //NSLog(@"event!!"); - if (event.keyCode == kVK_F1) + if ([globalButtonBrightnessDown verifyKey:event.keyCode arg2: event.modifierFlags]) { if (event.type == NSEventTypeKeyDown) { @@ -111,7 +118,7 @@ - (void)_registerGlobalKeyboardEvents }); } } - else if (event.keyCode == kVK_F2) + else if ([globalButtonBrightnessUp verifyKey:event.keyCode arg2: event.modifierFlags]) { if (event.type == NSEventTypeKeyDown) { @@ -152,6 +159,7 @@ - (void)_loadBrightness - (void)applicationDidFinishLaunching:(NSNotification *)aNotification { + [self loadSettings]; if (![self _loadBezelServices]) { [self _loadOSDFramework]; @@ -239,5 +247,88 @@ - (void)decreaseBrightness self.brightness = MAX(self.brightness-brightnessStep,0); } +- (int) parseKeyCode: (NSString*) candidate { + if (keyCodesAll == NULL) { + keyCodesAll = [self JSONFromFile:@"macOSKeyCodes"]; + } + + candidate = candidate.uppercaseString; + + if (candidate.length < 3 || ![[candidate substringToIndex: 3] isEqualToString:@"VK_"] ) { + candidate = [NSString stringWithFormat:@"%@%@", @"VK_", candidate]; + } + + if (keyCodesAll != NULL && keyCodesAll[candidate]) { + return [[keyCodesAll valueForKey:candidate] intValue ]; + } + + return 0; +} + +- (ButtonControl*) parseButtonData: (NSDictionary*) jsonButton { + ButtonControl* btn = [ButtonControl new]; + + NSString* keyCode = [jsonButton objectForKey:@"keyCode"]; + + if (keyCode != NULL) { + int keyCodeInt = keyCode.intValue; + NSString* recomp = [NSString stringWithFormat:@"%d", keyCodeInt]; + + if (keyCode != recomp) { + keyCodeInt = [self parseKeyCode: keyCode]; + } + + btn.keyCode = keyCodeInt; + + btn.isShift = [[jsonButton valueForKey:@"isShift"] boolValue]; + btn.isAlt = [[jsonButton valueForKey:@"isAlt" ] boolValue]; + btn.isCmd = [[jsonButton valueForKey:@"isCmd" ] boolValue]; + btn.isCtrl = [[jsonButton valueForKey:@"isCtrl" ] boolValue]; + btn.isCaps = [[jsonButton valueForKey:@"isCaps" ] boolValue]; + btn.isFN = [[jsonButton valueForKey:@"isFN" ] boolValue]; + + return btn; + } + return NULL; +} + +- (void)loadSettings +{ + NSDictionary *dict = [self JSONFromFile: @"config"]; + + NSDictionary* buttonBrightnessUp = [dict objectForKey:@"buttonBrightnessUp"]; + NSDictionary* buttonBrightnessDown = [dict objectForKey:@"buttonBrightnessDown"]; + + globalButtonBrightnessUp = [ButtonControl new]; + globalButtonBrightnessUp.keyCode = kVK_F2; + + globalButtonBrightnessDown = [ButtonControl new]; + globalButtonBrightnessDown.keyCode = kVK_F1; + + if (buttonBrightnessUp != NULL) { + ButtonControl* btn = [self parseButtonData: buttonBrightnessUp]; + + if (btn && btn.keyCode) { + globalButtonBrightnessUp = btn; + } + } + + if (buttonBrightnessDown != NULL) { + ButtonControl* btn = [self parseButtonData: buttonBrightnessDown]; + + if (btn && btn.keyCode) { + globalButtonBrightnessDown = btn; + } + } + + NSLog(@"Config loaded!"); +} + +- (NSDictionary *)JSONFromFile: (NSString*) filename +{ + NSString *path = [[NSBundle mainBundle] pathForResource:filename ofType:@"json"]; + NSData *data = [NSData dataWithContentsOfFile:path]; + return [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil]; +} @end diff --git a/NativeDisplayBrightness/ButtonControl.h b/NativeDisplayBrightness/ButtonControl.h new file mode 100644 index 0000000..351f5c2 --- /dev/null +++ b/NativeDisplayBrightness/ButtonControl.h @@ -0,0 +1,29 @@ +// +// ButtonControl.h +// NativeDisplayBrightness +// +// Created by Ivan_Alone on 09.05.21. +// Copyright © 2021 Ivan_Alone. All rights reserved. +// + +#ifndef ButtonControl_h +#define ButtonControl_h + +#import + +@interface ButtonControl : NSObject + +@property int keyCode; + +@property bool isShift; +@property bool isAlt; +@property bool isCmd; +@property bool isCtrl; +@property bool isCaps; +@property bool isFN; + +- (bool)verifyKey: (int64_t)keyCode arg2: (int64_t)modifierFlags; + +@end + +#endif /* ButtonControl_h */ diff --git a/NativeDisplayBrightness/ButtonControl.m b/NativeDisplayBrightness/ButtonControl.m new file mode 100644 index 0000000..007b68c --- /dev/null +++ b/NativeDisplayBrightness/ButtonControl.m @@ -0,0 +1,30 @@ +// +// ButtonControl.m +// NativeDisplayBrightness +// +// Created by Ivan_Alone on 09.05.21. +// Copyright © 2021 Ivan_Alone. All rights reserved. +// + +#import "ButtonControl.h" + +@implementation ButtonControl + +- (bool)xorCheckFor: (bool)a And: (bool)b +{ + return (a && b) || (!a && !b); +} + +- (bool)verifyKey: (int64_t)keyCode arg2: (int64_t)modifierFlags +{ + return keyCode == self.keyCode && + [self xorCheckFor: self.isShift And: (modifierFlags & NSEventModifierFlagShift )] && + [self xorCheckFor: self.isCmd And: (modifierFlags & NSEventModifierFlagCommand )] && + [self xorCheckFor: self.isAlt And: (modifierFlags & NSEventModifierFlagOption )] && + [self xorCheckFor: self.isCtrl And: (modifierFlags & NSEventModifierFlagControl )] && + (self.isCaps ? (modifierFlags & NSEventModifierFlagCapsLock) : true) && + (self.isFN ? (modifierFlags & NSEventModifierFlagFunction) : true); +} + + +@end diff --git a/NativeDisplayBrightness/Info.plist b/NativeDisplayBrightness/Info.plist index 2dab834..895a757 100644 --- a/NativeDisplayBrightness/Info.plist +++ b/NativeDisplayBrightness/Info.plist @@ -19,13 +19,13 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.0 + 0.0.6 CFBundleVersion - 1 + 0.0.6 LSMinimumSystemVersion $(MACOSX_DEPLOYMENT_TARGET) NSHumanReadableCopyright - Copyright © 2016 Benno Krauss. All rights reserved. + Copyright © 2016 Benno Krauss. Updated by Ivan_Alone, 2021. All rights reserved. NSMainNibFile MainMenu NSPrincipalClass diff --git a/NativeDisplayBrightness/config.json b/NativeDisplayBrightness/config.json new file mode 100644 index 0000000..0f8be53 --- /dev/null +++ b/NativeDisplayBrightness/config.json @@ -0,0 +1,30 @@ +{ + "info": "Config for editing by user", + + "buttonBrightnessUp": { + "comment": "Key combination for brightness increase", + "keyCode": "VK_F2" + }, + "buttonBrightnessDown": { + "comment": "Key combination for brightness decrease", + "keyCode": "VK_F1" + }, + + "example": { + "buttonDefinition": { + "keyCode": "VK_F5", + "isShift": false, + "isAlt": false, + "isCmd": true, + "isCtrl": true, + "isCaps": false, + "isFN": false + }, + "info": { + "text0": "Definition before means Ctrl+Cmd+F5 key combination", + "text1": "You can check keys codess in 'macOSKeyCodes.json'. Also you can write just F5 instead VK_F5, for more convenience", + "text2": "'false' values can be skipped", + "text3": "Be care about 'isCaps' and 'isFN' - thats working as trigger, not key-combo. So that 'true' means 'true', 'false' means 'does not matter'" + } + } +} diff --git a/NativeDisplayBrightness/macOSKeyCodes.json b/NativeDisplayBrightness/macOSKeyCodes.json new file mode 100644 index 0000000..202d257 --- /dev/null +++ b/NativeDisplayBrightness/macOSKeyCodes.json @@ -0,0 +1,123 @@ +{ + "comment": { + "Warning0": "DO NOT EDIT THIS FILE if you do not understand this data!", + "Warning1": "Key codes must begin from VK_, and be in uppercase!", + "Warning2": "Key codes taken from [macOS] / Frameworks / Carbon / HIToolbox / Events.h" + }, + + + "VK_KEY_A": 0, + "VK_KEY_B": 11, + "VK_KEY_C": 8, + "VK_KEY_D": 2, + "VK_KEY_E": 14, + "VK_KEY_F": 3, + "VK_KEY_G": 5, + "VK_KEY_H": 4, + "VK_KEY_I": 34, + "VK_KEY_J": 38, + "VK_KEY_K": 40, + "VK_KEY_L": 37, + "VK_KEY_M": 46, + "VK_KEY_N": 45, + "VK_KEY_O": 31, + "VK_KEY_P": 35, + "VK_KEY_Q": 12, + "VK_KEY_R": 15, + "VK_KEY_S": 1, + "VK_KEY_T": 17, + "VK_KEY_U": 32, + "VK_KEY_V": 9, + "VK_KEY_W": 13, + "VK_KEY_X": 7, + "VK_KEY_Y": 16, + "VK_KEY_Z": 6, + + "VK_KEY_1": 18, + "VK_KEY_2": 19, + "VK_KEY_3": 20, + "VK_KEY_4": 21, + "VK_KEY_5": 23, + "VK_KEY_6": 22, + "VK_KEY_7": 26, + "VK_KEY_8": 28, + "VK_KEY_9": 25, + "VK_KEY_0": 29, + + "VK_KEY_GRAVE": 50, + + "VK_KEY_MINUS": 27, + "VK_KEY_EQUAL": 24, + + "VK_KEY_LEFTBRACKET": 33, + "VK_KEY_RIGHTBRACKET": 30, + + "VK_KEY_SEMICOLON": 41, + "VK_KEY_QUOTE": 39, + "VK_KEY_BACKSLASH": 42, + + "VK_KEY_COMMA": 43, + "VK_KEY_PERIOD": 47, + "VK_KEY_SLASH": 44, + + "VK_KEYPAD_CLEAR": 71, + "VK_KEYPAD_DIVIDE": 75, + "VK_KEYPAD_MULTIPLY": 67, + "VK_KEYPAD_MINUS": 78, + "VK_KEYPAD_PLUS": 69, + "VK_KEYPAD_ENTER": 76, + "VK_KEYPAD_DECIMAL": 65, + "VK_KEYPAD_EQUALS": 81, + + "VK_KEYPAD_0": 82, + "VK_KEYPAD_1": 83, + "VK_KEYPAD_2": 84, + "VK_KEYPAD_3": 85, + "VK_KEYPAD_4": 86, + "VK_KEYPAD_5": 87, + "VK_KEYPAD_6": 88, + "VK_KEYPAD_7": 89, + "VK_KEYPAD_8": 91, + "VK_KEYPAD_9": 92, + + "VK_RETURN": 36, + "VK_TAB": 48, + "VK_SPACE": 49, + "VK_BACKWARDDELETE": 51, + "VK_ESCAPE": 53, + + "VK_F1": 122, + "VK_F2": 120, + "VK_F3": 99, + "VK_F4": 118, + "VK_F5": 96, + "VK_F6": 97, + "VK_F7": 98, + "VK_F8": 100, + "VK_F9": 101, + "VK_F10": 109, + "VK_F11": 103, + "VK_F12": 111, + "VK_F13": 105, + "VK_F14": 107, + "VK_F15": 113, + "VK_F16": 106, + "VK_F17": 64, + "VK_F18": 79, + "VK_F19": 80, + "VK_F20": 90, + + "VK_INSERT": 114, + "VK_DELETE": 117, + + "VK_HOME": 115, + "VK_END": 119, + + "VK_PAGEUP": 116, + "VK_PAGEDOWN": 121, + + "VK_ARROW_UP": 126, + "VK_ARROW_DOWN": 125, + "VK_ARROW_LEFT": 123, + "VK_ARROW_RIGHT": 124 +} From 87318872127cb002eab791467d442ddc2321525d Mon Sep 17 00:00:00 2001 From: Ivan Date: Sun, 9 May 2021 19:03:57 +0300 Subject: [PATCH 2/3] Added dark icon of Native UI --- nativeUI_Dark.png | Bin 0 -> 9105 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 nativeUI_Dark.png diff --git a/nativeUI_Dark.png b/nativeUI_Dark.png new file mode 100644 index 0000000000000000000000000000000000000000..15057bcedd8ac1778a9d5a0b9104672809d2a4a2 GIT binary patch literal 9105 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 b(&pocR3&TWz*_sCroWP$x@_%p%kcjK?2c5` literal 0 HcmV?d00001 From 6d296587fab2dd06798220d6b77daa3ce7a52399 Mon Sep 17 00:00:00 2001 From: Ivan Date: Sun, 9 May 2021 19:21:28 +0300 Subject: [PATCH 3/3] Updated ReadMe for config support. --- Readme.md | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/Readme.md b/Readme.md index 05c461b..238ba20 100644 --- a/Readme.md +++ b/Readme.md @@ -2,14 +2,39 @@ *Control your desktop monitor brightness just like on a MacBook!* -![native brightness UI](https://raw.githubusercontent.com/Bensge/NativeDisplayBrightness/master/nativeUI.png) +![native brightness UI](https://raw.githubusercontent.com/Ivan-Alone/NativeDisplayBrightness/master/nativeUI_Dark.png) -This a utility application to control monitor brightness with the F1, F2 keys. It utilizes DDC/CI, but this app doesn't have the freezing issues that similar aplications tend to suffer from. +This a utility application to control monitor brightness with the F1, F2 keys (**configurable now!**). It utilizes DDC/CI, but this app doesn't have the freezing issues that similar aplications tend to suffer from. This app also shows the **native** system UI when changing brightness! It uses the private `BezelServices` framework for this. Needless to say, your monitor needs to support DDC/CI for this app to work. +## Configuration + +If you want to change brightness buttons layout, just edit `NativeDisplayBrightness.app/Contents/Resources/config.json` config file. + +Open downloaded application with RMB -> Show Package Contents, go to this path, open `config.json` with TextEdit (or text editor you prefer) and map your own keys layout to increase/decrease brightness. + +For example, this configuration means that brightness will increase/decrease by pressing Cmd+ArrowUp / Cmd+ArrowDown: + +```json +{ + "buttonBrightnessUp": { + "keyCode": "VK_ARROW_UP", + "isCmd": true + }, + "buttonBrightnessDown": { + "keyCode": "VK_ARROW_DOWN", + "isCmd": true + } +} +``` + +You can find more information about key combinations in the same `config.json` file. In `macOSKeyCodes.json` contains all mostly supported keys constants. You can edit it if you understand what you doing, at one's own risk. + +Also you can write `keyCode` as simple integer value, but text IDs is more readable. + ## License This application uses code borrowed from [ddcctl](https://github.com/kfix/ddcctl) which uses code from [DDC-CI-Tools](https://github.com/jontaylor/DDC-CI-Tools-for-OS-X)