#include "ubl-settings-services.h" config main_config; //functions void yon_load_proceed(YON_CONFIG_TYPE type){ 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 (!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 (!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,"system","SERVICES_ENABLE SERVICES_DISABLE SERVICES_MASK",NULL); } void on_config_local_save(){ 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,"system","SERVICES_ENABLE SERVICES_DISABLE SERVICES_MASK",NULL); } static void child_ready(VteTerminal *terminal, GPid pid, GError *error, gpointer user_data) { if (error){}; if (!terminal) return; if (pid == -1) printf("Error\n\n\n"); else vte_terminal_feed_child(VTE_TERMINAL(terminal),(char*)user_data,strlen((char*)user_data)); } void yon_terminal_integrated_start(GtkWidget *terminal, char* command, void *endwork_function, void* endwork_function_argument){ char **commands=new_arr(char*,2); gchar **envp = g_get_environ(); commands[0]=(gchar *)g_strdup(g_environ_getenv(envp, "SHELL")); commands[1]=NULL; char **env=new_arr(char*,2); env[0]=""; env[1]=NULL; vte_terminal_set_size(VTE_TERMINAL(terminal),10,15); VtePty *pty = vte_pty_new_sync(VTE_PTY_DEFAULT,NULL,NULL); vte_terminal_set_pty(VTE_TERMINAL(terminal),pty); char *install_command=yon_char_unite("clear;tput cup 0 0 && tput ed; ",command," ; sleep 5; stty -echo; unset PS1","\n",NULL); if(endwork_function) g_signal_connect(G_OBJECT(terminal), "child-exited", G_CALLBACK(endwork_function), endwork_function_argument); vte_terminal_spawn_async(VTE_TERMINAL(terminal), VTE_PTY_DEFAULT, NULL, commands, NULL, 0, NULL, NULL, NULL, -1, NULL, child_ready, install_command); vte_pty_spawn_async(pty, NULL, commands, NULL, 0, NULL, NULL, NULL, -1, NULL, NULL, NULL); vte_terminal_set_scrollback_lines(VTE_TERMINAL(terminal), -1); vte_terminal_set_scroll_on_output(VTE_TERMINAL(terminal), TRUE); vte_terminal_set_scroll_on_keystroke(VTE_TERMINAL(terminal), TRUE); gtk_widget_show_all(terminal); } // standard functions void on_config_autostart_clicked(GtkWidget *self, main_window *widgets){ if (self){}; GtkTreeIter iter; GtkTreeModel *model = GTK_TREE_MODEL(widgets->liststore2); if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->MainTree)),&model,&iter)){ gboolean status = 0; char *name; gtk_tree_model_get(model,&iter,0,&status,5,&name,-1); char *parsed_name = yon_char_divide(name, yon_char_find_last(name,'.')); 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("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("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("SERVICES_ENABLE",yon_char_parsed_to_string(parsed,size,",")); else yon_config_remove_by_key("SERVICES_ENABLE"); } } yon_char_parsed_free(parsed,size); } } void on_config_autostop_clicked(GtkWidget *self, main_window *widgets){ if (self){}; GtkTreeIter iter; GtkTreeModel *model = GTK_TREE_MODEL(widgets->liststore2); if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->MainTree)),&model,&iter)){ gboolean status = 0; char *name; gtk_tree_model_get(model,&iter,1,&status,5,&name,-1); char *parsed_name = yon_char_divide(name, yon_char_find_last(name,'.')); 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("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("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("SERVICES_DISABLE",yon_char_parsed_to_string(parsed,size,",")); else yon_config_remove_by_key("SERVICES_DISABLE"); } } yon_char_parsed_free(parsed,size); } } void on_config_block_clicked(GtkWidget *self, main_window *widgets){ if (self){}; GtkTreeIter iter; GtkTreeModel *model = GTK_TREE_MODEL(widgets->liststore2); if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->MainTree)),&model,&iter)){ gboolean status = 0; char *name; gtk_tree_model_get(model,&iter,2,&status,5,&name,-1); char *parsed_name = yon_char_divide(name, yon_char_find_last(name,'.')); 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("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("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("SERVICES_MASK",yon_char_parsed_to_string(parsed,size,",")); else yon_config_remove_by_key("SERVICES_MASK"); } } yon_char_parsed_free(parsed,size); } } void on_system_autostart_clicked(GtkWidget *self, main_window *widgets){ if (self){}; GtkTreeIter iter; GtkTreeModel *model = GTK_TREE_MODEL(widgets->liststore2); if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->MainTree)),&model,&iter)){ gboolean status = 0; char *service_name; gtk_tree_model_get(model,&iter,3,&status,5,&service_name,-1); gtk_list_store_set(GTK_LIST_STORE(widgets->liststore2),&iter,3,!status,-1); yon_launch((!status)==1 ? service_enable_command(service_name) : \ service_disable_command(service_name)); } } void on_system_launch_clicked(GtkWidget *self, main_window *widgets){ if (self){}; GtkTreeIter iter; GtkTreeModel *model = GTK_TREE_MODEL(widgets->liststore2); if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->MainTree)),&model,&iter)){ 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)); } } gboolean yon_service_source_check(GtkTreeModel *model, GtkTreeIter *iter,void *data){ if (data){}; int type; gtk_tree_model_get(model,iter,8,&type,-1); return 1; } gboolean on_service_filter(GtkTreeModel *model, GtkTreeIter *iter,void *data){ if (data){}; int type; gtk_tree_model_get(model,iter,7,&type,-1); if (type==1) return 1; return 0; } gboolean on_socket_filter(GtkTreeModel *model, GtkTreeIter *iter,void *data){ if (data){}; int type; gtk_tree_model_get(model,iter,7,&type,-1); if (type==2) return 1; return 0; } gboolean on_autostart_filter(GtkTreeModel *model, GtkTreeIter *iter,void *data){ if (data){}; gboolean type; gtk_tree_model_get(model,iter,0,&type,-1); if (type) return 1; return 0; } gboolean on_stopped_filter(GtkTreeModel *model, GtkTreeIter *iter,void *data){ if (data){}; gboolean type; gtk_tree_model_get(model,iter,1,&type,-1); if (type) return 1; return 0; } gboolean on_blocked_filter(GtkTreeModel *model, GtkTreeIter *iter,void *data){ if (data){}; gboolean type; gtk_tree_model_get(model,iter,2,&type,-1); if (type) return 1; 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))){ case 0: gtk_tree_view_set_model(GTK_TREE_VIEW(widgets->MainTree),GTK_TREE_MODEL(widgets->liststore2)); break; case 1: gtk_tree_view_set_model(GTK_TREE_VIEW(widgets->MainTree),GTK_TREE_MODEL(main_config.ServiceFilter)); gtk_tree_model_filter_refilter(GTK_TREE_MODEL_FILTER(main_config.ServiceFilter)); break; case 2: gtk_tree_view_set_model(GTK_TREE_VIEW(widgets->MainTree),GTK_TREE_MODEL(main_config.SocketFilter)); gtk_tree_model_filter_refilter(GTK_TREE_MODEL_FILTER(main_config.SocketFilter)); break; case 3: gtk_tree_view_set_model(GTK_TREE_VIEW(widgets->MainTree),GTK_TREE_MODEL(main_config.AutolaunchFilter)); gtk_tree_model_filter_refilter(GTK_TREE_MODEL_FILTER(main_config.AutolaunchFilter)); break; case 4: gtk_tree_view_set_model(GTK_TREE_VIEW(widgets->MainTree),GTK_TREE_MODEL(main_config.StoppedFilter)); gtk_tree_model_filter_refilter(GTK_TREE_MODEL_FILTER(main_config.StoppedFilter)); break; case 5: gtk_tree_view_set_model(GTK_TREE_VIEW(widgets->MainTree),GTK_TREE_MODEL(main_config.BlockedFilter)); 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){ if (self){}; yon_terminal_integrated_start(window->SystemTerminal,service_info_command(window->target),NULL,NULL); GdkRGBA rgba; vte_terminal_get_color_background_for_draw(VTE_TERMINAL(window->SystemTerminal),&rgba); vte_terminal_set_color_cursor(VTE_TERMINAL(window->SystemTerminal),&rgba); } terminal_window *yon_terminal_window_new(){ terminal_window *window = malloc(sizeof(terminal_window)); GtkBuilder *builder = gtk_builder_new_from_resource(glade_path_terminal); window->Window = yon_gtk_builder_get_widget(builder,"MonitorWindow"); window->SystemTerminal = yon_gtk_builder_get_widget(builder,"SystemTerminal"); window->UpdateButton = yon_gtk_builder_get_widget(builder,"UpdateButton"); window->webHeaderNameLabel = yon_gtk_builder_get_widget(builder,"webHeaderNameLabel"); window->target=NULL; yon_window_config_custom_window_setup(GTK_WINDOW(window->Window),"terminal_window"); g_signal_connect(G_OBJECT(window->UpdateButton),"clicked",G_CALLBACK(on_service_update),window); gtk_widget_show(window->Window); return window; } void on_info_clicked(GtkWidget *self, main_window *widgets){ if (self){} GtkTreeModel *model = GTK_TREE_MODEL(widgets->liststore2); GtkTreeIter iter; if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->MainTree)),&model,&iter)){ char *service_name; gtk_tree_model_get(model,&iter,5,&service_name,-1); if (!yon_char_is_empty(service_name)){ terminal_window *window = yon_terminal_window_new(); window->target=service_name; char *header = yon_char_unite(STATUS_LABEL," ",service_name,NULL); gtk_label_set_text(GTK_LABEL(window->webHeaderNameLabel),header); gtk_window_set_title(GTK_WINDOW(window->Window),header); free(header); on_service_update(NULL,window); } } } 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); } else if (main_config.load_mode==0){ on_config_global_load(NULL,(main_window*)widgets); } return NULL; } void on_update(GtkWidget *self,main_window *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; // 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)); // break; // case 1: gtk_tree_model_filter_refilter(GTK_TREE_MODEL_FILTER(main_config.ServiceFilter)); // gtk_tree_view_set_model(GTK_TREE_VIEW(widgets->MainTree),main_config.ServiceFilter); // break; // case 2: gtk_tree_model_filter_refilter(GTK_TREE_MODEL_FILTER(main_config.SocketFilter)); // gtk_tree_view_set_model(GTK_TREE_VIEW(widgets->MainTree),main_config.SocketFilter); // break; // case 3: gtk_tree_model_filter_refilter(GTK_TREE_MODEL_FILTER(main_config.AutolaunchFilter)); // gtk_tree_view_set_model(GTK_TREE_VIEW(widgets->MainTree),main_config.AutolaunchFilter); // break; // case 4: gtk_tree_model_filter_refilter(GTK_TREE_MODEL_FILTER(main_config.StoppedFilter)); // gtk_tree_view_set_model(GTK_TREE_VIEW(widgets->MainTree),main_config.StoppedFilter); // break; // case 5: gtk_tree_model_filter_refilter(GTK_TREE_MODEL_FILTER(main_config.BlockedFilter)); // 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); } else { yon_ubl_status_box_render(GLOBAL_LOAD_SUCCESS_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); } textdomain(LocaleName); return NULL; } 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); char *command = load_user_services_command; config_str users_services = yon_config_load(command,&size_users); 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=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; config_str enabled_parsed = yon_config_load(load_enabled_command,&enabled_size); yon_char_parsed_divide_search_full(launched_parsed,launched_size,"\n",-1); 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("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'; if (!yon_char_is_empty(stop)&&stop[strlen(stop)-1]=='\n') stop[strlen(stop)-1]='\0'; if (!yon_char_is_empty(block)&&block[strlen(block)-1]=='\n') block[strlen(block)-1]='\0'; int valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(widgets->liststore2),&iter); for (;valid;valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(widgets->liststore2),&iter)){ char *name; gtk_tree_model_get(GTK_TREE_MODEL(widgets->liststore2),&iter,5,&name,-1); char *name_parsed = yon_char_divide(name,yon_char_find_last(name,'.')); free(name); if (!yon_char_is_empty(start)){ if (strstr(start,name_parsed)) gtk_list_store_set(widgets->liststore2,&iter,0,1,-1); else gtk_list_store_set(widgets->liststore2,&iter,0,0,-1); } if (!yon_char_is_empty(stop)){ if (strstr(stop,name_parsed)) gtk_list_store_set(widgets->liststore2,&iter,1,1,-1); else gtk_list_store_set(widgets->liststore2,&iter,1,0,-1); } if (!yon_char_is_empty(block)){ if (strstr(block,name_parsed)) gtk_list_store_set(widgets->liststore2,&iter,2,1,-1); else gtk_list_store_set(widgets->liststore2,&iter,2,0,-1); } if (!yon_char_is_empty(launched)){ if (strstr(launched,name_parsed)) gtk_list_store_set(widgets->liststore2,&iter,4,1,-1); else gtk_list_store_set(widgets->liststore2,&iter,4,0,-1); } if (!yon_char_is_empty(enabled)){ if (strstr(enabled,name_parsed)) gtk_list_store_set(widgets->liststore2,&iter,3,1,-1); else gtk_list_store_set(widgets->liststore2,&iter,3,0,-1); } free(name_parsed); while(gtk_events_pending()) gtk_main_iteration(); } update_delay(widgets); gtk_widget_set_sensitive(widgets->UpdateButton,1); return 0; } void on_column_resize(GtkTreeViewColumn *self,GParamSpec *pspec,main_window *widgets){ if (self||pspec){} GList *list = gtk_tree_view_get_columns(GTK_TREE_VIEW(widgets->MainTree)); int width_configuration = gtk_tree_view_column_get_width(g_list_nth_data(list,0))+gtk_tree_view_column_get_width(g_list_nth_data(list,1))+gtk_tree_view_column_get_width(g_list_nth_data(list,2)); int width_system = gtk_tree_view_column_get_width(g_list_nth_data(list,3))+gtk_tree_view_column_get_width(g_list_nth_data(list,4)); g_list_free(list); gtk_tree_view_column_set_fixed_width(gtk_tree_view_get_column(GTK_TREE_VIEW(widgets->MainUpperTree),0),width_configuration); gtk_tree_view_column_set_fixed_width(gtk_tree_view_get_column(GTK_TREE_VIEW(widgets->MainUpperTree),1),width_system); } GtkWidget *yon_menu_separator_create() { GtkWidget *menu_item = gtk_separator_menu_item_new(); 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; } 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; if(icon_name){ icon = gtk_image_new_from_icon_name(icon_name,GTK_ICON_SIZE_BUTTON); gtk_box_pack_start(GTK_BOX(box),icon,0,0,5); } GtkWidget *label = gtk_label_new(text); gtk_box_pack_start(GTK_BOX(box),label,0,0,5); gtk_container_add(GTK_CONTAINER(menu_item),box); gtk_widget_show_all(menu_item); return menu_item; } gboolean on_context_menu_open(GtkWidget *self,GdkEventButton *event, main_window *widgets){ if (self){}; if (event->button==3){ main_config.rmb_clicked=1; menu_obj *menu_object = g_malloc0(sizeof(menu_obj)); GtkWidget *menu = gtk_menu_new(); gtk_menu_set_reserve_toggle_size(GTK_MENU(menu),0); GtkWidget *menu_item_configuration_in_config = yon_menu_button_create(NULL,CONFIG_CONFIGURATION_LABEL); gtk_widget_set_sensitive(menu_item_configuration_in_config,0); GtkWidget *menu_item_autostart_config = yon_menu_button_create("media-playback-start-symbolic",AUTOSTART_LABEL); GtkWidget *menu_item_autostop = yon_menu_button_create("media-playback-stop-symbolic",AUTOSTOP_LABEL); GtkWidget *menu_item_block = yon_menu_button_create("process-stop-symbolic",BLOCK_LABEL); GtkWidget *menu_item_separator1 = yon_menu_separator_create(); 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_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); menu_object->Menu = menu; menu_object->MenuConfigAutostart = menu_item_autostart_config; menu_object->MenuConfigAutostop = menu_item_autostop; menu_object->MenuConfigBlock = menu_item_block; menu_object->MenuSystemAutostart = menu_item_autostart_system; menu_object->MenuSystemLaunched = menu_item_launched; menu_object->MenuReloadConfig = menu_item_reload; menu_object->MenuStatus = menu_item_status; g_signal_connect(G_OBJECT(menu_item_autostart_config),"activate",G_CALLBACK(on_config_autostart_clicked),widgets); g_signal_connect(G_OBJECT(menu_item_autostop),"activate",G_CALLBACK(on_config_autostop_clicked),widgets); g_signal_connect(G_OBJECT(menu_item_block),"activate",G_CALLBACK(on_config_block_clicked),widgets); g_signal_connect(G_OBJECT(menu_item_autostart_system),"activate",G_CALLBACK(on_system_autostart_clicked),widgets); g_signal_connect(G_OBJECT(menu_item_launched),"activate",G_CALLBACK(on_system_launch_clicked),widgets); g_signal_connect(G_OBJECT(menu_item_reload),"activate",G_CALLBACK(on_update),widgets); g_signal_connect(G_OBJECT(menu_item_status),"activate",G_CALLBACK(on_info_clicked),widgets); gtk_menu_shell_append(GTK_MENU_SHELL(menu),menu_item_configuration_in_config); gtk_menu_shell_append(GTK_MENU_SHELL(menu),menu_item_autostart_config); gtk_menu_shell_append(GTK_MENU_SHELL(menu),menu_item_autostop); gtk_menu_shell_append(GTK_MENU_SHELL(menu),menu_item_block); gtk_menu_shell_append(GTK_MENU_SHELL(menu),menu_item_separator1); gtk_menu_shell_append(GTK_MENU_SHELL(menu),menu_item_configuration_in_system); gtk_menu_shell_append(GTK_MENU_SHELL(menu),menu_item_autostart_system); gtk_menu_shell_append(GTK_MENU_SHELL(menu),menu_item_launched); gtk_menu_shell_append(GTK_MENU_SHELL(menu),menu_item_separator2); gtk_menu_shell_append(GTK_MENU_SHELL(menu),menu_item_reload); 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_menu_popup_at_pointer(GTK_MENU(menu),NULL); return 0; } return 0; } /**config_init() * [EN] * * [RU] * Функция инициализации всех параметров конфигурации */ void config_init(){ main_config.always_open_documentation=0; main_config.socket_id=-1; main_config.save_socket_id=-1; main_config.load_socket_id=-1; main_config.lock_help=0; main_config.lock_help=0; 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.update_thread_active=0; } void on_activate(GtkTreeView *self, main_window *widgets){ if (self){}; GtkTreeIter iter; 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(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){ 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] * * [RU] * Функция настройки основного окна приложения. [widgets] - структура со стандартным интерфейсом. */ void yon_main_window_complete(main_window *widgets){ widgets = yon_remalloc(widgets,sizeof(main_window)); GtkBuilder *builder = gtk_builder_new_from_resource(glade_path); gtk_box_pack_start(GTK_BOX(widgets->InterfaceBox),yon_gtk_builder_get_widget(builder,"BoxMain"),1,1,0); // Custom widgets configuration widgets->liststore1=GTK_LIST_STORE(gtk_builder_get_object(builder,"liststore1")); widgets->liststore2=GTK_LIST_STORE(gtk_builder_get_object(builder,"liststore2")); widgets->BoxMain=yon_gtk_builder_get_widget(builder,"BoxMain"); widgets->ServiceSourceCombo=yon_gtk_builder_get_widget(builder,"ServiceSourceCombo"); widgets->ServiceTypeCombo=yon_gtk_builder_get_widget(builder,"ServiceTypeCombo"); widgets->SearchEntry=yon_gtk_builder_get_widget(builder,"SearchEntry"); widgets->UpdateButton=yon_gtk_builder_get_widget(builder,"UpdateButton"); widgets->ConfigAutostartButton=yon_gtk_builder_get_widget(builder,"ConfigAutostartButton"); widgets->ConfigAutostopButton=yon_gtk_builder_get_widget(builder,"ConfigAutostopButton"); widgets->ConfigBlockButton=yon_gtk_builder_get_widget(builder,"ConfigBlockButton"); widgets->SystemAutostartButton=yon_gtk_builder_get_widget(builder,"SystemAutostartButton"); widgets->SystemLaunchButton=yon_gtk_builder_get_widget(builder,"SystemLaunchButton"); widgets->InfoButton=yon_gtk_builder_get_widget(builder,"InfoButton"); widgets->LogButton=yon_gtk_builder_get_widget(builder,"LogButton"); widgets->MainUpperTree=yon_gtk_builder_get_widget(builder,"MainUpperTree"); widgets->MainTree=yon_gtk_builder_get_widget(builder,"MainTree"); widgets->DescriptionLabel=yon_gtk_builder_get_widget(builder,"DescriptionLabel"); widgets->ServiceLabel=yon_gtk_builder_get_widget(builder,"ServiceLabel"); gtk_style_context_add_class(gtk_widget_get_style_context(widgets->DocumentationMenuItem),"menuitemmiddlemargin"); GList *list = gtk_tree_view_get_columns(GTK_TREE_VIEW(widgets->MainTree)); yon_gtk_tree_view_minimal_fixed_size_set_full(GTK_TREE_VIEW(widgets->MainTree)); g_signal_connect(G_OBJECT(widgets->MainTree),"button-press-event",G_CALLBACK(on_context_menu_open),widgets); g_signal_connect(G_OBJECT(widgets->ConfigAutostartButton),"clicked",G_CALLBACK(on_config_autostart_clicked),widgets); g_signal_connect(G_OBJECT(widgets->ConfigAutostopButton),"clicked",G_CALLBACK(on_config_autostop_clicked),widgets); g_signal_connect(G_OBJECT(widgets->ConfigBlockButton),"clicked",G_CALLBACK(on_config_block_clicked),widgets); g_signal_connect(G_OBJECT(widgets->SystemAutostartButton),"clicked",G_CALLBACK(on_system_autostart_clicked),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_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); g_signal_connect(G_OBJECT(g_list_nth_data(list,3)),"notify::width",G_CALLBACK(on_column_resize),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); 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); main_config.SocketFilter = gtk_tree_model_filter_new(GTK_TREE_MODEL(widgets->liststore2),NULL); gtk_tree_model_filter_set_visible_func(GTK_TREE_MODEL_FILTER(main_config.SocketFilter),(GtkTreeModelFilterVisibleFunc)on_socket_filter,NULL,NULL); main_config.AutolaunchFilter = gtk_tree_model_filter_new(GTK_TREE_MODEL(widgets->liststore2),NULL); gtk_tree_model_filter_set_visible_func(GTK_TREE_MODEL_FILTER(main_config.AutolaunchFilter),(GtkTreeModelFilterVisibleFunc)on_autostart_filter,NULL,NULL); main_config.StoppedFilter = gtk_tree_model_filter_new(GTK_TREE_MODEL(widgets->liststore2),NULL); gtk_tree_model_filter_set_visible_func(GTK_TREE_MODEL_FILTER(main_config.StoppedFilter),(GtkTreeModelFilterVisibleFunc)on_stopped_filter,NULL,NULL); main_config.BlockedFilter = gtk_tree_model_filter_new(GTK_TREE_MODEL(widgets->liststore2),NULL); gtk_tree_model_filter_set_visible_func(GTK_TREE_MODEL_FILTER(main_config.BlockedFilter),(GtkTreeModelFilterVisibleFunc)on_blocked_filter,NULL,NULL); 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); 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