From d4a3ab6ad0ab0be55f36b659b6c1e33bbdf15cba Mon Sep 17 00:00:00 2001 From: neon443 <69979447+neon443@users.noreply.github.com> Date: Wed, 19 Mar 2025 15:01:40 +0000 Subject: [PATCH] rerwrote getDockHeight() & added calcDockFrom{Side} -> CGFloat reduced minimum os reqs --- DockPhobia.xcodeproj/project.pbxproj | 6 +- .../xcdebugger/Breakpoints_v2.xcbkptlist | 100 ++++++++++++++++-- DockPhobia/ContentView.swift | 42 ++------ DockPhobia/DockPhobiaApp.swift | 89 ++++++++++++---- DockPhobiaAppIcon.pxd | Bin 258534 -> 245056 bytes 5 files changed, 174 insertions(+), 63 deletions(-) diff --git a/DockPhobia.xcodeproj/project.pbxproj b/DockPhobia.xcodeproj/project.pbxproj index 64669c0..4ab4cbe 100644 --- a/DockPhobia.xcodeproj/project.pbxproj +++ b/DockPhobia.xcodeproj/project.pbxproj @@ -282,7 +282,8 @@ "$(inherited)", "@executable_path/../Frameworks", ); - MARKETING_VERSION = 1.0; + MACOSX_DEPLOYMENT_TARGET = 13; + MARKETING_VERSION = 2.0; PRODUCT_BUNDLE_IDENTIFIER = dev.neon443.DockPhobia; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_EMIT_LOC_STRINGS = YES; @@ -315,7 +316,8 @@ "$(inherited)", "@executable_path/../Frameworks", ); - MARKETING_VERSION = 1.0; + MACOSX_DEPLOYMENT_TARGET = 13; + MARKETING_VERSION = 2.0; PRODUCT_BUNDLE_IDENTIFIER = dev.neon443.DockPhobia; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_EMIT_LOC_STRINGS = YES; diff --git a/DockPhobia.xcworkspace/xcuserdata/neon443.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/DockPhobia.xcworkspace/xcuserdata/neon443.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist index 414acfd..3f28fd6 100644 --- a/DockPhobia.xcworkspace/xcuserdata/neon443.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +++ b/DockPhobia.xcworkspace/xcuserdata/neon443.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -14,8 +14,8 @@ filePath = "DockPhobia/DockPhobiaApp.swift" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "181" - endingLineNumber = "181" + startingLineNumber = "196" + endingLineNumber = "196" landmarkName = "getDockSide()" landmarkType = "9"> @@ -30,8 +30,8 @@ filePath = "DockPhobia/DockPhobiaApp.swift" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "262" - endingLineNumber = "262" + startingLineNumber = "315" + endingLineNumber = "315" landmarkName = "moveDock(_:)" landmarkType = "9"> @@ -46,8 +46,8 @@ filePath = "DockPhobia/DockPhobiaApp.swift" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "173" - endingLineNumber = "173" + startingLineNumber = "188" + endingLineNumber = "188" landmarkName = "osascript(_:)" landmarkType = "9"> @@ -62,8 +62,8 @@ filePath = "DockPhobia/DockPhobiaApp.swift" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "252" - endingLineNumber = "252" + startingLineNumber = "297" + endingLineNumber = "297" landmarkName = "getScreenSize()" landmarkType = "9"> @@ -78,11 +78,91 @@ filePath = "DockPhobia/DockPhobiaApp.swift" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "258" - endingLineNumber = "258" + startingLineNumber = "311" + endingLineNumber = "311" landmarkName = "getScreenSize()" landmarkType = "9"> + + + + + + + + + + + + + + + + + + + + diff --git a/DockPhobia/ContentView.swift b/DockPhobia/ContentView.swift index e935565..f4f81e5 100644 --- a/DockPhobia/ContentView.swift +++ b/DockPhobia/ContentView.swift @@ -5,36 +5,12 @@ // Created by neon443 on 13/03/2025. // -import SwiftUI - -struct ContentView: View { - @Binding var isTracking: Bool - @State var mouseloc = NSEvent.mouseLocation - - var body: some View { - VStack { - Text("Screen size: \(getScreenSize())") - Image(systemName: "globe") - .imageScale(.large) - .foregroundStyle(.tint) - Text("Hello, world!") - Spacer() - Button("Start") { - startTrackingMouse() - } - Button("Stop") { - stopTrackingMouse() - } - Button() { - NSApp.terminate(nil) - } label: { - Text("Quit") - } - } - .padding() - } -} - -#Preview { - ContentView(isTracking: .constant(true)) -} +//import SwiftUI +// +//struct ContentView: View { +// +//} +// +//#Preview { +// ContentView(isTracking: .constant(true)) +//} diff --git a/DockPhobia/DockPhobiaApp.swift b/DockPhobia/DockPhobiaApp.swift index 6b9d63d..965ca3c 100644 --- a/DockPhobia/DockPhobiaApp.swift +++ b/DockPhobia/DockPhobiaApp.swift @@ -82,25 +82,36 @@ struct DockPhobiaApp: App { .keyboardShortcut(",") Divider() Button("try shell") { - print(shell("echo hello")) + print(shell("echo hello") as Any) } Divider() Button("Move Dock to Right") { moveDock("right") } - Divider() Button("Move Dock to Left") { moveDock("left") } Button("Move Dock to Bottom") { moveDock("bottom") } + Divider() Button("Get Dock orientation") { print(getDockSide()) } Button("Get Dock Height Percentage") { - print(getDockHeightPercentage()) + print(getDockHeight()) } + Divider() + Button("calcdockFromBottom") { + print(calcDockFromBottom()) + } + Button("calc dock from right") { + print(calcDockFromRight()) + } + Button("calc dock from left") { + print(calcDockFromLeft()) + } + Divider() Button("Quit") { NSApplication.shared.terminate(nil) } @@ -109,7 +120,7 @@ struct DockPhobiaApp: App { } } -func shell(_ command: String) -> (output: String?, error: String?) { +func shell(_ command: String) -> String? { let process = Process() let pipe = Pipe() let pipeError = Pipe() @@ -136,7 +147,11 @@ func shell(_ command: String) -> (output: String?, error: String?) { data: dataError, encoding: .utf8 )?.trimmingCharacters(in: .whitespacesAndNewlines) - return (output: output, error: outputError) + + if outputError != "" { + print(outputError as Any) + } + return output } func osascript(_ script: String) -> String? { @@ -177,23 +192,52 @@ func osascript(_ script: String) -> String? { func getDockSide() -> String { let result = shell("defaults read com.apple.Dock orientation") - print("dock is on the \(result.output ?? "idk")") - return result.output ?? "unknown" + print("dock is on the \(result ?? "idk")") + return result ?? "unknown" } // global event tap var eventTap: CFMachPort? -func getDockHeightPercentage() -> Double { - guard let screen = NSScreen.main else { return 0 } +func getDockHeight() -> Double { + guard let screen = NSScreen.main else { + return 0 + } - let fullHeight = screen.frame.height + let dockSide = getDockSide() + let screenDimensions = getScreenSize() + let width = screenDimensions.x + let height = screenDimensions.y let visibleHeight = screen.visibleFrame.height - let dockHeight = fullHeight - visibleHeight - let percentage = (dockHeight / fullHeight) * 100 + let perpendicularToDock: CGFloat + if dockSide == "bottom" { + perpendicularToDock = height + } else { + perpendicularToDock = width + } - return percentage + let dockHeight = CGFloat(height) - visibleHeight + let percentage = (dockHeight / perpendicularToDock) + return Double(percentage) +} + +func calcDockFromBottom() -> CGFloat { + let screenSize = getScreenSize() + let dockHeight = getDockHeight() + return screenSize.y - (screenSize.y * dockHeight) +} + +func calcDockFromRight() -> CGFloat { + let screenSize = getScreenSize() + let dockHeight = getDockHeight() + return screenSize.x - (screenSize.x * dockHeight) +} + +func calcDockFromLeft() -> CGFloat { + let screenSize = getScreenSize() + let dockHeight = getDockHeight() + return screenSize.x * dockHeight } func startTrackingMouse() { @@ -206,8 +250,9 @@ func startTrackingMouse() { options: CGEventTapOptions.defaultTap, eventsOfInterest: mask, callback: { (proxy, type, event, userInfo) -> Unmanaged? in - let location = event.location +// let location = event.location // print("mouse at \(location)") +// print("mouse at \(event.location)") //TODO: add Dock moving here return Unmanaged.passRetained(event) }, @@ -243,7 +288,7 @@ func stopTrackingMouse() { } } -func getScreenSize() -> (x: Int, y: Int) { +func getScreenSize() -> (x: CGFloat, y: CGFloat) { let script = """ tell application "Finder" get bounds of window of desktop @@ -252,8 +297,16 @@ func getScreenSize() -> (x: Int, y: Int) { let result = osascript(script)?.dropFirst(6).split(separator: ", ") // removes the "0, 0, " and splits into an arr let resultTuple = ( - Int( result![0] )!, - Int( result![1] )! + CGFloat( + Int( + result![0] + )! + ), + CGFloat( + Int( + result![1] + )! + ) ) return resultTuple } @@ -271,6 +324,6 @@ func moveDock(_ to: String) { end tell end tell """ - let result = osascript(script) + osascript(script) return } diff --git a/DockPhobiaAppIcon.pxd b/DockPhobiaAppIcon.pxd index cef695be3c820d84481faa71cb3b37476139fdf5..76f6b71bd1ad542c6646844f5c6e29d9da137a38 100644 GIT binary patch delta 2313 zcmZuzYitx%6rR&*%N9zPJ}LA;cjyD?blIJ5ciS3)@`j47v@A-q>UKN3on^bz?9B2i z!=n&r`GF*jIZ=?rC}Iq12qbF)B>WJfG5A|aw4jlgpp-^qB8kCsXS%for=6WSckVg& zobUVYnR)QD{pORrg3fk6vxwtt99QPob~(q-pSWC5d^59+jw|&yGZ)x0>{*=sHG9^T zwgrFZwlOu-M%_)$MyEu>ePnD4 zhTI-e5{v*pm*cn$`)SU8+J1+!8McpoGO;QJ8x zKpRGDz=NOGfCKHdu*?}&V)Dzu0l6y~4lDa8LrPT9+LF4u@tG%jA}OO>3r;+;8j7Pa zRnztht>IuylSLt>MEdo;GW(q#(-XnCHW*CE@eoa9?xLWDf-%a6py>^Uc1IFwGTygN zjj05giSdBYDv3f!n`x%XPr+A^DqRLYWz5wmPDoECWItZ-hehbBhn!S?J$%pSH2K$W z*xM0(#gqEO3G<+QPcW9GwHjS6QAoxWor1azItVr{^|1?X=M@+MTFhL_Ez)1W2;kSN zVY`nC3htK^TjH9`+=hgNRT)Lap>jtbKCj2Jo)Lo@i?Gf0R z!NlNT&~8HiDAZwW7&LS!P(%Dlcz-2SpmdDd*fjlM;8}$byc~xm_}d7DC$kO*h9MXK zI!1RCtEuu?23eo}qWGcw0O>Gd* zBscn%No_8%R?z6h!c6PZH#I*t{idLVT?Q5%1ZTjiU?;V0QwQWVyF1O+Z-~;ex)f8g zso&`q!+IBcKBZ=s3GO`zn~Ke8QxB##0Ezw8A;1|eEG_l_8kmb{42UUeO*&8C7hEa( z)qGmzSHCS&zb>dRI9g*u+TJyNkSzgIW!9^B=#i)`ud5&ZKJe+qwn%va*M z2|fqyll(>pdwA|U`}^y4j$>yjdq+(lOB;DS80Ht@Ta$b)3yJ3^`Lc}nF5M|$9;H>CzpQ#u~(St delta 15890 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 J`79rf{u|1y