shithub: puzzles

Download patch

ref: 9cfc61c5f7f64ed382e946a2c69d6857eb494590
parent: 4d41f0f7178a55dfdce23e5bd5b9c3095ca1754e
author: Simon Tatham <anakin@pobox.com>
date: Sat Nov 6 14:14:41 EDT 2010

In the Java front end, don't try to guess the puzzle rectangle's
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]

--- a/PuzzleApplet.java
+++ b/PuzzleApplet.java
@@ -297,16 +297,22 @@
 		    String text = runtime.cstring(arg2);
 		    if (text.equals("")) text = " ";
 		    System.out.println("status '" + text + "'");
-		    statusBar.setText(text); break;
+		    statusBar.setText(text);
+		    break;
                 case 1:
                     gg = pp.backBuffer.createGraphics();
-                    if (arg2 != 0 || arg3 != 0) {
+                    if (arg2 != 0 || arg3 != 0 ||
+			arg2 + xarg2 != getWidth() ||
+			arg3 + xarg3 != getHeight()) {
+			int left = arg2, right = arg2 + xarg2;
+			int top = arg3, bottom = arg3 + xarg3;
+			int width = getWidth(), height = getHeight();
                         gg.setColor(Color.black);
-                        gg.fillRect(0, 0, arg2, getHeight());
-                        gg.fillRect(0, 0, getWidth(), arg3);
-                        gg.fillRect(getWidth() - arg2, 0, arg2, getHeight());
-                        gg.fillRect(0, getHeight() - arg3, getWidth(), arg3);
-                        gg.setClip(arg2, arg3, getWidth()-2*arg2, getHeight()-2*arg3);
+                        gg.fillRect(0, 0, left, height);
+                        gg.fillRect(right, 0, width-right, height);
+                        gg.fillRect(0, 0, width, top);
+                        gg.fillRect(0, bottom, width, height-bottom);
+                        gg.setClip(left, top, right-left, bottom-top);
                     }
                     break;
                 case 2: gg.dispose(); pp.repaint(); break;
--- a/nestedvm.c
+++ b/nestedvm.c
@@ -35,7 +35,7 @@
     struct timeval last_time;
     config_item *cfg;
     int cfg_which, cfgret;
-    int ox, oy;
+    int ox, oy, w, h;
 };
 
 static frontend *_fe;
@@ -61,6 +61,7 @@
 void nestedvm_start_draw(void *handle)
 {
     frontend *fe = (frontend *)handle;
+    _call_java(5, 0, fe->w, fe->h);
     _call_java(4, 1, fe->ox, fe->oy);
 }
 
@@ -218,6 +219,8 @@
     midend_size(fe->me, &x, &y, TRUE);
     fe->ox = (width - x) / 2;
     fe->oy = (height - y) / 2;
+    fe->w = x;
+    fe->h = y;
     midend_force_redraw(fe->me);
     return 0;
 }