
{"id":9987,"date":"2022-06-21T09:10:37","date_gmt":"2022-06-21T09:10:37","guid":{"rendered":"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/documentation\/rdk_video_documentation\/components\/open-sourced_components\/westeros\/"},"modified":"2026-09-22T06:12:22","modified_gmt":"2026-09-22T06:12:22","slug":"westeros","status":"publish","type":"page","link":"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_video_documentation\/components\/westeros\/","title":{"rendered":"Westeros"},"content":{"rendered":"\n<p>Westeros is a lightweight Wayland compositor library that enables applications to create one or more Wayland displays. It is designed to be compatible with applications built for standard Wayland compositors and is structured as a library rather than a standalone application, allowing it to be embedded inside a host process. It supports three compositor modes: a&nbsp;<strong>normal<\/strong> compositor that renders its composited output directly to the screen, a <strong>nested<\/strong> compositor that connects to another compositor as a client and renders onto a surface of that parent compositor, and an <strong>embedded<\/strong> compositor whose composited output is driven by the hosting application through explicit calls. This flexibility allows Westeros to act as the top-level display server on a device, as an intermediary layer in a compositor chain, or as an off-screen compositor integrated into an application&#8217;s rendering pipeline.<\/p>\n\n\n\n<p>At the device level, Westeros provides a Wayland display endpoint that UI frameworks, media players, and other application runtimes connect to as Wayland clients. At the module level, it exposes a C API for creating, configuring, and starting compositor instances, a pluggable renderer interface that allows vendor-specific rendering backends to be loaded at runtime, and a set of Wayland protocol extensions \u2014 Simple Shell, VPC, linux-dmabuf, and explicit sync \u2014 that provide surface management and video path control beyond the base Wayland protocol.<\/p>\n\n\n\n<div class=\"wp-block-merpress-mermaidjs diagram-source-mermaid\"><pre class=\"mermaid\">flowchart LR\n\nclassDef Apps stroke:#00B9F1,fill:#E6F7FD,stroke-width:2px\nclassDef RDKMW stroke:#75D701,fill:#F1FFE6,stroke-width:2px\nclassDef VL stroke:#808080,fill:#F2F2F2,stroke-width:2px\n\n    subgraph Apps[\"Apps and Runtimes\"]\n        RDKUI[\"UI\"]\n        FBApps[\"Firebolt Apps\"]\n        WPE_RT[\"WPE Runtime\"]\n    end\n\n    subgraph RDKMW_SUB[\"RDK Core Middleware\"]\n        AM[\"App Manager\"]\n        Rialto[\"Rialto\"]\n        Westeros[\"Westeros Wayland Compositor\"]\n        Thunder[\"WPEFramework Thunder\"]\n    end\n\n    subgraph VL_SUB[\"Vendor Layer\"]\n        SOCHAL[\"westeros-soc SOC Render HAL\"]\n        BSP[\"BSP\"]\n        DRM[\"DRM EGL Libraries\"]\n    end\n\n    RDKUI -->|Wayland Protocol| Westeros\n    FBApps -->|Wayland Protocol| Westeros\n    WPE_RT -->|Wayland Protocol| Westeros\n    Westeros -->|Renderer Module API| SOCHAL<\/pre><\/div>\n\n\n\n<p><strong>Key Features &amp; Responsibilities:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Multiple Compositor Modes<\/strong>: Westeros operates as a normal (top-level), nested, or embedded compositor. A nested compositor connects to a parent Wayland display and forwards its composited output as a client surface; an embedded compositor exposes its scene only when the host application triggers composition explicitly via <code>WstCompositorComposeEmbedded<\/code>.<\/li>\n\n\n\n<li><strong>Pluggable Renderer Interface<\/strong>: The rendering backend is loaded at runtime from a shared library specified by <code>WstCompositorSetRendererModule<\/code>. Renderer modules implement a defined function table (<code>WstRenderer<\/code>) covering surface create\/destroy, buffer commit, geometry, opacity, z-order, crop, and DMA-buf operations.<\/li>\n\n\n\n<li><strong>Surface and Shell Protocol Support<\/strong>: Westeros implements <code>wl_compositor<\/code>, <code>wl_shell<\/code>, and one build-selected <code>xdg-shell<\/code> variant (v4, v5, or stable) server-side. Each client surface is tracked as a <code>WstSurface<\/code> with full position, size, opacity, z-order, and popup relationship state.<\/li>\n\n\n\n<li><strong>Input Routing<\/strong>: Keyboard, pointer, and touch input is injected via the compositor API (<code>WstCompositorKeyEvent<\/code>, <code>WstCompositorPointerMoveEvent<\/code>, <code>WstCompositorPointerButtonEvent<\/code>, <code>WstCompositorTouchEvent<\/code>) and dispatched through standard Wayland seat protocols to the focused surface. Keyboard layout is managed via libxkbcommon with configurable key repeat delay and rate.<\/li>\n\n\n\n<li><strong>Video Path Control (VPC)<\/strong>: The proprietary <code>vpc<\/code> Wayland protocol extension allows a video surface to declare whether its content follows a hardware or graphics path and communicates position and scale transforms to the compositor chain, enabling hole-punch and hardware video overlay positioning.<\/li>\n\n\n\n<li><strong>Wayland Protocol Extensions<\/strong>: Optionally compiled-in extensions include <code>wl_sb<\/code> (shared buffer), <code>zwp_linux_dmabuf_v1<\/code> (DMA-buf import), <code>linux_explicit_synchronization_unstable_v1<\/code> (acquire\/release fence synchronization), and <code>wl_simple_shell<\/code> for privileged surface management.<\/li>\n\n\n\n<li><strong>Extensible Module System<\/strong>: Additional Wayland protocols or functionality can be added at runtime by loading external shared libraries that provide <code>moduleInit<\/code> and <code>moduleTerm<\/code> entry points, registered via <code>WstCompositorAddModule<\/code>.<\/li>\n\n\n\n<li><strong>Repeater Mode<\/strong>: When supported by the platform&#8217;s Wayland-EGL path, a repeating nested compositor forwards client surface buffers directly to the parent compositor without intermediate composition; otherwise Westeros falls back to nested composition with the GL renderer.<\/li>\n\n\n\n<li><strong>Virtual Embedded Compositors<\/strong>: Multiple virtual embedded compositor instances can be created from a single master embedded compositor via <code>WstCompositorCreateVirtualEmbedded<\/code>, allowing independent sub-scene management within one process.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Design<\/h2>\n\n\n\n<p>Westeros is designed around a library model where the compositor runs inside the host process. The compositor context (<code>WstContext<\/code>) holds all shared state and runs a dedicated compositor thread that owns the Wayland display event loop, client connections, and frame generation. The public <code>WstCompositor<\/code> handle is the per-instance API object and decouples the calling thread from the compositor thread, with a 64-entry event queue (<code>WstEvent<\/code>) bridging input events from the application thread to the compositor thread. A recursive pthread mutex (<code>ctx-&gt;mutex<\/code>) serializes access to shared context state between the caller and the compositor thread.<\/p>\n\n\n\n<p>The three compositor modes \u2014 normal, nested, and embedded \u2014 are controlled by flags set before <code>WstCompositorStart<\/code> is called. In nested mode, a <code>WstNestedConnection<\/code> is established on a separate thread to maintain the connection to the parent Wayland display, receiving output geometry, keyboard map, and VPC events from the parent and forwarding them into the local compositor event flow. In embedded mode, composition is triggered only when the hosting application calls <code>WstCompositorComposeEmbedded<\/code>, and both that call and <code>WstCompositorStart<\/code> must be issued from the same thread. Normal mode drives composition from a timer event source on the compositor thread at the configured frame rate.<\/p>\n\n\n\n<p>Rendering is fully decoupled through the <code>WstRenderer<\/code> interface: the compositor calls <code>renderer_init<\/code> in the loaded module to populate a function table, then calls <code>surfaceCreate<\/code>, <code>surfaceCommit<\/code>, <code>updateScene<\/code>, and related methods for each frame. This separation means the compositor core has no dependency on any specific GPU API; EGL and GLES2 are engaged only when a GL-based renderer module is loaded. Buffer sharing between clients and the renderer is handled through <code>wl_shm<\/code>, <code>wl_sb<\/code>, <code>zwp_linux_dmabuf_v1<\/code>, or EGL Wayland buffer extensions, depending on which protocols are enabled at build time.<\/p>\n\n\n\n<p>Northbound interaction with hosted clients is via the Wayland socket protocol: clients connect, bind globals, create surfaces, attach buffers, and commit. The hosting application also controls embedded instances through the C API, while southbound interaction is through the renderer module&#8217;s function table.<\/p>\n\n\n\n<p>For non-nested starts, the keyboard map is initialized from libxkbcommon using the evdev rule set and the us layout by default; nested instances receive the parent compositor&#8217;s keymap.<\/p>\n\n\n\n<div class=\"wp-block-merpress-mermaidjs diagram-source-mermaid\"><pre class=\"mermaid\">graph TD\n    subgraph WesterosProcess[\"Westeros Process\"]\n        subgraph PublicAPI[\"Public API Layer\"]\n            WstComp[\"WstCompositor API Handle\"]\n        end\n\n        subgraph CoreContext[\"Compositor Context WstContext\"]\n            CompThread[\"Compositor Thread wstCompositorThread\"]\n            EventQ[\"Event Queue 64 entries\"]\n            SurfaceMap[\"Surface Map surfaceId to WstSurface\"]\n            Seat[\"WstSeat keyboard pointer touch\"]\n            Output[\"WstOutput geometry and mode\"]\n            ShellGlobals[\"Shell Globals wl_shell xdg_shell wl_simple_shell\"]\n        end\n\n        subgraph RendMod[\"Renderer Module dlopen\"]\n            RendGL[\"libwesteros_render_gl or libwesteros_render_embedded\"]\n        end\n\n        subgraph NConn[\"Nested Connection\"]\n            NCThread[\"Nested Connection Thread\"]\n        end\n    end\n\n    subgraph VendorLayer[\"Vendor Layer\"]\n        SOC[\"westeros-soc DRM EGL\"]\n    end\n\n    WstComp -->|enqueue input events| EventQ\n    EventQ -->|drain and dispatch| CompThread\n    CompThread -->|surface commit and compose| RendGL\n    NCThread -->|output keyboard VPC callbacks| CompThread\n    RendGL -->|EGL GLES2 DMA-buf| SOC\n    NCThread -->|nested wl events| CompThread<\/pre><\/div>\n\n\n\n<h4 class=\"wp-block-heading\">Threading Model<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Threading Architecture<\/strong>: Multi-threaded<\/li>\n\n\n\n<li><strong>Main \/ Caller Thread<\/strong>: Invokes <code>WstCompositorCreate<\/code>, <code>WstCompositorSet*<\/code>, <code>WstCompositorStart<\/code>, and input injection APIs. Posts events to the per-compositor event queue.<\/li>\n\n\n\n<li><strong>Worker Threads<\/strong>:<\/li>\n\n\n\n<li><em>Compositor thread<\/em> (<code>wstCompositorThread<\/code>): Runs the <code>wl_display<\/code> event loop, accepts client connections, dispatches protocol requests, schedules repaints, drives frame composition at the configured frame rate, and manages surface lifecycle.<\/li>\n\n\n\n<li><em>Nested connection thread<\/em>: Active in nested, repeater, or embedded VPC-bridge mode. Maintains the Wayland client connection to the parent compositor, receives output geometry, keyboard map, and VPC notifications, and posts them into the compositor context.<\/li>\n\n\n\n<li><strong>Synchronization<\/strong>: A recursive pthread mutex (<code>ctx-&gt;mutex<\/code>) protects the compositor context and surface\/client maps. A mutex and condition variable pair (<code>ncStartedMutex<\/code>, <code>ncStartedCond<\/code>) synchronizes the start of the nested connection thread with the compositor thread startup. The master embedded compositor uses a separate global mutex (<code>g_mutexMasterEmbedded<\/code>).<\/li>\n\n\n\n<li><strong>Async \/ Event Dispatch<\/strong>: Input injection APIs append to the fixed 64-entry <code>WstCompositor::eventQueue<\/code>, indexed by <code>eventIndex<\/code>; <code>wstCompositorProcessEvents<\/code> drains the batch and resets the index. It dispatches each event type to the matching handler (<code>wstProcessKeyEvent<\/code>, <code>wstProcessPointerMoveEvent<\/code>, <code>wstProcessTouchDownEvent<\/code>, etc.).<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Prerequisites and Dependencies<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">Platform and Integration Requirements<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Build Dependencies<\/strong>: <code>wayland-client<\/code> (\u22651.6.0), <code>wayland-server<\/code> (\u22651.6.0), <code>wayland-egl<\/code>, <code>libxkbcommon<\/code> (\u22650.4), <code>EGL<\/code>, <code>GLESv2<\/code>, <code>glib-2.0<\/code> (\u22652.22.5), <code>gstreamer-1.0<\/code> (\u22651.0), <code>virtual\/westeros-soc<\/code> (SOC render module), <code>westeros-simplebuffer<\/code>, <code>westeros-simpleshell<\/code>, <code>wayland-native<\/code> (for protocol scanner at build time). <code>wayland-protocols<\/code> is required when the <code>explicit-sync<\/code> PACKAGECONFIG is enabled; <code>libdrm<\/code> headers are required when <code>incldbprotocol<\/code> is enabled.<\/li>\n\n\n\n<li><strong>Device Services \/ HAL<\/strong>: Vendor-specific rendering is provided by the <code>virtual\/westeros-soc<\/code> recipe, resolved at build time to a platform renderer module. The module exports a <code>renderer_init<\/code> symbol and populates the <code>WstRenderer<\/code> function table covering <code>renderTerm<\/code>, <code>updateScene<\/code>, <code>surfaceCreate<\/code>, <code>surfaceDestroy<\/code>, <code>surfaceCommit<\/code>, <code>surfaceSetVisible<\/code>, <code>surfaceGetVisible<\/code>, <code>surfaceSetGeometry<\/code>, <code>surfaceGetGeometry<\/code>, <code>surfaceSetOpacity<\/code>, <code>surfaceGetOpacity<\/code>, <code>surfaceSetZOrder<\/code>, <code>surfaceGetZOrder<\/code>, <code>surfaceSetCrop<\/code>, and <code>holePunch<\/code>.<\/li>\n\n\n\n<li><strong>Systemd Services<\/strong>: The <code>westeros.service<\/code> unit sources <code>\/etc\/default\/westeros-env<\/code> and executes <code>\/usr\/bin\/westeros-init<\/code>. The init script waits up to 60 seconds for <code>XDG_RUNTIME_DIR<\/code> to be mounted before launching the compositor.<\/li>\n\n\n\n<li><strong>Configuration Files<\/strong>: Runtime configuration is supplied through <code>\/etc\/default\/westeros-env<\/code>, sourced by the systemd service unit.<\/li>\n\n\n\n<li><strong>Startup Order<\/strong>: <code>RequiresMountsFor=\/run<\/code> in <code>westeros.service<\/code>; <code>WantedBy=multi-user.target<\/code>.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Component State Flow<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">Initialization to Active State<\/h4>\n\n\n\n<p>The compositor transitions through the following states during its lifecycle: <strong>Uninitialized<\/strong> (before <code>WstCompositorCreate<\/code>) \u2192 <strong>Configured<\/strong> (<code>WstCompositorSet*<\/code> calls establish display name, renderer module, frame rate, and mode flags) \u2192 <strong>Starting<\/strong> (<code>WstCompositorStart<\/code> spawns the compositor thread) \u2192 <strong>Ready<\/strong> (the compositor thread has created the Wayland display, seat, output, and shell globals; embedded mode initializes its renderer immediately after this signal in <code>WstCompositorStart<\/code>) \u2192 <strong>Active<\/strong> (the compositor thread runs the event loop, accepting client connections and generating frames) \u2192 <strong>Shutdown<\/strong> (<code>WstCompositorStop<\/code> signals the compositor thread to exit, renderer and seat resources are released).<\/p>\n\n\n\n<div class=\"wp-block-merpress-mermaidjs diagram-source-mermaid\"><pre class=\"mermaid\">sequenceDiagram\n    participant App as Host Application\n    participant Comp as WstCompositor API\n    participant CThread as Compositor Thread\n    participant Renderer as Renderer Module\n    participant XKB as libxkbcommon\n\n    App->>Comp: WstCompositorCreate()\n    App->>Comp: WstCompositorSetRendererModule()\n    App->>Comp: WstCompositorSetDisplayName()\n    App->>Comp: WstCompositorSetFrameRate()\n    App->>Comp: WstCompositorStart()\n    Comp->>CThread: pthread_create wstCompositorThread\n    CThread->>XKB: xkb_context_new and xkb_keymap_new_from_names\n    XKB-->>CThread: keymap ready\n    CThread->>Renderer: dlopen and renderer_init\n    Renderer-->>CThread: WstRenderer function table populated\n    CThread->>CThread: wl_display_create and register globals\n    CThread->>CThread: wstSeatInit wstOutputInit wstShmInit\n    CThread-->>Comp: compositorReady = true\n    Comp-->>App: WstCompositorStart returns true\n\n    loop Frame Loop\n        CThread->>CThread: wl_display_flush_clients\n        CThread->>Renderer: updateScene\n    end\n\n    App->>Comp: WstCompositorStop()\n    CThread->>Renderer: renderTerm\n    CThread->>CThread: wstSeatTerm wstOutputTerm\n    CThread-->>Comp: thread exits<\/pre><\/div>\n\n\n\n<h4 class=\"wp-block-heading\">Runtime State Changes<\/h4>\n\n\n\n<p><strong>State Change Triggers:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Output Size Change<\/strong>: <code>WstCompositorSetOutputSize<\/code> or <code>WstCompositorResolutionChangeEnd<\/code> set <code>outputSizeChanged<\/code> flags; the compositor thread calls <code>wstOutputChangeSize<\/code> on its next iteration, updating all clients with a new <code>wl_output.mode<\/code> event.<\/li>\n\n\n\n<li><strong>Nested Connection Loss<\/strong>: When the nested connection thread detects that the parent compositor has disconnected, it terminates the local Wayland display and invokes the configured termination callback; the compositor thread then exits its event loop and releases resources.<\/li>\n\n\n\n<li><strong>First Frame Notification<\/strong>: During embedded composition, after a non-hidden scene containing a client&#8217;s committed buffer is composed, <code>clientStatusCB<\/code> is invoked with <code>WstClient_firstFrame<\/code> once for that client PID.<\/li>\n<\/ul>\n\n\n\n<p><strong>Context Switching Scenarios:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>When operating as a nested compositor, output geometry or keyboard map changes from the parent compositor propagate into the local compositor context and are forwarded to all connected clients.<\/li>\n\n\n\n<li>In embedded mode, the host application controls composition timing by calling <code>WstCompositorComposeEmbedded<\/code> directly.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Call Flows<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">Initialization Call Flow<\/h4>\n\n\n\n<div class=\"wp-block-merpress-mermaidjs diagram-source-mermaid\"><pre class=\"mermaid\">sequenceDiagram\n    participant App as Host Application\n    participant API as WstCompositor API\n    participant CThread as Compositor Thread\n    participant Renderer as Renderer Module\n    participant WlDisplay as wl_display\n\n    App->>API: WstCompositorCreate()\n    App->>API: WstCompositorSet display renderer framerate mode\n    App->>API: WstCompositorStart()\n    API->>CThread: pthread_create\n    CThread->>WlDisplay: wl_display_create()\n    CThread->>WlDisplay: register globals wl_compositor wl_shm wl_seat wl_output xdg_shell wl_simple_shell vpc\n    CThread->>Renderer: dlopen rendererModule and renderer_init\n    Renderer-->>CThread: WstRenderer function table\n    CThread->>CThread: wstSeatInit wstOutputInit wstShmInit\n    CThread-->>API: compositorReady = true\n    API-->>App: WstCompositorStart returns true<\/pre><\/div>\n\n\n\n<h4 class=\"wp-block-heading\">Request Processing Call Flow<\/h4>\n\n\n\n<p>Surface buffer rendering is the primary runtime operation. A Wayland client attaches a buffer to its surface and issues a commit. The compositor thread receives the commit, passes the buffer to the renderer module for upload or import, schedules a repaint, and on the next frame tick calls the renderer&#8217;s <code>updateScene<\/code> to produce the composited output.<\/p>\n\n\n\n<div class=\"wp-block-merpress-mermaidjs diagram-source-mermaid\"><pre class=\"mermaid\">sequenceDiagram\n    participant WlClient as Wayland Client\n    participant CThread as Compositor Thread\n    participant Renderer as Renderer Module\n    participant SOC as Vendor SOC Layer\n\n    WlClient->>CThread: wl_surface.attach buffer\n    WlClient->>CThread: wl_surface.commit\n    CThread->>CThread: wstISurfaceCommit update WstSurface state\n    CThread->>Renderer: surfaceCommit surface bufferResource\n    Renderer->>SOC: import or upload buffer via EGL or DMA-buf\n    SOC-->>Renderer: texture or buffer handle\n    CThread->>CThread: wstCompositorScheduleRepaint\n    Note over CThread: next frame tick\n    CThread->>Renderer: updateScene\n    Renderer->>SOC: draw surfaces via GLES2 or HW overlay\n    CThread->>WlClient: frame callback done<\/pre><\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Internal Modules<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Module \/ Class<\/th><th>Description<\/th><th>Key Files<\/th><\/tr><\/thead><tbody><tr><td><code>WstCompositor<\/code><\/td><td>Public API handle. Holds per-instance output dimensions, keyboard\/pointer\/touch objects, client status callbacks, and the 64-entry event queue. Each virtual embedded instance has its own <code>WstCompositor<\/code> sharing a single <code>WstContext<\/code>.<\/td><td><code>westeros-compositor.cpp<\/code>, <code>westeros-compositor.h<\/code><\/td><\/tr><tr><td><code>WstContext<\/code><\/td><td>Internal compositor context. Owns the <code>wl_display<\/code>, compositor thread, renderer module, seat, output, surface maps, nested connection, and all Wayland global objects. One <code>WstContext<\/code> per non-virtual compositor instance.<\/td><td><code>westeros-compositor.cpp<\/code><\/td><\/tr><tr><td><code>WstRenderer<\/code><\/td><td>Pluggable rendering interface. Loaded at runtime via <code>dlopen<\/code>; the module exports <code>renderer_init<\/code> to populate a function table of surface and scene operations. Two built-in modules are provided: a GLES2 GL renderer and an embedded renderer.<\/td><td><code>westeros-render.h<\/code>, <code>westeros-render-gl.cpp<\/code>, <code>westeros-render-embedded.cpp<\/code><\/td><\/tr><tr><td><code>WstNestedConnection<\/code><\/td><td>Manages the Wayland client connection to a parent compositor in nested or repeater mode. Runs on a dedicated thread. Receives output, keyboard, and VPC events from the parent and delivers them via callbacks into the compositor context.<\/td><td><code>westeros-nested.h<\/code>, <code>westeros-nested.cpp<\/code><\/td><\/tr><tr><td><code>WstSurface<\/code><\/td><td>Per-surface state: position, size, opacity, z-order, attached buffer resource, frame callback list, and explicit-sync fences. Maintains a reference to its <code>WstRenderSurface<\/code> within the renderer and to any associated <code>WstVpcSurface<\/code>.<\/td><td><code>westeros-compositor.cpp<\/code><\/td><\/tr><tr><td><code>WstSeat \/ WstKeyboard \/ WstPointer \/ WstTouch<\/code><\/td><td>Input seat abstraction. Tracks focused surfaces, current keyboard modifiers via libxkbcommon <code>xkb_state<\/code>, and pointer position. Dispatches Wayland seat events to client resources.<\/td><td><code>westeros-compositor.cpp<\/code><\/td><\/tr><tr><td><code>WstSimpleShell<\/code><\/td><td>Server implementation of the <code>wl_simple_shell<\/code> protocol. Allows privileged clients to set surface name, visibility, geometry, opacity, z-order, scale, and focus by surface ID, and to receive creation\/destruction broadcast notifications.<\/td><td><code>simpleshell\/westeros-simpleshell.cpp<\/code>, <code>simpleshell\/westeros-simpleshell.h<\/code><\/td><\/tr><tr><td><code>WstVpcSurface<\/code><\/td><td>Tracks the video path control state for a surface (hardware path vs. graphics path) and the position\/scale transform communicated to the compositor chain via the <code>vpc<\/code> protocol.<\/td><td><code>westeros-compositor.cpp<\/code><\/td><\/tr><tr><td><code>WstLinuxDmabuf<\/code><\/td><td>Protocol module implementing <code>zwp_linux_dmabuf_v1<\/code>. Handles multi-plane DMA-buf buffer import with format and modifier negotiation between client and renderer.<\/td><td><code>linux-dmabuf\/westeros-linux-dmabuf.cpp<\/code>, <code>linux-dmabuf\/westeros-linux-dmabuf.h<\/code><\/td><\/tr><tr><td><code>WstLinuxExpSync<\/code><\/td><td>Protocol module implementing <code>linux_explicit_synchronization_unstable_v1<\/code>. Manages per-surface acquire fence descriptors and buffer release fence signalling between client and renderer.<\/td><td><code>linux-expsync\/westeros-linux-expsync.cpp<\/code>, <code>linux-expsync\/westeros-linux-expsync.h<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Component Interactions<\/h2>\n\n\n\n<p>Westeros operates as a self-contained Wayland display server. Northbound communication is entirely via the Wayland socket protocol; southbound communication is via the renderer module&#8217;s function table.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Interaction Matrix<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Target Component \/ Layer<\/th><th>Interaction Purpose<\/th><th>Key APIs \/ Topics<\/th><\/tr><\/thead><tbody><tr><td><strong>Wayland Clients<\/strong><\/td><td><\/td><td><\/td><\/tr><tr><td>UI \/ App Runtimes<\/td><td>Surface creation, buffer submission, input reception<\/td><td><code>wl_compositor<\/code>, <code>wl_surface<\/code>, <code>wl_seat<\/code>, <code>xdg_shell<\/code>, <code>wl_simple_shell<\/code>, <code>vpc<\/code><\/td><\/tr><tr><td>Media \/ Video Clients<\/td><td>Video path and position negotiation<\/td><td><code>vpc_surface.set_geometry<\/code>, <code>vpc_surface.video_path_change<\/code><\/td><\/tr><tr><td><strong>Renderer Module \/ HAL<\/strong><\/td><td><\/td><td><\/td><\/tr><tr><td><code>virtual\/westeros-soc<\/code> renderer<\/td><td>Compositing surfaces to display output<\/td><td><code>renderer_init()<\/code>, <code>surfaceCommit()<\/code>, <code>updateScene()<\/code>, <code>surfaceSetGeometry()<\/code>, <code>surfaceSetZOrder()<\/code>, <code>holePunch()<\/code><\/td><\/tr><tr><td>EGL \/ GLES2 \/ DMA-buf<\/td><td>GPU buffer import and rendering<\/td><td><code>eglBindWaylandDisplayWL<\/code>, <code>eglQueryWaylandBufferWL<\/code>, <code>WstLDBBufferGet*<\/code><\/td><\/tr><tr><td><strong>System<\/strong><\/td><td><\/td><td><\/td><\/tr><tr><td>libxkbcommon<\/td><td>Keyboard layout and modifier state management<\/td><td><code>xkb_context_new<\/code>, <code>xkb_keymap_new_from_names<\/code>, <code>xkb_state_new<\/code>, <code>xkb_state_update_mask<\/code><\/td><\/tr><tr><td>Wayland display socket<\/td><td>Inter-process communication with compositor clients<\/td><td><code>wl_display_create<\/code>, <code>wl_display_add_socket<\/code>, <code>wl_display_run<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Events Published<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Event Name<\/th><th>Wayland Topic<\/th><th>Trigger Condition<\/th><th>Subscriber<\/th><\/tr><\/thead><tbody><tr><td><code>output.mode<\/code><\/td><td><code>wl_output<\/code><\/td><td>Output size changes via <code>WstCompositorResolutionChangeEnd<\/code><\/td><td>All connected Wayland clients<\/td><\/tr><tr><td><code>keyboard.keymap<\/code><\/td><td><code>wl_keyboard<\/code><\/td><td>Compositor start or nested keymap update from parent<\/td><td>Clients with keyboard focus<\/td><\/tr><tr><td><code>keyboard.key<\/code> \/ <code>keyboard.modifiers<\/code><\/td><td><code>wl_keyboard<\/code><\/td><td>Key event injected via <code>WstCompositorKeyEvent<\/code><\/td><td>Client with keyboard focus<\/td><\/tr><tr><td><code>pointer.motion<\/code> \/ <code>pointer.button<\/code><\/td><td><code>wl_pointer<\/code><\/td><td>Pointer event injected via <code>WstCompositorPointerMoveEvent<\/code> \/ <code>WstCompositorPointerButtonEvent<\/code><\/td><td>Client under pointer<\/td><\/tr><tr><td><code>touch.down<\/code> \/ <code>touch.up<\/code> \/ <code>touch.motion<\/code><\/td><td><code>wl_touch<\/code><\/td><td>Touch event injected via <code>WstCompositorTouchEvent<\/code><\/td><td>Client with touch focus<\/td><\/tr><tr><td><code>shell_surface.created<\/code> \/ <code>shell_surface.destroyed<\/code><\/td><td><code>wl_simple_shell<\/code><\/td><td>Surface created or destroyed on the display<\/td><td>All <code>wl_simple_shell<\/code> bound clients<\/td><\/tr><tr><td><code>vpc_surface.video_path_change<\/code><\/td><td><code>vpc<\/code><\/td><td>Video surface changes path via <code>wstDefaultNestedVpcVideoPathChange<\/code><\/td><td>VPC-bound client surfaces<\/td><\/tr><tr><td><code>frame<\/code> callback<\/td><td><code>wl_callback<\/code><\/td><td>Frame composition completed<\/td><td>Wayland clients that requested frame callback<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">IPC Flow Patterns<\/h3>\n\n\n\n<p><strong>Primary Surface Commit Flow:<\/strong><\/p>\n\n\n\n<p>Clients communicate with Westeros over the Wayland socket. Westeros validates the buffer resource type (shm, EGL Wayland buffer, DMA-buf, or simple-buffer) at commit time and dispatches to the renderer for import. Buffer sharing is mediated through the Wayland shm pool mechanism and the enabled buffer protocol extensions.<\/p>\n\n\n\n<div class=\"wp-block-merpress-mermaidjs diagram-source-mermaid\"><pre class=\"mermaid\">sequenceDiagram\n    participant Client as Wayland Client\n    participant WlServer as wl_display Westeros\n    participant Comp as Compositor Thread\n    participant Renderer as Renderer Module\n\n    Client->>WlServer: wl_surface.attach buffer\n    Client->>WlServer: wl_surface.commit\n    WlServer->>Comp: wstISurfaceCommit dispatch\n    Comp->>Renderer: surfaceCommit surface bufferResource\n    Renderer-->>Comp: buffer imported\n    Comp-->>WlServer: schedule repaint\n    WlServer-->>Client: frame callback on next vsync<\/pre><\/div>\n\n\n\n<p><strong>VPC Video Path Control Flow:<\/strong><\/p>\n\n\n\n<div class=\"wp-block-merpress-mermaidjs diagram-source-mermaid\"><pre class=\"mermaid\">sequenceDiagram\n    participant VideoClient as Video Client\n    participant Comp as Compositor Thread\n    participant ParentComp as Parent Compositor nested\n\n    VideoClient->>Comp: vpc_surface.set_geometry x y w h\n    Comp->>Comp: update WstVpcSurface transform\n    Comp->>ParentComp: forward vpc xform via nested connection\n    ParentComp-->>Comp: vpc video_path_change event\n    Comp->>VideoClient: vpc_surface.video_path_change notification<\/pre><\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Implementation Details<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Major HAL APIs Integration<\/h3>\n\n\n\n<p>The HAL boundary for Westeros is the renderer module interface. All functions below are called through the <code>WstRenderer<\/code> function pointer table populated by the renderer module&#8217;s <code>renderer_init<\/code> entry point.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Renderer Module API<\/th><th>Purpose<\/th><th>Implementation File<\/th><\/tr><\/thead><tbody><tr><td><code>renderer_init()<\/code><\/td><td>Entry point called after <code>dlopen<\/code>; populates the <code>WstRenderer<\/code> function table<\/td><td><code>westeros-render-gl.cpp<\/code>, <code>westeros-render-embedded.cpp<\/code><\/td><\/tr><tr><td><code>surfaceCreate()<\/code><\/td><td>Allocates a per-surface render object (<code>WstRenderSurface<\/code>) within the renderer<\/td><td><code>westeros-render-gl.cpp<\/code><\/td><\/tr><tr><td><code>surfaceCommit()<\/code><\/td><td>Imports or uploads the Wayland client buffer into the renderer (EGL Wayland buffer, DMA-buf, or shm)<\/td><td><code>westeros-render-gl.cpp<\/code>, <code>westeros-render-embedded.cpp<\/code><\/td><\/tr><tr><td><code>surfaceImportSync()<\/code><\/td><td>Imports the explicit sync fence for a surface buffer commit<\/td><td><code>westeros-render-gl.cpp<\/code><\/td><\/tr><tr><td><code>surfaceSetGeometry()<\/code><\/td><td>Sets the position and dimensions of a surface for the next scene update<\/td><td><code>westeros-render-gl.cpp<\/code>, <code>westeros-render-embedded.cpp<\/code><\/td><\/tr><tr><td><code>surfaceSetZOrder()<\/code><\/td><td>Sets the rendering order of a surface<\/td><td><code>westeros-render-gl.cpp<\/code>, <code>westeros-render-embedded.cpp<\/code><\/td><\/tr><tr><td><code>surfaceSetOpacity()<\/code><\/td><td>Sets the alpha multiplier for a surface<\/td><td><code>westeros-render-gl.cpp<\/code>, <code>westeros-render-embedded.cpp<\/code><\/td><\/tr><tr><td><code>surfaceSetVisible()<\/code><\/td><td>Controls whether a surface participates in scene rendering<\/td><td><code>westeros-render-gl.cpp<\/code>, <code>westeros-render-embedded.cpp<\/code><\/td><\/tr><tr><td><code>surfaceSetCrop()<\/code><\/td><td>Sets the source crop rectangle for a surface<\/td><td><code>westeros-render-embedded.cpp<\/code><\/td><\/tr><tr><td><code>updateScene()<\/code><\/td><td>Renders all visible surfaces to the output target for the current frame<\/td><td><code>westeros-render-gl.cpp<\/code>, <code>westeros-render-embedded.cpp<\/code><\/td><\/tr><tr><td><code>holePunch()<\/code><\/td><td>Clears a screen region to allow hardware video overlay to show through<\/td><td><code>westeros-render-embedded.cpp<\/code><\/td><\/tr><tr><td><code>queryDmabufFormats()<\/code> \/ <code>queryDmabufModifiers()<\/code><\/td><td>Queries supported DMA-buf pixel formats and modifiers from the renderer<\/td><td><code>westeros-render-gl.cpp<\/code><\/td><\/tr><tr><td><code>resolutionChangeBegin()<\/code> \/ <code>resolutionChangeEnd()<\/code><\/td><td>Signals the renderer before and after an output resolution change<\/td><td><code>westeros-render-gl.cpp<\/code><\/td><\/tr><tr><td><code>renderTerm()<\/code><\/td><td>Releases all renderer resources at shutdown<\/td><td><code>westeros-render-gl.cpp<\/code>, <code>westeros-render-embedded.cpp<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Key Implementation Logic<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>State \/ Lifecycle Management<\/strong>: All compositor state is held in <code>WstContext<\/code> (heap-allocated, one per compositor instance). <code>WstCompositorCreate<\/code> allocates and zero-initialises both <code>WstContext<\/code> and <code>WstCompositor<\/code>, sets default frame rate (60 fps), default output size (1280\u00d7720), and default keymap (evdev\/pc105\/us). <code>WstCompositorStart<\/code> spawns the compositor thread; <code>WstCompositorStop<\/code> sets <code>ctx-&gt;running = false<\/code> and joins the thread.<\/li>\n\n\n\n<li>Core lifecycle: <code>westeros-compositor.cpp<\/code> \u2014 <code>WstCompositorCreate<\/code>, <code>WstCompositorStart<\/code>, <code>WstCompositorStop<\/code>, <code>WstCompositorDestroy<\/code><\/li>\n\n\n\n<li>Compositor thread body: <code>westeros-compositor.cpp<\/code> \u2014 <code>wstCompositorThread<\/code><\/li>\n\n\n\n<li><strong>Event Processing<\/strong>: Input events injected by the host application are written into <code>WstCompositor::eventQueue[WST_EVENT_QUEUE_SIZE]<\/code> (64 entries, a fixed batch indexed by <code>eventIndex<\/code>). The compositor thread calls <code>wstCompositorProcessEvents<\/code> on each loop iteration, draining the queue and dispatching each event type to the matching handler (<code>wstProcessKeyEvent<\/code>, <code>wstProcessPointerMoveEvent<\/code>, <code>wstProcessTouchDownEvent<\/code>, etc.). Each handler locates the appropriate focused surface via <code>WstKeyboard::focus<\/code>, <code>WstPointer::focus<\/code>, or <code>WstTouch::focus<\/code> and sends the corresponding Wayland protocol event to the client&#8217;s resource list.<\/li>\n\n\n\n<li><strong>Error Handling Strategy<\/strong>: API functions return <code>bool<\/code> (true on success). On failure, a descriptive string is stored in <code>WstCompositor::lastErrorDetail<\/code> and retrieved with <code>WstCompositorGetLastErrorDetail<\/code>. Renderer <code>dlopen<\/code> and <code>renderer_init<\/code> failures abort <code>WstCompositorStart<\/code>. Nested connection loss sets <code>compositorAborted<\/code>, which terminates the compositor thread cleanly.<\/li>\n\n\n\n<li><strong>Logging &amp; Diagnostics<\/strong>: The internal <code>wstLog(level, fmt, ...)<\/code> function writes to <code>stderr<\/code>. Verbosity is controlled at startup by the <code>WESTEROS_DEBUG<\/code> environment variable (integer 0\u20136, default 3). Log prefixes are <code>Westeros Fatal<\/code> (0), <code>Westeros Error<\/code> (0), <code>Westeros Warning<\/code> (1), <code>Westeros Info<\/code> (2), <code>Westeros Debug<\/code> (3), and <code>Westeros Trace<\/code> (4\u20136).<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Configuration<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Key Configuration Parameters<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Parameter<\/th><th>Type<\/th><th>Default<\/th><th>Description<\/th><\/tr><\/thead><tbody><tr><td><code>WESTEROS_DEBUG<\/code><\/td><td>int<\/td><td><code>3<\/code><\/td><td>Log verbosity level (0 = fatal\/error only, 3 = info and debug, 6 = full trace). Read once at <code>WstCompositorCreate<\/code>.<\/td><\/tr><tr><td><code>WAYLAND_DISPLAY<\/code><\/td><td>string<\/td><td><code>wayland-0<\/code><\/td><td>Name of the Wayland socket created by the compositor, set in <code>westeros-init<\/code> before launch.<\/td><\/tr><tr><td><code>XDG_RUNTIME_DIR<\/code><\/td><td>string<\/td><td><code>\/run<\/code><\/td><td>Directory used for the Wayland socket file. <code>westeros-init<\/code> waits up to 60 seconds for this path to become available.<\/td><\/tr><tr><td><code>WESTEROS_GL_MODE<\/code><\/td><td>string<\/td><td>\u2014<\/td><td>Output mode string (e.g., <code>3840x2160x60<\/code>) passed to the GL renderer module for display mode selection.<\/td><\/tr><tr><td><code>WESTEROS_GL_GRAPHICS_MAX_SIZE<\/code><\/td><td>string<\/td><td>\u2014<\/td><td>Maximum graphics plane size (e.g., <code>1920x1080<\/code>) passed to the GL renderer module.<\/td><\/tr><tr><td><code>WESTEROS_GL_USE_REFRESH_LOCK<\/code><\/td><td>int<\/td><td>\u2014<\/td><td>When set to <code>1<\/code>, instructs the GL renderer to synchronise frame generation to display refresh.<\/td><\/tr><tr><td><code>WESTEROS_VPC_BRIDGE<\/code><\/td><td>string<\/td><td>\u2014<\/td><td>Display name of a compositor to establish a VPC bridge with, used by embedded compositors.<\/td><\/tr><tr><td><code>WESTEROS_RENDER_GL_FPS<\/code><\/td><td>\u2014<\/td><td>\u2014<\/td><td>Enables frame-rate reporting in the GL renderer module.<\/td><\/tr><tr><td><code>WESTEROS_FAST_RENDER<\/code><\/td><td>string<\/td><td>\u2014<\/td><td>For embedded composition, names a fast-render shared library implementing <code>delegateUpdateScene<\/code>.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Runtime Configuration<\/h3>\n\n\n\n<p>The <code>westeros-init<\/code> script selects the renderer module before launching the compositor. Its <code>RENDERER<\/code> assignment overrides any value from <code>\/etc\/default\/westeros-env<\/code>, so change the init script or invoke <code>westeros<\/code> directly when selecting a renderer.<\/p>\n\n\n\n<p>To apply supported environment-file changes:<\/p>\n\n\n\n<p>systemctl restart westeros<\/p>\n\n\n\n<p>The frame rate and display name can also be passed on the command line when invoking the <code>westeros<\/code> binary directly:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">westeros --renderer \/usr\/lib\/libwesteros_render_gl.so.0 --framerate 60 --display wayland-0<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Westeros is a lightweight Wayland compositor library that enables applications to create one or more [&hellip;]<\/p>\n","protected":false},"author":28,"featured_media":0,"parent":9844,"menu_order":29,"comment_status":"open","ping_status":"closed","template":"","meta":{"_bbp_topic_count":0,"_bbp_reply_count":0,"_bbp_total_topic_count":0,"_bbp_total_reply_count":0,"_bbp_voice_count":0,"_bbp_anonymous_reply_count":0,"_bbp_topic_count_hidden":0,"_bbp_reply_count_hidden":0,"_bbp_forum_subforum_count":0,"footnotes":""},"class_list":["post-9987","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v24.9 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Westeros - RDK Documentation Portal | Documentation<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_video_documentation\/components\/westeros\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Westeros - RDK Documentation Portal | Documentation\" \/>\n<meta property=\"og:description\" content=\"Westeros is a lightweight Wayland compositor library that enables applications to create one or more [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_video_documentation\/components\/westeros\/\" \/>\n<meta property=\"og:site_name\" content=\"RDK Documentation Portal | Documentation\" \/>\n<meta property=\"article:modified_time\" content=\"2026-09-22T06:12:22+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"11 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_video_documentation\/components\/westeros\/\",\"url\":\"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_video_documentation\/components\/westeros\/\",\"name\":\"Westeros - RDK Documentation Portal | Documentation\",\"isPartOf\":{\"@id\":\"https:\/\/developer.rdkcentral.com\/documentation\/#website\"},\"datePublished\":\"2022-06-21T09:10:37+00:00\",\"dateModified\":\"2026-09-22T06:12:22+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_video_documentation\/components\/westeros\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_video_documentation\/components\/westeros\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_video_documentation\/components\/westeros\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/developer.rdkcentral.com\/documentation\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Documentation\",\"item\":\"https:\/\/developer.rdkcentral.com\/documentation\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"RDK Video\",\"item\":\"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_video_documentation\/\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"Components\",\"item\":\"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_video_documentation\/components\/\"},{\"@type\":\"ListItem\",\"position\":5,\"name\":\"Westeros\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/developer.rdkcentral.com\/documentation\/#website\",\"url\":\"https:\/\/developer.rdkcentral.com\/documentation\/\",\"name\":\"RDK Documentation Portal | Documentation\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/developer.rdkcentral.com\/documentation\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Westeros - RDK Documentation Portal | Documentation","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_video_documentation\/components\/westeros\/","og_locale":"en_US","og_type":"article","og_title":"Westeros - RDK Documentation Portal | Documentation","og_description":"Westeros is a lightweight Wayland compositor library that enables applications to create one or more [&hellip;]","og_url":"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_video_documentation\/components\/westeros\/","og_site_name":"RDK Documentation Portal | Documentation","article_modified_time":"2026-09-22T06:12:22+00:00","twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"11 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_video_documentation\/components\/westeros\/","url":"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_video_documentation\/components\/westeros\/","name":"Westeros - RDK Documentation Portal | Documentation","isPartOf":{"@id":"https:\/\/developer.rdkcentral.com\/documentation\/#website"},"datePublished":"2022-06-21T09:10:37+00:00","dateModified":"2026-09-22T06:12:22+00:00","breadcrumb":{"@id":"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_video_documentation\/components\/westeros\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_video_documentation\/components\/westeros\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_video_documentation\/components\/westeros\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/developer.rdkcentral.com\/documentation\/"},{"@type":"ListItem","position":2,"name":"Documentation","item":"https:\/\/developer.rdkcentral.com\/documentation\/"},{"@type":"ListItem","position":3,"name":"RDK Video","item":"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_video_documentation\/"},{"@type":"ListItem","position":4,"name":"Components","item":"https:\/\/developer.rdkcentral.com\/documentation\/documentation\/rdk_video_documentation\/components\/"},{"@type":"ListItem","position":5,"name":"Westeros"}]},{"@type":"WebSite","@id":"https:\/\/developer.rdkcentral.com\/documentation\/#website","url":"https:\/\/developer.rdkcentral.com\/documentation\/","name":"RDK Documentation Portal | Documentation","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/developer.rdkcentral.com\/documentation\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"}]}},"_links":{"self":[{"href":"https:\/\/developer.rdkcentral.com\/documentation\/wp-json\/wp\/v2\/pages\/9987","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/developer.rdkcentral.com\/documentation\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/developer.rdkcentral.com\/documentation\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/developer.rdkcentral.com\/documentation\/wp-json\/wp\/v2\/users\/28"}],"replies":[{"embeddable":true,"href":"https:\/\/developer.rdkcentral.com\/documentation\/wp-json\/wp\/v2\/comments?post=9987"}],"version-history":[{"count":4,"href":"https:\/\/developer.rdkcentral.com\/documentation\/wp-json\/wp\/v2\/pages\/9987\/revisions"}],"predecessor-version":[{"id":13039,"href":"https:\/\/developer.rdkcentral.com\/documentation\/wp-json\/wp\/v2\/pages\/9987\/revisions\/13039"}],"up":[{"embeddable":true,"href":"https:\/\/developer.rdkcentral.com\/documentation\/wp-json\/wp\/v2\/pages\/9844"}],"wp:attachment":[{"href":"https:\/\/developer.rdkcentral.com\/documentation\/wp-json\/wp\/v2\/media?parent=9987"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}