⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sensors.c

📁 系统任务管理器
💻 C
📖 第 1 页 / 共 5 页
字号:
	}static gbooleanget_child_iter(GtkTreeModel *model, gchar *parent_node, GtkTreeIter *citer)	{	GtkTreePath		*path;	GtkTreeIter		iter;	path = gtk_tree_path_new_from_string(parent_node);	gtk_tree_model_get_iter(model, &iter, path);	gtk_tree_path_free(path);	return gtk_tree_model_iter_children(model, citer, &iter);	}  /* Callback for a created or destroyed alert.  Find the sensor in the model  |  and set the IMAGE_COLUMN.  */static voidcb_alert_config(GkrellmAlert *ap, Sensor *sr)	{	GtkTreeModel	*model;	GtkTreeIter		iter;	Sensor 			*s;	GdkPixbuf		*pixbuf;	gchar			node[2];	gint			i;	if (!gkrellm_config_window_shown())		return;	model = gtk_tree_view_get_model(treeview);	pixbuf = ap->activated ? gkrellm_alert_pixbuf() : NULL;	for (i = 0; i < 3; ++i)		{		node[0] = '0' + i;		/* toplevel temp, fan, or volt node */		node[1] = '\0';		if (get_child_iter(model, node, &iter))			do				{				gtk_tree_model_get(model, &iter, SENSOR_COLUMN, &s, -1);				if (s != sr)					continue;				gtk_tree_store_set(GTK_TREE_STORE(model), &iter,								IMAGE_COLUMN, pixbuf, -1);				return;				}			while (gtk_tree_model_iter_next(model, &iter));		}	}  /* Allow destination drops only on depth 2 paths and don't allow drops from  |  source depths of 1 (top level nodes).  Also disallow drags from one sensor  |  type to another. Note: from some reason if I allow drops on depth 3 nodes  |  (destination is on top of a second level node) I am not getting  |  "drag_end" callbacks.  */static gbooleanrow_drop_possible(GtkTreeDragDest *drag_dest, GtkTreePath *path,			GtkSelectionData *selection_data)	{	gint			*src_indices, *dst_indices;	GtkTreePath		*src_path;	if (!row_reference)		return FALSE;	src_path = gtk_tree_row_reference_get_path(row_reference);	src_indices = gtk_tree_path_get_indices(src_path);	dst_indices = gtk_tree_path_get_indices(path);//printf("drop path: indices=[%d,%d]:%d, path=%s\n",//	dst_indices[0], dst_indices[1], gtk_tree_path_get_depth(path),//	gtk_tree_path_to_string(path));	if (   gtk_tree_path_get_depth(src_path) == 1	/* Dragging top level */		|| gtk_tree_path_get_depth(path) != 2		|| src_indices[0] != dst_indices[0]		/* sensor types don't match */	   )		return FALSE;	return (*original_row_drop_possible)(drag_dest, path,									selection_data);	}  /* At each drag, divert the original Gtk row_drop_possible function to my  |  custom row_drop_possible so I can control tree structure.  The original  |  row_drop_possible function must be restored at "drag_end" else other  |  monitors doing drag n' drop could get screwed.  */static gbooleancb_drag_begin(GtkWidget *widget, GdkDragContext *context, gpointer data)	{	GtkTreeModel			*model;	GtkTreePath				*path;	GtkTreeIter				iter;	GtkTreeDragDestIface	*dest_iface;	model = gtk_tree_view_get_model(treeview);	dest_iface = GTK_TREE_DRAG_DEST_GET_IFACE(GTK_TREE_DRAG_DEST(model));	if (!original_row_drop_possible)		original_row_drop_possible = dest_iface->row_drop_possible;	dest_iface->row_drop_possible = row_drop_possible;	if (row_reference)		{		path = gtk_tree_row_reference_get_path(row_reference);		gtk_tree_model_get_iter(model, &iter, path);		gtk_tree_model_get(model, &iter, SENSOR_COLUMN, &dragged_sensor, -1);		}	else		dragged_sensor = NULL;	return FALSE;	}static gbooleancb_drag_end(GtkWidget *widget, GdkDragContext *context, gpointer data)	{	GtkTreeModel			*model;	GtkTreeIter				iter;	GtkTreeDragDestIface	*dest_iface;	Sensor					*s;	gchar					node[2];	gint					i, type = -1;	model = gtk_tree_view_get_model(treeview);	dest_iface = GTK_TREE_DRAG_DEST_GET_IFACE(GTK_TREE_DRAG_DEST(model));	dest_iface->row_drop_possible = original_row_drop_possible;	change_row_reference(NULL, NULL);	gtk_tree_selection_unselect_all(selection);	g_list_free(sensor_list);	sensor_list = NULL;	/* Re-order the sensors list to match the model.	*/	model = gtk_tree_view_get_model(treeview);	for (i = 0; i < 3; ++i)		{		node[0] = '0' + i;		/* toplevel temp, fan, or volt node */		node[1] = '\0';		if (get_child_iter(model, node, &iter))			{			do				{				gtk_tree_model_get(model, &iter, SENSOR_COLUMN, &s, -1);				sensor_list = g_list_append(sensor_list, s);				}			while (gtk_tree_model_iter_next(model, &iter));			}		}	if (dragged_sensor)		type = dragged_sensor->type;	dragged_sensor = NULL;	if (type < 0)		gkrellm_sensors_rebuild(DO_TEMP, DO_FAN, DO_VOLT);	else		gkrellm_sensors_rebuild(type == SENSOR_TEMPERATURE,				type == SENSOR_FAN, type == SENSOR_VOLTAGE);	return FALSE;	}static voidsensor_reset_optionmenu(Sensor *sensor)	{	Sensor	*sr;	if (!optionmenu)		return;	sr = get_referenced_sensor();	if (sr == sensor)		gtk_option_menu_set_history(GTK_OPTION_MENU(optionmenu),					SENSOR_PANEL_LOCATION);	}static voidcb_location_menu(GtkOptionMenu *om, gpointer data)	{	GList		*list;	Sensor		*sr, *s;	gchar		*pname = NULL;	gint		location;	location = gtk_option_menu_get_history(om);	sr = get_referenced_sensor();	if (!sr || !sr->enabled || sr->location == location)		return;	/* If trying to relocate, get a dst panel name so can report failures.	*/	if (location != SENSOR_PANEL_LOCATION)		{		if (sr->group == SENSOR_GROUP_MAINBOARD)			pname = (location == PROC_PANEL_LOCATION)				? gkrellm_proc_get_sensor_panel_label()				: gkrellm_cpu_get_sensor_panel_label(							location - CPU_PANEL_LOCATION);		else if (sr->group == SENSOR_GROUP_DISK)			pname = _("Disk");		}	/* If moving off some other panel, reset that panel.	*/	sensor_reset_location(sr);	/* For mainboard sensor group, if relocating to a panel with some other	|  sensor of same type on it, auto restore the other sensor to the sensor	|  panel.  Disk sensor group should never conflict.	*/	sr->location = location;	if (   location != SENSOR_PANEL_LOCATION		&& sr->group == SENSOR_GROUP_MAINBOARD	   )		for (list = sensor_list; list; list = list->next)			{			s = (Sensor *) list->data;			if (   s->group == SENSOR_GROUP_MAINBOARD				&& s != sr				&& s->type == sr->type				&& s->location == sr->location			   )				s->location = SENSOR_PANEL_LOCATION;	/* is being replaced */			}	gkrellm_sensors_rebuild(DO_TEMP, DO_FAN, FALSE);	if (sr->location != location)	/* location failed */		{		gtk_option_menu_set_history(GTK_OPTION_MENU(optionmenu),					SENSOR_PANEL_LOCATION);		sensor_relocation_error(pname);		}	}static voidcreate_location_menu(gint group)	{	GtkWidget	*menu;	GtkWidget	*menuitem;	gint		n, n_cpus;	static gint	sig_id;	if (group == sensor_last_group)		return;	sensor_last_group = group;	if (optionmenu_menu)		{		g_signal_handler_disconnect(G_OBJECT(optionmenu), sig_id);		gtk_widget_destroy(optionmenu_menu);		}	menu = gtk_menu_new();	menuitem = gtk_menu_item_new_with_label("default");	gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);	gtk_widget_show(menuitem);	if (group == SENSOR_GROUP_MAINBOARD)		{		menuitem = gtk_menu_item_new_with_label(					gkrellm_proc_get_sensor_panel_label());		gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);		gtk_widget_show(menuitem);		n_cpus = gkrellm_smp_cpus() + 1;		for (n = 0; n < n_cpus; ++n)			{			menuitem = gtk_menu_item_new_with_label(						gkrellm_cpu_get_sensor_panel_label(n));			gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);			gtk_widget_show(menuitem);			}		}	else if (group == SENSOR_GROUP_DISK)		{		menuitem = gtk_menu_item_new_with_label(_("Disk"));		gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);		gtk_widget_show(menuitem);		}	gtk_option_menu_set_menu(GTK_OPTION_MENU(optionmenu), menu);	optionmenu_menu = menu;	sig_id = g_signal_connect(G_OBJECT(optionmenu), "changed",				G_CALLBACK(cb_location_menu), NULL);	}static voidset_sensor_widget_states(Sensor *s)	{	gboolean	f_sensitive = FALSE,				o_sensitive = FALSE,				p_sensitive = FALSE;	gfloat		factor = 1.0,				offset = 0.0;	gint		location = SENSOR_PANEL_LOCATION;	if (s && s->enabled)		{		f_sensitive = TRUE;		if (s->type != SENSOR_FAN)			{			o_sensitive = TRUE;			offset = s->offset;			}		factor = s->factor;		if (s->type != SENSOR_VOLTAGE)			{			location = s->location;			p_sensitive = TRUE;			}		}	create_location_menu(s ? s->group : 0);	gtk_option_menu_set_history(GTK_OPTION_MENU(optionmenu), location);	gtk_spin_button_set_value(GTK_SPIN_BUTTON(factor_spin_button), factor);	gtk_spin_button_set_value(GTK_SPIN_BUTTON(offset_spin_button), offset);	gtk_widget_set_sensitive(optionmenu, p_sensitive);	gtk_widget_set_sensitive(alert_button, f_sensitive);	gtk_widget_set_sensitive(factor_spin_button, f_sensitive);	gtk_widget_set_sensitive(offset_spin_button, o_sensitive);	}static voidcb_correction_modified(void)	{	Sensor			*s;	s = get_referenced_sensor();	if (!s || !s->enabled)		return;	s->factor = gtk_spin_button_get_value(GTK_SPIN_BUTTON(factor_spin_button));	s->offset = gtk_spin_button_get_value(GTK_SPIN_BUTTON(offset_spin_button));	if (s->factor == 0)		{		s->factor = s->default_factor;		s->offset = s->default_offset;		gtk_spin_button_set_value(GTK_SPIN_BUTTON(factor_spin_button),					s->factor);		gtk_spin_button_set_value(GTK_SPIN_BUTTON(offset_spin_button),					s->offset);		}	if (s->type == SENSOR_VOLTAGE)		draw_voltages(s, FALSE);	else		{		gkrellm_cpu_draw_sensors(s);		gkrellm_proc_draw_sensors(s);		draw_temperatures(FALSE);		}	}static voidcb_tree_selection_changed(GtkTreeSelection *selection, gpointer data)	{	GtkTreeIter		iter;	GtkTreeModel	*model;	GtkTreePath		*path;	Sensor			*s;	gint            *indices, depth;	if (!gtk_tree_selection_get_selected(selection, &model, &iter))		{	    change_row_reference(NULL, NULL);		set_sensor_widget_states(NULL);		return;		}	path = gtk_tree_model_get_path(model, &iter);	indices = gtk_tree_path_get_indices(path);	depth = gtk_tree_path_get_depth(path);//printf("selection: indices=[%d,%d]:%d, path=%s\n",//		indices[0], indices[1], gtk_tree_path_get_depth(path),//		gtk_tree_path_to_string(path));    change_row_reference(model, path);    gtk_tree_path_free(path);	if (depth == 1)		{		set_sensor_widget_states(NULL);		return;		}	s = get_referenced_sensor();	set_sensor_widget_states(s);	}static voidlabel_edited_cb(GtkCellRendererText *cell, gchar *path_string,			gchar *new_label, gpointer data)	{	GtkTreeModel	*model;	GtkTreeIter		iter;	GtkTreePath		*path;	Sensor			*s;	model = sensor_model;	path = gtk_tree_path_new_from_string(path_string);	gtk_tree_model_get_iter(model, &iter, path);	gtk_tree_path_free(path);	gtk_tree_model_get(model, &iter,				SENSOR_COLUMN, &s,				-1);	if (!*new_label)		new_label = s->default_label;	gtk_tree_store_set(GTK_TREE_STORE(model), &iter,				LABEL_COLUMN, new_label, -1);	if (gkrellm_locale_dup_string(&s->name, new_label, &s->name_locale))		{		gkrellm_sensors_rebuild(s->type == SENSOR_TEMPERATURE,				s->type == SENSOR_FAN, s->type == SENSOR_VOLTAGE);		if (s->alert)			{			g_free(s->alert->name);			s->alert->name = g_strdup(s->name);//			gkrellm_reset_alert(s->alert);			}		}	}static voidenable_cb(GtkCellRendererText *cell, gchar *path_string, gpointer data)	{	GtkTreeModel	*model;	GtkTreeIter		iter;	GtkTreePath		*path;	Sensor			*s;	gboolean		enabled;	model = sensor_model;	path = gtk_tree_path_new_from_string(path_string);	gtk_tree_model_get_iter(model, &iter, path);	gtk_tree_model_get(model, &iter,				ENABLE_COLUMN, &enabled,				SENSOR_COLUMN, &s,				-1);	s->enabled = !enabled;	gtk_tree_store_set(GTK_TREE_STORE(model), &iter,				ENABLE_COLUMN, s->enabled, 				-1);    change_row_reference(model, path);	gtk_tree_path_free(path);	gkrellm_sensors_rebuild(s->type == SENSOR_TEMPERATURE,				s->type == SENSOR_FAN, s->type == SENSOR_VOLTAGE);	set_sensor_widget_states(s);	}static voidfix_temp_alert(Sensor *s)	{	GkrellmAlert	*a = s->alert;	if (s->type != SENSOR_TEMPERATURE || !a)		return;	if (units_fahrenheit)		{		if (a->high.warn_limit > 0)			a->high.warn_limit = a->high.warn_limit * 9.0 / 5.0 + 32.0;		if (a->high.alarm_limit > 0)			a->high.alarm_limit = a->high.alarm_limit * 9.0 / 5.0 + 32.0;		}	else		{		if (a->high.warn_limit > 0)			a->high.warn_limit = (a->high.warn_limit - 32.0) * 5.0 / 9.0;		if (a->high.alarm_limit > 0)			a->high.alarm_limit = (a->high.alarm_limit - 32.0) * 5.0 / 9.0;		}	gkrellm_alert_window_destroy(&s->alert);	}static voidcb_temperature_units(GtkWidget *button, gpointer data)	{	GList	*list;	gint	units;	units = GTK_TOGGLE_BUTTON(button)->active;	if (units == units_fahrenheit)		return;	units_fahrenheit = units;	for (list = sensor_list; list; list = list->next)		fix_temp_alert((Sensor *) list->data);	gkrellm_sensors_rebuild(DO_TEMP, FALSE, FALSE);	gkrellm_cpu_draw_sensors(NULL);	gkrellm_proc_draw_sensors(NULL);	}static voidcb_voltages_display(GtkWidget *entry, gpointer data)	{	gint	i;	for (i = 0; i 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -