From 2c721ac7c4106be396ccc890d4b100cd935ab31c Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Oct 30 2009 21:09:10 +0000 Subject: - Make the user list slide animation smoother --- diff --git a/gdm.spec b/gdm.spec index 8e066fe..c03b00f 100644 --- a/gdm.spec +++ b/gdm.spec @@ -16,7 +16,7 @@ Summary: The GNOME Display Manager Name: gdm Version: 2.28.1 -Release: 16%{?dist} +Release: 17%{?dist} Epoch: 1 License: GPLv2+ Group: User Interface/X @@ -106,6 +106,7 @@ Patch22: fix-timer.patch Patch23: fix-na-tray.patch Patch24: fix-computer-info.patch Patch25: fix-run-dir-permissions.patch +Patch26: make-user-list-animation-smoother.patch Patch97: gdm-multistack.patch # Fedora-specific @@ -157,6 +158,7 @@ The GDM fingerprint plugin provides functionality necessary to use a fingerprint %patch23 -p1 -b .fix-na-tray %patch24 -p1 -b .fix-computer-info %patch25 -p1 -b .fix-run-dir-permission +%patch26 -p1 -b .make-user-list-animation-smoother %patch97 -p1 -b .multistack %patch98 -p1 -b .bubble-location @@ -413,6 +415,9 @@ fi %{_libdir}/gdm/simple-greeter/plugins/fingerprint.so %changelog +* Fri Oct 30 2009 Ray Strode 2.28.1-17 +- Make the user list slide animation smoother + * Thu Oct 29 2009 Ray Strode 2.28.1-16 - Shrink autologin timer - Make language dialog not double spaced diff --git a/make-user-list-animation-smoother.patch b/make-user-list-animation-smoother.patch new file mode 100644 index 0000000..102286d --- /dev/null +++ b/make-user-list-animation-smoother.patch @@ -0,0 +1,408 @@ +From 7980049944d064e803522aca8241256a62e90925 Mon Sep 17 00:00:00 2001 +From: Ray Strode +Date: Fri, 30 Oct 2009 11:18:13 -0400 +Subject: [PATCH 1/6] Fix typo in chooser grow code + +--- + gui/simple-greeter/gdm-chooser-widget.c | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +diff --git a/gui/simple-greeter/gdm-chooser-widget.c b/gui/simple-greeter/gdm-chooser-widget.c +index cbd5072..9347eee 100644 +--- a/gui/simple-greeter/gdm-chooser-widget.c ++++ b/gui/simple-greeter/gdm-chooser-widget.c +@@ -894,7 +894,7 @@ start_grow_animation (GdmChooserWidget *widget) + height = get_height_of_screen (widget); + } + gdm_scrollable_widget_slide_to_height (GDM_SCROLLABLE_WIDGET (widget->priv->scrollable_widget), +- widget->priv->height_when_grown, ++ height, + (GdmScrollableWidgetSlideStepFunc) + on_grow_animation_step, widget, + (GdmScrollableWidgetSlideDoneFunc) +-- +1.6.5.1 + + +From e2cde131a24e2933588bed8c741ca14bb007c6eb Mon Sep 17 00:00:00 2001 +From: Ray Strode +Date: Fri, 30 Oct 2009 12:13:32 -0400 +Subject: [PATCH 2/6] Don't start grow animation until chooser is loaded + +This makes it smoother when first starting up +--- + gui/simple-greeter/gdm-chooser-widget.c | 37 ++---------------------------- + 1 files changed, 3 insertions(+), 34 deletions(-) + +diff --git a/gui/simple-greeter/gdm-chooser-widget.c b/gui/simple-greeter/gdm-chooser-widget.c +index 9347eee..1147104 100644 +--- a/gui/simple-greeter/gdm-chooser-widget.c ++++ b/gui/simple-greeter/gdm-chooser-widget.c +@@ -92,7 +92,6 @@ struct GdmChooserWidgetPrivate + + guint32 should_hide_inactive_items : 1; + guint32 emit_activated_after_resize_animation : 1; +- guint32 was_fully_grown : 1; + + GdmChooserWidgetPosition separator_position; + GdmChooserWidgetState state; +@@ -807,29 +806,12 @@ on_grow_animation_complete (GdmScrollableWidget *scrollable_widget, + { + g_assert (widget->priv->state == GDM_CHOOSER_WIDGET_STATE_GROWING); + widget->priv->state = GDM_CHOOSER_WIDGET_STATE_GROWN; +- widget->priv->was_fully_grown = TRUE; + gtk_tree_view_set_enable_search (GTK_TREE_VIEW (widget->priv->items_view), TRUE); + + _grab_focus (GTK_WIDGET (widget)); + } + + static int +-get_height_of_screen (GdmChooserWidget *widget) +-{ +- GdkScreen *screen; +- GdkRectangle area; +- int monitor; +- +- screen = gtk_widget_get_screen (GTK_WIDGET (widget)); +- +- monitor = gdk_screen_get_monitor_at_window (screen, +- gdk_screen_get_root_window (screen)); +- gdk_screen_get_monitor_geometry (screen, monitor, &area); +- +- return area.height; +-} +- +-static int + get_number_of_on_screen_rows (GdmChooserWidget *widget) + { + GtkTreePath *start_path; +@@ -876,7 +858,6 @@ start_grow_animation (GdmChooserWidget *widget) + { + int number_of_visible_rows; + int number_of_rows; +- int height; + + number_of_visible_rows = gtk_tree_model_iter_n_children (GTK_TREE_MODEL (widget->priv->model_sorter), NULL); + number_of_rows = gtk_tree_model_iter_n_children (GTK_TREE_MODEL (widget->priv->list_store), NULL); +@@ -888,13 +869,8 @@ start_grow_animation (GdmChooserWidget *widget) + + set_inactive_items_visible (widget, TRUE); + +- if (widget->priv->was_fully_grown) { +- height = widget->priv->height_when_grown; +- } else { +- height = get_height_of_screen (widget); +- } + gdm_scrollable_widget_slide_to_height (GDM_SCROLLABLE_WIDGET (widget->priv->scrollable_widget), +- height, ++ widget->priv->height_when_grown, + (GdmScrollableWidgetSlideStepFunc) + on_grow_animation_step, widget, + (GdmScrollableWidgetSlideDoneFunc) +@@ -912,7 +888,6 @@ skip_resize_animation (GdmChooserWidget *widget) + set_inactive_items_visible (GDM_CHOOSER_WIDGET (widget), TRUE); + gtk_tree_view_set_enable_search (GTK_TREE_VIEW (widget->priv->items_view), TRUE); + widget->priv->state = GDM_CHOOSER_WIDGET_STATE_GROWN; +- widget->priv->was_fully_grown = FALSE; + _grab_focus (GTK_WIDGET (widget)); + } + } +@@ -922,7 +897,6 @@ gdm_chooser_widget_grow (GdmChooserWidget *widget) + { + if (widget->priv->state == GDM_CHOOSER_WIDGET_STATE_SHRINKING) { + gdm_scrollable_widget_stop_sliding (GDM_SCROLLABLE_WIDGET (widget->priv->scrollable_widget)); +- widget->priv->was_fully_grown = FALSE; + } + + gtk_alignment_set (GTK_ALIGNMENT (widget->priv->frame_alignment), +@@ -1233,9 +1207,7 @@ gdm_chooser_widget_size_allocate (GtkWidget *widget, + chooser_widget = GDM_CHOOSER_WIDGET (widget); + + if (chooser_widget->priv->state == GDM_CHOOSER_WIDGET_STATE_GROWN) { +- if (chooser_widget->priv->was_fully_grown) { +- chooser_widget->priv->height_when_grown = allocation->height; +- } ++ chooser_widget->priv->height_when_grown = allocation->height; + } + } + +@@ -1801,8 +1773,6 @@ gdm_chooser_widget_init (GdmChooserWidget *widget) + */ + GTK_WIDGET_SET_FLAGS (widget, GTK_CAN_FOCUS); + +- widget->priv->height_when_grown = get_height_of_screen (widget); +- + gtk_alignment_set_padding (GTK_ALIGNMENT (widget), 0, 0, 0, 0); + + add_frame (widget); +@@ -1935,9 +1905,7 @@ gdm_chooser_widget_init (GdmChooserWidget *widget) + gtk_tree_row_reference_free); + + add_separator (widget); +- + queue_column_visibility_update (widget); +- gdm_chooser_widget_grow (widget); + } + + static void +@@ -2544,5 +2512,6 @@ gdm_chooser_widget_propagate_pending_key_events (GdmChooserWidget *widget) + void + gdm_chooser_widget_loaded (GdmChooserWidget *widget) + { ++ gdm_chooser_widget_grow (widget); + g_signal_emit (widget, signals[LOADED], 0); + } +-- +1.6.5.1 + + +From 3f707bba808b3484be7380a11aebfadb2bc98ab6 Mon Sep 17 00:00:00 2001 +From: Ray Strode +Date: Fri, 30 Oct 2009 14:41:54 -0400 +Subject: [PATCH 3/6] Hide user list frame when list is empty. + +--- + gui/simple-greeter/gdm-chooser-widget.c | 4 ++-- + 1 files changed, 2 insertions(+), 2 deletions(-) + +diff --git a/gui/simple-greeter/gdm-chooser-widget.c b/gui/simple-greeter/gdm-chooser-widget.c +index 1147104..4124195 100644 +--- a/gui/simple-greeter/gdm-chooser-widget.c ++++ b/gui/simple-greeter/gdm-chooser-widget.c +@@ -600,9 +600,9 @@ static void + update_chooser_visibility (GdmChooserWidget *widget) + { + if (gdm_chooser_widget_get_number_of_items (widget) > 0) { +- gtk_widget_show (widget->priv->scrollable_widget); ++ gtk_widget_show (widget->priv->frame); + } else { +- gtk_widget_hide (widget->priv->scrollable_widget); ++ gtk_widget_hide (widget->priv->frame); + } + g_object_notify (G_OBJECT (widget), "list-visible"); + } +-- +1.6.5.1 + + +From 6197ec180d369899bf4b87c5e8adaed62ed3fdeb Mon Sep 17 00:00:00 2001 +From: Ray Strode +Date: Fri, 30 Oct 2009 14:52:04 -0400 +Subject: [PATCH 4/6] Dynamically slide destination from step function + +This lets us add items or swift directions while the animation is going. +--- + gui/simple-greeter/gdm-chooser-widget.c | 10 +++++----- + gui/simple-greeter/gdm-scrollable-widget.c | 19 ++++++++++++++++++- + gui/simple-greeter/gdm-scrollable-widget.h | 1 + + 3 files changed, 24 insertions(+), 6 deletions(-) + +diff --git a/gui/simple-greeter/gdm-chooser-widget.c b/gui/simple-greeter/gdm-chooser-widget.c +index 4124195..4df03a6 100644 +--- a/gui/simple-greeter/gdm-chooser-widget.c ++++ b/gui/simple-greeter/gdm-chooser-widget.c +@@ -97,7 +97,6 @@ struct GdmChooserWidgetPrivate + GdmChooserWidgetState state; + + double active_row_normalized_position; +- int height_when_grown; + }; + + enum { +@@ -552,6 +551,7 @@ set_frame_text (GdmChooserWidget *widget, + static void + on_shrink_animation_step (GdmScrollableWidget *scrollable_widget, + double progress, ++ int *new_height, + GdmChooserWidget *widget) + { + GtkTreePath *active_row_path; +@@ -839,6 +839,7 @@ get_number_of_on_screen_rows (GdmChooserWidget *widget) + static void + on_grow_animation_step (GdmScrollableWidget *scrollable_widget, + double progress, ++ int *new_height, + GdmChooserWidget *widget) + { + int number_of_visible_rows; +@@ -851,6 +852,8 @@ on_grow_animation_step (GdmScrollableWidget *scrollable_widget, + gdm_scrollable_widget_stop_sliding (scrollable_widget); + return; + } ++ ++ *new_height = GTK_BIN (scrollable_widget)->child->requisition.height; + } + + static void +@@ -870,7 +873,7 @@ start_grow_animation (GdmChooserWidget *widget) + set_inactive_items_visible (widget, TRUE); + + gdm_scrollable_widget_slide_to_height (GDM_SCROLLABLE_WIDGET (widget->priv->scrollable_widget), +- widget->priv->height_when_grown, ++ GTK_BIN (widget->priv->scrollable_widget)->child->requisition.height, + (GdmScrollableWidgetSlideStepFunc) + on_grow_animation_step, widget, + (GdmScrollableWidgetSlideDoneFunc) +@@ -1206,9 +1209,6 @@ gdm_chooser_widget_size_allocate (GtkWidget *widget, + + chooser_widget = GDM_CHOOSER_WIDGET (widget); + +- if (chooser_widget->priv->state == GDM_CHOOSER_WIDGET_STATE_GROWN) { +- chooser_widget->priv->height_when_grown = allocation->height; +- } + } + + static gboolean +diff --git a/gui/simple-greeter/gdm-scrollable-widget.c b/gui/simple-greeter/gdm-scrollable-widget.c +index 2c0407d..6d9dc83 100644 +--- a/gui/simple-greeter/gdm-scrollable-widget.c ++++ b/gui/simple-greeter/gdm-scrollable-widget.c +@@ -132,9 +132,26 @@ on_animation_tick (GdmScrollableWidgetAnimation *animation, + gtk_widget_set_size_request (animation->widget, width, height); + + if (animation->step_func != NULL) { ++ GdmTimer *timer; ++ ++ height = animation->desired_height; ++ ++ height -= animation->widget->style->ythickness * 2; ++ height -= GTK_CONTAINER (animation->widget)->border_width * 2; ++ ++ timer = g_object_ref (animation->timer); + animation->step_func (GDM_SCROLLABLE_WIDGET (animation->widget), + progress, ++ &height, + animation->step_func_user_data); ++ ++ if (gdm_timer_is_started (timer)) { ++ height += animation->widget->style->ythickness * 2; ++ height += GTK_CONTAINER (animation->widget)->border_width * 2; ++ ++ animation->desired_height = height; ++ } ++ g_object_unref (timer); + } + } + +@@ -708,7 +725,7 @@ gdm_scrollable_widget_slide_to_height (GdmScrollableWidget *scrollable_widget, + + if (!input_redirected || gdm_scrollable_widget_animations_are_disabled (scrollable_widget)) { + if (step_func != NULL) { +- step_func (scrollable_widget, 0.0, step_user_data); ++ step_func (scrollable_widget, 0.0, &height, step_user_data); + } + + if (done_func != NULL) { +diff --git a/gui/simple-greeter/gdm-scrollable-widget.h b/gui/simple-greeter/gdm-scrollable-widget.h +index 9b8877e..2241cb1 100644 +--- a/gui/simple-greeter/gdm-scrollable-widget.h ++++ b/gui/simple-greeter/gdm-scrollable-widget.h +@@ -40,6 +40,7 @@ typedef struct GdmScrollableWidget GdmScrollableWidget; + typedef struct GdmScrollableWidgetPrivate GdmScrollableWidgetPrivate; + typedef void (* GdmScrollableWidgetSlideStepFunc) (GdmScrollableWidget *scrollable_widget, + double progress, ++ int *new_height, + gpointer *user_data); + typedef void (* GdmScrollableWidgetSlideDoneFunc) (GdmScrollableWidget *scrollable_widget, + gpointer *user_data); +-- +1.6.5.1 + + +From a31d6dd70213fd3ab8572da2923b99fcbe5449a6 Mon Sep 17 00:00:00 2001 +From: Ray Strode +Date: Fri, 30 Oct 2009 14:47:45 -0400 +Subject: [PATCH 5/6] Drop checks for growing too far + +We're now very exact about where to grow so we don't need it. +--- + gui/simple-greeter/gdm-chooser-widget.c | 16 ---------------- + 1 files changed, 0 insertions(+), 16 deletions(-) + +diff --git a/gui/simple-greeter/gdm-chooser-widget.c b/gui/simple-greeter/gdm-chooser-widget.c +index 4df03a6..6c29d23 100644 +--- a/gui/simple-greeter/gdm-chooser-widget.c ++++ b/gui/simple-greeter/gdm-chooser-widget.c +@@ -848,28 +848,12 @@ on_grow_animation_step (GdmScrollableWidget *scrollable_widget, + number_of_visible_rows = gtk_tree_model_iter_n_children (GTK_TREE_MODEL (widget->priv->model_sorter), NULL); + number_of_on_screen_rows = get_number_of_on_screen_rows (widget); + +- if (number_of_on_screen_rows >= number_of_visible_rows) { +- gdm_scrollable_widget_stop_sliding (scrollable_widget); +- return; +- } +- + *new_height = GTK_BIN (scrollable_widget)->child->requisition.height; + } + + static void + start_grow_animation (GdmChooserWidget *widget) + { +- int number_of_visible_rows; +- int number_of_rows; +- +- number_of_visible_rows = gtk_tree_model_iter_n_children (GTK_TREE_MODEL (widget->priv->model_sorter), NULL); +- number_of_rows = gtk_tree_model_iter_n_children (GTK_TREE_MODEL (widget->priv->list_store), NULL); +- +- if (number_of_visible_rows >= number_of_rows) { +- on_grow_animation_complete (GDM_SCROLLABLE_WIDGET (widget->priv->scrollable_widget), widget); +- return; +- } +- + set_inactive_items_visible (widget, TRUE); + + gdm_scrollable_widget_slide_to_height (GDM_SCROLLABLE_WIDGET (widget->priv->scrollable_widget), +-- +1.6.5.1 + + +From f685f9fe038d891026fce69a47a7ab7c3e438d37 Mon Sep 17 00:00:00 2001 +From: Ray Strode +Date: Fri, 30 Oct 2009 16:44:29 -0400 +Subject: [PATCH 6/6] Compute needs-scrollbar logic differently + +This way is a little clearer to read and seems to work +around a bug where the scrollbar gets shown briefly at +the end of an animation. +--- + gui/simple-greeter/gdm-scrollable-widget.c | 16 +++++++++++++--- + 1 files changed, 13 insertions(+), 3 deletions(-) + +diff --git a/gui/simple-greeter/gdm-scrollable-widget.c b/gui/simple-greeter/gdm-scrollable-widget.c +index 6d9dc83..d55013d 100644 +--- a/gui/simple-greeter/gdm-scrollable-widget.c ++++ b/gui/simple-greeter/gdm-scrollable-widget.c +@@ -252,7 +252,7 @@ gdm_scrollable_widget_animation_stop (GdmScrollableWidgetAnimation *animation) + static gboolean + gdm_scrollable_widget_needs_scrollbar (GdmScrollableWidget *widget) + { +- GtkAdjustment *adjustment; ++ gboolean needs_scrollbar; + + if (widget->priv->scrollbar == NULL) { + return FALSE; +@@ -266,9 +266,19 @@ gdm_scrollable_widget_needs_scrollbar (GdmScrollableWidget *widget) + return FALSE; + } + +- adjustment = gtk_range_get_adjustment (GTK_RANGE (widget->priv->scrollbar)); ++ if (GTK_BIN (widget)->child != NULL) { ++ GtkRequisition child_requisition; ++ int available_height; ++ ++ gtk_widget_get_child_requisition (GTK_BIN (widget)->child, ++ &child_requisition); ++ available_height = GTK_WIDGET (widget)->allocation.height; ++ needs_scrollbar = child_requisition.height > available_height; ++ } else { ++ needs_scrollbar = FALSE; ++ } + +- return adjustment->upper - adjustment->lower > adjustment->page_size; ++ return needs_scrollbar; + } + + static void +-- +1.6.5.1 +