diff -ur clearlooks.org/src/clearlooks_style.c clearlooks/src/clearlooks_style.c --- clearlooks.org/src/clearlooks_style.c 2005-11-17 21:23:52.000000000 +0100 +++ clearlooks/src/clearlooks_style.c 2005-11-17 22:27:27.000000000 +0100 @@ -33,14 +33,17 @@ 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; -#endif +struct _Widget_Sequence { + gint8 max_frames; + gint8 frame; + gint8 loop; +}; -static gint8 pboffset = 0; +typedef struct _Widget_Sequence Widget_Sequence; + +static GHashTable *async_widgets = NULL; +static int async_widget_timer_id = 0; +#endif static GtkStyleClass *parent_class; @@ -61,128 +64,143 @@ } #ifdef HAVE_ANIMATION -static void cl_progressbar_remove (gpointer 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; - } -} - -static void update_progressbar (gpointer data, gpointer user_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); -} - -static gboolean timer_func (gpointer data) +static gboolean cl_async_widget_known(gconstpointer data) { - g_list_foreach (progressbars, update_progressbar, NULL); - if (--pboffset < 0) pboffset = 9; - return (g_list_first(progressbars) != NULL); -} - -static gboolean cl_progressbar_known(gconstpointer data) -{ - return (g_list_find (progressbars, data) != NULL); + if (async_widgets == NULL) + return FALSE; + else + if(g_hash_table_lookup (async_widgets, data) != NULL) + return TRUE; + return FALSE; } -static void cl_progressbar_add (gpointer data) +static void cl_async_widget_remove (gpointer data) { - if (!GTK_IS_PROGRESS_BAR (data)) + Widget_Sequence *value; + if(async_widgets == 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); -} - -static void cl_checks_remove (gpointer data) -{ - if (g_list_find (checks, data) == NULL) + + if (!cl_async_widget_known(data)) return; - - checks = g_list_remove (checks, data); + + 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_list_first(checks) == NULL) { - g_source_remove(checks_timer_id); - checks_timer_id = 0; + 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 void cl_update_checks (gpointer data, gpointer user_data) + +static gboolean cl_async_widget_update (gpointer data, gpointer value, gpointer user_data) { - if (data == NULL) + Widget_Sequence *my_value = value; + if ((data == NULL)||(value == NULL)) return; - if (checks_trans > 5) - cl_checks_remove(data); + if (--(my_value->frame)< 0) + if(my_value->loop == 0) + my_value->frame = my_value->max_frames; + else if(my_value->loop == 1) + { + //animation is done + g_free((Widget_Sequence*)value); + return TRUE; + } + else if (my_value->loop > 1) + { + my_value->loop--; + my_value->frame = my_value->max_frames; + } + + if(GTK_IS_PROGRESS_BAR ((GtkWidget*)data)) + { + gfloat fraction = gtk_progress_bar_get_fraction (GTK_PROGRESS_BAR (data)); + /* update only if not filled */ + /* trick for progressbar, remove if it 100% from animation list, or animate if not) */ + if (fraction < 1.0) + gtk_widget_queue_resize ((GtkWidget*)data); + else + { + //animation is done + g_free((Widget_Sequence*)value); + return TRUE; + } + } + else + gtk_widget_queue_draw ((GtkWidget*)data); - gtk_widget_queue_resize ((GtkWidget*)data); + return FALSE; } -static gboolean cl_checks_known(gconstpointer data) + +static gboolean cl_async_widgets_timer_func (gpointer data) { - return (g_list_find (checks, data) != NULL); + //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 gboolean cl_checks_timer_func (gpointer data) +static void cl_async_widget_add (gpointer data, gint8 count,gint8 loop) { - g_list_foreach (checks, cl_update_checks, NULL); - - if (++checks_trans > 6) - checks_trans = 2; + Widget_Sequence *value; + if(cl_async_widget_known(data)) + return; + + if(async_widgets == NULL) + async_widgets = g_hash_table_new(g_direct_hash, g_direct_equal); + value = g_new(Widget_Sequence, sizeof(Widget_Sequence)); + value->frame = count; + value->max_frames= count; + value->loop = loop; + g_hash_table_insert (async_widgets, data, value); + + g_object_ref (data); - return (g_list_first(checks) != NULL); + 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 void cl_checks_toggled (gpointer data) +static Widget_Sequence cl_async_widget_getdata (gpointer data) { + Widget_Sequence res; + if(async_widgets == NULL) + return res; + if(!cl_async_widget_known(data)) + return res; + return *(Widget_Sequence*)g_hash_table_lookup(async_widgets, data); +} + +static void cl_checkbox_toggle (gpointer data) +{ + /* if (!GTK_IS_CHECK_BUTTON (data)) return; + */ + cl_async_widget_add(data,5,3); +} - 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,9,0); } #endif /* HAVE_ANIMATION */ @@ -714,16 +732,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 +747,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).frame); +#else + clearlooks_draw_progressbar_fill (cr, colors, ¶ms, &progressbar, + x, y, width, height, 0); + +#endif } else if (DETAIL ("hscale") || DETAIL ("vscale")) { @@ -882,10 +899,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 +919,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 +932,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 +947,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).frame; + 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 +986,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 +1000,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 +1027,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 +1038,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).frame; + 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 +1400,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 */ } Only in clearlooks/src: clearlooks_style.c.orig