<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.secondlife.com/w/index.php?action=history&amp;feed=atom&amp;title=OpenLayout</id>
	<title>OpenLayout - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.secondlife.com/w/index.php?action=history&amp;feed=atom&amp;title=OpenLayout"/>
	<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=OpenLayout&amp;action=history"/>
	<updated>2026-06-06T16:14:16Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=OpenLayout&amp;diff=1217849&amp;oldid=prev</id>
		<title>Gwyneth Llewelyn: Corrected badly-formatted bullet list on the explanations</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=OpenLayout&amp;diff=1217849&amp;oldid=prev"/>
		<updated>2025-01-04T12:12:18Z</updated>

		<summary type="html">&lt;p&gt;Corrected badly-formatted bullet list on the explanations&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 05:12, 4 January 2025&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l5&quot;&gt;Line 5:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 5:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Two child prims named &amp;#039;Reference&amp;#039; and &amp;#039;Gizmo&amp;#039; are searched for on script reset.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Two child prims named &amp;#039;Reference&amp;#039; and &amp;#039;Gizmo&amp;#039; are searched for on script reset.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;* &lt;/ins&gt;Root prim is used as the &#039;draggable&#039; surface, you can imagine it as the surface handle. This has to be the root, due to a limitation with &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[&lt;/ins&gt;llDetectedGrab&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;]]&lt;/ins&gt;.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;- &lt;/del&gt;Root prim is used as the &#039;draggable&#039; surface, you can imagine it as the surface handle. This has to be the root, due to a limitation with llDetectedGrab.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;* &#039;&lt;/ins&gt;Reference&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&#039; &lt;/ins&gt;is used to compute a bounding box for edge snapping. You can hardcode these values in Scale and Offset and comment out lines with Reference however if you prefer.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;- &lt;/del&gt;Reference is used to compute a bounding box for edge snapping. You can hardcode these values in Scale and Offset and comment out lines with Reference however if you prefer.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;* &#039;&lt;/ins&gt;Gizmo&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&#039; &lt;/ins&gt;is used for the visual effects during dragging.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;- &lt;/del&gt;Gizmo is used for the visual effects during dragging.&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Gwyneth Llewelyn</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=OpenLayout&amp;diff=1214000&amp;oldid=prev</id>
		<title>Gwyneth Llewelyn: Replaced &lt;source&gt; with &lt;syntaxhighlight&gt;</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=OpenLayout&amp;diff=1214000&amp;oldid=prev"/>
		<updated>2023-05-31T06:39:55Z</updated>

		<summary type="html">&lt;p&gt;Replaced &amp;lt;source&amp;gt; with &amp;lt;syntaxhighlight&amp;gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 23:39, 30 May 2023&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l17&quot;&gt;Line 17:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 17:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Example video at: https://www.youtube.com/watch?v=ZAP-PZJC7v4&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Example video at: https://www.youtube.com/watch?v=ZAP-PZJC7v4&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;source &lt;/del&gt;lang=&quot;lsl2&quot;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;syntaxhighlight &lt;/ins&gt;lang=&quot;lsl2&quot;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;// Textures&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;// Textures&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;key txtFree = &amp;quot;161cb352-8ef0-a792-02f2-b038e88b9262&amp;quot;;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;key txtFree = &amp;quot;161cb352-8ef0-a792-02f2-b038e88b9262&amp;quot;;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l461&quot;&gt;Line 461:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 461:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;}&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;source&lt;/del&gt;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;syntaxhighlight&lt;/ins&gt;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Gwyneth Llewelyn</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=OpenLayout&amp;diff=1207315&amp;oldid=prev</id>
		<title>Nexii Malthus: Created page with &quot;{{LSL Header}}Category:LSL Library  This is a script in the root prim of a HUD that allows it to be dragged and dropped.  Two child prims named &#039;Reference&#039; and &#039;Gizmo&#039; are...&quot;</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=OpenLayout&amp;diff=1207315&amp;oldid=prev"/>
		<updated>2018-07-07T23:07:09Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;{{LSL Header}}&lt;a href=&quot;/wiki/Category:LSL_Library&quot; title=&quot;Category:LSL Library&quot;&gt;Category:LSL Library&lt;/a&gt;  This is a script in the root prim of a HUD that allows it to be dragged and dropped.  Two child prims named &amp;#039;Reference&amp;#039; and &amp;#039;Gizmo&amp;#039; are...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{LSL Header}}[[Category:LSL Library]]&lt;br /&gt;
&lt;br /&gt;
This is a script in the root prim of a HUD that allows it to be dragged and dropped.&lt;br /&gt;
&lt;br /&gt;
Two child prims named &amp;#039;Reference&amp;#039; and &amp;#039;Gizmo&amp;#039; are searched for on script reset.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
- Root prim is used as the &amp;#039;draggable&amp;#039; surface, you can imagine it as the surface handle. This has to be the root, due to a limitation with llDetectedGrab.&lt;br /&gt;
- Reference is used to compute a bounding box for edge snapping. You can hardcode these values in Scale and Offset and comment out lines with Reference however if you prefer.&lt;br /&gt;
- Gizmo is used for the visual effects during dragging.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Note that the HUD requires being able to estimate screen width to support screen edge snapping for the left and right edges. This means it needs to be attached to one of the HUD attachment points to the left or the right of the screen. The HUD will warn about this and use a placeholder value otherwise.&lt;br /&gt;
&lt;br /&gt;
The example scripted linkset is available from: https://marketplace.secondlife.com/p/openLayout-DragDrop-HUD-and-edge-snapping-with-ease/4542777&lt;br /&gt;
&lt;br /&gt;
Example video at: https://www.youtube.com/watch?v=ZAP-PZJC7v4&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
// Textures&lt;br /&gt;
key txtFree = &amp;quot;161cb352-8ef0-a792-02f2-b038e88b9262&amp;quot;;&lt;br /&gt;
key txtScreenEdge = &amp;quot;02cbd01a-96bb-90aa-d9ea-f1d7d64c5a94&amp;quot;;&lt;br /&gt;
key txtScreenCorner = &amp;quot;56f705e9-b9e9-bee2-32f3-ead14c29911b&amp;quot;;&lt;br /&gt;
key txtSnapEdge = &amp;quot;10b9d2f6-574a-53e3-4698-5bc730770e34&amp;quot;;&lt;br /&gt;
key txtSnapCorner = &amp;quot;9bcbe0f1-8a78-f8ea-5588-06bf6f8908c5&amp;quot;;&lt;br /&gt;
key txtScreenSnap = &amp;quot;8a819c74-6ae5-9cc6-c7d7-35e9a808e690&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// States&lt;br /&gt;
integer LeftRight; // [Left, Center, Right] = [-1, 0, 1]&lt;br /&gt;
integer TopBottom; // [Top, Center, Bottom] = [-1, 0, 1]&lt;br /&gt;
integer Header;&lt;br /&gt;
integer Drag; // Being dragged?&lt;br /&gt;
integer Checking;&lt;br /&gt;
integer Snap; // Snapped to anything&lt;br /&gt;
integer ScreenV; // Snapped to edge of screen, [Top, Bottom] = [-1, 1]&lt;br /&gt;
integer ScreenH; // Snapped to edge of screen, [Left, Right] = [-1, 1]&lt;br /&gt;
integer SnapV; // Snapped to edge of a box, [Top, Bottom] = [-1, 1]&lt;br /&gt;
integer SnapH; // Snapped to edge of a box, [Left, Right] = [-1, 1]&lt;br /&gt;
&lt;br /&gt;
// Temporary&lt;br /&gt;
vector Last;&lt;br /&gt;
vector OriginalHeaderScale;&lt;br /&gt;
&lt;br /&gt;
// Config&lt;br /&gt;
vector Location;&lt;br /&gt;
vector Offset;&lt;br /&gt;
vector Scale;&lt;br /&gt;
float ScreenWidth;&lt;br /&gt;
float screenDist = 0.02; // How close to start snapping to screen&lt;br /&gt;
float SnapDist = 0.03; // How close to start snapping to edges of boxes&lt;br /&gt;
&lt;br /&gt;
// Other&lt;br /&gt;
integer Point;&lt;br /&gt;
integer LastPoint;&lt;br /&gt;
integer Gizmo;&lt;br /&gt;
integer Linked(string Needle) {&lt;br /&gt;
    integer Prims = llGetNumberOfPrims()+1;&lt;br /&gt;
    while(--Prims) if(llGetLinkName(Prims) == Needle) return Prims;&lt;br /&gt;
    return 0;&lt;br /&gt;
} // https://wiki.secondlife.com/wiki/LinksetIndexing&lt;br /&gt;
&lt;br /&gt;
integer OpenLayouts;&lt;br /&gt;
list OpenLayoutsKey;&lt;br /&gt;
list OpenLayoutsPos;&lt;br /&gt;
list OpenLayoutsScl;&lt;br /&gt;
&lt;br /&gt;
// Converts screen to local coordinates&lt;br /&gt;
vector ScreenLocal(vector Coordinate)&lt;br /&gt;
{&lt;br /&gt;
    if(Point == ATTACH_HUD_TOP_RIGHT) Coordinate.z = Coordinate.z - 1;&lt;br /&gt;
    else if(Point == ATTACH_HUD_TOP_LEFT) Coordinate = &amp;lt;Coordinate.x, Coordinate.y - ScreenWidth, Coordinate.z - 1&amp;gt;;&lt;br /&gt;
    else if(Point == ATTACH_HUD_BOTTOM_LEFT) Coordinate.y = Coordinate.y - ScreenWidth;&lt;br /&gt;
    // ATTACH_HUD_BOTTOM_RIGHT is &amp;lt;0,0,0&amp;gt; origin&lt;br /&gt;
    return Coordinate;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Converts local to screen coordinates&lt;br /&gt;
vector LocalScreen(vector Coordinate)&lt;br /&gt;
{&lt;br /&gt;
    if(Point == ATTACH_HUD_TOP_RIGHT) Coordinate.z = 1 + Coordinate.z;&lt;br /&gt;
    else if(Point == ATTACH_HUD_TOP_LEFT) Coordinate = &amp;lt;Coordinate.x, ScreenWidth + Coordinate.y, 1 + Coordinate.z&amp;gt;;&lt;br /&gt;
    else if(Point == ATTACH_HUD_BOTTOM_LEFT) Coordinate.y = ScreenWidth + Coordinate.y;&lt;br /&gt;
    // ATTACH_HUD_BOTTOM_RIGHT is &amp;lt;0,0,0&amp;gt; origin&lt;br /&gt;
    return Coordinate;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
string Output()&lt;br /&gt;
{&lt;br /&gt;
    vector Coordinate = LocalScreen(llGetLocalPos() + Offset);&lt;br /&gt;
    return (string)Coordinate+&amp;quot;|&amp;quot;+(string)Scale;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        Point = llGetAttached();&lt;br /&gt;
        if(Point == ATTACH_HUD_TOP_RIGHT) { LeftRight = 1; TopBottom = -1; /*llSetObjectDesc(&amp;quot;TOP RIGHT&amp;quot;);*/ } else&lt;br /&gt;
        if(Point == ATTACH_HUD_BOTTOM_RIGHT) { LeftRight = 1; TopBottom = 1; /*llSetObjectDesc(&amp;quot;BOTTOM RIGHT&amp;quot;);*/ } else&lt;br /&gt;
        if(Point == ATTACH_HUD_TOP_LEFT) { LeftRight = -1; TopBottom = -1; /*llSetObjectDesc(&amp;quot;TOP LEFT&amp;quot;);*/ } else&lt;br /&gt;
        if(Point == ATTACH_HUD_BOTTOM_LEFT) { LeftRight = -1; TopBottom = 1; /*llSetObjectDesc(&amp;quot;BOTTOM LEFT&amp;quot;);*/ }&lt;br /&gt;
        else {&lt;br /&gt;
            LeftRight = 0; // We won&amp;#039;t be able to detect screen edges. (TODO: Have other HUDs communicate screen width?)&lt;br /&gt;
            TopBottom = 0;&lt;br /&gt;
        }&lt;br /&gt;
        LastPoint = Point;&lt;br /&gt;
        &lt;br /&gt;
        if(llGetLinkNumber() != 1) {&lt;br /&gt;
            llOwnerSay(&amp;quot;This script needs to be in the root prim to correctly interpret touch drags.&amp;quot;);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        // llSetObjectDesc((string)llGetLocalPos());&lt;br /&gt;
        Location = llGetLocalPos();&lt;br /&gt;
        OriginalHeaderScale = llList2Vector(llGetLinkPrimitiveParams(LINK_THIS, [PRIM_SIZE]), 0);&lt;br /&gt;
        &lt;br /&gt;
        integer Reference = Linked(&amp;quot;Reference&amp;quot;);&lt;br /&gt;
        Gizmo = Linked(&amp;quot;Gizmo&amp;quot;);&lt;br /&gt;
        if(Reference &amp;amp;&amp;amp; Gizmo) {&lt;br /&gt;
            Scale = llList2Vector(llGetLinkPrimitiveParams(Reference, [PRIM_SIZE]), 0);&lt;br /&gt;
            Offset = llList2Vector(llGetLinkPrimitiveParams(Reference, [PRIM_POS_LOCAL]), 0);&lt;br /&gt;
            &lt;br /&gt;
            llSetLinkPrimitiveParamsFast(Gizmo, [&lt;br /&gt;
                PRIM_SIZE, Scale&lt;br /&gt;
            ]);&lt;br /&gt;
        } else {&lt;br /&gt;
            if(!Reference)&lt;br /&gt;
                llOwnerSay(&amp;quot;No prim found by name of &amp;#039;Reference&amp;#039; in linkset, please set one so we know what dimensions the HUD is.&amp;quot;);&lt;br /&gt;
            else if(!Gizmo)&lt;br /&gt;
                llOwnerSay(&amp;quot;No prim found by name of &amp;#039;Gizmo&amp;#039; in linkset, please add one so that we can show the layout modification visual.&amp;quot;);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        &lt;br /&gt;
        llListen(-42000000, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
        string temp = llGetObjectName();&lt;br /&gt;
        llSetObjectName(&amp;quot;openLayout.new&amp;quot;);&lt;br /&gt;
        Checking = TRUE;&lt;br /&gt;
        llRegionSayTo(llGetOwner(), -42000000, Output());&lt;br /&gt;
        llSetObjectName(temp);&lt;br /&gt;
        &lt;br /&gt;
        llOwnerSay(&amp;quot;Init&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    listen(integer ch, string nm, key k, string msg)&lt;br /&gt;
    {&lt;br /&gt;
        if(llGetOwnerKey(k) != llGetOwner()) return;&lt;br /&gt;
        &lt;br /&gt;
        if(nm == &amp;quot;openLayout.new&amp;quot; || (Checking &amp;amp;&amp;amp; nm == &amp;quot;openLayout.reply&amp;quot;))&lt;br /&gt;
        {&lt;br /&gt;
            OpenLayouts++;&lt;br /&gt;
            OpenLayoutsKey += k;&lt;br /&gt;
            integer Pipe = llSubStringIndex(msg, &amp;quot;|&amp;quot;);&lt;br /&gt;
            vector Pos = (vector)llGetSubString(msg, 0, Pipe-1 );&lt;br /&gt;
            vector Scl = (vector)llGetSubString(msg, Pipe+1, -1);&lt;br /&gt;
            OpenLayoutsPos += Pos;&lt;br /&gt;
            OpenLayoutsScl += Scl;&lt;br /&gt;
            &lt;br /&gt;
            if(nm == &amp;quot;openLayout.new&amp;quot;) {&lt;br /&gt;
                string temp = llGetObjectName();&lt;br /&gt;
                llSetObjectName(&amp;quot;openLayout.reply&amp;quot;);&lt;br /&gt;
                llRegionSayTo(llGetOwner(), -42000000, Output());&lt;br /&gt;
                llSetObjectName(temp);&lt;br /&gt;
            } else {&lt;br /&gt;
                llSetTimerEvent(0);&lt;br /&gt;
                llSetTimerEvent(1);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        else if(nm == &amp;quot;openLayout.moved&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            integer Pointer = llListFindList(OpenLayoutsKey, [k]);&lt;br /&gt;
            if(~Pointer) {&lt;br /&gt;
                integer Pipe = llSubStringIndex(msg, &amp;quot;|&amp;quot;);&lt;br /&gt;
                vector Pos = (vector)llGetSubString(msg, 0, Pipe-1 );&lt;br /&gt;
                vector Scl = (vector)llGetSubString(msg, Pipe+1, -1);&lt;br /&gt;
                &lt;br /&gt;
                OpenLayoutsPos = llListReplaceList(OpenLayoutsPos, [Pos], Pointer, Pointer);&lt;br /&gt;
                OpenLayoutsScl = llListReplaceList(OpenLayoutsScl, [Scl], Pointer, Pointer);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        llSetTimerEvent(0);&lt;br /&gt;
        Checking = FALSE;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    touch_start(integer d)&lt;br /&gt;
    {&lt;br /&gt;
        llResetTime();&lt;br /&gt;
        &lt;br /&gt;
        integer Link = llDetectedLinkNumber(0);&lt;br /&gt;
        &lt;br /&gt;
        // Clicked Root?&lt;br /&gt;
        Header = (Link == 1);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    touch(integer d)&lt;br /&gt;
    {&lt;br /&gt;
        if(Drag)&lt;br /&gt;
        {&lt;br /&gt;
            vector Touch = llDetectedTouchPos(0);&lt;br /&gt;
            if(Last == ZERO_VECTOR) { Last = Touch; return; }&lt;br /&gt;
            if(Touch == ZERO_VECTOR) return;&lt;br /&gt;
            &lt;br /&gt;
            vector Delta = Touch - Last;&lt;br /&gt;
            Last = Touch;&lt;br /&gt;
            &lt;br /&gt;
            Location.y += Delta.y;&lt;br /&gt;
            Location.z += Delta.z;&lt;br /&gt;
            &lt;br /&gt;
            vector Pos = Location;&lt;br /&gt;
            Pos += Offset;&lt;br /&gt;
            vector Half = Scale * .5;&lt;br /&gt;
            vector GizmoPos = Offset; Offset.x - 0.5;&lt;br /&gt;
            Delta = ZERO_VECTOR;&lt;br /&gt;
            &lt;br /&gt;
            ScreenV = 0;&lt;br /&gt;
            ScreenH = 0;&lt;br /&gt;
            float screenTop = 1.0 - Half.z;&lt;br /&gt;
            float screenBottom = 0.0 + Half.z;&lt;br /&gt;
            float screenLeft = ScreenWidth - Half.y;&lt;br /&gt;
            float screenRight = 0.0 + Half.y;&lt;br /&gt;
            if(TopBottom == -1) {&lt;br /&gt;
                screenTop = 0.0 - Half.z;&lt;br /&gt;
                screenBottom = -1.0 + Half.z;&lt;br /&gt;
            }&lt;br /&gt;
            if(LeftRight == -1) {&lt;br /&gt;
                screenLeft = 0.0 - Half.y;&lt;br /&gt;
                screenRight = -ScreenWidth + Half.y;&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
            if(Pos.z &amp;lt; screenBottom+screenDist) {&lt;br /&gt;
                Delta.z = screenBottom - Pos.z;&lt;br /&gt;
                ScreenV = 1;&lt;br /&gt;
            } else if(Pos.z &amp;gt; screenTop-screenDist) {&lt;br /&gt;
                Delta.z = screenTop - Pos.z;&lt;br /&gt;
                ScreenV = -1;&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
            if(Pos.y &amp;gt; screenLeft-screenDist) {&lt;br /&gt;
                Delta.y = screenLeft - Pos.y;&lt;br /&gt;
                ScreenH = -1;&lt;br /&gt;
            } else if(Pos.y &amp;lt; screenRight+screenDist) {&lt;br /&gt;
                Delta.y = screenRight - Pos.y;&lt;br /&gt;
                ScreenH = 1;&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
            &lt;br /&gt;
            SnapV = 0; float closestV = 31337;&lt;br /&gt;
            SnapH = 0; float closestH = 31337;&lt;br /&gt;
            float myTop = Delta.z + Pos.z + Half.z;&lt;br /&gt;
            float myBottom = Delta.z + Pos.z - Half.z;&lt;br /&gt;
            float myLeft = Delta.y + Pos.y + Half.y;&lt;br /&gt;
            float myRight = Delta.y + Pos.y - Half.y;&lt;br /&gt;
            &lt;br /&gt;
            integer x = OpenLayouts;&lt;br /&gt;
            while(x--) {&lt;br /&gt;
                vector v = ScreenLocal(llList2Vector(OpenLayoutsPos, x));&lt;br /&gt;
                vector s = llList2Vector(OpenLayoutsScl, x) * .5;&lt;br /&gt;
                float theirTop = v.z + s.z;&lt;br /&gt;
                float theirBottom = v.z - s.z;&lt;br /&gt;
                float theirLeft = v.y + s.y;&lt;br /&gt;
                float theirRight = v.y - s.y;&lt;br /&gt;
                &lt;br /&gt;
                float d = theirTop - myBottom;&lt;br /&gt;
                if(d &amp;lt; SnapDist &amp;amp;&amp;amp; d &amp;gt; -SnapDist) {&lt;br /&gt;
                    if(llFabs(d) &amp;lt; llFabs(closestV)) {&lt;br /&gt;
                        closestV = d;&lt;br /&gt;
                        SnapV = 1;&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                d = theirBottom - myBottom;&lt;br /&gt;
                if(d &amp;lt; SnapDist &amp;amp;&amp;amp; d &amp;gt; -SnapDist) {&lt;br /&gt;
                    if(llFabs(d) &amp;lt; llFabs(closestV)) {&lt;br /&gt;
                        closestV = d;&lt;br /&gt;
                        SnapV = 1;&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                d = theirBottom - myTop;&lt;br /&gt;
                if(d &amp;lt; SnapDist &amp;amp;&amp;amp; d &amp;gt; -SnapDist) {&lt;br /&gt;
                    if(llFabs(d) &amp;lt; llFabs(closestV)) {&lt;br /&gt;
                        closestV = d;&lt;br /&gt;
                        SnapV = -1;&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                d = theirTop - myTop;&lt;br /&gt;
                if(d &amp;lt; SnapDist &amp;amp;&amp;amp; d &amp;gt; -SnapDist) {&lt;br /&gt;
                    if(llFabs(d) &amp;lt; llFabs(closestV)) {&lt;br /&gt;
                        closestV = d;&lt;br /&gt;
                        SnapV = -1;&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                d = theirLeft - myRight;&lt;br /&gt;
                if(d &amp;lt; SnapDist &amp;amp;&amp;amp; d &amp;gt; -SnapDist) {&lt;br /&gt;
                    if(llFabs(d) &amp;lt; llFabs(closestH)) {&lt;br /&gt;
                        closestH = d;&lt;br /&gt;
                        SnapH = 1;&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                d = theirRight - myRight;&lt;br /&gt;
                if(d &amp;lt; SnapDist &amp;amp;&amp;amp; d &amp;gt; -SnapDist) {&lt;br /&gt;
                    if(llFabs(d) &amp;lt; llFabs(closestH)) {&lt;br /&gt;
                        closestH = d;&lt;br /&gt;
                        SnapH = 1;&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                d = theirRight - myLeft;&lt;br /&gt;
                if(d &amp;lt; SnapDist &amp;amp;&amp;amp; d &amp;gt; -SnapDist) {&lt;br /&gt;
                    if(llFabs(d) &amp;lt; llFabs(closestH)) {&lt;br /&gt;
                        closestH = d;&lt;br /&gt;
                        SnapH = -1;&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                d = theirLeft - myLeft;&lt;br /&gt;
                if(d &amp;lt; SnapDist &amp;amp;&amp;amp; d &amp;gt; -SnapDist) {&lt;br /&gt;
                    if(llFabs(d) &amp;lt; llFabs(closestH)) {&lt;br /&gt;
                        closestH = d;&lt;br /&gt;
                        SnapH = -1;&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
            if(SnapV) Delta.z += closestV;&lt;br /&gt;
            if(SnapH) Delta.y += closestH;&lt;br /&gt;
            &lt;br /&gt;
            Pos -= Offset;&lt;br /&gt;
            &lt;br /&gt;
            key Texture = txtFree;&lt;br /&gt;
            Snap = FALSE;&lt;br /&gt;
            float Angle;&lt;br /&gt;
            if(ScreenH || ScreenV || SnapV || SnapH)&lt;br /&gt;
            {&lt;br /&gt;
                Snap = TRUE;&lt;br /&gt;
                &lt;br /&gt;
                if(ScreenH &amp;amp;&amp;amp; ScreenV)&lt;br /&gt;
                {&lt;br /&gt;
                    Texture = txtScreenCorner;&lt;br /&gt;
                }&lt;br /&gt;
                else if(ScreenH)&lt;br /&gt;
                {&lt;br /&gt;
                    Angle = PI_BY_TWO;&lt;br /&gt;
                    if(SnapV) {&lt;br /&gt;
                        Texture = txtScreenSnap;&lt;br /&gt;
                        if(SnapV == -1) Angle = -Angle;&lt;br /&gt;
                    } else {&lt;br /&gt;
                        Texture = txtScreenEdge;&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                else if(ScreenV)&lt;br /&gt;
                {&lt;br /&gt;
                    if(SnapH) {&lt;br /&gt;
                        Texture = txtScreenSnap;&lt;br /&gt;
                        if(SnapH == 1) Angle = PI;&lt;br /&gt;
                    } else Texture = txtScreenEdge;&lt;br /&gt;
                }&lt;br /&gt;
                else if(SnapH &amp;amp;&amp;amp; SnapV)&lt;br /&gt;
                {&lt;br /&gt;
                    Texture = txtSnapCorner;&lt;br /&gt;
                    if(SnapH ==  1 &amp;amp;&amp;amp; SnapV ==  1) Angle = PI_BY_TWO; else&lt;br /&gt;
                    if(SnapH == -1 &amp;amp;&amp;amp; SnapV ==  1) Angle = 0; else&lt;br /&gt;
                    if(SnapH == -1 &amp;amp;&amp;amp; SnapV == -1) Angle = -PI_BY_TWO; else&lt;br /&gt;
                    if(SnapH ==  1 &amp;amp;&amp;amp; SnapV == -1) Angle = PI;&lt;br /&gt;
                }&lt;br /&gt;
                else if(SnapH)&lt;br /&gt;
                {&lt;br /&gt;
                    Texture = txtSnapEdge;&lt;br /&gt;
                    if(SnapH ==  1) Angle = PI;&lt;br /&gt;
                }&lt;br /&gt;
                else if(SnapV)&lt;br /&gt;
                {&lt;br /&gt;
                    Texture = txtSnapEdge;&lt;br /&gt;
                    Angle = PI_BY_TWO * SnapV;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
            list Params = [PRIM_LINK_TARGET, Gizmo,&lt;br /&gt;
                PRIM_TEXTURE, 4, Texture, &amp;lt;1,1,0&amp;gt;, &amp;lt;0,0,0&amp;gt;, Angle,&lt;br /&gt;
                PRIM_POS_LOCAL, Offset + &amp;lt;.5, Delta.y, Delta.z&amp;gt;&lt;br /&gt;
            ];&lt;br /&gt;
            &lt;br /&gt;
            llSetLinkPrimitiveParamsFast(LINK_THIS, [PRIM_POS_LOCAL, Pos] + Params);&lt;br /&gt;
        }&lt;br /&gt;
        else if(Header &amp;amp;&amp;amp; LeftRight &amp;amp;&amp;amp; llGetTime() &amp;gt; 0.3)&lt;br /&gt;
        {&lt;br /&gt;
            Drag = TRUE;&lt;br /&gt;
            Location = llGetLocalPos();&lt;br /&gt;
            Last = llDetectedTouchPos(0);&lt;br /&gt;
            vector ST = llDetectedTouchST(0);&lt;br /&gt;
            ScreenWidth = ((ST.x - .5) * Scale.y - Location.y + Last.y) * 2;&lt;br /&gt;
            if(ScreenWidth &amp;lt; 0) ScreenWidth = -ScreenWidth;&lt;br /&gt;
            &lt;br /&gt;
            llSetLinkPrimitiveParamsFast(LINK_THIS, [&lt;br /&gt;
                PRIM_SIZE, &amp;lt;.01,4,4&amp;gt;,&lt;br /&gt;
                PRIM_COLOR, 4, &amp;lt;0,0,0&amp;gt;, 0.3,&lt;br /&gt;
                PRIM_LINK_TARGET, Gizmo,&lt;br /&gt;
                PRIM_SIZE, &amp;lt;0.01, Scale.y * 2, Scale.z * 2&amp;gt;,&lt;br /&gt;
                PRIM_POS_LOCAL, Offset + &amp;lt;.5,0,0&amp;gt;&lt;br /&gt;
            ]);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    touch_end(integer d)&lt;br /&gt;
    {&lt;br /&gt;
        if(Drag)&lt;br /&gt;
        {&lt;br /&gt;
            Drag = FALSE;&lt;br /&gt;
            &lt;br /&gt;
            vector GizmoPos = llList2Vector(llGetLinkPrimitiveParams(Gizmo, [PRIM_POS_LOCAL]), 0);&lt;br /&gt;
            vector Delta = &amp;lt;0, GizmoPos.y - Offset.y, GizmoPos.z - Offset.z&amp;gt;;&lt;br /&gt;
            llSetLinkPrimitiveParamsFast(LINK_THIS, [&lt;br /&gt;
                PRIM_SIZE, OriginalHeaderScale,&lt;br /&gt;
                PRIM_POS_LOCAL, Location + Delta,&lt;br /&gt;
                PRIM_COLOR, 4, &amp;lt;0,0,0&amp;gt;, 0.01,&lt;br /&gt;
                PRIM_LINK_TARGET, Gizmo,&lt;br /&gt;
                PRIM_SIZE, Scale,&lt;br /&gt;
                PRIM_POS_LOCAL, Offset + &amp;lt;.5,0,0&amp;gt;&lt;br /&gt;
            ]);&lt;br /&gt;
            &lt;br /&gt;
            string temp = llGetObjectName();&lt;br /&gt;
            llSetObjectName(&amp;quot;openLayout.moved&amp;quot;);&lt;br /&gt;
            llRegionSayTo(llGetOwner(), -42000000, Output());&lt;br /&gt;
            llSetObjectName(temp);&lt;br /&gt;
            &lt;br /&gt;
            llMessageLinked(LINK_SET, -42000000, llList2CSV([Snap, ScreenWidth, ScreenH, ScreenV, SnapH, SnapV]), Output());&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            // Normal click&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    changed(integer c) { if(c &amp;amp; CHANGED_LINK) llResetScript(); }&lt;br /&gt;
    attach(key k) {&lt;br /&gt;
        Point = llGetAttached();&lt;br /&gt;
        if(Point &amp;amp;&amp;amp; LastPoint &amp;amp;&amp;amp; Point != LastPoint) {&lt;br /&gt;
            llOwnerSay(&amp;quot;Attempting to restore screen position after switching HUD attachment points&amp;quot;);&lt;br /&gt;
            if(ScreenWidth == 0.0) {&lt;br /&gt;
                llOwnerSay(&amp;quot;Missing screen width; Calculation will be estimated&amp;quot;);&lt;br /&gt;
                ScreenWidth = 1.7777777777777777777777777777778;&lt;br /&gt;
            }&lt;br /&gt;
            Point = LastPoint;&lt;br /&gt;
            vector Pos = LocalScreen(llGetLocalPos());&lt;br /&gt;
            Point = llGetAttached();&lt;br /&gt;
            Pos = ScreenLocal(Pos);&lt;br /&gt;
            &lt;br /&gt;
            llSetLinkPrimitiveParamsFast(LINK_THIS, [&lt;br /&gt;
                PRIM_POS_LOCAL, Pos&lt;br /&gt;
            ]);&lt;br /&gt;
        }&lt;br /&gt;
        if(Point) {&lt;br /&gt;
            llResetScript();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Nexii Malthus</name></author>
	</entry>
</feed>