diff --git a/icons/com.ublinux.ubl-settings-services.cancel-uncolored-symbolic.svg b/icons/com.ublinux.ubl-settings-services.cancel-uncolored-symbolic.svg index aa858f9..cd84b0e 100644 --- a/icons/com.ublinux.ubl-settings-services.cancel-uncolored-symbolic.svg +++ b/icons/com.ublinux.ubl-settings-services.cancel-uncolored-symbolic.svg @@ -1,49 +1 @@ - - - - - - - - - - + \ No newline at end of file diff --git a/icons/com.ublinux.ubl-settings-services.important-symbolic.svg b/icons/com.ublinux.ubl-settings-services.important-symbolic.svg index ff8d4b3..1ba5b9e 100644 --- a/icons/com.ublinux.ubl-settings-services.important-symbolic.svg +++ b/icons/com.ublinux.ubl-settings-services.important-symbolic.svg @@ -1,55 +1 @@ - - - - - - image/svg+xml - - - - - - - - + \ No newline at end of file diff --git a/icons/com.ublinux.ubl-settings-services.lookup-symbolic.svg b/icons/com.ublinux.ubl-settings-services.lookup-symbolic.svg index f442cd0..163827f 100644 --- a/icons/com.ublinux.ubl-settings-services.lookup-symbolic.svg +++ b/icons/com.ublinux.ubl-settings-services.lookup-symbolic.svg @@ -1,55 +1 @@ - - - - - - - - - - - - + \ No newline at end of file diff --git a/source/ubl-settings-services.c b/source/ubl-settings-services.c index 24aaf4a..935b734 100644 --- a/source/ubl-settings-services.c +++ b/source/ubl-settings-services.c @@ -5,44 +5,46 @@ config main_config; //functions void yon_load_proceed(YON_CONFIG_TYPE type){ - if (yon_config_load_register(type,"config","SERVICESSTART SERVICESNOSTART SERVICESMASK",NULL)){ + if (yon_config_load_register(type,"system","SERVICES_ENABLE SERVICES_DISABLE SERVICES_MASK",NULL)){ } } void on_config_local_load(GtkWidget *self,main_window *widgets){ - if (self){}; - yon_load_proceed(YON_CONFIG_LOCAL); - yon_ubl_status_box_render(LIST_LOAD_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); - g_thread_new("",(GThreadFunc)yon_interface_update,widgets); - main_config.load_mode=1; - textdomain(template_ui_LocaleName); - textdomain(LocaleName); + if (!main_config.update_thread_active){ + main_config.update_thread_active=1; + if (self){}; + yon_load_proceed(YON_CONFIG_LOCAL); + yon_ubl_status_box_render(LIST_LOAD_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); + gdk_threads_add_idle((GSourceFunc)((gboolean*)(void*)yon_interface_update),widgets); + main_config.load_mode=1; + } } void on_config_global_load(GtkWidget *self,main_window *widgets){ - if (self){}; - yon_load_proceed(YON_CONFIG_GLOBAL); - yon_ubl_status_box_render(LIST_LOAD_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); - g_thread_new("",(GThreadFunc)yon_interface_update,widgets); - main_config.load_mode=0; - textdomain(template_ui_LocaleName); - textdomain(LocaleName); + if (!main_config.update_thread_active){ + main_config.update_thread_active=1; + if (self){}; + yon_load_proceed(YON_CONFIG_GLOBAL); + yon_ubl_status_box_render(LIST_LOAD_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); + gdk_threads_add_idle((GSourceFunc)((gboolean*)(void*)yon_interface_update),widgets); + main_config.load_mode=0; + } } void on_config_global_local_save(){ - yon_save_proceed(NULL,YON_CONFIG_BOTH,"config","SERVICESSTART SERVICESNOSTART SERVICESMASK",NULL); + yon_save_proceed(NULL,YON_CONFIG_BOTH,"system","SERVICES_ENABLE SERVICES_DISABLE SERVICES_MASK",NULL); } void on_config_local_save(){ - yon_save_proceed("local",YON_CONFIG_LOCAL,"config","SERVICESSTART SERVICESNOSTART SERVICESMASK",NULL); + yon_save_proceed("local",YON_CONFIG_LOCAL,"system","SERVICES_ENABLE SERVICES_DISABLE SERVICES_MASK",NULL); } void on_config_global_save(){ - yon_save_proceed("global",YON_CONFIG_GLOBAL,"config","SERVICESSTART SERVICESNOSTART SERVICESMASK",NULL); + yon_save_proceed("global",YON_CONFIG_GLOBAL,"system","SERVICES_ENABLE SERVICES_DISABLE SERVICES_MASK",NULL); } @@ -112,22 +114,22 @@ void on_config_autostart_clicked(GtkWidget *self, main_window *widgets){ free(name); name=parsed_name; gtk_list_store_set(GTK_LIST_STORE(widgets->liststore2),&iter,0,!status,-1); - char *config_sting = yon_config_get_by_key("SERVICESSTART"); + char *config_sting = yon_config_get_by_key("SERVICES_ENABLE"); int size; config_str parsed = yon_char_parse(config_sting,&size,","); int place = yon_char_parsed_check_exist(parsed,size,name); if (status==0){ if (place ==-1){ - if (!yon_config_append("SERVICESSTART",name,",")){ - yon_config_register("SERVICESSTART","[config]",name); + if (!yon_config_append("SERVICES_ENABLE",name,",")){ + yon_config_register("SERVICES_ENABLE","[system]",name); } } } else { if (place !=-1){ parsed = yon_char_parsed_rip(parsed,&size,place); if (parsed) - yon_config_set("SERVICESSTART",yon_char_parsed_to_string(parsed,size,",")); - else yon_config_remove_by_key("SERVICESSTART"); + yon_config_set("SERVICES_ENABLE",yon_char_parsed_to_string(parsed,size,",")); + else yon_config_remove_by_key("SERVICES_ENABLE"); } } yon_char_parsed_free(parsed,size); @@ -146,22 +148,22 @@ void on_config_autostop_clicked(GtkWidget *self, main_window *widgets){ free(name); name=parsed_name; gtk_list_store_set(GTK_LIST_STORE(widgets->liststore2),&iter,1,!status,-1); - char *config_sting = yon_config_get_by_key("SERVICESNOSTART"); + char *config_sting = yon_config_get_by_key("SERVICES_DISABLE"); int size; config_str parsed = yon_char_parse(config_sting,&size,","); int place = yon_char_parsed_check_exist(parsed,size,name); if (status==0){ if (place ==-1){ - if (!yon_config_append("SERVICESNOSTART",name,",")){ - yon_config_register("SERVICESNOSTART","[config]",name); + if (!yon_config_append("SERVICES_DISABLE",name,",")){ + yon_config_register("SERVICES_DISABLE","[system]",name); } } } else { if (place !=-1){ parsed = yon_char_parsed_rip(parsed,&size,place); if (parsed) - yon_config_set("SERVICESNOSTART",yon_char_parsed_to_string(parsed,size,",")); - else yon_config_remove_by_key("SERVICESNOSTART"); + yon_config_set("SERVICES_DISABLE",yon_char_parsed_to_string(parsed,size,",")); + else yon_config_remove_by_key("SERVICES_DISABLE"); } } yon_char_parsed_free(parsed,size); @@ -181,22 +183,22 @@ void on_config_block_clicked(GtkWidget *self, main_window *widgets){ free(name); name=parsed_name; gtk_list_store_set(GTK_LIST_STORE(widgets->liststore2),&iter,2,!status,-1); - char *config_sting = yon_config_get_by_key("SERVICESMASK"); + char *config_sting = yon_config_get_by_key("SERVICES_MASK"); int size; config_str parsed = yon_char_parse(config_sting,&size,","); int place = yon_char_parsed_check_exist(parsed,size,name); if (status==0){ if (place ==-1){ - if (!yon_config_append("SERVICESMASK",name,",")){ - yon_config_register("SERVICESMASK","[config]",name); + if (!yon_config_append("SERVICES_MASK",name,",")){ + yon_config_register("SERVICES_MASK","[system]",name); } } } else { if (place !=-1){ parsed = yon_char_parsed_rip(parsed,&size,place); if (parsed) - yon_config_set("SERVICESMASK",yon_char_parsed_to_string(parsed,size,",")); - else yon_config_remove_by_key("SERVICESMASK"); + yon_config_set("SERVICES_MASK",yon_char_parsed_to_string(parsed,size,",")); + else yon_config_remove_by_key("SERVICES_MASK"); } } yon_char_parsed_free(parsed,size); @@ -219,6 +221,12 @@ void on_system_autostart_clicked(GtkWidget *self, main_window *widgets){ } +void on_system_kill_confirmed(GtkWidget *self,char *service_name){ + if (self){}; + char *command = service_kill_command(service_name); + yon_launch(command); +} + void on_system_launch_clicked(GtkWidget *self, main_window *widgets){ if (self){}; GtkTreeIter iter; @@ -227,9 +235,29 @@ void on_system_launch_clicked(GtkWidget *self, main_window *widgets){ gboolean status = 0; char *service_name; gtk_tree_model_get(model,&iter,4,&status,5,&service_name,-1); - gtk_list_store_set(GTK_LIST_STORE(widgets->liststore2),&iter,4,!status,-1); yon_launch((!status)==1 ? service_start_command(service_name) : \ service_stop_command(service_name)); + int size; + config_str result = yon_config_load(service_check_active_command(service_name),&size); + yon_char_remove_last_symbol(result[0],'\n'); + if (size>0){ + if (!strcmp(result[0],"active")){ + if (status){ + dialog_confirmation_data data; + data.action_text=STOP_SERVICE_WARMING_LABEL(service_name); + data.function=(void*)(void*)on_system_kill_confirmed; + data.data=service_name; + int answer = yon_confirmation_dialog_call(self,&data); + if (answer) + gtk_list_store_set(GTK_LIST_STORE(widgets->liststore2),&iter,4,0,-1); + } else { + gtk_list_store_set(GTK_LIST_STORE(widgets->liststore2),&iter,4,1,-1); + } + } else { + gtk_list_store_set(GTK_LIST_STORE(widgets->liststore2),&iter,4,0,-1); + } + } + yon_char_parsed_free(result,size); } } @@ -241,12 +269,6 @@ gboolean yon_service_source_check(GtkTreeModel *model, GtkTreeIter *iter,void *d return 1; } -void on_source_changed(GtkWidget *self, main_window *widgets){ - if (self){}; - GtkTreePath *path = gtk_tree_path_new(); - GtkTreeModel *model = gtk_tree_model_filter_new(GTK_TREE_MODEL(widgets->liststore2),path); - gtk_tree_model_filter_set_visible_func(GTK_TREE_MODEL_FILTER(model),(GtkTreeModelFilterVisibleFunc)yon_service_source_check,NULL,NULL); -} gboolean on_service_filter(GtkTreeModel *model, GtkTreeIter *iter,void *data){ if (data){}; @@ -293,6 +315,26 @@ gboolean on_blocked_filter(GtkTreeModel *model, GtkTreeIter *iter,void *data){ return 0; } +gboolean on_source_user_filter(GtkTreeModel *model, GtkTreeIter *iter,void *data){ + if (data){}; + gboolean type; + gtk_tree_model_get(model,iter,8,&type,-1); + if (type) + return 1; + return 0; + +} + +gboolean on_source_system_filter(GtkTreeModel *model, GtkTreeIter *iter,void *data){ + if (data){}; + gboolean type; + gtk_tree_model_get(model,iter,8,&type,-1); + if (!type) + return 1; + return 0; + +} + void on_type_changed(GtkWidget *self, main_window *widgets){ if (self){}; switch (gtk_combo_box_get_active(GTK_COMBO_BOX(widgets->ServiceTypeCombo))){ @@ -320,6 +362,21 @@ void on_type_changed(GtkWidget *self, main_window *widgets){ gtk_tree_model_filter_refilter(GTK_TREE_MODEL_FILTER(main_config.BlockedFilter)); break; } + if (main_config.SourceFilter){ + g_object_unref(main_config.SourceFilter); + main_config.SourceFilter=NULL; + } + main_config.SourceFilter = gtk_tree_model_filter_new(gtk_tree_view_get_model(GTK_TREE_VIEW(widgets->MainTree)),NULL); + int active = gtk_combo_box_get_active(GTK_COMBO_BOX(widgets->ServiceSourceCombo)); + if (active==1){ + gtk_tree_model_filter_set_visible_func(GTK_TREE_MODEL_FILTER(main_config.SourceFilter),(GtkTreeModelFilterVisibleFunc)on_source_system_filter,NULL,NULL); + + gtk_tree_view_set_model(GTK_TREE_VIEW(widgets->MainTree),main_config.SourceFilter); + } else if (active==2){ + gtk_tree_model_filter_set_visible_func(GTK_TREE_MODEL_FILTER(main_config.SourceFilter),(GtkTreeModelFilterVisibleFunc)on_source_user_filter,NULL,NULL); + gtk_tree_view_set_model(GTK_TREE_VIEW(widgets->MainTree),main_config.SourceFilter); + } + gtk_tree_model_filter_refilter(GTK_TREE_MODEL_FILTER(main_config.SourceFilter)); } void on_service_update(GtkWidget *self, terminal_window* window){ @@ -365,6 +422,10 @@ void on_info_clicked(GtkWidget *self, main_window *widgets){ } } +void on_log_show(){ + +} + void *yon_unthreaded_config_load(void *widgets){ if (main_config.load_mode==1){ on_config_local_load(NULL,(main_window*)widgets); @@ -375,17 +436,38 @@ void *yon_unthreaded_config_load(void *widgets){ } void on_update(GtkWidget *self,main_window *widgets){ - if (self){} - yon_ubl_status_box_render(LIST_LOAD_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); - g_thread_new("",(GThreadFunc)yon_unthreaded_config_load,widgets); + if (!main_config.update_thread_active){ + if (self){} + yon_ubl_status_box_render(LIST_LOAD_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); + if (yon_unthreaded_config_load(widgets)){}; + } +} + +void *update_delay(main_window *widgets){ + on_type_changed(NULL,widgets); + main_config.update_thread_active=0; + textdomain(template_ui_LocaleName); + if (main_config.load_mode){ + yon_ubl_status_box_render(LOCAL_LOAD_SUCCESS_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); + } else { + yon_ubl_status_box_render(GLOBAL_LOAD_SUCCESS_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); + } + textdomain(LocaleName); + return NULL; } -void *yon_interface_update(main_window *widgets){ +gboolean yon_interface_update(main_window *widgets){ + gtk_widget_set_sensitive(widgets->UpdateButton,0); int size; + int size_users; GtkTreeIter iter; + gtk_list_store_clear(widgets->liststore2); gtk_tree_view_set_model(GTK_TREE_VIEW(widgets->MainTree),NULL); config_str services = yon_config_load(load_services_command,&size); + char *command = load_user_services_command; + config_str users_services = yon_config_load(command,&size_users); for (int i=0;iliststore2,&iter,5,parsed[0],6,description,7,type,-1); + int user_service=0; + gtk_list_store_set(widgets->liststore2,&iter,5,parsed[0],6,description,7,type,8,user_service,-1); } + for (int i=0;iliststore2,&iter); + int type; + char *description = parsed[parsed_size-1]; + if (strstr(parsed[0],".socket")) + type = 2; + else type = 1; + int user_service=1; + gtk_list_store_set(widgets->liststore2,&iter,5,parsed[0],6,description,7,type,8,user_service,-1); + } + int launched_size; config_str launched_parsed = yon_config_load(load_launched_command,&launched_size); int enabled_size; @@ -405,9 +503,9 @@ void *yon_interface_update(main_window *widgets){ yon_char_parsed_divide_search_full(enabled_parsed,enabled_size,"\n",-1); char *launched = yon_char_parsed_to_string(launched_parsed,launched_size,","); char *enabled = yon_char_parsed_to_string(enabled_parsed,enabled_size,","); - char *start = yon_config_get_by_key("SERVICESSTART"); - char *stop = yon_config_get_by_key("SERVICESSROP"); - char *block = yon_config_get_by_key("SERVICESMASK"); + char *start = yon_config_get_by_key("SERVICES_ENABLE"); + char *stop = yon_config_get_by_key("SERVICES_DISABLE"); + char *block = yon_config_get_by_key("SERVICES_MASK"); if (!yon_char_is_empty(launched)&&launched[strlen(launched)-1]=='\n') launched[strlen(launched)-1]='\0'; if (!yon_char_is_empty(enabled)&&enabled[strlen(enabled)-1]=='\n') enabled[strlen(enabled)-1]='\0'; if (!yon_char_is_empty(start)&&start[strlen(start)-1]=='\n') start[strlen(start)-1]='\0'; @@ -450,16 +548,11 @@ void *yon_interface_update(main_window *widgets){ gtk_list_store_set(widgets->liststore2,&iter,3,0,-1); } free(name_parsed); + while(gtk_events_pending()) gtk_main_iteration(); } - textdomain(template_ui_LocaleName); - if (main_config.load_mode){ - yon_ubl_status_box_render(LOCAL_LOAD_SUCCESS_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); - } else { - yon_ubl_status_box_render(GLOBAL_LOAD_SUCCESS_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); - } - textdomain(LocaleName); - gtk_tree_view_set_model(GTK_TREE_VIEW(widgets->MainTree),GTK_TREE_MODEL(widgets->liststore2)); - return NULL; + update_delay(widgets); + gtk_widget_set_sensitive(widgets->UpdateButton,1); + return 0; } void on_column_resize(GtkTreeViewColumn *self,GParamSpec *pspec,main_window *widgets){ @@ -473,13 +566,10 @@ void on_column_resize(GtkTreeViewColumn *self,GParamSpec *pspec,main_window *wid } GtkWidget *yon_menu_separator_create() { - GtkWidget *menu_item = gtk_menu_item_new(); - GtkWidget *box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL,0); - GtkWidget *separator = gtk_separator_new(GTK_ORIENTATION_HORIZONTAL); - gtk_box_pack_start(GTK_BOX(box),separator,1,1,0); - gtk_container_add(GTK_CONTAINER(menu_item),box); + GtkWidget *menu_item = gtk_separator_menu_item_new(); - gtk_widget_show_all(menu_item); + gtk_style_context_add_class(gtk_widget_get_style_context(menu_item),"sepat"); + gtk_widget_show(menu_item); gtk_widget_set_sensitive(menu_item,0); return menu_item; } @@ -488,12 +578,9 @@ GtkWidget *yon_menu_button_create(char *icon_name, char *text) { GtkWidget *menu_item = gtk_menu_item_new(); GtkWidget *box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL,0); GtkWidget *icon; - GtkWidget *check; if(icon_name){ icon = gtk_image_new_from_icon_name(icon_name,GTK_ICON_SIZE_BUTTON); - check = gtk_check_button_new(); gtk_box_pack_start(GTK_BOX(box),icon,0,0,5); - gtk_box_pack_end(GTK_BOX(box),check,0,0,5); } GtkWidget *label = gtk_label_new(text); gtk_box_pack_start(GTK_BOX(box),label,0,0,5); @@ -518,7 +605,7 @@ gboolean on_context_menu_open(GtkWidget *self,GdkEventButton *event, main_window GtkWidget *menu_item_configuration_in_system = yon_menu_button_create(NULL,SYSTEM_CONFIGURATION_LABEL); gtk_widget_set_sensitive(menu_item_configuration_in_system,0); GtkWidget *menu_item_autostart_system = yon_menu_button_create("media-playback-start-symbolic",AUTOSTART_LABEL); - GtkWidget *menu_item_launched = yon_menu_button_create("emoji-flags-symbolic",LAUNCHED_LABEL); + GtkWidget *menu_item_launched = yon_menu_button_create("emoji-flags-symbolic",SYSTEM_LAUNCH_TOGGLE_LABEL); GtkWidget *menu_item_separator2 = yon_menu_separator_create(); GtkWidget *menu_item_reload = yon_menu_button_create("emblem-synchronizing-symbolic",SERVICE_RELOAD_LABEL); GtkWidget *menu_item_status = yon_menu_button_create("dialog-information-symbolic",STATUS_LABEL); @@ -550,8 +637,7 @@ gboolean on_context_menu_open(GtkWidget *self,GdkEventButton *event, main_window gtk_menu_shell_append(GTK_MENU_SHELL(menu),menu_item_status); widgets->RMBMenu=menu; widgets->menu=menu_object; - // gtk_widget_show_all(widgets->RMBMenu); - // gtk_widget_show_all(widgets->menu->Menu); + gtk_widget_show_all(widgets->RMBMenu); gtk_menu_popup_at_pointer(GTK_MENU(menu),NULL); return 0; } @@ -575,33 +661,44 @@ void config_init(){ main_config.lock_save_global=0; main_config.lock_save_local=0; main_config.load_mode=1; + main_config.update_thread_active=0; } void on_activate(GtkTreeView *self, main_window *widgets){ if (self){}; GtkTreeIter iter; - GtkTreeModel *model = GTK_TREE_MODEL(widgets->liststore2); + GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(widgets->MainTree)); char *name=NULL; char *description=NULL; if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->MainTree)),&model,&iter)){ - gtk_tree_model_get(GTK_TREE_MODEL(widgets->liststore2),&iter,5,&name,6,&description,-1); + gtk_tree_model_get(model,&iter,5,&name,6,&description,-1); gtk_label_set_text(GTK_LABEL(widgets->ServiceLabel),name); gtk_label_set_text(GTK_LABEL(widgets->DescriptionLabel),description); menu_obj *menu=widgets->menu; if (main_config.rmb_clicked){ - gboolean CAutostart,CAutostop,CBlock,SAutostart,SLaunched; - gtk_tree_model_get(GTK_TREE_MODEL(widgets->liststore2),&iter,0,&CAutostart,1,&CAutostop,2,&CBlock,3,&SAutostart,4,&SLaunched,-1); - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(g_list_nth_data(gtk_container_get_children(GTK_CONTAINER(g_list_nth_data(gtk_container_get_children(GTK_CONTAINER(menu->MenuConfigAutostart)),0))),2)),CAutostart); - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(g_list_nth_data(gtk_container_get_children(GTK_CONTAINER(g_list_nth_data(gtk_container_get_children(GTK_CONTAINER(menu->MenuConfigAutostop)),0))),2)),CAutostop); - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(g_list_nth_data(gtk_container_get_children(GTK_CONTAINER(g_list_nth_data(gtk_container_get_children(GTK_CONTAINER(menu->MenuConfigBlock)),0))),2)),CBlock); - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(g_list_nth_data(gtk_container_get_children(GTK_CONTAINER(g_list_nth_data(gtk_container_get_children(GTK_CONTAINER(menu->MenuSystemAutostart)),0))),2)),SAutostart); - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(g_list_nth_data(gtk_container_get_children(GTK_CONTAINER(g_list_nth_data(gtk_container_get_children(GTK_CONTAINER(menu->MenuSystemLaunched)),0))),2)),SLaunched); gtk_menu_popup_at_pointer(GTK_MENU(menu->Menu),NULL); } } main_config.rmb_clicked=0; } +void on_tree_selection_changed(GtkWidget *self, main_window *widgets){ + if (self){}; + GtkTreeModel *model = GTK_TREE_MODEL(widgets->liststore2); + GtkTreeIter iter; + int switch_status=0; + if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->MainTree)),&model,&iter)){ + switch_status=1; + } + gtk_widget_set_sensitive(widgets->ConfigAutostartButton,switch_status); + gtk_widget_set_sensitive(widgets->ConfigAutostopButton,switch_status); + gtk_widget_set_sensitive(widgets->ConfigBlockButton,switch_status); + gtk_widget_set_sensitive(widgets->SystemAutostartButton,switch_status); + gtk_widget_set_sensitive(widgets->SystemLaunchButton,switch_status); + gtk_widget_set_sensitive(widgets->InfoButton,switch_status); + gtk_widget_set_sensitive(widgets->LogButton,switch_status); +} + /**yon_main_window_complete(main_window *widgets) * [EN] * @@ -642,7 +739,7 @@ void yon_main_window_complete(main_window *widgets){ g_signal_connect(G_OBJECT(widgets->SystemLaunchButton),"clicked",G_CALLBACK(on_system_launch_clicked),widgets); g_signal_connect(G_OBJECT(widgets->UpdateButton),"clicked",G_CALLBACK(on_update),widgets); g_signal_connect(G_OBJECT(widgets->InfoButton),"clicked",G_CALLBACK(on_info_clicked),widgets); - // g_signal_connect(G_OBJECT(widgets->LogButton),"clicked",G_CALLBACK(on_status_show),widgets); + g_signal_connect(G_OBJECT(widgets->LogButton),"clicked",G_CALLBACK(on_log_show),widgets); g_signal_connect(G_OBJECT(g_list_nth_data(list,0)),"notify::width",G_CALLBACK(on_column_resize),widgets); g_signal_connect(G_OBJECT(g_list_nth_data(list,1)),"notify::width",G_CALLBACK(on_column_resize),widgets); g_signal_connect(G_OBJECT(g_list_nth_data(list,2)),"notify::width",G_CALLBACK(on_column_resize),widgets); @@ -650,6 +747,7 @@ void yon_main_window_complete(main_window *widgets){ g_signal_connect(G_OBJECT(g_list_nth_data(list,4)),"notify::width",G_CALLBACK(on_column_resize),widgets); g_signal_connect(G_OBJECT(widgets->MainTree),"cursor-changed",G_CALLBACK(on_activate),widgets); g_signal_connect(G_OBJECT(widgets->ServiceTypeCombo),"changed",G_CALLBACK(on_type_changed),widgets); + g_signal_connect(G_OBJECT(widgets->ServiceSourceCombo),"changed",G_CALLBACK(on_type_changed),widgets); g_signal_connect(G_OBJECT(widgets->LoadLocalMenuItem),"activate",G_CALLBACK(on_config_local_load),widgets); g_signal_connect(G_OBJECT(widgets->LoadGlobalMenuItem),"activate",G_CALLBACK(on_config_global_load),widgets); @@ -657,6 +755,7 @@ void yon_main_window_complete(main_window *widgets){ g_signal_connect(G_OBJECT(widgets->SaveMenuItem),"activate",G_CALLBACK(on_config_global_local_save),NULL); g_signal_connect(G_OBJECT(widgets->SaveLocalMenuItem),"activate",G_CALLBACK(on_config_local_save),NULL); g_signal_connect(G_OBJECT(widgets->SaveGlobalMenuItem),"activate",G_CALLBACK(on_config_global_save),NULL); + g_signal_connect(G_OBJECT(widgets->MainTree),"cursor-changed",G_CALLBACK(on_tree_selection_changed),widgets); g_list_free(list); main_config.ServiceFilter = gtk_tree_model_filter_new(GTK_TREE_MODEL(widgets->liststore2),NULL); gtk_tree_model_filter_set_visible_func(GTK_TREE_MODEL_FILTER(main_config.ServiceFilter),(GtkTreeModelFilterVisibleFunc)on_service_filter,NULL,NULL); @@ -671,87 +770,23 @@ void yon_main_window_complete(main_window *widgets){ gtk_tree_view_set_search_entry(GTK_TREE_VIEW(widgets->MainTree),GTK_ENTRY(widgets->SearchEntry)); yon_load_proceed(YON_CONFIG_LOCAL); yon_ubl_status_box_render(LIST_LOAD_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); - g_thread_new("",(GThreadFunc)yon_interface_update,widgets); + if (!main_config.update_thread_active){ + main_config.update_thread_active=1; + gdk_threads_add_idle((GSourceFunc)((gboolean*)(void*)yon_interface_update),widgets); + } } int main(int argc, char *argv[]){ local=setlocale(LC_ALL, ""); textdomain (LocaleName); config_init(); - int option_index=0; - int show_help=0; - { - struct option long_options[] = { - {"help", 0, 0, 'h'}, - {"version", 0, 0, 'V'}, - {"lock-help", 0,0, 1}, - {"lock-save", 0,0, 2}, - {"lock-save-local", 0,0, 3}, - {"lock-save-global", 0,0, 4}, - {"lock-load-global", 0,0, 5}, - {"socket-id", 1, 0, 's'}, - {"socket-ext-id", 1,0, 'e'}, - {"socket-trd-id", 1,0, 't'}, - {"clear-config", 0,0, 'c'}, - { NULL, 0, NULL, 0 } - }; - for (int i=0;i +#include #include #include #include @@ -32,6 +33,8 @@ #define LocaleName "ubl-settings-services" #define load_services_command "systemctl list-units --type=service --type=socket --no-pager --all |grep -E \"^ \" |grep -v \"UNIT\" |sed -e 's/ */;/g' -e 's/^;//g' -e 's/running /running;/g' -e 's/inactive /inactive;/g'" +#define load_user_services_command yon_char_unite("systemctl --user --machine=",yon_ubl_root_user_get(),"@ list-units --type=service --type=socket --no-pager --all |grep -E \"^ \" |grep -v \"UNIT\" |sed -e 's/ */;/g' -e 's/^;//g'",NULL) +#define load_system_services_command "systemctl --system list-units --type=service --type=socket --no-pager --all |grep -E \"^ \" |grep -v \"UNIT\" |sed -e 's/ */;/g' -e 's/^;//g' |cut -f1 -d';'" #define load_enabled_command "systemctl list-unit-files --type=service --type=socket --no-pager --state=enabled --all |sed -e 's/ */:/g' -e 's/ *: */:/g'|cut -f1 -d:" #define load_launched_command "systemctl list-units --type=service --type=socket --no-pager --state=active --all --no-legend|sed -e 's/^ //g' -e 's/ */:/g' |cut -f1 -d:" #define service_start_command(target) yon_char_append("systemctl start --no-pager ",target) @@ -39,6 +42,8 @@ #define service_enable_command(target) yon_char_append("systemctl enable --no-pager ",target) #define service_disable_command(target) yon_char_append("systemctl disable --no-pager ",target) #define service_info_command(target) yon_char_append("systemctl status -l --no-pager ",target) +#define service_kill_command(target) yon_char_append("systemctl kill ",target) +#define service_check_active_command(target) yon_char_append("systemctl is-active ",target) typedef char* string; string version_application; @@ -55,6 +60,7 @@ typedef struct { int lock_save_local; int lock_save_global; int lock_load_global; + int lock_load_system; int load_mode; @@ -67,6 +73,9 @@ typedef struct { GtkTreeModel *AutolaunchFilter; GtkTreeModel *StoppedFilter; GtkTreeModel *BlockedFilter; + + GtkTreeModel *SourceFilter; + int update_thread_active; } config; @@ -181,7 +190,7 @@ void on_config_local_save(); void on_config_global_save(); -void *yon_interface_update(main_window *widgets); +gboolean yon_interface_update(main_window *widgets); GtkWidget *yon_menu_button_create(char *icon_name, char *text); @@ -201,12 +210,12 @@ void on_config_block_clicked(); void on_system_autostart_clicked(); +void on_system_kill_confirmed(GtkWidget *self,char *service_name); + void on_system_launch_clicked(); gboolean yon_service_source_check(GtkTreeModel *model, GtkTreeIter *iter, void *data); -void on_source_changed(GtkWidget *self, main_window *widgets); - gboolean yon_service_type_check(GtkTreeModel *model, GtkTreeIter *iter,void *data); void on_type_changed(GtkWidget *self, main_window *widgets); @@ -225,8 +234,13 @@ void yon_load_proceed(YON_CONFIG_TYPE type); void config_init(); +void on_tree_selection_changed(GtkWidget *self, main_window *widgets); + void yon_main_window_complete(main_window *widgets); +void on_log_show(); + +void *update_delay(main_window *widgets); gboolean on_service_filter(GtkTreeModel *model, GtkTreeIter *iter,void *data); @@ -238,6 +252,10 @@ gboolean on_stopped_filter(GtkTreeModel *model, GtkTreeIter *iter,void *data); gboolean on_blocked_filter(GtkTreeModel *model, GtkTreeIter *iter,void *data); +gboolean on_source_user_filter(GtkTreeModel *model, GtkTreeIter *iter,void *data); + +gboolean on_source_system_filter(GtkTreeModel *model, GtkTreeIter *iter,void *data); + terminal_window *yon_terminal_window_new(); void on_service_update(GtkWidget *self, terminal_window* window); \ No newline at end of file diff --git a/source/ubl-strings.h b/source/ubl-strings.h index 70f96df..ecc6005 100644 --- a/source/ubl-strings.h +++ b/source/ubl-strings.h @@ -1,6 +1,3 @@ -#define VERSION_LABEL yon_char_unite(_("Version:")," ",version_application,"\n",NULL) -#define HELP_LABEL yon_char_unite(_("ubl-settings-services version:")," ", version_application,"\n",TITLE_LABEL,"\n",_("Usage:"), " ubl-settings-services ",_("[OPTIONS]"),"\n",_("Options:"),"\n\t--help, -h\t\t\t",_("Show this help"),"\n\t--version, -V\t\t\t",_("Show package version"),"\n\t--lock-help\t\t\t",_("Lock this help menu"),"\n\t--lock-save\t\t\t",_("Lock configuration saving"),"\n\t--lock-save-local\t\t",_("Lock local configration saving"),"\n\t--lock-save-global\t\t",_("Lock global configration saving"),"\n\t--lock-load-global\t\t",_("Lock global configration loading"),"\n\t--clear-config\t\t\t",_("Reset application settings"),"\n",NULL) - #define TITLE_LABEL _("Services and processes systemd") #define TITLE_INFO_LABEL _("System services and processes configuration") #define SERVICE_INFO_TITLE_LABEL _("Services and processes - service information") @@ -30,7 +27,7 @@ #define AUTOSTOP_TOGGLE_LABEL _("Toggle autostop at configuration") #define BLOCK_TOGGLE_LABEL _("Toggle service blocking at configuration") #define SYSTEM_AUTOSTART_TOGGLE_LABEL _("Toggle autostart at system") -#define SYSTEM_LAUNCH_TOGGLE_LABEL _("Launch service") +#define SYSTEM_LAUNCH_TOGGLE_LABEL _("Launch/Stop service") #define CHECKSTATUS_LABEL _("Check service status") #define LOG_LABEL _("Check service log") @@ -46,4 +43,7 @@ #define BLOCK_LABEL _("Block") #define LAUNCHED_LABEL _("Launched") #define LIST_LOAD_LABEL _("Service list is loading") -#define STATUS_LABEL _("Status") \ No newline at end of file +#define STATUS_LABEL _("Status") + +#define SWITCH_OFF_ERROR_LABEL _("Service were not stopped") +#define STOP_SERVICE_WARMING_LABEL(target) yon_char_unite(_("Are you sure want to stop "),target,"?\n",_("The stop will be forced.\nThe system may become unstable."),NULL) \ No newline at end of file diff --git a/ubl-settings-services.css b/ubl-settings-services.css index d6b13ef..fee529c 100644 --- a/ubl-settings-services.css +++ b/ubl-settings-services.css @@ -1,4 +1,3 @@ - .thin { margin:0px; padding:0px; @@ -38,10 +37,6 @@ background:transparent; border-left-width:inherit; border-right-width:inherit; } - -.menuitemmiddlemargin{ - margin-top: 6px; -} .menuitemtop{ margin-bottom:0px; @@ -50,17 +45,17 @@ background:transparent; border-left-width:inherit; border-right-width:inherit; } - .menuitemtop *{ + .menuitemtop >*{ margin:4px 2px 0 2px; padding: 3px 10px 3px 5px; border:transparent; } - .menuitemmiddle *{ + .menuitemmiddle >*{ margin:0 2px 0 2px; padding: 3px 10px 3px 5px; border:transparent; } - .menuitembottom *{ + .menuitembottom >*{ margin:0 2px 2px 2px; padding: 3px 10px 3px 5px; } @@ -85,19 +80,19 @@ background:transparent; border-right-width:inherit; } - .menuitemtop:hover* { + .menuitemtop:hover>* { margin:4px 2px 0 2px; padding: 3px 10px 3px 5px; background:@theme_selected_bg_color; border-radius:2px; } - .menuitemmiddle:hover* { + .menuitemmiddle:hover>* { margin:0 2px 0 2px; padding: 3px 10px 3px 5px; background:@theme_selected_bg_color; border-radius:2px; } - .menuitembottom:hover* { + .menuitembottom:hover>* { margin:0 2px 2px 2px; padding: 3px 10px 3px 5px; background:@theme_selected_bg_color; @@ -123,12 +118,16 @@ background:transparent; border-style:solid; } -.debugborders *{ - border-width: 2px; - border-color: #000000; - border-style: solid; +.sepat{ + border-color: darker (@theme_bg_color); + border-top-width:1px; + border-style:solid; } .marginright image{ margin-right: 2px; -} \ No newline at end of file +} + +treeview row:nth-child(odd) { background-color: #000000; } + +treeview row:nth-child(even) { background-color: #ffffff; } \ No newline at end of file diff --git a/ubl-settings-services.glade b/ubl-settings-services.glade index 4b2b7b1..ce0ef08 100644 --- a/ubl-settings-services.glade +++ b/ubl-settings-services.glade @@ -183,6 +183,7 @@ True + False True True Toggle autostart at configuration @@ -200,6 +201,7 @@ True + False True True Toggle autostop at configuration @@ -217,6 +219,7 @@ True + False True True Toggle service blocking at configuration @@ -231,9 +234,21 @@ 2 + + + True + False + + + False + True + 3 + + True + False True True Toggle autostart at system @@ -245,15 +260,16 @@ False True - 3 + 4 True + False True True - Launch service + Launch/Stop service image5