diff --git a/src/brightness-manager.c b/src/brightness-manager.c index 6f20d8f76a4fe0df0d85eaa5c1165bf35f562ecd..735fca539c6cf50d4de9cf44cf2dcbffb3e08e5d 100644 --- a/src/brightness-manager.c +++ b/src/brightness-manager.c @@ -461,9 +461,25 @@ on_primary_monitor_changed (PhoshBrightnessManager *self, GParamSpec *psepc, Pho static void -adjust_brightness (PhoshBrightnessManager *self, gboolean up) +show_osd (PhoshBrightnessManager *self, double brightness) { PhoshShell *shell = phosh_shell_get_default (); + + if (phosh_shell_get_state (shell) & PHOSH_STATE_SETTINGS) + return; + + phosh_shell_show_osd (shell, + NULL, + self->icon_name, + NULL, + 100.0 * brightness, + 100.0); +} + + +static void +adjust_brightness (PhoshBrightnessManager *self, gboolean up) +{ int levels; double brightness, step; @@ -483,15 +499,7 @@ adjust_brightness (PhoshBrightnessManager *self, gboolean up) brightness = CLAMP (brightness, 0.0, 1.0); phosh_backlight_set_relative (self->backlight, brightness); - if (phosh_shell_get_state (shell) & PHOSH_STATE_SETTINGS) - return; - - phosh_shell_show_osd (phosh_shell_get_default (), - NULL, - self->icon_name, - NULL, - 100.0 * brightness, - 100.0); + show_osd (self, brightness); } @@ -725,3 +733,42 @@ phosh_brightness_manager_get_auto_brightness_enabled (PhoshBrightnessManager *se return self->auto_brightness.enabled; } + +/** + * phosh_brightness_manager_get_value: + * @PhoshBrightnessManager: The brightness manager + * + * Get the value of the brightness adjustment. The interpretation of the value depends + * on whether auto brightness is enabled or not. + * + * Returns: The current value of the adjustment [0.0, 1.0] + */ +double +phosh_brightness_manager_get_value (PhoshBrightnessManager *self) +{ + g_return_val_if_fail (PHOSH_IS_BRIGHTNESS_MANAGER (self), 0.5); + + return gtk_adjustment_get_value (self->adjustment); +} + +/** + * phosh_brightness_manager_set_value: + * @PhoshBrightnessManager: The brightness manager + * @value: The brightness adjustment value [0.0, 1.0]. + * @osd: Whether to show the osd when setting the value + * + * Set the value of the brightness adjustment. The interpretation of the value depends + * on whether auto brightness is enabled or not. + */ +void +phosh_brightness_manager_set_value (PhoshBrightnessManager *self, + double value, + gboolean osd) +{ + g_return_if_fail (PHOSH_IS_BRIGHTNESS_MANAGER (self)); + g_return_if_fail (0.0 <= value && value <= 1.0); + + gtk_adjustment_set_value (self->adjustment, value); + if (osd) + show_osd (self, value); +} diff --git a/src/brightness-manager.h b/src/brightness-manager.h index 08349dc161e3171b9f84424164fc16ee6aa0e08a..25a7010ff68713f4bb612a5d94df7159fe2ebd5d 100644 --- a/src/brightness-manager.h +++ b/src/brightness-manager.h @@ -20,5 +20,10 @@ G_DECLARE_FINAL_TYPE (PhoshBrightnessManager, phosh_brightness_manager, PHOSH, B PhoshBrightnessManager *phosh_brightness_manager_new (void); GtkAdjustment * phosh_brightness_manager_get_adjustment (PhoshBrightnessManager *self); gboolean phosh_brightness_manager_get_auto_brightness_enabled (PhoshBrightnessManager *self); +double phosh_brightness_manager_get_value (PhoshBrightnessManager *self); +void phosh_brightness_manager_set_value (PhoshBrightnessManager *self, + double value, + gboolean osd); + G_END_DECLS diff --git a/src/lockscreen.c b/src/lockscreen.c index 7b32d939a537ec88193abcab523d90dfc9650879..acf751daf5faa4fd93b10bbc2bf909f8115054db 100644 --- a/src/lockscreen.c +++ b/src/lockscreen.c @@ -79,31 +79,38 @@ typedef struct { gboolean require_unlock; /* info page */ - GtkWidget *box_info; - GtkWidget *box_datetime; - GtkListBox *list_calls; - GtkWidget *lbl_clock; - GtkWidget *lbl_date; - GtkWidget *list_notifications; - GtkRevealer *rev_call_notifications; - GtkRevealer *rev_media_player; - GtkRevealer *rev_notifications; - GSettings *notification_settings; - guint reveals; + GtkWidget *box_info; + GtkWidget *box_datetime; + GtkListBox *list_calls; + GtkWidget *lbl_clock; + GtkWidget *lbl_date; + GtkWidget *list_notifications; + GtkRevealer *rev_call_notifications; + GtkRevealer *rev_media_player; + GtkRevealer *rev_notifications; + GSettings *notification_settings; + guint reveals; /* unlock page */ - GtkWidget *box_unlock; - GtkWidget *keypad_revealer; - GtkWidget *keypad; - GtkWidget *entry_pin; - GtkGesture *long_press_del_gesture; - GtkWidget *lbl_unlock_status; - GtkWidget *btn_submit; - GtkWidget *btn_keyboard; - guint idle_timer; - gint64 last_input; - PhoshAuth *auth; - GSettings *lockscreen_settings; + GtkWidget *box_unlock; + GtkWidget *keypad_revealer; + GtkWidget *keypad; + GtkWidget *entry_pin; + GtkGesture *long_press_del_gesture; + GtkWidget *lbl_unlock_status; + GtkWidget *btn_submit; + GtkWidget *btn_keyboard; + guint idle_timer; + gint64 last_input; + PhoshAuth *auth; + GSettings *lockscreen_settings; + + /* Volume Gesture */ + struct { + GtkGesture *gesture; + double x_start, y_start; + double base; + } brightness; /* extra page */ GtkWidget *extra_page; @@ -116,7 +123,7 @@ typedef struct { CuiCallDisplay *call_display; PhoshCallsManager *calls_manager; - char *active; /* opaque handle to the active call */ + char *active; /* opaque handle to the active call */ PhoshLockscreenBg *background; } PhoshLockscreenPrivate; @@ -124,6 +131,82 @@ typedef struct { G_DEFINE_TYPE_WITH_PRIVATE (PhoshLockscreen, phosh_lockscreen, PHOSH_TYPE_LAYER_SURFACE) +static void +on_zoom_gesture_end (PhoshLockscreen *self, + GdkEventSequence *sequence, + GtkGesture *gesture) +{ + gtk_gesture_set_state (gesture, GTK_EVENT_SEQUENCE_CLAIMED); +} + + +static void +on_zoom_gesture_update (PhoshLockscreen *self, + GdkEventSequence *sequence, + GtkGesture *gesture) +{ + PhoshLockscreenPrivate *priv = phosh_lockscreen_get_instance_private (self); + PhoshBrightnessManager *manager; + gboolean active; + double x_center, y_center, brightness; + uint width, height; + + g_return_if_fail (PHOSH_IS_LOCKSCREEN (self)); + + active = gtk_gesture_get_bounding_box_center (gesture, &x_center, &y_center); + if (!active) { + gtk_gesture_set_state (gesture, GTK_EVENT_SEQUENCE_DENIED); + return; + } + + width = gtk_widget_get_allocated_width (GTK_WIDGET (self)); + height = gtk_widget_get_allocated_height (GTK_WIDGET (self)); + + /* Swipe must happen in the upper screen half */ + if (y_center > 0.5 * height) { + gtk_gesture_set_state (gesture, GTK_EVENT_SEQUENCE_DENIED); + return; + } + + gtk_gesture_set_state (gesture, GTK_EVENT_SEQUENCE_CLAIMED); + manager = phosh_shell_get_brightness_manager (phosh_shell_get_default ()); + brightness = priv->brightness.base + (x_center - priv->brightness.x_start) / width; + + g_debug ("Brightness gesture updating: %f", brightness); + phosh_brightness_manager_set_value (manager, CLAMP (brightness, 0.0, 1.0), TRUE); +} + + +static void +on_zoom_gesture_begin (PhoshLockscreen *self, + GdkEventSequence *sequence, + GtkGesture *gesture) +{ + gboolean active; + gdouble x_center, y_center; + PhoshLockscreenPrivate *priv = phosh_lockscreen_get_instance_private (self); + PhoshBrightnessManager *manager; + + g_return_if_fail (PHOSH_IS_LOCKSCREEN (self)); + + active = gtk_gesture_get_bounding_box_center (gesture, &x_center, &y_center); + if (!active) { + gtk_gesture_set_state (gesture, GTK_EVENT_SEQUENCE_DENIED); + return; + } + + gtk_gesture_set_state (gesture, GTK_EVENT_SEQUENCE_CLAIMED); + manager = phosh_shell_get_brightness_manager (phosh_shell_get_default ()); + priv->brightness.x_start = x_center; + priv->brightness.y_start = y_center; + priv->brightness.base = phosh_brightness_manager_get_value (manager); + g_debug ("Brightness gesture start at: %f,%f (%f)", + priv->brightness.x_start, + priv->brightness.y_start, + priv->brightness.base); +} + + static void phosh_lockscreen_map (GtkWidget *widget) { @@ -901,6 +984,7 @@ phosh_lockscreen_dispose (GObject *object) PhoshLockscreen *self = PHOSH_LOCKSCREEN (object); PhoshLockscreenPrivate *priv = phosh_lockscreen_get_instance_private (self); + g_clear_object (&priv->brightness.gesture); g_clear_object (&priv->notification_settings); g_clear_handle_id (&priv->idle_timer, g_source_remove); g_clear_object (&priv->calls_manager); @@ -1108,6 +1192,15 @@ phosh_lockscreen_init (PhoshLockscreen *self) /* LTR doesn't work for the deck * https://gitlab.gnome.org/World/Phosh/phosh/-/issues/1132 */ gtk_widget_set_direction (GTK_WIDGET (priv->deck), GTK_TEXT_DIR_LTR); + + priv->brightness.gesture = gtk_gesture_zoom_new (GTK_WIDGET (self)); + g_object_connect (priv->brightness.gesture, + "swapped-object-signal::begin", on_zoom_gesture_begin, self, + "swapped-object-signal::update", on_zoom_gesture_update, self, + "swapped-object-signal::end", on_zoom_gesture_end, self, + NULL); + gtk_event_controller_set_propagation_phase (GTK_EVENT_CONTROLLER (priv->brightness.gesture), + GTK_PHASE_CAPTURE); }