From 82e1ddbf007cac0d7e566306adb083ecb3a33196 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Mon, 18 Sep 2023 17:29:22 +0600 Subject: [PATCH 1/7] Version 1.5 --- .gitignore | 12 + Makefile | 154 + README.md | 27 + com.ublinux.ubl-settings-keyboard.checked.svg | 327 + com.ublinux.ubl-settings-keyboard.policy | 24 + com.ublinux.ubl-settings-keyboard.svg | 6073 +++++++++++++++++ com.ublinux.ubl-settings-keyboard.warning.svg | 55 + gresource.xml | 14 + layouts.csv | 68 + source/CMakeLists.txt | 98 + source/ubl-cmake.in | 1 + source/ubl-settings-keyboard.c | 473 ++ source/ubl-settings-keyboard.h | 136 + source/ubl-strings.h | 38 + source/ubl-utils.c | 2041 ++++++ source/ubl-utils.h | 378 + ubl-settings-keyboard | Bin 0 -> 262488 bytes ubl-settings-keyboard-banner.png | Bin 0 -> 33872 bytes ubl-settings-keyboard-layouts.glade | 150 + ubl-settings-keyboard-options.glade | 145 + ubl-settings-keyboard.css | 114 + ubl-settings-keyboard.desktop | 15 + ubl-settings-keyboard.glade | 1229 ++++ ubl-settings-keyboard.pot | 171 + ubl-settings-keyboard_ru.po | 177 + 25 files changed, 11920 insertions(+) create mode 100644 .gitignore create mode 100644 Makefile create mode 100644 com.ublinux.ubl-settings-keyboard.checked.svg create mode 100644 com.ublinux.ubl-settings-keyboard.policy create mode 100644 com.ublinux.ubl-settings-keyboard.svg create mode 100644 com.ublinux.ubl-settings-keyboard.warning.svg create mode 100644 gresource.xml create mode 100644 layouts.csv create mode 100644 source/CMakeLists.txt create mode 100644 source/ubl-cmake.in create mode 100644 source/ubl-settings-keyboard.c create mode 100644 source/ubl-settings-keyboard.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-keyboard create mode 100644 ubl-settings-keyboard-banner.png create mode 100644 ubl-settings-keyboard-layouts.glade create mode 100644 ubl-settings-keyboard-options.glade create mode 100644 ubl-settings-keyboard.css create mode 100644 ubl-settings-keyboard.desktop create mode 100644 ubl-settings-keyboard.glade create mode 100644 ubl-settings-keyboard.pot create mode 100644 ubl-settings-keyboard_ru.po diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0c934a6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,12 @@ +.vscode/ +ubl-settings-TEMPLATE +*~ +build/ +compile/ +*# +terminal-commands/ +source/ubl-cmake.h +vgcore* +.BUILD.md +.updatebuild.sh +.install.sh \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..2c64667 --- /dev/null +++ b/Makefile @@ -0,0 +1,154 @@ +#!/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 +DEPENDS = /bin/cmake +PREFIX ?= /usr/local +PKGNAME = $(MAKEFILE_DIR) +FILE_VER = source/${PKGNAME}.h +PKGIDENT=$(subst /,-,${PREFIX}) + +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 --abbrev=0 --tags | sed 's/^v//'); \ + if [ -z "$${LATEST_TAG}" ]; \ + then \ + LATEST_TAG=$$"0.0"; \ + echo "$${LATEST_TAG} is empty"; \ + fi; \ + else \ + LATEST_TAG="Development"; \ + fi; \ + sed -r "s/^(string version_application).*/\1 = \"$${LATEST_TAG}\";/" -i ${FILE_VER}; \ + 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; \ + $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B${CMAKE_BUILD_DIR} --check-build-system CMakeFiles/Makefile.cmake 1 || exit 1; \ + echo "Check depends: OK" + +debug: + @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 "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_COMMAND) --directory=${CMAKE_BUILD_DIR}; \ + sed -r "s/^(string version_application).*/\1;/" -i ${FILE_VER}; \ + 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}/usr/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}/usr/share/icons/hicolor/scalable/apps/com.ublinux.${PKGNAME}.svg" + @$(RM) "${DESTDIR}/usr/share/polkit-1/actions/com.ublinux.${PKGNAME}${PKGIDENT}.policy" + @if [ -z ${DESTDIR} ]; then \ + [ -d "${DESTDIR}${PREFIX}/share/icons/hicolor/" ] && gtk-update-icon-cache -fiq "${DESTDIR}${PREFIX}/share/icons/hicolor/" &>/dev/null || true; \ + 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 ..." + @for FILE_PO in $(wildcard *.po); do \ + LANG=$${FILE_PO##*_};LANG=$${LANG%.*}; \ + install -dm755 "${DESTDIR}/usr/share/locale/$${LANG}/LC_MESSAGES"; \ + FILE_MO=$${FILE_PO##*/}; FILE_MO="$${FILE_MO%_*.po}.mo"; \ + PATH_FILE_MO="${DESTDIR}/usr/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 -Dm644 -t "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/apps/" "com.ublinux.${PKGNAME}.svg" + @cp ./com.ublinux.${PKGNAME}.policy ./compile/com.ublinux.${PKGNAME}${PKGIDENT}.policy + @sed -e 's+/usr/bin+${PREFIX}/bin+' -e 's+.run+${PKGIDENT}.run+g' ./compile/com.ublinux.${PKGNAME}${PKGIDENT}.policy -i + @install -Dm755 -t "${DESTDIR}${PREFIX}/bin/" "${CMAKE_BUILD_DIR}/${PKGNAME}" + @install -Dm644 -t "${DESTDIR}${PREFIX}/share/applications/" "${PKGNAME}.desktop" + @install -Dm644 -t "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/status/" "com.ublinux.${PKGNAME}.checked.svg" + @install -Dm644 -t "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/status/" "com.ublinux.${PKGNAME}.warning.svg" + @install -Dm644 -t "${DESTDIR}/usr/share/polkit-1/actions/" "${CMAKE_BUILD_DIR}/com.ublinux.${PKGNAME}${PKGIDENT}.policy" + @install -Dm644 -t "${DESTDIR}/usr/share/${PKGNAME}/csv/" "layouts.csv" + @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" + +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 + +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" \ No newline at end of file diff --git a/README.md b/README.md index da6a15c..fdd0a3c 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,29 @@ # ubl-settings-keyboard +# Выполнить +# Build +In order to build ubl-settings-keyboard 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-keyboard.checked.svg b/com.ublinux.ubl-settings-keyboard.checked.svg new file mode 100644 index 0000000..e3cab42 --- /dev/null +++ b/com.ublinux.ubl-settings-keyboard.checked.svg @@ -0,0 +1,327 @@ + + + + + + + + + + + + + + + + diff --git a/com.ublinux.ubl-settings-keyboard.policy b/com.ublinux.ubl-settings-keyboard.policy new file mode 100644 index 0000000..abe592b --- /dev/null +++ b/com.ublinux.ubl-settings-keyboard.policy @@ -0,0 +1,24 @@ + + + + + UBLinux + https://ublinux.ru + + + Run ubl-settings-keyboard as root + Запуск утилиты ubl-settings-keyboard с правами root + Authentication is required to run ubl-settings-keyboard + Требуется авторизация для запуска утилиты ubl-settings-keyboard с правами root + + auth_admin + auth_admin + auth_admin + + /usr/bin/ubl-settings-keyboard + true + + + diff --git a/com.ublinux.ubl-settings-keyboard.svg b/com.ublinux.ubl-settings-keyboard.svg new file mode 100644 index 0000000..eead784 --- /dev/null +++ b/com.ublinux.ubl-settings-keyboard.svg @@ -0,0 +1,6073 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/com.ublinux.ubl-settings-keyboard.warning.svg b/com.ublinux.ubl-settings-keyboard.warning.svg new file mode 100644 index 0000000..9a90dba --- /dev/null +++ b/com.ublinux.ubl-settings-keyboard.warning.svg @@ -0,0 +1,55 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/gresource.xml b/gresource.xml new file mode 100644 index 0000000..c03d777 --- /dev/null +++ b/gresource.xml @@ -0,0 +1,14 @@ + + + + ubl-settings-keyboard.glade + ubl-settings-keyboard-layouts.glade + ubl-settings-keyboard-options.glade + + + ubl-settings-keyboard.css + + + ubl-settings-keyboard-banner.png + + \ No newline at end of file diff --git a/layouts.csv b/layouts.csv new file mode 100644 index 0000000..efad78c --- /dev/null +++ b/layouts.csv @@ -0,0 +1,68 @@ +af;Afrikaans +ar;Arabic +as;Assamese +az;Azerbaijani +be;Belarusian +bg;Bulgarian +bn;Bengali +bs;Bosnian +ca;Catalan +cs;Czech +da;Danish +de;German +el;Greek +en;English +es;Spanish +et;Estonian +fi;Finnish +fr;French +gu;Gujarati +he;Hebrew +hi;Hindi +hr;Croatian +hu;Hungarian +hy;Armenian +id;Indonesian +is;Icelandic +it;Italian +ja;Japanese +ka;Georgian +kk;Kazakh +kn;Kannada +ko;Korean +ks;Kashmiri +ku;Kurdish +ku;Kurdish +ky;Kirghiz +lt;Lithuanian +lv;Latvian +mk;Macedonian +ml;Malayalam +mr;Marathi +ms;Malay +mt;Maltese +nb;Bokmal +nl;Dutch +nn;Nynorsk +or;Oriya +pa;Punjabi +pl;Polish +pt;Portuguese +ro;Romanian +ru;Russian +sa;Sanskrit +sk;Slovak +sl;Slovenian +sq;Albanian +sr;Serbian +sv;Swedish +ta;Tamil +te;Telugu +th;Thai +tr;Turkish +uk;Ukrainian +vi;Vietnamese +zh;Simplified Chinese +zh;Traditional Chinese +zh;Chinese +zh;Traditional Chinese \ No newline at end of file diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt new file mode 100644 index 0000000..ded2868 --- /dev/null +++ b/source/CMakeLists.txt @@ -0,0 +1,98 @@ +cmake_minimum_required(VERSION 3.7) +project(ubl-settings-keyboard) + +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-keyboard.glade) + +set(DEPENDFILES + ../ubl-settings-keyboard.glade + ../ubl-settings-keyboard-layouts.glade + ../ubl-settings-keyboard-options.glade + ../gresource.xml + ../ubl-settings-keyboard-banner.png + ../ubl-settings-keyboard.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-keyboard.c + ubl-settings-keyboard.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-keyboard.c b/source/ubl-settings-keyboard.c new file mode 100644 index 0000000..f71ba59 --- /dev/null +++ b/source/ubl-settings-keyboard.c @@ -0,0 +1,473 @@ +#include "ubl-settings-keyboard.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(YON_CONFIG_TYPE type){ + if (yon_config_load_register(type,"keyboard","XkbModel","keyboard","XkbLayout","keyboard","KEYBOARD","keyboard","KEYTABLE","keyboard","GRP_TOGGLE","keyboard","XkbOptions",NULL)) + 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_num_lock_changed(GtkComboBox *self, main_window *widgets){ + switch (gtk_combo_box_get_active(self)){ + case 0: + yon_config_remove_by_key(num_lock_boot_parameter); + break; + case 1: + if (yon_config_get_by_key(num_lock_boot_parameter)) + yon_config_set(num_lock_boot_parameter,"yes"); + else yon_config_register(num_lock_boot_parameter,"config","yes"); + break; + case 2: + if (yon_config_get_by_key(num_lock_boot_parameter)) + yon_config_set(num_lock_boot_parameter,"no"); + else yon_config_register(num_lock_boot_parameter,"config","no"); + break; + } +} + +void on_model_changed(GtkComboBoxText *self, main_window *widgets){ + switch (gtk_combo_box_get_active(GTK_COMBO_BOX(self))){ + case 0: + yon_config_remove_by_key(model_parameter); + break; + default: + char *id; + GtkTreeIter iter; + gtk_combo_box_get_active_iter(GTK_COMBO_BOX(widgets->ModelCombo),&iter); + gtk_tree_model_get(GTK_TREE_MODEL(widgets->modelsList),&iter,0,&id,-1); + if (yon_config_get_by_key(model_parameter)) + yon_config_set(model_parameter,id); + else yon_config_register(model_parameter,"keyboard",id); + break; + } + +} + +void on_options_accept(GtkWidget *self, dictionary *dict){ + main_window *widgets = yon_dictionary_get_data(dict->first,main_window*); + layouts_window *window = yon_dictionary_get_data(dict->first->next,layouts_window*); + GtkTreeModel *model = GTK_TREE_MODEL(window->list); + GtkTreeIter iter; + char *name; + if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(window->MainTree)),&model,&iter)){ + gtk_tree_model_get(model,&iter,0,&name,-1); + gtk_entry_set_text(GTK_ENTRY(widgets->OptionsEntry),name); + } + on_close_subwindow(self); +} + +void on_options_open(GtkWidget *self, main_window *widgets){ + GtkBuilder *builder = gtk_builder_new_from_resource(glade_layouts_path); + layouts_window *window = malloc(sizeof(layouts_window)); + window->Window = yon_gtk_builder_get_widget(builder,"Window"); + window->AcceptButton = yon_gtk_builder_get_widget(builder,"AcceptButton"); + window->CancelButton = yon_gtk_builder_get_widget(builder,"CancelButton"); + window->MainTree = yon_gtk_builder_get_widget(builder,"LayoutsTree"); + window->list = GTK_LIST_STORE(gtk_builder_get_object(builder,"liststore1")); + + int size; + config_str rtn = yon_config_load(get_options_command,&size); + GtkTreeIter iter; + for (int i=0; ilist,&iter); + gtk_list_store_set(window->list,&iter,0,option[0],1,option[1],-1); + + } + dictionary *dict = NULL; + yon_dictionary_add_or_create_if_exists_with_data(dict,"widgets",widgets); + yon_dictionary_add_or_create_if_exists_with_data(dict,"window",window); + g_signal_connect(G_OBJECT(window->CancelButton),"clicked",G_CALLBACK(on_close_subwindow),NULL); + g_signal_connect(G_OBJECT(window->AcceptButton),"clicked",G_CALLBACK(on_options_accept),dict); +} + +void on_layouts_accept(GtkWidget *self, dictionary *dict){ + main_window *widgets = yon_dictionary_get_data(dict->first,main_window*); + layouts_window *window = yon_dictionary_get_data(dict->first->next,layouts_window*); + GtkTreeModel *model = GTK_TREE_MODEL(window->list); + GList *list = gtk_tree_selection_get_selected_rows(gtk_tree_view_get_selection(GTK_TREE_VIEW(window->MainTree)),&model); + char *name; + char *id; + GtkTreeIter iter, lwiter; + GtkTreePath *pth; + for (int i=0;ilayoutsList,&iter); + gtk_tree_model_get(model,&lwiter,0,&name,1,&id,-1); + gtk_list_store_set(widgets->layoutsList,&iter,1,name,0,id,-1); + } + on_close_subwindow(self); +} + +void on_layouts_add(GtkWidget *self, main_window *widgets){ + GtkBuilder *builder = gtk_builder_new_from_resource(glade_layouts_path); + layouts_window *window = malloc(sizeof(layouts_window)); + window->Window = yon_gtk_builder_get_widget(builder,"Window"); + window->AcceptButton = yon_gtk_builder_get_widget(builder,"AcceptButton"); + window->CancelButton = yon_gtk_builder_get_widget(builder,"CancelButton"); + window->MainTree = yon_gtk_builder_get_widget(builder,"LayoutsTree"); + window->list = GTK_LIST_STORE(gtk_builder_get_object(builder,"liststore1")); + int size,laysize; + GtkTreeIter iter; + config_str rtn = yon_config_load(get_layouts_command,&size); + for (int i=0; ilist,&iter); + gtk_list_store_set(window->list,&iter,0,layout[0],1,layout[1],-1); + } + gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(window->MainTree)),GTK_SELECTION_MULTIPLE); + + dictionary *dict = NULL; + yon_dictionary_add_or_create_if_exists_with_data(dict,"widgets",widgets); + yon_dictionary_add_or_create_if_exists_with_data(dict,"window",window); + + g_signal_connect(G_OBJECT(window->CancelButton),"clicked",G_CALLBACK(on_close_subwindow),NULL); + g_signal_connect(G_OBJECT(window->AcceptButton),"clicked",G_CALLBACK(on_layouts_accept),dict); +} + +void on_layouts_remove(GtkWidget *self, main_window *widgets){ + GtkTreeModel *model = GTK_TREE_MODEL(widgets->layoutsList); + GtkTreeIter iter; + if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->LayoutsTree)),&model,&iter)){ + gtk_list_store_remove(widgets->layoutsList,&iter); + } +} + +void on_move_up(GtkWidget *self, main_window *widgets){ + GtkTreeModel *model = GTK_TREE_MODEL(widgets->layoutsList); + GtkTreeIter iter,*previter; + if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->LayoutsTree)),&model,&iter)){ + previter = gtk_tree_iter_copy(&iter); + if (gtk_tree_model_iter_previous(model,previter)) + gtk_list_store_move_before(widgets->layoutsList,&iter,previter); + } +} + +void on_move_down(GtkWidget *self, main_window *widgets){ + GtkTreeModel *model = GTK_TREE_MODEL(widgets->layoutsList); + GtkTreeIter iter,*nextiter; + if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->LayoutsTree)),&model,&iter)){ + nextiter = gtk_tree_iter_copy(&iter); + if (gtk_tree_model_iter_next(model,nextiter)) + gtk_list_store_move_after(widgets->layoutsList,&iter,nextiter); + } + +} + + + +// 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->NumLockCombo = yon_gtk_builder_get_widget(builder,"NumlockCombo"); + widgets->ModelCombo = yon_gtk_builder_get_widget(builder,"ModelCombo"); + widgets->keyboard = yon_gtk_builder_get_widget(builder,"keyboard"); + widgets->keytable = yon_gtk_builder_get_widget(builder,"keytable"); + widgets->grp_toggle = yon_gtk_builder_get_widget(builder,"grp_toggle"); + widgets->OptionsEntry = yon_gtk_builder_get_widget(builder,"OptionsEntry"); + widgets->OptionsButton = yon_gtk_builder_get_widget(builder,"OptionsButton"); + widgets->LayoutsTree = yon_gtk_builder_get_widget(builder,"LayoutsTree"); + widgets->MoveUpButton = yon_gtk_builder_get_widget(builder,"MoveUpButton"); + widgets->MoveDownButton = yon_gtk_builder_get_widget(builder,"MoveDownButton"); + widgets->AddButton = yon_gtk_builder_get_widget(builder,"AddButton"); + widgets->RemoveButton = yon_gtk_builder_get_widget(builder,"RemoveButton"); + widgets->layoutsList = GTK_LIST_STORE(gtk_builder_get_object(builder,"liststore1")); + widgets->modelsList = GTK_LIST_STORE(gtk_builder_get_object(builder,"liststore2")); + + widgets->DocumentationMenuItem = yon_ubl_menu_item_documentation_new(DOCUMENTATION_LABEL); + widgets->AboutMenuItem = yon_ubl_menu_item_about_new(ABOUT_LABEL); + + gtk_window_set_title(GTK_WINDOW(widgets->Window),TITLE_LABEL); + + GtkWidget *menu = yon_gtk_builder_get_widget(builder,"menu2"); + gtk_menu_shell_append(GTK_MENU_SHELL(menu),widgets->DocumentationMenuItem); + gtk_menu_shell_append(GTK_MENU_SHELL(menu),widgets->AboutMenuItem); + + 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); + } + + int size; + GtkTreeIter iter; + config_str models = yon_config_load(get_models_command,&size); + for (int i=0;imodelsList,&iter); + gtk_list_store_set(widgets->modelsList,&iter,0,models[i],1,models[i+1],-1); + } + + /* Widget registration for config monitoring | Регистрация виджетов для мониторинга конфига */ + // yon_window_config_add_custom_parameter(widgets->HeadInfoLabel,"head-text","label",YON_TYPE_STRING); + + /* Signal connection | Присоединение сигналов */ + g_signal_connect(G_OBJECT(widgets->DocumentationMenuItem),"activate",G_CALLBACK(on_open_documentation_confirmation),WIKI_LINK); + g_signal_connect(G_OBJECT(widgets->AboutMenuItem),"activate",G_CALLBACK(on_about),NULL); + + g_signal_connect(G_OBJECT(widgets->AddButton),"clicked",G_CALLBACK(on_layouts_add),widgets); + g_signal_connect(G_OBJECT(widgets->RemoveButton),"clicked",G_CALLBACK(on_layouts_remove),widgets); + g_signal_connect(G_OBJECT(widgets->ModelCombo),"changed",G_CALLBACK(on_model_changed),widgets); + g_signal_connect(G_OBJECT(widgets->MoveDownButton),"clicked",G_CALLBACK(on_move_down),widgets); + g_signal_connect(G_OBJECT(widgets->MoveUpButton),"clicked",G_CALLBACK(on_move_up),widgets); + g_signal_connect(G_OBJECT(widgets->OptionsButton),"clicked",G_CALLBACK(on_options_open),widgets); + g_signal_connect(G_OBJECT(widgets->NumLockCombo),"changed",G_CALLBACK(on_num_lock_changed),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-keyboard.h b/source/ubl-settings-keyboard.h new file mode 100644 index 0000000..29c2975 --- /dev/null +++ b/source/ubl-settings-keyboard.h @@ -0,0 +1,136 @@ +#include +#include +#include "ubl-utils.h" +#include +#include +#include +#include +#include +#include +#include +#include "../compile/ubl-cmake.h" +#ifdef WEBKIT_FOUND + #include +#endif +#include "ubl-strings.h" + +#define WIKI_LINK "https://wiki.ublinux.ru/ru/Программное_обеспечение/Программы_и_утилиты/Все/ubl-settings-keyboard" + +#define _(String) gettext(String) + +#define glade_path "/com/ublinux/ui/ubl-settings-keyboard.glade" +#define glade_layouts_path "/com/ublinux/ui/ubl-settings-keyboard-layouts.glade" +#define glade_options_path "/com/ublinux/ui/ubl-settings-keyboard-options.glade" +#define banner_path "/com/ublinux/images/ubl-settings-keyboard-banner.png" +#define CssPath "/com/ublinux/css/ubl-settings-keyboard.css" +#define config_path yon_char_unite(yon_ubl_user_get_home_directory(),"/.config/",LocaleName,"/",LocaleName,".conf",NULL) + +#define hostname_parameter "HOSTNAME" +#define model_parameter "XkbModel" +#define keyboard_layout_parameter "XkbLayout" +#define console_font_parameter "CONSOLE_FONT" +#define num_lock_boot_parameter "NUMLOCK" +#define language_parameter "LANG" + +#define get_options_command "grep \"grp:.*toggle\" /usr/share/X11/xkb/rules/base.lst|sed -e 's/^ *//g' -e 's/\t//g' -e 's/toggle */toggle;/g'" +#define get_models_command "sed '/<\\/modelList>/q' /usr/share/X11/xkb/rules/base.xml | grep -E '^ {8,8}|^ {8,8}'|sed -e 's/ *//g' -e 's,,,g' -e 's/ *//g' -e 's,,,g'" +#define get_layouts_command "grep '' /usr/share/ubl-settings-keyboard/csv/layouts.csv" + +#define LocalePath "/usr/share/locale" +#define LocaleName "ubl-settings-keyboard" +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 { + //Standard + 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; + // Custom + GtkWidget *NumLockCombo; + GtkWidget *ModelCombo; + GtkWidget *keyboard; + GtkWidget *keytable; + GtkWidget *grp_toggle; + GtkWidget *OptionsEntry; + GtkWidget *OptionsButton; + GtkWidget *LayoutsTree; + GtkWidget *MoveUpButton; + GtkWidget *MoveDownButton; + GtkWidget *AddButton; + GtkWidget *RemoveButton; + GtkListStore *layoutsList; + GtkListStore *modelsList; +} main_window; + + +typedef struct { + GtkWidget *Window; + + GtkWidget *HatText; + GtkWidget *HeaderText; + GtkWidget *InfoText; + GtkWidget *AlwaysOpenCheck; + + GtkWidget *CloseButton; + GtkWidget *AcceptButton; +} documentation_confirmation_window; + +typedef struct { + GtkWidget *Window; + GtkWidget *MainTree; + GtkWidget *CancelButton; + GtkWidget *AcceptButton; + GtkListStore *list; +} layouts_window; + +typedef struct { + GtkWidget *Window; + GtkWidget *CancelButton; + GtkWidget *AcceptButton; +} options_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..5be35fc --- /dev/null +++ b/source/ubl-strings.h @@ -0,0 +1,38 @@ +#define VERSION_LABEL yon_char_unite(_("Version:")," ",version_application,"\n",NULL) +#define HELP_LABEL yon_char_unite(_("ubl-settings-keyboard version:")," ", version_application,"\n",TITLE_LABEL,"\n",_("Usage:"), " ubl-settings-keyboard ",_("[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 _("Keyboard") +#define TITLE_INFO_LABEL _("Keyboard 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.") \ No newline at end of file diff --git a/source/ubl-utils.c b/source/ubl-utils.c new file mode 100644 index 0000000..c5a6551 --- /dev/null +++ b/source/ubl-utils.c @@ -0,0 +1,2041 @@ +#include "ubl-utils.h" + +// dictionary functions + +/**yon_dictionary_new(): + * [EN] + * Creates and returns empty dictionary + * [RU] + * Создаёт и возвращает пустой словарь. + */ +dictionary *yon_dictionary_new() +{ + dictionary *dict = malloc(sizeof(dictionary)); + dict->data = NULL; + dict->key = NULL; + dict->next = NULL; + dict->prev = NULL; + dict->first = dict; + dict->data_type = DICTIONARY_OTHER_TYPE; + return dict; +} + +/**yon_dictionary_copy(dictionary *dict) + * [EN] + * + * [RU] + * Создаёт и возвращает копию элемента словаря [dict] +*/ +dictionary *yon_dictinoary_copy(dictionary *dict){ + dictionary *dct = yon_dictionary_new_with_data(dict->key,dict->data); + dct->data_type= dict->data_type; + return dct; +} + +/**yon_dictionary_copy_deep(dictionary *dict) + * [EN] + * + * [RU] + * Создаёт полную копию словаря [dict] и возвращает первый элемент +*/ +dictionary *yon_dictionary_copy_deep(dictionary *dict){ + dictionary *dct = NULL; + dictionary *newone=NULL; + for_dictionaries(dct,dict){ + yon_dictionary_add_or_create_if_exists_with_data(newone,dct->key,dct->data); + newone->data_type=dct->data_type; + } + return newone->first; +} + +/**int yon_dictionary_set_data(dictionary *dict, void *data) + * [EN] + * + * [RU] + * Установить элементу словаря [dict] значение [data] +*/ +int yon_dictionary_set_data(dictionary *dict, void *data){ + dict->data=data; +} + +/**int yon_dictionary_set_key(dictionary *dict, char *key) + * [EN] + * + * [RU] + * Изменяет ключ элемента словаря [dict] на [key] +*/ +int yon_dictionary_set_key(dictionary *dict, char *key){ + dict->key=key; + return 1; +} + +/** int yon_dictionary_set(dictionary *dict, char *key, void *data) + * [EN] + * + * [RU] +* Устанавливает значение ключа элемента словаря [dict] на [key] и его данные на [data] +*/ +int yon_dictionary_set(dictionary *dict, char *key, void *data){ + dict->key=key; + dict->data=data; + return 1; +} + +/**int yon_dictionary_empty(dictionary *dict) + * [EN] + * + * [RU] + * Очищает элемент словаря [dict] от данных +*/ +int yon_dictionary_empty(dictionary *dict){ + dict->data=NULL; + dict->data_type=DICTIONARY_OTHER_TYPE; + return 1; +} + +/**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 + +int yon_char_find_last(char *source, char find){ + int size = strlen(source); + int i=size; + for (;source[i]!=find&&i>0;i--); + return i; +} + +/**[EN] + * + * creates new char string by combining two char strings. + */ +char *yon_char_append(char *source, char *append) +{ + if (source && append) + { + int size = strlen(source) + strlen(append) + 1; + char *final = malloc(size); + memset(final, 0, size); + if (strstr(source, "%%")) + sprintf(final, source, append); + else + sprintf(final, "%s%s", source, append); + return final; + } + else + return NULL; +} + +/**[EN] + * + * creates new char string by copying another char. + */ +char *yon_char_new(char *chr) +{ + if (chr){ + char *newchar = malloc(strlen(chr) + 1); + memset(newchar, 0, strlen(chr) + 1); + memcpy(newchar, chr, strlen(chr)); + return newchar; + } else + return NULL; +} + +/**yon_char_unite(char *source, ...) + * [En] + * + * [RU] + * Объединяет строку [source] со всеми строками, написанными в [...] +*/ +char *yon_char_unite(char *source, ...){ + va_list arglist; + char *new_char=NULL; + char *unite_char=NULL; + new_char=yon_char_new(source); + va_start(arglist,source); + unite_char = va_arg(arglist,char*); + while(unite_char){ + new_char = yon_char_append(new_char,unite_char); + unite_char = va_arg(arglist,char*); + } + va_end(arglist); + return new_char; +} + +/**yon_cut(char *source, int size, int startpos) + * [EN] + * cuts source string by size length from startpos position. + */ +char *yon_cut(char *source, int size, int startpos) +{ + char *cut = NULL; + cut = malloc(size + 1); + memset(cut, 0, size + 1); + memcpy(cut, source + startpos, size); + return cut; +} + +/**yon_char_divide(char *source, int dividepos) + * [EN] + * divides source string in dividepos position, + * returning left part of divided string and + * inserting right part to source string. + */ +char *yon_char_divide(char *source, int dividepos) +{ + char *cut = malloc(dividepos + 1); + memset(cut, 0, dividepos + 1); + memcpy(cut, source, dividepos); + char *left = malloc(strlen(source) - strlen(cut)); + memset(left, 0, strlen(source) - strlen(cut)); + memcpy(left, source + dividepos + 1, (strlen(source) - dividepos)); + memset(source, 0, strlen(source)); + memcpy(source, left, strlen(left)); + return cut; +} + +/**yon_char_find_count(char *source, char *find) + * [EN] + * + * [RU] + * Считает количество символов [find] в строке [source] +*/ +int yon_char_find_count(char *source, char *find){ + char *working_string=yon_char_new(source); + int i=0; + int size=0; + int pos=0; + config_str rtn = yon_char_parse(working_string,&size,"\n"); + for (int j=0;j= 10; i++) + { + convert_check = convert_check / 10; + } + char *ch = g_malloc0(i * sizeof(char) + 1); + sprintf(ch, "%d", int_to_convert); + return ch; +} + +/**yon_char_replace(char *source, char *find, char*replace) + * [EN] + * + * [RU] + * Заменяет в строке [source] все вхождения строки [find] на [replace] +*/ +char *yon_char_replace(char *source, char *find, char*replace){ + if (!strstr(replace,find)){ + + + char *final=NULL; + char *temp=NULL; + if(!strstr(replace,find)){ + while ((final=strstr(source,find))){ + temp=malloc(strlen(source)-strlen(final)); + memset(temp,0,strlen(source)-strlen(final)+strlen(replace)); + memcpy(temp,source,strlen(source)-strlen(final)); + temp=yon_char_append(temp,replace); + source=yon_char_append(temp,final+1); + } + + } + } + return source; +} + +/**yon_char_parse(char *parameters, int *size, char *divider) + * [EN] + * Parses string [parameters], divided by [divider], + * then returns parsed string array and sets [size] to + * size of returned array +*/ +char **yon_char_parse(char *parameters, int *size, char *divider){ + char **string=NULL; + int i=1; + string=malloc(sizeof(char*)); + char *paramline=yon_char_new(parameters); + char *param; + while ((param=yon_char_divide_search(paramline,divider,1))){ + string=realloc(string,sizeof(char*)*i); + string[i-1]=yon_char_new(param); + i++; + if (strcmp(param,paramline)==0) break; + } + string=realloc(string,sizeof(char*)*i); + string[i-1]=yon_char_new(paramline); + i++; + // printf("%d\n",i); + *size=i-1; + return string; + +} + +/**yon_char_parsed_rip(char **char_string, int *size, int item_to_delete) + * [EN] + * + * [RU] + * Удаляет элемент [item_to_delete] из массива строк [char_string], размера [size] + * Возвращает получившийся массив, в [size] загружается размер нового массива. +*/ +char **yon_char_parsed_rip(char **char_string, int *size, int item_to_delete){ + char **new_char_parsed=NULL; + new_char_parsed=malloc(sizeof(char*)*((*size)-1)); + int flag = 0; + for (int i=0;i < (*size);i++){ + if (i==item_to_delete) { + flag = 1; + } + if (flag == 0) { + new_char_parsed[i]=yon_char_new(char_string[i]); + } + else if (flag == 1 && i!=item_to_delete) { + new_char_parsed[i-1]=yon_char_new(char_string[i]); + } + } + (*size)=(*size)-1; + return new_char_parsed; +} + +/**yon_char_parsed_check_exist(char **parameters, int size, char *param) + * [EN] + * Checks if [parameters] string array of length [size] + * has [param] element; + * [RU] + * Проверяет есть ли в массиве строк [parameters], размера [size] + * элемент [param] +*/ +int yon_char_parsed_check_exist(char **parameters, int size, char *param){ + + for (int i=0;id_name); + file = fopen(path, "r"); + if (strlen(de->d_name) > 9) + { + char *extension = strstr(path, "."); + if (extension != NULL) + { + if (strcmp(extension, ".desktop") == 0) + { + apps tempapp; + GKeyFile *gfile = g_key_file_new(); + GError *err = NULL; + g_key_file_load_from_file(gfile, path, G_KEY_FILE_KEEP_TRANSLATIONS, NULL); + char *Type = g_key_file_get_string(gfile, "Desktop Entry", "Type", &err); + if (err) + { + printf("%s\n", err->message); + } + if (strcmp(Type, "Application") == 0) + tempapp.Type = 1; + else if (strcmp(Type, "pyApplication") == 0) + tempapp.Type = 2; + else + continue; + tempapp.Name = g_key_file_get_locale_string(gfile, "Desktop Entry", "Name", setlocale(LC_ALL, NULL), NULL); + if (tempapp.Name == NULL) + continue; + tempapp.Categories = g_key_file_get_string(gfile, "Desktop Entry", "Categories", NULL); + if (tempapp.Categories == NULL) + continue; + tempapp.Exec = g_key_file_get_string(gfile, "Desktop Entry", "Exec", NULL); + if (tempapp.Exec == NULL) + continue; + tempapp.Icon = g_key_file_get_string(gfile, "Desktop Entry", "Icon", NULL); + if (tempapp.Icon == NULL) + continue; + tempapp.Pluggable = g_key_file_get_boolean(gfile, "Desktop Entry", "Pluggable", NULL); + if (!tempapp.Pluggable) + tempapp.Pluggable = g_key_file_get_boolean(gfile, "Desktop Entry", "X-XfcePluggable", NULL); + if (tempapp.Pluggable) + tempapp.DualPluggable = g_key_file_get_boolean(gfile, "Desktop Entry", "X-UBLPluggable", NULL); + if (g_key_file_get_boolean(gfile, "Desktop Entry", "X-UBL-SettingsManager-Hidden", NULL) == 0) + if (size == 0) + { + applist = (apps *)malloc(size + 1 * sizeof(apps)); + applist[0].Name = yon_char_new(tempapp.Name); + applist[0].Categories = yon_char_new(tempapp.Categories); + applist[0].Exec = yon_char_new(tempapp.Exec); + applist[0].Icon = yon_char_new(tempapp.Icon); + applist[0].Type = tempapp.Type; + applist[0].Pluggable = tempapp.Pluggable; + applist[0].DualPluggable = tempapp.DualPluggable; + size++; + } + else + { + applist = (apps *)realloc(applist, (size + 1) * sizeof(apps)); + applist[size].Name = yon_char_new(tempapp.Name); + applist[size].Categories = yon_char_new(tempapp.Categories); + applist[size].Exec = yon_char_new(tempapp.Exec); + applist[size].Icon = yon_char_new(tempapp.Icon); + applist[size].Pluggable = tempapp.Pluggable; + applist[size].DualPluggable = tempapp.DualPluggable; + applist[size].Type = tempapp.Type; + size++; + } + } + } + } + } + } + *sizef = size; + return applist; +}; + +void yon_apps_sort(apps *applist, int size) +{ + apps tmp; + if (size > 2) + { + for (int i = 1; i < size; i++) + { + for (int j = 1; j < size; j++) + { + if (strcmp(applist[j].Name, applist[j - 1].Name) < 0) + { + tmp = applist[j]; + applist[j] = applist[j - 1]; + applist[j - 1] = tmp; + }; + } + }; + } +}; + +apps *yon_apps_get_by_name(apps *applist, char *name, int size) +{ + for (int i = 0; i < size; i++) + { + if (strcmp(applist[i].Name, name) == 0) + return &applist[i]; + } + return NULL; +}; + +//config functions + +typedef struct yon_config_parameter +{ + char *key; + void *data; + struct yon_config_parameter *next; + struct yon_config_parameter *prev; + struct yon_config_parameter *first; + DICT_TYPE data_type; + int flag1; + char *section; +} yon_config_parameter; + +yon_config_parameter *yon_config_parameter_new_with_data(char *key, void *data){ + yon_config_parameter *param = yon_remalloc(NULL,sizeof(yon_config_parameter)); + param->data=data; + param->data_type=DICTIONARY_CHAR_TYPE; + param->first=param; + param->flag1=0; + param->key=yon_char_new(key); + param->next=NULL; + param->prev=NULL; + param->section=NULL; + return param; +} + +yon_config_parameter *yon_config_parameter_append_with_data(yon_config_parameter *dict, char *key, void *data){ + yon_config_parameter *param = yon_config_parameter_new_with_data(key,data); + param->first=dict->first; + (param->prev)=(yon_config_parameter*)yon_dictionary_get_last((dictionary*)dict); + dict->next=param; + return param; +} + + +static yon_config_parameter *__yon__config__strings = NULL; +#define check_config if(__yon__config__strings&&__yon__config__strings->data_type==DICTIONARY_CHAR_TYPE) +#define for_config dictionary temp = NULL; for_dictionary(temp,(dictionary*)__yon__config__strings) +#define yon_config_parameter_add_or_create_if_exists_with_data(dict,key,data) {if (!dict) dict=yon_config_parameter_new_with_data(key,data); \ + else dict=yon_config_parameter_append_with_data(dict,key,data);} + +/**yon_config_load_register(char *command) + * [EN] + * + * [RU] + * Выполняет команду [command]. + * Полученные данные парсятся и регистрируются в конфиг. +*/ +int yon_config_load_register(YON_CONFIG_TYPE config_type,char *section,char *parameter, ...){ + if (__yon__config__strings){ + __yon__config__strings = yon_dictionary_free_all((dictionary*)__yon__config__strings,NULL); + } + va_list args; + va_start(args,parameter); + char *arg; + dictionary *sections = NULL; + { + if (sections&&yon_dictionary_get(§ions,section)) sections->data=(void*)yon_char_unite(yon_dictionary_get_data(sections,char*)," ",parameter,NULL); + else yon_dictionary_add_or_create_if_exists_with_data(sections,section,parameter); + } + while (arg=va_arg(args,char*)){ + char *key = va_arg(args,char*); + if (sections&&yon_dictionary_get(§ions,arg)) sections->data=(void*)yon_char_unite(yon_dictionary_get_data(sections,char*)," ",key,NULL); + else yon_dictionary_add_or_create_if_exists_with_data(sections,arg,key); + } + char *command=NULL; + dictionary *dict; + for_dictionaries(dict,sections){ + command = yon_char_unite(ubconfig_load_command,config_type==YON_CONFIG_GLOBAL ? " global get " : " system get ", dict->key," ", yon_dictionary_get_data(dict,char*),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); + char *final_str=yon_char_divide_search(str,"\n",-1); + yon_config_parameter_add_or_create_if_exists_with_data(__yon__config__strings,key,yon_char_new(final_str)); + __yon__config__strings->data_type=DICTIONARY_CHAR_TYPE; + __yon__config__strings->section=dict->key; + } + } + } + check_config + return 1; + else return 0; +} + +/**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((dictionary**)&__yon__config__strings,key); + if (dict){ + ((yon_config_parameter*)dict)->flag1=-1; + 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,(dictionary*)__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{ + yon_config_parameter *dict = (yon_config_parameter*)yon_dictionary_get((dictionary**)&__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); + 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, (dictionary*)__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, (dictionary*)__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{ + yon_config_parameter *dict = (yon_config_parameter*)yon_dictionary_get((dictionary**)&__yon__config__strings,key); + dict->data=data; + dict->flag1=1; + return 1; + } else return 0; +} + + +/**yon_config_append(char *key, void *data) + * [EN] + * + * [RU] + * Производит поиск по конфигу и дополняет значение параметра с ключом [key] значением [data]; +*/ +int yon_config_append(char *key, char *data){ + check_config{ + yon_config_parameter *dict = (yon_config_parameter*)yon_dictionary_get((dictionary**)&__yon__config__strings,key); + if (strcmp(((char*)dict->data),"")!=0) + dict->data=(void*)(yon_char_unite((char*)dict->data," ",data,NULL)); + else dict->data=(void*)data; + dict->flag1=1; + 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_config_parameter*)yon_dictionary_free_all((dictionary*)__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, char *config_section, void *data){ + if (!__yon__config__strings||!yon_dictionary_get((dictionary**)&__yon__config__strings,key)){ + yon_config_parameter_add_or_create_if_exists_with_data(__yon__config__strings,key,data); + } + else if (yon_dictionary_get((dictionary**)&__yon__config__strings,key)) __yon__config__strings->data=data; + __yon__config__strings->data_type=DICTIONARY_CHAR_TYPE; + __yon__config__strings->flag1=1; + __yon__config__strings->section=yon_char_new(config_section); +} + +/**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)); + 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_registered(char *path, char *section) + * [EN] + * Saves config with [command] + * [RU] + * Выполняет команду [command], добавляя в конец все записи конфига в таком виде: + * [ПАРАМЕТР1]="[значения1]" [ПАРАМЕТР2]="[значения2]" +*/ +int yon_config_save_registered(char *path, char *section){ + check_config{ + dictionary *dct; + dictionary *sections_add=NULL; + dictionary *sections_remove=NULL; + for_dictionaries(dct,(dictionary*)__yon__config__strings){ + if (dct->data&&strcmp(yon_dictionary_get_data(dct,char*),"")!=0){ + if (((yon_config_parameter*)dct)->flag1==1){ + ((yon_config_parameter*)dct)->flag1=0; + if (sections_add&&yon_dictionary_get(§ions_add,((yon_config_parameter*)dct)->section)) sections_add->data=(void*)yon_char_unite(yon_dictionary_get_data(sections_add,char*)," ",dct->key,"=",yon_dictionary_get_data(dct,char*),NULL); + else yon_dictionary_add_or_create_if_exists_with_data(sections_add,((yon_config_parameter*)dct)->section,yon_char_unite (ubconfig_save_command,path ? yon_char_append(" --target ",path):"", " set ", ((yon_config_parameter*)dct)->section, " ",dct->key,"=",yon_dictionary_get_data(dct,char*),NULL)); + } else if (((yon_config_parameter*)dct)->flag1==-1){ + ((yon_config_parameter*)dct)->flag1=0; + if (sections_remove&&yon_dictionary_get(§ions_remove,((yon_config_parameter*)dct)->section)) sections_remove->data=(void*)yon_char_unite(yon_dictionary_get_data(sections_remove,char*)," ",dct->key,NULL); + else yon_dictionary_add_or_create_if_exists_with_data(sections_remove,((yon_config_parameter*)dct)->section,yon_char_unite (ubconfig_save_command,path ? yon_char_append(" --target ",path):"", " remove ", ((yon_config_parameter*)dct)->section, " ",dct->key,NULL)); + } + } + } + if (sections_add) + for_dictionaries(dct,sections_add){ + char *command = yon_dictionary_get_data(dct,char*); + yon_launch(command); + } + if (sections_remove) + for_dictionaries(dct,sections_remove){ + char *command = yon_dictionary_get_data(dct,char*); + yon_launch(command); + } + + + // char *command = yon_char_unite(ubconfig_save_command,path ? yon_char_append(" --target ",path):"", " set ", section, " ", yon_dictionary_get_data(dct,char*),NULL); + // char *remove_command = yon_char_unite(ubconfig_save_command, path ? yon_char_append(" --target ",path):"", " remove "," ", yon_dictionary_get_data(dct,char*), section,NULL); + // dictionary *dict = NULL; + // int any_add = 0; + // int any_remove = 0; + // for_dictionaries(dict,(dictionary*)__yon__config__strings){ + // char *data = yon_dictionary_get_data(dict,char*); + // if (((yon_config_parameter*)dict)->flag1==1&&strcmp(data,"")!=0){ + // command = yon_char_unite(command, " ", dict->key,"=\"", yon_dictionary_get_data(dict,char*),"\"", NULL); + // any_add=1; + // } + // if (strcmp(data,"")==0){ + // remove_command = yon_char_unite(remove_command, " ", dict->key, NULL); + // any_remove=1; + // } + // } + // if (any_add) yon_launch(command); + // if (any_remove) yon_launch(remove_command); + return 1; + } else return 1; +} + +/**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,(dictionary*)__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)); + conf[*size-1] = NULL; + return conf; + } else return NULL; +} + +/**char *yon_config_get_parameter(config parameters, int size, char *param) + * [EN] + * Gets parameter [param] from parameter list [parameters] of size [size]; + * or NULL if nothing were found + * [RU] + * Возвращает параметр [param] из массива строк [parameters] размером [size] + * или NULL если такой не был найден +*/ +char *yon_config_get_parameter(config_str parameters, int size, char *param) +{ + if (param[0]==' ') + yon_char_divide_search(param," ",-1); + param=yon_char_divide_search(yon_char_new(param)," ",-1); + + char *str = NULL; + for (int j = 0; j < size; j++) + { + char *name = yon_char_divide_search(yon_char_new(parameters[j]), "=", 1); + if (name) + { + if (strcmp(name, param) == 0) + { + str = yon_char_divide_search(yon_char_new(parameters[j]), "\n", 1); + if (strcmp(str, "") != 0 && strcmp(str, "(null)") != 0) + return str; + else + return NULL; + } + } + } + return NULL; +} + + + +// terminal-using functions + +/**yon_launch_app_with_arguments(char *name, char *args) + * [EN] + * Execute [command] in separate thread; + * [RU] + * Выполнить команду [command] в отдельном потоке; +*/ +int yon_launch_app_with_arguments(char *name, char *args) +{ + char *path = yon_char_unite("/usr/bin/", name, " ", args,NULL); + pthread_t thread_id; + char *command = NULL; + command = path; + pthread_create(&thread_id, NULL, (void *)yon_launch, command); +}; + +/**yon_launch(char *command) + * [EN] + * Execute command [command] + * [RU] + * Выполнить команду [command] +*/ +void yon_launch(char *command) +{ + system(command); +} + +// Gtk functions + + +#ifdef __GTK_H__ + + +static render_data render; + +#ifdef VTE_TERMINAL + +static void child_ready(VteTerminal *terminal, GPid pid, GError *error, gpointer user_data) +{ + if (!terminal) return; + if (pid == -1) printf("Error\n\n\n"); + else vte_terminal_feed_child(VTE_TERMINAL(terminal),(char*)user_data,strlen((char*)user_data)); +} + +/** + * void yon_terminal_integrated_launch(GtkWidget *place_to_show, void *endwork_function, void* endwork_function_argument) + * [EN] + * launches terminal with specific [command], + * terminal is shown in [place_to_show] container, + * after terminal done its work [endwork_function] is called with [endwork_function_argument] argument. + * [RU] + * Запускает терминал с командой [command], + * терминал добавляется в контейнер [place_to_show] виджета, + * после завершения работы терминала вызывается функция [endwork_function] с аргументом [endwork_function_argument]. +*/ +void yon_terminal_integrated_launch(GtkWidget *place_to_show, char* command, void *endwork_function, void* endwork_function_argument){ + char **commands=new_arr(char*,2); + gchar **envp = g_get_environ(); + commands[0]=(gchar *)g_strdup(g_environ_getenv(envp, "SHELL")); + commands[1]=NULL; + char **env=new_arr(char*,2); + env[0]=""; + env[1]=NULL; + GtkWidget *terminal = vte_terminal_new(); + vte_terminal_set_size(VTE_TERMINAL(terminal),10,15); + VtePty *pty = vte_pty_new_sync(VTE_PTY_DEFAULT,NULL,NULL); + vte_terminal_set_pty(VTE_TERMINAL(terminal),pty); + 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) + + typedef struct { + char *parameter_name; + enum YON_TYPE containing_type; + GtkWidget *track_widget; + char *property_name; + } __yon_listener_parameter; + + typedef struct { + char *parameter_name; + char *section; + enum YON_TYPE containing_type; + void *property; + } __yon_custom_parameter; + + struct { + int x; + int y; + int width; + int height; + int fullscreen; + dictionary *custom_listeners; + dictionary *custom_parameters; + dictionary *deleted_parameters; + } __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); + dictionary *dict=NULL; + if (__yon_main_window_config.custom_listeners) + for_dictionaries(dict,__yon_main_window_config.custom_listeners){ + __yon_listener_parameter *param = yon_dictionary_get_data(dict,__yon_listener_parameter*); + GValue *val = g_malloc0(sizeof(GValue)); + g_object_get_property(G_OBJECT(param->track_widget),param->property_name,val); + switch(param->containing_type){ + case YON_TYPE_STRING: + g_key_file_set_string(__yon_window_config_file,"window",param->parameter_name, g_value_get_string(val)); + break; + case YON_TYPE_INT: + g_key_file_set_integer(__yon_window_config_file,"window",param->parameter_name, g_value_get_int(val)); + break; + case YON_TYPE_BOOLEAN: + g_key_file_set_boolean(__yon_window_config_file,"window",param->parameter_name, g_value_get_boolean(val)); + break; + case YON_TYPE_OTHER:printf("\033[0;31mCannot save %s property with %s key\033[0m\n",param->property_name,param->parameter_name);break; + } + } + if (__yon_main_window_config.custom_parameters) + for_dictionaries(dict,__yon_main_window_config.custom_parameters){ + __yon_custom_parameter *param = yon_dictionary_get_data(dict,__yon_custom_parameter*); + switch (param->containing_type){ + case YON_TYPE_STRING: + g_key_file_set_string(__yon_window_config_file,param->section,param->parameter_name, (char*)param->property); + break; + case YON_TYPE_INT: + g_key_file_set_integer(__yon_window_config_file,param->section,param->parameter_name, *(int*)param->property); + break; + case YON_TYPE_BOOLEAN: + g_key_file_set_boolean(__yon_window_config_file,param->section,param->parameter_name, *(gboolean*)param->property); + break; + default: + break; + } + } + if (__yon_main_window_config.deleted_parameters) + for_dictionaries(dict,__yon_main_window_config.deleted_parameters){ + __yon_custom_parameter *param = yon_dictionary_get_data(dict,__yon_custom_parameter*); + g_key_file_remove_key(__yon_window_config_file,param->section,param->parameter_name,NULL); + } + 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) gtk_window_get_position(__yon_window_config_target_window,&__yon_main_window_config.x,&__yon_main_window_config.y); + } + + /**yon_on_configured_window_destroy(GtkWidget* self,GdkEvent* event) + * [EN] + * + * [RU] + * Сохраняет настройки основного окна. Вызывается когда основное окно уничтожается. + */ + void yon_on_configured_window_destroy(GtkWidget* self,GdkEvent* event){ + check_window_config_setup{ + yon_get_is_fullscreen(); + yon_window_config_save(); + } + gtk_main_quit(); + } + + void __yon_window_config_on_resize(){ + int max=0; + max=gtk_window_is_maximized(__yon_window_config_target_window); + if(max==0){ + gtk_window_get_size(__yon_window_config_target_window,&__yon_main_window_config.width,&__yon_main_window_config.height); + gtk_window_get_position(__yon_window_config_target_window,&__yon_main_window_config.x,&__yon_main_window_config.y); + } + } + + /**yon_window_config_setup(GtkWindow *window) + * [EN] + * + * [RU] + * Устанавливает указатель на окно для отслеживания его положения и размера + */ + void yon_window_config_setup(GtkWindow *window){ + __yon_window_config_target_window = window; + g_signal_connect(G_OBJECT(window),"delete-event",G_CALLBACK(yon_on_configured_window_destroy),NULL); + g_signal_connect(G_OBJECT(window),"check-resize"/*"configure-event"*/,G_CALLBACK(__yon_window_config_on_resize),NULL); + } + + void _yon_maximize(void *data){ + g_usleep(G_USEC_PER_SEC/10); + if(__yon_main_window_config.fullscreen ==1) gtk_window_maximize(__yon_window_config_target_window); + } + + /**yon_window_config_load(char *path) + * [EN] + * + * [RU] + * Загружает конфиг окна и инициализирует отслеживание его параметров + */ + int yon_window_config_load(char *path){ + __yon_window_config_file = g_key_file_new(); + __yon_window_config_path=yon_char_new(path); + if (!g_key_file_load_from_file(__yon_window_config_file,__yon_window_config_path,G_KEY_FILE_NONE,NULL)){ + struct stat st; + int size; + config_str conf = yon_char_parse(yon_char_new(__yon_window_config_path),&size,"/"); + char *path = yon_char_unite(conf[0],"/",conf[1],"/",conf[2],"/",conf[3],"/",conf[4],"/",NULL); + if (stat(path, &st) == -1) { + mkdir(path, 0777); + } + FILE *fp; + fp=fopen(__yon_window_config_path,"w"); + fclose(fp); + g_key_file_load_from_file(__yon_window_config_file,__yon_window_config_path,G_KEY_FILE_NONE,NULL); + } + __yon_main_window_config.x = g_key_file_get_integer(__yon_window_config_file,"window","WindowPosX",NULL); + __yon_main_window_config.y = g_key_file_get_integer(__yon_window_config_file,"window","WindowPosY",NULL); + __yon_main_window_config.width = g_key_file_get_integer(__yon_window_config_file,"window","WindowWidth",NULL); + __yon_main_window_config.height = g_key_file_get_integer(__yon_window_config_file,"window","WindowHeight",NULL); + __yon_main_window_config.fullscreen = g_key_file_get_integer(__yon_window_config_file,"window","fullscreen",NULL); + dictionary *dict=NULL; + if (__yon_main_window_config.custom_listeners) + for_dictionaries(dict,__yon_main_window_config.custom_listeners){ + __yon_listener_parameter *param = yon_dictionary_get_data(dict,__yon_listener_parameter*); + GValue *val = g_malloc0(sizeof(GValue)); + g_object_get_property(G_OBJECT(param->track_widget),param->property_name,val); + switch(param->containing_type){ + case YON_TYPE_STRING: + g_value_set_string(val,g_key_file_get_string(__yon_window_config_file,"window",param->parameter_name, NULL)); + break; + case YON_TYPE_INT: + g_value_set_int(val,g_key_file_get_integer(__yon_window_config_file,"window",param->parameter_name, NULL)); + break; + case YON_TYPE_BOOLEAN: + gboolean res = g_key_file_get_boolean(__yon_window_config_file,"window",param->parameter_name, NULL); + g_value_set_boolean(val,res); + break; + default:printf("\033[0;31mCannot load %s property with %s key\033[0m\n",param->property_name,param->parameter_name);break; + } + g_object_set_property(G_OBJECT(param->track_widget),param->property_name,val); + } + 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); + } + + config_str yon_window_config_get_section(char *section, gsize *size){ + config_str key = g_key_file_get_keys(__yon_window_config_file,section,size,NULL); + return key; + } + + /**yon_window_config_add_custom_parameter(GtkWidget *widget, char *param_name, char *widget_property) + * [EN] + * + * [RU] + * Добавляет параметр виджета [widget] по названию [widget_property] для отслеживания и сохраняет его в конфиг под ключом [param_name]. + */ + void yon_window_config_add_listener(GtkWidget *widget, char *param_name, char *widget_property, enum YON_TYPE val_type){ + __yon_listener_parameter *param = NULL; + param = yon_remalloc(param,sizeof(__yon_listener_parameter)); + param->parameter_name = yon_char_new(param_name); + param->track_widget = widget; + param->property_name = yon_char_new(widget_property); + param->containing_type = val_type; + yon_dictionary_add_or_create_if_exists_with_data(__yon_main_window_config.custom_listeners,param->parameter_name,param); + } + + void yon_window_config_add_custom_parameter(char *param_name, char *section, void *tracked_value, enum YON_TYPE val_type){ + __yon_custom_parameter *param = NULL; + param = yon_remalloc(param,sizeof(__yon_custom_parameter)); + param->parameter_name = yon_char_new(param_name); + param->section=section; + param->property = tracked_value; + param->containing_type = val_type; + yon_dictionary_add_or_create_if_exists_with_data(__yon_main_window_config.custom_parameters,param->parameter_name,param); + } + + void yon_window_config_erase_custom_parameter(char *param_name, char *section){ + __yon_custom_parameter *param = NULL; + param = yon_remalloc(param,sizeof(__yon_custom_parameter)); + param->parameter_name=param_name; + param->section=section; + yon_dictionary_add_or_create_if_exists_with_data(__yon_main_window_config.deleted_parameters,param->parameter_name,param); + } + +GtkWidget *yon_ubl_menu_item_about_new(char *buttonname){ + GtkWidget *menu_item = gtk_menu_item_new(); + gtk_style_context_add_class(gtk_widget_get_style_context(menu_item),"menuitembottom"); + GtkWidget *box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL,0); + GtkWidget *label = gtk_label_new(buttonname); + GtkWidget *image = gtk_image_new_from_icon_name("dialog-information-symbolic",GTK_ICON_SIZE_BUTTON); + gtk_label_set_xalign(GTK_LABEL(label),0.0); + gtk_box_pack_start(GTK_BOX(box),image,0,0,5); + gtk_box_pack_start(GTK_BOX(box),label,0,0,5); + gtk_container_add(GTK_CONTAINER(menu_item),box); + gtk_widget_show_all(menu_item); + return menu_item; +} + +GtkWidget *yon_ubl_menu_item_documentation_new(char *buttonname){ + GtkWidget *menu_item = gtk_menu_item_new(); + gtk_style_context_add_class(gtk_widget_get_style_context(menu_item),"menuitemtop"); + GtkWidget *box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL,0); + GtkWidget *label = gtk_label_new(buttonname); + GtkWidget *image = gtk_image_new_from_icon_name("dialog-question-symbolic",GTK_ICON_SIZE_BUTTON); + gtk_label_set_xalign(GTK_LABEL(label),0.0); + gtk_box_pack_start(GTK_BOX(box),image,0,0,5); + gtk_box_pack_start(GTK_BOX(box),label,0,0,5); + gtk_container_add(GTK_CONTAINER(menu_item),box); + gtk_widget_show_all(menu_item); + return menu_item; +} + + +// other Gtk functions + +/**yon_gtk_combo_box_text_fill(GtkWidget *combo, config_str parameters,int size) + * [EN] + * + * [RU] + * Добавляет в Комбобокс [combo] все строки из массива строк [parameters] размера [size] +*/ +int yon_gtk_combo_box_text_fill(GtkWidget *combo, config_str parameters,int size){ + if (combo&¶meters){ + for (int i=0;i=0 ? 1 : 0); +} + +void yon_gtk_widget_set_sensitive_from_toggle_combo_box_inversed(GtkComboBox *toggle, GtkWidget *target){ + gtk_widget_set_sensitive(target,!gtk_combo_box_get_active(toggle)>=0 ? 0 : 1); +} + +void _yon_ubl_header_setup(GtkWidget *Overlay, GtkWidget *Head, GtkWidget *Image, char *image_path) +{ + gtk_overlay_add_overlay(GTK_OVERLAY(Overlay), Head); + gtk_image_set_from_file(GTK_IMAGE(Image), image_path); +} + +void _yon_ubl_header_setup_resource(GtkWidget *Overlay, GtkWidget *Head, GtkWidget *Image, char *image_path) +{ + gtk_overlay_add_overlay(GTK_OVERLAY(Overlay), Head); + gtk_image_set_from_resource(GTK_IMAGE(Image), image_path); +} + +int yon_ubl_status_box_setup(GtkWidget *icon, GtkWidget *box, GtkWidget *label) +{ + if(icon&&box&&label){ + render.icon=icon; + render.box=box; + render.label=label; + return 1; + } else return 0; +} + +void _yon_ubl_status_box_render(char *text, BACKGROUND_IMAGE_TYPE type) +{ + render_data data = render; + GtkIconTheme *ictheme = gtk_icon_theme_get_default(); + GError *err = NULL; + if (err) + { + printf("%s\n", err->message); + 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..fba6c98 --- /dev/null +++ b/source/ubl-utils.h @@ -0,0 +1,378 @@ +#ifndef UBL_UTILS +#define UBL_UTILS +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "../compile/ubl-cmake.h" +#ifdef WEBKIT_FOUND + #include +#endif +#define DesktopPath "/usr/share/applications/" + +#define for_dictionaries(obj, obj1) for (obj = obj1->first; obj != NULL; obj = obj->next) + +#define new(type) malloc(sizeof(type)) +#define new_arr(type,size) malloc(sizeof(type)*size) + +#define get_home_dir_command yon_char_unite("getent passwd \"",yon_ubl_root_user_get(),"\" | cut -d: -f6",NULL) + + + +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; +} dictionary; + + + + +typedef struct apps +{ + char *Name; + int Type; + char *Categories; + char *Exec; + char *Icon; + int Pluggable; + int DualPluggable; +} apps; + +typedef char** config_str; + +#define config(key) yon_config_get_by_key(key) + +#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 + +int yon_char_find_last(char *source, char find); + +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(); + +char *yon_ubl_user_get_home_directory(); + +// 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 functions + +#define ubconfig_save_command "ubconfig" +#define ubconfig_load_command "ubconfig --source" + +typedef enum { + YON_CONFIG_LOCAL=0, + YON_CONFIG_GLOBAL, + YON_CONFIG_BOTH +} YON_CONFIG_TYPE; + +config_str yon_config_load(char *command, int *str_len); + +int yon_config_save_registered(char *path, char *section); + +char *yon_config_get_parameter(config_str parameters, int size, char *param); + +int yon_config_load_register(YON_CONFIG_TYPE config_type,char *section,char *parameter, ...); + +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, char* config_section, 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 + +enum YON_TYPE{ + YON_TYPE_STRING, + YON_TYPE_INT, + YON_TYPE_BOOLEAN, + YON_TYPE_OTHER +}; + +GtkWidget *yon_ubl_menu_item_about_new(char *buttonname); +GtkWidget *yon_ubl_menu_item_documentation_new(char *buttonname); + +/**yon_gtk_builder_get_widget(builder, widget_name) + * [EN] + * Returns GtkWidget from GtkBuilder *[builder]. + * [builder] is GtkBuilder*; + * [widget_name] is id of widget; +*/ +#define yon_gtk_builder_get_widget(builder, widget_name) GTK_WIDGET(gtk_builder_get_object(builder, widget_name)) + +typedef struct +{ + GtkWidget *Icon; + GtkWidget *Label; + GtkWidget *IconView; + GtkListStore *List; +} expander_icon_view; + +void yon_window_config_setup(GtkWindow *window); + +int yon_window_config_load(char *path); + +config_str yon_window_config_get_section(char *section, gsize *size); + +void yon_window_config_add_listener(GtkWidget *widget, char *param_name, char *widget_property, enum YON_TYPE val_type); + +void yon_window_config_add_custom_parameter(char *param_name, char *section, void *tracked_value, enum YON_TYPE val_type); + +void yon_window_config_erase_custom_parameter(char *param_name, char *section); + +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, ...); + + +void yon_gtk_widget_set_sensitive_from_toggle_button(GtkToggleButton *toggle, GtkWidget *target); +void yon_gtk_widget_set_sensitive_from_toggle_button_inversed(GtkToggleButton *toggle, GtkWidget *target); +void yon_gtk_widget_set_sensitive_from_combo_box(GtkComboBox *toggle, GtkWidget *target); +void yon_gtk_widget_set_sensitive_from_combo_box_inversed(GtkComboBox *toggle, GtkWidget *target); + +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-keyboard b/ubl-settings-keyboard new file mode 100755 index 0000000000000000000000000000000000000000..84e08fff468b8f7833b74fe4284d755c1162a1f1 GIT binary patch literal 262488 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 z + + + + + True + False + emblem-ok-symbolic + + + True + False + process-stop-symbolic + + + + + + + + + + + 450 + 550 + True + False + dialog + + + False + 3 + 3 + 3 + 3 + vertical + 5 + + + False + end + + + Cancel + True + True + True + image2 + + + True + True + 0 + + + + + Accept + True + True + True + image1 + + + True + True + 1 + + + + + False + False + 0 + + + + + True + True + in + + + True + True + liststore1 + False + + + column + + + + 1 + + + + + + + + + True + True + 1 + + + + + + + True + False + True + + + True + False + 5 + 5 + 5 + 5 + 2 + Keyboard + + + + + + + + True + False + 5 + 5 + 5 + 5 + 6 + 6 + 32 + com.ublinux.ubl-settings-keyboard + + + + + + + diff --git a/ubl-settings-keyboard-options.glade b/ubl-settings-keyboard-options.glade new file mode 100644 index 0000000..d9d8518 --- /dev/null +++ b/ubl-settings-keyboard-options.glade @@ -0,0 +1,145 @@ + + + + + + + 450 + 550 + True + False + dialog + + + False + 3 + 3 + 3 + 3 + vertical + 5 + + + False + end + + + Cancel + True + True + True + image2 + + + True + True + 0 + + + + + Accept + True + True + True + image1 + + + True + True + 1 + + + + + False + False + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + True + False + True + + + True + False + 5 + 5 + 5 + 5 + 2 + Keyboard + + + + + + + + True + False + 5 + 5 + 5 + 5 + 6 + 6 + 32 + com.ublinux.ubl-settings-keyboard + + + + + + + + True + False + emblem-ok-symbolic + + + True + False + process-stop-symbolic + + diff --git a/ubl-settings-keyboard.css b/ubl-settings-keyboard.css new file mode 100644 index 0000000..88e8c57 --- /dev/null +++ b/ubl-settings-keyboard.css @@ -0,0 +1,114 @@ + +.thin { + margin:0px; + padding:0px; +} +.noborder { + border:none; +} +.nobackground { +background:transparent; +} +.nobackground:active { +background:transparent; +} +.textHead{ + text-shadow: 2px 2px @theme_bg_color; + color: @theme_text_color; +} + +.inherited>* { + 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: 3px 10px 3px 5px; + /* padding: 5px 0px 3px 5px; */ + border:transparent; + } + .menuitemmiddle>*{ + margin:0 2px 0 2px; + padding: 3px 10px 3px 5px; + /* padding: 3px 0px 3px 5px; */ + border:transparent; + } + .menuitembottom>*{ + margin:0 2px 2px 2px; + padding: 3px 10px 3px 5px; + /* padding: 3px 0px 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: 3px 10px 3px 5px; + /* padding: 5px 0 3px 5px; */ + background:@theme_selected_bg_color; + border-radius:2px; + } + .menuitemmiddle:hover>* { + margin:0 2px 0px 2px; + padding: 3px 10px 3px 5px; + /* padding: 3px 0px 3px 5px; */ + background:@theme_selected_bg_color; + border-radius:2px; + } + .menuitembottom:hover>* { + margin:0 2px 2px 2px; + padding: 3px 10px 3px 5px; + /* padding: 3px 0px 5px 5px; */ + background:@theme_selected_bg_color; + border-radius:2px; + } + .boxInfoMessError{ + background-color: #ea9999; +} + +.boxInfoMessOK{ + background-color: #f3f0ac; +} \ No newline at end of file diff --git a/ubl-settings-keyboard.desktop b/ubl-settings-keyboard.desktop new file mode 100644 index 0000000..a1c10e7 --- /dev/null +++ b/ubl-settings-keyboard.desktop @@ -0,0 +1,15 @@ +[Desktop Entry] +Encoding=UTF-8 +Name=Keyboard configuration +Name[ru]=TEMPLATE +GenericName=ubl-settings-keyboard +GenericName[ru]=TEMPLATE +Comment=Keyboard configuration +Comment[ru]=Приложение для TEMPLATE +Type=Application +Exec=pkexec ubl-settings-keyboard +Icon=com.ublinux.ubl-settings-keyboard +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-keyboard.glade b/ubl-settings-keyboard.glade new file mode 100644 index 0000000..ca3c67e --- /dev/null +++ b/ubl-settings-keyboard.glade @@ -0,0 +1,1229 @@ + + + + + + + + + + False + False + True + center + com.ublinux.ubl-settings-keyboard + dialog + True + ubl-settings-keyboard + 1.1 + Copyright © 2022 - 2023, UBSoft LLC + Keyboard + https://wiki.ublinux.ru/ru/Программное_обеспечение/Программы_и_утилиты/Все/ubl-settings-keyboard + 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-keyboard + True + gpl-2-0 + + + True + False + vertical + 2 + + + False + end + + + False + False + 1 + + + + + + + True + False + True + + + True + False + 5 + 5 + 5 + 5 + 2 + Keyboard + + + + + + + + + + True + False + center + + + 90 + True + False + 5 + 5 + 5 + 5 + 6 + 6 + 69 + com.ublinux.ubl-settings-keyboard + + + False + True + 0 + + + + + True + False + + + True + False + + + True + False + center + vertical + + + 255 + True + False + end + Keyboard + 0 + + + + + + + + True + True + 0 + + + + + 255 + True + False + start + Keyboard configuration + 0 + + + + + + + + True + True + 1 + + + + + False + True + 0 + + + + + True + True + 0 + + + + + True + True + 1 + + + + + + True + False + user-trash-symbolic + + + True + False + value-increase-symbolic + + + True + False + document-edit-symbolic + + + 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 + Keyboard + + + + + + + + + + + + + + + + + + + + + + + + + + Default + + + + + + True + False + False + + + True + False + Load global configuration + + + + + + True + False + Load local configuration + + + + + + True + False + False + False + + + True + False + False + + + True + False + Save configuration + + + + + + True + False + Save to global configuration + + + + + + True + False + Save to local configuration + + + + + + True + False + + + True + False + + + 800 + 600 + False + 800 + 600 + com.ublinux.ubl-settings-keyboard + + + 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 + 5 + + + True + False + 0.019999999552965164 + in + + + True + False + 5 + 5 + 5 + + + True + False + 5 + + + True + False + Num Lock on boot: + + + False + True + 0 + + + + + True + False + 0 + + Default + On + Off + + + + True + True + 1 + + + + + + + + + True + False + Console + + + + + False + True + 0 + + + + + True + False + 0.019999999552965164 + in + + + True + False + 5 + 5 + 5 + + + True + False + vertical + 6 + + + True + False + 5 + + + True + False + Keyboard Model: + 0 + + + False + True + 0 + + + + + True + False + liststore2 + 0 + + + + 0 + + + + + True + True + 1 + + + + + False + True + 0 + + + + + True + False + 5 + + + True + False + vertical + 5 + + + True + True + in + + + True + True + liststore1 + False + + + + + + column + + + + 0 + + + + + + + + + True + True + 0 + + + + + True + True + 0 + + + + + True + False + vertical + 5 + + + True + True + True + + + True + True + False + True + menu4 + up + + + + + + + + + + False + True + 0 + + + + + True + True + True + + + True + True + False + True + menu5 + + + + + + + + + + False + True + 1 + + + + + True + True + True + image3 + + + + False + True + 2 + + + + + True + True + True + image1 + + + + False + True + 4 + + + + + False + True + 1 + + + + + True + True + end + 2 + + + + + True + False + Keyboard layouts: + 0 + + + False + True + end + 4 + + + + + True + False + 5 + + + True + False + KEYBOARD: + 0 + + + False + True + 0 + + + + + True + True + + + True + True + 1 + + + + + False + True + 4 + + + + + True + False + 5 + + + True + False + Keyboard options: + 0 + + + False + True + 0 + + + + + True + True + + + True + True + 1 + + + + + True + True + True + image4 + + + + False + True + 2 + + + + + False + True + 7 + + + + + + + + + True + False + Keyboard + + + + + True + True + 3 + + + + + False + True + 2 + + + + + True + True + 0 + + + + + + + True + False + True + + + True + False + 5 + 5 + 5 + 5 + 2 + Keyboard + + + + + + + + True + False + 5 + 5 + 5 + 5 + 6 + 6 + 32 + com.ublinux.ubl-settings-keyboard + + + + + 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-keyboard.pot b/ubl-settings-keyboard.pot new file mode 100644 index 0000000..6273a6d --- /dev/null +++ b/ubl-settings-keyboard.pot @@ -0,0 +1,171 @@ +# Language translations for ubl-settings-keyboard package. +# Copyright (C) 2022, UBTech LLC +# This file is distributed under the same license as the ubl-settings-keyboard package. +# UBLinux Team , 2022 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: ubl-settings-keyboard 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-keyboard version:" +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:4 +msgid "Keyboard" +msgstr "" + +#: source/ubl-strings.h:5 +msgid "Keyboard 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:12 +msgid "Save to local configuration" +msgstr "" + +#: source/ubl-strings.h:13 +msgid "Save to global configuration" +msgstr "" + +#: source/ubl-strings.h:14 +msgid "Save configuration" +msgstr "" + +#: source/ubl-strings.h:15 +msgid "Save" +msgstr "" + +#: source/ubl-strings.h:16 +msgid "Load local configuration" +msgstr "" + +#: source/ubl-strings.h:17 +msgid "Load global configuration" +msgstr "" + +#: source/ubl-strings.h:18 +msgid "Load" +msgstr "" + +#: source/ubl-strings.h:20 +msgid "Cancel" +msgstr "" + +#: source/ubl-strings.h:22 +msgid "Would you like to read documentation in the Web?" +msgstr "" + +#: source/ubl-strings.h:23 +msgid "" +"You will be redirected to documentation website where documentation is\n" +"translated and supported by community." +msgstr "" + +#: source/ubl-strings.h:24 +msgid "Always redirect to online documentation" +msgstr "" + +#: source/ubl-strings.h:25 +msgid "Open documentation" +msgstr "" + +#: source/ubl-strings.h:26 +msgid "Project Home Page" +msgstr "" + +#: source/ubl-strings.h:27 +msgid "Nothing were chosen" +msgstr "" + +#: source/ubl-strings.h:30 +msgid "Global configuration loading succseeded." +msgstr "" + +#: source/ubl-strings.h:31 +msgid "Local configuration loading succseeded." +msgstr "" + +#: source/ubl-strings.h:33 +msgid "Local and global configuration saving succseeded." +msgstr "" + +#: source/ubl-strings.h:34 +msgid "Global configuration saving succseeded." +msgstr "" + +#: source/ubl-strings.h:35 +msgid "Local configuration saving succseeded." +msgstr "" diff --git a/ubl-settings-keyboard_ru.po b/ubl-settings-keyboard_ru.po new file mode 100644 index 0000000..7b2a798 --- /dev/null +++ b/ubl-settings-keyboard_ru.po @@ -0,0 +1,177 @@ +# Russian translations for ubl-settings-keyboard package. +# Copyright (C) 2022, UBTech LLC +# This file is distributed under the same license as the ubl-settings-keyboard package. +# UBLinux Team , 2022 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: ubl-settings-keyboard 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-keyboard version:" +msgstr "Версия ubl-settings-keyboard: " + +#: source/ubl-strings.h:2 +msgid "TEMPLATE settings" +msgstr "Настройки TEMPLATE" + +#: 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 +#, fuzzy +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:4 +msgid "Keyboard" +msgstr "Клавиатура" + +#: source/ubl-strings.h:5 +msgid "Keyboard 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:12 +msgid "Save to local configuration" +msgstr "Сохранить в локальную конфигурацию" + +#: source/ubl-strings.h:13 +msgid "Save to global configuration" +msgstr "Сохранить в глобальную конфигурацию" + +#: source/ubl-strings.h:14 +msgid "Save configuration" +msgstr "Сохранить конфигурацию" + +#: source/ubl-strings.h:15 +msgid "Save" +msgstr "Сохранить" + +#: source/ubl-strings.h:16 +msgid "Load local configuration" +msgstr "Загрузить локальную конфигуруцию" + +#: source/ubl-strings.h:17 +msgid "Load global configuration" +msgstr "Загрузить глобальную конфигурацию" + +#: source/ubl-strings.h:18 +msgid "Load" +msgstr "Загрузить" + +#: source/ubl-strings.h:20 +msgid "Cancel" +msgstr "Отмена" + +#: source/ubl-strings.h:22 +msgid "Would you like to read documentation in the Web?" +msgstr "Вы хотите прочитать справку в Сети?" + +#: source/ubl-strings.h:23 +msgid "" +"You will be redirected to documentation website where documentation is\n" +"translated and supported by community." +msgstr "" +"Вы будете перенаправлены на сайт с документацией, где страницы помощи\n" +"переводятся и поддерживаются сообществом." + +#: source/ubl-strings.h:24 +msgid "Always redirect to online documentation" +msgstr "Всегда перенаправлять" + +#: source/ubl-strings.h:25 +msgid "Open documentation" +msgstr "Прочитать справку" + +#: source/ubl-strings.h:26 +msgid "Project Home Page" +msgstr "Домашняя страница проекта" + +#: source/ubl-strings.h:27 +msgid "Nothing were chosen" +msgstr "Ничего не было выбрано" + +#: source/ubl-strings.h:30 +msgid "Global configuration loading succseeded." +msgstr "Успешно загружена глобальная конфигурация" + +#: source/ubl-strings.h:31 +msgid "Local configuration loading succseeded." +msgstr "Успешно загружена локальная конфигурация" + +#: source/ubl-strings.h:33 +msgid "Local and global configuration saving succseeded." +msgstr "Успешно записаны локальная и глобальная конфигурация" + +#: source/ubl-strings.h:34 +msgid "Global configuration saving succseeded." +msgstr "Успешно записана глобальная конфигурация" + +#: source/ubl-strings.h:35 +msgid "Local configuration saving succseeded." +msgstr "Успешно записана локальная конфигурация" From 29ea6d8dbd372ba44cf3bc28b1049c46617b895b Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Wed, 20 Sep 2023 15:34:26 +0600 Subject: [PATCH 2/7] Saving test version --- source/ubl-settings-keyboard.c | 146 ++++++++++++++++++++++++++++++--- source/ubl-settings-keyboard.h | 7 +- source/ubl-utils.c | 8 +- source/ubl-utils.h | 2 +- ubl-settings-keyboard | Bin 262488 -> 273696 bytes ubl-settings-keyboard.glade | 3 + 6 files changed, 146 insertions(+), 20 deletions(-) diff --git a/source/ubl-settings-keyboard.c b/source/ubl-settings-keyboard.c index f71ba59..6f28c63 100644 --- a/source/ubl-settings-keyboard.c +++ b/source/ubl-settings-keyboard.c @@ -102,11 +102,103 @@ void on_about(){ //functions -void yon_load_proceed(YON_CONFIG_TYPE type){ - if (yon_config_load_register(type,"keyboard","XkbModel","keyboard","XkbLayout","keyboard","KEYBOARD","keyboard","KEYTABLE","keyboard","GRP_TOGGLE","keyboard","XkbOptions",NULL)) - yon_ubl_status_box_render(LOCAL_SAVE_SUCCESS_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); - else - yon_ubl_status_box_render(LOAD_FAILED_LABEL,BACKGROUND_IMAGE_FAIL_TYPE); +void yon_load_proceed(YON_CONFIG_TYPE type, main_window *widgets){ + if (yon_config_load_register(type,"keyboard","XkbModel","keyboard","XkbLayout","keyboard","KEYBOARD","keyboard","XkbOptions","config","NUMLOCK",NULL)){ + GtkTreeIter iter; + char *name = yon_config_get_by_key("XkbModel"); + char *id; + if (name) { + int valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(widgets->modelsList),&iter); + for (;valid;valid=gtk_tree_model_iter_next(GTK_TREE_MODEL(widgets->modelsList),&iter)){ + gtk_tree_model_get(GTK_TREE_MODEL(widgets->modelsList),&iter,0,&id,-1); + if (!strcmp(name,id)){ + gtk_combo_box_set_active_iter(GTK_COMBO_BOX(widgets->ModelCombo),&iter); + break; + } + } + } else gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->ModelCombo),0); + free(name); + name = yon_config_get_by_key("XkbOptions"); + if (name) { + char *id, *rname; + gtk_entry_set_text(GTK_ENTRY(widgets->OptionsEntry),name); + int valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(main_config.options_list),&iter); + for (;valid;valid=gtk_tree_model_iter_next(GTK_TREE_MODEL(main_config.options_list),&iter)){ + gtk_tree_model_get(GTK_TREE_MODEL(main_config.options_list),&iter,0,&id,1,&rname,-1); + if (!strcmp(id,name)) gtk_entry_set_text(GTK_ENTRY(widgets->OptionsEntry),rname); + } + } + free(name); + name = yon_config_get_by_key("NUMLOCK"); + if (name) { + if (!strcmp(name,"yes")) gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->NumLockCombo),1); + else if (!strcmp(name,"no")) gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->NumLockCombo),2); + } + else gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->NumLockCombo),0); + free(name); + if (main_config.layouts_list){ + int size=0; + name = yon_config_get_by_key("XkbLayout"); + config_str layouts = yon_char_parse(name,&size,","); + GtkTreeIter iter; + char *rid,*rname; + gtk_list_store_clear(widgets->layoutsList); + for (int i=0;ilayoutsList,&iter); + gtk_list_store_set(widgets->layoutsList,&iter,0,rname,1,rid,2,0,-1); + } + } + } + } + } + yon_ubl_status_box_render(LOCAL_LOAD_SUCCESS_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); + +} + +void on_config_global_load(GtkWidget *self, main_window *widgets){ + yon_load_proceed(YON_CONFIG_GLOBAL,widgets); +} + +void on_config_local_load(GtkWidget *self, main_window *widgets){ + yon_load_proceed(YON_CONFIG_LOCAL,widgets); +} + +void yon_save_proceed(char *path,main_window *widgets) { + GtkTreeIter iter; + char *final_string=""; + char *id,*name; + gboolean is_edited; + gboolean generic; + int valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(widgets->layoutsList),&iter); + if (!valid) yon_config_remove_by_key(keyboard_layout_parameter); + else { + for (;valid;valid=gtk_tree_model_iter_next(GTK_TREE_MODEL(widgets->layoutsList),&iter)){ + gtk_tree_model_get(GTK_TREE_MODEL(widgets->layoutsList),&iter,0,&name,1,&id,2,!is_edited ? &is_edited : &generic ,-1); + final_string = yon_char_unite(strcmp(final_string,"") ? yon_char_append(final_string,",") : "" ,id,NULL); + } + if (is_edited) + if (yon_config_get_by_key(keyboard_layout_parameter)) + yon_config_set(keyboard_layout_parameter,final_string); + else yon_config_register(keyboard_layout_parameter,"keyboard",final_string); + } + yon_config_save_registered(path); +} + +void on_config_global_local_save(GtkWidget *self,main_window *widgets){ + yon_save_proceed(NULL,widgets); +} + +void on_config_global_save(GtkWidget *self,main_window *widgets){ + yon_save_proceed("global",widgets); + +} + +void on_config_local_save(GtkWidget *self,main_window *widgets){ + yon_save_proceed("system",widgets); } @@ -151,10 +243,14 @@ void on_options_accept(GtkWidget *self, dictionary *dict){ layouts_window *window = yon_dictionary_get_data(dict->first->next,layouts_window*); GtkTreeModel *model = GTK_TREE_MODEL(window->list); GtkTreeIter iter; - char *name; + char *name, *id; if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(window->MainTree)),&model,&iter)){ - gtk_tree_model_get(model,&iter,0,&name,-1); + gtk_tree_model_get(model,&iter,0,&id,1,&name,-1); gtk_entry_set_text(GTK_ENTRY(widgets->OptionsEntry),name); + if (yon_config_get_by_key(options_parameter)) + yon_config_set(options_parameter,id); + else yon_config_register(options_parameter,"keyboard",id); + } on_close_subwindow(self); } @@ -177,7 +273,6 @@ void on_options_open(GtkWidget *self, main_window *widgets){ config_str option = yon_char_parse(rtn[i],&option_size,";"); gtk_list_store_append(window->list,&iter); gtk_list_store_set(window->list,&iter,0,option[0],1,option[1],-1); - } dictionary *dict = NULL; yon_dictionary_add_or_create_if_exists_with_data(dict,"widgets",widgets); @@ -200,7 +295,7 @@ void on_layouts_accept(GtkWidget *self, dictionary *dict){ gtk_tree_model_get_iter(model,&lwiter,pth); gtk_list_store_append(widgets->layoutsList,&iter); gtk_tree_model_get(model,&lwiter,0,&name,1,&id,-1); - gtk_list_store_set(widgets->layoutsList,&iter,1,name,0,id,-1); + gtk_list_store_set(widgets->layoutsList,&iter,1,name,0,id,2,1,-1); } on_close_subwindow(self); } @@ -212,7 +307,8 @@ void on_layouts_add(GtkWidget *self, main_window *widgets){ window->AcceptButton = yon_gtk_builder_get_widget(builder,"AcceptButton"); window->CancelButton = yon_gtk_builder_get_widget(builder,"CancelButton"); window->MainTree = yon_gtk_builder_get_widget(builder,"LayoutsTree"); - window->list = GTK_LIST_STORE(gtk_builder_get_object(builder,"liststore1")); + window->list = main_config.layouts_list; + gtk_tree_view_set_model(GTK_TREE_VIEW(window->MainTree), GTK_TREE_MODEL(window->list)); int size,laysize; GtkTreeIter iter; config_str rtn = yon_config_load(get_layouts_command,&size); @@ -353,7 +449,25 @@ main_window *setup_window(){ models[i] = yon_char_divide_search(models[i],"\n",-1); models[i+1] = yon_char_divide_search(models[i+1],"\n",-1); gtk_list_store_append(widgets->modelsList,&iter); - gtk_list_store_set(widgets->modelsList,&iter,0,models[i],1,models[i+1],-1); + gtk_list_store_set(widgets->modelsList,&iter,1,models[i],0,models[i+1],-1); + } + main_config.layouts_list = gtk_list_store_new(2,G_TYPE_STRING,G_TYPE_STRING); + int laysize; + config_str rtn = yon_config_load(get_layouts_command,&size); + for (int i=0; iMoveDownButton),"clicked",G_CALLBACK(on_move_down),widgets); g_signal_connect(G_OBJECT(widgets->MoveUpButton),"clicked",G_CALLBACK(on_move_up),widgets); g_signal_connect(G_OBJECT(widgets->OptionsButton),"clicked",G_CALLBACK(on_options_open),widgets); - g_signal_connect(G_OBJECT(widgets->NumLockCombo),"changed",G_CALLBACK(on_num_lock_changed),NULL); + g_signal_connect(G_OBJECT(widgets->NumLockCombo),"changed",G_CALLBACK(on_num_lock_changed),widgets); + + g_signal_connect(G_OBJECT(widgets->SaveMenuItem),"activate",G_CALLBACK(on_config_global_local_save),widgets); + g_signal_connect(G_OBJECT(widgets->SaveGlobalMenuItem),"activate",G_CALLBACK(on_config_global_save),widgets); + g_signal_connect(G_OBJECT(widgets->SaveLocalMenuItem),"activate",G_CALLBACK(on_config_local_save),widgets); + + g_signal_connect(G_OBJECT(widgets->LoadGlobalMenuItem),"activate",G_CALLBACK(on_config_global_load),widgets); + g_signal_connect(G_OBJECT(widgets->LoadLocalMenuItem),"activate",G_CALLBACK(on_config_local_load),widgets); gtk_widget_show(widgets->Window); @@ -464,6 +585,7 @@ int main(int argc, char *argv[]){ yon_ubl_setup_sockets(widgets->PlugBox,widgets->LeftBox,widgets->RightBox,main_config.socket_id,main_config.load_socket_id,main_config.save_socket_id); yon_window_config_setup(GTK_WINDOW(widgets->Window)); yon_window_config_load(config_path); + on_config_local_load(NULL,widgets); GtkCssProvider *css=gtk_css_provider_new(); gtk_css_provider_load_from_resource(css,CssPath); gtk_style_context_add_provider_for_screen(gdk_screen_get_default(), diff --git a/source/ubl-settings-keyboard.h b/source/ubl-settings-keyboard.h index 29c2975..b7e8b63 100644 --- a/source/ubl-settings-keyboard.h +++ b/source/ubl-settings-keyboard.h @@ -25,12 +25,10 @@ #define CssPath "/com/ublinux/css/ubl-settings-keyboard.css" #define config_path yon_char_unite(yon_ubl_user_get_home_directory(),"/.config/",LocaleName,"/",LocaleName,".conf",NULL) -#define hostname_parameter "HOSTNAME" #define model_parameter "XkbModel" #define keyboard_layout_parameter "XkbLayout" -#define console_font_parameter "CONSOLE_FONT" +#define options_parameter "XkbOptions" #define num_lock_boot_parameter "NUMLOCK" -#define language_parameter "LANG" #define get_options_command "grep \"grp:.*toggle\" /usr/share/X11/xkb/rules/base.lst|sed -e 's/^ *//g' -e 's/\t//g' -e 's/toggle */toggle;/g'" #define get_models_command "sed '/<\\/modelList>/q' /usr/share/X11/xkb/rules/base.xml | grep -E '^ {8,8}|^ {8,8}'|sed -e 's/ *//g' -e 's,,,g' -e 's/ *//g' -e 's,,,g'" @@ -58,6 +56,9 @@ typedef struct { int lock_save_local; int lock_save_global; int lock_load_global; + char *options; + GtkListStore *layouts_list; + GtkListStore *options_list; } config; typedef struct { diff --git a/source/ubl-utils.c b/source/ubl-utils.c index c5a6551..188d5fa 100644 --- a/source/ubl-utils.c +++ b/source/ubl-utils.c @@ -646,10 +646,10 @@ char **yon_char_parse(char *parameters, int *size, char *divider){ char *paramline=yon_char_new(parameters); char *param; while ((param=yon_char_divide_search(paramline,divider,1))){ + if (strcmp(param,paramline)==0) break; 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); @@ -1243,7 +1243,7 @@ config_str yon_config_load(char *command, int *str_len){ * Выполняет команду [command], добавляя в конец все записи конфига в таком виде: * [ПАРАМЕТР1]="[значения1]" [ПАРАМЕТР2]="[значения2]" */ -int yon_config_save_registered(char *path, char *section){ +int yon_config_save_registered(char *path){ check_config{ dictionary *dct; dictionary *sections_add=NULL; @@ -1252,8 +1252,8 @@ int yon_config_save_registered(char *path, char *section){ if (dct->data&&strcmp(yon_dictionary_get_data(dct,char*),"")!=0){ if (((yon_config_parameter*)dct)->flag1==1){ ((yon_config_parameter*)dct)->flag1=0; - if (sections_add&&yon_dictionary_get(§ions_add,((yon_config_parameter*)dct)->section)) sections_add->data=(void*)yon_char_unite(yon_dictionary_get_data(sections_add,char*)," ",dct->key,"=",yon_dictionary_get_data(dct,char*),NULL); - else yon_dictionary_add_or_create_if_exists_with_data(sections_add,((yon_config_parameter*)dct)->section,yon_char_unite (ubconfig_save_command,path ? yon_char_append(" --target ",path):"", " set ", ((yon_config_parameter*)dct)->section, " ",dct->key,"=",yon_dictionary_get_data(dct,char*),NULL)); + if (sections_add&&yon_dictionary_get(§ions_add,((yon_config_parameter*)dct)->section)) sections_add->data=(void*)yon_char_unite(yon_dictionary_get_data(sections_add,char*)," ",dct->key,"=\"",yon_dictionary_get_data(dct,char*),"\"",NULL); + else yon_dictionary_add_or_create_if_exists_with_data(sections_add,((yon_config_parameter*)dct)->section,yon_char_unite (ubconfig_save_command,path ? yon_char_append(" --target ",path):"", " set ", ((yon_config_parameter*)dct)->section," ", dct->key,"=\"",yon_dictionary_get_data(dct,char*),"\"",NULL)); } else if (((yon_config_parameter*)dct)->flag1==-1){ ((yon_config_parameter*)dct)->flag1=0; if (sections_remove&&yon_dictionary_get(§ions_remove,((yon_config_parameter*)dct)->section)) sections_remove->data=(void*)yon_char_unite(yon_dictionary_get_data(sections_remove,char*)," ",dct->key,NULL); diff --git a/source/ubl-utils.h b/source/ubl-utils.h index fba6c98..928aea9 100644 --- a/source/ubl-utils.h +++ b/source/ubl-utils.h @@ -186,7 +186,7 @@ typedef enum { config_str yon_config_load(char *command, int *str_len); -int yon_config_save_registered(char *path, char *section); +int yon_config_save_registered(char *path); char *yon_config_get_parameter(config_str parameters, int size, char *param); diff --git a/ubl-settings-keyboard b/ubl-settings-keyboard index 84e08fff468b8f7833b74fe4284d755c1162a1f1..a709c5cab2c0fb33fd7383b019776151e075a69d 100755 GIT binary patch delta 81491 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 delta 74755 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�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 atp(7o_dSvSVublL@+{ + + @@ -730,6 +732,7 @@ translated and supported by community. False liststore2 0 + 1 From 46e5ddc3fb1cf5bbf0499725796898983a135565 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Wed, 20 Sep 2023 16:58:26 +0600 Subject: [PATCH 3/7] Localisation update --- layouts.csv | 1 - ubl-settings-keyboard.glade | 10 +- ubl-settings-keyboard.pot | 289 +++++++++++++++++++++++++++++++--- ubl-settings-keyboard_ru.po | 299 +++++++++++++++++++++++++++++++++--- 4 files changed, 552 insertions(+), 47 deletions(-) diff --git a/layouts.csv b/layouts.csv index efad78c..0c3d5fa 100644 --- a/layouts.csv +++ b/layouts.csv @@ -32,7 +32,6 @@ kn;Kannada ko;Korean ks;Kashmiri ku;Kurdish -ku;Kurdish ky;Kirghiz lt;Lithuanian lv;Latvian diff --git a/ubl-settings-keyboard.glade b/ubl-settings-keyboard.glade index 90685ea..6e97473 100644 --- a/ubl-settings-keyboard.glade +++ b/ubl-settings-keyboard.glade @@ -192,7 +192,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - True False @@ -939,7 +938,6 @@ translated and supported by community. - True False 5 @@ -1229,4 +1227,12 @@ translated and supported by community. + + + + + + + + diff --git a/ubl-settings-keyboard.pot b/ubl-settings-keyboard.pot index 6273a6d..781e490 100644 --- a/ubl-settings-keyboard.pot +++ b/ubl-settings-keyboard.pot @@ -25,7 +25,6 @@ msgstr "" msgid "ubl-settings-keyboard version:" msgstr "" - #: source/ubl-strings.h:2 msgid "Usage:" msgstr "" @@ -92,80 +91,330 @@ msgstr "" msgid "Documentation" msgstr "" -#: source/ubl-strings.h:12 +#: source/ubl-strings.h:13 msgid "Save to local configuration" msgstr "" -#: source/ubl-strings.h:13 +#: source/ubl-strings.h:14 msgid "Save to global configuration" msgstr "" -#: source/ubl-strings.h:14 +#: source/ubl-strings.h:15 msgid "Save configuration" msgstr "" -#: source/ubl-strings.h:15 +#: source/ubl-strings.h:16 msgid "Save" msgstr "" -#: source/ubl-strings.h:16 +#: source/ubl-strings.h:18 msgid "Load local configuration" msgstr "" -#: source/ubl-strings.h:17 +#: source/ubl-strings.h:19 msgid "Load global configuration" msgstr "" -#: source/ubl-strings.h:18 +#: source/ubl-strings.h:20 msgid "Load" msgstr "" -#: source/ubl-strings.h:20 +#: source/ubl-strings.h:22 msgid "Cancel" msgstr "" -#: source/ubl-strings.h:22 +#: source/ubl-strings.h:24 msgid "Would you like to read documentation in the Web?" msgstr "" -#: source/ubl-strings.h:23 +#: 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:24 +#: source/ubl-strings.h:26 msgid "Always redirect to online documentation" msgstr "" -#: source/ubl-strings.h:25 +#: source/ubl-strings.h:27 msgid "Open documentation" msgstr "" -#: source/ubl-strings.h:26 +#: source/ubl-strings.h:28 msgid "Project Home Page" msgstr "" -#: source/ubl-strings.h:27 +#: source/ubl-strings.h:29 msgid "Nothing were chosen" msgstr "" -#: source/ubl-strings.h:30 +#: source/ubl-strings.h:32 msgid "Global configuration loading succseeded." msgstr "" -#: source/ubl-strings.h:31 +#: source/ubl-strings.h:33 msgid "Local configuration loading succseeded." msgstr "" -#: source/ubl-strings.h:33 +#: 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:34 +#: source/ubl-strings.h:37 msgid "Global configuration saving succseeded." msgstr "" -#: source/ubl-strings.h:35 +#: source/ubl-strings.h:38 msgid "Local configuration saving succseeded." msgstr "" + +msgid "Afrikaans" +msgstr "" + +msgid "Arabic" +msgstr "" + +msgid "Assamese" +msgstr "" + +msgid "Azerbaijani" +msgstr "" + +msgid "Belarusian" +msgstr "" + +msgid "Bulgarian" +msgstr "" + +msgid "Bengali" +msgstr "" + +msgid "Bosnian" +msgstr "" + +msgid "Catalan" +msgstr "" + +msgid "Czech" +msgstr "" + +msgid "Danish" +msgstr "" + +msgid "German" +msgstr "" + +msgid "Greek" +msgstr "" + +msgid "English" +msgstr "" + +msgid "Spanish" +msgstr "" + +msgid "Estonian" +msgstr "" + +msgid "Finnish" +msgstr "" + +msgid "French" +msgstr "" + +msgid "Gujarati" +msgstr "" + +msgid "Hebrew" +msgstr "" + +msgid "Hindi" +msgstr "" + +msgid "Croatian" +msgstr "" + +msgid "Hungarian" +msgstr "" + +msgid "Armenian" +msgstr "" + +msgid "Indonesian" +msgstr "" + +msgid "Icelandic" +msgstr "" + +msgid "Italian" +msgstr "" + +msgid "Japanese" +msgstr "" + +msgid "Georgian" +msgstr "" + +msgid "Kazakh" +msgstr "" + +msgid "Kannada" +msgstr "" + +msgid "Korean" +msgstr "" + +msgid "Kashmiri" +msgstr "" + +msgid "Kurdish" +msgstr "" + +msgid "Kirghiz" +msgstr "" + +msgid "Lithuanian" +msgstr "" + +msgid "Latvian" +msgstr "" + +msgid "Macedonian" +msgstr "" + +msgid "Malayalam" +msgstr "" + +msgid "Marathi" +msgstr "" + +msgid "Malay" +msgstr "" + +msgid "Maltese" +msgstr "" + +msgid "Bokmal" +msgstr "" + +msgid "Dutch" +msgstr "" + +msgid "Nynorsk" +msgstr "" + +msgid "Oriya" +msgstr "" + +msgid "Punjabi" +msgstr "" + +msgid "Polish" +msgstr "" + +msgid "Portuguese" +msgstr "" + +msgid "Romanian" +msgstr "" + +msgid "Russian" +msgstr "" + +msgid "Sanskrit" +msgstr "" + +msgid "Slovak" +msgstr "" + +msgid "Slovenian" +msgstr "" + +msgid "Albanian" +msgstr "" + +msgid "Serbian" +msgstr "" + +msgid "Swedish" +msgstr "" + +msgid "Tamil" +msgstr "" + +msgid "Telugu" +msgstr "" + +msgid "Thai" +msgstr "" + +msgid "Turkish" +msgstr "" + +msgid "Ukrainian" +msgstr "" + +msgid "Vietnamese" +msgstr "" + +msgid "Simplified Chinese" +msgstr "" + +msgid "Traditional Chinese" +msgstr "" + +msgid "Chinese" +msgstr "" + +msgid "Generic 86-key PC" +msgstr "" + +msgid "Generic 101-key PC" +msgstr "" + +msgid "Generic 102-key PC" +msgstr "" + +msgid "Generic 104-key PC" +msgstr "" + +msgid "Generic 104-key PC with L-shaped Enter key" +msgstr "" + +msgid "Generic 105-key PC" +msgstr "" + +msgid "Dell 101-key PC" +msgstr "" + +msgid "Dell Latitude laptop" +msgstr "" + +msgid "Dell Precision M65 laptop" +msgstr "" + +msgid "Dell Inspiron 6000/8000 laptop" +msgstr "" + +msgid "Dell Precision M laptop" +msgstr "" + +msgid "Fujitsu-Siemens Amilo laptop" +msgstr "" + +msgid "Hewlett-Packard Mini 110 laptop" +msgstr "" + +msgid "Asus laptop" +msgstr "" + +msgid "Apple laptop" +msgstr "" + +msgid "eMachines m6800 laptop" +msgstr "" \ No newline at end of file diff --git a/ubl-settings-keyboard_ru.po b/ubl-settings-keyboard_ru.po index 7b2a798..01dc73a 100644 --- a/ubl-settings-keyboard_ru.po +++ b/ubl-settings-keyboard_ru.po @@ -25,10 +25,6 @@ msgstr "Версия:" msgid "ubl-settings-keyboard version:" msgstr "Версия ubl-settings-keyboard: " -#: source/ubl-strings.h:2 -msgid "TEMPLATE settings" -msgstr "Настройки TEMPLATE" - #: source/ubl-strings.h:2 msgid "Usage:" msgstr "Использование:" @@ -86,7 +82,9 @@ msgstr "Операция завершена" msgid "" "Warning! Application was launched without root - root-dependent actions are " "locked" -msgstr "Внимание! Приложение было запущено без прав суперпользователя - действия, требующие их наличия заблокированы" +msgstr "" +"Внимание! Приложение было запущено без прав суперпользователя - действия, " +"требующие их наличия заблокированы" #: source/ubl-strings.h:10 msgid "About" @@ -96,43 +94,43 @@ msgstr "О программе" msgid "Documentation" msgstr "Справка" -#: source/ubl-strings.h:12 +#: source/ubl-strings.h:13 msgid "Save to local configuration" msgstr "Сохранить в локальную конфигурацию" -#: source/ubl-strings.h:13 +#: source/ubl-strings.h:14 msgid "Save to global configuration" msgstr "Сохранить в глобальную конфигурацию" -#: source/ubl-strings.h:14 +#: source/ubl-strings.h:15 msgid "Save configuration" msgstr "Сохранить конфигурацию" -#: source/ubl-strings.h:15 +#: source/ubl-strings.h:16 msgid "Save" msgstr "Сохранить" -#: source/ubl-strings.h:16 +#: source/ubl-strings.h:18 msgid "Load local configuration" msgstr "Загрузить локальную конфигуруцию" -#: source/ubl-strings.h:17 +#: source/ubl-strings.h:19 msgid "Load global configuration" msgstr "Загрузить глобальную конфигурацию" -#: source/ubl-strings.h:18 +#: source/ubl-strings.h:20 msgid "Load" msgstr "Загрузить" -#: source/ubl-strings.h:20 +#: source/ubl-strings.h:22 msgid "Cancel" msgstr "Отмена" -#: source/ubl-strings.h:22 +#: source/ubl-strings.h:24 msgid "Would you like to read documentation in the Web?" msgstr "Вы хотите прочитать справку в Сети?" -#: source/ubl-strings.h:23 +#: source/ubl-strings.h:25 msgid "" "You will be redirected to documentation website where documentation is\n" "translated and supported by community." @@ -140,38 +138,291 @@ msgstr "" "Вы будете перенаправлены на сайт с документацией, где страницы помощи\n" "переводятся и поддерживаются сообществом." -#: source/ubl-strings.h:24 +#: source/ubl-strings.h:26 msgid "Always redirect to online documentation" msgstr "Всегда перенаправлять" -#: source/ubl-strings.h:25 +#: source/ubl-strings.h:27 msgid "Open documentation" msgstr "Прочитать справку" -#: source/ubl-strings.h:26 +#: source/ubl-strings.h:28 msgid "Project Home Page" msgstr "Домашняя страница проекта" -#: source/ubl-strings.h:27 +#: source/ubl-strings.h:29 msgid "Nothing were chosen" msgstr "Ничего не было выбрано" -#: source/ubl-strings.h:30 +#: source/ubl-strings.h:32 msgid "Global configuration loading succseeded." msgstr "Успешно загружена глобальная конфигурация" -#: source/ubl-strings.h:31 +#: source/ubl-strings.h:33 msgid "Local configuration loading succseeded." msgstr "Успешно загружена локальная конфигурация" -#: source/ubl-strings.h:33 +#: 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:34 +#: source/ubl-strings.h:37 msgid "Global configuration saving succseeded." msgstr "Успешно записана глобальная конфигурация" -#: source/ubl-strings.h:35 +#: source/ubl-strings.h:38 msgid "Local configuration saving succseeded." msgstr "Успешно записана локальная конфигурация" + +msgid "Afrikaans" +msgstr "Африканский" + +msgid "Arabic" +msgstr "Арабский" + +msgid "Assamese" +msgstr "Ассамский" + +msgid "Azerbaijani" +msgstr "Азербайджанский" + +msgid "Belarusian" +msgstr "Беларусский" + +msgid "Bulgarian" +msgstr "Болгарский" + +msgid "Bengali" +msgstr "Бенгальский" + +msgid "Bosnian" +msgstr "Боснийский" + +msgid "Catalan" +msgstr "Каталонский" + +msgid "Czech" +msgstr "Чешский" + +msgid "Danish" +msgstr "Датский" + +msgid "German" +msgstr "Немецкий" + +msgid "Greek" +msgstr "Греческий" + +msgid "English" +msgstr "Английский" + +msgid "Spanish" +msgstr "Испанский" + +msgid "Estonian" +msgstr "Эстонский" + +msgid "Finnish" +msgstr "Финский" + +msgid "French" +msgstr "Французский" + +msgid "Gujarati" +msgstr "Гуджаратский" + +msgid "Hebrew" +msgstr "Иврит" + +msgid "Hindi" +msgstr "Хинди" + +msgid "Croatian" +msgstr "Хорватский" + +msgid "Hungarian" +msgstr "Венгерский" + +msgid "Armenian" +msgstr "Армянский" + +msgid "Indonesian" +msgstr "Индонезийский" + +msgid "Icelandic" +msgstr "Исландский" + +msgid "Italian" +msgstr "Итальянский" + +msgid "Japanese" +msgstr "Японский" + +msgid "Georgian" +msgstr "Грузинский" + +msgid "Kazakh" +msgstr "Казахский" + +msgid "Kannada" +msgstr "Каннада" + +msgid "Korean" +msgstr "Корейский" + +msgid "Kashmiri" +msgstr "Кашмирский" + +msgid "Kurdish" +msgstr "Курдский" + +msgid "Kirghiz" +msgstr "Киргизский" + +msgid "Lithuanian" +msgstr "Литовский" + +msgid "Latvian" +msgstr "Латышский" + +msgid "Macedonian" +msgstr "Македонский" + +msgid "Malayalam" +msgstr "Малаялам" + +msgid "Marathi" +msgstr "Маратхи" + +msgid "Malay" +msgstr "Малайский" + +msgid "Maltese" +msgstr "Мальтийский" + +msgid "Bokmal" +msgstr "Букмол" + +msgid "Dutch" +msgstr "Нидерландский" + +msgid "Nynorsk" +msgstr "Норвежский" + +msgid "Oriya" +msgstr "Ория" + +msgid "Punjabi" +msgstr "Панджаби" + +msgid "Polish" +msgstr "Польский" + +msgid "Portuguese" +msgstr "Португальский" + +msgid "Romanian" +msgstr "Румынский" + +msgid "Russian" +msgstr "Русский" + +msgid "Sanskrit" +msgstr "Санскрит" + +msgid "Slovak" +msgstr "Словацкий" + +msgid "Slovenian" +msgstr "Словенский" + +msgid "Albanian" +msgstr "Албанский" + +msgid "Serbian" +msgstr "Сербский" + +msgid "Swedish" +msgstr "Шведский" + +msgid "Tamil" +msgstr "Тамильский" + +msgid "Telugu" +msgstr "Тулугу" + +msgid "Thai" +msgstr "Тайский" + +msgid "Turkish" +msgstr "Турецкий" + +msgid "Ukrainian" +msgstr "Украинский" + +msgid "Vietnamese" +msgstr "Вьетнамский" + +msgid "Simplified Chinese" +msgstr "Упрощённый Китайский" + +msgid "Traditional Chinese" +msgstr "Традиционный Китайский" + +msgid "Chinese" +msgstr "Китайский" + +msgid "Generic 86-key PC" +msgstr "Обычная 86-клавишная" + +msgid "Generic 101-key PC" +msgstr "Обычная 101-клавишная" + +msgid "Generic 102-key PC" +msgstr "Обычная 102-клавишная" + +msgid "Generic 104-key PC" +msgstr "Обычная 104-клавишная" + +msgid "Generic 104-key PC with L-shaped Enter key" +msgstr "Обычная 104-клавишная (Enter в форме буквы L)" + +msgid "Generic 105-key PC" +msgstr "Обычная 105-клавишная" + +msgid "Dell 101-key PC" +msgstr "Dell 101-клавишная" + +msgid "Dell Latitude laptop" +msgstr "Ноутбук Dell Latitude" + +msgid "Dell Precision M65 laptop" +msgstr "Ноутбук Dell Precision M65" + +msgid "Dell Inspiron 6000/8000 laptop" +msgstr "Ноутбук Dell Inspiron 6000/8000" + +msgid "Dell Precision M laptop" +msgstr "Ноутбук Dell Precision M" + +msgid "Fujitsu-Siemens Amilo laptop" +msgstr "Ноутбук Fujitsu-Siemens Amilo" + +msgid "Hewlett-Packard Mini 110 laptop" +msgstr "Ноутбук Hewlett-Packard Mini 110" + +msgid "Acer laptop" +msgstr "Ноутбук Acer" + +msgid "Asus laptop" +msgstr "Ноутбук Asus" + +msgid "Apple laptop" +msgstr "Ноутбук Apple" + +msgid "eMachines m6800 laptop" +msgstr "Ноутбук eMachines m6800" From 365db8409a3482cfa08bd814586660d6f0ff4ea3 Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Thu, 21 Sep 2023 10:09:04 +0600 Subject: [PATCH 4/7] Localisation additions --- source/ubl-strings.h | 18 +++++++++- ubl-settings-keyboard | Bin 273696 -> 0 bytes ubl-settings-keyboard.pot | 59 +++++++++++++++++++++++++++++++- ubl-settings-keyboard_ru.po | 65 +++++++++++++++++++++++++++++++++--- 4 files changed, 135 insertions(+), 7 deletions(-) delete mode 100755 ubl-settings-keyboard diff --git a/source/ubl-strings.h b/source/ubl-strings.h index 5be35fc..8e7480e 100644 --- a/source/ubl-strings.h +++ b/source/ubl-strings.h @@ -35,4 +35,20 @@ #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.") \ No newline at end of file +#define LOCAL_SAVE_SUCCESS_LABEL _("Local configuration saving succseeded.") + +#define CONSOLE_LABEL _("Console") +#define NUM_LOCK_LABEL _("Num Lock on boot:") +#define KEYBOARD_LABEL _("Keyboard") +#define MODEL_LABEL _("Keyboard model:") +#define OPTIONS_LABEL _("Keyboard options:") +#define LAYOUTS_LABEL _("Keyboard layouts:") +#define EDIT_LABEL _("Pick an option") +#define MOVE_UP_LABEL _("Move layout up") +#define MOVE_DOWN_LABEL _("Move layout down") +#define ADD_LABEL _("Add layout") +#define REMOVE_LABEL _("Remove layout") +#define DEFAULT_LABEL _("Default") +#define ON_LABEL _("On") +#define OFF_LABEL _("Off") +#define ACCEPT_LABEL _("Accept") \ No newline at end of file diff --git a/ubl-settings-keyboard b/ubl-settings-keyboard deleted file mode 100755 index a709c5cab2c0fb33fd7383b019776151e075a69d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 273696 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
  • 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 ~egrm1!K5e9 zq2$*6bd5N{^1K6PhnrIdnCeRE3hMylZEr}-riItUjrC*|JFDzhIz)O{XdjYP>mRA- zmYYzS=Bf*xW1aG>?Uq=A>q`P&R*1=n-~gCm8^Qbg-G(4dqg=id-hl^eeN2}>!UjR) z%RNRjNUqobJIiQ+r#oa3QJ;DW`|NHzywBNgtHcbB(6vnaOuGlaNOn|&HKndmyPYdo z_8v%L?-mB;gKu{WXaPT791?n|%#tFQ(G4r|wgL5s0ye~#qM1+qfH#mSofyrG!7h=# zWGlraa{jtcLe!Q``O#8k^Leb}q{UCphWQq0MPvzOXN~X+I7t@Ma;yMZML0UAoC?vW zfuw7(XxlDpwn>dmU_$+w2`AgIE+S$pxiTvl8kEaAoQpq?PfQ)y4&#puVzsKe9N)s>}>FrIUfFWi}A1nGy?+k z7U6riX9*|axOyrxsn#j0zIHnaB#EPvWg6Ke<5kxHiAiu$jq~fKtNXng zJ~~)4ox$R5-@w?&c+HFNe(|#}Uiz!kFFy0)AHVpSzdH3-@2G(Zs{&G7rkbvTpQ6v^ z`tZD(%=AK%KLy~}F(ZjC_YFheMgQ8kx@u_iFhlaUGk)D1w3 z@w~(sYv^k@X2%vIwJ+_+BHQ0zgD38jJGNI%_E$lNWKLAUxvSAf^k*N!krC`}69_X0 zWgoK$-Gvh{cqDV*eK~E?N2|7hN<#xj^V~@1zfm(lzZ=gyA$c0?3$|eZNivdza)$Zh zDK!RHX;E)&RDHns_GRmoJh~=4%24?^ZKd6ciw~XU*_(&DlXl#P#z~7&e zG_tlj4G@GtseKTIwbMt{OLym7G1YU-wl3J~<&hDAp2p?`KIf=~vc)!7z(=w57FQ`` zYrkHK6zM59AJbrt+B={I_tMC)i7_6C$X4WzmF$(jY@~?TG>CB%zN0jXCaNKOtrhC-{X- z;RL^!M^Z!6LvoJ~>+(eGiinTm2IWA(cAQS$uaTJzm&+!(a1j`zO81EaLty@y|J(#*Zy z2Zew#AizLF&nPxr0p*qG1xLOiM)X9-l9d(Uh~j|H3VQrn2LB5FXzt(7E%^P?593RO zdH(PX3a`NX;m>n#^Gop&+<6RNZs1>~{NfAAIL=ldUo@Y!{05Xqy>joxdo2KaxY3q- z_OpNP?rvMYH>X@aJ?O3Qn*IY{w7?(n=3f&3BEag|?`gRd;^)`#kNuv>f%AyeU*tWN zQ~whvpKV;9k@^d~d&;!O%8PpZKT^Kjd-K0(zZ@t3uHYa0ebV+TpC&+^M0)T>O_0qeFa)xY0Dixue0@=a_aLFD1_6VQ_fGKu)HUyJm38C z1BwxEq4$HYgy~OO%r>r{my-_jyx0GfHL`!75jgnTyu-#9K8V7|_u(0c3j;H{Q& zdl5M7M)`cu?aj8|CVMZDr~YT>EBxl))ruSO>23av*?znKNw0rf58lIh;QWrQ|6P8Z z9)C{EK5fh0_g0SRZSODg!1;Qf@_)5(+!rC&SvYvn8t60guL6an+v66Ijkd~SsbB7W zn;*u(UzZ-d9k%?oFKEGow!AqH{9#-FCm+>{|7`33YM%PPZR=lqS}XGNK>YidEx(xp zi@$?<@Se*9=gWD@{~=HL5Au{3LQZF++loBpHBw&g{mlmy!95nwx;*sOJ2Y{@$c?DaPG}h{$QT+cjqbpSf29F<|+SLp7L+zDgS|# zmwT&Uk>Pk{xaQv+e28f_x~)Jt^_A0;&W=>)sb4GQ<=!`~K77r}QAeKosXXPsX5qa3 z^NJts2mjt-%isDoz5WM1c<;*t=Z|dt)Z4Y9ZRR~|%gvy? z_2)nzQ;+@l%UbY&Enh3;_9Ae&-PXVGRV_@~adqaYKV<8__^(=j%)#vk@dl5L?ny38kJmrHH{;nq! z$X*NUAzR-0j21j<%b&32L%*g4_gngZDi8dx=PAFMryTDBmhm=ED*Tr${4!g9zs1wJ zo9k`)ia*r)Z?$;dVavaKpBAjQ<%gu)UIY%qw*Hn;EqvALt9Rt7|CFuY`Ax0=5ew_@ z^3?yHt^eoW*NV5;`WuQ>KMY%c24s=Hn@~QRKDi@Lc}Je|;XLIJNO`&U(@WaluiAd! zlc)YC@{~W9r~E|=|E@n!z_(fW-^o+|zw(qXDp7v;`o|Q&l!bG%l-rBIp*BzX>++OO z<|#j&r~JKAUhci&ly>@}<`HtvuyFw{TwmO9k*<3#S4u^=$mG zF;96pDp$fkzbD6U-!Apby@y{@z}8*xUY7^Xw5|WG4{H5ti_fp;ssB5+{zKoG3eJWi3*LmQ4Cr^0{A@*!^Sd^#yhCJm>D6h0*2_B9}{c`V#V^2yM_O^dEorO*5CVWt;o2Pe+$cIr$cp~^4dJ*t$E4^ z@{~{JDL*OY<=&+)D1L9#gZG#%-~CZ7Xtm{^wB_&nz82Kj@^7GgKK^5L$-e^m^}MT6 z-(Ca`^U75}e9zjcbJic*BISXK_OvZed0(FL`z-vAS;OM|rHAv>|3IGdPvt59l7;^b z>-gMf`Q-0x`EtuAn=Jm{&jSbF-k4P`)<}7|_k`6;hb?_>&r|we?G(ROiiNFP5WxHho(y^|Nt}1>@bGr+#Oi@}qgmPfB^YcgxEP`M90;cjl@8 zgsuPI&ujf*i_mBC)c-$u%Ks%#c_H$>^urfTD&QR!ewi&V`I;8I&z9dT<@O?QNZ9&K zf1-tdXzz`qyfRSFo&H)LI3Lba{y7W(@{bk5c}usi+w!+tf9#Cy;94Fy#S3Sj_tjEf z?#;LUz&Q)&R$KmYTfV}Ux7qTaeP0Wl-}|e!{DYPNZ@2Y-!Z=b*xvdm9 zd@4`*3l`4qA86$++vZB1`ajK6zIc(&`=dt{050XPO3Lj;;81Jpf7j*}x7mAbdFl_? z`cPhEE{T9k8r!Jr1y8i7v@Gs;k|7@P}7o;5d2dhsG*bZLJQ~%%c zl$S4_oqsmuDc_r?{BWM~u{`AuOL@8X%2yQek6ZlTYs;TIp#|%0`Gq`iK9{HbZ}OC1 z%~M{qWOh1SC*|edeP32YtoiqDvE`q&`s8uz5470w+wRx;)s|1*V9S4G1BDJ-{!Ux| z@he*YB|F}aNx8iU9R9yN<^Pzc{D&5P=CT5D@?Nl1m%Aq??taPE z|LLD7fS=g<-;r_)G;sJYTfgoTTKH9aZ~n5`=eI^7}2E{r_UyTl_zQa*p>EJKoI}&(GWXKY5E5ID7QBdEkG;)_?SZ*8jSNb1hH( zg5}B&Yo@f~1IPpNZ;>s({KtA-V)5K$%SZoO%fDm;fO;v{vf%H*Jmo`q${)y6{%$ER z_lB)s^q}qJLZ151w}g$PQP4kyy(*c(L7d`AXZw+cWO@v*mB+(3d`xj*!hJAe z0GnFy(*6wJfQgs<;2Gk9>dmv);8Tnvc*s-4eJ_eI)z!#nb7+zX5+Y9yhN_gyq zm2F3|ZJoP&+}2KcJWqD)f|PhjRjdAz_lJ{Ap&jzvB#CE?+0BfNhqKWD?J-I29UOs2 z8u*+OXMJyDOJZMLa%=UrZT=%2+|1}UVgi7^`XT$iYit7MZc)GG*6LewpC8c2+km=z zi9H7*&#ZEPFdmt(55@2S3eKNAMWoxC+?LOrJ*V>04tdZBd(CIQ`kb|8qa`+d;;jO@ z^Li%rfC63x6MpxaeGEn3Tt~X*JZ~`j8z)&YcSE(ziY;^-=d*+fJg7YjlaMUI=Qw}C zs~B>hc98c0g(idWxrK{Iu9K`!*{6^b7e!|4RbQ7wKN|v*4 zp$XMsFWjmKpxELDF5!1WFb=$MC|oc62)fX~+#hD&*pM9$ zbaBq}E$lGcnnbkRDDR2&rAv0+%j>(OX!a+e2rIxCJ{CDm{LSxV8fwQ71$+Upk4yk1 zJpbhkj(fl})P(&C+Y7hrdvE2XgW%+Ah==$3j4OMkes)$()e~ zUz5*U;fIk!uaR^@Eikb&pYQ|PI_Is6yvsRsk0<4RO9r>~&BgF9^o8f_KIh?+nXmQX zcKeVYpd7=t0lET3a-P1PHwRDE`+|L7+dDLfyc-*>tV+>uu;}y7A`GHCsd-5N;aM5O zFaB15kC?yjSDNb;jDUQ(g&2nAH_t0If>U6X6x*_s|KXF0AQzru=c^CJl!fd8_Jryf z^=B!Qk8SfLG45 zpzJ5WM*d{w0Aaa%H{6UT)N+O!cyTcAfI;kg;OrYISg7irBN8u)MQ%#m$1^ZfzCBTv zCr*~#d{yI|v8-c~tH-mi3Cd~%cI>QA0IKuvWnKdli0ZIiQotw4@xB^13iBY}%bELl zmD@4Sm&=9bD~Gy-Z(mX~qneV?y^2%(Pxx2*k)a^p1mE$=HevbJ_sQpy#-D9A@ZT~d zkLR&O{n1dR0IQIOp~u~liLQgt=lUHxc-jn*y5w1V4%eSMJnt~$ohh^0hLHCfkl&CN z#T#(|dFDrm90mLrVEP(G=8n2HJK*rwOKAAr8=Lffu>PcM+b*mjw51&dJK}jj(n_8j zWlLWaNgp@_`aVWhp)%AOfrqnZ@H1+Fvw~iBV7#a;&kmBH1nFc3UFAIL6nZ&qwT&WCUA90^1PpnJ!f4D@<-6MkcXswiqZ4ThpF%GApS{0yzoXM zm@B@A4Np$^5G>8@Prqe!5>Lb2odl0^LA>8A9j%~s(TH^#|MPIO(@#=es zdfff*nHLv9P019F>9ZiFP44QIfnN#qlqe2Cs3N6tk1Z$korSyT~XMEN=&?)uRg zpMymT;Y1&kBY5)ezA$i(Iv@%dhm4%OA`}eV(>Fa6caia&502yj3JV+(2K=gl@S(4O zNHga=;(ba8@$G%|Fq+c2HxF( z=hl>f$lnlPh#m8OZ9=+c46MO`(AB-Ekm@|=^%$Z7a;DmUMJizhbf^11s}>6}34XRL z3l%%D zEtD9AzHKL#$S1ygEH3M<`zb*w@{I%G=yOxqs$#wU{79e%X(IYDJ5cxLaN!l@{VYQZ z{qVULK64)+A?E@PAACmrvcU|UqdJ%)%9#|ll;D=%nwiloq}Y6ZV#fis5%9$}9koA%z1+c`6DMKT%Pw!wxX@m0EN>=}G&N9VSQ3dewC}sOZ^tAi zA?HeU9d&umdwM83W0N83uoDVN;4SSkND883B2JwzrxK*lD(QH_<0dNZRd;MPQ=91v z%A|{|7a^2k{eT|I(GynDX3_AYQ6F9XzMVD5^xFInG5S?({*(h#zjFpH#FvmnkiLR} zScPPRattgW6?pJE%a=Chmx)(>rIe8u9qU(WLVXc#Ab@bB4j69M$p4laO@~XyJv0Sk zyTaeDR>F!VciqS+t!&}7sna3UNG%awm%_^>AG6g`rZXtU+4+I=sNJhD*l~{CwcmZ< z9r1+xkVLW~0qsFD&mQOauPegSuCskyNr&ryd{UIB^yNoAqODyXMMr{HK(bv{5kS=B zPB=JHP9PNnsLG`qP#`B#3iz0?Jn=O0Ki7 z?^Fs1_|RK!2+_W|*{hyDIfj?;;FzA$SL+ zswJSPmhhx{YC^1HwQrWQXI^z`*e)0j4*;^eQh2&@=m{8ij&A$LM*4x^M4H_JW18G* zc(z`(6?Bxz_vi6!GZZ<>^>PH?!gl9KHurDL{mrMUQ;^xl-_&>i}YrA8Q z1?=#5{kS9dE&X?({SAAyy*u8cmoi5|{B5!K8#p0}9K5&g)jRIEH>dyH@xRx$->1#I zFWM7#JX5YWh(Ae@+y4D1BVKNN-aWYB-#zk+9W&v--1&bDw}b5~@6r11I9VKSZ@2Ye z51;;h7>8i{Gxut_J34%Absv9M{!~tT_dKvWUivN9Qje}*SNf@(_U?IccPw=k?J;-! z&)D{E{&X~~%u#`iWpeO;9Nwe=q)%9yiNX_Q&DvjtkH@*xrAyz$@Cm z$?o5E5L`QVT#?h>J+E}n6>a|tfd~F71Lr(lgZqT#@OS%S_kL5`SN@Xr8*Tr&<8GIOx#8Nm;yroV|FdoX;zO>c9&_6t$kYB0N0lOcUNHEV+rB4H z`+qs6?LWRT*xE^Twrs$*&!yjEzo+e=-j}V*GuOX6PULCd{ff4)_Z73kaqZmkO}2fw z7tee2HEoY=s-ZvE&K2@nImMOe@hRJW=XH9$0f)8t=lIsy-y)Q0Pg>9Ye#@w)`Bshr X$?YGHW6awA#WmXgw{jZfTzdZ(UUxE% diff --git a/ubl-settings-keyboard.pot b/ubl-settings-keyboard.pot index 781e490..b293988 100644 --- a/ubl-settings-keyboard.pot +++ b/ubl-settings-keyboard.pot @@ -65,7 +65,7 @@ msgstr "" msgid "Lock global configration loading" msgstr "" -#: source/ubl-strings.h:4 +#: source/ubl-strings.h:4 source/ubl-strings.h:42 msgid "Keyboard" msgstr "" @@ -173,6 +173,63 @@ msgstr "" msgid "Local configuration saving succseeded." msgstr "" +#: source/ubl-strings.h:40 +msgid "Console" +msgstr "" + +#: source/ubl-strings.h:41 +msgid "Num Lock on boot:" +msgstr "" + +#: source/ubl-strings.h:43 +msgid "Keyboard model:" +msgstr "" + +#: source/ubl-strings.h:44 +msgid "Keyboard options:" +msgstr "" + +#: source/ubl-strings.h:45 +msgid "Keyboard layouts:" +msgstr "" + +#: source/ubl-strings.h:46 +msgid "Pick an option" +msgstr "" + +#: source/ubl-strings.h:47 +msgid "Move layout up" +msgstr "" + +#: source/ubl-strings.h:48 +msgid "Move layout down" +msgstr "" + +#: source/ubl-strings.h:49 +msgid "Add layout" +msgstr "" + +#: source/ubl-strings.h:50 +msgid "Remove layout" +msgstr "" + +#: source/ubl-strings.h:51 +msgid "Default" +msgstr "" + +#: source/ubl-strings.h:52 +msgid "On" +msgstr "" + +#: source/ubl-strings.h:53 +msgid "Off" +msgstr "" + +#: source/ubl-strings.h:54 +msgid "Accept" +msgstr "" + + msgid "Afrikaans" msgstr "" diff --git a/ubl-settings-keyboard_ru.po b/ubl-settings-keyboard_ru.po index 01dc73a..da6017d 100644 --- a/ubl-settings-keyboard_ru.po +++ b/ubl-settings-keyboard_ru.po @@ -50,7 +50,6 @@ msgid "Lock this help menu" msgstr "Блокировка вызова справки" #: source/ubl-strings.h:2 -#, fuzzy msgid "Lock configuration saving" msgstr "Блокировка сохранения локальной и глобальной конфигурации" @@ -66,7 +65,7 @@ msgstr "Блокировка сохранения глобальной конф msgid "Lock global configration loading" msgstr "Блокировка загрузки глобальной конфигурации" -#: source/ubl-strings.h:4 +#: source/ubl-strings.h:4 source/ubl-strings.h:42 msgid "Keyboard" msgstr "Клавиатура" @@ -178,6 +177,62 @@ msgstr "Успешно записана глобальная конфигура msgid "Local configuration saving succseeded." msgstr "Успешно записана локальная конфигурация" +#: source/ubl-strings.h:40 +msgid "Console" +msgstr "Консоль" + +#: source/ubl-strings.h:41 +msgid "Num Lock on boot:" +msgstr "Num Lock при загрузке:" + +#: source/ubl-strings.h:43 +msgid "Keyboard model:" +msgstr "Модель клавиатуры:" + +#: source/ubl-strings.h:44 +msgid "Keyboard options:" +msgstr "Опции клавиатуры:" + +#: source/ubl-strings.h:45 +msgid "Keyboard layouts:" +msgstr "Раскладки клавиатуры:" + +#: source/ubl-strings.h:46 +msgid "Pick an option" +msgstr "Выбрать опцию" + +#: source/ubl-strings.h:47 +msgid "Move layout up" +msgstr "Переместить раскладку выше" + +#: source/ubl-strings.h:48 +msgid "Move layout down" +msgstr "Переместить раскладку ниже" + +#: source/ubl-strings.h:49 +msgid "Add layout" +msgstr "Добавить раскладку" + +#: source/ubl-strings.h:50 +msgid "Remove layout" +msgstr "Удалить раскладку" + +#: source/ubl-strings.h:51 +msgid "Default" +msgstr "По умолчанию" + +#: source/ubl-strings.h:52 +msgid "On" +msgstr "Включить" + +#: source/ubl-strings.h:53 +msgid "Off" +msgstr "Выключить" + +#: source/ubl-strings.h:54 +msgid "Accept" +msgstr "Принять" + msgid "Afrikaans" msgstr "Африканский" @@ -415,9 +470,6 @@ msgstr "Ноутбук Fujitsu-Siemens Amilo" msgid "Hewlett-Packard Mini 110 laptop" msgstr "Ноутбук Hewlett-Packard Mini 110" -msgid "Acer laptop" -msgstr "Ноутбук Acer" - msgid "Asus laptop" msgstr "Ноутбук Asus" @@ -426,3 +478,6 @@ msgstr "Ноутбук Apple" msgid "eMachines m6800 laptop" msgstr "Ноутбук eMachines m6800" + +#~ msgid "Acer laptop" +#~ msgstr "Ноутбук Acer" From 748bfa33a2311c9e66a827eaec61f88662ffb2ca Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Thu, 21 Sep 2023 10:09:53 +0600 Subject: [PATCH 5/7] Confuguration loading has been improved --- .gitignore | 2 +- source/ubl-settings-keyboard.c | 33 ++++++++--------------------- ubl-settings-keyboard-layouts.glade | 5 +++++ ubl-settings-keyboard.glade | 8 ++++++- 4 files changed, 22 insertions(+), 26 deletions(-) diff --git a/.gitignore b/.gitignore index 0c934a6..d2863ef 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,5 @@ .vscode/ -ubl-settings-TEMPLATE +ubl-settings-keyboard *~ build/ compile/ diff --git a/source/ubl-settings-keyboard.c b/source/ubl-settings-keyboard.c index 6f28c63..4f3203b 100644 --- a/source/ubl-settings-keyboard.c +++ b/source/ubl-settings-keyboard.c @@ -103,6 +103,10 @@ void on_about(){ //functions void yon_load_proceed(YON_CONFIG_TYPE type, main_window *widgets){ + gtk_list_store_clear(widgets->layoutsList); + gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->ModelCombo),0); + gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->NumLockCombo),0); + gtk_entry_set_text(GTK_ENTRY(widgets->OptionsEntry),""); if (yon_config_load_register(type,"keyboard","XkbModel","keyboard","XkbLayout","keyboard","KEYBOARD","keyboard","XkbOptions","config","NUMLOCK",NULL)){ GtkTreeIter iter; char *name = yon_config_get_by_key("XkbModel"); @@ -262,18 +266,8 @@ void on_options_open(GtkWidget *self, main_window *widgets){ window->AcceptButton = yon_gtk_builder_get_widget(builder,"AcceptButton"); window->CancelButton = yon_gtk_builder_get_widget(builder,"CancelButton"); window->MainTree = yon_gtk_builder_get_widget(builder,"LayoutsTree"); - window->list = GTK_LIST_STORE(gtk_builder_get_object(builder,"liststore1")); - - int size; - config_str rtn = yon_config_load(get_options_command,&size); - GtkTreeIter iter; - for (int i=0; ilist,&iter); - gtk_list_store_set(window->list,&iter,0,option[0],1,option[1],-1); - } + window->list = main_config.options_list; + gtk_tree_view_set_model(GTK_TREE_VIEW(window->MainTree),GTK_TREE_MODEL(window->list)); dictionary *dict = NULL; yon_dictionary_add_or_create_if_exists_with_data(dict,"widgets",widgets); yon_dictionary_add_or_create_if_exists_with_data(dict,"window",window); @@ -309,15 +303,6 @@ void on_layouts_add(GtkWidget *self, main_window *widgets){ window->MainTree = yon_gtk_builder_get_widget(builder,"LayoutsTree"); window->list = main_config.layouts_list; gtk_tree_view_set_model(GTK_TREE_VIEW(window->MainTree), GTK_TREE_MODEL(window->list)); - int size,laysize; - GtkTreeIter iter; - config_str rtn = yon_config_load(get_layouts_command,&size); - for (int i=0; ilist,&iter); - gtk_list_store_set(window->list,&iter,0,layout[0],1,layout[1],-1); - } gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(window->MainTree)),GTK_SELECTION_MULTIPLE); dictionary *dict = NULL; @@ -449,7 +434,7 @@ main_window *setup_window(){ models[i] = yon_char_divide_search(models[i],"\n",-1); models[i+1] = yon_char_divide_search(models[i+1],"\n",-1); gtk_list_store_append(widgets->modelsList,&iter); - gtk_list_store_set(widgets->modelsList,&iter,1,models[i],0,models[i+1],-1); + gtk_list_store_set(widgets->modelsList,&iter,1,models[i],0,_(models[i+1]),-1); } main_config.layouts_list = gtk_list_store_new(2,G_TYPE_STRING,G_TYPE_STRING); int laysize; @@ -458,7 +443,7 @@ main_window *setup_window(){ rtn[i] = yon_char_divide_search(rtn[i],"\n",-1); config_str layout = yon_char_parse(rtn[i],&laysize,";"); gtk_list_store_append(main_config.layouts_list,&iter); - gtk_list_store_set(main_config.layouts_list,&iter,0,layout[0],1,layout[1],-1); + gtk_list_store_set(main_config.layouts_list,&iter,0,layout[0],1,_(layout[1]),-1); } main_config.options_list = gtk_list_store_new(2,G_TYPE_STRING,G_TYPE_STRING); rtn = yon_config_load(get_options_command,&size); @@ -467,7 +452,7 @@ main_window *setup_window(){ rtn[i] = yon_char_divide_search(rtn[i],"\n",-1); config_str option = yon_char_parse(rtn[i],&option_size,";"); gtk_list_store_append(main_config.options_list,&iter); - gtk_list_store_set(main_config.options_list,&iter,0,option[0],1,option[1],-1); + gtk_list_store_set(main_config.options_list,&iter,0,option[0],1,_(option[1]),-1); } /* Widget registration for config monitoring | Регистрация виджетов для мониторинга конфига */ diff --git a/ubl-settings-keyboard-layouts.glade b/ubl-settings-keyboard-layouts.glade index bbf24c4..29604eb 100644 --- a/ubl-settings-keyboard-layouts.glade +++ b/ubl-settings-keyboard-layouts.glade @@ -85,9 +85,14 @@ True liststore1 False + 1 + + + column + 0 diff --git a/ubl-settings-keyboard.glade b/ubl-settings-keyboard.glade index 6e97473..6c08022 100644 --- a/ubl-settings-keyboard.glade +++ b/ubl-settings-keyboard.glade @@ -646,6 +646,7 @@ translated and supported by community. True False Num Lock on boot: + 0 False @@ -716,7 +717,7 @@ translated and supported by community. True False - Keyboard Model: + Keyboard model: 0 @@ -815,6 +816,7 @@ translated and supported by community. True True True + Move layout up True @@ -848,6 +850,7 @@ translated and supported by community. True True True + Move layout down True @@ -880,6 +883,7 @@ translated and supported by community. True True True + Добавить раскладку image3 - - - - - - - - - - - diff --git a/com.ublinux.ubl-settings-keyboard.warning.svg b/com.ublinux.ubl-settings-keyboard.warning.svg deleted file mode 100644 index 9a90dba..0000000 --- a/com.ublinux.ubl-settings-keyboard.warning.svg +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - image/svg+xml - - - - - - - - diff --git a/gresource.xml b/gresource.xml index c03d777..507d914 100644 --- a/gresource.xml +++ b/gresource.xml @@ -8,7 +8,7 @@ ubl-settings-keyboard.css - - ubl-settings-keyboard-banner.png + + layouts.csv \ No newline at end of file diff --git a/com.ublinux.ubl-settings-keyboard.svg b/icons/apps/com.ublinux.ubl-settings-keyboard.svg similarity index 100% rename from com.ublinux.ubl-settings-keyboard.svg rename to icons/apps/com.ublinux.ubl-settings-keyboard.svg diff --git a/ubl-settings-keyboard.pot b/locale/ubl-settings-keyboard.pot similarity index 100% rename from ubl-settings-keyboard.pot rename to locale/ubl-settings-keyboard.pot diff --git a/ubl-settings-keyboard_ru.po b/locale/ubl-settings-keyboard_ru.po similarity index 100% rename from ubl-settings-keyboard_ru.po rename to locale/ubl-settings-keyboard_ru.po diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt index ded2868..5cabe32 100644 --- a/source/CMakeLists.txt +++ b/source/CMakeLists.txt @@ -8,10 +8,10 @@ include_directories(${GTK_INCLUDE_DIRS}) link_directories(${GTK_LIBRARY_DIRS}) add_definitions(${GTK_CFLAGS_OTHER}) -#pkg_check_modules(VTE291 REQUIRED vte-2.91) -#include_directories(${VTE291_INCLUDE_DIRS}) -#link_directories(${VTE291_LIBRARY_DIRS}) -#add_definitions(${VTE291_CFLAGS_OTHER}) +pkg_check_modules(VTE291 REQUIRED vte-2.91) +include_directories(${VTE291_INCLUDE_DIRS}) +link_directories(${VTE291_LIBRARY_DIRS}) +add_definitions(${VTE291_CFLAGS_OTHER}) find_library(WEBKIT_LIBRARIES_FOUND webkit2gtk-4.0 webkit2gtk-web-extension-4.0) @@ -24,10 +24,6 @@ if(WEBKIT_LIBRARIES_FOUND) 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) @@ -38,8 +34,8 @@ set(DEPENDFILES ../ubl-settings-keyboard.glade ../ubl-settings-keyboard-layouts.glade ../ubl-settings-keyboard-options.glade + ../layouts.csv ../gresource.xml - ../ubl-settings-keyboard-banner.png ../ubl-settings-keyboard.css ) @@ -63,28 +59,34 @@ add_custom_target( DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${GRESOURCE_C} ) -#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pedantic -Wall -Wextra -Werror -Wmissing-declarations -fdiagnostics-color=always -std=c++2a") -#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pedantic -Wall -Wextra -Werror -Wmissing-declarations -fdiagnostics-color=always -lm") -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pedantic -Wall -Wextra -Werror -Wmissing-declarations -fdiagnostics-color=always \ +add_definitions(-DVTE_INCLUDE) + +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Werror -Wmissing-declarations -fdiagnostics-color=always \ -O2 -pipe -fno-plt -fexceptions \ - -Wp,-D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security \ + -Wformat -Werror=format-security \ -fstack-clash-protection -fcf-protection") - + +string(FIND "${CMAKE_CXX_FLAGS}" "-D_FORTIFY_SOURCE" FORTIFY_FOUND) +if(FORTIFY_FOUND EQUAL -1) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wp,-D_FORTIFY_SOURCE=2") +endif() + set(SOURCE_FILES ubl-settings-keyboard.c ubl-settings-keyboard.h ubl-strings.h - ubl-utils.h - ubl-utils.c - ${CMAKE_CURRENT_BINARY_DIR}/ubl-cmake.h ) set(LIBRARIES ${GTK_LIBRARIES} ${WEBKIT_LIBRARIES} -# ${VTE291_LIBRARIES} - pthread) + ${UTILS_LIBRARIES} + ${VTE291_LIBRARIES} + pthread + ublsettings + ublsettings-gtk3 + ublsettingsui-gtk3) add_executable(${PROJECT_NAME} ${SOURCE_FILES} ${CMAKE_CURRENT_BINARY_DIR}/${GRESOURCE_C}) diff --git a/source/ubl-cmake.in b/source/ubl-cmake.in deleted file mode 100644 index d4623a7..0000000 --- a/source/ubl-cmake.in +++ /dev/null @@ -1 +0,0 @@ -#cmakedefine WEBKIT_FOUND diff --git a/source/ubl-settings-keyboard.c b/source/ubl-settings-keyboard.c index 9e1ba4d..c30193a 100644 --- a/source/ubl-settings-keyboard.c +++ b/source/ubl-settings-keyboard.c @@ -2,234 +2,176 @@ 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)); +void on_save_done(main_window *, config_str output, int size){ + char *final_output = yon_char_parsed_to_string(output,size,""); + if (final_output){ + printf("%s\n",final_output); + free(final_output); + } + yon_char_parsed_free(output,size); + textdomain(template_ui_LocaleName); + switch (main_config.save_config){ + case 0: + yon_ubl_status_box_render(GLOBAL_SAVE_SUCCESS_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); + break; + case 1: + yon_ubl_status_box_render(LOCAL_SAVE_SUCCESS_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); + break; + case 2: + yon_ubl_status_box_render(GLOBAL_LOCAL_SAVE_SUCCESS_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); + break; + } + textdomain(LocaleName); + } -/**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); +void on_config_global_local_save(GtkWidget *, main_window *){ + main_config.save_config=3; + yon_save_proceed(NULL,YON_CONFIG_BOTH,config_get_global_command,NULL); } -/**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); - } +void on_config_local_save(GtkWidget *, main_window *){ + main_config.save_config=1; + yon_save_proceed("system",YON_CONFIG_LOCAL,config_get_local_command,NULL); + +} + +void on_config_global_save(GtkWidget *, main_window *){ + main_config.save_config=0; + yon_save_proceed("global",YON_CONFIG_GLOBAL,config_get_global_command,NULL); + +} + +void on_config_custom_save(GtkWidget *, main_window *){ + main_config.save_config=1; + template_saving_window *window = yon_save_proceed(NULL,YON_CONFIG_CUSTOM,yon_config_get_custom_command("system"),NULL); + if (window){}; } -/**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); +void on_config_local_load(GtkWidget *,main_window *widgets){ + yon_load_proceed(YON_CONFIG_LOCAL); + g_idle_add((GSourceFunc)yon_interface_update,widgets); + main_config.load_mode=1; } -/**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); +void on_config_global_load(GtkWidget *,main_window *widgets){ + yon_load_proceed(YON_CONFIG_GLOBAL); + g_idle_add((GSourceFunc)yon_interface_update,widgets); + main_config.load_mode=0; + } -//functions +void on_config_custom_load(GtkWidget *,main_window *widgets){ + yon_load_proceed(YON_CONFIG_CUSTOM); + textdomain(template_ui_LocaleName); + yon_ubl_status_box_render(GLOBAL_LOAD_SUCCESS_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); + textdomain(LocaleName); + main_config.load_mode=3; + g_idle_add((GSourceFunc)yon_interface_update,widgets); +} -void yon_load_proceed(YON_CONFIG_TYPE type, main_window *widgets){ +void yon_load_proceed(YON_CONFIG_TYPE type){ + yon_config_clean(); + if (!yon_char_is_empty(config_get_default_command)) + yon_config_load_config(YON_CONFIG_DEFAULT,config_get_default_command,NULL); + if (type==YON_CONFIG_GLOBAL){ + yon_config_load_config(type,config_get_global_command,NULL); + } else if (type==YON_CONFIG_LOCAL){ + yon_config_load_config(type,config_get_local_command,NULL); + } else if (type==YON_CONFIG_CUSTOM){ + char *path=""; + textdomain(template_ui_LocaleName); + GtkWidget *dialog = gtk_file_chooser_dialog_new(template_app_information.app_title,NULL,GTK_FILE_CHOOSER_ACTION_SAVE,CANCEL_LABEL,GTK_RESPONSE_CANCEL,OPEN_LABEL,GTK_RESPONSE_ACCEPT,NULL); + textdomain(LocaleName); + gtk_window_set_icon_name(GTK_WINDOW(dialog),"com.ublinux.ubl-settings-services"); + gtk_window_set_title(GTK_WINDOW(dialog),TITLE_LABEL); + GtkFileFilter *filter = gtk_file_filter_new(); + gtk_file_filter_add_pattern(filter,"*.ini"); + gtk_file_filter_set_name(filter, "*.ini"); + gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog),filter); + gtk_widget_show(dialog); + int response = gtk_dialog_run(GTK_DIALOG(dialog)); + if (response == GTK_RESPONSE_ACCEPT){ + char *file = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); + if (!yon_char_is_empty(file)){ + path=file; + } + gtk_widget_destroy(dialog); + } else { + gtk_widget_destroy(dialog); + } + char *command = yon_config_get_custom_command(path); + yon_config_load_config(type,command,NULL); + } +} + +gboolean yon_interface_update(main_window *widgets){ gtk_list_store_clear(widgets->layoutsList); + gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->ModelCombo),0); gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->NumLockCombo),0); - gtk_entry_set_text(GTK_ENTRY(widgets->OptionsEntry),DEFAULT_LABEL); - char *name; - if (yon_config_load_register(type,"keyboard","XkbModel","keyboard","XkbLayout","keyboard","KEYBOARD","keyboard","XkbOptions","config","NUMLOCK",NULL)){ GtkTreeIter iter; - name = yon_config_get_by_key("XkbModel"); - char *id; - if (name) { - int valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(widgets->modelsList),&iter); - for (;valid;valid=gtk_tree_model_iter_next(GTK_TREE_MODEL(widgets->modelsList),&iter)){ - gtk_tree_model_get(GTK_TREE_MODEL(widgets->modelsList),&iter,0,&id,-1); - if (!strcmp(name,id)){ - gtk_combo_box_set_active_iter(GTK_COMBO_BOX(widgets->ModelCombo),&iter); - break; - } - } - } else gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->ModelCombo),0); - free(name); - name = yon_config_get_by_key("XkbOptions"); - if (name) { - char *id, *rname; - gtk_entry_set_text(GTK_ENTRY(widgets->OptionsEntry),name); - int valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(main_config.options_list),&iter); - for (;valid;valid=gtk_tree_model_iter_next(GTK_TREE_MODEL(main_config.options_list),&iter)){ - gtk_tree_model_get(GTK_TREE_MODEL(main_config.options_list),&iter,0,&id,1,&rname,-1); - if (!strcmp(id,name)) gtk_entry_set_text(GTK_ENTRY(widgets->OptionsEntry),rname); + gtk_entry_set_text(GTK_ENTRY(widgets->OptionsEntry),DEFAULT_LABEL); + char *name = yon_config_get_by_key("XkbModel"); + char *id; + if (name) { + int valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(widgets->modelsList),&iter); + for (;valid;valid=gtk_tree_model_iter_next(GTK_TREE_MODEL(widgets->modelsList),&iter)){ + gtk_tree_model_get(GTK_TREE_MODEL(widgets->modelsList),&iter,0,&id,-1); + if (!strcmp(name,id)){ + gtk_combo_box_set_active_iter(GTK_COMBO_BOX(widgets->ModelCombo),&iter); + break; } } - free(name); - name = yon_config_get_by_key("NUMLOCK"); - if (name) { - if (!strcmp(name,"yes")) gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->NumLockCombo),1); - else if (!strcmp(name,"no")) gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->NumLockCombo),2); + } else gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->ModelCombo),0); + free(name); + name = yon_config_get_by_key("XkbOptions"); + if (name) { + char *id, *rname; + gtk_entry_set_text(GTK_ENTRY(widgets->OptionsEntry),name); + int valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(main_config.options_list),&iter); + for (;valid;valid=gtk_tree_model_iter_next(GTK_TREE_MODEL(main_config.options_list),&iter)){ + gtk_tree_model_get(GTK_TREE_MODEL(main_config.options_list),&iter,0,&id,1,&rname,-1); + if (!strcmp(id,name)) gtk_entry_set_text(GTK_ENTRY(widgets->OptionsEntry),rname); } - else gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->NumLockCombo),0); - free(name); } + free(name); + name = yon_config_get_by_key("NUMLOCK"); + if (name) { + if (!strcmp(name,"yes")) gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->NumLockCombo),1); + else if (!strcmp(name,"no")) gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->NumLockCombo),2); + } + else gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->NumLockCombo),0); + free(name); if (main_config.layouts_list){ int size=0; name = yon_config_get_by_key("XkbLayout"); - if (!name){ - int sizes; - config_str rtn = yon_config_load(get_defaults_command,&sizes); - name = yon_char_divide_search(rtn[0],"\n",-1); - yon_char_divide_search(name,"=",-1); - } - config_str layouts = yon_char_parse(name,&size,","); - GtkTreeIter iter; - char *rid,*rname; - gtk_list_store_clear(widgets->layoutsList); - for (int i=0;ilayoutsList,&iter); - gtk_list_store_set(widgets->layoutsList,&iter,0,rname,1,rid,2,0,-1); - } + config_str layouts = yon_char_parse(name,&size,","); + GtkTreeIter iter; + char *rid,*rname; + gtk_list_store_clear(widgets->layoutsList); + for (int i=0;ilayoutsList,&iter); + gtk_list_store_set(widgets->layoutsList,&iter,0,rname,1,rid,2,0,-1); } } - - - } - - yon_ubl_status_box_render(LOCAL_LOAD_SUCCESS_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE); - -} - -void on_config_global_load(GtkWidget *self, main_window *widgets){ - yon_load_proceed(YON_CONFIG_GLOBAL,widgets); -} - -void on_config_local_load(GtkWidget *self, main_window *widgets){ - yon_load_proceed(YON_CONFIG_LOCAL,widgets); -} - -void yon_save_proceed(char *path,main_window *widgets) { - GtkTreeIter iter; - char *final_string=""; - char *id,*name; - gboolean is_edited; - gboolean generic; - int valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(widgets->layoutsList),&iter); - if (!valid) yon_config_remove_by_key(keyboard_layout_parameter); - else { - for (;valid;valid=gtk_tree_model_iter_next(GTK_TREE_MODEL(widgets->layoutsList),&iter)){ - gtk_tree_model_get(GTK_TREE_MODEL(widgets->layoutsList),&iter,0,&name,1,&id,2,!is_edited ? &is_edited : &generic ,-1); - final_string = yon_char_unite(strcmp(final_string,"") ? yon_char_append(final_string,",") : "" ,id,NULL); } - if (is_edited) - if (yon_config_get_by_key(keyboard_layout_parameter)) - yon_config_set(keyboard_layout_parameter,final_string); - else yon_config_register(keyboard_layout_parameter,"keyboard",final_string); } - yon_config_save_registered(path); -} - -void on_config_global_local_save(GtkWidget *self,main_window *widgets){ - yon_save_proceed(NULL,widgets); -} - -void on_config_global_save(GtkWidget *self,main_window *widgets){ - yon_save_proceed("global",widgets); - -} - -void on_config_local_save(GtkWidget *self,main_window *widgets){ - yon_save_proceed("system",widgets); - + return G_SOURCE_REMOVE; } -void on_num_lock_changed(GtkComboBox *self, main_window *widgets){ +void on_num_lock_changed(GtkComboBox *self, main_window *){ switch (gtk_combo_box_get_active(self)){ case 0: yon_config_remove_by_key(num_lock_boot_parameter); break; - case 1: - if (yon_config_get_by_key(num_lock_boot_parameter)) - yon_config_set(num_lock_boot_parameter,"yes"); - else yon_config_register(num_lock_boot_parameter,"config","yes"); + case 1: yon_config_register(num_lock_boot_parameter,num_lock_boot_parameter_command,"yes"); break; - case 2: - if (yon_config_get_by_key(num_lock_boot_parameter)) - yon_config_set(num_lock_boot_parameter,"no"); - else yon_config_register(num_lock_boot_parameter,"config","no"); + case 2:yon_config_register(num_lock_boot_parameter,num_lock_boot_parameter_command,"no"); break; } } @@ -243,10 +185,8 @@ void on_model_changed(GtkComboBoxText *self, main_window *widgets){ char *id; GtkTreeIter iter; gtk_combo_box_get_active_iter(GTK_COMBO_BOX(widgets->ModelCombo),&iter); - gtk_tree_model_get(GTK_TREE_MODEL(widgets->modelsList),&iter,0,&id,-1); - if (yon_config_get_by_key(model_parameter)) - yon_config_set(model_parameter,id); - else yon_config_register(model_parameter,"keyboard",id); + gtk_tree_model_get(GTK_TREE_MODEL(widgets->modelsList),&iter,1,&id,-1); + yon_config_register(model_parameter,model_parameter_command,id); break; } @@ -261,15 +201,32 @@ void on_options_accept(GtkWidget *self, dictionary *dict){ if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(window->MainTree)),&model,&iter)){ gtk_tree_model_get(model,&iter,0,&id,1,&name,-1); gtk_entry_set_text(GTK_ENTRY(widgets->OptionsEntry),name); - if (yon_config_get_by_key(options_parameter)) - yon_config_set(options_parameter,id); - else yon_config_register(options_parameter,"keyboard",id); + yon_config_register(options_parameter,options_parameter_command,id); } - on_close_subwindow(self); + on_subwindow_close(self); +} + +void yon_layouts_save(main_window *widgets){ + GtkTreeIter iter; + GtkTreeIter child_iter; + int size; + config_str parsed = NULL; + for_iter(widgets->layoutsFilter,&iter){ + char *name, *id; + gtk_tree_model_filter_convert_iter_to_child_iter(GTK_TREE_MODEL_FILTER(widgets->layoutsFilter),&child_iter,&iter); + gtk_tree_model_get(GTK_TREE_MODEL(widgets->layoutsList),&child_iter,0,&name,1,&id,-1); + yon_char_parsed_add_or_create_if_exists(parsed,&size,id); + } + if (parsed&&size>0){ + yon_config_register(keyboard_layout_parameter,keyboard_layout_parameter_command,yon_char_parsed_to_string(parsed,size,",")); + yon_char_parsed_free(parsed,size); + } else { + yon_config_remove_by_key(keyboard_layout_parameter); + } } -void on_options_open(GtkWidget *self, main_window *widgets){ +void on_options_open(GtkWidget *, main_window *widgets){ GtkBuilder *builder = gtk_builder_new_from_resource(glade_layouts_path); layouts_window *window = malloc(sizeof(layouts_window)); window->Window = yon_gtk_builder_get_widget(builder,"Window"); @@ -281,7 +238,7 @@ void on_options_open(GtkWidget *self, main_window *widgets){ dictionary *dict = NULL; yon_dictionary_add_or_create_if_exists_with_data(dict,"widgets",widgets); yon_dictionary_add_or_create_if_exists_with_data(dict,"window",window); - g_signal_connect(G_OBJECT(window->CancelButton),"clicked",G_CALLBACK(on_close_subwindow),NULL); + g_signal_connect(G_OBJECT(window->CancelButton),"clicked",G_CALLBACK(on_subwindow_close),NULL); g_signal_connect(G_OBJECT(window->AcceptButton),"clicked",G_CALLBACK(on_options_accept),dict); } @@ -294,17 +251,18 @@ void on_layouts_accept(GtkWidget *self, dictionary *dict){ char *id; GtkTreeIter iter, lwiter; GtkTreePath *pth; - for (int i=0;ilayoutsList,&iter); gtk_tree_model_get(model,&lwiter,0,&name,1,&id,-1); gtk_list_store_set(widgets->layoutsList,&iter,1,name,0,id,2,1,-1); } - on_close_subwindow(self); + yon_layouts_save(widgets); + on_subwindow_close(self); } -void on_layouts_add(GtkWidget *self, main_window *widgets){ +void on_layouts_add(GtkWidget *, main_window *widgets){ GtkBuilder *builder = gtk_builder_new_from_resource(glade_layouts_path); layouts_window *window = malloc(sizeof(layouts_window)); window->Window = yon_gtk_builder_get_widget(builder,"Window"); @@ -319,35 +277,48 @@ void on_layouts_add(GtkWidget *self, main_window *widgets){ yon_dictionary_add_or_create_if_exists_with_data(dict,"widgets",widgets); yon_dictionary_add_or_create_if_exists_with_data(dict,"window",window); - g_signal_connect(G_OBJECT(window->CancelButton),"clicked",G_CALLBACK(on_close_subwindow),NULL); + g_signal_connect(G_OBJECT(window->CancelButton),"clicked",G_CALLBACK(on_subwindow_close),NULL); g_signal_connect(G_OBJECT(window->AcceptButton),"clicked",G_CALLBACK(on_layouts_accept),dict); } -void on_layouts_remove(GtkWidget *self, main_window *widgets){ +void on_layouts_remove(GtkWidget *, main_window *widgets){ GtkTreeModel *model = GTK_TREE_MODEL(widgets->layoutsList); GtkTreeIter iter; if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->LayoutsTree)),&model,&iter)){ - gtk_list_store_remove(widgets->layoutsList,&iter); + GtkTreeIter iter_converted; + gtk_tree_model_filter_convert_iter_to_child_iter(widgets->layoutsFilter,&iter_converted,&iter); + gtk_list_store_remove(widgets->layoutsList,&iter_converted); } } -void on_move_up(GtkWidget *self, main_window *widgets){ - GtkTreeModel *model = GTK_TREE_MODEL(widgets->layoutsList); +void on_move_up(GtkWidget *, main_window *widgets){ + GtkTreeModel *model = GTK_TREE_MODEL(widgets->layoutsFilter); GtkTreeIter iter,*previter; if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->LayoutsTree)),&model,&iter)){ previter = gtk_tree_iter_copy(&iter); if (gtk_tree_model_iter_previous(model,previter)) - gtk_list_store_move_before(widgets->layoutsList,&iter,previter); + { + GtkTreeIter iter_converted, previter_converted; + gtk_tree_model_filter_convert_iter_to_child_iter(widgets->layoutsFilter,&iter_converted,&iter); + gtk_tree_model_filter_convert_iter_to_child_iter(widgets->layoutsFilter,&previter_converted,previter); + gtk_list_store_move_before(widgets->layoutsList,&iter_converted,&previter_converted); + yon_layouts_save(widgets); + } } } -void on_move_down(GtkWidget *self, main_window *widgets){ - GtkTreeModel *model = GTK_TREE_MODEL(widgets->layoutsList); +void on_move_down(GtkWidget *, main_window *widgets){ + GtkTreeModel *model = GTK_TREE_MODEL(widgets->layoutsFilter); GtkTreeIter iter,*nextiter; if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->LayoutsTree)),&model,&iter)){ nextiter = gtk_tree_iter_copy(&iter); - if (gtk_tree_model_iter_next(model,nextiter)) - gtk_list_store_move_after(widgets->layoutsList,&iter,nextiter); + if (gtk_tree_model_iter_next(model,nextiter)){ + GtkTreeIter iter_converted, nextiter_converted; + gtk_tree_model_filter_convert_iter_to_child_iter(widgets->layoutsFilter,&iter_converted,&iter); + gtk_tree_model_filter_convert_iter_to_child_iter(widgets->layoutsFilter,&nextiter_converted,nextiter); + gtk_list_store_move_after(widgets->layoutsList,&iter_converted,&nextiter_converted); + yon_layouts_save(widgets); + } } } @@ -356,50 +327,13 @@ void on_move_down(GtkWidget *self, main_window *widgets){ // 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"); +void yon_main_window_complete(main_window *widgets){ + widgets = yon_remalloc(widgets,sizeof(main_window)); + GtkBuilder *builder = gtk_builder_new_from_resource(glade_path); + gtk_box_pack_start(GTK_BOX(widgets->InterfaceBox),yon_gtk_builder_get_widget(builder,"BoxMain"),1,1,0); + // Custom widgets configuration + { widgets->NumLockCombo = yon_gtk_builder_get_widget(builder,"NumlockCombo"); widgets->ModelCombo = yon_gtk_builder_get_widget(builder,"ModelCombo"); @@ -414,29 +348,9 @@ main_window *setup_window(){ widgets->AddButton = yon_gtk_builder_get_widget(builder,"AddButton"); widgets->RemoveButton = yon_gtk_builder_get_widget(builder,"RemoveButton"); widgets->layoutsList = GTK_LIST_STORE(gtk_builder_get_object(builder,"liststore1")); + widgets->layoutsFilter = GTK_TREE_MODEL_FILTER(gtk_builder_get_object(builder,"LayoutsFilter")); widgets->modelsList = GTK_LIST_STORE(gtk_builder_get_object(builder,"liststore2")); - widgets->DocumentationMenuItem = yon_ubl_menu_item_documentation_new(DOCUMENTATION_LABEL); - widgets->AboutMenuItem = yon_ubl_menu_item_about_new(ABOUT_LABEL); - - gtk_window_set_title(GTK_WINDOW(widgets->Window),TITLE_LABEL); - - GtkWidget *menu = yon_gtk_builder_get_widget(builder,"menu2"); - gtk_menu_shell_append(GTK_MENU_SHELL(menu),widgets->DocumentationMenuItem); - gtk_menu_shell_append(GTK_MENU_SHELL(menu),widgets->AboutMenuItem); - - 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); - } - int size; GtkTreeIter iter; config_str models = yon_config_load(get_models_command,&size); @@ -446,11 +360,11 @@ main_window *setup_window(){ gtk_list_store_append(widgets->modelsList,&iter); gtk_list_store_set(widgets->modelsList,&iter,1,models[i],0,_(models[i+1]),-1); } - main_config.layouts_list = gtk_list_store_new(2,G_TYPE_STRING,G_TYPE_STRING); + main_config.layouts_list = gtk_list_store_new(3,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_BOOLEAN); int laysize; - config_str rtn = yon_config_load(get_layouts_command,&size); + config_str rtn = yon_resource_open_file(layouts_path,&size); for (int i=0; iHeadInfoLabel,"head-text","label",YON_TYPE_STRING); /* Signal connection | Присоединение сигналов */ - g_signal_connect(G_OBJECT(widgets->DocumentationMenuItem),"activate",G_CALLBACK(on_open_documentation_confirmation),WIKI_LINK); - g_signal_connect(G_OBJECT(widgets->AboutMenuItem),"activate",G_CALLBACK(on_about),NULL); g_signal_connect(G_OBJECT(widgets->AddButton),"clicked",G_CALLBACK(on_layouts_add),widgets); g_signal_connect(G_OBJECT(widgets->RemoveButton),"clicked",G_CALLBACK(on_layouts_remove),widgets); @@ -479,112 +391,43 @@ main_window *setup_window(){ g_signal_connect(G_OBJECT(widgets->MoveUpButton),"clicked",G_CALLBACK(on_move_up),widgets); g_signal_connect(G_OBJECT(widgets->OptionsButton),"clicked",G_CALLBACK(on_options_open),widgets); g_signal_connect(G_OBJECT(widgets->NumLockCombo),"changed",G_CALLBACK(on_num_lock_changed),widgets); + } - g_signal_connect(G_OBJECT(widgets->SaveMenuItem),"activate",G_CALLBACK(on_config_global_local_save),widgets); - g_signal_connect(G_OBJECT(widgets->SaveGlobalMenuItem),"activate",G_CALLBACK(on_config_global_save),widgets); - g_signal_connect(G_OBJECT(widgets->SaveLocalMenuItem),"activate",G_CALLBACK(on_config_local_save),widgets); - - g_signal_connect(G_OBJECT(widgets->LoadGlobalMenuItem),"activate",G_CALLBACK(on_config_global_load),widgets); g_signal_connect(G_OBJECT(widgets->LoadLocalMenuItem),"activate",G_CALLBACK(on_config_local_load),widgets); - + g_signal_connect(G_OBJECT(widgets->LoadGlobalMenuItem),"activate",G_CALLBACK(on_config_global_load),widgets); + g_signal_connect(G_OBJECT(widgets->LoadCustomMenuItem),"activate",G_CALLBACK(on_config_custom_load),widgets); + + g_signal_connect(G_OBJECT(widgets->SaveMenuItem),"activate",G_CALLBACK(on_config_global_local_save),NULL); + g_signal_connect(G_OBJECT(widgets->SaveLocalMenuItem),"activate",G_CALLBACK(on_config_local_save),NULL); + g_signal_connect(G_OBJECT(widgets->SaveGlobalMenuItem),"activate",G_CALLBACK(on_config_global_save),NULL); + g_signal_connect(G_OBJECT(widgets->SaveCustomMenuItem),"activate",G_CALLBACK(on_config_custom_save),NULL); + + yon_root_button_setup((template_main_window*)widgets,main_config.launch_arguments,main_config.launch_size); + yon_save_window_set_postsave_function(on_save_done,widgets); - gtk_widget_show(widgets->Window); - return widgets; + on_config_local_load(NULL,widgets); } -int main(int argc, char *argv[]){ - local=setlocale(LC_ALL, ""); +int main(int argc, char *argv[]){ + 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); - on_config_local_load(NULL,widgets); - GtkCssProvider *css=gtk_css_provider_new(); - gtk_css_provider_load_from_resource(css,CssPath); - gtk_style_context_add_provider_for_screen(gdk_screen_get_default(), - GTK_STYLE_PROVIDER(css), - -1); + //turn off if custom presented + // yon_ubl_settings_window_set_standard_callbacks(widgets,config_get_global_command,config_get_local_command,yon_config_get_custom_command("./"),config_get_default_command,config_get_global_only_parameters,config_get_local_only_parameters); + + yon_main_window_complete((main_window*)widgets); + char *path = yon_char_unite(yon_ubl_user_get_home_directory(),"/.config/",LocaleName,"/",LocaleName,".conf",NULL); + yon_window_config_load(path); + main_config.launch_arguments=yon_char_parsed_copy(argv,argc); + main_config.launch_size=argc; gtk_main(); + return 0; } \ No newline at end of file diff --git a/source/ubl-settings-keyboard.h b/source/ubl-settings-keyboard.h index b34d78d..17eab8b 100644 --- a/source/ubl-settings-keyboard.h +++ b/source/ubl-settings-keyboard.h @@ -1,98 +1,73 @@ #include #include -#include "ubl-utils.h" #include #include #include #include #include #include -#include -#include "../compile/ubl-cmake.h" +#include +#include +#include #ifdef WEBKIT_FOUND #include #endif #include "ubl-strings.h" -#define WIKI_LINK "https://wiki.ublinux.ru/ru/Программное_обеспечение/Программы_и_утилиты/Все/ubl-settings-keyboard" - #define _(String) gettext(String) + + #define glade_path "/com/ublinux/ui/ubl-settings-keyboard.glade" #define glade_layouts_path "/com/ublinux/ui/ubl-settings-keyboard-layouts.glade" #define glade_options_path "/com/ublinux/ui/ubl-settings-keyboard-options.glade" #define banner_path "/com/ublinux/images/ubl-settings-keyboard-banner.png" #define CssPath "/com/ublinux/css/ubl-settings-keyboard.css" #define config_path yon_char_unite(yon_ubl_user_get_home_directory(),"/.config/",LocaleName,"/",LocaleName,".conf",NULL) +#define icon_path "com.ublinux.ubl-settings-keyboard" -#define model_parameter "XkbModel" -#define keyboard_layout_parameter "XkbLayout" -#define options_parameter "XkbOptions" +#define LocaleName "ubl-settings-keyboard" + +#define model_parameter "XKBMODEL" +#define model_parameter_command "ubconfig --source global get keyboard XKBMODEL" +#define keyboard_layout_parameter "XKBLAYOUT" +#define keyboard_layout_parameter_command "ubconfig --source global get keyboard XKBLAYOUT" +#define options_parameter "XKBOPTIONS" +#define options_parameter_command "ubconfig --source global get keyboard XKBOPTIONS" #define num_lock_boot_parameter "NUMLOCK" +#define num_lock_boot_parameter_command "ubconfig --source global get config NUMLOCK" + +#define yon_config_get_custom_command(target) yon_char_unite("ubconfig --source ",target," get config NUMLOCK; ubconfig --source ",target," get keyboard XKBMODEL XKBLAYOUT XKBOPTIONS",NULL) +#define config_get_local_command "ubconfig --source system get config NUMLOCK; ubconfig --source global get keyboard XKBMODEL XKBLAYOUT XKBOPTIONS" +#define config_get_global_command "ubconfig --source global get config NUMLOCK; ubconfig --source global get keyboard XKBMODEL XKBLAYOUT XKBOPTIONS" +#define config_get_default_command "" + +#define config_get_global_only_parameters "" +#define config_get_local_only_parameters "" + #define get_options_command "grep -E \"grp:.*toggle|grp_led:.*toggle|compose:.*toggle\" /usr/share/X11/xkb/rules/base.lst|sed -e 's/^ *//g' -e 's/\t//g' -e 's/toggle */toggle;/g'" #define get_models_command "sed '/<\\/modelList>/q' /usr/share/X11/xkb/rules/base.xml | grep -E '^ {8,8}|^ {8,8}'|sed -e 's/ *//g' -e 's,,,g' -e 's/ *//g' -e 's,,,g'" -#define get_layouts_command "grep '' /usr/share/ubl-settings-keyboard/csv/layouts.csv" - -#define get_defaults_command "ubconfig --default get keyboard XkbLayout" +#define layouts_path "resource:///com/ublinux/csv/layouts.csv" -#define LocalePath "/usr/share/locale" -#define LocaleName "ubl-settings-keyboard" typedef char* string; -string version_application; -char *local; +__attribute__((unused)) static \ +string version_application; 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; + template_config_fields + int save_config; + config_str launch_arguments; + int launch_size; char *options; GtkListStore *layouts_list; GtkListStore *options_list; } config; typedef struct { - //Standard - 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; - // Custom + template_window_fields + GtkWidget *NumLockCombo; GtkWidget *ModelCombo; GtkWidget *keyboard; @@ -105,6 +80,7 @@ typedef struct { GtkWidget *MoveDownButton; GtkWidget *AddButton; GtkWidget *RemoveButton; + GtkTreeModelFilter *layoutsFilter; GtkListStore *layoutsList; GtkListStore *modelsList; } main_window; @@ -136,4 +112,31 @@ typedef struct { GtkWidget *AcceptButton; } options_window; -main_window *setup_window(); \ No newline at end of file +void on_save_done(main_window *, config_str output, int size); +void on_config_global_local_save(GtkWidget *, main_window *); +void on_config_local_save(GtkWidget *, main_window *); +void on_config_global_save(GtkWidget *, main_window *); +void on_config_custom_save(GtkWidget *, main_window *); +void on_config_local_load(GtkWidget *,main_window *); +void on_config_global_load(GtkWidget *,main_window *); +void on_config_custom_load(GtkWidget *,main_window *); + +void yon_load_proceed(YON_CONFIG_TYPE type); + +gboolean yon_interface_update(main_window *); + +void on_save_done(main_window *widgets, config_str output, int size); + +void config_init(); + +void yon_main_window_complete(main_window *widgets); +void on_move_down(GtkWidget *self, main_window *widgets); +void on_move_up(GtkWidget *self, main_window *widgets); +void on_layouts_add(GtkWidget *self, main_window *widgets); +void on_layouts_accept(GtkWidget *self, dictionary *dict); +void on_options_open(GtkWidget *self, main_window *widgets); +void on_options_accept(GtkWidget *self, dictionary *dict); +void on_model_changed(GtkComboBoxText *self, main_window *widgets); +void on_num_lock_changed(GtkComboBox *self, main_window *widgets); +void on_layouts_remove(GtkWidget *, main_window *widgets); +void yon_layouts_save(main_window *widgets); \ No newline at end of file diff --git a/source/ubl-strings.h b/source/ubl-strings.h index 8e7480e..21c8f9d 100644 --- a/source/ubl-strings.h +++ b/source/ubl-strings.h @@ -1,42 +1,8 @@ -#define VERSION_LABEL yon_char_unite(_("Version:")," ",version_application,"\n",NULL) -#define HELP_LABEL yon_char_unite(_("ubl-settings-keyboard version:")," ", version_application,"\n",TITLE_LABEL,"\n",_("Usage:"), " ubl-settings-keyboard ",_("[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 WIKI_LINK _("https://wiki.ublinux.ru/ru/Программное_обеспечение/Программы_и_утилиты/Все/ubl-settings-keyboard") #define TITLE_LABEL _("Keyboard") #define TITLE_INFO_LABEL _("Keyboard 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 CONSOLE_LABEL _("Console") #define NUM_LOCK_LABEL _("Num Lock on boot:") #define KEYBOARD_LABEL _("Keyboard") diff --git a/source/ubl-utils.c b/source/ubl-utils.c deleted file mode 100644 index 338e917..0000000 --- a/source/ubl-utils.c +++ /dev/null @@ -1,2076 +0,0 @@ -#include "ubl-utils.h" - -// dictionary functions - -/**yon_dictionary_new(): - * [EN] - * Creates and returns empty dictionary - * [RU] - * Создаёт и возвращает пустой словарь. - */ -dictionary *yon_dictionary_new() -{ - dictionary *dict = malloc(sizeof(dictionary)); - dict->data = NULL; - dict->key = NULL; - dict->next = NULL; - dict->prev = NULL; - dict->first = dict; - dict->data_type = DICTIONARY_OTHER_TYPE; - return dict; -} - -/**yon_dictionary_copy(dictionary *dict) - * [EN] - * - * [RU] - * Создаёт и возвращает копию элемента словаря [dict] -*/ -dictionary *yon_dictinoary_copy(dictionary *dict){ - dictionary *dct = yon_dictionary_new_with_data(dict->key,dict->data); - dct->data_type= dict->data_type; - return dct; -} - -/**yon_dictionary_copy_deep(dictionary *dict) - * [EN] - * - * [RU] - * Создаёт полную копию словаря [dict] и возвращает первый элемент -*/ -dictionary *yon_dictionary_copy_deep(dictionary *dict){ - dictionary *dct = NULL; - dictionary *newone=NULL; - for_dictionaries(dct,dict){ - yon_dictionary_add_or_create_if_exists_with_data(newone,dct->key,dct->data); - newone->data_type=dct->data_type; - } - return newone->first; -} - -/**int yon_dictionary_set_data(dictionary *dict, void *data) - * [EN] - * - * [RU] - * Установить элементу словаря [dict] значение [data] -*/ -int yon_dictionary_set_data(dictionary *dict, void *data){ - dict->data=data; -} - -/**int yon_dictionary_set_key(dictionary *dict, char *key) - * [EN] - * - * [RU] - * Изменяет ключ элемента словаря [dict] на [key] -*/ -int yon_dictionary_set_key(dictionary *dict, char *key){ - dict->key=key; - return 1; -} - -/** int yon_dictionary_set(dictionary *dict, char *key, void *data) - * [EN] - * - * [RU] -* Устанавливает значение ключа элемента словаря [dict] на [key] и его данные на [data] -*/ -int yon_dictionary_set(dictionary *dict, char *key, void *data){ - dict->key=key; - dict->data=data; - return 1; -} - -/**int yon_dictionary_empty(dictionary *dict) - * [EN] - * - * [RU] - * Очищает элемент словаря [dict] от данных -*/ -int yon_dictionary_empty(dictionary *dict){ - dict->data=NULL; - dict->data_type=DICTIONARY_OTHER_TYPE; - return 1; -} - -/**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 - -int yon_char_find_last(char *source, char find){ - int size = strlen(source); - int i=size; - for (;source[i]!=find&&i>0;i--); - return i; -} - -/**[EN] - * - * creates new char string by combining two char strings. - */ -char *yon_char_append(char *source, char *append) -{ - if (source && append) - { - int size = strlen(source) + strlen(append) + 1; - char *final = malloc(size); - memset(final, 0, size); - if (strstr(source, "%%")) - sprintf(final, source, append); - else - sprintf(final, "%s%s", source, append); - return final; - } - else - return NULL; -} - -/**[EN] - * - * creates new char string by copying another char. - */ -char *yon_char_new(char *chr) -{ - if (chr){ - char *newchar = malloc(strlen(chr) + 1); - memset(newchar, 0, strlen(chr) + 1); - memcpy(newchar, chr, strlen(chr)); - return newchar; - } else - return NULL; -} - -/**yon_char_unite(char *source, ...) - * [En] - * - * [RU] - * Объединяет строку [source] со всеми строками, написанными в [...] -*/ -char *yon_char_unite(char *source, ...){ - va_list arglist; - char *new_char=NULL; - char *unite_char=NULL; - new_char=yon_char_new(source); - va_start(arglist,source); - unite_char = va_arg(arglist,char*); - while(unite_char){ - new_char = yon_char_append(new_char,unite_char); - unite_char = va_arg(arglist,char*); - } - va_end(arglist); - return new_char; -} - -/**yon_cut(char *source, int size, int startpos) - * [EN] - * cuts source string by size length from startpos position. - */ -char *yon_cut(char *source, int size, int startpos) -{ - char *cut = NULL; - cut = malloc(size + 1); - memset(cut, 0, size + 1); - memcpy(cut, source + startpos, size); - return cut; -} - -/**yon_char_divide(char *source, int dividepos) - * [EN] - * divides source string in dividepos position, - * returning left part of divided string and - * inserting right part to source string. - */ -char *yon_char_divide(char *source, int dividepos) -{ - char *cut = malloc(dividepos + 1); - memset(cut, 0, dividepos + 1); - memcpy(cut, source, dividepos); - char *left = malloc(strlen(source) - strlen(cut)); - memset(left, 0, strlen(source) - strlen(cut)); - memcpy(left, source + dividepos + 1, (strlen(source) - dividepos)); - memset(source, 0, strlen(source)); - memcpy(source, left, strlen(left)); - return cut; -} - -/**yon_char_find_count(char *source, char *find) - * [EN] - * - * [RU] - * Считает количество символов [find] в строке [source] -*/ -int yon_char_find_count(char *source, char *find){ - char *working_string=yon_char_new(source); - int i=0; - int size=0; - int pos=0; - config_str rtn = yon_char_parse(working_string,&size,"\n"); - for (int j=0;j= 10; i++) - { - convert_check = convert_check / 10; - } - char *ch = g_malloc0(i * sizeof(char) + 1); - sprintf(ch, "%d", int_to_convert); - return ch; -} - -/**yon_char_replace(char *source, char *find, char*replace) - * [EN] - * - * [RU] - * Заменяет в строке [source] все вхождения строки [find] на [replace] -*/ -char *yon_char_replace(char *source, char *find, char*replace){ - if (!strstr(replace,find)){ - - - char *final=NULL; - char *temp=NULL; - if(!strstr(replace,find)){ - while ((final=strstr(source,find))){ - temp=malloc(strlen(source)-strlen(final)); - memset(temp,0,strlen(source)-strlen(final)+strlen(replace)); - memcpy(temp,source,strlen(source)-strlen(final)); - temp=yon_char_append(temp,replace); - source=yon_char_append(temp,final+1); - } - - } - } - return source; -} - -/**yon_char_parse(char *parameters, int *size, char *divider) - * [EN] - * Parses string [parameters], divided by [divider], - * then returns parsed string array and sets [size] to - * size of returned array -*/ -char **yon_char_parse(char *parameters, int *size, char *divider){ - char **string=NULL; - int i=1; - string=malloc(sizeof(char*)); - char *paramline=yon_char_new(parameters); - char *param; - while ((param=yon_char_divide_search(paramline,divider,1))){ - if (strcmp(param,paramline)==0) break; - string=realloc(string,sizeof(char*)*i); - string[i-1]=yon_char_new(param); - i++; - } - 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_str yon_file_open(char *file_path, int *size){ - FILE *file = fopen(file_path,"r"); - char str_loaded[4098]; - config_str final_string = NULL; - while (fgets(str_loaded,4098,file)){ - final_string ? yon_char_parsed_append(final_string,size,str_loaded) : yon_char_parsed_new(size,final_string,NULL); - } - return final_string; -} - -//config functions - -typedef struct yon_config_parameter -{ - char *key; - void *data; - struct yon_config_parameter *next; - struct yon_config_parameter *prev; - struct yon_config_parameter *first; - DICT_TYPE data_type; - int flag1; - char *section; -} yon_config_parameter; - -yon_config_parameter *yon_config_parameter_new_with_data(char *key, void *data){ - yon_config_parameter *param = yon_remalloc(NULL,sizeof(yon_config_parameter)); - param->data=data; - param->data_type=DICTIONARY_CHAR_TYPE; - param->first=param; - param->flag1=0; - param->key=yon_char_new(key); - param->next=NULL; - param->prev=NULL; - param->section=NULL; - return param; -} - -yon_config_parameter *yon_config_parameter_append_with_data(yon_config_parameter *dict, char *key, void *data){ - yon_config_parameter *param = yon_config_parameter_new_with_data(key,data); - param->first=dict->first; - (param->prev)=(yon_config_parameter*)yon_dictionary_get_last((dictionary*)dict); - dict->next=param; - return param; -} - - -static yon_config_parameter *__yon__config__strings = NULL; -#define check_config if(__yon__config__strings&&__yon__config__strings->data_type==DICTIONARY_CHAR_TYPE) -#define for_config dictionary temp = NULL; for_dictionary(temp,(dictionary*)__yon__config__strings) -#define yon_config_parameter_add_or_create_if_exists_with_data(dict,key,data) {if (!dict) dict=yon_config_parameter_new_with_data(key,data); \ - else dict=yon_config_parameter_append_with_data(dict,key,data);} - -/**yon_config_load_register(char *command) - * [EN] - * - * [RU] - * Выполняет команду [command]. - * Полученные данные парсятся и регистрируются в конфиг. -*/ -int yon_config_load_register(YON_CONFIG_TYPE config_type,char *section,char *parameter, ...){ - if (__yon__config__strings){ - __yon__config__strings = yon_dictionary_free_all((dictionary*)__yon__config__strings,NULL); - } - va_list args; - va_start(args,parameter); - char *arg; - dictionary *sections = NULL; - { - if (sections&&yon_dictionary_get(§ions,section)) sections->data=(void*)yon_char_unite(yon_dictionary_get_data(sections,char*)," ",parameter,NULL); - else yon_dictionary_add_or_create_if_exists_with_data(sections,section,parameter); - } - while (arg=va_arg(args,char*)){ - char *key = va_arg(args,char*); - if (sections&&yon_dictionary_get(§ions,arg)) sections->data=(void*)yon_char_unite(yon_dictionary_get_data(sections,char*)," ",key,NULL); - else yon_dictionary_add_or_create_if_exists_with_data(sections,arg,key); - } - char *command=NULL; - dictionary *dict; - for_dictionaries(dict,sections){ - command = yon_char_unite(ubconfig_load_command,config_type==YON_CONFIG_GLOBAL ? " global get " : " system get ", dict->key," ", yon_dictionary_get_data(dict,char*),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); - char *final_str=yon_char_divide_search(str,"\n",-1); - yon_config_parameter_add_or_create_if_exists_with_data(__yon__config__strings,key,yon_char_new(final_str)); - __yon__config__strings->data_type=DICTIONARY_CHAR_TYPE; - __yon__config__strings->section=dict->key; - } - } - } - check_config - return 1; - else return 0; -} - -/**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((dictionary**)&__yon__config__strings,key); - if (dict){ - ((yon_config_parameter*)dict)->flag1=-1; - 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,(dictionary*)__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{ - yon_config_parameter *dict = (yon_config_parameter*)yon_dictionary_get((dictionary**)&__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); - 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, (dictionary*)__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, (dictionary*)__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{ - yon_config_parameter *dict = (yon_config_parameter*)yon_dictionary_get((dictionary**)&__yon__config__strings,key); - dict->data=data; - dict->flag1=1; - return 1; - } else return 0; -} - - -/**yon_config_append(char *key, void *data) - * [EN] - * - * [RU] - * Производит поиск по конфигу и дополняет значение параметра с ключом [key] значением [data]; -*/ -int yon_config_append(char *key, char *data){ - check_config{ - yon_config_parameter *dict = (yon_config_parameter*)yon_dictionary_get((dictionary**)&__yon__config__strings,key); - if (strcmp(((char*)dict->data),"")!=0) - dict->data=(void*)(yon_char_unite((char*)dict->data," ",data,NULL)); - else dict->data=(void*)data; - dict->flag1=1; - 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_config_parameter*)yon_dictionary_free_all((dictionary*)__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, char *config_section, void *data){ - if (!__yon__config__strings||!yon_dictionary_get((dictionary**)&__yon__config__strings,key)){ - yon_config_parameter_add_or_create_if_exists_with_data(__yon__config__strings,key,data); - } - else if (yon_dictionary_get((dictionary**)&__yon__config__strings,key)) __yon__config__strings->data=data; - __yon__config__strings->data_type=DICTIONARY_CHAR_TYPE; - __yon__config__strings->flag1=1; - __yon__config__strings->section=yon_char_new(config_section); -} - -/**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)); - 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_registered(char *path, char *section) - * [EN] - * Saves config with [command] - * [RU] - * Выполняет команду [command], добавляя в конец все записи конфига в таком виде: - * [ПАРАМЕТР1]="[значения1]" [ПАРАМЕТР2]="[значения2]" -*/ -int yon_config_save_registered(char *path){ - check_config{ - dictionary *dct; - dictionary *sections_add=NULL; - dictionary *sections_remove=NULL; - for_dictionaries(dct,(dictionary*)__yon__config__strings){ - if (dct->data&&strcmp(yon_dictionary_get_data(dct,char*),"")!=0){ - if (((yon_config_parameter*)dct)->flag1==1){ - ((yon_config_parameter*)dct)->flag1=0; - if (sections_add&&yon_dictionary_get(§ions_add,((yon_config_parameter*)dct)->section)) sections_add->data=(void*)yon_char_unite(yon_dictionary_get_data(sections_add,char*)," ",dct->key,"=\"",yon_dictionary_get_data(dct,char*),"\"",NULL); - else yon_dictionary_add_or_create_if_exists_with_data(sections_add,((yon_config_parameter*)dct)->section,yon_char_unite (ubconfig_save_command,path ? yon_char_append(" --target ",path):"", " set ", ((yon_config_parameter*)dct)->section," ", dct->key,"=\"",yon_dictionary_get_data(dct,char*),"\"",NULL)); - } else if (((yon_config_parameter*)dct)->flag1==-1){ - ((yon_config_parameter*)dct)->flag1=0; - if (sections_remove&&yon_dictionary_get(§ions_remove,((yon_config_parameter*)dct)->section)) sections_remove->data=(void*)yon_char_unite(yon_dictionary_get_data(sections_remove,char*)," ",dct->key,NULL); - else yon_dictionary_add_or_create_if_exists_with_data(sections_remove,((yon_config_parameter*)dct)->section,yon_char_unite (ubconfig_save_command,path ? yon_char_append(" --target ",path):"", " remove ", ((yon_config_parameter*)dct)->section, " ",dct->key,NULL)); - } - } - } - if (sections_add) - for_dictionaries(dct,sections_add){ - char *command = yon_dictionary_get_data(dct,char*); - yon_launch(command); - } - if (sections_remove) - for_dictionaries(dct,sections_remove){ - char *command = yon_dictionary_get_data(dct,char*); - yon_launch(command); - } - - - // char *command = yon_char_unite(ubconfig_save_command,path ? yon_char_append(" --target ",path):"", " set ", section, " ", yon_dictionary_get_data(dct,char*),NULL); - // char *remove_command = yon_char_unite(ubconfig_save_command, path ? yon_char_append(" --target ",path):"", " remove "," ", yon_dictionary_get_data(dct,char*), section,NULL); - // dictionary *dict = NULL; - // int any_add = 0; - // int any_remove = 0; - // for_dictionaries(dict,(dictionary*)__yon__config__strings){ - // char *data = yon_dictionary_get_data(dict,char*); - // if (((yon_config_parameter*)dict)->flag1==1&&strcmp(data,"")!=0){ - // command = yon_char_unite(command, " ", dict->key,"=\"", yon_dictionary_get_data(dict,char*),"\"", NULL); - // any_add=1; - // } - // if (strcmp(data,"")==0){ - // remove_command = yon_char_unite(remove_command, " ", dict->key, NULL); - // any_remove=1; - // } - // } - // if (any_add) yon_launch(command); - // if (any_remove) yon_launch(remove_command); - return 1; - } else return 1; -} - -/**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,(dictionary*)__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)); - conf[*size-1] = NULL; - return conf; - } else return NULL; -} - -/**char *yon_config_get_parameter(config parameters, int size, char *param) - * [EN] - * Gets parameter [param] from parameter list [parameters] of size [size]; - * or NULL if nothing were found - * [RU] - * Возвращает параметр [param] из массива строк [parameters] размером [size] - * или NULL если такой не был найден -*/ -char *yon_config_get_parameter(config_str parameters, int size, char *param) -{ - if (param[0]==' ') - yon_char_divide_search(param," ",-1); - param=yon_char_divide_search(yon_char_new(param)," ",-1); - - char *str = NULL; - for (int j = 0; j < size; j++) - { - char *name = yon_char_divide_search(yon_char_new(parameters[j]), "=", 1); - if (name) - { - if (strcmp(name, param) == 0) - { - str = yon_char_divide_search(yon_char_new(parameters[j]), "\n", 1); - if (strcmp(str, "") != 0 && strcmp(str, "(null)") != 0) - return str; - else - return NULL; - } - } - } - return NULL; -} - - - -// terminal-using functions - -/**yon_launch_app_with_arguments(char *name, char *args) - * [EN] - * Execute [command] in separate thread; - * [RU] - * Выполнить команду [command] в отдельном потоке; -*/ -int yon_launch_app_with_arguments(char *name, char *args) -{ - char *path = yon_char_unite("/usr/bin/", name, " ", args,NULL); - pthread_t thread_id; - char *command = NULL; - command = path; - pthread_create(&thread_id, NULL, (void *)yon_launch, command); -}; - -/**yon_launch(char *command) - * [EN] - * Execute command [command] - * [RU] - * Выполнить команду [command] -*/ -void yon_launch(char *command) -{ - system(command); -} - -// Gtk functions - - -#ifdef __GTK_H__ - - -static render_data render; - -#ifdef VTE_TERMINAL - -static void child_ready(VteTerminal *terminal, GPid pid, GError *error, gpointer user_data) -{ - if (!terminal) return; - if (pid == -1) printf("Error\n\n\n"); - else vte_terminal_feed_child(VTE_TERMINAL(terminal),(char*)user_data,strlen((char*)user_data)); -} - -/** - * void yon_terminal_integrated_launch(GtkWidget *place_to_show, void *endwork_function, void* endwork_function_argument) - * [EN] - * launches terminal with specific [command], - * terminal is shown in [place_to_show] container, - * after terminal done its work [endwork_function] is called with [endwork_function_argument] argument. - * [RU] - * Запускает терминал с командой [command], - * терминал добавляется в контейнер [place_to_show] виджета, - * после завершения работы терминала вызывается функция [endwork_function] с аргументом [endwork_function_argument]. -*/ -void yon_terminal_integrated_launch(GtkWidget *place_to_show, char* command, void *endwork_function, void* endwork_function_argument){ - char **commands=new_arr(char*,2); - gchar **envp = g_get_environ(); - commands[0]=(gchar *)g_strdup(g_environ_getenv(envp, "SHELL")); - commands[1]=NULL; - char **env=new_arr(char*,2); - env[0]=""; - env[1]=NULL; - GtkWidget *terminal = vte_terminal_new(); - vte_terminal_set_size(VTE_TERMINAL(terminal),10,15); - VtePty *pty = vte_pty_new_sync(VTE_PTY_DEFAULT,NULL,NULL); - vte_terminal_set_pty(VTE_TERMINAL(terminal),pty); - 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) - - typedef struct { - char *parameter_name; - enum YON_TYPE containing_type; - GtkWidget *track_widget; - char *property_name; - } __yon_listener_parameter; - - typedef struct { - char *parameter_name; - char *section; - enum YON_TYPE containing_type; - void *property; - } __yon_custom_parameter; - - struct { - int x; - int y; - int width; - int height; - int fullscreen; - dictionary *custom_listeners; - dictionary *custom_parameters; - dictionary *deleted_parameters; - } __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); - dictionary *dict=NULL; - if (__yon_main_window_config.custom_listeners) - for_dictionaries(dict,__yon_main_window_config.custom_listeners){ - __yon_listener_parameter *param = yon_dictionary_get_data(dict,__yon_listener_parameter*); - GValue *val = g_malloc0(sizeof(GValue)); - g_object_get_property(G_OBJECT(param->track_widget),param->property_name,val); - switch(param->containing_type){ - case YON_TYPE_STRING: - g_key_file_set_string(__yon_window_config_file,"window",param->parameter_name, g_value_get_string(val)); - break; - case YON_TYPE_INT: - g_key_file_set_integer(__yon_window_config_file,"window",param->parameter_name, g_value_get_int(val)); - break; - case YON_TYPE_BOOLEAN: - g_key_file_set_boolean(__yon_window_config_file,"window",param->parameter_name, g_value_get_boolean(val)); - break; - case YON_TYPE_OTHER:printf("\033[0;31mCannot save %s property with %s key\033[0m\n",param->property_name,param->parameter_name);break; - } - } - if (__yon_main_window_config.custom_parameters) - for_dictionaries(dict,__yon_main_window_config.custom_parameters){ - __yon_custom_parameter *param = yon_dictionary_get_data(dict,__yon_custom_parameter*); - switch (param->containing_type){ - case YON_TYPE_STRING: - g_key_file_set_string(__yon_window_config_file,param->section,param->parameter_name, (char*)param->property); - break; - case YON_TYPE_INT: - g_key_file_set_integer(__yon_window_config_file,param->section,param->parameter_name, *(int*)param->property); - break; - case YON_TYPE_BOOLEAN: - g_key_file_set_boolean(__yon_window_config_file,param->section,param->parameter_name, *(gboolean*)param->property); - break; - default: - break; - } - } - if (__yon_main_window_config.deleted_parameters) - for_dictionaries(dict,__yon_main_window_config.deleted_parameters){ - __yon_custom_parameter *param = yon_dictionary_get_data(dict,__yon_custom_parameter*); - g_key_file_remove_key(__yon_window_config_file,param->section,param->parameter_name,NULL); - } - 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) gtk_window_get_position(__yon_window_config_target_window,&__yon_main_window_config.x,&__yon_main_window_config.y); - } - - /**yon_on_configured_window_destroy(GtkWidget* self,GdkEvent* event) - * [EN] - * - * [RU] - * Сохраняет настройки основного окна. Вызывается когда основное окно уничтожается. - */ - void yon_on_configured_window_destroy(GtkWidget* self,GdkEvent* event){ - check_window_config_setup{ - yon_get_is_fullscreen(); - yon_window_config_save(); - } - gtk_main_quit(); - } - - void __yon_window_config_on_resize(){ - int max=0; - max=gtk_window_is_maximized(__yon_window_config_target_window); - if(max==0){ - gtk_window_get_size(__yon_window_config_target_window,&__yon_main_window_config.width,&__yon_main_window_config.height); - gtk_window_get_position(__yon_window_config_target_window,&__yon_main_window_config.x,&__yon_main_window_config.y); - } - } - - /**yon_window_config_setup(GtkWindow *window) - * [EN] - * - * [RU] - * Устанавливает указатель на окно для отслеживания его положения и размера - */ - void yon_window_config_setup(GtkWindow *window){ - __yon_window_config_target_window = window; - g_signal_connect(G_OBJECT(window),"delete-event",G_CALLBACK(yon_on_configured_window_destroy),NULL); - g_signal_connect(G_OBJECT(window),"check-resize"/*"configure-event"*/,G_CALLBACK(__yon_window_config_on_resize),NULL); - } - - void _yon_maximize(void *data){ - g_usleep(G_USEC_PER_SEC/10); - if(__yon_main_window_config.fullscreen ==1) gtk_window_maximize(__yon_window_config_target_window); - } - - /**yon_window_config_load(char *path) - * [EN] - * - * [RU] - * Загружает конфиг окна и инициализирует отслеживание его параметров - */ - int yon_window_config_load(char *path){ - __yon_window_config_file = g_key_file_new(); - __yon_window_config_path=yon_char_new(path); - if (!g_key_file_load_from_file(__yon_window_config_file,__yon_window_config_path,G_KEY_FILE_NONE,NULL)){ - struct stat st; - int size; - config_str conf = yon_char_parse(yon_char_new(__yon_window_config_path),&size,"/"); - char *path = yon_char_unite(conf[0],"/",conf[1],"/",conf[2],"/",conf[3],"/",conf[4],"/",NULL); - if (stat(path, &st) == -1) { - mkdir(path, 0777); - } - FILE *fp; - fp=fopen(__yon_window_config_path,"w"); - fclose(fp); - g_key_file_load_from_file(__yon_window_config_file,__yon_window_config_path,G_KEY_FILE_NONE,NULL); - } - __yon_main_window_config.x = g_key_file_get_integer(__yon_window_config_file,"window","WindowPosX",NULL); - __yon_main_window_config.y = g_key_file_get_integer(__yon_window_config_file,"window","WindowPosY",NULL); - __yon_main_window_config.width = g_key_file_get_integer(__yon_window_config_file,"window","WindowWidth",NULL); - __yon_main_window_config.height = g_key_file_get_integer(__yon_window_config_file,"window","WindowHeight",NULL); - __yon_main_window_config.fullscreen = g_key_file_get_integer(__yon_window_config_file,"window","fullscreen",NULL); - dictionary *dict=NULL; - if (__yon_main_window_config.custom_listeners) - for_dictionaries(dict,__yon_main_window_config.custom_listeners){ - __yon_listener_parameter *param = yon_dictionary_get_data(dict,__yon_listener_parameter*); - GValue *val = g_malloc0(sizeof(GValue)); - g_object_get_property(G_OBJECT(param->track_widget),param->property_name,val); - switch(param->containing_type){ - case YON_TYPE_STRING: - g_value_set_string(val,g_key_file_get_string(__yon_window_config_file,"window",param->parameter_name, NULL)); - break; - case YON_TYPE_INT: - g_value_set_int(val,g_key_file_get_integer(__yon_window_config_file,"window",param->parameter_name, NULL)); - break; - case YON_TYPE_BOOLEAN: - gboolean res = g_key_file_get_boolean(__yon_window_config_file,"window",param->parameter_name, NULL); - g_value_set_boolean(val,res); - break; - default:printf("\033[0;31mCannot load %s property with %s key\033[0m\n",param->property_name,param->parameter_name);break; - } - g_object_set_property(G_OBJECT(param->track_widget),param->property_name,val); - } - 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); - } - - config_str yon_window_config_get_section(char *section, gsize *size){ - config_str key = g_key_file_get_keys(__yon_window_config_file,section,size,NULL); - return key; - } - - /**yon_window_config_add_custom_parameter(GtkWidget *widget, char *param_name, char *widget_property) - * [EN] - * - * [RU] - * Добавляет параметр виджета [widget] по названию [widget_property] для отслеживания и сохраняет его в конфиг под ключом [param_name]. - */ - void yon_window_config_add_listener(GtkWidget *widget, char *param_name, char *widget_property, enum YON_TYPE val_type){ - __yon_listener_parameter *param = NULL; - param = yon_remalloc(param,sizeof(__yon_listener_parameter)); - param->parameter_name = yon_char_new(param_name); - param->track_widget = widget; - param->property_name = yon_char_new(widget_property); - param->containing_type = val_type; - yon_dictionary_add_or_create_if_exists_with_data(__yon_main_window_config.custom_listeners,param->parameter_name,param); - } - - void yon_window_config_add_custom_parameter(char *param_name, char *section, void *tracked_value, enum YON_TYPE val_type){ - __yon_custom_parameter *param = NULL; - param = yon_remalloc(param,sizeof(__yon_custom_parameter)); - param->parameter_name = yon_char_new(param_name); - param->section=section; - param->property = tracked_value; - param->containing_type = val_type; - yon_dictionary_add_or_create_if_exists_with_data(__yon_main_window_config.custom_parameters,param->parameter_name,param); - } - - void yon_window_config_erase_custom_parameter(char *param_name, char *section){ - __yon_custom_parameter *param = NULL; - param = yon_remalloc(param,sizeof(__yon_custom_parameter)); - param->parameter_name=param_name; - param->section=section; - yon_dictionary_add_or_create_if_exists_with_data(__yon_main_window_config.deleted_parameters,param->parameter_name,param); - } - - int yon_window_config_get_parameter(char *section, char *config_parameter, void *return_value, enum YON_TYPE type){ - GError *err=NULL; - switch (type){ - case YON_TYPE_BOOLEAN: - *((int*)return_value) = g_key_file_get_boolean(__yon_window_config_file,section,config_parameter,&err); - if (err) return 0; else return 1; - break; - case YON_TYPE_INT: - *((int*)return_value) = g_key_file_get_integer(__yon_window_config_file,section,config_parameter,&err); - if (err) return 0; else return 1; - break; - case YON_TYPE_STRING: - *((char**)return_value) = g_key_file_get_string(__yon_window_config_file,section,config_parameter,&err); - if (err) return 0; else return 1; - break; - case YON_TYPE_STRING_LIST: - gsize size=0; - *((char***)return_value) = g_key_file_get_string_list(__yon_window_config_file,section,config_parameter,&size,&err); - *((char***)return_value)=yon_remalloc(return_value,size+1); - *((char***)return_value)[size]=NULL; - if (err) return 0; else return 1; - break; - } - } - -GtkWidget *yon_ubl_menu_item_about_new(char *buttonname){ - GtkWidget *menu_item = gtk_menu_item_new(); - gtk_style_context_add_class(gtk_widget_get_style_context(menu_item),"menuitembottom"); - GtkWidget *box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL,0); - GtkWidget *label = gtk_label_new(buttonname); - GtkWidget *image = gtk_image_new_from_icon_name("dialog-information-symbolic",GTK_ICON_SIZE_BUTTON); - gtk_label_set_xalign(GTK_LABEL(label),0.0); - gtk_box_pack_start(GTK_BOX(box),image,0,0,5); - gtk_box_pack_start(GTK_BOX(box),label,0,0,5); - gtk_container_add(GTK_CONTAINER(menu_item),box); - gtk_widget_show_all(menu_item); - return menu_item; -} - -GtkWidget *yon_ubl_menu_item_documentation_new(char *buttonname){ - GtkWidget *menu_item = gtk_menu_item_new(); - gtk_style_context_add_class(gtk_widget_get_style_context(menu_item),"menuitemtop"); - GtkWidget *box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL,0); - GtkWidget *label = gtk_label_new(buttonname); - GtkWidget *image = gtk_image_new_from_icon_name("dialog-question-symbolic",GTK_ICON_SIZE_BUTTON); - gtk_label_set_xalign(GTK_LABEL(label),0.0); - gtk_box_pack_start(GTK_BOX(box),image,0,0,5); - gtk_box_pack_start(GTK_BOX(box),label,0,0,5); - gtk_container_add(GTK_CONTAINER(menu_item),box); - gtk_widget_show_all(menu_item); - return menu_item; -} - - -// other Gtk functions - -/**yon_gtk_combo_box_text_fill(GtkWidget *combo, config_str parameters,int size) - * [EN] - * - * [RU] - * Добавляет в Комбобокс [combo] все строки из массива строк [parameters] размера [size] -*/ -int yon_gtk_combo_box_text_fill(GtkWidget *combo, config_str parameters,int size){ - if (combo&¶meters){ - for (int i=0;i=0 ? 1 : 0); -} - -void yon_gtk_widget_set_sensitive_from_toggle_combo_box_inversed(GtkComboBox *toggle, GtkWidget *target){ - gtk_widget_set_sensitive(target,!gtk_combo_box_get_active(toggle)>=0 ? 0 : 1); -} - -void _yon_ubl_header_setup(GtkWidget *Overlay, GtkWidget *Head, GtkWidget *Image, char *image_path) -{ - gtk_overlay_add_overlay(GTK_OVERLAY(Overlay), Head); - gtk_image_set_from_file(GTK_IMAGE(Image), image_path); -} - -void _yon_ubl_header_setup_resource(GtkWidget *Overlay, GtkWidget *Head, GtkWidget *Image, char *image_path) -{ - gtk_overlay_add_overlay(GTK_OVERLAY(Overlay), Head); - gtk_image_set_from_resource(GTK_IMAGE(Image), image_path); -} - -int yon_ubl_status_box_setup(GtkWidget *icon, GtkWidget *box, GtkWidget *label) -{ - if(icon&&box&&label){ - render.icon=icon; - render.box=box; - render.label=label; - return 1; - } else return 0; -} - -void _yon_ubl_status_box_render(char *text, BACKGROUND_IMAGE_TYPE type) -{ - render_data data = render; - GtkIconTheme *ictheme = gtk_icon_theme_get_default(); - GError *err = NULL; - if (err) - { - printf("%s\n", err->message); - g_error_free(err); - } - if (type == BACKGROUND_IMAGE_SUCCESS_TYPE||! type) - { - gtk_style_context_remove_class(gtk_widget_get_style_context(data.box), "boxInfoMessError"); - gtk_style_context_add_class(gtk_widget_get_style_context(data.box), "boxInfoMessOK"); - gtk_image_set_from_pixbuf(GTK_IMAGE(data.icon), gtk_icon_theme_load_icon_for_scale(ictheme, "com.ublinux.ubl-settings-video.checked", 25, 1, GTK_ICON_LOOKUP_FORCE_SIZE, &err)); - } - else if (type == BACKGROUND_IMAGE_FAIL_TYPE) - { - gtk_style_context_remove_class(gtk_widget_get_style_context(data.box), "boxInfoMessOK"); - gtk_style_context_add_class(gtk_widget_get_style_context(data.box), "boxInfoMessError"); - gtk_image_set_from_pixbuf(GTK_IMAGE(data.icon), gtk_icon_theme_load_icon_for_scale(ictheme, "com.ublinux.ubl-settings-video.warning", 25, 1, GTK_ICON_LOOKUP_FORCE_SIZE, &err)); - } - if (text) - gtk_label_set_text(GTK_LABEL(data.label), text); -} - -void yon_ubl_status_box_render(char *text, BACKGROUND_IMAGE_TYPE type){ - _yon_ubl_status_box_render(text,type); -} - -/**yon_ubl_setup_sockets(GtkWidget *main_window, GtkWidget *left_window, GtkWidget *right_window, int socket_main_id, int socket_left_id, int socket_right_id) - * [EN] - * Set up plugs for using with GtkSockets insine ubl-settings-manager. - * [main_window] is container widget, which holds main application functionality. - * [left_window] is container widget, which holds widgets, have to be shown at left part of ubl-settings-manager header. - * [right_window] is container widget, which holds widgets, have to be shown at right part of ubl-settings-manager header. - * [socket_main_id] is id of socket for [main_window]. - * [socket_left_id] is id of socket for [left_window]. - * [socket_right_id] is id of socket for [right_window]. - * [RU] - * Настраивает плаги для работы с сокетами в утилите ubl-settings-manager. - * [main_window] - контейнер основного интерфейса приложения. - * [left_window] - контейнер для виджетов которые должны отображаться в левой части шапки ubl-settings-manager. - * [right_window] - контейнер для виджетов которые должны отображаться в правой части шапки ubl-settings-manager. - * [socket_main_id] - id сокета для [main_window]. - * [socket_left_id] - id сокета для [left_window]. - * [socket_right_id] - id сокета для [right_window]. -*/ -void yon_ubl_setup_sockets(GtkWidget *main_window, GtkWidget *left_window, GtkWidget *right_window, int socket_main_id, int socket_left_id, int socket_right_id){ - if (main_window&&socket_main_id>-1){ - gtk_widget_hide(gtk_widget_get_toplevel(main_window)); - GtkWidget *plug_main=gtk_plug_new(socket_main_id); - GtkWidget *plug_left=NULL; - GtkWidget *plug_right=NULL; - GtkWidget *box=NULL; - g_signal_connect(G_OBJECT(plug_main), "destroy", G_CALLBACK(gtk_main_quit),NULL); - if (socket_left_id>-1&&left_window){ - plug_left=gtk_plug_new(socket_left_id); - g_object_ref(left_window); - gtk_container_remove(GTK_CONTAINER(gtk_widget_get_parent(left_window)),left_window); - gtk_container_add(GTK_CONTAINER(plug_left),left_window); - gtk_style_context_add_class(gtk_widget_get_style_context(plug_left),"primary-toolbar"); - gtk_style_context_add_class(gtk_widget_get_style_context(left_window),"button"); - gtk_style_context_add_class(gtk_widget_get_style_context(left_window),"opacited"); - gtk_style_context_add_class(gtk_widget_get_style_context(left_window),"color"); - gtk_style_context_add_class(gtk_widget_get_style_context(plug_left),"noborder"); - gtk_widget_show(plug_left); - } - else if (left_window){ - if (box==NULL){ - box=gtk_box_new(GTK_ORIENTATION_HORIZONTAL,5); - gtk_box_pack_start(GTK_BOX(main_window),box,0,0,5); - gtk_box_reorder_child(GTK_BOX(main_window),box,0); - gtk_widget_show(box); - } - gtk_style_context_add_class(gtk_widget_get_style_context(left_window),"inherited"); - gtk_container_remove(GTK_CONTAINER(gtk_widget_get_parent(left_window)),left_window); - gtk_box_pack_end(GTK_BOX(box),left_window,0,0,5); - } - if (socket_right_id>-1&&right_window){ - plug_right=gtk_plug_new(socket_right_id); - g_object_ref(right_window); - gtk_container_remove(GTK_CONTAINER(gtk_widget_get_parent(right_window)),right_window); - gtk_container_add(GTK_CONTAINER(plug_right),right_window); - gtk_style_context_add_class(gtk_widget_get_style_context(plug_right),"primary-toolbar"); - gtk_style_context_add_class(gtk_widget_get_style_context(right_window),"button"); - gtk_style_context_add_class(gtk_widget_get_style_context(right_window),"opacited"); - gtk_style_context_add_class(gtk_widget_get_style_context(right_window),"color"); - gtk_style_context_add_class(gtk_widget_get_style_context(plug_right),"noborder"); - gtk_widget_show(plug_right); - } - else if (right_window){ - if (box==NULL){ - box=gtk_box_new(GTK_ORIENTATION_HORIZONTAL,5); - gtk_box_pack_start(GTK_BOX(main_window),box,0,0,5); - gtk_box_reorder_child(GTK_BOX(main_window),box,0); - gtk_widget_show(box); - } - gtk_style_context_add_class(gtk_widget_get_style_context(right_window),"inherited"); - gtk_container_remove(GTK_CONTAINER(gtk_widget_get_parent(right_window)),right_window); - gtk_box_pack_start(GTK_BOX(box),right_window,0,0,5); - } - g_object_ref(main_window); - gtk_container_remove(GTK_CONTAINER(gtk_widget_get_parent(main_window)),main_window); - gtk_container_add(GTK_CONTAINER(plug_main),main_window); - gtk_widget_show(plug_main); - } -} - -#ifdef WEBKIT_FOUND - -/**yon_ubl_browser_window_open(char *link, char *browser_window_name) - * [EN] - * Launches integrated browser window, named [browser_window_name] at header with [link]. - * [RU] - * Открывает встроенный браузер с именем [browser_window_name] и показываемой страницей по ссылке [link] -*/ -void yon_ubl_browser_window_open(char *link, char *browser_window_name){ - GtkWidget *browser=gtk_window_new(GTK_WINDOW_TOPLEVEL); - GtkWidget *web_place=gtk_box_new(GTK_ORIENTATION_VERTICAL,0); - GtkWidget *header=gtk_header_bar_new(); - GtkWidget *header_label=gtk_label_new(browser_window_name); - GtkWidget *WebView=webkit_web_view_new(); - gtk_container_add(GTK_CONTAINER(browser),web_place); - gtk_window_set_titlebar(GTK_WINDOW(browser),header); - gtk_window_set_title(GTK_WINDOW(browser),browser_window_name); - gtk_widget_set_size_request(browser,800,600); - gtk_header_bar_set_custom_title(GTK_HEADER_BAR(header),header_label); - gtk_header_bar_set_show_close_button(GTK_HEADER_BAR(header),1); - webkit_web_view_load_uri(WEBKIT_WEB_VIEW(WebView),link); - gtk_box_pack_start(GTK_BOX(web_place),WebView,1,1,0); - gtk_widget_show_all(browser); -} -#else - -/**yon_ubl_browser_window_open(char *link, char *browser_window_name) - * [EN] - * Launches browser with [link]. - * [browser_window_name] is't used. It's needed for compatibility with webkit version of that function. - * [RU] - * Открывает браузер со страницей по ссылке [link] - * [browser_window_name] не используется. Нужна для совместимости с webkit версией этой функции. -*/ -void yon_ubl_browser_window_open(char *link, char *browser_window_name){ - char *user=getenv("SUDO_USER"); - if (!user) - user=getlogin(); - char *command=yon_char_unite("sudo -u ",user," xdg-open ", link,NULL); - yon_launch_app(command); -} -#endif - -#endif \ No newline at end of file diff --git a/source/ubl-utils.h b/source/ubl-utils.h deleted file mode 100644 index 6ab711f..0000000 --- a/source/ubl-utils.h +++ /dev/null @@ -1,381 +0,0 @@ -#ifndef UBL_UTILS -#define UBL_UTILS -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "../compile/ubl-cmake.h" -#ifdef WEBKIT_FOUND - #include -#endif -#define DesktopPath "/usr/share/applications/" - -#define for_dictionaries(obj, obj1) for (obj = obj1->first; obj != NULL; obj = obj->next) - -#define new(type) malloc(sizeof(type)) -#define new_arr(type,size) malloc(sizeof(type)*size) - -#define get_home_dir_command yon_char_unite("getent passwd \"",yon_ubl_root_user_get(),"\" | cut -d: -f6",NULL) - -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; -} dictionary; - - - - -typedef struct apps -{ - char *Name; - int Type; - char *Categories; - char *Exec; - char *Icon; - int Pluggable; - int DualPluggable; -} apps; - -typedef char** config_str; - -#define config(key) yon_config_get_by_key(key) - -#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 - -int yon_char_find_last(char *source, char find); - -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(); - -char *yon_ubl_user_get_home_directory(); - -// 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_file_open(char *file_path, int *size); - -//config functions - -#define ubconfig_save_command "ubconfig" -#define ubconfig_load_command "ubconfig --source" - -typedef enum { - YON_CONFIG_LOCAL=0, - YON_CONFIG_GLOBAL, - YON_CONFIG_BOTH -} YON_CONFIG_TYPE; - -config_str yon_config_load(char *command, int *str_len); - -int yon_config_save_registered(char *path); - -char *yon_config_get_parameter(config_str parameters, int size, char *param); - -int yon_config_load_register(YON_CONFIG_TYPE config_type,char *section,char *parameter, ...); - -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, char* config_section, 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 - -enum YON_TYPE{ - YON_TYPE_STRING, - YON_TYPE_STRING_LIST, - YON_TYPE_INT, - YON_TYPE_BOOLEAN, - YON_TYPE_OTHER -}; - -GtkWidget *yon_ubl_menu_item_about_new(char *buttonname); -GtkWidget *yon_ubl_menu_item_documentation_new(char *buttonname); - -/**yon_gtk_builder_get_widget(builder, widget_name) - * [EN] - * Returns GtkWidget from GtkBuilder *[builder]. - * [builder] is GtkBuilder*; - * [widget_name] is id of widget; -*/ -#define yon_gtk_builder_get_widget(builder, widget_name) GTK_WIDGET(gtk_builder_get_object(builder, widget_name)) - -typedef struct -{ - GtkWidget *Icon; - GtkWidget *Label; - GtkWidget *IconView; - GtkListStore *List; -} expander_icon_view; - -void yon_window_config_setup(GtkWindow *window); - -int yon_window_config_load(char *path); - -config_str yon_window_config_get_section(char *section, gsize *size); - -void yon_window_config_add_listener(GtkWidget *widget, char *param_name, char *widget_property, enum YON_TYPE val_type); - -void yon_window_config_add_custom_parameter(char *param_name, char *section, void *tracked_value, enum YON_TYPE val_type); - -void yon_window_config_erase_custom_parameter(char *param_name, char *section); - -int yon_window_config_get_parameter(char *section, char *config_parameter, void *return_value, enum YON_TYPE type); - -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, ...); - - -void yon_gtk_widget_set_sensitive_from_toggle_button(GtkToggleButton *toggle, GtkWidget *target); -void yon_gtk_widget_set_sensitive_from_toggle_button_inversed(GtkToggleButton *toggle, GtkWidget *target); -void yon_gtk_widget_set_sensitive_from_combo_box(GtkComboBox *toggle, GtkWidget *target); -void yon_gtk_widget_set_sensitive_from_combo_box_inversed(GtkComboBox *toggle, GtkWidget *target); - -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-keyboard-banner.png b/ubl-settings-keyboard-banner.png deleted file mode 100644 index 8eb67cbc38babeaf498d981356cf7e77e2741f12..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33872 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 z - - False - False - True - center - com.ublinux.ubl-settings-keyboard - dialog - True - ubl-settings-keyboard - 1.1 - Copyright © 2022 - 2023, UBSoft LLC - Keyboard - https://wiki.ublinux.ru/ru/Программное_обеспечение/Программы_и_утилиты/Все/ubl-settings-keyboard - 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-keyboard - True - gpl-2-0 - - - True - False - vertical - 2 - - - False - end - - - False - False - 1 - - - - - - - True - False - True - - - True - False - 5 - 5 - 5 - 5 - 2 - Keyboard - - - - - - - - - - True - False - center - - - 90 - True - False - 5 - 5 - 5 - 5 - 6 - 6 - 69 - com.ublinux.ubl-settings-keyboard - - - False - True - 0 - - - - - True - False - - - True - False - - - True - False - center - vertical - - - 255 - True - False - end - Keyboard - 0 - - - - - - - - True - True - 0 - - - - - 255 - True - False - start - Keyboard configuration - 0 - - - - - - - - True - True - 1 - - - - - False - True - 0 - - - - - True - True - 0 - - - - - True - True - 1 - - - True False @@ -207,207 +40,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. False document-edit-symbolic - - 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 - Keyboard - - - - - - - - @@ -418,6 +50,9 @@ translated and supported by community. + + liststore1 + @@ -506,38 +141,43 @@ translated and supported by community. True False - - 800 - 600 + + True False - 800 - 600 - com.ublinux.ubl-settings-keyboard + 5 + 5 + 5 + 5 + 5 + 5 + True + True + vertical + 5 - + True False - vertical + 0.019999999552965164 + in - + True False - vertical + 5 + 5 + 5 - + True False + 5 - + True False - 5 - 5 - 5 - 5 - 5 - 5 - 25 + Num Lock on boot: + 0 False @@ -546,141 +186,96 @@ translated and supported by community. - + True False - start - 5 - 5 - 5 - 5 - 6 - 6 - True - - - - + 0 + + Default + On + Off + - False + True True 1 - - False - True - 0 - + + + + + True + False + Console + + + + + False + True + 0 + + + + + True + False + 0.019999999552965164 + in + + + True + False + 5 + 5 + 5 - + True False vertical + 6 - - 81 + True False + 5 - + True False - start + Keyboard model: + 0 - -1 + False + True + 0 - - - False - True - 0 - - - - - False - True - 1 - - - - - True - False - 5 - 5 - 5 - 5 - 5 - 5 - True - True - vertical - 5 - - - True - False - 0.019999999552965164 - in - + True False - 5 - 5 - 5 + liststore2 + 0 + 1 - - True - False - 5 - - - True - False - Num Lock on boot: - 0 - - - False - True - 0 - - - - - True - False - 0 - - Default - On - Off - - - - True - True - 1 - - - + + + 0 + - - - - True - False - Console - + + True + True + 1 + @@ -690,49 +285,30 @@ translated and supported by community. - + True False - 0.019999999552965164 - in + 5 - + True False - 5 - 5 - 5 + vertical + 5 - + True - False - vertical - 6 + True + in - + True - False - 5 + True + LayoutsFilter + False - - True - False - Keyboard model: - 0 - - - False - True - 0 - - - - - True - False - liststore2 - 0 - 1 + + column @@ -740,383 +316,169 @@ translated and supported by community. - - True - True - 1 - - - False - True - 0 - - - - - True - False - 5 - - - True - False - vertical - 5 - - - True - True - in - - - True - True - liststore1 - False - - - - - - column - - - - 0 - - - - - - - - - True - True - 0 - - - - - True - True - 0 - - - - - True - False - vertical - 5 - - - True - True - True - Move layout up - - - True - True - False - True - menu4 - up - - - - - - - - - - False - True - 0 - - - - - True - True - True - Move layout down - - - True - True - False - True - menu5 - - - - - - - - - - False - True - 1 - - - - - True - True - True - Добавить раскладку - image3 - - - - False - True - 2 - - - - - True - True - True - Удалить раскладку - image1 - - - - False - True - 4 - - - - - False - True - 1 - - - - - True - True - end - 2 - + + + True + True + 0 + + + + + True + True + 0 + + + + + True + False + vertical + 5 + + + True + True + True + Move layout up - + True - False - Keyboard layouts: - 0 - - - False - True - end - 4 - - - - - False - 5 - - - True - False - KEYBOARD: - 0 - - - False - True - 0 - - + True + False + True + menu4 + up - - True - True - - - True - True - 1 - + + - - False - True - 4 - + + + + False + True + 0 + + + + + True + True + True + Move layout down - + True - False - 5 + True + False + True + menu5 - - True - False - Keyboard options: - 0 - - - False - True - 0 - - - - - True - False - - - True - True - 1 - - - - - True - True - True - Pick an option - image4 - - - - False - True - 2 - + + - - False - True - 7 - + + + False + True + 1 + + + + + True + True + True + Добавить раскладку + image3 + + + + False + True + 2 + + + + + True + True + True + Удалить раскладку + image1 + + + + False + True + 4 + - - - - True - False - Keyboard - + + False + True + 1 + True True - 3 + end + 2 - - - False - True - 2 - - - - - True - True - 0 - - - - - - - True - False - True - - - True - False - 5 - 5 - 5 - 5 - 2 - Keyboard - - - - - - - - True - False - 5 - 5 - 5 - 5 - 6 - 6 - 32 - com.ublinux.ubl-settings-keyboard - - - - - True - False - - - True - True - False - True - menu3 - + True False + Keyboard layouts: + 0 + + + False + True + end + 4 + + + + + False + 5 - + True False - Save + KEYBOARD: + 0 False @@ -1125,75 +487,34 @@ translated and supported by community. - + True - False - pan-down-symbolic + True - False + True True 1 + + False + True + 4 + - - - 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 + 5 - + True False - Load + Keyboard options: + 0 False @@ -1202,35 +523,57 @@ translated and supported by community. - + True False - pan-down-symbolic - False + True True 1 + + + True + True + True + Pick an option + image4 + + + + False + True + 2 + + + + False + True + 7 + - - False - True - 0 - - - 2 - - + + + True + False + Keyboard + + + + True + True + 3 +