{"id":29019,"date":"2018-04-03T12:25:25","date_gmt":"2018-04-03T12:25:25","guid":{"rendered":"https:\/\/legacy.livecode.com\/?p=29019"},"modified":"2021-09-02T10:34:03","modified_gmt":"2021-09-02T10:34:03","slug":"livecode-9-0-gm","status":"publish","type":"post","link":"https:\/\/legacy.livecode.com\/livecode-9-0-gm\/","title":{"rendered":"LiveCode 9.0 GM"},"content":{"rendered":"<p><span style=\"font-weight: 400;\">LiveCode 9 contains so many new features that it&#8217;s almost impossible to cover them all in detail in a single blog post. So I&#8217;m not going to try. There have been several other blog posts along the way detailing specific features, which will be linked in the course of this blog &#8211; see these for more information.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Instead, I present the inside story of LiveCode 9.0, as it happened. The story has two main threads. The first is the ability to access to libraries and platform APIs written in other languages, aka the community-funded &#8216;Infinite LiveCode&#8217; \u00a0project. While the initial implementation of LiveCode Builder included simple C library support, we have extended this to support accessing more complex C libraries, Objective-C and Java. We have also refined the native layer support &#8211; there is more to come on this front in the 9 series, particularly for Windows and Linux. So we owe a huge thank you all who contributed, financially and\/or otherwise, to achieve this goal.<\/span><!--more--><\/p>\n<p><span style=\"font-weight: 400;\">LiveCode 9 contains so many new features that it&#8217;s almost impossible to cover them all in detail in a single blog post. So I&#8217;m not going to try. There have been several other blog posts along the way detailing specific features, which will be linked in the course of this blog &#8211; see these for more information.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Instead, I present the inside story of LiveCode 9.0, as it happened. The story has two main threads. The first is the ability to access to libraries and platform APIs written in other languages, aka the community-funded &#8216;Infinite LiveCode&#8217; \u00a0project. While the initial implementation of LiveCode Builder included simple C library support, we have extended this to support accessing more complex C libraries, Objective-C and Java. We have also refined the native layer support &#8211; there is more to come on this front in the 9 series, particularly for Windows and Linux. So we owe a huge thank you all who contributed, financially and\/or otherwise, to achieve this goal.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">The second thread is the refinement and rounding out of the HTML5 platform, to the point where it&#8217;s possible to deploy great professional apps. Having delivered the community-funded HTML5 deployment option, we have been steadily adding to the feature set. We are approaching \u00a0feature-completeness in terms of what is possible with the current infrastructure, and will be continuing to work on this in the coming months with the aim of achieving as much parity with the other platforms as we can.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Along the way we have added many other features, some of which support the above aims, and some of which are completely tangential. Highlights include:<\/span><\/p>\n<ul>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">SVG support in the image object<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Emoji support in the field object<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Autocomplete in the script editor<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Remote debugging<\/span><\/li>\n<\/ul>\n<h1><span style=\"font-weight: 400;\">Timeline of Nine<\/span><\/h1>\n<p><span style=\"font-weight: 400;\">This timeline shows the number of additional tests run in each release, the number of PRs merged, the number of bugs fixed; plus Infinite LiveCode features in red, and HTML5 features in blue.<\/span><\/p>\n<div id=\"attachment_29036\" style=\"width: 825px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/legacy.livecode.com\/wp-content\/uploads\/2018\/04\/timeline-1.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-29036\" class=\"wp-image-29036\" src=\"https:\/\/legacy.livecode.com\/wp-content\/uploads\/2018\/04\/timeline-1-300x81.png\" alt=\"\" width=\"815\" height=\"220\" srcset=\"https:\/\/legacy.livecode.com\/wp-content\/uploads\/2018\/04\/timeline-1-300x81.png 300w, https:\/\/legacy.livecode.com\/wp-content\/uploads\/2018\/04\/timeline-1-768x208.png 768w, https:\/\/legacy.livecode.com\/wp-content\/uploads\/2018\/04\/timeline-1-1024x278.png 1024w, https:\/\/legacy.livecode.com\/wp-content\/uploads\/2018\/04\/timeline-1.png 1537w\" sizes=\"auto, (max-width: 815px) 100vw, 815px\" \/><\/a><p id=\"caption-attachment-29036\" class=\"wp-caption-text\">Timeline of Infinite LiveCode and HTML5 features in the 9.0 series<\/p><\/div>\n<p><span style=\"font-weight: 400;\">Some of the numbers of additional tests run may look excessive, but they are actually correct &#8211; for example, between DP 9 and DP 10 we added a server test runner, meaning most of the 40,000 odd tests run on the standalone engine were also run on the server engine. Between DP 8 and 9 we added tests for strict compilation on all IDE stacks (albeit many of them skipped for now). We also added tests for extracted docs from all extensions and improved the tests for dictionary syntax; 9.0 is also the first release where the requirement to add a test where possible when submitting fixes and features has been in place throughout its development.<\/span><\/p>\n<h2><span style=\"font-weight: 400;\">9 DP 1: \u201cCommunity Docs\u201d<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">One area that saw a lot of activity prior to the release of 9 DP 1 was the dictionary. We had not long before converted the docs from XML to the \u2018lcdoc\u2019 format so that they would be easier to modify. This turned out to be relatively successful: over half of the 165 PRs that went into 9 DP 1 were docs modifications, largely from <a href=\"https:\/\/github.com\/asayd\">@asayd<\/a> and <a href=\"https:\/\/github.com\/seaniepie\">@seaniepie<\/a>. Also, there were several PRs that look like this:<\/span><\/p>\n<div id=\"attachment_29021\" style=\"width: 610px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/legacy.livecode.com\/wp-content\/uploads\/2018\/04\/Screen-Shot-2018-03-30-at-23.00.41.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-29021\" class=\"wp-image-29021\" src=\"https:\/\/legacy.livecode.com\/wp-content\/uploads\/2018\/04\/Screen-Shot-2018-03-30-at-23.00.41-300x17.png\" alt=\"\" width=\"600\" height=\"34\" srcset=\"https:\/\/legacy.livecode.com\/wp-content\/uploads\/2018\/04\/Screen-Shot-2018-03-30-at-23.00.41-300x17.png 300w, https:\/\/legacy.livecode.com\/wp-content\/uploads\/2018\/04\/Screen-Shot-2018-03-30-at-23.00.41-768x43.png 768w, https:\/\/legacy.livecode.com\/wp-content\/uploads\/2018\/04\/Screen-Shot-2018-03-30-at-23.00.41-1024x58.png 1024w, https:\/\/legacy.livecode.com\/wp-content\/uploads\/2018\/04\/Screen-Shot-2018-03-30-at-23.00.41.png 1952w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/a><p id=\"caption-attachment-29021\" class=\"wp-caption-text\">An example cleanup pull request<\/p><\/div>\n<p><span style=\"font-weight: 400;\">These made our builds stricter, thereby removing more hard to spot coding errors. These can be good candidates for DP releases, as they provide good foundations for future development, but can often have subtle or unintended consequences or changes in behavior. The other major internal change that occurred during this DP was running continuous integration tests on Mac as well as Linux.<\/span><\/p>\n<h2><span style=\"font-weight: 400;\">9 DP 2: \u201cVirtual Machine Refactor\u201d<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">Another release in which most of the large changes were internal &#8211; in this case some essential refactoring work on the LiveCode Builder virtual machine to support future development, and provide the basis for Infinite LiveCode. More than anything, it was this phase of the project that would have been much harder to do without the community funding &#8211; it\u2019s essential for moving forward, but doesn\u2019t immediately produce nice shiny features that give a return on the resources invested. This release was not entirely inward-facing though &#8211; we also added one of the most powerful features to the HTML5 engine &#8211; the <code>do \u2026 as javascript<\/code>syntax. This enables you to \u00a0call into the web page from your HTML5 standalone. See <a href=\"https:\/\/legacy.livecode.com\/some-exciting-html5-demos-for-livecode-9-dp-3\/\">this blog post<\/a> for further information.<\/span><\/p>\n<div id=\"attachment_20562\" style=\"width: 260px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/legacy.livecode.com\/wp-content\/uploads\/2016\/12\/spinner.gif\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-20562\" class=\"wp-image-20562 \" src=\"https:\/\/legacy.livecode.com\/wp-content\/uploads\/2016\/12\/spinner.gif\" alt=\"\" width=\"250\" height=\"225\" \/><\/a><p id=\"caption-attachment-20562\" class=\"wp-caption-text\">The spinner widget, added in DP 2<\/p><\/div>\n<p><span style=\"font-weight: 400;\">New extensions: <\/span><\/p>\n<ul>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Spinner widget<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Command-line option parsing script library<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">OAuth2 script library<\/span><\/li>\n<\/ul>\n<h2><span style=\"font-weight: 400;\">9.0 DP 3 &amp; 4: \u201cTrundling Along\u201d<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">As you can see from the timeline, the 9 DP 3 release was somewhat low-key, other than the additional tests which mainly came from testing docs extracted from extensions. DP 4 contained support for multi-module extension loading which will prove crucial to cross-platform native widgets &#8211; of which more later. Otherwise, as is typical of these early 9 DPs, the release contained a swathe of community-contributed documentation updates and fixes. <\/span><\/p>\n<h2><span style=\"font-weight: 400;\">9.0 DP 5: \u201cDefect Resolution\u201d<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">One of the tools we use for identifying code issues is \u2018Coverity Scan\u2019 &#8211; a static analysis tool which is free for open-source projects. <a href=\"https:\/\/github.com\/livecode\/livecode\/pulls?page=1&amp;q=is%3Apr+coverity&amp;utf8=%E2%9C%93\">Searching for \u2018coverity\u2019 in the LiveCode git repo<\/a> reveals how valuable this tool has been for us- over 100 pull requests, many of which fix multiple identified issues &#8211; from things like dead code identification (which can turn out to reveal something serious, for example if some code you <\/span><i><span style=\"font-weight: 400;\">thought<\/span><\/i><span style=\"font-weight: 400;\"> was running actual never does) to buffer overruns and uninitialized variable access.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Unfortunately, after the overhaul of DP 7, our Travis builds take longer than the maximum allowed time when the time taken for Coverity static analysis is added. In order to reinstate this invaluable service, we need to rework the build system so that a few more third-party libraries are prebuilt (like CEF, OpenSSL, and ICU are). This would be very beneficial in general &#8211; especially when you consider the fact that we build Skia (among other things) <\/span><i><span style=\"font-weight: 400;\">more than 10 times<\/span><\/i><span style=\"font-weight: 400;\"> for every build &#8211; taking into account the number of pull requests that have gone into 9.0, including retries, failed builds etc, I suspect it has been built in excess of 10,000 times by our build system in the course of getting to 9.0 GM.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Another somewhat \u2018internal\u2019 change for this DP was updating the Mac builds to support C++11 features (of which more to come in the aforementioned DP 7)<\/span><\/p>\n<div id=\"attachment_23063\" style=\"width: 478px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/legacy.livecode.com\/wp-content\/uploads\/2017\/09\/scriptprofiler-1024x591.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-23063\" class=\"wp-image-23063 \" src=\"https:\/\/legacy.livecode.com\/wp-content\/uploads\/2017\/09\/scriptprofiler-1024x591-300x173.png\" alt=\"\" width=\"468\" height=\"270\" srcset=\"https:\/\/legacy.livecode.com\/wp-content\/uploads\/2017\/09\/scriptprofiler-1024x591-300x173.png 300w, https:\/\/legacy.livecode.com\/wp-content\/uploads\/2017\/09\/scriptprofiler-1024x591-768x443.png 768w, https:\/\/legacy.livecode.com\/wp-content\/uploads\/2017\/09\/scriptprofiler-1024x591.png 1024w\" sizes=\"auto, (max-width: 468px) 100vw, 468px\" \/><\/a><p id=\"caption-attachment-23063\" class=\"wp-caption-text\">The script profiler was added to the Business edition in DP 5<\/p><\/div>\n<p><span style=\"font-weight: 400;\">New extensions:<\/span><\/p>\n<ul>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">MIME library<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Remote debugger<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Script profiler<\/span><\/li>\n<\/ul>\n<h2><span style=\"font-weight: 400;\">9 DP 6: \u201cJava\u201d<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">9.0 DP 6 saw the first version of the Java Foreign Function Interface (FFI). See the associated <a href=\"https:\/\/legacy.livecode.com\/livecode-9-0-dp-6-infinite-livecode-preview\/\">blog post<\/a><\/span><span style=\"font-weight: 400;\">\u00a0for some sample code. This allowed basic access to the Android API, instantly making a large portion of the built-in functionality available to LiveCode apps. We also added a java utility library, providing the ability to convert between some LiveCode and Java types. This served simultaneously as a watershed moment for LiveCode\u2019s Android deployment, and also as a genuine proof-of-concept for Infinite LiveCode in general, providing a rough template for the Objective-C FFI to come. This work would likely have been applied rapidly to create some initial Android extensions, were it not for&#8230;<\/span><\/p>\n<h2><span style=\"font-weight: 400;\">9 DP 7: \u201cYak Shave\u201d<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">It pains me to even cast my mind back to DP 7. It is the release that brought the phrase &#8220;Yak shave&#8221; rapidly into the LiveCode lexicon.<\/span><\/p>\n<blockquote class=\"twitter-tweet\" data-lang=\"en\">\n<p dir=\"ltr\" lang=\"en\">What\u2019s the emoji for yak shave?<\/p>\n<p>\u2014 Wynn Netherland (@pengwynn) <a href=\"https:\/\/twitter.com\/pengwynn\/status\/423536456078868482?ref_src=twsrc%5Etfw\">January 15, 2014<\/a><\/p><\/blockquote>\n<p><script async=\"\" src=\"https:\/\/platform.twitter.com\/widgets.js\" charset=\"utf-8\"><\/script><\/p>\n<p><span style=\"font-weight: 400;\">The complications arose due to a seemingly fairly straightforward commission to add emoji support to the LiveCode field. The task as we saw it would consist of updating the third-party graphics library Skia. This would indeed have been the simple task we thought, and only taken a week or so, if it had merely been a case of grabbing the Skia source code and updating any uses of changed APIs. Actually, even if this was &#8216;all&#8217; we had to do, it would have taken most of the 3 months it took to release 9.0 DP 7.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">The first problems arose when the version of Skia we needed required C++11 support. Some of our existing toolchains were OK in this regard, (recall this was added for Mac back in DP 1) and some weren&#8217;t. Even if we were being as conservative as possible, there&#8217;s no practical way for us to maintain source code that uses different Skia versions for different platforms. This meant updating toolchains for pretty much every platform we support. OK, maybe not such a huge task if everything works out ok, but we also continue to release the 8.1 series. Updated toolchains can cause unknown instabilities &#8211; as such it is not suitable for maintenance releases. Therefore the first task, prior to updating Skia, was to change the build system so that we could build different releases using different toolchains.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Here is a sneak peek at our buildbot-generated builder status page, post- DP 7:<\/span><span style=\"font-weight: 400;\"><a href=\"https:\/\/legacy.livecode.com\/wp-content\/uploads\/2018\/04\/Screen-Shot-2018-03-30-at-00.57.42.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-29022 aligncenter\" src=\"https:\/\/legacy.livecode.com\/wp-content\/uploads\/2018\/04\/Screen-Shot-2018-03-30-at-00.57.42-300x81.png\" alt=\"\" width=\"959\" height=\"259\" srcset=\"https:\/\/legacy.livecode.com\/wp-content\/uploads\/2018\/04\/Screen-Shot-2018-03-30-at-00.57.42-300x81.png 300w, https:\/\/legacy.livecode.com\/wp-content\/uploads\/2018\/04\/Screen-Shot-2018-03-30-at-00.57.42-768x208.png 768w, https:\/\/legacy.livecode.com\/wp-content\/uploads\/2018\/04\/Screen-Shot-2018-03-30-at-00.57.42-1024x277.png 1024w\" sizes=\"auto, (max-width: 959px) 100vw, 959px\" \/><\/a><\/span><\/p>\n<p><span style=\"font-weight: 400;\">If you&#8217;ve ever wondered what goes on behind the scenes of a LiveCode release, some of it for sure involves staring at this page. It is almost exactly three years since the birth of LiveCode\u2019s automated build system Prior to this, every release was done on machines in the office, building every platform *manually*. <\/span><\/p>\n<p><span style=\"font-weight: 400;\">Another build-process nicety that was much nastier at the time was the matter of ICU, OpenSSL and CEF prebuilts. At the time of DP 7 these were done manually also. Shared libraries can be very sensitive to the context they are built in, and there were many issues that arose because of subtly different toolchains used in building the prebuilts to those used in building the engine.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Finally these issues were ironed out; thankfully in the last year we have had the time and will to add prebuilts builders to our build system, meaning we can build updated versions very easily, and need only concern ourselves with updating any API calls that have changed.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">A particularly difficult toolchain update was presented by Windows. We needed to update Windows builds to use Visual Studio 2015 instead of 2010. We also needed to work on the build system to support the updated Windows toolchain. <\/span><\/p>\n<p><span style=\"font-weight: 400;\">This turned out to be a very tricky task as the way we were building for Windows previously (using Wine on Linux) no longer worked. We had to purchase space on the Windows cloud server Azure, and port *all* of our build scripts to Python instead of shell script as the latter don&#8217;t run on Windows. Finally we had to ensure that buildbot worked to build Windows using the new toolchain, which involved quite a bit of fettling with Windows server.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Finally, we could update Skia&#8217;s text rendering backend in order to draw coloured emoji. Provided we could fix a bug introduced in 7.0 preventing emoji on iOS working, and replacing legacy graphics features that were no longer supported by the new Skia, it really felt never-ending.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">It never rains but it pours &#8211; and alongside the toolchain updates we were busy getting on with Infinite LiveCode for Java. We needed to refactor external library loading, as the code was scattered throughout the engine in many places. Unfortunately changing this along with updating our prebuilt libraries caused some very hard to diagnose issues.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Perhaps we should designate 7 as our unlucky number and skip DP 7s in the future. Also &#8216;toolchain&#8217; became a &#8216;verbum non gratum&#8217; in the office, not quite banned outright but you had to be careful using it around Kevin. However we are yet to assign it a euphemism as we have &#8216;moomin&#8217; to the banned word &#8216;refactor&#8217;, introduced in LiveCode 7. (LiveCode 8 did not\u00a0<\/span><span style=\"font-weight: 400;\">add any new banned words to the lexicon).<\/span><\/p>\n<p><span style=\"font-weight: 400;\">DP 7 did see the addition of support for Java interfaces, allowing LiveCode Builder handlers to be registered as the targets for Java interface callbacks, such as event listeners &#8211; see <a href=\"https:\/\/legacy.livecode.com\/using-infinite-livecode-for-android-to-create-native-controls-and-wrap-os-apis\/\">this blog post<\/a> for more details. This was essential for doing anything with the Android API that required responding to user input.\u00a0<\/span><span style=\"font-weight: 400;\">With this piece of the Infinite LiveCode puzzle, almost everything from the Android API was accessible. <\/span><\/p>\n<div id=\"attachment_29033\" style=\"width: 715px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/legacy.livecode.com\/wp-content\/uploads\/2018\/04\/androidbutton.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-29033\" class=\"wp-image-29033\" src=\"https:\/\/legacy.livecode.com\/wp-content\/uploads\/2018\/04\/androidbutton-300x249.png\" alt=\"\" width=\"705\" height=\"585\" srcset=\"https:\/\/legacy.livecode.com\/wp-content\/uploads\/2018\/04\/androidbutton-300x249.png 300w, https:\/\/legacy.livecode.com\/wp-content\/uploads\/2018\/04\/androidbutton.png 642w\" sizes=\"auto, (max-width: 705px) 100vw, 705px\" \/><\/a><p id=\"caption-attachment-29033\" class=\"wp-caption-text\">Android native button widget<\/p><\/div>\n<p><span style=\"font-weight: 400;\">New extensions:<\/span><\/p>\n<ul>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Message Authentication script library<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Dropbox v2 script library<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Diff script library<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">AWS S3 script library<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Android native button widget<\/span><\/li>\n<\/ul>\n<h2><span style=\"font-weight: 400;\">9.0 DP 8 &amp; 9: \u201cObjective-C\u201d<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">Objective-C FFI support was added for Mac in 9.0 DP 8, and for iOS in DP 9. This enabled access to native APIs these platforms. These DPs also saw some improvements to the Java FFI (including the ability to call native methods on the UI thread), plus some general work to make adding new supported languages easier. Another feature for C generally, but also very useful for many parts of the Mac and iOS SDKs, was added in DP 9: C aggregate support. <\/span><span style=\"font-weight: 400;\">This gives the ability to pass and return simple C structs to and from functions.<\/span><\/p>\n<div id=\"attachment_29023\" style=\"width: 723px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/legacy.livecode.com\/wp-content\/uploads\/2018\/04\/Screen-Shot-2018-04-02-at-14.56.11.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-29023\" class=\"wp-image-29023\" src=\"https:\/\/legacy.livecode.com\/wp-content\/uploads\/2018\/04\/Screen-Shot-2018-04-02-at-14.56.11-300x114.png\" alt=\"\" width=\"713\" height=\"271\" srcset=\"https:\/\/legacy.livecode.com\/wp-content\/uploads\/2018\/04\/Screen-Shot-2018-04-02-at-14.56.11-300x114.png 300w, https:\/\/legacy.livecode.com\/wp-content\/uploads\/2018\/04\/Screen-Shot-2018-04-02-at-14.56.11-768x293.png 768w, https:\/\/legacy.livecode.com\/wp-content\/uploads\/2018\/04\/Screen-Shot-2018-04-02-at-14.56.11.png 1022w\" sizes=\"auto, (max-width: 713px) 100vw, 713px\" \/><\/a><p id=\"caption-attachment-29023\" class=\"wp-caption-text\">Mac native field and button widgets<\/p><\/div>\n<p><span style=\"font-weight: 400;\">On the HTML5 side, a libUrl driver was added in DP 9, allowing the standard LiveCode HTTP methods to be used in HTML5 standalones.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">DP 9 was also the first 9 release with a Community Plus edition, which of course means that it was the first to contain autocomplete in the script editor.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">New extensions:<\/span><\/p>\n<ul>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">QR code generation script library<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">HTTPd script library<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Mac native button widget<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Android native field widget<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Audio Recording library for Android<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Mac Native Field widget<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">iOS Native Button widget<\/span><\/li>\n<\/ul>\n<h2><span style=\"font-weight: 400;\">9.0 DP 10: \u201cOne-Click Test\u201d<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">Although there was a major step forward for Android extensions in DP 10 (namely the ability to interface with JAR files- archives containing compiled Java classes), since there was an improvement to interfacing native code on all platforms in DP 11, it fits somewhat better there. The other highlight of DP 10 was the HTML5 deploy library.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">This enables testing of HTML5 apps with a single click, which turns out to be an incredible time saver! It also makes it easy to launch and test with different browsers.<\/span><\/p>\n<div id=\"attachment_29024\" style=\"width: 310px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/legacy.livecode.com\/wp-content\/uploads\/2018\/04\/Screen-Shot-2018-04-01-at-21.58.57.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-29024\" class=\"wp-image-29024 size-medium\" src=\"https:\/\/legacy.livecode.com\/wp-content\/uploads\/2018\/04\/Screen-Shot-2018-04-01-at-21.58.57-300x253.png\" alt=\"\" width=\"300\" height=\"253\" srcset=\"https:\/\/legacy.livecode.com\/wp-content\/uploads\/2018\/04\/Screen-Shot-2018-04-01-at-21.58.57-300x253.png 300w, https:\/\/legacy.livecode.com\/wp-content\/uploads\/2018\/04\/Screen-Shot-2018-04-01-at-21.58.57.png 608w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><p id=\"caption-attachment-29024\" class=\"wp-caption-text\">Various HTML5 deployment target options<\/p><\/div>\n<h2><span style=\"font-weight: 400;\">9.0 DP 11: \u201cGoing Native\u201d<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">The other aim of the Infinite LiveCode project was to enable the use of third-party libraries written in other languages. To this end we added the ability to include and interface first with JAR files in DP 10, and subsequently AAR files (archives containing JAR files, and other assets for Android third-party libraries) in DP 11. Together with support for merging Android manifests, this enabled the inclusion of almost any Java-based Android extensions. We also added extension shared library loading on all platforms (except HTML5, for the time being). Now with the appropriate folder structure, you can simply plug your shared libraries in to LiveCode via a LiveCode builder extension, with very little extra effort. This reduces the collection of third-party C libraries that require using the old externals interface to a set of edge cases- and we will work on eliminating those as they arise. And going via LCB means you don\u2019t need to set up any XCode \/ Visual Studio \/ other projects and compile C glue code.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">On the HTML5 side, DP 11 contained windowing support &#8211; enabling the use not only of multiple stack windows, and things like the go \u2026 in window command, but also features of the LiveCode engine that are implemented using transient stack windows &#8211; that\u2019s tooltips, dialogs and popup menus.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">As if that weren\u2019t enough, aside from the Infinite LiveCode and HTML5 developments this release also saw the first version of SVG support within the LiveCode image object, and the ability to create \u2018script library\u2019 extensions using the extension builder. In particular this means you can turn your LiveCode Script utility libraries into extension packages that can be uploaded to the store. See the <a href=\"https:\/\/legacy.livecode.com\/livecode-9-the-final-preview\/\">associated blog post<\/a><\/span><span style=\"font-weight: 400;\">\u00a0for details on all the features added in DP 11.<\/span><\/p>\n<div id=\"attachment_29030\" style=\"width: 575px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/legacy.livecode.com\/wp-content\/uploads\/2018\/04\/Screen-Shot-2017-12-21-at-13.34.03.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-29030\" class=\"wp-image-29030 \" src=\"https:\/\/legacy.livecode.com\/wp-content\/uploads\/2018\/04\/Screen-Shot-2017-12-21-at-13.34.03-300x241.png\" alt=\"\" width=\"565\" height=\"454\" srcset=\"https:\/\/legacy.livecode.com\/wp-content\/uploads\/2018\/04\/Screen-Shot-2017-12-21-at-13.34.03-300x241.png 300w, https:\/\/legacy.livecode.com\/wp-content\/uploads\/2018\/04\/Screen-Shot-2017-12-21-at-13.34.03-768x617.png 768w, https:\/\/legacy.livecode.com\/wp-content\/uploads\/2018\/04\/Screen-Shot-2017-12-21-at-13.34.03-1024x823.png 1024w, https:\/\/legacy.livecode.com\/wp-content\/uploads\/2018\/04\/Screen-Shot-2017-12-21-at-13.34.03.png 1760w\" sizes=\"auto, (max-width: 565px) 100vw, 565px\" \/><\/a><p id=\"caption-attachment-29030\" class=\"wp-caption-text\">Map widget on Android and iOS<\/p><\/div>\n<p><span style=\"font-weight: 400;\">New extensions:<\/span><\/p>\n<ul>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Android toast notification library<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Native map widget for Android, iOS and Mac 64 bit<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Signature widget<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Secure key library for Android, iOS and Mac<\/span><\/li>\n<\/ul>\n<h2><span style=\"font-weight: 400;\">9.0 RC 1: \u201cBonus Features\u201d<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">Although strictly the last DP in a series should be feature-complete, we did sneak some bonus features into 9 RC 1. We were on a tight release schedule, but didn\u2019t want to delay some really useful (and internally well-tested) features that didn\u2019t impact on the core engine. Indeed, it could be argued that some things like new extensions are out-of-stream anyway, as updates could (and will in the future) be managed through the extensions store.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Thus RC 1 contained native layer support for HTML5 &#8211; something we felt it was important to include so that it would be possible to write functional cross-platform widgets in 9.0. <\/span><\/p>\n<p><span style=\"font-weight: 400;\">We also added a timezone handling library &#8211; this is significant as the extension accesses a small third-party library compiled for all platforms to read timezone information from its resource files, using the code library work from DP 11.<\/span><\/p>\n<div id=\"attachment_29032\" style=\"width: 687px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/legacy.livecode.com\/wp-content\/uploads\/2018\/04\/html5button.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-29032\" class=\"wp-image-29032\" src=\"https:\/\/legacy.livecode.com\/wp-content\/uploads\/2018\/04\/html5button-300x199.png\" alt=\"\" width=\"677\" height=\"449\" srcset=\"https:\/\/legacy.livecode.com\/wp-content\/uploads\/2018\/04\/html5button-300x199.png 300w, https:\/\/legacy.livecode.com\/wp-content\/uploads\/2018\/04\/html5button.png 761w\" sizes=\"auto, (max-width: 677px) 100vw, 677px\" \/><\/a><p id=\"caption-attachment-29032\" class=\"wp-caption-text\">HTML5 native button widget<\/p><\/div>\n<p><span style=\"font-weight: 400;\">New extensions:<\/span><\/p>\n<ul>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Timezone library<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">HTML5 native button widget<\/span><\/li>\n<\/ul>\n<h1><span style=\"font-weight: 400;\">Extensions Store<\/span><\/h1>\n<p><span style=\"font-weight: 400;\">We are working hard on the first version of our new Extensions Store, which should be ready shortly. It will appear automatically in place of the old one in the Store tab of the Extension Manager.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">There are a whole bunch of things we are looking into adding to the store in future iterations, to make things easier and better for uploaders and downloaders alike. These include:<\/span><\/p>\n<ul>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Allowing you to specify a GitHub url for an extension<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Different licensing \/ commercial extension options<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Porting all the content from LiveCode Share to the extensions store<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">More search options<\/span><\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">A couple of previous issues should be mitigated in this iteration of the store, including the following:<\/span><\/p>\n<ul>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">While we work on ways to improve module dependency support, if you have support modules that are required by your extensions, you can use the new multi-module extension building to compile those modules into one bytecode file thereby ensuring your extension can be installed from a single download.<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">The 9.0 IDE will recompile any extensions it can, without overwriting the module bytecode file. So extensions made in 8.0 and uploaded to the store can be downloaded and installed in 9.0 (providing no unsupported features are being used &#8211; principally the use of the `execute script` syntax in widget lifecycle handlers).<\/span><\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">So please get writing extensions! We would love to see the store full of community-authored extensions. As with LiveCode DP releases in general, the best way to influence the direction of the store is to get in early, try it out and give us your feedback. If you are new to writing extensions, check out the <a href=\"https:\/\/legacy.livecode.com\/topic\/introduction-2\/\">extensions course online<\/a>, and the Extending LiveCode guide in the IDE documentation viewer, or <a href=\"https:\/\/github.com\/livecode\/livecode-ide\/blob\/develop\/Documentation\/guides\/Extending%20LiveCode.md\">on GitHub<\/a><\/span><\/p>\n<h1><span style=\"font-weight: 400;\">LiveCode 9.0 in the community<\/span><\/h1>\n<p><span style=\"font-weight: 400;\">Here are some of the ways you played a role in making the 9.0 GM release. <\/span><\/p>\n<h2><span style=\"font-weight: 400;\">Bug Reports<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">The following chart shows the top bug reporters for any LiveCode 9.0 release. Note that we do not have statistics for which release the bug was originally reported against, as we try to change the version to the earliest in which a bug appears. As such the chart is skewed towards bugs that turned out to eventually be 9.0 *only* &#8211; apologies if you tested 9.0 a lot and kept finding issues from further back!<\/span><\/p>\n<div id=\"attachment_29035\" style=\"width: 793px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/legacy.livecode.com\/wp-content\/uploads\/2018\/04\/bugs-1.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-29035\" class=\"wp-image-29035\" src=\"https:\/\/legacy.livecode.com\/wp-content\/uploads\/2018\/04\/bugs-1-300x120.png\" alt=\"\" width=\"783\" height=\"313\" srcset=\"https:\/\/legacy.livecode.com\/wp-content\/uploads\/2018\/04\/bugs-1-300x120.png 300w, https:\/\/legacy.livecode.com\/wp-content\/uploads\/2018\/04\/bugs-1-768x307.png 768w, https:\/\/legacy.livecode.com\/wp-content\/uploads\/2018\/04\/bugs-1.png 962w\" sizes=\"auto, (max-width: 783px) 100vw, 783px\" \/><\/a><p id=\"caption-attachment-29035\" class=\"wp-caption-text\">Line Graph SVG icon marker styles added in DP 2!<\/p><\/div>\n<p>Way to go Mikey! I would also like to give a special mention to [-hh], who I\u2019m pretty sure did more testing and feeding back on both LiveCode Builder AND HTML5 deployment than anyone, and whose examples and experiments really show what is possible. If one of those H\u2019s doesn\u2019t stand for \u2018heroic&#8217; then may I suggest a name change to [-hhh]?<\/p>\n<h2><span style=\"font-weight: 400;\">GitHub Contributions<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">It\u2019s always dangerous to single any particular people out, but I\u2019m going to do so anyway. Around about the time of DP 8, someone popped up on GitHub, prompting various chatter around the office. In an alarmingly short space of time, <a href=\"https:\/\/github.com\/bwmilby\">@bwmilby<\/a> went from \u201cWho\u2019s this Brian Milby chap?\u201d to \u201cOoh, I hope Brian Milby decides to work on that\u201d &#8211; contributing to all areas of LiveCode: docs, extensions, IDE and engine. Thanks very much Brian! <a href=\"https:\/\/github.com\/trevordevore\">@trevordevore<\/a> contributed code to the majority of 9.0 DPs &#8211; even sneaking pull requests into the short development windows of DP 3 and 4. Apart from the aforementioned docs contributors (<a href=\"https:\/\/github.com\/asayd\">@asayd<\/a> and <a href=\"https:\/\/github.com\/seaniepie\">@seaniepie<\/a>),\u00a0<a href=\"https:\/\/github.com\/jameshale\">@jameshale<\/a>, <a href=\"https:\/\/github.com\/bhall2001\">@bhall2001<\/a> and <a href=\"https:\/\/github.com\/BerndN\">@BerndN<\/a> contributed significantly to docs and the IDE,\u00a0<a href=\"https:\/\/github.com\/HedgeHao\">@HedgeHao<\/a> was very active on the engine side, particularly improving various things in the Android engine, and <a href=\"https:\/\/github.com\/mwieder\">@mwieder<\/a> removed a bunch of data files and added a bunch of tests.<\/span><\/p>\n<h2><span style=\"font-weight: 400;\">Use List and Forums<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">Firstly I\u2019d like to highlight the <a href=\"http:\/\/forums.livecode.com\/viewforum.php?f=93&amp;sid=5fe871a96aafb194eb5c22687ae41cbf\">LiveCode Builder thread on the forums<\/a> &#8211; this has been extremely helpful in identifying issues and missing features in LiveCode Builder, plus gaps in the documentation, so thank you to everyone who has posted and continues to post in there. Secondly, <a href=\"http:\/\/lists.runrev.com\/pipermail\/use-livecode\/2017-November\/242878.html\">this thread<\/a> in the use list on SVG support<\/span><span style=\"font-weight: 400;\">, which started out as a discussion about naming a new widget, and ended up with the realisation that it would be much better to add the SVG support to the existing image object.<\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>LiveCode 9 contains so many new features that it&#8217;s almost impossible to cover them all in detail in a single blog post. So I&#8217;m not going to try. There have been several other blog posts along the way detailing specific features, which will be linked in the course of this blog &#8211; see these for<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"om_disable_all_campaigns":false,"footnotes":""},"categories":[45,46],"tags":[],"class_list":["post-29019","post","type-post","status-publish","format-standard","hentry","category-blog","category-whats-new"],"acf":[],"_links":{"self":[{"href":"https:\/\/legacy.livecode.com\/wp-json\/wp\/v2\/posts\/29019","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/legacy.livecode.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/legacy.livecode.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/legacy.livecode.com\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/legacy.livecode.com\/wp-json\/wp\/v2\/comments?post=29019"}],"version-history":[{"count":5,"href":"https:\/\/legacy.livecode.com\/wp-json\/wp\/v2\/posts\/29019\/revisions"}],"predecessor-version":[{"id":37361,"href":"https:\/\/legacy.livecode.com\/wp-json\/wp\/v2\/posts\/29019\/revisions\/37361"}],"wp:attachment":[{"href":"https:\/\/legacy.livecode.com\/wp-json\/wp\/v2\/media?parent=29019"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/legacy.livecode.com\/wp-json\/wp\/v2\/categories?post=29019"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/legacy.livecode.com\/wp-json\/wp\/v2\/tags?post=29019"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}