diff --git a/applications-list.csv b/applications-list.csv
new file mode 100644
index 0000000..8380b4a
--- /dev/null
+++ b/applications-list.csv
@@ -0,0 +1,4 @@
+GROUP;APPLICATION;DESCRIPTION
+Plank dock-panel;plank.desktop;Universal macOS-style dock-panel
+Conky monitor;conky.desktop;System monitor
+Hostalive;check-hostalive.desktop;Check the internet is alive
\ No newline at end of file
diff --git a/gresource.xml b/gresource.xml
index 8c9575b..eaee9ad 100644
--- a/gresource.xml
+++ b/gresource.xml
@@ -46,5 +46,6 @@
filesystems-format-list.csv
groups-list.csv
vfs-list.csv
+ applications-list.csv
\ No newline at end of file
diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt
index a1b596f..5bf8753 100644
--- a/source/CMakeLists.txt
+++ b/source/CMakeLists.txt
@@ -67,6 +67,7 @@ set(DEPENDFILES
../filesystems-format-list.csv
../groups-list.csv
../vfs-list.csv
+ ../applications-list.csv
../icons-builtin/install_type_custom_normal.png
../icons-builtin/install_type_data_only_normal.png
../icons-builtin/install_type_fast_normal.png
@@ -136,6 +137,7 @@ set(SOURCE_FILES
ubinstall-gtk-kernel.c
ubinstall-gtk-language.c
ubinstall-gtk-config-hub.c
+ ubinstall-gtk-startup-apps.c
ubinstall-gtk.h
ubl-strings.h
)
diff --git a/source/ubinstall-gtk-components.c b/source/ubinstall-gtk-components.c
index 2f46b4f..30f8463 100644
--- a/source/ubinstall-gtk-components.c
+++ b/source/ubinstall-gtk-components.c
@@ -54,7 +54,6 @@ int yon_os_components_save(main_window *widgets){
GList *list = gtk_container_get_children(GTK_CONTAINER(widgets->OSSoftwareListBox));
GList *iter;
int size;
- int overall_num=0;
config_str modules = NULL;
for(iter = list;iter;iter=iter->next){
os_row *row = g_object_get_data(iter->data,"kernel_row");
@@ -63,12 +62,9 @@ int yon_os_components_save(main_window *widgets){
if (status){
yon_char_parsed_add_or_create_if_exists(modules,&size,target);
}
- overall_num++;
}
g_list_free(list);
- if (size&&size==overall_num){
- yon_config_register(modules_parameter,modules_parameter_command,"auto");
- } else if (size){
+ if (size){
char *final = yon_char_parsed_to_string(modules,size,",");
yon_config_register(modules_parameter,modules_parameter_command,final);
} else {
diff --git a/source/ubinstall-gtk-config-hub.c b/source/ubinstall-gtk-config-hub.c
index 4e3d292..1aef884 100644
--- a/source/ubinstall-gtk-config-hub.c
+++ b/source/ubinstall-gtk-config-hub.c
@@ -178,6 +178,7 @@ void yon_configuration_hub_init(main_window *widgets){
yon_configuration_hub_add(GTK_FLOW_BOX(widgets->HubPersonalListBox),KEYBOARD_TAB_LABEL,"com.ublinux.ubl-settings-keyboard",YON_PAGE_KEYBOARD);
yon_configuration_hub_add(GTK_FLOW_BOX(widgets->HubSystemListBox),USERS_TAB_LABEL,"com.ublinux.ubl-settings-usergroups",YON_PAGE_USERS);
yon_configuration_hub_add(GTK_FLOW_BOX(widgets->HubSystemListBox),STARTUP_LABEL,"com.ublinux.ubl-settings-info",YON_PAGE_STARTUP);
+ yon_configuration_hub_add(GTK_FLOW_BOX(widgets->HubSystemListBox),STARTUP_APP_LABEL,"com.ublinux.ubl-settings-info",YON_PAGE_APP_STARTUP);
yon_configuration_hub_add(GTK_FLOW_BOX(widgets->HubSystemListBox),BOOTLOADER_LABEL,"com.ublinux.ubl-settings-bootloader",YON_PAGE_BOOTLOADER);
yon_configuration_hub_add(GTK_FLOW_BOX(widgets->HubSystemListBox),NETWORK_LABEL,"com.ublinux.ubl-settings-multiseat",YON_PAGE_NETWORK);
yon_configuration_hub_add(GTK_FLOW_BOX(widgets->HubPackagesListBox),KERNEL_LABEL,kernel_icon_path,YON_PAGE_KERNEL);
diff --git a/source/ubinstall-gtk-installation.c b/source/ubinstall-gtk-installation.c
index c20e618..9201f23 100644
--- a/source/ubinstall-gtk-installation.c
+++ b/source/ubinstall-gtk-installation.c
@@ -463,7 +463,12 @@ void yon_install_init(main_window *widgets, enum YON_PAGES page){
yon_char_parsed_free(fs_types,size);
char *parameter = config(part_fs_type_parameter);
if (!yon_char_is_empty(parameter)){
- gtk_combo_box_set_active_id(GTK_COMBO_BOX(fs_type_combo),parameter);
+ if (!gtk_combo_box_set_active_id(GTK_COMBO_BOX(fs_type_combo),parameter)){
+ if(gtk_combo_box_get_has_entry(GTK_COMBO_BOX(fs_type_combo))){
+ gtk_entry_set_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(fs_type_combo))),parameter);
+ }
+ }
+
} else {
gtk_combo_box_set_active(GTK_COMBO_BOX(fs_type_combo),0);
}
diff --git a/source/ubinstall-gtk-page-switch.c b/source/ubinstall-gtk-page-switch.c
index 414e2a8..d937eea 100644
--- a/source/ubinstall-gtk-page-switch.c
+++ b/source/ubinstall-gtk-page-switch.c
@@ -18,7 +18,7 @@ enum YON_PAGES yon_page_get_next(main_window *widgets, enum YON_PAGES page){
case YON_PAGE_REGION: return YON_PAGE_CONFIG_HUB; break;
case YON_PAGE_LANGUAGE: return YON_PAGE_CONFIG_HUB; break;
case YON_PAGE_KEYBOARD: return YON_PAGE_CONFIG_HUB; break;
- case YON_PAGE_USERS: return YON_PAGE_CONFIG_HUB; break;
+ case YON_PAGE_USERS: return YON_PAGE_CONFIG_HUB; break;
case YON_PAGE_STARTUP: return YON_PAGE_CONFIG_HUB; break;
case YON_PAGE_APP_STARTUP: return YON_PAGE_CONFIG_HUB; break;
case YON_PAGE_BOOTLOADER: return YON_PAGE_CONFIG_HUB; break;
diff --git a/source/ubinstall-gtk-startup-apps.c b/source/ubinstall-gtk-startup-apps.c
new file mode 100644
index 0000000..26e8d45
--- /dev/null
+++ b/source/ubinstall-gtk-startup-apps.c
@@ -0,0 +1,218 @@
+#include "ubinstall-gtk.h"
+
+void on_srartup_apps_toggled(GtkWidget *, char *path, main_window *widgets){
+ GtkTreeIter iter;
+ int status;
+ gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(widgets->StartupAppsList),&iter,path);
+ gtk_tree_model_get(GTK_TREE_MODEL(widgets->StartupAppsList),&iter,0,&status,-1);
+ gtk_list_store_set(widgets->StartupAppsList,&iter,0,!status,-1);
+}
+
+void on_startup_apps_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->StartupAppsTree)),&model,&iter)){
+ int status;
+ gtk_tree_model_get(model,&iter,4,&status,-1);
+ if (status){
+ gtk_widget_set_sensitive(widgets->StartupAppsEditButton,1);
+ gtk_widget_set_sensitive(widgets->StartupAppsRemoveButton,1);
+ return;
+ }
+ }
+ gtk_widget_set_sensitive(widgets->StartupAppsEditButton,0);
+ gtk_widget_set_sensitive(widgets->StartupAppsRemoveButton,0);
+}
+
+void on_startup_apps_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->StartupAppsTree)),&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_apps_setup(main_window *widgets){
+ GtkTreeIter iter;
+ if (!gtk_tree_model_get_iter_first(GTK_TREE_MODEL(widgets->StartupAppsList),&iter)){
+ int size;
+ config_str apps = yon_resource_open_file(apps_list_path,&size);
+ for (int i=1;iStartupAppsList,&iter);
+ gtk_list_store_set(widgets->StartupAppsList,&iter,0,1,1,parsed[0],2,yon_char_return_if_exist(parsed[1],""),3,yon_char_return_if_exist(parsed[2],""),-1);
+ }
+ }
+ }
+ char *startup = config(SERVICES_ENABLE_parameter);
+ if (!yon_char_is_empty(startup)){
+ if (!strcmp(startup,"auto")){
+ for_iter(GTK_TREE_MODEL(widgets->StartupAppsList),&iter){
+ gtk_list_store_set(widgets->StartupAppsList,&iter,0,1,-1);
+ }
+ } else {
+ int parsed_size;
+ config_str parsed = yon_char_parse(startup,&parsed_size,",");
+ for_iter(GTK_TREE_MODEL(widgets->StartupAppsList),&iter){
+ char *target;
+ gtk_tree_model_get(GTK_TREE_MODEL(widgets->StartupAppsList),&iter,2,&target,-1);
+ if (strstr(target,",")){
+ int target_size;
+ config_str target_parsed = yon_char_parse(target,&target_size,",");
+ int found =0;
+ for (int i=0;i-1){
+ found++;
+ parsed = yon_char_parsed_rip(parsed,&parsed_size,pos);
+ }
+ }
+ if (found == target_size){
+ gtk_list_store_set(widgets->StartupAppsList,&iter,0,1,-1);
+ } else {
+ gtk_list_store_set(widgets->StartupAppsList,&iter,0,0,-1);
+ }
+ yon_char_parsed_free(target_parsed,target_size);
+ } else {
+ int pos = yon_char_parsed_check_exist(parsed,parsed_size,target);
+ if (pos>-1){
+ gtk_list_store_set(widgets->StartupAppsList,&iter,0,1,-1);
+ parsed = yon_char_parsed_rip(parsed,&parsed_size,pos);
+ } else {
+ gtk_list_store_set(widgets->StartupAppsList,&iter,0,0,-1);
+ }
+ }
+ }
+ if (parsed_size&&parsed){
+ for (int i=0;iStartupAppsList,&iter);
+ gtk_list_store_set(widgets->StartupAppsList,&iter,0,1,2,parsed[i],-1);
+ }
+ }
+ yon_char_parsed_free(parsed,parsed_size);
+ }
+ }
+}
+
+void on_startup_app_add_accept(GtkWidget *self, main_window *widgets){
+ startup_app_window *window = g_object_get_data(G_OBJECT(self),"startup_app_window");
+ const char *unit = gtk_entry_get_text(GTK_ENTRY(window->UnitEntry));
+ const char *app = gtk_entry_get_text(GTK_ENTRY(window->ServiceEntry));
+ const char *description = gtk_entry_get_text(GTK_ENTRY(window->DescriptionEntry));
+ if (yon_char_is_empty(app)){
+ 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->StartupAppsList,&iter);
+ gtk_list_store_set(widgets->StartupAppsList,&iter,0,1,1,unit,2,app,3,description,4,1,-1);
+ on_subwindow_close(self);
+}
+
+void on_startup_app_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_app_window *window = g_object_get_data(G_OBJECT(self),"startup_app_window");
+ const char *unit = gtk_entry_get_text(GTK_ENTRY(window->UnitEntry));
+ const char *app = gtk_entry_get_text(GTK_ENTRY(window->ServiceEntry));
+ const char *description = gtk_entry_get_text(GTK_ENTRY(window->DescriptionEntry));
+ if (yon_char_is_empty(app)){
+ 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->StartupAppsList,&iter,0,1,1,unit,2,app,3,description,4,1,-1);
+ }
+ on_subwindow_close(self);
+}
+
+startup_app_window *yon_startup_app_window_new(){
+ startup_app_window *window = new(startup_app_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");
+ window->AppLabel = yon_gtk_builder_get_widget(builder,"AppLabel");
+ window->GroupLabel = yon_gtk_builder_get_widget(builder,"GroupLabel");
+ window->DescriptionLabel = yon_gtk_builder_get_widget(builder,"DescriptionLabel");
+ gtk_label_set_text(GTK_LABEL(window->AppLabel),APP_LABEL);
+ gtk_label_set_text(GTK_LABEL(window->AppLabel),GROUP_LABEL);
+
+ g_signal_connect(G_OBJECT(window->CancelButton),"clicked",G_CALLBACK(on_subwindow_close),NULL);
+ g_object_set_data(G_OBJECT(window->AcceptButton),"startup_app_window",window);
+
+ return window;
+}
+
+void on_startup_app_add(GtkWidget *, main_window *widgets){
+ startup_app_window *window = yon_startup_app_window_new();
+ yon_gtk_window_setup(GTK_WINDOW(window->Window),GTK_WINDOW(widgets->MainWindow),SERVICE_ADD_TITLE_LABEL,icon_path,"app_add_window");
+ g_signal_connect(G_OBJECT(window->AcceptButton),"clicked",G_CALLBACK(on_startup_app_add_accept),widgets);
+ gtk_widget_show(window->Window);
+}
+
+void on_startup_app_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 *app, *unit, *description;
+ int status;
+ gtk_tree_model_get(GTK_TREE_MODEL(widgets->StartupAppsList),&iter,1,&unit,2,&app,3,&description,4,&status,-1);
+ if (status){
+ startup_app_window *window = yon_startup_app_window_new();
+ yon_gtk_window_setup(GTK_WINDOW(window->Window),GTK_WINDOW(widgets->MainWindow),SERVICE_EDIT_TITLE_LABEL,icon_path,"app_add_window");
+ g_signal_connect(G_OBJECT(window->AcceptButton),"clicked",G_CALLBACK(on_startup_app_edit_accept),widgets);
+ gtk_entry_set_text(GTK_ENTRY(window->UnitEntry),unit);
+ gtk_entry_set_text(GTK_ENTRY(window->ServiceEntry),app);
+ gtk_entry_set_text(GTK_ENTRY(window->DescriptionEntry),description);
+ gtk_widget_show(window->Window);
+ }
+ }
+}
+
+int yon_startup_app_save(main_window *widgets){
+ GtkTreeIter iter;
+ GtkTreeModel *model = GTK_TREE_MODEL(widgets->StartupList);
+ int size = 0;
+ int list_size=0;
+ config_str modules = NULL;
+ for_iter(model,&iter){
+ list_size++;
+ char *target;
+ int status;
+ gtk_tree_model_get(model,&iter,0,&status,2,&target,-1);
+ if (status){
+ yon_char_parsed_add_or_create_if_exists(modules,&size,target);
+ }
+ }
+ if (size){
+ if (list_size==size){
+ yon_config_register(SERVICES_ENABLE_parameter,SERVICES_ENABLE_parameter_command,"auto");
+ } else {
+ char *final = yon_char_parsed_to_string(modules,size,",");
+ yon_config_register(SERVICES_ENABLE_parameter,SERVICES_ENABLE_parameter_command,final);
+ }
+ yon_char_parsed_free(modules,size);
+ } else {
+ yon_config_remove_by_key(SERVICES_ENABLE_parameter);
+ }
+ return 1;
+}
\ No newline at end of file
diff --git a/source/ubinstall-gtk.c b/source/ubinstall-gtk.c
index e847944..b6175f4 100644
--- a/source/ubinstall-gtk.c
+++ b/source/ubinstall-gtk.c
@@ -405,6 +405,7 @@ void on_exit_accepted(main_window *widgets){
main_config.exit_accepted=1;
while(gtk_events_pending()) gtk_main_iteration();
gtk_widget_destroy(widgets->MainWindow);
+ gtk_main_quit();
}
gboolean on_yon_exit(GtkWidget *,GdkEvent*, main_window *widgets){
@@ -822,6 +823,13 @@ void yon_main_window_create(main_window *widgets){
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->StartupAppsTree = yon_gtk_builder_get_widget(builder,"StartupAppsTree");
+ widgets->StartupAppsAddButton = yon_gtk_builder_get_widget(builder,"StartupAppsAddButton");
+ widgets->StartupAppsEditButton = yon_gtk_builder_get_widget(builder,"StartupAppsEditButton");
+ widgets->StartupAppsRemoveButton = yon_gtk_builder_get_widget(builder,"StartupAppsRemoveButton");
+ widgets->StartupAppsChosenCell = GTK_CELL_RENDERER(gtk_builder_get_object(builder,"StartupAppsChosenCell"));
+ widgets->StartupAppsList = GTK_LIST_STORE(gtk_builder_get_object(builder,"StartupAppsList"));
// widgets->BootloaderImage = yon_gtk_builder_get_widget(builder,"BootloaderImage");
widgets->BootloadTimerSwitch = yon_gtk_builder_get_widget(builder,"BootloadTimerSwitch");
@@ -942,7 +950,11 @@ void yon_main_window_create(main_window *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->StartupAppsTree),"cursor-changed",G_CALLBACK(on_startup_apps_selection_changed),widgets);
+ g_signal_connect(G_OBJECT(widgets->StartupAppsAddButton),"clicked",G_CALLBACK(on_startup_app_add),widgets);
+ g_signal_connect(G_OBJECT(widgets->StartupAppsEditButton),"clicked",G_CALLBACK(on_startup_app_edit),widgets);
+ g_signal_connect(G_OBJECT(widgets->StartupAppsRemoveButton),"clicked",G_CALLBACK(on_startup_apps_remove),widgets);
g_signal_connect(G_OBJECT(widgets->AutoHostnameCheck),"toggled",G_CALLBACK(yon_gtk_widget_set_sensitive_from_toggle_button_inversed),widgets->HotnameEntry);
diff --git a/source/ubinstall-gtk.h b/source/ubinstall-gtk.h
index 6a48b51..ac06a20 100755
--- a/source/ubinstall-gtk.h
+++ b/source/ubinstall-gtk.h
@@ -77,6 +77,7 @@
#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 apps_list_path "resource:///com/ublinux/csv/applications-list.csv"
#define network_path "resource:///com/ublinux/csv/network-list.csv"
#define fs_types_path "resource:///com/ublinux/csv/filesystems-format-list.csv"
#define vfs_list_path "resource:///com/ublinux/csv/vfs-list.csv"
@@ -682,6 +683,12 @@ typedef struct {
GtkWidget *StartupServicesRemoveButton;
GtkCellRenderer *StartupChosenCell;
GtkListStore *StartupList;
+ GtkWidget *StartupAppsTree;
+ GtkWidget *StartupAppsAddButton;
+ GtkWidget *StartupAppsEditButton;
+ GtkWidget *StartupAppsRemoveButton;
+ GtkCellRenderer *StartupAppsChosenCell;
+ GtkListStore *StartupAppsList;
// GtkWidget *BootloaderImage;
GtkWidget *BootloadTimerSwitch;
@@ -962,6 +969,19 @@ typedef struct {
GtkWidget *AcceptButton;
} startup_service_window;
+typedef struct {
+ GtkWidget *Window;
+ GtkWidget *StatusBox;
+ GtkWidget *UnitEntry;
+ GtkWidget *ServiceEntry;
+ GtkWidget *DescriptionEntry;
+ GtkWidget *CancelButton;
+ GtkWidget *AcceptButton;
+ GtkWidget *AppLabel;
+ GtkWidget *GroupLabel;
+ GtkWidget *DescriptionLabel;
+} startup_app_window;
+
struct pacman_struct{
main_window *widgets;
const char *find_package;
@@ -1403,4 +1423,15 @@ gboolean yon_software_insert(struct row_data *row_input);
int yon_configuration_hub_save(main_window *widgets);
int yon_packages_tab_save(main_window *widgets);
gboolean on_install_slider_slide_proceed(main_window *widgets);
-gboolean on_install_slider_slide(main_window *widgets);
\ No newline at end of file
+gboolean on_install_slider_slide(main_window *widgets);
+
+void on_srartup_apps_toggled(GtkWidget *, char *path, main_window *widgets);
+void on_startup_apps_selection_changed(GtkWidget *,main_window *widgets);
+void on_startup_apps_remove(GtkWidget *self,main_window *widgets);
+void yon_startup_apps_setup(main_window *widgets);
+void on_startup_app_add_accept(GtkWidget *self, main_window *widgets);
+void on_startup_app_edit_accept(GtkWidget *self, main_window *widgets);
+startup_app_window *yon_startup_app_window_new();
+void on_startup_app_add(GtkWidget *, main_window *widgets);
+void on_startup_app_edit(GtkWidget *, main_window *widgets);
+int yon_startup_app_save(main_window *widgets);
\ No newline at end of file
diff --git a/source/ubl-strings.h b/source/ubl-strings.h
index fe09696..716161f 100644
--- a/source/ubl-strings.h
+++ b/source/ubl-strings.h
@@ -275,11 +275,19 @@ NULL)
#define PACMAN_SOFTWARE_LABEL _("Installing Packages")
#define REGION_ICON_LABEL _("Location")
#define STARTUP_LABEL _("Startup services")
+#define STARTUP_APP_LABEL _("Autorun of services")
#define BOOTLOADER_LABEL _("Boot load")
#define NETWORK_LABEL _("Network")
#define ENABLE_VNC_LABEL _("Enable VNC server")
#define ENABLE_RDP_LABEL _("Enable RDP server")
+#define APP_TITLE_LABEL _("Autorun of application")
+#define APP_TITLE_INFO_LABEL _("Configuring autorun application")
+#define APP_LABEL _("Application:")
+#define GROUP_LABEL _("Group:")
+#define APP_TABLE_LABEL _("Application")
+#define GROUP_TABLE_LABEL _("Group")
+
// #define _LABEL _("Package:")
// #define _LABEL _("Module:")
// #define _LABEL _("New section at")
diff --git a/ubinstall-gtk-service-window.glade b/ubinstall-gtk-service-window.glade
index a369131..b10860d 100644
--- a/ubinstall-gtk-service-window.glade
+++ b/ubinstall-gtk-service-window.glade
@@ -1,5 +1,5 @@
-
+
@@ -54,7 +54,7 @@
False
5
-