ADR-0003: LG webOS command routing

Status

Accepted

Area

Device backends

Context

webOS has no ssap:// URIs for cursor navigation, so the D-pad, OK, Home/Back/Menu/Info/Exit and digits cannot be issued the same way as the other commands. The pointer input socket is the only way to send those, which forces command routing to split across two sockets.

Decision

D-pad, OK, Home/Back/Menu/Info/Exit and digits go over the pointer input socket (type:button\nname:…​), because webOS has no ssap:// URIs for cursor navigation — the pointer socket is the only way.

Volume, channel, mute, media transport and power-off go over ssap:// requests on the main socket (more reliable, and what LG’s own apps use).

Mute is tracked locally (ssap://audio/setMute needs an explicit boolean, and webOS exposes no toggle), flipping a muted flag on each press.

KeyCommand::Source is Unsupported on LG for v1 — input switching needs an input-list round-trip; the trait hook is left, no silent stub.

Consequences

  • Command routing is split across two sockets: the pointer input socket for cursor navigation and the main socket for ssap:// requests.

  • Using ssap:// on the main socket for volume, channel, mute, media transport and power-off is more reliable and matches what LG’s own apps use.

  • Because ssap://audio/setMute needs an explicit boolean and webOS exposes no toggle, mute state must be tracked locally via a muted flag flipped on each press.

  • KeyCommand::Source remains Unsupported on LG for v1; input switching needs an input-list round-trip, and the trait hook is left in place rather than providing a silent stub.