Compare commits

..

1 Commits

Author SHA1 Message Date
Matthias Clasen
3baddab5db pathbar: Setup the cancellable earlier
There have been reports of people hitting the
assertion in drop_node_for_cancellable, and a
plausible explanation is that we are adding it
too late in the codepath.

Fixes: #5792
2023-05-01 14:09:34 -04:00
477 changed files with 3114 additions and 24187 deletions

View File

@@ -24,9 +24,9 @@ stages:
variables: variables:
COMMON_MESON_FLAGS: "-Dwerror=true -Dcairo:werror=false -Dgi-docgen:werror=false -Dgraphene:werror=false -Dlibepoxy:werror=false -Dlibsass:werror=false -Dpango:werror=false -Dsassc:werror=false -Dgdk-pixbuf:werror=false -Dglib:werror=false -Dlibcloudproviders:werror=false -Dlibpng:werror=false -Dlibtiff:werror=false -Dsysprof:werror=false -Dwayland-protocols:werror=false -Dharfbuzz:werror=false -Dfreetype2:werror=false -Dfontconfig:werror=false -Dfribidi:werror=false -Dlibffi:werror=false -Dlibjpeg-turbo:werror=false -Dmutest:werror=false -Dpixman:werror=false -Dproxy-libintl:werror=false" COMMON_MESON_FLAGS: "-Dwerror=true -Dcairo:werror=false -Dgi-docgen:werror=false -Dgraphene:werror=false -Dlibepoxy:werror=false -Dlibsass:werror=false -Dpango:werror=false -Dsassc:werror=false -Dgdk-pixbuf:werror=false -Dglib:werror=false -Dlibcloudproviders:werror=false -Dlibpng:werror=false -Dlibtiff:werror=false -Dsysprof:werror=false -Dwayland-protocols:werror=false -Dharfbuzz:werror=false -Dfreetype2:werror=false -Dfontconfig:werror=false -Dfribidi:werror=false -Dlibffi:werror=false -Dlibjpeg-turbo:werror=false -Dmutest:werror=false -Dpixman:werror=false -Dproxy-libintl:werror=false"
BACKEND_FLAGS: "-Dx11-backend=true -Dwayland-backend=true -Dbroadway-backend=true" BACKEND_FLAGS: "-Dx11-backend=true -Dwayland-backend=true -Dbroadway-backend=true"
FEATURE_FLAGS: "-Dvulkan=enabled -Dcloudproviders=enabled -Dbuild-demos=false -Dbuild-examples=false -Dbuild-tests=false -Dbuild-testsuite=true" FEATURE_FLAGS: "-Dvulkan=enabled -Dcloudproviders=enabled -Ddemos=false -Dbuild-examples=false -Dbuild-tests=false -Dbuild-testsuite=true"
MESON_TEST_TIMEOUT_MULTIPLIER: 3 MESON_TEST_TIMEOUT_MULTIPLIER: 3
FEDORA_IMAGE: "registry.gitlab.gnome.org/gnome/gtk/fedora:v46" FEDORA_IMAGE: "registry.gitlab.gnome.org/gnome/gtk/fedora:v42"
workflow: workflow:
rules: rules:
@@ -57,9 +57,15 @@ style-check-diff:
reports: reports:
junit: junit:
- "${CI_PROJECT_DIR}/_build/report-x11.xml" - "${CI_PROJECT_DIR}/_build/report-x11.xml"
- "${CI_PROJECT_DIR}/_build/report-x11_unstable.xml"
- "${CI_PROJECT_DIR}/_build/report-wayland.xml" - "${CI_PROJECT_DIR}/_build/report-wayland.xml"
- "${CI_PROJECT_DIR}/_build/report-wayland_unstable.xml"
- "${CI_PROJECT_DIR}/_build/report-wayland_gles.xml" - "${CI_PROJECT_DIR}/_build/report-wayland_gles.xml"
- "${CI_PROJECT_DIR}/_build/report-wayland_gles_unstable.xml"
- "${CI_PROJECT_DIR}/_build/report-wayland_smalltexture.xml"
- "${CI_PROJECT_DIR}/_build/report-wayland_smalltexture_unstable.xml"
- "${CI_PROJECT_DIR}/_build/report-broadway.xml" - "${CI_PROJECT_DIR}/_build/report-broadway.xml"
- "${CI_PROJECT_DIR}/_build/report-broadway_unstable.xml"
name: "gtk-${CI_COMMIT_REF_NAME}" name: "gtk-${CI_COMMIT_REF_NAME}"
paths: paths:
- "${CI_PROJECT_DIR}/_build/meson-logs" - "${CI_PROJECT_DIR}/_build/meson-logs"
@@ -70,7 +76,6 @@ 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"
@@ -86,27 +91,7 @@ fedora-x86_64:
script: script:
- .gitlab-ci/show-info-linux.sh - .gitlab-ci/show-info-linux.sh
- export PATH="$HOME/.local/bin:$PATH" - export PATH="$HOME/.local/bin:$PATH"
- meson subprojects download - pip3 install --user meson~=0.64
- meson subprojects update --reset
- meson setup
${COMMON_MESON_FLAGS}
${EXTRA_MESON_FLAGS}
${BACKEND_FLAGS}
${FEATURE_FLAGS}
_build
- meson compile -C _build
- .gitlab-ci/run-tests.sh _build wayland
- .gitlab-ci/run-tests.sh _build wayland_gles
release-build:
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"
- meson subprojects download - meson subprojects download
- meson subprojects update --reset - meson subprojects update --reset
- mkdir _install - mkdir _install
@@ -122,6 +107,31 @@ release-build:
- PKG_CONFIG_PATH=${CI_PROJECT_DIR}/_install/lib64/pkgconfig:${CI_PROJECT_DIR}/_install/share/pkgconfig meson setup _build_hello examples/hello - 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 - LD_LIBRARY_PATH=${CI_PROJECT_DIR}/_install/lib64 meson compile -C _build_hello
- .gitlab-ci/run-tests.sh _build x11 - .gitlab-ci/run-tests.sh _build x11
- .gitlab-ci/run-tests.sh _build wayland
- .gitlab-ci/run-tests.sh _build wayland_gles
- .gitlab-ci/run-tests.sh _build wayland_smalltexture
- .gitlab-ci/run-tests.sh _build broadway
release-build:
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"
- pip3 install --user meson~=0.64
- meson subprojects download
- meson subprojects update --reset
- meson setup
${COMMON_MESON_FLAGS}
${EXTRA_MESON_FLAGS}
${BACKEND_FLAGS}
${FEATURE_FLAGS}
_build
- meson compile -C _build
- .gitlab-ci/run-tests.sh _build x11
fedora-mingw64: fedora-mingw64:
extends: .build-fedora-default extends: .build-fedora-default
@@ -142,11 +152,23 @@ fedora-mingw64:
script: script:
- .gitlab-ci/show-info-linux.sh - .gitlab-ci/show-info-linux.sh
- export PATH="$HOME/.local/bin:$PATH" - export PATH="$HOME/.local/bin:$PATH"
- pip3 install --user meson~=1.0 - pip3 install --user meson~=0.64
- meson subprojects download - meson subprojects download
- meson subprojects update --reset - meson subprojects update --reset
- meson -Dintrospection=disabled -Dgraphene:introspection=disabled _build # Test that mingw64-meson still fails. If it has stopped failing, the CI
- meson compile -C _build # will fail and now you should remove the hack that follows this.
- FAILED=false
- mingw64-meson --version || FAILED=true
- test $FAILED = false && echo "mingw64-meson works now, remove the hack" && exit 1
# HACK: Running mingw64-meson directly fails on the CI with:
# /usr/bin/mingw64-meson: line 92: fg: no job control
# Because rpm is not evaluating %__meson and it gets interpreted as a job
# specifier. So we fix that and run it ourselves.
- rpm --eval "%{mingw64_meson}" > mingw64-meson.sh
- sed -i -e 's/%__meson/meson/' mingw64-meson.sh
- chmod +x mingw64-meson.sh
- ./mingw64-meson.sh -Dintrospection=disabled -Dgraphene:introspection=disabled _build
- ninja -C _build
.mingw-defaults: .mingw-defaults:
stage: build stage: build
@@ -188,7 +210,7 @@ macos:
needs: [] needs: []
before_script: before_script:
- bash .gitlab-ci/show-info-osx.sh - bash .gitlab-ci/show-info-osx.sh
- pip3 install --user meson~=1.0 - pip3 install --user meson~=0.64
- pip3 install --user ninja - pip3 install --user ninja
- export PATH=/Users/gitlabrunner/Library/Python/3.7/bin:$PATH - export PATH=/Users/gitlabrunner/Library/Python/3.7/bin:$PATH
- export MESON_FORCE_BACKTRACE=1 - export MESON_FORCE_BACKTRACE=1
@@ -346,11 +368,10 @@ static-scan:
EXTRA_MESON_FLAGS: "--buildtype=debug" EXTRA_MESON_FLAGS: "--buildtype=debug"
script: script:
- export PATH="$HOME/.local/bin:$PATH" - export PATH="$HOME/.local/bin:$PATH"
- pip3 install --user meson~=0.64
- meson setup - meson setup
${COMMON_MESON_FLAGS} ${COMMON_MESON_FLAGS}
${EXTRA_MESON_FLAGS} ${EXTRA_MESON_FLAGS}
${BACKEND_FLAGS}
${FEATURE_FLAGS}
_scan_build _scan_build
- ninja -C _scan_build scan-build - ninja -C _scan_build scan-build
artifacts: artifacts:
@@ -369,6 +390,7 @@ asan-build:
variables: variables:
script: script:
- export PATH="$HOME/.local/bin:$PATH" - export PATH="$HOME/.local/bin:$PATH"
- pip3 install --user meson~=0.64
- CC=clang meson setup --buildtype=debugoptimized -Db_sanitize=address -Db_lundef=false -Dintrospection=disabled -Df16c=disabled _build - CC=clang meson setup --buildtype=debugoptimized -Db_sanitize=address -Db_lundef=false -Dintrospection=disabled -Df16c=disabled _build
- ninja -C _build - ninja -C _build
- .gitlab-ci/run-tests.sh _build wayland - .gitlab-ci/run-tests.sh _build wayland
@@ -383,6 +405,7 @@ reference:
needs: [] needs: []
script: script:
- export PATH="$HOME/.local/bin:$PATH" - export PATH="$HOME/.local/bin:$PATH"
- pip3 install --user meson~=0.64
- meson setup - meson setup
${COMMON_MESON_FLAGS} ${COMMON_MESON_FLAGS}
--buildtype=release --buildtype=release

View File

@@ -32,6 +32,7 @@ RUN dnf -y install \
glib2-static \ glib2-static \
glibc-devel \ glibc-devel \
glibc-headers \ glibc-headers \
gnome-desktop-testing \
gnupg2 \ gnupg2 \
gobject-introspection-devel \ gobject-introspection-devel \
graphene-devel \ graphene-devel \
@@ -72,14 +73,10 @@ RUN dnf -y install \
mesa-dri-drivers \ mesa-dri-drivers \
mesa-libEGL-devel \ mesa-libEGL-devel \
mesa-libGLES-devel \ mesa-libGLES-devel \
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 \
@@ -87,7 +84,6 @@ RUN dnf -y install \
python3-markdown \ python3-markdown \
python3-packaging \ python3-packaging \
python3-pip \ python3-pip \
python3-pydbus \
python3-pygments \ python3-pygments \
python3-typogrify \ python3-typogrify \
python3-wheel \ python3-wheel \
@@ -99,7 +95,6 @@ RUN dnf -y install \
weston \ weston \
weston-libs \ weston-libs \
which \ which \
wireplumber \
xorg-x11-server-Xvfb \ xorg-x11-server-Xvfb \
&& dnf clean all && dnf clean all

View File

@@ -138,8 +138,7 @@ if [ $run == 1 ]; then
echo -e "\e[1;32mRUNNING\e[0m: ${base} as ${TAG}" echo -e "\e[1;32mRUNNING\e[0m: ${base} as ${TAG}"
${CMD} run \ ${CMD} run \
--rm \ --rm \
--userns=keep-id \ --volume "$(pwd)/..:/home/user/app" \
--volume "$(pwd)/..:/home/user/app:rw,z" \
--workdir "/home/user/app" \ --workdir "/home/user/app" \
--tty \ --tty \
--interactive "${TAG}" \ --interactive "${TAG}" \

View File

@@ -6,7 +6,6 @@ set +e
srcdir=$( pwd ) srcdir=$( pwd )
builddir=$1 builddir=$1
backend=$2 backend=$2
multiplier=${MESON_TEST_TIMEOUT_MULTIPLIER:-1}
# Ignore memory leaks lower in dependencies # Ignore memory leaks lower in dependencies
export LSAN_OPTIONS=suppressions=$srcdir/lsan.supp:print_suppressions=0:verbosity=1:log_threads=1 export LSAN_OPTIONS=suppressions=$srcdir/lsan.supp:print_suppressions=0:verbosity=1:log_threads=1
@@ -16,8 +15,7 @@ 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 \
@@ -28,6 +26,14 @@ case "${backend}" in
# Store the exit code for the CI run, but always # Store the exit code for the CI run, but always
# generate the reports # generate the reports
exit_code=$? exit_code=$?
xvfb-run -a -s "-screen 0 1024x768x24 -noreset" \
meson test -C ${builddir} \
--timeout-multiplier "${MESON_TEST_TIMEOUT_MULTIPLIER}" \
--print-errorlogs \
--setup=${backend}_unstable \
--suite=flaky \
--suite=failing || true
;; ;;
wayland*) wayland*)
@@ -38,17 +44,22 @@ 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=failing \
--no-suite=flaky \ --no-suite=flaky \
--no-suite=${backend}_failing \
--no-suite=gsk-compare-broadway --no-suite=gsk-compare-broadway
exit_code=$? exit_code=$?
meson test -C ${builddir} \
--timeout-multiplier "${MESON_TEST_TIMEOUT_MULTIPLIER}" \
--print-errorlogs \
--setup=${backend}_unstable \
--suite=flaky \
--suite=failing || true
kill ${compositor} kill ${compositor}
;; ;;
@@ -60,8 +71,7 @@ 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 \
@@ -69,6 +79,16 @@ case "${backend}" in
--no-suite=flaky \ --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
meson test -C ${builddir} \
--timeout-multiplier "${MESON_TEST_TIMEOUT_MULTIPLIER}" \
--print-errorlogs \
--setup=${backend}_unstable \
--suite=flaky \
--suite=failing || true
kill ${server} kill ${server}
;; ;;
@@ -81,19 +101,20 @@ esac
cd ${builddir} cd ${builddir}
$srcdir/.gitlab-ci/meson-junit-report.py \ for suffix in "" "_unstable"; do
$srcdir/.gitlab-ci/meson-junit-report.py \
--project-name=gtk \ --project-name=gtk \
--backend="${backend}" \ --backend="${backend}${suffix}" \
--job-id="${CI_JOB_NAME}" \ --job-id="${CI_JOB_NAME}" \
--output="report-${backend}.xml" \ --output="report-${backend}${suffix}.xml" \
"meson-logs/testlog-${backend}.json" "meson-logs/testlog-${backend}${suffix}.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}${suffix}" \
--job-id="${CI_JOB_NAME}" \ --job-id="${CI_JOB_NAME}" \
--reftest-output-dir="testsuite/reftests/output/${backend}" \ --reftest-output-dir="testsuite/reftests/output/${backend}${suffix}" \
--output="report-${backend}.html" \ --output="report-${backend}${suffix}.html" \
"meson-logs/testlog-${backend}.json" "meson-logs/testlog-${backend}${suffix}.json"
done
exit $exit_code exit $exit_code

40
NEWS
View File

@@ -1,7 +1,4 @@
Overview of Changes in 4.11.3, xx-xx-xxxx Overview of Changes in 4.11.2, xx-xx-xxxx
=========================================
Overview of Changes in 4.11.2, 09-05-2023
========================================= =========================================
* GtkGLArea: * GtkGLArea:
@@ -10,12 +7,6 @@ Overview of Changes in 4.11.2, 09-05-2023
* GtkListBox: * GtkListBox:
- Fix a problem with gtk_list_box_remove_all - 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: * GtkCenterBox:
- Add a shrink-center-last property - Add a shrink-center-last property
@@ -32,9 +23,6 @@ Overview of Changes in 4.11.2, 09-05-2023
- A few memory leak fixes - A few memory leak fixes
- Handle webdav in the pathbar - Handle webdav in the pathbar
* GtkBox:
- Support baselines in vertical orientation with GtkBox:baseline-child
* Dialogs: * Dialogs:
- Destroy windows promptly when the async callback finishes - Destroy windows promptly when the async callback finishes
- Detect absence of the OpenURI portal and fall back - Detect absence of the OpenURI portal and fall back
@@ -45,22 +33,12 @@ Overview of Changes in 4.11.2, 09-05-2023
* Accessibility: * Accessibility:
- Fix alert dialogs in the a11y tree - Fix alert dialogs in the a11y tree
- Improve accessibility of GtkShortcutsWindow
* Layout: * Layout:
- Some fixes to baseline alignment - 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: * GL:
- Add GdkGLTextureBuilder, a more flexible api for creating textures - Add GdkGLTextureBuilder, a more flexible api for creating textures
- Support setting update regions for GL textures
- Ensure that we work with GLES 2 - Ensure that we work with GLES 2
* Vulkan: * Vulkan:
@@ -71,37 +49,23 @@ Overview of Changes in 4.11.2, 09-05-2023
- Don't destroy wl_surfaces on hide - Don't destroy wl_surfaces on hide
- Plug leaks of compositor-side resources - Plug leaks of compositor-side resources
* X11:
- Fix artifacts in gnome-shell frame decorations
* Windows:
- Fix GL context initialization
* Inspector: * Inspector:
- Improve the action list - Improve the action list
- Improve the accessibility pane
- Fix a crash - Fix a crash
* Tools: * Tools:
- gtk4-node-editor: Improve scaling - gtk4-node-editor: Improve scaling
- gtk4-node-editor: Preserve aspect ratio of textures - gtk4-node-editor: Preserve aspect ratio of textures
- gtk4-node-editor: Add some smarter editing
- gtk4-demo: Make the stylus demo work with mice - gtk4-demo: Make the stylus demo work with mice
* Deprecations:
- gtk_widget_get_allocated_width/height/baseline
- GTK_ALIGN_BASELINE
* Translation updates * Translation updates
Bulgarian Bulgarian
Chinese (China) Chinese (China)
Friulian
Galician Galician
Hebrew Hebrew
Persian
Polish Polish
Portuguese Portuguese
`Russian Russian
Turkish Turkish

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

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

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

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

View File

@@ -195,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>
@@ -315,7 +312,6 @@
<file>listview_minesweeper.c</file> <file>listview_minesweeper.c</file>
<file>listview_selections.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>

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);
@@ -765,7 +765,7 @@ G_GNUC_END_IGNORE_DEPRECATIONS
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);

View File

@@ -301,7 +301,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);

View File

@@ -1294,18 +1294,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);
@@ -1562,14 +1562,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, "");

View File

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

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

@@ -370,7 +370,7 @@ 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);

View File

@@ -14,7 +14,138 @@
#include <gtk/gtk.h> #include <gtk/gtk.h>
#include "settings-key.h" #include <stdlib.h>
/* Create an object that wraps GSettingsSchemaKey because that's a boxed type */
typedef struct _SettingsKey SettingsKey;
struct _SettingsKey
{
GObject parent_instance;
GSettings *settings;
GSettingsSchemaKey *key;
};
enum {
PROP_0,
PROP_NAME,
PROP_SUMMARY,
PROP_DESCRIPTION,
PROP_VALUE,
PROP_TYPE,
PROP_DEFAULT_VALUE,
N_PROPS
};
#define SETTINGS_TYPE_KEY (settings_key_get_type ())
G_DECLARE_FINAL_TYPE (SettingsKey, settings_key, SETTINGS, KEY, GObject);
G_DEFINE_TYPE (SettingsKey, settings_key, G_TYPE_OBJECT);
static GParamSpec *properties[N_PROPS] = { NULL, };
static void
settings_key_get_property (GObject *object,
guint property_id,
GValue *value,
GParamSpec *pspec)
{
SettingsKey *self = SETTINGS_KEY (object);
switch (property_id)
{
case PROP_DESCRIPTION:
g_value_set_string (value, g_settings_schema_key_get_description (self->key));
break;
case PROP_NAME:
g_value_set_string (value, g_settings_schema_key_get_name (self->key));
break;
case PROP_SUMMARY:
g_value_set_string (value, g_settings_schema_key_get_summary (self->key));
break;
case PROP_VALUE:
{
GVariant *variant = g_settings_get_value (self->settings, g_settings_schema_key_get_name (self->key));
g_value_take_string (value, g_variant_print (variant, FALSE));
g_variant_unref (variant);
}
break;
case PROP_TYPE:
{
const GVariantType *type = g_settings_schema_key_get_value_type (self->key);
g_value_set_string (value, g_variant_type_peek_string (type));
}
break;
case PROP_DEFAULT_VALUE:
{
GVariant *variant = g_settings_schema_key_get_default_value (self->key);
g_value_take_string (value, g_variant_print (variant, FALSE));
g_variant_unref (variant);
}
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
break;
}
}
static void
settings_key_finalize (GObject *object)
{
SettingsKey *self = SETTINGS_KEY (object);
g_object_unref (self->settings);
g_settings_schema_key_unref (self->key);
G_OBJECT_CLASS (settings_key_parent_class)->finalize (object);
}
static void
settings_key_class_init (SettingsKeyClass *klass)
{
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
gobject_class->finalize = settings_key_finalize;
gobject_class->get_property = settings_key_get_property;
properties[PROP_DESCRIPTION] =
g_param_spec_string ("description", NULL, NULL, NULL, G_PARAM_READABLE);
properties[PROP_NAME] =
g_param_spec_string ("name", NULL, NULL, NULL, G_PARAM_READABLE);
properties[PROP_SUMMARY] =
g_param_spec_string ("summary", NULL, NULL, NULL, G_PARAM_READABLE);
properties[PROP_VALUE] =
g_param_spec_string ("value", NULL, NULL, NULL, G_PARAM_READABLE);
properties[PROP_TYPE] =
g_param_spec_string ("type", NULL, NULL, NULL, G_PARAM_READABLE);
properties[PROP_DEFAULT_VALUE] =
g_param_spec_string ("default-value", NULL, NULL, NULL, G_PARAM_READABLE);
g_object_class_install_properties (gobject_class, N_PROPS, properties);
}
static void
settings_key_init (SettingsKey *self)
{
}
static SettingsKey *
settings_key_new (GSettings *settings,
GSettingsSchemaKey *key)
{
SettingsKey *result = g_object_new (SETTINGS_TYPE_KEY, NULL);
result->settings = g_object_ref (settings);
result->key = g_settings_schema_key_ref (key);
return result;
}
static void static void
item_value_changed (GtkEditableLabel *label, item_value_changed (GtkEditableLabel *label,
@@ -22,7 +153,6 @@ item_value_changed (GtkEditableLabel *label,
GtkColumnViewCell *cell) GtkColumnViewCell *cell)
{ {
SettingsKey *self; SettingsKey *self;
GSettingsSchemaKey *key;
const char *text; const char *text;
const GVariantType *type; const GVariantType *type;
GVariant *variant; GVariant *variant;
@@ -33,10 +163,9 @@ item_value_changed (GtkEditableLabel *label,
text = gtk_editable_get_text (GTK_EDITABLE (label)); text = gtk_editable_get_text (GTK_EDITABLE (label));
self = gtk_column_view_cell_get_item (cell); self = gtk_column_view_cell_get_item (cell);
key = settings_key_get_key (self);
type = g_settings_schema_key_get_value_type (key); type = g_settings_schema_key_get_value_type (self->key);
name = g_settings_schema_key_get_name (key); name = g_settings_schema_key_get_name (self->key);
variant = g_variant_parse (type, text, NULL, NULL, &error); variant = g_variant_parse (type, text, NULL, NULL, &error);
if (!variant) if (!variant)
@@ -46,13 +175,13 @@ item_value_changed (GtkEditableLabel *label,
goto revert; goto revert;
} }
if (!g_settings_schema_key_range_check (key, variant)) if (!g_settings_schema_key_range_check (self->key, variant))
{ {
g_warning ("Not a valid value for %s", name); g_warning ("Not a valid value for %s", name);
goto revert; goto revert;
} }
g_settings_set_value (settings_key_get_settings (self), name, variant); g_settings_set_value (self->settings, name, variant);
g_variant_unref (variant); g_variant_unref (variant);
return; return;

View File

@@ -1,230 +0,0 @@
/* Lists/Alternative Settings
* #Keywords: GtkListHeaderFactory, GtkSectionModel
*
* This demo shows an alternative settings viewer for GSettings.
*
* It demonstrates how to implement support for sections with GtkListView.
*
* It also shows how to quickly flatten a large tree of items into a list
* that can be filtered to find the items one is looking for.
*/
#include <gtk/gtk.h>
#include "settings-key.h"
static void
item_value_changed (GtkEditableLabel *label,
GParamSpec *pspec,
GtkColumnViewCell *cell)
{
SettingsKey *self;
GSettingsSchemaKey *key;
const char *text;
const GVariantType *type;
GVariant *variant;
GError *error = NULL;
const char *name;
char *value;
text = gtk_editable_get_text (GTK_EDITABLE (label));
self = gtk_column_view_cell_get_item (cell);
key = settings_key_get_key (self);
type = g_settings_schema_key_get_value_type (key);
name = g_settings_schema_key_get_name (key);
variant = g_variant_parse (type, text, NULL, NULL, &error);
if (!variant)
{
g_warning ("%s", error->message);
g_clear_error (&error);
goto revert;
}
if (!g_settings_schema_key_range_check (key, variant))
{
g_warning ("Not a valid value for %s", name);
goto revert;
}
g_settings_set_value (settings_key_get_settings (self), name, variant);
g_variant_unref (variant);
return;
revert:
gtk_widget_error_bell (GTK_WIDGET (label));
g_object_get (self, "value", &value, NULL);
gtk_editable_set_text (GTK_EDITABLE (label), value);
g_free (value);
}
static int
strvcmp (gconstpointer p1,
gconstpointer p2)
{
const char * const *s1 = p1;
const char * const *s2 = p2;
return strcmp (*s1, *s2);
}
static gpointer
map_settings_to_keys (gpointer item,
gpointer unused)
{
GSettings *settings = item;
GSettingsSchema *schema;
GListStore *store;
char **keys;
guint i;
g_object_get (settings, "settings-schema", &schema, NULL);
store = g_list_store_new (SETTINGS_TYPE_KEY);
keys = g_settings_schema_list_keys (schema);
for (i = 0; keys[i] != NULL; i++)
{
GSettingsSchemaKey *almost_there = g_settings_schema_get_key (schema, keys[i]);
SettingsKey *finally = settings_key_new (settings, almost_there);
g_list_store_append (store, finally);
g_object_unref (finally);
g_settings_schema_key_unref (almost_there);
}
g_strfreev (keys);
g_settings_schema_unref (schema);
g_object_unref (settings);
return store;
}
static GListModel *
create_settings_model (gpointer item,
gpointer unused)
{
GSettings *settings = item;
char **schemas;
GListStore *result;
guint i;
if (settings == NULL)
{
g_settings_schema_source_list_schemas (g_settings_schema_source_get_default (),
TRUE,
&schemas,
NULL);
}
else
{
schemas = g_settings_list_children (settings);
}
if (schemas == NULL || schemas[0] == NULL)
{
g_free (schemas);
return NULL;
}
qsort (schemas, g_strv_length (schemas), sizeof (char *), strvcmp);
result = g_list_store_new (G_TYPE_SETTINGS);
for (i = 0; schemas[i] != NULL; i++)
{
GSettings *child;
if (settings == NULL)
child = g_settings_new (schemas[i]);
else
child = g_settings_get_child (settings, schemas[i]);
g_list_store_append (result, child);
g_object_unref (child);
}
g_strfreev (schemas);
return G_LIST_MODEL (result);
}
static void
search_enabled (GtkSearchEntry *entry)
{
gtk_editable_set_text (GTK_EDITABLE (entry), "");
}
static void
stop_search (GtkSearchEntry *entry,
gpointer data)
{
gtk_editable_set_text (GTK_EDITABLE (entry), "");
}
static GtkWidget *window = NULL;
GtkWidget *
do_listview_settings2 (GtkWidget *do_widget)
{
if (window == NULL)
{
GtkListView *listview;
GListModel *model;
GtkTreeListModel *treemodel;
GtkNoSelection *selection;
GtkBuilderScope *scope;
GtkBuilder *builder;
GError *error = NULL;
GtkFilter *filter;
g_type_ensure (SETTINGS_TYPE_KEY);
scope = gtk_builder_cscope_new ();
gtk_builder_cscope_add_callback (scope, search_enabled);
gtk_builder_cscope_add_callback (scope, stop_search);
gtk_builder_cscope_add_callback (scope, settings_key_get_search_string);
gtk_builder_cscope_add_callback (scope, item_value_changed);
builder = gtk_builder_new ();
gtk_builder_set_scope (builder, scope);
g_object_unref (scope);
gtk_builder_add_from_resource (builder, "/listview_settings2/listview_settings2.ui", &error);
g_assert_no_error (error);
window = GTK_WIDGET (gtk_builder_get_object (builder, "window"));
gtk_window_set_display (GTK_WINDOW (window),
gtk_widget_get_display (do_widget));
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *) &window);
listview = GTK_LIST_VIEW (gtk_builder_get_object (builder, "listview"));
filter = GTK_FILTER (gtk_builder_get_object (builder, "filter"));
model = create_settings_model (NULL, NULL);
treemodel = gtk_tree_list_model_new (model,
TRUE,
TRUE,
create_settings_model,
NULL,
NULL);
model = G_LIST_MODEL (gtk_map_list_model_new (G_LIST_MODEL (treemodel), map_settings_to_keys, NULL, NULL));
model = G_LIST_MODEL (gtk_flatten_list_model_new (model));
model = G_LIST_MODEL (gtk_filter_list_model_new (model, g_object_ref (filter)));
selection = gtk_no_selection_new (model);
gtk_list_view_set_model (GTK_LIST_VIEW (listview), GTK_SELECTION_MODEL (selection));
g_object_unref (selection);
g_object_unref (builder);
}
if (!gtk_widget_get_visible (window))
gtk_widget_set_visible (window, TRUE);
else
gtk_window_destroy (GTK_WINDOW (window));
return window;
}

View File

@@ -1,130 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<object class="GtkStringFilter" id="filter">
<property name="expression">
<closure type="gchararray" function="settings_key_get_search_string" />
</property>
<property name="search" bind-source="entry" bind-property="text" />
</object>
<object class="GtkWindow" id="window">
<property name="title" translatable="yes">Settings</property>
<property name="default-width">640</property>
<property name="default-height">480</property>
<child type="titlebar">
<object class="GtkHeaderBar">
<child type="end">
<object class="GtkToggleButton" id="search_button">
<property name="icon-name">system-search-symbolic</property>
</object>
</child>
</object>
</child>
<child>
<object class="GtkBox">
<property name="orientation">vertical</property>
<child>
<object class="GtkSearchBar">
<property name="search-mode-enabled" bind-source="search_button" bind-property="active" bind-flags="bidirectional"/>
<signal name="notify::search-mode-enabled" handler="search_enabled" object="entry"/>
<child>
<object class="GtkSearchEntry" id="entry">
<signal name="stop-search" handler="stop_search"/>
</object>
</child>
</object>
</child>
<child>
<object class="GtkScrolledWindow">
<child>
<object class="GtkListView" id="listview">
<property name="vexpand">1</property>
<style>
<class name="rich-list"/>
</style>
<property name="factory">
<object class="GtkBuilderListItemFactory">
<property name="bytes"><![CDATA[
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<template class="GtkListItem">
<property name="child">
<object class="GtkBox">
<child>
<object class="GtkBox">
<property name="orientation">vertical</property>
<child>
<object class="GtkLabel">
<property name="xalign">0</property>
<binding name="label">
<lookup name="name" type="SettingsKey">
<lookup name="item">GtkListItem</lookup>
</lookup>
</binding>
</object>
</child>
<child>
<object class="GtkLabel">
<style>
<class name="dim-label"/>
</style>
<property name="xalign">0</property>
<property name="ellipsize">end</property>
<binding name="label">
<lookup name="summary" type="SettingsKey">
<lookup name="item">GtkListItem</lookup>
</lookup>
</binding>
</object>
</child>
</object>
</child>
<child>
<object class="GtkEntry">
<property name="hexpand">1</property>
<property name="halign">end</property>
<binding name="text">
<lookup name="value" type="SettingsKey">
<lookup name="item">GtkListItem</lookup>
</lookup>
</binding>
<signal name="notify::label" handler="item_value_changed"/>
</object>
</child>
</object>
</property>
</template>
</interface>
]]></property>
</object>
</property>
<property name="header-factory">
<object class="GtkBuilderListItemFactory">
<property name="bytes"><![CDATA[
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<template class="GtkListHeader">
<property name="child">
<object class="GtkLabel">
<property name="xalign">0</property>
<binding name="label">
<lookup name="schema" type="GSettings">
<lookup name="settings" type="SettingsKey">
<lookup name="item">GtkListHeader</lookup>
</lookup>
</lookup>
</binding>
</object>
</property>
</template>
</interface>
]]></property>
</object>
</property>
</object>
</child>
</object>
</child>
</object>
</child>
</object>
</interface>

View File

@@ -367,7 +367,7 @@ do_listview_ucd (GtkWidget *do_widget)
gtk_label_set_width_chars (GTK_LABEL (label), 2); gtk_label_set_width_chars (GTK_LABEL (label), 2);
gtk_widget_add_css_class (label, "enormous"); gtk_widget_add_css_class (label, "enormous");
provider = gtk_css_provider_new (); provider = gtk_css_provider_new ();
gtk_css_provider_load_from_string (provider, "label.enormous { font-size: 80px; }"); gtk_css_provider_load_from_data (provider, "label.enormous { font-size: 80px; }", -1);
gtk_style_context_add_provider_for_display (gdk_display_get_default (), GTK_STYLE_PROVIDER (provider), 800); gtk_style_context_add_provider_for_display (gdk_display_get_default (), GTK_STYLE_PROVIDER (provider), 800);
gtk_widget_set_hexpand (label, TRUE); gtk_widget_set_hexpand (label, TRUE);
gtk_box_append (GTK_BOX (box), label); gtk_box_append (GTK_BOX (box), label);

View File

@@ -57,7 +57,6 @@ demos = files([
'listview_minesweeper.c', 'listview_minesweeper.c',
'listview_selections.c', 'listview_selections.c',
'listview_settings.c', 'listview_settings.c',
'listview_settings2.c',
'listview_ucd.c', 'listview_ucd.c',
'listview_weather.c', 'listview_weather.c',
'listview_words.c', 'listview_words.c',
@@ -132,7 +131,6 @@ extra_demo_sources = files([
'demo4widget.c', 'demo4widget.c',
'pixbufpaintable.c', 'pixbufpaintable.c',
'script-names.c', 'script-names.c',
'settings-key.c',
'unicode-names.c', 'unicode-names.c',
'suggestionentry.c', 'suggestionentry.c',
'language-names.c', 'language-names.c',
@@ -235,7 +233,8 @@ endif
demo_cflags = [] demo_cflags = []
foreach flag: common_cflags foreach flag: common_cflags
if flag not in ['-Werror=missing-prototypes', '-Wmissing-prototypes', if flag not in ['-Werror=missing-prototypes', '-Wmissing-prototypes',
'-Werror=missing-declarations', '-Wmissing-declarations'] '-Werror=missing-declarations', '-Wmissing-declarations',
'-fvisibility=hidden']
demo_cflags += flag demo_cflags += flag
endif endif
endforeach endforeach

View File

@@ -384,7 +384,7 @@ create_board (GtkWidget *window)
"}"; "}";
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),
800); 800);

View File

@@ -1,165 +0,0 @@
#include "settings-key.h"
/* Create an object that wraps GSettingsSchemaKey because that's a boxed type */
struct _SettingsKey
{
GObject parent_instance;
GSettings *settings;
GSettingsSchemaKey *key;
};
enum {
PROP_0,
PROP_NAME,
PROP_SETTINGS,
PROP_SUMMARY,
PROP_DESCRIPTION,
PROP_VALUE,
PROP_TYPE,
PROP_DEFAULT_VALUE,
N_PROPS
};
G_DEFINE_TYPE (SettingsKey, settings_key, G_TYPE_OBJECT);
static GParamSpec *properties[N_PROPS] = { NULL, };
static void
settings_key_get_property (GObject *object,
guint property_id,
GValue *value,
GParamSpec *pspec)
{
SettingsKey *self = SETTINGS_KEY (object);
switch (property_id)
{
case PROP_DESCRIPTION:
g_value_set_string (value, g_settings_schema_key_get_description (self->key));
break;
case PROP_NAME:
g_value_set_string (value, g_settings_schema_key_get_name (self->key));
break;
case PROP_SUMMARY:
g_value_set_string (value, g_settings_schema_key_get_summary (self->key));
break;
case PROP_VALUE:
{
GVariant *variant = g_settings_get_value (self->settings, g_settings_schema_key_get_name (self->key));
g_value_take_string (value, g_variant_print (variant, FALSE));
g_variant_unref (variant);
}
break;
case PROP_TYPE:
{
const GVariantType *type = g_settings_schema_key_get_value_type (self->key);
g_value_set_string (value, g_variant_type_peek_string (type));
}
break;
case PROP_DEFAULT_VALUE:
{
GVariant *variant = g_settings_schema_key_get_default_value (self->key);
g_value_take_string (value, g_variant_print (variant, FALSE));
g_variant_unref (variant);
}
break;
case PROP_SETTINGS:
g_value_set_object (value, self->settings);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
break;
}
}
static void
settings_key_finalize (GObject *object)
{
SettingsKey *self = SETTINGS_KEY (object);
g_object_unref (self->settings);
g_settings_schema_key_unref (self->key);
G_OBJECT_CLASS (settings_key_parent_class)->finalize (object);
}
static void
settings_key_class_init (SettingsKeyClass *klass)
{
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
gobject_class->finalize = settings_key_finalize;
gobject_class->get_property = settings_key_get_property;
properties[PROP_DESCRIPTION] =
g_param_spec_string ("description", NULL, NULL, NULL, G_PARAM_READABLE);
properties[PROP_NAME] =
g_param_spec_string ("name", NULL, NULL, NULL, G_PARAM_READABLE);
properties[PROP_SETTINGS] =
g_param_spec_object ("settings", NULL, NULL, G_TYPE_SETTINGS, G_PARAM_READABLE);
properties[PROP_SUMMARY] =
g_param_spec_string ("summary", NULL, NULL, NULL, G_PARAM_READABLE);
properties[PROP_VALUE] =
g_param_spec_string ("value", NULL, NULL, NULL, G_PARAM_READABLE);
properties[PROP_TYPE] =
g_param_spec_string ("type", NULL, NULL, NULL, G_PARAM_READABLE);
properties[PROP_DEFAULT_VALUE] =
g_param_spec_string ("default-value", NULL, NULL, NULL, G_PARAM_READABLE);
g_object_class_install_properties (gobject_class, N_PROPS, properties);
}
static void
settings_key_init (SettingsKey *self)
{
}
SettingsKey *
settings_key_new (GSettings *settings,
GSettingsSchemaKey *key)
{
SettingsKey *result = g_object_new (SETTINGS_TYPE_KEY, NULL);
result->settings = g_object_ref (settings);
result->key = g_settings_schema_key_ref (key);
return result;
}
GSettingsSchemaKey *
settings_key_get_key (SettingsKey *self)
{
return self->key;
}
GSettings *
settings_key_get_settings (SettingsKey *self)
{
return self->settings;
}
char *
settings_key_get_search_string (SettingsKey *self)
{
char *schema, *result;
g_object_get (self->settings, "schema-id", &schema, NULL);
result = g_strconcat (g_settings_schema_key_get_name (self->key), " ",
g_settings_schema_key_get_summary (self->key), " ",
schema,
NULL);
g_free (schema);
return result;
}

View File

@@ -1,17 +0,0 @@
#pragma once
#include <gtk/gtk.h>
#include <stdlib.h>
/* Create an object that wraps GSettingsSchemaKey because that's a boxed type */
typedef struct _SettingsKey SettingsKey;
#define SETTINGS_TYPE_KEY (settings_key_get_type ())
G_DECLARE_FINAL_TYPE (SettingsKey, settings_key, SETTINGS, KEY, GObject);
SettingsKey * settings_key_new (GSettings *settings,
GSettingsSchemaKey *key);
GSettingsSchemaKey * settings_key_get_key (SettingsKey *self);
GSettings * settings_key_get_settings (SettingsKey *self);
char * settings_key_get_search_string (SettingsKey *self);

View File

@@ -28,14 +28,14 @@ add_row (GtkGrid *table,
label = gtk_label_new_with_mnemonic (label_text); label = gtk_label_new_with_mnemonic (label_text);
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_widget_set_hexpand (label, TRUE); gtk_widget_set_hexpand (label, TRUE);
gtk_grid_attach (table, label, 0, row, 1, 1); gtk_grid_attach (table, label, 0, row, 1, 1);
dropdown = gtk_drop_down_new_from_strings (options); dropdown = gtk_drop_down_new_from_strings (options);
gtk_label_set_mnemonic_widget (GTK_LABEL (label), dropdown); gtk_label_set_mnemonic_widget (GTK_LABEL (label), dropdown);
gtk_widget_set_halign (dropdown, GTK_ALIGN_END); gtk_widget_set_halign (dropdown, GTK_ALIGN_END);
gtk_widget_set_valign (dropdown, GTK_ALIGN_BASELINE_FILL); gtk_widget_set_valign (dropdown, GTK_ALIGN_BASELINE);
gtk_size_group_add_widget (size_group, dropdown); gtk_size_group_add_widget (size_group, dropdown);
gtk_grid_attach (table, dropdown, 1, row, 1, 1); gtk_grid_attach (table, dropdown, 1, row, 1, 1);
} }

View File

@@ -1,5 +1,5 @@
gen_demo_header = find_program('../build-aux/meson/gen-demo-header.py') gen_demo_header = find_program('../build-aux/meson/gen-demo-header.py')
demo_profile = get_option('demo-profile') demo_profile = get_option('profile')
demo_conf_h = declare_dependency( demo_conf_h = declare_dependency(
sources: custom_target('demo-header', sources: custom_target('demo-header',

View File

@@ -201,7 +201,7 @@ node_editor_application_startup (GApplication *app)
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);

View File

@@ -64,7 +64,6 @@ struct _NodeEditorWindow
GListStore *renderers; GListStore *renderers;
GskRenderNode *node; GskRenderNode *node;
GFile *file;
GFileMonitor *file_monitor; GFileMonitor *file_monitor;
GArray *errors; GArray *errors;
@@ -545,14 +544,12 @@ node_editor_window_load (NodeEditorWindow *self,
{ {
GError *error = NULL; GError *error = NULL;
g_clear_object (&self->file);
g_clear_object (&self->file_monitor); g_clear_object (&self->file_monitor);
if (!load_file_contents (self, file)) if (!load_file_contents (self, file))
return FALSE; return FALSE;
self->file = g_object_ref (file); self->file_monitor = g_file_monitor_file (file, G_FILE_MONITOR_NONE, NULL, &error);
self->file_monitor = g_file_monitor_file (self->file, G_FILE_MONITOR_NONE, NULL, &error);
if (error) if (error)
{ {
@@ -589,21 +586,13 @@ static void
show_open_filechooser (NodeEditorWindow *self) show_open_filechooser (NodeEditorWindow *self)
{ {
GtkFileDialog *dialog; GtkFileDialog *dialog;
GFile *cwd;
dialog = gtk_file_dialog_new (); dialog = gtk_file_dialog_new ();
gtk_file_dialog_set_title (dialog, "Open node file"); gtk_file_dialog_set_title (dialog, "Open node file");
if (self->file) cwd = g_file_new_for_path (".");
{ gtk_file_dialog_set_initial_folder (dialog, cwd);
gtk_file_dialog_set_initial_file (dialog, self->file); g_object_unref (cwd);
}
else
{
GFile *cwd;
cwd = g_file_new_for_path (".");
gtk_file_dialog_set_initial_folder (dialog, cwd);
g_object_unref (cwd);
}
gtk_file_dialog_open (dialog, GTK_WINDOW (self), gtk_file_dialog_open (dialog, GTK_WINDOW (self),
NULL, open_response_cb, self); NULL, open_response_cb, self);
g_object_unref (dialog); g_object_unref (dialog);
@@ -661,21 +650,14 @@ save_cb (GtkWidget *button,
NodeEditorWindow *self) NodeEditorWindow *self)
{ {
GtkFileDialog *dialog; GtkFileDialog *dialog;
GFile *cwd;
dialog = gtk_file_dialog_new (); dialog = gtk_file_dialog_new ();
gtk_file_dialog_set_title (dialog, "Save node"); gtk_file_dialog_set_title (dialog, "Save node");
if (self->file) cwd = g_file_new_for_path (".");
{ gtk_file_dialog_set_initial_folder (dialog, cwd);
gtk_file_dialog_set_initial_file (dialog, self->file); gtk_file_dialog_set_initial_name (dialog, "demo.node");
} g_object_unref (cwd);
else
{
GFile *cwd = g_file_new_for_path (".");
gtk_file_dialog_set_initial_folder (dialog, cwd);
gtk_file_dialog_set_initial_name (dialog, "demo.node");
g_object_unref (cwd);
}
gtk_file_dialog_save (dialog, gtk_file_dialog_save (dialog,
GTK_WINDOW (gtk_widget_get_root (GTK_WIDGET (button))), GTK_WINDOW (gtk_widget_get_root (GTK_WIDGET (button))),
NULL, NULL,
@@ -1109,8 +1091,6 @@ node_editor_window_finalize (GObject *object)
g_clear_pointer (&self->node, gsk_render_node_unref); g_clear_pointer (&self->node, gsk_render_node_unref);
g_clear_object (&self->renderers); g_clear_object (&self->renderers);
g_clear_object (&self->file_monitor);
g_clear_object (&self->file);
G_OBJECT_CLASS (node_editor_window_parent_class)->finalize (object); G_OBJECT_CLASS (node_editor_window_parent_class)->finalize (object);
} }
@@ -1190,362 +1170,11 @@ node_editor_window_unrealize (GtkWidget *widget)
GTK_WIDGET_CLASS (node_editor_window_parent_class)->unrealize (widget); GTK_WIDGET_CLASS (node_editor_window_parent_class)->unrealize (widget);
} }
typedef struct
{
NodeEditorWindow *self;
GtkTextIter start, end;
} Selection;
static void
color_cb (GObject *source,
GAsyncResult *result,
gpointer data)
{
GtkColorDialog *dialog = GTK_COLOR_DIALOG (source);
Selection *selection = data;
NodeEditorWindow *self = selection->self;
GdkRGBA *color;
char *text;
GError *error = NULL;
GtkTextBuffer *buffer;
color = gtk_color_dialog_choose_rgba_finish (dialog, result, &error);
if (!color)
{
g_print ("%s\n", error->message);
g_error_free (error);
g_free (selection);
return;
}
buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (self->text_view));
text = gdk_rgba_to_string (color);
gtk_text_buffer_delete (buffer, &selection->start, &selection->end);
gtk_text_buffer_insert (buffer, &selection->start, text, -1);
g_free (text);
gdk_rgba_free (color);
g_free (selection);
}
static void
font_cb (GObject *source,
GAsyncResult *result,
gpointer data)
{
GtkFontDialog *dialog = GTK_FONT_DIALOG (source);
Selection *selection = data;
NodeEditorWindow *self = selection->self;
GError *error = NULL;
PangoFontDescription *desc;
GtkTextBuffer *buffer;
char *text;
desc = gtk_font_dialog_choose_font_finish (dialog, result, &error);
if (!desc)
{
g_print ("%s\n", error->message);
g_error_free (error);
g_free (selection);
return;
}
buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (self->text_view));
text = pango_font_description_to_string (desc);
gtk_text_buffer_delete (buffer, &selection->start, &selection->end);
gtk_text_buffer_insert (buffer, &selection->start, text, -1);
g_free (text);
pango_font_description_free (desc);
g_free (selection);
}
static void
file_cb (GObject *source,
GAsyncResult *result,
gpointer data)
{
GtkFileDialog *dialog = GTK_FILE_DIALOG (source);
Selection *selection = data;
NodeEditorWindow *self = selection->self;
GError *error = NULL;
GFile *file;
GtkTextBuffer *buffer;
char *text;
file = gtk_file_dialog_open_finish (dialog, result, &error);
if (!file)
{
g_print ("%s\n", error->message);
g_error_free (error);
g_free (selection);
return;
}
buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (self->text_view));
text = g_file_get_uri (file);
gtk_text_buffer_delete (buffer, &selection->start, &selection->end);
gtk_text_buffer_insert (buffer, &selection->start, text, -1);
g_free (text);
g_object_unref (file);
g_free (selection);
}
static void
key_pressed (GtkEventControllerKey *controller,
unsigned int keyval,
unsigned int keycode,
GdkModifierType state,
gpointer data)
{
GtkWidget *dd = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (controller));
Selection *selection = data;
NodeEditorWindow *self = selection->self;
unsigned int selected;
GtkStringList *strings;
GtkTextBuffer *buffer;
const char *text;
if (keyval != GDK_KEY_Escape)
return;
strings = GTK_STRING_LIST (gtk_drop_down_get_model (GTK_DROP_DOWN (dd)));
selected = gtk_drop_down_get_selected (GTK_DROP_DOWN (dd));
text = gtk_string_list_get_string (strings, selected);
gtk_text_view_remove (GTK_TEXT_VIEW (self->text_view), dd);
buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (self->text_view));
gtk_text_iter_backward_search (&selection->start, "mode:", 0, NULL, &selection->start, NULL);
gtk_text_iter_forward_search (&selection->start, ";", 0, &selection->end, NULL, NULL);
gtk_text_buffer_delete (buffer, &selection->start, &selection->end);
gtk_text_buffer_insert (buffer, &selection->start, " ", -1);
gtk_text_buffer_insert (buffer, &selection->start, text, -1);
}
static void
node_editor_window_edit (NodeEditorWindow *self,
GtkTextIter *iter)
{
GtkTextIter start, end;
GtkTextBuffer *buffer;
Selection *selection;
buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (self->text_view));
gtk_text_iter_set_line_offset (iter, 0);
if (gtk_text_iter_forward_search (iter, ";", 0, &end, NULL, NULL) &&
gtk_text_iter_forward_search (iter, "color:", 0, NULL, &start, &end))
{
GtkColorDialog *dialog;
GdkRGBA color;
char *text;
while (g_unichar_isspace (gtk_text_iter_get_char (&start)))
gtk_text_iter_forward_char (&start);
gtk_text_buffer_select_range (buffer, &start, &end);
text = gtk_text_buffer_get_text (buffer, &start, &end, TRUE);
gdk_rgba_parse (&color, text);
g_free (text);
selection = g_new0 (Selection, 1);
selection->self = self;
selection->start = start;
selection->end = end;
dialog = gtk_color_dialog_new ();
gtk_color_dialog_choose_rgba (dialog, GTK_WINDOW (self), &color, NULL, color_cb, selection);
}
else if (gtk_text_iter_forward_search (iter, ";", 0, &end, NULL, NULL) &&
gtk_text_iter_forward_search (iter, "font:", 0, NULL, &start, &end))
{
GtkFontDialog *dialog;
PangoFontDescription *desc;
char *text;
while (g_unichar_isspace (gtk_text_iter_get_char (&start)))
gtk_text_iter_forward_char (&start);
/* Skip the quotes */
gtk_text_iter_forward_char (&start);
gtk_text_iter_backward_char (&end);
gtk_text_buffer_select_range (buffer, &start, &end);
text = gtk_text_buffer_get_text (buffer, &start, &end, TRUE);
desc = pango_font_description_from_string (text);
g_free (text);
selection = g_new0 (Selection, 1);
selection->self = self;
selection->start = start;
selection->end = end;
dialog = gtk_font_dialog_new ();
gtk_font_dialog_choose_font (dialog, GTK_WINDOW (self), desc, NULL, font_cb, selection);
pango_font_description_free (desc);
}
else if (gtk_text_iter_forward_search (iter, ";", 0, &end, NULL, NULL) &&
gtk_text_iter_forward_search (iter, "mode:", 0, NULL, &start, &end))
{
/* Assume we have a blend node, for now */
GEnumClass *class;
GtkStringList *strings;
GtkWidget *dd;
GtkTextChildAnchor *anchor;
unsigned int selected = 0;
GtkEventController *key_controller;
gboolean is_blend_mode = FALSE;
char *text;
while (g_unichar_isspace (gtk_text_iter_get_char (&start)))
gtk_text_iter_forward_char (&start);
text = gtk_text_buffer_get_text (buffer, &start, &end, TRUE);
strings = gtk_string_list_new (NULL);
class = g_type_class_ref (GSK_TYPE_BLEND_MODE);
for (unsigned int i = 0; i < class->n_values; i++)
{
if (strcmp (class->values[i].value_nick, text) == 0)
is_blend_mode = TRUE;
}
g_type_class_unref (class);
if (is_blend_mode)
class = g_type_class_ref (GSK_TYPE_BLEND_MODE);
else
class = g_type_class_ref (GSK_TYPE_MASK_MODE);
for (unsigned int i = 0; i < class->n_values; i++)
{
if (i == 0 && is_blend_mode)
gtk_string_list_append (strings, "normal");
else
gtk_string_list_append (strings, class->values[i].value_nick);
if (strcmp (class->values[i].value_nick, text) == 0)
selected = i;
}
g_type_class_unref (class);
gtk_text_buffer_delete (buffer, &start, &end);
anchor = gtk_text_buffer_create_child_anchor (buffer, &start);
dd = gtk_drop_down_new (G_LIST_MODEL (strings), NULL);
gtk_drop_down_set_selected (GTK_DROP_DOWN (dd), selected);
gtk_text_view_add_child_at_anchor (GTK_TEXT_VIEW (self->text_view), dd, anchor);
selection = g_new0 (Selection, 1);
selection->self = self;
selection->start = start;
selection->end = end;
key_controller = gtk_event_controller_key_new ();
g_signal_connect (key_controller, "key-pressed", G_CALLBACK (key_pressed), selection);
gtk_widget_add_controller (dd, key_controller);
}
else if (gtk_text_iter_forward_search (iter, ";", 0, &end, NULL, NULL) &&
gtk_text_iter_forward_search (iter, "texture:", 0, NULL, &start, &end))
{
GtkFileDialog *dialog;
GtkTextIter skip;
char *text;
GFile *file;
while (g_unichar_isspace (gtk_text_iter_get_char (&start)))
gtk_text_iter_forward_char (&start);
skip = start;
gtk_text_iter_forward_chars (&skip, strlen ("url(\""));
text = gtk_text_iter_get_text (&start, &skip);
if (strcmp (text, "url(\"") != 0)
{
g_free (text);
return;
}
g_free (text);
start = skip;
skip = end;
gtk_text_iter_backward_chars (&skip, strlen ("\")"));
text = gtk_text_iter_get_text (&skip, &end);
if (strcmp (text, "\")") != 0)
{
g_free (text);
return;
}
g_free (text);
end = skip;
gtk_text_buffer_select_range (buffer, &start, &end);
text = gtk_text_buffer_get_text (buffer, &start, &end, TRUE);
file = g_file_new_for_uri (text);
g_free (text);
selection = g_new0 (Selection, 1);
selection->self = self;
selection->start = start;
selection->end = end;
dialog = gtk_file_dialog_new ();
gtk_file_dialog_set_initial_file (dialog, file);
gtk_file_dialog_open (dialog, GTK_WINDOW (self), NULL, file_cb, selection);
g_object_unref (file);
}
}
static void
click_gesture_pressed (GtkGestureClick *gesture,
int n_press,
double x,
double y,
NodeEditorWindow *self)
{
GtkTextIter iter;
int bx, by, trailing;
GdkModifierType state;
state = gtk_event_controller_get_current_event_state (GTK_EVENT_CONTROLLER (gesture));
if ((state & GDK_CONTROL_MASK) == 0)
return;
gtk_text_view_window_to_buffer_coords (GTK_TEXT_VIEW (self->text_view), GTK_TEXT_WINDOW_TEXT, x, y, &bx, &by);
gtk_text_view_get_iter_at_position (GTK_TEXT_VIEW (self->text_view), &iter, &trailing, bx, by);
node_editor_window_edit (self, &iter);
}
static void
edit_action_cb (GtkWidget *widget,
const char *action_name,
GVariant *parameter)
{
NodeEditorWindow *self = NODE_EDITOR_WINDOW (widget);
GtkTextBuffer *buffer;
GtkTextIter start, end;
buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (self->text_view));
gtk_text_buffer_get_selection_bounds (buffer, &start, &end);
node_editor_window_edit (self, &start);
}
static void static void
node_editor_window_class_init (NodeEditorWindowClass *class) node_editor_window_class_init (NodeEditorWindowClass *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);
GtkShortcutTrigger *trigger;
GtkShortcutAction *action;
GtkShortcut *shortcut;
object_class->dispose = node_editor_window_dispose; object_class->dispose = node_editor_window_dispose;
object_class->finalize = node_editor_window_finalize; object_class->finalize = node_editor_window_finalize;
@@ -1576,14 +1205,6 @@ node_editor_window_class_init (NodeEditorWindowClass *class)
gtk_widget_class_bind_template_callback (widget_class, dark_mode_cb); gtk_widget_class_bind_template_callback (widget_class, dark_mode_cb);
gtk_widget_class_bind_template_callback (widget_class, on_picture_drag_prepare_cb); gtk_widget_class_bind_template_callback (widget_class, on_picture_drag_prepare_cb);
gtk_widget_class_bind_template_callback (widget_class, on_picture_drop_cb); gtk_widget_class_bind_template_callback (widget_class, on_picture_drop_cb);
gtk_widget_class_bind_template_callback (widget_class, click_gesture_pressed);
gtk_widget_class_install_action (widget_class, "smart-edit", NULL, edit_action_cb);
trigger = gtk_keyval_trigger_new (GDK_KEY_e, GDK_CONTROL_MASK);
action = gtk_named_action_new ("smart-edit");
shortcut = gtk_shortcut_new (trigger, action);
gtk_widget_class_add_shortcut (widget_class, shortcut);
} }
static GtkWidget * static GtkWidget *

View File

@@ -16,14 +16,6 @@
</item> </item>
</section> </section>
</menu> </menu>
<menu id="extra_menu">
<section>
<item>
<attribute name="label" translatable="yes">Assisted _Edit</attribute>
<attribute name="action">smart-edit</attribute>
</item>
</section>
</menu>
<object class="GtkPopover" id="testcase_popover"> <object class="GtkPopover" id="testcase_popover">
<child> <child>
@@ -203,17 +195,10 @@
<property name="right-margin">6</property> <property name="right-margin">6</property>
<property name="bottom-margin">6</property> <property name="bottom-margin">6</property>
<property name="has-tooltip">1</property> <property name="has-tooltip">1</property>
<property name="extra-menu">extra_menu</property>
<signal name="query-tooltip" handler="text_view_query_tooltip_cb"/> <signal name="query-tooltip" handler="text_view_query_tooltip_cb"/>
<style> <style>
<class name="editor" /> <class name="editor" />
</style> </style>
<child>
<object class="GtkGestureClick">
<property name="button">1</property>
<signal name="pressed" handler="click_gesture_pressed"/>
</object>
</child>
</object> </object>
</child> </child>
</object> </object>

View File

@@ -193,7 +193,7 @@ Creates a node like `gsk_linear_gradient_node_new()` with the given properties.
| property | syntax | default | printed | | property | syntax | default | printed |
| -------- | ---------------- | ---------------------- | ----------- | | -------- | ---------------- | ---------------------- | ----------- |
| source | `<node>` | color { } | always | | source | `<node>` | color { } | always |
| mode | `<mask-mode>` | alpha | non-default | | mode | `<blend-mode>` | alpha | non-default |
| mask | `<node>` | color { } | always | | mask | `<node>` | color { } | always |
Creates a node like `gsk_mask_node_new()` with the given properties. Creates a node like `gsk_mask_node_new()` with the given properties.

View File

@@ -288,7 +288,7 @@ support.
If you want to run the testsuite to ensure that your GTK build If you want to run the testsuite to ensure that your GTK build
works, you should enable it with this option. works, you should enable it with this option.
### `build-tests`, `build-examples`, `build-demos` ### `build-tests`, `build-examples`, `demos`
By default, GTK will build quite a few tests, examples and demos. By default, GTK will build quite a few tests, examples and demos.
While these are useful on a developer system, they are not While these are useful on a developer system, they are not

View File

@@ -68,7 +68,6 @@ ui_files = [
'stackswitcher.ui', 'stackswitcher.ui',
'statusbar.ui', 'statusbar.ui',
'switch.ui', 'switch.ui',
'switch-state.ui',
'toggle-button.ui', 'toggle-button.ui',
'video.ui', 'video.ui',
'volumebutton.ui', 'volumebutton.ui',

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 KiB

View File

@@ -1,43 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<object class="GtkWindow">
<property name="decorated">0</property>
<property name="resizable">0</property>
<property name="default-width">280</property>
<property name="default-height">120</property>
<style>
<class name="nobackground"/>
</style>
<child>
<object class="GtkBox">
<style>
<class name="shadow"/>
<class name="background"/>
<class name="frame"/>
</style>
<child>
<object class="GtkBox">
<property name="orientation">vertical</property>
<property name="spacing">3</property>
<property name="hexpand">1</property>
<property name="vexpand">1</property>
<property name="halign">center</property>
<property name="valign">center</property>
<child>
<object class="GtkSwitch">
<property name="active">1</property>
<property name="state">0</property>
</object>
</child>
<child>
<object class="GtkSwitch">
<property name="active">0</property>
<property name="state">1</property>
</object>
</child>
</object>
</child>
</object>
</child>
</object>
</interface>

View File

@@ -1,7 +0,0 @@
A trivial example
=================
This is a very minimal example of an app that can be built against GTK.
We use this in CI to test that building against the installed GTK works.
That is why there is a standalone meson.build in this subdirectory.

View File

@@ -24,7 +24,7 @@
#include "config.h" #include "config.h"
#include "version/gdkversionmacros.h" #include "gdkversionmacros.h"
#include "gdkresources.h" #include "gdkresources.h"
@@ -132,7 +132,6 @@ static const GdkDebugKey gdk_debug_keys[] = {
{ "vulkan-validate", GDK_DEBUG_VULKAN_VALIDATE, "Load the Vulkan validation layer", TRUE }, { "vulkan-validate", GDK_DEBUG_VULKAN_VALIDATE, "Load the Vulkan validation layer", TRUE },
{ "default-settings",GDK_DEBUG_DEFAULT_SETTINGS, "Force default values for xsettings", TRUE }, { "default-settings",GDK_DEBUG_DEFAULT_SETTINGS, "Force default values for xsettings", TRUE },
{ "high-depth", GDK_DEBUG_HIGH_DEPTH, "Use high bit depth rendering if possible", TRUE }, { "high-depth", GDK_DEBUG_HIGH_DEPTH, "Use high bit depth rendering if possible", TRUE },
{ "no-vsync", GDK_DEBUG_NO_VSYNC, "Repaint instantly (uses 100% CPU with animations)", TRUE },
}; };

View File

@@ -75,7 +75,7 @@
#include <gdk/gdktoplevellayout.h> #include <gdk/gdktoplevellayout.h>
#include <gdk/gdktoplevelsize.h> #include <gdk/gdktoplevelsize.h>
#include <gdk/gdktypes.h> #include <gdk/gdktypes.h>
#include <gdk/version/gdkversionmacros.h> #include <gdk/gdkversionmacros.h>
#include <gdk/gdkvulkancontext.h> #include <gdk/gdkvulkancontext.h>
#undef __GDK_H_INSIDE__ #undef __GDK_H_INSIDE__

View File

@@ -24,6 +24,7 @@
#error "Only <gdk/gdk.h> can be included directly." #error "Only <gdk/gdk.h> can be included directly."
#endif #endif
#include <gdk/gdkversionmacros.h>
#include <gdk/gdktypes.h> #include <gdk/gdktypes.h>
G_BEGIN_DECLS G_BEGIN_DECLS

View File

@@ -1,5 +1,5 @@
/* GDK - The GIMP Drawing Kit /* GDK - The GIMP Drawing Kit
* Copyright (C) 2005 Red Hat, Inc. * Copyright (C) 2005 Red Hat, Inc.
* *
* This library is free software; you can redistribute it and/or * This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public * modify it under the terms of the GNU Lesser General Public
@@ -19,9 +19,6 @@
#include "gdkcairoprivate.h" #include "gdkcairoprivate.h"
#include "gdkrgba.h"
#include "gdktexture.h"
#include <math.h> #include <math.h>
/** /**

View File

@@ -1,5 +1,5 @@
/* GDK - The GIMP Drawing Kit /* GDK - The GIMP Drawing Kit
* Copyright (C) 2005 Red Hat, Inc. * Copyright (C) 2005 Red Hat, Inc.
* *
* This library is free software; you can redistribute it and/or * This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public * modify it under the terms of the GNU Lesser General Public
@@ -21,7 +21,8 @@
#error "Only <gdk/gdk.h> can be included directly." #error "Only <gdk/gdk.h> can be included directly."
#endif #endif
#include <gdk/gdktypes.h> #include <gdk/gdkversionmacros.h>
#include <gdk/gdkrgba.h>
#include <gdk/gdkpixbuf.h> #include <gdk/gdkpixbuf.h>
#include <pango/pangocairo.h> #include <pango/pangocairo.h>

View File

@@ -24,8 +24,11 @@
#error "Only <gdk/gdk.h> can be included directly." #error "Only <gdk/gdk.h> can be included directly."
#endif #endif
#include <gdk/gdkversionmacros.h>
#include <gdk/gdktypes.h> #include <gdk/gdktypes.h>
#include <cairo.h>
G_BEGIN_DECLS G_BEGIN_DECLS
#define GDK_TYPE_CAIRO_CONTEXT (gdk_cairo_context_get_type ()) #define GDK_TYPE_CAIRO_CONTEXT (gdk_cairo_context_get_type ())

View File

@@ -22,7 +22,10 @@
#error "Only <gdk/gdk.h> can be included directly." #error "Only <gdk/gdk.h> can be included directly."
#endif #endif
#include <gdk/gdkversionmacros.h>
#include <gdk/gdktypes.h> #include <gdk/gdktypes.h>
#include <gio/gio.h>
G_BEGIN_DECLS G_BEGIN_DECLS

View File

@@ -21,6 +21,8 @@
#error "Only <gdk/gdk.h> can be included directly." #error "Only <gdk/gdk.h> can be included directly."
#endif #endif
#include <gdk/gdkversionmacros.h>
#include <gdk/gdktypes.h> #include <gdk/gdktypes.h>
G_BEGIN_DECLS G_BEGIN_DECLS

View File

@@ -21,6 +21,8 @@
#error "Only <gdk/gdk.h> can be included directly." #error "Only <gdk/gdk.h> can be included directly."
#endif #endif
#include <gdk/gdkversionmacros.h>
#include <gdk/gdktypes.h> #include <gdk/gdktypes.h>
G_BEGIN_DECLS G_BEGIN_DECLS

View File

@@ -22,8 +22,10 @@
#error "Only <gdk/gdk.h> can be included directly." #error "Only <gdk/gdk.h> can be included directly."
#endif #endif
#include <gdk/gdkversionmacros.h>
#include <gdk/gdktypes.h> #include <gdk/gdktypes.h>
G_BEGIN_DECLS G_BEGIN_DECLS
#define GDK_TYPE_CONTENT_PROVIDER (gdk_content_provider_get_type ()) #define GDK_TYPE_CONTENT_PROVIDER (gdk_content_provider_get_type ())

View File

@@ -22,6 +22,7 @@
#error "Only <gdk/gdk.h> can be included directly." #error "Only <gdk/gdk.h> can be included directly."
#endif #endif
#include <gdk/gdkversionmacros.h>
#include <gdk/gdktypes.h> #include <gdk/gdktypes.h>
G_BEGIN_DECLS G_BEGIN_DECLS

View File

@@ -21,6 +21,8 @@
#error "Only <gdk/gdk.h> can be included directly." #error "Only <gdk/gdk.h> can be included directly."
#endif #endif
#include <gdk/gdkversionmacros.h>
#include <gdk/gdktypes.h> #include <gdk/gdktypes.h>
G_BEGIN_DECLS G_BEGIN_DECLS

View File

@@ -28,6 +28,7 @@
#error "Only <gdk/gdk.h> can be included directly." #error "Only <gdk/gdk.h> can be included directly."
#endif #endif
#include <gdk/gdkversionmacros.h>
#include <gdk/gdktypes.h> #include <gdk/gdktypes.h>
G_BEGIN_DECLS G_BEGIN_DECLS

View File

@@ -52,7 +52,6 @@ typedef enum {
GDK_DEBUG_VULKAN_VALIDATE = 1 << 23, GDK_DEBUG_VULKAN_VALIDATE = 1 << 23,
GDK_DEBUG_DEFAULT_SETTINGS= 1 << 24, GDK_DEBUG_DEFAULT_SETTINGS= 1 << 24,
GDK_DEBUG_HIGH_DEPTH = 1 << 25, GDK_DEBUG_HIGH_DEPTH = 1 << 25,
GDK_DEBUG_NO_VSYNC = 1 << 26,
} GdkDebugFlags; } GdkDebugFlags;
extern guint _gdk_debug_flags; extern guint _gdk_debug_flags;

View File

@@ -21,10 +21,12 @@
#error "Only <gdk/gdk.h> can be included directly." #error "Only <gdk/gdk.h> can be included directly."
#endif #endif
#include <gdk/gdkversionmacros.h>
#include <gdk/gdktypes.h> #include <gdk/gdktypes.h>
#include <gdk/gdkdevicetool.h> #include <gdk/gdkdevicetool.h>
#include <gdk/gdkenums.h> #include <gdk/gdkenums.h>
G_BEGIN_DECLS G_BEGIN_DECLS
#define GDK_TYPE_DEVICE (gdk_device_get_type ()) #define GDK_TYPE_DEVICE (gdk_device_get_type ())

View File

@@ -23,6 +23,7 @@
#error "Only <gdk/gdk.h> can be included directly." #error "Only <gdk/gdk.h> can be included directly."
#endif #endif
#include <gdk/gdkversionmacros.h>
#include <gdk/gdktypes.h> #include <gdk/gdktypes.h>
G_BEGIN_DECLS G_BEGIN_DECLS

View File

@@ -21,7 +21,10 @@
#error "Only <gdk/gdk.h> can be included directly." #error "Only <gdk/gdk.h> can be included directly."
#endif #endif
#include <gdk/gdkenums.h>
#include <gdk/gdktypes.h> #include <gdk/gdktypes.h>
#include <gdk/gdkversionmacros.h>
G_BEGIN_DECLS G_BEGIN_DECLS

View File

@@ -1,7 +1,7 @@
/* GDK - The GIMP Drawing Kit /* GDK - The GIMP Drawing Kit
* gdkdisplay.c * gdkdisplay.c
* *
* Copyright 2001 Sun Microsystems Inc. * Copyright 2001 Sun Microsystems Inc.
* *
* Erwann Chenede <erwann.chenede@sun.com> * Erwann Chenede <erwann.chenede@sun.com>
* *
@@ -31,11 +31,10 @@
#include "gdkclipboardprivate.h" #include "gdkclipboardprivate.h"
#include "gdkdeviceprivate.h" #include "gdkdeviceprivate.h"
#include "gdkdisplaymanagerprivate.h" #include "gdkdisplaymanagerprivate.h"
#include "gdkeventsprivate.h"
#include "gdkframeclockidleprivate.h" #include "gdkframeclockidleprivate.h"
#include "gdkeventsprivate.h"
#include "gdkglcontextprivate.h" #include "gdkglcontextprivate.h"
#include "gdkmonitorprivate.h" #include "gdkmonitorprivate.h"
#include "gdkrectangle.h"
#ifdef HAVE_EGL #ifdef HAVE_EGL
#include <epoxy/egl.h> #include <epoxy/egl.h>
@@ -176,7 +175,7 @@ gdk_display_default_rate_egl_config (GdkDisplay *display,
return distance; return distance;
} }
static GdkSeat * static GdkSeat *
gdk_display_real_get_default_seat (GdkDisplay *display) gdk_display_real_get_default_seat (GdkDisplay *display)
{ {
@@ -419,10 +418,10 @@ gdk_display_close (GdkDisplay *display)
if (!display->closed) if (!display->closed)
{ {
display->closed = TRUE; display->closed = TRUE;
g_signal_emit (display, signals[CLOSED], 0, FALSE); g_signal_emit (display, signals[CLOSED], 0, FALSE);
g_object_run_dispose (G_OBJECT (display)); g_object_run_dispose (G_OBJECT (display));
g_object_unref (display); g_object_unref (display);
} }
} }
@@ -809,7 +808,7 @@ _gdk_display_end_device_grab (GdkDisplay *display,
grab->implicit_ungrab = implicit; grab->implicit_ungrab = implicit;
return l->next == NULL; return l->next == NULL;
} }
return FALSE; return FALSE;
} }
@@ -1269,7 +1268,7 @@ gdk_display_init_gl (GdkDisplay *self)
* Note that even if this function succeeds, creating a `GdkGLContext` * Note that even if this function succeeds, creating a `GdkGLContext`
* may still fail. * may still fail.
* *
* This function is idempotent. Calling it multiple times will just * This function is idempotent. Calling it multiple times will just
* return the same value or error. * return the same value or error.
* *
* You never need to call this function, GDK will call it automatically * You never need to call this function, GDK will call it automatically

View File

@@ -25,6 +25,7 @@
#error "Only <gdk/gdk.h> can be included directly." #error "Only <gdk/gdk.h> can be included directly."
#endif #endif
#include <gdk/gdkversionmacros.h>
#include <gdk/gdktypes.h> #include <gdk/gdktypes.h>
#include <gdk/gdkevents.h> #include <gdk/gdkevents.h>
#include <gdk/gdkseat.h> #include <gdk/gdkseat.h>

View File

@@ -28,9 +28,10 @@
#error "Only <gdk/gdk.h> can be included directly." #error "Only <gdk/gdk.h> can be included directly."
#endif #endif
#include <gdk/gdktypes.h>
#include <gdk/gdkdevice.h> #include <gdk/gdkdevice.h>
#include <gdk/gdkenums.h>
#include <gdk/gdkevents.h> #include <gdk/gdkevents.h>
#include <gdk/gdktypes.h>
G_BEGIN_DECLS G_BEGIN_DECLS

View File

@@ -23,6 +23,7 @@
#endif #endif
#include <gdk/gdktypes.h> #include <gdk/gdktypes.h>
#include <gdk/gdkversionmacros.h>
G_BEGIN_DECLS G_BEGIN_DECLS

View File

@@ -24,6 +24,7 @@
#error "Only <gdk/gdk.h> can be included directly." #error "Only <gdk/gdk.h> can be included directly."
#endif #endif
#include <gdk/gdkversionmacros.h>
#include <gdk/gdktypes.h> #include <gdk/gdktypes.h>
G_BEGIN_DECLS G_BEGIN_DECLS

View File

@@ -24,7 +24,9 @@
#error "Only <gdk/gdk.h> can be included directly." #error "Only <gdk/gdk.h> can be included directly."
#endif #endif
#include <gdk/gdkenums.h>
#include <gdk/gdktypes.h> #include <gdk/gdktypes.h>
#include <gdk/gdkversionmacros.h>
G_BEGIN_DECLS G_BEGIN_DECLS

View File

@@ -345,3 +345,4 @@ typedef enum {
} GdkMemoryFormat; } GdkMemoryFormat;
G_END_DECLS G_END_DECLS

View File

@@ -28,10 +28,12 @@
#error "Only <gdk/gdk.h> can be included directly." #error "Only <gdk/gdk.h> can be included directly."
#endif #endif
#include <gdk/gdktypes.h>
#include <gdk/gdkdevice.h> #include <gdk/gdkdevice.h>
#include <gdk/gdkdevicetool.h> #include <gdk/gdkdevicetool.h>
#include <gdk/gdkdrag.h> #include <gdk/gdkdrag.h>
#include <gdk/gdkenums.h>
#include <gdk/gdktypes.h>
#include <gdk/gdkversionmacros.h>
G_BEGIN_DECLS G_BEGIN_DECLS

View File

@@ -79,7 +79,7 @@ static guint signals[LAST_SIGNAL];
static guint fps_counter; static guint fps_counter;
#define FRAME_HISTORY_MAX_LENGTH 128 #define FRAME_HISTORY_MAX_LENGTH 16
struct _GdkFrameClockPrivate struct _GdkFrameClockPrivate
{ {

View File

@@ -275,80 +275,58 @@ gdk_frame_clock_idle_get_frame_time (GdkFrameClock *clock)
return new_smoothed_time; return new_smoothed_time;
} }
static inline gboolean #define RUN_FLUSH_IDLE(priv) \
gdk_frame_clock_idle_is_frozen (GdkFrameClockIdle *self) ((priv)->freeze_count == 0 && \
{ ((priv)->requested & GDK_FRAME_CLOCK_PHASE_FLUSH_EVENTS) != 0)
GdkFrameClockIdlePrivate *priv = self->priv;
if (GDK_DEBUG_CHECK (NO_VSYNC))
return FALSE;
return priv->freeze_count > 0;
}
static inline gboolean
should_run_flush_idle (GdkFrameClockIdle *self)
{
GdkFrameClockIdlePrivate *priv = self->priv;
return !gdk_frame_clock_idle_is_frozen (self) &&
(priv->requested & GDK_FRAME_CLOCK_PHASE_FLUSH_EVENTS) != 0;
}
/* The reason why we track updating_count separately here and don't /* The reason why we track updating_count separately here and don't
* just add GDK_FRAME_CLOCK_PHASE_UPDATE into ->request on every frame * just add GDK_FRAME_CLOCK_PHASE_UPDATE into ->request on every frame
* is so that we can avoid doing one more frame when an animation * is so that we can avoid doing one more frame when an animation
* is cancelled. * is cancelled.
*/ */
static inline gboolean #define RUN_PAINT_IDLE(priv) \
should_run_paint_idle (GdkFrameClockIdle *self) ((priv)->freeze_count == 0 && \
{ (((priv)->requested & ~GDK_FRAME_CLOCK_PHASE_FLUSH_EVENTS) != 0 || \
GdkFrameClockIdlePrivate *priv = self->priv; (priv)->updating_count > 0))
return !gdk_frame_clock_idle_is_frozen (self) &&
((priv->requested & ~GDK_FRAME_CLOCK_PHASE_FLUSH_EVENTS) != 0 ||
priv->updating_count > 0);
}
static void static void
maybe_start_idle (GdkFrameClockIdle *self, maybe_start_idle (GdkFrameClockIdle *clock_idle,
gboolean caused_by_thaw) gboolean caused_by_thaw)
{ {
GdkFrameClockIdlePrivate *priv = self->priv; GdkFrameClockIdlePrivate *priv = clock_idle->priv;
if (should_run_flush_idle (self) || should_run_paint_idle (self)) if (RUN_FLUSH_IDLE (priv) || RUN_PAINT_IDLE (priv))
{ {
guint min_interval = 0; guint min_interval = 0;
if (priv->min_next_frame_time != 0 && if (priv->min_next_frame_time != 0)
!GDK_DEBUG_CHECK (NO_VSYNC))
{ {
gint64 now = g_get_monotonic_time (); gint64 now = g_get_monotonic_time ();
gint64 min_interval_us = MAX (priv->min_next_frame_time, now) - now; gint64 min_interval_us = MAX (priv->min_next_frame_time, now) - now;
min_interval = (min_interval_us + 500) / 1000; min_interval = (min_interval_us + 500) / 1000;
} }
if (priv->flush_idle_id == 0 && should_run_flush_idle (self)) if (priv->flush_idle_id == 0 && RUN_FLUSH_IDLE (priv))
{ {
GSource *source; GSource *source;
priv->flush_idle_id = g_timeout_add_full (GDK_PRIORITY_EVENTS + 1, priv->flush_idle_id = g_timeout_add_full (GDK_PRIORITY_EVENTS + 1,
min_interval, min_interval,
gdk_frame_clock_flush_idle, gdk_frame_clock_flush_idle,
g_object_ref (self), g_object_ref (clock_idle),
(GDestroyNotify) g_object_unref); (GDestroyNotify) g_object_unref);
source = g_main_context_find_source_by_id (NULL, priv->flush_idle_id); source = g_main_context_find_source_by_id (NULL, priv->flush_idle_id);
g_source_set_static_name (source, "[gtk] gdk_frame_clock_flush_idle"); g_source_set_static_name (source, "[gtk] gdk_frame_clock_flush_idle");
} }
if (!priv->in_paint_idle && if (!priv->in_paint_idle &&
priv->paint_idle_id == 0 && should_run_paint_idle (self)) priv->paint_idle_id == 0 && RUN_PAINT_IDLE (priv))
{ {
priv->paint_is_thaw = caused_by_thaw; priv->paint_is_thaw = caused_by_thaw;
priv->paint_idle_id = g_timeout_add_full (GDK_PRIORITY_REDRAW, priv->paint_idle_id = g_timeout_add_full (GDK_PRIORITY_REDRAW,
min_interval, min_interval,
gdk_frame_clock_paint_idle, gdk_frame_clock_paint_idle,
g_object_ref (self), g_object_ref (clock_idle),
(GDestroyNotify) g_object_unref); (GDestroyNotify) g_object_unref);
gdk_source_set_static_name_by_id (priv->paint_idle_id, "[gtk] gdk_frame_clock_paint_idle"); gdk_source_set_static_name_by_id (priv->paint_idle_id, "[gtk] gdk_frame_clock_paint_idle");
} }
@@ -356,17 +334,17 @@ maybe_start_idle (GdkFrameClockIdle *self,
} }
static void static void
maybe_stop_idle (GdkFrameClockIdle *self) maybe_stop_idle (GdkFrameClockIdle *clock_idle)
{ {
GdkFrameClockIdlePrivate *priv = self->priv; GdkFrameClockIdlePrivate *priv = clock_idle->priv;
if (priv->flush_idle_id != 0 && !should_run_flush_idle (self)) if (priv->flush_idle_id != 0 && !RUN_FLUSH_IDLE (priv))
{ {
g_source_remove (priv->flush_idle_id); g_source_remove (priv->flush_idle_id);
priv->flush_idle_id = 0; priv->flush_idle_id = 0;
} }
if (priv->paint_idle_id != 0 && !should_run_paint_idle (self)) if (priv->paint_idle_id != 0 && !RUN_PAINT_IDLE (priv))
{ {
g_source_remove (priv->paint_idle_id); g_source_remove (priv->paint_idle_id);
priv->paint_idle_id = 0; priv->paint_idle_id = 0;
@@ -454,7 +432,7 @@ gdk_frame_clock_paint_idle (void *data)
break; break;
case GDK_FRAME_CLOCK_PHASE_NONE: case GDK_FRAME_CLOCK_PHASE_NONE:
case GDK_FRAME_CLOCK_PHASE_BEFORE_PAINT: case GDK_FRAME_CLOCK_PHASE_BEFORE_PAINT:
if (!gdk_frame_clock_idle_is_frozen (clock_idle)) if (priv->freeze_count == 0)
{ {
gint64 frame_interval = FRAME_INTERVAL; gint64 frame_interval = FRAME_INTERVAL;
GdkFrameTimings *prev_timings = gdk_frame_clock_get_current_timings (clock); GdkFrameTimings *prev_timings = gdk_frame_clock_get_current_timings (clock);
@@ -570,7 +548,7 @@ gdk_frame_clock_paint_idle (void *data)
G_GNUC_FALLTHROUGH; G_GNUC_FALLTHROUGH;
case GDK_FRAME_CLOCK_PHASE_UPDATE: case GDK_FRAME_CLOCK_PHASE_UPDATE:
if (!gdk_frame_clock_idle_is_frozen (clock_idle)) if (priv->freeze_count == 0)
{ {
if ((priv->requested & GDK_FRAME_CLOCK_PHASE_UPDATE) != 0 || if ((priv->requested & GDK_FRAME_CLOCK_PHASE_UPDATE) != 0 ||
priv->updating_count > 0) priv->updating_count > 0)
@@ -582,7 +560,7 @@ gdk_frame_clock_paint_idle (void *data)
G_GNUC_FALLTHROUGH; G_GNUC_FALLTHROUGH;
case GDK_FRAME_CLOCK_PHASE_LAYOUT: case GDK_FRAME_CLOCK_PHASE_LAYOUT:
if (!gdk_frame_clock_idle_is_frozen (clock_idle)) if (priv->freeze_count == 0)
{ {
int iter; int iter;
#ifdef G_ENABLE_DEBUG #ifdef G_ENABLE_DEBUG
@@ -602,8 +580,7 @@ gdk_frame_clock_paint_idle (void *data)
*/ */
iter = 0; iter = 0;
while ((priv->requested & GDK_FRAME_CLOCK_PHASE_LAYOUT) && while ((priv->requested & GDK_FRAME_CLOCK_PHASE_LAYOUT) &&
!gdk_frame_clock_idle_is_frozen (clock_idle) && priv->freeze_count == 0 && iter++ < 4)
iter++ < 4)
{ {
priv->requested &= ~GDK_FRAME_CLOCK_PHASE_LAYOUT; priv->requested &= ~GDK_FRAME_CLOCK_PHASE_LAYOUT;
_gdk_frame_clock_emit_layout (clock); _gdk_frame_clock_emit_layout (clock);
@@ -614,7 +591,7 @@ gdk_frame_clock_paint_idle (void *data)
G_GNUC_FALLTHROUGH; G_GNUC_FALLTHROUGH;
case GDK_FRAME_CLOCK_PHASE_PAINT: case GDK_FRAME_CLOCK_PHASE_PAINT:
if (!gdk_frame_clock_idle_is_frozen (clock_idle)) if (priv->freeze_count == 0)
{ {
#ifdef G_ENABLE_DEBUG #ifdef G_ENABLE_DEBUG
if (GDK_DEBUG_CHECK (FRAMES)) if (GDK_DEBUG_CHECK (FRAMES))
@@ -635,7 +612,7 @@ gdk_frame_clock_paint_idle (void *data)
G_GNUC_FALLTHROUGH; G_GNUC_FALLTHROUGH;
case GDK_FRAME_CLOCK_PHASE_AFTER_PAINT: case GDK_FRAME_CLOCK_PHASE_AFTER_PAINT:
if (!gdk_frame_clock_idle_is_frozen (clock_idle)) if (priv->freeze_count == 0)
{ {
priv->requested &= ~GDK_FRAME_CLOCK_PHASE_AFTER_PAINT; priv->requested &= ~GDK_FRAME_CLOCK_PHASE_AFTER_PAINT;
_gdk_frame_clock_emit_after_paint (clock); _gdk_frame_clock_emit_after_paint (clock);
@@ -664,7 +641,7 @@ gdk_frame_clock_paint_idle (void *data)
_gdk_frame_clock_emit_resume_events (clock); _gdk_frame_clock_emit_resume_events (clock);
} }
if (!gdk_frame_clock_idle_is_frozen (clock_idle)) if (priv->freeze_count == 0)
priv->phase = GDK_FRAME_CLOCK_PHASE_NONE; priv->phase = GDK_FRAME_CLOCK_PHASE_NONE;
priv->in_paint_idle = FALSE; priv->in_paint_idle = FALSE;
@@ -673,7 +650,7 @@ gdk_frame_clock_paint_idle (void *data)
* update as soon as the backend unthrottles (if there is work to do), * update as soon as the backend unthrottles (if there is work to do),
* otherwise we need to figure when the next frame should be. * otherwise we need to figure when the next frame should be.
*/ */
if (!gdk_frame_clock_idle_is_frozen (clock_idle)) if (priv->freeze_count == 0)
{ {
/* /*
* If we don't receive "frame drawn" events, smooth_cycle_start will simply be advanced in constant increments of * If we don't receive "frame drawn" events, smooth_cycle_start will simply be advanced in constant increments of
@@ -691,7 +668,7 @@ gdk_frame_clock_paint_idle (void *data)
maybe_start_idle (clock_idle, FALSE); maybe_start_idle (clock_idle, FALSE);
} }
if (!gdk_frame_clock_idle_is_frozen (clock_idle)) if (priv->freeze_count == 0)
priv->sleep_serial = get_sleep_serial (); priv->sleep_serial = get_sleep_serial ();
gdk_profiler_end_mark (before, "frameclock cycle", NULL); gdk_profiler_end_mark (before, "frameclock cycle", NULL);
@@ -765,7 +742,7 @@ gdk_frame_clock_idle_freeze (GdkFrameClock *clock)
GdkFrameClockIdle *clock_idle = GDK_FRAME_CLOCK_IDLE (clock); GdkFrameClockIdle *clock_idle = GDK_FRAME_CLOCK_IDLE (clock);
GdkFrameClockIdlePrivate *priv = clock_idle->priv; GdkFrameClockIdlePrivate *priv = clock_idle->priv;
if (!gdk_frame_clock_idle_is_frozen (clock_idle)) if (priv->freeze_count == 0)
{ {
if (GDK_PROFILER_IS_RUNNING) if (GDK_PROFILER_IS_RUNNING)
priv->freeze_time = g_get_monotonic_time (); priv->freeze_time = g_get_monotonic_time ();
@@ -784,7 +761,7 @@ gdk_frame_clock_idle_thaw (GdkFrameClock *clock)
g_return_if_fail (priv->freeze_count > 0); g_return_if_fail (priv->freeze_count > 0);
priv->freeze_count--; priv->freeze_count--;
if (!gdk_frame_clock_idle_is_frozen (clock_idle)) if (priv->freeze_count == 0)
{ {
maybe_start_idle (clock_idle, TRUE); maybe_start_idle (clock_idle, TRUE);
/* If nothing is requested so we didn't start an idle, we need /* If nothing is requested so we didn't start an idle, we need
@@ -798,7 +775,7 @@ gdk_frame_clock_idle_thaw (GdkFrameClock *clock)
if (GDK_PROFILER_IS_RUNNING) if (GDK_PROFILER_IS_RUNNING)
{ {
if (gdk_frame_clock_idle_is_frozen (clock_idle)) if (priv->freeze_time != 0)
{ {
gdk_profiler_end_mark (priv->freeze_time * 1000, "frameclock frozen", NULL); gdk_profiler_end_mark (priv->freeze_time * 1000, "frameclock frozen", NULL);
priv->freeze_time = 0; priv->freeze_time = 0;

View File

@@ -21,7 +21,8 @@
#error "Only <gdk/gdk.h> can be included directly." #error "Only <gdk/gdk.h> can be included directly."
#endif #endif
#include <gdk/gdktypes.h> #include <glib-object.h>
#include <gdk/gdkversionmacros.h>
G_BEGIN_DECLS G_BEGIN_DECLS

View File

@@ -1,7 +1,7 @@
/* GDK - The GIMP Drawing Kit /* GDK - The GIMP Drawing Kit
* *
* gdkglcontext.h: GL context abstraction * gdkglcontext.h: GL context abstraction
* *
* Copyright © 2014 Emmanuele Bassi * Copyright © 2014 Emmanuele Bassi
* *
* This library is free software; you can redistribute it and/or * This library is free software; you can redistribute it and/or
@@ -24,7 +24,9 @@
#error "Only <gdk/gdk.h> can be included directly." #error "Only <gdk/gdk.h> can be included directly."
#endif #endif
#include <gdk/gdkenums.h>
#include <gdk/gdktypes.h> #include <gdk/gdktypes.h>
#include <gdk/gdkversionmacros.h>
G_BEGIN_DECLS G_BEGIN_DECLS

View File

@@ -338,7 +338,6 @@ gdk_gl_texture_new_from_builder (GdkGLTextureBuilder *builder,
gpointer data) gpointer data)
{ {
GdkGLTexture *self; GdkGLTexture *self;
GdkTexture *update_texture;
self = g_object_new (GDK_TYPE_GL_TEXTURE, self = g_object_new (GDK_TYPE_GL_TEXTURE,
"width", gdk_gl_texture_builder_get_width (builder), "width", gdk_gl_texture_builder_get_width (builder),
@@ -354,22 +353,6 @@ gdk_gl_texture_new_from_builder (GdkGLTextureBuilder *builder,
self->destroy = destroy; self->destroy = destroy;
self->data = data; self->data = data;
update_texture = gdk_gl_texture_builder_get_update_texture (builder);
if (update_texture)
{
cairo_region_t *update_region = gdk_gl_texture_builder_get_update_region (builder);
if (update_region)
{
update_region = cairo_region_copy (update_region);
cairo_region_intersect_rectangle (update_region,
&(cairo_rectangle_int_t) {
0, 0,
update_texture->width, update_texture->height
});
gdk_texture_set_diff (GDK_TEXTURE (self), update_texture, update_region);
}
}
return GDK_TEXTURE (self); return GDK_TEXTURE (self);
} }

View File

@@ -22,7 +22,6 @@
#error "Only <gdk/gdk.h> can be included directly." #error "Only <gdk/gdk.h> can be included directly."
#endif #endif
#include <gdk/gdktypes.h>
#include <gdk/gdkglcontext.h> #include <gdk/gdkglcontext.h>
#include <gdk/gdktexture.h> #include <gdk/gdktexture.h>

View File

@@ -25,8 +25,6 @@
#include "gdkglcontext.h" #include "gdkglcontext.h"
#include "gdkgltextureprivate.h" #include "gdkgltextureprivate.h"
#include <cairo-gobject.h>
struct _GdkGLTextureBuilder struct _GdkGLTextureBuilder
{ {
GObject parent_instance; GObject parent_instance;
@@ -38,9 +36,6 @@ struct _GdkGLTextureBuilder
GdkMemoryFormat format; GdkMemoryFormat format;
gboolean has_mipmap; gboolean has_mipmap;
gpointer sync; gpointer sync;
GdkTexture *update_texture;
cairo_region_t *update_region;
}; };
struct _GdkGLTextureBuilderClass struct _GdkGLTextureBuilderClass
@@ -75,8 +70,6 @@ enum
PROP_HEIGHT, PROP_HEIGHT,
PROP_ID, PROP_ID,
PROP_SYNC, PROP_SYNC,
PROP_UPDATE_REGION,
PROP_UPDATE_TEXTURE,
PROP_WIDTH, PROP_WIDTH,
N_PROPS N_PROPS
@@ -93,9 +86,6 @@ gdk_gl_texture_builder_dispose (GObject *object)
g_clear_object (&self->context); g_clear_object (&self->context);
g_clear_object (&self->update_texture);
g_clear_pointer (&self->update_region, cairo_region_destroy);
G_OBJECT_CLASS (gdk_gl_texture_builder_parent_class)->dispose (object); G_OBJECT_CLASS (gdk_gl_texture_builder_parent_class)->dispose (object);
} }
@@ -133,14 +123,6 @@ gdk_gl_texture_builder_get_property (GObject *object,
g_value_set_pointer (value, self->sync); g_value_set_pointer (value, self->sync);
break; break;
case PROP_UPDATE_REGION:
g_value_set_boxed (value, self->update_region);
break;
case PROP_UPDATE_TEXTURE:
g_value_set_object (value, self->update_texture);
break;
case PROP_WIDTH: case PROP_WIDTH:
g_value_set_int (value, self->width); g_value_set_int (value, self->width);
break; break;
@@ -185,14 +167,6 @@ gdk_gl_texture_builder_set_property (GObject *object,
gdk_gl_texture_builder_set_sync (self, g_value_get_pointer (value)); gdk_gl_texture_builder_set_sync (self, g_value_get_pointer (value));
break; break;
case PROP_UPDATE_REGION:
gdk_gl_texture_builder_set_update_region (self, g_value_get_boxed (value));
break;
case PROP_UPDATE_TEXTURE:
gdk_gl_texture_builder_set_update_texture (self, g_value_get_object (value));
break;
case PROP_WIDTH: case PROP_WIDTH:
gdk_gl_texture_builder_set_width (self, g_value_get_int (value)); gdk_gl_texture_builder_set_width (self, g_value_get_int (value));
break; break;
@@ -286,30 +260,6 @@ gdk_gl_texture_builder_class_init (GdkGLTextureBuilderClass *klass)
g_param_spec_pointer ("sync", NULL, NULL, g_param_spec_pointer ("sync", NULL, NULL,
G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS); G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS);
/**
* GdkGLTextureBuilder:update-region: (attributes org.gdk.Property.get=gdk_gl_texture_builder_get_update_region org.gdk.Property.set=gdk_gl_texture_builder_set_update_region)
*
* The update region for [property@Gdk.GLTextureBuilder:update-texture].
*
* Since: 4.12
*/
properties[PROP_UPDATE_REGION] =
g_param_spec_boxed ("update-region", NULL, NULL,
CAIRO_GOBJECT_TYPE_REGION,
G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS);
/**
* GdkGLTextureBuilder:update-texture: (attributes org.gdk.Property.get=gdk_gl_texture_builder_get_update_texture org.gdk.Property.set=gdk_gl_texture_builder_set_update_texture)
*
* The texture [property@Gdk.GLTextureBuilder:update-region] is an update for.
*
* Since: 4.12
*/
properties[PROP_UPDATE_TEXTURE] =
g_param_spec_object ("update-texture", NULL, NULL,
GDK_TYPE_TEXTURE,
G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS);
/** /**
* GdkGLTextureBuilder:width: (attributes org.gdk.Property.get=gdk_gl_texture_builder_get_width org.gdk.Property.set=gdk_gl_texture_builder_set_width) * GdkGLTextureBuilder:width: (attributes org.gdk.Property.get=gdk_gl_texture_builder_get_width org.gdk.Property.set=gdk_gl_texture_builder_set_width)
* *
@@ -321,7 +271,6 @@ gdk_gl_texture_builder_class_init (GdkGLTextureBuilderClass *klass)
g_param_spec_int ("width", NULL, NULL, g_param_spec_int ("width", NULL, NULL,
G_MININT, G_MAXINT, 0, G_MININT, G_MAXINT, 0,
G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS); G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS);
g_object_class_install_properties (gobject_class, N_PROPS, properties); g_object_class_install_properties (gobject_class, N_PROPS, properties);
} }
@@ -664,102 +613,6 @@ gdk_gl_texture_builder_set_format (GdkGLTextureBuilder *self,
g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_FORMAT]); g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_FORMAT]);
} }
/**
* gdk_gl_texture_builder_get_update_texture: (attributes org.gdk.Method.get_property=update_texture)
* @self: a `GdkGLTextureBuilder`
*
* Gets the texture previously set via gdk_gl_texture_builder_set_update_texture() or
* %NULL if none was set.
*
* Returns: (transfer none) (nullable): The texture
*
* Since: 4.12
*/
GdkTexture *
gdk_gl_texture_builder_get_update_texture (GdkGLTextureBuilder *self)
{
g_return_val_if_fail (GDK_IS_GL_TEXTURE_BUILDER (self), NULL);
return self->update_texture;
}
/**
* gdk_gl_texture_builder_set_update_texture: (attributes org.gdk.Method.set_property=update_texture)
* @self: a `GdkGLTextureBuilder`
* @texture: (nullable): the texture to update
*
* Sets the texture to be updated by this texture. See
* [method@Gdk.GLTextureBuilder.set_update_region] for an explanation.
*
* Since: 4.12
*/
void
gdk_gl_texture_builder_set_update_texture (GdkGLTextureBuilder *self,
GdkTexture *texture)
{
g_return_if_fail (GDK_IS_GL_TEXTURE_BUILDER (self));
g_return_if_fail (texture == NULL || GDK_IS_TEXTURE (texture));
if (!g_set_object (&self->update_texture, texture))
return;
g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_UPDATE_TEXTURE]);
}
/**
* gdk_gl_texture_builder_get_update_region: (attributes org.gdk.Method.get_property=update_region)
* @self: a `GdkGLTextureBuilder`
*
* Gets the region previously set via gdk_gl_texture_builder_set_update_region() or
* %NULL if none was set.
*
* Returns: (transfer none) (nullable): The region
*
* Since: 4.12
*/
cairo_region_t *
gdk_gl_texture_builder_get_update_region (GdkGLTextureBuilder *self)
{
g_return_val_if_fail (GDK_IS_GL_TEXTURE_BUILDER (self), NULL);
return self->update_region;
}
/**
* gdk_gl_texture_builder_set_update_region: (attributes org.gdk.Method.set_property=update_region)
* @self: a `GdkGLTextureBuilder`
* @region: (nullable): the region to update
*
* Sets the region to be updated by this texture. Together with
* [property@Gdk.GLTextureBuilder:update-texture] this describes an
* update of a previous texture.
*
* When rendering animations of large textures, it is possible that
* consecutive textures are only updating contents in parts of the texture.
* It is then possible to describe this update via these two properties,
* so that GTK can avoid rerendering parts that did not change.
*
* An example would be a screen recording where only the mouse pointer moves.
*
* Since: 4.12
*/
void
gdk_gl_texture_builder_set_update_region (GdkGLTextureBuilder *self,
cairo_region_t *region)
{
g_return_if_fail (GDK_IS_GL_TEXTURE_BUILDER (self));
if (self->update_region == region)
return;
g_clear_pointer (&self->update_region, cairo_region_destroy);
if (region)
self->update_region = cairo_region_reference (region);
g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_UPDATE_REGION]);
}
/** /**
* gdk_gl_texture_builder_build: * gdk_gl_texture_builder_build:
* @self: a `GdkGLTextureBuilder` * @self: a `GdkGLTextureBuilder`

View File

@@ -23,7 +23,9 @@
#error "Only <gdk/gdk.h> can be included directly." #error "Only <gdk/gdk.h> can be included directly."
#endif #endif
#include <gdk/gdkenums.h>
#include <gdk/gdktypes.h> #include <gdk/gdktypes.h>
#include <gdk/gdkversionmacros.h>
G_BEGIN_DECLS G_BEGIN_DECLS
@@ -76,18 +78,6 @@ GDK_AVAILABLE_IN_4_12
void gdk_gl_texture_builder_set_sync (GdkGLTextureBuilder *self, void gdk_gl_texture_builder_set_sync (GdkGLTextureBuilder *self,
gpointer sync); gpointer sync);
GDK_AVAILABLE_IN_4_12
GdkTexture * gdk_gl_texture_builder_get_update_texture (GdkGLTextureBuilder *self) G_GNUC_PURE;
GDK_AVAILABLE_IN_4_12
void gdk_gl_texture_builder_set_update_texture (GdkGLTextureBuilder *self,
GdkTexture *texture);
GDK_AVAILABLE_IN_4_12
cairo_region_t * gdk_gl_texture_builder_get_update_region (GdkGLTextureBuilder *self) G_GNUC_PURE;
GDK_AVAILABLE_IN_4_12
void gdk_gl_texture_builder_set_update_region (GdkGLTextureBuilder *self,
cairo_region_t *region);
GDK_AVAILABLE_IN_4_12 GDK_AVAILABLE_IN_4_12
GdkTexture * gdk_gl_texture_builder_build (GdkGLTextureBuilder *self, GdkTexture * gdk_gl_texture_builder_build (GdkGLTextureBuilder *self,
GDestroyNotify destroy, GDestroyNotify destroy,

View File

@@ -28,6 +28,7 @@
#error "Only <gdk/gdk.h> can be included directly." #error "Only <gdk/gdk.h> can be included directly."
#endif #endif
#include <gdk/gdkversionmacros.h>
#include <gdk/gdktypes.h> #include <gdk/gdktypes.h>
G_BEGIN_DECLS G_BEGIN_DECLS

View File

@@ -23,7 +23,7 @@
#error "Only <gdk/gdk.h> can be included directly." #error "Only <gdk/gdk.h> can be included directly."
#endif #endif
#include <gdk/gdktypes.h> #include <gdk/gdkenums.h>
#include <gdk/gdktexture.h> #include <gdk/gdktexture.h>
G_BEGIN_DECLS G_BEGIN_DECLS

View File

@@ -24,7 +24,6 @@
#include "gdkmonitorprivate.h" #include "gdkmonitorprivate.h"
#include "gdkdisplay.h" #include "gdkdisplay.h"
#include "gdkenumtypes.h" #include "gdkenumtypes.h"
#include "gdkrectangle.h"
/** /**
* GdkMonitor: * GdkMonitor:

View File

@@ -25,6 +25,8 @@
#error "Only <gdk/gdk.h> can be included directly." #error "Only <gdk/gdk.h> can be included directly."
#endif #endif
#include <gdk/gdkversionmacros.h>
#include <gdk/gdkrectangle.h>
#include <gdk/gdktypes.h> #include <gdk/gdktypes.h>
G_BEGIN_DECLS G_BEGIN_DECLS

View File

@@ -24,6 +24,7 @@
#endif #endif
#include <gdk/gdktypes.h> #include <gdk/gdktypes.h>
#include <gdk/gdkversionmacros.h>
G_BEGIN_DECLS G_BEGIN_DECLS

View File

@@ -1,5 +1,5 @@
/* GDK - The GIMP Drawing Kit /* GDK - The GIMP Drawing Kit
* Copyright (C) 2000 Red Hat, Inc. * Copyright (C) 2000 Red Hat, Inc.
* *
* This library is free software; you can redistribute it and/or * This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public * modify it under the terms of the GNU Lesser General Public
@@ -22,6 +22,7 @@
#endif #endif
#include <gdk/gdktypes.h> #include <gdk/gdktypes.h>
#include <gdk/gdkversionmacros.h>
G_BEGIN_DECLS G_BEGIN_DECLS

View File

@@ -18,11 +18,14 @@
#pragma once #pragma once
#include <gdk/gdktypes.h> #include <gdk/gdkversionmacros.h>
#include <gio/gio.h>
G_BEGIN_DECLS G_BEGIN_DECLS
GIOStream * gdk_pipe_io_stream_new (void); GIOStream * gdk_pipe_io_stream_new (void);
G_END_DECLS G_END_DECLS

View File

@@ -28,8 +28,12 @@
#error "Only <gdk/gdk.h> can be included directly." #error "Only <gdk/gdk.h> can be included directly."
#endif #endif
#include <gdk/gdktypes.h> #include <cairo.h>
#include <gdk-pixbuf/gdk-pixbuf.h> #include <gdk-pixbuf/gdk-pixbuf.h>
#include <gdk/gdktypes.h>
#include <gdk/gdkversionmacros.h>
#include <gdk/gdktexture.h>
G_BEGIN_DECLS G_BEGIN_DECLS

View File

@@ -20,7 +20,6 @@
#include "gdkpopuplayout.h" #include "gdkpopuplayout.h"
#include "gdkrectangle.h"
#include "gdksurface.h" #include "gdksurface.h"
/** /**

View File

@@ -22,7 +22,9 @@
#error "Only <gdk/gdk.h> can be included directly." #error "Only <gdk/gdk.h> can be included directly."
#endif #endif
#include <gdk/gdkenums.h>
#include <gdk/gdktypes.h> #include <gdk/gdktypes.h>
#include <gdk/gdkversionmacros.h>
G_BEGIN_DECLS G_BEGIN_DECLS

View File

@@ -29,7 +29,7 @@
#include <unistd.h> #include <unistd.h>
#endif #endif
#include "version/gdkversionmacros.h" #include "gdkversionmacros.h"
#include "gdkframeclockprivate.h" #include "gdkframeclockprivate.h"

View File

@@ -29,6 +29,7 @@
#endif #endif
#include <gdk/gdktypes.h> #include <gdk/gdktypes.h>
#include <gdk/gdkversionmacros.h>
G_BEGIN_DECLS G_BEGIN_DECLS

View File

@@ -29,6 +29,7 @@
#endif #endif
#include <gdk/gdktypes.h> #include <gdk/gdktypes.h>
#include <gdk/gdkversionmacros.h>
G_BEGIN_DECLS G_BEGIN_DECLS

View File

@@ -24,6 +24,7 @@
#endif #endif
#include <gdk/gdktypes.h> #include <gdk/gdktypes.h>
#include <gdk/gdkversionmacros.h>
G_BEGIN_DECLS G_BEGIN_DECLS

View File

@@ -1530,9 +1530,6 @@ gdk_surface_freeze_updates (GdkSurface *surface)
{ {
g_return_if_fail (GDK_IS_SURFACE (surface)); g_return_if_fail (GDK_IS_SURFACE (surface));
if (GDK_DEBUG_CHECK (NO_VSYNC))
return;
surface->update_freeze_count++; surface->update_freeze_count++;
if (surface->update_freeze_count == 1) if (surface->update_freeze_count == 1)
_gdk_frame_clock_uninhibit_freeze (surface->frame_clock); _gdk_frame_clock_uninhibit_freeze (surface->frame_clock);
@@ -1565,9 +1562,6 @@ gdk_surface_thaw_updates (GdkSurface *surface)
{ {
g_return_if_fail (GDK_IS_SURFACE (surface)); g_return_if_fail (GDK_IS_SURFACE (surface));
if (GDK_DEBUG_CHECK (NO_VSYNC))
return;
g_return_if_fail (surface->update_freeze_count > 0); g_return_if_fail (surface->update_freeze_count > 0);
if (--surface->update_freeze_count == 0) if (--surface->update_freeze_count == 0)

View File

@@ -28,6 +28,7 @@
#error "Only <gdk/gdk.h> can be included directly." #error "Only <gdk/gdk.h> can be included directly."
#endif #endif
#include <gdk/gdkversionmacros.h>
#include <gdk/gdktypes.h> #include <gdk/gdktypes.h>
#include <gdk/gdkevents.h> #include <gdk/gdkevents.h>
#include <gdk/gdkframeclock.h> #include <gdk/gdkframeclock.h>

View File

@@ -282,8 +282,6 @@ gdk_texture_dispose (GObject *object)
{ {
GdkTexture *self = GDK_TEXTURE (object); GdkTexture *self = GDK_TEXTURE (object);
g_clear_pointer (&self->diff_to_previous, cairo_region_destroy);
gdk_texture_clear_render_data (self); gdk_texture_clear_render_data (self);
G_OBJECT_CLASS (gdk_texture_parent_class)->dispose (object); G_OBJECT_CLASS (gdk_texture_parent_class)->dispose (object);
@@ -673,49 +671,7 @@ gdk_texture_do_download (GdkTexture *texture,
guchar *data, guchar *data,
gsize stride) gsize stride)
{ {
GDK_TEXTURE_GET_CLASS (texture)->download (texture, format, data, stride); GDK_TEXTURE_GET_CLASS (texture)->download (texture, format, data,stride);
}
void
gdk_texture_diff (GdkTexture *self,
GdkTexture *other,
cairo_region_t *region)
{
if (self == other)
return;
if (self->previous_texture == other &&
g_atomic_pointer_get (&other->next_texture) == self)
{
cairo_region_union (region, self->diff_to_previous);
}
else if (other->previous_texture == self &&
g_atomic_pointer_get (&self->next_texture) == other)
{
cairo_region_union (region, other->diff_to_previous);
}
else
{
cairo_region_union_rectangle (region,
&(cairo_rectangle_int_t) {
0,
0,
MAX (self->width, other->width),
MAX (self->height, other->height)
});
}
}
void
gdk_texture_set_diff (GdkTexture *self,
GdkTexture *previous,
cairo_region_t *diff)
{
g_assert (self->diff_to_previous == NULL);
self->previous_texture = previous;
self->diff_to_previous = diff;
g_atomic_pointer_set (&previous->next_texture, self);
} }
cairo_surface_t * cairo_surface_t *

View File

@@ -22,6 +22,8 @@
#error "Only <gdk/gdk.h> can be included directly." #error "Only <gdk/gdk.h> can be included directly."
#endif #endif
#include <gdk/gdkversionmacros.h>
#include <gdk/gdkenums.h>
#include <gdk/gdktypes.h> #include <gdk/gdktypes.h>
#include <gdk-pixbuf/gdk-pixbuf.h> #include <gdk-pixbuf/gdk-pixbuf.h>

View File

@@ -21,6 +21,9 @@
#error "Only <gdk/gdk.h> can be included directly." #error "Only <gdk/gdk.h> can be included directly."
#endif #endif
#include <gdk/gdkversionmacros.h>
#include <gdk/gdkenums.h>
#include <gdk/gdktypes.h> #include <gdk/gdktypes.h>
G_BEGIN_DECLS G_BEGIN_DECLS

View File

@@ -21,12 +21,6 @@ struct _GdkTexture
gpointer render_key; gpointer render_key;
gpointer render_data; gpointer render_data;
GDestroyNotify render_notify; GDestroyNotify render_notify;
/* for diffing swapchain-like textures.
* Links are only valid if both textures agree on them */
gpointer next_texture; /* atomic, no reference, may be invalid pointer */
gpointer previous_texture; /* no reference, may be invalid pointer */
cairo_region_t *diff_to_previous;
}; };
struct _GdkTextureClass { struct _GdkTextureClass {
@@ -48,14 +42,6 @@ void gdk_texture_do_download (GdkTexture
GdkMemoryFormat format, GdkMemoryFormat format,
guchar *data, guchar *data,
gsize stride); gsize stride);
void gdk_texture_diff (GdkTexture *self,
GdkTexture *other,
cairo_region_t *region);
void gdk_texture_set_diff (GdkTexture *self,
GdkTexture *previous,
cairo_region_t *diff);
gboolean gdk_texture_set_render_data (GdkTexture *self, gboolean gdk_texture_set_render_data (GdkTexture *self,
gpointer key, gpointer key,
gpointer data, gpointer data,

View File

@@ -22,8 +22,9 @@
#error "Only <gdk/gdk.h> can be included directly." #error "Only <gdk/gdk.h> can be included directly."
#endif #endif
#include <gdk/gdktypes.h>
#include <gdk/gdkmonitor.h> #include <gdk/gdkmonitor.h>
#include <gdk/gdktypes.h>
#include <gdk/gdkversionmacros.h>
G_BEGIN_DECLS G_BEGIN_DECLS

View File

@@ -23,6 +23,7 @@
#endif #endif
#include <gdk/gdktypes.h> #include <gdk/gdktypes.h>
#include <gdk/gdkversionmacros.h>
G_BEGIN_DECLS G_BEGIN_DECLS

View File

@@ -42,8 +42,6 @@
* (or GTK). One such setting is what windowing API backend is in use. * (or GTK). One such setting is what windowing API backend is in use.
*/ */
#include <gdk/gdkconfig.h> #include <gdk/gdkconfig.h>
#include <gdk/gdkenums.h>
#include <gdk/version/gdkversionmacros.h>
G_BEGIN_DECLS G_BEGIN_DECLS

324
gdk/gdkversionmacros.h.in Normal file
View File

@@ -0,0 +1,324 @@
/* gdkversionmacros.h - version boundaries checks
* Copyright (C) 2012 Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.▸ See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
*/
#if !defined (__GDK_H_INSIDE__) && !defined (__GTK_CSS_H_INSIDE__) && !defined (GTK_COMPILATION) && !defined (GTK_CSS_COMPILATION)
#error "Only <gdk/gdk.h> can be included directly."
#endif
#ifndef __GDK_VERSION_MACROS_H__
#define __GDK_VERSION_MACROS_H__
#include <glib.h>
/**
* GDK_MAJOR_VERSION:
*
* The major version component of the library's version, e.g. "1" for "1.2.3".
*/
#define GDK_MAJOR_VERSION (@GTK_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 (@GTK_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 (@GTK_MICRO_VERSION@)
#ifndef _GDK_EXTERN
#define _GDK_EXTERN extern
#endif
/**
* GDK_DISABLE_DEPRECATION_WARNINGS:
*
* A macro that should be defined before including the `gdk.h` header.
*
* If this symbol is defined, no compiler warnings will be produced for
* uses of deprecated GDK and GTK APIs.
*/
#ifdef GDK_DISABLE_DEPRECATION_WARNINGS
#define GDK_DEPRECATED _GDK_EXTERN
#define GDK_DEPRECATED_FOR(f) _GDK_EXTERN
#define GDK_UNAVAILABLE(maj,min) _GDK_EXTERN
#else
#define GDK_DEPRECATED G_DEPRECATED _GDK_EXTERN
#define GDK_DEPRECATED_FOR(f) G_DEPRECATED_FOR(f) _GDK_EXTERN
#define GDK_UNAVAILABLE(maj,min) G_UNAVAILABLE(maj,min) _GDK_EXTERN
#endif
/* XXX: Every new stable minor release bump should add a macro here */
/**
* GDK_VERSION_4_0:
*
* A macro that evaluates to the 4.0 version of GDK, in a format
* that can be used by the C pre-processor.
*/
#define GDK_VERSION_4_0 (G_ENCODE_VERSION (4, 0))
/**
* GDK_VERSION_4_2:
*
* A macro that evaluates to the 4.2 version of GDK, in a format
* that can be used by the C pre-processor.
*
* Since: 4.2
*/
#define GDK_VERSION_4_2 (G_ENCODE_VERSION (4, 2))
/**
* GDK_VERSION_4_4:
*
* A macro that evaluates to the 4.4 version of GDK, in a format
* that can be used by the C pre-processor.
*
* Since: 4.4
*/
#define GDK_VERSION_4_4 (G_ENCODE_VERSION (4, 4))
/**
* GDK_VERSION_4_6:
*
* A macro that evaluates to the 4.6 version of GDK, in a format
* that can be used by the C pre-processor.
*
* Since: 4.6
*/
#define GDK_VERSION_4_6 (G_ENCODE_VERSION (4, 6))
/**
* GDK_VERSION_4_8:
*
* A macro that evaluates to the 4.8 version of GDK, in a format
* that can be used by the C pre-processor.
*
* Since: 4.8
*/
#define GDK_VERSION_4_8 (G_ENCODE_VERSION (4, 8))
/**
* GDK_VERSION_4_10:
*
* A macro that evaluates to the 4.10 version of GDK, in a format
* that can be used by the C pre-processor.
*
* Since: 4.10
*/
#define GDK_VERSION_4_10 (G_ENCODE_VERSION (4, 10))
/**
* GDK_VERSION_4_12:
*
* A macro that evaluates to the 4.12 version of GDK, in a format
* that can be used by the C pre-processor.
*
* Since: 4.12
*/
#define GDK_VERSION_4_12 (G_ENCODE_VERSION (4, 12))
/* evaluates to the current stable version; for development cycles,
* this means the next stable target, with a hard backstop to the
* beginning of the stable series
*/
#if GDK_MAJOR_VERSION >= 4 && (GDK_MINOR_VERSION % 2)
# define GDK_VERSION_CUR_STABLE (G_ENCODE_VERSION (GDK_MAJOR_VERSION, GDK_MINOR_VERSION + 1))
#elif G_ENCODE_VERSION (GDK_MAJOR_VERSION, GDK_MINOR_VERSION) > GDK_VERSION_4_0
# define GDK_VERSION_CUR_STABLE (G_ENCODE_VERSION (GDK_MAJOR_VERSION, GDK_MINOR_VERSION))
#else
# define GDK_VERSION_CUR_STABLE GDK_VERSION_4_0
#endif
/* evaluates to the previous stable version, with a hard backstop
* to the beginning of the stable series
*/
#if GDK_MAJOR_VERSION >= 4 && (GDK_MINOR_VERSION % 2)
# define GDK_VERSION_PREV_STABLE (G_ENCODE_VERSION (GDK_MAJOR_VERSION, GDK_MINOR_VERSION - 1))
#elif GDK_MAJOR_VERSION >= 4 && GDK_MINOR_VERSION > 2
# define GDK_VERSION_PREV_STABLE (G_ENCODE_VERSION (GDK_MAJOR_VERSION, GDK_MINOR_VERSION - 2))
#else
# define GDK_VERSION_PREV_STABLE GDK_VERSION_4_0
#endif
/**
* GDK_VERSION_MIN_REQUIRED:
*
* A macro that should be defined by the user prior to including
* the `gdk.h` header.
*
* The definition should be one of the predefined GDK version
* macros: %GDK_VERSION_4_0, %GDK_VERSION_4_2,...
*
* This macro defines the lower bound for the GDK API to use.
*
* If a function has been deprecated in a newer version of GDK,
* it is possible to use this symbol to avoid the compiler warnings
* without disabling warning for every deprecated function.
*/
#ifndef GDK_VERSION_MIN_REQUIRED
# define GDK_VERSION_MIN_REQUIRED (GDK_VERSION_CUR_STABLE)
#endif
/**
* GDK_VERSION_MAX_ALLOWED:
*
* A macro that should be defined by the user prior to including
* the `gdk.h` header.
*
* The definition should be one of the predefined GDK version
* macros: %GDK_VERSION_4_0, %GDK_VERSION_4_2,...
*
* This macro defines the upper bound for the GDK API to use.
*
* If a function has been introduced in a newer version of GDK,
* it is possible to use this symbol to get compiler warnings when
* trying to use that function.
*/
#ifndef GDK_VERSION_MAX_ALLOWED
# if GDK_VERSION_MIN_REQUIRED > GDK_VERSION_PREV_STABLE
# define GDK_VERSION_MAX_ALLOWED GDK_VERSION_MIN_REQUIRED
# else
# define GDK_VERSION_MAX_ALLOWED GDK_VERSION_CUR_STABLE
# endif
#endif
/* sanity checks */
#if GDK_VERSION_MAX_ALLOWED < GDK_VERSION_MIN_REQUIRED
# error "GDK_VERSION_MAX_ALLOWED must be >= GDK_VERSION_MIN_REQUIRED"
#endif
#if GDK_VERSION_MIN_REQUIRED < GDK_VERSION_4_0
# error "GDK_VERSION_MIN_REQUIRED must be >= GDK_VERSION_4_0"
#endif
#define GDK_AVAILABLE_IN_ALL _GDK_EXTERN
/* XXX: Every new stable minor release should add a set of macros here */
/* This is not really necessary for 4.0, since there can't be an
* earlier version, and there are no deprecated symbols. We just
* include it for completeness, and because it's easier to copy
* this stanza every time a new development cycle starts.
*/
#if GDK_VERSION_MAX_ALLOWED < GDK_VERSION_4_0
# define GDK_AVAILABLE_IN_4_0 GDK_UNAVAILABLE(4, 0)
#else
# define GDK_AVAILABLE_IN_4_0 _GDK_EXTERN
#endif
#if GDK_VERSION_MIN_REQUIRED >= GDK_VERSION_4_0
# define GDK_DEPRECATED_IN_4_0 GDK_DEPRECATED
# define GDK_DEPRECATED_IN_4_0_FOR(f) GDK_DEPRECATED_FOR(f)
#else
# define GDK_DEPRECATED_IN_4_0 _GDK_EXTERN
# define GDK_DEPRECATED_IN_4_0_FOR(f) _GDK_EXTERN
#endif
#if GDK_VERSION_MAX_ALLOWED < GDK_VERSION_4_2
# define GDK_AVAILABLE_IN_4_2 GDK_UNAVAILABLE(4, 2)
#else
# define GDK_AVAILABLE_IN_4_2 _GDK_EXTERN
#endif
#if GDK_VERSION_MIN_REQUIRED >= GDK_VERSION_4_2
# define GDK_DEPRECATED_IN_4_2 GDK_DEPRECATED
# define GDK_DEPRECATED_IN_4_2_FOR(f) GDK_DEPRECATED_FOR(f)
#else
# define GDK_DEPRECATED_IN_4_2 _GDK_EXTERN
# define GDK_DEPRECATED_IN_4_2_FOR(f) _GDK_EXTERN
#endif
#if GDK_VERSION_MAX_ALLOWED < GDK_VERSION_4_4
# define GDK_AVAILABLE_IN_4_4 GDK_UNAVAILABLE(4, 4)
#else
# define GDK_AVAILABLE_IN_4_4 _GDK_EXTERN
#endif
#if GDK_VERSION_MIN_REQUIRED >= GDK_VERSION_4_4
# define GDK_DEPRECATED_IN_4_4 GDK_DEPRECATED
# define GDK_DEPRECATED_IN_4_4_FOR(f) GDK_DEPRECATED_FOR(f)
#else
# define GDK_DEPRECATED_IN_4_4 _GDK_EXTERN
# define GDK_DEPRECATED_IN_4_4_FOR(f) _GDK_EXTERN
#endif
#if GDK_VERSION_MAX_ALLOWED < GDK_VERSION_4_6
# define GDK_AVAILABLE_IN_4_6 GDK_UNAVAILABLE(4, 6)
#else
# define GDK_AVAILABLE_IN_4_6 _GDK_EXTERN
#endif
#if GDK_VERSION_MIN_REQUIRED >= GDK_VERSION_4_6
# define GDK_DEPRECATED_IN_4_6 GDK_DEPRECATED
# define GDK_DEPRECATED_IN_4_6_FOR(f) GDK_DEPRECATED_FOR(f)
#else
# define GDK_DEPRECATED_IN_4_6 _GDK_EXTERN
# define GDK_DEPRECATED_IN_4_6_FOR(f) _GDK_EXTERN
#endif
#if GDK_VERSION_MAX_ALLOWED < GDK_VERSION_4_8
# define GDK_AVAILABLE_IN_4_8 GDK_UNAVAILABLE(4, 8)
#else
# define GDK_AVAILABLE_IN_4_8 _GDK_EXTERN
#endif
#if GDK_VERSION_MIN_REQUIRED >= GDK_VERSION_4_8
# define GDK_DEPRECATED_IN_4_8 GDK_DEPRECATED
# define GDK_DEPRECATED_IN_4_8_FOR(f) GDK_DEPRECATED_FOR(f)
#else
# define GDK_DEPRECATED_IN_4_8 _GDK_EXTERN
# define GDK_DEPRECATED_IN_4_8_FOR(f) _GDK_EXTERN
#endif
#if GDK_VERSION_MAX_ALLOWED < GDK_VERSION_4_10
# define GDK_AVAILABLE_IN_4_10 GDK_UNAVAILABLE(4, 10)
#else
# define GDK_AVAILABLE_IN_4_10 _GDK_EXTERN
#endif
#if GDK_VERSION_MIN_REQUIRED >= GDK_VERSION_4_10
# define GDK_DEPRECATED_IN_4_10 GDK_DEPRECATED
# define GDK_DEPRECATED_IN_4_10_FOR(f) GDK_DEPRECATED_FOR(f)
#else
# define GDK_DEPRECATED_IN_4_10 _GDK_EXTERN
# define GDK_DEPRECATED_IN_4_10_FOR(f) _GDK_EXTERN
#endif
#if GDK_VERSION_MAX_ALLOWED < GDK_VERSION_4_12
# define GDK_AVAILABLE_IN_4_12 GDK_UNAVAILABLE(4, 12)
#else
# define GDK_AVAILABLE_IN_4_12 _GDK_EXTERN
#endif
#if GDK_VERSION_MIN_REQUIRED >= GDK_VERSION_4_12
# define GDK_DEPRECATED_IN_4_12 GDK_DEPRECATED
# define GDK_DEPRECATED_IN_4_12_FOR(f) GDK_DEPRECATED_FOR(f)
#else
# define GDK_DEPRECATED_IN_4_12 _GDK_EXTERN
# define GDK_DEPRECATED_IN_4_12_FOR(f) _GDK_EXTERN
#endif
#endif /* __GDK_VERSION_MACROS_H__ */

View File

@@ -24,6 +24,7 @@
#error "Only <gdk/gdk.h> can be included directly." #error "Only <gdk/gdk.h> can be included directly."
#endif #endif
#include <gdk/gdkversionmacros.h>
#include <gdk/gdktypes.h> #include <gdk/gdktypes.h>
#ifdef GDK_RENDERING_VULKAN #ifdef GDK_RENDERING_VULKAN

View File

@@ -146,7 +146,7 @@ gdk_enums = gnome.mkenums_simple('gdkenumtypes',
sources: gdk_public_headers, sources: gdk_public_headers,
decorator: 'GDK_AVAILABLE_IN_ALL', decorator: 'GDK_AVAILABLE_IN_ALL',
body_prefix: '#include "config.h"', body_prefix: '#include "config.h"',
header_prefix: '#include "version/gdkversionmacros.h"\n', header_prefix: '#include "gdkversionmacros.h"',
install_dir: gtk_includedir / 'gtk-4.0/gdk', install_dir: gtk_includedir / 'gtk-4.0/gdk',
install_header: true, install_header: true,
) )
@@ -183,6 +183,13 @@ gdkversion_cdata.set('GTK_MAJOR_VERSION', gtk_major_version)
gdkversion_cdata.set('GTK_MINOR_VERSION', gtk_minor_version) gdkversion_cdata.set('GTK_MINOR_VERSION', gtk_minor_version)
gdkversion_cdata.set('GTK_MICRO_VERSION', gtk_micro_version) gdkversion_cdata.set('GTK_MICRO_VERSION', gtk_micro_version)
gdkversionmacros = configure_file(
input: 'gdkversionmacros.h.in',
output: 'gdkversionmacros.h',
configuration: gdkversion_cdata,
install_dir: gtk_includedir / 'gtk-4.0/gdk',
)
gdkinc = include_directories('.') gdkinc = include_directories('.')
gdkx11_inc = include_directories('x11') gdkx11_inc = include_directories('x11')
gdkwayland_inc = include_directories('wayland') gdkwayland_inc = include_directories('wayland')
@@ -190,7 +197,7 @@ gdkwayland_inc = include_directories('wayland')
wlinc = include_directories('.') wlinc = include_directories('.')
win32rcinc = include_directories('win32/rc') win32rcinc = include_directories('win32/rc')
gdk_gen_headers = [gdkenum_h, gdkmarshal_h, gdkconfig, gdkversionmacros_h, gdk_visibility_h] gdk_gen_headers = [gdkenum_h, gdkmarshal_h, gdkconfig, gdkversionmacros]
gdk_deps = [ gdk_deps = [
libm, libm,
@@ -224,8 +231,7 @@ gdk_sources += [
gdk_enums, gdk_enums,
gdk_marshalers, gdk_marshalers,
gdkresources, gdkresources,
gdkversionmacros_h, gdkversionmacros,
gdk_visibility_h,
gdk_private_h_sources, gdk_private_h_sources,
gdk_public_headers gdk_public_headers
] ]

View File

@@ -1,146 +0,0 @@
/* gdkversionmacros.h - version boundaries checks
* Copyright (C) 2012 Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.▸ See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
*/
#if !defined (__GDK_H_INSIDE__) && !defined (__GTK_CSS_H_INSIDE__) && !defined (GTK_COMPILATION) && !defined (GTK_CSS_COMPILATION)
#error "Only <gdk/gdk.h> can be included directly."
#endif
#pragma once
#include <glib.h>
/* These macros are used to mark deprecated symbols in GLib headers,
* and thus have to be exposed in installed headers. But please
* do *not* use them in other projects. Instead define your own wrappers
* around it.
*/
#if !defined(GDK_DISABLE_DEPRECATION_WARNINGS) && \
(G_GNUC_CHECK_VERSION(4, 6) || \
__clang_major__ > 3 || (__clang_major__ == 3 && __clang_minor__ >= 4))
#define _GDK_GNUC_DO_PRAGMA(x) _Pragma(G_STRINGIFY (x))
#define GDK_DEPRECATED_MACRO _GDK_GNUC_DO_PRAGMA(GCC warning "Deprecated pre-processor symbol")
#define GDK_DEPRECATED_MACRO_FOR(f) \
_GDK_GNUC_DO_PRAGMA(GCC warning G_STRINGIFY (Deprecated pre-processor symbol: replace with #f))
#define GDK_UNAVAILABLE_MACRO(maj,min) \
_GDK_GNUC_DO_PRAGMA(GCC warning G_STRINGIFY (Not available before maj.min))
#else
#define GDK_DEPRECATED_MACRO
#define GDK_DEPRECATED_MACRO_FOR(f)
#define GDK_UNAVAILABLE_MACRO(maj,min)
#endif
#if !defined(GDK_DISABLE_DEPRECATION_WARNINGS) && \
(G_GNUC_CHECK_VERSION(6, 1) || \
(defined (__clang_major__) && (__clang_major__ > 3 || (__clang_major__ == 3 && __clang_minor__ >= 0))))
#define GDK_DEPRECATED_ENUMERATOR G_DEPRECATED
#define GDK_DEPRECATED_ENUMERATOR_FOR(f) G_DEPRECATED_FOR(f)
#define GDK_UNAVAILABLE_ENUMERATOR(maj,min) G_UNAVAILABLE(maj,min)
#else
#define GDK_DEPRECATED_ENUMERATOR
#define GDK_DEPRECATED_ENUMERATOR_FOR(f)
#define GDK_UNAVAILABLE_ENUMERATOR(maj,min)
#endif
#if !defined(GDK_DISABLE_DEPRECATION_WARNINGS) && \
(G_GNUC_CHECK_VERSION(3, 1) || \
(defined (__clang_major__) && (__clang_major__ > 3 || (__clang_major__ == 3 && __clang_minor__ >= 0))))
#define GDK_DEPRECATED_TYPE G_DEPRECATED
#define GDK_DEPRECATED_TYPE_FOR(f) G_DEPRECATED_FOR(f)
#define GDK_UNAVAILABLE_TYPE(maj,min) G_UNAVAILABLE(maj,min)
#else
#define GDK_DEPRECATED_TYPE
#define GDK_DEPRECATED_TYPE_FOR(f)
#define GDK_UNAVAILABLE_TYPE(maj,min)
#endif
@GDK_VERSIONS@
/* evaluates to the current stable version; for development cycles,
* this means the next stable target, with a hard backstop to the
* beginning of the stable series
*/
#if GDK_MAJOR_VERSION >= 4 && (GDK_MINOR_VERSION % 2)
# define GDK_VERSION_CUR_STABLE (G_ENCODE_VERSION (GDK_MAJOR_VERSION, GDK_MINOR_VERSION + 1))
#elif G_ENCODE_VERSION (GDK_MAJOR_VERSION, GDK_MINOR_VERSION) > GDK_VERSION_4_0
# define GDK_VERSION_CUR_STABLE (G_ENCODE_VERSION (GDK_MAJOR_VERSION, GDK_MINOR_VERSION))
#else
# define GDK_VERSION_CUR_STABLE GDK_VERSION_4_0
#endif
/* evaluates to the previous stable version, with a hard backstop
* to the beginning of the stable series
*/
#if GDK_MAJOR_VERSION >= 4 && (GDK_MINOR_VERSION % 2)
# define GDK_VERSION_PREV_STABLE (G_ENCODE_VERSION (GDK_MAJOR_VERSION, GDK_MINOR_VERSION - 1))
#elif GDK_MAJOR_VERSION >= 4 && GDK_MINOR_VERSION > 2
# define GDK_VERSION_PREV_STABLE (G_ENCODE_VERSION (GDK_MAJOR_VERSION, GDK_MINOR_VERSION - 2))
#else
# define GDK_VERSION_PREV_STABLE GDK_VERSION_4_0
#endif
/**
* GDK_VERSION_MIN_REQUIRED:
*
* A macro that should be defined by the user prior to including
* the `gdk.h` header.
*
* The definition should be one of the predefined GDK version
* macros: %GDK_VERSION_4_0, %GDK_VERSION_4_2,...
*
* This macro defines the lower bound for the GDK API to use.
*
* If a function has been deprecated in a newer version of GDK,
* it is possible to use this symbol to avoid the compiler warnings
* without disabling warning for every deprecated function.
*/
#ifndef GDK_VERSION_MIN_REQUIRED
# define GDK_VERSION_MIN_REQUIRED (GDK_VERSION_CUR_STABLE)
#endif
/**
* GDK_VERSION_MAX_ALLOWED:
*
* A macro that should be defined by the user prior to including
* the `gdk.h` header.
*
* The definition should be one of the predefined GDK version
* macros: %GDK_VERSION_4_0, %GDK_VERSION_4_2,...
*
* This macro defines the upper bound for the GDK API to use.
*
* If a function has been introduced in a newer version of GDK,
* it is possible to use this symbol to get compiler warnings when
* trying to use that function.
*/
#ifndef GDK_VERSION_MAX_ALLOWED
# if GDK_VERSION_MIN_REQUIRED > GDK_VERSION_PREV_STABLE
# define GDK_VERSION_MAX_ALLOWED GDK_VERSION_MIN_REQUIRED
# else
# define GDK_VERSION_MAX_ALLOWED GDK_VERSION_CUR_STABLE
# endif
#endif
/* sanity checks */
#if GDK_VERSION_MAX_ALLOWED < GDK_VERSION_MIN_REQUIRED
# error "GDK_VERSION_MAX_ALLOWED must be >= GDK_VERSION_MIN_REQUIRED"
#endif
#if GDK_VERSION_MIN_REQUIRED < GDK_VERSION_4_0
# error "GDK_VERSION_MIN_REQUIRED must be >= GDK_VERSION_4_0"
#endif
#include <gdk/version/gdk-visibility.h>

View File

@@ -1,21 +0,0 @@
gdkversionmacros_h = custom_target(
input: 'gdkversionmacros.h.in',
output: 'gdkversionmacros.h',
command: [gen_visibility_macros, meson.project_version(), 'versions-macros', '@INPUT@', '@OUTPUT@'],
install: true,
install_dir: gtk_includedir / 'gtk-4.0/gdk/version',
# FIXME: Not needed with Meson >= 0.64.0
install_tag: 'devel',
)
gdk_visibility_h = custom_target(
output: 'gdk-visibility.h',
command: [gen_visibility_macros, meson.project_version(), 'visibility-macros', 'GDK', '@OUTPUT@'],
install: true,
install_dir: gtk_includedir / 'gtk-4.0/gdk/version',
# FIXME: Not needed with Meson >= 0.64.0
install_tag: 'devel',
)

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