1 // Copyright 2003 Adam Megacz, see the COPYING file for licensing [LGPL]
2 // Authors: Brian Alliet and Evan Jones
10 #define __private_extern__
11 #include <mach-o/dyld.h>
16 #include <java/lang/Object.h>
17 #include <java/lang/Error.h>
19 #include <org/xwt/plat/Darwin.h>
20 #include <org/xwt/plat/Darwin$CarbonSurface.h>
21 #include <org/xwt/plat/Darwin$GLCarbonSurface.h>
22 #include <org/xwt/plat/Darwin$GLCarbonPixelBuffer.h>
23 #include <org/xwt/plat/Darwin$CarbonMessage.h>
24 #include <org/xwt/plat/Darwin$CarbonOpenGL.h>
25 #include <org/xwt/plat/Darwin$FileDialogHelper.h>
26 #include <org/xwt/plat/GCJ$Retainer.h>
27 #include <org/xwt/HTTP$Proxy.h>
28 #include <org/xwt/util/Semaphore.h>
32 #include "DarwinCarbonHeaders.h"
34 #define XWT_CARBON_NO_BUNDLE_HACK
35 #ifdef XWT_CARBON_NO_BUNDLE_HACK
37 OSErr CPSEnableForegroundOperation(ProcessSerialNumber *psn);
38 OSErr CPSSetFrontProcess(ProcessSerialNumber *psn);
42 static const mach_header* CarbonHandle = NULL;
43 static const mach_header* AGLHandle = NULL;
44 static const mach_header* SCHandle = NULL;
45 #define CARBON_LIBRARY_PATH "/System/Library/Frameworks/Carbon.framework/Versions/A/Carbon"
46 #define AGL_LIBRARY_PATH "/System/Library/Frameworks/AGL.framework/Versions/A/AGL"
47 #define SC_LIBRARY_PATH "/System/Library/Frameworks/SystemConfiguration.framework/Versions/A/SystemConfiguration"
49 static void* dlsym(char* symbol) {
50 if (CarbonHandle == NULL) CarbonHandle = NSAddImage(CARBON_LIBRARY_PATH, NSADDIMAGE_OPTION_NONE);
51 if (AGLHandle == NULL) AGLHandle = NSAddImage(AGL_LIBRARY_PATH, NSADDIMAGE_OPTION_NONE);
52 if (SCHandle == NULL) SCHandle = NSAddImage(SC_LIBRARY_PATH, NSADDIMAGE_OPTION_NONE);
53 void* ret = NSAddressOfSymbol(NSLookupSymbolInImage(CarbonHandle, symbol,
54 NSLOOKUPSYMBOLINIMAGE_OPTION_BIND));
55 if (ret == NULL) ret = NSAddressOfSymbol(NSLookupSymbolInImage(AGLHandle, symbol,
56 NSLOOKUPSYMBOLINIMAGE_OPTION_BIND));
57 if (ret == NULL) ret = NSAddressOfSymbol(NSLookupSymbolInImage(SCHandle, symbol,
58 NSLOOKUPSYMBOLINIMAGE_OPTION_BIND));
59 printf("linking symbol %s to address %x\n", symbol, ret);
64 #define declare_weak(symbol) typeof(symbol) *symbol##_weak = NULL
66 (*((func##_weak != NULL) ? func##_weak : func##_weak = (typeof(func##_weak))dlsym("_" #func)))
68 declare_weak(GetRegionBounds);
69 declare_weak(RegisterToolboxObjectClass);
70 declare_weak(GetWindowProperty);
71 declare_weak(SetWindowProperty);
72 declare_weak(CreateCustomWindow);
73 declare_weak(InstallWindowContentPaintProc);
74 declare_weak(AEGetNthPtr);
75 declare_weak(CFArrayGetCount);
76 declare_weak(CFArrayGetTypeID);
77 declare_weak(CFArrayGetValueAtIndex);
78 declare_weak(CFDictionaryGetValue);
79 declare_weak(CFGetTypeID);
80 declare_weak(CFNumberGetTypeID);
81 declare_weak(CFNumberGetValue);
82 declare_weak(CFRelease);
83 declare_weak(CFStringCompare);
84 declare_weak(CFStringCreateWithCString);
85 declare_weak(CFStringCreateWithCharacters);
86 declare_weak(CFStringGetCharacters);
87 declare_weak(CFStringGetLength);
88 declare_weak(CFStringGetTypeID);
89 declare_weak(CFURLCopyScheme);
90 declare_weak(CFURLCreateWithString);
91 declare_weak(CGDisplayPixelsHigh);
92 declare_weak(CGDisplayPixelsWide);
93 declare_weak(CallNextEventHandler);
94 declare_weak(CollapseWindow);
95 declare_weak(ConstrainWindowToScreen);
96 declare_weak(CreateEvent);
97 declare_weak(CreateNewWindow);
98 declare_weak(DisposeEventHandlerUPP);
99 declare_weak(DisposeNavEventUPP);
100 declare_weak(DisposeWindow);
101 declare_weak(ExitToShell);
102 declare_weak(FSRefMakePath);
103 declare_weak(FrontWindow);
104 declare_weak(Gestalt);
105 declare_weak(GetApplicationEventTarget);
106 declare_weak(GetCurrentProcess);
107 declare_weak(GetCurrentScrap);
108 declare_weak(GetEventClass);
109 declare_weak(GetEventKind);
110 declare_weak(GetEventParameter);
111 declare_weak(GetMainEventQueue);
112 declare_weak(GetScrapFlavorData);
113 declare_weak(GetScrapFlavorSize);
114 declare_weak(GetWindowBounds);
115 declare_weak(GetWindowEventTarget);
116 declare_weak(GetWindowPort);
117 declare_weak(HideWindow);
118 declare_weak(InstallEventHandler);
119 declare_weak(IsWindowCollapsed);
120 declare_weak(LSOpenCFURLRef);
121 declare_weak(NavCreateGetFileDialog);
122 declare_weak(NavCreatePutFileDialog);
123 declare_weak(NavDialogDispose);
124 declare_weak(NavDialogGetReply);
125 declare_weak(NavDialogGetUserAction);
126 declare_weak(NavDialogRun);
127 declare_weak(NavDisposeReply);
128 declare_weak(NavGetDefaultDialogCreationOptions);
129 declare_weak(NewEventHandlerUPP);
130 declare_weak(NewNavEventUPP);
131 declare_weak(PostEventToQueue);
132 declare_weak(PutScrapFlavor);
133 declare_weak(QuitApplicationEventLoop);
134 declare_weak(ReleaseEvent);
135 declare_weak(RunApplicationEventLoop);
136 declare_weak(SCDynamicStoreCopyProxies);
137 declare_weak(SelectWindow);
138 declare_weak(SendBehind);
139 declare_weak(SetEventParameter);
140 declare_weak(SetThemeCursor);
141 declare_weak(SetWindowBounds);
142 declare_weak(SetWindowResizeLimits);
143 declare_weak(SetWindowTitleWithCFString);
144 declare_weak(ShowWindow);
145 declare_weak(ZoomWindowIdeal);
146 declare_weak(__CFStringMakeConstantString);
147 declare_weak(aglChoosePixelFormat);
148 declare_weak(aglCreateContext);
149 declare_weak(aglDestroyContext);
150 declare_weak(aglSetCurrentContext);
151 declare_weak(aglSetDrawable);
152 declare_weak(aglSurfaceTexture);
153 declare_weak(aglUpdateContext);
154 declare_weak(CPSEnableForegroundOperation);
155 declare_weak(CPSSetFrontProcess);
156 declare_weak(kCFAllocatorDefault);
158 #define GetWindowEventTarget WC(GetWindowEventTarget)
159 #define InstallEventHandler WC(InstallEventHandler)
160 #define __CFStringMakeConstantString WC(__CFStringMakeConstantString)
162 using namespace org::xwt::plat;
163 using gnu::gcj::RawData;
164 using org::xwt::util::Semaphore;
165 using java::lang::Object;
167 namespace org { namespace xwt { namespace plat {
170 using namespace darwin;
172 #pragma mark ------ Darwin Namespace ------
174 // We put everything that isn't in org.xwt.plat.Darwin in
175 // org.xwt.plat.darwin to prevent namespace conflicts
177 template <bool CHECK> static inline int CompileTimeCheck() { const int something_is_wrong=1; something_is_wrong++; return 0; }
178 template <> static inline int CompileTimeCheck<true>() { return 0; }
179 const static int unichar_check = CompileTimeCheck<sizeof(jchar)==sizeof(UniChar)>();
181 void funcFailed(char *func,int r);
182 static inline void checkStatus(OSStatus r, char *func) { if(r != noErr) funcFailed(func,r); }
183 static inline void checkStatus(GLboolean b, char *func) { if(!b) funcFailed(func,-1); }
184 static inline void checkStatus(void *p, char *func) { if(!p) funcFailed(func,-1); }
186 jstring cfStringToJString(CFStringRef s) {
187 CFIndex length = WC(CFStringGetLength)(s);
188 CFRange range = CFRangeMake(0,length);
189 jstring js = JvAllocString(length);
190 UniChar *buf = (UniChar*)JvGetStringChars(js);
191 WC(CFStringGetCharacters)(s,range,buf);
195 #pragma mark ------ SmartCFString ------
196 class SmartCFString {
199 void release() { if(p) WC(CFRelease)(p); }
200 void checkNull() { if(!p) throw new java::lang::Error(JvNewStringLatin1("CFString function failed")); }
203 SmartCFString() : p(0) { }
204 SmartCFString(const char *s) : p(0) { *this = s; }
205 SmartCFString(jstring js) : p(0) { *this = js; }
206 SmartCFString(CFStringRef cf) : p(0) { *this = cf; }
208 ~SmartCFString() { release(); }
210 SmartCFString& operator= (const char *s) {
213 p = WC(CFStringCreateWithCString)(WC(kCFAllocatorDefault),s,kCFStringEncodingISOLatin1);
217 SmartCFString& operator= (jstring js) {
218 if(!js) return *this = "(null)";
220 UniChar *buf = (UniChar*) JvGetStringChars(js);
221 CFIndex length = js->length();
222 p = WC(CFStringCreateWithCharacters)(WC(kCFAllocatorDefault),buf,length);
226 SmartCFString& operator= (CFStringRef cf) {
227 if(cf == NULL) return *this = "(null)";
232 operator CFStringRef() { return p; }
233 operator jstring() { return getJString(); }
235 jstring getJString() { return cfStringToJString(p); }
237 bool equals(const char *s) {
238 SmartCFString cfs(s);
242 bool equals(CFStringRef cfs) {
243 return WC(CFStringCompare)(p,cfs,0) == kCFCompareEqualTo;
247 // CHECKME: Is just making up your own four char codes really correct?
248 const static UInt32 kEventClassCarbonMessage = 'xwta';
249 const static UInt32 kEventCarbonMessage = 'xwtb';
250 const static UInt32 kEventParamCarbonMessage = 'xwtc';
252 OSStatus our_carbonMessageEventHandler(EventHandlerCallRef handler, EventRef e, void *userData);
253 void fileDialogEventHandler(NavEventCallbackMessage callBackSelector, NavCBRecPtr callBackParms, void *userData);
257 jboolean Darwin::isJaguar() {
259 OSStatus r = WC(Gestalt)(gestaltSystemVersion, &version);
260 checkStatus(r,"WC(Gestalt)");
261 return version >= 0x1020;
264 void Darwin$CarbonMessage::natInit() {
267 EventHandlerUPP upp = WC(NewEventHandlerUPP)(our_carbonMessageEventHandler);
268 EventTypeSpec eventTypes = { kEventClassCarbonMessage, kEventCarbonMessage };
269 r = InstallEventHandler(WC(GetApplicationEventTarget)(),upp,1,&eventTypes,NULL,NULL);
270 checkStatus(r,"WC(InstallEventHandler)");
273 void Darwin$CarbonMessage::add(Darwin$CarbonMessage *msg) {
277 GCJ$Retainer::retain(msg);
279 r = WC(CreateEvent)(WC(kCFAllocatorDefault),kEventClassCarbonMessage,kEventCarbonMessage,0,kEventAttributeNone,&event);
280 checkStatus(r,"WC(CreateEvent)");
281 r = WC(SetEventParameter)(event,kEventParamCarbonMessage,typeVoidPtr,sizeof(msg),(void*)&msg);
282 checkStatus(r,"WC(SetEventParameter)");
283 r = WC(PostEventToQueue)(WC(GetMainEventQueue)(),event,kEventPriorityHigh);
284 checkStatus(r,"WC(PostEventToQueue)");
285 WC(ReleaseEvent)(event);
289 OSStatus our_carbonMessageEventHandler(EventHandlerCallRef handler, EventRef e, void *userData) {
290 UInt32 eKind = WC(GetEventKind)(e);
291 UInt32 eClass = WC(GetEventClass)(e);
293 Darwin$CarbonMessage *msg;
294 if(eClass != kEventClassCarbonMessage || eKind != kEventCarbonMessage)
295 return eventNotHandledErr;
296 r = WC(GetEventParameter)(e,kEventParamCarbonMessage,typeVoidPtr,NULL,sizeof(msg),NULL,&msg);
297 checkStatus(r,"WC(GetEventParameter)");
299 GCJ$Retainer::release(msg);
304 #pragma mark ------ Utility Functions ------
306 void funcFailed(char *func,int r){
307 fprintf(stderr,"%s() failed (%d)\n",func,r);
311 #pragma mark ------ CarbonPicture Methods ------
313 #pragma mark ----- Carbon Surface Methods ----
316 void Darwin$CarbonSurface::natSyncCursor(jint n) {
318 // see Carbon.java for what these numbers mean
320 case 1: c = kThemeWatchCursor;
321 case 2: c = kThemePlusCursor;
322 case 3: c = kThemeIBeamCursor;
323 case 4: c = kThemePointingHandCursor;
324 case 5: c = kThemeOpenHandCursor;
325 case 6: c = kThemeResizeLeftRightCursor;
326 default: c = kThemeArrowCursor;
328 WC(SetThemeCursor)(c);
331 void Darwin$CarbonSurface::natSetInvisible(jboolean b) {
332 WindowRef window = (WindowRef) rawWindowRef;
333 fprintf(stderr,"Making window %s\n",b?"invisible":"visible");
334 if(b) WC(HideWindow)(window);
335 else WC(ShowWindow)(window);
338 void Darwin$CarbonSurface::nat_setMaximized(jboolean b) {
339 WindowRef window = (WindowRef) rawWindowRef;
340 Point ideal = { 10000, 10000 };
341 OSStatus r = WC(ZoomWindowIdeal)(window,(b?inZoomOut:inZoomIn),&ideal);
342 checkStatus(r,"WC(ZoomWindowIdeal)");
345 void Darwin$CarbonSurface::nat_setMinimized(jboolean b) {
346 WindowRef window = (WindowRef) rawWindowRef;
347 if((WC(IsWindowCollapsed)(window) ? 1 : 0) == (b ? 1 : 0)) return;
348 OSStatus r = WC(CollapseWindow)(window,b);
349 checkStatus(r,"WC(CollapseWindow)");
352 void Darwin$CarbonSurface::natSetTitleBarText(jstring js) {
353 SmartCFString s = js;
354 WindowRef window = (WindowRef) rawWindowRef;
355 WC(SetWindowTitleWithCFString)(window,s);
358 void Darwin$CarbonSurface::natToBack() {
359 WindowRef window = (WindowRef) rawWindowRef;
360 WC(SendBehind)(window,NULL);
363 void Darwin$CarbonSurface::natToFront() {
364 WindowRef window = (WindowRef) rawWindowRef;
365 fprintf(stderr,"WC(SelectWindow)()\n");
366 WC(SelectWindow)(window);
369 #pragma mark ---- Window Event Handler ----
371 static const EventTypeSpec eventTypeSpecs[] = {
372 // kEventClassCommand
373 // { kEventClassCommand, ??? },
376 { kEventClassWindow, kEventWindowUpdate },
377 { kEventClassWindow, kEventWindowBoundsChanged },
378 { kEventClassWindow, kEventWindowActivated },
379 { kEventClassWindow, kEventWindowDeactivated },
380 { kEventClassWindow, kEventWindowZoomed },
381 { kEventClassWindow, kEventWindowCollapsed },
382 { kEventClassWindow, kEventWindowExpanded },
383 { kEventClassWindow, kEventWindowClose },
384 { kEventClassWindow, kEventWindowClosed },
385 { kEventClassWindow, kEventWindowDrawFrame },
386 { kEventClassWindow, kEventWindowDrawPart },
388 // kEventClassControl
389 { kEventClassControl, kEventControlApplyBackground },
391 // kEventClassKeyboard
392 { kEventClassKeyboard, kEventRawKeyDown },
393 { kEventClassKeyboard, kEventRawKeyRepeat },
394 { kEventClassKeyboard, kEventRawKeyUp },
395 { kEventClassKeyboard, kEventRawKeyModifiersChanged },
398 { kEventClassMouse, kEventMouseDown },
399 { kEventClassMouse, kEventMouseUp },
400 { kEventClassMouse, kEventMouseMoved },
401 { kEventClassMouse, kEventMouseDragged },
402 { kEventClassMouse, kEventMouseWheelMoved },
405 OSStatus our_windowEventHandler(EventHandlerCallRef handler, EventRef e, void *userData) {
406 Darwin$CarbonSurface *surface = (Darwin$CarbonSurface*)userData;
407 if (surface == NULL) {
408 WindowRef window = 0;
409 WC(GetEventParameter) (e,
410 kEventParamDirectObject,
417 WC(GetWindowProperty) (window, 'XWT!', 'XWT!', sizeof(surface), &unused, &surface);
419 UInt32 eKind = WC(GetEventKind)(e);
420 UInt32 eClass = WC(GetEventClass)(e);
422 char* ec = (char*)&eClass;
423 if (surface == NULL) return eventNotHandledErr;
427 case kEventClassCommand:
429 // TODO: handle menu items
432 case kEventClassKeyboard:
434 case kEventRawKeyDown:
435 case kEventRawKeyRepeat:
436 case kEventRawKeyUp: {
440 r = WC(GetEventParameter)(e,kEventParamKeyCode,typeUInt32,NULL,sizeof(keyCode),NULL,&keyCode);
441 checkStatus(r,"WC(GetEventParameter)");
444 // These values were obtained by experimentation. I can't find any constants for them
445 // in the header files
446 case 126: js = JvNewStringLatin1("up"); break;
447 case 125: js = JvNewStringLatin1("down"); break;
448 case 124: js = JvNewStringLatin1("right"); break;
449 case 123: js = JvNewStringLatin1("left"); break;
450 case 122: js = JvNewStringLatin1("f1"); break;
451 case 120: js = JvNewStringLatin1("f2"); break;
452 case 99: js = JvNewStringLatin1("f3"); break;
453 case 118: js = JvNewStringLatin1("f4"); break;
454 case 96: js = JvNewStringLatin1("f5"); break;
455 case 97: js = JvNewStringLatin1("f6"); break;
456 case 98: js = JvNewStringLatin1("f7"); break;
457 case 100: js = JvNewStringLatin1("f8"); break;
458 case 101: js = JvNewStringLatin1("f9"); break;
459 case 109: js = JvNewStringLatin1("f10"); break;
460 case 103: js = JvNewStringLatin1("f11"); break;
461 case 111: js = JvNewStringLatin1("f12"); break;
462 case 105: js = JvNewStringLatin1("f13"); break;
463 case 114: js = JvNewStringLatin1("insert"); break;
464 case 117: js = JvNewStringLatin1("delete"); break;
465 case 116: js = JvNewStringLatin1("page_up"); break;
466 case 121: js = JvNewStringLatin1("page_down"); break;
467 case 115: js = JvNewStringLatin1("home"); break;
468 case 119: js = JvNewStringLatin1("end"); break;
469 case 71: js = JvNewStringLatin1("num_lock"); break;
470 case 53: js = JvNewStringLatin1("escape"); break;
471 case 51: js = JvNewStringLatin1("back_space"); break;
472 case 36: js = JvNewStringLatin1("enter"); break;
473 case 48: js = JvNewStringLatin1("tab"); break;
474 case 76: js = JvNewStringLatin1("enter"); break; // number pad enter
477 UInt32 modifiers = surface->modifiers;
478 r = WC(GetEventParameter)(e,kEventParamKeyUnicodes,typeUnicodeText,NULL,0,&size,NULL);
479 checkStatus(r,"WC(GetEventParameter)");
480 if(size == 0 || (modifiers & controlKey && size>sizeof(UniChar))) return eventNotHandledErr;
482 js = JvAllocString(size/sizeof(UniChar));
483 UniChar *buf = (UniChar*)JvGetStringChars(js);
484 r = WC(GetEventParameter)(e,kEventParamKeyUnicodes,typeUnicodeText,NULL,size,NULL,buf);
485 checkStatus(r,"WC(GetEventParameter)");
487 if(!buf[0]) return eventNotHandledErr; // shouldn't happen
488 // odd, when the ctrl key is pressed a-"`" become 1-31, this brings them back to the corect values
489 if(modifiers & controlKey && buf[0] < 32) buf[0] += 0x60;
494 if(eKind == kEventRawKeyUp)
495 surface->KeyReleased(js);
497 surface->KeyPressed(js);
500 case kEventRawKeyModifiersChanged: {
501 const static struct {
504 } modifiersTable[] = {
505 { shiftKey, JvNewStringLatin1("shift") },
506 { alphaLock, JvNewStringLatin1("caps_lock") },
507 { controlKey, JvNewStringLatin1("control") },
508 { optionKey, JvNewStringLatin1("alt") },
509 { kEventKeyModifierNumLockMask, JvNewStringLatin1("num_lock") },
513 UInt32 oldModifiers = (UInt32) surface->modifiers;
515 r = WC(GetEventParameter)(e,kEventParamKeyModifiers,typeUInt32,NULL,sizeof(newModifiers),NULL,&newModifiers);
516 checkStatus(r,"WC(GetEventParameter)");
517 surface->modifiers = (jint) newModifiers;
518 UInt32 changedModifiers = oldModifiers ^ newModifiers;
520 for(int i=0;modifiersTable[i].mask;i++) {
521 UInt32 mask = modifiersTable[i].mask;
522 if(!(changedModifiers & mask)) continue;
523 if(newModifiers & mask)
524 surface->KeyPressed(modifiersTable[i].xwtKey);
526 surface->KeyReleased(modifiersTable[i].xwtKey);
532 case kEventClassMouse:
533 // The default handler gets first dibs on mouse events
534 // (this catches the titlebar, resize box, etc)
535 r = WC(CallNextEventHandler)(handler, e);
536 if(r != eventNotHandledErr && eKind != kEventMouseMoved && eKind != kEventMouseDragged) return r;
539 case kEventMouseMoved:
540 case kEventMouseDragged: {
541 WindowRef window = (WindowRef) surface->rawWindowRef;
545 r = WC(GetEventParameter)(e,kEventParamMouseLocation,typeQDPoint,NULL,sizeof(p),NULL,&p);
546 checkStatus(r,"WC(GetEventParameter)");
547 r = WC(GetWindowBounds)(window,kWindowContentRgn,&rect);
548 checkStatus(r,"WC(GetWindowBounds)");
549 surface->Move(p.h-rect.left,p.v-rect.top);
552 case kEventMouseDown:
553 case kEventMouseUp: {
554 EventMouseButton button;
557 r = WC(GetEventParameter)(e,kEventParamMouseButton,typeMouseButton,NULL,sizeof(button),NULL,&button);
558 checkStatus(r,"WC(GetEventParameter)");
559 r = WC(GetEventParameter)(e,kEventParamClickCount,typeUInt32,NULL,sizeof(clickCount),NULL,&clickCount);
560 checkStatus(r,"WC(GetEventParameter)");
563 case kEventMouseButtonPrimary: xwtButton = 1; break;
564 case kEventMouseButtonSecondary: xwtButton = 2; break;
565 case kEventMouseButtonTertiary: xwtButton = 3; break;
566 default: return noErr;
568 if(eKind == kEventMouseDown) {
569 surface->Press(xwtButton);
571 surface->Release(xwtButton);
572 while(clickCount > 1) {
573 surface->DoubleClick(xwtButton);
576 if(clickCount) surface->Click(xwtButton);
580 case kEventMouseWheelMoved: {
581 EventMouseWheelAxis axis;
583 r = WC(GetEventParameter)(e,kEventParamMouseWheelAxis,typeMouseWheelAxis,NULL,sizeof(axis),NULL,&axis);
584 checkStatus(r,"WC(GetEventParameter)");
585 if(axis != kEventMouseWheelAxisY) break;
586 r = WC(GetEventParameter)(e,kEventParamMouseWheelDelta,typeSInt32,NULL,sizeof(delta),NULL,&delta);
587 checkStatus(r,"WC(GetEventParameter)");
588 fprintf(stderr,"kEventMouseWheelMoved: delta: %d",delta);
589 // surface->MouseWheelMoved(...) IMPROVMENT: mouse wheel support in xwt
595 case kEventClassWindow: {
597 r = WC(GetEventParameter)(e,kEventParamDirectObject,typeWindowRef,NULL,sizeof(window),NULL,&window);
598 checkStatus(r,"kEventClassWindow/WC(GetEventParameter)");
600 if((RawData*)window != surface->rawWindowRef) Darwin::abort(JvNewStringLatin1("window != surface->window"));
604 case kEventWindowDrawFrame: {
607 case kEventWindowBoundsChanged: {
610 r = WC(GetEventParameter)(e,kEventParamAttributes,typeUInt32,NULL,sizeof(attr),NULL,&attr);
611 checkStatus(r,"kEventWindowBoundsChanged/WC(GetEventParameter)");
612 r = WC(GetWindowBounds)(window,kWindowContentRgn,&rect);
613 checkStatus(r,"WC(GetWindowBounds)");
614 if(attr & kWindowBoundsChangeSizeChanged) {
615 jint w = rect.right-rect.left;
616 jint h = rect.bottom-rect.top;
617 if(attr & kWindowBoundsChangeUserResize && surface->maximized)
618 surface->Maximized(false);
619 surface->reshape(w,h);
620 surface->SizeChange(w,h);
622 if(attr & kWindowBoundsChangeOriginChanged) {
623 surface->PosChange(rect.left,rect.top);
627 case kEventWindowActivated:
628 case kEventWindowDeactivated: {
629 surface->Focused(eKind == kEventWindowActivated);
632 case kEventWindowZoomed: {
633 fprintf(stderr,"Zoomed....\n");
634 surface->Maximized(true);
637 case kEventWindowCollapsed: {
638 surface->Minimized(true);
641 case kEventWindowExpanded: {
642 surface->Minimized(false);
645 case kEventWindowClose: {
649 case kEventWindowClosed: {
650 WC(DisposeEventHandlerUPP)((EventHandlerUPP)surface->rawEventHandlerUPP);
651 GCJ$Retainer::release(surface);
658 return eventNotHandledErr;
662 OSStatus paint(GDHandle device,
665 RgnHandle inClientPaintRgn,
666 RgnHandle outSystemPaintRgn,
669 WC(GetRegionBounds)(inClientPaintRgn, &r);
670 ((Darwin$CarbonSurface*)refCon)->Dirty(r.left, r.top, r.right - r.left, r.bottom - r.top);
671 //((Darwin$CarbonSurface*)refCon)->blitDirtyScreenRegions();
672 ((Darwin$CarbonSurface*)refCon)->render_();
673 //printf("hit %d %d %d %d\n", r.left, r.top, r.right, r.bottom);
676 long MyCustomWindowEventHandler (short code, WindowRef window, short message, long param) {
679 case kEventWindowDrawFrame:
682 GetPortBounds (thePort, &windBounds);
685 FrameRect (windBounds);
690 return eventNotHandledErr;
694 void Darwin$CarbonSurface::natInit(jboolean framed) {
697 WindowClass wc = framed ? kDocumentWindowClass : kPlainWindowClass;
698 // FIXME: unframed windows should appear in the window menu
699 // This probably needs a hack similar to whats in Cocoa.mm
700 WindowAttributes attr = kWindowStandardHandlerAttribute|
701 (framed ? kWindowInWindowMenuAttribute|kWindowStandardDocumentAttributes|kWindowLiveResizeAttribute : 0);
703 rect.top = 0; rect.left = 0; rect.bottom = 300; rect.right=300;
704 EventHandlerUPP upp = WC(NewEventHandlerUPP)(our_windowEventHandler);
706 ToolboxObjectClassRef customWindow;
707 WC(RegisterToolboxObjectClass) ( CFSTR("org.xwt.plat.Darwin.CarbonWindow"),
708 NULL, sizeof(eventTypeSpecs)/sizeof(EventTypeSpec),
710 upp, NULL, &customWindow);
711 WindowDefSpec myCustomWindowSpec;
712 myCustomWindowSpec.defType = kWindowDefObjectClass;
713 myCustomWindowSpec.u.classRef = customWindow;
715 r = WC(CreateCustomWindow) (&myCustomWindowSpec,
716 kDocumentWindowClass,
717 kWindowStandardHandlerAttribute | kWindowStandardDocumentAttributes,
721 //r = CreateNewWindow(kDocumentWindowClass, attr, &rect, &window);
722 Darwin$CarbonSurface* me = this;
723 WC(SetWindowProperty) (window, 'XWT!', 'XWT!', sizeof(me), &me);
724 checkStatus(r,"WC(CreateNewWindow)");
726 GCJ$Retainer::retain(this); // Need to account for the EventHandlers pointer to us
727 r = InstallWindowEventHandler(window,upp,sizeof(eventTypeSpecs)/sizeof(EventTypeSpec),eventTypeSpecs,this,NULL);
728 checkStatus(r,"InstallWindowEventHandler");
730 WC(InstallWindowContentPaintProc) (window, &paint, 0, this);
732 rawWindowRef = (RawData*) window;
733 rawEventHandlerUPP = (RawData*) upp;
736 void Darwin$CarbonSurface::natDispose() {
737 WindowRef window = (WindowRef) rawWindowRef;
738 WC(DisposeWindow)(window);
741 void Darwin$CarbonSurface::natSetIcon(org::xwt::Picture *_p) {
744 void Darwin$CarbonSurface::natSetLocation() {
745 WindowRef window = (WindowRef) rawWindowRef;
749 OSStatus r = WC(GetWindowBounds)(window,kWindowStructureRgn,&rect);
750 checkStatus(r,"WC(GetWindowBounds)");
751 rect.bottom = y + (rect.bottom - rect.top);
752 rect.right = x + (rect.right - rect.left);
755 r = WC(SetWindowBounds)(window,kWindowStructureRgn,&rect);
756 checkStatus(r,"WC(SetWindowBounds)");
757 r = WC(ConstrainWindowToScreen)(window,kWindowStructureRgn,kWindowConstrainMoveRegardlessOfFit,NULL,NULL);
758 checkStatus(r,"WC(ConstrainWindowToScreen)");
761 void Darwin$CarbonSurface::natSetSize(jint w, jint h) {
762 WindowRef window = (WindowRef) rawWindowRef;
764 OSStatus r = WC(GetWindowBounds)(window,kWindowStructureRgn,&rect);
765 checkStatus(r,"WC(GetWindowBounds)");
766 rect.bottom = rect.top + h;
767 rect.right = rect.left + w;
768 r = WC(SetWindowBounds)(window,kWindowStructureRgn,&rect);
769 checkStatus(r,"WC(SetWindowBounds)");
770 r = WC(ConstrainWindowToScreen)(window,kWindowStructureRgn,kWindowConstrainMoveRegardlessOfFit,NULL,NULL);
771 checkStatus(r,"WC(ConstrainWindowToScreen)");
774 void Darwin$CarbonSurface::natSetLimits(jint minw, jint minh, jint maxw, jint maxh) {
775 WindowRef window = (WindowRef) rawWindowRef;
776 const int maxMax = 32767;
777 const int minMinW = 80;
778 const int minMinH = 20;
780 min.width = minw > maxMax ? maxMax : (minw < minMinW ? minMinW : minw);
781 min.height = minh > maxMax ? maxMax : (minh < minMinH ? minMinH : minh);
782 max.width = maxw > maxMax ? maxMax : (maxw < minMinW ? minMinW : maxw);
783 max.height = maxh > maxMax ? maxMax : (maxh < minMinH ? minMinH : maxh);
784 OSStatus r = WC(SetWindowResizeLimits)(window,&min,&max);
785 checkStatus(r,"WC(SetWindowResizeLimits)");
789 #pragma mark ------ Carbon Methods ------
790 void fileDialogEventHandler(NavEventCallbackMessage callBackSelector, NavCBRecPtr callBackParms, void *userData) {
791 Darwin$FileDialogHelper *helper = (Darwin$FileDialogHelper*) userData;
792 NavDialogRef dialog = callBackParms->context;
794 switch(callBackSelector) {
795 case kNavCBUserAction: {
796 NavUserAction action = WC(NavDialogGetUserAction)(dialog);
797 if(action == kNavUserActionNone || action == kNavUserActionCancel) {
798 helper->fileName = 0;
800 NavReplyRecord reply;
801 r = WC(NavDialogGetReply)(dialog,&reply);
802 checkStatus(r,"WC(NavDialogGetReply)");
807 r = WC(AEGetNthPtr)(&reply.selection,1,typeFSRef,&keyword,NULL,&ref,sizeof(ref),NULL);
808 checkStatus(r,"WC(AEGetNthPtr)");
809 r = WC(FSRefMakePath)(&ref,(UInt8*)buf,sizeof(buf)-1);
810 checkStatus(r,"WC(FSRefMakePath)");
811 helper->fileName = JvNewStringLatin1(buf);
812 if(helper->save) helper->saveName = cfStringToJString(reply.saveFileName);
813 r = WC(NavDisposeReply)(&reply);
814 checkStatus(r,"WC(NavDialogGetReply)");
816 helper->sem->release();
819 case kNavCBTerminate:
820 WC(DisposeNavEventUPP)((NavEventUPP)helper->rawUPP);
821 WC(NavDialogDispose)(dialog);
826 void Darwin::natFileDialog(Darwin$FileDialogHelper *helper,jstring suggestion_, jboolean write) {
828 SmartCFString suggestion = suggestion_;
829 CFStringRef message = CFSTR("By selecting a file in this dialog you are giving this XWT application permission to access that file.");
831 WindowRef window = WC(FrontWindow)();
832 NavDialogCreationOptions options;
834 NavEventUPP handler = WC(NewNavEventUPP)(fileDialogEventHandler);
836 WC(NavGetDefaultDialogCreationOptions)(&options);
837 options.optionFlags =
838 (options.optionFlags|kNavAllFilesInPopup|kNavSelectAllReadableItem|kNavDontUseCustomFrame|kNavDontConfirmReplacement)
839 &~(kNavAllowStationery|kNavAllowMultipleFiles);
840 options.clientName = CFSTR("XWT");
842 options.saveFileName = suggestion;
843 options.message = message;
844 options.modality = window ? kWindowModalityWindowModal : kWindowModalityAppModal;
845 options.parentWindow = window;
848 r = WC(NavCreatePutFileDialog)(&options,0,0,handler,helper,&dlg);
850 r = WC(NavCreateGetFileDialog)(&options,NULL,handler,NULL,NULL,helper,&dlg);
851 checkStatus(r,"NavCreate(Get/Put)FileDialog");
853 helper->rawUPP = (RawData*)handler;
854 WC(NavDialogRun)(dlg);
857 jstring Darwin::natGetClipBoard() {
862 r = WC(GetCurrentScrap)(&scrap);
863 checkStatus(r,"WC(GetCurrentScrap)");
865 r = WC(GetScrapFlavorSize)( scrap, kScrapFlavorTypeUnicode, &size);
866 if(r == scrapFlavorNotFoundErr) return JvNewStringLatin1("");
867 checkStatus(r,"WC(GetScrapFlavorSize)");
869 unsigned int length = size/sizeof(UniChar);
871 jstring js = JvAllocString(length);
872 UniChar *buf = (UniChar*) JvGetStringChars(js);
874 r = WC(GetScrapFlavorData)(scrap,kScrapFlavorTypeUnicode,&size2,buf);
875 if(r == scrapFlavorNotFoundErr);
876 checkStatus(r,"WC(GetScrapFlavorData)");
877 if(size2 != size) return JvNewStringLatin1("");
882 void Darwin::natSetClipBoard(jstring js) {
883 unsigned int length = js->length();
887 r = WC(GetCurrentScrap)(&scrap);
888 checkStatus(r,"WC(GetCurrentScrap)");
890 r = WC(PutScrapFlavor)(scrap,kScrapFlavorTypeUnicode,0,sizeof(UniChar)*length,JvGetStringChars(js));
891 checkStatus(r,"WC(PutScrapFlavor)");
894 HTTP$Proxy *Darwin::natDetectProxy() {
895 using org::xwt::HTTP$Proxy;
899 SmartCFString smartString;
900 CFArrayRef exceptionList;
903 CFDictionaryRef proxyInfo = WC(SCDynamicStoreCopyProxies)(NULL);
904 if(proxyInfo == NULL) return 0;
906 #define doproto(proto,var) \
907 number = (CFNumberRef) WC(CFDictionaryGetValue)(proxyInfo,kSCPropNetProxies ## proto ## Enable); \
908 if(number != NULL && WC(CFGetTypeID)(number) != WC(CFNumberGetTypeID)()) number = NULL; \
909 if(number && WC(CFNumberGetValue)(number,kCFNumberIntType,&i) && i) { \
910 string = (CFStringRef) WC(CFDictionaryGetValue)(proxyInfo, kSCPropNetProxies ## proto ## Proxy);\
911 if(string != NULL && WC(CFGetTypeID)(string) != WC(CFStringGetTypeID)()) string = NULL; \
912 number = (CFNumberRef) WC(CFDictionaryGetValue)(proxyInfo, kSCPropNetProxies ## proto ## Port); \
913 if(number != NULL && WC(CFGetTypeID)(number) != WC(CFNumberGetTypeID)()) number = NULL; \
914 if(string && number && WC(CFNumberGetValue)(number,kCFNumberIntType,&i) && i) { \
915 if(!p) p = new HTTP$Proxy(); \
916 p->var ## ProxyHost = cfStringToJString(string); \
917 p->var ## ProxyPort = i; \
925 exceptionList = (CFArrayRef) WC(CFDictionaryGetValue)(proxyInfo,kSCPropNetProxiesExceptionsList);
926 if(exceptionList != NULL && WC(CFGetTypeID)(exceptionList) != WC(CFArrayGetTypeID)()) exceptionList = NULL;
927 if(p && exceptionList && WC(CFArrayGetCount)(exceptionList)) {
928 CFIndex count = WC(CFArrayGetCount)(exceptionList);
929 p->excluded = (JArray<java::lang::String*>*)
930 JvNewObjectArray(count,&java::lang::String::class$,0);
931 for(i=0;i<count;i++) {
932 string = (CFStringRef) WC(CFArrayGetValueAtIndex)(exceptionList,i);
933 if(string != NULL && WC(CFGetTypeID)(string) != WC(CFStringGetTypeID)()) string = NULL;
934 elements(p->excluded)[i] = string ? cfStringToJString(string) : JvNewStringLatin1("(null)");
937 WC(CFRelease)(proxyInfo);
941 exceptionList = [proxyInfo objectForKey: (NSString*) kSCPropNetProxiesExceptionsList];
942 if(p && exceptionList && [exceptionList count]) {
943 NSLog(@"excl: %@",exceptionList);
944 p->excluded = (JArray<java::lang::String*>*)
945 JvNewObjectArray([exceptionList count],&java::lang::String::class$,0);
946 for(i=0;i<[exceptionList count];i++)
947 elements(p->excluded)[i] = [[exceptionList objectAtIndex: i] jstring];
953 using org::xwt::Proxy;
958 NSArray *exceptionList;
960 NSDictionary *proxyInfo = (NSDictionary*)WC(SCDynamicStoreCopyProxies)(NULL);
962 if(proxyInfo == NULL) return 0;
963 if([[proxyInfo objectForKey: (NSString*) kSCPropNetProxiesHTTPEnable] boolValue]) {
964 host = [proxyInfo objectForKey: (NSString*) kSCPropNetProxiesHTTPProxy];
965 port = [proxyInfo objectForKey: (NSString*) kSCPropNetProxiesHTTPPort];
966 if(host && [port intValue]) {
967 if(!p) p = new Proxy();
968 p->httpProxyHost = [host jstring];
969 p->httpProxyPort = [port intValue];
972 if([[proxyInfo objectForKey: (NSString*) kSCPropNetProxiesHTTPSEnable] boolValue]) {
973 host = [proxyInfo objectForKey: (NSString*) kSCPropNetProxiesHTTPSProxy];
974 port = [proxyInfo objectForKey: (NSString*) kSCPropNetProxiesHTTPSPort];
975 if(host && [port intValue]) {
976 if(!p) p = new Proxy();
977 p->httpsProxyHost = [host jstring];
978 p->httpsProxyPort = [port intValue];
981 if([[proxyInfo objectForKey: (NSString*) kSCPropNetProxiesSOCKSEnable] boolValue]) {
982 host = [proxyInfo objectForKey: (NSString*) kSCPropNetProxiesSOCKSProxy];
983 port = [proxyInfo objectForKey: (NSString*) kSCPropNetProxiesSOCKSPort];
984 if(host && [port intValue]) {
985 if(!p) p = new Proxy();
986 p->socksProxyHost = [host jstring];
987 p->socksProxyPort = [port intValue];
991 exceptionList = [proxyInfo objectForKey: (NSString*) kSCPropNetProxiesExceptionsList];
992 if(p && exceptionList && [exceptionList count]) {
993 NSLog(@"excl: %@",exceptionList);
994 p->excluded = (JArray<java::lang::String*>*)
995 JvNewObjectArray([exceptionList count],&java::lang::String::class$,0);
996 for(i=0;i<[exceptionList count];i++)
997 elements(p->excluded)[i] = [[exceptionList objectAtIndex: i] jstring];
1003 jint Darwin::cgScreenWidth() {
1004 return WC(CGDisplayPixelsWide)(((CGDirectDisplayID)0));
1007 jint Darwin::cgScreenHeight() {
1008 return WC(CGDisplayPixelsHigh)(((CGDirectDisplayID)0));
1011 void Darwin::_newBrowserWindow(jstring js) {
1012 SmartCFString cfs = js;
1013 CFURLRef url = WC(CFURLCreateWithString)(WC(kCFAllocatorDefault),cfs,NULL);
1014 SmartCFString scheme = WC(CFURLCopyScheme)(url);
1015 if(scheme.equals(CFStringRef("http")))
1016 WC(LSOpenCFURLRef)(url,NULL);
1020 void Darwin::natInit() {
1022 #ifdef XWT_CARBON_NO_BUNDLE_HACK
1024 ProcessSerialNumber currentProcess = { 0, kCurrentProcess };
1026 ::fprintf(stderr,"Doing XWT_CARBON_NO_BUNDLE_HACK\n");
1027 r = WC(GetCurrentProcess)(¤tProcess);
1028 checkStatus(r,"WC(GetCurrentProcess)");
1029 r = WC(CPSEnableForegroundOperation)( ¤tProcess );
1030 checkStatus(r,"WC(CPSEnableForegroundOperation)");
1031 r = WC(CPSSetFrontProcess)(¤tProcess);
1032 checkStatus(r,"WC(CPSSetFrontProcess)");
1037 r = CreateNibReference(CFSTR("MainMenu"), &nib);
1038 checkStatus(r,"CreateNibReference");
1039 r = SetMenuBarFromNib(nib, CFSTR("MenuBar"));
1040 checkStatus(r,"SetMenuBarFromNib");
1041 DisposeNibReference(nib);
1043 // FIXME: Install menu event handler
1048 void Darwin::runApplicationEventLoop() {
1049 WC(RunApplicationEventLoop)();
1053 #pragma mark ------ OpenGL Functions -----
1055 void Darwin$CarbonOpenGL::activateSharedContext() {
1056 AGLContext ctx = (AGLContext) rawSharedContext;
1057 WC(aglSetCurrentContext)(ctx);
1060 jboolean Darwin$CarbonOpenGL::initPixelFormat() {
1072 rawPixelFormat = (RawData*) WC(aglChoosePixelFormat)(NULL,0,attr);
1073 return rawPixelFormat != 0;
1076 void Darwin$CarbonOpenGL::initSharedContext() {
1077 AGLPixelFormat fmt = (AGLPixelFormat) rawPixelFormat;
1078 rawSharedContext = (RawData*) WC(aglCreateContext)(fmt,NULL);
1079 checkStatus(rawSharedContext,"WC(aglCreateContext)");
1082 void Darwin$GLCarbonPixelBuffer::natInit() {
1083 WindowClass wc = kPlainWindowClass;
1084 WindowAttributes attr = 0;
1088 AGLContext ctx,shared;
1094 rect.top = rect.left = 0;
1095 rect.right = width + rect.left;
1096 rect.bottom = height + rect.top;
1098 r = WC(CreateNewWindow)(wc,attr,&rect,&window);
1099 checkStatus(r,"WC(CreateNewWindow)");
1101 shared = (AGLContext) gl->rawSharedContext;
1102 fmt = (AGLPixelFormat) gl->rawPixelFormat;
1103 ctx = WC(aglCreateContext)(fmt,shared);
1104 checkStatus(ctx, "WC(aglCreateContext)");
1106 b = WC(aglSetDrawable)(ctx,WC(GetWindowPort)(window));
1107 checkStatus(b,"WC(aglSetDrawable)");
1109 WC(aglSetCurrentContext)(ctx);
1110 WC(aglUpdateContext)(ctx);
1111 drawableInit(width,height);
1112 glClear(GL_COLOR_BUFFER_BIT);
1114 WC(aglSetCurrentContext)(shared);
1115 target = rectTexture ? GL_TEXTURE_RECTANGLE_EXT : GL_TEXTURE_2D;
1117 glGenTextures(1,&tex);
1118 glBindTexture(target,tex);
1119 glTexParameterf(target, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
1120 glTexParameterf(target, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1121 WC(aglSurfaceTexture) (shared, target, GL_RGBA, ctx);
1125 //WC(ShowWindow)(window);
1126 textureName = (jint) tex;
1127 rawWindowRef = (RawData*) window;
1128 rawCTX = (RawData*) ctx;
1131 void Darwin$GLCarbonPixelBuffer::activateContext() {
1132 AGLContext ctx = (AGLContext) rawCTX;
1133 WC(aglSetCurrentContext)(ctx);
1136 void Darwin$GLCarbonPixelBuffer::natCleanup(RawData* rawWindowRef, RawData* rawCTX) {
1137 WindowRef window = (WindowRef) rawWindowRef;
1138 AGLContext ctx = (AGLContext) rawCTX;
1139 WC(aglDestroyContext)(ctx);
1140 WC(DisposeWindow)(window);
1143 void Darwin$GLCarbonSurface::natBlit(Darwin$GLCarbonPixelBuffer *db, jint sx1, jint sy1, jint dx1, jint dy1, jint dx2, jint dy2) {
1144 AGLContext ctx = (AGLContext) rawCTX;
1145 int sx2 = sx1 + (dx2-dx1);
1146 int sy2 = sy1 + (dy2-dy1);
1147 db->activateContext();
1150 WC(aglSetCurrentContext)(ctx);
1152 if(db->rectTexture) {
1153 glEnable(GL_TEXTURE_RECTANGLE_EXT);
1155 glBindTexture(GL_TEXTURE_RECTANGLE_EXT, db->textureName);
1158 glTexCoord2i (sx1, sy1 );
1159 glVertex3i (dx1, dy1, 0);
1160 glTexCoord2i (sx2, sy1 );
1161 glVertex3i (dx2, dy1, 0);
1162 glTexCoord2i (sx2, sy2 );
1163 glVertex3i (dx2, dy2, 0);
1164 glTexCoord2i (sx1, sy2 );
1165 glVertex3i (dx1, dy2, 0);
1168 glDisable(GL_TEXTURE_RECTANGLE_EXT);
1171 float tx1,ty1,tx2,ty2; // normalized texture coords
1172 tx1 = (float) sx1 / (float) db->width;
1173 ty1 = (float) sy1 / (float) db->height;
1174 tx2 = (float) sx2 / (float) db->width;
1175 ty2 = (float) sy2 / (float) db->height;
1177 glColor4f(1.0f,1.0f,1.0f,1.0f);
1178 glEnable(GL_TEXTURE_2D);
1179 glBindTexture(GL_TEXTURE_2D, db->textureName);
1182 glTexCoord2f (tx1, ty1 );
1183 glVertex3i (dx1, dy1, 0);
1184 glTexCoord2f (tx2, ty1 );
1185 glVertex3i (dx2, dy1, 0);
1186 glTexCoord2f (tx2, ty2 );
1187 glVertex3i (dx2, dy2, 0);
1188 glTexCoord2f (tx1, ty2 );
1189 glVertex3i (dx1, dy2, 0);
1191 glDisable(GL_TEXTURE_2D);
1197 void Darwin$GLCarbonSurface::natReshape(jint w, jint h) {
1198 AGLContext ctx = (AGLContext) rawCTX;
1200 WC(aglSetCurrentContext) (ctx);
1201 WC(aglUpdateContext)(ctx);
1203 glViewport(0, 0, w, h);
1204 glMatrixMode(GL_PROJECTION);
1206 glOrtho(0, w, h, 0, -1, 1);
1207 glMatrixMode(GL_MODELVIEW);
1209 glTranslatef (0.375, 0.375, 0.0);
1213 void Darwin$GLCarbonSurface::natInit() {
1214 WindowRef window = (WindowRef) rawWindowRef;
1215 AGLContext ctx,shared;
1219 shared = (AGLContext) gl->rawSharedContext;
1220 fmt = (AGLPixelFormat) gl->rawPixelFormat;
1221 ctx = WC(aglCreateContext)(fmt,shared);
1222 checkStatus(ctx, "WC(aglCreateContext)");
1224 b = WC(aglSetDrawable)(ctx,WC(GetWindowPort)(window));
1225 checkStatus(b,"WC(aglSetDrawable)");
1227 WC(aglSetCurrentContext)(ctx);
1230 rawCTX = (RawData*)ctx;
1234 WC(aglSetCurrentContext)(ctx);
1235 glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
1238 void Darwin$GLCarbonSurface::natDispose() {
1239 AGLContext ctx = (AGLContext) rawCTX;
1240 WC(aglDestroyContext)(ctx);
1241 Darwin$CarbonSurface::natDispose();
1244 } } } // end namepsace org::xwt::plat