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 +``` + +![alt text](screenshot/screenshot.png) 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 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + 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 @@ + + + + + + image/svg+xml + + + + + + + + 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 + False + + + True + False + Load from global configuration + True + + + + + + True + False + Load from local configuration + True + + + + + + True + False + False + + + True + False + Save to global an local configuration + True + + + + + + True + False + Save to global configuration + True + + + + + + True + False + Save to local configuration + True + + + + + + + True + False + False + + + True + False + Documentation + True + + + + + + True + False + About + True + + + + + + + False + О Программе + False + True + center + com.ublinux.ubl-settings-video + dialog + True + ubl-settings-video + 1.2 + Copyright © 2023 - UBSoft Software LLC + Settings for video output + https://ublinux.ru/ + Project Home Page + Это приложение распространяется без каких-либо гарантий. +Подробнее в <a href="https://www.gnu.org/licenses/old-licenses/gpl-2.0.html">GNU General Public License, версии 2 или позднее</a>. + UBGroup + UBGroup + com.ublinux.ubl-settings-video + True + gpl-2-0 + + + False + vertical + 2 + + + False + False + top + spread + + + False + False + 0 + + + + + + + + + + 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 + + + True + False + True + True + image1 + + + False + True + 0 + + + + + True + False + True + True + image2 + + + 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 + + + + + + + True + False + True + + + True + False + start + 5 + 5 + 5 + 5 + False + UBlinux Video Configuration + + + + + + + + True + False + 5 + 5 + 5 + 5 + 32 + com.ublinux.ubl-settings-video + + + + + True + False + + + True + True + False + True + LoadConfigurationMenu + none + + + True + False + + + True + False + 5 + 5 + 5 + 5 + Load + + + False + True + 0 + + + + + True + False + pan-down-symbolic + + + False + True + 1 + + + + + + + False + True + 0 + + + + + 1 + + + + + True + False + + + True + True + False + True + True + SaveConfigurationMenu + none + + + True + False + + + True + False + 5 + 5 + 5 + 5 + Save + + + + False + True + 0 + + + + + True + False + pan-down-symbolic + + + False + True + 1 + + + + + + + False + True + 0 + + + + + True + True + False + True + True + SettingsMenu + none + + + + + + False + True + 1 + + + + + end + 3 + + + + + + + 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: