diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..1ce2845
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,8 @@
+.vscode/
+ubl-settings-video
+ubl-settings-video.glade~
+*ubl-settings-video.glade#
+compile/
+ubl-settings-video_ru.po~
+ubl-settings-video-n.pot
+vgcore.*
\ No newline at end of file
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..b83b2ea
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,162 @@
+#!/usr/bin/make -f
+
+#SHELL := /bin/bash
+MAKEFILE_FILEPATH := $(abspath $(lastword $(MAKEFILE_LIST)))
+MAKEFILE_DIR := $(notdir $(patsubst %/,%,$(dir $(MAKEFILE_FILEPATH))))
+MAKEFILE_PATH := $(dir $(MAKEFILE_FILEPATH))
+
+CMAKE_COMMAND = cmake
+CMAKE_SOURCE_DIR = $(MAKEFILE_PATH)source
+CMAKE_BUILD_DIR = $(MAKEFILE_PATH)compile
+#CMAKE_SOURCE_DIR = ./source
+#CMAKE_BUILD_DIR = ./compile
+FILE_VERSION = VERSION.md
+DEPENDS = /bin/cmake
+PREFIX ?= /usr
+PKGNAME = $(MAKEFILE_DIR)
+#PKGNAME = ubl-settings-manager
+
+default_target: all
+
+.PHONY: all init depend debug prepare check build uninstall install clean up_ver help
+
+all: init build
+
+init:
+ @echo "Initialize ..."; \
+ sed -r "s/(version_application = ).*/\1\"$$(grep 'VERSION' ${FILE_VERSION} | cut -d" " -f2)\";/" -i source/ubl-settings-video.h; \
+ echo "-- Build path: ${CMAKE_BUILD_DIR}"
+
+depend:
+ @echo "Check depends ..."
+ @for FILE_DEPEND in $(DEPENDS); do \
+ if [ ! -f $${FILE_DEPEND} ]; then \
+ echo "ERROR: Depend '$${FILE_DEPEND}' not found !"; \
+ exit 1; \
+ fi; \
+ done; \
+ echo "Check depends: OK"
+# $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1
+
+debug:
+ @echo "Debug ..."
+ if [ ! -d ${CMAKE_BUILD_DIR} ]; then \
+ $(CMAKE_COMMAND) -S${CMAKE_SOURCE_DIR} -B${CMAKE_BUILD_DIR} -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX="${PREFIX}"; \
+ fi; \
+ echo "Debug: OK"
+
+prepare:
+ @echo "Prepare ..."; \
+ if [ ! -d ${CMAKE_BUILD_DIR} ]; then \
+ $(CMAKE_COMMAND) -S${CMAKE_SOURCE_DIR} -B${CMAKE_BUILD_DIR} -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX="${PREFIX}"; \
+ fi; \
+ echo "Prepare: OK"
+
+check:
+ @echo "Check ..."; \
+ if [ -f ${CMAKE_BUILD_DIR}/${PKGNAME} ]; then \
+ echo "Check: OK"; \
+ else \
+ echo "Check: ${CMAKE_BUILD_DIR}/${PKGNAME} not found !"; \
+ exit 1; \
+ fi
+
+build: depend prepare
+ @echo "Build ..."; \
+ make --directory=${CMAKE_BUILD_DIR}; \
+ echo "Build: OK"
+
+uninstall:
+ @echo "Uninstall ..."
+ @for FILE_PO in $(wildcard *.po); do \
+ LANG=$${FILE_PO##*_};LANG=$${LANG%.*}; \
+ FILE_MO=$${FILE_PO##*/}; FILE_MO="$${FILE_MO%_*.po}.mo"; \
+ PATH_FILE_MO="${DESTDIR}${PREFIX}/share/locale/$${LANG}/LC_MESSAGES/$${FILE_MO}"; \
+ $(RM) "$${PATH_FILE_MO}"; \
+ done
+ @for SIZE in 16x16 32x32 48x48 scalable; do \
+ $(RM) "${DESTDIR}${PREFIX}/share/icons/hicolor/$${SIZE}/apps/com.ublinux.${PKGNAME}.svg"; \
+ $(RM) "${DESTDIR}${PREFIX}/share/icons/hicolor/$${SIZE}/apps/com.ublinux.${PKGNAME}.png"; \
+ done
+ @for FILE_SVG in $(wildcard *.svg); do \
+ for SIZE in 16x16 32x32 48x48 scalable; do \
+ $(RM) "${DESTDIR}${PREFIX}/share/icons/hicolor/$${SIZE}/status/$${FILE_SVG%.*}".{svg,png,jpg}; \
+ done; \
+ done
+ @$(RM) "${DESTDIR}${PREFIX}/bin/${PKGNAME}"
+ @$(RM) "${DESTDIR}/etc/xdg/${PKGNAME}/${PKGNAME}.conf"
+ @$(RM) "${DESTDIR}${PREFIX}/share/applications/${PKGNAME}.desktop"
+ @$(RM) "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/apps/com.ublinux.${PKGNAME}.svg"
+ @$(RM) -rd "${DESTDIR}${PREFIX}/share/${PKGNAME}/images"
+ @$(RM) -rd "${DESTDIR}${PREFIX}/share/${PKGNAME}"
+ @if [ -z ${DESTDIR} ]; then \
+ [ -d "${DESTDIR}${PREFIX}/share/icons/hicolor/" ] && gtk-update-icon-cache -fiq "${DESTDIR}${PREFIX}/share/icons/hicolor/" &>/dev/null || true; \
+ update-desktop-database --quiet &>/dev/null || true; \
+ [ -d "${DESTDIR}${PREFIX}/share/applications" ] && touch "${DESTDIR}${PREFIX}/share/applications" &>/dev/null || true; \
+ fi
+ @echo "Uninstall: OK"
+
+install: check uninstall
+ @echo "Install ..."
+ @for FILE_PO in $(wildcard *.po); do \
+ LANG=$${FILE_PO##*_};LANG=$${LANG%.*}; \
+ install -dm655 "${DESTDIR}${PREFIX}/share/locale/$${LANG}/LC_MESSAGES"; \
+ FILE_MO=$${FILE_PO##*/}; FILE_MO="$${FILE_MO%_*.po}.mo"; \
+ PATH_FILE_MO="${DESTDIR}${PREFIX}/share/locale/$${LANG}/LC_MESSAGES/$${FILE_MO}"; \
+ echo "$${FILE_PO}"; \
+ msgfmt "$${FILE_PO}" -v -f -o "$${PATH_FILE_MO}"; \
+ done
+ @for SIZE in 16 32 48; do \
+ install -dm655 "${DESTDIR}${PREFIX}/share/icons/hicolor/$${SIZE}x$${SIZE}/apps"; \
+ rsvg-convert -w $${SIZE} -h $${SIZE} -f svg --keep-image-data "com.ublinux.${PKGNAME}.svg" -o "${DESTDIR}${PREFIX}/share/icons/hicolor/$${SIZE}x$${SIZE}/apps/com.ublinux.${PKGNAME}.svg"; \
+ done
+ @install -dm655 "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/apps"
+ @install -Dm644 -t "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/apps/" "com.ublinux.${PKGNAME}.svg"
+ @install -Dm644 -t "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/devices/" "com.ublinux.${PKGNAME}.display.svg"
+ @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 -Dm655 -t "${DESTDIR}${PREFIX}/bin/" "${CMAKE_BUILD_DIR}/${PKGNAME}"
+ @install -dm655 "${DESTDIR}${PREFIX}/share/applications"
+ @install -Dm644 -t "${DESTDIR}${PREFIX}/share/applications/" "${PKGNAME}.desktop"
+ @install -dm655 "${DESTDIR}${PREFIX}/share/${PKGNAME}"/{ui,css,images}
+ @install -Dm644 -t "${DESTDIR}${PREFIX}/share/${PKGNAME}/ui/" "${PKGNAME}.glade"
+ @install -Dm644 -t "${DESTDIR}${PREFIX}/share/${PKGNAME}/css/" "${PKGNAME}.css"
+ @install -dm655 "${DESTDIR}${PREFIX}/share/${PKGNAME}/images"
+ @install -Dm644 -t "${DESTDIR}${PREFIX}/share/${PKGNAME}/images/" "${PKGNAME}-banner.png"
+ @install -Dm644 -t "${DESTDIR}${PREFIX}/share/${PKGNAME}/csv/" "resolutions.csv"
+ @install -Dm644 -t "${DESTDIR}${PREFIX}/share/${PKGNAME}/csv/" "video-drivers.csv"
+ @if [ -z ${DESTDIR} ]; then \
+ [ -d "${DESTDIR}${PREFIX}/share/icons/hicolor/" ] && gtk-update-icon-cache -fiq "${DESTDIR}${PREFIX}/share/icons/hicolor/" &>/dev/null || true; \
+ update-desktop-database --quiet &>/dev/null || true; \
+ [ -d "${DESTDIR}${PREFIX}/share/applications" ] && touch "${DESTDIR}${PREFIX}/share/applications" &>/dev/null || true; \
+ fi
+ @echo "Install: OK"
+
+clean:
+ @echo "Clean ..."
+ @$(RM) -rd ${CMAKE_BUILD_DIR}
+ @if [ -d ${CMAKE_BUILD_DIR} ]; then \
+ echo "Clean: error, compile directory exist ${CMAKE_BUILD_DIR}"; \
+ else \
+ echo "Clean: OK"; \
+ fi
+
+up_ver:
+ @CURRENT=$$(grep 'VERSION' ${FILE_VERSION} | cut -d" " -f2); \
+ MAJOR=$$(cut -d. -f1 <<< $${CURRENT}); \
+ MINOR=$$(cut -d. -f2 <<< $${CURRENT}); \
+ VER="$${MAJOR}.$$(($${MINOR}+1))"; \
+ sed "s/VERSION *[[:digit:]]*.*/VERSION $${VER}/" -i ${FILE_VERSION}; \
+ echo "Updated version to VERSION.md: $${CURRENT} to $${VER}"
+
+help:
+ @echo "The following are some of the valid targets for this Makefile:"; \
+ echo "... all (the default if no target is provided)"; \
+ echo "... init"; \
+ echo "... debug"; \
+ echo "... prepare"; \
+ echo "... compile"; \
+ echo "... install"; \
+ echo "... uninstall"; \
+ echo "... clean"; \
+ echo "... up_ver"
diff --git a/README.md b/README.md
index dd14874..457d749 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,28 @@
# ubl-settings-video
+# Настройки видеоадаптера и дисплея
+# Build
+In order to build ubl-settings-video you will need:
+
+- CMake
+- C compiler
+- GTK+ 3 & dependencies
+
+Once you have all the necessary dependencies, you can use:
+```sh
+$ make
+```
+
+# Installation
+After a successful build, just use:
+```sh
+$ sudo make install clean
+```
+
+# Uninstallation
+After a successful build, just use:
+```sh
+$ sudo make uninstall
+```
+
+
diff --git a/VERSION.md b/VERSION.md
new file mode 100644
index 0000000..12ebd01
--- /dev/null
+++ b/VERSION.md
@@ -0,0 +1 @@
+VERSION 1.0
diff --git a/com.ublinux.ubl-settings-video.checked.svg b/com.ublinux.ubl-settings-video.checked.svg
new file mode 100644
index 0000000..e3cab42
--- /dev/null
+++ b/com.ublinux.ubl-settings-video.checked.svg
@@ -0,0 +1,327 @@
+
+
diff --git a/com.ublinux.ubl-settings-video.display.svg b/com.ublinux.ubl-settings-video.display.svg
new file mode 100644
index 0000000..999af37
--- /dev/null
+++ b/com.ublinux.ubl-settings-video.display.svg
@@ -0,0 +1,142 @@
+
+
diff --git a/com.ublinux.ubl-settings-video.svg b/com.ublinux.ubl-settings-video.svg
new file mode 100644
index 0000000..392fcb1
--- /dev/null
+++ b/com.ublinux.ubl-settings-video.svg
@@ -0,0 +1,6594 @@
+
+
diff --git a/com.ublinux.ubl-settings-video.warning.svg b/com.ublinux.ubl-settings-video.warning.svg
new file mode 100644
index 0000000..9a90dba
--- /dev/null
+++ b/com.ublinux.ubl-settings-video.warning.svg
@@ -0,0 +1,55 @@
+
+
diff --git a/resolutions.csv b/resolutions.csv
new file mode 100644
index 0000000..bff0b8e
--- /dev/null
+++ b/resolutions.csv
@@ -0,0 +1,27 @@
+640x480 ,4:3,VGA
+800x480 ,5:3,WVGA
+800x600 ,4:3,SVGA
+854x480 ,16:9,FWVGA
+960x540 ,19:9,qHD
+1024x600,128:75,WSVGA
+1024x768,4:3,XGA
+1152x864,4:3,XGA+
+1200x600,2:1,WXVGA
+1280x720,16:9,HD
+1280x768,5:3,WSGA
+1280x1024,5:4,SXGA
+1440x900,16:10,WXGA+
+1400x1050,4:3,SXGA+
+1440x1080,4:3,HDV 1080
+1536x960,16:10,XJXGA
+1536x1024,3:2,WSXGA
+1600x900,16:9,HD+
+1600x1024,25:16,WSXGA
+1600x1200,4:3,UXGA
+1680x1050,16:10,WSXGA+
+1920x1080,16:9,FHD
+1920x1200,16:10,WUXGA
+2048x1080,19:10,2K DCI
+2048x1152,16:9,QWXGA
+2560x1080,21:9,UWHD
+2560x1440,16:9,QHD
diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt
new file mode 100644
index 0000000..009e8d4
--- /dev/null
+++ b/source/CMakeLists.txt
@@ -0,0 +1,30 @@
+cmake_minimum_required(VERSION 3.7)
+project(ubl-settings-video)
+
+find_package(PkgConfig REQUIRED)
+
+pkg_check_modules(GTK REQUIRED gtk+-3.0)
+include_directories(${GTK_INCLUDE_DIRS})
+link_directories(${GTK_LIBRARY_DIRS})
+add_definitions(${GTK_CFLAGS_OTHER})
+
+#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pedantic -Wall -Wextra -Werror -Wmissing-declarations -fdiagnostics-color=always -std=c++2a")
+#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pedantic -Wall -Wextra -Werror -Wmissing-declarations -fdiagnostics-color=always -lm")
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pedantic -Wall -Wextra -Werror -Wmissing-declarations -fdiagnostics-color=always \
+ -O2 -pipe -fno-plt -fexceptions \
+ -Wp,-D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security \
+ -fstack-clash-protection -fcf-protection")
+
+set(SOURCE_FILES
+ ubl-settings-video.c
+ ubl-utils.c
+)
+
+set(LIBRARIES
+ ${GTK_LIBRARIES}
+ pthread)
+
+
+add_executable(ubl-settings-video ${SOURCE_FILES})
+target_link_libraries(ubl-settings-video ${LIBRARIES})
+install(TARGETS ubl-settings-video DESTINATION bin)
\ No newline at end of file
diff --git a/source/ubl-settings-video-strings.h b/source/ubl-settings-video-strings.h
new file mode 100644
index 0000000..f15d6ef
--- /dev/null
+++ b/source/ubl-settings-video-strings.h
@@ -0,0 +1,43 @@
+#define PARAMETER_DEFAULT_LABEL _("Default settings")
+#define MONITOR_LABEL _("Monitor ")
+#define SETTINGS_VIDEO_TITLE_LABEL _("Video adapter and display settings")
+#define MONITOR_PORT_LABEL _("Port: ")
+#define MONITOR_RESOLUTION_LABEL _("Resolution (px): ")
+#define MONITOR_FREQUENCY_LABEL _("Frequency (Hz): ")
+#define MONITOR_ROTATION_LABEL _("Rotation: ")
+#define MONITOR_POSITION_LABEL _("Position: ")
+#define MONITOR_SWITCH_OFF_LABEL _("Do not switch off display")
+#define MONITOR_CVT_LABEL _("Create modeline for current resolution with CVT")
+#define MONITOR_REDUCED_LABEL _("Use \"CVT Reduced Blanking\"")
+#define MONITOR_GTF_LABEL _("Create modeline for current resolution with GTF")
+#define MONITOR_MANUALLY_LABEL _("Configure manually through parameter line: ")
+#define MONITOR_MAIN_DISPLAY_LABEL _("Main display")
+#define MONITOR_UNSUPPORTED_LABEL _("Show unsupported")
+#define MONITOR_ENABLED_LABEL _("Enabled")
+#define MONITOR_LEFT_LABEL _("Left")
+#define MONITOR_RIGHT_LABEL _("Right")
+#define MONITOR_INVERTED_LABEL _("Inverted")
+#define MONITOR_LEFT_POS_LABEL _("Left of")
+#define MONITOR_RIGHT_POS_LABEL _("Right of")
+#define MONITOR_ABOVE_POS_LABEL _("Above")
+#define MONITOR_BELOW_POS_LABEL _("Below ")
+#define MONITOR_NO_ROTATION_LABEL _("No rotation")
+#define MONITOR_SAVE_LABEL _("Save")
+#define MONITOR_CANCEL_LABEL _("Cancel")
+#define MONITOR_CHOOSE_PORT_LABEL _("Choose port to configure")
+
+
+#define MONITOR_POSITION_LEFT_PARAMETER _("lo:")
+#define MONITOR_POSITION_RIGHT_PARAMETER _("ro:")
+#define MONITOR_POSITION_ABOVE_PARAMETER _("ab:")
+#define MONITOR_POSITION_BELOW_PARAMETER _("be:")
+
+
+#define MONITOR_ROTATE_PARAMETER _("rotate:")
+#define MONITOR_ROTATE_NORMAL_PARAMETER _("normal")
+#define MONITOR_ROTATE_LEFT_PARAMETER _("left")
+#define MONITOR_ROTATE_RIGHT_PARAMETER _("right")
+#define MONITOR_ROTATE_INVERTED_PARAMETER _("invert")
+
+#define MONITOR_PORT_ERROR_LABEL _("Error: Port must be chosen to save")
+#define MONITOR_PORT_SUCCESS_LABEL _("Monitor configuration succeedeed")
\ No newline at end of file
diff --git a/source/ubl-settings-video.c b/source/ubl-settings-video.c
new file mode 100644
index 0000000..4161d57
--- /dev/null
+++ b/source/ubl-settings-video.c
@@ -0,0 +1,1330 @@
+#include "ubl-settings-video.h"
+
+config videoconfig;
+
+void yon_on_plug_added(GtkSocket *self, gpointer user_data)
+{
+}
+
+void yon_on_plug_removed(GtkSocket *self, gpointer user_data)
+{
+}
+
+void on_subwindow_close(GtkWidget *self)
+{
+ gtk_widget_destroy(gtk_widget_get_toplevel(self));
+}
+
+void on_monitor_config_save(GtkWidget *self, monitor_edit_window *window){
+ monitorconfig *config = yon_dictionary_get_data(window->config,monitorconfig*);
+ if (gtk_combo_box_get_active(GTK_COMBO_BOX(window->templateMonitorConfigurationPortCombo))==0){
+ _yon_ubl_status_box_render(videoconfig.status_render.box,videoconfig.status_render.icon,videoconfig.status_render.label,MONITOR_PORT_ERROR_LABEL,BACKGROUND_IMAGE_FAIL_TYPE);
+ return;
+ }
+ config->main=0;
+ config->enable=0;
+ config->position=0;
+ config->rotation=0;
+ config->dpms=0;
+ config->cvt=0;
+ config->reduced=0;
+ config->position_port=NULL;
+ config->port=NULL;
+ config->resolution=NULL;
+ config->frequency=NULL;
+ _yon_ubl_status_box_render(videoconfig.status_render.box,videoconfig.status_render.icon,videoconfig.status_render.label,MONITOR_PORT_SUCCESS_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE);
+ config->port = (char*)gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(window->templateMonitorConfigurationPortCombo));
+ window->config->key = yon_char_new(config->port);
+ if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->templateMonitorConfigurationParameterLineCheck))==0){
+ config->main = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->templateMonitorConfigurationMainCheck));
+ config->enable = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->templateMonitorConfigurationEnableCheck));
+ config->dpms = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->templateMonitorConfigurationModelineCVTCheck));
+ config->cvt = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->templateMonitorConfigurationModelineCVTCheck));
+ config->reduced = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->templateMonitorConfigurationUseCVTReducedCheck));
+ config->gtf = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->templateMonitorConfigurationModelineGTFCheck));
+ if (gtk_combo_box_get_active(GTK_COMBO_BOX(window->templateMonitorConfigurationPositionPosCombo))!=0
+ &>k_combo_box_get_active(GTK_COMBO_BOX(window->templateMonitorConfigurationPositionPortCombo))!=0){
+ config->position = gtk_combo_box_get_active(GTK_COMBO_BOX(window->templateMonitorConfigurationPositionPosCombo));
+ config->position_port = (char*)gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(window->templateMonitorConfigurationPositionPortCombo));
+
+ }
+ config->resolution=yon_char_divide_search(gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(window->templateMonitorConfigurationResolutionCombo))," ",-1);
+ int rotation = gtk_combo_box_get_active(GTK_COMBO_BOX(window->templateMonitorConfigurationRotationCombo));
+ if (rotation==1) config->rotation=rotation;
+ else if (rotation==2) config->rotation=rotation;
+ else if (rotation==3) config->rotation=rotation;
+ else config->rotation=0;
+ if (gtk_combo_box_get_active(GTK_COMBO_BOX(window->templateMonitorConfigurationResolutionCombo))!=0) {
+ char *resolution = (char*)gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(window->templateMonitorConfigurationResolutionCombo));
+ }
+ if (gtk_combo_box_get_active(GTK_COMBO_BOX(window->templateMonitorConfigurationResolutionCombo))!=0) {
+ char *frequency = (char*)gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(window->templateMonitorConfigurationFrequencyCombo));
+ }
+ yon_monitor_make_string(config);
+ } else {
+ char *stringparameters = (char*)gtk_entry_get_text(GTK_ENTRY(window->templateMonitorConfigurationParameterLineEntry));
+ }
+ yon_monitor_view_update();
+ on_subwindow_close(self);
+}
+
+// void on_save_window_configuration(GtkWidget *self, MonitorSettings *monitor){
+// char *port=NULL;
+// port=gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(monitor->templateMonitorConfigurationPortCombo));
+// if (!monitor->curconfig){
+// monitorconfig *confi = new(monitorconfig);
+// if (!videoconfig.monitors) videoconfig.monitors=yon_dictionary_create_with_data(port,confi);
+// else videoconfig.monitors=yon_dictionary_create_with_data_connected(videoconfig.monitors,port,confi);
+// monitor->curconfig=videoconfig.monitors;
+// }
+// char *freq=NULL;
+// char *res=NULL;
+// char *rot=NULL;
+// char *entr=NULL;
+// char *def=NULL;
+// def=_("Default settings");
+// if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(monitor->templateMonitorConfigurationMainRadio))==1)
+// yon_dictionary_get_data(monitor->curconfig,monitorconfig*)->main=1;
+// if (strcmp((freq=yon_char_new((char*)gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(monitor->templateMonitorConfigurationFrequencyCombo)))),def)!=0)
+// yon_dictionary_get_data(monitor->curconfig,monitorconfig*)->frequency=freq;
+// else yon_dictionary_get_data(monitor->curconfig,monitorconfig*)->frequency=NULL;
+// if (strcmp((res=yon_char_new((char*)gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(monitor->templateMonitorConfigurationResolutionCombo)))),def)!=0)
+// yon_dictionary_get_data(monitor->curconfig,monitorconfig*)->resolution=res;
+// else yon_dictionary_get_data(monitor->curconfig,monitorconfig*)->resolution=NULL;
+// if (strcmp((rot=yon_char_new((char*)gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(monitor->templateMonitorConfigurationRotationCombo)))),def)!=0)
+// yon_dictionary_get_data(monitor->curconfig,monitorconfig*)->rotation=rot;
+// else yon_dictionary_get_data(monitor->curconfig,monitorconfig*)->rotation=NULL;
+// if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(monitor->templateMonitorConfigurationParameterLineCheck))){
+// entr=yon_char_new((char*)gtk_entry_get_text(GTK_ENTRY(monitor->templateMonitorConfigurationParameterLineEntry)));
+// yon_dictionary_get_data(monitor->curconfig,monitorconfig*)->stringparameters=entr;
+// } else {
+// char *str=NULL;
+// str = "";
+// if (yon_dictionary_get_data(monitor->curconfig,monitorconfig*)->frequency!=NULL)
+// str=yon_char_get_augumented(str,yon_char_get_augumented(yon_dictionary_get_data(monitor->curconfig,monitorconfig*)->frequency,","));
+// if (yon_dictionary_get_data(monitor->curconfig,monitorconfig*)->resolution!=NULL)
+// str=yon_char_get_augumented(str,yon_char_get_augumented(yon_dictionary_get_data(monitor->curconfig,monitorconfig*)->resolution,","));
+// if (yon_dictionary_get_data(monitor->curconfig,monitorconfig*)->rotation!=NULL)
+// if (strcmp(yon_dictionary_get_data(monitor->curconfig,monitorconfig*)->rotation,_("Right"))==0)
+// str=yon_char_get_augumented(str,"rotation:right,");
+// else if (strcmp(yon_dictionary_get_data(monitor->curconfig,monitorconfig*)->rotation,_("Left"))==0)
+// str=yon_char_get_augumented(str,"rotation:left,");
+// else if (strcmp(yon_dictionary_get_data(monitor->curconfig,monitorconfig*)->rotation,_("Invert"))==0)
+// str=yon_char_get_augumented(str,"rotation:invert,");
+// else
+// str=yon_char_get_augumented(str,"rotation:normal,");
+
+// if (yon_dictionary_get_data(monitor->curconfig,monitorconfig*)->main!=0)
+// str=yon_char_get_augumented(str,"primary,");
+// if (strcmp(str,"")!=0)
+// yon_dictionary_get_data(monitor->curconfig,monitorconfig*)->stringparameters=str;
+
+// }
+// dictionary *dict=NULL;
+// // for_dictionaries (dict,videoconfig.videoconfig){
+// // MonitorSettings *monitorsett=yon_dictionary_get_data(dict,MonitorSettings*);
+// // if (monitorsett->curconfig==monitor->curconfig){
+// // yon_parse_monitor(monitorsett->curconfig,yon_dictionary_get_data(monitor->curconfig,monitorconfig*)->stringparameters);
+// // gtk_label_set_text(GTK_LABEL(monitorsett->templateMonitorInfoResolutionLabel),yon_dictionary_get_data(monitor->curconfig,monitorconfig*)->resolution);
+// // if (yon_dictionary_get_data(monitorsett->curconfig,monitorconfig*)->main==0)
+// // gtk_label_set_text(GTK_LABEL(monitorsett->templateMonitorInfoNameLabel), yon_char_get_augumented("Monitor ", ((monitorconfig *)monitorsett->curconfig->data)->port));
+// // if (yon_dictionary_get_data(monitorsett->curconfig,monitorconfig*)->main==1)
+// // gtk_label_set_text(GTK_LABEL(monitorsett->templateMonitorInfoNameLabel), yon_char_get_augumented("Monitor ", yon_char_get_augumented(((monitorconfig *)monitorsett->curconfig->data)->port,"*")));
+
+// // }
+// // }
+// on_subwindow_close(self);
+// };
+
+void on_port_chosen_changed(GtkWidget *self, monitor_edit_window *window){
+ monitorconfig* config = yon_dictionary_get_data(window->config,monitorconfig*);
+ dictionary *dict=NULL;
+ gtk_combo_box_text_remove_all(GTK_COMBO_BOX_TEXT(window->templateMonitorConfigurationResolutionCombo));
+ gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(window->templateMonitorConfigurationResolutionCombo),PARAMETER_DEFAULT_LABEL);
+ gtk_combo_box_set_active(GTK_COMBO_BOX(window->templateMonitorConfigurationResolutionCombo),0);
+ char *combo_text=yon_char_new((char*)gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(window->templateMonitorConfigurationPortCombo)));
+ char *resolution = yon_char_divide_search(combo_text," ",-1);
+ if (combo_text)
+ if (strcmp(combo_text,MONITOR_CHOOSE_PORT_LABEL)!=0){
+ dict=yon_dictionary_find(&videoconfig.supported_resolutions,resolution);
+ if (dict){
+ resolution_supported *res = yon_dictionary_get_data(dict,resolution_supported*);
+ int found_size=0;
+ for (int i=0;isize;i++){
+ char *check_line;
+ for (int j=0;jline[i])){
+ found_size++;
+ if(!config->resolutionCapabilities) config->resolutionCapabilities=new(char*);
+ else config->resolutionCapabilities=realloc(config->resolutionCapabilities,sizeof(char*)*found_size);
+ config->resolutionCapabilities[found_size-1]=videoconfig.resolutions[j];
+ config->resolution_size=found_size;
+ }
+ }
+ }
+ yon_gtk_combo_box_fill(window->templateMonitorConfigurationResolutionCombo,config->resolutionCapabilities, config->resolution_size);
+ }
+ }
+}
+
+void on_save_driver_configuration(GtkWidget *self,combo_tree *widgets){
+ GtkTreeIter iter;
+ char *name;
+ GtkTreeModel *list_s=GTK_TREE_MODEL(videoconfig.list);
+ GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(widgets->tree));
+ gtk_tree_selection_get_selected(selection,&list_s,&iter);
+ gtk_tree_model_get(list_s,&iter,0,&name,-1);
+ int ret = yon_gtk_combo_box_text_find(widgets->combo,name);
+ if (ret!=-1)
+ gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->combo),ret);
+
+ on_subwindow_close(self);
+}
+
+void on_sensitive_change(GtkWidget *self, GtkWidget *toggle)
+{
+ int state = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(self));
+
+ gtk_widget_set_sensitive(toggle, state);
+}
+
+void on_sensitive_change_reversed(GtkWidget *self, GtkWidget *toggle)
+{
+ int state = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(self));
+
+ gtk_widget_set_sensitive(toggle, !state);
+}
+
+void on_auto_choose_drivers(GtkWidget *self, widgets_dict *widgets)
+{
+ int state = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(self));
+
+ gtk_widget_set_sensitive(widgets->mainDriverFailsafeNvidiaLabel, !state);
+ gtk_widget_set_sensitive(widgets->mainDriverFailsafeAMDCombo, !state);
+ gtk_widget_set_sensitive(widgets->mainDriverFailsafeAMDLabel, !state);
+ gtk_widget_set_sensitive(widgets->mainDriverFailsafeNvidiaCombo, !state);
+}
+
+// void on_closed_configuration(GtkWidget *self, MonitorSettings *monitors)
+// {
+// gtk_widget_destroy(monitors->templateMonitorConfigurationWindow);
+// }
+
+char *yon_configuration_get_save_command(char *command){
+ char *str = NULL;
+ char *dntus = NULL;
+ dntus=_("Don't use");
+ str=yon_char_new(command);
+ if (videoconfig.autoChooseDrivers==0){
+ if (strcmp(videoconfig.failsafenVidia, dntus)!=0)
+ str = yon_char_get_augumented(str, yon_char_get_augumented(" FAILSAFENVIDIA=", videoconfig.failsafenVidia));
+ if (strcmp(videoconfig.failsafeATI, dntus)!=0)
+ str = yon_char_get_augumented(str, yon_char_get_augumented(" FAILSAFEATI=", videoconfig.failsafeATI));
+ }
+ if (strcmp(videoconfig.optirun, dntus)!=0&&strcmp(videoconfig.optirun, "")!=0)
+ str = yon_char_get_augumented(str, yon_char_get_augumented(" OPTIRUN=", videoconfig.optirun));
+ if (strcmp(videoconfig.primusrun, dntus)!=0&&strcmp(videoconfig.primusrun, "")!=0)
+ str = yon_char_get_augumented(str, yon_char_get_augumented(" PRIMUSRUN=", videoconfig.primusrun));
+
+ dictionary *dict=NULL;
+ for_dictionaries(dict,videoconfig.monitors){
+ if (yon_dictionary_get_data(dict,monitorconfig*)->stringparameters){
+
+ str=yon_char_get_augumented(str, yon_config_make_save_parameter_with_multiple_arguments(yon_dictionary_get_data(dict,monitorconfig*)->stringparameters,XORG_MONITOR(dict->key),","));
+
+ }
+ }
+
+ if (strcmp(str,command)!=0)
+ return str;
+ else return NULL;
+}
+
+void on_resolutions_unsupported_show(GtkWidget *self, monitor_edit_window *window){
+ ((monitorconfig*)window->config->data)->show_usupported = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(self));
+ gtk_combo_box_text_remove_all(GTK_COMBO_BOX_TEXT(window->templateMonitorConfigurationResolutionCombo));
+ gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(window->templateMonitorConfigurationResolutionCombo),PARAMETER_DEFAULT_LABEL);
+ gtk_combo_box_set_active(GTK_COMBO_BOX(window->templateMonitorConfigurationResolutionCombo),0);
+ if (((monitorconfig*)window->config->data)->show_usupported==1){
+ yon_gtk_combo_box_fill(window->templateMonitorConfigurationResolutionCombo,videoconfig.resolutions,videoconfig.resolutionssize);
+ } else {
+ yon_gtk_combo_box_fill(window->templateMonitorConfigurationResolutionCombo,((monitorconfig*)window->config->data)->resolutionCapabilities,((monitorconfig*)window->config->data)->resolution_size);
+
+ }
+}
+
+char *yon_configuration_get_remove_command(char *command){
+ char *str = NULL;
+ char *dntus = NULL;
+ dntus=_("Don't use");
+ str=yon_char_new(command);
+ str = yon_char_get_augumented(str, " FAILSAFENVIDIA");
+ str = yon_char_get_augumented(str, " FAILSAFATI");
+ str = yon_char_get_augumented(str, " OPTIRUN");
+ str = yon_char_get_augumented(str, " PRIMUSRUN");
+ dictionary *dict=NULL;
+ for_dictionaries(dict,videoconfig.monitors){
+ str = yon_char_get_augumented(str, yon_char_get_augumented(" XORG_MONITOR[", yon_char_get_augumented(dict->key, "]")));
+ }
+ if (strcmp(str,command)!=0)
+ return str;
+ else return NULL;
+}
+
+void on_configuration_save_local(GtkWidget *self, widgets_dict *widgets)
+{
+ yon_update_config(widgets);
+ char *str=NULL;
+ char *delstr=NULL;
+ str=yon_configuration_get_save_command(save_drivers_local_command);
+ delstr=yon_configuration_get_remove_command(remove_drivers_local_command);
+ if (delstr){
+ yon_config_save(delstr);
+ }
+ if (str){
+ printf(str);
+ yon_config_save(str);
+ yon_ubl_status_box_render(widgets->mainStatusBox, widgets->mainStatusIcon, widgets->mainStatusLabel, _("Local configuration saving succseeded."), BACKGROUND_IMAGE_SUCCESS_TYPE);
+ }
+ // else
+ // yon_ubl_status_box_render(widgets->mainStatusBox, widgets->mainStatusIcon, widgets->mainStatusLabel, _("Local configuration saving failed."), BACKGROUND_IMAGE_FAIL_TYPE);
+}
+
+void on_configuration_save_local_global(GtkWidget *self, widgets_dict *widgets)
+{
+ on_configuration_save_global(self, widgets);
+ on_configuration_save_local(self, widgets);
+ yon_ubl_status_box_render(widgets->mainStatusBox, widgets->mainStatusIcon, widgets->mainStatusLabel, _("Local and global configuration saving succseeded."), BACKGROUND_IMAGE_SUCCESS_TYPE);
+}
+
+void on_configuration_save_global(GtkWidget *self, widgets_dict *widgets)
+{
+ yon_ubl_status_box_render(widgets->mainStatusBox, widgets->mainStatusIcon, widgets->mainStatusLabel, _("Global configuration saving succseeded."), BACKGROUND_IMAGE_SUCCESS_TYPE);
+ yon_update_config(widgets);
+ char *str = NULL;
+ if (videoconfig.failsafenVidia)
+ str = yon_char_get_augumented(save_drivers_global_command, yon_char_get_augumented(" ", videoconfig.failsafenVidia));
+ if (videoconfig.failsafeATI)
+ str = yon_char_get_augumented(str, yon_char_get_augumented(" ", videoconfig.failsafeATI));
+ if (videoconfig.optirun)
+ str = yon_char_get_augumented(str, yon_char_get_augumented(" ", videoconfig.optirun));
+ if (videoconfig.primusrun)
+ str = yon_char_get_augumented(str, yon_char_get_augumented(" ", videoconfig.primusrun));
+ printf(str);
+ yon_config_save(str);
+}
+
+void yon_update_config(widgets_dict *widgets)
+{
+ videoconfig.optirun = yon_char_new( (char *)gtk_entry_get_text(GTK_ENTRY(widgets->mainExtraLaunchOptirunEntry)));
+ videoconfig.primusrun = yon_char_new( (char *)gtk_entry_get_text(GTK_ENTRY(widgets->mainExtraLaunchPrismusunEntry)));
+ videoconfig.failsafenVidia = yon_char_new( gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(widgets->mainDriverFailsafeNvidiaCombo)));
+ videoconfig.failsafeATI = yon_char_new( gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(widgets->mainDriverFailsafeAMDCombo)));
+}
+
+void on_configuration_load_local(GtkWidget *self, widgets_dict *widgets)
+{
+ yon_ubl_status_box_render(widgets->mainStatusBox, widgets->mainStatusIcon, widgets->mainStatusLabel, _("Local configuration loading succseeded."), BACKGROUND_IMAGE_SUCCESS_TYPE);
+ char *command = load_drivers_local_command;
+ dictionary *dct;
+ for_dictionaries(dct, videoconfig.monitors)
+ {
+ command = yon_char_get_augumented(command, (yon_char_get_augumented(" XORG_MONITOR[", yon_char_get_augumented(((monitorconfig *)dct->data)->port, "]"))));
+ }
+ int size = 0;
+ char **rtn = yon_ubl_load_global_config(command, &size);
+ char *param = NULL;
+ // yon_config_init(rtn, size);
+ on_config_fill_interface(widgets);
+}
+
+void on_configuration_load_global(GtkWidget *self, widgets_dict *widgets)
+{
+ yon_ubl_status_box_render(widgets->mainStatusBox, widgets->mainStatusIcon, widgets->mainStatusLabel, _("Global configuration loading succseeded."), BACKGROUND_IMAGE_SUCCESS_TYPE);
+ char *command = load_drivers_global_command;
+ dictionary *dct;
+ for_dictionaries(dct, videoconfig.monitors)
+ {
+ command = yon_char_get_augumented(command, (yon_char_get_augumented(" XORG_MONITOR[", yon_char_get_augumented(((monitorconfig *)dct->data)->port, "]"))));
+ }
+ int size = 0;
+ char **rtn = yon_ubl_load_global_config(command, &size);
+ char *param = NULL;
+ // yon_config_init(rtn, size);
+ on_config_fill_interface(widgets);
+}
+
+/**void on_monitor_delete(GtkWidget *self,monitor_view windowd)
+ * [EN]
+*/
+void on_monitor_delete(GtkWidget *self,monitor_view windowd){
+ monitor_window *window = yon_dictionary_get_data(windowd,monitor_window*);
+ if(window&&window->config){
+ gtk_container_remove(GTK_CONTAINER(gtk_widget_get_parent(window->templateMonitorscreenOverlay)),window->templateMonitorscreenOverlay);
+ yon_dictionary_rip(windowd);
+ gtk_widget_destroy(window->templateMonitorscreenOverlay);
+ yon_dictionary_rip(window->config);
+ free(window);
+ }
+}
+
+/**void on_monitor_switch(GtkWidget *self,monitor_window *window)
+ * [EN]
+*/
+void on_monitor_switch(GtkWidget *self,monitor_window *window){
+ if(window&&window->config){
+ int *enable = &yon_dictionary_get_data(window->config,monitorconfig*)->enable;
+ *enable=!*enable;
+ gtk_widget_set_sensitive(window->templateMonitorImage,*enable);
+ }
+}
+
+/**void on_monitor_add(GtkWidget *self,monitor_window *window)
+ * [EN]
+*/
+void on_monitor_add(GtkWidget *self,monitor_window *window){
+ if(window){
+ videoconfig.monitors = yon_monitor_config_new(PARAMETER_DEFAULT_LABEL);
+ yon_monitor_view_new(videoconfig.monitors);
+ yon_monitor_view_draw_all(NULL);
+ }
+}
+
+void on_monitor_configure(GtkWidget *self,monitor_window *window){
+ if(window&&window->config){
+ monitor_edit_window *monitors = new(monitor_edit_window);
+ GtkBuilder *builder = gtk_builder_new_from_file(glade_path);
+ monitors->templateMonitorConfigurationWindow = GTK_WIDGET(gtk_builder_get_object(builder, "templateMonitorConfigurationWindow"));
+ monitors->mainMonitorConfigurationBox = GTK_WIDGET(gtk_builder_get_object(builder, "mainMonitorConfigurationBox"));
+ monitors->templateMonitorConfigurationBox = GTK_WIDGET(gtk_builder_get_object(builder, "templateMonitorConfigurationBox"));
+ monitors->templateMonitorConfigurationEnableCheck = GTK_WIDGET(gtk_builder_get_object(builder, "templateMonitorConfigurationEnableCheck"));
+ monitors->templateMonitorConfigurationPortLabel = GTK_WIDGET(gtk_builder_get_object(builder, "templateMonitorConfigurationPortLabel"));
+ monitors->templateMonitorConfigurationPortCombo = GTK_WIDGET(gtk_builder_get_object(builder, "templateMonitorConfigurationPortCombo"));
+ monitors->templateMonitorConfigurationMainCheck = GTK_WIDGET(gtk_builder_get_object(builder, "templateMonitorConfigurationMainCheck"));
+ monitors->templateMonitorConfigurationResolutionLabel = GTK_WIDGET(gtk_builder_get_object(builder, "templateMonitorConfigurationResolutionLabel"));
+ monitors->templateMonitorConfigurationResolutionCombo = GTK_WIDGET(gtk_builder_get_object(builder, "templateMonitorConfigurationResolutionCombo"));
+ monitors->templateMonitorConfigurationShowUnsupportedCheck = GTK_WIDGET(gtk_builder_get_object(builder, "templateMonitorConfigurationShowUnsupportedCheck"));
+ monitors->templateMonitorConfigurationFrequencyLabel = GTK_WIDGET(gtk_builder_get_object(builder, "templateMonitorConfigurationFrequencyLabel"));
+ monitors->templateMonitorConfigurationFrequencyCombo = GTK_WIDGET(gtk_builder_get_object(builder, "templateMonitorConfigurationFrequencyCombo"));
+ monitors->templateMonitorConfigurationRotationLabel = GTK_WIDGET(gtk_builder_get_object(builder, "templateMonitorConfigurationRotationLabel"));
+ // monitors->templateMonitorConfigurationDoNotSwitchOffLabel = GTK_WIDGET(gtk_builder_get_object(builder, "templateMonitorConfigurationDoNotSwitchOffLabel"));
+ monitors->templateMonitorConfigurationRotationCombo = GTK_WIDGET(gtk_builder_get_object(builder, "templateMonitorConfigurationRotationCombo"));
+ monitors->templateMonitorConfigurationPositionLabel = GTK_WIDGET(gtk_builder_get_object(builder, "templateMonitorConfigurationPositionLabel"));
+ monitors->templateMonitorConfigurationPositionPosCombo = GTK_WIDGET(gtk_builder_get_object(builder, "templateMonitorConfigurationPositionPosCombo"));
+ monitors->templateMonitorConfigurationPositionPortCombo = GTK_WIDGET(gtk_builder_get_object(builder, "templateMonitorConfigurationPositionPortCombo"));
+
+ monitors->templateMonitorConfigurationModelineCVTCheck = GTK_WIDGET(gtk_builder_get_object(builder, "templateMonitorConfigurationModelineCVTCheck"));
+ monitors->templateMonitorConfigurationUseCVTReducedCheck = GTK_WIDGET(gtk_builder_get_object(builder, "templateMonitorConfigurationUseCVTReducedCheck"));
+ monitors->templateMonitorConfigurationModelineGTFCheck = GTK_WIDGET(gtk_builder_get_object(builder, "templateMonitorConfigurationModelineGTFCheck"));
+ monitors->templateMonitorConfigurationParameterLineCheck = GTK_WIDGET(gtk_builder_get_object(builder, "templateMonitorConfigurationParameterLineCheck"));
+ monitors->templateMonitorConfigurationParameterLineEntry = GTK_WIDGET(gtk_builder_get_object(builder, "templateMonitorConfigurationParameterLineEntry"));
+ monitors->templateMonitorConfigurationCancelButton = GTK_WIDGET(gtk_builder_get_object(builder, "templateMonitorConfigurationCancelButton"));
+ monitors->templateMonitorConfigurationSaveButton = GTK_WIDGET(gtk_builder_get_object(builder, "templateMonitorConfigurationSaveButton"));
+ monitors->templateMonitorConfigurationDoNotSwitchOffCheck = GTK_WIDGET(gtk_builder_get_object(builder, "templateMonitorConfigurationDoNotSwitchOffCheck"));
+ monitors->config=window->config;
+
+ g_signal_connect(G_OBJECT(monitors->templateMonitorConfigurationCancelButton), "clicked", G_CALLBACK(on_subwindow_close), NULL);
+ g_signal_connect(G_OBJECT(monitors->templateMonitorConfigurationSaveButton), "clicked", G_CALLBACK(on_monitor_config_save), monitors);
+ g_signal_connect(G_OBJECT(monitors->templateMonitorConfigurationParameterLineCheck), "toggled", G_CALLBACK(on_sensitive_change_reversed), monitors->templateMonitorConfigurationBox);
+ g_signal_connect(G_OBJECT(monitors->templateMonitorConfigurationParameterLineCheck), "toggled", G_CALLBACK(on_sensitive_change), monitors->templateMonitorConfigurationParameterLineEntry);
+ g_signal_connect(G_OBJECT(monitors->templateMonitorConfigurationShowUnsupportedCheck), "toggled", G_CALLBACK(on_resolutions_unsupported_show),monitors);
+ g_signal_connect(G_OBJECT(monitors->templateMonitorConfigurationPortCombo), "changed", G_CALLBACK(on_port_chosen_changed),monitors);
+
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(monitors->templateMonitorConfigurationEnableCheck),yon_dictionary_get_data(monitors->config,monitorconfig*)->enable==1);
+
+ gtk_window_set_title(GTK_WINDOW(monitors->templateMonitorConfigurationWindow),SETTINGS_VIDEO_TITLE_LABEL);
+
+ gtk_label_set_text(GTK_LABEL(monitors->templateMonitorConfigurationPortLabel),MONITOR_PORT_LABEL);
+ gtk_label_set_text(GTK_LABEL(monitors->templateMonitorConfigurationResolutionLabel),MONITOR_RESOLUTION_LABEL);
+ gtk_label_set_text(GTK_LABEL(monitors->templateMonitorConfigurationFrequencyLabel),MONITOR_FREQUENCY_LABEL);
+ gtk_label_set_text(GTK_LABEL(monitors->templateMonitorConfigurationRotationLabel),MONITOR_ROTATION_LABEL);
+ gtk_label_set_text(GTK_LABEL(monitors->templateMonitorConfigurationPositionLabel),MONITOR_POSITION_LABEL);
+
+ gtk_button_set_label(GTK_BUTTON(monitors->templateMonitorConfigurationEnableCheck),MONITOR_ENABLED_LABEL);
+ gtk_button_set_label(GTK_BUTTON(monitors->templateMonitorConfigurationMainCheck),MONITOR_MAIN_DISPLAY_LABEL);
+ gtk_button_set_label(GTK_BUTTON(monitors->templateMonitorConfigurationShowUnsupportedCheck),MONITOR_UNSUPPORTED_LABEL);
+ gtk_button_set_label(GTK_BUTTON(monitors->templateMonitorConfigurationDoNotSwitchOffCheck),MONITOR_SWITCH_OFF_LABEL);
+ gtk_button_set_label(GTK_BUTTON(monitors->templateMonitorConfigurationModelineCVTCheck),MONITOR_CVT_LABEL);
+ gtk_button_set_label(GTK_BUTTON(monitors->templateMonitorConfigurationUseCVTReducedCheck),MONITOR_REDUCED_LABEL);
+ gtk_button_set_label(GTK_BUTTON(monitors->templateMonitorConfigurationModelineGTFCheck),MONITOR_GTF_LABEL);
+ gtk_button_set_label(GTK_BUTTON(monitors->templateMonitorConfigurationParameterLineCheck),MONITOR_MANUALLY_LABEL);
+ gtk_button_set_label(GTK_BUTTON(monitors->templateMonitorConfigurationCancelButton),MONITOR_CANCEL_LABEL);
+ gtk_button_set_label(GTK_BUTTON(monitors->templateMonitorConfigurationSaveButton),MONITOR_SAVE_LABEL);
+
+ gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(monitors->templateMonitorConfigurationPortCombo),MONITOR_CHOOSE_PORT_LABEL);
+ dictionary *dict=NULL;
+ for (int i=0;istringparameters)
+ gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(monitors->templateMonitorConfigurationPortCombo),videoconfig.ports[i]);
+
+ }
+ gtk_combo_box_set_active(GTK_COMBO_BOX(monitors->templateMonitorConfigurationPortCombo),0);
+ gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(monitors->templateMonitorConfigurationResolutionCombo),PARAMETER_DEFAULT_LABEL);
+ gtk_combo_box_set_active(GTK_COMBO_BOX(monitors->templateMonitorConfigurationResolutionCombo),0);
+ gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(monitors->templateMonitorConfigurationFrequencyCombo),PARAMETER_DEFAULT_LABEL);
+ gtk_combo_box_set_active(GTK_COMBO_BOX(monitors->templateMonitorConfigurationFrequencyCombo),0);
+ gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(monitors->templateMonitorConfigurationRotationCombo),MONITOR_NO_ROTATION_LABEL);
+ gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(monitors->templateMonitorConfigurationRotationCombo),MONITOR_LEFT_LABEL);
+ gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(monitors->templateMonitorConfigurationRotationCombo),MONITOR_RIGHT_LABEL);
+ gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(monitors->templateMonitorConfigurationRotationCombo),MONITOR_INVERTED_LABEL);
+ gtk_combo_box_set_active(GTK_COMBO_BOX(monitors->templateMonitorConfigurationRotationCombo),0);
+ gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(monitors->templateMonitorConfigurationPositionPosCombo),PARAMETER_DEFAULT_LABEL);
+ gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(monitors->templateMonitorConfigurationPositionPosCombo),MONITOR_LEFT_POS_LABEL);
+ gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(monitors->templateMonitorConfigurationPositionPosCombo),MONITOR_RIGHT_POS_LABEL);
+ gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(monitors->templateMonitorConfigurationPositionPosCombo),MONITOR_ABOVE_POS_LABEL);
+ gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(monitors->templateMonitorConfigurationPositionPosCombo),MONITOR_BELOW_POS_LABEL);
+ gtk_combo_box_set_active(GTK_COMBO_BOX(monitors->templateMonitorConfigurationPositionPosCombo),0);
+ gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(monitors->templateMonitorConfigurationPositionPortCombo),PARAMETER_DEFAULT_LABEL);
+ for (int i=0;itemplateMonitorConfigurationPositionPortCombo),videoconfig.ports[i]);
+ }
+ gtk_combo_box_set_active(GTK_COMBO_BOX(monitors->templateMonitorConfigurationPositionPortCombo),0);
+
+ yon_monitor_window_update(monitors);
+
+ gtk_widget_show(monitors->templateMonitorConfigurationWindow);
+ }
+}
+
+/**void on_about()
+ * [EN]
+*/
+void on_about()
+{
+ GtkBuilder *builder = gtk_builder_new_from_file(glade_path);
+ GtkWidget *window = yon_gtk_builder_get_widget(builder, "aboutWindow");
+ GtkWidget *hideButtonBox = yon_gtk_builder_get_widget(builder, "buttonBoxHide");
+ gtk_about_dialog_set_program_name(GTK_ABOUT_DIALOG(window), _("UBlinux Video Configuration"));
+ gtk_about_dialog_set_version(GTK_ABOUT_DIALOG(window), version_application);
+ gtk_about_dialog_set_website_label(GTK_ABOUT_DIALOG(window), _("Progect Home Page"));
+ gtk_about_dialog_set_comments(GTK_ABOUT_DIALOG(window), _("Videocard and monitor configuration manager"));
+ gtk_widget_set_visible(hideButtonBox, 0);
+ gtk_widget_show(window);
+}
+
+void yon_monitor_window_update(monitor_edit_window *window){
+ if (window){
+ int found = yon_gtk_combo_box_text_find(window->templateMonitorConfigurationPortCombo, window->config->key);
+ if (found==-1)
+ found=0;
+ gtk_combo_box_set_active(GTK_COMBO_BOX(window->templateMonitorConfigurationPortCombo),found);
+ gtk_combo_box_set_active(GTK_COMBO_BOX(window->templateMonitorConfigurationResolutionCombo),found);
+
+ found = yon_gtk_combo_box_text_find(window->templateMonitorConfigurationPositionPortCombo, yon_dictionary_get_data(window->config,monitorconfig*)->position_port);
+ if (found==-1)
+ found=0;
+ gtk_combo_box_set_active(GTK_COMBO_BOX(window->templateMonitorConfigurationPositionPortCombo),found);
+ gtk_combo_box_set_active(GTK_COMBO_BOX(window->templateMonitorConfigurationPositionPosCombo),yon_dictionary_get_data(window->config,monitorconfig*)->position);
+ gtk_combo_box_set_active(GTK_COMBO_BOX(window->templateMonitorConfigurationRotationCombo),yon_dictionary_get_data(window->config,monitorconfig*)->rotation);
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->templateMonitorConfigurationDoNotSwitchOffCheck),yon_dictionary_get_data(window->config,monitorconfig*)->dpms);
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->templateMonitorConfigurationMainCheck),yon_dictionary_get_data(window->config,monitorconfig*)->main);
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->templateMonitorConfigurationModelineCVTCheck),yon_dictionary_get_data(window->config,monitorconfig*)->cvt);
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->templateMonitorConfigurationUseCVTReducedCheck),yon_dictionary_get_data(window->config,monitorconfig*)->reduced);
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->templateMonitorConfigurationModelineGTFCheck),yon_dictionary_get_data(window->config,monitorconfig*)->gtf);
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->templateMonitorConfigurationEnableCheck),yon_dictionary_get_data(window->config,monitorconfig*)->enable);
+ if(yon_dictionary_get_data(window->config,monitorconfig*)->stringparameters)
+ gtk_entry_set_text(GTK_ENTRY(window->templateMonitorConfigurationParameterLineEntry),yon_dictionary_get_data(window->config,monitorconfig*)->stringparameters);
+ }
+
+}
+
+/**void yon_monitor_view_draw_all(GtkWidget *cnt)
+ * [EN]
+*/
+void yon_monitor_view_draw_all(GtkWidget *cnt){
+ monitor_view dict=NULL;
+ GtkWidget *container=NULL;
+ if(!container&&cnt) container=cnt;
+ if(videoconfig.monitor_visuals){
+ for_dictionaries(dict,videoconfig.monitor_visuals){
+ monitor_window *window = yon_dictionary_get_data(dict,monitor_window*);
+ if (!container) container = gtk_widget_get_parent(window->templateMonitorscreenOverlay);
+ if(container){
+ g_object_ref(G_OBJECT(window->templateMonitorscreenOverlay));
+ gtk_container_remove(GTK_CONTAINER(container),window->templateMonitorscreenOverlay);
+ }
+ }
+ if (container)
+ for_dictionaries(dict,videoconfig.monitor_visuals){
+ monitor_window *window = yon_dictionary_get_data(dict,monitor_window*);
+ if(dict->first==dict) {}
+ else gtk_box_pack_start(GTK_BOX(container),window->templateMonitorscreenOverlay,0,0,0);
+ }
+ monitor_window *window = yon_dictionary_get_data(videoconfig.monitor_visuals->first,monitor_window*);
+ gtk_box_pack_start(GTK_BOX(container),window->templateMonitorscreenOverlay,0,0,0);
+ }
+ yon_monitor_view_update();
+}
+
+/**void yon_monitor_view_setup(GtkWidget *container)
+ * [EN]
+*/
+void yon_monitor_view_setup(GtkWidget *container){
+ if(container){
+ monitor_config config=NULL;
+ yon_monitor_view_new(NULL);
+ if (videoconfig.monitors){
+ for_dictionaries(config,videoconfig.monitors){
+ if (yon_dictionary_get_data(config,monitorconfig*)->stringparameters)
+ yon_monitor_view_new(config);
+ }
+ }
+ yon_monitor_view_draw_all(container);
+ }
+}
+
+/**void yon_monitor_view_update()
+ * [EN]
+*/
+void yon_monitor_view_update(){
+ monitor_view dict=NULL;
+ for_dictionaries(dict,videoconfig.monitor_visuals){
+ if(dict!=videoconfig.monitor_visuals->first){
+ monitor_window *monitor = yon_dictionary_get_data(dict,monitor_window*);
+ monitorconfig *config = yon_dictionary_get_data(monitor->config,monitorconfig*);
+ if (strcmp(monitor->config->key,PARAMETER_DEFAULT_LABEL)!=0)
+ gtk_label_set_text(GTK_LABEL(monitor->templateMonitorInfoNameLabel),yon_char_get_augumented(MONITOR_LABEL,monitor->config->key));
+ else
+ gtk_label_set_text(GTK_LABEL(monitor->templateMonitorInfoNameLabel),yon_char_get_augumented(MONITOR_LABEL,""));
+ if (config->resolution)
+ gtk_label_set_text(GTK_LABEL(monitor->templateMonitorInfoResolutionLabel),config->resolution);
+ else
+ gtk_label_set_text(GTK_LABEL(monitor->templateMonitorInfoResolutionLabel),PARAMETER_DEFAULT_LABEL);
+ }
+ }
+}
+
+/**char *yon_monitor_make_string(monitorconfig* config)
+ * [EN]
+*/
+char *yon_monitor_make_string(monitorconfig* config)
+{
+ int first=1;
+ char *main="";
+ if (config->main==1){
+ main="primary";
+ first=0;
+ }
+
+ char *resolution="";
+ if(config->resolution)
+ if (first==1){
+ resolution=config->resolution;
+ first=0;
+ }else{
+ resolution=yon_char_get_augumented(",",config->resolution);
+ }
+
+ char *enable="";
+ if (config->enable==1)
+ if (first==1){
+ enable="enable";
+ first=0;
+ }else{
+ enable=",enable";
+ }
+ else
+ if (first==1){
+ enable="disable";
+ first=0;
+ }else{
+ enable=",disable";
+ }
+
+ char *position="";
+ if (config->position==1)
+ if (first==1){
+ position=yon_char_get_augumented("lo:",config->position_port);
+ first=0;
+ }else{
+ position=yon_char_get_augumented(",lo:",config->position_port);
+ }
+ else if (config->position==2)
+ if (first==1){
+ position=yon_char_get_augumented("ro:",config->position_port);
+ first=0;
+ }else{
+ position=yon_char_get_augumented(",ro:",config->position_port);
+ }
+ else if (config->position==3)
+ if (first==1){
+ position=yon_char_get_augumented("ab:",config->position_port);
+ first=0;
+ }else{
+ position=yon_char_get_augumented(",ab:",config->position_port);
+ }
+ else if (config->position==4)
+ if (first==1){
+ position=yon_char_get_augumented("be:",config->position_port);
+ first=0;
+ }else{
+ position=yon_char_get_augumented(",be:",config->position_port);
+ }
+
+ char *rotation="";
+ if (config->rotation==0)
+ if (first==1){
+ rotation="rotate:normal";
+ first=0;
+ }else{
+ rotation=",rotate:normal";
+ }
+ else if (config->rotation==1)
+ if (first==1){
+ rotation="rotate:left";
+ first=0;
+ }else{
+ rotation=",rotate:left";
+ }
+ else if (config->rotation==2)
+ if (first==1){
+ rotation="rotate:right";
+ first=0;
+ }else{
+ rotation=",rotate:right";
+ }
+ else if (config->rotation==3)
+ if (first==1){
+ rotation="rotate:invert";
+ first=0;
+ }else{
+ rotation=",rotate:invert";
+ }
+
+ char *dpms="";
+ if (config->dpms==1)
+ if (first==1){
+ dpms="dpms";
+ first=0;
+ }else{
+ dpms=",dpms";
+ }
+
+ char *cvt="";
+ if (config->cvt==1)
+ if (first==1){
+ cvt="cvt";
+ first=0;
+ }else{
+ cvt=",cvt";
+ }
+
+ char *reduced="";
+ if (config->reduced==1)
+ if (first==1){
+ reduced="reduced";
+ first=0;
+ }else{
+ reduced=",reduced";
+ }
+
+ char *gtf="";
+ if (config->gtf==1)
+ if (first==1){
+ gtf="gtf";
+ first=0;
+ }else{
+ gtf=",gtf";
+ }
+
+
+ char *frequency="";
+ if (config->frequency)
+ if (first==1){
+ frequency=config->frequency;
+ first=0;
+ }else{
+ frequency=yon_char_get_augumented(",",config->frequency);
+ }
+
+ char *stringparameters=yon_char_unite("",main,resolution,frequency,enable,position,rotation,dpms,cvt,reduced,gtf,NULL);
+ config->stringparameters=yon_char_new(stringparameters);
+}
+
+/**void on_config_fill_interface(widgets_dict *widgets)
+ * [EN]
+*/
+void on_config_fill_interface(widgets_dict *widgets)
+{
+ gtk_widget_grab_focus(widgets->mainHeaderSettingsButton);
+ char *str = videoconfig.optirun;
+ gtk_entry_set_text(GTK_ENTRY(widgets->mainExtraLaunchOptirunEntry), "");
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widgets->mainExtraLaunchOptirunCheck), 0);
+ if (str)
+ {
+ yon_char_divide_search((str = yon_char_new(videoconfig.optirun)), "=", -1);
+ gtk_entry_set_text(GTK_ENTRY(widgets->mainExtraLaunchOptirunEntry), str);
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widgets->mainExtraLaunchOptirunCheck), 1);
+ }
+ str = videoconfig.primusrun;
+ gtk_entry_set_text(GTK_ENTRY(widgets->mainExtraLaunchPrismusunEntry), "");
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widgets->mainExtraLaunchPrismusunCheck), 0);
+ if (str)
+ {
+ yon_char_divide_search((str = yon_char_new(videoconfig.primusrun)), "=", 1);
+ gtk_entry_set_text(GTK_ENTRY(widgets->mainExtraLaunchPrismusunEntry), str);
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widgets->mainExtraLaunchPrismusunCheck), 1);
+ }
+
+
+ gtk_combo_box_text_remove_all(GTK_COMBO_BOX_TEXT(widgets->mainDriverFailsafeNvidiaCombo));
+
+ str = videoconfig.failsafenVidia;
+ gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(widgets->mainDriverFailsafeNvidiaCombo), _("Don't use"));
+ gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(widgets->mainDriverFailsafeNvidiaCombo), _("fbdev"));
+ if (str)
+ {
+ gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->mainDriverFailsafeNvidiaCombo), 1);
+ }
+ else
+ gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->mainDriverFailsafeNvidiaCombo), 0);
+ gtk_combo_box_text_remove_all(GTK_COMBO_BOX_TEXT(widgets->mainDriverFailsafeAMDCombo));
+
+ str = videoconfig.failsafeATI;
+ gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(widgets->mainDriverFailsafeAMDCombo), _("Don't use"));
+ gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(widgets->mainDriverFailsafeAMDCombo), _("fbdev"));
+ if (str)
+ {
+ gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->mainDriverFailsafeAMDCombo), 1);
+ }
+ else
+ gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->mainDriverFailsafeAMDCombo), 0);
+ dictionary *dict = NULL;
+}
+
+/**dictionary *yon_proprieary_get()
+ * [EN]
+*/
+dictionary *yon_proprieary_get(){
+ int size=0;
+ char **rtn = yon_config_load(get_proprietary_drivers_command,&size);
+
+ for (int i=0;idata,&size,":");
+ gtk_list_store_append(list,&iter);
+ gtk_list_store_set(list,&iter,1,str[1],2,str[2],3,str[3],4,str[4],-1);
+ }
+}
+
+/**void yon_setup_config(char *configcommand)
+ * [EN]
+*/
+void yon_setup_config(char *configcommand)
+{
+ videoconfig.portssize=0;
+ videoconfig.ports=yon_config_load(get_ports_command,&videoconfig.portssize);
+
+ int size = 0;
+
+ char *command = configcommand;
+ dictionary *dct;
+ for(int i=0; iwindow = yon_gtk_builder_get_widget(builder, "ProprietaryDriverChooseWindow");
+
+ widgets->propriearyTreeView = yon_gtk_builder_get_widget(builder, "propriearyTreeView");
+ widgets->ProprietaryDriverColumn = GTK_TREE_VIEW_COLUMN(gtk_builder_get_object(builder, "ProprietaryDriverColumn"));
+ widgets->ProprietaryDescriptionColumn = GTK_TREE_VIEW_COLUMN(gtk_builder_get_object(builder, "ProprietaryDescriptionColumn"));
+
+ widgets->ProprietaryCloseButton = yon_gtk_builder_get_widget(builder, "ProprietaryCloseButton");
+ widgets->ProprietaryAcceptButton = yon_gtk_builder_get_widget(builder, "ProprietaryAcceptButton");
+ if(!videoconfig.list)
+ videoconfig.list = GTK_LIST_STORE(gtk_builder_get_object(builder, "liststore6"));
+ gtk_list_store_clear(videoconfig.list);
+ yon_gtk_list_store_fill_with_proprietaries(videoconfig.list);
+ gtk_button_set_label(GTK_BUTTON(widgets->ProprietaryCloseButton), _("Cancel"));
+ gtk_button_set_label(GTK_BUTTON(widgets->ProprietaryAcceptButton), _("Accept"));
+ gtk_tree_view_set_model(GTK_TREE_VIEW(widgets->propriearyTreeView),GTK_TREE_MODEL(videoconfig.list));
+ gtk_tree_view_column_set_title(GTK_TREE_VIEW_COLUMN(widgets->ProprietaryDriverColumn), _("Installed"));
+ gtk_tree_view_column_set_title(GTK_TREE_VIEW_COLUMN(widgets->ProprietaryDriverColumn), _("Package"));
+ gtk_tree_view_column_set_title(GTK_TREE_VIEW_COLUMN(widgets->ProprietaryDriverColumn), _("Supported Devices"));
+ gtk_tree_view_column_set_title(GTK_TREE_VIEW_COLUMN(widgets->ProprietaryDriverColumn), _("Driver"));
+ gtk_tree_view_column_set_title(GTK_TREE_VIEW_COLUMN(widgets->ProprietaryDescriptionColumn), _("Description"));
+ gtk_widget_show(widgets->window);
+ g_signal_connect(G_OBJECT(widgets->ProprietaryCloseButton), "clicked", G_CALLBACK(on_subwindow_close), NULL);
+ combo_tree *trcm=NULL;
+ trcm=malloc(sizeof(combo_tree));
+ trcm->combo=comboe;
+ trcm->tree=widgets->propriearyTreeView;
+ g_signal_connect(G_OBJECT(widgets->ProprietaryAcceptButton), "clicked", G_CALLBACK(on_save_driver_configuration), trcm);
+}
+
+/** monitor_config yon_monitor_config_new(char *port)
+ * [EN]
+*/
+monitor_config yon_monitor_config_new(char *port){
+ if (port){
+ monitorconfig *monitor=new(monitorconfig);
+ monitor->main=0;
+ monitor->enable=0;
+ monitor->position=0;
+ monitor->port=NULL;
+ monitor->position_port=NULL;
+ monitor->resolution=NULL;
+ monitor->resolutionCapabilities=NULL;
+ monitor->frequency=NULL;
+ monitor->rotation=0;
+ monitor->stringparameters=NULL;
+ monitor->dpms=0;
+ monitor->resolution_size=0;
+ monitor->cvt=0;
+ monitor->reduced=0;
+ monitor->gtf=0;
+ if (videoconfig.monitors)
+ videoconfig.monitors=yon_dictionary_create_with_data_connected(videoconfig.monitors,port,monitor);
+ else
+ videoconfig.monitors=yon_dictionary_create_with_data(port,monitor);
+ return videoconfig.monitors;
+ }
+}
+
+/**void yon_monitor_config_update(monitorconfig* monitor, char *port, char *config_string)
+ * [EN]
+*/
+void yon_monitor_config_update(monitorconfig* monitor, char *port, char *config_string){
+ if (port&&config_string){
+ monitor->stringparameters=yon_char_new(config_string);
+ int size=0;
+ config_str cnf = yon_char_parse(config_string,&size,",");
+ if (yon_char_parsed_check_exist(cnf,size,"primary")!=-1)
+ monitor->main=1;
+ if (yon_char_parsed_check_exist(cnf,size,"enable")!=-1)
+ monitor->enable=1;
+ if (yon_char_parsed_check_exist(cnf,size,"disable")!=-1)
+ monitor->enable=0;
+ // if (yon_char_parsed_check_exist(cnf,size,"ignore")==1)
+ // monitor->enable=0;
+ if (yon_char_parsed_check_exist(cnf,size,"LeftOf:")!=-1)
+ monitor->position=1;
+ if (yon_char_parsed_check_exist(cnf,size,"lo:")!=-1)
+ monitor->position=1;
+ if (yon_char_parsed_check_exist(cnf,size,"RightOf:")!=-1)
+ monitor->position=2;
+ if (yon_char_parsed_check_exist(cnf,size,"ro:")!=-1)
+ monitor->position=2;
+ if (yon_char_parsed_check_exist(cnf,size,"Below:")!=-1)
+ monitor->position=4;
+ if (yon_char_parsed_check_exist(cnf,size,"be:")!=-1)
+ monitor->position=4;
+ if (yon_char_parsed_check_exist(cnf,size,"Above:")!=-1)
+ monitor->position=3;
+ if (yon_char_parsed_check_exist(cnf,size,"ab:")!=-1)
+ monitor->position=3;
+ if (yon_char_parsed_check_exist(cnf,size,"rotate:")!=-1)
+ monitor->rotation=0;
+ if (yon_char_parsed_check_exist(cnf,size,"dpms")!=-1)
+ monitor->dpms=1;
+ if (yon_char_parsed_check_exist(cnf,size,"nodpms")!=-1)
+ monitor->dpms=0;
+ if (yon_char_parsed_check_exist(cnf,size,"cvt")!=-1)
+ monitor->cvt=1;
+ if (yon_char_parsed_check_exist(cnf,size,"reduced")!=-1)
+ monitor->reduced=1;
+ if (yon_char_parsed_check_exist(cnf,size,"r")!=-1)
+ monitor->reduced=1;
+ if (yon_char_parsed_check_exist(cnf,size,"gtf")!=-1)
+ monitor->gtf=1;
+ }
+}
+
+// MonitorSettings *yon_setup_monitor_settings()
+// {
+// int monitors_n = videoconfig.portssize;
+// MonitorSettings *monitors = NULL;
+// monitors = malloc(sizeof(MonitorSettings) * (monitors_n+1));
+// // videoconfig.videoconfig=videoconfig.videoconfig->first;
+// int i=0;
+// if (videoconfig.monitors){
+// for (i = 0; i < monitors_n; i++)
+// {
+// GtkBuilder *builder = gtk_builder_new_from_file(glade_path);
+// monitors[i].templateMonitorscreenOverlay = GTK_WIDGET(gtk_builder_get_object(builder, "templateMonitorscreenOverlay"));
+// monitors[i].templateMonitorInfoBox = GTK_WIDGET(gtk_builder_get_object(builder, "templateMonitorInfoBox"));
+// monitors[i].templateMonitorInfoNameLabel = GTK_WIDGET(gtk_builder_get_object(builder, "templateMonitorInfoNameLabel"));
+// monitors[i].templateMonitorImage = GTK_WIDGET(gtk_builder_get_object(builder, "templateMonitorImage"));
+// monitors[i].templateMonitorInfoResolutionLabel = GTK_WIDGET(gtk_builder_get_object(builder, "templateMonitorInfoResolutionLabel"));
+// monitors[i].templateMonitorInfoConfigureButton = GTK_WIDGET(gtk_builder_get_object(builder, "templateMonitorInfoConfigureButton"));
+// monitors[i].templateMonitorDeleteButton = GTK_WIDGET(gtk_builder_get_object(builder, "templateMonitorDeleteButton"));
+// monitors[i].templateMonitorSwitchButton = GTK_WIDGET(gtk_builder_get_object(builder, "templateMonitorSwitchButton"));
+// monitors[i].curconfig = yon_dictionary_get_nth(videoconfig.monitors, i);
+// printf("%d\n", i);
+// if (yon_dictionary_get_data(monitors[i].curconfig,monitorconfig*)->main==0)
+// gtk_label_set_text(GTK_LABEL(monitors[i].templateMonitorInfoNameLabel), yon_char_get_augumented("Monitor ", ((monitorconfig *)monitors[i].curconfig->data)->port));
+// if (yon_dictionary_get_data(monitors[i].curconfig,monitorconfig*)->main==1)
+// gtk_label_set_text(GTK_LABEL(monitors[i].templateMonitorInfoNameLabel), yon_char_get_augumented("Monitor ", yon_char_get_augumented(((monitorconfig *)monitors[i].curconfig->data)->port,"*")));
+// char *res = yon_char_get_augumented(((monitorconfig *)monitors[i].curconfig->data)->resolution, "");
+// if (yon_dictionary_get_data(monitors[i].curconfig,monitorconfig*)->enable==1)
+// gtk_widget_set_sensitive(monitors[i].templateMonitorImage,1);
+// if (!res)
+// res = _("Default settings");
+// gtk_label_set_text(GTK_LABEL(monitors[i].templateMonitorInfoResolutionLabel), res);
+// gtk_overlay_add_overlay(GTK_OVERLAY(monitors[i].templateMonitorscreenOverlay), monitors[i].templateMonitorInfoBox);
+// g_signal_connect(G_OBJECT(monitors[i].templateMonitorInfoConfigureButton), "clicked", G_CALLBACK(on_confugure_monitor_settings), &monitors[i]);
+// g_signal_connect(G_OBJECT(monitors[i].templateMonitorDeleteButton), "clicked", G_CALLBACK(on_confugure_monitor_settings), &monitors[i]);
+// g_signal_connect(G_OBJECT(monitors[i].templateMonitorSwitchButton), "clicked", G_CALLBACK(on_confugure_monitor_settings), &monitors[i]);
+// if (i==0)
+// videoconfig.videoconfig = yon_dictionary_create_with_data(((monitorconfig *)monitors[i].curconfig->data)->port,&monitors[i]);
+// else
+// videoconfig.videoconfig = yon_dictionary_create_with_data_connected(videoconfig.videoconfig,((monitorconfig *)monitors[i].curconfig->data)->port,&monitors[i]);
+// if (videoconfig.monitors->next)
+// videoconfig.monitors = videoconfig.monitors->next;
+// }
+// }
+// GtkBuilder *builder = gtk_builder_new_from_file(glade_path);
+// monitors[i].templateMonitorscreenOverlay = GTK_WIDGET(gtk_builder_get_object(builder, "templateMonitorscreenOverlay"));
+// monitors[i].templateMonitorInfoBox = GTK_WIDGET(gtk_builder_get_object(builder, "templateMonitorInfoBox"));
+// monitors[i].templateMonitorInfoNameLabel = GTK_WIDGET(gtk_builder_get_object(builder, "templateMonitorInfoNameLabel"));
+// monitors[i].templateMonitorImage = GTK_WIDGET(gtk_builder_get_object(builder, "templateMonitorImage"));
+// monitors[i].templateMonitorInfoResolutionLabel = GTK_WIDGET(gtk_builder_get_object(builder, "templateMonitorInfoResolutionLabel"));
+// monitors[i].templateMonitorInfoConfigureButton = GTK_WIDGET(gtk_builder_get_object(builder, "templateMonitorInfoConfigureButton"));
+// monitors[i].templateMonitorDeleteButton = GTK_WIDGET(gtk_builder_get_object(builder, "templateMonitorDeleteButton"));
+// monitors[i].templateMonitorSwitchButton = GTK_WIDGET(gtk_builder_get_object(builder, "templateMonitorSwitchButton"));
+// monitors[i].templateMonitorInfoAddButton = GTK_WIDGET(gtk_builder_get_object(builder, "templateMonitorInfoAddButton"));
+// gtk_widget_show(monitors[i].templateMonitorInfoAddButton);
+// gtk_widget_hide(monitors[i].templateMonitorSwitchButton);
+// gtk_widget_hide(monitors[i].templateMonitorDeleteButton);
+// gtk_widget_hide(monitors[i].templateMonitorInfoConfigureButton);
+// monitors[i].curconfig = NULL;
+// gtk_label_set_text(GTK_LABEL(monitors[i].templateMonitorInfoNameLabel), "");
+// gtk_widget_set_sensitive(monitors[i].templateMonitorImage,0);
+// gtk_label_set_text(GTK_LABEL(monitors[i].templateMonitorInfoResolutionLabel), "");
+// gtk_overlay_add_overlay(GTK_OVERLAY(monitors[i].templateMonitorscreenOverlay), monitors[i].templateMonitorInfoBox);
+// g_signal_connect(G_OBJECT(monitors[i].templateMonitorInfoAddButton), "clicked", G_CALLBACK(on_confugure_monitor_settings), &monitors[i]);
+// if (i==0)
+// videoconfig.videoconfig = yon_dictionary_create_with_data("TEMPLATE",&monitors[i]);
+// else
+// videoconfig.videoconfig = yon_dictionary_create_with_data_connected(videoconfig.videoconfig,"TEMPLATE",&monitors[i]);
+// return monitors;
+// }
+
+int yon_char_get_if_resolution(char *parsed_string){
+ char *left=NULL, *right=NULL;
+ right=yon_char_new(parsed_string);
+ left=yon_char_divide_search(right,"x",1);
+ if (left&&right)
+ if (atoi(left)&&atoi(right))
+ return 1;
+ return 0;
+}
+
+void yon_monitor_view_new(monitor_config monitor){
+ GtkBuilder *builder = gtk_builder_new_from_file(glade_path);
+ monitor_window *window = new(monitor_window);
+ window->templateMonitorscreenOverlay=yon_gtk_builder_get_widget(builder,"templateMonitorscreenOverlay");
+ window->templateMonitorImage=yon_gtk_builder_get_widget(builder,"templateMonitorImage");
+ window->templateMonitorInfoBox=yon_gtk_builder_get_widget(builder,"templateMonitorInfoBox");
+ window->templateMonitorInfoNameLabel=yon_gtk_builder_get_widget(builder,"templateMonitorInfoNameLabel");
+ window->templateMonitorInfoResolutionLabel=yon_gtk_builder_get_widget(builder,"templateMonitorInfoResolutionLabel");
+ window->templateMonitorDeleteButton=yon_gtk_builder_get_widget(builder,"templateMonitorDeleteButton");
+ window->templateMonitorSwitchButton=yon_gtk_builder_get_widget(builder,"templateMonitorSwitchButton");
+ window->templateMonitorInfoConfigureButton=yon_gtk_builder_get_widget(builder,"templateMonitorInfoConfigureButton");
+ window->templateMonitorInfoAddButton=yon_gtk_builder_get_widget(builder,"templateMonitorInfoAddButton");
+ window->config=NULL;
+ gtk_overlay_add_overlay(GTK_OVERLAY(window->templateMonitorscreenOverlay),window->templateMonitorInfoBox);
+ if (monitor){
+ window->config=monitor;
+ gtk_widget_hide(window->templateMonitorInfoAddButton);
+ g_signal_connect(G_OBJECT(window->templateMonitorInfoConfigureButton), "clicked", G_CALLBACK(on_monitor_configure), window);
+ if (videoconfig.monitor_visuals) videoconfig.monitor_visuals = yon_dictionary_create_with_data_connected(videoconfig.monitor_visuals, window->config->key,window);
+ else videoconfig.monitor_visuals = yon_dictionary_create_with_data(window->config->key,window);
+
+ g_signal_connect(G_OBJECT(window->templateMonitorDeleteButton), "clicked", G_CALLBACK(on_monitor_delete), videoconfig.monitor_visuals);
+ g_signal_connect(G_OBJECT(window->templateMonitorSwitchButton), "clicked", G_CALLBACK(on_monitor_switch), window);
+ } else {
+ gtk_widget_show(window->templateMonitorInfoAddButton);
+ gtk_widget_hide(window->templateMonitorDeleteButton);
+ gtk_widget_hide(window->templateMonitorSwitchButton);
+ gtk_widget_hide(window->templateMonitorInfoConfigureButton);
+ g_signal_connect(G_OBJECT(window->templateMonitorInfoAddButton), "clicked", G_CALLBACK(on_monitor_add), window);
+ if (videoconfig.monitor_visuals) videoconfig.monitor_visuals = yon_dictionary_create_with_data_connected(videoconfig.monitor_visuals, "GENERIC",window);
+ else videoconfig.monitor_visuals = yon_dictionary_create_with_data("GENERIC",window);
+ }
+}
+
+void yon_monitor_set_resolutions(){
+ dictionary *dact=NULL;
+ int size_connected=0;
+ config_str connected_ports = yon_config_load(get_resolution_ports_command,&size_connected);
+ int resolutions_size=0;
+ config_str resolutions = yon_config_load(get_resolutions_command,&resolutions_size);
+ for (int i=0;iline=resol;
+ supported->size=0;
+ yon_dictionary_add_or_create_if_exists_with_data(videoconfig.supported_resolutions,connected_ports[i],supported);
+ }
+ config_str final=NULL;
+ for(int i=0;idata)){
+ equals=1;
+ port_for_res=NULL;
+ }
+ if (cur_pos>*((int*)dct->data)&&equals==0)
+ port_for_res=yon_char_new(dct->key);
+ }
+ if(port_for_res){
+ dct=yon_dictionary_find(&videoconfig.supported_resolutions,port_for_res);
+ resolution_supported *sup=yon_dictionary_get_data(dct,resolution_supported*);
+ sup->size++;
+ sup->line=realloc(sup->line,sizeof(char*)*sup->size);
+ sup->line[sup->size-1]=yon_char_new(yon_char_divide_search(resolutions[i],"\n",-1));
+ }
+ }
+
+}
+
+/** void yon_setup_widgets(widgets_dict *widgets)
+ * [EN]
+ * Sets up every element on main window
+ * [RU]
+ *
+ * */
+void yon_setup_widgets(widgets_dict *widgets)
+{
+ widgets->builder = gtk_builder_new_from_file(glade_path);
+ widgets->appsPackWindow = yon_gtk_builder_get_widget(widgets->builder, "appsPackWindow");
+ widgets->appsPackBox = yon_gtk_builder_get_widget(widgets->builder, "appsPackBox");
+ widgets->MainWindow = yon_gtk_builder_get_widget(widgets->builder, "MainWindow");
+ widgets->headBox = yon_gtk_builder_get_widget(widgets->builder, "headBox");
+ widgets->headInfoLabel = yon_gtk_builder_get_widget(widgets->builder, "headInfoLabel");
+ widgets->mainPlugBox = yon_gtk_builder_get_widget(widgets->builder, "mainPlugBox");
+ widgets->mainErrorBox = yon_gtk_builder_get_widget(widgets->builder, "mainErrorBox");
+ widgets->mainHeadOverlay = yon_gtk_builder_get_widget(widgets->builder, "mainHeadOverlay");
+ widgets->extraOptirunChooseAppsButton = yon_gtk_builder_get_widget(widgets->builder, "extraOptirunChooseAppsButton");
+ widgets->extraPrimusunChooseAppsButton = yon_gtk_builder_get_widget(widgets->builder, "extraPrimusunChooseAppsButton");
+ widgets->mainHeadBackgroundImage = yon_gtk_builder_get_widget(widgets->builder, "mainHeadBackgroundImage");
+ widgets->mainDriverAutomaticallyChooseCheck = yon_gtk_builder_get_widget(widgets->builder, "mainDriverAutomaticallyChooseCheck");
+ widgets->mainDriverFailsafeNvidiaLabel = yon_gtk_builder_get_widget(widgets->builder, "mainDriverFailsafeNvidiaLabel");
+ widgets->mainDriverFailsafeAMDLabel = yon_gtk_builder_get_widget(widgets->builder, "mainDriverFailsafeAMDLabel");
+ widgets->mainExtraFixGapCombo = yon_gtk_builder_get_widget(widgets->builder, "mainExtraFixGapCombo");
+ widgets->mainDriverFailsafeNvidiaCombo = yon_gtk_builder_get_widget(widgets->builder, "mainDriverFailsafeNvidiaCombo");
+ widgets->mainDriverFailsafeAMDCombo = yon_gtk_builder_get_widget(widgets->builder, "mainDriverFailsafeAMDCombo");
+ widgets->mainDriverFrameLabel = yon_gtk_builder_get_widget(widgets->builder, "mainDriverFrameLabel");
+ widgets->monitorConfigurationMethodLabel = yon_gtk_builder_get_widget(widgets->builder, "monitorConfigurationMethodLabel");
+ widgets->monitorConfigurationMethodCombo = yon_gtk_builder_get_widget(widgets->builder, "monitorConfigurationMethodCombo");
+ widgets->mainMonitorVisualConfigurationBox = yon_gtk_builder_get_widget(widgets->builder, "mainMonitorVisualConfigurationBox");
+ widgets->mainMonitorConfigurationBox = yon_gtk_builder_get_widget(widgets->builder, "mainMonitorConfigurationBox");
+ widgets->mainMonitorConfigurationFrameLabel = yon_gtk_builder_get_widget(widgets->builder, "mainMonitorConfigurationFrameLabel");
+ widgets->mainHybridGraphicsDiscreteLabel = yon_gtk_builder_get_widget(widgets->builder, "mainHybridGraphicsDiscreteLabel");
+ widgets->mainHybridGraphicsDiscreteCheck = yon_gtk_builder_get_widget(widgets->builder, "mainHybridGraphicsDiscreteCheck");
+ widgets->mainHybridGraphicsFrameLabel = yon_gtk_builder_get_widget(widgets->builder, "mainHybridGraphicsFrameLabel");
+ widgets->mainExtraLaunchOptirunCheck = yon_gtk_builder_get_widget(widgets->builder, "mainExtraLaunchOptirunCheck");
+ widgets->mainExtraLaunchPrismusunCheck = yon_gtk_builder_get_widget(widgets->builder, "mainExtraLaunchPrismusunCheck");
+ widgets->mainExtraFixGapLabel = yon_gtk_builder_get_widget(widgets->builder, "mainExtraFixGapLabel");
+ widgets->mainExtraLaunchOptirunEntry = yon_gtk_builder_get_widget(widgets->builder, "mainExtraLaunchOptirunEntry");
+ widgets->mainExtraLaunchPrismusunEntry = yon_gtk_builder_get_widget(widgets->builder, "mainExtraLaunchPrismusunEntry");
+ widgets->mainExtraFixGapLabelCombo = yon_gtk_builder_get_widget(widgets->builder, "mainExtraFixGapLabelCombo");
+ widgets->mainExtraLaunchThroughButton = yon_gtk_builder_get_widget(widgets->builder, "mainExtraLaunchThroughButton");
+ widgets->mainExtraFrameLabel = yon_gtk_builder_get_widget(widgets->builder, "mainExtraFrameLabel");
+ widgets->mainHeaderTitleLabel = yon_gtk_builder_get_widget(widgets->builder, "mainHeaderTitleLabel");
+ widgets->mainHeaderLoadButton = yon_gtk_builder_get_widget(widgets->builder, "mainHeaderLoadButton");
+ widgets->mainHeaderConfigLoadLabel = yon_gtk_builder_get_widget(widgets->builder, "mainHeaderConfigLoadLabel");
+ widgets->mainHeaderSaveConfigurationLabel = yon_gtk_builder_get_widget(widgets->builder, "mainHeaderSaveConfigurationLabel");
+ widgets->mainHeaderSaveButton = yon_gtk_builder_get_widget(widgets->builder, "mainHeaderSaveButton");
+ widgets->mainHeaderSettingsButton = yon_gtk_builder_get_widget(widgets->builder, "mainHeaderSettingsButton");
+ widgets->mainHeaderLoadGlobalMenuItem = yon_gtk_builder_get_widget(widgets->builder, "mainHeaderLoadGlobalMenuItem");
+ widgets->mainHeaderLoadLocalMenuItem = yon_gtk_builder_get_widget(widgets->builder, "mainHeaderLoadLocalMenuItem");
+ widgets->mainHeaderSaveGlobalLocalMenuItem = yon_gtk_builder_get_widget(widgets->builder, "mainHeaderSaveGlobalLocalMenuItem");
+ widgets->mainHeaderSaveGlobalMenuItem = yon_gtk_builder_get_widget(widgets->builder, "mainHeaderSaveGlobalMenuItem");
+ widgets->mainHeaderSaveLocalMenuItem = yon_gtk_builder_get_widget(widgets->builder, "mainHeaderSaveLocalMenuItem");
+ widgets->mainHeaderSettingsDocumentationMenuItem = yon_gtk_builder_get_widget(widgets->builder, "mainHeaderSettingsDocumentationMenuItem");
+ widgets->mainHeaderSettingsAboutMenuItem = yon_gtk_builder_get_widget(widgets->builder, "mainHeaderSettingsAboutMenuItem");
+ widgets->mainStatusBox = yon_gtk_builder_get_widget(widgets->builder, "mainStatusBox");
+ widgets->mainStatusIcon = yon_gtk_builder_get_widget(widgets->builder, "mainStatusIcon");
+ widgets->mainStatusLabel = yon_gtk_builder_get_widget(widgets->builder, "mainStatusLabel");
+ widgets->templateMonitorConfigurationBox = yon_gtk_builder_get_widget(widgets->builder, "templateMonitorConfigurationBox");
+ widgets->templateMonitorConfigurationMonitorLabel = yon_gtk_builder_get_widget(widgets->builder, "templateMonitorConfigurationMonitorLabel");
+ widgets->templateMonitorConfigurationResolutionLabel = yon_gtk_builder_get_widget(widgets->builder, "templateMonitorConfigurationResolutionLabel");
+ widgets->templateMonitorConfigurationResolutionCombo = yon_gtk_builder_get_widget(widgets->builder, "templateMonitorConfigurationResolutionCombo");
+ widgets->templateMonitorConfigurationFrequencyLabel = yon_gtk_builder_get_widget(widgets->builder, "templateMonitorConfigurationFrequencyLabel");
+ widgets->templateMonitorConfigurationFrequencyCombo = yon_gtk_builder_get_widget(widgets->builder, "templateMonitorConfigurationFrequencyCombo");
+ widgets->templateMonitorConfigurationRotationLabel = yon_gtk_builder_get_widget(widgets->builder, "templateMonitorConfigurationRotationLabel");
+ widgets->templateMonitorConfigurationRotationCombo = yon_gtk_builder_get_widget(widgets->builder, "templateMonitorConfigurationRotationCombo");
+ widgets->templateMonitorConfigurationMainRadio = yon_gtk_builder_get_widget(widgets->builder, "templateMonitorConfigurationMainRadio");
+ widgets->templateMonitorConfigurationParameterLineCheck = yon_gtk_builder_get_widget(widgets->builder, "templateMonitorConfigurationParameterLineCheck");
+ widgets->templateMonitorConfigurationParameterLineEntry = yon_gtk_builder_get_widget(widgets->builder, "templateMonitorConfigurationParameterLineEntry");
+ widgets->templateMonitorConfigurationDoNotSwitchOffLabel = yon_gtk_builder_get_widget(widgets->builder, "templateMonitorConfigurationDoNotSwitchOffLabel");
+ widgets->templateMonitorConfigurationDoNotSwitchOffCheck = yon_gtk_builder_get_widget(widgets->builder, "templateMonitorConfigurationDoNotSwitchOffCheck");
+
+ videoconfig.list = GTK_LIST_STORE(gtk_builder_get_object(widgets-> builder, "liststore6"));
+
+ g_signal_connect(G_OBJECT(widgets->mainDriverAutomaticallyChooseCheck), "toggled", G_CALLBACK(on_auto_choose_drivers), widgets);
+ // g_signal_connect(G_OBJECT(widgets->mainHybridGraphicsDiscreteCheck), "toggled", G_CALLBACK(on_sensitive_change), widgets);
+ g_signal_connect(G_OBJECT(widgets->mainExtraLaunchOptirunCheck), "toggled", G_CALLBACK(on_sensitive_change), widgets->mainExtraLaunchOptirunEntry);
+ g_signal_connect(G_OBJECT(widgets->mainExtraLaunchPrismusunCheck), "toggled", G_CALLBACK(on_sensitive_change), widgets->mainExtraLaunchPrismusunEntry);
+ g_signal_connect(G_OBJECT(widgets->mainExtraLaunchOptirunCheck), "toggled", G_CALLBACK(on_sensitive_change), widgets->extraOptirunChooseAppsButton);
+ g_signal_connect(G_OBJECT(widgets->mainExtraLaunchPrismusunCheck), "toggled", G_CALLBACK(on_sensitive_change), widgets->extraPrimusunChooseAppsButton);
+
+ g_signal_connect(G_OBJECT(widgets->MainWindow), "destroy", G_CALLBACK(gtk_main_quit), NULL);
+ // g_signal_connect(G_OBJECT(widgets->extraOptirunChooseAppsButton), "clicked", G_CALLBACK(on_apps_chooser_open), widgets);
+ // g_signal_connect(G_OBJECT(widgets->extraPrimusunChooseAppsButton), "clicked", G_CALLBACK(on_apps_chooser_open), widgets);
+
+ g_signal_connect(G_OBJECT(widgets->mainHeaderSettingsAboutMenuItem), "activate", G_CALLBACK(on_about), NULL);
+ g_signal_connect(G_OBJECT(widgets->mainHeaderSettingsDocumentationMenuItem), "activate", G_CALLBACK(on_about), NULL);
+
+ g_signal_connect(G_OBJECT(widgets->mainHeaderLoadGlobalMenuItem), "activate", G_CALLBACK(on_configuration_load_global), widgets);
+ g_signal_connect(G_OBJECT(widgets->mainHeaderLoadLocalMenuItem), "activate", G_CALLBACK(on_configuration_load_local), widgets);
+
+ g_signal_connect(G_OBJECT(widgets->mainHeaderSaveGlobalLocalMenuItem), "activate", G_CALLBACK(on_configuration_save_local_global), widgets);
+ g_signal_connect(G_OBJECT(widgets->mainHeaderSaveGlobalMenuItem), "activate", G_CALLBACK(on_configuration_save_global), widgets);
+ g_signal_connect(G_OBJECT(widgets->mainHeaderSaveLocalMenuItem), "activate", G_CALLBACK(on_configuration_save_local), widgets);
+
+ gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(widgets->mainDriverFailsafeNvidiaCombo), _("Off"));
+ gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(widgets->mainDriverFailsafeNvidiaCombo), _("fbdev"));
+ gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(widgets->mainDriverFailsafeAMDCombo), _("Off"));
+ gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(widgets->mainDriverFailsafeAMDCombo), _("fbdev"));
+
+ gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(widgets->mainExtraFixGapCombo), _("1st variant. May cause perfomance drops in video games"));
+ gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(widgets->mainExtraFixGapCombo), _("2nd variant. May not work on specific video cards"));
+ gtk_label_set_text(GTK_LABEL(widgets->headInfoLabel), _("Video output configuration"));
+ gtk_label_set_text(GTK_LABEL(widgets->mainDriverFailsafeNvidiaLabel), _("Failsafe driver nVidia: "));
+ gtk_label_set_text(GTK_LABEL(widgets->mainDriverFailsafeAMDLabel), _("Failsafe driver AMD/ATI: "));
+ gtk_label_set_text(GTK_LABEL(widgets->mainDriverFrameLabel), _("Driver"));
+ // gtk_label_set_text(GTK_LABEL(widgets->monitorConfigurationMethodLabel),_("Configuration method"));
+ gtk_label_set_text(GTK_LABEL(widgets->mainMonitorConfigurationFrameLabel), _("Monitor configuration"));
+ gtk_label_set_text(GTK_LABEL(widgets->mainHybridGraphicsFrameLabel), _("Hybrid graphics"));
+ gtk_label_set_text(GTK_LABEL(widgets->mainExtraFixGapLabel), _("Fix frame gap (nVidia)"));
+ gtk_label_set_text(GTK_LABEL(widgets->mainExtraFrameLabel), _("Extra"));
+ gtk_label_set_text(GTK_LABEL(widgets->mainHeaderTitleLabel), _("UBlinux Video Configuration"));
+ gtk_label_set_text(GTK_LABEL(widgets->mainHeaderConfigLoadLabel), _("Load"));
+ gtk_label_set_text(GTK_LABEL(widgets->mainHeaderSaveConfigurationLabel), _("Save"));
+
+ gtk_button_set_label(GTK_BUTTON(widgets->mainHybridGraphicsDiscreteCheck), _("On"));
+ gtk_button_set_label(GTK_BUTTON(widgets->mainDriverAutomaticallyChooseCheck), _("Automatically choose and use driver"));
+ gtk_button_set_label(GTK_BUTTON(widgets->mainExtraLaunchOptirunCheck), _("Launch programms through optirun (nVidia): "));
+ gtk_button_set_label(GTK_BUTTON(widgets->mainExtraLaunchPrismusunCheck), _("Launch programs through primusun (nVidia): "));
+ gtk_button_set_label(GTK_BUTTON(widgets->mainHybridGraphicsDiscreteCheck), _("discrete video only (AMD/ATI)"));
+
+ gtk_menu_item_set_label(GTK_MENU_ITEM(widgets->mainHeaderLoadGlobalMenuItem), _("Load from global configuration"));
+ gtk_menu_item_set_label(GTK_MENU_ITEM(widgets->mainHeaderLoadLocalMenuItem), _("Load from local configuration"));
+ gtk_menu_item_set_label(GTK_MENU_ITEM(widgets->mainHeaderSaveGlobalLocalMenuItem), _("Save to global an local configuration"));
+ gtk_menu_item_set_label(GTK_MENU_ITEM(widgets->mainHeaderSaveGlobalMenuItem), _("Save to global configuration"));
+ gtk_menu_item_set_label(GTK_MENU_ITEM(widgets->mainHeaderSaveLocalMenuItem), _("Save to local configuration"));
+ gtk_menu_item_set_label(GTK_MENU_ITEM(widgets->mainHeaderSettingsDocumentationMenuItem), _("Documentation"));
+ gtk_menu_item_set_label(GTK_MENU_ITEM(widgets->mainHeaderSettingsAboutMenuItem), _("About"));
+ // gtk_button_set_label(GTK_BUTTON(widgets->mainExtraLaunchThroughButton),_("Change"));
+ yon_ubl_header_setup(widgets->mainHeadOverlay, widgets->headBox, widgets->mainHeadBackgroundImage, banner_path);
+ // gtk_overlay_add_overlay(GTK_OVERLAY(widgets->mainHeadOverlay),widgets->headBox);
+ yon_monitor_view_setup(widgets->mainMonitorVisualConfigurationBox);
+ yon_monitor_view_update();
+
+ videoconfig.status_render.icon=widgets->mainStatusIcon;
+ videoconfig.status_render.label=widgets->mainStatusLabel;
+ videoconfig.status_render.box=widgets->mainStatusBox;
+ // gtk_image_set_from_file(GTK_IMAGE(widgets->mainHeadBackgroundImage),banner_path);
+ // MonitorSettings *monitors = yon_setup_monitor_settings();
+ // videoconfig.monitors=yon_dictionary_pack_monitors(monitors,yon_check_for_monitors());
+ // widgets->overlays = yon_dictionary_pack_overlays(monitors);
+ // yon_dictionary_gtk_pack_start_multiple_widgets(widgets->overlays, widgets->mainMonitorVisualConfigurationBox, 0, 0, 0);
+ // yon_dictionary_gtk_pack_start_multiple_widgets(widgets->monitors,widgets->mainMonitorConfigurationBox,0,0,0);
+}
+
+int main(int argc, char *argv[])
+{
+
+ local = setlocale(LC_ALL, "");
+ textdomain(LocaleName);
+ gtk_init(&argc, &argv);
+
+ GError error;
+ yon_setup_config(load_drivers_local_command);
+ widgets_dict widgets;
+ yon_setup_widgets(&widgets);
+ yon_gtk_list_store_fill_with_proprietaries(videoconfig.list);
+ gtk_widget_show(widgets.MainWindow);
+ // yon_fill_ui(&widgets);
+ yon_ubl_status_box_render(widgets.mainStatusBox, widgets.mainStatusIcon, widgets.mainStatusLabel, _("Configuration has been loaded"), BACKGROUND_IMAGE_SUCCESS_TYPE);
+ on_config_fill_interface(&widgets);
+ yon_monitor_set_resolutions();
+ GtkCssProvider *css = gtk_css_provider_new();
+ gtk_css_provider_load_from_path(css, CssPath, NULL);
+ gtk_style_context_add_provider_for_screen(gdk_screen_get_default(),
+ GTK_STYLE_PROVIDER(css),
+ -1);
+ gtk_main();
+ return 0;
+}
\ No newline at end of file
diff --git a/source/ubl-settings-video.h b/source/ubl-settings-video.h
new file mode 100644
index 0000000..f286018
--- /dev/null
+++ b/source/ubl-settings-video.h
@@ -0,0 +1,311 @@
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include "ubl-utils.h"
+#include "ubl-settings-video-strings.h"
+#ifndef UBL_SETINGS_VIDEO_H
+#define UBL_SETINGS_VIDEO_H
+
+#define icon_name "com.ublinux.ubl-settings-video"
+
+#define banner_path "/usr/share/ubl-settings-video/images/ubl-settings-video-banner.png"
+
+#define glade_path "/usr/share/ubl-settings-video/ui/ubl-settings-video.glade"
+#define LocalePath "/usr/share/locale"
+#define LocaleName "ubl-settings-video"
+#define CssPath "/usr/share/ubl-settings-video/css/ubl-settings-video.css"
+#define StatusLoadGlobalFailed _("Failed to load global configuration")
+#define StatusLoadLocalFailed _("Failed to load local configuration")
+
+#define StatusSaveGlobalFailed _("Saving to global configuration Succeeded")
+#define StatusSaveLocalFailed _("Saving to local configuration Succeeded")
+
+#define get_ports_command "xrandr |grep -E \"*connected\" |cut -d' ' -f1"
+
+#define get_resolutions_command "xrandr |grep -noP \"\\d+x+\\d+\""
+#define get_resolution_ports_command "xrandr |grep -nwP \"connected\" |grep -oE \"[0-9a-zA-Z:]{1,10} connected\" |grep -oE \"[0-9a-zA-Z:]{1,10} \""
+
+#define get_proprietary_drivers_command "cut -d, -f1- /usr/share/ubl-settings-video/csv/video-drivers.csv | grep -E \"-\""
+
+#define get_resolutions_supportable_command "cut -d, -f1- /usr/share/ubl-settings-video/csv/resolutions.csv |sed 's/,/ /g'"
+
+#define get_frequences_command "xrandr |grep -v -n \"[a-z][a-z]\" |sed 's/ * / /g' |cut -d' ' -f1,3-"
+
+#define load_drivers_command "/usr/bin/ubconfig --default --source "
+
+#define load_drivers_global_command "/usr/bin/ubconfig --default --source global get video FAILSAFENVIDIA FAILSAFEATI OPTIRUN PRIMUSRUN "
+
+#define save_drivers_global_command "/usr/bin/ubconfig --target global set video "
+
+#define load_drivers_local_command "/usr/bin/ubconfig --default --source system get video FAILSAFENVIDIA FAILSAFEATI OPTIRUN PRIMUSRUN "
+
+#define save_drivers_local_command "pkexec /usr/bin/ubconfig --target system set video "
+
+#define remove_drivers_global_command "/usr/bin/ubconfig --target system remove video "
+
+#define remove_drivers_local_command "/usr/bin/ubconfig --target global remove video "
+
+#define install_proprietary_command "pkexec pacman -Sy --noconfirm "
+
+#define delete_proprietary_command "pkexec pacman -R --noconfirm "
+
+#define get_info_proprietary_command "pamac-manager --details="
+
+#define get_version_proprietary_command "grep \"VERSION_ID=\" /etc/os-release | cut -d= -f2"
+
+#define XORG_MONITOR(port) yon_char_get_augumented(" XORG_MONITOR[",yon_char_get_augumented(port,"] "))
+
+
+char *local;
+
+typedef char *string;
+
+string version_application = "1.0";
+
+#define _(String) gettext(String)
+
+typedef dictionary* monitor_config;
+typedef dictionary* proprietary_config;
+typedef dictionary* monitor_view;
+
+
+
+
+typedef struct {
+ config_str line;
+ int size;
+} resolution_supported;
+
+typedef struct
+{
+ config_str loaded_config;
+ int configsize;
+ int autoChooseDrivers;
+ monitor_view monitor_visuals;
+ monitor_config monitors;
+ proprietary_config proprietary;
+ dictionary *supported_resolutions;
+ GtkListStore *list;
+ char *failsafenVidia;
+ char *failsafeATI;
+ int descreteOnly;
+ char *optirun;
+ char *primusrun;
+ int gapfix;
+ config_str ports;
+ int portssize;
+ config_str resolutions;
+ int resolutionssize;
+ render_data status_render;
+} config;
+
+typedef struct
+{
+ int main;
+ int enable;
+ int position;
+ char *position_port;
+ char *port;
+ char *resolution;
+ config_str resolutionCapabilities;
+ char *frequency;
+ int rotation;
+ char *stringparameters;
+ int dpms;
+ int resolution_size;
+ int cvt;
+ int reduced;
+ int gtf;
+ int show_usupported;
+} monitorconfig;
+
+typedef struct {
+ GtkWidget *combo;
+ GtkWidget *tree;
+} combo_tree;
+
+typedef struct
+{
+ dictionary *monitors;
+ dictionary *overlays;
+ GtkBuilder *builder;
+ GtkWidget *appsPackBox;
+ GtkWidget *appsPackWindow;
+ GtkWidget *extraOptirunChooseAppsButton;
+ GtkWidget *extraPrimusunChooseAppsButton;
+ GtkWidget *MainWindow;
+ GtkWidget *headBox;
+ GtkWidget *headInfoLabel;
+ GtkWidget *mainPlugBox;
+ GtkWidget *mainErrorBox;
+ GtkWidget *mainHeadOverlay;
+ GtkWidget *mainHeadBackgroundImage;
+ GtkWidget *mainDriverAutomaticallyChooseCheck;
+ GtkWidget *mainDriverProprietaryDriverLabel;
+ GtkWidget *mainDriverFailsafeNvidiaLabel;
+ GtkWidget *mainDriverFailsafeAMDLabel;
+ GtkWidget *mainDriverProprietaryDriverCombo;
+ GtkWidget *mainDriverProprietaryDriverButton;
+ GtkWidget *mainExtraFixGapCombo;
+ GtkWidget *mainDriverFailsafeNvidiaCombo;
+ GtkWidget *mainDriverFailsafeAMDCombo;
+ GtkWidget *mainDriverFrameLabel;
+ GtkWidget *monitorConfigurationMethodLabel;
+ GtkWidget *monitorConfigurationMethodCombo;
+ GtkWidget *mainMonitorVisualConfigurationBox;
+ GtkWidget *mainMonitorConfigurationBox;
+ GtkWidget *mainMonitorConfigurationFrameLabel;
+ GtkWidget *mainHybridGraphicsDiscreteLabel;
+ GtkWidget *mainHybridGraphicsDiscreteCheck;
+ GtkWidget *mainHybridGraphicsFrameLabel;
+ GtkWidget *mainExtraLaunchOptirunCheck;
+ GtkWidget *mainExtraLaunchPrismusunCheck;
+ GtkWidget *mainExtraFixGapLabel;
+ GtkWidget *mainExtraLaunchOptirunEntry;
+ GtkWidget *mainExtraLaunchPrismusunEntry;
+ GtkWidget *mainExtraLaunchThroughEntry;
+ GtkWidget *mainExtraFixGapLabelCombo;
+ GtkWidget *mainExtraLaunchThroughButton;
+ GtkWidget *mainExtraFrameLabel;
+ GtkWidget *mainHeaderTitleLabel;
+ GtkWidget *mainHeaderLoadButton;
+ GtkWidget *mainHeaderConfigLoadLabel;
+ GtkWidget *mainHeaderSaveConfigurationLabel;
+ GtkWidget *mainHeaderSaveButton;
+ GtkWidget *mainHeaderSettingsButton;
+ GtkWidget *mainHeaderLoadGlobalMenuItem;
+ GtkWidget *mainHeaderLoadLocalMenuItem;
+ GtkWidget *mainHeaderSaveGlobalLocalMenuItem;
+ GtkWidget *mainHeaderSaveGlobalMenuItem;
+ GtkWidget *mainHeaderSaveLocalMenuItem;
+ GtkWidget *mainHeaderSettingsDocumentationMenuItem;
+ GtkWidget *mainHeaderSettingsAboutMenuItem;
+ GtkWidget *mainStatusBox;
+ GtkWidget *mainStatusIcon;
+ GtkWidget *mainStatusLabel;
+ GtkWidget *templateMonitorConfigurationBox;
+ GtkWidget *templateMonitorConfigurationMonitorLabel;
+ GtkWidget *templateMonitorConfigurationResolutionLabel;
+ GtkWidget *templateMonitorConfigurationResolutionCombo;
+ GtkWidget *templateMonitorConfigurationFrequencyLabel;
+ GtkWidget *templateMonitorConfigurationFrequencyCombo;
+ GtkWidget *templateMonitorConfigurationRotationLabel;
+ GtkWidget *templateMonitorConfigurationRotationCombo;
+ GtkWidget *templateMonitorConfigurationMainRadio;
+ GtkWidget *templateMonitorConfigurationParameterLineCheck;
+ GtkWidget *templateMonitorConfigurationParameterLineEntry;
+ GtkWidget *templateMonitorConfigurationDoNotSwitchOffLabel;
+ GtkWidget *templateMonitorConfigurationDoNotSwitchOffCheck;
+
+ GtkWidget *proprietaryTreeView;
+ GtkWidget *proprietaryInfoButton;
+ GtkWidget *proprietaryDeleteButton;
+ GtkWidget *proprietaryInstallButton;
+ GtkTreeSelection *proprietaryTreeSelection;
+ GtkWidget *driversTreeView;
+ GtkWidget *driversInfoButton;
+ GtkWidget *driversDeleteButton;
+ GtkWidget *driversInstallButton;
+ GtkTreeSelection *driversTreeSelection;
+
+ GtkTreeViewColumn *proprietartInstalledColumn;
+ GtkTreeViewColumn *ProprietaryPackageColumn;
+ GtkTreeViewColumn *ProprietaryDriverColumn;
+ GtkTreeViewColumn *ProprietaryDescriptionColumn;
+ GtkTreeViewColumn *ProprietarySupportedColumn;
+
+ GtkTreeViewColumn *driverInstalledColumn;
+ GtkTreeViewColumn *driverPackageColumn;
+ GtkTreeViewColumn *driverDriverColumn;
+ GtkTreeViewColumn *driverDescriptionColumn;
+ GtkTreeViewColumn *driverSupportedColumn;
+} widgets_dict;
+
+typedef struct
+{
+ GtkWidget *templateMonitorConfigurationWindow;
+ GtkWidget *mainMonitorConfigurationBox;
+ GtkWidget *templateMonitorConfigurationBox;
+ GtkWidget *templateMonitorConfigurationEnableCheck;
+ GtkWidget *templateMonitorConfigurationPortLabel;
+ GtkWidget *templateMonitorConfigurationPortCombo;
+ GtkWidget *templateMonitorConfigurationMainCheck;
+ GtkWidget *templateMonitorConfigurationResolutionLabel;
+ GtkWidget *templateMonitorConfigurationResolutionCombo;
+ GtkWidget *templateMonitorConfigurationShowUnsupportedCheck;
+ GtkWidget *templateMonitorConfigurationFrequencyLabel;
+ GtkWidget *templateMonitorConfigurationFrequencyCombo;
+ GtkWidget *templateMonitorConfigurationRotationLabel;
+ GtkWidget *templateMonitorConfigurationRotationCombo;
+ GtkWidget *templateMonitorConfigurationPositionLabel;
+ GtkWidget *templateMonitorConfigurationPositionPosCombo;
+ GtkWidget *templateMonitorConfigurationPositionPortCombo;
+ GtkWidget *templateMonitorConfigurationDoNotSwitchOffCheck;
+ GtkWidget *templateMonitorConfigurationModelineCVTCheck;
+ GtkWidget *templateMonitorConfigurationUseCVTReducedCheck;
+ GtkWidget *templateMonitorConfigurationModelineGTFCheck;
+ GtkWidget *templateMonitorConfigurationParameterLineCheck;
+ GtkWidget *templateMonitorConfigurationParameterLineEntry;
+ GtkWidget *templateMonitorConfigurationCancelButton;
+ GtkWidget *templateMonitorConfigurationSaveButton;
+
+ dictionary *config;
+} monitor_edit_window;
+
+typedef struct {
+ GtkWidget *templateMonitorscreenOverlay;
+ GtkWidget *templateMonitorImage;
+ GtkWidget *templateMonitorInfoBox;
+ GtkWidget *templateMonitorInfoNameLabel;
+ GtkWidget *templateMonitorInfoResolutionLabel;
+ GtkWidget *templateMonitorDeleteButton;
+ GtkWidget *templateMonitorSwitchButton;
+ GtkWidget *templateMonitorInfoConfigureButton;
+ GtkWidget *templateMonitorInfoAddButton;
+ monitor_config config;
+} monitor_window;
+
+typedef struct
+{
+ GtkWidget *window;
+
+ GtkWidget *propriearyTreeView;
+ GtkTreeViewColumn *ProprietaryDriverColumn;
+ GtkTreeViewColumn *ProprietaryDescriptionColumn;
+ GtkListStore *list;
+
+ GtkWidget *ProprietaryCloseButton;
+ GtkWidget *ProprietaryAcceptButton;
+} driver_window;
+
+
+// void on_closed_configuration(GtkWidget *self, MonitorSettings *monitors);
+// void on_save_configuration(GtkWidget self, MonitorSettings *monitors);
+void yon_parse_monitor();
+void on_config_fill_interface(widgets_dict *widgets);
+void yon_update_config(widgets_dict *widgets);
+void on_configuration_save_global(GtkWidget *self, widgets_dict *widgets);
+void on_configuration_save__local_global(GtkWidget *self, widgets_dict *widgets);
+void on_configuration_save__local(GtkWidget *self, widgets_dict *widgets);
+void yon_config_monitor_string_parse(char *parameters, int *size);
+int yon_char_get_if_resolution(char *parsed_string);
+void yon_monitor_set_resolutions();
+monitor_config yon_monitor_config_new(char *port);
+void yon_monitor_config_update(monitorconfig* monitor, char *port, char *config_string);
+void yon_monitor_view_new(monitor_config monitor);
+// void on_confugure_monitor_settings(GtkWidget *self, MonitorSettings *settings);
+void yon_monitor_view_draw_all(GtkWidget *cnt);
+void on_monitor_configure(GtkWidget *self,monitor_window *window);
+void on_monitor_add(GtkWidget *self,monitor_window *window);
+void on_monitor_switch(GtkWidget *self,monitor_window *window);
+void on_monitor_delete(GtkWidget *self,monitor_view windowd);
+void yon_monitor_view_update();
+void yon_monitor_window_update(monitor_edit_window *window);
+char *yon_monitor_make_string(monitorconfig* config);
+#endif
\ No newline at end of file
diff --git a/source/ubl-utils.c b/source/ubl-utils.c
new file mode 100644
index 0000000..fd78093
--- /dev/null
+++ b/source/ubl-utils.c
@@ -0,0 +1,933 @@
+#include "ubl-utils.h"
+#ifndef UBL_UTILS
+
+typedef enum
+{
+ DICTIONARY_ACTION_WIDGETS_TYPE,
+ DICTIONARY_IVGRAPHICALS_TYPE,
+ DICTIONARY_OTHER_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 struct
+{
+ char *command;
+ int *exitcode;
+} thread_output;
+
+#ifdef __GTK_H__
+typedef struct IVGrapgicals
+{
+ char *sectionName;
+ char *categories;
+ GtkListStore *LV;
+ GtkWidget *Box;
+ GtkWidget *IV;
+ GtkWidget *label;
+ GtkWidget *sep;
+ GtkCellRendererPixbuf *iconRender;
+} IVGraphicals;
+#endif
+#endif
+
+// dictionary functions
+
+/**[EN]
+ * yon_dictionary_create_empty():
+ * Creates and returns empty dictionary
+ */
+dictionary *yon_dictionary_create_empty()
+{
+ 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;
+}
+
+void yon_dictionary_switch_to_last(dictionary **dict)
+{
+ if ((*dict)->next != NULL)
+ for ((*dict) = (*dict)->first; (*dict)->next != NULL; (*dict) = (*dict)->next)
+ {
+ }
+}
+
+dictionary *yon_dictionary_create_conneced(dictionary *targetdict)
+{
+ targetdict = yon_dictionary_get_last(targetdict);
+ targetdict->next = yon_dictionary_create_empty();
+ targetdict->next->prev = targetdict;
+ targetdict->next->first = targetdict->first;
+ targetdict->next->data_type = DICTIONARY_OTHER_TYPE;
+ return targetdict->next;
+}
+
+dictionary *yon_dictionary_get_last(dictionary *dict)
+{
+ dictionary *dct = NULL;
+ for (dct = dict->first; dct->next != NULL; dct = dct->next)
+ {
+ }
+ return dct;
+}
+
+dictionary *yon_dictionary_switch_places(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;
+ }
+ }
+ }
+ }
+}
+
+void yon_dictionary_make_first(dictionary *dict)
+{
+ for (dictionary *dct = dict->first; dct != NULL; dct = dct->next)
+ {
+ dct->first = dict;
+ }
+}
+
+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;
+}
+
+dictionary *yon_dictionary_create_with_data(char *key, void *data)
+{
+ dictionary *dct = yon_dictionary_create_empty();
+ dct->key = yon_char_new(key);
+ dct->data = data;
+ dct->data_type = DICTIONARY_OTHER_TYPE;
+ return dct;
+}
+
+dictionary *yon_dictionary_create_with_data_connected(dictionary *dict, char *key, void *data)
+{
+ dictionary *dct = yon_dictionary_create_conneced(dict);
+ dct->key = yon_char_new(key);
+ dct->data = data;
+ dct->data_type = DICTIONARY_OTHER_TYPE;
+ return dct;
+}
+
+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;
+}
+
+dictionary *yon_dictionary_find(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;
+}
+
+dictionary *yon_dictionary_rip(dictionary *dict)
+{
+ 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;
+ }
+}
+
+dictionary *yon_dictionary_get_nth(dictionary *dict, int place)
+{
+ if (dict){
+ dict = dict->first;
+ int i = 0;
+ for (i = 0; i < place; i++)
+ if (dict->next)
+ dict = dict->next;
+ else
+ break;
+ if (i == place)
+ return dict;
+ else
+ return NULL;
+ } else return NULL;
+}
+
+// char functions
+
+/**[EN]
+ *
+ * creates new char string by combining two char strings.
+ */
+char *yon_char_get_augumented(char *source, char *append)
+{
+ if (source && append)
+ {
+ int size = strlen(source) + strlen(append) + 1;
+ char *final = malloc(size);
+ memset(final, 0, size);
+ if (strstr(source, "%%"))
+ sprintf(final, source, append);
+ else
+ sprintf(final, "%s%s", source, append);
+ return final;
+ }
+ else
+ return NULL;
+}
+
+/**[EN]
+ *
+ * creates new char string by copying another char.
+ */
+char *yon_char_new(char *chr)
+{
+ if (chr){
+ char *newchar = malloc(strlen(chr) + 1);
+ memset(newchar, 0, strlen(chr) + 1);
+ memcpy(newchar, chr, strlen(chr));
+ return newchar;
+ } else
+ return NULL;
+}
+
+// char *yon_char_unite(char *source, ...)
+
+char *yon_char_unite(char *source, ...){
+ va_list arglist;
+ char *new_char=NULL;
+ char *unite_char=NULL;
+ new_char=yon_char_new(source);
+ va_start(arglist,source);
+ unite_char = va_arg(arglist,char*);
+ while(unite_char){
+ new_char = yon_char_get_augumented(new_char,unite_char);
+ unite_char = va_arg(arglist,char*);
+ }
+ va_end(arglist);
+ return new_char;
+}
+
+/**[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;
+}
+/**[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;
+}
+
+/**[EN]
+ * char *yon_char_divide_search(char *source, char *dividepos, int delete_divider)
+ * searches string [dividepos] in [source] string and divides it,
+ * returning left part of divided string and
+ * inserting right part to [source] string.
+ * if [delete_divider] is 0, left part will contain [delete_divider] substring, else
+ * if [delete_divider] is 1 it will stay in right part, else
+ * if [delete_divider] is -1 it will be deleted from string.
+ *
+ * [RU]
+ * char *yon_char_divide_search(char *source, char *dividepos, int delete_divider)
+ * Ищет строку [dividepos] в строке [source] и делит её в этом месте,
+ * возвращая левую часть разделённой строки и устанавливает в [source] правую часть.
+ * Если [delete_divider] равен 0, [dividepos] останется в левой строке, иначе
+ * если [delete_divider] равен 1, [dividepos] останется в правой строке, иначе
+ * если [delete_divider] равен -1, [dividepos] удаляется из строки.
+ */
+char *yon_char_divide_search(char *source, char *dividepos, int delete_divider)
+{
+ if (source&÷pos){
+ char *cut = strstr(source, dividepos);
+ if (cut)
+ {
+ int leng = strlen(source) - strlen(cut);
+ cut = yon_char_divide(source, leng);
+ return cut;
+ }
+ else
+ return source;
+ }
+}
+/**[EN]
+ * char *yon_char_from_int(int int_to_convert)
+ * converts int to char*.
+ *
+ * [RU]
+ * char *yon_char_from_int(int int_to_convert)
+ * Конвертирует int в char*
+ */
+char *yon_char_from_int(int int_to_convert)
+{
+ int i = 1;
+ float convert_check = (float)int_to_convert;
+ for (i = 1; convert_check > 10; i++)
+ {
+ convert_check = convert_check / 10;
+ }
+ char *ch = malloc(i * sizeof(char) + 1);
+ sprintf(ch, "%d", int_to_convert);
+ return ch;
+}
+
+/**[EN]
+ * char **yon_char_parse(char *parameters, int *size, char *divider)
+ * Parses string [parameters], divided by [divider],
+ * then returns parsed string array and sets [size] to
+ * size of returned array
+*/
+char **yon_char_parse(char *parameters, int *size, char *divider){
+ char **string=NULL;
+ int i=1;
+ string=malloc(sizeof(char*));
+ char *paramline=yon_char_new(parameters);
+ char *param;
+ while ((param=yon_char_divide_search(paramline,divider,1))){
+ string=realloc(string,sizeof(char*)*i);
+ string[i-1]=yon_char_new(param);
+ i++;
+ if (strcmp(param,paramline)==0) break;
+ }
+ string=realloc(string,sizeof(char*)*i);
+ string[i-1]=yon_char_new(paramline);
+ i++;
+ printf("%d\n",i);
+ *size=i-1;
+ return string;
+
+}
+
+char **yon_char_parsed_shrink(char **char_string, int *size, int item_to_delete){
+ char **new_char_parsed=NULL;
+ new_char_parsed=malloc(sizeof(char*)*(*size)-2);
+ int sz=0;
+ for (int i=0;i<*size-2;i++){
+ if (i!=item_to_delete){
+ new_char_parsed[i]=yon_char_new(char_string[i]);
+ sz++;
+ }
+
+ }
+ *size=sz;
+ return new_char_parsed;
+}
+
+/**[EN]
+ *
+ * Checks if [parameters] string array of length [size]
+ * has [param] element;
+*/
+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_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[1000];
+ memset(str, 0, 1000);
+ while (fgets(str, 1000, output))
+ {
+ if (strcmp(str, "") != 0)
+ {
+ output_strings = realloc(output_strings, sizeof(char *) * (i + 1));
+ printf("%s\n", str);
+ output_strings[i] = NULL;
+ output_strings[i] = yon_char_new(str);
+ memset(str, 0, 1000);
+ i++;
+ }
+ }
+ if (i>0){
+ *str_len = i;
+ return output_strings;
+ } else{
+ *str_len=-1;
+ return NULL;
+ }
+}
+
+
+/**[EN]
+ * int yon_config_save(char *command)
+ * Saves config with [command]
+ * [RU]
+*/
+int yon_config_save(char *command)
+{
+ FILE *output = popen(command, "r");
+ return 1;
+}
+
+/**[EN]
+ * char *yon_config_get_parameter(config parameters, int size, char *param)
+ * Gets parameter from parameter list;
+ *
+ * [RU]
+*/
+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;
+}
+
+/**[EN]
+ * Parses, modifies and connects string to use it as one of arguments,
+ * sended to ubconfig.
+ *
+ * [RU]
+ */
+char *yon_config_make_save_parameter_with_multiple_arguments(char *parameter_string, char *config_parameter, char *divider){
+ char *final="";
+ int done=0;
+ char *cur=yon_char_new(parameter_string);
+ yon_char_divide_search(cur,"=",1);
+ char *cur_param=NULL;
+ while (cur_param=yon_char_divide_search(cur,",",1)){
+ if (done==0){
+ final=yon_char_get_augumented(final,yon_char_get_augumented(yon_char_get_augumented(config_parameter,"="), yon_char_get_augumented(cur_param,", ")));
+ done=1;
+ } else {
+ final=yon_char_get_augumented(final,yon_char_get_augumented(yon_char_get_augumented(config_parameter,"+="), yon_char_get_augumented(cur_param,", ")));
+ }
+ }
+ if (cur&&strcmp(cur,"")!=0)
+ if (done==0)
+ final=yon_char_get_augumented(final,yon_char_get_augumented(yon_char_get_augumented(config_parameter,"="), yon_char_get_augumented(cur,", ")));
+ else
+ final=yon_char_get_augumented(final,yon_char_get_augumented(yon_char_get_augumented(config_parameter,"+="), yon_char_get_augumented(cur,", ")));
+ return final;
+}
+
+// terminal-using functions
+
+int yon_launch_app(char *name)
+{
+ char *path = name;
+ thread_output *thread = malloc(sizeof(thread_output));
+ thread->command = path;
+ thread->exitcode = malloc(sizeof(int));
+ pthread_t thread_id;
+ pthread_create(&thread_id, NULL, (void *)yon_launch, thread);
+ return *thread->exitcode;
+};
+
+int yon_launch_app_with_arguments(char *name, char *args)
+{
+ char *path = yon_char_get_augumented("/usr/bin/", name);
+ path = yon_char_get_augumented(path, " ");
+ path = yon_char_get_augumented(path, args);
+ pthread_t thread_id;
+ thread_output *thread = malloc(sizeof(thread_output));
+ thread->command = path;
+ thread->exitcode = malloc(sizeof(int));
+ pthread_create(&thread_id, NULL, (void *)yon_launch, thread);
+ return *thread->exitcode;
+};
+
+int yon_launch(thread_output *thread)
+{
+ int a = 0;
+ a = system(thread->command);
+ *thread->exitcode = a;
+ return *thread->exitcode;
+}
+
+// Gtk functions
+
+#ifdef __GTK_H__
+
+// dictionary *yon_gtk_app_chooser_create(GtkBuilder *builder){
+// GtkWidget *chooserWindow=gtk_window_new(GTK_WINDOW_TOPLEVEL);
+// GtkWidget *Box=gtk_box_new(GTK_ORIENTATION_VERTICAL,5);
+// GtkWidget *Frame=gtk_frame_new("");
+// GtkWidget *Scroll=gtk_scrolled_window_new(NULL, gtk_adjustment_new(0,0,10000,1,10,100));
+// GtkWidget *PackBox=gtk_box_new(GTK_ORIENTATION_VERTICAL,5);
+// GtkWidget *ButtonsBox=gtk_box_new(GTK_ORIENTATION_HORIZONTAL,5);
+// GtkWidget *ButtonsPlaceBox=gtk_box_new(GTK_ORIENTATION_HORIZONTAL,5);
+
+// GtkWidget *CancelButton=gtk_button_new_with_label("Cancel");
+// GtkWidget *AcceptButton=gtk_button_new_with_label("Accept");
+// gtk_container_add(GTK_CONTAINER(chooserWindow),Box);
+// gtk_box_pack_start(GTK_BOX(Box),Frame,1,1,0);
+// gtk_container_add(GTK_CONTAINER(Frame),PackBox);
+// gtk_box_pack_start(GTK_BOX(Box),ButtonsBox,0,0,0);
+// gtk_box_pack_end(GTK_BOX(ButtonsBox),ButtonsPlaceBox,0,0,0);
+// gtk_box_pack_end(GTK_BOX(ButtonsPlaceBox),AcceptButton,0,0,0);
+// gtk_box_pack_end(GTK_BOX(ButtonsPlaceBox),CancelButton,0,0,0);
+// gtk_box_pack_start(GTK_BOX(PackBox),(GtkWidget*)yon_gtk_app_chooser_apps_create(builder),0,0,0);
+// gtk_widget_show_all(chooserWindow);
+// }
+
+/**
+ * yon_iv_segment_create:
+ * connect_to - dictionary, in the end of which new one will be connected;
+ * name - name of this segment, renders on label;
+ * categories - desktop file categories that application NEEDS to have to render in that category;
+ * segment_icon_name - icon name for this section;
+ * builder - newly allocated builder with glade file connected where template widgets are stored:
+ * - templateAppsIconView - setted up icon view;
+ * - templateAppsPack - setted up container for every template widget;
+ * - templateAppsImage - image for rendering section image;
+ * - templateAppsLabel - label for rendering section name;
+ */
+// dictionary *yon_iv_segment_create(dictionary *connect_to, char *name, char *categories, char *segment_icon_name){
+// IVSegment *segment=malloc(sizeof(IVSegment));
+// segment->name=name;
+// segment->categories=categories;
+// GtkBuilder *builder=gtk_builder_new_from_string(return_app_string(),-1);
+// GtkWidget *iv=yon_gtk_builder_get_widget(builder,"templateAppsIconView");
+// GtkWidget *expander=yon_gtk_builder_get_widget(builder,"templateAppsPack");
+// GtkWidget *image=yon_gtk_builder_get_widget(builder,"templateAppsImage");
+// GtkWidget *label=yon_gtk_builder_get_widget(builder,"templateAppsLabel");
+// GtkIconTheme *theme=gtk_icon_theme_get_default();
+// gtk_image_set_from_pixbuf(GTK_IMAGE(image),gtk_icon_theme_load_icon_for_scale(theme,segment_icon_name,20,1,GTK_ICON_LOOKUP_FORCE_SVG,NULL));
+// gtk_label_set_text(GTK_LABEL(label),name);
+// GtkListStore *ls=GTK_LIST_STORE(gtk_builder_get_object(builder,"liststore5"));
+// // g_signal_connect(G_OBJECT(iv), "item-activated", G_CALLBACK(on_activate), videoconfig.applist);
+// segment->Expander=expander;
+// segment->IV=iv;
+// segment->LS=ls;
+// segment->Image=image;
+// dictionary *dict=NULL;
+// if (connect_to) {
+// // connect_to=yon_dictionary_get_last(connect_to);
+// dict=yon_dictionary_create_with_data_connected(connect_to,name,segment);
+// } else
+// dict=yon_dictionary_create_with_data(name,segment);
+// return dict;
+// }
+
+// GtkWidget *yon_gtk_app_chooser_apps_create(){
+// GtkWidget *Box=gtk_box_new(GTK_ORIENTATION_VERTICAL,0);
+// dictionary *IVS=yon_iv_segment_create(NULL, "Graphics", "", "dialog-yes-symbolic");
+// yon_iv_segment_create(IVS, "Tools", "", "dialog-yes-symbolic");
+// yon_iv_segment_create(IVS, "Internet", "", "dialog-yes-symbolic");
+// yon_iv_segment_create(IVS, "Multimedia", "", "dialog-yes-symbolic");
+// yon_iv_segment_create(IVS, "Settings", "", "dialog-yes-symbolic");
+// yon_iv_segment_create(IVS, "Education", "", "dialog-yes-symbolic");
+// yon_iv_segment_create(IVS, "Office", "", "dialog-yes-symbolic");
+// yon_iv_segment_create(IVS, "Other", "", "dialog-yes-symbolic");
+// yon_iv_segment_create(IVS, "Development", "", "dialog-yes-symbolic");
+// yon_iv_segment_create(IVS, "System", "", "dialog-yes-symbolic");
+// dictionary *nd;
+// for_dictionaries(nd,IVS){
+// gtk_box_pack_start(GTK_BOX(Box),((IVSegment*)nd->data)->Expander,0,0,0);
+// }
+// return Box;
+
+// }
+
+// GtkWidget *yon_gtk_socket_create_new_with_connect(GtkWidget *container, gpointer data){
+// GtkWidget *socket;
+// socket = gtk_socket_new();
+// g_signal_connect(G_OBJECT(socket),"plug-added",G_CALLBACK(yon_on_plug_added),data);
+// g_signal_connect(G_OBJECT(socket),"plug-removed",G_CALLBACK(yon_on_plug_removed),data);
+// g_signal_connect(G_OBJECT(socket),"destroy",G_CALLBACK(yon_on_plug_removed),data);
+// gtk_box_pack_start(GTK_BOX(container),socket,1,1,0);
+// return socket;
+// };
+
+int yon_gtk_combo_box_fill(GtkWidget *combo, config_str parameters,int size){
+ if (combo&¶meters){
+ for (int i=0;ifirst; dct != NULL; dct = dct->next)
+ {
+ gtk_box_pack_start(GTK_BOX(destination), (GtkWidget *)dct->data, expand, fill, padding);
+ }
+ return 1;
+ }else return 0;
+}
+
+int yon_dictionary_gtk_pack_end_multiple_widgets(dictionary *dict, GtkWidget *destination, gboolean expand, gboolean fill, int padding)
+{
+ for (dictionary *dct = dict->first; dct != NULL; dct = dct->next)
+ {
+ gtk_box_pack_end(GTK_BOX(destination), (GtkWidget *)dct->data, expand, fill, padding);
+ }
+ return 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_status_box_render(GtkWidget *StatusBox, GtkWidget *StatusIcon, GtkWidget *StatusLabel, char *StatusText, BACKGROUND_IMAGE_TYPE BackgroundClass)
+{
+ GtkIconTheme *ictheme = gtk_icon_theme_get_default();
+ GError *err = NULL;
+ if (err)
+ {
+ printf("%s\n", err->message);
+ g_error_free(err);
+ }
+ gtk_label_set_text(GTK_LABEL(StatusLabel), StatusText);
+ if (BackgroundClass == BACKGROUND_IMAGE_SUCCESS_TYPE)
+ {
+ gtk_style_context_remove_class(gtk_widget_get_style_context(StatusBox), "boxInfoMessError");
+ gtk_style_context_add_class(gtk_widget_get_style_context(StatusBox), "boxInfoMessOK");
+ gtk_image_set_from_pixbuf(GTK_IMAGE(StatusIcon), gtk_icon_theme_load_icon_for_scale(ictheme, "com.ublinux.ubl-settings-video.checked", 25, 1, GTK_ICON_LOOKUP_FORCE_SIZE, &err));
+ }
+ else if (BackgroundClass == BACKGROUND_IMAGE_FAIL_TYPE)
+ {
+ gtk_style_context_remove_class(gtk_widget_get_style_context(StatusBox), "boxInfoMessOK");
+ gtk_style_context_add_class(gtk_widget_get_style_context(StatusBox), "boxInfoMessError");
+ gtk_image_set_from_pixbuf(GTK_IMAGE(StatusIcon), gtk_icon_theme_load_icon_for_scale(ictheme, "com.ublinux.ubl-settings-video.warning", 25, 1, GTK_ICON_LOOKUP_FORCE_SIZE, &err));
+ }
+}
+#endif
\ No newline at end of file
diff --git a/source/ubl-utils.h b/source/ubl-utils.h
new file mode 100644
index 0000000..eea989e
--- /dev/null
+++ b/source/ubl-utils.h
@@ -0,0 +1,197 @@
+#ifndef UBL_UTILS
+#define UBL_UTILS
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+#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 yon_ubl_set_config_save_data_pointer(command) config_commands.config_save_data = command
+
+#define yon_ubl_load_global_config(command, size_pointer) yon_config_load(command, size_pointer)
+#define yon_ubl_load_local_config(command, size_pointer) yon_config_load(command, size_pointer)
+#define yon_ubl_save_global_config(command) yon_config_save(command)
+#define yon_ubl_save_local_config(command) yon_config_save(command)
+
+typedef enum
+{
+ #ifdef __GTK_H__
+ DICTIONARY_GTK_WIDGETS_TYPE,
+ #endif
+ DICTIONARY_OTHER_TYPE
+
+} DICT_TYPE;
+
+typedef struct
+{
+ char *command;
+ int *exitcode;
+} thread_output;
+
+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;
+// dictionary functions
+
+
+#define yon_dictionary_get_data(dictionary, type) ((type)dictionary->data)
+#define yon_dictionary_add_or_create_if_exists_with_data(dict,key,data) if (!dict) dict=yon_dictionary_create_with_data(key,data); \
+ else dict=yon_dictionary_create_with_data_connected(dict,key,data);
+
+dictionary *yon_dictionary_create_empty();
+
+dictionary *yon_dictionary_create_conneced(dictionary *targetdict);
+
+dictionary *yon_dictionary_get_last(dictionary *dict);
+
+dictionary *yon_dictionary_switch_places(dictionary *dict, int aim);
+
+void yon_dictionary_make_first(dictionary *dict);
+
+void yon_dictionary_make_nth(dictionary *dict, int nth);
+
+dictionary *yon_dictionary_create_with_data(char *key, void *data);
+
+dictionary *yon_dictionary_create_with_data_connected(dictionary *dict, char *key, void *data);
+
+dictionary *yon_dictionary_connect(dictionary *old, dictionary *toconnect);
+
+dictionary *yon_dictionary_find(dictionary **dict, char *key);
+
+dictionary *yon_dictionary_rip(dictionary *dict);
+
+dictionary *yon_dictionary_get_nth(dictionary *dict, int place);
+
+// char functions
+
+char *yon_char_get_augumented(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_parse(char *parameters, int *size, char *divider);
+
+char **yon_char_parsed_shrink(char **char_string, int *size, int item_to_delete);
+
+int yon_char_parsed_check_exist(char **parameters, int size, char *param);
+
+
+
+// parsing functions
+
+apps *yon_apps_scan_and_parse_desktops(int *sizef);
+
+void yon_apps_sort(apps *applist, int size);
+
+apps *yon_apps_get_by_name(apps *applist, char *name, int size);
+
+config_str yon_config_load(char *command, int *str_len);
+
+int yon_config_save(char *command);
+
+char *yon_config_get_parameter(config_str parameters, int size, char *param);
+
+char *yon_config_make_save_parameter_with_multiple_arguments(char *parameter_string, char *config_parameter, char *divider);
+
+// terminal-using functions
+
+int yon_launch_app(char *name);
+
+int yon_launch_app_with_arguments(char *name, char *args);
+
+int yon_launch(thread_output *thread);
+
+// Gtk functions
+
+#ifdef __GTK_H__
+
+#define yon_gtk_builder_get_widget(obj, obj2) GTK_WIDGET(gtk_builder_get_object(obj, obj2))
+
+typedef struct
+{
+ GtkWidget *Icon;
+ GtkWidget *Label;
+ GtkWidget *IconView;
+ GtkListStore *List;
+} expander_icon_view;
+
+// GtkWidget *yon_gtk_app_chooser_apps_create();
+
+// dictionary *yon_gtk_app_chooser_create();
+
+// expander_icon_view yon_gtk_icon_view_expander_create(GtkWidget *pack, ...);
+
+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);
+
+GtkWidget *yon_gtk_socket_create_new_with_connect(GtkWidget *container, gpointer data);
+
+int yon_gtk_icon_view_hide_empty(dictionary *icon_view_segment);
+
+int yon_dictionary_gtk_pack_start_multiple_widgets(dictionary *dict, GtkWidget *destination, gboolean expand, gboolean fill, int padding);
+int yon_dictionary_gtk_pack_end_multiple_widgets(dictionary *dict, GtkWidget *destination, gboolean expand, gboolean fill, int padding);
+
+// uninitialised
+
+void yon_on_plug_added(GtkSocket *self, gpointer user_data);
+void yon_on_plug_removed(GtkSocket *self, gpointer user_data);
+
+
+typedef enum
+{
+ BACKGROUND_IMAGE_SUCCESS_TYPE,
+ BACKGROUND_IMAGE_FAIL_TYPE
+} BACKGROUND_IMAGE_TYPE;
+#ifdef __cplusplus
+#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)
+#define yon_ubl_status_box_render(statusbox, statusicon, statuslabel, iconname, statustext, backgroundclass) _yon_ubl_status_box_render(GTK_WIDGET(statusbox.gobj()), GTK_WIDGET(statusicon.gobj()), GTK_WIDGET(statuslabel.gobj()), (char *)iconname, (char *)statustext, backgroundclass)
+#else
+#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_status_box_render(statusbox, statusicon, statuslabel, statustext, backgroundclass) _yon_ubl_status_box_render(statusbox, statusicon, statuslabel, statustext, backgroundclass)
+#endif
+
+void _yon_ubl_header_setup(GtkWidget *Overlay, GtkWidget *Head, GtkWidget *Image, char *image_path);
+void _yon_ubl_status_box_render(GtkWidget *StatusBox, GtkWidget *StatusIcon, GtkWidget *StatusLabel, char *StatusText, BACKGROUND_IMAGE_TYPE BackgroundClass);
+#endif
+#endif
\ No newline at end of file
diff --git a/ubl-settings-video-banner.png b/ubl-settings-video-banner.png
new file mode 100644
index 0000000..8eb67cb
Binary files /dev/null and b/ubl-settings-video-banner.png differ
diff --git a/ubl-settings-video.css b/ubl-settings-video.css
new file mode 100644
index 0000000..499b1e8
--- /dev/null
+++ b/ubl-settings-video.css
@@ -0,0 +1,103 @@
+.noborder {
+ border:none;
+}
+.thin {
+ margin:0px;
+ padding:0px;
+}
+
+.workingbg {
+ background:@theme_base_color;
+}
+.textoutline {
+ text-shadow: 0.5px 0 0.5px @theme_bg_color,
+0 0.5px 0.5px @theme_bg_color,
+-0.5px 0 0.5px @theme_bg_color,
+0 -0.5px 0.5px @theme_bg_color;
+}
+.nobackground {
+ background: none;
+}
+.menuitembottom{
+ margin-top:0px;
+ margin-bottom:3px;
+ border-color:inherit;
+ border-left-width:inherit;
+ border-right-width:inherit;
+ }
+ .menuitemmiddle{
+ margin-top:0px;
+ margin-bottom:0px;
+ border-color:inherit;
+ border-left-width:inherit;
+ border-right-width:inherit;
+ }
+
+ .menuitemtop{
+ margin-bottom:0px;
+ border-color:inherit;
+ border-top-width:inherit;
+ border-left-width:inherit;
+ border-right-width:inherit;
+ }
+ .menuitemtop *{
+ margin:2px 2px 0 2px;
+ padding: 5px 10px 3px 5px;
+ border:transparent;
+ }
+ .menuitemmiddle *{
+ margin:0 2px 0 2px;
+ padding: 3px 10px 3px 5px;
+ border:transparent;
+ }
+ .menuitembottom *{
+ margin:0 2px 2px 2px;
+ padding: 3px 10px 5px 5px;
+ }
+ .menuitemtop:hover {
+ background:@theme_bg_color;
+ border-color:inherit;
+ border-top-width:inherit;
+ border-left-width:inherit;
+ border-right-width:inherit;
+ }
+ .menuitemmiddle:hover {
+ background:@theme_bg_color;
+ border-color:inherit;
+ border-left-width:inherit;
+ border-right-width:inherit;
+ }
+ .menuitembottom:hover {
+ background:@theme_bg_color;
+ border-color:inherit;
+ border-bottom-width:0px;
+ border-left-width:inherit;
+ border-right-width:inherit;
+
+ }
+ .menuitemtop:hover* {
+ margin:2px 2px 0 2px;
+ padding: 5px 10px 3px 5px;
+ background:@theme_selected_bg_color;
+ border-radius:2px;
+ }
+ .menuitemmiddle:hover* {
+ margin:0 2px 0 2px;
+ padding: 3px 10px 3px 5px;
+ background:@theme_selected_bg_color;
+ border-radius:2px;
+ }
+ .menuitembottom:hover* {
+ margin:0 2px 2px 2px;
+ padding: 3px 10px 5px 5px;
+ background:@theme_selected_bg_color;
+ border-radius:2px;
+ }
+
+ .boxInfoMessError{
+ background-color: #ea9999;
+}
+
+.boxInfoMessOK{
+ background-color: #f3f0ac;
+}
\ No newline at end of file
diff --git a/ubl-settings-video.desktop b/ubl-settings-video.desktop
new file mode 100644
index 0000000..f12dc01
--- /dev/null
+++ b/ubl-settings-video.desktop
@@ -0,0 +1,15 @@
+[Desktop Entry]
+Encoding=UTF-8
+Name=ubl-settings-video
+Name[ru]=Настройки видеоадаптера и дисплея
+GenericName=ubl-settings-video
+GenericName[ru]=Настройки Видеоадаптера и дисплея
+Comment=Application for managing video adapter and display settings
+Comment[ru]=Приложение для управления настройками видеоадаптера и дисплея
+Type=Application
+Exec=ubl-settings-video
+Icon=com.ublinux.ubl-settings-video
+Terminal=false
+X-XfcePluggable=true
+X-UBLPluggable=true
+Categories=XFCE;GTK;Settings;DesktopSettings;X-XFCE-SettingsDialog;X-XFCE-SystemSettings;
diff --git a/ubl-settings-video.glade b/ubl-settings-video.glade
new file mode 100644
index 0000000..dcdaae5
--- /dev/null
+++ b/ubl-settings-video.glade
@@ -0,0 +1,2232 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ True
+ False
+
+
+ 90
+ True
+ False
+ 5
+ 5
+ 5
+ 5
+ 6
+ 6
+ 69
+ com.ublinux.ubl-settings-video
+
+
+ False
+ True
+ 0
+
+
+
+
+ True
+ False
+
+
+ True
+ False
+
+
+ True
+ False
+ vertical
+
+
+ 255
+ True
+ False
+ Video output configuration
+
+
+
+
+
+
+
+
+ True
+ True
+ 0
+
+
+
+
+ False
+ True
+ 0
+
+
+
+
+ True
+ True
+ 0
+
+
+
+
+ True
+ False
+
+
+ False
+ True
+ 1
+
+
+
+
+ True
+ True
+ 1
+
+
+
+
+ True
+ False
+ document-edit-symbolic
+
+
+ True
+ False
+ dialog-information-symbolic
+
+
+ True
+ False
+ user-trash-symbolic
+
+
+ True
+ False
+ dialog-information-symbolic
+
+
+ True
+ False
+ system-shutdown-symbolic
+
+
+ True
+ False
+ user-trash-symbolic
+
+
+ False
+ value-increase-symbolic
+
+
+ True
+ False
+ document-edit-symbolic
+
+
+ True
+ False
+ open-menu-symbolic
+
+
+
+ True
+ False
+ start
+ 3
+ 3
+ 10
+ 20
+ vertical
+
+
+ True
+ False
+ True
+
+
+
+
+
+
+ False
+ True
+ 0
+
+
+
+
+ True
+ False
+ 5
+ 5
+
+
+
+
+
+
+ False
+ True
+ 1
+
+
+
+
+ True
+ False
+ 15
+
+
+ True
+ True
+ True
+ image14
+
+
+
+ False
+ True
+ 0
+
+
+
+
+ True
+ True
+ True
+ image13
+
+
+
+ False
+ True
+ 1
+
+
+
+
+ True
+ True
+ True
+ end
+ image3
+
+
+
+ False
+ True
+ end
+ 2
+
+
+
+
+ True
+ True
+ True
+ image15
+
+
+
+ False
+ True
+ 3
+
+
+
+
+ False
+ True
+ 2
+
+
+
+
+ True
+ False
+ process-stop-symbolic
+
+
+ True
+ False
+ emblem-ok-symbolic
+
+
+ False
+ True
+ com.ublinux.ubl-settings-video
+
+
+ True
+ False
+ vertical
+
+
+ True
+ False
+ 5
+ 5
+ 5
+ 5
+ vertical
+
+
+ True
+ False
+ 5
+
+
+ Enabled
+ True
+ True
+ False
+ True
+
+
+ False
+ True
+ 0
+
+
+
+
+ False
+ True
+ 1
+
+
+
+
+ True
+ False
+ vertical
+
+
+ True
+ False
+ end
+ 5
+ True
+
+
+ Save
+ True
+ True
+ True
+ image5
+
+
+ False
+ True
+ end
+ 0
+
+
+
+
+ Cancel
+ True
+ True
+ True
+ image4
+
+
+ False
+ True
+ end
+ 1
+
+
+
+
+ False
+ True
+ 0
+
+
+
+
+ False
+ True
+ end
+ 2
+
+
+
+
+ True
+ False
+ vertical
+
+
+ True
+ False
+ vertical
+ 5
+
+
+ True
+ False
+ 5
+
+
+ True
+ False
+ Port
+
+
+ False
+ True
+ 0
+
+
+
+
+ True
+ False
+ 0
+
+
+ True
+ True
+ 1
+
+
+
+
+ Main display
+ True
+ True
+ False
+ True
+
+
+ False
+ True
+ 2
+
+
+
+
+ False
+ True
+ 1
+
+
+
+
+ True
+ False
+ 5
+
+
+ True
+ False
+ Resolution (px):
+
+
+ False
+ True
+ 0
+
+
+
+
+ True
+ False
+ 0
+
+
+ True
+ True
+ 1
+
+
+
+
+ Show unsupported
+ True
+ True
+ False
+ True
+
+
+ False
+ True
+ 2
+
+
+
+
+ False
+ True
+ 2
+
+
+
+
+ True
+ False
+ 5
+
+
+ True
+ False
+ Frequency (Hz):
+
+
+ False
+ True
+ 0
+
+
+
+
+ True
+ False
+ 0
+
+
+ True
+ True
+ 1
+
+
+
+
+ False
+ True
+ 3
+
+
+
+
+ True
+ False
+ 5
+
+
+ True
+ False
+ Rotation:
+
+
+ False
+ True
+ 0
+
+
+
+
+ True
+ False
+ 0
+
+
+ True
+ True
+ 1
+
+
+
+
+ False
+ True
+ 4
+
+
+
+
+ True
+ False
+ 5
+
+
+ True
+ False
+ Position:
+
+
+ False
+ True
+ 0
+
+
+
+
+ True
+ False
+ 5
+ True
+
+
+ True
+ False
+ 0
+
+
+ True
+ True
+ 0
+
+
+
+
+ True
+ False
+ 0
+
+
+ True
+ True
+ 1
+
+
+
+
+ True
+ True
+ 1
+
+
+
+
+ False
+ True
+ 5
+
+
+
+
+ Do not switch off display
+ True
+ True
+ False
+ True
+
+
+ False
+ True
+ 6
+
+
+
+
+ Create modeline for current resolution with CVT
+ True
+ True
+ False
+ True
+
+
+ False
+ True
+ 7
+
+
+
+
+ Use "CVT Reduced Blanking"gshgrbehr
+ True
+ True
+ False
+ True
+
+
+ False
+ True
+ 8
+
+
+
+
+ Create modeline for current resolution with GTF
+ True
+ True
+ False
+ True
+
+
+ False
+ True
+ 9
+
+
+
+
+ True
+ False
+
+
+ False
+ True
+ 10
+
+
+
+
+ False
+ True
+ 0
+
+
+
+
+ True
+ False
+ 5
+ 5
+ vertical
+ 5
+
+
+ Configure manually through parameter line:
+ True
+ True
+ False
+ True
+
+
+ False
+ True
+ 0
+
+
+
+
+ True
+ False
+ True
+ center
+ 1920x1080
+
+
+ True
+ True
+ 1
+
+
+
+
+ False
+ True
+ 1
+
+
+
+
+ False
+ True
+ 3
+
+
+
+
+ True
+ True
+ 0
+
+
+
+
+
+
+ True
+ False
+ go-bottom-symbolic
+
+
+ True
+ False
+ user-trash-symbolic
+
+
+ True
+ False
+ go-bottom-symbolic
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 800
+ 600
+ False
+ 800
+ 600
+ com.ublinux.ubl-settings-video
+
+
+ True
+ False
+ True
+ vertical
+
+
+ True
+ False
+ vertical
+
+
+ True
+ False
+
+
+ True
+ False
+ 5
+ 5
+ 5
+ 5
+ 6
+ 6
+ 25
+
+
+ False
+ True
+ 0
+
+
+
+
+ True
+ False
+ start
+ 5
+ 5
+ 5
+ 5
+ 6
+ 6
+
+
+
+
+
+
+ True
+ True
+ 1
+
+
+
+
+ False
+ True
+ 0
+
+
+
+
+ True
+ False
+ vertical
+
+
+ 81
+ True
+ False
+
+
+ True
+ False
+ start
+
+
+ -1
+
+
+
+
+ False
+ True
+ 0
+
+
+
+
+ False
+ True
+ 1
+
+
+
+
+ True
+ True
+ 5
+
+
+ 165
+ True
+ True
+ 5
+ 5
+ 5
+ 5
+ external
+
+
+ True
+ False
+
+
+ True
+ False
+ 5
+ 5
+ 5
+ 5
+ 5
+ vertical
+
+
+ True
+ False
+ 0.019999999552965164
+ in
+
+
+ True
+ False
+ 5
+ 5
+ 12
+ 5
+
+
+ True
+ False
+ vertical
+
+
+ Automatically choose and use driver
+ True
+ True
+ False
+ start
+ True
+
+
+ False
+ True
+ 0
+
+
+
+
+ True
+ False
+ 5
+
+
+ True
+ False
+ vertical
+ 5
+
+
+ True
+ False
+ start
+ Failsafe driver nVidia:
+ 0
+
+
+ False
+ True
+ 1
+
+
+
+
+ True
+ False
+ start
+ Failsafe driver AMD/ATI:
+ 0
+
+
+ False
+ True
+ 2
+
+
+
+
+ False
+ True
+ 0
+
+
+
+
+ True
+ False
+ vertical
+ 5
+
+
+ True
+ False
+
+
+ False
+ True
+ 1
+
+
+
+
+ True
+ False
+
+
+ False
+ True
+ 2
+
+
+
+
+ True
+ True
+ 1
+
+
+
+
+ False
+ True
+ 1
+
+
+
+
+
+
+
+
+ True
+ False
+ Driver
+
+
+
+
+ False
+ True
+ 0
+
+
+
+
+ True
+ False
+ vertical
+
+
+ True
+ False
+ 0.019999999552965164
+ in
+
+
+ True
+ False
+ vertical
+
+
+ True
+ False
+ 5
+ 5
+ 5
+ 5
+ 5
+ 5
+ 10
+
+
+
+
+
+ False
+ True
+ 0
+
+
+
+
+
+
+ True
+ False
+ Monitor configuration
+
+
+
+
+ True
+ True
+ 0
+
+
+
+
+ True
+ True
+ 1
+
+
+
+
+ True
+ False
+ 0.019999999552965164
+ in
+
+
+ True
+ False
+ 5
+ 5
+ 12
+ 5
+
+
+ True
+ False
+
+
+ discrete video only (AMD/ATI)
+ True
+ True
+ False
+ 5
+ 5
+ True
+
+
+ False
+ True
+ 1
+
+
+
+
+
+
+
+
+ True
+ False
+ 0
+ Hybrid graphics
+
+
+
+
+ False
+ True
+ 2
+
+
+
+
+ True
+ False
+ 5
+ 0.019999999552965164
+ in
+
+
+ True
+ False
+ 5
+ 5
+ 12
+ 5
+
+
+ True
+ False
+ vertical
+
+
+ True
+ False
+ 5
+
+
+ True
+ False
+ vertical
+ 5
+
+
+ Launch programms through optirun (nVidia):
+ True
+ True
+ False
+ True
+
+
+ False
+ True
+ 0
+
+
+
+
+ Launch programs through primusun (nVidia):
+ True
+ True
+ False
+ True
+
+
+ False
+ True
+ 1
+
+
+
+
+ False
+ True
+ 0
+
+
+
+
+ True
+ False
+ vertical
+ 5
+
+
+ True
+ False
+ True
+ steam
+
+
+ True
+ True
+ 0
+
+
+
+
+ True
+ False
+ True
+ steam
+
+
+ True
+ True
+ 1
+
+
+
+
+ True
+ True
+ 1
+
+
+
+
+ True
+ False
+ vertical
+ 5
+
+
+
+ False
+ True
+ 0
+
+
+
+
+
+ False
+ True
+ 1
+
+
+
+
+ False
+ True
+ 2
+
+
+
+
+ False
+ True
+ 0
+
+
+
+
+ True
+ False
+ 5
+ 5
+
+
+ True
+ False
+ Fix frame gap (nVidia):
+ 0
+
+
+ False
+ True
+ 0
+
+
+
+
+ True
+ False
+
+
+ True
+ True
+ 1
+
+
+
+
+ False
+ True
+ 1
+
+
+
+
+
+
+
+
+ True
+ False
+ Extra
+
+
+
+
+ False
+ True
+ 3
+
+
+
+
+
+
+
+
+
+
+ True
+ False
+ Main Settings
+
+
+ False
+
+
+
+
+ True
+ True
+ 5
+ 5
+ 5
+ 5
+ 5
+ 5
+
+
+ True
+ False
+ 5
+ 5
+ 5
+ 5
+ 5
+ vertical
+ 5
+
+
+ True
+ True
+
+
+ True
+ True
+ 5
+ liststore6
+ 1
+ True
+
+
+
+
+
+ Installed
+
+
+
+ 0
+
+
+
+
+
+
+ Package
+
+
+
+ 1
+
+
+
+
+
+
+ Driver
+
+
+
+ 2
+
+
+
+
+
+
+ Description
+
+
+
+ 3
+
+
+
+
+
+
+ Supported Devices
+
+
+
+ 4
+
+
+
+
+
+
+
+
+ True
+ True
+ 0
+
+
+
+
+ True
+ False
+ center
+ 5
+
+
+ Установить
+ True
+ True
+ True
+ image9
+
+
+ False
+ True
+ end
+ 0
+
+
+
+
+ Удалить
+ True
+ True
+ True
+ image11
+
+
+ False
+ True
+ end
+ 1
+
+
+
+
+ Подробнее
+ True
+ True
+ True
+ image10
+
+
+ False
+ True
+ end
+ 2
+
+
+
+
+ False
+ True
+ 1
+
+
+
+
+
+
+ True
+ False
+ Driver Modules
+
+
+ False
+
+
+
+
+ True
+ False
+ 5
+ 5
+ 5
+ 5
+ 5
+ vertical
+ 5
+
+
+ True
+ True
+
+
+ True
+ True
+ 5
+ liststore6
+ 0
+ True
+ 2
+
+
+
+
+
+ Installed
+
+
+
+ 0
+
+
+
+
+
+
+ Package
+
+
+
+ 1
+
+
+
+
+
+
+ Driver
+
+
+
+ 2
+
+
+
+
+
+
+ Description
+
+
+
+ 3
+
+
+
+
+
+
+ Supported Devices
+
+
+
+ 4
+
+
+
+
+
+
+
+
+ True
+ True
+ 0
+
+
+
+
+ True
+ False
+ center
+ 5
+
+
+ Установить
+ True
+ True
+ True
+ image6
+
+
+ False
+ True
+ end
+ 0
+
+
+
+
+ Удалить
+ True
+ True
+ True
+ image7
+
+
+ False
+ True
+ end
+ 1
+
+
+
+
+ Подробнее
+ True
+ True
+ True
+ image12
+
+
+ False
+ True
+ end
+ 2
+
+
+
+
+ False
+ True
+ 1
+
+
+
+
+ 1
+
+
+
+
+ True
+ False
+ Drivers
+
+
+ 1
+ False
+
+
+
+
+
+
+
+
+
+
+ 1
+
+
+
+
+ True
+ False
+ Drivers
+
+
+ 1
+ False
+
+
+
+
+ True
+ False
+ 5
+ 5
+ 5
+ 5
+ 5
+ 5
+ 0
+ none
+
+
+ True
+ False
+ 12
+
+
+ True
+ False
+
+
+ True
+ False
+ start
+ 75
+ appointment-new-symbolic
+
+
+ False
+ True
+ 0
+
+
+
+
+ True
+ False
+ start
+ start
+ 10
+ 5
+ 10
+ 5
+ 10
+ 10
+ label
+
+
+ False
+ True
+ 1
+
+
+
+
+
+
+
+
+ True
+ False
+ 5
+ 5
+ Devices and Drivers
+
+
+
+
+ 2
+
+
+
+
+ True
+ False
+ Information
+
+
+ 2
+ False
+
+
+
+
+ True
+ True
+ 2
+
+
+
+
+ True
+ True
+ 0
+
+
+
+
+
+
+
+
+
+ vertical
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ True
+ False
+
+
+ True
+ False
+ False
+ 128
+ com.ublinux.ubl-settings-video.display
+ 6
+
+
+ -1
+
+
+
+
diff --git a/ubl-settings-video.pot b/ubl-settings-video.pot
new file mode 100644
index 0000000..3bc82af
--- /dev/null
+++ b/ubl-settings-video.pot
@@ -0,0 +1,204 @@
+# Language translations for ubl-settings-manager package.
+# Copyright (C) 2022, UBTech LLC
+# This file is distributed under the same license as the ubl-settings-manager package.
+# UBLinux Team , 2022
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: ubl-settings-manager 1.0\n"
+"Report-Msgid-Bugs-To: info@ublinux.com\n"
+"POT-Creation-Date: 2023-04-21 12:33+0000\n"
+"PO-Revision-Date: 2023-01-01 00:00+0600\n"
+"Last-Translator: UBLinux Team \n"
+"Language-Team: Russian - UBLinux Team \n"
+"Language: Russian\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: source/ubl-settings-video.c:26 source/ubl-settings-video.c:223
+msgid "Cancel"
+msgstr ""
+
+#: source/ubl-settings-video.c:27
+msgid "Accept"
+msgstr ""
+
+#: source/ubl-settings-video.c:28 source/ubl-settings-video.c:386
+msgid "Driver"
+msgstr ""
+
+#: source/ubl-settings-video.c:29
+msgid "Description"
+msgstr ""
+
+#: source/ubl-settings-video.c:87 source/ubl-settings-video.c:392
+msgid "UBlinux Video Configuration"
+msgstr ""
+
+#: source/ubl-settings-video.c:89
+msgid "Progect Home Page"
+msgstr ""
+
+#: source/ubl-settings-video.c:90
+msgid "Videocard and monitor configuration manager"
+msgstr ""
+
+#: source/ubl-settings-video.c:215
+msgid "Monitor: "
+msgstr ""
+
+#: source/ubl-settings-video.c:216
+msgid "Resolution (px): "
+msgstr ""
+
+#: source/ubl-settings-video.c:217
+msgid "Frequency (Hz): "
+msgstr ""
+
+#: source/ubl-settings-video.c:218
+msgid "Rotation: "
+msgstr ""
+
+#: source/ubl-settings-video.c:220
+msgid "Main monitor"
+msgstr ""
+
+#: source/ubl-settings-video.c:221
+msgid "through parameter line:"
+msgstr ""
+
+#: source/ubl-settings-video.c:226 source/ubl-settings-video.c:231
+#: source/ubl-settings-video.c:233 source/ubl-settings-video.c:236
+#: source/ubl-settings-video.c:238 source/ubl-settings-video.c:258
+msgid "Default settings"
+msgstr ""
+
+#: source/ubl-settings-video.c:374
+msgid "Don't use"
+msgstr ""
+
+#: source/ubl-settings-video.c:375 source/ubl-settings-video.c:377
+msgid "Off"
+msgstr ""
+
+#: source/ubl-settings-video.c:376 source/ubl-settings-video.c:378
+msgid "fbdev"
+msgstr ""
+
+#: source/ubl-settings-video.c:380
+msgid "1st variant. May cause perfomance drops in video games"
+msgstr ""
+
+#: source/ubl-settings-video.c:381
+msgid "2nd variant. May not work on specific video cards"
+msgstr ""
+
+#: source/ubl-settings-video.c:382
+msgid "Video output configuration"
+msgstr ""
+
+#: source/ubl-settings-video.c:383
+msgid "Proprietary driver: "
+msgstr ""
+
+#: source/ubl-settings-video.c:384
+msgid "Failsafe driver nVidia: "
+msgstr ""
+
+#: source/ubl-settings-video.c:385
+msgid "Failsafe driver AMD/ATI: "
+msgstr ""
+
+#: source/ubl-settings-video.c:388
+msgid "Monitor configuration"
+msgstr ""
+
+#: source/ubl-settings-video.c:389
+msgid "Hybrid graphics"
+msgstr ""
+
+#: source/ubl-settings-video.c:390
+msgid "Fix frame gap (nVidia)"
+msgstr ""
+
+#: source/ubl-settings-video.c:391
+msgid "Extra"
+msgstr ""
+
+#: source/ubl-settings-video.c:393
+msgid "Load"
+msgstr ""
+
+#: source/ubl-settings-video.c:394
+msgid "Save"
+msgstr ""
+
+#: source/ubl-settings-video.c:396
+msgid "On"
+msgstr ""
+
+#: source/ubl-settings-video.c:397
+msgid "Automatically choose and use driver"
+msgstr ""
+
+#: source/ubl-settings-video.c:398
+msgid "Launch programms through optirun (nVidia): "
+msgstr ""
+
+#: source/ubl-settings-video.c:399
+msgid "Launch programs through primusun (nVidia): "
+msgstr ""
+
+#: source/ubl-settings-video.c:400
+msgid "discrete video only (AMD/ATI)"
+msgstr ""
+
+#: source/ubl-settings-video.c:402
+msgid "Load from global configuration"
+msgstr ""
+
+#: source/ubl-settings-video.c:403
+msgid "Load from local configuration"
+msgstr ""
+
+#: source/ubl-settings-video.c:404
+msgid "Save to global an local configuration"
+msgstr ""
+
+#: source/ubl-settings-video.c:405
+msgid "Save to global configuration"
+msgstr ""
+
+#: source/ubl-settings-video.c:406
+msgid "Save to local configuration"
+msgstr ""
+
+#: source/ubl-settings-video.c:407
+msgid "Documentation"
+msgstr ""
+
+#: source/ubl-settings-video.c:408
+msgid "About"
+msgstr ""
+
+#: source/ubl-settings-video.c:438
+msgid "Configuration has been loaded"
+msgstr ""
+
+#: source/ubl-settings-video.h:22
+msgid "Failed to load global configuration"
+msgstr ""
+
+#: source/ubl-settings-video.h:23
+msgid "Failed to load local configuration"
+msgstr ""
+
+#: source/ubl-settings-video.h:25
+msgid "Saving to global configuration Succeeded"
+msgstr ""
+
+#: source/ubl-settings-video.h:26
+msgid "Saving to local configuration Succeeded"
+msgstr ""
diff --git a/ubl-settings-video_ru.po b/ubl-settings-video_ru.po
new file mode 100644
index 0000000..c4ea148
--- /dev/null
+++ b/ubl-settings-video_ru.po
@@ -0,0 +1,224 @@
+# Russian translations for ubl-settings-manager package.
+# Copyright (C) 2022, UBTech LLC
+# This file is distributed under the same license as the ubl-settings-manager package.
+# UBLinux Team , 2022
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: ubl-settings-manager 1.0\n"
+"Report-Msgid-Bugs-To: info@ublinux.com\n"
+"POT-Creation-Date: 2023-04-21 12:33+0000\n"
+"PO-Revision-Date: 2023-01-01 00:00+0600\n"
+"Last-Translator: UBLinux Team \n"
+"Language-Team: Russian - UBLinux Team \n"
+"Language: Russian\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: source/ubl-settings-video.c:26 source/ubl-settings-video.c:223
+msgid "Cancel"
+msgstr "Отмена"
+
+#: source/ubl-settings-video.c:27
+msgid "Accept"
+msgstr "Принять"
+
+#: source/ubl-settings-video.c:28 source/ubl-settings-video.c:386
+msgid "Driver"
+msgstr "Драйвер"
+
+#: source/ubl-settings-video.c:29
+msgid "Description"
+msgstr "Описание"
+
+#: source/ubl-settings-video.c:87 source/ubl-settings-video.c:392
+msgid "UBlinux Video Configuration"
+msgstr "Видеокарта/Экран"
+
+#: source/ubl-settings-video.c:89
+msgid "Progect Home Page"
+msgstr "Домашняя страница проекта"
+
+#: source/ubl-settings-video.c:90
+#, fuzzy
+msgid "Videocard and monitor configuration manager"
+msgstr "Настройка вывода изображения"
+
+#: source/ubl-settings-video.c:215
+msgid "Monitor: "
+msgstr "Монитор: "
+
+#: source/ubl-settings-video.c:216
+msgid "Resolution (px): "
+msgstr "Разрешение (px): "
+
+#: source/ubl-settings-video.c:217
+msgid "Frequency (Hz): "
+msgstr "Обновления (Hz): "
+
+#: source/ubl-settings-video.c:218
+msgid "Rotation: "
+msgstr "Вращение: "
+
+#: source/ubl-settings-video.c:220
+#, fuzzy
+msgid "Main monitor"
+msgstr "Основной"
+
+#: source/ubl-settings-video.c:221
+msgid "through parameter line:"
+msgstr "Через строку параметра: "
+
+#: source/ubl-settings-video.c:226 source/ubl-settings-video.c:231
+#: source/ubl-settings-video.c:233 source/ubl-settings-video.c:236
+#: source/ubl-settings-video.c:238 source/ubl-settings-video.c:258
+msgid "Default settings"
+msgstr "По умолчанию"
+
+#: source/ubl-settings-video.c:374
+msgid "Don't use"
+msgstr "Не использовать"
+
+#: source/ubl-settings-video.c:375 source/ubl-settings-video.c:377
+msgid "Off"
+msgstr "Выключить"
+
+#: source/ubl-settings-video.c:376 source/ubl-settings-video.c:378
+msgid "fbdev"
+msgstr "fbdev"
+
+#: source/ubl-settings-video.c:380
+msgid "1st variant. May cause perfomance drops in video games"
+msgstr "1 вариант. Может снизить производительность в играх"
+
+#: source/ubl-settings-video.c:381
+msgid "2nd variant. May not work on specific video cards"
+msgstr "2 вариант. Не на каждой карте может сработать"
+
+#: source/ubl-settings-video.c:382
+msgid "Video output configuration"
+msgstr "Настройка вывода изображения"
+
+#: source/ubl-settings-video.c:383
+#, fuzzy
+msgid "Proprietary driver: "
+msgstr "Проприетарный драйвер: "
+
+#: source/ubl-settings-video.c:384
+#, fuzzy
+msgid "Failsafe driver nVidia: "
+msgstr "Отказоучтойчивый драйвер nVidia: "
+
+#: source/ubl-settings-video.c:385
+#, fuzzy
+msgid "Failsafe driver AMD/ATI: "
+msgstr "Отказоустойчивый драйвер AMD/ATI: "
+
+#: source/ubl-settings-video.c:388
+msgid "Monitor configuration"
+msgstr "Настройка экрана"
+
+#: source/ubl-settings-video.c:389
+msgid "Hybrid graphics"
+msgstr "Гибридная графика"
+
+#: source/ubl-settings-video.c:390
+msgid "Fix frame gap (nVidia)"
+msgstr "Исправить разрыв кадров (nVidia)"
+
+#: source/ubl-settings-video.c:391
+msgid "Extra"
+msgstr "Дополнительно"
+
+#: source/ubl-settings-video.c:393
+msgid "Load"
+msgstr "Загрузить"
+
+#: source/ubl-settings-video.c:394
+msgid "Save"
+msgstr "Сохранить"
+
+#: source/ubl-settings-video.c:396
+msgid "On"
+msgstr "Включить"
+
+#: source/ubl-settings-video.c:397
+msgid "Automatically choose and use driver"
+msgstr "Автоматический выбор и использование драйвера"
+
+#: source/ubl-settings-video.c:398
+#, fuzzy
+msgid "Launch programms through optirun (nVidia): "
+msgstr "Запуск программ через (nVidia)"
+
+#: source/ubl-settings-video.c:399
+#, fuzzy
+msgid "Launch programs through primusun (nVidia): "
+msgstr "Запуск программ через (nVidia)"
+
+#: source/ubl-settings-video.c:400
+msgid "discrete video only (AMD/ATI)"
+msgstr "Только дискретное видео (AMD/ATI)"
+
+#: source/ubl-settings-video.c:402
+#, fuzzy
+msgid "Load from global configuration"
+msgstr "Загрузить глобальную конфигурацию"
+
+#: source/ubl-settings-video.c:403
+#, fuzzy
+msgid "Load from local configuration"
+msgstr "Загрузить локальную конфигуруцию"
+
+#: source/ubl-settings-video.c:404
+#, fuzzy
+msgid "Save to global an local configuration"
+msgstr "Сохранить в глобальную и локальную конфигурацию"
+
+#: source/ubl-settings-video.c:405
+#, fuzzy
+msgid "Save to global configuration"
+msgstr "Сохранить в глобальную конфигурацию"
+
+#: source/ubl-settings-video.c:406
+#, fuzzy
+msgid "Save to local configuration"
+msgstr "Схоранить в локальную конфигурацию"
+
+#: source/ubl-settings-video.c:407
+#, fuzzy
+msgid "Documentation"
+msgstr "Справка"
+
+#: source/ubl-settings-video.c:408
+msgid "About"
+msgstr "О программе"
+
+#: source/ubl-settings-video.c:438
+msgid "Configuration has been loaded"
+msgstr "Конфигурация была загружена"
+
+#: source/ubl-settings-video.h:22
+#, fuzzy
+msgid "Failed to load global configuration"
+msgstr "Ошибка загрузки глобальной конфигурации"
+
+#: source/ubl-settings-video.h:23
+#, fuzzy
+msgid "Failed to load local configuration"
+msgstr "Ошибка загрузки локальной конфигурации"
+
+#: source/ubl-settings-video.h:25
+#, fuzzy
+msgid "Saving to global configuration Succeeded"
+msgstr "Успешное сохранение глобальной конфигурации"
+
+#: source/ubl-settings-video.h:26
+#, fuzzy
+msgid "Saving to local configuration Succeeded"
+msgstr "Успешное сохранение локальной конфигурации"
+
+#~ msgid "DPMS off"
+#~ msgstr "DMPS выключен"
diff --git a/video-drivers.csv b/video-drivers.csv
new file mode 100644
index 0000000..e79c785
--- /dev/null
+++ b/video-drivers.csv
@@ -0,0 +1,8 @@
+VERSION_ID:DRV_PAСKAGE:DRV_NAME:DRV_DESCRIPTION:DRV_SUPPORT
+:ubm-nvidia-340:nvidia-340:Пакет с модулем драйвера и утилиты NVIDIA 340xx:Драйвер видеокарт nVidia серий 8XXX, 9XXX, 1XX, 2XX, 3XX, 4XX, 5XX, 6XX, 7XX
+:ubm-nvidia-390:nvidia-390:Пакет с модулем драйвера и утилиты NVIDIA 390xx:Драйвер видеокарт nVidia серий 4XX, 5XX, 6XX, 7XX, 9XX, 10XX
+:ubm-nvidia-430:nvidia-430:Пакет с модулем включает в себя драйвер NVIDIA 430xx и утилиты:Драйвер видеокарт nVidia серий 6XX, 7XX, 9XX, 10XX, 16XX
+:ubm-nvidia-470:nvidia-470:Пакет с модулем драйвера и утилиты NVIDIA 470xx:Драйвер видеокарт nVidia серий NVS, Quadro Sync, Quadro NVS, Quadro Blade/Embedded, Quadro, Quadro RTX, NVIDIA RTX
+:ubm-nvidia-510:nvidia-510:Пакет с модулем драйвера и утилиты NVIDIA 510xx:Драйвер видеокарт nVidia серий NVS, Quadro Sync, Quadro NVS, Quadro Blade/Embedded, Quadro, Quadro RTX, NVIDIA RTX
+:ubm-nvidia-515:nvidia-515:Пакет с модулем драйвера и утилиты NVIDIA 515xx:Драйвер видеокарт nVidia серий NVS, Quadro Sync, Quadro NVS, Quadro Blade/Embedded, Quadro, Quadro RTX, NVIDIA RTX
+:ubm-nvidia-optimus:nvidia-optimus:Пакет с модулем включает в себя NVIDIA Optimus: