fix: lsp issues resolved, fix reminders triggered after sleep

This commit is contained in:
Michael Freno
2026-01-09 09:56:21 -05:00
parent 54ebe6789a
commit 3d7044050e
4 changed files with 101 additions and 34 deletions

View File

@@ -7,16 +7,18 @@
import Foundation import Foundation
struct TimerState: Equatable { struct TimerState {
let type: TimerType let type: TimerType
var remainingSeconds: Int var remainingSeconds: Int
var isPaused: Bool var isPaused: Bool
var isActive: Bool var isActive: Bool
var targetDate: Date
init(type: TimerType, intervalSeconds: Int, isPaused: Bool = false, isActive: Bool = true) { init(type: TimerType, intervalSeconds: Int, isPaused: Bool = false, isActive: Bool = true) {
self.type = type self.type = type
self.remainingSeconds = intervalSeconds self.remainingSeconds = intervalSeconds
self.isPaused = isPaused self.isPaused = isPaused
self.isActive = isActive self.isActive = isActive
self.targetDate = Date().addingTimeInterval(Double(intervalSeconds))
} }
} }

View File

@@ -5,8 +5,8 @@
// Created by Mike Freno on 1/7/26. // Created by Mike Freno on 1/7/26.
// //
import Foundation
import Combine import Combine
import Foundation
@MainActor @MainActor
class TimerEngine: ObservableObject { class TimerEngine: ObservableObject {
@@ -89,6 +89,19 @@ class TimerEngine: ObservableObject {
for (type, state) in timerStates { for (type, state) in timerStates {
guard state.isActive && !state.isPaused else { continue } guard state.isActive && !state.isPaused else { continue }
// prevent overshoot - in case user closes laptop while timer is running, we don't want to
// trigger on open,
if state.targetDate < Date() - 3.0 { // slight grace
// Reset the timer when it has overshot its interval
let config = settingsManager.timerConfiguration(for: type)
timerStates[type] = TimerState(
type: type,
intervalSeconds: config.intervalSeconds,
isPaused: state.isPaused,
isActive: state.isActive
)
continue // Skip normal countdown logic after reset
}
timerStates[type]?.remainingSeconds -= 1 timerStates[type]?.remainingSeconds -= 1
@@ -103,7 +116,8 @@ class TimerEngine: ObservableObject {
switch type { switch type {
case .lookAway: case .lookAway:
pause() pause()
activeReminder = .lookAwayTriggered(countdownSeconds: settingsManager.settings.lookAwayCountdownSeconds) activeReminder = .lookAwayTriggered(
countdownSeconds: settingsManager.settings.lookAwayCountdownSeconds)
case .blink: case .blink:
activeReminder = .blinkTriggered activeReminder = .blinkTriggered
case .posture: case .posture:

19
buildServer.json Normal file
View File

@@ -0,0 +1,19 @@
{
"name": "xcode build server",
"version": "1.3.0",
"bspVersion": "2.2.0",
"languages": [
"c",
"cpp",
"objective-c",
"objective-cpp",
"swift"
],
"argv": [
"/opt/homebrew/bin/xcode-build-server"
],
"workspace": "/Users/mike/Code/Gaze/Gaze.xcodeproj/project.xcworkspace",
"build_root": "/Users/mike/Library/Developer/Xcode/DerivedData/Gaze-ahifnboyyfcsskfhqfbfzxarhabs",
"scheme": "Gaze",
"kind": "xcode"
}

48
run
View File

@@ -1,13 +1,10 @@
#!/bin/bash #!/bin/bash
# Build and run Gaze application # Build and run Gaze application
# Usage: ./run [build|test|run] # Usage: ./run [build|test|run]
# Default action is build and run # Default action is build and run
ACTION=${1:-run} ACTION=${1:-run}
VERBOSE=false VERBOSE=false
OUTPUT_FILE="" OUTPUT_FILE=""
# Function to kill any existing Gaze processes # Function to kill any existing Gaze processes
kill_existing_gaze_processes() { kill_existing_gaze_processes() {
echo "🔍 Checking for existing Gaze processes..." echo "🔍 Checking for existing Gaze processes..."
@@ -23,7 +20,25 @@ kill_existing_gaze_processes() {
echo "✅ No existing Gaze processes found" echo "✅ No existing Gaze processes found"
fi fi
} }
# Function to update LSP configuration
update_lsp_config() {
echo "🔧 Updating LSP configuration..."
# Check if xcode-build-server is installed
if command -v xcode-build-server &> /dev/null; then
# Generate buildServer.json for LSP
xcode-build-server config -project Gaze.xcodeproj -scheme Gaze > /dev/null 2>&1
if [ $? -eq 0 ]; then
echo "✅ LSP configuration updated (buildServer.json created)"
else
echo "⚠️ Could not update LSP configuration"
fi
else
echo "⚠️ xcode-build-server not found. Install with: brew install xcode-build-server"
echo " This helps Neovim's LSP recognize your Swift modules"
fi
}
# Parse command line arguments # Parse command line arguments
while [[ $# -gt 0 ]]; do while [[ $# -gt 0 ]]; do
case $1 in case $1 in
@@ -36,13 +51,16 @@ while [[ $# -gt 0 ]]; do
VERBOSE=true VERBOSE=true
shift 2 shift 2
;; ;;
--no-lsp)
SKIP_LSP=true
shift
;;
*) *)
ACTION="$1" ACTION="$1"
shift shift
;; ;;
esac esac
done done
# Function to run command with output control # Function to run command with output control
run_with_output() { run_with_output() {
local cmd="$1" local cmd="$1"
@@ -60,9 +78,7 @@ run_with_output() {
eval "$cmd" > /dev/null 2>&1 eval "$cmd" > /dev/null 2>&1
fi fi
} }
echo "=== Gaze Application Script ===" echo "=== Gaze Application Script ==="
if [ "$ACTION" = "build" ]; then if [ "$ACTION" = "build" ]; then
echo "Building Gaze project..." echo "Building Gaze project..."
run_with_output "xcodebuild -project Gaze.xcodeproj -scheme Gaze -configuration Debug build" run_with_output "xcodebuild -project Gaze.xcodeproj -scheme Gaze -configuration Debug build"
@@ -70,6 +86,11 @@ if [ "$ACTION" = "build" ]; then
if [ $? -eq 0 ]; then if [ $? -eq 0 ]; then
echo "✅ Build succeeded!" echo "✅ Build succeeded!"
echo "💡 The app is located at: build/Debug/Gaze.app" echo "💡 The app is located at: build/Debug/Gaze.app"
# Update LSP config after successful build
if [ "$SKIP_LSP" != true ]; then
update_lsp_config
fi
else else
echo "❌ Build failed!" echo "❌ Build failed!"
exit 1 exit 1
@@ -85,7 +106,6 @@ elif [ "$ACTION" = "test" ]; then
echo "❌ Tests failed!" echo "❌ Tests failed!"
exit 1 exit 1
fi fi
elif [ "$ACTION" = "run" ]; then elif [ "$ACTION" = "run" ]; then
echo "Building and running Gaze application..." echo "Building and running Gaze application..."
@@ -97,6 +117,12 @@ elif [ "$ACTION" = "run" ]; then
if [ $? -eq 0 ]; then if [ $? -eq 0 ]; then
echo "✅ Build succeeded!" echo "✅ Build succeeded!"
# Update LSP config after successful build
if [ "$SKIP_LSP" != true ]; then
update_lsp_config
fi
# Get the actual build output directory from xcodebuild # Get the actual build output directory from xcodebuild
BUILD_DIR="$(xcodebuild -project Gaze.xcodeproj -scheme Gaze -configuration Debug -showBuildSettings 2>/dev/null | grep -m 1 "BUILT_PRODUCTS_DIR" | sed 's/.*= //')" BUILD_DIR="$(xcodebuild -project Gaze.xcodeproj -scheme Gaze -configuration Debug -showBuildSettings 2>/dev/null | grep -m 1 "BUILT_PRODUCTS_DIR" | sed 's/.*= //')"
APP_PATH="${BUILD_DIR}/Gaze.app" APP_PATH="${BUILD_DIR}/Gaze.app"
@@ -113,17 +139,23 @@ elif [ "$ACTION" = "run" ]; then
echo "❌ Build failed!" echo "❌ Build failed!"
exit 1 exit 1
fi fi
elif [ "$ACTION" = "lsp" ]; then
# New command to just update LSP config
echo "Updating LSP configuration only..."
update_lsp_config
else else
echo "Usage: $0 [build|test|run] [-v|--verbose] [-o|--output <file_name>]" echo "Usage: $0 [build|test|run|lsp] [-v|--verbose] [-o|--output <file_name>] [--no-lsp]"
echo "" echo ""
echo "Commands:" echo "Commands:"
echo " build - Build the application" echo " build - Build the application"
echo " test - Run unit tests" echo " test - Run unit tests"
echo " run - Build and run the application (default)" echo " run - Build and run the application (default)"
echo " lsp - Update LSP configuration only (buildServer.json)"
echo "" echo ""
echo "Options:" echo "Options:"
echo " -v, --verbose - Show output in stdout" echo " -v, --verbose - Show output in stdout"
echo " -o, --output - Write output to log file" echo " -o, --output - Write output to log file"
echo " --no-lsp - Skip LSP configuration update"
exit 1 exit 1
fi fi