From 8f6936eb08da75f46ae69df47d13538ad1a2226e Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Tue, 22 Jul 2025 17:50:39 +0600 Subject: [PATCH] WIP Table slides --- gresource.xml | 3 + kernel-list-addon.csv | 13 + services-list.csv | 11 + source/CMakeLists.txt | 4 + source/ubinstall-gtk-installation.c | 116 ----- source/ubinstall-gtk-kernel.c | 126 ++++- source/ubinstall-gtk-page-switch.c | 6 +- source/ubinstall-gtk-startup-services.c | 135 ++++++ source/ubinstall-gtk.c | 43 +- source/ubinstall-gtk.h | 49 +- source/ubl-strings.h | 7 +- ubinstall-gtk-kernel-row.glade | 94 ++-- ubinstall-gtk-service-window.glade | 219 +++++++++ ubinstall-gtk.css | 12 + ubinstall-gtk.glade | 581 +++++++++++++++++++++--- 15 files changed, 1189 insertions(+), 230 deletions(-) create mode 100644 kernel-list-addon.csv create mode 100644 services-list.csv create mode 100644 source/ubinstall-gtk-startup-services.c create mode 100644 ubinstall-gtk-service-window.glade diff --git a/gresource.xml b/gresource.xml index 3873c32..fb7213e 100644 --- a/gresource.xml +++ b/gresource.xml @@ -12,6 +12,7 @@ ubinstall-gtk-menu.glade ubinstall-gtk-menu-item.glade ubinstall-gtk-kernel-row.glade + ubinstall-gtk-service-window.glade ubinstall-gtk.css @@ -42,5 +43,7 @@ modules.csv kernel-list.csv + kernel-list-addon.csv + services-list.csv \ No newline at end of file diff --git a/kernel-list-addon.csv b/kernel-list-addon.csv new file mode 100644 index 0000000..d7f1808 --- /dev/null +++ b/kernel-list-addon.csv @@ -0,0 +1,13 @@ +NAME;PAСKAGE_UBM;PAСKAGE;DESCRIPTION +Linux 5.15 headers;ubm-002-linux515-headers;linux515-headers;The Linux kernel headers v5.15 +Linux 5.15 Docs;ubm-003-linux515-docs;linux515-docs;The Linux kernel docs v5.15 +Linux 5.15 DKMS modules;ubm-linux515-dkms;;The Linux kernel DKMS modules v5.15 : v4l2loopback, rtl88x2bu, r8125, rtl8192eu +Linux 5.15 DKMS modules;ubm-linux515-r8168-8136;;The Linux kernel DKMS modules v5.15 : r8168-8136 +Linux 6.1 headers;ubm-002-linux61-headers;linux61-headers;The Linux kernel headers v6.1 +Linux 6.1 Docs;ubm-003-linux61-docs;linux61-docs;The Linux kernel docs v6.1 +Linux 6.1 DKMS modules;ubm-linux61-dkms;;The Linux kernel DKMS modules v6.1 : v4l2loopback, rtl88x2bu, r8125, rtl8192eu +Linux 6.1 DKMS modules;ubm-linux61-r8168-8136;;The Linux kernel DKMS modules v6.1 : r8168-8136 +Linux 6.6 headers;ubm-002-linux66-headers;linux66-headers;The Linux kernel headers v6.6 +Linux 6.6 Docs;ubm-003-linux66-docs;linux66-docs;The Linux kernel docs v6.6 +Linux 6.6 DKMS modules;ubm-linux66-dkms;;The Linux kernel DKMS modules v6.6 : v4l2loopback, rtl88x2bu, r8125, rtl8192eu +Linux 6.6 DKMS modules;ubm-linux66-dkms-r8168-8136;;The Linux kernel DKMS modules v6.6 : r8168-8136 \ No newline at end of file diff --git a/services-list.csv b/services-list.csv new file mode 100644 index 0000000..fbb62e4 --- /dev/null +++ b/services-list.csv @@ -0,0 +1,11 @@ +NAME;NAME_SERVICES;DESCRIPTION +UBManager WebPanel;cockpit.socket;Operating system monitoring and management manager service +Network Manager;NetworkManager;Is a program for providing detection and configuration for systems to automatically connect to networks +SSH;sshd;The daemon that listens for connections from clients on port 22 +NTP Client;systemd-timesyncd;Is a system service that may be used to synchronize the local system clock with a remote Network Time Protocol (NTP) server +Avahi;avahi-daemon,avahi-dnsconfd;Is a free zero-configuration networking (zeroconf) implementation, including a system for multicast DNS and DNS Service Discovery +CUPS;cups;Is a modular printing system for Unix-like computer operating systems which allows a computer to act as a print server +Samba;smb,nmb;Provides network shares for folders and printers using the SMB/CIFS protocol commonly used on Windows. SMB and NMB Daemon +Samba winbind;winbind;Provides network shares for folders and printers using the SMB/CIFS protocol commonly used on Windows. Winbind Daemon +SwapSpace;swapspace;Operating system dynamic swap file management service +Bluetouth;bluetooth;A Service is a container for logically related Bluetooth data items \ No newline at end of file diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt index 15bc804..cbb8ef1 100644 --- a/source/CMakeLists.txt +++ b/source/CMakeLists.txt @@ -69,10 +69,13 @@ set(DEPENDFILES ../ubinstall-gtk-menu.glade ../ubinstall-gtk-menu-item.glade ../ubinstall-gtk-kernel-row.glade + ../ubinstall-gtk-service-window.glade ../gresource.xml ../ubinstall-gtk.css ../modules.csv ../kernel-list.csv + ../kernel-list-addon.csv + ../services-list.csv ) file(COPY ${DEPENDFILES} DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) @@ -127,6 +130,7 @@ set(SOURCE_FILES ubinstall-gtk-saving.c ubinstall-gtk-standard.c ubinstall-gtk-install-start.c + ubinstall-gtk-startup-services.c ubinstall-gtk-kernel.c ubinstall-gtk.h ubl-strings.h diff --git a/source/ubinstall-gtk-installation.c b/source/ubinstall-gtk-installation.c index 1066501..f95e88d 100644 --- a/source/ubinstall-gtk-installation.c +++ b/source/ubinstall-gtk-installation.c @@ -274,84 +274,6 @@ void on_partition_changed(GtkWidget *self, main_window *widgets){ } -// void on_separate_installation_changed(GtkWidget *self, main_window *widgets){ - -// gtk_list_store_clear(widgets->PartitionsList); -// GtkTreeIter iter; -// GtkTreeModel *model; -// if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(self)),&model,&iter)){ -// gtk_tree_selection_select_iter(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->SeparateUserDevicesTree)),&iter); -// char *disk_path=""; -// gtk_tree_model_get(model,&iter,0,&disk_path,-1); -// int size; -// config_str partitions; -// partitions = yon_config_load(yon_debug_output("%s\n",get_parts_and_devices_command),&size); -// for (int i=0;i1024;sz=sz+1){ -// free_space=free_space/1024; -// } -// if (sz==-1) { -// sz=0; -// free_space=free_space/1024; -// } -// free_space_string = yon_char_append(yon_char_from_double(free_space)," "); -// free_space_string[strlen(free_space_string)-1]=*(yon_size_get_mod(sz)); -// } -// gtk_adjustment_set_upper(gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(widgets->NextInstallationSizeSpin)),0.0); -// gtk_list_store_append(widgets->PartitionsList,&iter); -// gtk_list_store_set(widgets->PartitionsList,&iter,0,json_object_get_string(path),1,json_object_get_string(size),2,free_space_string,3,json_object_get_string(fstype),-1); -// } -// yon_char_parsed_free(parsed,size); -// } -// } - void on_device_selection_changed(GtkWidget *self, main_window *widgets){ gtk_list_store_clear(widgets->PartitionsList); GtkTreeIter iter; @@ -408,41 +330,3 @@ void on_device_selection_changed(GtkWidget *self, main_window *widgets){ gtk_adjustment_set_upper(gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(widgets->NextInstallationSizeSpin)),0.0); } } - -// void on_same_installation_device_changed(GtkWidget *, main_window *widgets){ -// gtk_list_store_clear(widgets->PartitionsList); -// GtkTreeIter iter; -// GtkTreeModel *model; -// if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->SamePlaceDeviceTree)),&model,&iter)){ -// char *disk_path=""; -// gtk_tree_model_get(model,&iter,0,&disk_path,-1); -// int size; -// config_str parsed; -// parsed = yon_config_load(yon_debug_output("%s\n",get_parts_and_devices_command),&size); -// char *string = yon_char_parsed_to_string(parsed,size,""); -// struct json_object *root; -// struct json_object *blockdevices; -// root = json_tokener_parse(string); -// json_object_object_get_ex(root, "blockdevices", &blockdevices); -// for (long unsigned int i = 0; i < json_object_array_length(blockdevices); i++) { -// struct json_object *device = json_object_array_get_idx(blockdevices, i); -// struct json_object *type, *path, *size, *model, *vendor, *serial; - -// json_object_object_get_ex(device, "type", &type); -// if (strcmp("part",json_object_get_string(type))) -// continue; -// json_object_object_get_ex(device, "path", &path); -// if (!strstr(json_object_get_string(path),disk_path)){ -// continue; -// } -// json_object_object_get_ex(device, "size", &size); -// json_object_object_get_ex(device, "model", &model); -// json_object_object_get_ex(device, "vendor", &vendor); -// json_object_object_get_ex(device, "serial", &serial); - -// gtk_list_store_append(widgets->PartitionsList,&iter); -// gtk_list_store_set(widgets->PartitionsList,&iter,0,json_object_get_string(path),1,json_object_get_string(model),2,json_object_get_string(serial),3,json_object_get_string(size),4,json_object_get_string(vendor),-1); -// } -// yon_char_parsed_free(parsed,size); -// } -// } diff --git a/source/ubinstall-gtk-kernel.c b/source/ubinstall-gtk-kernel.c index dd1ed55..db1756c 100644 --- a/source/ubinstall-gtk-kernel.c +++ b/source/ubinstall-gtk-kernel.c @@ -8,8 +8,10 @@ kernel_row *yon_kernel_row_new(){ row->RowBox = yon_gtk_builder_get_widget(builder,"TableRow"); row->InstallCheck = yon_gtk_builder_get_widget(builder,"InstallCheck"); row->EnableRadio = yon_gtk_builder_get_widget(builder,"EnableRadio"); + row->EnableSeparator = yon_gtk_builder_get_widget(builder,"EnableSeparator"); row->NameLabel = yon_gtk_builder_get_widget(builder,"NameLabel"); row->TagsBox = yon_gtk_builder_get_widget(builder,"TagsBox"); + row->TagsSeparator = yon_gtk_builder_get_widget(builder,"TagsSeparator"); row->ModulesLabel = yon_gtk_builder_get_widget(builder,"ModulesLabel"); row->DescriptionLabel = yon_gtk_builder_get_widget(builder,"DescriptionLabel"); row->name=NULL; @@ -38,8 +40,6 @@ int yon_tag_add(GtkBox *target,char *tag_label, char *tag_style, char *icon_name g_object_set_data(G_OBJECT(box),"label",label); pango_attr_list_insert(attr,scale_attr); - gtk_widget_set_hexpand(box, TRUE); - gtk_widget_set_halign(box, GTK_ALIGN_FILL); gtk_style_context_add_class(gtk_widget_get_style_context(label),tag_style); GtkWidget *icon = NULL; @@ -86,52 +86,86 @@ void yon_kernel_row_setup(kernel_row *row, char *name, char *modules,char *packa row->modules = yon_char_new(modules); row->package = yon_char_new(package); - guint size; - config_str description_wrapped = yon_char_wrap_to_lines(description,3,&size); - char *description_full = yon_char_parsed_to_string(description_wrapped,size,"\n"); + char *description_full = yon_char_new(description); + if (strlen(description)>100){ + guint size; + config_str description_wrapped = yon_char_wrap_to_lines(description,3,&size); + description_full = yon_char_parsed_to_string(description_wrapped,size,"\n"); + yon_char_parsed_free(description_wrapped,size); + } gtk_label_set_label(GTK_LABEL(row->NameLabel),name); gtk_label_set_label(GTK_LABEL(row->ModulesLabel),modules); gtk_label_set_label(GTK_LABEL(row->DescriptionLabel),description_full); yon_kernel_row_setup_tags(row,tags); - yon_char_parsed_free(description_wrapped,size); free(description_full); } void yon_kernel_resize(main_window *widgets){ GList *list = gtk_container_get_children(GTK_CONTAINER(widgets->KernelListBox)); GList *iter = list; + // gtk_widget_realize(widgets->KernelListBox); + int install_size=0; + int enable_size=0; + int name_size=0; + int modules_size=0; + gtk_widget_get_preferred_width(widgets->KernelInstallLabel,&install_size,NULL); + gtk_widget_get_preferred_width(widgets->KernelEnableLabel,&enable_size,NULL); + gtk_widget_get_preferred_width(widgets->KernelNameLabel,&name_size,NULL); + gtk_widget_get_preferred_width(widgets->KernelModulesLabel,&modules_size,NULL); + + for (;iter;iter=iter->next){ + kernel_row *row = g_object_get_data(G_OBJECT(iter->data),"kernel_row"); + int cur_name_size; + int cur_modules_size; + gtk_widget_get_preferred_width(row->NameLabel,&cur_name_size,NULL); + gtk_widget_get_preferred_width(row->ModulesLabel,&cur_modules_size,NULL); + if (name_sizeKernelNameLabel),name_size,-1); + gtk_widget_set_size_request(GTK_WIDGET(widgets->KernelModulesLabel),modules_size,-1); + for (iter = list;iter;iter = iter->next){ + kernel_row *row = g_object_get_data(G_OBJECT(iter->data),"kernel_row"); + gtk_widget_set_size_request(GTK_WIDGET(row->InstallCheck),install_size,-1); + gtk_widget_set_size_request(GTK_WIDGET(row->EnableRadio),enable_size,-1); + gtk_widget_set_size_request(row->NameLabel,name_size,-1); + gtk_widget_set_size_request(row->ModulesLabel,modules_size,-1); + } + g_list_free(list); +} + +void yon_kernel_addon_resize(main_window *widgets){ + GList *list = gtk_container_get_children(GTK_CONTAINER(widgets->KernelAddonListBox)); + GList *iter = list; + // gtk_widget_realize(widgets->KernelListBox); + int install_size=0; int name_size=0; - int tags_size=0; int modules_size=0; + gtk_widget_get_preferred_width(widgets->KernelAddonInstallLabel,&install_size,NULL); + gtk_widget_get_preferred_width(widgets->KernelAddonNameLabel,&name_size,NULL); + gtk_widget_get_preferred_width(widgets->KernelAddonModulesLabel,&modules_size,NULL); + for (;iter;iter=iter->next){ kernel_row *row = g_object_get_data(G_OBJECT(iter->data),"kernel_row"); int cur_name_size; - int cur_tags_size; int cur_modules_size; - gtk_widget_realize(row->NameLabel); - gtk_widget_realize(row->TagsBox); - gtk_widget_realize(row->ModulesLabel); - while (g_main_context_iteration(NULL, FALSE)); + gtk_widget_get_preferred_width(row->NameLabel,&cur_name_size,NULL); - gtk_widget_get_preferred_width(row->TagsBox,NULL,&cur_tags_size); gtk_widget_get_preferred_width(row->ModulesLabel,&cur_modules_size,NULL); if (name_sizeKernelAddonNameLabel),name_size,-1); + gtk_widget_set_size_request(GTK_WIDGET(widgets->KernelAddonModulesLabel),modules_size,-1); for (iter = list;iter;iter = iter->next){ kernel_row *row = g_object_get_data(G_OBJECT(iter->data),"kernel_row"); + gtk_widget_set_size_request(GTK_WIDGET(row->InstallCheck),install_size,-1); gtk_widget_set_size_request(row->NameLabel,name_size,-1); - // gtk_widget_set_size_request(row->TagsBox,tags_size,-1); - GList *list = gtk_container_get_children(GTK_CONTAINER(row->TagsBox)); - for (GList *iter = list;iter;iter=iter->next){ - gtk_widget_set_size_request(GTK_WIDGET(g_object_get_data(G_OBJECT(iter->data),"label")),tags_size,-1); - - } gtk_widget_set_size_request(row->ModulesLabel,modules_size,-1); } + g_list_free(list); } void yon_kernel_setup(main_window *widgets){ @@ -150,6 +184,7 @@ void yon_kernel_setup(main_window *widgets){ int size; config_str kernels = yon_resource_open_file(kernel_list_path,&size); + gtk_size_group_add_widget(widgets->KernelSizeGroup,widgets->KernelTagsLabel); GtkWidget *radio_group = NULL; for (int i=1;iKernelListBox),row->row,-1); + gtk_size_group_add_widget(widgets->KernelSizeGroup,row->TagsBox); if (!radio_group) { radio_group = row->EnableRadio; @@ -177,4 +213,54 @@ void yon_kernel_setup(main_window *widgets){ yon_char_parsed_free(kernels,size); +} + +void yon_kernel_addon_setup(main_window *widgets){ + GList *list = gtk_container_get_children(GTK_CONTAINER(widgets->KernelAddonListBox)); + GList *iter; + for (iter = list; iter; iter = iter->next){ + kernel_row *row = g_object_get_data(G_OBJECT(iter->data),"kernel_row"); + if (row){ + if (row->name) free(row->name); + if (!yon_char_is_empty(row->modules)) free(row->modules); + free(row); + gtk_widget_destroy(GTK_WIDGET(iter->data)); + } + } + g_list_free(list); + + int size; + config_str kernels = yon_resource_open_file(kernel_list_addon_path,&size); + + GtkWidget *radio_group = NULL; + for (int i=1;iKernelAddonListBox),row->row,-1); + gtk_size_group_add_widget(widgets->KernelSizeGroup,row->TagsBox); + gtk_widget_destroy(row->TagsBox); + gtk_widget_destroy(row->TagsSeparator); + gtk_widget_destroy(row->EnableRadio); + gtk_widget_destroy(row->EnableSeparator); + + if (!radio_group) { + radio_group = row->EnableRadio; + } + gtk_radio_button_join_group(GTK_RADIO_BUTTON(row->EnableRadio),GTK_RADIO_BUTTON(radio_group)); + + yon_kernel_row_setup(row,name,modules,package,tags,description); + yon_char_parsed_free(parsed,parsed_size); + } + yon_kernel_addon_resize(widgets); + + yon_char_parsed_free(kernels,size); + + } \ No newline at end of file diff --git a/source/ubinstall-gtk-page-switch.c b/source/ubinstall-gtk-page-switch.c index d6504e5..7d6a366 100644 --- a/source/ubinstall-gtk-page-switch.c +++ b/source/ubinstall-gtk-page-switch.c @@ -10,7 +10,8 @@ enum YON_PAGES yon_page_get_next(main_window *widgets, enum YON_PAGES page){ case YON_PAGE_SECTIONS: return yon_sections_get_next_page(widgets); break; case YON_PAGE_OS_COMPONENTS: return main_config.configure_mode? YON_PAGE_KERNEL : YON_PAGE_INSTALLATION_BEGIN; break; case YON_PAGE_INSTALLATION_BEGIN: return YON_PAGE_KERNEL; break; - case YON_PAGE_KERNEL: return YON_PAGE_SOFTWARE; break; + case YON_PAGE_KERNEL: return YON_PAGE_KERNEL_ADDON; break; + case YON_PAGE_KERNEL_ADDON: return YON_PAGE_SOFTWARE; break; case YON_PAGE_SOFTWARE: return YON_PAGE_REGION; break; case YON_PAGE_REGION: return YON_PAGE_KEYBOARD; break; case YON_PAGE_KEYBOARD: return YON_PAGE_USERS; break; @@ -40,7 +41,8 @@ enum YON_PAGES yon_page_get_prev(enum YON_PAGES page){ case YON_PAGE_OS_COMPONENTS: return YON_PAGE_SECTIONS; break; case YON_PAGE_INSTALLATION_BEGIN: return YON_PAGE_SECTIONS; break; case YON_PAGE_KERNEL: return YON_PAGE_SECTIONS; break; - case YON_PAGE_SOFTWARE: return YON_PAGE_KERNEL; break; + case YON_PAGE_KERNEL_ADDON: return YON_PAGE_KERNEL; break; + case YON_PAGE_SOFTWARE: return YON_PAGE_KERNEL_ADDON; break; case YON_PAGE_REGION: return YON_PAGE_SOFTWARE; break; case YON_PAGE_KEYBOARD: return YON_PAGE_REGION; break; case YON_PAGE_USERS: return YON_PAGE_KEYBOARD; break; diff --git a/source/ubinstall-gtk-startup-services.c b/source/ubinstall-gtk-startup-services.c new file mode 100644 index 0000000..e904e6d --- /dev/null +++ b/source/ubinstall-gtk-startup-services.c @@ -0,0 +1,135 @@ +#include "ubinstall-gtk.h" + + +void on_srartup_services_toggled(GtkWidget *, char *path, main_window *widgets){ + GtkTreeIter iter; + int status; + gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(widgets->StartupList),&iter,path); + gtk_tree_model_get(GTK_TREE_MODEL(widgets->StartupList),&iter,0,&status,-1); + gtk_list_store_set(widgets->StartupList,&iter,0,!status,-1); +} + +void on_startup_services_selection_changed(GtkWidget *,main_window *widgets){ + GtkTreeIter iter; + GtkTreeModel *model; + if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->StartupServicesTree)),&model,&iter)){ + int status; + gtk_tree_model_get(model,&iter,4,&status,-1); + if (status){ + gtk_widget_set_sensitive(widgets->StartupServicesEditButton,1); + gtk_widget_set_sensitive(widgets->StartupServicesRemoveButton,1); + return; + } + } + gtk_widget_set_sensitive(widgets->StartupServicesEditButton,0); + gtk_widget_set_sensitive(widgets->StartupServicesRemoveButton,0); +} + +void on_startup_services_remove(GtkWidget *self,main_window *widgets){ + GtkTreeIter iter; + GtkTreeModel *model; + if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->StartupServicesTree)),&model,&iter)){ + char *unit; + int deletable; + gtk_tree_model_get(model,&iter,2,&unit,4,&deletable,-1); + if (!deletable) return; + dialog_confirmation_data *data = yon_confirmation_dialog_data_new(); + data->action_text = SERVICE_REMOVE_CONFIRMATION_LABEL(unit); + data->title = SERVICE_REMOVE_TITLE_LABEL; + if (yon_confirmation_dialog_call(self,data) == GTK_RESPONSE_ACCEPT){ + gtk_list_store_remove(widgets->StartupList,&iter); + } + } +} + +void yon_startup_services_setup(main_window *widgets){ + int size; + config_str services = yon_resource_open_file(services_list_path,&size); + for (int i=1;iStartupList,&iter); + gtk_list_store_set(widgets->StartupList,&iter,0,1,1,parsed[0],2,yon_char_return_if_exist(parsed[1],""),3,yon_char_return_if_exist(parsed[2],""),-1); + } + } +} + +void on_startup_add_accept(GtkWidget *self, main_window *widgets){ + startup_service_window *window = g_object_get_data(G_OBJECT(self),"startup_service_window"); + const char *unit = gtk_entry_get_text(GTK_ENTRY(window->UnitEntry)); + const char *service = gtk_entry_get_text(GTK_ENTRY(window->ServiceEntry)); + const char *description = gtk_entry_get_text(GTK_ENTRY(window->DescriptionEntry)); + if (yon_char_is_empty(service)){ + yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),_EMPTY_IMPORTANT_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); + yon_ubl_status_highlight_incorrect(window->ServiceEntry); + return; + } + GtkTreeIter iter; + gtk_list_store_append(widgets->StartupList,&iter); + gtk_list_store_set(widgets->StartupList,&iter,1,unit,2,service,3,description,4,1,-1); + on_subwindow_close(self); +} + +void on_startup_edit_accept(GtkWidget *self, main_window *widgets){ + GtkTreeIter iter; + GtkTreeModel *model; + if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->StartupServicesTree)),&model,&iter)){ + startup_service_window *window = g_object_get_data(G_OBJECT(self),"startup_service_window"); + const char *unit = gtk_entry_get_text(GTK_ENTRY(window->UnitEntry)); + const char *service = gtk_entry_get_text(GTK_ENTRY(window->ServiceEntry)); + const char *description = gtk_entry_get_text(GTK_ENTRY(window->DescriptionEntry)); + if (yon_char_is_empty(service)){ + yon_ubl_status_box_spawn(GTK_CONTAINER(window->StatusBox),_EMPTY_IMPORTANT_LABEL,5,BACKGROUND_IMAGE_FAIL_TYPE); + yon_ubl_status_highlight_incorrect(window->ServiceEntry); + return; + } + gtk_list_store_set(widgets->StartupList,&iter,1,unit,2,service,3,description,4,1,-1); + } + on_subwindow_close(self); +} + +startup_service_window *yon_startup_service_window_new(){ + startup_service_window *window = new(startup_service_window); + + GtkBuilder *builder = gtk_builder_new_from_resource(glade_path_service); + + window->Window = yon_gtk_builder_get_widget(builder,"MainWindow"); + window->StatusBox = yon_gtk_builder_get_widget(builder,"StatusBox"); + window->AcceptButton = yon_gtk_builder_get_widget(builder,"AcceptButton"); + window->CancelButton = yon_gtk_builder_get_widget(builder,"CancelButton"); + window->UnitEntry = yon_gtk_builder_get_widget(builder,"UnitEntry"); + window->ServiceEntry = yon_gtk_builder_get_widget(builder,"ServiceEntry"); + window->DescriptionEntry = yon_gtk_builder_get_widget(builder,"DescriptionEntry"); + + g_signal_connect(G_OBJECT(window->CancelButton),"clicked",G_CALLBACK(on_subwindow_close),NULL); + g_object_set_data(G_OBJECT(window->AcceptButton),"startup_service_window",window); + + return window; +} + +void on_startup_service_add(GtkWidget *, main_window *widgets){ + startup_service_window *window = yon_startup_service_window_new(); + yon_gtk_window_setup(GTK_WINDOW(window->Window),GTK_WINDOW(widgets->MainWindow),SERVICE_ADD_TITLE_LABEL,icon_path,"service_add_window"); + g_signal_connect(G_OBJECT(window->AcceptButton),"clicked",G_CALLBACK(on_startup_add_accept),widgets); + gtk_widget_show(window->Window); +} + +void on_startup_service_edit(GtkWidget *, main_window *widgets){ + GtkTreeIter iter; + if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->StartupServicesTree)),NULL,&iter)){ + char *service, *unit, *description; + int status; + gtk_tree_model_get(GTK_TREE_MODEL(widgets->StartupList),&iter,1,&unit,2,&service,3,&description,4,&status,-1); + if (status){ + startup_service_window *window = yon_startup_service_window_new(); + yon_gtk_window_setup(GTK_WINDOW(window->Window),GTK_WINDOW(widgets->MainWindow),SERVICE_EDIT_TITLE_LABEL,icon_path,"service_add_window"); + g_signal_connect(G_OBJECT(window->AcceptButton),"clicked",G_CALLBACK(on_startup_edit_accept),widgets); + gtk_entry_set_text(GTK_ENTRY(window->UnitEntry),unit); + gtk_entry_set_text(GTK_ENTRY(window->ServiceEntry),service); + gtk_entry_set_text(GTK_ENTRY(window->DescriptionEntry),description); + gtk_widget_show(window->Window); + } + } +} \ No newline at end of file diff --git a/source/ubinstall-gtk.c b/source/ubinstall-gtk.c index 6e4ac95..8c7a951 100644 --- a/source/ubinstall-gtk.c +++ b/source/ubinstall-gtk.c @@ -121,6 +121,7 @@ void yon_switch_page_render(main_window *widgets){ case YON_PAGE_INSTALL_RECOVERY: case YON_PAGE_INSTALLATION_BEGIN: case YON_PAGE_KERNEL: + case YON_PAGE_KERNEL_ADDON: case YON_PAGE_SOFTWARE: case YON_PAGE_RECOVERY_GRUB_INSTALL: case YON_PAGE_RECOVERY_GRUB_UPDATE: @@ -193,9 +194,13 @@ void yon_switch_page_render(main_window *widgets){ // // } -// void on_additional_software_toggled(){ -// -// } +void on_additional_software_toggled(GtkWidget *, char *path, main_window *widgets){ + GtkTreeIter iter; + int status; + gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(widgets->AdditionalSoftwareList),&iter,path); + gtk_tree_model_get(GTK_TREE_MODEL(widgets->AdditionalSoftwareList),&iter,0,&status,-1); + gtk_list_store_set(widgets->AdditionalSoftwareList,&iter,0,!status,-1); +} void on_gparted_open(){ yon_launch_app_with_arguments(open_gparted_command,NULL); @@ -241,7 +246,7 @@ gboolean on_yon_exit(GtkWidget *,GdkEvent*, main_window *widgets){ } - return 0; + return 1; } /**yon_main_window_complete(main_window *widgets) @@ -427,13 +432,29 @@ main_window *yon_main_window_complete(){ widgets->PackageInstallationLabel = yon_gtk_builder_get_widget(builder,"PackageInstallationLabel"); widgets->ReadFullLogButton = yon_gtk_builder_get_widget(builder,"ReadFullLogButton"); - widgets->KernelListBox = yon_gtk_builder_get_widget(builder,"KernelListBox"); + widgets->KernelInstallLabel = yon_gtk_builder_get_widget(builder,"KernelInstallLabel"); + widgets->KernelEnableLabel = yon_gtk_builder_get_widget(builder,"KernelEnableLabel"); + widgets->KernelNameLabel = yon_gtk_builder_get_widget(builder,"KernelNameLabel"); + widgets->KernelTagsLabel = yon_gtk_builder_get_widget(builder,"KernelTagsLabel"); + widgets->KernelModulesLabel = yon_gtk_builder_get_widget(builder,"KernelModulesLabel"); + widgets->KernelDescriptionLabel = yon_gtk_builder_get_widget(builder,"KernelDescriptionLabel"); + widgets->KernelSizeGroup = GTK_SIZE_GROUP(gtk_builder_get_object(builder,"TagsSizeGroup")); + + widgets->KernelAddonListBox = yon_gtk_builder_get_widget(builder,"KernelAddonListBox"); + widgets->KernelAddonInstallLabel = yon_gtk_builder_get_widget(builder,"KernelAddonInstallLabel"); + widgets->KernelAddonNameLabel = yon_gtk_builder_get_widget(builder,"KernelAddonNameLabel"); + widgets->KernelAddonModulesLabel = yon_gtk_builder_get_widget(builder,"KernelAddonModulesLabel"); + widgets->KernelAddonDescriptionLabel = yon_gtk_builder_get_widget(builder,"KernelAddonDescriptionLabel"); widgets->OSSoftwareTree = yon_gtk_builder_get_widget(builder,"OSSoftwareTree"); widgets->OSSoftwareList = GTK_LIST_STORE(gtk_builder_get_object(builder,"OSSoftwareList")); widgets->StartupServicesTree = yon_gtk_builder_get_widget(builder,"StartupServicesTree"); + widgets->StartupServicesAddButton = yon_gtk_builder_get_widget(builder,"StartupServicesAddButton"); + widgets->StartupServicesEditButton = yon_gtk_builder_get_widget(builder,"StartupServicesEditButton"); + widgets->StartupServicesRemoveButton = yon_gtk_builder_get_widget(builder,"StartupServicesRemoveButton"); + widgets->StartupChosenCell = GTK_CELL_RENDERER(gtk_builder_get_object(builder,"StartupChosenCell")); widgets->StartupList = GTK_LIST_STORE(gtk_builder_get_object(builder,"StartupList")); widgets->BootloadTimerSwitch = yon_gtk_builder_get_widget(builder,"BootloadTimerSwitch"); @@ -518,7 +539,13 @@ main_window *yon_main_window_complete(){ // gtk_tree_model_filter_set_visible_column(GTK_TREE_MODEL_FILTER(widgets->LayoutsFilter),3); // g_signal_connect(G_OBJECT(widgets->LanguageCombo),"changed",G_CALLBACK(on_locale_changed),widgets); - // g_signal_connect(G_OBJECT(widgets->AdditionalSoftwareCell),"toggled",G_CALLBACK(on_additional_software_toggled),widgets); + g_signal_connect(G_OBJECT(widgets->AdditionalSoftwareCell),"toggled",G_CALLBACK(on_additional_software_toggled),widgets); + g_signal_connect(G_OBJECT(widgets->StartupChosenCell),"toggled",G_CALLBACK(on_srartup_services_toggled),widgets); + + g_signal_connect(G_OBJECT(widgets->StartupServicesTree),"cursor-changed",G_CALLBACK(on_startup_services_selection_changed),widgets); + g_signal_connect(G_OBJECT(widgets->StartupServicesAddButton),"clicked",G_CALLBACK(on_startup_service_add),widgets); + g_signal_connect(G_OBJECT(widgets->StartupServicesEditButton),"clicked",G_CALLBACK(on_startup_service_edit),widgets); + g_signal_connect(G_OBJECT(widgets->StartupServicesRemoveButton),"clicked",G_CALLBACK(on_startup_services_remove),widgets); g_signal_connect(G_OBJECT(widgets->ManualLayoutRadio),"toggled",G_CALLBACK(yon_gtk_widget_set_sensitive_from_toggle_button),gtk_widget_get_parent(gtk_widget_get_parent(widgets->AddButton))); @@ -691,7 +718,7 @@ main_window *yon_main_window_complete(){ config_str module_parsed = yon_char_parse(parsed[i],&module_size,"|"); if (module_size){ gtk_list_store_append(widgets->AdditionalSoftwareList,&iter); - gtk_list_store_set(widgets->AdditionalSoftwareList,&iter,0,1,1,module_parsed[0],3,module_parsed[1],-1); //2,module_parsed[2] + gtk_list_store_set(widgets->AdditionalSoftwareList,&iter,0,1,1,module_parsed[0],2,module_parsed[1],3,module_parsed[2],-1); //2,module_parsed[2] yon_char_parsed_free(module_parsed,module_size); } } @@ -708,6 +735,8 @@ main_window *yon_main_window_complete(){ // yon_load_proceed(YON_CONFIG_DEFAULT); // yon_interface_update(widgets); yon_kernel_setup(widgets); + yon_kernel_addon_setup(widgets); + yon_startup_services_setup(widgets); } return widgets; } diff --git a/source/ubinstall-gtk.h b/source/ubinstall-gtk.h index 9681dfa..516c7cc 100755 --- a/source/ubinstall-gtk.h +++ b/source/ubinstall-gtk.h @@ -30,6 +30,7 @@ #define glade_path_menu_window "/com/ublinux/ui/ubinstall-gtk-menu.glade" #define glade_path_menu_item "/com/ublinux/ui/ubinstall-gtk-menu-item.glade" #define glade_path_kernel_row "/com/ublinux/ui/ubinstall-gtk-kernel-row.glade" +#define glade_path_service "/com/ublinux/ui/ubinstall-gtk-service-window.glade" #define CssPath "/com/ublinux/css/ubinstall-gtk.css" #define config_path yon_char_unite(yon_ubl_user_get_home_directory(),"/.config/",LocaleName,"/",LocaleName,".conf",NULL) @@ -53,6 +54,8 @@ #define additional_software_path "resource:///com/ublinux/csv/modules.csv" #define kernel_list_path "resource:///com/ublinux/csv/kernel-list.csv" +#define kernel_list_addon_path "resource:///com/ublinux/csv/kernel-list-addon.csv" +#define services_list_path "resource:///com/ublinux/csv/services-list.csv" #define slide_0_path "/com/ublinux/images/slide-0.png" @@ -265,6 +268,7 @@ enum YON_PAGES { YON_PAGE_OS_COMPONENTS, YON_PAGE_INSTALLATION_BEGIN, YON_PAGE_KERNEL, + YON_PAGE_KERNEL_ADDON, YON_PAGE_SOFTWARE, YON_PAGE_REGION, YON_PAGE_KEYBOARD, @@ -494,10 +498,28 @@ typedef struct { GtkWidget *HostnameSensitiveCheck; GtkWidget *KernelListBox; + GtkWidget *KernelInstallLabel; + GtkWidget *KernelEnableLabel; + GtkWidget *KernelNameLabel; + GtkWidget *KernelTagsLabel; + GtkWidget *KernelModulesLabel; + GtkWidget *KernelDescriptionLabel; + GtkSizeGroup *KernelSizeGroup; + + GtkWidget *KernelAddonListBox; + GtkWidget *KernelAddonInstallLabel; + GtkWidget *KernelAddonNameLabel; + GtkWidget *KernelAddonModulesLabel; + GtkWidget *KernelAddonDescriptionLabel; GtkWidget *OSSoftwareTree; GtkListStore *OSSoftwareList; + GtkWidget *StartupServicesTree; + GtkWidget *StartupServicesAddButton; + GtkWidget *StartupServicesEditButton; + GtkWidget *StartupServicesRemoveButton; + GtkCellRenderer *StartupChosenCell; GtkListStore *StartupList; GtkWidget *BootloadTimerSwitch; @@ -685,7 +707,9 @@ typedef struct { GtkWidget *RowBox; GtkWidget *InstallCheck; GtkWidget *EnableRadio; + GtkWidget *EnableSeparator; GtkWidget *TagsBox; + GtkWidget *TagsSeparator; GtkWidget *NameLabel; GtkWidget *DescriptionLabel; GtkWidget *ModulesLabel; @@ -695,6 +719,16 @@ typedef struct { char *package; } kernel_row; +typedef struct { + GtkWidget *Window; + GtkWidget *StatusBox; + GtkWidget *UnitEntry; + GtkWidget *ServiceEntry; + GtkWidget *DescriptionEntry; + GtkWidget *CancelButton; + GtkWidget *AcceptButton; +} startup_service_window; + void config_init(); main_window *yon_main_window_complete(); ubinstall_language_window *yon_ubinstall_language_new(); @@ -822,4 +856,17 @@ void yon_kernel_row_setup(kernel_row *row, char *name, char *modules,char *packa void yon_kernel_row_setup_tags(kernel_row *row, char *tags); int yon_tag_add(GtkBox *target,char *tag_label, char *tag_style, char *icon_name); kernel_row *yon_kernel_row_new(); -void yon_kernel_resize(main_window *widgets); \ No newline at end of file +void yon_kernel_resize(main_window *widgets); +void on_additional_software_toggled(GtkWidget *, char *path, main_window *widgets); +void yon_kernel_addon_setup(main_window *widgets); +void yon_kernel_addon_resize(main_window *widgets); +void yon_startup_services_setup(main_window *widgets); +void on_srartup_services_toggled(GtkWidget *, char *path, main_window *widgets); +void on_startup_service_edit(GtkWidget *, main_window *widgets); +void on_startup_service_add(GtkWidget *, main_window *widgets); +startup_service_window *yon_startup_service_window_new(); +void on_startup_edit_accept(GtkWidget *, main_window *widgets); +void on_startup_add_accept(GtkWidget *, main_window *widgets); +void yon_startup_services_setup(main_window *widgets); +void on_startup_services_remove(GtkWidget *self,main_window *widgets); +void on_startup_services_selection_changed(GtkWidget *,main_window *widgets); \ No newline at end of file diff --git a/source/ubl-strings.h b/source/ubl-strings.h index f44e209..07601ba 100644 --- a/source/ubl-strings.h +++ b/source/ubl-strings.h @@ -195,4 +195,9 @@ #define RECOMENDED_TAG _("Recomended") #define HARDENED_TAG _("Hardened") #define REALTIME_TAG _("RealTime") -#define STABLE_TAG _("Stable") \ No newline at end of file +#define STABLE_TAG _("Stable") + +#define SERVICE_REMOVE_CONFIRMATION_LABEL(target) yon_char_unite(_("Are you sure want to remove service")," ",target," ",_("from the list"),"?",NULL) +#define SERVICE_ADD_TITLE_LABEL _("Add service") +#define SERVICE_EDIT_TITLE_LABEL _("Edit service") +#define SERVICE_REMOVE_TITLE_LABEL _("Remove service") \ No newline at end of file diff --git a/ubinstall-gtk-kernel-row.glade b/ubinstall-gtk-kernel-row.glade index 74540e0..8ca911b 100644 --- a/ubinstall-gtk-kernel-row.glade +++ b/ubinstall-gtk-kernel-row.glade @@ -13,7 +13,7 @@ True False 5 - 15 + 7 True @@ -31,11 +31,23 @@ 0 + + + True + False + + + False + True + 1 + + True True False + center 5 True True @@ -46,38 +58,44 @@ False True - 1 + 2 - + True False - center - 5 - 5 - vertical - 1 - - - True - False - Name - True - False - 0 - - - False - True - 0 - - False True - 2 + 3 + + + + + True + False + Name + True + False + 0 + + + False + True + 4 + + + + + True + False + + + False + True + 5 @@ -97,7 +115,18 @@ False True - 3 + 6 + + + + + True + False + + + False + True + 7 @@ -111,7 +140,7 @@ False True - 4 + 8 @@ -125,7 +154,18 @@ True True end - 6 + 9 + + + + + True + False + + + False + True + 10