diff options
author | Tor Lillqvist <tml@iki.fi> | 2013-03-03 01:06:17 +0200 |
---|---|---|
committer | Tor Lillqvist <tml@iki.fi> | 2013-03-03 01:14:15 +0200 |
commit | 5930a963aeb8947f9d23326c98da7cbc4cd35a08 (patch) | |
tree | 1ab2d2f493d614f8158412955a5b9b7abed2465c | |
parent | 92c033df8f4e279196397a06bb5fd4da80f51111 (diff) |
Implement the VCLEVENT_WINDOW_ZOOM by turning it into a wheel mouse event
For now just use an ad-hoc factor that works close enough on my device to turn
the zoom scale factor into a value for the somewhat undocumented mnDelta field
in SalWheelMouseEvent. Ideally we should of course calculate it so that the
end result actually is the document content view being scaled by the requested
scale factor.
Change-Id: I21215d38c8ce4a35591d92d305ad1aeeca379f0a
-rw-r--r-- | vcl/inc/salwtype.hxx | 4 | ||||
-rw-r--r-- | vcl/source/app/svapp.cxx | 39 | ||||
-rw-r--r-- | vcl/source/window/winproc.cxx | 31 |
3 files changed, 70 insertions, 4 deletions
diff --git a/vcl/inc/salwtype.hxx b/vcl/inc/salwtype.hxx index 98651c278374..589baa61d8d1 100644 --- a/vcl/inc/salwtype.hxx +++ b/vcl/inc/salwtype.hxx @@ -98,7 +98,9 @@ class FontSelectPattern; #define SALEVENT_SURROUNDINGTEXTREQUEST ((sal_uInt16)43) #define SALEVENT_SURROUNDINGTEXTSELECTIONCHANGE ((sal_uInt16)44) #define SALEVENT_STARTRECONVERSION ((sal_uInt16)45) -#define SALEVENT_COUNT ((sal_uInt16)45) +#define SALEVENT_EXTERNALZOOM ((sal_uInt16)46) +#define SALEVENT_EXTERNALSCROLL ((sal_uInt16)47) +#define SALEVENT_COUNT ((sal_uInt16)47) // MOUSELEAVE must send, when the pointer leave the client area and // the mouse is not captured diff --git a/vcl/source/app/svapp.cxx b/vcl/source/app/svapp.cxx index dcd88efca40d..fe34011bff02 100644 --- a/vcl/source/app/svapp.cxx +++ b/vcl/source/app/svapp.cxx @@ -177,12 +177,17 @@ struct ImplPostEventData sal_uLong mnEventId; KeyEvent maKeyEvent; MouseEvent maMouseEvent; - + ZoomEvent maZoomEvent; + ScrollEvent maScrollEvent; ImplPostEventData( sal_uLong nEvent, const Window* pWin, const KeyEvent& rKeyEvent ) : mnEvent( nEvent ), mpWin( pWin ), mnEventId( 0 ), maKeyEvent( rKeyEvent ) {} ImplPostEventData( sal_uLong nEvent, const Window* pWin, const MouseEvent& rMouseEvent ) : mnEvent( nEvent ), mpWin( pWin ), mnEventId( 0 ), maMouseEvent( rMouseEvent ) {} + ImplPostEventData( sal_uLong nEvent, const Window* pWin, const ZoomEvent& rZoomEvent ) : + mnEvent( nEvent ), mpWin( pWin ), mnEventId( 0 ), maZoomEvent( rZoomEvent ) {} + ImplPostEventData( sal_uLong nEvent, const Window* pWin, const ScrollEvent& rScrollEvent ) : + mnEvent( nEvent ), mpWin( pWin ), mnEventId( 0 ), maScrollEvent( rScrollEvent ) {} ~ImplPostEventData() {} }; @@ -894,8 +899,26 @@ sal_uLong Application::PostZoomEvent( sal_uLong nEvent, Window *pWin, ZoomEvent* if( pWin && pZoomEvent ) { - // Implement... - (void) nEvent; + Point aTransformedPos( pZoomEvent->GetCenter() ); + + aTransformedPos.X() += pWin->mnOutOffX; + aTransformedPos.Y() += pWin->mnOutOffY; + + const ZoomEvent aTransformedEvent( aTransformedPos, pZoomEvent->GetScale() ); + + ImplPostEventData* pPostEventData = new ImplPostEventData( nEvent, pWin, aTransformedEvent ); + + PostUserEvent( nEventId, + STATIC_LINK( NULL, Application, PostEventHandler ), + pPostEventData ); + + if( nEventId ) + { + pPostEventData->mnEventId = nEventId; + aPostedEventList.push_back( ImplPostEventPair( pWin, pPostEventData ) ); + } + else + delete pPostEventData; } return nEventId; @@ -938,6 +961,16 @@ IMPL_STATIC_LINK_NOINSTANCE( Application, PostEventHandler, void*, pCallData ) pEventData = &pData->maKeyEvent; break; + case VCLEVENT_WINDOW_ZOOM: + nEvent = SALEVENT_EXTERNALZOOM; + pEventData = &pData->maZoomEvent; + break; + + case VCLEVENT_WINDOW_SCROLL: + nEvent = SALEVENT_EXTERNALSCROLL; + pEventData = &pData->maScrollEvent; + break; + default: nEvent = 0; pEventData = NULL; diff --git a/vcl/source/window/winproc.cxx b/vcl/source/window/winproc.cxx index e04597f0db91..0ec4f8337c61 100644 --- a/vcl/source/window/winproc.cxx +++ b/vcl/source/window/winproc.cxx @@ -2592,6 +2592,37 @@ long ImplWindowFrameProc( Window* pWindow, SalFrame* /*pFrame*/, case SALEVENT_STARTRECONVERSION: ImplHandleStartReconversion( pWindow ); break; + case SALEVENT_EXTERNALZOOM: + { + // Manually tuned to get a pleasing effect at least on my + // device... Would be better to actually achieve the + // requested scale factor of course. + const int ZOOM_FACTOR = 300; + + ZoomEvent* pZoomEvent = (ZoomEvent*) pEvent; + SalWheelMouseEvent aSalWheelMouseEvent; + + aSalWheelMouseEvent.mnTime = Time::GetSystemTicks(); + aSalWheelMouseEvent.mnX = pZoomEvent->GetCenter().getX(); + aSalWheelMouseEvent.mnY = pZoomEvent->GetCenter().getY(); + + if ( pZoomEvent->GetScale() < 1 ) { + aSalWheelMouseEvent.mnDelta = - (long) ((1 - pZoomEvent->GetScale()) * ZOOM_FACTOR); + aSalWheelMouseEvent.mnNotchDelta = -1; + } else { + aSalWheelMouseEvent.mnDelta = (long) ((pZoomEvent->GetScale() - 1) * ZOOM_FACTOR); + aSalWheelMouseEvent.mnNotchDelta = 1; + } + + aSalWheelMouseEvent.mnScrollLines = 1; // ??? + aSalWheelMouseEvent.mnCode = KEY_MOD1; + aSalWheelMouseEvent.mbDeltaIsPixel = 0; // ??? + + nRet = ImplHandleWheelEvent( pWindow, aSalWheelMouseEvent ); + } + break; + case SALEVENT_EXTERNALSCROLL: + break; #ifdef DBG_UTIL default: OSL_TRACE( "ImplWindowFrameProc(): unknown event (%lu)", (sal_uLong)nEvent ); |