gjdwebserver-overlay/gui-wm/phosh/files/MR434.patch

2315 lines
78 KiB
Diff
Raw Normal View History

2021-06-17 15:02:06 +02:00
From 207e7203a33781cc538b19658f19f4f14f8614a4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Guido=20G=C3=BCnther?= <agx@sigxcpu.org>
Date: Wed, 5 Aug 2020 16:07:16 +0200
Subject: [PATCH 01/19] rotateinfo: Fix indentation
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: Guido Günther <guido.gunther@puri.sm>
---
src/rotateinfo.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/rotateinfo.c b/src/rotateinfo.c
index 5cd3ccf7..b673fa3d 100644
--- a/src/rotateinfo.c
+++ b/src/rotateinfo.c
@@ -59,7 +59,7 @@ set_state (PhoshRotateInfo *self)
monitor_is_landscape = ((double)monitor->width / (double)monitor->height) > 1.0;
portrait = monitor_is_landscape ? !portrait : portrait;
- g_debug ("Potrait: %d, width: %d, height: %d", portrait, monitor->width , monitor->height);
+ g_debug ("Potrait: %d, width: %d, height: %d", portrait, monitor->width, monitor->height);
if (portrait) {
phosh_status_icon_set_icon_name (PHOSH_STATUS_ICON (self), "screen-rotation-portrait-symbolic");
phosh_status_icon_set_info (PHOSH_STATUS_ICON (self), _("Portrait"));
--
GitLab
From b5545e2428c5816f9e5efd84b41c28a383988983 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Guido=20G=C3=BCnther?= <agx@sigxcpu.org>
Date: Fri, 26 Mar 2021 09:37:13 +0100
Subject: [PATCH 02/19] monitor-manager: Fix doc string
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Make function name match the actual definition.
Signed-off-by: Guido Günther <guido.gunther@puri.sm>
---
src/monitor-manager.c | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/src/monitor-manager.c b/src/monitor-manager.c
index d67f073b..6e48ce26 100644
--- a/src/monitor-manager.c
+++ b/src/monitor-manager.c
@@ -1369,9 +1369,10 @@ phosh_monitor_manager_get_num_monitors (PhoshMonitorManager *self)
}
/**
- * phosh_monitor_set_transform:
+ * phosh_monitor_manager_set_monitor_transform:
* @self: A #PhoshMonitor
- * @mode: The #PhoshMonitorPowerSaveMode
+ * @monitor: The #PhoshMonitor to set the tansform on
+ * @transform: The #PhoshMonitorTransform to set
*
* Sets monitor's transform. This will become active after the next
* call to #phosh_monitor_manager_apply_monitor_config().
--
GitLab
From ee3cb76591469a608d4ea2113853c9bf0e4d1be1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Guido=20G=C3=BCnther?= <agx@sigxcpu.org>
Date: Thu, 7 Jan 2021 16:39:12 +0100
Subject: [PATCH 03/19] shell: Create sensor-manager early
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
We want that before the panels since those might use other
managers that need the sensor-manager (e.g. rotation-manager)
Signed-off-by: Guido Günther <guido.gunther@puri.sm>
---
src/shell.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/src/shell.c b/src/shell.c
index 0aad5403..cb596b45 100644
--- a/src/shell.c
+++ b/src/shell.c
@@ -469,6 +469,8 @@ setup_idle_cb (PhoshShell *self)
priv->session_manager = phosh_session_manager_new ();
priv->mode_manager = phosh_mode_manager_new ();
+ priv->sensor_proxy_manager = phosh_sensor_proxy_manager_get_default_failable ();
+
panels_create (self);
/* Create background after panel since it needs the panel's size */
priv->background_manager = phosh_background_manager_new ();
@@ -502,8 +504,8 @@ setup_idle_cb (PhoshShell *self)
if (priv->sensor_proxy_manager) {
priv->proximity = phosh_proximity_new (priv->sensor_proxy_manager,
priv->lockscreen_manager);
- /* TODO: accelerometer */
}
+
priv->mount_manager = phosh_mount_manager_new ();
phosh_session_manager_register (priv->session_manager,
--
GitLab
From 9f3856df6f2cbe817c70cc3ce915c5117a192624 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Guido=20G=C3=BCnther?= <agx@sigxcpu.org>
Date: Thu, 7 Jan 2021 16:36:12 +0100
Subject: [PATCH 04/19] shell: Don't bother with accelerometer
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Rotation-manager takes care of that
Signed-off-by: Guido Günther <guido.gunther@puri.sm>
---
src/shell.c | 7 -------
1 file changed, 7 deletions(-)
diff --git a/src/shell.c b/src/shell.c
index cb596b45..0bcf6558 100644
--- a/src/shell.c
+++ b/src/shell.c
@@ -340,13 +340,6 @@ phosh_shell_dispose (GObject *object)
PhoshShell *self = PHOSH_SHELL (object);
PhoshShellPrivate *priv = phosh_shell_get_instance_private(self);
- if (priv->sensor_proxy_manager) {
- phosh_dbus_sensor_proxy_call_release_accelerometer_sync (
- PHOSH_DBUS_SENSOR_PROXY(priv->sensor_proxy_manager),
- NULL, NULL);
- g_clear_object (&priv->sensor_proxy_manager);
- }
-
panels_dispose (self);
g_clear_pointer (&priv->faders, g_ptr_array_unref);
--
GitLab
From 4064988c7efeb1b74ebf32bbd2df02e8154392cd Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Guido=20G=C3=BCnther?= <agx@sigxcpu.org>
Date: Thu, 7 Jan 2021 20:32:06 +0100
Subject: [PATCH 05/19] shell: Decruft builtin monitor setup
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Just look it up on start since it can't change.
Signed-off-by: Guido Günther <guido.gunther@puri.sm>
---
src/shell.c | 45 +++++++++++++++++++++++++++++----------------
1 file changed, 29 insertions(+), 16 deletions(-)
diff --git a/src/shell.c b/src/shell.c
index 0bcf6558..b8a71053 100644
--- a/src/shell.c
+++ b/src/shell.c
@@ -611,6 +611,32 @@ on_monitor_removed (PhoshShell *self, PhoshMonitor *monitor)
}
+static PhoshMonitor *
+find_builtin_monitor (PhoshShell *self)
+{
+ PhoshShellPrivate *priv;
+ PhoshMonitor *monitor = NULL;
+
+ g_return_val_if_fail (PHOSH_IS_SHELL (self), NULL);
+ priv = phosh_shell_get_instance_private (self);
+
+ if (priv->builtin_monitor)
+ return priv->builtin_monitor;
+
+ for (int i = 0; i < phosh_monitor_manager_get_num_monitors (priv->monitor_manager); i++) {
+ monitor = phosh_monitor_manager_get_monitor (priv->monitor_manager, i);
+ if (phosh_monitor_is_builtin (monitor))
+ break;
+ }
+
+ if (!monitor)
+ monitor = phosh_monitor_manager_get_monitor (priv->monitor_manager, 0);
+ g_return_val_if_fail (monitor, NULL);
+
+ return monitor;
+}
+
+
static void
phosh_shell_constructed (GObject *object)
{
@@ -634,7 +660,7 @@ phosh_shell_constructed (GObject *object)
phosh_wayland_roundtrip (phosh_wayland_get_default ());
if (phosh_monitor_manager_get_num_monitors(priv->monitor_manager)) {
- priv->builtin_monitor = phosh_shell_get_builtin_monitor (self);
+ priv->builtin_monitor = g_object_ref (find_builtin_monitor (self));
g_debug ("Builtin monitor is %s, %d", priv->builtin_monitor->name,
phosh_monitor_is_configured (priv->builtin_monitor));
@@ -819,25 +845,12 @@ PhoshMonitor *
phosh_shell_get_builtin_monitor (PhoshShell *self)
{
PhoshShellPrivate *priv;
- PhoshMonitor *monitor = NULL;
g_return_val_if_fail (PHOSH_IS_SHELL (self), NULL);
priv = phosh_shell_get_instance_private (self);
+ g_return_val_if_fail (PHOSH_IS_MONITOR (priv->builtin_monitor), NULL);
- if (priv->builtin_monitor)
- return priv->builtin_monitor;
-
- for (int i = 0; i < phosh_monitor_manager_get_num_monitors (priv->monitor_manager); i++) {
- monitor = phosh_monitor_manager_get_monitor (priv->monitor_manager, i);
- if (phosh_monitor_is_builtin (monitor))
- break;
- }
-
- if (!monitor)
- monitor = phosh_monitor_manager_get_monitor (priv->monitor_manager, 0);
- g_return_val_if_fail (monitor, NULL);
-
- return monitor;
+ return priv->builtin_monitor;
}
--
GitLab
From b8c08549e293471e07d19d06c04ebab84a111687 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Guido=20G=C3=BCnther?= <agx@sigxcpu.org>
Date: Mon, 29 Mar 2021 17:51:52 +0200
Subject: [PATCH 06/19] Avoid sensor-proxy singleton
Treat it as regular initable that is fetched from the shell
like other managers.
---
src/sensor-proxy-manager.c | 30 ++++++++----------------------
src/sensor-proxy-manager.h | 2 +-
src/shell.c | 6 ++++--
3 files changed, 13 insertions(+), 25 deletions(-)
diff --git a/src/sensor-proxy-manager.c b/src/sensor-proxy-manager.c
index 89b5e8f1..473a6b21 100644
--- a/src/sensor-proxy-manager.c
+++ b/src/sensor-proxy-manager.c
@@ -52,27 +52,13 @@ phosh_sensor_proxy_manager_init (PhoshSensorProxyManager *self)
PhoshSensorProxyManager *
-phosh_sensor_proxy_manager_get_default_failable (void)
+phosh_sensor_proxy_manager_new (GError **err)
{
- static PhoshSensorProxyManager *instance;
- GError *err = NULL;
- GInitable *ret;
-
- if (instance == NULL) {
- ret = g_initable_new (PHOSH_TYPE_SENSOR_PROXY_MANAGER, NULL, &err,
- "g-flags", G_DBUS_OBJECT_MANAGER_CLIENT_FLAGS_NONE,
- "g-name", IIO_SENSOR_PROXY_DBUS_NAME,
- "g-bus-type", G_BUS_TYPE_SYSTEM,
- "g-object-path", IIO_SENSOR_PROXY_DBUS_OBJECT,
- "g-interface-name", IIO_SENSOR_PROXY_DBUS_IFACE_NAME,
- NULL);
- if (ret != NULL) {
- instance = PHOSH_SENSOR_PROXY_MANAGER (ret);
- } else {
- g_warning ("Can't connect to iio-sensor-sensor proxy: %s", err->message);
- return NULL;
- }
- g_object_add_weak_pointer (G_OBJECT (instance), (gpointer *)&instance);
- }
- return instance;
+ return g_initable_new (PHOSH_TYPE_SENSOR_PROXY_MANAGER, NULL, err,
+ "g-flags", G_DBUS_OBJECT_MANAGER_CLIENT_FLAGS_NONE,
+ "g-name", IIO_SENSOR_PROXY_DBUS_NAME,
+ "g-bus-type", G_BUS_TYPE_SYSTEM,
+ "g-object-path", IIO_SENSOR_PROXY_DBUS_OBJECT,
+ "g-interface-name", IIO_SENSOR_PROXY_DBUS_IFACE_NAME,
+ NULL);
}
diff --git a/src/sensor-proxy-manager.h b/src/sensor-proxy-manager.h
index 9d140bae..32664a6d 100644
--- a/src/sensor-proxy-manager.h
+++ b/src/sensor-proxy-manager.h
@@ -13,6 +13,6 @@
G_DECLARE_FINAL_TYPE (PhoshSensorProxyManager, phosh_sensor_proxy_manager,
PHOSH, SENSOR_PROXY_MANAGER, PhoshDBusSensorProxyProxy)
-PhoshSensorProxyManager *phosh_sensor_proxy_manager_get_default_failable (void);
+PhoshSensorProxyManager *phosh_sensor_proxy_manager_new (GError **err);
gboolean phosh_sensor_proxy_manager_claim_proximity_sync (PhoshSensorProxyManager *self,
GError **err);
diff --git a/src/shell.c b/src/shell.c
index b8a71053..6f0d3663 100644
--- a/src/shell.c
+++ b/src/shell.c
@@ -457,12 +457,15 @@ on_fade_out_timeout (PhoshShell *self)
static gboolean
setup_idle_cb (PhoshShell *self)
{
+ g_autoptr (GError) err = NULL;
PhoshShellPrivate *priv = phosh_shell_get_instance_private (self);
priv->session_manager = phosh_session_manager_new ();
priv->mode_manager = phosh_mode_manager_new ();
- priv->sensor_proxy_manager = phosh_sensor_proxy_manager_get_default_failable ();
+ priv->sensor_proxy_manager = phosh_sensor_proxy_manager_new (&err);
+ if (!priv->sensor_proxy_manager)
+ g_warning ("Failed to connect to sensor-proxy: %s", err->message);
panels_create (self);
/* Create background after panel since it needs the panel's size */
@@ -493,7 +496,6 @@ setup_idle_cb (PhoshShell *self)
G_CONNECT_SWAPPED);
priv->location_manager = phosh_location_manager_new ();
- priv->sensor_proxy_manager = phosh_sensor_proxy_manager_get_default_failable ();
if (priv->sensor_proxy_manager) {
priv->proximity = phosh_proximity_new (priv->sensor_proxy_manager,
priv->lockscreen_manager);
--
GitLab
From f6e1b8b77fb9a13ea84735c94f8c674886f8a6ef Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Guido=20G=C3=BCnther?= <agx@sigxcpu.org>
Date: Tue, 23 Jun 2020 14:05:57 +0200
Subject: [PATCH 07/19] Add rotation-manager
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
The rotation manager listens to device orientation changes
and adjusts the primary display accordingly.
This interfaces with lockscreen, iio-sensor-proxy and
gsettings to figure out the correct screen orientation.
The manager has two modes: off (don't rotate any output) and sensor
(adjust due to sensor values).
Signed-off-by: Guido Günther <guido.gunther@puri.sm>
---
docs/phosh-docs.xml | 1 +
src/meson.build | 3 +
src/phosh-enums.c.in | 1 +
src/rotation-manager.c | 546 +++++++++++++++++++++++++++++++++++++++++
src/rotation-manager.h | 45 ++++
src/shell.c | 22 ++
src/shell.h | 2 +
7 files changed, 620 insertions(+)
create mode 100644 src/rotation-manager.c
create mode 100644 src/rotation-manager.h
diff --git a/docs/phosh-docs.xml b/docs/phosh-docs.xml
index e6c0a9db..9900a4ae 100644
--- a/docs/phosh-docs.xml
+++ b/docs/phosh-docs.xml
@@ -102,6 +102,7 @@
<xi:include href="xml/proximity.xml"/>
<xi:include href="xml/quick-setting.xml"/>
<xi:include href="xml/rotateinfo.xml"/>
+ <xi:include href="xml/rotation-manager.xml"/>
<xi:include href="xml/screen-saver-manager.xml"/>
<xi:include href="xml/sensor-proxy-manager.xml"/>
<xi:include href="xml/session-manager.xml"/>
diff --git a/src/meson.build b/src/meson.build
index 7935b17a..5a0ea2b3 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -23,6 +23,7 @@ phosh_enum_headers = [
'notifications/notification.h',
'notifications/notify-manager.h',
'phosh-wayland.h',
+ 'rotation-manager.h',
'shell.h',
] + schema_enum_headers
@@ -162,6 +163,8 @@ libphosh_sources = [
'polkit-auth-prompt.h',
'proximity.h',
'proximity.c',
+ 'rotation-manager.h',
+ 'rotation-manager.c',
'sensor-proxy-manager.c',
'sensor-proxy-manager.h',
'rotateinfo.c',
diff --git a/src/phosh-enums.c.in b/src/phosh-enums.c.in
index f001d726..293b97d9 100644
--- a/src/phosh-enums.c.in
+++ b/src/phosh-enums.c.in
@@ -11,6 +11,7 @@
#include "notifications/notification.h"
#include "notifications/notify-manager.h"
#include "phosh-wayland.h"
+#include "rotation-manager.h"
#include "shell.h"
#include "wwan/phosh-wwan-backend.h"
diff --git a/src/rotation-manager.c b/src/rotation-manager.c
new file mode 100644
index 00000000..ba847553
--- /dev/null
+++ b/src/rotation-manager.c
@@ -0,0 +1,546 @@
+/*
+ * Copyright (C) 2021 Purism SPC
+ *
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ * Author: Guido Günther <agx@sigxcpu.org>
+ */
+
+#define G_LOG_DOMAIN "phosh-rotation-manager"
+
+#include "config.h"
+#include "rotation-manager.h"
+#include "shell.h"
+#include "sensor-proxy-manager.h"
+#include "util.h"
+
+#define ORIENTATION_LOCK_SCHEMA_ID "org.gnome.settings-daemon.peripherals.touchscreen"
+#define ORIENTATION_LOCK_KEY "orientation-lock"
+
+/**
+ * SECTION:rotation-manager
+ * @short_description: The Rotation Manager
+ * @Title: PhoshRotationManager
+ *
+ * #PhoshRotationManager is responsible for managing the rotation of
+ * a given #PhoshMonitor. Depending on the #PhoshRotationManagerMode
+ * this can happen by interfacing with a #PhoshSensorProxyManager or
+ * by setting the #PhoshMonitorTransform explicitly.
+ * It also takes the #PhoshLockscreenManager:locked status into account
+ * to ensure the lockscreen is rotated accordingly on small phones.
+ */
+
+enum {
+ PROP_0,
+ PROP_SENSOR_PROXY_MANAGER,
+ PROP_LOCKSCREEN_MANAGER,
+ PROP_ORIENTATION_LOCKED,
+ PROP_MONITOR,
+ PROP_MODE,
+ LAST_PROP,
+};
+static GParamSpec *props[LAST_PROP];
+
+typedef struct _PhoshRotationManager {
+ GObject parent;
+
+ gboolean claimed;
+ PhoshSensorProxyManager *sensor_proxy_manager;
+ PhoshLockscreenManager *lockscreen_manager;
+ PhoshMonitor *monitor;
+
+ GSettings *settings;
+ gboolean orientation_locked;
+
+ PhoshRotationManagerMode mode;
+} PhoshRotationManager;
+
+G_DEFINE_TYPE (PhoshRotationManager, phosh_rotation_manager, G_TYPE_OBJECT);
+
+
+static void
+apply_transform (PhoshRotationManager *self, PhoshMonitorTransform transform)
+{
+ PhoshMonitorTransform current;
+ PhoshMonitorManager *monitor_manager = phosh_shell_get_monitor_manager (phosh_shell_get_default());
+
+ g_return_if_fail (PHOSH_IS_MONITOR_MANAGER (monitor_manager));
+ g_return_if_fail (PHOSH_IS_MONITOR (self->monitor));
+
+ g_debug ("Rotating %s: %d", self->monitor->name, transform);
+
+ current = phosh_monitor_get_transform (self->monitor);
+ if (current == transform)
+ return;
+
+ phosh_monitor_manager_set_monitor_transform (monitor_manager,
+ self->monitor,
+ transform);
+ phosh_monitor_manager_apply_monitor_config (monitor_manager);
+}
+
+/**
+ * match_orientation:
+ * @self: The #PhoshRotationManager
+ *
+ * Match the screen orientation to the sensor output.
+ * Do nothing if orientation lock is on or there's no
+ * sensor claimed.
+ */
+static void
+match_orientation (PhoshRotationManager *self)
+{
+ const gchar *orient;
+ PhoshMonitorTransform transform;
+
+ if (self->orientation_locked || !self->claimed ||
+ self->mode == PHOSH_ROTATION_MANAGER_MODE_OFF)
+ return;
+
+ orient = phosh_dbus_sensor_proxy_get_accelerometer_orientation (
+ PHOSH_DBUS_SENSOR_PROXY (self->sensor_proxy_manager));
+
+ g_debug ("Orientation changed: %s, locked: %d, claimed: %d",
+ orient, self->orientation_locked, self->claimed);
+
+ if (!g_strcmp0 ("normal", orient)) {
+ transform = PHOSH_MONITOR_TRANSFORM_NORMAL;
+ } else if (!g_strcmp0 ("right-up", orient)) {
+ transform = PHOSH_MONITOR_TRANSFORM_270;
+ } else if (!g_strcmp0 ("bottom-up", orient)) {
+ transform = PHOSH_MONITOR_TRANSFORM_180;
+ } else if (!g_strcmp0 ("left-up", orient)) {
+ transform = PHOSH_MONITOR_TRANSFORM_90;
+ } else if (!g_strcmp0 ("undefined", orient)) {
+ return; /* just leave as is */
+ } else {
+ g_warning ("Unknown orientation '%s'", orient);
+ return;
+ }
+
+ apply_transform (self, transform);
+}
+
+static void
+on_accelerometer_claimed (PhoshSensorProxyManager *sensor_proxy_manager,
+ GAsyncResult *res,
+ PhoshRotationManager *self)
+{
+ g_autoptr (GError) err = NULL;
+ gboolean success;
+
+ g_return_if_fail (PHOSH_IS_SENSOR_PROXY_MANAGER (sensor_proxy_manager));
+ g_return_if_fail (PHOSH_IS_ROTATION_MANAGER (self));
+ g_return_if_fail (sensor_proxy_manager == self->sensor_proxy_manager);
+
+ success = phosh_dbus_sensor_proxy_call_claim_accelerometer_finish (
+ PHOSH_DBUS_SENSOR_PROXY (sensor_proxy_manager),
+ res, &err);
+ if (success) {
+ g_debug ("Claimed accelerometer");
+ self->claimed = TRUE;
+ } else {
+ g_warning ("Failed to claim accelerometer: %s", err->message);
+ }
+ match_orientation (self);
+ g_object_unref (self);
+}
+
+static void
+on_accelerometer_released (PhoshSensorProxyManager *sensor_proxy_manager,
+ GAsyncResult *res,
+ PhoshRotationManager *self)
+{
+ g_autoptr (GError) err = NULL;
+ gboolean success;
+
+ g_return_if_fail (PHOSH_IS_SENSOR_PROXY_MANAGER (sensor_proxy_manager));
+ g_return_if_fail (PHOSH_IS_ROTATION_MANAGER (self));
+ g_return_if_fail (sensor_proxy_manager == self->sensor_proxy_manager);
+
+ success = phosh_dbus_sensor_proxy_call_release_accelerometer_finish (
+ PHOSH_DBUS_SENSOR_PROXY (sensor_proxy_manager),
+ res, &err);
+ if (success) {
+ g_debug ("Released rotation sensor");
+ } else {
+ g_warning ("Failed to release rotation sensor: %s", err->message);
+ }
+ self->claimed = FALSE;
+ g_object_unref (self);
+}
+
+static void
+phosh_rotation_manager_claim_accelerometer (PhoshRotationManager *self, gboolean claim)
+{
+ if (claim == self->claimed)
+ return;
+
+ if (!self->sensor_proxy_manager)
+ return;
+
+ if (claim) {
+ phosh_dbus_sensor_proxy_call_claim_accelerometer (
+ PHOSH_DBUS_SENSOR_PROXY (self->sensor_proxy_manager),
+ NULL,
+ (GAsyncReadyCallback)on_accelerometer_claimed,
+ g_object_ref (self));
+ } else {
+ phosh_dbus_sensor_proxy_call_release_accelerometer (
+ PHOSH_DBUS_SENSOR_PROXY (self->sensor_proxy_manager),
+ NULL,
+ (GAsyncReadyCallback)on_accelerometer_released,
+ g_object_ref (self));
+ }
+}
+
+static void
+on_has_accelerometer_changed (PhoshRotationManager *self,
+ GParamSpec *pspec,
+ PhoshSensorProxyManager *proxy)
+{
+ gboolean has_accel;
+ PhoshRotationManagerMode mode;
+
+ has_accel = phosh_dbus_sensor_proxy_get_has_accelerometer (
+ PHOSH_DBUS_SENSOR_PROXY (self->sensor_proxy_manager));
+
+ g_debug ("Found %s accelerometer", has_accel ? "a" : "no");
+
+ mode = has_accel ? PHOSH_ROTATION_MANAGER_MODE_SENSOR : PHOSH_ROTATION_MANAGER_MODE_OFF;
+ phosh_rotation_manager_set_mode (self, mode);
+}
+
+static void
+on_lockscreen_manager_locked (PhoshRotationManager *self, GParamSpec *pspec,
+ PhoshLockscreenManager *lockscreen_manager)
+{
+ gboolean claim;
+
+ g_return_if_fail (PHOSH_IS_ROTATION_MANAGER (self));
+ g_return_if_fail (PHOSH_IS_LOCKSCREEN_MANAGER (lockscreen_manager));
+
+ if (self->mode == PHOSH_ROTATION_MANAGER_MODE_OFF)
+ claim = FALSE;
+ else
+ claim = !phosh_lockscreen_manager_get_locked (self->lockscreen_manager);
+
+ phosh_rotation_manager_claim_accelerometer (self, claim);
+}
+
+static void
+on_accelerometer_orientation_changed (PhoshRotationManager *self,
+ GParamSpec *pspec,
+ PhoshSensorProxyManager *sensor)
+{
+ g_return_if_fail (PHOSH_IS_ROTATION_MANAGER (self));
+ g_return_if_fail (self->sensor_proxy_manager == sensor);
+
+ match_orientation (self);
+}
+
+static void
+phosh_rotation_manager_set_property (GObject *object,
+ guint property_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ PhoshRotationManager *self = PHOSH_ROTATION_MANAGER (object);
+
+ switch (property_id) {
+ case PROP_SENSOR_PROXY_MANAGER:
+ /* construct only */
+ self->sensor_proxy_manager = g_value_dup_object (value);
+ break;
+ case PROP_LOCKSCREEN_MANAGER:
+ /* construct only */
+ self->lockscreen_manager = g_value_dup_object (value);
+ break;
+ case PROP_MONITOR:
+ /* construct only */
+ self->monitor = g_value_dup_object (value);
+ break;
+ case PROP_ORIENTATION_LOCKED:
+ phosh_rotation_manager_set_orientation_locked (self,
+ g_value_get_boolean (value));
+ break;
+ case PROP_MODE:
+ phosh_rotation_manager_set_mode (self, g_value_get_enum (value));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+ break;
+ }
+}
+
+static void
+phosh_rotation_manager_get_property (GObject *object,
+ guint property_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ PhoshRotationManager *self = PHOSH_ROTATION_MANAGER (object);
+
+ switch (property_id) {
+ case PROP_SENSOR_PROXY_MANAGER:
+ g_value_set_object (value, self->sensor_proxy_manager);
+ break;
+ case PROP_LOCKSCREEN_MANAGER:
+ g_value_set_object (value, self->lockscreen_manager);
+ break;
+ case PROP_ORIENTATION_LOCKED:
+ g_value_set_boolean (value, self->orientation_locked);
+ break;
+ case PROP_MODE:
+ g_value_set_enum (value, self->mode);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+ break;
+ }
+}
+
+static void
+phosh_rotation_manager_constructed (GObject *object)
+{
+ PhoshRotationManager *self = PHOSH_ROTATION_MANAGER (object);
+
+ G_OBJECT_CLASS (phosh_rotation_manager_parent_class)->constructed (object);
+
+ self->settings = g_settings_new (ORIENTATION_LOCK_SCHEMA_ID);
+
+ g_settings_bind (self->settings,
+ ORIENTATION_LOCK_KEY,
+ self,
+ "orientation-locked",
+ G_BINDING_SYNC_CREATE
+ | G_BINDING_BIDIRECTIONAL);
+
+ g_signal_connect_swapped (self->lockscreen_manager,
+ "notify::locked",
+ (GCallback) on_lockscreen_manager_locked,
+ self);
+ on_lockscreen_manager_locked (self, NULL, self->lockscreen_manager);
+
+ if (!self->sensor_proxy_manager)
+ return;
+
+ g_signal_connect_swapped (self->sensor_proxy_manager,
+ "notify::accelerometer-orientation",
+ (GCallback) on_accelerometer_orientation_changed,
+ self);
+
+ g_signal_connect_swapped (self->sensor_proxy_manager,
+ "notify::has-accelerometer",
+ (GCallback) on_has_accelerometer_changed,
+ self);
+ on_has_accelerometer_changed (self, NULL, self->sensor_proxy_manager);
+}
+
+
+static void
+phosh_rotation_manager_dispose (GObject *object)
+{
+ PhoshRotationManager *self = PHOSH_ROTATION_MANAGER (object);
+
+ g_clear_object (&self->settings);
+
+ if (self->sensor_proxy_manager) {
+ g_signal_handlers_disconnect_by_data (self->sensor_proxy_manager,
+ self);
+ /* Sync call since we're going away */
+ phosh_dbus_sensor_proxy_call_release_accelerometer_sync (
+ PHOSH_DBUS_SENSOR_PROXY (self->sensor_proxy_manager), NULL, NULL);
+ g_clear_object (&self->sensor_proxy_manager);
+ }
+
+ if (self->lockscreen_manager) {
+ g_signal_handlers_disconnect_by_data (self->lockscreen_manager,
+ self);
+ g_clear_object (&self->lockscreen_manager);
+ }
+ g_clear_object (&self->monitor);
+
+ G_OBJECT_CLASS (phosh_rotation_manager_parent_class)->dispose (object);
+}
+
+static void
+phosh_rotation_manager_class_init (PhoshRotationManagerClass *klass)
+{
+ GObjectClass *object_class = (GObjectClass *)klass;
+
+ object_class->constructed = phosh_rotation_manager_constructed;
+ object_class->dispose = phosh_rotation_manager_dispose;
+
+ object_class->set_property = phosh_rotation_manager_set_property;
+ object_class->get_property = phosh_rotation_manager_get_property;
+
+ props[PROP_SENSOR_PROXY_MANAGER] =
+ g_param_spec_object (
+ "sensor-proxy-manager",
+ "Sensor proxy manager",
+ "The object inerfacing with iio-sensor-proxy",
+ PHOSH_TYPE_SENSOR_PROXY_MANAGER,
+ G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
+
+ props[PROP_LOCKSCREEN_MANAGER] =
+ g_param_spec_object (
+ "lockscreen-manager",
+ "Lockscren manager",
+ "The object managing the lock screen",
+ PHOSH_TYPE_LOCKSCREEN_MANAGER,
+ G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
+
+ props[PROP_MONITOR] =
+ g_param_spec_object (
+ "monitor",
+ "Monitor",
+ "The monitor to rotate",
+ PHOSH_TYPE_MONITOR,
+ G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
+
+ props[PROP_ORIENTATION_LOCKED] =
+ g_param_spec_boolean (
+ "orientation-locked",
+ "Screen orientation locked",
+ "Whether the screen orientation is locked",
+ TRUE,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
+
+ props[PROP_MODE] =
+ g_param_spec_enum (
+ "mode",
+ "Rotation mode",
+ "The current rotation mode",
+ PHOSH_TYPE_ROTATION_MANAGER_MODE,
+ PHOSH_ROTATION_MANAGER_MODE_OFF,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
+
+ g_object_class_install_properties (object_class, LAST_PROP, props);
+}
+
+static void
+phosh_rotation_manager_init (PhoshRotationManager *self)
+{
+}
+
+
+PhoshRotationManager *
+phosh_rotation_manager_new (PhoshSensorProxyManager *sensor_proxy_manager,
+ PhoshLockscreenManager *lockscreen_manager,
+ PhoshMonitor *monitor)
+{
+ return g_object_new (PHOSH_TYPE_ROTATION_MANAGER,
+ "sensor-proxy-manager", sensor_proxy_manager,
+ "lockscreen-manager", lockscreen_manager,
+ "monitor", monitor,
+ NULL);
+}
+
+void
+phosh_rotation_manager_set_orientation_locked (PhoshRotationManager *self, gboolean locked)
+{
+ g_return_if_fail (PHOSH_IS_ROTATION_MANAGER (self));
+
+ if (locked == self->orientation_locked)
+ return;
+
+ self->orientation_locked = locked;
+ g_object_notify_by_pspec (G_OBJECT (self), props[PROP_ORIENTATION_LOCKED]);
+ match_orientation (self);
+}
+
+gboolean
+phosh_rotation_manager_get_orientation_locked (PhoshRotationManager *self)
+{
+ g_return_val_if_fail (PHOSH_IS_ROTATION_MANAGER (self), TRUE);
+
+ return self->orientation_locked;
+}
+
+PhoshRotationManagerMode
+phosh_rotation_manager_get_mode (PhoshRotationManager *self)
+{
+ g_return_val_if_fail (PHOSH_IS_ROTATION_MANAGER (self), PHOSH_ROTATION_MANAGER_MODE_OFF);
+
+ return self->mode;
+}
+
+/**
+ * phosh_rotation_manager_set_mode:
+ * @self: The #PhoshRotationManager
+ * @mode: The #PhoshRotationManagerMode to set
+ *
+ * Sets the given mode.
+ * Returns: %TRUE if setting the mode was possible, otherwise %FALSE (e.g. when trying
+ * to set %PHOSH_ROTATION_MANAGER_MODE_SENSOR without having a sensor.
+ */
+gboolean
+phosh_rotation_manager_set_mode (PhoshRotationManager *self, PhoshRotationManagerMode mode)
+{
+ gboolean has_accel;
+
+ g_return_val_if_fail (PHOSH_IS_ROTATION_MANAGER (self), FALSE);
+
+ if (mode == self->mode)
+ return TRUE;
+
+ has_accel = phosh_dbus_sensor_proxy_get_has_accelerometer (
+ PHOSH_DBUS_SENSOR_PROXY (self->sensor_proxy_manager));
+
+ if (mode == PHOSH_ROTATION_MANAGER_MODE_SENSOR && !has_accel)
+ return FALSE;
+
+ self->mode = mode;
+
+ g_debug ("Setting mode: %d", mode);
+ switch (mode) {
+ case PHOSH_ROTATION_MANAGER_MODE_OFF:
+ phosh_rotation_manager_claim_accelerometer (self, FALSE);
+ break;
+ case PHOSH_ROTATION_MANAGER_MODE_SENSOR:
+ /* Don't claim during screen lock, enables runtime pm and will be
+ claimed on unlock */
+ if (!phosh_lockscreen_manager_get_locked (self->lockscreen_manager))
+ phosh_rotation_manager_claim_accelerometer (self, TRUE);
+ break;
+ default:
+ g_assert_not_reached ();
+ }
+
+ g_object_notify_by_pspec (G_OBJECT (self), props[PROP_MODE]);
+ return TRUE;
+}
+
+
+void
+phosh_rotation_manager_set_transform (PhoshRotationManager *self,
+ PhoshMonitorTransform transform)
+{
+ g_return_if_fail (PHOSH_IS_ROTATION_MANAGER (self));
+ g_return_if_fail (self->mode == PHOSH_ROTATION_MANAGER_MODE_OFF);
+
+ apply_transform (self, transform);
+}
+
+PhoshMonitorTransform
+phosh_rotation_manager_get_transform (PhoshRotationManager *self)
+{
+ g_return_val_if_fail (PHOSH_IS_ROTATION_MANAGER (self),
+ PHOSH_MONITOR_TRANSFORM_NORMAL);
+
+ return self->monitor->transform;
+}
+
+/**
+ * phosh_rotation_manager_get_monitor:
+ * @self: The PhoshRotationManager
+ *
+ * Returns: The #PhoshMonitor this manager acts on
+ */
+PhoshMonitor *
+phosh_rotation_manager_get_monitor (PhoshRotationManager *self)
+{
+ g_return_val_if_fail (PHOSH_IS_ROTATION_MANAGER (self), NULL);
+
+ return self->monitor;
+}
diff --git a/src/rotation-manager.h b/src/rotation-manager.h
new file mode 100644
index 00000000..b09926b5
--- /dev/null
+++ b/src/rotation-manager.h
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2021 Purism SPC
+ *
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ */
+#pragma once
+
+#include "lockscreen-manager.h"
+#include "sensor-proxy-manager.h"
+#include "monitor/monitor.h"
+
+G_BEGIN_DECLS
+
+/**
+ * PhoshRotationManagerMode:
+ * @PHOSH_ROTATION_MANAGER_MODE_OFF: automatic rotation off
+ * @PHOSH_ROTATION_MANAGER_MODE_SENSOR: rotation driven by sensor orientation
+ *
+ * The mode of a #PhoshRotationManager
+ */
+typedef enum {
+ PHOSH_ROTATION_MANAGER_MODE_OFF,
+ PHOSH_ROTATION_MANAGER_MODE_SENSOR,
+} PhoshRotationManagerMode;
+
+#define PHOSH_TYPE_ROTATION_MANAGER (phosh_rotation_manager_get_type ())
+
+G_DECLARE_FINAL_TYPE (PhoshRotationManager, phosh_rotation_manager, PHOSH, ROTATION_MANAGER, GObject);
+
+PhoshRotationManager *phosh_rotation_manager_new (PhoshSensorProxyManager *sensor_proxy_manager,
+ PhoshLockscreenManager *lockscreen_manager,
+ PhoshMonitor *monitor);
+void phosh_rotation_manager_set_orientation_locked (PhoshRotationManager *self,
+ gboolean locked);
+gboolean phosh_rotation_manager_get_orientation_locked (PhoshRotationManager *self);
+
+PhoshRotationManagerMode phosh_rotation_manager_get_mode (PhoshRotationManager *self);
+gboolean phosh_rotation_manager_set_mode (PhoshRotationManager *self,
+ PhoshRotationManagerMode mode);
+void phosh_rotation_manager_set_transform (PhoshRotationManager *self,
+ PhoshMonitorTransform tranform);
+PhoshMonitorTransform phosh_rotation_manager_get_transform (PhoshRotationManager *self);
+PhoshMonitor *phosh_rotation_manager_get_monitor (PhoshRotationManager *self);
+
+G_END_DECLS
diff --git a/src/shell.c b/src/shell.c
index 6f0d3663..57caff0d 100644
--- a/src/shell.c
+++ b/src/shell.c
@@ -59,6 +59,7 @@
#include "proximity.h"
#include "quick-setting.h"
#include "rotateinfo.h"
+#include "rotation-manager.h"
#include "sensor-proxy-manager.h"
#include "screen-saver-manager.h"
#include "session-manager.h"
@@ -129,6 +130,7 @@ typedef struct
/* sensors */
PhoshSensorProxyManager *sensor_proxy_manager;
PhoshProximity *proximity;
+ PhoshRotationManager *rotation_manager;
gboolean startup_finished;
PhoshMonitorTransform transform; /* current rotation of primary monitor */
@@ -372,7 +374,9 @@ phosh_shell_dispose (GObject *object)
/* sensors */
g_clear_object (&priv->proximity);
+ g_clear_object (&priv->rotation_manager);
g_clear_object (&priv->sensor_proxy_manager);
+
phosh_system_prompter_unregister ();
g_clear_object (&priv->session_manager);
@@ -1094,6 +1098,24 @@ phosh_shell_get_session_manager (PhoshShell *self)
}
+PhoshRotationManager *
+phosh_shell_get_rotation_manager (PhoshShell *self)
+{
+ PhoshShellPrivate *priv;
+
+ g_return_val_if_fail (PHOSH_IS_SHELL (self), NULL);
+ priv = phosh_shell_get_instance_private (self);
+
+ if (!priv->rotation_manager)
+ priv->rotation_manager = phosh_rotation_manager_new (priv->sensor_proxy_manager,
+ priv->lockscreen_manager,
+ priv->builtin_monitor);
+
+ g_return_val_if_fail (PHOSH_IS_ROTATION_MANAGER (priv->rotation_manager), NULL);
+
+ return priv->rotation_manager;
+}
+
/**
* Returns the usable area in pixels usable by a client on the phone
* display
diff --git a/src/shell.h b/src/shell.h
index 1b21eef8..d7cfcdbd 100644
--- a/src/shell.h
+++ b/src/shell.h
@@ -17,6 +17,7 @@
#include "monitor-manager.h"
#include "monitor/monitor.h"
#include "osk-manager.h"
+#include "rotation-manager.h"
#include "session-manager.h"
#include "toplevel-manager.h"
#include "torch-manager.h"
@@ -79,6 +80,7 @@ PhoshWifiManager *phosh_shell_get_wifi_manager (PhoshShell *self);
PhoshFeedbackManager *phosh_shell_get_feedback_manager (PhoshShell *self);
PhoshBtManager *phosh_shell_get_bt_manager (PhoshShell *self);
PhoshWWan *phosh_shell_get_wwan (PhoshShell *self);
+PhoshRotationManager *phosh_shell_get_rotation_manager (PhoshShell *self);
PhoshTorchManager *phosh_shell_get_torch_manager (PhoshShell *self);
PhoshDockedManager *phosh_shell_get_docked_manager (PhoshShell *self);
PhoshHksManager * phosh_shell_get_hks_manager (PhoshShell *self);
--
GitLab
From 9acef9b62ec219016b20c56640cb55bf8cfe0fd2 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Guido=20G=C3=BCnther?= <agx@sigxcpu.org>
Date: Tue, 23 Jun 2020 14:08:53 +0200
Subject: [PATCH 08/19] rotateinfo: Display either rotation lock or orientation
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Based on the rotation managers mode dislay appropriate information.
Closes: #18
Signed-off-by: Guido Günther <guido.gunther@puri.sm>
---
src/rotateinfo.c | 82 +++++++++++++++++++++++++++++++++++-------------
src/rotateinfo.h | 16 +++++++++-
2 files changed, 76 insertions(+), 22 deletions(-)
diff --git a/src/rotateinfo.c b/src/rotateinfo.c
index b673fa3d..1227d65d 100644
--- a/src/rotateinfo.c
+++ b/src/rotateinfo.c
@@ -15,28 +15,35 @@
/**
* SECTION:rotateinfo
- * @short_description: A widget to display the rotate status
+ * @short_description: A widget to display the rotate lock status
* @Title: PhoshRotateInfo
*
- * Rotate Info widget
+ * A #PhoshStatusIcon to display the rotation lock status.
+ * It can either display whether a rotation lock is currently active or
+ * if the output is in portrait/landscape mode.
*/
typedef struct _PhoshRotateInfo {
- PhoshStatusIcon parent;
+ PhoshStatusIcon parent;
+
+ PhoshRotationManager *manager;
} PhoshRotateInfo;
G_DEFINE_TYPE (PhoshRotateInfo, phosh_rotate_info, PHOSH_TYPE_STATUS_ICON)
-
static void
-set_state (PhoshRotateInfo *self)
+on_transform_changed (PhoshRotateInfo *self)
{
PhoshShell *shell = phosh_shell_get_default ();
PhoshMonitor *monitor = phosh_shell_get_primary_monitor (shell);
gboolean monitor_is_landscape;
gboolean portrait;
+ if (phosh_rotation_manager_get_mode (self->manager) != PHOSH_ROTATION_MANAGER_MODE_OFF) {
+ return;
+ }
+
switch (phosh_shell_get_transform (shell)) {
case PHOSH_MONITOR_TRANSFORM_NORMAL:
case PHOSH_MONITOR_TRANSFORM_FLIPPED:
@@ -71,37 +78,70 @@ set_state (PhoshRotateInfo *self)
static void
-phosh_rotate_info_finalize (GObject *object)
+on_orientation_lock_changed (PhoshRotateInfo *self)
{
- PhoshRotateInfo *self = PHOSH_ROTATE_INFO(object);
+ gboolean locked = phosh_rotation_manager_get_orientation_locked (self->manager);
+ const char *icon_name;
- g_signal_handlers_disconnect_by_data (phosh_shell_get_default (), self);
+ if (phosh_rotation_manager_get_mode (self->manager) != PHOSH_ROTATION_MANAGER_MODE_SENSOR)
+ return;
- G_OBJECT_CLASS (phosh_rotate_info_parent_class)->finalize (object);
+ g_debug ("Orientation locked: %d", locked);
+
+ icon_name = locked ? "rotation-locked-symbolic" : "rotation-allowed-symbolic";
+ phosh_status_icon_set_icon_name (PHOSH_STATUS_ICON (self), icon_name);
+ /* Translators: Automatic screen orientation is either on (enabled) or off (locked/disabled) */
+ phosh_status_icon_set_info (PHOSH_STATUS_ICON (self), locked ? _("Off") : _("On"));
+
+ return;
}
static void
-phosh_rotate_info_class_init (PhoshRotateInfoClass *klass)
+on_mode_changed (PhoshRotateInfo *self)
{
- GObjectClass *object_class = G_OBJECT_CLASS (klass);
- object_class->finalize = phosh_rotate_info_finalize;
+ PhoshRotationManagerMode mode = phosh_rotation_manager_get_mode (self->manager);
+
+ g_debug ("Rotation manager mode: %d", mode);
+ switch (mode) {
+ case PHOSH_ROTATION_MANAGER_MODE_OFF:
+ on_transform_changed (self);
+ break;
+ case PHOSH_ROTATION_MANAGER_MODE_SENSOR:
+ on_orientation_lock_changed (self);
+ break;
+ default:
+ g_assert_not_reached ();
+ }
}
static void
-phosh_rotate_info_init (PhoshRotateInfo *self)
+phosh_rotate_info_class_init (PhoshRotateInfoClass *klass)
{
- g_signal_connect_swapped (phosh_shell_get_default (),
- "notify::transform",
- G_CALLBACK (set_state),
- self);
- set_state (self);
}
-GtkWidget *
-phosh_rotate_info_new (void)
+static void
+phosh_rotate_info_init (PhoshRotateInfo *self)
{
- return g_object_new (PHOSH_TYPE_ROTATE_INFO, NULL);
+ self->manager = phosh_shell_get_rotation_manager (phosh_shell_get_default());
+
+ /* We don't use property bindings since we flip info/icon based on rotation and lock */
+ g_signal_connect_object (phosh_shell_get_default (),
+ "notify::transform",
+ G_CALLBACK (on_transform_changed),
+ self,
+ G_CONNECT_SWAPPED);
+ g_signal_connect_object (self->manager,
+ "notify::orientation-locked",
+ G_CALLBACK (on_orientation_lock_changed),
+ self,
+ G_CONNECT_SWAPPED);
+ g_signal_connect_object (self->manager,
+ "notify::mode",
+ G_CALLBACK (on_mode_changed),
+ self,
+ G_CONNECT_SWAPPED);
+ on_mode_changed (self);
}
diff --git a/src/rotateinfo.h b/src/rotateinfo.h
index 2e05f818..1195fed6 100644
--- a/src/rotateinfo.h
+++ b/src/rotateinfo.h
@@ -11,10 +11,24 @@
G_BEGIN_DECLS
+/**
+ * PhoshRotateInfoMode:
+ * @PHOSH_ROTATE_INFO_MODE_LOCK: Button toggles rotation lock
+ * @PHOSH_ROTATE_INFO_MODE_TOGGLE: Button toggles potrait/landscape
+ *
+ * The power save mode of a monitor
+ */
+typedef enum {
+ PHOSH_ROTATE_INFO_MODE_LOCK,
+ PHOSH_ROTATE_INFO_MODE_TOGGLE,
+} PhoshRotateInfoMode;
+
#define PHOSH_TYPE_ROTATE_INFO (phosh_rotate_info_get_type())
G_DECLARE_FINAL_TYPE (PhoshRotateInfo, phosh_rotate_info, PHOSH, ROTATE_INFO, PhoshStatusIcon)
-GtkWidget * phosh_rotate_info_new (void);
+GtkWidget *phosh_rotate_info_new (void);
+PhoshRotateInfoMode phosh_rotate_info_get_mode (PhoshRotateInfo *self);
+void phosh_rotate_info_set_mode (PhoshRotateInfo *self, PhoshRotateInfoMode mode);
G_END_DECLS
--
GitLab
From a30f0717605e0b79076da433e093774b77085b1b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Guido=20G=C3=BCnther?= <agx@sigxcpu.org>
Date: Tue, 23 Jun 2020 14:10:38 +0200
Subject: [PATCH 09/19] settings: Add orientation lock to rotate quick setting
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Long press switches between potrait/landscape and rotation lock.
Signed-off-by: Guido Günther <guido.gunther@puri.sm>
---
src/settings.c | 54 ++++++++++++++++++++++++++++++++++++++---
src/ui/settings-menu.ui | 1 +
2 files changed, 51 insertions(+), 4 deletions(-)
diff --git a/src/settings.c b/src/settings.c
index eb55486e..57d48182 100644
--- a/src/settings.c
+++ b/src/settings.c
@@ -20,6 +20,7 @@
#include "feedback-manager.h"
#include "notifications/notify-manager.h"
#include "notifications/notification-frame.h"
+#include "rotateinfo.h"
#include <pulse/pulseaudio.h>
#include "gvc-mixer-control.h"
@@ -82,16 +83,60 @@ static void
rotation_setting_clicked_cb (PhoshSettings *self)
{
PhoshShell *shell = phosh_shell_get_default ();
+ PhoshRotationManager *rotation_manager;
+ PhoshRotationManagerMode mode;
PhoshMonitorTransform transform;
+ gboolean locked;
g_return_if_fail (PHOSH_IS_SETTINGS (self));
- transform = phosh_shell_get_transform (shell);
- phosh_shell_set_transform (shell, transform == PHOSH_MONITOR_TRANSFORM_NORMAL
- ? PHOSH_MONITOR_TRANSFORM_270
- : PHOSH_MONITOR_TRANSFORM_NORMAL);
+
+ rotation_manager = phosh_shell_get_rotation_manager (shell);
+ g_return_if_fail (rotation_manager);
+ mode = phosh_rotation_manager_get_mode (PHOSH_ROTATION_MANAGER (rotation_manager));
+
+ switch (mode) {
+ case PHOSH_ROTATION_MANAGER_MODE_OFF:
+ transform = phosh_shell_get_transform (shell);
+ phosh_shell_set_transform (shell, transform == PHOSH_MONITOR_TRANSFORM_NORMAL
+ ? PHOSH_MONITOR_TRANSFORM_270
+ : PHOSH_MONITOR_TRANSFORM_NORMAL);
+ break;
+ case PHOSH_ROTATION_MANAGER_MODE_SENSOR:
+ locked = phosh_rotation_manager_get_orientation_locked (rotation_manager);
+ phosh_rotation_manager_set_orientation_locked (rotation_manager, !locked);
+ break;
+ default:
+ g_assert_not_reached ();
+ }
+
g_signal_emit (self, signals[SETTING_DONE], 0);
}
+static void
+rotation_setting_long_pressed_cb (PhoshSettings *self)
+{
+ PhoshShell *shell = phosh_shell_get_default ();
+ PhoshRotateInfoMode mode;
+ PhoshRotationManager *rotation_manager;
+
+ rotation_manager = phosh_shell_get_rotation_manager (shell);
+ g_return_if_fail (rotation_manager);
+
+ mode = phosh_rotation_manager_get_mode (rotation_manager);
+ switch (mode) {
+ case PHOSH_ROTATION_MANAGER_MODE_OFF:
+ mode = PHOSH_ROTATION_MANAGER_MODE_SENSOR;
+ break;
+ case PHOSH_ROTATION_MANAGER_MODE_SENSOR:
+ mode = PHOSH_ROTATION_MANAGER_MODE_OFF;
+ break;
+ default:
+ g_assert_not_reached ();
+ }
+ g_debug ("Rotation manager mode: %d", mode);
+ phosh_rotation_manager_set_mode (rotation_manager, mode);
+}
+
static void
feedback_setting_clicked_cb (PhoshSettings *self)
{
@@ -481,6 +526,7 @@ phosh_settings_class_init (PhoshSettingsClass *klass)
gtk_widget_class_bind_template_callback (widget_class, feedback_setting_long_pressed_cb);
gtk_widget_class_bind_template_callback (widget_class, on_media_player_raised);
gtk_widget_class_bind_template_callback (widget_class, rotation_setting_clicked_cb);
+ gtk_widget_class_bind_template_callback (widget_class, rotation_setting_long_pressed_cb);
gtk_widget_class_bind_template_callback (widget_class, torch_setting_clicked_cb);
gtk_widget_class_bind_template_callback (widget_class, wifi_setting_clicked_cb);
gtk_widget_class_bind_template_callback (widget_class, wwan_setting_clicked_cb);
diff --git a/src/ui/settings-menu.ui b/src/ui/settings-menu.ui
index da196806..af7ee9ce 100644
--- a/src/ui/settings-menu.ui
+++ b/src/ui/settings-menu.ui
@@ -95,6 +95,7 @@
<property name="visible">True</property>
<property name="can_focus">False</property>
<signal name="clicked" handler="rotation_setting_clicked_cb" object="PhoshSettings" swapped="yes"/>
+ <signal name="long-pressed" handler="rotation_setting_long_pressed_cb" object="PhoshSettings" swapped="yes"/>
<child>
<object class="PhoshRotateInfo" id="rotateinfo">
<property name="visible">True</property>
--
GitLab
From 48235828793eb44971e59a725cfaab7a9102ea65 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Guido=20G=C3=BCnther?= <agx@sigxcpu.org>
Date: Fri, 26 Mar 2021 10:00:37 +0100
Subject: [PATCH 10/19] Move Lockscreen rotation fixup to rotation-manager
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
No need to have several objects involved. This avoids
lockscreen and rotation manager racing since we can
do it past the unclaim of the accelerometer.
Signed-off-by: Guido Günther <guido.gunther@puri.sm>
---
src/lockscreen-manager.c | 38 -------------------
src/rotation-manager.c | 82 +++++++++++++++++++++++++++++++++++++++-
2 files changed, 80 insertions(+), 40 deletions(-)
diff --git a/src/lockscreen-manager.c b/src/lockscreen-manager.c
index 54041c5c..0c8c16b0 100644
--- a/src/lockscreen-manager.c
+++ b/src/lockscreen-manager.c
@@ -77,10 +77,6 @@ lockscreen_unlock_cb (PhoshLockscreenManager *self, PhoshLockscreen *lockscreen)
g_return_if_fail (PHOSH_IS_LOCKSCREEN (lockscreen));
g_return_if_fail (lockscreen == PHOSH_LOCKSCREEN (self->lockscreen));
- /* Fixup transform in case the lockscreen needed to rotate to unlock */
- g_debug ("Restoring transform %d", self->transform);
- phosh_shell_set_transform (shell, self->transform);
-
g_signal_handlers_disconnect_by_data (monitor_manager, self);
g_signal_handlers_disconnect_by_data (primary_monitor, self);
g_signal_handlers_disconnect_by_data (shell, self);
@@ -171,35 +167,6 @@ on_monitor_added (PhoshLockscreenManager *self,
lock_monitor (self, monitor);
}
-static void
-on_primary_monitor_power_mode_changed (PhoshLockscreenManager *self,
- GParamSpec *pspec,
- PhoshMonitor *monitor)
-{
- PhoshShell *shell = phosh_shell_get_default ();
- PhoshModeManager *mode_manager = phosh_shell_get_mode_manager(shell);
-
- /*
- * Only phones need to switch orientation so that the lock screen fits
- * https://source.puri.sm/Librem5/phosh/-/issues/388
- */
- if (phosh_mode_manager_get_device_type(mode_manager) != PHOSH_MODE_DEVICE_TYPE_PHONE)
- return;
-
- /* Don't mess with transforms on external screens either */
- if (!phosh_monitor_is_builtin (monitor))
- return;
-
- switch (phosh_monitor_get_power_save_mode (monitor)) {
- case PHOSH_MONITOR_POWER_SAVE_MODE_ON:
- phosh_shell_set_transform (shell, PHOSH_MONITOR_TRANSFORM_NORMAL);
- break;
- case PHOSH_MONITOR_POWER_SAVE_MODE_OFF:
- break;
- default:
- g_warn_if_reached ();
- }
-}
static void
lock_primary_monitor (PhoshLockscreenManager *self)
@@ -209,7 +176,6 @@ lock_primary_monitor (PhoshLockscreenManager *self)
PhoshShell *shell = phosh_shell_get_default ();
primary_monitor = phosh_shell_get_primary_monitor (shell);
- self->transform = phosh_shell_get_transform (shell);
/* The primary output gets the clock, keypad, ... */
self->lockscreen = PHOSH_LOCKSCREEN (phosh_lockscreen_new (
@@ -222,10 +188,6 @@ lock_primary_monitor (PhoshLockscreenManager *self)
"swapped-object-signal::wakeup-output", G_CALLBACK (lockscreen_wakeup_output_cb), self,
NULL);
- g_signal_connect_swapped (primary_monitor, "notify::power-mode",
- G_CALLBACK(on_primary_monitor_power_mode_changed),
- self);
-
gtk_widget_show (GTK_WIDGET (self->lockscreen));
/* Old lockscreen gets remove due to `layer_surface_closed` */
}
diff --git a/src/rotation-manager.c b/src/rotation-manager.c
index ba847553..b22b58de 100644
--- a/src/rotation-manager.c
+++ b/src/rotation-manager.c
@@ -47,6 +47,7 @@ typedef struct _PhoshRotationManager {
PhoshSensorProxyManager *sensor_proxy_manager;
PhoshLockscreenManager *lockscreen_manager;
PhoshMonitor *monitor;
+ PhoshMonitorTransform prelock_transform;
GSettings *settings;
gboolean orientation_locked;
@@ -210,6 +211,67 @@ on_has_accelerometer_changed (PhoshRotationManager *self,
phosh_rotation_manager_set_mode (self, mode);
}
+/**
+ * fixup_lockscreen_orientation:
+ * @self: The PhoshRotationManager
+ * @force: Whether to force the monitor to normal orientation
+ *
+ * On phones the lock screen doesn't work in landscape so fix that
+ * until https://source.puri.sm/Librem5/phosh/-/issues/388
+ * is fixed. Keep all of this local to this function.
+ */
+static void
+fixup_lockscreen_orientation (PhoshRotationManager *self, gboolean force)
+{
+ PhoshShell *shell = phosh_shell_get_default ();
+ PhoshModeManager *mode_manager = phosh_shell_get_mode_manager(shell);
+
+ g_return_if_fail (PHOSH_IS_MODE_MANAGER (mode_manager));
+ g_return_if_fail (PHOSH_IS_MONITOR (self->monitor));
+
+ /* Only bother on phones */
+ if (phosh_mode_manager_get_device_type(mode_manager) != PHOSH_MODE_DEVICE_TYPE_PHONE &&
+ phosh_mode_manager_get_device_type(mode_manager) != PHOSH_MODE_DEVICE_TYPE_UNKNOWN)
+ return;
+
+ /* Don't mess with transforms on external screens either */
+ if (!phosh_monitor_is_builtin (self->monitor))
+ return;
+
+ if (phosh_lockscreen_manager_get_locked (self->lockscreen_manager)) {
+ if (force) {
+ g_debug ("Forcing normal transform");
+ apply_transform (self, PHOSH_MONITOR_TRANSFORM_NORMAL);
+ } else {
+ self->prelock_transform = phosh_monitor_get_transform (self->monitor);
+ g_debug ("Saving transform %d", self->prelock_transform);
+ }
+ } else {
+ g_debug ("Restoring transform %d", self->prelock_transform);
+ apply_transform (self, self->prelock_transform);
+ }
+}
+
+
+static void
+on_power_mode_changed (PhoshRotationManager *self,
+ GParamSpec *pspec,
+ PhoshMonitor *monitor)
+{
+ PhoshMonitorPowerSaveMode mode;
+
+ g_return_if_fail (PHOSH_IS_ROTATION_MANAGER (self));
+ g_return_if_fail (PHOSH_IS_MONITOR (monitor));
+
+ mode = phosh_monitor_get_power_save_mode (monitor);
+ g_debug ("Mode: %d", mode);
+ if (mode != PHOSH_MONITOR_POWER_SAVE_MODE_ON)
+ return;
+
+ fixup_lockscreen_orientation (self, TRUE);
+}
+
+
static void
on_lockscreen_manager_locked (PhoshRotationManager *self, GParamSpec *pspec,
PhoshLockscreenManager *lockscreen_manager)
@@ -225,6 +287,8 @@ on_lockscreen_manager_locked (PhoshRotationManager *self, GParamSpec *pspec,
claim = !phosh_lockscreen_manager_get_locked (self->lockscreen_manager);
phosh_rotation_manager_claim_accelerometer (self, claim);
+
+ fixup_lockscreen_orientation (self, FALSE);
}
static void
@@ -321,8 +385,17 @@ phosh_rotation_manager_constructed (GObject *object)
self);
on_lockscreen_manager_locked (self, NULL, self->lockscreen_manager);
- if (!self->sensor_proxy_manager)
+ g_signal_connect_swapped (self->monitor,
+ "notify::power-mode",
+ (GCallback) on_power_mode_changed,
+ self);
+ on_power_mode_changed (self, NULL, self->monitor);
+
+
+ if (!self->sensor_proxy_manager) {
+ g_warning ("Got not sensor-proxy, no automatic rotation");
return;
+ }
g_signal_connect_swapped (self->sensor_proxy_manager,
"notify::accelerometer-orientation",
@@ -358,7 +431,12 @@ phosh_rotation_manager_dispose (GObject *object)
self);
g_clear_object (&self->lockscreen_manager);
}
- g_clear_object (&self->monitor);
+
+ if (self->monitor) {
+ g_signal_handlers_disconnect_by_data (self->monitor,
+ self);
+ g_clear_object (&self->monitor);
+ }
G_OBJECT_CLASS (phosh_rotation_manager_parent_class)->dispose (object);
}
--
GitLab
From e4fd28cd54c1a03c9afb1ca209eda0bd333089ee Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Guido=20G=C3=BCnther?= <agx@sigxcpu.org>
Date: Fri, 26 Mar 2021 10:14:54 +0100
Subject: [PATCH 11/19] settings: Use rotation-manager instead of shell to
rotate output
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
This makes sure the same output is rotated via manual rotation and
sensor.
Signed-off-by: Guido Günther <guido.gunther@puri.sm>
---
src/settings.c | 7 +++----
1 file changed, 3 insertions(+), 4 deletions(-)
diff --git a/src/settings.c b/src/settings.c
index 57d48182..54a60d9a 100644
--- a/src/settings.c
+++ b/src/settings.c
@@ -96,10 +96,9 @@ rotation_setting_clicked_cb (PhoshSettings *self)
switch (mode) {
case PHOSH_ROTATION_MANAGER_MODE_OFF:
- transform = phosh_shell_get_transform (shell);
- phosh_shell_set_transform (shell, transform == PHOSH_MONITOR_TRANSFORM_NORMAL
- ? PHOSH_MONITOR_TRANSFORM_270
- : PHOSH_MONITOR_TRANSFORM_NORMAL);
+ transform = phosh_rotation_manager_get_transform (rotation_manager) ?
+ PHOSH_MONITOR_TRANSFORM_NORMAL : PHOSH_MONITOR_TRANSFORM_270;
+ phosh_rotation_manager_set_transform (rotation_manager, transform);
break;
case PHOSH_ROTATION_MANAGER_MODE_SENSOR:
locked = phosh_rotation_manager_get_orientation_locked (rotation_manager);
--
GitLab
From 7e574bd2ccaad5861d1c8f8d22ade1f2f96207cc Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Guido=20G=C3=BCnther?= <agx@sigxcpu.org>
Date: Fri, 26 Mar 2021 10:31:31 +0100
Subject: [PATCH 12/19] rotateinfo: Use monitor form rotation-manager
consistently
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
So far this was dependent on mode
Signed-off-by: Guido Günther <guido.gunther@puri.sm>
---
src/rotateinfo.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/src/rotateinfo.c b/src/rotateinfo.c
index 1227d65d..ecfc9cf3 100644
--- a/src/rotateinfo.c
+++ b/src/rotateinfo.c
@@ -35,8 +35,7 @@ G_DEFINE_TYPE (PhoshRotateInfo, phosh_rotate_info, PHOSH_TYPE_STATUS_ICON)
static void
on_transform_changed (PhoshRotateInfo *self)
{
- PhoshShell *shell = phosh_shell_get_default ();
- PhoshMonitor *monitor = phosh_shell_get_primary_monitor (shell);
+ PhoshMonitor *monitor;
gboolean monitor_is_landscape;
gboolean portrait;
@@ -44,7 +43,7 @@ on_transform_changed (PhoshRotateInfo *self)
return;
}
- switch (phosh_shell_get_transform (shell)) {
+ switch (phosh_rotation_manager_get_transform (self->manager)) {
case PHOSH_MONITOR_TRANSFORM_NORMAL:
case PHOSH_MONITOR_TRANSFORM_FLIPPED:
case PHOSH_MONITOR_TRANSFORM_180:
@@ -63,6 +62,7 @@ on_transform_changed (PhoshRotateInfo *self)
}
/* If we have a landscape monitor (tv, laptop) flip the rotation */
+ monitor = phosh_rotation_manager_get_monitor (self->manager);
monitor_is_landscape = ((double)monitor->width / (double)monitor->height) > 1.0;
portrait = monitor_is_landscape ? !portrait : portrait;
--
GitLab
From 9e56eb92a30f6d25d44294bc9221a1818c6ea8b6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Guido=20G=C3=BCnther?= <agx@sigxcpu.org>
Date: Fri, 26 Mar 2021 10:31:31 +0100
Subject: [PATCH 13/19] rotateinfo: Use monitor form rotation-manager
consistently
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Priort to the rotation-manager this incorrectly tracked the primary
monitor, track the rotated monitor instead.
Signed-off-by: Guido Günther <guido.gunther@puri.sm>
---
src/rotateinfo.c | 2 +-
src/rotation-manager.c | 38 ++++++++++++++++++++++++++++++++++++++
2 files changed, 39 insertions(+), 1 deletion(-)
diff --git a/src/rotateinfo.c b/src/rotateinfo.c
index ecfc9cf3..149b5d4d 100644
--- a/src/rotateinfo.c
+++ b/src/rotateinfo.c
@@ -128,7 +128,7 @@ phosh_rotate_info_init (PhoshRotateInfo *self)
self->manager = phosh_shell_get_rotation_manager (phosh_shell_get_default());
/* We don't use property bindings since we flip info/icon based on rotation and lock */
- g_signal_connect_object (phosh_shell_get_default (),
+ g_signal_connect_object (self->manager,
"notify::transform",
G_CALLBACK (on_transform_changed),
self,
diff --git a/src/rotation-manager.c b/src/rotation-manager.c
index b22b58de..1a4263d9 100644
--- a/src/rotation-manager.c
+++ b/src/rotation-manager.c
@@ -36,6 +36,7 @@ enum {
PROP_ORIENTATION_LOCKED,
PROP_MONITOR,
PROP_MODE,
+ PROP_TRANSFORM,
LAST_PROP,
};
static GParamSpec *props[LAST_PROP];
@@ -47,6 +48,7 @@ typedef struct _PhoshRotationManager {
PhoshSensorProxyManager *sensor_proxy_manager;
PhoshLockscreenManager *lockscreen_manager;
PhoshMonitor *monitor;
+ PhoshMonitorTransform transform;
PhoshMonitorTransform prelock_transform;
GSettings *settings;
@@ -302,6 +304,26 @@ on_accelerometer_orientation_changed (PhoshRotationManager *self,
match_orientation (self);
}
+
+static void
+on_monitor_configured (PhoshRotationManager *self,
+ PhoshMonitor *monitor)
+{
+ PhoshMonitorTransform transform;
+
+ g_return_if_fail (PHOSH_IS_ROTATION_MANAGER (self));
+ g_return_if_fail (PHOSH_IS_MONITOR (monitor));
+
+ transform = phosh_monitor_get_transform (monitor);
+ if (transform == self->transform)
+ return;
+
+ self->transform = transform;
+ g_debug ("Rotation-manager transform %d", transform);
+ g_object_notify_by_pspec (G_OBJECT (self), props[PROP_TRANSFORM]);
+}
+
+
static void
phosh_rotation_manager_set_property (GObject *object,
guint property_id,
@@ -357,6 +379,9 @@ phosh_rotation_manager_get_property (GObject *object,
case PROP_MODE:
g_value_set_enum (value, self->mode);
break;
+ case PROP_TRANSFORM:
+ g_value_set_enum (value, self->transform);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
break;
@@ -391,6 +416,11 @@ phosh_rotation_manager_constructed (GObject *object)
self);
on_power_mode_changed (self, NULL, self->monitor);
+ g_signal_connect_swapped (self->monitor,
+ "configured",
+ G_CALLBACK (on_monitor_configured),
+ self);
+ on_monitor_configured (self, self->monitor);
if (!self->sensor_proxy_manager) {
g_warning ("Got not sensor-proxy, no automatic rotation");
@@ -493,6 +523,14 @@ phosh_rotation_manager_class_init (PhoshRotationManagerClass *klass)
PHOSH_ROTATION_MANAGER_MODE_OFF,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
+ props[PROP_TRANSFORM] =
+ g_param_spec_enum ("transform",
+ "Transform",
+ "Monitor transform of the rotation monitor",
+ PHOSH_TYPE_MONITOR_TRANSFORM,
+ PHOSH_MONITOR_TRANSFORM_NORMAL,
+ G_PARAM_READABLE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS);
+
g_object_class_install_properties (object_class, LAST_PROP, props);
}
--
GitLab
From 54f2e80e2a5b5e977130aaf005deb26ddf232db9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Guido=20G=C3=BCnther?= <agx@sigxcpu.org>
Date: Fri, 26 Mar 2021 10:45:19 +0100
Subject: [PATCH 14/19] shell: Drop transform handling
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
This is done by the rotation-manager which always acts on the
given monitor.
Closes: #56
Signed-off-by: Guido Günther <guido.gunther@puri.sm>
---
src/shell.c | 36 ------------------------------------
src/shell.h | 2 --
2 files changed, 38 deletions(-)
diff --git a/src/shell.c b/src/shell.c
index 57caff0d..3fcd83ba 100644
--- a/src/shell.c
+++ b/src/shell.c
@@ -512,10 +512,6 @@ setup_idle_cb (PhoshShell *self)
g_getenv ("DESKTOP_AUTOSTART_ID"));
g_unsetenv ("DESKTOP_AUTOSTART_ID");
- /* If we start rotated, fix this up */
- if (phosh_shell_get_transform (self) != PHOSH_MONITOR_TRANSFORM_NORMAL)
- phosh_shell_set_transform (self, PHOSH_MONITOR_TRANSFORM_NORMAL);
-
priv->gnome_shell_manager = phosh_gnome_shell_manager_get_default ();
priv->startup_finished = TRUE;
@@ -772,38 +768,6 @@ phosh_shell_init (PhoshShell *self)
}
-PhoshMonitorTransform
-phosh_shell_get_transform (PhoshShell *self)
-{
- PhoshShellPrivate *priv;
-
- g_return_val_if_fail (PHOSH_IS_SHELL (self), PHOSH_MONITOR_TRANSFORM_NORMAL);
- priv = phosh_shell_get_instance_private (self);
- g_return_val_if_fail (priv->primary_monitor, PHOSH_MONITOR_TRANSFORM_NORMAL);
- return phosh_monitor_get_transform (priv->primary_monitor);
-}
-
-
-void
-phosh_shell_set_transform (PhoshShell *self,
- PhoshMonitorTransform transform)
-{
- PhoshShellPrivate *priv = phosh_shell_get_instance_private (self);
- PhoshMonitorTransform current;
-
- g_return_if_fail (priv->primary_monitor);
- current = phosh_monitor_get_transform (priv->primary_monitor);
- if (current == transform)
- return;
-
- phosh_monitor_manager_set_monitor_transform (priv->monitor_manager,
- priv->primary_monitor,
- transform);
- phosh_monitor_manager_apply_monitor_config (priv->monitor_manager);
- /* Notification change signalled in on_primary_monitor_configured */
-}
-
-
void
phosh_shell_set_primary_monitor (PhoshShell *self, PhoshMonitor *monitor)
{
diff --git a/src/shell.h b/src/shell.h
index d7cfcdbd..d7aee9d5 100644
--- a/src/shell.h
+++ b/src/shell.h
@@ -57,8 +57,6 @@ G_BEGIN_DECLS
G_DECLARE_FINAL_TYPE (PhoshShell, phosh_shell, PHOSH, SHELL, GObject)
PhoshShell *phosh_shell_get_default (void);
-void phosh_shell_set_transform (PhoshShell *self, PhoshMonitorTransform transform);
-PhoshMonitorTransform phosh_shell_get_transform (PhoshShell *self);
void phosh_shell_get_usable_area (PhoshShell *self,
int *x,
int *y,
--
GitLab
From 1b08c29410e6eb5327b59928226e2d62e6707384 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Guido=20G=C3=BCnther?= <agx@sigxcpu.org>
Date: Fri, 26 Mar 2021 15:01:24 +0100
Subject: [PATCH 15/19] rotation-manager: Mess with transform as little as
possible
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
On phones when we're already using portrait orientation don't bother
fixing this up. This allows for e.g. upside down operation.
Signed-off-by: Guido Günther <guido.gunther@puri.sm>
---
src/rotation-manager.c | 12 ++++++++----
1 file changed, 8 insertions(+), 4 deletions(-)
diff --git a/src/rotation-manager.c b/src/rotation-manager.c
index 1a4263d9..c5d8d541 100644
--- a/src/rotation-manager.c
+++ b/src/rotation-manager.c
@@ -216,9 +216,9 @@ on_has_accelerometer_changed (PhoshRotationManager *self,
/**
* fixup_lockscreen_orientation:
* @self: The PhoshRotationManager
- * @force: Whether to force the monitor to normal orientation
+ * @force: Whether to force the monitor to portait orientation
*
- * On phones the lock screen doesn't work in landscape so fix that
+ * On phones the lock screen doesn't work in landscape so fix that up
* until https://source.puri.sm/Librem5/phosh/-/issues/388
* is fixed. Keep all of this local to this function.
*/
@@ -242,8 +242,12 @@ fixup_lockscreen_orientation (PhoshRotationManager *self, gboolean force)
if (phosh_lockscreen_manager_get_locked (self->lockscreen_manager)) {
if (force) {
- g_debug ("Forcing normal transform");
- apply_transform (self, PHOSH_MONITOR_TRANSFORM_NORMAL);
+ PhoshMonitorTransform transform;
+ /* Use prelock transform if portrait, else use normal */
+ transform = (self->prelock_transform % 2) == 0 ? self->prelock_transform :
+ PHOSH_MONITOR_TRANSFORM_NORMAL;
+ g_debug ("Forcing portrait transform: %d", transform);
+ apply_transform (self, transform);
} else {
self->prelock_transform = phosh_monitor_get_transform (self->monitor);
g_debug ("Saving transform %d", self->prelock_transform);
--
GitLab
From 6e306eca5bfa8a73f53d99bbce9de123b8e1e595 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Guido=20G=C3=BCnther?= <agx@sigxcpu.org>
Date: Sun, 28 Mar 2021 19:27:06 +0200
Subject: [PATCH 16/19] settings: Don't close menu when toggling rotation lock
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
This makes it consistent with other toggles like feedback toggle.
Signed-off-by: Guido Günther <guido.gunther@puri.sm>
---
src/settings.c | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/src/settings.c b/src/settings.c
index 54a60d9a..81a095c9 100644
--- a/src/settings.c
+++ b/src/settings.c
@@ -99,6 +99,7 @@ rotation_setting_clicked_cb (PhoshSettings *self)
transform = phosh_rotation_manager_get_transform (rotation_manager) ?
PHOSH_MONITOR_TRANSFORM_NORMAL : PHOSH_MONITOR_TRANSFORM_270;
phosh_rotation_manager_set_transform (rotation_manager, transform);
+ g_signal_emit (self, signals[SETTING_DONE], 0);
break;
case PHOSH_ROTATION_MANAGER_MODE_SENSOR:
locked = phosh_rotation_manager_get_orientation_locked (rotation_manager);
@@ -107,8 +108,6 @@ rotation_setting_clicked_cb (PhoshSettings *self)
default:
g_assert_not_reached ();
}
-
- g_signal_emit (self, signals[SETTING_DONE], 0);
}
static void
--
GitLab
From e7727ada0a5a9c9e3e197af914be145d1d735525 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Guido=20G=C3=BCnther?= <agx@sigxcpu.org>
Date: Mon, 29 Mar 2021 17:18:16 +0200
Subject: [PATCH 17/19] monitor: Update org.gnome.Mutter.DisplayConfig
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
This is from mutter's 331b5f356311f1dcfc1b580e349a60d25fc0e34f
Signed-off-by: Guido Günther <guido.gunther@puri.sm>
---
src/monitor/org.gnome.Mutter.DisplayConfig.xml | 16 +++++++++++-----
1 file changed, 11 insertions(+), 5 deletions(-)
diff --git a/src/monitor/org.gnome.Mutter.DisplayConfig.xml b/src/monitor/org.gnome.Mutter.DisplayConfig.xml
index fe8e0229..044244e4 100644
--- a/src/monitor/org.gnome.Mutter.DisplayConfig.xml
+++ b/src/monitor/org.gnome.Mutter.DisplayConfig.xml
@@ -101,7 +101,7 @@
or not
- "presentation" (b): whether this output is
for presentation only
- Note: properties might be ignored if not consistenly
+ Note: properties might be ignored if not consistently
applied to all outputs in the same clone group. In
general, it's expected that presentation or primary
outputs will not be cloned.
@@ -282,6 +282,14 @@
-->
<property name="PowerSaveMode" type="i" access="readwrite" />
+ <!--
+ PanelOrientationManaged:
+
+ Whether the built-in panel orientation is automatically managed
+ by mutter.
+ -->
+ <property name="PanelOrientationManaged" type="b" access="read" />
+
<!--
MonitorsChanged:
@@ -360,13 +368,13 @@
@layout_mode current layout mode represents the way logical monitors
- are layed out on the screen. Possible modes include:
+ are laid out on the screen. Possible modes include:
1 : physical
2 : logical
With physical layout mode, each logical monitor has the same dimensions
- an the monitor modes of the associated monitors assigned to it, no
+ as the monitor modes of the associated monitors assigned to it, no
matter what scale is in use.
With logical mode, the dimension of a logical monitor is the dimension
@@ -375,8 +383,6 @@
Possible @properties are:
- * "supports-mirroring" (b): FALSE if mirroring not supported; TRUE or not
- present if mirroring is supported.
* "layout-mode" (u): Represents in what way logical monitors are laid
out on the screen. The layout mode can be either
of the ones listed below. Absence of this property
--
GitLab
From e6da469f85aceb5f2b289e08cf0cde34465b1bc4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Guido=20G=C3=BCnther?= <agx@sigxcpu.org>
Date: Tue, 30 Mar 2021 10:05:18 +0200
Subject: [PATCH 18/19] monitor-manager: Drop supports-mirroring prop
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
It got removed with the DisplayConfig interface update. Mutter doesn't
use it anymore, g-c-c still parses it but doesn't use it in 3.38.
Signed-off-by: Guido Günther <guido.gunther@puri.sm>
---
src/monitor-manager.c | 3 ---
1 file changed, 3 deletions(-)
diff --git a/src/monitor-manager.c b/src/monitor-manager.c
index 6e48ce26..d42f8c40 100644
--- a/src/monitor-manager.c
+++ b/src/monitor-manager.c
@@ -657,9 +657,6 @@ phosh_monitor_manager_handle_get_current_state (
}
g_variant_builder_init (&properties_builder, G_VARIANT_TYPE ("a{sv}"));
- g_variant_builder_add (&properties_builder, "{sv}",
- "supports-mirroring",
- g_variant_new_boolean (FALSE));
g_variant_builder_add (&properties_builder, "{sv}",
"layout-mode",
--
GitLab
From eb058976e1ef8699565e221f922ec953c017fd74 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Guido=20G=C3=BCnther?= <agx@sigxcpu.org>
Date: Mon, 29 Mar 2021 18:22:33 +0200
Subject: [PATCH 19/19] monitor-manager: Handle panel-orientation-managed
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Closes: #540
Signed-off-by: Guido Günther <guido.gunther@puri.sm>
---
src/monitor-manager.c | 75 +++++++++++++++++++++++++++++++++++++++++--
src/monitor-manager.h | 8 +++--
src/shell.c | 4 ++-
3 files changed, 82 insertions(+), 5 deletions(-)
diff --git a/src/monitor-manager.c b/src/monitor-manager.c
index d42f8c40..7ee30ed2 100644
--- a/src/monitor-manager.c
+++ b/src/monitor-manager.c
@@ -37,6 +37,7 @@ typedef enum PhoshMonitorMAnagerLayoutMode {
enum {
PROP_0,
+ PROP_SENSOR_PROXY_MANAGER,
PROP_N_MONITORS,
PROP_LAST_PROP
};
@@ -56,6 +57,9 @@ typedef struct _PhoshMonitorManager
{
PhoshDisplayDbusDisplayConfigSkeleton parent;
+ PhoshSensorProxyManager *sensor_proxy_manager;
+ GBinding *sensor_proxy_binding;
+
GPtrArray *monitors; /* Currently known monitors */
GPtrArray *heads; /* Currently known heads */
@@ -1175,6 +1179,18 @@ static const struct zwlr_output_configuration_v1_listener config_listener = {
};
+static void
+phosh_monitor_manager_dispose (GObject *object)
+{
+ PhoshMonitorManager *self = PHOSH_MONITOR_MANAGER (object);
+
+ g_clear_object (&self->sensor_proxy_manager);
+ g_clear_pointer (&self->sensor_proxy_binding, g_binding_unbind);
+
+ G_OBJECT_CLASS (phosh_monitor_manager_parent_class)->dispose (object);
+}
+
+
static void
phosh_monitor_manager_finalize (GObject *object)
{
@@ -1190,6 +1206,25 @@ phosh_monitor_manager_finalize (GObject *object)
* PhoshMonitorManager Class
*/
+static void
+phosh_monitor_manager_set_property (GObject *object,
+ guint property_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ PhoshMonitorManager *self = PHOSH_MONITOR_MANAGER (object);
+
+ switch (property_id) {
+ case PROP_SENSOR_PROXY_MANAGER:
+ phosh_monitor_manager_set_sensor_proxy_manager (self, g_value_get_object (value));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+ break;
+ }
+}
+
+
static void
phosh_monitor_manager_get_property (GObject *object,
guint property_id,
@@ -1199,6 +1234,9 @@ phosh_monitor_manager_get_property (GObject *object,
PhoshMonitorManager *self = PHOSH_MONITOR_MANAGER (object);
switch (property_id) {
+ case PROP_SENSOR_PROXY_MANAGER:
+ g_value_set_object (value, self->sensor_proxy_manager);
+ break;
case PROP_N_MONITORS:
g_value_set_int (value, self->monitors->len);
break;
@@ -1265,8 +1303,18 @@ phosh_monitor_manager_class_init (PhoshMonitorManagerClass *klass)
GObjectClass *object_class = G_OBJECT_CLASS (klass);
object_class->constructed = phosh_monitor_manager_constructed;
+ object_class->dispose = phosh_monitor_manager_dispose;
object_class->finalize = phosh_monitor_manager_finalize;
object_class->get_property = phosh_monitor_manager_get_property;
+ object_class->set_property = phosh_monitor_manager_set_property;
+
+ props[PROP_SENSOR_PROXY_MANAGER] =
+ g_param_spec_object ("sensor-proxy-manager",
+ "Sensor Proxy Manager",
+ "Sensor Proxy Manager",
+ PHOSH_TYPE_SENSOR_PROXY_MANAGER,
+ G_PARAM_READWRITE |
+ G_PARAM_STATIC_STRINGS);
props[PROP_N_MONITORS] =
g_param_spec_int ("n-monitors",
@@ -1322,9 +1370,11 @@ phosh_monitor_manager_init (PhoshMonitorManager *self)
PhoshMonitorManager *
-phosh_monitor_manager_new (void)
+phosh_monitor_manager_new (PhoshSensorProxyManager *proxy)
{
- return g_object_new (PHOSH_TYPE_MONITOR_MANAGER, NULL);
+ return g_object_new (PHOSH_TYPE_MONITOR_MANAGER,
+ "sensor-proxy-manager", proxy,
+ NULL);
}
@@ -1444,3 +1494,24 @@ phosh_monitor_manager_apply_monitor_config (PhoshMonitorManager *self)
zwlr_output_configuration_v1_apply (config);
}
+
+void
+phosh_monitor_manager_set_sensor_proxy_manager (PhoshMonitorManager *self,
+ PhoshSensorProxyManager *manager)
+{
+ g_return_if_fail (PHOSH_IS_MONITOR_MANAGER (self));
+ g_return_if_fail (PHOSH_IS_SENSOR_PROXY_MANAGER (manager) || manager == NULL);
+
+ g_clear_object (&self->sensor_proxy_manager);
+ g_clear_pointer (&self->sensor_proxy_binding, g_binding_unbind);
+
+ if (manager == NULL)
+ return;
+
+ self->sensor_proxy_manager = g_object_ref (manager);
+ self->sensor_proxy_binding = g_object_bind_property (manager, "has-accelerometer",
+ self, "panel-orientation-managed",
+ G_BINDING_SYNC_CREATE);
+
+
+}
diff --git a/src/monitor-manager.h b/src/monitor-manager.h
index a986d1cf..cfd10281 100644
--- a/src/monitor-manager.h
+++ b/src/monitor-manager.h
@@ -9,6 +9,9 @@
#include "monitor/phosh-display-dbus.h"
#include "monitor/monitor.h"
+
+#include "sensor-proxy-manager.h"
+
#include <glib-object.h>
G_BEGIN_DECLS
@@ -32,7 +35,7 @@ typedef enum _MetaMonitorsConfigMethod
G_DECLARE_FINAL_TYPE (PhoshMonitorManager, phosh_monitor_manager, PHOSH, MONITOR_MANAGER,
PhoshDisplayDbusDisplayConfigSkeleton)
-PhoshMonitorManager * phosh_monitor_manager_new (void);
+PhoshMonitorManager * phosh_monitor_manager_new (PhoshSensorProxyManager *proxy);
void phosh_monitor_manager_add_monitor (PhoshMonitorManager *self,
PhoshMonitor *monitor);
PhoshMonitor * phosh_monitor_manager_get_monitor (PhoshMonitorManager *self,
@@ -46,5 +49,7 @@ void phosh_monitor_mana
void phosh_monitor_manager_apply_monitor_config (PhoshMonitorManager *self);
void phosh_monitor_manager_set_power_save_mode (PhoshMonitorManager *self,
PhoshMonitorPowerSaveMode mode);
+void phosh_monitor_manager_set_sensor_proxy_manager (PhoshMonitorManager *self,
+ PhoshSensorProxyManager *manager);
G_END_DECLS
diff --git a/src/shell.c b/src/shell.c
index 3fcd83ba..0330f570 100644
--- a/src/shell.c
+++ b/src/shell.c
@@ -503,6 +503,8 @@ setup_idle_cb (PhoshShell *self)
if (priv->sensor_proxy_manager) {
priv->proximity = phosh_proximity_new (priv->sensor_proxy_manager,
priv->lockscreen_manager);
+ phosh_monitor_manager_set_sensor_proxy_manager (priv->monitor_manager,
+ priv->sensor_proxy_manager);
}
priv->mount_manager = phosh_mount_manager_new ();
@@ -652,7 +654,7 @@ phosh_shell_constructed (GObject *object)
priv->toplevel_manager = phosh_toplevel_manager_new ();
priv->transform = -1; /* force initial update */
- priv->monitor_manager = phosh_monitor_manager_new ();
+ priv->monitor_manager = phosh_monitor_manager_new (NULL);
g_signal_connect_swapped (priv->monitor_manager,
"monitor-removed",
G_CALLBACK (on_monitor_removed),
--
GitLab