All notable changes to this project will be documented in this file. This is mostly for the enduser.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- Prevent homepage from being launched during modes where it shouldn't, like GotoMode and SearchMode
- Allow GotoMode to be launched while viewing bookmarks
- Homepage support
- "Ok" and "cancel" buttons for popups
- Bookmark title in bookmark mode
- Support for "waffle addresses" like waffle://bookmarks, waffle://help, and waffle://assocs
- Replace popup system with Brick's Dialog system
- OpenConfigMode (setting associations) menu now less buggy when scrolling around/tabbing through the fields
- You can no longer keep opening bookmark mode, which might not be noticeable, except it would keep consuming memory
- Saving of menus and text files in gopherspace!
- More default bookmarks
- Under-the-hood: further modularize the bookmark system just a little bit
- Rename theme attributes to give a much more readable and intuitive theme/INI interface
- Ability to theme/stylize Waffle through a
~/.config/waffle/theme.inifile!
- Issue with menu find and pressing enter to follow a link found when it's a link to a text file, the find search bar would stay open in the bottom/status bar
- Docs/help for using jump to menu item #
- Titlebar uses display string from links which led the user to the resource
- Refresh feature! Press F5 to reload a text file or a menu!
- Make it so menu item find is case-insensitive
- Any bookmark which would alphabetically come before
DEFAULTwould cause reading the bookmarks to crash Waffle. This has been fixed!
- Emojis for
GifFileandImageFileentries in menus
- Made it so add bookmark could only be activated if current mode is MenuMode or TextFileMode, avoiding weird bugs like trying to bookmark save file screen
Menu item finder!
- Help documentation for menu find
- Menu finder: find a menu item that contains input text
- Utilities for the status bar editor
- Use a new
doEventIfModesto replaceeventDependingMode, resolving some issues relating to the fact that some modes should only be initiated if the current mode matches a whitelist of modes. Tangibly, this means you will no longer get stuck, for instance, if you enter goto mode while saving a file, or in progress mode, etc.
- Refactor a little bit of
Handle.hs
Bookmarks!
- Bookmarks are stored in
bookmarks.ini, but can also be edited with the TUI usingctrl+b - A default set of bookmarks, which will be copied if ~/.config/waffle/bookmarks.ini doesn't exist
- Bookmark current page with
ctrl+p - Help instructions for the new bookmark feature
- Refactor utility code to be more reusable, specifically
making
Menus intoMenuBuffers
Reorganize and clean up the structure of the UI package (the brick app portion)... This is all under-the-hood stuff. Refactoring.
- Rename the UI modules to BrickApp since that more accurately describes their role
- Re-organize UI/BrickApp into these parts: handle (for handling events), mode action (for manipulating models/types), and types (for models). Basically the MVC structure. There's also a utils section.
- Network errors resulting in Waffle crashing. Now, instead, there are error popups for network errors
- You can now jump to a link in a menu by typing out the link #!
Fix gopher URIs (gophertype)
In RFC 4266 the path/resource in a Gopher URI has a
"gopheritem" prefix in the format /1/foo/bar (1
being the gopheritem). This gopheritem prefix allows
clients to decipher the content the URI points to,
a job usually fulfilled by a menu's item type
(RFC 1436).
- Waffle didn't go to the right resource if the resource in the URI supplied had a gopheritem prefix (RFC 4266). Now it will both use that gopheritem prefix to decipher the content and go to the correct resource which excludes said prefix
A bit under-the-hood:
- Implement a function which gets the "gopheritem" (a single character) from a selector/resource
Again, a bit under-the-hood:
- Use these new tools for
GotoModeand for the starting location provided when executing Waffle - Remove
itemTypeToRenderModeandguessModein favor for the new tools used with the newselectorToRenderModefunction which will give aRenderModefor the supplied URI.
Fixes, error handling, code cleanup/refactoring, and a performance enhancement. Some under-the-hood refactoring for cleanups.
- Popups for errors related to
GotoMode(bad URIs, cannot connect error)
- No longer doing static releases due to the standalone crashing a lot for some reason I'm too lazy ot figure out yet.
- Errors related to
GotoModewhich would crash Waffle, like malformed URIs, nonresponsive servers, etc. - Inability to goto URIs that include a port specification due to
readerror - Extreme performance issues when viewing large text files; now viewing very large
Bug fixes regarding re-entering modes, popup notification for saving config.
- Popup notifying of saved configuration changes for open config mode
- Prevent open config mode being relaunched while already in open config mode
- Prevent goto mode being relaunched while already in goto mode
- Prevent help mode from being relaunched while already in help mode
- A bit under-the-hood, but now
escis the universal popup closer key
Changes for static builds.
- Replace uses of
Paths_library to usefile-embed, so static builds can be packaged/archived with just the binary and no other files - Cabal project config for static building
Introduce the ability to open Gopher menu items with an external application by associating commands with specific item types.
- General configuration infrastructure for managing Waffle's current
open.iniconfiguration, as well as future configurations, all residing in~/.config/waffle/ - Default
open.iniindata/ - UI for editing which command opens an item type (ctrl+c to bring up UI,
ctrl+s to save changes), which manipulates the corresponding config stored
at
~/.config/waffle/open.ini - Instructions in the help screen for the new open feature
- Introduce
AnyNamewhich is a Brick name that encompasses all names as a "sum type" - A progress handler (
initOpenMode,progressOpen) for downloading and then opening the download with the associated command - Open certain menu items with a command using ctrl+o
- Representations for open config stuff, including helper functions
- Pretty much all instances of
MyNameto use the newAnyName(whichMyNameis now a constructor of)
This release is just a little bit of cleanup and fixes.
newMenuBufferandgetMenuto assist in handlingMenudirectly instead of passing aroundGopherBrowserState.- Pedantic-style warnings (
-Walland-Werror) to ghc build options in cabal config - Make it so moving a line down/up will wrap to the be beggining or end of the list
- Reduce redundancy by making
updateMenuLista top level function - Loosely couple
jumpNextLink,jumpPrevLink,listDrawElement, andselectedMenuLineso they both only needMenuinstead ofGopherBrowserState.
- Refactor
jumpNextLinkandjumpPrevLinkto be safe. Otherwise, moving to next or previous link would crash Waffle on menus (waffle: Prelude.head: empty list) where there were no links, such as gopher://sdf.org:70/users/raoeupb/. This also covers a situation where a line, for whatever reason, might not be selected, and thus would cause an error.
This release is preparing for uploading to Hackage. On the non-code side we switch from Stack to Cabal and start using GitHub actions.
- Tests, namely doctests
-
Fix going up a directory, which in some cases could result in new history with the same page.
-
Fix get parent directory which in some edge cases would return the same path as it was given. Also fix the leading/root slash being omitted in all cases. Simply start using System.FilePath to get the parent directory in a path.
This release is dedicated to Adrian Cochrane's Rhapsode, as these features were requested, which also happened to benefit this project as well.
Interpret Gopher URI item types based on their selector/path.
Bonus: make everything align nicely by simply putting item type descriptors in gophermaps/menus at the end of the line.
The high level:
- Item type guessing based on selector, allowing you to goto and startup URIs that require any RenderMode (namely: text files, menus, downloads).
The nitty-gritty:
GopherNet.hs: modularize things further by starting a networking module, whichwriteAllByteswas moved to.- ItemType type, which unifies both canonical and noncanonical item types
selectorExtToItemTypefor determining an item type based off of a selector's file extensionselectorPrefixItemTypefor determining an item type based off a selector's prefix according to RFC 4266.selectorItemTypefor determining a selector's item type by first preferring to use RFC 4266, but if that fails determine based off of file extension (using the two functions named above).counterMutatorfor the new higher order version of thewriteAllBytesfunction.
The high level:
- Goto breaking if not going to a menu/gophermap as URI destination
- Startup args breaking if not specifying a gophermap as URI destination
The nitty-gritty:
- All
Either GopherCanonicalItemType GopherNonCanonicalItemTypeinstances to simply use the newItemTypetype. writeAllBytesto be agnostic of UI stuff; made into a higher order function.
This is the first release. It is in alpha. All the basic features required to browse Gopherspace!