152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project#if defined(SK_BUILD_FOR_MAC) && !defined(SK_USE_WXWIDGETS) 252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project 352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project#include "SkWindow.h" 452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project#include "SkCanvas.h" 552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project#include "SkOSMenu.h" 652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project#include "SkTime.h" 752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project 852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project#include "SkGraphics.h" 952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project#include <new.h> 1052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project 1152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Projectstatic void (*gPrevNewHandler)(); 1252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project 1352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Projectextern "C" { 1452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project static void sk_new_handler() 1552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project { 1652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project if (SkGraphics::SetFontCacheUsed(0)) 1752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project return; 1852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project if (gPrevNewHandler) 1952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project gPrevNewHandler(); 2052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project else 2152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project sk_throw(); 2252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project } 2352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project} 2452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project 2552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Projectstatic SkOSWindow* gCurrOSWin; 2652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Projectstatic EventTargetRef gEventTarget; 2752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Projectstatic EventQueueRef gCurrEventQ; 2852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project 2952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project#define SK_MacEventClass FOUR_CHAR_CODE('SKec') 3052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project#define SK_MacEventKind FOUR_CHAR_CODE('SKek') 3152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project#define SK_MacEventParamName FOUR_CHAR_CODE('SKev') 3252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project#define SK_MacEventSinkIDParamName FOUR_CHAR_CODE('SKes') 3352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project 3452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source ProjectSkOSWindow::SkOSWindow(void* hWnd) : fHWND(hWnd) 3552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project{ 3652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project static const EventTypeSpec gTypes[] = { 3752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project { kEventClassKeyboard, kEventRawKeyDown }, 3852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project { kEventClassKeyboard, kEventRawKeyUp }, 3952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project { kEventClassMouse, kEventMouseDown }, 4052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project { kEventClassMouse, kEventMouseDragged }, 4152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project { kEventClassMouse, kEventMouseUp }, 4252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project { kEventClassTextInput, kEventTextInputUnicodeForKeyEvent }, 4352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project { kEventClassWindow, kEventWindowBoundsChanged }, 4452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project { kEventClassWindow, kEventWindowDrawContent }, 4552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project { SK_MacEventClass, SK_MacEventKind } 4652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project }; 4752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project 4852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project EventHandlerUPP handlerUPP = NewEventHandlerUPP(SkOSWindow::EventHandler); 4952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project int count = SK_ARRAY_COUNT(gTypes); 5052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project OSStatus result; 5152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project 5252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project result = InstallEventHandler(GetWindowEventTarget((WindowRef)hWnd), handlerUPP, 5352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project count, gTypes, this, nil); 5452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project SkASSERT(result == noErr); 5552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project 5652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project gCurrOSWin = this; 5752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project gCurrEventQ = GetCurrentEventQueue(); 5852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project gEventTarget = GetWindowEventTarget((WindowRef)hWnd); 5952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project 6052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project static bool gOnce = true; 6152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project if (gOnce) { 6252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project gOnce = false; 6352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project gPrevNewHandler = set_new_handler(sk_new_handler); 6452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project } 6552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project} 6652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project 6752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Projectvoid SkOSWindow::doPaint(void* ctx) 6852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project{ 6952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project this->update(NULL); 7052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project 7152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project this->getBitmap().drawToPort((WindowRef)fHWND, (CGContextRef)ctx); 7252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project} 7352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project 7452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Projectvoid SkOSWindow::updateSize() 7552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project{ 7652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project Rect r; 7752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project 7852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project GetWindowBounds((WindowRef)fHWND, kWindowContentRgn, &r); 7952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project this->resize(r.right - r.left, r.bottom - r.top); 8052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project} 8152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project 8252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Projectvoid SkOSWindow::onHandleInval(const SkIRect& r) 8352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project{ 8452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project Rect rect; 8552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project 8652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project rect.left = r.fLeft; 8752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project rect.top = r.fTop; 8852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project rect.right = r.fRight; 8952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project rect.bottom = r.fBottom; 9052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project InvalWindowRect((WindowRef)fHWND, &rect); 9152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project} 9252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project 9352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Projectvoid SkOSWindow::onSetTitle(const char title[]) 9452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project{ 9552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project CFStringRef str = CFStringCreateWithCString(NULL, title, kCFStringEncodingUTF8); 9652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project SetWindowTitleWithCFString((WindowRef)fHWND, str); 9752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project CFRelease(str); 9852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project} 9952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project 10052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Projectvoid SkOSWindow::onAddMenu(const SkOSMenu* sk_menu) 10152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project{ 10252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project} 10352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project 10452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Projectstatic void getparam(EventRef inEvent, OSType name, OSType type, UInt32 size, void* data) 10552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project{ 10652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project EventParamType actualType; 10752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project UInt32 actualSize; 10852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project OSStatus status; 10952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project 11052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project status = GetEventParameter(inEvent, name, type, &actualType, size, &actualSize, data); 11152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project SkASSERT(status == noErr); 11252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project SkASSERT(actualType == type); 11352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project SkASSERT(actualSize == size); 11452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project} 11552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project 11652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Projectenum { 11752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project SK_MacReturnKey = 36, 11852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project SK_MacDeleteKey = 51, 11952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project SK_MacEndKey = 119, 12052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project SK_MacLeftKey = 123, 12152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project SK_MacRightKey = 124, 12252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project SK_MacDownKey = 125, 12352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project SK_MacUpKey = 126, 12452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project 12552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project SK_Mac0Key = 0x52, 12652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project SK_Mac1Key = 0x53, 12752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project SK_Mac2Key = 0x54, 12852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project SK_Mac3Key = 0x55, 12952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project SK_Mac4Key = 0x56, 13052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project SK_Mac5Key = 0x57, 13152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project SK_Mac6Key = 0x58, 13252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project SK_Mac7Key = 0x59, 13352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project SK_Mac8Key = 0x5b, 13452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project SK_Mac9Key = 0x5c 13552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project}; 13652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project 13752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Projectstatic SkKey raw2key(UInt32 raw) 13852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project{ 13952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project static const struct { 14052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project UInt32 fRaw; 14152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project SkKey fKey; 14252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project } gKeys[] = { 14352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project { SK_MacUpKey, kUp_SkKey }, 14452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project { SK_MacDownKey, kDown_SkKey }, 14552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project { SK_MacLeftKey, kLeft_SkKey }, 14652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project { SK_MacRightKey, kRight_SkKey }, 14752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project { SK_MacReturnKey, kOK_SkKey }, 14852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project { SK_MacDeleteKey, kBack_SkKey }, 14952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project { SK_MacEndKey, kEnd_SkKey }, 15052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project { SK_Mac0Key, k0_SkKey }, 15152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project { SK_Mac1Key, k1_SkKey }, 15252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project { SK_Mac2Key, k2_SkKey }, 15352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project { SK_Mac3Key, k3_SkKey }, 15452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project { SK_Mac4Key, k4_SkKey }, 15552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project { SK_Mac5Key, k5_SkKey }, 15652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project { SK_Mac6Key, k6_SkKey }, 15752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project { SK_Mac7Key, k7_SkKey }, 15852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project { SK_Mac8Key, k8_SkKey }, 15952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project { SK_Mac9Key, k9_SkKey } 16052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project }; 16152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project 16252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project for (unsigned i = 0; i < SK_ARRAY_COUNT(gKeys); i++) 16352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project if (gKeys[i].fRaw == raw) 16452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project return gKeys[i].fKey; 16552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project return kNONE_SkKey; 16652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project} 16752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project 16852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Projectstatic void post_skmacevent() 16952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project{ 17052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project EventRef ref; 17152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project OSStatus status = CreateEvent(nil, SK_MacEventClass, SK_MacEventKind, 0, 0, &ref); 17252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project SkASSERT(status == noErr); 17352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project 17452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project#if 0 17552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project status = SetEventParameter(ref, SK_MacEventParamName, SK_MacEventParamName, sizeof(evt), &evt); 17652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project SkASSERT(status == noErr); 17752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project status = SetEventParameter(ref, SK_MacEventSinkIDParamName, SK_MacEventSinkIDParamName, sizeof(sinkID), &sinkID); 17852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project SkASSERT(status == noErr); 17952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project#endif 18052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project 18152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project EventTargetRef target = gEventTarget; 18252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project SetEventParameter(ref, kEventParamPostTarget, typeEventTargetRef, sizeof(target), &target); 18352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project SkASSERT(status == noErr); 18452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project 18552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project status = PostEventToQueue(gCurrEventQ, ref, kEventPriorityStandard); 18652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project SkASSERT(status == noErr); 18752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project 18852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project ReleaseEvent(ref); 18952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project} 19052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project 19152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Projectpascal OSStatus SkOSWindow::EventHandler( EventHandlerCallRef inHandler, EventRef inEvent, void* userData ) 19252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project{ 19352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project SkOSWindow* win = (SkOSWindow*)userData; 19452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project OSStatus result = eventNotHandledErr; 19552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project UInt32 wClass = GetEventClass(inEvent); 19652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project UInt32 wKind = GetEventKind(inEvent); 19752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project 19852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project gCurrOSWin = win; // will need to be in TLS. Set this so PostEvent will work 19952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project 20052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project switch (wClass) { 20152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project case kEventClassMouse: { 20252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project Point pt; 20352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project getparam(inEvent, kEventParamMouseLocation, typeQDPoint, sizeof(pt), &pt); 20452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project SetPortWindowPort((WindowRef)win->getHWND()); 20552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project GlobalToLocal(&pt); 20652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project 20752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project switch (wKind) { 20852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project case kEventMouseDown: 20952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project (void)win->handleClick(pt.h, pt.v, Click::kDown_State); 21052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project break; 21152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project case kEventMouseDragged: 21252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project (void)win->handleClick(pt.h, pt.v, Click::kMoved_State); 21352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project break; 21452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project case kEventMouseUp: 21552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project (void)win->handleClick(pt.h, pt.v, Click::kUp_State); 21652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project break; 21752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project default: 21852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project break; 21952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project } 22052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project break; 22152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project } 22252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project case kEventClassKeyboard: 22352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project if (wKind == kEventRawKeyDown) { 22452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project UInt32 raw; 22552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project getparam(inEvent, kEventParamKeyCode, typeUInt32, sizeof(raw), &raw); 22652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project SkKey key = raw2key(raw); 22752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project if (key != kNONE_SkKey) 22852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project (void)win->handleKey(key); 22952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project } else if (wKind == kEventRawKeyUp) { 23052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project UInt32 raw; 23152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project getparam(inEvent, kEventParamKeyCode, typeUInt32, sizeof(raw), &raw); 23252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project SkKey key = raw2key(raw); 23352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project if (key != kNONE_SkKey) 23452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project (void)win->handleKeyUp(key); 23552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project } 23652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project break; 23752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project case kEventClassTextInput: 23852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project if (wKind == kEventTextInputUnicodeForKeyEvent) { 23952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project UInt16 uni; 24052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project getparam(inEvent, kEventParamTextInputSendText, typeUnicodeText, sizeof(uni), &uni); 24152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project win->handleChar(uni); 24252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project } 24352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project break; 24452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project case kEventClassWindow: 24552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project switch (wKind) { 24652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project case kEventWindowBoundsChanged: 24752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project win->updateSize(); 24852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project break; 24952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project case kEventWindowDrawContent: { 25052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project CGContextRef cg; 25152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project result = GetEventParameter(inEvent, 25252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project kEventParamCGContextRef, 25352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project typeCGContextRef, 25452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project NULL, 25552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project sizeof (CGContextRef), 25652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project NULL, 25752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project &cg); 25852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project if (result != 0) { 25952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project cg = NULL; 26052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project } 26152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project win->doPaint(cg); 26252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project break; 26352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project } 26452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project default: 26552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project break; 26652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project } 26752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project break; 26852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project case SK_MacEventClass: { 26952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project SkASSERT(wKind == SK_MacEventKind); 27052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project if (SkEvent::ProcessEvent()) { 27152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project post_skmacevent(); 27252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project } 27352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project #if 0 27452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project SkEvent* evt; 27552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project SkEventSinkID sinkID; 27652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project getparam(inEvent, SK_MacEventParamName, SK_MacEventParamName, sizeof(evt), &evt); 27752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project getparam(inEvent, SK_MacEventSinkIDParamName, SK_MacEventSinkIDParamName, sizeof(sinkID), &sinkID); 27852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project #endif 27952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project result = noErr; 28052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project break; 28152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project } 28252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project default: 28352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project break; 28452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project } 28552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project if (result == eventNotHandledErr) { 28652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project result = CallNextEventHandler(inHandler, inEvent); 28752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project } 28852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project return result; 28952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project} 29052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project 29152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project/////////////////////////////////////////////////////////////////////////////////////// 29252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project 29352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Projectvoid SkEvent::SignalNonEmptyQueue() 29452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project{ 29552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project post_skmacevent(); 29652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project// SkDebugf("signal nonempty\n"); 29752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project} 29852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project 29952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Projectstatic TMTask gTMTaskRec; 30052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Projectstatic TMTask* gTMTaskPtr; 30152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project 30252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Projectstatic void sk_timer_proc(TMTask* rec) 30352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project{ 30452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project SkEvent::ServiceQueueTimer(); 30552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project// SkDebugf("timer task fired\n"); 30652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project} 30752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project 30852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Projectvoid SkEvent::SignalQueueTimer(SkMSec delay) 30952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project{ 31052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project if (gTMTaskPtr) 31152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project { 31252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project RemoveTimeTask((QElem*)gTMTaskPtr); 31352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project DisposeTimerUPP(gTMTaskPtr->tmAddr); 31452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project gTMTaskPtr = nil; 31552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project } 31652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project if (delay) 31752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project { 31852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project gTMTaskPtr = &gTMTaskRec; 31952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project memset(gTMTaskPtr, 0, sizeof(gTMTaskRec)); 32052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project gTMTaskPtr->tmAddr = NewTimerUPP(sk_timer_proc); 32152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project OSErr err = InstallTimeTask((QElem*)gTMTaskPtr); 32252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project// SkDebugf("installtimetask of %d returned %d\n", delay, err); 32352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project PrimeTimeTask((QElem*)gTMTaskPtr, delay); 32452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project } 32552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project} 32652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project 32752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project#endif 32852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project 329