wayland-client-protocol.h [2]

wl_output
wl_output_add_listenerハンドラ設定
wl_output_destroy破棄
wl_output_release解放
wl_seat
wl_seat_add_listenerハンドラ設定
wl_seat_destroy破棄
wl_seat_release解放
wl_seat_get_pointerwl_pointer を作成
wl_seat_get_keyboardwl_keyboard を作成
wl_seat_get_touchwl_touch を作成
wl_pointer
wl_pointer_add_listenerハンドラ設定
wl_pointer_destroy破棄
wl_pointer_release解放
wl_pointer_set_cursorポインタのカーソル形状をセット
wl_keyboard
wl_keyboard_add_listenerハンドラ設定
wl_keyboard_destroy破棄
wl_keyboard_release解放
wl_output
int wl_output_add_listener(struct wl_output *wl_output,
    const struct wl_output_listener *listener, void *data);
void (*geometry)(void *data, struct wl_output *wl_output,
    int32_t x, int32_t y, int32_t physical_width, int32_t physical_height, int32_t subpixel,
    const char *make, const char *model, int32_t transform);

void (*mode)(void *data, struct wl_output *wl_output, uint32_t flags,
    int32_t width, int32_t height, int32_t refresh);

void (*done)(void *data, struct wl_output *wl_output);

void (*scale)(void *data, struct wl_output *wl_output, int32_t factor);
geometry
モニタの情報が送られてくる。
バインドした時、またはプロパティのいずれかが変更されたときに送信される。

physical_width, height: モニタの物理的な幅と高さ (mm)。仮想環境上では 0 の場合もあり。
make: メーカー名。
mode: モデル名。

subpixel: サブピクセルタイプ
WL_OUTPUT_SUBPIXEL_UNKNOWN
WL_OUTPUT_SUBPIXEL_NONE
WL_OUTPUT_SUBPIXEL_HORIZONTAL_RGB
WL_OUTPUT_SUBPIXEL_HORIZONTAL_BGR
WL_OUTPUT_SUBPIXEL_VERTICAL_RGB
WL_OUTPUT_SUBPIXEL_VERTICAL_BGR

transform: 変形
WL_OUTPUT_TRANSFORM_NORMAL
WL_OUTPUT_TRANSFORM_90
WL_OUTPUT_TRANSFORM_180
WL_OUTPUT_TRANSFORM_270
WL_OUTPUT_TRANSFORM_FLIPPED
WL_OUTPUT_TRANSFORM_FLIPPED_90
WL_OUTPUT_TRANSFORM_FLIPPED_180
WL_OUTPUT_TRANSFORM_FLIPPED_270
mode
使用可能なモードの列挙。
バインドした時か、モードが変更された時に送信され、最低でも現在のモードが1つ存在する。

flags:
WL_OUTPUT_MODE_CURRENT = 0x01 : カレント
WL_OUTPUT_MODE_PREFERRED = 0x02 : 優先

width, height: 画面のサイズ (px)
refesh: 垂直フレームレート (mHz)
done
mode などのイベントがすべて送信された後に送られる。
すべての情報を最後にまとめて処理したい時などに使う。

ver 2 から
scale
画面のスケーリング情報を受け取る。
バインド後、またはスケールが変更された時に送信される。
送られてこなかった場合は、1と仮定する。

1 より大きいスケールは、コンポーザがレンダリング時にサーフェスを拡大させる。
これは、高解像度のディスプレイで、等倍表示だと読みにくい場合に使用される。

スケーリングに対応する場合は、wl_surface_set_buffer_scale() に値を渡して適用する。

ver 2 から
void wl_output_destroy(struct wl_output *wl_output);
破棄する。
ver 2 以下では、こちらを使うこと。
void wl_output_release(struct wl_output *wl_output);
解放する。
wl_output のバージョンが WL_OUTPUT_RELEASE_SINCE_VERSION 以上なら、destroy の代わりにこちらを使うこと。

ver 3 から
wl_seat
int wl_seat_add_listener(struct wl_seat *wl_seat,
    const struct wl_seat_listener *listener, void *data);
void (*capabilities)(void *data, struct wl_seat *wl_seat, uint32_t capabilities);
void (*name)(void *data, struct wl_seat *wl_seat, const char *name);
capabilities
ポインタ/キーボード/タッチ機能が使用可能か使用不可になった時に送られる。

capabilities:
WL_SEAT_CAPABILITY_POINTER = 1
WL_SEAT_CAPABILITY_KEYBOARD = 2
WL_SEAT_CAPABILITY_TOUCH = 4

フラグが ON の場合、wl_seat_get_pointer() などを使って、各オブジェクトを取得できる。

フラグが OFF になった場合、wl_pointer_release() などを使ってオブジェクトを破棄する必要がある。
(ver 4 以下では wl_pointer_destroy())

※ 一部のコンポジタでは、クライアントが ver 4 以下を使用している場合、オブジェクトが使用不可になった後もポインタなどのイベントを再び送信することがあるが、この動作は信用してはならない。
name
この wl_seat の識別子が送られてくる。

seat が複数ある場合に使う。
コンポジタによって名前は異なる。

ver 2 から
void wl_seat_destroy(struct wl_seat *wl_seat);
破棄する。
ver 5 以降では、wl_seat_release() を使う。
void wl_seat_release(struct wl_seat *wl_seat);
解放する。
wl_seat のバージョンが WL_SEAT_RELEASE_SINCE_VERSION 以上なら、destroy の代わりにこちらを使う。

ver 5 から
struct wl_pointer *wl_seat_get_pointer(struct wl_seat *wl_seat);
wl_pointer を作成
struct wl_keyboard *wl_seat_get_keyboard(struct wl_seat *wl_seat);
wl_keyboard を作成
struct wl_touch *wl_seat_get_touch(struct wl_seat *wl_seat);
wl_touch を作成
wl_pointer
int wl_pointer_add_listener(struct wl_pointer *wl_pointer,
    const struct wl_pointer_listener *listener, void *data);
void(*enter)(void *data, struct wl_pointer *wl_pointer,
    uint32_t serial, struct wl_surface *surface, wl_fixed_t surface_x, wl_fixed_t surface_y);

void(*leave)(void *data, struct wl_pointer *wl_pointer,
    uint32_t serial, struct wl_surface *surface);

void(*motion)(void *data, struct wl_pointer *wl_pointer,
    uint32_t time, wl_fixed_t surface_x, wl_fixed_t surface_y);

void(*button)(void *data, struct wl_pointer *wl_pointer,
    uint32_t serial, uint32_t time, uint32_t button, uint32_t state);

void(*axis)(void *data, struct wl_pointer *wl_pointer,
    uint32_t time, uint32_t axis, wl_fixed_t value);

▼ ver 5 から

void(*frame)(void *data, struct wl_pointer *wl_pointer);

void(*axis_source)(void *data, struct wl_pointer *wl_pointer, uint32_t axis_source);

void(*axis_stop)(void *data, struct wl_pointer *wl_pointer, uint32_t time, uint32_t axis);

void(*axis_discrete)(void *data, struct wl_pointer *wl_pointer, uint32_t axis, int32_t discrete);

wl_fixed_t は、int32_t 型、24:8 の固定少数点数。
time は、ミリ秒単位のタイムスタンプで、ベースは未定義。
enter
ポインタがサーフェス内に入った。
カーソル形状の変更はクライアント側で処理する。
leave
ポインタがサーフェスから出た。
motion
ポインタがサーフェス内で移動した。
button
マウスボタンが押された/離された。
位置は、最後の enter/motion の値を使う。

button は、Linux カーネルの linux/input-event-codes.h ヘッダーに定義されているボタンコード (BTN_LEFT など)。
16 bit までの値は、将来のカーネルのイベントコードリストへの追加用に予約されている。
0xFFFF を超えるコードは現在未定義だが、このプロトコルの将来のバージョンで使用される可能性がある。

state:
WL_POINTER_BUTTON_STATE_RELEASED = 0
WL_POINTER_BUTTON_STATE_PRESSED = 1
axis
ホイールなどのスクロール時。
斜めなどの場合は、複数のイベントが来る。

axis: 移動した軸
WL_POINTER_AXIS_VERTICAL_SCROLL = 0
WL_POINTER_AXIS_HORIZONTAL_SCROLL = 1

value は移動の方向と量。サーバーにより量は異なる。
frame
一連のイベントを一つのかたまりとして、それらが終了した時に送られる。

axis/motion/leave など、すべてのイベントが対象。
enter/leave は一つにまとめないことが望ましい。

var 5 から
axis_source
frame イベント前にオプションとして送信され、フレーム内のイベントのソース情報を提供する。
ソースが不明な場合、送信されない。

axis_source
WL_POINTER_AXIS_SOURCE_WHEEL = 0
WL_POINTER_AXIS_SOURCE_FINGER = 1
WL_POINTER_AXIS_SOURCE_CONTINUOUS = 2
WL_POINTER_AXIS_SOURCE_WHEEL_TILT = 3 (ver 6 から)

FINGER の場合、ユーザーが指をデバイスから離したときに axis_stop イベントが送信される。

それ以外の場合、axis_stop イベントは送信される場合と送信されない場合がある。
コンポジタが axis_stop イベントを送信するかどうかは、ハードウェア固有で実装に依存する。

axis_discrete と axis_source の順序は保証されていない。

ver 5 から
axis_stop
スクロールおよびその他の軸の停止が通知される。
このイベント後に、同じ axis_source を持つ axis イベントが来た場合、新しい軸の開始と見なす必要がある。

time は、axis イベントのタイムスタンプと同じように解釈される。
タイムスタンプ値は、先行する axis イベントと同じにすることができる。

ver 5 から
axis_discrete
スクロールおよびその他の軸のステップ情報が送られる。
このイベントは単独では発生せず、axis イベントと同時に来る。

このイベントはオプションである。
タッチパッド上での2本指のスクロールのような連続スクロールデバイスは、ステップを持たないため、このイベントを生成しない。

discrete はステップ値。
-1 なら、負の方向に一段階移動という意味。

axis_discrete と axis_source の順序は保証されていない。

ver 5 から
void wl_pointer_destroy(struct wl_pointer *wl_pointer);
ver 3 以降では、wl_pointer_release() を使う。
void wl_pointer_release(struct wl_pointer *wl_pointer);
wl_seat のバージョンが WL_POINTER_RELEASE_SINCE_VERSION 以上なら、destroy の代わりにこちらを使う。

var 3 から
void wl_pointer_set_cursor(struct wl_pointer *wl_pointer,
    uint32_t serial, struct wl_surface *surface,
    int32_t hotspot_x, int32_t hotspot_y);
wl_surface を、ポインタのカーソルイメージとしてセットする。

この要求はサーフェスにカーソルの役割を与える。
サーフェスにすでに別の役割がある場合は、プロトコルエラーが発生する。

surface が NULL の場合、カーソル形状は非表示になる。
hotspot_x, hotspot_y は、ホットスポット位置。
wl_keyboard
int wl_keyboard_add_listener(struct wl_keyboard *wl_keyboard,
    const struct wl_keyboard_listener *listener, void *data);
void (*keymap)(void *data, struct wl_keyboard *wl_keyboard,
    uint32_t format, int32_t fd, uint32_t size);

void (*enter)(void *data, struct wl_keyboard *wl_keyboard,
    uint32_t serial, struct wl_surface *surface, struct wl_array *keys);

void (*leave)(void *data, struct wl_keyboard *wl_keyboard,
    uint32_t serial, struct wl_surface *surface);

void (*key)(void *data, struct wl_keyboard *wl_keyboard,
    uint32_t serial, uint32_t time, uint32_t key, uint32_t state);

void (*modifiers)(void *data, struct wl_keyboard *wl_keyboard,
    uint32_t serial, uint32_t mods_depressed, uint32_t mods_latched,
    uint32_t mods_locked, uint32_t group);

void (*repeat_info)(void *data, struct wl_keyboard *wl_keyboard,
    int32_t rate, int32_t delay);
keymap
キーマップを設定する必要がある時に来る。

format
WL_KEYBOARD_KEYMAP_FORMAT_NO_KEYMAP = 0
WL_KEYBOARD_KEYMAP_FORMAT_XKB_V1 = 1

fd, size はキーマップの設定情報が入った共有メモリの fd とデータサイズ。
mmap() でメモリマップして文字列データとして扱う。
enter
キーボードフォーカスが来た時。
ウィンドウがアクティブになって、キー入力ができる状態になった時。
leave
キーボードフォーカスが離れた時
key
キーが押された/離された時。

key は、物理キー番号。linux/input-event-codes.h で定義されている値。

state
WL_KEYBOARD_KEY_STATE_RELEASED = 0
WL_KEYBOARD_KEY_STATE_PRESSED = 1
modifiers
装飾キーやロックの状態が変更した時。
値はキーマップによって異なる。

mods_depressed : 押されている装飾のフラグ
mods_latched : ラッチされた装飾
mods_locked : ロックされている装飾
group : キーボードレイアウト
repeat_info
キーリピートの間隔と、キーリピートを開始するまでの時間 (ms) を提供する。

wl_keyboard オブジェクトが作成されるとすぐに送信され、設定が変更されると再び送信される。

delay は最初にキーを押した時からキーリピートを開始するまでの時間。
rate はリピート開始後にキーを出力する間隔。0 でキーリピート無効。

ver 4 から
void wl_keyboard_destroy(struct wl_keyboard *wl_keyboard);
ver 3 以降では、wl_keyboard_release() を使う。
void wl_keyboard_release(struct wl_keyboard *wl_keyboard);
wl_seat のバージョンが WL_KEYBOARD_RELEASE_SINCE_VERSION 以上なら、destroy の代わりにこちらを使う。

ver 3 から