<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://wiki.winamp.com/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>http://wiki.winamp.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Pjn123</id>
		<title>Winamp Developer Wiki - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="http://wiki.winamp.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Pjn123"/>
		<link rel="alternate" type="text/html" href="http://wiki.winamp.com/wiki/Special:Contributions/Pjn123"/>
		<updated>2026-04-06T09:05:25Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.22.3</generator>

	<entry>
		<id>http://wiki.winamp.com/wiki/XML_GUI_Objects</id>
		<title>XML GUI Objects</title>
		<link rel="alternate" type="text/html" href="http://wiki.winamp.com/wiki/XML_GUI_Objects"/>
				<updated>2012-11-12T13:58:14Z</updated>
		
		<summary type="html">&lt;p&gt;Pjn123: /*  */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==GuiObject (Global params)==&lt;br /&gt;
All the objects to be discussed in this chapter are GuiObjects.  This means, among other things, all such objects have the same basic set of parameters which are valid for all of them.  All GuiObjects are objects that live with a set of spatial coordinates within a groupdef (or layout).  A button, a piece of text, a flat bitmap image, a tree of items, and an edit box would all be different kinds of GuiObjects, and all of the parameters listed here work on all of them.&lt;br /&gt;
* '''alpha''' - (int) An integer [0,255] specifying the alpha blend mode of the object (0 is transparent, 255 is opaque).  Default is 255.&lt;br /&gt;
* '''activealpha''' - (int) A different alpha value [0,255] for the object in its active state.&lt;br /&gt;
* '''inactivealpha''' - (int) A different alpha value [0,255] for the object in its inactive state (if you set both activealpha and inactivealpha, it is meaningless to set alpha).&lt;br /&gt;
* '''cursor''' - (id) The id of the cursor element to be displayed when the mouse is over this object. You can also use the system cursors. A list can be found here: '''[[Wasabi Appendix: Cursors | Appendix: Cursors]]'''&lt;br /&gt;
* '''tooltip''' - (str) A human readable string to display as a tooltip for when the mouse is hovered over this object.&lt;br /&gt;
* '''move''' - (bool) Setting this flag causes any dragging of this object to actually drag the entire layout within which the object resides.&lt;br /&gt;
* '''renderbasetexture''' - (bool) A flag to tell the system to always use the system's base texture as the background of this object.&lt;br /&gt;
* '''cfgattrib''' - (str) A configattrib string assigned to this GuiObject. Here is a list of a few: '''[[Wasabi Appendix: ConfigAttrib | Appendix: ConfigAttrib]]'''&lt;br /&gt;
* '''visible''' - (bool) Whether or not the object should be displayed in its group or layout.&lt;br /&gt;
* '''x''' - (int) The X position of the object in its group or layout.&lt;br /&gt;
* '''y''' - (int) The Y position of the object in its group or layout.&lt;br /&gt;
* '''w''' - (int) The width of the object in its group or layout.&lt;br /&gt;
* '''h''' - (int) The height of the object in its group or layout.&lt;br /&gt;
* '''relatx''' - (int) This [0,2] integer determines if the X position should be calculated by normal (&amp;quot;0&amp;quot;), relative (&amp;quot;1&amp;quot;) or proportional (&amp;quot;2&amp;quot;) units.  See below.&lt;br /&gt;
* '''relaty''' - (int) This [0,2] integer determines if the Y position should be calculated by normal (&amp;quot;0&amp;quot;), relative (&amp;quot;1&amp;quot;) or proportional (&amp;quot;2&amp;quot;) units.  See below.&lt;br /&gt;
* '''relatw''' - (int) This [0,2] integer determines if the width should be calculated by normal (&amp;quot;0&amp;quot;), relative (&amp;quot;1&amp;quot;) or proportional (&amp;quot;2&amp;quot;) units.  See below.&lt;br /&gt;
* '''relath''' - (int) This [0,2] integer determines if the height should be calculated by normal (&amp;quot;0&amp;quot;), relative (&amp;quot;1&amp;quot;) or proportional (&amp;quot;2&amp;quot;) units.  See below.&lt;br /&gt;
* '''fitparent''' - (bool) This parameter is used instead of x;y;w;h parameters and means that the object covers all the area of the parent object.&lt;br /&gt;
* '''x1''' - (int)  The X position of the left edge of the object in its group or layout.  Only works inside definitions with design_w parameters set.&lt;br /&gt;
* '''y1''' - (int) The Y position of the top edge of the object in its group or layout.  Only works inside definitions with design_h parameters set.&lt;br /&gt;
* '''x2''' - (int)  The X position of the right edge of the object in its group or layout.  Only works inside definitions with design_w parameters set.&lt;br /&gt;
* '''y2''' - (int) The Y position of the bottom edge of the object in its group or layout.  Only works inside definitions with design_h parameters set.&lt;br /&gt;
* '''anchor''' - (str) A list of one or more of the following keywords, delimited by the pipe (|) character: &amp;quot;top|bottom|left|right&amp;quot; these anchors work with x1/y1/x2/y2 positioning to fix the edge of the object its distance from the edges of the group or layout which contains it.&lt;br /&gt;
* '''sysmetricsx''' - (bool) This flag will cause this object to be resized by having its X position multiplied by the OS scalar coefficient.&lt;br /&gt;
* '''sysmetricsy''' - (bool) This flag will cause this object to be resized by having its Y position multiplied by the OS scalar coefficient. &lt;br /&gt;
* '''sysmetricsw''' - (bool) This flag will cause this object to be resized by having its width multiplied by the OS scalar coefficient.&lt;br /&gt;
* '''sysmetricsh''' - (bool) This flag will cause this object to be resized by having its height multiplied by the OS scalar coefficient.&lt;br /&gt;
* '''rectrgn''' - (bool) Setting this flag causes the engine to ignore the object's region for handling &amp;quot;mouse over object&amp;quot; detection and only use the bounding rectangle. &lt;br /&gt;
* '''regionop''' - (int) An integer enumeration [-2,1] for what kind of region-operation to perform with this object's calculated region against its parent's region.  See below for more information. &lt;br /&gt;
* '''sysregion''' - (int) Param alias for regionop.&lt;br /&gt;
* '''wantfocus''' - (bool) This flag determines whether or not an object ever gets the focus at all.&lt;br /&gt;
* '''focusonclick''' - (bool)  This flag determines whether or not an object gets the focus when clicked. &lt;br /&gt;
* '''taborder''' - (int) This value indicates the &amp;quot;tab order&amp;quot; of the object within the group or layout in which it resides.  When the user hits the tab key, the interface focus moves to the next greater object in tab order.  Objects with equal tab order will be ordered in the reverse of their insertion order in XML (last object in is first in default tab order). &lt;br /&gt;
* '''nodblclick''' - (bool) This flag blocks doubleclick events from being received by this object.&lt;br /&gt;
* '''noleftclick''' - (bool) This flag blocks left click events from being received by this object.&lt;br /&gt;
* '''norightclick''' - (bool) This flag blocks right click events from being received by this object.&lt;br /&gt;
* '''nomousemove''' - (bool) This flag blocks mouse move events from being received by this object.&lt;br /&gt;
* '''nocontextmenu''' - (bool) This flag blocks the main context menu from being displayed for rightclick.&lt;br /&gt;
* '''ghost''' - (bool) This flag causes the object to be transparent to all user interface events such that all the mouse messages pass to the object(s) visibly underneath it.&lt;br /&gt;
* '''notify'''(0-9) - (str) A string to be used as a parameter to the onNotify event for the object upon instantiation.  The notify strings 0-9 will be sent in order.&lt;br /&gt;
* '''droptarget''' - (id)  The id of an object to which all of this object's drag and drop events will be redirected.&lt;br /&gt;
&lt;br /&gt;
==='''Appendixes'''===&lt;br /&gt;
*'''[[Wasabi Appendix: ConfigAttrib | Appendix: ConfigAttrib]]'''&lt;br /&gt;
*'''[[Wasabi Appendix: Cursors | Appendix: Cursors]]'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;button/&amp;gt; &amp;amp; &amp;lt;togglebutton/&amp;gt;==&lt;br /&gt;
The button is a simple concept in Wasabi - you push it, it activates something.  It can either be used as a substrate for a script (ie: put a script and a button in the same groupdef, and you can handle complex button functionality with the script) or it can be used by itself to launch an action into the system when pressed.  You can implement your own action handlers in code, but some global actions predefined to be handled by the system are also available.&lt;br /&gt;
&lt;br /&gt;
* '''image''' - (id) The id of the bitmap element to display in its &amp;quot;normal&amp;quot; state. &lt;br /&gt;
* '''downimage''' - (id) The id of the bitmap element to display when the user is pressing down on the button.&lt;br /&gt;
* '''hoverimage''' - (id) The id of the bitmap element to display when the user is hovering the mouse over the button.&lt;br /&gt;
* '''activeimage''' - (id) The id of the bitmap element to display when the object is in its &amp;quot;active&amp;quot; state (usually only used by togglebutton, but available on the basic button object to allow the user to create extended functionality in script).&lt;br /&gt;
* '''text''' - (str) A string of text to be rendered on top of the button's currrent state image.  In this way, you can create a single button graphic and reuse it to create internationally localizable buttons.&lt;br /&gt;
* '''action''' - (str) The action to fire if the button is clicked (when it enters into its downstate).&lt;br /&gt;
* '''param''' - (str) The param to go with the action fired if the button is clicked.&lt;br /&gt;
* '''borders''' - (bool) Set this flag if you want to be a styled button.&lt;br /&gt;
* '''style''' - (str) Set the style value if you set the borders flag, to tell wasabi what type of button style you want.&lt;br /&gt;
** &amp;quot;button_normal&amp;quot; &amp;quot;osbutton_normal&amp;quot; &amp;quot;osbutton_close&amp;quot; &amp;quot;osbutton_minimize&amp;quot; and &amp;quot;osbutton_maximize&amp;quot;&lt;br /&gt;
* '''retcode''' - (int) Specifies the &amp;quot;modal return code&amp;quot; for the button.  Only valid with the &amp;quot;endmodal&amp;quot; system action.&lt;br /&gt;
* '''cbtarget''' - (id) The optional &amp;quot;component bucket target&amp;quot; for this button.  Only valid with &amp;quot;cb_next&amp;quot; or &amp;quot;cb_prev&amp;quot; system actions.  A componentbucket is another name for the thinger -- this allows you to have targetted button controls for more than one componentbucket in a user interface.&lt;br /&gt;
* '''action_target''' - (id) This will send the specified action only to the object whose id is listed here.  The param parameter is ignored in this case and this string is sent as the param data for the action.  Most objects don't understand being sent actions (this is an extended functionality), so this won't do anything in most cases.&lt;br /&gt;
* '''center_image''' - (bool) Setting this flag causes the image to be centered against the object rectangle.  This parameter is only important when both borders and an image are specified on a single object. &lt;br /&gt;
&lt;br /&gt;
 Example:&lt;br /&gt;
 &amp;lt;button x=&amp;quot;50&amp;quot; y=&amp;quot;10&amp;quot; action=&amp;quot;VID_FS&amp;quot; image=&amp;quot;vis.fs.1&amp;quot; hoverImage=&amp;quot;vis.fs.2&amp;quot; downImage=&amp;quot;vis.fs.3&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;button x=&amp;quot;10&amp;quot; y=&amp;quot;40&amp;quot; w=&amp;quot;100&amp;quot; h=&amp;quot;20&amp;quot; borders=&amp;quot;1&amp;quot; style=&amp;quot;osbutton_normal&amp;quot; text=&amp;quot;Click Here&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==='''Appendix'''===&lt;br /&gt;
* '''[[Wasabi Appendix: Action List | Appendix: Action List]]'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;nstatesbutton/&amp;gt;==&lt;br /&gt;
The nstatesbutton is a specialized kind of togglebutton whose purpose is to cycle through a number of different visual states.  The parameters beyond togglebutton that it implements are:&lt;br /&gt;
* '''nstates''' - (int) The number of discrete states in which the object may exist.&lt;br /&gt;
* '''cfgvals''' - (str) A semicolon delimited list of values to represent custom config values for the multiple states.  Default is the current state number.  See below.&lt;br /&gt;
The nstatesbutton uses special handling of the image, downimage, hoverimage, and activeimage parameters expressed by the button object (from which this object is derived).  The nstatesbutton will actually append the state number to the four image parameter strings to calculate the bitmap ids to be loaded for the current object state.  Remember, like most everything else in a computer, this &amp;quot;current state value&amp;quot; counts from 0 and is therefore in the range [0, nstates-1].&lt;br /&gt;
 &lt;br /&gt;
If the object is bound to a configuration attribute, that attribute will be set with a cfgval every time the nstatesbutton transitions to a new state.  If the cfgvals parameter is not set, the attribute will simply be set with the current state value.  If the cfgvals parameter is set, it will parse the string and set the config attrib with the n'th substring corresponding to the current state value.&lt;br /&gt;
 &lt;br /&gt;
The following snippet fully describes two nstatesbutton objects with three states each, one using full images for its visual display, one using themed Wasabi borders with three different state logos:&lt;br /&gt;
 &amp;lt;elements&amp;gt;&lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;nimg0&amp;quot;/&amp;gt; &lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;dimg0&amp;quot;/&amp;gt; &lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;himg0&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;nimg1&amp;quot;/&amp;gt; &lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;dimg1&amp;quot;/&amp;gt; &lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;himg1&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;nimg2&amp;quot;/&amp;gt; &lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;dimg2&amp;quot;/&amp;gt; &lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;himg2&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;logo0&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;logo1&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;logo2&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/elements&amp;gt;&lt;br /&gt;
 &amp;lt;groupdef id=&amp;quot;some.random.groupdef&amp;quot;&amp;gt;&lt;br /&gt;
 	&amp;lt;nstatesbutton id=&amp;quot;three.freeform.states&amp;quot;&lt;br /&gt;
 		nstates=&amp;quot;3&amp;quot; cfgvals=&amp;quot;one;two;three&amp;quot;&lt;br /&gt;
 		image=&amp;quot;nimg&amp;quot; downimage=&amp;quot;dimg&amp;quot; hoverimage=&amp;quot;himg&amp;quot;&lt;br /&gt;
 	/&amp;gt;&lt;br /&gt;
 	&amp;lt;nstatesbutton id=&amp;quot;three.themed.states&amp;quot;&lt;br /&gt;
 		nstates=&amp;quot;3&amp;quot; image=&amp;quot;logo&amp;quot; borders=&amp;quot;1&amp;quot; center_image=&amp;quot;1&amp;quot;&lt;br /&gt;
 	/&amp;gt;&lt;br /&gt;
 &amp;lt;/groupdef&amp;gt;&lt;br /&gt;
If the &amp;quot;three.freeform.states&amp;quot; nstatesbutton were assigned to a configattrib, that attribute would be filled with the values &amp;quot;one&amp;quot; &amp;quot;two&amp;quot; and &amp;quot;three&amp;quot; in order.  If the &amp;quot;three.themed.states&amp;quot; were instead assigned to a configattrib, it would be filled with the default values &amp;quot;0&amp;quot; &amp;quot;1&amp;quot; and &amp;quot;2&amp;quot; in order.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;images/&amp;gt;==&lt;br /&gt;
The images object is object that displays a certain image based on the position of a slider. This object is very similar to [[Animationlayer]] except that this animation's current frame will be determined by the position of a slider.  An example of implementation is the old Classic Winamp skins where the volume slider background changes colour from green to red depending on its position (0%-100%). This object is currently under development and not all sliders are supported. Currently only Volume and Panning(Balance) sliders can be used as sources.&lt;br /&gt;
&lt;br /&gt;
* '''images''' - (id) A bitmap element for the array of images that will be used.&lt;br /&gt;
* '''source''' - (id) Id of the slider that will determine the current animation frame.&lt;br /&gt;
* '''imagesspacing''' - (int) The hight of each animation frame in the bitmap element. This will determine the total number of frames, (300/15=20)&lt;br /&gt;
&lt;br /&gt;
 Example:&lt;br /&gt;
 &amp;lt;images source=&amp;quot;volume&amp;quot; x=&amp;quot;0&amp;quot; y=&amp;quot;0&amp;quot; w=&amp;quot;68&amp;quot; h=&amp;quot;13&amp;quot;&lt;br /&gt;
 images=&amp;quot;main.volpan.volume&amp;quot; imagesspacing=&amp;quot;15&amp;quot;/&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;images source=&amp;quot;balance&amp;quot; x=&amp;quot;73&amp;quot; y=&amp;quot;0&amp;quot; w=&amp;quot;38&amp;quot; h=&amp;quot;13&amp;quot;&lt;br /&gt;
 images=&amp;quot;main.volpan.balance&amp;quot; imagesspacing=&amp;quot;15&amp;quot;/&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
 &amp;lt;slider id=&amp;quot;Volume&amp;quot; action=&amp;quot;VOLUME&amp;quot; x=&amp;quot;1&amp;quot; y=&amp;quot;0&amp;quot; w=&amp;quot;68&amp;quot; h=&amp;quot;13&amp;quot;&lt;br /&gt;
 thumb=&amp;quot;main.volpan.thumb&amp;quot; downThumb=&amp;quot;main.volpan.thumb.pressed&amp;quot;/&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;slider id=&amp;quot;Pan&amp;quot; action=&amp;quot;PAN&amp;quot; x=&amp;quot;74&amp;quot; y=&amp;quot;0&amp;quot; w=&amp;quot;38&amp;quot; h=&amp;quot;13&amp;quot;&lt;br /&gt;
 thumb=&amp;quot;main.volpan.thumb&amp;quot; downThumb=&amp;quot;main.volpan.thumb.pressed&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;PlaylistDirectory/&amp;gt;==&lt;br /&gt;
The PlaylistDirectory object is simply a list with all the saved playlist from the media library. Please remember that this object is always on top of other objects, so you'll have to hide it via maki if you dont want it to be visible. This object was introduced in Winamp 5.5(skinversion 1.3)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;AlbumArt/&amp;gt;==&lt;br /&gt;
The AlbumArt object is a simple GuiObject that displays a picture of the album cover of the song thats playing in Winamp. Please note that if you want do something to this object in a maki script you'll have to define it as a guiobject and not as a layer.&lt;br /&gt;
* '''notfoundImage''' - (id) A bitmap element that used if Winamp cant find any cover for the song.&lt;br /&gt;
* '''align''' - (str) One of the following three possible strings: &amp;quot;left&amp;quot; &amp;quot;center&amp;quot; &amp;quot;right&amp;quot; -- Default is &amp;quot;left&amp;quot;.&lt;br /&gt;
* '''valign''' - (str) One of the following three possible strings: &amp;quot;top&amp;quot; &amp;quot;center&amp;quot; &amp;quot;bottom&amp;quot; -- Default is &amp;quot;top&amp;quot;.&lt;br /&gt;
* '''source''' - (str) Path+Filename of file that you want to display in this object.&lt;br /&gt;
* '''stretched''' - (bool) Stretch the albumart to the size of the object.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;grid/&amp;gt;==&lt;br /&gt;
The grid object is a very nice object for creating stretchable images that still look good on the edges.  It is a graphic, like a layer, but unlike layer it is created by applying nine different bitmaps, stretching five of them.  There are, as you might guess, nine parameters&lt;br /&gt;
&lt;br /&gt;
* '''topleft''' - (id) A bitmap element for the top left section of the grid.&lt;br /&gt;
* '''top''' - (id) A bitmap element for the top middle section of the grid.&lt;br /&gt;
* '''topright''' - (id) A bitmap element for the top right section of the grid.&lt;br /&gt;
* '''left''' - (id) A bitmap element for the middle left section of the grid.&lt;br /&gt;
* '''middle''' - (id) A bitmap element for the center section of the grid.&lt;br /&gt;
* '''right''' - (id) A bitmap element for the middle right section of the grid.&lt;br /&gt;
* '''bottomleft''' - (id) A bitmap element for the bottom left section of the grid.&lt;br /&gt;
* '''bottom''' - (id) A bitmap element for the bottom middle section of the grid.&lt;br /&gt;
* '''bottomright''' - (id) A bitmap element for the bottom right section of the grid. &lt;br /&gt;
&lt;br /&gt;
Essentially, the given rectangle of the grid is intersected with 2 horizontal and 2 vertical lines.  The topleft, topright, bottomleft, and bottomright bitmap elements will not be resized.  The top, left, middle, right, and bottom bitmap elements, however, will be stretched to make all fit the grid rectangle.  Using intelligently sized bitmap elements is fairly critical for this object.  If you're having trouble, try starting with all of your bitmap elements as equal-sized squares.&lt;br /&gt;
&lt;br /&gt;
 Example:&lt;br /&gt;
 &amp;lt;grid x=&amp;quot;70&amp;quot; y=&amp;quot;25&amp;quot; w=&amp;quot;-74&amp;quot; relatw=&amp;quot;1&amp;quot; h=&amp;quot;20&amp;quot; topleft=&amp;quot;main.text.left&amp;quot; top=&amp;quot;main.text.center&amp;quot; topright=&amp;quot;main.text.right&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;Winamp:Browser/&amp;gt;==&lt;br /&gt;
This is basically the browser you'll see in the Bento Winamp skin. You'll also need Winamp 5.54 (skinversion 1.34) for it to work.&lt;br /&gt;
&lt;br /&gt;
- '''home''' - (str) Url for the default homepage for the browser xui.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;browser/&amp;gt;==&lt;br /&gt;
The browser object embeds an external browser technology window (such as IE or Mozilla) into the user interface with which you can load and render HTML directly.&lt;br /&gt;
* '''url''' - (str) The url to be displayed.&lt;br /&gt;
* '''mainmb''' - (bool) Setting this flag makes this browser object the &amp;quot;main mini-browser&amp;quot; for the system.&lt;br /&gt;
* '''targetname''' - (str) This allows this browser object to be set as a specific HTML target.&lt;br /&gt;
* '''scrollbars''' - (str) An enumerated string to determine how the system should handle the embedded browser's scrollbars.  See below.&lt;br /&gt;
Numerous interfaces in Wasabi refer to or control the &amp;quot;main&amp;quot; mini-browser.  Setting the mainmb flag will cause the last browser object which processed its mainmb param to be the main.  In other words, please don't set this flag on more than one object if you actually care which one is the main.&lt;br /&gt;
Scrollbars are important for big browser windows, but can interfere with the simple rendering of HTML content as part of a Wasabi UI.  To this end, the skinner can control how the scrollbars of the embedded browser are displayed by setting the scrollbars parameter to one of the following four string values: &amp;quot;auto&amp;quot; &amp;quot;never&amp;quot; &amp;quot;always&amp;quot; or &amp;quot;default&amp;quot; - default is to allow the HTML page to specify, all others override.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;Wasabi:Frame/&amp;gt;==&lt;br /&gt;
The Wasabi:Frame object is a themed control whose purpose is to provide a movable interface between two rectangular areas, much like the concept of an HTML frame.  Here are its parameters:&lt;br /&gt;
&lt;br /&gt;
* '''orientation''' - (str) One of the following four string values: &amp;quot;v&amp;quot; &amp;quot;vertical&amp;quot; &amp;quot;h&amp;quot; &amp;quot;horizontal&amp;quot; (Default is vertical).&lt;br /&gt;
* '''left''' - (id) The group to be instantiated in the left or top frame.&lt;br /&gt;
* '''right''' - (id) The group to be instantiated in the right or bottom frame.&lt;br /&gt;
* '''top''' - (id) The group to be instantiated in the left or top frame.&lt;br /&gt;
* '''bottom''' - (id) The group to be instantiated in the right or bottom frame.&lt;br /&gt;
* '''from''' - (str) One of the following string values: &amp;quot;l&amp;quot; &amp;quot;left&amp;quot; &amp;quot;t&amp;quot; &amp;quot;top&amp;quot; or &amp;quot;r&amp;quot; &amp;quot;right&amp;quot; &amp;quot;b&amp;quot; &amp;quot;bottom&amp;quot; (Default is left).&lt;br /&gt;
* '''width''' - (int) How many pixels from the chosen edge to start.&lt;br /&gt;
* '''height''' - (int) How many pixels from the chosen edge to start.&lt;br /&gt;
* '''resizable''' - (bool) Set this flag to allow the user to change the position of the framedivider.  Default is to allow it to be resizable.&lt;br /&gt;
* '''maxwidth''' - (int) The maximum amount of pixels you are able to move the poppler if resizable.&lt;br /&gt;
* '''minwidth''' - (int) The minimum amount of pixels you are able to move the poppler if resizable (If you go below this value the poppler will snap to 0).&lt;br /&gt;
* '''vgrabber''' - (string) The centered bitmap of the Grabber.&lt;br /&gt;
* '''vbitmap''' - (string) The stretched bitmap of the Grabber.&lt;br /&gt;
&lt;br /&gt;
In the following simple example, the &amp;quot;top&amp;quot; and &amp;quot;bottom&amp;quot; groups are displayed in a resizable frame object:&lt;br /&gt;
 &amp;lt;groupdef id=&amp;quot;top&amp;quot;&amp;gt;&lt;br /&gt;
 	&amp;lt;text text=&amp;quot;Top&amp;quot; align=&amp;quot;center&amp;quot; x=&amp;quot;0&amp;quot; y=&amp;quot;0&amp;quot; w=&amp;quot;0&amp;quot; h=&amp;quot;0&amp;quot; relatw=&amp;quot;1&amp;quot; relath=&amp;quot;1&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/groupdef&amp;gt;&lt;br /&gt;
 &amp;lt;groupdef id=&amp;quot;bottom&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;text text=&amp;quot;Bottom&amp;quot; align=&amp;quot;center&amp;quot; x=&amp;quot;0&amp;quot; y=&amp;quot;0&amp;quot; w=&amp;quot;0&amp;quot; h=&amp;quot;0&amp;quot; relatw=&amp;quot;1&amp;quot; relath=&amp;quot;1&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/groupdef&amp;gt;&lt;br /&gt;
 &amp;lt;groupdef id=&amp;quot;both&amp;quot;&amp;gt;&lt;br /&gt;
 	&amp;lt;Wasabi:Frame&lt;br /&gt;
 		orientation=&amp;quot;horizontal&amp;quot;&lt;br /&gt;
 		top=&amp;quot;top&amp;quot; bottom=&amp;quot;bottom&amp;quot;    &lt;br /&gt;
 		x=&amp;quot;0&amp;quot; y=&amp;quot;0&amp;quot; w=&amp;quot;0&amp;quot; h=&amp;quot;0&amp;quot;&lt;br /&gt;
 		relatw=&amp;quot;1&amp;quot; relath=&amp;quot;1&amp;quot;&lt;br /&gt;
 	/&amp;gt;&lt;br /&gt;
 &amp;lt;/groupdef&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;Wasabi:CheckBox/&amp;gt;==&lt;br /&gt;
The Wasabi:Checkbox object exists only as a namespaced object because it is expected to have only a single themed appearance.  The Wasabi:Checkbox object is used for both checkbox functionality and radiobutton functionality, depending up on the specification of its parameters.  It consists of a combination of a togglebutton and a text object to create a single functional user interface object.&lt;br /&gt;
* '''text''' - (str) The text to display as part of the checkbox.&lt;br /&gt;
* '''radioid''' - (id) If the button is to be used as part of a radio group, specify id of the parent Wasabi:RadioGroup object here.&lt;br /&gt;
* '''radioval''' - (int) If the button is to be used as part of a radio group, specify its unique integer value here.&lt;br /&gt;
* '''action''' - (str) see button.&lt;br /&gt;
* '''param''' - (str) see button.&lt;br /&gt;
* '''action_target''' - (id) see button.&lt;br /&gt;
As with togglebutton, this is a very useful object for binding to a configuration attribute. It is very popular in preferences interfaces. If the object has a value for radioval, that will be the value set into the attribute if the object is activated.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;Wasabi:DropDownList/&amp;gt;==&lt;br /&gt;
The Wasabi:DropDownList is a themed dialog object.  It may be statically filled via a parameter or dynamically through script or by binding it to a text feed from code.  A Wasabi:DropDownList object may be bound to an integer configuration attribute.&lt;br /&gt;
* '''items''' - (str) A semicolon delimited list of items to be displayed in the dropdown area.&lt;br /&gt;
* '''feed''' - (id) The id of a text feed to provide a semicolon delimited list of items to be displayed in the dropdown area.&lt;br /&gt;
* '''select''' - (int) Specifies an item to be selected.&lt;br /&gt;
* '''listheight''' - (int) Allows the skinner to specify the height of the dropdown area in pixels.&lt;br /&gt;
* '''maxitems''' - (int) Allows the skinner to specify the max height of the dropdown area in lines of text.  If the dropdown area has fewer lines of text than this value when this value is set, the dropdown area is sized to show no more than is needed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;Wasabi:ComboBox/&amp;gt;==&lt;br /&gt;
The Wasabi:ComboBox is a special type of object which combines dropdownlist functionality with an edit field as well.  It has the same parameters as Wasabi:DropDownList.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;Wasabi:HistoryEditBox/&amp;gt;==&lt;br /&gt;
The Wasabi:HistoryEditBox is an even more specialized version of this object family, its only purpose is to remember the last 64 items of text typed into it.  It has one extra parameter over Wasabi:DropDownList: &lt;br /&gt;
* '''navbuttons''' - (bool) Setting this flag will include the navigation buttons on the object.  Default is to have the buttons.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;componentbucket/&amp;gt;==&lt;br /&gt;
The componentbucket is a fancy name for the Thinger.  More precisely, in Winamp3, the &amp;quot;Thinger Window&amp;quot; is a window which implements a very simple horizontal componentbucket.  The object itself may be instantiated horizontally or vertically and the scrolling of the display within it should be controlled by button objects using &amp;quot;cb_next&amp;quot; and &amp;quot;cb_prev&amp;quot; action parameters and setting the cbtarget parameter to this object.  The object has the following parameters:&lt;br /&gt;
* '''leftmargin''' - (int) The number of extra pixels to pad the left (or top) edge of the total component bucket scrolling display.&lt;br /&gt;
* '''rightmargin''' - (int) The number of extra pixels to pad the right (or bottom) edge of the total component bucket scrolling display.&lt;br /&gt;
* '''spacing''' - (int) The number of extra pixels to place between each bucket icon.&lt;br /&gt;
* '''vertical''' - (bool) Whether or not the display should scroll vertically or horizontally.  Default is horizontal.&lt;br /&gt;
A simple &amp;quot;thinger group&amp;quot; follows:&lt;br /&gt;
 &amp;lt;groupdef id=&amp;quot;some.thinger.group.thing&amp;quot;&amp;gt;&lt;br /&gt;
 	&amp;lt;button id=&amp;quot;mythinger.up&amp;quot; x=&amp;quot;0&amp;quot; y=&amp;quot;0&amp;quot;&lt;br /&gt;
 		h=&amp;quot;20&amp;quot; w=&amp;quot;0&amp;quot; relatw=&amp;quot;1&amp;quot;&lt;br /&gt;
 		image=&amp;quot;mythinger.up.normal&amp;quot; &lt;br /&gt;
 		hoverimage=&amp;quot;mythinger.up.hover&amp;quot; &lt;br /&gt;
 		downimage=&amp;quot;mythinger.up.down&amp;quot;&lt;br /&gt;
 		action=&amp;quot;CB_PREV&amp;quot; cbtarget=&amp;quot;mythinger&amp;quot;&lt;br /&gt;
 	/&amp;gt;&lt;br /&gt;
 	&amp;lt;button id=&amp;quot;mythinger.down&amp;quot; x=&amp;quot;0&amp;quot; y=&amp;quot;-20&amp;quot;&lt;br /&gt;
 		h=&amp;quot;20&amp;quot; w=&amp;quot;0&amp;quot; relatw=&amp;quot;1&amp;quot; relaty=&amp;quot;1&amp;quot;&lt;br /&gt;
 		image=&amp;quot;mythinger.down.normal&amp;quot; &lt;br /&gt;
 		hoverimage=&amp;quot;mythinger.down.hover&amp;quot; &lt;br /&gt;
 		downimage=&amp;quot;mythinger.down.down&amp;quot;&lt;br /&gt;
 		action=&amp;quot;CB_NEXT&amp;quot; cbtarget=&amp;quot;mythinger&amp;quot;&lt;br /&gt;
 	/&amp;gt;&lt;br /&gt;
 	&amp;lt;componentbucket id=&amp;quot;mythinger&amp;quot; vertical=&amp;quot;1&amp;quot; x=&amp;quot;0&amp;quot; y=&amp;quot;20&amp;quot; w=&amp;quot;0&amp;quot; h=&amp;quot;-40&amp;quot; relath=&amp;quot;1&amp;quot;/&amp;gt; &lt;br /&gt;
 &amp;lt;/groupdef&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;customobject/&amp;gt;==&lt;br /&gt;
The customobject is a useful tool for temporarily instantiating a group into a user interface.  It has only one parameter:&lt;br /&gt;
groupid - (id) Instantiate the specified group into my defined area.&lt;br /&gt;
By finding your customobject in script and simply calling setXmlParam on it to give it new values for groupid, you can switch between the instantiation of multiple groups in a single user interface space.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;edit/&amp;gt; &amp;amp; &amp;lt;Wasabi:EditBox/&amp;gt;==&lt;br /&gt;
The edit control is, as you might guess, a text entry field. Some versions of Wasabi currently embed an OS edit control into the rectangular area defined by this object.  This embedded control will not blend properly with the rest of the skin's painting, it will always paint on top of everything else.  Keep this in mind when developing skins for widest compatibility.&lt;br /&gt;
* '''text''' - (str) Set the text in the edit field to this value.&lt;br /&gt;
* '''action''' - (str) Will accept the string &amp;quot;mb_url&amp;quot; to cause this edit box to automatically send its value as an url to the main minibrowser.&lt;br /&gt;
* '''multiline''' - (bool) Determines if the box is a single or multiple line input style.&lt;br /&gt;
* '''vscroll''' - (bool) Causes the edit window to have a vertical scroller.  Default is off.&lt;br /&gt;
* '''autohscroll''' - (bool) Causes the horizontal area to scroll if necessary.  Default is on.&lt;br /&gt;
* '''autoenter''' - (bool) Causes the system to automatically send a &amp;quot;done&amp;quot; event when the user stops typing past a certain timeout.  Default is off.&lt;br /&gt;
* '''password''' - (bool) Causes the echoed characters to be single marks for password purposes.  Default is off.&lt;br /&gt;
An edit object may be bound to a string configuration attribute.&lt;br /&gt;
 &lt;br /&gt;
Here's the definition of Wasabi:EditBox:&lt;br /&gt;
 &amp;lt;groupdef&lt;br /&gt;
 	id=&amp;quot;wasabi.edit&amp;quot; h=&amp;quot;20&amp;quot;&lt;br /&gt;
 	inherit_group=&amp;quot;wasabi.objectframe.group&amp;quot;&lt;br /&gt;
 	xuitag=&amp;quot;Wasabi:EditBox&amp;quot; embed_xui=&amp;quot;wasabi.edit.box&amp;quot;&lt;br /&gt;
 &amp;gt;&lt;br /&gt;
 	&amp;lt;edit id=&amp;quot;wasabi.edit.box&amp;quot; x=&amp;quot;1&amp;quot; y=&amp;quot;1&amp;quot; w=&amp;quot;-2&amp;quot; h=&amp;quot;-2&amp;quot; relatw=&amp;quot;1&amp;quot; relath=&amp;quot;1&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/groupdef&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;grid/&amp;gt;==&lt;br /&gt;
The grid object is a very nice object for creating stretchable images that still look good on the edges.  It is a graphic, like a layer, but unlike layer it is created by applying nine different bitmaps, stretching five of them.  There are, as you might guess, nine parameters&lt;br /&gt;
&lt;br /&gt;
* '''topleft''' - (id) A bitmap element for the top left section of the grid.&lt;br /&gt;
* '''top''' - (id) A bitmap element for the top middle section of the grid.&lt;br /&gt;
* '''topright''' - (id) A bitmap element for the top right section of the grid.&lt;br /&gt;
* '''left''' - (id) A bitmap element for the middle left section of the grid.&lt;br /&gt;
* '''middle''' - (id) A bitmap element for the center section of the grid.&lt;br /&gt;
* '''right''' - (id) A bitmap element for the middle right section of the grid.&lt;br /&gt;
* '''bottomleft''' - (id) A bitmap element for the bottom left section of the grid.&lt;br /&gt;
* '''bottom''' - (id) A bitmap element for the bottom middle section of the grid.&lt;br /&gt;
* '''bottomright''' - (id) A bitmap element for the bottom right section of the grid. &lt;br /&gt;
&lt;br /&gt;
Essentially, the given rectangle of the grid is intersected with 2 horizontal and 2 vertical lines.  The topleft, topright, bottomleft, and bottomright bitmap elements will not be resized.  The top, left, middle, right, and bottom bitmap elements, however, will be stretched to make all fit the grid rectangle.  Using intelligently sized bitmap elements is fairly critical for this object.  If you're having trouble, try starting with all of your bitmap elements as equal-sized squares.&lt;br /&gt;
&lt;br /&gt;
 Example:&lt;br /&gt;
 &amp;lt;grid x=&amp;quot;70&amp;quot; y=&amp;quot;25&amp;quot; w=&amp;quot;-74&amp;quot; relatw=&amp;quot;1&amp;quot; h=&amp;quot;20&amp;quot; topleft=&amp;quot;main.text.left&amp;quot; top=&amp;quot;main.text.center&amp;quot; topright=&amp;quot;main.text.right&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;group/&amp;gt;==&lt;br /&gt;
Groups are instantiated by using the group tag.  Groups, when instantiated within a layout or some other groupdef, take the standard GuiObject params in order to define the group's instantiated size and properties, and then all of the contents of the group will be instantiated within the space it defines.  At instantiation, a group will express a specified boundary rectangle and, thus, the positions of objects within it depending upon relative, proportional, or design coordinate systems may then be calculated.&lt;br /&gt;
 &lt;br /&gt;
To specify which groupdef to instantiate, set the id parameter of the group tag to the id of the desired groupdef.  The instantiation of each group can be so customized, however, group instantiates also may be assigned their own custom id to allow each instantiate to be found by code or script:&lt;br /&gt;
* '''id''' (id) - The groupdef to be instantiated.&lt;br /&gt;
* '''instance_id''' (str) - A new id value with which to be able find this particular instantiate.&lt;br /&gt;
&lt;br /&gt;
The following snippet will create two instantiates of the source group, with one specially customized (in the assumption that the &amp;quot;specialchild.maki&amp;quot; script will be handling the fact one is going to be special) :&lt;br /&gt;
 &amp;lt;groupdef id=&amp;quot;child&amp;quot;&amp;gt;&lt;br /&gt;
 	&amp;lt;layer image=&amp;quot;childimg&amp;quot; x=&amp;quot;0&amp;quot; y=&amp;quot;0&amp;quot; w=&amp;quot;0&amp;quot; h=&amp;quot;0&amp;quot; relatw=&amp;quot;0&amp;quot; relath=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/groupdef&amp;gt;&lt;br /&gt;
 &amp;lt;groupdef id=&amp;quot;parent&amp;quot;&amp;gt;&lt;br /&gt;
 	&amp;lt;group id=&amp;quot;child&amp;quot; x=&amp;quot;0&amp;quot; y=&amp;quot;0&amp;quot; w=&amp;quot;0&amp;quot; relatw=&amp;quot;0&amp;quot; h=&amp;quot;90&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;group id=&amp;quot;child&amp;quot; instance_id=&amp;quot;special&amp;quot;&lt;br /&gt;
 		notify=&amp;quot;This is a special notification for this obj.&amp;quot;&lt;br /&gt;
 		x=&amp;quot;0&amp;quot; y=&amp;quot;90&amp;quot; w=&amp;quot;0&amp;quot; relatw=&amp;quot;0&amp;quot; h=&amp;quot;-90&amp;quot; relath=&amp;quot;1&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;script file=&amp;quot;specialchild.maki&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/groupdef&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;grouplist/&amp;gt;==&lt;br /&gt;
A grouplist is, oddly enough, an object whose purpose is to accept and display a list of multiple groups.  For instance, Wasabi's popup menu is a grouplist.  A grouplist is expected to be filled in script, and it has no interesting parameters.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;layer/&amp;gt;==&lt;br /&gt;
In Wasabi, the layer is analogous to the same-named object in photoshop.  It is simply a nice bitmap graphic to be displayed in the user interface (with the standard alpha and region effects available to all guiobject derived objects, based by default on the properties of the bitmap element it houses).  Here are its parameters:&lt;br /&gt;
* '''image''' - (id) The id of the bitmap element to be used for display.&lt;br /&gt;
* '''inactiveimage''' - (id) A secondary id to be displayed if this guiobject is set to &amp;quot;inactive&amp;quot; status.&lt;br /&gt;
* '''region''' - (id) The id of a different bitmap element to use as the source of this object's region.&lt;br /&gt;
* '''tile''' - (bool) Setting this flag will tile the image if the rectangular size of the layer is different than the rectangular size of the bitmap.  The default is to stretch.&lt;br /&gt;
* '''resize''' - (str) A specific string enumerating which direction one should allow the resizing of the parent layout if this object's region is gripped and dragged by the user. Incompatible with the move parameter on guiobject.  See below.&lt;br /&gt;
* '''scale''' - (str) A specific string enumerating which direction one should allow the scaling of the parent layout if this object's region is gripped and dragged by the user.  Incompatible with the move parameter on guiobject.  See below.&lt;br /&gt;
* '''dblclickaction''' - (str) The string of an action to be sent into the system if this object is doubleclicked within its region.&lt;br /&gt;
The resize and scale parameters transform the simple layer graphic into interactive gui objects in the system by enabling them to be dragged by the user to resize or change the scale of the parent layout.  The eight possible values for these parameters are &amp;quot;top&amp;quot; &amp;quot;left&amp;quot; &amp;quot;right&amp;quot; &amp;quot;bottom&amp;quot; &amp;quot;topleft&amp;quot; &amp;quot;topright&amp;quot; &amp;quot;bottomleft&amp;quot; and &amp;quot;bottomright.&amp;quot;  If both resize and scale are set on a single layer, the object will act as a resizer by default but as a scaler if the ALT key is held down.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;animatedlayer/&amp;gt;==&lt;br /&gt;
An animatedlayer is a series of frames of sprite animation displayed in the GUI.  The frames of animation are specified in the bitmap element which is given in the image parameter to this object.  The animation is expected to be a specific progression of frames of a fixed size, also to be specified via parameters on the object.  Each frame of animation will have its own region.    The animatedlayer object inherits directly from the layer object, so all of the above parameters are valid, along with these specific to animation:&lt;br /&gt;
* '''frameheight''' - (int) The height in pixels of each cell of animation.  If frameheight is set, the animation will be assumed to be a vertical strip of cells in the given bitmap.&lt;br /&gt;
* '''framewidth''' - (int) The width in pixels of each cell of animation.  If framewidth is set, the animation will be assumed to be a horizontal strip of cells in the given bitmap.&lt;br /&gt;
* '''elementframes''' - (int) The number of total frames of animation.  If this value is set, the animation will be assumed to be comprised of multiple bitmap elements whose ids are resolved by using the value of the image parameter as a printf-compatible formatting string with a single integer parameter.  See below.&lt;br /&gt;
* '''start''' - (int) The frame index which should be used as the beginning frame of the animation.  Default is the first frame of the defined animation list.&lt;br /&gt;
* '''end''' - (int) The frame index which should be used as the terminating frame of the animation.  Default is the last frame of the defined animation list.&lt;br /&gt;
* '''speed''' - (int) The delay in ms between each frame, on average.  Default is 200 ms.&lt;br /&gt;
* '''realtime''' - (bool) Setting this flag will force-redraw the animation area the moment the new frame is meant to be seen.  Default behaviour is to wait for and go along with the other invalidations from the rest of the UI on the main thread's draw loop.  Expect use of this flag to have a high impact on system performance on slower machines.  In other words, don't use it unless you know what you're doing.&lt;br /&gt;
* '''autoreplay''' - (bool) Setting this flag will cause the animation to repeat to the beginning frame once it has displayed the terminating frame of animation.  Default is ON.&lt;br /&gt;
* '''autoplay''' - (bool)  Setting this flag will cause the animation to begin playing the moment it is loaded into the user interface.  Default is OFF.  See below.&lt;br /&gt;
* '''debug''' - (bool)  Setting this flag will cause the system to draw the current frame number of the animation on top of the animation graphics, for, as you might guess, debug purposes.&lt;br /&gt;
&lt;br /&gt;
You must note that animations are usually meant to be &amp;quot;triggered&amp;quot; through script, as too many live animations happily blitting their way through a deep and complex user interface using lots of alpha blending, et al, can cause significant performance bottlenecks on slow computers (especially if your users aren't expecting your application to be eating all of the machine resources).  With this in mind, if you just create an animated layer and drop it into a skin, it will not begin animating unless you set the autoplay parameter.&lt;br /&gt;
 &lt;br /&gt;
There are three different ways to present animation frames to this object.  The frames may either all be concatenated into a vertical or horizontal &amp;quot;filmstrip&amp;quot; style bitmap element -- in which case the height or width of each animation cell (respectively) should be set with the frameheight or framewidth parameter.  &lt;br /&gt;
The third way to give this object its animation frames is more complex and consists of loading multiple bitmap elements with each bitmap representing one frame of animation.  This is done by first setting the elementframes parameter with the number of frames to be loaded, then by using a special formatting string as the image parameter.  For those familiar with the printf function, when the elementframes parameter is set, that integer will be run in a for loop and the image name will be used as the formatting string to a printf function that takes only the current integer in the for loop as a parameter.&lt;br /&gt;
For those unfamiliar with printf, this will seem a bit confusing.  Somewhere in the string you pass to the image parameter, you should have the two characters %d, and these characters will be replaced by the character representation of the number as it loads bitmap elements.  If you want to have 0-loaded prefix characters (for instance &amp;quot;01-09&amp;quot; instead of &amp;quot;1-9&amp;quot;), you can place %02d into your image parameter, and if there aren't enough characters in the number to make up 2 full digits, the number will be left-padded with the zero character.  You can just as easily use any number of padding characters as well.  &lt;br /&gt;
I highly suspect this all still makes little sense, so let me give you a simplified example (missing important parameters) to show three different animated layers each loading three sets of differently named bitmaps:&lt;br /&gt;
 &amp;lt;elements&amp;gt;&lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;bmp1&amp;quot;/&amp;gt; &lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;bmp2&amp;quot;/&amp;gt; &lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;bmp3&amp;quot;/&amp;gt; &lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;bmp01img&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;bmp02img&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;bmp03img&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;b00001mp&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;b00002mp&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;b00003mp&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/elements&amp;gt;&lt;br /&gt;
 &amp;lt;groupdef id=&amp;quot;whatever&amp;quot;&amp;gt;&lt;br /&gt;
 	&amp;lt;animatedlayer image=&amp;quot;bmp%d&amp;quot; elementframes=&amp;quot;3&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;animatedlayer image=&amp;quot;bmp%02dimg&amp;quot; elementframes=&amp;quot;3&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;animatedlayer image=&amp;quot;b%05dmp&amp;quot; elementframes=&amp;quot;3&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/groupdef&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;layoutstatus/&amp;gt;==&lt;br /&gt;
The layoutstatus implements the small statusbar that can be found at the bottom of many of the default normal layouts which can contain status text, appcmds buttons, and a proportionally completed progress bar.  The two parameters to this object control what appcmds will be allowed in the status bar:&lt;br /&gt;
* '''exclude''' - (str) A semicolon delimited list of names of appcmds which should not be shown by this control.&lt;br /&gt;
* '''include_only''' - (str) A semicolon delimited list of names of appcmds which will be the only appcmds allowed to be shown by this control.&lt;br /&gt;
For the most part, these layoutstatus objects are only controllable from code.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;list/&amp;gt;==&lt;br /&gt;
The list object is similar but not identical to the Win32 list common control.  It is an  optionally multicolumnar list whose purpose is to display multiple pieces of information per horizontal row.  It may be filled directly by encoding the contents in the XML, by attaching the object to a proper text feed, or by calling methods on the object from script.  The parameters for this object are:&lt;br /&gt;
* '''items''' - (str) A properly delimited string of data used to fill the list.  See below.&lt;br /&gt;
* '''multiselect''' - (bool) This flag, when set, allows the user to select multiple items in the list.  Default is to allow multiselect.&lt;br /&gt;
* '''autodeselect''' - (bool) This flag, when set, causes selection of any single item in the list to automatically deselect all other items in the list.  Default is to not autodeselect.&lt;br /&gt;
* '''select''' - (str) The text of a list item to be selected.&lt;br /&gt;
* '''antialias''' - (bool) Setting this flag causes the text to be rendered antialiased if possible.&lt;br /&gt;
* '''feed''' - (id) The id of a text feed to be used to fill this list.&lt;br /&gt;
* '''hoverselect''' - (bool) This flag causes list items to be selected if the user hovers over them.  Default is to not hoverselect.&lt;br /&gt;
* '''sort''' - (bool) This flag causes the list to sort itself.  Default is to not sort.&lt;br /&gt;
* '''selectonupdown''' - (bool) This flag causes the list to interpret the keyboard commands to mean &amp;quot;change my selection to the item.&amp;quot;  Default is to select on keyboard events.&lt;br /&gt;
* '''numcolumns''' - (int) How many columns to show.  Default is one.&lt;br /&gt;
* '''columwidths''' - (int) A semicolon delimited list of integers specifying how to size the column widths in this list.  See below.&lt;br /&gt;
* '''columnlabels''' - (str) A semicolon delimited list of strings to be used as the multiple column labels.&lt;br /&gt;
The list object depends upon being fed numerous strings with proper syntax in order to properly generate and populate a complex list display.  The syntax for the items parameter (which is the same syntax as the feed must provide) is to delimit each full row in the list with the ';' semicolon character and to delimit each column entry per row with the ',' character.  The columnwidths and columnlabels also require a semicolon (';') delimited list of data, one entry per column.  Note that if -1 is given as a width, those columns will be of dynamic width and split up the leftover pixels among themselves.  The default is one column with no labels and a width of -1.&lt;br /&gt;
 &lt;br /&gt;
Here is a sample list object with 3 rows and 3 columns:&lt;br /&gt;
 &amp;lt;list id=&amp;quot;three.by.three&amp;quot;&lt;br /&gt;
 	items=&amp;quot;row1,text,1;row2,moretext,2;row3,stilltext,3&amp;quot;&lt;br /&gt;
 	numcolumns=&amp;quot;3&amp;quot; columnwidths=&amp;quot;50,-1,50&amp;quot;&lt;br /&gt;
 	multiselect=&amp;quot;0&amp;quot; autodeselect=&amp;quot;1&amp;quot;&lt;br /&gt;
 /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;mouseredir/&amp;gt;==&lt;br /&gt;
This object simply redirects all mouse events from its region to the target object specified in the parameter:&lt;br /&gt;
* '''target''' - (id) The target object to get mouse events.&lt;br /&gt;
This is useful for when some objects get overlapped by nonfunctional graphics when laying out complex interfaces.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;Wasabi:RadioGroup/&amp;gt;==&lt;br /&gt;
The Wasabi:RadioGroup object is an invisible object whose purpose is to centralize the functionality of multiple Wasabi:CheckBox objects instantiated in radiobutton mode.  The radioid params on the Wasabi:CheckBox instantiates should give the id of one of these Wasabi:RadioGroup objects.  It has no unique parameters.  Here is a snippet of simple radiobutton functionality:&lt;br /&gt;
 &amp;lt;Wasabi:RadioGroup id=&amp;quot;enableddisabled&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;Wasabi:CheckBox x=&amp;quot;50&amp;quot; y=&amp;quot;110&amp;quot; w=&amp;quot;60&amp;quot;&lt;br /&gt;
 	text=&amp;quot;Enabled&amp;quot; radioid=&amp;quot;enableddisabled&amp;quot;&lt;br /&gt;
 	cfgattrib=&amp;quot;{9149C445-3C30-4E04-8433-5A518ED0FDDE};Enable desktop alpha&amp;quot;&lt;br /&gt;
 	radioval=&amp;quot;1&amp;quot;&lt;br /&gt;
 /&amp;gt;&lt;br /&gt;
 &amp;lt;Wasabi:CheckBox x=&amp;quot;-125&amp;quot; y=&amp;quot;110&amp;quot; w=&amp;quot;62&amp;quot; relatx=&amp;quot;1&amp;quot;&lt;br /&gt;
 	text=&amp;quot;Disabled&amp;quot; radioid=&amp;quot;enableddisabled&amp;quot;&lt;br /&gt;
 	cfgattrib=&amp;quot;{9149C445-3C30-4E04-8433-5A518ED0FDDE};Enable desktop alpha&amp;quot;&lt;br /&gt;
 	radioval=&amp;quot;0&amp;quot;&lt;br /&gt;
 /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;rect/&amp;gt;==&lt;br /&gt;
A nice flat rectangle.  It may be either filled or hollow, and if hollow you may specify only some edges drawn.  Here are its parameters:&lt;br /&gt;
* '''color''' - (id) The id of a color element, or an comma delimited integer triplet RGB value.  Default is &amp;quot;255,00,255&amp;quot; (an ugly color to remind you to set it).&lt;br /&gt;
* '''filled''' - (bool) This flag causes the entire rectangular area to be filled with color.  Default is to not be filled.&lt;br /&gt;
* '''edges''' - (str) A pipe (&amp;quot;|&amp;quot;) delimited set of one or all of the following: &amp;quot;left&amp;quot; &amp;quot;right&amp;quot; &amp;quot;top&amp;quot; &amp;quot;bottom&amp;quot; Default is all, ie: &amp;quot;left|right|top|bottom&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;script/&amp;gt;==&lt;br /&gt;
Scripts allow for the simple creation of UI functionality without requiring C++ code.  While scripts are &amp;quot;compiled&amp;quot; into &amp;quot;script binaries,&amp;quot; these script binaries are special to wasabi and, more importantly, can be run by any compatible Wasabi runtime on any OS to which Wasabi has a runtime.  Scripts are bound like GuiObjects into layout or groupdef sections using the script tag and have the ability to find and modify the nearby sibling and child objects once the UI has been fully instantiated.  Scripts have two important parameters:&lt;br /&gt;
* '''file''' - (str) The filename of the .maki file to load, relative to this xml file.&lt;br /&gt;
* '''param''' - (str) A string that will be available to the instance of the .maki file as an instance specific parameter.&lt;br /&gt;
Note that a single .maki file may be instantiated as a script object numerous times over, and each instantiation can have its own specific parameter data.  Judicious use of this feature can help minimize your reliance on hardcoded strings and limited flexibility in your scripting.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;slider/&amp;gt; &amp;amp; &amp;lt;Wasabi:HSlider/&amp;gt; &amp;amp; &amp;lt;Wasabi:VSlider/&amp;gt;==&lt;br /&gt;
The slider object consists of a background set of images, and a thumb.  The thumb is constrained to move in one dimension -- horizontally or vertically, depending upon its orientation.  The distance in pixels travelled by the thumb across its total distance is interpollated to produce a value between the low and high boundary integers which is assigned to any configuration attribute which may happen to be attached.  Here are the parameters for slider:&lt;br /&gt;
* '''barleft''' - (id) The bitmap element for the left or top position of the slider.&lt;br /&gt;
* '''barmiddle''' - (id) The bitmap element for the middle, stretched, position of the slider.&lt;br /&gt;
* '''barright''' - (id) The bitmap element for the right or bottom position of the slider.&lt;br /&gt;
* '''thumb''' - (id) The bitmap element for the slider thumb.&lt;br /&gt;
* '''downthumb''' - (id) The bitmap element for the slider thumb when held by the user.&lt;br /&gt;
* '''hoverthumb''' - (id) The bitmap element for the slider thumb when the user's mouse is above it.&lt;br /&gt;
* '''orientation''' - (str) Either &amp;quot;v&amp;quot; or &amp;quot;vertical&amp;quot; to make the slider vertical, otherwise it will be horizontal.&lt;br /&gt;
* '''low''' - (int) Set the low-value boundary.  Default is 0.&lt;br /&gt;
* '''high''' - (int) Set the high-value boundary.  Default is 255.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;snappoint/&amp;gt;==&lt;br /&gt;
The snappoint is an invisible point that will attract other snappoint objects with the same id in any other layout and make them want to dock, like little magnets.  These objects have only the following subset of guiobject XML parameters:&lt;br /&gt;
* '''id''' - (id) All snappoint objects with the same id will snap to each other.  Different ids ignore each other.&lt;br /&gt;
* '''x''' - (int) The x position of the snappoint, see: guiobject.&lt;br /&gt;
* '''y''' - (int) The y position of the snappoint, see: guiobject.&lt;br /&gt;
* '''relatx''' - (int) The horizontal coordinate space of the snappoint, see: guiobject.&lt;br /&gt;
* '''relaty''' - (int) The vertical coordinate space of the snappoint, see: guiobject.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;Wasabi:TabSheet/&amp;gt;==&lt;br /&gt;
The Wasabi:TabSheet object contains multiple group instances within it and allows the user to switch between the display of those groups by the ability to click on a list of tab buttons at the top of the rectangular area of the Wasabi:TabSheet.  The name parameter of each groupdef is displayed as the text in the tab which corresponds to it.  Here are the Wasabi:TabSheet parameters:&lt;br /&gt;
* '''windowtype''' - (str) A windowtype string which will instantiate one of every groupdef with the same windowtype and every window class registered with a window creation service to include this windowtype.&lt;br /&gt;
* '''children''' - (id) A semicolon delimited list of groupdef ids to also be instantiated as children of this tabsheet.&lt;br /&gt;
* '''type''' - (int) There are two different themed display styles for Wasabi:TabSheet.  One is with multiple tabs (sheet style), one is with a single button on top that will popup a menu with all the possible tab choices (sidecar style).  The Default is sheet style, which is a value of -2.  Any other value besides -2 will give you sidecar style.&lt;br /&gt;
* '''content_margin_top''' - (int) A margin in pixels to offset the content from the client rectangle of the Wasabi:Tabsheet.&lt;br /&gt;
* '''content_margin_left''' - (int) A margin in pixels to offset the content from the client rectangle of the Wasabi:Tabsheet.&lt;br /&gt;
* '''content_margin_right''' - (int) A margin in pixels to offset the content from the client rectangle of the Wasabi:Tabsheet.&lt;br /&gt;
* '''content_margin_bottom''' - (int) A margin in pixels to offset the content from the client rectangle of the Wasabi:Tabsheet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;text/&amp;gt; &amp;amp; &amp;lt;Wasabi:Text/&amp;gt;==&lt;br /&gt;
The text object is for using the system to render some text in the font of your choice.&lt;br /&gt;
Since Winamp 5.5 (skinversion 1.3) text objects can have multiple lines. For a new line use this &amp;quot;/n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* '''display''' - (str) Either a specific system display string or the string identifier of a text feed.  Setting this value will override the text parameter.  See below.&lt;br /&gt;
* '''ticker''' - (bool) Setting this flag causes the object to scroll left and right if the text does not fit the rectangular area of the text object.&lt;br /&gt;
* '''antialias''' - (bool) Setting this flag causes the text to be rendered antialiased if possible.&lt;br /&gt;
* '''text''' - (str) A static string to be displayed.&lt;br /&gt;
* '''default''' - (str) A parameter alias for text.&lt;br /&gt;
* '''font''' - (id) The id of a bitmapfont or truetypefont element.  If no element with that id can be found, the OS will be asked for a font with that name instead.&lt;br /&gt;
* '''fontsize''' - (int) The size to render the chosen font.&lt;br /&gt;
* '''align''' - (str) One of the following three possible strings: &amp;quot;left&amp;quot; &amp;quot;center&amp;quot; &amp;quot;right&amp;quot; -- Default is &amp;quot;left.&amp;quot;&lt;br /&gt;
* '''valign''' - (str) One of the following three possible strings: &amp;quot;top&amp;quot; &amp;quot;center&amp;quot; &amp;quot;bottom&amp;quot; -- Default is &amp;quot;top.&amp;quot;&lt;br /&gt;
* '''color''' - (int) The comma delimited RGB color of the text.&lt;br /&gt;
* '''shadowcolor''' - (int) The comma delimited RGB color for underrendered shadow text.&lt;br /&gt;
* '''shadowx''' - (int) The x offset of the shadowrender.&lt;br /&gt;
* '''shadowy''' - (int) The y offset of the shadowrender.&lt;br /&gt;
* '''timeroffstyle''' - (int) How to display an empty timer: &amp;quot;0&amp;quot; = &amp;quot;  :  &amp;quot;, &amp;quot;1&amp;quot; = &amp;quot;00:00&amp;quot;, and &amp;quot;2&amp;quot;=&amp;quot;&amp;quot; (if one is displaying time)&lt;br /&gt;
* '''timecolonwidth''' - (int) How many extra pixels wider or smaller should the colon be when displaying time.  Default is -1.&lt;br /&gt;
* '''nograb''' - (bool) Setting this flag will cause the text object to ignore left button down messages.  Default is off.&lt;br /&gt;
* '''showlen''' - (bool) Setting this flag will cause the text display to be appended with the length in minutes and seconds of the current song.  Default is off.&lt;br /&gt;
* '''forcefixed''' - (bool) Force the system to attempt to render the display string with fixed-width font spacing.&lt;br /&gt;
* '''forceupcase''' - (bool) Force the system to make the display string all uppercase before display.&lt;br /&gt;
* '''forceuppercase''' - (bool) Force the system to make the display string all uppercase before display.&lt;br /&gt;
* '''forcelocase''' - (bool) Force the system to make the display string all lowercase before display.&lt;br /&gt;
* '''forcelowercase''' - (bool) Force the system to make the display string all lowercase before display.  &lt;br /&gt;
* '''bold''' - (bool) Render the display string in bold.&lt;br /&gt;
* '''wrap''' - (bool) Setting this flag will cause the text to wrap in its rectangular space.  Default is off.&lt;br /&gt;
* '''dblclickaction''' - (str) A string in the form &amp;quot;SWITCH;layout&amp;quot; where layout is the id of a layout in this object's parent container.  No other actions function on this object.  This action is deprecated.&lt;br /&gt;
* '''offsetx''' - (int) Extra pixels to be added to or subtracted from the calculated x value for the display string to render.&lt;br /&gt;
* '''offsety''' - (int) Extra pixels to be added to or subtracted from the calculated x value for the display string to render.&lt;br /&gt;
 &amp;quot;SONGNAME&amp;quot; 		- The name string of the currently playing song (from metadb).&lt;br /&gt;
 &amp;quot;SONGINFO&amp;quot; 		- The full info string of the currently playing song (from metadb).&lt;br /&gt;
 &amp;quot;SONGARTIST&amp;quot; 		- The artist string of the currently playing song (from metadb).&lt;br /&gt;
 &amp;quot;SONGTITLE&amp;quot; 		- The title string of the currently playing song (from metadb).&lt;br /&gt;
 &amp;quot;SONGALBUM&amp;quot; 		- The album string of the currently playing song (from metadb).&lt;br /&gt;
 &amp;quot;SONGLENGTH&amp;quot; 		- The length string of the currently playing song (from metadb).&lt;br /&gt;
 &amp;quot;TIME&amp;quot; 			- The length string of the currently playing song.&lt;br /&gt;
 &amp;quot;TIMEELAPSED&amp;quot; 		- The elapsed time string of the currently playing song.&lt;br /&gt;
 &amp;quot;TIMEREMAINING&amp;quot; 	- The time remaining string of the currently playing song.&lt;br /&gt;
 &amp;quot;COMPONENTBUCKET&amp;quot; 	- The id of the componentbucket (thinger) item the mousecursor is currently hovering above.&lt;br /&gt;
 &amp;quot;SONGBITRATE&amp;quot; 		- The bitrate string of the currently playing song (from metadb).&lt;br /&gt;
 &amp;quot;SONGSAMPLERATE&amp;quot; 	- The sample string of the currently playing song (from metadb).&lt;br /&gt;
 &lt;br /&gt;
 *** Broken Action (Winamp 5) ***&lt;br /&gt;
 &amp;quot;NORMALIZER:STATUS&amp;quot; 	- The current status of the audio normalizer.&lt;br /&gt;
&lt;br /&gt;
 Example:&lt;br /&gt;
 &amp;lt;text x=&amp;quot;81&amp;quot; y=&amp;quot;11&amp;quot; w=&amp;quot;25&amp;quot; h=&amp;quot;21&amp;quot; antialias=&amp;quot;0&amp;quot; text=&amp;quot;Read This&amp;quot; align=&amp;quot;center&amp;quot; color=&amp;quot;0,0,0&amp;quot; bold=&amp;quot;1&amp;quot;/&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;Wasabi:TitleBox/&amp;gt;==&lt;br /&gt;
The Wasabi:TitleBox object is a nice way to put a simple rectangular frame and title around your content groups.  It has the following parameters:&lt;br /&gt;
* '''title''' - (str) The string to display in the title area.  Default is to use the name parameter of the content group.&lt;br /&gt;
* '''content''' - (id) The id of the groupdef to instantiate as content.&lt;br /&gt;
* '''centered''' - (bool) Setting this flag will center the title text.  Default is to not be centered (and be left justified).&lt;br /&gt;
* '''suffix''' - (str) A string which will be appended to the title before it is displayed.  In this way, if you instantiate multiple groups as content, each name change can still have a string appended.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;Wasabi:Titlebar/&amp;gt;==&lt;br /&gt;
The Wasabi:TitleBar is the graphically themed bar that is placed at the top of all of the Wasabi:StandardFrame windows.  It has the same parameters as the text object, which control the text display of the titlebar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;tree/&amp;gt;==&lt;br /&gt;
The tree object displays a hierarchical set of information with multiple items, where each item may in turn have multiple subitems.  Let's examine its parameters:&lt;br /&gt;
* '''items''' - (str) A specially formatted string describing the hierarchical creation of the tree info.  See below.&lt;br /&gt;
* '''feed''' - (str) The string identifier of a text feed which should provide a string in the same format as the items parameter.&lt;br /&gt;
* '''sorted''' - (bool) Setting this flag will cause all of the tree items to be sorted before display.  Default is to sort.&lt;br /&gt;
* '''childtabs''' - (bool) Setting this flag will cause all tree items with children to display a tab graphic beside them.  Default is to show tab graphics.&lt;br /&gt;
* '''expandroot''' - (bool) Setting this flag will cause all root tree items to display with their children pre-expanded.  Default is to pre-expand root tree items.&lt;br /&gt;
The syntax required to describe the hierarchy of tree items is a semicolon delimited list of objects in the form &amp;quot;name(list)&amp;quot; where name is the string to display for that tree item and list is another semicolon delimited list of objects which are the direct children of name. &lt;br /&gt;
 &lt;br /&gt;
The following snippet will create a tree with one root node that has three child nodes, with each child node having differing numbers of sub nodes:&lt;br /&gt;
 &amp;lt;tree id=&amp;quot;example.tree&amp;quot;&lt;br /&gt;
 	x=&amp;quot;0&amp;quot; y=&amp;quot;0&amp;quot; w=&amp;quot;0&amp;quot; h=&amp;quot;0&amp;quot; relatw=&amp;quot;1&amp;quot; relath=&amp;quot;1&amp;quot;&lt;br /&gt;
 	items=&amp;quot;root(child1(sub1;sub2);child2;child3(sub3))&amp;quot;&lt;br /&gt;
 /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;vis/&amp;gt;==&lt;br /&gt;
The vis object is the multistate audio visualization display.  It has a multitude of parameters for how simple it is:&lt;br /&gt;
* '''colorallbands''' - (int) The comma delimited RGB triplet to color all the spectroscope bands.&lt;br /&gt;
* '''colorband1''' - (int) The comma delimited RGB triplet to color spectroscope band 1.&lt;br /&gt;
* '''colorband2''' - (int) The comma delimited RGB triplet to color spectroscope band 2.&lt;br /&gt;
* '''colorband3''' - (int) The comma delimited RGB triplet to color spectroscope band 3.&lt;br /&gt;
* '''colorband4''' - (int) The comma delimited RGB triplet to color spectroscope band 4.&lt;br /&gt;
* '''colorband5''' - (int) The comma delimited RGB triplet to color spectroscope band 5.&lt;br /&gt;
* '''colorband6''' - (int) The comma delimited RGB triplet to color spectroscope band 6.&lt;br /&gt;
* '''colorband7''' - (int) The comma delimited RGB triplet to color spectroscope band 7.&lt;br /&gt;
* '''colorband8''' - (int) The comma delimited RGB triplet to color spectroscope band 8.&lt;br /&gt;
* '''colorband9''' - (int) The comma delimited RGB triplet to color spectroscope band 9.&lt;br /&gt;
* '''colorband10''' - (int) The comma delimited RGB triplet to color spectroscope band 10.&lt;br /&gt;
* '''colorband11''' - (int) The comma delimited RGB triplet to color spectroscope band 11.&lt;br /&gt;
* '''colorband12''' - (int) The comma delimited RGB triplet to color spectroscope band 12.&lt;br /&gt;
* '''colorband13''' - (int) The comma delimited RGB triplet to color spectroscope band 13.&lt;br /&gt;
* '''colorband14''' - (int) The comma delimited RGB triplet to color spectroscope band 14.&lt;br /&gt;
* '''colorband15''' - (int) The comma delimited RGB triplet to color spectroscope band 15.&lt;br /&gt;
* '''colorband16''' - (int) The comma delimited RGB triplet to color spectroscope band 16.&lt;br /&gt;
* '''colorbandpeak''' - (int) The comma delimited RGB triplet to color the spectroscope peak line.&lt;br /&gt;
* '''colorallosc''' - (int) The comma delimited RGB triplet to color the whole oscilloscope.&lt;br /&gt;
* '''colorosc1''' - (int) The comma delimited RGB triplet to color oscilloscope section 1.&lt;br /&gt;
* '''colorosc2''' - (int) The comma delimited RGB triplet to color oscilloscope section 2.&lt;br /&gt;
* '''colorosc3''' - (int) The comma delimited RGB triplet to color oscilloscope section 3.&lt;br /&gt;
* '''colorosc4''' - (int) The comma delimited RGB triplet to color oscilloscope section 4.&lt;br /&gt;
* '''colorosc5''' - (int) The comma delimited RGB triplet to color oscilloscope section 5.&lt;br /&gt;
* '''channel''' - (int) One of three values for which channel to monitor: &amp;quot;1&amp;quot; is left channel, &amp;quot;2&amp;quot; is right channel, &amp;quot;3&amp;quot; is stereo.  Default is stereo.&lt;br /&gt;
* '''fliph''' - (bool) If this flag is set, it blits the vis pixels flipped horizontally.&lt;br /&gt;
* '''flipv''' - (bool) If this flag is set, it blits the vis pixels flipped vertically.&lt;br /&gt;
* '''mode''' - (int) One of three values for which mode to display: &amp;quot;0&amp;quot; is no display, &amp;quot;1&amp;quot; is spectroscope, &amp;quot;2&amp;quot; is oscilloscope.  Default is to read from a config item. When the user clicks on the vis, it will cycle between its three modes.&lt;br /&gt;
* '''peaks''' - (bool) Enable peaks for the spectroscope.&lt;br /&gt;
* '''peakfalloff''' - (int) Set the speed of the peaks fall (0-4).&lt;br /&gt;
* '''falloff''' - (int) Set the speed of the spectroscope fall (0-4).&lt;br /&gt;
* '''coloring''' - (string) Change coloring method for spectroscope (&amp;quot;Normal&amp;quot;, &amp;quot;Fire&amp;quot; or &amp;quot;Line&amp;quot;).&lt;br /&gt;
* '''bandwidth''' - (string) Change the style of the spectroscope (&amp;quot;thin&amp;quot; or &amp;quot;wide&amp;quot;).&lt;br /&gt;
* '''oscstyle''' - (string) Change the style of the oscilloscope (&amp;quot;solid&amp;quot;, &amp;quot;dots&amp;quot; or &amp;quot;lines&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;eqvis/&amp;gt;==&lt;br /&gt;
The eqvis object is rather specific to media players, as it is the spline display for the eq settings in the Wasabi Media Player.&lt;br /&gt;
* '''colortop''' - (str) A color value or color element id for the top portion of the spline display.&lt;br /&gt;
* '''colormiddle''' - (str) A color value or color element id for the middle portion of the spline display.&lt;br /&gt;
* '''colorbottom''' - (str) A color value or color element id for the bottom portion of the spline display.&lt;br /&gt;
* '''colorpreamp''' - (str) A color value or color element id for the preamp bar in the spline display.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;gradient/&amp;gt;==&lt;br /&gt;
The gradient object creates a rectangular color gradient.  The available parameters are:&lt;br /&gt;
* '''gradient_x1''' - (float) A floating point value for the left side of the rectangle.  Default is 0.0&lt;br /&gt;
* '''gradient_y1''' - (float) A floating point value for the top side of the rectangle.  Default is 0.0&lt;br /&gt;
* '''gradient_x2''' - (float) A floating point value for the right side of the rectangle.  Default is 1.0&lt;br /&gt;
* '''gradient_x1''' - (float) A floating point value for the bottom side of the rectangle.  Default is 1.0&lt;br /&gt;
* '''points''' - (str) A complex string defining color values for at least two value points with which to build the gradients.  See below.&lt;br /&gt;
The points syntax is a semicolon delimited list of key=value pairs where the key is a floatingpoint number representing a point in the &amp;quot;gradient space&amp;quot; and the value is an RGB triplet (assumed full alpha) or RGBA quad.  For instance, the following object would create a smooth gradient between red in the top left and green at half alpha in the bottom right:&lt;br /&gt;
 	&amp;lt;gradient id=&amp;quot;red.to.green&amp;quot;&lt;br /&gt;
 		x=&amp;quot;0&amp;quot; y=&amp;quot;0&amp;quot; w=&amp;quot;0&amp;quot; h=&amp;quot;0&amp;quot; &lt;br /&gt;
 		relatw=&amp;quot;1&amp;quot; relath=&amp;quot;1&amp;quot;&lt;br /&gt;
 		points=&amp;quot;0.0=255,0,0,255;1.0=0,255,0,128&amp;quot;&lt;br /&gt;
 	/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;Wasabi:StandardFrame:Status/&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;Wasabi:StandardFrame:NoStatus/&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;Wasabi:StandardFrame:Modal/&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;Wasabi:StandardFrame:Static/&amp;gt;==&lt;br /&gt;
The Wasabi:StandardFrame objects are rectangular frames you can use to encapsulate your own layout contents within the currently themed standard frame.  They all have the following parameters:&lt;br /&gt;
* '''content''' - (id) The id of the groupdef to instantiate within the Wasabi:StandardFrame.&lt;br /&gt;
* '''padtitleleft''' - (int) The distance in pixels to pad the title to the left.&lt;br /&gt;
* '''padtitleright''' - (int) The distance in pixels to pad the title to the right.&lt;br /&gt;
* '''shade''' - (id) The id of the layout within our container we should switch to if the titlebar is doubleclicked (ie: the id of the windowshade layout).  Default is no functionality.&lt;br /&gt;
The Wasabi:StandardFrame:Status object has a status bar, while the Wasabi:StandardFrame:NoStatus does not.  The Wasabi:StandardFrame:Static object inherits from Wasabi:StandardFrame:NoStatus and also instantiates the wasabi panel graphics.  The Wasabi:StandardFrame:Modal object does all that and also removes the control menus to make a fully modal dialog frame.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;wndholder/&amp;gt;==&lt;br /&gt;
A wndholder object, similar to a customobject, holds user interface windows based upon what param is given.  The wndholder can also hold window types by guid or groupdef instantiations by id.  Here are its parameters:&lt;br /&gt;
* '''hold''' - (id) A semicolon delimited list of guids or groupdef ids to hold.&lt;br /&gt;
* '''component''' - (id) A parameter alias for hold.&lt;br /&gt;
* '''param''' - (id) A parameter alias for hold.&lt;br /&gt;
* '''noshowcmdbar''' - (bool) Setting this flag will disable the Wasabi command bar.&lt;br /&gt;
* '''noanimatedrects''' - (bool) Setting this flag will disable animated rectangle motion.&lt;br /&gt;
* '''disableanimatedrects''' - (bool) A parameter alias for noanimatedrects.&lt;br /&gt;
* '''autoopen''' - (bool) Setting this flag will cause the object to auto open.&lt;br /&gt;
* '''autoclose''' - (bool) Setting this flag will cause the object to auto close.&lt;br /&gt;
Using a wndholder object indicates to the system that you want to be the &amp;quot;container of record&amp;quot; for the possible requested guids when they are launched by the system through, for instance, the C++ coder registering his window class with registerAutopopup(), which calls the underlying api-&amp;gt;skinwnd_createByGuid().  The container within which this wndholder is instantiated should also be given a component parameter with the same values.  This component parameter is simply a hint to Wasabi that a wndholder object that will accept that component parameter lives within the container.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;objdirview/&amp;gt;==&lt;br /&gt;
The objdirview object displays a tree of hierarchical information to the user, based on a code concept called an Object Directory.  An Object Directory is, in essence, just a container of arbitrary items so this object is merely the display of its contents.  Here are its parameters:&lt;br /&gt;
* '''dir''' - (str) The string identifier of the objdir to which this object should connect.&lt;br /&gt;
* '''target''' - (id) The id of an object to which this object may direct the actions of its internal items being selected.&lt;br /&gt;
* '''displaytarget''' - (id) The id of a customobject which will be assigned to display the display group parameter of the currently selected objdir item.&lt;br /&gt;
* '''defaultdisplay''' - (id) The id of a groupdef to display inside displaytarget if no objdir items are selected.&lt;br /&gt;
When items in the objdirview are selected, the objdir is sent an event telling it that an item was selected.  The target parameter from XML is included in the data sent in that event.   However, the implemented functionality for that event is wholly at the discretion of the programmer implementing the specific objdir in question.  For the QueryDir object used in Winamp3's media library, the target param is for a nearby queryline object to be told the selection is changing.  Your mileage may vary with other objects.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;Wasabi:PathPicker/&amp;gt;==&lt;br /&gt;
The Wasabi:PathPicker object is a simple object to display a text string of a directory path chosen by the user.  When the user clicks on the object, a dir selection service is started, allowing the user to choose a directory path.  Attach this object to a string configuration attribute and you have a simple way for users to choose directories as preferences.  The Wasabi:PathPicker object has no unique parameters.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;querydrag/&amp;gt;==&lt;br /&gt;
The querydrag object is used to create a visual &amp;quot;drag source&amp;quot; for a nearby queryresults object.  The user may click and drag this object and by doing so representationally drag the text of the current query in the queryresults object (which can be dropped into a playlist editor to fill its contents with the results of that query).  It has only two parameters:&lt;br /&gt;
* '''image''' - (id) The bitmap element to display.&lt;br /&gt;
* '''source''' - (id) The source queryresults object.  Default is the nearest.&lt;br /&gt;
If no valid source can be found, this object silently fails to drag.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;queryline/&amp;gt;==&lt;br /&gt;
The invisible queryline object is used to host a text query to be applied to a queryresults object.  One possible use would be to write a script linking the text in a Wasabi:HistoryEditBox to the query parameter of a queryline.  And, speaking of its parameters, here they are:&lt;br /&gt;
* '''querylist''' - (id) The id of the queryresults which will take the query.  Default is to not connect (ie: this param is kinda sorta mandatoryish if you want anything interesting to happen).&lt;br /&gt;
* '''query''' - (str) The string of the query itself.&lt;br /&gt;
* '''auto''' - (bool) Whether or not to execute an autoquery based on the query parameter (ie: &amp;quot;search on the name column for this substring&amp;quot; instead of &amp;quot;run this query&amp;quot;).  Default is to use the string directly as a query (not autoquery).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;queryresults/&amp;gt;==&lt;br /&gt;
The queryresults object is the an invisible binding object that coordinates the filtration of the database by numerous multiple other objects.  The queryline and filterlist objects eventually define a single output from the database, and this information is kept in the queryresults object.  It has only one parameter:&lt;br /&gt;
title - (str) The human readable title for your queryresults.  I have no idea why this would be important.&lt;br /&gt;
Magically, it seems, placing a queryresults object in the same group next to a PlaylistEditor object makes that PlaylistEditor get filled with the queryresults information.  I have no idea how this can be, and sense the telltale signs of powerful dark necromancy at work, here.&lt;/div&gt;</summary>
		<author><name>Pjn123</name></author>	</entry>

	<entry>
		<id>http://wiki.winamp.com/wiki/XML_GUI_Objects</id>
		<title>XML GUI Objects</title>
		<link rel="alternate" type="text/html" href="http://wiki.winamp.com/wiki/XML_GUI_Objects"/>
				<updated>2012-11-12T13:56:53Z</updated>
		
		<summary type="html">&lt;p&gt;Pjn123: /*  */  added vis params that was intoduced for wa5.5&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==GuiObject (Global params)==&lt;br /&gt;
All the objects to be discussed in this chapter are GuiObjects.  This means, among other things, all such objects have the same basic set of parameters which are valid for all of them.  All GuiObjects are objects that live with a set of spatial coordinates within a groupdef (or layout).  A button, a piece of text, a flat bitmap image, a tree of items, and an edit box would all be different kinds of GuiObjects, and all of the parameters listed here work on all of them.&lt;br /&gt;
* '''alpha''' - (int) An integer [0,255] specifying the alpha blend mode of the object (0 is transparent, 255 is opaque).  Default is 255.&lt;br /&gt;
* '''activealpha''' - (int) A different alpha value [0,255] for the object in its active state.&lt;br /&gt;
* '''inactivealpha''' - (int) A different alpha value [0,255] for the object in its inactive state (if you set both activealpha and inactivealpha, it is meaningless to set alpha).&lt;br /&gt;
* '''cursor''' - (id) The id of the cursor element to be displayed when the mouse is over this object. You can also use the system cursors. A list can be found here: '''[[Wasabi Appendix: Cursors | Appendix: Cursors]]'''&lt;br /&gt;
* '''tooltip''' - (str) A human readable string to display as a tooltip for when the mouse is hovered over this object.&lt;br /&gt;
* '''move''' - (bool) Setting this flag causes any dragging of this object to actually drag the entire layout within which the object resides.&lt;br /&gt;
* '''renderbasetexture''' - (bool) A flag to tell the system to always use the system's base texture as the background of this object.&lt;br /&gt;
* '''cfgattrib''' - (str) A configattrib string assigned to this GuiObject. Here is a list of a few: '''[[Wasabi Appendix: ConfigAttrib | Appendix: ConfigAttrib]]'''&lt;br /&gt;
* '''visible''' - (bool) Whether or not the object should be displayed in its group or layout.&lt;br /&gt;
* '''x''' - (int) The X position of the object in its group or layout.&lt;br /&gt;
* '''y''' - (int) The Y position of the object in its group or layout.&lt;br /&gt;
* '''w''' - (int) The width of the object in its group or layout.&lt;br /&gt;
* '''h''' - (int) The height of the object in its group or layout.&lt;br /&gt;
* '''relatx''' - (int) This [0,2] integer determines if the X position should be calculated by normal (&amp;quot;0&amp;quot;), relative (&amp;quot;1&amp;quot;) or proportional (&amp;quot;2&amp;quot;) units.  See below.&lt;br /&gt;
* '''relaty''' - (int) This [0,2] integer determines if the Y position should be calculated by normal (&amp;quot;0&amp;quot;), relative (&amp;quot;1&amp;quot;) or proportional (&amp;quot;2&amp;quot;) units.  See below.&lt;br /&gt;
* '''relatw''' - (int) This [0,2] integer determines if the width should be calculated by normal (&amp;quot;0&amp;quot;), relative (&amp;quot;1&amp;quot;) or proportional (&amp;quot;2&amp;quot;) units.  See below.&lt;br /&gt;
* '''relath''' - (int) This [0,2] integer determines if the height should be calculated by normal (&amp;quot;0&amp;quot;), relative (&amp;quot;1&amp;quot;) or proportional (&amp;quot;2&amp;quot;) units.  See below.&lt;br /&gt;
* '''fitparent''' - (bool) This parameter is used instead of x;y;w;h parameters and means that the object covers all the area of the parent object.&lt;br /&gt;
* '''x1''' - (int)  The X position of the left edge of the object in its group or layout.  Only works inside definitions with design_w parameters set.&lt;br /&gt;
* '''y1''' - (int) The Y position of the top edge of the object in its group or layout.  Only works inside definitions with design_h parameters set.&lt;br /&gt;
* '''x2''' - (int)  The X position of the right edge of the object in its group or layout.  Only works inside definitions with design_w parameters set.&lt;br /&gt;
* '''y2''' - (int) The Y position of the bottom edge of the object in its group or layout.  Only works inside definitions with design_h parameters set.&lt;br /&gt;
* '''anchor''' - (str) A list of one or more of the following keywords, delimited by the pipe (|) character: &amp;quot;top|bottom|left|right&amp;quot; these anchors work with x1/y1/x2/y2 positioning to fix the edge of the object its distance from the edges of the group or layout which contains it.&lt;br /&gt;
* '''sysmetricsx''' - (bool) This flag will cause this object to be resized by having its X position multiplied by the OS scalar coefficient.&lt;br /&gt;
* '''sysmetricsy''' - (bool) This flag will cause this object to be resized by having its Y position multiplied by the OS scalar coefficient. &lt;br /&gt;
* '''sysmetricsw''' - (bool) This flag will cause this object to be resized by having its width multiplied by the OS scalar coefficient.&lt;br /&gt;
* '''sysmetricsh''' - (bool) This flag will cause this object to be resized by having its height multiplied by the OS scalar coefficient.&lt;br /&gt;
* '''rectrgn''' - (bool) Setting this flag causes the engine to ignore the object's region for handling &amp;quot;mouse over object&amp;quot; detection and only use the bounding rectangle. &lt;br /&gt;
* '''regionop''' - (int) An integer enumeration [-2,1] for what kind of region-operation to perform with this object's calculated region against its parent's region.  See below for more information. &lt;br /&gt;
* '''sysregion''' - (int) Param alias for regionop.&lt;br /&gt;
* '''wantfocus''' - (bool) This flag determines whether or not an object ever gets the focus at all.&lt;br /&gt;
* '''focusonclick''' - (bool)  This flag determines whether or not an object gets the focus when clicked. &lt;br /&gt;
* '''taborder''' - (int) This value indicates the &amp;quot;tab order&amp;quot; of the object within the group or layout in which it resides.  When the user hits the tab key, the interface focus moves to the next greater object in tab order.  Objects with equal tab order will be ordered in the reverse of their insertion order in XML (last object in is first in default tab order). &lt;br /&gt;
* '''nodblclick''' - (bool) This flag blocks doubleclick events from being received by this object.&lt;br /&gt;
* '''noleftclick''' - (bool) This flag blocks left click events from being received by this object.&lt;br /&gt;
* '''norightclick''' - (bool) This flag blocks right click events from being received by this object.&lt;br /&gt;
* '''nomousemove''' - (bool) This flag blocks mouse move events from being received by this object.&lt;br /&gt;
* '''nocontextmenu''' - (bool) This flag blocks the main context menu from being displayed for rightclick.&lt;br /&gt;
* '''ghost''' - (bool) This flag causes the object to be transparent to all user interface events such that all the mouse messages pass to the object(s) visibly underneath it.&lt;br /&gt;
* '''notify'''(0-9) - (str) A string to be used as a parameter to the onNotify event for the object upon instantiation.  The notify strings 0-9 will be sent in order.&lt;br /&gt;
* '''droptarget''' - (id)  The id of an object to which all of this object's drag and drop events will be redirected.&lt;br /&gt;
&lt;br /&gt;
==='''Appendixes'''===&lt;br /&gt;
*'''[[Wasabi Appendix: ConfigAttrib | Appendix: ConfigAttrib]]'''&lt;br /&gt;
*'''[[Wasabi Appendix: Cursors | Appendix: Cursors]]'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;button/&amp;gt; &amp;amp; &amp;lt;togglebutton/&amp;gt;==&lt;br /&gt;
The button is a simple concept in Wasabi - you push it, it activates something.  It can either be used as a substrate for a script (ie: put a script and a button in the same groupdef, and you can handle complex button functionality with the script) or it can be used by itself to launch an action into the system when pressed.  You can implement your own action handlers in code, but some global actions predefined to be handled by the system are also available.&lt;br /&gt;
&lt;br /&gt;
* '''image''' - (id) The id of the bitmap element to display in its &amp;quot;normal&amp;quot; state. &lt;br /&gt;
* '''downimage''' - (id) The id of the bitmap element to display when the user is pressing down on the button.&lt;br /&gt;
* '''hoverimage''' - (id) The id of the bitmap element to display when the user is hovering the mouse over the button.&lt;br /&gt;
* '''activeimage''' - (id) The id of the bitmap element to display when the object is in its &amp;quot;active&amp;quot; state (usually only used by togglebutton, but available on the basic button object to allow the user to create extended functionality in script).&lt;br /&gt;
* '''text''' - (str) A string of text to be rendered on top of the button's currrent state image.  In this way, you can create a single button graphic and reuse it to create internationally localizable buttons.&lt;br /&gt;
* '''action''' - (str) The action to fire if the button is clicked (when it enters into its downstate).&lt;br /&gt;
* '''param''' - (str) The param to go with the action fired if the button is clicked.&lt;br /&gt;
* '''borders''' - (bool) Set this flag if you want to be a styled button.&lt;br /&gt;
* '''style''' - (str) Set the style value if you set the borders flag, to tell wasabi what type of button style you want.&lt;br /&gt;
** &amp;quot;button_normal&amp;quot; &amp;quot;osbutton_normal&amp;quot; &amp;quot;osbutton_close&amp;quot; &amp;quot;osbutton_minimize&amp;quot; and &amp;quot;osbutton_maximize&amp;quot;&lt;br /&gt;
* '''retcode''' - (int) Specifies the &amp;quot;modal return code&amp;quot; for the button.  Only valid with the &amp;quot;endmodal&amp;quot; system action.&lt;br /&gt;
* '''cbtarget''' - (id) The optional &amp;quot;component bucket target&amp;quot; for this button.  Only valid with &amp;quot;cb_next&amp;quot; or &amp;quot;cb_prev&amp;quot; system actions.  A componentbucket is another name for the thinger -- this allows you to have targetted button controls for more than one componentbucket in a user interface.&lt;br /&gt;
* '''action_target''' - (id) This will send the specified action only to the object whose id is listed here.  The param parameter is ignored in this case and this string is sent as the param data for the action.  Most objects don't understand being sent actions (this is an extended functionality), so this won't do anything in most cases.&lt;br /&gt;
* '''center_image''' - (bool) Setting this flag causes the image to be centered against the object rectangle.  This parameter is only important when both borders and an image are specified on a single object. &lt;br /&gt;
&lt;br /&gt;
 Example:&lt;br /&gt;
 &amp;lt;button x=&amp;quot;50&amp;quot; y=&amp;quot;10&amp;quot; action=&amp;quot;VID_FS&amp;quot; image=&amp;quot;vis.fs.1&amp;quot; hoverImage=&amp;quot;vis.fs.2&amp;quot; downImage=&amp;quot;vis.fs.3&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;button x=&amp;quot;10&amp;quot; y=&amp;quot;40&amp;quot; w=&amp;quot;100&amp;quot; h=&amp;quot;20&amp;quot; borders=&amp;quot;1&amp;quot; style=&amp;quot;osbutton_normal&amp;quot; text=&amp;quot;Click Here&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==='''Appendix'''===&lt;br /&gt;
* '''[[Wasabi Appendix: Action List | Appendix: Action List]]'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;nstatesbutton/&amp;gt;==&lt;br /&gt;
The nstatesbutton is a specialized kind of togglebutton whose purpose is to cycle through a number of different visual states.  The parameters beyond togglebutton that it implements are:&lt;br /&gt;
* '''nstates''' - (int) The number of discrete states in which the object may exist.&lt;br /&gt;
* '''cfgvals''' - (str) A semicolon delimited list of values to represent custom config values for the multiple states.  Default is the current state number.  See below.&lt;br /&gt;
The nstatesbutton uses special handling of the image, downimage, hoverimage, and activeimage parameters expressed by the button object (from which this object is derived).  The nstatesbutton will actually append the state number to the four image parameter strings to calculate the bitmap ids to be loaded for the current object state.  Remember, like most everything else in a computer, this &amp;quot;current state value&amp;quot; counts from 0 and is therefore in the range [0, nstates-1].&lt;br /&gt;
 &lt;br /&gt;
If the object is bound to a configuration attribute, that attribute will be set with a cfgval every time the nstatesbutton transitions to a new state.  If the cfgvals parameter is not set, the attribute will simply be set with the current state value.  If the cfgvals parameter is set, it will parse the string and set the config attrib with the n'th substring corresponding to the current state value.&lt;br /&gt;
 &lt;br /&gt;
The following snippet fully describes two nstatesbutton objects with three states each, one using full images for its visual display, one using themed Wasabi borders with three different state logos:&lt;br /&gt;
 &amp;lt;elements&amp;gt;&lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;nimg0&amp;quot;/&amp;gt; &lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;dimg0&amp;quot;/&amp;gt; &lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;himg0&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;nimg1&amp;quot;/&amp;gt; &lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;dimg1&amp;quot;/&amp;gt; &lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;himg1&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;nimg2&amp;quot;/&amp;gt; &lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;dimg2&amp;quot;/&amp;gt; &lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;himg2&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;logo0&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;logo1&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;logo2&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/elements&amp;gt;&lt;br /&gt;
 &amp;lt;groupdef id=&amp;quot;some.random.groupdef&amp;quot;&amp;gt;&lt;br /&gt;
 	&amp;lt;nstatesbutton id=&amp;quot;three.freeform.states&amp;quot;&lt;br /&gt;
 		nstates=&amp;quot;3&amp;quot; cfgvals=&amp;quot;one;two;three&amp;quot;&lt;br /&gt;
 		image=&amp;quot;nimg&amp;quot; downimage=&amp;quot;dimg&amp;quot; hoverimage=&amp;quot;himg&amp;quot;&lt;br /&gt;
 	/&amp;gt;&lt;br /&gt;
 	&amp;lt;nstatesbutton id=&amp;quot;three.themed.states&amp;quot;&lt;br /&gt;
 		nstates=&amp;quot;3&amp;quot; image=&amp;quot;logo&amp;quot; borders=&amp;quot;1&amp;quot; center_image=&amp;quot;1&amp;quot;&lt;br /&gt;
 	/&amp;gt;&lt;br /&gt;
 &amp;lt;/groupdef&amp;gt;&lt;br /&gt;
If the &amp;quot;three.freeform.states&amp;quot; nstatesbutton were assigned to a configattrib, that attribute would be filled with the values &amp;quot;one&amp;quot; &amp;quot;two&amp;quot; and &amp;quot;three&amp;quot; in order.  If the &amp;quot;three.themed.states&amp;quot; were instead assigned to a configattrib, it would be filled with the default values &amp;quot;0&amp;quot; &amp;quot;1&amp;quot; and &amp;quot;2&amp;quot; in order.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;images/&amp;gt;==&lt;br /&gt;
The images object is object that displays a certain image based on the position of a slider. This object is very similar to [[Animationlayer]] except that this animation's current frame will be determined by the position of a slider.  An example of implementation is the old Classic Winamp skins where the volume slider background changes colour from green to red depending on its position (0%-100%). This object is currently under development and not all sliders are supported. Currently only Volume and Panning(Balance) sliders can be used as sources.&lt;br /&gt;
&lt;br /&gt;
* '''images''' - (id) A bitmap element for the array of images that will be used.&lt;br /&gt;
* '''source''' - (id) Id of the slider that will determine the current animation frame.&lt;br /&gt;
* '''imagesspacing''' - (int) The hight of each animation frame in the bitmap element. This will determine the total number of frames, (300/15=20)&lt;br /&gt;
&lt;br /&gt;
 Example:&lt;br /&gt;
 &amp;lt;images source=&amp;quot;volume&amp;quot; x=&amp;quot;0&amp;quot; y=&amp;quot;0&amp;quot; w=&amp;quot;68&amp;quot; h=&amp;quot;13&amp;quot;&lt;br /&gt;
 images=&amp;quot;main.volpan.volume&amp;quot; imagesspacing=&amp;quot;15&amp;quot;/&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;images source=&amp;quot;balance&amp;quot; x=&amp;quot;73&amp;quot; y=&amp;quot;0&amp;quot; w=&amp;quot;38&amp;quot; h=&amp;quot;13&amp;quot;&lt;br /&gt;
 images=&amp;quot;main.volpan.balance&amp;quot; imagesspacing=&amp;quot;15&amp;quot;/&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
 &amp;lt;slider id=&amp;quot;Volume&amp;quot; action=&amp;quot;VOLUME&amp;quot; x=&amp;quot;1&amp;quot; y=&amp;quot;0&amp;quot; w=&amp;quot;68&amp;quot; h=&amp;quot;13&amp;quot;&lt;br /&gt;
 thumb=&amp;quot;main.volpan.thumb&amp;quot; downThumb=&amp;quot;main.volpan.thumb.pressed&amp;quot;/&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;slider id=&amp;quot;Pan&amp;quot; action=&amp;quot;PAN&amp;quot; x=&amp;quot;74&amp;quot; y=&amp;quot;0&amp;quot; w=&amp;quot;38&amp;quot; h=&amp;quot;13&amp;quot;&lt;br /&gt;
 thumb=&amp;quot;main.volpan.thumb&amp;quot; downThumb=&amp;quot;main.volpan.thumb.pressed&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;PlaylistDirectory/&amp;gt;==&lt;br /&gt;
The PlaylistDirectory object is simply a list with all the saved playlist from the media library. Please remember that this object is always on top of other objects, so you'll have to hide it via maki if you dont want it to be visible. This object was introduced in Winamp 5.5(skinversion 1.3)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;AlbumArt/&amp;gt;==&lt;br /&gt;
The AlbumArt object is a simple GuiObject that displays a picture of the album cover of the song thats playing in Winamp. Please note that if you want do something to this object in a maki script you'll have to define it as a guiobject and not as a layer.&lt;br /&gt;
* '''notfoundImage''' - (id) A bitmap element that used if Winamp cant find any cover for the song.&lt;br /&gt;
* '''align''' - (str) One of the following three possible strings: &amp;quot;left&amp;quot; &amp;quot;center&amp;quot; &amp;quot;right&amp;quot; -- Default is &amp;quot;left&amp;quot;.&lt;br /&gt;
* '''valign''' - (str) One of the following three possible strings: &amp;quot;top&amp;quot; &amp;quot;center&amp;quot; &amp;quot;bottom&amp;quot; -- Default is &amp;quot;top&amp;quot;.&lt;br /&gt;
* '''source''' - (str) Path+Filename of file that you want to display in this object.&lt;br /&gt;
* '''stretched''' - (bool) Stretch the albumart to the size of the object.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;grid/&amp;gt;==&lt;br /&gt;
The grid object is a very nice object for creating stretchable images that still look good on the edges.  It is a graphic, like a layer, but unlike layer it is created by applying nine different bitmaps, stretching five of them.  There are, as you might guess, nine parameters&lt;br /&gt;
&lt;br /&gt;
* '''topleft''' - (id) A bitmap element for the top left section of the grid.&lt;br /&gt;
* '''top''' - (id) A bitmap element for the top middle section of the grid.&lt;br /&gt;
* '''topright''' - (id) A bitmap element for the top right section of the grid.&lt;br /&gt;
* '''left''' - (id) A bitmap element for the middle left section of the grid.&lt;br /&gt;
* '''middle''' - (id) A bitmap element for the center section of the grid.&lt;br /&gt;
* '''right''' - (id) A bitmap element for the middle right section of the grid.&lt;br /&gt;
* '''bottomleft''' - (id) A bitmap element for the bottom left section of the grid.&lt;br /&gt;
* '''bottom''' - (id) A bitmap element for the bottom middle section of the grid.&lt;br /&gt;
* '''bottomright''' - (id) A bitmap element for the bottom right section of the grid. &lt;br /&gt;
&lt;br /&gt;
Essentially, the given rectangle of the grid is intersected with 2 horizontal and 2 vertical lines.  The topleft, topright, bottomleft, and bottomright bitmap elements will not be resized.  The top, left, middle, right, and bottom bitmap elements, however, will be stretched to make all fit the grid rectangle.  Using intelligently sized bitmap elements is fairly critical for this object.  If you're having trouble, try starting with all of your bitmap elements as equal-sized squares.&lt;br /&gt;
&lt;br /&gt;
 Example:&lt;br /&gt;
 &amp;lt;grid x=&amp;quot;70&amp;quot; y=&amp;quot;25&amp;quot; w=&amp;quot;-74&amp;quot; relatw=&amp;quot;1&amp;quot; h=&amp;quot;20&amp;quot; topleft=&amp;quot;main.text.left&amp;quot; top=&amp;quot;main.text.center&amp;quot; topright=&amp;quot;main.text.right&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;Winamp:Browser/&amp;gt;==&lt;br /&gt;
This is basically the browser you'll see in the Bento Winamp skin. You'll also need Winamp 5.54 (skinversion 1.34) for it to work.&lt;br /&gt;
&lt;br /&gt;
- '''home''' - (str) Url for the default homepage for the browser xui.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;browser/&amp;gt;==&lt;br /&gt;
The browser object embeds an external browser technology window (such as IE or Mozilla) into the user interface with which you can load and render HTML directly.&lt;br /&gt;
* '''url''' - (str) The url to be displayed.&lt;br /&gt;
* '''mainmb''' - (bool) Setting this flag makes this browser object the &amp;quot;main mini-browser&amp;quot; for the system.&lt;br /&gt;
* '''targetname''' - (str) This allows this browser object to be set as a specific HTML target.&lt;br /&gt;
* '''scrollbars''' - (str) An enumerated string to determine how the system should handle the embedded browser's scrollbars.  See below.&lt;br /&gt;
Numerous interfaces in Wasabi refer to or control the &amp;quot;main&amp;quot; mini-browser.  Setting the mainmb flag will cause the last browser object which processed its mainmb param to be the main.  In other words, please don't set this flag on more than one object if you actually care which one is the main.&lt;br /&gt;
Scrollbars are important for big browser windows, but can interfere with the simple rendering of HTML content as part of a Wasabi UI.  To this end, the skinner can control how the scrollbars of the embedded browser are displayed by setting the scrollbars parameter to one of the following four string values: &amp;quot;auto&amp;quot; &amp;quot;never&amp;quot; &amp;quot;always&amp;quot; or &amp;quot;default&amp;quot; - default is to allow the HTML page to specify, all others override.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;Wasabi:Frame/&amp;gt;==&lt;br /&gt;
The Wasabi:Frame object is a themed control whose purpose is to provide a movable interface between two rectangular areas, much like the concept of an HTML frame.  Here are its parameters:&lt;br /&gt;
&lt;br /&gt;
* '''orientation''' - (str) One of the following four string values: &amp;quot;v&amp;quot; &amp;quot;vertical&amp;quot; &amp;quot;h&amp;quot; &amp;quot;horizontal&amp;quot; (Default is vertical).&lt;br /&gt;
* '''left''' - (id) The group to be instantiated in the left or top frame.&lt;br /&gt;
* '''right''' - (id) The group to be instantiated in the right or bottom frame.&lt;br /&gt;
* '''top''' - (id) The group to be instantiated in the left or top frame.&lt;br /&gt;
* '''bottom''' - (id) The group to be instantiated in the right or bottom frame.&lt;br /&gt;
* '''from''' - (str) One of the following string values: &amp;quot;l&amp;quot; &amp;quot;left&amp;quot; &amp;quot;t&amp;quot; &amp;quot;top&amp;quot; or &amp;quot;r&amp;quot; &amp;quot;right&amp;quot; &amp;quot;b&amp;quot; &amp;quot;bottom&amp;quot; (Default is left).&lt;br /&gt;
* '''width''' - (int) How many pixels from the chosen edge to start.&lt;br /&gt;
* '''height''' - (int) How many pixels from the chosen edge to start.&lt;br /&gt;
* '''resizable''' - (bool) Set this flag to allow the user to change the position of the framedivider.  Default is to allow it to be resizable.&lt;br /&gt;
* '''maxwidth''' - (int) The maximum amount of pixels you are able to move the poppler if resizable.&lt;br /&gt;
* '''minwidth''' - (int) The minimum amount of pixels you are able to move the poppler if resizable (If you go below this value the poppler will snap to 0).&lt;br /&gt;
* '''vgrabber''' - (string) The centered bitmap of the Grabber.&lt;br /&gt;
* '''vbitmap''' - (string) The stretched bitmap of the Grabber.&lt;br /&gt;
&lt;br /&gt;
In the following simple example, the &amp;quot;top&amp;quot; and &amp;quot;bottom&amp;quot; groups are displayed in a resizable frame object:&lt;br /&gt;
 &amp;lt;groupdef id=&amp;quot;top&amp;quot;&amp;gt;&lt;br /&gt;
 	&amp;lt;text text=&amp;quot;Top&amp;quot; align=&amp;quot;center&amp;quot; x=&amp;quot;0&amp;quot; y=&amp;quot;0&amp;quot; w=&amp;quot;0&amp;quot; h=&amp;quot;0&amp;quot; relatw=&amp;quot;1&amp;quot; relath=&amp;quot;1&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/groupdef&amp;gt;&lt;br /&gt;
 &amp;lt;groupdef id=&amp;quot;bottom&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;text text=&amp;quot;Bottom&amp;quot; align=&amp;quot;center&amp;quot; x=&amp;quot;0&amp;quot; y=&amp;quot;0&amp;quot; w=&amp;quot;0&amp;quot; h=&amp;quot;0&amp;quot; relatw=&amp;quot;1&amp;quot; relath=&amp;quot;1&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/groupdef&amp;gt;&lt;br /&gt;
 &amp;lt;groupdef id=&amp;quot;both&amp;quot;&amp;gt;&lt;br /&gt;
 	&amp;lt;Wasabi:Frame&lt;br /&gt;
 		orientation=&amp;quot;horizontal&amp;quot;&lt;br /&gt;
 		top=&amp;quot;top&amp;quot; bottom=&amp;quot;bottom&amp;quot;    &lt;br /&gt;
 		x=&amp;quot;0&amp;quot; y=&amp;quot;0&amp;quot; w=&amp;quot;0&amp;quot; h=&amp;quot;0&amp;quot;&lt;br /&gt;
 		relatw=&amp;quot;1&amp;quot; relath=&amp;quot;1&amp;quot;&lt;br /&gt;
 	/&amp;gt;&lt;br /&gt;
 &amp;lt;/groupdef&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;Wasabi:CheckBox/&amp;gt;==&lt;br /&gt;
The Wasabi:Checkbox object exists only as a namespaced object because it is expected to have only a single themed appearance.  The Wasabi:Checkbox object is used for both checkbox functionality and radiobutton functionality, depending up on the specification of its parameters.  It consists of a combination of a togglebutton and a text object to create a single functional user interface object.&lt;br /&gt;
* '''text''' - (str) The text to display as part of the checkbox.&lt;br /&gt;
* '''radioid''' - (id) If the button is to be used as part of a radio group, specify id of the parent Wasabi:RadioGroup object here.&lt;br /&gt;
* '''radioval''' - (int) If the button is to be used as part of a radio group, specify its unique integer value here.&lt;br /&gt;
* '''action''' - (str) see button.&lt;br /&gt;
* '''param''' - (str) see button.&lt;br /&gt;
* '''action_target''' - (id) see button.&lt;br /&gt;
As with togglebutton, this is a very useful object for binding to a configuration attribute. It is very popular in preferences interfaces. If the object has a value for radioval, that will be the value set into the attribute if the object is activated.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;Wasabi:DropDownList/&amp;gt;==&lt;br /&gt;
The Wasabi:DropDownList is a themed dialog object.  It may be statically filled via a parameter or dynamically through script or by binding it to a text feed from code.  A Wasabi:DropDownList object may be bound to an integer configuration attribute.&lt;br /&gt;
* '''items''' - (str) A semicolon delimited list of items to be displayed in the dropdown area.&lt;br /&gt;
* '''feed''' - (id) The id of a text feed to provide a semicolon delimited list of items to be displayed in the dropdown area.&lt;br /&gt;
* '''select''' - (int) Specifies an item to be selected.&lt;br /&gt;
* '''listheight''' - (int) Allows the skinner to specify the height of the dropdown area in pixels.&lt;br /&gt;
* '''maxitems''' - (int) Allows the skinner to specify the max height of the dropdown area in lines of text.  If the dropdown area has fewer lines of text than this value when this value is set, the dropdown area is sized to show no more than is needed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;Wasabi:ComboBox/&amp;gt;==&lt;br /&gt;
The Wasabi:ComboBox is a special type of object which combines dropdownlist functionality with an edit field as well.  It has the same parameters as Wasabi:DropDownList.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;Wasabi:HistoryEditBox/&amp;gt;==&lt;br /&gt;
The Wasabi:HistoryEditBox is an even more specialized version of this object family, its only purpose is to remember the last 64 items of text typed into it.  It has one extra parameter over Wasabi:DropDownList: &lt;br /&gt;
* '''navbuttons''' - (bool) Setting this flag will include the navigation buttons on the object.  Default is to have the buttons.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;componentbucket/&amp;gt;==&lt;br /&gt;
The componentbucket is a fancy name for the Thinger.  More precisely, in Winamp3, the &amp;quot;Thinger Window&amp;quot; is a window which implements a very simple horizontal componentbucket.  The object itself may be instantiated horizontally or vertically and the scrolling of the display within it should be controlled by button objects using &amp;quot;cb_next&amp;quot; and &amp;quot;cb_prev&amp;quot; action parameters and setting the cbtarget parameter to this object.  The object has the following parameters:&lt;br /&gt;
* '''leftmargin''' - (int) The number of extra pixels to pad the left (or top) edge of the total component bucket scrolling display.&lt;br /&gt;
* '''rightmargin''' - (int) The number of extra pixels to pad the right (or bottom) edge of the total component bucket scrolling display.&lt;br /&gt;
* '''spacing''' - (int) The number of extra pixels to place between each bucket icon.&lt;br /&gt;
* '''vertical''' - (bool) Whether or not the display should scroll vertically or horizontally.  Default is horizontal.&lt;br /&gt;
A simple &amp;quot;thinger group&amp;quot; follows:&lt;br /&gt;
 &amp;lt;groupdef id=&amp;quot;some.thinger.group.thing&amp;quot;&amp;gt;&lt;br /&gt;
 	&amp;lt;button id=&amp;quot;mythinger.up&amp;quot; x=&amp;quot;0&amp;quot; y=&amp;quot;0&amp;quot;&lt;br /&gt;
 		h=&amp;quot;20&amp;quot; w=&amp;quot;0&amp;quot; relatw=&amp;quot;1&amp;quot;&lt;br /&gt;
 		image=&amp;quot;mythinger.up.normal&amp;quot; &lt;br /&gt;
 		hoverimage=&amp;quot;mythinger.up.hover&amp;quot; &lt;br /&gt;
 		downimage=&amp;quot;mythinger.up.down&amp;quot;&lt;br /&gt;
 		action=&amp;quot;CB_PREV&amp;quot; cbtarget=&amp;quot;mythinger&amp;quot;&lt;br /&gt;
 	/&amp;gt;&lt;br /&gt;
 	&amp;lt;button id=&amp;quot;mythinger.down&amp;quot; x=&amp;quot;0&amp;quot; y=&amp;quot;-20&amp;quot;&lt;br /&gt;
 		h=&amp;quot;20&amp;quot; w=&amp;quot;0&amp;quot; relatw=&amp;quot;1&amp;quot; relaty=&amp;quot;1&amp;quot;&lt;br /&gt;
 		image=&amp;quot;mythinger.down.normal&amp;quot; &lt;br /&gt;
 		hoverimage=&amp;quot;mythinger.down.hover&amp;quot; &lt;br /&gt;
 		downimage=&amp;quot;mythinger.down.down&amp;quot;&lt;br /&gt;
 		action=&amp;quot;CB_NEXT&amp;quot; cbtarget=&amp;quot;mythinger&amp;quot;&lt;br /&gt;
 	/&amp;gt;&lt;br /&gt;
 	&amp;lt;componentbucket id=&amp;quot;mythinger&amp;quot; vertical=&amp;quot;1&amp;quot; x=&amp;quot;0&amp;quot; y=&amp;quot;20&amp;quot; w=&amp;quot;0&amp;quot; h=&amp;quot;-40&amp;quot; relath=&amp;quot;1&amp;quot;/&amp;gt; &lt;br /&gt;
 &amp;lt;/groupdef&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;customobject/&amp;gt;==&lt;br /&gt;
The customobject is a useful tool for temporarily instantiating a group into a user interface.  It has only one parameter:&lt;br /&gt;
groupid - (id) Instantiate the specified group into my defined area.&lt;br /&gt;
By finding your customobject in script and simply calling setXmlParam on it to give it new values for groupid, you can switch between the instantiation of multiple groups in a single user interface space.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;edit/&amp;gt; &amp;amp; &amp;lt;Wasabi:EditBox/&amp;gt;==&lt;br /&gt;
The edit control is, as you might guess, a text entry field. Some versions of Wasabi currently embed an OS edit control into the rectangular area defined by this object.  This embedded control will not blend properly with the rest of the skin's painting, it will always paint on top of everything else.  Keep this in mind when developing skins for widest compatibility.&lt;br /&gt;
* '''text''' - (str) Set the text in the edit field to this value.&lt;br /&gt;
* '''action''' - (str) Will accept the string &amp;quot;mb_url&amp;quot; to cause this edit box to automatically send its value as an url to the main minibrowser.&lt;br /&gt;
* '''multiline''' - (bool) Determines if the box is a single or multiple line input style.&lt;br /&gt;
* '''vscroll''' - (bool) Causes the edit window to have a vertical scroller.  Default is off.&lt;br /&gt;
* '''autohscroll''' - (bool) Causes the horizontal area to scroll if necessary.  Default is on.&lt;br /&gt;
* '''autoenter''' - (bool) Causes the system to automatically send a &amp;quot;done&amp;quot; event when the user stops typing past a certain timeout.  Default is off.&lt;br /&gt;
* '''password''' - (bool) Causes the echoed characters to be single marks for password purposes.  Default is off.&lt;br /&gt;
An edit object may be bound to a string configuration attribute.&lt;br /&gt;
 &lt;br /&gt;
Here's the definition of Wasabi:EditBox:&lt;br /&gt;
 &amp;lt;groupdef&lt;br /&gt;
 	id=&amp;quot;wasabi.edit&amp;quot; h=&amp;quot;20&amp;quot;&lt;br /&gt;
 	inherit_group=&amp;quot;wasabi.objectframe.group&amp;quot;&lt;br /&gt;
 	xuitag=&amp;quot;Wasabi:EditBox&amp;quot; embed_xui=&amp;quot;wasabi.edit.box&amp;quot;&lt;br /&gt;
 &amp;gt;&lt;br /&gt;
 	&amp;lt;edit id=&amp;quot;wasabi.edit.box&amp;quot; x=&amp;quot;1&amp;quot; y=&amp;quot;1&amp;quot; w=&amp;quot;-2&amp;quot; h=&amp;quot;-2&amp;quot; relatw=&amp;quot;1&amp;quot; relath=&amp;quot;1&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/groupdef&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;grid/&amp;gt;==&lt;br /&gt;
The grid object is a very nice object for creating stretchable images that still look good on the edges.  It is a graphic, like a layer, but unlike layer it is created by applying nine different bitmaps, stretching five of them.  There are, as you might guess, nine parameters&lt;br /&gt;
&lt;br /&gt;
* '''topleft''' - (id) A bitmap element for the top left section of the grid.&lt;br /&gt;
* '''top''' - (id) A bitmap element for the top middle section of the grid.&lt;br /&gt;
* '''topright''' - (id) A bitmap element for the top right section of the grid.&lt;br /&gt;
* '''left''' - (id) A bitmap element for the middle left section of the grid.&lt;br /&gt;
* '''middle''' - (id) A bitmap element for the center section of the grid.&lt;br /&gt;
* '''right''' - (id) A bitmap element for the middle right section of the grid.&lt;br /&gt;
* '''bottomleft''' - (id) A bitmap element for the bottom left section of the grid.&lt;br /&gt;
* '''bottom''' - (id) A bitmap element for the bottom middle section of the grid.&lt;br /&gt;
* '''bottomright''' - (id) A bitmap element for the bottom right section of the grid. &lt;br /&gt;
&lt;br /&gt;
Essentially, the given rectangle of the grid is intersected with 2 horizontal and 2 vertical lines.  The topleft, topright, bottomleft, and bottomright bitmap elements will not be resized.  The top, left, middle, right, and bottom bitmap elements, however, will be stretched to make all fit the grid rectangle.  Using intelligently sized bitmap elements is fairly critical for this object.  If you're having trouble, try starting with all of your bitmap elements as equal-sized squares.&lt;br /&gt;
&lt;br /&gt;
 Example:&lt;br /&gt;
 &amp;lt;grid x=&amp;quot;70&amp;quot; y=&amp;quot;25&amp;quot; w=&amp;quot;-74&amp;quot; relatw=&amp;quot;1&amp;quot; h=&amp;quot;20&amp;quot; topleft=&amp;quot;main.text.left&amp;quot; top=&amp;quot;main.text.center&amp;quot; topright=&amp;quot;main.text.right&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;group/&amp;gt;==&lt;br /&gt;
Groups are instantiated by using the group tag.  Groups, when instantiated within a layout or some other groupdef, take the standard GuiObject params in order to define the group's instantiated size and properties, and then all of the contents of the group will be instantiated within the space it defines.  At instantiation, a group will express a specified boundary rectangle and, thus, the positions of objects within it depending upon relative, proportional, or design coordinate systems may then be calculated.&lt;br /&gt;
 &lt;br /&gt;
To specify which groupdef to instantiate, set the id parameter of the group tag to the id of the desired groupdef.  The instantiation of each group can be so customized, however, group instantiates also may be assigned their own custom id to allow each instantiate to be found by code or script:&lt;br /&gt;
* '''id''' (id) - The groupdef to be instantiated.&lt;br /&gt;
* '''instance_id''' (str) - A new id value with which to be able find this particular instantiate.&lt;br /&gt;
&lt;br /&gt;
The following snippet will create two instantiates of the source group, with one specially customized (in the assumption that the &amp;quot;specialchild.maki&amp;quot; script will be handling the fact one is going to be special) :&lt;br /&gt;
 &amp;lt;groupdef id=&amp;quot;child&amp;quot;&amp;gt;&lt;br /&gt;
 	&amp;lt;layer image=&amp;quot;childimg&amp;quot; x=&amp;quot;0&amp;quot; y=&amp;quot;0&amp;quot; w=&amp;quot;0&amp;quot; h=&amp;quot;0&amp;quot; relatw=&amp;quot;0&amp;quot; relath=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/groupdef&amp;gt;&lt;br /&gt;
 &amp;lt;groupdef id=&amp;quot;parent&amp;quot;&amp;gt;&lt;br /&gt;
 	&amp;lt;group id=&amp;quot;child&amp;quot; x=&amp;quot;0&amp;quot; y=&amp;quot;0&amp;quot; w=&amp;quot;0&amp;quot; relatw=&amp;quot;0&amp;quot; h=&amp;quot;90&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;group id=&amp;quot;child&amp;quot; instance_id=&amp;quot;special&amp;quot;&lt;br /&gt;
 		notify=&amp;quot;This is a special notification for this obj.&amp;quot;&lt;br /&gt;
 		x=&amp;quot;0&amp;quot; y=&amp;quot;90&amp;quot; w=&amp;quot;0&amp;quot; relatw=&amp;quot;0&amp;quot; h=&amp;quot;-90&amp;quot; relath=&amp;quot;1&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;script file=&amp;quot;specialchild.maki&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/groupdef&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;grouplist/&amp;gt;==&lt;br /&gt;
A grouplist is, oddly enough, an object whose purpose is to accept and display a list of multiple groups.  For instance, Wasabi's popup menu is a grouplist.  A grouplist is expected to be filled in script, and it has no interesting parameters.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;layer/&amp;gt;==&lt;br /&gt;
In Wasabi, the layer is analogous to the same-named object in photoshop.  It is simply a nice bitmap graphic to be displayed in the user interface (with the standard alpha and region effects available to all guiobject derived objects, based by default on the properties of the bitmap element it houses).  Here are its parameters:&lt;br /&gt;
* '''image''' - (id) The id of the bitmap element to be used for display.&lt;br /&gt;
* '''inactiveimage''' - (id) A secondary id to be displayed if this guiobject is set to &amp;quot;inactive&amp;quot; status.&lt;br /&gt;
* '''region''' - (id) The id of a different bitmap element to use as the source of this object's region.&lt;br /&gt;
* '''tile''' - (bool) Setting this flag will tile the image if the rectangular size of the layer is different than the rectangular size of the bitmap.  The default is to stretch.&lt;br /&gt;
* '''resize''' - (str) A specific string enumerating which direction one should allow the resizing of the parent layout if this object's region is gripped and dragged by the user. Incompatible with the move parameter on guiobject.  See below.&lt;br /&gt;
* '''scale''' - (str) A specific string enumerating which direction one should allow the scaling of the parent layout if this object's region is gripped and dragged by the user.  Incompatible with the move parameter on guiobject.  See below.&lt;br /&gt;
* '''dblclickaction''' - (str) The string of an action to be sent into the system if this object is doubleclicked within its region.&lt;br /&gt;
The resize and scale parameters transform the simple layer graphic into interactive gui objects in the system by enabling them to be dragged by the user to resize or change the scale of the parent layout.  The eight possible values for these parameters are &amp;quot;top&amp;quot; &amp;quot;left&amp;quot; &amp;quot;right&amp;quot; &amp;quot;bottom&amp;quot; &amp;quot;topleft&amp;quot; &amp;quot;topright&amp;quot; &amp;quot;bottomleft&amp;quot; and &amp;quot;bottomright.&amp;quot;  If both resize and scale are set on a single layer, the object will act as a resizer by default but as a scaler if the ALT key is held down.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;animatedlayer/&amp;gt;==&lt;br /&gt;
An animatedlayer is a series of frames of sprite animation displayed in the GUI.  The frames of animation are specified in the bitmap element which is given in the image parameter to this object.  The animation is expected to be a specific progression of frames of a fixed size, also to be specified via parameters on the object.  Each frame of animation will have its own region.    The animatedlayer object inherits directly from the layer object, so all of the above parameters are valid, along with these specific to animation:&lt;br /&gt;
* '''frameheight''' - (int) The height in pixels of each cell of animation.  If frameheight is set, the animation will be assumed to be a vertical strip of cells in the given bitmap.&lt;br /&gt;
* '''framewidth''' - (int) The width in pixels of each cell of animation.  If framewidth is set, the animation will be assumed to be a horizontal strip of cells in the given bitmap.&lt;br /&gt;
* '''elementframes''' - (int) The number of total frames of animation.  If this value is set, the animation will be assumed to be comprised of multiple bitmap elements whose ids are resolved by using the value of the image parameter as a printf-compatible formatting string with a single integer parameter.  See below.&lt;br /&gt;
* '''start''' - (int) The frame index which should be used as the beginning frame of the animation.  Default is the first frame of the defined animation list.&lt;br /&gt;
* '''end''' - (int) The frame index which should be used as the terminating frame of the animation.  Default is the last frame of the defined animation list.&lt;br /&gt;
* '''speed''' - (int) The delay in ms between each frame, on average.  Default is 200 ms.&lt;br /&gt;
* '''realtime''' - (bool) Setting this flag will force-redraw the animation area the moment the new frame is meant to be seen.  Default behaviour is to wait for and go along with the other invalidations from the rest of the UI on the main thread's draw loop.  Expect use of this flag to have a high impact on system performance on slower machines.  In other words, don't use it unless you know what you're doing.&lt;br /&gt;
* '''autoreplay''' - (bool) Setting this flag will cause the animation to repeat to the beginning frame once it has displayed the terminating frame of animation.  Default is ON.&lt;br /&gt;
* '''autoplay''' - (bool)  Setting this flag will cause the animation to begin playing the moment it is loaded into the user interface.  Default is OFF.  See below.&lt;br /&gt;
* '''debug''' - (bool)  Setting this flag will cause the system to draw the current frame number of the animation on top of the animation graphics, for, as you might guess, debug purposes.&lt;br /&gt;
&lt;br /&gt;
You must note that animations are usually meant to be &amp;quot;triggered&amp;quot; through script, as too many live animations happily blitting their way through a deep and complex user interface using lots of alpha blending, et al, can cause significant performance bottlenecks on slow computers (especially if your users aren't expecting your application to be eating all of the machine resources).  With this in mind, if you just create an animated layer and drop it into a skin, it will not begin animating unless you set the autoplay parameter.&lt;br /&gt;
 &lt;br /&gt;
There are three different ways to present animation frames to this object.  The frames may either all be concatenated into a vertical or horizontal &amp;quot;filmstrip&amp;quot; style bitmap element -- in which case the height or width of each animation cell (respectively) should be set with the frameheight or framewidth parameter.  &lt;br /&gt;
The third way to give this object its animation frames is more complex and consists of loading multiple bitmap elements with each bitmap representing one frame of animation.  This is done by first setting the elementframes parameter with the number of frames to be loaded, then by using a special formatting string as the image parameter.  For those familiar with the printf function, when the elementframes parameter is set, that integer will be run in a for loop and the image name will be used as the formatting string to a printf function that takes only the current integer in the for loop as a parameter.&lt;br /&gt;
For those unfamiliar with printf, this will seem a bit confusing.  Somewhere in the string you pass to the image parameter, you should have the two characters %d, and these characters will be replaced by the character representation of the number as it loads bitmap elements.  If you want to have 0-loaded prefix characters (for instance &amp;quot;01-09&amp;quot; instead of &amp;quot;1-9&amp;quot;), you can place %02d into your image parameter, and if there aren't enough characters in the number to make up 2 full digits, the number will be left-padded with the zero character.  You can just as easily use any number of padding characters as well.  &lt;br /&gt;
I highly suspect this all still makes little sense, so let me give you a simplified example (missing important parameters) to show three different animated layers each loading three sets of differently named bitmaps:&lt;br /&gt;
 &amp;lt;elements&amp;gt;&lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;bmp1&amp;quot;/&amp;gt; &lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;bmp2&amp;quot;/&amp;gt; &lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;bmp3&amp;quot;/&amp;gt; &lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;bmp01img&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;bmp02img&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;bmp03img&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;b00001mp&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;b00002mp&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;b00003mp&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/elements&amp;gt;&lt;br /&gt;
 &amp;lt;groupdef id=&amp;quot;whatever&amp;quot;&amp;gt;&lt;br /&gt;
 	&amp;lt;animatedlayer image=&amp;quot;bmp%d&amp;quot; elementframes=&amp;quot;3&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;animatedlayer image=&amp;quot;bmp%02dimg&amp;quot; elementframes=&amp;quot;3&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;animatedlayer image=&amp;quot;b%05dmp&amp;quot; elementframes=&amp;quot;3&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/groupdef&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;layoutstatus/&amp;gt;==&lt;br /&gt;
The layoutstatus implements the small statusbar that can be found at the bottom of many of the default normal layouts which can contain status text, appcmds buttons, and a proportionally completed progress bar.  The two parameters to this object control what appcmds will be allowed in the status bar:&lt;br /&gt;
* '''exclude''' - (str) A semicolon delimited list of names of appcmds which should not be shown by this control.&lt;br /&gt;
* '''include_only''' - (str) A semicolon delimited list of names of appcmds which will be the only appcmds allowed to be shown by this control.&lt;br /&gt;
For the most part, these layoutstatus objects are only controllable from code.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;list/&amp;gt;==&lt;br /&gt;
The list object is similar but not identical to the Win32 list common control.  It is an  optionally multicolumnar list whose purpose is to display multiple pieces of information per horizontal row.  It may be filled directly by encoding the contents in the XML, by attaching the object to a proper text feed, or by calling methods on the object from script.  The parameters for this object are:&lt;br /&gt;
* '''items''' - (str) A properly delimited string of data used to fill the list.  See below.&lt;br /&gt;
* '''multiselect''' - (bool) This flag, when set, allows the user to select multiple items in the list.  Default is to allow multiselect.&lt;br /&gt;
* '''autodeselect''' - (bool) This flag, when set, causes selection of any single item in the list to automatically deselect all other items in the list.  Default is to not autodeselect.&lt;br /&gt;
* '''select''' - (str) The text of a list item to be selected.&lt;br /&gt;
* '''antialias''' - (bool) Setting this flag causes the text to be rendered antialiased if possible.&lt;br /&gt;
* '''feed''' - (id) The id of a text feed to be used to fill this list.&lt;br /&gt;
* '''hoverselect''' - (bool) This flag causes list items to be selected if the user hovers over them.  Default is to not hoverselect.&lt;br /&gt;
* '''sort''' - (bool) This flag causes the list to sort itself.  Default is to not sort.&lt;br /&gt;
* '''selectonupdown''' - (bool) This flag causes the list to interpret the keyboard commands to mean &amp;quot;change my selection to the item.&amp;quot;  Default is to select on keyboard events.&lt;br /&gt;
* '''numcolumns''' - (int) How many columns to show.  Default is one.&lt;br /&gt;
* '''columwidths''' - (int) A semicolon delimited list of integers specifying how to size the column widths in this list.  See below.&lt;br /&gt;
* '''columnlabels''' - (str) A semicolon delimited list of strings to be used as the multiple column labels.&lt;br /&gt;
The list object depends upon being fed numerous strings with proper syntax in order to properly generate and populate a complex list display.  The syntax for the items parameter (which is the same syntax as the feed must provide) is to delimit each full row in the list with the ';' semicolon character and to delimit each column entry per row with the ',' character.  The columnwidths and columnlabels also require a semicolon (';') delimited list of data, one entry per column.  Note that if -1 is given as a width, those columns will be of dynamic width and split up the leftover pixels among themselves.  The default is one column with no labels and a width of -1.&lt;br /&gt;
 &lt;br /&gt;
Here is a sample list object with 3 rows and 3 columns:&lt;br /&gt;
 &amp;lt;list id=&amp;quot;three.by.three&amp;quot;&lt;br /&gt;
 	items=&amp;quot;row1,text,1;row2,moretext,2;row3,stilltext,3&amp;quot;&lt;br /&gt;
 	numcolumns=&amp;quot;3&amp;quot; columnwidths=&amp;quot;50,-1,50&amp;quot;&lt;br /&gt;
 	multiselect=&amp;quot;0&amp;quot; autodeselect=&amp;quot;1&amp;quot;&lt;br /&gt;
 /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;mouseredir/&amp;gt;==&lt;br /&gt;
This object simply redirects all mouse events from its region to the target object specified in the parameter:&lt;br /&gt;
* '''target''' - (id) The target object to get mouse events.&lt;br /&gt;
This is useful for when some objects get overlapped by nonfunctional graphics when laying out complex interfaces.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;Wasabi:RadioGroup/&amp;gt;==&lt;br /&gt;
The Wasabi:RadioGroup object is an invisible object whose purpose is to centralize the functionality of multiple Wasabi:CheckBox objects instantiated in radiobutton mode.  The radioid params on the Wasabi:CheckBox instantiates should give the id of one of these Wasabi:RadioGroup objects.  It has no unique parameters.  Here is a snippet of simple radiobutton functionality:&lt;br /&gt;
 &amp;lt;Wasabi:RadioGroup id=&amp;quot;enableddisabled&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;Wasabi:CheckBox x=&amp;quot;50&amp;quot; y=&amp;quot;110&amp;quot; w=&amp;quot;60&amp;quot;&lt;br /&gt;
 	text=&amp;quot;Enabled&amp;quot; radioid=&amp;quot;enableddisabled&amp;quot;&lt;br /&gt;
 	cfgattrib=&amp;quot;{9149C445-3C30-4E04-8433-5A518ED0FDDE};Enable desktop alpha&amp;quot;&lt;br /&gt;
 	radioval=&amp;quot;1&amp;quot;&lt;br /&gt;
 /&amp;gt;&lt;br /&gt;
 &amp;lt;Wasabi:CheckBox x=&amp;quot;-125&amp;quot; y=&amp;quot;110&amp;quot; w=&amp;quot;62&amp;quot; relatx=&amp;quot;1&amp;quot;&lt;br /&gt;
 	text=&amp;quot;Disabled&amp;quot; radioid=&amp;quot;enableddisabled&amp;quot;&lt;br /&gt;
 	cfgattrib=&amp;quot;{9149C445-3C30-4E04-8433-5A518ED0FDDE};Enable desktop alpha&amp;quot;&lt;br /&gt;
 	radioval=&amp;quot;0&amp;quot;&lt;br /&gt;
 /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;rect/&amp;gt;==&lt;br /&gt;
A nice flat rectangle.  It may be either filled or hollow, and if hollow you may specify only some edges drawn.  Here are its parameters:&lt;br /&gt;
* '''color''' - (id) The id of a color element, or an comma delimited integer triplet RGB value.  Default is &amp;quot;255,00,255&amp;quot; (an ugly color to remind you to set it).&lt;br /&gt;
* '''filled''' - (bool) This flag causes the entire rectangular area to be filled with color.  Default is to not be filled.&lt;br /&gt;
* '''edges''' - (str) A pipe (&amp;quot;|&amp;quot;) delimited set of one or all of the following: &amp;quot;left&amp;quot; &amp;quot;right&amp;quot; &amp;quot;top&amp;quot; &amp;quot;bottom&amp;quot; Default is all, ie: &amp;quot;left|right|top|bottom&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;script/&amp;gt;==&lt;br /&gt;
Scripts allow for the simple creation of UI functionality without requiring C++ code.  While scripts are &amp;quot;compiled&amp;quot; into &amp;quot;script binaries,&amp;quot; these script binaries are special to wasabi and, more importantly, can be run by any compatible Wasabi runtime on any OS to which Wasabi has a runtime.  Scripts are bound like GuiObjects into layout or groupdef sections using the script tag and have the ability to find and modify the nearby sibling and child objects once the UI has been fully instantiated.  Scripts have two important parameters:&lt;br /&gt;
* '''file''' - (str) The filename of the .maki file to load, relative to this xml file.&lt;br /&gt;
* '''param''' - (str) A string that will be available to the instance of the .maki file as an instance specific parameter.&lt;br /&gt;
Note that a single .maki file may be instantiated as a script object numerous times over, and each instantiation can have its own specific parameter data.  Judicious use of this feature can help minimize your reliance on hardcoded strings and limited flexibility in your scripting.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;slider/&amp;gt; &amp;amp; &amp;lt;Wasabi:HSlider/&amp;gt; &amp;amp; &amp;lt;Wasabi:VSlider/&amp;gt;==&lt;br /&gt;
The slider object consists of a background set of images, and a thumb.  The thumb is constrained to move in one dimension -- horizontally or vertically, depending upon its orientation.  The distance in pixels travelled by the thumb across its total distance is interpollated to produce a value between the low and high boundary integers which is assigned to any configuration attribute which may happen to be attached.  Here are the parameters for slider:&lt;br /&gt;
* '''barleft''' - (id) The bitmap element for the left or top position of the slider.&lt;br /&gt;
* '''barmiddle''' - (id) The bitmap element for the middle, stretched, position of the slider.&lt;br /&gt;
* '''barright''' - (id) The bitmap element for the right or bottom position of the slider.&lt;br /&gt;
* '''thumb''' - (id) The bitmap element for the slider thumb.&lt;br /&gt;
* '''downthumb''' - (id) The bitmap element for the slider thumb when held by the user.&lt;br /&gt;
* '''hoverthumb''' - (id) The bitmap element for the slider thumb when the user's mouse is above it.&lt;br /&gt;
* '''orientation''' - (str) Either &amp;quot;v&amp;quot; or &amp;quot;vertical&amp;quot; to make the slider vertical, otherwise it will be horizontal.&lt;br /&gt;
* '''low''' - (int) Set the low-value boundary.  Default is 0.&lt;br /&gt;
* '''high''' - (int) Set the high-value boundary.  Default is 255.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;snappoint/&amp;gt;==&lt;br /&gt;
The snappoint is an invisible point that will attract other snappoint objects with the same id in any other layout and make them want to dock, like little magnets.  These objects have only the following subset of guiobject XML parameters:&lt;br /&gt;
* '''id''' - (id) All snappoint objects with the same id will snap to each other.  Different ids ignore each other.&lt;br /&gt;
* '''x''' - (int) The x position of the snappoint, see: guiobject.&lt;br /&gt;
* '''y''' - (int) The y position of the snappoint, see: guiobject.&lt;br /&gt;
* '''relatx''' - (int) The horizontal coordinate space of the snappoint, see: guiobject.&lt;br /&gt;
* '''relaty''' - (int) The vertical coordinate space of the snappoint, see: guiobject.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;Wasabi:TabSheet/&amp;gt;==&lt;br /&gt;
The Wasabi:TabSheet object contains multiple group instances within it and allows the user to switch between the display of those groups by the ability to click on a list of tab buttons at the top of the rectangular area of the Wasabi:TabSheet.  The name parameter of each groupdef is displayed as the text in the tab which corresponds to it.  Here are the Wasabi:TabSheet parameters:&lt;br /&gt;
* '''windowtype''' - (str) A windowtype string which will instantiate one of every groupdef with the same windowtype and every window class registered with a window creation service to include this windowtype.&lt;br /&gt;
* '''children''' - (id) A semicolon delimited list of groupdef ids to also be instantiated as children of this tabsheet.&lt;br /&gt;
* '''type''' - (int) There are two different themed display styles for Wasabi:TabSheet.  One is with multiple tabs (sheet style), one is with a single button on top that will popup a menu with all the possible tab choices (sidecar style).  The Default is sheet style, which is a value of -2.  Any other value besides -2 will give you sidecar style.&lt;br /&gt;
* '''content_margin_top''' - (int) A margin in pixels to offset the content from the client rectangle of the Wasabi:Tabsheet.&lt;br /&gt;
* '''content_margin_left''' - (int) A margin in pixels to offset the content from the client rectangle of the Wasabi:Tabsheet.&lt;br /&gt;
* '''content_margin_right''' - (int) A margin in pixels to offset the content from the client rectangle of the Wasabi:Tabsheet.&lt;br /&gt;
* '''content_margin_bottom''' - (int) A margin in pixels to offset the content from the client rectangle of the Wasabi:Tabsheet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;text/&amp;gt; &amp;amp; &amp;lt;Wasabi:Text/&amp;gt;==&lt;br /&gt;
The text object is for using the system to render some text in the font of your choice.&lt;br /&gt;
Since Winamp 5.5 (skinversion 1.3) text objects can have multiple lines. For a new line use this &amp;quot;/n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* '''display''' - (str) Either a specific system display string or the string identifier of a text feed.  Setting this value will override the text parameter.  See below.&lt;br /&gt;
* '''ticker''' - (bool) Setting this flag causes the object to scroll left and right if the text does not fit the rectangular area of the text object.&lt;br /&gt;
* '''antialias''' - (bool) Setting this flag causes the text to be rendered antialiased if possible.&lt;br /&gt;
* '''text''' - (str) A static string to be displayed.&lt;br /&gt;
* '''default''' - (str) A parameter alias for text.&lt;br /&gt;
* '''font''' - (id) The id of a bitmapfont or truetypefont element.  If no element with that id can be found, the OS will be asked for a font with that name instead.&lt;br /&gt;
* '''fontsize''' - (int) The size to render the chosen font.&lt;br /&gt;
* '''align''' - (str) One of the following three possible strings: &amp;quot;left&amp;quot; &amp;quot;center&amp;quot; &amp;quot;right&amp;quot; -- Default is &amp;quot;left.&amp;quot;&lt;br /&gt;
* '''valign''' - (str) One of the following three possible strings: &amp;quot;top&amp;quot; &amp;quot;center&amp;quot; &amp;quot;bottom&amp;quot; -- Default is &amp;quot;top.&amp;quot;&lt;br /&gt;
* '''color''' - (int) The comma delimited RGB color of the text.&lt;br /&gt;
* '''shadowcolor''' - (int) The comma delimited RGB color for underrendered shadow text.&lt;br /&gt;
* '''shadowx''' - (int) The x offset of the shadowrender.&lt;br /&gt;
* '''shadowy''' - (int) The y offset of the shadowrender.&lt;br /&gt;
* '''timeroffstyle''' - (int) How to display an empty timer: &amp;quot;0&amp;quot; = &amp;quot;  :  &amp;quot;, &amp;quot;1&amp;quot; = &amp;quot;00:00&amp;quot;, and &amp;quot;2&amp;quot;=&amp;quot;&amp;quot; (if one is displaying time)&lt;br /&gt;
* '''timecolonwidth''' - (int) How many extra pixels wider or smaller should the colon be when displaying time.  Default is -1.&lt;br /&gt;
* '''nograb''' - (bool) Setting this flag will cause the text object to ignore left button down messages.  Default is off.&lt;br /&gt;
* '''showlen''' - (bool) Setting this flag will cause the text display to be appended with the length in minutes and seconds of the current song.  Default is off.&lt;br /&gt;
* '''forcefixed''' - (bool) Force the system to attempt to render the display string with fixed-width font spacing.&lt;br /&gt;
* '''forceupcase''' - (bool) Force the system to make the display string all uppercase before display.&lt;br /&gt;
* '''forceuppercase''' - (bool) Force the system to make the display string all uppercase before display.&lt;br /&gt;
* '''forcelocase''' - (bool) Force the system to make the display string all lowercase before display.&lt;br /&gt;
* '''forcelowercase''' - (bool) Force the system to make the display string all lowercase before display.  &lt;br /&gt;
* '''bold''' - (bool) Render the display string in bold.&lt;br /&gt;
* '''wrap''' - (bool) Setting this flag will cause the text to wrap in its rectangular space.  Default is off.&lt;br /&gt;
* '''dblclickaction''' - (str) A string in the form &amp;quot;SWITCH;layout&amp;quot; where layout is the id of a layout in this object's parent container.  No other actions function on this object.  This action is deprecated.&lt;br /&gt;
* '''offsetx''' - (int) Extra pixels to be added to or subtracted from the calculated x value for the display string to render.&lt;br /&gt;
* '''offsety''' - (int) Extra pixels to be added to or subtracted from the calculated x value for the display string to render.&lt;br /&gt;
 &amp;quot;SONGNAME&amp;quot; 		- The name string of the currently playing song (from metadb).&lt;br /&gt;
 &amp;quot;SONGINFO&amp;quot; 		- The full info string of the currently playing song (from metadb).&lt;br /&gt;
 &amp;quot;SONGARTIST&amp;quot; 		- The artist string of the currently playing song (from metadb).&lt;br /&gt;
 &amp;quot;SONGTITLE&amp;quot; 		- The title string of the currently playing song (from metadb).&lt;br /&gt;
 &amp;quot;SONGALBUM&amp;quot; 		- The album string of the currently playing song (from metadb).&lt;br /&gt;
 &amp;quot;SONGLENGTH&amp;quot; 		- The length string of the currently playing song (from metadb).&lt;br /&gt;
 &amp;quot;TIME&amp;quot; 			- The length string of the currently playing song.&lt;br /&gt;
 &amp;quot;TIMEELAPSED&amp;quot; 		- The elapsed time string of the currently playing song.&lt;br /&gt;
 &amp;quot;TIMEREMAINING&amp;quot; 	- The time remaining string of the currently playing song.&lt;br /&gt;
 &amp;quot;COMPONENTBUCKET&amp;quot; 	- The id of the componentbucket (thinger) item the mousecursor is currently hovering above.&lt;br /&gt;
 &amp;quot;SONGBITRATE&amp;quot; 		- The bitrate string of the currently playing song (from metadb).&lt;br /&gt;
 &amp;quot;SONGSAMPLERATE&amp;quot; 	- The sample string of the currently playing song (from metadb).&lt;br /&gt;
 &lt;br /&gt;
 *** Broken Action (Winamp 5) ***&lt;br /&gt;
 &amp;quot;NORMALIZER:STATUS&amp;quot; 	- The current status of the audio normalizer.&lt;br /&gt;
&lt;br /&gt;
 Example:&lt;br /&gt;
 &amp;lt;text x=&amp;quot;81&amp;quot; y=&amp;quot;11&amp;quot; w=&amp;quot;25&amp;quot; h=&amp;quot;21&amp;quot; antialias=&amp;quot;0&amp;quot; text=&amp;quot;Read This&amp;quot; align=&amp;quot;center&amp;quot; color=&amp;quot;0,0,0&amp;quot; bold=&amp;quot;1&amp;quot;/&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;Wasabi:TitleBox/&amp;gt;==&lt;br /&gt;
The Wasabi:TitleBox object is a nice way to put a simple rectangular frame and title around your content groups.  It has the following parameters:&lt;br /&gt;
* '''title''' - (str) The string to display in the title area.  Default is to use the name parameter of the content group.&lt;br /&gt;
* '''content''' - (id) The id of the groupdef to instantiate as content.&lt;br /&gt;
* '''centered''' - (bool) Setting this flag will center the title text.  Default is to not be centered (and be left justified).&lt;br /&gt;
* '''suffix''' - (str) A string which will be appended to the title before it is displayed.  In this way, if you instantiate multiple groups as content, each name change can still have a string appended.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;Wasabi:Titlebar/&amp;gt;==&lt;br /&gt;
The Wasabi:TitleBar is the graphically themed bar that is placed at the top of all of the Wasabi:StandardFrame windows.  It has the same parameters as the text object, which control the text display of the titlebar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;tree/&amp;gt;==&lt;br /&gt;
The tree object displays a hierarchical set of information with multiple items, where each item may in turn have multiple subitems.  Let's examine its parameters:&lt;br /&gt;
* '''items''' - (str) A specially formatted string describing the hierarchical creation of the tree info.  See below.&lt;br /&gt;
* '''feed''' - (str) The string identifier of a text feed which should provide a string in the same format as the items parameter.&lt;br /&gt;
* '''sorted''' - (bool) Setting this flag will cause all of the tree items to be sorted before display.  Default is to sort.&lt;br /&gt;
* '''childtabs''' - (bool) Setting this flag will cause all tree items with children to display a tab graphic beside them.  Default is to show tab graphics.&lt;br /&gt;
* '''expandroot''' - (bool) Setting this flag will cause all root tree items to display with their children pre-expanded.  Default is to pre-expand root tree items.&lt;br /&gt;
The syntax required to describe the hierarchy of tree items is a semicolon delimited list of objects in the form &amp;quot;name(list)&amp;quot; where name is the string to display for that tree item and list is another semicolon delimited list of objects which are the direct children of name. &lt;br /&gt;
 &lt;br /&gt;
The following snippet will create a tree with one root node that has three child nodes, with each child node having differing numbers of sub nodes:&lt;br /&gt;
 &amp;lt;tree id=&amp;quot;example.tree&amp;quot;&lt;br /&gt;
 	x=&amp;quot;0&amp;quot; y=&amp;quot;0&amp;quot; w=&amp;quot;0&amp;quot; h=&amp;quot;0&amp;quot; relatw=&amp;quot;1&amp;quot; relath=&amp;quot;1&amp;quot;&lt;br /&gt;
 	items=&amp;quot;root(child1(sub1;sub2);child2;child3(sub3))&amp;quot;&lt;br /&gt;
 /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;vis/&amp;gt;==&lt;br /&gt;
The vis object is the multistate audio visualization display.  It has a multitude of parameters for how simple it is:&lt;br /&gt;
* '''colorallbands''' - (int) The comma delimited RGB triplet to color all the spectroscope bands.&lt;br /&gt;
* '''colorband1''' - (int) The comma delimited RGB triplet to color spectroscope band 1.&lt;br /&gt;
* '''colorband2''' - (int) The comma delimited RGB triplet to color spectroscope band 2.&lt;br /&gt;
* '''colorband3''' - (int) The comma delimited RGB triplet to color spectroscope band 3.&lt;br /&gt;
* '''colorband4''' - (int) The comma delimited RGB triplet to color spectroscope band 4.&lt;br /&gt;
* '''colorband5''' - (int) The comma delimited RGB triplet to color spectroscope band 5.&lt;br /&gt;
* '''colorband6''' - (int) The comma delimited RGB triplet to color spectroscope band 6.&lt;br /&gt;
* '''colorband7''' - (int) The comma delimited RGB triplet to color spectroscope band 7.&lt;br /&gt;
* '''colorband8''' - (int) The comma delimited RGB triplet to color spectroscope band 8.&lt;br /&gt;
* '''colorband9''' - (int) The comma delimited RGB triplet to color spectroscope band 9.&lt;br /&gt;
* '''colorband10''' - (int) The comma delimited RGB triplet to color spectroscope band 10.&lt;br /&gt;
* '''colorband11''' - (int) The comma delimited RGB triplet to color spectroscope band 11.&lt;br /&gt;
* '''colorband12''' - (int) The comma delimited RGB triplet to color spectroscope band 12.&lt;br /&gt;
* '''colorband13''' - (int) The comma delimited RGB triplet to color spectroscope band 13.&lt;br /&gt;
* '''colorband14''' - (int) The comma delimited RGB triplet to color spectroscope band 14.&lt;br /&gt;
* '''colorband15''' - (int) The comma delimited RGB triplet to color spectroscope band 15.&lt;br /&gt;
* '''colorband16''' - (int) The comma delimited RGB triplet to color spectroscope band 16.&lt;br /&gt;
* '''colorbandpeak''' - (int) The comma delimited RGB triplet to color the spectroscope peak line.&lt;br /&gt;
* '''colorallosc''' - (int) The comma delimited RGB triplet to color the whole oscilloscope.&lt;br /&gt;
* '''colorosc1''' - (int) The comma delimited RGB triplet to color oscilloscope section 1.&lt;br /&gt;
* '''colorosc2''' - (int) The comma delimited RGB triplet to color oscilloscope section 2.&lt;br /&gt;
* '''colorosc3''' - (int) The comma delimited RGB triplet to color oscilloscope section 3.&lt;br /&gt;
* '''colorosc4''' - (int) The comma delimited RGB triplet to color oscilloscope section 4.&lt;br /&gt;
* '''colorosc5''' - (int) The comma delimited RGB triplet to color oscilloscope section 5.&lt;br /&gt;
* '''channel''' - (int) One of three values for which channel to monitor: &amp;quot;1&amp;quot; is left channel, &amp;quot;2&amp;quot; is right channel, &amp;quot;3&amp;quot; is stereo.  Default is stereo.&lt;br /&gt;
* '''fliph''' - (bool) If this flag is set, it blits the vis pixels flipped horizontally.&lt;br /&gt;
* '''flipv''' - (bool) If this flag is set, it blits the vis pixels flipped vertically.&lt;br /&gt;
* '''mode''' - (int) One of three values for which mode to display: &amp;quot;0&amp;quot; is no display, &amp;quot;1&amp;quot; is spectroscope, &amp;quot;2&amp;quot; is oscilloscope.  Default is to read from a config item.&lt;br /&gt;
When the user clicks on the vis, it will cycle between its three modes.&lt;br /&gt;
* '''peaks''' - (bool) Enable peaks for the spectroscope.&lt;br /&gt;
* '''peakfalloff''' - (int) Set the speed of the peaks fall (0-4).&lt;br /&gt;
* '''falloff''' - (int) Set the speed of the spectroscope fall&lt;br /&gt;
* '''coloring''' - (string) Change coloring method for spectroscope (&amp;quot;Normal&amp;quot;, &amp;quot;Fire&amp;quot; or &amp;quot;Line&amp;quot;).&lt;br /&gt;
* '''bandwidth''' - (string) Change the style of the spectroscope (&amp;quot;thin&amp;quot; or &amp;quot;wide&amp;quot;).&lt;br /&gt;
* '''oscstyle''' - (string) Change the style of the oscilloscope (&amp;quot;solid&amp;quot;, &amp;quot;dots&amp;quot; or &amp;quot;lines&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;eqvis/&amp;gt;==&lt;br /&gt;
The eqvis object is rather specific to media players, as it is the spline display for the eq settings in the Wasabi Media Player.&lt;br /&gt;
* '''colortop''' - (str) A color value or color element id for the top portion of the spline display.&lt;br /&gt;
* '''colormiddle''' - (str) A color value or color element id for the middle portion of the spline display.&lt;br /&gt;
* '''colorbottom''' - (str) A color value or color element id for the bottom portion of the spline display.&lt;br /&gt;
* '''colorpreamp''' - (str) A color value or color element id for the preamp bar in the spline display.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;gradient/&amp;gt;==&lt;br /&gt;
The gradient object creates a rectangular color gradient.  The available parameters are:&lt;br /&gt;
* '''gradient_x1''' - (float) A floating point value for the left side of the rectangle.  Default is 0.0&lt;br /&gt;
* '''gradient_y1''' - (float) A floating point value for the top side of the rectangle.  Default is 0.0&lt;br /&gt;
* '''gradient_x2''' - (float) A floating point value for the right side of the rectangle.  Default is 1.0&lt;br /&gt;
* '''gradient_x1''' - (float) A floating point value for the bottom side of the rectangle.  Default is 1.0&lt;br /&gt;
* '''points''' - (str) A complex string defining color values for at least two value points with which to build the gradients.  See below.&lt;br /&gt;
The points syntax is a semicolon delimited list of key=value pairs where the key is a floatingpoint number representing a point in the &amp;quot;gradient space&amp;quot; and the value is an RGB triplet (assumed full alpha) or RGBA quad.  For instance, the following object would create a smooth gradient between red in the top left and green at half alpha in the bottom right:&lt;br /&gt;
 	&amp;lt;gradient id=&amp;quot;red.to.green&amp;quot;&lt;br /&gt;
 		x=&amp;quot;0&amp;quot; y=&amp;quot;0&amp;quot; w=&amp;quot;0&amp;quot; h=&amp;quot;0&amp;quot; &lt;br /&gt;
 		relatw=&amp;quot;1&amp;quot; relath=&amp;quot;1&amp;quot;&lt;br /&gt;
 		points=&amp;quot;0.0=255,0,0,255;1.0=0,255,0,128&amp;quot;&lt;br /&gt;
 	/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;Wasabi:StandardFrame:Status/&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;Wasabi:StandardFrame:NoStatus/&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;Wasabi:StandardFrame:Modal/&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;Wasabi:StandardFrame:Static/&amp;gt;==&lt;br /&gt;
The Wasabi:StandardFrame objects are rectangular frames you can use to encapsulate your own layout contents within the currently themed standard frame.  They all have the following parameters:&lt;br /&gt;
* '''content''' - (id) The id of the groupdef to instantiate within the Wasabi:StandardFrame.&lt;br /&gt;
* '''padtitleleft''' - (int) The distance in pixels to pad the title to the left.&lt;br /&gt;
* '''padtitleright''' - (int) The distance in pixels to pad the title to the right.&lt;br /&gt;
* '''shade''' - (id) The id of the layout within our container we should switch to if the titlebar is doubleclicked (ie: the id of the windowshade layout).  Default is no functionality.&lt;br /&gt;
The Wasabi:StandardFrame:Status object has a status bar, while the Wasabi:StandardFrame:NoStatus does not.  The Wasabi:StandardFrame:Static object inherits from Wasabi:StandardFrame:NoStatus and also instantiates the wasabi panel graphics.  The Wasabi:StandardFrame:Modal object does all that and also removes the control menus to make a fully modal dialog frame.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;wndholder/&amp;gt;==&lt;br /&gt;
A wndholder object, similar to a customobject, holds user interface windows based upon what param is given.  The wndholder can also hold window types by guid or groupdef instantiations by id.  Here are its parameters:&lt;br /&gt;
* '''hold''' - (id) A semicolon delimited list of guids or groupdef ids to hold.&lt;br /&gt;
* '''component''' - (id) A parameter alias for hold.&lt;br /&gt;
* '''param''' - (id) A parameter alias for hold.&lt;br /&gt;
* '''noshowcmdbar''' - (bool) Setting this flag will disable the Wasabi command bar.&lt;br /&gt;
* '''noanimatedrects''' - (bool) Setting this flag will disable animated rectangle motion.&lt;br /&gt;
* '''disableanimatedrects''' - (bool) A parameter alias for noanimatedrects.&lt;br /&gt;
* '''autoopen''' - (bool) Setting this flag will cause the object to auto open.&lt;br /&gt;
* '''autoclose''' - (bool) Setting this flag will cause the object to auto close.&lt;br /&gt;
Using a wndholder object indicates to the system that you want to be the &amp;quot;container of record&amp;quot; for the possible requested guids when they are launched by the system through, for instance, the C++ coder registering his window class with registerAutopopup(), which calls the underlying api-&amp;gt;skinwnd_createByGuid().  The container within which this wndholder is instantiated should also be given a component parameter with the same values.  This component parameter is simply a hint to Wasabi that a wndholder object that will accept that component parameter lives within the container.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;objdirview/&amp;gt;==&lt;br /&gt;
The objdirview object displays a tree of hierarchical information to the user, based on a code concept called an Object Directory.  An Object Directory is, in essence, just a container of arbitrary items so this object is merely the display of its contents.  Here are its parameters:&lt;br /&gt;
* '''dir''' - (str) The string identifier of the objdir to which this object should connect.&lt;br /&gt;
* '''target''' - (id) The id of an object to which this object may direct the actions of its internal items being selected.&lt;br /&gt;
* '''displaytarget''' - (id) The id of a customobject which will be assigned to display the display group parameter of the currently selected objdir item.&lt;br /&gt;
* '''defaultdisplay''' - (id) The id of a groupdef to display inside displaytarget if no objdir items are selected.&lt;br /&gt;
When items in the objdirview are selected, the objdir is sent an event telling it that an item was selected.  The target parameter from XML is included in the data sent in that event.   However, the implemented functionality for that event is wholly at the discretion of the programmer implementing the specific objdir in question.  For the QueryDir object used in Winamp3's media library, the target param is for a nearby queryline object to be told the selection is changing.  Your mileage may vary with other objects.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;Wasabi:PathPicker/&amp;gt;==&lt;br /&gt;
The Wasabi:PathPicker object is a simple object to display a text string of a directory path chosen by the user.  When the user clicks on the object, a dir selection service is started, allowing the user to choose a directory path.  Attach this object to a string configuration attribute and you have a simple way for users to choose directories as preferences.  The Wasabi:PathPicker object has no unique parameters.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;querydrag/&amp;gt;==&lt;br /&gt;
The querydrag object is used to create a visual &amp;quot;drag source&amp;quot; for a nearby queryresults object.  The user may click and drag this object and by doing so representationally drag the text of the current query in the queryresults object (which can be dropped into a playlist editor to fill its contents with the results of that query).  It has only two parameters:&lt;br /&gt;
* '''image''' - (id) The bitmap element to display.&lt;br /&gt;
* '''source''' - (id) The source queryresults object.  Default is the nearest.&lt;br /&gt;
If no valid source can be found, this object silently fails to drag.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;queryline/&amp;gt;==&lt;br /&gt;
The invisible queryline object is used to host a text query to be applied to a queryresults object.  One possible use would be to write a script linking the text in a Wasabi:HistoryEditBox to the query parameter of a queryline.  And, speaking of its parameters, here they are:&lt;br /&gt;
* '''querylist''' - (id) The id of the queryresults which will take the query.  Default is to not connect (ie: this param is kinda sorta mandatoryish if you want anything interesting to happen).&lt;br /&gt;
* '''query''' - (str) The string of the query itself.&lt;br /&gt;
* '''auto''' - (bool) Whether or not to execute an autoquery based on the query parameter (ie: &amp;quot;search on the name column for this substring&amp;quot; instead of &amp;quot;run this query&amp;quot;).  Default is to use the string directly as a query (not autoquery).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;queryresults/&amp;gt;==&lt;br /&gt;
The queryresults object is the an invisible binding object that coordinates the filtration of the database by numerous multiple other objects.  The queryline and filterlist objects eventually define a single output from the database, and this information is kept in the queryresults object.  It has only one parameter:&lt;br /&gt;
title - (str) The human readable title for your queryresults.  I have no idea why this would be important.&lt;br /&gt;
Magically, it seems, placing a queryresults object in the same group next to a PlaylistEditor object makes that PlaylistEditor get filled with the queryresults information.  I have no idea how this can be, and sense the telltale signs of powerful dark necromancy at work, here.&lt;/div&gt;</summary>
		<author><name>Pjn123</name></author>	</entry>

	<entry>
		<id>http://wiki.winamp.com/wiki/XML_Containing_objects</id>
		<title>XML Containing objects</title>
		<link rel="alternate" type="text/html" href="http://wiki.winamp.com/wiki/XML_Containing_objects"/>
				<updated>2012-10-09T20:18:22Z</updated>
		
		<summary type="html">&lt;p&gt;Pjn123: /*  */  Added ontop&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Description ==&lt;br /&gt;
These are the objects, that contain other objects.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;WasabiXML&amp;gt;&amp;lt;/WasabiXML&amp;gt;==&lt;br /&gt;
This object contains the whole skin.&lt;br /&gt;
* '''version''' - (int) The version of the Freeform Plugin Core the skin is made for. If the Plugin version is less than written, the warning &amp;quot;The skin is too new&amp;quot; will appear. Othervise, the Plugin will read the code according to this value, using backward compability.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;container&amp;gt;&amp;lt;/container&amp;gt;==&lt;br /&gt;
* '''id''' - (id) The coder-oriented name of the container.  This value is used when appealing to this object.&lt;br /&gt;
* '''name''' - (str) The human-oriented name of the container, or the &amp;quot;title&amp;quot; of the &amp;quot;window.&amp;quot;  This value is used by some other GuiObjects, notably the Wasabi:TitleBar object, to be displayed in the system.  It does not display automatically.  The special string &amp;quot;:componenttitle&amp;quot; will query the contents of the container to find the first windowholder and replace the name assigned to this container with the name of the object held by the windowholder (if any).&lt;br /&gt;
* '''default_x''' - (int) The default x position in screen coordinates.&lt;br /&gt;
* '''default_y''' - (int) The default y position in screen coordinates.&lt;br /&gt;
* '''default_w''' - (int) The default width in scalable units (1 == 1 pixel, if scale==100%)&lt;br /&gt;
* '''default_h''' - (int) The default height in scalable units (1 == 1 pixel, if scale==100%)&lt;br /&gt;
* '''default_visible''' - (bool) If true, show this container the first time the skin is ever shown (the system will track this value for the user, thereafter).&lt;br /&gt;
* '''component''' - (str) If this parameter is set with a guid or groupid, it indicates to the system that inside this component there lives a wndholder object with the same parameter.&lt;br /&gt;
* '''dynamic''' - (bool) If true, this means that when the skin is parsed, the container is not created.  &amp;quot;Dynamic&amp;quot; containers are meant to be instantiated at runtime by the coder and act as a template to hold any type of content within them.  Winamp3 uses dynamic containers to, for instance, provide outer frames for component windows, message boxes, etc.  A dynamic container is instantiated when the coder requests it to be, and deleted when the layout is closed.  If false (ie: not dynamic), this container will always be instantiated in the system at runtime, and the coder may only &amp;quot;hide&amp;quot; and &amp;quot;show&amp;quot; it.&lt;br /&gt;
* '''primaryComponent''' - (String) Defines the primary comonent that should be hold in this container. Useful for SUI Skins in combination with primaryComponent=&amp;quot;guid:player&amp;quot; in order to recieve keyboard/mouse actions in our main window.&lt;br /&gt;
* '''canclose''' - (bool) Defines if the container can be closed (true) or not (false).&lt;br /&gt;
* '''nofocusapponclose''' - (bool) If this Container is closed the main application (Winamp) can be restored from minimized state (true) or not (false).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;layout&amp;gt;&amp;lt;/layout&amp;gt;==&lt;br /&gt;
* '''id''' - (id) The coder-oriented name of the layout.  This value is used when appealing to this object.&lt;br /&gt;
* '''owner''' - (str) This parameter has the special syntax of &amp;quot;componentid;layoutid&amp;quot; and will cause the OS window this layout represents to always match the current visible state (minimized, restored, etc) of the owning layout.&lt;br /&gt;
* '''lockto''' - (str) This parameter has the same syntax as owner, but causes the relative positioning of this window to be locked to the position of the owning layout.  If it moves, the owned layout moves along with it.&lt;br /&gt;
* '''alpha''' - (int) This 0-255 integer parameter represents the flat alpha to be applied to the entirety of the layout.&lt;br /&gt;
* '''desktopalpha''' - (bool) If true, this flag indicates to Wasabi that this layout would like to be drawn with desktop alpha, if that feature is enabled in the system.&lt;br /&gt;
* '''indesktop''' - (bool) If true, causes the OS window to be a child of the desktop (under all other OS windows). &lt;br /&gt;
* '''linkwidth''' - (str) This string parameter should be the layoutid of a sibling to this layout inside its container.  Any changes to the width of this layout will be applied to the linked layout.  One use is for a &amp;quot;windowshade&amp;quot; mode that automatically matches width to the &amp;quot;normal&amp;quot; layout. &lt;br /&gt;
* '''linkheight''' - (str) Same as linkwidth, but for height.  Will allow you to make &amp;quot;vertical&amp;quot; windowshades, should you so desire.&lt;br /&gt;
* '''taskbar''' - (bool) This flag causes the layout to have its own taskbar button. (NOT YET IMPLEMENTED!)&lt;br /&gt;
* '''move''' - (bool) Can be set to &amp;quot;0&amp;quot; to disable user moving. Useful for maximized mode.&lt;br /&gt;
* '''resizable''' - (bool) Can be set to &amp;quot;0&amp;quot; to disable user resizing&lt;br /&gt;
* '''scalable''' - (bool) Can be set to &amp;quot;0&amp;quot; to disable user scaling (experimental)&lt;br /&gt;
* '''ontop''' - (bool) Force layout to be always visible&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;groupdef&amp;gt;&amp;lt;/groupdef&amp;gt;==&lt;br /&gt;
Groups are the workhorse of user interface design in Wasabi.  Groups allow one to define and place in coordinate space a logical collection of GuiObjects that will live within a given rectangle (the boundary of the Group).  They are the display-cases in which one keeps one's interface items tidily available to the user. The XML params specific to all groupdefs are:&lt;br /&gt;
 &lt;br /&gt;
* '''background''' - (str) The id of a bitmap element to be stretched as the background of the group (all of the group contents draw on top of this bitmap)&lt;br /&gt;
* '''drawbackground''' - (bool) Whether or not to actually draw the background pixels (useful for using the alpha channel of a background bitmap as the drawing region for the group).&lt;br /&gt;
* '''default_w''' - (int) The default width for this group, if the group instantiation does not specify what the width should be.&lt;br /&gt;
* '''default_h''' - (int) The default height for this group, if the group instantiation does not specify what the height should be.&lt;br /&gt;
* '''maximum_w''' - (int) The maximum width for this group, beyond which Wasabi will not allow the group to be resized.&lt;br /&gt;
* '''maximum_h''' - (int) The maximum height for this group, beyond which Wasabi will not allow the group to be resized.&lt;br /&gt;
* '''minimum_w''' - (int) The minimum width for this group, beyond which Wasabi will not allow the group to be resized.&lt;br /&gt;
* '''minimum_h''' - (int) The minimum height for this group, beyond which Wasabi will not allow the group to be resized.&lt;br /&gt;
* '''propagatesize''' - (bool) Sends this group's default/minimum/maximum size parameters to the layout which contains the group.  ie: if my minimum_h is 200 and my containing layout's minimum_h is 100 and I have my propagatesize flag set, my layout will now have a * '''minimum_h''' of 200, etc.&lt;br /&gt;
* '''lockminmax''' - (bool) Locks the minimum and maximum size values to the default size value.  Makes the group &amp;quot;nonresizable.&amp;quot;&lt;br /&gt;
* '''design_w''' - (int) The &amp;quot;design width&amp;quot; of this group.  The &amp;quot;design&amp;quot; based sizes allow for a conditional layout of GuiObjects within them.  These parameters are used in conjunction with the x1/x2/y1/y2/anchor coordinate system, which will be documented with GuiObjects.&lt;br /&gt;
* '''design_h''' - (int) The &amp;quot;design height&amp;quot; of this group.&lt;br /&gt;
* '''name''' - (str) A human readable string which will be the &amp;quot;Name&amp;quot; of this group, used by various objects in the system when referring the user to this groupdef.  For instance, the TabSheet GuiObject contains one group for each displayed tab, and the name parameter of each group is the string displayed within each corresponding tab. &lt;br /&gt;
* '''autowidthsource''' - (str) The id of an object contained within this group from which this group should set its width.  For instance, the groupdef that defines the contents of the Checkbox GuiObject sets its width based on the size of the text object within it, which itself will be sized at instantiation depending upon the text placed within that particular text object (See: $/studio/studio/Wacs/wasabi.system/ui/guiobjects/xml/checkbox/checkbox.xml).&lt;br /&gt;
* '''autoheightsource''' - (str) The id of an object contained within the group from which this group should set its height.  &lt;br /&gt;
* '''register_autopopup''' - (bool) This flag causes this group to be listed in the Windows submenu of the Wasabi MainMenu context menu.  Its name parameter is displayed as the menu item.  If that menu item is then selected, this group will be launched as a layout (in other words, in its own window).  This is quite useful for the quick debugging of groupdef objects.&lt;br /&gt;
* '''windowtype''' - (str)  Specifying a groupdef as being a certain windowtype causes the group to automatically be instantiated and added to the collection specified by that windowtype.  See below for more information and a list of what windowtypes currently exist in the system.  &lt;br /&gt;
* '''inherit_content''' - (bool)  This parameter is used to be able to override the contents of a group already defined in the system.  To go back to the &amp;quot;blueprints&amp;quot; analogy, this is like finding someone's original blueprints and editing them.  The id of this groupdef should match the id of the other groupdef that you wish to modify.  See below for examples and more information.&lt;br /&gt;
* '''inherit_group''' - (str)  This parameter is used to be able to copy the contents of a group already defined in the system as the starting point for one's own group definition.  To go back to the &amp;quot;blueprints&amp;quot; analogy, this is like photocopying someone else's blueprints as a starting point for one's own.  The param is the id of the other groupdef you wish to inherit.&lt;br /&gt;
* '''inherit_params''' - (bool) Specifies whether or not to inherit the params of the inherited group as well as its content.  Only meaningful with a valid inherit_group param or if overriding a previous groupdef.&lt;br /&gt;
* '''xuitag''' - (str)  Specifies that this group definition will create a new Xui object into the system with the given tag string.  See Extending Wasabi: Creating XuiObjects for more information.&lt;br /&gt;
* '''embed_xui''' - (str)  Specifies the id of a contained object to which any XML parameters not valid for a group sent to the instantiation of the group (or the xuitag string) should be forwarded.  See Extending Wasabi: Creating XuiObjects for more information.&lt;br /&gt;
In addition to these parameters, all parameters that apply to a GuiObject may also be placed on a groupdef.  This sets them up as default parameters for when the group is used in a group tag, which the skinner may of course override.&lt;br /&gt;
&lt;br /&gt;
Please note, as referenced earlier, the layout object is simply a special type of groupdef object, so all of these parameters also apply to it as well.&lt;br /&gt;
&lt;br /&gt;
Groups are inherently reusable objects, as well.  In a process that object oriented programmers should be well familiar with, Groups are first Defined to contain their particular contents and then can be later Instantiated (multiple times, if so desired) within a user interface.&lt;br /&gt;
 &lt;br /&gt;
For the non-programmers among our readers, consider the following analogy:  Definition consists of making a set of instructions for how to create something, like the blueprints for a house.  Instantiation is the process of creating that something based upon its definition: in this case, giving the blueprints to a General Contractor and waiting the requisite indeterminate number of weeks to have them build that house to your specification.  Definition makes a concept.  Instantiation converts it into a thing.&lt;br /&gt;
 &lt;br /&gt;
Now imagine the vast expanse of cookie-cutter housing tracts that have proliferated across American suburbia in the past decades.  In a single tract, only a small handful of different blueprints were Defined for building the hundreds of homes to be found, and each Instance of those designs has been personalized by its denizens (subject to the CC&amp;amp;R's for that neighborhood, of course).  &lt;br /&gt;
 &lt;br /&gt;
In the same way, you may define a Group to contain a specific set of objects with a specific set of parameters (your &amp;quot;instructions&amp;quot;), and then use (&amp;quot;instantiate&amp;quot;) that Group over and over again in your user interface with minor tweaks to each usage (&amp;quot;instance&amp;quot;).&lt;br /&gt;
 &lt;br /&gt;
The XML tag Wasabi uses for Group Definition is the groupdef tag, while the tag used for Group Instantiation is the group tag.  This section will deal specifically with the particularities of Group Definition and the parameters of the groupdef tag, while the group tag will be documented in its own section in the next chapter (along with everything else that is meant to live inside of a groupdef tag).  Because the simplest form of a groupdef is rather boring, we'll first cover the parameters for groupdefs and then return to creating sample XML snippets somewhat more complicated and useful than the following (which defines &amp;quot;my group&amp;quot; as merely an instantiation of the contents of &amp;quot;othergroup&amp;quot;)&lt;br /&gt;
 &amp;lt;groupdef id=&amp;quot;mygroup&amp;quot;&amp;gt;&lt;br /&gt;
 	&amp;lt;group id=&amp;quot;othergroup&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/groupdef&amp;gt;&lt;/div&gt;</summary>
		<author><name>Pjn123</name></author>	</entry>

	<entry>
		<id>http://wiki.winamp.com/wiki/Creating_Modern_Skins</id>
		<title>Creating Modern Skins</title>
		<link rel="alternate" type="text/html" href="http://wiki.winamp.com/wiki/Creating_Modern_Skins"/>
				<updated>2008-11-24T00:03:25Z</updated>
		
		<summary type="html">&lt;p&gt;Pjn123: Undo revision 1200 by Zoubaeir (Talk)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Description/Overview of Modern Skinning==&lt;br /&gt;
&lt;br /&gt;
Modern or Freeform skins were originally designed to work with Winamp3. What separates them from the average skin is the fact that they are not confined to the classic rectangular shape. In fact they can be any shape you want them to be and you can put the Winamp control buttons anywhere you want. Some skinners have even added extra buttons that extend the functionality of Winamp right there on the skin. Sounds too good to be true huh? Well these skins require a bit more coding to make and some of the graphics that go into them are quite large. Consequently, Freeform skins may take a bit longer to download from our site and they may take a few extra seconds to load when you switch from one skin to another. But trust me when I say that Freeform skins are worth the extra time and effort. Skin developers have done some incredible things with these skins. You have to check them out.&lt;br /&gt;
&lt;br /&gt;
== XML ==&lt;br /&gt;
Here is your reference guide for XML coding.&lt;br /&gt;
* '''[[XML Reference]]'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Tools Needed to Build a Modern Skin==&lt;br /&gt;
*'''[http://download.nullsoft.com/winamp/plugin-dev/WaSDP_1.1.exe Winamp Skin Development Pack]'''&lt;br /&gt;
*[[Color Editor]]&lt;br /&gt;
&lt;br /&gt;
==Individual Components==&lt;br /&gt;
&lt;br /&gt;
*[[Modern Skin: Intro|Intro]]&lt;br /&gt;
*[[Modern Skin: Winamp 2 to W3+|Winamp 2 to Winamp 3+]]&lt;br /&gt;
*[[Modern Skin: Simple Skin Tutorial|Simple Skin Tutorial]]&lt;br /&gt;
*[[Modern Skin: XML Intro|XML Intro]]&lt;br /&gt;
*[[Modern Skin: Simple Skin Tutorial (Continued)|Simple Skin Tutorial (Continued)]]&lt;br /&gt;
*[[Modern Skin: Container| Container]]&lt;br /&gt;
*[[Modern Skin: Group|Group]]&lt;br /&gt;
*[[Modern Skin: Relative Positioning| Relative Positioning]]&lt;br /&gt;
*[[Modern Skin: Complex Skin|Complex Skin]]&lt;br /&gt;
*[[Modern Skin: Non-Rect Player| Non-Rect Player]]&lt;br /&gt;
*[[Modern Skin: Layer Composition| Layer Composition]]&lt;br /&gt;
*[[Modern Skin: Alpha Channels| Alpha Channels]]&lt;br /&gt;
*[[Modern Skin: Animatedlayer|Animatedlayer]]&lt;br /&gt;
*[[Modern Skin: Snap Points|Snap Points]]&lt;br /&gt;
*[[Modern Skin: Drawers|Drawers]]&lt;br /&gt;
*[[Modern Skin: Skin Scripting| Skin Scripting]]&lt;br /&gt;
*[[Modern Skin: Drawer Scripting| Drawer Scripting]]&lt;br /&gt;
*[[Modern Skin: Animating a Skin|Animating a Skin]]&lt;br /&gt;
*[[Modern Skin: Maki Overview| Maki Overview]]&lt;br /&gt;
*[[Main_Page#Glossary_of_Terms|Glossary]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Downloadable PDF===&lt;br /&gt;
You can [http://media.winamp.com/5541/main/downloads/development/skinsmodern/Winamp-Modern-Skins-Tutorial.pdf download the tutorial] in PDF format for quick reference anytime&lt;/div&gt;</summary>
		<author><name>Pjn123</name></author>	</entry>

	<entry>
		<id>http://wiki.winamp.com/wiki/XML_GUI_Objects</id>
		<title>XML GUI Objects</title>
		<link rel="alternate" type="text/html" href="http://wiki.winamp.com/wiki/XML_GUI_Objects"/>
				<updated>2008-09-26T10:48:40Z</updated>
		
		<summary type="html">&lt;p&gt;Pjn123: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==GuiObject (Global params)==&lt;br /&gt;
All the objects to be discussed in this chapter are GuiObjects.  This means, among other things, all such objects have the same basic set of parameters which are valid for all of them.  All GuiObjects are objects that live with a set of spatial coordinates within a groupdef (or layout).  A button, a piece of text, a flat bitmap image, a tree of items, and an edit box would all be different kinds of GuiObjects, and all of the parameters listed here work on all of them.&lt;br /&gt;
* '''alpha''' - (int) An integer [0,255] specifying the alpha blend mode of the object (0 is transparent, 255 is opaque).  Default is 255.&lt;br /&gt;
* '''activealpha''' - (int) A different alpha value [0,255] for the object in its active state.&lt;br /&gt;
* '''inactivealpha''' - (int) A different alpha value [0,255] for the object in its inactive state (if you set both activealpha and inactivealpha, it is meaningless to set alpha).&lt;br /&gt;
* '''cursor''' - (id) The id of the cursor element to be displayed when the mouse is over this object. You can also use the system cursors. A list can be found here: '''[[Wasabi Appendix: Cursors | Appendix: Cursors]]'''&lt;br /&gt;
* '''tooltip''' - (str) A human readable string to display as a tooltip for when the mouse is hovered over this object.&lt;br /&gt;
* '''move''' - (bool) Setting this flag causes any dragging of this object to actually drag the entire layout within which the object resides.&lt;br /&gt;
* '''renderbasetexture''' - (bool) A flag to tell the system to always use the system's base texture as the background of this object.&lt;br /&gt;
* '''cfgattrib''' - (str) A configattrib string assigned to this GuiObject. Here is a list of a few: '''[[Wasabi Appendix: ConfigAttrib | Appendix: ConfigAttrib]]'''&lt;br /&gt;
* '''visible''' - (bool) Whether or not the object should be displayed in its group or layout.&lt;br /&gt;
* '''x''' - (int) The X position of the object in its group or layout.&lt;br /&gt;
* '''y''' - (int) The Y position of the object in its group or layout.&lt;br /&gt;
* '''w''' - (int) The width of the object in its group or layout.&lt;br /&gt;
* '''h''' - (int) The height of the object in its group or layout.&lt;br /&gt;
* '''relatx''' - (int) This [0,2] integer determines if the X position should be calculated by normal (&amp;quot;0&amp;quot;), relative (&amp;quot;1&amp;quot;) or proportional (&amp;quot;2&amp;quot;) units.  See below.&lt;br /&gt;
* '''relaty''' - (int) This [0,2] integer determines if the Y position should be calculated by normal (&amp;quot;0&amp;quot;), relative (&amp;quot;1&amp;quot;) or proportional (&amp;quot;2&amp;quot;) units.  See below.&lt;br /&gt;
* '''relatw''' - (int) This [0,2] integer determines if the width should be calculated by normal (&amp;quot;0&amp;quot;), relative (&amp;quot;1&amp;quot;) or proportional (&amp;quot;2&amp;quot;) units.  See below.&lt;br /&gt;
* '''relath''' - (int) This [0,2] integer determines if the height should be calculated by normal (&amp;quot;0&amp;quot;), relative (&amp;quot;1&amp;quot;) or proportional (&amp;quot;2&amp;quot;) units.  See below.&lt;br /&gt;
* '''fitparent''' - (bool) This parameter is used instead of x;y;w;h parameters and means that the object covers all the area of the parent object.&lt;br /&gt;
* '''x1''' - (int)  The X position of the left edge of the object in its group or layout.  Only works inside definitions with design_w parameters set.&lt;br /&gt;
* '''y1''' - (int) The Y position of the top edge of the object in its group or layout.  Only works inside definitions with design_h parameters set.&lt;br /&gt;
* '''x2''' - (int)  The X position of the right edge of the object in its group or layout.  Only works inside definitions with design_w parameters set.&lt;br /&gt;
* '''y2''' - (int) The Y position of the bottom edge of the object in its group or layout.  Only works inside definitions with design_h parameters set.&lt;br /&gt;
* '''anchor''' - (str) A list of one or more of the following keywords, delimited by the pipe (|) character: &amp;quot;top|bottom|left|right&amp;quot; these anchors work with x1/y1/x2/y2 positioning to fix the edge of the object its distance from the edges of the group or layout which contains it.&lt;br /&gt;
* '''sysmetricsx''' - (bool) This flag will cause this object to be resized by having its X position multiplied by the OS scalar coefficient.&lt;br /&gt;
* '''sysmetricsy''' - (bool) This flag will cause this object to be resized by having its Y position multiplied by the OS scalar coefficient. &lt;br /&gt;
* '''sysmetricsw''' - (bool) This flag will cause this object to be resized by having its width multiplied by the OS scalar coefficient.&lt;br /&gt;
* '''sysmetricsh''' - (bool) This flag will cause this object to be resized by having its height multiplied by the OS scalar coefficient.&lt;br /&gt;
* '''rectrgn''' - (bool) Setting this flag causes the engine to ignore the object's region for handling &amp;quot;mouse over object&amp;quot; detection and only use the bounding rectangle. &lt;br /&gt;
* '''regionop''' - (int) An integer enumeration [-2,1] for what kind of region-operation to perform with this object's calculated region against its parent's region.  See below for more information. &lt;br /&gt;
* '''sysregion''' - (int) Param alias for regionop.&lt;br /&gt;
* '''wantfocus''' - (bool) This flag determines whether or not an object ever gets the focus at all.&lt;br /&gt;
* '''focusonclick''' - (bool)  This flag determines whether or not an object gets the focus when clicked. &lt;br /&gt;
* '''taborder''' - (int) This value indicates the &amp;quot;tab order&amp;quot; of the object within the group or layout in which it resides.  When the user hits the tab key, the interface focus moves to the next greater object in tab order.  Objects with equal tab order will be ordered in the reverse of their insertion order in XML (last object in is first in default tab order). &lt;br /&gt;
* '''nodblclick''' - (bool) This flag blocks doubleclick events from being received by this object.&lt;br /&gt;
* '''noleftclick''' - (bool) This flag blocks left click events from being received by this object.&lt;br /&gt;
* '''norightclick''' - (bool) This flag blocks right click events from being received by this object.&lt;br /&gt;
* '''nomousemove''' - (bool) This flag blocks mouse move events from being received by this object.&lt;br /&gt;
* '''nocontextmenu''' - (bool) This flag blocks the main context menu from being displayed for rightclick.&lt;br /&gt;
* '''ghost''' - (bool) This flag causes the object to be transparent to all user interface events such that all the mouse messages pass to the object(s) visibly underneath it.&lt;br /&gt;
* '''notify'''(0-9) - (str) A string to be used as a parameter to the onNotify event for the object upon instantiation.  The notify strings 0-9 will be sent in order.&lt;br /&gt;
* '''droptarget''' - (id)  The id of an object to which all of this object's drag and drop events will be redirected.&lt;br /&gt;
&lt;br /&gt;
==='''Appendixes'''===&lt;br /&gt;
*'''[[Wasabi Appendix: ConfigAttrib | Appendix: ConfigAttrib]]'''&lt;br /&gt;
*'''[[Wasabi Appendix: Cursors | Appendix: Cursors]]'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;button/&amp;gt; &amp;amp; &amp;lt;togglebutton/&amp;gt;==&lt;br /&gt;
The button is a simple concept in Wasabi - you push it, it activates something.  It can either be used as a substrate for a script (ie: put a script and a button in the same groupdef, and you can handle complex button functionality with the script) or it can be used by itself to launch an action into the system when pressed.  You can implement your own action handlers in code, but some global actions predefined to be handled by the system are also available.&lt;br /&gt;
&lt;br /&gt;
* '''image''' - (id) The id of the bitmap element to display in its &amp;quot;normal&amp;quot; state. &lt;br /&gt;
* '''downimage''' - (id) The id of the bitmap element to display when the user is pressing down on the button.&lt;br /&gt;
* '''hoverimage''' - (id) The id of the bitmap element to display when the user is hovering the mouse over the button.&lt;br /&gt;
* '''activeimage''' - (id) The id of the bitmap element to display when the object is in its &amp;quot;active&amp;quot; state (usually only used by togglebutton, but available on the basic button object to allow the user to create extended functionality in script).&lt;br /&gt;
* '''text''' - (str) A string of text to be rendered on top of the button's currrent state image.  In this way, you can create a single button graphic and reuse it to create internationally localizable buttons.&lt;br /&gt;
* '''action''' - (str) The action to fire if the button is clicked (when it enters into its downstate).&lt;br /&gt;
* '''param''' - (str) The param to go with the action fired if the button is clicked.&lt;br /&gt;
* '''borders''' - (bool) Set this flag if you want to be a styled button.&lt;br /&gt;
* '''style''' - (str) Set the style value if you set the borders flag, to tell wasabi what type of button style you want.&lt;br /&gt;
** &amp;quot;button_normal&amp;quot; &amp;quot;osbutton_normal&amp;quot; &amp;quot;osbutton_close&amp;quot; &amp;quot;osbutton_minimize&amp;quot; and &amp;quot;osbutton_maximize&amp;quot;&lt;br /&gt;
* '''retcode''' - (int) Specifies the &amp;quot;modal return code&amp;quot; for the button.  Only valid with the &amp;quot;endmodal&amp;quot; system action.&lt;br /&gt;
* '''cbtarget''' - (id) The optional &amp;quot;component bucket target&amp;quot; for this button.  Only valid with &amp;quot;cb_next&amp;quot; or &amp;quot;cb_prev&amp;quot; system actions.  A componentbucket is another name for the thinger -- this allows you to have targetted button controls for more than one componentbucket in a user interface.&lt;br /&gt;
* '''action_target''' - (id) This will send the specified action only to the object whose id is listed here.  The param parameter is ignored in this case and this string is sent as the param data for the action.  Most objects don't understand being sent actions (this is an extended functionality), so this won't do anything in most cases.&lt;br /&gt;
* '''center_image''' - (bool) Setting this flag causes the image to be centered against the object rectangle.  This parameter is only important when both borders and an image are specified on a single object. &lt;br /&gt;
&lt;br /&gt;
 Example:&lt;br /&gt;
 &amp;lt;button x=&amp;quot;50&amp;quot; y=&amp;quot;10&amp;quot; action=&amp;quot;VID_FS&amp;quot; image=&amp;quot;vis.fs.1&amp;quot; hoverImage=&amp;quot;vis.fs.2&amp;quot; downImage=&amp;quot;vis.fs.3&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;button x=&amp;quot;10&amp;quot; y=&amp;quot;40&amp;quot; w=&amp;quot;100&amp;quot; h=&amp;quot;20&amp;quot; borders=&amp;quot;1&amp;quot; style=&amp;quot;osbutton_normal&amp;quot; text=&amp;quot;Click Here&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==='''Appendix'''===&lt;br /&gt;
* '''[[Wasabi Appendix: Action List | Appendix: Action List]]'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;nstatesbutton/&amp;gt;==&lt;br /&gt;
The nstatesbutton is a specialized kind of togglebutton whose purpose is to cycle through a number of different visual states.  The parameters beyond togglebutton that it implements are:&lt;br /&gt;
* '''nstates''' - (int) The number of discrete states in which the object may exist.&lt;br /&gt;
* '''cfgvals''' - (str) A semicolon delimited list of values to represent custom config values for the multiple states.  Default is the current state number.  See below.&lt;br /&gt;
The nstatesbutton uses special handling of the image, downimage, hoverimage, and activeimage parameters expressed by the button object (from which this object is derived).  The nstatesbutton will actually append the state number to the four image parameter strings to calculate the bitmap ids to be loaded for the current object state.  Remember, like most everything else in a computer, this &amp;quot;current state value&amp;quot; counts from 0 and is therefore in the range [0, nstates-1].&lt;br /&gt;
 &lt;br /&gt;
If the object is bound to a configuration attribute, that attribute will be set with a cfgval every time the nstatesbutton transitions to a new state.  If the cfgvals parameter is not set, the attribute will simply be set with the current state value.  If the cfgvals parameter is set, it will parse the string and set the config attrib with the n'th substring corresponding to the current state value.&lt;br /&gt;
 &lt;br /&gt;
The following snippet fully describes two nstatesbutton objects with three states each, one using full images for its visual display, one using themed Wasabi borders with three different state logos:&lt;br /&gt;
 &amp;lt;elements&amp;gt;&lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;nimg0&amp;quot;/&amp;gt; &lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;dimg0&amp;quot;/&amp;gt; &lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;himg0&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;nimg1&amp;quot;/&amp;gt; &lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;dimg1&amp;quot;/&amp;gt; &lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;himg1&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;nimg2&amp;quot;/&amp;gt; &lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;dimg2&amp;quot;/&amp;gt; &lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;himg2&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;logo0&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;logo1&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;logo2&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/elements&amp;gt;&lt;br /&gt;
 &amp;lt;groupdef id=&amp;quot;some.random.groupdef&amp;quot;&amp;gt;&lt;br /&gt;
 	&amp;lt;nstatesbutton id=&amp;quot;three.freeform.states&amp;quot;&lt;br /&gt;
 		nstates=&amp;quot;3&amp;quot; cfgvals=&amp;quot;one;two;three&amp;quot;&lt;br /&gt;
 		image=&amp;quot;nimg&amp;quot; downimage=&amp;quot;dimg&amp;quot; hoverimage=&amp;quot;himg&amp;quot;&lt;br /&gt;
 	/&amp;gt;&lt;br /&gt;
 	&amp;lt;nstatesbutton id=&amp;quot;three.themed.states&amp;quot;&lt;br /&gt;
 		nstates=&amp;quot;3&amp;quot; image=&amp;quot;logo&amp;quot; borders=&amp;quot;1&amp;quot; center_image=&amp;quot;1&amp;quot;&lt;br /&gt;
 	/&amp;gt;&lt;br /&gt;
 &amp;lt;/groupdef&amp;gt;&lt;br /&gt;
If the &amp;quot;three.freeform.states&amp;quot; nstatesbutton were assigned to a configattrib, that attribute would be filled with the values &amp;quot;one&amp;quot; &amp;quot;two&amp;quot; and &amp;quot;three&amp;quot; in order.  If the &amp;quot;three.themed.states&amp;quot; were instead assigned to a configattrib, it would be filled with the default values &amp;quot;0&amp;quot; &amp;quot;1&amp;quot; and &amp;quot;2&amp;quot; in order.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;images/&amp;gt;==&lt;br /&gt;
The images object is object that displays a certain image based on the position of a slider. This object is very similar to [[Animationlayer]] except that this animation's current frame will be determined by the position of a slider.  An example of implementation is the old Classic Winamp skins where the volume slider background changes colour from green to red depending on its position (0%-100%). This object is currently under development and not all sliders are supported. Currently only Volume and Panning(Balance) sliders can be used as sources.&lt;br /&gt;
&lt;br /&gt;
* '''images''' - (id) A bitmap element for the array of images that will be used.&lt;br /&gt;
* '''source''' - (id) Id of the slider that will determine the current animation frame.&lt;br /&gt;
* '''imagesspacing''' - (int) The hight of each animation frame in the bitmap element. This will determine the total number of frames, (300/15=20)&lt;br /&gt;
&lt;br /&gt;
 Example:&lt;br /&gt;
 &amp;lt;images source=&amp;quot;volume&amp;quot; x=&amp;quot;0&amp;quot; y=&amp;quot;0&amp;quot; w=&amp;quot;68&amp;quot; h=&amp;quot;13&amp;quot;&lt;br /&gt;
 images=&amp;quot;main.volpan.volume&amp;quot; imagesspacing=&amp;quot;15&amp;quot;/&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;images source=&amp;quot;balance&amp;quot; x=&amp;quot;73&amp;quot; y=&amp;quot;0&amp;quot; w=&amp;quot;38&amp;quot; h=&amp;quot;13&amp;quot;&lt;br /&gt;
 images=&amp;quot;main.volpan.balance&amp;quot; imagesspacing=&amp;quot;15&amp;quot;/&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
 &amp;lt;slider id=&amp;quot;Volume&amp;quot; action=&amp;quot;VOLUME&amp;quot; x=&amp;quot;1&amp;quot; y=&amp;quot;0&amp;quot; w=&amp;quot;68&amp;quot; h=&amp;quot;13&amp;quot;&lt;br /&gt;
 thumb=&amp;quot;main.volpan.thumb&amp;quot; downThumb=&amp;quot;main.volpan.thumb.pressed&amp;quot;/&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;slider id=&amp;quot;Pan&amp;quot; action=&amp;quot;PAN&amp;quot; x=&amp;quot;74&amp;quot; y=&amp;quot;0&amp;quot; w=&amp;quot;38&amp;quot; h=&amp;quot;13&amp;quot;&lt;br /&gt;
 thumb=&amp;quot;main.volpan.thumb&amp;quot; downThumb=&amp;quot;main.volpan.thumb.pressed&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;PlaylistDirectory/&amp;gt;==&lt;br /&gt;
The PlaylistDirectory object is simply a list with all the saved playlist from the media library. Please remember that this object is always on top of other objects, so you'll have to hide it via maki if you dont want it to be visible. This object was introduced in Winamp 5.5(skinversion 1.3)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;AlbumArt/&amp;gt;==&lt;br /&gt;
The AlbumArt object is a simple GuiObject that displays a picture of the album cover of the song thats playing in Winamp. Please note that if you want do something to this object in a maki script you'll have to define it as a guiobject and not as a layer.&lt;br /&gt;
* '''notfoundImage''' - (id) A bitmap element that used if Winamp cant find any cover for the song.&lt;br /&gt;
* '''align''' - (str) One of the following three possible strings: &amp;quot;left&amp;quot; &amp;quot;center&amp;quot; &amp;quot;right&amp;quot; -- Default is &amp;quot;left&amp;quot;.&lt;br /&gt;
* '''valign''' - (str) One of the following three possible strings: &amp;quot;top&amp;quot; &amp;quot;center&amp;quot; &amp;quot;bottom&amp;quot; -- Default is &amp;quot;top&amp;quot;.&lt;br /&gt;
* '''source''' - (str) Path+Filename of file that you want to display in this object.&lt;br /&gt;
* '''stretched''' - (bool) Stretch the albumart to the size of the object.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;grid/&amp;gt;==&lt;br /&gt;
The grid object is a very nice object for creating stretchable images that still look good on the edges.  It is a graphic, like a layer, but unlike layer it is created by applying nine different bitmaps, stretching five of them.  There are, as you might guess, nine parameters&lt;br /&gt;
&lt;br /&gt;
* '''topleft''' - (id) A bitmap element for the top left section of the grid.&lt;br /&gt;
* '''top''' - (id) A bitmap element for the top middle section of the grid.&lt;br /&gt;
* '''topright''' - (id) A bitmap element for the top right section of the grid.&lt;br /&gt;
* '''left''' - (id) A bitmap element for the middle left section of the grid.&lt;br /&gt;
* '''middle''' - (id) A bitmap element for the center section of the grid.&lt;br /&gt;
* '''right''' - (id) A bitmap element for the middle right section of the grid.&lt;br /&gt;
* '''bottomleft''' - (id) A bitmap element for the bottom left section of the grid.&lt;br /&gt;
* '''bottom''' - (id) A bitmap element for the bottom middle section of the grid.&lt;br /&gt;
* '''bottomright''' - (id) A bitmap element for the bottom right section of the grid. &lt;br /&gt;
&lt;br /&gt;
Essentially, the given rectangle of the grid is intersected with 2 horizontal and 2 vertical lines.  The topleft, topright, bottomleft, and bottomright bitmap elements will not be resized.  The top, left, middle, right, and bottom bitmap elements, however, will be stretched to make all fit the grid rectangle.  Using intelligently sized bitmap elements is fairly critical for this object.  If you're having trouble, try starting with all of your bitmap elements as equal-sized squares.&lt;br /&gt;
&lt;br /&gt;
 Example:&lt;br /&gt;
 &amp;lt;grid x=&amp;quot;70&amp;quot; y=&amp;quot;25&amp;quot; w=&amp;quot;-74&amp;quot; relatw=&amp;quot;1&amp;quot; h=&amp;quot;20&amp;quot; topleft=&amp;quot;main.text.left&amp;quot; top=&amp;quot;main.text.center&amp;quot; topright=&amp;quot;main.text.right&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;Winamp:Browser/&amp;gt;==&lt;br /&gt;
This is basically the browser you'll see in the Bento Winamp skin. You'll also need Winamp 5.54 (skinversion 1.34) for it to work.&lt;br /&gt;
&lt;br /&gt;
- '''home''' - (str) Url for the default homepage for the browser xui.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;browser/&amp;gt;==&lt;br /&gt;
The browser object embeds an external browser technology window (such as IE or Mozilla) into the user interface with which you can load and render HTML directly.&lt;br /&gt;
* '''url''' - (str) The url to be displayed.&lt;br /&gt;
* '''mainmb''' - (bool) Setting this flag makes this browser object the &amp;quot;main mini-browser&amp;quot; for the system.&lt;br /&gt;
* '''targetname''' - (str) This allows this browser object to be set as a specific HTML target.&lt;br /&gt;
* '''scrollbars''' - (str) An enumerated string to determine how the system should handle the embedded browser's scrollbars.  See below.&lt;br /&gt;
Numerous interfaces in Wasabi refer to or control the &amp;quot;main&amp;quot; mini-browser.  Setting the mainmb flag will cause the last browser object which processed its mainmb param to be the main.  In other words, please don't set this flag on more than one object if you actually care which one is the main.&lt;br /&gt;
Scrollbars are important for big browser windows, but can interfere with the simple rendering of HTML content as part of a Wasabi UI.  To this end, the skinner can control how the scrollbars of the embedded browser are displayed by setting the scrollbars parameter to one of the following four string values: &amp;quot;auto&amp;quot; &amp;quot;never&amp;quot; &amp;quot;always&amp;quot; or &amp;quot;default&amp;quot; - default is to allow the HTML page to specify, all others override.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;Wasabi:Frame/&amp;gt;==&lt;br /&gt;
The Wasabi:Frame object is a themed control whose purpose is to provide a movable interface between two rectangular areas, much like the concept of an HTML frame.  Here are its parameters:&lt;br /&gt;
&lt;br /&gt;
* '''orientation''' - (str) One of the following four string values: &amp;quot;v&amp;quot; &amp;quot;vertical&amp;quot; &amp;quot;h&amp;quot; &amp;quot;horizontal&amp;quot; (Default is vertical).&lt;br /&gt;
* '''left''' - (id) The group to be instantiated in the left or top frame.&lt;br /&gt;
* '''right''' - (id) The group to be instantiated in the right or bottom frame.&lt;br /&gt;
* '''top''' - (id) The group to be instantiated in the left or top frame.&lt;br /&gt;
* '''bottom''' - (id) The group to be instantiated in the right or bottom frame.&lt;br /&gt;
* '''from''' - (str) One of the following string values: &amp;quot;l&amp;quot; &amp;quot;left&amp;quot; &amp;quot;t&amp;quot; &amp;quot;top&amp;quot; or &amp;quot;r&amp;quot; &amp;quot;right&amp;quot; &amp;quot;b&amp;quot; &amp;quot;bottom&amp;quot; (Default is left).&lt;br /&gt;
* '''width''' - (int) How many pixels from the chosen edge to start.&lt;br /&gt;
* '''height''' - (int) How many pixels from the chosen edge to start.&lt;br /&gt;
* '''resizable''' - (bool) Set this flag to allow the user to change the position of the framedivider.  Default is to allow it to be resizable.&lt;br /&gt;
* '''maxwidth''' - (int) The maximum amount of pixels you are able to move the poppler if resizable.&lt;br /&gt;
* '''minwidth''' - (int) The minimum amount of pixels you are able to move the poppler if resizable (If you go below this value the poppler will snap to 0).&lt;br /&gt;
* '''vgrabber''' - (string) The centered bitmap of the Grabber.&lt;br /&gt;
* '''vbitmap''' - (string) The stretched bitmap of the Grabber.&lt;br /&gt;
&lt;br /&gt;
In the following simple example, the &amp;quot;top&amp;quot; and &amp;quot;bottom&amp;quot; groups are displayed in a resizable frame object:&lt;br /&gt;
 &amp;lt;groupdef id=&amp;quot;top&amp;quot;&amp;gt;&lt;br /&gt;
 	&amp;lt;text text=&amp;quot;Top&amp;quot; align=&amp;quot;center&amp;quot; x=&amp;quot;0&amp;quot; y=&amp;quot;0&amp;quot; w=&amp;quot;0&amp;quot; h=&amp;quot;0&amp;quot; relatw=&amp;quot;1&amp;quot; relath=&amp;quot;1&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/groupdef&amp;gt;&lt;br /&gt;
 &amp;lt;groupdef id=&amp;quot;bottom&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;text text=&amp;quot;Bottom&amp;quot; align=&amp;quot;center&amp;quot; x=&amp;quot;0&amp;quot; y=&amp;quot;0&amp;quot; w=&amp;quot;0&amp;quot; h=&amp;quot;0&amp;quot; relatw=&amp;quot;1&amp;quot; relath=&amp;quot;1&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/groupdef&amp;gt;&lt;br /&gt;
 &amp;lt;groupdef id=&amp;quot;both&amp;quot;&amp;gt;&lt;br /&gt;
 	&amp;lt;Wasabi:Frame&lt;br /&gt;
 		orientation=&amp;quot;horizontal&amp;quot;&lt;br /&gt;
 		top=&amp;quot;top&amp;quot; bottom=&amp;quot;bottom&amp;quot;    &lt;br /&gt;
 		x=&amp;quot;0&amp;quot; y=&amp;quot;0&amp;quot; w=&amp;quot;0&amp;quot; h=&amp;quot;0&amp;quot;&lt;br /&gt;
 		relatw=&amp;quot;1&amp;quot; relath=&amp;quot;1&amp;quot;&lt;br /&gt;
 	/&amp;gt;&lt;br /&gt;
 &amp;lt;/groupdef&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;Wasabi:CheckBox/&amp;gt;==&lt;br /&gt;
The Wasabi:Checkbox object exists only as a namespaced object because it is expected to have only a single themed appearance.  The Wasabi:Checkbox object is used for both checkbox functionality and radiobutton functionality, depending up on the specification of its parameters.  It consists of a combination of a togglebutton and a text object to create a single functional user interface object.&lt;br /&gt;
* '''text''' - (str) The text to display as part of the checkbox.&lt;br /&gt;
* '''radioid''' - (id) If the button is to be used as part of a radio group, specify id of the parent Wasabi:RadioGroup object here.&lt;br /&gt;
* '''radioval''' - (int) If the button is to be used as part of a radio group, specify its unique integer value here.&lt;br /&gt;
* '''action''' - (str) see button.&lt;br /&gt;
* '''param''' - (str) see button.&lt;br /&gt;
* '''action_target''' - (id) see button.&lt;br /&gt;
As with togglebutton, this is a very useful object for binding to a configuration attribute. It is very popular in preferences interfaces. If the object has a value for radioval, that will be the value set into the attribute if the object is activated.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;Wasabi:DropDownList/&amp;gt;==&lt;br /&gt;
The Wasabi:DropDownList is a themed dialog object.  It may be statically filled via a parameter or dynamically through script or by binding it to a text feed from code.  A Wasabi:DropDownList object may be bound to an integer configuration attribute.&lt;br /&gt;
* '''items''' - (str) A semicolon delimited list of items to be displayed in the dropdown area.&lt;br /&gt;
* '''feed''' - (id) The id of a text feed to provide a semicolon delimited list of items to be displayed in the dropdown area.&lt;br /&gt;
* '''select''' - (int) Specifies an item to be selected.&lt;br /&gt;
* '''listheight''' - (int) Allows the skinner to specify the height of the dropdown area in pixels.&lt;br /&gt;
* '''maxitems''' - (int) Allows the skinner to specify the max height of the dropdown area in lines of text.  If the dropdown area has fewer lines of text than this value when this value is set, the dropdown area is sized to show no more than is needed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;Wasabi:ComboBox/&amp;gt;==&lt;br /&gt;
The Wasabi:ComboBox is a special type of object which combines dropdownlist functionality with an edit field as well.  It has the same parameters as Wasabi:DropDownList.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;Wasabi:HistoryEditBox/&amp;gt;==&lt;br /&gt;
The Wasabi:HistoryEditBox is an even more specialized version of this object family, its only purpose is to remember the last 64 items of text typed into it.  It has one extra parameter over Wasabi:DropDownList: &lt;br /&gt;
* '''navbuttons''' - (bool) Setting this flag will include the navigation buttons on the object.  Default is to have the buttons.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;componentbucket/&amp;gt;==&lt;br /&gt;
The componentbucket is a fancy name for the Thinger.  More precisely, in Winamp3, the &amp;quot;Thinger Window&amp;quot; is a window which implements a very simple horizontal componentbucket.  The object itself may be instantiated horizontally or vertically and the scrolling of the display within it should be controlled by button objects using &amp;quot;cb_next&amp;quot; and &amp;quot;cb_prev&amp;quot; action parameters and setting the cbtarget parameter to this object.  The object has the following parameters:&lt;br /&gt;
* '''leftmargin''' - (int) The number of extra pixels to pad the left (or top) edge of the total component bucket scrolling display.&lt;br /&gt;
* '''rightmargin''' - (int) The number of extra pixels to pad the right (or bottom) edge of the total component bucket scrolling display.&lt;br /&gt;
* '''spacing''' - (int) The number of extra pixels to place between each bucket icon.&lt;br /&gt;
* '''vertical''' - (bool) Whether or not the display should scroll vertically or horizontally.  Default is horizontal.&lt;br /&gt;
A simple &amp;quot;thinger group&amp;quot; follows:&lt;br /&gt;
 &amp;lt;groupdef id=&amp;quot;some.thinger.group.thing&amp;quot;&amp;gt;&lt;br /&gt;
 	&amp;lt;button id=&amp;quot;mythinger.up&amp;quot; x=&amp;quot;0&amp;quot; y=&amp;quot;0&amp;quot;&lt;br /&gt;
 		h=&amp;quot;20&amp;quot; w=&amp;quot;0&amp;quot; relatw=&amp;quot;1&amp;quot;&lt;br /&gt;
 		image=&amp;quot;mythinger.up.normal&amp;quot; &lt;br /&gt;
 		hoverimage=&amp;quot;mythinger.up.hover&amp;quot; &lt;br /&gt;
 		downimage=&amp;quot;mythinger.up.down&amp;quot;&lt;br /&gt;
 		action=&amp;quot;CB_PREV&amp;quot; cbtarget=&amp;quot;mythinger&amp;quot;&lt;br /&gt;
 	/&amp;gt;&lt;br /&gt;
 	&amp;lt;button id=&amp;quot;mythinger.down&amp;quot; x=&amp;quot;0&amp;quot; y=&amp;quot;-20&amp;quot;&lt;br /&gt;
 		h=&amp;quot;20&amp;quot; w=&amp;quot;0&amp;quot; relatw=&amp;quot;1&amp;quot; relaty=&amp;quot;1&amp;quot;&lt;br /&gt;
 		image=&amp;quot;mythinger.down.normal&amp;quot; &lt;br /&gt;
 		hoverimage=&amp;quot;mythinger.down.hover&amp;quot; &lt;br /&gt;
 		downimage=&amp;quot;mythinger.down.down&amp;quot;&lt;br /&gt;
 		action=&amp;quot;CB_NEXT&amp;quot; cbtarget=&amp;quot;mythinger&amp;quot;&lt;br /&gt;
 	/&amp;gt;&lt;br /&gt;
 	&amp;lt;componentbucket id=&amp;quot;mythinger&amp;quot; vertical=&amp;quot;1&amp;quot; x=&amp;quot;0&amp;quot; y=&amp;quot;20&amp;quot; w=&amp;quot;0&amp;quot; h=&amp;quot;-40&amp;quot; relath=&amp;quot;1&amp;quot;/&amp;gt; &lt;br /&gt;
 &amp;lt;/groupdef&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;customobject/&amp;gt;==&lt;br /&gt;
The customobject is a useful tool for temporarily instantiating a group into a user interface.  It has only one parameter:&lt;br /&gt;
groupid - (id) Instantiate the specified group into my defined area.&lt;br /&gt;
By finding your customobject in script and simply calling setXmlParam on it to give it new values for groupid, you can switch between the instantiation of multiple groups in a single user interface space.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;edit/&amp;gt; &amp;amp; &amp;lt;Wasabi:EditBox/&amp;gt;==&lt;br /&gt;
The edit control is, as you might guess, a text entry field. Some versions of Wasabi currently embed an OS edit control into the rectangular area defined by this object.  This embedded control will not blend properly with the rest of the skin's painting, it will always paint on top of everything else.  Keep this in mind when developing skins for widest compatibility.&lt;br /&gt;
* '''text''' - (str) Set the text in the edit field to this value.&lt;br /&gt;
* '''action''' - (str) Will accept the string &amp;quot;mb_url&amp;quot; to cause this edit box to automatically send its value as an url to the main minibrowser.&lt;br /&gt;
* '''multiline''' - (bool) Determines if the box is a single or multiple line input style.&lt;br /&gt;
* '''vscroll''' - (bool) Causes the edit window to have a vertical scroller.  Default is off.&lt;br /&gt;
* '''autohscroll''' - (bool) Causes the horizontal area to scroll if necessary.  Default is on.&lt;br /&gt;
* '''autoenter''' - (bool) Causes the system to automatically send a &amp;quot;done&amp;quot; event when the user stops typing past a certain timeout.  Default is off.&lt;br /&gt;
* '''password''' - (bool) Causes the echoed characters to be single marks for password purposes.  Default is off.&lt;br /&gt;
An edit object may be bound to a string configuration attribute.&lt;br /&gt;
 &lt;br /&gt;
Here's the definition of Wasabi:EditBox:&lt;br /&gt;
 &amp;lt;groupdef&lt;br /&gt;
 	id=&amp;quot;wasabi.edit&amp;quot; h=&amp;quot;20&amp;quot;&lt;br /&gt;
 	inherit_group=&amp;quot;wasabi.objectframe.group&amp;quot;&lt;br /&gt;
 	xuitag=&amp;quot;Wasabi:EditBox&amp;quot; embed_xui=&amp;quot;wasabi.edit.box&amp;quot;&lt;br /&gt;
 &amp;gt;&lt;br /&gt;
 	&amp;lt;edit id=&amp;quot;wasabi.edit.box&amp;quot; x=&amp;quot;1&amp;quot; y=&amp;quot;1&amp;quot; w=&amp;quot;-2&amp;quot; h=&amp;quot;-2&amp;quot; relatw=&amp;quot;1&amp;quot; relath=&amp;quot;1&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/groupdef&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;grid/&amp;gt;==&lt;br /&gt;
The grid object is a very nice object for creating stretchable images that still look good on the edges.  It is a graphic, like a layer, but unlike layer it is created by applying nine different bitmaps, stretching five of them.  There are, as you might guess, nine parameters&lt;br /&gt;
&lt;br /&gt;
* '''topleft''' - (id) A bitmap element for the top left section of the grid.&lt;br /&gt;
* '''top''' - (id) A bitmap element for the top middle section of the grid.&lt;br /&gt;
* '''topright''' - (id) A bitmap element for the top right section of the grid.&lt;br /&gt;
* '''left''' - (id) A bitmap element for the middle left section of the grid.&lt;br /&gt;
* '''middle''' - (id) A bitmap element for the center section of the grid.&lt;br /&gt;
* '''right''' - (id) A bitmap element for the middle right section of the grid.&lt;br /&gt;
* '''bottomleft''' - (id) A bitmap element for the bottom left section of the grid.&lt;br /&gt;
* '''bottom''' - (id) A bitmap element for the bottom middle section of the grid.&lt;br /&gt;
* '''bottomright''' - (id) A bitmap element for the bottom right section of the grid. &lt;br /&gt;
&lt;br /&gt;
Essentially, the given rectangle of the grid is intersected with 2 horizontal and 2 vertical lines.  The topleft, topright, bottomleft, and bottomright bitmap elements will not be resized.  The top, left, middle, right, and bottom bitmap elements, however, will be stretched to make all fit the grid rectangle.  Using intelligently sized bitmap elements is fairly critical for this object.  If you're having trouble, try starting with all of your bitmap elements as equal-sized squares.&lt;br /&gt;
&lt;br /&gt;
 Example:&lt;br /&gt;
 &amp;lt;grid x=&amp;quot;70&amp;quot; y=&amp;quot;25&amp;quot; w=&amp;quot;-74&amp;quot; relatw=&amp;quot;1&amp;quot; h=&amp;quot;20&amp;quot; topleft=&amp;quot;main.text.left&amp;quot; top=&amp;quot;main.text.center&amp;quot; topright=&amp;quot;main.text.right&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;group/&amp;gt;==&lt;br /&gt;
Groups are instantiated by using the group tag.  Groups, when instantiated within a layout or some other groupdef, take the standard GuiObject params in order to define the group's instantiated size and properties, and then all of the contents of the group will be instantiated within the space it defines.  At instantiation, a group will express a specified boundary rectangle and, thus, the positions of objects within it depending upon relative, proportional, or design coordinate systems may then be calculated.&lt;br /&gt;
 &lt;br /&gt;
To specify which groupdef to instantiate, set the id parameter of the group tag to the id of the desired groupdef.  The instantiation of each group can be so customized, however, group instantiates also may be assigned their own custom id to allow each instantiate to be found by code or script:&lt;br /&gt;
* '''id''' (id) - The groupdef to be instantiated.&lt;br /&gt;
* '''instance_id''' (str) - A new id value with which to be able find this particular instantiate.&lt;br /&gt;
&lt;br /&gt;
The following snippet will create two instantiates of the source group, with one specially customized (in the assumption that the &amp;quot;specialchild.maki&amp;quot; script will be handling the fact one is going to be special) :&lt;br /&gt;
 &amp;lt;groupdef id=&amp;quot;child&amp;quot;&amp;gt;&lt;br /&gt;
 	&amp;lt;layer image=&amp;quot;childimg&amp;quot; x=&amp;quot;0&amp;quot; y=&amp;quot;0&amp;quot; w=&amp;quot;0&amp;quot; h=&amp;quot;0&amp;quot; relatw=&amp;quot;0&amp;quot; relath=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/groupdef&amp;gt;&lt;br /&gt;
 &amp;lt;groupdef id=&amp;quot;parent&amp;quot;&amp;gt;&lt;br /&gt;
 	&amp;lt;group id=&amp;quot;child&amp;quot; x=&amp;quot;0&amp;quot; y=&amp;quot;0&amp;quot; w=&amp;quot;0&amp;quot; relatw=&amp;quot;0&amp;quot; h=&amp;quot;90&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;group id=&amp;quot;child&amp;quot; instance_id=&amp;quot;special&amp;quot;&lt;br /&gt;
 		notify=&amp;quot;This is a special notification for this obj.&amp;quot;&lt;br /&gt;
 		x=&amp;quot;0&amp;quot; y=&amp;quot;90&amp;quot; w=&amp;quot;0&amp;quot; relatw=&amp;quot;0&amp;quot; h=&amp;quot;-90&amp;quot; relath=&amp;quot;1&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;script file=&amp;quot;specialchild.maki&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/groupdef&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;grouplist/&amp;gt;==&lt;br /&gt;
A grouplist is, oddly enough, an object whose purpose is to accept and display a list of multiple groups.  For instance, Wasabi's popup menu is a grouplist.  A grouplist is expected to be filled in script, and it has no interesting parameters.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;layer/&amp;gt;==&lt;br /&gt;
In Wasabi, the layer is analogous to the same-named object in photoshop.  It is simply a nice bitmap graphic to be displayed in the user interface (with the standard alpha and region effects available to all guiobject derived objects, based by default on the properties of the bitmap element it houses).  Here are its parameters:&lt;br /&gt;
* '''image''' - (id) The id of the bitmap element to be used for display.&lt;br /&gt;
* '''inactiveimage''' - (id) A secondary id to be displayed if this guiobject is set to &amp;quot;inactive&amp;quot; status.&lt;br /&gt;
* '''region''' - (id) The id of a different bitmap element to use as the source of this object's region.&lt;br /&gt;
* '''tile''' - (bool) Setting this flag will tile the image if the rectangular size of the layer is different than the rectangular size of the bitmap.  The default is to stretch.&lt;br /&gt;
* '''resize''' - (str) A specific string enumerating which direction one should allow the resizing of the parent layout if this object's region is gripped and dragged by the user. Incompatible with the move parameter on guiobject.  See below.&lt;br /&gt;
* '''scale''' - (str) A specific string enumerating which direction one should allow the scaling of the parent layout if this object's region is gripped and dragged by the user.  Incompatible with the move parameter on guiobject.  See below.&lt;br /&gt;
* '''dblclickaction''' - (str) The string of an action to be sent into the system if this object is doubleclicked within its region.&lt;br /&gt;
The resize and scale parameters transform the simple layer graphic into interactive gui objects in the system by enabling them to be dragged by the user to resize or change the scale of the parent layout.  The eight possible values for these parameters are &amp;quot;top&amp;quot; &amp;quot;left&amp;quot; &amp;quot;right&amp;quot; &amp;quot;bottom&amp;quot; &amp;quot;topleft&amp;quot; &amp;quot;topright&amp;quot; &amp;quot;bottomleft&amp;quot; and &amp;quot;bottomright.&amp;quot;  If both resize and scale are set on a single layer, the object will act as a resizer by default but as a scaler if the ALT key is held down.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;animatedlayer/&amp;gt;==&lt;br /&gt;
An animatedlayer is a series of frames of sprite animation displayed in the GUI.  The frames of animation are specified in the bitmap element which is given in the image parameter to this object.  The animation is expected to be a specific progression of frames of a fixed size, also to be specified via parameters on the object.  Each frame of animation will have its own region.    The animatedlayer object inherits directly from the layer object, so all of the above parameters are valid, along with these specific to animation:&lt;br /&gt;
* '''frameheight''' - (int) The height in pixels of each cell of animation.  If frameheight is set, the animation will be assumed to be a vertical strip of cells in the given bitmap.&lt;br /&gt;
* '''framewidth''' - (int) The width in pixels of each cell of animation.  If framewidth is set, the animation will be assumed to be a horizontal strip of cells in the given bitmap.&lt;br /&gt;
* '''elementframes''' - (int) The number of total frames of animation.  If this value is set, the animation will be assumed to be comprised of multiple bitmap elements whose ids are resolved by using the value of the image parameter as a printf-compatible formatting string with a single integer parameter.  See below.&lt;br /&gt;
* '''start''' - (int) The frame index which should be used as the beginning frame of the animation.  Default is the first frame of the defined animation list.&lt;br /&gt;
* '''end''' - (int) The frame index which should be used as the terminating frame of the animation.  Default is the last frame of the defined animation list.&lt;br /&gt;
* '''speed''' - (int) The delay in ms between each frame, on average.  Default is 200 ms.&lt;br /&gt;
* '''realtime''' - (bool) Setting this flag will force-redraw the animation area the moment the new frame is meant to be seen.  Default behaviour is to wait for and go along with the other invalidations from the rest of the UI on the main thread's draw loop.  Expect use of this flag to have a high impact on system performance on slower machines.  In other words, don't use it unless you know what you're doing.&lt;br /&gt;
* '''autoreplay''' - (bool) Setting this flag will cause the animation to repeat to the beginning frame once it has displayed the terminating frame of animation.  Default is ON.&lt;br /&gt;
* '''autoplay''' - (bool)  Setting this flag will cause the animation to begin playing the moment it is loaded into the user interface.  Default is OFF.  See below.&lt;br /&gt;
* '''debug''' - (bool)  Setting this flag will cause the system to draw the current frame number of the animation on top of the animation graphics, for, as you might guess, debug purposes.&lt;br /&gt;
&lt;br /&gt;
You must note that animations are usually meant to be &amp;quot;triggered&amp;quot; through script, as too many live animations happily blitting their way through a deep and complex user interface using lots of alpha blending, et al, can cause significant performance bottlenecks on slow computers (especially if your users aren't expecting your application to be eating all of the machine resources).  With this in mind, if you just create an animated layer and drop it into a skin, it will not begin animating unless you set the autoplay parameter.&lt;br /&gt;
 &lt;br /&gt;
There are three different ways to present animation frames to this object.  The frames may either all be concatenated into a vertical or horizontal &amp;quot;filmstrip&amp;quot; style bitmap element -- in which case the height or width of each animation cell (respectively) should be set with the frameheight or framewidth parameter.  &lt;br /&gt;
The third way to give this object its animation frames is more complex and consists of loading multiple bitmap elements with each bitmap representing one frame of animation.  This is done by first setting the elementframes parameter with the number of frames to be loaded, then by using a special formatting string as the image parameter.  For those familiar with the printf function, when the elementframes parameter is set, that integer will be run in a for loop and the image name will be used as the formatting string to a printf function that takes only the current integer in the for loop as a parameter.&lt;br /&gt;
For those unfamiliar with printf, this will seem a bit confusing.  Somewhere in the string you pass to the image parameter, you should have the two characters %d, and these characters will be replaced by the character representation of the number as it loads bitmap elements.  If you want to have 0-loaded prefix characters (for instance &amp;quot;01-09&amp;quot; instead of &amp;quot;1-9&amp;quot;), you can place %02d into your image parameter, and if there aren't enough characters in the number to make up 2 full digits, the number will be left-padded with the zero character.  You can just as easily use any number of padding characters as well.  &lt;br /&gt;
I highly suspect this all still makes little sense, so let me give you a simplified example (missing important parameters) to show three different animated layers each loading three sets of differently named bitmaps:&lt;br /&gt;
 &amp;lt;elements&amp;gt;&lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;bmp1&amp;quot;/&amp;gt; &lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;bmp2&amp;quot;/&amp;gt; &lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;bmp3&amp;quot;/&amp;gt; &lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;bmp01img&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;bmp02img&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;bmp03img&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;b00001mp&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;b00002mp&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;b00003mp&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/elements&amp;gt;&lt;br /&gt;
 &amp;lt;groupdef id=&amp;quot;whatever&amp;quot;&amp;gt;&lt;br /&gt;
 	&amp;lt;animatedlayer image=&amp;quot;bmp%d&amp;quot; elementframes=&amp;quot;3&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;animatedlayer image=&amp;quot;bmp%02dimg&amp;quot; elementframes=&amp;quot;3&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;animatedlayer image=&amp;quot;b%05dmp&amp;quot; elementframes=&amp;quot;3&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/groupdef&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;layoutstatus/&amp;gt;==&lt;br /&gt;
The layoutstatus implements the small statusbar that can be found at the bottom of many of the default normal layouts which can contain status text, appcmds buttons, and a proportionally completed progress bar.  The two parameters to this object control what appcmds will be allowed in the status bar:&lt;br /&gt;
* '''exclude''' - (str) A semicolon delimited list of names of appcmds which should not be shown by this control.&lt;br /&gt;
* '''include_only''' - (str) A semicolon delimited list of names of appcmds which will be the only appcmds allowed to be shown by this control.&lt;br /&gt;
For the most part, these layoutstatus objects are only controllable from code.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;list/&amp;gt;==&lt;br /&gt;
The list object is similar but not identical to the Win32 list common control.  It is an  optionally multicolumnar list whose purpose is to display multiple pieces of information per horizontal row.  It may be filled directly by encoding the contents in the XML, by attaching the object to a proper text feed, or by calling methods on the object from script.  The parameters for this object are:&lt;br /&gt;
* '''items''' - (str) A properly delimited string of data used to fill the list.  See below.&lt;br /&gt;
* '''multiselect''' - (bool) This flag, when set, allows the user to select multiple items in the list.  Default is to allow multiselect.&lt;br /&gt;
* '''autodeselect''' - (bool) This flag, when set, causes selection of any single item in the list to automatically deselect all other items in the list.  Default is to not autodeselect.&lt;br /&gt;
* '''select''' - (str) The text of a list item to be selected.&lt;br /&gt;
* '''antialias''' - (bool) Setting this flag causes the text to be rendered antialiased if possible.&lt;br /&gt;
* '''feed''' - (id) The id of a text feed to be used to fill this list.&lt;br /&gt;
* '''hoverselect''' - (bool) This flag causes list items to be selected if the user hovers over them.  Default is to not hoverselect.&lt;br /&gt;
* '''sort''' - (bool) This flag causes the list to sort itself.  Default is to not sort.&lt;br /&gt;
* '''selectonupdown''' - (bool) This flag causes the list to interpret the keyboard commands to mean &amp;quot;change my selection to the item.&amp;quot;  Default is to select on keyboard events.&lt;br /&gt;
* '''numcolumns''' - (int) How many columns to show.  Default is one.&lt;br /&gt;
* '''columwidths''' - (int) A semicolon delimited list of integers specifying how to size the column widths in this list.  See below.&lt;br /&gt;
* '''columnlabels''' - (str) A semicolon delimited list of strings to be used as the multiple column labels.&lt;br /&gt;
The list object depends upon being fed numerous strings with proper syntax in order to properly generate and populate a complex list display.  The syntax for the items parameter (which is the same syntax as the feed must provide) is to delimit each full row in the list with the ';' semicolon character and to delimit each column entry per row with the ',' character.  The columnwidths and columnlabels also require a semicolon (';') delimited list of data, one entry per column.  Note that if -1 is given as a width, those columns will be of dynamic width and split up the leftover pixels among themselves.  The default is one column with no labels and a width of -1.&lt;br /&gt;
 &lt;br /&gt;
Here is a sample list object with 3 rows and 3 columns:&lt;br /&gt;
 &amp;lt;list id=&amp;quot;three.by.three&amp;quot;&lt;br /&gt;
 	items=&amp;quot;row1,text,1;row2,moretext,2;row3,stilltext,3&amp;quot;&lt;br /&gt;
 	numcolumns=&amp;quot;3&amp;quot; columnwidths=&amp;quot;50,-1,50&amp;quot;&lt;br /&gt;
 	multiselect=&amp;quot;0&amp;quot; autodeselect=&amp;quot;1&amp;quot;&lt;br /&gt;
 /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;mouseredir/&amp;gt;==&lt;br /&gt;
This object simply redirects all mouse events from its region to the target object specified in the parameter:&lt;br /&gt;
* '''target''' - (id) The target object to get mouse events.&lt;br /&gt;
This is useful for when some objects get overlapped by nonfunctional graphics when laying out complex interfaces.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;Wasabi:RadioGroup/&amp;gt;==&lt;br /&gt;
The Wasabi:RadioGroup object is an invisible object whose purpose is to centralize the functionality of multiple Wasabi:CheckBox objects instantiated in radiobutton mode.  The radioid params on the Wasabi:CheckBox instantiates should give the id of one of these Wasabi:RadioGroup objects.  It has no unique parameters.  Here is a snippet of simple radiobutton functionality:&lt;br /&gt;
 &amp;lt;Wasabi:RadioGroup id=&amp;quot;enableddisabled&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;Wasabi:CheckBox x=&amp;quot;50&amp;quot; y=&amp;quot;110&amp;quot; w=&amp;quot;60&amp;quot;&lt;br /&gt;
 	text=&amp;quot;Enabled&amp;quot; radioid=&amp;quot;enableddisabled&amp;quot;&lt;br /&gt;
 	cfgattrib=&amp;quot;{9149C445-3C30-4E04-8433-5A518ED0FDDE};Enable desktop alpha&amp;quot;&lt;br /&gt;
 	radioval=&amp;quot;1&amp;quot;&lt;br /&gt;
 /&amp;gt;&lt;br /&gt;
 &amp;lt;Wasabi:CheckBox x=&amp;quot;-125&amp;quot; y=&amp;quot;110&amp;quot; w=&amp;quot;62&amp;quot; relatx=&amp;quot;1&amp;quot;&lt;br /&gt;
 	text=&amp;quot;Disabled&amp;quot; radioid=&amp;quot;enableddisabled&amp;quot;&lt;br /&gt;
 	cfgattrib=&amp;quot;{9149C445-3C30-4E04-8433-5A518ED0FDDE};Enable desktop alpha&amp;quot;&lt;br /&gt;
 	radioval=&amp;quot;0&amp;quot;&lt;br /&gt;
 /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;rect/&amp;gt;==&lt;br /&gt;
A nice flat rectangle.  It may be either filled or hollow, and if hollow you may specify only some edges drawn.  Here are its parameters:&lt;br /&gt;
* '''color''' - (id) The id of a color element, or an comma delimited integer triplet RGB value.  Default is &amp;quot;255,00,255&amp;quot; (an ugly color to remind you to set it).&lt;br /&gt;
* '''filled''' - (bool) This flag causes the entire rectangular area to be filled with color.  Default is to not be filled.&lt;br /&gt;
* '''edges''' - (str) A pipe (&amp;quot;|&amp;quot;) delimited set of one or all of the following: &amp;quot;left&amp;quot; &amp;quot;right&amp;quot; &amp;quot;top&amp;quot; &amp;quot;bottom&amp;quot; Default is all, ie: &amp;quot;left|right|top|bottom&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;script/&amp;gt;==&lt;br /&gt;
Scripts allow for the simple creation of UI functionality without requiring C++ code.  While scripts are &amp;quot;compiled&amp;quot; into &amp;quot;script binaries,&amp;quot; these script binaries are special to wasabi and, more importantly, can be run by any compatible Wasabi runtime on any OS to which Wasabi has a runtime.  Scripts are bound like GuiObjects into layout or groupdef sections using the script tag and have the ability to find and modify the nearby sibling and child objects once the UI has been fully instantiated.  Scripts have two important parameters:&lt;br /&gt;
* '''file''' - (str) The filename of the .maki file to load, relative to this xml file.&lt;br /&gt;
* '''param''' - (str) A string that will be available to the instance of the .maki file as an instance specific parameter.&lt;br /&gt;
Note that a single .maki file may be instantiated as a script object numerous times over, and each instantiation can have its own specific parameter data.  Judicious use of this feature can help minimize your reliance on hardcoded strings and limited flexibility in your scripting.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;slider/&amp;gt; &amp;amp; &amp;lt;Wasabi:HSlider/&amp;gt; &amp;amp; &amp;lt;Wasabi:VSlider/&amp;gt;==&lt;br /&gt;
The slider object consists of a background set of images, and a thumb.  The thumb is constrained to move in one dimension -- horizontally or vertically, depending upon its orientation.  The distance in pixels travelled by the thumb across its total distance is interpollated to produce a value between the low and high boundary integers which is assigned to any configuration attribute which may happen to be attached.  Here are the parameters for slider:&lt;br /&gt;
* '''barleft''' - (id) The bitmap element for the left or top position of the slider.&lt;br /&gt;
* '''barmiddle''' - (id) The bitmap element for the middle, stretched, position of the slider.&lt;br /&gt;
* '''barright''' - (id) The bitmap element for the right or bottom position of the slider.&lt;br /&gt;
* '''thumb''' - (id) The bitmap element for the slider thumb.&lt;br /&gt;
* '''downthumb''' - (id) The bitmap element for the slider thumb when held by the user.&lt;br /&gt;
* '''hoverthumb''' - (id) The bitmap element for the slider thumb when the user's mouse is above it.&lt;br /&gt;
* '''orientation''' - (str) Either &amp;quot;v&amp;quot; or &amp;quot;vertical&amp;quot; to make the slider vertical, otherwise it will be horizontal.&lt;br /&gt;
* '''low''' - (int) Set the low-value boundary.  Default is 0.&lt;br /&gt;
* '''high''' - (int) Set the high-value boundary.  Default is 255.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;snappoint/&amp;gt;==&lt;br /&gt;
The snappoint is an invisible point that will attract other snappoint objects with the same id in any other layout and make them want to dock, like little magnets.  These objects have only the following subset of guiobject XML parameters:&lt;br /&gt;
* '''id''' - (id) All snappoint objects with the same id will snap to each other.  Different ids ignore each other.&lt;br /&gt;
* '''x''' - (int) The x position of the snappoint, see: guiobject.&lt;br /&gt;
* '''y''' - (int) The y position of the snappoint, see: guiobject.&lt;br /&gt;
* '''relatx''' - (int) The horizontal coordinate space of the snappoint, see: guiobject.&lt;br /&gt;
* '''relaty''' - (int) The vertical coordinate space of the snappoint, see: guiobject.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;Wasabi:TabSheet/&amp;gt;==&lt;br /&gt;
The Wasabi:TabSheet object contains multiple group instances within it and allows the user to switch between the display of those groups by the ability to click on a list of tab buttons at the top of the rectangular area of the Wasabi:TabSheet.  The name parameter of each groupdef is displayed as the text in the tab which corresponds to it.  Here are the Wasabi:TabSheet parameters:&lt;br /&gt;
* '''windowtype''' - (str) A windowtype string which will instantiate one of every groupdef with the same windowtype and every window class registered with a window creation service to include this windowtype.&lt;br /&gt;
* '''children''' - (id) A semicolon delimited list of groupdef ids to also be instantiated as children of this tabsheet.&lt;br /&gt;
* '''type''' - (int) There are two different themed display styles for Wasabi:TabSheet.  One is with multiple tabs (sheet style), one is with a single button on top that will popup a menu with all the possible tab choices (sidecar style).  The Default is sheet style, which is a value of -2.  Any other value besides -2 will give you sidecar style.&lt;br /&gt;
* '''content_margin_top''' - (int) A margin in pixels to offset the content from the client rectangle of the Wasabi:Tabsheet.&lt;br /&gt;
* '''content_margin_left''' - (int) A margin in pixels to offset the content from the client rectangle of the Wasabi:Tabsheet.&lt;br /&gt;
* '''content_margin_right''' - (int) A margin in pixels to offset the content from the client rectangle of the Wasabi:Tabsheet.&lt;br /&gt;
* '''content_margin_bottom''' - (int) A margin in pixels to offset the content from the client rectangle of the Wasabi:Tabsheet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;text/&amp;gt; &amp;amp; &amp;lt;Wasabi:Text/&amp;gt;==&lt;br /&gt;
The text object is for using the system to render some text in the font of your choice.&lt;br /&gt;
Since Winamp 5.5 (skinversion 1.3) text objects can have multiple lines. For a new line use this &amp;quot;/n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* '''display''' - (str) Either a specific system display string or the string identifier of a text feed.  Setting this value will override the text parameter.  See below.&lt;br /&gt;
* '''ticker''' - (bool) Setting this flag causes the object to scroll left and right if the text does not fit the rectangular area of the text object.&lt;br /&gt;
* '''antialias''' - (bool) Setting this flag causes the text to be rendered antialiased if possible.&lt;br /&gt;
* '''text''' - (str) A static string to be displayed.&lt;br /&gt;
* '''default''' - (str) A parameter alias for text.&lt;br /&gt;
* '''font''' - (id) The id of a bitmapfont or truetypefont element.  If no element with that id can be found, the OS will be asked for a font with that name instead.&lt;br /&gt;
* '''fontsize''' - (int) The size to render the chosen font.&lt;br /&gt;
* '''align''' - (str) One of the following three possible strings: &amp;quot;left&amp;quot; &amp;quot;center&amp;quot; &amp;quot;right&amp;quot; -- Default is &amp;quot;left.&amp;quot;&lt;br /&gt;
* '''valign''' - (str) One of the following three possible strings: &amp;quot;top&amp;quot; &amp;quot;center&amp;quot; &amp;quot;bottom&amp;quot; -- Default is &amp;quot;top.&amp;quot;&lt;br /&gt;
* '''color''' - (int) The comma delimited RGB color of the text.&lt;br /&gt;
* '''shadowcolor''' - (int) The comma delimited RGB color for underrendered shadow text.&lt;br /&gt;
* '''shadowx''' - (int) The x offset of the shadowrender.&lt;br /&gt;
* '''shadowy''' - (int) The y offset of the shadowrender.&lt;br /&gt;
* '''timeroffstyle''' - (int) How to display an empty timer: &amp;quot;0&amp;quot; = &amp;quot;  :  &amp;quot;, &amp;quot;1&amp;quot; = &amp;quot;00:00&amp;quot;, and &amp;quot;2&amp;quot;=&amp;quot;&amp;quot; (if one is displaying time)&lt;br /&gt;
* '''timecolonwidth''' - (int) How many extra pixels wider or smaller should the colon be when displaying time.  Default is -1.&lt;br /&gt;
* '''nograb''' - (bool) Setting this flag will cause the text object to ignore left button down messages.  Default is off.&lt;br /&gt;
* '''showlen''' - (bool) Setting this flag will cause the text display to be appended with the length in minutes and seconds of the current song.  Default is off.&lt;br /&gt;
* '''forcefixed''' - (bool) Force the system to attempt to render the display string with fixed-width font spacing.&lt;br /&gt;
* '''forceupcase''' - (bool) Force the system to make the display string all uppercase before display.&lt;br /&gt;
* '''forceuppercase''' - (bool) Force the system to make the display string all uppercase before display.&lt;br /&gt;
* '''forcelocase''' - (bool) Force the system to make the display string all lowercase before display.&lt;br /&gt;
* '''forcelowercase''' - (bool) Force the system to make the display string all lowercase before display.  &lt;br /&gt;
* '''bold''' - (bool) Render the display string in bold.&lt;br /&gt;
* '''wrap''' - (bool) Setting this flag will cause the text to wrap in its rectangular space.  Default is off.&lt;br /&gt;
* '''dblclickaction''' - (str) A string in the form &amp;quot;SWITCH;layout&amp;quot; where layout is the id of a layout in this object's parent container.  No other actions function on this object.  This action is deprecated.&lt;br /&gt;
* '''offsetx''' - (int) Extra pixels to be added to or subtracted from the calculated x value for the display string to render.&lt;br /&gt;
* '''offsety''' - (int) Extra pixels to be added to or subtracted from the calculated x value for the display string to render.&lt;br /&gt;
 &amp;quot;SONGNAME&amp;quot; 		- The name string of the currently playing song (from metadb).&lt;br /&gt;
 &amp;quot;SONGINFO&amp;quot; 		- The full info string of the currently playing song (from metadb).&lt;br /&gt;
 &amp;quot;SONGARTIST&amp;quot; 		- The artist string of the currently playing song (from metadb).&lt;br /&gt;
 &amp;quot;SONGTITLE&amp;quot; 		- The title string of the currently playing song (from metadb).&lt;br /&gt;
 &amp;quot;SONGALBUM&amp;quot; 		- The album string of the currently playing song (from metadb).&lt;br /&gt;
 &amp;quot;SONGLENGTH&amp;quot; 		- The length string of the currently playing song (from metadb).&lt;br /&gt;
 &amp;quot;TIME&amp;quot; 			- The length string of the currently playing song.&lt;br /&gt;
 &amp;quot;TIMEELAPSED&amp;quot; 		- The elapsed time string of the currently playing song.&lt;br /&gt;
 &amp;quot;TIMEREMAINING&amp;quot; 	- The time remaining string of the currently playing song.&lt;br /&gt;
 &amp;quot;COMPONENTBUCKET&amp;quot; 	- The id of the componentbucket (thinger) item the mousecursor is currently hovering above.&lt;br /&gt;
 &amp;quot;SONGBITRATE&amp;quot; 		- The bitrate string of the currently playing song (from metadb).&lt;br /&gt;
 &amp;quot;SONGSAMPLERATE&amp;quot; 	- The sample string of the currently playing song (from metadb).&lt;br /&gt;
 &lt;br /&gt;
 *** Broken Action (Winamp 5) ***&lt;br /&gt;
 &amp;quot;NORMALIZER:STATUS&amp;quot; 	- The current status of the audio normalizer.&lt;br /&gt;
&lt;br /&gt;
 Example:&lt;br /&gt;
 &amp;lt;text x=&amp;quot;81&amp;quot; y=&amp;quot;11&amp;quot; w=&amp;quot;25&amp;quot; h=&amp;quot;21&amp;quot; antialias=&amp;quot;0&amp;quot; text=&amp;quot;Read This&amp;quot; align=&amp;quot;center&amp;quot; color=&amp;quot;0,0,0&amp;quot; bold=&amp;quot;1&amp;quot;/&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;Wasabi:TitleBox/&amp;gt;==&lt;br /&gt;
The Wasabi:TitleBox object is a nice way to put a simple rectangular frame and title around your content groups.  It has the following parameters:&lt;br /&gt;
* '''title''' - (str) The string to display in the title area.  Default is to use the name parameter of the content group.&lt;br /&gt;
* '''content''' - (id) The id of the groupdef to instantiate as content.&lt;br /&gt;
* '''centered''' - (bool) Setting this flag will center the title text.  Default is to not be centered (and be left justified).&lt;br /&gt;
* '''suffix''' - (str) A string which will be appended to the title before it is displayed.  In this way, if you instantiate multiple groups as content, each name change can still have a string appended.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;Wasabi:Titlebar/&amp;gt;==&lt;br /&gt;
The Wasabi:TitleBar is the graphically themed bar that is placed at the top of all of the Wasabi:StandardFrame windows.  It has the same parameters as the text object, which control the text display of the titlebar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;tree/&amp;gt;==&lt;br /&gt;
The tree object displays a hierarchical set of information with multiple items, where each item may in turn have multiple subitems.  Let's examine its parameters:&lt;br /&gt;
* '''items''' - (str) A specially formatted string describing the hierarchical creation of the tree info.  See below.&lt;br /&gt;
* '''feed''' - (str) The string identifier of a text feed which should provide a string in the same format as the items parameter.&lt;br /&gt;
* '''sorted''' - (bool) Setting this flag will cause all of the tree items to be sorted before display.  Default is to sort.&lt;br /&gt;
* '''childtabs''' - (bool) Setting this flag will cause all tree items with children to display a tab graphic beside them.  Default is to show tab graphics.&lt;br /&gt;
* '''expandroot''' - (bool) Setting this flag will cause all root tree items to display with their children pre-expanded.  Default is to pre-expand root tree items.&lt;br /&gt;
The syntax required to describe the hierarchy of tree items is a semicolon delimited list of objects in the form &amp;quot;name(list)&amp;quot; where name is the string to display for that tree item and list is another semicolon delimited list of objects which are the direct children of name. &lt;br /&gt;
 &lt;br /&gt;
The following snippet will create a tree with one root node that has three child nodes, with each child node having differing numbers of sub nodes:&lt;br /&gt;
 &amp;lt;tree id=&amp;quot;example.tree&amp;quot;&lt;br /&gt;
 	x=&amp;quot;0&amp;quot; y=&amp;quot;0&amp;quot; w=&amp;quot;0&amp;quot; h=&amp;quot;0&amp;quot; relatw=&amp;quot;1&amp;quot; relath=&amp;quot;1&amp;quot;&lt;br /&gt;
 	items=&amp;quot;root(child1(sub1;sub2);child2;child3(sub3))&amp;quot;&lt;br /&gt;
 /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;vis/&amp;gt;==&lt;br /&gt;
The vis object is the multistate audio visualization display.  It has a multitude of parameters for how simple it is:&lt;br /&gt;
* '''colorallbands''' - (int) The comma delimited RGB triplet to color all the spectroscope bands.&lt;br /&gt;
* '''colorband1''' - (int) The comma delimited RGB triplet to color spectroscope band 1.&lt;br /&gt;
* '''colorband2''' - (int) The comma delimited RGB triplet to color spectroscope band 2.&lt;br /&gt;
* '''colorband3''' - (int) The comma delimited RGB triplet to color spectroscope band 3.&lt;br /&gt;
* '''colorband4''' - (int) The comma delimited RGB triplet to color spectroscope band 4.&lt;br /&gt;
* '''colorband5''' - (int) The comma delimited RGB triplet to color spectroscope band 5.&lt;br /&gt;
* '''colorband6''' - (int) The comma delimited RGB triplet to color spectroscope band 6.&lt;br /&gt;
* '''colorband7''' - (int) The comma delimited RGB triplet to color spectroscope band 7.&lt;br /&gt;
* '''colorband8''' - (int) The comma delimited RGB triplet to color spectroscope band 8.&lt;br /&gt;
* '''colorband9''' - (int) The comma delimited RGB triplet to color spectroscope band 9.&lt;br /&gt;
* '''colorband10''' - (int) The comma delimited RGB triplet to color spectroscope band 10.&lt;br /&gt;
* '''colorband11''' - (int) The comma delimited RGB triplet to color spectroscope band 11.&lt;br /&gt;
* '''colorband12''' - (int) The comma delimited RGB triplet to color spectroscope band 12.&lt;br /&gt;
* '''colorband13''' - (int) The comma delimited RGB triplet to color spectroscope band 13.&lt;br /&gt;
* '''colorband14''' - (int) The comma delimited RGB triplet to color spectroscope band 14.&lt;br /&gt;
* '''colorband15''' - (int) The comma delimited RGB triplet to color spectroscope band 15.&lt;br /&gt;
* '''colorband16''' - (int) The comma delimited RGB triplet to color spectroscope band 16.&lt;br /&gt;
* '''colorbandpeak''' - (int) The comma delimited RGB triplet to color the spectroscope peak line.&lt;br /&gt;
* '''colorallosc''' - (int) The comma delimited RGB triplet to color the whole oscilloscope.&lt;br /&gt;
* '''colorosc1''' - (int) The comma delimited RGB triplet to color oscilloscope section 1.&lt;br /&gt;
* '''colorosc2''' - (int) The comma delimited RGB triplet to color oscilloscope section 2.&lt;br /&gt;
* '''colorosc3''' - (int) The comma delimited RGB triplet to color oscilloscope section 3.&lt;br /&gt;
* '''colorosc4''' - (int) The comma delimited RGB triplet to color oscilloscope section 4.&lt;br /&gt;
* '''colorosc5''' - (int) The comma delimited RGB triplet to color oscilloscope section 5.&lt;br /&gt;
* '''channel''' - (int) One of three values for which channel to monitor: &amp;quot;1&amp;quot; is left channel, &amp;quot;2&amp;quot; is right channel, &amp;quot;3&amp;quot; is stereo.  Default is stereo.&lt;br /&gt;
* '''fliph''' - (bool) If this flag is set, it blits the vis pixels flipped horizontally.&lt;br /&gt;
* '''flipv''' - (bool) If this flag is set, it blits the vis pixels flipped vertically.&lt;br /&gt;
* '''mode''' - (int) One of three values for which mode to display: &amp;quot;0&amp;quot; is no display, &amp;quot;1&amp;quot; is spectroscope, &amp;quot;2&amp;quot; is oscilloscope.  Default is to read from a config item.&lt;br /&gt;
When the user clicks on the vis, it will cycle between its three modes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;eqvis/&amp;gt;==&lt;br /&gt;
The eqvis object is rather specific to media players, as it is the spline display for the eq settings in the Wasabi Media Player.&lt;br /&gt;
* '''colortop''' - (str) A color value or color element id for the top portion of the spline display.&lt;br /&gt;
* '''colormiddle''' - (str) A color value or color element id for the middle portion of the spline display.&lt;br /&gt;
* '''colorbottom''' - (str) A color value or color element id for the bottom portion of the spline display.&lt;br /&gt;
* '''colorpreamp''' - (str) A color value or color element id for the preamp bar in the spline display.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;gradient/&amp;gt;==&lt;br /&gt;
The gradient object creates a rectangular color gradient.  The available parameters are:&lt;br /&gt;
* '''gradient_x1''' - (float) A floating point value for the left side of the rectangle.  Default is 0.0&lt;br /&gt;
* '''gradient_y1''' - (float) A floating point value for the top side of the rectangle.  Default is 0.0&lt;br /&gt;
* '''gradient_x2''' - (float) A floating point value for the right side of the rectangle.  Default is 1.0&lt;br /&gt;
* '''gradient_x1''' - (float) A floating point value for the bottom side of the rectangle.  Default is 1.0&lt;br /&gt;
* '''points''' - (str) A complex string defining color values for at least two value points with which to build the gradients.  See below.&lt;br /&gt;
The points syntax is a semicolon delimited list of key=value pairs where the key is a floatingpoint number representing a point in the &amp;quot;gradient space&amp;quot; and the value is an RGB triplet (assumed full alpha) or RGBA quad.  For instance, the following object would create a smooth gradient between red in the top left and green at half alpha in the bottom right:&lt;br /&gt;
 	&amp;lt;gradient id=&amp;quot;red.to.green&amp;quot;&lt;br /&gt;
 		x=&amp;quot;0&amp;quot; y=&amp;quot;0&amp;quot; w=&amp;quot;0&amp;quot; h=&amp;quot;0&amp;quot; &lt;br /&gt;
 		relatw=&amp;quot;1&amp;quot; relath=&amp;quot;1&amp;quot;&lt;br /&gt;
 		points=&amp;quot;0.0=255,0,0,255;1.0=0,255,0,128&amp;quot;&lt;br /&gt;
 	/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;Wasabi:StandardFrame:Status/&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;Wasabi:StandardFrame:NoStatus/&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;Wasabi:StandardFrame:Modal/&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;Wasabi:StandardFrame:Static/&amp;gt;==&lt;br /&gt;
The Wasabi:StandardFrame objects are rectangular frames you can use to encapsulate your own layout contents within the currently themed standard frame.  They all have the following parameters:&lt;br /&gt;
* '''content''' - (id) The id of the groupdef to instantiate within the Wasabi:StandardFrame.&lt;br /&gt;
* '''padtitleleft''' - (int) The distance in pixels to pad the title to the left.&lt;br /&gt;
* '''padtitleright''' - (int) The distance in pixels to pad the title to the right.&lt;br /&gt;
* '''shade''' - (id) The id of the layout within our container we should switch to if the titlebar is doubleclicked (ie: the id of the windowshade layout).  Default is no functionality.&lt;br /&gt;
The Wasabi:StandardFrame:Status object has a status bar, while the Wasabi:StandardFrame:NoStatus does not.  The Wasabi:StandardFrame:Static object inherits from Wasabi:StandardFrame:NoStatus and also instantiates the wasabi panel graphics.  The Wasabi:StandardFrame:Modal object does all that and also removes the control menus to make a fully modal dialog frame.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;wndholder/&amp;gt;==&lt;br /&gt;
A wndholder object, similar to a customobject, holds user interface windows based upon what param is given.  The wndholder can also hold window types by guid or groupdef instantiations by id.  Here are its parameters:&lt;br /&gt;
* '''hold''' - (id) A semicolon delimited list of guids or groupdef ids to hold.&lt;br /&gt;
* '''component''' - (id) A parameter alias for hold.&lt;br /&gt;
* '''param''' - (id) A parameter alias for hold.&lt;br /&gt;
* '''noshowcmdbar''' - (bool) Setting this flag will disable the Wasabi command bar.&lt;br /&gt;
* '''noanimatedrects''' - (bool) Setting this flag will disable animated rectangle motion.&lt;br /&gt;
* '''disableanimatedrects''' - (bool) A parameter alias for noanimatedrects.&lt;br /&gt;
* '''autoopen''' - (bool) Setting this flag will cause the object to auto open.&lt;br /&gt;
* '''autoclose''' - (bool) Setting this flag will cause the object to auto close.&lt;br /&gt;
Using a wndholder object indicates to the system that you want to be the &amp;quot;container of record&amp;quot; for the possible requested guids when they are launched by the system through, for instance, the C++ coder registering his window class with registerAutopopup(), which calls the underlying api-&amp;gt;skinwnd_createByGuid().  The container within which this wndholder is instantiated should also be given a component parameter with the same values.  This component parameter is simply a hint to Wasabi that a wndholder object that will accept that component parameter lives within the container.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;objdirview/&amp;gt;==&lt;br /&gt;
The objdirview object displays a tree of hierarchical information to the user, based on a code concept called an Object Directory.  An Object Directory is, in essence, just a container of arbitrary items so this object is merely the display of its contents.  Here are its parameters:&lt;br /&gt;
* '''dir''' - (str) The string identifier of the objdir to which this object should connect.&lt;br /&gt;
* '''target''' - (id) The id of an object to which this object may direct the actions of its internal items being selected.&lt;br /&gt;
* '''displaytarget''' - (id) The id of a customobject which will be assigned to display the display group parameter of the currently selected objdir item.&lt;br /&gt;
* '''defaultdisplay''' - (id) The id of a groupdef to display inside displaytarget if no objdir items are selected.&lt;br /&gt;
When items in the objdirview are selected, the objdir is sent an event telling it that an item was selected.  The target parameter from XML is included in the data sent in that event.   However, the implemented functionality for that event is wholly at the discretion of the programmer implementing the specific objdir in question.  For the QueryDir object used in Winamp3's media library, the target param is for a nearby queryline object to be told the selection is changing.  Your mileage may vary with other objects.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;Wasabi:PathPicker/&amp;gt;==&lt;br /&gt;
The Wasabi:PathPicker object is a simple object to display a text string of a directory path chosen by the user.  When the user clicks on the object, a dir selection service is started, allowing the user to choose a directory path.  Attach this object to a string configuration attribute and you have a simple way for users to choose directories as preferences.  The Wasabi:PathPicker object has no unique parameters.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;querydrag/&amp;gt;==&lt;br /&gt;
The querydrag object is used to create a visual &amp;quot;drag source&amp;quot; for a nearby queryresults object.  The user may click and drag this object and by doing so representationally drag the text of the current query in the queryresults object (which can be dropped into a playlist editor to fill its contents with the results of that query).  It has only two parameters:&lt;br /&gt;
* '''image''' - (id) The bitmap element to display.&lt;br /&gt;
* '''source''' - (id) The source queryresults object.  Default is the nearest.&lt;br /&gt;
If no valid source can be found, this object silently fails to drag.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;queryline/&amp;gt;==&lt;br /&gt;
The invisible queryline object is used to host a text query to be applied to a queryresults object.  One possible use would be to write a script linking the text in a Wasabi:HistoryEditBox to the query parameter of a queryline.  And, speaking of its parameters, here they are:&lt;br /&gt;
* '''querylist''' - (id) The id of the queryresults which will take the query.  Default is to not connect (ie: this param is kinda sorta mandatoryish if you want anything interesting to happen).&lt;br /&gt;
* '''query''' - (str) The string of the query itself.&lt;br /&gt;
* '''auto''' - (bool) Whether or not to execute an autoquery based on the query parameter (ie: &amp;quot;search on the name column for this substring&amp;quot; instead of &amp;quot;run this query&amp;quot;).  Default is to use the string directly as a query (not autoquery).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;queryresults/&amp;gt;==&lt;br /&gt;
The queryresults object is the an invisible binding object that coordinates the filtration of the database by numerous multiple other objects.  The queryline and filterlist objects eventually define a single output from the database, and this information is kept in the queryresults object.  It has only one parameter:&lt;br /&gt;
title - (str) The human readable title for your queryresults.  I have no idea why this would be important.&lt;br /&gt;
Magically, it seems, placing a queryresults object in the same group next to a PlaylistEditor object makes that PlaylistEditor get filled with the queryresults information.  I have no idea how this can be, and sense the telltale signs of powerful dark necromancy at work, here.&lt;/div&gt;</summary>
		<author><name>Pjn123</name></author>	</entry>

	<entry>
		<id>http://wiki.winamp.com/wiki/Wasabi_Appendix:_Action_List</id>
		<title>Wasabi Appendix: Action List</title>
		<link rel="alternate" type="text/html" href="http://wiki.winamp.com/wiki/Wasabi_Appendix:_Action_List"/>
				<updated>2008-09-26T10:43:26Z</updated>
		
		<summary type="html">&lt;p&gt;Pjn123: New page:  &amp;quot;PREV&amp;quot; 			- Previous Track  &amp;quot;PLAY&amp;quot; 			- Play    &amp;quot;PAUSE&amp;quot; 		- Pause    &amp;quot;STOP&amp;quot; 			- Stop    &amp;quot;NEXT&amp;quot; 			- Next Track    &amp;quot;EJECT&amp;quot; 		- Open File    &amp;quot;EJECT_URL&amp;quot; 		- Open URL    &amp;quot;EJECT_DIR&amp;quot; 		- Ope...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; &amp;quot;PREV&amp;quot; 			- Previous Track&lt;br /&gt;
 &amp;quot;PLAY&amp;quot; 			- Play  &lt;br /&gt;
 &amp;quot;PAUSE&amp;quot; 		- Pause  &lt;br /&gt;
 &amp;quot;STOP&amp;quot; 			- Stop  &lt;br /&gt;
 &amp;quot;NEXT&amp;quot; 			- Next Track  &lt;br /&gt;
 &amp;quot;EJECT&amp;quot; 		- Open File  &lt;br /&gt;
 &amp;quot;EJECT_URL&amp;quot; 		- Open URL  &lt;br /&gt;
 &amp;quot;EJECT_DIR&amp;quot; 		- Open Directory  &lt;br /&gt;
 &amp;quot;VOLUME_UP&amp;quot; 		- Increase Volume  &lt;br /&gt;
 &amp;quot;VOLUME_DOWN&amp;quot; 		- Decrease Volume  &lt;br /&gt;
 &amp;quot;REWIND_5S&amp;quot; 		- Rewind 5 Seconds  &lt;br /&gt;
 &amp;quot;FFWD_5S&amp;quot; 		- FastForward 5 Seconds  &lt;br /&gt;
 &amp;quot;TEXT_LARGER&amp;quot; 		- Increase Text Size  &lt;br /&gt;
 &amp;quot;TEXT_SMALLER&amp;quot; 		- Decrease Text Size  &lt;br /&gt;
 &amp;quot;DOUBLESIZE&amp;quot; 		- Double Skin Size  &lt;br /&gt;
 &amp;quot;CONTROLMENU&amp;quot; 		- Control Menu (Opacity, Scaling, Docked Toolbar)&lt;br /&gt;
 &amp;quot;SYSMENU&amp;quot; 		- System Menu (Also the right-click menu in Winamp)&lt;br /&gt;
 &amp;quot;CLOSE&amp;quot; 		- Close Winamp  &lt;br /&gt;
 &amp;quot;MINIMIZE&amp;quot; 		- Minimize Winamp  &lt;br /&gt;
 &amp;quot;CLOSE_WINDOW&amp;quot; 		- Close Current Window  &lt;br /&gt;
 &amp;quot;TOGGLE_ALWAYS_ON_TOP&amp;quot; 	- Always On Top Mode  &lt;br /&gt;
 &amp;quot;TOGGLE_REPEAT&amp;quot; 	- Repeat  &lt;br /&gt;
 &amp;quot;TOGGLE_SHUFFLE&amp;quot; 	- Shuffle  &lt;br /&gt;
 &amp;quot;TOGGLE_CROSSFADER&amp;quot; 	- Crossfader&lt;br /&gt;
 &amp;quot;EQ_TOGGLE&amp;quot; 		- Toggle Equalizer On/Off  &lt;br /&gt;
 &amp;quot;EQ_AUTO&amp;quot; 		- Toggle Automatic Per-Song EQ Settings  &lt;br /&gt;
 &amp;quot;MB_BACK&amp;quot; 		- Minibrowser History Back  &lt;br /&gt;
 &amp;quot;MB_FORWARD&amp;quot; 		- Minibrowser History Forward  &lt;br /&gt;
 &amp;quot;MB_STOP&amp;quot; 		- Minibrowser Stop Loading Page  &lt;br /&gt;
 &amp;quot;MB_REFRESH&amp;quot; 		- Minibrowser Refresh Page  &lt;br /&gt;
 &amp;quot;MB_HOME&amp;quot; 		- Minibrowser Home&lt;br /&gt;
 &amp;quot;VIDEO:FULLSCREEN&amp;quot; 	- Show Video In Fullscreen  &lt;br /&gt;
 &amp;quot;VIDEO:SCALE 1X&amp;quot; 	- Show Video In Normalsize  &lt;br /&gt;
 &amp;quot;VIDEO:SCALE 2X&amp;quot; 	- Show Video In Doublesize  &lt;br /&gt;
 &amp;quot;VIDEO:TV&amp;quot; 		- Open Media Library (will hopefully later show an Internet TV listing in the Media Library)  &lt;br /&gt;
 &amp;quot;VIDEO:MISC&amp;quot; 		- Video Options Menu&lt;br /&gt;
 &amp;quot;CB_PREV&amp;quot; 		- Componentbucket Previous  &lt;br /&gt;
 &amp;quot;CB_NEXT&amp;quot; 		- Componentbucket Next &lt;br /&gt;
 &amp;quot;SWITCH&amp;quot; 		- Switch To Different Layout as specified by param  &lt;br /&gt;
        param=&amp;quot;someLayout&amp;quot; 	- where someLayout is the id of the Layout to switch to  &lt;br /&gt;
 &amp;quot;TOGGLE&amp;quot; 		- Toggle Component as specified by param  &lt;br /&gt;
        param=&amp;quot;someGUID&amp;quot; 	- where someGUID is the GUID of the Component as found below&lt;br /&gt;
 &amp;quot;MENU&amp;quot; 			- Show Menu as specified by param  &lt;br /&gt;
        param=&amp;quot;someMenu&amp;quot; 	- where someMenu is the id of the Menu to show. Menu Id's:&lt;br /&gt;
 					- presets = EQ presets menu&lt;br /&gt;
 &amp;quot;ML_SendTo&amp;quot; 		- Show the Send To menu&lt;br /&gt;
 &amp;quot;PE_Add&amp;quot; 		- Add Files to Playlist menu&lt;br /&gt;
 &amp;quot;PE_Rem&amp;quot; 		- Remove Files from Playlist menu&lt;br /&gt;
 &amp;quot;PE_Sel&amp;quot; 		- Select Files from Playlist menu&lt;br /&gt;
 &amp;quot;PE_Misc&amp;quot; 		- Misc Actions Playlist menu&lt;br /&gt;
 &amp;quot;PE_List&amp;quot; 		- Manage Playlist menu&lt;br /&gt;
 &amp;quot;VIS_Menu&amp;quot; 		- Configure Visualizer Menu&lt;br /&gt;
 &amp;quot;VIS_Prev&amp;quot; 		- Previous Visualization Preset&lt;br /&gt;
 &amp;quot;VIS_Next&amp;quot; 		- Next Visualization Preset&lt;br /&gt;
 &amp;quot;PAN&amp;quot; 			- Balance slider&lt;br /&gt;
 &amp;quot;EQ_BAND&amp;quot; 		- Show the Send To menu&lt;br /&gt;
 	param=&amp;quot;slidertype&amp;quot; 	- where slidertype is one of these: preamp;1;2;3;4;5;6;7;8;9;10&lt;br /&gt;
 &amp;quot;trackmenu&amp;quot; 		- Shows Track Menu&lt;br /&gt;
 &amp;quot;WA5:Prefs&amp;quot; 		- Configure Visualizer Menu&lt;br /&gt;
 	param=&amp;quot;int&amp;quot;		- Where int is the page number of the preferences page&lt;br /&gt;
 					- 42 = Playback&lt;br /&gt;
 					- 33 = Select Vis Plugin&lt;br /&gt;
 &amp;quot;VOLUME&amp;quot; 		- Volume Slider&lt;br /&gt;
 &amp;quot;SEEK&amp;quot;			- Seek Slider&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 *** Broken Action (Winamp 5) ***&lt;br /&gt;
 &amp;quot;RELOAD_SKIN&amp;quot; 		- Reload/Refresh Skin&lt;br /&gt;
 &amp;quot;ADD_BOOKMARK&amp;quot; 		- Add Bookmarks&lt;br /&gt;
 &amp;quot;PREFERENCES&amp;quot; 		- Toggle Preferences  &lt;br /&gt;
 &amp;quot;VIEW_BOOKMARK&amp;quot; 	- View Bookmarks  &lt;br /&gt;
 &amp;quot;VIEW_FILE_INFO&amp;quot; 	- Media Info Editor&lt;/div&gt;</summary>
		<author><name>Pjn123</name></author>	</entry>

	<entry>
		<id>http://wiki.winamp.com/wiki/Wasabi_Appendix:_ConfigAttrib</id>
		<title>Wasabi Appendix: ConfigAttrib</title>
		<link rel="alternate" type="text/html" href="http://wiki.winamp.com/wiki/Wasabi_Appendix:_ConfigAttrib"/>
				<updated>2008-09-26T10:42:20Z</updated>
		
		<summary type="html">&lt;p&gt;Pjn123: New page: * '''Vis Random''' (togglebutton) ** cfgattrib=&amp;quot;{0000000A-000C-0010-FF7B-01014263450C};Random&amp;quot;  * '''Crossfade Time''' (slider) ** cfgattrib=&amp;quot;{F1239F09-8CC6-4081-8519-C2AE99FCB14C};Crossfa...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* '''Vis Random''' (togglebutton)&lt;br /&gt;
** cfgattrib=&amp;quot;{0000000A-000C-0010-FF7B-01014263450C};Random&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* '''Crossfade Time''' (slider)&lt;br /&gt;
** cfgattrib=&amp;quot;{F1239F09-8CC6-4081-8519-C2AE99FCB14C};Crossfade time&amp;quot;&lt;br /&gt;
** high=&amp;quot;20&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* '''Crossfade Enabled''' (togglebutton)&lt;br /&gt;
** cfgattrib=&amp;quot;{FC3EAF78-C66E-4ED2-A0AA-1494DFCC13FF};Enable crossfading&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* '''Always on Top''' (togglebutton)&lt;br /&gt;
** cfgattrib=&amp;quot;{280876CF-48C0-40BC-8E86-73CE6BB462E5};Always on top&amp;quot;&lt;/div&gt;</summary>
		<author><name>Pjn123</name></author>	</entry>

	<entry>
		<id>http://wiki.winamp.com/wiki/Wasabi_Appendix:_Cursors</id>
		<title>Wasabi Appendix: Cursors</title>
		<link rel="alternate" type="text/html" href="http://wiki.winamp.com/wiki/Wasabi_Appendix:_Cursors"/>
				<updated>2008-09-26T10:40:13Z</updated>
		
		<summary type="html">&lt;p&gt;Pjn123: New page: You can use the following as cursors for your skin. These cursors will change if the Windows cursor is changed, so it will always match the Windows Theme. * IDC_ARROW * IDC_SIZENS * IDC_SI...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;You can use the following as cursors for your skin. These cursors will change if the Windows cursor is changed, so it will always match the Windows Theme.&lt;br /&gt;
* IDC_ARROW&lt;br /&gt;
* IDC_SIZENS&lt;br /&gt;
* IDC_SIZEWE&lt;br /&gt;
* IDC_SIZENWSE&lt;br /&gt;
* IDC_SIZENESW&lt;br /&gt;
* IDC_SIZEALL&lt;br /&gt;
* IDC_IBEAM&lt;br /&gt;
* IDC_WAIT&lt;br /&gt;
* IDC_CROSS&lt;br /&gt;
* IDC_UPARROW&lt;br /&gt;
* IDC_NO&lt;br /&gt;
* IDC_HAND&lt;br /&gt;
* IDC_APPSTARTING&lt;br /&gt;
* IDC_HELP&lt;br /&gt;
&lt;br /&gt;
 Example:&lt;br /&gt;
 &amp;lt;layer x=&amp;quot;20&amp;quot; y=&amp;quot;20&amp;quot; image=&amp;quot;myimage&amp;quot; cursor=&amp;quot;IDC_HAND&amp;quot;/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Pjn123</name></author>	</entry>

	<entry>
		<id>http://wiki.winamp.com/wiki/XML_GUI_Objects</id>
		<title>XML GUI Objects</title>
		<link rel="alternate" type="text/html" href="http://wiki.winamp.com/wiki/XML_GUI_Objects"/>
				<updated>2008-09-26T10:38:30Z</updated>
		
		<summary type="html">&lt;p&gt;Pjn123: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==GuiObject (Global params)==&lt;br /&gt;
All the objects to be discussed in this chapter are GuiObjects.  This means, among other things, all such objects have the same basic set of parameters which are valid for all of them.  All GuiObjects are objects that live with a set of spatial coordinates within a groupdef (or layout).  A button, a piece of text, a flat bitmap image, a tree of items, and an edit box would all be different kinds of GuiObjects, and all of the parameters listed here work on all of them.&lt;br /&gt;
* '''alpha''' - (int) An integer [0,255] specifying the alpha blend mode of the object (0 is transparent, 255 is opaque).  Default is 255.&lt;br /&gt;
* '''activealpha''' - (int) A different alpha value [0,255] for the object in its active state.&lt;br /&gt;
* '''inactivealpha''' - (int) A different alpha value [0,255] for the object in its inactive state (if you set both activealpha and inactivealpha, it is meaningless to set alpha).&lt;br /&gt;
* '''cursor''' - (id) The id of the cursor element to be displayed when the mouse is over this object. You can also use the system cursors. A list can be found here: '''[[Wasabi Appendix: Cursors | Appendix: Cursors]]'''&lt;br /&gt;
* '''tooltip''' - (str) A human readable string to display as a tooltip for when the mouse is hovered over this object.&lt;br /&gt;
* '''move''' - (bool) Setting this flag causes any dragging of this object to actually drag the entire layout within which the object resides.&lt;br /&gt;
* '''renderbasetexture''' - (bool) A flag to tell the system to always use the system's base texture as the background of this object.&lt;br /&gt;
* '''cfgattrib''' - (str) A configattrib string assigned to this GuiObject. Here is a list of a few: '''[[Wasabi Appendix: ConfigAttrib | Appendix: ConfigAttrib]]'''&lt;br /&gt;
* '''visible''' - (bool) Whether or not the object should be displayed in its group or layout.&lt;br /&gt;
* '''x''' - (int) The X position of the object in its group or layout.&lt;br /&gt;
* '''y''' - (int) The Y position of the object in its group or layout.&lt;br /&gt;
* '''w''' - (int) The width of the object in its group or layout.&lt;br /&gt;
* '''h''' - (int) The height of the object in its group or layout.&lt;br /&gt;
* '''relatx''' - (int) This [0,2] integer determines if the X position should be calculated by normal (&amp;quot;0&amp;quot;), relative (&amp;quot;1&amp;quot;) or proportional (&amp;quot;2&amp;quot;) units.  See below.&lt;br /&gt;
* '''relaty''' - (int) This [0,2] integer determines if the Y position should be calculated by normal (&amp;quot;0&amp;quot;), relative (&amp;quot;1&amp;quot;) or proportional (&amp;quot;2&amp;quot;) units.  See below.&lt;br /&gt;
* '''relatw''' - (int) This [0,2] integer determines if the width should be calculated by normal (&amp;quot;0&amp;quot;), relative (&amp;quot;1&amp;quot;) or proportional (&amp;quot;2&amp;quot;) units.  See below.&lt;br /&gt;
* '''relath''' - (int) This [0,2] integer determines if the height should be calculated by normal (&amp;quot;0&amp;quot;), relative (&amp;quot;1&amp;quot;) or proportional (&amp;quot;2&amp;quot;) units.  See below.&lt;br /&gt;
* '''fitparent''' - (bool) This parameter is used instead of x;y;w;h parameters and means that the object covers all the area of the parent object.&lt;br /&gt;
* '''x1''' - (int)  The X position of the left edge of the object in its group or layout.  Only works inside definitions with design_w parameters set.&lt;br /&gt;
* '''y1''' - (int) The Y position of the top edge of the object in its group or layout.  Only works inside definitions with design_h parameters set.&lt;br /&gt;
* '''x2''' - (int)  The X position of the right edge of the object in its group or layout.  Only works inside definitions with design_w parameters set.&lt;br /&gt;
* '''y2''' - (int) The Y position of the bottom edge of the object in its group or layout.  Only works inside definitions with design_h parameters set.&lt;br /&gt;
* '''anchor''' - (str) A list of one or more of the following keywords, delimited by the pipe (|) character: &amp;quot;top|bottom|left|right&amp;quot; these anchors work with x1/y1/x2/y2 positioning to fix the edge of the object its distance from the edges of the group or layout which contains it.&lt;br /&gt;
* '''sysmetricsx''' - (bool) This flag will cause this object to be resized by having its X position multiplied by the OS scalar coefficient.&lt;br /&gt;
* '''sysmetricsy''' - (bool) This flag will cause this object to be resized by having its Y position multiplied by the OS scalar coefficient. &lt;br /&gt;
* '''sysmetricsw''' - (bool) This flag will cause this object to be resized by having its width multiplied by the OS scalar coefficient.&lt;br /&gt;
* '''sysmetricsh''' - (bool) This flag will cause this object to be resized by having its height multiplied by the OS scalar coefficient.&lt;br /&gt;
* '''rectrgn''' - (bool) Setting this flag causes the engine to ignore the object's region for handling &amp;quot;mouse over object&amp;quot; detection and only use the bounding rectangle. &lt;br /&gt;
* '''regionop''' - (int) An integer enumeration [-2,1] for what kind of region-operation to perform with this object's calculated region against its parent's region.  See below for more information. &lt;br /&gt;
* '''sysregion''' - (int) Param alias for regionop.&lt;br /&gt;
* '''wantfocus''' - (bool) This flag determines whether or not an object ever gets the focus at all.&lt;br /&gt;
* '''focusonclick''' - (bool)  This flag determines whether or not an object gets the focus when clicked. &lt;br /&gt;
* '''taborder''' - (int) This value indicates the &amp;quot;tab order&amp;quot; of the object within the group or layout in which it resides.  When the user hits the tab key, the interface focus moves to the next greater object in tab order.  Objects with equal tab order will be ordered in the reverse of their insertion order in XML (last object in is first in default tab order). &lt;br /&gt;
* '''nodblclick''' - (bool) This flag blocks doubleclick events from being received by this object.&lt;br /&gt;
* '''noleftclick''' - (bool) This flag blocks left click events from being received by this object.&lt;br /&gt;
* '''norightclick''' - (bool) This flag blocks right click events from being received by this object.&lt;br /&gt;
* '''nomousemove''' - (bool) This flag blocks mouse move events from being received by this object.&lt;br /&gt;
* '''nocontextmenu''' - (bool) This flag blocks the main context menu from being displayed for rightclick.&lt;br /&gt;
* '''ghost''' - (bool) This flag causes the object to be transparent to all user interface events such that all the mouse messages pass to the object(s) visibly underneath it.&lt;br /&gt;
* '''notify'''(0-9) - (str) A string to be used as a parameter to the onNotify event for the object upon instantiation.  The notify strings 0-9 will be sent in order.&lt;br /&gt;
* '''droptarget''' - (id)  The id of an object to which all of this object's drag and drop events will be redirected.&lt;br /&gt;
&lt;br /&gt;
'''Appendixes:'''&lt;br /&gt;
*'''[[Wasabi Appendix: ConfigAttrib | Appendix: ConfigAttrib]]'''&lt;br /&gt;
*[[Wasabi Appendix: Cursors | Appendix: Cursors]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;button/&amp;gt; &amp;amp; &amp;lt;togglebutton/&amp;gt;==&lt;br /&gt;
The button is a simple concept in Wasabi - you push it, it activates something.  It can either be used as a substrate for a script (ie: put a script and a button in the same groupdef, and you can handle complex button functionality with the script) or it can be used by itself to launch an action into the system when pressed.  You can implement your own action handlers in code, but some global actions predefined to be handled by the system are also available.&lt;br /&gt;
&lt;br /&gt;
* '''image''' - (id) The id of the bitmap element to display in its &amp;quot;normal&amp;quot; state. &lt;br /&gt;
* '''downimage''' - (id) The id of the bitmap element to display when the user is pressing down on the button.&lt;br /&gt;
* '''hoverimage''' - (id) The id of the bitmap element to display when the user is hovering the mouse over the button.&lt;br /&gt;
* '''activeimage''' - (id) The id of the bitmap element to display when the object is in its &amp;quot;active&amp;quot; state (usually only used by togglebutton, but available on the basic button object to allow the user to create extended functionality in script).&lt;br /&gt;
* '''text''' - (str) A string of text to be rendered on top of the button's currrent state image.  In this way, you can create a single button graphic and reuse it to create internationally localizable buttons.&lt;br /&gt;
* '''action''' - (str) The action to fire if the button is clicked (when it enters into its downstate).&lt;br /&gt;
* '''param''' - (str) The param to go with the action fired if the button is clicked.&lt;br /&gt;
* '''borders''' - (bool) Set this flag if you want to be a styled button.&lt;br /&gt;
* '''style''' - (str) Set the style value if you set the borders flag, to tell wasabi what type of button style you want.&lt;br /&gt;
** &amp;quot;button_normal&amp;quot; &amp;quot;osbutton_normal&amp;quot; &amp;quot;osbutton_close&amp;quot; &amp;quot;osbutton_minimize&amp;quot; and &amp;quot;osbutton_maximize&amp;quot;&lt;br /&gt;
* '''retcode''' - (int) Specifies the &amp;quot;modal return code&amp;quot; for the button.  Only valid with the &amp;quot;endmodal&amp;quot; system action.&lt;br /&gt;
* '''cbtarget''' - (id) The optional &amp;quot;component bucket target&amp;quot; for this button.  Only valid with &amp;quot;cb_next&amp;quot; or &amp;quot;cb_prev&amp;quot; system actions.  A componentbucket is another name for the thinger -- this allows you to have targetted button controls for more than one componentbucket in a user interface.&lt;br /&gt;
* '''action_target''' - (id) This will send the specified action only to the object whose id is listed here.  The param parameter is ignored in this case and this string is sent as the param data for the action.  Most objects don't understand being sent actions (this is an extended functionality), so this won't do anything in most cases.&lt;br /&gt;
* '''center_image''' - (bool) Setting this flag causes the image to be centered against the object rectangle.  This parameter is only important when both borders and an image are specified on a single object. &lt;br /&gt;
'''[[Wasabi Appendix: Action List | Appendix: Action List]]'''&lt;br /&gt;
&lt;br /&gt;
 Example:&lt;br /&gt;
 &amp;lt;button x=&amp;quot;50&amp;quot; y=&amp;quot;10&amp;quot; action=&amp;quot;VID_FS&amp;quot; image=&amp;quot;vis.fs.1&amp;quot; hoverImage=&amp;quot;vis.fs.2&amp;quot; downImage=&amp;quot;vis.fs.3&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;button x=&amp;quot;10&amp;quot; y=&amp;quot;40&amp;quot; w=&amp;quot;100&amp;quot; h=&amp;quot;20&amp;quot; borders=&amp;quot;1&amp;quot; style=&amp;quot;osbutton_normal&amp;quot; text=&amp;quot;Click Here&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;nstatesbutton/&amp;gt;==&lt;br /&gt;
The nstatesbutton is a specialized kind of togglebutton whose purpose is to cycle through a number of different visual states.  The parameters beyond togglebutton that it implements are:&lt;br /&gt;
* '''nstates''' - (int) The number of discrete states in which the object may exist.&lt;br /&gt;
* '''cfgvals''' - (str) A semicolon delimited list of values to represent custom config values for the multiple states.  Default is the current state number.  See below.&lt;br /&gt;
The nstatesbutton uses special handling of the image, downimage, hoverimage, and activeimage parameters expressed by the button object (from which this object is derived).  The nstatesbutton will actually append the state number to the four image parameter strings to calculate the bitmap ids to be loaded for the current object state.  Remember, like most everything else in a computer, this &amp;quot;current state value&amp;quot; counts from 0 and is therefore in the range [0, nstates-1].&lt;br /&gt;
 &lt;br /&gt;
If the object is bound to a configuration attribute, that attribute will be set with a cfgval every time the nstatesbutton transitions to a new state.  If the cfgvals parameter is not set, the attribute will simply be set with the current state value.  If the cfgvals parameter is set, it will parse the string and set the config attrib with the n'th substring corresponding to the current state value.&lt;br /&gt;
 &lt;br /&gt;
The following snippet fully describes two nstatesbutton objects with three states each, one using full images for its visual display, one using themed Wasabi borders with three different state logos:&lt;br /&gt;
 &amp;lt;elements&amp;gt;&lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;nimg0&amp;quot;/&amp;gt; &lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;dimg0&amp;quot;/&amp;gt; &lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;himg0&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;nimg1&amp;quot;/&amp;gt; &lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;dimg1&amp;quot;/&amp;gt; &lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;himg1&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;nimg2&amp;quot;/&amp;gt; &lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;dimg2&amp;quot;/&amp;gt; &lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;himg2&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;logo0&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;logo1&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;logo2&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/elements&amp;gt;&lt;br /&gt;
 &amp;lt;groupdef id=&amp;quot;some.random.groupdef&amp;quot;&amp;gt;&lt;br /&gt;
 	&amp;lt;nstatesbutton id=&amp;quot;three.freeform.states&amp;quot;&lt;br /&gt;
 		nstates=&amp;quot;3&amp;quot; cfgvals=&amp;quot;one;two;three&amp;quot;&lt;br /&gt;
 		image=&amp;quot;nimg&amp;quot; downimage=&amp;quot;dimg&amp;quot; hoverimage=&amp;quot;himg&amp;quot;&lt;br /&gt;
 	/&amp;gt;&lt;br /&gt;
 	&amp;lt;nstatesbutton id=&amp;quot;three.themed.states&amp;quot;&lt;br /&gt;
 		nstates=&amp;quot;3&amp;quot; image=&amp;quot;logo&amp;quot; borders=&amp;quot;1&amp;quot; center_image=&amp;quot;1&amp;quot;&lt;br /&gt;
 	/&amp;gt;&lt;br /&gt;
 &amp;lt;/groupdef&amp;gt;&lt;br /&gt;
If the &amp;quot;three.freeform.states&amp;quot; nstatesbutton were assigned to a configattrib, that attribute would be filled with the values &amp;quot;one&amp;quot; &amp;quot;two&amp;quot; and &amp;quot;three&amp;quot; in order.  If the &amp;quot;three.themed.states&amp;quot; were instead assigned to a configattrib, it would be filled with the default values &amp;quot;0&amp;quot; &amp;quot;1&amp;quot; and &amp;quot;2&amp;quot; in order.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;images/&amp;gt;==&lt;br /&gt;
The images object is object that displays a certain image based on the position of a slider. This object is very similar to [[Animationlayer]] except that this animation's current frame will be determined by the position of a slider.  An example of implementation is the old Classic Winamp skins where the volume slider background changes colour from green to red depending on its position (0%-100%). This object is currently under development and not all sliders are supported. Currently only Volume and Panning(Balance) sliders can be used as sources.&lt;br /&gt;
&lt;br /&gt;
* '''images''' - (id) A bitmap element for the array of images that will be used.&lt;br /&gt;
* '''source''' - (id) Id of the slider that will determine the current animation frame.&lt;br /&gt;
* '''imagesspacing''' - (int) The hight of each animation frame in the bitmap element. This will determine the total number of frames, (300/15=20)&lt;br /&gt;
&lt;br /&gt;
 Example:&lt;br /&gt;
 &amp;lt;images source=&amp;quot;volume&amp;quot; x=&amp;quot;0&amp;quot; y=&amp;quot;0&amp;quot; w=&amp;quot;68&amp;quot; h=&amp;quot;13&amp;quot;&lt;br /&gt;
 images=&amp;quot;main.volpan.volume&amp;quot; imagesspacing=&amp;quot;15&amp;quot;/&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;images source=&amp;quot;balance&amp;quot; x=&amp;quot;73&amp;quot; y=&amp;quot;0&amp;quot; w=&amp;quot;38&amp;quot; h=&amp;quot;13&amp;quot;&lt;br /&gt;
 images=&amp;quot;main.volpan.balance&amp;quot; imagesspacing=&amp;quot;15&amp;quot;/&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
 &amp;lt;slider id=&amp;quot;Volume&amp;quot; action=&amp;quot;VOLUME&amp;quot; x=&amp;quot;1&amp;quot; y=&amp;quot;0&amp;quot; w=&amp;quot;68&amp;quot; h=&amp;quot;13&amp;quot;&lt;br /&gt;
 thumb=&amp;quot;main.volpan.thumb&amp;quot; downThumb=&amp;quot;main.volpan.thumb.pressed&amp;quot;/&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;slider id=&amp;quot;Pan&amp;quot; action=&amp;quot;PAN&amp;quot; x=&amp;quot;74&amp;quot; y=&amp;quot;0&amp;quot; w=&amp;quot;38&amp;quot; h=&amp;quot;13&amp;quot;&lt;br /&gt;
 thumb=&amp;quot;main.volpan.thumb&amp;quot; downThumb=&amp;quot;main.volpan.thumb.pressed&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;PlaylistDirectory/&amp;gt;==&lt;br /&gt;
The PlaylistDirectory object is simply a list with all the saved playlist from the media library. Please remember that this object is always on top of other objects, so you'll have to hide it via maki if you dont want it to be visible. This object was introduced in Winamp 5.5(skinversion 1.3)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;AlbumArt/&amp;gt;==&lt;br /&gt;
The AlbumArt object is a simple GuiObject that displays a picture of the album cover of the song thats playing in Winamp. Please note that if you want do something to this object in a maki script you'll have to define it as a guiobject and not as a layer.&lt;br /&gt;
* '''notfoundImage''' - (id) A bitmap element that used if Winamp cant find any cover for the song.&lt;br /&gt;
* '''align''' - (str) One of the following three possible strings: &amp;quot;left&amp;quot; &amp;quot;center&amp;quot; &amp;quot;right&amp;quot; -- Default is &amp;quot;left&amp;quot;.&lt;br /&gt;
* '''valign''' - (str) One of the following three possible strings: &amp;quot;top&amp;quot; &amp;quot;center&amp;quot; &amp;quot;bottom&amp;quot; -- Default is &amp;quot;top&amp;quot;.&lt;br /&gt;
* '''source''' - (str) Path+Filename of file that you want to display in this object.&lt;br /&gt;
* '''stretched''' - (bool) Stretch the albumart to the size of the object.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;grid/&amp;gt;==&lt;br /&gt;
The grid object is a very nice object for creating stretchable images that still look good on the edges.  It is a graphic, like a layer, but unlike layer it is created by applying nine different bitmaps, stretching five of them.  There are, as you might guess, nine parameters&lt;br /&gt;
&lt;br /&gt;
* '''topleft''' - (id) A bitmap element for the top left section of the grid.&lt;br /&gt;
* '''top''' - (id) A bitmap element for the top middle section of the grid.&lt;br /&gt;
* '''topright''' - (id) A bitmap element for the top right section of the grid.&lt;br /&gt;
* '''left''' - (id) A bitmap element for the middle left section of the grid.&lt;br /&gt;
* '''middle''' - (id) A bitmap element for the center section of the grid.&lt;br /&gt;
* '''right''' - (id) A bitmap element for the middle right section of the grid.&lt;br /&gt;
* '''bottomleft''' - (id) A bitmap element for the bottom left section of the grid.&lt;br /&gt;
* '''bottom''' - (id) A bitmap element for the bottom middle section of the grid.&lt;br /&gt;
* '''bottomright''' - (id) A bitmap element for the bottom right section of the grid. &lt;br /&gt;
&lt;br /&gt;
Essentially, the given rectangle of the grid is intersected with 2 horizontal and 2 vertical lines.  The topleft, topright, bottomleft, and bottomright bitmap elements will not be resized.  The top, left, middle, right, and bottom bitmap elements, however, will be stretched to make all fit the grid rectangle.  Using intelligently sized bitmap elements is fairly critical for this object.  If you're having trouble, try starting with all of your bitmap elements as equal-sized squares.&lt;br /&gt;
&lt;br /&gt;
 Example:&lt;br /&gt;
 &amp;lt;grid x=&amp;quot;70&amp;quot; y=&amp;quot;25&amp;quot; w=&amp;quot;-74&amp;quot; relatw=&amp;quot;1&amp;quot; h=&amp;quot;20&amp;quot; topleft=&amp;quot;main.text.left&amp;quot; top=&amp;quot;main.text.center&amp;quot; topright=&amp;quot;main.text.right&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;Winamp:Browser/&amp;gt;==&lt;br /&gt;
This is basically the browser you'll see in the Bento Winamp skin. You'll also need Winamp 5.54 (skinversion 1.34) for it to work.&lt;br /&gt;
&lt;br /&gt;
- '''home''' - (str) Url for the default homepage for the browser xui.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;browser/&amp;gt;==&lt;br /&gt;
The browser object embeds an external browser technology window (such as IE or Mozilla) into the user interface with which you can load and render HTML directly.&lt;br /&gt;
* '''url''' - (str) The url to be displayed.&lt;br /&gt;
* '''mainmb''' - (bool) Setting this flag makes this browser object the &amp;quot;main mini-browser&amp;quot; for the system.&lt;br /&gt;
* '''targetname''' - (str) This allows this browser object to be set as a specific HTML target.&lt;br /&gt;
* '''scrollbars''' - (str) An enumerated string to determine how the system should handle the embedded browser's scrollbars.  See below.&lt;br /&gt;
Numerous interfaces in Wasabi refer to or control the &amp;quot;main&amp;quot; mini-browser.  Setting the mainmb flag will cause the last browser object which processed its mainmb param to be the main.  In other words, please don't set this flag on more than one object if you actually care which one is the main.&lt;br /&gt;
Scrollbars are important for big browser windows, but can interfere with the simple rendering of HTML content as part of a Wasabi UI.  To this end, the skinner can control how the scrollbars of the embedded browser are displayed by setting the scrollbars parameter to one of the following four string values: &amp;quot;auto&amp;quot; &amp;quot;never&amp;quot; &amp;quot;always&amp;quot; or &amp;quot;default&amp;quot; - default is to allow the HTML page to specify, all others override.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;Wasabi:Frame/&amp;gt;==&lt;br /&gt;
The Wasabi:Frame object is a themed control whose purpose is to provide a movable interface between two rectangular areas, much like the concept of an HTML frame.  Here are its parameters:&lt;br /&gt;
&lt;br /&gt;
* '''orientation''' - (str) One of the following four string values: &amp;quot;v&amp;quot; &amp;quot;vertical&amp;quot; &amp;quot;h&amp;quot; &amp;quot;horizontal&amp;quot; (Default is vertical).&lt;br /&gt;
* '''left''' - (id) The group to be instantiated in the left or top frame.&lt;br /&gt;
* '''right''' - (id) The group to be instantiated in the right or bottom frame.&lt;br /&gt;
* '''top''' - (id) The group to be instantiated in the left or top frame.&lt;br /&gt;
* '''bottom''' - (id) The group to be instantiated in the right or bottom frame.&lt;br /&gt;
* '''from''' - (str) One of the following string values: &amp;quot;l&amp;quot; &amp;quot;left&amp;quot; &amp;quot;t&amp;quot; &amp;quot;top&amp;quot; or &amp;quot;r&amp;quot; &amp;quot;right&amp;quot; &amp;quot;b&amp;quot; &amp;quot;bottom&amp;quot; (Default is left).&lt;br /&gt;
* '''width''' - (int) How many pixels from the chosen edge to start.&lt;br /&gt;
* '''height''' - (int) How many pixels from the chosen edge to start.&lt;br /&gt;
* '''resizable''' - (bool) Set this flag to allow the user to change the position of the framedivider.  Default is to allow it to be resizable.&lt;br /&gt;
* '''maxwidth''' - (int) The maximum amount of pixels you are able to move the poppler if resizable.&lt;br /&gt;
* '''minwidth''' - (int) The minimum amount of pixels you are able to move the poppler if resizable (If you go below this value the poppler will snap to 0).&lt;br /&gt;
* '''vgrabber''' - (string) The centered bitmap of the Grabber.&lt;br /&gt;
* '''vbitmap''' - (string) The stretched bitmap of the Grabber.&lt;br /&gt;
&lt;br /&gt;
In the following simple example, the &amp;quot;top&amp;quot; and &amp;quot;bottom&amp;quot; groups are displayed in a resizable frame object:&lt;br /&gt;
 &amp;lt;groupdef id=&amp;quot;top&amp;quot;&amp;gt;&lt;br /&gt;
 	&amp;lt;text text=&amp;quot;Top&amp;quot; align=&amp;quot;center&amp;quot; x=&amp;quot;0&amp;quot; y=&amp;quot;0&amp;quot; w=&amp;quot;0&amp;quot; h=&amp;quot;0&amp;quot; relatw=&amp;quot;1&amp;quot; relath=&amp;quot;1&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/groupdef&amp;gt;&lt;br /&gt;
 &amp;lt;groupdef id=&amp;quot;bottom&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;text text=&amp;quot;Bottom&amp;quot; align=&amp;quot;center&amp;quot; x=&amp;quot;0&amp;quot; y=&amp;quot;0&amp;quot; w=&amp;quot;0&amp;quot; h=&amp;quot;0&amp;quot; relatw=&amp;quot;1&amp;quot; relath=&amp;quot;1&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/groupdef&amp;gt;&lt;br /&gt;
 &amp;lt;groupdef id=&amp;quot;both&amp;quot;&amp;gt;&lt;br /&gt;
 	&amp;lt;Wasabi:Frame&lt;br /&gt;
 		orientation=&amp;quot;horizontal&amp;quot;&lt;br /&gt;
 		top=&amp;quot;top&amp;quot; bottom=&amp;quot;bottom&amp;quot;    &lt;br /&gt;
 		x=&amp;quot;0&amp;quot; y=&amp;quot;0&amp;quot; w=&amp;quot;0&amp;quot; h=&amp;quot;0&amp;quot;&lt;br /&gt;
 		relatw=&amp;quot;1&amp;quot; relath=&amp;quot;1&amp;quot;&lt;br /&gt;
 	/&amp;gt;&lt;br /&gt;
 &amp;lt;/groupdef&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;Wasabi:CheckBox/&amp;gt;==&lt;br /&gt;
The Wasabi:Checkbox object exists only as a namespaced object because it is expected to have only a single themed appearance.  The Wasabi:Checkbox object is used for both checkbox functionality and radiobutton functionality, depending up on the specification of its parameters.  It consists of a combination of a togglebutton and a text object to create a single functional user interface object.&lt;br /&gt;
* '''text''' - (str) The text to display as part of the checkbox.&lt;br /&gt;
* '''radioid''' - (id) If the button is to be used as part of a radio group, specify id of the parent Wasabi:RadioGroup object here.&lt;br /&gt;
* '''radioval''' - (int) If the button is to be used as part of a radio group, specify its unique integer value here.&lt;br /&gt;
* '''action''' - (str) see button.&lt;br /&gt;
* '''param''' - (str) see button.&lt;br /&gt;
* '''action_target''' - (id) see button.&lt;br /&gt;
As with togglebutton, this is a very useful object for binding to a configuration attribute. It is very popular in preferences interfaces. If the object has a value for radioval, that will be the value set into the attribute if the object is activated.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;Wasabi:DropDownList/&amp;gt;==&lt;br /&gt;
The Wasabi:DropDownList is a themed dialog object.  It may be statically filled via a parameter or dynamically through script or by binding it to a text feed from code.  A Wasabi:DropDownList object may be bound to an integer configuration attribute.&lt;br /&gt;
* '''items''' - (str) A semicolon delimited list of items to be displayed in the dropdown area.&lt;br /&gt;
* '''feed''' - (id) The id of a text feed to provide a semicolon delimited list of items to be displayed in the dropdown area.&lt;br /&gt;
* '''select''' - (int) Specifies an item to be selected.&lt;br /&gt;
* '''listheight''' - (int) Allows the skinner to specify the height of the dropdown area in pixels.&lt;br /&gt;
* '''maxitems''' - (int) Allows the skinner to specify the max height of the dropdown area in lines of text.  If the dropdown area has fewer lines of text than this value when this value is set, the dropdown area is sized to show no more than is needed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;Wasabi:ComboBox/&amp;gt;==&lt;br /&gt;
The Wasabi:ComboBox is a special type of object which combines dropdownlist functionality with an edit field as well.  It has the same parameters as Wasabi:DropDownList.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;Wasabi:HistoryEditBox/&amp;gt;==&lt;br /&gt;
The Wasabi:HistoryEditBox is an even more specialized version of this object family, its only purpose is to remember the last 64 items of text typed into it.  It has one extra parameter over Wasabi:DropDownList: &lt;br /&gt;
* '''navbuttons''' - (bool) Setting this flag will include the navigation buttons on the object.  Default is to have the buttons.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;componentbucket/&amp;gt;==&lt;br /&gt;
The componentbucket is a fancy name for the Thinger.  More precisely, in Winamp3, the &amp;quot;Thinger Window&amp;quot; is a window which implements a very simple horizontal componentbucket.  The object itself may be instantiated horizontally or vertically and the scrolling of the display within it should be controlled by button objects using &amp;quot;cb_next&amp;quot; and &amp;quot;cb_prev&amp;quot; action parameters and setting the cbtarget parameter to this object.  The object has the following parameters:&lt;br /&gt;
* '''leftmargin''' - (int) The number of extra pixels to pad the left (or top) edge of the total component bucket scrolling display.&lt;br /&gt;
* '''rightmargin''' - (int) The number of extra pixels to pad the right (or bottom) edge of the total component bucket scrolling display.&lt;br /&gt;
* '''spacing''' - (int) The number of extra pixels to place between each bucket icon.&lt;br /&gt;
* '''vertical''' - (bool) Whether or not the display should scroll vertically or horizontally.  Default is horizontal.&lt;br /&gt;
A simple &amp;quot;thinger group&amp;quot; follows:&lt;br /&gt;
 &amp;lt;groupdef id=&amp;quot;some.thinger.group.thing&amp;quot;&amp;gt;&lt;br /&gt;
 	&amp;lt;button id=&amp;quot;mythinger.up&amp;quot; x=&amp;quot;0&amp;quot; y=&amp;quot;0&amp;quot;&lt;br /&gt;
 		h=&amp;quot;20&amp;quot; w=&amp;quot;0&amp;quot; relatw=&amp;quot;1&amp;quot;&lt;br /&gt;
 		image=&amp;quot;mythinger.up.normal&amp;quot; &lt;br /&gt;
 		hoverimage=&amp;quot;mythinger.up.hover&amp;quot; &lt;br /&gt;
 		downimage=&amp;quot;mythinger.up.down&amp;quot;&lt;br /&gt;
 		action=&amp;quot;CB_PREV&amp;quot; cbtarget=&amp;quot;mythinger&amp;quot;&lt;br /&gt;
 	/&amp;gt;&lt;br /&gt;
 	&amp;lt;button id=&amp;quot;mythinger.down&amp;quot; x=&amp;quot;0&amp;quot; y=&amp;quot;-20&amp;quot;&lt;br /&gt;
 		h=&amp;quot;20&amp;quot; w=&amp;quot;0&amp;quot; relatw=&amp;quot;1&amp;quot; relaty=&amp;quot;1&amp;quot;&lt;br /&gt;
 		image=&amp;quot;mythinger.down.normal&amp;quot; &lt;br /&gt;
 		hoverimage=&amp;quot;mythinger.down.hover&amp;quot; &lt;br /&gt;
 		downimage=&amp;quot;mythinger.down.down&amp;quot;&lt;br /&gt;
 		action=&amp;quot;CB_NEXT&amp;quot; cbtarget=&amp;quot;mythinger&amp;quot;&lt;br /&gt;
 	/&amp;gt;&lt;br /&gt;
 	&amp;lt;componentbucket id=&amp;quot;mythinger&amp;quot; vertical=&amp;quot;1&amp;quot; x=&amp;quot;0&amp;quot; y=&amp;quot;20&amp;quot; w=&amp;quot;0&amp;quot; h=&amp;quot;-40&amp;quot; relath=&amp;quot;1&amp;quot;/&amp;gt; &lt;br /&gt;
 &amp;lt;/groupdef&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;customobject/&amp;gt;==&lt;br /&gt;
The customobject is a useful tool for temporarily instantiating a group into a user interface.  It has only one parameter:&lt;br /&gt;
groupid - (id) Instantiate the specified group into my defined area.&lt;br /&gt;
By finding your customobject in script and simply calling setXmlParam on it to give it new values for groupid, you can switch between the instantiation of multiple groups in a single user interface space.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;edit/&amp;gt; &amp;amp; &amp;lt;Wasabi:EditBox/&amp;gt;==&lt;br /&gt;
The edit control is, as you might guess, a text entry field. Some versions of Wasabi currently embed an OS edit control into the rectangular area defined by this object.  This embedded control will not blend properly with the rest of the skin's painting, it will always paint on top of everything else.  Keep this in mind when developing skins for widest compatibility.&lt;br /&gt;
* '''text''' - (str) Set the text in the edit field to this value.&lt;br /&gt;
* '''action''' - (str) Will accept the string &amp;quot;mb_url&amp;quot; to cause this edit box to automatically send its value as an url to the main minibrowser.&lt;br /&gt;
* '''multiline''' - (bool) Determines if the box is a single or multiple line input style.&lt;br /&gt;
* '''vscroll''' - (bool) Causes the edit window to have a vertical scroller.  Default is off.&lt;br /&gt;
* '''autohscroll''' - (bool) Causes the horizontal area to scroll if necessary.  Default is on.&lt;br /&gt;
* '''autoenter''' - (bool) Causes the system to automatically send a &amp;quot;done&amp;quot; event when the user stops typing past a certain timeout.  Default is off.&lt;br /&gt;
* '''password''' - (bool) Causes the echoed characters to be single marks for password purposes.  Default is off.&lt;br /&gt;
An edit object may be bound to a string configuration attribute.&lt;br /&gt;
 &lt;br /&gt;
Here's the definition of Wasabi:EditBox:&lt;br /&gt;
 &amp;lt;groupdef&lt;br /&gt;
 	id=&amp;quot;wasabi.edit&amp;quot; h=&amp;quot;20&amp;quot;&lt;br /&gt;
 	inherit_group=&amp;quot;wasabi.objectframe.group&amp;quot;&lt;br /&gt;
 	xuitag=&amp;quot;Wasabi:EditBox&amp;quot; embed_xui=&amp;quot;wasabi.edit.box&amp;quot;&lt;br /&gt;
 &amp;gt;&lt;br /&gt;
 	&amp;lt;edit id=&amp;quot;wasabi.edit.box&amp;quot; x=&amp;quot;1&amp;quot; y=&amp;quot;1&amp;quot; w=&amp;quot;-2&amp;quot; h=&amp;quot;-2&amp;quot; relatw=&amp;quot;1&amp;quot; relath=&amp;quot;1&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/groupdef&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;grid/&amp;gt;==&lt;br /&gt;
The grid object is a very nice object for creating stretchable images that still look good on the edges.  It is a graphic, like a layer, but unlike layer it is created by applying nine different bitmaps, stretching five of them.  There are, as you might guess, nine parameters&lt;br /&gt;
&lt;br /&gt;
* '''topleft''' - (id) A bitmap element for the top left section of the grid.&lt;br /&gt;
* '''top''' - (id) A bitmap element for the top middle section of the grid.&lt;br /&gt;
* '''topright''' - (id) A bitmap element for the top right section of the grid.&lt;br /&gt;
* '''left''' - (id) A bitmap element for the middle left section of the grid.&lt;br /&gt;
* '''middle''' - (id) A bitmap element for the center section of the grid.&lt;br /&gt;
* '''right''' - (id) A bitmap element for the middle right section of the grid.&lt;br /&gt;
* '''bottomleft''' - (id) A bitmap element for the bottom left section of the grid.&lt;br /&gt;
* '''bottom''' - (id) A bitmap element for the bottom middle section of the grid.&lt;br /&gt;
* '''bottomright''' - (id) A bitmap element for the bottom right section of the grid. &lt;br /&gt;
&lt;br /&gt;
Essentially, the given rectangle of the grid is intersected with 2 horizontal and 2 vertical lines.  The topleft, topright, bottomleft, and bottomright bitmap elements will not be resized.  The top, left, middle, right, and bottom bitmap elements, however, will be stretched to make all fit the grid rectangle.  Using intelligently sized bitmap elements is fairly critical for this object.  If you're having trouble, try starting with all of your bitmap elements as equal-sized squares.&lt;br /&gt;
&lt;br /&gt;
 Example:&lt;br /&gt;
 &amp;lt;grid x=&amp;quot;70&amp;quot; y=&amp;quot;25&amp;quot; w=&amp;quot;-74&amp;quot; relatw=&amp;quot;1&amp;quot; h=&amp;quot;20&amp;quot; topleft=&amp;quot;main.text.left&amp;quot; top=&amp;quot;main.text.center&amp;quot; topright=&amp;quot;main.text.right&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;group/&amp;gt;==&lt;br /&gt;
Groups are instantiated by using the group tag.  Groups, when instantiated within a layout or some other groupdef, take the standard GuiObject params in order to define the group's instantiated size and properties, and then all of the contents of the group will be instantiated within the space it defines.  At instantiation, a group will express a specified boundary rectangle and, thus, the positions of objects within it depending upon relative, proportional, or design coordinate systems may then be calculated.&lt;br /&gt;
 &lt;br /&gt;
To specify which groupdef to instantiate, set the id parameter of the group tag to the id of the desired groupdef.  The instantiation of each group can be so customized, however, group instantiates also may be assigned their own custom id to allow each instantiate to be found by code or script:&lt;br /&gt;
* '''id''' (id) - The groupdef to be instantiated.&lt;br /&gt;
* '''instance_id''' (str) - A new id value with which to be able find this particular instantiate.&lt;br /&gt;
&lt;br /&gt;
The following snippet will create two instantiates of the source group, with one specially customized (in the assumption that the &amp;quot;specialchild.maki&amp;quot; script will be handling the fact one is going to be special) :&lt;br /&gt;
 &amp;lt;groupdef id=&amp;quot;child&amp;quot;&amp;gt;&lt;br /&gt;
 	&amp;lt;layer image=&amp;quot;childimg&amp;quot; x=&amp;quot;0&amp;quot; y=&amp;quot;0&amp;quot; w=&amp;quot;0&amp;quot; h=&amp;quot;0&amp;quot; relatw=&amp;quot;0&amp;quot; relath=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/groupdef&amp;gt;&lt;br /&gt;
 &amp;lt;groupdef id=&amp;quot;parent&amp;quot;&amp;gt;&lt;br /&gt;
 	&amp;lt;group id=&amp;quot;child&amp;quot; x=&amp;quot;0&amp;quot; y=&amp;quot;0&amp;quot; w=&amp;quot;0&amp;quot; relatw=&amp;quot;0&amp;quot; h=&amp;quot;90&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;group id=&amp;quot;child&amp;quot; instance_id=&amp;quot;special&amp;quot;&lt;br /&gt;
 		notify=&amp;quot;This is a special notification for this obj.&amp;quot;&lt;br /&gt;
 		x=&amp;quot;0&amp;quot; y=&amp;quot;90&amp;quot; w=&amp;quot;0&amp;quot; relatw=&amp;quot;0&amp;quot; h=&amp;quot;-90&amp;quot; relath=&amp;quot;1&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;script file=&amp;quot;specialchild.maki&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/groupdef&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;grouplist/&amp;gt;==&lt;br /&gt;
A grouplist is, oddly enough, an object whose purpose is to accept and display a list of multiple groups.  For instance, Wasabi's popup menu is a grouplist.  A grouplist is expected to be filled in script, and it has no interesting parameters.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;layer/&amp;gt;==&lt;br /&gt;
In Wasabi, the layer is analogous to the same-named object in photoshop.  It is simply a nice bitmap graphic to be displayed in the user interface (with the standard alpha and region effects available to all guiobject derived objects, based by default on the properties of the bitmap element it houses).  Here are its parameters:&lt;br /&gt;
* '''image''' - (id) The id of the bitmap element to be used for display.&lt;br /&gt;
* '''inactiveimage''' - (id) A secondary id to be displayed if this guiobject is set to &amp;quot;inactive&amp;quot; status.&lt;br /&gt;
* '''region''' - (id) The id of a different bitmap element to use as the source of this object's region.&lt;br /&gt;
* '''tile''' - (bool) Setting this flag will tile the image if the rectangular size of the layer is different than the rectangular size of the bitmap.  The default is to stretch.&lt;br /&gt;
* '''resize''' - (str) A specific string enumerating which direction one should allow the resizing of the parent layout if this object's region is gripped and dragged by the user. Incompatible with the move parameter on guiobject.  See below.&lt;br /&gt;
* '''scale''' - (str) A specific string enumerating which direction one should allow the scaling of the parent layout if this object's region is gripped and dragged by the user.  Incompatible with the move parameter on guiobject.  See below.&lt;br /&gt;
* '''dblclickaction''' - (str) The string of an action to be sent into the system if this object is doubleclicked within its region.&lt;br /&gt;
The resize and scale parameters transform the simple layer graphic into interactive gui objects in the system by enabling them to be dragged by the user to resize or change the scale of the parent layout.  The eight possible values for these parameters are &amp;quot;top&amp;quot; &amp;quot;left&amp;quot; &amp;quot;right&amp;quot; &amp;quot;bottom&amp;quot; &amp;quot;topleft&amp;quot; &amp;quot;topright&amp;quot; &amp;quot;bottomleft&amp;quot; and &amp;quot;bottomright.&amp;quot;  If both resize and scale are set on a single layer, the object will act as a resizer by default but as a scaler if the ALT key is held down.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;animatedlayer/&amp;gt;==&lt;br /&gt;
An animatedlayer is a series of frames of sprite animation displayed in the GUI.  The frames of animation are specified in the bitmap element which is given in the image parameter to this object.  The animation is expected to be a specific progression of frames of a fixed size, also to be specified via parameters on the object.  Each frame of animation will have its own region.    The animatedlayer object inherits directly from the layer object, so all of the above parameters are valid, along with these specific to animation:&lt;br /&gt;
* '''frameheight''' - (int) The height in pixels of each cell of animation.  If frameheight is set, the animation will be assumed to be a vertical strip of cells in the given bitmap.&lt;br /&gt;
* '''framewidth''' - (int) The width in pixels of each cell of animation.  If framewidth is set, the animation will be assumed to be a horizontal strip of cells in the given bitmap.&lt;br /&gt;
* '''elementframes''' - (int) The number of total frames of animation.  If this value is set, the animation will be assumed to be comprised of multiple bitmap elements whose ids are resolved by using the value of the image parameter as a printf-compatible formatting string with a single integer parameter.  See below.&lt;br /&gt;
* '''start''' - (int) The frame index which should be used as the beginning frame of the animation.  Default is the first frame of the defined animation list.&lt;br /&gt;
* '''end''' - (int) The frame index which should be used as the terminating frame of the animation.  Default is the last frame of the defined animation list.&lt;br /&gt;
* '''speed''' - (int) The delay in ms between each frame, on average.  Default is 200 ms.&lt;br /&gt;
* '''realtime''' - (bool) Setting this flag will force-redraw the animation area the moment the new frame is meant to be seen.  Default behaviour is to wait for and go along with the other invalidations from the rest of the UI on the main thread's draw loop.  Expect use of this flag to have a high impact on system performance on slower machines.  In other words, don't use it unless you know what you're doing.&lt;br /&gt;
* '''autoreplay''' - (bool) Setting this flag will cause the animation to repeat to the beginning frame once it has displayed the terminating frame of animation.  Default is ON.&lt;br /&gt;
* '''autoplay''' - (bool)  Setting this flag will cause the animation to begin playing the moment it is loaded into the user interface.  Default is OFF.  See below.&lt;br /&gt;
* '''debug''' - (bool)  Setting this flag will cause the system to draw the current frame number of the animation on top of the animation graphics, for, as you might guess, debug purposes.&lt;br /&gt;
&lt;br /&gt;
You must note that animations are usually meant to be &amp;quot;triggered&amp;quot; through script, as too many live animations happily blitting their way through a deep and complex user interface using lots of alpha blending, et al, can cause significant performance bottlenecks on slow computers (especially if your users aren't expecting your application to be eating all of the machine resources).  With this in mind, if you just create an animated layer and drop it into a skin, it will not begin animating unless you set the autoplay parameter.&lt;br /&gt;
 &lt;br /&gt;
There are three different ways to present animation frames to this object.  The frames may either all be concatenated into a vertical or horizontal &amp;quot;filmstrip&amp;quot; style bitmap element -- in which case the height or width of each animation cell (respectively) should be set with the frameheight or framewidth parameter.  &lt;br /&gt;
The third way to give this object its animation frames is more complex and consists of loading multiple bitmap elements with each bitmap representing one frame of animation.  This is done by first setting the elementframes parameter with the number of frames to be loaded, then by using a special formatting string as the image parameter.  For those familiar with the printf function, when the elementframes parameter is set, that integer will be run in a for loop and the image name will be used as the formatting string to a printf function that takes only the current integer in the for loop as a parameter.&lt;br /&gt;
For those unfamiliar with printf, this will seem a bit confusing.  Somewhere in the string you pass to the image parameter, you should have the two characters %d, and these characters will be replaced by the character representation of the number as it loads bitmap elements.  If you want to have 0-loaded prefix characters (for instance &amp;quot;01-09&amp;quot; instead of &amp;quot;1-9&amp;quot;), you can place %02d into your image parameter, and if there aren't enough characters in the number to make up 2 full digits, the number will be left-padded with the zero character.  You can just as easily use any number of padding characters as well.  &lt;br /&gt;
I highly suspect this all still makes little sense, so let me give you a simplified example (missing important parameters) to show three different animated layers each loading three sets of differently named bitmaps:&lt;br /&gt;
 &amp;lt;elements&amp;gt;&lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;bmp1&amp;quot;/&amp;gt; &lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;bmp2&amp;quot;/&amp;gt; &lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;bmp3&amp;quot;/&amp;gt; &lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;bmp01img&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;bmp02img&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;bmp03img&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;b00001mp&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;b00002mp&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;b00003mp&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/elements&amp;gt;&lt;br /&gt;
 &amp;lt;groupdef id=&amp;quot;whatever&amp;quot;&amp;gt;&lt;br /&gt;
 	&amp;lt;animatedlayer image=&amp;quot;bmp%d&amp;quot; elementframes=&amp;quot;3&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;animatedlayer image=&amp;quot;bmp%02dimg&amp;quot; elementframes=&amp;quot;3&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;animatedlayer image=&amp;quot;b%05dmp&amp;quot; elementframes=&amp;quot;3&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/groupdef&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;layoutstatus/&amp;gt;==&lt;br /&gt;
The layoutstatus implements the small statusbar that can be found at the bottom of many of the default normal layouts which can contain status text, appcmds buttons, and a proportionally completed progress bar.  The two parameters to this object control what appcmds will be allowed in the status bar:&lt;br /&gt;
* '''exclude''' - (str) A semicolon delimited list of names of appcmds which should not be shown by this control.&lt;br /&gt;
* '''include_only''' - (str) A semicolon delimited list of names of appcmds which will be the only appcmds allowed to be shown by this control.&lt;br /&gt;
For the most part, these layoutstatus objects are only controllable from code.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;list/&amp;gt;==&lt;br /&gt;
The list object is similar but not identical to the Win32 list common control.  It is an  optionally multicolumnar list whose purpose is to display multiple pieces of information per horizontal row.  It may be filled directly by encoding the contents in the XML, by attaching the object to a proper text feed, or by calling methods on the object from script.  The parameters for this object are:&lt;br /&gt;
* '''items''' - (str) A properly delimited string of data used to fill the list.  See below.&lt;br /&gt;
* '''multiselect''' - (bool) This flag, when set, allows the user to select multiple items in the list.  Default is to allow multiselect.&lt;br /&gt;
* '''autodeselect''' - (bool) This flag, when set, causes selection of any single item in the list to automatically deselect all other items in the list.  Default is to not autodeselect.&lt;br /&gt;
* '''select''' - (str) The text of a list item to be selected.&lt;br /&gt;
* '''antialias''' - (bool) Setting this flag causes the text to be rendered antialiased if possible.&lt;br /&gt;
* '''feed''' - (id) The id of a text feed to be used to fill this list.&lt;br /&gt;
* '''hoverselect''' - (bool) This flag causes list items to be selected if the user hovers over them.  Default is to not hoverselect.&lt;br /&gt;
* '''sort''' - (bool) This flag causes the list to sort itself.  Default is to not sort.&lt;br /&gt;
* '''selectonupdown''' - (bool) This flag causes the list to interpret the keyboard commands to mean &amp;quot;change my selection to the item.&amp;quot;  Default is to select on keyboard events.&lt;br /&gt;
* '''numcolumns''' - (int) How many columns to show.  Default is one.&lt;br /&gt;
* '''columwidths''' - (int) A semicolon delimited list of integers specifying how to size the column widths in this list.  See below.&lt;br /&gt;
* '''columnlabels''' - (str) A semicolon delimited list of strings to be used as the multiple column labels.&lt;br /&gt;
The list object depends upon being fed numerous strings with proper syntax in order to properly generate and populate a complex list display.  The syntax for the items parameter (which is the same syntax as the feed must provide) is to delimit each full row in the list with the ';' semicolon character and to delimit each column entry per row with the ',' character.  The columnwidths and columnlabels also require a semicolon (';') delimited list of data, one entry per column.  Note that if -1 is given as a width, those columns will be of dynamic width and split up the leftover pixels among themselves.  The default is one column with no labels and a width of -1.&lt;br /&gt;
 &lt;br /&gt;
Here is a sample list object with 3 rows and 3 columns:&lt;br /&gt;
 &amp;lt;list id=&amp;quot;three.by.three&amp;quot;&lt;br /&gt;
 	items=&amp;quot;row1,text,1;row2,moretext,2;row3,stilltext,3&amp;quot;&lt;br /&gt;
 	numcolumns=&amp;quot;3&amp;quot; columnwidths=&amp;quot;50,-1,50&amp;quot;&lt;br /&gt;
 	multiselect=&amp;quot;0&amp;quot; autodeselect=&amp;quot;1&amp;quot;&lt;br /&gt;
 /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;mouseredir/&amp;gt;==&lt;br /&gt;
This object simply redirects all mouse events from its region to the target object specified in the parameter:&lt;br /&gt;
* '''target''' - (id) The target object to get mouse events.&lt;br /&gt;
This is useful for when some objects get overlapped by nonfunctional graphics when laying out complex interfaces.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;Wasabi:RadioGroup/&amp;gt;==&lt;br /&gt;
The Wasabi:RadioGroup object is an invisible object whose purpose is to centralize the functionality of multiple Wasabi:CheckBox objects instantiated in radiobutton mode.  The radioid params on the Wasabi:CheckBox instantiates should give the id of one of these Wasabi:RadioGroup objects.  It has no unique parameters.  Here is a snippet of simple radiobutton functionality:&lt;br /&gt;
 &amp;lt;Wasabi:RadioGroup id=&amp;quot;enableddisabled&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;Wasabi:CheckBox x=&amp;quot;50&amp;quot; y=&amp;quot;110&amp;quot; w=&amp;quot;60&amp;quot;&lt;br /&gt;
 	text=&amp;quot;Enabled&amp;quot; radioid=&amp;quot;enableddisabled&amp;quot;&lt;br /&gt;
 	cfgattrib=&amp;quot;{9149C445-3C30-4E04-8433-5A518ED0FDDE};Enable desktop alpha&amp;quot;&lt;br /&gt;
 	radioval=&amp;quot;1&amp;quot;&lt;br /&gt;
 /&amp;gt;&lt;br /&gt;
 &amp;lt;Wasabi:CheckBox x=&amp;quot;-125&amp;quot; y=&amp;quot;110&amp;quot; w=&amp;quot;62&amp;quot; relatx=&amp;quot;1&amp;quot;&lt;br /&gt;
 	text=&amp;quot;Disabled&amp;quot; radioid=&amp;quot;enableddisabled&amp;quot;&lt;br /&gt;
 	cfgattrib=&amp;quot;{9149C445-3C30-4E04-8433-5A518ED0FDDE};Enable desktop alpha&amp;quot;&lt;br /&gt;
 	radioval=&amp;quot;0&amp;quot;&lt;br /&gt;
 /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;rect/&amp;gt;==&lt;br /&gt;
A nice flat rectangle.  It may be either filled or hollow, and if hollow you may specify only some edges drawn.  Here are its parameters:&lt;br /&gt;
* '''color''' - (id) The id of a color element, or an comma delimited integer triplet RGB value.  Default is &amp;quot;255,00,255&amp;quot; (an ugly color to remind you to set it).&lt;br /&gt;
* '''filled''' - (bool) This flag causes the entire rectangular area to be filled with color.  Default is to not be filled.&lt;br /&gt;
* '''edges''' - (str) A pipe (&amp;quot;|&amp;quot;) delimited set of one or all of the following: &amp;quot;left&amp;quot; &amp;quot;right&amp;quot; &amp;quot;top&amp;quot; &amp;quot;bottom&amp;quot; Default is all, ie: &amp;quot;left|right|top|bottom&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;script/&amp;gt;==&lt;br /&gt;
Scripts allow for the simple creation of UI functionality without requiring C++ code.  While scripts are &amp;quot;compiled&amp;quot; into &amp;quot;script binaries,&amp;quot; these script binaries are special to wasabi and, more importantly, can be run by any compatible Wasabi runtime on any OS to which Wasabi has a runtime.  Scripts are bound like GuiObjects into layout or groupdef sections using the script tag and have the ability to find and modify the nearby sibling and child objects once the UI has been fully instantiated.  Scripts have two important parameters:&lt;br /&gt;
* '''file''' - (str) The filename of the .maki file to load, relative to this xml file.&lt;br /&gt;
* '''param''' - (str) A string that will be available to the instance of the .maki file as an instance specific parameter.&lt;br /&gt;
Note that a single .maki file may be instantiated as a script object numerous times over, and each instantiation can have its own specific parameter data.  Judicious use of this feature can help minimize your reliance on hardcoded strings and limited flexibility in your scripting.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;slider/&amp;gt; &amp;amp; &amp;lt;Wasabi:HSlider/&amp;gt; &amp;amp; &amp;lt;Wasabi:VSlider/&amp;gt;==&lt;br /&gt;
The slider object consists of a background set of images, and a thumb.  The thumb is constrained to move in one dimension -- horizontally or vertically, depending upon its orientation.  The distance in pixels travelled by the thumb across its total distance is interpollated to produce a value between the low and high boundary integers which is assigned to any configuration attribute which may happen to be attached.  Here are the parameters for slider:&lt;br /&gt;
* '''barleft''' - (id) The bitmap element for the left or top position of the slider.&lt;br /&gt;
* '''barmiddle''' - (id) The bitmap element for the middle, stretched, position of the slider.&lt;br /&gt;
* '''barright''' - (id) The bitmap element for the right or bottom position of the slider.&lt;br /&gt;
* '''thumb''' - (id) The bitmap element for the slider thumb.&lt;br /&gt;
* '''downthumb''' - (id) The bitmap element for the slider thumb when held by the user.&lt;br /&gt;
* '''hoverthumb''' - (id) The bitmap element for the slider thumb when the user's mouse is above it.&lt;br /&gt;
* '''orientation''' - (str) Either &amp;quot;v&amp;quot; or &amp;quot;vertical&amp;quot; to make the slider vertical, otherwise it will be horizontal.&lt;br /&gt;
* '''low''' - (int) Set the low-value boundary.  Default is 0.&lt;br /&gt;
* '''high''' - (int) Set the high-value boundary.  Default is 255.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;snappoint/&amp;gt;==&lt;br /&gt;
The snappoint is an invisible point that will attract other snappoint objects with the same id in any other layout and make them want to dock, like little magnets.  These objects have only the following subset of guiobject XML parameters:&lt;br /&gt;
* '''id''' - (id) All snappoint objects with the same id will snap to each other.  Different ids ignore each other.&lt;br /&gt;
* '''x''' - (int) The x position of the snappoint, see: guiobject.&lt;br /&gt;
* '''y''' - (int) The y position of the snappoint, see: guiobject.&lt;br /&gt;
* '''relatx''' - (int) The horizontal coordinate space of the snappoint, see: guiobject.&lt;br /&gt;
* '''relaty''' - (int) The vertical coordinate space of the snappoint, see: guiobject.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;Wasabi:TabSheet/&amp;gt;==&lt;br /&gt;
The Wasabi:TabSheet object contains multiple group instances within it and allows the user to switch between the display of those groups by the ability to click on a list of tab buttons at the top of the rectangular area of the Wasabi:TabSheet.  The name parameter of each groupdef is displayed as the text in the tab which corresponds to it.  Here are the Wasabi:TabSheet parameters:&lt;br /&gt;
* '''windowtype''' - (str) A windowtype string which will instantiate one of every groupdef with the same windowtype and every window class registered with a window creation service to include this windowtype.&lt;br /&gt;
* '''children''' - (id) A semicolon delimited list of groupdef ids to also be instantiated as children of this tabsheet.&lt;br /&gt;
* '''type''' - (int) There are two different themed display styles for Wasabi:TabSheet.  One is with multiple tabs (sheet style), one is with a single button on top that will popup a menu with all the possible tab choices (sidecar style).  The Default is sheet style, which is a value of -2.  Any other value besides -2 will give you sidecar style.&lt;br /&gt;
* '''content_margin_top''' - (int) A margin in pixels to offset the content from the client rectangle of the Wasabi:Tabsheet.&lt;br /&gt;
* '''content_margin_left''' - (int) A margin in pixels to offset the content from the client rectangle of the Wasabi:Tabsheet.&lt;br /&gt;
* '''content_margin_right''' - (int) A margin in pixels to offset the content from the client rectangle of the Wasabi:Tabsheet.&lt;br /&gt;
* '''content_margin_bottom''' - (int) A margin in pixels to offset the content from the client rectangle of the Wasabi:Tabsheet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;text/&amp;gt; &amp;amp; &amp;lt;Wasabi:Text/&amp;gt;==&lt;br /&gt;
The text object is for using the system to render some text in the font of your choice.&lt;br /&gt;
Since Winamp 5.5 (skinversion 1.3) text objects can have multiple lines. For a new line use this &amp;quot;/n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* '''display''' - (str) Either a specific system display string or the string identifier of a text feed.  Setting this value will override the text parameter.  See below.&lt;br /&gt;
* '''ticker''' - (bool) Setting this flag causes the object to scroll left and right if the text does not fit the rectangular area of the text object.&lt;br /&gt;
* '''antialias''' - (bool) Setting this flag causes the text to be rendered antialiased if possible.&lt;br /&gt;
* '''text''' - (str) A static string to be displayed.&lt;br /&gt;
* '''default''' - (str) A parameter alias for text.&lt;br /&gt;
* '''font''' - (id) The id of a bitmapfont or truetypefont element.  If no element with that id can be found, the OS will be asked for a font with that name instead.&lt;br /&gt;
* '''fontsize''' - (int) The size to render the chosen font.&lt;br /&gt;
* '''align''' - (str) One of the following three possible strings: &amp;quot;left&amp;quot; &amp;quot;center&amp;quot; &amp;quot;right&amp;quot; -- Default is &amp;quot;left.&amp;quot;&lt;br /&gt;
* '''valign''' - (str) One of the following three possible strings: &amp;quot;top&amp;quot; &amp;quot;center&amp;quot; &amp;quot;bottom&amp;quot; -- Default is &amp;quot;top.&amp;quot;&lt;br /&gt;
* '''color''' - (int) The comma delimited RGB color of the text.&lt;br /&gt;
* '''shadowcolor''' - (int) The comma delimited RGB color for underrendered shadow text.&lt;br /&gt;
* '''shadowx''' - (int) The x offset of the shadowrender.&lt;br /&gt;
* '''shadowy''' - (int) The y offset of the shadowrender.&lt;br /&gt;
* '''timeroffstyle''' - (int) How to display an empty timer: &amp;quot;0&amp;quot; = &amp;quot;  :  &amp;quot;, &amp;quot;1&amp;quot; = &amp;quot;00:00&amp;quot;, and &amp;quot;2&amp;quot;=&amp;quot;&amp;quot; (if one is displaying time)&lt;br /&gt;
* '''timecolonwidth''' - (int) How many extra pixels wider or smaller should the colon be when displaying time.  Default is -1.&lt;br /&gt;
* '''nograb''' - (bool) Setting this flag will cause the text object to ignore left button down messages.  Default is off.&lt;br /&gt;
* '''showlen''' - (bool) Setting this flag will cause the text display to be appended with the length in minutes and seconds of the current song.  Default is off.&lt;br /&gt;
* '''forcefixed''' - (bool) Force the system to attempt to render the display string with fixed-width font spacing.&lt;br /&gt;
* '''forceupcase''' - (bool) Force the system to make the display string all uppercase before display.&lt;br /&gt;
* '''forceuppercase''' - (bool) Force the system to make the display string all uppercase before display.&lt;br /&gt;
* '''forcelocase''' - (bool) Force the system to make the display string all lowercase before display.&lt;br /&gt;
* '''forcelowercase''' - (bool) Force the system to make the display string all lowercase before display.  &lt;br /&gt;
* '''bold''' - (bool) Render the display string in bold.&lt;br /&gt;
* '''wrap''' - (bool) Setting this flag will cause the text to wrap in its rectangular space.  Default is off.&lt;br /&gt;
* '''dblclickaction''' - (str) A string in the form &amp;quot;SWITCH;layout&amp;quot; where layout is the id of a layout in this object's parent container.  No other actions function on this object.  This action is deprecated.&lt;br /&gt;
* '''offsetx''' - (int) Extra pixels to be added to or subtracted from the calculated x value for the display string to render.&lt;br /&gt;
* '''offsety''' - (int) Extra pixels to be added to or subtracted from the calculated x value for the display string to render.&lt;br /&gt;
 &amp;quot;SONGNAME&amp;quot; 		- The name string of the currently playing song (from metadb).&lt;br /&gt;
 &amp;quot;SONGINFO&amp;quot; 		- The full info string of the currently playing song (from metadb).&lt;br /&gt;
 &amp;quot;SONGARTIST&amp;quot; 		- The artist string of the currently playing song (from metadb).&lt;br /&gt;
 &amp;quot;SONGTITLE&amp;quot; 		- The title string of the currently playing song (from metadb).&lt;br /&gt;
 &amp;quot;SONGALBUM&amp;quot; 		- The album string of the currently playing song (from metadb).&lt;br /&gt;
 &amp;quot;SONGLENGTH&amp;quot; 		- The length string of the currently playing song (from metadb).&lt;br /&gt;
 &amp;quot;TIME&amp;quot; 			- The length string of the currently playing song.&lt;br /&gt;
 &amp;quot;TIMEELAPSED&amp;quot; 		- The elapsed time string of the currently playing song.&lt;br /&gt;
 &amp;quot;TIMEREMAINING&amp;quot; 	- The time remaining string of the currently playing song.&lt;br /&gt;
 &amp;quot;COMPONENTBUCKET&amp;quot; 	- The id of the componentbucket (thinger) item the mousecursor is currently hovering above.&lt;br /&gt;
 &amp;quot;SONGBITRATE&amp;quot; 		- The bitrate string of the currently playing song (from metadb).&lt;br /&gt;
 &amp;quot;SONGSAMPLERATE&amp;quot; 	- The sample string of the currently playing song (from metadb).&lt;br /&gt;
 &lt;br /&gt;
 *** Broken Action (Winamp 5) ***&lt;br /&gt;
 &amp;quot;NORMALIZER:STATUS&amp;quot; 	- The current status of the audio normalizer.&lt;br /&gt;
&lt;br /&gt;
 Example:&lt;br /&gt;
 &amp;lt;text x=&amp;quot;81&amp;quot; y=&amp;quot;11&amp;quot; w=&amp;quot;25&amp;quot; h=&amp;quot;21&amp;quot; antialias=&amp;quot;0&amp;quot; text=&amp;quot;Read This&amp;quot; align=&amp;quot;center&amp;quot; color=&amp;quot;0,0,0&amp;quot; bold=&amp;quot;1&amp;quot;/&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;Wasabi:TitleBox/&amp;gt;==&lt;br /&gt;
The Wasabi:TitleBox object is a nice way to put a simple rectangular frame and title around your content groups.  It has the following parameters:&lt;br /&gt;
* '''title''' - (str) The string to display in the title area.  Default is to use the name parameter of the content group.&lt;br /&gt;
* '''content''' - (id) The id of the groupdef to instantiate as content.&lt;br /&gt;
* '''centered''' - (bool) Setting this flag will center the title text.  Default is to not be centered (and be left justified).&lt;br /&gt;
* '''suffix''' - (str) A string which will be appended to the title before it is displayed.  In this way, if you instantiate multiple groups as content, each name change can still have a string appended.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;Wasabi:Titlebar/&amp;gt;==&lt;br /&gt;
The Wasabi:TitleBar is the graphically themed bar that is placed at the top of all of the Wasabi:StandardFrame windows.  It has the same parameters as the text object, which control the text display of the titlebar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;tree/&amp;gt;==&lt;br /&gt;
The tree object displays a hierarchical set of information with multiple items, where each item may in turn have multiple subitems.  Let's examine its parameters:&lt;br /&gt;
* '''items''' - (str) A specially formatted string describing the hierarchical creation of the tree info.  See below.&lt;br /&gt;
* '''feed''' - (str) The string identifier of a text feed which should provide a string in the same format as the items parameter.&lt;br /&gt;
* '''sorted''' - (bool) Setting this flag will cause all of the tree items to be sorted before display.  Default is to sort.&lt;br /&gt;
* '''childtabs''' - (bool) Setting this flag will cause all tree items with children to display a tab graphic beside them.  Default is to show tab graphics.&lt;br /&gt;
* '''expandroot''' - (bool) Setting this flag will cause all root tree items to display with their children pre-expanded.  Default is to pre-expand root tree items.&lt;br /&gt;
The syntax required to describe the hierarchy of tree items is a semicolon delimited list of objects in the form &amp;quot;name(list)&amp;quot; where name is the string to display for that tree item and list is another semicolon delimited list of objects which are the direct children of name. &lt;br /&gt;
 &lt;br /&gt;
The following snippet will create a tree with one root node that has three child nodes, with each child node having differing numbers of sub nodes:&lt;br /&gt;
 &amp;lt;tree id=&amp;quot;example.tree&amp;quot;&lt;br /&gt;
 	x=&amp;quot;0&amp;quot; y=&amp;quot;0&amp;quot; w=&amp;quot;0&amp;quot; h=&amp;quot;0&amp;quot; relatw=&amp;quot;1&amp;quot; relath=&amp;quot;1&amp;quot;&lt;br /&gt;
 	items=&amp;quot;root(child1(sub1;sub2);child2;child3(sub3))&amp;quot;&lt;br /&gt;
 /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;vis/&amp;gt;==&lt;br /&gt;
The vis object is the multistate audio visualization display.  It has a multitude of parameters for how simple it is:&lt;br /&gt;
* '''colorallbands''' - (int) The comma delimited RGB triplet to color all the spectroscope bands.&lt;br /&gt;
* '''colorband1''' - (int) The comma delimited RGB triplet to color spectroscope band 1.&lt;br /&gt;
* '''colorband2''' - (int) The comma delimited RGB triplet to color spectroscope band 2.&lt;br /&gt;
* '''colorband3''' - (int) The comma delimited RGB triplet to color spectroscope band 3.&lt;br /&gt;
* '''colorband4''' - (int) The comma delimited RGB triplet to color spectroscope band 4.&lt;br /&gt;
* '''colorband5''' - (int) The comma delimited RGB triplet to color spectroscope band 5.&lt;br /&gt;
* '''colorband6''' - (int) The comma delimited RGB triplet to color spectroscope band 6.&lt;br /&gt;
* '''colorband7''' - (int) The comma delimited RGB triplet to color spectroscope band 7.&lt;br /&gt;
* '''colorband8''' - (int) The comma delimited RGB triplet to color spectroscope band 8.&lt;br /&gt;
* '''colorband9''' - (int) The comma delimited RGB triplet to color spectroscope band 9.&lt;br /&gt;
* '''colorband10''' - (int) The comma delimited RGB triplet to color spectroscope band 10.&lt;br /&gt;
* '''colorband11''' - (int) The comma delimited RGB triplet to color spectroscope band 11.&lt;br /&gt;
* '''colorband12''' - (int) The comma delimited RGB triplet to color spectroscope band 12.&lt;br /&gt;
* '''colorband13''' - (int) The comma delimited RGB triplet to color spectroscope band 13.&lt;br /&gt;
* '''colorband14''' - (int) The comma delimited RGB triplet to color spectroscope band 14.&lt;br /&gt;
* '''colorband15''' - (int) The comma delimited RGB triplet to color spectroscope band 15.&lt;br /&gt;
* '''colorband16''' - (int) The comma delimited RGB triplet to color spectroscope band 16.&lt;br /&gt;
* '''colorbandpeak''' - (int) The comma delimited RGB triplet to color the spectroscope peak line.&lt;br /&gt;
* '''colorallosc''' - (int) The comma delimited RGB triplet to color the whole oscilloscope.&lt;br /&gt;
* '''colorosc1''' - (int) The comma delimited RGB triplet to color oscilloscope section 1.&lt;br /&gt;
* '''colorosc2''' - (int) The comma delimited RGB triplet to color oscilloscope section 2.&lt;br /&gt;
* '''colorosc3''' - (int) The comma delimited RGB triplet to color oscilloscope section 3.&lt;br /&gt;
* '''colorosc4''' - (int) The comma delimited RGB triplet to color oscilloscope section 4.&lt;br /&gt;
* '''colorosc5''' - (int) The comma delimited RGB triplet to color oscilloscope section 5.&lt;br /&gt;
* '''channel''' - (int) One of three values for which channel to monitor: &amp;quot;1&amp;quot; is left channel, &amp;quot;2&amp;quot; is right channel, &amp;quot;3&amp;quot; is stereo.  Default is stereo.&lt;br /&gt;
* '''fliph''' - (bool) If this flag is set, it blits the vis pixels flipped horizontally.&lt;br /&gt;
* '''flipv''' - (bool) If this flag is set, it blits the vis pixels flipped vertically.&lt;br /&gt;
* '''mode''' - (int) One of three values for which mode to display: &amp;quot;0&amp;quot; is no display, &amp;quot;1&amp;quot; is spectroscope, &amp;quot;2&amp;quot; is oscilloscope.  Default is to read from a config item.&lt;br /&gt;
When the user clicks on the vis, it will cycle between its three modes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;eqvis/&amp;gt;==&lt;br /&gt;
The eqvis object is rather specific to media players, as it is the spline display for the eq settings in the Wasabi Media Player.&lt;br /&gt;
* '''colortop''' - (str) A color value or color element id for the top portion of the spline display.&lt;br /&gt;
* '''colormiddle''' - (str) A color value or color element id for the middle portion of the spline display.&lt;br /&gt;
* '''colorbottom''' - (str) A color value or color element id for the bottom portion of the spline display.&lt;br /&gt;
* '''colorpreamp''' - (str) A color value or color element id for the preamp bar in the spline display.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;gradient/&amp;gt;==&lt;br /&gt;
The gradient object creates a rectangular color gradient.  The available parameters are:&lt;br /&gt;
* '''gradient_x1''' - (float) A floating point value for the left side of the rectangle.  Default is 0.0&lt;br /&gt;
* '''gradient_y1''' - (float) A floating point value for the top side of the rectangle.  Default is 0.0&lt;br /&gt;
* '''gradient_x2''' - (float) A floating point value for the right side of the rectangle.  Default is 1.0&lt;br /&gt;
* '''gradient_x1''' - (float) A floating point value for the bottom side of the rectangle.  Default is 1.0&lt;br /&gt;
* '''points''' - (str) A complex string defining color values for at least two value points with which to build the gradients.  See below.&lt;br /&gt;
The points syntax is a semicolon delimited list of key=value pairs where the key is a floatingpoint number representing a point in the &amp;quot;gradient space&amp;quot; and the value is an RGB triplet (assumed full alpha) or RGBA quad.  For instance, the following object would create a smooth gradient between red in the top left and green at half alpha in the bottom right:&lt;br /&gt;
 	&amp;lt;gradient id=&amp;quot;red.to.green&amp;quot;&lt;br /&gt;
 		x=&amp;quot;0&amp;quot; y=&amp;quot;0&amp;quot; w=&amp;quot;0&amp;quot; h=&amp;quot;0&amp;quot; &lt;br /&gt;
 		relatw=&amp;quot;1&amp;quot; relath=&amp;quot;1&amp;quot;&lt;br /&gt;
 		points=&amp;quot;0.0=255,0,0,255;1.0=0,255,0,128&amp;quot;&lt;br /&gt;
 	/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;Wasabi:StandardFrame:Status/&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;Wasabi:StandardFrame:NoStatus/&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;Wasabi:StandardFrame:Modal/&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;Wasabi:StandardFrame:Static/&amp;gt;==&lt;br /&gt;
The Wasabi:StandardFrame objects are rectangular frames you can use to encapsulate your own layout contents within the currently themed standard frame.  They all have the following parameters:&lt;br /&gt;
* '''content''' - (id) The id of the groupdef to instantiate within the Wasabi:StandardFrame.&lt;br /&gt;
* '''padtitleleft''' - (int) The distance in pixels to pad the title to the left.&lt;br /&gt;
* '''padtitleright''' - (int) The distance in pixels to pad the title to the right.&lt;br /&gt;
* '''shade''' - (id) The id of the layout within our container we should switch to if the titlebar is doubleclicked (ie: the id of the windowshade layout).  Default is no functionality.&lt;br /&gt;
The Wasabi:StandardFrame:Status object has a status bar, while the Wasabi:StandardFrame:NoStatus does not.  The Wasabi:StandardFrame:Static object inherits from Wasabi:StandardFrame:NoStatus and also instantiates the wasabi panel graphics.  The Wasabi:StandardFrame:Modal object does all that and also removes the control menus to make a fully modal dialog frame.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;wndholder/&amp;gt;==&lt;br /&gt;
A wndholder object, similar to a customobject, holds user interface windows based upon what param is given.  The wndholder can also hold window types by guid or groupdef instantiations by id.  Here are its parameters:&lt;br /&gt;
* '''hold''' - (id) A semicolon delimited list of guids or groupdef ids to hold.&lt;br /&gt;
* '''component''' - (id) A parameter alias for hold.&lt;br /&gt;
* '''param''' - (id) A parameter alias for hold.&lt;br /&gt;
* '''noshowcmdbar''' - (bool) Setting this flag will disable the Wasabi command bar.&lt;br /&gt;
* '''noanimatedrects''' - (bool) Setting this flag will disable animated rectangle motion.&lt;br /&gt;
* '''disableanimatedrects''' - (bool) A parameter alias for noanimatedrects.&lt;br /&gt;
* '''autoopen''' - (bool) Setting this flag will cause the object to auto open.&lt;br /&gt;
* '''autoclose''' - (bool) Setting this flag will cause the object to auto close.&lt;br /&gt;
Using a wndholder object indicates to the system that you want to be the &amp;quot;container of record&amp;quot; for the possible requested guids when they are launched by the system through, for instance, the C++ coder registering his window class with registerAutopopup(), which calls the underlying api-&amp;gt;skinwnd_createByGuid().  The container within which this wndholder is instantiated should also be given a component parameter with the same values.  This component parameter is simply a hint to Wasabi that a wndholder object that will accept that component parameter lives within the container.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;objdirview/&amp;gt;==&lt;br /&gt;
The objdirview object displays a tree of hierarchical information to the user, based on a code concept called an Object Directory.  An Object Directory is, in essence, just a container of arbitrary items so this object is merely the display of its contents.  Here are its parameters:&lt;br /&gt;
* '''dir''' - (str) The string identifier of the objdir to which this object should connect.&lt;br /&gt;
* '''target''' - (id) The id of an object to which this object may direct the actions of its internal items being selected.&lt;br /&gt;
* '''displaytarget''' - (id) The id of a customobject which will be assigned to display the display group parameter of the currently selected objdir item.&lt;br /&gt;
* '''defaultdisplay''' - (id) The id of a groupdef to display inside displaytarget if no objdir items are selected.&lt;br /&gt;
When items in the objdirview are selected, the objdir is sent an event telling it that an item was selected.  The target parameter from XML is included in the data sent in that event.   However, the implemented functionality for that event is wholly at the discretion of the programmer implementing the specific objdir in question.  For the QueryDir object used in Winamp3's media library, the target param is for a nearby queryline object to be told the selection is changing.  Your mileage may vary with other objects.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;Wasabi:PathPicker/&amp;gt;==&lt;br /&gt;
The Wasabi:PathPicker object is a simple object to display a text string of a directory path chosen by the user.  When the user clicks on the object, a dir selection service is started, allowing the user to choose a directory path.  Attach this object to a string configuration attribute and you have a simple way for users to choose directories as preferences.  The Wasabi:PathPicker object has no unique parameters.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;querydrag/&amp;gt;==&lt;br /&gt;
The querydrag object is used to create a visual &amp;quot;drag source&amp;quot; for a nearby queryresults object.  The user may click and drag this object and by doing so representationally drag the text of the current query in the queryresults object (which can be dropped into a playlist editor to fill its contents with the results of that query).  It has only two parameters:&lt;br /&gt;
* '''image''' - (id) The bitmap element to display.&lt;br /&gt;
* '''source''' - (id) The source queryresults object.  Default is the nearest.&lt;br /&gt;
If no valid source can be found, this object silently fails to drag.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;queryline/&amp;gt;==&lt;br /&gt;
The invisible queryline object is used to host a text query to be applied to a queryresults object.  One possible use would be to write a script linking the text in a Wasabi:HistoryEditBox to the query parameter of a queryline.  And, speaking of its parameters, here they are:&lt;br /&gt;
* '''querylist''' - (id) The id of the queryresults which will take the query.  Default is to not connect (ie: this param is kinda sorta mandatoryish if you want anything interesting to happen).&lt;br /&gt;
* '''query''' - (str) The string of the query itself.&lt;br /&gt;
* '''auto''' - (bool) Whether or not to execute an autoquery based on the query parameter (ie: &amp;quot;search on the name column for this substring&amp;quot; instead of &amp;quot;run this query&amp;quot;).  Default is to use the string directly as a query (not autoquery).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;queryresults/&amp;gt;==&lt;br /&gt;
The queryresults object is the an invisible binding object that coordinates the filtration of the database by numerous multiple other objects.  The queryline and filterlist objects eventually define a single output from the database, and this information is kept in the queryresults object.  It has only one parameter:&lt;br /&gt;
title - (str) The human readable title for your queryresults.  I have no idea why this would be important.&lt;br /&gt;
Magically, it seems, placing a queryresults object in the same group next to a PlaylistEditor object makes that PlaylistEditor get filled with the queryresults information.  I have no idea how this can be, and sense the telltale signs of powerful dark necromancy at work, here.&lt;/div&gt;</summary>
		<author><name>Pjn123</name></author>	</entry>

	<entry>
		<id>http://wiki.winamp.com/wiki/XML_Containing_objects</id>
		<title>XML Containing objects</title>
		<link rel="alternate" type="text/html" href="http://wiki.winamp.com/wiki/XML_Containing_objects"/>
				<updated>2008-09-26T10:26:34Z</updated>
		
		<summary type="html">&lt;p&gt;Pjn123: New page: == Description == These are the objects, that contain other objects.   ==&amp;lt;WasabiXML&amp;gt;&amp;lt;/WasabiXML&amp;gt;== This object contains the whole skin. * '''version''' - (int) The version of the Freeform ...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Description ==&lt;br /&gt;
These are the objects, that contain other objects.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;WasabiXML&amp;gt;&amp;lt;/WasabiXML&amp;gt;==&lt;br /&gt;
This object contains the whole skin.&lt;br /&gt;
* '''version''' - (int) The version of the Freeform Plugin Core the skin is made for. If the Plugin version is less than written, the warning &amp;quot;The skin is too new&amp;quot; will appear. Othervise, the Plugin will read the code according to this value, using backward compability.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;container&amp;gt;&amp;lt;/container&amp;gt;==&lt;br /&gt;
* '''id''' - (id) The coder-oriented name of the container.  This value is used when appealing to this object.&lt;br /&gt;
* '''name''' - (str) The human-oriented name of the container, or the &amp;quot;title&amp;quot; of the &amp;quot;window.&amp;quot;  This value is used by some other GuiObjects, notably the Wasabi:TitleBar object, to be displayed in the system.  It does not display automatically.  The special string &amp;quot;:componenttitle&amp;quot; will query the contents of the container to find the first windowholder and replace the name assigned to this container with the name of the object held by the windowholder (if any).&lt;br /&gt;
* '''default_x''' - (int) The default x position in screen coordinates.&lt;br /&gt;
* '''default_y''' - (int) The default y position in screen coordinates.&lt;br /&gt;
* '''default_w''' - (int) The default width in scalable units (1 == 1 pixel, if scale==100%)&lt;br /&gt;
* '''default_h''' - (int) The default height in scalable units (1 == 1 pixel, if scale==100%)&lt;br /&gt;
* '''default_visible''' - (bool) If true, show this container the first time the skin is ever shown (the system will track this value for the user, thereafter).&lt;br /&gt;
* '''component''' - (str) If this parameter is set with a guid or groupid, it indicates to the system that inside this component there lives a wndholder object with the same parameter.&lt;br /&gt;
* '''dynamic''' - (bool) If true, this means that when the skin is parsed, the container is not created.  &amp;quot;Dynamic&amp;quot; containers are meant to be instantiated at runtime by the coder and act as a template to hold any type of content within them.  Winamp3 uses dynamic containers to, for instance, provide outer frames for component windows, message boxes, etc.  A dynamic container is instantiated when the coder requests it to be, and deleted when the layout is closed.  If false (ie: not dynamic), this container will always be instantiated in the system at runtime, and the coder may only &amp;quot;hide&amp;quot; and &amp;quot;show&amp;quot; it.&lt;br /&gt;
* '''primaryComponent''' - (String) Defines the primary comonent that should be hold in this container. Useful for SUI Skins in combination with primaryComponent=&amp;quot;guid:player&amp;quot; in order to recieve keyboard/mouse actions in our main window.&lt;br /&gt;
* '''canclose''' - (bool) Defines if the container can be closed (true) or not (false).&lt;br /&gt;
* '''nofocusapponclose''' - (bool) If this Container is closed the main application (Winamp) can be restored from minimized state (true) or not (false).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;layout&amp;gt;&amp;lt;/layout&amp;gt;==&lt;br /&gt;
* '''id''' - (id) The coder-oriented name of the layout.  This value is used when appealing to this object.&lt;br /&gt;
* '''owner''' - (str) This parameter has the special syntax of &amp;quot;componentid;layoutid&amp;quot; and will cause the OS window this layout represents to always match the current visible state (minimized, restored, etc) of the owning layout.&lt;br /&gt;
* '''lockto''' - (str) This parameter has the same syntax as owner, but causes the relative positioning of this window to be locked to the position of the owning layout.  If it moves, the owned layout moves along with it.&lt;br /&gt;
* '''alpha''' - (int) This 0-255 integer parameter represents the flat alpha to be applied to the entirety of the layout.&lt;br /&gt;
* '''desktopalpha''' - (bool) If true, this flag indicates to Wasabi that this layout would like to be drawn with desktop alpha, if that feature is enabled in the system.&lt;br /&gt;
* '''indesktop''' - (bool) If true, causes the OS window to be a child of the desktop (under all other OS windows). &lt;br /&gt;
* '''linkwidth''' - (str) This string parameter should be the layoutid of a sibling to this layout inside its container.  Any changes to the width of this layout will be applied to the linked layout.  One use is for a &amp;quot;windowshade&amp;quot; mode that automatically matches width to the &amp;quot;normal&amp;quot; layout. &lt;br /&gt;
* '''linkheight''' - (str) Same as linkwidth, but for height.  Will allow you to make &amp;quot;vertical&amp;quot; windowshades, should you so desire.&lt;br /&gt;
* '''taskbar''' - (bool) This flag causes the layout to have its own taskbar button. (NOT YET IMPLEMENTED!)&lt;br /&gt;
* '''move''' - (bool) Can be set to &amp;quot;0&amp;quot; to disable user moving. Useful for maximized mode.&lt;br /&gt;
* '''resizable''' - (bool) Can be set to &amp;quot;0&amp;quot; to disable user resizing&lt;br /&gt;
* '''scalable''' - (bool) Can be set to &amp;quot;0&amp;quot; to disable user scaling (experimental)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;groupdef&amp;gt;&amp;lt;/groupdef&amp;gt;==&lt;br /&gt;
Groups are the workhorse of user interface design in Wasabi.  Groups allow one to define and place in coordinate space a logical collection of GuiObjects that will live within a given rectangle (the boundary of the Group).  They are the display-cases in which one keeps one's interface items tidily available to the user. The XML params specific to all groupdefs are:&lt;br /&gt;
 &lt;br /&gt;
* '''background''' - (str) The id of a bitmap element to be stretched as the background of the group (all of the group contents draw on top of this bitmap)&lt;br /&gt;
* '''drawbackground''' - (bool) Whether or not to actually draw the background pixels (useful for using the alpha channel of a background bitmap as the drawing region for the group).&lt;br /&gt;
* '''default_w''' - (int) The default width for this group, if the group instantiation does not specify what the width should be.&lt;br /&gt;
* '''default_h''' - (int) The default height for this group, if the group instantiation does not specify what the height should be.&lt;br /&gt;
* '''maximum_w''' - (int) The maximum width for this group, beyond which Wasabi will not allow the group to be resized.&lt;br /&gt;
* '''maximum_h''' - (int) The maximum height for this group, beyond which Wasabi will not allow the group to be resized.&lt;br /&gt;
* '''minimum_w''' - (int) The minimum width for this group, beyond which Wasabi will not allow the group to be resized.&lt;br /&gt;
* '''minimum_h''' - (int) The minimum height for this group, beyond which Wasabi will not allow the group to be resized.&lt;br /&gt;
* '''propagatesize''' - (bool) Sends this group's default/minimum/maximum size parameters to the layout which contains the group.  ie: if my minimum_h is 200 and my containing layout's minimum_h is 100 and I have my propagatesize flag set, my layout will now have a * '''minimum_h''' of 200, etc.&lt;br /&gt;
* '''lockminmax''' - (bool) Locks the minimum and maximum size values to the default size value.  Makes the group &amp;quot;nonresizable.&amp;quot;&lt;br /&gt;
* '''design_w''' - (int) The &amp;quot;design width&amp;quot; of this group.  The &amp;quot;design&amp;quot; based sizes allow for a conditional layout of GuiObjects within them.  These parameters are used in conjunction with the x1/x2/y1/y2/anchor coordinate system, which will be documented with GuiObjects.&lt;br /&gt;
* '''design_h''' - (int) The &amp;quot;design height&amp;quot; of this group.&lt;br /&gt;
* '''name''' - (str) A human readable string which will be the &amp;quot;Name&amp;quot; of this group, used by various objects in the system when referring the user to this groupdef.  For instance, the TabSheet GuiObject contains one group for each displayed tab, and the name parameter of each group is the string displayed within each corresponding tab. &lt;br /&gt;
* '''autowidthsource''' - (str) The id of an object contained within this group from which this group should set its width.  For instance, the groupdef that defines the contents of the Checkbox GuiObject sets its width based on the size of the text object within it, which itself will be sized at instantiation depending upon the text placed within that particular text object (See: $/studio/studio/Wacs/wasabi.system/ui/guiobjects/xml/checkbox/checkbox.xml).&lt;br /&gt;
* '''autoheightsource''' - (str) The id of an object contained within the group from which this group should set its height.  &lt;br /&gt;
* '''register_autopopup''' - (bool) This flag causes this group to be listed in the Windows submenu of the Wasabi MainMenu context menu.  Its name parameter is displayed as the menu item.  If that menu item is then selected, this group will be launched as a layout (in other words, in its own window).  This is quite useful for the quick debugging of groupdef objects.&lt;br /&gt;
* '''windowtype''' - (str)  Specifying a groupdef as being a certain windowtype causes the group to automatically be instantiated and added to the collection specified by that windowtype.  See below for more information and a list of what windowtypes currently exist in the system.  &lt;br /&gt;
* '''inherit_content''' - (bool)  This parameter is used to be able to override the contents of a group already defined in the system.  To go back to the &amp;quot;blueprints&amp;quot; analogy, this is like finding someone's original blueprints and editing them.  The id of this groupdef should match the id of the other groupdef that you wish to modify.  See below for examples and more information.&lt;br /&gt;
* '''inherit_group''' - (str)  This parameter is used to be able to copy the contents of a group already defined in the system as the starting point for one's own group definition.  To go back to the &amp;quot;blueprints&amp;quot; analogy, this is like photocopying someone else's blueprints as a starting point for one's own.  The param is the id of the other groupdef you wish to inherit.&lt;br /&gt;
* '''inherit_params''' - (bool) Specifies whether or not to inherit the params of the inherited group as well as its content.  Only meaningful with a valid inherit_group param or if overriding a previous groupdef.&lt;br /&gt;
* '''xuitag''' - (str)  Specifies that this group definition will create a new Xui object into the system with the given tag string.  See Extending Wasabi: Creating XuiObjects for more information.&lt;br /&gt;
* '''embed_xui''' - (str)  Specifies the id of a contained object to which any XML parameters not valid for a group sent to the instantiation of the group (or the xuitag string) should be forwarded.  See Extending Wasabi: Creating XuiObjects for more information.&lt;br /&gt;
In addition to these parameters, all parameters that apply to a GuiObject may also be placed on a groupdef.  This sets them up as default parameters for when the group is used in a group tag, which the skinner may of course override.&lt;br /&gt;
&lt;br /&gt;
Please note, as referenced earlier, the layout object is simply a special type of groupdef object, so all of these parameters also apply to it as well.&lt;br /&gt;
&lt;br /&gt;
Groups are inherently reusable objects, as well.  In a process that object oriented programmers should be well familiar with, Groups are first Defined to contain their particular contents and then can be later Instantiated (multiple times, if so desired) within a user interface.&lt;br /&gt;
 &lt;br /&gt;
For the non-programmers among our readers, consider the following analogy:  Definition consists of making a set of instructions for how to create something, like the blueprints for a house.  Instantiation is the process of creating that something based upon its definition: in this case, giving the blueprints to a General Contractor and waiting the requisite indeterminate number of weeks to have them build that house to your specification.  Definition makes a concept.  Instantiation converts it into a thing.&lt;br /&gt;
 &lt;br /&gt;
Now imagine the vast expanse of cookie-cutter housing tracts that have proliferated across American suburbia in the past decades.  In a single tract, only a small handful of different blueprints were Defined for building the hundreds of homes to be found, and each Instance of those designs has been personalized by its denizens (subject to the CC&amp;amp;R's for that neighborhood, of course).  &lt;br /&gt;
 &lt;br /&gt;
In the same way, you may define a Group to contain a specific set of objects with a specific set of parameters (your &amp;quot;instructions&amp;quot;), and then use (&amp;quot;instantiate&amp;quot;) that Group over and over again in your user interface with minor tweaks to each usage (&amp;quot;instance&amp;quot;).&lt;br /&gt;
 &lt;br /&gt;
The XML tag Wasabi uses for Group Definition is the groupdef tag, while the tag used for Group Instantiation is the group tag.  This section will deal specifically with the particularities of Group Definition and the parameters of the groupdef tag, while the group tag will be documented in its own section in the next chapter (along with everything else that is meant to live inside of a groupdef tag).  Because the simplest form of a groupdef is rather boring, we'll first cover the parameters for groupdefs and then return to creating sample XML snippets somewhat more complicated and useful than the following (which defines &amp;quot;my group&amp;quot; as merely an instantiation of the contents of &amp;quot;othergroup&amp;quot;)&lt;br /&gt;
 &amp;lt;groupdef id=&amp;quot;mygroup&amp;quot;&amp;gt;&lt;br /&gt;
 	&amp;lt;group id=&amp;quot;othergroup&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/groupdef&amp;gt;&lt;/div&gt;</summary>
		<author><name>Pjn123</name></author>	</entry>

	<entry>
		<id>http://wiki.winamp.com/wiki/XML_GUI_Objects</id>
		<title>XML GUI Objects</title>
		<link rel="alternate" type="text/html" href="http://wiki.winamp.com/wiki/XML_GUI_Objects"/>
				<updated>2008-09-26T10:19:56Z</updated>
		
		<summary type="html">&lt;p&gt;Pjn123: New page: ==GuiObject (Global params)== All the objects to be discussed in this chapter are GuiObjects.  This means, among other things, all such objects have the same basic set of parameters which ...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==GuiObject (Global params)==&lt;br /&gt;
All the objects to be discussed in this chapter are GuiObjects.  This means, among other things, all such objects have the same basic set of parameters which are valid for all of them.  All GuiObjects are objects that live with a set of spatial coordinates within a groupdef (or layout).  A button, a piece of text, a flat bitmap image, a tree of items, and an edit box would all be different kinds of GuiObjects, and all of the parameters listed here work on all of them.&lt;br /&gt;
* '''alpha''' - (int) An integer [0,255] specifying the alpha blend mode of the object (0 is transparent, 255 is opaque).  Default is 255.&lt;br /&gt;
* '''activealpha''' - (int) A different alpha value [0,255] for the object in its active state.&lt;br /&gt;
* '''inactivealpha''' - (int) A different alpha value [0,255] for the object in its inactive state (if you set both activealpha and inactivealpha, it is meaningless to set alpha).&lt;br /&gt;
* '''cursor''' - (id) The id of the cursor element to be displayed when the mouse is over this object. You can also use the system cursors. A list can be found here: '''[[Appendix: Cursors]]'''&lt;br /&gt;
* '''tooltip''' - (str) A human readable string to display as a tooltip for when the mouse is hovered over this object.&lt;br /&gt;
* '''move''' - (bool) Setting this flag causes any dragging of this object to actually drag the entire layout within which the object resides.&lt;br /&gt;
* '''renderbasetexture''' - (bool) A flag to tell the system to always use the system's base texture as the background of this object.&lt;br /&gt;
* '''cfgattrib''' - (str) A configattrib string assigned to this GuiObject. Here is a list of a few: '''[[Appendix: ConfigAttrib]]'''&lt;br /&gt;
* '''visible''' - (bool) Whether or not the object should be displayed in its group or layout.&lt;br /&gt;
* '''x''' - (int) The X position of the object in its group or layout.&lt;br /&gt;
* '''y''' - (int) The Y position of the object in its group or layout.&lt;br /&gt;
* '''w''' - (int) The width of the object in its group or layout.&lt;br /&gt;
* '''h''' - (int) The height of the object in its group or layout.&lt;br /&gt;
* '''relatx''' - (int) This [0,2] integer determines if the X position should be calculated by normal (&amp;quot;0&amp;quot;), relative (&amp;quot;1&amp;quot;) or proportional (&amp;quot;2&amp;quot;) units.  See below.&lt;br /&gt;
* '''relaty''' - (int) This [0,2] integer determines if the Y position should be calculated by normal (&amp;quot;0&amp;quot;), relative (&amp;quot;1&amp;quot;) or proportional (&amp;quot;2&amp;quot;) units.  See below.&lt;br /&gt;
* '''relatw''' - (int) This [0,2] integer determines if the width should be calculated by normal (&amp;quot;0&amp;quot;), relative (&amp;quot;1&amp;quot;) or proportional (&amp;quot;2&amp;quot;) units.  See below.&lt;br /&gt;
* '''relath''' - (int) This [0,2] integer determines if the height should be calculated by normal (&amp;quot;0&amp;quot;), relative (&amp;quot;1&amp;quot;) or proportional (&amp;quot;2&amp;quot;) units.  See below.&lt;br /&gt;
* '''fitparent''' - (bool) This parameter is used instead of x;y;w;h parameters and means that the object covers all the area of the parent object.&lt;br /&gt;
* '''x1''' - (int)  The X position of the left edge of the object in its group or layout.  Only works inside definitions with design_w parameters set.&lt;br /&gt;
* '''y1''' - (int) The Y position of the top edge of the object in its group or layout.  Only works inside definitions with design_h parameters set.&lt;br /&gt;
* '''x2''' - (int)  The X position of the right edge of the object in its group or layout.  Only works inside definitions with design_w parameters set.&lt;br /&gt;
* '''y2''' - (int) The Y position of the bottom edge of the object in its group or layout.  Only works inside definitions with design_h parameters set.&lt;br /&gt;
* '''anchor''' - (str) A list of one or more of the following keywords, delimited by the pipe (|) character: &amp;quot;top|bottom|left|right&amp;quot; these anchors work with x1/y1/x2/y2 positioning to fix the edge of the object its distance from the edges of the group or layout which contains it.&lt;br /&gt;
* '''sysmetricsx''' - (bool) This flag will cause this object to be resized by having its X position multiplied by the OS scalar coefficient.&lt;br /&gt;
* '''sysmetricsy''' - (bool) This flag will cause this object to be resized by having its Y position multiplied by the OS scalar coefficient. &lt;br /&gt;
* '''sysmetricsw''' - (bool) This flag will cause this object to be resized by having its width multiplied by the OS scalar coefficient.&lt;br /&gt;
* '''sysmetricsh''' - (bool) This flag will cause this object to be resized by having its height multiplied by the OS scalar coefficient.&lt;br /&gt;
* '''rectrgn''' - (bool) Setting this flag causes the engine to ignore the object's region for handling &amp;quot;mouse over object&amp;quot; detection and only use the bounding rectangle. &lt;br /&gt;
* '''regionop''' - (int) An integer enumeration [-2,1] for what kind of region-operation to perform with this object's calculated region against its parent's region.  See below for more information. &lt;br /&gt;
* '''sysregion''' - (int) Param alias for regionop.&lt;br /&gt;
* '''wantfocus''' - (bool) This flag determines whether or not an object ever gets the focus at all.&lt;br /&gt;
* '''focusonclick''' - (bool)  This flag determines whether or not an object gets the focus when clicked. &lt;br /&gt;
* '''taborder''' - (int) This value indicates the &amp;quot;tab order&amp;quot; of the object within the group or layout in which it resides.  When the user hits the tab key, the interface focus moves to the next greater object in tab order.  Objects with equal tab order will be ordered in the reverse of their insertion order in XML (last object in is first in default tab order). &lt;br /&gt;
* '''nodblclick''' - (bool) This flag blocks doubleclick events from being received by this object.&lt;br /&gt;
* '''noleftclick''' - (bool) This flag blocks left click events from being received by this object.&lt;br /&gt;
* '''norightclick''' - (bool) This flag blocks right click events from being received by this object.&lt;br /&gt;
* '''nomousemove''' - (bool) This flag blocks mouse move events from being received by this object.&lt;br /&gt;
* '''nocontextmenu''' - (bool) This flag blocks the main context menu from being displayed for rightclick.&lt;br /&gt;
* '''ghost''' - (bool) This flag causes the object to be transparent to all user interface events such that all the mouse messages pass to the object(s) visibly underneath it.&lt;br /&gt;
* '''notify'''(0-9) - (str) A string to be used as a parameter to the onNotify event for the object upon instantiation.  The notify strings 0-9 will be sent in order.&lt;br /&gt;
* '''droptarget''' - (id)  The id of an object to which all of this object's drag and drop events will be redirected.&lt;br /&gt;
&lt;br /&gt;
'''Appendixes:'''&lt;br /&gt;
&lt;br /&gt;
*[[Appendix: ConfigAttrib|ConfigAttrib]]&lt;br /&gt;
*[[Appendix: Cursors|Cursors]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;button/&amp;gt; &amp;amp; &amp;lt;togglebutton/&amp;gt;==&lt;br /&gt;
The button is a simple concept in Wasabi - you push it, it activates something.  It can either be used as a substrate for a script (ie: put a script and a button in the same groupdef, and you can handle complex button functionality with the script) or it can be used by itself to launch an action into the system when pressed.  You can implement your own action handlers in code, but some global actions predefined to be handled by the system are also available.&lt;br /&gt;
&lt;br /&gt;
* '''image''' - (id) The id of the bitmap element to display in its &amp;quot;normal&amp;quot; state. &lt;br /&gt;
* '''downimage''' - (id) The id of the bitmap element to display when the user is pressing down on the button.&lt;br /&gt;
* '''hoverimage''' - (id) The id of the bitmap element to display when the user is hovering the mouse over the button.&lt;br /&gt;
* '''activeimage''' - (id) The id of the bitmap element to display when the object is in its &amp;quot;active&amp;quot; state (usually only used by togglebutton, but available on the basic button object to allow the user to create extended functionality in script).&lt;br /&gt;
* '''text''' - (str) A string of text to be rendered on top of the button's currrent state image.  In this way, you can create a single button graphic and reuse it to create internationally localizable buttons.&lt;br /&gt;
* '''action''' - (str) The action to fire if the button is clicked (when it enters into its downstate).&lt;br /&gt;
* '''param''' - (str) The param to go with the action fired if the button is clicked.&lt;br /&gt;
* '''borders''' - (bool) Set this flag if you want to be a styled button.&lt;br /&gt;
* '''style''' - (str) Set the style value if you set the borders flag, to tell wasabi what type of button style you want.&lt;br /&gt;
** &amp;quot;button_normal&amp;quot; &amp;quot;osbutton_normal&amp;quot; &amp;quot;osbutton_close&amp;quot; &amp;quot;osbutton_minimize&amp;quot; and &amp;quot;osbutton_maximize&amp;quot;&lt;br /&gt;
* '''retcode''' - (int) Specifies the &amp;quot;modal return code&amp;quot; for the button.  Only valid with the &amp;quot;endmodal&amp;quot; system action.&lt;br /&gt;
* '''cbtarget''' - (id) The optional &amp;quot;component bucket target&amp;quot; for this button.  Only valid with &amp;quot;cb_next&amp;quot; or &amp;quot;cb_prev&amp;quot; system actions.  A componentbucket is another name for the thinger -- this allows you to have targetted button controls for more than one componentbucket in a user interface.&lt;br /&gt;
* '''action_target''' - (id) This will send the specified action only to the object whose id is listed here.  The param parameter is ignored in this case and this string is sent as the param data for the action.  Most objects don't understand being sent actions (this is an extended functionality), so this won't do anything in most cases.&lt;br /&gt;
* '''center_image''' - (bool) Setting this flag causes the image to be centered against the object rectangle.  This parameter is only important when both borders and an image are specified on a single object. &lt;br /&gt;
'''[[Appendix: Action List]]'''&lt;br /&gt;
&lt;br /&gt;
 Example:&lt;br /&gt;
 &amp;lt;button x=&amp;quot;50&amp;quot; y=&amp;quot;10&amp;quot; action=&amp;quot;VID_FS&amp;quot; image=&amp;quot;vis.fs.1&amp;quot; hoverImage=&amp;quot;vis.fs.2&amp;quot; downImage=&amp;quot;vis.fs.3&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;button x=&amp;quot;10&amp;quot; y=&amp;quot;40&amp;quot; w=&amp;quot;100&amp;quot; h=&amp;quot;20&amp;quot; borders=&amp;quot;1&amp;quot; style=&amp;quot;osbutton_normal&amp;quot; text=&amp;quot;Click Here&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;nstatesbutton/&amp;gt;==&lt;br /&gt;
The nstatesbutton is a specialized kind of togglebutton whose purpose is to cycle through a number of different visual states.  The parameters beyond togglebutton that it implements are:&lt;br /&gt;
* '''nstates''' - (int) The number of discrete states in which the object may exist.&lt;br /&gt;
* '''cfgvals''' - (str) A semicolon delimited list of values to represent custom config values for the multiple states.  Default is the current state number.  See below.&lt;br /&gt;
The nstatesbutton uses special handling of the image, downimage, hoverimage, and activeimage parameters expressed by the button object (from which this object is derived).  The nstatesbutton will actually append the state number to the four image parameter strings to calculate the bitmap ids to be loaded for the current object state.  Remember, like most everything else in a computer, this &amp;quot;current state value&amp;quot; counts from 0 and is therefore in the range [0, nstates-1].&lt;br /&gt;
 &lt;br /&gt;
If the object is bound to a configuration attribute, that attribute will be set with a cfgval every time the nstatesbutton transitions to a new state.  If the cfgvals parameter is not set, the attribute will simply be set with the current state value.  If the cfgvals parameter is set, it will parse the string and set the config attrib with the n'th substring corresponding to the current state value.&lt;br /&gt;
 &lt;br /&gt;
The following snippet fully describes two nstatesbutton objects with three states each, one using full images for its visual display, one using themed Wasabi borders with three different state logos:&lt;br /&gt;
 &amp;lt;elements&amp;gt;&lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;nimg0&amp;quot;/&amp;gt; &lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;dimg0&amp;quot;/&amp;gt; &lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;himg0&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;nimg1&amp;quot;/&amp;gt; &lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;dimg1&amp;quot;/&amp;gt; &lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;himg1&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;nimg2&amp;quot;/&amp;gt; &lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;dimg2&amp;quot;/&amp;gt; &lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;himg2&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;logo0&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;logo1&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;logo2&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/elements&amp;gt;&lt;br /&gt;
 &amp;lt;groupdef id=&amp;quot;some.random.groupdef&amp;quot;&amp;gt;&lt;br /&gt;
 	&amp;lt;nstatesbutton id=&amp;quot;three.freeform.states&amp;quot;&lt;br /&gt;
 		nstates=&amp;quot;3&amp;quot; cfgvals=&amp;quot;one;two;three&amp;quot;&lt;br /&gt;
 		image=&amp;quot;nimg&amp;quot; downimage=&amp;quot;dimg&amp;quot; hoverimage=&amp;quot;himg&amp;quot;&lt;br /&gt;
 	/&amp;gt;&lt;br /&gt;
 	&amp;lt;nstatesbutton id=&amp;quot;three.themed.states&amp;quot;&lt;br /&gt;
 		nstates=&amp;quot;3&amp;quot; image=&amp;quot;logo&amp;quot; borders=&amp;quot;1&amp;quot; center_image=&amp;quot;1&amp;quot;&lt;br /&gt;
 	/&amp;gt;&lt;br /&gt;
 &amp;lt;/groupdef&amp;gt;&lt;br /&gt;
If the &amp;quot;three.freeform.states&amp;quot; nstatesbutton were assigned to a configattrib, that attribute would be filled with the values &amp;quot;one&amp;quot; &amp;quot;two&amp;quot; and &amp;quot;three&amp;quot; in order.  If the &amp;quot;three.themed.states&amp;quot; were instead assigned to a configattrib, it would be filled with the default values &amp;quot;0&amp;quot; &amp;quot;1&amp;quot; and &amp;quot;2&amp;quot; in order.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;images/&amp;gt;==&lt;br /&gt;
The images object is object that displays a certain image based on the position of a slider. This object is very similar to [[Animationlayer]] except that this animation's current frame will be determined by the position of a slider.  An example of implementation is the old Classic Winamp skins where the volume slider background changes colour from green to red depending on its position (0%-100%). This object is currently under development and not all sliders are supported. Currently only Volume and Panning(Balance) sliders can be used as sources.&lt;br /&gt;
&lt;br /&gt;
* '''images''' - (id) A bitmap element for the array of images that will be used.&lt;br /&gt;
* '''source''' - (id) Id of the slider that will determine the current animation frame.&lt;br /&gt;
* '''imagesspacing''' - (int) The hight of each animation frame in the bitmap element. This will determine the total number of frames, (300/15=20)&lt;br /&gt;
&lt;br /&gt;
 Example:&lt;br /&gt;
 &amp;lt;images source=&amp;quot;volume&amp;quot; x=&amp;quot;0&amp;quot; y=&amp;quot;0&amp;quot; w=&amp;quot;68&amp;quot; h=&amp;quot;13&amp;quot;&lt;br /&gt;
 images=&amp;quot;main.volpan.volume&amp;quot; imagesspacing=&amp;quot;15&amp;quot;/&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;images source=&amp;quot;balance&amp;quot; x=&amp;quot;73&amp;quot; y=&amp;quot;0&amp;quot; w=&amp;quot;38&amp;quot; h=&amp;quot;13&amp;quot;&lt;br /&gt;
 images=&amp;quot;main.volpan.balance&amp;quot; imagesspacing=&amp;quot;15&amp;quot;/&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
 &amp;lt;slider id=&amp;quot;Volume&amp;quot; action=&amp;quot;VOLUME&amp;quot; x=&amp;quot;1&amp;quot; y=&amp;quot;0&amp;quot; w=&amp;quot;68&amp;quot; h=&amp;quot;13&amp;quot;&lt;br /&gt;
 thumb=&amp;quot;main.volpan.thumb&amp;quot; downThumb=&amp;quot;main.volpan.thumb.pressed&amp;quot;/&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;slider id=&amp;quot;Pan&amp;quot; action=&amp;quot;PAN&amp;quot; x=&amp;quot;74&amp;quot; y=&amp;quot;0&amp;quot; w=&amp;quot;38&amp;quot; h=&amp;quot;13&amp;quot;&lt;br /&gt;
 thumb=&amp;quot;main.volpan.thumb&amp;quot; downThumb=&amp;quot;main.volpan.thumb.pressed&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;PlaylistDirectory/&amp;gt;==&lt;br /&gt;
The PlaylistDirectory object is simply a list with all the saved playlist from the media library. Please remember that this object is always on top of other objects, so you'll have to hide it via maki if you dont want it to be visible. This object was introduced in Winamp 5.5(skinversion 1.3)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;AlbumArt/&amp;gt;==&lt;br /&gt;
The AlbumArt object is a simple GuiObject that displays a picture of the album cover of the song thats playing in Winamp. Please note that if you want do something to this object in a maki script you'll have to define it as a guiobject and not as a layer.&lt;br /&gt;
* '''notfoundImage''' - (id) A bitmap element that used if Winamp cant find any cover for the song.&lt;br /&gt;
* '''align''' - (str) One of the following three possible strings: &amp;quot;left&amp;quot; &amp;quot;center&amp;quot; &amp;quot;right&amp;quot; -- Default is &amp;quot;left&amp;quot;.&lt;br /&gt;
* '''valign''' - (str) One of the following three possible strings: &amp;quot;top&amp;quot; &amp;quot;center&amp;quot; &amp;quot;bottom&amp;quot; -- Default is &amp;quot;top&amp;quot;.&lt;br /&gt;
* '''source''' - (str) Path+Filename of file that you want to display in this object.&lt;br /&gt;
* '''stretched''' - (bool) Stretch the albumart to the size of the object.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;grid/&amp;gt;==&lt;br /&gt;
The grid object is a very nice object for creating stretchable images that still look good on the edges.  It is a graphic, like a layer, but unlike layer it is created by applying nine different bitmaps, stretching five of them.  There are, as you might guess, nine parameters&lt;br /&gt;
&lt;br /&gt;
* '''topleft''' - (id) A bitmap element for the top left section of the grid.&lt;br /&gt;
* '''top''' - (id) A bitmap element for the top middle section of the grid.&lt;br /&gt;
* '''topright''' - (id) A bitmap element for the top right section of the grid.&lt;br /&gt;
* '''left''' - (id) A bitmap element for the middle left section of the grid.&lt;br /&gt;
* '''middle''' - (id) A bitmap element for the center section of the grid.&lt;br /&gt;
* '''right''' - (id) A bitmap element for the middle right section of the grid.&lt;br /&gt;
* '''bottomleft''' - (id) A bitmap element for the bottom left section of the grid.&lt;br /&gt;
* '''bottom''' - (id) A bitmap element for the bottom middle section of the grid.&lt;br /&gt;
* '''bottomright''' - (id) A bitmap element for the bottom right section of the grid. &lt;br /&gt;
&lt;br /&gt;
Essentially, the given rectangle of the grid is intersected with 2 horizontal and 2 vertical lines.  The topleft, topright, bottomleft, and bottomright bitmap elements will not be resized.  The top, left, middle, right, and bottom bitmap elements, however, will be stretched to make all fit the grid rectangle.  Using intelligently sized bitmap elements is fairly critical for this object.  If you're having trouble, try starting with all of your bitmap elements as equal-sized squares.&lt;br /&gt;
&lt;br /&gt;
 Example:&lt;br /&gt;
 &amp;lt;grid x=&amp;quot;70&amp;quot; y=&amp;quot;25&amp;quot; w=&amp;quot;-74&amp;quot; relatw=&amp;quot;1&amp;quot; h=&amp;quot;20&amp;quot; topleft=&amp;quot;main.text.left&amp;quot; top=&amp;quot;main.text.center&amp;quot; topright=&amp;quot;main.text.right&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;Winamp:Browser/&amp;gt;==&lt;br /&gt;
This is basically the browser you'll see in the Bento Winamp skin. You'll also need Winamp 5.54 (skinversion 1.34) for it to work.&lt;br /&gt;
&lt;br /&gt;
- '''home''' - (str) Url for the default homepage for the browser xui.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;browser/&amp;gt;==&lt;br /&gt;
The browser object embeds an external browser technology window (such as IE or Mozilla) into the user interface with which you can load and render HTML directly.&lt;br /&gt;
* '''url''' - (str) The url to be displayed.&lt;br /&gt;
* '''mainmb''' - (bool) Setting this flag makes this browser object the &amp;quot;main mini-browser&amp;quot; for the system.&lt;br /&gt;
* '''targetname''' - (str) This allows this browser object to be set as a specific HTML target.&lt;br /&gt;
* '''scrollbars''' - (str) An enumerated string to determine how the system should handle the embedded browser's scrollbars.  See below.&lt;br /&gt;
Numerous interfaces in Wasabi refer to or control the &amp;quot;main&amp;quot; mini-browser.  Setting the mainmb flag will cause the last browser object which processed its mainmb param to be the main.  In other words, please don't set this flag on more than one object if you actually care which one is the main.&lt;br /&gt;
Scrollbars are important for big browser windows, but can interfere with the simple rendering of HTML content as part of a Wasabi UI.  To this end, the skinner can control how the scrollbars of the embedded browser are displayed by setting the scrollbars parameter to one of the following four string values: &amp;quot;auto&amp;quot; &amp;quot;never&amp;quot; &amp;quot;always&amp;quot; or &amp;quot;default&amp;quot; - default is to allow the HTML page to specify, all others override.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;Wasabi:Frame/&amp;gt;==&lt;br /&gt;
The Wasabi:Frame object is a themed control whose purpose is to provide a movable interface between two rectangular areas, much like the concept of an HTML frame.  Here are its parameters:&lt;br /&gt;
&lt;br /&gt;
* '''orientation''' - (str) One of the following four string values: &amp;quot;v&amp;quot; &amp;quot;vertical&amp;quot; &amp;quot;h&amp;quot; &amp;quot;horizontal&amp;quot; (Default is vertical).&lt;br /&gt;
* '''left''' - (id) The group to be instantiated in the left or top frame.&lt;br /&gt;
* '''right''' - (id) The group to be instantiated in the right or bottom frame.&lt;br /&gt;
* '''top''' - (id) The group to be instantiated in the left or top frame.&lt;br /&gt;
* '''bottom''' - (id) The group to be instantiated in the right or bottom frame.&lt;br /&gt;
* '''from''' - (str) One of the following string values: &amp;quot;l&amp;quot; &amp;quot;left&amp;quot; &amp;quot;t&amp;quot; &amp;quot;top&amp;quot; or &amp;quot;r&amp;quot; &amp;quot;right&amp;quot; &amp;quot;b&amp;quot; &amp;quot;bottom&amp;quot; (Default is left).&lt;br /&gt;
* '''width''' - (int) How many pixels from the chosen edge to start.&lt;br /&gt;
* '''height''' - (int) How many pixels from the chosen edge to start.&lt;br /&gt;
* '''resizable''' - (bool) Set this flag to allow the user to change the position of the framedivider.  Default is to allow it to be resizable.&lt;br /&gt;
* '''maxwidth''' - (int) The maximum amount of pixels you are able to move the poppler if resizable.&lt;br /&gt;
* '''minwidth''' - (int) The minimum amount of pixels you are able to move the poppler if resizable (If you go below this value the poppler will snap to 0).&lt;br /&gt;
* '''vgrabber''' - (string) The centered bitmap of the Grabber.&lt;br /&gt;
* '''vbitmap''' - (string) The stretched bitmap of the Grabber.&lt;br /&gt;
&lt;br /&gt;
In the following simple example, the &amp;quot;top&amp;quot; and &amp;quot;bottom&amp;quot; groups are displayed in a resizable frame object:&lt;br /&gt;
 &amp;lt;groupdef id=&amp;quot;top&amp;quot;&amp;gt;&lt;br /&gt;
 	&amp;lt;text text=&amp;quot;Top&amp;quot; align=&amp;quot;center&amp;quot; x=&amp;quot;0&amp;quot; y=&amp;quot;0&amp;quot; w=&amp;quot;0&amp;quot; h=&amp;quot;0&amp;quot; relatw=&amp;quot;1&amp;quot; relath=&amp;quot;1&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/groupdef&amp;gt;&lt;br /&gt;
 &amp;lt;groupdef id=&amp;quot;bottom&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;text text=&amp;quot;Bottom&amp;quot; align=&amp;quot;center&amp;quot; x=&amp;quot;0&amp;quot; y=&amp;quot;0&amp;quot; w=&amp;quot;0&amp;quot; h=&amp;quot;0&amp;quot; relatw=&amp;quot;1&amp;quot; relath=&amp;quot;1&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/groupdef&amp;gt;&lt;br /&gt;
 &amp;lt;groupdef id=&amp;quot;both&amp;quot;&amp;gt;&lt;br /&gt;
 	&amp;lt;Wasabi:Frame&lt;br /&gt;
 		orientation=&amp;quot;horizontal&amp;quot;&lt;br /&gt;
 		top=&amp;quot;top&amp;quot; bottom=&amp;quot;bottom&amp;quot;    &lt;br /&gt;
 		x=&amp;quot;0&amp;quot; y=&amp;quot;0&amp;quot; w=&amp;quot;0&amp;quot; h=&amp;quot;0&amp;quot;&lt;br /&gt;
 		relatw=&amp;quot;1&amp;quot; relath=&amp;quot;1&amp;quot;&lt;br /&gt;
 	/&amp;gt;&lt;br /&gt;
 &amp;lt;/groupdef&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;Wasabi:CheckBox/&amp;gt;==&lt;br /&gt;
The Wasabi:Checkbox object exists only as a namespaced object because it is expected to have only a single themed appearance.  The Wasabi:Checkbox object is used for both checkbox functionality and radiobutton functionality, depending up on the specification of its parameters.  It consists of a combination of a togglebutton and a text object to create a single functional user interface object.&lt;br /&gt;
* '''text''' - (str) The text to display as part of the checkbox.&lt;br /&gt;
* '''radioid''' - (id) If the button is to be used as part of a radio group, specify id of the parent Wasabi:RadioGroup object here.&lt;br /&gt;
* '''radioval''' - (int) If the button is to be used as part of a radio group, specify its unique integer value here.&lt;br /&gt;
* '''action''' - (str) see button.&lt;br /&gt;
* '''param''' - (str) see button.&lt;br /&gt;
* '''action_target''' - (id) see button.&lt;br /&gt;
As with togglebutton, this is a very useful object for binding to a configuration attribute. It is very popular in preferences interfaces. If the object has a value for radioval, that will be the value set into the attribute if the object is activated.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;Wasabi:DropDownList/&amp;gt;==&lt;br /&gt;
The Wasabi:DropDownList is a themed dialog object.  It may be statically filled via a parameter or dynamically through script or by binding it to a text feed from code.  A Wasabi:DropDownList object may be bound to an integer configuration attribute.&lt;br /&gt;
* '''items''' - (str) A semicolon delimited list of items to be displayed in the dropdown area.&lt;br /&gt;
* '''feed''' - (id) The id of a text feed to provide a semicolon delimited list of items to be displayed in the dropdown area.&lt;br /&gt;
* '''select''' - (int) Specifies an item to be selected.&lt;br /&gt;
* '''listheight''' - (int) Allows the skinner to specify the height of the dropdown area in pixels.&lt;br /&gt;
* '''maxitems''' - (int) Allows the skinner to specify the max height of the dropdown area in lines of text.  If the dropdown area has fewer lines of text than this value when this value is set, the dropdown area is sized to show no more than is needed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;Wasabi:ComboBox/&amp;gt;==&lt;br /&gt;
The Wasabi:ComboBox is a special type of object which combines dropdownlist functionality with an edit field as well.  It has the same parameters as Wasabi:DropDownList.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;Wasabi:HistoryEditBox/&amp;gt;==&lt;br /&gt;
The Wasabi:HistoryEditBox is an even more specialized version of this object family, its only purpose is to remember the last 64 items of text typed into it.  It has one extra parameter over Wasabi:DropDownList: &lt;br /&gt;
* '''navbuttons''' - (bool) Setting this flag will include the navigation buttons on the object.  Default is to have the buttons.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;componentbucket/&amp;gt;==&lt;br /&gt;
The componentbucket is a fancy name for the Thinger.  More precisely, in Winamp3, the &amp;quot;Thinger Window&amp;quot; is a window which implements a very simple horizontal componentbucket.  The object itself may be instantiated horizontally or vertically and the scrolling of the display within it should be controlled by button objects using &amp;quot;cb_next&amp;quot; and &amp;quot;cb_prev&amp;quot; action parameters and setting the cbtarget parameter to this object.  The object has the following parameters:&lt;br /&gt;
* '''leftmargin''' - (int) The number of extra pixels to pad the left (or top) edge of the total component bucket scrolling display.&lt;br /&gt;
* '''rightmargin''' - (int) The number of extra pixels to pad the right (or bottom) edge of the total component bucket scrolling display.&lt;br /&gt;
* '''spacing''' - (int) The number of extra pixels to place between each bucket icon.&lt;br /&gt;
* '''vertical''' - (bool) Whether or not the display should scroll vertically or horizontally.  Default is horizontal.&lt;br /&gt;
A simple &amp;quot;thinger group&amp;quot; follows:&lt;br /&gt;
 &amp;lt;groupdef id=&amp;quot;some.thinger.group.thing&amp;quot;&amp;gt;&lt;br /&gt;
 	&amp;lt;button id=&amp;quot;mythinger.up&amp;quot; x=&amp;quot;0&amp;quot; y=&amp;quot;0&amp;quot;&lt;br /&gt;
 		h=&amp;quot;20&amp;quot; w=&amp;quot;0&amp;quot; relatw=&amp;quot;1&amp;quot;&lt;br /&gt;
 		image=&amp;quot;mythinger.up.normal&amp;quot; &lt;br /&gt;
 		hoverimage=&amp;quot;mythinger.up.hover&amp;quot; &lt;br /&gt;
 		downimage=&amp;quot;mythinger.up.down&amp;quot;&lt;br /&gt;
 		action=&amp;quot;CB_PREV&amp;quot; cbtarget=&amp;quot;mythinger&amp;quot;&lt;br /&gt;
 	/&amp;gt;&lt;br /&gt;
 	&amp;lt;button id=&amp;quot;mythinger.down&amp;quot; x=&amp;quot;0&amp;quot; y=&amp;quot;-20&amp;quot;&lt;br /&gt;
 		h=&amp;quot;20&amp;quot; w=&amp;quot;0&amp;quot; relatw=&amp;quot;1&amp;quot; relaty=&amp;quot;1&amp;quot;&lt;br /&gt;
 		image=&amp;quot;mythinger.down.normal&amp;quot; &lt;br /&gt;
 		hoverimage=&amp;quot;mythinger.down.hover&amp;quot; &lt;br /&gt;
 		downimage=&amp;quot;mythinger.down.down&amp;quot;&lt;br /&gt;
 		action=&amp;quot;CB_NEXT&amp;quot; cbtarget=&amp;quot;mythinger&amp;quot;&lt;br /&gt;
 	/&amp;gt;&lt;br /&gt;
 	&amp;lt;componentbucket id=&amp;quot;mythinger&amp;quot; vertical=&amp;quot;1&amp;quot; x=&amp;quot;0&amp;quot; y=&amp;quot;20&amp;quot; w=&amp;quot;0&amp;quot; h=&amp;quot;-40&amp;quot; relath=&amp;quot;1&amp;quot;/&amp;gt; &lt;br /&gt;
 &amp;lt;/groupdef&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;customobject/&amp;gt;==&lt;br /&gt;
The customobject is a useful tool for temporarily instantiating a group into a user interface.  It has only one parameter:&lt;br /&gt;
groupid - (id) Instantiate the specified group into my defined area.&lt;br /&gt;
By finding your customobject in script and simply calling setXmlParam on it to give it new values for groupid, you can switch between the instantiation of multiple groups in a single user interface space.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;edit/&amp;gt; &amp;amp; &amp;lt;Wasabi:EditBox/&amp;gt;==&lt;br /&gt;
The edit control is, as you might guess, a text entry field. Some versions of Wasabi currently embed an OS edit control into the rectangular area defined by this object.  This embedded control will not blend properly with the rest of the skin's painting, it will always paint on top of everything else.  Keep this in mind when developing skins for widest compatibility.&lt;br /&gt;
* '''text''' - (str) Set the text in the edit field to this value.&lt;br /&gt;
* '''action''' - (str) Will accept the string &amp;quot;mb_url&amp;quot; to cause this edit box to automatically send its value as an url to the main minibrowser.&lt;br /&gt;
* '''multiline''' - (bool) Determines if the box is a single or multiple line input style.&lt;br /&gt;
* '''vscroll''' - (bool) Causes the edit window to have a vertical scroller.  Default is off.&lt;br /&gt;
* '''autohscroll''' - (bool) Causes the horizontal area to scroll if necessary.  Default is on.&lt;br /&gt;
* '''autoenter''' - (bool) Causes the system to automatically send a &amp;quot;done&amp;quot; event when the user stops typing past a certain timeout.  Default is off.&lt;br /&gt;
* '''password''' - (bool) Causes the echoed characters to be single marks for password purposes.  Default is off.&lt;br /&gt;
An edit object may be bound to a string configuration attribute.&lt;br /&gt;
 &lt;br /&gt;
Here's the definition of Wasabi:EditBox:&lt;br /&gt;
 &amp;lt;groupdef&lt;br /&gt;
 	id=&amp;quot;wasabi.edit&amp;quot; h=&amp;quot;20&amp;quot;&lt;br /&gt;
 	inherit_group=&amp;quot;wasabi.objectframe.group&amp;quot;&lt;br /&gt;
 	xuitag=&amp;quot;Wasabi:EditBox&amp;quot; embed_xui=&amp;quot;wasabi.edit.box&amp;quot;&lt;br /&gt;
 &amp;gt;&lt;br /&gt;
 	&amp;lt;edit id=&amp;quot;wasabi.edit.box&amp;quot; x=&amp;quot;1&amp;quot; y=&amp;quot;1&amp;quot; w=&amp;quot;-2&amp;quot; h=&amp;quot;-2&amp;quot; relatw=&amp;quot;1&amp;quot; relath=&amp;quot;1&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/groupdef&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;grid/&amp;gt;==&lt;br /&gt;
The grid object is a very nice object for creating stretchable images that still look good on the edges.  It is a graphic, like a layer, but unlike layer it is created by applying nine different bitmaps, stretching five of them.  There are, as you might guess, nine parameters&lt;br /&gt;
&lt;br /&gt;
* '''topleft''' - (id) A bitmap element for the top left section of the grid.&lt;br /&gt;
* '''top''' - (id) A bitmap element for the top middle section of the grid.&lt;br /&gt;
* '''topright''' - (id) A bitmap element for the top right section of the grid.&lt;br /&gt;
* '''left''' - (id) A bitmap element for the middle left section of the grid.&lt;br /&gt;
* '''middle''' - (id) A bitmap element for the center section of the grid.&lt;br /&gt;
* '''right''' - (id) A bitmap element for the middle right section of the grid.&lt;br /&gt;
* '''bottomleft''' - (id) A bitmap element for the bottom left section of the grid.&lt;br /&gt;
* '''bottom''' - (id) A bitmap element for the bottom middle section of the grid.&lt;br /&gt;
* '''bottomright''' - (id) A bitmap element for the bottom right section of the grid. &lt;br /&gt;
&lt;br /&gt;
Essentially, the given rectangle of the grid is intersected with 2 horizontal and 2 vertical lines.  The topleft, topright, bottomleft, and bottomright bitmap elements will not be resized.  The top, left, middle, right, and bottom bitmap elements, however, will be stretched to make all fit the grid rectangle.  Using intelligently sized bitmap elements is fairly critical for this object.  If you're having trouble, try starting with all of your bitmap elements as equal-sized squares.&lt;br /&gt;
&lt;br /&gt;
 Example:&lt;br /&gt;
 &amp;lt;grid x=&amp;quot;70&amp;quot; y=&amp;quot;25&amp;quot; w=&amp;quot;-74&amp;quot; relatw=&amp;quot;1&amp;quot; h=&amp;quot;20&amp;quot; topleft=&amp;quot;main.text.left&amp;quot; top=&amp;quot;main.text.center&amp;quot; topright=&amp;quot;main.text.right&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;group/&amp;gt;==&lt;br /&gt;
Groups are instantiated by using the group tag.  Groups, when instantiated within a layout or some other groupdef, take the standard GuiObject params in order to define the group's instantiated size and properties, and then all of the contents of the group will be instantiated within the space it defines.  At instantiation, a group will express a specified boundary rectangle and, thus, the positions of objects within it depending upon relative, proportional, or design coordinate systems may then be calculated.&lt;br /&gt;
 &lt;br /&gt;
To specify which groupdef to instantiate, set the id parameter of the group tag to the id of the desired groupdef.  The instantiation of each group can be so customized, however, group instantiates also may be assigned their own custom id to allow each instantiate to be found by code or script:&lt;br /&gt;
* '''id''' (id) - The groupdef to be instantiated.&lt;br /&gt;
* '''instance_id''' (str) - A new id value with which to be able find this particular instantiate.&lt;br /&gt;
&lt;br /&gt;
The following snippet will create two instantiates of the source group, with one specially customized (in the assumption that the &amp;quot;specialchild.maki&amp;quot; script will be handling the fact one is going to be special) :&lt;br /&gt;
 &amp;lt;groupdef id=&amp;quot;child&amp;quot;&amp;gt;&lt;br /&gt;
 	&amp;lt;layer image=&amp;quot;childimg&amp;quot; x=&amp;quot;0&amp;quot; y=&amp;quot;0&amp;quot; w=&amp;quot;0&amp;quot; h=&amp;quot;0&amp;quot; relatw=&amp;quot;0&amp;quot; relath=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/groupdef&amp;gt;&lt;br /&gt;
 &amp;lt;groupdef id=&amp;quot;parent&amp;quot;&amp;gt;&lt;br /&gt;
 	&amp;lt;group id=&amp;quot;child&amp;quot; x=&amp;quot;0&amp;quot; y=&amp;quot;0&amp;quot; w=&amp;quot;0&amp;quot; relatw=&amp;quot;0&amp;quot; h=&amp;quot;90&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;group id=&amp;quot;child&amp;quot; instance_id=&amp;quot;special&amp;quot;&lt;br /&gt;
 		notify=&amp;quot;This is a special notification for this obj.&amp;quot;&lt;br /&gt;
 		x=&amp;quot;0&amp;quot; y=&amp;quot;90&amp;quot; w=&amp;quot;0&amp;quot; relatw=&amp;quot;0&amp;quot; h=&amp;quot;-90&amp;quot; relath=&amp;quot;1&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;script file=&amp;quot;specialchild.maki&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/groupdef&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;grouplist/&amp;gt;==&lt;br /&gt;
A grouplist is, oddly enough, an object whose purpose is to accept and display a list of multiple groups.  For instance, Wasabi's popup menu is a grouplist.  A grouplist is expected to be filled in script, and it has no interesting parameters.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;layer/&amp;gt;==&lt;br /&gt;
In Wasabi, the layer is analogous to the same-named object in photoshop.  It is simply a nice bitmap graphic to be displayed in the user interface (with the standard alpha and region effects available to all guiobject derived objects, based by default on the properties of the bitmap element it houses).  Here are its parameters:&lt;br /&gt;
* '''image''' - (id) The id of the bitmap element to be used for display.&lt;br /&gt;
* '''inactiveimage''' - (id) A secondary id to be displayed if this guiobject is set to &amp;quot;inactive&amp;quot; status.&lt;br /&gt;
* '''region''' - (id) The id of a different bitmap element to use as the source of this object's region.&lt;br /&gt;
* '''tile''' - (bool) Setting this flag will tile the image if the rectangular size of the layer is different than the rectangular size of the bitmap.  The default is to stretch.&lt;br /&gt;
* '''resize''' - (str) A specific string enumerating which direction one should allow the resizing of the parent layout if this object's region is gripped and dragged by the user. Incompatible with the move parameter on guiobject.  See below.&lt;br /&gt;
* '''scale''' - (str) A specific string enumerating which direction one should allow the scaling of the parent layout if this object's region is gripped and dragged by the user.  Incompatible with the move parameter on guiobject.  See below.&lt;br /&gt;
* '''dblclickaction''' - (str) The string of an action to be sent into the system if this object is doubleclicked within its region.&lt;br /&gt;
The resize and scale parameters transform the simple layer graphic into interactive gui objects in the system by enabling them to be dragged by the user to resize or change the scale of the parent layout.  The eight possible values for these parameters are &amp;quot;top&amp;quot; &amp;quot;left&amp;quot; &amp;quot;right&amp;quot; &amp;quot;bottom&amp;quot; &amp;quot;topleft&amp;quot; &amp;quot;topright&amp;quot; &amp;quot;bottomleft&amp;quot; and &amp;quot;bottomright.&amp;quot;  If both resize and scale are set on a single layer, the object will act as a resizer by default but as a scaler if the ALT key is held down.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;animatedlayer/&amp;gt;==&lt;br /&gt;
An animatedlayer is a series of frames of sprite animation displayed in the GUI.  The frames of animation are specified in the bitmap element which is given in the image parameter to this object.  The animation is expected to be a specific progression of frames of a fixed size, also to be specified via parameters on the object.  Each frame of animation will have its own region.    The animatedlayer object inherits directly from the layer object, so all of the above parameters are valid, along with these specific to animation:&lt;br /&gt;
* '''frameheight''' - (int) The height in pixels of each cell of animation.  If frameheight is set, the animation will be assumed to be a vertical strip of cells in the given bitmap.&lt;br /&gt;
* '''framewidth''' - (int) The width in pixels of each cell of animation.  If framewidth is set, the animation will be assumed to be a horizontal strip of cells in the given bitmap.&lt;br /&gt;
* '''elementframes''' - (int) The number of total frames of animation.  If this value is set, the animation will be assumed to be comprised of multiple bitmap elements whose ids are resolved by using the value of the image parameter as a printf-compatible formatting string with a single integer parameter.  See below.&lt;br /&gt;
* '''start''' - (int) The frame index which should be used as the beginning frame of the animation.  Default is the first frame of the defined animation list.&lt;br /&gt;
* '''end''' - (int) The frame index which should be used as the terminating frame of the animation.  Default is the last frame of the defined animation list.&lt;br /&gt;
* '''speed''' - (int) The delay in ms between each frame, on average.  Default is 200 ms.&lt;br /&gt;
* '''realtime''' - (bool) Setting this flag will force-redraw the animation area the moment the new frame is meant to be seen.  Default behaviour is to wait for and go along with the other invalidations from the rest of the UI on the main thread's draw loop.  Expect use of this flag to have a high impact on system performance on slower machines.  In other words, don't use it unless you know what you're doing.&lt;br /&gt;
* '''autoreplay''' - (bool) Setting this flag will cause the animation to repeat to the beginning frame once it has displayed the terminating frame of animation.  Default is ON.&lt;br /&gt;
* '''autoplay''' - (bool)  Setting this flag will cause the animation to begin playing the moment it is loaded into the user interface.  Default is OFF.  See below.&lt;br /&gt;
* '''debug''' - (bool)  Setting this flag will cause the system to draw the current frame number of the animation on top of the animation graphics, for, as you might guess, debug purposes.&lt;br /&gt;
&lt;br /&gt;
You must note that animations are usually meant to be &amp;quot;triggered&amp;quot; through script, as too many live animations happily blitting their way through a deep and complex user interface using lots of alpha blending, et al, can cause significant performance bottlenecks on slow computers (especially if your users aren't expecting your application to be eating all of the machine resources).  With this in mind, if you just create an animated layer and drop it into a skin, it will not begin animating unless you set the autoplay parameter.&lt;br /&gt;
 &lt;br /&gt;
There are three different ways to present animation frames to this object.  The frames may either all be concatenated into a vertical or horizontal &amp;quot;filmstrip&amp;quot; style bitmap element -- in which case the height or width of each animation cell (respectively) should be set with the frameheight or framewidth parameter.  &lt;br /&gt;
The third way to give this object its animation frames is more complex and consists of loading multiple bitmap elements with each bitmap representing one frame of animation.  This is done by first setting the elementframes parameter with the number of frames to be loaded, then by using a special formatting string as the image parameter.  For those familiar with the printf function, when the elementframes parameter is set, that integer will be run in a for loop and the image name will be used as the formatting string to a printf function that takes only the current integer in the for loop as a parameter.&lt;br /&gt;
For those unfamiliar with printf, this will seem a bit confusing.  Somewhere in the string you pass to the image parameter, you should have the two characters %d, and these characters will be replaced by the character representation of the number as it loads bitmap elements.  If you want to have 0-loaded prefix characters (for instance &amp;quot;01-09&amp;quot; instead of &amp;quot;1-9&amp;quot;), you can place %02d into your image parameter, and if there aren't enough characters in the number to make up 2 full digits, the number will be left-padded with the zero character.  You can just as easily use any number of padding characters as well.  &lt;br /&gt;
I highly suspect this all still makes little sense, so let me give you a simplified example (missing important parameters) to show three different animated layers each loading three sets of differently named bitmaps:&lt;br /&gt;
 &amp;lt;elements&amp;gt;&lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;bmp1&amp;quot;/&amp;gt; &lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;bmp2&amp;quot;/&amp;gt; &lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;bmp3&amp;quot;/&amp;gt; &lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;bmp01img&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;bmp02img&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;bmp03img&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;b00001mp&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;b00002mp&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;b00003mp&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/elements&amp;gt;&lt;br /&gt;
 &amp;lt;groupdef id=&amp;quot;whatever&amp;quot;&amp;gt;&lt;br /&gt;
 	&amp;lt;animatedlayer image=&amp;quot;bmp%d&amp;quot; elementframes=&amp;quot;3&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;animatedlayer image=&amp;quot;bmp%02dimg&amp;quot; elementframes=&amp;quot;3&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;animatedlayer image=&amp;quot;b%05dmp&amp;quot; elementframes=&amp;quot;3&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/groupdef&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;layoutstatus/&amp;gt;==&lt;br /&gt;
The layoutstatus implements the small statusbar that can be found at the bottom of many of the default normal layouts which can contain status text, appcmds buttons, and a proportionally completed progress bar.  The two parameters to this object control what appcmds will be allowed in the status bar:&lt;br /&gt;
* '''exclude''' - (str) A semicolon delimited list of names of appcmds which should not be shown by this control.&lt;br /&gt;
* '''include_only''' - (str) A semicolon delimited list of names of appcmds which will be the only appcmds allowed to be shown by this control.&lt;br /&gt;
For the most part, these layoutstatus objects are only controllable from code.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;list/&amp;gt;==&lt;br /&gt;
The list object is similar but not identical to the Win32 list common control.  It is an  optionally multicolumnar list whose purpose is to display multiple pieces of information per horizontal row.  It may be filled directly by encoding the contents in the XML, by attaching the object to a proper text feed, or by calling methods on the object from script.  The parameters for this object are:&lt;br /&gt;
* '''items''' - (str) A properly delimited string of data used to fill the list.  See below.&lt;br /&gt;
* '''multiselect''' - (bool) This flag, when set, allows the user to select multiple items in the list.  Default is to allow multiselect.&lt;br /&gt;
* '''autodeselect''' - (bool) This flag, when set, causes selection of any single item in the list to automatically deselect all other items in the list.  Default is to not autodeselect.&lt;br /&gt;
* '''select''' - (str) The text of a list item to be selected.&lt;br /&gt;
* '''antialias''' - (bool) Setting this flag causes the text to be rendered antialiased if possible.&lt;br /&gt;
* '''feed''' - (id) The id of a text feed to be used to fill this list.&lt;br /&gt;
* '''hoverselect''' - (bool) This flag causes list items to be selected if the user hovers over them.  Default is to not hoverselect.&lt;br /&gt;
* '''sort''' - (bool) This flag causes the list to sort itself.  Default is to not sort.&lt;br /&gt;
* '''selectonupdown''' - (bool) This flag causes the list to interpret the keyboard commands to mean &amp;quot;change my selection to the item.&amp;quot;  Default is to select on keyboard events.&lt;br /&gt;
* '''numcolumns''' - (int) How many columns to show.  Default is one.&lt;br /&gt;
* '''columwidths''' - (int) A semicolon delimited list of integers specifying how to size the column widths in this list.  See below.&lt;br /&gt;
* '''columnlabels''' - (str) A semicolon delimited list of strings to be used as the multiple column labels.&lt;br /&gt;
The list object depends upon being fed numerous strings with proper syntax in order to properly generate and populate a complex list display.  The syntax for the items parameter (which is the same syntax as the feed must provide) is to delimit each full row in the list with the ';' semicolon character and to delimit each column entry per row with the ',' character.  The columnwidths and columnlabels also require a semicolon (';') delimited list of data, one entry per column.  Note that if -1 is given as a width, those columns will be of dynamic width and split up the leftover pixels among themselves.  The default is one column with no labels and a width of -1.&lt;br /&gt;
 &lt;br /&gt;
Here is a sample list object with 3 rows and 3 columns:&lt;br /&gt;
 &amp;lt;list id=&amp;quot;three.by.three&amp;quot;&lt;br /&gt;
 	items=&amp;quot;row1,text,1;row2,moretext,2;row3,stilltext,3&amp;quot;&lt;br /&gt;
 	numcolumns=&amp;quot;3&amp;quot; columnwidths=&amp;quot;50,-1,50&amp;quot;&lt;br /&gt;
 	multiselect=&amp;quot;0&amp;quot; autodeselect=&amp;quot;1&amp;quot;&lt;br /&gt;
 /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;mouseredir/&amp;gt;==&lt;br /&gt;
This object simply redirects all mouse events from its region to the target object specified in the parameter:&lt;br /&gt;
* '''target''' - (id) The target object to get mouse events.&lt;br /&gt;
This is useful for when some objects get overlapped by nonfunctional graphics when laying out complex interfaces.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;Wasabi:RadioGroup/&amp;gt;==&lt;br /&gt;
The Wasabi:RadioGroup object is an invisible object whose purpose is to centralize the functionality of multiple Wasabi:CheckBox objects instantiated in radiobutton mode.  The radioid params on the Wasabi:CheckBox instantiates should give the id of one of these Wasabi:RadioGroup objects.  It has no unique parameters.  Here is a snippet of simple radiobutton functionality:&lt;br /&gt;
 &amp;lt;Wasabi:RadioGroup id=&amp;quot;enableddisabled&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;Wasabi:CheckBox x=&amp;quot;50&amp;quot; y=&amp;quot;110&amp;quot; w=&amp;quot;60&amp;quot;&lt;br /&gt;
 	text=&amp;quot;Enabled&amp;quot; radioid=&amp;quot;enableddisabled&amp;quot;&lt;br /&gt;
 	cfgattrib=&amp;quot;{9149C445-3C30-4E04-8433-5A518ED0FDDE};Enable desktop alpha&amp;quot;&lt;br /&gt;
 	radioval=&amp;quot;1&amp;quot;&lt;br /&gt;
 /&amp;gt;&lt;br /&gt;
 &amp;lt;Wasabi:CheckBox x=&amp;quot;-125&amp;quot; y=&amp;quot;110&amp;quot; w=&amp;quot;62&amp;quot; relatx=&amp;quot;1&amp;quot;&lt;br /&gt;
 	text=&amp;quot;Disabled&amp;quot; radioid=&amp;quot;enableddisabled&amp;quot;&lt;br /&gt;
 	cfgattrib=&amp;quot;{9149C445-3C30-4E04-8433-5A518ED0FDDE};Enable desktop alpha&amp;quot;&lt;br /&gt;
 	radioval=&amp;quot;0&amp;quot;&lt;br /&gt;
 /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;rect/&amp;gt;==&lt;br /&gt;
A nice flat rectangle.  It may be either filled or hollow, and if hollow you may specify only some edges drawn.  Here are its parameters:&lt;br /&gt;
* '''color''' - (id) The id of a color element, or an comma delimited integer triplet RGB value.  Default is &amp;quot;255,00,255&amp;quot; (an ugly color to remind you to set it).&lt;br /&gt;
* '''filled''' - (bool) This flag causes the entire rectangular area to be filled with color.  Default is to not be filled.&lt;br /&gt;
* '''edges''' - (str) A pipe (&amp;quot;|&amp;quot;) delimited set of one or all of the following: &amp;quot;left&amp;quot; &amp;quot;right&amp;quot; &amp;quot;top&amp;quot; &amp;quot;bottom&amp;quot; Default is all, ie: &amp;quot;left|right|top|bottom&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;script/&amp;gt;==&lt;br /&gt;
Scripts allow for the simple creation of UI functionality without requiring C++ code.  While scripts are &amp;quot;compiled&amp;quot; into &amp;quot;script binaries,&amp;quot; these script binaries are special to wasabi and, more importantly, can be run by any compatible Wasabi runtime on any OS to which Wasabi has a runtime.  Scripts are bound like GuiObjects into layout or groupdef sections using the script tag and have the ability to find and modify the nearby sibling and child objects once the UI has been fully instantiated.  Scripts have two important parameters:&lt;br /&gt;
* '''file''' - (str) The filename of the .maki file to load, relative to this xml file.&lt;br /&gt;
* '''param''' - (str) A string that will be available to the instance of the .maki file as an instance specific parameter.&lt;br /&gt;
Note that a single .maki file may be instantiated as a script object numerous times over, and each instantiation can have its own specific parameter data.  Judicious use of this feature can help minimize your reliance on hardcoded strings and limited flexibility in your scripting.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;slider/&amp;gt; &amp;amp; &amp;lt;Wasabi:HSlider/&amp;gt; &amp;amp; &amp;lt;Wasabi:VSlider/&amp;gt;==&lt;br /&gt;
The slider object consists of a background set of images, and a thumb.  The thumb is constrained to move in one dimension -- horizontally or vertically, depending upon its orientation.  The distance in pixels travelled by the thumb across its total distance is interpollated to produce a value between the low and high boundary integers which is assigned to any configuration attribute which may happen to be attached.  Here are the parameters for slider:&lt;br /&gt;
* '''barleft''' - (id) The bitmap element for the left or top position of the slider.&lt;br /&gt;
* '''barmiddle''' - (id) The bitmap element for the middle, stretched, position of the slider.&lt;br /&gt;
* '''barright''' - (id) The bitmap element for the right or bottom position of the slider.&lt;br /&gt;
* '''thumb''' - (id) The bitmap element for the slider thumb.&lt;br /&gt;
* '''downthumb''' - (id) The bitmap element for the slider thumb when held by the user.&lt;br /&gt;
* '''hoverthumb''' - (id) The bitmap element for the slider thumb when the user's mouse is above it.&lt;br /&gt;
* '''orientation''' - (str) Either &amp;quot;v&amp;quot; or &amp;quot;vertical&amp;quot; to make the slider vertical, otherwise it will be horizontal.&lt;br /&gt;
* '''low''' - (int) Set the low-value boundary.  Default is 0.&lt;br /&gt;
* '''high''' - (int) Set the high-value boundary.  Default is 255.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;snappoint/&amp;gt;==&lt;br /&gt;
The snappoint is an invisible point that will attract other snappoint objects with the same id in any other layout and make them want to dock, like little magnets.  These objects have only the following subset of guiobject XML parameters:&lt;br /&gt;
* '''id''' - (id) All snappoint objects with the same id will snap to each other.  Different ids ignore each other.&lt;br /&gt;
* '''x''' - (int) The x position of the snappoint, see: guiobject.&lt;br /&gt;
* '''y''' - (int) The y position of the snappoint, see: guiobject.&lt;br /&gt;
* '''relatx''' - (int) The horizontal coordinate space of the snappoint, see: guiobject.&lt;br /&gt;
* '''relaty''' - (int) The vertical coordinate space of the snappoint, see: guiobject.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;Wasabi:TabSheet/&amp;gt;==&lt;br /&gt;
The Wasabi:TabSheet object contains multiple group instances within it and allows the user to switch between the display of those groups by the ability to click on a list of tab buttons at the top of the rectangular area of the Wasabi:TabSheet.  The name parameter of each groupdef is displayed as the text in the tab which corresponds to it.  Here are the Wasabi:TabSheet parameters:&lt;br /&gt;
* '''windowtype''' - (str) A windowtype string which will instantiate one of every groupdef with the same windowtype and every window class registered with a window creation service to include this windowtype.&lt;br /&gt;
* '''children''' - (id) A semicolon delimited list of groupdef ids to also be instantiated as children of this tabsheet.&lt;br /&gt;
* '''type''' - (int) There are two different themed display styles for Wasabi:TabSheet.  One is with multiple tabs (sheet style), one is with a single button on top that will popup a menu with all the possible tab choices (sidecar style).  The Default is sheet style, which is a value of -2.  Any other value besides -2 will give you sidecar style.&lt;br /&gt;
* '''content_margin_top''' - (int) A margin in pixels to offset the content from the client rectangle of the Wasabi:Tabsheet.&lt;br /&gt;
* '''content_margin_left''' - (int) A margin in pixels to offset the content from the client rectangle of the Wasabi:Tabsheet.&lt;br /&gt;
* '''content_margin_right''' - (int) A margin in pixels to offset the content from the client rectangle of the Wasabi:Tabsheet.&lt;br /&gt;
* '''content_margin_bottom''' - (int) A margin in pixels to offset the content from the client rectangle of the Wasabi:Tabsheet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;text/&amp;gt; &amp;amp; &amp;lt;Wasabi:Text/&amp;gt;==&lt;br /&gt;
The text object is for using the system to render some text in the font of your choice.&lt;br /&gt;
Since Winamp 5.5 (skinversion 1.3) text objects can have multiple lines. For a new line use this &amp;quot;/n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* '''display''' - (str) Either a specific system display string or the string identifier of a text feed.  Setting this value will override the text parameter.  See below.&lt;br /&gt;
* '''ticker''' - (bool) Setting this flag causes the object to scroll left and right if the text does not fit the rectangular area of the text object.&lt;br /&gt;
* '''antialias''' - (bool) Setting this flag causes the text to be rendered antialiased if possible.&lt;br /&gt;
* '''text''' - (str) A static string to be displayed.&lt;br /&gt;
* '''default''' - (str) A parameter alias for text.&lt;br /&gt;
* '''font''' - (id) The id of a bitmapfont or truetypefont element.  If no element with that id can be found, the OS will be asked for a font with that name instead.&lt;br /&gt;
* '''fontsize''' - (int) The size to render the chosen font.&lt;br /&gt;
* '''align''' - (str) One of the following three possible strings: &amp;quot;left&amp;quot; &amp;quot;center&amp;quot; &amp;quot;right&amp;quot; -- Default is &amp;quot;left.&amp;quot;&lt;br /&gt;
* '''valign''' - (str) One of the following three possible strings: &amp;quot;top&amp;quot; &amp;quot;center&amp;quot; &amp;quot;bottom&amp;quot; -- Default is &amp;quot;top.&amp;quot;&lt;br /&gt;
* '''color''' - (int) The comma delimited RGB color of the text.&lt;br /&gt;
* '''shadowcolor''' - (int) The comma delimited RGB color for underrendered shadow text.&lt;br /&gt;
* '''shadowx''' - (int) The x offset of the shadowrender.&lt;br /&gt;
* '''shadowy''' - (int) The y offset of the shadowrender.&lt;br /&gt;
* '''timeroffstyle''' - (int) How to display an empty timer: &amp;quot;0&amp;quot; = &amp;quot;  :  &amp;quot;, &amp;quot;1&amp;quot; = &amp;quot;00:00&amp;quot;, and &amp;quot;2&amp;quot;=&amp;quot;&amp;quot; (if one is displaying time)&lt;br /&gt;
* '''timecolonwidth''' - (int) How many extra pixels wider or smaller should the colon be when displaying time.  Default is -1.&lt;br /&gt;
* '''nograb''' - (bool) Setting this flag will cause the text object to ignore left button down messages.  Default is off.&lt;br /&gt;
* '''showlen''' - (bool) Setting this flag will cause the text display to be appended with the length in minutes and seconds of the current song.  Default is off.&lt;br /&gt;
* '''forcefixed''' - (bool) Force the system to attempt to render the display string with fixed-width font spacing.&lt;br /&gt;
* '''forceupcase''' - (bool) Force the system to make the display string all uppercase before display.&lt;br /&gt;
* '''forceuppercase''' - (bool) Force the system to make the display string all uppercase before display.&lt;br /&gt;
* '''forcelocase''' - (bool) Force the system to make the display string all lowercase before display.&lt;br /&gt;
* '''forcelowercase''' - (bool) Force the system to make the display string all lowercase before display.  &lt;br /&gt;
* '''bold''' - (bool) Render the display string in bold.&lt;br /&gt;
* '''wrap''' - (bool) Setting this flag will cause the text to wrap in its rectangular space.  Default is off.&lt;br /&gt;
* '''dblclickaction''' - (str) A string in the form &amp;quot;SWITCH;layout&amp;quot; where layout is the id of a layout in this object's parent container.  No other actions function on this object.  This action is deprecated.&lt;br /&gt;
* '''offsetx''' - (int) Extra pixels to be added to or subtracted from the calculated x value for the display string to render.&lt;br /&gt;
* '''offsety''' - (int) Extra pixels to be added to or subtracted from the calculated x value for the display string to render.&lt;br /&gt;
 &amp;quot;SONGNAME&amp;quot; 		- The name string of the currently playing song (from metadb).&lt;br /&gt;
 &amp;quot;SONGINFO&amp;quot; 		- The full info string of the currently playing song (from metadb).&lt;br /&gt;
 &amp;quot;SONGARTIST&amp;quot; 		- The artist string of the currently playing song (from metadb).&lt;br /&gt;
 &amp;quot;SONGTITLE&amp;quot; 		- The title string of the currently playing song (from metadb).&lt;br /&gt;
 &amp;quot;SONGALBUM&amp;quot; 		- The album string of the currently playing song (from metadb).&lt;br /&gt;
 &amp;quot;SONGLENGTH&amp;quot; 		- The length string of the currently playing song (from metadb).&lt;br /&gt;
 &amp;quot;TIME&amp;quot; 			- The length string of the currently playing song.&lt;br /&gt;
 &amp;quot;TIMEELAPSED&amp;quot; 		- The elapsed time string of the currently playing song.&lt;br /&gt;
 &amp;quot;TIMEREMAINING&amp;quot; 	- The time remaining string of the currently playing song.&lt;br /&gt;
 &amp;quot;COMPONENTBUCKET&amp;quot; 	- The id of the componentbucket (thinger) item the mousecursor is currently hovering above.&lt;br /&gt;
 &amp;quot;SONGBITRATE&amp;quot; 		- The bitrate string of the currently playing song (from metadb).&lt;br /&gt;
 &amp;quot;SONGSAMPLERATE&amp;quot; 	- The sample string of the currently playing song (from metadb).&lt;br /&gt;
 &lt;br /&gt;
 *** Broken Action (Winamp 5) ***&lt;br /&gt;
 &amp;quot;NORMALIZER:STATUS&amp;quot; 	- The current status of the audio normalizer.&lt;br /&gt;
&lt;br /&gt;
 Example:&lt;br /&gt;
 &amp;lt;text x=&amp;quot;81&amp;quot; y=&amp;quot;11&amp;quot; w=&amp;quot;25&amp;quot; h=&amp;quot;21&amp;quot; antialias=&amp;quot;0&amp;quot; text=&amp;quot;Read This&amp;quot; align=&amp;quot;center&amp;quot; color=&amp;quot;0,0,0&amp;quot; bold=&amp;quot;1&amp;quot;/&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;Wasabi:TitleBox/&amp;gt;==&lt;br /&gt;
The Wasabi:TitleBox object is a nice way to put a simple rectangular frame and title around your content groups.  It has the following parameters:&lt;br /&gt;
* '''title''' - (str) The string to display in the title area.  Default is to use the name parameter of the content group.&lt;br /&gt;
* '''content''' - (id) The id of the groupdef to instantiate as content.&lt;br /&gt;
* '''centered''' - (bool) Setting this flag will center the title text.  Default is to not be centered (and be left justified).&lt;br /&gt;
* '''suffix''' - (str) A string which will be appended to the title before it is displayed.  In this way, if you instantiate multiple groups as content, each name change can still have a string appended.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;Wasabi:Titlebar/&amp;gt;==&lt;br /&gt;
The Wasabi:TitleBar is the graphically themed bar that is placed at the top of all of the Wasabi:StandardFrame windows.  It has the same parameters as the text object, which control the text display of the titlebar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;tree/&amp;gt;==&lt;br /&gt;
The tree object displays a hierarchical set of information with multiple items, where each item may in turn have multiple subitems.  Let's examine its parameters:&lt;br /&gt;
* '''items''' - (str) A specially formatted string describing the hierarchical creation of the tree info.  See below.&lt;br /&gt;
* '''feed''' - (str) The string identifier of a text feed which should provide a string in the same format as the items parameter.&lt;br /&gt;
* '''sorted''' - (bool) Setting this flag will cause all of the tree items to be sorted before display.  Default is to sort.&lt;br /&gt;
* '''childtabs''' - (bool) Setting this flag will cause all tree items with children to display a tab graphic beside them.  Default is to show tab graphics.&lt;br /&gt;
* '''expandroot''' - (bool) Setting this flag will cause all root tree items to display with their children pre-expanded.  Default is to pre-expand root tree items.&lt;br /&gt;
The syntax required to describe the hierarchy of tree items is a semicolon delimited list of objects in the form &amp;quot;name(list)&amp;quot; where name is the string to display for that tree item and list is another semicolon delimited list of objects which are the direct children of name. &lt;br /&gt;
 &lt;br /&gt;
The following snippet will create a tree with one root node that has three child nodes, with each child node having differing numbers of sub nodes:&lt;br /&gt;
 &amp;lt;tree id=&amp;quot;example.tree&amp;quot;&lt;br /&gt;
 	x=&amp;quot;0&amp;quot; y=&amp;quot;0&amp;quot; w=&amp;quot;0&amp;quot; h=&amp;quot;0&amp;quot; relatw=&amp;quot;1&amp;quot; relath=&amp;quot;1&amp;quot;&lt;br /&gt;
 	items=&amp;quot;root(child1(sub1;sub2);child2;child3(sub3))&amp;quot;&lt;br /&gt;
 /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;vis/&amp;gt;==&lt;br /&gt;
The vis object is the multistate audio visualization display.  It has a multitude of parameters for how simple it is:&lt;br /&gt;
* '''colorallbands''' - (int) The comma delimited RGB triplet to color all the spectroscope bands.&lt;br /&gt;
* '''colorband1''' - (int) The comma delimited RGB triplet to color spectroscope band 1.&lt;br /&gt;
* '''colorband2''' - (int) The comma delimited RGB triplet to color spectroscope band 2.&lt;br /&gt;
* '''colorband3''' - (int) The comma delimited RGB triplet to color spectroscope band 3.&lt;br /&gt;
* '''colorband4''' - (int) The comma delimited RGB triplet to color spectroscope band 4.&lt;br /&gt;
* '''colorband5''' - (int) The comma delimited RGB triplet to color spectroscope band 5.&lt;br /&gt;
* '''colorband6''' - (int) The comma delimited RGB triplet to color spectroscope band 6.&lt;br /&gt;
* '''colorband7''' - (int) The comma delimited RGB triplet to color spectroscope band 7.&lt;br /&gt;
* '''colorband8''' - (int) The comma delimited RGB triplet to color spectroscope band 8.&lt;br /&gt;
* '''colorband9''' - (int) The comma delimited RGB triplet to color spectroscope band 9.&lt;br /&gt;
* '''colorband10''' - (int) The comma delimited RGB triplet to color spectroscope band 10.&lt;br /&gt;
* '''colorband11''' - (int) The comma delimited RGB triplet to color spectroscope band 11.&lt;br /&gt;
* '''colorband12''' - (int) The comma delimited RGB triplet to color spectroscope band 12.&lt;br /&gt;
* '''colorband13''' - (int) The comma delimited RGB triplet to color spectroscope band 13.&lt;br /&gt;
* '''colorband14''' - (int) The comma delimited RGB triplet to color spectroscope band 14.&lt;br /&gt;
* '''colorband15''' - (int) The comma delimited RGB triplet to color spectroscope band 15.&lt;br /&gt;
* '''colorband16''' - (int) The comma delimited RGB triplet to color spectroscope band 16.&lt;br /&gt;
* '''colorbandpeak''' - (int) The comma delimited RGB triplet to color the spectroscope peak line.&lt;br /&gt;
* '''colorallosc''' - (int) The comma delimited RGB triplet to color the whole oscilloscope.&lt;br /&gt;
* '''colorosc1''' - (int) The comma delimited RGB triplet to color oscilloscope section 1.&lt;br /&gt;
* '''colorosc2''' - (int) The comma delimited RGB triplet to color oscilloscope section 2.&lt;br /&gt;
* '''colorosc3''' - (int) The comma delimited RGB triplet to color oscilloscope section 3.&lt;br /&gt;
* '''colorosc4''' - (int) The comma delimited RGB triplet to color oscilloscope section 4.&lt;br /&gt;
* '''colorosc5''' - (int) The comma delimited RGB triplet to color oscilloscope section 5.&lt;br /&gt;
* '''channel''' - (int) One of three values for which channel to monitor: &amp;quot;1&amp;quot; is left channel, &amp;quot;2&amp;quot; is right channel, &amp;quot;3&amp;quot; is stereo.  Default is stereo.&lt;br /&gt;
* '''fliph''' - (bool) If this flag is set, it blits the vis pixels flipped horizontally.&lt;br /&gt;
* '''flipv''' - (bool) If this flag is set, it blits the vis pixels flipped vertically.&lt;br /&gt;
* '''mode''' - (int) One of three values for which mode to display: &amp;quot;0&amp;quot; is no display, &amp;quot;1&amp;quot; is spectroscope, &amp;quot;2&amp;quot; is oscilloscope.  Default is to read from a config item.&lt;br /&gt;
When the user clicks on the vis, it will cycle between its three modes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;eqvis/&amp;gt;==&lt;br /&gt;
The eqvis object is rather specific to media players, as it is the spline display for the eq settings in the Wasabi Media Player.&lt;br /&gt;
* '''colortop''' - (str) A color value or color element id for the top portion of the spline display.&lt;br /&gt;
* '''colormiddle''' - (str) A color value or color element id for the middle portion of the spline display.&lt;br /&gt;
* '''colorbottom''' - (str) A color value or color element id for the bottom portion of the spline display.&lt;br /&gt;
* '''colorpreamp''' - (str) A color value or color element id for the preamp bar in the spline display.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;gradient/&amp;gt;==&lt;br /&gt;
The gradient object creates a rectangular color gradient.  The available parameters are:&lt;br /&gt;
* '''gradient_x1''' - (float) A floating point value for the left side of the rectangle.  Default is 0.0&lt;br /&gt;
* '''gradient_y1''' - (float) A floating point value for the top side of the rectangle.  Default is 0.0&lt;br /&gt;
* '''gradient_x2''' - (float) A floating point value for the right side of the rectangle.  Default is 1.0&lt;br /&gt;
* '''gradient_x1''' - (float) A floating point value for the bottom side of the rectangle.  Default is 1.0&lt;br /&gt;
* '''points''' - (str) A complex string defining color values for at least two value points with which to build the gradients.  See below.&lt;br /&gt;
The points syntax is a semicolon delimited list of key=value pairs where the key is a floatingpoint number representing a point in the &amp;quot;gradient space&amp;quot; and the value is an RGB triplet (assumed full alpha) or RGBA quad.  For instance, the following object would create a smooth gradient between red in the top left and green at half alpha in the bottom right:&lt;br /&gt;
 	&amp;lt;gradient id=&amp;quot;red.to.green&amp;quot;&lt;br /&gt;
 		x=&amp;quot;0&amp;quot; y=&amp;quot;0&amp;quot; w=&amp;quot;0&amp;quot; h=&amp;quot;0&amp;quot; &lt;br /&gt;
 		relatw=&amp;quot;1&amp;quot; relath=&amp;quot;1&amp;quot;&lt;br /&gt;
 		points=&amp;quot;0.0=255,0,0,255;1.0=0,255,0,128&amp;quot;&lt;br /&gt;
 	/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;Wasabi:StandardFrame:Status/&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;Wasabi:StandardFrame:NoStatus/&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;Wasabi:StandardFrame:Modal/&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;Wasabi:StandardFrame:Static/&amp;gt;==&lt;br /&gt;
The Wasabi:StandardFrame objects are rectangular frames you can use to encapsulate your own layout contents within the currently themed standard frame.  They all have the following parameters:&lt;br /&gt;
* '''content''' - (id) The id of the groupdef to instantiate within the Wasabi:StandardFrame.&lt;br /&gt;
* '''padtitleleft''' - (int) The distance in pixels to pad the title to the left.&lt;br /&gt;
* '''padtitleright''' - (int) The distance in pixels to pad the title to the right.&lt;br /&gt;
* '''shade''' - (id) The id of the layout within our container we should switch to if the titlebar is doubleclicked (ie: the id of the windowshade layout).  Default is no functionality.&lt;br /&gt;
The Wasabi:StandardFrame:Status object has a status bar, while the Wasabi:StandardFrame:NoStatus does not.  The Wasabi:StandardFrame:Static object inherits from Wasabi:StandardFrame:NoStatus and also instantiates the wasabi panel graphics.  The Wasabi:StandardFrame:Modal object does all that and also removes the control menus to make a fully modal dialog frame.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;wndholder/&amp;gt;==&lt;br /&gt;
A wndholder object, similar to a customobject, holds user interface windows based upon what param is given.  The wndholder can also hold window types by guid or groupdef instantiations by id.  Here are its parameters:&lt;br /&gt;
* '''hold''' - (id) A semicolon delimited list of guids or groupdef ids to hold.&lt;br /&gt;
* '''component''' - (id) A parameter alias for hold.&lt;br /&gt;
* '''param''' - (id) A parameter alias for hold.&lt;br /&gt;
* '''noshowcmdbar''' - (bool) Setting this flag will disable the Wasabi command bar.&lt;br /&gt;
* '''noanimatedrects''' - (bool) Setting this flag will disable animated rectangle motion.&lt;br /&gt;
* '''disableanimatedrects''' - (bool) A parameter alias for noanimatedrects.&lt;br /&gt;
* '''autoopen''' - (bool) Setting this flag will cause the object to auto open.&lt;br /&gt;
* '''autoclose''' - (bool) Setting this flag will cause the object to auto close.&lt;br /&gt;
Using a wndholder object indicates to the system that you want to be the &amp;quot;container of record&amp;quot; for the possible requested guids when they are launched by the system through, for instance, the C++ coder registering his window class with registerAutopopup(), which calls the underlying api-&amp;gt;skinwnd_createByGuid().  The container within which this wndholder is instantiated should also be given a component parameter with the same values.  This component parameter is simply a hint to Wasabi that a wndholder object that will accept that component parameter lives within the container.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;objdirview/&amp;gt;==&lt;br /&gt;
The objdirview object displays a tree of hierarchical information to the user, based on a code concept called an Object Directory.  An Object Directory is, in essence, just a container of arbitrary items so this object is merely the display of its contents.  Here are its parameters:&lt;br /&gt;
* '''dir''' - (str) The string identifier of the objdir to which this object should connect.&lt;br /&gt;
* '''target''' - (id) The id of an object to which this object may direct the actions of its internal items being selected.&lt;br /&gt;
* '''displaytarget''' - (id) The id of a customobject which will be assigned to display the display group parameter of the currently selected objdir item.&lt;br /&gt;
* '''defaultdisplay''' - (id) The id of a groupdef to display inside displaytarget if no objdir items are selected.&lt;br /&gt;
When items in the objdirview are selected, the objdir is sent an event telling it that an item was selected.  The target parameter from XML is included in the data sent in that event.   However, the implemented functionality for that event is wholly at the discretion of the programmer implementing the specific objdir in question.  For the QueryDir object used in Winamp3's media library, the target param is for a nearby queryline object to be told the selection is changing.  Your mileage may vary with other objects.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;Wasabi:PathPicker/&amp;gt;==&lt;br /&gt;
The Wasabi:PathPicker object is a simple object to display a text string of a directory path chosen by the user.  When the user clicks on the object, a dir selection service is started, allowing the user to choose a directory path.  Attach this object to a string configuration attribute and you have a simple way for users to choose directories as preferences.  The Wasabi:PathPicker object has no unique parameters.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;querydrag/&amp;gt;==&lt;br /&gt;
The querydrag object is used to create a visual &amp;quot;drag source&amp;quot; for a nearby queryresults object.  The user may click and drag this object and by doing so representationally drag the text of the current query in the queryresults object (which can be dropped into a playlist editor to fill its contents with the results of that query).  It has only two parameters:&lt;br /&gt;
* '''image''' - (id) The bitmap element to display.&lt;br /&gt;
* '''source''' - (id) The source queryresults object.  Default is the nearest.&lt;br /&gt;
If no valid source can be found, this object silently fails to drag.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;queryline/&amp;gt;==&lt;br /&gt;
The invisible queryline object is used to host a text query to be applied to a queryresults object.  One possible use would be to write a script linking the text in a Wasabi:HistoryEditBox to the query parameter of a queryline.  And, speaking of its parameters, here they are:&lt;br /&gt;
* '''querylist''' - (id) The id of the queryresults which will take the query.  Default is to not connect (ie: this param is kinda sorta mandatoryish if you want anything interesting to happen).&lt;br /&gt;
* '''query''' - (str) The string of the query itself.&lt;br /&gt;
* '''auto''' - (bool) Whether or not to execute an autoquery based on the query parameter (ie: &amp;quot;search on the name column for this substring&amp;quot; instead of &amp;quot;run this query&amp;quot;).  Default is to use the string directly as a query (not autoquery).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;queryresults/&amp;gt;==&lt;br /&gt;
The queryresults object is the an invisible binding object that coordinates the filtration of the database by numerous multiple other objects.  The queryline and filterlist objects eventually define a single output from the database, and this information is kept in the queryresults object.  It has only one parameter:&lt;br /&gt;
title - (str) The human readable title for your queryresults.  I have no idea why this would be important.&lt;br /&gt;
Magically, it seems, placing a queryresults object in the same group next to a PlaylistEditor object makes that PlaylistEditor get filled with the queryresults information.  I have no idea how this can be, and sense the telltale signs of powerful dark necromancy at work, here.&lt;/div&gt;</summary>
		<author><name>Pjn123</name></author>	</entry>

	<entry>
		<id>http://wiki.winamp.com/wiki/XML_Elements</id>
		<title>XML Elements</title>
		<link rel="alternate" type="text/html" href="http://wiki.winamp.com/wiki/XML_Elements"/>
				<updated>2008-09-26T10:03:22Z</updated>
		
		<summary type="html">&lt;p&gt;Pjn123: New page: == What is Elements? == Elements are the sub-atomic particles of the chemistry of  Wasabi UI development.  They represent the binding of fonts, colors, and raster graphics to id's which ar...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== What is Elements? ==&lt;br /&gt;
Elements are the sub-atomic particles of the chemistry of  Wasabi UI development.  They represent the binding of fonts, colors, and raster graphics to id's which are then referenced by the actual objects of the system.  The definition of elements should occur hierarchically within an &amp;lt;elements&amp;gt; tag.  Because elements are intended to be referenced by GuiObjects, specifying elements without ids is a meaningless endeavour.  A simple sample of each possible type of element would look like this:&lt;br /&gt;
 &amp;lt;elements&amp;gt;&lt;br /&gt;
 	&amp;lt;color id=&amp;quot;myindigo&amp;quot; value=&amp;quot;64,32,128&amp;quot;/&amp;gt; &lt;br /&gt;
 	&amp;lt;bitmap id=&amp;quot;mybitmap&amp;quot; file=&amp;quot;mybitmap.png&amp;quot; x=&amp;quot;104&amp;quot; y=&amp;quot;0&amp;quot; h=&amp;quot;90&amp;quot; w=&amp;quot;244&amp;quot; gammagroup=&amp;quot;Backgrounds&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;bitmapfont id=&amp;quot;mybitfont&amp;quot; file=&amp;quot;myfont.png&amp;quot; charwidth=&amp;quot;9&amp;quot; charheight=&amp;quot;13&amp;quot; hspacing=&amp;quot;3&amp;quot; vspacing=&amp;quot;1&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;truetypefont id=&amp;quot;myttfont&amp;quot; file=&amp;quot;impact.ttf&amp;quot;/&amp;gt;&lt;br /&gt;
 	&amp;lt;elementalias id=&amp;quot;newelemid&amp;quot; target=&amp;quot;mybitmap&amp;quot;/&amp;gt;&lt;br /&gt;
 &amp;lt;/elements&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;bitmap/&amp;gt;==&lt;br /&gt;
The bitmap element defines a raster buffer of the given pixel size, sliced out of the given raster graphics file.  In general, we use the .png graphics format for our bitmap graphics, however Wasabi's &amp;quot;supported formats&amp;quot; are determined entirely at startup by the registration of image loader services (see Extending Wasabi: Image Loaders).  If the sizing values (x/y/h/w) are not specified, the bitmap defines a buffer equivalent to the entire graphics file.  Its specific parameters are:&lt;br /&gt;
* '''id''' - (string) A unique string, that is used to identify the element when used by the object.&lt;br /&gt;
* '''file''' - (string) A path to the bitmap file the image is in. If it begings with disk name (C:/.../filename) then the path is absolute, otherwise (folder1/.../filename) the path is relative to skin folder (don't confuse with [[XML Reference#&amp;lt;include/&amp;gt; |inclusion]] of xml files where path is relative to parent xml file)&lt;br /&gt;
* '''x''' - (int) A coordinate x of the image defined inside the bitmap file (x coordinate of the cropped area).&lt;br /&gt;
* '''y''' - (int) A coordinate y of the image defined inside the bitmap file (y coordinate of the cropped area).&lt;br /&gt;
* '''w''' - (int) Width of the image defined inside the bitmap file (width of the cropped area).&lt;br /&gt;
* '''h''' - (int) Height of the image defined inside the bitmap file (height of the cropped area).&lt;br /&gt;
* '''gammagroup''' - (id) The id of the gammagroup the bitmap will be changed by when using color themes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You can also use these internal bitmaps without declaring them:&lt;br /&gt;
* '''$wallpaper''' - This is the current background of Windows.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;layer x=&amp;quot;&amp;quot; y=&amp;quot;&amp;quot; image=&amp;quot;$wallpaper&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;bitmapfont/&amp;gt;==&lt;br /&gt;
The bitmapfont element specifies the information required to pull a fixed-width font set out of a raster graphic file.  Bitmap fonts always begin their series with ascii character '0' and can go for as many characters as you desire.  Any ascii characters not represented by a cell in the graphics file will display as blanks.  The required specific parameters are:&lt;br /&gt;
* '''id''' - (string) A unique string, that is used to identify the element when used by the object.&lt;br /&gt;
* '''file''' - (str) The name of the raster graphics file from which to load.&lt;br /&gt;
* '''charwidth''' - (int) The width of each glyph cell in pixels.&lt;br /&gt;
* '''charheight''' - (int) The height of each glyph cell in pixels.&lt;br /&gt;
* '''hspacing''' - (int) The extra overlap distance for each glyph cell, in pixels, on the horizontal axis.&lt;br /&gt;
* '''vspacing''' - (int) The extra overlap distance for each glyph cell, in pixels, on the vertical axis.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;truetypefont/&amp;gt;==&lt;br /&gt;
The truetypefont element specifies a TTF file to be registered with the system.  Note that most of the font-using GuiObjects in the system request Arial, which is not usually defined.  Any request for an undefined font name will default to the list of OS-installed fonts.  This allows a skin to define a truetypefont element with the id of &amp;quot;arial&amp;quot; which will automatically become the default for most objects displaying text.  The specific parameter for this element is:&lt;br /&gt;
* '''id''' - (string) A unique string, that is used to identify the element when used by the object.&lt;br /&gt;
* '''file''' - (str) The name of the true type font file to load.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;color/&amp;gt;==&lt;br /&gt;
* '''id''' - (string) A unique string, that is used to identify the element when used by the object.&lt;br /&gt;
* '''value''' - (string-&amp;quot;int,int,int&amp;quot;) A comma delimited list of 3 integers in the range 0-255 corresponding to the individual red, green, and blue elements that define a &amp;quot;truecolor&amp;quot; value.&lt;br /&gt;
* '''gammagroup''' - (str) The id of a gammagroup to which this element is assigned.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;elementalias/&amp;gt;==&lt;br /&gt;
The bitmapfont element specifies the information required to pull a fixed-width font set out of a raster graphic file.  Bitmap fonts always begin their series with ascii character '0' and can go for as many characters as you desire.  Any ascii characters not represented by a cell in the graphics file will display as blanks.  The required specific parameters are:&lt;br /&gt;
* '''id''' - (string) A unique string, that is used to identify the element when used by the object.&lt;br /&gt;
* '''target''' - (str) The id of the element to alias.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;cursor/&amp;gt;==&lt;br /&gt;
The cursor element specifies the information required to create your own cursor that you can use in your skin.&lt;br /&gt;
* '''bitmap''' - (str) Same as the file param for &amp;lt;bitmap/&amp;gt;&lt;br /&gt;
* '''hotspot_x''' - (int) The X position of the hotspot.&lt;br /&gt;
* '''hotspot_y''' - (int) The Y position of the hotspot.&lt;br /&gt;
 &amp;lt;cursor id=&amp;quot;cursor.h&amp;quot; bitmap=&amp;quot;pictures/cursor_h.png&amp;quot; hotspot_x=&amp;quot;10&amp;quot; hotspot_y=&amp;quot;4&amp;quot;/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Pjn123</name></author>	</entry>

	<entry>
		<id>http://wiki.winamp.com/wiki/XML_Reference</id>
		<title>XML Reference</title>
		<link rel="alternate" type="text/html" href="http://wiki.winamp.com/wiki/XML_Reference"/>
				<updated>2008-09-26T10:00:18Z</updated>
		
		<summary type="html">&lt;p&gt;Pjn123: XML Reference start page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The XML Reference is divided into the following sections:&lt;br /&gt;
&lt;br /&gt;
== '''[[XML Elements]]''' ==&lt;br /&gt;
Use this to define the pictures, colors &amp;amp; fonts you want to use in your skin.&lt;br /&gt;
&lt;br /&gt;
== '''[[XML GUI Objects]]''' ==&lt;br /&gt;
Here you'll find all of the GUI Objects that you can use in your skin.&lt;br /&gt;
&lt;br /&gt;
== '''[[XML Containing objects]]''' ==&lt;br /&gt;
The containing objects help organize your skin. You'll need a container and a layout to display a skin.&lt;br /&gt;
Basically you'll place all your GUI Objects in one of these.&lt;/div&gt;</summary>
		<author><name>Pjn123</name></author>	</entry>

	<entry>
		<id>http://wiki.winamp.com/wiki/Creating_Modern_Skins</id>
		<title>Creating Modern Skins</title>
		<link rel="alternate" type="text/html" href="http://wiki.winamp.com/wiki/Creating_Modern_Skins"/>
				<updated>2008-09-26T09:53:08Z</updated>
		
		<summary type="html">&lt;p&gt;Pjn123: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Description/Overview of Modern Skinning==&lt;br /&gt;
&lt;br /&gt;
Modern or Freeform skins were originally designed to work with Winamp3. What separates them from the average skin is the fact that they are not confined to the classic rectangular shape. In fact they can be any shape you want them to be and you can put the Winamp control buttons anywhere you want. Some skinners have even added extra buttons that extend the functionality of Winamp right there on the skin. Sounds too good to be true huh? Well these skins require a bit more coding to make and some of the graphics that go into them are quite large. Consequently, Freeform skins may take a bit longer to download from our site and they may take a few extra seconds to load when you switch from one skin to another. But trust me when I say that Freeform skins are worth the extra time and effort. Skin developers have done some incredible things with these skins. You have to check them out.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== XML ==&lt;br /&gt;
Here is your reference guide for XML coding.&lt;br /&gt;
* '''[[XML Reference]]'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Tools Needed to Build a Modern Skin==&lt;br /&gt;
*'''[http://download.nullsoft.com/winamp/plugin-dev/WaSDP_1.1.exe Winamp Skin Development Pack]'''&lt;br /&gt;
*[[Color Editor]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Individual Components==&lt;br /&gt;
&lt;br /&gt;
*[[Modern Skin: Intro|Intro]]&lt;br /&gt;
*[[Modern Skin: Winamp 2 to W3+|Winamp 2 to Winamp 3+]]&lt;br /&gt;
*[[Modern Skin: Simple Skin Tutorial|Simple Skin Tutorial]]&lt;br /&gt;
*[[Modern Skin: XML Intro|XML Intro]]&lt;br /&gt;
*[[Modern Skin: Simple Skin Tutorial (Continued)|Simple Skin Tutorial (Continued)]]&lt;br /&gt;
*[[Modern Skin: Container| Container]]&lt;br /&gt;
*[[Modern Skin: Group|Group]]&lt;br /&gt;
*[[Modern Skin: Relative Positioning| Relative Positioning]]&lt;br /&gt;
*[[Modern Skin: Complex Skin|Complex Skin]]&lt;br /&gt;
*[[Modern Skin: Non-Rect Player| Non-Rect Player]]&lt;br /&gt;
*[[Modern Skin: Layer Composition| Layer Composition]]&lt;br /&gt;
*[[Modern Skin: Alpha Channels| Alpha Channels]]&lt;br /&gt;
*[[Modern Skin: Animatedlayer|Animatedlayer]]&lt;br /&gt;
*[[Modern Skin: Snap Points|Snap Points]]&lt;br /&gt;
*[[Modern Skin: Drawers|Drawers]]&lt;br /&gt;
*[[Modern Skin: Skin Scripting| Skin Scripting]]&lt;br /&gt;
*[[Modern Skin: Drawer Scripting| Drawer Scripting]]&lt;br /&gt;
*[[Modern Skin: Animating a Skin|Animating a Skin]]&lt;br /&gt;
*[[Modern Skin: Maki Overview| Maki Overview]]&lt;br /&gt;
*[[Main_Page#Glossary_of_Terms|Glossary]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Downloadable PDF===&lt;br /&gt;
You can [http://media.winamp.com/5541/main/downloads/development/skinsmodern/Winamp-Modern-Skins-Tutorial.pdf download the tutorial] in PDF format for quick reference anytime&lt;/div&gt;</summary>
		<author><name>Pjn123</name></author>	</entry>

	<entry>
		<id>http://wiki.winamp.com/wiki/Skin_Developer</id>
		<title>Skin Developer</title>
		<link rel="alternate" type="text/html" href="http://wiki.winamp.com/wiki/Skin_Developer"/>
				<updated>2008-09-26T09:41:22Z</updated>
		
		<summary type="html">&lt;p&gt;Pjn123: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Breadcrumb''' -- [[Main_Page|Wiki Main]] : [[Skin Developer]] : [[Visual Developer]] : [[Plug-in Developer]] : [[Articles|Articles Page]] : [[Developers FAQ|FAQ]] : [[Main_Page#Glossary_of_Terms|Glossary]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:Skins-logo.png]]&lt;br /&gt;
&lt;br /&gt;
==Skins Overview==&lt;br /&gt;
&lt;br /&gt;
To put it as simply as possible, skins change the way your Winamp player looks. If you want to get fancy and say that it changes the &amp;quot;User Interface&amp;quot; then you can, but really all you need to know to get you started is if you download a new skin, Winamp will put on a little mask and pretend to look different.&lt;br /&gt;
&lt;br /&gt;
==Tools==&lt;br /&gt;
Before creating a complete skin, you will need the following tools. There are some suggestions below, but we don't necessarily endorse or require you to use any of them. We leave you to choose one that you're most comfortable with.&lt;br /&gt;
&lt;br /&gt;
====Bitmap Editor:====&lt;br /&gt;
How else will you &amp;quot;paint&amp;quot; your skins? Must be able to recognize the .BMP and .PNG format.&lt;br /&gt;
&lt;br /&gt;
''eg. MS Paint, Corel Paint Shop Pro, Adobe Photoshop, Paint.NET, GIMP''&lt;br /&gt;
&lt;br /&gt;
====Text Editor:====&lt;br /&gt;
For use in configuring the fonts and colors of the Mini-browser and Playlist editor. Also used if you do any transparency.&lt;br /&gt;
&lt;br /&gt;
''eg. MS Notepad, TextPad''&lt;br /&gt;
&lt;br /&gt;
====Icon Editor:====&lt;br /&gt;
You will need an Icon editor if you are hardcore and want to edit the cursors and pointers associated with your skin.&lt;br /&gt;
&lt;br /&gt;
''eg. NeoSoft Icon Editor, Icon Edit Pro, Impact Microangelo''&lt;br /&gt;
&lt;br /&gt;
====Zip Compression Tool:====&lt;br /&gt;
Absolutely necessary to publish your skin. Winamp.com will not accept an unzipped skin.&lt;br /&gt;
&lt;br /&gt;
''eg. 7-Zip''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Classic Skins ==&lt;br /&gt;
Classic skins are skins that adhere to the Winamp 2 style model. Classic skins are easier to create than Modern skins but do not allow the author to change the form or function of the player. Classic authors may only replace a standard set of images that alter the player's visual appearance.&lt;br /&gt;
&lt;br /&gt;
* '''[[Creating Classic Skins]]'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Modern Skins ==&lt;br /&gt;
Modern or Freeform skins were originally designed to work with Winamp3. What separates them from the average skin is the fact that they are not confined to the classic rectangular shape. In fact they can be any shape you want them to be and you can put the Winamp control buttons anywhere you want. Some skinners have even added extra buttons that extend the functionality of Winamp right there on the skin. Sounds too good to be true huh? Well these skins require a bit more coding to make and some of the graphics that go into them are quite large. Consequently, Freeform skins may take a bit longer to download from our site and they may take a few extra seconds to load when you switch from one skin to another. But trust me when I say that Freeform skins are worth the extra time and effort. Skin developers have done some incredible things with these skins. You have to check them out.&lt;br /&gt;
&lt;br /&gt;
* '''[[Creating Modern Skins]]'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== ClassicPro Skins ==&lt;br /&gt;
ClassicPro skins is a blend of a Classic Winamp skin and a Modern Winamp skin. You don’t need to do any coding to create your skin because all the coding will be done by the ClassicPro plugin. The layout is similar to the Classic Winamp layout but also resizable using a Single-User-Interface ([[SUI]]) to display components.&lt;br /&gt;
&lt;br /&gt;
[http://cpro.skinconsortium.com/ ClassicPro Official Website]&lt;br /&gt;
&lt;br /&gt;
* '''[[Creating a ClassicPro Skin]]'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Developer Resources==&lt;br /&gt;
*[[Articles#Classic_Skins|Classic Skin Articles]]&lt;br /&gt;
*[[Articles#Modern_Skins|Modern Skin Articles]]&lt;br /&gt;
*[[Developers_FAQ#Skin_Developer_FAQ|Skin FAQ]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Community Links==&lt;br /&gt;
*Forums: [http://forums.winamp.com/forumdisplay.php?s=&amp;amp;forumid=5 Classic Skins]&lt;br /&gt;
*Forums: [http://forums.winamp.com/forumdisplay.php?s=&amp;amp;forumid=123 Modern Skins]&lt;br /&gt;
*Forums: [http://forums.winamp.com/forumdisplay.php?s=&amp;amp;forumid=18 Skinning Tips and Tricks]&lt;br /&gt;
*Forums: [http://forums.winamp.com/forumdisplay.php?s=&amp;amp;forumid=12 Arts and Design]&lt;br /&gt;
*Forums: [http://forums.winamp.com/forumdisplay.php?s=&amp;amp;forumid=119 Skin Removal Reporting]&lt;br /&gt;
*Upload: [http://www.winamp.com/user/submit Submit Your Skin]&lt;br /&gt;
**[http://www.winamp.com/user/submit-skin-classic Submit Classic Skin]&lt;br /&gt;
**[http://www.winamp.com/user/submit-skin-modern Submit Modern Skin]&lt;br /&gt;
*Browse: [http://www.winamp.com/skins Download Skins]&lt;/div&gt;</summary>
		<author><name>Pjn123</name></author>	</entry>

	<entry>
		<id>http://wiki.winamp.com/wiki/Creating_Classic_Skins</id>
		<title>Creating Classic Skins</title>
		<link rel="alternate" type="text/html" href="http://wiki.winamp.com/wiki/Creating_Classic_Skins"/>
				<updated>2008-09-26T09:36:04Z</updated>
		
		<summary type="html">&lt;p&gt;Pjn123: New page: ==Description of a Classic Skin== Classic skins are skins that adhere to the Winamp 2 style model. Classic skins are easier to create than Modern skins but do not allow the author to chang...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Description of a Classic Skin==&lt;br /&gt;
Classic skins are skins that adhere to the Winamp 2 style model. Classic skins are easier to create than Modern skins but do not allow the author to change the form or function of the player. Classic authors may only replace a standard set of images that alter the player's visual appearance.&lt;br /&gt;
&lt;br /&gt;
A lot of people get really excited when they find out that they can change the look of Winamp through skinning. The problem is they get turned off once they hit a roadblock, be it what to do next, hit a problem submitting to Winamp.com, or indeed, just figuring out how to get started. So here we have a set of simple steps that holds your hand from initial idea to finished masterpiece. Note: Cool kids still use (and create) classic skins. Good luck!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Individual Components==&lt;br /&gt;
&lt;br /&gt;
#[[The Base Skin]]&lt;br /&gt;
#[[Main|Paint the Main Window]]&lt;br /&gt;
#[[Equalizer|Paint the Equalizer Window]]&lt;br /&gt;
#[[Playlist|Paint the Playlist Window]]&lt;br /&gt;
#[[Mini-browser|Paint the Minibrowser Window]]&lt;br /&gt;
#[[AVS|Paint the AVS Window]]&lt;br /&gt;
#[[For_Winamp_2.9/5.x|Paint the Winamp 2.9/5.x Windows]]&lt;br /&gt;
#[[Creating Custom Cursors|Create Custom Cursors]]&lt;br /&gt;
#[[Editing the Configuration Files|Edit the Configuration Files]]&lt;br /&gt;
#[[WSZ Files|Compress to .WSZ format]]&lt;br /&gt;
#[[Submitting Your Skin to Winamp.com|Submit to Winamp.com]]&lt;/div&gt;</summary>
		<author><name>Pjn123</name></author>	</entry>

	<entry>
		<id>http://wiki.winamp.com/wiki/Skin_Developer</id>
		<title>Skin Developer</title>
		<link rel="alternate" type="text/html" href="http://wiki.winamp.com/wiki/Skin_Developer"/>
				<updated>2008-09-26T09:36:01Z</updated>
		
		<summary type="html">&lt;p&gt;Pjn123: /* Creating Classic Skins */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Breadcrumb''' -- [[Main_Page|Wiki Main]] : [[Skin Developer]] : [[Visual Developer]] : [[Plug-in Developer]] : [[Articles|Articles Page]] : [[Developers FAQ|FAQ]] : [[Main_Page#Glossary_of_Terms|Glossary]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:Skins-logo.png]]&lt;br /&gt;
&lt;br /&gt;
==Skins Overview==&lt;br /&gt;
&lt;br /&gt;
To put it as simply as possible, skins change the way your Winamp player looks. If you want to get fancy and say that it changes the &amp;quot;User Interface&amp;quot; then you can, but really all you need to know to get you started is if you download a new skin, Winamp will put on a little mask and pretend to look different.&lt;br /&gt;
&lt;br /&gt;
==Tools==&lt;br /&gt;
Before creating a complete skin, you will need the following tools. There are some suggestions below, but we don't necessarily endorse or require you to use any of them. We leave you to choose one that you're most comfortable with.&lt;br /&gt;
&lt;br /&gt;
====Bitmap Editor:====&lt;br /&gt;
How else will you &amp;quot;paint&amp;quot; your skins? Must be able to recognize the .BMP format.&lt;br /&gt;
&lt;br /&gt;
''eg. MS Paint, Corel Paint Shop Pro, Adobe Photoshop, Paint.NET, GIMP''&lt;br /&gt;
&lt;br /&gt;
====Text Editor:====&lt;br /&gt;
For use in configuring the fonts and colors of the Mini-browser and Playlist editor. Also used if you do any transparency.&lt;br /&gt;
&lt;br /&gt;
''eg. MS Notepad, TextPad''&lt;br /&gt;
&lt;br /&gt;
====Icon Editor:====&lt;br /&gt;
You will need an Icon editor if you are hardcore and want to edit the cursors and pointers associated with your skin.&lt;br /&gt;
&lt;br /&gt;
''eg. NeoSoft Icon Editor, Icon Edit Pro, Impact Microangelo''&lt;br /&gt;
&lt;br /&gt;
====Zip Compression Tool:====&lt;br /&gt;
Absolutely necessary to publish your skin. Winamp.com will not accept an unzipped skin.&lt;br /&gt;
&lt;br /&gt;
''eg. 7-Zip''&lt;br /&gt;
&lt;br /&gt;
==Creating Classic Skins==&lt;br /&gt;
Classic skins are skins that adhere to the Winamp 2 style model. Classic skins are easier to create than Modern skins but do not allow the author to change the form or function of the player. Classic authors may only replace a standard set of images that alter the player's visual appearance.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Read more:&lt;br /&gt;
* '''[[Creating Classic Skins]]'''&lt;br /&gt;
&lt;br /&gt;
== Modern Skins ==&lt;br /&gt;
Modern or Freeform skins were originally designed to work with Winamp3. What separates them from the average skin is the fact that they are not confined to the classic rectangular shape. In fact they can be any shape you want them to be and you can put the Winamp control buttons anywhere you want. Some skinners have even added extra buttons that extend the functionality of Winamp right there on the skin. Sounds too good to be true huh? Well these skins require a bit more coding to make and some of the graphics that go into them are quite large. Consequently, Freeform skins may take a bit longer to download from our site and they may take a few extra seconds to load when you switch from one skin to another. But trust me when I say that Freeform skins are worth the extra time and effort. Skin developers have done some incredible things with these skins. You have to check them out.&lt;br /&gt;
&lt;br /&gt;
Read more:&lt;br /&gt;
* '''[[Creating Modern Skins]]'''&lt;br /&gt;
&lt;br /&gt;
== Creating a ClassicPro Skin ==&lt;br /&gt;
ClassicPro skins is a blend of a Classic Winamp skin and a Modern Winamp skin. You don’t need to do any coding to create your skin because all the coding will be done by the ClassicPro plugin. The layout is similar to the Classic Winamp layout but also resizable using a Single-User-Interface ([[SUI]]) to display components.&lt;br /&gt;
&lt;br /&gt;
Read more about '''[[Creating a ClassicPro Skin]]'''.&lt;br /&gt;
&lt;br /&gt;
[http://cpro.skinconsortium.com/ ClassicPro Official Website]&lt;br /&gt;
&lt;br /&gt;
==Developer Resources==&lt;br /&gt;
*[[Articles#Classic_Skins|Classic Skin Articles]]&lt;br /&gt;
*[[Articles#Modern_Skins|Modern Skin Articles]]&lt;br /&gt;
*[[Developers_FAQ#Skin_Developer_FAQ|Skin FAQ]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Community Links==&lt;br /&gt;
*Forums: [http://forums.winamp.com/forumdisplay.php?s=&amp;amp;forumid=5 Classic Skins]&lt;br /&gt;
*Forums: [http://forums.winamp.com/forumdisplay.php?s=&amp;amp;forumid=123 Modern Skins]&lt;br /&gt;
*Forums: [http://forums.winamp.com/forumdisplay.php?s=&amp;amp;forumid=18 Skinning Tips and Tricks]&lt;br /&gt;
*Forums: [http://forums.winamp.com/forumdisplay.php?s=&amp;amp;forumid=12 Arts and Design]&lt;br /&gt;
*Forums: [http://forums.winamp.com/forumdisplay.php?s=&amp;amp;forumid=119 Skin Removal Reporting]&lt;br /&gt;
*Upload: [http://www.winamp.com/user/submit Submit Your Skin]&lt;br /&gt;
**[http://www.winamp.com/user/submit-skin-classic Submit Classic Skin]&lt;br /&gt;
**[http://www.winamp.com/user/submit-skin-modern Submit Modern Skin]&lt;br /&gt;
*Browse: [http://www.winamp.com/skins Download Skins]&lt;/div&gt;</summary>
		<author><name>Pjn123</name></author>	</entry>

	<entry>
		<id>http://wiki.winamp.com/wiki/Skin_Developer</id>
		<title>Skin Developer</title>
		<link rel="alternate" type="text/html" href="http://wiki.winamp.com/wiki/Skin_Developer"/>
				<updated>2008-09-26T09:32:33Z</updated>
		
		<summary type="html">&lt;p&gt;Pjn123: /* Creating Modern Skins */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Breadcrumb''' -- [[Main_Page|Wiki Main]] : [[Skin Developer]] : [[Visual Developer]] : [[Plug-in Developer]] : [[Articles|Articles Page]] : [[Developers FAQ|FAQ]] : [[Main_Page#Glossary_of_Terms|Glossary]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:Skins-logo.png]]&lt;br /&gt;
&lt;br /&gt;
==Skins Overview==&lt;br /&gt;
&lt;br /&gt;
To put it as simply as possible, skins change the way your Winamp player looks. If you want to get fancy and say that it changes the &amp;quot;User Interface&amp;quot; then you can, but really all you need to know to get you started is if you download a new skin, Winamp will put on a little mask and pretend to look different.&lt;br /&gt;
&lt;br /&gt;
==Tools==&lt;br /&gt;
Before creating a complete skin, you will need the following tools. There are some suggestions below, but we don't necessarily endorse or require you to use any of them. We leave you to choose one that you're most comfortable with.&lt;br /&gt;
&lt;br /&gt;
====Bitmap Editor:====&lt;br /&gt;
How else will you &amp;quot;paint&amp;quot; your skins? Must be able to recognize the .BMP format.&lt;br /&gt;
&lt;br /&gt;
''eg. MS Paint, Corel Paint Shop Pro, Adobe Photoshop, Paint.NET, GIMP''&lt;br /&gt;
&lt;br /&gt;
====Text Editor:====&lt;br /&gt;
For use in configuring the fonts and colors of the Mini-browser and Playlist editor. Also used if you do any transparency.&lt;br /&gt;
&lt;br /&gt;
''eg. MS Notepad, TextPad''&lt;br /&gt;
&lt;br /&gt;
====Icon Editor:====&lt;br /&gt;
You will need an Icon editor if you are hardcore and want to edit the cursors and pointers associated with your skin.&lt;br /&gt;
&lt;br /&gt;
''eg. NeoSoft Icon Editor, Icon Edit Pro, Impact Microangelo''&lt;br /&gt;
&lt;br /&gt;
====Zip Compression Tool:====&lt;br /&gt;
Absolutely necessary to publish your skin. Winamp.com will not accept an unzipped skin.&lt;br /&gt;
&lt;br /&gt;
''eg. 7-Zip''&lt;br /&gt;
&lt;br /&gt;
==Creating Classic Skins==&lt;br /&gt;
&lt;br /&gt;
===Description of a Classic Skin===&lt;br /&gt;
Classic skins are skins that adhere to the Winamp 2 style model. Classic skins are easier to create than Modern skins but do not allow the author to change the form or function of the player. Classic authors may only replace a standard set of images that alter the player's visual appearance.&lt;br /&gt;
&lt;br /&gt;
A lot of people get really excited when they find out that they can change the look of Winamp through skinning. The problem is they get turned off once they hit a roadblock, be it what to do next, hit a problem submitting to Winamp.com, or indeed, just figuring out how to get started. So here we have a set of simple steps that holds your hand from initial idea to finished masterpiece. Note: Cool kids still use (and create) classic skins. Good luck!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Individual Components===&lt;br /&gt;
&lt;br /&gt;
#[[The Base Skin]]&lt;br /&gt;
#[[Main|Paint the Main Window]]&lt;br /&gt;
#[[Equalizer|Paint the Equalizer Window]]&lt;br /&gt;
#[[Playlist|Paint the Playlist Window]]&lt;br /&gt;
#[[Mini-browser|Paint the Minibrowser Window]]&lt;br /&gt;
#[[AVS|Paint the AVS Window]]&lt;br /&gt;
#[[For_Winamp_2.9/5.x|Paint the Winamp 2.9/5.x Windows]]&lt;br /&gt;
#[[Creating Custom Cursors|Create Custom Cursors]]&lt;br /&gt;
#[[Editing the Configuration Files|Edit the Configuration Files]]&lt;br /&gt;
#[[WSZ Files|Compress to .WSZ format]]&lt;br /&gt;
#[[Submitting Your Skin to Winamp.com|Submit to Winamp.com]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Modern Skins ==&lt;br /&gt;
Modern or Freeform skins were originally designed to work with Winamp3. What separates them from the average skin is the fact that they are not confined to the classic rectangular shape. In fact they can be any shape you want them to be and you can put the Winamp control buttons anywhere you want. Some skinners have even added extra buttons that extend the functionality of Winamp right there on the skin. Sounds too good to be true huh? Well these skins require a bit more coding to make and some of the graphics that go into them are quite large. Consequently, Freeform skins may take a bit longer to download from our site and they may take a few extra seconds to load when you switch from one skin to another. But trust me when I say that Freeform skins are worth the extra time and effort. Skin developers have done some incredible things with these skins. You have to check them out.&lt;br /&gt;
&lt;br /&gt;
Read more:&lt;br /&gt;
* '''[[Creating Modern Skins]]'''&lt;br /&gt;
&lt;br /&gt;
== Creating a ClassicPro Skin ==&lt;br /&gt;
ClassicPro skins is a blend of a Classic Winamp skin and a Modern Winamp skin. You don’t need to do any coding to create your skin because all the coding will be done by the ClassicPro plugin. The layout is similar to the Classic Winamp layout but also resizable using a Single-User-Interface ([[SUI]]) to display components.&lt;br /&gt;
&lt;br /&gt;
Read more about '''[[Creating a ClassicPro Skin]]'''.&lt;br /&gt;
&lt;br /&gt;
[http://cpro.skinconsortium.com/ ClassicPro Official Website]&lt;br /&gt;
&lt;br /&gt;
==Developer Resources==&lt;br /&gt;
*[[Articles#Classic_Skins|Classic Skin Articles]]&lt;br /&gt;
*[[Articles#Modern_Skins|Modern Skin Articles]]&lt;br /&gt;
*[[Developers_FAQ#Skin_Developer_FAQ|Skin FAQ]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Community Links==&lt;br /&gt;
*Forums: [http://forums.winamp.com/forumdisplay.php?s=&amp;amp;forumid=5 Classic Skins]&lt;br /&gt;
*Forums: [http://forums.winamp.com/forumdisplay.php?s=&amp;amp;forumid=123 Modern Skins]&lt;br /&gt;
*Forums: [http://forums.winamp.com/forumdisplay.php?s=&amp;amp;forumid=18 Skinning Tips and Tricks]&lt;br /&gt;
*Forums: [http://forums.winamp.com/forumdisplay.php?s=&amp;amp;forumid=12 Arts and Design]&lt;br /&gt;
*Forums: [http://forums.winamp.com/forumdisplay.php?s=&amp;amp;forumid=119 Skin Removal Reporting]&lt;br /&gt;
*Upload: [http://www.winamp.com/user/submit Submit Your Skin]&lt;br /&gt;
**[http://www.winamp.com/user/submit-skin-classic Submit Classic Skin]&lt;br /&gt;
**[http://www.winamp.com/user/submit-skin-modern Submit Modern Skin]&lt;br /&gt;
*Browse: [http://www.winamp.com/skins Download Skins]&lt;/div&gt;</summary>
		<author><name>Pjn123</name></author>	</entry>

	<entry>
		<id>http://wiki.winamp.com/wiki/Creating_Modern_Skins</id>
		<title>Creating Modern Skins</title>
		<link rel="alternate" type="text/html" href="http://wiki.winamp.com/wiki/Creating_Modern_Skins"/>
				<updated>2008-09-26T09:29:50Z</updated>
		
		<summary type="html">&lt;p&gt;Pjn123: Clean Winamp Skins.. move the creating stuff into sub articles for the different skins availible&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Description/Overview of Modern Skinning===&lt;br /&gt;
&lt;br /&gt;
Modern or Freeform skins were originally designed to work with Winamp3. What separates them from the average skin is the fact that they are not confined to the classic rectangular shape. In fact they can be any shape you want them to be and you can put the Winamp control buttons anywhere you want. Some skinners have even added extra buttons that extend the functionality of Winamp right there on the skin. Sounds too good to be true huh? Well these skins require a bit more coding to make and some of the graphics that go into them are quite large. Consequently, Freeform skins may take a bit longer to download from our site and they may take a few extra seconds to load when you switch from one skin to another. But trust me when I say that Freeform skins are worth the extra time and effort. Skin developers have done some incredible things with these skins. You have to check them out.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Tools Needed to Build a Modern Skin===&lt;br /&gt;
*'''[http://download.nullsoft.com/winamp/plugin-dev/WaSDP_1.1.exe Winamp Skin Development Pack]'''&lt;br /&gt;
*[[Color Editor]]&lt;br /&gt;
&lt;br /&gt;
===Individual Components===&lt;br /&gt;
&lt;br /&gt;
*[[Modern Skin: Intro|Intro]]&lt;br /&gt;
*[[Modern Skin: Winamp 2 to W3+|Winamp 2 to Winamp 3+]]&lt;br /&gt;
*[[Modern Skin: Simple Skin Tutorial|Simple Skin Tutorial]]&lt;br /&gt;
*[[Modern Skin: XML Intro|XML Intro]]&lt;br /&gt;
*[[Modern Skin: Simple Skin Tutorial (Continued)|Simple Skin Tutorial (Continued)]]&lt;br /&gt;
*[[Modern Skin: Container| Container]]&lt;br /&gt;
*[[Modern Skin: Group|Group]]&lt;br /&gt;
*[[Modern Skin: Relative Positioning| Relative Positioning]]&lt;br /&gt;
*[[Modern Skin: Complex Skin|Complex Skin]]&lt;br /&gt;
*[[Modern Skin: Non-Rect Player| Non-Rect Player]]&lt;br /&gt;
*[[Modern Skin: Layer Composition| Layer Composition]]&lt;br /&gt;
*[[Modern Skin: Alpha Channels| Alpha Channels]]&lt;br /&gt;
*[[Modern Skin: Animatedlayer|Animatedlayer]]&lt;br /&gt;
*[[Modern Skin: Snap Points|Snap Points]]&lt;br /&gt;
*[[Modern Skin: Drawers|Drawers]]&lt;br /&gt;
*[[Modern Skin: Skin Scripting| Skin Scripting]]&lt;br /&gt;
*[[Modern Skin: Drawer Scripting| Drawer Scripting]]&lt;br /&gt;
*[[Modern Skin: Animating a Skin|Animating a Skin]]&lt;br /&gt;
*[[Modern Skin: Maki Overview| Maki Overview]]&lt;br /&gt;
*[[Main_Page#Glossary_of_Terms|Glossary]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Downloadable PDF====&lt;br /&gt;
You can [http://media.winamp.com/5541/main/downloads/development/skinsmodern/Winamp-Modern-Skins-Tutorial.pdf download the tutorial] in PDF format for quick reference anytime&lt;/div&gt;</summary>
		<author><name>Pjn123</name></author>	</entry>

	<entry>
		<id>http://wiki.winamp.com/wiki/Skin_Developer</id>
		<title>Skin Developer</title>
		<link rel="alternate" type="text/html" href="http://wiki.winamp.com/wiki/Skin_Developer"/>
				<updated>2008-09-26T09:25:55Z</updated>
		
		<summary type="html">&lt;p&gt;Pjn123: /* Creating a ClassicPro Skin */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Breadcrumb''' -- [[Main_Page|Wiki Main]] : [[Skin Developer]] : [[Visual Developer]] : [[Plug-in Developer]] : [[Articles|Articles Page]] : [[Developers FAQ|FAQ]] : [[Main_Page#Glossary_of_Terms|Glossary]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:Skins-logo.png]]&lt;br /&gt;
&lt;br /&gt;
==Skins Overview==&lt;br /&gt;
&lt;br /&gt;
To put it as simply as possible, skins change the way your Winamp player looks. If you want to get fancy and say that it changes the &amp;quot;User Interface&amp;quot; then you can, but really all you need to know to get you started is if you download a new skin, Winamp will put on a little mask and pretend to look different.&lt;br /&gt;
&lt;br /&gt;
==Tools==&lt;br /&gt;
Before creating a complete skin, you will need the following tools. There are some suggestions below, but we don't necessarily endorse or require you to use any of them. We leave you to choose one that you're most comfortable with.&lt;br /&gt;
&lt;br /&gt;
====Bitmap Editor:====&lt;br /&gt;
How else will you &amp;quot;paint&amp;quot; your skins? Must be able to recognize the .BMP format.&lt;br /&gt;
&lt;br /&gt;
''eg. MS Paint, Corel Paint Shop Pro, Adobe Photoshop, Paint.NET, GIMP''&lt;br /&gt;
&lt;br /&gt;
====Text Editor:====&lt;br /&gt;
For use in configuring the fonts and colors of the Mini-browser and Playlist editor. Also used if you do any transparency.&lt;br /&gt;
&lt;br /&gt;
''eg. MS Notepad, TextPad''&lt;br /&gt;
&lt;br /&gt;
====Icon Editor:====&lt;br /&gt;
You will need an Icon editor if you are hardcore and want to edit the cursors and pointers associated with your skin.&lt;br /&gt;
&lt;br /&gt;
''eg. NeoSoft Icon Editor, Icon Edit Pro, Impact Microangelo''&lt;br /&gt;
&lt;br /&gt;
====Zip Compression Tool:====&lt;br /&gt;
Absolutely necessary to publish your skin. Winamp.com will not accept an unzipped skin.&lt;br /&gt;
&lt;br /&gt;
''eg. 7-Zip''&lt;br /&gt;
&lt;br /&gt;
==Creating Classic Skins==&lt;br /&gt;
&lt;br /&gt;
===Description of a Classic Skin===&lt;br /&gt;
Classic skins are skins that adhere to the Winamp 2 style model. Classic skins are easier to create than Modern skins but do not allow the author to change the form or function of the player. Classic authors may only replace a standard set of images that alter the player's visual appearance.&lt;br /&gt;
&lt;br /&gt;
A lot of people get really excited when they find out that they can change the look of Winamp through skinning. The problem is they get turned off once they hit a roadblock, be it what to do next, hit a problem submitting to Winamp.com, or indeed, just figuring out how to get started. So here we have a set of simple steps that holds your hand from initial idea to finished masterpiece. Note: Cool kids still use (and create) classic skins. Good luck!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Individual Components===&lt;br /&gt;
&lt;br /&gt;
#[[The Base Skin]]&lt;br /&gt;
#[[Main|Paint the Main Window]]&lt;br /&gt;
#[[Equalizer|Paint the Equalizer Window]]&lt;br /&gt;
#[[Playlist|Paint the Playlist Window]]&lt;br /&gt;
#[[Mini-browser|Paint the Minibrowser Window]]&lt;br /&gt;
#[[AVS|Paint the AVS Window]]&lt;br /&gt;
#[[For_Winamp_2.9/5.x|Paint the Winamp 2.9/5.x Windows]]&lt;br /&gt;
#[[Creating Custom Cursors|Create Custom Cursors]]&lt;br /&gt;
#[[Editing the Configuration Files|Edit the Configuration Files]]&lt;br /&gt;
#[[WSZ Files|Compress to .WSZ format]]&lt;br /&gt;
#[[Submitting Your Skin to Winamp.com|Submit to Winamp.com]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Creating Modern Skins==&lt;br /&gt;
&lt;br /&gt;
===Description/Overview of Modern Skinning===&lt;br /&gt;
&lt;br /&gt;
Modern or Freeform skins were originally designed to work with Winamp3. What separates them from the average skin is the fact that they are not confined to the classic rectangular shape. In fact they can be any shape you want them to be and you can put the Winamp control buttons anywhere you want. Some skinners have even added extra buttons that extend the functionality of Winamp right there on the skin. Sounds too good to be true huh? Well these skins require a bit more coding to make and some of the graphics that go into them are quite large. Consequently, Freeform skins may take a bit longer to download from our site and they may take a few extra seconds to load when you switch from one skin to another. But trust me when I say that Freeform skins are worth the extra time and effort. Skin developers have done some incredible things with these skins. You have to check them out.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Tools Needed to Build a Modern Skin===&lt;br /&gt;
*'''[http://download.nullsoft.com/winamp/plugin-dev/WaSDP_1.1.exe Winamp Skin Development Pack]'''&lt;br /&gt;
*[[Color Editor]]&lt;br /&gt;
&lt;br /&gt;
===Individual Components===&lt;br /&gt;
&lt;br /&gt;
*[[Modern Skin: Intro|Intro]]&lt;br /&gt;
*[[Modern Skin: Winamp 2 to W3+|Winamp 2 to Winamp 3+]]&lt;br /&gt;
*[[Modern Skin: Simple Skin Tutorial|Simple Skin Tutorial]]&lt;br /&gt;
*[[Modern Skin: XML Intro|XML Intro]]&lt;br /&gt;
*[[Modern Skin: Simple Skin Tutorial (Continued)|Simple Skin Tutorial (Continued)]]&lt;br /&gt;
*[[Modern Skin: Container| Container]]&lt;br /&gt;
*[[Modern Skin: Group|Group]]&lt;br /&gt;
*[[Modern Skin: Relative Positioning| Relative Positioning]]&lt;br /&gt;
*[[Modern Skin: Complex Skin|Complex Skin]]&lt;br /&gt;
*[[Modern Skin: Non-Rect Player| Non-Rect Player]]&lt;br /&gt;
*[[Modern Skin: Layer Composition| Layer Composition]]&lt;br /&gt;
*[[Modern Skin: Alpha Channels| Alpha Channels]]&lt;br /&gt;
*[[Modern Skin: Animatedlayer|Animatedlayer]]&lt;br /&gt;
*[[Modern Skin: Snap Points|Snap Points]]&lt;br /&gt;
*[[Modern Skin: Drawers|Drawers]]&lt;br /&gt;
*[[Modern Skin: Skin Scripting| Skin Scripting]]&lt;br /&gt;
*[[Modern Skin: Drawer Scripting| Drawer Scripting]]&lt;br /&gt;
*[[Modern Skin: Animating a Skin|Animating a Skin]]&lt;br /&gt;
*[[Modern Skin: Maki Overview| Maki Overview]]&lt;br /&gt;
*[[Main_Page#Glossary_of_Terms|Glossary]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Downloadable PDF====&lt;br /&gt;
You can [http://media.winamp.com/5541/main/downloads/development/skinsmodern/Winamp-Modern-Skins-Tutorial.pdf download the tutorial] in PDF format for quick reference anytime&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Creating a ClassicPro Skin ==&lt;br /&gt;
ClassicPro skins is a blend of a Classic Winamp skin and a Modern Winamp skin. You don’t need to do any coding to create your skin because all the coding will be done by the ClassicPro plugin. The layout is similar to the Classic Winamp layout but also resizable using a Single-User-Interface ([[SUI]]) to display components.&lt;br /&gt;
&lt;br /&gt;
Read more about '''[[Creating a ClassicPro Skin]]'''.&lt;br /&gt;
&lt;br /&gt;
[http://cpro.skinconsortium.com/ ClassicPro Official Website]&lt;br /&gt;
&lt;br /&gt;
==Developer Resources==&lt;br /&gt;
*[[Articles#Classic_Skins|Classic Skin Articles]]&lt;br /&gt;
*[[Articles#Modern_Skins|Modern Skin Articles]]&lt;br /&gt;
*[[Developers_FAQ#Skin_Developer_FAQ|Skin FAQ]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Community Links==&lt;br /&gt;
*Forums: [http://forums.winamp.com/forumdisplay.php?s=&amp;amp;forumid=5 Classic Skins]&lt;br /&gt;
*Forums: [http://forums.winamp.com/forumdisplay.php?s=&amp;amp;forumid=123 Modern Skins]&lt;br /&gt;
*Forums: [http://forums.winamp.com/forumdisplay.php?s=&amp;amp;forumid=18 Skinning Tips and Tricks]&lt;br /&gt;
*Forums: [http://forums.winamp.com/forumdisplay.php?s=&amp;amp;forumid=12 Arts and Design]&lt;br /&gt;
*Forums: [http://forums.winamp.com/forumdisplay.php?s=&amp;amp;forumid=119 Skin Removal Reporting]&lt;br /&gt;
*Upload: [http://www.winamp.com/user/submit Submit Your Skin]&lt;br /&gt;
**[http://www.winamp.com/user/submit-skin-classic Submit Classic Skin]&lt;br /&gt;
**[http://www.winamp.com/user/submit-skin-modern Submit Modern Skin]&lt;br /&gt;
*Browse: [http://www.winamp.com/skins Download Skins]&lt;/div&gt;</summary>
		<author><name>Pjn123</name></author>	</entry>

	<entry>
		<id>http://wiki.winamp.com/wiki/Skin_Developer</id>
		<title>Skin Developer</title>
		<link rel="alternate" type="text/html" href="http://wiki.winamp.com/wiki/Skin_Developer"/>
				<updated>2008-09-25T20:43:15Z</updated>
		
		<summary type="html">&lt;p&gt;Pjn123: /* Creating a ClassicPro Skin */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Breadcrumb''' -- [[Main_Page|Wiki Main]] : [[Skin Developer]] : [[Visual Developer]] : [[Plug-in Developer]] : [[Articles|Articles Page]] : [[Developers FAQ|FAQ]] : [[Main_Page#Glossary_of_Terms|Glossary]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:Skins-logo.png]]&lt;br /&gt;
&lt;br /&gt;
==Skins Overview==&lt;br /&gt;
&lt;br /&gt;
To put it as simply as possible, skins change the way your Winamp player looks. If you want to get fancy and say that it changes the &amp;quot;User Interface&amp;quot; then you can, but really all you need to know to get you started is if you download a new skin, Winamp will put on a little mask and pretend to look different.&lt;br /&gt;
&lt;br /&gt;
==Tools==&lt;br /&gt;
Before creating a complete skin, you will need the following tools. There are some suggestions below, but we don't necessarily endorse or require you to use any of them. We leave you to choose one that you're most comfortable with.&lt;br /&gt;
&lt;br /&gt;
====Bitmap Editor:====&lt;br /&gt;
How else will you &amp;quot;paint&amp;quot; your skins? Must be able to recognize the .BMP format.&lt;br /&gt;
&lt;br /&gt;
''eg. MS Paint, Corel Paint Shop Pro, Adobe Photoshop, Paint.NET, GIMP''&lt;br /&gt;
&lt;br /&gt;
====Text Editor:====&lt;br /&gt;
For use in configuring the fonts and colors of the Mini-browser and Playlist editor. Also used if you do any transparency.&lt;br /&gt;
&lt;br /&gt;
''eg. MS Notepad, TextPad''&lt;br /&gt;
&lt;br /&gt;
====Icon Editor:====&lt;br /&gt;
You will need an Icon editor if you are hardcore and want to edit the cursors and pointers associated with your skin.&lt;br /&gt;
&lt;br /&gt;
''eg. NeoSoft Icon Editor, Icon Edit Pro, Impact Microangelo''&lt;br /&gt;
&lt;br /&gt;
====Zip Compression Tool:====&lt;br /&gt;
Absolutely necessary to publish your skin. Winamp.com will not accept an unzipped skin.&lt;br /&gt;
&lt;br /&gt;
''eg. 7-Zip''&lt;br /&gt;
&lt;br /&gt;
==Creating Classic Skins==&lt;br /&gt;
&lt;br /&gt;
===Description of a Classic Skin===&lt;br /&gt;
Classic skins are skins that adhere to the Winamp 2 style model. Classic skins are easier to create than Modern skins but do not allow the author to change the form or function of the player. Classic authors may only replace a standard set of images that alter the player's visual appearance.&lt;br /&gt;
&lt;br /&gt;
A lot of people get really excited when they find out that they can change the look of Winamp through skinning. The problem is they get turned off once they hit a roadblock, be it what to do next, hit a problem submitting to Winamp.com, or indeed, just figuring out how to get started. So here we have a set of simple steps that holds your hand from initial idea to finished masterpiece. Note: Cool kids still use (and create) classic skins. Good luck!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Individual Components===&lt;br /&gt;
&lt;br /&gt;
#[[The Base Skin]]&lt;br /&gt;
#[[Main|Paint the Main Window]]&lt;br /&gt;
#[[Equalizer|Paint the Equalizer Window]]&lt;br /&gt;
#[[Playlist|Paint the Playlist Window]]&lt;br /&gt;
#[[Mini-browser|Paint the Minibrowser Window]]&lt;br /&gt;
#[[AVS|Paint the AVS Window]]&lt;br /&gt;
#[[For_Winamp_2.9/5.x|Paint the Winamp 2.9/5.x Windows]]&lt;br /&gt;
#[[Creating Custom Cursors|Create Custom Cursors]]&lt;br /&gt;
#[[Editing the Configuration Files|Edit the Configuration Files]]&lt;br /&gt;
#[[WSZ Files|Compress to .WSZ format]]&lt;br /&gt;
#[[Submitting Your Skin to Winamp.com|Submit to Winamp.com]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Creating Modern Skins==&lt;br /&gt;
&lt;br /&gt;
===Description/Overview of Modern Skinning===&lt;br /&gt;
&lt;br /&gt;
Modern or Freeform skins were originally designed to work with Winamp3. What separates them from the average skin is the fact that they are not confined to the classic rectangular shape. In fact they can be any shape you want them to be and you can put the Winamp control buttons anywhere you want. Some skinners have even added extra buttons that extend the functionality of Winamp right there on the skin. Sounds too good to be true huh? Well these skins require a bit more coding to make and some of the graphics that go into them are quite large. Consequently, Freeform skins may take a bit longer to download from our site and they may take a few extra seconds to load when you switch from one skin to another. But trust me when I say that Freeform skins are worth the extra time and effort. Skin developers have done some incredible things with these skins. You have to check them out.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Tools Needed to Build a Modern Skin===&lt;br /&gt;
*'''[http://download.nullsoft.com/winamp/plugin-dev/WaSDP_1.1.exe Winamp Skin Development Pack]'''&lt;br /&gt;
*[[Color Editor]]&lt;br /&gt;
&lt;br /&gt;
===Individual Components===&lt;br /&gt;
&lt;br /&gt;
*[[Modern Skin: Intro|Intro]]&lt;br /&gt;
*[[Modern Skin: Winamp 2 to W3+|Winamp 2 to Winamp 3+]]&lt;br /&gt;
*[[Modern Skin: Simple Skin Tutorial|Simple Skin Tutorial]]&lt;br /&gt;
*[[Modern Skin: XML Intro|XML Intro]]&lt;br /&gt;
*[[Modern Skin: Simple Skin Tutorial (Continued)|Simple Skin Tutorial (Continued)]]&lt;br /&gt;
*[[Modern Skin: Container| Container]]&lt;br /&gt;
*[[Modern Skin: Group|Group]]&lt;br /&gt;
*[[Modern Skin: Relative Positioning| Relative Positioning]]&lt;br /&gt;
*[[Modern Skin: Complex Skin|Complex Skin]]&lt;br /&gt;
*[[Modern Skin: Non-Rect Player| Non-Rect Player]]&lt;br /&gt;
*[[Modern Skin: Layer Composition| Layer Composition]]&lt;br /&gt;
*[[Modern Skin: Alpha Channels| Alpha Channels]]&lt;br /&gt;
*[[Modern Skin: Animatedlayer|Animatedlayer]]&lt;br /&gt;
*[[Modern Skin: Snap Points|Snap Points]]&lt;br /&gt;
*[[Modern Skin: Drawers|Drawers]]&lt;br /&gt;
*[[Modern Skin: Skin Scripting| Skin Scripting]]&lt;br /&gt;
*[[Modern Skin: Drawer Scripting| Drawer Scripting]]&lt;br /&gt;
*[[Modern Skin: Animating a Skin|Animating a Skin]]&lt;br /&gt;
*[[Modern Skin: Maki Overview| Maki Overview]]&lt;br /&gt;
*[[Main_Page#Glossary_of_Terms|Glossary]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Downloadable PDF====&lt;br /&gt;
You can [http://media.winamp.com/5541/main/downloads/development/skinsmodern/Winamp-Modern-Skins-Tutorial.pdf download the tutorial] in PDF format for quick reference anytime&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Creating a ClassicPro Skin ==&lt;br /&gt;
ClassicPro skins is a blend of a Classic Winamp skin and a Modern Winamp skin. You don’t need to do any coding to create your skin because all the coding will be done by the ClassicPro plugin. The layout is similar to the Classic Winamp layout but also resizable using a Single-User-Interface ([[SUI]]) to display components.&lt;br /&gt;
&lt;br /&gt;
Read more about [[Creating a ClassicPro Skin]].&lt;br /&gt;
&lt;br /&gt;
[http://cpro.skinconsortium.com/ ClassicPro Official Website]&lt;br /&gt;
&lt;br /&gt;
==Developer Resources==&lt;br /&gt;
*[[Articles#Classic_Skins|Classic Skin Articles]]&lt;br /&gt;
*[[Articles#Modern_Skins|Modern Skin Articles]]&lt;br /&gt;
*[[Developers_FAQ#Skin_Developer_FAQ|Skin FAQ]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Community Links==&lt;br /&gt;
*Forums: [http://forums.winamp.com/forumdisplay.php?s=&amp;amp;forumid=5 Classic Skins]&lt;br /&gt;
*Forums: [http://forums.winamp.com/forumdisplay.php?s=&amp;amp;forumid=123 Modern Skins]&lt;br /&gt;
*Forums: [http://forums.winamp.com/forumdisplay.php?s=&amp;amp;forumid=18 Skinning Tips and Tricks]&lt;br /&gt;
*Forums: [http://forums.winamp.com/forumdisplay.php?s=&amp;amp;forumid=12 Arts and Design]&lt;br /&gt;
*Forums: [http://forums.winamp.com/forumdisplay.php?s=&amp;amp;forumid=119 Skin Removal Reporting]&lt;br /&gt;
*Upload: [http://www.winamp.com/user/submit Submit Your Skin]&lt;br /&gt;
**[http://www.winamp.com/user/submit-skin-classic Submit Classic Skin]&lt;br /&gt;
**[http://www.winamp.com/user/submit-skin-modern Submit Modern Skin]&lt;br /&gt;
*Browse: [http://www.winamp.com/skins Download Skins]&lt;/div&gt;</summary>
		<author><name>Pjn123</name></author>	</entry>

	<entry>
		<id>http://wiki.winamp.com/wiki/Skin_Developer</id>
		<title>Skin Developer</title>
		<link rel="alternate" type="text/html" href="http://wiki.winamp.com/wiki/Skin_Developer"/>
				<updated>2008-09-25T20:41:46Z</updated>
		
		<summary type="html">&lt;p&gt;Pjn123: /* Creating a ClassicPro Skin */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Breadcrumb''' -- [[Main_Page|Wiki Main]] : [[Skin Developer]] : [[Visual Developer]] : [[Plug-in Developer]] : [[Articles|Articles Page]] : [[Developers FAQ|FAQ]] : [[Main_Page#Glossary_of_Terms|Glossary]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:Skins-logo.png]]&lt;br /&gt;
&lt;br /&gt;
==Skins Overview==&lt;br /&gt;
&lt;br /&gt;
To put it as simply as possible, skins change the way your Winamp player looks. If you want to get fancy and say that it changes the &amp;quot;User Interface&amp;quot; then you can, but really all you need to know to get you started is if you download a new skin, Winamp will put on a little mask and pretend to look different.&lt;br /&gt;
&lt;br /&gt;
==Tools==&lt;br /&gt;
Before creating a complete skin, you will need the following tools. There are some suggestions below, but we don't necessarily endorse or require you to use any of them. We leave you to choose one that you're most comfortable with.&lt;br /&gt;
&lt;br /&gt;
====Bitmap Editor:====&lt;br /&gt;
How else will you &amp;quot;paint&amp;quot; your skins? Must be able to recognize the .BMP format.&lt;br /&gt;
&lt;br /&gt;
''eg. MS Paint, Corel Paint Shop Pro, Adobe Photoshop, Paint.NET, GIMP''&lt;br /&gt;
&lt;br /&gt;
====Text Editor:====&lt;br /&gt;
For use in configuring the fonts and colors of the Mini-browser and Playlist editor. Also used if you do any transparency.&lt;br /&gt;
&lt;br /&gt;
''eg. MS Notepad, TextPad''&lt;br /&gt;
&lt;br /&gt;
====Icon Editor:====&lt;br /&gt;
You will need an Icon editor if you are hardcore and want to edit the cursors and pointers associated with your skin.&lt;br /&gt;
&lt;br /&gt;
''eg. NeoSoft Icon Editor, Icon Edit Pro, Impact Microangelo''&lt;br /&gt;
&lt;br /&gt;
====Zip Compression Tool:====&lt;br /&gt;
Absolutely necessary to publish your skin. Winamp.com will not accept an unzipped skin.&lt;br /&gt;
&lt;br /&gt;
''eg. 7-Zip''&lt;br /&gt;
&lt;br /&gt;
==Creating Classic Skins==&lt;br /&gt;
&lt;br /&gt;
===Description of a Classic Skin===&lt;br /&gt;
Classic skins are skins that adhere to the Winamp 2 style model. Classic skins are easier to create than Modern skins but do not allow the author to change the form or function of the player. Classic authors may only replace a standard set of images that alter the player's visual appearance.&lt;br /&gt;
&lt;br /&gt;
A lot of people get really excited when they find out that they can change the look of Winamp through skinning. The problem is they get turned off once they hit a roadblock, be it what to do next, hit a problem submitting to Winamp.com, or indeed, just figuring out how to get started. So here we have a set of simple steps that holds your hand from initial idea to finished masterpiece. Note: Cool kids still use (and create) classic skins. Good luck!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Individual Components===&lt;br /&gt;
&lt;br /&gt;
#[[The Base Skin]]&lt;br /&gt;
#[[Main|Paint the Main Window]]&lt;br /&gt;
#[[Equalizer|Paint the Equalizer Window]]&lt;br /&gt;
#[[Playlist|Paint the Playlist Window]]&lt;br /&gt;
#[[Mini-browser|Paint the Minibrowser Window]]&lt;br /&gt;
#[[AVS|Paint the AVS Window]]&lt;br /&gt;
#[[For_Winamp_2.9/5.x|Paint the Winamp 2.9/5.x Windows]]&lt;br /&gt;
#[[Creating Custom Cursors|Create Custom Cursors]]&lt;br /&gt;
#[[Editing the Configuration Files|Edit the Configuration Files]]&lt;br /&gt;
#[[WSZ Files|Compress to .WSZ format]]&lt;br /&gt;
#[[Submitting Your Skin to Winamp.com|Submit to Winamp.com]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Creating Modern Skins==&lt;br /&gt;
&lt;br /&gt;
===Description/Overview of Modern Skinning===&lt;br /&gt;
&lt;br /&gt;
Modern or Freeform skins were originally designed to work with Winamp3. What separates them from the average skin is the fact that they are not confined to the classic rectangular shape. In fact they can be any shape you want them to be and you can put the Winamp control buttons anywhere you want. Some skinners have even added extra buttons that extend the functionality of Winamp right there on the skin. Sounds too good to be true huh? Well these skins require a bit more coding to make and some of the graphics that go into them are quite large. Consequently, Freeform skins may take a bit longer to download from our site and they may take a few extra seconds to load when you switch from one skin to another. But trust me when I say that Freeform skins are worth the extra time and effort. Skin developers have done some incredible things with these skins. You have to check them out.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Tools Needed to Build a Modern Skin===&lt;br /&gt;
*'''[http://download.nullsoft.com/winamp/plugin-dev/WaSDP_1.1.exe Winamp Skin Development Pack]'''&lt;br /&gt;
*[[Color Editor]]&lt;br /&gt;
&lt;br /&gt;
===Individual Components===&lt;br /&gt;
&lt;br /&gt;
*[[Modern Skin: Intro|Intro]]&lt;br /&gt;
*[[Modern Skin: Winamp 2 to W3+|Winamp 2 to Winamp 3+]]&lt;br /&gt;
*[[Modern Skin: Simple Skin Tutorial|Simple Skin Tutorial]]&lt;br /&gt;
*[[Modern Skin: XML Intro|XML Intro]]&lt;br /&gt;
*[[Modern Skin: Simple Skin Tutorial (Continued)|Simple Skin Tutorial (Continued)]]&lt;br /&gt;
*[[Modern Skin: Container| Container]]&lt;br /&gt;
*[[Modern Skin: Group|Group]]&lt;br /&gt;
*[[Modern Skin: Relative Positioning| Relative Positioning]]&lt;br /&gt;
*[[Modern Skin: Complex Skin|Complex Skin]]&lt;br /&gt;
*[[Modern Skin: Non-Rect Player| Non-Rect Player]]&lt;br /&gt;
*[[Modern Skin: Layer Composition| Layer Composition]]&lt;br /&gt;
*[[Modern Skin: Alpha Channels| Alpha Channels]]&lt;br /&gt;
*[[Modern Skin: Animatedlayer|Animatedlayer]]&lt;br /&gt;
*[[Modern Skin: Snap Points|Snap Points]]&lt;br /&gt;
*[[Modern Skin: Drawers|Drawers]]&lt;br /&gt;
*[[Modern Skin: Skin Scripting| Skin Scripting]]&lt;br /&gt;
*[[Modern Skin: Drawer Scripting| Drawer Scripting]]&lt;br /&gt;
*[[Modern Skin: Animating a Skin|Animating a Skin]]&lt;br /&gt;
*[[Modern Skin: Maki Overview| Maki Overview]]&lt;br /&gt;
*[[Main_Page#Glossary_of_Terms|Glossary]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Downloadable PDF====&lt;br /&gt;
You can [http://media.winamp.com/5541/main/downloads/development/skinsmodern/Winamp-Modern-Skins-Tutorial.pdf download the tutorial] in PDF format for quick reference anytime&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Creating a ClassicPro Skin ==&lt;br /&gt;
ClassicPro skins is a blend of a Classic Winamp skin and a Modern Winamp skin. You don’t need to do any coding to create your skin because all the coding will be done by the ClassicPro plugin. The layout is similar to the Classic Winamp layout but also resizable using a Single-User-Interface ([[SUI]]) to display components.&lt;br /&gt;
&lt;br /&gt;
[http://cpro.skinconsortium.com/ ClassicPro Official Website]&lt;br /&gt;
&lt;br /&gt;
[[Creating a ClassicPro Skin]]&lt;br /&gt;
&lt;br /&gt;
==Developer Resources==&lt;br /&gt;
*[[Articles#Classic_Skins|Classic Skin Articles]]&lt;br /&gt;
*[[Articles#Modern_Skins|Modern Skin Articles]]&lt;br /&gt;
*[[Developers_FAQ#Skin_Developer_FAQ|Skin FAQ]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Community Links==&lt;br /&gt;
*Forums: [http://forums.winamp.com/forumdisplay.php?s=&amp;amp;forumid=5 Classic Skins]&lt;br /&gt;
*Forums: [http://forums.winamp.com/forumdisplay.php?s=&amp;amp;forumid=123 Modern Skins]&lt;br /&gt;
*Forums: [http://forums.winamp.com/forumdisplay.php?s=&amp;amp;forumid=18 Skinning Tips and Tricks]&lt;br /&gt;
*Forums: [http://forums.winamp.com/forumdisplay.php?s=&amp;amp;forumid=12 Arts and Design]&lt;br /&gt;
*Forums: [http://forums.winamp.com/forumdisplay.php?s=&amp;amp;forumid=119 Skin Removal Reporting]&lt;br /&gt;
*Upload: [http://www.winamp.com/user/submit Submit Your Skin]&lt;br /&gt;
**[http://www.winamp.com/user/submit-skin-classic Submit Classic Skin]&lt;br /&gt;
**[http://www.winamp.com/user/submit-skin-modern Submit Modern Skin]&lt;br /&gt;
*Browse: [http://www.winamp.com/skins Download Skins]&lt;/div&gt;</summary>
		<author><name>Pjn123</name></author>	</entry>

	<entry>
		<id>http://wiki.winamp.com/wiki/Skin_Developer</id>
		<title>Skin Developer</title>
		<link rel="alternate" type="text/html" href="http://wiki.winamp.com/wiki/Skin_Developer"/>
				<updated>2008-09-25T20:41:01Z</updated>
		
		<summary type="html">&lt;p&gt;Pjn123: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Breadcrumb''' -- [[Main_Page|Wiki Main]] : [[Skin Developer]] : [[Visual Developer]] : [[Plug-in Developer]] : [[Articles|Articles Page]] : [[Developers FAQ|FAQ]] : [[Main_Page#Glossary_of_Terms|Glossary]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:Skins-logo.png]]&lt;br /&gt;
&lt;br /&gt;
==Skins Overview==&lt;br /&gt;
&lt;br /&gt;
To put it as simply as possible, skins change the way your Winamp player looks. If you want to get fancy and say that it changes the &amp;quot;User Interface&amp;quot; then you can, but really all you need to know to get you started is if you download a new skin, Winamp will put on a little mask and pretend to look different.&lt;br /&gt;
&lt;br /&gt;
==Tools==&lt;br /&gt;
Before creating a complete skin, you will need the following tools. There are some suggestions below, but we don't necessarily endorse or require you to use any of them. We leave you to choose one that you're most comfortable with.&lt;br /&gt;
&lt;br /&gt;
====Bitmap Editor:====&lt;br /&gt;
How else will you &amp;quot;paint&amp;quot; your skins? Must be able to recognize the .BMP format.&lt;br /&gt;
&lt;br /&gt;
''eg. MS Paint, Corel Paint Shop Pro, Adobe Photoshop, Paint.NET, GIMP''&lt;br /&gt;
&lt;br /&gt;
====Text Editor:====&lt;br /&gt;
For use in configuring the fonts and colors of the Mini-browser and Playlist editor. Also used if you do any transparency.&lt;br /&gt;
&lt;br /&gt;
''eg. MS Notepad, TextPad''&lt;br /&gt;
&lt;br /&gt;
====Icon Editor:====&lt;br /&gt;
You will need an Icon editor if you are hardcore and want to edit the cursors and pointers associated with your skin.&lt;br /&gt;
&lt;br /&gt;
''eg. NeoSoft Icon Editor, Icon Edit Pro, Impact Microangelo''&lt;br /&gt;
&lt;br /&gt;
====Zip Compression Tool:====&lt;br /&gt;
Absolutely necessary to publish your skin. Winamp.com will not accept an unzipped skin.&lt;br /&gt;
&lt;br /&gt;
''eg. 7-Zip''&lt;br /&gt;
&lt;br /&gt;
==Creating Classic Skins==&lt;br /&gt;
&lt;br /&gt;
===Description of a Classic Skin===&lt;br /&gt;
Classic skins are skins that adhere to the Winamp 2 style model. Classic skins are easier to create than Modern skins but do not allow the author to change the form or function of the player. Classic authors may only replace a standard set of images that alter the player's visual appearance.&lt;br /&gt;
&lt;br /&gt;
A lot of people get really excited when they find out that they can change the look of Winamp through skinning. The problem is they get turned off once they hit a roadblock, be it what to do next, hit a problem submitting to Winamp.com, or indeed, just figuring out how to get started. So here we have a set of simple steps that holds your hand from initial idea to finished masterpiece. Note: Cool kids still use (and create) classic skins. Good luck!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Individual Components===&lt;br /&gt;
&lt;br /&gt;
#[[The Base Skin]]&lt;br /&gt;
#[[Main|Paint the Main Window]]&lt;br /&gt;
#[[Equalizer|Paint the Equalizer Window]]&lt;br /&gt;
#[[Playlist|Paint the Playlist Window]]&lt;br /&gt;
#[[Mini-browser|Paint the Minibrowser Window]]&lt;br /&gt;
#[[AVS|Paint the AVS Window]]&lt;br /&gt;
#[[For_Winamp_2.9/5.x|Paint the Winamp 2.9/5.x Windows]]&lt;br /&gt;
#[[Creating Custom Cursors|Create Custom Cursors]]&lt;br /&gt;
#[[Editing the Configuration Files|Edit the Configuration Files]]&lt;br /&gt;
#[[WSZ Files|Compress to .WSZ format]]&lt;br /&gt;
#[[Submitting Your Skin to Winamp.com|Submit to Winamp.com]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Creating Modern Skins==&lt;br /&gt;
&lt;br /&gt;
===Description/Overview of Modern Skinning===&lt;br /&gt;
&lt;br /&gt;
Modern or Freeform skins were originally designed to work with Winamp3. What separates them from the average skin is the fact that they are not confined to the classic rectangular shape. In fact they can be any shape you want them to be and you can put the Winamp control buttons anywhere you want. Some skinners have even added extra buttons that extend the functionality of Winamp right there on the skin. Sounds too good to be true huh? Well these skins require a bit more coding to make and some of the graphics that go into them are quite large. Consequently, Freeform skins may take a bit longer to download from our site and they may take a few extra seconds to load when you switch from one skin to another. But trust me when I say that Freeform skins are worth the extra time and effort. Skin developers have done some incredible things with these skins. You have to check them out.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Tools Needed to Build a Modern Skin===&lt;br /&gt;
*'''[http://download.nullsoft.com/winamp/plugin-dev/WaSDP_1.1.exe Winamp Skin Development Pack]'''&lt;br /&gt;
*[[Color Editor]]&lt;br /&gt;
&lt;br /&gt;
===Individual Components===&lt;br /&gt;
&lt;br /&gt;
*[[Modern Skin: Intro|Intro]]&lt;br /&gt;
*[[Modern Skin: Winamp 2 to W3+|Winamp 2 to Winamp 3+]]&lt;br /&gt;
*[[Modern Skin: Simple Skin Tutorial|Simple Skin Tutorial]]&lt;br /&gt;
*[[Modern Skin: XML Intro|XML Intro]]&lt;br /&gt;
*[[Modern Skin: Simple Skin Tutorial (Continued)|Simple Skin Tutorial (Continued)]]&lt;br /&gt;
*[[Modern Skin: Container| Container]]&lt;br /&gt;
*[[Modern Skin: Group|Group]]&lt;br /&gt;
*[[Modern Skin: Relative Positioning| Relative Positioning]]&lt;br /&gt;
*[[Modern Skin: Complex Skin|Complex Skin]]&lt;br /&gt;
*[[Modern Skin: Non-Rect Player| Non-Rect Player]]&lt;br /&gt;
*[[Modern Skin: Layer Composition| Layer Composition]]&lt;br /&gt;
*[[Modern Skin: Alpha Channels| Alpha Channels]]&lt;br /&gt;
*[[Modern Skin: Animatedlayer|Animatedlayer]]&lt;br /&gt;
*[[Modern Skin: Snap Points|Snap Points]]&lt;br /&gt;
*[[Modern Skin: Drawers|Drawers]]&lt;br /&gt;
*[[Modern Skin: Skin Scripting| Skin Scripting]]&lt;br /&gt;
*[[Modern Skin: Drawer Scripting| Drawer Scripting]]&lt;br /&gt;
*[[Modern Skin: Animating a Skin|Animating a Skin]]&lt;br /&gt;
*[[Modern Skin: Maki Overview| Maki Overview]]&lt;br /&gt;
*[[Main_Page#Glossary_of_Terms|Glossary]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Downloadable PDF====&lt;br /&gt;
You can [http://media.winamp.com/5541/main/downloads/development/skinsmodern/Winamp-Modern-Skins-Tutorial.pdf download the tutorial] in PDF format for quick reference anytime&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Creating a ClassicPro Skin ==&lt;br /&gt;
ClassicPro skins is a blend of a Classic Winamp skin and a Modern Winamp skin. You don’t need to do any coding to create your skin because all the coding will be done by the ClassicPro plugin. The layout is similar to the Classic Winamp layout but also resizable using a Single-User-Interface ([[SUI]]) to display components.&lt;br /&gt;
[http://cpro.skinconsortium.com/ ClassicPro Official Website]&lt;br /&gt;
[[Creating a ClassicPro Skin]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Developer Resources==&lt;br /&gt;
*[[Articles#Classic_Skins|Classic Skin Articles]]&lt;br /&gt;
*[[Articles#Modern_Skins|Modern Skin Articles]]&lt;br /&gt;
*[[Developers_FAQ#Skin_Developer_FAQ|Skin FAQ]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Community Links==&lt;br /&gt;
*Forums: [http://forums.winamp.com/forumdisplay.php?s=&amp;amp;forumid=5 Classic Skins]&lt;br /&gt;
*Forums: [http://forums.winamp.com/forumdisplay.php?s=&amp;amp;forumid=123 Modern Skins]&lt;br /&gt;
*Forums: [http://forums.winamp.com/forumdisplay.php?s=&amp;amp;forumid=18 Skinning Tips and Tricks]&lt;br /&gt;
*Forums: [http://forums.winamp.com/forumdisplay.php?s=&amp;amp;forumid=12 Arts and Design]&lt;br /&gt;
*Forums: [http://forums.winamp.com/forumdisplay.php?s=&amp;amp;forumid=119 Skin Removal Reporting]&lt;br /&gt;
*Upload: [http://www.winamp.com/user/submit Submit Your Skin]&lt;br /&gt;
**[http://www.winamp.com/user/submit-skin-classic Submit Classic Skin]&lt;br /&gt;
**[http://www.winamp.com/user/submit-skin-modern Submit Modern Skin]&lt;br /&gt;
*Browse: [http://www.winamp.com/skins Download Skins]&lt;/div&gt;</summary>
		<author><name>Pjn123</name></author>	</entry>

	<entry>
		<id>http://wiki.winamp.com/wiki/Skin_Developer</id>
		<title>Skin Developer</title>
		<link rel="alternate" type="text/html" href="http://wiki.winamp.com/wiki/Skin_Developer"/>
				<updated>2008-09-25T20:40:23Z</updated>
		
		<summary type="html">&lt;p&gt;Pjn123: /* Creating a ClassicPro Skin */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Breadcrumb''' -- [[Main_Page|Wiki Main]] : [[Skin Developer]] : [[Visual Developer]] : [[Plug-in Developer]] : [[Articles|Articles Page]] : [[Developers FAQ|FAQ]] : [[Main_Page#Glossary_of_Terms|Glossary]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:Skins-logo.png]]&lt;br /&gt;
&lt;br /&gt;
==Skins Overview==&lt;br /&gt;
&lt;br /&gt;
To put it as simply as possible, skins change the way your Winamp player looks. If you want to get fancy and say that it changes the &amp;quot;User Interface&amp;quot; then you can, but really all you need to know to get you started is if you download a new skin, Winamp will put on a little mask and pretend to look different.&lt;br /&gt;
&lt;br /&gt;
==Tools==&lt;br /&gt;
Before creating a complete skin, you will need the following tools. There are some suggestions below, but we don't necessarily endorse or require you to use any of them. We leave you to choose one that you're most comfortable with.&lt;br /&gt;
&lt;br /&gt;
====Bitmap Editor:====&lt;br /&gt;
How else will you &amp;quot;paint&amp;quot; your skins? Must be able to recognize the .BMP format.&lt;br /&gt;
&lt;br /&gt;
''eg. MS Paint, Corel Paint Shop Pro, Adobe Photoshop, Paint.NET, GIMP''&lt;br /&gt;
&lt;br /&gt;
====Text Editor:====&lt;br /&gt;
For use in configuring the fonts and colors of the Mini-browser and Playlist editor. Also used if you do any transparency.&lt;br /&gt;
&lt;br /&gt;
''eg. MS Notepad, TextPad''&lt;br /&gt;
&lt;br /&gt;
====Icon Editor:====&lt;br /&gt;
You will need an Icon editor if you are hardcore and want to edit the cursors and pointers associated with your skin.&lt;br /&gt;
&lt;br /&gt;
''eg. NeoSoft Icon Editor, Icon Edit Pro, Impact Microangelo''&lt;br /&gt;
&lt;br /&gt;
====Zip Compression Tool:====&lt;br /&gt;
Absolutely necessary to publish your skin. Winamp.com will not accept an unzipped skin.&lt;br /&gt;
&lt;br /&gt;
''eg. 7-Zip''&lt;br /&gt;
&lt;br /&gt;
==Creating Classic Skins==&lt;br /&gt;
&lt;br /&gt;
===Description of a Classic Skin===&lt;br /&gt;
Classic skins are skins that adhere to the Winamp 2 style model. Classic skins are easier to create than Modern skins but do not allow the author to change the form or function of the player. Classic authors may only replace a standard set of images that alter the player's visual appearance.&lt;br /&gt;
&lt;br /&gt;
A lot of people get really excited when they find out that they can change the look of Winamp through skinning. The problem is they get turned off once they hit a roadblock, be it what to do next, hit a problem submitting to Winamp.com, or indeed, just figuring out how to get started. So here we have a set of simple steps that holds your hand from initial idea to finished masterpiece. Note: Cool kids still use (and create) classic skins. Good luck!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Individual Components===&lt;br /&gt;
&lt;br /&gt;
#[[The Base Skin]]&lt;br /&gt;
#[[Main|Paint the Main Window]]&lt;br /&gt;
#[[Equalizer|Paint the Equalizer Window]]&lt;br /&gt;
#[[Playlist|Paint the Playlist Window]]&lt;br /&gt;
#[[Mini-browser|Paint the Minibrowser Window]]&lt;br /&gt;
#[[AVS|Paint the AVS Window]]&lt;br /&gt;
#[[For_Winamp_2.9/5.x|Paint the Winamp 2.9/5.x Windows]]&lt;br /&gt;
#[[Creating Custom Cursors|Create Custom Cursors]]&lt;br /&gt;
#[[Editing the Configuration Files|Edit the Configuration Files]]&lt;br /&gt;
#[[WSZ Files|Compress to .WSZ format]]&lt;br /&gt;
#[[Submitting Your Skin to Winamp.com|Submit to Winamp.com]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Creating Modern Skins==&lt;br /&gt;
&lt;br /&gt;
===Description/Overview of Modern Skinning===&lt;br /&gt;
&lt;br /&gt;
Modern or Freeform skins were originally designed to work with Winamp3. What separates them from the average skin is the fact that they are not confined to the classic rectangular shape. In fact they can be any shape you want them to be and you can put the Winamp control buttons anywhere you want. Some skinners have even added extra buttons that extend the functionality of Winamp right there on the skin. Sounds too good to be true huh? Well these skins require a bit more coding to make and some of the graphics that go into them are quite large. Consequently, Freeform skins may take a bit longer to download from our site and they may take a few extra seconds to load when you switch from one skin to another. But trust me when I say that Freeform skins are worth the extra time and effort. Skin developers have done some incredible things with these skins. You have to check them out.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Tools Needed to Build a Modern Skin===&lt;br /&gt;
*'''[http://download.nullsoft.com/winamp/plugin-dev/WaSDP_1.1.exe Winamp Skin Development Pack]'''&lt;br /&gt;
*[[Color Editor]]&lt;br /&gt;
&lt;br /&gt;
===Individual Components===&lt;br /&gt;
&lt;br /&gt;
*[[Modern Skin: Intro|Intro]]&lt;br /&gt;
*[[Modern Skin: Winamp 2 to W3+|Winamp 2 to Winamp 3+]]&lt;br /&gt;
*[[Modern Skin: Simple Skin Tutorial|Simple Skin Tutorial]]&lt;br /&gt;
*[[Modern Skin: XML Intro|XML Intro]]&lt;br /&gt;
*[[Modern Skin: Simple Skin Tutorial (Continued)|Simple Skin Tutorial (Continued)]]&lt;br /&gt;
*[[Modern Skin: Container| Container]]&lt;br /&gt;
*[[Modern Skin: Group|Group]]&lt;br /&gt;
*[[Modern Skin: Relative Positioning| Relative Positioning]]&lt;br /&gt;
*[[Modern Skin: Complex Skin|Complex Skin]]&lt;br /&gt;
*[[Modern Skin: Non-Rect Player| Non-Rect Player]]&lt;br /&gt;
*[[Modern Skin: Layer Composition| Layer Composition]]&lt;br /&gt;
*[[Modern Skin: Alpha Channels| Alpha Channels]]&lt;br /&gt;
*[[Modern Skin: Animatedlayer|Animatedlayer]]&lt;br /&gt;
*[[Modern Skin: Snap Points|Snap Points]]&lt;br /&gt;
*[[Modern Skin: Drawers|Drawers]]&lt;br /&gt;
*[[Modern Skin: Skin Scripting| Skin Scripting]]&lt;br /&gt;
*[[Modern Skin: Drawer Scripting| Drawer Scripting]]&lt;br /&gt;
*[[Modern Skin: Animating a Skin|Animating a Skin]]&lt;br /&gt;
*[[Modern Skin: Maki Overview| Maki Overview]]&lt;br /&gt;
*[[Main_Page#Glossary_of_Terms|Glossary]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Downloadable PDF====&lt;br /&gt;
You can [http://media.winamp.com/5541/main/downloads/development/skinsmodern/Winamp-Modern-Skins-Tutorial.pdf download the tutorial] in PDF format for quick reference anytime&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Creating a ClassicPro Skin ==&lt;br /&gt;
ClassicPro skins is a blend of a Classic Winamp skin and a Modern Winamp skin. You don’t need to do any coding to create your skin because all the coding will be done by the ClassicPro plugin. The layout is similar to the Classic Winamp layout but also resizable using a Single-User-Interface ([[SUI]]) to display components.&lt;br /&gt;
[http://cpro.skinconsortium.com/ ClassicPro Official Website]&lt;br /&gt;
&lt;br /&gt;
[[Creating a ClassicPro Skin]]&lt;br /&gt;
&lt;br /&gt;
==Tutorials==&lt;br /&gt;
* [http://cpro.skinconsortium.com/index.php?content=manual Skinners Guide to ClassicPro] by pjn123&lt;br /&gt;
** This is the manual released by the developers&lt;br /&gt;
* [http://wilian.deviantart.com/art/ClassicPro-Template-pack-95549517 ClassicPro Template pack and Manual] by Wilian &amp;amp; Veroka&lt;br /&gt;
** This is a more in depth look at creating cPro skins. Really great for beginners.&lt;br /&gt;
** Comes with great base skin for you to start off with&lt;br /&gt;
&lt;br /&gt;
==Developer Resources==&lt;br /&gt;
*[[Articles#Classic_Skins|Classic Skin Articles]]&lt;br /&gt;
*[[Articles#Modern_Skins|Modern Skin Articles]]&lt;br /&gt;
*[[Developers_FAQ#Skin_Developer_FAQ|Skin FAQ]]&lt;br /&gt;
&lt;br /&gt;
==Community Links==&lt;br /&gt;
*Forums: [http://forums.winamp.com/forumdisplay.php?s=&amp;amp;forumid=5 Classic Skins]&lt;br /&gt;
*Forums: [http://forums.winamp.com/forumdisplay.php?s=&amp;amp;forumid=123 Modern Skins]&lt;br /&gt;
*Forums: [http://forums.winamp.com/forumdisplay.php?s=&amp;amp;forumid=18 Skinning Tips and Tricks]&lt;br /&gt;
*Forums: [http://forums.winamp.com/forumdisplay.php?s=&amp;amp;forumid=12 Arts and Design]&lt;br /&gt;
*Forums: [http://forums.winamp.com/forumdisplay.php?s=&amp;amp;forumid=119 Skin Removal Reporting]&lt;br /&gt;
*Upload: [http://www.winamp.com/user/submit Submit Your Skin]&lt;br /&gt;
**[http://www.winamp.com/user/submit-skin-classic Submit Classic Skin]&lt;br /&gt;
**[http://www.winamp.com/user/submit-skin-modern Submit Modern Skin]&lt;br /&gt;
*Browse: [http://www.winamp.com/skins Download Skins]&lt;/div&gt;</summary>
		<author><name>Pjn123</name></author>	</entry>

	<entry>
		<id>http://wiki.winamp.com/wiki/Skin_Developer</id>
		<title>Skin Developer</title>
		<link rel="alternate" type="text/html" href="http://wiki.winamp.com/wiki/Skin_Developer"/>
				<updated>2008-09-25T20:37:37Z</updated>
		
		<summary type="html">&lt;p&gt;Pjn123: /* Creating a Classic Skin Pro */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Breadcrumb''' -- [[Main_Page|Wiki Main]] : [[Skin Developer]] : [[Visual Developer]] : [[Plug-in Developer]] : [[Articles|Articles Page]] : [[Developers FAQ|FAQ]] : [[Main_Page#Glossary_of_Terms|Glossary]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:Skins-logo.png]]&lt;br /&gt;
&lt;br /&gt;
==Skins Overview==&lt;br /&gt;
&lt;br /&gt;
To put it as simply as possible, skins change the way your Winamp player looks. If you want to get fancy and say that it changes the &amp;quot;User Interface&amp;quot; then you can, but really all you need to know to get you started is if you download a new skin, Winamp will put on a little mask and pretend to look different.&lt;br /&gt;
&lt;br /&gt;
==Tools==&lt;br /&gt;
Before creating a complete skin, you will need the following tools. There are some suggestions below, but we don't necessarily endorse or require you to use any of them. We leave you to choose one that you're most comfortable with.&lt;br /&gt;
&lt;br /&gt;
====Bitmap Editor:====&lt;br /&gt;
How else will you &amp;quot;paint&amp;quot; your skins? Must be able to recognize the .BMP format.&lt;br /&gt;
&lt;br /&gt;
''eg. MS Paint, Corel Paint Shop Pro, Adobe Photoshop, Paint.NET, GIMP''&lt;br /&gt;
&lt;br /&gt;
====Text Editor:====&lt;br /&gt;
For use in configuring the fonts and colors of the Mini-browser and Playlist editor. Also used if you do any transparency.&lt;br /&gt;
&lt;br /&gt;
''eg. MS Notepad, TextPad''&lt;br /&gt;
&lt;br /&gt;
====Icon Editor:====&lt;br /&gt;
You will need an Icon editor if you are hardcore and want to edit the cursors and pointers associated with your skin.&lt;br /&gt;
&lt;br /&gt;
''eg. NeoSoft Icon Editor, Icon Edit Pro, Impact Microangelo''&lt;br /&gt;
&lt;br /&gt;
====Zip Compression Tool:====&lt;br /&gt;
Absolutely necessary to publish your skin. Winamp.com will not accept an unzipped skin.&lt;br /&gt;
&lt;br /&gt;
''eg. 7-Zip''&lt;br /&gt;
&lt;br /&gt;
==Creating Classic Skins==&lt;br /&gt;
&lt;br /&gt;
===Description of a Classic Skin===&lt;br /&gt;
Classic skins are skins that adhere to the Winamp 2 style model. Classic skins are easier to create than Modern skins but do not allow the author to change the form or function of the player. Classic authors may only replace a standard set of images that alter the player's visual appearance.&lt;br /&gt;
&lt;br /&gt;
A lot of people get really excited when they find out that they can change the look of Winamp through skinning. The problem is they get turned off once they hit a roadblock, be it what to do next, hit a problem submitting to Winamp.com, or indeed, just figuring out how to get started. So here we have a set of simple steps that holds your hand from initial idea to finished masterpiece. Note: Cool kids still use (and create) classic skins. Good luck!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Individual Components===&lt;br /&gt;
&lt;br /&gt;
#[[The Base Skin]]&lt;br /&gt;
#[[Main|Paint the Main Window]]&lt;br /&gt;
#[[Equalizer|Paint the Equalizer Window]]&lt;br /&gt;
#[[Playlist|Paint the Playlist Window]]&lt;br /&gt;
#[[Mini-browser|Paint the Minibrowser Window]]&lt;br /&gt;
#[[AVS|Paint the AVS Window]]&lt;br /&gt;
#[[For_Winamp_2.9/5.x|Paint the Winamp 2.9/5.x Windows]]&lt;br /&gt;
#[[Creating Custom Cursors|Create Custom Cursors]]&lt;br /&gt;
#[[Editing the Configuration Files|Edit the Configuration Files]]&lt;br /&gt;
#[[WSZ Files|Compress to .WSZ format]]&lt;br /&gt;
#[[Submitting Your Skin to Winamp.com|Submit to Winamp.com]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Creating Modern Skins==&lt;br /&gt;
&lt;br /&gt;
===Description/Overview of Modern Skinning===&lt;br /&gt;
&lt;br /&gt;
Modern or Freeform skins were originally designed to work with Winamp3. What separates them from the average skin is the fact that they are not confined to the classic rectangular shape. In fact they can be any shape you want them to be and you can put the Winamp control buttons anywhere you want. Some skinners have even added extra buttons that extend the functionality of Winamp right there on the skin. Sounds too good to be true huh? Well these skins require a bit more coding to make and some of the graphics that go into them are quite large. Consequently, Freeform skins may take a bit longer to download from our site and they may take a few extra seconds to load when you switch from one skin to another. But trust me when I say that Freeform skins are worth the extra time and effort. Skin developers have done some incredible things with these skins. You have to check them out.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Tools Needed to Build a Modern Skin===&lt;br /&gt;
*'''[http://download.nullsoft.com/winamp/plugin-dev/WaSDP_1.1.exe Winamp Skin Development Pack]'''&lt;br /&gt;
*[[Color Editor]]&lt;br /&gt;
&lt;br /&gt;
===Individual Components===&lt;br /&gt;
&lt;br /&gt;
*[[Modern Skin: Intro|Intro]]&lt;br /&gt;
*[[Modern Skin: Winamp 2 to W3+|Winamp 2 to Winamp 3+]]&lt;br /&gt;
*[[Modern Skin: Simple Skin Tutorial|Simple Skin Tutorial]]&lt;br /&gt;
*[[Modern Skin: XML Intro|XML Intro]]&lt;br /&gt;
*[[Modern Skin: Simple Skin Tutorial (Continued)|Simple Skin Tutorial (Continued)]]&lt;br /&gt;
*[[Modern Skin: Container| Container]]&lt;br /&gt;
*[[Modern Skin: Group|Group]]&lt;br /&gt;
*[[Modern Skin: Relative Positioning| Relative Positioning]]&lt;br /&gt;
*[[Modern Skin: Complex Skin|Complex Skin]]&lt;br /&gt;
*[[Modern Skin: Non-Rect Player| Non-Rect Player]]&lt;br /&gt;
*[[Modern Skin: Layer Composition| Layer Composition]]&lt;br /&gt;
*[[Modern Skin: Alpha Channels| Alpha Channels]]&lt;br /&gt;
*[[Modern Skin: Animatedlayer|Animatedlayer]]&lt;br /&gt;
*[[Modern Skin: Snap Points|Snap Points]]&lt;br /&gt;
*[[Modern Skin: Drawers|Drawers]]&lt;br /&gt;
*[[Modern Skin: Skin Scripting| Skin Scripting]]&lt;br /&gt;
*[[Modern Skin: Drawer Scripting| Drawer Scripting]]&lt;br /&gt;
*[[Modern Skin: Animating a Skin|Animating a Skin]]&lt;br /&gt;
*[[Modern Skin: Maki Overview| Maki Overview]]&lt;br /&gt;
*[[Main_Page#Glossary_of_Terms|Glossary]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Downloadable PDF====&lt;br /&gt;
You can [http://media.winamp.com/5541/main/downloads/development/skinsmodern/Winamp-Modern-Skins-Tutorial.pdf download the tutorial] in PDF format for quick reference anytime&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==[[Creating a ClassicPro Skin]]==&lt;br /&gt;
ClassicPro skins is a blend of a Classic Winamp skin and a Modern Winamp skin. You don’t need to do any coding to create your skin because all the coding will be done by the ClassicPro plugin. The layout is similar to the Classic Winamp layout but also resizable using a Single-User-Interface ([[SUI]]) to display components.&lt;br /&gt;
[http://cpro.skinconsortium.com/ ClassicPro Official Website]&lt;br /&gt;
&lt;br /&gt;
==Tutorials==&lt;br /&gt;
* [http://cpro.skinconsortium.com/index.php?content=manual Skinners Guide to ClassicPro] by pjn123&lt;br /&gt;
** This is the manual released by the developers&lt;br /&gt;
* [http://wilian.deviantart.com/art/ClassicPro-Template-pack-95549517 ClassicPro Template pack and Manual] by Wilian &amp;amp; Veroka&lt;br /&gt;
** This is a more in depth look at creating cPro skins. Really great for beginners.&lt;br /&gt;
** Comes with great base skin for you to start off with&lt;br /&gt;
&lt;br /&gt;
==Developer Resources==&lt;br /&gt;
*[[Articles#Classic_Skins|Classic Skin Articles]]&lt;br /&gt;
*[[Articles#Modern_Skins|Modern Skin Articles]]&lt;br /&gt;
*[[Developers_FAQ#Skin_Developer_FAQ|Skin FAQ]]&lt;br /&gt;
&lt;br /&gt;
==Community Links==&lt;br /&gt;
*Forums: [http://forums.winamp.com/forumdisplay.php?s=&amp;amp;forumid=5 Classic Skins]&lt;br /&gt;
*Forums: [http://forums.winamp.com/forumdisplay.php?s=&amp;amp;forumid=123 Modern Skins]&lt;br /&gt;
*Forums: [http://forums.winamp.com/forumdisplay.php?s=&amp;amp;forumid=18 Skinning Tips and Tricks]&lt;br /&gt;
*Forums: [http://forums.winamp.com/forumdisplay.php?s=&amp;amp;forumid=12 Arts and Design]&lt;br /&gt;
*Forums: [http://forums.winamp.com/forumdisplay.php?s=&amp;amp;forumid=119 Skin Removal Reporting]&lt;br /&gt;
*Upload: [http://www.winamp.com/user/submit Submit Your Skin]&lt;br /&gt;
**[http://www.winamp.com/user/submit-skin-classic Submit Classic Skin]&lt;br /&gt;
**[http://www.winamp.com/user/submit-skin-modern Submit Modern Skin]&lt;br /&gt;
*Browse: [http://www.winamp.com/skins Download Skins]&lt;/div&gt;</summary>
		<author><name>Pjn123</name></author>	</entry>

	<entry>
		<id>http://wiki.winamp.com/wiki/Skin_Developer</id>
		<title>Skin Developer</title>
		<link rel="alternate" type="text/html" href="http://wiki.winamp.com/wiki/Skin_Developer"/>
				<updated>2008-09-25T20:28:32Z</updated>
		
		<summary type="html">&lt;p&gt;Pjn123: /* Bitmap Editor: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Breadcrumb''' -- [[Main_Page|Wiki Main]] : [[Skin Developer]] : [[Visual Developer]] : [[Plug-in Developer]] : [[Articles|Articles Page]] : [[Developers FAQ|FAQ]] : [[Main_Page#Glossary_of_Terms|Glossary]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:Skins-logo.png]]&lt;br /&gt;
&lt;br /&gt;
==Skins Overview==&lt;br /&gt;
&lt;br /&gt;
To put it as simply as possible, skins change the way your Winamp player looks. If you want to get fancy and say that it changes the &amp;quot;User Interface&amp;quot; then you can, but really all you need to know to get you started is if you download a new skin, Winamp will put on a little mask and pretend to look different.&lt;br /&gt;
&lt;br /&gt;
==Tools==&lt;br /&gt;
Before creating a complete skin, you will need the following tools. There are some suggestions below, but we don't necessarily endorse or require you to use any of them. We leave you to choose one that you're most comfortable with.&lt;br /&gt;
&lt;br /&gt;
====Bitmap Editor:====&lt;br /&gt;
How else will you &amp;quot;paint&amp;quot; your skins? Must be able to recognize the .BMP format.&lt;br /&gt;
&lt;br /&gt;
''eg. MS Paint, Corel Paint Shop Pro, Adobe Photoshop, Paint.NET, GIMP''&lt;br /&gt;
&lt;br /&gt;
====Text Editor:====&lt;br /&gt;
For use in configuring the fonts and colors of the Mini-browser and Playlist editor. Also used if you do any transparency.&lt;br /&gt;
&lt;br /&gt;
''eg. MS Notepad, TextPad''&lt;br /&gt;
&lt;br /&gt;
====Icon Editor:====&lt;br /&gt;
You will need an Icon editor if you are hardcore and want to edit the cursors and pointers associated with your skin.&lt;br /&gt;
&lt;br /&gt;
''eg. NeoSoft Icon Editor, Icon Edit Pro, Impact Microangelo''&lt;br /&gt;
&lt;br /&gt;
====Zip Compression Tool:====&lt;br /&gt;
Absolutely necessary to publish your skin. Winamp.com will not accept an unzipped skin.&lt;br /&gt;
&lt;br /&gt;
''eg. 7-Zip''&lt;br /&gt;
&lt;br /&gt;
==Creating Classic Skins==&lt;br /&gt;
&lt;br /&gt;
===Description of a Classic Skin===&lt;br /&gt;
Classic skins are skins that adhere to the Winamp 2 style model. Classic skins are easier to create than Modern skins but do not allow the author to change the form or function of the player. Classic authors may only replace a standard set of images that alter the player's visual appearance.&lt;br /&gt;
&lt;br /&gt;
A lot of people get really excited when they find out that they can change the look of Winamp through skinning. The problem is they get turned off once they hit a roadblock, be it what to do next, hit a problem submitting to Winamp.com, or indeed, just figuring out how to get started. So here we have a set of simple steps that holds your hand from initial idea to finished masterpiece. Note: Cool kids still use (and create) classic skins. Good luck!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Individual Components===&lt;br /&gt;
&lt;br /&gt;
#[[The Base Skin]]&lt;br /&gt;
#[[Main|Paint the Main Window]]&lt;br /&gt;
#[[Equalizer|Paint the Equalizer Window]]&lt;br /&gt;
#[[Playlist|Paint the Playlist Window]]&lt;br /&gt;
#[[Mini-browser|Paint the Minibrowser Window]]&lt;br /&gt;
#[[AVS|Paint the AVS Window]]&lt;br /&gt;
#[[For_Winamp_2.9/5.x|Paint the Winamp 2.9/5.x Windows]]&lt;br /&gt;
#[[Creating Custom Cursors|Create Custom Cursors]]&lt;br /&gt;
#[[Editing the Configuration Files|Edit the Configuration Files]]&lt;br /&gt;
#[[WSZ Files|Compress to .WSZ format]]&lt;br /&gt;
#[[Submitting Your Skin to Winamp.com|Submit to Winamp.com]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Creating Modern Skins==&lt;br /&gt;
&lt;br /&gt;
===Description/Overview of Modern Skinning===&lt;br /&gt;
&lt;br /&gt;
Modern or Freeform skins were originally designed to work with Winamp3. What separates them from the average skin is the fact that they are not confined to the classic rectangular shape. In fact they can be any shape you want them to be and you can put the Winamp control buttons anywhere you want. Some skinners have even added extra buttons that extend the functionality of Winamp right there on the skin. Sounds too good to be true huh? Well these skins require a bit more coding to make and some of the graphics that go into them are quite large. Consequently, Freeform skins may take a bit longer to download from our site and they may take a few extra seconds to load when you switch from one skin to another. But trust me when I say that Freeform skins are worth the extra time and effort. Skin developers have done some incredible things with these skins. You have to check them out.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Tools Needed to Build a Modern Skin===&lt;br /&gt;
*'''[http://download.nullsoft.com/winamp/plugin-dev/WaSDP_1.1.exe Winamp Skin Development Pack]'''&lt;br /&gt;
*[[Color Editor]]&lt;br /&gt;
&lt;br /&gt;
===Individual Components===&lt;br /&gt;
&lt;br /&gt;
*[[Modern Skin: Intro|Intro]]&lt;br /&gt;
*[[Modern Skin: Winamp 2 to W3+|Winamp 2 to Winamp 3+]]&lt;br /&gt;
*[[Modern Skin: Simple Skin Tutorial|Simple Skin Tutorial]]&lt;br /&gt;
*[[Modern Skin: XML Intro|XML Intro]]&lt;br /&gt;
*[[Modern Skin: Simple Skin Tutorial (Continued)|Simple Skin Tutorial (Continued)]]&lt;br /&gt;
*[[Modern Skin: Container| Container]]&lt;br /&gt;
*[[Modern Skin: Group|Group]]&lt;br /&gt;
*[[Modern Skin: Relative Positioning| Relative Positioning]]&lt;br /&gt;
*[[Modern Skin: Complex Skin|Complex Skin]]&lt;br /&gt;
*[[Modern Skin: Non-Rect Player| Non-Rect Player]]&lt;br /&gt;
*[[Modern Skin: Layer Composition| Layer Composition]]&lt;br /&gt;
*[[Modern Skin: Alpha Channels| Alpha Channels]]&lt;br /&gt;
*[[Modern Skin: Animatedlayer|Animatedlayer]]&lt;br /&gt;
*[[Modern Skin: Snap Points|Snap Points]]&lt;br /&gt;
*[[Modern Skin: Drawers|Drawers]]&lt;br /&gt;
*[[Modern Skin: Skin Scripting| Skin Scripting]]&lt;br /&gt;
*[[Modern Skin: Drawer Scripting| Drawer Scripting]]&lt;br /&gt;
*[[Modern Skin: Animating a Skin|Animating a Skin]]&lt;br /&gt;
*[[Modern Skin: Maki Overview| Maki Overview]]&lt;br /&gt;
*[[Main_Page#Glossary_of_Terms|Glossary]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Downloadable PDF====&lt;br /&gt;
You can [http://media.winamp.com/5541/main/downloads/development/skinsmodern/Winamp-Modern-Skins-Tutorial.pdf download the tutorial] in PDF format for quick reference anytime&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Creating a Classic Skin Pro==&lt;br /&gt;
&lt;br /&gt;
===Description of a cPro Skin===&lt;br /&gt;
TBD&lt;br /&gt;
&lt;br /&gt;
===Tools Needed to Build a cPro Skin===&lt;br /&gt;
TBD&lt;br /&gt;
&lt;br /&gt;
===Tutorial===&lt;br /&gt;
TBD&lt;br /&gt;
&lt;br /&gt;
==Developer Resources==&lt;br /&gt;
*[[Articles#Classic_Skins|Classic Skin Articles]]&lt;br /&gt;
*[[Articles#Modern_Skins|Modern Skin Articles]]&lt;br /&gt;
*[[Developers_FAQ#Skin_Developer_FAQ|Skin FAQ]]&lt;br /&gt;
&lt;br /&gt;
==Community Links==&lt;br /&gt;
*Forums: [http://forums.winamp.com/forumdisplay.php?s=&amp;amp;forumid=5 Classic Skins]&lt;br /&gt;
*Forums: [http://forums.winamp.com/forumdisplay.php?s=&amp;amp;forumid=123 Modern Skins]&lt;br /&gt;
*Forums: [http://forums.winamp.com/forumdisplay.php?s=&amp;amp;forumid=18 Skinning Tips and Tricks]&lt;br /&gt;
*Forums: [http://forums.winamp.com/forumdisplay.php?s=&amp;amp;forumid=12 Arts and Design]&lt;br /&gt;
*Forums: [http://forums.winamp.com/forumdisplay.php?s=&amp;amp;forumid=119 Skin Removal Reporting]&lt;br /&gt;
*Upload: [http://www.winamp.com/user/submit Submit Your Skin]&lt;br /&gt;
**[http://www.winamp.com/user/submit-skin-classic Submit Classic Skin]&lt;br /&gt;
**[http://www.winamp.com/user/submit-skin-modern Submit Modern Skin]&lt;br /&gt;
*Browse: [http://www.winamp.com/skins Download Skins]&lt;/div&gt;</summary>
		<author><name>Pjn123</name></author>	</entry>

	<entry>
		<id>http://wiki.winamp.com/wiki/Color_Editor</id>
		<title>Color Editor</title>
		<link rel="alternate" type="text/html" href="http://wiki.winamp.com/wiki/Color_Editor"/>
				<updated>2008-09-24T22:04:00Z</updated>
		
		<summary type="html">&lt;p&gt;Pjn123: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Where is the themes saved? ==&lt;br /&gt;
When you save your themes it will save in one of the following places, depending on what type of installation of Winamp you have:&lt;br /&gt;
* Multi-User Settings Install (default)&lt;br /&gt;
** '''%appdata%/winamp/Plugins/Freeform/wacs/coloreditor/data'''&lt;br /&gt;
* Winamp folder Settings&lt;br /&gt;
** '''x:/.../winamp/Plugins/Freeform/wacs/coloreditor/data'''&lt;br /&gt;
&lt;br /&gt;
== Hiden features ==&lt;br /&gt;
=== Multi Slider move ===&lt;br /&gt;
When you move one of the sliders you can press Ctrl or Shift to move the other 2 sliders too.&lt;br /&gt;
This is sometimes usefull of you just want to finetune a certain color.&lt;br /&gt;
* '''Ctrl'''+Slide&lt;br /&gt;
** All sliders have the same value.&lt;br /&gt;
* '''Shift'''+Slide&lt;br /&gt;
** The other 2 sliders will now move relative to the one your moving.&lt;br /&gt;
&lt;br /&gt;
== Winamp 5 Color Editor F.A.Q. ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''1. Why can't I edit my skin's color themes ? Why is there a “locked” icon in front of them ?&lt;br /&gt;
'''&lt;br /&gt;
A skin may be zipped, and so the color editor cannot 1) unzip your skin, 2) change the themes definitions, and 3) rezip the skin. Even if it could, or if the skin was unzipped in the first place, the color editor would have to find the file that defines the color themes, and this may be any xml file in the skin.&lt;br /&gt;
&lt;br /&gt;
The color editor's philosophy is therefore not to touch the skins directly : the only editable color themes are those you create. To edit a color theme, you should clone it first !&lt;br /&gt;
&lt;br /&gt;
'''2. How can I send my colorthemes to someone without making him edit his skin ?'''&lt;br /&gt;
&lt;br /&gt;
You should first export your colorthemes using the export button on the color editor, and then install the exported file into the Winamp5 colorthemes directory located at : &lt;br /&gt;
&lt;br /&gt;
path_to_winamp\plugins\ColorThemes\name_of_the_skin\&lt;br /&gt;
&lt;br /&gt;
The file you install should have the xml extention and a somewhat unique name so that it does not conflicts with other custom themes packs (ie: not “themes.xml”).&lt;br /&gt;
&lt;br /&gt;
Upon reloading Winamp5, the themes should now appear in the colorthemes selection box. Note that they will not be editable (see faq 1 above).&lt;br /&gt;
&lt;br /&gt;
'''3. Why does going from RGB to HSL sometimes slightly changes my color group setting ?'''&lt;br /&gt;
&lt;br /&gt;
Although all RGB colors have an HSL equivalent and vice-versa, these are not one-to-one equivalents (two RGB colors may have the same HSL equivalent). This is a consequence of the RGB/HSL conversion algorithms.&lt;br /&gt;
&lt;br /&gt;
'''4. How do I create a new color group ?'''&lt;br /&gt;
&lt;br /&gt;
Color groups are an integral part of the skin, they change for each skin, and they are defined by the skinner. The color editor's purpose is to let you assign new color values for these color groups, not to let you create more groups in the skin you are using or for the skin you are making.&lt;br /&gt;
&lt;br /&gt;
'''5. How do I find what color group is used by a given widget ?'''&lt;br /&gt;
&lt;br /&gt;
The only way to do this for now is to try each color group. A later version may let you flash a specific color group in the skin, but this will be very cpu-intensive (changing a color group reloads all the skins images), but since a given widget may implicitly use more than one colortheme, we would need to have the skinner list these colorthemes explicitly for each widget to be able to let you find this out more easily. This would be a daunting task for the skinner, and so this is not a viable option.&lt;br /&gt;
&lt;br /&gt;
'''6. Why are there widgets for which there is no color group ?'''&lt;br /&gt;
&lt;br /&gt;
Either the skinner forgot to define a color group for the graphical elements used by the widget, or you have missed it.&lt;br /&gt;
&lt;br /&gt;
'''7. What is the difference between “Max Grayscale” and “Avg Grayscale” ?'''&lt;br /&gt;
&lt;br /&gt;
Max grayscale is computed by getting the maximum value of each red, green and blue color channels, and assigning this value to each three (each pixel is done independently). &lt;br /&gt;
Avg (average) grayscale is computed by getting the average value of the red, green and blue color channels, and assigning this value to each three (each pixel is done independently).&lt;br /&gt;
&lt;br /&gt;
'''8. What is “Saturate channels” ?'''&lt;br /&gt;
&lt;br /&gt;
“Saturate channels” adds 127 to each pixels's color channel.&lt;br /&gt;
&lt;br /&gt;
'''9. Why is the resulting color for the graphical element not the color that I see above each slider ?'''&lt;br /&gt;
&lt;br /&gt;
The color you see above each slider is the color you get for a pixel that has the “Preview source color” values for its color channels. To get an accurate result, you should select a previous source color that is approximately the average color of the graphical element you are tweaking. For instance, if you are changing a graphical element that has only red (ie: it has 0 in its green and blue channels), no matter the poxition of the green and blue sliders, it will not change anything in the element. If that happens, you can use one of the two grayscale checkboxes, so that the element will be grayscaled before the color tweak is applied, or you can use the saturate channels checkbox to boost its color channels so that all three sliders will have an effect. &lt;br /&gt;
&lt;br /&gt;
'''10. Why does the red (or green or blue) slider has no effect on some widget ?'''&lt;br /&gt;
&lt;br /&gt;
See faq 9.&lt;br /&gt;
&lt;br /&gt;
Why does the red green and blue values for each color group goes from -4096 to +4096 rather than from 0 to 255 ?&lt;br /&gt;
&lt;br /&gt;
The red green and blue values in the xml for a color theme are not a direct representation of the color you get (otherwise, it would make all pixels this value!), they are (arbitrarilly ranged) values that are used to multiply (or divide) each pixels's channel.&lt;br /&gt;
&lt;br /&gt;
'''11. Why does the hue slider cycles twice over the hue circle ?'''&lt;br /&gt;
&lt;br /&gt;
The hue slider works just as the RGB sliders do, it changes each pixel color starting from its original channel values. The hue value you select makes the pixel's hue be shifted left or right over the hue circle just as the red (or green or blue) sliders shifts the red (or green or blue) value left or right in the original pixel, and so you can go one complete circle in one direction, or one complete circle in the other. In effect, where photoshop lets you go from 0° to 360° on the hue circle, the color editor lets you go from -360° to +360°&lt;br /&gt;
&lt;br /&gt;
'''12. Why do the saturation and luminance sliders show a gradient between 2 colors rather than the standard color-to-white and color-to-black gradients ?'''&lt;br /&gt;
&lt;br /&gt;
Here too, the sliders let you change the original pixels one direction or another, so the saturation slider lets you desaturate a pixel beyond the zero limit (and the luminance slider lets you subtract luminosity bellow the zero limit) of a standard HSL algorithm. In effect, where photoshop lets you go from 0 to 100% for these two components, the color editor lets you go from -100% to +100%.&lt;/div&gt;</summary>
		<author><name>Pjn123</name></author>	</entry>

	<entry>
		<id>http://wiki.winamp.com/wiki/Creating_a_ClassicPro_Skin</id>
		<title>Creating a ClassicPro Skin</title>
		<link rel="alternate" type="text/html" href="http://wiki.winamp.com/wiki/Creating_a_ClassicPro_Skin"/>
				<updated>2008-09-24T21:21:57Z</updated>
		
		<summary type="html">&lt;p&gt;Pjn123: New page: ==What is ClassicPro?== ClassicPro is a plugin for Winamp that will allow you to use a new type of skin in Winamp Media Player. What makes this type of skin different from normal modern sk...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==What is ClassicPro?==&lt;br /&gt;
ClassicPro is a plugin for Winamp that will allow you to use a new type of skin in Winamp Media Player. What makes this type of skin different from normal modern skins is that all the coding stuff is already done in one central place so you don't need to be a programmer to create a great Winamp skin anymore! &lt;br /&gt;
The advantages are not just for the skinners though, artistic people can now create great skins easily, and this means we'll see more beautiful skins by great artists!&lt;br /&gt;
&lt;br /&gt;
ClassicPro skins use an advanced single-user-interface which is really easy to use. The great thing is cPro appeals both to the advanced Winamp user and the minimalistic user who would for example just want to use the playlist. This means ClassicPro will probably fit you like a glove no matter who you are!&lt;br /&gt;
If you are used to a Classic Winamp skin and didn't want to switch to the modern skins of the past then we urge you to give this a test drive since this skin type was designed especially for the old school user who might need a minimalistic approach to their favourite media player.&lt;br /&gt;
&lt;br /&gt;
The 2 main key focus points in the development was as follows:&lt;br /&gt;
* Performance - Winamp must load quick and use as little resources running as possible&lt;br /&gt;
* Easy Interface - The interface must be easy to understand and give enough play for the experienced users too&lt;br /&gt;
&lt;br /&gt;
[http://cpro.skinconsortium.com/ Download ClassicPro plugin]&lt;br /&gt;
&lt;br /&gt;
==Introduction to ClassicPro skins==&lt;br /&gt;
[[Image:http://cpro.skinconsortium.com/images/cpro-promo1_04.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ClassicPro skins are basically pre-coded Winamp Modern Skins. The advantage of this is that the skinner dont have to spend months coding the skin anymore and can just edit a few picture files and have a fully working skin. All the coding of the skin is installed in one central place by the cPro plugin and then this plugin is maintained by the developer. So when the plugin installs new features or fixes your skin will automatically have them too.&lt;br /&gt;
&lt;br /&gt;
For more information make a post at their forums:&lt;br /&gt;
[http://forums.skinconsortium.com SkinConsortium Forums]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Tools needed to create a skin==&lt;br /&gt;
* Graphics Editor&lt;br /&gt;
** Paint, Corel PSP, Adobe PS, GIMP, Paint.NET&lt;br /&gt;
* Text Editor&lt;br /&gt;
** Notepad, Notepad2, Notepad++&lt;br /&gt;
* Archiver&lt;br /&gt;
** 7zip, WinZip, WinRar&lt;br /&gt;
* ClassicPro plug-in&lt;br /&gt;
** [http://cpro.skinconsortium.com/ Download ClassicPro plugin]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Tutorials==&lt;br /&gt;
* [http://cpro.skinconsortium.com/index.php?content=manual Skinners Guide to ClassicPro] by pjn123&lt;br /&gt;
** This is the manual released by the developers&lt;br /&gt;
* [http://wilian.deviantart.com/art/ClassicPro-Template-pack-95549517 ClassicPro Template pack and Manual] by Wilian &amp;amp; Veroka&lt;br /&gt;
** This is a more in depth look at creating cPro skins. Really great for beginners.&lt;br /&gt;
** Comes with great base skin for you to start off with&lt;/div&gt;</summary>
		<author><name>Pjn123</name></author>	</entry>

	<entry>
		<id>http://wiki.winamp.com/wiki/Articles</id>
		<title>Articles</title>
		<link rel="alternate" type="text/html" href="http://wiki.winamp.com/wiki/Articles"/>
				<updated>2008-09-24T19:29:22Z</updated>
		
		<summary type="html">&lt;p&gt;Pjn123: /* Modern Skins */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Breadcrumb''' -- [[Main_Page|Wiki Main]] : [[Skin Developer]] : [[Visual Developer]] : [[Plug-in Developer]] : [[Articles|Articles Page]] : [[Developers FAQ|FAQ]] : [[Main_Page#Glossary_of_Terms|Glossary]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Skin Articles==&lt;br /&gt;
&lt;br /&gt;
===Classic Skins===&lt;br /&gt;
*[[Test]]&lt;br /&gt;
*Link to Classic Skin Article 2&lt;br /&gt;
&lt;br /&gt;
===Modern Skins===&lt;br /&gt;
*[http://dev.aol.com/article/2007/winamp_skins Winamp Skins Development Tutorial]&lt;br /&gt;
*Link to Modern Skin Article 2&lt;br /&gt;
*[[Creating a ClassicPro Skin]]&lt;br /&gt;
&lt;br /&gt;
==Visualization Articles==&lt;br /&gt;
*[[MilkDrop_Preset_Authoring|MilkDrop Preset Authoring]]&lt;br /&gt;
*Link to vis Article 2&lt;br /&gt;
&lt;br /&gt;
==Plug-in Articles==&lt;br /&gt;
&lt;br /&gt;
*[[Wasabi|Overview of the Wasabi API]]&lt;br /&gt;
*[[Decode File API]]&lt;br /&gt;
*[[Media Library Plugin|How to create a Media Library plugin]]&lt;br /&gt;
*[[Input Plugin|How to create an Input plugin]]&lt;br /&gt;
*[[General Purpose Plugin|General Purpose plugins]]&lt;br /&gt;
*[[Output Plugin|How to create an Output plugin]]&lt;br /&gt;
*[[DSP Plugin|Audio Effects (DSP) plugins]]&lt;br /&gt;
*[[Random API]]&lt;br /&gt;
*[[Language API]]&lt;br /&gt;
*[[Agave Config API]]&lt;br /&gt;
*[[Album Art API]]&lt;br /&gt;
*[[Tagz API]]&lt;br /&gt;
*[[XML Parser Object]]&lt;br /&gt;
*[[System Callbacks API]]&lt;br /&gt;
*[[Skin API]]&lt;br /&gt;
*[[Service Manager API]]&lt;br /&gt;
*[[Memory Manager API]]&lt;br /&gt;
*[[Image Writer Service]]&lt;br /&gt;
*[[Image Loader Service]]&lt;br /&gt;
*[[Text Feed Service]]&lt;br /&gt;
*[[File Reader Service]]&lt;br /&gt;
*[[Application API]]&lt;br /&gt;
*[[Replay Gain API]]&lt;br /&gt;
*[[Podcasts API]]&lt;br /&gt;
*[[Agave Metadata API]]&lt;br /&gt;
*[[System Component Interface]]&lt;br /&gt;
*[[Burner API]]&lt;br /&gt;
*[[Audio Encoder Plugin|Audio encoders (transcoding, CD ripper)]]&lt;br /&gt;
*[[Skinning Plugins|WAC Skinning plugins]]&lt;br /&gt;
*[[Nullsoft Database Engine|Nullsoft Database Engine (NDE)]]&lt;br /&gt;
*[[JNetLib|JNetLib networking library]]&lt;br /&gt;
*[[APE Plugins|AVS Plugins]]&lt;br /&gt;
*[[NSV Plugins|NSV Audio and Video decoders]]&lt;br /&gt;
*[[Playlist API]]&lt;br /&gt;
*[[Media Core API|Media Core API (Freeform skins only!)]]&lt;br /&gt;
*[[SendMessage API|Winamp 2 API]]&lt;br /&gt;
*[[Media Library API|Media Library SendMessage API]]&lt;br /&gt;
*[[Plugin Terminology]]&lt;br /&gt;
&lt;br /&gt;
==Web Development Articles==&lt;br /&gt;
* [[HTTP Example Plugin]]&lt;br /&gt;
* [[Javascript External Interface]]&lt;/div&gt;</summary>
		<author><name>Pjn123</name></author>	</entry>

	</feed>