From 72d215b23ae27bba7e5e29f3edab248baaff59d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Guido=20G=C3=BCnther?= Date: Fri, 14 Sep 2018 14:53:14 +0200 Subject: [PATCH 1/3] shell: Rename favorites_activated to home_activated MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We don't rename PhoshFavorites yet Signed-off-by: Guido Günther --- src/shell.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/shell.c b/src/shell.c index b2f09be60..52977a174 100644 --- a/src/shell.c +++ b/src/shell.c @@ -161,8 +161,8 @@ static const struct xdg_popup_listener xdg_popup_listener = { static void -favorites_activated_cb (PhoshShell *self, - PhoshPanel *window) +home_activated_cb (PhoshShell *self, + PhoshPanel *window) { PhoshShellPrivate *priv = phosh_shell_get_instance_private (self); GdkWindow *gdk_window; @@ -349,7 +349,7 @@ panels_create (PhoshShell *self) g_signal_connect_swapped ( priv->home, "home-activated", - G_CALLBACK(favorites_activated_cb), + G_CALLBACK(home_activated_cb), self); } -- GitLab From 9468eaa2c4fb7c6c3826854b0be4a45639a87d37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Guido=20G=C3=BCnther?= Date: Fri, 14 Sep 2018 14:54:56 +0200 Subject: [PATCH 2/3] shell: Remove activation of apps via "favorites-activated" MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We don't want the apps overview toggled via the top bar. Signed-off-by: Guido Günther --- src/shell.c | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/shell.c b/src/shell.c index 52977a174..316cccfa2 100644 --- a/src/shell.c +++ b/src/shell.c @@ -334,12 +334,6 @@ panels_create (PhoshShell *self) monitor->wl_output)); priv->home = PHOSH_LAYER_SURFACE(phosh_home_new (phosh_wayland_get_zwlr_layer_shell_v1(wl), monitor->wl_output)); - g_signal_connect_swapped ( - priv->panel, - "favorites-activated", - G_CALLBACK(favorites_activated_cb), - self); - g_signal_connect_swapped ( priv->panel, "settings-activated", -- GitLab From a458518f61960e0a24395453434da69e0ea53573 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Guido=20G=C3=BCnther?= Date: Fri, 14 Sep 2018 14:24:55 +0200 Subject: [PATCH 3/3] home: Add keyboard button MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add a keyboard button to the home buttons bar. This will allow to unfold the OSK. Signed-off-by: Guido Günther --- src/home.c | 26 ++++- src/meson.build | 2 + src/osk/meson.build | 10 ++ src/osk/osk-button.c | 222 ++++++++++++++++++++++++++++++++++++ src/osk/osk-button.h | 19 +++ src/osk/phosh-osk0-dbus.xml | 14 +++ src/shell.c | 1 - src/ui/home.ui | 34 ++++-- 8 files changed, 315 insertions(+), 13 deletions(-) create mode 100644 src/osk/meson.build create mode 100644 src/osk/osk-button.c create mode 100644 src/osk/osk-button.h create mode 100644 src/osk/phosh-osk0-dbus.xml diff --git a/src/home.c b/src/home.c index 7f0663ec0..91a439fbf 100644 --- a/src/home.c +++ b/src/home.c @@ -8,16 +8,19 @@ #include "config.h" #include "home.h" +#include "osk/osk-button.h" /** * SECTION:phosh-home * @short_description: The ome button at the bottom of the screen * @Title: PhoshHome * - * The #PhoshHome is displayed at the bottom of the screen. + * The #PhoshHome is displayed at the bottom of the screen. It features + * the home button and the button to toggle the OSK. */ enum { HOME_ACTIVATED, + OSK_ACTIVATED, N_SIGNALS }; static guint signals[N_SIGNALS] = { 0 }; @@ -25,6 +28,7 @@ static guint signals[N_SIGNALS] = { 0 }; typedef struct { GtkWidget *btn_home; + GtkWidget *btn_osk; } PhoshHomePrivate; @@ -45,6 +49,15 @@ home_clicked_cb (PhoshHome *self, GtkButton *btn) } +static void +osk_clicked_cb (PhoshHome *self, GtkButton *btn) +{ + g_return_if_fail (PHOSH_IS_HOME (self)); + g_return_if_fail (GTK_IS_BUTTON (btn)); + g_signal_emit(self, signals[OSK_ACTIVATED], 0); +} + + static void phosh_home_constructed (GObject *object) { @@ -57,6 +70,12 @@ phosh_home_constructed (GObject *object) self, G_CONNECT_SWAPPED); + g_signal_connect_object (priv->btn_osk, + "clicked", + G_CALLBACK (osk_clicked_cb), + self, + G_CONNECT_SWAPPED); + G_OBJECT_CLASS (phosh_home_parent_class)->constructed (object); } @@ -72,10 +91,15 @@ phosh_home_class_init (PhoshHomeClass *klass) signals[HOME_ACTIVATED] = g_signal_new ("home-activated", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, 0, NULL, NULL, NULL, G_TYPE_NONE, 0); + signals[OSK_ACTIVATED] = g_signal_new ("osk-activated", + G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, 0, NULL, NULL, + NULL, G_TYPE_NONE, 0); + PHOSH_TYPE_OSK_BUTTON; gtk_widget_class_set_template_from_resource (widget_class, "/sm/puri/phosh/ui/home.ui"); gtk_widget_class_bind_template_child_private (widget_class, PhoshHome, btn_home); + gtk_widget_class_bind_template_child_private (widget_class, PhoshHome, btn_osk); } diff --git a/src/meson.build b/src/meson.build index ba72d822d..966dc8edb 100644 --- a/src/meson.build +++ b/src/meson.build @@ -1,5 +1,6 @@ subdir('wwan') subdir('monitor') +subdir('osk') phosh_resources = gnome.compile_resources( 'phosh-resources', @@ -54,6 +55,7 @@ phosh_sources = [ phosh_resources, phosh_wwan_sources, phosh_monitor_sources, + phosh_osk_sources, wl_proto_sources, ] diff --git a/src/osk/meson.build b/src/osk/meson.build new file mode 100644 index 000000000..d5cf93a18 --- /dev/null +++ b/src/osk/meson.build @@ -0,0 +1,10 @@ +iface = 'phosh-osk0-dbus' +generated_osk_sources = gnome.gdbus_codegen(iface, + iface + '.xml', + namespace: 'PhoshOsk0', + object_manager: true) + +phosh_osk_sources = [ + 'osk/osk-button.c', + generated_osk_sources, +] diff --git a/src/osk/osk-button.c b/src/osk/osk-button.c new file mode 100644 index 000000000..6457ab499 --- /dev/null +++ b/src/osk/osk-button.c @@ -0,0 +1,222 @@ +/* + * Copyright (C) 2018 Purism SPC + * SPDX-License-Identifier: GPL-3.0+ + * Author: Guido Günther + */ + +#define G_LOG_DOMAIN "phosh-osk-button" + +#include "osk-button.h" +#include "phosh-osk0-dbus.h" + +#include +#include + +#define VIRTBOARD_DBUS_NAME "sm.puri.OSK0" +#define VIRTBOARD_DBUS_OBJECT "/sm/puri/OSK0" + +/** + * SECTION:phosh-osk-button + * @short_description: A button that toggles the OSK + * @Title: PhoshOsk + * + * 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 +{ + GtkToggleButton parent; +} 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); + + 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; +} + + +static void +visibility_changed (PhoshOskButton *self, gboolean visible) +{ + PhoshOskButtonPrivate *priv = phosh_osk_button_get_instance_private (self); + + if (!priv->setting_visibility) + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (self), visible); +} + + +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); + } +} + + +static void +dbus_name_owner_changed_cb (PhoshOskButton *self, gpointer data) +{ + PhoshOskButtonPrivate *priv; + g_autofree char *name_owner = NULL; + + 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); + }; +} + + +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; + 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), + self); + + g_signal_connect_swapped ( + priv->proxy, + "notify::g-name-owner", + G_CALLBACK (dbus_name_owner_changed_cb), + self); + dbus_name_owner_changed_cb (self, NULL); + + g_signal_connect (self, + "toggled", + G_CALLBACK (toggled_cb), + NULL); + + image = gtk_image_new_from_icon_name ("input-keyboard-symbolic", GTK_ICON_SIZE_BUTTON); + 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)); +} + + +static void +phosh_osk_button_dispose (GObject *object) +{ + PhoshOskButtonPrivate *priv = phosh_osk_button_get_instance_private (PHOSH_OSK_BUTTON(object)); + + g_clear_object (&priv->proxy); + G_OBJECT_CLASS (phosh_osk_button_parent_class)->dispose (object); +} + + +static void +phosh_osk_button_class_init (PhoshOskButtonClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->constructed = phosh_osk_button_constructed; + object_class->dispose = phosh_osk_button_dispose; +} + + +static void +phosh_osk_button_init (PhoshOskButton *self) +{ +} + + +GtkWidget * +phosh_osk_button_new (void) +{ + return g_object_new (PHOSH_TYPE_OSK_BUTTON, NULL); +} diff --git a/src/osk/osk-button.h b/src/osk/osk-button.h new file mode 100644 index 000000000..08b3e24fc --- /dev/null +++ b/src/osk/osk-button.h @@ -0,0 +1,19 @@ +/* + * 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_BUTTON (phosh_osk_button_get_type()) + +G_DECLARE_FINAL_TYPE (PhoshOskButton, phosh_osk_button, PHOSH, OSK_BUTTON, GtkToggleButton) + +GtkWidget * phosh_osk_button_new (void); + +G_END_DECLS diff --git a/src/osk/phosh-osk0-dbus.xml b/src/osk/phosh-osk0-dbus.xml new file mode 100644 index 000000000..fbb05f115 --- /dev/null +++ b/src/osk/phosh-osk0-dbus.xml @@ -0,0 +1,14 @@ + + + + + + + Switch keyboard visibility + + + + + + diff --git a/src/shell.c b/src/shell.c index 316cccfa2..9b56a9856 100644 --- a/src/shell.c +++ b/src/shell.c @@ -345,7 +345,6 @@ panels_create (PhoshShell *self) "home-activated", G_CALLBACK(home_activated_cb), self); - } diff --git a/src/ui/home.ui b/src/ui/home.ui index 9867edd53..8ff28c0b9 100644 --- a/src/ui/home.ui +++ b/src/ui/home.ui @@ -2,28 +2,34 @@ - - True - False - go-up-symbolic - + + True + False + go-up-symbolic + -- GitLab