diff -ur clearlooks.org/src/clearlooks_style.c clearlooks/src/clearlooks_style.c --- clearlooks.org/src/clearlooks_style.c 2005-11-13 23:32:51.000000000 +0100 +++ clearlooks/src/clearlooks_style.c 2005-11-14 22:38:57.000000000 +0100 @@ -33,15 +33,10 @@ gint height #ifdef HAVE_ANIMATION -static GList *progressbars = NULL; -static int timer_id = 0; -static GList *checks = NULL; -static gint8 checks_trans = 2; -static int checks_timer_id = 0; +static GHashTable *async_widgets = NULL; +static int async_widget_timer_id = 0; #endif -static gint8 pboffset = 0; - static GtkStyleClass *parent_class; static cairo_t * @@ -61,128 +56,130 @@ } #ifdef HAVE_ANIMATION -static void cl_progressbar_remove (gpointer data) +static gboolean cl_async_widget_known(gconstpointer data) { - if (g_list_find (progressbars, data) == NULL) - return; - - progressbars = g_list_remove (progressbars, data); - g_object_unref (data); - - if (g_list_first(progressbars) == NULL) { - g_source_remove(timer_id); - timer_id = 0; - } + if (async_widgets == NULL) + return FALSE; + else + if(g_hash_table_lookup (async_widgets, data) != NULL) + return TRUE; + return FALSE; } -static void update_progressbar (gpointer data, gpointer user_data) +static void cl_async_widget_remove (gpointer data) { - gfloat fraction; - - if (data == NULL) - return; - - fraction = gtk_progress_bar_get_fraction (GTK_PROGRESS_BAR (data)); - - /* update only if not filled */ - if (fraction < 1.0) - gtk_widget_queue_resize ((GtkWidget*)data); - - if (fraction >= 1.0 || GTK_PROGRESS (data)->activity_mode) - cl_progressbar_remove (data); -} + int *value; + if(async_widgets == NULL) + return; + + if (!cl_async_widget_known(data)) + return; -static gboolean timer_func (gpointer data) -{ - g_list_foreach (progressbars, update_progressbar, NULL); - if (--pboffset < 0) pboffset = 9; - return (g_list_first(progressbars) != NULL); + value = g_hash_table_lookup(async_widgets, data); + + g_free(value); + + g_hash_table_remove(async_widgets, data); + + g_object_disconnect (data, "any_signal::unrealize", G_CALLBACK (cl_async_widget_remove), data, NULL); + + g_object_unref (data); + + if ((g_hash_table_size(async_widgets) == 0)&&(async_widget_timer_id != 0)) { + g_source_remove(async_widget_timer_id); + async_widget_timer_id = 0; + } } -static gboolean cl_progressbar_known(gconstpointer data) -{ - return (g_list_find (progressbars, data) != NULL); -} -static void cl_progressbar_add (gpointer data) +static gboolean cl_async_widget_update (gpointer data, gpointer value, gpointer user_data) { - if (!GTK_IS_PROGRESS_BAR (data)) + int *my_value = (int*)value; + //printf("my value: %d\n",*my_value); + if ((data == NULL)||(value == NULL)) return; - - progressbars = g_list_append (progressbars, data); - - g_object_ref (data); - g_signal_connect ((GObject*)data, "unrealize", G_CALLBACK (cl_progressbar_remove), data); - - if (timer_id == 0) - timer_id = g_timeout_add (100, timer_func, NULL); + if(GTK_IS_PROGRESS_BAR ((GtkWidget*)data)) + { + gfloat fraction = gtk_progress_bar_get_fraction (GTK_PROGRESS_BAR (data)); + /* update only if not filled */ + if (fraction < 1.0) + gtk_widget_queue_resize ((GtkWidget*)data); + if (--(*my_value)< 0) + *my_value = 9; + } + else + { + gtk_widget_queue_draw ((GtkWidget*)data); + if (--(*my_value)< 0) + { + //animation is done + g_free(value); + return TRUE; + } + } + return FALSE; } -static void cl_checks_remove (gpointer data) + +static gboolean cl_async_widgets_timer_func (gpointer data) { - if (g_list_find (checks, data) == NULL) - return; - - checks = g_list_remove (checks, data); - - g_object_unref (data); - - if (g_list_first(checks) == NULL) { - g_source_remove(checks_timer_id); - checks_timer_id = 0; + //printf("** TICK **\n"); + g_hash_table_foreach_remove (async_widgets, cl_async_widget_update, NULL); + if(g_hash_table_size(async_widgets)==0) + { + g_source_remove(async_widget_timer_id); + async_widget_timer_id = 0; } + return (g_hash_table_size(async_widgets) != 0); } -static void cl_update_checks (gpointer data, gpointer user_data) +static void cl_async_widget_add (gpointer data, int count) { - if (data == NULL) + int *value; + if(cl_async_widget_known(data)) return; - - if (checks_trans > 5) - cl_checks_remove(data); - gtk_widget_queue_resize ((GtkWidget*)data); -} - -static gboolean cl_checks_known(gconstpointer data) -{ - return (g_list_find (checks, data) != NULL); + if(async_widgets == NULL) + async_widgets = g_hash_table_new(g_direct_hash, g_direct_equal); + value = g_new(int, sizeof(int)); + *value = count; + g_hash_table_insert (async_widgets, data, value); + + g_object_ref (data); + + g_signal_connect ((GObject*)data, "unrealize", G_CALLBACK (cl_async_widget_remove), data); + + if (async_widget_timer_id == 0) + async_widget_timer_id = g_timeout_add (100, cl_async_widgets_timer_func, NULL); } -static gboolean cl_checks_timer_func (gpointer data) +static int cl_async_widget_getdata (gpointer data) { - g_list_foreach (checks, cl_update_checks, NULL); - - if (++checks_trans > 6) - checks_trans = 2; - - return (g_list_first(checks) != NULL); + if(async_widgets == NULL) + return 0; + if(!cl_async_widget_known(data)) + return 0; + int *my_value = (int*)g_hash_table_lookup(async_widgets, data); + if (my_value == NULL) + return 0; + return *my_value; } -static void cl_checks_toggled (gpointer data) +static void cl_checkbox_toggle (gpointer data) { + /* if (!GTK_IS_CHECK_BUTTON (data)) return; + */ + cl_async_widget_add(data,5); +} - if(!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data))) - { - if (g_list_first(checks) == NULL) - checks_trans = 2; - - return; - } - - if(!cl_checks_known(data)) - checks = g_list_append (checks, data); - else - return; - g_object_ref (data); - - g_signal_connect ((GObject*)data, "unrealize", G_CALLBACK (cl_checks_remove), data); - - if (checks_timer_id == 0) - checks_timer_id = g_timeout_add (100, cl_checks_timer_func, NULL); +static void cl_progressbar_add1 (gpointer data) +{ + if (!GTK_IS_PROGRESS_BAR (data)) + return; + cl_async_widget_add(data,10); } #endif /* HAVE_ANIMATION */ @@ -714,16 +711,11 @@ { gboolean activity_mode = GTK_PROGRESS (widget)->activity_mode; if (!activity_mode && gtk_progress_bar_get_fraction (GTK_PROGRESS_BAR (widget)) != 1.0 && - !cl_progressbar_known((gconstpointer)widget)) + !cl_async_widget_known((gconstpointer)widget)) { - cl_progressbar_add ((gpointer)widget); + cl_progressbar_add1 ((gpointer)widget); } } - else - if(cl_progressbar_known((gconstpointer)widget)) - { - cl_progressbar_remove ((gpointer)widget); - } #endif clearlooks_set_widget_parameters (widget, style, state_type, ¶ms); @@ -734,10 +726,14 @@ progressbar.orientation = CL_ORIENTATION_LEFT_TO_RIGHT; cairo_reset_clip (cr); - +#ifdef HAVE_ANIMATION clearlooks_draw_progressbar_fill (cr, colors, ¶ms, &progressbar, - x, y, width, height,pboffset); - + x, y, width, height, cl_async_widget_getdata((gpointer)widget)); +#else + clearlooks_draw_progressbar_fill (cr, colors, ¶ms, &progressbar, + x, y, width, height, 0); + +#endif } else if (DETAIL ("hscale") || DETAIL ("vscale")) { @@ -882,10 +878,16 @@ ClearlooksStyle *clearlooks_style = CLEARLOOKS_STYLE (style); CairoColor *border; CairoColor *dot; + double trans = 1.0; cairo_t *cr = clearlooks_begin_paint (window, area); cairo_pattern_t *pt; +#ifdef HAVE_ANIMATION + if(clearlooks_style->animation && !cl_async_widget_known((gconstpointer)widget)) + g_signal_connect ((GObject*)widget, "toggled", G_CALLBACK (cl_checkbox_toggle), widget); +#endif + if (state_type == GTK_STATE_INSENSITIVE) { border = &clearlooks_style->colors.shade[2]; @@ -896,7 +898,6 @@ border = &clearlooks_style->colors.shade[7]; dot = &clearlooks_style->colors.spot[1]; } - pt = cairo_pattern_create_linear (0, 0, 13, 13); cairo_pattern_add_color_stop_rgba (pt, 0.0, 0, 0, 0, 0.1); cairo_pattern_add_color_stop_rgba (pt, 0.5, 0, 0, 0, 0); @@ -910,7 +911,7 @@ cairo_set_source (cr, pt); cairo_stroke (cr); cairo_pattern_destroy (pt); - + cairo_set_line_width (cr, 1); cairo_arc (cr, 7, 7, 5.5, 0, M_PI*2); @@ -925,14 +926,27 @@ cairo_set_source_rgb (cr, border->r, border->g, border->b); cairo_stroke (cr); - if (shadow_type == GTK_SHADOW_IN) + if ((shadow_type == GTK_SHADOW_IN)||(clearlooks_style->animation && cl_async_widget_known((gconstpointer)widget))) { +#ifdef HAVE_ANIMATION + if (clearlooks_style->animation && cl_async_widget_known((gconstpointer)widget)) + { + int value = cl_async_widget_getdata((gpointer)widget); + if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))) + trans = (float)(5-value)/5; + else + trans = (float)value/5; + } +#endif + cairo_arc (cr, 7, 7, 3, 0, M_PI*2); - cairo_set_source_rgb (cr, dot->r, dot->g, dot->b); + //cairo_set_source_rgb (cr, dot->r, dot->g, dot->b); + cairo_set_source_rgba (cr, dot->r, dot->g, dot->b,trans); cairo_fill (cr); cairo_arc (cr, 6, 6, 1, 0, M_PI*2); - cairo_set_source_rgba (cr, 1,1,1, 0.5); + //cairo_set_source_rgba (cr, 1,1,1, 0.5); + cairo_set_source_rgba (cr, 1,1,1, 0.5+trans); cairo_fill (cr); } @@ -951,16 +965,10 @@ cairo_pattern_t *pt; #ifdef HAVE_ANIMATION - if(clearlooks_style->animation && GTK_IS_CHECK_BUTTON (widget)) - { - if (!cl_checks_known((gconstpointer)widget)) - g_signal_connect ((GObject*)widget, "toggled", G_CALLBACK (cl_checks_toggled), widget); - } - else - if (cl_checks_known((gconstpointer)widget)) - cl_checks_remove((gpointer)widget); + if(clearlooks_style->animation && !cl_async_widget_known((gconstpointer)widget)) + g_signal_connect ((GObject*)widget, "toggled", G_CALLBACK (cl_checkbox_toggle), widget); #endif - + if (state_type == GTK_STATE_INSENSITIVE) { border = &clearlooks_style->colors.shade[2]; @@ -971,7 +979,7 @@ border = &clearlooks_style->colors.shade[7]; dot = &clearlooks_style->colors.spot[1]; } - + pt = cairo_pattern_create_linear (0, 0, 0, 13); cairo_pattern_add_color_stop_rgba (pt, 0.0, 0, 0, 0, 0.04); cairo_pattern_add_color_stop_rgba (pt, 0.5, 0, 0, 0, 0); @@ -998,7 +1006,7 @@ cairo_set_source_rgb (cr, border->r, border->g, border->b); cairo_stroke (cr); - if (shadow_type == GTK_SHADOW_IN) + if ((shadow_type == GTK_SHADOW_IN)||(clearlooks_style->animation && cl_async_widget_known((gconstpointer)widget))) { cairo_set_line_width (cr, 1.7); cairo_move_to (cr, 0.5 + (width*0.2), (height*0.5)); @@ -1009,14 +1017,19 @@ 0.5 + (width*0.70), (height*0.25)); #ifdef HAVE_ANIMATION - if (clearlooks_style->animation && (checks_trans < 9) && cl_checks_known((gconstpointer)widget)) - trans = (float)checks_trans/5; + if (clearlooks_style->animation && cl_async_widget_known((gconstpointer)widget)) + { + int value = cl_async_widget_getdata((gpointer)widget); + if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))) + trans = (float)(5-value)/5; + else + trans = (float)value/5; + } #endif cairo_set_source_rgba (cr, dot->r, dot->g, dot->b, trans); cairo_stroke (cr); } - cairo_destroy (cr); } @@ -1366,30 +1379,28 @@ g_free (dash_list); } +static gboolean cl_disconnect(gpointer data, gpointer value, gpointer user_data) +{ + if(GTK_IS_CHECK_BUTTON (data)) + g_object_disconnect (data, "any_signal::toggled", G_CALLBACK (cl_checkbox_toggle ), data, NULL); + return TRUE; +} + static void clearlooks_style_unrealize (GtkStyle * style) { parent_class->unrealize (style); #ifdef HAVE_ANIMATION - while ((progressbars = g_list_first (progressbars))) - { - g_object_disconnect (progressbars->data, "any_signal::unrealize", G_CALLBACK (cl_progressbar_remove), progressbars->data, NULL); - cl_progressbar_remove (progressbars->data); - } - - while ((checks = g_list_first (checks))) - { - g_object_disconnect (checks->data, "any_signal::unrealize", G_CALLBACK (cl_checks_remove), checks->data, NULL); - g_object_disconnect (checks->data, "any_signal::toggled", G_CALLBACK (cl_checks_toggled), checks->data, NULL); - cl_checks_remove (checks->data); - } - - if (timer_id != 0) + if(async_widgets != NULL) + g_hash_table_foreach_remove(async_widgets, cl_disconnect, NULL); + /* + if (async_widget_timer_id != 0) { - g_source_remove(timer_id); - timer_id = 0; + g_source_remove(async_widget_timer_id); + async_widget_timer_id = 0; } + */ #endif /* HAVE_ANIMATION */ }