aboutsummaryrefslogtreecommitdiff
path: root/hardinfo2
diff options
context:
space:
mode:
Diffstat (limited to 'hardinfo2')
-rw-r--r--hardinfo2/callbacks.c34
-rw-r--r--hardinfo2/hardinfo.h12
-rw-r--r--hardinfo2/report.c39
-rw-r--r--hardinfo2/shell.c12
-rw-r--r--hardinfo2/shell.h1
-rw-r--r--hardinfo2/util.c64
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;
+}