aboutsummaryrefslogtreecommitdiff
path: root/PuzzleApplet.java (follow)
Commit message (Collapse)AuthorAge
* Map Ctrl-Shift-Z to Redo.Simon Tatham2017-09-20
| | | | | | This is in addition to the existing keystrokes r, ^R and ^Y. I've become used to Ctrl-Shift-Z in other GUI games, and my fingers keep getting confused when my own puzzles don't handle it the same way.
* Generate special fake keypresses from menu options.Simon Tatham2017-09-20
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This fixes an amusing UI bug that I think can currently only come up in the unpublished puzzle 'Group', but there's no reason why other puzzles _couldn't_ do the thing that triggers the bug, if they wanted to. Group has unusual keyboard handling, in that sometimes (when a cell is selected for input and the key in question is valid for the current puzzle size) the game's interpret_move function will eat keystrokes like 'n' and 'u' that would otherwise trigger special UI events like New Game or Undo. The bug is that fake keypress events generated from the GUI menus looked enough like those keystrokes that interpret_move would eat those too. So if you start, say, a 16x16 Group puzzle, select an empty cell, and then choose 'new game' from the menu, Group will enter 'n' into the cell instead of starting a new game! I've fixed this by inventing a new set of special keystroke values called things like UI_NEWGAME and UI_UNDO, and having the GUI menus in all my front ends generate those in place of 'n' and 'u'. So now the midend can tell the difference between 'n' on the keyboard and New Game from the menu, and so Group can treat them differently too. In fact, out of sheer overcaution, midend.c will spot keystrokes in this range and not even _pass_ them to the game back end, so Group shouldn't be able to override these special events even by mistake. One fiddly consequence is that in gtk.c I've had to rethink the menu accelerator system. I was adding visible menu accelerators to a few menu items, so that (for example) 'U' and 'R' showed up to the right of Undo and Redo in the menu. Of course this had the side effect of making them real functioning accelerators from GTK's point of view, which activate the menu item in the same way as usual, causing it to send whatever keystroke the menu item generates. In other words, whenever I entered 'n' into a cell in a large Group game, this was the route followed by even a normal 'n' originated from a real keystroke - it activated the New Game menu item by mistake, which would then send 'n' by mistake instead of starting a new game! Those mistakes cancelled each other out, but now I've fixed the latter, I've had to fix the former too or else the GTK front end would now undo all of this good work, by _always_ translating 'n' on the keyboard to UI_NEWGAME, even if the puzzle would have wanted to treat a real press of 'n' differently. So I've fixed _that_ in turn by putting those menu accelerators in a GtkAccelGroup that is never actually enabled on the main window, so the accelerator keys will be displayed in the menu but not processed by GTK's keyboard handling. (Also, while I was redoing this code, I've removed the logic in add_menu_item_with_key that reverse-engineered an ASCII value into Control and Shift modifiers plus a base key, because the only arguments to that function were fixed at compile time anyway so it's easier to just write the results of that conversion directly into the call sites; and I've added the GTK_ACCEL_LOCKED flag, in recognition of the fact that _because_ these accelerators are processed by a weird mechanism, they cannot be dynamically reconfigured by users and actually work afterwards.)
* Rework the preset menu system to permit submenus.Simon Tatham2017-04-26
| | | | | | | | | | | | | | | | | | | | To do this, I've completely replaced the API between mid-end and front end, so any downstream front end maintainers will have to do some rewriting of their own (sorry). I've done the necessary work in all five of the front ends I keep in-tree here - Windows, GTK, OS X, Javascript/Emscripten, and Java/NestedVM - and I've done it in various different styles (as each front end found most convenient), so that should provide a variety of sample code to show downstreams how, if they should need it. I've left in the old puzzle back-end API function to return a flat list of presets, so for the moment, all the puzzle backends are unchanged apart from an extra null pointer appearing in their top-level game structure. In a future commit I'll actually use the new feature in a puzzle; perhaps in the further future it might make sense to migrate all the puzzles to the new API and stop providing back ends with two alternative ways of doing things, but this seemed like enough upheaval for one day.
* Remove a stray diagnostic.Simon Tatham2011-04-05
| | | | [originally from svn r9147]
* Fix an amusing cut-and-paste error in the Java drawing code which wasSimon Tatham2011-04-05
| | | | | | | causing complete mis-draws - but only when the window was exactly the right size! [originally from svn r9146]
* Also, it's ugly to blank out pieces of the applet window in black.Simon Tatham2010-11-06
| | | | | | | | | Use the puzzle background colour, like the GTK front end does. (I know that renders the effect of the previous commit invisible, but it's the principle of the thing! :-) [originally from svn r9023]
* In the Java front end, don't try to guess the puzzle rectangle'sSimon Tatham2010-11-06
| | | | | | | | | | | | | | width and height by assuming mirror symmetry within the containing applet area. Instead, use the proper width and height as given back by the C sizing function. (In particular, this fixes a bug where the non-blanked puzzle area appeared too tall by the height of the menu bar, probably as a result of confusing PuzzleApplet.getHeight() with PuzzlePanel.getHeight(). But the mirroring approach was conceptually wrong anyway.) [originally from svn r9022]
* Introduce, and implement as usefully as I can in all front ends, aSimon Tatham2009-12-27
| | | | | | | | | | new function in the drawing API which permits the display of text from outside basic ASCII. A fallback mechanism is provided so that puzzles can give a list of strings they'd like to display in order of preference and the system will return the best one it can manage; puzzles are required to cope with ASCII-only front ends. [originally from svn r8793]
* Fix the Java front end's vertical text positioning whenSimon Tatham2009-02-22
| | | | | | | | | | ALIGN_VNORMAL is in use: ALIGN_VNORMAL indicates that the supplied y-coordinate denotes the _baseline_ of the text, not its top, so adding on 'asc' to convert to the baseline is wrong. This only affects Tents, at present. [originally from svn r8452]
* Cut-and-paste error which was preventing any drop-down list in theSimon Tatham2008-09-19
| | | | | | custom game configuration code from working in the Java applets. [originally from svn r8192]
* Remove rogue diagnostic.Simon Tatham2008-07-05
| | | | [originally from svn r8106]
* Handle a <param name="game_id"> by passing it in to the C side asSimon Tatham2008-06-26
| | | | | | | | | argv[1], which in turn feeds it into the midend as a game ID. This can of course take any of the forms supported by the native C puzzles: a pure game parameter string, a params:description specific game ID, or a params#seed random game ID. [originally from svn r8095]
* The Java console keeps showing up error reports due to being askedSimon Tatham2008-06-26
| | | | | | | | | | to resize the puzzle to zero size. Ignore all such requests, in the assumption that a more sensible resize will be along soon enough (which does seem to happen, though I haven't debugged the NestedVM front end hard enough to figure out why the bogus resizes happen in the first place). [originally from svn r8094]
* Michael Schierl's patch to compile the puzzles as Java applets usingSimon Tatham2008-06-10
NestedVM. Wow! [originally from svn r8064]