Create a virtual QgsNative base class for platform services

A QgsNative base class is added, that offers default implementations for
a platform interface. These methods can be overridded for the current
platform at compile time to allow specialized handling for integration
with the current system.
This commit is contained in:
Matthias Kuhn 2017-01-07 23:44:57 +01:00 committed by Nyall Dawson
parent f6bd7b3b58
commit d1593caed7
15 changed files with 124 additions and 139 deletions

View File

@ -748,11 +748,6 @@ ADD_CUSTOM_TARGET(version ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/qgsversion.h)
#TEST_DATA_DIR is also used by QgsRenderChecker currently in core
SET (TEST_DATA_DIR "${CMAKE_CURRENT_SOURCE_DIR}/tests/testdata")
SET(USE_NATIVE_LIB FALSE)
IF(APPLE)
SET(USE_NATIVE_LIB TRUE)
ENDIF(APPLE)
ADD_SUBDIRECTORY(src)
ADD_SUBDIRECTORY(doc)
ADD_SUBDIRECTORY(images)

View File

@ -1,6 +1,4 @@
IF(USE_NATIVE_LIB)
ADD_SUBDIRECTORY(native)
ENDIF(USE_NATIVE_LIB)
ADD_SUBDIRECTORY(native)
ADD_SUBDIRECTORY(core)
ADD_SUBDIRECTORY(analysis)

View File

@ -519,6 +519,8 @@ INCLUDE_DIRECTORIES(
openstreetmap
dwg
dwg/libdxfrw
${CMAKE_SOURCE_DIR}/src/native
${CMAKE_BINARY_DIR}/src/native
)
INCLUDE_DIRECTORIES(SYSTEM
${SPATIALITE_INCLUDE_DIR}
@ -535,16 +537,14 @@ IF(ENABLE_MODELTEST)
INCLUDE_DIRECTORIES(../../tests/qt_modeltest)
ENDIF(ENABLE_MODELTEST)
IF (USE_NATIVE_LIB)
IF(APPLE)
INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/src/native/mac)
ENDIF(APPLE)
ENDIF(USE_NATIVE_LIB)
IF (ANDROID)
INCLUDE_DIRECTORIES(SYSTEM ${ANDROID_NDK_TOOLCHAIN_ROOT}/sysroot/usr/include)
ENDIF (ANDROID)
IF (APPLE)
INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/src/native/mac)
ENDIF (APPLE)
IF (POSTGRES_FOUND)
INCLUDE_DIRECTORIES(SYSTEM ${POSTGRES_INCLUDE_DIR})
ENDIF (POSTGRES_FOUND)
@ -572,6 +572,7 @@ TARGET_LINK_LIBRARIES(qgis_app
qgis_core
qgis_gui
qgis_analysis
qgis_native
libdxfrw
)
@ -592,9 +593,6 @@ IF (APPLE)
TARGET_LINK_LIBRARIES(qgis_app ${APP_SERVICES_LIBRARY})
ENDIF(APPLE)
IF(USE_NATIVE_LIB)
TARGET_LINK_LIBRARIES(qgis_app qgis_native)
ENDIF(USE_NATIVE_LIB)
if(MSVC AND CMAKE_SIZEOF_VOID_P EQUAL 8)
SET_TARGET_PROPERTIES(qgis_app PROPERTIES STATIC_LIBRARY_FLAGS "/machine:x64")
@ -615,9 +613,7 @@ IF(WIN32)
TARGET_LINK_LIBRARIES(qgis_app DbgHelp Qt5::WinExtras)
ENDIF(WIN32)
IF(USE_NATIVE_LIB)
TARGET_LINK_LIBRARIES(${QGIS_APP_NAME} qgis_native)
ENDIF(USE_NATIVE_LIB)
TARGET_LINK_LIBRARIES(${QGIS_APP_NAME} qgis_native)
IF (APPLE)
SET_TARGET_PROPERTIES(${QGIS_APP_NAME} PROPERTIES

View File

@ -100,12 +100,7 @@ Q_GUI_EXPORT extern int qt_defaultDpiX();
//
#ifdef Q_OS_MACX
#include <ApplicationServices/ApplicationServices.h>
// Virtual interfaces to Cocoa objective-c frameworks/classes/calls
// cocoainitializer is to handle objective-c garbage collection
// see: http://el-tramo.be/blog/mixing-cocoa-and-qt/
//#include "cocoainitializer.h"
#include "qgsmacappkit.h"
#include "qgsmacnative.h"
// check macro breaks QItemDelegate
#ifdef check
@ -1205,6 +1200,12 @@ QgisApp::QgisApp( QSplashScreen *splash, bool restorePlugins, bool skipVersionCh
}
#endif
#ifdef Q_OS_MAC
mNative = new QgsMacNative();
#else
mNative = new QgsNative();
#endif
} // QgisApp ctor
QgisApp::QgisApp()
@ -1216,7 +1217,7 @@ QgisApp::QgisApp()
, mMapToolGroup( nullptr )
, mPreviewGroup( nullptr )
#ifdef Q_OS_MAC
, mWindowMenu( 0 )
, mWindowMenu( nullptr )
#endif
, mPanelMenu( nullptr )
, mToolbarMenu( nullptr )
@ -6124,13 +6125,7 @@ void QgisApp::activate()
void QgisApp::bringAllToFront()
{
#ifdef Q_OS_MAC
// Bring forward all open windows while maintaining layering order
// method valid for Mac OS X >= 10.6
QgsNSRunningApplication* nsrapp = new QgsNSRunningApplication();
nsrapp->currentAppActivateIgnoringOtherApps();
delete nsrapp;
#endif
mNative->currentAppActivateIgnoringOtherApps();
}
void QgisApp::addWindow( QAction *action )

View File

@ -139,6 +139,8 @@ class QgsDiagramProperties;
#include "ui_qgisapp.h"
#include "qgis_app.h"
#include "qgsnative.h"
#include <QGestureEvent>
#include <QTapAndHoldGesture>
@ -1967,6 +1969,8 @@ class APP_EXPORT QgisApp : public QMainWindow, private Ui::MainWindow
QHash< QgsComposition *, QgsMapLayerAction * > mAtlasFeatureActions;
QgsNative *mNative = nullptr;
int mProjOpen;
bool gestureEvent( QGestureEvent *event );

View File

@ -1044,11 +1044,6 @@ INCLUDE_DIRECTORIES(SYSTEM
${QTKEYCHAIN_INCLUDE_DIR}
)
IF(USE_NATIVE_LIB)
IF(APPLE)
INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/src/native/mac)
ENDIF(APPLE)
ENDIF(USE_NATIVE_LIB)
#for PAL classes
IF (WIN32)
@ -1118,9 +1113,7 @@ IF (WIN32)
TARGET_LINK_LIBRARIES(qgis_core wsock32 ${SETUPAPI_LIBRARY} DbgHelp)
ENDIF (WIN32)
IF(USE_NATIVE_LIB)
TARGET_LINK_LIBRARIES(qgis_core qgis_native)
ENDIF(USE_NATIVE_LIB)
TARGET_LINK_LIBRARIES(qgis_core qgis_native)
IF (NOT WITH_INTERNAL_QEXTSERIALPORT)
TARGET_LINK_LIBRARIES(qgis_core ${QEXTSERIALPORT_LIBRARY})

View File

@ -27,54 +27,56 @@ ENDIF(APPLE)
#############################################################
# sources
SET(QGIS_CORE_SRCS)
SET(QGIS_NATIVE_SRCS
qgsnative.cpp
)
IF(APPLE)
SET(QGIS_APP_OBJC_SRCS
mac/cocoainitializer.mm
mac/qgsmacappkit.mm
mac/qgsmacnative.mm
)
SET_SOURCE_FILES_PROPERTIES(${QGIS_APP_OBJC_SRCS} PROPERTIES COMPILE_FLAGS "-x objective-c++")
SET(QGIS_CORE_SRCS ${QGIS_CORE_SRCS}
SET(QGIS_NATIVE_SRCS ${QGIS_NATIVE_SRCS}
${QGIS_APP_OBJC_SRCS}
mac/qgsmacnative.cpp
)
ENDIF(APPLE)
SET(QGIS_CORE_MOC_HDRS)
QT4_WRAP_CPP(QGIS_CORE_MOC_SRCS ${QGIS_CORE_MOC_HDRS})
SET(QGIS_NATIVE_HDRS
qgsnative.h
)
# install headers
IF(APPLE)
SET (QGIS_CORE_HDRS ${QGIS_CORE_HDRS}
SET (QGIS_NATIVE_HDRS ${QGIS_NATIVE_HDRS}
mac/qgsmacnative.h
mac/cocoainitializer.h
mac/qgsmacappkit.h
)
ENDIF(APPLE)
INCLUDE_DIRECTORIES(
${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_CURRENT_BINARY_DIR}
)
IF(APPLE)
INCLUDE_DIRECTORIES(mac)
ENDIF(APPLE)
# Test data dir for QgsRenderChecker
ADD_DEFINITIONS(-DTEST_DATA_DIR="\\"${TEST_DATA_DIR}\\"")
#############################################################
# qgis_native library
ADD_LIBRARY(qgis_native SHARED ${QGIS_CORE_SRCS} ${QGIS_CORE_MOC_SRCS} ${QGIS_CORE_HDRS} ${QGIS_CORE_MOC_HDRS})
ADD_LIBRARY(qgis_native SHARED ${QGIS_NATIVE_SRCS} ${QGIS_NATIVE_HDRS})
GENERATE_EXPORT_HEADER(
qgis_native
BASE_NAME NATIVE
EXPORT_FILE_NAME qgis_native.h
)
SET(QGIS_NATIVE_HDRS ${QGIS_NATIVE_HDRS} ${CMAKE_CURRENT_BINARY_DIR}/qgis_native.h)
IF(NOT APPLE)
INSTALL(FILES ${QGIS_CORE_HDRS} ${QGIS_CORE_MOC_HDRS} DESTINATION ${QGIS_INCLUDE_DIR})
INSTALL(FILES ${QGIS_NATIVE_HDRS} DESTINATION ${QGIS_INCLUDE_DIR})
ELSE(NOT APPLE)
SET_TARGET_PROPERTIES(qgis_native PROPERTIES
CLEAN_DIRECT_OUTPUT 1
@ -84,7 +86,7 @@ ELSE(NOT APPLE)
MACOSX_FRAMEWORK_SHORT_VERSION_STRING ${COMPLETE_VERSION}
MACOSX_FRAMEWORK_IDENTIFIER org.qgis.qgis2_native
BUILD_WITH_INSTALL_RPATH TRUE
PUBLIC_HEADER "${QGIS_CORE_HDRS};${QGIS_CORE_MOC_HDRS}"
PUBLIC_HEADER "${QGIS_NATIVE_HDRS}"
LINK_FLAGS "${CMAKE_SHARED_LINKER_FLAGS}"
)
ENDIF(NOT APPLE)
@ -94,7 +96,7 @@ IF(NOT ANDROID)
SET_TARGET_PROPERTIES(qgis_native PROPERTIES
VERSION ${COMPLETE_VERSION}
SOVERSION ${COMPLETE_VERSION}
)
)
ENDIF(NOT ANDROID)
TARGET_LINK_LIBRARIES(qgis_native "${NATIVE_LINK_LIBS}")
@ -106,7 +108,8 @@ INSTALL(TARGETS qgis_native
LIBRARY DESTINATION ${QGIS_LIB_DIR}
ARCHIVE DESTINATION ${QGIS_LIB_DIR}
FRAMEWORK DESTINATION ${QGIS_FW_SUBDIR}
PUBLIC_HEADER DESTINATION ${QGIS_INCLUDE_DIR})
PUBLIC_HEADER DESTINATION ${QGIS_INCLUDE_DIR}
)
# Mac dev frameworks

View File

@ -18,14 +18,15 @@
#ifndef QGSMACNATIVE_H
#define QGSMACNATIVE_H
class QgsMacAppKit
#include "qgsnative.h"
class NATIVE_EXPORT QgsMacNative : public QgsNative
{
public:
virtual ~QgsMacAppKit();
virtual ~QgsMacNative();
// NSRunningApplication interface
virtual const char* currentAppLocalizedName() = 0;
virtual void currentAppActivateIgnoringOtherApps() = 0;
virtual const char* currentAppLocalizedName();
virtual void currentAppActivateIgnoringOtherApps() override;
};
#endif // QGSMACNATIVE_H

View File

@ -1,5 +1,5 @@
/***************************************************************************
qgsmacappkit.mm - interface to Mac objective-c AppKit.framework
qgsmacnative.cpp - abstracted interface to native Mac objective-c
-------------------
begin : January 2014
copyright : (C) 2014 by Larry Shaffer
@ -15,35 +15,20 @@
* *
***************************************************************************/
#include "qgsmacappkit.h"
#include "qgsmacnative.h"
#include <Cocoa/Cocoa.h>
class QgsNSRunningApplication::Private
QgsMacNative::~QgsMacNative()
{
public:
// NSObject *obj;
};
QgsNSRunningApplication::QgsNSRunningApplication()
{
// d = new Private;
// d->obj = [NSObject someFunction];
}
QgsNSRunningApplication::~QgsNSRunningApplication()
{
// [d->obj release];
// delete d;
// d = 0;
}
const char* QgsNSRunningApplication::currentAppLocalizedName()
const char* QgsMacNative::currentAppLocalizedName()
{
return [[[NSRunningApplication currentApplication] localizedName] UTF8String];
}
void QgsNSRunningApplication::currentAppActivateIgnoringOtherApps()
void QgsMacNative::currentAppActivateIgnoringOtherApps()
{
// valid for Mac OS X >= 10.6
[[NSRunningApplication currentApplication] activateWithOptions:

View File

@ -1,9 +1,9 @@
/***************************************************************************
qgsmacnative.cpp - abstracted interface to native Mac objective-c
qgsnative.cpp - abstracted interface to native system calls
-------------------
begin : January 2014
copyright : (C) 2014 by Larry Shaffer
email : larrys at dakotacarto dot com
begin : January 2017
copyright : (C) 2017 by Matthias Kuhn
email : matthias@opengis.ch
***************************************************************************/
/***************************************************************************
@ -15,8 +15,12 @@
* *
***************************************************************************/
#include "qgsmacnative.h"
#include "qgsnative.h"
QgsMacAppKit::~QgsMacAppKit()
QgsNative::QgsNative()
{
}
void QgsNative::currentAppActivateIgnoringOtherApps()
{
}

View File

@ -1,9 +1,9 @@
/***************************************************************************
qgsmacappkit.h - interface to Mac objective-c AppKit.framework
qgsnative.h - abstracted interface to native system calls
-------------------
begin : January 2014
copyright : (C) 2014 by Larry Shaffer
email : larrys at dakotacarto dot com
begin : January 2017
copyright : (C) 2017 by Matthias Kuhn
email : matthias@opengis.ch
***************************************************************************/
/***************************************************************************
@ -15,23 +15,26 @@
* *
***************************************************************************/
#ifndef QGSMACAPPKIT_H
#define QGSMACAPPKIT_H
#ifndef QGSNATIVE_H
#define QGSNATIVE_H
#include "qgsmacnative.h"
#include "qgis_native.h"
class QgsNSRunningApplication : public QgsMacAppKit
/**
* Base class for implementing methods for native system calls that
* are implemented in subclasses to provide platform abstraction.
*/
class NATIVE_EXPORT QgsNative
{
public:
QgsNSRunningApplication();
~QgsNSRunningApplication();
QgsNative();
const char* currentAppLocalizedName();
void currentAppActivateIgnoringOtherApps();
private:
class Private;
Private* d;
/**
* Bring QGIS to front. Default implementation does nothing.
*
* @note Added in QGIS 3.0
*/
virtual void currentAppActivateIgnoringOtherApps();
};
#endif // QGSMACAPPKIT_H
#endif // QGSNATIVE_H

View File

@ -36,9 +36,7 @@ IF (ENABLE_TESTS)
IF (WITH_DESKTOP)
ADD_SUBDIRECTORY(app)
ENDIF (WITH_DESKTOP)
IF(USE_NATIVE_LIB)
ADD_SUBDIRECTORY(native)
ENDIF(USE_NATIVE_LIB)
ADD_SUBDIRECTORY(native)
IF (WITH_BINDINGS)
ADD_SUBDIRECTORY(python)
ENDIF (WITH_BINDINGS)

View File

@ -22,6 +22,8 @@ INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/../../../src/app
${CMAKE_CURRENT_SOURCE_DIR}/../../../src/app/pluginmanager
${CMAKE_CURRENT_SOURCE_DIR}/../../../src/test
${CMAKE_SOURCE_DIR}/src/native
${CMAKE_BINARY_DIR}/src/native
${CMAKE_BINARY_DIR}/src/core
${CMAKE_BINARY_DIR}/src/gui
${CMAKE_BINARY_DIR}/src/python
@ -37,11 +39,6 @@ INCLUDE_DIRECTORIES(SYSTEM
${QSCINTILLA_INCLUDE_DIR}
)
IF(USE_NATIVE_LIB)
IF(APPLE)
INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/src/native/mac)
ENDIF(APPLE)
ENDIF(USE_NATIVE_LIB)
#note for tests we should not include the moc of our
#qtests in the executable file list as the moc is
@ -82,9 +79,7 @@ MACRO (ADD_QGIS_TEST testname testsrc)
TARGET_LINK_LIBRARIES(qgis_${testname} ${APP_SERVICES_LIBRARY} )
ENDIF(APPLE)
ADD_TEST(qgis_${testname} ${CMAKE_CURRENT_BINARY_DIR}/../../../output/bin/qgis_${testname} -maxwarnings 10000)
IF(USE_NATIVE_LIB)
TARGET_LINK_LIBRARIES(qgis_${testname} qgis_native)
ENDIF(USE_NATIVE_LIB)
TARGET_LINK_LIBRARIES(qgis_${testname} qgis_native)
ADD_TEST(qgis_${testname} ${CMAKE_CURRENT_BINARY_DIR}/../../../output/bin/qgis_${testname})
#SET_TARGET_PROPERTIES(qgis_${testname} PROPERTIES
# INSTALL_RPATH ${CMAKE_INSTALL_PREFIX}/${QGIS_LIB_DIR}

View File

@ -5,8 +5,18 @@
# the UI file won't be wrapped!
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_CURRENT_BINARY_DIR}
${CMAKE_SOURCE_DIR}/src/test
${CMAKE_SOURCE_DIR}/src/core
${CMAKE_SOURCE_DIR}/src/core/geometry
${CMAKE_SOURCE_DIR}/src/native
${CMAKE_BINARY_DIR}/src/native
${CMAKE_BINARY_DIR}/src/core
)
INCLUDE_DIRECTORIES(SYSTEM
${QT_INCLUDE_DIR}
)
)
IF(APPLE)
INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/src/native/mac)
@ -50,19 +60,25 @@ ENDIF (APPLE)
MACRO (ADD_QGIS_TEST testname testsrc)
SET(qgis_${testname}_SRCS ${testsrc} ${util_SRCS})
SET(qgis_${testname}_MOC_CPPS ${testsrc})
QT4_WRAP_CPP(qgis_${testname}_MOC_SRCS ${qgis_${testname}_MOC_CPPS})
ADD_CUSTOM_TARGET(qgis_${testname}moc ALL DEPENDS ${qgis_${testname}_MOC_SRCS})
ADD_EXECUTABLE(qgis_${testname} ${qgis_${testname}_SRCS})
ADD_DEPENDENCIES(qgis_${testname} qgis_${testname}moc)
ADD_EXECUTABLE(qgis_${testname} ${qgis_${testname}_SRCS} ${IMAGE_RCC_SRCS})
SET_TARGET_PROPERTIES(qgis_${testname} PROPERTIES AUTOMOC TRUE)
TARGET_LINK_LIBRARIES(qgis_${testname}
${QT_QTCORE_LIBRARY}
${QT_QTTEST_LIBRARY}
qgis_app
qgis_native)
ADD_TEST(qgis_${testname} ${CMAKE_CURRENT_BINARY_DIR}/../../../output/bin/qgis_${testname})
qgis_native
)
ADD_TEST(qgis_${testname} ${CMAKE_CURRENT_BINARY_DIR}/../../../output/bin/qgis_${testname} -maxwarnings 10000)
#SET_TARGET_PROPERTIES(qgis_${testname} PROPERTIES
# INSTALL_RPATH ${CMAKE_INSTALL_PREFIX}/${QGIS_LIB_DIR}
# INSTALL_RPATH_USE_LINK_PATH true )
ENDMACRO (ADD_QGIS_TEST)
#############################################################
# Tests:
ADD_QGIS_TEST(macnativetest testqgsmacnative.cpp)
IF (APPLE)
ADD_QGIS_TEST(macnativetest testqgsmacnative.cpp)
ENDIF (APPLE)

View File

@ -12,12 +12,13 @@
* (at your option) any later version. *
* *
***************************************************************************/
#include <QtTest>
#include "qgstest.h"
#include <QObject>
#include <QString>
//header for class being tested
#include <qgsmacappkit.h>
#include "qgsmacnative.h"
class TestQgsMacNative: public QObject
{
@ -29,12 +30,10 @@ class TestQgsMacNative: public QObject
void TestQgsMacNative::testGetRunningAppName()
{
QgsNSRunningApplication* nsrapp = new QgsNSRunningApplication();
QString nsrapp_name( nsrapp->currentAppLocalizedName() );
delete nsrapp;
QCOMPARE( QString( "qgis_macnativetest" ), nsrapp_name.trimmed() );
QgsMacNative* macNative = new QgsMacNative();
QCOMPARE( QStringLiteral( "qgis_macnativetest" ), QString( macNative->currentAppLocalizedName() ) );
delete macNative;
}
QTEST_MAIN( TestQgsMacNative )
#include "moc_testqgsmacnative.cxx"
QGSTEST_MAIN( TestQgsMacNative )
#include "testqgsmacnative.moc"