chiark / gitweb /
In the Java front end, don't try to guess the puzzle rectangle's
authorSimon Tatham <anakin@pobox.com>
Sat, 6 Nov 2010 18:14:41 +0000 (18:14 +0000)
committerSimon Tatham <anakin@pobox.com>
Sat, 6 Nov 2010 18:14:41 +0000 (18:14 +0000)
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]

PuzzleApplet.java
nestedvm.c

index b796aa439f79025ac726fc646daa2dd789bfddfb..305bae015170c629fdd7a8891cf98202c1deae26 100644 (file)
@@ -297,16 +297,22 @@ public class PuzzleApplet extends JApplet implements Runtime.CallJavaCB {
                    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;
index 9381b6c9fe6792d173fcd2c720567b419d311421..c8595265395fb7ae02cb1ff134735d5e2e541b80 100644 (file)
@@ -35,7 +35,7 @@ struct frontend {
     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_status_bar(void *handle, char *text)
 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 @@ int jcallback_resize(int width, int height)
     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;
 }