diff --git a/Chapters/ch02-a-side-toolbox.xml b/Chapters/ch02-a-side-toolbox.xml index 99367b0..0a36d54 100644 --- a/Chapters/ch02-a-side-toolbox.xml +++ b/Chapters/ch02-a-side-toolbox.xml @@ -188,29 +188,29 @@ ENDPROC

The first thing that we need to do is to create an equivalent window state block for the toolbox pane, which we can then update with the necessary values calculated from the main window’s position. Unfortunately we can’t use our usual scratch block of memory pointed to by q%, because that could already be holding the data for the main window if we have been called from PROCopen_main_window. However, we know that only 36 bytes will be in use from what is at least a 256 byte block, so we can just load the pane information in at an offset of 64 bytes.

-pane% = main% + 64 +toolbox% = main% + 64 -!pane% = ToolBoxWindow% -SYS "Wimp_GetWindowState",,pane% +!toolbox% = ToolBoxWindow% +SYS "Wimp_GetWindowState",,toolbox%

Since the pane can’t be resized by the user, we can be fairly confident that its width and height will still be as they were saved in the templates file. These can be used to give us the values for the pane’s width and height, saving us from having to use constants in the code. Before making any changes to the pane window state block’s contents, we therefore calculate the width and height of the pane’s visible area and store the two values for future use.

-width% = pane%!12 - pane%!4 : REM Visible Area Maximum X - Minimum X -height% = pane%!16 - pane%!8 : REM Visible Area Maximum Y - Minimum Y +box_width% = toolbox%!12 - toolbox%!4 : REM Visible Area Maximum X - Minimum X +box_height% = toolbox%!16 - toolbox%!8 : REM Visible Area Maximum Y - Minimum Y

As already noted, we know where the main window should be on screen. We also know the relationship that we want to have between the main window and its pane, as shown in . We can therefore move the pane so that it is in the correct position relative to the main window, update the main window’s position if necessary, then call Wimp_OpenWindow for both windows in turn.

- +

shows the relationship between the main window and its pane. The tops of the two windows (y1 for the two visible areas) should be level, so we can copy the y1 value from the main window to the pane. The bottom of the pane (its y0) is the height of the pane below the top of the main window.

-pane%!16 = main%!16 : REM Visible Area Maximum Y -pane%!8 = main%!16 - height% : REM Visible Area Minimum Y +toolbox%!16 = main%!16 : REM Visible Area Maximum Y +toolbox%!8 = main%!16 - box_height% : REM Visible Area Minimum Y

In a similar way, the right-hand side of the pane (its x1) is on the left-hand side of the main window, while its left-hand side is the width of the pane further to the left.

-pane%!12 = main%!4 : REM Visible Area Maximum X -pane%!4 = main%!4 - width% : REM Visible Area Minimum X +toolbox%!12 = main%!4 : REM Visible Area Maximum X +toolbox%!4 = main%!4 - box_width% : REM Visible Area Minimum X
@@ -228,55 +228,55 @@ pane%!4 = main%!4 - width% : REM Visible Area Minimum X

Keeping the Z order of the windows correct is fairly straight-forward. The Open_Window_Request block for the main window contains the position in the window stack at which it should be opened, in terms of the handle of the window below which it should be opened at offset 28. Since the toolbox pane should be in front of the window, we copy this value into the pane’s block so that the pane appears at the correct position in the stack.

-IF main%!28 <> !pane% THEN pane%!28 = main%!28 +IF main%!28 <> ToolBoxWindow% THEN toolbox%!28 = main%!28

There’s one exception to this, however. If the Wimp is already asking us to open the main window behind the pane, then both the pane and the main window must already be in the correct positions in the window stack. In this case, there’s no point attempting to open the pane behind itself, so we just leave things as they are. The pane is now ready to be opened in its new location, using a call to Wimp_OpenWindow.

-SYS "Wimp_OpenWindow",,pane% +SYS "Wimp_OpenWindow",,toolbox%

With the pane open in the correct place, all that remains to do is to open the main window. This is done using the block from the Open_Window_Request event almost unchanged: the only thing that we alter is the handle of the window to open behind, which we set to the handle of the pane. This ensures that the pane is always directly in front of the main window.

-main%!28 = !pane% +main%!28 = ToolBoxWindow% SYS "Wimp_OpenWindow",,main%

Putting all of the code above together, PROChandle_pane_windows() will look as shown in .

-DEF PROChandle_pane_windows(main%) -LOCAL pane%, width%, height% +DEF PROChandle_pane_windows(main%) +LOCAL toolbox%, box_width%, box_height% REM Get the Window State block for the pane, using some of the spare REM space above the data for the state of the main window. -pane% = main% + 64 +toolbox% = main% + 64 -!pane% = ToolBoxWindow% -SYS "Wimp_GetWindowState",,pane% +!toolbox% = ToolBoxWindow% +SYS "Wimp_GetWindowState",,toolbox% REM Find the width and height of the pane's visible area. -width% = pane%!12 - pane%!4 : REM Visible Area Maximum X - Minimum X -height% = pane%!16 - pane%!8 : REM Visible Area Maximum Y - Minimum Y +box_width% = toolbox%!12 - toolbox%!4 : REM Visible Area Maximum X - Minimum X +box_height% = toolbox%!16 - toolbox%!8 : REM Visible Area Maximum Y - Minimum Y REM Move the pane so that it's in the correct X and Y position REM relative to where the main window is to go. -pane%!4 = main%!4 - width% : REM Visible Area Minimum X -pane%!8 = main%!16 - height% : REM Visible Area Minimum Y -pane%!12 = main%!4 : REM Visible Area Maximum X -pane%!16 = main%!16 : REM Visible Area Maximum Y +toolbox%!4 = main%!4 - box_width% : REM Visible Area Minimum X +toolbox%!8 = main%!16 - box_height% : REM Visible Area Minimum Y +toolbox%!12 = main%!4 : REM Visible Area Maximum X +toolbox%!16 = main%!16 : REM Visible Area Maximum Y REM Unless the main window is to be opened behind the pane, meaning that the REM pane must already be in the correct place in the stack, set the pane's REM Open Behind so that it appears in the stack where the main window is to go. -IF main%!28 <> !pane% THEN pane%!28 = main%!28 +IF main%!28 <> ToolBoxWindow% THEN toolbox%!28 = main%!28 -SYS "Wimp_OpenWindow",,pane% +SYS "Wimp_OpenWindow",,toolbox% REM Set the main window's Open Behind so that it opens behind the pane. -main%!28 = !pane% +main%!28 = ToolBoxWindow% SYS "Wimp_OpenWindow",,main% ENDPROC @@ -287,7 +287,7 @@ ENDPROC

The full code can be found in .

- +
@@ -303,10 +303,10 @@ ENDPROC REM Move the pane so that it's in the correct X and Y position REM relative to where the main window is to go. -pane%!4 = main%!4 - width% : REM Visible Area Minimum X -pane%!8 = main%!16 - height% : REM Visible Area Minimum Y -pane%!12 = main%!4 : REM Visible Area Maximum X -pane%!16 = main%!16 : REM Visible Area Maximum Y +toolbox%!4 = main%!4 - box_width% : REM Visible Area Minimum X +toolbox%!8 = main%!16 - box_height% : REM Visible Area Minimum Y +toolbox%!12 = main%!4 : REM Visible Area Maximum X +toolbox%!16 = main%!16 : REM Visible Area Maximum Y

We can replace this by testing the minimum X coordinate of the main window’s visible area, then applying different calculations for the pane’s X coordinates as follows:

@@ -322,19 +322,19 @@ pane%!16 = main%!16 : REM Visible Area Maximum Y REM relative to where the main window is to go. CASE TRUE OF -WHEN main%!4 > width% - pane%!4 = main%!4 - width% : REM Visible Area Minimum X - pane%!12 = main%!4 : REM Visible Area Maximum X +WHEN main%!4 > box_width% + toolbox%!4 = main%!4 - box_width% : REM Visible Area Minimum X + toolbox%!12 = main%!4 : REM Visible Area Maximum X WHEN main%!4 > 0 - pane%!4 = 0 : REM Visible Area Minimum X - pane%!12 = width% : REM Visible Area Maximum X + toolbox%!4 = 0 : REM Visible Area Minimum X + toolbox%!12 = box_width% : REM Visible Area Maximum X OTHERWISE - pane%!4 = main%!4 : REM Visible Area Minimum X - pane%!12 = main%!4 + width% : REM Visible Area Maximum X + toolbox%!4 = main%!4 : REM Visible Area Minimum X + toolbox%!12 = main%!4 + box_width% : REM Visible Area Maximum X ENDCASE -pane%!8 = main%!16 - height% : REM Visible Area Minimum Y -pane%!16 = main%!16 : REM Visible Area Maximum Y +toolbox%!8 = main%!16 - box_height% : REM Visible Area Minimum Y +toolbox%!16 = main%!16 : REM Visible Area Maximum Y

With this in place, our own pane begins to behave in a more Draw-like way when it reaches the edge of the screen, as seen in .

@@ -342,7 +342,7 @@ pane%!16 = main%!16 : REM Visible Area Maximum Y

The full code can be found in .

- + diff --git a/Chapters/ch03-a-top-toolbar.xml b/Chapters/ch03-a-top-toolbar.xml new file mode 100644 index 0000000..0755dfc --- /dev/null +++ b/Chapters/ch03-a-top-toolbar.xml @@ -0,0 +1,238 @@ + + + + + + + + + + + + +Chapter03 +Chapter03 + +a-top-toolbar.php +a-top-toolbar +A Top Toolbar + +Many applications have toolbars across the tops of their windows; just don’t call them ribbons. + +
+

An alternative to a toolbox at the side of a window, as we created in the last chapter, is a toolbar across the top of a window. Which to go for is more of a stylistic question than a technical one, and it’s possible to have both at the same time. Ovation Pro does just this, as seen in .

+ + +
+ +
+Adding a toolbar + +

Just as with the toolbox in the previous chapter, the first thing that we will need to do in order to create a toolbar is to design a suitable window template. This time, we will create a toolbar containing a writable icon, which will span the top of our main window – a bit like the URL bar in a browser. The template has been called “Toolbar”, and can be seen in being edited in WinEd.

+ + + +

Much of the window design, including the window flags, is the same as for the toolbox. The toolbar has no window furniture, has its ‘window is a pane’ flag set and its ‘window is moveable’ flag clear.

+ +

Compared to the toolbox, we need to take a little more care over the window dimensions. We want the toolbar to span the width of the main window, so the work area width (x1x0) must be at least as large as that of the main window – 1040 OS Units in this case. In our demo, we can simply set this in the template definition, as seen in . However, it’s important to remember that if our application was to ever call Wimp_SetExtent to increase the width of the main window’s work area, it would also have to make the same adjustment to the toolbar – otherwise, the toolbar will stop short of the right-hand side of the window.

+ + + +

The height of the work area (y1y0) is set to be 60 OS Units: this allows a standard writable icon with a height of 52 OS Units, plus a 4 OS Unit space around it.

+ +

We have also adjusted the minimum sizes of the bar, although this is as much to keep WinEd happy: with the minimum y dimenstion set to zero, the Wimp will limit the size to that required for the vertical scroll bar which WinEd applies in editing mode.

+ +

The window contains two action buttons and a writable icon, so that we can easily see how the work area moves around in relation to its parent window. All three icons are 52 OS Units high, to match the standard height for a writable icon, and there is a 4 OS Unit gap around the edges of the work area on all four sides.

+ +

Once again, we can add the lines shown in to PROCinitialise in order to load the new template and create a window from it.

+ +PROCtemplate_load("Toolbar", b%, buffer_size%, -1) +SYS "Wimp_CreateWindow",,b% TO ToolBarWindow% + +

The handle of the toolbar is stored in ToolBarWindow%, so that it will be available to the rest of the program.

+
+ + +
+Handling the new pane + +

In terms of infrastructure to handle our new toolbar, there’s not much to add since most of the hard work was done in the last chapter. All that we need to do is to make sure that the toolbar opens in the correct place relative to both the main window and the existing toolbox, which will be handled in PROChandle_pane_windows(), and that it closes when the main window closes. For the latter, we can update PROCclose_window_request() as shown in , so that both panes are closed if the main window closes.

+ +DEF PROCclose_window_request(b%) +IF !b% = MainWindow% THEN + !q% = ToolBoxWindow% + SYS "Wimp_CloseWindow",,q% + !q% = ToolBarWindow% + SYS "Wimp_CloseWindow",,q% +ENDIF + +SYS "Wimp_CloseWindow",,b% +ENDPROC + +

The code that we need to add to PROChandle_pane_windows() should already be fairly familiar. First, we need to create a window state block for the toolbar pane, just as we do for the toolbox. To keep things simple, we’ll borrow another 32 bytes from the Open_Window_Request event block, placing the toolbar pane’s data at an offset of 128 bytes into the block.

+ +toolbar% = main% + 128 + +!toolbar% = ToolBarWindow% +SYS "Wimp_GetWindowState",,toolbar% + +

The calculations for the position of the toolbox will remain as they are, after which we will add in a similar set of calculations for the new toolbar. To be able to do this, we’ll need the height of the bar – which we can get from its visible area as before.

+ +box_height% = toolbar%!16 - toolbar%!8 : REM Visible Area Maximum Y - Minimum Y + +

We don’t need the width of the bar, because that will be tied to the width of the main window’s visible area as shown in .

+ + + +

The tops of the two windows (y1 for the two visible areas) are once again level, whilst the bottom of the pane (its y0) is the height of the pane below the top (y1) of the main window. This means that the vertical dimensions for the toolbar’s visible area are calculated in exactly the same way as for the toolbox.

+ +toolbar%!8 = main%!16 - box_height% : REM Visible Area Minimum Y +toolbar%!16 = main%!16 : REM Visible Area Maximum Y + +

The horizontal positioning of the toolbar is even easier: it aligns completely with the visible area of the main window, so x0 and x1 can be copied directly from the main window’s data block.

+ +toolbar%!4 = main%!4 : REM Visible Area Minimum X +toolbar%!12 = main%!12 : REM Visible Area Maximum X + +

This is why the horizontal extent of the pane has to match that of the main window: if the main window is fully extended, the pane has to be able to follow suit.

+
+ + +
+Stacking order + +

Just as with our previous example, the two panes must appear directly in front of the main window in the window stack. The exact order doesn’t matter to the Wimp, so we will choose to put the toolbar in front of the main window, and the toolbox in front of the toolbar.

+ +

As before, we start at the top of the pile of panes and work down towards the main window – so the first thing to open is the toolbox.

+ +IF (main%!28 <> ToolBarWindow%) OR (toolbar%!28 <> ToolBoxWindow%) THEN toolbox%!28 = main%!28 + +SYS "Wimp_OpenWindow",,toolbox% + +

We still check to see if the windows are already in their correct places in the stack, but with two panes to consider we must now check both whether the main window is behind the toolbar, and whether the toolbar is behind the toolbox. If either isn’t in the correct place, we will need to re-position the toolbox, as the top window of the pile, and then work down from that.

+ +

With the toolbox open, we can open the toolbar behind it...

+ +toolbar%!28 = ToolBoxWindow% + +SYS "Wimp_OpenWindow",,toolbar% + +

...and then, at the bottom of our little pile of windows, comes the main window itself.

+ +main%!28 = ToolBarWindow% + +SYS "Wimp_OpenWindow",,main% + +

Putting all of the new code together with the old, PROChandle_pane_windows() now looks as shown in .

+ +DEF PROChandle_pane_windows(main%) +LOCAL toolbox%, toolbar%, box_width%, box_height%, bar_height% + +REM Get the Window State block for the toolbox pane, using some of the +REM spare space above the data for the state of the main window. + +toolbox% = main% + 64 + +!toolbox% = ToolBoxWindow% +SYS "Wimp_GetWindowState",,toolbox% + +REM Get the Window State block for the toolbar pane, using more of the +REM spare space above the data for the state of the main window. + +toolbar% = main% + 128 + +!toolbar% = ToolBarWindow% +SYS "Wimp_GetWindowState",,toolbar% + +REM Find the height of the toolbar pane's visible area. + +bar_height% = toolbar%!16 - toolbar%!8 : REM Visible Area Maximum Y - Minimum Y + +REM Move the toolbar pane so that it's in the correct X and Y position +REM relative to where the main window is to go. + +toolbar%!4 = main%!4 : REM Visible Area Minimum X +toolbar%!8 = main%!16 - bar_height% : REM Visible Area Minimum Y +toolbar%!12 = main%!12 : REM Visible Area Maximum X +toolbar%!16 = main%!16 : REM Visible Area Maximum Y + +REM Find the width and height of the toolbox pane's visible area. + +box_width%% = toolbox%!12 - toolbox%!4 : REM Visible Area Maximum X - Minimum X +box_height% = toolbox%!16 - toolbox%!8 : REM Visible Area Maximum Y - Minimum Y + +REM Move the toolbox pane so that it's in the correct X and Y position +REM relative to where the main window is to go. + +CASE TRUE OF +WHEN main%!4 > box_width%% + toolbox%!4 = main%!4 - box_width%% : REM Visible Area Minimum X + toolbox%!12 = main%!4 : REM Visible Area Maximum X +WHEN main%!4 > 0 + toolbox%!4 = 0 : REM Visible Area Minimum X + toolbox%!12 = box_width%% : REM Visible Area Maximum X +OTHERWISE + toolbox%!4 = main%!4 : REM Visible Area Minimum X + toolbox%!12 = main%!4 + box_width%% : REM Visible Area Maximum X +ENDCASE + +toolbox%!8 = main%!16 - box_height% : REM Visible Area Minimum Y +toolbox%!16 = main%!16 : REM Visible Area Maximum Y + +REM Unless the main window is to be opened behind the toolbar pane, and the +REM toolbar pane is already behind the toolbox pane, meaning that all three +REM windows must already be in the correct place in the stack, set the toolbox's +REM Open Behind so that it appears in the stack where the main window is to go. + +IF (main%!28 <> ToolBarWindow%) OR (toolbar%!28 <> ToolBoxWindow%) THEN toolbox%!28 = main%!28 + +SYS "Wimp_OpenWindow",,toolbox% + +REM Set the toolbar window's Open Behind so that it opens behind the toolbox. + +toolbar%!28 = ToolBoxWindow% + +SYS "Wimp_OpenWindow",,toolbar% + +REM Set the main window's Open Behind so that it opens behind the toolbar. + +main%!28 = ToolBarWindow% + +SYS "Wimp_OpenWindow",,main% +ENDPROC + +

Running the upplication application should reveal a new toolbar attached to the top of the main window, as shown in . Both the toolbar and the original toolbox should move and adjust their sizes together.

+ + + +

The full code can be found in .

+ + +
+
+
+ diff --git a/Downloads/Chapter02/SideBox1/!PaneDemo/!RunImage,ffb b/Downloads/Chapter02/SideBox1/!PaneDemo/!RunImage,ffb index 14e0612..f0590af 100644 Binary files a/Downloads/Chapter02/SideBox1/!PaneDemo/!RunImage,ffb and b/Downloads/Chapter02/SideBox1/!PaneDemo/!RunImage,ffb differ diff --git a/Downloads/Chapter02/SideBox2/!PaneDemo/!RunImage,ffb b/Downloads/Chapter02/SideBox2/!PaneDemo/!RunImage,ffb index 2edd91c..6463246 100644 Binary files a/Downloads/Chapter02/SideBox2/!PaneDemo/!RunImage,ffb and b/Downloads/Chapter02/SideBox2/!PaneDemo/!RunImage,ffb differ diff --git a/Downloads/Chapter03/TopBar1/!PaneDemo/!Boot,feb b/Downloads/Chapter03/TopBar1/!PaneDemo/!Boot,feb new file mode 100644 index 0000000..05fdbf5 --- /dev/null +++ b/Downloads/Chapter03/TopBar1/!PaneDemo/!Boot,feb @@ -0,0 +1,24 @@ +| >!Boot +| +| Copyright 2021, Stephen Fryatt (info@stevefryatt.org.uk) +| +| This file is part of PaneDemo: +| +| http://www.stevefryatt.org.uk/risc-os/panes +| +| Permission is hereby granted, free of charge, to any person obtaining +| a copy of this software and associated documentation files (the +| "Software"), to deal in the Software without restriction, including +| without limitation the rights to use, copy, modify, merge, publish, +| distribute, sublicense, and/or sell copies of the Software, and to +| permit persons to whom the Software is furnished to do so. +| +| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +| OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +| MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +| IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +| CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +| TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +| SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +If ""="" Then Set PaneDemo$Dir diff --git a/Downloads/Chapter03/TopBar1/!PaneDemo/!Run,feb b/Downloads/Chapter03/TopBar1/!PaneDemo/!Run,feb new file mode 100644 index 0000000..d4679e1 --- /dev/null +++ b/Downloads/Chapter03/TopBar1/!PaneDemo/!Run,feb @@ -0,0 +1,27 @@ +| >!Run +| +| Copyright 2021, Stephen Fryatt (info@stevefryatt.org.uk) +| +| This file is part of PaneDemo: +| +| http://www.stevefryatt.org.uk/risc-os/panes +| +| Permission is hereby granted, free of charge, to any person obtaining +| a copy of this software and associated documentation files (the +| "Software"), to deal in the Software without restriction, including +| without limitation the rights to use, copy, modify, merge, publish, +| distribute, sublicense, and/or sell copies of the Software, and to +| permit persons to whom the Software is furnished to do so. +| +| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +| OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +| MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +| IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +| CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +| TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +| SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Set PaneDemo$Dir + +WimpSlot -min 96K -max 96K +Run .!RunImage diff --git a/Downloads/Chapter03/TopBar1/!PaneDemo/!RunImage,ffb b/Downloads/Chapter03/TopBar1/!PaneDemo/!RunImage,ffb new file mode 100644 index 0000000..b426188 Binary files /dev/null and b/Downloads/Chapter03/TopBar1/!PaneDemo/!RunImage,ffb differ diff --git a/Downloads/Chapter03/TopBar1/!PaneDemo/Templates,fec b/Downloads/Chapter03/TopBar1/!PaneDemo/Templates,fec new file mode 100644 index 0000000..dd6ea17 Binary files /dev/null and b/Downloads/Chapter03/TopBar1/!PaneDemo/Templates,fec differ diff --git a/Images/Chapter03/top-bar-complete.png b/Images/Chapter03/top-bar-complete.png new file mode 100644 index 0000000..2ec0115 Binary files /dev/null and b/Images/Chapter03/top-bar-complete.png differ diff --git a/Images/Chapter03/top-bar-extents.png b/Images/Chapter03/top-bar-extents.png new file mode 100644 index 0000000..ebad8b4 Binary files /dev/null and b/Images/Chapter03/top-bar-extents.png differ diff --git a/Images/Chapter03/top-bar-ovation.png b/Images/Chapter03/top-bar-ovation.png new file mode 100644 index 0000000..374b174 Binary files /dev/null and b/Images/Chapter03/top-bar-ovation.png differ diff --git a/Images/Chapter03/top-bar-pos-plane.png b/Images/Chapter03/top-bar-pos-plane.png new file mode 100644 index 0000000..27ab4f6 Binary files /dev/null and b/Images/Chapter03/top-bar-pos-plane.png differ diff --git a/Images/Chapter03/top-bar-template.png b/Images/Chapter03/top-bar-template.png new file mode 100644 index 0000000..5c4348f Binary files /dev/null and b/Images/Chapter03/top-bar-template.png differ diff --git a/panes.xml b/panes.xml index 4766e4e..a58eb6e 100644 --- a/panes.xml +++ b/panes.xml @@ -72,5 +72,6 @@ +