From e1f7947894930eb2ed2ea2f7befea9022506be96 Mon Sep 17 00:00:00 2001 From: Kazumasa Mitsunari Date: Thu, 9 Nov 2017 19:15:29 +0900 Subject: Add initial code of qlibwindowmanager qlibwindowmanager is the wrapper library of libwindowmanager for Qt application Change-Id: I7058d918b73d5f5b6edfb4a32ca697bfd7f53cff Signed-off-by: Kazumasa Mitsunari --- src/qlibwindowmanager.cpp | 109 ++++++++++++++++++++++++++++++++++++++++++++++ src/qlibwindowmanager.h | 66 ++++++++++++++++++++++++++++ src/src.pro | 41 +++++++++++++++++ 3 files changed, 216 insertions(+) create mode 100644 src/qlibwindowmanager.cpp create mode 100644 src/qlibwindowmanager.h create mode 100644 src/src.pro (limited to 'src') diff --git a/src/qlibwindowmanager.cpp b/src/qlibwindowmanager.cpp new file mode 100644 index 0000000..b5fad2c --- /dev/null +++ b/src/qlibwindowmanager.cpp @@ -0,0 +1,109 @@ +/* + * Copyright (c) 2017 TOYOTA MOTOR CORPORATION + * + * Licensed 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 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "qlibwindowmanager.h" +#include +#include +#include +#include +//#include + +// TODO: write description for function +// TODO: replace json_object creation to use wrap-json + +using namespace std; + +int QLibWindowmanager::init(int port, const QString &token) { + string ctoken = token.toStdString(); + return this->wm->init(port, ctoken.c_str()); +} + +int QLibWindowmanager::requestSurface(const QString &label) { + string cstr = label.toStdString(); + applabel = new char[cstr.length() + 1]; + memcpy(applabel, cstr.c_str(), cstr.length() + 1); + + json_object *obj = json_object_new_object(); + json_object_object_add(obj, wm->kKeyDrawingName, json_object_new_string(applabel)); + int surface_id = this->wm->requestSurface(obj); + if(surface_id < 0){ + qDebug("failed to get surfaceID"); + return -1; + } + else{ + qDebug("surfaceID is set to %d", surface_id); + char buf[65]; // surface id is under 64bit(1.84E19,) so 65 is sufficient for buffer + snprintf(buf, 65, "%d", surface_id); + setenv("QT_IVI_SURFACE_ID", buf, 1); + return 0; + } +} + +int QLibWindowmanager::activateSurface(const QString &label) { + json_object *obj = json_object_new_object(); + string clabel = label.toStdString(); + // Request default drawing area "normal.full" + string cdrawing_area = wm->kStrLayoutNormal + wm->kStrAreaFull; + json_object_object_add(obj, wm->kKeyDrawingName, json_object_new_string(clabel.c_str())); + json_object_object_add(obj, wm->kKeyDrawingArea, json_object_new_string(cdrawing_area.c_str())); + return this->wm->activateSurface(obj); +} + +int QLibWindowmanager::activateSurface(const QString &label, const QString &drawing_area) { + json_object *obj = json_object_new_object(); + string clabel = label.toStdString(); + string cdrawing_area = drawing_area.toStdString(); + json_object_object_add(obj, wm->kKeyDrawingName, json_object_new_string(clabel.c_str())); + json_object_object_add(obj, wm->kKeyDrawingArea, json_object_new_string(cdrawing_area.c_str())); + return this->wm->activateSurface(obj); +} + +int QLibWindowmanager::deactivateSurface(const QString &label) { + json_object *obj = json_object_new_object(); + string clabel = label.toStdString(); + json_object_object_add(obj, wm->kKeyDrawingName, json_object_new_string(clabel.c_str())); + return this->wm->deactivateSurface(obj); +} + +int QLibWindowmanager::endDraw(const QString &label) { + json_object *obj = json_object_new_object(); + string clabel = label.toStdString(); + json_object_object_add(obj, wm->kKeyDrawingName, json_object_new_string(clabel.c_str())); + return this->wm->endDraw(obj); + } + +void QLibWindowmanager::set_event_handler(enum QEventType et, + handler_fun f) { + LibWindowmanager::EventType wet = (LibWindowmanager::EventType)et; + return this->wm->set_event_handler(wet, std::move(f)); +} + +void QLibWindowmanager::slotActivateSurface(){ + // This is needed for first rendering when the app is launched + if(!isActive){ + qDebug("Let's show %s", qPrintable(applabel)); + isActive = true; + this->activateSurface(applabel); + } +} + +QLibWindowmanager::QLibWindowmanager(QObject *parent) + :QObject(parent), isActive(false) +{ + wm = new LibWindowmanager(); +} + +QLibWindowmanager::~QLibWindowmanager() { } diff --git a/src/qlibwindowmanager.h b/src/qlibwindowmanager.h new file mode 100644 index 0000000..f07a312 --- /dev/null +++ b/src/qlibwindowmanager.h @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2017 TOYOTA MOTOR CORPORATION + * + * Licensed 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 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef QLIBWINDOWMANAGER_H +#define QLIBWINDOWMANAGER_H +#include +#include +#include +#include + +class QLibWindowmanager : public QObject{ +Q_OBJECT +public: + explicit QLibWindowmanager(QObject *parent = nullptr); + ~QLibWindowmanager(); + + QLibWindowmanager(const QLibWindowmanager &) = delete; + QLibWindowmanager &operator=(const QLibWindowmanager &) = delete; + +public: + using handler_fun = std::function; + + enum QEventType { + Event_Active = LibWindowmanager::Event_Active, + Event_Inactive, + + Event_Visible, + Event_Invisible, + + Event_SyncDraw, + Event_FlushDraw, + }; + + int init(int port, const QString &token); + + // WM API + Q_INVOKABLE int requestSurface(const QString &label); + Q_INVOKABLE int activateSurface(const QString &label); + Q_INVOKABLE int activateSurface(const QString &label, const QString &drawing_area); + Q_INVOKABLE int deactivateSurface(const QString &label); + Q_INVOKABLE int endDraw(const QString &label); + void set_event_handler(enum QEventType et, handler_fun f); + +public slots: + void slotActivateSurface(); + +private: + LibWindowmanager* wm; + char* applabel; + bool isActive; + +}; +#endif // LIBWINDOWMANAGER_H diff --git a/src/src.pro b/src/src.pro new file mode 100644 index 0000000..54acf08 --- /dev/null +++ b/src/src.pro @@ -0,0 +1,41 @@ +# +# Copyright (c) 2017 TOYOTA MOTOR CORPORATION +# +# Licensed 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 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +TEMPLATE = lib +VERSION = 0.1.0 +TARGET = qtWindowmanagerWrapper + +HEADERS = qlibwindowmanager.h +SOURCES = qlibwindowmanager.cpp + +headers.path = /usr/include +headers.file = qlibwindowmanager.h + +target.path = /usr/lib + +CONFIG += link_pkgconfig create_pc create_prl no_install_prl + +PKGCONFIG += libwindowmanager + +QMAKE_PKGCONFIG_NAME = qlibwindowmanager +QMAKE_PKGCONFIG_FILE = $${QMAKE_PKGCONFIG_NAME} +QMAKE_PKGCONFIG_VERSION = $${VERSION} +QMAKE_PKGCONFIG_DESCRIPTION = A wrapper interface for libwindowmanager for Qt +QMAKE_PKGCONFIG_LIBDIR = ${prefix}/lib +QMAKE_PKGCONFIG_INCDIR = ${prefix}/include +QMAKE_PKGCONFIG_REQUIRES = libwindowmanager +QMAKE_PKGCONFIG_DESTDIR = pkgconfig + +INSTALLS += target headers -- cgit 1.2.3-korg