From 0c015ed8090d37efb8306238170b65b110d7e3db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Guido=20G=C3=BCnther?= Date: Mon, 3 Jun 2019 17:18:42 +0200 Subject: [PATCH 1/8] Use #pragma in all headers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Guido Günther --- src/background.h | 5 +---- src/favorites.h | 5 +---- src/settings.h | 5 +---- src/shell.h | 4 +--- 4 files changed, 4 insertions(+), 15 deletions(-) diff --git a/src/background.h b/src/background.h index 11359b5a..f18e9029 100644 --- a/src/background.h +++ b/src/background.h @@ -4,8 +4,7 @@ * SPDX-License-Identifier: GPL-3.0+ */ -#ifndef PHOSH_BACKGROUND_H -#define PHOSH_BACKGROUND_H +#pragma once #include #include "layersurface.h" @@ -15,5 +14,3 @@ G_DECLARE_FINAL_TYPE (PhoshBackground, phosh_background, PHOSH, BACKGROUND, PhoshLayerSurface) GtkWidget *phosh_background_new (gpointer layer_shell, gpointer wl_output, guint width, guint height); - -#endif /* PHOSH_BACKGROUND_H */ diff --git a/src/favorites.h b/src/favorites.h index 5744b76d..db1e72ac 100644 --- a/src/favorites.h +++ b/src/favorites.h @@ -4,8 +4,7 @@ * SPDX-License-Identifier: GPL-3.0+ */ -#ifndef PHOSH_FAVORITES_H -#define PHOSH_FAVORITES_H +#pragma once #include @@ -14,5 +13,3 @@ G_DECLARE_FINAL_TYPE (PhoshFavorites, phosh_favorites, PHOSH, FAVORITES, GtkWindow) GtkWidget * phosh_favorites_new (void); - -#endif /* PHOSH_FAVORITES_H */ diff --git a/src/settings.h b/src/settings.h index a0d289c2..43666849 100644 --- a/src/settings.h +++ b/src/settings.h @@ -4,8 +4,7 @@ * SPDX-License-Identifier: GPL-3.0+ */ -#ifndef PHOSH_SETTINGS_H -#define PHOSH_SETTINGS_H +#pragma once #include @@ -14,5 +13,3 @@ G_DECLARE_FINAL_TYPE (PhoshSettings, phosh_settings, PHOSH, SETTINGS, GtkWindow) GtkWidget * phosh_settings_new (void); - -#endif /* PHOSH_SETTINGS_H */ diff --git a/src/shell.h b/src/shell.h index c8078ec5..af98c0da 100644 --- a/src/shell.h +++ b/src/shell.h @@ -5,8 +5,7 @@ * Author: Guido Günther */ -#ifndef PHOSH_H -#define PHOSH_H +#pragma once #include "monitor-manager.h" #include "monitor/monitor.h" @@ -33,4 +32,3 @@ void phosh_shell_set_primary_monitor (PhoshShell *self, PhoshMon PhoshMonitor *phosh_shell_get_primary_monitor (PhoshShell *self); PhoshMonitorManager *phosh_shell_get_monitor_manager (PhoshShell *self); PhoshWifiManager *phosh_shell_get_wifi_manager (PhoshShell *self); -#endif /* PHOSH_H */ -- GitLab From ccef631b9ec60eaf81669a5e93972274a4124744 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Guido=20G=C3=BCnther?= Date: Mon, 3 Jun 2019 16:39:47 +0200 Subject: [PATCH 2/8] Add PhoshOskManager MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Class to handle OSK interaction. Signed-off-by: Guido Günther --- src/meson.build | 2 + src/osk-manager.c | 284 ++++++++++++++++++++++++++++++++++++++++++++++ src/osk-manager.h | 22 ++++ 3 files changed, 308 insertions(+) create mode 100644 src/osk-manager.c create mode 100644 src/osk-manager.h diff --git a/src/meson.build b/src/meson.build index 778bd9a8..5e789353 100644 --- a/src/meson.build +++ b/src/meson.build @@ -42,6 +42,8 @@ phosh_sources = [ 'main.c', 'monitor-manager.c', 'monitor-manager.h', + 'osk-manager.c', + 'osk-manager.h', 'session.c', 'session.h', 'session-presence.c', diff --git a/src/osk-manager.c b/src/osk-manager.c new file mode 100644 index 00000000..7f66f3d9 --- /dev/null +++ b/src/osk-manager.c @@ -0,0 +1,284 @@ +/* + * Copyright (C) 2018 Purism SPC + * SPDX-License-Identifier: GPL-3.0+ + * Author: Guido Günther + */ + +#define G_LOG_DOMAIN "phosh-osk-manager" + +#include "osk-manager.h" +#include "phosh-osk0-dbus.h" + +#include + +#define VIRTBOARD_DBUS_NAME "sm.puri.OSK0" +#define VIRTBOARD_DBUS_OBJECT "/sm/puri/OSK0" + +/** + * SECTION:phosh-osk-manager + * @short_description: A manager that handles the OSK + * @Title: PhoshOsk + * + * The #PhoshOskManager is responsible for handling the on screen keyboard + */ +enum { + PHOSH_OSK_MANAGER_PROP_0, + PHOSH_OSK_MANAGER_PROP_AVAILABLE, + PHOSH_OSK_MANAGER_PROP_VISIBLE, + PHOSH_OSK_MANAGER_PROP_LAST_PROP +}; +static GParamSpec *props[PHOSH_OSK_MANAGER_PROP_LAST_PROP]; + +struct _PhoshOskManager +{ + GObject parent; + + /* Currently the only impl. We can use an interface once we support + * different OSK types */ + PhoshOsk0SmPuriOSK0 *proxy; + gboolean visible; + gboolean available; +}; +G_DEFINE_TYPE (PhoshOskManager, phosh_osk_manager, G_TYPE_OBJECT) + + +static void +on_osk_show (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + GVariant *variant; + GError *err = NULL; + + variant = g_dbus_proxy_call_finish (G_DBUS_PROXY (source_object), res, &err); + if (!variant) { + g_warning ("Unable to toggle OSK: %s", err->message); + g_clear_error (&err); + return; + } + g_variant_unref (variant); +} + + +static void +dbus_props_changed_cb (PhoshOsk0SmPuriOSK0 *proxy, + GVariant *changed_properties, + GStrv invaliated, + gpointer *data) +{ + PhoshOskManager *self = PHOSH_OSK_MANAGER (data); + char *property; + GVariantIter i; + GVariant *value; + + g_variant_iter_init (&i, changed_properties); + while (g_variant_iter_next (&i, "{&sv}", &property, &value)) { + g_debug ("OSK property '%s' changed", property); + if (strcmp (property, "Visible") == 0) { + phosh_osk_manager_set_visible (self, g_variant_get_boolean (value)); + } + g_variant_unref (value); + } +} + + +static void +dbus_name_owner_changed_cb (PhoshOskManager *self, gpointer data) +{ + g_autofree char *name_owner = NULL; + + g_return_if_fail (PHOSH_IS_OSK_MANAGER (self)); + + name_owner = g_dbus_proxy_get_name_owner (G_DBUS_PROXY (self->proxy)); + g_debug ("OSK bus '%s' owned by %s", VIRTBOARD_DBUS_NAME, name_owner ? name_owner : "nobody"); + + self->available = name_owner ? TRUE : FALSE; + g_object_notify_by_pspec (G_OBJECT (self), props[PHOSH_OSK_MANAGER_PROP_AVAILABLE]); +} + + +static void +on_availability_changed (PhoshOskManager *self, GParamSpec *pspec, gpointer unused) +{ + g_return_if_fail (PHOSH_IS_OSK_MANAGER (self)); + + /* When there's no OSK we always want the manager to be unpressed */ + if (!self->available) + phosh_osk_manager_set_visible (self, FALSE); +} + + +static void +phosh_osk_manager_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + PhoshOskManager *self = PHOSH_OSK_MANAGER (object); + + switch (property_id) { + case PHOSH_OSK_MANAGER_PROP_VISIBLE: + phosh_osk_manager_set_visible (self, g_value_get_boolean (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + + +static void +phosh_osk_manager_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + PhoshOskManager *self = PHOSH_OSK_MANAGER (object); + + switch (property_id) { + case PHOSH_OSK_MANAGER_PROP_VISIBLE: + g_value_set_boolean (value, self->visible); + break; + case PHOSH_OSK_MANAGER_PROP_AVAILABLE: + g_value_set_boolean (value, self->available); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + + +static void +phosh_osk_manager_constructed (GObject *object) +{ + PhoshOskManager *self = PHOSH_OSK_MANAGER (object); + GError *err = NULL; + + G_OBJECT_CLASS (phosh_osk_manager_parent_class)->constructed (object); + + self->proxy = phosh_osk0_sm_puri_osk0_proxy_new_for_bus_sync( + G_BUS_TYPE_SESSION, + G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START_AT_CONSTRUCTION, + VIRTBOARD_DBUS_NAME, + VIRTBOARD_DBUS_OBJECT, + NULL, + &err); + + if (self->proxy == NULL) { + g_warning ("Failed to register with osk: %s", err->message); + g_clear_error (&err); + g_return_if_fail (self->proxy); + } + + g_signal_connect ( + self->proxy, + "g-properties-changed", + G_CALLBACK (dbus_props_changed_cb), + self); + + g_signal_connect_swapped ( + self->proxy, + "notify::g-name-owner", + G_CALLBACK (dbus_name_owner_changed_cb), + self); + dbus_name_owner_changed_cb (self, NULL); + + g_signal_connect (self, + "notify::available", + G_CALLBACK (on_availability_changed), + NULL); + + phosh_osk_manager_set_visible (self, phosh_osk0_sm_puri_osk0_get_visible (self->proxy)); +} + + +static void +phosh_osk_manager_dispose (GObject *object) +{ + PhoshOskManager *self = PHOSH_OSK_MANAGER (object); + + g_clear_object (&self->proxy); + G_OBJECT_CLASS (phosh_osk_manager_parent_class)->dispose (object); +} + + +static void +phosh_osk_manager_class_init (PhoshOskManagerClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->constructed = phosh_osk_manager_constructed; + object_class->dispose = phosh_osk_manager_dispose; + + object_class->set_property = phosh_osk_manager_set_property; + object_class->get_property = phosh_osk_manager_get_property; + + props[PHOSH_OSK_MANAGER_PROP_AVAILABLE] = + g_param_spec_boolean ("available", + "available", + "Whether an OSK is available", + FALSE, + G_PARAM_READABLE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS); + props[PHOSH_OSK_MANAGER_PROP_VISIBLE] = + g_param_spec_boolean ("visible", + "visible", + "Wheter the OSK is currently visible", + FALSE, + G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS); + g_object_class_install_properties (object_class, PHOSH_OSK_MANAGER_PROP_LAST_PROP, props); +} + + +static void +phosh_osk_manager_init (PhoshOskManager *self) +{ +} + + +PhoshOskManager * +phosh_osk_manager_new (void) +{ + return g_object_new (PHOSH_TYPE_OSK_MANAGER, NULL); +} + + +gboolean +phosh_osk_manager_get_available (PhoshOskManager *self) +{ + g_return_val_if_fail (PHOSH_IS_OSK_MANAGER (self), FALSE); + + return self->available; +} + + +gboolean +phosh_osk_manager_get_visible (PhoshOskManager *self) +{ + g_return_val_if_fail (PHOSH_IS_OSK_MANAGER (self), FALSE); + + return self->visible; +} + + +void +phosh_osk_manager_set_visible (PhoshOskManager *self, gboolean visible) +{ + g_return_if_fail (PHOSH_IS_OSK_MANAGER (self)); + + g_debug ("Setting osk to %svisible", visible ? "" : "not "); + if (self->visible == visible) + return; + + if (self->proxy) { + phosh_osk0_sm_puri_osk0_call_set_visible ( + self->proxy, + visible, + NULL, + (GAsyncReadyCallback) on_osk_show, + NULL); + } + self->visible = visible; + + g_object_notify_by_pspec (G_OBJECT (self), props[PHOSH_OSK_MANAGER_PROP_VISIBLE]); +} diff --git a/src/osk-manager.h b/src/osk-manager.h new file mode 100644 index 00000000..e58f836c --- /dev/null +++ b/src/osk-manager.h @@ -0,0 +1,22 @@ +/* + * Copyright (C) 2018 Purism SPC + * SPDX-License-Identifier: GPL-3.0+ + * Author: Guido Günther + */ + +#pragma once + +#include + +G_BEGIN_DECLS + +#define PHOSH_TYPE_OSK_MANAGER (phosh_osk_manager_get_type()) + +G_DECLARE_FINAL_TYPE (PhoshOskManager, phosh_osk_manager, PHOSH, OSK_MANAGER, GObject) + +PhoshOskManager * phosh_osk_manager_new (void); +gboolean phosh_osk_manager_get_available (PhoshOskManager *self); +void phosh_osk_manager_set_visible (PhoshOskManager *self, gboolean visible); +gboolean phosh_osk_manager_get_visible (PhoshOskManager *self); + +G_END_DECLS -- GitLab From 64d36d3c2a7156837831d6c8c50f8bd17ab9497f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Guido=20G=C3=BCnther?= Date: Mon, 3 Jun 2019 16:59:08 +0200 Subject: [PATCH 3/8] PhoshShell: Add PhoshOskManager MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Guido Günther --- src/shell.c | 19 ++++++++++++++++++- src/shell.h | 2 ++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/shell.c b/src/shell.c index 74565a5d..3167617f 100644 --- a/src/shell.c +++ b/src/shell.c @@ -30,6 +30,7 @@ #include "lockscreen-manager.h" #include "monitor-manager.h" #include "monitor/monitor.h" +#include "osk-manager.h" #include "panel.h" #include "phosh-wayland.h" #include "session.h" @@ -68,8 +69,8 @@ typedef struct PhoshMonitorManager *monitor_manager; PhoshLockscreenManager *lockscreen_manager; PhoshIdleManager *idle_manager; + PhoshOskManager *osk_manager; PhoshWifiManager *wifi_manager; - } PhoshShellPrivate; @@ -476,6 +477,7 @@ phosh_shell_dispose (GObject *object) g_clear_object (&priv->lockscreen_manager); g_clear_object (&priv->monitor_manager); g_clear_object (&priv->wifi_manager); + g_clear_object (&priv->osk_manager); phosh_system_prompter_unregister (); phosh_session_unregister (); @@ -689,6 +691,21 @@ phosh_shell_get_wifi_manager (PhoshShell *self) } +PhoshOskManager * +phosh_shell_get_osk_manager (PhoshShell *self) +{ + PhoshShellPrivate *priv; + + g_return_val_if_fail (PHOSH_IS_SHELL (self), NULL); + priv = phosh_shell_get_instance_private (self); + + if (!priv->osk_manager) + priv->osk_manager = phosh_osk_manager_new (); + + g_return_val_if_fail (PHOSH_IS_OSK_MANAGER (priv->osk_manager), NULL); + return priv->osk_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 af98c0da..90e434e7 100644 --- a/src/shell.h +++ b/src/shell.h @@ -9,6 +9,7 @@ #include "monitor-manager.h" #include "monitor/monitor.h" +#include "osk-manager.h" #include "wifimanager.h" #include @@ -31,4 +32,5 @@ void phosh_shell_unlock (PhoshShell *self); void phosh_shell_set_primary_monitor (PhoshShell *self, PhoshMonitor *monitor); PhoshMonitor *phosh_shell_get_primary_monitor (PhoshShell *self); PhoshMonitorManager *phosh_shell_get_monitor_manager (PhoshShell *self); +PhoshOskManager *phosh_shell_get_osk_manager (PhoshShell *self); PhoshWifiManager *phosh_shell_get_wifi_manager (PhoshShell *self); -- GitLab From 0870d5361f71ed37797fa358b3aac24906dc9c24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Guido=20G=C3=BCnther?= Date: Mon, 3 Jun 2019 17:17:10 +0200 Subject: [PATCH 4/8] PhoshOskButton: Use PhoshOskManager MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Don't dupliate code that is in PhoshOskManager and keep the DBus interaction in one place. Signed-off-by: Guido Günther --- src/osk/osk-button.c | 145 ++++++++++++------------------------------- 1 file changed, 40 insertions(+), 105 deletions(-) diff --git a/src/osk/osk-button.c b/src/osk/osk-button.c index 6457ab49..68f4c677 100644 --- a/src/osk/osk-button.c +++ b/src/osk/osk-button.c @@ -7,7 +7,8 @@ #define G_LOG_DOMAIN "phosh-osk-button" #include "osk-button.h" -#include "phosh-osk0-dbus.h" +#include "osk-manager.h" +#include "shell.h" #include #include @@ -24,10 +25,7 @@ */ typedef struct { - /* Currently the only impl. We can use an interface once we support - * different OSK types */ - PhoshOsk0SmPuriOSK0 *proxy; - gboolean visible; + PhoshOskManager *osk; gboolean setting_visibility; } PhoshOskButtonPrivate; @@ -39,103 +37,51 @@ typedef struct _PhoshOskButton G_DEFINE_TYPE_WITH_PRIVATE (PhoshOskButton, phosh_osk_button, GTK_TYPE_TOGGLE_BUTTON) -static void -on_osk_show (GObject *source_object, - GAsyncResult *res, - gpointer user_data) -{ - GVariant *variant; - GError *err = NULL; - - variant = g_dbus_proxy_call_finish (G_DBUS_PROXY (source_object), res, &err); - if (!variant) { - g_warning ("Unable to toggle OSK: %s", err->message); - g_clear_error (&err); - return; - } - g_variant_unref (variant); -} - - -static void -phosh_osk_show (PhoshOskButton *self, gboolean show) -{ - PhoshOskButtonPrivate *priv = phosh_osk_button_get_instance_private (self); - - if (priv->proxy) { - phosh_osk0_sm_puri_osk0_call_set_visible ( - priv->proxy, - show, - NULL, - (GAsyncReadyCallback) on_osk_show, - NULL); - } -} - - static void toggled_cb (PhoshOskButton *self, gpointer data) { PhoshOskButtonPrivate *priv = phosh_osk_button_get_instance_private (self); + gboolean visible, active; priv->setting_visibility = TRUE; - priv->visible = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (self)); - phosh_osk_show (self, priv->visible); + visible = phosh_osk_manager_get_visible (priv->osk); + + active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (self)); + if (visible != active) + phosh_osk_manager_set_visible (priv->osk, active); + priv->setting_visibility = FALSE; } static void -visibility_changed (PhoshOskButton *self, gboolean visible) +on_osk_availability_changed (PhoshOskButton *self, GParamSpec *pspec, PhoshOskManager *osk) { PhoshOskButtonPrivate *priv = phosh_osk_button_get_instance_private (self); + gboolean available; - if (!priv->setting_visibility) - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (self), visible); -} - + g_return_if_fail (PHOSH_IS_OSK_BUTTON (self)); + g_return_if_fail (PHOSH_IS_OSK_MANAGER (osk)); + g_return_if_fail (priv->osk == osk); -static void -dbus_props_changed_cb (PhoshOsk0SmPuriOSK0 *proxy, - GVariant *changed_properties, - GStrv invaliated, - gpointer *data) -{ - PhoshOskButton *self = PHOSH_OSK_BUTTON (data); - char *property; - GVariantIter i; - GVariant *value; - - g_variant_iter_init (&i, changed_properties); - while (g_variant_iter_next (&i, "{&sv}", &property, &value)) { - g_debug ("OSK property '%s' changed", property); - if (strcmp (property, "Visible") == 0) { - visibility_changed (self, g_variant_get_boolean (value)); - } - g_variant_unref (value); - } + available = phosh_osk_manager_get_available (osk); + gtk_widget_set_sensitive (GTK_WIDGET (self), available); } static void -dbus_name_owner_changed_cb (PhoshOskButton *self, gpointer data) +on_osk_visibility_changed (PhoshOskButton *self, GParamSpec *pspec, PhoshOskManager *osk) { - PhoshOskButtonPrivate *priv; - g_autofree char *name_owner = NULL; + PhoshOskButtonPrivate *priv = phosh_osk_button_get_instance_private (self); + gboolean visible; g_return_if_fail (PHOSH_IS_OSK_BUTTON (self)); - priv = phosh_osk_button_get_instance_private (self); - - name_owner = g_dbus_proxy_get_name_owner (G_DBUS_PROXY (priv->proxy)); - g_debug ("OSK bus '%s' owned by %s", VIRTBOARD_DBUS_NAME, name_owner ? name_owner : "nobody"); - - if (name_owner) { - gtk_widget_set_sensitive (GTK_WIDGET (self), TRUE); - } else { - gtk_widget_set_sensitive (GTK_WIDGET (self), FALSE); - /* When there's no OSK we always want the button to be unpressed */ - visibility_changed (self, FALSE); - }; + g_return_if_fail (PHOSH_IS_OSK_MANAGER (osk)); + g_return_if_fail (priv->osk == osk); + + visible = phosh_osk_manager_get_visible (osk); + if (!priv->setting_visibility) + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (self), visible); } @@ -144,37 +90,25 @@ phosh_osk_button_constructed (GObject *object) { PhoshOskButton *self = PHOSH_OSK_BUTTON (object); PhoshOskButtonPrivate *priv = phosh_osk_button_get_instance_private (self); - GError *err = NULL; + PhoshShell *shell; GtkWidget *image; G_OBJECT_CLASS (phosh_osk_button_parent_class)->constructed (object); - priv->proxy = phosh_osk0_sm_puri_osk0_proxy_new_for_bus_sync( - G_BUS_TYPE_SESSION, - G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START_AT_CONSTRUCTION, - VIRTBOARD_DBUS_NAME, - VIRTBOARD_DBUS_OBJECT, - NULL, - &err); - - if (priv->proxy == NULL) { - g_warning ("Failed to register with osk: %s", err->message); - g_clear_error (&err); - g_return_if_fail (priv->proxy); - } - - g_signal_connect ( - priv->proxy, - "g-properties-changed", - G_CALLBACK (dbus_props_changed_cb), + shell = phosh_shell_get_default (); + priv->osk = g_object_ref(phosh_shell_get_osk_manager (shell)); + + g_signal_connect_swapped ( + priv->osk, + "notify::visible", + G_CALLBACK (on_osk_visibility_changed), self); g_signal_connect_swapped ( - priv->proxy, - "notify::g-name-owner", - G_CALLBACK (dbus_name_owner_changed_cb), + priv->osk, + "notify::available", + G_CALLBACK (on_osk_availability_changed), self); - dbus_name_owner_changed_cb (self, NULL); g_signal_connect (self, "toggled", @@ -185,7 +119,8 @@ phosh_osk_button_constructed (GObject *object) gtk_button_set_image (GTK_BUTTON (self), image); gtk_button_set_always_show_image (GTK_BUTTON (self), TRUE); - visibility_changed (self, phosh_osk0_sm_puri_osk0_get_visible (priv->proxy)); + on_osk_availability_changed (self, NULL, priv->osk); + on_osk_visibility_changed (self, NULL, priv->osk); } @@ -194,7 +129,7 @@ phosh_osk_button_dispose (GObject *object) { PhoshOskButtonPrivate *priv = phosh_osk_button_get_instance_private (PHOSH_OSK_BUTTON(object)); - g_clear_object (&priv->proxy); + g_clear_object (&priv->osk); G_OBJECT_CLASS (phosh_osk_button_parent_class)->dispose (object); } -- GitLab From c09b4fe763c23b21f193e0e5d57a23de97815f68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Guido=20G=C3=BCnther?= Date: Tue, 4 Jun 2019 18:57:47 +0200 Subject: [PATCH 5/8] PhoshOskButton: Drop private data MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Guido Günther --- src/osk/osk-button.c | 45 +++++++++++++++++++------------------------- 1 file changed, 19 insertions(+), 26 deletions(-) diff --git a/src/osk/osk-button.c b/src/osk/osk-button.c index 68f4c677..e45f869c 100644 --- a/src/osk/osk-button.c +++ b/src/osk/osk-button.c @@ -23,46 +23,41 @@ * * The #PhoshOskButton is responsible for toggling the on screen keyboard */ -typedef struct +struct _PhoshOskButton { + GtkToggleButton parent; + PhoshOskManager *osk; gboolean setting_visibility; -} PhoshOskButtonPrivate; - -typedef struct _PhoshOskButton -{ - GtkToggleButton parent; -} PhoshOskButton; +}; -G_DEFINE_TYPE_WITH_PRIVATE (PhoshOskButton, phosh_osk_button, GTK_TYPE_TOGGLE_BUTTON) +G_DEFINE_TYPE (PhoshOskButton, phosh_osk_button, GTK_TYPE_TOGGLE_BUTTON) static void toggled_cb (PhoshOskButton *self, gpointer data) { - PhoshOskButtonPrivate *priv = phosh_osk_button_get_instance_private (self); gboolean visible, active; - priv->setting_visibility = TRUE; - visible = phosh_osk_manager_get_visible (priv->osk); + self->setting_visibility = TRUE; + visible = phosh_osk_manager_get_visible (self->osk); active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (self)); if (visible != active) - phosh_osk_manager_set_visible (priv->osk, active); + phosh_osk_manager_set_visible (self->osk, active); - priv->setting_visibility = FALSE; + self->setting_visibility = FALSE; } static void on_osk_availability_changed (PhoshOskButton *self, GParamSpec *pspec, PhoshOskManager *osk) { - PhoshOskButtonPrivate *priv = phosh_osk_button_get_instance_private (self); gboolean available; g_return_if_fail (PHOSH_IS_OSK_BUTTON (self)); g_return_if_fail (PHOSH_IS_OSK_MANAGER (osk)); - g_return_if_fail (priv->osk == osk); + g_return_if_fail (self->osk == osk); available = phosh_osk_manager_get_available (osk); gtk_widget_set_sensitive (GTK_WIDGET (self), available); @@ -72,15 +67,14 @@ on_osk_availability_changed (PhoshOskButton *self, GParamSpec *pspec, PhoshOskMa static void on_osk_visibility_changed (PhoshOskButton *self, GParamSpec *pspec, PhoshOskManager *osk) { - PhoshOskButtonPrivate *priv = phosh_osk_button_get_instance_private (self); gboolean visible; g_return_if_fail (PHOSH_IS_OSK_BUTTON (self)); g_return_if_fail (PHOSH_IS_OSK_MANAGER (osk)); - g_return_if_fail (priv->osk == osk); + g_return_if_fail (self->osk == osk); visible = phosh_osk_manager_get_visible (osk); - if (!priv->setting_visibility) + if (!self->setting_visibility) gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (self), visible); } @@ -89,23 +83,22 @@ static void phosh_osk_button_constructed (GObject *object) { PhoshOskButton *self = PHOSH_OSK_BUTTON (object); - PhoshOskButtonPrivate *priv = phosh_osk_button_get_instance_private (self); PhoshShell *shell; GtkWidget *image; G_OBJECT_CLASS (phosh_osk_button_parent_class)->constructed (object); shell = phosh_shell_get_default (); - priv->osk = g_object_ref(phosh_shell_get_osk_manager (shell)); + self->osk = g_object_ref(phosh_shell_get_osk_manager (shell)); g_signal_connect_swapped ( - priv->osk, + self->osk, "notify::visible", G_CALLBACK (on_osk_visibility_changed), self); g_signal_connect_swapped ( - priv->osk, + self->osk, "notify::available", G_CALLBACK (on_osk_availability_changed), self); @@ -119,17 +112,17 @@ phosh_osk_button_constructed (GObject *object) gtk_button_set_image (GTK_BUTTON (self), image); gtk_button_set_always_show_image (GTK_BUTTON (self), TRUE); - on_osk_availability_changed (self, NULL, priv->osk); - on_osk_visibility_changed (self, NULL, priv->osk); + on_osk_availability_changed (self, NULL, self->osk); + on_osk_visibility_changed (self, NULL, self->osk); } static void phosh_osk_button_dispose (GObject *object) { - PhoshOskButtonPrivate *priv = phosh_osk_button_get_instance_private (PHOSH_OSK_BUTTON(object)); + PhoshOskButton *self = PHOSH_OSK_BUTTON (object); - g_clear_object (&priv->osk); + g_clear_object (&self->osk); G_OBJECT_CLASS (phosh_osk_button_parent_class)->dispose (object); } -- GitLab From c37547159b634dd638991371815d171bd95007ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Guido=20G=C3=BCnther?= Date: Tue, 4 Jun 2019 18:52:19 +0200 Subject: [PATCH 6/8] PhoshShell: Add getter for lockscreen manager MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Guido Günther --- src/shell.c | 13 +++++++++++++ src/shell.h | 2 ++ 2 files changed, 15 insertions(+) diff --git a/src/shell.c b/src/shell.c index 3167617f..4025b03a 100644 --- a/src/shell.c +++ b/src/shell.c @@ -662,6 +662,19 @@ phosh_shell_get_primary_monitor (PhoshShell *self) } +PhoshLockscreenManager * +phosh_shell_get_lockscreen_manager (PhoshShell *self) +{ + PhoshShellPrivate *priv; + + g_return_val_if_fail (PHOSH_IS_SHELL (self), NULL); + priv = phosh_shell_get_instance_private (self); + + g_return_val_if_fail (PHOSH_IS_LOCKSCREEN_MANAGER (priv->lockscreen_manager), NULL); + return priv->lockscreen_manager; +} + + PhoshMonitorManager * phosh_shell_get_monitor_manager (PhoshShell *self) { diff --git a/src/shell.h b/src/shell.h index 90e434e7..7116e1e9 100644 --- a/src/shell.h +++ b/src/shell.h @@ -9,6 +9,7 @@ #include "monitor-manager.h" #include "monitor/monitor.h" +#include "lockscreen-manager.h" #include "osk-manager.h" #include "wifimanager.h" @@ -31,6 +32,7 @@ void phosh_shell_lock (PhoshShell *self); void phosh_shell_unlock (PhoshShell *self); void phosh_shell_set_primary_monitor (PhoshShell *self, PhoshMonitor *monitor); PhoshMonitor *phosh_shell_get_primary_monitor (PhoshShell *self); +PhoshLockscreenManager *phosh_shell_get_lockscreen_manager (PhoshShell *self); PhoshMonitorManager *phosh_shell_get_monitor_manager (PhoshShell *self); PhoshOskManager *phosh_shell_get_osk_manager (PhoshShell *self); PhoshWifiManager *phosh_shell_get_wifi_manager (PhoshShell *self); -- GitLab From 1242aff742fdfca875c489cd12982bc3061f0963 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Guido=20G=C3=BCnther?= Date: Mon, 3 Jun 2019 16:42:07 +0200 Subject: [PATCH 7/8] PhoshOskManager: Hide keyboard on screen lock MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Closes: #75 Signed-off-by: Guido Günther --- src/osk-manager.c | 21 +++++++++++++++++++++ src/shell.c | 2 +- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/osk-manager.c b/src/osk-manager.c index 7f66f3d9..ebeb9ab3 100644 --- a/src/osk-manager.c +++ b/src/osk-manager.c @@ -6,8 +6,10 @@ #define G_LOG_DOMAIN "phosh-osk-manager" +#include "lockscreen-manager.h" #include "osk-manager.h" #include "phosh-osk0-dbus.h" +#include "shell.h" #include @@ -36,6 +38,7 @@ struct _PhoshOskManager /* Currently the only impl. We can use an interface once we support * different OSK types */ PhoshOsk0SmPuriOSK0 *proxy; + PhoshLockscreenManager *lockscreen_manger; gboolean visible; gboolean available; }; @@ -108,6 +111,14 @@ on_availability_changed (PhoshOskManager *self, GParamSpec *pspec, gpointer unus } +static void +on_lockscreen_manager_locked (PhoshOskManager *self, GParamSpec *pspec, gpointer unused) +{ + g_return_if_fail (PHOSH_IS_OSK_MANAGER (self)); + phosh_osk_manager_set_visible (self, FALSE); +} + + static void phosh_osk_manager_set_property (GObject *object, guint property_id, @@ -153,6 +164,7 @@ static void phosh_osk_manager_constructed (GObject *object) { PhoshOskManager *self = PHOSH_OSK_MANAGER (object); + PhoshShell *shell; GError *err = NULL; G_OBJECT_CLASS (phosh_osk_manager_parent_class)->constructed (object); @@ -189,6 +201,14 @@ phosh_osk_manager_constructed (GObject *object) G_CALLBACK (on_availability_changed), NULL); + shell = phosh_shell_get_default(); + self->lockscreen_manger = g_object_ref(phosh_shell_get_lockscreen_manager(shell)); + + g_signal_connect_swapped (self->lockscreen_manger, + "notify::locked", + G_CALLBACK (on_lockscreen_manager_locked), + self); + phosh_osk_manager_set_visible (self, phosh_osk0_sm_puri_osk0_get_visible (self->proxy)); } @@ -199,6 +219,7 @@ phosh_osk_manager_dispose (GObject *object) PhoshOskManager *self = PHOSH_OSK_MANAGER (object); g_clear_object (&self->proxy); + g_clear_object (&self->lockscreen_manger); G_OBJECT_CLASS (phosh_osk_manager_parent_class)->dispose (object); } diff --git a/src/shell.c b/src/shell.c index 4025b03a..23c0e23f 100644 --- a/src/shell.c +++ b/src/shell.c @@ -232,7 +232,7 @@ home_activated_cb (PhoshShell *self, G_CALLBACK(close_favorites_menu_cb), self); } - + static void setting_done_cb (PhoshShell *self, -- GitLab From ca04eba3b32dac0b090294b297148a0bfa50de6f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Guido=20G=C3=BCnther?= Date: Tue, 4 Jun 2019 19:04:55 +0200 Subject: [PATCH 8/8] PhoshShell: Close OSK when displaying favorites or settings MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Guido Günther Closes: #81 --- src/shell.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/shell.c b/src/shell.c index 23c0e23f..60024d23 100644 --- a/src/shell.c +++ b/src/shell.c @@ -188,6 +188,8 @@ home_activated_cb (PhoshShell *self, return; } + phosh_osk_manager_set_visible (priv->osk_manager, FALSE); + favorites = calloc (1, sizeof *favorites); favorites->window = phosh_favorites_new (); @@ -232,7 +234,7 @@ home_activated_cb (PhoshShell *self, G_CALLBACK(close_favorites_menu_cb), self); } - + static void setting_done_cb (PhoshShell *self, @@ -265,6 +267,8 @@ settings_activated_cb (PhoshShell *self, return; } + phosh_osk_manager_set_visible (priv->osk_manager, FALSE); + settings = calloc (1, sizeof *settings); settings->window = phosh_settings_new (); -- GitLab