From 6048b84e6c16429254cc9ebb31d9fbbe359bfc7d Mon Sep 17 00:00:00 2001 From: Steve Fryatt Date: Thu, 19 Jan 2023 23:51:03 +0000 Subject: [PATCH] Complete the first pass of Chapter 9. --- Chapters/ch09-an-embedded-toolbox.xml | 69 +++++++++++++++++- .../Embedded1/!PaneDemo/!RunImage,ffb | Bin 13903 -> 14407 bytes .../Embedded2/!PaneDemo/!RunImage,ffb | Bin 14559 -> 15063 bytes Downloads/Chapter09/Embedded3/!Boot,feb | 24 ++++++ .../Chapter09/Embedded3/!PaneDemo/!Boot,feb | 24 ++++++ .../Chapter09/Embedded3/!PaneDemo/!Run,feb | 29 ++++++++ .../Embedded3/!PaneDemo/!RunImage,ffb | Bin 0 -> 16096 bytes .../Embedded3/!PaneDemo/Templates,fec | Bin 0 -> 1362 bytes Downloads/Chapter09/Embedded3/!Run,feb | 29 ++++++++ Downloads/Chapter09/Embedded3/!RunImage,ffb | Bin 0 -> 16096 bytes Downloads/Chapter09/Embedded3/Templates,fec | Bin 0 -> 1362 bytes 11 files changed, 173 insertions(+), 2 deletions(-) create mode 100644 Downloads/Chapter09/Embedded3/!Boot,feb create mode 100644 Downloads/Chapter09/Embedded3/!PaneDemo/!Boot,feb create mode 100644 Downloads/Chapter09/Embedded3/!PaneDemo/!Run,feb create mode 100644 Downloads/Chapter09/Embedded3/!PaneDemo/!RunImage,ffb create mode 100644 Downloads/Chapter09/Embedded3/!PaneDemo/Templates,fec create mode 100644 Downloads/Chapter09/Embedded3/!Run,feb create mode 100644 Downloads/Chapter09/Embedded3/!RunImage,ffb create mode 100644 Downloads/Chapter09/Embedded3/Templates,fec diff --git a/Chapters/ch09-an-embedded-toolbox.xml b/Chapters/ch09-an-embedded-toolbox.xml index 05b5633..97a9dd7 100644 --- a/Chapters/ch09-an-embedded-toolbox.xml +++ b/Chapters/ch09-an-embedded-toolbox.xml @@ -368,14 +368,79 @@ ENDPROC
Changes of mode -

Although our new toolbox appears to be working nicely, there is one gotcha waiting to bite. The layout of the child window relative to its parent depends on the size of a pixel in the current screen mode at the time when the window was opened, so what happens if the mode changes whilst the window is on screen?

+

Although our new toolbox appears to be working nicely, there is one gotcha waiting to bite. The layout of the child window relative to its parent depends on the size of a pixel in the current screen mode at the time when the window was opened, so what happens if the mode is changed whilst the window is on screen?

The answer, of course, is that things may end up going out of alignment. shows the window after a change in mode: in this case from “Big Mode” (a mode where the X and Y eigenfactors are both zero) to a mode with more conventional settings (with eigenfactors of one). The icons are no longer spaced neatly and, worse, the toolbox window is no longer aligned with the main window furniture.

-

Fortunately the solution is simple: if a mode change occurs whilst our window is open, we should calculate all of the positioning again and then re-open it.

+

Fortunately the solution is simple: if a mode change occurs whilst our window is open, we should calculate all of the positioning again and then re-open it. Recalculating the position is fairly straight forward, as we can re-use the positioning code in PROCarrange_toolbox() to do the hard work. We start out by setting up the pointers in main%, toolbox% and main_outline%, before calling Wimp_GetWindowInfo for the main window. We have separated this out from PROCarrange_toolbox() because we must check that the window is actually open before doing any re-arranging – this can be done by testing the window flags in the usual way.

+

We don’t call Wimp_OpenWindow for the main window, as it should already have been positioned in a suitable place for the new mode by the Wimp. Instead, we call PROCarrange_toolbox() to calculate the toolbox position, then call Wimp_OpenWindow to apply it. In contrast to the code in PROCopen_main_window, we do not adjust the position of the toolbox in the window stack and so it should remain in the correct position relative to its parent.

+ +

Bringing all of this code together results in the procedure in .

+ +DEF PROCrecalculate_toolbox +LOCAL main%, main_outline%, toolbox% + +REM Set up the memory blocks. + +main% = q% +toolbox% = q% + 100 +main_outline% = q% + 200 + +REM Get the main window details. + +!main% = MainWindow% +SYS "Wimp_GetWindowInfo",,main% OR %1 + +REM If the main window isn't open, do nothing. + +IF (main%!32 AND &10000) = 0 THEN ENDPROC + +REM Reposition the toolbox. + +PROCarrange_toolbox(main%, main_outline%, toolbox%) + +REM Reopen the toolbox pane nested into the main window. + +SYS "Wimp_OpenWindow",,toolbox%, &4B534154, !main%, &05550000 +ENDPROC + +

In order to be able to call PROCrecalculate_toolbox whenever the mode changes, we will need to listen out for the Message_ModeChange User Message, which has the code &400C1. The Wimp sends this around all interested applications once a mode change has completed, and it will give us the cue that we require.

+ +

In order to be sent Message_ModeChange, we will need to update PROCinitialise so that our call to Wimp_Initialise includes a request to receive it. Up to now, we have passed zero in R3, which indicates that we only wish to receive the obligatory Message_Quit. To add Message_ModeChange to the messages that the Wimp will send us, we need to create a list of the message numbers that interest us in memory, then pass a pointer to that in R3 instead. The list is zero-terminated, which happens to also correspond to Message_Quit.

+ + +q%!0 = &400C1 : REM Message_ModeChange +q%!4 = 0 : REM Message_Quit & End of List + +SYS "Wimp_Initialise", 380, &4B534154, TaskName$, q% + +

To allow us to handle the new message, we will update the CASE which dispatches our Wimp_Poll events. Instead of simply setting the Quit% variable to TRUE when Message_Quit is received, we will instead call a new procedure called PROCuser_message() which can then the different codes which are received.

+ +CASE reason% OF + WHEN 2 : SYS "Wimp_OpenWindow",,b% + WHEN 3 : SYS "Wimp_CloseWindow",,b% + WHEN 6 : PROCmouse_click(b%) + WHEN 9 : PROCmenu_selection(b%) + WHEN 17, 18 : PROCuser_message(b%) +ENDCASE + +

PROCuser_message() itself is fairly simple. It contains a CASE structure to test the reason code of the incoming message, and call appropriate code in each case. A Message_Quit still sets the Quit% variable to TRUE, while Message_ModeChange will in turn call the new PROCrecalculate_toolbox procedure.

+ +DEF PROCuser_message(b%) +CASE b%!16 OF +WHEN 0 : REM Message_Quit + Quit% = TRUE +WHEN &400C1 : REM Message_ModeChange + PROCrecalculate_toolbox +ENDCASE +ENDPROC + +

With all of these changes in place, the full application can be found in .

+ +
diff --git a/Downloads/Chapter09/Embedded1/!PaneDemo/!RunImage,ffb b/Downloads/Chapter09/Embedded1/!PaneDemo/!RunImage,ffb index 3aea15a683b263f341d9a63f13a328f710b7ff5e..608c72a1c1ed1a165a341bf207eef88127f82fcf 100644 GIT binary patch delta 3081 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 LMx#{_Xz=_8{VUN< diff --git a/Downloads/Chapter09/Embedded2/!PaneDemo/!RunImage,ffb b/Downloads/Chapter09/Embedded2/!PaneDemo/!RunImage,ffb index 361d6e26e9ba13fa9d6641f97f7e9e62a3cb10a1..e7d40d6b0f8e83a52fd014d9fcebf50f49b77bf9 100644 GIT binary patch delta 3180 zcmb7GeQ;A%7B`RNCV9zC@?P3B&F4*;v`L$$Nt&jmOKT}mzS>eg1P2*P+P>1KAt`AJ zEXydPh>pv;4hJ2UML}d;R*_*`$6*jzmT_FhWf{hG)Nz$n7sc%&!!TV$*VR2q8e~`h z+0NYNchB$K`_9)r_x^SLJL5-VJm;H$EbmoxLL=Y)+kf%xWQBc_^<~E7oSaFs+=#?- znM`URvnfnf?<=Y5)A+SyHk(YZmHMZMz`CTI_J>&hr#~~EOUY>or&FvyNL5#H-B)nE zVv&m|m6RCDN}MOw!rEAUloBh-y)bBPzmJ4eA5oIPc?XUKJwI#>%Sx$aPTr6=uV7{V z>ujT(9?EPCv1EFPO<7qW<-tsPjFM%hNmR*=pr)J)Q?gn$Ny*6KNw#VVq!{DW5qMnm5_Ky|X2Yvu52x-0y*WbEccNqfb=;6Nn>lp~Hkds`y#b|L z;Yo8Br+x%JG0!9FT_|}98p}{}2!2x5K-4dy1i6d@G>eKyhVM1C*aWpCu3 zZGfk3PI$p?QXNI%aX4*nRJ?|3T+#V>LRJ*cqn~QeA^EQT%rBUCg}iRGe^x3pCY4O^ zQtih`UxqmjpY6Jm^0x^+QhI#Rs8kF-<#`mA!2^zlX}oJXTyePI&kifc2jFu@J>g@> z&H(1L6TS;!AIx-C8Tpl%1%3$UX&jqi%vq)8@5l4b?|>(rOVs=mm=S(ITz7i!dycO6 zdm_a~#J{A+Nj#r)%Ad^Re1}4O#(+2)!%3or@^2PqiK*H90&=nZ4%Lm3NR0BIT77}_ zepbg~@gPdaMzeBG@=^Y(~gDhUbI*j zf;U~woGt-6cPFRofJN?hwQd30uUiJY++?5(0^-3}g`-LJy{bP^ zJ$4TL0K~i@qE8{*07Kp;PQMj?>22lokH970HSh*i^x{wd@S!Q!e;#fz}3s!nkN zPF2NJucP!ld{O1;dk@jYihSgLoc}`63QT1S)n7sChWX6n-^H~ZYlCu?CBtsUyB^Ob zrFtc$78vo(;wXa`d`%p!g^Rw~9F0S*zn#!_XQCx$S>7Pwktt1xsT>=vfH z#aQHhH7o~DAV>_@A`Ev!U!Xi-$T>^i4@tv?_LlFOb!}Mu)Nn7lWq25scf!vCm2tyf zgwI+^wNWS>X;TjC#(@39aQypqV|Weg#=)I)fWlLz&g)XcyI>C9q4*f&;0ncM_ z;yPGsm#U4oVFej^$kzHJ#xg7mqf1GR0na2`A`K=}gX8&*_gyh>l!tO7VQRz%Vw?eg zsC9A1F1S=1>^1hGWTkDAb<62{@NO+E85Zr^c^T|D-0RrId++LNNs<1AG!%#hI)y ztA1I9$t(Puc?$GaR^1YzrjU}F5^$t`Au)9zTmawJmlM-6gsZ_8uCbf2t(daqJ-4*v zqMN2Iuqqrknzp02ChRJvJva`+zHqPN2wVyGD2~C5hDvf8eKwtiyBg*y-iBuyx)mS7 z)rP2I0=$uKGKsF6zJXjM$_X0ybtF(Lh)OCrn6Gp@6fdYYb}EfGl`n)>RgenRs1t!N zBOOF&MK~L7kMPT-q#Y&?Zo5^L2H>_IBxJ3?%Szc+Ss;yh@MM~S!uC95DEpG(AHgro3E zyoZRJ5pDxRlSL38MYvn%!ONqK?W5uWXljxbhhbk+xBF$JPKj-Ssjr|yEJ(#SP>N3j z@dEIPIe6mH$ZK#%V(zrBnZsiQa_a delta 2760 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 diff --git a/Downloads/Chapter09/Embedded3/!Boot,feb b/Downloads/Chapter09/Embedded3/!Boot,feb new file mode 100644 index 0000000..c795113 --- /dev/null +++ b/Downloads/Chapter09/Embedded3/!Boot,feb @@ -0,0 +1,24 @@ +| >!Boot +| +| Copyright 2021-2023, 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/Chapter09/Embedded3/!PaneDemo/!Boot,feb b/Downloads/Chapter09/Embedded3/!PaneDemo/!Boot,feb new file mode 100644 index 0000000..c795113 --- /dev/null +++ b/Downloads/Chapter09/Embedded3/!PaneDemo/!Boot,feb @@ -0,0 +1,24 @@ +| >!Boot +| +| Copyright 2021-2023, 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/Chapter09/Embedded3/!PaneDemo/!Run,feb b/Downloads/Chapter09/Embedded3/!PaneDemo/!Run,feb new file mode 100644 index 0000000..519dd79 --- /dev/null +++ b/Downloads/Chapter09/Embedded3/!PaneDemo/!Run,feb @@ -0,0 +1,29 @@ +| >!Run +| +| Copyright 2021-2023, 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 + +RMEnsure WindowManager 3.80 Error PaneDemo requires the Nested Window Manager. + +WimpSlot -min 96K -max 96K +Run .!RunImage diff --git a/Downloads/Chapter09/Embedded3/!PaneDemo/!RunImage,ffb b/Downloads/Chapter09/Embedded3/!PaneDemo/!RunImage,ffb new file mode 100644 index 0000000000000000000000000000000000000000..c3bf3d43d283b4c37ed8fdbe1ab2143e7250acfd GIT binary patch literal 16096 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 literal 0 HcmV?d00001 diff --git a/Downloads/Chapter09/Embedded3/!PaneDemo/Templates,fec b/Downloads/Chapter09/Embedded3/!PaneDemo/Templates,fec new file mode 100644 index 0000000000000000000000000000000000000000..0976f6ee798f92e13d4ade8a93b20b00a8ef2a58 GIT binary patch literal 1362 zcmZXUKWG#|6vp4(iHYdKseuGZvDhSn%I#fZVj(0N1x4jhkrWngxHWfpw|nkw@DCP2 zEG#S{1R`jWF4zSHO%WTFXqiGVg+;ogut*^!;GgyTE-&sxhkN&C-*3M8c4uZcj^kL2 zb`AZ7ln8!O41>|L{*Ay|&&a{F$S{KS3vR`?w0>`g$P#L-pRSE~rIJ_Tc(%n>kqF)X z-6B7*?@delMYrZz57M%F>sf~SN2;G!{cUKUAP#`FAs(xKPW8pH zupTr#3zsqV=aK0@j!geaXlD`hW)xAU|9xco4~|9UAZ*H;`mE}QRR0Rv_lRz2=-;OL z0o7mi!bT^Gv&jXb-Kx?OhtQnlib z627o6M_#?``SzLct{X*%?R+lp9Km0K*g2ZZ+1=+{pXI_KmR{p2U*e7yc8a|Fe-~rj zMT`F86;HQ;yvS7$X~|g`ng5!Rw}@`62KgGY@^;7I zHXO-Uk(GDl4c>v1N4|`#ysuzz`e%P{`Y$2Ff1tgNy zBE$cqlTSGP$?32Bi&IEA{mJRCe8uTWIQ_}#uYBF literal 0 HcmV?d00001 diff --git a/Downloads/Chapter09/Embedded3/!Run,feb b/Downloads/Chapter09/Embedded3/!Run,feb new file mode 100644 index 0000000..519dd79 --- /dev/null +++ b/Downloads/Chapter09/Embedded3/!Run,feb @@ -0,0 +1,29 @@ +| >!Run +| +| Copyright 2021-2023, 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 + +RMEnsure WindowManager 3.80 Error PaneDemo requires the Nested Window Manager. + +WimpSlot -min 96K -max 96K +Run .!RunImage diff --git a/Downloads/Chapter09/Embedded3/!RunImage,ffb b/Downloads/Chapter09/Embedded3/!RunImage,ffb new file mode 100644 index 0000000000000000000000000000000000000000..c3bf3d43d283b4c37ed8fdbe1ab2143e7250acfd GIT binary patch literal 16096 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 literal 0 HcmV?d00001 diff --git a/Downloads/Chapter09/Embedded3/Templates,fec b/Downloads/Chapter09/Embedded3/Templates,fec new file mode 100644 index 0000000000000000000000000000000000000000..0976f6ee798f92e13d4ade8a93b20b00a8ef2a58 GIT binary patch literal 1362 zcmZXUKWG#|6vp4(iHYdKseuGZvDhSn%I#fZVj(0N1x4jhkrWngxHWfpw|nkw@DCP2 zEG#S{1R`jWF4zSHO%WTFXqiGVg+;ogut*^!;GgyTE-&sxhkN&C-*3M8c4uZcj^kL2 zb`AZ7ln8!O41>|L{*Ay|&&a{F$S{KS3vR`?w0>`g$P#L-pRSE~rIJ_Tc(%n>kqF)X z-6B7*?@delMYrZz57M%F>sf~SN2;G!{cUKUAP#`FAs(xKPW8pH zupTr#3zsqV=aK0@j!geaXlD`hW)xAU|9xco4~|9UAZ*H;`mE}QRR0Rv_lRz2=-;OL z0o7mi!bT^Gv&jXb-Kx?OhtQnlib z627o6M_#?``SzLct{X*%?R+lp9Km0K*g2ZZ+1=+{pXI_KmR{p2U*e7yc8a|Fe-~rj zMT`F86;HQ;yvS7$X~|g`ng5!Rw}@`62KgGY@^;7I zHXO-Uk(GDl4c>v1N4|`#ysuzz`e%P{`Y$2Ff1tgNy zBE$cqlTSGP$?32Bi&IEA{mJRCe8uTWIQ_}#uYBF literal 0 HcmV?d00001