From 075617d49507271149376a20d7a9669f281cff54 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Fri, 26 Jan 2024 16:48:47 +0600 Subject: [PATCH] Application rework --- .gitignore | 4 +- Makefile | 22 +- README.md | 4 + com.ublinux.ubl-settings-services.policy | 12 +- ....ubl-settings-services.cancel-symbolic.svg | 50 + ...ngs-services.cancel-uncolored-symbolic.svg | 49 + ...x.ubl-settings-services.check-symbolic.svg | 1 + ....ublinux.ubl-settings-services.checked.svg | 0 ....ubl-settings-services.launch-symbolic.svg | 4 + ...ux.ubl-settings-services.play-symbolic.svg | 1 + ...ux.ubl-settings-services.stop-symbolic.svg | 1 + ...ux.ubl-settings-services.sync-symbolic.svg | 1 + ...ubl-settings-services.uncheck-symbolic.svg | 1 + ....ublinux.ubl-settings-services.warning.svg | 0 ...ux.ubl-settings-services.zoom-symbolic.svg | 160 ++ source/CMakeLists.txt | 22 +- source/ubl-cmake.in | 1 - source/ubl-settings-services.c | 1061 ++++----- source/ubl-settings-services.h | 290 ++- source/ubl-strings.h | 57 +- source/ubl-utils.c | 1762 --------------- source/ubl-utils.h | 343 --- ubl-settings-services-terminal.glade | 90 +- ubl-settings-services.css | 30 +- ubl-settings-services.desktop | 16 +- ubl-settings-services.glade | 1898 ++++------------- ubl-settings-services.pot | 158 +- ubl-settings-services_ru.po | 178 +- 28 files changed, 1675 insertions(+), 4541 deletions(-) create mode 100644 icons/com.ublinux.ubl-settings-services.cancel-symbolic.svg create mode 100644 icons/com.ublinux.ubl-settings-services.cancel-uncolored-symbolic.svg create mode 100644 icons/com.ublinux.ubl-settings-services.check-symbolic.svg rename com.ublinux.ubl-settings-services.checked.svg => icons/com.ublinux.ubl-settings-services.checked.svg (100%) create mode 100644 icons/com.ublinux.ubl-settings-services.launch-symbolic.svg create mode 100644 icons/com.ublinux.ubl-settings-services.play-symbolic.svg create mode 100644 icons/com.ublinux.ubl-settings-services.stop-symbolic.svg create mode 100644 icons/com.ublinux.ubl-settings-services.sync-symbolic.svg create mode 100644 icons/com.ublinux.ubl-settings-services.uncheck-symbolic.svg rename com.ublinux.ubl-settings-services.warning.svg => icons/com.ublinux.ubl-settings-services.warning.svg (100%) create mode 100644 icons/com.ublinux.ubl-settings-services.zoom-symbolic.svg delete mode 100644 source/ubl-cmake.in delete mode 100644 source/ubl-utils.c delete mode 100644 source/ubl-utils.h diff --git a/.gitignore b/.gitignore index b51680c..b2f5ac1 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,6 @@ .vscode/ ubl-settings-services -ubl-settings-TEMPLATE +ubl-settings-generator *~ build/ compile/ @@ -8,4 +8,6 @@ compile/ terminal-commands/ source/ubl-cmake.h vgcore* +.BUILD.md +.updatebuild.sh .install.sh \ No newline at end of file diff --git a/Makefile b/Makefile index 81799f1..e70c09d 100644 --- a/Makefile +++ b/Makefile @@ -24,6 +24,11 @@ init: @echo "Initialize ..."; \ if [ -d ".git" ]; then \ LATEST_TAG=$$(git describe --abbrev=0 --tags | sed 's/^v//'); \ + if [ -z "$${LATEST_TAG}" ]; \ + then \ + LATEST_TAG=$$"0.0"; \ + echo "$${LATEST_TAG} is empty"; \ + fi; \ else \ LATEST_TAG="Development"; \ fi; \ @@ -117,13 +122,22 @@ install: check uninstall @sed -e 's+/usr/bin+${PREFIX}/bin+' -e 's+.run+${PKGIDENT}.run+g' ./compile/com.ublinux.${PKGNAME}${PKGIDENT}.policy -i @install -Dm755 -t "${DESTDIR}${PREFIX}/bin/" "${CMAKE_BUILD_DIR}/${PKGNAME}" @install -Dm644 -t "${DESTDIR}${PREFIX}/share/applications/" "${PKGNAME}.desktop" - @install -Dm644 -t "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/status/" "com.ublinux.${PKGNAME}.checked.svg" - @install -Dm644 -t "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/status/" "com.ublinux.${PKGNAME}.warning.svg" + @install -Dm644 -t "${DESTDIR}/usr/share/icons/hicolor/scalable/status/" "icons/com.ublinux.${PKGNAME}.checked.svg" + @install -Dm644 -t "${DESTDIR}/usr/share/icons/hicolor/scalable/status/" "icons/com.ublinux.${PKGNAME}.warning.svg" + @install -Dm644 -t "${DESTDIR}/usr/share/icons/hicolor/scalable/actions/" "icons/com.ublinux.${PKGNAME}.sync-symbolic.svg" + @install -Dm644 -t "${DESTDIR}/usr/share/icons/hicolor/scalable/actions/" "icons/com.ublinux.${PKGNAME}.zoom-symbolic.svg" + @install -Dm644 -t "${DESTDIR}/usr/share/icons/hicolor/scalable/actions/" "icons/com.ublinux.${PKGNAME}.cancel-symbolic.svg" + @install -Dm644 -t "${DESTDIR}/usr/share/icons/hicolor/scalable/actions/" "icons/com.ublinux.${PKGNAME}.cancel-uncolored-symbolic.svg" + @install -Dm644 -t "${DESTDIR}/usr/share/icons/hicolor/scalable/actions/" "icons/com.ublinux.${PKGNAME}.check-symbolic.svg" + @install -Dm644 -t "${DESTDIR}/usr/share/icons/hicolor/scalable/actions/" "icons/com.ublinux.${PKGNAME}.play-symbolic.svg" + @install -Dm644 -t "${DESTDIR}/usr/share/icons/hicolor/scalable/actions/" "icons/com.ublinux.${PKGNAME}.stop-symbolic.svg" + @install -Dm644 -t "${DESTDIR}/usr/share/icons/hicolor/scalable/actions/" "icons/com.ublinux.${PKGNAME}.uncheck-symbolic.svg" + @install -Dm644 -t "${DESTDIR}/usr/share/icons/hicolor/scalable/actions/" "icons/com.ublinux.${PKGNAME}.launch-symbolic.svg" @install -Dm644 -t "${DESTDIR}/usr/share/polkit-1/actions/" "${CMAKE_BUILD_DIR}/com.ublinux.${PKGNAME}${PKGIDENT}.policy" @if [ -z ${DESTDIR} ]; then \ - [ -d "${DESTDIR}${PREFIX}/share/icons/hicolor/" ] && gtk-update-icon-cache -fiq "${DESTDIR}${PREFIX}/share/icons/hicolor/" &>/dev/null || true; \ + [ -d "${DESTDIR}/usr/share/icons/hicolor/" ] && gtk-update-icon-cache -fiq "${DESTDIR}/usr/share/icons/hicolor/" &>/dev/null || true; \ update-desktop-database --quiet &>/dev/null || true; \ - [ -d "${DESTDIR}${PREFIX}/share/applications" ] && touch "${DESTDIR}${PREFIX}/share/applications" &>/dev/null || true; \ + [ -d "${DESTDIR}$/usr/share/applications" ] && touch "${DESTDIR}/usr/share/applications" &>/dev/null || true; \ fi @echo "Install: OK" diff --git a/README.md b/README.md index 642508d..841c77a 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,10 @@ In order to build ubl-settings-services you will need: - C compiler - GTK+ 3 & dependencies - webkit2gtk (optional) +- vte-2.91 +- [libublsettings](https://gitea.ublinux.ru/Applications/libublsettings) +- [libublsettings-gtk3](https://gitea.ublinux.ru/Applications/libublsettings-gtk3) +- [libublsettingsui-gtk3](https://gitea.ublinux.ru/Applications/libublsettingsui-gtk3) Once you have all the necessary dependencies, you can use: ```sh diff --git a/com.ublinux.ubl-settings-services.policy b/com.ublinux.ubl-settings-services.policy index 65d1fc1..1a2a4bb 100644 --- a/com.ublinux.ubl-settings-services.policy +++ b/com.ublinux.ubl-settings-services.policy @@ -7,17 +7,17 @@ UBLinux https://ublinux.ru - - Run ubl-settings-services as root - Запуск утилиты ubl-settings-services с правами root - Authentication is required to run ubl-settings-services - Требуется авторизация для запуска утилиты ubl-settings-services с правами root + + Run ubl-settings-TEMPLATE as root + Запуск утилиты ubl-settings-TEMPLATE с правами root + Authentication is required to run ubl-settings-TEMPLATE + Требуется авторизация для запуска утилиты ubl-settings-TEMPLATE с правами root auth_admin auth_admin auth_admin - /usr/bin/ubl-settings-services + /usr/bin/ubl-settings-TEMPLATE true diff --git a/icons/com.ublinux.ubl-settings-services.cancel-symbolic.svg b/icons/com.ublinux.ubl-settings-services.cancel-symbolic.svg new file mode 100644 index 0000000..c045b0b --- /dev/null +++ b/icons/com.ublinux.ubl-settings-services.cancel-symbolic.svg @@ -0,0 +1,50 @@ + + + + + + + + + + diff --git a/icons/com.ublinux.ubl-settings-services.cancel-uncolored-symbolic.svg b/icons/com.ublinux.ubl-settings-services.cancel-uncolored-symbolic.svg new file mode 100644 index 0000000..aa858f9 --- /dev/null +++ b/icons/com.ublinux.ubl-settings-services.cancel-uncolored-symbolic.svg @@ -0,0 +1,49 @@ + + + + + + + + + + diff --git a/icons/com.ublinux.ubl-settings-services.check-symbolic.svg b/icons/com.ublinux.ubl-settings-services.check-symbolic.svg new file mode 100644 index 0000000..5d9f3a3 --- /dev/null +++ b/icons/com.ublinux.ubl-settings-services.check-symbolic.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/com.ublinux.ubl-settings-services.checked.svg b/icons/com.ublinux.ubl-settings-services.checked.svg similarity index 100% rename from com.ublinux.ubl-settings-services.checked.svg rename to icons/com.ublinux.ubl-settings-services.checked.svg diff --git a/icons/com.ublinux.ubl-settings-services.launch-symbolic.svg b/icons/com.ublinux.ubl-settings-services.launch-symbolic.svg new file mode 100644 index 0000000..220e08e --- /dev/null +++ b/icons/com.ublinux.ubl-settings-services.launch-symbolic.svg @@ -0,0 +1,4 @@ + + + + diff --git a/icons/com.ublinux.ubl-settings-services.play-symbolic.svg b/icons/com.ublinux.ubl-settings-services.play-symbolic.svg new file mode 100644 index 0000000..146bda8 --- /dev/null +++ b/icons/com.ublinux.ubl-settings-services.play-symbolic.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/icons/com.ublinux.ubl-settings-services.stop-symbolic.svg b/icons/com.ublinux.ubl-settings-services.stop-symbolic.svg new file mode 100644 index 0000000..ef24159 --- /dev/null +++ b/icons/com.ublinux.ubl-settings-services.stop-symbolic.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/icons/com.ublinux.ubl-settings-services.sync-symbolic.svg b/icons/com.ublinux.ubl-settings-services.sync-symbolic.svg new file mode 100644 index 0000000..13651dd --- /dev/null +++ b/icons/com.ublinux.ubl-settings-services.sync-symbolic.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/icons/com.ublinux.ubl-settings-services.uncheck-symbolic.svg b/icons/com.ublinux.ubl-settings-services.uncheck-symbolic.svg new file mode 100644 index 0000000..c55bf8e --- /dev/null +++ b/icons/com.ublinux.ubl-settings-services.uncheck-symbolic.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/com.ublinux.ubl-settings-services.warning.svg b/icons/com.ublinux.ubl-settings-services.warning.svg similarity index 100% rename from com.ublinux.ubl-settings-services.warning.svg rename to icons/com.ublinux.ubl-settings-services.warning.svg diff --git a/icons/com.ublinux.ubl-settings-services.zoom-symbolic.svg b/icons/com.ublinux.ubl-settings-services.zoom-symbolic.svg new file mode 100644 index 0000000..c5011ec --- /dev/null +++ b/icons/com.ublinux.ubl-settings-services.zoom-symbolic.svg @@ -0,0 +1,160 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt index fe54f1e..2d1be60 100644 --- a/source/CMakeLists.txt +++ b/source/CMakeLists.txt @@ -15,19 +15,14 @@ add_definitions(${VTE291_CFLAGS_OTHER}) find_library(WEBKIT_LIBRARIES_FOUND webkit2gtk-4.0 webkit2gtk-web-extension-4.0) -option(WEBKIT_FOUND "No" OFF) if(WEBKIT_LIBRARIES_FOUND) - option(WEBKIT_FOUND "Yes" ON) PKG_CHECK_MODULES(WEBKIT REQUIRED webkit2gtk-4.0 webkit2gtk-web-extension-4.0) include_directories(${WEBKIT_INCLUDE_DIRS}) link_directories(${WEBKIT_LIBRARY_DIRS}) add_definitions(${WEBKIT_CFLAGS_OTHER}) + add_definitions(-DWEBKIT_FOUND) endif() -configure_file(ubl-cmake.in ubl-cmake.h) - -file(COPY ${CMAKE_CURRENT_BINARY_DIR}/ubl-cmake.h DESTINATION ./) - set(GRESOURCE_C resources.c) set(GRESOURCE_XML gresource.xml) @@ -62,9 +57,7 @@ add_custom_target( DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${GRESOURCE_C} ) -#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pedantic -Wall -Wextra -Werror -Wmissing-declarations -fdiagnostics-color=always -std=c++2a") -#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pedantic -Wall -Wextra -Werror -Wmissing-declarations -fdiagnostics-color=always -lm") -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pedantic -Wall -Wextra -Werror -Wmissing-declarations -fdiagnostics-color=always \ +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Werror -Wmissing-declarations -fdiagnostics-color=always \ -O2 -pipe -fno-plt -fexceptions \ -Wp,-D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security \ -fstack-clash-protection -fcf-protection") @@ -74,16 +67,17 @@ set(SOURCE_FILES ubl-settings-services.c ubl-settings-services.h ubl-strings.h - ubl-utils.h - ubl-utils.c - ${CMAKE_CURRENT_BINARY_DIR}/ubl-cmake.h ) set(LIBRARIES ${GTK_LIBRARIES} ${WEBKIT_LIBRARIES} - ${VTE291_LIBRARIES} - pthread) + ${UTILS_LIBRARIES} + ${VTE291_LIBRARIES} + pthread + ublsettings + ublsettings-gtk3 + ublsettingsui-gtk3) add_executable(${PROJECT_NAME} ${SOURCE_FILES} ${CMAKE_CURRENT_BINARY_DIR}/${GRESOURCE_C}) diff --git a/source/ubl-cmake.in b/source/ubl-cmake.in deleted file mode 100644 index d4623a7..0000000 --- a/source/ubl-cmake.in +++ /dev/null @@ -1 +0,0 @@ -#cmakedefine WEBKIT_FOUND diff --git a/source/ubl-settings-services.c b/source/ubl-settings-services.c index d81afc4..d1aa9a5 100644 --- a/source/ubl-settings-services.c +++ b/source/ubl-settings-services.c @@ -1,285 +1,403 @@ -#include "ubl-settings-services.h" - -config main_config; - -//signal emmit handlers - no header initialization - -/**on_close_subwindow(GtkWidget *self) - * [EN] - * Closes window in which [self] is contained. - * [RU] - * Закрывает окно, в котором расположен виджет [self]. -*/ -void on_close_subwindow(GtkWidget *self){ - gtk_widget_destroy(gtk_widget_get_toplevel(self)); -} - -/**yon_open_browser(GtkWidget *self, char *link) - * [EN] - * Opens browser with [link] link. - * [RU] - * Открывает браузер с [link] ссылкой. -*/ -void yon_open_browser(GtkWidget *self, char *link){ - yon_ubl_browser_window_open(link,TITLE_LABEL); -} - -/**on_open_documentation_confirmation(GtkWidget *self, char *link) - * [EN] - * Opens confirmation window for [link] link. - * [RU] - * Открывает окно подтверждение перехода по ссылке [link]. -*/ -void on_open_documentation_confirmation(GtkWidget *self, char *link){ - if (main_config.always_open_documentation==0){ - GtkBuilder *builder = gtk_builder_new_from_resource(glade_path); - documentation_confirmation_window *widgets = malloc(sizeof(documentation_confirmation_window)); - widgets->Window = yon_gtk_builder_get_widget(builder,"helpConfirmationWindow"); - widgets->AcceptButton = yon_gtk_builder_get_widget(builder,"ReadHelpButton"); - widgets->CloseButton = yon_gtk_builder_get_widget(builder,"CancelHelpButton"); - widgets->HatText = yon_gtk_builder_get_widget(builder,"webHeaderNameLabel"); - widgets->HeaderText = yon_gtk_builder_get_widget(builder,"helpHeader"); - widgets->InfoText = yon_gtk_builder_get_widget(builder,"helpText"); - widgets->AlwaysOpenCheck = yon_gtk_builder_get_widget(builder,"AlwaysOpenDocumentationCheckbox"); - gtk_label_set_text(GTK_LABEL(widgets->HatText),TITLE_LABEL); - gtk_label_set_text(GTK_LABEL(widgets->HeaderText),HELP_TITLE_LABEL); - gtk_label_set_text(GTK_LABEL(widgets->InfoText),HELP_INFO_LABEL); - gtk_button_set_label(GTK_BUTTON(widgets->AcceptButton),OPEN_HELP_LABEL); - gtk_button_set_label(GTK_BUTTON(widgets->AlwaysOpenCheck),HELP_ALWAYS_OPEN_LABEL); - gtk_button_set_label(GTK_BUTTON(widgets->CloseButton),CANCEL_LABEL); - gtk_widget_show_all(widgets->Window); - g_signal_connect(G_OBJECT(widgets->CloseButton),"clicked",G_CALLBACK(on_close_subwindow),NULL); - g_signal_connect(G_OBJECT(widgets->AcceptButton),"clicked",G_CALLBACK(yon_open_browser),yon_char_new(link)); - g_signal_connect(G_OBJECT(widgets->AcceptButton),"clicked",G_CALLBACK(on_close_subwindow),NULL); - - - } else { - yon_open_browser(self,link); +#include "ubl-settings-services.h" + +config main_config; + +//functions + +void yon_load_proceed(YON_CONFIG_TYPE type){ + if (yon_config_load_register(type,"config","SERVICESSTART SERVICESNOSTART SERVICESMASK",NULL)){ + } + } -/**on_link(GtkWidget *self, char* uri, gpointer user_data) - * [EN] - * Signal for hadnling AboutDialog links. - * Connect to "activate-link" signal. - * [self] is AboutDialog window; - * [uri] is activated link; - * [user_data] is pointer for user data, hasn't used in standard handler; - * [RU] - * Функция для обработки сигнала нажатия на ссылку окна AboutDialog. - * Присоединять к сигналу "activate-link". - * [self] - окно AboutDialog; - * [uri] - ссылка, по которой совершается переход; - * [user_data] - указатель на любые другие данные, не используется в стандартном обработчике; -*/ -void on_link(GtkWidget *self, char* uri, gpointer user_data){ - gtk_widget_destroy(self); - on_open_documentation_confirmation(self,uri); -} - -/**on_about() - * [EN] - * Function for setting up and showing AboutDialog. - * Connect it to "activate" signal of Documentation MenuItem. - * [RU] - * Функиця для настройки и показа окна AboutDialog. - * Присоединять к сигналу "activate" кнопки справки типа MenuItem. -*/ -void on_about(){ - GtkBuilder *builder=gtk_builder_new_from_resource(glade_path); - GtkWidget *window=yon_gtk_builder_get_widget(builder,"AboutWindow"); - GtkWidget *title=yon_gtk_builder_get_widget(builder,"headerAboutTopic"); - GtkWidget *hideButtonBox=yon_gtk_builder_get_widget(builder,"buttonBoxHide"); - gtk_about_dialog_set_version(GTK_ABOUT_DIALOG(window),version_application); - gtk_about_dialog_set_website_label(GTK_ABOUT_DIALOG(window),PROJECT_HOME_LABEL); - gtk_about_dialog_set_comments(GTK_ABOUT_DIALOG(window),TITLE_LABEL); - gtk_label_set_text(GTK_LABEL(title),TITLE_LABEL); - g_signal_connect(G_OBJECT(window),"activate-link",G_CALLBACK(on_link),NULL); - gtk_widget_set_visible(hideButtonBox,0); - gtk_widget_destroy(hideButtonBox); - gtk_widget_show(window); -} - -//functions +void on_config_local_load(main_window *widgets){ + yon_load_proceed(YON_CONFIG_LOCAL); + yon_interface_update(widgets); +} -void on_activate(GtkTreeView *self, main_window *widgets){ +void on_config_global_load(main_window *widgets){ + yon_load_proceed(YON_CONFIG_GLOBAL); + yon_interface_update(widgets); + +} + +void on_config_global_local_save(){ + yon_save_proceed(NULL,YON_CONFIG_BOTH,"config","SERVICESSTART SERVICESNOSTART SERVICESMASK",NULL); +} + +void on_config_local_save(){ + yon_save_proceed("local",YON_CONFIG_LOCAL,"config","SERVICESSTART SERVICESNOSTART SERVICESMASK",NULL); + +} + +void on_config_global_save(){ + yon_save_proceed("global",YON_CONFIG_GLOBAL,"config","SERVICESSTART SERVICESNOSTART SERVICESMASK",NULL); +} + +// standard functions + +void on_config_autostart_clicked(GtkWidget *self, main_window *widgets){ + if (self){}; GtkTreeIter iter; - GtkTreeModel *model = GTK_TREE_MODEL(main_config.list); - char *name=NULL; - char *description=NULL; + 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)){ - 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); + 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("SERVICESSTART"); + int size; + config_str parsed = yon_char_parse(config_sting,&size,","); + int place = yon_char_parsed_check_exist(parsed,size,name); + if (status==0){ + if (place ==-1){ + if (!yon_config_append("SERVICESSTART",name,",")){ + yon_config_register("SERVICESSTART","[config]",name); + } + } + } else { + if (place !=-1){ + parsed = yon_char_parsed_rip(parsed,&size,place); + if (parsed) + yon_config_set("SERVICESSTART",yon_char_parsed_to_string(parsed,size,",")); + else yon_config_remove_by_key("SERVICESSTART"); + } } + yon_char_parsed_free(parsed,size); } - 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; iliststore2); + 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("SERVICESNOSTART"); + int size; + config_str parsed = yon_char_parse(config_sting,&size,","); + int place = yon_char_parsed_check_exist(parsed,size,name); + if (status==0){ + if (place ==-1){ + if (!yon_config_append("SERVICESNOSTART",name,",")){ + yon_config_register("SERVICESNOSTART","[config]",name); + } + } + } else { + if (place !=-1){ + parsed = yon_char_parsed_rip(parsed,&size,place); + if (parsed) + yon_config_set("SERVICESNOSTART",yon_char_parsed_to_string(parsed,size,",")); + else yon_config_remove_by_key("SERVICESNOSTART"); + } } - gtk_list_store_append(main_config.list, &iter); - - gtk_list_store_set(main_config.list,&iter,4,syslaunched,5,current_service[0],6,current_service[4],-1); - } - - if (config){ - main_config.loaded_config = config; - yon_ubl_status_box_render(LOCAL_SAVE_SUCCESS_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); - }else - yon_ubl_status_box_render(LOAD_FAILED_LABEL,BACKGROUND_IMAGE_FAIL_TYPE); -} - -void yon_config_load_local(GtkWidget *self, main_window *widgets){ - gtk_tree_view_set_model(GTK_TREE_VIEW(widgets->MainTree),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); + yon_char_parsed_free(parsed,size); } - // 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); +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 autostart=0; - gtk_tree_model_get(model,&iter,0,&autostart,-1); - gtk_list_store_set(main_config.list,&iter,0,!autostart,-1); + 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("SERVICESMASK"); + int size; + config_str parsed = yon_char_parse(config_sting,&size,","); + int place = yon_char_parsed_check_exist(parsed,size,name); + if (status==0){ + if (place ==-1){ + if (!yon_config_append("SERVICESMASK",name,",")){ + yon_config_register("SERVICESMASK","[config]",name); + } + } + } else { + if (place !=-1){ + parsed = yon_char_parsed_rip(parsed,&size,place); + if (parsed) + yon_config_set("SERVICESMASK",yon_char_parsed_to_string(parsed,size,",")); + else yon_config_remove_by_key("SERVICESMASK"); + } + } + yon_char_parsed_free(parsed,size); } } -void on_config_autostop_switch(GtkMenuItem *self,main_window *widgets){ - GtkTreeModel *model = GTK_TREE_MODEL(main_config.list); +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 autostop=0; - gtk_tree_model_get(model,&iter,1,&autostop,-1); - gtk_list_store_set(main_config.list,&iter,1,!autostop,-1); + 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_config_block_switch(GtkMenuItem *self,main_window *widgets){ - GtkTreeModel *model = GTK_TREE_MODEL(main_config.list); +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 block=0; - gtk_tree_model_get(model,&iter,2,&block,-1); - gtk_list_store_set(main_config.list,&iter,2,!block,-1); + 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; } -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_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){}; + 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; +} + +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; } +} + +void on_service_update(GtkWidget *self, terminal_window* window){ + if (self){}; + yon_terminal_integrated_start(window->SystemTerminal,service_info_command(window->target),NULL,NULL); +} + +void on_search(){ + +} + +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->target=NULL; + g_signal_connect(G_OBJECT(window->UpdateButton),"clicked",G_CALLBACK(on_service_update),window); + gtk_widget_show(window->Window); + return window; } -void on_system_launched(GtkMenuItem *self,main_window *widgets){ - GtkTreeModel *model = GTK_TREE_MODEL(main_config.list); +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)){ - gboolean launched=0; - gtk_tree_model_get(model,&iter,4,&launched,-1); - gtk_list_store_set(main_config.list,&iter,4,!launched,-1); + 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; + on_service_update(NULL,window); + } } +} + +void on_update(){ - } -void on_config_reload(GtkMenuItem *self,main_window *widgets){ +void on_status_show(){ } -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); +void yon_interface_update(main_window *widgets){ + int size; 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); + config_str services = yon_config_load(load_services_command,&size); + for (int i=0;iliststore2,&iter); + int type; + char *description = parsed[parsed_size-1]; + if (strstr(parsed[0],".socket")) + type = 2; + else type = 1; + gtk_list_store_set(widgets->liststore2,&iter,5,parsed[0],6,description,7,type,-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("SERVICESSTART"); + char *stop = yon_config_get_by_key("SERVICESSROP"); + char *block = yon_config_get_by_key("SERVICESMASK"); + 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); + } +} + +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_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; } GtkWidget *yon_menu_button_create(char *icon_name, char *text) { @@ -300,274 +418,255 @@ GtkWidget *yon_menu_button_create(char *icon_name, char *text) { 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 (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_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; + 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_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_widget_show_all(widgets->RMBMenu); + // gtk_widget_show_all(widgets->menu->Menu); + gtk_menu_popup_at_pointer(GTK_MENU(menu),NULL); + return 0; } return 0; } - -// standard functions - -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.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); +/**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; +} + +void on_activate(GtkTreeView *self, main_window *widgets){ + if (self){}; + GtkTreeIter iter; + GtkTreeModel *model = GTK_TREE_MODEL(widgets->liststore2); + char *name=NULL; + char *description=NULL; + if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->MainTree)),&model,&iter)){ + gtk_tree_model_get(GTK_TREE_MODEL(widgets->liststore2),&iter,5,&name,6,&description,-1); + gtk_label_set_text(GTK_LABEL(widgets->ServiceLabel),name); + gtk_label_set_text(GTK_LABEL(widgets->DescriptionLabel),description); + menu_obj *menu=widgets->menu; + if (main_config.rmb_clicked){ + gboolean CAutostart,CAutostop,CBlock,SAutostart,SLaunched; + gtk_tree_model_get(GTK_TREE_MODEL(widgets->liststore2),&iter,0,&CAutostart,1,&CAutostop,2,&CBlock,3,&SAutostart,4,&SLaunched,-1); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(g_list_nth_data(gtk_container_get_children(GTK_CONTAINER(g_list_nth_data(gtk_container_get_children(GTK_CONTAINER(menu->MenuConfigAutostart)),0))),2)),CAutostart); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(g_list_nth_data(gtk_container_get_children(GTK_CONTAINER(g_list_nth_data(gtk_container_get_children(GTK_CONTAINER(menu->MenuConfigAutostop)),0))),2)),CAutostop); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(g_list_nth_data(gtk_container_get_children(GTK_CONTAINER(g_list_nth_data(gtk_container_get_children(GTK_CONTAINER(menu->MenuConfigBlock)),0))),2)),CBlock); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(g_list_nth_data(gtk_container_get_children(GTK_CONTAINER(g_list_nth_data(gtk_container_get_children(GTK_CONTAINER(menu->MenuSystemAutostart)),0))),2)),SAutostart); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(g_list_nth_data(gtk_container_get_children(GTK_CONTAINER(g_list_nth_data(gtk_container_get_children(GTK_CONTAINER(menu->MenuSystemLaunched)),0))),2)),SLaunched); + gtk_menu_popup_at_pointer(GTK_MENU(menu->Menu),NULL); + } } - main_config.loaded_config=NULL; - + main_config.rmb_clicked=0; } -main_window *setup_window(){ - /* Widgets getting | Получение виджетов */ - main_window *widgets = malloc(sizeof(main_window)); - GtkBuilder *builder = gtk_builder_new_from_resource(glade_path); - widgets->Window = yon_gtk_builder_get_widget(builder,"MainWindow"); - widgets->HatLabel = yon_gtk_builder_get_widget(builder,"headerTopic"); - widgets->PlugBox = yon_gtk_builder_get_widget(builder,"plugBox"); - - widgets->HeadOverlay = yon_gtk_builder_get_widget(builder,"HeadOverlay"); - widgets->HeadImage = yon_gtk_builder_get_widget(builder,"HeadBackgroundImage"); - widgets->HeadBox = yon_gtk_builder_get_widget(builder,"HeaderBox"); - widgets->HeadTitleLabel = yon_gtk_builder_get_widget(builder,"HeaderTitleLabel"); - widgets->HeadInfoLabel = yon_gtk_builder_get_widget(builder,"HeaderInfoLabel"); +/**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->StatusBox = yon_gtk_builder_get_widget(builder,"mainStatusBox"); - widgets->StatusIcon = yon_gtk_builder_get_widget(builder,"mainStatusIcon"); - widgets->StatusLabel = yon_gtk_builder_get_widget(builder,"mainStatusLabel"); - - widgets->SaveLabel = yon_gtk_builder_get_widget(builder,"headerSaveConfigLabel"); - widgets->SaveMenuItem = yon_gtk_builder_get_widget(builder,"SaveGlobalLocalConfigurationMenuItem"); - widgets->SaveGlobalMenuItem = yon_gtk_builder_get_widget(builder,"SaveGlobalConfigurationMenuItem"); - 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"); - widgets->LeftBox = yon_gtk_builder_get_widget(builder,"HeaderLeftBox"); - - widgets->DocumentationMenuItem = yon_ubl_menu_item_documentation_new(DOCUMENTATION_LABEL); // yon_gtk_builder_get_widget(builder,"DocumentationMenuItem"); - widgets->AboutMenuItem = yon_ubl_menu_item_about_new(ABOUT_LABEL); // yon_gtk_builder_get_widget(builder,"AboutMenuItem"); - - widgets->FirstRowNamesTree = yon_gtk_builder_get_widget(builder,"FirstRowNamesTree"); - widgets->MainTree = yon_gtk_builder_get_widget(builder,"MainTree"); - - widgets->ActionsPopover = yon_gtk_builder_get_widget(builder,"ActionsPopover"); - - 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); - - if (main_config.lock_load_global == 1){ - gtk_widget_set_sensitive(widgets->LoadGlobalMenuItem,0); - } - if (main_config.lock_save_global == 1){ - gtk_widget_set_sensitive(widgets->SaveGlobalMenuItem,0); - gtk_widget_set_sensitive(widgets->SaveMenuItem,0); - } - if (main_config.lock_save_local == 1){ - gtk_widget_set_sensitive(widgets->SaveLocalMenuItem,0); - gtk_widget_set_sensitive(widgets->SaveMenuItem,0); - } - - /* Signal connection | Присоединение сигналов */ - g_signal_connect(G_OBJECT(widgets->Window), "destroy", G_CALLBACK(gtk_main_quit), NULL); + 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"); + 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->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->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_status_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->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); - return widgets; + g_signal_connect(G_OBJECT(widgets->ServiceTypeCombo),"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_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); + yon_load_proceed(YON_CONFIG_LOCAL); + yon_interface_update(widgets); } -int main(int argc, char *argv[]){ +int main(int argc, char *argv[]){ local=setlocale(LC_ALL, ""); textdomain (LocaleName); config_init(); int option_index=0; int show_help=0; - int debug_mode=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'}, - {"debug", 0,0, 'd'}, - { NULL, 0, NULL, 0 } - }; - for (int i=0;iHeadOverlay,widgets->HeadBox,widgets->HeadImage,banner_path); - - yon_ubl_status_box_setup(widgets->StatusIcon,widgets->StatusBox,widgets->StatusLabel); - if (getuid()!=0) - yon_ubl_status_box_render(ROOT_WARNING_LABEL,BACKGROUND_IMAGE_FAIL_TYPE); - else - yon_ubl_status_box_render(TITLE_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); - 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(), - GTK_STYLE_PROVIDER(css), - -1); + { + struct option long_options[] = { + {"help", 0, 0, 'h'}, + {"version", 0, 0, 'V'}, + {"lock-help", 0,0, 1}, + {"lock-save", 0,0, 2}, + {"lock-save-local", 0,0, 3}, + {"lock-save-global", 0,0, 4}, + {"lock-load-global", 0,0, 5}, + {"socket-id", 1, 0, 's'}, + {"socket-ext-id", 1,0, 'e'}, + {"socket-trd-id", 1,0, 't'}, + {"clear-config", 0,0, 'c'}, + { NULL, 0, NULL, 0 } + }; + for (int i=0;i -#include -#include "ubl-utils.h" -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include #include -#include -#include -#include "../compile/ubl-cmake.h" -#include -#ifdef WEBKIT_FOUND - #include -#endif -#include "ubl-strings.h" - -#define WIKI_LINK "https://wiki.ublinux.ru/ru/Программное_обеспечение/Программы_и_утилиты/Все/ubl-settings-services" - -#define _(String) gettext(String) - +#include +#include +#include +#include +#ifdef WEBKIT_FOUND + #include +#endif +#include "ubl-strings.h" + +#define WIKI_LINK "https://wiki.ublinux.ru/ru/Программное_обеспечение/Программы_и_утилиты/Все/ubl-settings-services" + +#define _(String) gettext(String) + #define glade_path "/com/ublinux/ui/ubl-settings-services.glade" +#define glade_path_terminal "/com/ublinux/ui/ubl-settings-services-terminal.glade" + #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 CssPath "/com/ublinux/css/ubl-settings-services.css" +#define config_path yon_char_unite(yon_ubl_user_get_home_directory(),"/.config/",LocaleName,"/",LocaleName,".conf",NULL) + +#define LocalePath "/usr/share/locale" +#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_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; +#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) +#define service_stop_command(target) yon_char_append("systemctl stop --no-pager ",target) +#define service_enable_command(target) yon_char_append("systemctl enable --no-pager ",target) +#define service_disable_command(target) yon_char_append("systemctl disable --no-pager ",target) +#define service_info_command(target) yon_char_append("systemctl status --no-pager ",target) + +typedef char* string; string version_application; - -char *local; - -typedef struct { - int always_open_documentation; - int win_pos_x; - int win_pos_y; - int win_width; - int win_height; - + +char *local; + +typedef struct { +// Standard config. DO NOT EDIT - MUST BE SAME AS ublsettings-ui's template_config STRUCT { int socket_id; int load_socket_id; int save_socket_id; @@ -57,10 +55,19 @@ typedef struct { int lock_save_global; int lock_load_global; - config_str loaded_config; - GtkListStore *list; - gboolean rmb_clicked; -} config; + int load_mode; + + int always_open_documentation; +// } Standard config. DO NOT EDIT - MUST BE SAME AS ublsettings-ui's template_config STRUCT +// Type custom parameters below: + int rmb_clicked; + GtkTreeModel *ServiceFilter; + GtkTreeModel *SocketFilter; + GtkTreeModel *AutolaunchFilter; + GtkTreeModel *StoppedFilter; + GtkTreeModel *BlockedFilter; + +} config; typedef struct { GtkWidget *Menu; @@ -72,68 +79,161 @@ typedef struct { GtkWidget *MenuReloadConfig; GtkWidget *MenuStatus; } menu_obj; + +typedef struct { +// Standard widgets. DO NOT EDIT - MUST BE SAME AS ublsettings-ui's template_main_window STRUCT { + GtkWidget *Window; + GtkWidget *HeadLabel; + GtkWidget *PlugBox; + + GtkWidget *HeadOverlay; + GtkWidget *HeadImage; + GtkWidget *HeadBox; + GtkWidget *HeadTitleLabel; + GtkWidget *HeadInfoLabel; + + GtkWidget *StatusBox; + GtkWidget *StatusIcon; + GtkWidget *StatusLabel; + + GtkWidget *SaveMenuItem; + GtkWidget *SaveGlobalMenuItem; + GtkWidget *SaveLocalMenuItem; + GtkWidget *RightBox; + + GtkWidget *LoadGlobalMenuItem; + GtkWidget *LoadLocalMenuItem; + GtkWidget *LeftBox; + + GtkWidget *DocumentationMenuItem; + GtkWidget *AboutMenuItem; + + GtkWidget *InterfaceBox; +// } Standard widgets. DO NOT EDIT - MUST BE SAME AS ublsettings-ui's template_main_window STRUCT +// Type custom parameters below: + GtkListStore *liststore1; + GtkListStore *liststore2; + GtkWidget *BoxMain; + GtkWidget *ServiceSourceCombo; + GtkWidget *ServiceTypeCombo; + GtkWidget *SearchEntry; + GtkWidget *UpdateButton; + GtkWidget *ConfigAutostartButton; + GtkWidget *ConfigAutostopButton; + GtkWidget *ConfigBlockButton; + GtkWidget *SystemAutostartButton; + GtkWidget *SystemLaunchButton; + GtkWidget *InfoButton; + GtkWidget *LogButton; + GtkWidget *MainUpperTree; + GtkWidget *MainTree; + GtkWidget *RMBMenu; + menu_obj *menu; + GtkWidget *ServiceLabel; + GtkWidget *DescriptionLabel; + +} main_window; + +typedef struct { + GtkWidget *Window; + + GtkWidget *AlwaysOpenCheck; + + GtkWidget *CloseButton; + GtkWidget *AcceptButton; +} documentation_confirmation_window; + +typedef struct{ + GtkListStore *liststore1; + GtkListStore *liststore2; + GtkWidget *BoxMain; + GtkWidget *ServiceSourceCombo; + GtkWidget *ServiceTypeCombo; + GtkWidget *SearchEntry; + GtkWidget *UpdateButton; + GtkWidget *ConfigAutostartButton; + GtkWidget *ConfigAutostopButton; + GtkWidget *ConfigBlockButton; + GtkWidget *SystemAutostartButton; + GtkWidget *SystemLaunchButton; + GtkWidget *InfoButton; + GtkWidget *LogButton; + GtkWidget *MainUpperTree; + GtkWidget *MainTree; +} bl_settings_services_window; typedef struct { GtkWidget *Window; - GtkWidget *HatLabel; - GtkWidget *PlugBox; + GtkWidget *UpdateButton; + GtkWidget *SystemTerminal; + char *target; +} terminal_window; - GtkWidget *HeadOverlay; - GtkWidget *HeadImage; - GtkWidget *HeadBox; - GtkWidget *HeadTitleLabel; - GtkWidget *HeadInfoLabel; +void on_config_local_load(); - GtkWidget *StatusBox; - GtkWidget *StatusIcon; - GtkWidget *StatusLabel; +void on_config_global_load(); - GtkWidget *SaveLabel; - GtkWidget *SaveMenuItem; - GtkWidget *SaveGlobalMenuItem; - GtkWidget *SaveLocalMenuItem; - GtkWidget *RightBox; +void on_config_global_local_save(); - GtkWidget *LoadLabel; - GtkWidget *LoadGlobalMenuItem; - GtkWidget *LoadLocalMenuItem; - GtkWidget *LeftBox; +void on_config_local_save(); - GtkWidget *ChosenNameLabel; - GtkWidget *ChosenDescriptionLabel; +void on_config_global_save(); - GtkWidget *DocumentationMenuItem; - GtkWidget *AboutMenuItem; +void yon_interface_update(main_window *widgets); - GtkWidget *ActionsPopover; +GtkWidget *yon_menu_button_create(char *icon_name, char *text); - GtkWidget *FirstRowNamesTree; - GtkWidget *MainTree; +void on_column_resize(GtkTreeViewColumn *self,GParamSpec *pspec,main_window *widgets); - GtkTreeViewColumn *ServiceTreeColumn; - GtkWidget *RMBMenu; - menu_obj *menu; -} main_window; +gboolean on_context_menu_open(GtkWidget *self,GdkEventButton *event, main_window *widgets); -typedef struct { - char *name; - int loaded; - int active; - char *description; -} service_info; +GtkWidget *yon_menu_separator_create(); -typedef struct { - GtkWidget *Window; +void on_config_autostart_clicked(); + +void on_activate(GtkTreeView *self, main_window *widgets); + +void on_config_autostop_clicked(); + +void on_config_block_clicked(); + +void on_system_autostart_clicked(); + +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); + +void on_search(); + +void on_info_clicked(); + +void on_update(); + +void on_status_show(); + +void yon_load_proceed(YON_CONFIG_TYPE type); + + void config_init(); + +void yon_main_window_complete(main_window *widgets); + + +gboolean on_service_filter(GtkTreeModel *model, GtkTreeIter *iter,void *data); + +gboolean on_socket_filter(GtkTreeModel *model, GtkTreeIter *iter,void *data); + +gboolean on_autostart_filter(GtkTreeModel *model, GtkTreeIter *iter,void *data); - GtkWidget *HatText; - GtkWidget *HeaderText; - GtkWidget *InfoText; - GtkWidget *AlwaysOpenCheck; +gboolean on_stopped_filter(GtkTreeModel *model, GtkTreeIter *iter,void *data); - GtkWidget *CloseButton; - GtkWidget *AcceptButton; -} documentation_confirmation_window; +gboolean on_blocked_filter(GtkTreeModel *model, GtkTreeIter *iter,void *data); +terminal_window *yon_terminal_window_new(); -void yon_config_main_clean(); -main_window *setup_window(); \ No newline at end of file +void on_service_update(GtkWidget *self, terminal_window* window); \ No newline at end of file diff --git a/source/ubl-strings.h b/source/ubl-strings.h index aaae50b..6beb30c 100644 --- a/source/ubl-strings.h +++ b/source/ubl-strings.h @@ -1,60 +1,15 @@ #define VERSION_LABEL yon_char_unite(_("Version:")," ",version_application,"\n",NULL) -#define HELP_LABEL yon_char_unite(_("ubl-settings-services version:")," ", version_application,"\n",_("Services and processes systemd"),"\n",_("Usage:"), " ubl-settings-services ",_("[OPTIONS]"),"\n",_("Options:"),"\n\t--help, -h\t\t\t",_("Show this help"),"\n\t--version, -V\t\t\t",_("Show package version"),"\n\t--lock-help\t\t\t",_("Lock this help menu"),"\n\t--lock-save\t\t\t",_("Lock configuration saving"),"\n\t--lock-save-local\t\t",_("Lock local configration saving"),"\n\t--lock-save-global\t\t",_("Lock global configration saving"),"\n\t--lock-load-global\t\t",_("Lock global configration loading"),"\n",NULL) +#define HELP_LABEL yon_char_unite(_("ubl-settings-services version:")," ", version_application,"\n",_("ubl-settings-services"),"\n",_("Usage:"), " ubl-settings-services ",_("[OPTIONS]"),"\n",_("Options:"),"\n\t--help, -h\t\t\t",_("Show this help"),"\n\t--version, -V\t\t\t",_("Show package version"),"\n\t--lock-help\t\t\t",_("Lock this help menu"),"\n\t--lock-save\t\t\t",_("Lock configuration saving"),"\n\t--lock-save-local\t\t",_("Lock local configration saving"),"\n\t--lock-save-global\t\t",_("Lock global configration saving"),"\n\t--lock-load-global\t\t",_("Lock global configration loading"),"\n\t--clear-config\t\t\t",_("Reset application settings"),"\n",NULL) #define TITLE_LABEL _("Services and processes systemd") #define TITLE_INFO_LABEL _("System services and processes configuration") +#define SERVICE_INFO_TITLE_LABEL _("Services and processes - service information") -#define SUCCESS_LABEL _("Operation succeeded") -#define ROOT_WARNING_LABEL _("Warning! Application was launched without root - root-dependent actions are locked") - -#define ABOUT_LABEL _("About") -#define DOCUMENTATION_LABEL _("Documentation") - -#define SAVE_LOCAL_LABEL _("Save to local configuration") -#define SAVE_GLOBAL_LABEL _("Save to global configuration") -#define SAVE_CONFIGURATION_LABEL _("Save configuration") -#define SAVE_LABEL _("Save") - -#define LOAD_LOCAL_LABEL _("Load local configuration") -#define LOAD_GLOBAL_LABEL _("Load global configuration") -#define LOAD_LABEL _("Load") - -#define CANCEL_LABEL _("Cancel") - -#define HELP_TITLE_LABEL _("Would you like to read documentation in the Web?") -#define HELP_INFO_LABEL _("You will be redirected to documentation website where documentation is\ntranslated and supported by community.") -#define HELP_ALWAYS_OPEN_LABEL _("Always redirect to online documentation") -#define OPEN_HELP_LABEL _("Open documentation") -#define PROJECT_HOME_LABEL _("Project Home Page") -#define NOTHING_CHOSEN_LABEL _("Nothing were chosen") - - -#define GLOBAL_LOAD_SUCCESS_LABEL _("Global configuration loading succseeded.") -#define LOCAL_LOAD_SUCCESS_LABEL _("Local configuration loading succseeded.") -#define LOAD_FAILED_LABEL _("Config loading failed") - -#define GLOBAL_LOCAL_SAVE_SUCCESS_LABEL _("Local and global configuration saving succseeded.") -#define GLOBAL_SAVE_SUCCESS_LABEL _("Global configuration saving succseeded.") -#define LOCAL_SAVE_SUCCESS_LABEL _("Local configuration saving succseeded.") - +#define CONFIG_CONFIGURATION_LABEL _("Configure in configuration") #define AUTOSTART_LABEL _("Autostart") #define AUTOSTOP_LABEL _("Autostop") #define BLOCK_LABEL _("Block") -#define AUTOSTART_LABEL _("Autostart") +#define SYSTEM_CONFIGURATION_LABEL _("Configure in system") #define LAUNCHED_LABEL _("Launched") -#define SERVICE_LABEL _("Service") -#define CONFIG_CONFIGURATION_LABEL _("Configuration in config file") -#define SYSTEM_CONFIGURATION_LABEL _("Configuration in system") - -#define ALL_LABEL _("All") -#define SERVICES_LABEL _("Services") -#define SOCKETS_LABEL _("Sockets") -#define AUTOMATIC_LAUNCH_LABEL _("Automatic launch") -#define STOPPED_LABEL _("Stopped in configuration") -#define BLOCKED_LABEL _("Blocked in configuration") -#define ALL_SERVICES_LABEL _("All services") -#define SYSTEM_ONLLY_LABEL _("System services only") -#define USER_ONLY_LABEL _("User services only") - -#define SERVICE_RELOAD_LABEL _("Service configuration reload") -#define STATUS_LABEL _("Status") \ No newline at end of file +#define SERVICE_RELOAD_LABEL _("Reload") +#define STATUS_LABEL _("Show status") \ No newline at end of file diff --git a/source/ubl-utils.c b/source/ubl-utils.c deleted file mode 100644 index a8a00ef..0000000 --- a/source/ubl-utils.c +++ /dev/null @@ -1,1762 +0,0 @@ -#include "ubl-utils.h" - -// dictionary functions - -/**yon_dictionary_create_empty(): - * [EN] - * Creates and returns empty dictionary - * [RU] - * Создаёт и возвращает пустой словарь. - */ -dictionary *yon_dictionary_new() -{ - dictionary *dict = malloc(sizeof(dictionary)); - dict->data = NULL; - dict->key = NULL; - dict->next = NULL; - dict->prev = NULL; - dict->first = dict; - dict->data_type = DICTIONARY_OTHER_TYPE; - return dict; -} - -/**yon_dictionary_copy(dictionary *dict) - * [EN] - * - * [RU] - * Создаёт и возвращает копию элемента словаря [dict] -*/ -dictionary *yon_dictinoary_copy(dictionary *dict){ - dictionary *dct = yon_dictionary_new_with_data(dict->key,dict->data); - dct->data_type= dict->data_type; -} - -/**yon_dictionary_copy_deep(dictionary *dict) - * [EN] - * - * [RU] - * Создаёт полную копию словаря [dict] и возвращает первый элемент -*/ -dictionary *yon_dictionary_copy_deep(dictionary *dict){ - dictionary *dct = NULL; - dictionary *newone=NULL; - for_dictionaries(dct,dict){ - yon_dictionary_add_or_create_if_exists_with_data(newone,dct->key,dct->data); - newone->data_type=dct->data_type; - } - 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; -} - -/**yon_dictionary_switch_to_last(dictionary **dict) - * [EN] - * - * [RU] - * Переключает словарь [dict] на последний элемент. -*/ -void yon_dictionary_switch_to_last(dictionary **dict) -{ - dictionary *dct=NULL, *dact=*dict; - for_dictionaries(dct,dact); -} - -/**yon_dictionary_create_conneced(dictionary *targetdict) - * [EN] - * - * [RU] - * Создаёт новый элемент словаря [targetdict] -*/ -dictionary *yon_dictionary_append(dictionary *targetdict) -{ - targetdict = yon_dictionary_get_last(targetdict); - targetdict->next = yon_dictionary_new(); - targetdict->next->prev = targetdict; - targetdict->next->first = targetdict->first; - targetdict->next->data_type = DICTIONARY_OTHER_TYPE; - return targetdict->next; -} - -/**yon_dictionary_get_last(dictionary *dict) - * [EN] - * - * [RU] - * Возвращает последний элемент словаря [dict]. - * В отличае от yon_dictionary_switch_to_last() - * словарь [dict] остаётся на прежнем элементе. -*/ -dictionary *yon_dictionary_get_last(dictionary *dict) -{ - if (dict->next){ - dictionary *dct = NULL; - for_dictionaries(dct,dict); - return dct; - } else return dict; -} - -/**yon_dictionary_switch_places(dictionary *dict, int aim) - * [EN] - * - * [RU] - * Меняет элемент словаря [dict] местами с другим элементом. - * если [aim]<0 элемент меняется местами с левым элементом; - * если [aim]>0 элемент меняется местами с правым элементом; -*/ -dictionary *yon_dictionary_swap(dictionary *dict, int aim) -{ - if (aim < 0) - { - if (dict->prev) - { - if (dict->prev->prev) - { - dictionary *next = dict->next, *prev = dict->prev, *preprev = prev->prev; - if (next) - { - preprev->next = dict; - dict->prev = preprev; - dict->next = prev; - prev->prev = dict; - prev->next = next; - next->prev = prev; - } - else - { - preprev->next = dict; - dict->prev = preprev; - dict->next = prev; - prev->prev = dict; - prev->next = NULL; - } - return prev; - } - else - { - dictionary *next = dict->next, *prev = dict->prev; - if (next) - { - yon_dictionary_make_first(dict); - dict->prev = NULL; - dict->next = prev; - prev->prev = dict; - prev->next = next; - next->prev = prev; - } - else - { - dict->prev = NULL; - dict->next = prev; - prev->prev = dict; - prev->next = NULL; - } - return prev; - } - } - } - else if (aim > 0) - { - if (dict->next) - { - if (dict->next->next) - { - dictionary *next = dict->next, *prev = dict->prev, *afnext = next->next; - if (prev) - { - prev->next = next; - next->prev = prev; - next->next = dict; - dict->prev = next; - dict->next = afnext; - afnext->prev = dict; - } - else - { - yon_dictionary_make_first(next); - next->prev = NULL; - next->next = dict; - dict->prev = next; - dict->next = afnext; - afnext->prev = dict; - } - return next; - } - else - { - dictionary *next = dict->next, *prev = dict->prev; - if (prev) - { - prev->next = next; - next->prev = prev; - next->next = dict; - dict->prev = next; - dict->next = NULL; - } - else - { - next->prev = NULL; - next->next = dict; - dict->prev = next; - dict->next = NULL; - } - } - } - } -} - -/**yon_dictionary_make_first(dictionary *dict) - * [EN] - * - * [RU] - * Устанавливает указатель первого элемента словаря [dict] - * на текущий элемент. Не использовать. -*/ -void yon_dictionary_make_first(dictionary *dict) -{ - for (dictionary *dct = dict->first; dct != NULL; dct = dct->next) - { - dct->first = dict; - } -} - -/**yon_dictionary_make_nth(dictionary *dict, int nth) - * [EN] - * - * [RU] - * Перемещает элемент словаря [dict] на позицию [nth]. -*/ -void yon_dictionary_make_nth(dictionary *dict, int nth) -{ - dictionary *dct = dict->first; - for (int i = 0; i < nth; i++) - { - if (dct == NULL) - return; - else - dct = dct->next; - } - yon_dictionary_rip(dict); - dictionary *prev = dct->prev; - prev->next = dict; - dict->prev = prev; - dict->next = dct; - dct->prev = dict; -} - -/**yon_dictionary_create_with_data(char *key, void *data) - * [EN] - * - * [RU] - * Создаёт новый словарь с ключом [key] и указателем на данные [data] -*/ -dictionary *yon_dictionary_new_with_data(char *key, void *data) -{ - dictionary *dct = yon_dictionary_new(); - dct->key = yon_char_new(key); - dct->data = data; - dct->data_type = DICTIONARY_OTHER_TYPE; - return dct; -} - -/** void *yon_dictionary_free_all(dictionary *dictionary,void *data_manipulation) - * [EN] - * Frees whole [dictionary] and activates [data_manipulation] function if not NULL with [dictionary]->data argument for each dictionary. - * [RU] - * Освобождает память для всех элементов словаря [dictionary] и активирует функцию [data_manipulation], если она была передана, с аргументом [dictionary]->data на каждый элемент словаря. -*/ -void *yon_dictionary_free_all(dictionary *dictionary_to_free,void (*data_manipulation)(void*)){ - dictionary *dict=NULL; - for_dictionaries(dict,dictionary_to_free){ - if(data_manipulation) - data_manipulation(dict->data); - if(dict->prev) - free(dict->prev); - } - free(dict); - return NULL; -} - -/**yon_dictionary_create_with_data_connected(dictionary *dict, char *key, void *data) - * [EN] - * - * [RU] - * Создаёт новый элемент словаря, присоединяемый в конец словаря [dict] - * с ключом [key] и указателем на данные [data] -*/ -dictionary *yon_dictionary_append_with_data(dictionary *dict, char *key, void *data) -{ - dictionary *dct = yon_dictionary_append(dict); - dct->key = yon_char_new(key); - dct->data = data; - dct->data_type = DICTIONARY_OTHER_TYPE; - return dct; -} - -/**yon_dictionary_connect(dictionary *old, dictionary *toconnect) - * [EN] - * - * [RU] - * Присоединяет словарь [toconnect] в конец словаря [old]. -*/ -dictionary *yon_dictionary_connect(dictionary *old, dictionary *toconnect) -{ - dictionary *dict = yon_dictionary_get_last(old); - dict->next = toconnect; - toconnect->prev = dict; - toconnect->first = dict->first; - return toconnect; -} - -/**yon_dictionary_get(dictionary **dict, char *key) - * [EN] - * - * [RU] - * Возвращает элемент словаря [dict] с ключом [key]. - * Если такого элемента не было обнаружено, возвращается NULL -*/ -dictionary *yon_dictionary_get(dictionary **dict, char *key) -{ - dictionary *dct = *dict; - for (dictionary *pointer = dct->first; pointer != NULL; pointer = pointer->next) - { - if (strcmp(pointer->key, key) == 0) - { - *dict = pointer; - return pointer; - } - } - return NULL; -} - -/**yon_dictionary_rip(dictionary *dict) - * [EN] - * - * [RU] - * Вырезает элемент из словаря и возвращает вырезанный элемент. -*/ -dictionary *yon_dictionary_rip(dictionary *dict) -{ - if (!dict->next&&!dict->prev) return NULL; - else if (!dict->next) - { - dictionary *prev = dict->prev; - if (prev) - { - prev->next = NULL; - return prev; - } - else - return dict; - } - else if (!dict->prev) - { - dictionary *next = dict->next; - if (next) - { - yon_dictionary_make_first(next); - next->prev = NULL; - return next; - } - else - return dict; - } - else - { - dictionary *next = dict->next, *prev = dict->prev; - next->prev = prev; - prev->next = next; - return next; - } -} - -/**yon_dictionary_get_nth(dictionary *dict, int place) - * [EN] - * - * [RU] - * Возвращает [place]-й элемент словаря [dict] -*/ -dictionary *yon_dictionary_get_nth(dictionary *dict, int place) -{ - if (dict){ - dict = dict->first; - int i = 0; - for (i = 0; i < place; i++) - if (dict->next) - dict = dict->next; - else - break; - if (i == place) - return dict; - else - return NULL; - } else return NULL; -} - -// char functions - -/**[EN] - * - * creates new char string by combining two char strings. - */ -char *yon_char_append(char *source, char *append) -{ - if (source && append) - { - int size = strlen(source) + strlen(append) + 1; - char *final = malloc(size); - memset(final, 0, size); - if (strstr(source, "%%")) - sprintf(final, source, append); - else - sprintf(final, "%s%s", source, append); - return final; - } - else - return NULL; -} - -/**[EN] - * - * creates new char string by copying another char. - */ -char *yon_char_new(char *chr) -{ - if (chr){ - char *newchar = malloc(strlen(chr) + 1); - memset(newchar, 0, strlen(chr) + 1); - memcpy(newchar, chr, strlen(chr)); - return newchar; - } else - return NULL; -} - -/**yon_char_unite(char *source, ...) - * [En] - * - * [RU] - * Объединяет строку [source] со всеми строками, написанными в [...] -*/ -char *yon_char_unite(char *source, ...){ - va_list arglist; - char *new_char=NULL; - char *unite_char=NULL; - new_char=yon_char_new(source); - va_start(arglist,source); - unite_char = va_arg(arglist,char*); - while(unite_char){ - new_char = yon_char_append(new_char,unite_char); - unite_char = va_arg(arglist,char*); - } - va_end(arglist); - return new_char; -} - -/**yon_cut(char *source, int size, int startpos) - * [EN] - * cuts source string by size length from startpos position. - */ -char *yon_cut(char *source, int size, int startpos) -{ - char *cut = NULL; - cut = malloc(size + 1); - memset(cut, 0, size + 1); - memcpy(cut, source + startpos, size); - return cut; -} - -/**yon_char_divide(char *source, int dividepos) - * [EN] - * divides source string in dividepos position, - * returning left part of divided string and - * inserting right part to source string. - */ -char *yon_char_divide(char *source, int dividepos) -{ - char *cut = malloc(dividepos + 1); - memset(cut, 0, dividepos + 1); - memcpy(cut, source, dividepos); - char *left = malloc(strlen(source) - strlen(cut)); - memset(left, 0, strlen(source) - strlen(cut)); - memcpy(left, source + dividepos + 1, (strlen(source) - dividepos)); - memset(source, 0, strlen(source)); - memcpy(source, left, strlen(left)); - 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; - int size=0; - int pos=0; - config_str rtn = yon_char_parse(working_string,&size,"\n"); - for (int j=0;j= 10; i++) - { - convert_check = convert_check / 10; - } - char *ch = g_malloc0(i * sizeof(char) + 1); - sprintf(ch, "%d", int_to_convert); - return ch; -} - -/**yon_char_replace(char *source, char *find, char*replace) - * [EN] - * - * [RU] - * Заменяет в строке [source] все вхождения строки [find] на [replace] -*/ -char *yon_char_replace(char *source, char *find, char*replace){ - char *final=NULL; - char *temp=NULL; - if(!strstr(replace,find)){ - while ((final=strstr(source,find))){ - temp=malloc(strlen(source)-strlen(final)); - memset(temp,0,strlen(source)-strlen(final)+strlen(replace)); - memcpy(temp,source,strlen(source)-strlen(final)); - temp=yon_char_append(temp,replace); - source=yon_char_append(temp,final+1); - } - return source; - } -} - -/**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 -*/ -char **yon_char_parse(char *parameters, int *size, char *divider){ - char **string=NULL; - int i=1; - string=malloc(sizeof(char*)); - char *paramline=yon_char_new(parameters); - char *param; - while ((param=yon_char_divide_search(paramline,divider,1))){ - string=realloc(string,sizeof(char*)*i); - string[i-1]=yon_char_new(param); - i++; - if (strcmp(param,paramline)==0) break; - } - string=realloc(string,sizeof(char*)*i); - string[i-1]=yon_char_new(paramline); - i++; - // printf("%d\n",i); - *size=i-1; - return string; - -} - -/**yon_char_parsed_rip(char **char_string, int *size, int item_to_delete) - * [EN] - * - * [RU] - * Удаляет элемент [item_to_delete] из массива строк [char_string], размера [size] - * Возвращает получившийся массив, в [size] загружается размер нового массива. -*/ -char **yon_char_parsed_rip(char **char_string, int *size, int item_to_delete){ - char **new_char_parsed=NULL; - new_char_parsed=malloc(sizeof(char*)*((*size)-1)); - int flag = 0; - for (int i=0;i < (*size);i++){ - if (i==item_to_delete) { - flag = 1; - } - if (flag == 0) { - new_char_parsed[i]=yon_char_new(char_string[i]); - } - else if (flag == 1 && i!=item_to_delete) { - new_char_parsed[i-1]=yon_char_new(char_string[i]); - } - } - (*size)=(*size)-1; - return new_char_parsed; -} - -/**yon_char_parsed_check_exist(char **parameters, int size, char *param) - * [EN] - * Checks if [parameters] string array of length [size] - * has [param] element; - * [RU] - * Проверяет есть ли в массиве строк [parameters], размера [size] - * элемент [param] -*/ -int yon_char_parsed_check_exist(char **parameters, int size, char *param){ - - for (int i=0;id_name); - file = fopen(path, "r"); - if (strlen(de->d_name) > 9) - { - char *extension = strstr(path, "."); - if (extension != NULL) - { - if (strcmp(extension, ".desktop") == 0) - { - apps tempapp; - GKeyFile *gfile = g_key_file_new(); - GError *err = NULL; - g_key_file_load_from_file(gfile, path, G_KEY_FILE_KEEP_TRANSLATIONS, NULL); - char *Type = g_key_file_get_string(gfile, "Desktop Entry", "Type", &err); - if (err) - { - printf("%s\n", err->message); - } - if (strcmp(Type, "Application") == 0) - tempapp.Type = 1; - else if (strcmp(Type, "pyApplication") == 0) - tempapp.Type = 2; - else - continue; - tempapp.Name = g_key_file_get_locale_string(gfile, "Desktop Entry", "Name", setlocale(LC_ALL, NULL), NULL); - if (tempapp.Name == NULL) - continue; - tempapp.Categories = g_key_file_get_string(gfile, "Desktop Entry", "Categories", NULL); - if (tempapp.Categories == NULL) - continue; - tempapp.Exec = g_key_file_get_string(gfile, "Desktop Entry", "Exec", NULL); - if (tempapp.Exec == NULL) - continue; - tempapp.Icon = g_key_file_get_string(gfile, "Desktop Entry", "Icon", NULL); - if (tempapp.Icon == NULL) - continue; - tempapp.Pluggable = g_key_file_get_boolean(gfile, "Desktop Entry", "Pluggable", NULL); - if (!tempapp.Pluggable) - tempapp.Pluggable = g_key_file_get_boolean(gfile, "Desktop Entry", "X-XfcePluggable", NULL); - if (tempapp.Pluggable) - tempapp.DualPluggable = g_key_file_get_boolean(gfile, "Desktop Entry", "X-UBLPluggable", NULL); - if (g_key_file_get_boolean(gfile, "Desktop Entry", "X-UBL-SettingsManager-Hidden", NULL) == 0) - if (size == 0) - { - applist = (apps *)malloc(size + 1 * sizeof(apps)); - applist[0].Name = yon_char_new(tempapp.Name); - applist[0].Categories = yon_char_new(tempapp.Categories); - applist[0].Exec = yon_char_new(tempapp.Exec); - applist[0].Icon = yon_char_new(tempapp.Icon); - applist[0].Type = tempapp.Type; - applist[0].Pluggable = tempapp.Pluggable; - applist[0].DualPluggable = tempapp.DualPluggable; - size++; - } - else - { - applist = (apps *)realloc(applist, (size + 1) * sizeof(apps)); - applist[size].Name = yon_char_new(tempapp.Name); - applist[size].Categories = yon_char_new(tempapp.Categories); - applist[size].Exec = yon_char_new(tempapp.Exec); - applist[size].Icon = yon_char_new(tempapp.Icon); - applist[size].Pluggable = tempapp.Pluggable; - applist[size].DualPluggable = tempapp.DualPluggable; - applist[size].Type = tempapp.Type; - size++; - } - } - } - } - } - } - *sizef = size; - return applist; -}; - -void yon_apps_sort(apps *applist, int size) -{ - apps tmp; - if (size > 2) - { - for (int i = 1; i < size; i++) - { - for (int j = 1; j < size; j++) - { - if (strcmp(applist[j].Name, applist[j - 1].Name) < 0) - { - tmp = applist[j]; - applist[j] = applist[j - 1]; - applist[j - 1] = tmp; - }; - } - }; - } -}; - -apps *yon_apps_get_by_name(apps *applist, char *name, int size) -{ - for (int i = 0; i < size; i++) - { - if (strcmp(applist[i].Name, name) == 0) - return &applist[i]; - } - return NULL; -}; - -//config functions - -/**yon_config_load_register(char *command) - * [EN] - * - * [RU] - * Выполняет команду [command]. - * Полученные данные парсятся и регистрируются в конфиг. -*/ -int yon_config_load_register(char *command){ - if (__yon__config__strings){ - __yon__config__strings = yon_dictionary_free_all(__yon__config__strings,NULL); - } - FILE *output = popen(command, "r"); - char **output_strings = NULL; - output_strings = malloc(sizeof(char)); - int i = 0; - char str[4096]; - memset(str, 0, 4096); - while (fgets(str, 4096, output)) - { - if (strcmp(str, "") != 0&& strcmp(str,"(null)\n")!=0) - { - char *key = yon_char_divide_search(str,"=",-1); - yon_dictionary_add_or_create_if_exists_with_data(__yon__config__strings,key,str); - __yon__config__strings->data_type=DICTIONARY_CHAR_TYPE; - } - } - check_config - return 0; - else return 1; -} - -/**yon_config_remove_by_key(char *key) - * [EN] - * - * [RU] - * Удаляет параметр конфига по ключу [key] -*/ -int yon_config_remove_by_key(char *key){ - check_config{ - dictionary *dict = yon_dictionary_get(&__yon__config__strings,key); - if (dict){ - yon_dictionary_rip(dict); - return 1; - }else return 0; - } - return 0; -} - -/**yon_config_remove_by_data(void *data) - * [EN] - * - * [RU] - * Производит поиск по конфигу на наличие параметра со значением [data] и удаляет найденное значение из конфига. -*/ -int yon_config_remove_by_data(void *data){ - check_config{ - dictionary *dict = NULL; - for_dictionaries(dict,__yon__config__strings){ - if (dict->data==data){ - yon_dictionary_rip(dict); - return 1; - } - } - return 0; - } - return 0; -} - -/**yon_config_remove_element(char *key, char *deleted) - * [EN] - * - * [RU] - * Удаляет элемент [deleted] из массива параметров с ключом [key] -*/ -int yon_config_remove_element(char *key, char *deleted){ - check_config{ - dictionary *dict = yon_dictionary_get(&__yon__config__strings,key); - char *data = (char*)dict->data; - char *found = strstr(data,deleted); - int size=strlen(data)-strlen(found)+1; - char *new_data = malloc(size); - memset(new_data,0,size); - if (strlen(found)!=strlen(deleted)){ - memcpy(new_data,data,size-1); - new_data = yon_char_append(new_data,found+strlen(deleted)+1); - } else { - memcpy(new_data,data,size-2); - new_data = yon_char_append(new_data,found+strlen(deleted)); - } - dict->data=(void*)(new_data); - free(data); - dict->flag1=1; - return 1; - } else return 0; -} - -/**yon_config_get_by_key(char *key) - * [EN] - * - * [RU] - * Возвращает значение параметра конфига с ключом [key] -*/ -void *yon_config_get_by_key(char *key){ - check_config{ - dictionary *dict = NULL; - for_dictionaries(dict, __yon__config__strings){ - if (strcmp(dict->key,key)==0){ - return dict->data; - } - } - } - return NULL; -} - -/**yon_config_get_key_by_data(char *data) - * [EN] - * - * [RU] - * Возвращает ключ параметра конфига со значением [data]. - * Если параметр с таким значением не найден, возвращается NULL -*/ -char *yon_config_get_key_by_data(char *data){ - check_config{ - dictionary *dict = NULL; - for_dictionaries(dict, __yon__config__strings){ - if (strcmp(((char*)dict->data),data)==0){ - return dict->key; - } - } - } - return NULL; -} - -/**yon_config_set(char *key, void *data) - * [EN] - * - * [RU] - * Производит поиск по конфигу и заменяет значение параметра с ключом [key] на новое значение [data]; -*/ -int yon_config_set(char *key, void *data){ - check_config{ - dictionary *dict = yon_dictionary_get(&__yon__config__strings,key); - dict->data=data; - return 1; - } else return 0; -} - -/**yon_config_clean() - * [EN] - * Erase all parameters from config; - * [RU] - * Удаляет все параметры из конфига; -*/ -int yon_config_clean(){ - check_config{ - __yon__config__strings = yon_dictionary_free_all(__yon__config__strings, NULL); - return 1; - } - else return 0; -} - -/**yon_config_register(char *key, void *data) - * [EN] - * - * [RU] - * Регистрирует новый параметр конфига. - * [key] - ключ параметра; - * [data] - значение параметра; -*/ -void yon_config_register(char *key, void *data){ - yon_dictionary_add_or_create_if_exists_with_data(__yon__config__strings,key,data); - __yon__config__strings->data_type=DICTIONARY_CHAR_TYPE; -} - -/**yon_config_load(char *command, int *str_len) - * [EN] - * - * [RU] - * Выполняет команду [command] и возвращает распаршеный результат выполнения команды. - * В [str_len] возвращается длина возвращаемого массива -*/ -config_str yon_config_load(char *command, int *str_len){ - FILE *output = popen(command, "r"); - char **output_strings = NULL; - output_strings = malloc(sizeof(char)); - int i = 0; - char str[4096]; - memset(str, 0, 4096); - while (fgets(str, 4096, output)) - { - if (strcmp(str, "") != 0) - { - output_strings = realloc(output_strings, sizeof(char *) * (i + 1)); - // printf("%s\n", str); - output_strings[i] = NULL; - output_strings[i] = yon_char_new(str); - memset(str, 0, 4096); - i++; - } - } - if (i>0){ - *str_len = i; - return output_strings; - } else{ - *str_len=-1; - return NULL; - } -} - -/**int yon_config_save(char *command) - * [EN] - * Saves config with [command] - * [RU] - * Выполняет команду [command], добавляя в конец все записи конфига в таком виде: - * [ПАРАМЕТР1]="[значения1]" [ПАРАМЕТР2]="[значения2]" -*/ -int yon_config_save_registered(char *command){ - check_config{ - dictionary *dict = NULL; - for_dictionaries(dict,__yon__config__strings){ - command = yon_char_unite(command, " ", yon_dictionary_get_data(dict,char*), NULL); - } - if (popen(command, "r")) return 1; - else return 0; - } else return 0; -} - -/**yon_config_get_all(int *size) - * [EN] - * - * [RU] - * Возвращает массив со всеми параметрами конфига, оканчивающаяся NULL - * [size] - указатель, в который выгружается длина массива -*/ -config_str yon_config_get_all(int *size){ - check_config{ - *size = 1; - config_str conf = NULL; - dictionary *dict = NULL; - for_dictionaries(dict,__yon__config__strings){ - conf = yon_remalloc(conf,sizeof(char*)*(*size)); - conf[(*size)-1] = yon_char_unite(dict->key,"=",(char*)dict->data,NULL); - size++; - } - conf = yon_remalloc(conf,sizeof(char*)*(*size+1)); - conf[*size] = NULL; - return conf; - } else return NULL; -} - -/**char *yon_config_get_parameter(config parameters, int size, char *param) - * [EN] - * Gets parameter [param] from parameter list [parameters] of size [size]; - * or NULL if nothing were found - * [RU] - * Возвращает параметр [param] из массива строк [parameters] размером [size] - * или NULL если такой не был найден -*/ -char *yon_config_get_parameter(config_str parameters, int size, char *param) -{ - if (param[0]==' ') - yon_char_divide_search(param," ",-1); - param=yon_char_divide_search(yon_char_new(param)," ",-1); - - char *str = NULL; - for (int j = 0; j < size; j++) - { - char *name = yon_char_divide_search(yon_char_new(parameters[j]), "=", 1); - if (name) - { - if (strcmp(name, param) == 0) - { - str = yon_char_divide_search(yon_char_new(parameters[j]), "\n", 1); - if (strcmp(str, "") != 0 && strcmp(str, "(null)") != 0) - return str; - else - return NULL; - } - } - } - return NULL; -} - - - -// terminal-using functions - -/**yon_launch_app_with_arguments(char *name, char *args) - * [EN] - * Execute [command] in separate thread; - * [RU] - * Выполнить команду [command] в отдельном потоке; -*/ -int yon_launch_app_with_arguments(char *name, char *args) -{ - char *path = yon_char_unite("/usr/bin/", name, " ", args,NULL); - pthread_t thread_id; - char *command = NULL; - command = path; - pthread_create(&thread_id, NULL, (void *)yon_launch, command); -}; - -/**yon_launch(char *command) - * [EN] - * Execute command [command] - * [RU] - * Выполнить команду [command] -*/ -void yon_launch(char *command) -{ - system(command); -} - -// Gtk functions - - -#ifdef __GTK_H__ - - -static render_data render; - -#ifdef VTE_TERMINAL - -static void child_ready(VteTerminal *terminal, GPid pid, GError *error, gpointer user_data) -{ - 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_launch(GtkWidget *place_to_show, void *endwork_function, void* endwork_function_argument) - * [EN] - * launches terminal with specific [command], - * terminal is shown in [place_to_show] container, - * after terminal done its work [endwork_function] is called with [endwork_function_argument] argument. - * [RU] - * Запускает терминал с командой [command], - * терминал добавляется в контейнер [place_to_show] виджета, - * после завершения работы терминала вызывается функция [endwork_function] с аргументом [endwork_function_argument]. -*/ -void yon_terminal_integrated_launch(GtkWidget *place_to_show, 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; - GtkWidget *terminal = vte_terminal_new(); - 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); - 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) - 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); - } - -/**yon_terminal_integrated_start(GtkWidget *terminal, char* command, void *endwork_function, void* endwork_function_argument) - * [EN] - * launches terminal with specific [command], - * terminal is shown in [place_to_show] container, - * after terminal done its work [endwork_function] is called with [endwork_function_argument] argument. - * [RU] - * Запускает терминал с командой [command], - * терминал добавляется в контейнер [place_to_show] виджета, - * после завершения работы терминала вызывается функция [endwork_function] с аргументом [endwork_function_argument]. -*/ -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("tput cup 0 0 && tput ed; ",command," ; sleep 5;exit 0","\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); - } -#endif - - // Window config functions - - #define check_window_config_setup if(__yon_window_config_target_window) - - struct { - int x; - int y; - int width; - 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; - - void yon_window_config_save(){ - g_key_file_set_integer(__yon_window_config_file,"window","WindowPosX",__yon_main_window_config.x); - g_key_file_set_integer(__yon_window_config_file,"window","WindowPosY",__yon_main_window_config.y); - g_key_file_set_integer(__yon_window_config_file,"window","WindowWidth",__yon_main_window_config.width); - g_key_file_set_integer(__yon_window_config_file,"window","WindowHeight",__yon_main_window_config.height); - g_key_file_set_integer(__yon_window_config_file,"window","fullscreen",__yon_main_window_config.fullscreen); - g_key_file_save_to_file(__yon_window_config_file,__yon_window_config_path,NULL); - } - - 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); - } - - /**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(); - yon_window_config_save(); - } - gtk_main_quit(); - } - - void __yon_window_config_on_resize(){ - int max=0; - max=gtk_window_is_maximized(__yon_window_config_target_window); - if(max==0){ - gtk_window_get_size(__yon_window_config_target_window,&__yon_main_window_config.width,&__yon_main_window_config.height); - gtk_window_get_position(__yon_window_config_target_window,&__yon_main_window_config.x,&__yon_main_window_config.y); - } - } - - /**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(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){ - g_usleep(G_USEC_PER_SEC/10); - 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); - if (!g_key_file_load_from_file(__yon_window_config_file,__yon_window_config_path,G_KEY_FILE_NONE,NULL)){ - struct stat st; - int size; - config_str conf = yon_char_parse(yon_char_new(__yon_window_config_path),&size,"/"); - char *path = yon_char_unite(conf[0],"/",conf[1],"/",conf[2],"/",conf[3],"/",conf[4],"/",NULL); - if (stat(path, &st) == -1) { - mkdir(path, 0777); - } - FILE *fp; - fp=fopen(__yon_window_config_path,"w"); - fclose(fp); - g_key_file_load_from_file(__yon_window_config_file,__yon_window_config_path,G_KEY_FILE_NONE,NULL); - } - __yon_main_window_config.x = g_key_file_get_integer(__yon_window_config_file,"window","WindowPosX",NULL); - __yon_main_window_config.y = g_key_file_get_integer(__yon_window_config_file,"window","WindowPosY",NULL); - __yon_main_window_config.width = g_key_file_get_integer(__yon_window_config_file,"window","WindowWidth",NULL); - __yon_main_window_config.height = g_key_file_get_integer(__yon_window_config_file,"window","WindowHeight",NULL); - __yon_main_window_config.fullscreen = g_key_file_get_integer(__yon_window_config_file,"window","fullscreen",NULL); - if (__yon_main_window_config.width==0) __yon_main_window_config.width=800; - if (__yon_main_window_config.height==0) __yon_main_window_config.height=600; - gtk_window_resize(__yon_window_config_target_window,__yon_main_window_config.width,__yon_main_window_config.height); - gtk_window_move(__yon_window_config_target_window,__yon_main_window_config.x,__yon_main_window_config.y); - pthread_t tid; - pthread_create(&tid,NULL,(void *)_yon_maximize,NULL); - return 1; - } - - void yon_window_config_apply(){ - dictionary *dict=NULL; - gtk_window_move(__yon_window_config_target_window,__yon_main_window_config.x,__yon_main_window_config.y); - 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;imessage); - g_error_free(err); - } - if (type == BACKGROUND_IMAGE_SUCCESS_TYPE||! type) - { - gtk_style_context_remove_class(gtk_widget_get_style_context(data.box), "boxInfoMessError"); - gtk_style_context_add_class(gtk_widget_get_style_context(data.box), "boxInfoMessOK"); - gtk_image_set_from_pixbuf(GTK_IMAGE(data.icon), gtk_icon_theme_load_icon_for_scale(ictheme, "com.ublinux.ubl-settings-video.checked", 25, 1, GTK_ICON_LOOKUP_FORCE_SIZE, &err)); - } - else if (type == BACKGROUND_IMAGE_FAIL_TYPE) - { - gtk_style_context_remove_class(gtk_widget_get_style_context(data.box), "boxInfoMessOK"); - gtk_style_context_add_class(gtk_widget_get_style_context(data.box), "boxInfoMessError"); - gtk_image_set_from_pixbuf(GTK_IMAGE(data.icon), gtk_icon_theme_load_icon_for_scale(ictheme, "com.ublinux.ubl-settings-video.warning", 25, 1, GTK_ICON_LOOKUP_FORCE_SIZE, &err)); - } - if (text) - gtk_label_set_text(GTK_LABEL(data.label), text); -} - -void yon_ubl_status_box_render(char *text, BACKGROUND_IMAGE_TYPE type){ - _yon_ubl_status_box_render(text,type); -} - -/**yon_ubl_setup_sockets(GtkWidget *main_window, GtkWidget *left_window, GtkWidget *right_window, int socket_main_id, int socket_left_id, int socket_right_id) - * [EN] - * Set up plugs for using with GtkSockets insine ubl-settings-manager. - * [main_window] is container widget, which holds main application functionality. - * [left_window] is container widget, which holds widgets, have to be shown at left part of ubl-settings-manager header. - * [right_window] is container widget, which holds widgets, have to be shown at right part of ubl-settings-manager header. - * [socket_main_id] is id of socket for [main_window]. - * [socket_left_id] is id of socket for [left_window]. - * [socket_right_id] is id of socket for [right_window]. - * [RU] - * Настраивает плаги для работы с сокетами в утилите ubl-settings-manager. - * [main_window] - контейнер основного интерфейса приложения. - * [left_window] - контейнер для виджетов которые должны отображаться в левой части шапки ubl-settings-manager. - * [right_window] - контейнер для виджетов которые должны отображаться в правой части шапки ubl-settings-manager. - * [socket_main_id] - id сокета для [main_window]. - * [socket_left_id] - id сокета для [left_window]. - * [socket_right_id] - id сокета для [right_window]. -*/ -void yon_ubl_setup_sockets(GtkWidget *main_window, GtkWidget *left_window, GtkWidget *right_window, int socket_main_id, int socket_left_id, int socket_right_id){ - if (main_window&&socket_main_id>-1){ - gtk_widget_hide(gtk_widget_get_toplevel(main_window)); - GtkWidget *plug_main=gtk_plug_new(socket_main_id); - GtkWidget *plug_left=NULL; - GtkWidget *plug_right=NULL; - GtkWidget *box=NULL; - g_signal_connect(G_OBJECT(plug_main), "destroy", G_CALLBACK(gtk_main_quit),NULL); - if (socket_left_id>-1&&left_window){ - plug_left=gtk_plug_new(socket_left_id); - g_object_ref(left_window); - gtk_container_remove(GTK_CONTAINER(gtk_widget_get_parent(left_window)),left_window); - gtk_container_add(GTK_CONTAINER(plug_left),left_window); - gtk_style_context_add_class(gtk_widget_get_style_context(plug_left),"primary-toolbar"); - gtk_style_context_add_class(gtk_widget_get_style_context(left_window),"button"); - gtk_style_context_add_class(gtk_widget_get_style_context(left_window),"opacited"); - gtk_style_context_add_class(gtk_widget_get_style_context(left_window),"color"); - gtk_style_context_add_class(gtk_widget_get_style_context(plug_left),"noborder"); - gtk_widget_show(plug_left); - } - else if (left_window){ - if (box==NULL){ - box=gtk_box_new(GTK_ORIENTATION_HORIZONTAL,5); - gtk_box_pack_start(GTK_BOX(main_window),box,0,0,5); - gtk_box_reorder_child(GTK_BOX(main_window),box,0); - gtk_widget_show(box); - } - gtk_style_context_add_class(gtk_widget_get_style_context(left_window),"inherited"); - gtk_container_remove(GTK_CONTAINER(gtk_widget_get_parent(left_window)),left_window); - gtk_box_pack_end(GTK_BOX(box),left_window,0,0,5); - } - if (socket_right_id>-1&&right_window){ - plug_right=gtk_plug_new(socket_right_id); - g_object_ref(right_window); - gtk_container_remove(GTK_CONTAINER(gtk_widget_get_parent(right_window)),right_window); - gtk_container_add(GTK_CONTAINER(plug_right),right_window); - gtk_style_context_add_class(gtk_widget_get_style_context(plug_right),"primary-toolbar"); - gtk_style_context_add_class(gtk_widget_get_style_context(right_window),"button"); - gtk_style_context_add_class(gtk_widget_get_style_context(right_window),"opacited"); - gtk_style_context_add_class(gtk_widget_get_style_context(right_window),"color"); - gtk_style_context_add_class(gtk_widget_get_style_context(plug_right),"noborder"); - gtk_widget_show(plug_right); - } - else if (right_window){ - if (box==NULL){ - box=gtk_box_new(GTK_ORIENTATION_HORIZONTAL,5); - gtk_box_pack_start(GTK_BOX(main_window),box,0,0,5); - gtk_box_reorder_child(GTK_BOX(main_window),box,0); - gtk_widget_show(box); - } - gtk_style_context_add_class(gtk_widget_get_style_context(right_window),"inherited"); - gtk_container_remove(GTK_CONTAINER(gtk_widget_get_parent(right_window)),right_window); - gtk_box_pack_start(GTK_BOX(box),right_window,0,0,5); - } - g_object_ref(main_window); - gtk_container_remove(GTK_CONTAINER(gtk_widget_get_parent(main_window)),main_window); - gtk_container_add(GTK_CONTAINER(plug_main),main_window); - gtk_widget_show(plug_main); - } -} - -#ifdef WEBKIT_FOUND - -/**yon_ubl_browser_window_open(char *link, char *browser_window_name) - * [EN] - * Launches integrated browser window, named [browser_window_name] at header with [link]. - * [RU] - * Открывает встроенный браузер с именем [browser_window_name] и показываемой страницей по ссылке [link] -*/ -void yon_ubl_browser_window_open(char *link, char *browser_window_name){ - GtkWidget *browser=gtk_window_new(GTK_WINDOW_TOPLEVEL); - GtkWidget *web_place=gtk_box_new(GTK_ORIENTATION_VERTICAL,0); - GtkWidget *header=gtk_header_bar_new(); - GtkWidget *header_label=gtk_label_new(browser_window_name); - GtkWidget *WebView=webkit_web_view_new(); - gtk_container_add(GTK_CONTAINER(browser),web_place); - gtk_window_set_titlebar(GTK_WINDOW(browser),header); - gtk_window_set_title(GTK_WINDOW(browser),browser_window_name); - gtk_widget_set_size_request(browser,800,600); - gtk_header_bar_set_custom_title(GTK_HEADER_BAR(header),header_label); - gtk_header_bar_set_show_close_button(GTK_HEADER_BAR(header),1); - webkit_web_view_load_uri(WEBKIT_WEB_VIEW(WebView),link); - gtk_box_pack_start(GTK_BOX(web_place),WebView,1,1,0); - gtk_widget_show_all(browser); -} -#else - -/**yon_ubl_browser_window_open(char *link, char *browser_window_name) - * [EN] - * Launches browser with [link]. - * [browser_window_name] is't used. It's needed for compatibility with webkit version of that function. - * [RU] - * Открывает браузер со страницей по ссылке [link] - * [browser_window_name] не используется. Нужна для совместимости с webkit версией этой функции. -*/ -void yon_ubl_browser_window_open(char *link, char *browser_window_name){ - char *user=getenv("SUDO_USER"); - if (!user) - user=getlogin(); - char *command=yon_char_unite("sudo -u ",user," xdg-open ", link,NULL); - yon_launch_app(command); -} -#endif - -#endif \ No newline at end of file diff --git a/source/ubl-utils.h b/source/ubl-utils.h deleted file mode 100644 index a1c2ead..0000000 --- a/source/ubl-utils.h +++ /dev/null @@ -1,343 +0,0 @@ -#ifndef UBL_UTILS -#define UBL_UTILS -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "../compile/ubl-cmake.h" -#ifdef WEBKIT_FOUND - #include -#endif -#define DesktopPath "/usr/share/applications/" - -#define for_dictionaries(obj, obj1) for (obj = obj1->first; obj != NULL; obj = obj->next) - -#define new(type) malloc(sizeof(type)) -#define new_arr(type,size) malloc(sizeof(type)*size) - - -typedef enum -{ - #ifdef __GTK_H__ - DICTIONARY_GTK_WIDGETS_TYPE, - #endif - DICTIONARY_OTHER_TYPE=0, - DICTIONARY_CHAR_TYPE, - DICTIONARY_INT_TYPE, - DICTIONARY_BOOL_TYPE, - -} DICT_TYPE; - -typedef struct dictionary -{ - char *key; - void *data; - struct dictionary *next; - struct dictionary *prev; - struct dictionary *first; - DICT_TYPE data_type; - int flag1; -} dictionary; - -typedef struct apps -{ - char *Name; - int Type; - char *Categories; - char *Exec; - char *Icon; - int Pluggable; - int DualPluggable; -} apps; - -typedef char** config_str; - -static dictionary *__yon__config__strings = NULL; -#define check_config if(__yon__config__strings&&__yon__config__strings->data_type==DICTIONARY_CHAR_TYPE) - -#define config(key) yon_config_get_by_key(key) - -#define for_config dictionary temp = NULL; for_dictionary(temp,__yon__config__strings) - -#define yon_remalloc(pointer, size) (!pointer) ? malloc(size) : realloc(pointer, size) -// dictionary functions - -/**yon_dictionary_get_data(dictionary, type) - * [EN] - * Gets data from dictionary. - * [dictionary] is dictionary, from which data should be extracted; - * [type] is type of data, [dictionary] contains. - * [RU] - * Возвращает данные из словаря. - * [dictionary] - словарь из которого достаются данные. - * [type] - тип данных, хранящихся в словаре [dictionary]. -*/ -#define yon_dictionary_get_data(dictionary, type) ((type)dictionary->data) - -/**yon_dictionary_add_or_create_if_exists_with_data(dict,key,data) - * [EN] - * - * [RU] - * Добавляет элемент словаря в конец словаря [dict] c ключом [key] и данными [data]. - * Если словарь не существует, создаёт его -*/ -#define yon_dictionary_add_or_create_if_exists_with_data(dict,key,data) {if (!dict) dict=yon_dictionary_new_with_data(key,data); \ - else dict=yon_dictionary_append_with_data(dict,key,data);} - -dictionary *yon_dictionary_new(); - -dictionary *yon_dictionary_append(dictionary *targetdict); - -dictionary *yon_dictionary_get_last(dictionary *dict); - -dictionary *yon_dictionary_swap(dictionary *dict, int aim); - -void yon_dictionary_make_first(dictionary *dict); - -void yon_dictionary_make_nth(dictionary *dict, int nth); - -dictionary *yon_dictionary_new_with_data(char *key, void *data); - -dictionary *yon_dictionary_append_with_data(dictionary *dict, char *key, void *data); - -dictionary *yon_dictionary_connect(dictionary *old, dictionary *toconnect); - -dictionary *yon_dictionary_get(dictionary **dict, char *key); - -dictionary *yon_dictionary_rip(dictionary *dict); - -dictionary *yon_dictionary_get_nth(dictionary *dict, int place); - -void *yon_dictionary_free_all(dictionary *dictionary,void (data_manipulation)(void*)); - -// char functions - -char *yon_char_append(char *source, char *append); - -char *yon_char_new(char *chr); - -char *yon_char_unite(char *source, ...); - -char *yon_cut(char *source, int size, int startpos); - -char *yon_char_divide(char *source, int dividepos); - -char *yon_char_divide_search(char *source, char *dividepos, int delete_divider); - -char *yon_char_from_int(int int_to_convert); - -char *yon_char_replace(char *source, char *find, char*replace); - -char **yon_char_parse(char *parameters, int *size, char *divider); - -char **yon_char_parsed_rip(char **char_string, int *size, int item_to_delete); - -int yon_char_parsed_check_exist(char **parameters, int size, char *param); - -int yon_char_find_count(char *source, char *find); - -int yon_char_parsed_includes_char_parsed (config_str source, config_str to_check, int source_size, int check_size); - -config_str yon_char_parsed_new (int *size, ...); - -void yon_char_parsed_copy(config_str *source, config_str *to_copy); - -config_str yon_char_parsed_append(config_str parsed, int *size, char *string); - -int yon_ubl_check_root(); - -char *yon_ubl_root_user_get(); - -// parsing functions - -config_str philos_list_user(int* size); - -apps *yon_apps_scan_and_parse_desktops(int *sizef); - -void yon_apps_sort(apps *applist, int size); - -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_registered(char *command); - -char *yon_config_get_parameter(config_str parameters, int size, char *param); - -int yon_config_load_register(char *command); - -int yon_config_remove_by_key(char *key); - -int yon_config_remove_by_data(void *data); - -int yon_config_remove_element(char *key, char *deleted); - -void *yon_config_get_by_key(char *key); - -char *yon_config_get_key_by_data(char *data); - -int yon_config_set(char *key, void *data); - -int yon_config_clean(); - -void yon_config_register(char *key, void *data); - -config_str yon_config_get_all(); - -// terminal-using functions - -int yon_launch_app_with_arguments(char *name, char *args); - -void yon_launch(char *command); - -// Gtk functions - -#ifdef __GTK_H__ -#ifdef VTE_TERMINAL -void yon_terminal_integrated_launch(GtkWidget *place_to_show, char* command, void *endwork_function, void* endwork_function_argument); - -void yon_terminal_integrated_start(GtkWidget *terminal, char* command, void *endwork_function, void* endwork_function_argument); - -#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]. - * [builder] is GtkBuilder*; - * [widget_name] is id of widget; -*/ -#define yon_gtk_builder_get_widget(builder, widget_name) GTK_WIDGET(gtk_builder_get_object(builder, widget_name)) - -typedef struct -{ - GtkWidget *Icon; - GtkWidget *Label; - GtkWidget *IconView; - GtkListStore *List; -} expander_icon_view; - -void yon_window_config_setup(GtkWindow *window); - -int yon_window_config_load(char *path); - -int yon_gtk_combo_box_fill(GtkWidget *combo, char **parameters,int size); - -int yon_gtk_combo_box_text_find(GtkWidget *combo_box, char *text_to_find); - -int yon_gtk_icon_view_hide_empty(dictionary *icon_view_segment); - -int yon_dictionary_gtk_pack_start_multiple_widgets(GtkBox *destination, gboolean expand, gboolean fill, int padding, ...); - -int yon_dictionary_gtk_pack_end_multiple_widgets(GtkBox *destination, gboolean expand, gboolean fill, int padding, ...); - - - -typedef enum -{ - BACKGROUND_IMAGE_SUCCESS_TYPE, - BACKGROUND_IMAGE_FAIL_TYPE -} BACKGROUND_IMAGE_TYPE; - -typedef struct { - BACKGROUND_IMAGE_TYPE type; - GtkWidget *icon; - GtkWidget *box; - GtkWidget *label; - char* text_to_render; -} render_data; - - -/**yon_ubl_status_box_setup(render,icon,box,label) - * [EN] - * Sets up [render] structure of type render_data. - * [icon] is GtkImage widget of status box for showing status icons; - * [box] is GtkBox widget of status box for showing status color; - * [label] is GtkLabel widget of status box for showing status text; - * [RU] - * Настраивает структуру [render] типа render_data. - * [icon] - виджет типа GtkIcon в котором будут отображаться статусные иконки; - * [box] - виджет типа GtkBox в котором будет отображаться цвет статуса; - * [label] - виджет типа GtkLabel в котором будет отображаться текст статусного сообщения; -*/ -int yon_ubl_status_box_setup(GtkWidget *icon, GtkWidget *box, GtkWidget *label); - -/**yon_ubl_status_box_render(render,text,type) - * [EN] - * Renders message in status box; - * [render] is render_data structure of status box; - * [text] is text to be shown in status box; - * [type] if type of message. Can be BACKGROUND_IMAGE_FAIL_TYPE or BACKGROUND_IMAGE_SUCCESS_TYPE - * [RU] - * Отображает сообщение в статусном окне. - * [render] - структура типа render_data для нужного статусного окна; - * [text] - текст, отображаемый в статусном окне; - * [type] - тип сообщения. Может быть: - * BACKGROUND_IMAGE_FAIL_TYPE (красный фон,иконка - восклицательный знак) - * или - * BACKGROUND_IMAGE_SUCCESS_TYPE (Жёлтный фон, иконка - галка) -*/ -void yon_ubl_status_box_render(char *text, BACKGROUND_IMAGE_TYPE type); - -#ifdef __cplusplus - -/**yon_ubl_header_setup(overlay, head, image, imag_path) - * [EN] - * Sets up header of app. - * [overlay] is overlay for app header; - * [head] is box of header, which connects to [overlay] - * [image] is header background image; - * [imag_path] is path of image, shown in [image] - * [RU] - * Настраивает заголовок приложения. - * [overlay] - оверлей заголовка приложения; - * [head] - шапка заголовка, присоединяемая к [overlay] - * [image] - виджет картинки для заднего фона; - * [imag_path] - путь до картинки, загружаемой в [image] -*/ -#define yon_ubl_header_setup(overlay, head, image, imag_path) _yon_ubl_header_setup(GTK_WIDGET(overlay.gobj()), GTK_WIDGET(head.gobj()), GTK_WIDGET(image.gobj()), (char *)imag_path) -#else - -/**yon_ubl_header_setup(overlay, head, image, imag_path) - * [EN] - * Sets up header of app. - * [overlay] is overlay for app header; - * [head] is box of header, which connects to [overlay] - * [image] is header background image; - * [imag_path] is path of image, shown in [image] - * [RU] - * Настраивает заголовок приложения. - * [overlay] - оверлей заголовка приложения; - * [head] - шапка заголовка, присоединяемая к [overlay] - * [image] - виджет картинки для заднего фона; - * [imag_path] - путь до картинки, загружаемой в [image] -*/ -#define yon_ubl_header_setup(overlay, head, image, imag_path) _yon_ubl_header_setup(GTK_WIDGET(overlay), GTK_WIDGET(head), GTK_WIDGET(image), (char *)imag_path) -#define yon_ubl_header_setup_resource(overlay, head, image, imag_path) _yon_ubl_header_setup_resource(GTK_WIDGET(overlay), GTK_WIDGET(head), GTK_WIDGET(image), (char *)imag_path) -#endif - -void _yon_ubl_header_setup(GtkWidget *Overlay, GtkWidget *Head, GtkWidget *Image, char *image_path); - -void _yon_ubl_header_setup_resource(GtkWidget *Overlay, GtkWidget *Head, GtkWidget *Image, char *image_path); - -void yon_ubl_setup_sockets(GtkWidget *main_window, GtkWidget *left_window, GtkWidget *right_window, int socket_main_id, int socket_left_id, int socket_right_id); -#ifdef WEBKIT_FOUND - -void yon_ubl_browser_window_open(char *link, char *browser_window_name); -#else -void yon_ubl_browser_window_open(char *link, char *browser_window_name); -#endif -#endif -#endif \ No newline at end of file diff --git a/ubl-settings-services-terminal.glade b/ubl-settings-services-terminal.glade index 0f2159d..9b04fcf 100644 --- a/ubl-settings-services-terminal.glade +++ b/ubl-settings-services-terminal.glade @@ -2,72 +2,91 @@ + - - True - False - emblem-synchronizing-symbolic + + 100 + 1 + 10 - + True False - process-stop-symbolic + com.ublinux.ubl-settings-services.sync-symbolic - - 500 - 350 + + 800 + 600 False True - 450 - -1 - dialog-question-symbolic + com.ublinux.ubl-settings-usergroups - + True False - 5 - 5 5 5 5 5 - vertical - 10 - - - + 5 True False - 30 + vertical - Update service status True True True - image8 + image1 - True + False True 0 + + + False + True + 0 + + + + + True + False + 5 - - Close + True + False True - True - image9 - + natural + adjustment1 + natural + UTF-8 + 0 + True + False + + + True + True + 0 + + + + + True + False + vertical + adjustment1 False @@ -77,16 +96,15 @@ - False + True True - end 1 - + True False True @@ -94,7 +112,7 @@ True False - Services and processes systemd + Services and processes - service information diff --git a/ubl-settings-services.css b/ubl-settings-services.css index 547dcda..88e8c57 100644 --- a/ubl-settings-services.css +++ b/ubl-settings-services.css @@ -46,24 +46,21 @@ background:transparent; border-left-width:inherit; border-right-width:inherit; } - .menuitemtop *{ + .menuitemtop>*{ margin:2px 2px 0 2px; - padding-top:2px; - padding-bottom:2px; + padding: 3px 10px 3px 5px; /* padding: 5px 0px 3px 5px; */ border:transparent; } - .menuitemmiddle *{ + .menuitemmiddle>*{ margin:0 2px 0 2px; - padding-top:2px; - padding-bottom:2px; + padding: 3px 10px 3px 5px; /* padding: 3px 0px 3px 5px; */ border:transparent; } - .menuitembottom *{ + .menuitembottom>*{ margin:0 2px 2px 2px; - padding-top:2px; - padding-bottom:2px; + padding: 3px 10px 3px 5px; /* padding: 3px 0px 5px 5px; */ } .menuitemtop:hover { @@ -87,26 +84,23 @@ background:transparent; border-right-width:inherit; } - .menuitemtop:hover* { + .menuitemtop:hover>* { margin:2px 2px 0 2px; - padding-top:2px; - padding-bottom:2px; + padding: 3px 10px 3px 5px; /* padding: 5px 0 3px 5px; */ background:@theme_selected_bg_color; border-radius:2px; } - .menuitemmiddle:hover* { + .menuitemmiddle:hover>* { margin:0 2px 0px 2px; - padding-top:2px; - padding-bottom:2px; + padding: 3px 10px 3px 5px; /* padding: 3px 0px 3px 5px; */ background:@theme_selected_bg_color; border-radius:2px; } - .menuitembottom:hover* { + .menuitembottom:hover>* { margin:0 2px 2px 2px; - padding-top:2px; - padding-bottom:2px; + padding: 3px 10px 3px 5px; /* padding: 3px 0px 5px 5px; */ background:@theme_selected_bg_color; border-radius:2px; diff --git a/ubl-settings-services.desktop b/ubl-settings-services.desktop index 8aa30d5..4f1484f 100644 --- a/ubl-settings-services.desktop +++ b/ubl-settings-services.desktop @@ -1,14 +1,14 @@ [Desktop Entry] Encoding=UTF-8 -Name=ubl-settings-services -Name[ru]=Службы и процессы systemd -GenericName=ubl-settings-services -GenericName[ru]=Службы и процессы systemd -Comment=ubl-settings-services -Comment[ru]=Настройка работы служб и процессов системы +Name=Services and processes systemd +Name[ru]=TEMPLATE +GenericName=ubl-settings-TEMPLATE +GenericName[ru]=TEMPLATE +Comment=System vervices and processes configuration +Comment[ru]=Приложение для TEMPLATE Type=Application -Exec=pkexec ubl-settings-services -Icon=com.ublinux.ubl-settings-services +Exec=pkexec ubl-settings-TEMPLATE +Icon=com.ublinux.ubl-settings-TEMPLATE Terminal=false X-XfcePluggable=true X-UBLPluggable=true diff --git a/ubl-settings-services.glade b/ubl-settings-services.glade index c92d200..aacf304 100644 --- a/ubl-settings-services.glade +++ b/ubl-settings-services.glade @@ -1,946 +1,162 @@ - + - - - - - False - False - True - center - com.ublinux.ubl-settings-services - dialog - True - ubl-settings-services - 1.1 - Copyright © 2022 - 2023, UBSoft LLC - Services and processes systemd - https://wiki.ublinux.ru/ru/Программное_обеспечение/Программы_и_утилиты/Все/ubl-settings-services - Project Home Page - Это приложение распространяется без каких-либо гарантий. -Подробнее в <a href="https://www.gnu.org/licenses/old-licenses/gpl-2.0.html">GNU General Public License, версии 2 или позднее</a>. - UBGroup - UBGroup - com.ublinux.ubl-settings-services - True - gpl-2-0 - - - True - False - vertical - 2 - - - False - end - - - False - False - 1 - - - - - - - True - False - True - - - True - False - 5 - 5 - 5 - 5 - 2 - Services and processes systemd - - - - - - - - - - True - False - 5 - 5 - 5 - 5 - vertical - - - True - False - 27 - Configuration in config file - 0 - - - False - True - 0 - - - - - True - True - True - - - True - False - 5 - - - True - False - media-playback-start-symbolic - - - False - True - 0 - - - - - True - False - Autostart - - - False - True - 1 - - - - - - - - False - True - 1 - - - - - True - True - True - - - True - False - 5 - - - True - False - media-playback-stop-symbolic - - - False - True - 0 - - - - - True - False - Autostop - - - False - True - 1 - - - - - - - - False - True - 2 - - - - - True - True - True - - - True - False - 5 - - - True - False - process-stop-symbolic - - - False - True - 0 - - - - - True - False - Block - - - False - True - 1 - - - - - - - - False - True - 3 - - - - - True - False - 27 - Configuration in system - 0 - - - False - True - 4 - - - - - True - True - True - - - True - False - 5 - - - True - False - media-playback-start-symbolic - - - False - True - 0 - - - - - True - False - Autostart - - - False - True - 1 - - - - - - - - False - True - 5 - - - - - True - True - True - - - True - False - 5 - - - True - False - emoji-flags-symbolic - - - False - True - 0 - - - - - True - False - Launched - - - False - True - 1 - - - - - - - - False - True - 6 - - - - - True - True - True - - - True - False - 5 - - - True - False - emblem-synchronizing-symbolic - - - False - True - 0 - - - - - True - False - Service configuration reload - - - False - True - 1 - - - - - - - - False - True - 7 - - - - - True - True - True - - - True - False - 5 - - - True - False - dialog-information-symbolic - - - False - True - 0 - - - - - True - False - Status - - - False - True - 1 - - - - - - - - False - True - 8 - - - - - + True False - center - - - True - False - 5 - 5 - 5 - 5 - 6 - 6 - 64 - com.ublinux.ubl-settings-services - - - False - True - 0 - - - - - True - False - - - True - False - - - True - False - center - vertical - - - 255 - True - False - end - Services and processes systemd - 0 - - - - - - - - True - True - 0 - - - - - 255 - True - False - start - System services and processes configuration - 0 - - - - - - - - True - True - 1 - - - - - False - True - 0 - - - - - True - True - 0 - - - - - True - True - 1 - - + com.ublinux.ubl-settings-services.play-symbolic - + True False + com.ublinux.ubl-settings-services.stop-symbolic - - 100 - 1 - 10 - - + True False - emblem-synchronizing-symbolic + com.ublinux.ubl-settings-services.cancel-uncolored-symbolic - + True False - process-stop-symbolic + com.ublinux.ubl-settings-services.launch-symbolic - + True False - emblem-ok-symbolic + com.ublinux.ubl-settings-services.check-symbolic - - False - False - 450 - dialog-question-symbolic - - - True - False - 5 - 5 - 5 - 5 - vertical - 10 - - - True - False - - - True - False - start - 20 - 20 - dialog-question-symbolic - 6 - - - False - True - 0 - - - - - True - False - vertical - - - True - False - start - 10 - 5 - Would you like to read documentation in the Web? - True - 0 - - - - - - - False - True - 0 - - - - - True - False - start - start - 10 - 10 - You will be redirected to documentation website where documentation is -translated and supported by community. - True - 0 - - - - False - True - 1 - - - - - Always redirect to online documentation - True - True - False - end - True - - - - False - True - end - 2 - - - - - - True - True - 1 - - - - - - True - True - 0 - - - - - True - False - 30 - True - - - Cancel - True - True - True - image8 - - - - True - True - 0 - - - - - Open documentation - True - True - True - image9 - - - - True - True - 1 - - - - - False - True - 1 - - - - - - - True - False - True - - - True - False - Services and processes systemd - - - - - - - - - - - - - - - - - - - - - - - - - - - - - True - False - False - - - True - False - Load global configuration - - - - - - True - False - Load local configuration - - - + + True + False - + True False - False - False - + True False - False - - - True - False - Save configuration - - - - - - True - False - Save to global configuration - - - - - - True - False - Save to local configuration - - - + com.ublinux.ubl-settings-services.sync-symbolic + + + + + + + + + + + + + + + + + + + + + + + - - 800 - 600 + + True False - 800 - 600 - com.ublinux.ubl-settings-services + vertical - + True False - vertical + 0.019999999552965164 + in - + True False - vertical - - - True - False - - - True - False - 5 - 5 - 5 - 5 - 5 - 5 - 25 - - - False - True - 0 - - - - - True - False - start - 5 - 5 - 5 - 5 - 6 - 6 - True - - - - - - - False - True - 1 - - - - - False - True - 0 - - + 5 + 5 + 5 - + True False vertical + 5 - - 81 + True False + 5 + + + True + False + 0 + + All services + System services only + User services only + + + + True + True + 0 + + - + True False - start + 0 + + All + Services + Sockets + Autolaunch in configuration + Stopped in configuration + Blocked in configuration + + + + True + True + 1 + + + + + True + True + edit-find-symbolic + False + False + + + True + True + 2 + + + + + True + True + True + image8 + - -1 + False + True + 3 @@ -950,119 +166,178 @@ translated and supported by community. 0 - - - False - True - 1 - - - - - True - False - 5 - 5 - 5 - 5 - 5 - 5 - True - True - vertical - + True False - 0 - in + 5 + + + True + False + vertical + 5 + + + True + True + True + Toggle autostart at configuration + image1 + + + + False + True + 0 + + + + + True + True + True + Toggle autostop at configuration + image2 + + + + False + True + 1 + + + + + True + True + True + Toggle service blocking at configuration + image3 + + + + False + True + 2 + + + + + True + True + True + Toggle autostart at system + image4 + + + + False + True + 3 + + + + + True + True + True + Launch service + image5 + + + + False + True + 4 + + + + + True + True + True + image6 + + + + False + True + 5 + + + + + True + True + True + image7 + + + + False + True + 6 + + + + + False + True + 0 + + - + True False - 5 - 5 - 5 - 5 + 0 + in True False vertical - 5 - + True - False - 5 - - - True - False - 0 - - All services - System services only - User services only - - - - True - True - 0 - + True + liststore1 + vertical + + - - True - False - 0 - - All - Services - Sockets - Automatic launch - Stopped in configuration - Blocked in configuration - + + fixed + Configure in configuration - - True - True - 1 - - - True - True - 40 - edit-find-symbolic - False - False - name + + fixed + Confugure in system - - True - True - 2 - - - True - True - True - image1 - + + autosize + Service - - False - True - 4 - @@ -1072,372 +347,97 @@ translated and supported by community. - + True - False - vertical - 5 + True - + True - False + True + liststore2 + 5 + vertical + + + - - True - False - vertical + + True + fixed + Autostart - - 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 - + + + 0 + + + + + + True + fixed + Autostop - - 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 - + + + 1 + - - True - True - 0 - - - - True - True - 0 - - - - - True - False - 5 - 5 - vertical - 10 - - True - False - 5 + + True + fixed + Block - - True - False - Service: - 0 - - - False - True - 0 - + + + 2 + + + + + + True + fixed + Autostart - - True - False - 0 - - - False - True - 1 - + + + 3 + - - False - True - 0 - - - True - False - 5 + + True + fixed + Launched - - True - False - Description: - 0 - - - False - True - 0 - + + + 4 + + + + + + autosize + - - True - False - 0 - - - False - True - 1 - + + + 5 + - - False - True - 1 - - - False - True - 2 - @@ -1448,92 +448,57 @@ translated and supported by community. + + + - - - - True - False - Services - + + True + True + 1 + True True - 0 + 1 - - - False - True - 2 - - - - - True - True - 0 - - - - - - - True - False - True - - - True - False - 5 - 5 - 5 - 5 - 2 - Services and processes systemd - - - - - - - - True - False - 5 - 5 - 5 - 5 - 6 - 6 - 32 - com.ublinux.ubl-settings-services - - - - - True - False - - - True - True - False - True - menu3 True False + vertical + 5 - + True False - Save + 5 + + + True + False + Service: + + + False + True + 0 + + + + + True + False + + + False + True + 1 + + False @@ -1542,10 +507,34 @@ translated and supported by community. - + True False - pan-down-symbolic + 5 + + + True + False + Description + + + False + True + 0 + + + + + True + False + True + + + False + True + 1 + + False @@ -1554,106 +543,29 @@ translated and supported by community. + + False + True + 2 + - - False - True - 0 - - - - - True - True - True - False - True - True - menu2 - none - - - - - - - False - True - 1 - - - end - 1 - - - + + True False - - - True - True - False - True - menu1 - - - True - False - - - True - False - Load - - - False - True - 0 - - - - - True - False - pan-down-symbolic - - - False - True - 1 - - - - - - - False - True - 0 - - + Services - - 2 - - + + True + True + 0 + - - - - - - diff --git a/ubl-settings-services.pot b/ubl-settings-services.pot index 79dc696..dd28a6a 100644 --- a/ubl-settings-services.pot +++ b/ubl-settings-services.pot @@ -1,12 +1,12 @@ -# Language translations for ubl-settings-services package. +# Language translations for ubl-settings-TEMPLATE package. # Copyright (C) 2022, UBTech LLC -# This file is distributed under the same license as the ubl-settings-services package. +# This file is distributed under the same license as the ubl-settings-TEMPLATE package. # UBLinux Team , 2022 # #, fuzzy msgid "" msgstr "" -"Project-Id-Version: ubl-settings-services 1.0\n" +"Project-Id-Version: ubl-settings-TEMPLATE 1.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-05-22 16:12+0600\n" "PO-Revision-Date: \n" @@ -22,11 +22,7 @@ msgid "Version:" msgstr "" #: source/ubl-strings.h:2 -msgid "ubl-settings-services version:" -msgstr "" - -#: source/ubl-strings.h:2 source/ubl-strings.h:4 -msgid "Services and processes systemd" +msgid "ubl-settings-TEMPLATE version:" msgstr "" #: source/ubl-strings.h:2 @@ -69,8 +65,16 @@ msgstr "" msgid "Lock global configration loading" msgstr "" +#: source/ubl-strings.h:2 +msgid "Clear application configuration" +msgstr "" + +#: source/ubl-strings.h:4 +msgid "ubl-settings-TEMPLATE" +msgstr "" + #: source/ubl-strings.h:5 -msgid "System services and processes configuration" +msgid "TEMPLATE configuration" msgstr "" #: source/ubl-strings.h:7 @@ -78,169 +82,105 @@ msgid "Operation succeeded" msgstr "" #: source/ubl-strings.h:8 +msgid "Nothing were chosen" +msgstr "" + +#: source/ubl-strings.h:9 msgid "" "Warning! Application was launched without root - root-dependent actions are " "locked" msgstr "" -#: source/ubl-strings.h:10 +#: source/ubl-strings.h:11 msgid "About" msgstr "" -#: source/ubl-strings.h:11 +#: source/ubl-strings.h:12 msgid "Documentation" msgstr "" -#: source/ubl-strings.h:13 +#: source/ubl-strings.h:14 msgid "Save to local configuration" msgstr "" -#: source/ubl-strings.h:14 +#: source/ubl-strings.h:15 msgid "Save to global configuration" msgstr "" -#: source/ubl-strings.h:15 -msgid "Save configuration" +#: source/ubl-strings.h:16 +msgid "Save to global and local configuration" msgstr "" -#: source/ubl-strings.h:16 +#: source/ubl-strings.h:17 msgid "Save" msgstr "" -#: source/ubl-strings.h:18 +#: source/ubl-strings.h:19 msgid "Load local configuration" msgstr "" -#: source/ubl-strings.h:19 +#: source/ubl-strings.h:20 msgid "Load global configuration" msgstr "" -#: source/ubl-strings.h:20 +#: source/ubl-strings.h:21 msgid "Load" msgstr "" -#: source/ubl-strings.h:22 +#: source/ubl-strings.h:23 msgid "Cancel" msgstr "" #: source/ubl-strings.h:24 -msgid "Would you like to read documentation in the Web?" +msgid "Close" msgstr "" #: source/ubl-strings.h:25 -msgid "" -"You will be redirected to documentation website where documentation is\n" -"translated and supported by community." -msgstr "" - -#: source/ubl-strings.h:26 -msgid "Always redirect to online documentation" +msgid "Apply" msgstr "" #: source/ubl-strings.h:27 -msgid "Open documentation" +msgid "Would you like to read documentation in the Web?" msgstr "" #: source/ubl-strings.h:28 -msgid "Project Home Page" +msgid "" +"You will be redirected to documentation website, where documentation is\n" +"translated and supported by community." msgstr "" #: source/ubl-strings.h:29 -msgid "Nothing were chosen" +msgid "Always redirect to online documentation" msgstr "" -#: source/ubl-strings.h:32 -msgid "Global configuration loading succseeded." +#: source/ubl-strings.h:30 +msgid "Open documentation" +msgstr "" + +#: source/ubl-strings.h:31 +msgid "Project Home Page" msgstr "" #: source/ubl-strings.h:33 -msgid "Local configuration loading succseeded." +msgid "Global configuration loading succeeded." msgstr "" #: source/ubl-strings.h:34 -msgid "Config loading failed" +msgid "Local configuration loading succeeded." msgstr "" -#: source/ubl-strings.h:36 -msgid "Local and global configuration saving succseeded." +#: source/ubl-strings.h:35 +msgid "Config loading failed" msgstr "" #: source/ubl-strings.h:37 -msgid "Global configuration saving succseeded." +msgid "Local and global configuration saving succeeded." msgstr "" #: source/ubl-strings.h:38 -msgid "Local configuration saving succseeded." -msgstr "" - -#: source/ubl-strings.h:40 source/ubl-strings.h:43 -msgid "Autostart" -msgstr "" - -#: source/ubl-strings.h:41 -msgid "Autostop" -msgstr "" - -#: source/ubl-strings.h:42 -msgid "Block" -msgstr "" - -#: source/ubl-strings.h:44 -msgid "Launched" -msgstr "" - -#: source/ubl-strings.h:45 -msgid "Service" -msgstr "" - -#: source/ubl-strings.h:46 -msgid "Configuration in config file" -msgstr "" - -#: source/ubl-strings.h:47 -msgid "Configuration in system" -msgstr "" - -#: source/ubl-strings.h:49 -msgid "All" -msgstr "" - -#: source/ubl-strings.h:50 -msgid "Services" -msgstr "" - -#: source/ubl-strings.h:51 -msgid "Sockets" -msgstr "" - -#: source/ubl-strings.h:52 -msgid "Automatic launch" -msgstr "" - -#: source/ubl-strings.h:53 -msgid "Stopped in configuration" -msgstr "" - -#: source/ubl-strings.h:54 -msgid "Blocked in configuration" -msgstr "" - -#: source/ubl-strings.h:55 -msgid "All services" -msgstr "" - -#: source/ubl-strings.h:56 -msgid "System services only" -msgstr "" - -#: source/ubl-strings.h:57 -msgid "User services only" -msgstr "" - -#: source/ubl-strings.h:59 -msgid "Service configuration reload" +msgid "Global configuration saving succeeded." msgstr "" -#: source/ubl-strings.h:60 -msgid "Status" +#: source/ubl-strings.h:39 +msgid "Local configuration saving succeeded." msgstr "" diff --git a/ubl-settings-services_ru.po b/ubl-settings-services_ru.po index 4ee6544..b7051a1 100644 --- a/ubl-settings-services_ru.po +++ b/ubl-settings-services_ru.po @@ -1,12 +1,12 @@ -# Russian translations for ubl-settings-services package. +# Russian translations for ubl-settings-TEMPLATE package. # Copyright (C) 2022, UBTech LLC -# This file is distributed under the same license as the ubl-settings-services package. +# This file is distributed under the same license as the ubl-settings-TEMPLATE package. # UBLinux Team , 2022 # #, fuzzy msgid "" msgstr "" -"Project-Id-Version: ubl-settings-services 1.0\n" +"Project-Id-Version: ubl-settings-TEMPLATE 1.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-05-22 16:12+0600\n" "PO-Revision-Date: 2023-01-01 00:00+0600\n" @@ -22,12 +22,8 @@ msgid "Version:" msgstr "Версия:" #: source/ubl-strings.h:2 -msgid "ubl-settings-services version:" -msgstr "Версия ubl-settings-services: " - -#: source/ubl-strings.h:2 source/ubl-strings.h:4 -msgid "Services and processes systemd" -msgstr "Службы и процессы systemd" +msgid "ubl-settings-TEMPLATE version:" +msgstr "Версия ubl-settings-TEMPLATE: " #: source/ubl-strings.h:2 msgid "Usage:" @@ -69,15 +65,27 @@ msgstr "Блокировка сохранения глобальной конф msgid "Lock global configration loading" msgstr "Блокировка загрузки глобальной конфигурации" +#: source/ubl-strings.h:2 +msgid "Clear application configuration" +msgstr "Удалить конфигурацию приложения" + +#: source/ubl-strings.h:4 +msgid "ubl-settings-TEMPLATE" +msgstr "Настройки TEMPLATE" + #: source/ubl-strings.h:5 -msgid "System services and processes configuration" -msgstr "Настройка работы служб и процессов системы" +msgid "TEMPLATE configuration" +msgstr "Настройки TEMPLATE" #: source/ubl-strings.h:7 msgid "Operation succeeded" msgstr "Операция завершена" #: source/ubl-strings.h:8 +msgid "Nothing were chosen" +msgstr "Ничего не было выбрано" + +#: source/ubl-strings.h:9 msgid "" "Warning! Application was launched without root - root-dependent actions are " "locked" @@ -85,166 +93,98 @@ msgstr "" "Внимание! Приложение было запущено без прав суперпользователя - действия, " "требующие их наличия заблокированы" -#: source/ubl-strings.h:10 +#: source/ubl-strings.h:11 msgid "About" msgstr "О программе" -#: source/ubl-strings.h:11 +#: source/ubl-strings.h:12 msgid "Documentation" msgstr "Справка" -#: source/ubl-strings.h:13 +#: source/ubl-strings.h:14 msgid "Save to local configuration" msgstr "Сохранить в локальную конфигурацию" -#: source/ubl-strings.h:14 +#: source/ubl-strings.h:15 msgid "Save to global configuration" msgstr "Сохранить в глобальную конфигурацию" -#: source/ubl-strings.h:15 -msgid "Save configuration" -msgstr "Сохранить конфигурацию" - #: source/ubl-strings.h:16 +msgid "Save to global and local configuration" +msgstr "Сохранить в глобальную и локальную конфигурацию" + +#: source/ubl-strings.h:17 msgid "Save" msgstr "Сохранить" -#: source/ubl-strings.h:18 +#: source/ubl-strings.h:19 msgid "Load local configuration" -msgstr "Загрузить локальную конфигуруцию" +msgstr "Загрузить локальную конфигурацию" -#: source/ubl-strings.h:19 +#: source/ubl-strings.h:20 msgid "Load global configuration" msgstr "Загрузить глобальную конфигурацию" -#: source/ubl-strings.h:20 +#: source/ubl-strings.h:21 msgid "Load" msgstr "Загрузить" -#: source/ubl-strings.h:22 +#: source/ubl-strings.h:23 msgid "Cancel" msgstr "Отмена" #: source/ubl-strings.h:24 +msgid "Close" +msgstr "Закрыть" + +#: source/ubl-strings.h:25 +msgid "Apply" +msgstr "Применить" + +#: source/ubl-strings.h:27 msgid "Would you like to read documentation in the Web?" msgstr "Вы хотите прочитать справку в Сети?" -#: source/ubl-strings.h:25 +#: source/ubl-strings.h:28 msgid "" -"You will be redirected to documentation website where documentation is\n" +"You will be redirected to documentation website, where documentation is\n" "translated and supported by community." msgstr "" -"Вы будете перенаправлены на сайт с документацией где страницы помощи\n" +"Вы будете перенаправлены на сайт с документацией, где страницы помощи\n" "переводятся и поддерживаются сообществом." -#: source/ubl-strings.h:26 +#: source/ubl-strings.h:29 msgid "Always redirect to online documentation" msgstr "Всегда перенаправлять" -#: source/ubl-strings.h:27 +#: source/ubl-strings.h:30 msgid "Open documentation" msgstr "Прочитать справку" -#: source/ubl-strings.h:28 +#: source/ubl-strings.h:31 msgid "Project Home Page" msgstr "Домашняя страница проекта" -#: source/ubl-strings.h:29 -msgid "Nothing were chosen" -msgstr "Ничего не было выбрано" - -#: source/ubl-strings.h:32 -msgid "Global configuration loading succseeded." +#: source/ubl-strings.h:33 +msgid "Global configuration loading succeeded." msgstr "Успешно загружена глобальная конфигурация" -#: source/ubl-strings.h:33 -msgid "Local configuration loading succseeded." +#: source/ubl-strings.h:34 +msgid "Local configuration loading succeeded." msgstr "Успешно загружена локальная конфигурация" -#: source/ubl-strings.h:34 +#: source/ubl-strings.h:35 msgid "Config loading failed" -msgstr "" - -#: source/ubl-strings.h:36 -msgid "Local and global configuration saving succseeded." -msgstr "Успешно записаны локальная и глобальная конфигурация" +msgstr "Ошибка загрузки конфигурации" #: source/ubl-strings.h:37 -msgid "Global configuration saving succseeded." -msgstr "Успешно записана глобальная конфигурация" +msgid "Local and global configuration saving succeeded." +msgstr "Успешно записаны локальная и глобальная конфигурация" #: source/ubl-strings.h:38 -msgid "Local configuration saving succseeded." -msgstr "Успешно записана локальная конфигурация" - -#: source/ubl-strings.h:40 source/ubl-strings.h:43 -msgid "Autostart" -msgstr "Автостарт" - -#: source/ubl-strings.h:41 -msgid "Autostop" -msgstr "Автостоп" - -#: source/ubl-strings.h:42 -msgid "Block" -msgstr "Блокировать" - -#: source/ubl-strings.h:44 -msgid "Launched" -msgstr "Запущена" - -#: source/ubl-strings.h:45 -msgid "Service" -msgstr "Сервис" - -#: source/ubl-strings.h:46 -msgid "Configuration in config file" -msgstr "Настройка в конфигурации" - -#: source/ubl-strings.h:47 -msgid "Configuration in system" -msgstr "Настройка в системе" - -#: source/ubl-strings.h:49 -msgid "All" -msgstr "Все" - -#: source/ubl-strings.h:50 -msgid "Services" -msgstr "Сервисы" - -#: source/ubl-strings.h:51 -msgid "Sockets" -msgstr "Сокеты" - -#: source/ubl-strings.h:52 -msgid "Automatic launch" -msgstr "Автозапуск в конфигурации" - -#: source/ubl-strings.h:53 -msgid "Stopped in configuration" -msgstr "Остановленные в конфигурации" - -#: source/ubl-strings.h:54 -msgid "Blocked in configuration" -msgstr "Заблокированые в конфигурации" - -#: source/ubl-strings.h:55 -msgid "All services" -msgstr "Все сервисы" - -#: source/ubl-strings.h:56 -msgid "System services only" -msgstr "Только системные сервисы" - -#: source/ubl-strings.h:57 -msgid "User services only" -msgstr "Только сервисы пользователя" - -#: source/ubl-strings.h:59 -msgid "Service configuration reload" -msgstr "Перезагрузка конфигурации сервиса" +msgid "Global configuration saving succeeded." +msgstr "Успешно записана глобальная конфигурация" -#: source/ubl-strings.h:60 -msgid "Status" -msgstr "Статус" +#: source/ubl-strings.h:39 +msgid "Local configuration saving succeeded." +msgstr "Успешно записана локальная конфигурация" \ No newline at end of file