📄 plugins.c
字号:
g_free(s); continue; } m = install_plugin(s); if (m) /* s is saved for use */ { plugins_list = g_list_append(plugins_list, m); s = g_path_get_basename(m->path); if (! gkrellm_string_in_list(plugins_enable_list, s)) m->privat->enabled = FALSE; } g_free(s); } g_dir_close(dir); }voidgkrellm_plugins_load(void) { GkrellmMonitor *m; gchar *path; if (_GK.command_line_plugin) { if ( *_GK.command_line_plugin != '.' && !strchr(_GK.command_line_plugin, G_DIR_SEPARATOR) ) path = g_strconcat(".", G_DIR_SEPARATOR_S, _GK.command_line_plugin, NULL); else path = g_strdup(_GK.command_line_plugin); plugin_log(_("*** Command line plugin:\n"), NULL); if ((m = install_plugin(path)) == NULL) g_free(path); else { m->privat->from_command_line = TRUE; plugins_list = g_list_append(plugins_list, m); } plugin_log("\n", NULL); } load_plugins_enable_file(); load_plugins_placement_file(); path = g_strconcat(gkrellm_homedir(), G_DIR_SEPARATOR_S, GKRELLM_PLUGINS_DIR, NULL); scan_for_plugins(path); g_free(path);#if defined(LOCAL_PLUGINS_DIR) scan_for_plugins(LOCAL_PLUGINS_DIR);#endif#if defined(SYSTEM_PLUGINS_DIR) scan_for_plugins(SYSTEM_PLUGINS_DIR);#endif }#if 0voidshuffle_test(void) { GList *list; GkrellmMonitor *mon; gint i; static gboolean srand_done; extern GtkWidget *gkrellm_monitor_vbox(); if (!srand_done) { srandom((unsigned int) time(0)); srand_done = TRUE; } for (list = gkrellm_monitor_list; list; list = list->next) { i = (gint) random(); i = (i % (g_list_length(gkrellm_monitor_list) - 2)) + 1; mon = (GkrellmMonitor *) list->data; if (mon->privat->main_vbox && mon != gkrellm_mon_host()) { gtk_box_reorder_child(GTK_BOX(gkrellm_monitor_vbox()), mon->privat->main_vbox, i); } } }#endifstatic voidreplace_plugins() { GList *new_monitor_list, *list; GkrellmMonitor *mon; extern GtkWidget *gkrellm_monitor_vbox(); new_monitor_list = NULL; for (list = gkrellm_monitor_list; list; list = list->next) { mon = (GkrellmMonitor *) list->data; if (mon->privat->main_vbox && mon != gkrellm_mon_host()) { gtk_widget_ref(mon->privat->main_vbox); gtk_container_remove(GTK_CONTAINER(gkrellm_monitor_vbox()), mon->privat->main_vbox); } if (MONITOR_ID(mon) != MON_PLUGIN) new_monitor_list = g_list_append(new_monitor_list, mon); } for (list = gkrellm_monitor_list; list; list = list->next) { mon = (GkrellmMonitor *) list->data; if (MONITOR_ID(mon) == MON_PLUGIN) gkrellm_place_plugin(&new_monitor_list, mon); } g_list_free(gkrellm_monitor_list); gkrellm_monitor_list = new_monitor_list; for (list = gkrellm_monitor_list; list; list = list->next) { mon = (GkrellmMonitor *) list->data; if (mon->privat->main_vbox && mon != gkrellm_mon_host()) { gtk_box_pack_start(GTK_BOX(gkrellm_monitor_vbox()), mon->privat->main_vbox, FALSE, FALSE, 0); gtk_widget_unref(mon->privat->main_vbox); } } }static GtkWidget *place_plugin_window;static GtkWidget *place_plugin_vbox;static gboolean setting_place_buttons;static voidapply_place(void) { GList *list; GkrellmMonitor *mon; gint i; if (!place_plugin || setting_place_buttons) return; for (i = 0; i < N_BUILTIN_MONITORS; ++i) if (GTK_TOGGLE_BUTTON(builtin_button[i])->active) break; for (list = gkrellm_monitor_list; list; list = list->next) { mon = (GkrellmMonitor *) list->data; if (MONITOR_ID(mon) == MON_PLUGIN || i != mon->privat->button_id) continue; place_plugin->privat->insert_before_id = mon->id; place_plugin->privat->insert_after = GTK_TOGGLE_BUTTON(after_button)->active; if (place_plugin->privat->insert_after) place_plugin->privat->gravity = 0; else place_plugin->privat->gravity = gtk_spin_button_get_value_as_int( GTK_SPIN_BUTTON(gravity_spin_button)); replace_plugins(); plugin_placement_modified = TRUE; break; } }static voidcb_close_place(void) { if (place_plugin_window) gtk_widget_destroy(place_plugin_window); place_plugin_window = NULL; place_plugin_vbox = NULL; }static gintplace_plugin_window_delete_event(GtkWidget *widget, GdkEvent *ev,gpointer data) { cb_close_place(); return FALSE; }static voidcb_place_default(GtkWidget *widget, gpointer data) { GkrellmMonitor *mon; if (!place_plugin) return; if (PLUGIN_INSERT_AFTER(place_plugin)) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(after_button), TRUE); else gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(before_button), TRUE); gtk_spin_button_set_value(GTK_SPIN_BUTTON(gravity_spin_button), (gfloat) PLUGIN_GRAVITY(place_plugin)); mon = gkrellm_monitor_from_id(PLUGIN_INSERT_BEFORE_ID(place_plugin)); if (mon && mon->privat->button_id >= 0) gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(builtin_button[mon->privat->button_id]), TRUE); }static voidplace_button_sensitivity(GkrellmMonitor *plugin, gboolean state) { GkrellmMonitor *mon = NULL; if (gkrellm_demo_mode()) { gtk_widget_set_sensitive(place_button, FALSE); return; } place_plugin = plugin; if (state && plugin && plugin->create_monitor) { gtk_widget_set_sensitive(place_button, TRUE); if (place_plugin_vbox) gtk_widget_set_sensitive(place_plugin_vbox, TRUE); } else { gtk_widget_set_sensitive(place_button, FALSE); if (place_plugin_vbox) gtk_widget_set_sensitive(place_plugin_vbox, FALSE); return; } if (!place_plugin_window) return; setting_place_buttons = TRUE; gtk_label_set_text(GTK_LABEL(place_label), plugin->name); if (plugin->privat->insert_after) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(after_button), TRUE); else gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(before_button), TRUE); gtk_spin_button_set_value(GTK_SPIN_BUTTON(gravity_spin_button), (gfloat) plugin->privat->gravity); mon = gkrellm_monitor_from_id(plugin->privat->insert_before_id); if (mon && mon->privat->button_id >= 0) gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(builtin_button[mon->privat->button_id]), TRUE); setting_place_buttons = FALSE; }static gbooleancb_place(GtkToggleButton *button, gpointer data) { if (!button->active) return FALSE; apply_place(); return TRUE; }static voidcb_place_spin(GtkWidget *widget, GtkSpinButton *spin) { if (!place_plugin) return; if (place_plugin->privat->insert_after) gtk_spin_button_set_value(GTK_SPIN_BUTTON(gravity_spin_button), 0.0); else apply_place(); return; }static voidcb_place_button(GtkWidget *widget, gpointer data) { GtkWidget *main_vbox, *vbox, *vbox1, *vbox2, *vbox3, *hbox; GtkWidget *button; GtkTreeModel *model; GtkTreePath *path; GtkTreeIter iter; GSList *group; GList *list; GkrellmMonitor *mon; GkrellmMonprivate *mp; gint i; if (gkrellm_demo_mode()) return; if (!place_plugin_window) { place_plugin_window = gtk_window_new(GTK_WINDOW_TOPLEVEL); g_signal_connect(G_OBJECT(place_plugin_window), "delete_event", G_CALLBACK(place_plugin_window_delete_event), NULL); gtk_window_set_title(GTK_WINDOW(place_plugin_window), _("GKrellM Place Plugin")); gtk_window_set_wmclass(GTK_WINDOW(place_plugin_window), "Gkrellm_conf", "Gkrellm"); main_vbox = gtk_vbox_new(FALSE, 0); gtk_container_add(GTK_CONTAINER(place_plugin_window), main_vbox); place_plugin_vbox = main_vbox; vbox = gkrellm_gtk_framed_vbox(main_vbox, NULL, 3, FALSE, 4, 3); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); vbox1 = gkrellm_gtk_framed_vbox(hbox, _("Builtin Monitors"), 3, FALSE, 4, 3); group = NULL; for (i = 0, list = gkrellm_monitor_list; list; list = list->next) { mon = (GkrellmMonitor *) list->data; mp = mon->privat; mon->privat->button_id = -1; if (MONITOR_ID(mon) != MON_PLUGIN) { if ( !mon->name || !mon->create_monitor || mon == gkrellm_mon_host() ) continue; button = gtk_radio_button_new_with_label(group, mon->name); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(cb_place), NULL); gtk_box_pack_start(GTK_BOX(vbox1), button, FALSE, FALSE, 0); if (i < N_BUILTIN_MONITORS) { builtin_button[i] = button; mon->privat->button_id = i++; } group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(button)); } } vbox1 = gtk_vbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), vbox1, FALSE, FALSE, 0); place_label = gtk_label_new(""); gtk_box_pack_start(GTK_BOX(vbox1), place_label, FALSE, FALSE, 10); vbox2 = gkrellm_gtk_framed_vbox(vbox1, _("Place Plugin"), 3, FALSE, 4, 3); group = NULL; vbox3 = gkrellm_gtk_framed_vbox(vbox2, NULL, 3, FALSE, 4, 3); before_button = gtk_radio_button_new_with_label(group, _("Before selected builtin monitor")); g_signal_connect(G_OBJECT(before_button), "clicked", G_CALLBACK(cb_place), NULL); gtk_box_pack_start(GTK_BOX(vbox3), before_button, FALSE, FALSE, 0); gkrellm_gtk_spin_button(vbox3, &gravity_spin_button, 8, 0.0, 15.0, 1, 1, 0, 50, cb_place_spin, NULL, FALSE, _("With gravity")); vbox3 = gkrellm_gtk_framed_vbox(vbox2, NULL, 3, FALSE, 4, 3); group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(before_button)); after_button = gtk_radio_button_new_with_label(group, _("After selected builtin monitor")); g_signal_connect(G_OBJECT(after_button), "clicked", G_CALLBACK(cb_place), NULL); gtk_box_pack_start(GTK_BOX(vbox3), after_button, FALSE, FALSE, 0); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox1), hbox, FALSE, FALSE, 0); gkrellm_gtk_button_connected(hbox, NULL, TRUE, FALSE, 0, cb_place_default, NULL, _("Plugin Defaults")); hbox = gtk_hbutton_box_new(); gtk_button_box_set_layout(GTK_BUTTON_BOX(hbox), GTK_BUTTONBOX_END); gtk_box_set_spacing(GTK_BOX(hbox), 5); gtk_box_pack_end(GTK_BOX(vbox1), hbox, FALSE, FALSE, 0); button = gtk_button_new_from_stock(GTK_STOCK_OK); GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(cb_close_place), NULL); gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 0); gtk_widget_show_all(place_plugin_window); } else gtk_window_present(GTK_WINDOW(place_plugin_window));// gdk_window_raise(place_plugin_window->window); if (row_reference) { model = gtk_tree_view_get_model(treeview); path = gtk_tree_row_reference_get_path(row_reference); gtk_tree_model_get_iter(model, &iter, path); gtk_tree_model_get(model, &iter, MON_COLUMN, &mon, -1); place_button_sensitivity(mon, mon->privat->enabled); } }static voidcb_enable_plugin(GtkCellRendererToggle *cell, gchar *path_str, gpointer data) { GtkTreeModel *model = (GtkTreeModel *)data; GtkTreeIter iter; GtkTreePath *path; GkrellmMonitor *mon; gboolean enable; path = gtk_tree_path_new_from_string(path_str); gtk_tree_model_get_iter(model, &iter, path); gtk_tree_path_free(path); gtk_tree_model_get(model, &iter, ENABLE_COLUMN, &enable, MON_COLUMN, &mon, -1); if (mon->privat->from_command_line) enable = TRUE; else enable = !enable; gtk_list_store_set(GTK_LIST_STORE(model), &iter, ENABLE_COLUMN, enable, -1); if (enable) enable_plugin(mon); else disable_plugin(mon); place_button_sensitivity(mon, enable); }static voidcb_tree_selection_changed(GtkTreeSelection *selection, gpointer data) { GtkTreeIter iter; GtkTreeModel *model; GtkTreePath *path; GkrellmMonitor *mon; gtk_tree_row_reference_free(row_reference); if (!gtk_tree_selection_get_selected(selection, &model, &iter)) { row_reference = NULL; place_button_sensitivity(NULL, FALSE); return; } path = gtk_tree_model_get_path(model, &iter); row_reference = gtk_tree_row_reference_new(model, path); gtk_tree_model_get(model, &iter, MON_COLUMN, &mon, -1); place_button_sensitivity(mon, mon->privat->enabled); }voidgkrellm_plugins_config_close(void) { save_plugins_enable_file(); save_plugins_placement_file(); cb_close_place(); }static GtkTreeModel *create_model(void) { GtkListStore *store; GtkTreeIter iter; GkrellmMonitor *mon; GList *list; gchar *buf; store = gtk_list_store_new(N_COLUMNS, G_TYPE_STRING, G_TYPE_BOOLEAN, G_TYPE_POINTER); for (list = plugins_list; list; list = list->next) { mon = (GkrellmMonitor *) list->data; if (mon->privat->from_command_line) buf = g_strdup_printf("%s (%s)", mon->name, _("from command line")); else buf = NULL; gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, NAME_COLUMN, buf ? buf : mon->name, ENABLE_COLUMN, mon->privat->enabled, MON_COLUMN, mon, -1); g_free(buf); } return GTK_TREE_MODEL(store); }voidgkrellm_plugins_config_create(GtkWidget *tab_vbox) { GtkWidget *tabs; GtkWidget *vbox; GtkWidget *hbox; GtkWidget *scrolled; GtkWidget *view; GtkTreeModel *model; GtkCellRenderer *renderer; GtkTreeSelection *selection; GtkTreeViewColumn *column; GtkTextIter iter; GtkTextBuffer *buffer; row_reference = NULL; tabs = gtk_notebook_new(); gtk_notebook_set_tab_pos(GTK_NOTEBOOK(tabs), GTK_POS_TOP); gtk_box_pack_start(GTK_BOX(tab_vbox), tabs, TRUE, TRUE, 0);/* -- Plugins tab */ vbox = gkrellm_gtk_framed_notebook_page(tabs, _("Plugins")); scrolled = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_box_pack_start(GTK_BOX(vbox), scrolled, TRUE, TRUE, 2); model = create_model(); treeview = GTK_TREE_VIEW(gtk_tree_view_new_with_model(model)); g_object_unref(G_OBJECT(model)); gtk_tree_view_set_rules_hint(treeview, TRUE); renderer = gtk_cell_renderer_toggle_new(); gtk_tree_view_insert_column_with_attributes(treeview, -1, _("Enable"), renderer, "active", ENABLE_COLUMN, NULL); g_signal_connect (G_OBJECT(renderer), "toggled", G_CALLBACK(cb_enable_plugin), model); renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new_with_attributes (_("Plugin"), renderer, "text", NAME_COLUMN, NULL); gtk_tree_view_append_column(treeview, column); gtk_tree_view_column_set_sort_column_id(column, NAME_COLUMN); gtk_tree_view_column_clicked(column); /* Sort it *//* gtk_tree_sortable_set_sort_column_id(model, NAME_COLUMN, GTK_ORDER_ASCENDING);*/ gtk_container_add(GTK_CONTAINER(scrolled), GTK_WIDGET(treeview)); selection = gtk_tree_view_get_selection(treeview); gtk_tree_selection_set_mode(selection, GTK_SELECTION_SINGLE); g_signal_connect(G_OBJECT(selection), "changed", G_CALLBACK(cb_tree_selection_changed), NULL); hbox = gtk_hbutton_box_new(); gtk_button_box_set_layout(GTK_BUTTON_BOX(hbox), GTK_BUTTONBOX_START); gtk_box_set_spacing(GTK_BOX(hbox), 5); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 2); place_button = gtk_button_new_with_label(_("Place")); gtk_box_pack_start(GTK_BOX(hbox), place_button, TRUE, TRUE, 0); g_signal_connect(G_OBJECT(GTK_BUTTON(place_button)), "clicked", G_CALLBACK(cb_place_button), NULL); gtk_widget_set_sensitive(place_button, FALSE);/* --Plugins detect log tab */ vbox = gkrellm_gtk_framed_notebook_page(tabs, _("Install Log")); view = gkrellm_gtk_scrolled_text_view(vbox, NULL, GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(view)); gtk_text_buffer_get_end_iter(buffer, &iter); if (plugin_install_log) gtk_text_buffer_insert(buffer, &iter, plugin_install_log, -1); else gtk_text_buffer_insert(buffer, &iter, _("No plugins found."), -1); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -