Comment the Mac build out of Buildscr, since I no longer have a
[sgt/puzzles] / osx.m
diff --git a/osx.m b/osx.m
index bbe47f3..4c3b132 100644 (file)
--- a/osx.m
+++ b/osx.m
@@ -77,6 +77,8 @@
  *    recreate it.
  */
 
+#define COMBINED /* we put all the puzzles in one binary in this port */
+
 #include <ctype.h>
 #include <sys/time.h>
 #import <Cocoa/Cocoa.h>
@@ -167,6 +169,18 @@ void document_add_puzzle(document *doc, const game *game, game_params *par,
 {
 }
 
+/*
+ * setAppleMenu isn't listed in the NSApplication header, but an
+ * NSApp responds to it, so we're adding it here to silence
+ * warnings. (This was removed from the headers in 10.4, so we
+ * only need to include it for 10.4+.)
+ */
+#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1040
+@interface NSApplication(NSAppleMenu)
+- (void)setAppleMenu:(NSMenu *)menu;
+@end
+#endif
+
 /* ----------------------------------------------------------------------
  * Tiny extension to NSMenuItem which carries a payload of a `void
  * *', allowing several menu items to invoke the same message but
@@ -407,13 +421,14 @@ struct frontend {
     NSTextField *status;
 }
 - (id)initWithGame:(const game *)g;
-- dealloc;
+- (void)dealloc;
 - (void)processButton:(int)b x:(int)x y:(int)y;
 - (void)keyDown:(NSEvent *)ev;
 - (void)activateTimer;
 - (void)deactivateTimer;
 - (void)setStatusLine:(char *)text;
 - (void)resizeForNewGameParams;
+- (void)updateTypeMenuTick;
 @end
 
 @implementation MyImageView
@@ -590,7 +605,7 @@ struct frontend {
     return self;
 }
 
-- dealloc
+- (void)dealloc
 {
     int i;
     for (i = 0; i < fe.ncolours; i++) {
@@ -598,7 +613,7 @@ struct frontend {
     }
     sfree(fe.colours);
     midend_free(me);
-    return [super dealloc];
+    [super dealloc];
 }
 
 - (void)processButton:(int)b x:(int)x y:(int)y
@@ -713,7 +728,7 @@ struct frontend {
     NSSavePanel *sp = [NSSavePanel savePanel];
 
     if ([sp runModal] == NSFileHandlingPanelOKButton) {
-       const char *name = [[sp filename] cString];
+       const char *name = [[sp filename] UTF8String];
 
         FILE *fp = fopen(name, "w");
 
@@ -754,6 +769,7 @@ struct frontend {
         }
 
        [self resizeForNewGameParams];
+       [self updateTypeMenuTick];
     }
 }
 - (void)undoMove:(id)sender
@@ -792,7 +808,8 @@ struct frontend {
 - (BOOL)validateMenuItem:(NSMenuItem *)item
 {
     if ([item action] == @selector(copy:))
-       return (ourgame->can_format_as_text ? YES : NO);
+       return (ourgame->can_format_as_text_ever &&
+               midend_can_format_as_text_now(me) ? YES : NO);
     else if ([item action] == @selector(solveGame:))
        return (ourgame->can_solve ? YES : NO);
     else
@@ -803,6 +820,19 @@ struct frontend {
 {
     while ([typemenu numberOfItems] > 1)
        [typemenu removeItemAtIndex:0];
+    [[typemenu itemAtIndex:0] setState:NSOffState];
+}
+
+- (void)updateTypeMenuTick
+{
+    int i, total, n;
+
+    total = [typemenu numberOfItems];
+    n = midend_which_preset(me);
+    if (n < 0)
+       n = total - 1;                 /* that's always where "Custom" lives */
+    for (i = 0; i < total; i++)
+       [[typemenu itemAtIndex:i] setState:(i == n ? NSOnState : NSOffState)];
 }
 
 - (void)becomeKeyWindow
@@ -837,6 +867,8 @@ struct frontend {
            [typemenu insertItem:item atIndex:0];
        }
     }
+
+    [self updateTypeMenuTick];
 }
 
 - (void)resignKeyWindow
@@ -882,6 +914,7 @@ struct frontend {
     midend_new_game(me);
 
     [self resizeForNewGameParams];
+    [self updateTypeMenuTick];
 }
 
 - (void)startConfigureSheet:(int)which
@@ -1179,7 +1212,7 @@ struct frontend {
              case C_STRING:
                sfree(i->sval);
                i->sval = dupstr([[[(id)cfg_controls[k+1] cell]
-                                  title] cString]);
+                                  title] UTF8String]);
                k += 2;
                break;
              case C_BOOLEAN:
@@ -1203,6 +1236,7 @@ struct frontend {
        } else {
            midend_new_game(me);
            [self resizeForNewGameParams];
+           [self updateTypeMenuTick];
        }
     }
     sfree(cfg_controls);
@@ -1219,9 +1253,7 @@ struct frontend {
 
 - (void)setStatusLine:(char *)text
 {
-    char *rewritten = midend_rewrite_statusbar(me, text);
-    [[status cell] setTitle:[NSString stringWithCString:rewritten]];
-    sfree(rewritten);
+    [[status cell] setTitle:[NSString stringWithCString:text]];
 }
 
 @end
@@ -1312,7 +1344,8 @@ static void osx_draw_text(void *handle, int x, int y, int fonttype,
                          int fontsize, int align, int colour, char *text)
 {
     frontend *fe = (frontend *)handle;
-    NSString *string = [NSString stringWithCString:text];
+    NSString *string = [NSString stringWithCString:text
+                       encoding:NSUTF8StringEncoding];
     NSDictionary *attr;
     NSFont *font;
     NSSize size;
@@ -1346,6 +1379,15 @@ static void osx_draw_text(void *handle, int x, int y, int fonttype,
 
     [string drawAtPoint:point withAttributes:attr];
 }
+static char *osx_text_fallback(void *handle, const char *const *strings,
+                              int nstrings)
+{
+    /*
+     * We assume OS X can cope with any UTF-8 likely to be emitted
+     * by a puzzle.
+     */
+    return dupstr(strings[0]);
+}
 struct blitter {
     int w, h;
     int x, y;
@@ -1446,7 +1488,8 @@ const struct drawing_api osx_drawing = {
     osx_blitter_save,
     osx_blitter_load,
     NULL, NULL, NULL, NULL, NULL, NULL, /* {begin,end}_{doc,page,puzzle} */
-    NULL,                             /* line_width */
+    NULL, NULL,                               /* line_width, line_dotted */
+    osx_text_fallback,
 };
 
 void deactivate_timer(frontend *fe)
@@ -1588,4 +1631,6 @@ int main(int argc, char **argv)
 
     [NSApp run];
     [pool release];
+
+    return 0;
 }