Apply a heavily refactored version of the remote display changes from
the CES 2019 demo #3 source demo3/common/agl-service-windowmanager in:
https://git.automotivelinux.org/staging/new-apps
The refactoring of the extracted changes has been done with an eye to
reduce code duplication and minimize the changes to existing code.
As well, the required default policy manager changes missing in the
demo #3 tree have been added to produce a working default policy.
At present the configuration has been hard-coded to assume use of the
tbtnavi application on a Weston remoting display, but testing has
also been done with a second display on one board. The changes should
not impact operation of any other application, as only applications
with roles listed in the "Remote" layer definition can be displayed
on a configured second Weston screen.
Bug-AGL: SPEC-2914
Signed-off-by: Scott Murray <scott.murray@konsulko.com>
Change-Id: I29380bbbec46969b75ed4fe7e8095db772524082
+ },
+ {
+ "name": "remote.fullscreen",
+ "rect": {
+ "x": 0,
+ "y": 0,
+ "w": 640,
+ "h": 720
+ }
"id_range_begin": 6000,
"id_range_end": 6999,
"comment": "System notification layer. For example, on_screen_low_battery_alert to notify user"
"id_range_begin": 6000,
"id_range_end": 6999,
"comment": "System notification layer. For example, on_screen_low_battery_alert to notify user"
+ },
+ {
+ "name": "Remote",
+ "role": "tbtnavi",
+ "type": "stack",
+ "id_range_begin": 9000,
+ "id_range_end": 9999,
+ "comment": "Range of IDs that will always be placed on the Remote layer for remote display, that gets a very high 'dummy' id of over 9000"
"role": "system_alert",
"area": "on_screen",
"layer": "on_screen",
"role": "system_alert",
"area": "on_screen",
"layer": "on_screen",
+ },
+ {
+ "category": "remote",
+ "role": "tbtnavi",
+ "area": "remote.fullscreen",
+ "layer": "remote_apps",
+ },
+ {
+ "name": "remote.fullscreen",
+ "areas": [
+ {
+ "name": "remote.fullscreen",
+ "category": "remote"
+ }
+ ]
/*
* Copyright (c) 2018 TOYOTA MOTOR CORPORATION
/*
* Copyright (c) 2018 TOYOTA MOTOR CORPORATION
+ * Copyright (c) 2019 Konsulko Group
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
"system",
"software_keyboard",
"debug",
"system",
"software_keyboard",
"debug",
};
const char* kStmAreaName[] = {
};
const char* kStmAreaName[] = {
"restriction.split.main",
"restriction.split.sub",
"software_keyboard",
"restriction.split.main",
"restriction.split.sub",
"software_keyboard",
};
const char* kStmLayoutName[] = {
};
const char* kStmLayoutName[] = {
"debug.split.main",
"debug.split.sub",
"debug.fullscreen",
"debug.split.main",
"debug.split.sub",
"debug.fullscreen",
};
const char* kStmLayerName[] = {
};
const char* kStmLayerName[] = {
"near_homescreen",
"restriction",
"on_screen",
"near_homescreen",
"restriction",
"on_screen",
};
const char* kStmModeName[] = {
};
const char* kStmModeName[] = {
/*
* Copyright (c) 2018 TOYOTA MOTOR CORPORATION
/*
* Copyright (c) 2018 TOYOTA MOTOR CORPORATION
+ * Copyright (c) 2019 Konsulko Group
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
StmCtgNoSystem,
StmCtgNoSoftwareKeyboard,
StmCtgNoDebug,
StmCtgNoSystem,
StmCtgNoSoftwareKeyboard,
StmCtgNoDebug,
StmAreaNoRestrictionSplitMain,
StmAreaNoRestrictionSplitSub,
StmAreaNoSoftwareKyeboard,
StmAreaNoRestrictionSplitMain,
StmAreaNoRestrictionSplitSub,
StmAreaNoSoftwareKyeboard,
+ StmAreaNoRemoteFullscreen,
StmLayerNoNearHomescreen,
StmLayerNoRestriction,
StmLayerNoOnScreen,
StmLayerNoNearHomescreen,
StmLayerNoRestriction,
StmLayerNoOnScreen,
StmLayoutNoDbgSplMain,
StmLayoutNoDbgSplSub,
StmLayoutNoDbgFll,
StmLayoutNoDbgSplMain,
StmLayoutNoDbgSplSub,
StmLayoutNoDbgFll,
/*
* Copyright (c) 2018 TOYOTA MOTOR CORPORATION
/*
* Copyright (c) 2018 TOYOTA MOTOR CORPORATION
+ * Copyright (c) 2019 Konsulko Group
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
g_stm_crr_state.layer[StmLayerNoOnScreen].state = StmLayoutNoSysAlt;
g_stm_crr_state.layer[StmLayerNoOnScreen].changed = STM_TRUE;
}
g_stm_crr_state.layer[StmLayerNoOnScreen].state = StmLayoutNoSysAlt;
g_stm_crr_state.layer[StmLayerNoOnScreen].changed = STM_TRUE;
}
+ else if (StmCtgNoRemote == category_no)
+ {
+ g_stm_crr_state.layer[StmLayerNoRemoteApps].state = StmLayoutNoRmtFll;
+ g_stm_crr_state.layer[StmLayerNoRemoteApps].changed = STM_TRUE;
+ }
}
else if (StmEvtNoDeactivate == event_no)
{
}
else if (StmEvtNoDeactivate == event_no)
{
g_stm_crr_state.layer[StmLayerNoOnScreen].changed = STM_TRUE;
}
}
g_stm_crr_state.layer[StmLayerNoOnScreen].changed = STM_TRUE;
}
}
+ else if (StmCtgNoRemote == category_no)
+ {
+ if (StmLayoutNoRmtFll == g_stm_prv_state.layer[StmLayerNoRemoteApps].state )
+ {
+ g_stm_crr_state.layer[StmLayerNoRemoteApps].state = StmLayoutNoNone;
+ g_stm_crr_state.layer[StmLayerNoRemoteApps].changed = STM_TRUE;
+ }
+ }
}
// Copy current state for return
}
// Copy current state for return
/*
* Copyright (c) 2017 TOYOTA MOTOR CORPORATION
/*
* Copyright (c) 2017 TOYOTA MOTOR CORPORATION
+ * Copyright (c) 2019 Konsulko Group
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
unsigned WindowManager::generateLayerForClient(const string& role)
{
unsigned WindowManager::generateLayerForClient(const string& role)
{
- unsigned lid = this->lc->getNewLayerID(role);
+ string l_name;
+ unsigned lid = this->lc->getNewLayerID(role, &l_name);
if (lid == 0)
{
// register drawing_name as fallback and make it displayed.
if (lid == 0)
{
// register drawing_name as fallback and make it displayed.
- this->lc->createNewLayer(lid);
+
+ // TODO: remote layer name is fixed
+ this->lc->createNewLayer(lid, ("Remote" == l_name));
+
// add client into the db
return lid;
}
// add client into the db
return lid;
}
/*
* Copyright (c) 2017 TOYOTA MOTOR CORPORATION
/*
* Copyright (c) 2017 TOYOTA MOTOR CORPORATION
+ * Copyright (c) 2019 Konsulko Group
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
WMError setLayerState(const LayerState& l);
bool hasLayerID(unsigned id);
bool hasRole(const std::string& role);
WMError setLayerState(const LayerState& l);
bool hasLayerID(unsigned id);
bool hasRole(const std::string& role);
+ void setRemote(const bool newRemote) { remote = newRemote; }
+ bool isRemote(void) { return remote; }
// Manipulation
void addLayerToState(unsigned layer);
// Manipulation
void addLayerToState(unsigned layer);
std::vector<unsigned> id_list;
unsigned id_begin;
unsigned id_end;
std::vector<unsigned> id_list;
unsigned id_begin;
unsigned id_end;
/*
* Copyright (c) 2017 TOYOTA MOTOR CORPORATION
/*
* Copyright (c) 2017 TOYOTA MOTOR CORPORATION
- * Copyright (c) 2018 Konsulko Group
+ * Copyright (c) 2018,2019 Konsulko Group
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
#define LC_AREA_FILE "areas.json"
#define LC_LAYER_SETTING_FILE "layers.json"
#define LC_DEFAULT_AREA "fullscreen"
#define LC_AREA_FILE "areas.json"
#define LC_LAYER_SETTING_FILE "layers.json"
#define LC_DEFAULT_AREA "fullscreen"
+#define LC_REMOTE_DEFAULT_AREA "remote.fullscreen"
#define BACK_GROUND_LAYER "BackGroundLayer"
using std::string;
#define BACK_GROUND_LAYER "BackGroundLayer"
using std::string;
// Currently, 0 is only available
this->screenID = ids[0];
// Currently, 0 is only available
this->screenID = ids[0];
+ if (1 < num)
+ {
+ // TODO: set remote screen id
+ HMI_INFO("There is remote screen (id:%d)", ids[1]);
+ this->remoteScreenID = ids[1];
+ }
+ else
+ {
+ HMI_INFO("There is no remote screen");
+ this->remoteScreenID = -1;
+ }
+
rc = ilm_getPropertiesOfScreen(this->screenID, &this->screen_prop);
if(rc != ILM_SUCCESS) goto lc_init_error;
rc = ilm_getPropertiesOfScreen(this->screenID, &this->screen_prop);
if(rc != ILM_SUCCESS) goto lc_init_error;
-void LayerControl::createNewLayer(unsigned id)
+void LayerControl::createNewLayer(unsigned id, bool remote)
- HMI_INFO("create new ID :%d", id);
- struct rect rct = this->area2size[LC_DEFAULT_AREA];
+ HMI_INFO("create new ID :%d%s", id, remote ? " (For remote layer)" : "");
+ struct rect rct = this->area2size[remote ? LC_REMOTE_DEFAULT_AREA : LC_DEFAULT_AREA];
ilm_layerCreateWithDimension(&id, rct.w, rct.h);
//ilm_layerSetSourceRectangle(id, rct.x, rct.y, rct.w, rct.h);
ilm_layerSetDestinationRectangle(id, this->offset_x, this->offset_y, rct.w, rct.h);
ilm_layerCreateWithDimension(&id, rct.w, rct.h);
//ilm_layerSetSourceRectangle(id, rct.x, rct.y, rct.w, rct.h);
ilm_layerSetDestinationRectangle(id, this->offset_x, this->offset_y, rct.w, rct.h);
ilm_commitChanges();
auto wm_layer = getWMLayer(id);
wm_layer->addLayerToState(id);
ilm_commitChanges();
auto wm_layer = getWMLayer(id);
wm_layer->addLayerToState(id);
+ wm_layer->setRemote(remote);
-unsigned LayerControl::getNewLayerID(const string& role)
+unsigned LayerControl::getNewLayerID(const string& role, std::string* layer_name)
{
unsigned ret = 0;
for(const auto& l: this->wm_layers)
{
unsigned ret = 0;
for(const auto& l: this->wm_layers)
{
unsigned wmlid = l->getWMLayerID();
this->lid2wmlid[ret] = wmlid;
{
unsigned wmlid = l->getWMLayerID();
this->lid2wmlid[ret] = wmlid;
+ if(layer_name)
+ {
+ *layer_name = l->layerName();
+ }
HMI_INFO("Commit change");
WMError rc = WMError::SUCCESS;
HMI_INFO("Commit change");
WMError rc = WMError::SUCCESS;
+ bool haveRemoteDisplay = remoteScreenID > 0;
+
// Check the number of layers
vector<unsigned> ivi_l_ids;
// Check the number of layers
vector<unsigned> ivi_l_ids;
+ vector<unsigned> ivi_remote_l_ids;
for(auto& l : this->wm_layers)
{
auto state = l->getLayerState();
HMI_DEBUG("layer %s", l->layerName().c_str());
for(auto& l : this->wm_layers)
{
auto state = l->getLayerState();
HMI_DEBUG("layer %s", l->layerName().c_str());
- for(const auto& id : state.getIviIdList())
- HMI_DEBUG("Add %d", id);
- ivi_l_ids.push_back(id);
- }
+ for(const auto& id : state.getIviIdList())
+ {
+ HMI_DEBUG("Add %d", id);
+ ivi_l_ids.push_back(id);
+ }
+ } else if (haveRemoteDisplay) {
+ for(const auto& id : state.getIviIdList())
+ {
+ HMI_DEBUG("Add remote %d", id);
+ ivi_remote_l_ids.push_back(id);
+ }
+ }
int count = 0;
for(const auto& i : ivi_l_ids)
{
int count = 0;
for(const auto& i : ivi_l_ids)
{
- id_array[count] = i;
- ++count;
+ id_array[count++] = i;
+ }
+
+ t_ilm_layer* remote_id_array = nullptr;
+ if(haveRemoteDisplay && ivi_remote_l_ids.size() != 0) {
+ remote_id_array = new t_ilm_layer[ivi_remote_l_ids.size()];
+ if(remote_id_array == nullptr)
+ {
+ HMI_WARNING("short memory");
+ this->undoUpdate();
+ return WMError::FAIL;
+ }
+ count = 0;
+ for(const auto& i : ivi_remote_l_ids)
+ {
+ remote_id_array[count++] = i;
+ }
}
// Display
ilmErrorTypes ret = ilm_displaySetRenderOrder(this->screenID, id_array, ivi_l_ids.size());
}
// Display
ilmErrorTypes ret = ilm_displaySetRenderOrder(this->screenID, id_array, ivi_l_ids.size());
+ if(ret == ILM_SUCCESS && haveRemoteDisplay)
+ {
+ ret = ilm_displaySetRenderOrder(this->remoteScreenID, remote_id_array, ivi_remote_l_ids.size());
+ }
if(ret != ILM_SUCCESS)
{
this->undoUpdate();
if(ret != ILM_SUCCESS)
{
this->undoUpdate();
}
ilm_commitChanges();
delete id_array;
}
ilm_commitChanges();
delete id_array;
+ delete remote_id_array;
{
WMError ret = WMError::SUCCESS;
// Don't check here wheher client is nullptr or not
{
WMError ret = WMError::SUCCESS;
// Don't check here wheher client is nullptr or not
- unsigned layer = client->layerID();
+ unsigned layer_id = client->layerID();
+ auto layer = getWMLayer(layer_id);
- this->moveForeGround(client);
+ if (!layer->isRemote())
+ {
+ this->moveForeGround(client);
+ }
+ else if (0 > this->remoteScreenID) {
+ return ret;
+ }
- ilm_layerSetVisibility(layer, ILM_TRUE);
+ ilm_layerSetVisibility(layer_id, ILM_TRUE);
{
WMError ret = WMError::SUCCESS;
// Don't check here the client is not nullptr
{
WMError ret = WMError::SUCCESS;
// Don't check here the client is not nullptr
- unsigned layer = client->layerID();
+ unsigned layer_id = client->layerID();
+ auto layer = getWMLayer(layer_id);
- bool mv_ok = this->moveBackGround(client);
+ bool set_invisible = true;
+ if (!layer->isRemote())
+ {
+ if(this->moveBackGround(client))
+ {
+ set_invisible = false;
+ }
+ else
+ {
+ HMI_INFO("make invisible client %s", client->appID().c_str());
+ }
+ }
+ else if (0 > this->remoteScreenID) {
+ return ret;
+ }
- HMI_INFO("make invisible client %s", client->appID().c_str());
- ilm_layerSetVisibility(layer, ILM_FALSE);
+ ilm_layerSetVisibility(layer_id, ILM_FALSE);
/*
* Copyright (c) 2017 TOYOTA MOTOR CORPORATION
/*
* Copyright (c) 2017 TOYOTA MOTOR CORPORATION
+ * Copyright (c) 2019 Konsulko Group
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
explicit LayerControl(const std::string& root);
~LayerControl() = default;
WMError init(const LayerControlCallbacks& cb);
explicit LayerControl(const std::string& root);
~LayerControl() = default;
WMError init(const LayerControlCallbacks& cb);
- void createNewLayer(unsigned id);
- unsigned getNewLayerID(const std::string& role);
+ void createNewLayer(unsigned id, bool remote = false);
+ unsigned getNewLayerID(const std::string& role, std::string* layer_name = nullptr);
std::shared_ptr<WMLayer> getWMLayer(unsigned layer);
std::shared_ptr<WMLayer> getWMLayer(std::string layer_name);
struct rect getAreaSize(const std::string& area);
std::shared_ptr<WMLayer> getWMLayer(unsigned layer);
std::shared_ptr<WMLayer> getWMLayer(std::string layer_name);
struct rect getAreaSize(const std::string& area);
std::unordered_map<unsigned, unsigned> lid2wmlid;
std::unordered_map<std::string, struct rect> area2size;
unsigned screenID;
std::unordered_map<unsigned, unsigned> lid2wmlid;
std::unordered_map<std::string, struct rect> area2size;
unsigned screenID;
struct ilmScreenProperties screen_prop;
double scaling;
int offset_x;
struct ilmScreenProperties screen_prop;
double scaling;
int offset_x;
LayerControlCallbacks cb;
};
LayerControlCallbacks cb;
};
-} // namespace wm
\ No newline at end of file