From c126c7de12a61d6523c64046f68cf362754cb3f1 Mon Sep 17 00:00:00 2001 From: starbugs Date: Wed, 20 Mar 2024 09:36:54 +0100 Subject: [PATCH] Add support for Linear --- WakaTime/Extensions/AXUIElementExtension.swift | 18 ++++++++++++++++++ .../NSRunningApplicationExtension.swift | 4 +--- WakaTime/Helpers/MonitoringManager.swift | 1 + 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/WakaTime/Extensions/AXUIElementExtension.swift b/WakaTime/Extensions/AXUIElementExtension.swift index e40eeeb..281db65 100644 --- a/WakaTime/Extensions/AXUIElementExtension.swift +++ b/WakaTime/Extensions/AXUIElementExtension.swift @@ -32,6 +32,20 @@ extension AXUIElement { // swiftlint:enable force_cast } + var nextSibling: AXUIElement? { + guard let parentChildren = self.parent?.children, let currentIndex = parentChildren.firstIndex(of: self) else { return nil } + let nextIndex = currentIndex + 1 + guard parentChildren.indices.contains(nextIndex) else { return nil } + return parentChildren[nextIndex] + } + + var previousSibling: AXUIElement? { + guard let parentChildren = self.parent?.children, let currentIndex = parentChildren.firstIndex(of: self) else { return nil } + let previousIndex = currentIndex - 1 + guard parentChildren.indices.contains(previousIndex) else { return nil } + return parentChildren[previousIndex] + } + var id: String? { guard let ref = getValue(for: kAXIdentifierAttribute) else { return nil } // swiftlint:disable force_cast @@ -72,6 +86,10 @@ extension AXUIElement { case .firefox: let addressField = findAddressField() address = addressField?.value + case .linear: + let projectLabel = firstDescendantWhere { $0.value == "Project" } + let projectButton = projectLabel?.nextSibling?.firstDescendantWhere { $0.role == kAXButtonRole } + return projectButton?.rawTitle case .safari: let addressField = elementById(identifier: "WEB_BROWSER_ADDRESS_AND_SEARCH_FIELD") address = addressField?.value diff --git a/WakaTime/Extensions/NSRunningApplicationExtension.swift b/WakaTime/Extensions/NSRunningApplicationExtension.swift index 3a14682..6de5cb2 100644 --- a/WakaTime/Extensions/NSRunningApplicationExtension.swift +++ b/WakaTime/Extensions/NSRunningApplicationExtension.swift @@ -57,9 +57,7 @@ enum MonitoredApp: String, CaseIterable { ] // list apps which we aren't yet able to track, so they're hidden from the Monitored Apps menu - static let unsupportedAppIds = [ - MonitoredApp.linear.rawValue, - ] + static let unsupportedAppIds = [String]() } extension NSRunningApplication { diff --git a/WakaTime/Helpers/MonitoringManager.swift b/WakaTime/Helpers/MonitoringManager.swift index c3e5190..c9cf6d5 100644 --- a/WakaTime/Helpers/MonitoringManager.swift +++ b/WakaTime/Helpers/MonitoringManager.swift @@ -103,6 +103,7 @@ class MonitoringManager { case .linear: return HeartbeatData( entity: title, + project: project, category: .planning) case .notes: if activeWindow.rawTitle == "Notes" {