diff options
Diffstat (limited to 'details.c')
| -rw-r--r-- | details.c | 282 | 
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); +}  | 
