From c4724e67bb87676df393830a46e6a61207367688 Mon Sep 17 00:00:00 2001 From: Toxblh Date: Mon, 9 Apr 2018 01:15:04 +0100 Subject: [PATCH] upd to previous the commit --- MTMR.xcodeproj/project.pbxproj | 23 ++- .../xcshareddata/IDEWorkspaceChecks.plist | 8 + MTMR/AppDelegate.swift | 1 - MTMR/KeyPress.swift | 76 ++++++++-- MTMR/MTMR.entitlements | 7 +- MTMR/TouchBarController.swift | 138 ++++++++++++++---- MTMR/TouchBarItems.swift | 20 ++- MTMR/TouchBarPrivateApi-Bridging.h | 1 + MTMR/TouchBarPrivateApi.h | 3 + MTMR/TouchBarSupport.h | 10 +- MTMR/TouchBarSupport.m | 59 +++++++- MTMR/battery.scpt | 29 ++++ README.md | 7 +- Resources/TouchBarV0.1.png | Bin 0 -> 29787 bytes 14 files changed, 320 insertions(+), 62 deletions(-) create mode 100644 MTMR.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Resources/TouchBarV0.1.png diff --git a/MTMR.xcodeproj/project.pbxproj b/MTMR.xcodeproj/project.pbxproj index e3a5a77..a0dff76 100644 --- a/MTMR.xcodeproj/project.pbxproj +++ b/MTMR.xcodeproj/project.pbxproj @@ -18,6 +18,8 @@ B082B271205C7D8000BC04DC /* MTMRUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = B082B270205C7D8000BC04DC /* MTMRUITests.swift */; }; B0A7E9AA205D6AA400EEF070 /* KeyPress.swift in Sources */ = {isa = PBXBuildFile; fileRef = B0A7E9A9205D6AA400EEF070 /* KeyPress.swift */; }; B0C1CFCA205C97D30021C862 /* WindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B0C1CFC9205C97D30021C862 /* WindowController.swift */; }; + B0F8771A207AC1EA00D6E430 /* TouchBarSupport.m in Sources */ = {isa = PBXBuildFile; fileRef = B0F87719207AC1EA00D6E430 /* TouchBarSupport.m */; }; + B0F8771D207AD35400D6E430 /* battery.scpt in Resources */ = {isa = PBXBuildFile; fileRef = B0F8771C207AD35400D6E430 /* battery.scpt */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -58,6 +60,9 @@ B082B272205C7D8000BC04DC /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; B0A7E9A9205D6AA400EEF070 /* KeyPress.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeyPress.swift; sourceTree = ""; }; B0C1CFC9205C97D30021C862 /* WindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WindowController.swift; sourceTree = ""; }; + B0F87719207AC1EA00D6E430 /* TouchBarSupport.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TouchBarSupport.m; sourceTree = ""; }; + B0F8771B207AC92700D6E430 /* TouchBarSupport.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TouchBarSupport.h; sourceTree = ""; }; + B0F8771C207AD35400D6E430 /* battery.scpt */ = {isa = PBXFileReference; lastKnownFileType = text; path = battery.scpt; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -130,6 +135,9 @@ B082B258205C7D8000BC04DC /* Main.storyboard */, B082B25B205C7D8000BC04DC /* Info.plist */, B082B25C205C7D8000BC04DC /* MTMR.entitlements */, + B0F87719207AC1EA00D6E430 /* TouchBarSupport.m */, + B0F8771B207AC92700D6E430 /* TouchBarSupport.h */, + B0F8771C207AD35400D6E430 /* battery.scpt */, ); path = MTMR; sourceTree = ""; @@ -215,12 +223,17 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0920; - LastUpgradeCheck = 0920; + LastUpgradeCheck = 0930; ORGANIZATIONNAME = "Anton Palgunov"; TargetAttributes = { B082B24E205C7D8000BC04DC = { CreatedOnToolsVersion = 9.2; ProvisioningStyle = Automatic; + SystemCapabilities = { + com.apple.Sandbox = { + enabled = 0; + }; + }; }; B082B260205C7D8000BC04DC = { CreatedOnToolsVersion = 9.2; @@ -261,6 +274,7 @@ files = ( B082B257205C7D8000BC04DC /* Assets.xcassets in Resources */, B082B25A205C7D8000BC04DC /* Main.storyboard in Resources */, + B0F8771D207AD35400D6E430 /* battery.scpt in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -288,6 +302,7 @@ B059D622205E03F5006E6B86 /* TouchBarController.swift in Sources */, B082B255205C7D8000BC04DC /* ViewController.swift in Sources */, B0C1CFCA205C97D30021C862 /* WindowController.swift in Sources */, + B0F8771A207AC1EA00D6E430 /* TouchBarSupport.m in Sources */, B082B253205C7D8000BC04DC /* AppDelegate.swift in Sources */, B059D624205E04F3006E6B86 /* TouchBarItems.swift in Sources */, B0A7E9AA205D6AA400EEF070 /* KeyPress.swift in Sources */, @@ -351,6 +366,7 @@ CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; @@ -358,6 +374,7 @@ CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; @@ -408,6 +425,7 @@ CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; @@ -415,6 +433,7 @@ CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; @@ -447,7 +466,6 @@ isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CODE_SIGN_ENTITLEMENTS = MTMR/MTMR.entitlements; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; DEVELOPMENT_TEAM = D6D8BR2QNB; @@ -468,7 +486,6 @@ isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CODE_SIGN_ENTITLEMENTS = MTMR/MTMR.entitlements; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; DEVELOPMENT_TEAM = D6D8BR2QNB; diff --git a/MTMR.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/MTMR.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/MTMR.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/MTMR/AppDelegate.swift b/MTMR/AppDelegate.swift index f6ab644..ab5d0cf 100644 --- a/MTMR/AppDelegate.swift +++ b/MTMR/AppDelegate.swift @@ -16,7 +16,6 @@ class AppDelegate: NSObject, NSApplicationDelegate { func applicationDidFinishLaunching(_ aNotification: Notification) { TouchBarController.shared.setupControlStripPresence() // Insert code here to initialize your application - } func applicationWillTerminate(_ aNotification: Notification) { diff --git a/MTMR/KeyPress.swift b/MTMR/KeyPress.swift index b74be39..539c978 100644 --- a/MTMR/KeyPress.swift +++ b/MTMR/KeyPress.swift @@ -8,23 +8,73 @@ import Foundation - -func KeyPress (keyCode: CGKeyCode) { - let keyDown = CGEvent(keyboardEventSource: nil, virtualKey: keyCode, keyDown: true) - let keyUp = CGEvent(keyboardEventSource: nil, virtualKey: keyCode, keyDown: false) - - keyDown?.post(tap: .cghidEventTap) - keyUp?.post(tap: .cghidEventTap) +protocol KeyPress { + var keyCode: CGKeyCode { get } + func send() } -func ESCKeyPress() { - KeyPress(keyCode: 53) +extension KeyPress { + func send () { + let src = CGEventSource(stateID: .hidSystemState) + let keyDown = CGEvent(keyboardEventSource: src, virtualKey: keyCode, keyDown: true) + let keyUp = CGEvent(keyboardEventSource: src, virtualKey: keyCode, keyDown: false) + + let loc: CGEventTapLocation = .cghidEventTap + keyDown?.post(tap: loc) + keyUp?.post(tap: loc) + } } -func BrightnessUpPress() { - KeyPress(keyCode: 107) +struct ESCKeyPress: KeyPress { + let keyCode: CGKeyCode = 53 } -func BrightnessDownPress() { - KeyPress(keyCode: 113) +struct BrightnessUpPress: KeyPress { + let keyCode: CGKeyCode = 107 } + +struct BrightnessDownPress: KeyPress { + let keyCode: CGKeyCode = 113 +} + + +func doKey(_ key: Int, down: Bool) { + let flags = NSEvent.ModifierFlags(rawValue: down ? 0xa00 : 0xb00) + let data1 = (key << 16) | ((down ? 0xa : 0xb) << 8) + + let ev = NSEvent.otherEvent( + with: NSEvent.EventType.systemDefined, + location: NSPoint(x:0.0, y:0.0), + modifierFlags: flags, + timestamp: TimeInterval(0), + windowNumber: 0, + context: nil, + // context: 0, + subtype: 8, + data1: data1, + data2: -1 + ) + let cev = ev!.cgEvent! + cev.post(tap: CGEventTapLocation(rawValue: 0)!) +} + +func HIDPostAuxKey(_ key: Int) { + doKey(key, down: true) + doKey(key, down: false) +} + + +// hidsystem/ev_keymap.h +let NX_KEYTYPE_SOUND_UP = 0 +let NX_KEYTYPE_SOUND_DOWN = 1 + +let NX_KEYTYPE_BRIGHTNESS_UP = 2 +let NX_KEYTYPE_BRIGHTNESS_DOWN = 3 + +let NX_KEYTYPE_PLAY = 16 +let NX_KEYTYPE_NEXT = 17 +let NX_KEYTYPE_PREVIOUS = 18 + + + + diff --git a/MTMR/MTMR.entitlements b/MTMR/MTMR.entitlements index f2ef3ae..0c67376 100644 --- a/MTMR/MTMR.entitlements +++ b/MTMR/MTMR.entitlements @@ -1,10 +1,5 @@ - - com.apple.security.app-sandbox - - com.apple.security.files.user-selected.read-only - - + diff --git a/MTMR/TouchBarController.swift b/MTMR/TouchBarController.swift index 1b33a44..c3a622d 100644 --- a/MTMR/TouchBarController.swift +++ b/MTMR/TouchBarController.swift @@ -14,19 +14,40 @@ class TouchBarController: NSObject, NSTouchBarDelegate { let touchBar = NSTouchBar() + var timer = Timer() + var timeButton: NSButton = NSButton() + private override init() { super.init() touchBar.delegate = self - touchBar.defaultItemIdentifiers = [.escButton, .volumeUp, .volumeDown, .time, .preferences] + touchBar.defaultItemIdentifiers = [ + .escButton, + + .brightDown, + .brightUp, + + .prev, + .play, + .next, + + .sleep, + .weather, + + .volumeDown, + .volumeUp, + .battery, + .time, + ] self.presentTouchBar() } func setupControlStripPresence() { - DFRSystemModalShowsCloseBoxWhenFrontMost(true) + DFRSystemModalShowsCloseBoxWhenFrontMost(false) let item = NSCustomTouchBarItem(identifier: .controlStripItem) item.view = NSButton(image: #imageLiteral(resourceName: "Strip"), target: self, action: #selector(presentTouchBar)) NSTouchBarItem.addSystemTrayItem(item) DFRElementSetControlStripPresenceForIdentifier(.controlStripItem, true) + timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(self.updateTime), userInfo: nil, repeats: true) } func updateControlStripPresence() { @@ -45,59 +66,112 @@ class TouchBarController: NSObject, NSTouchBarDelegate { switch identifier { case .escButton: let item = NSCustomTouchBarItem(identifier: identifier) - item.view = NSButton(title: "ESC", target: self, action: #selector(handleEsc)) + item.view = NSButton(title: "esc", target: self, action: #selector(handleEsc)) return item + + case .brightUp: + let item = NSCustomTouchBarItem(identifier: identifier) + item.view = NSButton(title: "🔆", target: self, action: #selector(handleBrightUp)) + return item + case .brightDown: + let item = NSCustomTouchBarItem(identifier: identifier) + item.view = NSButton(title: "🔅", target: self, action: #selector(handleBrightDown)) + return item + case .volumeDown: let item = NSCustomTouchBarItem(identifier: identifier) - item.view = NSButton(title: "V-", target: self, action: #selector(handleVolumeDown)) + item.view = NSButton(title: "🔉", target: self, action: #selector(handleVolumeDown)) return item case .volumeUp: let item = NSCustomTouchBarItem(identifier: identifier) - item.view = NSButton(title: "V+", target: self, action: #selector(handleVolumeUp)) + item.view = NSButton(title: "🔊", target: self, action: #selector(handleVolumeUp)) return item + +// case .prev: +// let item = NSCustomTouchBarItem(identifier: identifier) +// item.view = NSButton(title: "⏪", target: self, action: #selector(handlePrev)) +// return item + case .play: + let item = NSCustomTouchBarItem(identifier: identifier) + item.view = NSButton(title: "⏯", target: self, action: #selector(handlePlay)) + return item + case .next: + let item = NSCustomTouchBarItem(identifier: identifier) + item.view = NSButton(title: "⏩", target: self, action: #selector(handleNext)) + return item + + case .time: + let item = NSCustomTouchBarItem(identifier: identifier) + timeButton = NSButton(title: self.getCurrentTime(), target: self, action: nil) + item.view = timeButton + return item + default: return nil } } + func getCurrentTime() -> String { + let date = Date() + let dateFormatter = DateFormatter() + dateFormatter.setLocalizedDateFormatFromTemplate("HH:mm") + let timestamp = dateFormatter.string(from: date) + return timestamp + } + + @objc func updateTime() { + timeButton.title = getCurrentTime() + } + @objc func handleEsc() { - ESCKeyPress() + let sender = ESCKeyPress() + sender.send() } @objc func handleVolumeUp() { - self.volume(directon: "up") + HIDPostAuxKey(Int(NX_KEYTYPE_SOUND_UP)) } @objc func handleVolumeDown() { - self.volume(directon: "down") + HIDPostAuxKey(Int(NX_KEYTYPE_SOUND_DOWN)) } - func volume(directon: String) { - var myAppleScript = "set volume output volume (output volume of (get volume settings) - 5)" + @objc func handleBrightDown() { +// HIDPostAuxKey(Int(NX_KEYTYPE_BRIGHTNESS_DOWN)) - if (directon == "up") { - myAppleScript = "set volume output volume (output volume of (get volume settings) + 5)" - } - - var error: NSDictionary? - if let scriptObject = NSAppleScript(source: myAppleScript) { - let output: NSAppleEventDescriptor = scriptObject.executeAndReturnError(&error) - - print(output.stringValue as Any) - - if (error != nil) { - print("error: \(String(describing: error))") - } - } + let sender = BrightnessUpPress() + sender.send() } - @objc func brightness(directon: String) { - if (directon == "up") { - BrightnessUpPress() - print("BR - Up") - } else { - BrightnessDownPress() - print("BR - Down") - } + @objc func handleBrightUp() { +// HIDPostAuxKey(Int(NX_KEYTYPE_BRIGHTNESS_UP)) + + let sender = BrightnessDownPress() + sender.send() } + + @objc func handlePrev() { + HIDPostAuxKey(Int(NX_KEYTYPE_PREVIOUS)) + } + + @objc func handlePlay() { + HIDPostAuxKey(Int(NX_KEYTYPE_PLAY)) + } + + @objc func handleNext() { + HIDPostAuxKey(Int(NX_KEYTYPE_NEXT)) + } + +// func getBattery() { +// var error: NSDictionary? +// if let scriptObject = NSAppleScript(source: <#T##String#>) { +// if let output: NSAppleEventDescriptor = scriptObject.executeAndReturnError( +// &error) { +// print(output.stringValue) +// } else if (error != nil) { +// print("error: \(error)") +// } +// } +// } + } diff --git a/MTMR/TouchBarItems.swift b/MTMR/TouchBarItems.swift index 1c12c87..3799c4e 100644 --- a/MTMR/TouchBarItems.swift +++ b/MTMR/TouchBarItems.swift @@ -10,10 +10,26 @@ import Cocoa extension NSTouchBarItem.Identifier { static let escButton = NSTouchBarItem.Identifier("com.toxblh.mtmr.escButton") - static let time = NSTouchBarItem.Identifier("com.toxblh.mtmr.time") + + // Volume static let volumeUp = NSTouchBarItem.Identifier("com.toxblh.mtmr.volumeUp") static let volumeDown = NSTouchBarItem.Identifier("com.toxblh.mtmr.volumeDown") - static let preferences = NSTouchBarItem.Identifier("com.toxblh.mtmr.preferences") + + // Brightness + static let brightUp = NSTouchBarItem.Identifier("com.toxblh.mtmr.brightUp") + static let brightDown = NSTouchBarItem.Identifier("com.toxblh.mtmr.brightDown") + + // Music + static let prev = NSTouchBarItem.Identifier("com.toxblh.mtmr.prev") + static let next = NSTouchBarItem.Identifier("com.toxblh.mtmr.next") + static let play = NSTouchBarItem.Identifier("com.toxblh.mtmr.play") + + // Plugins + static let sleep = NSTouchBarItem.Identifier("com.toxblh.mtmr.sleep") + static let weather = NSTouchBarItem.Identifier("com.toxblh.mtmr.weather") + static let time = NSTouchBarItem.Identifier("com.toxblh.mtmr.time") + static let battery = NSTouchBarItem.Identifier("com.toxblh.mtmr.battery") + static let nowPlaying = NSTouchBarItem.Identifier("com.toxblh.mtmr.nowPlaying") static let controlStripItem = NSTouchBarItem.Identifier("com.toxblh.mtmr.controlStrip") } diff --git a/MTMR/TouchBarPrivateApi-Bridging.h b/MTMR/TouchBarPrivateApi-Bridging.h index ce3ddc4..28ea5b2 100644 --- a/MTMR/TouchBarPrivateApi-Bridging.h +++ b/MTMR/TouchBarPrivateApi-Bridging.h @@ -7,3 +7,4 @@ // #import "TouchBarPrivateApi.h" +#import "TouchBarSupport.h" diff --git a/MTMR/TouchBarPrivateApi.h b/MTMR/TouchBarPrivateApi.h index dbf6c3e..7873691 100644 --- a/MTMR/TouchBarPrivateApi.h +++ b/MTMR/TouchBarPrivateApi.h @@ -5,6 +5,7 @@ extern void DFRElementSetControlStripPresenceForIdentifier(NSTouchBarItemIdentif extern void DFRSystemModalShowsCloseBoxWhenFrontMost(BOOL); + @interface NSTouchBarItem (PrivateMethods) + (void)addSystemTrayItem:(NSTouchBarItem *)item; @@ -13,6 +14,7 @@ extern void DFRSystemModalShowsCloseBoxWhenFrontMost(BOOL); @end + @interface NSTouchBar (PrivateMethods) // presentSystemModalFunctionBar:placement:systemTrayItemIdentifier: @@ -25,3 +27,4 @@ extern void DFRSystemModalShowsCloseBoxWhenFrontMost(BOOL); + (void)minimizeSystemModalFunctionBar:(NSTouchBar *)touchBar; @end + diff --git a/MTMR/TouchBarSupport.h b/MTMR/TouchBarSupport.h index 74079b4..0452f39 100644 --- a/MTMR/TouchBarSupport.h +++ b/MTMR/TouchBarSupport.h @@ -6,8 +6,12 @@ // Copyright © 2018 Anton Palgunov. All rights reserved. // -#ifndef TouchBarSupport_h -#define TouchBarSupport_h +#import +@interface MediaKeys : NSObject -#endif /* TouchBarSupport_h */ ++ (void)decreaseVolume; ++ (void)increaseVolume; ++ (void)muteVolume; + +@end diff --git a/MTMR/TouchBarSupport.m b/MTMR/TouchBarSupport.m index 3467930..dbd620a 100644 --- a/MTMR/TouchBarSupport.m +++ b/MTMR/TouchBarSupport.m @@ -6,4 +6,61 @@ // Copyright © 2018 Anton Palgunov. All rights reserved. // -#import +#import "TouchBarSupport.h" + +@implementation MediaKeys + +static io_connect_t get_event_driver(void) +{ + static mach_port_t sEventDrvrRef = 0; + mach_port_t masterPort, service, iter; + kern_return_t kr; + + if (!sEventDrvrRef) + { + kr = IOMasterPort( bootstrap_port, &masterPort ); + kr = IOServiceGetMatchingServices( masterPort, IOServiceMatching( kIOHIDSystemClass ), &iter ); + service = IOIteratorNext( iter ); + kr = IOServiceOpen( service, mach_task_self(), + kIOHIDParamConnectType, &sEventDrvrRef ); + IOObjectRelease( service ); + IOObjectRelease( iter ); + } + return sEventDrvrRef; +} + + +static void HIDPostAuxKey( const UInt8 auxKeyCode ) +{ + NXEventData event; + kern_return_t kr; + IOGPoint loc = { 0, 0 }; + + // Key press event + UInt32 evtInfo = auxKeyCode << 16 | NX_KEYDOWN << 8; + bzero(&event, sizeof(NXEventData)); + event.compound.subType = NX_SUBTYPE_AUX_CONTROL_BUTTONS; + event.compound.misc.L[0] = evtInfo; + kr = IOHIDPostEvent( get_event_driver(), NX_SYSDEFINED, loc, &event, kNXEventDataVersion, 0, FALSE ); + + // Key release event + evtInfo = auxKeyCode << 16 | NX_KEYUP << 8; + bzero(&event, sizeof(NXEventData)); + event.compound.subType = NX_SUBTYPE_AUX_CONTROL_BUTTONS; + event.compound.misc.L[0] = evtInfo; + kr = IOHIDPostEvent( get_event_driver(), NX_SYSDEFINED, loc, &event, kNXEventDataVersion, 0, FALSE ); +} + ++ (void)decreaseVolume { + HIDPostAuxKey(NX_KEYTYPE_SOUND_DOWN); +} + ++ (void)increaseVolume { + HIDPostAuxKey(NX_KEYTYPE_SOUND_UP); +} + ++ (void)muteVolume { + HIDPostAuxKey(NX_KEYTYPE_MUTE); +} + +@end diff --git a/MTMR/battery.scpt b/MTMR/battery.scpt index e69de29..a3a5848 100644 --- a/MTMR/battery.scpt +++ b/MTMR/battery.scpt @@ -0,0 +1,29 @@ +set theList to paragraphs of text of (do shell script "pmset -g batt") +set percent to word 6 of theList's item 2 +set charge to word 7 of theList's item 2 + +if (charge = "charging") then +set iconC to "⚡️" +else +set iconC to "" +end if + +set remainingRaw to my split(theList's item 2, " ") +set remainingTime to remainingRaw's item 5 + +if (remainingTime = "(no") then +set strTime to " (?)" +else if (remainingTime = "0:00") then +set strTime to "" +else +set strTime to " (" & remainingTime & ")" +end if + +return iconC & percent & "%" & strTime + +to split(someText, delimiter) +set AppleScript's text item delimiters to delimiter +set someText to someText's text items +set AppleScript's text item delimiters to {""} +return someText +end split diff --git a/README.md b/README.md index cca13db..9d58d39 100644 --- a/README.md +++ b/README.md @@ -4,12 +4,17 @@ # My TouchBar. My rules +

+ +

+ My the idea is to create the program like a platform for plugins for customization TouchBar. I very like BTT and a full custom TouchBar. And I want to create it. And it's my the first Swift project for MacOS :) ### Roadmap - [x] Create the first prototype with TouchBar in Storyboard - [x] Put in stripe menu on startup the application -- [ ] Find how to simulate real buttons like brightness, volume, night shift and etc. +- [x] Find how to simulate real buttons like brightness, volume, night shift and etc. +- [x] Time in touchbar! - [ ] First the weather plugin - [ ] Create the same panel like in my [BTT preset](https://github.com/Toxblh/btt-touchbar-preset) - [ ] Find how to open full-screen TouchBar without the cross and stripe menu diff --git a/Resources/TouchBarV0.1.png b/Resources/TouchBarV0.1.png new file mode 100644 index 0000000000000000000000000000000000000000..2df24f47e4a3e0ce23963a09e0c14f56a78aaf25 GIT binary patch literal 29787 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 literal 0 HcmV?d00001