Status: Draft / macOS 10.15+ / Universal 2(arm64・x86_64)
Updated: 2025-07-27 (JST)
互換方針: UKADOC の SHIORI イベント語彙(3.0/3.1拡張)を踏襲し、OS 依存の値・通知だけを macOS ネイティブ API へ置換。
文字コード: 入出力とも UTF‑8 を標準。互換のため CP932(SJIS)受理 → 内部で UTF‑8 正規化。
改行: LF 推奨(CRLF 受理)。
1. 目的と範囲
- 本仕様は、Ourin(ベースウェア, macOS)で SHIORI イベントを発火・配送するための対応表と動作要件を定義する。
- SSP/UKADOC のイベント名・意味は語彙互換で維持し、Windows 固有値は macOS の等価データへ置換または省略(未定義)。
2. 基本ポリシー(互換/座標/UTType/時刻)
- 互換:既存イベント名・解釈は UKADOC に従う。
- 座標系:イベントで渡すスクリーン座標は AppKit 既定=左下原点(pt)。必要に応じて トップ左基準の補助値(
TopLeftX/Y)を M‑Add で併送可。 - UTType:ドラッグ&ドロップやクリップボードは NSPasteboard/UTType を基準とする(
public.plain-text/public.url/public.file-url等)。 - 時刻:ローカル時刻を返却。ミリ秒は
Date+mach_absolute_timeなどで補完可。
3. イベント分類
- ライフサイクル(起動/終了/切替)
- 入力(キーボード/マウス/ホイール)
- ドラッグ&ドロップ(テキスト/URL/ファイル)
- 表示/ウィンドウ/デスクトップ(画面変更/Spaces/スケール)
- 電源/バッテリー/サーマル
- ロケール/外観(テーマ)/言語
- Web/URL(x‑ukagaka‑link 等)
4. イベント別マッピング表(抜粋)
4.1 ライフサイクル
| SHIORI Event | macOS トリガ | 備考 |
|---|---|---|
OnBoot |
アプリ起動 | Ourin 起動直後 |
OnClose |
終了(Terminate) | 終了前 |
OnGhostChanged |
ゴースト切替 | 既存語彙準拠 |
OnIdle/OnMinuteChange |
タイマー | 既存間隔通り。OnIdle は毎秒発火し、OnSecondChange と同じ R0..R4(R3=トーク再生可否、R4=システム全体の放置秒数)を持つ |
4.2 入力(キーボード/マウス)
| Event | トリガ | パラメータ例 |
|---|---|---|
OnKeyDown/OnKeyUp/OnKeyPress |
NSEvent(key) |
keyCode(US 仮想キー), characters, modifierFlags |
OnMouseDown/OnMouseUp/OnMouseMove/OnMouseWheel |
NSEvent(mouse/scroll) |
screenX/Y(左下原点), button, delta |
4.3 ドラッグ&ドロップ
| Event | トリガ | パラメータ |
|---|---|---|
OnTextDrop |
NSDraggingDestination + UTType.plainText |
Value = テキスト |
OnURLDrop |
NSPasteboard.PasteboardType.url/UTType.url |
Value = URL 文字列 |
OnFileDrop |
public.file-url |
ValueN = ファイル URL 群(セキュリティスコープ考慮) |
4.4 表示/ウィンドウ/デスクトップ
| Event | トリガ | 備考 |
|---|---|---|
OnDisplayChange |
NSApplication.didChangeScreenParametersNotification/CGDisplay |
解像度/構成変更 |
OnResetWindowPos |
内部 | TopLeft 補助可(M‑Add) |
OnDpiChanged 相当 |
backingScaleFactor 変化 |
画面またぎ移動時 |
4.5 電源/バッテリー/サーマル
| Event | トリガ | 備考 |
|---|---|---|
OnPowerSourceChanged |
IOKit Power Sources | AC/バッテリー |
OnBatteryLevel 系 |
同上(定期照会と併用) | しきい値で発火 |
OnThermalStateChanged (M‑Add) |
NSProcessInfo.thermalStateDidChangeNotification |
低/中/高/重大 |
4.6 ロケール/外観/言語
| Event | トリガ | 備考 |
|---|---|---|
OnLocaleChange |
NSLocale.currentLocaleDidChangeNotification |
地域/表記設定 |
OnAppearanceChanged (M‑Add) |
NSApp.effectiveAppearance 監視 |
Light/Dark |
OnInputSourceChanged(任意) |
TIS Input Source 監視 | 実装任意 |
4.7 Web/URL 連携
| Event | トリガ | 備考 |
|---|---|---|
OnXUkagakaLinkOpen 等 |
URL スキーム受理 | 既存語彙準拠 |
5. 追加定義(M‑Add)
OnSpaceChanged:NSWorkspace.activeSpaceDidChangeNotificationにより Spaces 切替を通知。OnAppearanceChanged:ダーク/ライト切替を通知。Appearance=light|dark|highcontrast等のパラメータを返す。OnThermalStateChanged:State=nominal|fair|serious|critical。
6. パラメータ規定
- 座標:
screenX,screenYは 左下原点の pt。補助としてtopLeftX,topLeftYを併送可。 - 修飾キー:
Command|Option|Shift|Control|CapsLock|Functionなどのビット名。 - UTType:
public.plain-text/public.url/public.file-urlを基本。拡張は UTType 階層の同等性で判定。 - Encoding:返却は UTF‑8 固定。
7. サンドボックス/セキュリティ
- ファイル D&D:App Sandbox 環境では security‑scoped URL を開始/終了で管理。
- 外部由来イベント(SSTP/URL スキーム)からのパス入力は制限パスにサニタイズ。
8. 互換性の注意と非対応
- Windows 固有の語彙(
HWND等)は未定義。 - スクリーンセーバ Start/End は macOS 公開 API が無いため、ディスプレイスリープ/復帰で近似(任意有効化)。
9. 仕様例(リクエスト/レスポンス)
## OnURLDrop の例(単一)
GET SHIORI/3.0
ID: OnURLDrop
Sender: Ourin
Reference0: https://example.org/
SecurityLevel: external
###
SHIORI/3.0 200 OK
Value: \0\s[0]URLを受け取りました:%reference[0]\e
付録A: 代表 API 対応表
- Spaces 変更 →
NSWorkspace.activeSpaceDidChangeNotification - 画面構成変更 →
NSApplication.didChangeScreenParametersNotification/ CGDisplay Reconfig - キー/修飾 →
NSEvent.keyCode/NSEvent.ModifierFlags - D&D 種別 →
NSPasteboard.PasteboardType.url/public.plain-text/public.file-url - Power/Battery → IOKit Power Sources(通知+照会)
- 外観 →
NSApplication.effectiveAppearance
付録B: テスト観点チェックリスト
- [ ] URL/ファイル/テキスト D&D の判定と文字コード
- [ ] 複数ディスプレイ/スケール変更の座標・DPI 追随
- [ ] Sleep/Wake・AC/バッテリー切替・サーマル状態
- [ ] ロケール変更・テーマ切替
- [ ] セキュリティ(Sandbox の security‑scoped URL、外部入力の検証)
付録C: 自動システムイベントの有効化タイミング
動作概要
タイマー(OnSecondChange/OnMinuteChange/OnHourTimeSignal)・入力/マウス・スリープ/復帰・ディスプレイ変更・電源状態・ロケール・外観(テーマ)・セッション・ネットワーク・ゲームパッド・デバイス・音声認識の各自動システムイベントは、実ゴーストのロード完了時点を唯一の集約点として EventBridge 内で有効化されます。
実装ファイル:
- Ourin/Ghost/GhostManager.swift — startEventBridgeIfNeeded(enableAutoEvents:) および isRunningUnderTests
- Ourin/SHIORIEvents/EventBridge.swift — start(enableAutoEvents:) / broadcastNotify / flushPendingNotifies
有効化以前の NOTIFY キュー
autoEventsEnabled = false の状態では、broadcastNotify / broadcastNotifyCustom に渡されたイベントは内部キュー (pendingNotifies) に積まれ、即時配送されません。有効化されると同時にキューがフラッシュされ、順次ゴーストへ配送されます。
テスト時の抑制
GhostManager.isRunningUnderTests が true(環境変数 XCTestConfigurationFilePath または XCTestBundlePath の存在で判定)の場合、EventBridge.start(enableAutoEvents: false) が呼ばれ、タイマーや入力監視を含むシステムオブザーバは起動されません。
出典と編集について
Ourin / Furin Lab・contributors。文書はCC BY-SA 4.0(第三者の個別表記を除く)。Web版は見出し・リンクの整備とローカルパスの一般化を行っています。更新基準日: 2026-10-30。
元資料: docs/SHIORI_EVENTS_3.0M_SPEC_ja-jp.md
ソース SHA-256: 704bf8c65a8888217df158f94babc089fd46a0ffade5478ae53b932d215dc1d6