Compare commits

..

2 Commits

Author SHA1 Message Date
Matthias Clasen
f2e45bbc87 Quick visualization of rounded rects 2023-05-14 23:14:03 -04:00
Matthias Clasen
9965cfbc3b Sketch rounded-rect intersection
Still to do:
 - Handle the cases that need solving for ellipse intersections
 - Write tests
2023-05-14 21:59:30 -04:00
836 changed files with 31214 additions and 93672 deletions

View File

@@ -1,2 +0,0 @@
[flake8]
ignore = E501

1
.gitignore vendored
View File

@@ -1,2 +1 @@
/subprojects/*/ /subprojects/*/
.flatpak-builder/

View File

@@ -24,9 +24,9 @@ stages:
variables: variables:
COMMON_MESON_FLAGS: "-Dwerror=true -Dcairo:werror=false -Dgi-docgen:werror=false -Dgraphene:werror=false -Dlibepoxy:werror=false -Dlibsass:werror=false -Dpango:werror=false -Dsassc:werror=false -Dgdk-pixbuf:werror=false -Dglib:werror=false -Dlibcloudproviders:werror=false -Dlibpng:werror=false -Dlibtiff:werror=false -Dsysprof:werror=false -Dwayland-protocols:werror=false -Dharfbuzz:werror=false -Dfreetype2:werror=false -Dfontconfig:werror=false -Dfribidi:werror=false -Dlibffi:werror=false -Dlibjpeg-turbo:werror=false -Dmutest:werror=false -Dpixman:werror=false -Dproxy-libintl:werror=false" COMMON_MESON_FLAGS: "-Dwerror=true -Dcairo:werror=false -Dgi-docgen:werror=false -Dgraphene:werror=false -Dlibepoxy:werror=false -Dlibsass:werror=false -Dpango:werror=false -Dsassc:werror=false -Dgdk-pixbuf:werror=false -Dglib:werror=false -Dlibcloudproviders:werror=false -Dlibpng:werror=false -Dlibtiff:werror=false -Dsysprof:werror=false -Dwayland-protocols:werror=false -Dharfbuzz:werror=false -Dfreetype2:werror=false -Dfontconfig:werror=false -Dfribidi:werror=false -Dlibffi:werror=false -Dlibjpeg-turbo:werror=false -Dmutest:werror=false -Dpixman:werror=false -Dproxy-libintl:werror=false"
BACKEND_FLAGS: "-Dx11-backend=true -Dwayland-backend=true -Dbroadway-backend=true" BACKEND_FLAGS: "-Dx11-backend=true -Dwayland-backend=true -Dbroadway-backend=true"
FEATURE_FLAGS: "-Dvulkan=enabled -Dcloudproviders=enabled -Dbuild-testsuite=true -Dintrospection=enabled" FEATURE_FLAGS: "-Dvulkan=enabled -Dcloudproviders=enabled -Dbuild-demos=false -Dbuild-examples=false -Dbuild-tests=false -Dbuild-testsuite=true"
MESON_TEST_TIMEOUT_MULTIPLIER: 3 MESON_TEST_TIMEOUT_MULTIPLIER: 3
FEDORA_IMAGE: "registry.gitlab.gnome.org/gnome/gtk/fedora:v48" FEDORA_IMAGE: "registry.gitlab.gnome.org/gnome/gtk/fedora:v46"
workflow: workflow:
rules: rules:
@@ -123,26 +123,6 @@ release-build:
- LD_LIBRARY_PATH=${CI_PROJECT_DIR}/_install/lib64 meson compile -C _build_hello - LD_LIBRARY_PATH=${CI_PROJECT_DIR}/_install/lib64 meson compile -C _build_hello
- .gitlab-ci/run-tests.sh _build x11 - .gitlab-ci/run-tests.sh _build x11
fedora-clang:
extends: .build-fedora-default
stage: build
needs: []
variables:
EXTRA_MESON_FLAGS: "--buildtype=release"
script:
- .gitlab-ci/show-info-linux.sh
- export PATH="$HOME/.local/bin:$PATH"
- export CC=clang
- meson subprojects download
- meson subprojects update --reset
- meson setup
${COMMON_MESON_FLAGS}
${EXTRA_MESON_FLAGS}
${BACKEND_FLAGS}
${FEATURE_FLAGS}
_build
- meson compile -C _build
fedora-mingw64: fedora-mingw64:
extends: .build-fedora-default extends: .build-fedora-default
stage: build stage: build
@@ -222,7 +202,7 @@ macos:
-Dcpp_std=c++11 -Dcpp_std=c++11
-Dpixman:tests=disabled -Dpixman:tests=disabled
-Dlibjpeg-turbo:simd=disabled -Dlibjpeg-turbo:simd=disabled
-Dbuild-demos=false -Ddemos=false
-Dbuild-tests=false -Dbuild-tests=false
-Dbuild-examples=false -Dbuild-examples=false
-Dbuild-testsuite=false -Dbuild-testsuite=false
@@ -385,27 +365,17 @@ asan-build:
tags: [ asan ] tags: [ asan ]
stage: analysis stage: analysis
needs: [] needs: []
when: manual
variables: variables:
script: script:
- export PATH="$HOME/.local/bin:$PATH" - export PATH="$HOME/.local/bin:$PATH"
- CC=clang meson setup - CC=clang meson setup --buildtype=debugoptimized -Db_sanitize=address -Db_lundef=false -Dintrospection=disabled -Df16c=disabled _build
--buildtype=debugoptimized
-Db_sanitize=address
-Db_lundef=false
-Dbuild-demos=false
-Dbuild-tests=false
-Dbuild-examples=false
-Dintrospection=disabled
-Df16c=disabled
_build
- ninja -C _build - ninja -C _build
- .gitlab-ci/run-tests.sh _build wayland - .gitlab-ci/run-tests.sh _build wayland
- .gitlab-ci/run-tests.sh _build wayland_gles
- .gitlab-ci/run-tests.sh _build x11
artifacts: artifacts:
when: always
paths: paths:
- "${CI_PROJECT_DIR}/_build/meson-logs" - _build/meson-logs
allow_failure: true
reference: reference:
image: $FEDORA_IMAGE image: $FEDORA_IMAGE
@@ -418,11 +388,10 @@ reference:
--buildtype=release --buildtype=release
--force-fallback-for=gdk-pixbuf,pango --force-fallback-for=gdk-pixbuf,pango
-Dintrospection=enabled -Dintrospection=enabled
-Ddocumentation=true
-Dgtk_doc=true -Dgtk_doc=true
-Dgdk-pixbuf:gtk_doc=true -Dgdk-pixbuf:gtk_doc=true
-Dpango:gtk_doc=true -Dpango:gtk_doc=true
-Dbuild-demos=false -Ddemos=false
-Dbuild-examples=false -Dbuild-examples=false
-Dbuild-tests=false -Dbuild-tests=false
-Dbuild-testsuite=false -Dbuild-testsuite=false

View File

@@ -32,7 +32,6 @@ RUN dnf -y install \
glib2-static \ glib2-static \
glibc-devel \ glibc-devel \
glibc-headers \ glibc-headers \
glslc \
gnupg2 \ gnupg2 \
gobject-introspection-devel \ gobject-introspection-devel \
graphene-devel \ graphene-devel \

View File

@@ -23,8 +23,8 @@ flatpak build ${builddir} meson \
-Dbuild-testsuite=false \ -Dbuild-testsuite=false \
-Dbuild-examples=false \ -Dbuild-examples=false \
-Dintrospection=disabled \ -Dintrospection=disabled \
-Dbuild-demos=true \ -Ddemos=true \
-Ddemo-profile=devel \ -Dprofile=devel \
_flatpak_build _flatpak_build
flatpak build ${builddir} ninja -C _flatpak_build install flatpak build ${builddir} ninja -C _flatpak_build install

View File

@@ -1,32 +0,0 @@
#!/usr/bin/sh
#
builddir=$1
suite=$2
unit=$3
echo "** builddir: ${builddir}"
echo "** suite: ${suite}"
echo "** unit: ${unit}"
export XDG_RUNTIME_DIR="$(mktemp -p $(pwd) -d xdg-runtime-XXXXXX)"
weston --backend=headless-backend.so --socket=wayland-5 --idle-time=0 &
compositor=$!
export WAYLAND_DISPLAY=wayland-5
meson test -C ${builddir} \
--print-errorlogs \
--setup=wayland \
--suite=${suite} \
--no-suite=failing \
--no-suite=flaky \
--no-suite=wayland_failing \
--no-suite=gsk-compare-broadway \
--verbose \
"${unit}"
exit_code=$?
kill ${compositor}
exit ${exit_code}

View File

@@ -9,7 +9,7 @@ backend=$2
multiplier=${MESON_TEST_TIMEOUT_MULTIPLIER:-1} multiplier=${MESON_TEST_TIMEOUT_MULTIPLIER:-1}
# Ignore memory leaks lower in dependencies # Ignore memory leaks lower in dependencies
export LSAN_OPTIONS=suppressions=$srcdir/lsan.supp:print_suppressions=0:detect_leaks=0:allocator_may_return_null=1 export LSAN_OPTIONS=suppressions=$srcdir/lsan.supp:print_suppressions=0:verbosity=1:log_threads=1
export G_SLICE=always-malloc export G_SLICE=always-malloc
case "${backend}" in case "${backend}" in

View File

@@ -32,8 +32,7 @@ pacman --noconfirm -S --needed \
mingw-w64-$MSYS2_ARCH-fribidi \ mingw-w64-$MSYS2_ARCH-fribidi \
mingw-w64-$MSYS2_ARCH-gst-plugins-bad-libs \ mingw-w64-$MSYS2_ARCH-gst-plugins-bad-libs \
mingw-w64-$MSYS2_ARCH-shared-mime-info \ mingw-w64-$MSYS2_ARCH-shared-mime-info \
mingw-w64-$MSYS2_ARCH-python-gobject \ mingw-w64-$MSYS2_ARCH-python-gobject
mingw-w64-$MSYS2_ARCH-shaderc
mkdir -p _ccache mkdir -p _ccache
export CCACHE_BASEDIR="$(pwd)" export CCACHE_BASEDIR="$(pwd)"

45
AUTHORS
View File

@@ -7,7 +7,7 @@ Peter Mattis <petm@xcf.berkeley.edu>
Spencer Kimball <spencer@xcf.berkeley.edu> Spencer Kimball <spencer@xcf.berkeley.edu>
Josh MacDonald <jmacd@xcf.berkeley.edu> Josh MacDonald <jmacd@xcf.berkeley.edu>
The team that build GTK 2 (in alphabetical order) The Team that build GTK 2 (in alphabetical order)
------------------------------------------------- -------------------------------------------------
Shawn T. Amundson <amundson@gtk.org> Shawn T. Amundson <amundson@gtk.org>
Jerome Bolliet <bolliet@gtk.org> Jerome Bolliet <bolliet@gtk.org>
@@ -28,8 +28,9 @@ Jay Painter <jpaint@gtk.org>
Manish Singh <manish@gtk.org> Manish Singh <manish@gtk.org>
Owen Taylor <otaylor@gtk.org> Owen Taylor <otaylor@gtk.org>
The team that built GTK 3 The current team (GTK 3 and 4)
------------------------- ------------------------------
Jonas Ådahl <jadahl@gmail.com> Jonas Ådahl <jadahl@gmail.com>
Tim Bäder <mail@baedert.org> Tim Bäder <mail@baedert.org>
Emmanuele Bassi <ebassi@gnome.org> Emmanuele Bassi <ebassi@gnome.org>
@@ -39,16 +40,6 @@ Carlos Garnacho <mrgarnacho@gmail.com>
Alexander Larsson <alexl@redhat.com> Alexander Larsson <alexl@redhat.com>
Benjamin Otte <otte@gnome.org> Benjamin Otte <otte@gnome.org>
The current team (GTK 4)
------------------------
Jonas Ådahl <jadahl@gmail.com>
Emmanuele Bassi <ebassi@gnome.org>
Christian Hergert <chergert@gnome.org>
Chun-wei Fan <fanchunwei@src.gnome.org>
Matthias Clasen <mclasen@redhat.com>
Carlos Garnacho <mrgarnacho@gmail.com>
Benjamin Otte <otte@gnome.org>
There are many others who have contributed patches; we thank them, There are many others who have contributed patches; we thank them,
GTK is much better because of them. GTK is much better because of them.
@@ -58,15 +49,35 @@ Over time, GTK has incorporated some pieces of software which
started as independent projects. We list the original authors here: started as independent projects. We list the original authors here:
MS-Windows theme engine
-----------------------
Raymond Penners
Dom Lachowicz
Pixbuf theme engine
-------------------
Owen Taylor
IME input method IME input method
---------------- ----------------
Takuro Ashie Takuro Ashie
Kazuki IWAMOTO Kazuki IWAMOTO
MacOS backend
------------- Mac OS X backend
----------------
Anders Carlsson Anders Carlsson
GtkInspector (originally gtkparasite)
------------------------------------- DirectFB backend
----------------
Denis Oliver Kropp
Sven Neumann
Mike Emmel
gtkparasite
-----------
Christian Hammond Christian Hammond

150
LOG
View File

@@ -1,150 +0,0 @@
TAP version 13
# random seed: R02S22611f6aefc1121b0ab2dc5286960449
# GLib-GIO-DEBUG: _g_io_module_get_default: Found default implementation dconf (DConfSettingsBackend) for gsettings-backend
# GLib-GIO-DEBUG: Using cross-namespace EXTERNAL authentication (this will deadlock if server is GDBus < 2.73.3)
# GLib-GIO-DEBUG: Using cross-namespace EXTERNAL authentication (this will deadlock if server is GDBus < 2.73.3)
1..1
# Start of ops tests
# testcase 0 op 0
collecting#
Cubic 0: # M 100.000000 100.000000 C 150.000000 100.000000 200.000000 100.000000 250.000000 100.000000
Cubic 1: # M 250.000000 100.000000 C 300.000000 100.000000 350.000000 100.000000 400.000000 100.000000
Line 2: # M 400 100 L 200 300
Line 3: # M 200 300 L 100 100
Cubic 4: # M 200.000000 100.000000 C 250.000000 100.000000 300.000000 100.000000 350.000000 100.000000
Cubic 5: # M 350.000000 100.000000 C 400.000000 100.000000 450.000000 100.000000 500.000000 100.000000
Line 6: # M 500 100 L 300 300
Line 7: # M 300 300 L 200 100
splitting#
1 intersections between Cubic 0 and Cubic 1#
1 intersections between Cubic 0 and Line 3#
9 intersections between Cubic 0 and Cubic 4#
# split Cubic 0.0 from Cubic 0 at 0.666666: M 100.000000 100.000000 C 133.333298 100.000000 166.666595 100.000000 199.999893 100.000000
split Cubic 0.1 from Cubic 0 at 0.666666: M 199.999893 100.000000 C 216.666595 100.000000 233.333298 100.000000 250.000000 100.000000split Cubic 0.4 from Cubic 0 at 0.00600814: M 200.300323 100.000000 C 216.866882 100.000000 233.433441 100.000000 250.000000 100.000000split Cubic 0.7 from Cubic 0 at 0.00604445: M 200.600708 100.000000 C 217.067139 100.000000 233.533569 100.000000 250.000000 100.000000# split Cubic 4.9 from Cubic 4 at 0.00533867: M 200.800812 100.000000 C 250.533875 100.000000 300.266937 100.000000 350.000000 100.000000
1 intersections between Cubic 0.1 and Line 7#
1 intersections between Cubic 1 and Line 2#
9 intersections between Cubic 1 and Cubic 4.9#
split Cubic 1.9 from Cubic 1 at 0.00534248: M 250.801361 100.000000 C 300.534241 100.000000 350.267120 100.000000 400.000000 100.000000# split Cubic 4.9.0 from Cubic 4.9 at 0.329756: M 200.800812 100.000000 C 217.200577 100.000000 233.600342 100.000000 250.000122 100.000000
# split Cubic 4.9.1 from Cubic 4.9 at 0.329756: M 250.000122 100.000000 C 283.333435 100.000000 316.666718 100.000000 350.000000 100.000000
# split Cubic 4.9.6 from Cubic 4.9 at 0.00500283: M 250.500412 100.000000 C 283.666931 100.000000 316.833466 100.000000 350.000000 100.000000
9 intersections between Cubic 1.9 and Cubic 5#
# split Cubic 1.9.0 from Cubic 1.9 at 0.664877: M 250.801361 100.000000 C 283.867615 100.000000 316.933868 100.000000 350.000122 100.000000
split Cubic 1.9.1 from Cubic 1.9 at 0.664877: M 350.000122 100.000000 C 366.666748 100.000000 383.333374 100.000000 400.000000 100.000000split Cubic 1.9.4 from Cubic 1.9 at 0.00601021: M 350.300598 100.000000 C 366.867065 100.000000 383.433533 100.000000 400.000000 100.000000split Cubic 1.9.7 from Cubic 1.9 at 0.00604655: M 350.601074 100.000000 C 367.067383 100.000000 383.533691 100.000000 400.000000 100.000000# split Cubic 5.9 from Cubic 5 at 0.00534248: M 350.801361 100.000000 C 400.534241 100.000000 450.267120 100.000000 500.000000 100.000000
1 intersections between Line 2 and Line 3#
1 intersections between Line 2 and Line 7#
# split Line 2.0 from Line 2 at 0.666667: M 400 100 L 266.667 233.333
split Line 2.1 from Line 2 at 0.666667: M 266.667 233.333 L 200 300# split Line 7.0 from Line 7 at 0.333333: M 300 300 L 266.667 233.333
# split Line 7.1 from Line 7 at 0.333333: M 266.667 233.333 L 200 100
1 intersections between Cubic 4 and Cubic 4.9.0#
1 intersections between Cubic 4 and Line 7.1#
1 intersections between Cubic 4.9.0 and Cubic 4.9.1#
1 intersections between Cubic 4.9.1 and Cubic 4.9.6#
1 intersections between Cubic 4.9.6 and Cubic 5#
1 intersections between Cubic 5 and Cubic 5.9#
1 intersections between Cubic 5.9 and Line 6#
1 intersections between Line 6 and Line 7.0#
Cubic 0.0: # M 100.000000 100.000000 C 133.333298 100.000000 166.666595 100.000000 199.999893 100.000000
Cubic 0.1: # M 199.999893 100.000000 C 200.100037 100.000000 200.200180 100.000000 200.300323 100.000000
Cubic 0.4: # M 200.300323 100.000000 C 200.400452 100.000000 200.500580 100.000000 200.600708 100.000000
Cubic 0.7: # M 200.600708 100.000000 C 217.067139 100.000000 233.533569 100.000000 250.000000 100.000000
Cubic 1: # M 250.000000 100.000000 C 250.267120 100.000000 250.534241 100.000000 250.801361 100.000000
Cubic 1.9.0: # M 250.801361 100.000000 C 283.867615 100.000000 316.933868 100.000000 350.000122 100.000000
Cubic 1.9.1: # M 350.000122 100.000000 C 350.100281 100.000000 350.200439 100.000000 350.300598 100.000000
Cubic 1.9.4: # M 350.300598 100.000000 C 350.400757 100.000000 350.500916 100.000000 350.601074 100.000000
Cubic 1.9.7: # M 350.601074 100.000000 C 367.067383 100.000000 383.533691 100.000000 400.000000 100.000000
Line 2.0: # M 400 100 L 266.667 233.333
Line 2.1: # M 266.667 233.333 L 200 300
Line 3: # M 200 300 L 100 100
Cubic 4: # M 200.000000 100.000000 C 200.266937 100.000000 200.533875 100.000000 200.800812 100.000000
Cubic 4.9.0: # M 200.800812 100.000000 C 217.200577 100.000000 233.600342 100.000000 250.000122 100.000000
Cubic 4.9.1: # M 250.000122 100.000000 C 250.166885 100.000000 250.333649 100.000000 250.500412 100.000000
Cubic 4.9.6: # M 250.500412 100.000000 C 283.666931 100.000000 316.833466 100.000000 350.000000 100.000000
Cubic 5: # M 350.000000 100.000000 C 350.267120 100.000000 350.534241 100.000000 350.801361 100.000000
Cubic 5.9: # M 350.801361 100.000000 C 400.534241 100.000000 450.267120 100.000000 500.000000 100.000000
Line 6: # M 500 100 L 300 300
Line 7.0: # M 300 300 L 266.667 233.333
Line 7.1: # M 266.667 233.333 L 200 100
classifying#
01 Cubic 0.0: # M 100.000000 100.000000 C 133.333298 100.000000 166.666595 100.000000 199.999893 100.000000
[11 Cubic 0.7: # M 200.600708 100.000000 C 217.067139 100.000000 233.533569 100.000000 250.000000 100.000000 ]
[11 Cubic 1.9.0: # M 250.801361 100.000000 C 283.867615 100.000000 316.933868 100.000000 350.000122 100.000000 ]
[11 Cubic 1.9.7: # M 350.601074 100.000000 C 367.067383 100.000000 383.533691 100.000000 400.000000 100.000000 ]
[11 Line 2.0: # M 400 100 L 266.667 233.333 ]
01 Line 2.1: # M 266.667 233.333 L 200 300
01 Line 3: # M 200 300 L 100 100
[11 Cubic 4: # M 200.000000 100.000000 C 200.266937 100.000000 200.533875 100.000000 200.800812 100.000000 ]
[11 Cubic 4.9.0: # M 200.800812 100.000000 C 217.200577 100.000000 233.600342 100.000000 250.000122 100.000000 ]
[11 Cubic 4.9.6: # M 250.500412 100.000000 C 283.666931 100.000000 316.833466 100.000000 350.000000 100.000000 ]
[11 Cubic 5: # M 350.000000 100.000000 C 350.267120 100.000000 350.534241 100.000000 350.801361 100.000000 ]
01 Cubic 5.9: # M 350.801361 100.000000 C 400.534241 100.000000 450.267120 100.000000 500.000000 100.000000
01 Line 6: # M 500 100 L 300 300
01 Line 7.0: # M 300 300 L 266.667 233.333
[11 Line 7.1: # M 266.667 233.333 L 200 100 ]
fixups#
# found 3 bad nodes
# split Cubic 0/Cubic 4 BAD 200.600723 100.000000
# [11 Line 7.1 ] 116.565
# [11 Cubic 0.7 ] 180
# [11 Cubic 4 ] 180
# [11 Cubic 4 ] 180
# [11 Cubic 4.9.0 ] 180
# >01 Cubic 0.0 360
# split Cubic 1/Cubic 4.9 BAD 250.801376 100.000000
# [11 Cubic 1.9.0 ] 180
# [11 Cubic 4.9.6 ] 180
# [11 Cubic 0.7 ] 360
# [11 Cubic 4.9.0 ] 360
# split Cubic 1.9/Cubic 5 BAD 350.601105 100.000000
# [11 Cubic 1.9.7 ] 180
# [11 Cubic 5 ] 180
# [11 Cubic 5 ] 180
# <01 Cubic 5.9 180
# [11 Cubic 1.9.0 ] 360
# [11 Cubic 4.9.6 ] 360
reassembling#
start new contour Cubic 0.0#
# Cubic 0.0 ends at:
# start 0 100.000000 100.000000
# >01 Line 3 116.565
# (10 Cubic 0.0 ) 180
picking cw#
append Line 3#
# Line 3 ends at:
# end 2 200.000000 300.000000
# >01 Line 2.1 225
# (10 Line 3 ) 296.565
picking cw#
append Line 2.1#
# Line 2.1 ends at:
# split Line 2/Line 7 266.666656 233.333344
# (10 Line 2.1 ) 45
# >01 Line 7.0 116.565
# [11 Line 2.0 ] 225
# [11 Line 7.1 ] 296.565
picking cw#
append Line 7.0#
# Line 7.0 ends at:
# end 6 300.000000 300.000000
# >01 Line 6 225
# (10 Line 7.0 ) 296.565
picking cw#
append Line 6#
# Line 6 ends at:
# end 5 500.000000 100.000000
# (10 Line 6 ) 45
# >01 Cubic 5.9 360
picking cw#
append Cubic 5.9#
# Cubic 5.9 ends at:
# split Cubic 1.9/Cubic 5 BAD 350.601105 100.000000
# [11 Cubic 1.9.7 ] 180
# [11 Cubic 5 ] 180
# [11 Cubic 5 ] 180
# (10 Cubic 5.9 ) 180
# [11 Cubic 1.9.0 ] 360
# [11 Cubic 4.9.6 ] 360
picking cw#
**
ERROR:../testsuite/gsk/path-ops.c:359:test_ops_simple: assertion failed (s == tests[i].out): ("M 354.60110473632812 100 A 4 4 0 0 0 346.60110473632812 100 A 4 4 0 0 0 354.60110473632812 100 z M 252.80137634277344 100 A 2 2 0 0 0 248.80137634277344 100 A 2 2 0 0 0 252.80137634277344 100 z M 204.60072326660156 100 A 4 4 0 0 0 196.60072326660156 100 A 4 4 0 0 0 204.60072326660156 100 z" == "M 100 100 z")
not ok /ops/simple - ERROR:../testsuite/gsk/path-ops.c:359:test_ops_simple: assertion failed (s == tests[i].out): ("M 354.60110473632812 100 A 4 4 0 0 0 346.60110473632812 100 A 4 4 0 0 0 354.60110473632812 100 z M 252.80137634277344 100 A 2 2 0 0 0 248.80137634277344 100 A 2 2 0 0 0 252.80137634277344 100 z M 204.60072326660156 100 A 4 4 0 0 0 196.60072326660156 100 A 4 4 0 0 0 204.60072326660156 100 z" == "M 100 100 z")
Bail out!

301
NEWS
View File

@@ -1,305 +1,6 @@
Overview of Changes in 4.13.0, xx-xx-xxxx Overview of Changes in 4.11.3, xx-xx-xxxx
========================================= =========================================
Overview of Changes in 4.12.0, 05-08-2023
=========================================
* List widgets:
- Add scroll_to APIs
* GtkFileLauncher:
- Add an always-ask property
* GtkTextView:
- Make backspace behavior match GtkEntry
* gsk:
- Fix handling of luminance in mask nodes
* Text rendering:
- Automate the setting of gtk-hint-font-metrics from the
scale factor. This improves font rendering in flatpaks
* Wayland:
- Fix behavior of stylus buttons
- Support suspended window state
* Vulkan:
- Many improvements
* Tools:
- Add gtk4-rendernode-tool
* Debugging:
- Drop the GTK_DEBUG_TOUCHSCREEN flag
* Build:
- Some build options have been renamed:
gtk_doc -> documentation
update_screenshots -> screenshots
The old names still work
* Translation updates:
Georgian
Greek
Hebrew
Persian
Vietnamese
* Contributors:
Aleksandr Melman
Alexander Mikhaylenko
Alexander Shopov
Alexandre Franke
Alice Mikhaylenko
António Fernandes
Arjan Molenaar
Asier Sarasua Garmendia
Balázs Meskó
Balázs Úr
Barnabás Pőcze
Bart Jacobs
Benjamin Otte
Bilal Elmoussaoui
Boyuan Yang
Bruce Cowan
Calvin Walton
Cam Cook
Chris Mayo
Christian Hergert
Christopher Davis
Chun-wei Fan
Corey Berla
Danial Behzadi
Daniel Boles
Daniel Rusek
Efstathios Iosifidis
Ekaterine Papava
Emin Tufan Çetin
Emmanuele Bassi
Erik Schilling
Fabio Tomat
FeRD (Frank Dana)
Fina Wilke
FineFindus
Fran Dieguez
G.Willems
Georges Basile Stavracas Neto
Guillaume Bernard
Hugo Carvalho
Ivan Molodetskikh
Jason Francis
Jonas Ådahl
Jordan Petridis
Jordi Mas
José Expósito
José Roberto de Souza
Khalid Abu Shawarib
Kévin Commaille
Leônidas Araújo
Luca Bacci
Ludovico de Nittis
Lukáš Tyrychtr
Marc-André Lureau
Marco Trevisan (Treviño)
Matt Turner
Matthias Clasen
Maximiliano Sandoval R
Michael Catanzaro
Michel Dänzer
Mohammed Sadiq
Nathan Follens
Nelson Benítez León
Ngọc Quân Trần
Niels De Graef
Olivier Crête
Patrick Griffis
Piotr Drąg
Sabri Ünal
Sebastian Keller
Sophie Herold
Sébastien Le Roux
Takao Fujiwara
Thomas Lange
Yiğit Burak
Yosef Or Boczko
Yuri Chornoivan
Zander Brown
al_SeveR
dgsasha
sumibi-yakitori
tszymanski
velsinki
Алексей Шилин
Арсений Засыпкин
Overview of Changes in 4.11.4, 03-07-2023
=========================================
* GtkFileChooser:
- Default to sorting folders first
- Fix a crash when visiting recent files
* GtkTextView:
- Fix corner cases in word navigation
* GtkMenuButton:
- Normalize label layout
* GtkDropDown:
- Add support for sections
* GtkVideo:
- Make the overlay icon clickable
* GtkWindow:
- Clear the resize cursors to avoid artifacts
* GtkFileDialog:
- Always set initial-folder
* GtkDropDown:
- Update on expression changes
* GtkMapListModel:
- Implement GtkSectionModel
* Accessibility:
- Improvements all over the place: GtkButton, GtkPasswordEntry,
GtkFontChooserDialog, GtkColorChooserDialog, GtkShortcutsWindow,
GtkMenuButton, GtkAboutDialog, GtkFileChooserDialog, GtkStackSidebar,
GtkStackSwitcher, GtkMediaControls, GtkColorDialogButton, GtkDropDown,
GtkInfoBar, GtkNotebook, GtkPrintUnixDialog, GtkModelButton
- Make name computation follow the ARIA spec more closely
- Adapt name computation for the common 'nested button' scenario
- Change many containers to use `generic` instead of `group`
- Use `generic` as the default role
- Use `application` instead of `window` for windows
- Add properties for accessible names of not directly exposed
widgets in GtkListView, GtkGridView and GtkColumnView
* DND:
- Fix criticals when drops are rejected
* X11:
- Fix regressions in GLX setup
* Windows:
- Center newly created transient windows
* Vulkan:
- Add antialising for gradients
- Do less work on clipped away nodes
- Redo image uploading
- Support different image depths and formats
- Add a pipeline cache
* Demos:
- gtk4-demo: Improve window sizing
- gtk4-demo: Improve focus behavior
- gtk4-demo: Add many missing a11y properties
* Tools:
- gtk4-builder-tool: Make render an alias screenshot
* Inspector:
- Show more information in the a11y tab
- Add an accessibility overlay with warnings and recommendations
- Limit the width of the a11y tab
* Build:
- Require GLib 2.76
- Make asan builds work again
- Fix the build if ld is not ld.bdf
* Translation updates:
Brazilian Portuguese
Catalan
Czech
Georgian
Overview of Changes in 4.11.3, 05-06-2023
=========================================
* GtkGridView:
- Respect css border-spacing
- Don't leak the factories
* GtkListView:
- Don't leak the factories
* GtkColumnView:
- Support displaying sections
* GtkNotebook:
- Make the pages model implement GtkSelectionModel
* GtkScrolledWindow:
- Propagate child measure size whenever possible
* GtkPopoverMenu:
- Avoid unnecessary left padding
* GtkSearchEntry:
- Improve size allocation for the clear icon
* GtkBoxLayout:
- Fix a regression from recent baseline work
* CSS:
- Add new binding-friendly css provider apis
* Theme:
- Show focus in the shortcuts window
* GDK:
- Support grayscale and alpha texture formats for loading
and saving to png and tiff, and in GL
- Fix some regressions in GL context initialization
* GSK:
- Support grayscale and alpha texture formats in the GL renderer
- Support straight alpha textures in the GL renderer
- Many improvements to the experimental Vulkan renderer
* Wayland:
- Make exporting surface handles more flexible
* X11:
- Trap XRandr errors
- Stop using passive grabs during DND
* Windows:
- Many cleanups and simplifications
* Tests:
- Improve test coverage
* Build:
- Some build options have been renamed:
demos -> build-demos
profile -> demo-profile
The old names still work
* Deprecations:
- gtk_css_provider_load_from_data
- gdk_wayland_toplevel_unexport_handle
- gdk_pixbuf_get_from_surface
- gdk_pixbuf_get_from_texture
- gtk_image_new_from_pixbuf
- gtk_image_set_from_pixbuf
- gtk_picture_new_for_pixbuf
- gtk_picture_set_pixbuf
* Translation updates:
Basque
Catalan
Georgian
Russian
Turkish
Overview of Changes in 4.11.2, 09-05-2023 Overview of Changes in 4.11.2, 09-05-2023
========================================= =========================================

View File

@@ -67,13 +67,6 @@ building for:
- [Graphene](https://github.com/ebassi/graphene) - [Graphene](https://github.com/ebassi/graphene)
- [Xkb-common](https://github.com/xkbcommon/libxkbcommon) - [Xkb-common](https://github.com/xkbcommon/libxkbcommon)
If you are building the Wayland backend, you will also need:
- Wayland-client
- Wayland-protocols
- Wayland-cursor
- Wayland-EGL
If you are building the X11 backend, you will also need: If you are building the X11 backend, you will also need:
- Xlib, and the following X extensions: - Xlib, and the following X extensions:
@@ -86,24 +79,32 @@ If you are building the X11 backend, you will also need:
- xdamage - xdamage
- xcomposite - xcomposite
If you are building the Wayland backend, you will also need:
- Wayland-client
- Wayland-protocols
- Wayland-cursor
- Wayland-EGL
Once you have all the necessary dependencies, you can build GTK by using Once you have all the necessary dependencies, you can build GTK by using
Meson: Meson:
```sh ```sh
$ meson setup _build $ meson _build .
$ meson compile -C_build $ cd _build
$ ninja
``` ```
You can run the test suite using: You can run the test suite using:
```sh ```sh
$ meson test -C_build $ meson test
``` ```
And, finally, you can install GTK using: And, finally, you can install GTK using:
``` ```
$ sudo meson install -C_build $ sudo ninja install
``` ```
Complete information about installing GTK and related libraries Complete information about installing GTK and related libraries

View File

@@ -483,8 +483,6 @@ constraint_editor_window_class_init (ConstraintEditorWindowClass *class)
GObjectClass *object_class = G_OBJECT_CLASS (class); GObjectClass *object_class = G_OBJECT_CLASS (class);
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class); GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class);
g_type_ensure (CONSTRAINT_VIEW_TYPE);
object_class->dispose = constraint_editor_window_dispose; object_class->dispose = constraint_editor_window_dispose;
gtk_widget_class_set_template_from_resource (widget_class, gtk_widget_class_set_template_from_resource (widget_class,

View File

@@ -20,7 +20,8 @@
#include "config.h" #include "config.h"
#include "constraint-editor.h" #include "constraint-editor.h"
#include "constraint-view.h"
G_GNUC_BEGIN_IGNORE_DEPRECATIONS
struct _ConstraintEditor struct _ConstraintEditor
{ {
@@ -65,7 +66,7 @@ static const char *
get_target_name (GtkConstraintTarget *target) get_target_name (GtkConstraintTarget *target)
{ {
if (target == NULL) if (target == NULL)
return "Super"; return "super";
else if (GTK_IS_WIDGET (target)) else if (GTK_IS_WIDGET (target))
return gtk_widget_get_name (GTK_WIDGET (target)); return gtk_widget_get_name (GTK_WIDGET (target));
else if (GTK_IS_CONSTRAINT_GUIDE (target)) else if (GTK_IS_CONSTRAINT_GUIDE (target))
@@ -79,29 +80,62 @@ constraint_target_combo (GListModel *model,
GtkWidget *combo, GtkWidget *combo,
gboolean is_source) gboolean is_source)
{ {
GtkStringList *targets;
int i; int i;
targets = gtk_string_list_new (NULL); gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (combo), "super", "Super");
gtk_string_list_append (targets, "Super");
if (model) if (model)
{ {
for (i = 0; i < g_list_model_get_n_items (model); i++) for (i = 0; i < g_list_model_get_n_items (model); i++)
{ {
GObject *item = g_list_model_get_object (model, i); GObject *item = g_list_model_get_object (model, i);
const char *name;
if (GTK_IS_CONSTRAINT (item)) if (GTK_IS_CONSTRAINT (item))
continue; continue;
gtk_string_list_append (targets, get_target_name (GTK_CONSTRAINT_TARGET (item))); name = get_target_name (GTK_CONSTRAINT_TARGET (item));
gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (combo), name, name);
g_object_unref (item); g_object_unref (item);
} }
} }
}
gtk_drop_down_set_model (GTK_DROP_DOWN (combo), G_LIST_MODEL (targets)); static void
g_object_unref (targets); constraint_attribute_combo (GtkWidget *combo,
gboolean is_source)
{
if (is_source)
gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (combo), "none", "None");
gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (combo), "left", "Left");
gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (combo), "right", "Right");
gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (combo), "top", "Top");
gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (combo), "bottom", "Bottom");
gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (combo), "start", "Start");
gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (combo), "end", "End");
gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (combo), "width", "Width");
gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (combo), "height", "Height");
gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (combo), "center-x", "Center X");
gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (combo), "center-y", "Center Y");
gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (combo), "baseline", "Baseline");
}
static void
constraint_relation_combo (GtkWidget *combo)
{
gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (combo), "le", "");
gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (combo), "eq", "=");
gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (combo), "ge", "");
}
static void
constraint_strength_combo (GtkWidget *combo)
{
gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (combo), "weak", "Weak");
gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (combo), "medium", "Medium");
gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (combo), "strong", "Strong");
gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (combo), "required", "Required");
} }
static gpointer static gpointer
@@ -113,7 +147,7 @@ get_target (GListModel *model,
if (id == NULL) if (id == NULL)
return NULL; return NULL;
if (strcmp ("Super", id) == 0) if (strcmp ("super", id) == 0)
return NULL; return NULL;
for (i = 0; i < g_list_model_get_n_items (model); i++) for (i = 0; i < g_list_model_get_n_items (model); i++)
@@ -137,65 +171,16 @@ get_target (GListModel *model,
return NULL; return NULL;
} }
static void
select_target (GtkDropDown *combo,
const char *target_name)
{
GListModel *model = gtk_drop_down_get_model (combo);
for (unsigned int i = 0; i < g_list_model_get_n_items (model); i++)
{
GtkStringObject *s = g_list_model_get_item (model, i);
g_object_unref (s);
if (strcmp (target_name, gtk_string_object_get_string (s)) == 0)
{
gtk_drop_down_set_selected (GTK_DROP_DOWN (combo), i);
return;
}
}
}
static GtkConstraintAttribute static GtkConstraintAttribute
get_attr (unsigned int id) get_target_attr (const char *id)
{ {
switch (id) GtkConstraintAttribute attr;
{ GEnumClass *class = g_type_class_ref (GTK_TYPE_CONSTRAINT_ATTRIBUTE);
case 0: return GTK_CONSTRAINT_ATTRIBUTE_NONE; GEnumValue *value = g_enum_get_value_by_nick (class, id);
case 1: return GTK_CONSTRAINT_ATTRIBUTE_LEFT; attr = value->value;
case 2: return GTK_CONSTRAINT_ATTRIBUTE_RIGHT; g_type_class_unref (class);
case 3: return GTK_CONSTRAINT_ATTRIBUTE_TOP;
case 4: return GTK_CONSTRAINT_ATTRIBUTE_BOTTOM;
case 5: return GTK_CONSTRAINT_ATTRIBUTE_START;
case 6: return GTK_CONSTRAINT_ATTRIBUTE_END;
case 7: return GTK_CONSTRAINT_ATTRIBUTE_WIDTH;
case 8: return GTK_CONSTRAINT_ATTRIBUTE_HEIGHT;
case 9: return GTK_CONSTRAINT_ATTRIBUTE_CENTER_X;
case 10: return GTK_CONSTRAINT_ATTRIBUTE_CENTER_Y;
case 11: return GTK_CONSTRAINT_ATTRIBUTE_BASELINE;
default: g_assert_not_reached ();
}
}
static unsigned int return attr;
get_attr_id (GtkConstraintAttribute attr)
{
switch (attr)
{
case GTK_CONSTRAINT_ATTRIBUTE_NONE: return 0;
case GTK_CONSTRAINT_ATTRIBUTE_LEFT: return 1;
case GTK_CONSTRAINT_ATTRIBUTE_RIGHT: return 2;
case GTK_CONSTRAINT_ATTRIBUTE_TOP: return 3;
case GTK_CONSTRAINT_ATTRIBUTE_BOTTOM: return 4;
case GTK_CONSTRAINT_ATTRIBUTE_START: return 5;
case GTK_CONSTRAINT_ATTRIBUTE_END: return 6;
case GTK_CONSTRAINT_ATTRIBUTE_WIDTH: return 7;
case GTK_CONSTRAINT_ATTRIBUTE_HEIGHT: return 8;
case GTK_CONSTRAINT_ATTRIBUTE_CENTER_X: return 9;
case GTK_CONSTRAINT_ATTRIBUTE_CENTER_Y: return 10;
case GTK_CONSTRAINT_ATTRIBUTE_BASELINE: return 11;
default: g_assert_not_reached ();
}
} }
static const char * static const char *
@@ -210,27 +195,15 @@ get_attr_nick (GtkConstraintAttribute attr)
} }
static GtkConstraintRelation static GtkConstraintRelation
get_relation (unsigned int id) get_relation (const char *id)
{ {
switch (id) GtkConstraintRelation relation;
{ GEnumClass *class = g_type_class_ref (GTK_TYPE_CONSTRAINT_RELATION);
case 0: return GTK_CONSTRAINT_RELATION_LE; GEnumValue *value = g_enum_get_value_by_nick (class, id);
case 1: return GTK_CONSTRAINT_RELATION_EQ; relation = value->value;
case 2: return GTK_CONSTRAINT_RELATION_GE; g_type_class_unref (class);
default: g_assert_not_reached ();
}
}
static unsigned int return relation;
get_relation_id (GtkConstraintRelation relation)
{
switch (relation)
{
case GTK_CONSTRAINT_RELATION_LE: return 0;
case GTK_CONSTRAINT_RELATION_EQ: return 1;
case GTK_CONSTRAINT_RELATION_GE: return 2;
default: g_assert_not_reached ();
}
} }
static const char * static const char *
@@ -261,29 +234,15 @@ get_relation_display_name (GtkConstraintRelation relation)
} }
static GtkConstraintStrength static GtkConstraintStrength
get_strength (unsigned int id) get_strength (const char *id)
{
switch (id)
{
case 0: return GTK_CONSTRAINT_STRENGTH_WEAK;
case 1: return GTK_CONSTRAINT_STRENGTH_MEDIUM;
case 2: return GTK_CONSTRAINT_STRENGTH_STRONG;
case 3: return GTK_CONSTRAINT_STRENGTH_REQUIRED;
default: g_assert_not_reached ();
}
}
static unsigned int
get_strength_id (GtkConstraintStrength strength)
{ {
switch (strength) GtkConstraintStrength strength;
{ GEnumClass *class = g_type_class_ref (GTK_TYPE_CONSTRAINT_STRENGTH);
case GTK_CONSTRAINT_STRENGTH_WEAK: return 0; GEnumValue *value = g_enum_get_value_by_nick (class, id);
case GTK_CONSTRAINT_STRENGTH_MEDIUM: return 1; strength = value->value;
case GTK_CONSTRAINT_STRENGTH_STRONG: return 2; g_type_class_unref (class);
case GTK_CONSTRAINT_STRENGTH_REQUIRED: return 3;
default: g_assert_not_reached (); return strength;
}
} }
static const char * static const char *
@@ -335,7 +294,7 @@ static void
create_constraint (GtkButton *button, create_constraint (GtkButton *button,
ConstraintEditor *editor) ConstraintEditor *editor)
{ {
gpointer obj; const char *id;
gpointer target; gpointer target;
GtkConstraintAttribute target_attr; GtkConstraintAttribute target_attr;
gpointer source; gpointer source;
@@ -346,27 +305,25 @@ create_constraint (GtkButton *button,
int strength; int strength;
GtkConstraint *constraint; GtkConstraint *constraint;
obj = gtk_drop_down_get_selected_item (GTK_DROP_DOWN (editor->target)); id = gtk_combo_box_get_active_id (GTK_COMBO_BOX (editor->target));
if (obj) target = get_target (editor->model, id);
target = get_target (editor->model, gtk_string_object_get_string (GTK_STRING_OBJECT (obj))); id = gtk_combo_box_get_active_id (GTK_COMBO_BOX (editor->target_attr));
else target_attr = get_target_attr (id);
target = NULL;
target_attr = get_attr (gtk_drop_down_get_selected (GTK_DROP_DOWN (editor->target_attr)));
obj = gtk_drop_down_get_selected_item (GTK_DROP_DOWN (editor->source)); id = gtk_combo_box_get_active_id (GTK_COMBO_BOX (editor->source));
if (obj) source = get_target (editor->model, id);
source = get_target (editor->model, gtk_string_object_get_string (GTK_STRING_OBJECT (obj))); id = gtk_combo_box_get_active_id (GTK_COMBO_BOX (editor->source_attr));
else source_attr = get_target_attr (id);
source = NULL;
source_attr = get_attr (gtk_drop_down_get_selected (GTK_DROP_DOWN(editor->source_attr)));
relation = get_relation (gtk_drop_down_get_selected (GTK_DROP_DOWN (editor->relation))); id = gtk_combo_box_get_active_id (GTK_COMBO_BOX (editor->relation));
relation = get_relation (id);
multiplier = g_ascii_strtod (gtk_editable_get_text (GTK_EDITABLE (editor->multiplier)), NULL); multiplier = g_ascii_strtod (gtk_editable_get_text (GTK_EDITABLE (editor->multiplier)), NULL);
constant = g_ascii_strtod (gtk_editable_get_text (GTK_EDITABLE (editor->constant)), NULL); constant = g_ascii_strtod (gtk_editable_get_text (GTK_EDITABLE (editor->constant)), NULL);
strength = get_strength (gtk_drop_down_get_selected (GTK_DROP_DOWN (editor->strength))); id = gtk_combo_box_get_active_id (GTK_COMBO_BOX (editor->strength));
strength = get_strength (id);
constraint = gtk_constraint_new (target, target_attr, constraint = gtk_constraint_new (target, target_attr,
relation, relation,
@@ -381,9 +338,12 @@ create_constraint (GtkButton *button,
static void static void
source_attr_changed (ConstraintEditor *editor) source_attr_changed (ConstraintEditor *editor)
{ {
if (get_attr (gtk_drop_down_get_selected (GTK_DROP_DOWN (editor->source_attr))) == GTK_CONSTRAINT_ATTRIBUTE_NONE) const char *id;
id = gtk_combo_box_get_active_id (GTK_COMBO_BOX (editor->source_attr));
if (strcmp (id, "none") == 0)
{ {
gtk_drop_down_set_selected (GTK_DROP_DOWN (editor->source), GTK_INVALID_LIST_POSITION); gtk_combo_box_set_active (GTK_COMBO_BOX (editor->source), -1);
gtk_editable_set_text (GTK_EDITABLE (editor->multiplier), ""); gtk_editable_set_text (GTK_EDITABLE (editor->multiplier), "");
gtk_widget_set_sensitive (editor->source, FALSE); gtk_widget_set_sensitive (editor->source, FALSE);
gtk_widget_set_sensitive (editor->multiplier, FALSE); gtk_widget_set_sensitive (editor->multiplier, FALSE);
@@ -449,7 +409,7 @@ update_preview (ConstraintEditor *editor)
GString *str; GString *str;
const char *name; const char *name;
const char *attr; const char *attr;
const char *relation; char *relation;
const char *multiplier; const char *multiplier;
const char *constant; const char *constant;
double c, m; double c, m;
@@ -459,22 +419,23 @@ update_preview (ConstraintEditor *editor)
str = g_string_new (""); str = g_string_new ("");
name = gtk_string_object_get_string (GTK_STRING_OBJECT (gtk_drop_down_get_selected_item (GTK_DROP_DOWN (editor->target)))); name = gtk_combo_box_get_active_id (GTK_COMBO_BOX (editor->target));
attr = get_attr_nick (get_attr (gtk_drop_down_get_selected ((GTK_DROP_DOWN (editor->target_attr))))); attr = gtk_combo_box_get_active_id (GTK_COMBO_BOX (editor->target_attr));
relation = get_relation_nick (get_relation (gtk_drop_down_get_selected (GTK_DROP_DOWN (editor->relation)))); relation = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT (editor->relation));
if (name == NULL) if (name == NULL)
name = "[ ]"; name = "[ ]";
g_string_append_printf (str, "%s.%s %s ", name, attr, relation); g_string_append_printf (str, "%s.%s %s ", name, attr, relation);
g_free (relation);
constant = gtk_editable_get_text (GTK_EDITABLE (editor->constant)); constant = gtk_editable_get_text (GTK_EDITABLE (editor->constant));
c = g_ascii_strtod (constant, NULL); c = g_ascii_strtod (constant, NULL);
attr = get_attr_nick (get_attr (gtk_drop_down_get_selected (GTK_DROP_DOWN (editor->source_attr)))); attr = gtk_combo_box_get_active_id (GTK_COMBO_BOX (editor->source_attr));
if (strcmp (attr, "none") != 0) if (strcmp (attr, "none") != 0)
{ {
name = gtk_string_object_get_string (GTK_STRING_OBJECT (gtk_drop_down_get_selected_item (GTK_DROP_DOWN (editor->source)))); name = gtk_combo_box_get_active_id (GTK_COMBO_BOX (editor->source));
multiplier = gtk_editable_get_text (GTK_EDITABLE (editor->multiplier)); multiplier = gtk_editable_get_text (GTK_EDITABLE (editor->multiplier));
m = g_ascii_strtod (multiplier, NULL); m = g_ascii_strtod (multiplier, NULL);
@@ -502,18 +463,12 @@ update_preview (ConstraintEditor *editor)
static void static void
update_button (ConstraintEditor *editor) update_button (ConstraintEditor *editor)
{ {
gpointer obj; const char *target = gtk_combo_box_get_active_id (GTK_COMBO_BOX (editor->target));
const char *target; const char *source = gtk_combo_box_get_active_id (GTK_COMBO_BOX (editor->source));
const char *source; const char *source_attr = gtk_combo_box_get_active_id (GTK_COMBO_BOX (editor->source_attr));
GtkConstraintAttribute source_attr = get_attr (gtk_drop_down_get_selected (GTK_DROP_DOWN (editor->source_attr)));
obj = gtk_drop_down_get_selected_item (GTK_DROP_DOWN (editor->target)); if (target &&
target = obj ? gtk_string_object_get_string (GTK_STRING_OBJECT (obj)) : NULL; (source || (source_attr && get_target_attr (source_attr) == GTK_CONSTRAINT_ATTRIBUTE_NONE)))
obj = gtk_drop_down_get_selected_item (GTK_DROP_DOWN (editor->source));
source = obj ? gtk_string_object_get_string (GTK_STRING_OBJECT (obj)) : NULL;
if (target && (source || (source_attr == GTK_CONSTRAINT_ATTRIBUTE_NONE)))
gtk_widget_set_sensitive (editor->button, TRUE); gtk_widget_set_sensitive (editor->button, TRUE);
else else
gtk_widget_set_sensitive (editor->button, FALSE); gtk_widget_set_sensitive (editor->button, FALSE);
@@ -531,7 +486,12 @@ constraint_editor_constructed (GObject *object)
ConstraintEditor *editor = CONSTRAINT_EDITOR (object); ConstraintEditor *editor = CONSTRAINT_EDITOR (object);
constraint_target_combo (editor->model, editor->target, FALSE); constraint_target_combo (editor->model, editor->target, FALSE);
constraint_attribute_combo (editor->target_attr, FALSE);
constraint_relation_combo (editor->relation);
constraint_target_combo (editor->model, editor->source, TRUE); constraint_target_combo (editor->model, editor->source, TRUE);
constraint_attribute_combo (editor->source_attr, TRUE);
constraint_strength_combo (editor->strength);
if (editor->constraint) if (editor->constraint)
{ {
@@ -539,24 +499,30 @@ constraint_editor_constructed (GObject *object)
GtkConstraintAttribute attr; GtkConstraintAttribute attr;
GtkConstraintRelation relation; GtkConstraintRelation relation;
GtkConstraintStrength strength; GtkConstraintStrength strength;
const char *nick;
char *val; char *val;
double multiplier; double multiplier;
double constant; double constant;
target = gtk_constraint_get_target (editor->constraint); target = gtk_constraint_get_target (editor->constraint);
select_target (GTK_DROP_DOWN (editor->target), get_target_name (target)); nick = get_target_name (target);
gtk_combo_box_set_active_id (GTK_COMBO_BOX (editor->target), nick);
attr = gtk_constraint_get_target_attribute (editor->constraint); attr = gtk_constraint_get_target_attribute (editor->constraint);
gtk_drop_down_set_selected (GTK_DROP_DOWN (editor->target_attr), get_attr_id (attr)); nick = get_attr_nick (attr);
gtk_combo_box_set_active_id (GTK_COMBO_BOX (editor->target_attr), nick);
target = gtk_constraint_get_source (editor->constraint); target = gtk_constraint_get_source (editor->constraint);
select_target (GTK_DROP_DOWN (editor->source), get_target_name (target)); nick = get_target_name (target);
gtk_combo_box_set_active_id (GTK_COMBO_BOX (editor->source), nick);
attr = gtk_constraint_get_source_attribute (editor->constraint); attr = gtk_constraint_get_source_attribute (editor->constraint);
gtk_drop_down_set_selected (GTK_DROP_DOWN (editor->source_attr), get_attr_id (attr)); nick = get_attr_nick (attr);
gtk_combo_box_set_active_id (GTK_COMBO_BOX (editor->source_attr), nick);
relation = gtk_constraint_get_relation (editor->constraint); relation = gtk_constraint_get_relation (editor->constraint);
gtk_drop_down_set_selected (GTK_DROP_DOWN (editor->relation), get_relation_id (relation)); nick = get_relation_nick (relation);
gtk_combo_box_set_active_id (GTK_COMBO_BOX (editor->relation), nick);
multiplier = gtk_constraint_get_multiplier (editor->constraint); multiplier = gtk_constraint_get_multiplier (editor->constraint);
val = g_strdup_printf ("%g", multiplier); val = g_strdup_printf ("%g", multiplier);
@@ -569,16 +535,17 @@ constraint_editor_constructed (GObject *object)
g_free (val); g_free (val);
strength = gtk_constraint_get_strength (editor->constraint); strength = gtk_constraint_get_strength (editor->constraint);
gtk_drop_down_set_selected (GTK_DROP_DOWN (editor->strength), get_strength_id (strength)); nick = get_strength_nick (strength);
gtk_combo_box_set_active_id (GTK_COMBO_BOX (editor->strength), nick);
gtk_button_set_label (GTK_BUTTON (editor->button), "Apply"); gtk_button_set_label (GTK_BUTTON (editor->button), "Apply");
} }
else else
{ {
gtk_drop_down_set_selected (GTK_DROP_DOWN (editor->target_attr), get_attr_id (GTK_CONSTRAINT_ATTRIBUTE_LEFT)); gtk_combo_box_set_active_id (GTK_COMBO_BOX (editor->target_attr), "left");
gtk_drop_down_set_selected (GTK_DROP_DOWN (editor->source_attr), get_attr_id (GTK_CONSTRAINT_ATTRIBUTE_LEFT)); gtk_combo_box_set_active_id (GTK_COMBO_BOX (editor->source_attr), "left");
gtk_drop_down_set_selected (GTK_DROP_DOWN (editor->relation), get_relation_id (GTK_CONSTRAINT_RELATION_EQ)); gtk_combo_box_set_active_id (GTK_COMBO_BOX (editor->relation), "eq");
gtk_drop_down_set_selected (GTK_DROP_DOWN (editor->strength), get_strength_id (GTK_CONSTRAINT_STRENGTH_REQUIRED)); gtk_combo_box_set_active_id (GTK_COMBO_BOX (editor->strength), "required");
gtk_editable_set_text (GTK_EDITABLE (editor->multiplier), "1.0"); gtk_editable_set_text (GTK_EDITABLE (editor->multiplier), "1.0");
gtk_editable_set_text (GTK_EDITABLE (editor->constant), "0.0"); gtk_editable_set_text (GTK_EDITABLE (editor->constant), "0.0");

View File

@@ -1,21 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<interface> <interface>
<object class="GtkStringList" id="targets">
<items>
<item>None</item>
<item>Left</item>
<item>Right</item>
<item>Top</item>
<item>Bottom</item>
<item>Start</item>
<item>End</item>
<item>Width</item>
<item>Height</item>
<item>Center X</item>
<item>Center Y</item>
<item>Baseline</item>
</items>
</object>
<template class="ConstraintEditor" parent="GtkWidget"> <template class="ConstraintEditor" parent="GtkWidget">
<child> <child>
<object class="GtkGrid" id="grid"> <object class="GtkGrid" id="grid">
@@ -35,9 +19,9 @@
</object> </object>
</child> </child>
<child> <child>
<object class="GtkDropDown" id="target"> <object class="GtkComboBoxText" id="target">
<signal name="notify::selected" handler="update_preview" swapped="yes"/> <signal name="changed" handler="update_preview" swapped="yes"/>
<signal name="notify::selected" handler="update_button" swapped="yes"/> <signal name="changed" handler="update_button" swapped="yes"/>
<layout> <layout>
<property name="column">1</property> <property name="column">1</property>
<property name="row">1</property> <property name="row">1</property>
@@ -45,9 +29,8 @@
</object> </object>
</child> </child>
<child> <child>
<object class="GtkDropDown" id="target_attr"> <object class="GtkComboBoxText" id="target_attr">
<property name="model">targets</property> <signal name="changed" handler="update_preview" swapped="yes"/>
<signal name="notify::selected" handler="update_preview" swapped="yes"/>
<layout> <layout>
<property name="column">2</property> <property name="column">2</property>
<property name="row">1</property> <property name="row">1</property>
@@ -64,17 +47,8 @@
</object> </object>
</child> </child>
<child> <child>
<object class="GtkDropDown" id="relation"> <object class="GtkComboBoxText" id="relation">
<signal name="notify::selected" handler="update_preview" swapped="yes"/> <signal name="changed" handler="update_preview" swapped="yes"/>
<property name="model">
<object class="GtkStringList">
<items>
<item>≤</item>
<item>=</item>
<item>≥</item>
</items>
</object>
</property>
<layout> <layout>
<property name="column">1</property> <property name="column">1</property>
<property name="row">2</property> <property name="row">2</property>
@@ -91,9 +65,9 @@
</object> </object>
</child> </child>
<child> <child>
<object class="GtkDropDown" id="source"> <object class="GtkComboBoxText" id="source">
<signal name="notify::selected" handler="update_preview" swapped="yes"/> <signal name="changed" handler="update_preview" swapped="yes"/>
<signal name="notify::selected" handler="update_button" swapped="yes"/> <signal name="changed" handler="update_button" swapped="yes"/>
<layout> <layout>
<property name="column">1</property> <property name="column">1</property>
<property name="row">3</property> <property name="row">3</property>
@@ -101,11 +75,10 @@
</object> </object>
</child> </child>
<child> <child>
<object class="GtkDropDown" id="source_attr"> <object class="GtkComboBoxText" id="source_attr">
<property name="model">targets</property> <signal name="changed" handler="update_preview" swapped="yes"/>
<signal name="notify::selected" handler="update_preview" swapped="yes"/> <signal name="changed" handler="source_attr_changed" swapped="yes"/>
<signal name="notify::selected" handler="source_attr_changed" swapped="yes"/> <signal name="changed" handler="update_button" swapped="yes"/>
<signal name="notify::selected" handler="update_button" swapped="yes"/>
<layout> <layout>
<property name="column">2</property> <property name="column">2</property>
<property name="row">3</property> <property name="row">3</property>
@@ -158,17 +131,7 @@
</object> </object>
</child> </child>
<child> <child>
<object class="GtkDropDown" id="strength"> <object class="GtkComboBoxText" id="strength">
<property name="model">
<object class="GtkStringList">
<items>
<item>Weak</item>
<item>Medium</item>
<item>Strong</item>
<item>Required</item>
</items>
</object>
</property>
<layout> <layout>
<property name="column">1</property> <property name="column">1</property>
<property name="row">6</property> <property name="row">6</property>

View File

@@ -21,6 +21,8 @@
#include "guide-editor.h" #include "guide-editor.h"
G_GNUC_BEGIN_IGNORE_DEPRECATIONS
struct _GuideEditor struct _GuideEditor
{ {
GtkWidget parent_instance; GtkWidget parent_instance;
@@ -57,30 +59,25 @@ static guint signals[LAST_SIGNAL];
G_DEFINE_TYPE(GuideEditor, guide_editor, GTK_TYPE_WIDGET); G_DEFINE_TYPE(GuideEditor, guide_editor, GTK_TYPE_WIDGET);
static GtkConstraintStrength static void
get_strength (unsigned int id) guide_strength_combo (GtkWidget *combo)
{ {
switch (id) gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (combo), "weak", "Weak");
{ gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (combo), "medium", "Medium");
case 0: return GTK_CONSTRAINT_STRENGTH_WEAK; gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (combo), "strong", "Strong");
case 1: return GTK_CONSTRAINT_STRENGTH_MEDIUM; gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (combo), "required", "Required");
case 2: return GTK_CONSTRAINT_STRENGTH_STRONG;
case 3: return GTK_CONSTRAINT_STRENGTH_REQUIRED;
default: g_assert_not_reached ();
}
} }
static unsigned int static GtkConstraintStrength
get_strength_id (GtkConstraintStrength strength) get_strength (const char *id)
{ {
switch (strength) GtkConstraintStrength strength;
{ GEnumClass *class = g_type_class_ref (GTK_TYPE_CONSTRAINT_STRENGTH);
case GTK_CONSTRAINT_STRENGTH_WEAK: return 0; GEnumValue *value = g_enum_get_value_by_nick (class, id);
case GTK_CONSTRAINT_STRENGTH_MEDIUM: return 1; strength = value->value;
case GTK_CONSTRAINT_STRENGTH_STRONG: return 2; g_type_class_unref (class);
case GTK_CONSTRAINT_STRENGTH_REQUIRED: return 3;
default: g_assert_not_reached (); return strength;
}
} }
static const char * static const char *
@@ -121,11 +118,11 @@ static void
create_guide (GtkButton *button, create_guide (GtkButton *button,
GuideEditor *editor) GuideEditor *editor)
{ {
const char *id;
int strength; int strength;
const char *name; const char *name;
int w, h; int w, h;
GtkConstraintGuide *guide; GtkConstraintGuide *guide;
unsigned int id;
if (editor->guide) if (editor->guide)
guide = g_object_ref (editor->guide); guide = g_object_ref (editor->guide);
@@ -147,7 +144,7 @@ create_guide (GtkButton *button,
h = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (editor->max_height)); h = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (editor->max_height));
gtk_constraint_guide_set_max_size (guide, w, h); gtk_constraint_guide_set_max_size (guide, w, h);
id = gtk_drop_down_get_selected (GTK_DROP_DOWN (editor->strength)); id = gtk_combo_box_get_active_id (GTK_COMBO_BOX (editor->strength));
strength = get_strength (id); strength = get_strength (id);
gtk_constraint_guide_set_strength (guide, strength); gtk_constraint_guide_set_strength (guide, strength);
@@ -194,9 +191,14 @@ guide_editor_constructed (GObject *object)
{ {
GuideEditor *editor = GUIDE_EDITOR (object); GuideEditor *editor = GUIDE_EDITOR (object);
guide_strength_combo (editor->strength);
g_signal_connect (editor->min_width, "input", G_CALLBACK (min_input), NULL); g_signal_connect (editor->min_width, "input", G_CALLBACK (min_input), NULL);
g_signal_connect (editor->min_height, "input", G_CALLBACK (min_input), NULL); g_signal_connect (editor->min_height, "input", G_CALLBACK (min_input), NULL);
g_signal_connect (editor->max_width, "input", G_CALLBACK (max_input), NULL); g_signal_connect (editor->max_width, "input", G_CALLBACK (max_input), NULL);
g_signal_connect (editor->max_height, "input", G_CALLBACK (max_input), NULL); g_signal_connect (editor->max_height, "input", G_CALLBACK (max_input), NULL);
if (editor->guide) if (editor->guide)
@@ -222,7 +224,8 @@ guide_editor_constructed (GObject *object)
gtk_spin_button_set_value (GTK_SPIN_BUTTON (editor->max_height), h); gtk_spin_button_set_value (GTK_SPIN_BUTTON (editor->max_height), h);
strength = gtk_constraint_guide_get_strength (editor->guide); strength = gtk_constraint_guide_get_strength (editor->guide);
gtk_drop_down_set_selected (GTK_DROP_DOWN (editor->strength), get_strength_id (strength)); nick = get_strength_nick (strength);
gtk_combo_box_set_active_id (GTK_COMBO_BOX (editor->strength), nick);
gtk_button_set_label (GTK_BUTTON (editor->button), "Apply"); gtk_button_set_label (GTK_BUTTON (editor->button), "Apply");
} }
@@ -242,7 +245,7 @@ guide_editor_constructed (GObject *object)
gtk_spin_button_set_value (GTK_SPIN_BUTTON (editor->max_width), G_MAXINT); gtk_spin_button_set_value (GTK_SPIN_BUTTON (editor->max_width), G_MAXINT);
gtk_spin_button_set_value (GTK_SPIN_BUTTON (editor->max_height), G_MAXINT); gtk_spin_button_set_value (GTK_SPIN_BUTTON (editor->max_height), G_MAXINT);
gtk_drop_down_set_selected (GTK_DROP_DOWN (editor->strength), get_strength_id (GTK_CONSTRAINT_STRENGTH_MEDIUM)); gtk_combo_box_set_active_id (GTK_COMBO_BOX (editor->strength), "medium");
gtk_button_set_label (GTK_BUTTON (editor->button), "Create"); gtk_button_set_label (GTK_BUTTON (editor->button), "Create");
} }

View File

@@ -167,17 +167,7 @@
</object> </object>
</child> </child>
<child> <child>
<object class="GtkDropDown" id="strength"> <object class="GtkComboBoxText" id="strength">
<property name="model">
<object class="GtkStringList">
<items>
<item>Weak</item>
<item>Medium</item>
<item>Strong</item>
<item>Required</item>
</items>
</object>
</property>
<layout> <layout>
<property name="column">1</property> <property name="column">1</property>
<property name="row">4</property> <property name="row">4</property>

View File

@@ -2,6 +2,8 @@
#include <gtk/gtk.h> #include <gtk/gtk.h>
G_GNUC_BEGIN_IGNORE_DEPRECATIONS
typedef GtkApplication DemoApplication; typedef GtkApplication DemoApplication;
typedef GtkApplicationClass DemoApplicationClass; typedef GtkApplicationClass DemoApplicationClass;
@@ -214,41 +216,6 @@ activate_quit (GSimpleAction *action,
} }
} }
static void
delete_messages (gpointer data)
{
g_list_free_full ((GList *)data, g_free);
}
static void
pop_message (GtkWidget *status)
{
GList *messages = (GList *) g_object_get_data (G_OBJECT (status), "messages");
if (messages)
{
char *message = messages->data;
messages = g_list_remove (messages, message);
g_object_set_data_full (G_OBJECT (status), "messages",
messages, delete_messages);
gtk_label_set_label (GTK_LABEL (status), message);
}
}
static void
push_message (GtkWidget *status,
const char *message)
{
GList *messages = (GList *) g_object_get_data (G_OBJECT (status), "messages");
gtk_label_set_label (GTK_LABEL (status), message);
messages = g_list_prepend (messages, g_strdup (message));
g_object_set_data_full (G_OBJECT (status), "messages",
messages, delete_messages);
}
static void static void
update_statusbar (GtkTextBuffer *buffer, update_statusbar (GtkTextBuffer *buffer,
DemoApplicationWindow *window) DemoApplicationWindow *window)
@@ -259,7 +226,7 @@ update_statusbar (GtkTextBuffer *buffer,
GtkTextIter iter; GtkTextIter iter;
/* clear any previous message, underflow is allowed */ /* clear any previous message, underflow is allowed */
pop_message (window->status); gtk_statusbar_pop (GTK_STATUSBAR (window->status), 0);
count = gtk_text_buffer_get_char_count (buffer); count = gtk_text_buffer_get_char_count (buffer);
@@ -273,7 +240,7 @@ update_statusbar (GtkTextBuffer *buffer,
msg = g_strdup_printf ("Cursor at row %d column %d - %d chars in document", msg = g_strdup_printf ("Cursor at row %d column %d - %d chars in document",
row, col, count); row, col, count);
push_message (window->status, msg); gtk_statusbar_push (GTK_STATUSBAR (window->status), 0, msg);
g_free (msg); g_free (msg);
} }

View File

@@ -76,13 +76,8 @@
</object> </object>
</child> </child>
<child> <child>
<object class="GtkLabel" id="status"> <object class="GtkStatusbar" id="status">
<property name="hexpand">1</property> <property name="hexpand">1</property>
<property name="xalign">0</property>
<property name="margin-start">2</property>
<property name="margin-end">2</property>
<property name="margin-top">2</property>
<property name="margin-bottom">2</property>
<layout> <layout>
<property name="column">0</property> <property name="column">0</property>
<property name="row">3</property> <property name="row">3</property>

View File

@@ -162,10 +162,6 @@ create_page4 (GtkWidget *assistant)
gtk_assistant_set_page_type (GTK_ASSISTANT (assistant), progress_bar, GTK_ASSISTANT_PAGE_PROGRESS); gtk_assistant_set_page_type (GTK_ASSISTANT (assistant), progress_bar, GTK_ASSISTANT_PAGE_PROGRESS);
gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), progress_bar, "Applying changes"); gtk_assistant_set_page_title (GTK_ASSISTANT (assistant), progress_bar, "Applying changes");
gtk_accessible_update_property (GTK_ACCESSIBLE (progress_bar),
GTK_ACCESSIBLE_PROPERTY_LABEL, "Applying changes",
-1);
/* This prevents the assistant window from being /* This prevents the assistant window from being
* closed while we're "busy" applying changes. * closed while we're "busy" applying changes.
*/ */

View File

@@ -1,5 +1,5 @@
/* Builder /* Builder
* #Keywords: GMenu, GtkPopoverMenuBar, GtkBuilder, GtkShortcutController, toolbar * #Keywords: GMenu, GtkPopoverMenuBar, GtkBuilder, GtkStatusBar, GtkShortcutController, toolbar
* *
* Demonstrates a traditional interface, loaded from a XML description, * Demonstrates a traditional interface, loaded from a XML description,
* and shows how to connect actions to the menu items and toolbar buttons. * and shows how to connect actions to the menu items and toolbar buttons.
@@ -37,34 +37,30 @@ remove_timeout (gpointer data)
g_source_remove (id); g_source_remove (id);
} }
static int G_GNUC_BEGIN_IGNORE_DEPRECATIONS
pop_message (gpointer data)
static gboolean
pop_status (gpointer data)
{ {
GtkWidget *status = data; gtk_statusbar_pop (GTK_STATUSBAR (data), 0);
g_object_set_data (G_OBJECT (data), "timeout", NULL);
gtk_label_set_label (GTK_LABEL (status), "");
g_object_set_data (G_OBJECT (status), "timeout", GUINT_TO_POINTER (0));
return G_SOURCE_REMOVE; return G_SOURCE_REMOVE;
} }
static void static void
status_message (GtkWidget *status, status_message (GtkStatusbar *status,
const char *text) const char *text)
{ {
guint id; guint id;
id = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (status), "timeout")); gtk_statusbar_push (GTK_STATUSBAR (status), 0, text);
if (id) id = g_timeout_add (5000, pop_status, status);
g_source_remove (id);
gtk_label_set_text (GTK_LABEL (status), text);
id = g_timeout_add (5000, pop_message, status);
g_object_set_data_full (G_OBJECT (status), "timeout", GUINT_TO_POINTER (id), remove_timeout); g_object_set_data_full (G_OBJECT (status), "timeout", GUINT_TO_POINTER (id), remove_timeout);
} }
G_GNUC_END_IGNORE_DEPRECATIONS
static void static void
help_activate (GSimpleAction *action, help_activate (GSimpleAction *action,
GVariant *parameter, GVariant *parameter,
@@ -73,7 +69,7 @@ help_activate (GSimpleAction *action,
GtkWidget *status; GtkWidget *status;
status = GTK_WIDGET (g_object_get_data (G_OBJECT (user_data), "status")); status = GTK_WIDGET (g_object_get_data (G_OBJECT (user_data), "status"));
status_message (status, "Help not available"); status_message (GTK_STATUSBAR (status), "Help not available");
} }
static void static void
@@ -86,7 +82,7 @@ not_implemented (GSimpleAction *action,
text = g_strdup_printf ("Action “%s” not implemented", g_action_get_name (G_ACTION (action))); text = g_strdup_printf ("Action “%s” not implemented", g_action_get_name (G_ACTION (action)));
status = GTK_WIDGET (g_object_get_data (G_OBJECT (user_data), "status")); status = GTK_WIDGET (g_object_get_data (G_OBJECT (user_data), "status"));
status_message (status, text); status_message (GTK_STATUSBAR (status), text);
g_free (text); g_free (text);
} }

View File

@@ -4,9 +4,6 @@
<object class="GtkWindow" id="window"> <object class="GtkWindow" id="window">
<property name="resizable">1</property> <property name="resizable">1</property>
<property name="title">Clipboard</property> <property name="title">Clipboard</property>
<accessibility>
<relation name="described-by">label</relation>
</accessibility>
<child> <child>
<object class="GtkBox"> <object class="GtkBox">
<property name="orientation">vertical</property> <property name="orientation">vertical</property>
@@ -16,7 +13,7 @@
<property name="margin-bottom">12</property> <property name="margin-bottom">12</property>
<property name="spacing">12</property> <property name="spacing">12</property>
<child> <child>
<object class="GtkLabel" id="label"> <object class="GtkLabel">
<property name="label">“Copy” will copy the selected data the clipboard, “Paste” will show the current clipboard contents. You can also drag the data to the bottom.</property> <property name="label">“Copy” will copy the selected data the clipboard, “Paste” will show the current clipboard contents. You can also drag the data to the bottom.</property>
<property name="wrap">1</property> <property name="wrap">1</property>
<property name="max-width-chars">40</property> <property name="max-width-chars">40</property>
@@ -27,9 +24,6 @@
<property name="spacing">12</property> <property name="spacing">12</property>
<child> <child>
<object class="GtkDropDown" id="source_chooser"> <object class="GtkDropDown" id="source_chooser">
<accessibility>
<property name="label">Source Type</property>
</accessibility>
<property name="valign">center</property> <property name="valign">center</property>
<property name="model"> <property name="model">
<object class="GtkStringList"> <object class="GtkStringList">
@@ -60,9 +54,6 @@
<property name="name">Text</property> <property name="name">Text</property>
<property name="child"> <property name="child">
<object class="GtkEntry" id="source_text"> <object class="GtkEntry" id="source_text">
<accessibility>
<property name="label">Text Drag Source</property>
</accessibility>
<property name="valign">center</property> <property name="valign">center</property>
<signal name="notify::text" handler="text_changed_cb" object="copy_button"/> <signal name="notify::text" handler="text_changed_cb" object="copy_button"/>
<property name="text">Copy this!</property> <property name="text">Copy this!</property>
@@ -75,9 +66,6 @@
<property name="name">Color</property> <property name="name">Color</property>
<property name="child"> <property name="child">
<object class="GtkColorDialogButton" id="source_color"> <object class="GtkColorDialogButton" id="source_color">
<accessibility>
<property name="label">Color Drag Source</property>
</accessibility>
<property name="dialog"> <property name="dialog">
<object class="GtkColorDialog"> <object class="GtkColorDialog">
</object> </object>
@@ -99,17 +87,14 @@
</style> </style>
<child> <child>
<object class="GtkToggleButton" id="image_rose"> <object class="GtkToggleButton" id="image_rose">
<accessibility>
<property name="label">Photo Drag Source</property>
</accessibility>
<property name="active">1</property> <property name="active">1</property>
<child> <child>
<object class="GtkDragSource">
<signal name="prepare" handler="drag_prepare"/>
</object>
</child> </child>
<child> <child>
<object class="GtkImage"> <object class="GtkImage">
<accessibility>
<property name="label">Portland Rose Photo</property>
</accessibility>
<style> <style>
<class name="large-icons"/> <class name="large-icons"/>
</style> </style>
@@ -120,9 +105,6 @@
</child> </child>
<child> <child>
<object class="GtkToggleButton" id="image_floppy"> <object class="GtkToggleButton" id="image_floppy">
<accessibility>
<property name="label">Icon Drag Source</property>
</accessibility>
<property name="group">image_rose</property> <property name="group">image_rose</property>
<child> <child>
<object class="GtkDragSource"> <object class="GtkDragSource">
@@ -131,9 +113,6 @@
</child> </child>
<child> <child>
<object class="GtkImage"> <object class="GtkImage">
<accessibility>
<property name="label">Floppy Buddy Icon</property>
</accessibility>
<style> <style>
<class name="large-icons"/> <class name="large-icons"/>
</style> </style>
@@ -144,9 +123,6 @@
</child> </child>
<child> <child>
<object class="GtkToggleButton" id="image_logo"> <object class="GtkToggleButton" id="image_logo">
<accessibility>
<property name="label">SVG Drag Source</property>
</accessibility>
<property name="group">image_floppy</property> <property name="group">image_floppy</property>
<child> <child>
<object class="GtkDragSource"> <object class="GtkDragSource">
@@ -155,9 +131,6 @@
</child> </child>
<child> <child>
<object class="GtkImage"> <object class="GtkImage">
<accessibility>
<property name="label">gtk-demo logo</property>
</accessibility>
<style> <style>
<class name="large-icons"/> <class name="large-icons"/>
</style> </style>
@@ -175,9 +148,6 @@
<property name="name">File</property> <property name="name">File</property>
<property name="child"> <property name="child">
<object class="GtkButton" id="source_file"> <object class="GtkButton" id="source_file">
<accessibility>
<property name="label">File Drag Source</property>
</accessibility>
<child> <child>
<object class="GtkDragSource"> <object class="GtkDragSource">
<property name="propagation-phase">capture</property> <property name="propagation-phase">capture</property>
@@ -202,9 +172,6 @@
<property name="name">Folder</property> <property name="name">Folder</property>
<property name="child"> <property name="child">
<object class="GtkButton" id="source_folder"> <object class="GtkButton" id="source_folder">
<accessibility>
<property name="label">Folder Drag Source</property>
</accessibility>
<child> <child>
<object class="GtkDragSource"> <object class="GtkDragSource">
<property name="propagation-phase">capture</property> <property name="propagation-phase">capture</property>
@@ -258,7 +225,7 @@
</object> </object>
</child> </child>
<child> <child>
<object class="GtkLabel" id="paste_label"> <object class="GtkLabel">
<property name="xalign">0</property> <property name="xalign">0</property>
<binding name="label"> <binding name="label">
<lookup name="visible-child-name" type="GtkStack"> <lookup name="visible-child-name" type="GtkStack">
@@ -285,9 +252,6 @@
<property name="name">Text</property> <property name="name">Text</property>
<property name="child"> <property name="child">
<object class="GtkLabel"> <object class="GtkLabel">
<accessibility>
<relation name="labelled-by">paste_label</relation>
</accessibility>
<property name="halign">end</property> <property name="halign">end</property>
<property name="valign">center</property> <property name="valign">center</property>
<property name="xalign">0</property> <property name="xalign">0</property>
@@ -301,9 +265,6 @@
<property name="name">Image</property> <property name="name">Image</property>
<property name="child"> <property name="child">
<object class="GtkImage"> <object class="GtkImage">
<accessibility>
<relation name="labelled-by">paste_label</relation>
</accessibility>
<property name="halign">end</property> <property name="halign">end</property>
<property name="valign">center</property> <property name="valign">center</property>
<style> <style>
@@ -322,9 +283,6 @@
<property name="valign">center</property> <property name="valign">center</property>
<child> <child>
<object class="GtkColorSwatch"> <object class="GtkColorSwatch">
<accessibility>
<relation name="labelled-by">paste_label</relation>
</accessibility>
<property name="accessible-role">img</property> <property name="accessible-role">img</property>
<property name="can-focus">0</property> <property name="can-focus">0</property>
<property name="selectable">0</property> <property name="selectable">0</property>
@@ -340,9 +298,6 @@
<property name="name">File</property> <property name="name">File</property>
<property name="child"> <property name="child">
<object class="GtkLabel"> <object class="GtkLabel">
<accessibility>
<relation name="labelled-by">paste_label</relation>
</accessibility>
<property name="halign">end</property> <property name="halign">end</property>
<property name="valign">center</property> <property name="valign">center</property>
<property name="xalign">0</property> <property name="xalign">0</property>

View File

@@ -6,6 +6,8 @@
#include <gtk/gtk.h> #include <gtk/gtk.h>
G_GNUC_BEGIN_IGNORE_DEPRECATIONS
static void static void
show_parsing_error (GtkCssProvider *provider, show_parsing_error (GtkCssProvider *provider,
GtkCssSection *section, GtkCssSection *section,
@@ -47,23 +49,20 @@ css_text_changed (GtkTextBuffer *buffer,
gtk_text_buffer_remove_all_tags (buffer, &start, &end); gtk_text_buffer_remove_all_tags (buffer, &start, &end);
text = gtk_text_buffer_get_text (buffer, &start, &end, FALSE); text = gtk_text_buffer_get_text (buffer, &start, &end, FALSE);
gtk_css_provider_load_from_string (provider, text); gtk_css_provider_load_from_data (provider, text, -1);
g_free (text); g_free (text);
} }
static void
clear_provider (gpointer data)
{
GtkStyleProvider *provider = data;
gtk_style_context_remove_provider_for_display (gdk_display_get_default (), provider);
}
static void static void
apply_css (GtkWidget *widget, GtkStyleProvider *provider) apply_css (GtkWidget *widget, GtkStyleProvider *provider)
{ {
gtk_style_context_add_provider_for_display (gdk_display_get_default (), provider, G_MAXUINT); GtkWidget *child;
g_object_set_data_full (G_OBJECT (widget), "provider", provider, clear_provider);
gtk_style_context_add_provider (gtk_widget_get_style_context (widget), provider, G_MAXUINT);
for (child = gtk_widget_get_first_child (widget);
child != NULL;
child = gtk_widget_get_next_sibling (child))
apply_css (child, provider);
} }
GtkWidget * GtkWidget *
@@ -82,7 +81,6 @@ do_css_basics (GtkWidget *do_widget)
gtk_window_set_title (GTK_WINDOW (window), "CSS Basics"); gtk_window_set_title (GTK_WINDOW (window), "CSS Basics");
gtk_window_set_transient_for (GTK_WINDOW (window), GTK_WINDOW (do_widget)); gtk_window_set_transient_for (GTK_WINDOW (window), GTK_WINDOW (do_widget));
gtk_window_set_default_size (GTK_WINDOW (window), 400, 300); gtk_window_set_default_size (GTK_WINDOW (window), 400, 300);
gtk_widget_add_css_class (window, "demo");
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window); g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
text = gtk_text_buffer_new (NULL); text = gtk_text_buffer_new (NULL);

View File

@@ -4,24 +4,23 @@
* anymore. :) * anymore. :)
*/ */
/* This resets all properties to their defaults values /* This CSS resets all properties to their defaults values
* and overrides all user settings and the theme in use * and overrides all user settings and the theme in use */
*/ @import url("resource://css_basics/reset.css");
@import url("resource://css_shadows/reset.css");
/* Set a very futuristic style by default */ /* Set a very futuristic style by default */
.demo * { * {
color: green; color: green;
font-family: Monospace; font-family: Monospace;
border: 1px solid; border: 1px solid;
} }
window.demo { window {
background-color: white; background-color: white;
} }
/* Make sure selections are visible */ /* Make sure selections are visible */
.demo selection { selection {
background-color: darkGreen; background-color: darkGreen;
color: black; color: black;
} }

View File

@@ -6,6 +6,8 @@
#include <gtk/gtk.h> #include <gtk/gtk.h>
G_GNUC_BEGIN_IGNORE_DEPRECATIONS
static void static void
show_parsing_error (GtkCssProvider *provider, show_parsing_error (GtkCssProvider *provider,
GtkCssSection *section, GtkCssSection *section,
@@ -48,23 +50,33 @@ css_text_changed (GtkTextBuffer *buffer,
gtk_text_buffer_remove_all_tags (buffer, &start, &end); gtk_text_buffer_remove_all_tags (buffer, &start, &end);
text = gtk_text_buffer_get_text (buffer, &start, &end, FALSE); text = gtk_text_buffer_get_text (buffer, &start, &end, FALSE);
gtk_css_provider_load_from_string (provider, text); gtk_css_provider_load_from_data (provider, text, -1);
g_free (text); g_free (text);
} }
static void static void
clear_provider (gpointer data) drawing_area_draw (GtkDrawingArea *da,
cairo_t *cr,
int width,
int height,
gpointer data)
{ {
GtkStyleProvider *provider = data; GtkStyleContext *context = gtk_widget_get_style_context (GTK_WIDGET (da));
gtk_style_context_remove_provider_for_display (gdk_display_get_default (), provider); gtk_render_background (context, cr, 0, 0, width, height);
gtk_render_frame (context, cr, 0, 0, width, height);
} }
static void static void
apply_css (GtkWidget *widget, GtkStyleProvider *provider) apply_css (GtkWidget *widget, GtkStyleProvider *provider)
{ {
gtk_style_context_add_provider_for_display (gdk_display_get_default (), provider, G_MAXUINT); GtkWidget *child;
g_object_set_data_full (G_OBJECT (widget), "provider", provider, clear_provider);
gtk_style_context_add_provider (gtk_widget_get_style_context (widget), provider, G_MAXUINT);
for (child = gtk_widget_get_first_child (widget);
child != NULL;
child = gtk_widget_get_next_sibling (child))
apply_css (child, provider);
} }
GtkWidget * GtkWidget *
@@ -83,17 +95,16 @@ do_css_multiplebgs (GtkWidget *do_widget)
gtk_window_set_title (GTK_WINDOW (window), "Multiple Backgrounds"); gtk_window_set_title (GTK_WINDOW (window), "Multiple Backgrounds");
gtk_window_set_transient_for (GTK_WINDOW (window), GTK_WINDOW (do_widget)); gtk_window_set_transient_for (GTK_WINDOW (window), GTK_WINDOW (do_widget));
gtk_window_set_default_size (GTK_WINDOW (window), 400, 300); gtk_window_set_default_size (GTK_WINDOW (window), 400, 300);
gtk_widget_add_css_class (window, "demo");
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window); g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
overlay = gtk_overlay_new (); overlay = gtk_overlay_new ();
gtk_window_set_child (GTK_WINDOW (window), overlay); gtk_window_set_child (GTK_WINDOW (window), overlay);
child = gtk_drawing_area_new (); child = gtk_drawing_area_new ();
/* Don't set a draw_func, since we are only interested in CSS drawing,
* which happens automatically.
*/
gtk_widget_set_name (child, "canvas"); gtk_widget_set_name (child, "canvas");
gtk_drawing_area_set_draw_func (GTK_DRAWING_AREA (child),
drawing_area_draw,
NULL, NULL);
gtk_overlay_set_child (GTK_OVERLAY (overlay), child); gtk_overlay_set_child (GTK_OVERLAY (overlay), child);
child = gtk_button_new (); child = gtk_button_new ();

View File

@@ -7,6 +7,8 @@
#include <gtk/gtk.h> #include <gtk/gtk.h>
G_GNUC_BEGIN_IGNORE_DEPRECATIONS
static void static void
show_parsing_error (GtkCssProvider *provider, show_parsing_error (GtkCssProvider *provider,
GtkCssSection *section, GtkCssSection *section,
@@ -49,23 +51,20 @@ css_text_changed (GtkTextBuffer *buffer,
gtk_text_buffer_remove_all_tags (buffer, &start, &end); gtk_text_buffer_remove_all_tags (buffer, &start, &end);
text = gtk_text_buffer_get_text (buffer, &start, &end, FALSE); text = gtk_text_buffer_get_text (buffer, &start, &end, FALSE);
gtk_css_provider_load_from_string (provider, text); gtk_css_provider_load_from_data (provider, text, -1);
g_free (text); g_free (text);
} }
static void
clear_provider (gpointer data)
{
GtkStyleProvider *provider = data;
gtk_style_context_remove_provider_for_display (gdk_display_get_default (), provider);
}
static void static void
apply_css (GtkWidget *widget, GtkStyleProvider *provider) apply_css (GtkWidget *widget, GtkStyleProvider *provider)
{ {
gtk_style_context_add_provider_for_display (gdk_display_get_default (), provider, G_MAXUINT); GtkWidget *child;
g_object_set_data_full (G_OBJECT (widget), "provider", provider, clear_provider);
gtk_style_context_add_provider (gtk_widget_get_style_context (widget), provider, G_MAXUINT);
for (child = gtk_widget_get_first_child (widget);
child != NULL;
child = gtk_widget_get_next_sibling (child))
apply_css (child, provider);
} }
GtkWidget * GtkWidget *
@@ -84,7 +83,6 @@ do_css_pixbufs (GtkWidget *do_widget)
gtk_window_set_title (GTK_WINDOW (window), "Animated Backgrounds"); gtk_window_set_title (GTK_WINDOW (window), "Animated Backgrounds");
gtk_window_set_transient_for (GTK_WINDOW (window), GTK_WINDOW (do_widget)); gtk_window_set_transient_for (GTK_WINDOW (window), GTK_WINDOW (do_widget));
gtk_window_set_default_size (GTK_WINDOW (window), 400, 300); gtk_window_set_default_size (GTK_WINDOW (window), 400, 300);
gtk_widget_add_css_class (window, "demo");
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window); g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
paned = gtk_paned_new (GTK_ORIENTATION_VERTICAL); paned = gtk_paned_new (GTK_ORIENTATION_VERTICAL);

View File

@@ -50,7 +50,7 @@
100% { background-size: 12px, 96px, 12px, 96px, 12px, 96px, 12px, 96px, auto; } 100% { background-size: 12px, 96px, 12px, 96px, 12px, 96px, 12px, 96px, auto; }
} }
window.demo { window {
background-image: url("resource://css_pixbufs/images/apple-red.png"), background-image: url("resource://css_pixbufs/images/apple-red.png"),
url("resource://css_pixbufs/images/gnome-applets.png"), url("resource://css_pixbufs/images/gnome-applets.png"),
url("resource://css_pixbufs/images/gnome-calendar.png"), url("resource://css_pixbufs/images/gnome-calendar.png"),
@@ -66,11 +66,11 @@ window.demo {
} }
/* Make the text editor has a nice style */ /* Make the text editor has a nice style */
window.demo .view, scrollbar, separator { .view, scrollbar, separator {
color: black; color: black;
background-color: rgba(255,255,255,0.5); background-color: rgba(255,255,255,0.5);
} }
window.demo .view:selected { .view:selected {
background-color: rgba(127,127,255,0.5); background-color: rgba(127,127,255,0.5);
} }

View File

@@ -5,6 +5,8 @@
#include <gtk/gtk.h> #include <gtk/gtk.h>
G_GNUC_BEGIN_IGNORE_DEPRECATIONS
static void static void
show_parsing_error (GtkCssProvider *provider, show_parsing_error (GtkCssProvider *provider,
GtkCssSection *section, GtkCssSection *section,
@@ -46,23 +48,20 @@ css_text_changed (GtkTextBuffer *buffer,
gtk_text_buffer_remove_all_tags (buffer, &start, &end); gtk_text_buffer_remove_all_tags (buffer, &start, &end);
text = gtk_text_buffer_get_text (buffer, &start, &end, FALSE); text = gtk_text_buffer_get_text (buffer, &start, &end, FALSE);
gtk_css_provider_load_from_string (provider, text); gtk_css_provider_load_from_data (provider, text, -1);
g_free (text); g_free (text);
} }
static void
clear_provider (gpointer data)
{
GtkStyleProvider *provider = data;
gtk_style_context_remove_provider_for_display (gdk_display_get_default (), provider);
}
static void static void
apply_css (GtkWidget *widget, GtkStyleProvider *provider) apply_css (GtkWidget *widget, GtkStyleProvider *provider)
{ {
gtk_style_context_add_provider_for_display (gdk_display_get_default (), provider, G_MAXUINT); GtkWidget *child;
g_object_set_data_full (G_OBJECT (widget), "provider", provider, clear_provider);
gtk_style_context_add_provider (gtk_widget_get_style_context (widget), provider, G_MAXUINT);
for (child = gtk_widget_get_first_child (widget);
child != NULL;
child = gtk_widget_get_next_sibling (child))
apply_css (child, provider);
} }
static GtkWidget * static GtkWidget *
@@ -102,7 +101,6 @@ do_css_shadows (GtkWidget *do_widget)
gtk_window_set_title (GTK_WINDOW (window), "Shadows"); gtk_window_set_title (GTK_WINDOW (window), "Shadows");
gtk_window_set_transient_for (GTK_WINDOW (window), GTK_WINDOW (do_widget)); gtk_window_set_transient_for (GTK_WINDOW (window), GTK_WINDOW (do_widget));
gtk_window_set_default_size (GTK_WINDOW (window), 400, 300); gtk_window_set_default_size (GTK_WINDOW (window), 400, 300);
gtk_widget_add_css_class (window, "demo");
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window); g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
paned = gtk_paned_new (GTK_ORIENTATION_VERTICAL); paned = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
@@ -144,7 +142,7 @@ do_css_shadows (GtkWidget *do_widget)
} }
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
gtk_window_present (GTK_WINDOW (window)); gtk_widget_set_visible (window, TRUE);
else else
gtk_window_destroy (GTK_WINDOW (window)); gtk_window_destroy (GTK_WINDOW (window));

View File

@@ -5,13 +5,12 @@
*/ */
/* This CSS resets all properties to their defaults values /* This CSS resets all properties to their defaults values
* and overrides all user settings and the theme in use * and overrides all user settings and the theme in use */
*/
@import url("resource://css_shadows/reset.css"); @import url("resource://css_shadows/reset.css");
@import url("resource://css_shadows/cssview.css"); @import url("resource://css_shadows/cssview.css");
/* Get a nice background for the window */ /* Get a nice background for the window */
window.demo.background { .background {
background-color: #4870bc; background-color: #4870bc;
background-image: linear-gradient(to left, transparent, rgba(255,255,255,.07) 50%, transparent 50%), background-image: linear-gradient(to left, transparent, rgba(255,255,255,.07) 50%, transparent 50%),
linear-gradient(to left, transparent, rgba(255,255,255,.13) 50%, transparent 50%), linear-gradient(to left, transparent, rgba(255,255,255,.13) 50%, transparent 50%),
@@ -20,7 +19,7 @@ window.demo.background {
background-size: 29px, 59px, 73px, 109px; background-size: 29px, 59px, 73px, 109px;
} }
window.demo button { button {
color: black; color: black;
padding: 10px; padding: 10px;
border-radius: 5px; border-radius: 5px;
@@ -28,15 +27,18 @@ window.demo button {
border: 1px transparent solid; border: 1px transparent solid;
} }
window.demo button:hover { button:hover {
text-shadow: 3px 3px 5px alpha(black, 0.75); text-shadow: 3px 3px 5px alpha(black, 0.75);
-gtk-icon-shadow: 3px 3px 5px alpha(black, 0.75); -gtk-icon-shadow: 3px 3px 5px alpha(black, 0.75);
box-shadow: 3px 3px 5px alpha(black, 0.5) inset; box-shadow: 3px 3px 5px alpha(black, 0.5) inset;
border: solid 1px alpha(black, 0.75); border: solid 1px alpha(black, 0.75);
} }
window.demo button:active { button:active {
padding: 11px 9px 9px 11px; padding: 11px 9px 9px 11px;
text-shadow: 1px 1px 2.5px alpha(black, 0.6); text-shadow: 1px 1px 2.5px alpha(black, 0.6);
-gtk-icon-shadow: 1px 1px 2.5px alpha(black, 0.6); -gtk-icon-shadow: 1px 1px 2.5px alpha(black, 0.6);
} }

View File

@@ -1,21 +1,21 @@
/* Make the text editor has a nice style */ /* Make the text editor has a nice style */
window.demo .view { .view {
color: #2e3436; color: #2e3436;
font-family: Monospace; font-family: Monospace;
background-color: alpha(white, 0.30); background-color: alpha(white, 0.30);
} }
window.demo .view:selected { .view:selected {
color: white; color: white;
background-color: #4a90d9; background-color: #4a90d9;
} }
window.demo scrollbar trough, scrollbar trough,
.scrollbars-junction { .scrollbars-junction {
background-color: alpha(white, 0.80); background-color: alpha(white, 0.80);
} }
window.demo scrollbar slider { scrollbar slider {
border-width: 3px; border-width: 3px;
border-style: solid; border-style: solid;
border-radius: 10px; border-radius: 10px;
@@ -24,11 +24,11 @@ window.demo scrollbar slider {
background-color: #999; background-color: #999;
} }
window.demo scrollbar slider:hover { scrollbar slider:hover {
background-color: #555; background-color: #555;
} }
window.demo paned separator { paned separator {
background-color: alpha(white, 0.80); background-color: alpha(white, 0.80);
background-image: linear-gradient(transparent, transparent 1px, #999 1px, #999 4px, transparent 4px); background-image: linear-gradient(transparent, transparent 1px, #999 1px, #999 4px, transparent 4px);
background-size: 40px auto; background-size: 40px auto;
@@ -36,6 +36,6 @@ window.demo paned separator {
background-position: center; background-position: center;
} }
window.demo paned separator:hover { paned separator:hover {
background-image: linear-gradient(transparent, transparent 1px, #555 1px, #555 4px, transparent 4px); background-image: linear-gradient(transparent, transparent 1px, #555 1px, #555 4px, transparent 4px);
} }

View File

@@ -335,8 +335,6 @@
<file>paintable_symbolic.c</file> <file>paintable_symbolic.c</file>
<file>panes.c</file> <file>panes.c</file>
<file>password_entry.c</file> <file>password_entry.c</file>
<file>path_fill.c</file>
<file>path_text.c</file>
<file>peg_solitaire.c</file> <file>peg_solitaire.c</file>
<file>pickers.c</file> <file>pickers.c</file>
<file>printing.c</file> <file>printing.c</file>
@@ -422,9 +420,6 @@
<gresource prefix="/fontrendering"> <gresource prefix="/fontrendering">
<file>fontrendering.ui</file> <file>fontrendering.ui</file>
</gresource> </gresource>
<gresource prefix="/path_text">
<file>path_text.ui</file>
</gresource>
<gresource prefix="/org/gtk/Demo4"> <gresource prefix="/org/gtk/Demo4">
<file>icons/16x16/actions/application-exit.png</file> <file>icons/16x16/actions/application-exit.png</file>
<file>icons/16x16/actions/document-new.png</file> <file>icons/16x16/actions/document-new.png</file>

View File

@@ -208,13 +208,7 @@
</object> </object>
</child> </child>
<child> <child>
<object class="GtkLabel" id="statusbar1"> <object class="GtkStatusbar" id="statusbar1"/>
<property name="xalign">0</property>
<property name="margin-start">2</property>
<property name="margin-end">2</property>
<property name="margin-top">2</property>
<property name="margin-bottom">2</property>
</object>
</child> </child>
</object> </object>
</child> </child>

View File

@@ -387,8 +387,6 @@ demo3_widget_class_init (Demo3WidgetClass *class)
gtk_widget_class_set_template_from_resource (widget_class, "/menu/demo3widget.ui"); gtk_widget_class_set_template_from_resource (widget_class, "/menu/demo3widget.ui");
gtk_widget_class_bind_template_child (widget_class, Demo3Widget, menu); gtk_widget_class_bind_template_child (widget_class, Demo3Widget, menu);
gtk_widget_class_bind_template_callback (widget_class, pressed_cb); gtk_widget_class_bind_template_callback (widget_class, pressed_cb);
gtk_widget_class_set_accessible_role (widget_class, GTK_ACCESSIBLE_ROLE_IMG);
} }
GtkWidget * GtkWidget *

View File

@@ -19,14 +19,8 @@
</item> </item>
</menu> </menu>
<template class="Demo3Widget"> <template class="Demo3Widget">
<accessibility>
<property name="label">Demo image</property>
</accessibility>
<child> <child>
<object class="GtkPopoverMenu" id="menu"> <object class="GtkPopoverMenu" id="menu">
<accessibility>
<property name="label">Context menu</property>
</accessibility>
<property name="has-arrow">0</property> <property name="has-arrow">0</property>
<property name="menu-model">model</property> <property name="menu-model">model</property>
</object> </object>

View File

@@ -162,39 +162,27 @@ click_done (GtkGesture *gesture)
gtk_widget_insert_after (item, canvas, last_child); gtk_widget_insert_after (item, canvas, last_child);
} }
/* GtkSettings treats `GTK_THEME=foo:dark` as theme name `foo`, variant `dark`,
* and our embedded CSS files let `foo-dark` work as an alias for `foo:dark`. */
static gboolean
has_dark_suffix (const char *theme)
{
return g_str_has_suffix (theme, ":dark") ||
g_str_has_suffix (theme, "-dark");
}
/* So we can make a good guess whether the current theme is dark by checking for
* either: it is suffixed `[:-]dark`, or Settings:…prefer-dark-theme is TRUE. */
static gboolean static gboolean
theme_is_dark (void) theme_is_dark (void)
{ {
const char *env_theme;
GtkSettings *settings; GtkSettings *settings;
char *theme; char *theme;
gboolean prefer_dark; gboolean prefer_dark;
gboolean dark; gboolean dark;
/* Like GtkSettings, 1st see if theme is overridden by environment variable */
env_theme = g_getenv ("GTK_THEME");
if (env_theme != NULL)
return has_dark_suffix (env_theme);
/* If not, test Settings:…theme-name in the same way OR :…prefer-dark-theme */
settings = gtk_settings_get_default (); settings = gtk_settings_get_default ();
g_object_get (settings, g_object_get (settings,
"gtk-theme-name", &theme, "gtk-theme-name", &theme,
"gtk-application-prefer-dark-theme", &prefer_dark, "gtk-application-prefer-dark-theme", &prefer_dark,
NULL); NULL);
dark = prefer_dark || has_dark_suffix (theme);
if ((strcmp (theme, "Adwaita") == 0 && prefer_dark) || strcmp (theme, "HighContrastInverse") == 0)
dark = TRUE;
else
dark = FALSE;
g_free (theme); g_free (theme);
return dark; return dark;
} }
@@ -760,7 +748,9 @@ do_dnd (GtkWidget *do_widget)
GtkCssProvider *provider; GtkCssProvider *provider;
GString *css; GString *css;
button = gtk_color_dialog_button_new (gtk_color_dialog_new ()); G_GNUC_BEGIN_IGNORE_DEPRECATIONS
button = gtk_color_button_new ();
G_GNUC_END_IGNORE_DEPRECATIONS
g_object_unref (g_object_ref_sink (button)); g_object_unref (g_object_ref_sink (button));
provider = gtk_css_provider_new (); provider = gtk_css_provider_new ();

View File

@@ -334,17 +334,11 @@ do_drawingarea (GtkWidget *do_widget)
gtk_widget_set_vexpand (frame, TRUE); gtk_widget_set_vexpand (frame, TRUE);
gtk_box_append (GTK_BOX (vbox), frame); gtk_box_append (GTK_BOX (vbox), frame);
da = g_object_new (GTK_TYPE_DRAWING_AREA, da = gtk_drawing_area_new ();
"accessible-role", GTK_ACCESSIBLE_ROLE_IMG,
NULL);
gtk_frame_set_child (GTK_FRAME (frame), da);
gtk_accessible_update_relation (GTK_ACCESSIBLE (da),
GTK_ACCESSIBLE_RELATION_LABELLED_BY, label, NULL,
-1);
gtk_drawing_area_set_content_width (GTK_DRAWING_AREA (da), 100); gtk_drawing_area_set_content_width (GTK_DRAWING_AREA (da), 100);
gtk_drawing_area_set_content_height (GTK_DRAWING_AREA (da), 100); gtk_drawing_area_set_content_height (GTK_DRAWING_AREA (da), 100);
gtk_drawing_area_set_draw_func (GTK_DRAWING_AREA (da), groups_draw, NULL, NULL); gtk_drawing_area_set_draw_func (GTK_DRAWING_AREA (da), groups_draw, NULL, NULL);
gtk_frame_set_child (GTK_FRAME (frame), da);
/* /*
* Create the scribble area * Create the scribble area
@@ -358,17 +352,11 @@ do_drawingarea (GtkWidget *do_widget)
gtk_widget_set_vexpand (frame, TRUE); gtk_widget_set_vexpand (frame, TRUE);
gtk_box_append (GTK_BOX (vbox), frame); gtk_box_append (GTK_BOX (vbox), frame);
da = g_object_new (GTK_TYPE_DRAWING_AREA, da = gtk_drawing_area_new ();
"accessible-role", GTK_ACCESSIBLE_ROLE_IMG,
NULL);
gtk_frame_set_child (GTK_FRAME (frame), da);
gtk_accessible_update_relation (GTK_ACCESSIBLE (da),
GTK_ACCESSIBLE_RELATION_LABELLED_BY, label, NULL,
-1);
gtk_drawing_area_set_content_width (GTK_DRAWING_AREA (da), 100); gtk_drawing_area_set_content_width (GTK_DRAWING_AREA (da), 100);
gtk_drawing_area_set_content_height (GTK_DRAWING_AREA (da), 100); gtk_drawing_area_set_content_height (GTK_DRAWING_AREA (da), 100);
gtk_drawing_area_set_draw_func (GTK_DRAWING_AREA (da), scribble_draw, NULL, NULL); gtk_drawing_area_set_draw_func (GTK_DRAWING_AREA (da), scribble_draw, NULL, NULL);
gtk_frame_set_child (GTK_FRAME (frame), da);
g_signal_connect (da, "resize", g_signal_connect (da, "resize",
G_CALLBACK (scribble_resize), NULL); G_CALLBACK (scribble_resize), NULL);
@@ -384,7 +372,7 @@ do_drawingarea (GtkWidget *do_widget)
} }
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
gtk_window_present (GTK_WINDOW (window)); gtk_widget_set_visible (window, TRUE);
else else
gtk_window_destroy (GTK_WINDOW (window)); gtk_window_destroy (GTK_WINDOW (window));

View File

@@ -95,13 +95,6 @@ do_entry_completion (GtkWidget *do_widget)
entry = gtk_entry_new (); entry = gtk_entry_new ();
gtk_box_append (GTK_BOX (vbox), entry); gtk_box_append (GTK_BOX (vbox), entry);
gtk_accessible_update_relation (GTK_ACCESSIBLE (entry),
GTK_ACCESSIBLE_RELATION_LABELLED_BY, label, NULL,
-1);
gtk_accessible_update_property (GTK_ACCESSIBLE (entry),
GTK_ACCESSIBLE_PROPERTY_AUTOCOMPLETE, GTK_ACCESSIBLE_AUTOCOMPLETE_LIST,
-1);
/* Create the completion object */ /* Create the completion object */
completion = gtk_entry_completion_new (); completion = gtk_entry_completion_new ();

View File

@@ -43,10 +43,6 @@ do_entry_undo (GtkWidget *do_widget)
entry = gtk_entry_new (); entry = gtk_entry_new ();
gtk_editable_set_enable_undo (GTK_EDITABLE (entry), TRUE); gtk_editable_set_enable_undo (GTK_EDITABLE (entry), TRUE);
gtk_box_append (GTK_BOX (vbox), entry); gtk_box_append (GTK_BOX (vbox), entry);
gtk_accessible_update_relation (GTK_ACCESSIBLE (entry),
GTK_ACCESSIBLE_RELATION_LABELLED_BY, label, NULL,
-1);
} }
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))

View File

@@ -22,15 +22,11 @@ validate_more_details (GtkEntry *entry,
{ {
gtk_widget_set_tooltip_text (GTK_WIDGET (entry), "Must have details first"); gtk_widget_set_tooltip_text (GTK_WIDGET (entry), "Must have details first");
gtk_widget_add_css_class (GTK_WIDGET (entry), "error"); gtk_widget_add_css_class (GTK_WIDGET (entry), "error");
gtk_accessible_update_state (GTK_ACCESSIBLE (entry),
GTK_ACCESSIBLE_STATE_INVALID, GTK_ACCESSIBLE_INVALID_TRUE,
-1);
} }
else else
{ {
gtk_widget_set_tooltip_text (GTK_WIDGET (entry), ""); gtk_widget_set_tooltip_text (GTK_WIDGET (entry), "");
gtk_widget_remove_css_class (GTK_WIDGET (entry), "error"); gtk_widget_remove_css_class (GTK_WIDGET (entry), "error");
gtk_accessible_reset_state (GTK_ACCESSIBLE (entry), GTK_ACCESSIBLE_STATE_INVALID);
} }
} }
@@ -48,18 +44,10 @@ mode_switch_state_set (GtkSwitch *sw,
{ {
gtk_widget_set_visible (label, FALSE); gtk_widget_set_visible (label, FALSE);
gtk_switch_set_state (sw, state); gtk_switch_set_state (sw, state);
gtk_accessible_reset_relation (GTK_ACCESSIBLE (sw), GTK_ACCESSIBLE_RELATION_ERROR_MESSAGE);
gtk_accessible_reset_state (GTK_ACCESSIBLE (sw), GTK_ACCESSIBLE_STATE_INVALID);
} }
else else
{ {
gtk_widget_set_visible (label, TRUE); gtk_widget_set_visible (label, TRUE);
gtk_accessible_update_relation (GTK_ACCESSIBLE (sw),
GTK_ACCESSIBLE_RELATION_ERROR_MESSAGE, label,
-1);
gtk_accessible_update_state (GTK_ACCESSIBLE (sw),
GTK_ACCESSIBLE_STATE_INVALID, GTK_ACCESSIBLE_INVALID_TRUE,
-1);
} }
return TRUE; return TRUE;
@@ -85,9 +73,6 @@ level_scale_value_changed (GtkRange *range,
{ {
gtk_switch_set_state (GTK_SWITCH (sw), FALSE); gtk_switch_set_state (GTK_SWITCH (sw), FALSE);
} }
gtk_accessible_reset_relation (GTK_ACCESSIBLE (sw), GTK_ACCESSIBLE_RELATION_ERROR_MESSAGE);
gtk_accessible_reset_state (GTK_ACCESSIBLE (sw), GTK_ACCESSIBLE_STATE_INVALID);
} }
GtkWidget * GtkWidget *

View File

@@ -10,6 +10,8 @@
#include <glib/gi18n.h> #include <glib/gi18n.h>
#include <gtk/gtk.h> #include <gtk/gtk.h>
G_GNUC_BEGIN_IGNORE_DEPRECATIONS
static GtkWidget *window = NULL; static GtkWidget *window = NULL;
static void static void
@@ -43,22 +45,21 @@ do_expander (GtkWidget *do_widget)
if (!window) if (!window)
{ {
toplevel = GTK_WIDGET (gtk_widget_get_root (do_widget)); toplevel = GTK_WIDGET (gtk_widget_get_root (do_widget));
window = gtk_window_new (); window = gtk_message_dialog_new_with_markup (GTK_WINDOW (toplevel),
gtk_window_set_title (GTK_WINDOW (window), "Expander"); 0,
gtk_window_set_transient_for (GTK_WINDOW (window), GTK_WINDOW (toplevel)); GTK_MESSAGE_ERROR,
area = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10); GTK_BUTTONS_CLOSE,
gtk_widget_set_margin_start (area, 10); "<big><b>%s</b></big>",
gtk_widget_set_margin_end (area, 10); "Something went wrong");
gtk_widget_set_margin_top (area, 10); gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (window),
gtk_widget_set_margin_bottom (area, 10); "Here are some more details "
gtk_window_set_child (GTK_WINDOW (window), area); "but not the full story.");
label = gtk_label_new ("<big><b>Something went wrong</b></big>");
gtk_label_set_use_markup (GTK_LABEL (label), TRUE); area = gtk_message_dialog_get_message_area (GTK_MESSAGE_DIALOG (window));
gtk_box_append (GTK_BOX (area), label);
label = gtk_label_new ("Here are some more details but not the full story"); label = gtk_widget_get_last_child (area);
gtk_label_set_wrap (GTK_LABEL (label), FALSE); gtk_label_set_wrap (GTK_LABEL (label), FALSE);
gtk_widget_set_vexpand (label, FALSE); gtk_widget_set_vexpand (label, FALSE);
gtk_box_append (GTK_BOX (area), label);
expander = gtk_expander_new ("Details:"); expander = gtk_expander_new ("Details:");
gtk_widget_set_vexpand (expander, TRUE); gtk_widget_set_vexpand (expander, TRUE);
@@ -121,7 +122,7 @@ do_expander (GtkWidget *do_widget)
} }
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
gtk_window_present (GTK_WINDOW (window)); gtk_widget_set_visible (window, TRUE);
else else
gtk_window_destroy (GTK_WINDOW (window)); gtk_window_destroy (GTK_WINDOW (window));

View File

@@ -68,18 +68,13 @@ create_blurred_button (void)
return w; return w;
} }
G_GNUC_BEGIN_IGNORE_DEPRECATIONS
static GtkWidget * static GtkWidget *
create_font_button (void) create_font_button (void)
{ {
GtkFontDialog *dialog; return gtk_font_button_new ();
GtkWidget *button;
dialog = gtk_font_dialog_new ();
button = gtk_font_dialog_button_new (dialog);
g_object_unref (dialog);
return button;
} }
G_GNUC_END_IGNORE_DEPRECATIONS
static GtkWidget * static GtkWidget *
create_level_bar (void) create_level_bar (void)
@@ -315,20 +310,11 @@ do_fishbowl (GtkWidget *do_widget)
if (!window) if (!window)
{ {
GtkBuilder *builder; GtkBuilder *builder;
GtkBuilderScope *scope;
GtkWidget *bowl; GtkWidget *bowl;
g_type_ensure (GTK_TYPE_FISHBOWL); g_type_ensure (GTK_TYPE_FISHBOWL);
scope = gtk_builder_cscope_new (); builder = gtk_builder_new_from_resource ("/fishbowl/fishbowl.ui");
gtk_builder_cscope_add_callback (GTK_BUILDER_CSCOPE (scope), fishbowl_prev_button_clicked_cb);
gtk_builder_cscope_add_callback (GTK_BUILDER_CSCOPE (scope), fishbowl_next_button_clicked_cb);
gtk_builder_cscope_add_callback (GTK_BUILDER_CSCOPE (scope), fishbowl_changes_toggled_cb);
gtk_builder_cscope_add_callback (GTK_BUILDER_CSCOPE (scope), format_header_cb);
builder = gtk_builder_new ();
gtk_builder_set_scope (builder, scope);
gtk_builder_add_from_resource (builder, "/fishbowl/fishbowl.ui", NULL);
window = GTK_WIDGET (gtk_builder_get_object (builder, "window")); window = GTK_WIDGET (gtk_builder_get_object (builder, "window"));
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window); g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
@@ -340,7 +326,6 @@ do_fishbowl (GtkWidget *do_widget)
gtk_widget_realize (window); gtk_widget_realize (window);
g_object_unref (builder); g_object_unref (builder);
g_object_unref (scope);
} }
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))

View File

@@ -59,9 +59,6 @@
<property name="spacing">6</property> <property name="spacing">6</property>
<child> <child>
<object class="GtkFontDialogButton" id="font"> <object class="GtkFontDialogButton" id="font">
<accessibility>
<property name="label">Font</property>
</accessibility>
<property name="dialog"> <property name="dialog">
<object class="GtkFontDialog"> <object class="GtkFontDialog">
</object> </object>
@@ -76,7 +73,7 @@
<property name="column-spacing">10</property> <property name="column-spacing">10</property>
<property name="row-spacing">10</property> <property name="row-spacing">10</property>
<child> <child>
<object class="GtkLabel" id="size_label"> <object class="GtkLabel">
<property name="label">Size</property> <property name="label">Size</property>
<property name="xalign">0</property> <property name="xalign">0</property>
<property name="valign">baseline</property> <property name="valign">baseline</property>
@@ -92,9 +89,6 @@
<property name="width-request">100</property> <property name="width-request">100</property>
<property name="valign">baseline</property> <property name="valign">baseline</property>
<property name="adjustment">size_adjustment</property> <property name="adjustment">size_adjustment</property>
<accessibility>
<relation name="labelled-by">size_label</relation>
</accessibility>
<layout> <layout>
<property name="column">1</property> <property name="column">1</property>
<property name="row">0</property> <property name="row">0</property>
@@ -107,9 +101,6 @@
<property name="max-width-chars">4</property> <property name="max-width-chars">4</property>
<property name="hexpand">0</property> <property name="hexpand">0</property>
<property name="valign">baseline</property> <property name="valign">baseline</property>
<accessibility>
<relation name="labelled-by">size_label</relation>
</accessibility>
<signal name="activate" handler="basic_entry_activated" <signal name="activate" handler="basic_entry_activated"
object="size_adjustment" swapped="false"/> object="size_adjustment" swapped="false"/>
<layout> <layout>
@@ -119,7 +110,7 @@
</object> </object>
</child> </child>
<child> <child>
<object class="GtkLabel" id="letterspacing_label"> <object class="GtkLabel">
<property name="label">Letterspacing</property> <property name="label">Letterspacing</property>
<property name="xalign">0</property> <property name="xalign">0</property>
<property name="valign">baseline</property> <property name="valign">baseline</property>
@@ -135,9 +126,6 @@
<property name="width-request">100</property> <property name="width-request">100</property>
<property name="valign">baseline</property> <property name="valign">baseline</property>
<property name="adjustment">letterspacing_adjustment</property> <property name="adjustment">letterspacing_adjustment</property>
<accessibility>
<relation name="labelled-by">letterspacing_label</relation>
</accessibility>
<layout> <layout>
<property name="column">1</property> <property name="column">1</property>
<property name="row">1</property> <property name="row">1</property>
@@ -150,9 +138,6 @@
<property name="max-width-chars">4</property> <property name="max-width-chars">4</property>
<property name="hexpand">0</property> <property name="hexpand">0</property>
<property name="valign">baseline</property> <property name="valign">baseline</property>
<accessibility>
<relation name="labelled-by">letterspacing_label</relation>
</accessibility>
<signal name="activate" handler="basic_entry_activated" <signal name="activate" handler="basic_entry_activated"
object="letterspacing_adjustment" swapped="false"/> object="letterspacing_adjustment" swapped="false"/>
<layout> <layout>
@@ -162,7 +147,7 @@
</object> </object>
</child> </child>
<child> <child>
<object class="GtkLabel" id="line_height_label"> <object class="GtkLabel">
<property name="label">Line Height</property> <property name="label">Line Height</property>
<property name="xalign">0</property> <property name="xalign">0</property>
<property name="valign">baseline</property> <property name="valign">baseline</property>
@@ -178,9 +163,6 @@
<property name="width-request">100</property> <property name="width-request">100</property>
<property name="valign">baseline</property> <property name="valign">baseline</property>
<property name="adjustment">line_height_adjustment</property> <property name="adjustment">line_height_adjustment</property>
<accessibility>
<relation name="labelled-by">line_height_label</relation>
</accessibility>
<layout> <layout>
<property name="column">1</property> <property name="column">1</property>
<property name="row">2</property> <property name="row">2</property>
@@ -193,9 +175,6 @@
<property name="max-width-chars">4</property> <property name="max-width-chars">4</property>
<property name="hexpand">0</property> <property name="hexpand">0</property>
<property name="valign">baseline</property> <property name="valign">baseline</property>
<accessibility>
<relation name="labelled-by">line_height_label</relation>
</accessibility>
<signal name="activate" handler="basic_entry_activated" <signal name="activate" handler="basic_entry_activated"
object="line_height_adjustment" swapped="false"/> object="line_height_adjustment" swapped="false"/>
<layout> <layout>
@@ -205,7 +184,7 @@
</object> </object>
</child> </child>
<child> <child>
<object class="GtkLabel" id="foreground_label"> <object class="GtkLabel">
<property name="label">Foreground</property> <property name="label">Foreground</property>
<property name="xalign">0</property> <property name="xalign">0</property>
<property name="valign">baseline</property> <property name="valign">baseline</property>
@@ -223,9 +202,6 @@
</property> </property>
<property name="valign">baseline</property> <property name="valign">baseline</property>
<property name="rgba">black</property> <property name="rgba">black</property>
<accessibility>
<relation name="labelled-by">foreground_label</relation>
</accessibility>
<signal name="notify::rgba" handler="color_set_cb"/> <signal name="notify::rgba" handler="color_set_cb"/>
<layout> <layout>
<property name="column">1</property> <property name="column">1</property>
@@ -234,7 +210,7 @@
</object> </object>
</child> </child>
<child> <child>
<object class="GtkLabel" id="background_label"> <object class="GtkLabel">
<property name="label">Background</property> <property name="label">Background</property>
<property name="xalign">0</property> <property name="xalign">0</property>
<property name="valign">baseline</property> <property name="valign">baseline</property>
@@ -252,9 +228,6 @@
</property> </property>
<property name="valign">baseline</property> <property name="valign">baseline</property>
<property name="rgba">white</property> <property name="rgba">white</property>
<accessibility>
<relation name="labelled-by">background_label</relation>
</accessibility>
<signal name="notify::rgba" handler="color_set_cb"/> <signal name="notify::rgba" handler="color_set_cb"/>
<layout> <layout>
<property name="column">1</property> <property name="column">1</property>
@@ -267,9 +240,6 @@
<property name="icon-name">object-flip-vertical-symbolic</property> <property name="icon-name">object-flip-vertical-symbolic</property>
<property name="halign">start</property> <property name="halign">start</property>
<property name="valign">center</property> <property name="valign">center</property>
<accessibility>
<property name="label">Swap colors</property>
</accessibility>
<style> <style>
<class name="circular"/> <class name="circular"/>
</style> </style>
@@ -371,9 +341,6 @@
<property name="yalign">0</property> <property name="yalign">0</property>
<property name="valign">start</property> <property name="valign">start</property>
<property name="selectable">1</property> <property name="selectable">1</property>
<accessibility>
<property name="label">Font example</property>
</accessibility>
</object> </object>
</property> </property>
</object> </object>
@@ -383,9 +350,6 @@
<property name="name">entry</property> <property name="name">entry</property>
<property name="child"> <property name="child">
<object class="GtkTextView" id="entry"> <object class="GtkTextView" id="entry">
<accessibility>
<property name="label">Example text</property>
</accessibility>
<property name="buffer"> <property name="buffer">
<object class="GtkTextBuffer"> <object class="GtkTextBuffer">
<property name="text">Grumpy wizards make toxic brew for the evil Queen and Jack. A quick movement of the enemy will jeopardize six gunboats. The job of waxing linoleum frequently peeves chintzy kids. My girl wove six dozen plaid jackets before she quit. Twelve ziggurats quickly jumped a finch box. <property name="text">Grumpy wizards make toxic brew for the evil Queen and Jack. A quick movement of the enemy will jeopardize six gunboats. The job of waxing linoleum frequently peeves chintzy kids. My girl wove six dozen plaid jackets before she quit. Twelve ziggurats quickly jumped a finch box.
@@ -482,9 +446,6 @@
<property name="icon-name">document-edit-symbolic</property> <property name="icon-name">document-edit-symbolic</property>
<property name="halign">end</property> <property name="halign">end</property>
<property name="valign">end</property> <property name="valign">end</property>
<accessibility>
<property name="label">Edit text</property>
</accessibility>
<signal name="clicked" handler="font_features_toggle_edit"/> <signal name="clicked" handler="font_features_toggle_edit"/>
</object> </object>
</child> </child>

View File

@@ -43,7 +43,6 @@ update_image (void)
cairo_t *cr; cairo_t *cr;
GdkPixbuf *pixbuf; GdkPixbuf *pixbuf;
GdkPixbuf *pixbuf2; GdkPixbuf *pixbuf2;
GdkTexture *texture;
cairo_font_options_t *fopt; cairo_font_options_t *fopt;
cairo_hint_style_t hintstyle; cairo_hint_style_t hintstyle;
cairo_hint_metrics_t hintmetrics; cairo_hint_metrics_t hintmetrics;
@@ -121,17 +120,8 @@ update_image (void)
cairo_destroy (cr); cairo_destroy (cr);
g_object_unref (layout); g_object_unref (layout);
pixbuf = gdk_pixbuf_new_from_data (cairo_image_surface_get_data (surface), pixbuf = gdk_pixbuf_get_from_surface (surface, 0, 0, cairo_image_surface_get_width (surface), cairo_image_surface_get_height (surface));
GDK_COLORSPACE_RGB, TRUE, 8, pixbuf2 = gdk_pixbuf_scale_simple (pixbuf, gdk_pixbuf_get_width (pixbuf) * scale, gdk_pixbuf_get_height (pixbuf) * scale, GDK_INTERP_NEAREST);
cairo_image_surface_get_width (surface),
cairo_image_surface_get_height (surface),
cairo_image_surface_get_stride (surface),
NULL, NULL);
pixbuf2 = gdk_pixbuf_scale_simple (pixbuf,
gdk_pixbuf_get_width (pixbuf) * scale,
gdk_pixbuf_get_height (pixbuf) * scale,
GDK_INTERP_NEAREST);
g_object_unref (pixbuf); g_object_unref (pixbuf);
cairo_surface_destroy (surface); cairo_surface_destroy (surface);
@@ -288,25 +278,15 @@ retry:
pango_layout_iter_free (iter); pango_layout_iter_free (iter);
g_object_unref (layout); g_object_unref (layout);
pixbuf = gdk_pixbuf_new_from_data (cairo_image_surface_get_data (surface), pixbuf = gdk_pixbuf_get_from_surface (surface, 0, 0, cairo_image_surface_get_width (surface), cairo_image_surface_get_height (surface));
GDK_COLORSPACE_RGB, TRUE, 8, pixbuf2 = gdk_pixbuf_scale_simple (pixbuf, gdk_pixbuf_get_width (pixbuf) * scale, gdk_pixbuf_get_height (pixbuf) * scale, GDK_INTERP_NEAREST);
cairo_image_surface_get_width (surface),
cairo_image_surface_get_height (surface),
cairo_image_surface_get_stride (surface),
NULL, NULL);
pixbuf2 = gdk_pixbuf_scale_simple (pixbuf,
gdk_pixbuf_get_width (pixbuf) * scale,
gdk_pixbuf_get_height (pixbuf) * scale,
GDK_INTERP_NEAREST);
g_object_unref (pixbuf); g_object_unref (pixbuf);
cairo_surface_destroy (surface); cairo_surface_destroy (surface);
} }
texture = gdk_texture_new_for_pixbuf (pixbuf2); gtk_picture_set_pixbuf (GTK_PICTURE (image), pixbuf2);
gtk_picture_set_paintable (GTK_PICTURE (image), GDK_PAINTABLE (texture));
g_object_unref (pixbuf2); g_object_unref (pixbuf2);
g_object_unref (texture);
} }
static gboolean fading = FALSE; static gboolean fading = FALSE;

View File

@@ -39,7 +39,7 @@
<property name="row-spacing">10</property> <property name="row-spacing">10</property>
<property name="column-spacing">10</property> <property name="column-spacing">10</property>
<child> <child>
<object class="GtkLabel" id="text_label"> <object class="GtkLabel">
<property name="margin-start">10</property> <property name="margin-start">10</property>
<property name="label">Text</property> <property name="label">Text</property>
<property name="xalign">1</property> <property name="xalign">1</property>
@@ -57,13 +57,10 @@
<layout> <layout>
<property name="column">2</property> <property name="column">2</property>
</layout> </layout>
<accessibility>
<relation name="labelled-by">text_label</relation>
</accessibility>
</object> </object>
</child> </child>
<child> <child>
<object class="GtkLabel" id="font_label"> <object class="GtkLabel">
<property name="margin-start">10</property> <property name="margin-start">10</property>
<property name="label">Font</property> <property name="label">Font</property>
<property name="xalign">1</property> <property name="xalign">1</property>
@@ -78,9 +75,6 @@
</child> </child>
<child> <child>
<object class="GtkFontDialogButton" id="font_button"> <object class="GtkFontDialogButton" id="font_button">
<accessibility>
<relation name="labelled-by">font_label</relation>
</accessibility>
<property name="dialog"> <property name="dialog">
<object class="GtkFontDialog"> <object class="GtkFontDialog">
</object> </object>
@@ -192,9 +186,6 @@
<property name="icon-name">list-add-symbolic</property> <property name="icon-name">list-add-symbolic</property>
<property name="halign">center</property> <property name="halign">center</property>
<property name="valign">center</property> <property name="valign">center</property>
<accessibility>
<property name="label">Zoom in</property>
</accessibility>
<style> <style>
<class name="circular"/> <class name="circular"/>
</style> </style>
@@ -220,9 +211,6 @@
<property name="icon-name">list-remove-symbolic</property> <property name="icon-name">list-remove-symbolic</property>
<property name="halign">center</property> <property name="halign">center</property>
<property name="valign">center</property> <property name="valign">center</property>
<accessibility>
<property name="label">Zoom out</property>
</accessibility>
<style> <style>
<class name="circular"/> <class name="circular"/>
</style> </style>
@@ -263,9 +251,6 @@
<property name="vexpand">1</property> <property name="vexpand">1</property>
<child> <child>
<object class="GtkPicture" id="image"> <object class="GtkPicture" id="image">
<accessibility>
<property name="label">Font rendering example</property>
</accessibility>
<property name="halign">center</property> <property name="halign">center</property>
<property name="valign">center</property> <property name="valign">center</property>
<property name="can-shrink">0</property> <property name="can-shrink">0</property>

View File

@@ -18,7 +18,6 @@ do_headerbar (GtkWidget *do_widget)
GtkWidget *header; GtkWidget *header;
GtkWidget *button; GtkWidget *button;
GtkWidget *box; GtkWidget *box;
GtkWidget *content;
if (!window) if (!window)
{ {
@@ -38,26 +37,16 @@ do_headerbar (GtkWidget *do_widget)
box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
gtk_widget_add_css_class (box, "linked"); gtk_widget_add_css_class (box, "linked");
button = gtk_button_new_from_icon_name ("go-previous-symbolic"); button = gtk_button_new_from_icon_name ("go-previous-symbolic");
gtk_widget_set_tooltip_text (button, "Back");
gtk_box_append (GTK_BOX (box), button); gtk_box_append (GTK_BOX (box), button);
button = gtk_button_new_from_icon_name ("go-next-symbolic"); button = gtk_button_new_from_icon_name ("go-next-symbolic");
gtk_widget_set_tooltip_text (button, "Forward");
gtk_box_append (GTK_BOX (box), button); gtk_box_append (GTK_BOX (box), button);
gtk_header_bar_pack_start (GTK_HEADER_BAR (header), box); gtk_header_bar_pack_start (GTK_HEADER_BAR (header), box);
button = gtk_switch_new (); gtk_header_bar_pack_start (GTK_HEADER_BAR (header), gtk_switch_new ());
gtk_accessible_update_property (GTK_ACCESSIBLE (button),
GTK_ACCESSIBLE_PROPERTY_LABEL, "Change something",
-1);
gtk_header_bar_pack_start (GTK_HEADER_BAR (header), button);
gtk_window_set_titlebar (GTK_WINDOW (window), header); gtk_window_set_titlebar (GTK_WINDOW (window), header);
content = gtk_text_view_new (); gtk_window_set_child (GTK_WINDOW (window), gtk_text_view_new ());
gtk_accessible_update_property (GTK_ACCESSIBLE (content),
GTK_ACCESSIBLE_PROPERTY_LABEL, "Content",
-1);
gtk_window_set_child (GTK_WINDOW (window), content);
} }
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))

View File

@@ -354,18 +354,10 @@ do_iconscroll (GtkWidget *do_widget)
if (!window) if (!window)
{ {
GtkBuilder *builder; GtkBuilder *builder;
GtkBuilderScope *scope;
GtkWidget *label; GtkWidget *label;
guint id; guint id;
scope = gtk_builder_cscope_new (); builder = gtk_builder_new_from_resource ("/iconscroll/iconscroll.ui");
gtk_builder_cscope_add_callback (GTK_BUILDER_CSCOPE (scope), iconscroll_prev_clicked_cb);
gtk_builder_cscope_add_callback (GTK_BUILDER_CSCOPE (scope), iconscroll_next_clicked_cb);
builder = gtk_builder_new ();
gtk_builder_set_scope (builder, scope);
gtk_builder_add_from_resource (builder, "/iconscroll/iconscroll.ui", NULL);
window = GTK_WIDGET (gtk_builder_get_object (builder, "window")); window = GTK_WIDGET (gtk_builder_get_object (builder, "window"));
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window); g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
gtk_window_set_display (GTK_WINDOW (window), gtk_window_set_display (GTK_WINDOW (window),
@@ -383,7 +375,6 @@ do_iconscroll (GtkWidget *do_widget)
GUINT_TO_POINTER (id), remove_timeout); GUINT_TO_POINTER (id), remove_timeout);
g_object_unref (builder); g_object_unref (builder);
g_object_unref (scope);
} }
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))

View File

@@ -164,18 +164,12 @@ do_image_scaling (GtkWidget *do_widget)
scale = gtk_scale_new_with_range (GTK_ORIENTATION_HORIZONTAL, -10., 10., 0.1); scale = gtk_scale_new_with_range (GTK_ORIENTATION_HORIZONTAL, -10., 10., 0.1);
gtk_scale_add_mark (GTK_SCALE (scale), 0., GTK_POS_TOP, NULL); gtk_scale_add_mark (GTK_SCALE (scale), 0., GTK_POS_TOP, NULL);
gtk_widget_set_tooltip_text (scale, "Zoom"); gtk_widget_set_tooltip_text (scale, "Zoom");
gtk_accessible_update_property (GTK_ACCESSIBLE (scale),
GTK_ACCESSIBLE_PROPERTY_LABEL, "Zoom",
-1);
gtk_range_set_value (GTK_RANGE (scale), 0.); gtk_range_set_value (GTK_RANGE (scale), 0.);
gtk_widget_set_hexpand (scale, TRUE); gtk_widget_set_hexpand (scale, TRUE);
gtk_box_append (GTK_BOX (box2), scale); gtk_box_append (GTK_BOX (box2), scale);
dropdown = gtk_drop_down_new (G_LIST_MODEL (gtk_string_list_new ((const char *[]){ "Linear", "Nearest", "Trilinear", NULL })), NULL); dropdown = gtk_drop_down_new (G_LIST_MODEL (gtk_string_list_new ((const char *[]){ "Linear", "Nearest", "Trilinear", NULL })), NULL);
gtk_widget_set_tooltip_text (dropdown, "Filter"); gtk_widget_set_tooltip_text (dropdown, "Filter");
gtk_accessible_update_property (GTK_ACCESSIBLE (dropdown),
GTK_ACCESSIBLE_PROPERTY_LABEL, "Filter",
-1);
gtk_box_append (GTK_BOX (box2), dropdown); gtk_box_append (GTK_BOX (box2), dropdown);
g_object_bind_property (dropdown, "selected", widget, "filter", G_BINDING_DEFAULT); g_object_bind_property (dropdown, "selected", widget, "filter", G_BINDING_DEFAULT);

View File

@@ -30,7 +30,6 @@ progressive_prepared_callback (GdkPixbufLoader *loader,
{ {
GdkPixbuf *pixbuf; GdkPixbuf *pixbuf;
GtkWidget *picture; GtkWidget *picture;
GdkTexture *texture;
picture = GTK_WIDGET (data); picture = GTK_WIDGET (data);
@@ -41,9 +40,7 @@ progressive_prepared_callback (GdkPixbufLoader *loader,
*/ */
gdk_pixbuf_fill (pixbuf, 0xaaaaaaff); gdk_pixbuf_fill (pixbuf, 0xaaaaaaff);
texture = gdk_texture_new_for_pixbuf (pixbuf); gtk_picture_set_pixbuf (GTK_PICTURE (picture), pixbuf);
gtk_picture_set_paintable (GTK_PICTURE (picture), GDK_PAINTABLE (texture));
g_object_unref (texture);
} }
static void static void
@@ -54,18 +51,22 @@ progressive_updated_callback (GdkPixbufLoader *loader,
int height, int height,
gpointer data) gpointer data)
{ {
GtkWidget *picture = GTK_WIDGET (data); GtkWidget *picture;
GdkTexture *texture; GdkPixbuf *pixbuf;
texture = gdk_texture_new_for_pixbuf (gdk_pixbuf_loader_get_pixbuf (loader)); picture = GTK_WIDGET (data);
gtk_picture_set_paintable (GTK_PICTURE (picture), GDK_PAINTABLE (texture));
g_object_unref (texture); pixbuf = gdk_pixbuf_loader_get_pixbuf (loader);
gtk_picture_set_pixbuf (GTK_PICTURE (picture), NULL);
gtk_picture_set_pixbuf (GTK_PICTURE (picture), pixbuf);
} }
static int static int
progressive_timeout (gpointer data) progressive_timeout (gpointer data)
{ {
GtkWidget *picture = GTK_WIDGET (data); GtkWidget *picture;
picture = GTK_WIDGET (data);
/* This shows off fully-paranoid error handling, so looks scary. /* This shows off fully-paranoid error handling, so looks scary.
* You could factor out the error handling code into a nice separate * You could factor out the error handling code into a nice separate

View File

@@ -49,7 +49,6 @@
<property name="halign">start</property> <property name="halign">start</property>
<property name="valign">center</property> <property name="valign">center</property>
<property name="hexpand">1</property> <property name="hexpand">1</property>
<property name="mnemonic-widget">switch</property>
</object> </object>
</child> </child>
<child> <child>
@@ -74,7 +73,6 @@
<property name="halign">start</property> <property name="halign">start</property>
<property name="valign">center</property> <property name="valign">center</property>
<property name="hexpand">1</property> <property name="hexpand">1</property>
<property name="mnemonic-widget">check</property>
</object> </object>
</child> </child>
<child> <child>
@@ -112,7 +110,6 @@
<property name="margin-start">10</property> <property name="margin-start">10</property>
<property name="margin-end">10</property> <property name="margin-end">10</property>
<property name="opacity">0</property> <property name="opacity">0</property>
<property name="accessible-role">status</property>
</object> </object>
</child> </child>
</object> </object>
@@ -153,11 +150,10 @@
<property name="halign">start</property> <property name="halign">start</property>
<property name="valign">center</property> <property name="valign">center</property>
<property name="hexpand">1</property> <property name="hexpand">1</property>
<property name="mnemonic-widget">scale</property>
</object> </object>
</child> </child>
<child> <child>
<object class="GtkScale" id="scale"> <object class="GtkScale">
<property name="halign">end</property> <property name="halign">end</property>
<property name="valign">center</property> <property name="valign">center</property>
<property name="draw-value">0</property> <property name="draw-value">0</property>
@@ -189,11 +185,10 @@
<property name="halign">start</property> <property name="halign">start</property>
<property name="valign">center</property> <property name="valign">center</property>
<property name="hexpand">1</property> <property name="hexpand">1</property>
<property name="mnemonic-widget">spin</property>
</object> </object>
</child> </child>
<child> <child>
<object class="GtkSpinButton" id="spin"> <object class="GtkSpinButton">
<property name="halign">end</property> <property name="halign">end</property>
<property name="valign">center</property> <property name="valign">center</property>
<property name="adjustment"> <property name="adjustment">
@@ -222,11 +217,10 @@
<property name="halign">start</property> <property name="halign">start</property>
<property name="valign">center</property> <property name="valign">center</property>
<property name="hexpand">1</property> <property name="hexpand">1</property>
<property name="mnemonic-widget">dropdown</property>
</object> </object>
</child> </child>
<child> <child>
<object class="GtkDropDown" id="dropdown"> <object class="GtkDropDown">
<property name="halign">end</property> <property name="halign">end</property>
<property name="valign">center</property> <property name="valign">center</property>
<property name="model"> <property name="model">
@@ -258,11 +252,10 @@
<property name="halign">start</property> <property name="halign">start</property>
<property name="valign">center</property> <property name="valign">center</property>
<property name="hexpand">1</property> <property name="hexpand">1</property>
<property name="mnemonic-widget">entry</property>
</object> </object>
</child> </child>
<child> <child>
<object class="GtkEntry" id="entry"> <object class="GtkEntry">
<property name="halign">end</property> <property name="halign">end</property>
<property name="valign">center</property> <property name="valign">center</property>
<property name="placeholder-text">Type here…</property> <property name="placeholder-text">Type here…</property>

View File

@@ -52,10 +52,6 @@ setup_listitem_cb (GtkListItemFactory *factory,
box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 12); box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 12);
image = gtk_image_new (); image = gtk_image_new ();
gtk_accessible_update_property (GTK_ACCESSIBLE (image),
GTK_ACCESSIBLE_PROPERTY_LABEL,
"App icon",
-1);
gtk_image_set_icon_size (GTK_IMAGE (image), GTK_ICON_SIZE_LARGE); gtk_image_set_icon_size (GTK_IMAGE (image), GTK_ICON_SIZE_LARGE);
gtk_box_append (GTK_BOX (box), image); gtk_box_append (GTK_BOX (box), image);
label = gtk_label_new (""); label = gtk_label_new ("");
@@ -83,7 +79,6 @@ bind_listitem_cb (GtkListItemFactory *factory,
gtk_image_set_from_gicon (GTK_IMAGE (image), g_app_info_get_icon (app_info)); gtk_image_set_from_gicon (GTK_IMAGE (image), g_app_info_get_icon (app_info));
gtk_label_set_label (GTK_LABEL (label), g_app_info_get_display_name (app_info)); gtk_label_set_label (GTK_LABEL (label), g_app_info_get_display_name (app_info));
gtk_list_item_set_accessible_label (list_item, g_app_info_get_display_name (app_info));
} }
/* In more complex code, we would also need functions to unbind and teardown /* In more complex code, we would also need functions to unbind and teardown

View File

@@ -431,9 +431,6 @@ setup_listitem_cb (GtkListItemFactory *factory,
picture = gtk_picture_new (); picture = gtk_picture_new ();
gtk_expression_bind (expression, picture, "paintable", picture); gtk_expression_bind (expression, picture, "paintable", picture);
gtk_box_append (GTK_BOX (box), picture); gtk_box_append (GTK_BOX (box), picture);
gtk_accessible_update_relation (GTK_ACCESSIBLE (picture),
GTK_ACCESSIBLE_RELATION_LABELLED_BY, location_label, NULL,
-1);
/* And finally, everything comes together. /* And finally, everything comes together.
@@ -490,9 +487,6 @@ do_listview_clocks (GtkWidget *do_widget)
model = GTK_SELECTION_MODEL (gtk_no_selection_new (create_clocks_model ())); model = GTK_SELECTION_MODEL (gtk_no_selection_new (create_clocks_model ()));
gridview = gtk_grid_view_new (model, factory); gridview = gtk_grid_view_new (model, factory);
gtk_accessible_update_property (GTK_ACCESSIBLE (gridview),
GTK_ACCESSIBLE_PROPERTY_LABEL, "Clocks",
-1);
gtk_scrollable_set_hscroll_policy (GTK_SCROLLABLE (gridview), GTK_SCROLL_NATURAL); gtk_scrollable_set_hscroll_policy (GTK_SCROLLABLE (gridview), GTK_SCROLL_NATURAL);
gtk_scrollable_set_vscroll_policy (GTK_SCROLLABLE (gridview), GTK_SCROLL_NATURAL); gtk_scrollable_set_vscroll_policy (GTK_SCROLLABLE (gridview), GTK_SCROLL_NATURAL);

View File

@@ -368,38 +368,6 @@ match_func (MatchObject *obj,
g_free (tmp2); g_free (tmp2);
} }
static void
setup_header (GtkSignalListItemFactory *factory,
GObject *list_item,
gpointer data)
{
GtkListHeader *self = GTK_LIST_HEADER (list_item);
GtkWidget *child;
child = gtk_label_new ("");
gtk_label_set_xalign (GTK_LABEL (child), 0);
gtk_label_set_use_markup (GTK_LABEL (child), TRUE);
gtk_widget_set_margin_top (child, 10);
gtk_widget_set_margin_bottom (child, 10);
gtk_list_header_set_child (self, child);
}
static void
bind_header (GtkSignalListItemFactory *factory,
GObject *list_item,
gpointer data)
{
GtkListHeader *self = GTK_LIST_HEADER (list_item);
GtkWidget *child = gtk_list_header_get_child (self);
GObject *item = gtk_list_header_get_item (self);
if (strstr (gtk_string_object_get_string (GTK_STRING_OBJECT (item)), "hour"))
gtk_label_set_label (GTK_LABEL (child), "<big><b>Hours</b></big>");
else
gtk_label_set_label (GTK_LABEL (child), "<big><b>Minutes</b></big>");
}
GtkWidget * GtkWidget *
do_listview_selections (GtkWidget *do_widget) do_listview_selections (GtkWidget *do_widget)
{ {
@@ -409,12 +377,10 @@ do_listview_selections (GtkWidget *do_widget)
GtkExpression *expression; GtkExpression *expression;
GtkListItemFactory *factory; GtkListItemFactory *factory;
const char * const times[] = { "1 minute", "2 minutes", "5 minutes", "20 minutes", NULL }; const char * const times[] = { "1 minute", "2 minutes", "5 minutes", "20 minutes", NULL };
const char * const minutes[] = { const char * const many_times[] = {
"1 minute", "2 minutes", "5 minutes", "10 minutes", "15 minutes", "20 minutes", "1 minute", "2 minutes", "5 minutes", "10 minutes", "15 minutes", "20 minutes",
"25 minutes", "30 minutes", "35 minutes", "40 minutes", "45 minutes", "50 minutes", "25 minutes", "30 minutes", "35 minutes", "40 minutes", "45 minutes", "50 minutes",
"55 minutes", NULL "55 minutes", "1 hour", "2 hours", "3 hours", "5 hours", "6 hours", "7 hours",
};
const char * const hours[] = { "1 hour", "2 hours", "3 hours", "5 hours", "6 hours", "7 hours",
"8 hours", "9 hours", "10 hours", "11 hours", "12 hours", NULL "8 hours", "9 hours", "10 hours", "11 hours", "12 hours", NULL
}; };
const char * const device_titles[] = { "Digital Output", "Headphones", "Digital Output", "Analog Output", NULL }; const char * const device_titles[] = { "Digital Output", "Headphones", "Digital Output", "Analog Output", NULL };
@@ -429,10 +395,6 @@ do_listview_selections (GtkWidget *do_widget)
if (!window) if (!window)
{ {
GtkStringList *minutes_model, *hours_model;
GListStore *store;
GtkFlattenListModel *flat;
window = gtk_window_new (); window = gtk_window_new ();
gtk_window_set_display (GTK_WINDOW (window), gtk_window_set_display (GTK_WINDOW (window),
gtk_widget_get_display (do_widget)); gtk_widget_get_display (do_widget));
@@ -460,25 +422,14 @@ do_listview_selections (GtkWidget *do_widget)
gtk_box_append (GTK_BOX (box), button); gtk_box_append (GTK_BOX (box), button);
/* A dropdown using an expression to obtain strings */ /* A dropdown using an expression to obtain strings */
minutes_model = gtk_string_list_new (minutes); button = drop_down_new_from_strings (many_times, NULL, NULL);
hours_model = gtk_string_list_new (hours); gtk_drop_down_set_enable_search (GTK_DROP_DOWN (button), TRUE);
store = g_list_store_new (G_TYPE_LIST_MODEL);
g_list_store_append (store, minutes_model);
g_list_store_append (store, hours_model);
g_object_unref (minutes_model);
g_object_unref (hours_model);
flat = gtk_flatten_list_model_new (G_LIST_MODEL (store));
expression = gtk_cclosure_expression_new (G_TYPE_STRING, NULL, expression = gtk_cclosure_expression_new (G_TYPE_STRING, NULL,
0, NULL, 0, NULL,
(GCallback)get_title, (GCallback)get_title,
NULL, NULL); NULL, NULL);
button = gtk_drop_down_new (G_LIST_MODEL (flat), expression); gtk_drop_down_set_expression (GTK_DROP_DOWN (button), expression);
gtk_drop_down_set_enable_search (GTK_DROP_DOWN (button), TRUE); gtk_expression_unref (expression);
factory = gtk_signal_list_item_factory_new ();
g_signal_connect (factory, "setup", G_CALLBACK (setup_header), NULL);
g_signal_connect (factory, "bind", G_CALLBACK (bind_header), NULL);
gtk_drop_down_set_header_factory (GTK_DROP_DOWN (button), factory);
g_object_unref (factory);
gtk_box_append (GTK_BOX (box), button); gtk_box_append (GTK_BOX (box), button);
button = gtk_drop_down_new (NULL, NULL); button = gtk_drop_down_new (NULL, NULL);

View File

@@ -10,8 +10,6 @@
<property name="child"> <property name="child">
<object class="GtkInscription"> <object class="GtkInscription">
<property name="hexpand">1</property> <property name="hexpand">1</property>
<property name="nat-chars">25</property>
<property name="text-overflow">ellipsize-end</property>
<binding name="text"> <binding name="text">
<lookup name="title" type="GtkDemo"> <lookup name="title" type="GtkDemo">
<lookup name="item">expander</lookup> <lookup name="item">expander</lookup>

View File

@@ -18,6 +18,7 @@
#include <string.h> #include <string.h>
#include "config.h" #include "config.h"
#include <gtk/gtk.h> #include <gtk/gtk.h>
#include <glib/gstdio.h> #include <glib/gstdio.h>
@@ -267,9 +268,9 @@ activate_run (GSimpleAction *action,
} }
static GtkWidget * static GtkWidget *
display_image (const char *format, display_image (const char *format,
const char *resource, const char *resource,
GtkWidget *label) char **label)
{ {
GtkWidget *sw, *image; GtkWidget *sw, *image;
@@ -279,17 +280,13 @@ display_image (const char *format,
sw = gtk_scrolled_window_new (); sw = gtk_scrolled_window_new ();
gtk_scrolled_window_set_child (GTK_SCROLLED_WINDOW (sw), image); gtk_scrolled_window_set_child (GTK_SCROLLED_WINDOW (sw), image);
gtk_accessible_update_relation (GTK_ACCESSIBLE (image),
GTK_ACCESSIBLE_RELATION_LABELLED_BY, label, NULL,
-1);
return sw; return sw;
} }
static GtkWidget * static GtkWidget *
display_images (const char *format, display_images (const char *format,
const char *resource_dir, const char *resource_dir,
GtkWidget *label) char **label)
{ {
char **resources; char **resources;
GtkWidget *grid; GtkWidget *grid;
@@ -314,15 +311,13 @@ display_images (const char *format,
{ {
char *resource_name; char *resource_name;
GtkWidget *box; GtkWidget *box;
GtkWidget *image_label;
resource_name = g_strconcat (resource_dir, "/", resources[i], NULL); resource_name = g_strconcat (resource_dir, "/", resources[i], NULL);
image_label = gtk_label_new (resources[i]); widget = display_image (NULL, resource_name, NULL);
widget = display_image (NULL, resource_name, image_label);
box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
gtk_box_append (GTK_BOX (box), widget); gtk_box_append (GTK_BOX (box), widget);
gtk_box_append (GTK_BOX (box), image_label); gtk_box_append (GTK_BOX (box), gtk_label_new (resources[i]));
gtk_flow_box_insert (GTK_FLOW_BOX (grid), box, -1); gtk_flow_box_insert (GTK_FLOW_BOX (grid), box, -1);
g_free (resource_name); g_free (resource_name);
@@ -330,19 +325,15 @@ display_images (const char *format,
g_strfreev (resources); g_strfreev (resources);
gtk_label_set_label (GTK_LABEL (label), "Images"); *label = g_strdup ("Images");
gtk_accessible_update_relation (GTK_ACCESSIBLE (grid),
GTK_ACCESSIBLE_RELATION_LABELLED_BY, label, NULL,
-1);
return sw; return sw;
} }
static GtkWidget * static GtkWidget *
display_text (const char *format, display_text (const char *format,
const char *resource, const char *resource,
GtkWidget *label) char **label)
{ {
GtkTextBuffer *buffer; GtkTextBuffer *buffer;
GtkWidget *textview, *sw; GtkWidget *textview, *sw;
@@ -377,10 +368,6 @@ display_text (const char *format,
gtk_text_view_set_buffer (GTK_TEXT_VIEW (textview), buffer); gtk_text_view_set_buffer (GTK_TEXT_VIEW (textview), buffer);
gtk_accessible_update_relation (GTK_ACCESSIBLE (textview),
GTK_ACCESSIBLE_RELATION_LABELLED_BY, label, NULL,
-1);
sw = gtk_scrolled_window_new (); sw = gtk_scrolled_window_new ();
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw), gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC,
@@ -391,19 +378,15 @@ display_text (const char *format,
} }
static GtkWidget * static GtkWidget *
display_video (const char *format, display_video (const char *format,
const char *resource, const char *resource,
GtkWidget *label) char **label)
{ {
GtkWidget *video; GtkWidget *video;
video = gtk_video_new_for_resource (resource); video = gtk_video_new_for_resource (resource);
gtk_video_set_loop (GTK_VIDEO (video), TRUE); gtk_video_set_loop (GTK_VIDEO (video), TRUE);
gtk_accessible_update_relation (GTK_ACCESSIBLE (video),
GTK_ACCESSIBLE_RELATION_LABELLED_BY, label, NULL,
-1);
return video; return video;
} }
@@ -425,9 +408,9 @@ display_nothing (const char *resource)
static struct { static struct {
const char *extension; const char *extension;
const char *format; const char *format;
GtkWidget * (* display_func) (const char *format, GtkWidget * (* display_func) (const char *format,
const char *resource, const char *resource,
GtkWidget *label); char **label);
} display_funcs[] = { } display_funcs[] = {
{ ".gif", NULL, display_image }, { ".gif", NULL, display_image },
{ ".jpg", NULL, display_image }, { ".jpg", NULL, display_image },
@@ -450,6 +433,7 @@ add_data_tab (const char *demoname)
char **resources; char **resources;
GtkWidget *widget, *label; GtkWidget *widget, *label;
guint i, j; guint i, j;
char *label_string;
resource_dir = g_strconcat ("/", demoname, NULL); resource_dir = g_strconcat ("/", demoname, NULL);
resources = g_resources_enumerate_children (resource_dir, 0, NULL); resources = g_resources_enumerate_children (resource_dir, 0, NULL);
@@ -469,21 +453,23 @@ add_data_tab (const char *demoname)
break; break;
} }
label = gtk_label_new (resources[i]); label_string = NULL;
if (j < G_N_ELEMENTS (display_funcs)) if (j < G_N_ELEMENTS (display_funcs))
widget = display_funcs[j].display_func (display_funcs[j].format, widget = display_funcs[j].display_func (display_funcs[j].format,
resource_name, resource_name,
label); &label_string);
else else
widget = display_nothing (resource_name); widget = display_nothing (resource_name);
label = gtk_label_new (label_string ? label_string : resources[i]);
gtk_notebook_append_page (GTK_NOTEBOOK (notebook), widget, label); gtk_notebook_append_page (GTK_NOTEBOOK (notebook), widget, label);
g_object_set (gtk_notebook_get_page (GTK_NOTEBOOK (notebook), widget), g_object_set (gtk_notebook_get_page (GTK_NOTEBOOK (notebook), widget),
"tab-expand", FALSE, "tab-expand", FALSE,
NULL); NULL);
g_free (resource_name); g_free (resource_name);
g_free (label_string);
} }
g_strfreev (resources); g_strfreev (resources);

View File

@@ -57,17 +57,14 @@
<object class="GtkBox"> <object class="GtkBox">
<child> <child>
<object class="GtkBox"> <object class="GtkBox">
<property name="width-request">220</property>
<property name="orientation">vertical</property> <property name="orientation">vertical</property>
<child> <child>
<object class="GtkSearchBar" id="searchbar"> <object class="GtkSearchBar" id="searchbar">
<accessibility>
<relation name="labelled-by">search-entry</relation>
</accessibility>
<property name="key-capture-widget">window</property> <property name="key-capture-widget">window</property>
<child> <child>
<object class="GtkSearchEntry" id="search-entry"> <object class="GtkSearchEntry" id="search-entry">
<accessibility> <accessibility>
<property name="label" translatable="yes">Search</property>
<relation name="controls">listview</relation> <relation name="controls">listview</relation>
</accessibility> </accessibility>
</object> </object>
@@ -79,15 +76,15 @@
<style> <style>
<class name="sidebar"/> <class name="sidebar"/>
</style> </style>
<property name="width-request">120</property>
<property name="hscrollbar-policy">never</property> <property name="hscrollbar-policy">never</property>
<property name="propagate-natural-width">1</property> <property name="min-content-width">150</property>
<property name="vexpand">1</property> <property name="vexpand">1</property>
<child> <child>
<object class="GtkListView" id="listview"> <object class="GtkListView" id="listview">
<style> <style>
<class name="navigation-sidebar"/> <class name="navigation-sidebar"/>
</style> </style>
<property name="tab-behavior">item</property>
<property name="factory"> <property name="factory">
<object class="GtkBuilderListItemFactory"> <object class="GtkBuilderListItemFactory">
<property name="resource">/ui/main-listitem.ui</property> <property name="resource">/ui/main-listitem.ui</property>

View File

@@ -72,8 +72,6 @@ demos = files([
'paintable_symbolic.c', 'paintable_symbolic.c',
'panes.c', 'panes.c',
'password_entry.c', 'password_entry.c',
'path_fill.c',
'path_text.c',
'peg_solitaire.c', 'peg_solitaire.c',
'pickers.c', 'pickers.c',
'printing.c', 'printing.c',
@@ -152,13 +150,25 @@ if librsvg_dep.found()
gtkdemo_deps += [ librsvg_dep ] gtkdemo_deps += [ librsvg_dep ]
endif endif
gtkdemo_args = [ '-DGDK_DISABLE_DEPRECATED', '-DGTK_DISABLE_DEPRECATED', ]
demos_h = custom_target('gtk4 demo header', demos_h = custom_target('gtk4 demo header',
output: 'demos.h', output: 'demos.h',
input: demos, input: demos,
command: [ find_program('geninclude.py'), '@OUTPUT@', '@INPUT@' ], command: [ find_program('geninclude.py'), '@OUTPUT@', '@INPUT@' ],
) )
if can_use_objcopy_for_resources objcopy_supports_add_symbol = false
objcopy = find_program('objcopy', required : false)
if objcopy.found()
objcopy_supports_add_symbol = run_command(objcopy, '--help', check: false).stdout().contains('--add-symbol')
endif
ld = find_program('ld', required : false)
if not meson.is_cross_build() and build_machine.cpu_family() != 'arm' and build_machine.system() == 'linux' and objcopy.found() and objcopy_supports_add_symbol and ld.found()
glib_compile_resources = find_program('glib-compile-resources')
# Create the resource blob # Create the resource blob
gtkdemo_gresource = custom_target('gtkdemo.gresource', gtkdemo_gresource = custom_target('gtkdemo.gresource',
input : 'demo.gresource.xml', input : 'demo.gresource.xml',
@@ -206,7 +216,6 @@ if can_use_objcopy_for_resources
output : 'gtkdemo_resources2.o', output : 'gtkdemo_resources2.o',
command : [objcopy, command : [objcopy,
'--strip-all', '--strip-all',
'--set-section-alignment', '.data=8',
'--add-symbol','_g_binary_gtkdemo_resource_data=.data:0', '--add-symbol','_g_binary_gtkdemo_resource_data=.data:0',
'@INPUT@', '@INPUT@',
'@OUTPUT@']) '@OUTPUT@'])
@@ -235,7 +244,7 @@ gtkdemo_deps += [ demo_conf_h ]
executable('gtk4-demo', executable('gtk4-demo',
sources: [demos, demos_h, extra_demo_sources, gtkdemo_resources], sources: [demos, demos_h, extra_demo_sources, gtkdemo_resources],
c_args: demo_cflags, c_args: gtkdemo_args + demo_cflags,
dependencies: gtkdemo_deps, dependencies: gtkdemo_deps,
include_directories: confinc, include_directories: confinc,
win_subsystem: 'windows', win_subsystem: 'windows',
@@ -245,7 +254,7 @@ executable('gtk4-demo',
executable('gtk4-demo-application', executable('gtk4-demo-application',
sources: ['application.c', gtkdemo_resources], sources: ['application.c', gtkdemo_resources],
c_args: common_cflags, c_args: gtkdemo_args + common_cflags,
dependencies: gtkdemo_deps, dependencies: gtkdemo_deps,
include_directories: confinc, include_directories: confinc,
win_subsystem: 'windows', win_subsystem: 'windows',

View File

@@ -7,6 +7,8 @@
#include <glib/gi18n.h> #include <glib/gi18n.h>
#include <gtk/gtk.h> #include <gtk/gtk.h>
G_GNUC_BEGIN_IGNORE_DEPRECATIONS
enum { enum {
COLOR_SET, COLOR_SET,
N_SIGNALS N_SIGNALS
@@ -122,16 +124,19 @@ drawing_area_unmap (GtkWidget *widget)
static void static void
drawing_area_snapshot (GtkWidget *widget, drawing_area_snapshot (GtkWidget *widget,
GtkSnapshot *snapshot) GtkSnapshot *snapshot)
{ {
DrawingArea *area = (DrawingArea *) widget; DrawingArea *area = (DrawingArea *) widget;
int width, height; GtkAllocation allocation;
cairo_t *cr; cairo_t *cr;
width = gtk_widget_get_width (widget); gtk_widget_get_allocation (widget, &allocation);
height = gtk_widget_get_height (widget); cr = gtk_snapshot_append_cairo (snapshot,
&GRAPHENE_RECT_INIT (
cr = gtk_snapshot_append_cairo (snapshot, &GRAPHENE_RECT_INIT (0, 0, width, height)); 0, 0,
allocation.width,
allocation.height
));
cairo_set_source_rgb (cr, 1, 1, 1); cairo_set_source_rgb (cr, 1, 1, 1);
cairo_paint (cr); cairo_paint (cr);
@@ -140,7 +145,7 @@ drawing_area_snapshot (GtkWidget *widget,
cairo_paint (cr); cairo_paint (cr);
cairo_set_source_rgb (cr, 0.6, 0.6, 0.6); cairo_set_source_rgb (cr, 0.6, 0.6, 0.6);
cairo_rectangle (cr, 0, 0, width, height); cairo_rectangle (cr, 0, 0, allocation.width, allocation.height);
cairo_stroke (cr); cairo_stroke (cr);
cairo_destroy (cr); cairo_destroy (cr);

View File

@@ -68,9 +68,6 @@ do_password_entry (GtkWidget *do_widget)
"placeholder-text", "Password", "placeholder-text", "Password",
"activates-default", TRUE, "activates-default", TRUE,
NULL); NULL);
gtk_accessible_update_property (GTK_ACCESSIBLE (entry),
GTK_ACCESSIBLE_PROPERTY_LABEL, "Password",
-1);
g_signal_connect (entry, "notify::text", G_CALLBACK (update_button), NULL); g_signal_connect (entry, "notify::text", G_CALLBACK (update_button), NULL);
gtk_box_append (GTK_BOX (box), entry); gtk_box_append (GTK_BOX (box), entry);
@@ -80,9 +77,6 @@ do_password_entry (GtkWidget *do_widget)
"placeholder-text", "Confirm", "placeholder-text", "Confirm",
"activates-default", TRUE, "activates-default", TRUE,
NULL); NULL);
gtk_accessible_update_property (GTK_ACCESSIBLE (entry2),
GTK_ACCESSIBLE_PROPERTY_LABEL, "Confirm",
-1);
g_signal_connect (entry2, "notify::text", G_CALLBACK (update_button), NULL); g_signal_connect (entry2, "notify::text", G_CALLBACK (update_button), NULL);
gtk_box_append (GTK_BOX (box), entry2); gtk_box_append (GTK_BOX (box), entry2);

View File

@@ -1,198 +0,0 @@
/* Path/Fill and Stroke
*
* This demo shows how to use GskPath to draw shapes that are (a bit)
* more complex than a rounded rectangle.
*/
#include <glib/gi18n.h>
#include <gtk/gtk.h>
#include "paintable.h"
#define GTK_TYPE_LOGO_PAINTABLE (gtk_logo_paintable_get_type ())
G_DECLARE_FINAL_TYPE (GtkLogoPaintable, gtk_logo_paintable, GTK, LOGO_PAINTABLE, GObject)
struct _GtkLogoPaintable
{
GObject parent_instance;
int width;
int height;
GskPath *path[3];
GdkRGBA color[3];
GskPath *stroke_path;
GskStroke *stroke1;
GskStroke *stroke2;
GdkRGBA stroke_color;
};
struct _GtkLogoPaintableClass
{
GObjectClass parent_class;
};
static int
gtk_logo_paintable_get_intrinsic_width (GdkPaintable *paintable)
{
GtkLogoPaintable *self = GTK_LOGO_PAINTABLE (paintable);
return self->width;
}
static int
gtk_logo_paintable_get_intrinsic_height (GdkPaintable *paintable)
{
GtkLogoPaintable *self = GTK_LOGO_PAINTABLE (paintable);
return self->height;
}
static void
gtk_logo_paintable_snapshot (GdkPaintable *paintable,
GdkSnapshot *snapshot,
double width,
double height)
{
GtkLogoPaintable *self = GTK_LOGO_PAINTABLE (paintable);
for (unsigned int i = 0; i < 3; i++)
{
gtk_snapshot_push_fill (snapshot, self->path[i], GSK_FILL_RULE_WINDING);
gtk_snapshot_append_color (snapshot,
&self->color[i],
&GRAPHENE_RECT_INIT (0, 0, width, height));
gtk_snapshot_pop (snapshot);
}
for (unsigned int i = 0; i < 3; i++)
{
gtk_snapshot_push_stroke (snapshot, self->stroke_path, self->stroke1);
gtk_snapshot_append_color (snapshot,
&self->stroke_color,
&GRAPHENE_RECT_INIT (0, 0, width, height));
gtk_snapshot_pop (snapshot);
}
gtk_snapshot_push_stroke (snapshot, self->stroke_path, self->stroke2);
gtk_snapshot_append_color (snapshot,
&self->stroke_color,
&GRAPHENE_RECT_INIT (0, 0, width, height));
gtk_snapshot_pop (snapshot);
}
static GdkPaintableFlags
gtk_logo_paintable_get_flags (GdkPaintable *paintable)
{
return GDK_PAINTABLE_STATIC_CONTENTS | GDK_PAINTABLE_STATIC_SIZE;
}
static void
gtk_logo_paintable_paintable_init (GdkPaintableInterface *iface)
{
iface->get_intrinsic_width = gtk_logo_paintable_get_intrinsic_width;
iface->get_intrinsic_height = gtk_logo_paintable_get_intrinsic_height;
iface->snapshot = gtk_logo_paintable_snapshot;
iface->get_flags = gtk_logo_paintable_get_flags;
}
/* When defining the GType, we need to implement the GdkPaintable interface */
G_DEFINE_TYPE_WITH_CODE (GtkLogoPaintable, gtk_logo_paintable, G_TYPE_OBJECT,
G_IMPLEMENT_INTERFACE (GDK_TYPE_PAINTABLE,
gtk_logo_paintable_paintable_init))
static void
gtk_logo_paintable_dispose (GObject *object)
{
GtkLogoPaintable *self = GTK_LOGO_PAINTABLE (object);
for (unsigned int i = 0; i < 3; i++)
gsk_path_unref (self->path[i]);
gsk_path_unref (self->stroke_path);
gsk_stroke_free (self->stroke1);
gsk_stroke_free (self->stroke2);
G_OBJECT_CLASS (gtk_logo_paintable_parent_class)->dispose (object);
}
static void
gtk_logo_paintable_class_init (GtkLogoPaintableClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
object_class->dispose = gtk_logo_paintable_dispose;
}
static void
gtk_logo_paintable_init (GtkLogoPaintable *self)
{
}
static GdkPaintable *
gtk_logo_paintable_new (void)
{
GtkLogoPaintable *self;
graphene_rect_t bounds, bounds2;
self = g_object_new (GTK_TYPE_LOGO_PAINTABLE, NULL);
/* Paths and colors extracted from gtk-logo.svg */
self->path[0] = gsk_path_parse ("m3.12,66.17 -2.06,-51.46 32.93,24.7 v55.58 l-30.87,-28.82 z");
self->path[1] = gsk_path_parse ("m34,95 49.4,-20.58 4.12,-51.46 -53.52,16.47 v55.58 z");
self->path[2] = gsk_path_parse ("m1.06,14.71 32.93,24.7 53.52,-16.47 -36.75,-21.88 -49.7,13.65 z");
gdk_rgba_parse (&self->color[0], "#e40000");
gdk_rgba_parse (&self->color[1], "#7fe719");
gdk_rgba_parse (&self->color[2], "#729fcf");
self->stroke_path = gsk_path_parse ("m50.6,51.3 -47.3,14 z l33,23 z v-50");
self->stroke1 = gsk_stroke_new (2.12);
self->stroke2 = gsk_stroke_new (1.25);
gdk_rgba_parse (&self->stroke_color, "#ffffff");
gsk_path_get_stroke_bounds (self->path[0], self->stroke1, &bounds);
gsk_path_get_stroke_bounds (self->path[1], self->stroke1, &bounds2);
graphene_rect_union (&bounds, &bounds2, &bounds);
gsk_path_get_stroke_bounds (self->path[2], self->stroke1, &bounds2);
graphene_rect_union (&bounds, &bounds2, &bounds);
gsk_path_get_stroke_bounds (self->stroke_path, self->stroke2, &bounds2);
graphene_rect_union (&bounds, &bounds2, &bounds);
self->width = bounds.origin.x + bounds.size.width;
self->height = bounds.origin.y + bounds.size.height;
return GDK_PAINTABLE (self);
}
GtkWidget *
do_path_fill (GtkWidget *do_widget)
{
static GtkWidget *window = NULL;
if (!window)
{
GtkWidget *picture;
GdkPaintable *paintable;
window = gtk_window_new ();
gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
gtk_window_set_title (GTK_WINDOW (window), "Path Fill");
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
paintable = gtk_logo_paintable_new ();
picture = gtk_picture_new_for_paintable (paintable);
gtk_picture_set_content_fit (GTK_PICTURE (picture), GTK_CONTENT_FIT_CONTAIN);
gtk_picture_set_can_shrink (GTK_PICTURE (picture), FALSE);
g_object_unref (paintable);
gtk_window_set_child (GTK_WINDOW (window), picture);
}
if (!gtk_widget_get_visible (window))
gtk_window_present (GTK_WINDOW (window));
else
gtk_window_destroy (GTK_WINDOW (window));
return window;
}

View File

@@ -1,604 +0,0 @@
/* Path/Text
*
* This demo shows how to use GskPath to animate a path along another path.
*/
#include <glib/gi18n.h>
#include <gtk/gtk.h>
#define GTK_TYPE_PATH_WIDGET (gtk_path_widget_get_type ())
G_DECLARE_FINAL_TYPE (GtkPathWidget, gtk_path_widget, GTK, PATH_WIDGET, GtkWidget)
#define POINT_SIZE 8
enum {
PROP_0,
PROP_TEXT,
PROP_EDITABLE,
N_PROPS
};
struct _GtkPathWidget
{
GtkWidget parent_instance;
char *text;
gboolean editable;
graphene_point_t points[4];
guint active_point;
float line_closest;
GskPath *line_path;
GskPathMeasure *line_measure;
GskPath *text_path;
GdkPaintable *background;
};
struct _GtkPathWidgetClass
{
GtkWidgetClass parent_class;
};
static GParamSpec *properties[N_PROPS] = { NULL, };
G_DEFINE_TYPE (GtkPathWidget, gtk_path_widget, GTK_TYPE_WIDGET)
static GskPath *
create_path_from_text (GtkWidget *widget,
const char *text,
graphene_point_t *out_offset)
{
PangoLayout *layout;
PangoFontDescription *desc;
GskPathBuilder *builder;
GskPath *result;
layout = gtk_widget_create_pango_layout (widget, text);
desc = pango_font_description_from_string ("sans bold 36");
pango_layout_set_font_description (layout, desc);
pango_font_description_free (desc);
builder = gsk_path_builder_new ();
gsk_path_builder_add_layout (builder, layout);
result = gsk_path_builder_free_to_path (builder);
if (out_offset)
graphene_point_init (out_offset, 0, - pango_layout_get_baseline (layout) / (double) PANGO_SCALE);
g_object_unref (layout);
return result;
}
typedef struct
{
GskPathMeasure *measure;
GskPathBuilder *builder;
graphene_point_t offset;
double scale;
} GtkPathTransform;
static void
gtk_path_transform_point (GskPathMeasure *measure,
const graphene_point_t *pt,
const graphene_point_t *offset,
float scale,
graphene_point_t *res)
{
graphene_vec2_t tangent;
GskPathPoint point;
if (gsk_path_measure_get_point (measure, (pt->x + offset->x) * scale, &point))
{
GskPath *path = gsk_path_measure_get_path (measure);
gsk_path_point_get_position (path, &point, res);
gsk_path_point_get_tangent (path, &point, GSK_PATH_END, &tangent);
res->x -= (pt->y + offset->y) * scale * graphene_vec2_get_y (&tangent);
res->y += (pt->y + offset->y) * scale * graphene_vec2_get_x (&tangent);
}
}
static gboolean
gtk_path_transform_op (GskPathOperation op,
const graphene_point_t *pts,
gsize n_pts,
gpointer data)
{
GtkPathTransform *transform = data;
switch (op)
{
case GSK_PATH_MOVE:
{
graphene_point_t res;
gtk_path_transform_point (transform->measure, &pts[0], &transform->offset, transform->scale, &res);
gsk_path_builder_move_to (transform->builder, res.x, res.y);
}
break;
case GSK_PATH_LINE:
{
graphene_point_t res;
gtk_path_transform_point (transform->measure, &pts[1], &transform->offset, transform->scale, &res);
gsk_path_builder_line_to (transform->builder, res.x, res.y);
}
break;
case GSK_PATH_QUAD:
{
graphene_point_t res[2];
gtk_path_transform_point (transform->measure, &pts[1], &transform->offset, transform->scale, &res[0]);
gtk_path_transform_point (transform->measure, &pts[2], &transform->offset, transform->scale, &res[1]);
gsk_path_builder_quad_to (transform->builder, res[0].x, res[0].y, res[1].x, res[1].y);
}
break;
case GSK_PATH_CUBIC:
{
graphene_point_t res[3];
gtk_path_transform_point (transform->measure, &pts[1], &transform->offset, transform->scale, &res[0]);
gtk_path_transform_point (transform->measure, &pts[2], &transform->offset, transform->scale, &res[1]);
gtk_path_transform_point (transform->measure, &pts[3], &transform->offset, transform->scale, &res[2]);
gsk_path_builder_cubic_to (transform->builder, res[0].x, res[0].y, res[1].x, res[1].y, res[2].x, res[2].y);
}
break;
case GSK_PATH_CLOSE:
gsk_path_builder_close (transform->builder);
break;
default:
g_assert_not_reached();
return FALSE;
}
return TRUE;
}
static GskPath *
gtk_path_transform (GskPathMeasure *measure,
GskPath *path,
const graphene_point_t *offset)
{
GtkPathTransform transform = { measure, gsk_path_builder_new (), *offset };
graphene_rect_t bounds;
gsk_path_get_bounds (path, &bounds);
if (bounds.origin.x + bounds.size.width > 0)
transform.scale = gsk_path_measure_get_length (measure) / (bounds.origin.x + bounds.size.width);
else
transform.scale = 1.0f;
gsk_path_foreach (path, -1, gtk_path_transform_op, &transform);
return gsk_path_builder_free_to_path (transform.builder);
}
static void
gtk_path_widget_clear_text_path (GtkPathWidget *self)
{
g_clear_pointer (&self->text_path, gsk_path_unref);
}
static void
gtk_path_widget_clear_paths (GtkPathWidget *self)
{
gtk_path_widget_clear_text_path (self);
g_clear_pointer (&self->line_path, gsk_path_unref);
g_clear_pointer (&self->line_measure, gsk_path_measure_unref);
}
static void
gtk_path_widget_create_text_path (GtkPathWidget *self)
{
GskPath *path;
graphene_point_t offset;
gtk_path_widget_clear_text_path (self);
if (self->line_measure == NULL)
return;
path = create_path_from_text (GTK_WIDGET (self), self->text, &offset);
self->text_path = gtk_path_transform (self->line_measure, path, &offset);
gsk_path_unref (path);
}
static void
gtk_path_widget_create_paths (GtkPathWidget *self)
{
double width = gtk_widget_get_width (GTK_WIDGET (self));
double height = gtk_widget_get_height (GTK_WIDGET (self));
GskPathBuilder *builder;
gtk_path_widget_clear_paths (self);
if (width <= 0 || height <= 0)
return;
builder = gsk_path_builder_new ();
gsk_path_builder_move_to (builder,
self->points[0].x * width, self->points[0].y * height);
gsk_path_builder_cubic_to (builder,
self->points[1].x * width, self->points[1].y * height,
self->points[2].x * width, self->points[2].y * height,
self->points[3].x * width, self->points[3].y * height);
self->line_path = gsk_path_builder_free_to_path (builder);
self->line_measure = gsk_path_measure_new (self->line_path);
gtk_path_widget_create_text_path (self);
}
static void
gtk_path_widget_allocate (GtkWidget *widget,
int width,
int height,
int baseline)
{
GtkPathWidget *self = GTK_PATH_WIDGET (widget);
GTK_WIDGET_CLASS (gtk_path_widget_parent_class)->size_allocate (widget, width, height, baseline);
gtk_path_widget_create_paths (self);
}
static void
gtk_path_widget_snapshot (GtkWidget *widget,
GtkSnapshot *snapshot)
{
GtkPathWidget *self = GTK_PATH_WIDGET (widget);
double width = gtk_widget_get_width (widget);
double height = gtk_widget_get_height (widget);
GskPath *path;
GskStroke *stroke;
gsize i;
/* frosted glass the background */
gtk_snapshot_push_blur (snapshot, 100);
gdk_paintable_snapshot (self->background, snapshot, width, height);
gtk_snapshot_append_color (snapshot, &(GdkRGBA) { 1, 1, 1, 0.6 }, &GRAPHENE_RECT_INIT (0, 0, width, height));
gtk_snapshot_pop (snapshot);
/* draw the text */
if (self->text_path)
{
gtk_snapshot_push_fill (snapshot, self->text_path, GSK_FILL_RULE_WINDING);
gdk_paintable_snapshot (self->background, snapshot, width, height);
/* ... with an emboss effect */
stroke = gsk_stroke_new (2.0);
gtk_snapshot_translate (snapshot, &GRAPHENE_POINT_INIT(1, 1));
gtk_snapshot_push_stroke (snapshot, self->text_path, stroke);
gtk_snapshot_append_color (snapshot, &(GdkRGBA) { 0, 0, 0, 0.2 }, &GRAPHENE_RECT_INIT (0, 0, width, height));
gsk_stroke_free (stroke);
gtk_snapshot_pop (snapshot);
gtk_snapshot_pop (snapshot);
}
if (self->editable && self->line_path)
{
GskPathBuilder *builder;
/* draw the control line */
stroke = gsk_stroke_new (1.0);
gtk_snapshot_push_stroke (snapshot, self->line_path, stroke);
gsk_stroke_free (stroke);
gtk_snapshot_append_color (snapshot, &(GdkRGBA) { 0, 0, 0, 1 }, &GRAPHENE_RECT_INIT (0, 0, width, height));
gtk_snapshot_pop (snapshot);
/* draw the points */
builder = gsk_path_builder_new ();
for (i = 0; i < 4; i++)
{
gsk_path_builder_add_circle (builder, &GRAPHENE_POINT_INIT (self->points[i].x * width, self->points[i].y * height), POINT_SIZE);
}
path = gsk_path_builder_free_to_path (builder);
gtk_snapshot_push_fill (snapshot, path, GSK_FILL_RULE_WINDING);
gtk_snapshot_append_color (snapshot, &(GdkRGBA) { 1, 1, 1, 1 }, &GRAPHENE_RECT_INIT (0, 0, width, height));
gtk_snapshot_pop (snapshot);
stroke = gsk_stroke_new (1.0);
gtk_snapshot_push_stroke (snapshot, path, stroke);
gsk_stroke_free (stroke);
gtk_snapshot_append_color (snapshot, &(GdkRGBA) { 0, 0, 0, 1 }, &GRAPHENE_RECT_INIT (0, 0, width, height));
gtk_snapshot_pop (snapshot);
gsk_path_unref (path);
}
if (self->line_closest >= 0)
{
GskPathBuilder *builder;
GskPathPoint point;
graphene_point_t closest;
builder = gsk_path_builder_new ();
if (gsk_path_measure_get_point (self->line_measure, self->line_closest, &point))
{
gsk_path_point_get_position (self->line_path, &point, &closest);
gsk_path_builder_add_circle (builder, &closest, POINT_SIZE);
path = gsk_path_builder_free_to_path (builder);
gtk_snapshot_push_fill (snapshot, path, GSK_FILL_RULE_WINDING);
gtk_snapshot_append_color (snapshot, &(GdkRGBA) { 0, 0, 1, 1 }, &GRAPHENE_RECT_INIT (0, 0, width, height));
gtk_snapshot_pop (snapshot);
gsk_path_unref (path);
}
}
}
static void
gtk_path_widget_set_text (GtkPathWidget *self,
const char *text)
{
if (g_strcmp0 (self->text, text) == 0)
return;
g_free (self->text);
self->text = g_strdup (text);
gtk_path_widget_create_paths (self);
gtk_widget_queue_draw (GTK_WIDGET (self));
g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_TEXT]);
}
static void
gtk_path_widget_set_editable (GtkPathWidget *self,
gboolean editable)
{
if (self->editable == editable)
return;
self->editable = editable;
gtk_widget_queue_draw (GTK_WIDGET (self));
g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_EDITABLE]);
}
static void
gtk_path_widget_set_property (GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
{
GtkPathWidget *self = GTK_PATH_WIDGET (object);
switch (prop_id)
{
case PROP_TEXT:
gtk_path_widget_set_text (self, g_value_get_string (value));
break;
case PROP_EDITABLE:
gtk_path_widget_set_editable (self, g_value_get_boolean (value));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static void
gtk_path_widget_get_property (GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec)
{
GtkPathWidget *self = GTK_PATH_WIDGET (object);
switch (prop_id)
{
case PROP_TEXT:
g_value_set_string (value, self->text);
break;
case PROP_EDITABLE:
g_value_set_boolean (value, self->editable);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static void
gtk_path_widget_dispose (GObject *object)
{
GtkPathWidget *self = GTK_PATH_WIDGET (object);
gtk_path_widget_clear_paths (self);
G_OBJECT_CLASS (gtk_path_widget_parent_class)->dispose (object);
}
static void
gtk_path_widget_class_init (GtkPathWidgetClass *klass)
{
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
GObjectClass *object_class = G_OBJECT_CLASS (klass);
object_class->dispose = gtk_path_widget_dispose;
object_class->set_property = gtk_path_widget_set_property;
object_class->get_property = gtk_path_widget_get_property;
widget_class->size_allocate = gtk_path_widget_allocate;
widget_class->snapshot = gtk_path_widget_snapshot;
properties[PROP_TEXT] =
g_param_spec_string ("text",
"text",
"Text transformed along a path",
NULL,
G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS);
properties[PROP_EDITABLE] =
g_param_spec_boolean ("editable",
"editable",
"If the path can be edited by the user",
FALSE,
G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS);
g_object_class_install_properties (object_class, N_PROPS, properties);
}
static void
drag_begin (GtkGestureDrag *gesture,
double x,
double y,
GtkPathWidget *self)
{
graphene_point_t mouse = GRAPHENE_POINT_INIT (x, y);
double width = gtk_widget_get_width (GTK_WIDGET (self));
double height = gtk_widget_get_height (GTK_WIDGET (self));
gsize i;
for (i = 0; i < 4; i++)
{
if (graphene_point_distance (&GRAPHENE_POINT_INIT (self->points[i].x * width, self->points[i].y * height), &mouse, NULL, NULL) <= POINT_SIZE)
{
self->active_point = i;
break;
}
}
if (i == 4)
{
gtk_gesture_set_state (GTK_GESTURE (gesture), GTK_EVENT_SEQUENCE_DENIED);
return;
}
gtk_widget_queue_draw (GTK_WIDGET (self));
}
static void
drag_update (GtkGestureDrag *drag,
double offset_x,
double offset_y,
GtkPathWidget *self)
{
double width = gtk_widget_get_width (GTK_WIDGET (self));
double height = gtk_widget_get_height (GTK_WIDGET (self));
double start_x, start_y;
gtk_gesture_drag_get_start_point (drag, &start_x, &start_y);
self->points[self->active_point] = GRAPHENE_POINT_INIT ((start_x + offset_x) / width,
(start_y + offset_y) / height);
self->points[self->active_point].x = CLAMP (self->points[self->active_point].x, 0, 1);
self->points[self->active_point].y = CLAMP (self->points[self->active_point].y, 0, 1);
gtk_path_widget_create_paths (self);
gtk_widget_queue_draw (GTK_WIDGET (self));
}
static void
pointer_motion (GtkEventControllerMotion *controller,
double x,
double y,
GtkPathWidget *self)
{
GskPathPoint point;
graphene_point_t pos;
if (gsk_path_get_closest_point (gsk_path_measure_get_path (self->line_measure),
&GRAPHENE_POINT_INIT (x, y),
INFINITY,
&point))
{
gsk_path_point_get_position (self->line_path, &point, &pos);
self->line_closest = graphene_point_distance (&pos, &GRAPHENE_POINT_INIT (x, y), NULL, NULL);
gtk_widget_queue_draw (GTK_WIDGET (self));
}
}
static void
pointer_leave (GtkEventControllerMotion *controller,
GtkPathWidget *self)
{
self->line_closest = -1;
gtk_widget_queue_draw (GTK_WIDGET (self));
}
static void
gtk_path_widget_init (GtkPathWidget *self)
{
GtkEventController *controller;
controller = GTK_EVENT_CONTROLLER (gtk_gesture_drag_new ());
g_signal_connect (controller, "drag-begin", G_CALLBACK (drag_begin), self);
g_signal_connect (controller, "drag-update", G_CALLBACK (drag_update), self);
g_signal_connect (controller, "drag-end", G_CALLBACK (drag_update), self);
gtk_widget_add_controller (GTK_WIDGET (self), controller);
controller = GTK_EVENT_CONTROLLER (gtk_event_controller_motion_new ());
g_signal_connect (controller, "enter", G_CALLBACK (pointer_motion), self);
g_signal_connect (controller, "motion", G_CALLBACK (pointer_motion), self);
g_signal_connect (controller, "leave", G_CALLBACK (pointer_leave), self);
gtk_widget_add_controller (GTK_WIDGET (self), controller);
self->line_closest = -1;
self->points[0] = GRAPHENE_POINT_INIT (0.1, 0.9);
self->points[1] = GRAPHENE_POINT_INIT (0.3, 0.1);
self->points[2] = GRAPHENE_POINT_INIT (0.7, 0.1);
self->points[3] = GRAPHENE_POINT_INIT (0.9, 0.9);
self->background = GDK_PAINTABLE (gdk_texture_new_from_resource ("/sliding_puzzle/portland-rose.jpg"));
gtk_path_widget_set_text (self, "It's almost working");
}
GtkWidget *
gtk_path_widget_new (void)
{
GtkPathWidget *self;
self = g_object_new (GTK_TYPE_PATH_WIDGET, NULL);
return GTK_WIDGET (self);
}
GtkWidget *
do_path_text (GtkWidget *do_widget)
{
static GtkWidget *window = NULL;
if (!window)
{
GtkBuilder *builder;
g_type_ensure (GTK_TYPE_PATH_WIDGET);
builder = gtk_builder_new_from_resource ("/path_text/path_text.ui");
window = GTK_WIDGET (gtk_builder_get_object (builder, "window"));
gtk_window_set_display (GTK_WINDOW (window),
gtk_widget_get_display (do_widget));
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *) &window);
g_object_unref (builder);
}
if (!gtk_widget_get_visible (window))
gtk_window_present (GTK_WINDOW (window));
else
gtk_window_destroy (GTK_WINDOW (window));
return window;
}

View File

@@ -1,38 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<object class="GtkWindow" id="window">
<property name="title" translatable="yes">Text along a Path</property>
<child type="titlebar">
<object class="GtkHeaderBar">
<child type="end">
<object class="GtkToggleButton" id="edit-toggle">
<property name="icon-name">document-edit-symbolic</property>
</object>
</child>
</object>
</child>
<child>
<object class="GtkBox">
<property name="orientation">vertical</property>
<child>
<object class="GtkRevealer">
<property name="reveal-child" bind-source="edit-toggle" bind-property="active" bind-flags="sync-create"></property>
<child>
<object class="GtkEntry" id="text">
<property name="text">Through the looking glass</property>
</object>
</child>
</object>
</child>
<child>
<object class="GtkPathWidget" id="view">
<property name="editable" bind-source="edit-toggle" bind-property="active" bind-flags="sync-create"></property>
<property name="text" bind-source="text" bind-property="text" bind-flags="sync-create"></property>
<property name="hexpand">true</property>
<property name="vexpand">true</property>
</object>
</child>
</object>
</child>
</object>
</interface>

View File

@@ -189,7 +189,6 @@ do_pickers (GtkWidget *do_widget)
gtk_grid_attach (GTK_GRID (table), label, 0, 0, 1, 1); gtk_grid_attach (GTK_GRID (table), label, 0, 0, 1, 1);
picker = gtk_color_dialog_button_new (gtk_color_dialog_new ()); picker = gtk_color_dialog_button_new (gtk_color_dialog_new ());
gtk_label_set_mnemonic_widget (GTK_LABEL (label), picker);
gtk_grid_attach (GTK_GRID (table), picker, 1, 0, 1, 1); gtk_grid_attach (GTK_GRID (table), picker, 1, 0, 1, 1);
label = gtk_label_new ("Font:"); label = gtk_label_new ("Font:");
@@ -199,7 +198,6 @@ do_pickers (GtkWidget *do_widget)
gtk_grid_attach (GTK_GRID (table), label, 0, 1, 1, 1); gtk_grid_attach (GTK_GRID (table), label, 0, 1, 1, 1);
picker = gtk_font_dialog_button_new (gtk_font_dialog_new ()); picker = gtk_font_dialog_button_new (gtk_font_dialog_new ());
gtk_label_set_mnemonic_widget (GTK_LABEL (label), picker);
gtk_grid_attach (GTK_GRID (table), picker, 1, 1, 1, 1); gtk_grid_attach (GTK_GRID (table), picker, 1, 1, 1, 1);
label = gtk_label_new ("File:"); label = gtk_label_new ("File:");
@@ -210,9 +208,6 @@ do_pickers (GtkWidget *do_widget)
picker = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6); picker = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
button = gtk_button_new_from_icon_name ("document-open-symbolic"); button = gtk_button_new_from_icon_name ("document-open-symbolic");
gtk_accessible_update_property (GTK_ACCESSIBLE (button),
GTK_ACCESSIBLE_PROPERTY_LABEL, "Select File",
-1);
label = gtk_label_new ("None"); label = gtk_label_new ("None");
@@ -228,9 +223,6 @@ do_pickers (GtkWidget *do_widget)
gtk_box_append (GTK_BOX (picker), button); gtk_box_append (GTK_BOX (picker), button);
app_picker = gtk_button_new_from_icon_name ("emblem-system-symbolic"); app_picker = gtk_button_new_from_icon_name ("emblem-system-symbolic");
gtk_widget_set_halign (app_picker, GTK_ALIGN_END); gtk_widget_set_halign (app_picker, GTK_ALIGN_END);
gtk_accessible_update_property (GTK_ACCESSIBLE (app_picker),
GTK_ACCESSIBLE_PROPERTY_LABEL, "Open File",
-1);
gtk_widget_set_sensitive (app_picker, FALSE); gtk_widget_set_sensitive (app_picker, FALSE);
g_signal_connect (app_picker, "clicked", G_CALLBACK (open_app), NULL); g_signal_connect (app_picker, "clicked", G_CALLBACK (open_app), NULL);
gtk_box_append (GTK_BOX (picker), app_picker); gtk_box_append (GTK_BOX (picker), app_picker);
@@ -249,7 +241,7 @@ do_pickers (GtkWidget *do_widget)
} }
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
gtk_window_present (GTK_WINDOW (window)); gtk_widget_set_visible (window, TRUE);
else else
gtk_window_destroy (GTK_WINDOW (window)); gtk_window_destroy (GTK_WINDOW (window));

View File

@@ -6,6 +6,6 @@
* Also, when adding new style properties, please add them here. * Also, when adding new style properties, please add them here.
*/ */
window.demo * { * {
all: unset; all: unset;
} }

View File

@@ -188,20 +188,10 @@ do_spinbutton (GtkWidget *do_widget)
if (!window) if (!window)
{ {
GtkBuilder *builder; GtkBuilder *builder;
GtkBuilderScope *scope;
GtkAdjustment *adj; GtkAdjustment *adj;
GtkWidget *label; GtkWidget *label;
scope = gtk_builder_cscope_new (); builder = gtk_builder_new_from_resource ("/spinbutton/spinbutton.ui");
builder = gtk_builder_new ();
gtk_builder_cscope_add_callback (GTK_BUILDER_CSCOPE (scope), spinbutton_hex_spin_input);
gtk_builder_cscope_add_callback (GTK_BUILDER_CSCOPE (scope), spinbutton_hex_spin_output);
gtk_builder_cscope_add_callback (GTK_BUILDER_CSCOPE (scope), spinbutton_time_spin_input);
gtk_builder_cscope_add_callback (GTK_BUILDER_CSCOPE (scope), spinbutton_time_spin_output);
gtk_builder_cscope_add_callback (GTK_BUILDER_CSCOPE (scope), spinbutton_month_spin_input);
gtk_builder_cscope_add_callback (GTK_BUILDER_CSCOPE (scope), spinbutton_month_spin_output);
gtk_builder_set_scope (builder, scope);
gtk_builder_add_from_resource (builder, "/spinbutton/spinbutton.ui", NULL);
window = GTK_WIDGET (gtk_builder_get_object (builder, "window")); window = GTK_WIDGET (gtk_builder_get_object (builder, "window"));
gtk_window_set_display (GTK_WINDOW (window), gtk_window_set_display (GTK_WINDOW (window),
gtk_widget_get_display (do_widget)); gtk_widget_get_display (do_widget));
@@ -243,7 +233,6 @@ do_spinbutton (GtkWidget *do_widget)
NULL, NULL); NULL, NULL);
g_object_unref (builder); g_object_unref (builder);
g_object_unref (scope);
} }
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))

View File

@@ -27,6 +27,7 @@ GtkWidget *
do_spinner (GtkWidget *do_widget) do_spinner (GtkWidget *do_widget)
{ {
static GtkWidget *window = NULL; static GtkWidget *window = NULL;
GtkWidget *content_area;
GtkWidget *vbox; GtkWidget *vbox;
GtkWidget *hbox; GtkWidget *hbox;
GtkWidget *button; GtkWidget *button;
@@ -34,19 +35,28 @@ do_spinner (GtkWidget *do_widget)
if (!window) if (!window)
{ {
window = gtk_window_new (); G_GNUC_BEGIN_IGNORE_DEPRECATIONS
gtk_window_set_transient_for (GTK_WINDOW (window), GTK_WINDOW (do_widget)); window = gtk_dialog_new_with_buttons ("Spinner",
gtk_window_set_title (GTK_WINDOW (window), "Spinner"); GTK_WINDOW (do_widget),
0,
_("_Close"),
GTK_RESPONSE_NONE,
NULL);
gtk_window_set_resizable (GTK_WINDOW (window), FALSE); gtk_window_set_resizable (GTK_WINDOW (window), FALSE);
g_signal_connect (window, "response",
G_CALLBACK (gtk_window_destroy), NULL);
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window); g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10); content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
gtk_widget_set_margin_top (vbox, 5); G_GNUC_END_IGNORE_DEPRECATIONS
gtk_widget_set_margin_bottom (vbox, 5);
vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
gtk_widget_set_margin_start (vbox, 5); gtk_widget_set_margin_start (vbox, 5);
gtk_widget_set_margin_end (vbox, 5); gtk_widget_set_margin_end (vbox, 5);
gtk_widget_set_margin_top (vbox, 5);
gtk_window_set_child (GTK_WINDOW (window), vbox); gtk_widget_set_margin_bottom (vbox, 5);
gtk_box_append (GTK_BOX (content_area), vbox);
/* Sensitive */ /* Sensitive */
hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5); hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);

View File

@@ -801,7 +801,7 @@ suggestion_entry_key_pressed (GtkEventControllerKey *controller,
selected = matches - 1; selected = matches - 1;
} }
gtk_list_view_scroll_to (GTK_LIST_VIEW (self->list), selected, GTK_LIST_SCROLL_SELECT, NULL); gtk_single_selection_set_selected (self->selection, selected);
return TRUE; return TRUE;
} }

View File

@@ -150,36 +150,20 @@ do_video_player (GtkWidget *do_widget)
button = gtk_button_new (); button = gtk_button_new ();
image = gtk_image_new_from_resource ("/cursors/images/gtk_logo_cursor.png"); image = gtk_image_new_from_resource ("/cursors/images/gtk_logo_cursor.png");
gtk_accessible_update_relation (GTK_ACCESSIBLE (image),
GTK_ACCESSIBLE_RELATION_LABELLED_BY, button, NULL,
-1);
gtk_image_set_pixel_size (GTK_IMAGE (image), 24); gtk_image_set_pixel_size (GTK_IMAGE (image), 24);
gtk_button_set_child (GTK_BUTTON (button), image); gtk_button_set_child (GTK_BUTTON (button), image);
g_signal_connect (button, "clicked", G_CALLBACK (logo_clicked_cb), video); g_signal_connect (button, "clicked", G_CALLBACK (logo_clicked_cb), video);
gtk_accessible_update_property (GTK_ACCESSIBLE (button),
GTK_ACCESSIBLE_PROPERTY_LABEL, "GTK Logo",
-1);
gtk_header_bar_pack_start (GTK_HEADER_BAR (title), button); gtk_header_bar_pack_start (GTK_HEADER_BAR (title), button);
button = gtk_button_new (); button = gtk_button_new ();
image = gtk_image_new_from_resource ("/video-player/bbb.png"); image = gtk_image_new_from_resource ("/video-player/bbb.png");
gtk_accessible_update_relation (GTK_ACCESSIBLE (image),
GTK_ACCESSIBLE_RELATION_LABELLED_BY, button, NULL,
-1);
gtk_image_set_pixel_size (GTK_IMAGE (image), 24); gtk_image_set_pixel_size (GTK_IMAGE (image), 24);
gtk_button_set_child (GTK_BUTTON (button), image); gtk_button_set_child (GTK_BUTTON (button), image);
g_signal_connect (button, "clicked", G_CALLBACK (bbb_clicked_cb), video); g_signal_connect (button, "clicked", G_CALLBACK (bbb_clicked_cb), video);
gtk_accessible_update_property (GTK_ACCESSIBLE (button),
GTK_ACCESSIBLE_PROPERTY_LABEL, "Big Buck Bunny",
-1);
gtk_header_bar_pack_start (GTK_HEADER_BAR (title), button); gtk_header_bar_pack_start (GTK_HEADER_BAR (title), button);
fullscreen_button = gtk_button_new_from_icon_name ("view-fullscreen-symbolic"); fullscreen_button = gtk_button_new_from_icon_name ("view-fullscreen-symbolic");
g_signal_connect (fullscreen_button, "clicked", G_CALLBACK (fullscreen_clicked_cb), NULL); g_signal_connect (fullscreen_button, "clicked", G_CALLBACK (fullscreen_clicked_cb), NULL);
gtk_accessible_update_property (GTK_ACCESSIBLE (fullscreen_button),
GTK_ACCESSIBLE_PROPERTY_LABEL, "Fullscreen",
-1);
gtk_header_bar_pack_end (GTK_HEADER_BAR (title), fullscreen_button); gtk_header_bar_pack_end (GTK_HEADER_BAR (title), fullscreen_button);
controller = gtk_shortcut_controller_new (); controller = gtk_shortcut_controller_new ();

View File

@@ -1701,13 +1701,6 @@ node_editor_window_init (NodeEditorWindow *self)
" }\n" " }\n"
" transform: translate(0, 140);\n" " transform: translate(0, 140);\n"
"}", -1); "}", -1);
if (g_getenv ("GSK_RENDERER"))
{
char *new_title = g_strdup_printf ("GTK Node Editor - %s", g_getenv ("GSK_RENDERER"));
gtk_window_set_title (GTK_WINDOW (self), new_title);
g_free (new_title);
}
} }
NodeEditorWindow * NodeEditorWindow *

View File

@@ -6,6 +6,8 @@
#include "demo_conf.h" #include "demo_conf.h"
G_GNUC_BEGIN_IGNORE_DEPRECATIONS
static GtkWidget *main_window; static GtkWidget *main_window;
static GFile *filename = NULL; static GFile *filename = NULL;
static GtkPageSetup *page_setup = NULL; static GtkPageSetup *page_setup = NULL;
@@ -41,7 +43,7 @@ update_statusbar (void)
GtkTextIter iter; GtkTextIter iter;
const char *print_str; const char *print_str;
gtk_label_set_label (GTK_LABEL (statusbar), ""); gtk_statusbar_pop (GTK_STATUSBAR (statusbar), 0);
gtk_text_buffer_get_iter_at_mark (buffer, gtk_text_buffer_get_iter_at_mark (buffer,
&iter, &iter,
@@ -59,10 +61,10 @@ update_statusbar (void)
msg = g_strdup_printf ("%d, %d%s %s", msg = g_strdup_printf ("%d, %d%s %s",
row, col, row, col,
file_changed?" - Modified":"", file_changed?" - Modified":"",
print_str); print_str);
gtk_label_set_label (GTK_LABEL (statusbar), msg); gtk_statusbar_push (GTK_STATUSBAR (statusbar), 0, msg);
g_free (msg); g_free (msg);
} }
@@ -825,12 +827,7 @@ activate (GApplication *app)
contents); contents);
/* Create statusbar */ /* Create statusbar */
statusbar = gtk_label_new (""); statusbar = gtk_statusbar_new ();
gtk_label_set_xalign (GTK_LABEL (statusbar), 0);
gtk_widget_set_margin_start (statusbar, 2);
gtk_widget_set_margin_end (statusbar, 2);
gtk_widget_set_margin_top (statusbar, 2);
gtk_widget_set_margin_bottom (statusbar, 2);
gtk_box_append (GTK_BOX (box), statusbar); gtk_box_append (GTK_BOX (box), statusbar);
/* Show text widget info in the statusbar */ /* Show text widget info in the statusbar */

View File

@@ -1,6 +1,16 @@
# demos/widget-factory # demos/widget-factory
if can_use_objcopy_for_resources objcopy_supports_add_symbol = false
objcopy = find_program('objcopy', required : false)
if objcopy.found()
objcopy_supports_add_symbol = run_command(objcopy, '--help', check: false).stdout().contains('--add-symbol')
endif
ld = find_program('ld', required : false)
if not meson.is_cross_build() and build_machine.cpu_family() != 'arm' and build_machine.system() == 'linux' and objcopy.found() and objcopy_supports_add_symbol and ld.found()
glib_compile_resources = find_program('glib-compile-resources')
# Create the resource blob # Create the resource blob
widgetfactory_gresource = custom_target('widgetfactory.gresource', widgetfactory_gresource = custom_target('widgetfactory.gresource',
input : 'widget-factory.gresource.xml', input : 'widget-factory.gresource.xml',

View File

@@ -1210,12 +1210,12 @@ typedef struct {
static void static void
add_background (GtkWidget *flowbox, add_background (GtkWidget *flowbox,
const char *filename, const char *filename,
GdkTexture *texture, GdkPixbuf *pixbuf,
gboolean is_resource) gboolean is_resource)
{ {
GtkWidget *child; GtkWidget *child;
child = gtk_picture_new_for_paintable (GDK_PAINTABLE (texture)); child = gtk_picture_new_for_pixbuf (pixbuf);
gtk_widget_set_size_request (child, 110, 70); gtk_widget_set_size_request (child, 110, 70);
gtk_flow_box_insert (GTK_FLOW_BOX (flowbox), child, -1); gtk_flow_box_insert (GTK_FLOW_BOX (flowbox), child, -1);
child = gtk_widget_get_parent (child); child = gtk_widget_get_parent (child);
@@ -1231,7 +1231,6 @@ background_loaded_cb (GObject *source,
{ {
BackgroundData *bd = data; BackgroundData *bd = data;
GdkPixbuf *pixbuf; GdkPixbuf *pixbuf;
GdkTexture *texture;
GError *error = NULL; GError *error = NULL;
pixbuf = gdk_pixbuf_new_from_stream_finish (res, &error); pixbuf = gdk_pixbuf_new_from_stream_finish (res, &error);
@@ -1242,11 +1241,8 @@ background_loaded_cb (GObject *source,
return; return;
} }
texture = gdk_texture_new_for_pixbuf (pixbuf); add_background (bd->flowbox, bd->filename, pixbuf, FALSE);
add_background (bd->flowbox, bd->filename, texture, FALSE);
g_object_unref (texture);
g_object_unref (pixbuf);
g_free (bd->filename); g_free (bd->filename);
g_free (bd); g_free (bd);
} }
@@ -1263,10 +1259,7 @@ populate_flowbox (GtkWidget *flowbox)
GInputStream *stream; GInputStream *stream;
BackgroundData *bd; BackgroundData *bd;
GdkPixbuf *pixbuf; GdkPixbuf *pixbuf;
GdkTexture *texture;
GtkWidget *child; GtkWidget *child;
guchar *data;
GBytes *bytes;
int i; int i;
const char *resources[] = { const char *resources[] = {
"sunset.jpg", "portland-rose.jpg", "beach.jpg", "nyc.jpg" "sunset.jpg", "portland-rose.jpg", "beach.jpg", "nyc.jpg"
@@ -1277,14 +1270,9 @@ populate_flowbox (GtkWidget *flowbox)
g_object_set_data (G_OBJECT (flowbox), "populated", GUINT_TO_POINTER (1)); g_object_set_data (G_OBJECT (flowbox), "populated", GUINT_TO_POINTER (1));
data = g_malloc (4 * 110 * 70); pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, FALSE, 8, 110, 70);
memset (data, 0xff, 4 * 110 * 70); gdk_pixbuf_fill (pixbuf, 0xffffffff);
bytes = g_bytes_new_take (data, 4 * 110 * 70); child = gtk_picture_new_for_pixbuf (pixbuf);
texture = gdk_memory_texture_new (110, 70, GDK_MEMORY_DEFAULT, bytes, 4 * 110);
child = gtk_picture_new_for_paintable (GDK_PAINTABLE (texture));
g_object_unref (texture);
g_bytes_unref (bytes);
gtk_widget_add_css_class (child, "frame"); gtk_widget_add_css_class (child, "frame");
gtk_flow_box_insert (GTK_FLOW_BOX (flowbox), child, -1); gtk_flow_box_insert (GTK_FLOW_BOX (flowbox), child, -1);
@@ -1292,10 +1280,7 @@ populate_flowbox (GtkWidget *flowbox)
{ {
filename = g_strconcat ("/org/gtk/WidgetFactory4/", resources[i], NULL); filename = g_strconcat ("/org/gtk/WidgetFactory4/", resources[i], NULL);
pixbuf = gdk_pixbuf_new_from_resource_at_scale (filename, 110, 110, TRUE, NULL); pixbuf = gdk_pixbuf_new_from_resource_at_scale (filename, 110, 110, TRUE, NULL);
texture = gdk_texture_new_for_pixbuf (pixbuf); add_background (flowbox, filename, pixbuf, TRUE);
add_background (flowbox, filename, texture, TRUE);
g_object_unref (texture);
g_object_unref (pixbuf);
} }
location = "/usr/share/backgrounds/gnome"; location = "/usr/share/backgrounds/gnome";

View File

@@ -1572,9 +1572,6 @@ Suspendisse feugiat quam quis dolor accumsan cursus.</property>
<property name="valign">3</property> <property name="valign">3</property>
<child> <child>
<object class="GtkVolumeButton"> <object class="GtkVolumeButton">
<accessibility>
<property name="label" translatable="1">Volume</property>
</accessibility>
<property name="orientation">1</property> <property name="orientation">1</property>
<property name="valign">3</property> <property name="valign">3</property>
<property name="value">.5</property> <property name="value">.5</property>
@@ -1587,9 +1584,6 @@ Suspendisse feugiat quam quis dolor accumsan cursus.</property>
</child> </child>
<child> <child>
<object class="GtkScaleButton" id="mic-button"> <object class="GtkScaleButton" id="mic-button">
<accessibility>
<property name="label" translatable="1">Microphone gain</property>
</accessibility>
<property name="has-tooltip">1</property> <property name="has-tooltip">1</property>
<property name="icons">microphone-sensitivity-muted-symbolic <property name="icons">microphone-sensitivity-muted-symbolic
microphone-sensitivity-high-symbolic microphone-sensitivity-high-symbolic
@@ -2250,24 +2244,20 @@ microphone-sensitivity-medium-symbolic</property>
<child> <child>
<object class="GtkBox"> <object class="GtkBox">
<property name="spacing">6</property> <property name="spacing">6</property>
<property name="valign">center</property>
<child> <child>
<object class="GtkBox" id="lockbox"> <object class="GtkBox" id="lockbox">
<property name="hexpand">1</property> <property name="hexpand">1</property>
<property name="spacing">6</property> <property name="spacing">6</property>
<property name="valign">center</property>
<child> <child>
<object class="GtkMenuButton" id="open_menubutton"> <object class="GtkMenuButton" id="open_menubutton">
<property name="halign">3</property> <property name="halign">3</property>
<property name="popover">open_popover</property> <property name="popover">open_popover</property>
<property name="label">Open</property> <property name="label">Open</property>
<property name="valign">center</property>
</object> </object>
</child> </child>
<child> <child>
<object class="GtkToggleButton" id="record_button"> <object class="GtkToggleButton" id="record_button">
<property name="halign">3</property> <property name="halign">3</property>
<property name="valign">center</property>
<signal name="toggled" handler="on_record_button_toggled"/> <signal name="toggled" handler="on_record_button_toggled"/>
<style> <style>
<class name="text-button"/> <class name="text-button"/>
@@ -2277,19 +2267,16 @@ microphone-sensitivity-medium-symbolic</property>
<child> <child>
<object class="GtkBox"> <object class="GtkBox">
<property name="spacing">6</property> <property name="spacing">6</property>
<property name="valign">center</property>
<child> <child>
<object class="GtkImage"> <object class="GtkImage">
<property name="valign">4</property> <property name="valign">4</property>
<property name="icon-name">media-record-symbolic</property> <property name="icon-name">media-record-symbolic</property>
<property name="valign">center</property>
</object> </object>
</child> </child>
<child> <child>
<object class="GtkLabel"> <object class="GtkLabel">
<property name="valign">4</property> <property name="valign">4</property>
<property name="label">Record</property> <property name="label">Record</property>
<property name="valign">center</property>
</object> </object>
</child> </child>
</object> </object>
@@ -2298,7 +2285,6 @@ microphone-sensitivity-medium-symbolic</property>
</child> </child>
<child> <child>
<object class="GtkBox"> <object class="GtkBox">
<property name="valign">center</property>
<style> <style>
<class name="linked"/> <class name="linked"/>
</style> </style>
@@ -2306,14 +2292,12 @@ microphone-sensitivity-medium-symbolic</property>
<object class="GtkToggleButton" id="grid_button"> <object class="GtkToggleButton" id="grid_button">
<property name="active">1</property> <property name="active">1</property>
<property name="icon-name">view-grid-symbolic</property> <property name="icon-name">view-grid-symbolic</property>
<property name="valign">center</property>
</object> </object>
</child> </child>
<child> <child>
<object class="GtkToggleButton" id="list_button"> <object class="GtkToggleButton" id="list_button">
<property name="group">grid_button</property> <property name="group">grid_button</property>
<property name="icon-name">view-list-symbolic</property> <property name="icon-name">view-list-symbolic</property>
<property name="valign">center</property>
</object> </object>
</child> </child>
</object> </object>
@@ -2321,7 +2305,6 @@ microphone-sensitivity-medium-symbolic</property>
<child> <child>
<object class="GtkButton" id="circular_button"> <object class="GtkButton" id="circular_button">
<property name="icon-name">emblem-system-symbolic</property> <property name="icon-name">emblem-system-symbolic</property>
<property name="valign">center</property>
<style> <style>
<class name="circular"/> <class name="circular"/>
</style> </style>
@@ -2330,15 +2313,12 @@ microphone-sensitivity-medium-symbolic</property>
</object> </object>
</child> </child>
<child> <child>
<object class="GtkLockButton" id="lockbutton"> <object class="GtkLockButton" id="lockbutton"/>
<property name="valign">center</property>
</object>
</child> </child>
<child> <child>
<object class="GtkMenuButton"> <object class="GtkMenuButton">
<property name="icon-name">view-more-symbolic</property> <property name="icon-name">view-more-symbolic</property>
<property name="menu-model">new_style_menu_model</property> <property name="menu-model">new_style_menu_model</property>
<property name="valign">center</property>
</object> </object>
</child> </child>
</object> </object>

View File

@@ -5,6 +5,16 @@ How to do a GTK release?
Make sure you have suitable versions of Meson and Ninja. Make sure you have suitable versions of Meson and Ninja.
Also make sure you have the following packages installed with all their
dependencies:
* gtk-doc
* docbook-utils
Without those packages make distcheck will *not* pass.
Make sure that gtk-doc is the latest released version.
## Release check list ## Release check list
0. Save all your work, then move to the branch from which you want 0. Save all your work, then move to the branch from which you want
@@ -18,8 +28,8 @@ $ git clean -dfx
1. Build using the common sequence: 1. Build using the common sequence:
```sh ```sh
$ meson setup _build $ meson _build .
$ meson compile -C _build $ ninja -C _build
``` ```
2. Update NEWS based on the content of git log; follow the format of prior 2. Update NEWS based on the content of git log; follow the format of prior
@@ -30,10 +40,11 @@ $ meson compile -C _build
writers, committers, etc. Anybody who is mentioned in the commit log writers, committers, etc. Anybody who is mentioned in the commit log
gets a credit, but only real names, not email addresses or nicknames. gets a credit, but only real names, not email addresses or nicknames.
3. Update the pot file and commit the changes: 3. Update the pot files and commit the changes:
```sh ```sh
$ ninja -C _build gtk40-pot $ ninja -C _build gtk40-pot
$ ninja -C _build gtk40-properties-pot
``` ```
4. If this is a major, stable, release, verify that the release notes 4. If this is a major, stable, release, verify that the release notes
@@ -61,7 +72,7 @@ $ ninja -C _build gtk40-pot
Make sure that all new symbols have proper Since: tags, and that there Make sure that all new symbols have proper Since: tags, and that there
is an index in the main `-docs.xml` for the next stable version. is an index in the main `-docs.xml` for the next stable version.
8. Run `meson dist -C_build` to generate the tarball. 8. Run `ninja dist` to generate the tarball.
9. Fix broken stuff found by 8), commit changes, repeat. 9. Fix broken stuff found by 8), commit changes, repeat.
@@ -83,8 +94,7 @@ $ ninja -C _build gtk40-pot
$ git tag -m "GTK 4.2.0" 4.2.0 $ git tag -m "GTK 4.2.0" 4.2.0
``` ```
13. Bump the version number in `meson.build`, and add a section for the next 13. Bump the version number in `meson.build` and commit the change.
release in NEWS and commit the change.
14. Push the changes upstream, and push the tag as well. The git command for 14. Push the changes upstream, and push the tag as well. The git command for
doing that is: doing that is:
@@ -101,8 +111,7 @@ $ git push origin 4.2.0
```sh ```sh
$ scp gtk-4.2.0.tar.xz matthiasc@master.gnome.org: $ scp gtk-4.2.0.tar.xz matthiasc@master.gnome.org:
$ ssh matthiasc@master.gnome.org $ ssh matthiasc@master.gnome.org ftpadmin install gtk-4.2.0.tar.xz
$ ftpadmin install gtk-4.2.0.tar.xz
``` ```
16. Go to the gnome-announce list archives, find the last announce message, 16. Go to the gnome-announce list archives, find the last announce message,

View File

@@ -1,7 +1,7 @@
expand_content_md_files = [ expand_content_md_files = [
] ]
if get_option('documentation') if get_option('gtk_doc')
gdk4_toml = configure_file( gdk4_toml = configure_file(
input: 'gdk4.toml.in', input: 'gdk4.toml.in',
output: 'gdk4.toml', output: 'gdk4.toml',

View File

@@ -1,4 +1,4 @@
if get_option('documentation') if get_option('gtk_doc')
gsk4_toml = configure_file( gsk4_toml = configure_file(
input: 'gsk4.toml.in', input: 'gsk4.toml.in',
output: 'gsk4.toml', output: 'gsk4.toml',

View File

@@ -220,6 +220,6 @@ clipboard.cut, clipboard.copy, clipboard.paste
selection.delete, selection.select-all selection.delete, selection.select-all
: Selection operations on entries, text view and labels : Selection operations on entries, text view and labels
color.select, color.customize color.select, color.customize:
: Operate on colors in a `GtkColorChooserWidget`. These actions are : Operate on colors in a `GtkColorChooserWidget`. These actions are
unusual in that they have the non-trivial parameter type (dddd). unusual in that they have the non-trivial parameter type (dddd):

View File

@@ -268,7 +268,7 @@ support in the file chooser.
This option controls whether GTK should use colord for color This option controls whether GTK should use colord for color
calibration support in the cups print backend. calibration support in the cups print backend.
### `documentation`, `man-pages` and `screenshots` ### `gtk_doc`, `man-pages` and `update_screenshots`
The *gi-docgen* package is used to generate the reference documentation The *gi-docgen* package is used to generate the reference documentation
included with GTK. By default support for *gi-docgen* is disabled included with GTK. By default support for *gi-docgen* is disabled

View File

@@ -23,7 +23,7 @@ When it comes to rendering, GTK follows the CSS box model as far as practical.
The CSS stylesheet that is in use determines the sizes (and appearance) of the The CSS stylesheet that is in use determines the sizes (and appearance) of the
margin, border and padding areas for each widget. The size of the content area margin, border and padding areas for each widget. The size of the content area
is determined by GTKs layout algorithm using each widgets [vfunc@Gtk.Widget.measure] is determined by GTKs layout algorithm using each widgets [vfunc@Gtk.Widget.measure]
and [vfunc@Gtk.Widget.size_allocate] vfuncs. and [vfunc@Gtk.Widget.size_allocate] vfuncs.
You can learn more about the CSS box model by reading the You can learn more about the CSS box model by reading the
@@ -37,11 +37,11 @@ To learn more about where GTK CSS differs from CSS on the web, see the
The content area in the CSS box model is the region that the widget considers its own. The content area in the CSS box model is the region that the widget considers its own.
The origin of the widgets coordinate system is the top left corner of the content area, The origin of the widgets coordinate system is the top left corner of the content area,
and its size is the widgets size. The size can be queried with [method@Gtk.Widget.get_width] and its size is the widgets size. The size can be queried with [method@Gtk.Widget.get_width]
and [method@Gtk.Widget.get_height]. GTK allows general 3D transformations to position and [method@Gtk.Widget.get_height]. GTK allows general 3D transformations to position
widgets (although most of the time, the transformation will be a simple 2D translation). widgets (although most of the time, the transformation will be a simple 2D translation).
The transform to go from one widgets coordinate system to another one can be obtained The transform to go from one widgets coordinate system to another one can be obtained
with [method@Gtk.Widget.compute_transform]. with [method@Gtk.Widget.compute_transform].
In addition to a size, widgets can optionally have a **_baseline_** to position text on. In addition to a size, widgets can optionally have a **_baseline_** to position text on.
@@ -55,8 +55,8 @@ or [method@Gtk.Widget.compute_bounds]. These methods can fail (either because th
don't share a common ancestor, or because of a singular transformation), and callers need don't share a common ancestor, or because of a singular transformation), and callers need
to handle this eventuality. to handle this eventuality.
Another area that is occasionally relevant are the widgets **_bounds_**, which is the area Another area that is occasionally relevant are the widgets **_bounds_**, which is the area
that a widgets rendering is typically confined to (technically, widgets can draw outside that a widgets rendering is typically confined to (technically, widgets can draw outside
of this area, unless clipping is enforced via the [property@Gtk.Widget:overflow] property). of this area, unless clipping is enforced via the [property@Gtk.Widget:overflow] property).
In CSS terms, the bounds of a widget correspond to the border area. In CSS terms, the bounds of a widget correspond to the border area.

View File

@@ -68,7 +68,7 @@ in a selector, widget names must be prefixed with a &num; character.
| E:focus-within | [CSS Selector Level 4](https://drafts.csswg.org/selectors/#focus-within-pseudo) | Set on all ancestors of the focus widget, unlike CSS | | E:focus-within | [CSS Selector Level 4](https://drafts.csswg.org/selectors/#focus-within-pseudo) | Set on all ancestors of the focus widget, unlike CSS |
| E:focus-visible | [CSS Selector Level 4](https://drafts.csswg.org/selectors/#focus-within-pseudo) | Set on focus widget and all ancestors, unlike CSS | | E:focus-visible | [CSS Selector Level 4](https://drafts.csswg.org/selectors/#focus-within-pseudo) | Set on focus widget and all ancestors, unlike CSS |
| E:disabled | [CSS Selector Level 3](https://www.w3.org/TR/css3-selectors/#UIstates) | Corresponds to GTK_STATE_FLAG_INSENSITIVE | | E:disabled | [CSS Selector Level 3](https://www.w3.org/TR/css3-selectors/#UIstates) | Corresponds to GTK_STATE_FLAG_INSENSITIVE |
| E:checked | [CSS Selector Level 3](https://www.w3.org/TR/css3-selectors/#UIstates) | Corresponds to GTK_STATE_FLAG_CHECKED | | E:disabled | [CSS Selector Level 3](https://www.w3.org/TR/css3-selectors/#UIstates) | Corresponds to GTK_STATE_FLAG_CHECKED |
| E:indeterminate | [CSS Selector Level 3](https://www.w3.org/TR/css3-selectors/#indeterminate) | Corresponds to GTK_STATE_FLAG_INCONSISTENT | | E:indeterminate | [CSS Selector Level 3](https://www.w3.org/TR/css3-selectors/#indeterminate) | Corresponds to GTK_STATE_FLAG_INCONSISTENT |
| E:backdrop, E:selected | | Corresponds to GTK_STATE_FLAG_BACKDROP, GTK_STATE_FLAG_SELECTED | | E:backdrop, E:selected | | Corresponds to GTK_STATE_FLAG_BACKDROP, GTK_STATE_FLAG_SELECTED |
| E:not(selector) | [CSS Selector Level 3](https://www.w3.org/TR/css3-selectors/#negation) | | | E:not(selector) | [CSS Selector Level 3](https://www.w3.org/TR/css3-selectors/#negation) | |

View File

@@ -89,11 +89,11 @@ using `gtk_application_new()`.
When creating a [class@Gtk.Application], you need to pick an application When creating a [class@Gtk.Application], you need to pick an application
identifier (a name) and pass it to [ctor@Gtk.Application.new] as parameter. For identifier (a name) and pass it to [ctor@Gtk.Application.new] as parameter. For
this example `org.gtk.example` is used. For choosing an identifier for your this example `org.gtk.example` is used. For choosing an identifier for your
application, see [this guide](https://developer.gnome.org/documentation/tutorials/application-id.html). application, see [this guide](https://wiki.gnome.org/HowDoI/ChooseApplicationID).
Lastly, [ctor@Gtk.Application.new] takes `GApplicationFlags` as input Lastly, [ctor@Gtk.Application.new] takes `GApplicationFlags` as input
for your application, if your application would have special needs. for your application, if your application would have special needs.
Next the [activate signal](https://developer.gnome.org/documentation/tutorials/application.html) is Next the [activate signal](https://wiki.gnome.org/HowDoI/GtkApplication) is
connected to the activate() function above the `main()` function. The `activate` connected to the activate() function above the `main()` function. The `activate`
signal will be emitted when your application is launched with `g_application_run()` signal will be emitted when your application is launched with `g_application_run()`
on the line below. The `g_application_run()` call also takes as arguments the on the line below. The `g_application_run()` call also takes as arguments the

View File

@@ -16,7 +16,6 @@ SYNOPSIS
| **gtk4-builder-tool** enumerate [OPTIONS...] <FILE> | **gtk4-builder-tool** enumerate [OPTIONS...] <FILE>
| **gtk4-builder-tool** simplify [OPTIONS...] <FILE> | **gtk4-builder-tool** simplify [OPTIONS...] <FILE>
| **gtk4-builder-tool** preview [OPTIONS...] <FILE> | **gtk4-builder-tool** preview [OPTIONS...] <FILE>
| **gtk4-builder-tool** render [OPTIONS...] <FILE>
| **gtk4-builder-tool** screenshot [OPTIONS...] <FILE> | **gtk4-builder-tool** screenshot [OPTIONS...] <FILE>
DESCRIPTION DESCRIPTION
@@ -70,11 +69,12 @@ file to use.
Load style information from the given CSS file. Load style information from the given CSS file.
Render Screenshot
^^^^^^ ^^^^^^^^^^
The ``render`` command saves a rendering of the UI definition file as a png image The ``screenshot`` command saves a rendering of the UI definition file
or node file. The name of the file to write can be specified as a second FILE argument. as a png image or node file. The name of the file to write can be specified as
a second FILE argument.
This command accepts options to specify the ID of the toplevel object and a CSS This command accepts options to specify the ID of the toplevel object and a CSS
file to use. file to use.
@@ -96,11 +96,6 @@ file to use.
Overwrite an existing file. Overwrite an existing file.
Screenshot
^^^^^^^^^^
The ``screenshot`` command is an alias for ``render``.
Simplification Simplification
^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^

View File

@@ -1,47 +0,0 @@
.. _gtk4-rendernode-tool(1):
====================
gtk4-rendernode-tool
====================
-----------------------
GskRenderNode Utility
-----------------------
SYNOPSIS
--------
| **gtk4-rendernode-tool** <COMMAND> [OPTIONS...] <FILE>
|
| **gtk4-rendernode-tool** info [OPTIONS...] <FILE>
| **gtk4-rendernode-tool** show [OPTIONS...] <FILE>
| **gtk4-rendernode-tool** render [OPTIONS...] <FILE> [<FILE>]
DESCRIPTION
-----------
``gtk4-rendernode-tool`` can perform various operations on serialized rendernodes.
COMMANDS
--------
Information
^^^^^^^^^^^
The ``info`` command shows general information about the rendernode, such
as the number of nodes, and the depth of the tree.
Showing
^^^^^^^
The ``show`` command displays the rendernode.
Rendering
^^^^^^^^^
The ``render`` command saves a rendering of the rendernode as a png or tiff image.
The name of the file to write can be specified as a second FILE argument.
``--renderer=RENDERER``
Use the given renderer. Use ``--renderer=help`` to get a information
about poassible values for the ``RENDERER``.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.0 KiB

After

Width:  |  Height:  |  Size: 147 B

View File

@@ -78,7 +78,7 @@ ui_files = [
gtk_builder_tool = find_program('gtk4-builder-tool') gtk_builder_tool = find_program('gtk4-builder-tool')
if get_option('screenshots') if get_option('update_screenshots')
foreach ui_file: ui_files foreach ui_file: ui_files
png_file = ui_file.replace('.ui', '.png') png_file = ui_file.replace('.ui', '.png')
gtk_images += custom_target('@0@ from @1@'.format(png_file, ui_file), gtk_images += custom_target('@0@ from @1@'.format(png_file, ui_file),

View File

@@ -103,15 +103,14 @@ fields, but e.g. buttons can take the focus too.
Input widgets can be given the focus by clicking on them, but focus Input widgets can be given the focus by clicking on them, but focus
can also be moved around with certain key events (this is known as can also be moved around with certain key events (this is known as
“keyboard navigation”). “keyboard navigation”). GTK reserves the <kbd>Tab</kbd> key to move the focus
GTK reserves the <kbd>Tab</kbd> key to move the focus to the next location, to the next location, and <kbd>Shift</kbd>+<kbd>Tab</kbd> to move it back to the previous
and <kbd>Shift</kbd>+<kbd>Tab</kbd> to move it back to the previous one. one. In addition many containers allow “directional navigation” with
In addition many containers allow “directional navigation” with the arrow keys. the arrow keys.
Many widgets can be “activated” to trigger and action. Many widgets can be “activated” to trigger and action. E.g., you can
E.g., you can activate a button or switch by clicking on them, activate a button or switch by clicking on them, but you can also
but you can also activate them with the keyboard, activate them with the keyboard, by using the <kbd>Enter</kbd> or <kbd>␣</kbd> keys.
by using the <kbd>Enter</kbd> or <kbd>Space</kbd> keys.
Apart from keyboard navigation, activation and directly typing into Apart from keyboard navigation, activation and directly typing into
entries or text views, GTK widgets can use key events for activating entries or text views, GTK widgets can use key events for activating
@@ -122,17 +121,15 @@ GTK has traditionally supported different kinds of shortcuts:
- Accelerators are any other shortcuts that can be activated regardless - Accelerators are any other shortcuts that can be activated regardless
of where the focus is, and typically trigger global actions, such as of where the focus is, and typically trigger global actions, such as
<kbd>Ctrl</kbd>+<kbd>Q</kbd> to quit an application. Ctrl-Q to quit an application.
- Mnemonics are usually triggered using <kbd>Alt</kbd> - Mnemonics are usually triggered using Alt as a modifier for a letter.
as a modifier for a letter.
They are used in places where a label is associated with a control, They are used in places where a label is associated with a control,
and are indicated by underlining the letter in the label. As a special and are indicated by underlining the letter in the label. As a special
case, inside menus (i.e. inside `GtkPopoverMenu`), mnemonics can be case, inside menus (i.e. inside `GtkPopoverMenu`), mnemonics can be
triggered without the modifier. triggered without the modifier.
- Key bindings are specific to individual widgets, - Key bindings are specific to individual widgets, such as Ctrl-C or
such as <kbd>Ctrl</kbd>+<kbd>C</kbd> or <kbd>Ctrl</kbd>+<kbd>V</kbd> Ctrl-V in an entry copy to or paste from the clipboard. They are only
in an entry copy to or paste from the clipboard. triggered when the widget has focus.
They are only triggered when the widget has focus.
GTK handles accelerators and mnemonics in a global scope, during the GTK handles accelerators and mnemonics in a global scope, during the
capture phase, and key bindings locally, during the target phase. capture phase, and key bindings locally, during the target phase.
@@ -211,4 +208,4 @@ sequence, so setting the state on one does transfer the state to
the others. They also are mutually exclusive, within a widget the others. They also are mutually exclusive, within a widget
where may be only one gesture group claiming a given sequence. where may be only one gesture group claiming a given sequence.
If another gesture group claims later that same sequence, the If another gesture group claims later that same sequence, the
first group will deny the sequence. first group will deny the sequence:

View File

@@ -32,7 +32,7 @@ gtk_images = []
subdir('images') subdir('images')
if get_option('documentation') if get_option('gtk_doc')
gtk4_toml = configure_file( gtk4_toml = configure_file(
input: 'gtk4.toml.in', input: 'gtk4.toml.in',
output: 'gtk4.toml', output: 'gtk4.toml',
@@ -75,7 +75,6 @@ if get_option('man-pages') and rst2man.found()
[ 'gtk4-encode-symbolic-svg', '1', ], [ 'gtk4-encode-symbolic-svg', '1', ],
[ 'gtk4-launch', '1', ], [ 'gtk4-launch', '1', ],
[ 'gtk4-query-settings', '1', ], [ 'gtk4-query-settings', '1', ],
[ 'gtk4-rendernode-tool', '1' ],
[ 'gtk4-update-icon-cache', '1', ], [ 'gtk4-update-icon-cache', '1', ],
] ]

View File

@@ -133,9 +133,3 @@ The function gtk_widget_get_allocation() is also going away. It does not have a
replacement, but the previously mentioned alternatives can be used for it too. replacement, but the previously mentioned alternatives can be used for it too.
The function gtk_widget_get_allocated_baseline() has been renamed to [method@Gtk.Widget.get_baseline]. The function gtk_widget_get_allocated_baseline() has been renamed to [method@Gtk.Widget.get_baseline].
## Stop using GdkPixbuf
GTK is moving away from GdkPixbuf as the primary API for transporting image data, in favor
of GdkTexture. APIs that are accepting or returning GdkPixbufs are being replaced by equivalent
APIs using GdkTexture or GdkPaintable objects.

View File

@@ -73,6 +73,9 @@ A number of keys are influencing behavior instead of just logging:
`no-css-cache` `no-css-cache`
: Bypass caching for CSS style properties : Bypass caching for CSS style properties
`touchscreen`
: Pretend the pointer is a touchscreen device
`snapshot` `snapshot`
: Include debug render nodes in the generated snapshots : Include debug render nodes in the generated snapshots
@@ -205,12 +208,6 @@ A number of options affect behavior instead of logging:
`nograbs` `nograbs`
: Turn off all pointer and keyboard grabs : Turn off all pointer and keyboard grabs
`portals`
: Force the use of [portals](https://docs.flatpak.org/en/latest/portals.html)
`no-portals`
: Disable use of [portals](https://docs.flatpak.org/en/latest/portals.html)
`gl-disable` `gl-disable`
: Disable OpenGL support : Disable OpenGL support

View File

@@ -31,7 +31,7 @@ described by a set of *attributes*.
Roles define the taxonomy and semantics of a UI control to any assistive Roles define the taxonomy and semantics of a UI control to any assistive
technology application; for instance, a button will have a role of technology application; for instance, a button will have a role of
`GTK_ACCESSIBLE_ROLE_BUTTON`; an entry will have a role of `GTK_ACCESSIBLE_ROLE_BUTTON`; an entry will have a role of
`GTK_ACCESSIBLE_ROLE_TEXTBOX`; a check button will have a role of `GTK_ACCESSIBLE_ROLE_TEXTBOX`; a toggle button will have a role of
`GTK_ACCESSIBLE_ROLE_CHECKBOX`; etc. `GTK_ACCESSIBLE_ROLE_CHECKBOX`; etc.
Each role is part of the widget's instance, and **cannot** be changed over Each role is part of the widget's instance, and **cannot** be changed over
@@ -46,7 +46,6 @@ Each role name is part of the #GtkAccessibleRole enumeration.
| Role name | Description | Related GTK widget | | Role name | Description | Related GTK widget |
|-----------|-------------|--------------------| |-----------|-------------|--------------------|
| `APPLICATION` | An application window | [class@Gtk.Window] |
| `BUTTON` | A control that performs an action when pressed | [class@Gtk.Button], [class@Gtk.LinkButton], [class@Gtk.Expander] | | `BUTTON` | A control that performs an action when pressed | [class@Gtk.Button], [class@Gtk.LinkButton], [class@Gtk.Expander] |
| `CHECKBOX` | A control that has three possible value: `true`, `false`, or `undefined` | [class@Gtk.CheckButton] | | `CHECKBOX` | A control that has three possible value: `true`, `false`, or `undefined` | [class@Gtk.CheckButton] |
| `COMBOBOX` | A control that can be expanded to show a list of possible values to select | [class@Gtk.ComboBox] | | `COMBOBOX` | A control that can be expanded to show a list of possible values to select | [class@Gtk.ComboBox] |
@@ -79,6 +78,7 @@ Each role name is part of the #GtkAccessibleRole enumeration.
| `TAB_PANEL` | A page in a notebook or stack | [class@Gtk.Stack] | | `TAB_PANEL` | A page in a notebook or stack | [class@Gtk.Stack] |
| `TEXT_BOX` | A type of input that allows free-form text as its value. | [class@Gtk.Entry], [class@Gtk.PasswordEntry], [class@Gtk.TextView] | | `TEXT_BOX` | A type of input that allows free-form text as its value. | [class@Gtk.Entry], [class@Gtk.PasswordEntry], [class@Gtk.TextView] |
| `TREE_GRID` | A treeview-like columned list | [class@Gtk.ColumnView] | | `TREE_GRID` | A treeview-like columned list | [class@Gtk.ColumnView] |
| `WINDOW` | An application window | [class@Gtk.Window] |
| `...` | … | | `...` | … |
See the [WAI-ARIA](https://www.w3.org/WAI/PF/aria/appendices#quickref) list See the [WAI-ARIA](https://www.w3.org/WAI/PF/aria/appendices#quickref) list
@@ -204,27 +204,19 @@ you should ensure that:
readable and localised action performed when pressed; for instance "Copy", readable and localised action performed when pressed; for instance "Copy",
"Paste", "Add layer", or "Remove" "Paste", "Add layer", or "Remove"
GTK will try to fill in some information by using ancillary UI control properties, GTK will try to fill in some information by using ancillary UI control
for instance the accessible name will be taken from the label used by the UI control, properties, for instance the accessible label will be taken from the label or
or from its tooltip, if the `GTK_ACCESSIBLE_PROPERTY_LABEL` property or the placeholder text used by the UI control, or from its tooltip, if the
`GTK_ACCESSIBLE_RELATION_LABELLED_BY` relation are unset. Similary for the accessible `GTK_ACCESSIBLE_PROPERTY_LABEL` property or the `GTK_ACCESSIBLE_RELATION_LABELLED_BY`
description. Nevertheless, it is good practice and project hygiene to explicitly specify relation are unset. Nevertheless, it is good practice and project hygiene
the accessible properties, just like it's good practice to specify tooltips and style classes. to explicitly specify the accessible properties, just like it's good practice
to specify tooltips and style classes.
Application developers using GTK **should** ensure that their UI controls Application developers using GTK **should** ensure that their UI controls
are accessible as part of the development process. The GTK Inspector shows are accessible as part of the development process. When using `GtkBuilder`
the accessible attributes of each widget, and also provides an overlay that templates and UI definition files, GTK provides a validation tool that
can highlight accessibility issues. verifies that each UI element has a valid role and properties; this tool can
be used as part of the application's test suite to avoid regressions.
It is possible to set accessible attributes in UI files as well:
```xml
<object class="GtkButton" id="button1">
<accessibility>
<property name="label">Download</property>
<relation name="labelled-by">label1</relation>
</accessibility>
</object>
```
## Implementations ## Implementations
@@ -267,13 +259,6 @@ turn automatically any widget into a `GtkButton`; but if your widget behaves
like a button, using the %GTK_ACCESSIBLE_ROLE_BUTTON will allow any like a button, using the %GTK_ACCESSIBLE_ROLE_BUTTON will allow any
assistive technology to handle it like they would a `GtkButton`. assistive technology to handle it like they would a `GtkButton`.
For widgets that act as containers of other widgets, you should use
%GTK_ACCESSIBLE_ROLE_GROUP if the grouping of the children is semantic
in nature; for instance, the children of a [class@Gtk.HeaderBar] are
grouped together on the header of a window. For generic containers that
only impose a layout on their children, you should use
%GTK_ACCESSIBLE_ROLE_GENERIC instead.
### Attributes can both hide and enhance ### Attributes can both hide and enhance
Accessible attributes can be used to override the content of a UI element, Accessible attributes can be used to override the content of a UI element,
@@ -382,6 +367,3 @@ To allow changing the value via accessible technologies, you can export
actions. Since the accessibility interfaces only support actions actions. Since the accessibility interfaces only support actions
without parameters, you should provide actions such as `increase-value` without parameters, you should provide actions such as `increase-value`
and `decrease-value`. and `decrease-value`.
Since GTK 4.10, the best way to suppose changing the value is by implementing
the [iface@Gtk.AccessibleRange] interface.

View File

@@ -30,12 +30,12 @@ Views display data from a **_model_**. Models implement the [`iface@Gio.ListMode
interface and can be provided in a variety of ways: interface and can be provided in a variety of ways:
* List model implementations for many specific types of data already exist, for * List model implementations for many specific types of data already exist, for
example [`class@Gtk.DirectoryList`] or [`class@Gtk.StringList`]. example `GtkDirectoryList` or `GtkStringList`.
* There are generic list model implementations like [`class@Gio.ListStore`] that allow building * There are generic list model implementations like`GListStore` that allow building
lists of arbitrary objects. lists of arbitrary objects.
* Wrapping list models like [`class@Gtk.FilterListModel`] or [`class@Gtk.SortListModel`] * Wrapping list models like `GtkFilterListModel` or `GtkSortListModel`
modify, adapt or combine other models. modify, adapt or combine other models.
* Last but not least, developers are encouraged to create their own `GListModel` * Last but not least, developers are encouraged to create their own `GListModel`
@@ -133,8 +133,8 @@ tradeoffs of those and experiment with them.
GTK offers a wide variety of wrapping models which change or supplement an GTK offers a wide variety of wrapping models which change or supplement an
existing model (or models) in some way. But when it comes to storing your existing model (or models) in some way. But when it comes to storing your
actual data, there are only a few ready-made choices available: actual data, there are only a few ready-made choices available: [`class@Gio.ListStore`]
[`class@Gio.ListStore`], [`class@Gtk.StringList`], and [`class@Gtk.DirectoryList`]. and [`class@Gtk.StringList`].
`GListStore` is backed by a balanced tree and has performance characteristics `GListStore` is backed by a balanced tree and has performance characteristics
that are expected for that data structure. It works reasonably well for dataset that are expected for that data structure. It works reasonably well for dataset
@@ -147,10 +147,6 @@ that are expected for that data structure. `GtkStringList` is a good fit for any
place where you would otherwise use `char*[]` and works best if the dataset place where you would otherwise use `char*[]` and works best if the dataset
is not very dynamic. is not very dynamic.
`GtkDirectoryList` is a list model that wraps [`method@Gio.File.enumerate_children_async`].
It presents a `GListModel` and fills it asynchronously with the [`iface@Gio.File`]s
returned from that function.
If these models don't fit your use case or scalability requirements, you If these models don't fit your use case or scalability requirements, you
should make a custom `GListModel` implementation. It is a small interface and should make a custom `GListModel` implementation. It is a small interface and
not very hard to implement. not very hard to implement.
@@ -200,15 +196,6 @@ The _data table_ style of list is a high density table, similar in style to a
traditional treeview. Individual cells can be selectable and editable. Use traditional treeview. Individual cells can be selectable and editable. Use
the `.data-table` style class. the `.data-table` style class.
## Sections
List models can optionally group their items into **_sections_**, by implementing
the `GtkSectionModel` interface. `GtkListView` can
display headers for sections, by installing a separate **_header factory_**.
Many GTK list models support section inherently, or they pass through the
section of a model they are wrapping.
## Comparison to GtkTreeView ## Comparison to GtkTreeView
Developers familiar with `GtkTreeView` may wonder how this way of doing lists Developers familiar with `GtkTreeView` may wonder how this way of doing lists

View File

@@ -1,7 +1,7 @@
toml_conf = configuration_data() toml_conf = configuration_data()
toml_conf.set('version', meson.project_version()) toml_conf.set('version', meson.project_version())
gidocgen = find_program('gi-docgen', required: get_option('documentation'), native: true) gidocgen = find_program('gi-docgen', required: get_option('gtk_doc'), native: true)
gidocgen_common_args = [ gidocgen_common_args = [
'--quiet', '--quiet',
@@ -14,7 +14,7 @@ endif
docs_dir = gtk_datadir / 'doc' docs_dir = gtk_datadir / 'doc'
if get_option('documentation') and not build_gir if get_option('gtk_doc') and not build_gir
error('API reference requires introspection.') error('API reference requires introspection.')
endif endif

View File

@@ -15,78 +15,18 @@ struct _ExampleAppPrefs
G_DEFINE_TYPE (ExampleAppPrefs, example_app_prefs, GTK_TYPE_DIALOG) G_DEFINE_TYPE (ExampleAppPrefs, example_app_prefs, GTK_TYPE_DIALOG)
static gboolean
string_to_font_desc (GValue *value,
GVariant *variant,
gpointer user_data)
{
const char *s = g_variant_get_string (variant, NULL);
PangoFontDescription *desc;
desc = pango_font_description_from_string (s);
g_value_take_boxed (value, desc);
return TRUE;
}
static GVariant *
font_desc_to_string (const GValue *value,
const GVariantType *expected_type,
gpointer user_data)
{
PangoFontDescription *desc = g_value_get_boxed (value);
char *s = pango_font_description_to_string (desc);
return g_variant_new_take_string (s);
}
static gboolean
transition_to_pos (GValue *value,
GVariant *variant,
gpointer user_data)
{
const char *s = g_variant_get_string (variant, NULL);
if (strcmp (s, "none") == 0)
g_value_set_uint (value, 0);
else if (strcmp (s, "crossfade") == 0)
g_value_set_uint (value, 1);
else
g_value_set_uint (value, 2);
return TRUE;
}
static GVariant *
pos_to_transition (const GValue *value,
const GVariantType *expected_type,
gpointer user_data)
{
switch (g_value_get_uint (value))
{
case 0: return g_variant_new_string ("none");
case 1: return g_variant_new_string ("crossfade");
case 2: return g_variant_new_string ("slide-left-right");
default: g_assert_not_reached ();
}
}
static void static void
example_app_prefs_init (ExampleAppPrefs *prefs) example_app_prefs_init (ExampleAppPrefs *prefs)
{ {
gtk_widget_init_template (GTK_WIDGET (prefs)); gtk_widget_init_template (GTK_WIDGET (prefs));
prefs->settings = g_settings_new ("org.gtk.exampleapp"); prefs->settings = g_settings_new ("org.gtk.exampleapp");
g_settings_bind_with_mapping (prefs->settings, "font", g_settings_bind (prefs->settings, "font",
prefs->font, "font-desc", prefs->font, "font",
G_SETTINGS_BIND_DEFAULT, G_SETTINGS_BIND_DEFAULT);
string_to_font_desc, g_settings_bind (prefs->settings, "transition",
font_desc_to_string, prefs->transition, "active-id",
NULL, NULL); G_SETTINGS_BIND_DEFAULT);
g_settings_bind_with_mapping (prefs->settings, "transition",
prefs->transition, "selected",
G_SETTINGS_BIND_DEFAULT,
transition_to_pos,
pos_to_transition,
NULL, NULL);
} }
static void static void

View File

@@ -27,10 +27,7 @@
</object> </object>
</child> </child>
<child> <child>
<object class="GtkFontDialogButton" id="font"> <object class="GtkFontButton" id="font">
<property name="dialog">
<object class="GtkFontDialog"/>
</property>
<layout> <layout>
<property name="column">1</property> <property name="column">1</property>
<property name="row">0</property> <property name="row">0</property>
@@ -50,16 +47,12 @@
</object> </object>
</child> </child>
<child> <child>
<object class="GtkDropDown" id="transition"> <object class="GtkComboBoxText" id="transition">
<property name="model"> <items>
<object class="GtkStringList"> <item translatable="yes" id="none">None</item>
<items> <item translatable="yes" id="crossfade">Fade</item>
<item translatable="yes">None</item> <item translatable="yes" id="slide-left-right">Slide</item>
<item translatable="yes">Fade</item> </items>
<item translatable="yes">Slide</item>
</items>
</object>
</property>
<layout> <layout>
<property name="column">1</property> <property name="column">1</property>
<property name="row">1</property> <property name="row">1</property>

View File

@@ -15,78 +15,18 @@ struct _ExampleAppPrefs
G_DEFINE_TYPE (ExampleAppPrefs, example_app_prefs, GTK_TYPE_DIALOG) G_DEFINE_TYPE (ExampleAppPrefs, example_app_prefs, GTK_TYPE_DIALOG)
static gboolean
string_to_font_desc (GValue *value,
GVariant *variant,
gpointer user_data)
{
const char *s = g_variant_get_string (variant, NULL);
PangoFontDescription *desc;
desc = pango_font_description_from_string (s);
g_value_take_boxed (value, desc);
return TRUE;
}
static GVariant *
font_desc_to_string (const GValue *value,
const GVariantType *expected_type,
gpointer user_data)
{
PangoFontDescription *desc = g_value_get_boxed (value);
char *s = pango_font_description_to_string (desc);
return g_variant_new_take_string (s);
}
static gboolean
transition_to_pos (GValue *value,
GVariant *variant,
gpointer user_data)
{
const char *s = g_variant_get_string (variant, NULL);
if (strcmp (s, "none") == 0)
g_value_set_uint (value, 0);
else if (strcmp (s, "crossfade") == 0)
g_value_set_uint (value, 1);
else
g_value_set_uint (value, 2);
return TRUE;
}
static GVariant *
pos_to_transition (const GValue *value,
const GVariantType *expected_type,
gpointer user_data)
{
switch (g_value_get_uint (value))
{
case 0: return g_variant_new_string ("none");
case 1: return g_variant_new_string ("crossfade");
case 2: return g_variant_new_string ("slide-left-right");
default: g_assert_not_reached ();
}
}
static void static void
example_app_prefs_init (ExampleAppPrefs *prefs) example_app_prefs_init (ExampleAppPrefs *prefs)
{ {
gtk_widget_init_template (GTK_WIDGET (prefs)); gtk_widget_init_template (GTK_WIDGET (prefs));
prefs->settings = g_settings_new ("org.gtk.exampleapp"); prefs->settings = g_settings_new ("org.gtk.exampleapp");
g_settings_bind_with_mapping (prefs->settings, "font", g_settings_bind (prefs->settings, "font",
prefs->font, "font-desc", prefs->font, "font",
G_SETTINGS_BIND_DEFAULT, G_SETTINGS_BIND_DEFAULT);
string_to_font_desc, g_settings_bind (prefs->settings, "transition",
font_desc_to_string, prefs->transition, "active-id",
NULL, NULL); G_SETTINGS_BIND_DEFAULT);
g_settings_bind_with_mapping (prefs->settings, "transition",
prefs->transition, "selected",
G_SETTINGS_BIND_DEFAULT,
transition_to_pos,
pos_to_transition,
NULL, NULL);
} }
static void static void

View File

@@ -27,10 +27,7 @@
</object> </object>
</child> </child>
<child> <child>
<object class="GtkFontDialogButton" id="font"> <object class="GtkFontButton" id="font">
<property name="dialog">
<object class="GtkFontDialog"/>
</property>
<layout> <layout>
<property name="column">1</property> <property name="column">1</property>
<property name="row">0</property> <property name="row">0</property>
@@ -50,16 +47,12 @@
</object> </object>
</child> </child>
<child> <child>
<object class="GtkDropDown" id="transition"> <object class="GtkComboBoxText" id="transition">
<property name="model"> <items>
<object class="GtkStringList"> <item translatable="yes" id="none">None</item>
<items> <item translatable="yes" id="crossfade">Fade</item>
<item translatable="yes">None</item> <item translatable="yes" id="slide-left-right">Slide</item>
<item translatable="yes">Fade</item> </items>
<item translatable="yes">Slide</item>
</items>
</object>
</property>
<layout> <layout>
<property name="column">1</property> <property name="column">1</property>
<property name="row">1</property> <property name="row">1</property>

View File

@@ -15,78 +15,18 @@ struct _ExampleAppPrefs
G_DEFINE_TYPE (ExampleAppPrefs, example_app_prefs, GTK_TYPE_DIALOG) G_DEFINE_TYPE (ExampleAppPrefs, example_app_prefs, GTK_TYPE_DIALOG)
static gboolean
string_to_font_desc (GValue *value,
GVariant *variant,
gpointer user_data)
{
const char *s = g_variant_get_string (variant, NULL);
PangoFontDescription *desc;
desc = pango_font_description_from_string (s);
g_value_take_boxed (value, desc);
return TRUE;
}
static GVariant *
font_desc_to_string (const GValue *value,
const GVariantType *expected_type,
gpointer user_data)
{
PangoFontDescription *desc = g_value_get_boxed (value);
char *s = pango_font_description_to_string (desc);
return g_variant_new_take_string (s);
}
static gboolean
transition_to_pos (GValue *value,
GVariant *variant,
gpointer user_data)
{
const char *s = g_variant_get_string (variant, NULL);
if (strcmp (s, "none") == 0)
g_value_set_uint (value, 0);
else if (strcmp (s, "crossfade") == 0)
g_value_set_uint (value, 1);
else
g_value_set_uint (value, 2);
return TRUE;
}
static GVariant *
pos_to_transition (const GValue *value,
const GVariantType *expected_type,
gpointer user_data)
{
switch (g_value_get_uint (value))
{
case 0: return g_variant_new_string ("none");
case 1: return g_variant_new_string ("crossfade");
case 2: return g_variant_new_string ("slide-left-right");
default: g_assert_not_reached ();
}
}
static void static void
example_app_prefs_init (ExampleAppPrefs *prefs) example_app_prefs_init (ExampleAppPrefs *prefs)
{ {
gtk_widget_init_template (GTK_WIDGET (prefs)); gtk_widget_init_template (GTK_WIDGET (prefs));
prefs->settings = g_settings_new ("org.gtk.exampleapp"); prefs->settings = g_settings_new ("org.gtk.exampleapp");
g_settings_bind_with_mapping (prefs->settings, "font", g_settings_bind (prefs->settings, "font",
prefs->font, "font-desc", prefs->font, "font",
G_SETTINGS_BIND_DEFAULT, G_SETTINGS_BIND_DEFAULT);
string_to_font_desc, g_settings_bind (prefs->settings, "transition",
font_desc_to_string, prefs->transition, "active-id",
NULL, NULL); G_SETTINGS_BIND_DEFAULT);
g_settings_bind_with_mapping (prefs->settings, "transition",
prefs->transition, "selected",
G_SETTINGS_BIND_DEFAULT,
transition_to_pos,
pos_to_transition,
NULL, NULL);
} }
static void static void

View File

@@ -27,10 +27,7 @@
</object> </object>
</child> </child>
<child> <child>
<object class="GtkFontDialogButton" id="font"> <object class="GtkFontButton" id="font">
<property name="dialog">
<object class="GtkFontDialog"/>
</property>
<layout> <layout>
<property name="column">1</property> <property name="column">1</property>
<property name="row">0</property> <property name="row">0</property>
@@ -50,16 +47,12 @@
</object> </object>
</child> </child>
<child> <child>
<object class="GtkDropDown" id="transition"> <object class="GtkComboBoxText" id="transition">
<property name="model"> <items>
<object class="GtkStringList"> <item translatable="yes" id="none">None</item>
<items> <item translatable="yes" id="crossfade">Fade</item>
<item translatable="yes">None</item> <item translatable="yes" id="slide-left-right">Slide</item>
<item translatable="yes">Fade</item> </items>
<item translatable="yes">Slide</item>
</items>
</object>
</property>
<layout> <layout>
<property name="column">1</property> <property name="column">1</property>
<property name="row">1</property> <property name="row">1</property>

View File

@@ -15,78 +15,18 @@ struct _ExampleAppPrefs
G_DEFINE_TYPE (ExampleAppPrefs, example_app_prefs, GTK_TYPE_DIALOG) G_DEFINE_TYPE (ExampleAppPrefs, example_app_prefs, GTK_TYPE_DIALOG)
static gboolean
string_to_font_desc (GValue *value,
GVariant *variant,
gpointer user_data)
{
const char *s = g_variant_get_string (variant, NULL);
PangoFontDescription *desc;
desc = pango_font_description_from_string (s);
g_value_take_boxed (value, desc);
return TRUE;
}
static GVariant *
font_desc_to_string (const GValue *value,
const GVariantType *expected_type,
gpointer user_data)
{
PangoFontDescription *desc = g_value_get_boxed (value);
char *s = pango_font_description_to_string (desc);
return g_variant_new_take_string (s);
}
static gboolean
transition_to_pos (GValue *value,
GVariant *variant,
gpointer user_data)
{
const char *s = g_variant_get_string (variant, NULL);
if (strcmp (s, "none") == 0)
g_value_set_uint (value, 0);
else if (strcmp (s, "crossfade") == 0)
g_value_set_uint (value, 1);
else
g_value_set_uint (value, 2);
return TRUE;
}
static GVariant *
pos_to_transition (const GValue *value,
const GVariantType *expected_type,
gpointer user_data)
{
switch (g_value_get_uint (value))
{
case 0: return g_variant_new_string ("none");
case 1: return g_variant_new_string ("crossfade");
case 2: return g_variant_new_string ("slide-left-right");
default: g_assert_not_reached ();
}
}
static void static void
example_app_prefs_init (ExampleAppPrefs *prefs) example_app_prefs_init (ExampleAppPrefs *prefs)
{ {
gtk_widget_init_template (GTK_WIDGET (prefs)); gtk_widget_init_template (GTK_WIDGET (prefs));
prefs->settings = g_settings_new ("org.gtk.exampleapp"); prefs->settings = g_settings_new ("org.gtk.exampleapp");
g_settings_bind_with_mapping (prefs->settings, "font", g_settings_bind (prefs->settings, "font",
prefs->font, "font-desc", prefs->font, "font",
G_SETTINGS_BIND_DEFAULT, G_SETTINGS_BIND_DEFAULT);
string_to_font_desc, g_settings_bind (prefs->settings, "transition",
font_desc_to_string, prefs->transition, "active-id",
NULL, NULL); G_SETTINGS_BIND_DEFAULT);
g_settings_bind_with_mapping (prefs->settings, "transition",
prefs->transition, "selected",
G_SETTINGS_BIND_DEFAULT,
transition_to_pos,
pos_to_transition,
NULL, NULL);
} }
static void static void

View File

@@ -27,10 +27,7 @@
</object> </object>
</child> </child>
<child> <child>
<object class="GtkFontDialogButton" id="font"> <object class="GtkFontButton" id="font">
<property name="dialog">
<object class="GtkFontDialog"/>
</property>
<layout> <layout>
<property name="column">1</property> <property name="column">1</property>
<property name="row">0</property> <property name="row">0</property>
@@ -50,16 +47,12 @@
</object> </object>
</child> </child>
<child> <child>
<object class="GtkDropDown" id="transition"> <object class="GtkComboBoxText" id="transition">
<property name="model"> <items>
<object class="GtkStringList"> <item translatable="yes" id="none">None</item>
<items> <item translatable="yes" id="crossfade">Fade</item>
<item translatable="yes">None</item> <item translatable="yes" id="slide-left-right">Slide</item>
<item translatable="yes">Fade</item> </items>
<item translatable="yes">Slide</item>
</items>
</object>
</property>
<layout> <layout>
<property name="column">1</property> <property name="column">1</property>
<property name="row">1</property> <property name="row">1</property>

View File

@@ -1,6 +1,8 @@
#include <stdlib.h> #include <stdlib.h>
#include <gtk/gtk.h> #include <gtk/gtk.h>
G_GNUC_BEGIN_IGNORE_DEPRECATIONS
typedef struct typedef struct
{ {
GtkApplication parent_instance; GtkApplication parent_instance;
@@ -354,8 +356,8 @@ combo_changed (GtkDropDown *combo,
GParamSpec *pspec, GParamSpec *pspec,
gpointer user_data) gpointer user_data)
{ {
GtkDialog *dialog = user_data;
GtkEntry *entry = g_object_get_data (user_data, "entry"); GtkEntry *entry = g_object_get_data (user_data, "entry");
GtkWidget *set_button = g_object_get_data (user_data, "set-button");
const char *action; const char *action;
char **accels; char **accels;
char *str; char *str;
@@ -370,7 +372,7 @@ combo_changed (GtkDropDown *combo,
g_strfreev (accels); g_strfreev (accels);
gtk_editable_set_text (GTK_EDITABLE (entry), str); gtk_editable_set_text (GTK_EDITABLE (entry), str);
gtk_widget_set_sensitive (set_button, FALSE); gtk_dialog_set_response_sensitive (dialog, GTK_RESPONSE_APPLY, FALSE);
} }
static void static void
@@ -378,21 +380,15 @@ entry_changed (GtkEntry *entry,
GParamSpec *pspec, GParamSpec *pspec,
gpointer user_data) gpointer user_data)
{ {
GtkWidget *set_button = g_object_get_data (user_data, "set-button"); GtkDialog *dialog = user_data;
gtk_widget_set_sensitive (set_button, TRUE); gtk_dialog_set_response_sensitive (dialog, GTK_RESPONSE_APPLY, TRUE);
} }
static void static void
close_clicked (GtkButton *button, response (GtkDialog *dialog,
gpointer user_data) guint response_id,
{ gpointer user_data)
gtk_window_destroy (GTK_WINDOW (user_data));
}
static void
set_clicked (GtkButton *button,
gpointer user_data)
{ {
GtkEntry *entry = g_object_get_data (user_data, "entry"); GtkEntry *entry = g_object_get_data (user_data, "entry");
GtkDropDown *combo = g_object_get_data (user_data, "combo"); GtkDropDown *combo = g_object_get_data (user_data, "combo");
@@ -400,6 +396,12 @@ set_clicked (GtkButton *button,
const char *str; const char *str;
char **accels; char **accels;
if (response_id == GTK_RESPONSE_CANCEL)
{
gtk_window_destroy (GTK_WINDOW (dialog));
return;
}
action = gtk_string_object_get_string (GTK_STRING_OBJECT (gtk_drop_down_get_selected_item (combo))); action = gtk_string_object_get_string (GTK_STRING_OBJECT (gtk_drop_down_get_selected_item (combo)));
if (!action) if (!action)
@@ -411,7 +413,7 @@ set_clicked (GtkButton *button,
gtk_application_set_accels_for_action (gtk_window_get_application (user_data), action, (const char **) accels); gtk_application_set_accels_for_action (gtk_window_get_application (user_data), action, (const char **) accels);
g_strfreev (accels); g_strfreev (accels);
gtk_widget_set_sensitive (GTK_WIDGET (button), FALSE); gtk_dialog_set_response_sensitive (dialog, GTK_RESPONSE_APPLY, FALSE);
} }
static void static void
@@ -422,45 +424,32 @@ edit_accels (GSimpleAction *action,
GtkApplication *app = user_data; GtkApplication *app = user_data;
GtkWidget *combo; GtkWidget *combo;
GtkWidget *entry; GtkWidget *entry;
GtkWidget *header;
GtkWidget *close_button;
GtkWidget *set_button;
GtkWidget *box;
char **actions; char **actions;
GtkWidget *dialog; GtkWidget *dialog;
int i; int i;
GtkStringList *strings; GtkStringList *strings;
dialog = gtk_window_new (); dialog = gtk_dialog_new_with_buttons ("Accelerators",
gtk_window_set_title (GTK_WINDOW (dialog), "Accelerators"); NULL,
GTK_DIALOG_USE_HEADER_BAR,
"Close", GTK_RESPONSE_CANCEL,
"Set", GTK_RESPONSE_APPLY,
NULL);
gtk_window_set_application (GTK_WINDOW (dialog), app); gtk_window_set_application (GTK_WINDOW (dialog), app);
actions = gtk_application_list_action_descriptions (app); actions = gtk_application_list_action_descriptions (app);
header = gtk_header_bar_new (); strings = gtk_string_list_new (NULL);
gtk_header_bar_set_show_title_buttons (GTK_HEADER_BAR (header), FALSE); combo = gtk_drop_down_new (G_LIST_MODEL (strings), NULL);
close_button = gtk_button_new_with_label ("Close"); g_object_set (gtk_dialog_get_content_area (GTK_DIALOG (dialog)),
g_signal_connect (close_button, "clicked", G_CALLBACK (close_clicked), dialog);
gtk_header_bar_pack_start (GTK_HEADER_BAR (header), close_button);
set_button = gtk_button_new_with_label ("Set");
g_signal_connect (set_button, "clicked", G_CALLBACK (set_clicked), dialog);
gtk_header_bar_pack_end (GTK_HEADER_BAR (header), set_button);
gtk_window_set_titlebar (GTK_WINDOW (dialog), header);
box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
g_object_set (box,
"margin-top", 10, "margin-top", 10,
"margin-bottom", 10, "margin-bottom", 10,
"margin-start", 10, "margin-start", 10,
"margin-end", 10, "margin-end", 10,
"spacing", 10,
NULL); NULL);
gtk_window_set_child (GTK_WINDOW (dialog), box);
strings = gtk_string_list_new (NULL);
combo = gtk_drop_down_new (G_LIST_MODEL (strings), NULL);
gtk_box_append (GTK_BOX (box), combo);
gtk_box_append (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog))), combo);
for (i = 0; actions[i]; i++) for (i = 0; actions[i]; i++)
gtk_string_list_append (strings, actions[i]); gtk_string_list_append (strings, actions[i]);
g_signal_connect (combo, "notify::selected", G_CALLBACK (combo_changed), dialog); g_signal_connect (combo, "notify::selected", G_CALLBACK (combo_changed), dialog);
@@ -469,10 +458,10 @@ edit_accels (GSimpleAction *action,
gtk_widget_set_hexpand (entry, TRUE); gtk_widget_set_hexpand (entry, TRUE);
g_signal_connect (entry, "notify::text", G_CALLBACK (entry_changed), dialog); g_signal_connect (entry, "notify::text", G_CALLBACK (entry_changed), dialog);
gtk_box_append (GTK_BOX (box), entry); gtk_box_append (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog))), entry);
g_signal_connect (dialog, "response", G_CALLBACK (response), dialog);
g_object_set_data (G_OBJECT (dialog), "combo", combo); g_object_set_data (G_OBJECT (dialog), "combo", combo);
g_object_set_data (G_OBJECT (dialog), "entry", entry); g_object_set_data (G_OBJECT (dialog), "entry", entry);
g_object_set_data (G_OBJECT (dialog), "set-button", set_button);
gtk_drop_down_set_selected (GTK_DROP_DOWN (combo), 0); gtk_drop_down_set_selected (GTK_DROP_DOWN (combo), 0);

Some files were not shown because too many files have changed in this diff Show More