diff options
Diffstat (limited to 'shell')
-rw-r--r-- | shell/callbacks.c | 112 | ||||
-rw-r--r-- | shell/loadgraph-uber.c | 127 | ||||
-rw-r--r-- | shell/loadgraph.c | 183 | ||||
-rw-r--r-- | shell/menu.c | 13 | ||||
-rw-r--r-- | shell/report.c | 117 | ||||
-rw-r--r-- | shell/shell.c | 314 | ||||
-rw-r--r-- | shell/syncmanager.c | 45 |
7 files changed, 586 insertions, 325 deletions
diff --git a/shell/callbacks.c b/shell/callbacks.c index d5ac34da..95a7bd61 100644 --- a/shell/callbacks.c +++ b/shell/callbacks.c @@ -37,42 +37,6 @@ void cb_sync_manager() sync_manager_show(shell->window); } -void cb_save_graphic() -{ - Shell *shell = shell_get_main_shell(); - GtkWidget *dialog; - gchar *filename; - - /* save the pixbuf to a png file */ - dialog = gtk_file_chooser_dialog_new(_("Save Image"), - NULL, - GTK_FILE_CHOOSER_ACTION_SAVE, - GTK_STOCK_CANCEL, - GTK_RESPONSE_CANCEL, - GTK_STOCK_SAVE, - GTK_RESPONSE_ACCEPT, NULL); - - filename = g_strconcat(shell->selected->name, ".png", NULL); - gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(dialog), filename); - g_free(filename); - - if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) { - filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); - gtk_widget_destroy(dialog); - - shell_status_update(_("Saving image...")); - - tree_view_save_image(filename); - - shell_status_update(_("Done.")); - g_free(filename); - - return; - } - - gtk_widget_destroy(dialog); -} - void cb_open_web_page() { open_url("http://www.hardinfo.org"); @@ -148,8 +112,14 @@ void cb_about_module(GtkAction * action) about = gtk_about_dialog_new(); + gtk_window_set_transient_for(GTK_WINDOW(about), GTK_WINDOW(shell->window)); + text = g_strdup_printf(_("%s Module"), sm->name); +#if GTK_CHECK_VERSION(2, 12, 0) + gtk_about_dialog_set_program_name(GTK_ABOUT_DIALOG(about), text); +#else gtk_about_dialog_set_name(GTK_ABOUT_DIALOG(about), text); +#endif g_free(text); gtk_about_dialog_set_version(GTK_ABOUT_DIALOG(about), @@ -181,41 +151,51 @@ void cb_about_module(GtkAction * action) void cb_about() { + Shell *shell = shell_get_main_shell(); GtkWidget *about; + gchar *copyright = NULL; const gchar *authors[] = { - _("Author:"), - "Leandro A. F. Pereira", - "", - _("Contributors:"), - "Agney Lopes Roth Ferraz", - "Andrey Esin", - "", - _("Based on work by:"), - _("MD5 implementation by Colin Plumb (see md5.c for details)"), - _("SHA1 implementation by Steve Reid (see sha1.c for details)"), - _("Blowfish implementation by Paul Kocher (see blowfich.c for details)"), - _("Raytracing benchmark by John Walker (see fbench.c for details)"), - _("FFT benchmark by Scott Robert Ladd (see fftbench.c for details)"), - _("Some code partly based on x86cpucaps by Osamu Kayasono"), - _("Vendor list based on GtkSysInfo by Pissens Sebastien"), - _("DMI support based on code by Stewart Adam"), - _("SCSI support based on code by Pascal F. Martin"), - NULL + _("Author:"), + "Leandro A. F. Pereira", + "", + _("Contributors:"), + "Agney Lopes Roth Ferraz", + "Andrey Esin", + "Burt P.", + "", + _("Based on work by:"), + _("MD5 implementation by Colin Plumb (see md5.c for details)"), + _("SHA1 implementation by Steve Reid (see sha1.c for details)"), + _("Blowfish implementation by Paul Kocher (see blowfich.c for details)"), + _("Raytracing benchmark by John Walker (see fbench.c for details)"), + _("FFT benchmark by Scott Robert Ladd (see fftbench.c for details)"), + _("Some code partly based on x86cpucaps by Osamu Kayasono"), + _("Vendor list based on GtkSysInfo by Pissens Sebastien"), + _("DMI support based on code by Stewart Adam"), + _("SCSI support based on code by Pascal F. Martin"), + NULL }; const gchar *artists[] = { - _("Jakub Szypulka"), - _("Tango Project"), - _("The GNOME Project"), - _("VMWare, Inc. (USB icon from VMWare Workstation 6)"), - NULL + "Jakub Szypulka", + _("Tango Project"), + _("The GNOME Project"), + _("VMWare, Inc. (USB icon from VMWare Workstation 6)"), + NULL }; about = gtk_about_dialog_new(); + gtk_window_set_transient_for(GTK_WINDOW(about), GTK_WINDOW(shell->window)); + +#if GTK_CHECK_VERSION(2, 12, 0) + gtk_about_dialog_set_program_name(GTK_ABOUT_DIALOG(about), "HardInfo"); +#else gtk_about_dialog_set_name(GTK_ABOUT_DIALOG(about), "HardInfo"); +#endif + + copyright = g_strdup_printf("Copyright \302\251 2003-%d Leandro A. F. Pereira", HARDINFO_COPYRIGHT_LATEST_YEAR); + gtk_about_dialog_set_version(GTK_ABOUT_DIALOG(about), VERSION); - gtk_about_dialog_set_copyright(GTK_ABOUT_DIALOG(about), - "Copyright \302\251 2003-2016 " - "Leandro A. F. Pereira"); + gtk_about_dialog_set_copyright(GTK_ABOUT_DIALOG(about), copyright); gtk_about_dialog_set_comments(GTK_ABOUT_DIALOG(about), _("System information and benchmark tool")); gtk_about_dialog_set_logo(GTK_ABOUT_DIALOG(about), @@ -232,15 +212,17 @@ void cb_about() "You should have received a copy of the GNU General Public License " "along with this program; if not, write to the Free Software " "Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA")); -#if GTK_CHECK_VERSION(2,8,0) gtk_about_dialog_set_wrap_license(GTK_ABOUT_DIALOG(about), TRUE); -#endif gtk_about_dialog_set_authors(GTK_ABOUT_DIALOG(about), authors); gtk_about_dialog_set_artists(GTK_ABOUT_DIALOG(about), artists); + gtk_about_dialog_set_translator_credits(GTK_ABOUT_DIALOG(about), + _("translator-credits")); gtk_dialog_run(GTK_DIALOG(about)); gtk_widget_destroy(about); + + g_free(copyright); } void cb_generate_report() @@ -260,6 +242,6 @@ void cb_quit(void) do { gtk_main_quit(); } while (gtk_main_level() > 1); - + exit(0); } diff --git a/shell/loadgraph-uber.c b/shell/loadgraph-uber.c new file mode 100644 index 00000000..61964b37 --- /dev/null +++ b/shell/loadgraph-uber.c @@ -0,0 +1,127 @@ +/* + * Christian Hergert's uber-graph (GPL3) + * wrapped in an interface compatible with + * Leandro A. F. Pereira's loadgraph (GPL2.1). + */ + +#include <string.h> +#include "loadgraph.h" +#include "uber.h" + +#define LG_MAX_LINES 9 + +static const gchar *default_colors[] = { "#73d216", + "#f57900", + /*colors from simple.c sample */ "#3465a4", + "#ef2929", + "#75507b", + "#ce5c00", + "#c17d11", + "#ce5c00", + "#729fcf", + NULL }; + +struct _LoadGraph { + GtkWidget *uber_widget; + gdouble cur_value[LG_MAX_LINES]; + gint height; +}; + +gdouble +_sample_func (UberLineGraph *graph, + guint line, + gpointer user_data) +{ + LoadGraph *lg = (LoadGraph *)user_data; + return lg->cur_value[line-1]; +} + +LoadGraph *load_graph_new(gint size) +{ + LoadGraph *lg; + GdkRGBA color; + int i = 0; + + lg = g_new0(LoadGraph, 1); + lg->uber_widget = uber_line_graph_new(); + lg->height = (size+1) * 2; /* idk */ + for (i = 0; i < LG_MAX_LINES; i++) { + lg->cur_value[i] = UBER_LINE_GRAPH_NO_VALUE; + //GtkWidget *label = uber_label_new(); + //uber_label_set_text(UBER_LABEL(label), "BLAH!"); + gdk_rgba_parse(&color, default_colors[i]); + uber_line_graph_add_line(UBER_LINE_GRAPH(lg->uber_widget), &color, NULL); /* UBER_LABEL(label) */ + } + uber_line_graph_set_autoscale(UBER_LINE_GRAPH(lg->uber_widget), TRUE); + uber_line_graph_set_data_func(UBER_LINE_GRAPH(lg->uber_widget), + (UberLineGraphFunc)_sample_func, (gpointer *)lg, NULL); + return lg; +} + +void load_graph_set_data_suffix(LoadGraph * lg, gchar * suffix) +{ + +} + +gchar *load_graph_get_data_suffix(LoadGraph * lg) +{ + return strdup(""); +} + +GtkWidget *load_graph_get_framed(LoadGraph * lg) +{ + if (lg != NULL) + return lg->uber_widget; + return NULL; +} + +void load_graph_clear(LoadGraph * lg) +{ + int i; + if (lg != NULL) { + for (i = 0; i < LG_MAX_LINES; i++) { + lg->cur_value[i] = UBER_LINE_GRAPH_NO_VALUE; + } + uber_graph_scale_changed(lg->uber_widget); + } +} + +void load_graph_set_color(LoadGraph * lg, LoadGraphColor color) +{ + +} + +void load_graph_destroy(LoadGraph * lg) +{ + if (lg != NULL) { + g_object_unref(lg->uber_widget); + g_free(lg); + } +} + +static gboolean _expose(GtkWidget * widget, GdkEventExpose * event, gpointer user_data) +{ + return TRUE; +} + +void load_graph_configure_expose(LoadGraph * lg) +{ + +} + +void load_graph_update_ex(LoadGraph *lg, guint line, gdouble value) +{ + if (lg != NULL && line < LG_MAX_LINES) + lg->cur_value[line] = value; +} + +void load_graph_update(LoadGraph * lg, gdouble value) +{ + load_graph_update_ex(lg, 0, value); +} + +gint load_graph_get_height(LoadGraph *lg) { + if (lg != NULL) + return lg->height; + return 0; +} diff --git a/shell/loadgraph.c b/shell/loadgraph.c index 8fbeef48..ceb91720 100644 --- a/shell/loadgraph.c +++ b/shell/loadgraph.c @@ -20,11 +20,31 @@ * You should have received a copy of the GNU Lesser General Public * License along with the Simple Load Graph; if not, write to the Free * Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - * 02111-1307 USA. + * 02111-1307 USA. */ #include "loadgraph.h" +struct _LoadGraph { + GdkPixmap *buf; + GdkGC *grid; + GdkGC *trace; + GdkGC *fill; + GtkWidget *area; + + gint *data; + gfloat scale; + + gint size; + gint width, height; + LoadGraphColor color; + + gint max_value, remax_count; + + PangoLayout *layout; + gchar *suffix; +}; + static void _draw(LoadGraph * lg); LoadGraph *load_graph_new(gint size) @@ -89,7 +109,7 @@ void load_graph_clear(LoadGraph * lg) gint i; for (i = 0; i < lg->size; i++) - lg->data[i] = 0; + lg->data[i] = 0; lg->scale = 1.0; lg->max_value = 1; @@ -119,14 +139,14 @@ void load_graph_destroy(LoadGraph * lg) } static gboolean _expose(GtkWidget * widget, GdkEventExpose * event, - gpointer user_data) + gpointer user_data) { LoadGraph *lg = (LoadGraph *) user_data; GdkDrawable *draw = GDK_DRAWABLE(lg->buf); gdk_draw_drawable(lg->area->window, - lg->area->style->black_gc, - draw, 0, 0, 0, 0, lg->width, lg->height); + lg->area->style->black_gc, + draw, 0, 0, 0, 0, lg->width, lg->height); return FALSE; } @@ -146,27 +166,17 @@ void load_graph_configure_expose(LoadGraph * lg) /* init graphic contexts */ gdk_gc_set_line_attributes(lg->grid, - 1, GDK_LINE_ON_OFF_DASH, - GDK_CAP_NOT_LAST, GDK_JOIN_ROUND); + 1, GDK_LINE_ON_OFF_DASH, + GDK_CAP_NOT_LAST, GDK_JOIN_ROUND); gdk_gc_set_dashes(lg->grid, 0, (gint8*)"\2\2", 2); - -#if 0 /* old-style grid */ - gdk_rgb_gc_set_foreground(lg->grid, 0x707070); -#endif gdk_gc_set_line_attributes(lg->trace, - 1, GDK_LINE_SOLID, - GDK_CAP_PROJECTING, GDK_JOIN_ROUND); - -#if 0 /* old-style fill */ - gdk_gc_set_line_attributes(lg->fill, - 1, GDK_LINE_SOLID, - GDK_CAP_BUTT, GDK_JOIN_BEVEL); -#endif + 1, GDK_LINE_SOLID, + GDK_CAP_PROJECTING, GDK_JOIN_ROUND); /* configures the expose event */ g_signal_connect(G_OBJECT(lg->area), "expose-event", - (GCallback) _expose, lg); + (GCallback) _expose, lg); } static void _draw_label_and_line(LoadGraph * lg, gint position, gint value) @@ -175,21 +185,21 @@ static void _draw_label_and_line(LoadGraph * lg, gint position, gint value) /* draw lines */ if (position > 0) - gdk_draw_line(GDK_DRAWABLE(lg->buf), lg->grid, 0, position, - lg->width, position); + gdk_draw_line(GDK_DRAWABLE(lg->buf), lg->grid, 0, position, + lg->width, position); else - position = -1 * position; + position = -1 * position; /* draw label */ tmp = - g_strdup_printf("<span size=\"x-small\">%d%s</span>", value, - lg->suffix); + g_strdup_printf("<span size=\"x-small\">%d%s</span>", value, + lg->suffix); pango_layout_set_markup(lg->layout, tmp, -1); pango_layout_set_width(lg->layout, - lg->area->allocation.width * PANGO_SCALE); + lg->area->allocation.width * PANGO_SCALE); gdk_draw_layout(GDK_DRAWABLE(lg->buf), lg->trace, 2, position, - lg->layout); + lg->layout); g_free(tmp); } @@ -201,15 +211,15 @@ static void _draw(LoadGraph * lg) /* clears the drawing area */ gdk_draw_rectangle(draw, lg->area->style->black_gc, - TRUE, 0, 0, lg->width, lg->height); + TRUE, 0, 0, lg->width, lg->height); /* the graph */ GdkPoint *points = g_new0(GdkPoint, lg->size + 1); for (i = 0; i < lg->size; i++) { - points[i].x = i * 4; - points[i].y = lg->height - lg->data[i] * lg->scale; + points[i].x = i * 4; + points[i].y = lg->height - lg->data[i] * lg->scale; } points[0].x = points[1].x = 0; @@ -223,8 +233,8 @@ static void _draw(LoadGraph * lg) /* vertical bars */ for (i = lg->width, d = 0; i > 1; i--, d++) - if ((d % 45) == 0 && d) - gdk_draw_line(draw, lg->grid, i, 0, i, lg->height); + if ((d % 45) == 0 && d) + gdk_draw_line(draw, lg->grid, i, 0, i, lg->height); /* horizontal bars and labels; 25%, 50% and 75% */ _draw_label_and_line(lg, -1, lg->max_value); @@ -232,41 +242,27 @@ static void _draw(LoadGraph * lg) _draw_label_and_line(lg, lg->height / 2, lg->max_value / 2); _draw_label_and_line(lg, 3 * (lg->height / 4), lg->max_value / 4); -#if 0 /* old-style drawing */ - for (i = 0; i < lg->size; i++) { - gint this = lg->height - lg->data[i] * lg->scale; - gint next = lg->height - lg->data[i + 1] * lg->scale; - gint i4 = i * 4; - - gdk_draw_line(draw, lg->fill, i4, this, i4, lg->height); - gdk_draw_line(draw, lg->fill, i4 + 2, this, i4 + 2, lg->height); - } - - for (i = 0; i < lg->size; i++) { - gint this = lg->height - lg->data[i] * lg->scale; - gint next = lg->height - lg->data[i + 1] * lg->scale; - gint i4 = i * 4; - - gdk_draw_line(draw, lg->trace, i4, this, i4 + 2, - (this + next) / 2); - gdk_draw_line(draw, lg->trace, i4 + 2, (this + next) / 2, - i4 + 4, next); - } -#endif - gtk_widget_queue_draw(lg->area); } -void load_graph_update(LoadGraph * lg, gint value) +void load_graph_update_ex(LoadGraph *lg, guint line, gdouble value) +{ + /* not implemented */ + if (line == 0) + load_graph_update(lg, value); +} + +void load_graph_update(LoadGraph * lg, gdouble v) { gint i; + gint value = (gint)v; if (value < 0) - return; + return; /* shift-right our data */ for (i = 0; i < lg->size - 1; i++) { - lg->data[i] = lg->data[i + 1]; + lg->data[i] = lg->data[i + 1]; } /* insert the updated value */ @@ -274,20 +270,20 @@ void load_graph_update(LoadGraph * lg, gint value) /* calculates the maximum value */ if (lg->remax_count++ > 20) { - /* only finds the maximum amongst the data every 20 times */ - lg->remax_count = 0; + /* only finds the maximum amongst the data every 20 times */ + lg->remax_count = 0; - gint max = lg->data[0]; - for (i = 1; i < lg->size; i++) { - if (lg->data[i] > max) - max = lg->data[i]; - } + gint max = lg->data[0]; + for (i = 1; i < lg->size; i++) { + if (lg->data[i] > max) + max = lg->data[i]; + } - lg->max_value = max; + lg->max_value = max; } else { - /* otherwise, select the maximum between the current maximum - and the supplied value */ - lg->max_value = MAX(value, lg->max_value); + /* otherwise, select the maximum between the current maximum + and the supplied value */ + lg->max_value = MAX(value, lg->max_value); } /* recalculates the scale; always use 90% of it */ @@ -297,53 +293,8 @@ void load_graph_update(LoadGraph * lg, gint value) _draw(lg); } -#ifdef LOADGRAPH_UNIT_TEST -gboolean lg_update(gpointer d) -{ - LoadGraph *lg = (LoadGraph *) d; - - static int i = 0; - static int j = 1; - - if (i > 150) { - j = -1; - } else if (i < 0) { - j = 1; - } - - i += j; - if (rand() % 10 > 8) - i *= 2; - if (rand() % 10 < 2) - i /= 2; - load_graph_update(lg, i + rand() % 50); - - return TRUE; -} - -int main(int argc, char **argv) -{ - - - LoadGraph *lg; - GtkWidget *window; - - gtk_init(&argc, &argv); - - window = gtk_window_new(GTK_WINDOW_TOPLEVEL); - gtk_widget_show(window); - - lg = load_graph_new(50); - gtk_container_add(GTK_CONTAINER(window), load_graph_get_framed(lg)); - gtk_container_set_border_width(GTK_CONTAINER(window), 20); - load_graph_configure_expose(lg); - - lg_update(lg); - - g_timeout_add(100, lg_update, lg); - - gtk_main(); - +gint load_graph_get_height(LoadGraph *lg) { + if (lg != NULL) + return lg->height; return 0; } -#endif diff --git a/shell/menu.c b/shell/menu.c index f5724d31..e966f485 100644 --- a/shell/menu.c +++ b/shell/menu.c @@ -53,17 +53,12 @@ static GtkActionEntry entries[] = { N_("_Open..."), NULL, NULL, G_CALLBACK(cb_sync_manager)}, - + {"CopyAction", GTK_STOCK_COPY, N_("_Copy to Clipboard"), "<control>C", N_("Copy to clipboard"), G_CALLBACK(cb_copy_to_clipboard)}, - {"SaveGraphAction", GTK_STOCK_SAVE_AS, - N_("_Save image as..."), "<control>S", - NULL, - G_CALLBACK(cb_save_graphic)}, - {"RefreshAction", GTK_STOCK_REFRESH, N_("_Refresh"), "F5", NULL, @@ -130,15 +125,15 @@ void menu_init(Shell * shell) /* Pack up our objects: * menu_box -> window * actions -> action_group - * action_group -> menu_manager */ - gtk_action_group_set_translation_domain( action_group, "hardinfo" );//gettext + * action_group -> menu_manager */ + gtk_action_group_set_translation_domain( action_group, "hardinfo" );//gettext gtk_action_group_add_actions(action_group, entries, G_N_ELEMENTS(entries), NULL); gtk_action_group_add_toggle_actions(action_group, toggle_entries, G_N_ELEMENTS(toggle_entries), NULL); gtk_ui_manager_insert_action_group(menu_manager, action_group, 0); - + /* Read in the UI from our XML file */ error = NULL; diff --git a/shell/report.c b/shell/report.c index 3b5d3bdb..398af323 100644 --- a/shell/report.c +++ b/shell/report.c @@ -67,7 +67,7 @@ void report_key_value(ReportContext * ctx, gchar * key, gchar * value) gint report_get_visible_columns(ReportContext *ctx) { gint columns; - + /* Column count starts at two, since we always have at least two columns visible. */ columns = 2; @@ -77,10 +77,10 @@ gint report_get_visible_columns(ReportContext *ctx) if (ctx->columns & REPORT_COL_EXTRA1) columns++; - + if (ctx->columns & REPORT_COL_EXTRA2) columns++; - + return columns; } @@ -88,7 +88,7 @@ void report_context_configure(ReportContext * ctx, GKeyFile * keyfile) { gchar **keys; const gchar *group = "$ShellParam$"; - + /* FIXME: sometime in the future we'll save images in the report. this flag will be set if we should support that. @@ -100,19 +100,19 @@ void report_context_configure(ReportContext * ctx, GKeyFile * keyfile) "ViewType", NULL) == SHELL_VIEW_PROGRESS); - + keys = g_key_file_get_keys(keyfile, group, NULL, NULL); if (keys) { gint i = 0; - + for (; keys[i]; i++) { gchar *key = keys[i]; - + if (g_str_equal(key, "ShowColumnHeaders")) { ctx->show_column_headers = g_key_file_get_boolean(keyfile, group, key, NULL); } else if (g_str_has_prefix(key, "ColumnTitle")) { gchar *value, *title = strchr(key, '$'); - + if (!title) { DEBUG("couldn't find column title"); break; @@ -135,20 +135,20 @@ void report_context_configure(ReportContext * ctx, GKeyFile * keyfile) } else if (g_str_equal(title, "Progress")) { ctx->columns |= REPORT_COL_PROGRESS; } - + g_hash_table_replace(ctx->column_titles, g_strdup(title), g_strdup(value)); } else if (g_str_equal(key, "ViewType")) { if (g_key_file_get_integer(keyfile, group, "ViewType", NULL) == SHELL_VIEW_PROGRESS) { ctx->columns &= ~REPORT_COL_VALUE; ctx->columns |= REPORT_COL_PROGRESS; - } + } } } - g_strfreev(keys); + g_strfreev(keys); } - + } void report_table(ReportContext * ctx, gchar * text) @@ -164,7 +164,7 @@ void report_table(ReportContext * ctx, gchar * text) /**/ g_key_file_load_from_data(key_file, text, strlen(text), 0, NULL); groups = g_key_file_get_groups(key_file, NULL); - + for (i = 0; groups[i]; i++) { if (groups[i][0] == '$') { report_context_configure(ctx, key_file); @@ -209,7 +209,7 @@ void report_table(ReportContext * ctx, gchar * text) value = g_strdup("..."); } } - + if (*key == '$') { report_key_value(ctx, strchr(key + 1, '$') + 1, value); @@ -301,7 +301,7 @@ report_html_key_value(ReportContext * ctx, gchar * key, gchar * value) gint columns = report_get_visible_columns(ctx); gchar **values; gint i; - + if (columns == 2) { ctx->output = h_strdup_cprintf("<tr><td class=\"field\">%s</td>" "<td class=\"value\">%s</td></tr>\n", @@ -309,9 +309,9 @@ report_html_key_value(ReportContext * ctx, gchar * key, gchar * value) key, value); } else { values = g_strsplit(value, "|", columns); - + ctx->output = h_strdup_cprintf("\n<tr>\n<td class=\"field\">%s</td>", ctx->output, key); - + for (i = columns - 2; i >= 0; i--) { ctx->output = h_strdup_cprintf("<td class=\"value\">%s</td>", ctx->output, @@ -319,7 +319,7 @@ report_html_key_value(ReportContext * ctx, gchar * key, gchar * value) } ctx->output = h_strdup_cprintf("</tr>\n", ctx->output); - + g_strfreev(values); } } @@ -372,7 +372,7 @@ report_text_key_value(ReportContext * ctx, gchar * key, gchar * value) gint columns = report_get_visible_columns(ctx); gchar **values; gint i; - + if (columns == 2) { if (strlen(value)) ctx->output = h_strdup_cprintf("%s\t\t: %s\n", ctx->output, key, value); @@ -380,9 +380,9 @@ report_text_key_value(ReportContext * ctx, gchar * key, gchar * value) ctx->output = h_strdup_cprintf("%s\n", ctx->output, key); } else { values = g_strsplit(value, "|", columns); - + ctx->output = h_strdup_cprintf("%s\t", ctx->output, key); - + for (i = columns - 2; i >= 0; i--) { ctx->output = h_strdup_cprintf("%s\t", ctx->output, @@ -390,7 +390,7 @@ report_text_key_value(ReportContext * ctx, gchar * key, gchar * value) } ctx->output = h_strdup_cprintf("\n", ctx->output); - + g_strfreev(values); } } @@ -490,6 +490,15 @@ static gchar *report_get_filename(void) GtkWidget *dialog; gchar *filename = NULL; +#if GTK_CHECK_VERSION(3, 0, 0) + dialog = gtk_file_chooser_dialog_new(_("Save File"), + NULL, + GTK_FILE_CHOOSER_ACTION_SAVE, + "_Cancel", + GTK_RESPONSE_CANCEL, + "_Save", + GTK_RESPONSE_ACCEPT, NULL); +#else dialog = gtk_file_chooser_dialog_new(_("Save File"), NULL, GTK_FILE_CHOOSER_ACTION_SAVE, @@ -497,6 +506,7 @@ static gchar *report_get_filename(void) GTK_RESPONSE_CANCEL, GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, NULL); +#endif gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(dialog), "hardinfo_report"); @@ -548,7 +558,7 @@ ReportContext *report_context_text_new() ctx->output = g_strdup(""); ctx->format = REPORT_FORMAT_TEXT; - + ctx->column_titles = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); ctx->first_table = TRUE; @@ -636,15 +646,21 @@ static gboolean report_generate(ReportDialog * rd) GTK_MESSAGE_QUESTION, GTK_BUTTONS_NONE, _("Open the report with your web browser?")); +#if GTK_CHECK_VERSION(3, 0, 0) + gtk_dialog_add_buttons(GTK_DIALOG(dialog), + "_No", GTK_RESPONSE_REJECT, + "_Open", GTK_RESPONSE_ACCEPT, NULL); +#else gtk_dialog_add_buttons(GTK_DIALOG(dialog), GTK_STOCK_NO, GTK_RESPONSE_REJECT, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL); +#endif if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) { gchar *temp; - + temp = g_strdup_printf("file://%s", file); open_url(temp); - + g_free(temp); } @@ -744,7 +760,7 @@ report_dialog_sel_toggle(GtkCellRendererToggle * cellrenderertoggle, if (active) { GtkTreeIter parent; - + if (gtk_tree_model_iter_parent(model, &parent, &iter)) { gtk_tree_store_set(GTK_TREE_STORE(model), &parent, TREE_COL_SEL, active, -1); @@ -786,12 +802,20 @@ static ReportDialog gtk_window_set_type_hint(GTK_WINDOW(dialog), GDK_WINDOW_TYPE_HINT_DIALOG); +#if GTK_CHECK_VERSION(2, 14, 0) + dialog1_vbox = gtk_dialog_get_content_area(GTK_DIALOG(dialog)); +#else dialog1_vbox = GTK_DIALOG(dialog)->vbox; +#endif gtk_box_set_spacing(GTK_BOX(dialog1_vbox), 5); gtk_container_set_border_width(GTK_CONTAINER(dialog1_vbox), 4); gtk_widget_show(dialog1_vbox); +#if GTK_CHECK_VERSION(3, 0, 0) + hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5); +#else hbox = gtk_hbox_new(FALSE, 5); +#endif gtk_box_pack_start(GTK_BOX(dialog1_vbox), hbox, FALSE, FALSE, 0); label = gtk_label_new(_("<big><b>Generate Report</b></big>\n" @@ -799,15 +823,23 @@ static ReportDialog "to view in your report:")); gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); gtk_label_set_use_markup(GTK_LABEL(label), TRUE); +#if GTK_CHECK_VERSION(3, 0, 0) + gtk_widget_set_valign(label, GTK_ALIGN_CENTER); +#else gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); +#endif gtk_box_pack_start(GTK_BOX(hbox), icon_cache_get_image("report-large.png"), FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, TRUE, 0); gtk_widget_show_all(hbox); - + +#if GTK_CHECK_VERSION(3, 0, 0) + hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5); +#else hbox = gtk_hbox_new(FALSE, 5); +#endif gtk_box_pack_start(GTK_BOX(dialog1_vbox), hbox, TRUE, TRUE, 0); gtk_widget_show(hbox); @@ -847,7 +879,11 @@ static ReportDialog gtk_tree_view_column_add_attribute(column, cr_text, "markup", TREE_COL_NAME); +#if GTK_CHECK_VERSION(3, 0, 0) + vbuttonbox3 = gtk_button_box_new(GTK_ORIENTATION_VERTICAL); +#else vbuttonbox3 = gtk_vbutton_box_new(); +#endif gtk_widget_show(vbuttonbox3); gtk_box_pack_start(GTK_BOX(hbox), vbuttonbox3, FALSE, TRUE, 0); gtk_box_set_spacing(GTK_BOX(vbuttonbox3), 5); @@ -857,33 +893,58 @@ static ReportDialog button3 = gtk_button_new_with_mnemonic(_("Select _None")); gtk_widget_show(button3); gtk_container_add(GTK_CONTAINER(vbuttonbox3), button3); +#if GTK_CHECK_VERSION(2, 18, 0) + gtk_widget_set_can_default(button3, TRUE); +#else GTK_WIDGET_SET_FLAGS(button3, GTK_CAN_DEFAULT); +#endif g_signal_connect(button3, "clicked", G_CALLBACK(report_dialog_sel_none), rd); button6 = gtk_button_new_with_mnemonic(_("Select _All")); gtk_widget_show(button6); gtk_container_add(GTK_CONTAINER(vbuttonbox3), button6); +#if GTK_CHECK_VERSION(2, 18, 0) + gtk_widget_set_can_default(button6, TRUE); +#else GTK_WIDGET_SET_FLAGS(button6, GTK_CAN_DEFAULT); +#endif g_signal_connect(button6, "clicked", G_CALLBACK(report_dialog_sel_all), rd); +#if GTK_CHECK_VERSION(2, 14, 0) +/* TODO:GTK3 + * [https://developer.gnome.org/gtk3/stable/GtkDialog.html#gtk-dialog-get-action-area] + * gtk_dialog_get_action_area has been deprecated since version 3.12 and should not be used in newly-written code. + * Direct access to the action area is discouraged; use gtk_dialog_add_button(), etc. + */ + dialog1_action_area = gtk_dialog_get_action_area(GTK_DIALOG(dialog)); +#else dialog1_action_area = GTK_DIALOG(dialog)->action_area; +#endif gtk_widget_show(dialog1_action_area); gtk_button_box_set_layout(GTK_BUTTON_BOX(dialog1_action_area), GTK_BUTTONBOX_END); - button8 = gtk_button_new_from_stock(GTK_STOCK_CANCEL); + button8 = gtk_button_new_with_mnemonic(_("_Cancel")); gtk_widget_show(button8); gtk_dialog_add_action_widget(GTK_DIALOG(dialog), button8, GTK_RESPONSE_CANCEL); +#if GTK_CHECK_VERSION(2, 18, 0) + gtk_widget_set_can_default(button8, TRUE); +#else GTK_WIDGET_SET_FLAGS(button8, GTK_CAN_DEFAULT); +#endif button7 = gtk_button_new_with_mnemonic(_("_Generate")); gtk_widget_show(button7); gtk_dialog_add_action_widget(GTK_DIALOG(dialog), button7, GTK_RESPONSE_ACCEPT); +#if GTK_CHECK_VERSION(2, 18, 0) + gtk_widget_set_can_default(button7, TRUE); +#else GTK_WIDGET_SET_FLAGS(button7, GTK_CAN_DEFAULT); +#endif rd->dialog = dialog; rd->btn_cancel = button8; diff --git a/shell/shell.c b/shell/shell.c index bf866e84..b81e77b6 100644 --- a/shell/shell.c +++ b/shell/shell.c @@ -284,9 +284,7 @@ void shell_view_set_enabled(gboolean setting) shell_action_set_enabled("CopyAction", setting); shell_action_set_enabled("ReportAction", setting); shell_action_set_enabled("SyncManagerAction", setting && sync_manager_count_entries() > 0); - shell_action_set_enabled("SaveGraphAction", - setting ? shell->view_type == - SHELL_VIEW_PROGRESS : FALSE); + } void shell_status_set_enabled(gboolean setting) @@ -358,14 +356,18 @@ static ShellNote *note_new(void) note->label = gtk_label_new(""); note->event_box = gtk_event_box_new(); button = gtk_button_new(); - + border_box = gtk_event_box_new(); gtk_container_set_border_width(GTK_CONTAINER(border_box), 1); gtk_container_add(GTK_CONTAINER(note->event_box), border_box); gtk_widget_show(border_box); - + +#if GTK_CHECK_VERSION(3, 0, 0) + /* TODO:GTK3 css-based style */ +#else gtk_widget_modify_bg(border_box, GTK_STATE_NORMAL, &info_default_fill_color); gtk_widget_modify_bg(note->event_box, GTK_STATE_NORMAL, &info_default_border_color); +#endif icon = icon_cache_get_image("close.png"); gtk_widget_show(icon); @@ -374,7 +376,11 @@ static ShellNote *note_new(void) g_signal_connect(G_OBJECT(button), "clicked", (GCallback) close_note, NULL); +#if GTK_CHECK_VERSION(3, 0, 0) + hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 3); +#else hbox = gtk_hbox_new(FALSE, 3); +#endif icon = icon_cache_get_image("dialog-information.png"); gtk_box_pack_start(GTK_BOX(hbox), icon, FALSE, FALSE, 0); @@ -395,7 +401,7 @@ void shell_set_title(Shell *shell, gchar *subtitle) tmp = g_strdup_printf(_("%s - System Information"), subtitle); gtk_window_set_title(GTK_WINDOW(shell->window), tmp); - + g_free(tmp); } else { gtk_window_set_title(GTK_WINDOW(shell->window), _("System Information")); @@ -415,14 +421,22 @@ static void create_window(void) gtk_window_set_default_size(GTK_WINDOW(shell->window), 800, 600); g_signal_connect(G_OBJECT(shell->window), "destroy", destroy_me, NULL); +#if GTK_CHECK_VERSION(3, 0, 0) + vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); +#else vbox = gtk_vbox_new(FALSE, 0); +#endif gtk_widget_show(vbox); gtk_container_add(GTK_CONTAINER(shell->window), vbox); shell->vbox = vbox; menu_init(shell); +#if GTK_CHECK_VERSION(3, 0, 0) + hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5); +#else hbox = gtk_hbox_new(FALSE, 5); +#endif gtk_widget_show(hbox); gtk_box_pack_end(GTK_BOX(vbox), hbox, FALSE, FALSE, 3); @@ -432,23 +446,39 @@ static void create_window(void) gtk_box_pack_end(GTK_BOX(hbox), shell->progress, FALSE, FALSE, 5); shell->status = gtk_label_new(""); +#if GTK_CHECK_VERSION(3, 0, 0) + gtk_widget_set_valign(GTK_MISC(shell->status), GTK_ALIGN_CENTER); +#else gtk_misc_set_alignment(GTK_MISC(shell->status), 0.0, 0.5); +#endif gtk_widget_show(shell->status); gtk_box_pack_start(GTK_BOX(hbox), shell->status, FALSE, FALSE, 5); +#if GTK_CHECK_VERSION(3, 0, 0) + shell->hpaned = gtk_paned_new(GTK_ORIENTATION_HORIZONTAL); +#else shell->hpaned = gtk_hpaned_new(); +#endif gtk_widget_show(shell->hpaned); gtk_box_pack_end(GTK_BOX(vbox), shell->hpaned, TRUE, TRUE, 0); gtk_paned_set_position(GTK_PANED(shell->hpaned), 210); +#if GTK_CHECK_VERSION(3, 0, 0) + vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5); +#else vbox = gtk_vbox_new(FALSE, 5); +#endif gtk_widget_show(vbox); gtk_paned_add2(GTK_PANED(shell->hpaned), vbox); shell->note = note_new(); gtk_box_pack_end(GTK_BOX(vbox), shell->note->event_box, FALSE, FALSE, 0); +#if GTK_CHECK_VERSION(3, 0, 0) + shell->vpaned = gtk_paned_new(GTK_ORIENTATION_VERTICAL); +#else shell->vpaned = gtk_vpaned_new(); +#endif gtk_box_pack_start(GTK_BOX(vbox), shell->vpaned, TRUE, TRUE, 0); gtk_widget_show(shell->vpaned); @@ -479,7 +509,7 @@ static void menu_item_set_icon_always_visible(Shell *shell, { GtkWidget *menuitem; gchar *path; - + path = g_strdup_printf("%s/%s", parent_path, item_id); menuitem = gtk_ui_manager_get_widget(shell->ui_manager, path); #if GTK_CHECK_VERSION(2, 18, 0) @@ -533,7 +563,7 @@ static void add_module_to_menu(gchar * name, GdkPixbuf * pixbuf) "/menubar/ViewMenu/LastSep", name, name, GTK_UI_MANAGER_MENU, TRUE); shell->merge_ids = g_slist_prepend(shell->merge_ids, GINT_TO_POINTER(merge_id)); - + merge_id = gtk_ui_manager_new_merge_id(shell->ui_manager); gtk_ui_manager_add_ui(shell->ui_manager, merge_id, @@ -579,7 +609,7 @@ add_module_entry_to_view_menu(gchar * module, gchar * name, shell->merge_ids = g_slist_prepend(shell->merge_ids, GINT_TO_POINTER(merge_id)); menu_item_set_icon_always_visible(shell, path, name); - + g_free(path); } @@ -589,7 +619,7 @@ void shell_add_modules_to_gui(gpointer _shell_module, gpointer _shell_tree) ShellTree *shelltree = (ShellTree *) _shell_tree; GtkTreeStore *store = GTK_TREE_STORE(shelltree->model); GtkTreeIter parent; - + if (!module) { return; } @@ -645,19 +675,28 @@ static void __tree_iter_destroy(gpointer data) ShellSummary *summary_new(void) { ShellSummary *summary; - + summary = g_new0(ShellSummary, 1); summary->scroll = gtk_scrolled_window_new(NULL, NULL); +#if GTK_CHECK_VERSION(3, 0, 0) + summary->view = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5); +#else summary->view = gtk_vbox_new(FALSE, 5); +#endif summary->items = NULL; gtk_container_set_border_width(GTK_CONTAINER(summary->view), 6); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(summary->scroll), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); +#if GTK_CHECK_VERSION(3, 0, 0) + gtk_container_add(GTK_SCROLLED_WINDOW(summary->scroll), + summary->view); +#else gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(summary->scroll), summary->view); - gtk_widget_show_all(summary->scroll); +#endif + gtk_widget_show_all(summary->scroll); return summary; } @@ -684,7 +723,7 @@ void shell_init(GSList * modules) shell->moreinfo = info_tree_new(TRUE); shell->loadgraph = load_graph_new(75); shell->summary = summary_new(); - + update_tbl = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, __tree_iter_destroy); @@ -700,7 +739,7 @@ void shell_init(GSList * modules) NULL); gtk_notebook_append_page(GTK_NOTEBOOK(shell->notebook), shell->summary->scroll, NULL); - + gtk_notebook_set_show_tabs(GTK_NOTEBOOK(shell->notebook), FALSE); gtk_notebook_set_show_border(GTK_NOTEBOOK(shell->notebook), FALSE); @@ -723,10 +762,9 @@ void shell_init(GSList * modules) shell_action_set_enabled("RefreshAction", FALSE); shell_action_set_enabled("CopyAction", FALSE); - shell_action_set_enabled("SaveGraphAction", FALSE); shell_action_set_active("SidePaneAction", TRUE); shell_action_set_active("ToolbarAction", TRUE); - + #ifndef HAS_LIBSOUP shell_action_set_enabled("SyncManagerAction", FALSE); #else @@ -738,21 +776,21 @@ static gboolean update_field(gpointer data) { ShellFieldUpdate *fu; GtkTreeIter *iter; - + fu = (ShellFieldUpdate *) data; g_return_val_if_fail(fu != NULL, FALSE); - + DEBUG("update_field [%s]", fu->field_name); - + iter = g_hash_table_lookup(update_tbl, fu->field_name); if (!iter) { return FALSE; } - + /* if the entry is still selected, update it */ if (iter && fu->entry->selected && fu->entry->fieldfunc) { GtkTreeStore *store = GTK_TREE_STORE(shell->info->model); - gchar *value = fu->entry->fieldfunc(_(fu->field_name)); + gchar *value = fu->entry->fieldfunc(fu->field_name); /* * this function is also used to feed the load graph when ViewType @@ -761,7 +799,7 @@ static gboolean update_field(gpointer data) if (shell->view_type == SHELL_VIEW_LOAD_GRAPH && gtk_tree_selection_iter_is_selected(shell->info->selection, iter)) { - load_graph_update(shell->loadgraph, atoi(value)); + load_graph_update(shell->loadgraph, atof(value)); } gtk_tree_store_set(store, iter, INFO_TREE_COL_VALUE, value, -1); @@ -802,20 +840,31 @@ static gboolean update_field(gpointer data) static gboolean reload_section(gpointer data) { ShellModuleEntry *entry = (ShellModuleEntry *) data; +#if GTK_CHECK_VERSION(2, 14, 0) + GdkWindow *gdk_window = gtk_widget_get_window(GTK_WIDGET(shell->window)); +#endif /* if the entry is still selected, update it */ if (entry->selected) { GtkTreePath *path = NULL; GtkTreeIter iter; double pos_info_scroll, pos_more_scroll; - + /* save current position */ +#if GTK_CHECK_VERSION(3, 0, 0) + /* TODO:GTK3 */ +#else pos_info_scroll = RANGE_GET_VALUE(info, vscrollbar); pos_more_scroll = RANGE_GET_VALUE(moreinfo, vscrollbar); - +#endif + /* avoid drawing the window while we reload */ +#if GTK_CHECK_VERSION(2, 14, 0) + gdk_window_freeze_updates(gdk_window); +#else gdk_window_freeze_updates(shell->window->window); - +#endif + /* gets the current selected path */ if (gtk_tree_selection_get_selected (shell->info->selection, &shell->info->model, &iter)) { @@ -835,12 +884,20 @@ static gboolean reload_section(gpointer data) gtk_tree_path_free(path); } else { /* restore position */ +#if GTK_CHECK_VERSION(3, 0, 0) + /* TODO:GTK3 */ +#else RANGE_SET_VALUE(info, vscrollbar, pos_info_scroll); RANGE_SET_VALUE(moreinfo, vscrollbar, pos_more_scroll); +#endif } - + /* make the window drawable again */ +#if GTK_CHECK_VERSION(2, 14, 0) + gdk_window_thaw_updates(gdk_window); +#else gdk_window_thaw_updates(shell->window->window); +#endif } /* destroy the timeout: it'll be set up again */ @@ -892,15 +949,25 @@ info_tree_compare_val_func(GtkTreeModel * model, static void set_view_type(ShellViewType viewtype, gboolean reload) { +#if GTK_CHECK_VERSION(2, 18, 0) + GtkAllocation* alloc; +#endif + if (viewtype < SHELL_VIEW_NORMAL || viewtype >= SHELL_VIEW_N_VIEWS) viewtype = SHELL_VIEW_NORMAL; shell->normalize_percentage = TRUE; shell->view_type = viewtype; + shell->_order_type = SHELL_ORDER_DESCENDING; + + /* use an unsorted tree model */ + GtkTreeSortable *sortable = GTK_TREE_SORTABLE(shell->info->model); - /* reset to the default model */ + gtk_tree_sortable_set_sort_column_id(sortable, + GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID, + GTK_SORT_ASCENDING); gtk_tree_view_set_model(GTK_TREE_VIEW(shell->info->view), - shell->info->model); + GTK_TREE_MODEL(sortable)); /* reset to the default view columns */ if (!reload) { @@ -909,13 +976,10 @@ static void set_view_type(ShellViewType viewtype, gboolean reload) gtk_tree_view_column_set_visible(shell->info->col_progress, FALSE); gtk_tree_view_column_set_visible(shell->info->col_value, TRUE); } - + /* turn off the rules hint */ gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(shell->info->view), FALSE); - /* turn off the save graphic action */ - shell_action_set_enabled("SaveGraphAction", FALSE); - close_note(NULL, NULL); switch (viewtype) { @@ -923,7 +987,7 @@ static void set_view_type(ShellViewType viewtype, gboolean reload) case SHELL_VIEW_NORMAL: gtk_widget_show(shell->info->scroll); gtk_widget_hide(shell->notebook); - + if (!reload) { gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(shell->info->view), FALSE); } @@ -931,42 +995,57 @@ static void set_view_type(ShellViewType viewtype, gboolean reload) case SHELL_VIEW_DUAL: gtk_widget_show(shell->info->scroll); gtk_widget_show(shell->moreinfo->scroll); - gtk_notebook_set_page(GTK_NOTEBOOK(shell->notebook), 0); - gtk_widget_show(shell->notebook); + gtk_notebook_set_current_page(GTK_NOTEBOOK(shell->notebook), 0); + gtk_widget_show(shell->notebook); - gtk_paned_set_position(GTK_PANED(shell->vpaned), - shell->hpaned->allocation.height / 2); - break; +#if GTK_CHECK_VERSION(2, 18, 0) + alloc = g_new(GtkAllocation, 1); + gtk_widget_get_allocation(shell->hpaned, alloc); + gtk_paned_set_position(GTK_PANED(shell->vpaned), alloc->height / 2); + g_free(alloc); +#else + gtk_paned_set_position(GTK_PANED(shell->vpaned), + shell->hpaned->allocation.height / 2); +#endif + break; case SHELL_VIEW_LOAD_GRAPH: gtk_widget_show(shell->info->scroll); - gtk_notebook_set_page(GTK_NOTEBOOK(shell->notebook), 1); - gtk_widget_show(shell->notebook); - load_graph_clear(shell->loadgraph); + gtk_notebook_set_current_page(GTK_NOTEBOOK(shell->notebook), 1); + gtk_widget_show(shell->notebook); + load_graph_clear(shell->loadgraph); - gtk_paned_set_position(GTK_PANED(shell->vpaned), +#if GTK_CHECK_VERSION(2, 18, 0) + alloc = g_new(GtkAllocation, 1); + gtk_widget_get_allocation(shell->hpaned, alloc); + gtk_paned_set_position(GTK_PANED(shell->vpaned), + alloc->height - load_graph_get_height(shell->loadgraph) - 16); + g_free(alloc); +#else + gtk_paned_set_position(GTK_PANED(shell->vpaned), shell->hpaned->allocation.height - - shell->loadgraph->height - 16); + load_graph_get_height(shell->loadgraph) - 16); +#endif + break; case SHELL_VIEW_PROGRESS_DUAL: gtk_widget_show(shell->notebook); gtk_widget_show(shell->moreinfo->scroll); - gtk_notebook_set_page(GTK_NOTEBOOK(shell->notebook), 0); + gtk_notebook_set_current_page(GTK_NOTEBOOK(shell->notebook), 0); /* fallthrough */ case SHELL_VIEW_PROGRESS: gtk_widget_show(shell->info->scroll); - shell_action_set_enabled("SaveGraphAction", TRUE); - + if (!reload) { gtk_tree_view_column_set_visible(shell->info->col_progress, TRUE); gtk_tree_view_column_set_visible(shell->info->col_value, FALSE); } - + if (viewtype == SHELL_VIEW_PROGRESS) gtk_widget_hide(shell->notebook); break; case SHELL_VIEW_SUMMARY: - gtk_notebook_set_page(GTK_NOTEBOOK(shell->notebook), 2); + gtk_notebook_set_current_page(GTK_NOTEBOOK(shell->notebook), 2); gtk_widget_show(shell->notebook); gtk_widget_hide(shell->info->scroll); @@ -1104,11 +1183,11 @@ group_handle_normal(GKeyFile * key_file, ShellModuleEntry * entry, gchar *value; GtkTreeIter child; - value = g_key_file_get_value(key_file, group, key, NULL); - if (entry->fieldfunc && value && g_str_equal(value, "...")) { - g_free(value); - value = entry->fieldfunc(_(key)); - } + value = g_key_file_get_value(key_file, group, key, NULL); + if (entry->fieldfunc && value && g_str_equal(value, "...")) { + g_free(value); + value = entry->fieldfunc(key); + } if ((key && value) && g_utf8_validate(key, -1, NULL) && g_utf8_validate(value, -1, NULL)) { if (ngroups == 1) { @@ -1116,7 +1195,7 @@ group_handle_normal(GKeyFile * key_file, ShellModuleEntry * entry, } else { gtk_tree_store_append(store, &child, &parent); } - + /* FIXME: use g_key_file_get_string_list? */ if (g_utf8_strchr(value, -1, '|')) { gchar **columns = g_strsplit(value, "|", 0); @@ -1284,7 +1363,7 @@ void shell_clear_field_updates(void) { if (update_sfusrc) { GSList *sfusrc; - + for (sfusrc = update_sfusrc; sfusrc; sfusrc = sfusrc->next) { ShellFieldUpdateSource *src = (ShellFieldUpdateSource *) sfusrc->data; @@ -1299,6 +1378,17 @@ void shell_clear_field_updates(void) } } +static gboolean +select_first_item(gpointer data) +{ + GtkTreeIter first; + + if (gtk_tree_model_get_iter_first(shell->info->model, &first)) + gtk_tree_selection_select_iter(shell->info->selection, &first); + + return FALSE; +} + static void module_selected_show_info(ShellModuleEntry * entry, gboolean reload) { @@ -1308,12 +1398,19 @@ module_selected_show_info(ShellModuleEntry * entry, gboolean reload) gboolean has_shell_param = FALSE; gint i; gsize ngroups; +#if GTK_CHECK_VERSION(2, 14, 0) + GdkWindow *gdk_window = gtk_widget_get_window(GTK_WIDGET(shell->info->view)); +#endif module_entry_scan(entry); key_data = module_entry_function(entry); /* */ +#if GTK_CHECK_VERSION(2, 14, 0) + gdk_window_freeze_updates(gdk_window); +#else gdk_window_freeze_updates(shell->info->view->window); +#endif g_object_ref(shell->info->model); gtk_tree_view_set_model(GTK_TREE_VIEW(shell->info->view), NULL); @@ -1325,7 +1422,7 @@ module_selected_show_info(ShellModuleEntry * entry, gboolean reload) /* recreate the iter hash table */ h_hash_table_remove_all(update_tbl); } - + shell_clear_field_updates(); store = GTK_TREE_STORE(shell->info->model); @@ -1353,18 +1450,22 @@ module_selected_show_info(ShellModuleEntry * entry, gboolean reload) g_strfreev(keys); } - + /* */ if (!has_shell_param) { gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(shell->info->view), FALSE); } - + /* */ g_object_unref(shell->info->model); gtk_tree_view_set_model(GTK_TREE_VIEW(shell->info->view), shell->info->model); gtk_tree_view_expand_all(GTK_TREE_VIEW(shell->info->view)); +#if GTK_CHECK_VERSION(2, 14, 0) + gdk_window_thaw_updates(gdk_window); +#else gdk_window_thaw_updates(shell->info->view->window); +#endif shell_set_note_from_entry(entry); if (shell->view_type == SHELL_VIEW_PROGRESS || shell->view_type == SHELL_VIEW_PROGRESS_DUAL) { @@ -1384,6 +1485,15 @@ module_selected_show_info(ShellModuleEntry * entry, gboolean reload) g_strfreev(groups); g_key_file_free(key_file); g_free(key_data); + + if (!reload) { + switch (shell->view_type) { + case SHELL_VIEW_DUAL: + case SHELL_VIEW_LOAD_GRAPH: + case SHELL_VIEW_PROGRESS_DUAL: + g_idle_add(select_first_item, NULL); + } + } } static void info_selected_show_extra(gchar * data) @@ -1426,7 +1536,7 @@ static gchar *shell_summary_clear_value(gchar *value) { GKeyFile *keyfile; gchar *return_value; - + keyfile = g_key_file_new(); if (!value) return_value = g_strdup(""); else @@ -1434,18 +1544,18 @@ static gchar *shell_summary_clear_value(gchar *value) strlen(value), 0, NULL)) { gchar **groups; gint group; - + return_value = g_strdup(""); - + groups = g_key_file_get_groups(keyfile, NULL); for (group = 0; groups[group]; group++) { gchar **keys; gint key; - + keys = g_key_file_get_keys(keyfile, groups[group], NULL, NULL); for (key = 0; keys[key]; key++) { gchar *temp = keys[key]; - + if (*temp == '$') { temp++; while (*temp && *temp != '$') @@ -1458,17 +1568,17 @@ static gchar *shell_summary_clear_value(gchar *value) keys[key], NULL); } } - + g_strfreev(keys); } - + g_strfreev(groups); } else { return_value = g_strdup(value); } - + g_key_file_free(keyfile); - + return g_strstrip(return_value); } @@ -1484,25 +1594,30 @@ static void shell_summary_add_item(ShellSummary *summary, GtkWidget *content; GtkWidget *alignment; gchar *temp; - + temp = shell_summary_clear_value(value); - + /* creates the frame */ frame = gtk_frame_new(NULL); gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_NONE); +#if GTK_CHECK_VERSION(3, 0, 0) + frame_label_box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5); +#else frame_label_box = gtk_hbox_new(FALSE, 5); +#endif frame_image = icon_cache_get_image(icon); frame_label = gtk_label_new(name); gtk_label_set_use_markup(GTK_LABEL(frame_label), TRUE); gtk_box_pack_start(GTK_BOX(frame_label_box), frame_image, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(frame_label_box), frame_label, FALSE, FALSE, 0); + /* TODO:GTK3 gtk_alignment_new(), etc is deprecated from 3.14 */ alignment = gtk_alignment_new(0.5, 0.5, 1, 1); + gtk_alignment_set_padding(GTK_ALIGNMENT(alignment), 0, 0, 48, 0); gtk_widget_show(alignment); gtk_container_add(GTK_CONTAINER(frame), alignment); - gtk_alignment_set_padding(GTK_ALIGNMENT(alignment), 0, 0, 48, 0); content = gtk_label_new(temp); gtk_misc_set_alignment(GTK_MISC(content), 0.0, 0.5); @@ -1510,29 +1625,29 @@ static void shell_summary_add_item(ShellSummary *summary, gtk_widget_show_all(frame); gtk_widget_show_all(frame_label_box); - + gtk_frame_set_label_widget(GTK_FRAME(frame), frame_label_box); - + /* pack the item on the summary screen */ gtk_box_pack_start(GTK_BOX(shell->summary->view), frame, FALSE, FALSE, 4); /* add the item to the list of summary items */ summary->items = g_slist_prepend(summary->items, frame); - + g_free(temp); } static void shell_summary_clear(ShellSummary *summary) { GSList *item; - + for (item = summary->items; item; item = item->next) { gtk_widget_destroy(GTK_WIDGET(item->data)); } - + g_slist_free(summary->items); summary->items = NULL; - + if (summary->header) gtk_widget_destroy(summary->header); summary->header = NULL; } @@ -1541,20 +1656,20 @@ static void shell_summary_create_header(ShellSummary *summary, { GtkWidget *header, *label; gchar *temp; - + temp = g_strdup_printf(_("<b>%s \342\206\222 Summary</b>"), title); - + header = gtk_menu_item_new_with_label(temp); gtk_menu_item_select(GTK_MENU_ITEM(header)); gtk_widget_show(header); - + label = gtk_bin_get_child(GTK_BIN(header)); gtk_label_set_use_markup(GTK_LABEL(label), TRUE); - + gtk_box_pack_start(GTK_BOX(shell->summary->view), header, FALSE, FALSE, 4); - + summary->header = header; - + g_free(temp); } @@ -1566,20 +1681,20 @@ static void shell_show_summary(void) set_view_type(SHELL_VIEW_SUMMARY, FALSE); shell_summary_clear(shell->summary); shell_summary_create_header(shell->summary, shell->selected_module->name); - + keyfile = g_key_file_new(); summary = shell->selected_module->summaryfunc(); - + if (g_key_file_load_from_data(keyfile, summary, strlen(summary), 0, NULL)) { gchar **groups; gint group; - + groups = g_key_file_get_groups(keyfile, NULL); - + for (group = 0; groups[group]; group++) { gchar *icon, *method, *method_result; - + shell_status_pulse(); icon = g_key_file_get_string(keyfile, groups[group], "Icon", NULL); @@ -1589,25 +1704,25 @@ static void shell_show_summary(void) } else { method_result = g_strdup("N/A"); } - + shell_summary_add_item(shell->summary, icon, groups[group], method_result); shell_status_pulse(); - + g_free(icon); g_free(method); g_free(method_result); } - + g_strfreev(groups); } else { DEBUG("error while parsing summary"); set_view_type(SHELL_VIEW_NORMAL, FALSE); - } - + } + g_free(summary); g_key_file_free(keyfile); - + shell_view_set_enabled(TRUE); } @@ -1619,6 +1734,7 @@ static void module_selected(gpointer data) ShellModuleEntry *entry; static ShellModuleEntry *current = NULL; static gboolean updating = FALSE; + GtkScrollbar *hscrollbar, *vscrollbar; /* Gets the currently selected item on the left-side TreeView; if there is no selection, silently return */ @@ -1626,7 +1742,7 @@ static void module_selected(gpointer data) return; } - /* Mark the currently selected module as "unselected"; this is used to kill the + /* Mark the currently selected module as "unselected"; this is used to kill the update timeout. */ if (current) { current->selected = FALSE; @@ -1641,7 +1757,7 @@ static void module_selected(gpointer data) if (!gtk_tree_model_iter_parent(model, &parent, &iter)) { memcpy(&parent, &iter, sizeof(iter)); } - + gtk_tree_model_get(model, &parent, TREE_COL_MODULE, &shell->selected_module, -1); /* Get the current selection and shows its related info */ @@ -1655,15 +1771,19 @@ static void module_selected(gpointer data) entry->selected = TRUE; shell->selected = entry; module_selected_show_info(entry, FALSE); - + info_selected_show_extra(NULL); /* clears the more info store */ gtk_tree_view_columns_autosize(GTK_TREE_VIEW(shell->info->view)); /* urgh. why don't GTK do this when the model is cleared? */ +#if GTK_CHECK_VERSION(3, 0, 0) + /* TODO:GTK3 */ +#else RANGE_SET_VALUE(info, vscrollbar, 0.0); RANGE_SET_VALUE(info, hscrollbar, 0.0); RANGE_SET_VALUE(moreinfo, vscrollbar, 0.0); RANGE_SET_VALUE(moreinfo, hscrollbar, 0.0); +#endif title = g_strdup_printf("%s - %s", shell->selected_module->name, entry->name); shell_set_title(shell, title); @@ -1700,7 +1820,7 @@ static void info_selected(GtkTreeSelection * ts, gpointer data) if (!gtk_tree_selection_get_selected(ts, &model, &parent)) return; - + if (shell->view_type == SHELL_VIEW_NORMAL || shell->view_type == SHELL_VIEW_PROGRESS) { gtk_tree_selection_unselect_all(ts); diff --git a/shell/syncmanager.c b/shell/syncmanager.c index 0b95e720..db94d474 100644 --- a/shell/syncmanager.c +++ b/shell/syncmanager.c @@ -117,7 +117,7 @@ void sync_manager_clear_entries(void) { #ifdef HAS_LIBSOUP DEBUG("clearing syncmanager entries"); - + g_slist_free(entries); entries = NULL; #else @@ -470,7 +470,7 @@ static void sync_dialog_netarea_start_actions(SyncDialog * sd, gtk_label_set_use_markup(GTK_LABEL(labels[i]), TRUE); gtk_label_set_use_markup(GTK_LABEL(status_labels[i]), TRUE); - + gtk_misc_set_alignment(GTK_MISC(labels[i]), 0.0, 0.5); gtk_misc_set_alignment(GTK_MISC(status_labels[i]), 1.0, 0.5); @@ -489,8 +489,8 @@ static void sync_dialog_netarea_start_actions(SyncDialog * sd, if (sd->flag_cancel) { markup = - g_strdup_printf(_("<s>%s</s> <i>(canceled)</i>"), - sna[i].name); + g_strdup_printf("<s>%s</s> <i>%s</i>", + sna[i].name, _("(canceled)")); gtk_label_set_markup(GTK_LABEL(labels[i]), markup); g_free(markup); @@ -506,8 +506,8 @@ static void sync_dialog_netarea_start_actions(SyncDialog * sd, if (sna[i].do_action && !sna[i].do_action(sd, &sna[i])) { markup = - g_strdup_printf(_("<b><s>%s</s></b> <i>(failed)</i>"), - sna[i].name); + g_strdup_printf("<b><s>%s</s></b> <i>%s</i>", + sna[i].name, _("(failed)")); gtk_label_set_markup(GTK_LABEL(labels[i]), markup); g_free(markup); @@ -667,18 +667,29 @@ static SyncDialog *sync_dialog_new(GtkWidget *parent) gtk_container_set_border_width(GTK_CONTAINER(dialog), 5); +#if GTK_CHECK_VERSION(2, 14, 0) + dialog1_vbox = gtk_dialog_get_content_area(GTK_DIALOG(dialog)); +#else dialog1_vbox = GTK_DIALOG(dialog)->vbox; +#endif gtk_box_set_spacing(GTK_BOX(dialog1_vbox), 5); gtk_container_set_border_width(GTK_CONTAINER(dialog1_vbox), 4); gtk_widget_show(dialog1_vbox); - +#if GTK_CHECK_VERSION(3, 0, 0) + hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5); +#else hbox = gtk_hbox_new(FALSE, 5); +#endif gtk_box_pack_start(GTK_BOX(dialog1_vbox), hbox, FALSE, FALSE, 0); label = gtk_label_new(LABEL_SYNC_DEFAULT); gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); gtk_label_set_use_markup(GTK_LABEL(label), TRUE); +#if GTK_CHECK_VERSION(3, 0, 0) + gtk_widget_set_valign(label, GTK_ALIGN_CENTER); +#else gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); +#endif gtk_box_pack_start(GTK_BOX(hbox), icon_cache_get_image("syncmanager.png"), @@ -725,29 +736,43 @@ static SyncDialog *sync_dialog_new(GtkWidget *parent) populate_store(store); +#if GTK_CHECK_VERSION(2, 14, 0) + dialog1_action_area = gtk_dialog_get_action_area(GTK_DIALOG(dialog)); +#else dialog1_action_area = GTK_DIALOG(dialog)->action_area; +#endif gtk_widget_show(dialog1_action_area); gtk_button_box_set_layout(GTK_BUTTON_BOX(dialog1_action_area), GTK_BUTTONBOX_END); - button8 = gtk_button_new_from_stock(GTK_STOCK_CANCEL); + button8 = gtk_button_new_with_mnemonic(_("_Cancel")); gtk_widget_show(button8); gtk_dialog_add_action_widget(GTK_DIALOG(dialog), button8, GTK_RESPONSE_CANCEL); +#if GTK_CHECK_VERSION(2, 18, 0) + gtk_widget_set_can_default(button8, TRUE); +#else GTK_WIDGET_SET_FLAGS(button8, GTK_CAN_DEFAULT); - +#endif button7 = gtk_button_new_with_mnemonic(_("_Synchronize")); gtk_widget_show(button7); gtk_dialog_add_action_widget(GTK_DIALOG(dialog), button7, GTK_RESPONSE_ACCEPT); +#if GTK_CHECK_VERSION(2, 18, 0) + gtk_widget_set_can_default(button7, TRUE); +#else GTK_WIDGET_SET_FLAGS(button7, GTK_CAN_DEFAULT); - +#endif button6 = gtk_button_new_from_stock(GTK_STOCK_CLOSE); g_signal_connect(G_OBJECT(button6), "clicked", (GCallback) close_clicked, NULL); gtk_dialog_add_action_widget(GTK_DIALOG(dialog), button6, GTK_RESPONSE_ACCEPT); +#if GTK_CHECK_VERSION(2, 18, 0) + gtk_widget_set_can_default(button6, TRUE); +#else GTK_WIDGET_SET_FLAGS(button6, GTK_CAN_DEFAULT); +#endif sd->dialog = dialog; sd->button_sync = button7; |