diff --git a/src/background.h b/src/background.h index 11359b5a6a9bbc60443763a44c4ee2e01edc42ed..f18e9029c388856be09f570214a40cc776d5fbc7 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 5744b76d548e583782256871b85352e3579c01f4..db1e72acbf364f16a598f34efe80926ae166f76b 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/meson.build b/src/meson.build index 778bd9a826ba374210499205506393be24c207bc..5e78935328eefccdf04fa240b06eb1d7f9bbbc95 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 0000000000000000000000000000000000000000..ebeb9ab3d6db0268a21f758e48470c57d3865dd2 --- /dev/null +++ b/src/osk-manager.c @@ -0,0 +1,305 @@ +/* + * Copyright (C) 2018 Purism SPC + * SPDX-License-Identifier: GPL-3.0+ + * Author: Guido Günther + */ + +#define G_LOG_DOMAIN "phosh-osk-manager" + +#include "lockscreen-manager.h" +#include "osk-manager.h" +#include "phosh-osk0-dbus.h" +#include "shell.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; + PhoshLockscreenManager *lockscreen_manger; + 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 +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, + 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); + PhoshShell *shell; + 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); + + 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)); +} + + +static void +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); +} + + +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 0000000000000000000000000000000000000000..e58f836cb6c4bb23816441c72572d5d7a70f23c0 --- /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 diff --git a/src/osk/osk-button.c b/src/osk/osk-button.c index 6457ab4996d6b93f6241b84f99b85ab72f5ef5d1..e45f869cdc88915d962a0c2cc264d17e919190b5 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 @@ -22,120 +23,59 @@ * * The #PhoshOskButton is responsible for toggling the on screen keyboard */ -typedef struct -{ - /* Currently the only impl. We can use an interface once we support - * different OSK types */ - PhoshOsk0SmPuriOSK0 *proxy; - gboolean visible; - gboolean setting_visibility; -} PhoshOskButtonPrivate; - -typedef struct _PhoshOskButton +struct _PhoshOskButton { GtkToggleButton parent; -} PhoshOskButton; -G_DEFINE_TYPE_WITH_PRIVATE (PhoshOskButton, phosh_osk_button, GTK_TYPE_TOGGLE_BUTTON) + PhoshOskManager *osk; + gboolean setting_visibility; +}; - -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); -} +G_DEFINE_TYPE (PhoshOskButton, phosh_osk_button, GTK_TYPE_TOGGLE_BUTTON) static void -phosh_osk_show (PhoshOskButton *self, gboolean show) +toggled_cb (PhoshOskButton *self, gpointer data) { - 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); - } -} + gboolean visible, active; + self->setting_visibility = TRUE; + visible = phosh_osk_manager_get_visible (self->osk); -static void -toggled_cb (PhoshOskButton *self, gpointer data) -{ - PhoshOskButtonPrivate *priv = phosh_osk_button_get_instance_private (self); + active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (self)); + if (visible != active) + phosh_osk_manager_set_visible (self->osk, active); - priv->setting_visibility = TRUE; - priv->visible = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (self)); - phosh_osk_show (self, priv->visible); - priv->setting_visibility = FALSE; + self->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); - - if (!priv->setting_visibility) - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (self), visible); -} + gboolean available; + g_return_if_fail (PHOSH_IS_OSK_BUTTON (self)); + g_return_if_fail (PHOSH_IS_OSK_MANAGER (osk)); + g_return_if_fail (self->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; + 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 (self->osk == osk); + + visible = phosh_osk_manager_get_visible (osk); + if (!self->setting_visibility) + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (self), visible); } @@ -143,38 +83,25 @@ static void 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 (); + self->osk = g_object_ref(phosh_shell_get_osk_manager (shell)); + + g_signal_connect_swapped ( + self->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), + self->osk, + "notify::available", + G_CALLBACK (on_osk_availability_changed), self); - dbus_name_owner_changed_cb (self, NULL); g_signal_connect (self, "toggled", @@ -185,16 +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); - visibility_changed (self, phosh_osk0_sm_puri_osk0_get_visible (priv->proxy)); + 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->proxy); + g_clear_object (&self->osk); G_OBJECT_CLASS (phosh_osk_button_parent_class)->dispose (object); } diff --git a/src/settings.h b/src/settings.h index a0d289c2b31284a25e2b7e4f0c567c32a3ae151f..43666849c2b49e7d7a911426079a018987e00098 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.c b/src/shell.c index 74565a5dea618652d51dce4681af0810622fec10..60024d23442263be7a528083915db712fa9a0fa5 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; @@ -187,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 (); @@ -264,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 (); @@ -476,6 +481,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 (); @@ -660,6 +666,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) { @@ -689,6 +708,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 c8078ec5c9c7f1cf8de24502a16a0a0ad7a754f6..7116e1e99efe4c1ca1da86eecc7338f9e4aeff82 100644 --- a/src/shell.h +++ b/src/shell.h @@ -5,11 +5,12 @@ * Author: Guido Günther */ -#ifndef PHOSH_H -#define PHOSH_H +#pragma once #include "monitor-manager.h" #include "monitor/monitor.h" +#include "lockscreen-manager.h" +#include "osk-manager.h" #include "wifimanager.h" #include @@ -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); -#endif /* PHOSH_H */