gboolean update_gauge(gpointer data) { static gfloat lower = 0.0; static gfloat upper = 100.0; gfloat cur_val = 0.0; gfloat interval = 0.0; static gboolean rising = TRUE; GtkWidget * gauge = data; interval = (upper-lower)/100.0; /*mtx_gauge_face_get_attribute(MTX_PIE_GAUGE(gauge), LBOUND, &lower);*/ /*mtx_gauge_face_get_attribute(MTX_PIE_GAUGE(gauge), UBOUND, &upper);*/ cur_val = mtx_pie_gauge_get_value(MTX_PIE_GAUGE (gauge)); if (cur_val >= upper) rising = FALSE; if (cur_val <= lower) rising = TRUE; if (rising) cur_val+=interval; else cur_val-=interval; mtx_pie_gauge_set_value (MTX_PIE_GAUGE (gauge),cur_val); return TRUE; }
/*! \brief handles exposure events when the screen is covered and then exposed. Works by copying from a backing pixmap to screen, \param widget (GtkWidget *) pointer to the gauge object \param event (GdkEventExpose *) pointer to GDK event datastructure that encodes important info like window dimensions and depth. */ gboolean mtx_pie_gauge_expose (GtkWidget *widget, GdkEventExpose *event) { MtxPieGauge * gauge = MTX_PIE_GAUGE(widget); MtxPieGaugePrivate *priv = MTX_PIE_GAUGE_GET_PRIVATE(gauge); gdk_draw_drawable(widget->window, widget->style->fg_gc[GTK_WIDGET_STATE (widget)], priv->pixmap, event->area.x, event->area.y, event->area.x, event->area.y, event->area.width, event->area.height); return FALSE; }
/*! \brief handles configure events whe nthe gauge gets created or resized. Takes care of creating/destroying graphics contexts, backing pixmaps (two levels are used to split the rendering for speed reasons) colormaps are also created here as well \param widget (GtkWidget *) pointer to the gauge object \param event (GdkEventConfigure *) pointer to GDK event datastructure that encodes important info like window dimensions and depth. */ gboolean mtx_pie_gauge_configure (GtkWidget *widget, GdkEventConfigure *event) { MtxPieGauge * gauge = MTX_PIE_GAUGE(widget); MtxPieGaugePrivate *priv = MTX_PIE_GAUGE_GET_PRIVATE(gauge); priv->w = widget->allocation.width; priv->h = widget->allocation.height; if (priv->gc) g_object_unref(priv->gc); /* Backing pixmap (copy of window) */ if (priv->pixmap) g_object_unref(priv->pixmap); priv->pixmap=gdk_pixmap_new(widget->window, priv->w,priv->h, gtk_widget_get_visual(widget)->depth); gdk_draw_rectangle(priv->pixmap, widget->style->black_gc, TRUE, 0,0, priv->w,priv->h); /* Static Background pixmap */ if (priv->bg_pixmap) g_object_unref(priv->bg_pixmap); priv->bg_pixmap=gdk_pixmap_new(widget->window, priv->w,priv->h, gtk_widget_get_visual(widget)->depth); gdk_draw_rectangle(priv->bg_pixmap, widget->style->black_gc, TRUE, 0,0, priv->w,priv->h); gdk_window_set_back_pixmap(widget->window,priv->pixmap,0); priv->gc = gdk_gc_new(priv->bg_pixmap); gdk_gc_set_colormap(priv->gc,priv->colormap); if (priv->font_options) cairo_font_options_destroy(priv->font_options); priv->font_options = cairo_font_options_create(); cairo_font_options_set_antialias(priv->font_options, CAIRO_ANTIALIAS_GRAY); generate_pie_gauge_background(gauge); update_pie_gauge_position(gauge); return TRUE; }