Skip to content

feat: Apple Silicon support + graph bar color picker#275

Open
nastarynaz wants to merge 14 commits into
gao-sun:masterfrom
nastarynaz:master
Open

feat: Apple Silicon support + graph bar color picker#275
nastarynaz wants to merge 14 commits into
gao-sun:masterfrom
nastarynaz:master

Conversation

@nastarynaz
Copy link
Copy Markdown

Summary

This PR brings two major improvements to eul:


🍎 Apple Silicon (M-series) Temperature & GPU Support

SMC / Temperature fixes:

  • SMCParamStruct size corrected for Apple Silicon (prevents misaligned reads)
  • Added FLT (32-bit float) sensor format support — Apple Silicon uses FLT instead of SP78. Code now tries SP78 first and falls back to FLT
  • Fan speed decoding also updated to fall back to FLT (SMCResult 135 handled silently)
  • Apple Silicon fallback sensor names in SmcControl:
    • CPU Die → CPU_PCORE, CPU_PACKAGE
    • CPU Proximity → CPU_ECORE
    • GPU Proximity → GPU_APPLE_SILICON

GPU fixes:

  • getGPUs() uses model name as identifier when device-id is absent (Apple Silicon GPUs)
  • getInfo() falls back to "apple" as pciMatch when IOPCIMatch unavailable
  • GPU usage tries multiple keys: Device Utilization %, GPU Activity(%), GPU Core Utilization, IOAcceleratorStatistics2 — defaults to 0 instead of crashing
  • CPU usage clamped to prevent occasional 100% spikes on Apple Silicon

🎨 Graph Bar Color Picker

  • New GraphColorOption enum: Monochrome, Red #e03a3e, Blue #009ddc, Orange #f6821f, Yellow #fcb827
  • Per-component color stored in EulComponentConfig, persisted via UserDefaults
  • In Preferences → Components, a Graph Color row with 5 circle swatches appears when "Show Graph" is ON
  • LineChart accepts a color param (fill at 50% opacity, full stroke)
  • CpuView, GpuView, MemoryView all pass the configured color to LineChart

🔧 Build & Compatibility

  • Minimum deployment target: 10.15 → 11.0 for all targets
  • Removed deprecated SDKROOT=macosx from build scripts
  • GitHub Actions updated to v4, removed hardcoded -sdk macosx flag
  • Added uptime days display, bumped version to 1.6.3

niezhihai and others added 14 commits January 29, 2026 11:05
…e monitoring

- Add M-series specific SMC temperature sensors (Tp09, Tp0T, Tp05, Tg05)
- Update SmcControl to fallback to M-series sensors when Intel sensors unavailable
- Improve GPU monitoring to handle M-series integrated GPUs
- Add GitHub Actions artifact upload for easier testing

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Changed SMCKeyInfoData.dataSize from IOByteCount (8 bytes on 64-bit) to UInt32 (4 bytes) to ensure SMCParamStruct is exactly 80 bytes as required by the SMC driver. This fixes the assertion failure on Apple Silicon Macs.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Add Double.init(fromFLT:) to parse FLT (float) format temperature data
- Update temperature() function to try SP78 first, then fallback to FLT
- Update allUnknownTemperatureSensors() to include FLT format sensors
- Fixes N/A temperature display on M-series Macs

The Apple Silicon Macs use FLT (4-byte float) format for temperature
sensors instead of SP78 (2-byte fixed-point) format used by Intel Macs.
This change enables proper temperature reading on M1/M2/M3 Macs.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Catch all errors when trying SP78 format, not just specific error code
- This ensures FLT fallback works reliably on Apple Silicon Macs
- Simplifies error handling logic

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Problem:
- GPU shows N/A on Apple Silicon (M-series) Macs
- system_profiler doesn't provide device-id for Apple Silicon GPUs
- IOAccelerator doesn't provide IOPCIMatch for Apple Silicon GPUs

Solution:
1. GPU Detection (GPU.swift):
   - Use model name as deviceId fallback when device-id is not available
   - This allows Apple Silicon GPUs to be detected (e.g., "Apple M4 Pro")

2. GPU Statistics (GPU.swift):
   - Remove requirement for IOPCIMatch (was causing nil return)
   - Use "apple" as fallback pciMatch for Apple Silicon GPUs
   - GPU usage is available from PerformanceStatistics["Device Utilization %"]

3. GPU Matching (GpuStore.swift):
   - Detect Apple Silicon GPUs by checking if deviceId contains "apple" or " m"
   - Match Apple Silicon GPUs by pciMatch == "apple"
   - Keep Intel GPU matching logic (match by device ID in pciMatch)

Note on GPU Temperature:
- GPU temperature sensors (Tg*) exist but return SMC error 132 (read-only/unavailable)
- This appears to be a system limitation on Apple Silicon
- GPU temperature will show N/A, but usage percentage will work correctly

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Add uptime days display in CPU menu block
- Update version from 1.6.2 to 1.6.3
- Add localization support for all 22 languages

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
## Graph Bar Color
- Added GraphColorOption enum with 5 options: Monochrome, Red (#e03a3e),
  Blue (#009ddc), Orange (#f6821f), Yellow (#fcb827)
- EulComponentConfig now stores graphColor setting, persisted to UserDefaults
- LineChart accepts a color parameter (fill at 50% opacity, solid stroke)
- CpuView, GpuView, MemoryView pass config.graphColor.color to LineChart
- PreferenceComponentConfigView shows a color picker row (circle swatches)
  when 'Show Graph' is enabled — clicking a swatch applies it instantly

## Color Definitions
- Added .graphRed, .graphBlue, .graphOrange, .graphYellow to Color extension
- ProgressBarView now accepts a color parameter for bar fill (default .primary)

## Apple Silicon / Build Fixes
- Bumped MACOSX_DEPLOYMENT_TARGET from 10.15 → 11.0 for all targets
- Disabled SwiftFormat build phase (was blocking build by downloading SPM deps)
- Suppressed noisy SMC error 135 (SP78/FLT type mismatch on Apple Silicon —
  already handled by FLT fallback, was printing on every refresh cycle)
@github-actions github-actions Bot added the needs review PR needs review label Apr 3, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

needs review PR needs review

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant