diff --git a/Makefile b/Makefile
index 2c64667..21263cf 100644
--- a/Makefile
+++ b/Makefile
@@ -12,7 +12,6 @@ DEPENDS = /bin/cmake
PREFIX ?= /usr/local
PKGNAME = $(MAKEFILE_DIR)
FILE_VER = source/${PKGNAME}.h
-PKGIDENT=$(subst /,-,${PREFIX})
default_target: all
@@ -22,9 +21,9 @@ all: init build
init:
@echo "Initialize ..."; \
- if [ -d ".git" ]; then \
+ if [[ -d ".git" ]]; then \
LATEST_TAG=$$(git describe --abbrev=0 --tags | sed 's/^v//'); \
- if [ -z "$${LATEST_TAG}" ]; \
+ if [[ -z "$${LATEST_TAG}" ]]; \
then \
LATEST_TAG=$$"0.0"; \
echo "$${LATEST_TAG} is empty"; \
@@ -38,7 +37,7 @@ init:
depend:
@echo "Check depends ..."
@for FILE_DEPEND in $(DEPENDS); do \
- if [ ! -f $${FILE_DEPEND} ]; then \
+ if [[ ! -f "$${FILE_DEPEND}" ]]; then \
echo "ERROR: Depend '$${FILE_DEPEND}' not found !"; \
exit 1; \
fi; \
@@ -48,21 +47,21 @@ depend:
debug:
@echo "Debug ..."
- if [ ! -d ${CMAKE_BUILD_DIR} ]; then \
+ 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 \
+ 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 \
+ if [[ -f "${CMAKE_BUILD_DIR}/${PKGNAME}" ]]; then \
echo "Check: OK"; \
else \
echo "Check: ${CMAKE_BUILD_DIR}/${PKGNAME} not found !"; \
@@ -77,10 +76,9 @@ build: depend prepare
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}"; \
+ @for LANG in $$(find ./locale -iname "*.po" -print | sed -En "s/.+_([[:alpha:]]+)\.po/\1/p" | sort -u); do \
+# PATH_FILE_MO="${DESTDIR}${PREFIX}/share/locale/$${LANG}/LC_MESSAGES/${PKGNAME}.mo"; \
+ PATH_FILE_MO="${DESTDIR}/usr/share/locale/$${LANG}/LC_MESSAGES/${PKGNAME}.mo"; \
$(RM) "$${PATH_FILE_MO}"; \
done
@for SIZE in 16x16 32x32 48x48 scalable; do \
@@ -92,51 +90,64 @@ uninstall:
$(RM) "${DESTDIR}${PREFIX}/share/icons/hicolor/$${SIZE}/status/$${FILE_SVG%.*}".{svg,png,jpg}; \
done; \
done
+ @for FILE_ICON in $(wildcard icons/*/*.svg); do \
+ SUB_NAME=$${FILE_ICON#*/}; SUB_NAME=$${SUB_NAME%/*}; \
+ $(RM) "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/$${SUB_NAME}/$${FILE_ICON}"; \
+ 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; \
+ @if [[ "${PREFIX}" == @("/usr"|"/usr/") ]]; then \
+ $(RM) "${DESTDIR}${PREFIX}/share/polkit-1/actions/com.ublinux.${PKGNAME}.policy"; \
+ else \
+# $(RM) "${DESTDIR}${PREFIX}/share/polkit-1/actions/com.ublinux.${PKGNAME}$${PREFIX//\//-}.policy"; \
+ $(RM) "${DESTDIR}/usr/share/polkit-1/actions/com.ublinux.${PKGNAME}$${PREFIX//\//-}.policy"; \
+ fi
+ @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; \
+ [[ -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}"; \
+ @for LANG in $$(find ./locale -iname "*.po" -print | sed -En "s/.+_([[:alpha:]]+)\.po/\1/p" | sort -u); do \
+ install -dm755 "${DESTDIR}${PREFIX}/share/locale/$${LANG}/LC_MESSAGES"; \
+# PATH_FILE_MO="${DESTDIR}${PREFIX}/share/locale/$${LANG}/LC_MESSAGES/${PKGNAME}.mo"; \
+ PATH_FILE_MO="${DESTDIR}/usr/share/locale/$${LANG}/LC_MESSAGES/${PKGNAME}.mo"; \
+ PKGNAME_PO="./locale/${PKGNAME}_$${LANG}.po"; [[ -f "$${PKGNAME_PO}" ]] || PKGNAME_PO= ; \
+ msgfmt --verbose --use-fuzzy --output-file "$${PATH_FILE_MO}" - < <(msgcat --use-first --no-wrap $${PKGNAME_PO} ./locale/*_$${LANG}.po); \
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"; \
+ install -dm755 "${DESTDIR}${PREFIX}/share/icons/hicolor/$${SIZE}x$${SIZE}/apps"; \
+ rsvg-convert -w $${SIZE} -h $${SIZE} -f svg --keep-image-data "icons/apps/com.ublinux.${PKGNAME}.svg" -o "${DESTDIR}${PREFIX}/share/icons/hicolor/$${SIZE}x$${SIZE}/apps/com.ublinux.${PKGNAME}.svg"; \
+ done
+ @for FILE_ICON in $(wildcard icons/*/*.svg); do \
+ SUB_NAME=$${FILE_ICON#*/}; SUB_NAME=$${SUB_NAME%/*}; \
+ install -Dm644 -t "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/$${SUB_NAME}" $${FILE_ICON}; \
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; \
+ @if [[ "${PREFIX}" == @("/usr"|"/usr/") ]]; then \
+ install -Dm644 -t "${DESTDIR}${PREFIX}/share/polkit-1/actions/" "com.ublinux.${PKGNAME}.policy"; \
+ else \
+# install -Dm644 "com.ublinux.${PKGNAME}.policy" "${DESTDIR}${PREFIX}/share/polkit-1/actions/com.ublinux.${PKGNAME}$${PREFIX//\//-}.policy"; \
+ install -Dm644 "com.ublinux.${PKGNAME}.policy" "${DESTDIR}/usr/share/polkit-1/actions/com.ublinux.${PKGNAME}$${PREFIX//\//-}.policy"; \
+# sed -e "s+/usr/bin+${PREFIX}/bin+" -e "s+\.run+$${PREFIX//\//-}\.run+g" -i "${DESTDIR}${PREFIX}/share/polkit-1/actions/com.ublinux.${PKGNAME}$${PREFIX//\//-}.policy"; \
+ sed -e "s+/usr/bin+${PREFIX}/bin+" -e "s+\.run+$${PREFIX//\//-}\.run+g" -i "${DESTDIR}/usr/share/polkit-1/actions/com.ublinux.${PKGNAME}$${PREFIX//\//-}.policy"; \
+ fi
+ @if [[ -z "${DESTDIR}" ]]; then \
+ ldconfig -n ${DESTDIR}${PREFIX}/lib; \
+ [[ -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; \
+ [[ -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 \
+ @if [[ -d "${CMAKE_BUILD_DIR}" ]]; then \
echo "Clean: error, compile directory exist ${CMAKE_BUILD_DIR}"; \
else \
echo "Clean: OK"; \
diff --git a/com.ublinux.ubl-settings-keyboard.checked.svg b/com.ublinux.ubl-settings-keyboard.checked.svg
deleted file mode 100644
index e3cab42..0000000
--- a/com.ublinux.ubl-settings-keyboard.checked.svg
+++ /dev/null
@@ -1,327 +0,0 @@
-
-
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 @@
-
-
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 8eb67cb..0000000
Binary files a/ubl-settings-keyboard-banner.png and /dev/null differ
diff --git a/ubl-settings-keyboard.desktop b/ubl-settings-keyboard.desktop
index a1c10e7..36694f1 100644
--- a/ubl-settings-keyboard.desktop
+++ b/ubl-settings-keyboard.desktop
@@ -1,15 +1,15 @@
[Desktop Entry]
Encoding=UTF-8
Name=Keyboard configuration
-Name[ru]=TEMPLATE
+Name[ru]=Клавиатура
GenericName=ubl-settings-keyboard
-GenericName[ru]=TEMPLATE
+GenericName[ru]=Клавиатура
Comment=Keyboard configuration
-Comment[ru]=Приложение для TEMPLATE
+Comment[ru]=Настройки клавиатуры
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;
+Categories=XFCE;GTK;X-UBL-SettingsManager;X-UBL-Personal-Settings;
diff --git a/ubl-settings-keyboard.glade b/ubl-settings-keyboard.glade
index 6b0f6e5..3445b85 100644
--- a/ubl-settings-keyboard.glade
+++ b/ubl-settings-keyboard.glade
@@ -25,173 +25,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-
-
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
-
-
-
- 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
-
-
-
-
-
-
-
-
@@ -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
-
-
-
-
-
-
- False
- True
- 0
-
-
-
-
- True
- True
- True
- Move layout down
-
-
-
-
-
-
- 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
-
+
-
- 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
-
+
-
- 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
+ True
+ 3
+