diff options
Diffstat (limited to 'src/views')
-rw-r--r-- | src/views/SkView.cpp | 22 | ||||
-rw-r--r-- | src/views/SkWindow.cpp | 15 | ||||
-rw-r--r-- | src/views/mac/SkNSView.mm | 41 | ||||
-rw-r--r-- | src/views/mac/SkOSWindow_Mac.mm | 5 | ||||
-rw-r--r-- | src/views/unix/SkOSWindow_Unix.cpp | 14 | ||||
-rw-r--r-- | src/views/win/SkOSWindow_win.cpp | 13 |
6 files changed, 81 insertions, 29 deletions
diff --git a/src/views/SkView.cpp b/src/views/SkView.cpp index 94eb490a0b..0c6c0deb2c 100644 --- a/src/views/SkView.cpp +++ b/src/views/SkView.cpp @@ -372,13 +372,12 @@ void SkView::Click::copyType(const char type[]) } } -SkView::Click* SkView::findClickHandler(SkScalar x, SkScalar y) -{ +SkView::Click* SkView::findClickHandler(SkScalar x, SkScalar y, unsigned modi) { if (x < 0 || y < 0 || x >= fWidth || y >= fHeight) { return NULL; } - if (this->onSendClickToChildren(x, y)) { + if (this->onSendClickToChildren(x, y, modi)) { F2BIter iter(this); SkView* child; @@ -389,7 +388,7 @@ SkView::Click* SkView::findClickHandler(SkScalar x, SkScalar y) continue; } - Click* click = child->findClickHandler(p.fX, p.fY); + Click* click = child->findClickHandler(p.fX, p.fY, modi); if (click) { return click; @@ -397,10 +396,10 @@ SkView::Click* SkView::findClickHandler(SkScalar x, SkScalar y) } } - return this->onFindClickHandler(x, y); + return this->onFindClickHandler(x, y, modi); } -void SkView::DoClickDown(Click* click, int x, int y) +void SkView::DoClickDown(Click* click, int x, int y, unsigned modi) { SkASSERT(click); @@ -420,10 +419,11 @@ void SkView::DoClickDown(Click* click, int x, int y) click->fPrev = click->fCurr = click->fOrig; click->fState = Click::kDown_State; + click->fModifierKeys = modi; target->onClick(click); } -void SkView::DoClickMoved(Click* click, int x, int y) +void SkView::DoClickMoved(Click* click, int x, int y, unsigned modi) { SkASSERT(click); @@ -443,10 +443,11 @@ void SkView::DoClickMoved(Click* click, int x, int y) } click->fState = Click::kMoved_State; + click->fModifierKeys = modi; target->onClick(click); } -void SkView::DoClickUp(Click* click, int x, int y) +void SkView::DoClickUp(Click* click, int x, int y, unsigned modi) { SkASSERT(click); @@ -466,6 +467,7 @@ void SkView::DoClickUp(Click* click, int x, int y) } click->fState = Click::kUp_State; + click->fModifierKeys = modi; target->onClick(click); } @@ -489,11 +491,11 @@ void SkView::onDraw(SkCanvas* canvas) { void SkView::onSizeChange() {} -bool SkView::onSendClickToChildren(SkScalar x, SkScalar y) { +bool SkView::onSendClickToChildren(SkScalar x, SkScalar y, unsigned modi) { return true; } -SkView::Click* SkView::onFindClickHandler(SkScalar x, SkScalar y) { +SkView::Click* SkView::onFindClickHandler(SkScalar x, SkScalar y, unsigned modi) { return NULL; } diff --git a/src/views/SkWindow.cpp b/src/views/SkWindow.cpp index b02631d2bf..0f0d9c179f 100644 --- a/src/views/SkWindow.cpp +++ b/src/views/SkWindow.cpp @@ -358,12 +358,13 @@ bool SkWindow::onHandleKeyUp(SkKey key) return false; } -bool SkWindow::handleClick(int x, int y, Click::State state, void *owner) { - return this->onDispatchClick(x, y, state, owner); +bool SkWindow::handleClick(int x, int y, Click::State state, void *owner, + unsigned modifierKeys) { + return this->onDispatchClick(x, y, state, owner, modifierKeys); } bool SkWindow::onDispatchClick(int x, int y, Click::State state, - void* owner) { + void* owner, unsigned modifierKeys) { bool handled = false; // First, attempt to find an existing click with this owner. @@ -382,25 +383,25 @@ bool SkWindow::onDispatchClick(int x, int y, Click::State state, fClicks.remove(index); } Click* click = this->findClickHandler(SkIntToScalar(x), - SkIntToScalar(y)); + SkIntToScalar(y), modifierKeys); if (click) { click->fOwner = owner; *fClicks.append() = click; - SkView::DoClickDown(click, x, y); + SkView::DoClickDown(click, x, y, modifierKeys); handled = true; } break; } case Click::kMoved_State: if (index != -1) { - SkView::DoClickMoved(fClicks[index], x, y); + SkView::DoClickMoved(fClicks[index], x, y, modifierKeys); handled = true; } break; case Click::kUp_State: if (index != -1) { - SkView::DoClickUp(fClicks[index], x, y); + SkView::DoClickUp(fClicks[index], x, y, modifierKeys); delete fClicks[index]; fClicks.remove(index); handled = true; diff --git a/src/views/mac/SkNSView.mm b/src/views/mac/SkNSView.mm index ffa9d7cd81..fc82ac4949 100644 --- a/src/views/mac/SkNSView.mm +++ b/src/views/mac/SkNSView.mm @@ -192,35 +192,68 @@ static SkKey raw2key(UInt32 raw) // unichar c = [[event characters] characterAtIndex:0]; } +static const struct { + unsigned fNSModifierMask; + unsigned fSkModifierMask; +} gModifierMasks[] = { + { NSAlphaShiftKeyMask, kShift_SkModifierKey }, + { NSShiftKeyMask, kShift_SkModifierKey }, + { NSControlKeyMask, kControl_SkModifierKey }, + { NSAlternateKeyMask, kOption_SkModifierKey }, + { NSCommandKeyMask, kCommand_SkModifierKey }, +}; + +static unsigned convertNSModifiersToSk(NSUInteger nsModi) { + unsigned skModi = 0; + for (size_t i = 0; i < SK_ARRAY_COUNT(gModifierMasks); ++i) { + if (nsModi & gModifierMasks[i].fNSModifierMask) { + skModi |= gModifierMasks[i].fSkModifierMask; + } + } + return skModi; +} + - (void)mouseDown:(NSEvent *)event { NSPoint p = [event locationInWindow]; + unsigned modi = convertNSModifiersToSk([event modifierFlags]); + if ([self mouse:p inRect:[self bounds]] && NULL != fWind) { NSPoint loc = [self convertPoint:p fromView:nil]; - fWind->handleClick((int) loc.x, (int) loc.y, SkView::Click::kDown_State, self); + fWind->handleClick((int) loc.x, (int) loc.y, + SkView::Click::kDown_State, self, modi); } } - (void)mouseDragged:(NSEvent *)event { NSPoint p = [event locationInWindow]; + unsigned modi = convertNSModifiersToSk([event modifierFlags]); + if ([self mouse:p inRect:[self bounds]] && NULL != fWind) { NSPoint loc = [self convertPoint:p fromView:nil]; - fWind->handleClick((int) loc.x, (int) loc.y, SkView::Click::kMoved_State, self); + fWind->handleClick((int) loc.x, (int) loc.y, + SkView::Click::kMoved_State, self, modi); } } - (void)mouseMoved:(NSEvent *)event { NSPoint p = [event locationInWindow]; + unsigned modi = convertNSModifiersToSk([event modifierFlags]); + if ([self mouse:p inRect:[self bounds]] && NULL != fWind) { NSPoint loc = [self convertPoint:p fromView:nil]; - fWind->handleClick((int) loc.x, (int) loc.y, SkView::Click::kMoved_State, self); + fWind->handleClick((int) loc.x, (int) loc.y, + SkView::Click::kMoved_State, self, modi); } } - (void)mouseUp:(NSEvent *)event { NSPoint p = [event locationInWindow]; + unsigned modi = convertNSModifiersToSk([event modifierFlags]); + if ([self mouse:p inRect:[self bounds]] && NULL != fWind) { NSPoint loc = [self convertPoint:p fromView:nil]; - fWind->handleClick((int) loc.x, (int) loc.y, SkView::Click::kUp_State, self); + fWind->handleClick((int) loc.x, (int) loc.y, + SkView::Click::kUp_State, self, modi); } } diff --git a/src/views/mac/SkOSWindow_Mac.mm b/src/views/mac/SkOSWindow_Mac.mm index a288ae34ba..01c8677f4d 100644 --- a/src/views/mac/SkOSWindow_Mac.mm +++ b/src/views/mac/SkOSWindow_Mac.mm @@ -48,8 +48,9 @@ bool SkOSWindow::onEvent(const SkEvent& evt) { return this->INHERITED::onEvent(evt); } -bool SkOSWindow::onDispatchClick(int x, int y, Click::State state, void* owner) { - return this->INHERITED::onDispatchClick(x, y, state, owner); +bool SkOSWindow::onDispatchClick(int x, int y, Click::State state, void* owner, + unsigned modi) { + return this->INHERITED::onDispatchClick(x, y, state, owner, modi); } void SkOSWindow::onSetTitle(const char title[]) { diff --git a/src/views/unix/SkOSWindow_Unix.cpp b/src/views/unix/SkOSWindow_Unix.cpp index 46a2b3dd09..6c973e0186 100644 --- a/src/views/unix/SkOSWindow_Unix.cpp +++ b/src/views/unix/SkOSWindow_Unix.cpp @@ -150,6 +150,11 @@ void SkOSWindow::post_linuxevent() { XFlush(fUnixWindow.fDisplay); } +static unsigned getModifierKeys(const XEvent& evt) { +// unsigned xmod = evt.xkey.state; + return 0; // TODO +} + void SkOSWindow::loop() { Display* dsp = fUnixWindow.fDisplay; if (NULL == dsp) { @@ -171,14 +176,17 @@ void SkOSWindow::loop() { break; case ButtonPress: if (evt.xbutton.button == Button1) - this->handleClick(evt.xbutton.x, evt.xbutton.y, SkView::Click::kDown_State); + this->handleClick(evt.xbutton.x, evt.xbutton.y, + SkView::Click::kDown_State, getModifierKeys(evt)); break; case ButtonRelease: if (evt.xbutton.button == Button1) - this->handleClick(evt.xbutton.x, evt.xbutton.y, SkView::Click::kUp_State); + this->handleClick(evt.xbutton.x, evt.xbutton.y, + SkView::Click::kUp_State, getModifierKeys(evt)); break; case MotionNotify: - this->handleClick(evt.xmotion.x, evt.xmotion.y, SkView::Click::kMoved_State); + this->handleClick(evt.xmotion.x, evt.xmotion.y, + SkView::Click::kMoved_State, getModifierKeys(evt)); break; case KeyPress: { KeySym keysym = XkbKeycodeToKeysym(dsp, evt.xkey.keycode, 0, 0); diff --git a/src/views/win/SkOSWindow_win.cpp b/src/views/win/SkOSWindow_win.cpp index 150be6aa70..5ae00cbc48 100644 --- a/src/views/win/SkOSWindow_win.cpp +++ b/src/views/win/SkOSWindow_win.cpp @@ -103,6 +103,10 @@ static SkKey winToskKey(WPARAM vk) { return kNONE_SkKey; } +static unsigned getModifiers(UINT message) { + return 0; // TODO +} + bool SkOSWindow::wndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_KEYDOWN: { @@ -146,15 +150,18 @@ bool SkOSWindow::wndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) } break; case WM_LBUTTONDOWN: - this->handleClick(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam), Click::kDown_State); + this->handleClick(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam), + Click::kDown_State, getModifiers(message)); return true; case WM_MOUSEMOVE: - this->handleClick(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam), Click::kMoved_State); + this->handleClick(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam), + Click::kMoved_State, getModifiers(message)); return true; case WM_LBUTTONUP: - this->handleClick(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam), Click::kUp_State); + this->handleClick(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam), + Click::kUp_State, getModifiers(message)); return true; case WM_EVENT_CALLBACK: |