summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarius Vlad <marius.vlad@collabora.com>2020-06-27 18:20:19 +0300
committerMarius Vlad <marius.vlad@collabora.com>2020-07-08 20:40:39 +0300
commit3b0e548c3adae12e72cc6d6dc22f5ecc475aa7c2 (patch)
tree060896dd1f8a4484caf267afe0adf539d68864cd
parent40e6e78a19483dc5822ded81cea041f3983a877f (diff)
In commit 11b9762f115778 we've added some logic in place that would allow to start the application de-activated (that is hidden), as to avoid 'stealing' the input focus (hoovering the pointer over a surface will give that surface focus). alexa-viewer application would be started by default by the system and will be set 'invisible' (due to being a Qt app with the property set as visible: false), and most likely this might cause a bit of confusion for users. Also, by default, the compositor will display the application as soon as started. This patch re-works the de-activation part to handle a corner case, as in commit 11b9762f115778 we would send the de-activate request as a response in an event handler but it seems we can't guarantee that at that time the surface was indeed activated. So, instead of using application_id event, we use the application_id_state event, which guarantees that we were actually sending the de-activate request after we got the activate state event from the compositor. Bug-AGL: SPEC-3412 Signed-off-by: Marius Vlad <marius.vlad@collabora.com> Change-Id: Ie50b8011700d258a899374176fb78dcd528f88c1
-rw-r--r--app/main.cpp57
1 files changed, 37 insertions, 20 deletions
diff --git a/app/main.cpp b/app/main.cpp
index f78897f..3c8792c 100644
--- a/app/main.cpp
+++ b/app/main.cpp
@@ -70,24 +70,8 @@ static void
application_id_event(void *data, struct agl_shell_desktop *agl_shell_desktop,
const char *app_id)
{
- Shell *aglShell = static_cast<Shell *>(data);
-
- qInfo() << "app_id: " << app_id;
-
- /* if we find our name here, means we just been started, as the application_id
- * event is being sent when we connect, do distribute all the 'current' running
- * applications/app_ids and when a new is being created */
- if (strcmp(app_id, my_app_id.toStdString().c_str()))
- return;
+ qInfo() << "Application " << app_id << " created";
- if (started)
- return;
-
- /* we de-activate ourselves the first time we start, as we start as
- * visible: 'false' */
- aglShell->deactivate_app(my_app_id);
- started = true;
- qDebug() << "appplication de-activated: " << my_app_id;
}
static void
@@ -97,10 +81,43 @@ application_id_state(void *data, struct agl_shell_desktop *agl_shell_desktop,
{
(void) app_data;
(void) agl_shell_desktop;
- (void) app_id;
- (void) app_state;
- (void) app_role;
+ Shell *aglShell = static_cast<Shell *>(data);
+
+ qDebug() << "app_id " << app_id << " app_state " << app_state <<
+ " app_role " << app_role;
+
+ /* ignore others apps */
+ if (app_role != AGL_SHELL_DESKTOP_APP_ROLE_POPUP &&
+ strcmp(app_id, my_app_id.toStdString().c_str()))
+ return;
+
+ if (app_state == AGL_SHELL_DESKTOP_APP_STATE_ACTIVATED) {
+ /* if we've been already started */
+ if (started)
+ return;
+
+ /* we de-activate ourselves the first time we start, as we
+ * start as visible: 'false'
+ *
+ * application_id event will not be sufficient to handle this
+ * because at that time there might be a chance that we weren't
+ * really 'activated'; meaning that we send the deactivate request,
+ * before the compositor activated us; so we wait until we get
+ * the activation event here, as at this stage we are sure we
+ * are activated.
+ *
+ * Later activations of the alexa-viewer will end up here as
+ * well, but we guard that with a local variable; also
+ * de-activation will generate the event one more time, this
+ * time with the AGL_SHELL_DESKTOP_APP_STATE_DEACTIVATED
+ * app_state.
+ */
+ started = true;
+
+ qDebug() << "appplication " << app_id << " de-activated";
+ aglShell->deactivate_app(my_app_id);
+ }
}
static const struct agl_shell_desktop_listener agl_shell_desk_listener = {