diff --git a/source/ubl-settings-services.c b/source/ubl-settings-services.c index 3f4ae0e..b1c4d60 100644 --- a/source/ubl-settings-services.c +++ b/source/ubl-settings-services.c @@ -17,7 +17,7 @@ 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); + gdk_threads_add_idle((GSourceFunc)((gboolean*)(void*)yon_interface_update),widgets); main_config.load_mode=1; } } @@ -28,7 +28,7 @@ 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); + gdk_threads_add_idle((GSourceFunc)((gboolean*)(void*)yon_interface_update),widgets); main_config.load_mode=0; } @@ -243,12 +243,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){}; @@ -295,6 +289,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))){ @@ -322,6 +336,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){ @@ -389,7 +418,6 @@ void on_update(GtkWidget *self,main_window *widgets){ } void *update_delay(main_window *widgets){ - sleep(1); main_config.update_thread_active=0; switch (gtk_combo_box_get_active(GTK_COMBO_BOX(widgets->ServiceTypeCombo))){ case 0: gtk_tree_view_set_model(GTK_TREE_VIEW(widgets->MainTree),GTK_TREE_MODEL(widgets->liststore2)); @@ -410,6 +438,17 @@ void *update_delay(main_window *widgets){ gtk_tree_view_set_model(GTK_TREE_VIEW(widgets->MainTree),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 source_mode = gtk_combo_box_get_active(GTK_COMBO_BOX(widgets->ServiceSourceCombo)); + if (source_mode==1){ + gtk_tree_model_filter_set_visible_func(GTK_TREE_MODEL_FILTER(main_config.ServiceFilter),(GtkTreeModelFilterVisibleFunc)on_source_system_filter,NULL,NULL); + } else if (source_mode==2){ + gtk_tree_model_filter_set_visible_func(GTK_TREE_MODEL_FILTER(main_config.ServiceFilter),(GtkTreeModelFilterVisibleFunc)on_source_user_filter,NULL,NULL); + } textdomain(template_ui_LocaleName); if (main_config.load_mode){ yon_ubl_status_box_render(LOCAL_LOAD_SUCCESS_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); @@ -420,12 +459,16 @@ void *update_delay(main_window *widgets){ 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_tree_view_set_model(GTK_TREE_VIEW(widgets->MainTree),NULL); config_str services = yon_config_load(load_services_command,&size); + config_str users_services = yon_config_load(load_user_services_command,&size_users); for (int i=0;iliststore2,&iter,5,parsed[0],6,description,7,type,-1); + int user_service=0; + if (yon_char_parsed_check_exist(users_services,size_users,parsed[0])!=-1){ + 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); @@ -490,15 +537,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(); } - g_thread_new("",(GThreadFunc)update_delay,widgets); - // int type_active=0; - // if (!(type_active=gtk_combo_box_get_active(GTK_COMBO_BOX(widgets->ServiceTypeCombo)))){ - // gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->ServiceTypeCombo),type_active); - // } if (!(type_active=gtk_combo_box_get_active(GTK_COMBO_BOX(widgets->ServiceTypeCombo)))){ - // gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->ServiceTypeCombo),type_active); - // } - 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){ @@ -694,6 +737,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); @@ -718,7 +762,7 @@ void yon_main_window_complete(main_window *widgets){ yon_ubl_status_box_render(LIST_LOAD_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); if (!main_config.update_thread_active){ main_config.update_thread_active=1; - g_thread_new("",(GThreadFunc)yon_interface_update,widgets); + gdk_threads_add_idle((GSourceFunc)((gboolean*)(void*)yon_interface_update),widgets); } } diff --git a/source/ubl-settings-services.h b/source/ubl-settings-services.h index b40b4ff..a8b683e 100644 --- a/source/ubl-settings-services.h +++ b/source/ubl-settings-services.h @@ -33,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("su -l ",yon_ubl_root_user_get()," -c \"systemctl --user list-units --type=service --type=socket --no-pager --all |grep -E \"^ \" |grep -v \"UNIT\" |sed -e 's/ */;/g' -e 's/^;//g' |cut -f1 -d';'\"",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) @@ -68,6 +70,8 @@ typedef struct { GtkTreeModel *AutolaunchFilter; GtkTreeModel *StoppedFilter; GtkTreeModel *BlockedFilter; + + GtkTreeModel *SourceFilter; int update_thread_active; } config; @@ -183,7 +187,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); @@ -207,8 +211,6 @@ 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); @@ -245,6 +247,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