📄 gui.c
字号:
theme = g_new0(Theme, 1); theme->path = g_strdup("Default"); theme->name = g_strdup(theme->path); themes_list = g_list_append(themes_list, theme); theme_dir = g_build_filename(gkrellm_homedir(), GKRELLM_THEMES_DIR, NULL); add_themes_to_list(theme_dir, FALSE); g_free(theme_dir); theme_dir = g_build_filename(gkrellm_homedir(), ".themes", NULL); add_themes_to_list(theme_dir, TRUE); g_free(theme_dir); theme_dir = gtk_rc_get_theme_dir(); add_themes_to_list(theme_dir, TRUE);#if defined(LOCAL_THEMES_DIR) add_themes_to_list(LOCAL_THEMES_DIR, FALSE);#endif#if defined(SYSTEM_THEMES_DIR) add_themes_to_list(SYSTEM_THEMES_DIR, FALSE);#endif themes_list = g_list_sort(themes_list, (GCompareFunc) theme_compare); if (_GK.command_line_theme) { theme = g_new0(Theme, 1); theme->path = g_strdup(_GK.command_line_theme); theme->name = g_strdup(theme->path); themes_list = g_list_append(themes_list, theme); } find_theme_position_in_list(); }static GtkTreeModel *theme_create_model(void) { GtkListStore *store; GtkTreeIter iter; GList *list; Theme *theme; gkrellm_make_themes_list(); store = gtk_list_store_new(N_THEME_COLUMNS, G_TYPE_STRING, G_TYPE_STRING); for (list = themes_list; list; list = list->next) { theme = (Theme *) list->data; gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, THEME_COLUMN, theme->name, PATH_COLUMN, theme->path, -1); } return GTK_TREE_MODEL(store); }static voidcb_theme_tree_selection_changed(GtkTreeSelection *selection, gpointer data) { GtkTreeIter iter; GtkTreeModel *model; gchar *path; if (!gtk_tree_selection_get_selected(selection, &model, &iter)) return; gtk_spin_button_set_value(GTK_SPIN_BUTTON(theme_alt_spin_button), 0.0); gtk_tree_model_get(model, &iter, PATH_COLUMN, &path, -1); gtk_entry_set_text(GTK_ENTRY(theme_entry), path); gtk_label_set_text(GTK_LABEL(author_label), get_theme_author(path)); if (gkrellm_dup_string(&_GK.theme_path, path)) { find_theme_position_in_list(); theme_modified = TRUE; gkrellm_build(); } }static voidcb_theme_alternative_changed(GtkWidget *widget, GtkSpinButton *spin) { gint i; i = gtk_spin_button_get_value_as_int(spin); if (i > _GK.theme_n_alternatives) { i = _GK.theme_n_alternatives; gtk_spin_button_set_value(spin, (gfloat) i); } if (i != _GK.theme_alternative) { _GK.theme_alternative = i; theme_modified = TRUE; gkrellm_build(); } }static voidcb_theme_scale_changed(GtkWidget *widget, GtkSpinButton *spin) { gint i; i = gtk_spin_button_get_value_as_int(spin); if (i != _GK.theme_scale) { _GK.theme_scale = i; theme_modified = TRUE; gkrellm_build(); } }voidgkrellm_set_theme_alternatives_label(void) { GtkSpinButton *spin; gchar buf[64]; if (!config_window) return; spin = GTK_SPIN_BUTTON(theme_alt_spin_button); gtk_spin_button_set_value(spin, (gfloat) _GK.theme_alternative); snprintf(buf, sizeof(buf), _("%d total theme alternatives"), _GK.theme_n_alternatives); gtk_label_set_text(GTK_LABEL(theme_alt_label), buf); }voidgkrellm_save_theme_config(void) { FILE *f; gchar *path; /* Assume gkrellm -t is for testing and don't save theme config changes. | Similary for _GK.demo. */ if (!theme_modified || _GK.command_line_theme || _GK.demo) return; path = gkrellm_make_config_file_name(gkrellm_homedir(), GKRELLM_THEME_CONFIG); if ((f = fopen(path, "w")) != NULL) { fprintf(f, "%s\n", _GK.theme_path); fprintf(f, "%d\n", _GK.theme_alternative); fprintf(f, "%s\n", large_font.string); fprintf(f, "%s\n", normal_font.string); fprintf(f, "%s\n", small_font.string); fprintf(f, "%d\n", _GK.theme_scale); fclose(f); } g_free(path); theme_modified = FALSE; }voidgkrellm_load_theme_config(void) { FILE *f; gchar *path, *s; gchar buf[1024]; gint i; /* Need to load the theme from ~/.gkrellm/theme_config only at startup | or if re-reading because of theme_event - these are only times | _GK.theme_path will be NULL. Note: _GK.theme_path will not be NULL | at startup if there is a command line theme, so no theme scaling if | using command line theme. */ if (!_GK.theme_path) { path = gkrellm_make_config_file_name(gkrellm_homedir(), GKRELLM_THEME_CONFIG); f = fopen(path, "r"); g_free(path); if (f && fgets(buf, sizeof(buf), f)) { if ((s = strchr(buf, (gint) '\n')) != NULL) *s = '\0'; if (_GK.debug_level & DEBUG_GUI) printf("gkrellm_load_theme_config: %s\n", buf); s = buf; if (s && *s != '#' && *s != '\0' && strcmp(s, "Default")) { if (*s == '/' || s[1] == ':') _GK.theme_path = g_strdup(s); else _GK.theme_path = g_strdup_printf("%s/%s/%s", gkrellm_homedir(), GKRELLM_THEMES_DIR, s); } for (i = 0; fgets(buf, sizeof(buf), f); ++i) { if ((s = strchr(buf, (gint) '\n')) != NULL) *s = '\0'; if (_GK.debug_level & DEBUG_GUI) printf("gkrellm_load_theme_config: %s\n", buf); if (i == 0) sscanf(buf, "%d", &_GK.theme_alternative); if (i == 1 && !strstr(buf, "*-*")) /* XXX Trap out GdkFont */ gkrellm_dup_string(&large_font.string, buf); if (i == 2 && !strstr(buf, "*-*")) gkrellm_dup_string(&normal_font.string, buf); if (i == 3 && !strstr(buf, "*-*")) gkrellm_dup_string(&small_font.string, buf); if (i == 4) sscanf(buf, "%d", &_GK.theme_scale); } } if (f) fclose(f); } if (!_GK.theme_path || !g_file_test(_GK.theme_path, G_FILE_TEST_IS_DIR)) gkrellm_dup_string(&_GK.theme_path, ""); if (!large_font.string) gkrellm_dup_string(&large_font.string, "Serif 11"); if (!normal_font.string) gkrellm_dup_string(&normal_font.string, "Serif 9"); if (!small_font.string) gkrellm_dup_string(&small_font.string, "Serif 8"); }voidgkrellm_read_theme_event(GtkSettings *settings) { Theme *theme; gchar *s, *theme_name = NULL; gint alt = 0; if (settings) /* called via "notify::gtk-theme-name" signal connect, */ /* so get the current gtk theme name and switch to it */ { g_object_get(_GK.gtk_settings, "gtk-theme-name", &theme_name, NULL); if ((_GK.debug_level & DEBUG_GUI) && theme_name) printf("notify::gtk-theme-name: %s\n", theme_name); if ( gkrellm_dup_string(&_GK.gtk_theme_name, theme_name) && _GK.track_gtk_theme_name ) { theme = find_theme_in_list(theme_name); if (!theme) { theme_name = g_strdup(_GK.default_track_theme); if ((s = strrchr(theme_name, ':')) != NULL) { *s++ = '\0'; alt = atoi(s); } theme = find_theme_in_list(theme_name); g_free(theme_name); } if ( theme && theme->path && gkrellm_dup_string(&_GK.theme_path, strcmp(theme->path, "Default") ? theme->path : "") ) { _GK.theme_alternative = alt; theme_modified = TRUE; gkrellm_save_theme_config(); gkrellm_build(); } } } else /* Called from cb_client_event() because we were sent the */ /* _GKRELLM_READ_THEME client event, so reread theme config. */ { g_free(_GK.theme_path); _GK.theme_path = NULL; /* Forces reread of GKRELLM_THEME_CONFIG */ gkrellm_build(); } }static voidcb_load_theme(gpointer data, guint action, GtkWidget *widget) { GtkTreeIter iter; GtkTreeModel *model; GtkTreePath *path; Theme *theme; gint row; ++_GK.theme_reload_count; if (_GK.no_config) return; if (!themes_list) gkrellm_make_themes_list(); if (action == THEME_ALT_NEXT || action == THEME_ALT_PREV) { _GK.theme_alternative += ((action == THEME_ALT_NEXT) ? 1 : -1); if (_GK.theme_alternative > _GK.theme_n_alternatives) { _GK.theme_alternative = 0; action = THEME_NEXT; } if (_GK.theme_alternative < 0) { _GK.theme_alternative = 100; action = THEME_PREV; } theme_modified = TRUE; } else if (action > THEME_RELOAD) _GK.theme_alternative = 0; if (action == THEME_NEXT || action == THEME_PREV) { if (action == THEME_NEXT) { theme_position_in_list = theme_position_in_list->next; if (!theme_position_in_list) theme_position_in_list = themes_list; } else { theme_position_in_list = theme_position_in_list->prev; if (!theme_position_in_list) theme_position_in_list = g_list_last(themes_list); } if (config_window) { row = g_list_position(themes_list, theme_position_in_list); model = gtk_tree_view_get_model(theme_treeview); gtk_tree_model_iter_nth_child(model, &iter, NULL, row); path = gtk_tree_model_get_path(model, &iter); gtk_tree_view_set_cursor(theme_treeview, path, NULL, FALSE); return; /* cb_theme_tree_selection_changed -> gkrellm_build()*/ } theme = (Theme *) theme_position_in_list->data; gkrellm_dup_string(&_GK.theme_path, strcmp(theme->path, "Default") ? theme->path : ""); theme_modified = TRUE; } if (action == THEME_SCALE_UP && _GK.theme_scale < 380) { _GK.theme_scale += 20; theme_modified = TRUE; } else if (action == THEME_SCALE_DOWN && _GK.theme_scale > 50) { _GK.theme_scale -= 20; theme_modified = TRUE; } gkrellm_build(); }static voiddestroy_font_dialogs(void) { if (large_font.fontseldlg) gtk_widget_destroy(GTK_WIDGET(large_font.fontseldlg)); if (normal_font.fontseldlg) gtk_widget_destroy(GTK_WIDGET(normal_font.fontseldlg)); if (small_font.fontseldlg) gtk_widget_destroy(GTK_WIDGET(small_font.fontseldlg)); }static voidclose_theme_config(gint from_close) { destroy_font_dialogs(); }static voidcb_font_entry_activate(GtkWidget *widget, gpointer *data) { if (!get_font_entries()) return; theme_modified = TRUE; gkrellm_build(); }static voidcb_font_entry_changed(GtkWidget *widget, gpointer *data) { theme_modified = TRUE; }gfloatgkrellm_get_theme_scale(void) { return (gfloat) (_GK.theme_scale) / 100.0; }static voidcb_track_gtk(GtkToggleButton *button, GtkWidget *box) { _GK.track_gtk_theme_name = button->active; gtk_widget_set_sensitive(box, _GK.track_gtk_theme_name); }static voidcb_track_entry_changed(GtkWidget *widget, gpointer *data) { gchar *s; s = gkrellm_gtk_entry_get_text(&widget); gkrellm_dup_string(&_GK.default_track_theme, s); gkrellm_config_modified(); }static voidcreate_theme_tab(GtkWidget *tabs_vbox) { GtkWidget *tabs; GtkWidget *vbox, *vbox1, *vbox2, *hbox; GtkWidget *label, *entry; GtkWidget *scrolled; GtkTreeModel *model; GtkCellRenderer *renderer; gchar *s; tabs = gtk_notebook_new(); gtk_notebook_set_tab_pos(GTK_NOTEBOOK(tabs), GTK_POS_TOP); gtk_box_pack_start(GTK_BOX(tabs_vbox), tabs, TRUE, TRUE, 0);/* --Theme tab */ vbox = gkrellm_gtk_framed_notebook_page(tabs, _("Theme")); hbox = gtk_hbox_new (FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); label = gtk_label_new(_("Theme:")); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 3); theme_entry = gtk_entry_new(); gtk_entry_set_max_length(GTK_ENTRY(theme_entry), 128); if (_GK.theme_path) gtk_entry_set_text(GTK_ENTRY(theme_entry), _GK.theme_path); gtk_box_pack_start(GTK_BOX(hbox), theme_entry, TRUE, TRUE,0); hbox = gtk_hbox_new (FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); label = gtk_label_new(_("Author:")); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 3); author_label = gtk_label_new(get_theme_author(_GK.theme_path)); gtk_misc_set_alignment(GTK_MISC(author_label), 0, 0.5); gtk_box_pack_start(GTK_BOX(hbox), author_label, TRUE, TRUE, 5); vbox1 = gkrellm_gtk_framed_vbox(vbox, NULL, 4, TRUE, 0, 2); 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(vbox1), scrolled, TRUE, TRUE, 0); model = theme_create_model(); theme_treeview = GTK_TREE_VIEW(gtk_tree_view_new_with_model(model)); g_object_unref(G_OBJECT(model)); gtk_tree_view_set_rules_hint(theme_treeview, TRUE); renderer = gtk_cell_renderer_text_new(); gtk_tree_view_insert_column_with_attributes(theme_treeview, -1, _("Theme"), renderer, "text", THEME_COLUMN, NULL); gtk_container_add(GTK_CONTAINER(scrolled), GTK_WIDGET(theme_treeview)); theme_selection = gtk_tree_view_get_selection(theme_treeview); gtk_tree_selection_set_mode(theme_selection, GTK_SELECTION_SINGLE); g_signal_connect(G_OBJECT(theme_selection), "changed", G_CALLBACK(cb_theme_tree_selection_changed), NULL); hbox = gtk_hbox_new (FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 2); gkrellm_gtk_spin_button(hbox, &theme_alt_spin_button, (gfloat)_GK.theme_alternative, 0.0, 100.0, 1.0, 5.0, 0, 60, cb_theme_alternative_changed, NULL, FALSE, NULL); theme_alt_label = gtk_label_new("");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -