#include "ubl-settings-kernel.h" config main_config; //functions void yon_load_proceed(YON_CONFIG_TYPE type){ yon_config_clean(); if (!yon_char_is_empty(config_get_default_command)) yon_config_load_config(YON_CONFIG_DEFAULT,config_get_default_command,NULL); if (type==YON_CONFIG_GLOBAL){ yon_config_load_config(type,config_get_global_command,NULL); } else if (type==YON_CONFIG_LOCAL){ yon_config_load_config(type,config_get_local_command,NULL); } else if (type==YON_CONFIG_CUSTOM){ char *path=""; textdomain(template_ui_LocaleName); GtkWidget *dialog = gtk_file_chooser_dialog_new(template_app_information.app_title,NULL,GTK_FILE_CHOOSER_ACTION_SAVE,CANCEL_LABEL,GTK_RESPONSE_CANCEL,OPEN_LABEL,GTK_RESPONSE_ACCEPT,NULL); textdomain(LocaleName); gtk_window_set_icon_name(GTK_WINDOW(dialog),"com.ublinux.ubl-settings-kernel"); gtk_window_set_title(GTK_WINDOW(dialog),TITLE_LABEL); GtkFileFilter *filter = gtk_file_filter_new(); gtk_file_filter_add_pattern(filter,"*.ini"); gtk_file_filter_set_name(filter, "*.ini"); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog),filter); gtk_widget_show(dialog); int response = gtk_dialog_run(GTK_DIALOG(dialog)); if (response == GTK_RESPONSE_ACCEPT){ char *file = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); if (!yon_char_is_empty(file)){ path=file; } gtk_widget_destroy(dialog); } else { gtk_widget_destroy(dialog); } char *command = yon_config_get_custom_command(path); yon_config_load_config(type,command,NULL); } } void yon_interface_update(main_window *widgets){ GList *list = gtk_container_get_children(GTK_CONTAINER(widgets->KernelsPackageBox)); for (guint i=0;iKernelsPackageBox),kernels[i],widgets); gtk_widget_set_can_focus(gtk_widget_get_parent(current),0); } } info_window *yon_info_window_new(){ info_window *window = malloc(sizeof(info_window)); GtkBuilder *builder = gtk_builder_new_from_resource(glade_info_path); window->window = yon_gtk_builder_get_widget(builder,"MainWindow"); window->HeadLabel = yon_gtk_builder_get_widget(builder,"HeadLabel"); window->InfoLabel = yon_gtk_builder_get_widget(builder,"InfoLabel"); return window; } install_window *yon_install_window_new(){ install_window *window = malloc(sizeof(install_window)); GtkBuilder *builder = gtk_builder_new_from_resource(glade_install_path); window->window = yon_gtk_builder_get_widget(builder,"MainWindow"); window->HeadLabel = yon_gtk_builder_get_widget(builder,"HeadLabel"); window->StatusBox = yon_gtk_builder_get_widget(builder,"StatusBox"); window->CancelButton = yon_gtk_builder_get_widget(builder,"CancelButton"); window->ExecuteButton = yon_gtk_builder_get_widget(builder,"ExecuteButton"); window->KernelVersionCombo = yon_gtk_builder_get_widget(builder,"KernelVersionCombo"); window->DebugCheck = yon_gtk_builder_get_widget(builder,"DebugCheck"); window->DriversCheck = yon_gtk_builder_get_widget(builder,"DriversCheck"); g_signal_connect(G_OBJECT(window->CancelButton),"clicked",G_CALLBACK(on_subwindow_close),NULL); return window; } int yon_tag_add(GtkBox *target,char *tag_label, char *tag_style, char *icon_name){ if (GTK_IS_BOX(target)&&!yon_char_is_empty(tag_label)&&!yon_char_is_empty(tag_style)){ GtkWidget *box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL,2); GtkWidget *label = gtk_label_new(tag_label); gtk_style_context_add_class(gtk_widget_get_style_context(label),tag_style); GtkWidget *icon = NULL; if (icon_name){ icon = gtk_image_new_from_icon_name(icon_name,GTK_ICON_SIZE_BUTTON); gtk_box_pack_start(GTK_BOX(box),icon,0,0,0); } gtk_box_pack_start(GTK_BOX(box),label,1,1,0); gtk_widget_show_all(box); gtk_box_pack_start(target,box,0,0,0); return 1; } return 0; } gboolean on_command_execute_success(GtkWidget *,gint,main_window *widgets){ yon_interface_update(widgets); return G_SOURCE_REMOVE; } void *yon_command_execute_async(char *command,main_window *widgets){ yon_terminal_integrated_start(widgets->InstallTerminal,command); glong columns = vte_terminal_get_column_count(VTE_TERMINAL(widgets->InstallTerminal)); vte_terminal_set_size(VTE_TERMINAL(widgets->InstallTerminal),columns,20); return NULL; } void on_module_install_clicked(GtkWidget *,dictionary *dict){ main_window *widgets = yon_dictionary_get_data(dict->first,main_window*); kernels_tab *tab = yon_dictionary_get_data(dict->first->next,kernels_tab*); char *command = install_command(tab->module); yon_command_execute_async(command,widgets); } void on_package_install_clicked(GtkWidget *,dictionary *dict){ main_window *widgets = yon_dictionary_get_data(dict->first,main_window*); kernels_tab *tab = yon_dictionary_get_data(dict->first->next,kernels_tab*); char *command = install_command(tab->package); yon_command_execute_async(command,widgets); } void on_module_remove_clicked(GtkWidget *,dictionary *dict){ main_window *widgets = yon_dictionary_get_data(dict->first,main_window*); kernels_tab *tab = yon_dictionary_get_data(dict->first->next,kernels_tab*); char *command = remove_command(tab->module); yon_command_execute_async(command,widgets); } void on_package_remove_clicked(GtkWidget *,dictionary *dict){ main_window *widgets = yon_dictionary_get_data(dict->first,main_window*); kernels_tab *tab = yon_dictionary_get_data(dict->first->next,kernels_tab*); char *command = remove_command(tab->package); yon_command_execute_async(command,widgets); } GtkWidget *yon_tab_row_new(GtkListBox *target, char *target_string, main_window *widgets){ GtkBuilder *builder = gtk_builder_new_from_resource(glade_table_row_path); kernels_tab *tab = malloc(sizeof(kernels_tab)); tab->main_box = yon_gtk_builder_get_widget(builder,"TableRowLabel"); tab->icon_box = yon_gtk_builder_get_widget(builder,"IconBox"); tab->name_label = yon_gtk_builder_get_widget(builder,"NameLabel"); tab->install_tags_box = yon_gtk_builder_get_widget(builder,"InstallTagsBox"); tab->run_tags_box = yon_gtk_builder_get_widget(builder,"RunBox"); tab->tags_box = yon_gtk_builder_get_widget(builder,"TagsBox"); tab->description_label = yon_gtk_builder_get_widget(builder,"DescriptionLabel"); tab->remove_module_button = yon_gtk_builder_get_widget(builder,"RemoveModuleButton"); tab->remove_package_button = yon_gtk_builder_get_widget(builder,"RemovePackageButton"); tab->install_module_button = yon_gtk_builder_get_widget(builder,"InstallModuleButton"); tab->install_package_button = yon_gtk_builder_get_widget(builder,"InstallPackageButton"); tab->changelog_button = yon_gtk_builder_get_widget(builder,"ChangelogButton"); dictionary *dict = NULL; yon_dictionary_add_or_create_if_exists_with_data(dict,"widgets",widgets); yon_dictionary_add_or_create_if_exists_with_data(dict,"tab",tab); g_signal_connect(G_OBJECT(tab->install_module_button),"clicked",G_CALLBACK(on_module_install_clicked),dict); g_signal_connect(G_OBJECT(tab->install_package_button),"clicked",G_CALLBACK(on_package_install_clicked),dict); g_signal_connect(G_OBJECT(tab->remove_module_button),"clicked",G_CALLBACK(on_module_remove_clicked),dict); g_signal_connect(G_OBJECT(tab->remove_package_button),"clicked",G_CALLBACK(on_package_remove_clicked),dict); g_signal_connect(G_OBJECT(tab->changelog_button),"clicked",G_CALLBACK(on_changelog_clicked),tab); gtk_list_box_insert(target,tab->main_box,-1); int size; config_str parsed = yon_char_parse(target_string,&size,";"); if (size){ char *boot_run = config(KERNEL_BOOT_parameter); if (!yon_char_is_empty(boot_run)&&!strcmp(parsed[1],boot_run)){ yon_tag_add(GTK_BOX(tab->run_tags_box),BOOT_RUN_LABEL,"tag_orange",restart_icon_path); } tab->name = yon_char_new(parsed[0]); tab->module = yon_char_new(parsed[1]); tab->package = yon_char_new(parsed[2]); char *name = yon_char_unite("",tab->name,"\n",MODULE_LABEL," ",tab->module,"\n",PACKAGE_LABEL," ",tab->package,"",NULL); int types_size; config_str types_parsed = yon_char_parse(parsed[5],&types_size,", "); for (int k=0;ktags_box),types_parsed[k],tag_type,NULL); } char *check_install_command = get_package_is_installed_command(tab->module); if (!system(check_install_command)){ yon_tag_add(GTK_BOX(tab->install_tags_box),MODULE_INSTALLED_LABEL,"tag_green",module_icon_path); GtkWidget *module_image = gtk_image_new_from_icon_name(module_icon_path,GTK_ICON_SIZE_LARGE_TOOLBAR); gtk_box_pack_start(GTK_BOX(tab->icon_box),module_image,0,0,2); GtkWidget *package_image = gtk_image_new_from_icon_name(package_icon_path,GTK_ICON_SIZE_LARGE_TOOLBAR); gtk_box_pack_start(GTK_BOX(tab->icon_box),package_image,0,0,2); gtk_widget_show(module_image); gtk_widget_show(package_image); gtk_widget_show(tab->remove_module_button); gtk_widget_show(tab->remove_package_button); gtk_widget_hide(tab->install_module_button); gtk_widget_hide(tab->install_package_button); } else { free(check_install_command); check_install_command = get_package_is_installed_command(tab->package); if (!system(check_install_command)){ yon_tag_add(GTK_BOX(tab->install_tags_box),PACKAGE_INSTALLED_LABEL,"tag_green",package_icon_path); GtkWidget *package_image = gtk_image_new_from_icon_name(package_icon_path,GTK_ICON_SIZE_LARGE_TOOLBAR); gtk_box_pack_start(GTK_BOX(tab->icon_box),package_image,0,0,2); gtk_widget_show(package_image); gtk_widget_hide(tab->install_package_button); gtk_widget_show(tab->remove_package_button); } } yon_char_parsed_free(types_parsed,types_size); gtk_label_set_markup(GTK_LABEL(tab->name_label),name); gtk_label_set_text(GTK_LABEL(tab->description_label),parsed[6]); gtk_size_group_add_widget(GTK_SIZE_GROUP(widgets->StatusSizeGroup),tab->icon_box); gtk_size_group_add_widget(GTK_SIZE_GROUP(widgets->KernelSizeGroup),tab->name_label); gtk_size_group_add_widget(GTK_SIZE_GROUP(widgets->TagsSizeGroup),tab->tags_box); gtk_size_group_add_widget(GTK_SIZE_GROUP(widgets->InstallSizeGroup),tab->install_tags_box); gtk_size_group_add_widget(GTK_SIZE_GROUP(widgets->RunSizeGroup),tab->run_tags_box); gtk_size_group_add_widget(GTK_SIZE_GROUP(widgets->DescriptionSizeGroup),tab->description_label); } return tab->main_box; } // standard functions /**config_init() * [EN] * * [RU] * Функция инициализации всех параметров конфигурации */ void config_init(){ main_config.always_open_documentation=0; main_config.socket_id=-1; main_config.save_socket_id=-1; main_config.load_socket_id=-1; main_config.lock_help=0; main_config.lock_help=0; main_config.lock_load_global=0; main_config.lock_save_global=0; main_config.lock_save_local=0; main_config.load_mode=1; } void on_update_clicked(GtkWidget *, main_window *widgets){ yon_interface_update(widgets); } void on_info_clicked(GtkWidget *, main_window *widgets){ info_window *window = yon_info_window_new(); yon_gtk_window_setup(GTK_WINDOW(window->window),GTK_WINDOW(widgets->Window),INFO_TITLE_LABEL,icon_path,"info_window"); GtkWidget *current_tree=NULL; if (gtk_notebook_get_current_page(GTK_NOTEBOOK(widgets->MainNotebook))==0){ current_tree = widgets->KernelsPackageBox; } else { current_tree = widgets->AdditionsPackageBox; } GtkListBoxRow *target = gtk_list_box_get_selected_row(GTK_LIST_BOX(current_tree)); if (target){ GList *list = gtk_container_get_children(GTK_CONTAINER(target)); GList *list2 = gtk_container_get_children(GTK_CONTAINER(g_list_nth_data(list,0))); GList *list3 = gtk_container_get_children(GTK_CONTAINER(g_list_nth_data(list2,1))); char * target_str = yon_char_new((char*)gtk_label_get_text(GTK_LABEL(g_list_nth_data(list3,0)))); int size; config_str parsed = yon_char_parse(target_str,&size,"\n"); char *package=NULL; if (size&&(package = strstr(parsed[2],": "))){ package+=2; } config_str info = yon_config_load(get_package_info_command(package),&size); if (size!=-1){ char *final_text = yon_char_parsed_to_string(info,size,""); gtk_label_set_text(GTK_LABEL(window->InfoLabel),final_text); free(final_text); yon_char_parsed_free(info,size); } else { gtk_label_set_text(GTK_LABEL(window->InfoLabel),PACKAGE_NOT_FOUND_LABEL); } } gtk_widget_show(window->window); } void on_changelog_clicked(GtkWidget *, kernels_tab *tab){ info_window *window = yon_info_window_new(); yon_gtk_window_setup(GTK_WINDOW(window->window),GTK_WINDOW(gtk_widget_get_toplevel(tab->main_box)),INFO_TITLE_LABEL,icon_path,"changelog_window"); int size; config_str info = yon_config_load(yon_debug_output("%s\n",get_kernel_changelog_command(tab->package)),&size); if (size!=-1){ char *full_text = yon_char_parsed_to_string(info,size,""); gtk_label_set_text(GTK_LABEL(window->InfoLabel),full_text); free(full_text); yon_char_parsed_free(info,size); } else { gtk_label_set_text(GTK_LABEL(window->InfoLabel),PACKAGE_NOT_FOUND_LABEL); } gtk_widget_show(window->window); } void on_building_clicked(GtkWidget *, main_window *widgets){ if (widgets){}; install_window *window = yon_install_window_new(); yon_gtk_window_setup(GTK_WINDOW(window->window),GTK_WINDOW(widgets->Window),INFO_TITLE_LABEL,icon_path,"install_window"); gtk_widget_show(window->window); } void on_boot_toggled(GtkWidget *, char *path, main_window *widgets){ if (widgets||path){}; } void on_terminal_revealer_open(GtkWidget *, main_window *widgets){ int opened = gtk_revealer_get_child_revealed(GTK_REVEALER(widgets->TerminalRevealer)); gtk_revealer_set_reveal_child(GTK_REVEALER(widgets->TerminalRevealer),!opened); switch (opened){ case 0: { gtk_revealer_set_transition_type(GTK_REVEALER(widgets->TerminalRevealer),GTK_REVEALER_TRANSITION_TYPE_SLIDE_UP); } break; case 1: { gtk_revealer_set_transition_type(GTK_REVEALER(widgets->TerminalRevealer),GTK_REVEALER_TRANSITION_TYPE_SLIDE_DOWN); } break; } } /**yon_main_window_complete(main_window *widgets) * [EN] * * [RU] * Функция настройки основного окна приложения. [widgets] - структура со стандартным интерфейсом. */ void yon_main_window_complete(main_window *widgets){ widgets = yon_remalloc(widgets,sizeof(main_window)); GtkBuilder *builder = gtk_builder_new_from_resource(glade_path); gtk_box_pack_start(GTK_BOX(widgets->InterfaceBox),yon_gtk_builder_get_widget(builder,"BoxMain"),1,1,0); // Custom widgets configuration { widgets->MainNotebook = yon_gtk_builder_get_widget(builder, "MainNotebook"); widgets->UpdateButton = yon_gtk_builder_get_widget(builder, "UpdateButton"); widgets->InfoButton = yon_gtk_builder_get_widget(builder, "InfoButton"); widgets->LogButton = yon_gtk_builder_get_widget(builder, "LogButton"); widgets->BuildingButton = yon_gtk_builder_get_widget(builder, "BuildingButton"); widgets->KernelsUpperTree = yon_gtk_builder_get_widget(builder, "KernelsUpperTree"); widgets->KernelsTree = yon_gtk_builder_get_widget(builder, "KernelsTree"); widgets->AdditionsUpperTree = yon_gtk_builder_get_widget(builder, "AdditionsUpperTree"); widgets->AdditionsTree = yon_gtk_builder_get_widget(builder, "TestListBox"); widgets->MainRevealer = yon_gtk_builder_get_widget(builder, "MainRevealer"); widgets->MoreButton = yon_gtk_builder_get_widget(builder, "MoreButton"); widgets->InstallationProgress = yon_gtk_builder_get_widget(builder, "InstallationProgress"); widgets->InstallTerminal = yon_gtk_builder_get_widget(builder, "InstallTerminal"); widgets->TerminalRevealer = yon_gtk_builder_get_widget(builder, "TerminalRevealer"); widgets->TerminalOverlay = yon_gtk_builder_get_widget(builder, "TerminalOverlay"); widgets->KernelsList = GTK_LIST_STORE(gtk_builder_get_object(builder,"KernelsList")); widgets->AdditionsList = GTK_LIST_STORE(gtk_builder_get_object(builder,"AdditionsList")); widgets->KernelsPackageBox = yon_gtk_builder_get_widget(builder,"KernelsPackageBox"); widgets->AdditionsPackageBox = yon_gtk_builder_get_widget(builder,"AdditionsPackageBox"); widgets->StatusSizeGroup = GTK_SIZE_GROUP(gtk_builder_get_object(builder,"StatusSizeGroup")); widgets->KernelSizeGroup = GTK_SIZE_GROUP(gtk_builder_get_object(builder,"KernelSizeGroup")); widgets->TagsSizeGroup = GTK_SIZE_GROUP(gtk_builder_get_object(builder,"TagsSizeGroup")); widgets->InstallSizeGroup = GTK_SIZE_GROUP(gtk_builder_get_object(builder,"InstallSizeGroup")); widgets->RunSizeGroup = GTK_SIZE_GROUP(gtk_builder_get_object(builder,"RunSizeGroup")); widgets->DescriptionSizeGroup = GTK_SIZE_GROUP(gtk_builder_get_object(builder,"DescriptionSizeGroup")); g_signal_connect(G_OBJECT(widgets->UpdateButton),"clicked",G_CALLBACK(on_update_clicked),widgets); g_signal_connect(G_OBJECT(widgets->InfoButton),"clicked",G_CALLBACK(on_info_clicked),widgets); g_signal_connect(G_OBJECT(widgets->BuildingButton),"clicked",G_CALLBACK(on_building_clicked),widgets); g_signal_connect(G_OBJECT(widgets->MoreButton),"clicked",G_CALLBACK(on_terminal_revealer_open),widgets); g_signal_connect(G_OBJECT(widgets->InstallTerminal),"child-exited",G_CALLBACK(on_command_execute_success),widgets); glong columns = vte_terminal_get_column_count(VTE_TERMINAL(widgets->InstallTerminal)); vte_terminal_set_size(VTE_TERMINAL(widgets->InstallTerminal),columns,20); gtk_overlay_add_overlay(GTK_OVERLAY(widgets->TerminalOverlay),widgets->MainRevealer); yon_interface_update(widgets); } yon_load_proceed(YON_CONFIG_LOCAL); } int main(int argc, char *argv[]){ local=setlocale(LC_ALL, ""); textdomain (LocaleName); config_init(); yon_ubl_connect_config((_template_config*)&main_config); yon_ubl_window_init(TITLE_LABEL,TITLE_INFO_LABEL,LocaleName,CssPath,LocaleName,version_application,WIKI_LINK); config_str unfound = NULL; int size=0; yon_ubl_setup_arguments(argc,argv,&unfound,&size,NULL); gtk_init(&argc,&argv); template_main_window *widgets = yon_ubl_window_setup(); yon_main_window_complete((main_window*)widgets); char *path = yon_char_unite(yon_ubl_user_get_home_directory(),"/.config/",LocaleName,"/",LocaleName,".conf",NULL); yon_window_config_load(path); if (getuid()!=0){ textdomain(template_ui_LocaleName); yon_ubl_status_box_render(ROOT_WARNING_LABEL,BACKGROUND_IMAGE_FAIL_TYPE); textdomain(LocaleName); } gtk_main(); return 0; }