aboutsummaryrefslogtreecommitdiff
Commit message (Collapse)AuthorAge
...
* js: Insert a space in game-type submenu headings as wellBen Harris2022-11-15
|
* js: Convert space after tick in menus to a space characterBen Harris2022-11-15
| | | | | | | | | | | Older Firefox versions don't support "-moz-appearance: none" on radio buttons, which seems to mean that the specifies padding for them doesn't appear. Using a space character instead works fine, so do that everywhere. This seems to move the text slightly closer to the tick on browsers that do support "appearance: none", but the result is quite acceptable. This also makes the focus outline on the ticks slightly less weird.
* js: Use -moz-appearance and -webkit-appearanceBen Harris2022-11-15
| | | | | The "appearance" property is newer than WebAssembly, but major browsers have much older namespaced versions that we can support as well.
* js: Better handling of games without presets and/or solveBen Harris2022-11-13
| | | | | | | | | | | | | | | | | | Games with neither presets nor configuration (which may only be the Null Game) have been slightly broken since the introduction of hierarchical preset menus, in that the code to remove the "Type..." menu stopped being called then. My switch to using radio buttons in menus then broke them utterly because it's not possible to set the value of an empty radio group, causing a crash at startup. Fix this by detected when there's no preset menu, removing the item from the menu bar, and setting the variable that's meant to indicate this has been done. The solve button problem was more subtle, in that only the <button> was being hidden and not the <li> containing it, which led to the right border of the menu bar being two pixels thick. Switch to fully removing the <li> from the DOM, like we now do with the presets menu, since that also makes my keyboard handler (in another branch) simpler.
* js: Substantially simplify timer codeBen Harris2022-11-13
| | | | | | | | | | The C code in the Emscripten front-end already keeps a timer_active variable to ensure that the timer can be activated only when it's inactive, and deactivated only when it's active. Adjusting the JavaScript side to rely on this makes the code much simpler. The only oddity is that it now requests a new animation frame before calling the callback so that it's ready to be cancelled if the callback decides to deactivate the timer.
* js: Give keyboard focus to the puzzle canvas at startup againBen Harris2022-11-12
| | | | | | | I think this has been broken since a752e73, when the canvas changed to being hidden, and hence unable to receive keyboard focus, when the page loaded. I've now moved the focus() call to after the canvas gets displayed.
* js: Remove class="text/css" from <style> elementBen Harris2022-11-12
| | | | | | This is the wrong attribute, and the correct type="text/css" is deprecated by MDN. Since it's never worked, the deprecated attribute presumably isn't needed either.
* js: Add a way to have environment variablesBen Harris2022-11-12
| | | | | | | | | | | | They can now be specified by sticking some JSON in a <script> element in the Web page: <script id="environment" type="application/json"> { "LOOPY_DEFAULT": "20x10t11dh" } </script> This isn't brilliantly useful, but it does allow for changing settings without recompiling.
* js: Use <li role="separator"> in place of <li class="separator">Ben Harris2022-11-12
| | | | | ARIA has a "separator" role that has the semantics we want, so let's use it.
* js: Label all form controls and put controls inside labelsBen Harris2022-11-12
| | | | | This should help with accessibility and means we don't need to give IDs to tick-boxes.
* js: Prettify menu HTMLBen Harris2022-11-12
| | | | | | | | Now that we're using flex layout, whitespace in the menu isn't scary and we can use it to make the HTML readable. Also finally remove the "afterseparator" class that's long obsolete. You can always use ".separator + *" as a selector instead.
* js: Simplify menu CSS a littleBen Harris2022-11-12
| | | | Mostly removing redundant rules and simplifying selectors.
* js: Convert menus to use semantically appropriate HTML elementsBen Harris2022-11-12
| | | | | | | | | | | | | | | | | Presets are now radio buttons with labels, and menu items that take actions are now buttons. The <li> representing each menu item is now a thin wrapper around another element: a <label> for radio buttons, a <button> for other buttons, and a <div> for submenu headings. All of the things that previously applied to the <li> now apply to that inner element instead. This means that presets can now use the standard "checked" attribute to indicate which one is selected, and buttons can be disabled using the standard "disabled" attribute. It also means that we can query and set the state of all the presets at once through their RadioNodeList. I think this should also make the menus more accessible, and make it easier to make them keyboard-controllable.
* Correct a comment: draw_rect_outline() uses draw_polygon()Ben Harris2022-11-10
|
* Remove setting of indent-tabs-mode from filling.cBen Harris2022-11-10
| | | | | | Simon said that the continued presence of tabs for indentation in Puzzles is unintentional, so we should at least discourage the addition of new ones.
* Remove a couple of unused variables.Simon Tatham2022-11-10
| | | | These broke the overnight build, due to -Werror.
* js: Enable STRICT_JS in EmscriptenBen Harris2022-11-10
| | | | | This turns on "use strict" in JavaScript, which enforces declaring variables among other things, and may allow better optimisations.
* js: Add various missing variable declarationsBen Harris2022-11-10
|
* js: Reinstate a missing variable declarationBen Harris2022-11-09
| | | | | | ... and then decide there was no excuse for renaming the variable, so now it has the same name it had before I started using Window.requestAnimationFrame().
* js: Switch to window.requestAnimationFrame() for timingBen Harris2022-11-09
| | | | | | | | | | This is an API specifically designed for the purposes of timing animations. Unlike setInterval, it tries to synchronise with the screen refresh rate. It naturally passes us timing information, saving the need to construct a Date object every frame. It has the nice feature that browsers (at least Firefox 91) will call it less frequently when the puzzle page isn't visible, which saves CPU time in puzzles that run a timer continuously.
* js: Cancel UI events when the mid end says they've been handledBen Harris2022-11-08
| | | | | This means that if a key doesn't do anything in a puzzle, it can operate the browser instead.
* Add a way for midend_process_key() to report whether it handled a keypressBen Harris2022-11-08
| | | | | | | | This adds a new bool * argument, which can be NULL if front ends don't care whether the keypress was handled. Currently they all do that. Currently, "undo" and "redo" keys are treated as not handled if there's no move to undo or redo. This may be a little too strict.
* js: Make SoftRight act as CURSOR_SELECT2 as wellBen Harris2022-11-08
| | | | | | This way, the front end can intercept one of SoftLeft and SoftRight as a menu key and leave the other one for the puzzle. And while we don't have a working menu, I can use whichever is more convenient.
* js: Map the "SoftLeft" key to CURSOR_SELECT2Ben Harris2022-11-08
| | | | | | This is the left soft key on KaiOS phones. The centre soft key already sends "Enter", which eventually becomes CURSOR_SELECT. The right soft key I'm planning to use to open the menu.
* js: Move much of the handling of device pixel ratios to the mid-endBen Harris2022-11-08
| | | | | Now that the mid-end knows how to do it, we can remove some complexity from the front end.
* Teach the mid-end about device pixel ratiosBen Harris2022-11-08
| | | | | | | | | | | | | | The device pixel ratio indicates how many physical pixels there are in the platonic ideal of a pixel, at least approximately. In Web browsers, the device pixel ratio is used to represent "retina" displays with particularly high pixel densities, and also to reflect user-driven zooming of the page to different text sizes. The mid-end uses the device pixel ratio to adjust the tile size at startup, and can also respond to changes in device pixel ratio by adjusting the time size later. This is accomplished through a new argument to midend_size() which can simply be passed as 1.0 in any front end that doesn't care about this.
* js: Make update_pixel_ratio() more robustBen Harris2022-11-08
| | | | | | | | | | | With very small tile sizes, js_canvas_find_font_midpoint() can throw an exception. When it was called from update_pixel_ratio(), this prevented the new MediaQueryList from being created, which meant that the puzzle stopped noticing changes of device pixel ratio. Now update_pixel_ratio() establishes a new MediaQueryList before calling rescale_puzzle(), so the exception can't break it. Catching the exception properly would be even better, of course.
* js: Adjust z-indices of sub-menus and resize handleBen Harris2022-11-01
| | | | | The sub-menus should appear in front of the resize handle (but still behind any dialogue box).
* js: Tolerate the non-existence of some HTML elementsBen Harris2022-10-29
| | | | Specifically, the permalinks, the apology, and the resizable div.
* Loopy: adjust clip rectangle for new line thickness.Simon Tatham2022-10-28
| | | | | | | It would have helped in the previous commit if I'd tried actually _playing_ the game, not just admiring it in its initial state. When I did, I found that lines weren't being fully overdrawn, which turned out to be because the clip rectangle was being set too narrow.
* Loopy: make line thicknesses scale with the canvas.Simon Tatham2022-10-28
| | | | | | | | | | This is now important due to Ben's changes in the web frontend. On high-DPI displays, the canvas is the same overall size as before, but it's scaled up by increasing the game's tilesize rather than the browser scaling the image after the game redraws. Loopy ought to have been scaling its line thicknesses all along, but forgot. Easily fixed.
* js: Take device pixel ratio into account when setting default sizeBen Harris2022-10-27
| | | | | | | | | | | | | | This is a bit of a hack. When setting the puzzle to its default size, either at startup or from a right-click on the resize handle, we now scale the default size from midend_size() by the device pixel ratio, and then pass that back to midend_size(). This does more or less the right thing, in that the puzzle now starts up at a size that scales with the font size. There are still some slight inconsistencies, where sequences of DPR changes and puzzle parameter changes can have order-dependent effects on the size of the puzzle. Happily these effects are small and fairly hard to observe.
* js: Distinguish manual resizes from device pixel ratio changesBen Harris2022-10-27
| | | | | | | | | | This adds a new callback, rescale_puzzle(), that's called when the device pixel ratio changes. This means that resize_puzzle() can safely set the nominal canvas size, which means that manual resizing of the puzzle now sticks. Still missing: paying attention to the device pixel ratio when choosing the initial (or reset) size.
* js: Split setting nominal and actual canvas sizeBen Harris2022-10-27
| | | | | Now zooming in and out repeatedly doesn't cause the canvas to wither away, but user resizes don't stick any more. Still more to do.
* js: Very bad attempt at making puzzles change size when zoomingBen Harris2022-10-27
| | | | | | This has the entertaining consequence that repeatedly zooming in and out causes puzzles to gradually shrink, thus demonstrating that recording the nominal size correctly will be necessary.
* js: Add a CMake variable to control whether Emscripten emits WASMBen Harris2022-10-27
| | | | | I've finally got bored of keeping (and occasionally losing) a patch that turns it off unconditionally.
* js: Make update_pixel_ratio more backward-compatibleBen Harris2022-10-26
| | | | | | | | Despite my stylistic downgrades, it still used two features not present in Firefox 48, and hence KaiOS 2.5: passing options to addEventListener, and calling addEventListener on a MediaQueryList at all. Now it uses the older addListener method and explicitly removes each listener as soon as it's called.
* js: Use String.replace() in place of .replaceAll()Ben Harris2022-10-26
| | | | | The latter turns out to be a little too new for KaiOS 2.5, but .replace() will do global replacements if fed a RegExp.
* js: Be more subtle about cancelling keydown eventsBen Harris2022-10-25
| | | | | | | | | Now we only cancel a keydown event if the C keyboard handler recognises the key and passes it on to the midend. This doesn't necessarily mean that the midend has actually done anything with it, of course. Still, this is enough to allow F12 to open the developer tools even when the input focus is on the puzzle. It also allows for tabbing out of the puzzle into the links below it.
* js: Remove keypress handlerBen Harris2022-10-25
| | | | | | | | | | | At least in modern browsers (and I suspect in all browsers), cancelling a keydown event ensures that the subsequent keypress event doesn't fire. See <https://w3c.github.io/uievents/#keys-cancelable-keys>. So there's no point in having a handler on keypress events that just tries to cancel them as well. Removing the handler doesn't do much now, but it opens the possibility of being a bit more selective about which keydown events we cancel.
* js: Add a comment explaining the two halves of the key-matching codeBen Harris2022-10-25
|
* js: Handle KeyboardEvent.key == "Spacebar"Ben Harris2022-10-25
| | | | This is apparently generated in place of " " by Internet Explorer.
* js: Recognise KeyboardEvent.key == "Escape"Ben Harris2022-10-24
|
* js: Add mapping for UI_REDO based on KeyboardEvent.keyBen Harris2022-10-24
|
* js: Use KeyboardEvent.key for ASCII keystrokesBen Harris2022-10-24
| | | | | | | | | | This requires passing in KeyboardEvent.location from JavaScript so that we can detect the numeric keypad properly. Out of caution we currently only set MOD_NUM_KEYPAD on numbers, like we always have, but we have enough information to set it on arrow keys, Enter, "+", etc. This finally gets '/' and '\' working in Slant again.
* js: Remove the charCode argument from key()Ben Harris2022-10-24
| | | | It hasn't been used in a while.
* js: Add modern "key" values for Delete and arrow keysBen Harris2022-10-24
| | | | Firefox has emitted "Delete", "ArrowDown" etc since 2015.
* js: Use KeyboardEvent.keyCode and .char only as fallbacksBen Harris2022-10-24
| | | | | | | | | | | KeyboardEvent.keyCode is a platform-dependent mess. KeyboardEvent.char is better-defined, but in my browser it's always null. KeyboardEvent.key is the right thing to use when we want to know the semantics of a key. This commit just re-organises the big "else if" chain in key() so that all the tests on "key" come first. That way at least if key and keyCode disagree, we'll use the more trustworthy one.
* js: Remove braces from big else-if chain in keyboard handlerBen Harris2022-10-24
| | | | | If there's ever a case where they're unnecessary noise, it's a long chain of "else if"s guarding single assignment statements.
* js: Use less-modern syntax in update_pixel_ratioBen Harris2022-10-23
| | | | | | | | Stealing code from the MDN has the consequence that it uses shiny ES6 features like "const", "let", and "=>". This looks a bit odd among the more conservative style of the rest of Puzzles, so I've downgraded it to "var" and "function". I'll let the template string stay because that actually helps readability.