develop #8

Merged
asmeron merged 20 commits from develop into master 3 years ago

8
.gitignore vendored

@ -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.*

@ -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"

@ -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)

@ -0,0 +1 @@
VERSION 1.0

@ -0,0 +1,327 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="24"
height="24"
version="1.1"
viewBox="0 0 24 24"
id="svg25"
sodipodi:docname="checked.svg"
inkscape:version="1.1.2 (0a00cf5339, 2022-02-04, custom)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview27"
pagecolor="#ffffff"
bordercolor="#999999"
borderopacity="1"
inkscape:pageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
showgrid="false"
inkscape:zoom="14.8125"
inkscape:cx="-4.6919831"
inkscape:cy="9.9578059"
inkscape:window-width="1920"
inkscape:window-height="1027"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg25" />
<defs
id="defs19">
<style
id="current-color-scheme"
type="text/css">.ColorScheme-Text {
color:#31363b;
}
.ColorScheme-Background{
color:#eff0f1;
}
.ColorScheme-ViewText {
color:#31363b;
}
.ColorScheme-ViewBackground{
color:#fcfcfc;
}
.ColorScheme-ViewHover {
color:#3daee9;
}
.ColorScheme-ViewFocus{
color:#3daee9;
}
.ColorScheme-ButtonText {
color:#31363b;
}
.ColorScheme-ButtonBackground{
color:#eff0f1;
}
.ColorScheme-ButtonHover {
color:#3daee9;
}
.ColorScheme-ButtonFocus{
color:#3daee9;
}</style>
<style
type="text/css"
id="style3">.ColorScheme-Text {
color:#31363b;
}
.ColorScheme-Background{
color:#eff0f1;
}
.ColorScheme-ViewText {
color:#31363b;
}
.ColorScheme-ViewBackground{
color:#fcfcfc;
}
.ColorScheme-ViewHover {
color:#3daee9;
}
.ColorScheme-ViewFocus{
color:#3daee9;
}
.ColorScheme-ButtonText {
color:#31363b;
}
.ColorScheme-ButtonBackground{
color:#eff0f1;
}
.ColorScheme-ButtonHover {
color:#3daee9;
}
.ColorScheme-ButtonFocus{
color:#3daee9;
}</style>
<style
type="text/css"
id="style5">.ColorScheme-Text {
color:#31363b;
}
.ColorScheme-Background{
color:#eff0f1;
}
.ColorScheme-ViewText {
color:#31363b;
}
.ColorScheme-ViewBackground{
color:#fcfcfc;
}
.ColorScheme-ViewHover {
color:#3daee9;
}
.ColorScheme-ViewFocus{
color:#3daee9;
}
.ColorScheme-ButtonText {
color:#31363b;
}
.ColorScheme-ButtonBackground{
color:#eff0f1;
}
.ColorScheme-ButtonHover {
color:#3daee9;
}
.ColorScheme-ButtonFocus{
color:#3daee9;
}</style>
<style
type="text/css"
id="style7">.ColorScheme-Text {
color:#31363b;
}
.ColorScheme-Background{
color:#eff0f1;
}
.ColorScheme-ViewText {
color:#31363b;
}
.ColorScheme-ViewBackground{
color:#fcfcfc;
}
.ColorScheme-ViewHover {
color:#3daee9;
}
.ColorScheme-ViewFocus{
color:#3daee9;
}
.ColorScheme-ButtonText {
color:#31363b;
}
.ColorScheme-ButtonBackground{
color:#eff0f1;
}
.ColorScheme-ButtonHover {
color:#3daee9;
}
.ColorScheme-ButtonFocus{
color:#3daee9;
}</style>
<style
type="text/css"
id="style9">.ColorScheme-Text {
color:#31363b;
}
.ColorScheme-Background{
color:#eff0f1;
}
.ColorScheme-ViewText {
color:#31363b;
}
.ColorScheme-ViewBackground{
color:#fcfcfc;
}
.ColorScheme-ViewHover {
color:#3daee9;
}
.ColorScheme-ViewFocus{
color:#3daee9;
}
.ColorScheme-ButtonText {
color:#31363b;
}
.ColorScheme-ButtonBackground{
color:#eff0f1;
}
.ColorScheme-ButtonHover {
color:#3daee9;
}
.ColorScheme-ButtonFocus{
color:#3daee9;
}</style>
<style
type="text/css"
id="style11">.ColorScheme-Text {
color:#31363b;
}
.ColorScheme-Background{
color:#eff0f1;
}
.ColorScheme-ViewText {
color:#31363b;
}
.ColorScheme-ViewBackground{
color:#fcfcfc;
}
.ColorScheme-ViewHover {
color:#3daee9;
}
.ColorScheme-ViewFocus{
color:#3daee9;
}
.ColorScheme-ButtonText {
color:#31363b;
}
.ColorScheme-ButtonBackground{
color:#eff0f1;
}
.ColorScheme-ButtonHover {
color:#3daee9;
}
.ColorScheme-ButtonFocus{
color:#3daee9;
}</style>
<style
type="text/css"
id="style13">.ColorScheme-Text {
color:#31363b;
}
.ColorScheme-Background{
color:#eff0f1;
}
.ColorScheme-ViewText {
color:#31363b;
}
.ColorScheme-ViewBackground{
color:#fcfcfc;
}
.ColorScheme-ViewHover {
color:#3daee9;
}
.ColorScheme-ViewFocus{
color:#3daee9;
}
.ColorScheme-ButtonText {
color:#31363b;
}
.ColorScheme-ButtonBackground{
color:#eff0f1;
}
.ColorScheme-ButtonHover {
color:#3daee9;
}
.ColorScheme-ButtonFocus{
color:#3daee9;
}</style>
<style
type="text/css"
id="style15">.ColorScheme-Text {
color:#31363b;
}
.ColorScheme-Background{
color:#eff0f1;
}
.ColorScheme-ViewText {
color:#31363b;
}
.ColorScheme-ViewBackground{
color:#fcfcfc;
}
.ColorScheme-ViewHover {
color:#3daee9;
}
.ColorScheme-ViewFocus{
color:#3daee9;
}
.ColorScheme-ButtonText {
color:#31363b;
}
.ColorScheme-ButtonBackground{
color:#eff0f1;
}
.ColorScheme-ButtonHover {
color:#3daee9;
}
.ColorScheme-ButtonFocus{
color:#3daee9;
}</style>
<style
type="text/css"
id="style17">.ColorScheme-Text {
color:#31363b;
}
.ColorScheme-Background{
color:#eff0f1;
}
.ColorScheme-ViewText {
color:#31363b;
}
.ColorScheme-ViewBackground{
color:#fcfcfc;
}
.ColorScheme-ViewHover {
color:#3daee9;
}
.ColorScheme-ViewFocus{
color:#3daee9;
}
.ColorScheme-ButtonText {
color:#31363b;
}
.ColorScheme-ButtonBackground{
color:#eff0f1;
}
.ColorScheme-ButtonHover {
color:#3daee9;
}
.ColorScheme-ButtonFocus{
color:#3daee9;
}</style>
</defs>
<path
id="path21"
d="M 12 1 C 5.906 1 1 5.906 1 12 C 1 18.094 5.906 23 12 23 C 18.094 23 23 18.094 23 12 C 23 5.906 18.094 1 12 1 z M 15.480469 8.9042969 C 16.392469 8.8782969 16.860031 9.9850937 16.207031 10.621094 L 11 15.828125 L 8.09375 12.921875 C 7.11175 11.979875 8.5648125 10.525813 9.5078125 11.507812 L 11 13 L 14.792969 9.2070312 A 1 1 0 0 1 15.480469 8.9042969 z "
style="fill:#4d4d4d;fill-opacity:1" />
</svg>

After

Width:  |  Height:  |  Size: 7.4 KiB

@ -0,0 +1,142 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
id="Apps-Visual-Studio-Code"
width="64"
height="44"
enable-background="new 0 0 1024 1024"
image-rendering="optimizeSpeed"
version="1.1"
viewBox="0 0 64 44"
sodipodi:docname="display.svg"
inkscape:version="1.1.2 (0a00cf5339, 2022-02-04, custom)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<sodipodi:namedview
id="namedview44"
pagecolor="#ffffff"
bordercolor="#999999"
borderopacity="1"
inkscape:pageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
showgrid="false"
showguides="false"
inkscape:zoom="8"
inkscape:cx="43.4375"
inkscape:cy="25.9375"
inkscape:window-width="1920"
inkscape:window-height="1027"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="Apps-Visual-Studio-Code" />
<metadata
id="metadata2">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs23">
<style
type="text/css"
id="style4" />
<style
type="text/css"
id="style6" />
<linearGradient
id="linearGradient29240"
x1="32"
x2="32"
y1="44"
y2="52"
gradientTransform="matrix(0.79998,0,0,1,6.4007,0)"
gradientUnits="userSpaceOnUse">
<stop
stop-color="#818990"
offset="0"
id="stop8" />
<stop
stop-color="#9fa8b0"
offset="1"
id="stop10" />
</linearGradient>
<linearGradient
id="linearGradient1455"
x1="4"
x2="60"
y1="27"
y2="27"
gradientTransform="matrix(1.1428571,0,0,1.2064,-4.5714261,-10.571427)"
gradientUnits="userSpaceOnUse">
<stop
stop-color="#555a5f"
offset="0"
id="stop13" />
<stop
stop-color="#4b4f53"
offset="1"
id="stop15" />
</linearGradient>
<linearGradient
id="linearGradient17498"
x1="15.408"
x2="60"
y1="19"
y2="45"
gradientTransform="matrix(1.1020342,0,0,1.1428571,-3.2653701,-8.8571417)"
gradientUnits="userSpaceOnUse">
<stop
stop-color="#0082e5"
offset="0"
id="stop18"
style="stop-color:#2ea4ff;stop-opacity:1" />
<stop
stop-color="#42b7ff"
offset="1"
id="stop20"
style="stop-color:#85cfff;stop-opacity:1" />
</linearGradient>
</defs>
<g
id="g3308">
<rect
x="1.2e-06"
y="0.2857151"
width="63.999996"
height="43.42857"
ry="0"
fill="url(#linearGradient1455)"
stroke-width="0.939337"
id="rect33"
style="fill:url(#linearGradient1455);stroke-linecap:round;stroke-linejoin:round" />
<rect
x="1.1428583"
y="1.4285722"
width="61.714283"
height="41.142857"
ry="0"
fill="url(#linearGradient17498)"
stroke-width="0.897806"
id="rect35"
style="fill:url(#linearGradient17498);stroke-linecap:round;stroke-linejoin:round" />
<path
d="M 1.1428583,1.4285722 H 41.142857 L 12.571429,42.571428 H 1.1428583 Z"
color="#000000"
fill="#ffffff"
opacity="0.15"
stroke-width="0.897806"
style="stroke-linecap:round;stroke-linejoin:round;-inkscape-stroke:none;opacity:0.32"
id="path39" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.9 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 263 KiB

@ -0,0 +1,55 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
viewBox="0 0 24 24"
id="svg2"
version="1.1"
inkscape:version="1.1.2 (0a00cf5339, 2022-02-04, custom)"
sodipodi:docname="warning.svg"
width="24"
height="24"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<metadata
id="metadata12">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs10" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1920"
inkscape:window-height="1027"
id="namedview8"
showgrid="false"
inkscape:zoom="18.96875"
inkscape:cx="5.4827018"
inkscape:cy="9.3047776"
inkscape:current-layer="svg2"
inkscape:pagecheckerboard="0"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1" />
<path
id="path4136-2"
style="opacity:1;fill:#4d4d4d;fill-opacity:1"
d="M 11.292969 1.0234375 A 11 11.000002 86.311656 0 0 1.0234375 12.707031 A 11 11.000002 86.311656 0 0 12.707031 22.976562 A 11 11.000002 86.311656 0 0 22.976562 11.292969 A 11 11.000002 86.311656 0 0 11.292969 1.0234375 z M 11.996094 6 L 12.003906 6 C 12.556173 6 13 6.4439 13 6.9960938 L 13 14.003906 C 13 14.556325 12.556173 15 12.003906 15 L 11.996094 15 C 11.443827 15 11 14.556325 11 14.003906 L 11 6.9960938 C 11 6.4439 11.443827 6 11.996094 6 z M 12 17 C 12.554 17 13 17.446 13 18 C 13 18.554 12.554 19 12 19 C 11.446 19 11 18.554 11 18 C 11 17.446 11.446 17 12 17 z " />
</svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

@ -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
1 640x480 4:3 VGA
2 800x480 5:3 WVGA
3 800x600 4:3 SVGA
4 854x480 16:9 FWVGA
5 960x540 19:9 qHD
6 1024x600 128:75 WSVGA
7 1024x768 4:3 XGA
8 1152x864 4:3 XGA+
9 1200x600 2:1 WXVGA
10 1280x720 16:9 HD
11 1280x768 5:3 WSGA
12 1280x1024 5:4 SXGA
13 1440x900 16:10 WXGA+
14 1400x1050 4:3 SXGA+
15 1440x1080 4:3 HDV 1080
16 1536x960 16:10 XJXGA
17 1536x1024 3:2 WSXGA
18 1600x900 16:9 HD+
19 1600x1024 25:16 WSXGA
20 1600x1200 4:3 UXGA
21 1680x1050 16:10 WSXGA+
22 1920x1080 16:9 FHD
23 1920x1200 16:10 WUXGA
24 2048x1080 19:10 2K DCI
25 2048x1152 16:9 QWXGA
26 2560x1080 21:9 UWHD
27 2560x1440 16:9 QHD

@ -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)

@ -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")

File diff suppressed because it is too large Load Diff

@ -0,0 +1,311 @@
#include <gtk/gtk.h>
#include <gtk/gtkx.h>
#include <locale.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <libintl.h>
#include <sys/types.h>
#include <fcntl.h>
#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

@ -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&&dividepos){
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;i<size;i++){
if (parameters[i]){
if (strcmp(parameters[i],param)==0)
return i;
} else return -1;
}
return -1;
}
// parsing functions
apps *yon_apps_scan_and_parse_desktops(int *sizef)
{
int size = 0;
struct apps *applist;
{
DIR *directory = opendir(DesktopPath);
struct dirent *de;
while ((de = readdir(directory)))
{
FILE *file;
char *path = yon_char_get_augumented(DesktopPath, de->d_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&&parameters){
for (int i=0;i<size;i++){
gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combo),parameters[i]);
}
return 1;
} else
return 0;
}
int yon_gtk_combo_box_text_find(GtkWidget *combo_box, char *text_to_find){
if (combo_box&&text_to_find){
int active=gtk_combo_box_get_active(GTK_COMBO_BOX(combo_box));
char *str="-1";
for (int i=0;strcmp(str,"")!=0;i++){
gtk_combo_box_set_active(GTK_COMBO_BOX(combo_box),i);
str=gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(combo_box));
if (!str) return -1;
if (strcmp(text_to_find,str)==0) return i;
}
} return -1;
}
int yon_dictionary_gtk_pack_start_multiple_widgets(dictionary *dict, GtkWidget *destination, gboolean expand, gboolean fill, int padding)
{
if (dict){
for (dictionary *dct = dict->first; 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

@ -0,0 +1,197 @@
#ifndef UBL_UTILS
#define UBL_UTILS
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <pthread.h>
#include <string.h>
#include <dirent.h>
#include <locale.h>
#include <gtk/gtk.h>
#include <gtk/gtkx.h>
#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

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

@ -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;
}

@ -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;

File diff suppressed because it is too large Load Diff

@ -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 <info@ublinux.com>, 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 <info@ublinux.com>\n"
"Language-Team: Russian - UBLinux Team <info@ublinux.com>\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 ""

@ -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 <info@ublinux.com>, 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 <info@ublinux.com>\n"
"Language-Team: Russian - UBLinux Team <info@ublinux.com>\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 выключен"

@ -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:
1 VERSION_ID:DRV_PAСKAGE:DRV_NAME:DRV_DESCRIPTION:DRV_SUPPORT
2 :ubm-nvidia-340:nvidia-340:Пакет с модулем драйвера и утилиты NVIDIA 340xx:Драйвер видеокарт nVidia серий 8XXX, 9XXX, 1XX, 2XX, 3XX, 4XX, 5XX, 6XX, 7XX
3 :ubm-nvidia-390:nvidia-390:Пакет с модулем драйвера и утилиты NVIDIA 390xx:Драйвер видеокарт nVidia серий 4XX, 5XX, 6XX, 7XX, 9XX, 10XX
4 :ubm-nvidia-430:nvidia-430:Пакет с модулем включает в себя драйвер NVIDIA 430xx и утилиты:Драйвер видеокарт nVidia серий 6XX, 7XX, 9XX, 10XX, 16XX
5 :ubm-nvidia-470:nvidia-470:Пакет с модулем драйвера и утилиты NVIDIA 470xx:Драйвер видеокарт nVidia серий NVS, Quadro Sync, Quadro NVS, Quadro Blade/Embedded, Quadro, Quadro RTX, NVIDIA RTX
6 :ubm-nvidia-510:nvidia-510:Пакет с модулем драйвера и утилиты NVIDIA 510xx:Драйвер видеокарт nVidia серий NVS, Quadro Sync, Quadro NVS, Quadro Blade/Embedded, Quadro, Quadro RTX, NVIDIA RTX
7 :ubm-nvidia-515:nvidia-515:Пакет с модулем драйвера и утилиты NVIDIA 515xx:Драйвер видеокарт nVidia серий NVS, Quadro Sync, Quadro NVS, Quadro Blade/Embedded, Quadro, Quadro RTX, NVIDIA RTX
8 :ubm-nvidia-optimus:nvidia-optimus:Пакет с модулем включает в себя NVIDIA Optimus:
Loading…
Cancel
Save