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
+
+
+
+ False
+ True
+ 1
+
+
-
+
+
+ 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