diff --git a/src/lockscreen.c b/src/lockscreen.c index 79836853185891f3d24422789ba8c22874756c15..2c7a84026a89600cc19797c29321983ebfb82b60 100644 --- a/src/lockscreen.c +++ b/src/lockscreen.c @@ -52,8 +52,9 @@ typedef struct { /* unlock page */ GtkWidget *grid_unlock; - GtkWidget *dialer_keypad; - GtkWidget *lbl_keypad; + GtkWidget *keypad; + GtkWidget *entry_pin; + GtkGesture *long_press_del_gesture; GtkWidget *lbl_unlock_status; GtkWidget *wwaninfo; GtkWidget *batteryinfo; @@ -68,22 +69,15 @@ G_DEFINE_TYPE_WITH_PRIVATE (PhoshLockscreen, phosh_lockscreen, PHOSH_TYPE_LAYER_ static void -keypad_update_labels (PhoshLockscreen *self) -{ +clear_input (PhoshLockscreen *self, gboolean clear_all) { PhoshLockscreenPrivate *priv = phosh_lockscreen_get_instance_private (self); - gint len; - gchar *pos; - const gchar *number; - g_autofree gchar *dots = NULL; - - number = hdy_dialer_get_number (HDY_DIALER (priv->dialer_keypad)); - len = strlen (number); - dots = pos = g_malloc0 (len * 3 + 1); - g_return_if_fail (dots); - for (int i = 0; i < len; i++) - pos = g_stpcpy (pos, "●"); - gtk_label_set_text (GTK_LABEL (priv->lbl_keypad), dots); - gtk_label_set_label (GTK_LABEL (priv->lbl_unlock_status), _("Enter Passcode")); + + if (clear_all) { + gtk_label_set_label (GTK_LABEL (priv->lbl_unlock_status), _("Enter Passcode")); + gtk_editable_delete_text (GTK_EDITABLE (priv->entry_pin), 0, -1); + } else { + g_signal_emit_by_name (priv->entry_pin, "backspace", NULL); + } } @@ -91,6 +85,8 @@ static void show_info_page (PhoshLockscreen *self) { PhoshLockscreenPrivate *priv = phosh_lockscreen_get_instance_private (self); + if (hdy_paginator_get_position (HDY_PAGINATOR (priv->paginator)) <= 0) + return; hdy_paginator_scroll_to (HDY_PAGINATOR (priv->paginator), priv->grid_info); } @@ -116,6 +112,8 @@ static void show_unlock_page (PhoshLockscreen *self) { PhoshLockscreenPrivate *priv = phosh_lockscreen_get_instance_private (self); + if (hdy_paginator_get_position (HDY_PAGINATOR (priv->paginator)) > 0) + return; hdy_paginator_scroll_to (HDY_PAGINATOR (priv->paginator), priv->grid_unlock); @@ -127,10 +125,8 @@ show_unlock_page (PhoshLockscreen *self) static gboolean finish_shake_label (PhoshLockscreen *self) { - PhoshLockscreenPrivate *priv = phosh_lockscreen_get_instance_private (self); - hdy_dialer_clear_number (HDY_DIALER (priv->dialer_keypad)); - gtk_widget_set_sensitive (priv->dialer_keypad, TRUE); - gtk_widget_grab_focus (GTK_WIDGET (priv->dialer_keypad)); + clear_input (self, TRUE); + gtk_widget_set_sensitive (GTK_WIDGET (self), TRUE); return FALSE; } @@ -150,14 +146,14 @@ shake_label (GtkWidget *widget, if (now > end_time) { /* Stop the animation only when we would step over the idle position (0.5) */ - if ((gtk_label_get_xalign (GTK_LABEL (priv->lbl_keypad)) > 0.5 && pos < 0.5) || pos > 0.5) { - gtk_label_set_xalign (GTK_LABEL (priv->lbl_keypad), 0.5); + if ((gtk_entry_get_alignment (GTK_ENTRY (priv->entry_pin)) > 0.5 && pos < 0.5) || pos > 0.5) { + gtk_entry_set_alignment (GTK_ENTRY (priv->entry_pin), 0.5); g_timeout_add (400, (GSourceFunc) finish_shake_label, self); return FALSE; } } - gtk_label_set_xalign (GTK_LABEL (priv->lbl_keypad), pos); + gtk_entry_set_alignment (GTK_ENTRY (priv->entry_pin), pos); return TRUE; } @@ -185,7 +181,7 @@ auth_async_cb (PhoshAuth *auth, GAsyncResult *result, PhoshLockscreen *self) GdkFrameClock *clock; gint64 now; /* give visual feedback on error */ - clock = gtk_widget_get_frame_clock (priv->lbl_keypad); + clock = gtk_widget_get_frame_clock (priv->entry_pin); now = gdk_frame_clock_get_frame_time (clock); gtk_widget_add_tick_callback (GTK_WIDGET (self), shake_label, @@ -201,25 +197,46 @@ auth_async_cb (PhoshAuth *auth, GAsyncResult *result, PhoshLockscreen *self) static void -keypad_number_notified_cb (PhoshLockscreen *self) +delete_button_clicked_cb (PhoshLockscreen *self, + GtkWidget *widget) +{ + g_return_if_fail (PHOSH_IS_LOCKSCREEN (self)); + + clear_input (self, FALSE); +} + + +static void +long_press_del_cb (PhoshLockscreen *self, + gdouble x, + gdouble y, + GtkGesture *gesture) +{ + g_return_if_fail (PHOSH_IS_LOCKSCREEN (self)); + g_debug ("Long press on delete button"); + clear_input (self, TRUE); +} + + +static void +input_changed_cb (PhoshLockscreen *self) { PhoshLockscreenPrivate *priv; - const gchar *number; + const gchar *input; g_assert (PHOSH_IS_LOCKSCREEN (self)); priv = phosh_lockscreen_get_instance_private (self); - number = hdy_dialer_get_number (HDY_DIALER (priv->dialer_keypad)); priv->last_input = g_get_monotonic_time (); + input = gtk_entry_get_text (GTK_ENTRY (priv->entry_pin)); - keypad_update_labels (self); - if (strlen (number) == phosh_auth_get_pin_length()) { + if (strlen (input) == phosh_auth_get_pin_length()) { gtk_label_set_label (GTK_LABEL (priv->lbl_unlock_status), _("Checking…")); - gtk_widget_set_sensitive (priv->dialer_keypad, FALSE); + gtk_widget_set_sensitive (GTK_WIDGET (self), FALSE); if (priv->auth == NULL) priv->auth = PHOSH_AUTH (phosh_auth_new ()); phosh_auth_authenticate_async_start (priv->auth, - number, + input, NULL, (GAsyncReadyCallback)auth_async_cb, self); @@ -227,41 +244,41 @@ keypad_number_notified_cb (PhoshLockscreen *self) } - static gboolean key_press_event_cb (PhoshLockscreen *self, GdkEventKey *event, gpointer data) { - PhoshLockscreenPrivate *priv = phosh_lockscreen_get_instance_private (self); + PhoshLockscreenPrivate *priv; gboolean handled = FALSE; - g_autofree gchar *number = NULL; - if (hdy_paginator_get_position (HDY_PAGINATOR (priv->paginator)) <= 0) { + g_assert (PHOSH_IS_LOCKSCREEN (self)); + priv = phosh_lockscreen_get_instance_private (self); + + if (gtk_entry_im_context_filter_keypress (GTK_ENTRY (priv->entry_pin), event)) { + show_unlock_page (self); + handled = TRUE; + } else { switch (event->keyval) { case GDK_KEY_space: show_unlock_page (self); handled = TRUE; break; - case GDK_KEY_1...GDK_KEY_9: - number = g_strdup_printf ("%d", event->keyval - GDK_KEY_1 + 1); - hdy_dialer_set_number (HDY_DIALER (priv->dialer_keypad), number); - show_unlock_page (self); - handled = TRUE; - break; - default: - /* nothing to do */ - break; - } - } else { - switch (event->keyval) { case GDK_KEY_Escape: show_info_page (self); handled = TRUE; break; + case GDK_KEY_Delete: + case GDK_KEY_KP_Delete: + case GDK_KEY_BackSpace: + clear_input (self, FALSE); + handled = TRUE; + break; default: /* nothing to do */ break; } } + + priv->last_input = g_get_monotonic_time (); return handled; } @@ -352,14 +369,11 @@ paginator_position_notified_cb (PhoshLockscreen *self, position = hdy_paginator_get_position (HDY_PAGINATOR (priv->paginator)); if (position <= 0) { - hdy_dialer_clear_number (HDY_DIALER (priv->dialer_keypad)); - keypad_update_labels (self); + clear_input (self, TRUE); return; } if (position >= 1) { - gtk_widget_grab_focus (GTK_WIDGET (priv->dialer_keypad)); - if (!priv->idle_timer) { priv->last_input = g_get_monotonic_time (); priv->idle_timer = g_timeout_add_seconds (LOCKSCREEN_IDLE_SECONDS, @@ -457,12 +471,13 @@ phosh_lockscreen_class_init (PhoshLockscreenClass *klass) /* unlock page */ gtk_widget_class_bind_template_child_private (widget_class, PhoshLockscreen, grid_unlock); - gtk_widget_class_bind_template_child_private (widget_class, PhoshLockscreen, dialer_keypad); - gtk_widget_class_bind_template_child_private (widget_class, PhoshLockscreen, lbl_keypad); + gtk_widget_class_bind_template_child_private (widget_class, PhoshLockscreen, keypad); + gtk_widget_class_bind_template_child_private (widget_class, PhoshLockscreen, entry_pin); gtk_widget_class_bind_template_child_private (widget_class, PhoshLockscreen, lbl_unlock_status); - gtk_widget_class_bind_template_callback_full (widget_class, - "keypad_number_notified_cb", - G_CALLBACK(keypad_number_notified_cb)); + gtk_widget_class_bind_template_child_private (widget_class, PhoshLockscreen, long_press_del_gesture); + gtk_widget_class_bind_template_callback (widget_class, long_press_del_cb); + gtk_widget_class_bind_template_callback (widget_class, delete_button_clicked_cb); + /* info page */ gtk_widget_class_bind_template_child_private (widget_class, PhoshLockscreen, grid_info); gtk_widget_class_bind_template_child_private (widget_class, PhoshLockscreen, lbl_clock); @@ -476,20 +491,13 @@ static void phosh_lockscreen_init (PhoshLockscreen *self) { PhoshLockscreenPrivate *priv = phosh_lockscreen_get_instance_private (self); - GtkWidget *grid, *old_widget; gtk_widget_init_template (GTK_WIDGET (self)); - /* HACK: remove # and * buttons from the hdydialer */ - grid = gtk_bin_get_child (GTK_BIN (priv->dialer_keypad)); - - old_widget = gtk_grid_get_child_at (GTK_GRID (grid), 2, 3); - if (old_widget != NULL) - gtk_container_remove (GTK_CONTAINER (grid), old_widget); - - old_widget = gtk_grid_get_child_at (GTK_GRID (grid), 0, 3); - if (old_widget != NULL) - gtk_container_remove (GTK_CONTAINER (grid), old_widget); + g_signal_connect_swapped (G_OBJECT (priv->entry_pin), + "changed", + G_CALLBACK (input_changed_cb), + self); } diff --git a/src/style.css b/src/style.css index e3987dc82c1f25309eb72e7700191591b7b547ea..549c2d3d0a2c68809dbb8f24fcb822d218cab198 100644 --- a/src/style.css +++ b/src/style.css @@ -118,26 +118,8 @@ phosh-home, .phosh-panel { animation-iteration-count: 15; } -/* Lockscreen Keypad */ -hdydialer button { - border-radius: 9999px; - -gtk-outline-radius: 9999px; - background-origin: padding-box, border-box; - background-clip: padding-box, border-box; - font-size: 16px; - font-weight: bold; - padding: 16px; - border: 0; - box-shadow: none; - background: 0; -} - -hdydialer button:active { - background: rgba(255, 255, 255, 0.3); -} - -hdydialer button:focus { - outline-style: none; +.phosh-lockscreen-pin { + font-size: 20px; } @keyframes pulsate { @@ -245,3 +227,26 @@ phosh-notification .notification-image { animation-iteration-count: 1; animation-fill-mode: forwards; } + +/* Style for the keypad */ +hdykeypad > button { + border-radius: 9999px; + -gtk-outline-radius: 9999px; + background-origin: padding-box, border-box; + background-clip: padding-box, border-box; + font-size: 16px; + font-weight: bold; + padding: 16px; + border: 0; + box-shadow: none; + background: 0; + border: 0; +} + +hdykeypad > button:active { + background: rgba(255, 255, 255, 0.3); +} + +hdykeypad > button:focus { + outline-style: none; +} diff --git a/src/ui/lockscreen.ui b/src/ui/lockscreen.ui index ceed291ab6243b1d19e88eaf16b3f800d6d36c0e..c11942f9379537810fc1802ec01e28fb7629ec0e 100644 --- a/src/ui/lockscreen.ui +++ b/src/ui/lockscreen.ui @@ -200,14 +200,19 @@ False False - + True False + False 12 12 - - - + False + 0.5 + GTK_INPUT_PURPOSE_PIN + pin_buffer + 0 @@ -215,16 +220,17 @@ - + True False center center 12 12 - none - False - + True + True + entry_pin + delete_btn 0 @@ -255,4 +261,22 @@ + + True + True + False + + + + True + edit-clear-symbolic + + + + + delete_btn + + + +