Support raising a GitHub issue from the error view controller
Bump the version to 1.0.0
actually support RMDIR
Implement system.SetHiddenFile()
NumStr with negative width was always returning an empty string
Reuse drawableIds once the win/bmp has been closed
MachineUniqueId shouldnât rely on dereference
Max(array, numVals) was completely broken
support STYLE()
PRINT() should always use gTMODE replace
Support gXPRINT
Support tight line spacing and fullscreen flags in DIALOG
gINVERT was inverting the wrong coordinates
Ensure the correct library section is selected when switching program
Remove search as it causes program layout issues on first run Unfortunately having a search controller in AllProgramsViewController was causing our UISplitViewController to get into a weird intiial state which was then leading to an overly large navigation bar when pushing ProgramViewController. That navigation bar was then occluding the top of the programâs RootView meaning it wasnât possible to interact with the menu. This change removes search until we can find the issue with our use of UISplitViewController. THereâs a longer discussion on the issue tracking this: https://github.com/inseven/opolua/issues/206
Implement sysram1.GetFileSize
Ensure the source viewer respects safe areas
TBarInit() is supposed to call gUPDATE OFF
Offset menu bar by an extra pixel
Rename the app to âOpoLuaâ
Update Welcome app for new naming and first screen
Add sections (currently empty) for running and all programs This change also introduces a new âFilesâ section (currently pointing to the Bundle root) which is intended to contain example files to help people get started and get used to the app.
Add example image files
Show icons for mbm files
Show icons for snd files
Show icons for help files
Add basic image viewer
Separate example scripts and development scripts sidebar locations
Show icons in the task list
Show the running programs in the top-level âRunning Programsâ section
Persist the device configuration per program
Populate the list of all programs
Hide/show example library locations
Support gORIGINX, gORIGINY
Initial support for EPOC-native dialogs
Add a âThanksâ section to the about screen
External links for contributors
Show a wizard for installs
Support accessing documents in Files.app
Support installing programs from the Files app
Add an escape button to the keyboard
epoc-native ALERTs
Simple text file / source viewer
Implement COPY()
Implement KMOD()
Implement gPEEKLINE()
Implement TBarColor
Allow programs to be force quit
Show a count of the number of running programs in the sidebar
Better tracking of unimplemented function errors
Show more user friendly errors and improved error view
Add a support link to the about view
Offer to automatically create a GitHub issue if users encounter unimplemented operations
Share screenshots from the options menu
Support IOCANCEL for timers (probably) fixes #154
Show the icon for the newly installed program on the installer summary
Add Welcome app
Add support for viewing OPL files
Support hardware keyboard autorepeat
Add pull-to-refresh to allow users to manually trigger an update While it should only be necessary if the user has added large external locations and weâre unable to monitor directories for changes, this will allow users to manually trigger a refresh if things donât look right, and serves as a bit of a get out of jail free card for our directory monitoring.
Support launching âapplicationsâ from with OPL programs
Share text from the source viewer
Share images from MBM files
Add the most basic sound viewer
Support showing the images in AIF files
Indicate taps on tasklist and clock toolbar buttons are consumed
Typo in âRunning Programsâ
Move the dialog tests into the top-level examples directory
Correct the Series 5 accent colour
Add image, sound and help icons to the Series 5 theme
Ensure directories donât over animate changes
Show all programs in a grid view
Improve the layout of the directory item context menu
Make âAll Programsâ the default section
Hide file extension for OPO files
Show an alert when attempting to open an unsupported file
Only show programs from enabled locations in the all programs view
Remoe unnecessary logging
make mPOPUP work even if called from a pendown event
shorten menu selection delay time, and extend mPOPUP with init param
tweak text y position on buttons
Recursively search all locations for programs
Move test programs into their own directory
Show a placeholder when there are no running programs
Improve the responsiveness of first loads
Ensure directory views respond to theme changes
Pop to the root when tapping on the current sidebar section on iPad
Select the nearest candidate icon size
Support > 4 toolbar buttons
Support non-English AIF files
correct case of result code in dialog result
Limit max dialog size to screen dimensions
refactor messup
Ensure the console is scrollable
Use alert for editing text fields
Improve the EPOC logo in dark mode
Desaturate the EPOC logo in Dark Mode
Support editing pre-existing dialog strings
dialog metrics for bare buttons and centre-aligned text
Scale the program screen on smaller devices
Add opolua license, and links to InSeven Limited and the GitHub project
Show programs in the âRunning Programsâ section when switching program
Highlight the âRunning Programsâ sidebar section when switching to a running program This change also includes a drive-by fix to remove the unnecessary LibraryViewController.Item struct.
Show the app icon in the about view
Add a link to the privacy policy
make locale handling in AIF captions match what the swift code expects
Handle the more cornery uses of ReadRsc
Show keyboard and controller buttons in a toolbar on iPhone
Donât leave the toolbar up when navigating away from the program view
Ensure soft key presses last a non-zero amount of time (100ms) This fixes issues where some programs ignore instantaneous key presses.
Show a device appropriate icon for the âOn My âŠâ sidebar section
Donât create pen events beyond the screen area
Tidy up the spacing of the about view
Show the correct name for the âOn My âŠâ folder
Greater consistency with menu and button placement and options
Crash when adding an existing location #4
Improve list performance
Donât show editing options for readonly directories #68
âNo Running Programsâ text doesnât rotate correctly #97
crash when calling gORDER(1, âŠ)
TRAP was not clearing the error value on entry
DIR$ should allow relative paths
LCLanguage vs LCCountryCode
Add Diligence license and correct commit links
Update the Diligence license
sprite animation timings
display keyboard shortcuts in menu items with flags
Intermittent crashes when scanning for files and programs
Rename the library to âLibraryâ (instead of âOPLâ)
Potential memory leak in the installer and library views
Use the theme tint color for settings toggle switches
Ensure the soft keyboard works
Donât animate running program count changes
Add a pointer effect to the silk screen buttons
Dynamically hide/show dislcosure indicators when switching between library sidebar and list styles
Ensure the installer introduction can scroll in landscape
Remove the directory edit menu
Show the sidebar as an overlay in portrait on iPad
Donât attempt to reload sections that donât exist yet
Help users find the menu button when using the âMusicâ program
Support installation from undownloaded iCloud Drive files
Update directory listings after installing programs
Recursively watch for directory changes to ensure systems are correctly detected
Automatically download iCloud Drive files so that theyâre available when running programs
Donât show configuration options for programs in readonly locations
Donât show the console in the options menu Since weâre only showing crashes in the console, it doesnât really make much sense to let users open it.
Navigating through directories can cause the app to crash We were leaking the Directory objects thanks to a non-weak delegate and therefore leaking all the file handles associated with the directory monitoring. It doesnât take long for things to go south in this scenario.
Address OOM issues when changing indexable locations rapidly
Update âAll Programsâ when files change and programs are installed
Add a dedicated icon for text files
System file system detection recurses infinitely #137
Disable partial Revo support on release builds
Unnecessary directory monitoring can lead to crashes
Donât strip extensions from files
Reveal the newly installed program on successful installation
Use the localized error description for error alerts This switches back to using errorDescription and localizedDescription as the mechanism for getting localised descriptions for all error types. It tries to preserve the underlying behaviour of the new classes and adds slightly more user-friendly error messages for the database and unimplemented operation errors.
Ensure the source text view always bounce-scrolls vertically
Ensure silk-screen buttons gray out when the program terminates It turns out that the new UIButton.Configuration-based constructors will automatically gray out when disabled, so the only work to do to fix this issue was to switch to the new constructors
Out of range charcodes passed to CHR$()
tapdance the toolbar code to handle latching non-latchable buttons
Implement {OS,ROM}Version{Major,Minor,Build}
Implement GETEVENT() fixes #175
Implement SIDisplaySize, SIBatteryVolts
Rate limit rescans when files change
Donât do unnecessary work when files change quickly This introduces a delay of 0.1s to âdebounceâ any file change notifications. In my testing, it seems sufficient to ensure we donât do more than one rescan during file writes.
Add dedicated sound and folder dark mode icons
Fail gracefully when attempting to monitor too many directories This introduces a hard limit to the number of directories we try to monitor, hopefully ensuring that we do not hit the OS limits for open file handles. When the limit is hit, all monitoring fails and will only restart when the application is relaunched. We donât attempt a partial failure (failing just one observer) as itâs fiddly to fairly and effectively determine which observer contributes the largest number of directories and should be abandoned. In the long term we could try to do something clever, but that way madness lies.
Improve color icon shadow appearance in Dark Mode This change switches to using translucent shadows that replicate the same 33% gray used by the original icons to ensure they render well in both regular and dark mode.
Ensure programs from iCloud Drive automatically appear in âAll Programsâ
Address race conditions that could sometimes cause file changes to be missed This change switches to using a breadth-first approach to walking the directory tree, ensuring directory monitors are in place and started for a directory before descending into its sub-directories. This means we should no longer be at risk of missing intermediate changes between listing the directory structure and setting up monitors.
Donât perform unnecessary rescans when files change This introduces a new class, RateLimiter, which makes it easy to schedule delayed updates and uses this in ProgramDetector and UbiquitousDownloader.
Directories and All Programs stop being able to detect changes
Donât automatically create D drive folders during installation This change also disallows D drives in .system bundles to ensure we have the freedom to easily implement a shared D drive in the future.
Offer to raise GitHub Issues for internal errors and improve description template
donât ignore TBarColor called after the toolbar has been set up
donât use an unprotected call to write event data
toolbar redraw when TBarSetTitle is called after buttons are added
Workaround some drawing artifacts in border logic
Donât apply key repeat to the menu key
Add empty icon to toolbar buttons without icons
Improve the appearance of Series 5 grayscale icons in dark mode This change makes the grayscale icon shadows translucent (33%) so they render correctly in dark mode. It also adds colour to the unknown application icon (to match the unknown file icon), and fixes a small image file detection regression.
Donât scale-up small images in the image viewer
Correct margins on the image viewer cells
Cache directory items to improve performance
Use more targeted caches to ensure we donât over cache file metadata Unfortunately this doesnât offer anywhere near the same performance improvements we were seeing earlier but it does seem to speed things up by about 25%.
Donât over-cache directory itmes for systems Previously we were failing to invalidate the cache when items in nested folders within systems changed. This introduces a new struct ApplicationMetadata which is essentially a tuple of the app info and its on-disk URL to allow us to key an icon cache by the AIFâs mtime.
Small aesthetic tweak to the unknown application icon
Correct definition of modulus to match OPL/C semantics
digital clock when time is between 12:00 and 13:00
Consume toolbar pointer events more consistently
Buttons without icons should always have centered text
Add audio tab to welcome app, lots of small tweaks
âShow System Contentsâ doesnât fit in the context menu
Support saving screenshots to Photos
Add a play button to the sound view controller
Make the play button look better in the sound viewer
Show a pause button when playing sounds
Support cancellation of sound playback
Donât leak the program and Lua runtime when quitting programs
Stop playing sound when dismissing the sound viewer
Show AIF captions in the resource viewer
Fix a crash when viewing poorly constructed AIF files
Add the AIF UID3 to the resource viewer
Support dynamic row sizing in the resource viewer
System spacing on the installer summery view
Correct the bitrate of the wilhelm scream
Add the Wilhelm Scream to the example files and update the file names
Support for dialogs and choice items This includes some drive-by menu appearance fixes.
Support drawing lines and circles
Add basic iOS icon
Call specific procedures from the context menu This change introduces a context menu on library items and allows procedures to be called directly. It also includes a drive-by fix to add support for text input in dialogs.
Support dialogs with multiple buttons
Show directories in the library view This change updates LibraryViewController (now renamed to DirectoryViewController) to show directories and allow drill-down into directories. This should allow us to organise our (increasingly extensive) example code better in the future and prepares the way for adding user defined locations.
Top-level library view for listing different locations
Add locations from iOS file providers like iCloud Drive This is a first-cut attempt at supporting file providers in the top-level library.
Rudimentary support for event handling
Flesh out iOS touch events
Support cancelling asynchronous events
Toolbar buttons are functional
Support bitmap masks on gBUTTON/toolbar buttons
new memory model supporting addressof and arbitrary memory read/write
Beep beep beep!
Support the KEY opcode
App icons in the library views and launch as different devices
Separate console view controller This change moves the console into a separate view controller which we can use to add other debugging functions in the future. The implementation is incredibly basic at the moment, but hopefully sufficient for our needs.
Rudimentary support for gIPRINT and BUSY This also includes some drive-by refactoring to make it easier to reuse some of the graphics primitives, and a small bug fix in event cancellation.
Rudimentary support for software and hardware games controllers This currently has a hard-coded keymap for Jumpy!
Delete items and pull-to-refresh directories
Detect applications within full system directories
Browse package contents
Possibly functional installSisFile(path:) API
Use the host directory structure for system packages
Rudimentary installer support
bmp OPX
Rudimentary support for sprites This change pulls many of the graphics operations out of ProgramViewController and into a new WindowServer class. The ownership model is a little wrong right now, and there remain a number of bits of cleanup to do around sprites, not least honouring the animation timing.
gSETPENWIDTH
Alloc support
Support cancelling async events
Support for bitmap fonts specifically KFontDigital35
Background and restore running programs This change introduces TaskManager which tracks running programs and allows for navigating back to them. Right now, thereâs no support for relaunching programs for different devices, meaning that if you run for a specific device, the program will run, but not be tracked by the task manager.
Quit running apps from the context menu
dumpmbm.lua and dumpaif.lua now export to .bmp rather than raw pixels
Support LoadRsc, ReadRsc, ReadRscLong, UnloadRsc
support gCOLORBACKGROUND() in its ER5 opcode value
Added eikon symbol font
implement mPOPUP
Support split view on iPad and iPhone Pro Max
Support sending background and foreground events
Switch between running programs
Quit and switch programs from the program view
Add clipboard and zoom silkscreen buttons
Colour clock for Series 7
epoc-native menus
Hide/show the wallpaper This change also changes the default theme to the colour Series 7 theme.
Default controller mappings for Jumpy! and Asteroids This change introduces controller mapping lookup by UID3 and adds a default mapping to be used by all apps, and specific mappings for Jumpy! and Asteroids.
Store the clock type for all programs
Correct margins for the console output
Sort the OPO files by name using Finder sort This change also introduces a couple of convenience abstractions (OPLObject, and Library) to keep code out of the view controllers.
Donât show the .opo extension in the library
Use an icon for the menu toolbar item
Pop the view controller when the program finishes
Rudimentary feedback that a menu item has a trailing separator This change also switches to using OptionSet for flags as itâs easier to query.
Button to dismiss the menu
Use application tint color for selectable menu items
Update the menu to match the latest iOS menu styles This change also combines the two menu view controllers into one.
Back the image rendering with a framebuffer for improved accuracy and performance
gCircle opcode
Line coords are absolute not relative
Text alignment in dialogs doesnât work
Support cancelling dialogs
Support prompt and value in dialog text rows
Support the enter key in dialogs
Ensure only selectable text can be selected in dialogs
Text alignment should be limited to body text
Donât synthesize a cancel button Leave it to the user to drag-to-dismiss if they want to cancel without tapping an explicit button. This far more closely matches the EPOC implementation. This change also leands more heavily on the drop-down menu for showing dialog options to simplify the code and prepare for showing buttons directly in the view.
Show all buttons at the bottom of dialogs
Support separators in dialogs
Ignore dot files
Show apps in directory listings
Correct the screen dimensions and position windows correctly This is a very small incremental change that explicitly disables layout constraints within CanvasView and adds the window subviews to the canvas view to avoid needing to use layout constraints (we really do want to manually control their absolute positions). It also hardcodes the dimensions of the canvas view to match the requested screen size, and puts the console below the screen. Weâll probably made different choices in the future, but this makes it much clearer where the screen bounds are and ensures the console isnât obscured (or vice versa).
Donât use interpolation when scaling the screen This change removes the UIImageView from CanvasView and instead uses core graphics to draw the view directly by blitting the contents of the canvas to screen. This keeps our view hierarchy simpler, and allows us to manually control how the bitmap is scaled to the view and disable interpolation (so we donât get fuzzy pixels).
Grey out the text when the program has terminated This is a little more in-keeping with iOS.
Keep the console scrolled to the end
Assign the correct window identifier to touch events
Ensure the cancelled event type matches the request type
Set delegate on child CanvasViews
Use the new iOS toolbar button menus
Buffer touch and keyboard events This change also implements getch using the regular event queue and scheduler to support both GET and GETEVENTA32 menu implementations.
Implement the ASC opcode
Work-around the weird inability to dispatch to queues from within the Lua callbacks This is a really really hacky work-around to the apparent issue that we donât have a fully functional GCD within the Lua callbacks. Right now it spins up a separate dispatch queue and and has this sit on a blocking concurrent queue which we dispatch async operations to from the Lua thread. This is only a proof of concept and should either be ripped out (if we can work out why GCD isnât working correctly in the Lua callbacks), or replaced with an actual operation queue which we can manage more cleanly as part of a wider runtime.
runOpo.lua
Hairy lines
broken TBarShow impl
checkbox dialog item and better sanitising of choice initial val
using runtime:callProc() from within an OPL module implemented in Lua
scaling issue in gCOPY when size is larger than the source bitmap
lack of graphics flush on waitForAnyRequest
PEEKB and POKEB should operate on unsigned char not signed char
Incorrect return code from DIALOG when using uppercase codes
Return correct string length from SAddr etc
Address some lifecycle issues with request cancellation
Donât cross-post requests to a secondary queue
GET
Ensure default window is marked as a window
Alpha of folder-48.png
Ensure keyboard input works now that the console has been removed
parallel changes
.set draw mode for 32bpp images
shut up build warnings
Send key presses when using the gamepad
Update the icons for iOS and iPadOS
Jumpy! doesnât like key presses from the controller
Send key press events when using game controllers
Allow the keyboard to be dismissed in dialogs
Donât automatically correct or capitalize dialog edit fields
Ignore hidden files in system roots
Use correct value for KRequestPending
relative path handling
Donât require aif files to detect bundles and improve case insensitivity
Dismiss the program when it has terminated
oopses in installSis
LoadM relative path semantics
defaultiohandlerâs GET
icons using 0x15 or 0x30 lang IDs
Honour the original bitmap transparency when rendering sprites
Correct the coordinate space of the sprites
donât allow the top level window to be moved/resized
gPOLY
correctly untrap all trappable calls
ensure all database fields are intialised at view construction time
gPoly error when passed an integer address
Workaround bizarre file path extension syntax
Color16 bitmap rendering
gGrey wasnât colour aware
PARSE$() when rel has an extension and f doesnât
Blue value in 4bpp bitmap palette
dCHOICE items using ââŠâ
Allow masks smaller than the bitmap
Rename the app to âOPLâ
RIGHT$(str, 0) incorrectly returned entire string instead of empty string.
Change oplpath.split to include trailing separator in dir
TBarInit should be restoring previous context
CallProcByStringExpr can require type suffix to be appended
Donât start animating sprite if SpritePos is called before SpriteDraw
Donât change current drawable in BmpLoad
typo in text mode IOREAD
More dump workarounds for weirdly-constructed proc entry points
Global array variables can have the same name as scalars
relax uid check on MBM files
Update window metrics when resizing
DIR$ should be using case-insensitive match
Use a light grey border
Use more accurate accent colors
Performance of bitmap fonts
bad gSCROLL parameters could stretch image by mistake
Improve directory grid layout in landscape
Correct the directory icon text spacing
inability to render certain windows-1252 characters
event timestamps should be microsecond precision
Done button should be the left bar button item in the drawables list
individual character font bitmaps werenât being inverted
removal of sprites
Donât use drawable 1 for screen dimensions in drawInfoPrint
ordering of FONT arguments
broken 8-bit colour palette
Correctly detect the system file system when opening .app directly This change automatically detects a system by walking the path rather than requiring it to be injected by the calling code.
Show icons for .aif and .app files
Slightly better colour for the Series 7 tint
Donât detect flat folders containing applications as bundles
Use the application caption as the program title
Correct the layout margins on the directory view
hour hand should take into account minutes fraction
Remove confusing ability to run procedures directly
Send pendown events for the very few apps that require them
Sprite bitmap refcounts
Stub out Cursor
Support more colour icons
dumpsis.lua describeSis()
More accurate error codes for invalid file paths
Add mask size to dumpaif.lua output
Dump aif masks and rename âexpand to âextract
Include modifiers in pen events
more epoc-like window shadows
Move debugging tools into the options menu and move the program menu to the left of the screen
Donât interpolate when scaling the screen
Show the menu button in portrait
Add the black and white unknown file icon
Show the drawable mode in the drawables inspector This also introduces a new Localization.swift file for adding localized descriptions.
Animate directory updates
Cleaner indication of when programs are running
Use the device accent colour in the program view
Correct the mapping for âiâ
Move the theme into the âAppearanceâ settings section This change also includes a drive-by fix to use common settings key handling in Settings.