desktop/Library_sofficeapp.mk | 6 desktop/source/lib/init.cxx | 34 ----- solenv/bin/native-code.py | 2 vcl/Library_vcl.mk | 1 vcl/ios/clipboard.cxx | 257 ------------------------------------------ vcl/ios/clipboard.hxx | 122 ------------------- 6 files changed, 4 insertions(+), 418 deletions(-)
New commits: commit 9ae61fb6bbe5957825981aaf6d72d5dad1422e72 Author: Skyler Grey <[email protected]> AuthorDate: Tue Nov 12 13:21:08 2024 +0000 Commit: Skyler Grey <[email protected]> CommitDate: Wed Nov 20 11:34:46 2024 +0100 chore(iOS): Cleanup old iOS pasteboard code Since as we're switching to handling the clipboard the same in iOS as everywhere else, this old pasteboard code is no longer needed Change-Id: I49671a0bdbd1e1699253c9e710366c1a860ca38d Reviewed-on: https://gerrit.libreoffice.org/c/core/+/176543 Tested-by: Jenkins CollaboraOffice <[email protected]> Reviewed-by: Miklos Vajna <[email protected]> (cherry picked from commit b7c5fbadab3f912b792abc61dac2c879d6b4a969) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/176830 Reviewed-by: Skyler Grey <[email protected]> Tested-by: Skyler Grey <[email protected]> diff --git a/vcl/Library_vcl.mk b/vcl/Library_vcl.mk index fb9687dc47c0..94ad885e5f65 100644 --- a/vcl/Library_vcl.mk +++ b/vcl/Library_vcl.mk @@ -681,7 +681,6 @@ $(eval $(call gb_Library_add_objcxxobjects,vcl,\ $(eval $(call gb_Library_add_exception_objects,vcl,\ vcl/ios/iosinst \ vcl/ios/dummies \ - vcl/ios/clipboard \ vcl/ios/salios \ vcl/ios/iOSTransferable \ vcl/ios/DataFlavorMapping \ diff --git a/vcl/ios/clipboard.cxx b/vcl/ios/clipboard.cxx deleted file mode 100644 index 109f744e87c8..000000000000 --- a/vcl/ios/clipboard.cxx +++ /dev/null @@ -1,257 +0,0 @@ -/* -*- Mode: ObjC; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */ -/* - * 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 "ios/iosinst.hxx" -#include "quartz/utils.h" - -#include "clipboard.hxx" - -#include "DataFlavorMapping.hxx" -#include "iOSTransferable.hxx" -#include <com/sun/star/datatransfer/MimeContentTypeFactory.hpp> -#include <com/sun/star/lang/IllegalArgumentException.hpp> -#include <comphelper/processfactory.hxx> -#include <cppuhelper/supportsservice.hxx> - -@implementation PasteboardChangedEventListener - -- (PasteboardChangedEventListener*)initWithiOSClipboard:(iOSClipboard*)pcb -{ - self = [super init]; - - if (self) - { - // Just to be safe, set clipboard to a nullptr to ignore any - // synchronous callbacks that might occur when adding the observer - piOSClipboard = nullptr; - - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(pasteboardChanged:) - name:UIPasteboardChangedNotification - object:[UIPasteboard generalPasteboard]]; - - // According to following, no UIPasteboardChangedNotification - // notifications are received when an app is not active. So, post the - // notification so that the LibreOffice vcl/ios code can handle any - // clipboard changes: - // https://stackoverflow.com/questions/4240087/receiving-uipasteboard-generalpasteboard-notification-while-in-the-background - // Note: UIApplicationDidBecomeActiveNotification is never sent when - // running in Mac Catalyst so listen for UISceneDidActivateNotification - // instead. - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(pasteboardChanged:) - name:UISceneDidActivateNotification - object:nil]; - - piOSClipboard = pcb; - } - - return self; -} - -- (void)pasteboardChanged:(NSNotification*)aNotification -{ - if (piOSClipboard) - piOSClipboard->contentsChanged(); -} - -- (void)disposing -{ - piOSClipboard = nullptr; - [[NSNotificationCenter defaultCenter] removeObserver:self]; -} - -@end - -iOSClipboard::iOSClipboard() - : WeakComponentImplHelper<XSystemClipboard, XServiceInfo>(m_aMutex) -{ - auto xContext = comphelper::getProcessComponentContext(); - - mrXMimeCntFactory = css::datatransfer::MimeContentTypeFactory::create(xContext); - - mpDataFlavorMapper.reset(new DataFlavorMapper()); - - mnPasteboardChangeCount = 0; - mpPasteboardChangedEventListener = - [[PasteboardChangedEventListener alloc] initWithiOSClipboard:this]; -} - -iOSClipboard::~iOSClipboard() -{ - [mpPasteboardChangedEventListener disposing]; - [mpPasteboardChangedEventListener release]; -} - -css::uno::Reference<css::datatransfer::XTransferable> SAL_CALL iOSClipboard::getContents() -{ - osl::MutexGuard aGuard(m_aMutex); - - return css::uno::Reference<css::datatransfer::XTransferable>( - new iOSTransferable(mrXMimeCntFactory, mpDataFlavorMapper)); -} - -void SAL_CALL iOSClipboard::setContents( - const css::uno::Reference<css::datatransfer::XTransferable>& xTransferable, - const css::uno::Reference<css::datatransfer::clipboard::XClipboardOwner>& /*xClipboardOwner*/) -{ - NSArray* types = xTransferable.is() ? mpDataFlavorMapper->flavorSequenceToTypesArray( - xTransferable->getTransferDataFlavors()) - : [NSArray array]; - - osl::ClearableMutexGuard aGuard(m_aMutex); - - NSMutableDictionary* dict = [NSMutableDictionary dictionaryWithCapacity:1]; - NSArray* array = @[ dict ]; - - for (sal_uInt32 i = 0; i < [types count]; ++i) - { - DataProviderPtr_t dp = mpDataFlavorMapper->getDataProvider(types[i], xTransferable); - - if (dp.get() != nullptr) - { - NSData* pBoardData = (NSData*)dp->getSystemData(); - dict[types[i]] = pBoardData; - } - } - SAL_INFO("vcl.ios.clipboard", "Setting pasteboard items: " << NSDictionaryKeysToOUString(dict)); - [[UIPasteboard generalPasteboard] setItems:array options:@{}]; - - // We don't keep a copy of the clipboard contents around in-process, so fire the lost clipboard - // ownership event right away. - // fireLostClipboardOwnershipEvent(xClipboardOwner, xTransferable); - - // fireClipboardChangedEvent(xTransferable); -} - -OUString SAL_CALL iOSClipboard::getName() { return OUString(); } - -sal_Int8 SAL_CALL iOSClipboard::getRenderingCapabilities() { return 0; } - -void SAL_CALL iOSClipboard::addClipboardListener( - const css::uno::Reference<css::datatransfer::clipboard::XClipboardListener>& listener) -{ - osl::MutexGuard aGuard(m_aMutex); - - if (!listener.is()) - throw css::lang::IllegalArgumentException( - "empty reference", static_cast<css::datatransfer::clipboard::XClipboardEx*>(this), 1); - - mClipboardListeners.push_back(listener); -} - -void SAL_CALL iOSClipboard::removeClipboardListener( - const css::uno::Reference<css::datatransfer::clipboard::XClipboardListener>& listener) -{ - osl::MutexGuard aGuard(m_aMutex); - - if (!listener.is()) - throw css::lang::IllegalArgumentException( - "empty reference", static_cast<css::datatransfer::clipboard::XClipboardEx*>(this), 1); - - mClipboardListeners.remove(listener); -} - -void iOSClipboard::fireClipboardChangedEvent( - css::uno::Reference<css::datatransfer::XTransferable> xNewContents) -{ - osl::ClearableMutexGuard aGuard(m_aMutex); - - std::list<css::uno::Reference<css::datatransfer::clipboard::XClipboardListener>> listeners( - mClipboardListeners); - css::datatransfer::clipboard::ClipboardEvent aEvent; - - if (!listeners.empty()) - { - aEvent = css::datatransfer::clipboard::ClipboardEvent(getXWeak(), xNewContents); - } - - aGuard.clear(); - - while (!listeners.empty()) - { - if (listeners.front().is()) - { - try - { - listeners.front()->changedContents(aEvent); - } - catch (const css::uno::RuntimeException&) - { - } - } - listeners.pop_front(); - } -} - -void iOSClipboard::fireLostClipboardOwnershipEvent( - css::uno::Reference<css::datatransfer::clipboard::XClipboardOwner> const& oldOwner, - css::uno::Reference<css::datatransfer::XTransferable> const& oldContent) -{ - assert(oldOwner.is()); - - try - { - oldOwner->lostOwnership(static_cast<css::datatransfer::clipboard::XClipboardEx*>(this), - oldContent); - } - catch (const css::uno::RuntimeException&) - { - } -} - -OUString SAL_CALL iOSClipboard::getImplementationName() -{ - return OUString("com.sun.star.datatransfer.clipboard.iOSClipboard"); -} - -sal_Bool SAL_CALL iOSClipboard::supportsService(const OUString& ServiceName) -{ - return cppu::supportsService(this, ServiceName); -} - -css::uno::Sequence<OUString> SAL_CALL iOSClipboard::getSupportedServiceNames() -{ - return { OUString("com.sun.star.datatransfer.clipboard.SystemClipboard") }; -} - -void iOSClipboard::contentsChanged() -{ - NSInteger nPasteboardChangeCount = [[UIPasteboard generalPasteboard] changeCount]; - if (mnPasteboardChangeCount != nPasteboardChangeCount) - { - // cool#5839 fire a clipboard changed event in the iOS app - // A clipboard changed event needs to be fired whenever the - // native general pasteboard changes. Otherwise, if the clipboard - // is empty when a document is opened, the Paste and Paste Special - // menu items and toolbar buttons will be disabled and will never - // be enabled even after something has been copied to the general - // pasteboard. - mnPasteboardChangeCount = nPasteboardChangeCount; - fireClipboardChangedEvent(getContents()); - } -} - -css::uno::Reference<css::uno::XInterface> -IosSalInstance::CreateClipboard(const css::uno::Sequence<css::uno::Any>&) -{ - return getXWeak(new iOSClipboard()); -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/ios/clipboard.hxx b/vcl/ios/clipboard.hxx deleted file mode 100644 index e1133f0ba0bf..000000000000 --- a/vcl/ios/clipboard.hxx +++ /dev/null @@ -1,122 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */ -/* - * 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 . - */ - -#pragma once - -#include "DataFlavorMapping.hxx" -#include <rtl/ustring.hxx> -#include <sal/types.h> -#include <cppuhelper/compbase.hxx> -#include <com/sun/star/datatransfer/XTransferable.hpp> -#include <com/sun/star/datatransfer/clipboard/XClipboardEx.hpp> -#include <com/sun/star/datatransfer/clipboard/XClipboardOwner.hpp> -#include <com/sun/star/datatransfer/clipboard/XClipboardListener.hpp> -#include <com/sun/star/datatransfer/clipboard/XClipboardNotifier.hpp> -#include <com/sun/star/datatransfer/clipboard/XSystemClipboard.hpp> -#include <com/sun/star/datatransfer/XMimeContentTypeFactory.hpp> -#include <com/sun/star/datatransfer/clipboard/XFlushableClipboard.hpp> -#include <com/sun/star/lang/XServiceInfo.hpp> -#include <cppuhelper/basemutex.hxx> -#include <com/sun/star/lang/XMultiComponentFactory.hpp> - -#include <list> - -#include <premac.h> -#import <UIKit/UIKit.h> -#include <postmac.h> - -class iOSClipboard; - -@interface PasteboardChangedEventListener : NSObject -{ - iOSClipboard* piOSClipboard; -} -- (PasteboardChangedEventListener*)initWithiOSClipboard:(iOSClipboard*)pcb; -- (void)pasteboardChanged:(NSNotification*)aNotification; -- (void)disposing; -@end - -class iOSClipboard - : public ::cppu::BaseMutex, - public ::cppu::WeakComponentImplHelper<css::datatransfer::clipboard::XSystemClipboard, - css::lang::XServiceInfo> -{ -public: - iOSClipboard(); - - virtual ~iOSClipboard() override; - iOSClipboard(const iOSClipboard&) = delete; - iOSClipboard& operator=(const iOSClipboard&) = delete; - - // XClipboard - - css::uno::Reference<css::datatransfer::XTransferable> SAL_CALL getContents() override; - - void SAL_CALL setContents( - const css::uno::Reference<css::datatransfer::XTransferable>& xTransferable, - const css::uno::Reference<css::datatransfer::clipboard::XClipboardOwner>& xClipboardOwner) - override; - - OUString SAL_CALL getName() override; - - // XClipboardEx - - sal_Int8 SAL_CALL getRenderingCapabilities() override; - - // XClipboardNotifier - - void SAL_CALL addClipboardListener( - const css::uno::Reference<css::datatransfer::clipboard::XClipboardListener>& listener) - override; - - void SAL_CALL removeClipboardListener( - const css::uno::Reference<css::datatransfer::clipboard::XClipboardListener>& listener) - override; - - // XServiceInfo - - OUString SAL_CALL getImplementationName() override; - - sal_Bool SAL_CALL supportsService(const OUString& ServiceName) override; - - css::uno::Sequence<OUString> SAL_CALL getSupportedServiceNames() override; - - void contentsChanged(); - -private: - /* Notify the current clipboard owner that he is no longer the clipboard owner. */ - void fireLostClipboardOwnershipEvent( - css::uno::Reference<css::datatransfer::clipboard::XClipboardOwner> const& oldOwner, - css::uno::Reference<css::datatransfer::XTransferable> const& oldContent); - - /* Notify all registered XClipboardListener that the clipboard content has changed. */ - void - fireClipboardChangedEvent(css::uno::Reference<css::datatransfer::XTransferable> xNewContents); - -private: - css::uno::Reference<css::datatransfer::XMimeContentTypeFactory> mrXMimeCntFactory; - std::list<css::uno::Reference<css::datatransfer::clipboard::XClipboardListener>> - mClipboardListeners; - css::uno::Reference<css::datatransfer::clipboard::XClipboardOwner> mXClipboardOwner; - std::shared_ptr<DataFlavorMapper> mpDataFlavorMapper; - NSInteger mnPasteboardChangeCount; - PasteboardChangedEventListener* mpPasteboardChangedEventListener; -}; - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ commit 75c09e0b4a5a10fffbd8cb0677e2c786febe20a2 Author: Skyler Grey <[email protected]> AuthorDate: Fri Nov 8 17:53:47 2024 +0000 Commit: Skyler Grey <[email protected]> CommitDate: Wed Nov 20 11:34:43 2024 +0100 feat(iOS): Allow use of desktop clipboard code Historically, iOS has used pasteboard code instead of the normal clipboard code, forming a different clipboard flow for the Collabora Online app for iOS. This is "not ideal" for consistency in clipboard behavior between iOS and other platforms, so we're switching iOS to use the same clipboard APIs as everywhere else. This means that we need this desktop clipboard code to be compiled into iOS. Change-Id: I42567ad64641913817a26d1494858393501b6503 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/176542 Tested-by: Jenkins CollaboraOffice <[email protected]> Reviewed-by: Miklos Vajna <[email protected]> (cherry picked from commit 5f095a3e7d7e364e5112eccf150e9636214b8e40) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/176829 Reviewed-by: Skyler Grey <[email protected]> Tested-by: Skyler Grey <[email protected]> diff --git a/desktop/Library_sofficeapp.mk b/desktop/Library_sofficeapp.mk index 641efda7eda2..ab79f98d539a 100644 --- a/desktop/Library_sofficeapp.mk +++ b/desktop/Library_sofficeapp.mk @@ -132,13 +132,11 @@ ifneq ($(filter $(OS),ANDROID iOS MACOSX WNT),) $(eval $(call gb_Library_add_exception_objects,sofficeapp,\ desktop/source/lib/init \ desktop/source/lib/lokinteractionhandler \ - $(if $(filter-out $(OS),iOS), \ - desktop/source/lib/lokclipboard) \ + desktop/source/lib/lokclipboard \ $(if $(filter $(OS),ANDROID), \ desktop/source/lib/lokandroid) \ )) -$(if $(filter-out $(OS),IOS), \ - $(eval $(call gb_Library_set_componentfile,sofficeapp,desktop/lokclipboard,services))) +$(eval $(call gb_Library_set_componentfile,sofficeapp,desktop/lokclipboard,services)) else ifneq ($(filter TRUE,$(USING_X11) $(DISABLE_GUI))($filter EMSCRIPTEN,$(OS)),) $(eval $(call gb_Library_add_exception_objects,sofficeapp,\ diff --git a/desktop/source/lib/init.cxx b/desktop/source/lib/init.cxx index 39c6ab4002ff..d855ee9f2ed3 100644 --- a/desktop/source/lib/init.cxx +++ b/desktop/source/lib/init.cxx @@ -1356,8 +1356,6 @@ ITiledRenderable* getTiledRenderable(LibreOfficeKitDocument* pThis) return dynamic_cast<ITiledRenderable*>(pDocument->mxComponent.get()); } -#ifndef IOS - /* * Unfortunately clipboard creation using UNO is insanely baroque. * we also need to ensure that this works for the first view which @@ -1375,8 +1373,6 @@ rtl::Reference<LOKClipboard> forceSetClipboardForCurrentView(LibreOfficeKitDocum return xClip; } -#endif - const vcl::Font* FindFont(std::u16string_view rFontName) { SfxObjectShell* pDocSh = SfxObjectShell::Current(); @@ -1553,9 +1549,7 @@ LibLODocument_Impl::LibLODocument_Impl(uno::Reference <css::lang::XComponent> xC } pClass = m_pDocumentClass.get(); -#ifndef IOS forceSetClipboardForCurrentView(this); -#endif } LibLODocument_Impl::~LibLODocument_Impl() @@ -2333,12 +2327,10 @@ bool CallbackFlushHandler::processWindowEvent(int type, CallbackData& aCallbackD return false; } -#ifndef IOS auto xClip = forceSetClipboardForCurrentView(m_pDocument); uno::Reference<datatransfer::clipboard::XClipboard> xClipboard(xClip); pWindow->SetClipboard(xClipboard); -#endif } else if (aAction == "size_changed") { @@ -6076,18 +6068,6 @@ static int doc_getClipboard(LibreOfficeKitDocument* pThis, size_t **pOutSizes, char ***pOutStreams) { -#ifdef IOS - (void) pThis; - (void) pMimeTypes; - (void) pOutCount; - (void) pOutMimeTypes; - (void) pOutSizes; - (void) pOutStreams; - - assert(!"doc_getClipboard should not be called on iOS"); - - return 0; -#else comphelper::ProfileZone aZone("doc_getClipboard"); SolarMutexGuard aGuard; @@ -6164,7 +6144,6 @@ static int doc_getClipboard(LibreOfficeKitDocument* pThis, } return 1; -#endif } static int doc_setClipboard(LibreOfficeKitDocument* pThis, @@ -6173,13 +6152,6 @@ static int doc_setClipboard(LibreOfficeKitDocument* pThis, const size_t *pInSizes, const char **pInStreams) { -#ifdef IOS - (void) pThis; - (void) nInCount; - (void) pInMimeTypes; - (void) pInSizes; - (void) pInStreams; -#else comphelper::ProfileZone aZone("doc_setClipboard"); SolarMutexGuard aGuard; @@ -6204,7 +6176,7 @@ static int doc_setClipboard(LibreOfficeKitDocument* pThis, SetLastExceptionMsg(u"Document doesn't support this mime type"_ustr); return false; } -#endif + return true; } @@ -6957,11 +6929,7 @@ static int doc_createViewWithOptions(LibreOfficeKitDocument* pThis, vcl::lok::numberOfViewsChanged(SfxLokHelper::getViewsCount(pDocument->mnDocumentId)); -#ifdef IOS - (void) pThis; -#else forceSetClipboardForCurrentView(pThis); -#endif return nId; } diff --git a/solenv/bin/native-code.py b/solenv/bin/native-code.py index 955317ebc0ca..32573fa400fd 100755 --- a/solenv/bin/native-code.py +++ b/solenv/bin/native-code.py @@ -127,7 +127,7 @@ core_constructor_list = [ "com_sun_star_comp_dba_ODatabaseSource", "com_sun_star_comp_dba_ORowSet_get_implementation", # desktop/lokclipboard.component - ("desktop_LOKClipboard_get_implementation", "#ifndef IOS"), + "desktop_LOKClipboard_get_implementation", # drawinglayer/drawinglayer.component "drawinglayer_XPrimitive2DRenderer", # embeddedobj/util/embobj.component
