aboutsummaryrefslogtreecommitdiff
path: root/hardinfo2/shell/callbacks.c
diff options
context:
space:
mode:
Diffstat (limited to 'hardinfo2/shell/callbacks.c')
-rw-r--r--hardinfo2/shell/callbacks.c430
1 files changed, 430 insertions, 0 deletions
diff --git a/hardinfo2/shell/callbacks.c b/hardinfo2/shell/callbacks.c
new file mode 100644
index 00000000..021560e2
--- /dev/null
+++ b/hardinfo2/shell/callbacks.c
@@ -0,0 +1,430 @@
+/*
+ * HardInfo - Displays System Information
+ * Copyright (C) 2003-2009 Leandro A. F. Pereira <leandro@hardinfo.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 2.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * 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
+ */
+
+#include <stdlib.h>
+#include <gtk/gtk.h>
+
+#include "hardinfo.h"
+#include "callbacks.h"
+#include "iconcache.h"
+
+#include "shell.h"
+#include "report.h"
+#include "remote.h"
+#include "syncmanager.h"
+#include "help-viewer.h"
+#include "xmlrpc-server.h"
+
+#include "config.h"
+
+void cb_sync_manager()
+{
+ Shell *shell = shell_get_main_shell();
+
+ sync_manager_show(shell->window);
+}
+
+void cb_connect_to()
+{
+#ifdef HAS_LIBSOUP
+ Shell *shell = shell_get_main_shell();
+
+ connect_dialog_show(shell->window);
+#endif /* HAS_LIBSOUP */
+}
+
+void cb_manage_hosts()
+{
+#ifdef HAS_LIBSOUP
+ Shell *shell = shell_get_main_shell();
+
+ host_manager_show(shell->window);
+#endif /* HAS_LIBSOUP */
+}
+
+void cb_connect_host(GtkAction * action)
+{
+#ifdef HAS_LIBSOUP
+ Shell *shell = shell_get_main_shell();
+ gchar *name;
+
+ g_object_get(G_OBJECT(action), "name", &name, NULL);
+
+ if (remote_connect_host(name)) {
+ gchar *tmp;
+
+ tmp = g_strdup_printf("Remote: <b>%s</b>", name);
+ shell_set_remote_label(shell, tmp);
+
+ g_free(tmp);
+ } else {
+ cb_local_computer();
+ }
+
+ g_free(name);
+#endif /* HAS_LIBSOUP */
+}
+
+static gboolean server_start_helper(gpointer server_loop)
+{
+#ifdef HAS_LIBSOUP
+ GMainLoop *loop = (GMainLoop *)server_loop;
+
+ xmlrpc_server_start(loop);
+
+ return FALSE;
+#endif /* HAS_LIBSOUP */
+}
+
+void cb_act_as_server()
+{
+#ifdef HAS_LIBSOUP
+ gboolean accepting;
+ static GMainLoop *server_loop = NULL;
+
+ accepting = shell_action_get_active("ActAsServerAction");
+ if (accepting) {
+ server_loop = g_main_loop_new(NULL, FALSE);
+ g_idle_add(server_start_helper, server_loop);
+ } else {
+ g_main_loop_quit(server_loop);
+ }
+#endif /* HAS_LIBSOUP */
+}
+
+void cb_local_computer()
+{
+#ifdef HAS_LIBSOUP
+ Shell *shell = shell_get_main_shell();
+
+ shell_status_update("Disconnecting...");
+ remote_disconnect_all(TRUE);
+
+ shell_status_update("Unloading modules...");
+ module_unload_all();
+
+ shell_status_update("Loading local modules...");
+ shell->tree->modules = modules_load_all();
+
+ g_slist_foreach(shell->tree->modules, shell_add_modules_to_gui, shell->tree);
+ gtk_tree_view_expand_all(GTK_TREE_VIEW(shell->tree->view));
+
+ shell_view_set_enabled(TRUE);
+ shell_status_update("Done.");
+ shell_set_remote_label(shell, "");
+#endif /* HAS_LIBSOUP */
+}
+
+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://wiki.hardinfo.org");
+}
+
+void cb_open_online_docs()
+{
+ Shell *shell;
+
+ shell = shell_get_main_shell();
+ if (shell->help_viewer) {
+ help_viewer_open_page(shell->help_viewer, "index.hlp");
+ } else {
+ gchar *help_dir;
+
+ help_dir = g_build_filename(params.path_data, "doc", NULL);
+ shell->help_viewer = help_viewer_new(help_dir, "index.hlp");
+ g_free(help_dir);
+ }
+}
+
+void cb_open_online_docs_context()
+{
+ Shell *shell;
+
+ shell = shell_get_main_shell();
+
+ if (shell->selected->flags & MODULE_FLAG_HAS_HELP) {
+ gchar *temp;
+
+ if (shell->selected_module->dll) {
+ gchar *name_temp;
+
+ name_temp = (gchar *)g_module_name(shell->selected_module->dll);
+ name_temp = g_path_get_basename(name_temp);
+ strend(name_temp, '.');
+
+ temp = g_strdup_printf("context-help-%s-%d.hlp",
+ name_temp,
+ shell->selected->number);
+
+ g_free(name_temp);
+ } else {
+ goto no_context_help;
+ }
+
+ if (shell->help_viewer) {
+ help_viewer_open_page(shell->help_viewer, temp);
+ } else {
+ gchar *help_dir;
+
+ help_dir = g_build_filename(params.path_data, "doc", NULL);
+ shell->help_viewer = help_viewer_new(help_dir, temp);
+ g_free(help_dir);
+ }
+
+ g_free(temp);
+ } else {
+ GtkWidget *dialog;
+
+no_context_help:
+ dialog = gtk_message_dialog_new(GTK_WINDOW(shell->window),
+ GTK_DIALOG_DESTROY_WITH_PARENT,
+ GTK_MESSAGE_ERROR,
+ GTK_BUTTONS_CLOSE,
+ "No context help available.");
+
+ gtk_dialog_run(GTK_DIALOG(dialog));
+ gtk_widget_destroy(dialog);
+ }
+}
+
+void cb_report_bug()
+{
+ open_url("http://wiki.hardinfo.org/BugReports");
+}
+
+void cb_donate()
+{
+ open_url("http://wiki.hardinfo.org/Donate");
+}
+
+void cb_refresh()
+{
+ shell_do_reload();
+}
+
+void cb_copy_to_clipboard()
+{
+ ShellModuleEntry *entry = shell_get_main_shell()->selected;
+
+ if (entry) {
+ gchar *data = module_entry_function(entry);
+ 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()
+{
+ gboolean visible;
+
+ visible = shell_action_get_active("SidePaneAction");
+ shell_set_side_pane_visible(visible);
+}
+
+void cb_toolbar()
+{
+ gboolean visible;
+
+ visible = shell_action_get_active("ToolbarAction");
+ shell_ui_manager_set_visible("/MainMenuBarAction", visible);
+}
+
+void cb_about_module(GtkAction * action)
+{
+ Shell *shell = shell_get_main_shell();
+ GSList *modules = shell->tree->modules;
+ ModuleAbout *ma;
+ gchar *name;
+
+ g_object_get(G_OBJECT(action), "tooltip", &name, NULL);
+
+ for (; modules; modules = modules->next) {
+ ShellModule *sm = (ShellModule *) modules->data;
+
+ if (!g_str_equal(sm->name, name))
+ continue;
+
+ if ((ma = module_get_about(sm))) {
+ GtkWidget *about;
+ gchar *text;
+
+ about = gtk_about_dialog_new();
+
+ text = g_strdup_printf("%s Module", sm->name);
+ gtk_about_dialog_set_name(GTK_ABOUT_DIALOG(about), text);
+ g_free(text);
+
+ gtk_about_dialog_set_version(GTK_ABOUT_DIALOG(about),
+ ma->version);
+
+ text = g_strdup_printf("Written by %s\nLicensed under %s",
+ ma->author, ma->license);
+ gtk_about_dialog_set_copyright(GTK_ABOUT_DIALOG(about), text);
+ g_free(text);
+
+ if (ma->description)
+ gtk_about_dialog_set_comments(GTK_ABOUT_DIALOG(about),
+ ma->description);
+
+ gtk_about_dialog_set_logo(GTK_ABOUT_DIALOG(about), sm->icon);
+ gtk_dialog_run(GTK_DIALOG(about));
+ gtk_widget_destroy(about);
+ } else {
+ g_warning
+ ("No about information is associated with the %s module.",
+ name);
+ }
+
+ break;
+ }
+
+ g_free(name);
+}
+
+void cb_about()
+{
+ GtkWidget *about;
+ 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
+ };
+ const gchar *artists[] = {
+ "Jakub Szypulka",
+ "Tango Project",
+ "The GNOME Project",
+ "VMWare, Inc. (USB icon from VMWare Workstation 6)",
+ NULL
+ };
+
+ about = gtk_about_dialog_new();
+ gtk_about_dialog_set_name(GTK_ABOUT_DIALOG(about), "HardInfo");
+ gtk_about_dialog_set_version(GTK_ABOUT_DIALOG(about), VERSION);
+ gtk_about_dialog_set_copyright(GTK_ABOUT_DIALOG(about),
+ "Copyright \302\251 2003-2009 "
+ "Leandro A. F. Pereira");
+ gtk_about_dialog_set_comments(GTK_ABOUT_DIALOG(about),
+ "System information and benchmark tool");
+ gtk_about_dialog_set_logo(GTK_ABOUT_DIALOG(about),
+ icon_cache_get_pixbuf("logo.png"));
+
+ gtk_about_dialog_set_license(GTK_ABOUT_DIALOG(about),
+ "HardInfo is free software; you can redistribute it and/or modify "
+ "it under the terms of the GNU General Public License as published by "
+ "the Free Software Foundation, version 2.\n\n"
+ "This program is distributed in the hope that it will be useful, "
+ "but WITHOUT ANY WARRANTY; without even the implied warranty of "
+ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the "
+ "GNU General Public License for more details.\n\n"
+ "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_dialog_run(GTK_DIALOG(about));
+ gtk_widget_destroy(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)
+{
+ do {
+ gtk_main_quit();
+ } while (gtk_main_level() > 1);
+
+ exit(0);
+}