aboutsummaryrefslogtreecommitdiff
path: root/details.c
diff options
context:
space:
mode:
Diffstat (limited to 'details.c')
-rw-r--r--details.c282
1 files changed, 282 insertions, 0 deletions
diff --git a/details.c b/details.c
new file mode 100644
index 00000000..7c624366
--- /dev/null
+++ b/details.c
@@ -0,0 +1,282 @@
+/*
+ * Hardware Information, version 0.3.2
+ * Copyright (C) 2003 Leandro Pereira <leandro@linuxmag.com.br>
+ *
+ * May be modified and/or distributed under the terms of GNU GPL version 2.
+ *
+ */
+
+#include "details.h"
+#include "hardinfo.h"
+
+gboolean
+detail_window_close(GtkWidget *widget, gpointer data)
+{
+ DetailWindow *dw = (DetailWindow *) data;
+
+ gtk_widget_destroy(dw->window);
+
+ return FALSE;
+}
+
+void
+detail_window_set_title(DetailWindow *dw, const gchar *title)
+{
+ if (!dw) return;
+
+ gtk_window_set_title(GTK_WINDOW(dw->window), title);
+}
+
+void
+detail_window_update_names(DetailWindow *dw)
+{
+ gchar *buf;
+
+ if (dw->device_name && strstr(dw->device_name, "&")) {
+ gchar *temp, *temp2;
+
+ temp = (gchar *) malloc (strlen (dw->device_name) * 2);
+
+ temp2 = temp;
+
+ while (*(dw->device_name)) {
+ if (*(dw->device_name) == '&') {
+ *(temp++) = '&';
+ *(temp++) = 'a';
+ *(temp++) = 'm';
+ *(temp++) = 'p';
+ *(temp++) = ';';
+ } else {
+ *(temp++) = *(dw->device_name);
+ }
+ dw->device_name++;
+ }
+
+ *(temp++) = 0;
+
+ temp = temp2;
+
+ g_free(dw->device_name);
+ dw->device_name = g_strdup(temp);
+
+ g_free(temp);
+ }
+
+ if (!dw->device_type)
+ dw->device_type = "";
+
+ buf = g_strdup_printf("<big><b>%s</b></big>\n%s",
+ dw->device_name, dw->device_type);
+
+ gtk_label_set_markup(GTK_LABEL(dw->name_label), buf);
+
+ g_free(buf);
+}
+
+void
+detail_window_append_separator(DetailWindow *dw)
+{
+ GtkWidget *sep;
+
+ sep = gtk_hseparator_new();
+ gtk_widget_show(sep);
+
+ gtk_table_attach_defaults(GTK_TABLE(dw->info_table), sep, 0, 2, dw->last_info,
+ dw->last_info + 1);
+
+ dw->last_info++;
+}
+
+void
+detail_window_set_dev_type(DetailWindow *dw, const gchar *type)
+{
+ dw->device_type = g_strdup(type);
+
+ detail_window_update_names(dw);
+}
+
+void
+detail_window_set_dev_name(DetailWindow *dw, const gchar *name)
+{
+ dw->device_name = g_strdup(name);
+
+ detail_window_update_names(dw);
+}
+
+void
+detail_window_append_info_int(DetailWindow *dw, const gchar *name, gint val,
+ gboolean hex)
+{
+ gchar *buf;
+
+ buf = g_strdup_printf(hex ? "0x%X" : "%d", val);
+ detail_window_append_info(dw, name, buf);
+ g_free(buf);
+}
+
+void
+detail_window_append_info(DetailWindow *dw, const gchar *name, gchar *val)
+{
+ GtkWidget *label;
+ gchar *buf;
+
+ if (dw->last_info == 0)
+ dw->last_info = 1;
+
+ buf = g_strdup_printf("<b>%s:</b>", name);
+ label = gtk_label_new(buf);
+ gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
+ gtk_label_set_use_markup(GTK_LABEL(label), TRUE);
+ gtk_widget_show(label);
+ gtk_table_attach_defaults(GTK_TABLE(dw->info_table), label, 0, 1, dw->last_info,
+ dw->last_info + 1);
+ g_free(buf);
+
+ label = gtk_label_new(val);
+ gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
+ gtk_widget_show(label);
+ gtk_label_set_line_wrap(GTK_LABEL(label), TRUE);
+ gtk_label_set_selectable(GTK_LABEL(label), TRUE);
+ gtk_table_attach(GTK_TABLE(dw->info_table), label, 1, 2, dw->last_info,
+ dw->last_info + 1, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
+
+ dw->last_info++;
+
+}
+
+static gboolean
+notebook_hide_tabs(GtkWidget *widget, gpointer data)
+{
+ if (gtk_notebook_get_n_pages(GTK_NOTEBOOK(widget)) == 1) {
+ gtk_notebook_set_show_tabs(GTK_NOTEBOOK(widget), FALSE);
+ gtk_notebook_set_show_border(GTK_NOTEBOOK(widget), FALSE);
+ } else {
+ gtk_notebook_set_show_tabs(GTK_NOTEBOOK(widget), TRUE);
+ gtk_notebook_set_show_border(GTK_NOTEBOOK(widget), TRUE);
+ }
+
+ return FALSE;
+}
+
+void
+detail_window_set_icon(DetailWindow *dw, const gchar *path)
+{
+ if (!dw || !dw->icon) return;
+
+ gtk_image_set_from_file(GTK_IMAGE(dw->icon), path);
+}
+
+DetailWindow *
+detail_window_new(void)
+{
+ DetailWindow *dw;
+ GtkWidget *window, *vbox, *btn, *hbbox, *notebook, *table,
+ *label, *info_table;
+ GtkWidget *icon, *vb, *hb;
+
+ dw = g_new0(DetailWindow, 1);
+
+ window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+ gtk_container_set_border_width(GTK_CONTAINER(window), 5);
+ gtk_window_set_title(GTK_WINDOW(window), "Hardware Details");
+ gtk_window_set_type_hint(GTK_WINDOW(window), GDK_WINDOW_TYPE_HINT_UTILITY);
+ gtk_window_set_resizable(GTK_WINDOW(window), FALSE);
+ gtk_widget_realize(window);
+
+ dw->window = window;
+
+ vbox = gtk_vbox_new(FALSE, 0);
+ gtk_widget_show(vbox);
+ gtk_container_add(GTK_CONTAINER(window), vbox);
+
+ dw->vbox = vbox;
+
+ notebook = gtk_notebook_new();
+ gtk_widget_show(notebook);
+ gtk_box_pack_start(GTK_BOX(vbox), notebook, TRUE, TRUE, 0);
+ gtk_notebook_set_show_tabs(GTK_NOTEBOOK(notebook), FALSE);
+ gtk_notebook_set_show_border(GTK_NOTEBOOK(notebook), FALSE);
+ dw->notebook = notebook;
+
+ g_signal_connect(G_OBJECT(notebook), "expose-event",
+ G_CALLBACK(notebook_hide_tabs), notebook);
+
+ table = gtk_table_new(1, 2, FALSE);
+ gtk_container_set_border_width(GTK_CONTAINER(table), 8);
+ gtk_table_set_row_spacings(GTK_TABLE(table), 4);
+ gtk_table_set_col_spacings(GTK_TABLE(table), 16);
+ gtk_widget_show(table);
+
+ label = gtk_label_new(_("Information"));
+ gtk_widget_show(label);
+ gtk_notebook_append_page(GTK_NOTEBOOK(notebook), table,
+ label);
+
+ hb = gtk_hbox_new(FALSE, 5);
+ gtk_widget_show(hb);
+ gtk_table_attach_defaults(GTK_TABLE(table), hb, 0, 1, 0, 1);
+
+ icon = gtk_image_new();
+ gtk_misc_set_alignment(GTK_MISC(icon), 0.5, 0.0);
+ gtk_widget_show(icon);
+ dw->icon = icon;
+
+ gtk_table_attach_defaults(GTK_TABLE(table), icon, 0, 1, 0, 1);
+
+ vb = gtk_vbox_new(FALSE, 5);
+ gtk_widget_show(vb);
+ gtk_box_pack_start(GTK_BOX(hb), vb, TRUE, TRUE, 0);
+
+ label = gtk_label_new(_("No device selected."));
+ gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
+ gtk_label_set_use_markup(GTK_LABEL(label), TRUE);
+ gtk_widget_show(label);
+ gtk_table_attach(GTK_TABLE(table), label, 1, 2, 0, 1,
+ GTK_FILL | GTK_EXPAND, 0, 0, 0);
+ dw->name_label = label;
+
+ info_table = gtk_table_new(0, 0, FALSE);
+ gtk_widget_show(info_table);
+ gtk_table_attach(GTK_TABLE(table), info_table, 1, 2, 2, 3,
+ GTK_EXPAND | GTK_FILL, 0, 0, 0);
+ gtk_table_set_col_spacings(GTK_TABLE(info_table), 4);
+ gtk_table_set_row_spacings(GTK_TABLE(info_table), 2);
+ dw->info_table = info_table;
+
+ hbbox = gtk_hbutton_box_new();
+ gtk_container_set_border_width(GTK_CONTAINER(hbbox), 4);
+ gtk_widget_show(hbbox);
+ gtk_box_pack_start(GTK_BOX(vbox), hbbox, FALSE, FALSE, 0);
+ gtk_button_box_set_spacing(GTK_BUTTON_BOX(hbbox), 6);
+ gtk_button_box_set_layout(GTK_BUTTON_BOX(hbbox), GTK_BUTTONBOX_END);
+
+ btn = gtk_button_new_from_stock(GTK_STOCK_CLOSE);
+ g_signal_connect(G_OBJECT(btn), "clicked", G_CALLBACK(detail_window_close), dw);
+ gtk_widget_show(btn);
+ gtk_box_pack_end(GTK_BOX(hbbox), btn, FALSE, FALSE, 0);
+
+ detail_window_set_icon(dw, IMG_PREFIX "logo.png");
+
+ return dw;
+}
+
+void
+detail_window_show(GtkWidget *widget, gpointer data)
+{
+ MainWindow *mainwindow = (MainWindow *) data;
+ GenericDevice *dev;
+
+ mainwindow->det_window = detail_window_new();
+
+ dev = (GenericDevice *) gtk_ctree_node_get_row_data
+ (GTK_CTREE(mainwindow->ctree), GTK_CLIST(mainwindow->ctree)->
+ selection->data);
+
+ hi_show_device_info_real(mainwindow, dev);
+
+ gtk_window_set_modal(GTK_WINDOW(mainwindow->det_window->window), TRUE);
+ gtk_window_set_position(GTK_WINDOW(mainwindow->det_window->window), GTK_WIN_POS_CENTER_ON_PARENT);
+ gtk_window_set_transient_for(GTK_WINDOW(mainwindow->det_window->window),
+ GTK_WINDOW(mainwindow->window));
+ gtk_widget_show(mainwindow->det_window->window);
+}