Skip to content

Commit

Permalink
Latest changes
Browse files Browse the repository at this point in the history
  • Loading branch information
franciscolourenco committed May 31, 2020
1 parent 9db445d commit 5a850f1
Show file tree
Hide file tree
Showing 6 changed files with 61 additions and 39 deletions.
2 changes: 1 addition & 1 deletion octopus.xcodeproj/project.pbxproj
Expand Up @@ -123,7 +123,7 @@
};
buildConfigurationList = CE8CEAF01E646B2C00E3B034 /* Build configuration list for PBXProject "octopus" */;
compatibilityVersion = "Xcode 3.2";
developmentRegion = English;
developmentRegion = en;
hasScannedForEncodings = 0;
knownRegions = (
en,
Expand Down
41 changes: 23 additions & 18 deletions octopus/AppDelegate.swift
Expand Up @@ -9,7 +9,6 @@
import Cocoa
import Foundation


@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {

Expand All @@ -24,12 +23,12 @@ class AppDelegate: NSObject, NSApplicationDelegate {

let statusItem = NSStatusBar.system().statusItem(withLength: NSVariableStatusItemLength)

var tabMode: Modal? = nil
var homerowMode: Modal? = nil
var launchbar: KeyToKey? = nil
var launchbarShift: KeyToKey? = nil
var capsLockMonitor: CapsLockMonitor? = nil
var metrics: Metrics? = nil
var tabMode: Modal?
var homerowMode: Modal?
var launchbar: KeyToKey?
var launchbarShift: KeyToKey?
var capsLockMonitor: CapsLockMonitor?
var metrics: Metrics?

func applicationDidFinishLaunching(_ aNotification: Notification) {

Expand Down Expand Up @@ -64,6 +63,7 @@ class AppDelegate: NSObject, NSApplicationDelegate {
func applicationWillTerminate(_ aNotification: Notification) {
// Insert code here to tear down your application
}

func startTapping () {
class TabMode: Modal {

Expand All @@ -87,28 +87,33 @@ class AppDelegate: NSObject, NSApplicationDelegate {

}


self.tabMode = TabMode(
name: "Tabmode",
statusIndicator: tabmodeIndicator,
trigger: KeyEvent(key: .tab, modifiers: []),
bindings: [
KeyEvent(key: .l, modifiers: []): KeyEvent(key: .tab, modifiers: [.maskCommand]),
KeyEvent(key: .j, modifiers: []): KeyEvent(key: .tab, modifiers: [.maskCommand, .maskShift]),
KeyEvent(key: .y, modifiers: []): KeyEvent(key: .w, modifiers: [.maskCommand]),
KeyEvent(key: .w, modifiers: []): KeyEvent(key: .w, modifiers: [.maskCommand]),
KeyEvent(key: .q, modifiers: []): KeyEvent(key: .q, modifiers: [.maskCommand]),
KeyEvent(key: .quote, modifiers: []): KeyEvent(key: .q, modifiers: [.maskCommand]),

// Old System
KeyEvent(key: .o, modifiers: []): KeyEvent(key: .rightArrow, modifiers: [.maskCommand, .maskAlternate]),
KeyEvent(key: .u, modifiers: []): KeyEvent(key: .leftArrow, modifiers: [.maskCommand, .maskAlternate]),
// KeyEvent(key: .i, modifiers: []): KeyEvent(key: .leftArrow, modifiers: [.maskCommand, .maskAlternate]),
// KeyEvent(key: .k, modifiers: []): KeyEvent(key: .rightArrow, modifiers: [.maskCommand, .maskAlternate]),
KeyEvent(key: .i, modifiers: []): KeyEvent(key: .backtick, modifiers: [.maskCommand]),
KeyEvent(key: .k, modifiers: []): KeyEvent(key: .backtick, modifiers: [.maskCommand, .maskShift]),
KeyEvent(key: .y, modifiers: []): KeyEvent(key: .w, modifiers: [.maskCommand]),
KeyEvent(key: .w, modifiers: []): KeyEvent(key: .w, modifiers: [.maskCommand]),
// KeyEvent(key: .h, modifiers: []): KeyEvent(key: .w, modifiers: [.maskCommand]),
KeyEvent(key: .n, modifiers: []): KeyEvent(key: .t, modifiers: [.maskCommand]),
KeyEvent(key: .q, modifiers: []): KeyEvent(key: .q, modifiers: [.maskCommand]),

// New System
KeyEvent(key: .semicolon, modifiers: []): KeyEvent(key: .t, modifiers: [.maskCommand]),
KeyEvent(key: .h, modifiers: []): KeyEvent(key: .o, modifiers: [.maskCommand, .maskAlternate, .maskShift, .maskControl]),
KeyEvent(key: .quote, modifiers: []): KeyEvent(key: .q, modifiers: [.maskCommand])
KeyEvent(key: .h, modifiers: []): KeyEvent(key: .w, modifiers: [.maskCommand]),
KeyEvent(key: .n, modifiers: []): KeyEvent(key: .t, modifiers: [.maskCommand, .maskShift]),
KeyEvent(key: .slash, modifiers: []): KeyEvent(key: .f, modifiers: [.maskCommand]),
// KeyEvent(key: .u, modifiers: []): KeyEvent(key: .w, modifiers: [.maskCommand]),
// KeyEvent(key: .o, modifiers: []): KeyEvent(key: .t, modifiers: [.maskCommand]),
// KeyEvent(key: .k, modifiers: []): KeyEvent(key: .rightArrow, modifiers: [.maskCommand, .maskAlternate]),
// KeyEvent(key: .i, modifiers: []): KeyEvent(key: .leftArrow, modifiers: [.maskCommanlllld, .maskAlternate]),
],
overlaidModifiers: [
KeyEvent(key: .f, modifiers: []): KeyOverlaidModifier(overlay: [.maskCommand], to: KeyEvent(key: .alpha1, modifiers: []))
Expand Down Expand Up @@ -153,7 +158,7 @@ class AppDelegate: NSObject, NSApplicationDelegate {
// This is used as a hack to transform the caps lock into an "hyper key"
self.launchbar = KeyToKey(fromKey: KeyEvent(key: .international, modifiers: []), toKey: KeyEvent(key: .l, modifiers:[.maskCommand, .maskAlternate]))
self.launchbarShift = KeyToKey(fromKey: KeyEvent(key: .international, modifiers: [.maskShift]), toKey: KeyEvent(key: .l, modifiers:[.maskCommand, .maskAlternate, .maskShift]))

// self.launchbar = KeyToKey(fromKey: KeyEvent(key: .m, modifiers: []), toKey: KeyEvent(key: .n, modifiers:[]))

// self.metrics = Metrics()
}
Expand Down
3 changes: 3 additions & 0 deletions octopus/KeyEvent.swift
Expand Up @@ -17,6 +17,9 @@ struct KeyEvent {
self.key = key
self.modifiers = modifiers.intersection(relevantMask)
}
func contains(otherKeyEvent: KeyEvent) -> Bool {
return self.key == otherKeyEvent.key && self.modifiers.contains(otherKeyEvent.modifiers)
}
}

extension KeyEvent: Hashable {
Expand Down
19 changes: 17 additions & 2 deletions octopus/KeyToKey.swift
Expand Up @@ -45,10 +45,11 @@ func modifierToString (mod: CGEventFlags) -> String {
class KeyToKey {
var fromKey: KeyEvent
var toKey: KeyEvent
var isKeyPressed: Bool = false
init (fromKey: KeyEvent, toKey: KeyEvent) {
self.fromKey = fromKey
self.toKey = toKey

func myCGEventCallback(proxy: CGEventTapProxy, type: CGEventType, event: CGEvent, userInfo: UnsafeMutableRawPointer?) -> Unmanaged<CGEvent>? {

let keyCode = event.getIntegerValueField(.keyboardEventKeycode)
Expand All @@ -60,11 +61,25 @@ class KeyToKey {
// print("modifiers: ", modifiersToString(mods: modifiers), modifiers)
// print("expected: ", modifiersToString(mods: thisKeyToKey.fromKey.modifiers), thisKeyToKey.fromKey.modifiers)
let keyEvent = KeyEvent(key: key, modifiers: modifiers)


print("autorepeat:", event.getIntegerValueField(.keyboardEventAutorepeat), "type:", type.rawValue, "pressed:", thisKeyToKey.isKeyPressed)
if keyEvent == thisKeyToKey.fromKey {

// prevent invalid key repeats without autoRepeat sent by Karabiner Elenents capslock
if thisKeyToKey.isKeyPressed && type == .keyDown && event.getIntegerValueField(.keyboardEventAutorepeat) == 0 {
print("double key down")
return nil
} else if !thisKeyToKey.isKeyPressed && type == .keyUp {
print("double key up")
return nil
}
thisKeyToKey.isKeyPressed = (type == .keyDown)
event.setIntegerValueField(.keyboardEventKeycode, value: Int64(thisKeyToKey.toKey.key.rawValue))
event.flags = thisKeyToKey.toKey.modifiers
event.setIntegerValueField(.eventSourceUserData, value: 1337)

}

}
return Unmanaged.passRetained(event)
}
Expand Down
6 changes: 3 additions & 3 deletions octopus/Keyboard.swift
Expand Up @@ -15,17 +15,17 @@ class Keyboard {
event?.flags = modifiers
event?.post(tap: .cgSessionEventTap)
}

static func keyDown(key: KeyCode, modifiers: CGEventFlags = []) {
print("Keyboard.keyDown", key, modifiers)
changeKey(key: key, modifiers: modifiers, keyDown: true)
}

static func keyUp(key: KeyCode, modifiers: CGEventFlags = []) {
print("Keyboard.keyUp", key, modifiers)
changeKey(key: key, modifiers: modifiers, keyDown: false)
}

static func keyStroke(key: KeyCode, modifiers: CGEventFlags = []) {
print("keyStroke", key, modifiers)
changeKey(key: key, modifiers: modifiers, keyDown: true)
Expand Down
29 changes: 14 additions & 15 deletions octopus/Modal.swift
Expand Up @@ -126,26 +126,25 @@ class Modal {

let keyEvent = KeyEvent(key: key, modifiers: modifiers)

if keyEvent == thisModal.trigger {

if type == .keyDown {
thisModal.isUserTyping = thisModal.isUserTyping && Date().timeIntervalSince1970 - thisModal.lastTypingTimestamp < 0

if !thisModal.isUserTyping {
if !thisModal.enabled {
thisModal.enter()
}
return nil
} else {
print("User is typing, send space")


if type == .keyDown && keyEvent == thisModal.trigger {
thisModal.isUserTyping = thisModal.isUserTyping && Date().timeIntervalSince1970 - thisModal.lastTypingTimestamp < 0

if !thisModal.isUserTyping {
if !thisModal.enabled {
thisModal.enter()
}
} else if type == .keyUp && thisModal.enabled {
thisModal.exit()
return nil
} else {
print("User is typing, send space")
}

} else if type == .keyUp && thisModal.enabled && key == thisModal.trigger.key {
thisModal.exit()
return nil
}


if thisModal.enabled {
if false && thisModal.inRedZone() && type == .keyDown {
print(thisModal.name + "was in redzone")
Expand Down

0 comments on commit 5a850f1

Please sign in to comment.