1828 Commits

Author SHA1 Message Date
b5ccb0c9af js: Add actions for more keys in menus
I expect Escape to exit the menu, and SoftRight should do that as well
for KaiOS.  Backspace goes up one level through the menus, again because
that's conventional on KaiOS and not too confusing elsewhere.
2022-11-23 22:27:54 +00:00
e79270368b js: Move global keyboard handler to capturing phase
In the bubbling phase it managed to catch the "Enter" keypress that
opened a dialogue box from the menu and use it to close the dialogue
box again.  I think it's probably reasonable to have it run earlier and
just permanently steal any keypresses it wants.
2022-11-23 21:56:42 +00:00
2d439dd00e js: Move focus-tracking to entirely "focus" events
When we disable a button, it loses focus but doesn't generate a "blur"
event.  This means our "focus-within" class goes wrong.  Instead of
relying on "blur" events to remove the class, remove it from any
inappropriate elements in the "focus" handler.  This requires attaching
the handler to the root element of the document, but I've got plans that
need that anyway.
2022-11-23 21:56:42 +00:00
8445f07827 js: Replace :focus-within with JS-maintained .focus-within
Old browsers (like KaiOS 2.5) don't have :focus-within, but it's pretty
easy to replace the pseudo-class with a real .focus-within class
maintained by JavaScript event handlers.  This is made only marginally
fiddlier by the odd fact that "focus" and "blur" events don't bubble.
2022-11-23 21:56:42 +00:00
52cd58043a js: Add keyboard navigation for menus
Once the input focus is in the menu system (for instance by Shift+Tab
from the puzzle), you can move left and right through the menu bar and
up and down within each menu.  Enter selects a menu item.  The current
menu item is tracked by giving it the input focus.
2022-11-23 21:53:59 +00:00
b1b2da9896 Mid-move icon for Cube 2022-11-23 21:28:10 +00:00
96cda05b89 Add missing dependency of screenshots on their save files 2022-11-23 14:34:37 +00:00
fffeae956a nullgame: Don't bother blanking the puzzle window
This is now centralised in the mid-end.
2022-11-22 13:54:30 +00:00
8f46f437a7 gtk: Fix a missing "const" qualifier when building with GTK 2 2022-11-22 13:54:30 +00:00
25803916cb Fix mid-move icons
They've been broken since the move to CMake, which had an incorrect
variable substitution in the --redo argument.
2022-11-22 00:57:55 +00:00
434e6a43cf js: When removing the status bar, null out its variable
It seems polite to allow it to be garbage-collected.
2022-11-21 14:59:19 +00:00
f7557852b5 js: Tiny comment fix 2022-11-21 14:55:17 +00:00
77c8b50834 js: Allow status bar to be present in the HTML
I'm generally in favour of putting HTML in HTML rather the constructing
it in JavaScript, and this will allow for simplifying the code
eventually.  This only changes the JavaScript to make sure that's in
people's caches before I change the HTML itself.
2022-11-20 19:10:23 +00:00
f86623bbd9 Palisade: scale line thickness unboundedly with tile size.
The previous expression for WIDTH defined it, curiously, as (1 +
(TILESIZE >= 16) + (TILESIZE >= 32) + (TILESIZE >= 64)) which is
roughly logarithmic in tile size, but bounded above by a maximum of 4
pixels. On high-DPI displays this isn't really good enough any more.
Now I've set the line thickness to a constant fraction of the tile
size (but still bounded below by 1), so it's much easier to see the
lines when the puzzle is expanded to extra large size.
2022-11-18 22:22:52 +00:00
10bd3aeb2a pearl: Return NULL when Backspace or Escape does nothing
When there's no drag in progress, cancelling the drag has no effect.
Returning NULL lets the front-end know this, which in particular means
the Backspace key can leave the app in KaiOS.
2022-11-18 14:40:56 +00:00
51b496e118 mines: Grammar fix in instructions 2022-11-18 00:11:39 +00:00
7e19d6f4b1 Document new new undo/redo keys 2022-11-16 09:27:40 +00:00
5157a18550 Extra key mappings: '*' to undo and '#' to redo
This is what I keep expecting on my phone.  Implemented in the mid-end
since no backend currently uses those keys.
2022-11-15 23:48:32 +00:00
1b3a6bd204 js: Create the puzzle resize handle only if the puzzle is resizable
If there's no resizable div to attach it to, there's not much point in
creating the handle and the doing nothing with it.
2022-11-15 23:01:36 +00:00
298615408b js: Insert a space in game-type submenu headings as well 2022-11-15 23:01:36 +00:00
ff406d4edc js: Convert space after tick in menus to a space character
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.
2022-11-15 01:31:01 +00:00
a55c0c188b js: Use -moz-appearance and -webkit-appearance
The "appearance" property is newer than WebAssembly, but major browsers
have much older namespaced versions that we can support as well.
2022-11-15 01:06:35 +00:00
a90bb4a4ef js: Better handling of games without presets and/or solve
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.
2022-11-13 14:05:55 +00:00
5a225bf585 js: Substantially simplify timer code
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.
2022-11-13 00:15:00 +00:00
5a90dd9312 js: Give keyboard focus to the puzzle canvas at startup again
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.
2022-11-12 17:21:03 +00:00
8ef28a4fd6 js: Remove class="text/css" from <style> element
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.
2022-11-12 15:32:18 +00:00
208e2508d3 js: Add a way to have environment variables
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.
2022-11-12 15:03:40 +00:00
4e3bb8f257 js: Use <li role="separator"> in place of <li class="separator">
ARIA has a "separator" role that has the semantics we want, so let's use
it.
2022-11-12 12:18:59 +00:00
a9c783ed4e js: Label all form controls and put controls inside labels
This should help with accessibility and means we don't need to give IDs
to tick-boxes.
2022-11-12 12:07:35 +00:00
8f40128f08 js: Prettify menu HTML
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.
2022-11-12 11:28:39 +00:00
27d41e7cf0 js: Simplify menu CSS a little
Mostly removing redundant rules and simplifying selectors.
2022-11-12 11:22:43 +00:00
60d2bf5930 js: Convert menus to use semantically appropriate HTML elements
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.
2022-11-12 09:48:31 +00:00
22c4cad50e Correct a comment: draw_rect_outline() uses draw_polygon() 2022-11-10 23:39:08 +00:00
73f4edb09f Remove setting of indent-tabs-mode from filling.c
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.
2022-11-10 23:39:08 +00:00
2a02547755 Remove a couple of unused variables.
These broke the overnight build, due to -Werror.
2022-11-10 12:37:10 +00:00
00e4d79db1 js: Enable STRICT_JS in Emscripten
This turns on "use strict" in JavaScript, which enforces declaring
variables among other things, and may allow better optimisations.
2022-11-10 00:40:52 +00:00
2115799094 js: Add various missing variable declarations 2022-11-10 00:13:59 +00:00
f7957d3aa0 js: Reinstate a missing variable declaration
... 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().
2022-11-09 23:44:26 +00:00
7982002a64 js: Switch to window.requestAnimationFrame() for timing
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.
2022-11-09 21:40:27 +00:00
c5a2446fae js: Cancel UI events when the mid end says they've been handled
This means that if a key doesn't do anything in a puzzle, it can operate
the browser instead.
2022-11-08 10:27:19 +00:00
4a37f7cf78 Add a way for midend_process_key() to report whether it handled a keypress
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.
2022-11-08 10:27:19 +00:00
4fdcc54975 js: Make SoftRight act as CURSOR_SELECT2 as well
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.
2022-11-08 10:27:19 +00:00
ee5b02b0ca js: Map the "SoftLeft" key to CURSOR_SELECT2
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.
2022-11-08 10:27:19 +00:00
ad9ee5a524 js: Move much of the handling of device pixel ratios to the mid-end
Now that the mid-end knows how to do it, we can remove some complexity
from the front end.
2022-11-08 10:27:02 +00:00
e45cd43aaa Teach the mid-end about device pixel ratios
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.
2022-11-08 00:57:36 +00:00
fba22f04d6 js: Make update_pixel_ratio() more robust
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.
2022-11-08 00:57:32 +00:00
289342ec33 js: Adjust z-indices of sub-menus and resize handle
The sub-menus should appear in front of the resize handle (but still
behind any dialogue box).
2022-11-01 09:23:41 +00:00
06f6e878a0 js: Tolerate the non-existence of some HTML elements
Specifically, the permalinks, the apology, and the resizable div.
2022-10-29 11:58:37 +01:00
ea4ba47662 Loopy: adjust clip rectangle for new line thickness.
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.
2022-10-28 22:35:22 +01:00
ebb079eca0 Loopy: make line thicknesses scale with the canvas.
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.
2022-10-28 21:32:14 +01:00