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