This is an experimental draft markup language for controlling desktop and/or CrudScreen style GUIs and get around the LimitsOfHtmlStack. The purpose is to explore possibilities and limits for desktop/crud-style GUIs as markup. HTML widgets, such the INPUT tag, are assumed if not stated otherwise and if they don't contradict anything here. This is not reinventing the wheel, only the spokes, hub, lug-nuts, and connection to the axle. WebBrowserMissingWidgetWorkArounds suggests specific widgets that perhaps should be added; but this topic tends not to focus on specific widgets below the windowing level except where the updating mechanism needs explicit explanation. Note that we are getting rid of the one-file-per-window concept. A given stream or "text transaction" could contain the definition and/or activation of multiple windows. Let's start with an example that re-creates the basic panels of a typical email-and-planner client with grouped menu listings on the left panel (Mail, Calendar, Planner), which is a kind of collapsible navigation panel. The center top panel lists the messages and the center bottom panel displays contents of the message selected in panel above it. Here's a rough Ascii-art representation: *************************** |..Menus or Tool-bar......| *************************** |Mail.....|.Email Title A.| |.(stuff).|>Email Title B<| |Calendar.|.Email Title C.| |.(stuff).|---------------| |Planner..|.(email B......| |.(stuff).|...text).......| *************************** (Dots to prevent TabMunging. Please do not remove. A "PRE" bug in the wiki also displays extra blank lines for some examples on Mozilla-based browsers.) ... ... ... ... ... ... The "frameSet" is similar to HTML frame-sets, but more flexible. It can be of the "collapsable" (minimizable) kind as found in the left category panes of many desk-top apps these days. It can have a title and icon in it (besides the chevron min/max icons if enabled) [1]. And, it can also be switched to be MDI (overlapping sub-windows) or tabs. ("stacked" is the kind already described.) And optionally the user can switch between these by clicking a small control button in the upper right of the frame-box that appears if the user is given a choice via the "windowStyles" attribute with more than one option (or upper-left if vertical "slicing" is chosen). "_all" is a short-cut to listing all three[5]. (Switching can also be tied to a custom menu option.) This three-way ability gives GUI designers and users potentially lots of flexibility in app layout. If one multi-window style is not working, the designer and/or user can just change it to one of the others. I consider this one of the '''best features''' of this proposal. The fight over MDI versus tabbed versus stacked can now end because one can have an instant choice [2]. The "menuFrame" is a special kind of frame for menus, toolbars, and "ribbons" that is similar to any other frame, except that it sizes to the content (menus, toolbars, etc.) and is generally not re-sizable (drag-able) in relation to other frames. If you really want a re-sizable or minimizable menu/toolbar area, then you can put menus/toolbars into a regular frame, or visa-versa. The menu and tool-bar widgets can in theory be put into any frame (sub-widow). (Arguably it could be called something like "fixedFrame" instead, or even have regular frames have a "fixed" option. But "menuFrame" is better self-documenting for its primary use.) One can "emulate" the newer "ribbon" style menus by doing this: A ribbon interface is essentially a tabbed windowing sub-system. Each frame can also have it's own "menuFrame" by using nested frame-sets if you want sub-menus or sub-tool-bars for some purpose, such as a text editing window with it's own tool-bar, similar to WikiPedia's text editor interface. A "footerFrame" is similar to a "menuFrame" except that it's at the bottom (or right if configable to diff conventions). They both share the property that they are not normally scrollable or re-sizable. A status bar would be a typical use of a "footerFrame". If mixed in with a "tool tray" convention, it may resemble: A "document" is similar to an HTML page, but doesn't have to be a file [3]. A "form" is merely an optional grouping mechanism. However, it is weaker than in HTML because one can use Document scope exclusively. Think of a "form" as roughly similar to the SPAN tag in that it is mostly used to identify groupings. Forms can be nested, but must have unique names within the document. This Form convention can help reduce network traffic by fine-tuning the target widgets being analyzed for content. Events can choose to send data in the document or at the form level within a document. All documents must have unique names within the application and widgets must be unique within a form [4]. If a document has no form, then a single form named "default" is assumed for that document. Thus, '''any given widget can be uniquely addressed by document name, form name, and widget name'''. Unlike HTML, duplicate widget names are not allowed (radio-buttons and checkboxes are possible exceptions, depending on their design)[6]. '''Event Handling''' ... The 'scope="full"' tag indicates that complex widget content is sent, such as individual cells in a data grid. 'scope="changmarked"' means that only marked content is sent. Changing content will set its "change mark" to "yes". When the server processes the content and is happy with it, it can set the change marks back to "no": Or optionally just send an acknowledgment that the update package was received, at which time the browser can automatically reset the markers. If client-side scripting is allowed, then trigger tags such as "onClick" could also contain scripting language references. But these are normally explicitly marked by the language name/type before a colon: [see syntax note near bottom] Without a colon-ized language name, the markup's own events are assumed. Event "lists" don't normally have loops and conditionals. Also, which commands are permitted in the lists can be controlled. More on permissions is given later. '''Updates''' The "update" attribute for a given tag has one of 3 values: * Attribute (default if UPDATE attribute not given) * Tag * Delete Under "attribute", any attribute values just replace any existing values, or create new attributes if they don't already exist. This is called the '''Delta Approach''' in some topics. To illustrate, suppose this was initially sent: Now suppose later the server sent this to the client: The browser would then assume this as its GUI layout state: As you can see, the "flib" attribute was not changed or removed, but "grat" added. Any attribute remains in place unless replaced by another value, such as with the "value=8" designation in the second tag, or unless the 'update="delete"' or 'update="tag"' is used for a given tag. For example: Would result in a GUI state of: As you can see, the "flib" and "grat" attributes have been removed. 'update="tag"' clears out any prior attributes of that tag. It's a "soft delete", unlike the next one: The 'update="delete"' is a "deep delete", meaning that it would remove all child tags also. The "update" attribute is not normally "kept" in the browser GUI state. In other words, if one "dumped" the browser GUI state as markup text, they wouldn't see any "update" attributes. A possible exception would be in events if permissions allowed such. (A "shallow" delete is unnecessary, as you would find out if you experimented with some examples; for the "tag" update level covers such cases sufficiently.) Although not shown here, each update packet should identify by name the document, form, and widget, if applicable, per above uniqueness rules. '''Sequence''' If the sequence matters, then the first defined tag is normally the first assumed. But if one wants to change the order or insert into the middle of a set later, then every tag has a "sequence" attribute implied that can be used. Thus, if this is sent: then "feep" is assumed to come before "zerg". They don't have to be contiguous and don't have to start with "1". The order of the above can be changed by sending: Decimal portions are also allowed, but not recommended. '''Templates''' To reduce code size and redundancy, tag templates can be used.