/* * Hardware Information, version 0.3.2 * Copyright (C) 2003 Leandro Pereira * * 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("%s\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("%s:", 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); }