Compare commits

11 Commits

Author SHA1 Message Date
Nihaal Sharma
58c834f1ed Update README.md 2025-05-29 17:29:27 +01:00
Nihaal Sharma
84326f7e15 Update README.md 2025-05-29 17:28:33 +01:00
Nihaal Sharma
27e410ae76 Update README.md 2025-05-29 17:25:54 +01:00
neon443
d943415b98 add mouse moves count
tweak the aligment of the pinch
added mouse move count to menu bar,
grammar fix
2025-05-29 16:11:41 +01:00
neon443
83efb14bd5 fix 2x pinchs 2025-05-29 16:03:28 +01:00
neon443
d60d90bc60 got a pinch lollll 2025-05-29 16:00:21 +01:00
neon443
4e55cc4516 we have a square following the mouse 2025-05-29 15:38:54 +01:00
neon443
1a0d3c2e38 YESSS 2025-05-29 15:33:19 +01:00
neon443
e46edecec7 xcode 12.0 compat 2025-05-29 14:00:18 +01:00
neon443
22c825dbb2 gitignore 2025-05-29 13:54:10 +01:00
neon443
5357ce8443 large rewrite of dpsettings to use an init and handle failed decodes
make moveMouse() use dpsettings' values
skyhigh moves faster
skyhigh uses dpsettings' values
extended NSScreen for safe access to main?.frame
customising the width height of the mouse move rect should be possible? now just neeed a prefs windo
2025-05-29 13:47:20 +01:00
11 changed files with 222 additions and 74 deletions

2
.gitignore vendored
View File

@@ -1 +1 @@
.DS_Store
**.DS_Store

View File

@@ -3,7 +3,7 @@
archiveVersion = 1;
classes = {
};
objectVersion = 77;
objectVersion = 63;
objects = {
/* Begin PBXBuildFile section */
@@ -14,6 +14,7 @@
A98C20C62DE614180008D61C /* DPSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = A98C20C52DE614180008D61C /* DPSettings.swift */; };
A9C9AF812DE7776A0039D7A5 /* DockSide.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9C9AF802DE777530039D7A5 /* DockSide.swift */; };
A9C9AF832DE77CB70039D7A5 /* SkyHigh.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9C9AF822DE77CB70039D7A5 /* SkyHigh.swift */; };
A9C9B0682DE888B20039D7A5 /* Preferences.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9C9B0672DE888B20039D7A5 /* Preferences.swift */; };
/* End PBXBuildFile section */
/* Begin PBXFileReference section */
@@ -27,6 +28,7 @@
A98C20C52DE614180008D61C /* DPSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DPSettings.swift; sourceTree = "<group>"; };
A9C9AF802DE777530039D7A5 /* DockSide.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DockSide.swift; sourceTree = "<group>"; };
A9C9AF822DE77CB70039D7A5 /* SkyHigh.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SkyHigh.swift; sourceTree = "<group>"; };
A9C9B0672DE888B20039D7A5 /* Preferences.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Preferences.swift; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@@ -52,6 +54,7 @@
isa = PBXGroup;
children = (
A94BEC0E2DE23E8500D4811D /* MainMenu.xib */,
A9C9B0672DE888B20039D7A5 /* Preferences.swift */,
);
path = Views;
sourceTree = "<group>";
@@ -126,6 +129,7 @@
};
};
buildConfigurationList = A966B4D12DE0841000C721A5 /* Build configuration list for PBXProject "DockPhobia" */;
compatibilityVersion = "Xcode 12.0";
developmentRegion = en;
hasScannedForEncodings = 0;
knownRegions = (
@@ -134,7 +138,6 @@
);
mainGroup = A966B4CD2DE0841000C721A5;
minimizedProjectReferenceProxies = 1;
preferredProjectObjectVersion = 77;
productRefGroup = A966B4D72DE0841000C721A5 /* Products */;
projectDirPath = "";
projectRoot = "";
@@ -163,6 +166,7 @@
files = (
A98C20C62DE614180008D61C /* DPSettings.swift in Sources */,
A9C9AF832DE77CB70039D7A5 /* SkyHigh.swift in Sources */,
A9C9B0682DE888B20039D7A5 /* Preferences.swift in Sources */,
A966B4F82DE0852900C721A5 /* MouseTracker.swift in Sources */,
A966B4F42DE0842500C721A5 /* AppDelegate.swift in Sources */,
A9C9AF812DE7776A0039D7A5 /* DockSide.swift in Sources */,

BIN
DockPhobia/.DS_Store vendored
View File

Binary file not shown.

View File

@@ -55,6 +55,13 @@ class AppDelegate: NSObject, NSApplicationDelegate {
keyEquivalent: ""
)
menu.addItem(dockMoves)
let mouseMoves = NSMenuItem(
title: "Moved the cursor \(settings.settings.mouseMoves) time\(settings.settings.mouseMoves.plural)",
action: nil,
keyEquivalent: ""
)
menu.addItem(mouseMoves)
menu.addItem(NSMenuItem.separator())
let moveMouseButton = NSMenuItem(
@@ -77,15 +84,15 @@ class AppDelegate: NSObject, NSApplicationDelegate {
menu.addItem(NSMenuItem.separator())
menu.addItem(NSMenuItem(
title: "Move Dock to left",
title: "Move Dock to the left",
action: #selector(moveDockObjcLeft),
keyEquivalent: ""))
menu.addItem(NSMenuItem(
title: "Move Dock to bottom",
title: "Move Dock to the bottom",
action: #selector(moveDockObjcBottom),
keyEquivalent: ""))
menu.addItem(NSMenuItem(
title: "Move Dock to right",
title: "Move Dock to the right",
action: #selector(moveDockObjcRight),
keyEquivalent: ""))
menu.addItem(NSMenuItem.separator())

View File

@@ -8,10 +8,83 @@
import Foundation
import AppKit
extension NSScreen {
static var mainFrame: CGRect {
main?.frame ?? CGRect(x: 0, y: 0, width: 1920, height: 1080)
}
static var mainFrameWidth: CGFloat {
main?.frame.width ?? 1920
}
static var mainFrameHeight: CGFloat {
main?.frame.height ?? 1080
}
}
struct DPSettings: Codable {
var dockMoves: Int = 0
var checkFullscreen: Bool = false
var moveMouseInstead: Bool = false
var dockMoves: Int
var mouseMoves: Int
var checkFullscreen: Bool
var moveMouseInstead: Bool
var mouseInsetLeading: CGFloat {
NSScreen.mainFrameWidth*insetHorizontal
}
var mouseInsetBottom: CGFloat {
NSScreen.mainFrameHeight*insetVertical
}
var mouseInsetTop: CGFloat {
NSScreen.mainFrameHeight*(1-(insetVertical))
}
var mouseInsetTrailing: CGFloat {
NSScreen.mainFrameWidth*(1-(insetHorizontal))
}
var insetHorizontal: CGFloat
var insetVertical: CGFloat
var mouseMoveRect: CGRect {
return CGRect(
x: mouseInsetLeading,
y: mouseInsetBottom,
width: mouseInsetTrailing - mouseInsetLeading,
height: mouseInsetTop - mouseInsetBottom
)
}
init(
dockMoves: Int = 0,
mouseMoves: Int = 0,
checkFullscreen: Bool = false,
moveMouseInstead: Bool = false,
insetHorizontal: CGFloat = 0.05,
insetVertical: CGFloat = 0.1
) {
self.dockMoves = dockMoves
self.mouseMoves = mouseMoves
self.checkFullscreen = checkFullscreen
self.moveMouseInstead = moveMouseInstead
self.insetHorizontal = insetHorizontal
self.insetVertical = insetVertical
}
init(from decoder: any Decoder) throws {
let defaults = DPSettings()
let container = try decoder.container(keyedBy: CodingKeys.self)
dockMoves = try container.decodeIfPresent(Int.self, forKey: .dockMoves)
?? defaults.dockMoves
mouseMoves = try container.decodeIfPresent(Int.self, forKey: .mouseMoves)
?? defaults.mouseMoves
checkFullscreen = try container.decodeIfPresent(Bool.self, forKey: .checkFullscreen)
?? defaults.checkFullscreen
moveMouseInstead = try container.decodeIfPresent(Bool.self, forKey: .moveMouseInstead)
?? defaults.moveMouseInstead
insetHorizontal = try container.decodeIfPresent(CGFloat.self, forKey: .insetHorizontal)
?? defaults.insetHorizontal
insetVertical = try container.decodeIfPresent(CGFloat.self, forKey: .insetVertical)
?? defaults.insetVertical
}
}
class DPSettingsModel {

View File

@@ -10,6 +10,23 @@ import AppKit
import Cocoa
import ApplicationServices
extension NSEvent {
var mouseLocationCG: CGPoint {
var loc = NSEvent.mouseLocation
loc.y = NSScreen.mainFrameHeight - loc.y
return loc
}
}
extension CGPoint {
var invertedForScreen: CGPoint {
return CGPoint(
x: self.x,
y: NSScreen.mainFrameHeight - self.y
)
}
}
struct Screen {
var width: CGFloat
var height: CGFloat
@@ -23,22 +40,22 @@ class MouseTracker {
var dockHeight: CGFloat = 0
var settings: DPSettingsModel
var skyHigh = SkyHigh()
var skyHigh: SkyHigh
private var timer: Timer?
private var loopIteration: Double = 0
init(settings: DPSettingsModel) {
print(DockSide())
if let screen = NSScreen.main {
let rect = screen.frame
self.screen = Screen(
width: rect.width,
height: rect.height
)
print(self.screen)
} else {
fatalError("no screen wtf???")
}
self.screen = Screen(
width: NSScreen.mainFrameWidth,
height: NSScreen.mainFrameHeight
)
print(self.screen)
self.settings = settings
self.skyHigh = SkyHigh(settings: settings)
self.currentDockSide = .left
moveDock(.bottom)
@@ -46,8 +63,13 @@ class MouseTracker {
}
func checkMouse(_ event: NSEvent) {
var location = NSEvent.mouseLocation
location.y = screen.height - location.y
let location = event.mouseLocationCG
#if DEBUG
var cgpointForSkyHigh = NSEvent.mouseLocation
cgpointForSkyHigh.x -= 20
cgpointForSkyHigh.y -= 5
skyHigh.move(to: cgpointForSkyHigh)
#endif
guard settings.settings.checkFullscreen else {
handleDockValue(dockIsAt: currentDockSide, location: location)
@@ -108,24 +130,6 @@ class MouseTracker {
self.monitor = NSEvent.addGlobalMonitorForEvents(matching: .mouseMoved, handler: checkMouse)
self.running = true
print("started tracking")
skyHigh.move()
}
func stop() {
@@ -138,11 +142,37 @@ class MouseTracker {
}
func moveMouse() {
let rangeW = screen.width*0.1...screen.width*0.9
let prevPoint = NSEvent().mouseLocationCG
let rangeW = settings.settings.mouseInsetLeading...settings.settings.mouseInsetTrailing
let posX = CGFloat.random(in: rangeW)
let rangeH = screen.height*0.1...screen.height*0.9
let rangeH = settings.settings.mouseInsetBottom...settings.settings.mouseInsetTop
let posY = CGFloat.random(in: rangeH)
CGDisplayMoveCursorToPoint(0, CGPoint(x: posX, y: posY))
timer?.invalidate()
loopIteration = 0
skyHigh.move(to: prevPoint.invertedForScreen)
skyHigh.show()
timer = Timer(timeInterval: 0.005, repeats: true) { [weak self] _ in
guard let self = self else { return }
guard loopIteration < 500 else {
skyHigh.hide()
settings.settings.mouseMoves += 1
refreshMenus()
timer?.invalidate()
return
}
let newPosX = (prevPoint.x > posX ? prevPoint.x-loopIteration : prevPoint.x+loopIteration)
let newPosY = (prevPoint.y > posY ? prevPoint.y-loopIteration : prevPoint.y+loopIteration)
let cgpoint = CGPoint(x: newPosX, y: newPosY)
CGWarpMouseCursorPosition(cgpoint)
var cgpointForSkyHigh = cgpoint
cgpointForSkyHigh.x -= 20
cgpointForSkyHigh.y += 5
skyHigh.move(to: cgpointForSkyHigh.invertedForScreen)
self.loopIteration += 1
}
RunLoop.main.add(timer!, forMode: .common)
}
func moveDock(_ toSide: DockSide) {
@@ -173,7 +203,6 @@ class MouseTracker {
}
func getDockSize() {
guard let screen = NSScreen.main?.frame else { fatalError() }
guard let screenVisible = NSScreen.main?.visibleFrame else { fatalError() }
self.dockHeight = screen.height - screenVisible.height
}

View File

@@ -0,0 +1,23 @@
{
"images" : [
{
"filename" : "pinch.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "pinch.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "pinch.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.8 KiB

View File

@@ -12,41 +12,43 @@ class SkyHigh {
private var window: NSWindow
private var x = 1
private var timer: Timer?
var settings: DPSettingsModel
init() {
guard let screen = NSScreen.main?.frame else { fatalError() }
init(settings: DPSettingsModel) {
self.settings = settings
self.window = NSWindow(
contentRect: CGRect(
x: screen.width*0.05,
y: screen.height*0.1,
width: screen.width*0.9,
height: screen.height*0.8
x: NSScreen.mainFrameWidth/2,
y: NSScreen.mainFrameHeight/2,
width: 100,
height: 100
),
styleMask: .borderless,
backing: .buffered,
defer: false
)
window.backgroundColor = .init(srgbRed: 1, green: 1, blue: 1, alpha: 0.1)
window.backgroundColor = .init(srgbRed: 1, green: 1, blue: 1, alpha: 0)
window.contentView = NSImageView(image: NSImage(named: "pinch")!)
window.isOpaque = false
window.level = NSWindow.Level.statusBar + 1
window.ignoresMouseEvents = true
window.hasShadow = true
window.makeKeyAndOrderFront(nil)
window.setFrameOrigin(NSPoint(x: screen.width*0.05, y: screen.height*0.1))
window.collectionBehavior = NSWindow.CollectionBehavior.canJoinAllSpaces.union(.stationary)
#if DEBUG
show()
#endif
}
func move() {
x = 1
timer?.invalidate()
timer = Timer(timeInterval: 0.01, repeats: true) { [weak self] _ in
guard let self = self else { return }
guard x < 1001 else {
timer?.invalidate()
return
}
self.window.setFrameOrigin(NSPoint(x: 1000-self.x, y: 1000-self.x))
self.x += 1
}
RunLoop.current.add(timer!, forMode: .common)
func move(to: CGPoint) {
self.window.setFrameOrigin(to)
}
func show() {
window.orderFront(nil)
}
func hide() {
window.orderOut(nil)
}
}

View File

@@ -0,0 +1,8 @@
//
// Preferences.swift
// DockPhobia
//
// Created by neon443 on 29/05/2025.
//
import Foundation

View File

@@ -1,9 +1,14 @@
# DockPhobia
<div align="center">
<br/>
<p>
<img src="https://github.com/neon443/DockPhobia/blob/main/DockPhobia/Resources/Assets.xcassets/AppIcon.appiconset/DockPhobiaAppIcon.png?raw=true" title="dockphobia" alt="dockphobia icon" width="200" />
<img src="https://github.com/neon443/DockPhobia/blob/main/DockPhobia/Resources/Assets.xcassets/AppIcon.appiconset/DockPhobiaAppIcon.png?raw=true" title="dockphobia" alt="dockphobia icon" width="100" />
</p>
<h3>DockPhobia</h3>
<p>
<a href="https://github.com/neon443/DockPhobia/releases/latest/download/DockPhobia.dmg">
download
<img alt="GitHub Release" src="https://img.shields.io/github/v/release/neon443/DockPhobia">
</a>
</p>
<p>
make your Dock scared of the mouse
@@ -12,14 +17,11 @@
made by neon443
</a>
</p>
<p>
<a href="https://github.com/neon443/DockPhobia/releases/latest/download/DockPhobia.dmg">
download
</a>
</p>
<br/>
</div>
![GitHub Downloads (all assets, all releases)](https://img.shields.io/github/downloads/neon443/DockPhobia/total)
Have you ever wanted to use your Dock?
well now you cant