メインコンテンツまでスキップ

出力(ディスプレイ)

COMPOSITOR.output はモニターのレイアウト――解像度・リフレッシュレート・スケール・ 位置・ミラーリング・有効/無効――を制御します。現在の状態を読むことも、希望の レイアウトを生成するファクトリーを登録することもできます。

出力を設定する

COMPOSITOR.output.configure(factory) は、接続中の出力セットが変化するたびに (ホットプラグ、ドック接続/取り外しなど)コンポジターが呼ぶ関数を登録します。 ファクトリーは 出力名 → 設定エントリ のマップを返します。

import {COMPOSITOR, type DisplayConfigDraft} from 'shoji_wm';

COMPOSITOR.output.configure((context) => {
const display: DisplayConfigDraft = {};

display['DP-1'] = {
mode: 'extend',
resolution: {width: 2560, height: 1440, refreshRate: 144},
position: 'auto',
scale: 1.5,
};
display['eDP-1'] = {mode: 'extend', resolution: 'best', scale: 1.8};

// ドック接続中はノートPCのパネルを切る
const docked = context.connected.some((o) => o.name === 'HDMI-A-1');
if (docked) {
display['eDP-1'] = {mode: 'disabled'};
}

return display;
});

出力名("DP-1""eDP-1""HDMI-A-1" など)は DRM コネクタ名です。接続中の名前は context.connected または COMPOSITOR.output.list を読むと一覧できます。

設定エントリ: mode

各エントリは mode によって3つの形のいずれかになります。

mode意味追加フィールド
"extend"(デフォルト)デスクトップの一部として使うresolution / position / scale
"disabled"出力をオフにする
"mirror"別の出力をミラーするsource(ミラー元の出力名)
display['HDMI-A-1'] = {mode: 'mirror', source: 'eDP-1'};
display['eDP-2'] = {mode: 'disabled'};

extend エントリでは mode を省略できます(デフォルトのため)。

resolution

DRM モード(サイズ+リフレッシュレート)を選びます。

意味
"best"出力が提示する最高の解像度+リフレッシュレート
{width, height}そのサイズのモード(一致する中で最高のリフレッシュレート)
{width, height, refreshRate}そのモードを正確に指定
display['DP-1'] = {resolution: 'best'};
display['DP-2'] = {resolution: {width: 1920, height: 1080}};
display['DP-3'] = {resolution: {width: 2560, height: 1440, refreshRate: 165}};

モニターが対応するモードは COMPOSITOR.output.availableModes(name) で確認できます。

position

出力がグローバル座標空間のどこに置かれるかを指定します。

意味
"auto"(デフォルト)コンポジターが自動配置(左から右へ)
{x, y}論理ピクセルでの左上隅を明示指定
display['DP-1'] = {position: {x: 0, y: 0}};
display['DP-2'] = {position: {x: 2560, y: 0}}; // DP-1 の右側

scale

分数スケール係数(HiDPI)です。1.0 は等倍、2.0 は UI を2倍に。デフォルト設定では 1.51.8 のような値を使っています。

display['eDP-1'] = {resolution: 'best', scale: 1.8};

出力の状態を読む

このコントローラは読み取り専用ビューでもあり、イベントハンドラや合成関数の中で 役立ちます。

メンバー返り値
liststring[] — 接続・有効な出力名
outputsOutputInfo[] — 全出力のスナップショット
currentRecord<string, OutputInfo> — 出力名をキーにしたスナップショット
get(name)OutputInfo | undefined
find(predicate)最初に一致した OutputInfo
availableModes(name)ドライバーが報告する OutputMode[]
configure(factory)レイアウトファクトリーを登録(前述)
reconfigure()登録済みファクトリーを即時再実行

OutputInfo には nameenabledresolution{width, height, refreshRate})・ position{x, y})・scaleavailableModes、および識別情報(makemodelserialconnector)が含まれます。

const hz = COMPOSITOR.output.get('DP-1')?.resolution?.refreshRate;

// 出力の論理サイズ(解像度をスケールで割る)
const out = COMPOSITOR.output.get('DP-1');
if (out?.resolution) {
const widthLogical = out.resolution.width / out.scale;
const heightLogical = out.resolution.height / out.scale;
}
ヒント

COMPOSITOR.output.configure はハードウェアのレイアウト用です。バーやドックに 重ならないようウィンドウを配置したい場合は、排他ゾーンのレイヤーサーフェスを差し引く COMPOSITOR.layer.usableArea(name) を使ってください。