From 97d01afc5a48b44e84fadfd019b1d6f28aca004e Mon Sep 17 00:00:00 2001 From: Jean-Philippe Orsini Date: Fri, 12 Sep 2014 21:49:11 +0200 Subject: [PATCH] fixed graph not fitting well in the central region. --- src/Makefile.am | 2 +- src/Makefile.in | 2 +- src/cfg.c | 9 ++-- src/graph.c | 149 +++++++++++++++++++++++++++++++++++++++++++------------- src/graph.h | 3 ++ src/ui_pref.c | 7 ++- 6 files changed, 125 insertions(+), 47 deletions(-) diff --git a/src/Makefile.am b/src/Makefile.am index 2d9c77c..34741e8 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -24,7 +24,7 @@ LIBS = \ lib/libpsensor.a \ $(GTK_LIBS)\ $(PTHREAD_LIBS)\ - $(SENSORS_LIBS) + $(SENSORS_LIBS) -lm if GTK if X11 diff --git a/src/Makefile.in b/src/Makefile.in index f27c228..519d709 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -322,7 +322,7 @@ LIBNOTIFY_CFLAGS = @LIBNOTIFY_CFLAGS@ LIBNOTIFY_LIBS = @LIBNOTIFY_LIBS@ LIBOBJS = @LIBOBJS@ LIBS = lib/libpsensor.a $(GTK_LIBS) $(PTHREAD_LIBS) $(SENSORS_LIBS) \ - $(am__append_3) $(am__append_5) $(am__append_8) \ + -lm $(am__append_3) $(am__append_5) $(am__append_8) \ $(am__append_11) $(am__append_13) $(am__append_15) \ $(am__append_18) $(am__append_20) LTLIBICONV = @LTLIBICONV@ diff --git a/src/cfg.c b/src/cfg.c index ff4fca6..ce82834 100644 --- a/src/cfg.c +++ b/src/cfg.c @@ -30,6 +30,7 @@ #define _(str) gettext(str) #include +#include #include #include @@ -411,12 +412,6 @@ struct config *config_load() if (c->graph_monitoring_duration < 1) c->graph_monitoring_duration = 10; - c->sensor_values_max_length - = (c->graph_monitoring_duration * 60) / c->sensor_update_interval; - - if (c->sensor_values_max_length < 3) - c->sensor_values_max_length = 3; - c->menu_bar_disabled = get_bool(KEY_INTERFACE_MENU_BAR_DISABLED); c->unity_launcher_count_disabled @@ -441,6 +436,8 @@ struct config *config_load() c->temperature_unit = get_int(KEY_INTERFACE_TEMPERATURE_UNIT); + c->sensor_values_max_length = compute_values_max_length(c); + return c; } diff --git a/src/graph.c b/src/graph.c index 749544f..a048732 100644 --- a/src/graph.c +++ b/src/graph.c @@ -24,6 +24,8 @@ #include #include +#include + #include #include #include @@ -35,26 +37,60 @@ bool is_smooth_curves_enabled; -static time_t get_graph_end_time_s() -{ - struct timeval tv; +struct graph_info { + /* Horizontal position of the central region (curves) */ + int g_xoff; + /* Vertical position of the central region (curves) */ + int g_yoff; - if (gettimeofday(&tv, NULL) == 0) - return tv.tv_sec; + /* Height of the drawing canvas */ + int height; - return 0; -} + /* Background color of the current desktop theme */ + GdkRGBA theme_bg_color; + + /* Foreground color of the current desktop theme */ + GdkRGBA theme_fg_color; +}; -static time_t get_graph_begin_time_s(struct config *cfg) + +/* Return the end time of the graph i.e. the more recent measure. If + * no measure are available, return 0. + */ +static time_t get_graph_end_time_s(struct psensor **sensors) { - int ct; + time_t ret, t; + struct psensor *s; + struct measure *measures; + int i; + + ret = 0; + while (*sensors) { + s = *sensors; + measures = s->measures; - ct = get_graph_end_time_s(); + for (i = s->values_max_length - 1; i >= 0; i--) { + if (measures[i].value != UNKNOWN_DBL_VALUE) { + t = measures[i].time.tv_sec; + + if (t > ret) + ret = t; + } + i--; + } + + sensors++; + } + + return ret; +} - if (!ct) +static time_t get_graph_begin_time_s(struct config *cfg, time_t etime) +{ + if (!etime) return 0; - return ct - cfg->graph_monitoring_duration * 60; + return etime - cfg->graph_monitoring_duration * 60; } static double @@ -80,6 +116,17 @@ static char *time_to_str(time_t s) return str; } +static void draw_left_region(cairo_t *cr, struct graph_info *info) +{ + cairo_set_source_rgb(cr, + info->theme_bg_color.red, + info->theme_bg_color.green, + info->theme_bg_color.blue); + + cairo_rectangle(cr, 0, 0, info->g_xoff, info->height); + cairo_fill(cr); +} + static void draw_graph_background(cairo_t *cr, int g_xoff, int g_yoff, @@ -111,8 +158,9 @@ draw_graph_background(cairo_t *cr, rgba.green, rgba.blue); - cairo_rectangle(cr, 0, 0, width, height); + cairo_rectangle(cr, g_xoff, 0, g_width, height); cairo_fill(cr); + if (config->alpha_channel_enabled) cairo_set_source_rgba(cr, bgcolor->red, @@ -311,8 +359,6 @@ static void draw_sensor_curve(struct psensor *s, continue; vdt = t - bt; - if (vdt < 0) - continue; x = ((double)vdt * g_width) / dt + g_xoff; @@ -366,7 +412,7 @@ graph_update(struct psensor **sensors, struct psensor **sensor_cur, **enabled_sensors; GtkAllocation galloc; GtkStyleContext *style_ctx; - GdkRGBA rgba; + struct graph_info info; if (!gtk_widget_is_drawable(w_graph)) return; @@ -386,8 +432,11 @@ graph_update(struct psensor **sensors, maxt, config->temperature_unit == CELSIUS); - str_btime = time_to_str(get_graph_begin_time_s(config)); - str_etime = time_to_str(get_graph_end_time_s()); + et = get_graph_end_time_s(enabled_sensors); + bt = get_graph_begin_time_s(config, et); + + str_btime = time_to_str(bt); + str_etime = time_to_str(et); gtk_widget_get_allocation(w_graph, &galloc); width = galloc.width; @@ -420,6 +469,19 @@ graph_update(struct psensor **sensors, else g_xoff = (2 * GRAPH_H_PADDING) + te_min.width; + info.g_xoff = g_xoff; + info.g_yoff = g_yoff; + info.height = height; + + style_ctx = gtk_widget_get_style_context(window); + gtk_style_context_get_background_color(style_ctx, + GTK_STATE_FLAG_NORMAL, + &info.theme_bg_color); + gtk_style_context_get_color(style_ctx, + GTK_STATE_FLAG_NORMAL, + &info.theme_fg_color); + + g_width = width - g_xoff - GRAPH_H_PADDING; draw_graph_background(cr, @@ -428,10 +490,11 @@ graph_update(struct psensor **sensors, w_graph, window); - /** Set the color for text drawing */ - style_ctx = gtk_widget_get_style_context(window); - gtk_style_context_get_color(style_ctx, GTK_STATE_FLAG_NORMAL, &rgba); - cairo_set_source_rgb(cr, rgba.red, rgba.green, rgba.blue); + /* Set the color for text drawing */ + cairo_set_source_rgb(cr, + info.theme_fg_color.red, + info.theme_fg_color.green, + info.theme_fg_color.blue); /* draw graph begin time */ cairo_move_to(cr, g_xoff, height - GRAPH_V_PADDING); @@ -445,25 +508,12 @@ graph_update(struct psensor **sensors, cairo_show_text(cr, str_etime); free(str_etime); - /* draw min and max temp */ - cairo_move_to(cr, GRAPH_H_PADDING, te_max.height + GRAPH_V_PADDING); - cairo_show_text(cr, strmax); - free(strmax); - - cairo_move_to(cr, - GRAPH_H_PADDING, height - (te_min.height / 2) - g_yoff); - cairo_show_text(cr, strmin); - free(strmin); - draw_background_lines(cr, fgcolor, g_width, g_height, g_xoff, g_yoff, mint, maxt); /* .. and finaly draws the temperature graphs */ - bt = get_graph_begin_time_s(config); - et = get_graph_end_time_s(); - if (bt && et) { sensor_cur = enabled_sensors; @@ -508,6 +558,23 @@ graph_update(struct psensor **sensors, g_height / 2); } + draw_left_region(cr, &info); + + /* draw min and max temp */ + cairo_set_source_rgb(cr, + info.theme_fg_color.red, + info.theme_fg_color.green, + info.theme_fg_color.blue); + + cairo_move_to(cr, GRAPH_H_PADDING, te_max.height + GRAPH_V_PADDING); + cairo_show_text(cr, strmax); + free(strmax); + + cairo_move_to(cr, + GRAPH_H_PADDING, height - (te_min.height / 2) - g_yoff); + cairo_show_text(cr, strmin); + free(strmin); + cr_pixmap = gdk_cairo_create(gtk_widget_get_window(w_graph)); if (cr_pixmap) { @@ -524,3 +591,15 @@ graph_update(struct psensor **sensors, cairo_surface_destroy(cst); cairo_destroy(cr); } + +int compute_values_max_length(struct config *c) +{ + int n, duration, interval; + + duration = c->graph_monitoring_duration * 60; + interval = c->sensor_update_interval; + + n = 3 + ceil((((double)duration) / interval) + 0.5) + 3; + + return n; +} diff --git a/src/graph.h b/src/graph.h index 713faf3..7dae2c1 100644 --- a/src/graph.h +++ b/src/graph.h @@ -31,4 +31,7 @@ void graph_update(struct psensor **sensors, struct config *config, GtkWidget *window); +/* Compute the number of measures which must be kept. */ +int compute_values_max_length(struct config *); + #endif diff --git a/src/ui_pref.c b/src/ui_pref.c index 46b9fc3..55e2bb2 100644 --- a/src/ui_pref.c +++ b/src/ui_pref.c @@ -21,6 +21,7 @@ #include #include +#include #include #include #include @@ -229,10 +230,6 @@ void ui_pref_dialog_run(struct ui_psensor *ui) = gtk_spin_button_get_value_as_int (w_monitoring_duration); - cfg->sensor_values_max_length - = (cfg->graph_monitoring_duration * 60) / - cfg->sensor_update_interval; - cfg->hide_on_startup = gtk_toggle_button_get_active(w_hide_on_startup); @@ -248,6 +245,8 @@ void ui_pref_dialog_run(struct ui_psensor *ui) cfg->temperature_unit = gtk_combo_box_get_active(GTK_COMBO_BOX(w_temp_unit)); + cfg->sensor_values_max_length = compute_values_max_length(cfg); + config_save(cfg); pxdg_set_autostart(gtk_toggle_button_get_active(w_autostart)); -- 2.7.4