Skip to content

Development

Orahu01 edited this page Aug 20, 2026 · 2 revisions

開発者向け情報

AeroWidget は Electron 製のデスクトップアプリです。ネイティブ Windows API 呼び出しには koffi(FFI ライブラリ)を使っています。

セットアップ

git clone https://github.com/Orahu01/aerowidget.git
cd wallpaper
npm install
npm start          # 開発モードで起動
npm run genicon    # アプリアイコンを再生成 (assets/)
npm run dist        # Windows 向け exe をビルド (dist/)

ディレクトリ構成

src/
  main/            # メインプロセス
    main.js          # ウィンドウ管理・IPC・トレイ・全体の配線
    config.js        # 設定の読み書き (%APPDATA%/aerowidget/config.json)
    wallpaperAttach.js  # WorkerW へのアタッチ (壁紙の核となる仕組み)
    monitors.js      # 物理モニタの列挙・Electron ディスプレイとの対応付け
    weather.js       # Open-Meteo
    feeds.js         # RSS / 株価 (Yahoo Finance)
    media.js         # 再生中メディア (SMTC ブリッジ)
    lhm.js           # Libre Hardware Monitor 連携
    stats.js         # 内蔵 CPU/メモリ計測
    gfonts.js        # Google Fonts のダウンロード・管理
    updater.js       # 自動アップデート (electron-updater)
    fullscreen.js    # フルスクリーンアプリ検知 (省電力)
    heartbeat.js     # 定期処理の単一集約タイマー
  preload/         # 各ウィンドウ用の contextBridge
  renderer/
    wallpaper/       # 壁紙ウィンドウ (実際に描画される本体)
    settings/        # 設定ウィンドウ
    folder/          # フォルダウィジェット (対話可能な小窓)
    note/            # メモウィジェット
    pomo/            # ポモドーロタイマーウィジェット
assets/
  smtc.ps1         # SMTC ブリッジ用 PowerShell スクリプト
docs/
  index.html       # GitHub Pages の紹介ページ

壁紙の仕組み(WorkerW アタッチ)

Wallpaper Engine や Lively Wallpaper と同じ手法です。

  1. Progman(デスクトップのルートウィンドウ)に 0x052C メッセージを送ると、WorkerW という不可視ウィンドウが生成されます
  2. Electron のウィンドウを WS_CHILD スタイルに変更し、アイコンレイヤー (SHELLDLL_DefView) の背面にある WorkerW へ SetParent します
  3. これでウィンドウはデスクトップアイコンの「背面」に表示され、タスクバーやウィンドウ切り替えには現れません

Windows のバージョンによって WorkerW の階層構造が異なる(Win10 型 / Win11 24H2 型)ため、両方のレイアウトを検出して対応しています。

フォルダウィジェット(クリック可能な小窓)

フォルダ・メモ・ポモドーロタイマーは、壁紙とは逆に Progman 直下の最前面(アイコンより上、かつすべてのアプリより下)に配置しています。これにより、デスクトップ上に常駐しつつクリックを受け取れます(Rainmeter と同じ層)。

マルチ DPI 対応

モニタごとに拡大率 (DPI) が異なる環境では、ウィンドウを子ウィンドウ化した際に Electron 側の DIP(デバイス非依存ピクセル)換算がずれることがあります。実際の物理ピクセルサイズを測定し、目標サイズと合うように DIP 値を逆算して補正する仕組みを入れています(fixAttachedSize / placeFolder の収束ループ)。

省電力設計

  • 背景は既定で完全静止(transform アニメーションのみ、CSS のリペイントを伴わない)
  • 時計は秒表示が必要な時だけ毎秒 tick し、それ以外は毎分しか起きません
  • フルスクリーンアプリ検知は WinEvent フック駆動(ポーリングなし)で、ゲーム中は対象モニタの描画を自動停止します
  • メインプロセスの定期処理はすべて heartbeat.js の単一タイマーに集約しています。Electron のメインプロセスは setInterval が複数あるだけでメッセージポンプが空回りして CPU を消費するため、これを避けています

Pull Request について

バグ修正・機能追加の Pull Request を歓迎します。大きな変更を加える前に、Issue で相談していただけるとスムーズです。

Clone this wiki locally