From 80905f58067784e7ccbb9192c29228e7f6082157 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Fri, 23 Jun 2023 14:33:36 +0600 Subject: [PATCH] Version 1.0 --- .gitignore | 9 + Makefile | 167 + README.md | 27 + com.ublinux.ubl-settings-services.checked.svg | 327 ++ com.ublinux.ubl-settings-services.policy | 24 + com.ublinux.ubl-settings-services.svg | 4957 +++++++++++++++++ com.ublinux.ubl-settings-services.warning.svg | 55 + gresource.xml | 12 + source/CMakeLists.txt | 96 + source/ubl-cmake.in | 1 + source/ubl-settings-services.c | 306 + source/ubl-settings-services.h | 102 + source/ubl-strings.h | 60 + source/ubl-utils.c | 1639 ++++++ source/ubl-utils.h | 339 ++ ubl-settings-services | Bin 0 -> 236632 bytes ubl-settings-services-banner.png | Bin 0 -> 33872 bytes ubl-settings-services.css | 130 + ubl-settings-services.desktop | 15 + ubl-settings-services.glade | 1588 ++++++ ubl-settings-services.pot | 246 + ubl-settings-services_ru.po | 250 + 22 files changed, 10350 insertions(+) create mode 100644 .gitignore create mode 100644 Makefile create mode 100644 com.ublinux.ubl-settings-services.checked.svg create mode 100644 com.ublinux.ubl-settings-services.policy create mode 100644 com.ublinux.ubl-settings-services.svg create mode 100644 com.ublinux.ubl-settings-services.warning.svg create mode 100644 gresource.xml create mode 100644 source/CMakeLists.txt create mode 100644 source/ubl-cmake.in create mode 100644 source/ubl-settings-services.c create mode 100644 source/ubl-settings-services.h create mode 100644 source/ubl-strings.h create mode 100644 source/ubl-utils.c create mode 100644 source/ubl-utils.h create mode 100755 ubl-settings-services create mode 100644 ubl-settings-services-banner.png create mode 100644 ubl-settings-services.css create mode 100644 ubl-settings-services.desktop create mode 100644 ubl-settings-services.glade create mode 100644 ubl-settings-services.pot create mode 100644 ubl-settings-services_ru.po diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ed27715 --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +.vscode/ +ubl-settings-TEMPLATE +*~ +build/ +compile/ +*# +terminal-commands/ +source/ubl-cmake.h +vgcore* \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..406ca3d --- /dev/null +++ b/Makefile @@ -0,0 +1,167 @@ +#!/usr/bin/make -f + +#SHELL := /bin/bash +MAKEFILE_FILEPATH := $(abspath $(lastword $(MAKEFILE_LIST))) +MAKEFILE_DIR := $(notdir $(patsubst %/,%,$(dir $(MAKEFILE_FILEPATH)))) +MAKEFILE_PATH := $(dir $(MAKEFILE_FILEPATH)) + +CMAKE_COMMAND = cmake +CMAKE_SOURCE_DIR = $(MAKEFILE_PATH)source +CMAKE_BUILD_DIR = $(MAKEFILE_PATH)compile +#CMAKE_SOURCE_DIR = ./source +#CMAKE_BUILD_DIR = ./compile +DEPENDS = /bin/cmake +PREFIX ?= /usr +PKGNAME = $(MAKEFILE_DIR) +#PKGNAME = ubl-settings-manager +LATEST_TAG= +default_target: all + +.PHONY: all init depend debug prepare check build uninstall install clean help + +all: init build + +init: + @echo "Initialize ..."; \ + if [ -d ".git" ]; then \ + LATEST_TAG=$$(git describe --tags | sed 's/^v//'|grep -oE "^[0-9]{1,}.[0-9]{1,}"); \ + else \ + LATEST_TAG="0.0"; \ + fi; \ + sed -r "s/^(string version_application).*/\1=\"$${LATEST_TAG}\";/" -i source/${PKGNAME}.h; \ + echo "-- Build path: ${CMAKE_BUILD_DIR}" + +depend: + @echo "Check depends ..." + @for FILE_DEPEND in $(DEPENDS); do \ + if [ ! -f $${FILE_DEPEND} ]; then \ + echo "ERROR: Depend '$${FILE_DEPEND}' not found !"; \ + exit 1; \ + fi; \ + done; \ + echo "Check depends: OK" +# $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 + +debug: init build + @echo "Debug ..."; \ + if [ ! -d ${CMAKE_BUILD_DIR} ]; then \ + $(CMAKE_COMMAND) -S${CMAKE_SOURCE_DIR} -B${CMAKE_BUILD_DIR} -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX="${PREFIX}"; \ + fi; \ + echo "${CMAKE_BUILD_DIR}/${PKGNAME}"; \ + cp ${CMAKE_BUILD_DIR}/${PKGNAME} ./; \ + echo "Debug: OK" + +prepare: + @echo "Prepare ..."; \ + if [ ! -d ${CMAKE_BUILD_DIR} ]; then \ + $(CMAKE_COMMAND) -S${CMAKE_SOURCE_DIR} -B${CMAKE_BUILD_DIR} -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX="${PREFIX}"; \ + fi; \ + echo "Prepare: OK" + +check: + @echo "Check ..."; \ + if [ -f ${CMAKE_BUILD_DIR}/${PKGNAME} ]; then \ + echo "Check: OK"; \ + else \ + echo "Check: ${CMAKE_BUILD_DIR}/${PKGNAME} not found !"; \ + exit 1; \ + fi + +build: depend prepare + @echo "Build ..."; \ + make --directory=${CMAKE_BUILD_DIR}; \ + echo "Build: OK" + +uninstall: + @echo "Uninstall ..." + @for FILE_PO in $(wildcard *.po); do \ + LANG=$${FILE_PO##*_};LANG=$${LANG%.*}; \ + FILE_MO=$${FILE_PO##*/}; FILE_MO="$${FILE_MO%_*.po}.mo"; \ + PATH_FILE_MO="${DESTDIR}${PREFIX}/share/locale/$${LANG}/LC_MESSAGES/$${FILE_MO}"; \ + $(RM) "$${PATH_FILE_MO}"; \ + done + @for SIZE in 16x16 32x32 48x48 scalable; do \ + $(RM) "${DESTDIR}${PREFIX}/share/icons/hicolor/$${SIZE}/apps/com.ublinux.${PKGNAME}.svg"; \ + $(RM) "${DESTDIR}${PREFIX}/share/icons/hicolor/$${SIZE}/apps/com.ublinux.${PKGNAME}.png"; \ + done + @for FILE_SVG in $(wildcard *.svg); do \ + for SIZE in 16x16 32x32 48x48 scalable; do \ + $(RM) "${DESTDIR}${PREFIX}/share/icons/hicolor/$${SIZE}/status/$${FILE_SVG%.*}".{svg,png,jpg}; \ + done; \ + done + @$(RM) "${DESTDIR}${PREFIX}/bin/${PKGNAME}" + @$(RM) "${DESTDIR}${PREFIX}/share/applications/${PKGNAME}.desktop" + @$(RM) "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/apps/com.ublinux.${PKGNAME}.svg" + @$(RM) "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/apps/com.ublinux.${PKGNAME}.checked.svg" + @$(RM) "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/apps/com.ublinux.${PKGNAME}.warning.svg" + @$(RM) "${DESTDIR}${PREFIX}/share/polkit-1/actions/com.ublinux.${PKGNAME}.policy" + @if [ -z ${DESTDIR} ]; then \ + [ -d "${DESTDIR}${PREFIX}/share/icons/hicolor/" ] && gtk-update-icon-cache -fiq "${DESTDIR}${PREFIX}/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; \ + fi + @echo "Uninstall: OK" + +install: check uninstall + @echo "Install ..." +#################################################### УДАЛИТЬ ПЕРЕД КОММИТОМ ################################################################################ + @gcc source/ubl-cmake.h compile/resources.c compile/ubl-cmake.h source/ubl-settings-services.c source/ubl-settings-services.h source/ubl-strings.h source/ubl-utils.c source/ubl-utils.h -o ubl-settings-services `pkg-config --cflags --libs gtk+-3.0 vte-2.91 webkit2gtk-4.0 webkit2gtk-web-extension-4.0` -g +#################################################### УДАЛИТЬ ПЕРЕД КОММИТОМ ################################################################################ + @for FILE_PO in $(wildcard *.po); do \ + LANG=$${FILE_PO##*_};LANG=$${LANG%.*}; \ + install -dm755 "${DESTDIR}${PREFIX}/share/locale/$${LANG}/LC_MESSAGES"; \ + FILE_MO=$${FILE_PO##*/}; FILE_MO="$${FILE_MO%_*.po}.mo"; \ + PATH_FILE_MO="${DESTDIR}${PREFIX}/share/locale/$${LANG}/LC_MESSAGES/$${FILE_MO}"; \ + echo "$${FILE_PO}"; \ + msgfmt "$${FILE_PO}" -v -f -o "$${PATH_FILE_MO}"; \ + done + @for SIZE in 16 32 48; do \ + install -dm755 "${DESTDIR}${PREFIX}/share/icons/hicolor/$${SIZE}x$${SIZE}/apps"; \ + rsvg-convert -w $${SIZE} -h $${SIZE} -f svg --keep-image-data "com.ublinux.${PKGNAME}.svg" -o "${DESTDIR}${PREFIX}/share/icons/hicolor/$${SIZE}x$${SIZE}/apps/com.ublinux.${PKGNAME}.svg"; \ + done + @install -dm755 "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/apps" + @install -Dm644 -t "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/apps/" "com.ublinux.${PKGNAME}.svg" + @install -dm755 "${DESTDIR}${PREFIX}/share/polkit-1/actions" + @install -Dm644 -t "${DESTDIR}${PREFIX}/share/polkit-1/actions/" "com.ublinux.${PKGNAME}.policy" + @install -Dm755 -t "${DESTDIR}${PREFIX}/bin/" "${CMAKE_BUILD_DIR}/${PKGNAME}" + @install -dm755 "${DESTDIR}/etc/xdg" + @install -dm755 "${DESTDIR}${PREFIX}/share/applications" + @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" + @if [ -z ${DESTDIR} ]; then \ + [ -d "${DESTDIR}${PREFIX}/share/icons/hicolor/" ] && gtk-update-icon-cache -fiq "${DESTDIR}${PREFIX}/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; \ + fi + @echo "Install: OK" + @sed -r "s/^(string version_application=\"*\").*/string version_application;/" -i source/${PKGNAME}.h; \ + +clean: + @echo "Clean ..." + @$(RM) -rd ${CMAKE_BUILD_DIR} + @if [ -d ${CMAKE_BUILD_DIR} ]; then \ + echo "Clean: error, compile directory exist ${CMAKE_BUILD_DIR}"; \ + else \ + echo "Clean: OK"; \ + fi + +up_ver: + @CURRENT=$$(grep 'VERSION' ${FILE_VERSION} | cut -d" " -f2); \ + MAJOR=$$(cut -d. -f1 <<< $${CURRENT}); \ + MINOR=$$(cut -d. -f2 <<< $${CURRENT}); \ + VER="$${MAJOR}.$$(($${MINOR}+1))"; \ + sed "s/VERSION *[[:digit:]]*.*/VERSION $${VER}/" -i ${FILE_VERSION}; \ + echo "Updated version to VERSION.md: $${CURRENT} to $${VER}" + +help: + @echo "The following are some of the valid targets for this Makefile:"; \ + echo "... all (the default if no target is provided)"; \ + echo "... init"; \ + echo "... debug"; \ + echo "... prepare"; \ + echo "... compile"; \ + echo "... install"; \ + echo "... uninstall"; \ + echo "... clean"; \ + echo "... up_ver" diff --git a/README.md b/README.md index b4c6122..642508d 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,29 @@ # ubl-settings-services +# Выполнить +# Build +In order to build ubl-settings-services you will need: + +- CMake +- C compiler +- GTK+ 3 & dependencies +- webkit2gtk (optional) + +Once you have all the necessary dependencies, you can use: +```sh +$ make +``` + +# Installation +After a successful build, just use: +```sh +$ sudo make install clean +``` + +# Uninstallation +After a successful build, just use: +```sh +$ sudo make uninstall +``` + +![alt text](screenshot/screenshot.png) diff --git a/com.ublinux.ubl-settings-services.checked.svg b/com.ublinux.ubl-settings-services.checked.svg new file mode 100644 index 0000000..e3cab42 --- /dev/null +++ b/com.ublinux.ubl-settings-services.checked.svg @@ -0,0 +1,327 @@ + + + + + + + + + + + + + + + + diff --git a/com.ublinux.ubl-settings-services.policy b/com.ublinux.ubl-settings-services.policy new file mode 100644 index 0000000..65d1fc1 --- /dev/null +++ b/com.ublinux.ubl-settings-services.policy @@ -0,0 +1,24 @@ + + + + + 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 + + auth_admin + auth_admin + auth_admin + + /usr/bin/ubl-settings-services + true + + + diff --git a/com.ublinux.ubl-settings-services.svg b/com.ublinux.ubl-settings-services.svg new file mode 100644 index 0000000..f636c26 --- /dev/null +++ b/com.ublinux.ubl-settings-services.svg @@ -0,0 +1,4957 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/com.ublinux.ubl-settings-services.warning.svg b/com.ublinux.ubl-settings-services.warning.svg new file mode 100644 index 0000000..9a90dba --- /dev/null +++ b/com.ublinux.ubl-settings-services.warning.svg @@ -0,0 +1,55 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/gresource.xml b/gresource.xml new file mode 100644 index 0000000..b5286dd --- /dev/null +++ b/gresource.xml @@ -0,0 +1,12 @@ + + + + ubl-settings-services.glade + + + ubl-settings-services.css + + + ubl-settings-services-banner.png + + \ No newline at end of file diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt new file mode 100644 index 0000000..2eea497 --- /dev/null +++ b/source/CMakeLists.txt @@ -0,0 +1,96 @@ +cmake_minimum_required(VERSION 3.7) +project(ubl-settings-services) + +find_package(PkgConfig REQUIRED) + +pkg_check_modules(GTK REQUIRED gtk+-3.0) +include_directories(${GTK_INCLUDE_DIRS}) +link_directories(${GTK_LIBRARY_DIRS}) +add_definitions(${GTK_CFLAGS_OTHER}) + +#pkg_check_modules(VTE291 REQUIRED vte-2.91) +#include_directories(${VTE291_INCLUDE_DIRS}) +#link_directories(${VTE291_LIBRARY_DIRS}) +#add_definitions(${VTE291_CFLAGS_OTHER}) + +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}) +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) + +find_program(GLIB_COMPILE_RESOURCES NAMES glib-compile-resources REQUIRED) +add_custom_target(GLADE ubl-settings-services.glade) + +set(DEPENDFILES + ../ubl-settings-services.glade + ../gresource.xml + ../ubl-settings-services-banner.png + ../ubl-settings-services.css + ) + +file(COPY ${DEPENDFILES} DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) + +add_custom_command( + OUTPUT ${GRESOURCE_C} + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} + COMMAND ${GLIB_COMPILE_RESOURCES} + ARGS + --generate-source + --target=${CMAKE_CURRENT_BINARY_DIR}/${GRESOURCE_C} + ${GRESOURCE_XML} + VERBATIM + MAIN_DEPENDENCY ${GRESOURCE_XML} + DEPENDS + ${GLADE} +) +add_custom_target( + dummy-resource + 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 \ + -O2 -pipe -fno-plt -fexceptions \ + -Wp,-D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security \ + -fstack-clash-protection -fcf-protection") + + +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) + + +add_executable(${PROJECT_NAME} ${SOURCE_FILES} ${CMAKE_CURRENT_BINARY_DIR}/${GRESOURCE_C}) +target_link_libraries(${PROJECT_NAME} PUBLIC ${LIBRARIES}) +target_include_directories(${PROJECT_NAME} PUBLIC ${PROJECT_BINARY_DIR}) +set_source_files_properties( + ${CMAKE_CURRENT_BINARY_DIR}/${GRESOURCE_C} + PROPERTIES GENERATED TRUE +) +install(TARGETS ${PROJECT_NAME} DESTINATION bin) +add_dependencies(${PROJECT_NAME} dummy-resource) \ No newline at end of file diff --git a/source/ubl-cmake.in b/source/ubl-cmake.in new file mode 100644 index 0000000..d4623a7 --- /dev/null +++ b/source/ubl-cmake.in @@ -0,0 +1 @@ +#cmakedefine WEBKIT_FOUND diff --git a/source/ubl-settings-services.c b/source/ubl-settings-services.c new file mode 100644 index 0000000..1ac46e5 --- /dev/null +++ b/source/ubl-settings-services.c @@ -0,0 +1,306 @@ +#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); + } +} + +/**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 yon_load_proceed(char *command){ + if (yon_config_load_register(command)) + 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 on_context_menu_open(GtkTreeView *self,GtkTreePath* path, GtkTreeViewColumn* column, main_window *widgets){ + printf("ghserth\n"); + GtkWidget *menu = widgets->RMBMenu; + gtk_menu_popup_at_pointer(GTK_MENU(menu),NULL); + // gdk_window_get_device_position(gtk_widget_get_window(widgets->MainTree),mouse,&x,&y,NULL); + // gtk_popover_popup(GTK_POPOVER(widgets->ActionsPopover)); + // gtk_widget_show(widgets->ActionsPopover); + // GdkRectangle rect; + // rect.x=x; + // rect.y=y; + // gtk_popover_set_pointing_to(GTK_POPOVER(widgets->ActionsPopover),&rect); +} + + +// standard functions + +void config_init(){ + main_config.always_open_documentation=0; + main_config.win_height=0; + main_config.win_width=0; + main_config.win_pos_x=0; + main_config.win_pos_y=0; + main_config.socket_id=-1; + main_config.save_socket_id=-1; + main_config.load_socket_id=-1; + 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_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"); + + 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->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_gtk_builder_get_widget(builder,"DocumentationMenuItem"); + widgets->AboutMenuItem = 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"); + + + 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); + g_signal_connect(G_OBJECT(widgets->MainTree),"row-activated",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); + + + gtk_widget_show(widgets->Window); + return widgets; +} + +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); + 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); + gtk_main(); +} \ No newline at end of file diff --git a/source/ubl-settings-services.h b/source/ubl-settings-services.h new file mode 100644 index 0000000..95edd86 --- /dev/null +++ b/source/ubl-settings-services.h @@ -0,0 +1,102 @@ +#include +#include +#include "ubl-utils.h" +#include +#include +#include +#include +#include +#include +#include +#include "ubl-cmake.h" +#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 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 LocalePath "/usr/share/locale" +#define LocaleName "ubl-settings-services" +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; + + int socket_id; + int load_socket_id; + int save_socket_id; + + int lock_help; + int lock_save_local; + int lock_save_global; + int lock_load_global; +} config; + +typedef struct { + GtkWidget *Window; + GtkWidget *HatLabel; + GtkWidget *PlugBox; + + GtkWidget *HeadOverlay; + GtkWidget *HeadImage; + GtkWidget *HeadBox; + GtkWidget *HeadTitleLabel; + GtkWidget *HeadInfoLabel; + + GtkWidget *StatusBox; + GtkWidget *StatusIcon; + GtkWidget *StatusLabel; + + GtkWidget *SaveLabel; + GtkWidget *SaveMenuItem; + GtkWidget *SaveGlobalMenuItem; + GtkWidget *SaveLocalMenuItem; + GtkWidget *RightBox; + + GtkWidget *LoadLabel; + GtkWidget *LoadGlobalMenuItem; + GtkWidget *LoadLocalMenuItem; + GtkWidget *LeftBox; + + GtkWidget *DocumentationMenuItem; + GtkWidget *AboutMenuItem; + + GtkWidget *ActionsPopover; + + GtkWidget *FirstRowNamesTree; + GtkWidget *MainTree; + + GtkTreeViewColumn *ServiceTreeColumn; + GtkWidget *RMBMenu; +} main_window; + + +typedef struct { + GtkWidget *Window; + + GtkWidget *HatText; + GtkWidget *HeaderText; + GtkWidget *InfoText; + GtkWidget *AlwaysOpenCheck; + + GtkWidget *CloseButton; + GtkWidget *AcceptButton; +} documentation_confirmation_window; + + +main_window *setup_window(); \ No newline at end of file diff --git a/source/ubl-strings.h b/source/ubl-strings.h new file mode 100644 index 0000000..aaae50b --- /dev/null +++ b/source/ubl-strings.h @@ -0,0 +1,60 @@ +#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 TITLE_LABEL _("Services and processes systemd") +#define TITLE_INFO_LABEL _("System services and processes configuration") + +#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 AUTOSTART_LABEL _("Autostart") +#define AUTOSTOP_LABEL _("Autostop") +#define BLOCK_LABEL _("Block") +#define AUTOSTART_LABEL _("Autostart") +#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 diff --git a/source/ubl-utils.c b/source/ubl-utils.c new file mode 100644 index 0000000..6c652a4 --- /dev/null +++ b/source/ubl-utils.c @@ -0,0 +1,1639 @@ +#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_deep(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){ + dict->data=data; +} + +int yon_dictionary_set_key(dictionary *dict, char *key){ + dict->key=key; +} + +int yon_dictionary_set(dictionary *dict, char *key, void *data){ + dict->key=key; + dict->data=data; +} + +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; +} + +// char *yon_char_unite(char *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; +} + +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; + } +} + +/**[EN] + * char **yon_char_parse(char *parameters, int *size, char *divider) + * 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(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; +} + +/**[EN] + * int yon_config_save(char *command) + * Saves config with [command] + * [RU] + * Выполняет команду [command] +*/ +// int yon_config_save(char *command) +// { +// FILE *output = popen(command, "r"); +// return 1; +// } + +/**char *yon_config_get_parameter(config parameters, int size, char *param) + * [EN] + * Gets parameter [param] from parameter list [parameters] of size [size]; + * 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); + 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), 100); + 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); + if (__yon_main_window_config.fullscreen==0) + gtk_window_get_position(__yon_window_config_target_window,&__yon_main_window_config.x,&__yon_main_window_config.y); + } + + + 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); + } + } + + void yon_window_config_setup(GtkWindow *window){ + __yon_window_config_target_window = window; + g_signal_connect(G_OBJECT(__yon_window_config_target_window),"delete-event",G_CALLBACK(yon_on_configured_window_destroy),NULL); + g_signal_connect(G_OBJECT(__yon_window_config_target_window),"check-resize"/*"configure-event"*/,G_CALLBACK(__yon_window_config_on_resize),NULL); + // g_signal_connect(G_OBJECT(__yon_window_config_target_window),"configure_event",G_CALLBACK(__yon_window_config_on_resize),NULL); + } + + 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); + } + + 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); + } + +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 new file mode 100644 index 0000000..8bc463d --- /dev/null +++ b/source/ubl-utils.h @@ -0,0 +1,339 @@ +#ifndef UBL_UTILS +#define UBL_UTILS +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "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(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 + +/**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 b/ubl-settings-services new file mode 100755 index 0000000000000000000000000000000000000000..476b1c70a62bdd256818715de6d56bea55b60907 GIT binary patch literal 236632 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 z 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

FSi`8tJE|^W}p<-}BF2PT-)tYAM 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 { + border:none; + background:inherit; +} +.workingbg { + background:@theme_base_color; +} +.menuitembottom{ + margin-top:0px; + margin-bottom:3px; + border-color:inherit; + border-left-width:inherit; + border-right-width:inherit; + } + .menuitemmiddle{ + margin-top:0px; + margin-bottom:0px; + border-color:inherit; + border-left-width:inherit; + border-right-width:inherit; + } + + .menuitemtop{ + margin-bottom:0px; + border-color:inherit; + border-top-width:inherit; + border-left-width:inherit; + border-right-width:inherit; + } + .menuitemtop *{ + margin:2px 2px 0 2px; + padding: 5px 10px 3px 5px; + border:transparent; + } + .menuitemmiddle *{ + margin:0 2px 0 2px; + padding: 3px 10px 3px 5px; + border:transparent; + } + .menuitembottom *{ + margin:0 2px 2px 2px; + padding: 3px 10px 5px 5px; + } + .menuitemtop:hover { + background:@theme_bg_color; + border-color:inherit; + border-top-width:inherit; + border-left-width:inherit; + border-right-width:inherit; + } + .menuitemmiddle:hover { + background:@theme_bg_color; + border-color:inherit; + border-left-width:inherit; + border-right-width:inherit; + } + .menuitembottom:hover { + background:@theme_bg_color; + border-color:inherit; + border-bottom-width:0px; + border-left-width:inherit; + border-right-width:inherit; + + } + .menuitemtop:hover* { + margin:2px 2px 0 2px; + padding: 5px 10px 3px 5px; + background:@theme_selected_bg_color; + border-radius:2px; + } + .menuitemmiddle:hover* { + margin:0 2px 0 2px; + padding: 3px 10px 3px 5px; + background:@theme_selected_bg_color; + border-radius:2px; + } + .menuitembottom:hover* { + margin:0 2px 2px 2px; + padding: 3px 10px 5px 5px; + background:@theme_selected_bg_color; + border-radius:2px; + } + .boxInfoMessError{ + background-color: #ea9999; +} + +.boxInfoMessOK{ + background-color: #f3f0ac; +} +.sharpBorders *{ + border-radius: 0px; +} + +.lowborder{ + border-top:none; + border-left: none; + border-right:none; +} +.lowborder { + border-bottom: 1px; + border-style: solid; + border-color: inherit; +} +.nohover:hover { + background-color: transparent; + color:inherit; + border-right:inherit; + border-left:inherit; + padding-left: 4px; + /* border-top:inherit; */ +} \ No newline at end of file diff --git a/ubl-settings-services.desktop b/ubl-settings-services.desktop new file mode 100644 index 0000000..f7d9fb6 --- /dev/null +++ b/ubl-settings-services.desktop @@ -0,0 +1,15 @@ +[Desktop Entry] +Encoding=UTF-8 +Name=ubl-settings-services +Name[ru]=TEMPLATE +GenericName=ubl-settings-services +GenericName[ru]=TEMPLATE +Comment=ubl-settings-services +Comment[ru]=Приложение для TEMPLATE +Type=Application +Exec=pkexec ubl-settings-services +Icon=com.ublinux.ubl-settings-services +Terminal=false +X-XfcePluggable=true +X-UBLPluggable=true +Categories=XFCE;GTK;Settings;DesktopSettings;X-XFCE-SettingsDialog;X-XFCE-SystemSettings;X-UBL-SettingsManager;X-UBL-Personal-Settings; diff --git a/ubl-settings-services.glade b/ubl-settings-services.glade new file mode 100644 index 0000000..aebaf96 --- /dev/null +++ b/ubl-settings-services.glade @@ -0,0 +1,1588 @@ + + + + + + + + + + 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 + + + + + True + False + emblem-synchronizing-symbolic + + + True + False + emblem-synchronizing-symbolic + + + True + False + dialog-information-symbolic + + + True + False + media-playback-start-symbolic + + + True + False + media-playback-stop-symbolic + + + True + False + process-stop-symbolic + + + True + False + media-playback-start-symbolic + + + True + False + emoji-flags-symbolic + + + True + False + + + True + False + Configuration in config file + True + + + + + + Autostart + True + False + image2 + False + + + + + Autostop + True + False + image3 + False + + + + + Block + True + False + image4 + False + + + + + + True + False + Configuration in system + + + + + + Autostart + True + False + image6 + False + + + + + Launched + True + False + image7 + False + + + + + + Service configuration reload + True + False + image10 + False + + + + + Status + True + False + image11 + False + + + + + True + False + process-stop-symbolic + + + True + False + emblem-ok-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 + + + + + + + + + + + + + + + + + + + + + + + + + + False + False + False + False + False + gzsdrgasdrg + + + + + + True + False + False + + + True + False + Load global configuration + + + + + + True + False + Load local configuration + + + + + + True + False + False + False + + + True + False + Documentation + True + + + + + + True + False + About + + + + + + True + False + False + + + True + False + Save configuration + + + + + + True + False + Save to global configuration + + + + + + True + False + Save to local configuration + + + + + + 800 + 600 + False + 800 + 600 + com.ublinux.ubl-settings-services + + + True + False + vertical + + + 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 + + + + + True + False + vertical + + + 81 + True + False + + + True + False + start + + + -1 + + + + + False + True + 0 + + + + + False + True + 1 + + + + + True + False + 5 + 5 + 5 + 5 + 5 + 5 + True + True + vertical + + + True + False + vertical + 5 + + + True + False + 5 + + + True + False + 0 + + All services + System services only + User services only + + + + True + True + 0 + + + + + True + False + 0 + + All + Services + Sockets + Automatic launch + Stopped in configuration + Blocked in configuration + + + + True + True + 1 + + + + + True + True + 40 + edit-find-symbolic + False + False + name + + + True + True + 2 + + + + + True + True + True + image1 + + + + False + True + 4 + + + + + False + True + 0 + + + + + True + False + vertical + + + True + True + start + start + liststore2 + + + + + + 270 + Configuration in config file + + + + + 180 + Configuration in system + + + + + + False + True + 0 + + + + + True + True + True + liststore1 + 5 + True + vertical + True + + + + + + fixed + 90 + Autostart + + + + 0 + + + + + + + fixed + 90 + Autostop + + + + 1 + + + + + + + fixed + 90 + Block + + + + 2 + + + + + + + fixed + 90 + Autostart + + + + 3 + + + + + + + fixed + 90 + Launched + + + + 4 + + + + + + + fixed + Service + 5 + + + + 5 + + + + + + + True + True + 1 + + + + + True + False + 5 + 5 + vertical + 10 + + + True + False + 0 + + + False + True + 0 + + + + + True + False + 0 + + + False + True + 1 + + + + + False + True + 2 + + + + + + True + True + 1 + + + + + True + True + 0 + + + + + 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 + + + True + False + Save + + + False + True + 0 + + + + + True + False + pan-down-symbolic + + + False + True + 1 + + + + + + + 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 + + + + + 2 + + + + + + + diff --git a/ubl-settings-services.pot b/ubl-settings-services.pot new file mode 100644 index 0000000..79dc696 --- /dev/null +++ b/ubl-settings-services.pot @@ -0,0 +1,246 @@ +# Language translations for ubl-settings-services package. +# Copyright (C) 2022, UBTech LLC +# This file is distributed under the same license as the ubl-settings-services package. +# UBLinux Team , 2022 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: ubl-settings-services 1.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-05-22 16:12+0600\n" +"PO-Revision-Date: \n" +"Last-Translator: \n" +"Language-Team: \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: source/ubl-strings.h:1 +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" +msgstr "" + +#: source/ubl-strings.h:2 +msgid "Usage:" +msgstr "" + +#: source/ubl-strings.h:2 +msgid "[OPTIONS]" +msgstr "" + +#: source/ubl-strings.h:2 +msgid "Options:" +msgstr "" + +#: source/ubl-strings.h:2 +msgid "Show this help" +msgstr "" + +#: source/ubl-strings.h:2 +msgid "Show package version" +msgstr "" + +#: source/ubl-strings.h:2 +msgid "Lock this help menu" +msgstr "" + +#: source/ubl-strings.h:2 +msgid "Lock configuration saving" +msgstr "" + +#: source/ubl-strings.h:2 +msgid "Lock local configration saving" +msgstr "" + +#: source/ubl-strings.h:2 +msgid "Lock global configration saving" +msgstr "" + +#: source/ubl-strings.h:2 +msgid "Lock global configration loading" +msgstr "" + +#: source/ubl-strings.h:5 +msgid "System services and processes configuration" +msgstr "" + +#: source/ubl-strings.h:7 +msgid "Operation succeeded" +msgstr "" + +#: source/ubl-strings.h:8 +msgid "" +"Warning! Application was launched without root - root-dependent actions are " +"locked" +msgstr "" + +#: source/ubl-strings.h:10 +msgid "About" +msgstr "" + +#: source/ubl-strings.h:11 +msgid "Documentation" +msgstr "" + +#: source/ubl-strings.h:13 +msgid "Save to local configuration" +msgstr "" + +#: source/ubl-strings.h:14 +msgid "Save to global configuration" +msgstr "" + +#: source/ubl-strings.h:15 +msgid "Save configuration" +msgstr "" + +#: source/ubl-strings.h:16 +msgid "Save" +msgstr "" + +#: source/ubl-strings.h:18 +msgid "Load local configuration" +msgstr "" + +#: source/ubl-strings.h:19 +msgid "Load global configuration" +msgstr "" + +#: source/ubl-strings.h:20 +msgid "Load" +msgstr "" + +#: source/ubl-strings.h:22 +msgid "Cancel" +msgstr "" + +#: source/ubl-strings.h:24 +msgid "Would you like to read documentation in the Web?" +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" +msgstr "" + +#: source/ubl-strings.h:27 +msgid "Open documentation" +msgstr "" + +#: source/ubl-strings.h:28 +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." +msgstr "" + +#: source/ubl-strings.h:33 +msgid "Local configuration loading succseeded." +msgstr "" + +#: source/ubl-strings.h:34 +msgid "Config loading failed" +msgstr "" + +#: source/ubl-strings.h:36 +msgid "Local and global configuration saving succseeded." +msgstr "" + +#: source/ubl-strings.h:37 +msgid "Global configuration saving succseeded." +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 "" + +#: source/ubl-strings.h:60 +msgid "Status" +msgstr "" diff --git a/ubl-settings-services_ru.po b/ubl-settings-services_ru.po new file mode 100644 index 0000000..4ee6544 --- /dev/null +++ b/ubl-settings-services_ru.po @@ -0,0 +1,250 @@ +# Russian translations for ubl-settings-services package. +# Copyright (C) 2022, UBTech LLC +# This file is distributed under the same license as the ubl-settings-services package. +# UBLinux Team , 2022 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: ubl-settings-services 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" +"Last-Translator: UBLinux Team \n" +"Language-Team: Russian - UBLinux Team \n" +"Language: Russian\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: source/ubl-strings.h:1 +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" + +#: source/ubl-strings.h:2 +msgid "Usage:" +msgstr "Использование:" + +#: source/ubl-strings.h:2 +msgid "[OPTIONS]" +msgstr "[АРГУМЕНТЫ]" + +#: source/ubl-strings.h:2 +msgid "Options:" +msgstr "Аргументы:" + +#: source/ubl-strings.h:2 +msgid "Show this help" +msgstr "Показать параметры справки" + +#: source/ubl-strings.h:2 +msgid "Show package version" +msgstr "Показать текущую версию" + +#: source/ubl-strings.h:2 +msgid "Lock this help menu" +msgstr "Блокировка вызова справки" + +#: source/ubl-strings.h:2 +msgid "Lock configuration saving" +msgstr "Блокировка сохранения локальной и глобальной конфигурации" + +#: source/ubl-strings.h:2 +msgid "Lock local configration saving" +msgstr "Блокировка сохранения локальной конфигурации" + +#: source/ubl-strings.h:2 +msgid "Lock global configration saving" +msgstr "Блокировка сохранения глобальной конфигурации" + +#: source/ubl-strings.h:2 +msgid "Lock global configration loading" +msgstr "Блокировка загрузки глобальной конфигурации" + +#: source/ubl-strings.h:5 +msgid "System services and processes configuration" +msgstr "Настройка работы служб и процессов системы" + +#: source/ubl-strings.h:7 +msgid "Operation succeeded" +msgstr "Операция завершена" + +#: source/ubl-strings.h:8 +msgid "" +"Warning! Application was launched without root - root-dependent actions are " +"locked" +msgstr "" +"Внимание! Приложение было запущено без прав суперпользователя - действия, " +"требующие их наличия заблокированы" + +#: source/ubl-strings.h:10 +msgid "About" +msgstr "О программе" + +#: source/ubl-strings.h:11 +msgid "Documentation" +msgstr "Справка" + +#: source/ubl-strings.h:13 +msgid "Save to local configuration" +msgstr "Сохранить в локальную конфигурацию" + +#: source/ubl-strings.h:14 +msgid "Save to global configuration" +msgstr "Сохранить в глобальную конфигурацию" + +#: source/ubl-strings.h:15 +msgid "Save configuration" +msgstr "Сохранить конфигурацию" + +#: source/ubl-strings.h:16 +msgid "Save" +msgstr "Сохранить" + +#: source/ubl-strings.h:18 +msgid "Load local configuration" +msgstr "Загрузить локальную конфигуруцию" + +#: source/ubl-strings.h:19 +msgid "Load global configuration" +msgstr "Загрузить глобальную конфигурацию" + +#: source/ubl-strings.h:20 +msgid "Load" +msgstr "Загрузить" + +#: source/ubl-strings.h:22 +msgid "Cancel" +msgstr "Отмена" + +#: source/ubl-strings.h:24 +msgid "Would you like to read documentation in the Web?" +msgstr "Вы хотите прочитать справку в Сети?" + +#: source/ubl-strings.h:25 +msgid "" +"You will be redirected to documentation website where documentation is\n" +"translated and supported by community." +msgstr "" +"Вы будете перенаправлены на сайт с документацией где страницы помощи\n" +"переводятся и поддерживаются сообществом." + +#: source/ubl-strings.h:26 +msgid "Always redirect to online documentation" +msgstr "Всегда перенаправлять" + +#: source/ubl-strings.h:27 +msgid "Open documentation" +msgstr "Прочитать справку" + +#: source/ubl-strings.h:28 +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." +msgstr "Успешно загружена глобальная конфигурация" + +#: source/ubl-strings.h:33 +msgid "Local configuration loading succseeded." +msgstr "Успешно загружена локальная конфигурация" + +#: source/ubl-strings.h:34 +msgid "Config loading failed" +msgstr "" + +#: source/ubl-strings.h:36 +msgid "Local and global configuration saving succseeded." +msgstr "Успешно записаны локальная и глобальная конфигурация" + +#: source/ubl-strings.h:37 +msgid "Global configuration saving succseeded." +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 "Перезагрузка конфигурации сервиса" + +#: source/ubl-strings.h:60 +msgid "Status" +msgstr "Статус"