From 09f490b7d39cc2cfdf5ebf657794f1c393aea0be Mon Sep 17 00:00:00 2001 From: mathew-dennis Date: Tue, 5 Dec 2023 20:15:17 +0530 Subject: [PATCH 01/14] home: Shrink home-bar height and move osk activation to center Reduce the home-bar size from 40px to 15px Replace osk button with powerbar widget and move it to the center Modify the on pressed function to work with long press gesture Use osk-manager directly Add an svg image to represent the new powerbar widget Add both powerbar and arrow into a gtk stack since both are occupying the center region Reuse phosh_home_update_osk_button to switch home-bar stack when dragging Closes: https:// gitlab.gnome.org/World/Phosh/phosh/-/issues/380 Signed-off-by: Bardia Moshiri --- data/icons/input-powerbar-symbolic.svg | 1 + src/home.c | 62 +++++++++++++----- src/home.h | 2 +- src/phosh.gresources.xml | 1 + src/stylesheet/common.css | 10 +++ src/ui/home.ui | 87 +++++++++++++++----------- 6 files changed, 107 insertions(+), 56 deletions(-) create mode 100644 data/icons/input-powerbar-symbolic.svg diff --git a/data/icons/input-powerbar-symbolic.svg b/data/icons/input-powerbar-symbolic.svg new file mode 100644 index 000000000..9e1b42b5f --- /dev/null +++ b/data/icons/input-powerbar-symbolic.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/home.c b/src/home.c index aaaf46528..f12e60f76 100644 --- a/src/home.c +++ b/src/home.c @@ -14,7 +14,7 @@ #include "home.h" #include "shell.h" #include "phosh-enums.h" -#include "osk-button.h" +#include "osk-manager.h" #include "util.h" #include @@ -56,8 +56,11 @@ struct _PhoshHome PhoshDragSurface parent; GtkWidget *arrow_home; - GtkWidget *revealer_osk; GtkWidget *overview; + GtkWidget *powerbar; + PhoshOskManager *osk; + GtkWidget *stack; + guint debounce_handle; gboolean focus_app_search; @@ -71,21 +74,22 @@ struct _PhoshHome gboolean osk_enabled; GtkGesture *click_gesture; /* needed so that the gesture isn't destroyed immediately */ + GtkGesture *osk_toggle_long_press; /* to toggle osk from the home bar itself */ + }; G_DEFINE_TYPE(PhoshHome, phosh_home, PHOSH_TYPE_DRAG_SURFACE); static void -phosh_home_update_osk_button (PhoshHome *self) +phosh_home_update_home_bar (PhoshHome *self) { - gboolean visible = FALSE; + const char *visible_child = "home-bar-unfolded"; PhoshDragSurfaceState drag_state = phosh_drag_surface_get_drag_state (PHOSH_DRAG_SURFACE (self)); - if (self->osk_enabled && self->state == PHOSH_HOME_STATE_FOLDED && - drag_state != PHOSH_DRAG_SURFACE_STATE_DRAGGED) - visible = TRUE; + if (self->state == PHOSH_HOME_STATE_FOLDED && drag_state != PHOSH_DRAG_SURFACE_STATE_DRAGGED) + visible_child = "home-bar-folded"; - gtk_revealer_set_reveal_child (GTK_REVEALER (self->revealer_osk), visible); + gtk_stack_set_visible_child_name (GTK_STACK (self->stack), visible_child); } @@ -104,7 +108,6 @@ phosh_home_set_property (GObject *object, break; case PROP_OSK_ENABLED: self->osk_enabled = g_value_get_boolean (value); - phosh_home_update_osk_button (self); g_object_notify_by_pspec (G_OBJECT (self), props[PROP_OSK_ENABLED]); break; default: @@ -146,6 +149,9 @@ update_drag_handle (PhoshHome *self, gboolean commit) PhoshDragSurfaceDragMode drag_mode = PHOSH_DRAG_SURFACE_DRAG_MODE_HANDLE; PhoshDragSurfaceState drag_state = phosh_drag_surface_get_drag_state (PHOSH_DRAG_SURFACE (self)); + /* reset osk_toggle_long_press to prevent OSK from unfolding accidently */ + gtk_event_controller_reset (GTK_EVENT_CONTROLLER (self->osk_toggle_long_press)); + /* Update the handle's arrow and dragability */ if (phosh_overview_has_running_activities (PHOSH_OVERVIEW (self->overview)) == FALSE && self->state == PHOSH_HOME_STATE_UNFOLDED && drag_state != PHOSH_DRAG_SURFACE_STATE_DRAGGED) { @@ -215,11 +221,31 @@ on_home_released (GtkButton *button, int n_press, double x, double y, GtkGesture static void -osk_clicked_cb (PhoshHome *self, GtkButton *btn) +on_powerbar_pressed (PhoshHome *self, PhoshOskManager *osk, PhoshShell *shell) { + gboolean osk_is_available, osk_current_state, osk_new_state; + g_return_if_fail (PHOSH_IS_HOME (self)); - g_return_if_fail (GTK_IS_BUTTON (btn)); - g_signal_emit(self, signals[OSK_ACTIVATED], 0); + shell = phosh_shell_get_default (); + self->osk = phosh_shell_get_osk_manager (shell); + + osk_is_available = phosh_osk_manager_get_available (self->osk); + osk_current_state = phosh_osk_manager_get_visible (self->osk); + osk_new_state = osk_current_state; + + gtk_gesture_set_state ((self->click_gesture), GTK_EVENT_SEQUENCE_DENIED); + + if (osk_is_available) { + osk_new_state = !osk_current_state; + } else { + return; + } + + if (osk_new_state) + g_signal_emit (self, signals[OSK_ACTIVATED], 0); + + g_debug ("OSK toggled with pressed signal"); + phosh_osk_manager_set_visible (self->osk, osk_new_state); } @@ -426,7 +452,7 @@ on_drag_state_changed (PhoshHome *self) g_object_notify_by_pspec (G_OBJECT (self), props[PROP_HOME_STATE]); } - phosh_home_update_osk_button (self); + phosh_home_update_home_bar (self); phosh_layer_surface_set_kbd_interactivity (PHOSH_LAYER_SURFACE (self), kbd_interactivity); update_drag_handle (self, FALSE); @@ -458,6 +484,7 @@ phosh_home_constructed (GObject *object) g_signal_connect (self, "notify::drag-state", G_CALLBACK (on_drag_state_changed), NULL); g_object_set_data (G_OBJECT (self->click_gesture), "phosh-home", self); + g_object_set_data (G_OBJECT (self->osk_toggle_long_press), "phosh-home", self); } @@ -516,19 +543,20 @@ phosh_home_class_init (PhoshHomeClass *klass) g_object_class_install_properties (object_class, PROP_LAST_PROP, props); g_type_ensure (PHOSH_TYPE_ARROW); - g_type_ensure (PHOSH_TYPE_OSK_BUTTON); g_type_ensure (PHOSH_TYPE_OVERVIEW); gtk_widget_class_set_template_from_resource (widget_class, "/sm/puri/phosh/ui/home.ui"); gtk_widget_class_bind_template_child (widget_class, PhoshHome, arrow_home); - gtk_widget_class_bind_template_child (widget_class, PhoshHome, revealer_osk); + gtk_widget_class_bind_template_child (widget_class, PhoshHome, powerbar); + gtk_widget_class_bind_template_child (widget_class, PhoshHome, stack); gtk_widget_class_bind_template_child (widget_class, PhoshHome, click_gesture); + gtk_widget_class_bind_template_child (widget_class, PhoshHome, osk_toggle_long_press); gtk_widget_class_bind_template_child (widget_class, PhoshHome, overview); gtk_widget_class_bind_template_callback (widget_class, fold_cb); gtk_widget_class_bind_template_callback (widget_class, on_home_released); gtk_widget_class_bind_template_callback (widget_class, on_has_activities_changed); - gtk_widget_class_bind_template_callback (widget_class, osk_clicked_cb); + gtk_widget_class_bind_template_callback (widget_class, on_powerbar_pressed); gtk_widget_class_bind_template_callback (widget_class, window_key_press_event_cb); gtk_widget_class_set_css_name (widget_class, "phosh-home"); @@ -543,7 +571,7 @@ phosh_home_init (PhoshHome *self) gtk_widget_init_template (GTK_WIDGET (self)); - phosh_home_update_osk_button (self); + phosh_home_update_home_bar (self); /* Adjust margins and folded state on size changes */ g_signal_connect (self, "configure-event", G_CALLBACK (on_configure_event), NULL); diff --git a/src/home.h b/src/home.h index a34b71550..86c5cfe4f 100644 --- a/src/home.h +++ b/src/home.h @@ -12,7 +12,7 @@ #define PHOSH_TYPE_HOME (phosh_home_get_type()) -#define PHOSH_HOME_BUTTON_HEIGHT 40 +#define PHOSH_HOME_BUTTON_HEIGHT 15 /** * PhoshHomeState: diff --git a/src/phosh.gresources.xml b/src/phosh.gresources.xml index e4c65c600..101ea5307 100644 --- a/src/phosh.gresources.xml +++ b/src/phosh.gresources.xml @@ -52,6 +52,7 @@ ../data/icons/eye-not-looking-symbolic.svg ../data/icons/eye-open-negative-filled-symbolic.svg ../data/icons/feedback-quiet-symbolic.svg + ../data/icons/input-powerbar-symbolic.svg ../data/icons/microphone-hardware-disabled-symbolic.svg ../data/icons/moon-filled-symbolic.svg ../data/icons/network-cellular-disabled-symbolic.svg diff --git a/src/stylesheet/common.css b/src/stylesheet/common.css index 442263345..69ca30142 100644 --- a/src/stylesheet/common.css +++ b/src/stylesheet/common.css @@ -175,6 +175,16 @@ phosh-audio-device-row image { font-size: 90%; } +/* phosh-home */ + +#powerbar { + background: -gtk-recolor(url('resource:///sm/puri/phosh/icons/scalable/status/input-powerbar-symbolic.svg')); + background-position: center; + background-size: 150px 15px; + background-repeat: no-repeat; + transition: 400ms ease; +} + /* * Overview (app grid with favories and, activities) */ diff --git a/src/ui/home.ui b/src/ui/home.ui index ba9ead2c5..aa316ff3a 100644 --- a/src/ui/home.ui +++ b/src/ui/home.ui @@ -12,57 +12,63 @@ True vertical - - + True - home-bar + True + + True - 40 - - + 15 + + True - True - - True + crossfade - + True - center + home-bar center - + True + + + True + True + + 15 + 200 + powerbar + center + center + + + + + home-bar-folded + - - - True - - - - - True - crossfade - False - end - center - 6 - + True - end + home-bar-unfolded + center center - - - + True + + + True + center + center + + + + + home-bar-unfolded + - - - end - + - + - True @@ -83,4 +89,9 @@ evbox_home + + + powerbar + + From af8f75318c0e8df62a61d68a39e5227f66c86cf6 Mon Sep 17 00:00:00 2001 From: mathew-dennis Date: Tue, 5 Dec 2023 20:16:15 +0530 Subject: [PATCH 02/14] home: Make powerbar more interactive Reduce powerbar opacity to indicate longpress recognition has started And revert back to original state one recognition is successful Add animation to indicate osk non-availability Add haptic feedback to indicate a successful osk interaction Signed-off-by: Bardia Moshiri --- src/home.c | 38 ++++++++++++++++++++++++++++++++++++++ src/stylesheet/common.css | 22 ++++++++++++++++++++++ src/ui/home.ui | 5 ++++- 3 files changed, 64 insertions(+), 1 deletion(-) diff --git a/src/home.c b/src/home.c index f12e60f76..8b9640373 100644 --- a/src/home.c +++ b/src/home.c @@ -15,6 +15,7 @@ #include "shell.h" #include "phosh-enums.h" #include "osk-manager.h" +#include "feedback-manager.h" #include "util.h" #include @@ -25,6 +26,9 @@ #define PHOSH_HOME_DRAG_THRESHOLD 0.3 +#define POWERBAR_ACTIVE_CLASS "p-active" +#define POWERBAR_FAILED_CLASS "p-failed" + /** * PhoshHome: * @@ -220,6 +224,33 @@ on_home_released (GtkButton *button, int n_press, double x, double y, GtkGesture } +static void +on_powerbar_action_started (PhoshHome *self) +{ + g_debug ("powerbar action started"); + phosh_util_toggle_style_class (self->stack, POWERBAR_FAILED_CLASS, FALSE); + phosh_util_toggle_style_class (self->stack, POWERBAR_ACTIVE_CLASS, TRUE); +} + + +static void +on_powerbar_action_ended (PhoshHome *self) +{ + g_debug ("powerbar action ended"); + phosh_util_toggle_style_class (self->stack, POWERBAR_ACTIVE_CLASS, FALSE); + phosh_util_toggle_style_class (self->stack, POWERBAR_FAILED_CLASS, FALSE); +} + + +static void +on_powerbar_action_failed (PhoshHome *self) +{ + g_debug ("powerbar action failed"); + phosh_util_toggle_style_class (self->stack, POWERBAR_ACTIVE_CLASS, FALSE); + phosh_util_toggle_style_class (self->stack, POWERBAR_FAILED_CLASS, TRUE); +} + + static void on_powerbar_pressed (PhoshHome *self, PhoshOskManager *osk, PhoshShell *shell) { @@ -237,7 +268,9 @@ on_powerbar_pressed (PhoshHome *self, PhoshOskManager *osk, PhoshShell *shell) if (osk_is_available) { osk_new_state = !osk_current_state; + on_powerbar_action_ended (self); } else { + on_powerbar_action_failed (self); return; } @@ -246,6 +279,8 @@ on_powerbar_pressed (PhoshHome *self, PhoshOskManager *osk, PhoshShell *shell) g_debug ("OSK toggled with pressed signal"); phosh_osk_manager_set_visible (self->osk, osk_new_state); + + phosh_trigger_feedback ("button-pressed"); } @@ -557,6 +592,9 @@ phosh_home_class_init (PhoshHomeClass *klass) gtk_widget_class_bind_template_callback (widget_class, on_home_released); gtk_widget_class_bind_template_callback (widget_class, on_has_activities_changed); gtk_widget_class_bind_template_callback (widget_class, on_powerbar_pressed); + gtk_widget_class_bind_template_callback (widget_class, on_powerbar_action_started); + gtk_widget_class_bind_template_callback (widget_class, on_powerbar_action_ended); + gtk_widget_class_bind_template_callback (widget_class, on_powerbar_action_failed); gtk_widget_class_bind_template_callback (widget_class, window_key_press_event_cb); gtk_widget_class_set_css_name (widget_class, "phosh-home"); diff --git a/src/stylesheet/common.css b/src/stylesheet/common.css index 69ca30142..457dc084d 100644 --- a/src/stylesheet/common.css +++ b/src/stylesheet/common.css @@ -185,6 +185,28 @@ phosh-audio-device-row image { transition: 400ms ease; } +.p-active #powerbar { + opacity: 0.5; +} + +.p-failed #powerbar { + background-size: 150px 15px; + transition: 300ms ease; + animation: error-shake 1.5s ease; + animation-iteration-count: 1; +} + +@keyframes error-shake { + 0% {background-position: center; opacity: .5;} + 10% {background-position: center; opacity: .7;} + 15% {background-position: left; opacity: 1;} + 30% {background-position: right;} + 45% {background-position: left;} + 60% {background-position: right;} + 80% {background-position: center;} + 100% {background-position: center;} +} + /* * Overview (app grid with favories and, activities) */ diff --git a/src/ui/home.ui b/src/ui/home.ui index aa316ff3a..eb5d628f9 100644 --- a/src/ui/home.ui +++ b/src/ui/home.ui @@ -18,7 +18,7 @@ True - 15 + 15 True @@ -92,6 +92,9 @@ powerbar + + + From 319a2cb2af4359d6c26ee262ae283287685590a9 Mon Sep 17 00:00:00 2001 From: Bardia Moshiri Date: Wed, 13 Dec 2023 18:06:34 +0000 Subject: [PATCH 03/14] wwan-ofono: Mark access technology nr as 5G Signed-off-by: Bardia Moshiri Signed-off-by: Bardia Moshiri --- src/wwan/phosh-wwan-ofono.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/wwan/phosh-wwan-ofono.c b/src/wwan/phosh-wwan-ofono.c index 94532cb7e..e3e89e4b6 100644 --- a/src/wwan/phosh-wwan-ofono.c +++ b/src/wwan/phosh-wwan-ofono.c @@ -90,6 +90,8 @@ phosh_wwan_ofono_user_friendly_access_tec (const char *access_tec) return "3.5G"; if (g_strcmp0 (access_tec, "lte") == 0) return "4G"; + if (g_strcmp0 (access_tec, "nr") == 0) + return "5G"; return NULL; } From 21d719c2c35e37338ee53ed6b78576a6fd09b030 Mon Sep 17 00:00:00 2001 From: Bardia Moshiri Date: Wed, 13 Dec 2023 18:09:35 +0000 Subject: [PATCH 04/14] wwan-mm: Mark access technology MM_MODEM_ACCESS_TECHNOLOGY_5GNR as 5G Signed-off-by: Bardia Moshiri Signed-off-by: Bardia Moshiri --- src/wwan/phosh-wwan-mm.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/wwan/phosh-wwan-mm.c b/src/wwan/phosh-wwan-mm.c index 70f452cc8..692d34029 100644 --- a/src/wwan/phosh-wwan-mm.c +++ b/src/wwan/phosh-wwan-mm.c @@ -42,6 +42,7 @@ typedef enum { /* From ModemManager-enums.h */ MM_MODEM_ACCESS_TECHNOLOGY_EVDOA = 1 << 12, MM_MODEM_ACCESS_TECHNOLOGY_EVDOB = 1 << 13, MM_MODEM_ACCESS_TECHNOLOGY_LTE = 1 << 14, + MM_MODEM_ACCESS_TECHNOLOGY_5GNR = 1 << 15, } PhoshWWanMMAccessTechnology; typedef enum { /* From ModemManager-enums.h */ @@ -145,6 +146,8 @@ phosh_wwan_mm_user_friendly_access_tec (guint access_tec) return "3.75G"; case MM_MODEM_ACCESS_TECHNOLOGY_LTE: return "4G"; + case MM_MODEM_ACCESS_TECHNOLOGY_5GNR: + return "5G"; case MM_MODEM_ACCESS_TECHNOLOGY_1XRTT: case MM_MODEM_ACCESS_TECHNOLOGY_EVDO0: case MM_MODEM_ACCESS_TECHNOLOGY_EVDOA: From 89e658b62fb79e6f1f851bad3f285c871efa6065 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Guido=20G=C3=BCnther?= Date: Tue, 7 Nov 2023 20:53:42 +0530 Subject: [PATCH 05/14] Use background in overview * integrate with navbar Signed-off-by: Bardia Moshiri --- src/background-manager.c | 14 +++---- src/background.c | 9 ++++- src/background.h | 3 +- src/home.c | 20 ++++++++-- src/layersurface.c | 17 ++++++++ src/layersurface.h | 1 + src/lockscreen.c | 84 ++++++++++++++++++++++++++++++++++----- src/phosh-wayland.c | 14 ++++++- src/phosh-wayland.h | 7 ++-- src/shell.c | 32 +++++++++++++-- src/shell.h | 2 + src/stylesheet/common.css | 31 +++++++++++---- src/util.c | 33 +++++++++++++++ src/util.h | 1 + 14 files changed, 231 insertions(+), 37 deletions(-) diff --git a/src/background-manager.c b/src/background-manager.c index e4cdd0079..f5818328d 100644 --- a/src/background-manager.c +++ b/src/background-manager.c @@ -38,17 +38,17 @@ static PhoshBackground * create_background_for_monitor (PhoshBackgroundManager *self, PhoshMonitor *monitor) { PhoshWayland *wl = phosh_wayland_get_default(); - PhoshBackground *background; + GtkWidget *background; - background = g_object_ref_sink(PHOSH_BACKGROUND (phosh_background_new ( - phosh_wayland_get_zwlr_layer_shell_v1(wl), - monitor->wl_output, - MAX(1.0, phosh_monitor_get_fractional_scale (monitor)), - monitor == self->primary_monitor))); + background = phosh_background_new (phosh_wayland_get_zwlr_layer_shell_v1 (wl), + monitor->wl_output, + MAX(1.0, phosh_monitor_get_fractional_scale (monitor)), + monitor == self->primary_monitor, + ZWLR_LAYER_SHELL_V1_LAYER_BACKGROUND); g_hash_table_insert (self->backgrounds, g_object_ref (monitor), background); - return background; + return PHOSH_BACKGROUND (background); } diff --git a/src/background.c b/src/background.c index f77bb0260..1702189d4 100644 --- a/src/background.c +++ b/src/background.c @@ -266,9 +266,11 @@ background_update (PhoshBackground *self, GdkPixbuf *pixbuf, GDesktopBackgroundS g_clear_object (&self->pixbuf); +#if 0 if (self->primary) phosh_shell_get_usable_area (phosh_shell_get_default (), NULL, NULL, &width, &height); else +#endif g_object_get (self, "configured-width", &width, "configured-height", &height, NULL); g_debug ("Scaling %p to %dx%d, scale %f", self, width, height, self->scale); @@ -466,8 +468,10 @@ background_draw_cb (PhoshBackground *self, g_return_val_if_fail (GDK_IS_PIXBUF (self->pixbuf), TRUE); +#if 0 if (self->primary) phosh_shell_get_usable_area (phosh_shell_get_default (), &x, &y, NULL, NULL); +#endif cairo_save(cr); cairo_scale(cr, 1.0 / self->scale, 1.0 / self->scale); @@ -626,7 +630,8 @@ GtkWidget * phosh_background_new (gpointer layer_shell, gpointer wl_output, float scale, - gboolean primary) + gboolean primary, + guint layer) { return g_object_new (PHOSH_TYPE_BACKGROUND, "layer-shell", layer_shell, @@ -635,7 +640,7 @@ phosh_background_new (gpointer layer_shell, ZWLR_LAYER_SURFACE_V1_ANCHOR_BOTTOM | ZWLR_LAYER_SURFACE_V1_ANCHOR_LEFT | ZWLR_LAYER_SURFACE_V1_ANCHOR_RIGHT), - "layer", ZWLR_LAYER_SHELL_V1_LAYER_BACKGROUND, + "layer", layer, "kbd-interactivity", FALSE, "exclusive-zone", -1, "namespace", "phosh background", diff --git a/src/background.h b/src/background.h index 8b921edf1..d6599a5bc 100644 --- a/src/background.h +++ b/src/background.h @@ -19,6 +19,7 @@ G_DECLARE_FINAL_TYPE (PhoshBackground, phosh_background, PHOSH, BACKGROUND, Phos GtkWidget *phosh_background_new (gpointer layer_shell, gpointer wl_output, float scale, - gboolean primary); + gboolean primary, + guint layer); void phosh_background_set_primary (PhoshBackground *self, gboolean primary); void phosh_background_set_scale (PhoshBackground *self, float scale); diff --git a/src/home.c b/src/home.c index 8b9640373..835ca1a79 100644 --- a/src/home.c +++ b/src/home.c @@ -28,6 +28,7 @@ #define POWERBAR_ACTIVE_CLASS "p-active" #define POWERBAR_FAILED_CLASS "p-failed" +#define HOMEBAR_OPAQUE_CLASS "opaque" /** * PhoshHome: @@ -87,13 +88,18 @@ G_DEFINE_TYPE(PhoshHome, phosh_home, PHOSH_TYPE_DRAG_SURFACE); static void phosh_home_update_home_bar (PhoshHome *self) { + gboolean home_bar_transparent = FALSE; + const char *visible_child = "home-bar-unfolded"; PhoshDragSurfaceState drag_state = phosh_drag_surface_get_drag_state (PHOSH_DRAG_SURFACE (self)); - if (self->state == PHOSH_HOME_STATE_FOLDED && drag_state != PHOSH_DRAG_SURFACE_STATE_DRAGGED) + if (self->state == PHOSH_HOME_STATE_FOLDED && drag_state != PHOSH_DRAG_SURFACE_STATE_DRAGGED) { visible_child = "home-bar-folded"; + home_bar_transparent = TRUE; + } gtk_stack_set_visible_child_name (GTK_STACK (self->stack), visible_child); + phosh_util_toggle_style_class (self->stack, HOMEBAR_OPAQUE_CLASS , home_bar_transparent); } @@ -444,9 +450,15 @@ phosh_home_dragged (PhoshDragSurface *self, int margin) { PhoshHome *home = PHOSH_HOME (self); int width, height; + double progress; + gtk_window_get_size (GTK_WINDOW (self), &width, &height); - phosh_arrow_set_progress (PHOSH_ARROW (home->arrow_home), 1.0 - (-margin / (double)(height - PHOSH_HOME_BUTTON_HEIGHT))); - g_debug ("Margin: %d", margin); + + progress = 1.0 - (-margin / (double)(height - PHOSH_HOME_BUTTON_HEIGHT)); + + g_debug ("Margin: %d, %f", margin, progress); + phosh_arrow_set_progress (PHOSH_ARROW (home->arrow_home), progress); + phosh_shell_set_bg_alpha (phosh_shell_get_default (), hdy_ease_out_cubic (progress)); } @@ -468,10 +480,12 @@ on_drag_state_changed (PhoshHome *self) phosh_overview_focus_app_search (PHOSH_OVERVIEW (self->overview)); self->focus_app_search = FALSE; } + phosh_shell_set_bg_alpha (phosh_shell_get_default (), 1.0); break; case PHOSH_DRAG_SURFACE_STATE_FOLDED: state = PHOSH_HOME_STATE_FOLDED; phosh_arrow_set_progress (PHOSH_ARROW (self->arrow_home), 0.0); + phosh_shell_set_bg_alpha (phosh_shell_get_default (), 0.0); break; case PHOSH_DRAG_SURFACE_STATE_DRAGGED: if (self->state == PHOSH_HOME_STATE_FOLDED) diff --git a/src/layersurface.c b/src/layersurface.c index 479c87d00..f86e849a3 100644 --- a/src/layersurface.c +++ b/src/layersurface.c @@ -9,6 +9,7 @@ #define G_LOG_DOMAIN "phosh-layer-surface" #include "phosh-config.h" +#include "phosh-wayland.h" #include "layersurface.h" #include "phosh-wayland.h" #include "phoc-layer-shell-effects-unstable-v1-client-protocol.h" @@ -879,3 +880,19 @@ phosh_layer_surface_has_alpha (PhoshLayerSurface *self) return !!priv->alpha_surface; } + + +void +phosh_layer_surface_set_empty_input_region (PhoshLayerSurface *self) +{ + PhoshLayerSurfacePrivate *priv; + struct wl_region *empty; + + g_return_if_fail (PHOSH_IS_LAYER_SURFACE (self)); + priv = phosh_layer_surface_get_instance_private (self); + + empty = wl_compositor_create_region (phosh_wayland_get_compositor (phosh_wayland_get_default())); + wl_surface_set_input_region (priv->wl_surface, empty); + wl_surface_commit (priv->wl_surface); + wl_region_destroy (empty); +} diff --git a/src/layersurface.h b/src/layersurface.h index 488eb00a4..d260a1785 100644 --- a/src/layersurface.h +++ b/src/layersurface.h @@ -59,5 +59,6 @@ int phosh_layer_surface_get_configured_height (Pho void phosh_layer_surface_set_alpha (PhoshLayerSurface *self, double alpha); gboolean phosh_layer_surface_has_alpha (PhoshLayerSurface *self); +void phosh_layer_surface_set_empty_input_region (PhoshLayerSurface *self); G_END_DECLS diff --git a/src/lockscreen.c b/src/lockscreen.c index 5d93a3f69..4aae0c98d 100644 --- a/src/lockscreen.c +++ b/src/lockscreen.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018 Purism SPC + * Copyright (C) 2018-2023 Purism SPC * * SPDX-License-Identifier: GPL-3.0-or-later * @@ -84,6 +84,8 @@ typedef struct { HdyDeck *deck; GtkWidget *carousel; + GtkCssProvider *provider; + /* info page */ GtkWidget *box_info; GtkWidget *box_datetime; @@ -94,7 +96,7 @@ typedef struct { GtkRevealer *rev_call_notifications; GtkRevealer *rev_media_player; GtkRevealer *rev_notifications; - GSettings *settings; + GSettings *notification_settings; guint reveals; /* unlock page */ @@ -109,7 +111,7 @@ typedef struct { guint idle_timer; gint64 last_input; PhoshAuth *auth; - GSettings *keypad_settings; + GSettings *lockscreen_settings; /* widget box */ GtkWidget *widget_box; @@ -748,7 +750,7 @@ on_notification_items_changed (PhoshLockscreen *self, g_return_if_fail (PHOSH_IS_LOCKSCREEN (self)); priv = phosh_lockscreen_get_instance_private (self); - show_in_lockscreen = g_settings_get_boolean (priv->settings, "show-in-lock-screen"); + show_in_lockscreen = g_settings_get_boolean (priv->notification_settings, "show-in-lock-screen"); is_empty = !g_list_model_get_n_items (list); reveal = show_in_lockscreen && !is_empty; @@ -757,6 +759,65 @@ on_notification_items_changed (PhoshLockscreen *self, } +static void +clear_css_provider (PhoshLockscreen *self) +{ + PhoshLockscreenPrivate *priv = phosh_lockscreen_get_instance_private (self); + + if (priv->provider == NULL) + return; + + gtk_style_context_remove_provider_for_screen (gdk_screen_get_default (), + GTK_STYLE_PROVIDER (priv->provider)); + g_clear_object (&priv->provider); +} + + +static void +load_background (PhoshLockscreen *self) +{ + PhoshLockscreenPrivate *priv = phosh_lockscreen_get_instance_private (self); + g_autoptr (GSettings) settings = g_settings_new ("org.gnome.desktop.screensaver"); + g_autofree char *uri = NULL; + g_autofree char *css = NULL; + g_autoptr (GError) err = NULL; + + g_return_if_fail (priv->provider == NULL); + + uri = g_settings_get_string (settings, "picture-uri"); + if (STR_IS_NULL_OR_EMPTY (uri)) { + clear_css_provider (self); + return; + } + + if (g_str_has_suffix (uri, ".xml")) { + g_warning ("Ignoring XML background '%s'", uri); + return; + } + + priv->provider = gtk_css_provider_new (); + css = g_strdup_printf ("phosh-lockscreen {\n" + " background-image: url(\"%s\");\n" + " background-size: cover;\n" + " background-position: center;\n" + "}\n" + "" + "phosh-top-panel {\n" + " background: none;\n" + "}\n", uri); + if (gtk_css_provider_load_from_data (GTK_CSS_PROVIDER (priv->provider), css, -1, &err)) { + g_debug ("Using lockscreen image '%s'", uri); + } else { + g_warning ("Failed to load lockscreen image '%s': %s", uri, err->message); + return; + } + + gtk_style_context_add_provider_for_screen (gdk_screen_get_default (), + GTK_STYLE_PROVIDER (priv->provider), + GTK_STYLE_PROVIDER_PRIORITY_APPLICATION + 1); +} + + static void phosh_lockscreen_constructed (GObject *object) { @@ -817,7 +878,7 @@ phosh_lockscreen_constructed (GObject *object) update_active_call (self, active); manager = phosh_notify_manager_get_default (); - priv->settings = g_settings_new(NOTIFICATIONS_SCHEMA_ID); + priv->notification_settings = g_settings_new (NOTIFICATIONS_SCHEMA_ID); gtk_list_box_bind_model (GTK_LIST_BOX (priv->list_notifications), G_LIST_MODEL (phosh_notify_manager_get_list (manager)), create_notification_row, @@ -843,17 +904,19 @@ phosh_lockscreen_constructed (GObject *object) priv->btn_keyboard, "sensitive", G_BINDING_SYNC_CREATE); - priv->keypad_settings = g_settings_new("sm.puri.phosh.lockscreen"); - g_settings_bind (priv->keypad_settings, "shuffle-keypad", + priv->lockscreen_settings = g_settings_new ("sm.puri.phosh.lockscreen"); + g_settings_bind (priv->lockscreen_settings, "shuffle-keypad", priv->keypad, "shuffle", G_SETTINGS_BIND_GET); plugin_settings = g_settings_new ("sm.puri.phosh.plugins"); plugins = g_settings_get_strv (plugin_settings, "lock-screen"); - if (plugins) phosh_widget_box_set_plugins (PHOSH_WIDGET_BOX (priv->widget_box), plugins); + if (!phosh_is_high_contrast (GTK_WIDGET (self))) + load_background (self); + on_deck_visible_child_changed (self, NULL, priv->deck); } @@ -883,12 +946,13 @@ phosh_lockscreen_dispose (GObject *object) PhoshLockscreen *self = PHOSH_LOCKSCREEN (object); PhoshLockscreenPrivate *priv = phosh_lockscreen_get_instance_private (self); - g_clear_object (&priv->settings); + g_clear_object (&priv->notification_settings); g_clear_object (&priv->wall_clock); g_clear_handle_id (&priv->idle_timer, g_source_remove); g_clear_object (&priv->calls_manager); g_clear_pointer (&priv->active, g_free); - g_clear_object (&priv->keypad_settings); + g_clear_object (&priv->lockscreen_settings); + clear_css_provider (self); G_OBJECT_CLASS (phosh_lockscreen_parent_class)->dispose (object); } diff --git a/src/phosh-wayland.c b/src/phosh-wayland.c index f5edf8ade..3365f35d0 100644 --- a/src/phosh-wayland.c +++ b/src/phosh-wayland.c @@ -59,6 +59,7 @@ struct _PhoshWayland { struct zphoc_layer_shell_effects_v1 *zphoc_layer_shell_effects_v1; struct zphoc_device_state_v1 *zphoc_device_state_v1; struct wl_shm *wl_shm; + struct wl_compositor *wl_compositor; GHashTable *wl_outputs; PhoshWaylandSeatCapabilities seat_capabilities; }; @@ -123,6 +124,8 @@ registry_handle_global (void *data, self->wl_shm = wl_registry_bind( registry, name, &wl_shm_interface, 1); + } else if (!strcmp(interface, "wl_compositor")) { + self->wl_compositor = wl_registry_bind(registry, name, &wl_compositor_interface, 3); } else if (!strcmp(interface, zwlr_input_inhibit_manager_v1_interface.name)) { self->input_inhibit_manager = wl_registry_bind( registry, @@ -310,7 +313,7 @@ phosh_wayland_constructed (GObject *object) "inhibit: %p, xdg_wm: %p, " "xdg_output: %p, wlr_output_manager: %p, " "wlr_foreign_toplevel_manager: %p, " - "zwlr_output_power_manager_v1: %p, " +"zwlr_output_power_manager_v1: %p, " "zphoc_layer_shell_effects_v1: %p" "\n", num_outputs, self->layer_shell, self->idle_manager, @@ -620,3 +623,12 @@ phosh_wayland_get_zphoc_device_state_v1 (PhoshWayland *self) return self->zphoc_device_state_v1; } + + +struct wl_compositor * +phosh_wayland_get_compositor (PhoshWayland *self) +{ + g_return_val_if_fail (PHOSH_IS_WAYLAND (self), NULL); + + return self->wl_compositor; +} \ No newline at end of file diff --git a/src/phosh-wayland.h b/src/phosh-wayland.h index 407bfa67c..9c076e9f5 100644 --- a/src/phosh-wayland.h +++ b/src/phosh-wayland.h @@ -21,7 +21,7 @@ #include "wlr-screencopy-unstable-v1-client-protocol.h" #include "xdg-output-unstable-v1-client-protocol.h" #include "xdg-shell-client-protocol.h" - +#include "phoc-layer-shell-effects-unstable-v1-client-protocol.h" /* This goes past the other wl protocols since it might need their structs */ #include "phosh-private-client-protocol.h" @@ -42,12 +42,12 @@ G_BEGIN_DECLS * These match wl_seat_capabilities */ typedef enum { - /* From wl_seat */ +/* From wl_seat */ PHOSH_WAYLAND_SEAT_CAPABILITY_NONE = 0, PHOSH_WAYLAND_SEAT_CAPABILITY_POINTER = (1 << 0), PHOSH_WAYLAND_SEAT_CAPABILITY_KEYBOARD = (1 << 1), PHOSH_WAYLAND_SEAT_CAPABILITY_TOUCH = (1 << 2), - /* From device_state */ +/* From device_state */ PHOSH_WAYLAND_SEAT_CAPABILITY_TABLET_MODE_SWITCH = (1 << 8), PHOSH_WAYLAND_SEAT_CAPABILITY_LID_SWITCH = (1 << 9), } PhoshWaylandSeatCapabilities; @@ -79,4 +79,5 @@ void phosh_wayland_roundtrip (PhoshWayland *sel PhoshWaylandSeatCapabilities phosh_wayland_get_seat_capabilities (PhoshWayland *self); struct zphoc_layer_shell_effects_v1 *phosh_wayland_get_zphoc_layer_shell_effects_v1 (PhoshWayland *self); struct zphoc_device_state_v1 *phosh_wayland_get_zphoc_device_state_v1 (PhoshWayland *self); +struct wl_compositor *phosh_wayland_get_compositor (PhoshWayland *self); G_END_DECLS diff --git a/src/shell.c b/src/shell.c index a8fe675b3..386d477a4 100644 --- a/src/shell.c +++ b/src/shell.c @@ -23,6 +23,7 @@ #include "phosh-config.h" #include "ambient.h" +#include "background.h" #include "drag-surface.h" #include "shell.h" #include "app-tracker.h" @@ -123,6 +124,7 @@ static PhoshShellDebugFlags debug_flags; typedef struct { + PhoshBackground *top_bg; PhoshDragSurface *top_panel; PhoshDragSurface *home; GPtrArray *faders; /* for final fade out */ @@ -286,6 +288,10 @@ on_home_state_changed (PhoshShell *self, GParamSpec *pspec, PhoshHome *home) g_object_get (priv->home, "state", &state, NULL); phosh_shell_set_state (self, PHOSH_STATE_OVERVIEW, state == PHOSH_HOME_STATE_UNFOLDED); + + if (state == PHOSH_HOME_STATE_FOLDED) { + phosh_layer_surface_set_empty_input_region (PHOSH_LAYER_SURFACE (priv->top_bg)); + } } @@ -349,6 +355,16 @@ panels_create (PhoshShell *self) monitor = phosh_shell_get_primary_monitor (self); g_return_if_fail (monitor); + /* TODO: just handle the background as part of PhoshHome */ + /* Add a "background layer in the top layer */ + priv->top_bg = PHOSH_BACKGROUND (phosh_background_new ( + phosh_wayland_get_zwlr_layer_shell_v1(wl), + monitor->wl_output, + MAX(1.0, phosh_monitor_get_fractional_scale (monitor)), + TRUE, + ZWLR_LAYER_SHELL_V1_LAYER_TOP));; + gtk_widget_show (GTK_WIDGET (priv->top_bg)); + top_layer = priv->locked ? ZWLR_LAYER_SHELL_V1_LAYER_OVERLAY : ZWLR_LAYER_SHELL_V1_LAYER_TOP; priv->top_panel = PHOSH_DRAG_SURFACE (phosh_top_panel_new ( phosh_wayland_get_zwlr_layer_shell_v1 (wl), @@ -777,7 +793,7 @@ setup_idle_cb (PhoshShell *self) priv->suspend_manager = phosh_suspend_manager_new (); priv->emergency_calls_manager = phosh_emergency_calls_manager_new (); priv->power_menu_manager = phosh_power_menu_manager_new (); - + setup_primary_monitor_signal_handlers (self); /* Delay signaling the compositor a bit so that idle handlers get a @@ -2163,7 +2179,6 @@ phosh_shell_get_blanked (PhoshShell *self) return phosh_shell_get_state (self) & PHOSH_STATE_BLANKED; } - /** * phosh_shell_activate_action: * @self: The #PhoshShell singleton @@ -2203,5 +2218,16 @@ phosh_shell_get_debug_flags (void) return debug_flags; } -/* }}} */ +void +phosh_shell_set_bg_alpha (PhoshShell *self, double alpha) +{ + PhoshShellPrivate *priv; + + g_return_if_fail (PHOSH_IS_SHELL (self)); + priv = phosh_shell_get_instance_private (self); + + phosh_layer_surface_set_alpha (PHOSH_LAYER_SURFACE (priv->top_bg), alpha); +} + +/* }}} */ diff --git a/src/shell.h b/src/shell.h index 7eab4e935..caa7cf871 100644 --- a/src/shell.h +++ b/src/shell.h @@ -144,4 +144,6 @@ gboolean phosh_shell_activate_action (PhoshShell *self, const char *action, GVariant *parameter); +void phosh_shell_set_bg_alpha (PhoshShell *self, double alpha); + G_END_DECLS diff --git a/src/stylesheet/common.css b/src/stylesheet/common.css index 457dc084d..087dbaf7f 100644 --- a/src/stylesheet/common.css +++ b/src/stylesheet/common.css @@ -1,7 +1,8 @@ /* * Top panel and bar */ -phosh-top-panel { + phosh-top-panel { + color: @phosh_fg_color; font: 15px Cantarell; } @@ -53,12 +54,20 @@ phosh-top-panel .phosh-topbar-date { min-width: 0; min-height: 0; padding: 6px; + background: none; } /* * Settings menu */ +widget.phosh-settings-menu > scrolledwindow { + background-color: @phosh_bg_color; + border-radius: 24px; + margin-left: 6px; + margin-right: 6px; +} + .phosh-settings-menu { background-color: @phosh_bg_color; border-bottom-right-radius: 12px; @@ -70,7 +79,7 @@ phosh-top-panel .phosh-topbar-date { } .phosh-settings-menu scrolledwindow > viewport { - padding: 0 16px; + padding: 0 12px; } #phosh_quick_settings flowboxchild > button { @@ -177,6 +186,10 @@ phosh-audio-device-row image { /* phosh-home */ +.opaque { + background-color: @phosh_bg_color; +} + #powerbar { background: -gtk-recolor(url('resource:///sm/puri/phosh/icons/scalable/status/input-powerbar-symbolic.svg')); background-position: center; @@ -242,8 +255,8 @@ phosh-activity.phosh-empty { background-size: cover; } -phosh-home, phosh-top-panel { - background: @phosh_bg_color; +phosh-home { + background: none; color: @phosh_fg_color; } @@ -256,7 +269,7 @@ phosh-home, phosh-top-panel { } .phosh-overview { - background: @phosh_bg_color; + background: none; color: @phosh_fg_color; } @@ -298,7 +311,7 @@ phosh-home, phosh-top-panel { } phosh-app-grid { - background: @phosh_bg_color; + background: none; color: @phosh_fg_color; } @@ -331,7 +344,11 @@ phosh-app-grid-button button { * Lock screen */ -phosh-lockscreen, +phosh-lockscreen { + background-color: @phosh_bg_color; + color: @phosh_fg_color; +} + .phosh-lockshield { background-color: @phosh_bg_color; color: @phosh_fg_color; diff --git a/src/util.c b/src/util.c index a672b43a3..6ab42eb97 100644 --- a/src/util.c +++ b/src/util.c @@ -616,3 +616,36 @@ phosh_clear_fd (int *fd, GError **err) return success; } + +/** + * phosh_is_high_contrast: + * @widget:(nullable): a widget or %NULL. + * + * Check if a high contrast theme is in use. If no widget is passed + * the default GTK settings object is used. + * + * Returns: %TRUE if phosh currently using a high contrast theme + */ +gboolean +phosh_is_high_contrast (GtkWidget *widget) +{ + GtkSettings *settings = NULL; + g_autofree char *theme_name = NULL; + + g_return_val_if_fail (widget == NULL || GTK_IS_WIDGET (widget), FALSE); + + if (widget) + settings = gtk_widget_get_settings (widget); + else + settings = gtk_settings_get_default (); + + g_return_val_if_fail (GTK_IS_SETTINGS (settings), FALSE); + + g_object_get (settings, "gtk-theme-name", &theme_name, NULL); + if (g_strcmp0 (theme_name, "HighContrast") && + g_strcmp0 (theme_name, "HighContrastInverse")) { + return FALSE; + } + + return TRUE; +} diff --git a/src/util.h b/src/util.h index 567fc93f1..3a0acb267 100644 --- a/src/util.h +++ b/src/util.h @@ -39,3 +39,4 @@ gboolean phosh_util_have_gnome_software (gboolean scan); void phosh_util_toggle_style_class (GtkWidget *widget, const char *style_class, gboolean toggle); const char *phosh_util_get_stylesheet (const char *theme_name); gboolean phosh_clear_fd (int *fd, GError **err); +gboolean phosh_is_high_contrast (GtkWidget *widget); From 02d6a77232c054bde93b2ea593dd32acac983469 Mon Sep 17 00:00:00 2001 From: Bardia Moshiri Date: Thu, 14 Dec 2023 14:54:32 -0500 Subject: [PATCH 06/14] home: enable home bar app switching using swipe gestures * integrate with powerbar Signed-off-by: Bardia Moshiri --- src/home.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++ src/ui/home.ui | 7 +++++++ 2 files changed, 60 insertions(+) diff --git a/src/home.c b/src/home.c index 835ca1a79..4c1d3bf56 100644 --- a/src/home.c +++ b/src/home.c @@ -65,6 +65,7 @@ struct _PhoshHome GtkWidget *powerbar; PhoshOskManager *osk; GtkWidget *stack; + GtkGesture *swipe_gesture; guint debounce_handle; gboolean focus_app_search; @@ -289,6 +290,55 @@ on_powerbar_pressed (PhoshHome *self, PhoshOskManager *osk, PhoshShell *shell) phosh_trigger_feedback ("button-pressed"); } +static void +on_powerbar_swiped (GtkGestureSwipe *gesture, double velocity_x, double velocity_y, gpointer user_data) +{ + PhoshHome *self; + PhoshToplevelManager *toplevel_manager; + + gint toplevel_n; + gint toplevel_active; + gint toplevel_next; + + self = g_object_get_data (G_OBJECT (gesture), "phosh-home"); + g_return_if_fail (PHOSH_IS_HOME (self)); + + /* only allow swiping when folded; it doesn't make sense while in the overview */ + if (phosh_drag_surface_get_drag_state(PHOSH_DRAG_SURFACE (self)) != PHOSH_DRAG_SURFACE_STATE_FOLDED) + return; + + g_debug("detected swipe on home: velocity_x: %f; velocity_y: %f", velocity_x, velocity_y); + + toplevel_manager = phosh_shell_get_toplevel_manager (phosh_shell_get_default ()); + + toplevel_n = phosh_toplevel_manager_get_num_toplevels(toplevel_manager); + if (toplevel_n < 2) /* no swipe possible if there is only one activity */ + return; + + for (toplevel_active = 0; toplevel_active < toplevel_n; toplevel_active++) { + if (phosh_toplevel_is_activated (phosh_toplevel_manager_get_toplevel (toplevel_manager, toplevel_active))) + break; + if (toplevel_active == toplevel_n -1) // no toplevel active? + return; + } + + if (velocity_x < 0) + toplevel_next = toplevel_active + 1; + else if (velocity_x > 0) + toplevel_next = toplevel_active - 1; + else + return; + + if (toplevel_next < 0 || toplevel_next >= toplevel_n) { + g_debug ("next toplevel is out of bounds - id: %d", toplevel_next); + return; + } + + phosh_toplevel_activate ( + phosh_toplevel_manager_get_toplevel (toplevel_manager, toplevel_next), + phosh_wayland_get_wl_seat (phosh_wayland_get_default ())); +} + static void fold_cb (PhoshHome *self, PhoshOverview *overview) @@ -534,6 +584,7 @@ phosh_home_constructed (GObject *object) g_object_set_data (G_OBJECT (self->click_gesture), "phosh-home", self); g_object_set_data (G_OBJECT (self->osk_toggle_long_press), "phosh-home", self); + g_object_set_data (G_OBJECT (self->swipe_gesture), "phosh-home", self); } @@ -601,9 +652,11 @@ phosh_home_class_init (PhoshHomeClass *klass) gtk_widget_class_bind_template_child (widget_class, PhoshHome, stack); gtk_widget_class_bind_template_child (widget_class, PhoshHome, click_gesture); gtk_widget_class_bind_template_child (widget_class, PhoshHome, osk_toggle_long_press); + gtk_widget_class_bind_template_child (widget_class, PhoshHome, swipe_gesture); gtk_widget_class_bind_template_child (widget_class, PhoshHome, overview); gtk_widget_class_bind_template_callback (widget_class, fold_cb); gtk_widget_class_bind_template_callback (widget_class, on_home_released); + gtk_widget_class_bind_template_callback (widget_class, on_powerbar_swiped); gtk_widget_class_bind_template_callback (widget_class, on_has_activities_changed); gtk_widget_class_bind_template_callback (widget_class, on_powerbar_pressed); gtk_widget_class_bind_template_callback (widget_class, on_powerbar_action_started); diff --git a/src/ui/home.ui b/src/ui/home.ui index eb5d628f9..00efbb4a6 100644 --- a/src/ui/home.ui +++ b/src/ui/home.ui @@ -97,4 +97,11 @@ + + + powerbar + + + + From 1f0098328be045cf84234709cc0f1b5a355a1ca2 Mon Sep 17 00:00:00 2001 From: mathew-dennis <78794223+mathew-dennis@users.noreply.github.com> Date: Fri, 10 Nov 2023 00:24:11 +0530 Subject: [PATCH 07/14] home: Tweak swipe velocity to reduce accidental swipes Signed-off-by: Bardia Moshiri --- src/home.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/home.c b/src/home.c index 4c1d3bf56..c74a7072d 100644 --- a/src/home.c +++ b/src/home.c @@ -322,9 +322,9 @@ on_powerbar_swiped (GtkGestureSwipe *gesture, double velocity_x, double velocity return; } - if (velocity_x < 0) + if (velocity_x < -300) toplevel_next = toplevel_active + 1; - else if (velocity_x > 0) + else if (velocity_x > 300) toplevel_next = toplevel_active - 1; else return; From da0cb357f39b4e78d414fa9f96d53444fb34c386 Mon Sep 17 00:00:00 2001 From: mathew-dennis <78794223+mathew-dennis@users.noreply.github.com> Date: Thu, 9 Nov 2023 19:53:18 +0530 Subject: [PATCH 08/14] tests: fix background test failure Signed-off-by: Bardia Moshiri --- tests/test-background.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/test-background.c b/tests/test-background.c index 394fe6635..66027ba2c 100644 --- a/tests/test-background.c +++ b/tests/test-background.c @@ -55,7 +55,8 @@ test_background_new (Fixture *fixture, gconstpointer unused) fixture->base.state->wl), fixture->base.state->output, 1, - TRUE); + TRUE + ZWLR_LAYER_SHELL_V1_LAYER_BACKGROUND); g_assert_true (PHOSH_IS_BACKGROUND (background)); g_object_get (background, "primary", &primary, NULL); g_assert_true (primary); From 065c7d0262f2d4e3330f28c2e1960f77356d14a5 Mon Sep 17 00:00:00 2001 From: mathew-dennis <78794223+mathew-dennis@users.noreply.github.com> Date: Thu, 9 Nov 2023 23:56:55 +0530 Subject: [PATCH 09/14] lockscreen: Don't set background wallpaper for lockscreen Signed-off-by: Bardia Moshiri --- src/lockscreen.c | 86 +++++++----------------------------------------- 1 file changed, 11 insertions(+), 75 deletions(-) diff --git a/src/lockscreen.c b/src/lockscreen.c index 4aae0c98d..94d05a579 100644 --- a/src/lockscreen.c +++ b/src/lockscreen.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018-2023 Purism SPC + * Copyright (C) 2018 Purism SPC * * SPDX-License-Identifier: GPL-3.0-or-later * @@ -84,8 +84,6 @@ typedef struct { HdyDeck *deck; GtkWidget *carousel; - GtkCssProvider *provider; - /* info page */ GtkWidget *box_info; GtkWidget *box_datetime; @@ -96,7 +94,7 @@ typedef struct { GtkRevealer *rev_call_notifications; GtkRevealer *rev_media_player; GtkRevealer *rev_notifications; - GSettings *notification_settings; + GSettings *settings; guint reveals; /* unlock page */ @@ -111,7 +109,7 @@ typedef struct { guint idle_timer; gint64 last_input; PhoshAuth *auth; - GSettings *lockscreen_settings; + GSettings *keypad_settings; /* widget box */ GtkWidget *widget_box; @@ -750,7 +748,7 @@ on_notification_items_changed (PhoshLockscreen *self, g_return_if_fail (PHOSH_IS_LOCKSCREEN (self)); priv = phosh_lockscreen_get_instance_private (self); - show_in_lockscreen = g_settings_get_boolean (priv->notification_settings, "show-in-lock-screen"); + show_in_lockscreen = g_settings_get_boolean (priv->settings, "show-in-lock-screen"); is_empty = !g_list_model_get_n_items (list); reveal = show_in_lockscreen && !is_empty; @@ -759,65 +757,6 @@ on_notification_items_changed (PhoshLockscreen *self, } -static void -clear_css_provider (PhoshLockscreen *self) -{ - PhoshLockscreenPrivate *priv = phosh_lockscreen_get_instance_private (self); - - if (priv->provider == NULL) - return; - - gtk_style_context_remove_provider_for_screen (gdk_screen_get_default (), - GTK_STYLE_PROVIDER (priv->provider)); - g_clear_object (&priv->provider); -} - - -static void -load_background (PhoshLockscreen *self) -{ - PhoshLockscreenPrivate *priv = phosh_lockscreen_get_instance_private (self); - g_autoptr (GSettings) settings = g_settings_new ("org.gnome.desktop.screensaver"); - g_autofree char *uri = NULL; - g_autofree char *css = NULL; - g_autoptr (GError) err = NULL; - - g_return_if_fail (priv->provider == NULL); - - uri = g_settings_get_string (settings, "picture-uri"); - if (STR_IS_NULL_OR_EMPTY (uri)) { - clear_css_provider (self); - return; - } - - if (g_str_has_suffix (uri, ".xml")) { - g_warning ("Ignoring XML background '%s'", uri); - return; - } - - priv->provider = gtk_css_provider_new (); - css = g_strdup_printf ("phosh-lockscreen {\n" - " background-image: url(\"%s\");\n" - " background-size: cover;\n" - " background-position: center;\n" - "}\n" - "" - "phosh-top-panel {\n" - " background: none;\n" - "}\n", uri); - if (gtk_css_provider_load_from_data (GTK_CSS_PROVIDER (priv->provider), css, -1, &err)) { - g_debug ("Using lockscreen image '%s'", uri); - } else { - g_warning ("Failed to load lockscreen image '%s': %s", uri, err->message); - return; - } - - gtk_style_context_add_provider_for_screen (gdk_screen_get_default (), - GTK_STYLE_PROVIDER (priv->provider), - GTK_STYLE_PROVIDER_PRIORITY_APPLICATION + 1); -} - - static void phosh_lockscreen_constructed (GObject *object) { @@ -878,7 +817,7 @@ phosh_lockscreen_constructed (GObject *object) update_active_call (self, active); manager = phosh_notify_manager_get_default (); - priv->notification_settings = g_settings_new (NOTIFICATIONS_SCHEMA_ID); + priv->settings = g_settings_new(NOTIFICATIONS_SCHEMA_ID); gtk_list_box_bind_model (GTK_LIST_BOX (priv->list_notifications), G_LIST_MODEL (phosh_notify_manager_get_list (manager)), create_notification_row, @@ -904,19 +843,17 @@ phosh_lockscreen_constructed (GObject *object) priv->btn_keyboard, "sensitive", G_BINDING_SYNC_CREATE); - priv->lockscreen_settings = g_settings_new ("sm.puri.phosh.lockscreen"); - g_settings_bind (priv->lockscreen_settings, "shuffle-keypad", + priv->keypad_settings = g_settings_new("sm.puri.phosh.lockscreen"); + g_settings_bind (priv->keypad_settings, "shuffle-keypad", priv->keypad, "shuffle", G_SETTINGS_BIND_GET); plugin_settings = g_settings_new ("sm.puri.phosh.plugins"); plugins = g_settings_get_strv (plugin_settings, "lock-screen"); + if (plugins) phosh_widget_box_set_plugins (PHOSH_WIDGET_BOX (priv->widget_box), plugins); - if (!phosh_is_high_contrast (GTK_WIDGET (self))) - load_background (self); - on_deck_visible_child_changed (self, NULL, priv->deck); } @@ -946,13 +883,12 @@ phosh_lockscreen_dispose (GObject *object) PhoshLockscreen *self = PHOSH_LOCKSCREEN (object); PhoshLockscreenPrivate *priv = phosh_lockscreen_get_instance_private (self); - g_clear_object (&priv->notification_settings); + g_clear_object (&priv->settings); g_clear_object (&priv->wall_clock); g_clear_handle_id (&priv->idle_timer, g_source_remove); g_clear_object (&priv->calls_manager); g_clear_pointer (&priv->active, g_free); - g_clear_object (&priv->lockscreen_settings); - clear_css_provider (self); + g_clear_object (&priv->keypad_settings); G_OBJECT_CLASS (phosh_lockscreen_parent_class)->dispose (object); } @@ -1146,4 +1082,4 @@ phosh_lockscreen_set_page (PhoshLockscreen *self, PhoshLockscreenPage page) scroll_to = (page == PHOSH_LOCKSCREEN_PAGE_UNLOCK) ? priv->box_unlock : priv->box_info; hdy_carousel_scroll_to (HDY_CAROUSEL (priv->carousel), scroll_to); -} +} \ No newline at end of file From 964fd3937e209d266657c2dbd8df07aed42a5590 Mon Sep 17 00:00:00 2001 From: Bardia Moshiri Date: Thu, 14 Dec 2023 15:03:40 -0500 Subject: [PATCH 10/14] stylesheet: Use adwaita for powerbar background Signed-off-by: Bardia Moshiri --- src/stylesheet/common.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/stylesheet/common.css b/src/stylesheet/common.css index 087dbaf7f..91892789a 100644 --- a/src/stylesheet/common.css +++ b/src/stylesheet/common.css @@ -187,7 +187,7 @@ phosh-audio-device-row image { /* phosh-home */ .opaque { - background-color: @phosh_bg_color; + background-color: @window_bg_color; } #powerbar { From 6114a36124fa00eff734507d144d420844c9e45c Mon Sep 17 00:00:00 2001 From: Bardia Moshiri Date: Thu, 14 Dec 2023 15:14:16 -0500 Subject: [PATCH 11/14] home: Hide osk when unfolded and disable swipes when unfolding Signed-off-by: Bardia Moshiri --- src/home.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/home.c b/src/home.c index c74a7072d..e3c1eb733 100644 --- a/src/home.c +++ b/src/home.c @@ -160,8 +160,13 @@ update_drag_handle (PhoshHome *self, gboolean commit) PhoshDragSurfaceDragMode drag_mode = PHOSH_DRAG_SURFACE_DRAG_MODE_HANDLE; PhoshDragSurfaceState drag_state = phosh_drag_surface_get_drag_state (PHOSH_DRAG_SURFACE (self)); - /* reset osk_toggle_long_press to prevent OSK from unfolding accidently */ + /* hide osk only when unfolded */ + if (self->state == PHOSH_HOME_STATE_FOLDED && drag_state == PHOSH_DRAG_SURFACE_STATE_DRAGGED) + phosh_osk_manager_set_visible (self->osk, FALSE); + + /* reset powerbar gestures when unfolding */ gtk_event_controller_reset (GTK_EVENT_CONTROLLER (self->osk_toggle_long_press)); + gtk_event_controller_reset(GTK_EVENT_CONTROLLER(self->swipe_gesture)); /* Update the handle's arrow and dragability */ if (phosh_overview_has_running_activities (PHOSH_OVERVIEW (self->overview)) == FALSE && From 410a3eae9b252f803858e47a5ce827c91dd6808f Mon Sep 17 00:00:00 2001 From: Bardia Moshiri Date: Fri, 15 Dec 2023 19:45:37 -0500 Subject: [PATCH 12/14] ui-home: Bind end signal of swipe gesture to powerbar_longpress_end Signed-off-by: Bardia Moshiri --- src/ui/home.ui | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ui/home.ui b/src/ui/home.ui index 00efbb4a6..51ad67236 100644 --- a/src/ui/home.ui +++ b/src/ui/home.ui @@ -102,6 +102,6 @@ powerbar - + From 8b2c891cadd7df225ecc259f634686c2b02e1e95 Mon Sep 17 00:00:00 2001 From: Bardia Moshiri Date: Sun, 7 Jan 2024 14:36:58 -0500 Subject: [PATCH 13/14] packaging: Add libgirepository1.0-dev as a build dependency Signed-off-by: Bardia Moshiri Part-of: --- debian/control | 1 + 1 file changed, 1 insertion(+) diff --git a/debian/control b/debian/control index 049cbb46f..60ff41a76 100644 --- a/debian/control +++ b/debian/control @@ -8,6 +8,7 @@ Build-Depends: libadwaita-1-dev, libcallaudio-dev, libevince-dev, + libgirepository1.0-dev, libjson-glib-dev, libsecret-1-dev, libsystemd-dev, From b8f1c09571d65859eda424cfd4a01e7dd51c0553 Mon Sep 17 00:00:00 2001 From: mathew-dennis <78794223+mathew-dennis@users.noreply.github.com> Date: Mon, 15 Jan 2024 20:55:43 +0530 Subject: [PATCH 14/14] home: Allow to tweak long-press unfold delay from : https://gitlab.gnome.org/World/Phosh/phosh/-/merge_requests/1346 --- data/sm.puri.phosh.gschema.xml | 13 ++++++++++++- src/home.c | 25 +++++++++++++++++-------- src/ui/home.ui | 2 +- 3 files changed, 30 insertions(+), 10 deletions(-) diff --git a/data/sm.puri.phosh.gschema.xml b/data/sm.puri.phosh.gschema.xml index 848ed5fe5..2947c0f40 100644 --- a/data/sm.puri.phosh.gschema.xml +++ b/data/sm.puri.phosh.gschema.xml @@ -77,6 +77,17 @@ UI elements in order to not overlap with notches and cutouts. + + + 1.0 + OSK unfold long press delay factor + + Delay factor for long press on the home bar to unfold the keyboard. + Valid values are [0.5,2.0]. Values less than 1.0 make the unfold trigger + sooner, greater than 1.0 make the unfold trigger later. + + + Whether to scramble the keypad Setting this to true shuffle the digits on the PIN keypad to - make eaveysdropping harder. + make eavesdropping harder. diff --git a/src/home.c b/src/home.c index e3c1eb733..2c7e58851 100644 --- a/src/home.c +++ b/src/home.c @@ -24,6 +24,8 @@ #define KEYBINDING_KEY_TOGGLE_OVERVIEW "toggle-overview" #define KEYBINDING_KEY_TOGGLE_APPLICATION_VIEW "toggle-application-view" +#define PHOSH_SETTINGS "sm.puri.phosh" + #define PHOSH_HOME_DRAG_THRESHOLD 0.3 #define POWERBAR_ACTIVE_CLASS "p-active" @@ -81,6 +83,7 @@ struct _PhoshHome GtkGesture *click_gesture; /* needed so that the gesture isn't destroyed immediately */ GtkGesture *osk_toggle_long_press; /* to toggle osk from the home bar itself */ + GSettings *phosh_settings; }; G_DEFINE_TYPE(PhoshHome, phosh_home, PHOSH_TYPE_DRAG_SURFACE); @@ -264,16 +267,16 @@ on_powerbar_action_failed (PhoshHome *self) static void -on_powerbar_pressed (PhoshHome *self, PhoshOskManager *osk, PhoshShell *shell) +on_powerbar_pressed (PhoshHome *self) { + PhoshOskManager *osk; gboolean osk_is_available, osk_current_state, osk_new_state; g_return_if_fail (PHOSH_IS_HOME (self)); - shell = phosh_shell_get_default (); - self->osk = phosh_shell_get_osk_manager (shell); + osk = phosh_shell_get_osk_manager (phosh_shell_get_default ()); - osk_is_available = phosh_osk_manager_get_available (self->osk); - osk_current_state = phosh_osk_manager_get_visible (self->osk); + osk_is_available = phosh_osk_manager_get_available (osk); + osk_current_state = phosh_osk_manager_get_visible (osk); osk_new_state = osk_current_state; gtk_gesture_set_state ((self->click_gesture), GTK_EVENT_SEQUENCE_DENIED); @@ -290,7 +293,7 @@ on_powerbar_pressed (PhoshHome *self, PhoshOskManager *osk, PhoshShell *shell) g_signal_emit (self, signals[OSK_ACTIVATED], 0); g_debug ("OSK toggled with pressed signal"); - phosh_osk_manager_set_visible (self->osk, osk_new_state); + phosh_osk_manager_set_visible (osk, osk_new_state); phosh_trigger_feedback ("button-pressed"); } @@ -676,15 +679,21 @@ phosh_home_class_init (PhoshHomeClass *klass) static void phosh_home_init (PhoshHome *self) { - self->state = PHOSH_HOME_STATE_FOLDED; - self->settings = g_settings_new (KEYBINDINGS_SCHEMA_ID); + g_autoptr (GSettings) settings = NULL; gtk_widget_init_template (GTK_WIDGET (self)); + self->state = PHOSH_HOME_STATE_FOLDED; + self->settings = g_settings_new (KEYBINDINGS_SCHEMA_ID); phosh_home_update_home_bar (self); /* Adjust margins and folded state on size changes */ g_signal_connect (self, "configure-event", G_CALLBACK (on_configure_event), NULL); + + settings = g_settings_new (PHOSH_SETTINGS); + g_settings_bind (settings, "osk-unfold-delay", + self->osk_toggle_long_press, "delay-factor", + G_SETTINGS_BIND_GET); } diff --git a/src/ui/home.ui b/src/ui/home.ui index 51ad67236..5c9482aed 100644 --- a/src/ui/home.ui +++ b/src/ui/home.ui @@ -89,7 +89,7 @@ evbox_home - + powerbar