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
2535 changed files with 106998 additions and 238613 deletions

View File

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

1
.gitignore vendored
View File

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

View File

@@ -22,43 +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 -Dbuild-testsuite=true -Dintrospection=enabled" 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:v48" 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:
# run merge request pipelines - branches
- if: $CI_PIPELINE_SOURCE == "merge_request_event" except:
# do not run branch pipelines if corresponding merge requests exist... - tags
# (this avoids duplicate pipelines)
- if: $CI_COMMIT_BRANCH && $CI_OPEN_MERGE_REQUESTS
when: never
# ...but otherwise run branch pipelines
- if: $CI_COMMIT_BRANCH
# run tag pipelines
- if: $CI_COMMIT_TAG
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
@@ -66,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:
@@ -78,12 +63,16 @@ style-check-diff:
- "${CI_PROJECT_DIR}/_build/testsuite/tools/output/*/*" - "${CI_PROJECT_DIR}/_build/testsuite/tools/output/*/*"
- "${CI_PROJECT_DIR}/_build/testsuite/gsk/compare/*/*/*.png" - "${CI_PROJECT_DIR}/_build/testsuite/gsk/compare/*/*/*.png"
- "${CI_PROJECT_DIR}/_build/testsuite/css/output/*/*.syscap" - "${CI_PROJECT_DIR}/_build/testsuite/css/output/*/*.syscap"
- "${CI_PROJECT_DIR}/_build/testsuite/headless/*/*.log"
- "${CI_PROJECT_DIR}/_build_hello/meson-logs" - "${CI_PROJECT_DIR}/_build_hello/meson-logs"
cache: cache:
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
@@ -93,18 +82,19 @@ 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 - mkdir _install
- meson subprojects update --reset - meson --prefix=${CI_PROJECT_DIR}/_install
- meson setup ${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
- PKG_CONFIG_PATH=${CI_PROJECT_DIR}/_install/lib64/pkgconfig:${CI_PROJECT_DIR}/_install/share/pkgconfig meson setup _build_hello examples/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 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
release-build: release-build:
extends: .build-fedora-default extends: .build-fedora-default
@@ -114,43 +104,12 @@ 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
- mkdir _install
- meson setup
--prefix=${CI_PROJECT_DIR}/_install
${COMMON_MESON_FLAGS}
${EXTRA_MESON_FLAGS}
${BACKEND_FLAGS}
${FEATURE_FLAGS}
_build _build
- meson compile -C _build - ninja -C _build
- meson install -C _build
- PKG_CONFIG_PATH=${CI_PROJECT_DIR}/_install/lib64/pkgconfig:${CI_PROJECT_DIR}/_install/share/pkgconfig meson setup _build_hello examples/hello
- LD_LIBRARY_PATH=${CI_PROJECT_DIR}/_install/lib64 meson compile -C _build_hello
- .gitlab-ci/run-tests.sh _build x11 - .gitlab-ci/run-tests.sh _build x11
fedora-clang:
extends: .build-fedora-default
stage: build
needs: []
variables:
EXTRA_MESON_FLAGS: "--buildtype=release"
script:
- .gitlab-ci/show-info-linux.sh
- export PATH="$HOME/.local/bin:$PATH"
- export CC=clang
- meson subprojects download
- meson subprojects update --reset
- meson setup
${COMMON_MESON_FLAGS}
${EXTRA_MESON_FLAGS}
${BACKEND_FLAGS}
${FEATURE_FLAGS}
_build
- meson compile -C _build
fedora-mingw64: fedora-mingw64:
extends: .build-fedora-default extends: .build-fedora-default
stage: build stage: build
@@ -169,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
@@ -205,55 +187,41 @@ msys2-mingw64:
paths: paths:
- "${CI_PROJECT_DIR}/_build/gtkdll.tar.gz" - "${CI_PROJECT_DIR}/_build/gtkdll.tar.gz"
macos-x86_64: macos:
rules: extends: .only-default
# Do not run in forks as the runner is not available there. only:
- if: $CI_PROJECT_NAMESPACE == "GNOME" - branches@GNOME/gtk
stage: build stage: build
allow_failure: true
tags: tags:
- macosintel - macos
needs: [] needs: []
variables:
MESON_FORCE_BACKTRACKE: 1
TMPDIR: /Users/Shared/work/tmp
SDKROOT: /opt/sdks/MacOSX10.13.4.sdk
CCACHE_DIR: /Users/Shared/work/ccache
PIP_CACHE_DIR: /Users/Shared/build/cache
PIPENV_CACHE_DIR: $PIP_CACHE_DIR
PYTHONPYCACHEPREFIX: $PIP_CACHE_DIR
before_script: before_script:
- bash .gitlab-ci/show-info-osx.sh - bash .gitlab-ci/show-info-osx.sh
- python3 -m venv .venv - pip3 install --user meson==0.60.3
- ln -s /opt/cmake/CMake.app/Contents/bin/cmake .venv/bin - pip3 install --user ninja
- ln -s /opt/ccache/ccache .venv/bin - export PATH=/Users/gitlabrunner/Library/Python/3.7/bin:$PATH
- source .venv/bin/activate - export MESON_FORCE_BACKTRACE=1
- pip3 install meson==1.2.0
- pip3 install ninja==1.11.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
-Dbuild-demos=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
@@ -266,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:
@@ -276,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
@@ -345,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
@@ -382,21 +336,15 @@ 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}
${BACKEND_FLAGS}
${FEATURE_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 ]
@@ -404,46 +352,22 @@ asan-build:
needs: [] needs: []
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
-Dbuild-demos=false
-Dbuild-tests=false
-Dbuild-examples=false
-Dintrospection=disabled
-Df16c=disabled
_build
- ninja -C _build - ninja -C _build
- .gitlab-ci/run-tests.sh _build wayland - .gitlab-ci/run-tests.sh _build wayland
- .gitlab-ci/run-tests.sh _build wayland_gles
- .gitlab-ci/run-tests.sh _build x11
artifacts: artifacts:
when: always
paths: paths:
- "${CI_PROJECT_DIR}/_build/meson-logs" - _build/meson-logs
allow_failure: true
reference: reference:
image: $FEDORA_IMAGE image: $FEDORA_IMAGE
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
-Ddocumentation=true
-Dgtk_doc=true
-Dgdk-pixbuf:gtk_doc=true
-Dpango:gtk_doc=true
-Dbuild-demos=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/
@@ -466,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,8 +30,7 @@ RUN dnf -y install \
glib2-static \ glib2-static \
glibc-devel \ glibc-devel \
glibc-headers \ glibc-headers \
glslc \ gnome-desktop-testing \
gnupg2 \
gobject-introspection-devel \ gobject-introspection-devel \
graphene-devel \ graphene-devel \
graphviz \ graphviz \
@@ -74,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 \
@@ -100,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,11 +20,10 @@ 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 \
-Dbuild-demos=true \ -Ddemos=true \
-Ddemo-profile=devel \ -Dprofile=devel \
_flatpak_build _flatpak_build
flatpak build ${builddir} ninja -C _flatpak_build install flatpak build ${builddir} ninja -C _flatpak_build install

View File

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

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

View File

@@ -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:detect_leaks=0:allocator_may_return_null=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,15 +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
exit_code=0
kill ${server} kill ${server}
;; ;;
@@ -82,18 +91,17 @@ esac
cd ${builddir} 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,8 +5,8 @@ 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 setup -Dbackend_max_links=1 -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
goto :EOF goto :EOF

View File

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

45
AUTHORS
View File

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

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

867
NEWS
View File

@@ -1,850 +1,9 @@
Overview of Changes in 4.13.1, xx-xx-xxxx Overview of Changes in 4.9.1, dd-mm-yyyy
=========================================
Overview of Changes in 4.13.0, 25-08-2023
=========================================
* GskPath, GskPathBuilder, GskPathMeasure:
Data types and APIs for path rendering. These APIs are still
considered experimental, and may change until 4.14. Please try
them out and give us feedback. Documentation can be found
here: https://docs.gtk.org/gsk4/paths.html
* GtkGridView:
- Fix a crash when scrolling
* GtkColumnView:
- Fix a refcounting issue in the new scroll_to api
* GtkTreeView
- Fix style classes for sort arrows
* GtkEntry:
- Improve tracking of user changes (for undo)
* GtkNotebook:
- Fix a critical when switching pages
* GtkColor/FontDialogButton:
- Make these widgets activatable
* GtkMenuButton:
- Fix problems with focus handling
- Fix problems with DND
- Make flags a settable property
* GtkShortcutsWindow:
- Add API to build shortcuts windows programmatically
* Printing
- Fix the cpdb backend build
* MacOS:
- Make file filters work again
* GSK:
- Fix issues with color matrix nodes
* Wayland:
- Fix a crash with compositors other than gnome-shell
* Deprecations:
- Remaining GtkTreeModel-related types
* Demos:
- Add a few path demos to gtk4-demo
* Tools:
- gtk4-path-tool provides a commandline interface for paths
* Translation updates:
Basque
Catalan
Finnish
Galician
Georgian
German
Greek
Indonesian
Kazakh
Persian
Polish
Romanian
Spanish
Swedish
Turkish
Ukrainian
Overview of Changes in 4.12.0, 05-08-2023
=========================================
* List widgets:
- Add scroll_to APIs
* GtkFileLauncher:
- Add an always-ask property
* GtkTextView:
- Make backspace behavior match GtkEntry
* gsk:
- Fix handling of luminance in mask nodes
* Text rendering:
- Automate the setting of gtk-hint-font-metrics from the
scale factor. This improves font rendering in flatpaks
* Wayland:
- Fix behavior of stylus buttons
- Support suspended window state
* Vulkan:
- Many improvements
* Tools:
- Add gtk4-rendernode-tool
* Debugging:
- Drop the GTK_DEBUG_TOUCHSCREEN flag
* Build:
- Some build options have been renamed:
gtk_doc -> documentation
update_screenshots -> screenshots
The old names still work
* Translation updates:
Georgian
Greek
Hebrew
Persian
Vietnamese
* Contributors:
Aleksandr Melman
Alexander Mikhaylenko
Alexander Shopov
Alexandre Franke
Alice Mikhaylenko
António Fernandes
Arjan Molenaar
Asier Sarasua Garmendia
Balázs Meskó
Balázs Úr
Barnabás Pőcze
Bart Jacobs
Benjamin Otte
Bilal Elmoussaoui
Boyuan Yang
Bruce Cowan
Calvin Walton
Cam Cook
Chris Mayo
Christian Hergert
Christopher Davis
Chun-wei Fan
Corey Berla
Danial Behzadi
Daniel Boles
Daniel Rusek
Efstathios Iosifidis
Ekaterine Papava
Emin Tufan Çetin
Emmanuele Bassi
Erik Schilling
Fabio Tomat
FeRD (Frank Dana)
Fina Wilke
FineFindus
Fran Dieguez
G.Willems
Georges Basile Stavracas Neto
Guillaume Bernard
Hugo Carvalho
Ivan Molodetskikh
Jason Francis
Jonas Ådahl
Jordan Petridis
Jordi Mas
José Expósito
José Roberto de Souza
Khalid Abu Shawarib
Kévin Commaille
Leônidas Araújo
Luca Bacci
Ludovico de Nittis
Lukáš Tyrychtr
Marc-André Lureau
Marco Trevisan (Treviño)
Matt Turner
Matthias Clasen
Maximiliano Sandoval R
Michael Catanzaro
Michel Dänzer
Mohammed Sadiq
Nathan Follens
Nelson Benítez León
Ngọc Quân Trần
Niels De Graef
Olivier Crête
Patrick Griffis
Piotr Drąg
Sabri Ünal
Sebastian Keller
Sophie Herold
Sébastien Le Roux
Takao Fujiwara
Thomas Lange
Yiğit Burak
Yosef Or Boczko
Yuri Chornoivan
Zander Brown
al_SeveR
dgsasha
sumibi-yakitori
tszymanski
velsinki
Алексей Шилин
Арсений Засыпкин
Overview of Changes in 4.11.4, 03-07-2023
=========================================
* GtkFileChooser:
- Default to sorting folders first
- Fix a crash when visiting recent files
* GtkTextView:
- Fix corner cases in word navigation
* GtkMenuButton:
- Normalize label layout
* GtkDropDown:
- Add support for sections
* GtkVideo:
- Make the overlay icon clickable
* GtkWindow:
- Clear the resize cursors to avoid artifacts
* GtkFileDialog:
- Always set initial-folder
* GtkDropDown:
- Update on expression changes
* GtkMapListModel:
- Implement GtkSectionModel
* Accessibility:
- Improvements all over the place: GtkButton, GtkPasswordEntry,
GtkFontChooserDialog, GtkColorChooserDialog, GtkShortcutsWindow,
GtkMenuButton, GtkAboutDialog, GtkFileChooserDialog, GtkStackSidebar,
GtkStackSwitcher, GtkMediaControls, GtkColorDialogButton, GtkDropDown,
GtkInfoBar, GtkNotebook, GtkPrintUnixDialog, GtkModelButton
- Make name computation follow the ARIA spec more closely
- Adapt name computation for the common 'nested button' scenario
- Change many containers to use `generic` instead of `group`
- Use `generic` as the default role
- Use `application` instead of `window` for windows
- Add properties for accessible names of not directly exposed
widgets in GtkListView, GtkGridView and GtkColumnView
* DND:
- Fix criticals when drops are rejected
* X11:
- Fix regressions in GLX setup
* Windows:
- Center newly created transient windows
* Vulkan:
- Add antialising for gradients
- Do less work on clipped away nodes
- Redo image uploading
- Support different image depths and formats
- Add a pipeline cache
* Demos:
- gtk4-demo: Improve window sizing
- gtk4-demo: Improve focus behavior
- gtk4-demo: Add many missing a11y properties
* Tools:
- gtk4-builder-tool: Make render an alias screenshot
* Inspector:
- Show more information in the a11y tab
- Add an accessibility overlay with warnings and recommendations
- Limit the width of the a11y tab
* Build:
- Require GLib 2.76
- Make asan builds work again
- Fix the build if ld is not ld.bdf
* Translation updates:
Brazilian Portuguese
Catalan
Czech
Georgian
Overview of Changes in 4.11.3, 05-06-2023
=========================================
* GtkGridView:
- Respect css border-spacing
- Don't leak the factories
* GtkListView:
- Don't leak the factories
* GtkColumnView:
- Support displaying sections
* GtkNotebook:
- Make the pages model implement GtkSelectionModel
* GtkScrolledWindow:
- Propagate child measure size whenever possible
* GtkPopoverMenu:
- Avoid unnecessary left padding
* GtkSearchEntry:
- Improve size allocation for the clear icon
* GtkBoxLayout:
- Fix a regression from recent baseline work
* CSS:
- Add new binding-friendly css provider apis
* Theme:
- Show focus in the shortcuts window
* GDK:
- Support grayscale and alpha texture formats for loading
and saving to png and tiff, and in GL
- Fix some regressions in GL context initialization
* GSK:
- Support grayscale and alpha texture formats in the GL renderer
- Support straight alpha textures in the GL renderer
- Many improvements to the experimental Vulkan renderer
* Wayland:
- Make exporting surface handles more flexible
* X11:
- Trap XRandr errors
- Stop using passive grabs during DND
* Windows:
- Many cleanups and simplifications
* Tests:
- Improve test coverage
* Build:
- Some build options have been renamed:
demos -> build-demos
profile -> demo-profile
The old names still work
* Deprecations:
- gtk_css_provider_load_from_data
- gdk_wayland_toplevel_unexport_handle
- gdk_pixbuf_get_from_surface
- gdk_pixbuf_get_from_texture
- gtk_image_new_from_pixbuf
- gtk_image_set_from_pixbuf
- gtk_picture_new_for_pixbuf
- gtk_picture_set_pixbuf
* Translation updates:
Basque
Catalan
Georgian
Russian
Turkish
Overview of Changes in 4.11.2, 09-05-2023
=========================================
* GtkGLArea:
- Add an allowed-apis property
* GtkListBox:
- Fix a problem with gtk_list_box_remove_all
* Add the GtkSectionModel interface, and implement it in most
of our list models
* GtkListView:
- Support displaying sections
* 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
* GtkBox:
- Support baselines in vertical orientation with GtkBox:baseline-child
* 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
- Improve accessibility of GtkShortcutsWindow
* Layout:
- Some fixes to baseline alignment
- Separate GTK_ALIGN_BASELINE_CENTER and _FILL
* CSS:
- Fix a crash with color transitions
* GSK:
- Fix problems with negative scales
- Improve scaling of offscreens for (cross-fades, masks, blends)
* GL:
- Add GdkGLTextureBuilder, a more flexible api for creating textures
- Support setting update regions for GL 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
* X11:
- Fix artifacts in gnome-shell frame decorations
* Windows:
- Fix GL context initialization
* Inspector:
- Improve the action list
- Improve the accessibility pane
- Fix a crash
* Tools:
- gtk4-node-editor: Improve scaling
- gtk4-node-editor: Preserve aspect ratio of textures
- gtk4-node-editor: Add some smarter editing
- gtk4-demo: Make the stylus demo work with mice
* Deprecations:
- gtk_widget_get_allocated_width/height/baseline
- GTK_ALIGN_BASELINE
* Translation updates
Bulgarian
Chinese (China)
Friulian
Galician
Hebrew
Persian
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
@@ -856,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
@@ -887,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

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

@@ -187,7 +187,7 @@
"--libdir=/app/lib", "--libdir=/app/lib",
"-Dvulkan=disabled", "-Dvulkan=disabled",
"-Dbuildtype=debugoptimized", "-Dbuildtype=debugoptimized",
"-Ddemo-profile=devel" "-Dprofile=devel"
], ],
"sources" : [ "sources" : [
{ {

View File

@@ -116,7 +116,7 @@
"--libdir=/app/lib", "--libdir=/app/lib",
"-Dvulkan=disabled", "-Dvulkan=disabled",
"-Dbuildtype=debugoptimized", "-Dbuildtype=debugoptimized",
"-Ddemo-profile=devel" "-Dprofile=devel"
], ],
"sources" : [ "sources" : [
{ {

View File

@@ -116,7 +116,7 @@
"--libdir=/app/lib", "--libdir=/app/lib",
"-Dvulkan=disabled", "-Dvulkan=disabled",
"-Dbuildtype=debugoptimized", "-Dbuildtype=debugoptimized",
"-Ddemo-profile=devel" "-Dprofile=devel"
], ],
"sources" : [ "sources" : [
{ {

View File

@@ -116,7 +116,7 @@
"--libdir=/app/lib", "--libdir=/app/lib",
"-Dvulkan=disabled", "-Dvulkan=disabled",
"-Dbuildtype=debugoptimized", "-Dbuildtype=debugoptimized",
"-Ddemo-profile=devel" "-Dprofile=devel"
], ],
"sources" : [ "sources" : [
{ {

View File

@@ -1,201 +0,0 @@
#!/usr/bin/env python3
#
# SPDX-FileCopyrightText: 2022 Collabora Inc.
# 2023 Emmanuele Bassi
#
# SPDX-License-Identifier: LGPL-2.1-or-later
#
# Original author: Xavier Claessens <xclaesse@gmail.com>
import argparse
import textwrap
from pathlib import Path
# Disable line length warnings as wrapping the C code templates would be hard
# flake8: noqa: E501
def gen_versions_macros(args, current_major_version, current_minor_version, current_micro_version):
with args.out_path.open("w", encoding="utf-8") as ofile, args.in_path.open(
"r", encoding="utf-8"
) as ifile:
for line in ifile.readlines():
if "@GDK_VERSIONS@" in line:
ofile.write(
textwrap.dedent(
f"""\
/**
* GDK_MAJOR_VERSION:
*
* The major version component of the library's version, e.g. "1" for "1.2.3".
*/
#define GDK_MAJOR_VERSION ({current_major_version})
/**
* GDK_MINOR_VERSION:
*
* The minor version component of the library's version, e.g. "2" for "1.2.3".
*/
#define GDK_MINOR_VERSION ({current_minor_version})
/**
* GDK_MICRO_VERSION:
*
* The micro version component of the library's version, e.g. "3" for "1.2.3".
*/
#define GDK_MICRO_VERSION ({current_micro_version})
"""
)
)
for minor in range(0, current_minor_version + 2, 2):
ofile.write(
textwrap.dedent(
f"""\
/**
* GDK_VERSION_{current_major_version}_{minor}:
*
* A macro that evaluates to the {current_major_version}.{minor} version of GTK, in a format
* that can be used by the C pre-processor.
*
* Since: {current_major_version}.{minor}
*/
#define GDK_VERSION_{current_major_version}_{minor} (G_ENCODE_VERSION ({current_major_version}, {minor}))
"""
)
)
else:
ofile.write(line)
def gen_visibility_macros(args, current_major_version, current_minor_version, current_micro_version):
"""
Generates a set of macros for each minor stable version of GTK
- GDK_DEPRECATED
- GDK_DEPRECATED_IN_…
- GDK_DEPRECATED_MACRO_IN_…
- GDK_DEPRECATED_ENUMERATOR_IN_…
- GDK_DEPRECATED_TYPE_IN_…
- GDK_AVAILABLE_IN_ALL
- GDK_AVAILABLE_IN_…
- GDK_AVAILABLE_STATIC_INLINE_IN_…
- GDK_AVAILABLE_MACRO_IN_…
- GDK_AVAILABLE_ENUMERATOR_IN_…
- GDK_AVAILABLE_TYPE_IN_…
- GDK_UNAVAILABLE(maj,min)
- GDK_UNAVAILABLE_STATIC_INLINE(maj,min)
"""
ns = args.namespace
with args.out_path.open("w", encoding="utf-8") as f:
f.write(
textwrap.dedent(
f"""\
#pragma once
#if (defined(_WIN32) || defined(__CYGWIN__)) && !defined({ns}_STATIC_COMPILATION)
# define _{ns}_EXPORT __declspec(dllexport)
# define _{ns}_IMPORT __declspec(dllimport)
#elif __GNUC__ >= 4
# define _{ns}_EXPORT __attribute__((visibility("default")))
# define _{ns}_IMPORT
#else
# define _{ns}_EXPORT
# define _{ns}_IMPORT
#endif
#ifdef GTK_COMPILATION
# define _{ns}_API _{ns}_EXPORT
#else
# define _{ns}_API _{ns}_IMPORT
#endif
#define _{ns}_EXTERN _{ns}_API extern
#define {ns}_VAR _{ns}_EXTERN
#define {ns}_AVAILABLE_IN_ALL _{ns}_EXTERN
#ifdef GDK_DISABLE_DEPRECATION_WARNINGS
#define {ns}_DEPRECATED _{ns}_EXTERN
#define {ns}_DEPRECATED_FOR(f) _{ns}_EXTERN
#define {ns}_UNAVAILABLE(maj,min) _{ns}_EXTERN
#define {ns}_UNAVAILABLE_STATIC_INLINE(maj,min)
#else
#define {ns}_DEPRECATED G_DEPRECATED _{ns}_EXTERN
#define {ns}_DEPRECATED_FOR(f) G_DEPRECATED_FOR(f) _{ns}_EXTERN
#define {ns}_UNAVAILABLE(maj,min) G_UNAVAILABLE(maj,min) _{ns}_EXTERN
#define {ns}_UNAVAILABLE_STATIC_INLINE(maj,min) G_UNAVAILABLE(maj,min)
#endif
"""
)
)
for minor in range(0, current_minor_version + 2, 2):
f.write(
textwrap.dedent(
f"""
#if GDK_VERSION_MIN_REQUIRED >= GDK_VERSION_4_{minor}
#define {ns}_DEPRECATED_IN_{current_major_version}_{minor} {ns}_DEPRECATED
#define {ns}_DEPRECATED_IN_{current_major_version}_{minor}_FOR(f) {ns}_DEPRECATED_FOR (f)
#define {ns}_DEPRECATED_MACRO_IN_{current_major_version}_{minor} GDK_DEPRECATED_MACRO
#define {ns}_DEPRECATED_MACRO_IN_{current_major_version}_{minor}_FOR(f) GDK_DEPRECATED_MACRO_FOR (f)
#define {ns}_DEPRECATED_ENUMERATOR_IN_{current_major_version}_{minor} GDK_DEPRECATED_ENUMERATOR
#define {ns}_DEPRECATED_ENUMERATOR_IN_{current_major_version}_{minor}_FOR(f) GDK_DEPRECATED_ENUMERATOR_FOR (f)
#define {ns}_DEPRECATED_TYPE_IN_{current_major_version}_{minor} GDK_DEPRECATED_TYPE
#define {ns}_DEPRECATED_TYPE_IN_{current_major_version}_{minor}_FOR(f) GDK_DEPRECATED_TYPE_FOR (f)
#else
#define {ns}_DEPRECATED_IN_{current_major_version}_{minor} _{ns}_EXTERN
#define {ns}_DEPRECATED_IN_{current_major_version}_{minor}_FOR(f) _{ns}_EXTERN
#define {ns}_DEPRECATED_MACRO_IN_{current_major_version}_{minor}
#define {ns}_DEPRECATED_MACRO_IN_{current_major_version}_{minor}_FOR(f)
#define {ns}_DEPRECATED_ENUMERATOR_IN_{current_major_version}_{minor}
#define {ns}_DEPRECATED_ENUMERATOR_IN_{current_major_version}_{minor}_FOR(f)
#define {ns}_DEPRECATED_TYPE_IN_{current_major_version}_{minor}
#define {ns}_DEPRECATED_TYPE_IN_{current_major_version}_{minor}_FOR(f)
#endif
#if GDK_VERSION_MAX_ALLOWED < GDK_VERSION_{current_major_version}_{minor}
#define {ns}_AVAILABLE_IN_{current_major_version}_{minor} {ns}_UNAVAILABLE ({current_major_version}, {minor})
#define {ns}_AVAILABLE_STATIC_INLINE_IN_{current_major_version}_{minor} GDK_UNAVAILABLE_STATIC_INLINE ({current_major_version}, {minor})
#define {ns}_AVAILABLE_MACRO_IN_{current_major_version}_{minor} GDK_UNAVAILABLE_MACRO ({current_major_version}, {minor})
#define {ns}_AVAILABLE_ENUMERATOR_IN_{current_major_version}_{minor} GDK_UNAVAILABLE_ENUMERATOR ({current_major_version}, {minor})
#define {ns}_AVAILABLE_TYPE_IN_{current_major_version}_{minor} GDK_UNAVAILABLE_TYPE ({current_major_version}, {minor})
#else
#define {ns}_AVAILABLE_IN_{current_major_version}_{minor} _{ns}_EXTERN
#define {ns}_AVAILABLE_STATIC_INLINE_IN_{current_major_version}_{minor}
#define {ns}_AVAILABLE_MACRO_IN_{current_major_version}_{minor}
#define {ns}_AVAILABLE_ENUMERATOR_IN_{current_major_version}_{minor}
#define {ns}_AVAILABLE_TYPE_IN_{current_major_version}_{minor}
#endif
"""
)
)
def main():
parser = argparse.ArgumentParser()
parser.add_argument("gtk_version", help="Current GLib version")
subparsers = parser.add_subparsers()
versions_parser = subparsers.add_parser(
"versions-macros", help="Generate versions macros"
)
versions_parser.add_argument("in_path", help="input file", type=Path)
versions_parser.add_argument("out_path", help="output file", type=Path)
versions_parser.set_defaults(func=gen_versions_macros)
visibility_parser = subparsers.add_parser(
"visibility-macros", help="Generate visibility macros"
)
visibility_parser.add_argument("namespace", help="Macro namespace")
visibility_parser.add_argument("out_path", help="output file", type=Path)
visibility_parser.set_defaults(func=gen_visibility_macros)
args = parser.parse_args()
version = [int(i) for i in args.gtk_version.split(".")]
args.func(args, version[0], version[1], version[2])
if __name__ == "__main__":
main()

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;
GFile *file;
file = gtk_file_dialog_open_finish (dialog, result, NULL); if (response == GTK_RESPONSE_ACCEPT)
if (file)
{ {
GFile *file;
file = gtk_file_chooser_get_file (GTK_FILE_CHOOSER (dialog));
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"); GTK_WINDOW (gtk_widget_get_root (GTK_WIDGET (button))),
cwd = g_file_new_for_path ("."); GTK_FILE_CHOOSER_ACTION_SAVE,
gtk_file_dialog_set_initial_folder (dialog, cwd); "_Save",
"_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_save (dialog,
GTK_WINDOW (gtk_widget_get_root (GTK_WIDGET (button))), g_signal_connect (dialog, "response", G_CALLBACK (save_response_cb), self);
NULL, gtk_native_dialog_show (GTK_NATIVE_DIALOG (dialog));
save_response_cb, self);
g_object_unref (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
@@ -483,8 +497,6 @@ constraint_editor_window_class_init (ConstraintEditorWindowClass *class)
GObjectClass *object_class = G_OBJECT_CLASS (class); GObjectClass *object_class = G_OBJECT_CLASS (class);
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class); GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class);
g_type_ensure (CONSTRAINT_VIEW_TYPE);
object_class->dispose = constraint_editor_window_dispose; object_class->dispose = constraint_editor_window_dispose;
gtk_widget_class_set_template_from_resource (widget_class, gtk_widget_class_set_template_from_resource (widget_class,

View File

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

View File

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

View File

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

View File

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

View File

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

@@ -33,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
@@ -57,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);
} }
@@ -80,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
{
message_dialog = gtk_message_dialog_new (NULL,
GTK_DIALOG_DESTROY_WITH_PARENT,
GTK_MESSAGE_ERROR,
GTK_BUTTONS_CLOSE,
"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);
}
} }
if (error) gtk_native_dialog_destroy (GTK_NATIVE_DIALOG (native));
{ g_object_unref (native);
GtkAlertDialog *alert;
alert = gtk_alert_dialog_new ("Error loading file: \"%s\"", error->message);
gtk_alert_dialog_show (alert, NULL);
g_object_unref (alert);
g_error_free (error);
}
g_object_unref (app);
} }
@@ -121,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
@@ -214,41 +239,6 @@ activate_quit (GSimpleAction *action,
} }
} }
static void
delete_messages (gpointer data)
{
g_list_free_full ((GList *)data, g_free);
}
static void
pop_message (GtkWidget *status)
{
GList *messages = (GList *) g_object_get_data (G_OBJECT (status), "messages");
if (messages)
{
char *message = messages->data;
messages = g_list_remove (messages, message);
g_object_set_data_full (G_OBJECT (status), "messages",
messages, delete_messages);
gtk_label_set_label (GTK_LABEL (status), message);
}
}
static void
push_message (GtkWidget *status,
const char *message)
{
GList *messages = (GList *) g_object_get_data (G_OBJECT (status), "messages");
gtk_label_set_label (GTK_LABEL (status), message);
messages = g_list_prepend (messages, g_strdup (message));
g_object_set_data_full (G_OBJECT (status), "messages",
messages, delete_messages);
}
static void static void
update_statusbar (GtkTextBuffer *buffer, update_statusbar (GtkTextBuffer *buffer,
DemoApplicationWindow *window) DemoApplicationWindow *window)
@@ -259,7 +249,7 @@ update_statusbar (GtkTextBuffer *buffer,
GtkTextIter iter; GtkTextIter iter;
/* clear any previous message, underflow is allowed */ /* clear any previous message, underflow is allowed */
pop_message (window->status); gtk_statusbar_pop (GTK_STATUSBAR (window->status), 0);
count = gtk_text_buffer_get_char_count (buffer); count = gtk_text_buffer_get_char_count (buffer);
@@ -273,7 +263,7 @@ update_statusbar (GtkTextBuffer *buffer,
msg = g_strdup_printf ("Cursor at row %d column %d - %d chars in document", msg = g_strdup_printf ("Cursor at row %d column %d - %d chars in document",
row, col, count); row, col, count);
push_message (window->status, msg); gtk_statusbar_push (GTK_STATUSBAR (window->status), 0, msg);
g_free (msg); g_free (msg);
} }
@@ -330,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

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

View File

@@ -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,14 +157,11 @@ 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");
gtk_accessible_update_property (GTK_ACCESSIBLE (progress_bar),
GTK_ACCESSIBLE_PROPERTY_LABEL, "Applying changes",
-1);
/* This prevents the assistant window from being /* This prevents the assistant window from being
* closed while we're "busy" applying changes. * closed while we're "busy" applying changes.
*/ */
@@ -203,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

@@ -116,8 +116,7 @@ effective_align (GtkAlign align,
return direction == GTK_TEXT_DIR_RTL ? GTK_ALIGN_START : GTK_ALIGN_END; return direction == GTK_TEXT_DIR_RTL ? GTK_ALIGN_START : GTK_ALIGN_END;
case GTK_ALIGN_FILL: case GTK_ALIGN_FILL:
case GTK_ALIGN_CENTER: case GTK_ALIGN_CENTER:
case GTK_ALIGN_BASELINE_FILL: case GTK_ALIGN_BASELINE:
case GTK_ALIGN_BASELINE_CENTER:
default: default:
return align; return align;
} }
@@ -259,8 +258,7 @@ blur_overlay_get_child_position (BlurOverlay *overlay,
case GTK_ALIGN_END: case GTK_ALIGN_END:
alloc->x += width - alloc->width; alloc->x += width - alloc->width;
break; break;
case GTK_ALIGN_BASELINE_FILL: case GTK_ALIGN_BASELINE:
case GTK_ALIGN_BASELINE_CENTER:
default: default:
g_assert_not_reached (); g_assert_not_reached ();
break; break;
@@ -283,8 +281,7 @@ blur_overlay_get_child_position (BlurOverlay *overlay,
case GTK_ALIGN_END: case GTK_ALIGN_END:
alloc->y += height - alloc->height; alloc->y += height - alloc->height;
break; break;
case GTK_ALIGN_BASELINE_FILL: case GTK_ALIGN_BASELINE:
case GTK_ALIGN_BASELINE_CENTER:
default: default:
g_assert_not_reached (); g_assert_not_reached ();
break; break;
@@ -300,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;
@@ -319,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)
@@ -331,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);
@@ -341,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

@@ -51,11 +51,15 @@ struct _BlurOverlayClass
GtkAllocation *allocation); GtkAllocation *allocation);
}; };
GDK_AVAILABLE_IN_ALL
GType blur_overlay_get_type (void) G_GNUC_CONST; GType blur_overlay_get_type (void) G_GNUC_CONST;
GDK_AVAILABLE_IN_ALL
GtkWidget *blur_overlay_new (void); GtkWidget *blur_overlay_new (void);
GDK_AVAILABLE_IN_ALL
void blur_overlay_add_overlay (BlurOverlay *overlay, void blur_overlay_add_overlay (BlurOverlay *overlay,
GtkWidget *widget, GtkWidget *widget,
double blur); double blur);
GDK_AVAILABLE_IN_ALL
void blur_overlay_set_child (BlurOverlay *overlay, void blur_overlay_set_child (BlurOverlay *overlay,
GtkWidget *widget); GtkWidget *widget);

View File

@@ -1,5 +1,5 @@
/* Builder /* Builder
* #Keywords: GMenu, GtkPopoverMenuBar, GtkBuilder, GtkShortcutController, toolbar * #Keywords: GMenu, GtkPopoverMenuBar, GtkBuilder, GtkStatusBar, GtkShortcutController, toolbar
* *
* Demonstrates a traditional interface, loaded from a XML description, * Demonstrates a traditional interface, loaded from a XML description,
* and shows how to connect actions to the menu items and toolbar buttons. * and shows how to connect actions to the menu items and toolbar buttons.
@@ -37,30 +37,22 @@ remove_timeout (gpointer data)
g_source_remove (id); g_source_remove (id);
} }
static int static gboolean
pop_message (gpointer data) pop_status (gpointer data)
{ {
GtkWidget *status = data; gtk_statusbar_pop (GTK_STATUSBAR (data), 0);
g_object_set_data (G_OBJECT (data), "timeout", NULL);
gtk_label_set_label (GTK_LABEL (status), "");
g_object_set_data (G_OBJECT (status), "timeout", GUINT_TO_POINTER (0));
return G_SOURCE_REMOVE; return G_SOURCE_REMOVE;
} }
static void static void
status_message (GtkWidget *status, status_message (GtkStatusbar *status,
const char *text) const char *text)
{ {
guint id; guint id;
id = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (status), "timeout")); gtk_statusbar_push (GTK_STATUSBAR (status), 0, text);
if (id) id = g_timeout_add (5000, pop_status, status);
g_source_remove (id);
gtk_label_set_text (GTK_LABEL (status), text);
id = g_timeout_add (5000, pop_message, status);
g_object_set_data_full (G_OBJECT (status), "timeout", GUINT_TO_POINTER (id), remove_timeout); g_object_set_data_full (G_OBJECT (status), "timeout", GUINT_TO_POINTER (id), remove_timeout);
} }
@@ -73,7 +65,7 @@ help_activate (GSimpleAction *action,
GtkWidget *status; GtkWidget *status;
status = GTK_WIDGET (g_object_get_data (G_OBJECT (user_data), "status")); status = GTK_WIDGET (g_object_get_data (G_OBJECT (user_data), "status"));
status_message (status, "Help not available"); status_message (GTK_STATUSBAR (status), "Help not available");
} }
static void static void
@@ -86,7 +78,7 @@ not_implemented (GSimpleAction *action,
text = g_strdup_printf ("Action “%s” not implemented", g_action_get_name (G_ACTION (action))); text = g_strdup_printf ("Action “%s” not implemented", g_action_get_name (G_ACTION (action)));
status = GTK_WIDGET (g_object_get_data (G_OBJECT (user_data), "status")); status = GTK_WIDGET (g_object_get_data (G_OBJECT (user_data), "status"));
status_message (status, text); status_message (GTK_STATUSBAR (status), text);
g_free (text); g_free (text);
} }
@@ -176,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_WINDOW (gtk_widget_get_ancestor (button, GTK_TYPE_WINDOW)),
GTK_FILE_CHOOSER_ACTION_OPEN,
"_Open",
"_Cancel");
gtk_file_dialog_open (dialog, g_signal_connect (chooser, "response", G_CALLBACK (file_chooser_response), button);
GTK_WINDOW (gtk_widget_get_ancestor (button, GTK_TYPE_WINDOW)), gtk_native_dialog_show (GTK_NATIVE_DIALOG (chooser));
NULL,
file_chooser_response, button);
g_object_unref (dialog);
}
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

@@ -4,9 +4,6 @@
<object class="GtkWindow" id="window"> <object class="GtkWindow" id="window">
<property name="resizable">1</property> <property name="resizable">1</property>
<property name="title">Clipboard</property> <property name="title">Clipboard</property>
<accessibility>
<relation name="described-by">label</relation>
</accessibility>
<child> <child>
<object class="GtkBox"> <object class="GtkBox">
<property name="orientation">vertical</property> <property name="orientation">vertical</property>
@@ -16,7 +13,7 @@
<property name="margin-bottom">12</property> <property name="margin-bottom">12</property>
<property name="spacing">12</property> <property name="spacing">12</property>
<child> <child>
<object class="GtkLabel" id="label"> <object class="GtkLabel">
<property name="label">“Copy” will copy the selected data the clipboard, “Paste” will show the current clipboard contents. You can also drag the data to the bottom.</property> <property name="label">“Copy” will copy the selected data the clipboard, “Paste” will show the current clipboard contents. You can also drag the data to the bottom.</property>
<property name="wrap">1</property> <property name="wrap">1</property>
<property name="max-width-chars">40</property> <property name="max-width-chars">40</property>
@@ -27,9 +24,6 @@
<property name="spacing">12</property> <property name="spacing">12</property>
<child> <child>
<object class="GtkDropDown" id="source_chooser"> <object class="GtkDropDown" id="source_chooser">
<accessibility>
<property name="label">Source Type</property>
</accessibility>
<property name="valign">center</property> <property name="valign">center</property>
<property name="model"> <property name="model">
<object class="GtkStringList"> <object class="GtkStringList">
@@ -38,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>
@@ -60,9 +53,6 @@
<property name="name">Text</property> <property name="name">Text</property>
<property name="child"> <property name="child">
<object class="GtkEntry" id="source_text"> <object class="GtkEntry" id="source_text">
<accessibility>
<property name="label">Text Drag Source</property>
</accessibility>
<property name="valign">center</property> <property name="valign">center</property>
<signal name="notify::text" handler="text_changed_cb" object="copy_button"/> <signal name="notify::text" handler="text_changed_cb" object="copy_button"/>
<property name="text">Copy this!</property> <property name="text">Copy this!</property>
@@ -74,14 +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">
<accessibility>
<property name="label">Color Drag Source</property>
</accessibility>
<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>
@@ -99,17 +82,14 @@
</style> </style>
<child> <child>
<object class="GtkToggleButton" id="image_rose"> <object class="GtkToggleButton" id="image_rose">
<accessibility>
<property name="label">Photo Drag Source</property>
</accessibility>
<property name="active">1</property> <property name="active">1</property>
<child> <child>
<object class="GtkDragSource">
<signal name="prepare" handler="drag_prepare"/>
</object>
</child> </child>
<child> <child>
<object class="GtkImage"> <object class="GtkImage">
<accessibility>
<property name="label">Portland Rose Photo</property>
</accessibility>
<style> <style>
<class name="large-icons"/> <class name="large-icons"/>
</style> </style>
@@ -120,9 +100,6 @@
</child> </child>
<child> <child>
<object class="GtkToggleButton" id="image_floppy"> <object class="GtkToggleButton" id="image_floppy">
<accessibility>
<property name="label">Icon Drag Source</property>
</accessibility>
<property name="group">image_rose</property> <property name="group">image_rose</property>
<child> <child>
<object class="GtkDragSource"> <object class="GtkDragSource">
@@ -131,9 +108,6 @@
</child> </child>
<child> <child>
<object class="GtkImage"> <object class="GtkImage">
<accessibility>
<property name="label">Floppy Buddy Icon</property>
</accessibility>
<style> <style>
<class name="large-icons"/> <class name="large-icons"/>
</style> </style>
@@ -144,9 +118,6 @@
</child> </child>
<child> <child>
<object class="GtkToggleButton" id="image_logo"> <object class="GtkToggleButton" id="image_logo">
<accessibility>
<property name="label">SVG Drag Source</property>
</accessibility>
<property name="group">image_floppy</property> <property name="group">image_floppy</property>
<child> <child>
<object class="GtkDragSource"> <object class="GtkDragSource">
@@ -155,9 +126,6 @@
</child> </child>
<child> <child>
<object class="GtkImage"> <object class="GtkImage">
<accessibility>
<property name="label">gtk-demo logo</property>
</accessibility>
<style> <style>
<class name="large-icons"/> <class name="large-icons"/>
</style> </style>
@@ -175,9 +143,6 @@
<property name="name">File</property> <property name="name">File</property>
<property name="child"> <property name="child">
<object class="GtkButton" id="source_file"> <object class="GtkButton" id="source_file">
<accessibility>
<property name="label">File Drag Source</property>
</accessibility>
<child> <child>
<object class="GtkDragSource"> <object class="GtkDragSource">
<property name="propagation-phase">capture</property> <property name="propagation-phase">capture</property>
@@ -197,33 +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">
<accessibility>
<property name="label">Folder Drag Source</property>
</accessibility>
<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>
@@ -258,7 +196,7 @@
</object> </object>
</child> </child>
<child> <child>
<object class="GtkLabel" id="paste_label"> <object class="GtkLabel">
<property name="xalign">0</property> <property name="xalign">0</property>
<binding name="label"> <binding name="label">
<lookup name="visible-child-name" type="GtkStack"> <lookup name="visible-child-name" type="GtkStack">
@@ -285,9 +223,6 @@
<property name="name">Text</property> <property name="name">Text</property>
<property name="child"> <property name="child">
<object class="GtkLabel"> <object class="GtkLabel">
<accessibility>
<relation name="labelled-by">paste_label</relation>
</accessibility>
<property name="halign">end</property> <property name="halign">end</property>
<property name="valign">center</property> <property name="valign">center</property>
<property name="xalign">0</property> <property name="xalign">0</property>
@@ -301,9 +236,6 @@
<property name="name">Image</property> <property name="name">Image</property>
<property name="child"> <property name="child">
<object class="GtkImage"> <object class="GtkImage">
<accessibility>
<relation name="labelled-by">paste_label</relation>
</accessibility>
<property name="halign">end</property> <property name="halign">end</property>
<property name="valign">center</property> <property name="valign">center</property>
<style> <style>
@@ -322,9 +254,6 @@
<property name="valign">center</property> <property name="valign">center</property>
<child> <child>
<object class="GtkColorSwatch"> <object class="GtkColorSwatch">
<accessibility>
<relation name="labelled-by">paste_label</relation>
</accessibility>
<property name="accessible-role">img</property> <property name="accessible-role">img</property>
<property name="can-focus">0</property> <property name="can-focus">0</property>
<property name="selectable">0</property> <property name="selectable">0</property>
@@ -340,9 +269,6 @@
<property name="name">File</property> <property name="name">File</property>
<property name="child"> <property name="child">
<object class="GtkLabel"> <object class="GtkLabel">
<accessibility>
<relation name="labelled-by">paste_label</relation>
</accessibility>
<property name="halign">end</property> <property name="halign">end</property>
<property name="valign">center</property> <property name="valign">center</property>
<property name="xalign">0</property> <property name="xalign">0</property>

View File

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

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

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

View File

@@ -50,7 +50,7 @@ update_css_for_blend_mode (GtkCssProvider *provider,
blend_mode, blend_mode,
blend_mode); blend_mode);
gtk_css_provider_load_from_string (provider, css); gtk_css_provider_load_from_data (provider, css, -1);
g_bytes_unref (bytes); g_bytes_unref (bytes);
g_free (css); g_free (css);
@@ -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

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

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

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

View File

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

View File

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

View File

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

View File

@@ -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>
@@ -127,7 +127,6 @@
<file>fishbowl.ui</file> <file>fishbowl.ui</file>
<file>gtkfishbowl.c</file> <file>gtkfishbowl.c</file>
<file>gtkfishbowl.h</file> <file>gtkfishbowl.h</file>
<file>tiger.node</file>
</gresource> </gresource>
<gresource prefix="/frames"> <gresource prefix="/frames">
<file>frames.ui</file> <file>frames.ui</file>
@@ -196,9 +195,6 @@
<gresource prefix="/listview_settings"> <gresource prefix="/listview_settings">
<file>listview_settings.ui</file> <file>listview_settings.ui</file>
</gresource> </gresource>
<gresource prefix="/listview_settings2">
<file>listview_settings2.ui</file>
</gresource>
<gresource prefix="/listview_ucd_data/"> <gresource prefix="/listview_ucd_data/">
<file>ucdnames.data</file> <file>ucdnames.data</file>
</gresource> </gresource>
@@ -219,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>
@@ -278,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>
@@ -301,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>
@@ -314,16 +304,14 @@
<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_settings2.c</file>
<file>listview_ucd.c</file> <file>listview_ucd.c</file>
<file>listview_weather.c</file> <file>listview_weather.c</file>
<file>listview_words.c</file> <file>listview_words.c</file>
<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>
@@ -336,11 +324,6 @@
<file>paintable_symbolic.c</file> <file>paintable_symbolic.c</file>
<file>panes.c</file> <file>panes.c</file>
<file>password_entry.c</file> <file>password_entry.c</file>
<file>path_fill.c</file>
<file>path_maze.c</file>
<file>path_spinner.c</file>
<file>path_walk.c</file>
<file>path_text.c</file>
<file>peg_solitaire.c</file> <file>peg_solitaire.c</file>
<file>pickers.c</file> <file>pickers.c</file>
<file>printing.c</file> <file>printing.c</file>
@@ -426,13 +409,6 @@
<gresource prefix="/fontrendering"> <gresource prefix="/fontrendering">
<file>fontrendering.ui</file> <file>fontrendering.ui</file>
</gresource> </gresource>
<gresource prefix="/path_walk">
<file>path_walk.ui</file>
<file compressed="true">path_world.txt</file>
</gresource>
<gresource prefix="/path_text">
<file>path_text.ui</file>
</gresource>
<gresource prefix="/org/gtk/Demo4"> <gresource prefix="/org/gtk/Demo4">
<file>icons/16x16/actions/application-exit.png</file> <file>icons/16x16/actions/application-exit.png</file>
<file>icons/16x16/actions/document-new.png</file> <file>icons/16x16/actions/document-new.png</file>

View File

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

View File

@@ -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,55 +205,40 @@ 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_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));
/* 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);
gtk_widget_class_bind_template_callback (widget_class, pressed_cb); gtk_widget_class_bind_template_callback (widget_class, pressed_cb);
gtk_widget_class_set_accessible_role (widget_class, GTK_ACCESSIBLE_ROLE_IMG);
} }
GtkWidget * GtkWidget *
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,21 +12,10 @@
<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">
<accessibility>
<property name="label">Demo image</property>
</accessibility>
<child> <child>
<object class="GtkPopoverMenu" id="menu"> <object class="GtkPopoverMenu" id="menu">
<accessibility>
<property name="label">Context menu</property>
</accessibility>
<property name="has-arrow">0</property> <property name="has-arrow">0</property>
<property name="menu-model">model</property> <property name="menu-model">model</property>
</object> </object>

View File

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

@@ -70,7 +70,7 @@ set_color (CanvasItem *item,
css = g_strdup_printf ("#%s { background: %s; }", name, str); css = g_strdup_printf ("#%s { background: %s; }", name, str);
provider = gtk_css_provider_new (); provider = gtk_css_provider_new ();
gtk_css_provider_load_from_string (provider, css); gtk_css_provider_load_from_data (provider, css, -1);
gtk_style_context_add_provider_for_display (gtk_widget_get_display (item->label), GTK_STYLE_PROVIDER (provider), 700); gtk_style_context_add_provider_for_display (gtk_widget_get_display (item->label), GTK_STYLE_PROVIDER (provider), 700);
item->provider = GTK_STYLE_PROVIDER (provider); item->provider = GTK_STYLE_PROVIDER (provider);
@@ -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);
@@ -162,39 +156,27 @@ click_done (GtkGesture *gesture)
gtk_widget_insert_after (item, canvas, last_child); gtk_widget_insert_after (item, canvas, last_child);
} }
/* GtkSettings treats `GTK_THEME=foo:dark` as theme name `foo`, variant `dark`,
* and our embedded CSS files let `foo-dark` work as an alias for `foo:dark`. */
static gboolean
has_dark_suffix (const char *theme)
{
return g_str_has_suffix (theme, ":dark") ||
g_str_has_suffix (theme, "-dark");
}
/* So we can make a good guess whether the current theme is dark by checking for
* either: it is suffixed `[:-]dark`, or Settings:…prefer-dark-theme is TRUE. */
static gboolean static gboolean
theme_is_dark (void) theme_is_dark (void)
{ {
const char *env_theme;
GtkSettings *settings; GtkSettings *settings;
char *theme; char *theme;
gboolean prefer_dark; gboolean prefer_dark;
gboolean dark; gboolean dark;
/* Like GtkSettings, 1st see if theme is overridden by environment variable */
env_theme = g_getenv ("GTK_THEME");
if (env_theme != NULL)
return has_dark_suffix (env_theme);
/* If not, test Settings:…theme-name in the same way OR :…prefer-dark-theme */
settings = gtk_settings_get_default (); settings = gtk_settings_get_default ();
g_object_get (settings, g_object_get (settings,
"gtk-theme-name", &theme, "gtk-theme-name", &theme,
"gtk-application-prefer-dark-theme", &prefer_dark, "gtk-application-prefer-dark-theme", &prefer_dark,
NULL); NULL);
dark = prefer_dark || has_dark_suffix (theme);
if ((strcmp (theme, "Adwaita") == 0 && prefer_dark) || strcmp (theme, "HighContrastInverse") == 0)
dark = TRUE;
else
dark = FALSE;
g_free (theme); g_free (theme);
return dark; return dark;
} }
@@ -342,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;
@@ -368,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,
@@ -386,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);
@@ -398,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);
} }
@@ -415,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);
@@ -760,7 +726,7 @@ do_dnd (GtkWidget *do_widget)
GtkCssProvider *provider; GtkCssProvider *provider;
GString *css; GString *css;
button = gtk_color_dialog_button_new (gtk_color_dialog_new ()); button = gtk_color_button_new ();
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 ();
@@ -775,7 +741,7 @@ do_dnd (GtkWidget *do_widget)
g_string_append_printf (css, ".canvasitem.%s { background: %s; }\n", colors[i], colors[i]); g_string_append_printf (css, ".canvasitem.%s { background: %s; }\n", colors[i], colors[i]);
provider = gtk_css_provider_new (); provider = gtk_css_provider_new ();
gtk_css_provider_load_from_string (provider, css->str); gtk_css_provider_load_from_data (provider, css->str, css->len);
gtk_style_context_add_provider_for_display (gdk_display_get_default (), gtk_style_context_add_provider_for_display (gdk_display_get_default (),
GTK_STYLE_PROVIDER (provider), GTK_STYLE_PROVIDER (provider),
800); 800);
@@ -834,7 +800,7 @@ do_dnd (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

@@ -334,17 +334,11 @@ do_drawingarea (GtkWidget *do_widget)
gtk_widget_set_vexpand (frame, TRUE); gtk_widget_set_vexpand (frame, TRUE);
gtk_box_append (GTK_BOX (vbox), frame); gtk_box_append (GTK_BOX (vbox), frame);
da = g_object_new (GTK_TYPE_DRAWING_AREA, da = gtk_drawing_area_new ();
"accessible-role", GTK_ACCESSIBLE_ROLE_IMG,
NULL);
gtk_frame_set_child (GTK_FRAME (frame), da);
gtk_accessible_update_relation (GTK_ACCESSIBLE (da),
GTK_ACCESSIBLE_RELATION_LABELLED_BY, label, NULL,
-1);
gtk_drawing_area_set_content_width (GTK_DRAWING_AREA (da), 100); gtk_drawing_area_set_content_width (GTK_DRAWING_AREA (da), 100);
gtk_drawing_area_set_content_height (GTK_DRAWING_AREA (da), 100); gtk_drawing_area_set_content_height (GTK_DRAWING_AREA (da), 100);
gtk_drawing_area_set_draw_func (GTK_DRAWING_AREA (da), groups_draw, NULL, NULL); gtk_drawing_area_set_draw_func (GTK_DRAWING_AREA (da), groups_draw, NULL, NULL);
gtk_frame_set_child (GTK_FRAME (frame), da);
/* /*
* Create the scribble area * Create the scribble area
@@ -358,23 +352,17 @@ do_drawingarea (GtkWidget *do_widget)
gtk_widget_set_vexpand (frame, TRUE); gtk_widget_set_vexpand (frame, TRUE);
gtk_box_append (GTK_BOX (vbox), frame); gtk_box_append (GTK_BOX (vbox), frame);
da = g_object_new (GTK_TYPE_DRAWING_AREA, da = gtk_drawing_area_new ();
"accessible-role", GTK_ACCESSIBLE_ROLE_IMG,
NULL);
gtk_frame_set_child (GTK_FRAME (frame), da);
gtk_accessible_update_relation (GTK_ACCESSIBLE (da),
GTK_ACCESSIBLE_RELATION_LABELLED_BY, label, NULL,
-1);
gtk_drawing_area_set_content_width (GTK_DRAWING_AREA (da), 100); gtk_drawing_area_set_content_width (GTK_DRAWING_AREA (da), 100);
gtk_drawing_area_set_content_height (GTK_DRAWING_AREA (da), 100); gtk_drawing_area_set_content_height (GTK_DRAWING_AREA (da), 100);
gtk_drawing_area_set_draw_func (GTK_DRAWING_AREA (da), scribble_draw, NULL, NULL); gtk_drawing_area_set_draw_func (GTK_DRAWING_AREA (da), scribble_draw, NULL, NULL);
gtk_frame_set_child (GTK_FRAME (frame), da);
g_signal_connect (da, "resize", g_signal_connect (da, "resize",
G_CALLBACK (scribble_resize), NULL); G_CALLBACK (scribble_resize), NULL);
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);
@@ -384,7 +372,7 @@ do_drawingarea (GtkWidget *do_widget)
} }
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
gtk_window_present (GTK_WINDOW (window)); gtk_widget_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);
} }
} }
@@ -368,40 +368,8 @@ match_func (MatchObject *obj,
g_free (tmp2); g_free (tmp2);
} }
static void
setup_header (GtkSignalListItemFactory *factory,
GObject *list_item,
gpointer data)
{
GtkListHeader *self = GTK_LIST_HEADER (list_item);
GtkWidget *child;
child = gtk_label_new ("");
gtk_label_set_xalign (GTK_LABEL (child), 0);
gtk_label_set_use_markup (GTK_LABEL (child), TRUE);
gtk_widget_set_margin_top (child, 10);
gtk_widget_set_margin_bottom (child, 10);
gtk_list_header_set_child (self, child);
}
static void
bind_header (GtkSignalListItemFactory *factory,
GObject *list_item,
gpointer data)
{
GtkListHeader *self = GTK_LIST_HEADER (list_item);
GtkWidget *child = gtk_list_header_get_child (self);
GObject *item = gtk_list_header_get_item (self);
if (strstr (gtk_string_object_get_string (GTK_STRING_OBJECT (item)), "hour"))
gtk_label_set_label (GTK_LABEL (child), "<big><b>Hours</b></big>");
else
gtk_label_set_label (GTK_LABEL (child), "<big><b>Minutes</b></big>");
}
GtkWidget * GtkWidget *
do_listview_selections (GtkWidget *do_widget) do_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;
@@ -409,12 +377,10 @@ do_listview_selections (GtkWidget *do_widget)
GtkExpression *expression; GtkExpression *expression;
GtkListItemFactory *factory; GtkListItemFactory *factory;
const char * const times[] = { "1 minute", "2 minutes", "5 minutes", "20 minutes", NULL }; const char * const times[] = { "1 minute", "2 minutes", "5 minutes", "20 minutes", NULL };
const char * const minutes[] = { const char * const many_times[] = {
"1 minute", "2 minutes", "5 minutes", "10 minutes", "15 minutes", "20 minutes", "1 minute", "2 minutes", "5 minutes", "10 minutes", "15 minutes", "20 minutes",
"25 minutes", "30 minutes", "35 minutes", "40 minutes", "45 minutes", "50 minutes", "25 minutes", "30 minutes", "35 minutes", "40 minutes", "45 minutes", "50 minutes",
"55 minutes", NULL "55 minutes", "1 hour", "2 hours", "3 hours", "5 hours", "6 hours", "7 hours",
};
const char * const hours[] = { "1 hour", "2 hours", "3 hours", "5 hours", "6 hours", "7 hours",
"8 hours", "9 hours", "10 hours", "11 hours", "12 hours", NULL "8 hours", "9 hours", "10 hours", "11 hours", "12 hours", NULL
}; };
const char * const device_titles[] = { "Digital Output", "Headphones", "Digital Output", "Analog Output", NULL }; const char * const device_titles[] = { "Digital Output", "Headphones", "Digital Output", "Analog Output", NULL };
@@ -429,10 +395,6 @@ do_listview_selections (GtkWidget *do_widget)
if (!window) if (!window)
{ {
GtkStringList *minutes_model, *hours_model;
GListStore *store;
GtkFlattenListModel *flat;
window = gtk_window_new (); window = gtk_window_new ();
gtk_window_set_display (GTK_WINDOW (window), gtk_window_set_display (GTK_WINDOW (window),
gtk_widget_get_display (do_widget)); gtk_widget_get_display (do_widget));
@@ -460,25 +422,14 @@ do_listview_selections (GtkWidget *do_widget)
gtk_box_append (GTK_BOX (box), button); gtk_box_append (GTK_BOX (box), button);
/* A dropdown using an expression to obtain strings */ /* A dropdown using an expression to obtain strings */
minutes_model = gtk_string_list_new (minutes); button = drop_down_new_from_strings (many_times, NULL, NULL);
hours_model = gtk_string_list_new (hours); gtk_drop_down_set_enable_search (GTK_DROP_DOWN (button), TRUE);
store = g_list_store_new (G_TYPE_LIST_MODEL);
g_list_store_append (store, minutes_model);
g_list_store_append (store, hours_model);
g_object_unref (minutes_model);
g_object_unref (hours_model);
flat = gtk_flatten_list_model_new (G_LIST_MODEL (store));
expression = gtk_cclosure_expression_new (G_TYPE_STRING, NULL, expression = gtk_cclosure_expression_new (G_TYPE_STRING, NULL,
0, NULL, 0, NULL,
(GCallback)get_title, (GCallback)get_title,
NULL, NULL); NULL, NULL);
button = gtk_drop_down_new (G_LIST_MODEL (flat), expression); gtk_drop_down_set_expression (GTK_DROP_DOWN (button), expression);
gtk_drop_down_set_enable_search (GTK_DROP_DOWN (button), TRUE); gtk_expression_unref (expression);
factory = gtk_signal_list_item_factory_new ();
g_signal_connect (factory, "setup", G_CALLBACK (setup_header), NULL);
g_signal_connect (factory, "bind", G_CALLBACK (bind_header), NULL);
gtk_drop_down_set_header_factory (GTK_DROP_DOWN (button), factory);
g_object_unref (factory);
gtk_box_append (GTK_BOX (box), button); gtk_box_append (GTK_BOX (box), button);
button = gtk_drop_down_new (NULL, NULL); button = gtk_drop_down_new (NULL, NULL);
@@ -612,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

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

@@ -43,14 +43,10 @@ do_entry_undo (GtkWidget *do_widget)
entry = gtk_entry_new (); entry = gtk_entry_new ();
gtk_editable_set_enable_undo (GTK_EDITABLE (entry), TRUE); gtk_editable_set_enable_undo (GTK_EDITABLE (entry), TRUE);
gtk_box_append (GTK_BOX (vbox), entry); gtk_box_append (GTK_BOX (vbox), entry);
gtk_accessible_update_relation (GTK_ACCESSIBLE (entry),
GTK_ACCESSIBLE_RELATION_LABELLED_BY, label, NULL,
-1);
} }
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
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

@@ -22,15 +22,11 @@ validate_more_details (GtkEntry *entry,
{ {
gtk_widget_set_tooltip_text (GTK_WIDGET (entry), "Must have details first"); gtk_widget_set_tooltip_text (GTK_WIDGET (entry), "Must have details first");
gtk_widget_add_css_class (GTK_WIDGET (entry), "error"); gtk_widget_add_css_class (GTK_WIDGET (entry), "error");
gtk_accessible_update_state (GTK_ACCESSIBLE (entry),
GTK_ACCESSIBLE_STATE_INVALID, GTK_ACCESSIBLE_INVALID_TRUE,
-1);
} }
else else
{ {
gtk_widget_set_tooltip_text (GTK_WIDGET (entry), ""); gtk_widget_set_tooltip_text (GTK_WIDGET (entry), "");
gtk_widget_remove_css_class (GTK_WIDGET (entry), "error"); gtk_widget_remove_css_class (GTK_WIDGET (entry), "error");
gtk_accessible_reset_state (GTK_ACCESSIBLE (entry), GTK_ACCESSIBLE_STATE_INVALID);
} }
} }
@@ -46,20 +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);
gtk_accessible_reset_relation (GTK_ACCESSIBLE (sw), GTK_ACCESSIBLE_RELATION_ERROR_MESSAGE);
gtk_accessible_reset_state (GTK_ACCESSIBLE (sw), GTK_ACCESSIBLE_STATE_INVALID);
} }
else else
{ {
gtk_widget_set_visible (label, TRUE); gtk_widget_show (label);
gtk_accessible_update_relation (GTK_ACCESSIBLE (sw),
GTK_ACCESSIBLE_RELATION_ERROR_MESSAGE, label,
-1);
gtk_accessible_update_state (GTK_ACCESSIBLE (sw),
GTK_ACCESSIBLE_STATE_INVALID, GTK_ACCESSIBLE_INVALID_TRUE,
-1);
} }
return TRUE; return TRUE;
@@ -77,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)) &&
@@ -85,9 +73,6 @@ level_scale_value_changed (GtkRange *range,
{ {
gtk_switch_set_state (GTK_SWITCH (sw), FALSE); gtk_switch_set_state (GTK_SWITCH (sw), FALSE);
} }
gtk_accessible_reset_relation (GTK_ACCESSIBLE (sw), GTK_ACCESSIBLE_RELATION_ERROR_MESSAGE);
gtk_accessible_reset_state (GTK_ACCESSIBLE (sw), GTK_ACCESSIBLE_STATE_INVALID);
} }
GtkWidget * GtkWidget *
@@ -128,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

@@ -43,22 +43,21 @@ do_expander (GtkWidget *do_widget)
if (!window) if (!window)
{ {
toplevel = GTK_WIDGET (gtk_widget_get_root (do_widget)); toplevel = GTK_WIDGET (gtk_widget_get_root (do_widget));
window = gtk_window_new (); window = gtk_message_dialog_new_with_markup (GTK_WINDOW (toplevel),
gtk_window_set_title (GTK_WINDOW (window), "Expander"); 0,
gtk_window_set_transient_for (GTK_WINDOW (window), GTK_WINDOW (toplevel)); GTK_MESSAGE_ERROR,
area = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10); GTK_BUTTONS_CLOSE,
gtk_widget_set_margin_start (area, 10); "<big><b>%s</b></big>",
gtk_widget_set_margin_end (area, 10); "Something went wrong");
gtk_widget_set_margin_top (area, 10); gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (window),
gtk_widget_set_margin_bottom (area, 10); "Here are some more details "
gtk_window_set_child (GTK_WINDOW (window), area); "but not the full story.");
label = gtk_label_new ("<big><b>Something went wrong</b></big>");
gtk_label_set_use_markup (GTK_LABEL (label), TRUE); area = gtk_message_dialog_get_message_area (GTK_MESSAGE_DIALOG (window));
gtk_box_append (GTK_BOX (area), label);
label = gtk_label_new ("Here are some more details but not the full story"); label = gtk_widget_get_last_child (area);
gtk_label_set_wrap (GTK_LABEL (label), FALSE); gtk_label_set_wrap (GTK_LABEL (label), FALSE);
gtk_widget_set_vexpand (label, FALSE); gtk_widget_set_vexpand (label, FALSE);
gtk_box_append (GTK_BOX (area), label);
expander = gtk_expander_new ("Details:"); expander = gtk_expander_new ("Details:");
gtk_widget_set_vexpand (expander, TRUE); gtk_widget_set_vexpand (expander, TRUE);
@@ -121,7 +120,7 @@ do_expander (GtkWidget *do_widget)
} }
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
gtk_window_present (GTK_WINDOW (window)); gtk_widget_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

@@ -11,9 +11,6 @@
#include "gtkgears.h" #include "gtkgears.h"
#include "gskshaderpaintable.h" #include "gskshaderpaintable.h"
#include "nodewidget.h"
#include "graphwidget.h"
const char *const css = const char *const css =
".blurred-button {" ".blurred-button {"
" box-shadow: 0px 0px 5px 10px rgba(0, 0, 0, 0.5);" " box-shadow: 0px 0px 5px 10px rgba(0, 0, 0, 0.5);"
@@ -74,14 +71,7 @@ create_blurred_button (void)
static GtkWidget * static GtkWidget *
create_font_button (void) create_font_button (void)
{ {
GtkFontDialog *dialog; return gtk_font_button_new ();
GtkWidget *button;
dialog = gtk_font_dialog_new ();
button = gtk_font_dialog_button_new (dialog);
g_object_unref (dialog);
return button;
} }
static GtkWidget * static GtkWidget *
@@ -211,18 +201,6 @@ create_menu_button (void)
return w; return w;
} }
static GtkWidget *
create_tiger (void)
{
return node_widget_new ("/fishbowl/tiger.node");
}
static GtkWidget *
create_graph (void)
{
return graph_widget_new ();
}
static const struct { static const struct {
const char *name; const char *name;
GtkWidget * (*create_func) (void); GtkWidget * (*create_func) (void);
@@ -240,8 +218,6 @@ static const struct {
{ "Switch", create_switch }, { "Switch", create_switch },
{ "Menubutton", create_menu_button }, { "Menubutton", create_menu_button },
{ "Shader", create_cogs }, { "Shader", create_cogs },
{ "Tiger", create_tiger },
{ "Graph", create_graph },
}; };
static int selected_widget_type = -1; static int selected_widget_type = -1;
@@ -323,7 +299,7 @@ do_fishbowl (GtkWidget *do_widget)
if (provider == NULL) if (provider == NULL)
{ {
provider = gtk_css_provider_new (); provider = gtk_css_provider_new ();
gtk_css_provider_load_from_string (provider, css); gtk_css_provider_load_from_data (provider, css, -1);
gtk_style_context_add_provider_for_display (gdk_display_get_default (), gtk_style_context_add_provider_for_display (gdk_display_get_default (),
GTK_STYLE_PROVIDER (provider), GTK_STYLE_PROVIDER (provider),
GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
@@ -332,20 +308,11 @@ do_fishbowl (GtkWidget *do_widget)
if (!window) if (!window)
{ {
GtkBuilder *builder; GtkBuilder *builder;
GtkBuilderScope *scope;
GtkWidget *bowl; GtkWidget *bowl;
g_type_ensure (GTK_TYPE_FISHBOWL); g_type_ensure (GTK_TYPE_FISHBOWL);
scope = gtk_builder_cscope_new (); builder = gtk_builder_new_from_resource ("/fishbowl/fishbowl.ui");
gtk_builder_cscope_add_callback (GTK_BUILDER_CSCOPE (scope), fishbowl_prev_button_clicked_cb);
gtk_builder_cscope_add_callback (GTK_BUILDER_CSCOPE (scope), fishbowl_next_button_clicked_cb);
gtk_builder_cscope_add_callback (GTK_BUILDER_CSCOPE (scope), fishbowl_changes_toggled_cb);
gtk_builder_cscope_add_callback (GTK_BUILDER_CSCOPE (scope), format_header_cb);
builder = gtk_builder_new ();
gtk_builder_set_scope (builder, scope);
gtk_builder_add_from_resource (builder, "/fishbowl/fishbowl.ui", NULL);
window = GTK_WIDGET (gtk_builder_get_object (builder, "window")); window = GTK_WIDGET (gtk_builder_get_object (builder, "window"));
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window); g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
@@ -357,11 +324,10 @@ do_fishbowl (GtkWidget *do_widget)
gtk_widget_realize (window); gtk_widget_realize (window);
g_object_unref (builder); g_object_unref (builder);
g_object_unref (scope);
} }
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
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);
} }
} }
@@ -1294,18 +1304,18 @@ add_axis (hb_face_t *hb_face,
axis_label = gtk_label_new (name); axis_label = gtk_label_new (name);
gtk_widget_set_halign (axis_label, GTK_ALIGN_START); gtk_widget_set_halign (axis_label, GTK_ALIGN_START);
gtk_widget_set_valign (axis_label, GTK_ALIGN_BASELINE_FILL); gtk_widget_set_valign (axis_label, GTK_ALIGN_BASELINE);
gtk_grid_attach (GTK_GRID (demo->variations_grid), axis_label, 0, i, 1, 1); gtk_grid_attach (GTK_GRID (demo->variations_grid), axis_label, 0, i, 1, 1);
adjustment = gtk_adjustment_new (value, ax->min_value, ax->max_value, adjustment = gtk_adjustment_new (value, ax->min_value, ax->max_value,
1.0, 10.0, 0.0); 1.0, 10.0, 0.0);
axis_scale = gtk_scale_new (GTK_ORIENTATION_HORIZONTAL, adjustment); axis_scale = gtk_scale_new (GTK_ORIENTATION_HORIZONTAL, adjustment);
gtk_scale_add_mark (GTK_SCALE (axis_scale), ax->default_value, GTK_POS_TOP, NULL); gtk_scale_add_mark (GTK_SCALE (axis_scale), ax->default_value, GTK_POS_TOP, NULL);
gtk_widget_set_valign (axis_scale, GTK_ALIGN_BASELINE_FILL); gtk_widget_set_valign (axis_scale, GTK_ALIGN_BASELINE);
gtk_widget_set_hexpand (axis_scale, TRUE); gtk_widget_set_hexpand (axis_scale, TRUE);
gtk_widget_set_size_request (axis_scale, 100, -1); gtk_widget_set_size_request (axis_scale, 100, -1);
gtk_grid_attach (GTK_GRID (demo->variations_grid), axis_scale, 1, i, 1, 1); gtk_grid_attach (GTK_GRID (demo->variations_grid), axis_scale, 1, i, 1, 1);
axis_entry = gtk_entry_new (); axis_entry = gtk_entry_new ();
gtk_widget_set_valign (axis_entry, GTK_ALIGN_BASELINE_FILL); gtk_widget_set_valign (axis_entry, GTK_ALIGN_BASELINE);
gtk_editable_set_width_chars (GTK_EDITABLE (axis_entry), 4); gtk_editable_set_width_chars (GTK_EDITABLE (axis_entry), 4);
gtk_editable_set_max_width_chars (GTK_EDITABLE (axis_entry), 4); gtk_editable_set_max_width_chars (GTK_EDITABLE (axis_entry), 4);
gtk_widget_set_hexpand (axis_entry, FALSE); gtk_widget_set_hexpand (axis_entry, FALSE);
@@ -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)
goto out; {
g_print ("did not find instance %s\n", text);
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);
@@ -1562,14 +1575,14 @@ update_font_variations (void)
label = gtk_label_new ("Instance"); label = gtk_label_new ("Instance");
gtk_label_set_xalign (GTK_LABEL (label), 0); gtk_label_set_xalign (GTK_LABEL (label), 0);
gtk_widget_set_halign (label, GTK_ALIGN_START); gtk_widget_set_halign (label, GTK_ALIGN_START);
gtk_widget_set_valign (label, GTK_ALIGN_BASELINE_FILL); gtk_widget_set_valign (label, GTK_ALIGN_BASELINE);
gtk_grid_attach (GTK_GRID (demo->variations_grid), label, 0, -1, 1, 1); gtk_grid_attach (GTK_GRID (demo->variations_grid), label, 0, -1, 1, 1);
strings = gtk_string_list_new (NULL); strings = gtk_string_list_new (NULL);
combo = gtk_drop_down_new (G_LIST_MODEL (strings), NULL); combo = gtk_drop_down_new (G_LIST_MODEL (strings), NULL);
gtk_widget_set_halign (combo, GTK_ALIGN_START); gtk_widget_set_halign (combo, GTK_ALIGN_START);
gtk_widget_set_valign (combo, GTK_ALIGN_BASELINE_FILL); gtk_widget_set_valign (combo, GTK_ALIGN_BASELINE);
gtk_string_list_append (strings, ""); gtk_string_list_append (strings, "");
@@ -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,17 +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">
<accessibility>
<property name="label">Font</property>
</accessibility>
<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>
@@ -76,7 +70,7 @@
<property name="column-spacing">10</property> <property name="column-spacing">10</property>
<property name="row-spacing">10</property> <property name="row-spacing">10</property>
<child> <child>
<object class="GtkLabel" id="size_label"> <object class="GtkLabel">
<property name="label">Size</property> <property name="label">Size</property>
<property name="xalign">0</property> <property name="xalign">0</property>
<property name="valign">baseline</property> <property name="valign">baseline</property>
@@ -92,9 +86,6 @@
<property name="width-request">100</property> <property name="width-request">100</property>
<property name="valign">baseline</property> <property name="valign">baseline</property>
<property name="adjustment">size_adjustment</property> <property name="adjustment">size_adjustment</property>
<accessibility>
<relation name="labelled-by">size_label</relation>
</accessibility>
<layout> <layout>
<property name="column">1</property> <property name="column">1</property>
<property name="row">0</property> <property name="row">0</property>
@@ -107,9 +98,6 @@
<property name="max-width-chars">4</property> <property name="max-width-chars">4</property>
<property name="hexpand">0</property> <property name="hexpand">0</property>
<property name="valign">baseline</property> <property name="valign">baseline</property>
<accessibility>
<relation name="labelled-by">size_label</relation>
</accessibility>
<signal name="activate" handler="basic_entry_activated" <signal name="activate" handler="basic_entry_activated"
object="size_adjustment" swapped="false"/> object="size_adjustment" swapped="false"/>
<layout> <layout>
@@ -119,7 +107,7 @@
</object> </object>
</child> </child>
<child> <child>
<object class="GtkLabel" id="letterspacing_label"> <object class="GtkLabel">
<property name="label">Letterspacing</property> <property name="label">Letterspacing</property>
<property name="xalign">0</property> <property name="xalign">0</property>
<property name="valign">baseline</property> <property name="valign">baseline</property>
@@ -135,9 +123,6 @@
<property name="width-request">100</property> <property name="width-request">100</property>
<property name="valign">baseline</property> <property name="valign">baseline</property>
<property name="adjustment">letterspacing_adjustment</property> <property name="adjustment">letterspacing_adjustment</property>
<accessibility>
<relation name="labelled-by">letterspacing_label</relation>
</accessibility>
<layout> <layout>
<property name="column">1</property> <property name="column">1</property>
<property name="row">1</property> <property name="row">1</property>
@@ -150,9 +135,6 @@
<property name="max-width-chars">4</property> <property name="max-width-chars">4</property>
<property name="hexpand">0</property> <property name="hexpand">0</property>
<property name="valign">baseline</property> <property name="valign">baseline</property>
<accessibility>
<relation name="labelled-by">letterspacing_label</relation>
</accessibility>
<signal name="activate" handler="basic_entry_activated" <signal name="activate" handler="basic_entry_activated"
object="letterspacing_adjustment" swapped="false"/> object="letterspacing_adjustment" swapped="false"/>
<layout> <layout>
@@ -162,7 +144,7 @@
</object> </object>
</child> </child>
<child> <child>
<object class="GtkLabel" id="line_height_label"> <object class="GtkLabel">
<property name="label">Line Height</property> <property name="label">Line Height</property>
<property name="xalign">0</property> <property name="xalign">0</property>
<property name="valign">baseline</property> <property name="valign">baseline</property>
@@ -178,9 +160,6 @@
<property name="width-request">100</property> <property name="width-request">100</property>
<property name="valign">baseline</property> <property name="valign">baseline</property>
<property name="adjustment">line_height_adjustment</property> <property name="adjustment">line_height_adjustment</property>
<accessibility>
<relation name="labelled-by">line_height_label</relation>
</accessibility>
<layout> <layout>
<property name="column">1</property> <property name="column">1</property>
<property name="row">2</property> <property name="row">2</property>
@@ -193,9 +172,6 @@
<property name="max-width-chars">4</property> <property name="max-width-chars">4</property>
<property name="hexpand">0</property> <property name="hexpand">0</property>
<property name="valign">baseline</property> <property name="valign">baseline</property>
<accessibility>
<relation name="labelled-by">line_height_label</relation>
</accessibility>
<signal name="activate" handler="basic_entry_activated" <signal name="activate" handler="basic_entry_activated"
object="line_height_adjustment" swapped="false"/> object="line_height_adjustment" swapped="false"/>
<layout> <layout>
@@ -205,7 +181,7 @@
</object> </object>
</child> </child>
<child> <child>
<object class="GtkLabel" id="foreground_label"> <object class="GtkLabel">
<property name="label">Foreground</property> <property name="label">Foreground</property>
<property name="xalign">0</property> <property name="xalign">0</property>
<property name="valign">baseline</property> <property name="valign">baseline</property>
@@ -216,16 +192,9 @@
</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>
<accessibility>
<relation name="labelled-by">foreground_label</relation>
</accessibility>
<signal name="notify::rgba" handler="color_set_cb"/> <signal name="notify::rgba" handler="color_set_cb"/>
<layout> <layout>
<property name="column">1</property> <property name="column">1</property>
@@ -234,7 +203,7 @@
</object> </object>
</child> </child>
<child> <child>
<object class="GtkLabel" id="background_label"> <object class="GtkLabel">
<property name="label">Background</property> <property name="label">Background</property>
<property name="xalign">0</property> <property name="xalign">0</property>
<property name="valign">baseline</property> <property name="valign">baseline</property>
@@ -245,16 +214,9 @@
</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>
<accessibility>
<relation name="labelled-by">background_label</relation>
</accessibility>
<signal name="notify::rgba" handler="color_set_cb"/> <signal name="notify::rgba" handler="color_set_cb"/>
<layout> <layout>
<property name="column">1</property> <property name="column">1</property>
@@ -267,9 +229,6 @@
<property name="icon-name">object-flip-vertical-symbolic</property> <property name="icon-name">object-flip-vertical-symbolic</property>
<property name="halign">start</property> <property name="halign">start</property>
<property name="valign">center</property> <property name="valign">center</property>
<accessibility>
<property name="label">Swap colors</property>
</accessibility>
<style> <style>
<class name="circular"/> <class name="circular"/>
</style> </style>
@@ -371,9 +330,6 @@
<property name="yalign">0</property> <property name="yalign">0</property>
<property name="valign">start</property> <property name="valign">start</property>
<property name="selectable">1</property> <property name="selectable">1</property>
<accessibility>
<property name="label">Font example</property>
</accessibility>
</object> </object>
</property> </property>
</object> </object>
@@ -383,9 +339,6 @@
<property name="name">entry</property> <property name="name">entry</property>
<property name="child"> <property name="child">
<object class="GtkTextView" id="entry"> <object class="GtkTextView" id="entry">
<accessibility>
<property name="label">Example text</property>
</accessibility>
<property name="buffer"> <property name="buffer">
<object class="GtkTextBuffer"> <object class="GtkTextBuffer">
<property name="text">Grumpy wizards make toxic brew for the evil Queen and Jack. A quick movement of the enemy will jeopardize six gunboats. The job of waxing linoleum frequently peeves chintzy kids. My girl wove six dozen plaid jackets before she quit. Twelve ziggurats quickly jumped a finch box. <property name="text">Grumpy wizards make toxic brew for the evil Queen and Jack. A quick movement of the enemy will jeopardize six gunboats. The job of waxing linoleum frequently peeves chintzy kids. My girl wove six dozen plaid jackets before she quit. Twelve ziggurats quickly jumped a finch box.
@@ -482,9 +435,6 @@
<property name="icon-name">document-edit-symbolic</property> <property name="icon-name">document-edit-symbolic</property>
<property name="halign">end</property> <property name="halign">end</property>
<property name="valign">end</property> <property name="valign">end</property>
<accessibility>
<property name="label">Edit text</property>
</accessibility>
<signal name="clicked" handler="font_features_toggle_edit"/> <signal name="clicked" handler="font_features_toggle_edit"/>
</object> </object>
</child> </child>

View File

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

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

@@ -39,7 +39,7 @@
<property name="row-spacing">10</property> <property name="row-spacing">10</property>
<property name="column-spacing">10</property> <property name="column-spacing">10</property>
<child> <child>
<object class="GtkLabel" id="text_label"> <object class="GtkLabel">
<property name="margin-start">10</property> <property name="margin-start">10</property>
<property name="label">Text</property> <property name="label">Text</property>
<property name="xalign">1</property> <property name="xalign">1</property>
@@ -57,13 +57,10 @@
<layout> <layout>
<property name="column">2</property> <property name="column">2</property>
</layout> </layout>
<accessibility>
<relation name="labelled-by">text_label</relation>
</accessibility>
</object> </object>
</child> </child>
<child> <child>
<object class="GtkLabel" id="font_label"> <object class="GtkLabel">
<property name="margin-start">10</property> <property name="margin-start">10</property>
<property name="label">Font</property> <property name="label">Font</property>
<property name="xalign">1</property> <property name="xalign">1</property>
@@ -77,14 +74,7 @@
</object> </object>
</child> </child>
<child> <child>
<object class="GtkFontDialogButton" id="font_button"> <object class="GtkFontButton" id="font_button">
<accessibility>
<relation name="labelled-by">font_label</relation>
</accessibility>
<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>
@@ -192,9 +182,6 @@
<property name="icon-name">list-add-symbolic</property> <property name="icon-name">list-add-symbolic</property>
<property name="halign">center</property> <property name="halign">center</property>
<property name="valign">center</property> <property name="valign">center</property>
<accessibility>
<property name="label">Zoom in</property>
</accessibility>
<style> <style>
<class name="circular"/> <class name="circular"/>
</style> </style>
@@ -220,9 +207,6 @@
<property name="icon-name">list-remove-symbolic</property> <property name="icon-name">list-remove-symbolic</property>
<property name="halign">center</property> <property name="halign">center</property>
<property name="valign">center</property> <property name="valign">center</property>
<accessibility>
<property name="label">Zoom out</property>
</accessibility>
<style> <style>
<class name="circular"/> <class name="circular"/>
</style> </style>
@@ -263,9 +247,6 @@
<property name="vexpand">1</property> <property name="vexpand">1</property>
<child> <child>
<object class="GtkPicture" id="image"> <object class="GtkPicture" id="image">
<accessibility>
<property name="label">Font rendering example</property>
</accessibility>
<property name="halign">center</property> <property name="halign">center</property>
<property name="valign">center</property> <property name="valign">center</property>
<property name="can-shrink">0</property> <property name="can-shrink">0</property>

View File

@@ -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);
@@ -337,7 +337,7 @@ create_gltransition_window (GtkWidget *do_widget)
1, 1, 1, 1); 1, 1, 1, 1);
provider = gtk_css_provider_new (); provider = gtk_css_provider_new ();
gtk_css_provider_load_from_string (provider, "button.small { padding: 0; }"); gtk_css_provider_load_from_data (provider, "button.small { padding: 0; }", -1);
gtk_style_context_add_provider_for_display (gdk_display_get_default (), gtk_style_context_add_provider_for_display (gdk_display_get_default (),
GTK_STYLE_PROVIDER (provider), GTK_STYLE_PROVIDER (provider),
GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
@@ -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

@@ -1,153 +0,0 @@
#include "graphwidget.h"
struct _GraphWidget
{
GtkWidget parent_instance;
GskPath *path;
GskStroke *stroke;
GdkRGBA color;
guint tick_cb;
guint64 start_time;
double period;
double amplitude;
};
struct _GraphWidgetClass
{
GtkWidgetClass parent_class;
};
G_DEFINE_TYPE (GraphWidget, graph_widget, GTK_TYPE_WIDGET)
static void
update_path (GraphWidget *self,
float amplitude)
{
graphene_point_t p[20];
GskPathBuilder *builder;
g_clear_pointer (&self->path, gsk_path_unref);
for (int i = 0; i < 20; i++)
{
p[i].x = 10 * i;
p[i].y = 50;
if (i % 4 == 1 || i % 4 == 2)
{
if (i % 8 < 4)
p[i].y += amplitude;
else
p[i].y -= amplitude;
}
}
builder = gsk_path_builder_new ();
gsk_path_builder_move_to (builder, p[0].x, p[0].y);
for (int i = 0; i < 20; i += 4)
gsk_path_builder_cubic_to (builder,
p[i+1].x, p[i+1].y,
p[i+2].x, p[i+2].y,
p[i+3].x, p[i+3].y);
self->path = gsk_path_builder_free_to_path (builder);
}
static gboolean
tick_cb (GtkWidget *widget,
GdkFrameClock *frame_clock,
gpointer user_data)
{
GraphWidget *self = GRAPH_WIDGET (widget);
guint64 now;
double angle;
now = gdk_frame_clock_get_frame_time (frame_clock);
if (self->start_time == 0)
self->start_time = now;
angle = 360 * (now - self->start_time) / (double)(self->period * G_TIME_SPAN_MINUTE);
update_path (self, sin (angle) * self->amplitude);
gtk_widget_queue_draw (widget);
return G_SOURCE_CONTINUE;
}
static void
graph_widget_init (GraphWidget *self)
{
self->color.red = g_random_double_range (0, 1);
self->color.green = g_random_double_range (0, 1);
self->color.blue = g_random_double_range (0, 1);
self->color.alpha = 1;
self->period = g_random_double_range (0.5, 1);
self->amplitude = g_random_double_range (10, 25);
self->stroke = gsk_stroke_new (2);
update_path (self, 0);
self->start_time = 0;
self->tick_cb = gtk_widget_add_tick_callback (GTK_WIDGET (self), tick_cb, NULL, NULL);
}
static void
graph_widget_dispose (GObject *object)
{
GraphWidget *self = GRAPH_WIDGET (object);
g_clear_pointer (&self->path, gsk_path_unref);
gsk_stroke_free (self->stroke);
G_OBJECT_CLASS (graph_widget_parent_class)->dispose (object);
}
static void
graph_widget_snapshot (GtkWidget *widget,
GtkSnapshot *snapshot)
{
GraphWidget *self = GRAPH_WIDGET (widget);
gtk_snapshot_append_stroke (snapshot, self->path, self->stroke, &self->color);
}
static void
graph_widget_measure (GtkWidget *widget,
GtkOrientation orientation,
int for_size,
int *minimum,
int *natural,
int *minimum_baseline,
int *natural_baseline)
{
if (orientation == GTK_ORIENTATION_HORIZONTAL)
*minimum = *natural = 200;
else
*minimum = *natural = 100;
}
static void
graph_widget_class_init (GraphWidgetClass *class)
{
GObjectClass *object_class = G_OBJECT_CLASS (class);
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class);
object_class->dispose = graph_widget_dispose;
widget_class->snapshot = graph_widget_snapshot;
widget_class->measure = graph_widget_measure;
}
GtkWidget *
graph_widget_new (void)
{
return g_object_new (GRAPH_TYPE_WIDGET, NULL);
}

View File

@@ -1,8 +0,0 @@
#pragma once
#include <gtk/gtk.h>
#define GRAPH_TYPE_WIDGET (graph_widget_get_type ())
G_DECLARE_FINAL_TYPE (GraphWidget, graph_widget, GRAPH, WIDGET, GtkWidget)
GtkWidget * graph_widget_new (void);

View File

@@ -27,17 +27,24 @@ G_BEGIN_DECLS
#define GSK_TYPE_SHADER_PAINTABLE (gsk_shader_paintable_get_type ()) #define GSK_TYPE_SHADER_PAINTABLE (gsk_shader_paintable_get_type ())
GDK_AVAILABLE_IN_ALL
G_DECLARE_FINAL_TYPE (GskShaderPaintable, gsk_shader_paintable, GSK, SHADER_PAINTABLE, GObject) G_DECLARE_FINAL_TYPE (GskShaderPaintable, gsk_shader_paintable, GSK, SHADER_PAINTABLE, GObject)
GDK_AVAILABLE_IN_ALL
GdkPaintable * gsk_shader_paintable_new (GskGLShader *shader, GdkPaintable * gsk_shader_paintable_new (GskGLShader *shader,
GBytes *data); GBytes *data);
GDK_AVAILABLE_IN_ALL
GskGLShader * gsk_shader_paintable_get_shader (GskShaderPaintable *self); GskGLShader * gsk_shader_paintable_get_shader (GskShaderPaintable *self);
GDK_AVAILABLE_IN_ALL
void gsk_shader_paintable_set_shader (GskShaderPaintable *self, void gsk_shader_paintable_set_shader (GskShaderPaintable *self,
GskGLShader *shader); GskGLShader *shader);
GDK_AVAILABLE_IN_ALL
GBytes * gsk_shader_paintable_get_args (GskShaderPaintable *self); GBytes * gsk_shader_paintable_get_args (GskShaderPaintable *self);
GDK_AVAILABLE_IN_ALL
void gsk_shader_paintable_set_args (GskShaderPaintable *self, void gsk_shader_paintable_set_args (GskShaderPaintable *self,
GBytes *data); GBytes *data);
GDK_AVAILABLE_IN_ALL
void gsk_shader_paintable_update_time (GskShaderPaintable *self, void gsk_shader_paintable_update_time (GskShaderPaintable *self,
int time_idx, int time_idx,
gint64 frame_time); gint64 frame_time);

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;
@@ -840,24 +841,24 @@ gtk_gears_unrealize (GtkWidget *widget)
GtkGearsPrivate *priv = gtk_gears_get_instance_private ((GtkGears *) widget); GtkGearsPrivate *priv = gtk_gears_get_instance_private ((GtkGears *) widget);
gtk_gl_area_make_current (glarea); gtk_gl_area_make_current (glarea);
if (gtk_gl_area_get_error (glarea) == NULL) if (gtk_gl_area_get_error (glarea) != NULL)
{ return;
/* Release the resources associated with OpenGL */
if (priv->gear_vbo[0] != 0)
glDeleteBuffers (1, &(priv->gear_vbo[0]));
if (priv->gear_vbo[1] != 0) /* Release the resources associated with OpenGL */
glDeleteBuffers (1, &(priv->gear_vbo[1])); if (priv->gear_vbo[0] != 0)
glDeleteBuffers (1, &(priv->gear_vbo[0]));
if (priv->gear_vbo[2] != 0) if (priv->gear_vbo[1] != 0)
glDeleteBuffers (1, &(priv->gear_vbo[2])); glDeleteBuffers (1, &(priv->gear_vbo[1]));
if (priv->vao != 0) if (priv->gear_vbo[2] != 0)
glDeleteVertexArrays (1, &priv->vao); glDeleteBuffers (1, &(priv->gear_vbo[2]));
if (priv->program != 0) if (priv->vao != 0)
glDeleteProgram (priv->program); glDeleteVertexArrays (1, &priv->vao);
}
if (priv->program != 0)
glDeleteProgram (priv->program);
priv->ModelViewProjectionMatrix_location = 0; priv->ModelViewProjectionMatrix_location = 0;
priv->NormalMatrix_location = 0; priv->NormalMatrix_location = 0;

View File

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

@@ -354,18 +354,10 @@ do_iconscroll (GtkWidget *do_widget)
if (!window) if (!window)
{ {
GtkBuilder *builder; GtkBuilder *builder;
GtkBuilderScope *scope;
GtkWidget *label; GtkWidget *label;
guint id; guint id;
scope = gtk_builder_cscope_new (); builder = gtk_builder_new_from_resource ("/iconscroll/iconscroll.ui");
gtk_builder_cscope_add_callback (GTK_BUILDER_CSCOPE (scope), iconscroll_prev_clicked_cb);
gtk_builder_cscope_add_callback (GTK_BUILDER_CSCOPE (scope), iconscroll_next_clicked_cb);
builder = gtk_builder_new ();
gtk_builder_set_scope (builder, scope);
gtk_builder_add_from_resource (builder, "/iconscroll/iconscroll.ui", NULL);
window = GTK_WIDGET (gtk_builder_get_object (builder, "window")); window = GTK_WIDGET (gtk_builder_get_object (builder, "window"));
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window); g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
gtk_window_set_display (GTK_WINDOW (window), gtk_window_set_display (GTK_WINDOW (window),
@@ -378,16 +370,15 @@ do_iconscroll (GtkWidget *do_widget)
set_widget_type (0); set_widget_type (0);
label = GTK_WIDGET (gtk_builder_get_object (builder, "fps_label")); label = GTK_WIDGET (gtk_builder_get_object (builder, "fps_label"));
id = g_timeout_add_full (G_PRIORITY_HIGH, 500, update_fps, label, NULL); id = g_timeout_add (500, update_fps, label);
g_object_set_data_full (G_OBJECT (label), "timeout", g_object_set_data_full (G_OBJECT (label), "timeout",
GUINT_TO_POINTER (id), remove_timeout); GUINT_TO_POINTER (id), remove_timeout);
g_object_unref (builder); g_object_unref (builder);
g_object_unref (scope);
} }
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
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,197 +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_accessible_update_property (GTK_ACCESSIBLE (scale),
GTK_ACCESSIBLE_PROPERTY_LABEL, "Zoom",
-1);
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_accessible_update_property (GTK_ACCESSIBLE (dropdown),
GTK_ACCESSIBLE_PROPERTY_LABEL, "Filter",
-1);
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

@@ -30,7 +30,6 @@ progressive_prepared_callback (GdkPixbufLoader *loader,
{ {
GdkPixbuf *pixbuf; GdkPixbuf *pixbuf;
GtkWidget *picture; GtkWidget *picture;
GdkTexture *texture;
picture = GTK_WIDGET (data); picture = GTK_WIDGET (data);
@@ -41,9 +40,7 @@ progressive_prepared_callback (GdkPixbufLoader *loader,
*/ */
gdk_pixbuf_fill (pixbuf, 0xaaaaaaff); gdk_pixbuf_fill (pixbuf, 0xaaaaaaff);
texture = gdk_texture_new_for_pixbuf (pixbuf); gtk_picture_set_pixbuf (GTK_PICTURE (picture), pixbuf);
gtk_picture_set_paintable (GTK_PICTURE (picture), GDK_PAINTABLE (texture));
g_object_unref (texture);
} }
static void static void
@@ -54,18 +51,22 @@ progressive_updated_callback (GdkPixbufLoader *loader,
int height, int height,
gpointer data) gpointer data)
{ {
GtkWidget *picture = GTK_WIDGET (data); GtkWidget *picture;
GdkTexture *texture; GdkPixbuf *pixbuf;
texture = gdk_texture_new_for_pixbuf (gdk_pixbuf_loader_get_pixbuf (loader)); picture = GTK_WIDGET (data);
gtk_picture_set_paintable (GTK_PICTURE (picture), GDK_PAINTABLE (texture));
g_object_unref (texture); pixbuf = gdk_pixbuf_loader_get_pixbuf (loader);
gtk_picture_set_pixbuf (GTK_PICTURE (picture), NULL);
gtk_picture_set_pixbuf (GTK_PICTURE (picture), pixbuf);
} }
static int static int
progressive_timeout (gpointer data) progressive_timeout (gpointer data)
{ {
GtkWidget *picture = GTK_WIDGET (data); GtkWidget *picture;
picture = GTK_WIDGET (data);
/* This shows off fully-paranoid error handling, so looks scary. /* This shows off fully-paranoid error handling, so looks scary.
* You could factor out the error handling code into a nice separate * You could factor out the error handling code into a nice separate
@@ -82,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),
error->message); GTK_DIALOG_DESTROY_WITH_PARENT,
gtk_alert_dialog_show (dialog, NULL); GTK_MESSAGE_ERROR,
g_object_unref (dialog); GTK_BUTTONS_CLOSE,
"Failure reading image file 'alphatest.png': %s",
error->message);
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 */
@@ -102,17 +110,25 @@ progressive_timeout (gpointer data)
buf, bytes_read, buf, bytes_read,
&error)) &error))
{ {
GtkAlertDialog *dialog; GtkWidget *dialog;
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);
dialog = gtk_alert_dialog_new ("Failed to load image: %s",
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 */
@@ -127,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_message_dialog_new (GTK_WINDOW (window),
GTK_DIALOG_DESTROY_WITH_PARENT,
GTK_MESSAGE_ERROR,
GTK_BUTTONS_CLOSE,
"Failed to load image: %s",
error->message);
dialog = gtk_alert_dialog_new ("Failed to load image: %s",
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);
@@ -153,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_message_dialog_new (GTK_WINDOW (window),
GTK_DIALOG_DESTROY_WITH_PARENT,
GTK_MESSAGE_ERROR,
GTK_BUTTONS_CLOSE,
"Failed to load image: %s",
error->message);
dialog = gtk_alert_dialog_new ("Failed to load image: %s",
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;
@@ -183,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 */
@@ -421,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,22 +7,38 @@
#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,
gpointer data) gpointer data)
{ {
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,
"keyboard navigation and refers to the process of using " GTK_MESSAGE_INFO,
"a program (exclusively) via keyboard input."); GTK_BUTTONS_OK,
gtk_alert_dialog_show (dialog, GTK_WINDOW (gtk_widget_get_root (label))); "Keyboard navigation");
g_object_unref (dialog); 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 "
"a program (exclusively) via keyboard input.");
gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
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));

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