My “default” layout:
1 39 0 0 0 7 7 UIParent -146.0 21.0 -1 ##$$%/&('%)$+# 0 1 0 7 1 MainMenuBar 0.0 2.0 -1 ##$$%/&('%(#,$ 0 2 0 6 8 MainMenuBar 12.0 0.0 -1 ##$%%/&('%(#,$ 0 3 1 5 5 UIParent -5.0 -77.0 -1 #$$$%/&('%(#,$ 0 4 1 2 0 MultiBarRight -5.0 0.0 -1 #$$$%/&('%(#,$ 0 5 0 7 1 MultiBarBottomLeft 2.3 4.0 -1 ##$$%/&('%(#,$ 0 6 0 3 3 UIParent 131.3 -113.5 -1 ##$$%/&('%(#,$ 0 7 1 1 7 MultiBar6 0.0 0.0 -1 ##$$%/&('%(#,$ 0 10 0 6 0 MultiBarBottomLeft 0.0 2.0 -1 ##$$&('% 0 11 0 8 2 MultiBarBottomLeft 0.0 2.0 -1 ##$$&('%,# 0 12 0 6 0 MultiBarBottomRight 0.0 2.0 -1 ##$$&('% 1 -1 0 7 7 UIParent 0.0 215.0 -1 ##$#%# 2 -1 0 1 1 UIParent 838.0 -2.0 -1 ##$#%( 3 0 1 8 7 UIParent -300.0 250.0 -1 $#3# 3 1 0 6 7 UIParent 300.0 250.0 -1 %#3# 3 2 0 6 0 TargetFrame 0.0 40.0 -1 %## 3 3 0 0 0 UIParent 19.7 -165.3 -1 '$(#)#-#.#/#1$3# 3 4 0 0 0 UIParent 162.7 -204.8 -1 ,#-#.#/#0#1#2( 3 5 1 5 5 UIParent 0.0 0.0 -1 &#*$3# 3 6 1 5 5 UIParent 0.0 0.0 -1 -#.#/#4& 3 7 1 4 4 UIParent 0.0 0.0 -1 3# 4 -1 0 7 7 UIParent 0.0 160.7 -1 # 5 -1 0 4 4 UIParent 0.0 -237.0 -1 # 6 0 1 2 0 MinimapCluster -10.0 -10.0 -1 ##$#%#&.(()( 6 1 1 2 8 BuffFrame -13.0 -15.0 -1 ##$#%#'+(()( 7 -1 0 4 4 UIParent 0.0 452.5 -1 # 8 -1 0 6 6 UIParent 35.0 50.0 -1 #'$A%$&7 9 -1 0 8 2 MultiBarBottomRight 0.0 2.0 -1 # 10 -1 0 3 3 UIParent 167.7 209.0 -1 # 11 -1 1 8 8 UIParent -9.0 85.0 -1 # 12 -1 1 2 2 UIParent -110.0 -275.0 -1 #K$# 13 -1 1 8 8 MicroButtonAndBagsBar 0.0 0.0 -1 ##$#%)&- 14 -1 1 2 2 MicroButtonAndBagsBar 0.0 0.0 -1 ##$#%( 15 0 0 0 0 UIParent 674.5 -1064.0 -1 # 15 1 0 0 0 UIParent -1.0 -1063.0 -1 # 16 -1 1 5 5 UIParent 0.0 0.0 -1 #( 17 -1 1 1 1 UIParent 0.0 -100.0 -1 ## 18 -1 1 5 5 UIParent 0.0 0.0 -1 #- 19 -1 1 7 7 UIParent 0.0 0.0 -1 ##
How the strings work:
- First there are a pair of numbers: “1 39” in this version from December 2023, but “0 30” in a string I looked at in October 2022. My current guess is that these are version numbers of the UI system.
- Then there are “entries” for the UI elements, as described below.
Component Entries
Each entry consists of a similar set of components. Here is an example entry:
3 0 1 8 7 UIParent -300.0 250.0 -1 $#3#
We will refer to this example in the explanations below.
- Five integers (here “3 0 1 8 7”), which we designate A through E, some of which can be negative
- Integers A and B (“3 0” in our example) identify the component being described. A indicates a “group” of components and B the specific component or “item” in that group. For specific values, see below.
- In groups with more than one item, the item identifiers start at zero; but in groups with only one item, the item’s identifier is -1 rather than 0.
- Integer C … (?)
- Integers D and E (here “8 7”) specify the anchor points on the object being described (D) and on its parent (E) from which the coordinates are measured. (See below for map of anchor points.) So in this example, the coordinates are measured connecting the bottom right corner of the component relative to the bottom center point of the UIParent.
- Integers A and B (“3 0” in our example) identify the component being described. A indicates a “group” of components and B the specific component or “item” in that group. For specific values, see below.
- The name of a UI component we call the parent (in our example “UIParent”). The location of the object being described is determined by using X and Y as the coordinates between the anchor points on the object and the parent (chosen by integers D and E).
- Two coordinates X and Y (can be negative; one decimal place). In our example X = -300.0, Y = 250.0.
- A number which we designate Z. Its value always seems to be -1 and its purpose is currently unknown to us.
- The option string of the component. It usually looks like line noise, but it encodes the options selected for that component. The specific options vary by component, but the format has some common principles no matter which component (see below).
Anchor Points
The following grid shows the values for integers D and E. For example, if (D, E) = (0, 4), then the component is positioned so that its top left corner is at the true center of its parent, and then the (X, Y) coordinates are added to move it from there.
0 Top left | 1 Top center | 2 Top right |
3 Center left | 4 True center | 5 Center right |
6 Bottom left | 7 Bottom center | 8 Bottom right |
Option String Format
The exact options available for each component vary (as does the number of options), but there is a fairly consistent format for writing them. In the example above, the option string was “$#3#”. Here’s how to analyze this.
- Each character is an option, so this component has four options, and their values are encoded as “$”, “#”, “3”, and “#”.
- Now we look at each character on the ASCII table and see where it is relative to the hash sign (“#”, ASCII value 35 or 0x23). The difference from the hash sign indicates the value of that option. The hash sign is generally the “zero” or “default” value of the option.
- The first option has the dollar sign “$”, ASCII 36; therefore, this option has a value of “1” relative to the default which the hash sign would represent.
- The second and fourth options are both the hash sign, so each one is set to its zero/default value.
- The third option is the digit “3”, ASCII 51; therefore, this option has a value of “16” relative to the default (51 – 35 = 16). Thus we would know that this component has an option with a large selection of values.
Details of Components and Options
The “group” here is the value of A; the “item” is the value of B.
Group | Summary | Options | |
---|---|---|---|
0 | Action bars | ||
1 | |||
2 | Minimap cluster | ||
3 | |||
4 | |||
5 | |||
6 | |||
7 | |||
8 | |||
9 | |||
10 | |||
11 | |||
12 | |||
13 | |||
14 | |||
15 | |||
16 | |||
17 | |||
18 | |||
19 |