Add gtk152

This commit is contained in:
daleclack 2023-07-28 12:33:42 +08:00
parent d0036d992c
commit 59f9ae7de9
17 changed files with 1277 additions and 8 deletions

View File

@ -0,0 +1,6 @@
{
"C_Cpp.default.configurationProvider": "ms-vscode.cmake-tools",
"files.associations": {
"*.xpm": "cpp"
}
}

View File

@ -0,0 +1,81 @@
set(CMAKE_CXX_STANDARD 17)
cmake_minimum_required(VERSION 3.5.0)
project(gtk152_prefs_gtk4 VERSION 1.0.0)
list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/../../GCR_CMake/macros)
include(GlibCompileResourcesSupport)
include(CTest)
enable_testing()
set(CPACK_PROJECT_NAME ${PROJECT_NAME})
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
include(CPack)
include_directories(.)
include_directories(..)
#Find PkgConfig to use gtkmm3
find_package (PkgConfig REQUIRED)
pkg_check_modules (GTK4 REQUIRED gtk4)
include_directories (${GTK4_INCLUDE_DIRS})
link_directories (${GTK4_LIBRARY_DIRS})
#Find Gettext
# find_package (Gettext REQUIRED)
# set(PO_DIR ${CMAKE_BINARY_DIR}/po/zh_CN/LC_MESSAGES)
#Source files
set(SOURCE_FILE src/main.cpp src/MyPrefs.cpp src/MyItem.cpp)
#Compile Resource
set(RESOURCE_LIST
icons/16x16/actions/folder-images.svg
icons/16x16/actions/list-add.svg
icons/16x16/actions/list-remove.svg
icons/16x16/actions/My_GtkUI.png
icons/16x16/actions/prefs_folder.svg
icons/48x48/actions/dialog-error.png
icons/48x48/actions/My_GtkUI.png
icons/scalable/status/display_prefs.svg
prefs_stack.ui
)
compile_gresources(RESOURCE_FILE
XML_OUT
TYPE EMBED_C
RESOURCES ${RESOURCE_LIST}
PREFIX "/org/gtk/daleclack"
SOURCE_DIR ${PROJECT_SOURCE_DIR}/res)
# Add a custom target to the makefile. Now make builds our resource file.
# It depends on the output RESOURCE_FILE.
add_custom_target(resource ALL DEPENDS ${RESOURCE_FILE})
#For win32 platform,use rc resource and .ico icon
if(WIN32)
SET(CMAKE_RC_COMPILER windres)
set(app_WINRC ../icon.rc)
set_property(SOURCE ../icon.rc APPEND PROPERTY
OBJECT_DEPENDS ${PROJECT_SOURCE_DIR}/../icon.ico
)
add_executable(${PROJECT_NAME} WIN32 ${app_WINRC} ${SOURCE_FILE} ${RESOURCE_FILE})
add_custom_command( TARGET ${PROJECT_NAME}
COMMAND echo * > ${CMAKE_BINARY_DIR}/.gitignore
COMMAND echo **/* > ${CMAKE_BINARY_DIR}/.hgignore)
else()
add_executable(${PROJECT_NAME} ${SOURCE_FILE} ${RESOURCE_FILE})
add_custom_command( TARGET ${PROJECT_NAME}
COMMAND echo \"*\" > ${CMAKE_BINARY_DIR}/.gitignore
COMMAND echo \"**/*\" > ${CMAKE_BINARY_DIR}/.hgignore)
endif(WIN32)
#Add command to generate .gitignore and .mo files
# add_custom_command( TARGET ${PROJECT_NAME}
# COMMAND mkdir -p ${PO_DIR}
# COMMAND ${GETTEXT_MSGFMT_EXECUTABLE} ${CMAKE_SOURCE_DIR}/po/zh_CN.po -o ${PO_DIR}/${PROJECT_NAME}.mo)
SET (CMAKE_EXTRA_CXX_FLAGS ${GTK4_CFLAGS_OTHER})
target_link_libraries (${PROJECT_NAME} ${GTK4_LIBRARIES} -lpthread)

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@ -0,0 +1,36 @@
<svg width="64" height="64" version="1.1" viewBox="0 0 16.933 16.933" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<defs>
<linearGradient id="linearGradient897-3" x1="6.8792" x2="6.8792" y1="285.36" y2="283.77" gradientTransform="matrix(.99998 0 0 .99998 0 -280.06)" gradientUnits="userSpaceOnUse">
<stop offset="0"/>
<stop stop-opacity="0" offset="1"/>
</linearGradient>
<linearGradient id="linearGradient1769-5" x1="445.28" x2="445.28" y1="179.28" y2="200.07" gradientTransform="matrix(.38956 0 0 .38184 -165.52 -63.44)" gradientUnits="userSpaceOnUse">
<stop stop-color="#60c0f0" offset="0"/>
<stop stop-color="#83d4fb" offset="1"/>
</linearGradient>
<linearGradient id="linearGradient860-6" x1="8.4667" x2="8.4667" y1="293.3" y2="292.77" gradientTransform="translate(0,-280.07)" gradientUnits="userSpaceOnUse">
<stop stop-color="#008ea2" stop-opacity=".25" offset="0"/>
<stop stop-color="#fff" stop-opacity=".15" offset="1"/>
</linearGradient>
<linearGradient id="linearGradient868-1" x1="8.4667" x2="8.4667" y1="294.62" y2="293.56" gradientTransform="matrix(.99998 0 0 .99998 0 -280.06)" gradientUnits="userSpaceOnUse">
<stop stop-color="#008ea2" stop-opacity=".25098" offset="0"/>
<stop stop-color="#008ea2" stop-opacity=".15" offset=".75678"/>
<stop stop-color="#fff" stop-opacity=".15" offset="1"/>
</linearGradient>
<linearGradient id="linearGradient907-9" x1="1.0583" x2="15.875" y1="289.59" y2="289.59" gradientTransform="translate(0,-280.07)" gradientUnits="userSpaceOnUse">
<stop stop-color="#46a2d7" stop-opacity=".5" offset="0"/>
<stop stop-color="#46a2d7" stop-opacity="0" offset=".10783"/>
<stop stop-color="#46a2d7" stop-opacity=".095808" offset=".89398"/>
<stop stop-color="#46a2d7" stop-opacity=".5" offset="1"/>
</linearGradient>
</defs>
<image x=".52916" y="1.969" width="15.875" height="13.229" image-rendering="optimizeQuality" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAyCAYAAAAA9rgCAAAACXBIWXMAAA7XAAAO1wFxhj+8AAAA GXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAbVJREFUaIHtml9TglAQRw9/jMrR 6a3v//2q0azMFOhhuXJLRgHv5G3dM8PgqHA57C68/BIOSbxtCLW3RUvy63MOFMAESOkvXQMlsAW+ gB2RiifevgDmwANwB2QDz7UD1sASWAEboApzmeHIaSs7Bx6Bmff9EGpgCtwjN2+B3ICSiKqdN/sC qewMaeehsjTH3CCd4UbjBXhHWv0S0gdrukpOkDYeU1kf1y3T5pwF0uJviHTVdREd5+izzilqZMxK vNFyglmznSPrkyKyGdLia2Sm+1T61BsiPXGsYwd8Ijd7TXOzc++PoWT9xSe07V0RpsJD3hwbpMOe kNEq86OHhMG1+SVm2D1TSuR1Wf2FsCN0B/Vd8xZ5GC+Ar2PzoIWMdrSSaxAG7xllwtoxYe2YsHZM WDsmrB0T1o4Ja8eEtWPC2jFh7ZiwdkxYOyasHRPWjglr52qFo48MnsneL6WNDfYJnPxHasStBGon vEWiPdFmJEfislofNJEpl82q+RkzukQAJTROdgU8I3mtKvd+WNJmm8aES2OjRLp2AbzSdG+o+HBs uLndIgXcj2qX0NiAeGx0Bta/AZSga/2YDpsuAAAAAElFTkSuQmCC "/>
<path d="m2.21 2.38h2.695c0.75074 0 0.78302 0.0285 1.5421 0.62962 0.78159 0.5904 0.94779 0.607 1.8636 0.607l6.4126-0.0524c0.638-5e-3 1.1517 0.51363 1.1517 1.1516v6.77c0 0.63802-0.51364 1.1517-1.1517 1.1517h-12.513c-0.63802 0-1.1517-0.51364-1.1517-1.1517v-7.9542c0-0.63802 0.51364-1.1517 1.1517-1.1517z" fill="#46a2d7"/>
<path d="m2.2102 2.3812c-0.63801 0-1.1518 0.51384-1.1518 1.1518v2.8167h14.816v-1.633c0-0.63801-0.51387-1.1563-1.1518-1.1513l-6.4124 0.052194c-0.91582 0-1.0818-0.016798-1.8634-0.60718-0.75908-0.6011-0.79128-0.62941-1.542-0.62941h-2.695z" fill="url(#linearGradient897-3)" opacity=".35" stroke-width=".26458"/>
<rect x="1.0583" y="4.49" width="14.817" height="10.054" rx="1.1517" ry="1.1288" fill="url(#linearGradient1769-5)"/>
<rect x="1.0583" y="12.7" width="14.817" height=".52915" fill="url(#linearGradient860-6)"/>
<path d="m1.0655 13.494c0.03752 0.59168 0.5312 1.0583 1.1446 1.0583h12.513c0.6134 0 1.1071-0.46664 1.1446-1.0583h-14.802z" fill="url(#linearGradient868-1)" stroke-width=".26458"/>
<rect x="1.0583" y="4.49" width="14.817" height="10.054" rx="1.1517" ry="1.1288" fill="url(#linearGradient907-9)"/>
<path d="m2.2102 4.4979c-0.63801 0-1.1518 0.50323-1.1518 1.1286v0.23512c0-0.6089 0.51384-1.0991 1.1518-1.0991h12.513c0.63801 0 1.1518 0.49024 1.1518 1.0991v-0.23512c0-0.62536-0.51384-1.1286-1.1518-1.1286z" fill="#ffffff" opacity=".1" stroke-width=".26458"/>
<path class="ColorScheme-Text" d="m5.78 6.3295c-0.49611 0-0.89549 0.39938-0.89549 0.89549v4.0298c0 0.49611 0.39938 0.89549 0.89549 0.89549h5.3731c0.49611 0 0.89549-0.39938 0.89549-0.89549v-4.0298c0-0.49611-0.39938-0.89549-0.89549-0.89549zm0 0.44775h5.3731c0.24805 0 0.44775 0.1997 0.44775 0.44775v4.0298l-2.2387-2.2387-1.5579 1.791-1.1286-0.89549-1.3432 1.3432v-4.0298c0-0.24805 0.1997-0.44775 0.44775-0.44775zm1.1194 0.89549c-0.37094 0-0.67163 0.30069-0.67163 0.67163 0 0.37094 0.30069 0.67163 0.67163 0.67163 0.37094 0 0.67163-0.30069 0.67163-0.67163 0-0.37094-0.30069-0.67163-0.67163-0.67163z" color="#363636" fill="#000000" opacity=".15" stroke-width=".44775"/>
</svg>

After

Width:  |  Height:  |  Size: 4.7 KiB

View File

@ -0,0 +1,13 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16">
<defs id="defs3051">
<style type="text/css" id="current-color-scheme">
.ColorScheme-Text {
color:#363636;
}
</style>
</defs>
<path style="fill:currentColor;fill-opacity:1;stroke:none"
d="M 7 3.0058594 L 7 8 L 2 8 L 2 8.9980469 L 7 8.9980469 L 7 14.007812 L 8 14.007812 L 8 8.9980469 L 13 8.9980469 L 13 8 L 8 8 L 8 3.0058594 L 7 3.0058594 z "
class="ColorScheme-Text"
/>
</svg>

After

Width:  |  Height:  |  Size: 490 B

View File

@ -0,0 +1,8 @@
<svg version="1.1" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg">
<defs>
<style id="current-color-scheme" type="text/css">.ColorScheme-Text {
color:#363636;
}</style>
</defs>
<path class="ColorScheme-Text" d="m3 8v1h10v-1z" fill="currentColor"/>
</svg>

After

Width:  |  Height:  |  Size: 281 B

View File

@ -0,0 +1,35 @@
<svg width="64" height="64" version="1.1" viewBox="0 0 16.933 16.933" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<defs>
<linearGradient id="linearGradient1769" x1="445.28" x2="445.28" y1="179.28" y2="200.07" gradientTransform="matrix(.38956 0 0 .38184 -165.52 -63.44)" gradientUnits="userSpaceOnUse">
<stop stop-color="#60c0f0" offset="0"/>
<stop stop-color="#83d4fb" offset="1"/>
</linearGradient>
<linearGradient id="linearGradient860" x1="8.4667" x2="8.4667" y1="293.3" y2="292.77" gradientTransform="translate(0,-280.07)" gradientUnits="userSpaceOnUse">
<stop stop-color="#008ea2" stop-opacity=".25" offset="0"/>
<stop stop-color="#fff" stop-opacity=".15" offset="1"/>
</linearGradient>
<linearGradient id="linearGradient868" x1="8.4667" x2="8.4667" y1="294.62" y2="293.56" gradientTransform="matrix(.99998 0 0 .99998 0 -280.06)" gradientUnits="userSpaceOnUse">
<stop stop-color="#008ea2" stop-opacity=".25098" offset="0"/>
<stop stop-color="#008ea2" stop-opacity=".15" offset=".75678"/>
<stop stop-color="#fff" stop-opacity=".15" offset="1"/>
</linearGradient>
<linearGradient id="linearGradient897" x1="6.8792" x2="6.8792" y1="285.36" y2="283.77" gradientTransform="matrix(.99998 0 0 .99998 0 -280.06)" gradientUnits="userSpaceOnUse">
<stop offset="0"/>
<stop stop-opacity="0" offset="1"/>
</linearGradient>
<linearGradient id="linearGradient907" x1="1.0583" x2="15.875" y1="289.59" y2="289.59" gradientTransform="translate(0,-280.07)" gradientUnits="userSpaceOnUse">
<stop stop-color="#46a2d7" stop-opacity=".5" offset="0"/>
<stop stop-color="#46a2d7" stop-opacity="0" offset=".10783"/>
<stop stop-color="#46a2d7" stop-opacity=".095808" offset=".89398"/>
<stop stop-color="#46a2d7" stop-opacity=".5" offset="1"/>
</linearGradient>
</defs>
<image x=".52916" y="1.969" width="15.875" height="13.229" image-rendering="optimizeQuality" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAyCAYAAAAA9rgCAAAACXBIWXMAAA7XAAAO1wFxhj+8AAAA GXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAbVJREFUaIHtml9TglAQRw9/jMrR 6a3v//2q0azMFOhhuXJLRgHv5G3dM8PgqHA57C68/BIOSbxtCLW3RUvy63MOFMAESOkvXQMlsAW+ gB2RiifevgDmwANwB2QDz7UD1sASWAEboApzmeHIaSs7Bx6Bmff9EGpgCtwjN2+B3ICSiKqdN/sC qewMaeehsjTH3CCd4UbjBXhHWv0S0gdrukpOkDYeU1kf1y3T5pwF0uJviHTVdREd5+izzilqZMxK vNFyglmznSPrkyKyGdLia2Sm+1T61BsiPXGsYwd8Ijd7TXOzc++PoWT9xSe07V0RpsJD3hwbpMOe kNEq86OHhMG1+SVm2D1TSuR1Wf2FsCN0B/Vd8xZ5GC+Ar2PzoIWMdrSSaxAG7xllwtoxYe2YsHZM WDsmrB0T1o4Ja8eEtWPC2jFh7ZiwdkxYOyasHRPWjglr52qFo48MnsneL6WNDfYJnPxHasStBGon vEWiPdFmJEfislofNJEpl82q+RkzukQAJTROdgU8I3mtKvd+WNJmm8aES2OjRLp2AbzSdG+o+HBs uLndIgXcj2qX0NiAeGx0Bta/AZSga/2YDpsuAAAAAElFTkSuQmCC "/>
<path d="m2.21 2.38h2.695c0.75074 0 0.78302 0.0285 1.5421 0.62962 0.78159 0.5904 0.94779 0.607 1.8636 0.607l6.4126-0.0524c0.638-5e-3 1.1517 0.51363 1.1517 1.1516v6.77c0 0.63802-0.51364 1.1517-1.1517 1.1517h-12.513c-0.63802 0-1.1517-0.51364-1.1517-1.1517v-7.9542c0-0.63802 0.51364-1.1517 1.1517-1.1517z" fill="#46a2d7"/>
<path d="m2.2102 2.3812c-0.63801 0-1.1518 0.51384-1.1518 1.1518v2.8167h14.816v-1.633c0-0.63801-0.51387-1.1563-1.1518-1.1513l-6.4124 0.052194c-0.91582 0-1.0818-0.016798-1.8634-0.60718-0.75908-0.6011-0.79128-0.62941-1.542-0.62941h-2.695z" fill="url(#linearGradient897)" opacity=".35" stroke-width=".26458"/>
<rect x="1.0583" y="4.49" width="14.817" height="10.054" rx="1.1517" ry="1.1288" fill="url(#linearGradient1769)"/>
<rect x="1.0583" y="12.7" width="14.817" height=".52915" fill="url(#linearGradient860)"/>
<path d="m1.0655 13.494c0.03752 0.59168 0.5312 1.0583 1.1446 1.0583h12.513c0.6134 0 1.1071-0.46664 1.1446-1.0583h-14.802z" fill="url(#linearGradient868)" stroke-width=".26458"/>
<rect x="1.0583" y="4.49" width="14.817" height="10.054" rx="1.1517" ry="1.1288" fill="url(#linearGradient907)"/>
<path d="m2.2102 4.4979c-0.63801 0-1.1518 0.50323-1.1518 1.1286v0.23512c0-0.6089 0.51384-1.0991 1.1518-1.0991h12.513c0.63801 0 1.1518 0.49024 1.1518 1.0991v-0.23512c0-0.62536-0.51384-1.1286-1.1518-1.1286z" fill="#fff" opacity=".1" stroke-width=".26458"/>
</svg>

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

View File

@ -0,0 +1,54 @@
<svg width="64" height="64" version="1.1" viewBox="0 0 64 64" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<linearGradient id="a">
<stop stop-color="#909090" offset="0"/>
<stop stop-color="#636363" stop-opacity="0" offset="1"/>
</linearGradient>
<radialGradient id="b" cx="199.22" cy="60.978" r="62.148" gradientTransform="matrix(1.0119 3e-8 -1.5e-7 5.0958 -134.28 -251.23)" gradientUnits="userSpaceOnUse">
<stop stop-color="#e6e6e8" offset="0"/>
<stop stop-color="#cbccce" offset="1"/>
</radialGradient>
<radialGradient id="c" cx="199.22" cy="60.978" r="62.148" gradientTransform="matrix(1.3103 -4e-8 1e-7 3.6151 -193.73 -160.94)" gradientUnits="userSpaceOnUse">
<stop stop-color="#ececef" offset="0"/>
<stop stop-color="#cbccce" stop-opacity="0" offset="1"/>
</radialGradient>
<filter id="d" x="-.01448" y="-.016908" width="1.029" height="1.0338" color-interpolation-filters="sRGB">
<feGaussianBlur stdDeviation=".74992302"/>
</filter>
<linearGradient id="e" x1="174.79" x2="174.86" y1="109.47" y2="118.12" gradientUnits="userSpaceOnUse">
<stop stop-color="#909090" offset="0"/>
<stop stop-color="#727272" stop-opacity="0" offset="1"/>
</linearGradient>
<radialGradient id="f" cx="178.79" cy="120.7" r="22.055" gradientTransform="matrix(3.8591 -2.3e-7 0 .1388 -511.17 103.95)" gradientUnits="userSpaceOnUse" xlink:href="#a"/>
<filter id="g" x="-.040865" y="-.504" width="1.0817" height="2.008" color-interpolation-filters="sRGB">
<feGaussianBlur stdDeviation=".32830532"/>
</filter>
<filter id="h" x="-.080467" y="-.24545" width="1.1609" height="1.4909" color-interpolation-filters="sRGB">
<feGaussianBlur stdDeviation="1.4789442"/>
</filter>
<linearGradient id="i" x1="183.06" x2="183.06" y1="129.42" y2="127.06" gradientUnits="userSpaceOnUse" xlink:href="#a"/>
<linearGradient id="j" x1="23.844" x2="23.816" y1="17.574" y2="85.151" gradientUnits="userSpaceOnUse">
<stop stop-color="#1bd2fa" offset="0"/>
<stop stop-color="#1c7ef2" offset="1"/>
</linearGradient>
<g transform="matrix(.48966 0 0 .48209 -.95621 -1.3862)">
<g stroke-width="2.0582">
<rect x="5.1564" y="8.7788" width="124.3" height="103.95" rx="5.6617" fill="#1a1a1a" filter="url(#d)" opacity=".887"/>
<rect x="5.1564" y="8.7788" width="124.3" height="103.95" rx="5.6617" fill="url(#b)"/>
<rect x="5.1564" y="8.7788" width="124.3" height="103.95" rx="5.6617" fill="url(#c)"/>
<path d="m10.818 8.778c-3.1366 0-5.6621 2.5256-5.6621 5.6621v75.664h124.3v-75.664c0-3.1366-2.5256-5.6621-5.6621-5.6621z" fill="#080808"/>
<path d="m10.318 12.353h113.49v73.329h-113.49z" fill="url(#j)"/>
<path d="m5.1558 106.01v1.0566c0 3.1366 2.5256 5.6621 5.6621 5.6621h112.97c3.1366 0 5.6621-2.5256 5.6621-5.6621v-1.0566c0 3.1366-2.5256 5.6621-5.6621 5.6621h-112.97c-3.1366 0-5.6621-2.5256-5.6621-5.6621z" fill="#afafaf"/>
<g transform="translate(-111.48 -1.4739)">
<path d="m194.34 114.95c-0.0882 3.6995-0.94643 7.8217 4.9506 11.334 4.7067 2.9258-2.6114 3.1267-4.4295 3.1267h-5.6672-26.478c-1.8181 0-9.1362-0.20092-4.4295-3.1267 5.8971-3.5127 5.0389-7.6349 4.9506-11.334z" filter="url(#h)"/>
<path d="m194.34 113.47c-0.0882 3.6995-0.94643 7.8217 4.9506 11.334 4.7067 2.9258-2.6114 3.1267-4.4295 3.1267-10.492 0.46272-21.162 0.7623-32.145 0-1.8181 0-9.1362-0.20092-4.4295-3.1267 5.8971-3.5127 5.0389-7.6349 4.9506-11.334z" fill="#e0e1e6"/>
<path d="m194.34 113.47c-0.0882 3.6995-0.94643 7.8217 4.9506 11.334 4.7067 2.9258-2.6114 3.1267-4.4295 3.1267h-5.6672-26.478c-1.8181 0-9.1362-0.20092-4.4295-3.1267 5.8971-3.5127 5.0389-7.6349 4.9506-11.334z" fill="url(#e)"/>
<path d="m194.34 113.47c-0.0882 3.6995-0.94643 7.8217 4.9506 11.334 4.7067 2.9258-2.6114 3.1267-4.4295 3.1267h-5.6672-26.478c-1.8181 0-9.1362-0.20092-4.4295-3.1267 5.8971-3.5127 5.0389-7.6349 4.9506-11.334z" fill="url(#f)"/>
<ellipse cx="178.29" cy="127.15" rx="15.764" ry=".78168" fill="#fff" filter="url(#g)" opacity=".887"/>
<path d="m194.34 113.47c-0.0882 3.6995-0.94643 7.8217 4.9506 11.334 4.7067 2.9258-2.6114 3.1267-4.4295 3.1267h-5.6672-26.478c-1.8181 0-9.1362-0.20092-4.4295-3.1267 5.8971-3.5127 5.0389-7.6349 4.9506-11.334z" fill="url(#i)"/>
</g>
</g>
<path d="m71.574 102.9c-0.16003 0.36969-0.34945 0.70998-0.56891 1.0228-0.29914 0.42652-0.54408 0.72174-0.73285 0.8857-0.29261 0.26911-0.60613 0.4069-0.94186 0.41475-0.24102 0-0.53167-0.0687-0.87001-0.2077-0.33945-0.13848-0.6514-0.20705-0.93664-0.20705-0.29915 0-0.61998 0.0687-0.96315 0.20705-0.3437 0.13913-0.62057 0.21162-0.83226 0.21882-0.32195 0.0137-0.64285-0.12802-0.96316-0.42587-0.20444-0.1783-0.46015-0.48401-0.76648-0.91705-0.32868-0.46244-0.59889-0.99867-0.81058-1.61-0.22671-0.66033-0.34036-1.2998-0.34036-1.9189 0-0.70913 0.15323-1.3207 0.46015-1.8333 0.24121-0.41168 0.56211-0.73643 0.96374-0.97484 0.40163-0.2384 0.83559-0.35988 1.3029-0.36765 0.25572 0 0.59105 0.0791 1.0078 0.23454 0.41554 0.15598 0.68236 0.23507 0.79934 0.23507 0.0875 0 0.38386-0.0925 0.88634-0.27687 0.47518-0.171 0.87622-0.2418 1.2048-0.21391 0.89026 0.0718 1.5591 0.4228 2.0039 1.0551-0.79621 0.48241-1.1901 1.1581-1.1822 2.0249 7e-3 0.6752 0.25212 1.237 0.7335 1.6831 0.21816 0.20707 0.46179 0.36709 0.73285 0.48075-0.0588 0.17044-0.12084 0.33376-0.1868 0.49052zm-2.0418-8.0346c0 0.5292-0.19334 1.0233-0.5787 1.4806-0.46506 0.5437-1.0276 0.85787-1.6376 0.80829-8e-3 -0.0634-0.0123-0.13031-0.0123-0.20052 0-0.50803 0.22116-1.0517 0.61391-1.4963 0.19608-0.22508 0.44546-0.41224 0.74787-0.56153 0.30176-0.14706 0.5872-0.22839 0.85564-0.24232 8e-3 0.07076 0.0112 0.1415 0.0112 0.21169z" fill="#1e1f28" stroke-width=".13443"/>
<path d="m10.318 12.352v73.33h113.49v-73.33zm0.55273 0.50781h112.48v72.361h-112.48z" fill-opacity=".21198" stroke-width="2.0582"/>
<path d="m10.818 9.0273c-3.1366 0-5.6621 2.5256-5.6621 5.6621v75.414h124.3v-75.414c0-3.1366-2.5255-5.6621-5.6621-5.6621zm-0.5 5.3262h113.49v71.328h-113.49z" fill="#080808" stroke-width="2.0582"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.8 KiB

View File

@ -0,0 +1,368 @@
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<requires lib="gtk" version="4.0"/>
<object class="GtkAdjustment" id="adjustment1">
<property name="upper">9999</property>
<property name="value">1024</property>
<property name="step-increment">1</property>
<property name="page-increment">10</property>
</object>
<object class="GtkAdjustment" id="adjustment2">
<property name="upper">9999</property>
<property name="value">576</property>
<property name="step-increment">1</property>
<property name="page-increment">10</property>
</object>
<object class="GtkStringList" id="sizes_list">
<items>
<item translatable="yes">640x360</item>
<item translatable="yes">800x450</item>
<item translatable="yes">1024x576</item>
<item translatable="yes">1280x720</item>
<item translatable="yes">1366x768</item>
</items>
</object>
<object class="GtkBox" id="stack_box">
<property name="hexpand">1</property>
<property name="vexpand">1</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkStackSwitcher">
<property name="halign">center</property>
<property name="stack">main_stack</property>
</object>
</child>
<child>
<object class="GtkStack" id="main_stack">
<child>
<object class="GtkStackPage">
<property name="title" translatable="1">Background Preferences</property>
<property name="child">
<object class="GtkBox" id="back_page">
<property name="orientation">vertical</property>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
</object>
</property>
</object>
</child>
<child>
<object class="GtkStackPage">
<property name="title" translatable="1">Window Size Config</property>
<property name="child">
<object class="GtkBox" id="winsize_page">
<property name="halign">center</property>
<property name="valign">center</property>
<property name="hexpand">1</property>
<property name="vexpand">1</property>
<property name="orientation">vertical</property>
<property name="spacing">5</property>
<child>
<placeholder/>
</child>
<child>
<object class="GtkBox">
<property name="halign">center</property>
<property name="valign">center</property>
<property name="spacing">5</property>
<child>
<object class="GtkImage">
<property name="pixel-size">128</property>
<property name="icon-name">display_prefs</property>
</object>
</child>
<child>
<object class="GtkGrid">
<property name="row-spacing">5</property>
<property name="column-spacing">5</property>
<child>
<object class="GtkBox" id="combo_box">
<layout>
<property name="column">1</property>
<property name="row">1</property>
<property name="column-span">3</property>
</layout>
</object>
</child>
<child>
<object class="GtkCheckButton" id="radio_default">
<property name="label" translatable="1">Use default window size</property>
<property name="focusable">1</property>
<property name="active">1</property>
<property name="group">radio_custom</property>
<layout>
<property name="column">1</property>
<property name="row">0</property>
<property name="column-span">3</property>
</layout>
</object>
</child>
<child>
<object class="GtkCheckButton" id="radio_custom">
<property name="label" translatable="1">User defined window size</property>
<property name="focusable">1</property>
<layout>
<property name="column">1</property>
<property name="row">2</property>
<property name="column-span">3</property>
</layout>
</object>
</child>
<child>
<object class="GtkSpinButton" id="spin_width">
<property name="sensitive">0</property>
<property name="focusable">1</property>
<property name="adjustment">adjustment1</property>
<property name="value">1024</property>
<layout>
<property name="column">1</property>
<property name="row">3</property>
</layout>
</object>
</child>
<child>
<object class="GtkSpinButton" id="spin_height">
<property name="sensitive">0</property>
<property name="focusable">1</property>
<property name="adjustment">adjustment2</property>
<property name="value">576</property>
<layout>
<property name="column">3</property>
<property name="row">3</property>
</layout>
</object>
</child>
<child>
<object class="GtkLabel">
<property name="label" translatable="1">x</property>
<layout>
<property name="column">2</property>
<property name="row">3</property>
</layout>
</object>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
</object>
</child>
</object>
</child>
<child>
<object class="GtkBox">
<property name="hexpand">1</property>
<property name="vexpand">1</property>
<child>
<object class="GtkLabel" id="label_size">
<property name="label" translatable="1">Current Config: </property>
</object>
</child>
<child>
<object class="GtkButton" id="btnGet">
<property name="label" translatable="1">Get Current</property>
<property name="sensitive">0</property>
<property name="focusable">1</property>
<property name="receives-default">1</property>
</object>
</child>
<child>
<object class="GtkButton" id="btnapply">
<property name="label" translatable="1">Apply</property>
<property name="focusable">1</property>
<property name="receives-default">1</property>
<property name="halign">end</property>
</object>
</child>
</object>
</child>
</object>
</property>
</object>
</child>
<child>
<object class="GtkStackPage">
<property name="title" translatable="1">Dock Preferences</property>
<property name="child">
<object class="GtkBox" id="dock_page">
<property name="halign">center</property>
<property name="valign">center</property>
<property name="orientation">vertical</property>
<child>
<placeholder/>
</child>
<child>
<object class="GtkBox">
<property name="halign">center</property>
<property name="valign">center</property>
<property name="spacing">5</property>
<child>
<object class="GtkImage">
<property name="pixel-size">128</property>
<property name="icon-name">display_prefs</property>
</object>
</child>
<child>
<object class="GtkGrid">
<property name="row-spacing">5</property>
<property name="column-spacing">5</property>
<child>
<object class="GtkCheckButton" id="mode_check">
<property name="label" translatable="1">Use panel mode:expand the dock</property>
<property name="focusable">1</property>
<layout>
<property name="column">1</property>
<property name="row">0</property>
<property name="column-span">3</property>
</layout>
</object>
</child>
<child>
<object class="GtkLabel">
<property name="label" translatable="1">Position:</property>
<layout>
<property name="column">1</property>
<property name="row">2</property>
</layout>
</object>
</child>
<child>
<object class="GtkCheckButton" id="radio_left">
<property name="label" translatable="1">Left</property>
<property name="focusable">1</property>
<property name="active">1</property>
<layout>
<property name="column">2</property>
<property name="row">2</property>
</layout>
</object>
</child>
<child>
<object class="GtkCheckButton" id="radio_right">
<property name="label" translatable="1">Right</property>
<property name="focusable">1</property>
<property name="group">radio_left</property>
<layout>
<property name="column">2</property>
<property name="row">3</property>
</layout>
</object>
</child>
<child>
<object class="GtkCheckButton" id="radio_bottom">
<property name="label" translatable="1">Bottom</property>
<property name="focusable">1</property>
<property name="group">radio_left</property>
<layout>
<property name="column">2</property>
<property name="row">4</property>
</layout>
</object>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
</object>
</child>
</object>
</child>
<child>
<object class="GtkBox">
<property name="hexpand">1</property>
<property name="vexpand">1</property>
<child>
<object class="GtkLabel">
<property name="label" translatable="1"> </property>
<property name="hexpand">1</property>
</object>
</child>
<child>
<object class="GtkButton" id="btnapply1">
<property name="label" translatable="1">Apply</property>
<property name="focusable">1</property>
<property name="receives-default">1</property>
<property name="halign">end</property>
</object>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
</object>
</child>
</object>
</property>
</object>
</child>
</object>
</child>
<child>
<placeholder/>
</child>
</object>
</interface>

View File

@ -0,0 +1,51 @@
#include "MyItem.h"
// File name and path limits
#define name_max_length 256
#define path_max_length 4096
struct _MyItem
{
GObject parent_instance;
char col_name[name_max_length], col_path[path_max_length];
gboolean internal;
};
G_DEFINE_TYPE(MyItem, my_item, G_TYPE_OBJECT)
// Get display name
const char *my_item_get_display_name(MyItem *item)
{
return item->col_name;
}
// Get Path
const char *my_item_get_path(MyItem *item)
{
return item->col_path;
}
// Get whether the image is internal
gboolean my_item_get_internal(MyItem *item)
{
return item->internal;
}
static void my_item_init(MyItem *self)
{
}
static void my_item_class_init(MyItemClass *klass)
{
}
MyItem *my_item_new(const char *disp_name, const char *path,
gboolean internal1)
{
// Create a object
MyItem *item = MY_ITEM(g_object_new(my_item_get_type(), NULL));
strncpy(item->col_name, disp_name, name_max_length);
strncpy(item->col_path, path, path_max_length);
item->internal = internal1;
return item;
}

View File

@ -0,0 +1,18 @@
#pragma once
#include <gtk/gtk.h>
G_DECLARE_FINAL_TYPE(MyItem, my_item, MY, ITEM, GObject)
// Create a new item
MyItem *my_item_new(const char *disp_name, const char *path,
gboolean internal1);
// Get display name
const char *my_item_get_display_name(MyItem *item);
// Get Path
const char *my_item_get_path(MyItem *item);
// Get whether the image is internal
gboolean my_item_get_internal(MyItem *item);

View File

@ -0,0 +1,541 @@
#include "MyPrefs.h"
#include "MyItem.h"
#include "winpe.xpm"
#include "img7.xpm"
#include "image_types.h"
#include <string>
struct _MyPrefs
{
GtkWindow parent_instance;
GtkBuilder *prefs_builder;
GtkWidget *background, *back_page;
GtkWidget *stack_box, *combo_box;
// Widget for window size config
GtkWidget *label_size;
GtkWidget *sizes_drop;
// Widget for dock position and mode
GtkWidget *mode_check;
// Widget for background selection
GtkWidget *folders_view, *images_view;
GtkWidget *btns_box, *views_box;
GtkWidget *folders_sw, *images_sw;
GtkWidget *btn_add, *btn_remove;
// List stores
GListStore *folders_list, *images_list;
GFile *file;
GtkDirectoryList *file_list;
GtkSingleSelection *folders_select, *image_select;
// Folders view
GtkColumnViewColumn *folder_image_column;
GtkColumnViewColumn *folder_string_column;
GtkListItemFactory *factory_folder_image;
GtkListItemFactory *factory_folder_string;
// Images view
GtkColumnViewColumn *pics_image_column;
GtkColumnViewColumn *pics_string_column;
GtkListItemFactory *factory_pics_image;
GtkListItemFactory *factory_pics_string;
// Pixbufs
GdkPixbuf *pixbuf, *sized;
int width, height;
int current_folder_index, current_image_index;
};
G_DEFINE_TYPE(MyPrefs, my_prefs, GTK_TYPE_WINDOW)
static void factory_folder_image_setup(GtkListItemFactory *factory, GtkListItem *item)
{
// Create image
GtkWidget *image = gtk_image_new();
gtk_image_set_pixel_size(GTK_IMAGE(image), 16);
gtk_list_item_set_child(item, image);
}
static void factory_folder_image_bind(GtkListItemFactory *factory, GtkListItem *item)
{
// Get Image Widget
GtkWidget *image = gtk_list_item_get_child(item);
// Get icon_name
MyItem *item1 = MY_ITEM(gtk_list_item_get_item(item));
gtk_image_set_from_icon_name(GTK_IMAGE(image), "prefs_folder");
}
static void factory_folder_string_setup(GtkListItemFactory *factory, GtkListItem *item)
{
// Add a label
GtkWidget *label = gtk_label_new("");
gtk_widget_set_halign(label, GTK_ALIGN_START);
gtk_list_item_set_child(item, label);
}
static void factory_folder_string_bind(GtkListItemFactory *factory, GtkListItem *item)
{
// Set names from label
GtkWidget *label = gtk_list_item_get_child(item);
// Get display name
MyItem *item1 = MY_ITEM(gtk_list_item_get_item(item));
gtk_label_set_label(GTK_LABEL(label),
my_item_get_display_name(item1));
}
static void folder_view_init(MyPrefs *self)
{
// Create store for folders column view
self->folders_list = g_list_store_new(my_item_get_type());
g_list_store_append(self->folders_list,
my_item_new("Default Backgrounds", ":0", TRUE));
g_list_store_append(self->folders_list,
my_item_new("User's Home directory", g_get_home_dir(), FALSE));
g_list_store_append(self->folders_list,
my_item_new("User's Picture directory",
g_get_user_special_dir(G_USER_DIRECTORY_PICTURES),
FALSE));
self->folders_select = gtk_single_selection_new(G_LIST_MODEL(self->folders_list));
gtk_single_selection_set_selected(self->folders_select, 0);
// Create factories to renderer the list
self->folders_view = gtk_column_view_new(GTK_SELECTION_MODEL(self->folders_select));
// Image column
self->factory_folder_image = gtk_signal_list_item_factory_new();
g_signal_connect(self->factory_folder_image, "setup",
G_CALLBACK(factory_folder_image_setup), NULL);
g_signal_connect(self->factory_folder_image, "bind",
G_CALLBACK(factory_folder_image_bind), NULL);
self->folder_image_column = gtk_column_view_column_new(" ",
self->factory_folder_image);
gtk_column_view_append_column(GTK_COLUMN_VIEW(self->folders_view),
self->folder_image_column);
// Folder names column
self->factory_folder_string = gtk_signal_list_item_factory_new();
g_signal_connect(self->factory_folder_string, "setup",
G_CALLBACK(factory_folder_string_setup), NULL);
g_signal_connect(self->factory_folder_string, "bind",
G_CALLBACK(factory_folder_string_bind), NULL);
self->folder_string_column = gtk_column_view_column_new("Name",
self->factory_folder_string);
gtk_column_view_append_column(GTK_COLUMN_VIEW(self->folders_view),
self->folder_string_column);
}
static void factory_pics_image_setup(GtkListItemFactory *factory, GtkListItem *item)
{
// Create image
GtkWidget *image = gtk_image_new();
gtk_image_set_pixel_size(GTK_IMAGE(image), 16);
gtk_list_item_set_child(item, image);
}
static void factory_pics_image_bind(GtkListItemFactory *factory, GtkListItem *item)
{
// Get Image Widget
GtkWidget *image = gtk_list_item_get_child(item);
// Get icon_name
MyItem *item1 = MY_ITEM(gtk_list_item_get_item(item));
gtk_image_set_from_icon_name(GTK_IMAGE(image), "folder-images");
}
static void factory_pics_string_setup(GtkListItemFactory *factory, GtkListItem *item)
{
// Add a label
GtkWidget *label = gtk_label_new("");
gtk_widget_set_halign(label, GTK_ALIGN_START);
gtk_list_item_set_child(item, label);
}
static void factory_pics_string_bind(GtkListItemFactory *factory, GtkListItem *item)
{
// Set names from label
GtkWidget *label = gtk_list_item_get_child(item);
// Get display name
MyItem *item1 = MY_ITEM(gtk_list_item_get_item(item));
gtk_label_set_label(GTK_LABEL(label),
my_item_get_display_name(item1));
}
static void images_list_default(GListStore *store1)
{
// if the store is not empty, clear it
if (g_list_model_get_n_items(G_LIST_MODEL(store1)))
{
g_list_store_remove_all(store1);
}
// Append default items
g_list_store_append(store1,
my_item_new("img7.xpm", ":1", TRUE));
g_list_store_append(store1,
my_item_new("winpe.xpm", ":2", TRUE));
}
static void update_images_list(MyPrefs *prefs1)
{
// if the store is not empty, clear it
if (g_list_model_get_n_items(G_LIST_MODEL(prefs1->images_list)))
{
g_list_store_remove_all(prefs1->images_list);
}
// Iterate the objects and add to the list
for (int i = 0; i < g_list_model_get_n_items(G_LIST_MODEL(prefs1->file_list)); i++)
{
if (mime_type_supported())
{
// Get file info
GFileInfo *info = G_FILE_INFO(g_list_model_get_item(
G_LIST_MODEL(prefs1->file_list), i));
const char *content_type = g_file_info_get_content_type(info);
// Append image file info to the list
// Check content type
if (strncmp(content_type, "image/", 6) == 0)
{
// Add properties to the list
const char *name = g_file_info_get_display_name(info);
char *path = g_file_get_path(prefs1->file);
char *image_path = g_strdup_printf("%s/%s", path, name);
g_list_store_append(prefs1->images_list,
my_item_new(name, image_path, FALSE));
g_free(path);
}
}
else
{
// Get file info
GFileInfo *info = G_FILE_INFO(g_list_model_get_item(
G_LIST_MODEL(prefs1->file_list), i));
const char *content_type = g_file_info_get_content_type(info);
char *pattern = g_strdup_printf("*%s", content_type);
// Append image file info to the list
for (int i = 0; supported_globs[i] != NULL; i++)
{
// Check file pattern on microsoft windows
if (strncmp(pattern, supported_globs[i], strlen(supported_globs[i])) == 0)
{
// Add properties to the list
const char *name = g_file_info_get_display_name(info);
char *path = g_file_get_path(prefs1->file);
char *image_path = g_strdup_printf("%s/%s", path, name);
g_list_store_append(prefs1->images_list,
my_item_new(name, image_path, FALSE));
g_free(path);
break;
}
}
g_free(pattern);
}
}
// Check weather list is updated
if (g_list_model_get_n_items(G_LIST_MODEL(prefs1->images_list)) == 0)
{
prefs1->current_folder_index = -1;
}
}
static void pics_view_init(MyPrefs *self)
{
// Create store for pictures view
self->images_list = g_list_store_new(my_item_get_type());
images_list_default(self->images_list);
// Create selection model for view
self->image_select = gtk_single_selection_new(G_LIST_MODEL(self->images_list));
gtk_single_selection_set_selected(self->image_select, 0);
// Create column view
self->images_view = gtk_column_view_new(GTK_SELECTION_MODEL(self->image_select));
// Image column
self->factory_pics_image = gtk_signal_list_item_factory_new();
g_signal_connect(self->factory_pics_image, "setup",
G_CALLBACK(factory_pics_image_setup), NULL);
g_signal_connect(self->factory_pics_image, "bind",
G_CALLBACK(factory_pics_image_bind), NULL);
self->pics_image_column = gtk_column_view_column_new(" ",
self->factory_pics_image);
gtk_column_view_append_column(GTK_COLUMN_VIEW(self->images_view),
self->pics_image_column);
// Folder names column
self->factory_pics_string = gtk_signal_list_item_factory_new();
g_signal_connect(self->factory_pics_string, "setup",
G_CALLBACK(factory_pics_string_setup), NULL);
g_signal_connect(self->factory_pics_string, "bind",
G_CALLBACK(factory_pics_string_bind), NULL);
self->pics_string_column = gtk_column_view_column_new("Name",
self->factory_pics_string);
gtk_column_view_append_column(GTK_COLUMN_VIEW(self->images_view),
self->pics_string_column);
}
static void update_internal_image(MyPrefs *prefs, const char **id)
{
GdkPixbuf *pixbuf = gdk_pixbuf_new_from_xpm_data(id);
GdkPixbuf *sized = gdk_pixbuf_scale_simple(pixbuf, prefs->width,
prefs->height, GDK_INTERP_BILINEAR);
gtk_picture_set_pixbuf(GTK_PICTURE(prefs->background), pixbuf);
g_object_unref(pixbuf);
g_object_unref(sized);
}
static void update_external_image(MyPrefs *prefs, const char *file_name)
{
GError *error = NULL;
// Create a pixbuf
GdkPixbuf *pixbuf = gdk_pixbuf_new_from_file(file_name, &error);
if (error == NULL)
{
// Load the image with pixbuf
GdkPixbuf *sized = gdk_pixbuf_scale_simple(pixbuf, prefs->width,
prefs->height, GDK_INTERP_BILINEAR);
gtk_picture_set_pixbuf(GTK_PICTURE(prefs->background), sized);
g_object_unref(sized);
g_object_unref(pixbuf);
}
else
{
// if file load failed, load default image
update_internal_image(prefs, winpe);
}
}
static void file_dialog_opened(GObject *dialog, GAsyncResult *result, gpointer data)
{
GFile *file;
MyPrefs *prefs = MY_PREFS(data);
// Get the file
file = gtk_file_dialog_select_folder_finish(GTK_FILE_DIALOG(dialog), result, NULL);
if (file != NULL)
{
// g_print("Dialog Accepted!");
char *path = g_file_get_path(file);
char *name = g_file_get_basename(file);
g_list_store_append(prefs->folders_list,
my_item_new(name, path, FALSE));
g_object_unref(file);
g_free(path);
g_free(name);
}
else
{
// g_print("Dialog Cancelled!");
}
}
static void btnadd_clicked(GtkWidget *widget, MyPrefs *prefs)
{
GtkFileDialog *dialog;
// Create a file dialog
dialog = gtk_file_dialog_new();
gtk_file_dialog_select_folder(dialog, GTK_WINDOW(prefs), NULL, file_dialog_opened, prefs);
}
static void btnremove_clicked(GtkWidget *widget, MyPrefs *prefs)
{
}
// Scan the selection of two column views
static gboolean scan_func(gpointer data)
{
MyPrefs *prefs = MY_PREFS(data);
// Get the selection of folders view
// The model and item of folders view
auto folder_model = gtk_column_view_get_model(GTK_COLUMN_VIEW(prefs->folders_view));
guint folder_item_index = gtk_single_selection_get_selected(GTK_SINGLE_SELECTION(folder_model));
auto folder_item = gtk_single_selection_get_selected_item(GTK_SINGLE_SELECTION(folder_model));
// File name and properties
const char *folder_name = my_item_get_path(MY_ITEM(folder_item));
gboolean is_internal = my_item_get_internal(MY_ITEM(folder_item));
// Check weather the selection changed
if (folder_item_index != prefs->current_folder_index || g_list_model_get_n_items(G_LIST_MODEL(prefs->images_list)) == 0)
{
if (is_internal)
{
// Update image list to default
images_list_default(prefs->images_list);
}
else
{
// Update image list by the folder selection
prefs->file = g_file_new_for_path(folder_name);
gtk_directory_list_set_file(prefs->file_list, prefs->file);
update_images_list(prefs);
g_object_unref(prefs->file);
}
prefs->current_folder_index = folder_item_index;
// Force reload image
prefs->current_image_index = -1;
}
// Get the selection of images view
// Check weather the list of images is empty
if (g_list_model_get_n_items(G_LIST_MODEL(prefs->images_list)) == 0)
{
return TRUE;
}
// The model and item of images view
auto model = gtk_column_view_get_model(GTK_COLUMN_VIEW(prefs->images_view));
auto item = gtk_single_selection_get_selected_item(GTK_SINGLE_SELECTION(model));
guint image_item_index = gtk_single_selection_get_selected(GTK_SINGLE_SELECTION(model));
// File name and properties
const char *file_name = my_item_get_path(MY_ITEM(item));
is_internal = my_item_get_internal(MY_ITEM(item));
// Check weather the selection changed
if (image_item_index != prefs->current_image_index)
{
// Update image
if (is_internal)
{
// For image which is internal
switch (file_name[1])
{
case '1':
update_internal_image(prefs, img7);
break;
case '2':
update_internal_image(prefs, winpe);
break;
}
prefs->current_image_index = image_item_index;
}
else
{
// For image which is outside
update_external_image(prefs, file_name);
prefs->current_image_index = image_item_index;
}
}
return TRUE;
}
static void my_prefs_close_request(GtkWindow *self, gpointer user_data)
{
gtk_widget_set_visible(GTK_WIDGET(self), FALSE);
}
static void my_prefs_init(MyPrefs *self)
{
// Options strings for dropdown
const char *strings[] = {
"640x480",
"800x450",
"1024x576",
"1280x720",
"1366x768",
NULL};
// Default window size
self->width = 1024;
self->height = 576;
// Default values to load the internal image
self->current_folder_index = -1;
self->current_image_index = -1;
// Initalize window
gtk_window_set_default_size(GTK_WINDOW(self), 800, 450);
gtk_window_set_icon_name(GTK_WINDOW(self), "My_GtkUI");
// Create builder
self->prefs_builder = gtk_builder_new_from_resource("/org/gtk/daleclack/prefs_stack.ui");
// Get Objects
self->stack_box = GTK_WIDGET(gtk_builder_get_object(self->prefs_builder, "stack_box"));
self->back_page = GTK_WIDGET(gtk_builder_get_object(self->prefs_builder, "back_page"));
self->combo_box = GTK_WIDGET(gtk_builder_get_object(self->prefs_builder, "combo_box"));
self->mode_check = GTK_WIDGET(gtk_builder_get_object(self->prefs_builder, "mode_check"));
self->label_size = GTK_WIDGET(gtk_builder_get_object(self->prefs_builder, "label_size"));
// Initalize folder and image views and append to the box
gtk_widget_set_margin_bottom(self->back_page, 20);
gtk_widget_set_margin_end(self->back_page, 20);
gtk_widget_set_margin_start(self->back_page, 20);
gtk_widget_set_margin_top(self->back_page, 20);
folder_view_init(self);
pics_view_init(self);
self->views_box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5);
self->btns_box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5);
self->btn_add = gtk_button_new_from_icon_name("list-add");
self->btn_remove = gtk_button_new_from_icon_name("list-remove");
// Pack views
self->folders_sw = gtk_scrolled_window_new();
gtk_widget_set_hexpand(self->folders_view, TRUE);
gtk_widget_set_vexpand(self->folders_view, TRUE);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(self->folders_sw),
GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
gtk_scrolled_window_set_child(GTK_SCROLLED_WINDOW(self->folders_sw), self->folders_view);
self->images_sw = gtk_scrolled_window_new();
gtk_widget_set_hexpand(self->images_view, TRUE);
gtk_widget_set_vexpand(self->images_view, TRUE);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(self->images_sw),
GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
gtk_scrolled_window_set_child(GTK_SCROLLED_WINDOW(self->images_sw), self->images_view);
gtk_box_append(GTK_BOX(self->views_box), self->folders_sw);
gtk_box_append(GTK_BOX(self->views_box), self->images_sw);
gtk_box_append(GTK_BOX(self->back_page), self->views_box);
gtk_box_append(GTK_BOX(self->btns_box), self->btn_add);
gtk_box_append(GTK_BOX(self->btns_box), self->btn_remove);
gtk_box_append(GTK_BOX(self->back_page), self->btns_box);
// Create file list
self->file = g_file_new_for_path(g_get_home_dir());
self->file_list = gtk_directory_list_new(
"standard::name,standard::display-name,standard::icon,standard::size,standard::content-type", self->file);
g_object_unref(self->file);
// Add a dropdown for default sizes config
self->sizes_drop = gtk_drop_down_new_from_strings(strings);
gtk_drop_down_set_selected(GTK_DROP_DOWN(self->sizes_drop), 2);
gtk_box_append(GTK_BOX(self->combo_box), self->sizes_drop);
char *size = g_strdup_printf("Current Config: %d x %d", self->width, self->height);
gtk_label_set_label(GTK_LABEL(self->label_size), size);
g_free(size);
// Set default mode for check button
gtk_check_button_set_active(GTK_CHECK_BUTTON(self->mode_check), TRUE);
// Set Child
gtk_window_set_child(GTK_WINDOW(self), self->stack_box);
// Add timer to scan the list
g_timeout_add(1, scan_func, self);
// Connect signals
g_signal_connect(self, "close-request", G_CALLBACK(my_prefs_close_request), NULL);
g_signal_connect(self->btn_add, "clicked", G_CALLBACK(btnadd_clicked), self);
}
static void my_prefs_class_init(MyPrefsClass *klass)
{
}
GtkWidget *my_prefs_new(GtkWidget *back, GtkWindow *parent)
{
GtkWidget *prefs_win = GTK_WIDGET(g_object_new(my_prefs_get_type(),
"transient-for", parent, NULL));
MY_PREFS(prefs_win)->background = back;
return prefs_win;
}

View File

@ -0,0 +1,7 @@
#pragma once
#include <gtk/gtk.h>
G_DECLARE_FINAL_TYPE(MyPrefs, my_prefs, MY, PREFS, GtkWindow)
GtkWidget *my_prefs_new(GtkWidget *back, GtkWindow *parent);

View File

@ -0,0 +1,53 @@
#include "MyPrefs.h"
static void gtkmain(GtkApplication *app, gpointer data)
{
GtkWidget *window, *overlay, *main_pic, *btn_back;
GtkWindow *_window;
GtkOverlay *_overlay;
GtkWidget *prefs_win;
// Create a main window and initalize
window = gtk_application_window_new(app);
_window = GTK_WINDOW(window);
gtk_window_set_icon_name(_window, "org.gtk.daleclack");
gtk_window_set_title(_window, "Background Prefs Test");
gtk_window_set_default_size(_window, 1024, 576);
// Overlay to pack the background and button
overlay = gtk_overlay_new();
gtk_widget_set_hexpand(overlay, TRUE);
gtk_widget_set_vexpand(overlay, TRUE);
_overlay = GTK_OVERLAY(overlay);
// Add background widget
main_pic = gtk_picture_new();
gtk_picture_set_content_fit(GTK_PICTURE(main_pic), GTK_CONTENT_FIT_FILL);
gtk_widget_set_hexpand(main_pic, TRUE);
gtk_widget_set_vexpand(main_pic, TRUE);
gtk_widget_set_halign(main_pic, GTK_ALIGN_FILL);
gtk_widget_set_valign(main_pic, GTK_ALIGN_FILL);
gtk_overlay_set_child(_overlay, main_pic);
// gtk_widget_set_size_request(main_pic, 1024, 576);
// Add a button
btn_back = gtk_button_new_with_label("Prefs");
gtk_button_set_has_frame(GTK_BUTTON(btn_back), FALSE);
gtk_widget_set_halign(btn_back, GTK_ALIGN_CENTER);
gtk_widget_set_valign(btn_back, GTK_ALIGN_CENTER);
gtk_overlay_add_overlay(_overlay, btn_back);
// Creata prefs window
prefs_win = my_prefs_new(main_pic, _window);
g_signal_connect_swapped(btn_back, "clicked", G_CALLBACK(gtk_window_present), prefs_win);
gtk_window_set_child(_window, overlay);
gtk_window_present(_window);
}
int main(int argc, char **argv)
{
// Create a application and run
GtkApplication *app = gtk_application_new("org.gtk.daleclack", G_APPLICATION_NON_UNIQUE);
g_signal_connect(app, "activate", G_CALLBACK(gtkmain), NULL);
return g_application_run(G_APPLICATION(app), argc, argv);
}

View File

@ -1,10 +1,8 @@
Microsoft-Windows-GroupPolicy-ClientExtensions-Package~31bf3856ad364e35~amd64~en-US~10.0.22621.1.mum
Microsoft-Windows-GroupPolicy-ClientExtensions-Package~31bf3856ad364e35~amd64~zh-CN~10.0.22621.1.mum
Microsoft-Windows-GroupPolicy-ClientExtensions-Package~31bf3856ad364e35~amd64~~10.0.22621.1465.mum
Microsoft-Windows-GroupPolicy-ClientExtensions-Package~31bf3856ad364e35~amd64~~10.0.22621.891.mum
Microsoft-Windows-GroupPolicy-ClientTools-Package~31bf3856ad364e35~amd64~en-US~10.0.22621.1325.mum
Microsoft-Windows-GroupPolicy-ClientTools-Package~31bf3856ad364e35~amd64~en-US~10.0.22621.1391.mum
Microsoft-Windows-GroupPolicy-ClientTools-Package~31bf3856ad364e35~amd64~zh-CN~10.0.22621.1325.mum
Microsoft-Windows-GroupPolicy-ClientTools-Package~31bf3856ad364e35~amd64~zh-CN~10.0.22621.1391.mum
Microsoft-Windows-GroupPolicy-ClientTools-Package~31bf3856ad364e35~amd64~~10.0.22621.1325.mum
Microsoft-Windows-GroupPolicy-ClientTools-Package~31bf3856ad364e35~amd64~~10.0.22621.1465.mum
Microsoft-Windows-GroupPolicy-ClientExtensions-Package~31bf3856ad364e35~amd64~~10.0.22621.1972.mum
Microsoft-Windows-GroupPolicy-ClientTools-Package~31bf3856ad364e35~amd64~en-US~10.0.22621.1.mum
Microsoft-Windows-GroupPolicy-ClientTools-Package~31bf3856ad364e35~amd64~en-US~10.0.22621.1972.mum
Microsoft-Windows-GroupPolicy-ClientTools-Package~31bf3856ad364e35~amd64~zh-CN~10.0.22621.1.mum
Microsoft-Windows-GroupPolicy-ClientTools-Package~31bf3856ad364e35~amd64~zh-CN~10.0.22621.1972.mum
Microsoft-Windows-GroupPolicy-ClientTools-Package~31bf3856ad364e35~amd64~~10.0.22621.1972.mum