Driving My TV Player with an Xbox controller

Every button that appears in the hint bar does something, and every button that does something appears in the hint bar. That rule is the whole map.

The bar along the bottom of the screen is not decoration, and it is not a tutorial you outgrow. It is generated from the code that handles the buttons, so it can only ever show buttons that do something, and it changes as focus moves. Learn to read it and you have learned the app.

The rule behind that is worth stating plainly: a hint with nothing wired to it is a defect. All 4 face buttons, both bumpers, both triggers and the 2 menu buttons follow it. When the Home mockups sketched a reminder toggle and no reminder service existed to receive it, the hint was left out rather than shown as a button that does nothing.

The four face buttons

A acts on what is focused. Watch a channel, open a title, resume an episode, apply a filter. The label says which, and on a title with a resume point it reads Resume rather than Open.

B goes back, and on the top-level screens it opens app navigation instead of exiting. That matters on a console: B is the button your thumb finds when you are lost, so it never dead-ends.

X is the contextual verb, and it is almost always Favorite. It names the state the press will produce, so it reads Favorite on something unfavorited and Remove favorite on something already saved. On the search results zone it stays visible even over a group row where favoriting is a no-op, because a hint that appeared and vanished as focus crossed item kinds would read as the bar flinching rather than as a rule.

Y is search, from anywhere. This is the 1 thing most worth memorising. Search is registered on the shell rather than on a page, so Y works in every zone of every screen and returns you to wherever you pressed it. That is also why no destination advertises Y once you are inside search. It is what brought you there.

Shoulders, triggers and the two menu buttons

LB and RB page. What a page means depends on where you are: sections on the Home rails, groups on the Live TV strip, a screenful in a poster grid, a day in the schedule. The bar always says which.

LT and RT jump by initial letter, and only where that means something. On an A to Z sorted list they walk the alphabet. On a search result set, ordered by relevance rather than by name, there is no trigger hint at all, because a jump-letter hint over an unordered list would be a promise the list cannot keep.

This pair is the difference between usable and unusable on a real catalogue. Measured in the prototype: crossing all 373 rows of a category list takes 42 presses of RB, walking every initial in the A to Z sort takes 20 presses of RT, and 14 presses cover every initial of a 4,000 title category in the grid. I did not expect paging a screenful at a time to lose to the triggers by more than a factor of 2.

Menu opens options, and on the catalogue surfaces it re-sorts. It is advertised by the sort currently in force rather than by the word Sort, because on those screens Menu changes what the screen means.

View is the second-opinion button: all groups, categories, refresh, live edge, keyboard. On the sign-in screen it opens network settings, a deliberate escape hatch for a console that cannot pair because it cannot reach the network.

Reading the bar instead of memorising it

Three examples of the same screen advertising different things:

Live TV, watching        A Browse channels   B Back   X Favorite   Y Search   LB/RB Groups
Live TV, channel strip   A Watch   B Back   X Favorite   Y Search   Menu Options   View Categories   LB/RB Groups
Live TV, schedule        A Watch   B Close   LB/RB Day

Same page, three focus zones, three sets. The schedule layer drops to 3 buttons because 3 is what it handles. Nothing is hidden from you. There is nothing else to press.

The corollary is the useful part. If you are wondering whether a button does something here, look at the bar. If it is not there, it does not, and you can stop trying.

The bits that are still placeholders

Saying this plainly saves controller time. Several destinations in app navigation render a placeholder screen that says so and offers B to go back: Sources, Profiles, Devices, Settings, Subscription, the standalone Guide and Reminders. Those are management surfaces, and management happens in the web console or the Windows app by design.

What is fully built on the console is the part you sit down for: Home, Live TV with its strip, categories and schedule, Movies, Shows, Search and Sport. That is 7 destinations against the 7 still placeholders.

If you use a media remote rather than a controller, the Xbox Media Remote covers which of these buttons it can reach and which it cannot. If you want the console to be the only box under the TV, turning an Xbox into a living-room TV hub is the setup piece.

What this article measured22 claims, each with the evidence behind it
ClaimEvidenceCounted
The hint bar is generated per focus zone rather than per page. One screen can advertise several different button sets depending on which part of it holds focus.n = 1Aug 31, 2026
A hint is only shown where the button is actually handled. A sketched reminder toggle was deliberately left out of the immersive Home set because no reminder service is wired to it.n = 1Aug 31, 2026
Toggle hints name the state the press will produce rather than a generic verb, so the bar and the button can never disagree. The favorite hint reads Favorite or Remove favorite depending on the focused item.n = 1Aug 31, 2026
The triggers jump by initial letter, and the hint for them appears only on surfaces that are actually sorted alphabetically. A results list is not, so search advertises no trigger hint at all.n = 1Aug 31, 2026
Measured in the interactive prototype: 42 presses of RB cross all 373 rows of a category list, 20 presses of RT walk every initial in the A to Z sort, and 14 walk every initial of a 4,000 title category in the grid.n = 1Aug 31, 2026
Directional focus navigation is mandatory on the console rather than auxiliary, and every interactive control opts into it explicitly. There is no pointer and hover affordances are disabled.n = 1Sep 1, 2026
The gamepad map is the same on both heads: a controller plugged into a PC drives the app the same way, through one shared bindings helper in the core. The only difference is whether a keyboard and mouse can override it.n = 1Sep 1, 2026
Every controller action has a documented keyboard equivalent on the desktop: Escape or Alt-Left for back, Enter for confirm, Control-F for search, arrows for volume and seek, Home for the live edge, Page Up and Page Down for channel changes.n = 7Sep 1, 2026
The shoulder buttons carry volume and mute on the console where the desktop uses arrow keys, and channel up and down where the desktop uses Page Up and Page Down.n = 2Sep 1, 2026
The Menu button is the console's equivalent of a right-click, and profile switching is reached through it rather than through a dedicated chord.n = 2Sep 1, 2026
The hint bar is a specified component rather than a loose convention: a 72 effective-pixel pill with a 12 pixel radius, full width inside the safe area, using canonical controller button colours.n = 1Sep 1, 2026
Hint sets are produced by the page's view model rather than written into each screen's markup, which is what allows them to be localized in one place.n = 1Sep 1, 2026
Focus growth has to be paid for inside the scrolling area: a poster scaled 1.06 from its bottom edge grows about 23 effective pixels upward, the lift adds 10 and the focus ring 4, and padding the clip container instead does not work.n = 1Sep 1, 2026
The console deliberately shows fewer items per row than the desktop at every surface, from 4 dashboard tiles against 6 to 7 guide rows against 12, using the same view model and a per-platform template.n = 5Sep 1, 2026
Search is laid out as an on-screen keyboard down the left with type filters beneath it and results as a poster grid that updates per character, because a console has no text field and the filters double as a browse fallback for someone who will not type.n = 1Sep 1, 2026
The category list is required to stay flat because a provider ships no hierarchy: two categories sharing a name prefix are unrelated, and the two-letter badges the desktop draws are a readability aid rather than evidence of a parent.n = 1Sep 1, 2026
Category counts are never added into a library total, because the same title appears in several categories and summing multiplies it, and a partially materialised group states what it is showing rather than printing a count it does not have.n = 1Sep 1, 2026
Two traversal costs were measured in the prototype and they differ by more than a factor of 2: 42 paging presses to cross 373 category rows, against 20 trigger presses to walk every initial in the same list.n = 2Sep 1, 2026
The group grid lays out 6 titles per row, with the directional pad moving a row, the bumpers a screenful and the triggers an initial letter.n = 1Sep 1, 2026
The groups panel is summoned with a directional press from anywhere on the page as well as by the View button, matching the behaviour of the Live TV strip.n = 1Sep 1, 2026
A page that is itself a wall of covers deliberately gets no ambient backdrop, because enlarging one poster to full screen produces a blurry wash competing with the two dozen covers in front of it.n = 1Sep 1, 2026
Search is a shell-level surface rather than a page: Y reaches it from every zone of every experience and returns to whatever pressed it, which is why no destination re-advertises Y.n = 1Aug 31, 2026