+static void funcFailed(const char *func,int r);
+static inline void funcFailed(const char *func) { funcFailed(func,-1); }
+
+static inline void checkStatus(OSStatus r, char *func) { if(r != noErr) funcFailed(func,r); }
+static inline void checkStatus(GLboolean b, char *func) { if(!b) funcFailed(func,-1); }
+static inline void checkStatus(void *p, char *func) { if(!p) funcFailed(func,-1); }
+
+jstring cfStringToJString(CFStringRef s) {
+ CFIndex length = WC(CFStringGetLength)(s);
+ CFRange range = CFRangeMake(0,length);
+ jstring js = JvAllocString(length);
+ UniChar *buf = (UniChar*)JvGetStringChars(js);
+ WC(CFStringGetCharacters)(s,range,buf);
+ return js;
+}
+
+#pragma mark ------ SmartCFString ------
+class SmartCFString {
+ private:
+ CFStringRef p;
+ void release() { if(p) WC(CFRelease)(p); }
+ void checkNull() { if(!p) funcFailed("CFString function"); }
+ public:
+ // Constructors
+ SmartCFString() : p(0) { }
+ SmartCFString(const char *s) : p(0) { *this = s; }
+ SmartCFString(jstring js) : p(0) { *this = js; }
+ SmartCFString(CFStringRef cf) : p(0) { *this = cf; }
+ // Destructor
+ ~SmartCFString() { release(); }
+ // Assignment
+ SmartCFString& operator= (const char *s) {
+ release();
+ if(!s) s = "(null)";
+ p = WC(CFStringCreateWithCString)(WC(kCFAllocatorDefault),s,kCFStringEncodingISOLatin1);
+ checkNull();
+ return *this;
+ }
+ SmartCFString& operator= (jstring js) {
+ if(!js) return *this = "(null)";
+ release();
+ UniChar *buf = (UniChar*) JvGetStringChars(js);
+ CFIndex length = js->length();
+ p = WC(CFStringCreateWithCharacters)(WC(kCFAllocatorDefault),buf,length);
+ checkNull();
+ return *this;
+ }
+ SmartCFString& operator= (CFStringRef cf) {
+ if(cf == NULL) return *this = "(null)";
+ release();
+ p = cf;
+ return *this;
+ }
+ operator CFStringRef() { return p; }
+ operator jstring() { return getJString(); }
+
+ jstring getJString() { return cfStringToJString(p); }
+
+ bool equals(const char *s) {
+ SmartCFString cfs(s);
+ return equals(cfs);
+ }
+
+ bool equals(CFStringRef cfs) {
+ return WC(CFStringCompare)(p,cfs,0) == kCFCompareEqualTo;
+ }
+};
+
+// CHECKME: Is just making up your own four char codes really correct?
+const static UInt32 kEventClassCarbonMessage = 'xwta';
+const static UInt32 kEventCarbonMessage = 'xwtb';
+const static UInt32 kEventParamCarbonMessage = 'xwtc';
+
+static OSStatus carbonMessageEventHandler(EventHandlerCallRef handler, EventRef e, void *userData);
+static EventHandlerUPP carbonMessageEventHandlerUPP;
+
+static void fileDialogEventHandler(NavEventCallbackMessage callBackSelector, NavCBRecPtr callBackParms, void *userData);
+static NavEventUPP fileDialogEventHandlerUPP;
+
+static OSStatus windowEventHandler(EventHandlerCallRef handler, EventRef e, void *userData);
+static EventHandlerUPP windowEventHandlerUPP;
+
+static OSStatus paintProc(GDHandle device,GrafPtr qdContext,WindowRef window,RgnHandle inClientPaintRgn,RgnHandle outSystemPaintRgn,void *userData);
+static WindowPaintUPP paintProcUPP;