* 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>
} else {
alert = [[alert init] autorelease];
[alert addButtonWithTitle:@"Oh dear"];
- [alert setInformativeText:[NSString stringWithCString:errorbuf]];
+ [alert setInformativeText:[NSString stringWithUTF8String:errorbuf]];
[alert runModal];
}
exit(1);
{
}
+/*
+ * 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
NSMenu *newmenu(const char *title)
{
return [[[NSMenu allocWithZone:[NSMenu menuZone]]
- initWithTitle:[NSString stringWithCString:title]]
+ initWithTitle:[NSString stringWithUTF8String:title]]
autorelease];
}
NSMenu *child;
item = [[[NSMenuItem allocWithZone:[NSMenu menuZone]]
- initWithTitle:[NSString stringWithCString:title]
+ initWithTitle:[NSString stringWithUTF8String:title]
action:NULL
keyEquivalent:@""]
autorelease];
key++;
}
- item = [[item initWithTitle:[NSString stringWithCString:title]
+ item = [[item initWithTitle:[NSString stringWithUTF8String:title]
action:NULL
- keyEquivalent:[NSString stringWithCString:key]]
+ keyEquivalent:[NSString stringWithUTF8String:key]]
autorelease];
if (*key)
[tf setBordered:NO];
[tf setDrawsBackground:NO];
[tf setFont:font1];
- [tf setStringValue:[NSString stringWithCString:ver]];
+ [tf setStringValue:[NSString stringWithUTF8String:ver]];
[tf sizeToFit];
views[nviews++] = tf;
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
NSClosableWindowMask)
backing:NSBackingStoreBuffered
defer:YES];
- [self setTitle:[NSString stringWithCString:ourgame->name]];
+ [self setTitle:[NSString stringWithUTF8String:ourgame->name]];
{
float *colours;
return self;
}
-- dealloc
+- (void)dealloc
{
int i;
for (i = 0; i < fe.ncolours; i++) {
}
sfree(fe.colours);
midend_free(me);
- return [super dealloc];
+ [super dealloc];
}
- (void)processButton:(int)b x:(int)x y:(int)y
alert = [[[NSAlert alloc] init] autorelease];
[alert addButtonWithTitle:@"Bah"];
- [alert setInformativeText:[NSString stringWithCString:message]];
+ [alert setInformativeText:[NSString stringWithUTF8String:message]];
[alert beginSheetModalForWindow:self modalDelegate:nil
- didEndSelector:nil contextInfo:nil];
+ didEndSelector:NULL contextInfo:nil];
}
- (void)newGame:(id)sender
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");
}
[self resizeForNewGameParams];
+ [self updateTypeMenuTick];
}
}
- (void)undoMove:(id)sender
NSPasteboard *pb = [NSPasteboard generalPasteboard];
NSArray *a = [NSArray arrayWithObject:NSStringPboardType];
[pb declareTypes:a owner:nil];
- [pb setString:[NSString stringWithCString:text]
+ [pb setString:[NSString stringWithUTF8String:text]
forType:NSStringPboardType];
} else
NSBeep();
- (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
{
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
midend_fetch_preset(me, n, &name, ¶ms);
item = [[[DataMenuItem alloc]
- initWithTitle:[NSString stringWithCString:name]
+ initWithTitle:[NSString stringWithUTF8String:name]
action:NULL keyEquivalent:@""]
autorelease];
[typemenu insertItem:item atIndex:0];
}
}
+
+ [self updateTypeMenuTick];
}
- (void)resignKeyWindow
midend_new_game(me);
[self resizeForNewGameParams];
+ [self updateTypeMenuTick];
}
- (void)startConfigureSheet:(int)which
[tf setSelectable:NO];
[tf setBordered:NO];
[tf setDrawsBackground:NO];
- [[tf cell] setTitle:[NSString stringWithCString:i->name]];
+ [[tf cell] setTitle:[NSString stringWithUTF8String:i->name]];
[tf sizeToFit];
rect = [tf frame];
if (thish < rect.size.height + 1) thish = rect.size.height + 1;
[tf setEditable:YES];
[tf setSelectable:YES];
[tf setBordered:YES];
- [[tf cell] setTitle:[NSString stringWithCString:i->sval]];
+ [[tf cell] setTitle:[NSString stringWithUTF8String:i->sval]];
[tf sizeToFit];
rect = [tf frame];
/*
b = [[NSButton alloc] initWithFrame:tmprect];
[b setBezelStyle:NSRoundedBezelStyle];
[b setButtonType:NSSwitchButton];
- [b setTitle:[NSString stringWithCString:i->name]];
+ [b setTitle:[NSString stringWithUTF8String:i->name]];
[b sizeToFit];
[b setState:(i->ival ? NSOnState : NSOffState)];
rect = [b frame];
[tf setSelectable:NO];
[tf setBordered:NO];
[tf setDrawsBackground:NO];
- [[tf cell] setTitle:[NSString stringWithCString:i->name]];
+ [[tf cell] setTitle:[NSString stringWithUTF8String:i->name]];
[tf sizeToFit];
rect = [tf frame];
if (thish < rect.size.height + 1) thish = rect.size.height + 1;
p = i->sval;
c = *p++;
while (*p) {
- char *q;
+ char cc, *q;
q = p;
while (*p && *p != c) p++;
- [pb addItemWithTitle:[NSString stringWithCString:q
- length:p-q]];
+ cc = *p;
+ *p = '\0';
+ [pb addItemWithTitle:[NSString stringWithUTF8String:q]];
+ *p = cc;
if (*p) p++;
}
[[sheet contentView] addSubview:cfg_controls[k]];
[NSApp beginSheet:sheet modalForWindow:self
- modalDelegate:nil didEndSelector:nil contextInfo:nil];
+ modalDelegate:nil didEndSelector:NULL contextInfo:nil];
}
- (void)specificGame:(id)sender
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:
if (error) {
NSAlert *alert = [[[NSAlert alloc] init] autorelease];
[alert addButtonWithTitle:@"Bah"];
- [alert setInformativeText:[NSString stringWithCString:error]];
+ [alert setInformativeText:[NSString stringWithUTF8String:error]];
[alert beginSheetModalForWindow:self modalDelegate:nil
- didEndSelector:nil contextInfo:nil];
+ didEndSelector:NULL contextInfo:nil];
} else {
midend_new_game(me);
[self resizeForNewGameParams];
+ [self updateTypeMenuTick];
}
}
sfree(cfg_controls);
- (void)setStatusLine:(char *)text
{
- char *rewritten = midend_rewrite_statusbar(me, text);
- [[status cell] setTitle:[NSString stringWithCString:rewritten]];
- sfree(rewritten);
+ [[status cell] setTitle:[NSString stringWithUTF8String:text]];
}
@end
int fontsize, int align, int colour, char *text)
{
frontend *fe = (frontend *)handle;
- NSString *string = [NSString stringWithCString:text];
+ NSString *string = [NSString stringWithUTF8String:text];
NSDictionary *attr;
NSFont *font;
NSSize size;
[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;
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)
[NSApp run];
[pool release];
+
+ return 0;
}