Interface reworking process

pull/7/head
parent 90adeb3bca
commit c6ed130169

2
.gitignore vendored

@ -7,3 +7,5 @@ compile/
terminal-commands/ terminal-commands/
source/ubl-cmake.h source/ubl-cmake.h
vgcore* vgcore*
.install.sh
ubl-settings-generator

@ -12,6 +12,7 @@ DEPENDS = /bin/cmake
PREFIX ?= /usr/local PREFIX ?= /usr/local
PKGNAME = $(MAKEFILE_DIR) PKGNAME = $(MAKEFILE_DIR)
FILE_VER = source/${PKGNAME}.h FILE_VER = source/${PKGNAME}.h
PKGIDENT=$(subst /,-,${PREFIX})
default_target: all default_target: all
@ -23,6 +24,11 @@ init:
@echo "Initialize ..."; \ @echo "Initialize ..."; \
if [ -d ".git" ]; then \ if [ -d ".git" ]; then \
LATEST_TAG=$$(git describe --abbrev=0 --tags | sed 's/^v//'); \ LATEST_TAG=$$(git describe --abbrev=0 --tags | sed 's/^v//'); \
if [ -z "$${LATEST_TAG}" ]; \
then \
LATEST_TAG=$$"0.0"; \
echo "$${LATEST_TAG} is empty"; \
fi; \
else \ else \
LATEST_TAG="Development"; \ LATEST_TAG="Development"; \
fi; \ fi; \
@ -74,7 +80,7 @@ uninstall:
@for FILE_PO in $(wildcard *.po); do \ @for FILE_PO in $(wildcard *.po); do \
LANG=$${FILE_PO##*_};LANG=$${LANG%.*}; \ LANG=$${FILE_PO##*_};LANG=$${LANG%.*}; \
FILE_MO=$${FILE_PO##*/}; FILE_MO="$${FILE_MO%_*.po}.mo"; \ FILE_MO=$${FILE_PO##*/}; FILE_MO="$${FILE_MO%_*.po}.mo"; \
PATH_FILE_MO="${DESTDIR}${PREFIX}/share/locale/$${LANG}/LC_MESSAGES/$${FILE_MO}"; \ PATH_FILE_MO="${DESTDIR}/usr/share/locale/$${LANG}/LC_MESSAGES/$${FILE_MO}"; \
$(RM) "$${PATH_FILE_MO}"; \ $(RM) "$${PATH_FILE_MO}"; \
done done
@for SIZE in 16x16 32x32 48x48 scalable; do \ @for SIZE in 16x16 32x32 48x48 scalable; do \
@ -89,7 +95,7 @@ uninstall:
@$(RM) "${DESTDIR}${PREFIX}/bin/${PKGNAME}" @$(RM) "${DESTDIR}${PREFIX}/bin/${PKGNAME}"
@$(RM) "${DESTDIR}${PREFIX}/share/applications/${PKGNAME}.desktop" @$(RM) "${DESTDIR}${PREFIX}/share/applications/${PKGNAME}.desktop"
@$(RM) "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/apps/com.ublinux.${PKGNAME}.svg" @$(RM) "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/apps/com.ublinux.${PKGNAME}.svg"
@$(RM) "${DESTDIR}/usr/share/polkit-1/actions/com.ublinux.${PKGNAME}.policy" @$(RM) "${DESTDIR}/usr/share/polkit-1/actions/com.ublinux.${PKGNAME}${PKGIDENT}.policy"
@if [ -z ${DESTDIR} ]; then \ @if [ -z ${DESTDIR} ]; then \
[ -d "${DESTDIR}${PREFIX}/share/icons/hicolor/" ] && gtk-update-icon-cache -fiq "${DESTDIR}${PREFIX}/share/icons/hicolor/" &>/dev/null || true; \ [ -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; \ update-desktop-database --quiet &>/dev/null || true; \
@ -101,9 +107,9 @@ install: check uninstall
@echo "Install ..." @echo "Install ..."
@for FILE_PO in $(wildcard *.po); do \ @for FILE_PO in $(wildcard *.po); do \
LANG=$${FILE_PO##*_};LANG=$${LANG%.*}; \ LANG=$${FILE_PO##*_};LANG=$${LANG%.*}; \
install -dm755 "${DESTDIR}${PREFIX}/share/locale/$${LANG}/LC_MESSAGES"; \ install -dm755 "${DESTDIR}/usr/share/locale/$${LANG}/LC_MESSAGES"; \
FILE_MO=$${FILE_PO##*/}; FILE_MO="$${FILE_MO%_*.po}.mo"; \ FILE_MO=$${FILE_PO##*/}; FILE_MO="$${FILE_MO%_*.po}.mo"; \
PATH_FILE_MO="${DESTDIR}${PREFIX}/share/locale/$${LANG}/LC_MESSAGES/$${FILE_MO}"; \ PATH_FILE_MO="${DESTDIR}/usr/share/locale/$${LANG}/LC_MESSAGES/$${FILE_MO}"; \
echo "$${FILE_PO}"; \ echo "$${FILE_PO}"; \
msgfmt "$${FILE_PO}" -v -f -o "$${PATH_FILE_MO}"; \ msgfmt "$${FILE_PO}" -v -f -o "$${PATH_FILE_MO}"; \
done done
@ -112,16 +118,28 @@ install: check uninstall
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"; \ 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 done
@install -Dm644 -t "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/apps/" "com.ublinux.${PKGNAME}.svg" @install -Dm644 -t "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/apps/" "com.ublinux.${PKGNAME}.svg"
@install -Dm644 -t "${DESTDIR}/usr/share/polkit-1/actions/" "com.ublinux.${PKGNAME}.policy" @cp ./com.ublinux.${PKGNAME}.policy ./compile/com.ublinux.${PKGNAME}${PKGIDENT}.policy
@sed -e 's+/usr/bin+${PREFIX}/bin+' -e 's+.run+${PKGIDENT}.run+g' ./compile/com.ublinux.${PKGNAME}${PKGIDENT}.policy -i
@install -Dm755 -t "${DESTDIR}${PREFIX}/bin/" "${CMAKE_BUILD_DIR}/${PKGNAME}" @install -Dm755 -t "${DESTDIR}${PREFIX}/bin/" "${CMAKE_BUILD_DIR}/${PKGNAME}"
@install -Dm644 -t "${DESTDIR}${PREFIX}/share/applications/" "${PKGNAME}.desktop" @install -Dm644 -t "${DESTDIR}${PREFIX}/share/applications/" "${PKGNAME}.desktop"
@install -Dm644 -t "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/status/" "com.ublinux.${PKGNAME}.checked.svg" @install -Dm644 -t "${DESTDIR}/usr/share/icons/hicolor/scalable/status/" "icons/com.ublinux.${PKGNAME}.checked.svg"
@install -Dm644 -t "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/status/" "com.ublinux.${PKGNAME}.warning.svg" @install -Dm644 -t "${DESTDIR}/usr/share/icons/hicolor/scalable/status/" "icons/com.ublinux.${PKGNAME}.warning.svg"
@sed -e 's+/usr/bin+${PREFIX}/bin+g' -i ${DESTDIR}/usr/share/polkit-1/actions/com.ublinux.${PKGNAME}.policy @install -Dm644 -t "${DESTDIR}/usr/share/icons/hicolor/scalable/status/" "icons/com.ublinux.${PKGNAME}.increase-symbolic.svg"
@install -Dm644 -t "${DESTDIR}/usr/share/icons/hicolor/scalable/status/" "icons/com.ublinux.${PKGNAME}.profile-symbolic.svg"
@install -Dm644 -t "${DESTDIR}/usr/share/icons/hicolor/scalable/status/" "icons/com.ublinux.${PKGNAME}.settings-symbolic.svg"
@install -Dm644 -t "${DESTDIR}/usr/share/icons/hicolor/scalable/status/" "icons/com.ublinux.${PKGNAME}.sync-symbolic.svg"
@install -Dm644 -t "${DESTDIR}/usr/share/icons/hicolor/scalable/status/" "icons/com.ublinux.${PKGNAME}.trash-symbolic.svg"
@install -Dm644 -t "${DESTDIR}/usr/share/icons/hicolor/scalable/status/" "icons/com.ublinux.${PKGNAME}.view-symbolic.svg"
@install -Dm644 -t "${DESTDIR}/usr/share/icons/hicolor/scalable/status/" "icons/com.ublinux.${PKGNAME}.edit-symbolic.svg"
@install -Dm644 -t "${DESTDIR}/usr/share/icons/hicolor/scalable/status/" "icons/com.ublinux.${PKGNAME}.group-symbolic.svg"
@install -Dm644 -t "${DESTDIR}/usr/share/icons/hicolor/scalable/status/" "icons/com.ublinux.${PKGNAME}.zoom-symbolic.svg"
@install -Dm644 -t "${DESTDIR}/usr/share/icons/hicolor/scalable/status/" "icons/com.ublinux.${PKGNAME}.calendar-symbolic.svg"
@install -Dm644 -t "${DESTDIR}/usr/share/icons/hicolor/scalable/status/" "icons/com.ublinux.${PKGNAME}.profile-settings-symbolic.svg"
@install -Dm644 -t "${DESTDIR}/usr/share/polkit-1/actions/" "${CMAKE_BUILD_DIR}/com.ublinux.${PKGNAME}${PKGIDENT}.policy"
@if [ -z ${DESTDIR} ]; then \ @if [ -z ${DESTDIR} ]; then \
[ -d "${DESTDIR}${PREFIX}/share/icons/hicolor/" ] && gtk-update-icon-cache -fiq "${DESTDIR}${PREFIX}/share/icons/hicolor/" &>/dev/null || true; \ [ -d "${DESTDIR}/usr/share/icons/hicolor/" ] && gtk-update-icon-cache -fiq "${DESTDIR}/usr/share/icons/hicolor/" &>/dev/null || true; \
update-desktop-database --quiet &>/dev/null || true; \ update-desktop-database --quiet &>/dev/null || true; \
[ -d "${DESTDIR}${PREFIX}/share/applications" ] && touch "${DESTDIR}${PREFIX}/share/applications" &>/dev/null || true; \ [ -d "${DESTDIR}$/usr/share/applications" ] && touch "${DESTDIR}/usr/share/applications" &>/dev/null || true; \
fi fi
@echo "Install: OK" @echo "Install: OK"

@ -2,8 +2,12 @@
<gresources> <gresources>
<gresource prefix="/com/ublinux/ui"> <gresource prefix="/com/ublinux/ui">
<file>ubl-settings-usergroups.glade</file> <file>ubl-settings-usergroups.glade</file>
<file>ubl-settings-usergroups-group-creation.glade</file>
<file>ubl-settings-usergroups-additional-settings.glade</file>
<file>ubl-settings-usergroups-password.glade</file>
<file>ubl-settings-usergroups-group.glade</file> <file>ubl-settings-usergroups-group.glade</file>
<file>ubl-settings-usergroups-user.glade</file> <file>ubl-settings-usergroups-user.glade</file>
<file>ubl-settings-usergroups-system.glade</file>
</gresource> </gresource>
<gresource prefix="/com/ublinux/css"> <gresource prefix="/com/ublinux/css">
<file>ubl-settings-usergroups.css</file> <file>ubl-settings-usergroups.css</file>

@ -0,0 +1,47 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="48"
height="48"
viewBox="0 0 12.7 12.7"
version="1.1"
id="svg1028"
inkscape:version="1.1.2 (0a00cf5339, 2022-02-04, custom)"
sodipodi:docname="com.ublinux.ubl-settings-usergroups.calendar-symbolic.svg"
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="namedview1030"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:document-units="mm"
showgrid="false"
units="px"
inkscape:zoom="8"
inkscape:cx="12.1875"
inkscape:cy="26.125"
inkscape:window-width="1920"
inkscape:window-height="1023"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="layer1" />
<defs
id="defs1025" />
<g
inkscape:label="Слой 1"
inkscape:groupmode="layer"
id="layer1">
<path
id="rect1439"
style="fill:#333333;stroke-width:0.305355"
d="M 2.6471148,0.45629283 V 2.0328102 H 0.68318058 V 11.814123 H 11.922101 V 2.0328102 H 9.8737776 V 0.45629283 H 8.2493132 V 2.0328102 H 4.2715795 V 0.45629283 Z M 8.4666759,0.67301605 H 9.6417113 V 3.3516891 H 8.4666759 Z m -5.6015595,6.382e-4 H 4.0395132 V 3.3523274 H 2.8651164 Z M 1.6133643,4.1757477 H 3.5248754 V 6.0878983 H 1.6133643 Z m 2.5476163,0 H 6.0724917 V 6.0878983 H 4.1609806 Z m 2.5329122,0 H 8.6054042 V 6.0878983 H 6.6938928 Z m 2.5277979,0 H 11.133842 V 6.0878983 H 9.2216907 Z M 1.6133643,6.6587943 H 3.5248754 V 8.5703057 H 1.6133643 Z m 2.5476163,0 H 6.0724917 V 8.5703057 H 4.1609806 Z m 2.5329122,0 H 8.6054042 V 8.5703057 H 6.6938928 Z m 2.5277979,0 H 11.133842 V 8.5703057 H 9.2216907 Z M 1.6133643,9.1354483 H 3.5248754 V 11.046959 H 1.6133643 Z m 2.5476163,0 H 6.0724917 V 11.046959 H 4.1609806 Z m 2.5329122,0 H 8.6054042 V 11.046959 H 6.6938928 Z m 2.5277979,0 H 11.133842 V 11.046959 H 9.2216907 Z" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

Before

Width:  |  Height:  |  Size: 7.4 KiB

After

Width:  |  Height:  |  Size: 7.4 KiB

@ -0,0 +1,40 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="16"
height="16"
version="1.1"
id="svg1352"
sodipodi:docname="com.ublinux.ubl-settings-logging.decrease-symbolic.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">
<defs
id="defs1356" />
<sodipodi:namedview
id="namedview1354"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
showgrid="false"
inkscape:zoom="45.4375"
inkscape:cx="7.9889959"
inkscape:cy="7.9889959"
inkscape:window-width="1920"
inkscape:window-height="1023"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg1352" />
<path
d="M3 7h10v2H3z"
style="marker:none"
color="#bebebe"
overflow="visible"
fill="#2e3436"
id="path1350" />
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg height="16px" viewBox="0 0 16 16" width="16px" xmlns="http://www.w3.org/2000/svg">
<path d="m 12.628906 0.664062 c -0.203125 0 -0.402344 0.074219 -0.554687 0.230469 l -1.769531 1.765625 l 3.050781 3.054688 l 1.769531 -1.769532 c 0.308594 -0.308593 0.308594 -0.804687 0 -1.109374 l -1.941406 -1.941407 c -0.15625 -0.15625 -0.355469 -0.230469 -0.554688 -0.230469 z m -3.109375 2.765626 l -8.519531 8.570312 v 3 h 3 l 8.519531 -8.570312 z m 0 0" fill="#2e3436" fill-rule="evenodd"/>
</svg>

After

Width:  |  Height:  |  Size: 535 B

@ -0,0 +1,47 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="48"
height="48"
viewBox="0 0 12.7 12.7"
version="1.1"
id="svg1028"
inkscape:version="1.1.2 (0a00cf5339, 2022-02-04, custom)"
sodipodi:docname="com.ublinux.ubl-settings-usergroups.group-symbolic.svg"
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="namedview1030"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:document-units="mm"
showgrid="false"
units="px"
inkscape:zoom="8"
inkscape:cx="34.4375"
inkscape:cy="30.125"
inkscape:window-width="1920"
inkscape:window-height="1023"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="layer1" />
<defs
id="defs1025" />
<g
inkscape:label="Слой 1"
inkscape:groupmode="layer"
id="layer1">
<path
id="path4144"
style="color:#bebebe;display:inline;overflow:visible;visibility:visible;fill:#2e3436;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.885971;marker:none;enable-background:accumulate"
d="m 3.2793863,1.543 c -0.7951237,0 -1.4397053,0.6445813 -1.4397053,1.4397053 0,0.7951237 0.6445816,1.4397053 1.4397053,1.4397053 0.2821355,0 0.5452398,-0.081451 0.7673951,-0.221692 C 4.0100392,4.0395482 3.990454,3.8718093 3.990454,3.6994573 3.990454,3.1474809 4.1901387,2.642262 4.5201374,2.2520005 4.2697003,1.8276557 3.8077925,1.5429997 3.2793863,1.543 Z m 6.2001383,0 c -0.6332135,0 -1.1704828,0.4091278 -1.3632243,0.9772012 0.2118487,0.3424113 0.3343465,0.7465423 0.3343465,1.1792561 0,0.092318 -0.00572,0.1829472 -0.016536,0.2723349 0.262428,0.2773584 0.633444,0.4506184 1.0454142,0.4506184 0.795124,0 1.439705,-0.6445816 1.439705,-1.4397053 0,-0.795124 -0.644581,-1.4397056 -1.4397054,-1.4397053 z M 6.2202922,1.54456 c -1.143644,0 -2.0706747,0.956845 -2.0706747,2.1368205 0,1.1799755 0.9270307,2.1363035 2.0706747,2.1363038 1.1436437,0 2.0706744,-0.9563283 2.0706746,-2.1363038 C 8.2909668,2.501405 7.3639359,1.54456 6.2202922,1.54456 Z M 2.5595337,4.9024847 c -1.1963922,0 -2.15955811,0.9631642 -2.15955811,2.1595579 v 0.719853 c 0,0.4798999 0.48007405,0.4795572 0.48007405,0.4795572 H 2.2660115 C 2.855772,7.312625 3.9047898,6.6837713 5.1056314,6.6837713 H 6.1252075 C 6.0754582,6.4000096 5.9708652,6.1360221 5.8223835,5.9024236 5.2124673,5.7920326 4.6887185,5.4321821 4.3594236,4.9324569 4.2422733,4.9129331 4.1220995,4.9024847 3.9992389,4.9024847 Z m 6.2001383,0 c -0.2638566,0 -0.5164873,0.046943 -0.749825,0.1328084 C 7.75772,5.3748627 7.4120255,5.6402951 7.0109415,5.7928697 6.8228847,6.0520278 6.690906,6.3547132 6.6331866,6.6837713 h 0.7027995 c 1.2010514,0 2.2499172,0.629095 2.8396199,1.5781983 h 1.703255 c 0,0 0.480075,-1.741e-4 0.480075,-0.480074 v -0.719853 c 0,-1.1963937 -0.963165,-2.1595579 -2.159559,-2.1595579 z M 5.1852131,6.8460352 c -1.7207973,0 -3.1062702,1.1132468 -3.1062702,2.8887128 V 10.8029 c 0,0.712178 0.6903971,0.712101 0.6903971,0.712101 h 6.9024211 c 0,0 0.6898799,7.7e-5 0.6898799,-0.712101 V 9.734748 c 0,-1.775466 -1.3849541,-2.8887128 -3.1057533,-2.8887128 z" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.4 KiB

@ -0,0 +1,40 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="16"
height="16"
version="1.1"
id="svg1162"
sodipodi:docname="com.ublinux.ubl-settings-logging.increase-symbolic.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">
<defs
id="defs1166" />
<sodipodi:namedview
id="namedview1164"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
showgrid="false"
inkscape:zoom="45.4375"
inkscape:cx="7.9889959"
inkscape:cy="7.9889959"
inkscape:window-width="1920"
inkscape:window-height="1023"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg1162" />
<path
style="marker:none"
d="M7 3v4H3v2h4v4h2V9h4V7H9V3z"
color="#bebebe"
overflow="visible"
fill="#2e3436"
id="path1160" />
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

@ -0,0 +1,53 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="48"
height="48"
viewBox="0 0 12.7 12.7"
version="1.1"
id="svg1028"
inkscape:version="1.1.2 (0a00cf5339, 2022-02-04, custom)"
sodipodi:docname="com.ublinux.ubl-settings-usergroups.profile-settings-symbolic.svg"
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="namedview1030"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:document-units="mm"
showgrid="false"
units="px"
inkscape:zoom="5.6568543"
inkscape:cx="6.098796"
inkscape:cy="29.698485"
inkscape:window-width="1920"
inkscape:window-height="1023"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="layer1" />
<defs
id="defs1025" />
<g
inkscape:label="Слой 1"
inkscape:groupmode="layer"
id="layer1">
<path
id="path4144"
style="color:#bebebe;display:inline;overflow:visible;visibility:visible;fill:#2e3436;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5.15293;marker:none;enable-background:accumulate"
d="m 28.845703,5.6699219 c -4.624559,0 -8.373047,3.748488 -8.373047,8.3730471 0,4.624558 3.748488,8.373047 8.373047,8.373047 4.624556,0 8.373047,-3.748489 8.373047,-8.373047 0,-4.6245591 -3.748491,-8.3730471 -8.373047,-8.3730471 z m -4.1875,19.5371091 c -2.530148,0 -4.880296,0.742341 -6.847656,2.019531 0.183931,0.717098 0.465323,1.214574 1.355469,0.839844 3.221994,-1.583811 5.226402,2.142941 6.138672,4.650391 0.633999,1.895897 -1.396782,2.997482 -2.021485,4.296875 1.816695,1.213244 2.783132,3.672793 1.3125,5.603516 -0.303999,0.768494 -0.771796,1.523101 -1.353515,2.128906 h 19.558593 c 0,0 2.791016,1.54e-4 2.791016,-2.791016 v -4.1875 c 0,-6.958407 -5.602142,-12.560547 -12.560547,-12.560547 z"
transform="scale(0.26458333)"
sodipodi:nodetypes="sssssscccccccssss" />
<path
d="m 6.1654455,8.763044 c 0.035522,0.096576 0.00555,0.2042531 -0.071044,0.2730777 L 5.6137396,9.4734904 c 0.012206,0.092133 0.018871,0.1864921 0.018871,0.2819582 0,0.095466 -0.00667,0.1898218 -0.018871,0.2819574 l 0.4806614,0.437368 c 0.076595,0.06882 0.1065666,0.176502 0.071044,0.273078 -0.048843,0.132099 -0.1076769,0.258647 -0.1753913,0.380754 l -0.052173,0.08992 c -0.073265,0.122108 -0.15541,0.237556 -0.2453259,0.346342 -0.065494,0.07993 -0.1742811,0.106569 -0.2719676,0.07549 l -0.61831,-0.196491 c -0.1487499,0.114339 -0.3130404,0.209804 -0.4884317,0.281958 l -0.138759,0.633852 C 4.1528845,12.460695 4.0751795,12.540619 3.9730532,12.55727 3.8198634,12.5828 3.6622329,12.59612 3.5012725,12.59612 3.340312,12.59612 3.1826819,12.5828 3.0294921,12.55727 2.9273654,12.54061 2.8496602,12.46069 2.8274589,12.359677 L 2.6886998,11.725825 C 2.5133087,11.653671 2.3490176,11.558205 2.2002681,11.443867 L 1.5830679,11.64146 c -0.097687,0.03108 -0.2064734,0.0033 -0.2719677,-0.07549 -0.089916,-0.108787 -0.172061,-0.224235 -0.2453259,-0.346342 l -0.052173,-0.08991 c -0.067715,-0.122109 -0.12654796,-0.248657 -0.17539116,-0.380756 -0.035522,-0.09658 -0.00555,-0.204253 0.071044,-0.273078 L 1.3899154,10.038511 C 1.3777094,9.945265 1.3710444,9.8509097 1.3710444,9.7554437 c 0,-0.095466 0.00667,-0.1898218 0.018871,-0.2819582 L 0.90925454,9.0361224 C 0.83265984,8.9672973 0.80268794,8.8596207 0.83821014,8.7630446 0.88705344,8.6309458 0.94588704,8.5043976 1.0136013,8.3822895 l 0.052173,-0.089916 C 1.1390392,8.1702654 1.2211845,8.054818 1.3111002,7.946031 1.3765943,7.8661054 1.4853816,7.8394644 1.5830679,7.8705466 L 2.2013783,8.0670293 C 2.3501278,7.9526919 2.5144184,7.8572258 2.6898099,7.785071 L 2.828569,7.1512198 C 2.85077,7.0502034 2.928475,6.9702781 3.0306022,6.9536272 c 0.1531899,-0.026641 0.31082,-0.039963 0.4717804,-0.039963 0.1609607,0 0.3185909,0.013322 0.4717807,0.038853 0.1021266,0.01665 0.1798318,0.096576 0.2020333,0.1975927 L 4.3149556,7.783961 C 4.4903468,7.856116 4.6546374,7.951582 4.8033872,8.0659195 L 5.4216971,7.8694357 c 0.097687,-0.031082 0.2064736,-0.00333 0.2719676,0.075484 0.089916,0.1087872 0.1720613,0.2242347 0.245326,0.3463428 l 0.052174,0.089916 c 0.067715,0.1221083 0.1265481,0.2486563 0.1753912,0.3807547 z m -2.6630629,1.880461 a 0.88805773,0.88805773 0 1 0 0,-1.7761143 0.88805773,0.88805773 0 1 0 0,1.7761143 z"
id="path2"
style="stroke-width:0.0111007" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.6 KiB

@ -0,0 +1,49 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="48"
height="48"
viewBox="0 0 12.7 12.7"
version="1.1"
id="svg1028"
inkscape:version="1.1.2 (0a00cf5339, 2022-02-04, custom)"
sodipodi:docname="com.ublinux.ubl-settings-logging.profile-symbolic.svg"
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="namedview1030"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:document-units="mm"
showgrid="false"
units="px"
inkscape:zoom="8"
inkscape:cx="55"
inkscape:cy="30.1875"
inkscape:window-width="1920"
inkscape:window-height="1056"
inkscape:window-x="1920"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="layer1" />
<defs
id="defs1025" />
<g
inkscape:label="Слой 1"
inkscape:groupmode="layer"
id="layer1">
<path
inkscape:connector-curvature="0"
d="M 6.442586,0 C 4.9396607,0 3.7212931,1.218368 3.7212931,2.7212931 c 0,1.5029251 1.2183676,2.721293 2.7212929,2.721293 1.502925,0 2.721293,-1.2183679 2.721293,-2.721293 C 9.163879,1.218368 7.945511,0 6.442586,0 Z M 5.0819394,6.3496861 C 2.8205458,6.3496861 1,8.1702286 1,10.431626 v 1.360646 c 0,0.907096 0.9070999,0.907096 0.9070999,0.907096 h 9.0709751 c 0,0 0.907097,0 0.907097,-0.907096 v -1.360646 c 0,-2.2613974 -1.820543,-4.0819399 -4.0819395,-4.0819399 z"
id="path4144"
sodipodi:nodetypes="ssssssccccccss"
style="color:#bebebe;display:inline;overflow:visible;visibility:visible;fill:#2e3436;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.67464;marker:none;enable-background:accumulate" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.0 KiB

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.4.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc. --><path d="M495.9 166.6c3.2 8.7 .5 18.4-6.4 24.6l-43.3 39.4c1.1 8.3 1.7 16.8 1.7 25.4s-.6 17.1-1.7 25.4l43.3 39.4c6.9 6.2 9.6 15.9 6.4 24.6c-4.4 11.9-9.7 23.3-15.8 34.3l-4.7 8.1c-6.6 11-14 21.4-22.1 31.2c-5.9 7.2-15.7 9.6-24.5 6.8l-55.7-17.7c-13.4 10.3-28.2 18.9-44 25.4l-12.5 57.1c-2 9.1-9 16.3-18.2 17.8c-13.8 2.3-28 3.5-42.5 3.5s-28.7-1.2-42.5-3.5c-9.2-1.5-16.2-8.7-18.2-17.8l-12.5-57.1c-15.8-6.5-30.6-15.1-44-25.4L83.1 425.9c-8.8 2.8-18.6 .3-24.5-6.8c-8.1-9.8-15.5-20.2-22.1-31.2l-4.7-8.1c-6.1-11-11.4-22.4-15.8-34.3c-3.2-8.7-.5-18.4 6.4-24.6l43.3-39.4C64.6 273.1 64 264.6 64 256s.6-17.1 1.7-25.4L22.4 191.2c-6.9-6.2-9.6-15.9-6.4-24.6c4.4-11.9 9.7-23.3 15.8-34.3l4.7-8.1c6.6-11 14-21.4 22.1-31.2c5.9-7.2 15.7-9.6 24.5-6.8l55.7 17.7c13.4-10.3 28.2-18.9 44-25.4l12.5-57.1c2-9.1 9-16.3 18.2-17.8C227.3 1.2 241.5 0 256 0s28.7 1.2 42.5 3.5c9.2 1.5 16.2 8.7 18.2 17.8l12.5 57.1c15.8 6.5 30.6 15.1 44 25.4l55.7-17.7c8.8-2.8 18.6-.3 24.5 6.8c8.1 9.8 15.5 20.2 22.1 31.2l4.7 8.1c6.1 11 11.4 22.4 15.8 34.3zM256 336a80 80 0 1 0 0-160 80 80 0 1 0 0 160z"/></svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.4.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc. --><path d="M105.1 202.6c7.7-21.8 20.2-42.3 37.8-59.8c62.5-62.5 163.8-62.5 226.3 0L386.3 160H336c-17.7 0-32 14.3-32 32s14.3 32 32 32H463.5c0 0 0 0 0 0h.4c17.7 0 32-14.3 32-32V64c0-17.7-14.3-32-32-32s-32 14.3-32 32v51.2L414.4 97.6c-87.5-87.5-229.3-87.5-316.8 0C73.2 122 55.6 150.7 44.8 181.4c-5.9 16.7 2.9 34.9 19.5 40.8s34.9-2.9 40.8-19.5zM39 289.3c-5 1.5-9.8 4.2-13.7 8.2c-4 4-6.7 8.8-8.1 14c-.3 1.2-.6 2.5-.8 3.8c-.3 1.7-.4 3.4-.4 5.1V448c0 17.7 14.3 32 32 32s32-14.3 32-32V396.9l17.6 17.5 0 0c87.5 87.4 229.3 87.4 316.7 0c24.4-24.4 42.1-53.1 52.9-83.7c5.9-16.7-2.9-34.9-19.5-40.8s-34.9 2.9-40.8 19.5c-7.7 21.8-20.2 42.3-37.8 59.8c-62.5 62.5-163.8 62.5-226.3 0l-.1-.1L125.6 352H176c17.7 0 32-14.3 32-32s-14.3-32-32-32H48.4c-1.6 0-3.2 .1-4.8 .3s-3.1 .5-4.6 1z"/></svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.4.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc. --><path d="M170.5 51.6L151.5 80h145l-19-28.4c-1.5-2.2-4-3.6-6.7-3.6H177.1c-2.7 0-5.2 1.3-6.7 3.6zm147-26.6L354.2 80H368h48 8c13.3 0 24 10.7 24 24s-10.7 24-24 24h-8V432c0 44.2-35.8 80-80 80H112c-44.2 0-80-35.8-80-80V128H24c-13.3 0-24-10.7-24-24S10.7 80 24 80h8H80 93.8l36.7-55.1C140.9 9.4 158.4 0 177.1 0h93.7c18.7 0 36.2 9.4 46.6 24.9zM80 128V432c0 17.7 14.3 32 32 32H336c17.7 0 32-14.3 32-32V128H80zm80 64V400c0 8.8-7.2 16-16 16s-16-7.2-16-16V192c0-8.8 7.2-16 16-16s16 7.2 16 16zm80 0V400c0 8.8-7.2 16-16 16s-16-7.2-16-16V192c0-8.8 7.2-16 16-16s16 7.2 16 16zm80 0V400c0 8.8-7.2 16-16 16s-16-7.2-16-16V192c0-8.8 7.2-16 16-16s16 7.2 16 16z"/></svg>

After

Width:  |  Height:  |  Size: 918 B

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 6.4.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc. --><path d="M288 80c-65.2 0-118.8 29.6-159.9 67.7C89.6 183.5 63 226 49.4 256c13.6 30 40.2 72.5 78.6 108.3C169.2 402.4 222.8 432 288 432s118.8-29.6 159.9-67.7C486.4 328.5 513 286 526.6 256c-13.6-30-40.2-72.5-78.6-108.3C406.8 109.6 353.2 80 288 80zM95.4 112.6C142.5 68.8 207.2 32 288 32s145.5 36.8 192.6 80.6c46.8 43.5 78.1 95.4 93 131.1c3.3 7.9 3.3 16.7 0 24.6c-14.9 35.7-46.2 87.7-93 131.1C433.5 443.2 368.8 480 288 480s-145.5-36.8-192.6-80.6C48.6 356 17.3 304 2.5 268.3c-3.3-7.9-3.3-16.7 0-24.6C17.3 208 48.6 156 95.4 112.6zM288 336c44.2 0 80-35.8 80-80s-35.8-80-80-80c-.7 0-1.3 0-2 0c1.3 5.1 2 10.5 2 16c0 35.3-28.7 64-64 64c-5.5 0-10.9-.7-16-2c0 .7 0 1.3 0 2c0 44.2 35.8 80 80 80zm0-208a128 128 0 1 1 0 256 128 128 0 1 1 0-256z"/></svg>

After

Width:  |  Height:  |  Size: 1009 B

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

@ -0,0 +1,160 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="16"
height="16"
id="svg2"
sodipodi:version="0.32"
inkscape:version="0.48.1 r9760"
version="1.0"
sodipodi:docname="zoom-fit.svg"
inkscape:output_extension="org.inkscape.output.svg.inkscape">
<defs
id="defs4">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 8 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="16 : 8 : 1"
inkscape:persp3d-origin="8 : 5.3333333 : 1"
id="perspective18" />
<linearGradient
id="StandardGradient"
gradientTransform="matrix(1.0022346,0,0,1.0022346,-2.7263793e-3,-3.4274669e-3)"
x1="8.3667202"
y1="1.0011907"
x2="8.3667202"
y2="14.839209"
gradientUnits="userSpaceOnUse">
<stop
style="stop-color:#000000;stop-opacity:0.86274511;"
offset="0"
id="stop3292" />
<stop
style="stop-color:#000000;stop-opacity:0.47058824;"
offset="1"
id="stop3294" />
</linearGradient>
<inkscape:perspective
id="perspective3648"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<linearGradient
inkscape:collect="always"
xlink:href="#StandardGradient"
id="linearGradient3626"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.0022346,0,0,1.0022346,-20.002726,-0.00342747)"
x1="8.3667202"
y1="1.0011907"
x2="8.3667202"
y2="14.839209" />
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath3633">
<path
style="fill:#ff00ff;fill-opacity:1;stroke:none;display:inline"
d="m -20,0 0,16 16,0 0,-16 -16,0 z m 6.03125,1 c 1.284136,0 2.583434,0.518602 3.5625,1.5 1.550185,1.5538805 1.873026,3.8766945 0.96875,5.75 -0.02944,0.062991 -0.492783,1.0685426 0,1.5625 0.298906,0.299618 0.66775,0.19791 1.125,0.65625 l 3.03125,3.0625 c 0.00872,0.01101 0.600029,0.617291 0,1.21875 -0.59772,0.599143 -1.18433,-0.0032 -1.1875,0 l -3.0625,-3.0625 c -0.45725,-0.45834 -0.357345,-0.856632 -0.65625,-1.15625 -0.402987,-0.403942 -1.16538,-0.182596 -1.46875,-0.0625 -0.04854,0.02556 -0.10707,0.0699 -0.15625,0.09375 -1.868852,0.90643 -4.168562,0.585131 -5.71875,-0.96875 -1.958131,-1.9627964 -1.95813,-5.1309536 0,-7.09375 0.979065,-0.9813981 2.278363,-1.5 3.5625,-1.5 z m 0,1.28125 c -2.076912,0 -3.749999,1.6993902 -3.75,3.78125 0,2.0818599 1.673088,3.7500002 3.75,3.75 2.076911,0 3.75,-1.6681403 3.75,-3.75 0,-2.0818599 -1.673089,-3.7812501 -3.75,-3.78125 z"
id="path3635" />
</clipPath>
<linearGradient
inkscape:collect="always"
xlink:href="#StandardGradient"
id="linearGradient5450"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.0022346,0,0,1.0022346,-0.00272638,-0.00342747)"
x1="8.3667202"
y1="1.0011907"
x2="8.3667202"
y2="14.839209" />
<linearGradient
inkscape:collect="always"
xlink:href="#StandardGradient"
id="linearGradient5454"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.0022346,0,0,1.0022346,-0.00272638,-0.00342747)"
x1="8.3667202"
y1="1.0011907"
x2="8.3667202"
y2="14.839209" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#9a9a9a"
borderopacity="1"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="24.785766"
inkscape:cx="1.7734833"
inkscape:cy="9.6679286"
inkscape:document-units="px"
inkscape:current-layer="layer3"
showgrid="true"
inkscape:showpageshadow="false"
showguides="true"
inkscape:guide-bbox="true"
inkscape:window-width="1920"
inkscape:window-height="1028"
inkscape:window-x="0"
inkscape:window-y="25"
inkscape:window-maximized="1">
<sodipodi:guide
orientation="1,0"
position="0,112"
id="guide2383" />
<sodipodi:guide
orientation="0,1"
position="26.278146,128"
id="guide2385" />
<sodipodi:guide
orientation="1,0"
position="128,54.082119"
id="guide2387" />
<sodipodi:guide
orientation="0,1"
position="78.156291,0"
id="guide2389" />
<inkscape:grid
type="xygrid"
id="grid3672"
visible="true"
enabled="true" />
</sodipodi:namedview>
<metadata
id="metadata7">
<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>
<g
inkscape:groupmode="layer"
id="layer3"
inkscape:label="Cross"
style="display:inline">
<path
style="fill:#bebebe;fill-opacity:1;stroke:none;display:inline"
d="m 6.0346439,0.456963 c -1.4236033,0 -2.8640143,0.5749259 -3.9494135,1.662911 -2.17079758,2.1759704 -2.17079809,5.6882127 0,7.8641827 1.7185494,1.7226453 4.2680247,2.0788393 6.3398481,1.0739643 0.054521,-0.02644 0.1194082,-0.07559 0.1732199,-0.103932 0.3363183,-0.133139 1.1815124,-0.378525 1.6282666,0.06929 0.331369,0.33216 0.220613,0.773709 0.727524,1.281828 l 3.395109,3.395109 c 0.0035,-0.0035 0.653835,0.664216 1.316472,0 0.665196,-0.666781 0.0097,-1.338905 0,-1.351115 l -3.360466,-3.395109 c -0.506911,-0.50812 -0.915814,-0.395365 -1.247183,-0.727524 -0.546303,-0.5476049 -0.03264,-1.6623665 0,-1.732199 C 12.060508,6.4176092 11.702604,3.8425172 9.9840571,2.119874 8.8986578,1.031889 7.4582474,0.456963 6.0346439,0.456963 z m 0,1.4204031 c 2.3024792,-10e-8 4.1572781,1.8839564 4.1572781,4.1919215 0,2.3079648 -1.8547987,4.1572774 -4.1572781,4.1572774 -2.3024792,0 -4.1572774,-1.8493124 -4.1572774,-4.1572774 7e-7,-2.307965 1.8547983,-4.1919215 4.1572774,-4.1919215 z"
id="path3007"
inkscape:connector-curvature="0"
inkscape:transform-center-x="-2.2103061"
inkscape:transform-center-y="2.2258551" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.5 KiB

@ -8,10 +8,10 @@ include_directories(${GTK_INCLUDE_DIRS})
link_directories(${GTK_LIBRARY_DIRS}) link_directories(${GTK_LIBRARY_DIRS})
add_definitions(${GTK_CFLAGS_OTHER}) add_definitions(${GTK_CFLAGS_OTHER})
#pkg_check_modules(VTE291 REQUIRED vte-2.91) pkg_check_modules(VTE291 REQUIRED vte-2.91)
#include_directories(${VTE291_INCLUDE_DIRS}) include_directories(${VTE291_INCLUDE_DIRS})
#link_directories(${VTE291_LIBRARY_DIRS}) link_directories(${VTE291_LIBRARY_DIRS})
#add_definitions(${VTE291_CFLAGS_OTHER}) add_definitions(${VTE291_CFLAGS_OTHER})
find_library(WEBKIT_LIBRARIES_FOUND webkit2gtk-4.0 webkit2gtk-web-extension-4.0) find_library(WEBKIT_LIBRARIES_FOUND webkit2gtk-4.0 webkit2gtk-web-extension-4.0)
@ -36,6 +36,10 @@ add_custom_target(GLADE ubl-settings-usergroups.glade)
set(DEPENDFILES set(DEPENDFILES
../ubl-settings-usergroups.glade ../ubl-settings-usergroups.glade
../ubl-settings-usergroups-additional-settings.glade
../ubl-settings-usergroups-group-creation.glade
../ubl-settings-usergroups-password.glade
../ubl-settings-usergroups-system.glade
../ubl-settings-usergroups-user.glade ../ubl-settings-usergroups-user.glade
../ubl-settings-usergroups-group.glade ../ubl-settings-usergroups-group.glade
../gresource.xml ../gresource.xml
@ -75,15 +79,15 @@ set(SOURCE_FILES
ubl-settings-usergroups.c ubl-settings-usergroups.c
ubl-settings-usergroups.h ubl-settings-usergroups.h
ubl-strings.h ubl-strings.h
ubl-utils.h
ubl-utils.c
${CMAKE_CURRENT_BINARY_DIR}/ubl-cmake.h ${CMAKE_CURRENT_BINARY_DIR}/ubl-cmake.h
) )
set(LIBRARIES set(LIBRARIES
${GTK_LIBRARIES} ${GTK_LIBRARIES}
${WEBKIT_LIBRARIES} ${WEBKIT_LIBRARIES}
# ${VTE291_LIBRARIES} ${VTE291_LIBRARIES}
ubl-utils
ublsettings-ui
pthread) pthread)

@ -2,245 +2,102 @@
config main_config; config main_config;
//signal emmit handlers - no header initialization
/**on_close_subwindow(GtkWidget *self)
* [EN]
* Closes window in which [self] is contained.
* [RU]
* Закрывает окно, в котором расположен виджет [self].
*/
void on_close_subwindow(GtkWidget *self){
gtk_widget_destroy(gtk_widget_get_toplevel(self));
}
/**yon_open_browser(GtkWidget *self, char *link)
* [EN]
* Opens browser with [link] link.
* [RU]
* Открывает браузер с [link] ссылкой.
*/
void yon_open_browser(GtkWidget *self, char *link){
yon_ubl_browser_window_open(link,TITLE_LABEL);
}
/**on_open_documentation_confirmation(GtkWidget *self, char *link)
* [EN]
* Opens confirmation window for [link] link.
* [RU]
* Открывает окно подтверждение перехода по ссылке [link].
*/
void on_open_documentation_confirmation(GtkWidget *self, char *link){
if (main_config.always_open_documentation==0){
GtkBuilder *builder = gtk_builder_new_from_resource(glade_path);
documentation_confirmation_window *widgets = malloc(sizeof(documentation_confirmation_window));
widgets->Window = yon_gtk_builder_get_widget(builder,"helpConfirmationWindow");
widgets->AcceptButton = yon_gtk_builder_get_widget(builder,"ReadHelpButton");
widgets->CloseButton = yon_gtk_builder_get_widget(builder,"CancelHelpButton");
widgets->HatText = yon_gtk_builder_get_widget(builder,"webHeaderNameLabel");
widgets->HeaderText = yon_gtk_builder_get_widget(builder,"helpHeader");
widgets->InfoText = yon_gtk_builder_get_widget(builder,"helpText");
widgets->AlwaysOpenCheck = yon_gtk_builder_get_widget(builder,"AlwaysOpenDocumentationCheckbox");
gtk_label_set_text(GTK_LABEL(widgets->HatText),TITLE_LABEL);
gtk_label_set_text(GTK_LABEL(widgets->HeaderText),HELP_TITLE_LABEL);
gtk_label_set_text(GTK_LABEL(widgets->InfoText),HELP_INFO_LABEL);
gtk_button_set_label(GTK_BUTTON(widgets->AcceptButton),OPEN_HELP_LABEL);
gtk_button_set_label(GTK_BUTTON(widgets->AlwaysOpenCheck),HELP_ALWAYS_OPEN_LABEL);
gtk_button_set_label(GTK_BUTTON(widgets->CloseButton),CANCEL_LABEL);
gtk_widget_show_all(widgets->Window);
g_signal_connect(G_OBJECT(widgets->CloseButton),"clicked",G_CALLBACK(on_close_subwindow),NULL);
g_signal_connect(G_OBJECT(widgets->AcceptButton),"clicked",G_CALLBACK(yon_open_browser),yon_char_new(link));
g_signal_connect(G_OBJECT(widgets->AcceptButton),"clicked",G_CALLBACK(on_close_subwindow),NULL);
} else {
yon_open_browser(self,link);
}
}
/**on_link(GtkWidget *self, char* uri, gpointer user_data)
* [EN]
* Signal for hadnling AboutDialog links.
* Connect to "activate-link" signal.
* [self] is AboutDialog window;
* [uri] is activated link;
* [user_data] is pointer for user data, hasn't used in standard handler;
* [RU]
* Функция для обработки сигнала нажатия на ссылку окна AboutDialog.
* Присоединять к сигналу "activate-link".
* [self] - окно AboutDialog;
* [uri] - ссылка, по которой совершается переход;
* [user_data] - указатель на любые другие данные, не используется в стандартном обработчике;
*/
void on_link(GtkWidget *self, char* uri, gpointer user_data){
gtk_widget_destroy(self);
on_open_documentation_confirmation(self,uri);
}
/**on_about()
* [EN]
* Function for setting up and showing AboutDialog.
* Connect it to "activate" signal of Documentation MenuItem.
* [RU]
* Функиця для настройки и показа окна AboutDialog.
* Присоединять к сигналу "activate" кнопки справки типа MenuItem.
*/
void on_about(){
GtkBuilder *builder=gtk_builder_new_from_resource(glade_path);
GtkWidget *window=yon_gtk_builder_get_widget(builder,"AboutWindow");
GtkWidget *title=yon_gtk_builder_get_widget(builder,"headerAboutTopic");
GtkWidget *hideButtonBox=yon_gtk_builder_get_widget(builder,"buttonBoxHide");
gtk_about_dialog_set_version(GTK_ABOUT_DIALOG(window),version_application);
gtk_about_dialog_set_website_label(GTK_ABOUT_DIALOG(window),PROJECT_HOME_LABEL);
gtk_about_dialog_set_comments(GTK_ABOUT_DIALOG(window),TITLE_LABEL);
gtk_label_set_text(GTK_LABEL(title),TITLE_LABEL);
g_signal_connect(G_OBJECT(window),"activate-link",G_CALLBACK(on_link),NULL);
gtk_widget_set_visible(hideButtonBox,0);
gtk_widget_destroy(hideButtonBox);
gtk_widget_show(window);
}
void on_toggle_button_switched(GtkToggleButton *self, GtkWidget *widget){
gtk_widget_set_sensitive(widget,!gtk_toggle_button_get_active(self));
}
//functions //functions
void on_user_accept(GtkWidget *self, dictionary * dict){
user_window *window = yon_dictionary_get_data(dict->first,user_window*);
main_window *widgets = yon_dictionary_get_data(dict->first->next,main_window*);
GtkTreeIter iter;
gtk_list_store_append(main_config.usersListStore,&iter);
int auto_id = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->userUIDAutoCheck));
int system_id = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->userUIDSystemCheck));
int unique_id = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->userUIDUniqueCheck));
int user_id = atoi(gtk_entry_get_text(GTK_ENTRY(window->UserUIDEntry)));
const char *user_name = gtk_entry_get_text(GTK_ENTRY(window->userUserNameEntry));
const char *login = gtk_entry_get_text(GTK_ENTRY(window->userLoginEntry));
int default_password = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->userPasswordDefaultCheck));
const char *password = gtk_entry_get_text(GTK_ENTRY(window->userPasswordEntry));
int own_group = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->userPasswordDefaultCheck));
const char *groups = gtk_entry_get_text(GTK_ENTRY(window->userGroupsEntry));
const char *user_shell = NULL;
if (gtk_combo_box_get_active(GTK_COMBO_BOX(window->userShellCombo))>=0)
user_shell = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(window->userShellCombo));
int home_dir_create = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->userPasswordDefaultCheck));
const char *home_dir = gtk_entry_get_text(GTK_ENTRY(window->userHomeFolderEntry));
int samba = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->userPasswordDefaultCheck));
const char *extra_options = gtk_entry_get_text(GTK_ENTRY(window->userExtraOptionsEntry));
gtk_list_store_set(main_config.usersListStore,&iter,0,user_id,1,auto_id,2,unique_id,3,system_id,4,user_name,5,login,6,password,7,default_password,8,groups,9,own_group,10,user_shell,11,home_dir,12,home_dir_create,-1);
// widgets->MainUserTree;
on_close_subwindow(self);
}
void yon_load_proceed(char *command){ void yon_load_proceed(char *command){
if (yon_config_load_register(command))
yon_ubl_status_box_render(LOCAL_SAVE_SUCCESS_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE);
else
yon_ubl_status_box_render(LOAD_FAILED_LABEL,BACKGROUND_IMAGE_FAIL_TYPE);
} }
void on_def_groups_accept(GtkWidget *self, dictionary *windowes){ void yon_save_proceed(char *section,YON_CONFIG_TYPE type){
char *groups_string = "";
main_window *widgets = yon_dictionary_get_data(windowes->first->next,main_window*);
groups_window *window = yon_dictionary_get_data(windowes->first,groups_window*);
if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->GroupsAdmCheck))==1) groups_string = yon_char_append(groups_string,"adm,");
if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->GroupsAudioCheck))==1) groups_string = yon_char_append(groups_string,"audio,");
if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->GroupsAutologinCheck))==1) groups_string = yon_char_append(groups_string,"autologin,");
if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->GroupsAvahiCheck))==1) groups_string = yon_char_append(groups_string,"avahi,");
if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->GroupsBinCheck))==1) groups_string = yon_char_append(groups_string,"bin,");
if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->GroupsBrlapiCheck))==1) groups_string = yon_char_append(groups_string,"brlapi,");
if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->GroupsBrittyCheck))==1) groups_string = yon_char_append(groups_string,"britty,");
if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->GroupsBumblbeeCheck))==1) groups_string = yon_char_append(groups_string,"bumblbee,");
if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->GroupsChronyCheck))==1) groups_string = yon_char_append(groups_string,"chrony,");
if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->GroupsClamavCheck))==1) groups_string = yon_char_append(groups_string,"clamav,");
if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->GroupsCockpitWsCheck))==1) groups_string = yon_char_append(groups_string,"cockpit-ws,");
if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->GroupsCockpitWsinstanceCheck))==1) groups_string = yon_char_append(groups_string,"cockpit-wsinstance,");
if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(window->GroupsColordCheck))==1) groups_string = yon_char_append(groups_string,"colord,");
if (strcmp(groups_string,"")!=0) groups_string[strlen(groups_string)-1]='\0';
gtk_entry_buffer_set_text(gtk_entry_get_buffer(GTK_ENTRY(widgets->MainDefaultGroupsEntry)),groups_string,strlen(groups_string));
on_close_subwindow(self);
} }
void on_groups_open(GtkWidget *self, main_window *widgets){ additional_config_window *yon_additional_config_window_new(){
additional_config_window *window = malloc(sizeof(additional_config_window));
GtkBuilder *builder = gtk_builder_new_from_resource(glade_path_additional);
window->Window=yon_gtk_builder_get_widget(builder,"Window");
window->StatusBox=yon_gtk_builder_get_widget(builder,"StatusBox");
window->DefaultUserNameEntry=yon_gtk_builder_get_widget(builder,"DefaultUserNameEntry");
window->DefaultUserAdministratorCheck=yon_gtk_builder_get_widget(builder,"DefaultUserAdministratorCheck");
window->DefaultPasswordCombo=yon_gtk_builder_get_widget(builder,"DefaultPasswordCombo");
window->DefaultPasswordEntry=yon_gtk_builder_get_widget(builder,"DefaultPasswordEntry");
window->RootPasswordCombo=yon_gtk_builder_get_widget(builder,"RootPasswordCombo");
window->RootPasswordEntry=yon_gtk_builder_get_widget(builder,"RootPasswordEntry");
window->PasswordHashCombo=yon_gtk_builder_get_widget(builder,"PasswordHashCombo");
window->CancelButton=yon_gtk_builder_get_widget(builder,"CancelButton");
window->AcceptButton=yon_gtk_builder_get_widget(builder,"AcceptButton");
} }
void on_def_groups_open(GtkWidget *self, main_window *widgets){ groups_window *yon_groups_window_new(){
GtkBuilder *builder = gtk_builder_new_from_resource(glade_groups_path);
groups_window *window = malloc(sizeof(groups_window)); groups_window *window = malloc(sizeof(groups_window));
window->Window = yon_gtk_builder_get_widget(builder,"GroupsWindow"); GtkBuilder *builder = gtk_builder_new_from_resource(glade_path_groups);
window->GroupsWindow=yon_gtk_builder_get_widget(builder,"GroupsWindow");
window->GroupsTree=yon_gtk_builder_get_widget(builder,"GroupsTree");
window->GroupsCancelButton=yon_gtk_builder_get_widget(builder,"GroupsCancelButton"); window->GroupsCancelButton=yon_gtk_builder_get_widget(builder,"GroupsCancelButton");
window->GroupsOkButton=yon_gtk_builder_get_widget(builder,"GroupsOkButton"); window->GroupsOkButton=yon_gtk_builder_get_widget(builder,"GroupsOkButton");
window->GroupsAdmCheck = yon_gtk_builder_get_widget(builder,"groupsAdmGroupCheck"); g_signal_connect(G_OBJECT(window->GroupsCancelButton),"clicked",G_CALLBACK(on_subwindow_close),NULL);
window->GroupsAudioCheck = yon_gtk_builder_get_widget(builder,"groupsAudioGroupCheck"); return window;
window->GroupsAutologinCheck = yon_gtk_builder_get_widget(builder,"groupsAutologinGroupCheck");
window->GroupsAvahiCheck = yon_gtk_builder_get_widget(builder,"groupsAvahiGroupCheck");
window->GroupsBinCheck = yon_gtk_builder_get_widget(builder,"groupsBinGroupCheck");
window->GroupsBrlapiCheck = yon_gtk_builder_get_widget(builder,"groupsBrlapiGroupCheck");
window->GroupsBrittyCheck = yon_gtk_builder_get_widget(builder,"groupsBrittyGroupCheck");
window->GroupsBumblbeeCheck = yon_gtk_builder_get_widget(builder,"groupsBumblbeeGroupCheck");
window->GroupsChronyCheck = yon_gtk_builder_get_widget(builder,"groupsChronyGroupCheck");
window->GroupsClamavCheck = yon_gtk_builder_get_widget(builder,"groupsClamavGroupCheck");
window->GroupsCockpitWsCheck = yon_gtk_builder_get_widget(builder,"groupsCockpitWsGroupCheck");
window->GroupsCockpitWsinstanceCheck = yon_gtk_builder_get_widget(builder,"groupsCockpitWsinstanceGroupCheck");
window->GroupsColordCheck = yon_gtk_builder_get_widget(builder,"groupsColordGroupCheck");
dictionary *windgets=NULL;
yon_dictionary_add_or_create_if_exists_with_data(windgets,"window",window);
yon_dictionary_add_or_create_if_exists_with_data(windgets,"widgets",widgets);
g_signal_connect(G_OBJECT(window->GroupsCancelButton),"clicked",G_CALLBACK(on_close_subwindow),window);
g_signal_connect(G_OBJECT(window->GroupsOkButton),"clicked",G_CALLBACK(on_def_groups_accept),windgets);
gtk_widget_show(window->Window);
} }
void on_user_add(GtkWidget *self, main_window *widgets){ void on_standard_groups_open(GtkWidget *self, main_window *widgets){
GtkBuilder *builder = gtk_builder_new_from_resource(glade_user_path); groups_window *window = yon_groups_window_new();
user_window *window = malloc(sizeof(user_window)); g_signal_connect(G_OBJECT(window->GroupsOkButton),"clicked",G_CALLBACK(on_subwindow_close),NULL);
window->Window = yon_gtk_builder_get_widget(builder,"CreateUserWindow"); gtk_window_set_transient_for(GTK_WINDOW(window->GroupsWindow),GTK_WINDOW(widgets->Window));
window->UserAdditionalGroupsButton = yon_gtk_builder_get_widget(builder,"UserAdditionalGroupsButton"); gtk_widget_show(window->GroupsWindow);
window->UserCancelButton = yon_gtk_builder_get_widget(builder,"UserCancelButton"); }
window->UserOkButton = yon_gtk_builder_get_widget(builder,"UserOkButton");
window->userUIDSystemCheck = yon_gtk_builder_get_widget(builder,"userUIDSystemCheck"); user_window *yon_user_window_new(){
user_window *window = malloc(sizeof(user_window));
GtkBuilder *builder = gtk_builder_new_from_resource(glade_path_user);
window->CreateUserWindow=yon_gtk_builder_get_widget(builder,"CreateUserWindow");
window->userUIDAutoCheck=yon_gtk_builder_get_widget(builder,"userUIDAutoCheck"); window->userUIDAutoCheck=yon_gtk_builder_get_widget(builder,"userUIDAutoCheck");
window->userUIDUniqueCheck = yon_gtk_builder_get_widget(builder,"userUIDUniqueCheck"); window->userUIDEntry=yon_gtk_builder_get_widget(builder,"userUIDEntry");
window->UserUIDEntry = yon_gtk_builder_get_widget(builder,"userUIDEntry");
window->userUserNameEntry = yon_gtk_builder_get_widget(builder,"userUserNameEntry");
window->userLoginEntry=yon_gtk_builder_get_widget(builder,"userLoginEntry"); window->userLoginEntry=yon_gtk_builder_get_widget(builder,"userLoginEntry");
window->userPasswordCombo=yon_gtk_builder_get_widget(builder,"userPasswordCombo");
window->userPasswordDefaultCheck = yon_gtk_builder_get_widget(builder,"userPasswordDefaultCheck");
window->userPasswordEntry=yon_gtk_builder_get_widget(builder,"userPasswordEntry"); window->userPasswordEntry=yon_gtk_builder_get_widget(builder,"userPasswordEntry");
window->userPasswordButton=yon_gtk_builder_get_widget(builder,"userPasswordButton");
window->userUserNameEntry=yon_gtk_builder_get_widget(builder,"userUserNameEntry");
window->userGroupsCheck=yon_gtk_builder_get_widget(builder,"userGroupsCheck"); window->userGroupsCheck=yon_gtk_builder_get_widget(builder,"userGroupsCheck");
window->userGroupsEntry=yon_gtk_builder_get_widget(builder,"userGroupsEntry"); window->userGroupsEntry=yon_gtk_builder_get_widget(builder,"userGroupsEntry");
window->UserAdditionalGroupsButton = yon_gtk_builder_get_widget(builder,"UserAdditionalGroupsButton"); window->UserGroupsButton=yon_gtk_builder_get_widget(builder,"UserGroupsButton");
window->UserAdditionalGroupsMultipleButton = yon_gtk_builder_get_widget(builder,"UserAdditionalGroupsMultipleButton");
window->userShellCombo = yon_gtk_builder_get_widget(builder,"userShellCombo");
window->userCreateHomeFolderCheck=yon_gtk_builder_get_widget(builder,"userCreateHomeFolderCheck"); window->userCreateHomeFolderCheck=yon_gtk_builder_get_widget(builder,"userCreateHomeFolderCheck");
window->userHomeFolderEntry=yon_gtk_builder_get_widget(builder,"userHomeFolderEntry"); window->userHomeFolderEntry=yon_gtk_builder_get_widget(builder,"userHomeFolderEntry");
window->userHomeFolderButton=yon_gtk_builder_get_widget(builder,"userHomeFolderButton"); window->userHomeFolderButton=yon_gtk_builder_get_widget(builder,"userHomeFolderButton");
window->userAdditionalGroupsEntry=yon_gtk_builder_get_widget(builder,"userAdditionalGroupsEntry");
window->userAdditionalGroupsButton=yon_gtk_builder_get_widget(builder,"userAdditionalGroupsButton");
window->userPasswordChangedEntry=yon_gtk_builder_get_widget(builder,"userPasswordChangedEntry");
window->userPasswordExpirationEntry=yon_gtk_builder_get_widget(builder,"userPasswordExpirationEntry");
window->userPasswordExpirationButton=yon_gtk_builder_get_widget(builder,"userPasswordExpirationButton");
window->userPasswordChangeDelayMinimumSpin=yon_gtk_builder_get_widget(builder,"userPasswordChangeDelayMinimumSpin");
window->userPasswordChangeDelayMaximumSpin=yon_gtk_builder_get_widget(builder,"userPasswordChangeDelayMaximumSpin");
window->userWarningSpin=yon_gtk_builder_get_widget(builder,"userWarningSpin");
window->userActivitySpin=yon_gtk_builder_get_widget(builder,"userActivitySpin");
window->userForceChangeCheck=yon_gtk_builder_get_widget(builder,"userForceChangeCheck");
window->userShellCombo=yon_gtk_builder_get_widget(builder,"userShellCombo");
window->userShellEntry=yon_gtk_builder_get_widget(builder,"userShellEntry");
window->userHomeCombo=yon_gtk_builder_get_widget(builder,"userHomeCombo");
window->userHomeEntry=yon_gtk_builder_get_widget(builder,"userHomeEntry");
window->userHomeButton=yon_gtk_builder_get_widget(builder,"userHomeButton");
window->userCreateSystemCheck=yon_gtk_builder_get_widget(builder,"userCreateSystemCheck");
window->userCreateUnuniqueCheck=yon_gtk_builder_get_widget(builder,"userCreateUnuniqueCheck");
window->userDontCheckCheck=yon_gtk_builder_get_widget(builder,"userDontCheckCheck");
window->userSyncSAMBACheck=yon_gtk_builder_get_widget(builder,"userSyncSAMBACheck"); window->userSyncSAMBACheck=yon_gtk_builder_get_widget(builder,"userSyncSAMBACheck");
window->userDeactivatedCheck=yon_gtk_builder_get_widget(builder,"userDeactivatedCheck");
window->userExtraOptionsEntry=yon_gtk_builder_get_widget(builder,"userExtraOptionsEntry"); window->userExtraOptionsEntry=yon_gtk_builder_get_widget(builder,"userExtraOptionsEntry");
dictionary *dict = NULL; window->UserCancelButton=yon_gtk_builder_get_widget(builder,"UserCancelButton");
yon_dictionary_add_or_create_if_exists_with_data(dict,"window",window) window->UserOkButton=yon_gtk_builder_get_widget(builder,"UserOkButton");
yon_dictionary_add_or_create_if_exists_with_data(dict,"widgets",widgets); window->userTitleNameLabel=yon_gtk_builder_get_widget(builder,"userTitleNameLabel");
g_signal_connect(G_OBJECT(window->UserCancelButton),"clicked",G_CALLBACK(on_subwindow_close),NULL);
g_signal_connect(G_OBJECT(window->UserCancelButton),"clicked",G_CALLBACK(on_close_subwindow),NULL); return window;
g_signal_connect(G_OBJECT(window->UserOkButton),"clicked",G_CALLBACK(on_user_accept),dict); }
g_signal_connect(G_OBJECT(window->UserAdditionalGroupsButton),"clicked",G_CALLBACK(on_def_groups_open),window);
void on_user_add(GtkWidget *self, main_window *widgets){
user_window *window = yon_user_window_new();
g_signal_connect(G_OBJECT(window->UserOkButton),"clicked",G_CALLBACK(on_subwindow_close),NULL);
g_signal_connect(G_OBJECT(window->userUIDAutoCheck),"clicked",G_CALLBACK(on_toggle_button_switched),window->UserUIDEntry); gtk_window_set_transient_for(GTK_WINDOW(window->CreateUserWindow),GTK_WINDOW(widgets->Window));
g_signal_connect(G_OBJECT(window->userUIDAutoCheck),"clicked",G_CALLBACK(on_toggle_button_switched),window->userUIDUniqueCheck); gtk_widget_show(window->CreateUserWindow);
gtk_widget_show(window->Window);
} }
void on_user_edit(){ void on_user_edit(){
@ -251,14 +108,20 @@ void on_user_delete(){
} }
void on_def_groups_open(){
}
// standard functions // standard functions
/**config_init()
* [EN]
*
* [RU]
* Функция инициализации всех параметров конфигурации
*/
void config_init(){ void config_init(){
main_config.always_open_documentation=0; main_config.always_open_documentation=0;
main_config.win_height = 0;
main_config.win_width = 0;
main_config.win_pos_x = 0;
main_config.win_pos_y = 0;
main_config.socket_id=-1; main_config.socket_id=-1;
main_config.save_socket_id=-1; main_config.save_socket_id=-1;
main_config.load_socket_id=-1; main_config.load_socket_id=-1;
@ -267,62 +130,30 @@ void config_init(){
main_config.lock_load_global=0; main_config.lock_load_global=0;
main_config.lock_save_global=0; main_config.lock_save_global=0;
main_config.lock_save_local=0; main_config.lock_save_local=0;
main_config.default_groups = NULL;
main_config.default_groups_config = NULL;
main_config.default_password = NULL;
main_config.default_user_name = NULL;
main_config.is_1000_administrator=0;
main_config.hash_alg=0;
main_config.root_password=NULL;
} }
main_window *setup_window(){ /**yon_main_window_complete(main_window *widgets)
/* Widgets getting | Получение виджетов */ * [EN]
main_window *widgets = malloc(sizeof(main_window)); *
* [RU]
* Функция настройки основного окна приложения. [widgets] - структура со стандартным интерфейсом.
*/
void yon_main_window_complete(main_window *widgets){
widgets = realloc(widgets,sizeof(main_window));
GtkBuilder *builder = gtk_builder_new_from_resource(glade_path); GtkBuilder *builder = gtk_builder_new_from_resource(glade_path);
widgets->Window = yon_gtk_builder_get_widget(builder,"MainWindow"); gtk_box_pack_start(GTK_BOX(widgets->InterfaceBox),yon_gtk_builder_get_widget(builder,"PlugBox"),1,1,0);
widgets->HatLabel = yon_gtk_builder_get_widget(builder,"headerTopic"); widgets->button1 = yon_gtk_builder_get_widget(builder,"button1");
widgets->PlugBox = yon_gtk_builder_get_widget(builder,"plugBox"); widgets->button2 = yon_gtk_builder_get_widget(builder,"button2");
widgets->button3 = yon_gtk_builder_get_widget(builder,"button3");
widgets->HeadOverlay = yon_gtk_builder_get_widget(builder,"HeadOverlay"); widgets->AddButton = yon_gtk_builder_get_widget(builder,"AddButton");
widgets->HeadImage = yon_gtk_builder_get_widget(builder,"HeadBackgroundImage"); widgets->EditButton = yon_gtk_builder_get_widget(builder,"EditButton");
widgets->HeadBox = yon_gtk_builder_get_widget(builder,"HeaderBox"); widgets->DeleteButton = yon_gtk_builder_get_widget(builder,"DeleteButton");
widgets->HeadTitleLabel = yon_gtk_builder_get_widget(builder,"HeaderTitleLabel"); widgets->UpdateButton = yon_gtk_builder_get_widget(builder,"UpdateButton");
widgets->HeadInfoLabel = yon_gtk_builder_get_widget(builder,"HeaderInfoLabel"); widgets->UsersTree = yon_gtk_builder_get_widget(builder,"UsersTree");
widgets->GroupsTree = yon_gtk_builder_get_widget(builder,"GroupsTree");
widgets->StatusBox = yon_gtk_builder_get_widget(builder,"mainStatusBox");
widgets->StatusIcon = yon_gtk_builder_get_widget(builder,"mainStatusIcon");
widgets->StatusLabel = yon_gtk_builder_get_widget(builder,"mainStatusLabel");
widgets->SaveLabel = yon_gtk_builder_get_widget(builder,"headerSaveConfigLabel");
widgets->SaveMenuItem = yon_gtk_builder_get_widget(builder,"SaveGlobalLocalConfigurationMenuItem");
widgets->SaveGlobalMenuItem = yon_gtk_builder_get_widget(builder,"SaveGlobalConfigurationMenuItem");
widgets->SaveLocalMenuItem = yon_gtk_builder_get_widget(builder,"SaveLocalConfigurationMenuItem");
widgets->RightBox = yon_gtk_builder_get_widget(builder,"HeaderRightBox");
widgets->LoadLabel = yon_gtk_builder_get_widget(builder,"headerLoadConfigLabel");
widgets->LoadGlobalMenuItem = yon_gtk_builder_get_widget(builder,"LoadGlobalConfigurationMenuItem");
widgets->LoadLocalMenuItem = yon_gtk_builder_get_widget(builder,"LoadLocalConfigurationMenuItem");
widgets->LeftBox = yon_gtk_builder_get_widget(builder,"HeaderLeftBox");
widgets->DocumentationMenuItem = yon_gtk_builder_get_widget(builder,"DocumentationMenuItem");
widgets->AboutMenuItem = yon_gtk_builder_get_widget(builder,"AboutMenuItem");
widgets->MainAddUserButton = yon_gtk_builder_get_widget(builder,"MainAddUserButton");
widgets->MainEditUserButton = yon_gtk_builder_get_widget(builder,"MainEditUserButton");
widgets->MainDeleteUserButton = yon_gtk_builder_get_widget(builder,"MainDeleteUserButton");
widgets->MainEditGroupsButton = yon_gtk_builder_get_widget(builder,"MainEditGroupsButton"); main_config.usersListStore = GTK_LIST_STORE(gtk_builder_get_object(builder,"UsersList"));
main_config.groupsListStore = GTK_LIST_STORE(gtk_builder_get_object(builder,"GroupsList"));
widgets->MainDefaultGroupsEntry = yon_gtk_builder_get_widget(builder,"mainDefaultGroupsEntry");
widgets->MainDefaultUserNameEntry = yon_gtk_builder_get_widget(builder,"mainDefaultUserNameEntry");
widgets->MainDefaultUserAdministratorCheck = yon_gtk_builder_get_widget(builder,"mainDefaultUserAdministratorCheck");
widgets->MainDefaultPasswordEntry = yon_gtk_builder_get_widget(builder,"mainDefaultPasswordEntry");
widgets->MainRootPasswordEntry = yon_gtk_builder_get_widget(builder,"mainRootPasswordEntry");
widgets->MainUserTree = yon_gtk_builder_get_widget(builder,"mainUserTree");
widgets->MainPasswordHashCombo = yon_gtk_builder_get_widget(builder,"mainPasswordHashCombo");
main_config.usersListStore = GTK_LIST_STORE(gtk_builder_get_object(builder,"UserList"));
if (main_config.lock_load_global == 1){ if (main_config.lock_load_global == 1){
@ -338,17 +169,14 @@ main_window *setup_window(){
} }
/* Signal connection | Присоединение сигналов */ /* Signal connection | Присоединение сигналов */
g_signal_connect(G_OBJECT(widgets->Window), "destroy", G_CALLBACK(gtk_main_quit), NULL); g_signal_connect(G_OBJECT(widgets->AddButton),"clicked",G_CALLBACK(on_user_add),widgets);
g_signal_connect(G_OBJECT(widgets->DocumentationMenuItem),"activate",G_CALLBACK(on_open_documentation_confirmation),WIKI_LINK); g_signal_connect(G_OBJECT(widgets->EditButton),"clicked",G_CALLBACK(on_user_edit),widgets);
g_signal_connect(G_OBJECT(widgets->AboutMenuItem),"activate",G_CALLBACK(on_about),NULL); g_signal_connect(G_OBJECT(widgets->DeleteButton),"clicked",G_CALLBACK(on_user_delete),widgets);
g_signal_connect(G_OBJECT(widgets->MainAddUserButton),"clicked",G_CALLBACK(on_user_add),widgets); g_signal_connect(G_OBJECT(widgets->button3),"clicked",G_CALLBACK(on_standard_groups_open),widgets);
g_signal_connect(G_OBJECT(widgets->MainEditUserButton),"clicked",G_CALLBACK(on_user_edit),NULL); // g_signal_connect(G_OBJECT(widgets->),"clicked",G_CALLBACK(on_def_groups_open),widgets);
g_signal_connect(G_OBJECT(widgets->MainDeleteUserButton),"clicked",G_CALLBACK(on_user_delete),NULL);
g_signal_connect(G_OBJECT(widgets->MainEditGroupsButton),"clicked",G_CALLBACK(on_def_groups_open),widgets);
gtk_widget_show(widgets->Window); gtk_widget_show(widgets->Window);
return widgets;
} }
int main(int argc, char *argv[]){ int main(int argc, char *argv[]){
@ -370,11 +198,11 @@ int main(int argc, char *argv[]){
{"socket-id", 1, 0, 's'}, {"socket-id", 1, 0, 's'},
{"socket-ext-id", 1,0, 'e'}, {"socket-ext-id", 1,0, 'e'},
{"socket-trd-id", 1,0, 't'}, {"socket-trd-id", 1,0, 't'},
{"debug", 0,0, 'd'}, {"clear-config", 0,0, 'c'},
{ NULL, 0, NULL, 0 } { NULL, 0, NULL, 0 }
}; };
for (int i=0;i<argc;i++){ for (int i=0;i<argc;i++){
int argument=getopt_long(argc,argv,"hVvs:e:t:d",long_options,&option_index); int argument=getopt_long(argc,argv,"hVvs:e:t:c",long_options,&option_index);
switch(argument){ switch(argument){
case 'h': case 'h':
show_help=1; show_help=1;
@ -390,11 +218,13 @@ int main(int argc, char *argv[]){
break; break;
case 'e': case 'e':
if(optarg) if(optarg)
main_config.load_socket_id=atoi(optarg); main_config.save_socket_id=atoi(optarg);
break; break;
case 't': case 't':
if(optarg) if(optarg)
main_config.save_socket_id=atoi(optarg); main_config.load_socket_id=atoi(optarg);
break;
case 'c': system(yon_char_unite("rm -rfd ", yon_ubl_user_get_home_directory(),"/.config/",LocaleName,"/",NULL));
break; break;
case 1: case 1:
main_config.lock_help=1; main_config.lock_help=1;
@ -426,23 +256,9 @@ int main(int argc, char *argv[]){
main_config.lock_save_local=1; main_config.lock_save_local=1;
} }
gtk_init(&argc,&argv); gtk_init(&argc,&argv);
yon_ubl_connect_config((_template_config*)&main_config);
yon_ubl_window_init(TITLE_LABEL,TITLE_INFO_LABEL,LocaleName,CssPath,LocaleName,version_application,WIKI_LINK);
main_window *widgets = setup_window(); template_main_window *widgets = yon_ubl_window_setup();
yon_ubl_header_setup_resource(widgets->HeadOverlay,widgets->HeadBox,widgets->HeadImage,banner_path); yon_main_window_complete((main_window*)widgets);
yon_ubl_status_box_setup(widgets->StatusIcon,widgets->StatusBox,widgets->StatusLabel);
if (getuid()!=0)
yon_ubl_status_box_render(ROOT_WARNING_LABEL,BACKGROUND_IMAGE_FAIL_TYPE);
else
yon_ubl_status_box_render(LOCAL_LOAD_SUCCESS_LABEL,BACKGROUND_IMAGE_SUCCESS_TYPE);
yon_ubl_setup_sockets(widgets->PlugBox,widgets->LeftBox,widgets->RightBox,main_config.socket_id,main_config.load_socket_id,main_config.save_socket_id);
yon_window_config_setup(GTK_WINDOW(widgets->Window));
yon_window_config_load(config_path);
GtkCssProvider *css=gtk_css_provider_new();
gtk_css_provider_load_from_resource(css,CssPath);
gtk_style_context_add_provider_for_screen(gdk_screen_get_default(),
GTK_STYLE_PROVIDER(css),
-1);
gtk_main(); gtk_main();
} }

@ -1,6 +1,5 @@
#include <gtk/gtk.h> #include <gtk/gtk.h>
#include <gtk/gtkx.h> #include <gtk/gtkx.h>
#include "ubl-utils.h"
#include <locale.h> #include <locale.h>
#include <stdio.h> #include <stdio.h>
#include <unistd.h> #include <unistd.h>
@ -8,6 +7,8 @@
#include <libintl.h> #include <libintl.h>
#include <getopt.h> #include <getopt.h>
#include <libintl.h> #include <libintl.h>
#include <ubl-utils.h>
#include <ublsettings-ui.h>
#include "../compile/ubl-cmake.h" #include "../compile/ubl-cmake.h"
#ifdef WEBKIT_FOUND #ifdef WEBKIT_FOUND
#include <webkit2/webkit2.h> #include <webkit2/webkit2.h>
@ -19,11 +20,22 @@
#define _(String) gettext(String) #define _(String) gettext(String)
#define glade_path "/com/ublinux/ui/ubl-settings-usergroups.glade" #define glade_path "/com/ublinux/ui/ubl-settings-usergroups.glade"
#define glade_user_path "/com/ublinux/ui/ubl-settings-usergroups-user.glade" #define glade_path_user "/com/ublinux/ui/ubl-settings-usergroups-user.glade"
#define glade_groups_path "/com/ublinux/ui/ubl-settings-usergroups-group.glade" #define glade_path_groups "/com/ublinux/ui/ubl-settings-usergroups-group.glade"
#define glade_path_additional "/com/ublinux/ui/ubl-settings-usergroups-additional-settings.glade"
#define glade_path_group_creation "/com/ublinux/ui/ubl-settings-usergroups-group-creation.glade"
#define glade_path_password "/com/ublinux/ui/ubl-settings-usergroups-password.glade"
#define glade_path_system "/com/ublinux/ui/ubl-settings-usergroups-system.glade"
#define banner_path "/com/ublinux/images/ubl-settings-usergroups-banner.png" #define banner_path "/com/ublinux/images/ubl-settings-usergroups-banner.png"
#define CssPath "/com/ublinux/css/ubl-settings-usergroups.css" #define CssPath "/com/ublinux/css/ubl-settings-usergroups.css"
#define config_path yon_char_unite("/home/",yon_ubl_root_user_get(),"/.config/",LocaleName,"/",LocaleName,".conf",NULL) #define config_path yon_char_unite(yon_ubl_user_get_home_directory(),"/.config/",LocaleName,"/",LocaleName,".conf",NULL)
#define LocalePath "/usr/share/locale"
#define LocaleName "ubl-settings-usergroups"
#define clear_config_both_command "ubconfig remove TEMP_SECTION TEMP_PATAMETER"
#define clear_config_global_command "ubconfig --target global remove TEMP_SECTION TEMP_PATAMETER"
#define clear_config_local_command "ubconfig --target system remove TEMP_SECTION TEMP_PATAMETER"
#define yon_col(mean) yon_char_append(mean,":") #define yon_col(mean) yon_char_append(mean,":")
@ -35,12 +47,7 @@ string version_application;
char *local; char *local;
typedef struct { typedef struct {
int always_open_documentation; // Standard config. DO NOT EDIT - MUST BE SAME AS ublsettings-ui's template_config STRUCT {
int win_pos_x;
int win_pos_y;
int win_width;
int win_height;
int socket_id; int socket_id;
int load_socket_id; int load_socket_id;
int save_socket_id; int save_socket_id;
@ -50,22 +57,18 @@ typedef struct {
int lock_save_global; int lock_save_global;
int lock_load_global; int lock_load_global;
// Custom int always_open_documentation;
char *default_groups; // } Standard config. DO NOT EDIT - MUST BE SAME AS ublsettings-ui's template_config STRUCT
char *default_user_name; // Type custom parameters below:
char *default_password;
char *root_password;
int hash_alg;
gboolean is_1000_administrator;
struct groups_config *default_groups_config;
GtkListStore *usersListStore; GtkListStore *usersListStore;
GtkListStore *groupsListStore;
} config; } config;
typedef struct { typedef struct {
// Standard widgets. DO NOT EDIT - MUST BE SAME AS ublsettings-ui's template_main_window STRUCT {
GtkWidget *Window; GtkWidget *Window;
GtkWidget *HatLabel; GtkWidget *HeadLabel;
GtkWidget *PlugBox; GtkWidget *PlugBox;
GtkWidget *MainDefaultGroupsEntry;
GtkWidget *HeadOverlay; GtkWidget *HeadOverlay;
GtkWidget *HeadImage; GtkWidget *HeadImage;
@ -77,52 +80,34 @@ typedef struct {
GtkWidget *StatusIcon; GtkWidget *StatusIcon;
GtkWidget *StatusLabel; GtkWidget *StatusLabel;
GtkWidget *SaveLabel;
GtkWidget *SaveMenuItem; GtkWidget *SaveMenuItem;
GtkWidget *SaveGlobalMenuItem; GtkWidget *SaveGlobalMenuItem;
GtkWidget *SaveLocalMenuItem; GtkWidget *SaveLocalMenuItem;
GtkWidget *RightBox; GtkWidget *RightBox;
GtkWidget *LoadLabel;
GtkWidget *LoadGlobalMenuItem; GtkWidget *LoadGlobalMenuItem;
GtkWidget *LoadLocalMenuItem; GtkWidget *LoadLocalMenuItem;
GtkWidget *LeftBox; GtkWidget *LeftBox;
GtkWidget *DocumentationMenuItem; GtkWidget *DocumentationMenuItem;
GtkWidget *AboutMenuItem; GtkWidget *AboutMenuItem;
// Custom
GtkWidget *MainAddUserButton;
GtkWidget *MainEditUserButton;
GtkWidget *MainDeleteUserButton;
GtkWidget *MainEditGroupsButton;
GtkWidget *MainDefaultUserNameEntry; GtkWidget *InterfaceBox;
GtkWidget *MainDefaultUserAdministratorCheck; // } Standard widgets. DO NOT EDIT - MUST BE SAME AS ublsettings-ui's template_main_window STRUCT
GtkWidget *MainDefaultPasswordEntry; // Type custom parameters below:
GtkWidget *MainRootPasswordEntry; GtkWidget *button1;
GtkWidget *MainPasswordHashCombo; GtkWidget *button2;
GtkWidget *button3;
GtkWidget *AddButton;
GtkWidget *EditButton;
GtkWidget *DeleteButton;
GtkWidget *UpdateButton;
GtkWidget *MainUserTree; GtkWidget *UsersTree;
GtkWidget *GroupsTree;
} main_window; } main_window;
typedef struct {
gboolean adm;
gboolean audio;
gboolean autologin;
gboolean avahi;
gboolean bin;
gboolean brlapi;
gboolean britty;
gboolean bumblbee;
gboolean chrony;
gboolean clamav;
gboolean cockpit_ws;
gboolean cockpit_wsinstance;
gboolean colord;
} groups_config;
typedef struct { typedef struct {
GtkWidget *Window; GtkWidget *Window;
@ -136,68 +121,66 @@ typedef struct {
} documentation_confirmation_window; } documentation_confirmation_window;
typedef struct { typedef struct {
GtkWidget *Window; GtkWidget *GroupsWindow;
GtkWidget *GroupsTree;
GtkWidget *GroupsCancelButton; GtkWidget *GroupsCancelButton;
GtkWidget *GroupsOkButton; GtkWidget *GroupsOkButton;
GtkWidget *GroupsAdmCheck;
GtkWidget *GroupsAudioCheck;
GtkWidget *GroupsAutologinCheck;
GtkWidget *GroupsAvahiCheck;
GtkWidget *GroupsBinCheck;
GtkWidget *GroupsBrlapiCheck;
GtkWidget *GroupsBrittyCheck;
GtkWidget *GroupsBumblbeeCheck;
GtkWidget *GroupsChronyCheck;
GtkWidget *GroupsClamavCheck;
GtkWidget *GroupsCockpitWsCheck;
GtkWidget *GroupsCockpitWsinstanceCheck;
GtkWidget *GroupsColordCheck;
} groups_window; } groups_window;
typedef struct { typedef struct {
int uid; GtkWidget *CreateUserWindow;
gboolean uid_default;
char *username;
char *login;
char *password;
gboolean password_default;
char *main_group;
struct groups_config *additional_groups;
int password_hash;
gboolean sync_SAMBA;
char *extra_options;
} user_config;
typedef struct {
GtkWidget *Window;
GtkWidget *UserCancelButton;
GtkWidget *UserOkButton;
GtkWidget *userGroupsEntry;
GtkWidget *userUIDSystemCheck;
GtkWidget *userUIDAutoCheck; GtkWidget *userUIDAutoCheck;
GtkWidget *userUIDUniqueCheck; GtkWidget *userUIDEntry;
GtkWidget *UserUIDEntry;
GtkWidget *userUserNameEntry;
GtkWidget *userLoginEntry; GtkWidget *userLoginEntry;
GtkWidget *userPasswordCombo;
GtkWidget *userPasswordDefaultCheck;
GtkWidget *userPasswordEntry; GtkWidget *userPasswordEntry;
GtkWidget *userPasswordButton;
GtkWidget *userUserNameEntry;
GtkWidget *userGroupsCheck; GtkWidget *userGroupsCheck;
GtkWidget *UserAdditionalGroupsButton; GtkWidget *userGroupsEntry;
GtkWidget *UserAdditionalGroupsMultipleButton; GtkWidget *UserGroupsButton;
GtkWidget *userShellCombo;
GtkWidget *userCreateHomeFolderCheck; GtkWidget *userCreateHomeFolderCheck;
GtkWidget *userHomeFolderEntry; GtkWidget *userHomeFolderEntry;
GtkWidget *userHomeFolderButton; GtkWidget *userHomeFolderButton;
GtkWidget *userAdditionalGroupsEntry;
GtkWidget *userAdditionalGroupsButton;
GtkWidget *userPasswordChangedEntry;
GtkWidget *userPasswordExpirationEntry;
GtkWidget *userPasswordExpirationButton;
GtkWidget *userPasswordChangeDelayMinimumSpin;
GtkWidget *userPasswordChangeDelayMaximumSpin;
GtkWidget *userWarningSpin;
GtkWidget *userActivitySpin;
GtkWidget *userForceChangeCheck;
GtkWidget *userShellCombo;
GtkWidget *userShellEntry;
GtkWidget *userHomeCombo;
GtkWidget *userHomeEntry;
GtkWidget *userHomeButton;
GtkWidget *userCreateSystemCheck;
GtkWidget *userCreateUnuniqueCheck;
GtkWidget *userDontCheckCheck;
GtkWidget *userSyncSAMBACheck; GtkWidget *userSyncSAMBACheck;
GtkWidget *userDeactivatedCheck;
GtkWidget *userExtraOptionsEntry; GtkWidget *userExtraOptionsEntry;
GtkWidget *UserCancelButton;
GtkWidget *UserOkButton;
GtkWidget *userTitleNameLabel;
} user_window; } user_window;
typedef struct {
GtkWidget *Window;
GtkWidget *StatusBox;
GtkWidget *DefaultUserNameEntry;
GtkWidget *DefaultUserAdministratorCheck;
GtkWidget *DefaultPasswordCombo;
GtkWidget *DefaultPasswordEntry;
GtkWidget *RootPasswordCombo;
GtkWidget *RootPasswordEntry;
GtkWidget *PasswordHashCombo;
GtkWidget *CancelButton;
GtkWidget *AcceptButton;
} additional_config_window;
main_window *setup_window(); main_window *setup_window();

@ -4,39 +4,6 @@
#define TITLE_LABEL _("Users and groups") #define TITLE_LABEL _("Users and groups")
#define TITLE_INFO_LABEL _("System users and groups configuration") #define TITLE_INFO_LABEL _("System users and groups configuration")
#define SUCCESS_LABEL _("Operation succeeded")
#define ROOT_WARNING_LABEL _("Warning! Application was launched without root - root-dependent actions are locked")
#define ABOUT_LABEL _("About")
#define DOCUMENTATION_LABEL _("Documentation")
#define SAVE_LOCAL_LABEL _("Save to local configuration")
#define SAVE_GLOBAL_LABEL _("Save to global configuration")
#define SAVE_CONFIGURATION_LABEL _("Save configuration")
#define SAVE_LABEL _("Save")
#define LOAD_LOCAL_LABEL _("Load local configuration")
#define LOAD_GLOBAL_LABEL _("Load global configuration")
#define LOAD_LABEL _("Load")
#define CANCEL_LABEL _("Cancel")
#define HELP_TITLE_LABEL _("Would you like to read documentation in the Web?")
#define HELP_INFO_LABEL _("You will be redirected to documentation website where documentation is\ntranslated and supported by community.")
#define HELP_ALWAYS_OPEN_LABEL _("Always redirect to online documentation")
#define OPEN_HELP_LABEL _("Open documentation")
#define PROJECT_HOME_LABEL _("Project Home Page")
#define NOTHING_CHOSEN_LABEL _("Nothing were chosen")
#define GLOBAL_LOAD_SUCCESS_LABEL _("Global configuration loading succseeded.")
#define LOCAL_LOAD_SUCCESS_LABEL _("Local configuration loading succseeded.")
#define LOAD_FAILED_LABEL _("Config loading failed")
#define GLOBAL_LOCAL_SAVE_SUCCESS_LABEL _("Local and global configuration saving succseeded.")
#define GLOBAL_SAVE_SUCCESS_LABEL _("Global configuration saving succseeded.")
#define LOCAL_SAVE_SUCCESS_LABEL _("Local configuration saving succseeded.")
#define DEFAULT_USER_GROUPS_LABEL _("Default user groups:") #define DEFAULT_USER_GROUPS_LABEL _("Default user groups:")
#define DEFAULT_USER_NAME_LABEL _("Default user name (if there's no another):") #define DEFAULT_USER_NAME_LABEL _("Default user name (if there's no another):")
#define USER_1000_IS_ADMIN_LABEL _("User with ID 1000 is administrator") #define USER_1000_IS_ADMIN_LABEL _("User with ID 1000 is administrator")

File diff suppressed because it is too large Load Diff

@ -1,424 +0,0 @@
#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 <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <pwd.h>
#include <locale.h>
#include <gtk/gtk.h>
#include <gtk/gtkx.h>
#include <vte/vte.h>
#include <time.h>
#include "../compile/ubl-cmake.h"
#ifdef WEBKIT_FOUND
#include <webkit2/webkit2.h>
#endif
#define DesktopPath "/usr/share/applications/"
#define for_dictionaries(obj, obj1) for (obj = obj1->first; obj != NULL; obj = obj->next)
#define new(type) malloc(sizeof(type))
#define new_arr(type,size) malloc(sizeof(type)*size)
#define get_home_dir_command yon_char_unite("getent passwd \"",yon_ubl_root_user_get(),"\" | cut -d: -f6",NULL)
typedef enum
{
#ifdef __GTK_H__
DICTIONARY_GTK_WIDGETS_TYPE,
#endif
DICTIONARY_OTHER_TYPE=0,
DICTIONARY_CHAR_TYPE,
DICTIONARY_INT_TYPE,
DICTIONARY_BOOL_TYPE,
} DICT_TYPE;
typedef struct dictionary
{
char *key;
void *data;
struct dictionary *next;
struct dictionary *prev;
struct dictionary *first;
DICT_TYPE data_type;
} dictionary;
typedef struct apps
{
char *Name;
int Type;
char *Categories;
char *Exec;
char *Icon;
int Pluggable;
int DualPluggable;
} apps;
typedef char** config_str;
#define config(key) yon_config_get_by_key(key)
#define yon_remalloc(pointer, size) (!pointer) ? malloc(size) : realloc(pointer, size)
// dictionary functions
/**yon_dictionary_get_data(dictionary, type)
* [EN]
* Gets data from dictionary.
* [dictionary] is dictionary, from which data should be extracted;
* [type] is type of data, [dictionary] contains.
* [RU]
* Возвращает данные из словаря.
* [dictionary] - словарь из которого достаются данные.
* [type] - тип данных, хранящихся в словаре [dictionary].
*/
#define yon_dictionary_get_data(dictionary, type) ((type)dictionary->data)
/**yon_dictionary_add_or_create_if_exists_with_data(dict,key,data)
* [EN]
*
* [RU]
* Добавляет элемент словаря в конец словаря [dict] c ключом [key] и данными [data].
* Если словарь не существует, создаёт его
*/
#define yon_dictionary_add_or_create_if_exists_with_data(dict,key,data) {if (!dict) dict=yon_dictionary_new_with_data(key,data); \
else dict=yon_dictionary_append_with_data(dict,key,data);}
dictionary *yon_dictionary_new();
dictionary *yon_dictionary_append(dictionary *targetdict);
dictionary *yon_dictionary_get_last(dictionary *dict);
dictionary *yon_dictionary_swap(dictionary *dict, int aim);
void yon_dictionary_make_first(dictionary *dict);
void yon_dictionary_make_nth(dictionary *dict, int nth);
dictionary *yon_dictionary_new_with_data(char *key, void *data);
dictionary *yon_dictionary_append_with_data(dictionary *dict, char *key, void *data);
dictionary *yon_dictionary_connect(dictionary *old, dictionary *toconnect);
dictionary *yon_dictionary_get(dictionary **dict, char *key);
dictionary *yon_dictionary_rip(dictionary *dict);
dictionary *yon_dictionary_get_nth(dictionary *dict, int place);
void *yon_dictionary_free_all(dictionary *dictionary,void (data_manipulation)(void*));
// char functions
#define yon_char_divide_search_self(str,find,delete_divider) {char *temp = str; str = yon_char_divide_search(str,find,delete_divider); free(temp);}
#define yon_char_is_empty(string) !(string&&strcmp(string,""))
int yon_char_find_last(char *source, char find);
char *yon_char_append(char *source, char *append);
char *yon_char_new(char *chr);
char *yon_char_unite(char *source, ...);
char *yon_cut(char *source, int size, int startpos);
char *yon_char_divide(char *source, int dividepos);
char *yon_char_divide_search(char *source, char *dividepos, int delete_divider);
char *yon_char_from_int(int int_to_convert);
char *yon_char_from_float(float int_to_convert);
char *yon_char_from_long(long int_to_convert);
char *yon_char_replace(char *source, char *find, char*replace);
char **yon_char_parse(char *parameters, int *size, char *divider);
char **yon_char_parsed_rip(char **char_string, int *size, int item_to_delete);
int yon_char_parsed_check_exist(char **parameters, int size, char *param);
int yon_char_parsed_check_repeats(char **parameters, int size, int *first_overlap, int *second_overlap);
int yon_char_find_count(char *source, char *find);
int yon_char_parsed_includes_char_parsed (config_str source, config_str to_check, int source_size, int check_size);
config_str yon_char_parsed_new (int *size, ...);
void yon_char_parsed_free(config_str source, int size);
void yon_char_parsed_copy(config_str *source, config_str *to_copy);
config_str yon_char_parsed_append(config_str parsed, int *size, char *string);
int yon_ubl_check_root();
char *yon_ubl_root_user_get();
char *yon_ubl_user_get_home_directory();
config_str yon_ubl_get_all_users(int *user_size);
// parsing functions
float yon_size_convert_automatic(int bytes, int *size);
config_str philos_list_user(int* size);
apps *yon_apps_scan_and_parse_desktops(int *sizef);
void yon_apps_sort(apps *applist, int size);
apps *yon_apps_get_by_name(apps *applist, char *name, int size);
config_str yon_file_open(char *file_path, int *size);
int yon_file_create(char *path, char *name, int rules);
int yon_file_create_full_path(char *path, int rules);
config_str yon_dir_get_contents(char *dir_path, int *size);
//config functions
#define ubconfig_save_command "ubconfig"
#define ubconfig_load_command "ubconfig --source"
typedef enum {
YON_CONFIG_LOCAL=0,
YON_CONFIG_GLOBAL,
YON_CONFIG_BOTH
} YON_CONFIG_TYPE;
config_str yon_config_load(char *command, int *str_len);
int yon_config_save_registered(char *path);
int yon_config_force_save_registered(char *path);
char *yon_config_get_parameter(config_str parameters, int size, char *param);
int yon_config_load_register(YON_CONFIG_TYPE config_type,char *section,char *parameter, ...);
int yon_config_remove_by_key(char *key);
int yon_config_remove_by_data(void *data);
int yon_config_remove_element(char *key, char *deleted);
void *yon_config_get_by_key(char *key);
void *yon_config_get_all_by_key(char *key, int *size);
char *yon_config_get_key_by_data(char *data);
int yon_config_set(char *key, void *data);
int yon_config_clean();
void yon_config_register(char *key, char* config_section, void *data);
config_str yon_config_get_all();
// terminal-using functions
int yon_launch_app_with_arguments(char *name, char *args);
void yon_launch(char *command);
// Gtk functions
#ifdef __GTK_H__
#ifdef VTE_TERMINAL
void yon_terminal_integrated_launch(GtkWidget *place_to_show, char* command, void *endwork_function, void* endwork_function_argument);
void yon_terminal_integrated_start(GtkWidget *terminal, char* command, void *endwork_function, void* endwork_function_argument);
#endif
enum YON_TYPE{
YON_TYPE_STRING,
YON_TYPE_STRING_LIST,
YON_TYPE_INT,
YON_TYPE_BOOLEAN,
YON_TYPE_OTHER
};
GtkWidget *yon_ubl_menu_item_about_new(char *buttonname);
GtkWidget *yon_ubl_menu_item_documentation_new(char *buttonname);
/**yon_gtk_builder_get_widget(builder, widget_name)
* [EN]
* Returns GtkWidget from GtkBuilder *[builder].
* [builder] is GtkBuilder*;
* [widget_name] is id of widget;
*/
#define yon_gtk_builder_get_widget(builder, widget_name) GTK_WIDGET(gtk_builder_get_object(builder, widget_name))
typedef struct
{
GtkWidget *Icon;
GtkWidget *Label;
GtkWidget *IconView;
GtkListStore *List;
} expander_icon_view;
void yon_window_config_setup(GtkWindow *window);
int yon_window_config_load(char *path);
config_str yon_window_config_get_section(char *section, gsize *size);
void yon_window_config_add_listener(GtkWidget *widget, char *param_name, char *widget_property, enum YON_TYPE val_type);
void yon_window_config_add_custom_parameter(char *param_name, char *section, void *tracked_value, enum YON_TYPE val_type);
void yon_window_config_erase_custom_parameter(char *param_name, char *section);
int yon_window_config_get_parameter(char *section, char *config_parameter, void *return_value, enum YON_TYPE type);
void yon_window_config_custom_window_setup(GtkWindow *window, char *window_name);
void yon_window_config_custom_window_get(GtkWindow *window, char *window_name);
void yon_window_config_custom_window_set(GtkWindow *window, char *window_name);
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);
void yon_gtk_column_minimal_fixed_size_set(GtkTreeViewColumn *column);
int yon_gtk_icon_view_hide_empty(dictionary *icon_view_segment);
int yon_dictionary_gtk_pack_start_multiple_widgets(GtkBox *destination, gboolean expand, gboolean fill, int padding, ...);
int yon_dictionary_gtk_pack_end_multiple_widgets(GtkBox *destination, gboolean expand, gboolean fill, int padding, ...);
void yon_gtk_widget_set_sensitive_from_toggle_button(GtkToggleButton *toggle, GtkWidget *target);
void yon_gtk_widget_set_sensitive_from_toggle_button_inversed(GtkToggleButton *toggle, GtkWidget *target);
void yon_gtk_widget_set_sensitive_from_combo_box(GtkComboBox *toggle, GtkWidget *target);
void yon_gtk_widget_set_sensitive_from_combo_box_inversed(GtkComboBox *toggle, GtkWidget *target);
typedef enum
{
BACKGROUND_IMAGE_SUCCESS_TYPE,
BACKGROUND_IMAGE_FAIL_TYPE
} BACKGROUND_IMAGE_TYPE;
typedef struct {
BACKGROUND_IMAGE_TYPE type;
GtkWidget *icon;
GtkWidget *box;
GtkWidget *label;
char* text_to_render;
} render_data;
/**yon_ubl_status_box_setup(render,icon,box,label)
* [EN]
* Sets up [render] structure of type render_data.
* [icon] is GtkImage widget of status box for showing status icons;
* [box] is GtkBox widget of status box for showing status color;
* [label] is GtkLabel widget of status box for showing status text;
* [RU]
* Настраивает структуру [render] типа render_data.
* [icon] - виджет типа GtkIcon в котором будут отображаться статусные иконки;
* [box] - виджет типа GtkBox в котором будет отображаться цвет статуса;
* [label] - виджет типа GtkLabel в котором будет отображаться текст статусного сообщения;
*/
int yon_ubl_status_box_setup(GtkWidget *icon, GtkWidget *box, GtkWidget *label);
/**yon_ubl_status_box_render(render,text,type)
* [EN]
* Renders message in status box;
* [render] is render_data structure of status box;
* [text] is text to be shown in status box;
* [type] if type of message. Can be BACKGROUND_IMAGE_FAIL_TYPE or BACKGROUND_IMAGE_SUCCESS_TYPE
* [RU]
* Отображает сообщение в статусном окне.
* [render] - структура типа render_data для нужного статусного окна;
* [text] - текст, отображаемый в статусном окне;
* [type] - тип сообщения. Может быть:
* BACKGROUND_IMAGE_FAIL_TYPE (красный фон,иконка - восклицательный знак)
* или
* BACKGROUND_IMAGE_SUCCESS_TYPE (Жёлтный фон, иконка - галка)
*/
void yon_ubl_status_box_render(char *text, BACKGROUND_IMAGE_TYPE type);
void yon_ubl_status_highlight_incorrect(GtkWidget *widget);
void yon_ubl_status_list_store_highlight_incorrect(GtkListStore *list, GtkTreeIter *iter);
static int status_thread_busy;
void yon_ubl_status_box_spawn(GtkContainer *container,char *display_text, int timeout,BACKGROUND_IMAGE_TYPE type);
#ifdef __cplusplus
/**yon_ubl_header_setup(overlay, head, image, imag_path)
* [EN]
* Sets up header of app.
* [overlay] is overlay for app header;
* [head] is box of header, which connects to [overlay]
* [image] is header background image;
* [imag_path] is path of image, shown in [image]
* [RU]
* Настраивает заголовок приложения.
* [overlay] - оверлей заголовка приложения;
* [head] - шапка заголовка, присоединяемая к [overlay]
* [image] - виджет картинки для заднего фона;
* [imag_path] - путь до картинки, загружаемой в [image]
*/
#define yon_ubl_header_setup(overlay, head, image, imag_path) _yon_ubl_header_setup(GTK_WIDGET(overlay.gobj()), GTK_WIDGET(head.gobj()), GTK_WIDGET(image.gobj()), (char *)imag_path)
#else
/**yon_ubl_header_setup(overlay, head, image, imag_path)
* [EN]
* Sets up header of app.
* [overlay] is overlay for app header;
* [head] is box of header, which connects to [overlay]
* [image] is header background image;
* [imag_path] is path of image, shown in [image]
* [RU]
* Настраивает заголовок приложения.
* [overlay] - оверлей заголовка приложения;
* [head] - шапка заголовка, присоединяемая к [overlay]
* [image] - виджет картинки для заднего фона;
* [imag_path] - путь до картинки, загружаемой в [image]
*/
#define yon_ubl_header_setup(overlay, head, image, imag_path) _yon_ubl_header_setup(GTK_WIDGET(overlay), GTK_WIDGET(head), GTK_WIDGET(image), (char *)imag_path)
#define yon_ubl_header_setup_resource(overlay, head, image, imag_path) _yon_ubl_header_setup_resource(GTK_WIDGET(overlay), GTK_WIDGET(head), GTK_WIDGET(image), (char *)imag_path)
#endif
void _yon_ubl_header_setup(GtkWidget *Overlay, GtkWidget *Head, GtkWidget *Image, char *image_path);
void _yon_ubl_header_setup_resource(GtkWidget *Overlay, GtkWidget *Head, GtkWidget *Image, char *image_path);
void yon_ubl_setup_sockets(GtkWidget *main_window, GtkWidget *left_window, GtkWidget *right_window, int socket_main_id, int socket_left_id, int socket_right_id);
#ifdef WEBKIT_FOUND
void yon_ubl_browser_window_open(char *link, char *browser_window_name);
#else
void yon_ubl_browser_window_open(char *link, char *browser_window_name);
#endif
#endif
#endif

@ -12,7 +12,7 @@
<property name="can-focus">False</property> <property name="can-focus">False</property>
<property name="icon-name">com.ublinux.ubl-settings-usergroups.accept-symbolic</property> <property name="icon-name">com.ublinux.ubl-settings-usergroups.accept-symbolic</property>
</object> </object>
<object class="GtkApplicationWindow" id="helpConfirmationWindow"> <object class="GtkApplicationWindow" id="Window">
<property name="width-request">600</property> <property name="width-request">600</property>
<property name="height-request">350</property> <property name="height-request">350</property>
<property name="can-focus">False</property> <property name="can-focus">False</property>
@ -69,7 +69,7 @@
</packing> </packing>
</child> </child>
<child> <child>
<object class="GtkEntry" id="mainDefaultUserNameEntry"> <object class="GtkEntry" id="DefaultUserNameEntry">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can-focus">True</property> <property name="can-focus">True</property>
</object> </object>
@ -87,7 +87,7 @@
</packing> </packing>
</child> </child>
<child> <child>
<object class="GtkCheckButton" id="mainDefaultUserAdministratorCheck"> <object class="GtkCheckButton" id="DefaultUserAdministratorCheck">
<property name="label" translatable="yes">User with ID 1000 is administrator</property> <property name="label" translatable="yes">User with ID 1000 is administrator</property>
<property name="visible">True</property> <property name="visible">True</property>
<property name="can-focus">True</property> <property name="can-focus">True</property>
@ -127,7 +127,7 @@
</packing> </packing>
</child> </child>
<child> <child>
<object class="GtkComboBoxText"> <object class="GtkComboBoxText" id="DefaultPasswordCombo">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can-focus">False</property> <property name="can-focus">False</property>
<items> <items>
@ -144,7 +144,7 @@
</packing> </packing>
</child> </child>
<child> <child>
<object class="GtkEntry" id="mainDefaultPasswordEntry"> <object class="GtkEntry" id="DefaultPasswordEntry">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can-focus">True</property> <property name="can-focus">True</property>
<property name="max-length">30</property> <property name="max-length">30</property>
@ -184,7 +184,7 @@
</packing> </packing>
</child> </child>
<child> <child>
<object class="GtkComboBoxText"> <object class="GtkComboBoxText" id="RootPasswordCombo">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can-focus">False</property> <property name="can-focus">False</property>
<items> <items>
@ -201,7 +201,7 @@
</packing> </packing>
</child> </child>
<child> <child>
<object class="GtkEntry" id="mainRootPasswordEntry"> <object class="GtkEntry" id="RootPasswordEntry">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can-focus">True</property> <property name="can-focus">True</property>
<property name="max-length">30</property> <property name="max-length">30</property>
@ -251,7 +251,7 @@
</packing> </packing>
</child> </child>
<child> <child>
<object class="GtkComboBoxText" id="mainPasswordHashCombo"> <object class="GtkComboBoxText" id="PasswordHashCombo">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can-focus">False</property> <property name="can-focus">False</property>
<property name="active">0</property> <property name="active">0</property>
@ -299,8 +299,8 @@
<property name="halign">end</property> <property name="halign">end</property>
<property name="spacing">5</property> <property name="spacing">5</property>
<child> <child>
<object class="GtkButton"> <object class="GtkButton" id="CancelButton">
<property name="label" translatable="yes">Deny</property> <property name="label" translatable="yes">Cancel</property>
<property name="visible">True</property> <property name="visible">True</property>
<property name="can-focus">True</property> <property name="can-focus">True</property>
<property name="receives-default">True</property> <property name="receives-default">True</property>
@ -313,7 +313,7 @@
</packing> </packing>
</child> </child>
<child> <child>
<object class="GtkButton"> <object class="GtkButton" id="AcceptButton">
<property name="label" translatable="yes">Accept</property> <property name="label" translatable="yes">Accept</property>
<property name="visible">True</property> <property name="visible">True</property>
<property name="can-focus">True</property> <property name="can-focus">True</property>
@ -337,12 +337,12 @@
</object> </object>
</child> </child>
<child type="titlebar"> <child type="titlebar">
<object class="GtkHeaderBar" id="SettingsBar"> <object class="GtkHeaderBar">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can-focus">False</property> <property name="can-focus">False</property>
<property name="show-close-button">True</property> <property name="show-close-button">True</property>
<child type="title"> <child type="title">
<object class="GtkLabel" id="webHeaderNameLabel"> <object class="GtkLabel">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can-focus">False</property> <property name="can-focus">False</property>
<property name="label" translatable="yes">Users and groups</property> <property name="label" translatable="yes">Users and groups</property>

@ -2,7 +2,27 @@
<!-- Generated with glade 3.38.2 --> <!-- Generated with glade 3.38.2 -->
<interface> <interface>
<requires lib="gtk+" version="3.24"/> <requires lib="gtk+" version="3.24"/>
<object class="GtkApplicationWindow" id="CreateUserWindow"> <object class="GtkImage" id="image1">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="icon-name">avatar-default-symbolic</property>
</object>
<object class="GtkImage" id="image2">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="stock">gtk-missing-image</property>
</object>
<object class="GtkImage" id="image4">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="icon-name">process-stop-symbolic</property>
</object>
<object class="GtkImage" id="image5">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="icon-name">emblem-ok-symbolic</property>
</object>
<object class="GtkApplicationWindow" id="CreateGroupWindow">
<property name="can-focus">False</property> <property name="can-focus">False</property>
<property name="resizable">False</property> <property name="resizable">False</property>
<property name="modal">True</property> <property name="modal">True</property>
@ -12,18 +32,29 @@
<object class="GtkBox"> <object class="GtkBox">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can-focus">False</property> <property name="can-focus">False</property>
<property name="margin-left">5</property>
<property name="margin-right">5</property>
<property name="margin-start">5</property>
<property name="margin-end">5</property>
<property name="margin-top">5</property>
<property name="margin-bottom">5</property>
<property name="orientation">vertical</property> <property name="orientation">vertical</property>
<property name="spacing">10</property> <property name="spacing">5</property>
<child>
<object class="GtkBox" id="StatusBox">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="orientation">vertical</property>
<child>
<placeholder/>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child> <child>
<object class="GtkBox"> <object class="GtkBox">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can-focus">False</property> <property name="can-focus">False</property>
<property name="margin-start">5</property>
<property name="margin-end">5</property>
<property name="orientation">vertical</property> <property name="orientation">vertical</property>
<property name="spacing">5</property> <property name="spacing">5</property>
<child> <child>
@ -35,7 +66,7 @@
<object class="GtkLabel" id="label1"> <object class="GtkLabel" id="label1">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can-focus">False</property> <property name="can-focus">False</property>
<property name="label" translatable="yes">UID:</property> <property name="label" translatable="yes">Group Id:</property>
<property name="xalign">0</property> <property name="xalign">0</property>
</object> </object>
<packing> <packing>
@ -62,7 +93,7 @@
<object class="GtkEntry" id="userUIDEntry"> <object class="GtkEntry" id="userUIDEntry">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can-focus">True</property> <property name="can-focus">True</property>
<property name="placeholder-text" translatable="yes">1001</property> <property name="placeholder-text" translatable="yes">1007</property>
<property name="input-purpose">number</property> <property name="input-purpose">number</property>
</object> </object>
<packing> <packing>
@ -87,7 +118,7 @@
<object class="GtkLabel" id="label3"> <object class="GtkLabel" id="label3">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can-focus">False</property> <property name="can-focus">False</property>
<property name="label" translatable="yes">Login:</property> <property name="label" translatable="yes">Group name:</property>
<property name="xalign">0</property> <property name="xalign">0</property>
</object> </object>
<packing> <packing>
@ -124,7 +155,7 @@
<object class="GtkLabel" id="label5"> <object class="GtkLabel" id="label5">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can-focus">False</property> <property name="can-focus">False</property>
<property name="label" translatable="yes">Main group:</property> <property name="label" translatable="yes">Group users:</property>
<property name="xalign">0</property> <property name="xalign">0</property>
</object> </object>
<packing> <packing>
@ -171,14 +202,19 @@
<packing> <packing>
<property name="expand">False</property> <property name="expand">False</property>
<property name="fill">True</property> <property name="fill">True</property>
<property name="position">0</property> <property name="position">1</property>
</packing> </packing>
</child> </child>
<child> <child>
<object class="GtkBox"> <object class="GtkBox">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can-focus">False</property> <property name="can-focus">False</property>
<property name="spacing">30</property> <property name="halign">end</property>
<property name="margin-start">5</property>
<property name="margin-end">5</property>
<property name="margin-top">5</property>
<property name="margin-bottom">5</property>
<property name="spacing">5</property>
<property name="homogeneous">True</property> <property name="homogeneous">True</property>
<child> <child>
<object class="GtkButton" id="UserCancelButton"> <object class="GtkButton" id="UserCancelButton">
@ -222,6 +258,130 @@
<property name="position">1</property> <property name="position">1</property>
</packing> </packing>
</child> </child>
<child>
<object class="GtkFrame">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="margin-start">5</property>
<property name="margin-end">5</property>
<property name="label-xalign">0</property>
<property name="shadow-type">in</property>
<child>
<object class="GtkAlignment">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="left-padding">12</property>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="orientation">vertical</property>
<property name="spacing">5</property>
<child>
<object class="GtkCheckButton">
<property name="label" translatable="yes">Allow creation of groups with ununique GID</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">False</property>
<property name="draw-indicator">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkCheckButton">
<property name="label" translatable="yes">Create system group</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">False</property>
<property name="draw-indicator">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="spacing">5</property>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="label" translatable="yes">Password:</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkComboBoxText">
<property name="visible">True</property>
<property name="can-focus">False</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkEntry">
<property name="visible">True</property>
<property name="can-focus">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
<child>
<object class="GtkButton">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">True</property>
<property name="image">image2</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">3</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
</object>
</child>
</object>
</child>
<child type="label">
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="label" translatable="yes">Additional settings</property>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
</object> </object>
</child> </child>
<child type="titlebar"> <child type="titlebar">
@ -244,28 +404,8 @@
<object class="GtkSizeGroup"> <object class="GtkSizeGroup">
<widgets> <widgets>
<widget name="label1"/> <widget name="label1"/>
<widget name="label2"/>
<widget name="label3"/> <widget name="label3"/>
<widget name="label4"/>
<widget name="label5"/> <widget name="label5"/>
<widget name="label7"/>
<widget name="label8"/>
<widget name="label9"/>
</widgets> </widgets>
</object> </object>
<object class="GtkImage" id="image1">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="icon-name">avatar-default-symbolic</property>
</object>
<object class="GtkImage" id="image4">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="icon-name">process-stop-symbolic</property>
</object>
<object class="GtkImage" id="image5">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="icon-name">emblem-ok-symbolic</property>
</object>
</interface> </interface>

@ -2,34 +2,6 @@
<!-- Generated with glade 3.38.2 --> <!-- Generated with glade 3.38.2 -->
<interface domain="ubl-settings-usergroups"> <interface domain="ubl-settings-usergroups">
<requires lib="gtk+" version="3.24"/> <requires lib="gtk+" version="3.24"/>
<object class="GtkImage" id="image5">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="icon-name">process-stop-symbolic</property>
</object>
<object class="GtkImage" id="image6">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="icon-name">emblem-ok-symbolic</property>
</object>
<object class="GtkApplicationWindow" id="GroupsWindow">
<property name="can-focus">False</property>
<property name="resizable">False</property>
<property name="modal">True</property>
<property name="icon-name">dialog-question-symbolic</property>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="margin-left">5</property>
<property name="margin-right">5</property>
<property name="margin-start">5</property>
<property name="margin-end">5</property>
<property name="margin-top">5</property>
<property name="margin-bottom">5</property>
<property name="orientation">vertical</property>
<property name="spacing">10</property>
<child>
<object class="GtkBox"> <object class="GtkBox">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can-focus">False</property> <property name="can-focus">False</property>
@ -217,6 +189,71 @@
</packing> </packing>
</child> </child>
</object> </object>
<object class="GtkImage" id="image5">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="icon-name">process-stop-symbolic</property>
</object>
<object class="GtkImage" id="image6">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="icon-name">emblem-ok-symbolic</property>
</object>
<object class="GtkApplicationWindow" id="GroupsWindow">
<property name="width-request">250</property>
<property name="height-request">385</property>
<property name="can-focus">False</property>
<property name="resizable">False</property>
<property name="modal">True</property>
<property name="icon-name">dialog-question-symbolic</property>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="margin-left">5</property>
<property name="margin-right">5</property>
<property name="margin-start">5</property>
<property name="margin-end">5</property>
<property name="margin-top">5</property>
<property name="margin-bottom">5</property>
<property name="orientation">vertical</property>
<property name="spacing">10</property>
<child>
<object class="GtkScrolledWindow">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="shadow-type">in</property>
<child>
<object class="GtkTreeView" id="GroupsTree">
<property name="visible">True</property>
<property name="can-focus">True</property>
<child internal-child="selection">
<object class="GtkTreeSelection"/>
</child>
<child>
<object class="GtkTreeViewColumn">
<child>
<object class="GtkCellRendererToggle"/>
<attributes>
<attribute name="active">0</attribute>
</attributes>
</child>
</object>
</child>
<child>
<object class="GtkTreeViewColumn">
<property name="title" translatable="yes">Group</property>
<child>
<object class="GtkCellRendererText"/>
<attributes>
<attribute name="text">1</attribute>
</attributes>
</child>
</object>
</child>
</object>
</child>
</object>
<packing> <packing>
<property name="expand">True</property> <property name="expand">True</property>
<property name="fill">True</property> <property name="fill">True</property>
@ -227,7 +264,8 @@
<object class="GtkBox"> <object class="GtkBox">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can-focus">False</property> <property name="can-focus">False</property>
<property name="spacing">30</property> <property name="halign">end</property>
<property name="spacing">5</property>
<property name="homogeneous">True</property> <property name="homogeneous">True</property>
<child> <child>
<object class="GtkButton" id="GroupsCancelButton"> <object class="GtkButton" id="GroupsCancelButton">
@ -278,7 +316,7 @@
<property name="can-focus">False</property> <property name="can-focus">False</property>
<property name="show-close-button">True</property> <property name="show-close-button">True</property>
<child type="title"> <child type="title">
<object class="GtkLabel" id="groupsTitleLabel"> <object class="GtkLabel">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can-focus">False</property> <property name="can-focus">False</property>
<property name="label" translatable="yes">Users and groups</property> <property name="label" translatable="yes">Users and groups</property>

@ -0,0 +1,310 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.38.2 -->
<interface>
<requires lib="gtk+" version="3.24"/>
<object class="GtkImage" id="image1">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="stock">gtk-missing-image</property>
</object>
<object class="GtkImage" id="image2">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="stock">gtk-missing-image</property>
</object>
<object class="GtkImage" id="image3">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="stock">gtk-missing-image</property>
</object>
<object class="GtkApplicationWindow" id="CreateGroupWindow">
<property name="can-focus">False</property>
<property name="resizable">False</property>
<property name="modal">True</property>
<property name="default-width">450</property>
<property name="icon-name">com.ublinux.ubl-settings-usergroups</property>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="orientation">vertical</property>
<property name="spacing">5</property>
<child>
<object class="GtkBox" id="StatusBox">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="orientation">vertical</property>
<child>
<placeholder/>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="halign">end</property>
<property name="margin-left">5</property>
<property name="margin-right">5</property>
<property name="margin-start">5</property>
<property name="margin-end">5</property>
<property name="margin-top">5</property>
<property name="margin-bottom">5</property>
<property name="spacing">5</property>
<property name="homogeneous">True</property>
<child>
<object class="GtkButton" id="UserCancelButton">
<property name="label" translatable="yes">Cancel</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">True</property>
<property name="image">image4</property>
<style>
<class name="button"/>
</style>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="UserOkButton">
<property name="label" translatable="yes">Save</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">True</property>
<property name="image">image5</property>
<style>
<class name="button"/>
</style>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="pack-type">end</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="orientation">vertical</property>
<property name="spacing">5</property>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="spacing">5</property>
<child>
<object class="GtkLabel" id="label3">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="label" translatable="yes">Parrword:</property>
<property name="xalign">0</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkEntry">
<property name="visible">True</property>
<property name="can-focus">True</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkButton">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">True</property>
<property name="image">image3</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="spacing">5</property>
<child>
<object class="GtkLabel" id="label2">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="label" translatable="yes">Repeat password:</property>
<property name="xalign">0</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkEntry">
<property name="visible">True</property>
<property name="can-focus">True</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkButton">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">True</property>
<property name="image">image1</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkSeparator">
<property name="visible">True</property>
<property name="can-focus">False</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="spacing">5</property>
<child>
<object class="GtkLabel" id="label1">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="label" translatable="yes">Password hash:</property>
<property name="xalign">0</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkEntry">
<property name="visible">True</property>
<property name="can-focus">True</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkButton">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">True</property>
<property name="image">image2</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">3</property>
</packing>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
</object>
</child>
<child type="titlebar">
<object class="GtkHeaderBar">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="show-close-button">True</property>
<child type="title">
<object class="GtkLabel" id="userTitleNameLabel">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="label" translatable="yes">Users and groups</property>
<attributes>
<attribute name="weight" value="bold"/>
</attributes>
</object>
</child>
</object>
</child>
</object>
<object class="GtkSizeGroup">
<widgets>
<widget name="label1"/>
<widget name="label2"/>
<widget name="label3"/>
</widgets>
</object>
<object class="GtkImage" id="image4">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="icon-name">process-stop-symbolic</property>
</object>
<object class="GtkImage" id="image5">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="icon-name">emblem-ok-symbolic</property>
</object>
</interface>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff
Loading…
Cancel
Save