Performance Bottleneck with complex CLA/DCXML
I'm using mIRC 7.75 and dcxdll-3.1-git978 on Windows 11 Pro (22H2, OS Build 22621.2861 with Experience Pack 1000.22681.1000.0)
As I alluded to at the end of #77, following the update from 469 to 952/978(both were affected), I encountered a performance issue with larger CLA/DCXML structures.
Whenever I open up the interface I made, there's a long period of what appears to be sizing/margin/padding adjustments visually taking place before the interface eventually settles and can be interacted with. Below is a gif example:

Below is the test case I used to create the interface:
DCXML
<dcxml>
<!-- margin order: -->
<!-- LEFT TOP RIGHT BOTTOM -->
<dialogs>
<dialog name="interface" caption="Interface" w="1010" h="200" margin="0 0 0 0">
<control type="tab" id="id1" styles="hot gradient">
<control type="panel" caption="Tab 1" cascade="v">
<pane cascade="h">
<control type="panel" cascade="v" weight="4">
<control type="text" caption="Title 1" height="16" />
<control type="list" id="id2" styles="vsbar" margin="0 0 5 5" />
<control type="panel" height="60">
<pane cascade="h">
<control type="edit" id="id3" styles="tooltips group tabstop" />
<control type="edit" id="id4" styles="tooltips tabstop" />
</pane>
<pane cascade="h">
<control type="edit" id="id5" weight="7" styles="tooltips tabstop" />
<control type="button" id="id6" caption="Btn" weight="3" />
</pane>
<control type="button" id="id7" caption="Button" height="20" />
</control>
</control>
<control type="panel" cascade="v" weight="3">
<control type="text" caption="Title 2" height="16" />
<control type="list" id="id8" styles="vsbar" weight="5" margin="0 0 5 5" />
<control type="panel" height="40">
<pane cascade="h">
<control type="edit" id="id8" weight="7" styles="tabstop autohs" />
<control type="button" id="id9" caption="Btn" weight="3" />
</pane>
<control type="button" id="id10" caption="Button" height="20" />
</control>
</control>
<control type="panel" cascade="v" weight="5">
<control type="text" caption="Title 3" height="16" />
<control type="panel" cascade="h">
<control type="panel" cascade="v" margin="0 0 5 0">
<control type="list" id="id11" styles="vsbar" weight="10" />
<control type="button" id="id12" eval="1" caption="Button -- $+ $chr(62)" height="20" />
<control type="text" caption="Text" styles="center" />
</control>
<control type="panel" cascade="v">
<control type="list" id="id13" styles="vsbar" weight="10" />
<control type="button" id="id14" eval="1" caption="$chr(60) $+ -- Btn" height="20" />
<control type="text" caption="Text" styles="center" />
</control>
</control>
</control>
<control type="panel" cascade="v" weight="4">
<control type="panel" cascade="h">
<control type="panel" cascade="v">
<control type="panel" cascade="v">
<control type="text" caption="Title 4" height="16" />
<control type="panel" cascade="v">
<control type="radio" id="id15" caption="Radio" height="20" />
<control type="radio" id="id16" caption="Radio 2" height="20" />
<control type="radio" id="id17" caption="Radio 3" height="20" />
<control type="radio" id="id18" caption="Radio 4" height="20" />
</control>
</control>
<control type="panel" cascade="v">
<control type="text" caption="Title 5" height="16" margin="0 5 5 5" />
<control type="button" id="id19" caption="Load" height="20" />
<control type="button" id="id20" caption="Unload" height="20" />
</control>
</control>
<control type="panel" cascade="v" margin="0 0 5 0">
<control type="text" caption="Title 6" height="16" />
<control type="panel" cascade="v">
<control type="text" caption="Title 7" height="16" />
<control type="panel" height="40" cascade="v">
<control type="radio" id="id21" eval="1" caption="$chr(9854)" styles="group" />
<control type="panel" cascade="h">
<control type="radio" id="id22" width="20" />
<control type="edit" id="id23" width="50" />
</control>
</control>
</control>
<control type="panel" cascade="v">
<control type="text" caption="Title 8" height="16" />
<control type="panel" height="40" cascade="v">
<control type="radio" id="id24" eval="1" caption="$chr(9854)" />
<pane cascade="h">
<control type="radio" id="id25" width="20" />
<control type="edit" id="id26" width="50" />
</pane>
</control>
</control>
</control>
</control>
</control>
<control type="panel" cascade="v" weight="3">
<control type="text" caption="Title 9" height="16" />
<control type="panel" cascade="h">
<control type="panel" cascade="v" margin="0 0 5 0">
<control type="text" caption="Caption" styles="center" height="16" />
<control type="list" id="id27" styles="hsbar" />
<control type="text" caption="Caption" styles="center" height="16" />
<control type="list" id="id28" styles="hsbar" />
</control>
</control>
</control>
<control type="panel" cascade="v" weight="2">
<control type="text" caption="Title 10" height="16" />
<control type="panel" height="27" cascade="h">
<control type="radio" id="id29" caption="Caption" />
<control type="radio" id="id30" caption="Caption" />
</control>
<control type="text" caption="Title 11" height="16" />
<control type="check" id="id31" caption="Title 12" tooltip="(tooltip content)" styles="tooltips" height="20" />
</control>
</pane>
</control>
</control>
</dialog>
</dialogs>
</dcxml>
mSL test case
dialog MainInterface {
title "Interface"
size 213 710 510 110
option dbu
}
alias interfaceopen {
clear
if ($dialog(intf1) == $null) {
dialog -m intf1 MainInterface
}
else {
dialog -x intf1
dialog -m intf1 MainInterface
}
}
on *:DIALOG:intf1:init:0:{
var %verbose = v
dcx Mark $dname interface.events
xdialog -b $dname +tz
xdialog -T $dname +sp
;dcxml -d [DNAME] [Name of dialog element you wish to load] [path to dcxml file]
dcxml -d $+ %verbose $dname interface $qt($mircdirscripts\interface.xml)
.timer -d 1 0 xdialog -l $dname update
.timer -d 1 0 xdialog -j $dname
.timer -dm 1 500 xdock -m $dialog($dname).hwnd +b
.timer -dm 1 500 xdock -r $dialog($dname).hwnd + 0 %h
}
alias interface.events {
; Nothing to do here
}
The dcxml/cla part runs fine when not docked.
As a side note when using dcxml you must wait for the dcxml ready event before doing anything further to the dialog.
I'll look into why xdock is messing up cla.
Here is a version that loads nice & fast.
dialog MainInterface {
title "Interface"
size 213 710 510 110
option pixels
}
alias interfaceopen {
clear
if ($dialog(intf1) == $null) {
dialog -m intf1 MainInterface
}
else {
dialog -x intf1
dialog -m intf1 MainInterface
}
}
alias -l _after_init {
xdock -p
}
on *:DIALOG:intf1:init:0:{
var %verbose = v
dcx Mark $dname interface.events
xdialog -b $dname +tz
xdialog -T $dname +sp
xdock -m $dialog($dname).hwnd +b
.timer 1 0 dcxml -d $dname interface $qt($mircdirscripts\interface.xml)
}
alias interface.events {
if ($2 == ready) {
.timer 1 0 _after_init $1
}
elseif ($2 == isverbose) {
echo -s ask verbose (false)
return $false
}
elseif ($2 == error) echo -s DCXError: $1 ID: $3 Type: $4 Prop: $5 Cmd: $6 Error: $7-
;else echo -s cc: $1-
}