diff --git a/src/process-monitor.c b/src/process-monitor.c index 0ef954b..3bea77d 100644 --- a/src/process-monitor.c +++ b/src/process-monitor.c @@ -21,9 +21,6 @@ enum { PROP_STEP_SIZE = 1, - PROP_COLOR_RED, - PROP_COLOR_GREEN, - PROP_COLOR_BLUE, PROP_PAINT_BOX, }; typedef struct _XtmProcessMonitorClass XtmProcessMonitorClass; @@ -37,9 +34,6 @@ struct _XtmProcessMonitor /**/ gfloat step_size; GArray * history; - gfloat color_red; - gfloat color_green; - gfloat color_blue; gboolean paint_box; }; G_DEFINE_TYPE (XtmProcessMonitor, xtm_process_monitor, GTK_TYPE_DRAWING_AREA) @@ -66,37 +60,14 @@ xtm_process_monitor_class_init (XtmProcessMonitorClass *klass) #endif g_object_class_install_property (class, PROP_STEP_SIZE, g_param_spec_float ("step-size", "StepSize", "Step size", 0.1, G_MAXFLOAT, 1, G_PARAM_CONSTRUCT|G_PARAM_READWRITE)); - g_object_class_install_property (class, PROP_COLOR_RED, - g_param_spec_float ("color-red", "ColorRed", "Color red", 0, 1, 0, G_PARAM_READWRITE)); - g_object_class_install_property (class, PROP_COLOR_GREEN, - g_param_spec_float ("color-green", "ColorGreen", "Color green", 0, 1, 0, G_PARAM_READWRITE)); - g_object_class_install_property (class, PROP_COLOR_BLUE, - g_param_spec_float ("color-blue", "ColorBlue", "Color blue", 0, 1, 0, G_PARAM_READWRITE)); g_object_class_install_property (class, PROP_PAINT_BOX, g_param_spec_boolean ("paint-box", "PaintBox", "Paint box around monitor", TRUE, G_PARAM_CONSTRUCT|G_PARAM_READWRITE)); } -static void -init_source_color (GtkWidget *widget, GtkStyle *prev_style, gpointer user_data) -{ -#ifdef HAVE_GTK3 - GdkColor *color; -/* - gdk_color_parse("red", color); -*/ -#else - GdkColor *color = &widget->style->base[GTK_STATE_SELECTED]; - XTM_PROCESS_MONITOR (widget)->color_red = color->red / 65535.0; - XTM_PROCESS_MONITOR (widget)->color_green = color->green / 65535.0; - XTM_PROCESS_MONITOR (widget)->color_blue = color->blue / 65535.0; -#endif -} - static void xtm_process_monitor_init (XtmProcessMonitor *monitor) { monitor->history = g_array_new (FALSE, TRUE, sizeof (gfloat)); - g_signal_connect (monitor, "style-set", G_CALLBACK (init_source_color), NULL); } static void @@ -109,18 +80,6 @@ xtm_process_monitor_get_property (GObject *object, guint property_id, GValue *va g_value_set_float (value, monitor->step_size); break; - case PROP_COLOR_RED: - g_value_set_float (value, monitor->color_red); - break; - - case PROP_COLOR_GREEN: - g_value_set_float (value, monitor->color_green); - break; - - case PROP_COLOR_BLUE: - g_value_set_float (value, monitor->color_blue); - break; - case PROP_PAINT_BOX: g_value_set_boolean (value, monitor->paint_box); break; @@ -141,18 +100,6 @@ xtm_process_monitor_set_property (GObject *object, guint property_id, const GVal monitor->step_size = g_value_get_float (value); break; - case PROP_COLOR_RED: - monitor->color_red = g_value_get_float (value); - break; - - case PROP_COLOR_GREEN: - monitor->color_green = g_value_get_float (value); - break; - - case PROP_COLOR_BLUE: - monitor->color_blue = g_value_get_float (value); - break; - case PROP_PAINT_BOX: monitor->paint_box = g_value_get_boolean (value); break; @@ -182,14 +129,12 @@ xtm_process_monitor_expose (GtkWidget *widget, GdkEventExpose *event) } static cairo_surface_t * -xtm_process_monitor_graph_surface_create (XtmProcessMonitor *monitor) +xtm_process_monitor_graph_surface_create (XtmProcessMonitor *monitor, gint width, gint height) { cairo_t *cr; cairo_surface_t *graph_surface; - cairo_pattern_t *linpat; gfloat *peak; gfloat step_size; - gint width, height; gint i; if (monitor->history->len <= 1) @@ -197,25 +142,13 @@ xtm_process_monitor_graph_surface_create (XtmProcessMonitor *monitor) g_warning ("Cannot paint graph with n_peak <= 1"); return NULL; } - -#ifdef HAVE_GTK3 - width = gtk_widget_get_allocated_width(GTK_WIDGET(monitor)); - height = gtk_widget_get_allocated_height(GTK_WIDGET(monitor)); -#else - width = GTK_WIDGET (monitor)->allocation.width; - height = GTK_WIDGET (monitor)->allocation.height; -#endif step_size = monitor->step_size; graph_surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, width, height); cr = cairo_create (graph_surface); - /* Draw area */ - linpat = cairo_pattern_create_linear (0, 0, 0, height); - cairo_pattern_add_color_stop_rgba (linpat, 0.4, monitor->color_red, monitor->color_green, monitor->color_blue, 0.3); - cairo_pattern_add_color_stop_rgba (linpat, 0.9, monitor->color_red, monitor->color_green, monitor->color_blue, 0.5); - cairo_pattern_add_color_stop_rgba (linpat, 1, monitor->color_red, monitor->color_green, monitor->color_blue, 0.6); - cairo_set_source (cr, linpat); + /* Draw area below the line */ + cairo_set_source_rgba (cr, 1.0, 0.43, 0.0, 0.3); cairo_set_line_width (cr, 0.0); cairo_set_antialias (cr, CAIRO_ANTIALIAS_DEFAULT); @@ -230,12 +163,10 @@ xtm_process_monitor_graph_surface_create (XtmProcessMonitor *monitor) cairo_line_to (cr, width, height); cairo_fill (cr); - cairo_pattern_destroy (linpat); - /* Draw line */ cairo_translate (cr, step_size * i, 0); - cairo_set_source_rgb (cr, monitor->color_red, monitor->color_green, monitor->color_blue); + cairo_set_source_rgba (cr, 1.0, 0.43, 0.0, 1.0); cairo_set_line_width (cr, 0.85); cairo_set_line_cap (cr, CAIRO_LINE_CAP_ROUND); cairo_set_line_join (cr, CAIRO_LINE_JOIN_ROUND); @@ -260,6 +191,7 @@ xtm_process_monitor_paint (XtmProcessMonitor *monitor) cairo_t *cr; cairo_surface_t *graph_surface; gint width, height; + static const double dashed[] = {1.5}; gint i; cr = gdk_cairo_create (gtk_widget_get_window(GTK_WIDGET(monitor))); #ifdef HAVE_GTK3 @@ -270,17 +202,27 @@ xtm_process_monitor_paint (XtmProcessMonitor *monitor) height = GTK_WIDGET (monitor)->allocation.height; #endif - /* Paint a box */ - if (monitor->paint_box) -#ifdef HAVE_GTK3 - gtk_paint_box (gtk_widget_get_style(GTK_WIDGET(monitor)), cr, GTK_STATE_PRELIGHT, GTK_SHADOW_IN, - GTK_WIDGET (monitor), "trough", 0, 0, width, height); -#else - gtk_paint_box (gtk_widget_get_style(GTK_WIDGET(monitor)), gtk_widget_get_window(GTK_WIDGET(monitor)), GTK_STATE_PRELIGHT, GTK_SHADOW_IN, - NULL, GTK_WIDGET (monitor), "trough", 0, 0, width, height); -#endif - /* Paint the graph */ - graph_surface = xtm_process_monitor_graph_surface_create (monitor); + /* Paint the graph's background box */ + cairo_rectangle (cr, 0.0, 0.0, width, height); + cairo_set_source_rgb (cr, 0.96, 0.96, 0.96); + cairo_fill_preserve (cr); + cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); + cairo_set_line_width (cr, 0.75); + cairo_stroke (cr); + + /* Paint dashed lines at 25%, 50% and 75% */ + cairo_set_source_rgba (cr, 0.0, 0.0, 0.0, 0.3); + cairo_set_line_width (cr, 1.0); + cairo_set_dash(cr, dashed, 1.0, 0); + for (i = 25; i <= 75; i += 25) + { + cairo_move_to (cr, 1.5, i * height / 100 + 0.5); + cairo_line_to (cr, width - 0.5, i * height / 100 + 0.5); + cairo_stroke (cr); + } + + /* Paint the graph on a slightly smaller surface not to overlap with the background box */ + graph_surface = xtm_process_monitor_graph_surface_create (monitor, width - 1, height - 1); if (graph_surface != NULL) { cairo_set_source_surface (cr, graph_surface, 0.0, 0.0); @@ -288,48 +230,6 @@ xtm_process_monitor_paint (XtmProcessMonitor *monitor) cairo_surface_destroy (graph_surface); } - /* Trace some marks */ - cairo_set_line_width (cr, 0.75); - cairo_set_line_cap (cr, CAIRO_LINE_CAP_SQUARE); - cairo_set_line_join (cr, CAIRO_LINE_JOIN_MITER); - cairo_set_antialias (cr, CAIRO_ANTIALIAS_DEFAULT); - for (i = 10; i < 100; i += 10) - { - cairo_move_to (cr, 0.0, i * height / 100); - cairo_line_to (cr, width, i * height / 100); - } - cairo_stroke (cr); - -#ifdef HAVE_GTK3 - GdkColor *color; -/* - gdk_color_parse("red", color); - gdk_cairo_set_source_color (cr, color); -*/ -#else - gdk_cairo_set_source_color (cr, >K_WIDGET (monitor)->style->fg[GTK_STATE_NORMAL]); -#endif - cairo_set_antialias (cr, CAIRO_ANTIALIAS_NONE); - cairo_set_line_width (cr, 1.0); - for (i = 25; i <= 75; i += 25) - { - cairo_move_to (cr, 0.0, i * height / 100); - cairo_line_to (cr, 4.0, i * height / 100); - cairo_move_to (cr, width, i * height / 100); - cairo_line_to (cr, width - 4.0, i * height / 100); - } - cairo_stroke (cr); - - /* Repaint a shadow on top of everything to clear corners */ - if (monitor->paint_box) -#ifdef HAVE_GTK3 - gtk_paint_shadow (gtk_widget_get_style(GTK_WIDGET(monitor)), cr, GTK_STATE_PRELIGHT, GTK_SHADOW_IN, - GTK_WIDGET (monitor), "trough", 0, 0, width, height); -#else - gtk_paint_shadow (gtk_widget_get_style(GTK_WIDGET(monitor)), gtk_widget_get_window(GTK_WIDGET(monitor)), GTK_STATE_PRELIGHT, GTK_SHADOW_IN, - NULL, GTK_WIDGET (monitor), "trough", 0, 0, width, height); -#endif - cairo_destroy (cr); } @@ -371,16 +271,6 @@ xtm_process_monitor_clear (XtmProcessMonitor *monitor) gdk_window_invalidate_rect (gtk_widget_get_window (GTK_WIDGET(monitor)), NULL, FALSE); } -void -xtm_process_monitor_set_source_color (XtmProcessMonitor *monitor, gdouble red, gdouble green, gdouble blue) -{ - g_return_if_fail (XTM_IS_PROCESS_MONITOR (monitor)); - g_signal_handlers_disconnect_by_func (GTK_WIDGET (monitor), init_source_color, NULL); - g_object_set (monitor, "color-red", red, "color-green", green, "color-blue", blue, NULL); - if (GDK_IS_WINDOW (gtk_widget_get_window (GTK_WIDGET(monitor)))) - gdk_window_invalidate_rect (gtk_widget_get_window (GTK_WIDGET(monitor)), NULL, FALSE); -} - void xtm_process_monitor_set_paint_box (XtmProcessMonitor *monitor, gboolean paint_box) { diff --git a/src/process-monitor.h b/src/process-monitor.h index aa90f98..7d84bbd 100644 --- a/src/process-monitor.h +++ b/src/process-monitor.h @@ -30,7 +30,5 @@ GtkWidget * xtm_process_monitor_new (void); void xtm_process_monitor_add_peak (XtmProcessMonitor *monitor, gfloat peak); void xtm_process_monitor_set_step_size (XtmProcessMonitor *monitor, gfloat step_size); void xtm_process_monitor_clear (XtmProcessMonitor *monitor); -void xtm_process_monitor_set_source_color (XtmProcessMonitor *monitor, gdouble red, gdouble green, gdouble blue); -void xtm_process_monitor_set_paint_box (XtmProcessMonitor *monitor, gboolean paint_box); #endif /* !PROCESS_MONITOR_H */