diff --git a/source/ubl-settings-services-systemd.c b/source/ubl-settings-services-systemd.c index 86e8b5e..2e02265 100644 --- a/source/ubl-settings-services-systemd.c +++ b/source/ubl-settings-services-systemd.c @@ -82,15 +82,19 @@ dictionary *yon_systemd_get_list() { } } if (!found) { - systemd_struct *u = calloc(1, sizeof(systemd_struct)); - u->name = yon_char_new(name); - u->description = yon_char_new(""); - u->load = 0; - u->active = 0; - u->state = yon_char_new(""); - u->enable = 0; - - yon_dictionary_add_or_create_if_exists_with_data(dict, (char*)name, u); + char *temp_name = yon_char_new(name); + if (!yon_dictionary_get(&dict,temp_name)){ + systemd_struct *u = calloc(1, sizeof(systemd_struct)); + free(yon_char_divide(temp_name,yon_char_find_last(temp_name,'/'))); + u->name = temp_name; + u->description = yon_char_new(""); + u->load = 0; + u->active = 0; + u->state = _("disabled"); + u->enable = 0; + + yon_dictionary_add_or_create_if_exists_with_data(dict, (char*)temp_name, u); + } } sd_bus_message_exit_container(reply); } diff --git a/source/ubl-settings-services.c b/source/ubl-settings-services.c index d70246b..0a6a203 100644 --- a/source/ubl-settings-services.c +++ b/source/ubl-settings-services.c @@ -31,9 +31,9 @@ void on_save_done(main_window *, config_str output, int size){ void yon_load_proceed(YON_CONFIG_TYPE type){ if (type!=YON_CONFIG_CUSTOM){ yon_config_clean(); + if (!yon_char_is_empty(config_get_default_command)) + yon_config_load_config(YON_CONFIG_DEFAULT,config_get_default_command,NULL); } - if (!yon_char_is_empty(config_get_default_command)) - yon_config_load_config(YON_CONFIG_DEFAULT,config_get_default_command,NULL); if (type==YON_CONFIG_GLOBAL){ yon_config_load_config(type,config_get_global_command,NULL); } else if (type==YON_CONFIG_LOCAL){ @@ -57,6 +57,8 @@ void yon_load_proceed(YON_CONFIG_TYPE type){ path=file; } yon_config_clean(); + if (!yon_char_is_empty(config_get_default_command)) + yon_config_load_config(YON_CONFIG_DEFAULT,config_get_default_command,NULL); char *command = yon_config_get_custom_command(path); yon_config_load_config(type,command,NULL); gtk_widget_destroy(dialog); @@ -72,7 +74,7 @@ void on_config_local_load(GtkWidget *,main_window *widgets){ yon_load_proceed(YON_CONFIG_LOCAL); yon_ubl_status_box_render(LIST_LOAD_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); g_thread_new("update",(GThreadFunc)yon_interface_update,widgets); - main_config.load_mode=1; + main_config.load_mode=YON_CONFIG_LOCAL; } } @@ -82,7 +84,7 @@ void on_config_global_load(GtkWidget *,main_window *widgets){ yon_load_proceed(YON_CONFIG_GLOBAL); yon_ubl_status_box_render(LIST_LOAD_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); g_thread_new("update",(GThreadFunc)yon_interface_update,widgets); - main_config.load_mode=0; + main_config.load_mode=YON_CONFIG_GLOBAL; } } @@ -92,7 +94,7 @@ void on_config_custom_load(GtkWidget *,main_window *widgets){ textdomain(template_ui_LocaleName); yon_ubl_status_box_render(GLOBAL_LOAD_SUCCESS_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); textdomain(LocaleName); - main_config.load_mode=3; + main_config.load_mode=YON_CONFIG_CUSTOM; g_thread_new("update",(GThreadFunc)yon_interface_update,widgets); } @@ -184,14 +186,17 @@ void on_config_autostart_clicked(GtkCellRenderer *, char *path, main_window *wid { gtk_tree_model_sort_convert_iter_to_child_iter(GTK_TREE_MODEL_SORT(sort),&itor,&filter_iter); gtk_tree_model_filter_convert_iter_to_child_iter(GTK_TREE_MODEL_FILTER(filter),&iter,&itor); - gboolean status = 0; + gboolean status = 0,autoblock = 0; char *name; - gtk_tree_model_get(model,&iter,0,&status,5,&name,-1); + gtk_tree_model_get(model,&iter,0,&status,1,&autoblock,5,&name,-1); char *unit = yon_char_new(name); char *parsed_name = yon_char_divide(unit, yon_char_find_last(name,'.')); free(unit); unit=parsed_name; gtk_list_store_set(GTK_LIST_STORE(model),&iter,0,!status,-1); + if (!status&&autoblock){ + on_config_autostop_clicked(NULL,path,widgets); + } char *config_sting = yon_config_get_by_key("SERVICES_ENABLE"); int size; config_str parsed = yon_char_parse(config_sting,&size,","); @@ -246,14 +251,17 @@ void on_config_autostop_clicked(GtkCellRenderer *, char *path, main_window *widg { gtk_tree_model_sort_convert_iter_to_child_iter(GTK_TREE_MODEL_SORT(sort),&itor,&filter_iter); gtk_tree_model_filter_convert_iter_to_child_iter(GTK_TREE_MODEL_FILTER(filter),&iter,&itor); - gboolean status = 0; + gboolean status = 0,autostart=0; char *name; - gtk_tree_model_get(model,&iter,1,&status,5,&name,-1); + gtk_tree_model_get(model,&iter,0,&autostart,1,&status,5,&name,-1); char *unit = yon_char_new(name); char *parsed_name = yon_char_divide(unit, yon_char_find_last(name,'.')); free(unit); unit=parsed_name; gtk_list_store_set(GTK_LIST_STORE(model),&iter,1,!status,-1); + if (!status&&autostart){ + on_config_autostart_clicked(NULL,path,widgets); + } char *config_sting = yon_config_get_by_key("SERVICES_DISABLE"); int size; config_str parsed = yon_char_parse(config_sting,&size,","); @@ -1149,6 +1157,16 @@ gboolean yon_interface_list_models_disconnect(main_window *widgets){ gtk_list_store_clear(widgets->UserList); gtk_list_store_clear(widgets->ConfigList); gtk_list_store_clear(widgets->TimersList); + gtk_spinner_start(GTK_SPINNER(widgets->SystemLoadingSpinner)); + gtk_spinner_start(GTK_SPINNER(widgets->UserLoadingSpinner)); + gtk_spinner_start(GTK_SPINNER(widgets->ConfigLoadingSpinner)); + gtk_spinner_start(GTK_SPINNER(widgets->SessionsLoadingSpinner)); + gtk_spinner_start(GTK_SPINNER(widgets->TimersLoadingSpinner)); + gtk_widget_show(widgets->SystemLoadingSpinner); + gtk_widget_show(widgets->UserLoadingSpinner); + gtk_widget_show(widgets->ConfigLoadingSpinner); + gtk_widget_show(widgets->SessionsLoadingSpinner); + gtk_widget_show(widgets->TimersLoadingSpinner); g_signal_handlers_block_by_func(G_OBJECT(widgets->UserFiltersCombo),G_CALLBACK(on_filter_changed),widgets); g_signal_handlers_block_by_func(G_OBJECT(widgets->UserSearchEntry),G_CALLBACK(on_filter_changed),widgets); @@ -1170,6 +1188,16 @@ gboolean yon_interface_list_models_connect(main_window *widgets){ gtk_tree_view_set_model(GTK_TREE_VIEW(widgets->UserUnitsTree),GTK_TREE_MODEL(widgets->UserSort)); gtk_tree_view_set_model(GTK_TREE_VIEW(widgets->ConfigMainTree),GTK_TREE_MODEL(widgets->ConfigList)); gtk_tree_view_set_model(GTK_TREE_VIEW(widgets->TimersMainTree),GTK_TREE_MODEL(widgets->TimersList)); + gtk_spinner_stop(GTK_SPINNER(widgets->SystemLoadingSpinner)); + gtk_spinner_stop(GTK_SPINNER(widgets->UserLoadingSpinner)); + gtk_spinner_stop(GTK_SPINNER(widgets->ConfigLoadingSpinner)); + gtk_spinner_stop(GTK_SPINNER(widgets->SessionsLoadingSpinner)); + gtk_spinner_stop(GTK_SPINNER(widgets->TimersLoadingSpinner)); + gtk_widget_hide(widgets->SystemLoadingSpinner); + gtk_widget_hide(widgets->UserLoadingSpinner); + gtk_widget_hide(widgets->ConfigLoadingSpinner); + gtk_widget_hide(widgets->SessionsLoadingSpinner); + gtk_widget_hide(widgets->TimersLoadingSpinner); g_signal_handlers_unblock_by_func(G_OBJECT(widgets->UserFiltersCombo),G_CALLBACK(on_filter_changed),widgets); g_signal_handlers_unblock_by_func(G_OBJECT(widgets->UserSearchEntry),G_CALLBACK(on_filter_changed),widgets); @@ -1336,12 +1364,68 @@ gboolean yon_interface_update_finish(main_window *widgets){ } } main_config.update_thread_active=0; - char *final = yon_char_unite(yon_char_get_localised_from_lib(SUCCESS_LABEL),". ",main_config.load_mode==0?yon_char_get_localised_from_lib(GLOBAL_LOAD_SUCCESS_LABEL):yon_char_get_localised_from_lib(LOCAL_LOAD_SUCCESS_LABEL),NULL); + char *final = yon_char_unite(yon_char_get_localised_from_lib(SUCCESS_LABEL),". ",main_config.load_mode==YON_CONFIG_GLOBAL?yon_char_get_localised_from_lib(GLOBAL_LOAD_SUCCESS_LABEL):yon_char_get_localised_from_lib(LOCAL_LOAD_SUCCESS_LABEL),NULL); yon_ubl_status_box_render(final,BACKGROUND_IMAGE_SUCCESS_TYPE); free(final); return G_SOURCE_REMOVE; } +void yon_service_update(main_window *widgets){ + int active_page = gtk_notebook_get_current_page(GTK_NOTEBOOK(widgets->MainNotebook)); + switch (active_page) + { + case 0:{ + GtkTreeModel *model; + GtkTreeIter iter; + gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->SystemUnitsTree)),&model,&iter); + char *target; + gtk_tree_model_get(model,&iter,5,&target,-1); + int size; + config_str new_info = yon_config_load(load_system_service_single(target),&size); + int parsed_size; + config_str parsed = yon_char_parse(new_info[0],&parsed_size,";"); + char *name_temp = yon_char_replace(parsed[0],"\\","\18"); + if (name_temp!=parsed[0]) free(parsed[0]); + parsed[0]=yon_char_replace(name_temp,"\18","\\\\"); + if (name_temp!=parsed[0]) free(name_temp); + if (parsed){ + int enabled = !strcmp(parsed[5],"enabled"); + int loaded = !strcmp(parsed[1],"loaded"); + int active = !strcmp(parsed[2],"active"); + enum YON_UNIT_TYPE type = yon_get_unit_type(parsed[0]); + gtk_list_store_append(widgets->SystemList,&iter); + gtk_list_store_set(widgets->SystemList,&iter,3,enabled,4,active,5,parsed[0],6,parsed[4],7,type,8,active,9,loaded,11,_(parsed[3]),13,parsed[3],-1); + } + + } break; + case 1:{ + GtkTreeModel *model; + GtkTreeIter iter; + gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->UserUnitsTree)),&model,&iter); + char *target; + gtk_tree_model_get(model,&iter,5,&target,-1); + int size; + config_str new_info = yon_config_load(load_user_service_single(target),&size); + int parsed_size; + config_str parsed = yon_char_parse(new_info[0],&parsed_size,";"); + char *name_temp = yon_char_replace(parsed[0],"\\","\18"); + if (name_temp!=parsed[0]) free(parsed[0]); + parsed[0]=yon_char_replace(name_temp,"\18","\\\\"); + if (name_temp!=parsed[0]) free(name_temp); + if (parsed){ + int enabled = !strcmp(parsed[5],"enabled"); + int loaded = !strcmp(parsed[1],"loaded"); + int active = !strcmp(parsed[2],"active"); + enum YON_UNIT_TYPE type = yon_get_unit_type(parsed[0]); + gtk_list_store_append(widgets->SystemList,&iter); + gtk_list_store_set(widgets->SystemList,&iter,3,enabled,4,active,5,parsed[0],6,parsed[4],7,type,8,active,9,loaded,11,_(parsed[3]),13,parsed[3],-1); + } + } break; + default: + break; + } +} + void* yon_interface_update(main_window *widgets){ // dictionary *dict = yon_systemd_get_list(); // if (dict){} @@ -1349,22 +1433,22 @@ void* yon_interface_update(main_window *widgets){ g_idle_add((GSourceFunc)yon_interface_list_models_disconnect,widgets); int system_size; config_str system_services = yon_config_load(load_services_command,&system_size); - int system_units_size; - config_str system_units = yon_config_load(load_system_units_command,&system_units_size); + // int system_units_size; + // config_str system_units = yon_config_load(load_system_units_command,&system_units_size); int user_size; - config_str user_services = yon_config_load(load_user_services_command,&user_size); - int user_units_size; - config_str user_units = yon_config_load(load_user_units_command,&user_units_size); + config_str user_services = yon_config_load(load_user_units_command,&user_size); + // int user_units_size; + // config_str user_units = yon_config_load(load_user_units_command,&user_units_size); int config_size; config_str config_files = yon_config_load(get_config_files_command,&config_size); int timers_size; config_str timers = yon_config_load(get_timers_command,&timers_size); struct json_object *jsobject = json_tokener_parse(timers[0]); - int launched_size; - config_str launched = yon_config_load(load_launched_command,&launched_size); - for (int i=0;iSystemList,&iter); - gtk_list_store_set(widgets->SystemList,&iter,3,loaded,4,active,5,parsed[0],6,parsed[4],7,type,8,active,9,1,11,_(parsed[3]),13,parsed[3],-1); + int names_size; + config_str names_parsed = yon_char_parse(parsed[0],&names_size," "); + for (int j=0;jSystemList,&iter){ + char *target; + gtk_tree_model_get(GTK_TREE_MODEL(widgets->SystemList),&iter,5,&target,-1); + if (!strcmp(target,names_parsed[j])){ + found = 1; + break; + } + } + if (!found) { + int enabled = !strcmp(parsed[5],"enabled"); + int loaded = !strcmp(parsed[1],"loaded"); + int active = !strcmp(parsed[2],"active"); + enum YON_UNIT_TYPE type = yon_get_unit_type(names_parsed[j]); + gtk_list_store_append(widgets->SystemList,&iter); + gtk_list_store_set(widgets->SystemList,&iter,3,enabled,4,active,5,names_parsed[j],6,parsed[4],7,type,8,active,9,loaded,11,_(parsed[3]),13,parsed[3],-1); + } + } + yon_char_parsed_free(names_parsed,names_size); } } - for (int i=0;iSystemList,&iter); - enum YON_UNIT_TYPE type = yon_get_unit_type(system_units[i]); - gtk_list_store_set(widgets->SystemList,&iter,0,0,1,0,2,0,3,0,4,0,5,system_units[i],6,"",7,type,8,0,9,0,10,0,11,_("disabled"),13,"disabled",-1); + yon_char_parsed_free(system_services,system_size); + // for (int i=0;iSystemList,&iter); + // enum YON_UNIT_TYPE type = yon_get_unit_type(system_units[i]); + // gtk_list_store_set(widgets->SystemList,&iter,0,0,1,0,2,0,3,0,4,0,5,system_units[i],6,"",7,type,8,0,9,0,10,0,11,_("disabled"),13,"disabled",-1); - } - } + // } + // } // for (int i=0; iUserList,&iter); - gtk_list_store_set(widgets->UserList,&iter,3,loaded,4,active,5,parsed[0],6,parsed[4],7,type,8,active,9,1,11,_(parsed[3]),13,parsed[3],-1); + int names_size; + config_str names_parsed = yon_char_parse(parsed[0],&names_size," "); + for (int j=0;jUserList,&iter){ + char *target; + gtk_tree_model_get(GTK_TREE_MODEL(widgets->UserList),&iter,5,&target,-1); + if (!strcmp(target,names_parsed[j])){ + found = 1; + break; + } + } + if (found) { + int enabled = !strcmp(parsed[5],"enabled"); + int loaded = !strcmp(parsed[1],"loaded"); + int active = !strcmp(parsed[2],"active"); + enum YON_UNIT_TYPE type = yon_get_unit_type(names_parsed[j]); + gtk_list_store_append(widgets->UserList,&iter); + gtk_list_store_set(widgets->UserList,&iter,3,enabled,4,active,5,names_parsed[j],6,parsed[4],7,type,8,active,9,loaded,11,_(parsed[3]),13,parsed[3],-1); + } + } + yon_char_parsed_free(names_parsed,names_size); } } - for (int i=0;iUserList,&iter); - enum YON_UNIT_TYPE type = yon_get_unit_type(user_units[i]); - gtk_list_store_set(widgets->UserList,&iter,0,0,1,0,2,0,3,0,4,0,5,user_units[i],6,"",7,type,8,0,9,0,10,0,11,_("disabled"),13,"disabled",-1); + yon_char_parsed_free(user_services,user_size); + // for (int i=0;iUserList,&iter); + // enum YON_UNIT_TYPE type = yon_get_unit_type(user_units[i]); + // gtk_list_store_set(widgets->UserList,&iter,0,0,1,0,2,0,3,0,4,0,5,user_units[i],6,"",7,type,8,0,9,0,10,0,11,_("disabled"),13,"disabled",-1); - } - } + // } + // } int descr_size; config_str config_descr = yon_resource_open_file(systemd_config_path,&descr_size); @@ -1504,6 +1624,7 @@ void* yon_interface_update(main_window *widgets){ } } g_idle_add((GSourceFunc)yon_sessions_update,widgets); + yon_char_parsed_free(config_files,config_size); for (size_t i=0;iSystemUnitsTree))); gtk_tree_selection_unselect_all(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->UserUnitsTree))); + yon_ubl_status_box_render(LIST_LOAD_LABEL,BACKGROUND_IMAGE_INFO_TYPE); main_config.update_thread_active=1; g_thread_new("update",(GThreadFunc)yon_interface_update,widgets); } @@ -1636,7 +1758,7 @@ void config_init(){ main_config.lock_load_global=0; main_config.lock_save_global=0; main_config.lock_save_local=0; - main_config.load_mode=1; + main_config.load_mode=YON_CONFIG_LOCAL; main_config.update_thread_active=0; main_config.launch_arguments=NULL; main_config.launch_size=0; @@ -1822,6 +1944,17 @@ void yon_main_window_complete(main_window *widgets){ widgets->SystemUnitsTree=yon_gtk_builder_get_widget(builder,"SystemUnitsTree"); widgets->MainNotebook=yon_gtk_builder_get_widget(builder,"MainNotebook"); + widgets->SystemLoadingOverlay=yon_gtk_builder_get_widget(builder,"SystemLoadingOverlay"); + widgets->SystemLoadingSpinner=yon_gtk_builder_get_widget(builder,"SystemLoadingSpinner"); + widgets->UserLoadingOverlay=yon_gtk_builder_get_widget(builder,"UserLoadingOverlay"); + widgets->UserLoadingSpinner=yon_gtk_builder_get_widget(builder,"UserLoadingSpinner"); + widgets->ConfigLoadingOverlay=yon_gtk_builder_get_widget(builder,"ConfigLoadingOverlay"); + widgets->ConfigLoadingSpinner=yon_gtk_builder_get_widget(builder,"ConfigLoadingSpinner"); + widgets->SessionsLoadingOverlay=yon_gtk_builder_get_widget(builder,"SessionsLoadingOverlay"); + widgets->SessionsLoadingSpinner=yon_gtk_builder_get_widget(builder,"SessionsLoadingSpinner"); + widgets->TimersLoadingOverlay=yon_gtk_builder_get_widget(builder,"TimersLoadingOverlay"); + widgets->TimersLoadingSpinner=yon_gtk_builder_get_widget(builder,"TimersLoadingSpinner"); + widgets->TooltipBox=yon_gtk_builder_get_widget(builder,"TooltipBox"); widgets->NameLabel=yon_gtk_builder_get_widget(builder,"NameLabel"); widgets->DescriptionLabel=yon_gtk_builder_get_widget(builder,"DescriptionLabel"); @@ -2020,6 +2153,11 @@ void yon_main_window_complete(main_window *widgets){ gtk_widget_set_sensitive(widgets->SystemUpdateButton,0); gtk_widget_set_sensitive(widgets->SystemPrevButton,0); } + gtk_overlay_add_overlay(GTK_OVERLAY(widgets->SystemLoadingOverlay),widgets->SystemLoadingSpinner); + gtk_overlay_add_overlay(GTK_OVERLAY(widgets->UserLoadingOverlay),widgets->UserLoadingSpinner); + gtk_overlay_add_overlay(GTK_OVERLAY(widgets->ConfigLoadingOverlay),widgets->ConfigLoadingSpinner); + gtk_overlay_add_overlay(GTK_OVERLAY(widgets->SessionsLoadingOverlay),widgets->SessionsLoadingSpinner); + gtk_overlay_add_overlay(GTK_OVERLAY(widgets->TimersLoadingOverlay),widgets->TimersLoadingSpinner); yon_gtk_tree_view_minimal_fixed_size_set_full(GTK_TREE_VIEW(widgets->UserUnitsTree)); yon_gtk_tree_view_minimal_fixed_size_set_full(GTK_TREE_VIEW(widgets->SystemUnitsTree)); yon_gtk_tree_view_minimal_fixed_size_set_full(GTK_TREE_VIEW(widgets->ConfigMainTree)); @@ -2077,9 +2215,12 @@ void yon_main_window_complete(main_window *widgets){ gtk_tree_model_filter_set_visible_func(widgets->SystemFilter,(GtkTreeModelFilterVisibleFunc)yon_filter,widgets,NULL); for (int i=0;i<5;i++){ gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(widgets->SystemSort),i,(GtkTreeIterCompareFunc)sort_bool,GINT_TO_POINTER(i),NULL); + gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(widgets->UserSort),i,(GtkTreeIterCompareFunc)sort_bool,GINT_TO_POINTER(i),NULL); } gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(widgets->SystemSort),5,(GtkTreeIterCompareFunc)sort_string,GINT_TO_POINTER(13),NULL); - gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(widgets->SystemSort),6,(GtkTreeIterCompareFunc)sort_string,GINT_TO_POINTER(6),NULL); + gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(widgets->SystemSort),6,(GtkTreeIterCompareFunc)sort_string,GINT_TO_POINTER(5),NULL); + gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(widgets->UserSort),5,(GtkTreeIterCompareFunc)sort_string,GINT_TO_POINTER(13),NULL); + gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(widgets->UserSort),6,(GtkTreeIterCompareFunc)sort_string,GINT_TO_POINTER(5),NULL); gtk_tree_view_set_search_column(GTK_TREE_VIEW(widgets->UserUnitsTree),5); yon_load_proceed(YON_CONFIG_LOCAL); yon_ubl_status_box_render(LIST_LOAD_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); diff --git a/source/ubl-settings-services.h b/source/ubl-settings-services.h index 2eecd13..71b730e 100644 --- a/source/ubl-settings-services.h +++ b/source/ubl-settings-services.h @@ -38,9 +38,30 @@ #define systemd_config_path "resource:///com/ublinux/csv/systemd_conf.csv" -#define load_services_command "systemctl list-units --no-pager --all --plain --no-legend |sed -E 's/(\\S+)\\s+(\\S+)\\s+(\\S+)\\s+(\\S+)\\s+(.*)/\\1;\\2;\\3;\\4;\\5/'" +#define load_services_command \ +"systemctl --property=Names,Description,LoadState,ActiveState,SubState,UnitFileState,ActiveEnterTimestampMonotonic,InactiveEnterTimestampMonotonic " \ +"--no-pager --all --no-legend show -- $( { " \ +"systemctl list-units --no-pager --all --plain --no-legend | sed -E 's/^([^ ]+).*/\\1/'; " \ +"systemctl list-unit-files --no-pager --no-legend | sed -E 's/^([^ ]+).*/\\1/'; " \ +"} | sed '/@\\./d' | sort -u ) | " \ +"awk 'BEGIN { RS=\"\"; FS=\"\\n\" } " \ +"{ for (i=1; i<=NF; i++) { split($i, kv, \"=\"); val[kv[1]] = kv[2]; } " \ +"print val[\"Names\"] \";\" val[\"LoadState\"] \";\" val[\"ActiveState\"] \";\" val[\"SubState\"] \";\" " \ +"val[\"Description\"] \";\" val[\"UnitFileState\"] \";\" val[\"ActiveEnterTimestampMonotonic\"] \";\" " \ +"val[\"InactiveEnterTimestampMonotonic\"]; delete val }'" + #define load_system_units_command "systemctl list-unit-files --no-pager --all --plain --no-legend |sed -E 's/(\\S+)\\s+(\\S+)\\s+(\\S+)(.*)/\\1/'" -#define load_user_units_command yon_char_unite("systemctl --user --machine=",yon_ubl_root_user_get(),"@ list-unit-files --no-pager --all --plain --no-legend |sed -E 's/(\\S+)\\s+(\\S+)\\s+(\\S+)(.*)/\\1;\\2;\\3;/'",NULL) +#define load_user_units_command yon_char_unite(\ +"systemctl --property=Names,Description,LoadState,ActiveState,SubState,UnitFileState,ActiveEnterTimestampMonotonic,InactiveEnterTimestampMonotonic " \ +"--no-pager --all --no-legend show -- $( { " \ +"systemctl --user --machine=",yon_ubl_root_user_get(),"@ list-units --no-pager --all --plain --no-legend | sed -E 's/^([^ ]+).*/\\1/'; " \ +"systemctl --user --machine=",yon_ubl_root_user_get(),"@ list-unit-files --no-pager --no-legend | sed -E 's/^([^ ]+).*/\\1/'; " \ +"} | sed '/@\\./d' | sort -u ) | " \ +"awk 'BEGIN { RS=\"\"; FS=\"\\n\" } " \ +"{ for (i=1; i<=NF; i++) { split($i, kv, \"=\"); val[kv[1]] = kv[2]; } " \ +"print val[\"Names\"] \";\" val[\"LoadState\"] \";\" val[\"ActiveState\"] \";\" val[\"SubState\"] \";\" " \ +"val[\"Description\"] \";\" val[\"UnitFileState\"] \";\" val[\"ActiveEnterTimestampMonotonic\"] \";\" " \ +"val[\"InactiveEnterTimestampMonotonic\"]; delete val }'",NULL) #define load_user_services_command yon_char_unite("systemctl --user --machine=",yon_ubl_root_user_get(),"@ list-units --no-pager --all --plain --no-legend |sed -E 's/(\\S+)\\s+(\\S+)\\s+(\\S+)\\s+(\\S+)\\s+(.*)/\\1;\\2;\\3;\\4;\\5/'",NULL) #define load_system_services_command "systemctl --system list-units --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 --no-pager --state=enabled --all |sed -e 's/ */:/g' -e 's/ *: */:/g'|cut -f1 -d:" @@ -55,6 +76,19 @@ #define user_check_active_command(target) yon_char_unite("systemctl --user --machine=",yon_ubl_root_user_get(),"@ is-active ",target,NULL) #define user_check_enabled_command(target) yon_char_unite("systemctl --user --machine=",yon_ubl_root_user_get(),"@ is-enabled ",target,NULL) +#define load_system_service_single(target) yon_char_unite("systemctl --property=Names,Description,LoadState,ActiveState,SubState,UnitFileState,ActiveEnterTimestampMonotonic,InactiveEnterTimestampMonotonic --no-pager --all --no-legend show -- ",target,\ +"awk 'BEGIN { RS=\"\"; FS=\"\\n\" } " \ +"{ for (i=1; i<=NF; i++) { split($i, kv, \"=\"); val[kv[1]] = kv[2]; } " \ +"print val[\"Names\"] \";\" val[\"LoadState\"] \";\" val[\"ActiveState\"] \";\" val[\"SubState\"] \";\" " \ +"val[\"Description\"] \";\" val[\"UnitFileState\"] \";\" val[\"ActiveEnterTimestampMonotonic\"] \";\" " \ +"val[\"InactiveEnterTimestampMonotonic\"]; delete val }'",NULL) +#define load_user_service_single(target) yon_char_unite("systemctl --user --machine=",yon_ubl_root_user_get(),"@ --property=Names,Description,LoadState,ActiveState,SubState,UnitFileState,ActiveEnterTimestampMonotonic,InactiveEnterTimestampMonotonic --no-pager --all --no-legend show -- ",target,\ +"awk 'BEGIN { RS=\"\"; FS=\"\\n\" } " \ +"{ for (i=1; i<=NF; i++) { split($i, kv, \"=\"); val[kv[1]] = kv[2]; } " \ +"print val[\"Names\"] \";\" val[\"LoadState\"] \";\" val[\"ActiveState\"] \";\" val[\"SubState\"] \";\" " \ +"val[\"Description\"] \";\" val[\"UnitFileState\"] \";\" val[\"ActiveEnterTimestampMonotonic\"] \";\" " \ +"val[\"InactiveEnterTimestampMonotonic\"]; delete val }'",NULL) + #define service_info_command(target) yon_char_append("systemctl status -l --no-pager ",target) #define get_log_command(target) yon_char_append("journalctl --all --no-pager --unit ",target) #define show_source_command(target) yon_char_append("systemctl edit --full ",target) @@ -92,7 +126,7 @@ #define yon_config_get_custom_command(target) yon_char_unite("ubconfig --source ",target," get system SERVICES_ENABLE SERVICES_DISABLE SERVICES_MASK",NULL) #define config_get_local_command "ubconfig --source system get system SERVICES_ENABLE SERVICES_DISABLE SERVICES_MASK" #define config_get_global_command yon_char_new("ubconfig --source global get system SERVICES_ENABLE SERVICES_DISABLE SERVICES_MASK") -#define config_get_default_command "" +#define config_get_default_command "ubconfig --source default get system SERVICES_ENABLE SERVICES_DISABLE SERVICES_MASK" #define config_get_global_only_parameters "" #define config_get_local_only_parameters "" @@ -207,6 +241,16 @@ typedef struct { rmb_menu_window *SystemMenu; GtkWidget *SystemServiceLabel; GtkWidget *SystemDescriptionLabel; + GtkWidget *SystemLoadingOverlay; + GtkWidget *SystemLoadingSpinner; + GtkWidget *UserLoadingOverlay; + GtkWidget *UserLoadingSpinner; + GtkWidget *ConfigLoadingOverlay; + GtkWidget *ConfigLoadingSpinner; + GtkWidget *SessionsLoadingOverlay; + GtkWidget *SessionsLoadingSpinner; + GtkWidget *TimersLoadingOverlay; + GtkWidget *TimersLoadingSpinner; GtkWidget *UserSearchEntry; GtkWidget *UserFiltersCombo; @@ -546,4 +590,5 @@ gboolean yon_interface_list_models_disconnect(main_window *widgets); void on_sort_activate(GtkTreeViewColumn *self, main_window *widgets); gboolean sort_bool(GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b,gpointer col); gboolean sort_string(GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b,gpointer col); +void yon_service_update(main_window *widgets); #endif \ No newline at end of file diff --git a/ubl-settings-services.glade b/ubl-settings-services.glade index c124c37..96d0279 100644 --- a/ubl-settings-services.glade +++ b/ubl-settings-services.glade @@ -1,5 +1,5 @@ - + @@ -13,6 +13,10 @@ + + True + False + @@ -31,6 +35,10 @@ + + True + False + @@ -69,6 +77,10 @@ SystemFilter + + True + False + @@ -85,6 +97,10 @@ + + True + False + True False @@ -371,6 +387,10 @@ UserFilter + + True + False + True False @@ -907,179 +927,192 @@ 0 in - + True False - vertical - - - True - True - liststore1 - vertical - - - - - - fixed - Configure in configuration - - - - - fixed - Configure in system - - - - - autosize - Service - True - - - - - False - True - 0 - - - + True - True + False + vertical - + True True - SystemList - 5 - both - 12 + liststore1 + vertical - True fixed - 20 - Autostart - True - 0 - - - - 0 - - + Configure in configuration - True fixed - 20 - Autostop - True - 1 - - - - 1 - - + Configure in system - True - fixed - 20 - Block + autosize + Service True - 2 - - - - 2 - - + + + False + True + 0 + + + + + True + True + never - - True - fixed - 20 - Autostart - True - 3 + + True + True + SystemList + 5 + both + 12 + + + - - - 3 - + + True + fixed + 20 + Autostart + True + 0 + + + + 0 + + + - - - - - True - fixed - 20 - Launched - True - 4 - - - 4 - + + True + fixed + 20 + Autostop + True + 1 + + + + 1 + + + - - - - - True - 10 - 20 - Unit - True - 5 - - - 11 - + + True + fixed + 20 + Block + True + 2 + + + + 2 + + + - - - - - True - fixed - 20 - - True - 6 - - - 5 - + + True + fixed + 20 + Autostart + True + 3 + + + + 3 + + + + + + + True + fixed + 20 + Launched + True + 4 + + + + 4 + + + + + + + True + 10 + 20 + Unit + True + 5 + + + + 11 + + + + + + + True + fixed + 20 + + True + 6 + + + 250 + 250 + + + 5 + + + + + True + True + 1 + - True - True - 1 + -1 @@ -1527,174 +1560,187 @@ 0.019999999552965164 in - + True False - vertical - + True - True - liststore1 - - - - - - Configure in configuration - - - - - Configure in system - - - - - Service - True - - - - - False - True - 0 - - - - - True - True + False + vertical - + True True - UserList - 5 - both - 12 + liststore1 - True - fixed - 20 - Autostart - True - 0 - - - - 0 - - + Configure in configuration - True - fixed - 20 - Autostop - True - 1 - - - - 1 - - + Configure in system - True - fixed - 20 - Block + Service True - 2 - - - - 2 - - + + + False + True + 0 + + + + + True + True + never - - True - fixed - 20 - Autostart - True + + True + True + UserList + 5 + both + 12 + + + - - - 3 - + + True + fixed + 20 + Autostart + True + 0 + + + + 0 + + + - - - - - True - fixed - 20 - Launched - True - 4 - - - 4 - + + True + fixed + 20 + Autostop + True + 1 + + + + 1 + + + - - - - - True - 10 - 20 - Unit - True - 5 - - - 11 - + + True + fixed + 20 + Block + True + 2 + + + + 2 + + + + + + + True + fixed + 20 + Autostart + True + 3 + + + + 3 + + + + + + + True + fixed + 20 + Launched + True + 4 + + + + 4 + + + - - - - - autosize - 20 - - True - True - 6 - - - 5 - + + True + 10 + 20 + Unit + True + 5 + + + + 11 + + + + + + + autosize + 20 + + True + True + 6 + + + 250 + + + 5 + + + + + True + True + 1 + - True - True - 1 + -1 @@ -1885,63 +1931,72 @@ 0 in - + True - True + False - + True True - ConfigList - both - - - - - True - fixed - 20 - File - 0 + + True + True + ConfigList + both + + + - - - 0 - + + True + fixed + 20 + File + 0 + + + + 0 + + + - - - - - True - fixed - 20 - Change date - 1 - - - 1 - + + True + fixed + 20 + Change date + 1 + + + + 1 + + + - - - - - 20 - Description - True - 2 - - - 2 - + + 20 + Description + True + 2 + + + + 2 + + + + + -1 + @@ -2100,105 +2155,114 @@ 0 in - + True - True + False - + True True - SessionsList - both - - - - - True - fixed - 20 - Session ID - 0 + + True + True + SessionsList + both + + + - - - 0 - + + True + fixed + 20 + Session ID + 0 + + + + 0 + + + - - - - - True - fixed - 20 - Status - 1 - - - 1 - + + True + fixed + 20 + Status + 1 + + + + 1 + + + - - - - - True - fixed - 20 - User ID - 2 - - - 2 - + + True + fixed + 20 + User ID + 2 + + + + 2 + + + - - - - - True - fixed - 20 - User name - 3 - - - 3 - + + True + fixed + 20 + User name + 3 + + + + 3 + + + - - - - - 20 - Seat ID - 4 - - - 4 - + + 20 + Seat ID + 4 + + + + 4 + + + - - - - - 20 - TTY - True - - - 6 - + + 20 + TTY + True + + + + 6 + + + + + -1 + @@ -2274,108 +2338,117 @@ 0.019999999552965164 in - + True - True + False - + True True - TimersList - both - - - - - True - fixed - 20 - Timer - 0 + + True + True + TimersList + both + + + - - - 0 - + + True + fixed + 20 + Timer + 0 + + + + 0 + + + - - - - - True - fixed - 20 - Next - 1 - - - 1 - + + True + fixed + 20 + Next + 1 + + + + 1 + + + - - - - - True - fixed - 20 - Left - 2 - - - 2 - + + True + fixed + 20 + Left + 2 + + + + 2 + + + - - - - - True - fixed - 20 - Last - 3 - - - 3 - + + True + fixed + 20 + Last + 3 + + + + 3 + + + - - - - - True - fixed - 20 - Passed - 4 - - - 4 - + + True + fixed + 20 + Passed + 4 + + + + 4 + + + - - - - - 20 - Activates - True - 5 - - - 5 - + + 20 + Activates + True + 5 + + + + 5 + + + + + -1 + diff --git a/ubl-settings-services_ru.po b/ubl-settings-services_ru.po index 348428b..dcc38b7 100644 --- a/ubl-settings-services_ru.po +++ b/ubl-settings-services_ru.po @@ -269,7 +269,7 @@ msgid "" "If this is your active session, you will be taken to the login screen. Make " "sure to save all files before performing this operation." msgstr "" -"Если это ваша активная сессия, вы будете выведены в экран входа. Убедитесь, " +"Если это ваша активная сессия, вы будете переключены на экран входа. Убедитесь, " "что сохранили все файлы перед выполнением этой операции." #: source/ubl-strings.h:77 @@ -298,7 +298,7 @@ msgstr "Отключение автообновления юнита" #: source/ubl-strings.h:85 msgid "Switching to session" -msgstr "Переключение на сессию" +msgstr "Переключиться на сессию" #: source/ubl-strings.h:86 msgid "Session locking"