Making a Recalbox theme

45 pages · 8 sections
FRENESDE Show everything Create my theme

⚠️ The most important rule

Why your component does not show up.

This is the cause of “I placed my image and I can't see it”.

A view only draws two things:

  1. its reserved components, which it builds itself;
  2. the components marked extra="true".

A free component without extra never shows up.

extra="true" → drawn your component without extra → invisible nothing the engine only draws its reserved components + those marked extra
<view name="system">
  <image name="mon-decor" extra="true">      <!-- ✅ shows -->
    <path>${root}/data/arts/decor.png</path>
  </image>

  <image name="autre-decor">                  <!-- ❌ invisible -->
    <path>${root}/data/arts/decor.png</path>
  </image>
</view>

The other, equivalent way is to group them:

<view name="system">
  <extras>
    <image name="mon-decor"> … </image>
    <text name="ma-legende"> … </text>
  </extras>
</view>

Only SIX types can be placed freely

The free-component factory only knows how to build these:

✅ Usable as extra❌ Refused
image · box · video · text · scrolltext · markdowntextlist · carousel · datetime · rating · sound · helpsystem · keyboard · container · ninepatch · all the menu*

A refused type writes Extra type unknown: Rating to the log and nothing is drawn.

➡️ rating, datetime, textlist and carousel are only used under their reserved name, in a view that expects them. You cannot add a second rating or a second list.

➡️ ninepatch has no reserved name anywhere: refused as a free component, and no view builds it. It is therefore unusable in practice, despite being present in the engine.

➡️ container is not placed either, but it is not useless: the engine applies it on top of another component. In the game list, md_description declared as a <text> also sets the scrolling frame around it — pos, size and zIndex go to the frame, the rest to the text. You never write it yourself.

Three other limits

The exception

helpsystem keeps working even written inside an <extras> block: the view finds it back by its name. The log warning has no consequence.