diff options
| -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; +} | 
