From baa73d6cf14733d5e3310a4f94720336dc9e1c81 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Fri, 21 Jul 2023 11:46:33 +0600 Subject: [PATCH] Interface handlers --- .gitignore | 4 +- com.ublinux.ubl-settings-services.svg | 945 ++++++++++++++++++++++++-- gresource.xml | 1 + source/CMakeLists.txt | 11 +- source/ubl-settings-services.c | 308 ++++++++- source/ubl-settings-services.h | 39 +- source/ubl-utils.c | 170 ++++- source/ubl-utils.h | 10 +- ubl-settings-services-terminal.glade | 106 +++ ubl-settings-services.css | 52 +- ubl-settings-services.glade | 873 +++++++++++++----------- 11 files changed, 1969 insertions(+), 550 deletions(-) create mode 100644 ubl-settings-services-terminal.glade diff --git a/.gitignore b/.gitignore index f377085..b51680c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,9 +1,11 @@ .vscode/ ubl-settings-services +ubl-settings-TEMPLATE *~ build/ compile/ *# terminal-commands/ source/ubl-cmake.h -vgcore* \ No newline at end of file +vgcore* +.install.sh \ No newline at end of file diff --git a/com.ublinux.ubl-settings-services.svg b/com.ublinux.ubl-settings-services.svg index f636c26..5a800cb 100644 --- a/com.ublinux.ubl-settings-services.svg +++ b/com.ublinux.ubl-settings-services.svg @@ -4,8 +4,8 @@ height="180" version="1.0" id="svg8" - sodipodi:docname="ublinux-ubconfig.svg" - inkscape:version="1.1.1 (3bf5ae0d25, 2021-09-20)" + sodipodi:docname="ubl-settings-services.svg" + inkscape:version="1.1.2 (0a00cf5339, 2022-02-04, custom)" inkscape:export-filename="/media/Data/ShareMX/temp/archtoub_icons/ublinux-logo.png" inkscape:export-xdpi="136.53334" inkscape:export-ydpi="136.53334" @@ -2225,11 +2225,11 @@ + gradientTransform="matrix(3.779602,0,0,3.779602,-193.72728,-7.0470659)"> + + + + + + + + + + + + + + + + + + + + id="filter104568" + x="-0.071441296" + y="-0.070813484" + width="1.1428826" + height="1.141627"> + id="feFlood104558" /> + id="feComposite104560" /> + id="feGaussianBlur104562" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + id="feOffset4041" /> + id="feComposite4043" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + inkscape:current-layer="layer2"> + + @@ -4927,31 +5607,182 @@ id="circle1671" /> - - + id="g930" + transform="matrix(1.7936014,0,0,1.7936014,32.604392,32.604396)" + style="filter:url(#filter4045)"> + + + + + + + + + + + + + + + + + + + + + + + + + + cx="12.34" + cy="11.696" + r="3.4417" + fill="url(#linearGradient1984)" + stroke-width="0.92914" + id="circle146" + style="fill:url(#linearGradient1984)" /> + diff --git a/gresource.xml b/gresource.xml index b5286dd..835a942 100644 --- a/gresource.xml +++ b/gresource.xml @@ -2,6 +2,7 @@ ubl-settings-services.glade + ubl-settings-services-terminal.glade ubl-settings-services.css diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt index 2eea497..fe54f1e 100644 --- a/source/CMakeLists.txt +++ b/source/CMakeLists.txt @@ -8,10 +8,10 @@ include_directories(${GTK_INCLUDE_DIRS}) link_directories(${GTK_LIBRARY_DIRS}) add_definitions(${GTK_CFLAGS_OTHER}) -#pkg_check_modules(VTE291 REQUIRED vte-2.91) -#include_directories(${VTE291_INCLUDE_DIRS}) -#link_directories(${VTE291_LIBRARY_DIRS}) -#add_definitions(${VTE291_CFLAGS_OTHER}) +pkg_check_modules(VTE291 REQUIRED vte-2.91) +include_directories(${VTE291_INCLUDE_DIRS}) +link_directories(${VTE291_LIBRARY_DIRS}) +add_definitions(${VTE291_CFLAGS_OTHER}) find_library(WEBKIT_LIBRARIES_FOUND webkit2gtk-4.0 webkit2gtk-web-extension-4.0) @@ -36,6 +36,7 @@ add_custom_target(GLADE ubl-settings-services.glade) set(DEPENDFILES ../ubl-settings-services.glade + ../ubl-settings-services-terminal.glade ../gresource.xml ../ubl-settings-services-banner.png ../ubl-settings-services.css @@ -81,7 +82,7 @@ set(SOURCE_FILES set(LIBRARIES ${GTK_LIBRARIES} ${WEBKIT_LIBRARIES} -# ${VTE291_LIBRARIES} + ${VTE291_LIBRARIES} pthread) diff --git a/source/ubl-settings-services.c b/source/ubl-settings-services.c index fcb13d4..d81afc4 100644 --- a/source/ubl-settings-services.c +++ b/source/ubl-settings-services.c @@ -102,25 +102,267 @@ void on_about(){ //functions -void yon_load_proceed(char *command){ - if (yon_config_load_register(command)) +void on_activate(GtkTreeView *self, main_window *widgets){ + + GtkTreeIter iter; + GtkTreeModel *model = GTK_TREE_MODEL(main_config.list); + 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(main_config.list),&iter,5,&name,6,&description,-1); + gtk_label_set_text(GTK_LABEL(widgets->ChosenNameLabel),name); + gtk_label_set_text(GTK_LABEL(widgets->ChosenDescriptionLabel),description); + menu_obj *menu=widgets->menu; + if (main_config.rmb_clicked){ + gboolean CAutostart,CAutostop,CBlock,SAutostart,SLaunched; + gtk_tree_model_get(GTK_TREE_MODEL(main_config.list),&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 yon_config_load_proceed(char *command){ + yon_config_clean(); + // yon_config_main_clean(); + + gtk_list_store_clear(main_config.list); + int services_len=0; + int sockets_len=0; + int config_size=0; + config_str services = yon_config_load(load_services_command,&services_len); + config_str config = yon_config_load(command,&config_size); + for (int i=0; iMainTree),NULL); + yon_config_load_proceed(load_config_local_command); + gtk_tree_view_set_model(GTK_TREE_VIEW(widgets->MainTree),GTK_TREE_MODEL(main_config.list)); + int size = 0; + dictionary *dict=NULL; + config_str config = yon_config_load(load_services_command,&size); + printf("%s\n",config[0]); + for (int i=0;iname = yon_char_divide(service[0],strlen(service[0])-strlen(".service")); + info->loaded=strcmp(service[1],"loaded")==0; + info->active=strcmp(service[2],"active")==0; + info->description=yon_char_divide_search(service[4],"\n",-1); + yon_dictionary_add_or_create_if_exists_with_data(dict,info->name,info); + } + // if (main_config.loaded_config){ + // for (int i=0;main_config.loaded_config[i];i++){ + // dictionary *dct=NULL; + // for_dictionaries (dct,dict){ + // if (strcmp(main_config.loaded_config[i],dict->key)==0){ + // service_info *serv = yon_dictionary_get_data(dct,service_info*); + // GtkTreeIter iter; + // gtk_list_store_append(main_config.list,&iter); + // gtk_list_store_set(main_config.list,&iter,3,serv->loaded,4,serv->active,-1); + // } + // } + // } + // } + +} + +void yon_config_load_global(){ +} + +void on_config_autostart_switch(GtkMenuItem *self,main_window *widgets){ + GtkTreeModel *model = GTK_TREE_MODEL(main_config.list); + GtkTreeIter iter; + if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->MainTree)),&model,&iter)){ + gboolean autostart=0; + gtk_tree_model_get(model,&iter,0,&autostart,-1); + gtk_list_store_set(main_config.list,&iter,0,!autostart,-1); + } + +} + +void on_config_autostop_switch(GtkMenuItem *self,main_window *widgets){ + GtkTreeModel *model = GTK_TREE_MODEL(main_config.list); + GtkTreeIter iter; + if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->MainTree)),&model,&iter)){ + gboolean autostop=0; + gtk_tree_model_get(model,&iter,1,&autostop,-1); + gtk_list_store_set(main_config.list,&iter,1,!autostop,-1); + } + + +} + +void on_config_block_switch(GtkMenuItem *self,main_window *widgets){ + GtkTreeModel *model = GTK_TREE_MODEL(main_config.list); + GtkTreeIter iter; + if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->MainTree)),&model,&iter)){ + gboolean block=0; + gtk_tree_model_get(model,&iter,2,&block,-1); + gtk_list_store_set(main_config.list,&iter,2,!block,-1); + } + + +} + +void on_system_autostart_switch(GtkMenuItem *self,main_window *widgets){ + GtkTreeModel *model = GTK_TREE_MODEL(main_config.list); + GtkTreeIter iter; + if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->MainTree)),&model,&iter)){ + gboolean autostart=0; + gtk_tree_model_get(model,&iter,3,&autostart,-1); + gtk_list_store_set(main_config.list,&iter,3,!autostart,-1); + } + + +} + +void on_system_launched(GtkMenuItem *self,main_window *widgets){ + GtkTreeModel *model = GTK_TREE_MODEL(main_config.list); + GtkTreeIter iter; + if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->MainTree)),&model,&iter)){ + gboolean launched=0; + gtk_tree_model_get(model,&iter,4,&launched,-1); + gtk_list_store_set(main_config.list,&iter,4,!launched,-1); + } + } -void on_context_menu_open(GtkTreeView *self,GtkTreePath* path, GtkTreeViewColumn* column, main_window *widgets){ - printf("ghserth\n"); - GtkWidget *menu = widgets->RMBMenu; - gtk_menu_popup_at_pointer(GTK_MENU(menu),NULL); - // gdk_window_get_device_position(gtk_widget_get_window(widgets->MainTree),mouse,&x,&y,NULL); - // gtk_popover_popup(GTK_POPOVER(widgets->ActionsPopover)); - // gtk_widget_show(widgets->ActionsPopover); - // GdkRectangle rect; - // rect.x=x; - // rect.y=y; - // gtk_popover_set_pointing_to(GTK_POPOVER(widgets->ActionsPopover),&rect); +void on_config_reload(GtkMenuItem *self,main_window *widgets){ + +} + +void on_status_show(GtkMenuItem *self,main_window *widgets){ + GtkBuilder *builder = gtk_builder_new_from_resource(terminal_window_path); + GtkWidget *Window = yon_gtk_builder_get_widget(builder,"TerminalWindow"); + GtkWidget *box = yon_gtk_builder_get_widget(builder,"TerminalHolder"); + GtkWidget *updateButton = yon_gtk_builder_get_widget(builder,"UpdateButton"); + GtkWidget *closeButton = yon_gtk_builder_get_widget(builder,"CancelButton"); + GtkTreeModel *model = GTK_TREE_MODEL(main_config.list); + GtkTreeIter iter; + char *name = NULL; + 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,-1); + yon_terminal_integrated_launch(box,yon_char_append(status_command,name),NULL,NULL); + g_signal_connect(G_OBJECT(closeButton),"clicked",G_CALLBACK(on_close_subwindow),NULL); + gtk_widget_show_all(Window); +} + +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); + gtk_container_add(GTK_CONTAINER(menu_item),box); + gtk_widget_show_all(menu_item); + return menu_item; +} + +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); + + gtk_widget_show_all(menu_item); + gtk_widget_set_sensitive(menu_item,0); + return menu_item; +} + +gboolean on_context_menu_open(GtkWidget *self,GdkEventButton *event, main_window *widgets){ + 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_switch),widgets); + g_signal_connect(G_OBJECT(menu_item_autostop),"activate",G_CALLBACK(on_config_autostop_switch),widgets); + g_signal_connect(G_OBJECT(menu_item_block),"activate",G_CALLBACK(on_config_block_switch),widgets); + g_signal_connect(G_OBJECT(menu_item_autostart_system),"activate",G_CALLBACK(on_system_autostart_switch),widgets); + g_signal_connect(G_OBJECT(menu_item_launched),"activate",G_CALLBACK(on_system_launched),widgets); + g_signal_connect(G_OBJECT(menu_item_reload),"activate",G_CALLBACK(on_config_reload),widgets); + g_signal_connect(G_OBJECT(menu_item_status),"activate",G_CALLBACK(on_status_show),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_menu_popup_at_pointer(GTK_MENU(menu),NULL); + return 0; + } + return 0; } @@ -128,10 +370,6 @@ void on_context_menu_open(GtkTreeView *self,GtkTreePath* path, GtkTreeViewColumn void config_init(){ main_config.always_open_documentation=0; - main_config.win_height=0; - main_config.win_width=0; - main_config.win_pos_x=0; - main_config.win_pos_y=0; main_config.socket_id=-1; main_config.save_socket_id=-1; main_config.load_socket_id=-1; @@ -140,6 +378,17 @@ void config_init(){ main_config.lock_load_global=0; main_config.lock_save_global=0; main_config.lock_save_local=0; + main_config.rmb_clicked=0; + main_config.loaded_config=NULL; +} + +void yon_config_main_clean(){ + if (main_config.loaded_config){ + for (char *str = main_config.loaded_config[0];str;str+=8) + free(str); + } + main_config.loaded_config=NULL; + } main_window *setup_window(){ @@ -166,6 +415,9 @@ main_window *setup_window(){ widgets->SaveLocalMenuItem = yon_gtk_builder_get_widget(builder,"SaveLocalConfigurationMenuItem"); widgets->RightBox = yon_gtk_builder_get_widget(builder,"HeaderRightBox"); + widgets->ChosenNameLabel = yon_gtk_builder_get_widget(builder,"MainChosenNameLabel"); + widgets->ChosenDescriptionLabel = yon_gtk_builder_get_widget(builder,"MainChosenDescriptionLabel"); + widgets->LoadLabel = yon_gtk_builder_get_widget(builder,"headerLoadConfigLabel"); widgets->LoadGlobalMenuItem = yon_gtk_builder_get_widget(builder,"LoadGlobalConfigurationMenuItem"); widgets->LoadLocalMenuItem = yon_gtk_builder_get_widget(builder,"LoadLocalConfigurationMenuItem"); @@ -182,7 +434,12 @@ main_window *setup_window(){ widgets->ServiceTreeColumn = GTK_TREE_VIEW_COLUMN(gtk_builder_get_object(builder,"ServiceTreeColumn")); widgets->RMBMenu = yon_gtk_builder_get_widget(builder,"RMBMenu"); - + + GtkWidget *menu = yon_gtk_builder_get_widget(builder,"menu2"); + + main_config.list = GTK_LIST_STORE(gtk_builder_get_object(builder,"mainList")); + gtk_menu_shell_append(GTK_MENU_SHELL(menu),widgets->DocumentationMenuItem); + gtk_menu_shell_append(GTK_MENU_SHELL(menu),widgets->AboutMenuItem); gtk_menu_attach_to_widget(GTK_MENU(widgets->RMBMenu),widgets->MainTree,NULL); @@ -200,9 +457,18 @@ main_window *setup_window(){ /* Signal connection | Присоединение сигналов */ g_signal_connect(G_OBJECT(widgets->Window), "destroy", G_CALLBACK(gtk_main_quit), NULL); - g_signal_connect(G_OBJECT(widgets->MainTree),"row-activated",G_CALLBACK(on_context_menu_open),widgets); + g_signal_connect(G_OBJECT(widgets->MainTree),"button-press-event",G_CALLBACK(on_context_menu_open),widgets); g_signal_connect(G_OBJECT(widgets->DocumentationMenuItem),"activate",G_CALLBACK(on_open_documentation_confirmation),WIKI_LINK); g_signal_connect(G_OBJECT(widgets->AboutMenuItem),"activate",G_CALLBACK(on_about),NULL); + g_signal_connect(G_OBJECT(widgets->MainTree),"cursor-changed",G_CALLBACK(on_activate),widgets); + + + g_signal_connect(G_OBJECT(widgets->LoadGlobalMenuItem), "activate", G_CALLBACK(yon_config_load_global), widgets); + g_signal_connect(G_OBJECT(widgets->LoadLocalMenuItem), "activate", G_CALLBACK(yon_config_load_local), widgets); + + // g_signal_connect(G_OBJECT(widgets->SaveMenuItem), "activate", G_CALLBACK(yon_config_save), widgets); + // g_signal_connect(G_OBJECT(widgets->SaveGlobalMenuItem), "activate", G_CALLBACK(yon_config_save_global), widgets); + // g_signal_connect(G_OBJECT(widgets->SaveLocalMenuItem), "activate", G_CALLBACK(yon_config_save_local), widgets); gtk_widget_show(widgets->Window); @@ -277,6 +543,7 @@ int main(int argc, char *argv[]){ exit(0); } } + if (getuid()!=0){ main_config.lock_load_global=1; main_config.lock_save_global=1; @@ -296,6 +563,7 @@ int main(int argc, char *argv[]){ yon_ubl_setup_sockets(widgets->PlugBox,widgets->LeftBox,widgets->RightBox,main_config.socket_id,main_config.load_socket_id,main_config.save_socket_id); yon_window_config_setup(GTK_WINDOW(widgets->Window)); yon_window_config_load(config_path); + yon_config_load_local(NULL,widgets); GtkCssProvider *css=gtk_css_provider_new(); gtk_css_provider_load_from_resource(css,CssPath); gtk_style_context_add_provider_for_screen(gdk_screen_get_default(), diff --git a/source/ubl-settings-services.h b/source/ubl-settings-services.h index 95edd86..51d7bd3 100644 --- a/source/ubl-settings-services.h +++ b/source/ubl-settings-services.h @@ -8,7 +8,8 @@ #include #include #include -#include "ubl-cmake.h" +#include "../compile/ubl-cmake.h" +#include #ifdef WEBKIT_FOUND #include #endif @@ -22,9 +23,19 @@ #define banner_path "/com/ublinux/images/ubl-settings-services-banner.png" #define CssPath "/com/ublinux/css/ubl-settings-services.css" #define config_path yon_char_unite("/home/",yon_ubl_root_user_get(),"/.config/",LocaleName,"/",LocaleName,".conf",NULL) +#define terminal_window_path "/com/ublinux/ui/ubl-settings-services-terminal.glade" #define LocalePath "/usr/share/locale" #define LocaleName "ubl-settings-services" + +#define load_config_local_command "ubconfig --source system get config SERVICESSTART SERVICESNOSTART SERVICESMASK" + +#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_sockets_command "systemctl list-sockets -all |grep -vE \"LISTEN|sockets listed\"| sed -e 's/ */:/g'" + +#define status_command "systemctl status --no-pager " + typedef char* string; string version_application; @@ -45,8 +56,23 @@ typedef struct { int lock_save_local; int lock_save_global; int lock_load_global; + + config_str loaded_config; + GtkListStore *list; + gboolean rmb_clicked; } config; +typedef struct { + GtkWidget *Menu; + GtkWidget *MenuConfigAutostart; + GtkWidget *MenuConfigAutostop; + GtkWidget *MenuConfigBlock; + GtkWidget *MenuSystemAutostart; + GtkWidget *MenuSystemLaunched; + GtkWidget *MenuReloadConfig; + GtkWidget *MenuStatus; +} menu_obj; + typedef struct { GtkWidget *Window; GtkWidget *HatLabel; @@ -73,6 +99,9 @@ typedef struct { GtkWidget *LoadLocalMenuItem; GtkWidget *LeftBox; + GtkWidget *ChosenNameLabel; + GtkWidget *ChosenDescriptionLabel; + GtkWidget *DocumentationMenuItem; GtkWidget *AboutMenuItem; @@ -83,8 +112,15 @@ typedef struct { GtkTreeViewColumn *ServiceTreeColumn; GtkWidget *RMBMenu; + menu_obj *menu; } main_window; +typedef struct { + char *name; + int loaded; + int active; + char *description; +} service_info; typedef struct { GtkWidget *Window; @@ -99,4 +135,5 @@ typedef struct { } documentation_confirmation_window; +void yon_config_main_clean(); main_window *setup_window(); \ No newline at end of file diff --git a/source/ubl-utils.c b/source/ubl-utils.c index 486baec..a8a00ef 100644 --- a/source/ubl-utils.c +++ b/source/ubl-utils.c @@ -20,7 +20,7 @@ dictionary *yon_dictionary_new() return dict; } -/**yon_dictionary_copy_deep(dictionary *dict) +/**yon_dictionary_copy(dictionary *dict) * [EN] * * [RU] @@ -47,19 +47,43 @@ dictionary *yon_dictionary_copy_deep(dictionary *dict){ return newone->first; } +/**int yon_dictionary_set_data(dictionary *dict, void *data) + * [EN] + * + * [RU] + * Установить элементу словаря [dict] значение [data] +*/ int yon_dictionary_set_data(dictionary *dict, void *data){ dict->data=data; } +/**int yon_dictionary_set_key(dictionary *dict, char *key) + * [EN] + * + * [RU] + * Изменяет ключ элемента словаря [dict] на [key] +*/ int yon_dictionary_set_key(dictionary *dict, char *key){ dict->key=key; } +/** int yon_dictionary_set(dictionary *dict, char *key, void *data) + * [EN] + * + * [RU] +* Устанавливает значение ключа элемента словаря [dict] на [key] и его данные на [data] +*/ int yon_dictionary_set(dictionary *dict, char *key, void *data){ dict->key=key; dict->data=data; } +/**int yon_dictionary_empty(dictionary *dict) + * [EN] + * + * [RU] + * Очищает элемент словаря [dict] от данных +*/ int yon_dictionary_empty(dictionary *dict){ dict->data=NULL; dict->data_type=DICTIONARY_OTHER_TYPE; @@ -445,8 +469,12 @@ char *yon_char_new(char *chr) return NULL; } -// char *yon_char_unite(char *source, ...) - +/**yon_char_unite(char *source, ...) + * [En] + * + * [RU] + * Объединяет строку [source] со всеми строками, написанными в [...] +*/ char *yon_char_unite(char *source, ...){ va_list arglist; char *new_char=NULL; @@ -494,6 +522,12 @@ char *yon_char_divide(char *source, int dividepos) return cut; } +/**yon_char_find_count(char *source, char *find) + * [EN] + * + * [RU] + * Считает количество символов [find] в строке [source] +*/ int yon_char_find_count(char *source, char *find){ char *working_string=yon_char_new(source); int i=0; @@ -584,8 +618,8 @@ char *yon_char_replace(char *source, char *find, char*replace){ } } -/**[EN] - * char **yon_char_parse(char *parameters, int *size, char *divider) +/**yon_char_parse(char *parameters, int *size, char *divider) + * [EN] * Parses string [parameters], divided by [divider], * then returns parsed string array and sets [size] to * size of returned array @@ -702,6 +736,12 @@ config_str yon_char_parsed_new (int *size, ...){ return new_parsed; } +/**yon_char_parsed_copy(config_str *source, config_str *to_copy) + * [EN] + * + * [RU] + * Копирует массив строк [to_copy] в [source] +*/ void yon_char_parsed_copy(config_str *source, config_str *to_copy){ if (source&&!*source&&to_copy&&*to_copy){ int size=0; @@ -726,12 +766,24 @@ config_str yon_char_parsed_append(config_str parsed, int *size, char *string){ return new_parsed; } - +/**yon_ubl_check_root() + * [EN] + * + * [RU] + * Возвращает 1 если приложение было запущено от root +*/ int yon_ubl_check_root(){ if (getuid()==0) return 1; else return 0; } +/**yon_ubl_root_user_get() + * [EN] + * + * [RU] + * Возвращает имя пользователя. + * Если пользователь запустил приложение через root, выводится имя пользователя, запустившего приложение через root +*/ char *yon_ubl_root_user_get(){ char *user=NULL; if (yon_ubl_check_root()){ @@ -1085,7 +1137,7 @@ config_str yon_config_load(char *command, int *str_len){ * Выполняет команду [command], добавляя в конец все записи конфига в таком виде: * [ПАРАМЕТР1]="[значения1]" [ПАРАМЕТР2]="[значения2]" */ -int yon_config_save(char *command){ +int yon_config_save_registered(char *command){ check_config{ dictionary *dict = NULL; for_dictionaries(dict,__yon__config__strings){ @@ -1119,18 +1171,6 @@ config_str yon_config_get_all(int *size){ } else return NULL; } -/**[EN] - * int yon_config_save(char *command) - * Saves config with [command] - * [RU] - * Выполняет команду [command] -*/ -// int yon_config_save(char *command) -// { -// FILE *output = popen(command, "r"); -// return 1; -// } - /**char *yon_config_get_parameter(config parameters, int size, char *param) * [EN] * Gets parameter [param] from parameter list [parameters] of size [size]; @@ -1234,7 +1274,10 @@ void yon_terminal_integrated_launch(GtkWidget *place_to_show, char* command, voi 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); - gtk_container_add(GTK_CONTAINER(place_to_show),terminal); + if (GTK_IS_BOX(place_to_show)) + gtk_box_pack_start(GTK_BOX(place_to_show),terminal,1,1,5); + else + gtk_container_add(GTK_CONTAINER(place_to_show),terminal); char *install_command=yon_char_unite("tput cup 0 0 && tput ed; ",command," ; sleep 5;exit 0","\n",NULL); printf("%s\n",install_command); if(endwork_function) @@ -1315,14 +1358,17 @@ void yon_terminal_integrated_start(GtkWidget *terminal, char* command, void *end NULL, NULL, NULL); - vte_terminal_set_scrollback_lines(VTE_TERMINAL(terminal), 100); + 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); } #endif + // Window config functions + #define check_window_config_setup if(__yon_window_config_target_window) + struct { int x; int y; @@ -1330,6 +1376,7 @@ void yon_terminal_integrated_start(GtkWidget *terminal, char* command, void *end int height; int fullscreen; } __yon_main_window_config; + static GtkWindow *__yon_window_config_target_window = NULL; static GKeyFile *__yon_window_config_file = NULL; static char *__yon_window_config_path = NULL; @@ -1346,11 +1393,14 @@ void yon_terminal_integrated_start(GtkWidget *terminal, char* command, void *end void yon_get_is_fullscreen(){ gtk_window_is_maximized(__yon_window_config_target_window); __yon_main_window_config.fullscreen = gtk_window_is_maximized(__yon_window_config_target_window); - if (__yon_main_window_config.fullscreen==0) - gtk_window_get_position(__yon_window_config_target_window,&__yon_main_window_config.x,&__yon_main_window_config.y); } - + /**yon_on_configured_window_destroy(GtkWidget* self,GdkEvent* event) + * [EN] + * + * [RU] + * Сохраняет настройки основного окна. Вызывается когда основное окно уничтожается. + */ void yon_on_configured_window_destroy(GtkWidget* self,GdkEvent* event){ check_window_config_setup{ yon_get_is_fullscreen(); @@ -1368,11 +1418,16 @@ void yon_terminal_integrated_start(GtkWidget *terminal, char* command, void *end } } + /**yon_window_config_setup(GtkWindow *window) + * [EN] + * + * [RU] + * Устанавливает указатель на окно для отслеживания его положения и размера + */ void yon_window_config_setup(GtkWindow *window){ __yon_window_config_target_window = window; - g_signal_connect(G_OBJECT(__yon_window_config_target_window),"delete-event",G_CALLBACK(yon_on_configured_window_destroy),NULL); - g_signal_connect(G_OBJECT(__yon_window_config_target_window),"check-resize"/*"configure-event"*/,G_CALLBACK(__yon_window_config_on_resize),NULL); - // g_signal_connect(G_OBJECT(__yon_window_config_target_window),"configure_event",G_CALLBACK(__yon_window_config_on_resize),NULL); + g_signal_connect(G_OBJECT(window),"delete-event",G_CALLBACK(yon_on_configured_window_destroy),NULL); + g_signal_connect(G_OBJECT(window),"check-resize"/*"configure-event"*/,G_CALLBACK(__yon_window_config_on_resize),NULL); } void _yon_maximize(void *data){ @@ -1380,6 +1435,12 @@ void yon_terminal_integrated_start(GtkWidget *terminal, char* command, void *end if(__yon_main_window_config.fullscreen ==1) gtk_window_maximize(__yon_window_config_target_window); } + /**yon_window_config_load(char *path) + * [EN] + * + * [RU] + * Загружает конфиг окна и инициализирует отслеживание его параметров + */ int yon_window_config_load(char *path){ __yon_window_config_file = g_key_file_new(); __yon_window_config_path=yon_char_new(path); @@ -1416,6 +1477,43 @@ void yon_terminal_integrated_start(GtkWidget *terminal, char* command, void *end gtk_window_resize(__yon_window_config_target_window,__yon_main_window_config.width,__yon_main_window_config.height); } +GtkWidget *yon_ubl_menu_item_about_new(char *buttonname){ + GtkWidget *menu_item = gtk_menu_item_new(); + gtk_style_context_add_class(gtk_widget_get_style_context(menu_item),"menuitembottom"); + GtkWidget *box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL,0); + GtkWidget *label = gtk_label_new(buttonname); + GtkWidget *image = gtk_image_new_from_icon_name("dialog-information-symbolic",GTK_ICON_SIZE_BUTTON); + gtk_label_set_xalign(GTK_LABEL(label),0.0); + gtk_box_pack_start(GTK_BOX(box),image,0,0,5); + 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; +} + +GtkWidget *yon_ubl_menu_item_documentation_new(char *buttonname){ + GtkWidget *menu_item = gtk_menu_item_new(); + gtk_style_context_add_class(gtk_widget_get_style_context(menu_item),"menuitemtop"); + GtkWidget *box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL,0); + GtkWidget *label = gtk_label_new(buttonname); + GtkWidget *image = gtk_image_new_from_icon_name("dialog-question-symbolic",GTK_ICON_SIZE_BUTTON); + gtk_label_set_xalign(GTK_LABEL(label),0.0); + gtk_box_pack_start(GTK_BOX(box),image,0,0,5); + 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; +} + + +// other Gtk functions + +/**yon_gtk_combo_box_text_fill(GtkWidget *combo, config_str parameters,int size) + * [EN] + * + * [RU] + * Добавляет в Комбобокс [combo] все строки из массива строк [parameters] размера [size] +*/ int yon_gtk_combo_box_text_fill(GtkWidget *combo, config_str parameters,int size){ if (combo&¶meters){ for (int i=0;i #include #include -#include -#include +#include -#include "ubl-cmake.h" +#include "../compile/ubl-cmake.h" #ifdef WEBKIT_FOUND #include #endif @@ -171,7 +170,7 @@ apps *yon_apps_get_by_name(apps *applist, char *name, int size); config_str yon_config_load(char *command, int *str_len); -int yon_config_save(char *command); +int yon_config_save_registered(char *command); char *yon_config_get_parameter(config_str parameters, int size, char *param); @@ -211,6 +210,9 @@ void yon_terminal_integrated_start(GtkWidget *terminal, char* command, void *end #endif +GtkWidget *yon_ubl_menu_item_about_new(char *buttonname); +GtkWidget *yon_ubl_menu_item_documentation_new(char *buttonname); + /**yon_gtk_builder_get_widget(builder, widget_name) * [EN] * Returns GtkWidget from GtkBuilder *[builder]. diff --git a/ubl-settings-services-terminal.glade b/ubl-settings-services-terminal.glade new file mode 100644 index 0000000..0f2159d --- /dev/null +++ b/ubl-settings-services-terminal.glade @@ -0,0 +1,106 @@ + + + + + + + True + False + emblem-synchronizing-symbolic + + + True + False + process-stop-symbolic + + + 500 + 350 + False + True + 450 + -1 + dialog-question-symbolic + + + True + False + 5 + 5 + 5 + 5 + 5 + 5 + vertical + 10 + + + + + + True + False + 30 + + + Update service status + True + True + True + image8 + + + + True + True + 0 + + + + + Close + True + True + True + image9 + + + + False + True + 1 + + + + + False + True + end + 1 + + + + + + + True + False + True + + + True + False + Services and processes systemd + + + + + + + + + diff --git a/ubl-settings-services.css b/ubl-settings-services.css index 11cb18d..547dcda 100644 --- a/ubl-settings-services.css +++ b/ubl-settings-services.css @@ -48,17 +48,23 @@ background:transparent; } .menuitemtop *{ margin:2px 2px 0 2px; - padding: 5px 10px 3px 5px; + padding-top:2px; + padding-bottom:2px; + /* padding: 5px 0px 3px 5px; */ border:transparent; } .menuitemmiddle *{ margin:0 2px 0 2px; - padding: 3px 10px 3px 5px; + padding-top:2px; + padding-bottom:2px; + /* padding: 3px 0px 3px 5px; */ border:transparent; } .menuitembottom *{ margin:0 2px 2px 2px; - padding: 3px 10px 5px 5px; + padding-top:2px; + padding-bottom:2px; + /* padding: 3px 0px 5px 5px; */ } .menuitemtop:hover { background:@theme_bg_color; @@ -83,19 +89,25 @@ background:transparent; } .menuitemtop:hover* { margin:2px 2px 0 2px; - padding: 5px 10px 3px 5px; + padding-top:2px; + padding-bottom:2px; + /* padding: 5px 0 3px 5px; */ background:@theme_selected_bg_color; border-radius:2px; } .menuitemmiddle:hover* { - margin:0 2px 0 2px; - padding: 3px 10px 3px 5px; + margin:0 2px 0px 2px; + padding-top:2px; + padding-bottom:2px; + /* padding: 3px 0px 3px 5px; */ background:@theme_selected_bg_color; border-radius:2px; } .menuitembottom:hover* { margin:0 2px 2px 2px; - padding: 3px 10px 5px 5px; + padding-top:2px; + padding-bottom:2px; + /* padding: 3px 0px 5px 5px; */ background:@theme_selected_bg_color; border-radius:2px; } @@ -105,30 +117,4 @@ background:transparent; .boxInfoMessOK{ background-color: #f3f0ac; -} -.sharpBorders *{ - border-radius: 0px; -} - -.lowborder{ - border-top:none; - border-left: none; - border-right:none; -} -.lowborder { - border-bottom: 1px; - border-style: solid; - border-color: inherit; -} -.nohover:hover { - background-color: transparent; - color:inherit; - border-right:inherit; - border-left:inherit; - padding-left: 4px; - /* border-top:inherit; */ -} - -.colortest{ - -gtk-icon-palette:name @theme_base_color; } \ No newline at end of file diff --git a/ubl-settings-services.glade b/ubl-settings-services.glade index aebaf96..c92d200 100644 --- a/ubl-settings-services.glade +++ b/ubl-settings-services.glade @@ -554,139 +554,19 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - - True - False - emblem-synchronizing-symbolic - - - True - False - emblem-synchronizing-symbolic - - - True - False - dialog-information-symbolic - - - True - False - media-playback-start-symbolic - - - True - False - media-playback-stop-symbolic - - - True - False - process-stop-symbolic - - + True False - media-playback-start-symbolic - - True - False - emoji-flags-symbolic + + 100 + 1 + 10 - + True False - - - True - False - Configuration in config file - True - - - - - - Autostart - True - False - image2 - False - - - - - Autostop - True - False - image3 - False - - - - - Block - True - False - image4 - False - - - - - - True - False - Configuration in system - - - - - - Autostart - True - False - image6 - False - - - - - Launched - True - False - image7 - False - - - - - - Service configuration reload - True - False - image10 - False - - - - - Status - True - False - image11 - False - - + emblem-synchronizing-symbolic True @@ -889,33 +769,25 @@ translated and supported by community. - + + - + - + - + - + - + - + + + - - - False - False - False - False - False - gzsdrgasdrg - - - True False @@ -946,28 +818,6 @@ translated and supported by community. False False False - - - True - False - Documentation - True - - - - - - True - False - About - - - True @@ -1121,242 +971,100 @@ translated and supported by community. True vertical - + True False - vertical - 5 + 0 + in - + True False - 5 - - - True - False - 0 - - All services - System services only - User services only - - - - True - True - 0 - - + 5 + 5 + 5 + 5 - + True False - 0 - - All - Services - Sockets - Automatic launch - Stopped in configuration - Blocked in configuration - - - - True - True - 1 - - - - - True - True - 40 - edit-find-symbolic - False - False - name - - - True - True - 2 - - - - - True - True - True - image1 - - - - False - True - 4 - - - - - False - True - 0 - - - - - True - False - vertical - - - True - True - start - start - liststore2 - - - - - - 270 - Configuration in config file - - - - - 180 - Configuration in system - - - - - - False - True - 0 - - - - - True - True - True - liststore1 - 5 - True - vertical - True - - - - - - fixed - 90 - Autostart - - - - 0 - - - - - - - fixed - 90 - Autostop - - - - 1 - - - - + vertical + 5 - - fixed - 90 - Block + + True + False + 5 - - - 2 - + + True + False + 0 + + All services + System services only + User services only + + + + True + True + 0 + - - - - - fixed - 90 - Autostart - - - 3 - + + True + False + 0 + + All + Services + Sockets + Automatic launch + Stopped in configuration + Blocked in configuration + + + + True + True + 1 + - - - - - fixed - 90 - Launched - - - 4 - + + True + True + 40 + edit-find-symbolic + False + False + name + + + True + True + 2 + - - - - - fixed - Service - 5 - - - 5 - + + True + True + True + image1 + + + + False + True + 4 + - - - - True - True - 1 - - - - - True - False - 5 - 5 - vertical - 10 - - - True - False - 0 - False True @@ -1364,33 +1072,390 @@ translated and supported by community. - + True False - 0 + vertical + 5 + + + True + False + + + True + False + vertical + + + True + True + start + start + liststore2 + + + + + + 270 + Configuration in config file + + + + + 180 + Configuration in system + + + + + + False + True + 0 + + + + + True + True + True + adjustment1 + liststore2 + 5 + True + vertical + True + + + + + + fixed + 90 + Autostart + + + + 0 + + + + + + + fixed + 90 + Autostop + + + + 1 + + + + + + + fixed + 90 + Block + + + + 2 + + + + + + + fixed + 90 + Autostart + + + + 3 + + + + + + + fixed + 90 + Launched + + + + 4 + + + + + + + fixed + Service + True + 5 + + + + 5 + + + + + + + False + True + 1 + + + + + True + True + in + + + True + False + + + True + True + True + adjustment1 + mainList + False + 5 + True + vertical + True + + + + + + fixed + 90 + Autostart + + + + 0 + + + + + + + fixed + 90 + Autostop + + + + 1 + + + + + + + fixed + 90 + Block + + + + 2 + + + + + + + fixed + 90 + Autostart + + + + 3 + + + + + + + fixed + 90 + Launched + + + + 4 + + + + + + + fixed + Service + True + 5 + + + + 5 + + + + + + + + + + + + True + True + 2 + + + + + True + True + 0 + + + + + True + True + 0 + + + + + True + False + 5 + 5 + vertical + 10 + + + True + False + 5 + + + True + False + Service: + 0 + + + False + True + 0 + + + + + True + False + 0 + + + False + True + 1 + + + + + False + True + 0 + + + + + True + False + 5 + + + True + False + Description: + 0 + + + False + True + 0 + + + + + True + False + 0 + + + False + True + 1 + + + + + False + True + 1 + + + + + False + True + 2 + + - False + True True 1 - - False - True - 2 - - - - True - True - 1 - + + + + True + False + Services + @@ -1585,4 +1650,10 @@ translated and supported by community. + + + + + +