summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTor Lillqvist <tml@iki.fi>2013-03-03 01:06:17 +0200
committerTor Lillqvist <tml@iki.fi>2013-03-03 01:14:15 +0200
commit5930a963aeb8947f9d23326c98da7cbc4cd35a08 (patch)
tree1ab2d2f493d614f8158412955a5b9b7abed2465c
parent92c033df8f4e279196397a06bb5fd4da80f51111 (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.hxx4
-rw-r--r--vcl/source/app/svapp.cxx39
-rw-r--r--vcl/source/window/winproc.cxx31
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 );