diff options
Diffstat (limited to 'hardinfo2')
-rw-r--r-- | hardinfo2/callbacks.c | 34 | ||||
-rw-r--r-- | hardinfo2/hardinfo.h | 12 | ||||
-rw-r--r-- | hardinfo2/report.c | 39 | ||||
-rw-r--r-- | hardinfo2/shell.c | 12 | ||||
-rw-r--r-- | hardinfo2/shell.h | 1 | ||||
-rw-r--r-- | hardinfo2/util.c | 64 |
6 files changed, 121 insertions, 41 deletions
diff --git a/hardinfo2/callbacks.c b/hardinfo2/callbacks.c index c56088f4..957f9cc0 100644 --- a/hardinfo2/callbacks.c +++ b/hardinfo2/callbacks.c @@ -35,20 +35,23 @@ void cb_refresh() void cb_copy_to_clipboard() { ShellModuleEntry *entry = shell_get_main_shell()->selected; - gchar *data = entry->func(entry->number); - GtkClipboard *clip = gtk_clipboard_get(gdk_atom_intern("CLIPBOARD", FALSE)); - ReportContext *ctx = report_context_text_new(NULL); - - ctx->entry = entry; - - report_header(ctx); - report_table(ctx, data); - report_footer(ctx); - gtk_clipboard_set_text(clip, ctx->output, -1); - - g_free(data); - report_context_free(ctx); + if (entry) { + gchar *data = entry->func(entry->number); + GtkClipboard *clip = gtk_clipboard_get(gdk_atom_intern("CLIPBOARD", FALSE)); + ReportContext *ctx = report_context_text_new(NULL); + + ctx->entry = entry; + + report_header(ctx); + report_table(ctx, data); + report_footer(ctx); + + gtk_clipboard_set_text(clip, ctx->output, -1); + + g_free(data); + report_context_free(ctx); + } } void cb_side_pane() @@ -124,8 +127,13 @@ void cb_about() void cb_generate_report() { Shell *shell = shell_get_main_shell(); + gboolean btn_refresh = shell_action_get_enabled("RefreshAction"); + gboolean btn_copy = shell_action_get_enabled("CopyAction"); report_dialog_show(shell->tree->model, shell->window); + + shell_action_set_enabled("RefreshAction", btn_refresh); + shell_action_set_enabled("CopyAction", btn_copy); } void cb_quit(void) diff --git a/hardinfo2/hardinfo.h b/hardinfo2/hardinfo.h index aab31389..b497fcdb 100644 --- a/hardinfo2/hardinfo.h +++ b/hardinfo2/hardinfo.h @@ -22,6 +22,13 @@ #include <gtk/gtk.h> typedef struct _ModuleEntry ModuleEntry; +typedef struct _FileTypes FileTypes; + +struct _FileTypes { + gchar *name; + gchar *mime_type; + gchar *extension; +}; struct _ModuleEntry { gchar *name; @@ -35,6 +42,11 @@ inline void remove_linefeed(gchar *str); inline gchar *size_human_readable(gfloat size); void nonblock_sleep(guint msec); + void file_chooser_open_expander(GtkWidget *chooser); + void file_chooser_add_filters(GtkWidget *chooser, FileTypes *filters); + gchar *file_chooser_get_extension(GtkWidget *chooser, FileTypes *filters); + gchar *file_chooser_build_filename(GtkWidget *chooser, gchar *extension); + extern gchar* path_lib; extern gchar* path_data; diff --git a/hardinfo2/report.c b/hardinfo2/report.c index 20025183..d20a8041 100644 --- a/hardinfo2/report.c +++ b/hardinfo2/report.c @@ -104,11 +104,7 @@ report_table(ReportContext *ctx, gchar *text) } if (*key == '$') { - gchar **tmp; - - tmp = g_strsplit(++key, "$", 0); - report_key_value(ctx, tmp[1], value); - g_strfreev(tmp); + report_key_value(ctx, strchr(key + 1, '$') + 1, value); } else { report_key_value(ctx, key, value); } @@ -294,6 +290,11 @@ report_get_filename(void) GtkFileFilter *filter; GtkWidget *dialog; gchar *filename = NULL; + static FileTypes file_types[] = { + { "HTML", "text/html", ".html" }, + { "Plain Text", "text/plain", ".txt" }, + { NULL, NULL, NULL } + }; dialog = gtk_file_chooser_dialog_new("Save File", NULL, @@ -308,31 +309,13 @@ report_get_filename(void) gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(dialog), "hardinfo report"); - filter = gtk_file_filter_new(); - gtk_file_filter_add_mime_type(filter, "text/html"); - gtk_file_filter_set_name(filter, "HTML"); - gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog), filter); - - filter = gtk_file_filter_new(); - gtk_file_filter_add_mime_type(filter, "text/plain"); - gtk_file_filter_set_name(filter, "Text"); - gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog), filter); + file_chooser_add_filters(dialog, file_types); + file_chooser_open_expander(dialog); if (gtk_dialog_run(GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT) { - const gchar *f; - filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER (dialog)); - - filter = gtk_file_chooser_get_filter(GTK_FILE_CHOOSER(dialog)); - f = gtk_file_filter_get_name(filter); - - if (g_str_equal(f, "HTML") && !g_str_has_suffix(filename, ".html")) { - filename = g_strconcat(filename, ".html", NULL); - } else if (g_str_equal(f, "Text") && !g_str_has_suffix(filename, ".txt")) { - filename = g_strconcat(filename, ".txt", NULL); - } else { - g_free(filename); - filename = NULL; - } + gchar *ext = file_chooser_get_extension(dialog, file_types); + + filename = file_chooser_build_filename(dialog, ext); } gtk_widget_destroy (dialog); diff --git a/hardinfo2/shell.c b/hardinfo2/shell.c index aa8477de..40cb8d58 100644 --- a/hardinfo2/shell.c +++ b/hardinfo2/shell.c @@ -103,6 +103,18 @@ void shell_action_set_enabled(const gchar *action_name, gboolean setting) } } +gboolean shell_action_get_enabled(const gchar *action_name) +{ + GtkAction *action; + + action = gtk_action_group_get_action(shell->action_group, action_name); + if (action) { + return gtk_action_get_sensitive(action); + } + + return FALSE; +} + void shell_set_side_pane_visible(gboolean setting) { if (setting) diff --git a/hardinfo2/shell.h b/hardinfo2/shell.h index c73c62d9..7870a5c3 100644 --- a/hardinfo2/shell.h +++ b/hardinfo2/shell.h @@ -123,6 +123,7 @@ Shell *shell_get_main_shell(); void shell_action_set_enabled(const gchar *action_name, gboolean setting); +gboolean shell_action_get_enabled(const gchar *action_name); gboolean shell_action_get_active(const gchar *action_name); void shell_action_set_active(const gchar *action_name, gboolean setting); diff --git a/hardinfo2/util.c b/hardinfo2/util.c index 6ca71fca..19102213 100644 --- a/hardinfo2/util.c +++ b/hardinfo2/util.c @@ -91,3 +91,67 @@ nonblock_sleep(guint msec) g_timeout_add(msec, (GSourceFunc)__nonblock_cb, NULL); gtk_main(); } + +static void +__expand_cb(GtkWidget *widget, gpointer data) +{ + if (GTK_IS_EXPANDER(widget)) { + gtk_expander_set_expanded(GTK_EXPANDER(widget), TRUE); + } else if (GTK_IS_CONTAINER(widget)) { + gtk_container_forall(GTK_CONTAINER(widget), (GtkCallback)__expand_cb, NULL); + } +} + +void +file_chooser_open_expander(GtkWidget *chooser) +{ + gtk_container_forall(GTK_CONTAINER(chooser), (GtkCallback)__expand_cb, NULL); +} + +void +file_chooser_add_filters(GtkWidget *chooser, FileTypes *filters) +{ + GtkFileFilter *filter; + gint i; + + for (i = 0; filters[i].name; i++) { + filter = gtk_file_filter_new(); + gtk_file_filter_add_mime_type(filter, filters[i].mime_type); + gtk_file_filter_set_name(filter, filters[i].name); + gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(chooser), filter); + } +} + +gchar +*file_chooser_get_extension(GtkWidget *chooser, FileTypes *filters) +{ + GtkFileFilter *filter; + const gchar *filter_name; + gint i; + + filter = gtk_file_chooser_get_filter(GTK_FILE_CHOOSER(chooser)); + filter_name = gtk_file_filter_get_name(filter); + for (i = 0; filters[i].name; i++) { + if (g_str_equal(filter_name, filters[i].name)) { + return filters[i].extension; + } + } + + return NULL; +} + +gchar +*file_chooser_build_filename(GtkWidget *chooser, gchar *extension) +{ + gchar *filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(chooser)); + gchar *retval; + + if (g_str_has_suffix(filename, extension)) { + return filename; + } + + retval = g_strconcat(filename, extension, NULL); + g_free(filename); + + return retval; +} |