Compare commits

..

4 Commits

Author SHA1 Message Date
Matthias Clasen
01bcd96d16 Reimplement gtk_choose_color without a dialog
This commit introduces a private GtkColorChooserWindow
which is a copy of GtkColorChooserDialog with the dialog
bits redone, and uses it for the async color choose API.

When GtkColorChooserDialog is dropped, the color chooser
window can be renamed (and made public, if desired).

We want to get rid of GtkDialog. This is a step in that direction.
2022-10-23 08:05:17 -04:00
Matthias Clasen
951773452a wip: Add async api to choose a file
This is an experiment to replace explicit use
of chooser dialogs with an async API.
2022-10-22 23:53:13 -04:00
Matthias Clasen
d0af6f812d wip: Add async api to choose a font
This is an experiment to replace explicit use
of chooser dialogs with an async API.
2022-10-22 23:53:13 -04:00
Matthias Clasen
b665a95558 wip: Add async api to choose a color
This is an experiment to replace explicit use
of chooser dialogs with an async API.
2022-10-22 23:53:13 -04:00
1969 changed files with 75214 additions and 109613 deletions

View File

@@ -22,35 +22,29 @@ stages:
# Common variables # Common variables
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 -Dglib:werror=false -Dpango:werror=false -Dgtk-doc:werror=false -Dwayland-protocols:werror=false -Dsysprof:werror=false -Dwayland: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 -Ddemos=false -Dbuild-examples=false -Dbuild-tests=false -Dbuild-testsuite=true" FEATURE_FLAGS: "-Dvulkan=enabled -Dcloudproviders=enabled"
MESON_TEST_TIMEOUT_MULTIPLIER: 3 MESON_TEST_TIMEOUT_MULTIPLIER: 3
FEDORA_IMAGE: "registry.gitlab.gnome.org/gnome/gtk/fedora:v46" FEDORA_IMAGE: "registry.gitlab.gnome.org/gnome/gtk/fedora:v38"
FLATPAK_IMAGE: "quay.io/gnome_infrastructure/gnome-runtime-images:gnome-master"
workflow: .only-default:
rules: only:
- if: $CI_COMMIT_TAG - branches
- if: $CI_COMMIT_BRANCH except:
- tags
default:
retry:
max: 2
when:
- 'runner_system_failure'
- 'stuck_or_timeout_failure'
- 'scheduler_failure'
- 'api_failure'
interruptible: true
style-check-diff: style-check-diff:
extends: .only-default
image: $FEDORA_IMAGE image: $FEDORA_IMAGE
stage: check stage: check
when: manual allow_failure: true
script: script:
- .gitlab-ci/run-style-check-diff.sh - .gitlab-ci/run-style-check-diff.sh
.build-fedora-default: .build-fedora-default:
extends: .only-default
image: $FEDORA_IMAGE image: $FEDORA_IMAGE
artifacts: artifacts:
when: always when: always
@@ -58,7 +52,6 @@ style-check-diff:
junit: junit:
- "${CI_PROJECT_DIR}/_build/report-x11.xml" - "${CI_PROJECT_DIR}/_build/report-x11.xml"
- "${CI_PROJECT_DIR}/_build/report-wayland.xml" - "${CI_PROJECT_DIR}/_build/report-wayland.xml"
- "${CI_PROJECT_DIR}/_build/report-wayland_gles.xml"
- "${CI_PROJECT_DIR}/_build/report-broadway.xml" - "${CI_PROJECT_DIR}/_build/report-broadway.xml"
name: "gtk-${CI_COMMIT_REF_NAME}" name: "gtk-${CI_COMMIT_REF_NAME}"
paths: paths:
@@ -75,6 +68,11 @@ style-check-diff:
key: "$CI_JOB_NAME" key: "$CI_JOB_NAME"
paths: paths:
- _ccache/ - _ccache/
- subprojects/gdk-pixbuf/
- subprojects/glib/
- subprojects/graphene/
- subprojects/libepoxy/
- subprojects/pango/
fedora-x86_64: fedora-x86_64:
extends: .build-fedora-default extends: .build-fedora-default
@@ -84,16 +82,10 @@ fedora-x86_64:
EXTRA_MESON_FLAGS: "--buildtype=debug --default-library=both" EXTRA_MESON_FLAGS: "--buildtype=debug --default-library=both"
script: script:
- .gitlab-ci/show-info-linux.sh - .gitlab-ci/show-info-linux.sh
- export PATH="$HOME/.local/bin:$PATH" - meson subprojects update
- meson subprojects download
- meson subprojects update --reset
- mkdir _install - mkdir _install
- meson setup - meson --prefix=${CI_PROJECT_DIR}/_install
--prefix=${CI_PROJECT_DIR}/_install ${COMMON_MESON_FLAGS} ${EXTRA_MESON_FLAGS} ${BACKEND_FLAGS} ${FEATURE_FLAGS}
${COMMON_MESON_FLAGS}
${EXTRA_MESON_FLAGS}
${BACKEND_FLAGS}
${FEATURE_FLAGS}
_build _build
- meson compile -C _build - meson compile -C _build
- meson install -C _build - meson install -C _build
@@ -101,7 +93,7 @@ fedora-x86_64:
- 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
- .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 waylandgles
- .gitlab-ci/run-tests.sh _build broadway - .gitlab-ci/run-tests.sh _build broadway
release-build: release-build:
@@ -112,16 +104,10 @@ release-build:
EXTRA_MESON_FLAGS: "--buildtype=release" EXTRA_MESON_FLAGS: "--buildtype=release"
script: script:
- .gitlab-ci/show-info-linux.sh - .gitlab-ci/show-info-linux.sh
- export PATH="$HOME/.local/bin:$PATH" - meson subprojects update
- meson subprojects download - meson ${COMMON_MESON_FLAGS} ${EXTRA_MESON_FLAGS} ${BACKEND_FLAGS} ${FEATURE_FLAGS}
- meson subprojects update --reset
- meson setup
${COMMON_MESON_FLAGS}
${EXTRA_MESON_FLAGS}
${BACKEND_FLAGS}
${FEATURE_FLAGS}
_build _build
- meson compile -C _build - ninja -C _build
- .gitlab-ci/run-tests.sh _build x11 - .gitlab-ci/run-tests.sh _build x11
fedora-mingw64: fedora-mingw64:
@@ -142,14 +128,37 @@ fedora-mingw64:
# mingw64-graphene (rawhide) # mingw64-graphene (rawhide)
script: script:
- .gitlab-ci/show-info-linux.sh - .gitlab-ci/show-info-linux.sh
- export PATH="$HOME/.local/bin:$PATH" - meson subprojects update
- pip3 install --user meson~=1.0 - mkdir _build && cd _build
- meson subprojects download - mingw64-meson -Dintrospection=disabled -Dgraphene:introspection=disabled
- meson subprojects update --reset - ninja
- meson -Dintrospection=disabled -Dgraphene:introspection=disabled _build
- meson compile -C _build installed-tests:
extends: .build-fedora-default
stage: build
needs: []
variables:
EXTRA_MESON_FLAGS: "--prefix=/usr --libdir=/usr/lib64 -Dinstall-tests=true"
G_TEST_ACCESSIBLE: 1
script:
- .gitlab-ci/show-info-linux.sh
- meson subprojects update
- meson ${COMMON_MESON_FLAGS} ${EXTRA_MESON_FLAGS} ${BACKEND_FLAGS} ${FEATURE_FLAGS}
_build
- ninja -C _build
- sudo ninja -C _build install
- dbus-run-session xvfb-run -a -s "-screen 0 1024x768x24"
gnome-desktop-testing-runner
--report-directory=_build/installed-tests-report/failed/
--parallel=0
gtk-4.0
artifacts:
paths:
- "_build/installed-tests-report/"
.mingw-defaults: .mingw-defaults:
extends: .only-default
stage: build stage: build
tags: tags:
- win32-ps - win32-ps
@@ -179,45 +188,40 @@ msys2-mingw64:
- "${CI_PROJECT_DIR}/_build/gtkdll.tar.gz" - "${CI_PROJECT_DIR}/_build/gtkdll.tar.gz"
macos: macos:
# Sadly, this fails regularly, and its failure is never enlightening extends: .only-default
allow_failure: true only:
rules: - branches@GNOME/gtk
- if: $CI_PROJECT_NAMESPACE == "GNOME"
stage: build stage: build
allow_failure: true
tags: tags:
- macos - macos
needs: [] needs: []
before_script: before_script:
- bash .gitlab-ci/show-info-osx.sh - bash .gitlab-ci/show-info-osx.sh
- pip3 install --user meson~=1.0 - pip3 install --user meson==0.60.3
- pip3 install --user ninja - pip3 install --user ninja
- export PATH=/Users/gitlabrunner/Library/Python/3.7/bin:$PATH - export PATH=/Users/gitlabrunner/Library/Python/3.7/bin:$PATH
- export MESON_FORCE_BACKTRACE=1 - export MESON_FORCE_BACKTRACE=1
script: script:
- meson setup ${COMMON_MESON_FLAGS} - meson -Dx11-backend=false
-Dx11-backend=false
-Dbroadway-backend=true -Dbroadway-backend=true
-Dmacos-backend=true -Dmacos-backend=true
-Dmedia-gstreamer=disabled -Dmedia-gstreamer=disabled
-Dintrospection=disabled -Dintrospection=disabled
-Dcpp_std=c++11 -Dcpp_std=c++11
-Dpixman:tests=disabled -Dpixman:tests=disabled
-Dlibjpeg-turbo:simd=disabled
-Ddemos=false
-Dbuild-tests=false
-Dbuild-examples=false
-Dbuild-testsuite=false
_build _build
- meson compile -C _build - ninja -C _build
artifacts: artifacts:
when: always when: always
paths: paths:
- "${CI_PROJECT_DIR}/_build/meson-logs" - "${CI_PROJECT_DIR}/_build/meson-logs"
vs2017-x64: vs2017-x64:
extends: .only-default
# TODO: Uncomment this when ready to merge. # TODO: Uncomment this when ready to merge.
# rules: #only:
# - if: $CI_PROJECT_NAMESPACE == "GNOME" # - branches@GNOME/gtk
stage: build stage: build
tags: tags:
- win32-ps - win32-ps
@@ -230,7 +234,7 @@ vs2017-x64:
- "${CI_PROJECT_DIR}/_build/meson-logs" - "${CI_PROJECT_DIR}/_build/meson-logs"
.flatpak-defaults: .flatpak-defaults:
image: "quay.io/gnome_infrastructure/gnome-runtime-images:gnome-master" image: $FLATPAK_IMAGE
stage: flatpak stage: flatpak
allow_failure: true allow_failure: true
tags: tags:
@@ -240,67 +244,65 @@ vs2017-x64:
- "${APPID}-dev.flatpak" - "${APPID}-dev.flatpak"
- 'repo.tar' - 'repo.tar'
expire_in: 1 day expire_in: 1 day
rules:
# Only build Flatpak bundles automatically on main
- if: $CI_COMMIT_BRANCH == "main"
- if: $CI_COMMIT_BRANCH != "main"
when: "manual"
script: script:
- bash -x ./.gitlab-ci/flatpak-build.sh "${APPID}" - bash -x ./.gitlab-ci/flatpak-build.sh "${APPID}"
flatpak:demo: # Manual jobs, for branches and MRs
extends: '.flatpak-defaults' .flatpak-manual:
extends: .flatpak-defaults
when: manual
# Only build Flatpak bundles automatically on main
.flatpak-main:
extends: .flatpak-defaults
only:
- main
flatpak-manual:demo:
extends: .flatpak-manual
needs: [] needs: []
variables: variables:
APPID: org.gtk.Demo4 APPID: org.gtk.Demo4
flatpak:demo:aarch64: flatpak-main:demo:
extends: '.flatpak-defaults' extends: .flatpak-main
needs: [] needs: []
tags:
- flatpak-aarch64
variables: variables:
APPID: org.gtk.Demo4 APPID: org.gtk.Demo4
flatpak:widget-factory: flatpak-manual:widget-factory:
extends: '.flatpak-defaults' extends: .flatpak-manual
needs: [] needs: []
variables: variables:
APPID: org.gtk.WidgetFactory4 APPID: org.gtk.WidgetFactory4
flatpak:widget-factory:aarch64: flatpak-main:widget-factory:
extends: '.flatpak-defaults' extends: .flatpak-main
needs: [] needs: []
tags:
- flatpak-aarch64
variables: variables:
APPID: org.gtk.WidgetFactory4 APPID: org.gtk.WidgetFactory4
flatpak:icon-browser: flatpak-manual:icon-browser:
extends: '.flatpak-defaults' extends: .flatpak-manual
needs: [] needs: []
variables: variables:
APPID: org.gtk.IconBrowser4 APPID: org.gtk.IconBrowser4
flatpak:icon-browser:aarch64: flatpak-main:icon-browser:
extends: '.flatpak-defaults' extends: .flatpak-main
needs: [] needs: []
tags:
- flatpak-aarch64
variables: variables:
APPID: org.gtk.IconBrowser4 APPID: org.gtk.IconBrowser4
flatpak:node-editor: flatpak-manual:node-editor:
extends: '.flatpak-defaults' extends: .flatpak-manual
needs: [] needs: []
variables: variables:
APPID: org.gtk.gtk4.NodeEditor APPID: org.gtk.gtk4.NodeEditor
flatpak:node-editor:aarch64: flatpak-main:node-editor:
extends: '.flatpak-defaults' extends: .flatpak-main
needs: [] needs: []
tags:
- flatpak-aarch64
variables: variables:
APPID: org.gtk.gtk4.NodeEditor APPID: org.gtk.gtk4.NodeEditor
@@ -309,35 +311,23 @@ flatpak:node-editor:aarch64:
# https://gitlab.gnome.org/GNOME/Initiatives/-/wikis/DevOps-with-Flatpak # https://gitlab.gnome.org/GNOME/Initiatives/-/wikis/DevOps-with-Flatpak
nightly demo: nightly demo:
extends: '.publish_nightly' extends: '.publish_nightly'
needs: ['flatpak:demo'] dependencies: ['flatpak-main:demo']
needs: ['flatpak-main:demo']
nightly demo aarch64:
extends: '.publish_nightly'
needs: ['flatpak:demo:aarch64']
nightly factory: nightly factory:
extends: '.publish_nightly' extends: '.publish_nightly'
needs: ['flatpak:widget-factory'] dependencies: ['flatpak-main:widget-factory']
needs: ['flatpak-main:widget-factory']
nightly factory aarch64:
extends: '.publish_nightly'
needs: ['flatpak:widget-factory:aarch64']
nightly icon-browser: nightly icon-browser:
extends: '.publish_nightly' extends: '.publish_nightly'
needs: ['flatpak:icon-browser'] dependencies: ['flatpak-main:icon-browser']
needs: ['flatpak-main:icon-browser']
nightly icon-browser aarch64:
extends: '.publish_nightly'
needs: ['flatpak:icon-browser:aarch64']
nightly node-editor: nightly node-editor:
extends: '.publish_nightly' extends: '.publish_nightly'
needs: ['flatpak:node-editor'] dependencies: ['flatpak-main:node-editor']
needs: ['flatpak-main:node-editor']
nightly node-editor aarch64:
extends: '.publish_nightly'
needs: ['flatpak:node-editor:aarch64']
static-scan: static-scan:
image: $FEDORA_IMAGE image: $FEDORA_IMAGE
@@ -346,29 +336,23 @@ static-scan:
variables: variables:
EXTRA_MESON_FLAGS: "--buildtype=debug" EXTRA_MESON_FLAGS: "--buildtype=debug"
script: script:
- export PATH="$HOME/.local/bin:$PATH" - meson ${COMMON_MESON_FLAGS} ${EXTRA_MESON_FLAGS} _scan_build
- meson setup
${COMMON_MESON_FLAGS}
${EXTRA_MESON_FLAGS}
_scan_build
- ninja -C _scan_build scan-build - ninja -C _scan_build scan-build
artifacts: artifacts:
paths: paths:
- _scan_build/meson-logs - _scan_build/meson-logs
allow_failure: true allow_failure: true
# Run tests with the address sanitizer. We need to turn off introspection # Run tests with the address sanitizer. We need to turn off introspection,
# and f16c, since they are incompatible with asan # since it is incompatible with asan
asan-build: asan-build:
image: $FEDORA_IMAGE image: $FEDORA_IMAGE
tags: [ asan ] tags: [ asan ]
stage: analysis stage: analysis
needs: [] needs: []
when: manual
variables: variables:
script: script:
- export PATH="$HOME/.local/bin:$PATH" - CC=clang meson --buildtype=debugoptimized -Db_sanitize=address -Db_lundef=false -Dintrospection=disabled _build
- CC=clang meson setup --buildtype=debugoptimized -Db_sanitize=address -Db_lundef=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
artifacts: artifacts:
@@ -380,21 +364,10 @@ reference:
image: $FEDORA_IMAGE image: $FEDORA_IMAGE
stage: docs stage: docs
needs: [] needs: []
variables:
EXTRA_MESON_FLAGS: "--buildtype=release --force-fallback-for=gdk-pixbuf,pango"
script: script:
- export PATH="$HOME/.local/bin:$PATH" - meson ${COMMON_MESON_FLAGS} ${EXTRA_MESON_FLAGS} -Dgtk_doc=true -Dgdk-pixbuf:gtk_doc=true -Dpango:gtk_doc=true _build
- meson setup
${COMMON_MESON_FLAGS}
--buildtype=release
--force-fallback-for=gdk-pixbuf,pango
-Dintrospection=enabled
-Dgtk_doc=true
-Dgdk-pixbuf:gtk_doc=true
-Dpango:gtk_doc=true
-Ddemos=false
-Dbuild-examples=false
-Dbuild-tests=false
-Dbuild-testsuite=false
_build
- meson compile -C _build - meson compile -C _build
- mkdir -p _reference/ - mkdir -p _reference/
- mv _build/docs/reference/gdk/gdk4/ _reference/gdk4/ - mv _build/docs/reference/gdk/gdk4/ _reference/gdk4/
@@ -417,9 +390,9 @@ reference:
publish-docs: publish-docs:
image: fedora:latest image: fedora:latest
stage: publish stage: publish
interruptible: false
needs: ['reference'] needs: ['reference']
script: script:
- "curl -X POST -F token=${PAGES_TRIGGER_TOKEN} -F ref=docs-gtk-org https://gitlab.gnome.org/api/v4/projects/665/trigger/pipeline" - "curl -X POST -F token=${PAGES_TRIGGER_TOKEN} -F ref=docs-gtk-org https://gitlab.gnome.org/api/v4/projects/665/trigger/pipeline"
rules: only:
- if: $CI_COMMIT_REF_NAME == "main" refs:
- main

View File

@@ -1,4 +1,4 @@
FROM fedora:38 FROM fedora:36
RUN dnf -y install \ RUN dnf -y install \
adwaita-icon-theme \ adwaita-icon-theme \
@@ -18,9 +18,7 @@ RUN dnf -y install \
dejavu-sans-mono-fonts \ dejavu-sans-mono-fonts \
desktop-file-utils \ desktop-file-utils \
diffutils \ diffutils \
docbook-style-xsl \
elfutils-libelf-devel \ elfutils-libelf-devel \
expat-devel \
fribidi-devel \ fribidi-devel \
gcc \ gcc \
gcc-c++ \ gcc-c++ \
@@ -32,7 +30,7 @@ RUN dnf -y install \
glib2-static \ glib2-static \
glibc-devel \ glibc-devel \
glibc-headers \ glibc-headers \
gnupg2 \ gnome-desktop-testing \
gobject-introspection-devel \ gobject-introspection-devel \
graphene-devel \ graphene-devel \
graphviz \ graphviz \
@@ -73,22 +71,18 @@ RUN dnf -y install \
mesa-libEGL-devel \ mesa-libEGL-devel \
mesa-libGLES-devel \ mesa-libGLES-devel \
meson \ meson \
mutter \
ninja-build \ ninja-build \
pango-devel \ pango-devel \
pcre-devel \ pcre-devel \
pcre-static \ pcre-static \
pipewire \
pipewire-gstreamer \
python3 \ python3 \
python3-docutils \ python3-docutils \
python3-gobject \ python3-gobject \
python3-jinja2 \ python3-jinja2 \
python3-markdown \ python3-markdown \
python3-packaging \
python3-pip \ python3-pip \
python3-pydbus \
python3-pygments \ python3-pygments \
python3-toml \
python3-typogrify \ python3-typogrify \
python3-wheel \ python3-wheel \
redhat-rpm-config \ redhat-rpm-config \
@@ -99,8 +93,9 @@ RUN dnf -y install \
weston \ weston \
weston-libs \ weston-libs \
which \ which \
wireplumber \
xorg-x11-server-Xvfb \ xorg-x11-server-Xvfb \
&& dnf install -y 'dnf-command(builddep)' \
&& dnf builddep -y wayland \
&& dnf clean all && dnf clean all
# Enable sudo for wheel users # Enable sudo for wheel users

View File

@@ -20,7 +20,6 @@ flatpak build ${builddir} meson \
-Dx11-backend=true \ -Dx11-backend=true \
-Dwayland-backend=true \ -Dwayland-backend=true \
-Dbuild-tests=false \ -Dbuild-tests=false \
-Dbuild-testsuite=false \
-Dbuild-examples=false \ -Dbuild-examples=false \
-Dintrospection=disabled \ -Dintrospection=disabled \
-Ddemos=true \ -Ddemos=true \

View File

@@ -23,7 +23,6 @@ push=0
list=0 list=0
print_help=0 print_help=0
no_login=0 no_login=0
no_cache=0
while (($# > 0)); do while (($# > 0)); do
case "${1%%=*}" in case "${1%%=*}" in
@@ -35,7 +34,6 @@ while (($# > 0)); do
--base|-b) read_arg base "$@" || shift;; --base|-b) read_arg base "$@" || shift;;
--version|-v) read_arg base_version "$@" || shift;; --version|-v) read_arg base_version "$@" || shift;;
--no-login) no_login=1;; --no-login) no_login=1;;
--no-cache) no_cache=1;;
*) echo -e "\e[1;31mERROR\e[0m: Unknown option '$1'"; exit 1;; *) echo -e "\e[1;31mERROR\e[0m: Unknown option '$1'"; exit 1;;
esac esac
shift shift
@@ -105,21 +103,11 @@ TAG="${REGISTRY}/gnome/gtk/${base}:${base_version}"
if [ $build == 1 ]; then if [ $build == 1 ]; then
echo -e "\e[1;32mBUILDING\e[0m: ${base} as ${TAG}" echo -e "\e[1;32mBUILDING\e[0m: ${base} as ${TAG}"
if [ $no_cache == 0 ]; then
${CMD} build \ ${CMD} build \
${format} \ ${format} \
--build-arg HOST_USER_ID="$UID" \ --build-arg HOST_USER_ID="$UID" \
--tag "${TAG}" \ --tag "${TAG}" \
--file "${base}.Dockerfile" . --file "${base}.Dockerfile" .
else
${CMD} build \
${format} \
--no-cache \
--build-arg HOST_USER_ID="$UID" \
--tag "${TAG}" \
--file "${base}.Dockerfile" .
fi
exit $? exit $?
fi fi
@@ -138,8 +126,7 @@ if [ $run == 1 ]; then
echo -e "\e[1;32mRUNNING\e[0m: ${base} as ${TAG}" echo -e "\e[1;32mRUNNING\e[0m: ${base} as ${TAG}"
${CMD} run \ ${CMD} run \
--rm \ --rm \
--userns=keep-id \ --volume "$(pwd)/..:/home/user/app" \
--volume "$(pwd)/..:/home/user/app:rw,z" \
--workdir "/home/user/app" \ --workdir "/home/user/app" \
--tty \ --tty \
--interactive "${TAG}" \ --interactive "${TAG}" \

View File

@@ -6,23 +6,19 @@ set +e
srcdir=$( pwd ) srcdir=$( pwd )
builddir=$1 builddir=$1
backend=$2 backend=$2
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:verbosity=1:log_threads=1 export LSAN_OPTIONS=suppressions=$srcdir/lsan.supp:print_suppressions=0
export G_SLICE=always-malloc export G_SLICE=always-malloc
case "${backend}" in case "${backend}" in
x11) x11)
xvfb-run -a -s "-screen 0 1024x768x24 -noreset" \ xvfb-run -a -s "-screen 0 1024x768x24 -noreset" \
meson test -C ${builddir} \ meson test -C ${builddir} \
--quiet \ --timeout-multiplier "${MESON_TEST_TIMEOUT_MULTIPLIER}" \
--timeout-multiplier "${multiplier}" \
--print-errorlogs \ --print-errorlogs \
--setup=${backend} \ --setup=${backend} \
--suite=gtk \ --suite=gtk \
--no-suite=failing \
--no-suite=flaky \
--no-suite=gsk-compare-broadway --no-suite=gsk-compare-broadway
# Store the exit code for the CI run, but always # Store the exit code for the CI run, but always
@@ -30,7 +26,7 @@ case "${backend}" in
exit_code=$? exit_code=$?
;; ;;
wayland*) wayland)
export XDG_RUNTIME_DIR="$(mktemp -p $(pwd) -d xdg-runtime-XXXXXX)" export XDG_RUNTIME_DIR="$(mktemp -p $(pwd) -d xdg-runtime-XXXXXX)"
weston --backend=headless-backend.so --socket=wayland-5 --idle-time=0 & weston --backend=headless-backend.so --socket=wayland-5 --idle-time=0 &
@@ -38,17 +34,31 @@ case "${backend}" in
export WAYLAND_DISPLAY=wayland-5 export WAYLAND_DISPLAY=wayland-5
meson test -C ${builddir} \ meson test -C ${builddir} \
--quiet \ --timeout-multiplier "${MESON_TEST_TIMEOUT_MULTIPLIER}" \
--timeout-multiplier "${multiplier}" \
--print-errorlogs \ --print-errorlogs \
--setup=${backend} \ --setup=${backend} \
--suite=gtk \ --suite=gtk \
--no-suite=failing \
--no-suite=flaky \
--no-suite=${backend}_failing \
--no-suite=gsk-compare-broadway --no-suite=gsk-compare-broadway
exit_code=$?
exit_code=$?
kill ${compositor}
;;
waylandgles)
export XDG_RUNTIME_DIR="$(mktemp -p $(pwd) -d xdg-runtime-XXXXXX)"
weston --backend=headless-backend.so --socket=wayland-6 --idle-time=0 &
compositor=$!
export WAYLAND_DISPLAY=wayland-6
meson test -C ${builddir} \
--timeout-multiplier "${MESON_TEST_TIMEOUT_MULTIPLIER}" \
--print-errorlogs \
--setup=${backend} \
--suite=gtk \
--no-suite=gsk-compare-broadway
exit_code=$?
kill ${compositor} kill ${compositor}
;; ;;
@@ -60,18 +70,14 @@ case "${backend}" in
export BROADWAY_DISPLAY=:5 export BROADWAY_DISPLAY=:5
meson test -C ${builddir} \ meson test -C ${builddir} \
--quiet \ --timeout-multiplier "${MESON_TEST_TIMEOUT_MULTIPLIER}" \
--timeout-multiplier "${multiplier}" \
--print-errorlogs \ --print-errorlogs \
--setup=${backend} \ --setup=${backend} \
--suite=gtk \ --suite=gtk \
--no-suite=failing \
--no-suite=flaky \
--no-suite=gsk-compare-opengl --no-suite=gsk-compare-opengl
# don't let Broadway failures fail the run, for now # don't let Broadway failures fail the run, for now
exit_code=0 exit_code=0
kill ${server} kill ${server}
;; ;;
@@ -86,17 +92,16 @@ cd ${builddir}
$srcdir/.gitlab-ci/meson-junit-report.py \ $srcdir/.gitlab-ci/meson-junit-report.py \
--project-name=gtk \ --project-name=gtk \
--backend="${backend}" \ --backend=${backend} \
--job-id="${CI_JOB_NAME}" \ --job-id="${CI_JOB_NAME}" \
--output="report-${backend}.xml" \ --output=report-${backend}.xml \
"meson-logs/testlog-${backend}.json" meson-logs/testlog-${backend}.json
$srcdir/.gitlab-ci/meson-html-report.py \ $srcdir/.gitlab-ci/meson-html-report.py \
--project-name=gtk \ --project-name=gtk \
--backend="${backend}" \ --backend=${backend} \
--job-id="${CI_JOB_NAME}" \ --job-id="${CI_JOB_NAME}" \
--reftest-output-dir="testsuite/reftests/output/${backend}" \ --reftest-output-dir="testsuite/reftests/output/${backend}" \
--output="report-${backend}.html" \ --output=report-${backend}.html \
"meson-logs/testlog-${backend}.json" meson-logs/testlog-${backend}.json
exit $exit_code exit $exit_code

View File

@@ -5,7 +5,7 @@ call "C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\VC\Auxiliar
@echo on @echo on
:: FIXME: make warnings fatal :: FIXME: make warnings fatal
pip3 install --upgrade --user meson~=0.64 || goto :error pip3 install --upgrade --user meson==0.60.3 || goto :error
meson -Ddebug=false -Dmedia-gstreamer=disabled _build || goto :error meson -Ddebug=false -Dmedia-gstreamer=disabled _build || goto :error
ninja -C _build || goto :error ninja -C _build || goto :error

View File

@@ -21,7 +21,7 @@ many things that we value:
Please, do not use the issue tracker for support questions. If you have Please, do not use the issue tracker for support questions. If you have
questions on how to use GTK effectively, you can use: questions on how to use GTK effectively, you can use:
- the `gtk` [room on matrix](https://matrix.to/#/#gtk:gnome.org) - the `#gtk` IRC channel on irc.gnome.org
- the [gtk tag on the GNOME Discourse instance](https://discourse.gnome.org/tag/gtk) - the [gtk tag on the GNOME Discourse instance](https://discourse.gnome.org/tag/gtk)
You can also look at the GTK tag on [Stack You can also look at the GTK tag on [Stack
@@ -44,7 +44,6 @@ If you're reporting a bug make sure to list:
0. which version of GTK are you using? 0. which version of GTK are you using?
0. which operating system are you using? 0. which operating system are you using?
0. what display and graphics driver are you using?
0. the necessary steps to reproduce the issue 0. the necessary steps to reproduce the issue
0. the expected outcome 0. the expected outcome
0. a description of the behavior; screenshots are also welcome 0. a description of the behavior; screenshots are also welcome

457
NEWS
View File

@@ -1,440 +1,9 @@
Overview of Changes in 4.11.2, xx-xx-xxxx Overview of Changes in 4.9.1, dd-mm-yyyy
=========================================
* GtkGLArea:
- Add an allowed-apis property
* GtkListBox:
- Fix a problem with gtk_list_box_remove_all
* GtkCenterBox:
- Add a shrink-center-last property
* GtkButton, GtkMenuButton:
- Add a can-shrink property
* GtkPopover:
- Fix problems with grabs
* GtkFileChooser:
- Fix a problem with removing files
- Make the date, time and location columns work
- Fix filtering in the save entry popup
- A few memory leak fixes
- Handle webdav in the pathbar
* Dialogs:
- Destroy windows promptly when the async callback finishes
- Detect absence of the OpenURI portal and fall back
* Theme:
- Add explicit style classes to a number of widgets
- Fix some contrast issues in the dark theme
* Accessibility:
- Fix alert dialogs in the a11y tree
* Layout:
- Some fixes to baseline alignment
* GL:
- Add GdkGLTextureBuilder, a more flexible api for creating textures
- Ensure that we work with GLES 2
* Vulkan:
- More fixes to the experimental Vulkan renderer
- Rework glyph caching
* Wayland:
- Don't destroy wl_surfaces on hide
- Plug leaks of compositor-side resources
* Inspector:
- Improve the action list
- Fix a crash
* Tools:
- gtk4-node-editor: Improve scaling
- gtk4-node-editor: Preserve aspect ratio of textures
- gtk4-demo: Make the stylus demo work with mice
* Translation updates
Bulgarian
Chinese (China)
Galician
Hebrew
Polish
Portuguese
Russian
Turkish
Overview of Changes in 4.11.1, 03-04-2023
=========================================
* GtkLabel, GtkLinkButton:
- Make file:// uris work again
* GtkListView/GtkColumnView/GtkGridView:
- Fix clipping issues
- Handle focus movement better
- Introduce ::tab-behavior properties
- Introduce GtkListItem::focusable
- Introduce GtkColumnViewCell
- Introduce row factories in GtkColumnView
- Make list grid and column views inert when not rendering
* Drag-and-Drop:
- Support resizing drag surfaces, using the new
GdkDragSurface::compute-size signal
* Theme:
- Port .boxed-list style from Adwaita
- Make insensitive pictures appear grayed out
* Accessibility:
- Fix memory leaks
- Fix a crash
* GDK:
- Add gdk_surface_get_scale to get the fractional scale
- Use fractional scales on Wayland with cairo
- Use fractional scales on Wayland with GL if GDK_DEBUG=gl-fractional
is set. This support is still experimental
* GSK:
- Allow limiting texture sizes with GSK_MAX_TEXTURE_SIZE
- Use samplers for GL texture filtering
- Fix problems with texture slicing
- Avoid re-uploading textures when possible
- Use mipmaps when it is beneficial
* Wayland:
- Fix handling of Drag hotspots
- Fix a crash with cursor size 0
- Support absolute paths in WAYLAND_DISPLAY
- Use the fractional scale protocol
- Use a viewporter to set buffer scale
* Windows:
- Fix problems with WGL
* Vulkan:
- Some fixes to the experimental Vulkan renderer
- Support fractional scaling
* Debugging:
- Show more Wayland-specific information in the inspector
* Deprecations:
- gtk_widget_translate_coordinates
- gdk_surface_create_similar_surface
* Documentation:
- Add a section on coordinate systems
* Build:
- Require wayland-protocols 1.31
* Translation updates
- British English
- Bulgarian
- Chinese (China)
- Dutch
- French
- Persian
- Russian
Overview of Changes in 4.10.1, 14-03-2023
=========================================
* GtkFileChooser
- Improve search performance
- Be safe against pathless files
- Fix memory leaks
- Only show local files in recent files
- Show most recent files first
- Make files non-selectable in selet_folder mode
* GtkListView / GtkColumnView / GtkGridView
- Fix scrolling problems
- Support CSS border-spacing
* GtkComboBox
- Fix a size allocation problem
* gtk
- Size allocation fixes
* Accessibility
- Miscellaneous property fixes and improvements
* Wayland
- Fix an ordering problem in surface disposal
* Windows
- Fix Visual Studio build with older GLib
* Translation updates
Basque
Bulgarian
Catalan
Czech
Danish
Finnish
Friulian
Galician
Georgian
Hungarian
Lithuanian
Polish
Portuguese
Swedish
Turkish
Ukrainian
Overview of Changes in 4.10.0, 04-03-2023
=========================================
* GtkTextView
- Document hanging indentation
* GtkListView
- Fix a size allocation problem
* GtkFileChooser
- Fix paned behavior
- Fix a crash
* GtkText
- Fix various problems with undo
* Accessibility
- Make some getters transfer-full
- Allow setting accessible parents and siblings
- Add a role for toggle buttons
- Miscellaneous property fixes and improvements
* gtk
- Improve the handling resize-during-size-allocate
* gdk
- Introduce GdkTextureDownloader and use it
- Make gdk_texture_get_format public
* gsk
- Make mask nodes more versatile
- Improve the GL implementation for texture scale nodes
* X11
- Fix key handling during DND
* Tools
- gtk-builder-tool: Try harder to handle templates
- gtk-builder-tool: Prefer properties over <child>
* Translation updates
Basque
Belarusian
Bulgarian
Indonesian
Galician
Georgian
German
Hebrew
Lithuanian
Portuguese
Spanish
Swedish
Turkish
Ukrainian
Overview of Changes in 4.9.4, 12-02-2023
======================================== ========================================
* Printing: Note that deprecations are an early outlook
- Add a CPDB backend at changes that will appear in an eventual
- Drop the lpr backend GTK 5 release, which is still far away.
* GtkFileDialog:
- Robustness fixes
* GtkScaleButton:
- Add an 'active' property
* GtkSearchEntry:
- Add placeholder text
* Fix conflicting type names between gtk and gio
* Gsk:
- Settable filtering for scaled textures
- Add mask nodes
- Some robustness and crash fixes
* Wayland:
- Handle dispatch failing in more places
* Deprecations:
- GtkVolumeButton
* Translation updates:
Belarusian
Chinese (Taiwan)
Georgian
Turkish
Ukrainian
Overview of Changes in 4.9.3, 04-02-2023
========================================
* Add GtkUriLauncher, as replacement for gtk_show_uri
* Add GdkMonitor::description
* Fix problems with tooltip sizing
* Deprecations:
- GtkStatusbar
- GtkAssistant
- GtkLockButton
- gtk_gesture_set_sequence_state
* GtkColumnView:
- Only create widgets for visible columns
* GtkFileDialog:
- Drop shortcut folders API
* GtkCalendar:
- Make marked days work again
* GtkSwitch:
- Make state and active independently settable
* GtkFileChooser:
- Fix a crash with DND
- Fix excessively wide sidebar
- Make context menus work again
* Accessibility:
- Make GtkAccessible public, so it can be implemented outside GTK
- Support accessible implementation for editables
* CSS:
- Fix randomly stopping CSS animations
* GL:
- Fix synchronization with GStreamer
- Fix problems with 3rd party GL in the same thread
* Wayland:
- Fix startup notification with xdg_activation
* Broadway:
- Implement modal windows
* macOS:
- Make DND work
* Build:
- Require graphene 1.10
- Require gobject-introspection 1.72
* Translation updates
Catalan
Galician
German
Hebrew
Indonesian
Portuguese
Russian
Spanish
Swedish
Turkish
Ukrainian
Overview of Changes in 4.9.2, 26-12-2022
========================================
* GtkFileChooserWidget:
- Add a grid view
* GtkText, GtkTextView:
- Fix activation of the on-screen keyboard
- Prevent unexpected text direction changes
* GtkCenterBox:
- Add properties for children
* GtkTreeExpander:
- Add a hide-expander property
* GtkStringList:
- Add a construct-only strings property
* GtkBuilder:
- Support parsing Pango attributes in string form
* GtkGestureStylus:
- Add a stylus-only property
* GtkFileLauncher:
- New async-style api to replace gtk_show_uri
* GtkColorDialog, GtkFontDialog, GtkFileDialog,
GtkAlertDialog:
- APIs have seen some tweaks
- Prefer portals when available
- Fixes for cancellation
* Add GDK_DEBUG=no-portals
* Improve file DND with remote files
* GtkInfoBar has been deprecated
* gtk_widget_show/hide have been deprecated
* gtk_show_uri has been deprecated
* Wayland:
- Fix button mask handling
- Fix problems with cursor size on hi-dpi screens
- Support newer versions of some protocols
- Fix handling of surrounding text in input methods
* X11:
- Fix some ordering problems with surface destruction
* Windows:
- Improved system settings integration
- Fix window resizing work with native decorations
- Include a full hicolor index.theme file as a resource
* Translation updates
Croatian
Dutch
Hungarian
Interlingua
Persian
Turkish
Ukrainian
Overview of Changes in 4.9.1, 31-10-2022
========================================
Note that deprecations are an early outlook at changes
that will appear in an eventual GTK 5 release, which is
still far away. We are introducing deprecations in 4.10
as a way to give users time to adapt, and to provide
feedback on our plans.
* GtkTreeView, GtkIconView, GtkComboBox and * GtkTreeView, GtkIconView, GtkComboBox and
auxiliary classes have been deprecated auxiliary classes have been deprecated
@@ -446,21 +15,7 @@ feedback on our plans.
* gtk_render_ and gtk_snapshot_render_ APIs * gtk_render_ and gtk_snapshot_render_ APIs
have been deprecated have been deprecated
* GtkAppChooser widgets have been deprecated * GtkAppChooser widgets hae been deprecated
* GtkMessageDialog has been deprecated and
replaced by a new async dialog API
* GtkDialog has been deprecated
* GtkColorChooser, GtkFontChooser, GtkFileChooser
interfaces and their implementations have been
deprecated. A new family of async dialog APIs
has been introduced to replace them
* GtkColorDialog, GtkFontDialog, GtkFileDialog
and GtkAlertDialog are new dialog classes with
a consistent and well-bindable API
* GtkMountOperation: * GtkMountOperation:
- Fix the dialog to look reasonable - Fix the dialog to look reasonable
@@ -477,8 +32,6 @@ feedback on our plans.
- Make make debug options available in - Make make debug options available in
non-debug builds non-debug builds
* Increase the memory limit for the jpeg loader to 1G
* Translation updates: * Translation updates:
Abkhazian Abkhazian
Basque Basque

View File

@@ -116,12 +116,19 @@ docs/reference/gtk/html/gtk-building.html
Or [online](https://docs.gtk.org/gtk4/building.html) Or [online](https://docs.gtk.org/gtk4/building.html)
Building from git Default branch renamed to `main`
----------------- --------------------------------
The GTK sources are hosted on [gitlab.gnome.org](http://gitlab.gnome.org). The main The default development branch of GTK has been renamed to `main`.
development branch is called `main`, and stable branches are named after their minor To update your local checkout, use:
version, for example `gtk-4-10`. ```sh
git checkout master
git branch -m master main
git fetch
git branch --unset-upstream
git branch -u origin/main
git symbolic-ref refs/remotes/origin/HEAD refs/remotes/origin/main
```
How to report bugs How to report bugs
------------------ ------------------

View File

@@ -202,36 +202,43 @@ constraint_editor_window_load (ConstraintEditorWindow *self,
} }
static void static void
open_response_cb (GObject *source, open_response_cb (GtkNativeDialog *dialog,
GAsyncResult *result, int response,
void *user_data) ConstraintEditorWindow *self)
{ {
GtkFileDialog *dialog = GTK_FILE_DIALOG (source); gtk_native_dialog_hide (dialog);
ConstraintEditorWindow *self = user_data;
if (response == GTK_RESPONSE_ACCEPT)
{
GFile *file; GFile *file;
file = gtk_file_dialog_open_finish (dialog, result, NULL); file = gtk_file_chooser_get_file (GTK_FILE_CHOOSER (dialog));
if (file)
{
constraint_editor_window_load (self, file); constraint_editor_window_load (self, file);
g_object_unref (file); g_object_unref (file);
} }
gtk_native_dialog_destroy (dialog);
} }
static void static void
open_cb (GtkWidget *button, open_cb (GtkWidget *button,
ConstraintEditorWindow *self) ConstraintEditorWindow *self)
{ {
GtkFileDialog *dialog; GtkFileChooserNative *dialog;
GFile *cwd;
dialog = gtk_file_dialog_new (); dialog = gtk_file_chooser_native_new ("Open file",
gtk_file_dialog_set_title (dialog, "Open file"); GTK_WINDOW (self),
cwd = g_file_new_for_path ("."); GTK_FILE_CHOOSER_ACTION_OPEN,
gtk_file_dialog_set_initial_folder (dialog, cwd); "_Load",
"_Cancel");
gtk_native_dialog_set_modal (GTK_NATIVE_DIALOG (dialog), TRUE);
GFile *cwd = g_file_new_for_path (".");
gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (dialog), cwd, NULL);
g_object_unref (cwd); g_object_unref (cwd);
gtk_file_dialog_open (dialog, GTK_WINDOW (self), NULL, open_response_cb, self);
g_object_unref (dialog); g_signal_connect (dialog, "response", G_CALLBACK (open_response_cb), self);
gtk_native_dialog_show (GTK_NATIVE_DIALOG (dialog));
} }
static void static void
@@ -287,23 +294,22 @@ serialize_model (GListModel *list)
static void static void
save_response_cb (GObject *source, save_response_cb (GtkNativeDialog *dialog,
GAsyncResult *result, int response,
void *user_data) ConstraintEditorWindow *self)
{ {
GtkFileDialog *dialog = GTK_FILE_DIALOG (source); gtk_native_dialog_hide (dialog);
ConstraintEditorWindow *self = user_data;
GFile *file;
file = gtk_file_dialog_save_finish (dialog, result, NULL); if (response == GTK_RESPONSE_ACCEPT)
if (file)
{ {
GListModel *model; GListModel *model;
GFile *file;
char *text; char *text;
GError *error = NULL; GError *error = NULL;
model = constraint_view_get_model (CONSTRAINT_VIEW (self->view)); model = constraint_view_get_model (CONSTRAINT_VIEW (self->view));
text = serialize_model (model); text = serialize_model (model);
file = gtk_file_chooser_get_file (GTK_FILE_CHOOSER (dialog));
g_file_replace_contents (file, text, strlen (text), g_file_replace_contents (file, text, strlen (text),
NULL, FALSE, NULL, FALSE,
G_FILE_CREATE_NONE, G_FILE_CREATE_NONE,
@@ -312,38 +318,46 @@ save_response_cb (GObject *source,
&error); &error);
if (error != NULL) if (error != NULL)
{ {
GtkAlertDialog *alert; GtkWidget *message_dialog;
alert = gtk_alert_dialog_new ("Saving failed"); message_dialog = gtk_message_dialog_new (GTK_WINDOW (gtk_widget_get_root (GTK_WIDGET (self))),
gtk_alert_dialog_set_detail (alert, error->message); GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT,
gtk_alert_dialog_show (alert, GTK_MESSAGE_INFO,
GTK_WINDOW (gtk_widget_get_root (GTK_WIDGET (self)))); GTK_BUTTONS_OK,
g_object_unref (alert); "Saving failed");
gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (message_dialog),
"%s", error->message);
g_signal_connect (message_dialog, "response", G_CALLBACK (gtk_window_destroy), NULL);
gtk_widget_show (message_dialog);
g_error_free (error); g_error_free (error);
} }
g_free (text); g_free (text);
g_object_unref (file); g_object_unref (file);
} }
gtk_native_dialog_destroy (dialog);
} }
static void static void
save_cb (GtkWidget *button, save_cb (GtkWidget *button,
ConstraintEditorWindow *self) ConstraintEditorWindow *self)
{ {
GtkFileDialog *dialog; GtkFileChooserNative *dialog;
GFile *cwd;
dialog = gtk_file_dialog_new (); dialog = gtk_file_chooser_native_new ("Save constraints",
gtk_file_dialog_set_title (dialog, "Save constraints");
cwd = g_file_new_for_path (".");
gtk_file_dialog_set_initial_folder (dialog, cwd);
g_object_unref (cwd);
gtk_file_dialog_save (dialog,
GTK_WINDOW (gtk_widget_get_root (GTK_WIDGET (button))), GTK_WINDOW (gtk_widget_get_root (GTK_WIDGET (button))),
NULL, GTK_FILE_CHOOSER_ACTION_SAVE,
save_response_cb, self); "_Save",
g_object_unref (dialog); "_Cancel");
gtk_native_dialog_set_modal (GTK_NATIVE_DIALOG (dialog), TRUE);
GFile *cwd = g_file_new_for_path (".");
gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (dialog), cwd, NULL);
g_object_unref (cwd);
g_signal_connect (dialog, "response", G_CALLBACK (save_response_cb), self);
gtk_native_dialog_show (GTK_NATIVE_DIALOG (dialog));
} }
static void static void
@@ -426,7 +440,7 @@ edit_constraint (ConstraintEditorWindow *win,
g_signal_connect (editor, "done", G_CALLBACK (constraint_editor_done), win); g_signal_connect (editor, "done", G_CALLBACK (constraint_editor_done), win);
gtk_window_present (GTK_WINDOW (window)); gtk_widget_show (window);
} }
static void static void
@@ -459,7 +473,7 @@ edit_guide (ConstraintEditorWindow *win,
gtk_window_set_child (GTK_WINDOW (window), GTK_WIDGET (editor)); gtk_window_set_child (GTK_WINDOW (window), GTK_WIDGET (editor));
g_signal_connect (editor, "done", G_CALLBACK (guide_editor_done), win); g_signal_connect (editor, "done", G_CALLBACK (guide_editor_done), win);
gtk_window_present (GTK_WINDOW (window)); gtk_widget_show (window);
} }
static void static void

View File

@@ -9,7 +9,7 @@ constraint_editor_sources = [
constraint_editor_resources = gnome.compile_resources('constraint_editor_resources', constraint_editor_resources = gnome.compile_resources('constraint_editor_resources',
'constraint-editor.gresource.xml', 'constraint-editor.gresource.xml',
source_dir: meson.current_source_dir(), source_dir: '.',
) )
executable('gtk4-constraint-editor', executable('gtk4-constraint-editor',

View File

@@ -2,8 +2,6 @@
#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;
@@ -35,12 +33,22 @@ static void create_window (GApplication *app, const char *contents);
static void static void
show_action_dialog (GSimpleAction *action) show_action_dialog (GSimpleAction *action)
{ {
GtkAlertDialog *dialog; const char *name;
GtkWidget *dialog;
dialog = gtk_alert_dialog_new ("You activated action: \"%s\n", name = g_action_get_name (G_ACTION (action));
g_action_get_name (G_ACTION (action)));
gtk_alert_dialog_show (dialog, NULL); dialog = gtk_message_dialog_new (NULL,
g_object_unref (dialog); GTK_DIALOG_DESTROY_WITH_PARENT,
GTK_MESSAGE_INFO,
GTK_BUTTONS_CLOSE,
"You activated action: \"%s\"",
name);
g_signal_connect (dialog, "response",
G_CALLBACK (gtk_window_destroy), NULL);
gtk_widget_show (dialog);
} }
static void static void
@@ -59,7 +67,7 @@ show_action_infobar (GSimpleAction *action,
text = g_strdup_printf ("You activated radio action: \"%s\".\n" text = g_strdup_printf ("You activated radio action: \"%s\".\n"
"Current value: %s", name, value); "Current value: %s", name, value);
gtk_label_set_text (GTK_LABEL (window->message), text); gtk_label_set_text (GTK_LABEL (window->message), text);
gtk_widget_set_visible (window->infobar, TRUE); gtk_widget_show (window->infobar);
g_free (text); g_free (text);
} }
@@ -82,38 +90,43 @@ activate_new (GSimpleAction *action,
} }
static void static void
open_response_cb (GObject *source, open_response_cb (GtkNativeDialog *dialog,
GAsyncResult *result, int response_id,
gpointer user_data) gpointer user_data)
{ {
GtkFileDialog *dialog = GTK_FILE_DIALOG (source); GtkFileChooserNative *native = user_data;
GApplication *app = G_APPLICATION (user_data); GApplication *app = g_object_get_data (G_OBJECT (native), "app");
GtkWidget *message_dialog;
GFile *file; GFile *file;
char *contents;
GError *error = NULL; GError *error = NULL;
file = gtk_file_dialog_open_finish (dialog, result, &error); if (response_id == GTK_RESPONSE_ACCEPT)
if (file)
{ {
char *contents; file = gtk_file_chooser_get_file (GTK_FILE_CHOOSER (native));
if (g_file_load_contents (file, NULL, &contents, NULL, NULL, &error)) if (g_file_load_contents (file, NULL, &contents, NULL, NULL, &error))
{ {
create_window (app, contents); create_window (app, contents);
g_free (contents); g_free (contents);
} }
} else
if (error)
{ {
GtkAlertDialog *alert; message_dialog = gtk_message_dialog_new (NULL,
GTK_DIALOG_DESTROY_WITH_PARENT,
alert = gtk_alert_dialog_new ("Error loading file: \"%s\"", error->message); GTK_MESSAGE_ERROR,
gtk_alert_dialog_show (alert, NULL); GTK_BUTTONS_CLOSE,
g_object_unref (alert); "Error loading file: \"%s\"",
error->message);
g_signal_connect (message_dialog, "response",
G_CALLBACK (gtk_window_destroy), NULL);
gtk_widget_show (message_dialog);
g_error_free (error); g_error_free (error);
} }
}
g_object_unref (app); gtk_native_dialog_destroy (GTK_NATIVE_DIALOG (native));
g_object_unref (native);
} }
@@ -123,11 +136,21 @@ activate_open (GSimpleAction *action,
gpointer user_data) gpointer user_data)
{ {
GApplication *app = user_data; GApplication *app = user_data;
GtkFileDialog *dialog; GtkFileChooserNative *native;
dialog = gtk_file_dialog_new (); native = gtk_file_chooser_native_new ("Open File",
gtk_file_dialog_open (dialog, NULL, NULL, open_response_cb, g_object_ref (app)); NULL,
g_object_unref (dialog); GTK_FILE_CHOOSER_ACTION_OPEN,
"_Open",
"_Cancel");
g_object_set_data_full (G_OBJECT (native), "app", g_object_ref (app), g_object_unref);
g_signal_connect (native,
"response",
G_CALLBACK (open_response_cb),
native);
gtk_native_dialog_show (GTK_NATIVE_DIALOG (native));
} }
static void static void
@@ -297,7 +320,7 @@ static GActionEntry win_entries[] = {
static void static void
clicked_cb (GtkWidget *widget, DemoApplicationWindow *window) clicked_cb (GtkWidget *widget, DemoApplicationWindow *window)
{ {
gtk_widget_set_visible (window->infobar, FALSE); gtk_widget_hide (window->infobar);
} }
static void static void

View File

@@ -7,8 +7,6 @@
#include <gtk/gtk.h> #include <gtk/gtk.h>
G_GNUC_BEGIN_IGNORE_DEPRECATIONS
static GtkWidget *progress_bar = NULL; static GtkWidget *progress_bar = NULL;
static gboolean static gboolean
@@ -142,6 +140,7 @@ create_page3 (GtkWidget *assistant)
label = gtk_label_new ("This is a confirmation page, press 'Apply' to apply changes"); label = gtk_label_new ("This is a confirmation page, press 'Apply' to apply changes");
gtk_widget_show (label);
gtk_assistant_append_page (GTK_ASSISTANT (assistant), label); gtk_assistant_append_page (GTK_ASSISTANT (assistant), label);
gtk_assistant_set_page_type (GTK_ASSISTANT (assistant), label, GTK_ASSISTANT_PAGE_CONFIRM); gtk_assistant_set_page_type (GTK_ASSISTANT (assistant), label, GTK_ASSISTANT_PAGE_CONFIRM);
gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), label, TRUE); gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), label, TRUE);
@@ -158,6 +157,7 @@ create_page4 (GtkWidget *assistant)
gtk_widget_set_margin_start (progress_bar, 40); gtk_widget_set_margin_start (progress_bar, 40);
gtk_widget_set_margin_end (progress_bar, 40); gtk_widget_set_margin_end (progress_bar, 40);
gtk_widget_show (progress_bar);
gtk_assistant_append_page (GTK_ASSISTANT (assistant), progress_bar); gtk_assistant_append_page (GTK_ASSISTANT (assistant), progress_bar);
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");
@@ -199,7 +199,7 @@ do_assistant (GtkWidget *do_widget)
} }
if (!gtk_widget_get_visible (assistant)) if (!gtk_widget_get_visible (assistant))
gtk_widget_set_visible (assistant, TRUE); gtk_widget_show (assistant);
else else
gtk_window_destroy (GTK_WINDOW (assistant)); gtk_window_destroy (GTK_WINDOW (assistant));

View File

@@ -297,13 +297,12 @@ blur_overlay_snapshot (GtkWidget *widget,
GtkWidget *main_widget; GtkWidget *main_widget;
GskRenderNode *main_widget_node = NULL; GskRenderNode *main_widget_node = NULL;
GtkWidget *child; GtkWidget *child;
int width, height; GtkAllocation main_alloc;
cairo_region_t *clip = NULL; cairo_region_t *clip = NULL;
int i; int i;
main_widget = BLUR_OVERLAY (widget)->main_widget; main_widget = BLUR_OVERLAY (widget)->main_widget;
width = gtk_widget_get_width (widget); gtk_widget_get_allocation (widget, &main_alloc);
height = gtk_widget_get_height (widget);
for (child = gtk_widget_get_first_child (widget); for (child = gtk_widget_get_first_child (widget);
child != NULL; child != NULL;
@@ -316,7 +315,7 @@ blur_overlay_snapshot (GtkWidget *widget,
if (blur > 0) if (blur > 0)
{ {
cairo_rectangle_int_t rect; GtkAllocation alloc;
graphene_rect_t bounds; graphene_rect_t bounds;
if (main_widget_node == NULL) if (main_widget_node == NULL)
@@ -328,8 +327,8 @@ blur_overlay_snapshot (GtkWidget *widget,
main_widget_node = gtk_snapshot_free_to_node (child_snapshot); main_widget_node = gtk_snapshot_free_to_node (child_snapshot);
} }
if (!gtk_widget_compute_bounds (child, gtk_widget_get_parent (child), &bounds)) gtk_widget_get_allocation (child, &alloc);
graphene_rect_init (&bounds, 0, 0, 0, 0); graphene_rect_init (&bounds, alloc.x, alloc.y, alloc.width, alloc.height);
gtk_snapshot_push_blur (snapshot, blur); gtk_snapshot_push_blur (snapshot, blur);
gtk_snapshot_push_clip (snapshot, &bounds); gtk_snapshot_push_clip (snapshot, &bounds);
gtk_snapshot_append_node (snapshot, main_widget_node); gtk_snapshot_append_node (snapshot, main_widget_node);
@@ -338,17 +337,13 @@ blur_overlay_snapshot (GtkWidget *widget,
if (clip == NULL) if (clip == NULL)
{ {
cairo_rectangle_int_t rect;
rect.x = rect.y = 0; rect.x = rect.y = 0;
rect.width = width; rect.width = main_alloc.width;
rect.height = height; rect.height = main_alloc.height;
clip = cairo_region_create_rectangle (&rect); clip = cairo_region_create_rectangle (&rect);
} }
cairo_region_subtract_rectangle (clip, (cairo_rectangle_int_t *)&alloc);
rect.x = floor (bounds.origin.x);
rect.y = floor (bounds.origin.y);
rect.width = ceil (bounds.origin.x + bounds.size.width - rect.x);
rect.height = ceil (bounds.origin.y + bounds.size.height - rect.y);
cairo_region_subtract_rectangle (clip, &rect);
} }
} }

View File

@@ -37,8 +37,6 @@ remove_timeout (gpointer data)
g_source_remove (id); g_source_remove (id);
} }
G_GNUC_BEGIN_IGNORE_DEPRECATIONS
static gboolean static gboolean
pop_status (gpointer data) pop_status (gpointer data)
{ {
@@ -59,8 +57,6 @@ status_message (GtkStatusbar *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,
@@ -172,7 +168,7 @@ do_builder (GtkWidget *do_widget)
} }
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
gtk_widget_set_visible (window, TRUE); gtk_widget_show (window);
else else
gtk_window_destroy (GTK_WINDOW (window)); gtk_window_destroy (GTK_WINDOW (window));

View File

@@ -1,5 +1,4 @@
/* Clipboard /* Clipboard
* #Keywords: drag-and-drop, dnd
* *
* GdkClipboard is used for clipboard handling. This demo shows how to * GdkClipboard is used for clipboard handling. This demo shows how to
* copy and paste text, images, colors or files to and from the clipboard. * copy and paste text, images, colors or files to and from the clipboard.
@@ -51,10 +50,10 @@ copy_button_clicked (GtkStack *source_stack,
} }
else if (strcmp (visible_child_name, "Color") == 0) else if (strcmp (visible_child_name, "Color") == 0)
{ {
const GdkRGBA *color; GdkRGBA color;
color = gtk_color_dialog_button_get_rgba (GTK_COLOR_DIALOG_BUTTON (visible_child)); gtk_color_chooser_get_rgba (GTK_COLOR_CHOOSER (visible_child), &color);
gdk_clipboard_set (clipboard, GDK_TYPE_RGBA, color); gdk_clipboard_set (clipboard, GDK_TYPE_RGBA, &color);
} }
else if (strcmp (visible_child_name, "File") == 0) else if (strcmp (visible_child_name, "File") == 0)
{ {
@@ -216,71 +215,37 @@ file_button_set_file (GtkButton *button,
} }
static void static void
file_chooser_response (GObject *source, file_chooser_response (GtkNativeDialog *dialog,
GAsyncResult *result, int response,
gpointer user_data) GtkButton *button)
{ {
GtkFileDialog *dialog = GTK_FILE_DIALOG (source); gtk_native_dialog_hide (dialog);
GtkButton *button = GTK_BUTTON (user_data);
GFile *file;
file = gtk_file_dialog_open_finish (dialog, result, NULL); if (response == GTK_RESPONSE_ACCEPT)
if (file)
{ {
GFile *file = gtk_file_chooser_get_file (GTK_FILE_CHOOSER (dialog));
file_button_set_file (button, file); file_button_set_file (button, file);
g_object_unref (file); g_object_unref (file);
update_copy_button_sensitivity (gtk_widget_get_ancestor (GTK_WIDGET (button), GTK_TYPE_STACK)); update_copy_button_sensitivity (gtk_widget_get_ancestor (GTK_WIDGET (button), GTK_TYPE_STACK));
} }
gtk_native_dialog_destroy (dialog);
} }
static void static void
open_file_cb (GtkWidget *button) open_file_cb (GtkWidget *button)
{ {
GtkFileDialog *dialog; GtkFileChooserNative *chooser;
dialog = gtk_file_dialog_new (); chooser = gtk_file_chooser_native_new ("Choose a file",
gtk_file_dialog_open (dialog,
GTK_WINDOW (gtk_widget_get_ancestor (button, GTK_TYPE_WINDOW)), GTK_WINDOW (gtk_widget_get_ancestor (button, GTK_TYPE_WINDOW)),
NULL, GTK_FILE_CHOOSER_ACTION_OPEN,
file_chooser_response, button); "_Open",
"_Cancel");
g_object_unref (dialog); g_signal_connect (chooser, "response", G_CALLBACK (file_chooser_response), button);
} gtk_native_dialog_show (GTK_NATIVE_DIALOG (chooser));
static void
folder_chooser_response (GObject *source,
GAsyncResult *result,
gpointer user_data)
{
GtkFileDialog *dialog = GTK_FILE_DIALOG (source);
GtkButton *button = GTK_BUTTON (user_data);
GFile *file;
file = gtk_file_dialog_select_folder_finish (dialog, result, NULL);
if (file)
{
file_button_set_file (button, file);
g_object_unref (file);
update_copy_button_sensitivity (gtk_widget_get_ancestor (GTK_WIDGET (button), GTK_TYPE_STACK));
}
}
static void
open_folder_cb (GtkWidget *button)
{
GtkFileDialog *dialog;
dialog = gtk_file_dialog_new ();
gtk_file_dialog_select_folder (dialog,
GTK_WINDOW (gtk_widget_get_ancestor (button, GTK_TYPE_WINDOW)),
NULL,
folder_chooser_response, button);
g_object_unref (dialog);
} }
static void static void
@@ -381,7 +346,6 @@ do_clipboard (GtkWidget *do_widget)
gtk_builder_cscope_add_callback (scope, source_changed_cb); gtk_builder_cscope_add_callback (scope, source_changed_cb);
gtk_builder_cscope_add_callback (scope, text_changed_cb); gtk_builder_cscope_add_callback (scope, text_changed_cb);
gtk_builder_cscope_add_callback (scope, open_file_cb); gtk_builder_cscope_add_callback (scope, open_file_cb);
gtk_builder_cscope_add_callback (scope, open_folder_cb);
gtk_builder_cscope_add_callback (scope, on_drop); gtk_builder_cscope_add_callback (scope, on_drop);
gtk_builder_cscope_add_callback (scope, drag_prepare); gtk_builder_cscope_add_callback (scope, drag_prepare);
builder = gtk_builder_new (); builder = gtk_builder_new ();
@@ -405,7 +369,7 @@ do_clipboard (GtkWidget *do_widget)
} }
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
gtk_widget_set_visible (window, TRUE); gtk_widget_show (window);
else else
gtk_window_destroy (GTK_WINDOW (window)); gtk_window_destroy (GTK_WINDOW (window));

View File

@@ -32,7 +32,6 @@
<item>Color</item> <item>Color</item>
<item>Image</item> <item>Image</item>
<item>File</item> <item>File</item>
<item>Folder</item>
</items> </items>
</object> </object>
</property> </property>
@@ -65,11 +64,7 @@
<object class="GtkStackPage"> <object class="GtkStackPage">
<property name="name">Color</property> <property name="name">Color</property>
<property name="child"> <property name="child">
<object class="GtkColorDialogButton" id="source_color"> <object class="GtkColorButton" id="source_color">
<property name="dialog">
<object class="GtkColorDialog">
</object>
</property>
<property name="valign">center</property> <property name="valign">center</property>
<property name="rgba">purple</property> <property name="rgba">purple</property>
</object> </object>
@@ -167,30 +162,6 @@
</property> </property>
</object> </object>
</child> </child>
<child>
<object class="GtkStackPage">
<property name="name">Folder</property>
<property name="child">
<object class="GtkButton" id="source_folder">
<child>
<object class="GtkDragSource">
<property name="propagation-phase">capture</property>
<signal name="prepare" handler="drag_prepare"/>
</object>
</child>
<property name="valign">center</property>
<property name="child">
<object class="GtkLabel">
<property name="label">—</property>
<property name="xalign">0</property>
<property name="ellipsize">start</property>
</object>
</property>
<signal name="clicked" handler="open_folder_cb"/>
</object>
</property>
</object>
</child>
</object> </object>
</child> </child>
<child> <child>

View File

@@ -449,7 +449,7 @@ do_combobox (GtkWidget *do_widget)
} }
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
gtk_widget_set_visible (window, TRUE); gtk_widget_show (window);
else else
gtk_window_destroy (GTK_WINDOW (window)); gtk_window_destroy (GTK_WINDOW (window));

View File

@@ -277,7 +277,7 @@ do_constraints (GtkWidget *do_widget)
} }
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
gtk_widget_set_visible (window, TRUE); gtk_widget_show (window);
else else
gtk_window_destroy (GTK_WINDOW (window)); gtk_window_destroy (GTK_WINDOW (window));

View File

@@ -66,7 +66,7 @@ do_constraints_builder (GtkWidget *do_widget)
} }
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
gtk_widget_set_visible (window, TRUE); gtk_widget_show (window);
else else
gtk_window_destroy (GTK_WINDOW (window)); gtk_window_destroy (GTK_WINDOW (window));

View File

@@ -229,7 +229,7 @@ do_constraints_interactive (GtkWidget *do_widget)
} }
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
gtk_widget_set_visible (window, TRUE); gtk_widget_show (window);
else else
gtk_window_destroy (GTK_WINDOW (window)); gtk_window_destroy (GTK_WINDOW (window));

View File

@@ -152,7 +152,7 @@ do_constraints_vfl (GtkWidget *do_widget)
} }
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
gtk_widget_set_visible (window, TRUE); gtk_widget_show (window);
else else
gtk_window_destroy (GTK_WINDOW (window)); gtk_window_destroy (GTK_WINDOW (window));

View File

@@ -68,7 +68,7 @@ do_css_accordion (GtkWidget *do_widget)
} }
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
gtk_widget_set_visible (window, TRUE); gtk_widget_show (window);
else else
gtk_window_destroy (GTK_WINDOW (window)); gtk_window_destroy (GTK_WINDOW (window));

View File

@@ -115,7 +115,7 @@ do_css_basics (GtkWidget *do_widget)
} }
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
gtk_widget_set_visible (window, TRUE); gtk_widget_show (window);
else else
gtk_window_destroy (GTK_WINDOW (window)); gtk_window_destroy (GTK_WINDOW (window));

View File

@@ -139,7 +139,7 @@ do_css_blendmodes (GtkWidget *do_widget)
} }
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
gtk_widget_set_visible (window, TRUE); gtk_widget_show (window);
else else
gtk_window_destroy (GTK_WINDOW (window)); gtk_window_destroy (GTK_WINDOW (window));

View File

@@ -155,7 +155,7 @@ do_css_multiplebgs (GtkWidget *do_widget)
} }
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
gtk_widget_set_visible (window, TRUE); gtk_widget_show (window);
else else
gtk_window_destroy (GTK_WINDOW (window)); gtk_window_destroy (GTK_WINDOW (window));

View File

@@ -124,7 +124,7 @@ do_css_pixbufs (GtkWidget *do_widget)
} }
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
gtk_widget_set_visible (window, TRUE); gtk_widget_show (window);
else else
gtk_window_destroy (GTK_WINDOW (window)); gtk_window_destroy (GTK_WINDOW (window));

View File

@@ -142,7 +142,7 @@ do_css_shadows (GtkWidget *do_widget)
} }
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
gtk_widget_set_visible (window, TRUE); gtk_widget_show (window);
else else
gtk_window_destroy (GTK_WINDOW (window)); gtk_window_destroy (GTK_WINDOW (window));

View File

@@ -33,7 +33,7 @@ do_cursors (GtkWidget *do_widget)
} }
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
gtk_widget_set_visible (window, TRUE); gtk_widget_show (window);
else else
gtk_window_destroy (GTK_WINDOW (window)); gtk_window_destroy (GTK_WINDOW (window));

View File

@@ -43,7 +43,7 @@
<file>cssview.css</file> <file>cssview.css</file>
<file>reset.css</file> <file>reset.css</file>
</gresource> </gresource>
<gresource prefix="/listview_selections"> <gresource prefix="/dropdown">
<file>suggestionentry.h</file> <file>suggestionentry.h</file>
<file>suggestionentry.c</file> <file>suggestionentry.c</file>
<file>suggestionentry.css</file> <file>suggestionentry.css</file>
@@ -215,12 +215,6 @@
<file>demo3widget.h</file> <file>demo3widget.h</file>
<file>demo3widget.ui</file> <file>demo3widget.ui</file>
</gresource> </gresource>
<gresource prefix="/mask">
<file>demo4widget.c</file>
<file>demo4widget.h</file>
<file>hsla.h</file>
<file>hsla.c</file>
</gresource>
<gresource prefix="/paintable_svg"> <gresource prefix="/paintable_svg">
<file>svgpaintable.h</file> <file>svgpaintable.h</file>
<file>svgpaintable.c</file> <file>svgpaintable.c</file>
@@ -274,6 +268,7 @@
<file>cursors.c</file> <file>cursors.c</file>
<file>dialog.c</file> <file>dialog.c</file>
<file>drawingarea.c</file> <file>drawingarea.c</file>
<file>dropdown.c</file>
<file>dnd.c</file> <file>dnd.c</file>
<file>editable_cells.c</file> <file>editable_cells.c</file>
<file>entry_completion.c</file> <file>entry_completion.c</file>
@@ -297,7 +292,6 @@
<file>iconscroll.c</file> <file>iconscroll.c</file>
<file>iconview.c</file> <file>iconview.c</file>
<file>iconview_edit.c</file> <file>iconview_edit.c</file>
<file>image_scaling.c</file>
<file>images.c</file> <file>images.c</file>
<file>infobar.c</file> <file>infobar.c</file>
<file>layoutmanager.c</file> <file>layoutmanager.c</file>
@@ -310,7 +304,6 @@
<file>listview_clocks.c</file> <file>listview_clocks.c</file>
<file>listview_filebrowser.c</file> <file>listview_filebrowser.c</file>
<file>listview_minesweeper.c</file> <file>listview_minesweeper.c</file>
<file>listview_selections.c</file>
<file>listview_settings.c</file> <file>listview_settings.c</file>
<file>listview_ucd.c</file> <file>listview_ucd.c</file>
<file>listview_weather.c</file> <file>listview_weather.c</file>
@@ -318,7 +311,7 @@
<file>list_store.c</file> <file>list_store.c</file>
<file>main.c</file> <file>main.c</file>
<file>markup.c</file> <file>markup.c</file>
<file>mask.c</file> <file>menu.c</file>
<file>overlay.c</file> <file>overlay.c</file>
<file>overlay_decorative.c</file> <file>overlay_decorative.c</file>
<file>paint.c</file> <file>paint.c</file>

View File

@@ -3,20 +3,16 @@
enum enum
{ {
PROP_TEXTURE = 1, PROP_PAINTABLE = 1,
PROP_FILTER, PROP_SCALE
PROP_SCALE,
PROP_ANGLE,
}; };
struct _Demo3Widget struct _Demo3Widget
{ {
GtkWidget parent_instance; GtkWidget parent_instance;
GdkTexture *texture; GdkPaintable *paintable;
float scale; float scale;
float angle;
GskScalingFilter filter;
GtkWidget *menu; GtkWidget *menu;
}; };
@@ -28,86 +24,10 @@ struct _Demo3WidgetClass
G_DEFINE_TYPE (Demo3Widget, demo3_widget, GTK_TYPE_WIDGET) G_DEFINE_TYPE (Demo3Widget, demo3_widget, GTK_TYPE_WIDGET)
static gboolean
query_tooltip (GtkWidget *widget,
int x,
int y,
gboolean keyboard_mode,
GtkTooltip *tooltip,
gpointer data)
{
Demo3Widget *self = DEMO3_WIDGET (widget);
GtkWidget *grid;
GtkWidget *label;
char *s, *s2;
const char *filter[] = { "Linear", "Nearest", "Trilinear" };
int precision, l;
grid = gtk_grid_new ();
gtk_grid_set_column_spacing (GTK_GRID (grid), 12);
gtk_grid_set_row_spacing (GTK_GRID (grid), 6);
label = gtk_label_new ("Texture");
gtk_label_set_xalign (GTK_LABEL (label), 0);
gtk_grid_attach (GTK_GRID (grid), label, 0, 0, 1, 1);
s = g_strdup_printf ("%d\342\200\206\303\227\342\200\206%d",
gdk_texture_get_width (self->texture),
gdk_texture_get_height (self->texture));
label = gtk_label_new (s);
g_free (s);
gtk_label_set_xalign (GTK_LABEL (label), 1);
gtk_grid_attach (GTK_GRID (grid), label, 1, 0, 1, 1);
label = gtk_label_new ("Rotation");
gtk_label_set_xalign (GTK_LABEL (label), 0);
gtk_grid_attach (GTK_GRID (grid), label, 0, 1, 1, 1);
s = g_strdup_printf ("%.1f", self->angle);
if (g_str_has_suffix (s, ".0"))
s[strlen (s) - 2] = '\0';
s2 = g_strconcat (s, "\302\260", NULL);
label = gtk_label_new (s2);
g_free (s2);
g_free (s);
gtk_label_set_xalign (GTK_LABEL (label), 1);
gtk_grid_attach (GTK_GRID (grid), label, 1, 1, 1, 1);
label = gtk_label_new ("Scale");
gtk_label_set_xalign (GTK_LABEL (label), 0);
gtk_grid_attach (GTK_GRID (grid), label, 0, 2, 1, 1);
precision = 1;
do {
s = g_strdup_printf ("%.*f", precision, self->scale);
l = strlen (s) - 1;
while (s[l] == '0')
l--;
if (s[l] == '.')
s[l] = '\0';
precision++;
} while (strcmp (s, "0") == 0);
label = gtk_label_new (s);
g_free (s);
gtk_label_set_xalign (GTK_LABEL (label), 1);
gtk_grid_attach (GTK_GRID (grid), label, 1, 2, 1, 1);
label = gtk_label_new ("Filter");
gtk_label_set_xalign (GTK_LABEL (label), 0);
gtk_grid_attach (GTK_GRID (grid), label, 0, 3, 1, 1);
label = gtk_label_new (filter[self->filter]);
gtk_label_set_xalign (GTK_LABEL (label), 1);
gtk_grid_attach (GTK_GRID (grid), label, 1, 3, 1, 1);
gtk_tooltip_set_custom (tooltip, grid);
return TRUE;
}
static void static void
demo3_widget_init (Demo3Widget *self) demo3_widget_init (Demo3Widget *self)
{ {
self->scale = 1.f; self->scale = 1.f;
self->angle = 0.f;
self->filter = GSK_SCALING_FILTER_LINEAR;
gtk_widget_init_template (GTK_WIDGET (self)); gtk_widget_init_template (GTK_WIDGET (self));
} }
@@ -116,7 +36,7 @@ demo3_widget_dispose (GObject *object)
{ {
Demo3Widget *self = DEMO3_WIDGET (object); Demo3Widget *self = DEMO3_WIDGET (object);
g_clear_object (&self->texture); g_clear_object (&self->paintable);
gtk_widget_dispose_template (GTK_WIDGET (self), DEMO3_TYPE_WIDGET); gtk_widget_dispose_template (GTK_WIDGET (self), DEMO3_TYPE_WIDGET);
@@ -129,35 +49,21 @@ demo3_widget_snapshot (GtkWidget *widget,
{ {
Demo3Widget *self = DEMO3_WIDGET (widget); Demo3Widget *self = DEMO3_WIDGET (widget);
int x, y, width, height; int x, y, width, height;
double w, h, w2, h2; double w, h;
width = gtk_widget_get_width (widget); width = gtk_widget_get_width (widget);
height = gtk_widget_get_height (widget); height = gtk_widget_get_height (widget);
w2 = w = self->scale * gdk_texture_get_width (self->texture); w = self->scale * gdk_paintable_get_intrinsic_width (self->paintable);
h2 = h = self->scale * gdk_texture_get_height (self->texture); h = self->scale * gdk_paintable_get_intrinsic_height (self->paintable);
if (G_APPROX_VALUE (self->angle, 90.f, FLT_EPSILON) || x = MAX (0, (width - ceil (w)) / 2);
G_APPROX_VALUE (self->angle, 270.f, FLT_EPSILON)) y = MAX (0, (height - ceil (h)) / 2);
{
double s = w2;
w2 = h2;
h2 = s;
}
x = (width - ceil (w2)) / 2;
y = (height - ceil (h2)) / 2;
gtk_snapshot_push_clip (snapshot, &GRAPHENE_RECT_INIT (0, 0, width, height)); gtk_snapshot_push_clip (snapshot, &GRAPHENE_RECT_INIT (0, 0, width, height));
gtk_snapshot_save (snapshot); gtk_snapshot_save (snapshot);
gtk_snapshot_translate (snapshot, &GRAPHENE_POINT_INIT (x, y)); gtk_snapshot_translate (snapshot, &GRAPHENE_POINT_INIT (x, y));
gtk_snapshot_translate (snapshot, &GRAPHENE_POINT_INIT (w2 / 2, h2 / 2)); gdk_paintable_snapshot (self->paintable, snapshot, w, h);
gtk_snapshot_rotate (snapshot, self->angle);
gtk_snapshot_translate (snapshot, &GRAPHENE_POINT_INIT (- w / 2, - h / 2));
gtk_snapshot_append_scaled_texture (snapshot,
self->texture,
self->filter,
&GRAPHENE_RECT_INIT (0, 0, w, h));
gtk_snapshot_restore (snapshot); gtk_snapshot_restore (snapshot);
gtk_snapshot_pop (snapshot); gtk_snapshot_pop (snapshot);
} }
@@ -172,26 +78,14 @@ demo3_widget_measure (GtkWidget *widget,
int *natural_baseline) int *natural_baseline)
{ {
Demo3Widget *self = DEMO3_WIDGET (widget); Demo3Widget *self = DEMO3_WIDGET (widget);
int width, height;
int size; int size;
width = gdk_texture_get_width (self->texture);
height = gdk_texture_get_height (self->texture);
if (G_APPROX_VALUE (self->angle, 90.f, FLT_EPSILON) ||
G_APPROX_VALUE (self->angle, 270.f, FLT_EPSILON))
{
int s = width;
width = height;
height = s;
}
if (orientation == GTK_ORIENTATION_HORIZONTAL) if (orientation == GTK_ORIENTATION_HORIZONTAL)
size = width; size = gdk_paintable_get_intrinsic_width (self->paintable);
else else
size = height; size = gdk_paintable_get_intrinsic_height (self->paintable);
*minimum = *natural = (int) ceil (self->scale * size); *minimum = *natural = self->scale * size;
} }
static void static void
@@ -209,8 +103,6 @@ demo3_widget_size_allocate (GtkWidget *widget,
gtk_popover_present (GTK_POPOVER (self->menu)); gtk_popover_present (GTK_POPOVER (self->menu));
} }
static void update_actions (Demo3Widget *self);
static void static void
demo3_widget_set_property (GObject *object, demo3_widget_set_property (GObject *object,
guint prop_id, guint prop_id,
@@ -221,32 +113,14 @@ demo3_widget_set_property (GObject *object,
switch (prop_id) switch (prop_id)
{ {
case PROP_TEXTURE: case PROP_PAINTABLE:
g_clear_object (&self->texture); g_clear_object (&self->paintable);
self->texture = g_value_dup_object (value); self->paintable = g_value_dup_object (value);
self->scale = 1.f;
self->angle = 0.f;
self->filter = GSK_SCALING_FILTER_LINEAR;
update_actions (self);
gtk_widget_queue_resize (GTK_WIDGET (object)); gtk_widget_queue_resize (GTK_WIDGET (object));
g_object_notify (object, "scale");
g_object_notify (object, "angle");
g_object_notify (object, "filter");
break; break;
case PROP_SCALE: case PROP_SCALE:
self->scale = g_value_get_float (value); self->scale = g_value_get_float (value);
update_actions (self);
gtk_widget_queue_resize (GTK_WIDGET (object));
break;
case PROP_ANGLE:
self->angle = fmodf (g_value_get_float (value), 360.f);
gtk_widget_queue_resize (GTK_WIDGET (object));
break;
case PROP_FILTER:
self->filter = g_value_get_enum (value);
gtk_widget_queue_resize (GTK_WIDGET (object)); gtk_widget_queue_resize (GTK_WIDGET (object));
break; break;
@@ -266,22 +140,14 @@ demo3_widget_get_property (GObject *object,
switch (prop_id) switch (prop_id)
{ {
case PROP_TEXTURE: case PROP_PAINTABLE:
g_value_set_object (value, self->texture); g_value_set_object (value, self->paintable);
break; break;
case PROP_SCALE: case PROP_SCALE:
g_value_set_float (value, self->scale); g_value_set_float (value, self->scale);
break; break;
case PROP_ANGLE:
g_value_set_float (value, self->angle);
break;
case PROP_FILTER:
g_value_set_enum (value, self->filter);
break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break; break;
@@ -303,14 +169,6 @@ pressed_cb (GtkGestureClick *gesture,
gtk_popover_popup (GTK_POPOVER (self->menu)); gtk_popover_popup (GTK_POPOVER (self->menu));
} }
static void
update_actions (Demo3Widget *self)
{
gtk_widget_action_set_enabled (GTK_WIDGET (self), "zoom.in", self->scale < 1024.);
gtk_widget_action_set_enabled (GTK_WIDGET (self), "zoom.out", self->scale > 1./1024.);
gtk_widget_action_set_enabled (GTK_WIDGET (self), "zoom.reset", self->scale != 1.);
}
static void static void
zoom_cb (GtkWidget *widget, zoom_cb (GtkWidget *widget,
const char *action_name, const char *action_name,
@@ -320,30 +178,19 @@ zoom_cb (GtkWidget *widget,
float scale; float scale;
if (g_str_equal (action_name, "zoom.in")) if (g_str_equal (action_name, "zoom.in"))
scale = MIN (1024., self->scale * M_SQRT2); scale = MIN (10, self->scale * M_SQRT2);
else if (g_str_equal (action_name, "zoom.out")) else if (g_str_equal (action_name, "zoom.out"))
scale = MAX (1./1024., self->scale / M_SQRT2); scale = MAX (0.01, self->scale / M_SQRT2);
else if (g_str_equal (action_name, "zoom.reset"))
scale = 1.0;
else else
g_assert_not_reached (); scale = 1.0;
gtk_widget_action_set_enabled (widget, "zoom.in", scale < 10);
gtk_widget_action_set_enabled (widget, "zoom.out", scale > 0.01);
gtk_widget_action_set_enabled (widget, "zoom.reset", scale != 1);
g_object_set (widget, "scale", scale, NULL); g_object_set (widget, "scale", scale, NULL);
} }
static void
rotate_cb (GtkWidget *widget,
const char *action_name,
GVariant *parameter)
{
Demo3Widget *self = DEMO3_WIDGET (widget);
int angle;
g_variant_get (parameter, "i", &angle);
g_object_set (widget, "angle", fmodf (self->angle + angle, 360.f), NULL);
}
static void static void
demo3_widget_class_init (Demo3WidgetClass *class) demo3_widget_class_init (Demo3WidgetClass *class)
{ {
@@ -358,31 +205,20 @@ demo3_widget_class_init (Demo3WidgetClass *class)
widget_class->measure = demo3_widget_measure; widget_class->measure = demo3_widget_measure;
widget_class->size_allocate = demo3_widget_size_allocate; widget_class->size_allocate = demo3_widget_size_allocate;
g_object_class_install_property (object_class, PROP_TEXTURE, g_object_class_install_property (object_class, PROP_PAINTABLE,
g_param_spec_object ("texture", NULL, NULL, g_param_spec_object ("paintable", "Paintable", "Paintable",
GDK_TYPE_TEXTURE, GDK_TYPE_PAINTABLE,
G_PARAM_READWRITE)); G_PARAM_READWRITE));
g_object_class_install_property (object_class, PROP_SCALE, g_object_class_install_property (object_class, PROP_SCALE,
g_param_spec_float ("scale", NULL, NULL, g_param_spec_float ("scale", "Scale", "Scale",
1./1024., 1024., 1.0, 0.0, 10.0, 1.0,
G_PARAM_READWRITE));
g_object_class_install_property (object_class, PROP_ANGLE,
g_param_spec_float ("angle", NULL, NULL,
0.0, 360.0, 0.0,
G_PARAM_READWRITE));
g_object_class_install_property (object_class, PROP_FILTER,
g_param_spec_enum ("filter", NULL, NULL,
GSK_TYPE_SCALING_FILTER, GSK_SCALING_FILTER_LINEAR,
G_PARAM_READWRITE)); G_PARAM_READWRITE));
/* These are the actions that we are using in the menu */ /* These are the actions that we are using in the menu */
gtk_widget_class_install_action (widget_class, "zoom.in", NULL, zoom_cb); gtk_widget_class_install_action (widget_class, "zoom.in", NULL, zoom_cb);
gtk_widget_class_install_action (widget_class, "zoom.out", NULL, zoom_cb); gtk_widget_class_install_action (widget_class, "zoom.out", NULL, zoom_cb);
gtk_widget_class_install_action (widget_class, "zoom.reset", NULL, zoom_cb); gtk_widget_class_install_action (widget_class, "zoom.reset", NULL, zoom_cb);
gtk_widget_class_install_action (widget_class, "rotate", "i", rotate_cb);
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);
@@ -393,18 +229,16 @@ GtkWidget *
demo3_widget_new (const char *resource) demo3_widget_new (const char *resource)
{ {
Demo3Widget *self; Demo3Widget *self;
GdkTexture *texture; GdkPixbuf *pixbuf;
GdkPaintable *paintable;
texture = gdk_texture_new_from_resource (resource); pixbuf = gdk_pixbuf_new_from_resource (resource, NULL);
paintable = GDK_PAINTABLE (gdk_texture_new_for_pixbuf (pixbuf));
self = g_object_new (DEMO3_TYPE_WIDGET, self = g_object_new (DEMO3_TYPE_WIDGET, "paintable", paintable, NULL);
"texture", texture,
"has-tooltip", TRUE,
NULL);
g_signal_connect (self, "query-tooltip", G_CALLBACK (query_tooltip), NULL); g_object_unref (pixbuf);
g_object_unref (paintable);
g_object_unref (texture);
return GTK_WIDGET (self); return GTK_WIDGET (self);
} }

View File

@@ -12,11 +12,6 @@
<attribute name="label">11</attribute> <attribute name="label">11</attribute>
<attribute name="action">zoom.reset</attribute> <attribute name="action">zoom.reset</attribute>
</item> </item>
<item>
<attribute name="label">Rotate</attribute>
<attribute name="action">rotate</attribute>
<attribute name="target" type="i">90</attribute>
</item>
</menu> </menu>
<template class="Demo3Widget"> <template class="Demo3Widget">
<child> <child>

View File

@@ -1,226 +0,0 @@
#include <math.h>
#include "demo4widget.h"
#include "hsla.h"
enum
{
PROP_0,
PROP_PROGRESS,
};
struct _Demo4Widget
{
GtkWidget parent_instance;
PangoLayout *layout;
GskColorStop stops[8];
gsize n_stops;
double progress;
guint tick;
};
struct _Demo4WidgetClass
{
GtkWidgetClass parent_class;
};
G_DEFINE_TYPE (Demo4Widget, demo4_widget, GTK_TYPE_WIDGET)
static void
rotate_color (GdkRGBA *rgba)
{
GdkHSLA hsla;
_gdk_hsla_init_from_rgba (&hsla, rgba);
hsla.hue -= 1;
_gdk_rgba_init_from_hsla (rgba, &hsla);
}
static gboolean
rotate_colors (GtkWidget *widget,
GdkFrameClock *clock,
gpointer user_data)
{
Demo4Widget *self = DEMO4_WIDGET (widget);
for (unsigned int i = 0; i < self->n_stops; i++)
rotate_color (&self->stops[i].color);
gtk_widget_queue_draw (widget);
return G_SOURCE_CONTINUE;
}
static void
demo4_widget_init (Demo4Widget *self)
{
PangoFontDescription *desc;
self->progress = 0.5;
self->n_stops = 8;
self->stops[0].offset = 0;
self->stops[0].color = (GdkRGBA) { 1, 0, 0, 1 };
for (unsigned int i = 1; i < self->n_stops; i++)
{
GdkHSLA hsla;
self->stops[i].offset = i / (double)(self->n_stops - 1);
_gdk_hsla_init_from_rgba (&hsla, &self->stops[i - 1].color);
hsla.hue += 360.0 / (double)(self->n_stops - 1);
_gdk_rgba_init_from_hsla (&self->stops[i].color, &hsla);
}
self->layout = gtk_widget_create_pango_layout (GTK_WIDGET (self), "123");
desc = pango_font_description_from_string ("Cantarell Bold 210");
pango_layout_set_font_description (self->layout, desc);
pango_font_description_free (desc);
self->tick = gtk_widget_add_tick_callback (GTK_WIDGET (self), rotate_colors, NULL, NULL);
}
static void
demo4_widget_dispose (GObject *object)
{
Demo4Widget *self = DEMO4_WIDGET (object);
g_clear_object (&self->layout);
gtk_widget_remove_tick_callback (GTK_WIDGET (self), self->tick);
G_OBJECT_CLASS (demo4_widget_parent_class)->dispose (object);
}
static void
demo4_widget_snapshot_content (GtkWidget *widget,
GtkSnapshot *snapshot,
GskMaskMode mode)
{
Demo4Widget *self = DEMO4_WIDGET (widget);
int width, height, layout_width, layout_height;
double scale;
width = gtk_widget_get_width (widget);
height = gtk_widget_get_height (widget);
gtk_snapshot_push_mask (snapshot, mode);
pango_layout_get_pixel_size (self->layout, &layout_width, &layout_height);
scale = MIN ((double) width / layout_width, (double) height / layout_height);
gtk_snapshot_translate (snapshot,
&GRAPHENE_POINT_INIT ((width - scale * layout_width) / 2,
(height - scale * layout_height) / 2));
gtk_snapshot_scale (snapshot, scale, scale);
gtk_snapshot_append_layout (snapshot, self->layout, &(GdkRGBA) { 0, 0, 0, 1 });
gtk_snapshot_pop (snapshot);
gtk_snapshot_append_linear_gradient (snapshot,
&GRAPHENE_RECT_INIT (0, 0, width, height),
&GRAPHENE_POINT_INIT (0, 0),
&GRAPHENE_POINT_INIT (width, height),
self->stops,
self->n_stops);
gtk_snapshot_pop (snapshot);
}
static void
demo4_widget_snapshot (GtkWidget *widget,
GtkSnapshot *snapshot)
{
Demo4Widget *self = DEMO4_WIDGET (widget);
int width, height;
width = gtk_widget_get_width (widget);
height = gtk_widget_get_height (widget);
gtk_snapshot_push_mask (snapshot, GSK_MASK_MODE_INVERTED_LUMINANCE);
gtk_snapshot_append_linear_gradient (snapshot,
&GRAPHENE_RECT_INIT (0, 0, width, height),
&GRAPHENE_POINT_INIT (0, 0),
&GRAPHENE_POINT_INIT (width, 0),
(GskColorStop[2]) {
{ MAX (0.0, self->progress - 5.0 / width), { 1, 1, 1, 1 } },
{ MIN (1.0, self->progress + 5.0 / width), { 0, 0, 0, 1 } }
}, 2);
gtk_snapshot_pop (snapshot);
demo4_widget_snapshot_content (widget, snapshot, GSK_MASK_MODE_INVERTED_ALPHA);
gtk_snapshot_pop (snapshot);
gtk_snapshot_push_mask (snapshot, GSK_MASK_MODE_LUMINANCE);
gtk_snapshot_append_linear_gradient (snapshot,
&GRAPHENE_RECT_INIT (0, 0, width, height),
&GRAPHENE_POINT_INIT (0, 0),
&GRAPHENE_POINT_INIT (width, 0),
(GskColorStop[2]) {
{ MAX (0.0, self->progress - 5.0 / width), { 1, 1, 1, 1 } },
{ MIN (1.0, self->progress + 5.0 / width), { 0, 0, 0, 1 } }
}, 2);
gtk_snapshot_pop (snapshot);
demo4_widget_snapshot_content (widget, snapshot, GSK_MASK_MODE_ALPHA);
gtk_snapshot_pop (snapshot);
}
static void
demo4_widget_set_property (GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
{
Demo4Widget *self = DEMO4_WIDGET (object);
switch (prop_id)
{
case PROP_PROGRESS:
self->progress = g_value_get_double (value);
gtk_widget_queue_draw (GTK_WIDGET (object));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static void
demo4_widget_get_property (GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec)
{
Demo4Widget *self = DEMO4_WIDGET (object);
switch (prop_id)
{
case PROP_PROGRESS:
g_value_set_double (value, self->progress);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static void
demo4_widget_class_init (Demo4WidgetClass *class)
{
GObjectClass *object_class = G_OBJECT_CLASS (class);
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class);
object_class->dispose = demo4_widget_dispose;
object_class->get_property = demo4_widget_get_property;
object_class->set_property = demo4_widget_set_property;
widget_class->snapshot = demo4_widget_snapshot;
g_object_class_install_property (object_class, PROP_PROGRESS,
g_param_spec_double ("progress", NULL, NULL,
0.0, 1.0, 0.5,
G_PARAM_READWRITE));
}
GtkWidget *
demo4_widget_new (void)
{
return g_object_new (DEMO4_TYPE_WIDGET, NULL);
}

View File

@@ -1,8 +0,0 @@
#pragma once
#include <gtk/gtk.h>
#define DEMO4_TYPE_WIDGET (demo4_widget_get_type ())
G_DECLARE_FINAL_TYPE (Demo4Widget, demo4_widget, DEMO4, WIDGET, GtkWidget)
GtkWidget * demo4_widget_new (void);

View File

@@ -8,8 +8,6 @@
#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 GtkWidget *entry1 = NULL; static GtkWidget *entry1 = NULL;
static GtkWidget *entry2 = NULL; static GtkWidget *entry2 = NULL;
@@ -29,7 +27,7 @@ message_dialog_clicked (GtkButton *button,
gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog), gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
ngettext ("Has been shown once", "Has been shown %d times", i), i); ngettext ("Has been shown once", "Has been shown %d times", i), i);
g_signal_connect (dialog, "response", G_CALLBACK (gtk_window_destroy), NULL); g_signal_connect (dialog, "response", G_CALLBACK (gtk_window_destroy), NULL);
gtk_window_present (GTK_WINDOW (dialog)); gtk_widget_show (dialog);
i++; i++;
} }
@@ -116,7 +114,7 @@ interactive_dialog_clicked (GtkButton *button,
data, (GClosureNotify) g_free, data, (GClosureNotify) g_free,
0); 0);
gtk_window_present (GTK_WINDOW (dialog)); gtk_widget_show (dialog);
} }
GtkWidget * GtkWidget *
@@ -186,7 +184,7 @@ do_dialog (GtkWidget *do_widget)
} }
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
gtk_widget_set_visible (window, TRUE); gtk_widget_show (window);
else else
gtk_window_destroy (GTK_WINDOW (window)); gtk_window_destroy (GTK_WINDOW (window));

View File

@@ -109,21 +109,15 @@ static void
apply_transform (CanvasItem *item) apply_transform (CanvasItem *item)
{ {
GskTransform *transform; GskTransform *transform;
graphene_rect_t bounds;
double x, y; double x, y;
/* Add css padding and margin */ x = gtk_widget_get_allocated_width (item->label) / 2.0;
if (!gtk_widget_compute_bounds (item->label, item->label, &bounds)) y = gtk_widget_get_allocated_height (item->label) / 2.0;
return; item->r = sqrt (x*x + y*y);
x = bounds.size.width / 2.;
y = bounds.size.height / 2.;
item->r = sqrt (x * x + y * y);
transform = gsk_transform_translate (NULL, &(graphene_point_t) { item->r, item->r }); transform = gsk_transform_translate (NULL, &(graphene_point_t) { item->r, item->r });
transform = gsk_transform_rotate (transform, item->angle + item->delta); transform = gsk_transform_rotate (transform, item->angle + item->delta);
transform = gsk_transform_translate (transform, &GRAPHENE_POINT_INIT (-x, -y)); transform = gsk_transform_translate (transform, &(graphene_point_t) { -x, -y });
gtk_fixed_set_child_transform (GTK_FIXED (item->fixed), item->label, transform); gtk_fixed_set_child_transform (GTK_FIXED (item->fixed), item->label, transform);
gsk_transform_unref (transform); gsk_transform_unref (transform);
@@ -330,7 +324,7 @@ canvas_item_start_editing (CanvasItem *item)
GtkWidget *canvas = gtk_widget_get_parent (GTK_WIDGET (item)); GtkWidget *canvas = gtk_widget_get_parent (GTK_WIDGET (item));
GtkWidget *entry; GtkWidget *entry;
GtkWidget *scale; GtkWidget *scale;
graphene_point_t p; double x, y;
if (item->editor) if (item->editor)
return; return;
@@ -356,17 +350,12 @@ canvas_item_start_editing (CanvasItem *item)
gtk_box_append (GTK_BOX (item->editor), scale); gtk_box_append (GTK_BOX (item->editor), scale);
if (!gtk_widget_compute_point (GTK_WIDGET (item), canvas, &GRAPHENE_POINT_INIT (0, 0), &p)) gtk_widget_translate_coordinates (GTK_WIDGET (item), canvas, 0, 0, &x, &y);
graphene_point_init (&p, 0, 0); gtk_fixed_put (GTK_FIXED (canvas), item->editor, x, y + 2 * item->r);
gtk_fixed_put (GTK_FIXED (canvas), item->editor, p.x, p.y + 2 * item->r);
gtk_widget_grab_focus (entry); gtk_widget_grab_focus (entry);
} }
typedef struct {
double x, y;
} Hotspot;
static GdkContentProvider * static GdkContentProvider *
prepare (GtkDragSource *source, prepare (GtkDragSource *source,
double x, double x,
@@ -374,8 +363,6 @@ prepare (GtkDragSource *source,
{ {
GtkWidget *canvas; GtkWidget *canvas;
GtkWidget *item; GtkWidget *item;
Hotspot *hotspot;
graphene_point_t p;
canvas = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (source)); canvas = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (source));
item = gtk_widget_pick (canvas, x, y, GTK_PICK_DEFAULT); item = gtk_widget_pick (canvas, x, y, GTK_PICK_DEFAULT);
@@ -386,13 +373,6 @@ prepare (GtkDragSource *source,
g_object_set_data (G_OBJECT (canvas), "dragged-item", item); g_object_set_data (G_OBJECT (canvas), "dragged-item", item);
hotspot = g_new (Hotspot, 1);
if (!gtk_widget_compute_point (canvas, item, &GRAPHENE_POINT_INIT (x, y), &p))
graphene_point_init (&p, x, y);
hotspot->x = p.x;
hotspot->y = p.y;
g_object_set_data_full (G_OBJECT (canvas), "hotspot", hotspot, g_free);
return gdk_content_provider_new_typed (GTK_TYPE_WIDGET, item); return gdk_content_provider_new_typed (GTK_TYPE_WIDGET, item);
} }
@@ -403,14 +383,12 @@ drag_begin (GtkDragSource *source,
GtkWidget *canvas; GtkWidget *canvas;
CanvasItem *item; CanvasItem *item;
GdkPaintable *paintable; GdkPaintable *paintable;
Hotspot *hotspot;
canvas = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (source)); canvas = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (source));
item = CANVAS_ITEM (g_object_get_data (G_OBJECT (canvas), "dragged-item")); item = CANVAS_ITEM (g_object_get_data (G_OBJECT (canvas), "dragged-item"));
hotspot = (Hotspot *) g_object_get_data (G_OBJECT (canvas), "hotspot");
paintable = canvas_item_get_drag_icon (item); paintable = canvas_item_get_drag_icon (item);
gtk_drag_source_set_icon (source, paintable, hotspot->x, hotspot->y); gtk_drag_source_set_icon (source, paintable, item->r, item->r);
g_object_unref (paintable); g_object_unref (paintable);
gtk_widget_set_opacity (GTK_WIDGET (item), 0.3); gtk_widget_set_opacity (GTK_WIDGET (item), 0.3);
@@ -748,9 +726,7 @@ do_dnd (GtkWidget *do_widget)
GtkCssProvider *provider; GtkCssProvider *provider;
GString *css; GString *css;
G_GNUC_BEGIN_IGNORE_DEPRECATIONS
button = gtk_color_button_new (); 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 ();
@@ -824,7 +800,7 @@ G_GNUC_END_IGNORE_DEPRECATIONS
} }
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
gtk_widget_set_visible (window, TRUE); gtk_widget_show (window);
else else
gtk_window_destroy (GTK_WINDOW (window)); gtk_window_destroy (GTK_WINDOW (window));

View File

@@ -362,7 +362,7 @@ do_drawingarea (GtkWidget *do_widget)
G_CALLBACK (scribble_resize), NULL); G_CALLBACK (scribble_resize), NULL);
drag = gtk_gesture_drag_new (); drag = gtk_gesture_drag_new ();
gtk_gesture_single_set_button (GTK_GESTURE_SINGLE (drag), 0); gtk_gesture_single_set_button (GTK_GESTURE_SINGLE (drag), GDK_BUTTON_PRIMARY);
gtk_widget_add_controller (da, GTK_EVENT_CONTROLLER (drag)); gtk_widget_add_controller (da, GTK_EVENT_CONTROLLER (drag));
g_signal_connect (drag, "drag-begin", G_CALLBACK (drag_begin), da); g_signal_connect (drag, "drag-begin", G_CALLBACK (drag_begin), da);
@@ -372,7 +372,7 @@ do_drawingarea (GtkWidget *do_widget)
} }
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
gtk_widget_set_visible (window, TRUE); gtk_widget_show (window);
else else
gtk_window_destroy (GTK_WINDOW (window)); gtk_window_destroy (GTK_WINDOW (window));

View File

@@ -164,14 +164,14 @@ strings_bind_item (GtkSignalListItemFactory *factory,
popup = gtk_widget_get_ancestor (title, GTK_TYPE_POPOVER); popup = gtk_widget_get_ancestor (title, GTK_TYPE_POPOVER);
if (popup && gtk_widget_is_ancestor (popup, GTK_WIDGET (dropdown))) if (popup && gtk_widget_is_ancestor (popup, GTK_WIDGET (dropdown)))
{ {
gtk_widget_set_visible (checkmark, TRUE); gtk_widget_show (checkmark);
g_signal_connect (dropdown, "notify::selected-item", g_signal_connect (dropdown, "notify::selected-item",
G_CALLBACK (selected_item_changed), item); G_CALLBACK (selected_item_changed), item);
selected_item_changed (dropdown, NULL, item); selected_item_changed (dropdown, NULL, item);
} }
else else
{ {
gtk_widget_set_visible (checkmark, FALSE); gtk_widget_hide (checkmark);
} }
} }
@@ -369,7 +369,7 @@ match_func (MatchObject *obj,
} }
GtkWidget * GtkWidget *
do_listview_selections (GtkWidget *do_widget) do_dropdown (GtkWidget *do_widget)
{ {
static GtkWidget *window = NULL; static GtkWidget *window = NULL;
GtkWidget *button, *box, *spin, *check, *hbox, *label, *entry; GtkWidget *button, *box, *spin, *check, *hbox, *label, *entry;
@@ -563,7 +563,7 @@ do_listview_selections (GtkWidget *do_widget)
} }
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
gtk_widget_set_visible (window, TRUE); gtk_widget_show (window);
else else
gtk_window_destroy (GTK_WINDOW (window)); gtk_window_destroy (GTK_WINDOW (window));

View File

@@ -409,7 +409,7 @@ do_editable_cells (GtkWidget *do_widget)
} }
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
gtk_widget_set_visible (window, TRUE); gtk_widget_show (window);
else else
gtk_window_destroy (GTK_WINDOW (window)); gtk_window_destroy (GTK_WINDOW (window));

View File

@@ -115,7 +115,7 @@ do_entry_completion (GtkWidget *do_widget)
} }
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
gtk_widget_set_visible (window, TRUE); gtk_widget_show (window);
else else
gtk_window_destroy (GTK_WINDOW (window)); gtk_window_destroy (GTK_WINDOW (window));

View File

@@ -46,7 +46,7 @@ do_entry_undo (GtkWidget *do_widget)
} }
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
gtk_widget_set_visible (window, TRUE); gtk_widget_show (window);
else else
gtk_window_destroy (GTK_WINDOW (window)); gtk_window_destroy (GTK_WINDOW (window));

View File

@@ -42,12 +42,12 @@ mode_switch_state_set (GtkSwitch *sw,
if (!state || if (!state ||
(gtk_range_get_value (GTK_RANGE (scale)) > 50)) (gtk_range_get_value (GTK_RANGE (scale)) > 50))
{ {
gtk_widget_set_visible (label, FALSE); gtk_widget_hide (label);
gtk_switch_set_state (sw, state); gtk_switch_set_state (sw, state);
} }
else else
{ {
gtk_widget_set_visible (label, TRUE); gtk_widget_show (label);
} }
return TRUE; return TRUE;
@@ -65,7 +65,7 @@ level_scale_value_changed (GtkRange *range,
!gtk_switch_get_state (GTK_SWITCH (sw)) && !gtk_switch_get_state (GTK_SWITCH (sw)) &&
(gtk_range_get_value (range) > 50)) (gtk_range_get_value (range) > 50))
{ {
gtk_widget_set_visible (label, FALSE); gtk_widget_hide (label);
gtk_switch_set_state (GTK_SWITCH (sw), TRUE); gtk_switch_set_state (GTK_SWITCH (sw), TRUE);
} }
else if (gtk_switch_get_state (GTK_SWITCH (sw)) && else if (gtk_switch_get_state (GTK_SWITCH (sw)) &&
@@ -113,7 +113,7 @@ do_errorstates (GtkWidget *do_widget)
} }
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
gtk_widget_set_visible (window, TRUE); gtk_widget_show (window);
else else
gtk_window_destroy (GTK_WINDOW (window)); gtk_window_destroy (GTK_WINDOW (window));

View File

@@ -10,8 +10,6 @@
#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
@@ -122,7 +120,7 @@ do_expander (GtkWidget *do_widget)
} }
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
gtk_widget_set_visible (window, TRUE); gtk_widget_show (window);
else else
gtk_window_destroy (GTK_WINDOW (window)); gtk_window_destroy (GTK_WINDOW (window));

View File

@@ -199,7 +199,7 @@ do_filtermodel (GtkWidget *do_widget)
} }
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
gtk_widget_set_visible (window, TRUE); gtk_widget_show (window);
else else
gtk_window_destroy (GTK_WINDOW (window)); gtk_window_destroy (GTK_WINDOW (window));

View File

@@ -68,13 +68,11 @@ 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)
{ {
return gtk_font_button_new (); return gtk_font_button_new ();
} }
G_GNUC_END_IGNORE_DEPRECATIONS
static GtkWidget * static GtkWidget *
create_level_bar (void) create_level_bar (void)
@@ -329,7 +327,7 @@ do_fishbowl (GtkWidget *do_widget)
} }
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
gtk_widget_set_visible (window, TRUE); gtk_widget_show (window);
else else
gtk_window_destroy (GTK_WINDOW (window)); gtk_window_destroy (GTK_WINDOW (window));

View File

@@ -160,7 +160,7 @@ do_fixed (GtkWidget *do_widget)
demo_window = create_demo_window (do_widget); demo_window = create_demo_window (do_widget);
if (!gtk_widget_get_visible (demo_window)) if (!gtk_widget_get_visible (demo_window))
gtk_widget_set_visible (demo_window, TRUE); gtk_widget_show (demo_window);
else else
gtk_window_destroy (GTK_WINDOW (demo_window)); gtk_window_destroy (GTK_WINDOW (demo_window));

View File

@@ -742,7 +742,7 @@ do_flowbox (GtkWidget *do_widget)
} }
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
gtk_widget_set_visible (window, TRUE); gtk_widget_show (window);
else else
gtk_window_destroy (GTK_WINDOW (window)); gtk_window_destroy (GTK_WINDOW (window));

View File

@@ -21,8 +21,6 @@
#include "script-names.h" #include "script-names.h"
#include "language-names.h" #include "language-names.h"
G_GNUC_BEGIN_IGNORE_DEPRECATIONS
/* {{{ ScriptLang object */ /* {{{ ScriptLang object */
G_DECLARE_FINAL_TYPE (ScriptLang, script_lang, SCRIPT, LANG, GObject) G_DECLARE_FINAL_TYPE (ScriptLang, script_lang, SCRIPT, LANG, GObject)
@@ -258,10 +256,10 @@ swap_colors (void)
GdkRGBA fg; GdkRGBA fg;
GdkRGBA bg; GdkRGBA bg;
fg = *gtk_color_dialog_button_get_rgba (GTK_COLOR_DIALOG_BUTTON (demo->foreground)); gtk_color_chooser_get_rgba (GTK_COLOR_CHOOSER (demo->foreground), &fg);
bg = *gtk_color_dialog_button_get_rgba (GTK_COLOR_DIALOG_BUTTON (demo->background)); gtk_color_chooser_get_rgba (GTK_COLOR_CHOOSER (demo->background), &bg);
gtk_color_dialog_button_set_rgba (GTK_COLOR_DIALOG_BUTTON (demo->foreground), &bg); gtk_color_chooser_set_rgba (GTK_COLOR_CHOOSER (demo->foreground), &bg);
gtk_color_dialog_button_set_rgba (GTK_COLOR_DIALOG_BUTTON (demo->background), &fg); gtk_color_chooser_set_rgba (GTK_COLOR_CHOOSER (demo->background), &fg);
} }
static void static void
@@ -270,8 +268,8 @@ font_features_reset_basic (void)
gtk_adjustment_set_value (demo->size_adjustment, 20); gtk_adjustment_set_value (demo->size_adjustment, 20);
gtk_adjustment_set_value (demo->letterspacing_adjustment, 0); gtk_adjustment_set_value (demo->letterspacing_adjustment, 0);
gtk_adjustment_set_value (demo->line_height_adjustment, 1); gtk_adjustment_set_value (demo->line_height_adjustment, 1);
gtk_color_dialog_button_set_rgba (GTK_COLOR_DIALOG_BUTTON (demo->foreground), &(GdkRGBA){0.,0.,0.,1.}); gtk_color_chooser_set_rgba (GTK_COLOR_CHOOSER (demo->foreground), &(GdkRGBA){0.,0.,0.,1.});
gtk_color_dialog_button_set_rgba (GTK_COLOR_DIALOG_BUTTON (demo->background), &(GdkRGBA){1.,1.,1.,1.}); gtk_color_chooser_set_rgba (GTK_COLOR_CHOOSER (demo->background), &(GdkRGBA){1.,1.,1.,1.});
} }
static void static void
@@ -279,7 +277,7 @@ update_basic (void)
{ {
PangoFontDescription *desc; PangoFontDescription *desc;
desc = gtk_font_dialog_button_get_font_desc (GTK_FONT_DIALOG_BUTTON (demo->font)); desc = gtk_font_chooser_get_font_desc (GTK_FONT_CHOOSER (demo->font));
gtk_adjustment_set_value (demo->size_adjustment, gtk_adjustment_set_value (demo->size_adjustment,
pango_font_description_get_size (desc) / (double) PANGO_SCALE); pango_font_description_get_size (desc) / (double) PANGO_SCALE);
@@ -590,7 +588,7 @@ update_display (void)
end = PANGO_ATTR_INDEX_TO_TEXT_END; end = PANGO_ATTR_INDEX_TO_TEXT_END;
} }
desc = gtk_font_dialog_button_get_font_desc (GTK_FONT_DIALOG_BUTTON (demo->font)); desc = gtk_font_chooser_get_font_desc (GTK_FONT_CHOOSER (demo->font));
value = gtk_adjustment_get_value (demo->size_adjustment); value = gtk_adjustment_get_value (demo->size_adjustment);
pango_font_description_set_size (desc, value * PANGO_SCALE); pango_font_description_set_size (desc, value * PANGO_SCALE);
@@ -681,7 +679,7 @@ update_display (void)
GdkRGBA rgba; GdkRGBA rgba;
char *fg, *bg, *css; char *fg, *bg, *css;
rgba = *gtk_color_dialog_button_get_rgba (GTK_COLOR_DIALOG_BUTTON (demo->foreground)); gtk_color_chooser_get_rgba (GTK_COLOR_CHOOSER (demo->foreground), &rgba);
attr = pango_attr_foreground_new (65535 * rgba.red, attr = pango_attr_foreground_new (65535 * rgba.red,
65535 * rgba.green, 65535 * rgba.green,
65535 * rgba.blue); 65535 * rgba.blue);
@@ -694,7 +692,7 @@ update_display (void)
pango_attr_list_insert (attrs, attr); pango_attr_list_insert (attrs, attr);
fg = gdk_rgba_to_string (&rgba); fg = gdk_rgba_to_string (&rgba);
rgba = *gtk_color_dialog_button_get_rgba (GTK_COLOR_DIALOG_BUTTON (demo->background)); gtk_color_chooser_get_rgba (GTK_COLOR_CHOOSER (demo->background), &rgba);
bg = gdk_rgba_to_string (&rgba); bg = gdk_rgba_to_string (&rgba);
css = g_strdup_printf (".font_features_background { caret-color: %s; background-color: %s; }", fg, bg); css = g_strdup_printf (".font_features_background { caret-color: %s; background-color: %s; }", fg, bg);
gtk_css_provider_load_from_data (demo->provider, css, strlen (css)); gtk_css_provider_load_from_data (demo->provider, css, strlen (css));
@@ -769,6 +767,7 @@ update_display (void)
gtk_label_set_attributes (GTK_LABEL (demo->the_label), attrs); gtk_label_set_attributes (GTK_LABEL (demo->the_label), attrs);
g_free (font_desc); g_free (font_desc);
pango_font_description_free (desc);
g_free (features); g_free (features);
pango_attr_list_unref (attrs); pango_attr_list_unref (attrs);
g_free (text); g_free (text);
@@ -780,7 +779,7 @@ get_pango_font (void)
PangoFontDescription *desc; PangoFontDescription *desc;
PangoContext *context; PangoContext *context;
desc = gtk_font_dialog_button_get_font_desc (GTK_FONT_DIALOG_BUTTON (demo->font)); desc = gtk_font_chooser_get_font_desc (GTK_FONT_CHOOSER (demo->font));
context = gtk_widget_get_pango_context (demo->font); context = gtk_widget_get_pango_context (demo->font);
return pango_context_load_font (context, desc); return pango_context_load_font (context, desc);
@@ -832,17 +831,17 @@ update_script_combo (void)
GHashTable *tags; GHashTable *tags;
GHashTableIter iter; GHashTableIter iter;
TagPair *pair; TagPair *pair;
PangoLanguage *language; char *lang;
const char *lang;
hb_tag_t active; hb_tag_t active;
language = gtk_font_dialog_button_get_language (GTK_FONT_DIALOG_BUTTON (demo->font)); lang = gtk_font_chooser_get_language (GTK_FONT_CHOOSER (demo->font));
lang = pango_language_to_string (language);
G_GNUC_BEGIN_IGNORE_DEPRECATIONS G_GNUC_BEGIN_IGNORE_DEPRECATIONS
active = hb_ot_tag_from_language (hb_language_from_string (lang, -1)); active = hb_ot_tag_from_language (hb_language_from_string (lang, -1));
G_GNUC_END_IGNORE_DEPRECATIONS G_GNUC_END_IGNORE_DEPRECATIONS
g_free (lang);
store = g_list_store_new (script_lang_get_type ()); store = g_list_store_new (script_lang_get_type ());
pango_font = get_pango_font (); pango_font = get_pango_font ();
@@ -855,6 +854,11 @@ update_script_combo (void)
pair->lang_tag = 0; pair->lang_tag = 0;
g_hash_table_add (tags, pair); g_hash_table_add (tags, pair);
pair = g_new (TagPair, 1);
pair->script_tag = HB_OT_TAG_DEFAULT_SCRIPT;
pair->lang_tag = HB_OT_TAG_DEFAULT_LANGUAGE;
g_hash_table_add (tags, pair);
if (hb_font) if (hb_font)
{ {
hb_tag_t tables[2] = { HB_OT_TAG_GSUB, HB_OT_TAG_GPOS }; hb_tag_t tables[2] = { HB_OT_TAG_GSUB, HB_OT_TAG_GPOS };
@@ -966,6 +970,9 @@ update_features (void)
/* set feature presence checks from the font features */ /* set feature presence checks from the font features */
if (gtk_drop_down_get_selected (GTK_DROP_DOWN (demo->script_lang)) == 0)
return;
selected = gtk_drop_down_get_selected_item (GTK_DROP_DOWN (demo->script_lang)); selected = gtk_drop_down_get_selected_item (GTK_DROP_DOWN (demo->script_lang));
if (selected->lang_tag == 0) /* None is selected */ if (selected->lang_tag == 0) /* None is selected */
@@ -973,8 +980,8 @@ update_features (void)
for (l = demo->feature_items; l; l = l->next) for (l = demo->feature_items; l; l = l->next)
{ {
FeatureItem *item = l->data; FeatureItem *item = l->data;
gtk_widget_set_visible (item->feat, TRUE); gtk_widget_show (item->feat);
gtk_widget_set_visible (gtk_widget_get_parent (item->feat), TRUE); gtk_widget_show (gtk_widget_get_parent (item->feat));
if (strcmp (item->name, "xxxx") == 0) if (strcmp (item->name, "xxxx") == 0)
gtk_check_button_set_active (GTK_CHECK_BUTTON (item->feat), TRUE); gtk_check_button_set_active (GTK_CHECK_BUTTON (item->feat), TRUE);
} }
@@ -985,8 +992,8 @@ update_features (void)
for (l = demo->feature_items; l; l = l->next) for (l = demo->feature_items; l; l = l->next)
{ {
FeatureItem *item = l->data; FeatureItem *item = l->data;
gtk_widget_set_visible (item->feat, FALSE); gtk_widget_hide (item->feat);
gtk_widget_set_visible (gtk_widget_get_parent (item->feat), FALSE); gtk_widget_hide (gtk_widget_get_parent (item->feat));
if (strcmp (item->name, "xxxx") == 0) if (strcmp (item->name, "xxxx") == 0)
gtk_check_button_set_active (GTK_CHECK_BUTTON (item->feat), TRUE); gtk_check_button_set_active (GTK_CHECK_BUTTON (item->feat), TRUE);
} }
@@ -994,13 +1001,11 @@ update_features (void)
pango_font = get_pango_font (); pango_font = get_pango_font ();
hb_font = pango_font_get_hb_font (pango_font); hb_font = pango_font_get_hb_font (pango_font);
g_print ("language %s\n", selected->langname);
if (hb_font) if (hb_font)
{ {
hb_tag_t tables[2] = { HB_OT_TAG_GSUB, HB_OT_TAG_GPOS }; hb_tag_t tables[2] = { HB_OT_TAG_GSUB, HB_OT_TAG_GPOS };
hb_face_t *hb_face; hb_face_t *hb_face;
const char *feat; char *feat;
hb_face = hb_font_get_face (hb_font); hb_face = hb_font_get_face (hb_font);
@@ -1022,6 +1027,9 @@ update_features (void)
char buf[5]; char buf[5];
hb_tag_to_string (features[j], buf); hb_tag_to_string (features[j], buf);
buf[4] = 0; buf[4] = 0;
#if 0
g_print ("%s present in %s\n", buf, i == 0 ? "GSUB" : "GPOS");
#endif
if (g_str_has_prefix (buf, "ss") || g_str_has_prefix (buf, "cv")) if (g_str_has_prefix (buf, "ss") || g_str_has_prefix (buf, "cv"))
{ {
@@ -1071,15 +1079,15 @@ update_features (void)
if (item->tag == features[j]) if (item->tag == features[j])
{ {
gtk_widget_set_visible (item->feat, TRUE); gtk_widget_show (item->feat);
gtk_widget_set_visible (gtk_widget_get_parent (item->feat), TRUE); gtk_widget_show (gtk_widget_get_parent (item->feat));
if (GTK_IS_CHECK_BUTTON (item->feat)) if (GTK_IS_CHECK_BUTTON (item->feat))
{ {
GtkWidget *def = GTK_WIDGET (g_object_get_data (G_OBJECT (item->feat), "default")); GtkWidget *def = GTK_WIDGET (g_object_get_data (G_OBJECT (item->feat), "default"));
if (def) if (def)
{ {
gtk_widget_set_visible (def, TRUE); gtk_widget_show (def);
gtk_widget_set_visible (gtk_widget_get_parent (def), TRUE); gtk_widget_show (gtk_widget_get_parent (def));
gtk_check_button_set_active (GTK_CHECK_BUTTON (def), TRUE); gtk_check_button_set_active (GTK_CHECK_BUTTON (def), TRUE);
} }
else else
@@ -1090,7 +1098,7 @@ update_features (void)
} }
} }
feat = gtk_font_dialog_button_get_font_features (GTK_FONT_DIALOG_BUTTON (demo->font)); feat = gtk_font_chooser_get_font_features (GTK_FONT_CHOOSER (demo->font));
if (feat) if (feat)
{ {
for (l = demo->feature_items; l; l = l->next) for (l = demo->feature_items; l; l = l->next)
@@ -1116,6 +1124,8 @@ update_features (void)
} }
} }
} }
g_free (feat);
} }
} }
@@ -1413,7 +1423,10 @@ instance_changed (GtkDropDown *combo)
ikey.name = (char *) text; ikey.name = (char *) text;
instance = g_hash_table_lookup (demo->instances, &ikey); instance = g_hash_table_lookup (demo->instances, &ikey);
if (!instance) if (!instance)
{
g_print ("did not find instance %s\n", text);
goto out; goto out;
}
pango_font = get_pango_font (); pango_font = get_pango_font ();
hb_font = pango_font_get_hb_font (pango_font); hb_font = pango_font_get_hb_font (pango_font);
@@ -1767,7 +1780,6 @@ do_font_features (GtkWidget *do_widget)
demo->description = GTK_WIDGET (gtk_builder_get_object (builder, "description")); demo->description = GTK_WIDGET (gtk_builder_get_object (builder, "description"));
demo->font = GTK_WIDGET (gtk_builder_get_object (builder, "font")); demo->font = GTK_WIDGET (gtk_builder_get_object (builder, "font"));
demo->script_lang = GTK_WIDGET (gtk_builder_get_object (builder, "script_lang")); demo->script_lang = GTK_WIDGET (gtk_builder_get_object (builder, "script_lang"));
g_assert (GTK_IS_DROP_DOWN (demo->script_lang));
expression = gtk_cclosure_expression_new (G_TYPE_STRING, NULL, 0, NULL, G_CALLBACK (script_lang_get_langname), NULL, NULL); expression = gtk_cclosure_expression_new (G_TYPE_STRING, NULL, 0, NULL, G_CALLBACK (script_lang_get_langname), NULL, NULL);
gtk_drop_down_set_expression (GTK_DROP_DOWN (demo->script_lang), expression); gtk_drop_down_set_expression (GTK_DROP_DOWN (demo->script_lang), expression);
gtk_expression_unref (expression); gtk_expression_unref (expression);

View File

@@ -58,14 +58,11 @@
<property name="orientation">vertical</property> <property name="orientation">vertical</property>
<property name="spacing">6</property> <property name="spacing">6</property>
<child> <child>
<object class="GtkFontDialogButton" id="font"> <object class="GtkFontButton" id="font">
<property name="dialog">
<object class="GtkFontDialog">
</object>
</property>
<property name="receives-default">1</property> <property name="receives-default">1</property>
<property name="level">face</property> <property name="font">Sans 12</property>
<signal name="notify::font-desc" handler="font_features_font_changed" swapped="no"/> <property name="level">family|style</property>
<signal name="font-set" handler="font_features_font_changed" swapped="no"/>
</object> </object>
</child> </child>
<child> <child>
@@ -195,11 +192,7 @@
</object> </object>
</child> </child>
<child> <child>
<object class="GtkColorDialogButton" id="foreground"> <object class="GtkColorButton" id="foreground">
<property name="dialog">
<object class="GtkColorDialog">
</object>
</property>
<property name="valign">baseline</property> <property name="valign">baseline</property>
<property name="rgba">black</property> <property name="rgba">black</property>
<signal name="notify::rgba" handler="color_set_cb"/> <signal name="notify::rgba" handler="color_set_cb"/>
@@ -221,11 +214,7 @@
</object> </object>
</child> </child>
<child> <child>
<object class="GtkColorDialogButton" id="background"> <object class="GtkColorButton" id="background">
<property name="dialog">
<object class="GtkColorDialog">
</object>
</property>
<property name="valign">baseline</property> <property name="valign">baseline</property>
<property name="rgba">white</property> <property name="rgba">white</property>
<signal name="notify::rgba" handler="color_set_cb"/> <signal name="notify::rgba" handler="color_set_cb"/>

View File

@@ -42,8 +42,8 @@ val_to_xy (GtkFontPlane *plane,
double u, v; double u, v;
int width, height; int width, height;
width = gtk_widget_get_width (GTK_WIDGET (plane)); width = gtk_widget_get_allocated_width (GTK_WIDGET (plane));
height = gtk_widget_get_height (GTK_WIDGET (plane)); height = gtk_widget_get_allocated_height (GTK_WIDGET (plane));
u = adjustment_get_normalized_value (plane->width_adj); u = adjustment_get_normalized_value (plane->width_adj);
v = adjustment_get_normalized_value (plane->weight_adj); v = adjustment_get_normalized_value (plane->weight_adj);
@@ -62,8 +62,8 @@ plane_snapshot (GtkWidget *widget,
cairo_t *cr; cairo_t *cr;
val_to_xy (plane, &x, &y); val_to_xy (plane, &x, &y);
width = gtk_widget_get_width (widget); width = gtk_widget_get_allocated_width (widget);
height = gtk_widget_get_height (widget); height = gtk_widget_get_allocated_height (widget);
cr = gtk_snapshot_append_cairo (snapshot, cr = gtk_snapshot_append_cairo (snapshot,
&GRAPHENE_RECT_INIT (0, 0, width, height)); &GRAPHENE_RECT_INIT (0, 0, width, height));
@@ -131,8 +131,8 @@ update_value (GtkFontPlane *plane,
GtkWidget *widget = GTK_WIDGET (plane); GtkWidget *widget = GTK_WIDGET (plane);
double u, v; double u, v;
u = CLAMP (x * (1.0 / gtk_widget_get_width (widget)), 0, 1); u = CLAMP (x * (1.0 / gtk_widget_get_allocated_width (widget)), 0, 1);
v = CLAMP (1 - y * (1.0 / gtk_widget_get_height (widget)), 0, 1); v = CLAMP (1 - y * (1.0 / gtk_widget_get_allocated_height (widget)), 0, 1);
adjustment_set_normalized_value (plane->width_adj, u); adjustment_set_normalized_value (plane->width_adj, u);
adjustment_set_normalized_value (plane->weight_adj, v); adjustment_set_normalized_value (plane->weight_adj, v);

View File

@@ -53,7 +53,7 @@ update_image (void)
context = gtk_widget_create_pango_context (image); context = gtk_widget_create_pango_context (image);
text = gtk_editable_get_text (GTK_EDITABLE (entry)); text = gtk_editable_get_text (GTK_EDITABLE (entry));
desc = gtk_font_dialog_button_get_font_desc (GTK_FONT_DIALOG_BUTTON (font_button)); desc = gtk_font_chooser_get_font_desc (GTK_FONT_CHOOSER (font_button));
fopt = cairo_font_options_copy (pango_cairo_context_get_font_options (context)); fopt = cairo_font_options_copy (pango_cairo_context_get_font_options (context));
@@ -287,6 +287,8 @@ retry:
gtk_picture_set_pixbuf (GTK_PICTURE (image), pixbuf2); gtk_picture_set_pixbuf (GTK_PICTURE (image), pixbuf2);
g_object_unref (pixbuf2); g_object_unref (pixbuf2);
pango_font_description_free (desc);
} }
static gboolean fading = FALSE; static gboolean fading = FALSE;
@@ -435,7 +437,7 @@ do_fontrendering (GtkWidget *do_widget)
} }
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
gtk_widget_set_visible (window, TRUE); gtk_widget_show (window);
else else
gtk_window_destroy (GTK_WINDOW (window)); gtk_window_destroy (GTK_WINDOW (window));

View File

@@ -74,11 +74,7 @@
</object> </object>
</child> </child>
<child> <child>
<object class="GtkFontDialogButton" id="font_button"> <object class="GtkFontButton" id="font_button">
<property name="dialog">
<object class="GtkFontDialog">
</object>
</property>
<layout> <layout>
<property name="column">2</property> <property name="column">2</property>
<property name="row">1</property> <property name="row">1</property>

View File

@@ -157,7 +157,7 @@ do_frames (GtkWidget *do_widget)
} }
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
gtk_widget_set_visible (window, TRUE); gtk_widget_show (window);
else else
gtk_window_destroy (GTK_WINDOW (window)); gtk_window_destroy (GTK_WINDOW (window));

View File

@@ -54,6 +54,7 @@ create_axis_slider (GtkGears *gears,
label = gtk_label_new (text); label = gtk_label_new (text);
gtk_box_append (GTK_BOX (box), label); gtk_box_append (GTK_BOX (box), label);
gtk_widget_show (label);
adj = gtk_adjustment_new (gtk_gears_get_axis (gears, axis), 0.0, 360.0, 1.0, 12.0, 0.0); adj = gtk_adjustment_new (gtk_gears_get_axis (gears, axis), 0.0, 360.0, 1.0, 12.0, 0.0);
g_object_set_data (G_OBJECT (adj), "axis", GINT_TO_POINTER (axis)); g_object_set_data (G_OBJECT (adj), "axis", GINT_TO_POINTER (axis));
@@ -64,6 +65,9 @@ create_axis_slider (GtkGears *gears,
gtk_scale_set_draw_value (GTK_SCALE (slider), FALSE); gtk_scale_set_draw_value (GTK_SCALE (slider), FALSE);
gtk_box_append (GTK_BOX (box), slider); gtk_box_append (GTK_BOX (box), slider);
gtk_widget_set_vexpand (slider, TRUE); gtk_widget_set_vexpand (slider, TRUE);
gtk_widget_show (slider);
gtk_widget_show (box);
return box; return box;
} }
@@ -125,7 +129,7 @@ do_gears (GtkWidget *do_widget)
} }
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
gtk_widget_set_visible (window, TRUE); gtk_widget_show (window);
else else
gtk_window_destroy (GTK_WINDOW (window)); gtk_window_destroy (GTK_WINDOW (window));

View File

@@ -208,7 +208,7 @@ do_gestures (GtkWidget *do_widget)
} }
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
gtk_widget_set_visible (window, TRUE); gtk_widget_show (window);
else else
gtk_window_destroy (GTK_WINDOW (window)); gtk_window_destroy (GTK_WINDOW (window));

View File

@@ -221,13 +221,16 @@ static void
realize (GtkWidget *widget) realize (GtkWidget *widget)
{ {
const char *vertex_path, *fragment_path; const char *vertex_path, *fragment_path;
GdkGLContext *context;
gtk_gl_area_make_current (GTK_GL_AREA (widget)); gtk_gl_area_make_current (GTK_GL_AREA (widget));
if (gtk_gl_area_get_error (GTK_GL_AREA (widget)) != NULL) if (gtk_gl_area_get_error (GTK_GL_AREA (widget)) != NULL)
return; return;
if (gtk_gl_area_get_api (GTK_GL_AREA (widget)) == GDK_GL_API_GLES) context = gtk_gl_area_get_context (GTK_GL_AREA (widget));
if (gdk_gl_context_get_use_es (context))
{ {
vertex_path = "/glarea/glarea-gles.vs.glsl"; vertex_path = "/glarea/glarea-gles.vs.glsl";
fragment_path = "/glarea/glarea-gles.fs.glsl"; fragment_path = "/glarea/glarea-gles.fs.glsl";
@@ -352,6 +355,7 @@ create_axis_slider (int axis)
label = gtk_label_new (text); label = gtk_label_new (text);
gtk_box_append (GTK_BOX (box), label); gtk_box_append (GTK_BOX (box), label);
gtk_widget_show (label);
adj = gtk_adjustment_new (0.0, 0.0, 360.0, 1.0, 12.0, 0.0); adj = gtk_adjustment_new (0.0, 0.0, 360.0, 1.0, 12.0, 0.0);
g_signal_connect (adj, "value-changed", g_signal_connect (adj, "value-changed",
@@ -360,6 +364,9 @@ create_axis_slider (int axis)
slider = gtk_scale_new (GTK_ORIENTATION_HORIZONTAL, adj); slider = gtk_scale_new (GTK_ORIENTATION_HORIZONTAL, adj);
gtk_box_append (GTK_BOX (box), slider); gtk_box_append (GTK_BOX (box), slider);
gtk_widget_set_hexpand (slider, TRUE); gtk_widget_set_hexpand (slider, TRUE);
gtk_widget_show (slider);
gtk_widget_show (box);
return box; return box;
} }
@@ -433,7 +440,7 @@ do_glarea (GtkWidget *do_widget)
demo_window = create_glarea_window (do_widget); demo_window = create_glarea_window (do_widget);
if (!gtk_widget_get_visible (demo_window)) if (!gtk_widget_get_visible (demo_window))
gtk_widget_set_visible (demo_window, TRUE); gtk_widget_show (demo_window);
else else
gtk_window_destroy (GTK_WINDOW (demo_window)); gtk_window_destroy (GTK_WINDOW (demo_window));

View File

@@ -33,7 +33,7 @@ static void
text_changed (GtkTextBuffer *buffer, text_changed (GtkTextBuffer *buffer,
GtkWidget *button) GtkWidget *button)
{ {
gtk_widget_set_visible (button, TRUE); gtk_widget_show (button);
} }
static void static void
@@ -58,7 +58,7 @@ apply_text (GtkWidget *button,
g_object_unref (shader); g_object_unref (shader);
g_bytes_unref (bytes); g_bytes_unref (bytes);
gtk_widget_set_visible (button, FALSE); gtk_widget_hide (button);
} }
static void static void
@@ -237,7 +237,7 @@ make_shader_stack (const char *name,
gtk_widget_set_halign (button, GTK_ALIGN_CENTER); gtk_widget_set_halign (button, GTK_ALIGN_CENTER);
gtk_widget_set_valign (button, GTK_ALIGN_CENTER); gtk_widget_set_valign (button, GTK_ALIGN_CENTER);
gtk_widget_add_css_class (button, "small"); gtk_widget_add_css_class (button, "small");
gtk_widget_set_visible (button, FALSE); gtk_widget_hide (button);
gtk_center_box_set_end_widget (GTK_CENTER_BOX (widget), button); gtk_center_box_set_end_widget (GTK_CENTER_BOX (widget), button);
gtk_box_append (GTK_BOX (vbox), widget); gtk_box_append (GTK_BOX (vbox), widget);
@@ -354,7 +354,7 @@ do_gltransition (GtkWidget *do_widget)
demo_window = create_gltransition_window (do_widget); demo_window = create_gltransition_window (do_widget);
if (!gtk_widget_get_visible (demo_window)) if (!gtk_widget_get_visible (demo_window))
gtk_widget_set_visible (demo_window, TRUE); gtk_widget_show (demo_window);
else else
gtk_window_destroy (GTK_WINDOW (demo_window)); gtk_window_destroy (GTK_WINDOW (demo_window));

View File

@@ -48,16 +48,14 @@
#define VERTICES_PER_TOOTH 34 #define VERTICES_PER_TOOTH 34
#define GEAR_VERTEX_STRIDE 6 #define GEAR_VERTEX_STRIDE 6
static inline void #ifndef HAVE_SINCOS
_sincos (double x, double *_sin, double *_cos) static void
sincos (double x, double *_sin, double *_cos)
{ {
#ifdef HAVE_SINCOS
sincos (x, _sin, _cos);
#else
*_sin = sin (x); *_sin = sin (x);
*_cos = cos (x); *_cos = cos (x);
#endif
} }
#endif
/** /**
* Struct describing the vertices in triangle strip * Struct describing the vertices in triangle strip
@@ -309,11 +307,11 @@ create_gear (GLfloat inner_radius,
struct point p[7]; struct point p[7];
/* Calculate needed sin/cos for various angles */ /* Calculate needed sin/cos for various angles */
_sincos(i * 2.0 * G_PI / teeth + da * 0, &s[0], &c[0]); sincos(i * 2.0 * G_PI / teeth + da * 0, &s[0], &c[0]);
_sincos(i * 2.0 * M_PI / teeth + da * 1, &s[1], &c[1]); sincos(i * 2.0 * M_PI / teeth + da * 1, &s[1], &c[1]);
_sincos(i * 2.0 * M_PI / teeth + da * 2, &s[2], &c[2]); sincos(i * 2.0 * M_PI / teeth + da * 2, &s[2], &c[2]);
_sincos(i * 2.0 * M_PI / teeth + da * 3, &s[3], &c[3]); sincos(i * 2.0 * M_PI / teeth + da * 3, &s[3], &c[3]);
_sincos(i * 2.0 * M_PI / teeth + da * 4, &s[4], &c[4]); sincos(i * 2.0 * M_PI / teeth + da * 4, &s[4], &c[4]);
GEAR_POINT(p[0], r2, 1); GEAR_POINT(p[0], r2, 1);
GEAR_POINT(p[1], r2, 2); GEAR_POINT(p[1], r2, 2);
@@ -522,7 +520,7 @@ void perspective(GLfloat *m, GLfloat fovy, GLfloat aspect, GLfloat zNear, GLfloa
identity(tmp); identity(tmp);
deltaZ = zFar - zNear; deltaZ = zFar - zNear;
_sincos(radians, &sine, &cosine); sincos(radians, &sine, &cosine);
if ((deltaZ == 0) || (sine == 0) || (aspect == 0)) if ((deltaZ == 0) || (sine == 0) || (aspect == 0))
return; return;
@@ -737,6 +735,7 @@ gtk_gears_realize (GtkWidget *widget)
GtkGLArea *glarea = GTK_GL_AREA (widget); GtkGLArea *glarea = GTK_GL_AREA (widget);
GtkGears *gears = GTK_GEARS (widget); GtkGears *gears = GTK_GEARS (widget);
GtkGearsPrivate *priv = gtk_gears_get_instance_private (gears); GtkGearsPrivate *priv = gtk_gears_get_instance_private (gears);
GdkGLContext *context;
GLuint vao, v, f, program; GLuint vao, v, f, program;
const char *p; const char *p;
char msg[512]; char msg[512];
@@ -747,6 +746,8 @@ gtk_gears_realize (GtkWidget *widget)
if (gtk_gl_area_get_error (glarea) != NULL) if (gtk_gl_area_get_error (glarea) != NULL)
return; return;
context = gtk_gl_area_get_context (glarea);
glEnable (GL_CULL_FACE); glEnable (GL_CULL_FACE);
glEnable (GL_DEPTH_TEST); glEnable (GL_DEPTH_TEST);
@@ -756,7 +757,7 @@ gtk_gears_realize (GtkWidget *widget)
priv->vao = vao; priv->vao = vao;
/* Compile the vertex shader */ /* Compile the vertex shader */
if (gtk_gl_area_get_api (glarea) == GDK_GL_API_GLES) if (gdk_gl_context_get_use_es (context))
p = vertex_shader_gles; p = vertex_shader_gles;
else else
p = vertex_shader_gl; p = vertex_shader_gl;
@@ -767,7 +768,7 @@ gtk_gears_realize (GtkWidget *widget)
g_debug ("vertex shader info: %s\n", msg); g_debug ("vertex shader info: %s\n", msg);
/* Compile the fragment shader */ /* Compile the fragment shader */
if (gtk_gl_area_get_api (glarea) == GDK_GL_API_GLES) if (gdk_gl_context_get_use_es (context))
p = fragment_shader_gles; p = fragment_shader_gles;
else else
p = fragment_shader_gl; p = fragment_shader_gl;

View File

@@ -50,7 +50,7 @@ do_headerbar (GtkWidget *do_widget)
} }
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
gtk_widget_set_visible (window, TRUE); gtk_widget_show (window);
else else
gtk_window_destroy (GTK_WINDOW (window)); gtk_window_destroy (GTK_WINDOW (window));

View File

@@ -1,146 +0,0 @@
#include <gdk/gdk.h>
#include "hsla.h"
void
_gdk_hsla_init_from_rgba (GdkHSLA *hsla,
const GdkRGBA *rgba)
{
float min;
float max;
float red;
float green;
float blue;
float delta;
g_return_if_fail (hsla != NULL);
g_return_if_fail (rgba != NULL);
red = rgba->red;
green = rgba->green;
blue = rgba->blue;
if (red > green)
{
if (red > blue)
max = red;
else
max = blue;
if (green < blue)
min = green;
else
min = blue;
}
else
{
if (green > blue)
max = green;
else
max = blue;
if (red < blue)
min = red;
else
min = blue;
}
hsla->lightness = (max + min) / 2;
hsla->saturation = 0;
hsla->hue = 0;
hsla->alpha = rgba->alpha;
if (max != min)
{
if (hsla->lightness <= 0.5)
hsla->saturation = (max - min) / (max + min);
else
hsla->saturation = (max - min) / (2 - max - min);
delta = max -min;
if (red == max)
hsla->hue = (green - blue) / delta;
else if (green == max)
hsla->hue = 2 + (blue - red) / delta;
else if (blue == max)
hsla->hue = 4 + (red - green) / delta;
hsla->hue *= 60;
if (hsla->hue < 0.0)
hsla->hue += 360;
}
}
void
_gdk_rgba_init_from_hsla (GdkRGBA *rgba,
const GdkHSLA *hsla)
{
float hue;
float lightness;
float saturation;
float m1, m2;
lightness = hsla->lightness;
saturation = hsla->saturation;
if (lightness <= 0.5)
m2 = lightness * (1 + saturation);
else
m2 = lightness + saturation - lightness * saturation;
m1 = 2 * lightness - m2;
rgba->alpha = hsla->alpha;
if (saturation == 0)
{
rgba->red = lightness;
rgba->green = lightness;
rgba->blue = lightness;
}
else
{
hue = hsla->hue + 120;
while (hue > 360)
hue -= 360;
while (hue < 0)
hue += 360;
if (hue < 60)
rgba->red = m1 + (m2 - m1) * hue / 60;
else if (hue < 180)
rgba->red = m2;
else if (hue < 240)
rgba->red = m1 + (m2 - m1) * (240 - hue) / 60;
else
rgba->red = m1;
hue = hsla->hue;
while (hue > 360)
hue -= 360;
while (hue < 0)
hue += 360;
if (hue < 60)
rgba->green = m1 + (m2 - m1) * hue / 60;
else if (hue < 180)
rgba->green = m2;
else if (hue < 240)
rgba->green = m1 + (m2 - m1) * (240 - hue) / 60;
else
rgba->green = m1;
hue = hsla->hue - 120;
while (hue > 360)
hue -= 360;
while (hue < 0)
hue += 360;
if (hue < 60)
rgba->blue = m1 + (m2 - m1) * hue / 60;
else if (hue < 180)
rgba->blue = m2;
else if (hue < 240)
rgba->blue = m1 + (m2 - m1) * (240 - hue) / 60;
else
rgba->blue = m1;
}
}

View File

@@ -1,15 +0,0 @@
#pragma once
typedef struct _GdkHSLA GdkHSLA;
struct _GdkHSLA {
float hue;
float saturation;
float lightness;
float alpha;
};
void _gdk_hsla_init_from_rgba (GdkHSLA *hsla,
const GdkRGBA *rgba);
void _gdk_rgba_init_from_hsla (GdkRGBA *rgba,
const GdkHSLA *hsla);

View File

@@ -399,7 +399,7 @@ do_hypertext (GtkWidget *do_widget)
} }
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
gtk_widget_set_visible (window, TRUE); gtk_widget_show (window);
else else
gtk_window_destroy (GTK_WINDOW (window)); gtk_window_destroy (GTK_WINDOW (window));

View File

@@ -378,7 +378,7 @@ do_iconscroll (GtkWidget *do_widget)
} }
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
gtk_widget_set_visible (window, TRUE); gtk_widget_show (window);
else else
gtk_window_destroy (GTK_WINDOW (window)); gtk_window_destroy (GTK_WINDOW (window));

View File

@@ -320,7 +320,7 @@ do_iconview (GtkWidget *do_widget)
} }
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
gtk_widget_set_visible (window, TRUE); gtk_widget_show (window);
else else
gtk_window_destroy (GTK_WINDOW (window)); gtk_window_destroy (GTK_WINDOW (window));

View File

@@ -1,5 +1,4 @@
/* Icon View/Editing and Drag-and-Drop /* Icon View/Editing and Drag-and-Drop
* #Keywords: dnd
* *
* The GtkIconView widget supports Editing and Drag-and-Drop. * The GtkIconView widget supports Editing and Drag-and-Drop.
* This example also demonstrates using the generic GtkCellLayout * This example also demonstrates using the generic GtkCellLayout
@@ -151,7 +150,7 @@ do_iconview_edit (GtkWidget *do_widget)
} }
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
gtk_widget_set_visible (window, TRUE); gtk_widget_show (window);
else else
gtk_window_destroy (GTK_WINDOW (window)); gtk_window_destroy (GTK_WINDOW (window));

View File

@@ -1,191 +0,0 @@
/* Image Scaling
* #Keywords: zoom, scale, filter, action, menu
*
* The custom widget we create here is similar to a GtkPicture,
* but allows setting a zoom level and filtering mode for the
* displayed paintable.
*
* It also demonstrates how to add a context menu to a custom
* widget and connect it with widget actions.
*
* The context menu has items to change the zoom level.
*/
#include <gtk/gtk.h>
#include "demo3widget.h"
static void
file_opened (GObject *source,
GAsyncResult *result,
void *data)
{
GFile *file;
GError *error = NULL;
GdkTexture *texture;
file = gtk_file_dialog_open_finish (GTK_FILE_DIALOG (source), result, &error);
if (!file)
{
g_print ("%s\n", error->message);
g_error_free (error);
return;
}
texture = gdk_texture_new_from_file (file, &error);
g_object_unref (file);
if (!texture)
{
g_print ("%s\n", error->message);
g_error_free (error);
return;
}
g_object_set (G_OBJECT (data), "texture", texture, NULL);
g_object_unref (texture);
}
static void
open_file (GtkWidget *picker,
GtkWidget *demo)
{
GtkWindow *parent = GTK_WINDOW (gtk_widget_get_root (picker));
GtkFileDialog *dialog;
GtkFileFilter *filter;
GListStore *filters;
dialog = gtk_file_dialog_new ();
filter = gtk_file_filter_new ();
gtk_file_filter_set_name (filter, "Images");
gtk_file_filter_add_pixbuf_formats (filter);
filters = g_list_store_new (GTK_TYPE_FILE_FILTER);
g_list_store_append (filters, filter);
g_object_unref (filter);
gtk_file_dialog_set_filters (dialog, G_LIST_MODEL (filters));
g_object_unref (filters);
gtk_file_dialog_open (dialog, parent, NULL, file_opened, demo);
g_object_unref (dialog);
}
static void
rotate (GtkWidget *button,
GtkWidget *demo)
{
float angle;
g_object_get (demo, "angle", &angle, NULL);
angle = fmodf (angle + 90.f, 360.f);
g_object_set (demo, "angle", angle, NULL);
}
static gboolean
transform_to (GBinding *binding,
const GValue *src,
GValue *dest,
gpointer user_data)
{
double from;
float to;
from = g_value_get_double (src);
to = (float) pow (2., from);
g_value_set_float (dest, to);
return TRUE;
}
static gboolean
transform_from (GBinding *binding,
const GValue *src,
GValue *dest,
gpointer user_data)
{
float to;
double from;
to = g_value_get_float (src);
from = log2 (to);
g_value_set_double (dest, from);
return TRUE;
}
GtkWidget *
do_image_scaling (GtkWidget *do_widget)
{
static GtkWidget *window = NULL;
if (!window)
{
GtkWidget *box;
GtkWidget *box2;
GtkWidget *sw;
GtkWidget *widget;
GtkWidget *scale;
GtkWidget *dropdown;
GtkWidget *button;
window = gtk_window_new ();
gtk_window_set_title (GTK_WINDOW (window), "Image Scaling");
gtk_window_set_default_size (GTK_WINDOW (window), 600, 400);
gtk_window_set_display (GTK_WINDOW (window),
gtk_widget_get_display (do_widget));
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
gtk_window_set_child (GTK_WINDOW (window), box);
sw = gtk_scrolled_window_new ();
gtk_widget_set_vexpand (sw, TRUE);
gtk_box_append (GTK_BOX (box), sw);
widget = demo3_widget_new ("/transparent/portland-rose.jpg");
gtk_scrolled_window_set_child (GTK_SCROLLED_WINDOW (sw), widget);
box2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
gtk_box_append (GTK_BOX (box), box2);
button = gtk_button_new_from_icon_name ("document-open-symbolic");
gtk_widget_set_tooltip_text (button, "Open File");
g_signal_connect (button, "clicked", G_CALLBACK (open_file), widget);
gtk_box_append (GTK_BOX (box2), button);
button = gtk_button_new_from_icon_name ("object-rotate-right-symbolic");
gtk_widget_set_tooltip_text (button, "Rotate");
g_signal_connect (button, "clicked", G_CALLBACK (rotate), widget);
gtk_box_append (GTK_BOX (box2), button);
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_widget_set_tooltip_text (scale, "Zoom");
gtk_range_set_value (GTK_RANGE (scale), 0.);
gtk_widget_set_hexpand (scale, TRUE);
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);
gtk_widget_set_tooltip_text (dropdown, "Filter");
gtk_box_append (GTK_BOX (box2), dropdown);
g_object_bind_property (dropdown, "selected", widget, "filter", G_BINDING_DEFAULT);
g_object_bind_property_full (gtk_range_get_adjustment (GTK_RANGE (scale)), "value",
widget, "scale",
G_BINDING_BIDIRECTIONAL,
transform_to,
transform_from,
NULL, NULL);
}
if (!gtk_widget_get_visible (window))
gtk_widget_set_visible (window, TRUE);
else
gtk_window_destroy (GTK_WINDOW (window));
return window;
}

View File

@@ -83,17 +83,24 @@ progressive_timeout (gpointer data)
if (bytes_read < 0) if (bytes_read < 0)
{ {
GtkAlertDialog *dialog; GtkWidget *dialog;
dialog = gtk_alert_dialog_new ("Failure reading image file 'alphatest.png': %s", dialog = gtk_message_dialog_new (GTK_WINDOW (window),
GTK_DIALOG_DESTROY_WITH_PARENT,
GTK_MESSAGE_ERROR,
GTK_BUTTONS_CLOSE,
"Failure reading image file 'alphatest.png': %s",
error->message); error->message);
gtk_alert_dialog_show (dialog, NULL);
g_object_unref (dialog);
g_error_free (error); g_error_free (error);
g_signal_connect (dialog, "response",
G_CALLBACK (gtk_window_destroy), NULL);
g_object_unref (image_stream); g_object_unref (image_stream);
image_stream = NULL; image_stream = NULL;
gtk_widget_show (dialog);
load_timeout = 0; load_timeout = 0;
return FALSE; /* uninstall the timeout */ return FALSE; /* uninstall the timeout */
@@ -103,17 +110,25 @@ progressive_timeout (gpointer data)
buf, bytes_read, buf, bytes_read,
&error)) &error))
{ {
GtkAlertDialog *dialog; GtkWidget *dialog;
dialog = gtk_alert_dialog_new ("Failed to load image: %s", dialog = gtk_message_dialog_new (GTK_WINDOW (window),
GTK_DIALOG_DESTROY_WITH_PARENT,
GTK_MESSAGE_ERROR,
GTK_BUTTONS_CLOSE,
"Failed to load image: %s",
error->message); error->message);
gtk_alert_dialog_show (dialog, NULL);
g_object_unref (dialog);
g_error_free (error); g_error_free (error);
g_signal_connect (dialog, "response",
G_CALLBACK (gtk_window_destroy), NULL);
g_object_unref (image_stream); g_object_unref (image_stream);
image_stream = NULL; image_stream = NULL;
gtk_widget_show (dialog);
load_timeout = 0; load_timeout = 0;
return FALSE; /* uninstall the timeout */ return FALSE; /* uninstall the timeout */
@@ -128,14 +143,22 @@ progressive_timeout (gpointer data)
error = NULL; error = NULL;
if (!g_input_stream_close (image_stream, NULL, &error)) if (!g_input_stream_close (image_stream, NULL, &error))
{ {
GtkAlertDialog *dialog; GtkWidget *dialog;
dialog = gtk_alert_dialog_new ("Failed to load image: %s", dialog = gtk_message_dialog_new (GTK_WINDOW (window),
GTK_DIALOG_DESTROY_WITH_PARENT,
GTK_MESSAGE_ERROR,
GTK_BUTTONS_CLOSE,
"Failed to load image: %s",
error->message); error->message);
gtk_alert_dialog_show (dialog, NULL);
g_object_unref (dialog);
g_error_free (error); g_error_free (error);
g_signal_connect (dialog, "response",
G_CALLBACK (gtk_window_destroy), NULL);
gtk_widget_show (dialog);
g_object_unref (image_stream); g_object_unref (image_stream);
image_stream = NULL; image_stream = NULL;
g_object_unref (pixbuf_loader); g_object_unref (pixbuf_loader);
@@ -154,16 +177,25 @@ progressive_timeout (gpointer data)
* it was incomplete. * it was incomplete.
*/ */
error = NULL; error = NULL;
if (!gdk_pixbuf_loader_close (pixbuf_loader, &error)) if (!gdk_pixbuf_loader_close (pixbuf_loader,
&error))
{ {
GtkAlertDialog *dialog; GtkWidget *dialog;
dialog = gtk_alert_dialog_new ("Failed to load image: %s", dialog = gtk_message_dialog_new (GTK_WINDOW (window),
GTK_DIALOG_DESTROY_WITH_PARENT,
GTK_MESSAGE_ERROR,
GTK_BUTTONS_CLOSE,
"Failed to load image: %s",
error->message); error->message);
gtk_alert_dialog_show (dialog, NULL);
g_object_unref (dialog);
g_error_free (error); g_error_free (error);
g_signal_connect (dialog, "response",
G_CALLBACK (gtk_window_destroy), NULL);
gtk_widget_show (dialog);
g_object_unref (pixbuf_loader); g_object_unref (pixbuf_loader);
pixbuf_loader = NULL; pixbuf_loader = NULL;
@@ -184,14 +216,20 @@ progressive_timeout (gpointer data)
if (image_stream == NULL) if (image_stream == NULL)
{ {
GtkAlertDialog *dialog; GtkWidget *dialog;
dialog = gtk_alert_dialog_new ("%s", dialog = gtk_message_dialog_new (GTK_WINDOW (window),
error->message); GTK_DIALOG_DESTROY_WITH_PARENT,
gtk_alert_dialog_show (dialog, NULL); GTK_MESSAGE_ERROR,
g_object_unref (dialog); GTK_BUTTONS_CLOSE,
"%s", error->message);
g_error_free (error); g_error_free (error);
g_signal_connect (dialog, "response",
G_CALLBACK (gtk_window_destroy), NULL);
gtk_widget_show (dialog);
load_timeout = 0; load_timeout = 0;
return FALSE; /* uninstall the timeout */ return FALSE; /* uninstall the timeout */
@@ -422,7 +460,7 @@ do_images (GtkWidget *do_widget)
} }
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
gtk_widget_set_visible (window, TRUE); gtk_widget_show (window);
else else
gtk_window_destroy (GTK_WINDOW (window)); gtk_window_destroy (GTK_WINDOW (window));

View File

@@ -7,15 +7,13 @@
#include <glib/gi18n.h> #include <glib/gi18n.h>
#include <gtk/gtk.h> #include <gtk/gtk.h>
G_GNUC_BEGIN_IGNORE_DEPRECATIONS
static void static void
on_bar_response (GtkInfoBar *info_bar, on_bar_response (GtkInfoBar *info_bar,
int response_id, int response_id,
gpointer user_data) gpointer user_data)
{ {
GtkAlertDialog *dialog; GtkWidget *dialog;
char *detail; GtkWidget *window;
if (response_id == GTK_RESPONSE_CLOSE) if (response_id == GTK_RESPONSE_CLOSE)
{ {
@@ -23,12 +21,19 @@ on_bar_response (GtkInfoBar *info_bar,
return; return;
} }
dialog = gtk_alert_dialog_new ("You clicked a button on an info bar"); window = GTK_WIDGET (gtk_widget_get_root (GTK_WIDGET (info_bar)));
detail = g_strdup_printf ("Your response has been %d", response_id); dialog = gtk_message_dialog_new (GTK_WINDOW (window),
gtk_alert_dialog_set_detail (dialog, detail); GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
g_free (detail); GTK_MESSAGE_INFO,
gtk_alert_dialog_show (dialog, GTK_WINDOW (gtk_widget_get_root (GTK_WIDGET (info_bar)))); GTK_BUTTONS_OK,
g_object_unref (dialog); "You clicked a button on an info bar");
gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
"Your response has id %d", response_id);
g_signal_connect_swapped (dialog, "response",
G_CALLBACK (gtk_window_destroy), dialog);
gtk_widget_show (dialog);
} }
GtkWidget * GtkWidget *
@@ -140,7 +145,7 @@ do_infobar (GtkWidget *do_widget)
} }
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
gtk_widget_set_visible (window, TRUE); gtk_widget_show (window);
else else
gtk_window_destroy (GTK_WINDOW (window)); gtk_window_destroy (GTK_WINDOW (window));

View File

@@ -311,12 +311,5 @@ get_language_name_for_tag (guint32 tag)
lang = hb_ot_tag_to_language (tag); lang = hb_ot_tag_to_language (tag);
s = hb_language_to_string (lang); s = hb_language_to_string (lang);
if (strcmp (s, "und-fonipa") == 0)
return "International Phonetic Alphabet";
else if (strcmp (s, "und-fonnapa") == 0)
return "North-American Phonetic Alphabet";
else if (strcmp (s, "ro-md") == 0)
return "Moldavian";
return get_language_name (pango_language_from_string (s)); return get_language_name (pango_language_from_string (s));
} }

View File

@@ -54,7 +54,7 @@ do_layoutmanager (GtkWidget *parent)
} }
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
gtk_widget_set_visible (window, TRUE); gtk_widget_show (window);
else else
gtk_window_destroy (GTK_WINDOW (window)); gtk_window_destroy (GTK_WINDOW (window));

View File

@@ -190,7 +190,7 @@ do_layoutmanager2 (GtkWidget *parent)
} }
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
gtk_widget_set_visible (window, TRUE); gtk_widget_show (window);
else else
gtk_window_destroy (GTK_WINDOW (window)); gtk_window_destroy (GTK_WINDOW (window));

View File

@@ -7,6 +7,14 @@
#include <gtk/gtk.h> #include <gtk/gtk.h>
static void
response_cb (GtkWidget *dialog,
int response_id,
gpointer data)
{
gtk_window_destroy (GTK_WINDOW (dialog));
}
static gboolean static gboolean
activate_link (GtkWidget *label, activate_link (GtkWidget *label,
const char *uri, const char *uri,
@@ -14,15 +22,23 @@ activate_link (GtkWidget *label,
{ {
if (g_strcmp0 (uri, "keynav") == 0) if (g_strcmp0 (uri, "keynav") == 0)
{ {
GtkAlertDialog *dialog; GtkWidget *dialog;
GtkWidget *parent;
dialog = gtk_alert_dialog_new ("Keyboard navigation"); parent = GTK_WIDGET (gtk_widget_get_root (label));
gtk_alert_dialog_set_detail (dialog, dialog = gtk_message_dialog_new_with_markup (GTK_WINDOW (parent),
"The term keynav is a shorthand for " GTK_DIALOG_DESTROY_WITH_PARENT,
GTK_MESSAGE_INFO,
GTK_BUTTONS_OK,
"Keyboard navigation");
gtk_message_dialog_format_secondary_markup (GTK_MESSAGE_DIALOG (dialog),
"The term <i>keynav</i> is a shorthand for "
"keyboard navigation and refers to the process of using " "keyboard navigation and refers to the process of using "
"a program (exclusively) via keyboard input."); "a program (exclusively) via keyboard input.");
gtk_alert_dialog_show (dialog, GTK_WINDOW (gtk_widget_get_root (label))); gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
g_object_unref (dialog);
gtk_window_present (GTK_WINDOW (dialog));
g_signal_connect (dialog, "response", G_CALLBACK (response_cb), NULL);
return TRUE; return TRUE;
} }
@@ -63,10 +79,11 @@ do_links (GtkWidget *do_widget)
gtk_widget_set_margin_top (label, 20); gtk_widget_set_margin_top (label, 20);
gtk_widget_set_margin_bottom (label, 20); gtk_widget_set_margin_bottom (label, 20);
gtk_window_set_child (GTK_WINDOW (window), label); gtk_window_set_child (GTK_WINDOW (window), label);
gtk_widget_show (label);
} }
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
gtk_widget_set_visible (window, TRUE); gtk_widget_show (window);
else else
gtk_window_destroy (GTK_WINDOW (window)); gtk_window_destroy (GTK_WINDOW (window));

View File

@@ -300,7 +300,7 @@ do_list_store (GtkWidget *do_widget)
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
{ {
gtk_widget_set_visible (window, TRUE); gtk_widget_show (window);
if (timeout == 0) { if (timeout == 0) {
/* FIXME this should use the animation-duration instead */ /* FIXME this should use the animation-duration instead */
timeout = g_timeout_add (80, spinner_timeout, NULL); timeout = g_timeout_add (80, spinner_timeout, NULL);

View File

@@ -380,6 +380,7 @@ do_listbox (GtkWidget *do_widget)
{ {
message = gtk_message_new (lines[i]); message = gtk_message_new (lines[i]);
row = gtk_message_row_new (message); row = gtk_message_row_new (message);
gtk_widget_show (GTK_WIDGET (row));
gtk_list_box_insert (GTK_LIST_BOX (listbox), GTK_WIDGET (row), -1); gtk_list_box_insert (GTK_LIST_BOX (listbox), GTK_WIDGET (row), -1);
} }
@@ -388,7 +389,7 @@ do_listbox (GtkWidget *do_widget)
} }
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
gtk_widget_set_visible (window, TRUE); gtk_widget_show (window);
else else
gtk_window_destroy (GTK_WINDOW (window)); gtk_window_destroy (GTK_WINDOW (window));

View File

@@ -64,8 +64,6 @@
</child> </child>
<child> <child>
<object class="GtkLabel" id="short_time_label"> <object class="GtkLabel" id="short_time_label">
<property name="hexpand">1</property>
<property name="xalign">1</property>
<property name="valign">baseline</property> <property name="valign">baseline</property>
<property name="label" translatable="yes">38m</property> <property name="label" translatable="yes">38m</property>
<style> <style>

View File

@@ -62,7 +62,7 @@ do_listbox_controls (GtkWidget *do_widget)
} }
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
gtk_widget_set_visible (window, TRUE); gtk_widget_show (window);
else else
gtk_window_destroy (GTK_WINDOW (window)); gtk_window_destroy (GTK_WINDOW (window));

View File

@@ -29,13 +29,15 @@
</style> </style>
</object> </object>
</child> </child>
<child>
<object class="GtkFrame">
<child> <child>
<object class="GtkListBox"> <object class="GtkListBox">
<property name="selection-mode">none</property> <property name="selection-mode">none</property>
<property name="show-separators">1</property>
<signal name="row-activated" handler="row_activated"/> <signal name="row-activated" handler="row_activated"/>
<style> <style>
<class name="rich-list"/> <class name="rich-list"/>
<class name="boxed-list"/>
</style> </style>
<child> <child>
@@ -118,6 +120,8 @@
</child> </child>
</object> </object>
</child> </child>
</object>
</child>
<child> <child>
<object class="GtkLabel"> <object class="GtkLabel">
@@ -130,12 +134,14 @@
</style> </style>
</object> </object>
</child> </child>
<child>
<object class="GtkFrame">
<child> <child>
<object class="GtkListBox"> <object class="GtkListBox">
<property name="selection-mode">none</property> <property name="selection-mode">none</property>
<property name="show-separators">1</property>
<style> <style>
<class name="rich-list"/> <class name="rich-list"/>
<class name="boxed-list"/>
</style> </style>
<child> <child>
@@ -275,6 +281,8 @@
</object> </object>
</child> </child>
</object> </object>
</child>
</object>
<object class="GtkSizeGroup"> <object class="GtkSizeGroup">
<property name="mode">horizontal</property> <property name="mode">horizontal</property>
<widgets> <widgets>

View File

@@ -117,16 +117,19 @@ activate_cb (GtkListView *list,
G_APP_LAUNCH_CONTEXT (context), G_APP_LAUNCH_CONTEXT (context),
&error)) &error))
{ {
GtkAlertDialog *dialog; GtkWidget *dialog;
/* And because error handling is important, even a simple demo has it: /* And because error handling is important, even a simple demo has it:
* We display an error dialog that something went wrong. * We display an error dialog that something went wrong.
*/ */
dialog = gtk_alert_dialog_new ("Could not launch %s", g_app_info_get_display_name (app_info)); dialog = gtk_message_dialog_new (GTK_WINDOW (gtk_widget_get_root (GTK_WIDGET (list))),
gtk_alert_dialog_set_detail (dialog, error->message); GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL,
gtk_alert_dialog_show (dialog, GTK_WINDOW (gtk_widget_get_root (GTK_WIDGET (list)))); GTK_MESSAGE_ERROR,
g_object_unref (dialog); GTK_BUTTONS_CLOSE,
"Could not launch %s", g_app_info_get_display_name (app_info));
gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog), "%s", error->message);
g_clear_error (&error); g_clear_error (&error);
gtk_widget_show (dialog);
} }
g_object_unref (context); g_object_unref (context);
@@ -191,7 +194,7 @@ do_listview_applauncher (GtkWidget *do_widget)
} }
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
gtk_widget_set_visible (window, TRUE); gtk_widget_show (window);
else else
gtk_window_destroy (GTK_WINDOW (window)); gtk_window_destroy (GTK_WINDOW (window));

View File

@@ -494,7 +494,7 @@ do_listview_clocks (GtkWidget *do_widget)
} }
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
gtk_widget_set_visible (window, TRUE); gtk_widget_show (window);
else else
gtk_window_destroy (GTK_WINDOW (window)); gtk_window_destroy (GTK_WINDOW (window));

View File

@@ -1124,7 +1124,7 @@ do_listview_colors (GtkWidget *do_widget)
} }
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
gtk_widget_set_visible (window, TRUE); gtk_widget_show (window);
else else
gtk_window_destroy (GTK_WINDOW (window)); gtk_window_destroy (GTK_WINDOW (window));

View File

@@ -275,7 +275,7 @@ do_listview_filebrowser (GtkWidget *do_widget)
} }
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
gtk_widget_set_visible (window, TRUE); gtk_widget_show (window);
else else
gtk_window_destroy (GTK_WINDOW (window)); gtk_window_destroy (GTK_WINDOW (window));

View File

@@ -485,7 +485,7 @@ do_listview_minesweeper (GtkWidget *do_widget)
} }
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
gtk_widget_set_visible (window, TRUE); gtk_widget_show (window);
else else
gtk_window_destroy (GTK_WINDOW (window)); gtk_window_destroy (GTK_WINDOW (window));

View File

@@ -150,7 +150,7 @@ settings_key_new (GSettings *settings,
static void static void
item_value_changed (GtkEditableLabel *label, item_value_changed (GtkEditableLabel *label,
GParamSpec *pspec, GParamSpec *pspec,
GtkColumnViewCell *cell) GtkListItem *item)
{ {
SettingsKey *self; SettingsKey *self;
const char *text; const char *text;
@@ -162,7 +162,8 @@ item_value_changed (GtkEditableLabel *label,
text = gtk_editable_get_text (GTK_EDITABLE (label)); text = gtk_editable_get_text (GTK_EDITABLE (label));
self = gtk_column_view_cell_get_item (cell); g_object_get (item, "item", &self, NULL);
g_object_unref (self);
type = g_settings_schema_key_get_value_type (self->key); type = g_settings_schema_key_get_value_type (self->key);
name = g_settings_schema_key_get_name (self->key); name = g_settings_schema_key_get_name (self->key);
@@ -429,7 +430,7 @@ do_listview_settings (GtkWidget *do_widget)
} }
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
gtk_widget_set_visible (window, TRUE); gtk_widget_show (window);
else else
gtk_window_destroy (GTK_WINDOW (window)); gtk_window_destroy (GTK_WINDOW (window));

View File

@@ -20,7 +20,6 @@
<object class="GtkScrolledWindow"> <object class="GtkScrolledWindow">
<child> <child>
<object class="GtkListView" id="listview"> <object class="GtkListView" id="listview">
<property name="tab-behavior">item</property>
<style> <style>
<class name="navigation-sidebar"/> <class name="navigation-sidebar"/>
</style> </style>
@@ -77,7 +76,6 @@
<property name="vexpand">1</property> <property name="vexpand">1</property>
<child> <child>
<object class="GtkColumnView" id="columnview"> <object class="GtkColumnView" id="columnview">
<property name="tab-behavior">cell</property>
<style> <style>
<class name="data-table"/> <class name="data-table"/>
</style> </style>
@@ -90,13 +88,13 @@
<property name="bytes"><![CDATA[ <property name="bytes"><![CDATA[
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<interface> <interface>
<template class="GtkColumnViewCell"> <template class="GtkListItem">
<property name="child"> <property name="child">
<object class="GtkLabel"> <object class="GtkLabel">
<property name="xalign">0</property> <property name="xalign">0</property>
<binding name="label"> <binding name="label">
<lookup name="name" type="SettingsKey"> <lookup name="name" type="SettingsKey">
<lookup name="item">GtkColumnViewCell</lookup> <lookup name="item">GtkListItem</lookup>
</lookup> </lookup>
</binding> </binding>
</object> </object>
@@ -118,12 +116,12 @@
<property name="bytes"><![CDATA[ <property name="bytes"><![CDATA[
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<interface> <interface>
<template class="GtkColumnViewCell"> <template class="GtkListItem">
<property name="child"> <property name="child">
<object class="GtkEditableLabel"> <object class="GtkEditableLabel">
<binding name="text"> <binding name="text">
<lookup name="value" type="SettingsKey"> <lookup name="value" type="SettingsKey">
<lookup name="item">GtkColumnViewCell</lookup> <lookup name="item">GtkListItem</lookup>
</lookup> </lookup>
</binding> </binding>
<signal name="notify::label" handler="item_value_changed"/> <signal name="notify::label" handler="item_value_changed"/>
@@ -146,13 +144,13 @@
<property name="bytes"><![CDATA[ <property name="bytes"><![CDATA[
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<interface> <interface>
<template class="GtkColumnViewCell"> <template class="GtkListItem">
<property name="child"> <property name="child">
<object class="GtkLabel"> <object class="GtkLabel">
<property name="xalign">0</property> <property name="xalign">0</property>
<binding name="label"> <binding name="label">
<lookup name="type" type="SettingsKey"> <lookup name="type" type="SettingsKey">
<lookup name="item">GtkColumnViewCell</lookup> <lookup name="item">GtkListItem</lookup>
</lookup> </lookup>
</binding> </binding>
</object> </object>
@@ -175,13 +173,13 @@
<property name="bytes"><![CDATA[ <property name="bytes"><![CDATA[
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<interface> <interface>
<template class="GtkColumnViewCell"> <template class="GtkListItem">
<property name="child"> <property name="child">
<object class="GtkLabel"> <object class="GtkLabel">
<property name="xalign">0</property> <property name="xalign">0</property>
<binding name="label"> <binding name="label">
<lookup name="default-value" type="SettingsKey"> <lookup name="default-value" type="SettingsKey">
<lookup name="item">GtkColumnViewCell</lookup> <lookup name="item">GtkListItem</lookup>
</lookup> </lookup>
</binding> </binding>
</object> </object>
@@ -205,14 +203,14 @@
<property name="bytes"><![CDATA[ <property name="bytes"><![CDATA[
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<interface> <interface>
<template class="GtkColumnViewCell"> <template class="GtkListItem">
<property name="child"> <property name="child">
<object class="GtkLabel"> <object class="GtkLabel">
<property name="xalign">0</property> <property name="xalign">0</property>
<property name="wrap">1</property> <property name="wrap">1</property>
<binding name="label"> <binding name="label">
<lookup name="summary" type="SettingsKey"> <lookup name="summary" type="SettingsKey">
<lookup name="item">GtkColumnViewCell</lookup> <lookup name="item">GtkListItem</lookup>
</lookup> </lookup>
</binding> </binding>
</object> </object>
@@ -236,14 +234,14 @@
<property name="bytes"><![CDATA[ <property name="bytes"><![CDATA[
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<interface> <interface>
<template class="GtkColumnViewCell"> <template class="GtkListItem">
<property name="child"> <property name="child">
<object class="GtkLabel"> <object class="GtkLabel">
<property name="xalign">0</property> <property name="xalign">0</property>
<property name="wrap">1</property> <property name="wrap">1</property>
<binding name="label"> <binding name="label">
<lookup name="description" type="SettingsKey"> <lookup name="description" type="SettingsKey">
<lookup name="item">GtkColumnViewCell</lookup> <lookup name="item">GtkListItem</lookup>
</lookup> </lookup>
</binding> </binding>
</object> </object>

View File

@@ -383,7 +383,7 @@ do_listview_ucd (GtkWidget *do_widget)
} }
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
gtk_widget_set_visible (window, TRUE); gtk_widget_show (window);
else else
gtk_window_destroy (GTK_WINDOW (window)); gtk_window_destroy (GTK_WINDOW (window));

View File

@@ -317,7 +317,7 @@ do_listview_weather (GtkWidget *do_widget)
} }
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
gtk_widget_set_visible (window, TRUE); gtk_widget_show (window);
else else
gtk_window_destroy (GTK_WINDOW (window)); gtk_window_destroy (GTK_WINDOW (window));

View File

@@ -42,7 +42,7 @@ update_title_cb (GtkFilterListModel *model)
title = g_strdup_printf ("%u lines", g_list_model_get_n_items (G_LIST_MODEL (model))); title = g_strdup_printf ("%u lines", g_list_model_get_n_items (G_LIST_MODEL (model)));
gtk_widget_set_visible (progress, pending != 0); gtk_widget_set_visible (progress, pending != 0);
gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (progress), total > 0 ? (total - pending) / (double) total : 0.); gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (progress), (total - pending) / (double) total);
gtk_window_set_title (GTK_WINDOW (window), title); gtk_window_set_title (GTK_WINDOW (window), title);
g_free (title); g_free (title);
} }
@@ -141,34 +141,39 @@ load_file (GtkStringList *list,
} }
static void static void
open_response_cb (GObject *source, open_response_cb (GtkNativeDialog *dialog,
GAsyncResult *result, int response,
void *user_data) GtkStringList *stringlist)
{ {
GtkFileDialog *dialog = GTK_FILE_DIALOG (source); gtk_native_dialog_hide (dialog);
GtkStringList *stringlist = GTK_STRING_LIST (user_data);
if (response == GTK_RESPONSE_ACCEPT)
{
GFile *file; GFile *file;
file = gtk_file_dialog_open_finish (dialog, result, NULL); file = gtk_file_chooser_get_file (GTK_FILE_CHOOSER (dialog));
if (file)
{
load_file (stringlist, file); load_file (stringlist, file);
g_object_unref (file); g_object_unref (file);
} }
gtk_native_dialog_destroy (dialog);
} }
static void static void
file_open_cb (GtkWidget *button, file_open_cb (GtkWidget *button,
GtkStringList *stringlist) GtkStringList *stringlist)
{ {
GtkFileDialog *dialog; GtkFileChooserNative *dialog;
dialog = gtk_file_dialog_new (); dialog = gtk_file_chooser_native_new ("Open file",
gtk_file_dialog_open (dialog,
GTK_WINDOW (gtk_widget_get_root (button)), GTK_WINDOW (gtk_widget_get_root (button)),
NULL, GTK_FILE_CHOOSER_ACTION_OPEN,
open_response_cb, stringlist); "_Load",
g_object_unref (dialog); "_Cancel");
gtk_native_dialog_set_modal (GTK_NATIVE_DIALOG (dialog), TRUE);
g_signal_connect (dialog, "response", G_CALLBACK (open_response_cb), stringlist);
gtk_native_dialog_show (GTK_NATIVE_DIALOG (dialog));
} }
GtkWidget * GtkWidget *
@@ -248,7 +253,7 @@ do_listview_words (GtkWidget *do_widget)
} }
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
gtk_widget_set_visible (window, TRUE); gtk_widget_show (window);
else else
gtk_window_destroy (GTK_WINDOW (window)); gtk_window_destroy (GTK_WINDOW (window));

View File

@@ -1,7 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<interface> <interface>
<template class="GtkListItem"> <template class="GtkListItem">
<property name="focusable">0</property>
<property name="child"> <property name="child">
<object class="GtkTreeExpander" id="expander"> <object class="GtkTreeExpander" id="expander">
<binding name="list-row"> <binding name="list-row">

View File

@@ -463,6 +463,7 @@ add_data_tab (const char *demoname)
widget = display_nothing (resource_name); widget = display_nothing (resource_name);
label = gtk_label_new (label_string ? label_string : resources[i]); label = gtk_label_new (label_string ? label_string : resources[i]);
gtk_widget_show (label);
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,

View File

@@ -62,6 +62,7 @@ do_markup (GtkWidget *do_widget)
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window); g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
stack = gtk_stack_new (); stack = gtk_stack_new ();
gtk_widget_show (stack);
gtk_window_set_child (GTK_WINDOW (window), stack); gtk_window_set_child (GTK_WINDOW (window), stack);
show_source = gtk_check_button_new_with_label ("Source"); show_source = gtk_check_button_new_with_label ("Source");
@@ -117,10 +118,12 @@ do_markup (GtkWidget *do_widget)
gtk_text_buffer_end_irreversible_action (buffer); gtk_text_buffer_end_irreversible_action (buffer);
g_bytes_unref (bytes); g_bytes_unref (bytes);
gtk_widget_show (stack);
} }
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
gtk_widget_set_visible (window, TRUE); gtk_widget_show (window);
else else
gtk_window_destroy (GTK_WINDOW (window)); gtk_window_destroy (GTK_WINDOW (window));

View File

@@ -1,53 +0,0 @@
/* Masking
*
* Demonstrates mask nodes.
*
* This demo uses a text node as mask for
* an animated linear gradient.
*/
#include <gtk/gtk.h>
#include "demo4widget.h"
GtkWidget *
do_mask (GtkWidget *do_widget)
{
static GtkWidget *window = NULL;
if (!window)
{
GtkWidget *box;
GtkWidget *demo;
GtkWidget *scale;
window = gtk_window_new ();
gtk_window_set_title (GTK_WINDOW (window), "Mask Nodes");
gtk_window_set_default_size (GTK_WINDOW (window), 600, 400);
gtk_window_set_display (GTK_WINDOW (window),
gtk_widget_get_display (do_widget));
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
gtk_window_set_child (GTK_WINDOW (window), box);
demo = demo4_widget_new ();
gtk_widget_set_hexpand (demo, TRUE);
gtk_widget_set_vexpand (demo, TRUE);
gtk_box_append (GTK_BOX (box), demo);
scale = gtk_scale_new_with_range (GTK_ORIENTATION_HORIZONTAL, 0, 1, 0.1);
gtk_range_set_value (GTK_RANGE (scale), 0.5);
g_object_bind_property (gtk_range_get_adjustment (GTK_RANGE (scale)), "value", demo, "progress", 0);
gtk_box_append (GTK_BOX (box), scale);
}
if (!gtk_widget_get_visible (window))
gtk_widget_set_visible (window, TRUE);
else
gtk_window_destroy (GTK_WINDOW (window));
return window;
}

61
demos/gtk-demo/menu.c Normal file
View File

@@ -0,0 +1,61 @@
/* Menu
* #Keywords: action, zoom
*
* Demonstrates how to add a context menu to a custom widget
* and connect it with widget actions.
*
* The custom widget we create here is similar to a GtkPicture,
* but allows setting a zoom level for the displayed paintable.
*
* Our context menu has items to change the zoom level.
*/
#include <gtk/gtk.h>
#include "demo3widget.h"
GtkWidget *
do_menu (GtkWidget *do_widget)
{
static GtkWidget *window = NULL;
if (!window)
{
GtkWidget *box;
GtkWidget *sw;
GtkWidget *widget;
GtkWidget *scale;
window = gtk_window_new ();
gtk_window_set_title (GTK_WINDOW (window), "Menu");
gtk_window_set_default_size (GTK_WINDOW (window), 600, 400);
gtk_window_set_display (GTK_WINDOW (window),
gtk_widget_get_display (do_widget));
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
gtk_window_set_child (GTK_WINDOW (window), box);
sw = gtk_scrolled_window_new ();
gtk_widget_set_vexpand (sw, TRUE);
gtk_box_append (GTK_BOX (box), sw);
widget = demo3_widget_new ("/transparent/portland-rose.jpg");
gtk_scrolled_window_set_child (GTK_SCROLLED_WINDOW (sw), widget);
scale = gtk_scale_new_with_range (GTK_ORIENTATION_HORIZONTAL, 0.01, 10.0, 0.1);
gtk_range_set_value (GTK_RANGE (scale), 1.0);
gtk_box_append (GTK_BOX (box), scale);
g_object_bind_property (gtk_range_get_adjustment (GTK_RANGE (scale)), "value",
widget, "scale",
G_BINDING_BIDIRECTIONAL);
}
if (!gtk_widget_get_visible (window))
gtk_widget_show (window);
else
gtk_window_destroy (GTK_WINDOW (window));
return window;
}

View File

@@ -39,7 +39,6 @@ demos = files([
'iconscroll.c', 'iconscroll.c',
'iconview.c', 'iconview.c',
'iconview_edit.c', 'iconview_edit.c',
'image_scaling.c',
'images.c', 'images.c',
'infobar.c', 'infobar.c',
'layoutmanager.c', 'layoutmanager.c',
@@ -47,7 +46,7 @@ demos = files([
'links.c', 'links.c',
'listbox.c', 'listbox.c',
'listbox_controls.c', 'listbox_controls.c',
'mask.c', 'menu.c',
'flowbox.c', 'flowbox.c',
'list_store.c', 'list_store.c',
'listview_applauncher.c', 'listview_applauncher.c',
@@ -55,7 +54,7 @@ demos = files([
'listview_colors.c', 'listview_colors.c',
'listview_filebrowser.c', 'listview_filebrowser.c',
'listview_minesweeper.c', 'listview_minesweeper.c',
'listview_selections.c', 'dropdown.c',
'listview_settings.c', 'listview_settings.c',
'listview_ucd.c', 'listview_ucd.c',
'listview_weather.c', 'listview_weather.c',
@@ -115,7 +114,6 @@ extra_demo_sources = files([
'gtkshadertoy.c', 'gtkshadertoy.c',
'gtkshaderstack.c', 'gtkshaderstack.c',
'gskshaderpaintable.c', 'gskshaderpaintable.c',
'hsla.c',
'puzzlepiece.c', 'puzzlepiece.c',
'bluroverlay.c', 'bluroverlay.c',
'demoimage.c', 'demoimage.c',
@@ -128,7 +126,6 @@ extra_demo_sources = files([
'four_point_transform.c', 'four_point_transform.c',
'demo2widget.c', 'demo2widget.c',
'demo3widget.c', 'demo3widget.c',
'demo4widget.c',
'pixbufpaintable.c', 'pixbufpaintable.c',
'script-names.c', 'script-names.c',
'unicode-names.c', 'unicode-names.c',
@@ -159,7 +156,7 @@ demos_h = custom_target('gtk4 demo header',
objcopy_supports_add_symbol = false objcopy_supports_add_symbol = false
objcopy = find_program('objcopy', required : false) objcopy = find_program('objcopy', required : false)
if objcopy.found() if objcopy.found()
objcopy_supports_add_symbol = run_command(objcopy, '--help', check: false).stdout().contains('--add-symbol') objcopy_supports_add_symbol = run_command(objcopy, '--help').stdout().contains('--add-symbol')
endif endif
ld = find_program('ld', required : false) ld = find_program('ld', required : false)
@@ -225,7 +222,7 @@ if not meson.is_cross_build() and build_machine.cpu_family() != 'arm' and build_
else else
gtkdemo_resources = gnome.compile_resources('gtkdemo_resources', gtkdemo_resources = gnome.compile_resources('gtkdemo_resources',
'demo.gresource.xml', 'demo.gresource.xml',
source_dir: meson.current_source_dir() source_dir: '.',
) )
endif endif

View File

@@ -84,7 +84,7 @@ do_overlay (GtkWidget *do_widget)
} }
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
gtk_widget_set_visible (window, TRUE); gtk_widget_show (window);
else else
gtk_window_destroy (GTK_WINDOW (window)); gtk_window_destroy (GTK_WINDOW (window));

View File

@@ -94,7 +94,7 @@ do_overlay_decorative (GtkWidget *do_widget)
} }
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
gtk_widget_set_visible (window, TRUE); gtk_widget_show (window);
else else
gtk_window_destroy (GTK_WINDOW (window)); gtk_window_destroy (GTK_WINDOW (window));

View File

@@ -28,7 +28,7 @@ do_pagesetup (GtkWidget *do_widget)
} }
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
gtk_widget_set_visible (window, TRUE); gtk_widget_show (window);
else else
gtk_window_destroy (GTK_WINDOW (window)); gtk_window_destroy (GTK_WINDOW (window));

View File

@@ -7,8 +7,6 @@
#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
@@ -24,7 +22,6 @@ typedef struct
GdkRGBA draw_color; GdkRGBA draw_color;
GtkPadController *pad_controller; GtkPadController *pad_controller;
double brush_size; double brush_size;
GtkGesture *gesture;
} DrawingArea; } DrawingArea;
typedef struct typedef struct
@@ -55,7 +52,7 @@ static GType drawing_area_get_type (void);
G_DEFINE_TYPE (DrawingArea, drawing_area, GTK_TYPE_WIDGET) G_DEFINE_TYPE (DrawingArea, drawing_area, GTK_TYPE_WIDGET)
static void drawing_area_set_color (DrawingArea *area, static void drawing_area_set_color (DrawingArea *area,
const GdkRGBA *color); GdkRGBA *color);
static void static void
drawing_area_ensure_surface (DrawingArea *area, drawing_area_ensure_surface (DrawingArea *area,
@@ -104,11 +101,13 @@ drawing_area_size_allocate (GtkWidget *widget,
static void static void
drawing_area_map (GtkWidget *widget) drawing_area_map (GtkWidget *widget)
{ {
GtkAllocation allocation;
GTK_WIDGET_CLASS (drawing_area_parent_class)->map (widget); GTK_WIDGET_CLASS (drawing_area_parent_class)->map (widget);
gtk_widget_get_allocation (widget, &allocation);
drawing_area_ensure_surface ((DrawingArea *) widget, drawing_area_ensure_surface ((DrawingArea *) widget,
gtk_widget_get_width (widget), allocation.width, allocation.height);
gtk_widget_get_height (widget));
} }
static void static void
@@ -261,7 +260,7 @@ drawing_area_apply_stroke (DrawingArea *area,
double y, double y,
double pressure) double pressure)
{ {
if (tool && gdk_device_tool_get_tool_type (tool) == GDK_DEVICE_TOOL_TYPE_ERASER) if (gdk_device_tool_get_tool_type (tool) == GDK_DEVICE_TOOL_TYPE_ERASER)
{ {
cairo_set_line_width (area->cr, 10 * pressure * area->brush_size); cairo_set_line_width (area->cr, 10 * pressure * area->brush_size);
cairo_set_operator (area->cr, CAIRO_OPERATOR_DEST_OUT); cairo_set_operator (area->cr, CAIRO_OPERATOR_DEST_OUT);
@@ -312,9 +311,7 @@ stylus_gesture_motion (GtkGestureStylus *gesture,
drawing_area_apply_stroke (area, tool, drawing_area_apply_stroke (area, tool,
backlog[i].axes[GDK_AXIS_X], backlog[i].axes[GDK_AXIS_X],
backlog[i].axes[GDK_AXIS_Y], backlog[i].axes[GDK_AXIS_Y],
backlog[i].flags & GDK_AXIS_FLAG_PRESSURE backlog[i].axes[GDK_AXIS_PRESSURE]);
? backlog[i].axes[GDK_AXIS_PRESSURE]
: 1);
} }
g_free (backlog); g_free (backlog);
@@ -344,8 +341,6 @@ drawing_area_init (DrawingArea *area)
area->draw_color = (GdkRGBA) { 0, 0, 0, 1 }; area->draw_color = (GdkRGBA) { 0, 0, 0, 1 };
area->brush_size = 1; area->brush_size = 1;
area->gesture = gesture;
} }
static GtkWidget * static GtkWidget *
@@ -356,7 +351,7 @@ drawing_area_new (void)
static void static void
drawing_area_set_color (DrawingArea *area, drawing_area_set_color (DrawingArea *area,
const GdkRGBA *color) GdkRGBA *color)
{ {
if (gdk_rgba_equal (&area->draw_color, color)) if (gdk_rgba_equal (&area->draw_color, color))
return; return;
@@ -366,28 +361,21 @@ drawing_area_set_color (DrawingArea *area,
} }
static void static void
color_button_color_set (GtkColorDialogButton *button, color_button_color_set (GtkColorButton *button,
GParamSpec *pspec,
DrawingArea *draw_area) DrawingArea *draw_area)
{ {
const GdkRGBA *color; GdkRGBA color;
color = gtk_color_dialog_button_get_rgba (button); gtk_color_chooser_get_rgba (GTK_COLOR_CHOOSER (button), &color);
drawing_area_set_color (draw_area, color); drawing_area_set_color (draw_area, &color);
} }
static void static void
drawing_area_color_set (DrawingArea *area, drawing_area_color_set (DrawingArea *area,
GdkRGBA *color, GdkRGBA *color,
GtkColorDialogButton *button) GtkColorButton *button)
{ {
gtk_color_dialog_button_set_rgba (button, color); gtk_color_chooser_set_rgba (GTK_COLOR_CHOOSER (button), color);
}
static GtkGesture *
drawing_area_get_gesture (DrawingArea *area)
{
return area->gesture;
} }
GtkWidget * GtkWidget *
@@ -397,7 +385,7 @@ do_paint (GtkWidget *toplevel)
if (!window) if (!window)
{ {
GtkWidget *draw_area, *headerbar, *button; GtkWidget *draw_area, *headerbar, *colorbutton;
window = gtk_window_new (); window = gtk_window_new ();
@@ -406,29 +394,22 @@ do_paint (GtkWidget *toplevel)
headerbar = gtk_header_bar_new (); headerbar = gtk_header_bar_new ();
button = gtk_color_dialog_button_new (gtk_color_dialog_new ()); colorbutton = gtk_color_button_new ();
g_signal_connect (button, "notify::rgba", g_signal_connect (colorbutton, "color-set",
G_CALLBACK (color_button_color_set), draw_area); G_CALLBACK (color_button_color_set), draw_area);
g_signal_connect (draw_area, "color-set", g_signal_connect (draw_area, "color-set",
G_CALLBACK (drawing_area_color_set), button); G_CALLBACK (drawing_area_color_set), colorbutton);
gtk_color_dialog_button_set_rgba (GTK_COLOR_DIALOG_BUTTON (button), gtk_color_chooser_set_rgba (GTK_COLOR_CHOOSER (colorbutton),
&(GdkRGBA) { 0, 0, 0, 1 }); &(GdkRGBA) { 0, 0, 0, 1 });
gtk_header_bar_pack_end (GTK_HEADER_BAR (headerbar), button); gtk_header_bar_pack_end (GTK_HEADER_BAR (headerbar), colorbutton);
button = gtk_check_button_new_with_label ("Stylus only");
g_object_bind_property (button, "active",
drawing_area_get_gesture ((DrawingArea *)draw_area), "stylus-only",
G_BINDING_SYNC_CREATE);
gtk_header_bar_pack_start (GTK_HEADER_BAR (headerbar), button);
gtk_window_set_titlebar (GTK_WINDOW (window), headerbar); gtk_window_set_titlebar (GTK_WINDOW (window), headerbar);
gtk_window_set_title (GTK_WINDOW (window), "Paint"); gtk_window_set_title (GTK_WINDOW (window), "Paint");
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window); g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
} }
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
gtk_widget_set_visible (window, TRUE); gtk_widget_show (window);
else else
gtk_window_destroy (GTK_WINDOW (window)); gtk_window_destroy (GTK_WINDOW (window));

View File

@@ -175,7 +175,7 @@ do_paintable (GtkWidget *do_widget)
} }
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
gtk_widget_set_visible (window, TRUE); gtk_widget_show (window);
else else
gtk_window_destroy (GTK_WINDOW (window)); gtk_window_destroy (GTK_WINDOW (window));

View File

@@ -214,7 +214,7 @@ do_paintable_animated (GtkWidget *do_widget)
} }
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
gtk_widget_set_visible (window, TRUE); gtk_widget_show (window);
else else
gtk_window_destroy (GTK_WINDOW (window)); gtk_window_destroy (GTK_WINDOW (window));

View File

@@ -177,7 +177,7 @@ do_paintable_emblem (GtkWidget *do_widget)
} }
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
gtk_widget_set_visible (window, TRUE); gtk_widget_show (window);
else else
gtk_window_destroy (GTK_WINDOW (window)); gtk_window_destroy (GTK_WINDOW (window));

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