2013-03-20 09:07:52 +02:00
|
|
|
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
|
|
|
/*
|
|
|
|
* This file is part of the LibreOffice project.
|
|
|
|
*
|
|
|
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
|
|
*
|
|
|
|
* This file incorporates work covered by the following license notice:
|
|
|
|
*
|
|
|
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
|
|
|
* contributor license agreements. See the NOTICE file distributed
|
|
|
|
* with this work for additional information regarding copyright
|
|
|
|
* ownership. The ASF licenses this file to you under the Apache
|
|
|
|
* License, Version 2.0 (the "License"); you may not use this file
|
|
|
|
* except in compliance with the License. You may obtain a copy of
|
|
|
|
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <premac.h>
|
2013-03-30 14:28:13 +02:00
|
|
|
#include <UIKit/UIKit.h>
|
2013-03-20 09:07:52 +02:00
|
|
|
#include <postmac.h>
|
|
|
|
|
2013-10-13 20:45:16 +03:00
|
|
|
#include <basebmp/scanlineformats.hxx>
|
|
|
|
#include <touch/touch.h>
|
2013-10-22 01:06:56 +03:00
|
|
|
#include <touch/touch-impl.h>
|
2013-10-13 20:45:16 +03:00
|
|
|
|
2013-03-20 09:07:52 +02:00
|
|
|
#include "ios/iosinst.hxx"
|
|
|
|
#include "headless/svpdummies.hxx"
|
|
|
|
#include "generic/gendata.hxx"
|
2014-01-26 12:03:53 +02:00
|
|
|
#include "quartz/utils.h"
|
2014-08-18 08:50:54 +01:00
|
|
|
#include <vcl/layout.hxx>
|
2014-02-20 17:59:14 -08:00
|
|
|
#include <vcl/settings.hxx>
|
2013-03-20 09:07:52 +02:00
|
|
|
|
|
|
|
// Horrible hack
|
|
|
|
static int viewWidth = 1, viewHeight = 1;
|
|
|
|
|
|
|
|
class IosSalData : public SalGenericData
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
IosSalData( SalInstance *pInstance ) : SalGenericData( SAL_DATA_IOS, pInstance ) {}
|
|
|
|
virtual void ErrorTrapPush() {}
|
|
|
|
virtual bool ErrorTrapPop( bool ) { return false; }
|
|
|
|
};
|
|
|
|
|
|
|
|
void IosSalInstance::GetWorkArea( Rectangle& rRect )
|
|
|
|
{
|
|
|
|
rRect = Rectangle( Point( 0, 0 ),
|
|
|
|
Size( viewWidth, viewHeight ) );
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Try too hard to get a frame, in the absence of anything better to do
|
|
|
|
*/
|
|
|
|
SalFrame *IosSalInstance::getFocusFrame() const
|
|
|
|
{
|
|
|
|
SalFrame *pFocus = SvpSalFrame::GetFocusFrame();
|
|
|
|
if (!pFocus) {
|
|
|
|
const std::list< SalFrame* >& rFrames( getFrames() );
|
|
|
|
for( std::list< SalFrame* >::const_iterator it = rFrames.begin(); it != rFrames.end(); ++it )
|
|
|
|
{
|
|
|
|
SvpSalFrame *pFrame = const_cast<SvpSalFrame*>(static_cast<const SvpSalFrame*>(*it));
|
|
|
|
if( pFrame->IsVisible() )
|
|
|
|
{
|
|
|
|
pFrame->GetFocus();
|
|
|
|
pFocus = pFrame;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return pFocus;
|
|
|
|
}
|
|
|
|
|
|
|
|
IosSalInstance *IosSalInstance::getInstance()
|
|
|
|
{
|
|
|
|
if (!ImplGetSVData())
|
|
|
|
return NULL;
|
|
|
|
IosSalData *pData = static_cast<IosSalData *>(ImplGetSVData()->mpSalData);
|
|
|
|
if (!pData)
|
|
|
|
return NULL;
|
|
|
|
return static_cast<IosSalInstance *>(pData->m_pInstance);
|
|
|
|
}
|
|
|
|
|
|
|
|
IosSalInstance::IosSalInstance( SalYieldMutex *pMutex )
|
|
|
|
: SvpSalInstance( pMutex )
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
IosSalInstance::~IosSalInstance()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2013-03-30 01:39:22 +02:00
|
|
|
#if 0
|
|
|
|
|
2013-03-20 09:07:52 +02:00
|
|
|
bool IosSalInstance::AnyInput( sal_uInt16 nType )
|
|
|
|
{
|
|
|
|
if( (nType & VCL_INPUT_TIMER) != 0 )
|
|
|
|
return CheckTimeout( false );
|
|
|
|
|
|
|
|
// Unfortunately there is no way to check for a specific type of
|
|
|
|
// input being queued. That information is too hidden, sigh.
|
|
|
|
return SvpSalInstance::s_pDefaultInstance->PostedEventsInQueue();
|
|
|
|
}
|
|
|
|
|
2013-03-30 01:39:22 +02:00
|
|
|
#endif
|
|
|
|
|
2013-03-20 09:07:52 +02:00
|
|
|
class IosSalSystem : public SvpSalSystem {
|
|
|
|
public:
|
|
|
|
IosSalSystem() : SvpSalSystem() {}
|
|
|
|
virtual ~IosSalSystem() {}
|
2013-04-07 12:06:47 +02:00
|
|
|
virtual int ShowNativeDialog( const OUString& rTitle,
|
|
|
|
const OUString& rMessage,
|
|
|
|
const std::list< OUString >& rButtons,
|
2013-03-20 09:07:52 +02:00
|
|
|
int nDefButton );
|
|
|
|
};
|
|
|
|
|
|
|
|
SalSystem *IosSalInstance::CreateSalSystem()
|
|
|
|
{
|
|
|
|
return new IosSalSystem();
|
|
|
|
}
|
|
|
|
|
|
|
|
class IosSalFrame : public SvpSalFrame
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
IosSalFrame( IosSalInstance *pInstance,
|
|
|
|
SalFrame *pParent,
|
|
|
|
sal_uLong nSalFrameStyle,
|
|
|
|
SystemParentData *pSysParent )
|
|
|
|
: SvpSalFrame( pInstance, pParent, nSalFrameStyle,
|
2013-12-11 18:11:22 +02:00
|
|
|
true, basebmp::FORMAT_THIRTYTWO_BIT_TC_MASK_RGBA,
|
2013-03-20 09:07:52 +02:00
|
|
|
pSysParent )
|
|
|
|
{
|
|
|
|
if (pParent == NULL && viewWidth > 1 && viewHeight > 1)
|
|
|
|
SetPosSize(0, 0, viewWidth, viewHeight, SAL_FRAME_POSSIZE_WIDTH | SAL_FRAME_POSSIZE_HEIGHT);
|
|
|
|
}
|
|
|
|
|
2014-04-22 14:37:13 +03:00
|
|
|
virtual void GetWorkArea( Rectangle& rRect ) SAL_OVERRIDE
|
2013-03-20 09:07:52 +02:00
|
|
|
{
|
|
|
|
IosSalInstance::getInstance()->GetWorkArea( rRect );
|
|
|
|
}
|
|
|
|
|
2014-04-22 14:37:13 +03:00
|
|
|
virtual void ShowFullScreen( bool, sal_Int32 ) SAL_OVERRIDE
|
2013-04-16 14:32:06 +02:00
|
|
|
{
|
|
|
|
SetPosSize( 0, 0, viewWidth, viewHeight,
|
|
|
|
SAL_FRAME_POSSIZE_WIDTH | SAL_FRAME_POSSIZE_HEIGHT );
|
|
|
|
}
|
|
|
|
|
2014-04-22 14:37:13 +03:00
|
|
|
virtual void UpdateSettings( AllSettings &rSettings ) SAL_OVERRIDE
|
2013-03-20 09:07:52 +02:00
|
|
|
{
|
|
|
|
// Clobber the UI fonts
|
2014-09-18 14:44:39 +02:00
|
|
|
vcl::Font aFont( OUString( "Helvetica" ), Size( 0, 14 ) );
|
2013-03-20 09:07:52 +02:00
|
|
|
|
|
|
|
StyleSettings aStyleSet = rSettings.GetStyleSettings();
|
|
|
|
aStyleSet.SetAppFont( aFont );
|
|
|
|
aStyleSet.SetHelpFont( aFont );
|
|
|
|
aStyleSet.SetMenuFont( aFont );
|
|
|
|
aStyleSet.SetToolFont( aFont );
|
|
|
|
aStyleSet.SetLabelFont( aFont );
|
|
|
|
aStyleSet.SetInfoFont( aFont );
|
|
|
|
aStyleSet.SetRadioCheckFont( aFont );
|
|
|
|
aStyleSet.SetPushButtonFont( aFont );
|
|
|
|
aStyleSet.SetFieldFont( aFont );
|
|
|
|
aStyleSet.SetIconFont( aFont );
|
|
|
|
aStyleSet.SetGroupFont( aFont );
|
|
|
|
|
|
|
|
rSettings.SetStyleSettings( aStyleSet );
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
SalFrame *IosSalInstance::CreateChildFrame( SystemParentData* pParent, sal_uLong nStyle )
|
|
|
|
{
|
|
|
|
return new IosSalFrame( this, NULL, nStyle, pParent );
|
|
|
|
}
|
|
|
|
|
|
|
|
SalFrame *IosSalInstance::CreateFrame( SalFrame* pParent, sal_uLong nStyle )
|
|
|
|
{
|
|
|
|
return new IosSalFrame( this, pParent, nStyle, NULL );
|
|
|
|
}
|
|
|
|
|
|
|
|
// All the interesting stuff is slaved from the IosSalInstance
|
|
|
|
void InitSalData() {}
|
|
|
|
void DeInitSalData() {}
|
|
|
|
void InitSalMain() {}
|
|
|
|
|
2013-03-24 00:22:15 +02:00
|
|
|
void SalAbort( const OUString& rErrorText, bool bDumpCore )
|
2013-03-20 09:07:52 +02:00
|
|
|
{
|
2013-03-24 00:22:15 +02:00
|
|
|
(void) bDumpCore;
|
|
|
|
|
|
|
|
NSLog(@"SalAbort: %s", OUStringToOString(rErrorText, osl_getThreadTextEncoding()).getStr() );
|
2013-03-20 09:07:52 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
const OUString& SalGetDesktopEnvironment()
|
|
|
|
{
|
2013-03-24 00:22:15 +02:00
|
|
|
static OUString aEnv( "iOS" );
|
2013-03-20 09:07:52 +02:00
|
|
|
return aEnv;
|
|
|
|
}
|
|
|
|
|
|
|
|
SalData::SalData() :
|
|
|
|
m_pInstance( 0 ),
|
iOS tiled rendering work
Possibly quite broken intermediate commit. But anyway, now it is
possible to render the tile diretly to a CGContext. Can be seen in
the MobileLibreOffice app when build in the Debug_tile_tester
configuration. See touch_lo_draw_tile() in viewsh.cxx. Unfortunately
the old plain LibreOffice test app is now broken, though, and
displays nothing at all.
This refactoring and hacking in vcl was done in a quite ugly fashion,
with ifdefs etc. But trust me, I did try, several times, for many
days, to get where I wanted in an elegant and clean fashion. But doing
it cleanly meant not being able to actually build it for days while
trying to figure ut which bits go where and which class should be
split into what base and derived class(es), and it was too much for my
limited brain capacity. I just couldn't juggle all the vcl class
structure in my head, especially as I don't have any good
understanding of the general design of it all.
Change-Id: Ia59d6a9cce15a63e63f94e8d8574bef21993fb1f
2013-12-09 21:53:23 +02:00
|
|
|
mpFontList( 0 ),
|
|
|
|
mxRGBSpace( CGColorSpaceCreateDeviceRGB() ),
|
|
|
|
mxGraySpace( CGColorSpaceCreateDeviceGray() )
|
2013-03-20 09:07:52 +02:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
SalData::~SalData()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
// This is our main entry point:
|
|
|
|
SalInstance *CreateSalInstance()
|
|
|
|
{
|
|
|
|
IosSalInstance* pInstance = new IosSalInstance( new SalYieldMutex() );
|
|
|
|
new IosSalData( pInstance );
|
|
|
|
pInstance->AcquireYieldMutex(1);
|
2014-04-07 12:38:27 +03:00
|
|
|
ImplGetSVData()->maWinData.mbNoSaveBackground = true;
|
2013-03-20 09:07:52 +02:00
|
|
|
return pInstance;
|
|
|
|
}
|
|
|
|
|
|
|
|
void DestroySalInstance( SalInstance *pInst )
|
|
|
|
{
|
|
|
|
pInst->ReleaseYieldMutex();
|
|
|
|
delete pInst;
|
|
|
|
}
|
|
|
|
|
2013-04-07 12:06:47 +02:00
|
|
|
int IosSalSystem::ShowNativeDialog( const OUString& rTitle,
|
|
|
|
const OUString& rMessage,
|
|
|
|
const std::list< OUString >& rButtons,
|
2013-03-20 09:07:52 +02:00
|
|
|
int nDefButton )
|
|
|
|
{
|
|
|
|
(void)rButtons;
|
|
|
|
(void)nDefButton;
|
|
|
|
|
2014-01-26 12:03:53 +02:00
|
|
|
NSLog(@"%@: %@", CreateNSString(rTitle), CreateNSString(rMessage));
|
|
|
|
|
2013-03-20 09:07:52 +02:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2013-04-16 01:46:04 +03:00
|
|
|
IMPL_LINK( IosSalInstance, DisplayConfigurationChanged, void*, )
|
|
|
|
{
|
|
|
|
for( std::list< SalFrame* >::const_iterator it = getFrames().begin();
|
|
|
|
it != getFrames().end();
|
2014-04-20 22:54:18 +02:00
|
|
|
++it ) {
|
2014-02-24 01:53:13 +11:00
|
|
|
(*it)->Show( false, false );
|
2013-04-16 01:46:04 +03:00
|
|
|
(*it)->CallCallback( SALEVENT_SETTINGSCHANGED, 0 );
|
2013-04-16 14:32:06 +02:00
|
|
|
(*it)->SetPosSize(0, 0, viewWidth, viewHeight, SAL_FRAME_POSSIZE_WIDTH | SAL_FRAME_POSSIZE_HEIGHT);
|
2014-02-24 01:53:13 +11:00
|
|
|
(*it)->Show( true, false );
|
2013-04-16 01:46:04 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2013-03-25 19:52:30 +02:00
|
|
|
extern "C"
|
2013-10-13 20:45:16 +03:00
|
|
|
void touch_lo_set_view_size(int width, int height)
|
2013-03-25 19:52:30 +02:00
|
|
|
{
|
2013-04-16 01:46:04 +03:00
|
|
|
int oldWidth = viewWidth;
|
|
|
|
|
2013-03-25 19:52:30 +02:00
|
|
|
viewWidth = width;
|
|
|
|
viewHeight = height;
|
2013-04-16 01:46:04 +03:00
|
|
|
|
|
|
|
if (oldWidth > 1) {
|
|
|
|
// Inform about change in display size (well, just orientation
|
|
|
|
// presumably).
|
|
|
|
IosSalInstance *pInstance = IosSalInstance::getInstance();
|
|
|
|
|
|
|
|
if ( pInstance == NULL )
|
|
|
|
return;
|
|
|
|
|
|
|
|
Application::PostUserEvent( LINK( pInstance, IosSalInstance, DisplayConfigurationChanged ), NULL );
|
|
|
|
}
|
2013-03-25 19:52:30 +02:00
|
|
|
}
|
|
|
|
|
2013-10-23 18:35:40 +02:00
|
|
|
extern "C"
|
|
|
|
void
|
|
|
|
touch_lo_copy_buffer(const void * source, size_t sourceWidth, size_t sourceHeight, size_t sourceBytesPerRow, void * target, size_t targetWidth, size_t targetHeight){
|
|
|
|
|
|
|
|
CGDataProviderRef provider =CGDataProviderCreateWithData(NULL,
|
|
|
|
source,
|
|
|
|
sourceHeight * sourceBytesPerRow,
|
|
|
|
NULL );
|
|
|
|
CGImage *sourceImage = CGImageCreate(sourceWidth,
|
|
|
|
sourceHeight,
|
|
|
|
8,
|
|
|
|
32,
|
|
|
|
sourceBytesPerRow,
|
|
|
|
CGColorSpaceCreateDeviceRGB(),
|
2013-12-11 18:11:22 +02:00
|
|
|
kCGImageAlphaNoneSkipLast,
|
2013-10-23 18:35:40 +02:00
|
|
|
provider,
|
|
|
|
NULL,
|
|
|
|
false,
|
|
|
|
kCGRenderingIntentDefault );
|
|
|
|
CGContextRef context =(CGContextRef) target;
|
|
|
|
CGRect targetRect = CGRectMake( 0, 0, targetWidth, targetHeight );
|
|
|
|
CGContextDrawImage( context, targetRect, sourceImage );
|
|
|
|
CGImageRelease(sourceImage);
|
2013-11-04 16:08:39 +02:00
|
|
|
CGDataProviderRelease(provider);
|
2013-10-23 18:35:40 +02:00
|
|
|
}
|
|
|
|
|
2013-03-28 19:59:37 +02:00
|
|
|
extern "C"
|
2013-10-13 20:45:16 +03:00
|
|
|
void touch_lo_tap(int x, int y)
|
2013-03-28 19:59:37 +02:00
|
|
|
{
|
2013-10-18 18:45:13 +03:00
|
|
|
touch_lo_mouse(x, y, DOWN, NONE);
|
|
|
|
touch_lo_mouse(x, y, UP, NONE);
|
2013-03-28 19:59:37 +02:00
|
|
|
}
|
|
|
|
|
2013-09-11 16:25:04 +03:00
|
|
|
extern "C"
|
2013-10-18 18:45:13 +03:00
|
|
|
void touch_lo_mouse(int x, int y, MLOMouseButtonState state, MLOModifierMask modifiers)
|
2013-09-11 16:25:04 +03:00
|
|
|
{
|
|
|
|
SalFrame *pFocus = IosSalInstance::getInstance()->getFocusFrame();
|
|
|
|
|
|
|
|
if (pFocus) {
|
|
|
|
MouseEvent aEvent;
|
|
|
|
sal_uLong nEvent;
|
2013-10-18 18:45:13 +03:00
|
|
|
sal_uInt16 nModifiers = 0;
|
|
|
|
|
|
|
|
if (modifiers & SHIFT)
|
|
|
|
nModifiers |= KEY_SHIFT;
|
|
|
|
|
|
|
|
if (modifiers & META)
|
|
|
|
nModifiers |= KEY_MOD1;
|
2013-09-11 16:25:04 +03:00
|
|
|
|
2013-10-18 18:45:13 +03:00
|
|
|
switch (state) {
|
2013-09-11 16:25:04 +03:00
|
|
|
case DOWN:
|
2014-11-08 00:51:21 +02:00
|
|
|
aEvent = MouseEvent(Point(x, y), 1, MouseEventModifiers::SIMPLECLICK, MOUSE_LEFT, nModifiers);
|
2013-09-11 16:25:04 +03:00
|
|
|
nEvent = VCLEVENT_WINDOW_MOUSEBUTTONDOWN;
|
|
|
|
break;
|
|
|
|
case MOVE:
|
2014-11-08 00:51:21 +02:00
|
|
|
aEvent = MouseEvent(Point(x, y), 1, MouseEventModifiers::SIMPLEMOVE, MOUSE_LEFT, nModifiers);
|
2013-09-11 16:25:04 +03:00
|
|
|
nEvent = VCLEVENT_WINDOW_MOUSEMOVE;
|
|
|
|
break;
|
|
|
|
case UP:
|
2014-11-08 00:51:21 +02:00
|
|
|
aEvent = MouseEvent(Point(x, y), 1, MouseEventModifiers::SIMPLECLICK, MOUSE_LEFT, nModifiers);
|
2013-09-11 16:25:04 +03:00
|
|
|
nEvent = VCLEVENT_WINDOW_MOUSEBUTTONUP;
|
|
|
|
break;
|
2013-10-18 18:45:13 +03:00
|
|
|
default:
|
|
|
|
assert(false);
|
2013-09-11 16:25:04 +03:00
|
|
|
}
|
|
|
|
Application::PostMouseEvent(nEvent, pFocus->GetWindow(), &aEvent);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-10-18 18:45:13 +03:00
|
|
|
extern "C"
|
|
|
|
void touch_lo_mouse_drag(int x, int y, MLOMouseButtonState state)
|
|
|
|
{
|
|
|
|
touch_lo_mouse(x, y, state, NONE);
|
|
|
|
}
|
|
|
|
|
2013-04-18 22:29:50 +03:00
|
|
|
extern "C"
|
2013-10-13 20:45:16 +03:00
|
|
|
void touch_lo_pan(int deltaX, int deltaY)
|
2013-04-18 22:29:50 +03:00
|
|
|
{
|
|
|
|
SalFrame *pFocus = IosSalInstance::getInstance()->getFocusFrame();
|
|
|
|
if (pFocus) {
|
2013-09-01 19:22:23 +03:00
|
|
|
SAL_INFO( "vcl.ios", "pan delta: " << "(" << deltaX << "," << deltaY << ") ");
|
|
|
|
ScrollEvent aEvent( deltaX, deltaY );
|
2013-04-18 22:29:50 +03:00
|
|
|
Application::PostScrollEvent(VCLEVENT_WINDOW_SCROLL, pFocus->GetWindow(), &aEvent);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-09-01 19:22:23 +03:00
|
|
|
extern "C"
|
2013-10-13 20:45:16 +03:00
|
|
|
void touch_lo_zoom(int x, int y, float scale)
|
2013-09-01 19:22:23 +03:00
|
|
|
{
|
|
|
|
SalFrame *pFocus = IosSalInstance::getInstance()->getFocusFrame();
|
|
|
|
if (pFocus) {
|
|
|
|
SAL_INFO( "vcl.ios", "pinch: " << "(" << scale << ") ");
|
|
|
|
ZoomEvent aEvent( Point(x,y), scale);
|
|
|
|
Application::PostZoomEvent(VCLEVENT_WINDOW_ZOOM, pFocus->GetWindow(), &aEvent);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-04-14 01:40:46 +03:00
|
|
|
extern "C"
|
2013-10-13 20:45:16 +03:00
|
|
|
void touch_lo_keyboard_input(int c)
|
2013-04-14 01:40:46 +03:00
|
|
|
{
|
|
|
|
SalFrame *pFocus = IosSalInstance::getInstance()->getFocusFrame();
|
|
|
|
if (pFocus) {
|
|
|
|
KeyEvent aEvent(c, c, 0);
|
|
|
|
Application::PostKeyEvent(VCLEVENT_WINDOW_KEYINPUT, pFocus->GetWindow(), &aEvent);
|
|
|
|
Application::PostKeyEvent(VCLEVENT_WINDOW_KEYUP, pFocus->GetWindow(), &aEvent);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-04-13 13:04:50 +03:00
|
|
|
extern "C"
|
2013-10-13 20:45:16 +03:00
|
|
|
void touch_lo_keyboard_did_hide()
|
2013-04-13 13:04:50 +03:00
|
|
|
{
|
|
|
|
// Tell LO it has lost "focus", which will cause it to stop
|
|
|
|
// displaying any text insertion cursor etc
|
|
|
|
|
|
|
|
SalFrame *pFocus = IosSalInstance::getInstance()->getFocusFrame();
|
|
|
|
if (pFocus) {
|
|
|
|
MouseEvent aEvent;
|
|
|
|
|
2014-11-08 00:51:21 +02:00
|
|
|
aEvent = MouseEvent(Point(0, 0), 0, MouseEventModifiers::LEAVEWINDOW, MOUSE_LEFT);
|
2013-04-13 13:04:50 +03:00
|
|
|
Application::PostMouseEvent(VCLEVENT_WINDOW_MOUSEMOVE, pFocus->GetWindow(), &aEvent);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-10-22 23:30:26 +03:00
|
|
|
IMPL_LINK( IosSalInstance, SelectionStartMove, SelectionStartMoveArg*, pArg )
|
|
|
|
{
|
|
|
|
touch_lo_selection_start_move_impl(pArg->documentHandle, pArg->x, pArg->y);
|
|
|
|
|
|
|
|
delete pArg;
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
extern "C"
|
|
|
|
void touch_lo_selection_start_move(const void *documentHandle,
|
|
|
|
int x,
|
|
|
|
int y)
|
|
|
|
{
|
|
|
|
IosSalInstance *pInstance = IosSalInstance::getInstance();
|
|
|
|
|
|
|
|
if ( pInstance == NULL )
|
|
|
|
return;
|
|
|
|
|
|
|
|
IosSalInstance::SelectionStartMoveArg *pArg = new IosSalInstance::SelectionStartMoveArg;
|
|
|
|
pArg->documentHandle = documentHandle;
|
|
|
|
pArg->x = x;
|
|
|
|
pArg->y = y;
|
|
|
|
Application::PostUserEvent( LINK( pInstance, IosSalInstance, SelectionStartMove), pArg );
|
|
|
|
}
|
|
|
|
|
2013-10-22 01:06:56 +03:00
|
|
|
IMPL_LINK( IosSalInstance, SelectionEndMove, SelectionEndMoveArg*, pArg )
|
|
|
|
{
|
|
|
|
touch_lo_selection_end_move_impl(pArg->documentHandle, pArg->x, pArg->y);
|
|
|
|
|
|
|
|
delete pArg;
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
extern "C"
|
|
|
|
void touch_lo_selection_end_move(const void *documentHandle,
|
|
|
|
int x,
|
|
|
|
int y)
|
|
|
|
{
|
|
|
|
IosSalInstance *pInstance = IosSalInstance::getInstance();
|
|
|
|
|
|
|
|
if ( pInstance == NULL )
|
|
|
|
return;
|
|
|
|
|
|
|
|
IosSalInstance::SelectionEndMoveArg *pArg = new IosSalInstance::SelectionEndMoveArg;
|
|
|
|
pArg->documentHandle = documentHandle;
|
|
|
|
pArg->x = x;
|
|
|
|
pArg->y = y;
|
|
|
|
Application::PostUserEvent( LINK( pInstance, IosSalInstance, SelectionEndMove), pArg );
|
|
|
|
}
|
|
|
|
|
2013-03-20 09:07:52 +02:00
|
|
|
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|