📄 sensors.c
字号:
}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 + -