Compare commits

..

8 Commits

Author SHA1 Message Date
Matthias Clasen
abcf2e3bf7 node-editor: Don't use the ::query-tooltip signal
Use the vfunc, the signal is going away.
2020-05-09 23:24:59 -04:00
Matthias Clasen
a123d99fcd inspector: Don't use the ::query-tooltip signal
Use the vfunc, the signal is going away.
2020-05-09 22:49:55 -04:00
Matthias Clasen
4f760a9a2a volumebutton: Don't use the ::query-tooltip signal
Use the vfunc, the signal is going away.
2020-05-09 22:31:00 -04:00
Matthias Clasen
7e6be71d38 volumebutton: Enable the tooltips
Little point in having a query-tooltip handler if
we don't make sure ::query-tooltip is emitted.
2020-05-09 22:31:00 -04:00
Matthias Clasen
ed46982cc5 volumebutton: Remove broken a11y code
The accessible of a button is not an AtkImage,
so whatever this code was trying to do isn't
working. Remove it.
2020-05-09 22:30:59 -04:00
Matthias Clasen
e92270f928 iconview: Stop using the ::query-tooltip signal
Use the vfunc instead. The signal is going away.
2020-05-09 22:30:59 -04:00
Matthias Clasen
79a96b9bef treeview: Don't use the ::query-tooltip signal
Use the vfunc instead.
2020-05-09 22:30:59 -04:00
Matthias Clasen
ff55264e60 linkbutton: Don't use the ::query-tooltip signal
As a subclass, GtkLinkButton should override the
vfunc. The signal will be going away.
2020-05-09 22:30:59 -04:00
2437 changed files with 255498 additions and 381870 deletions

View File

@@ -16,13 +16,8 @@ stages:
# Common variables # Common variables
variables: variables:
COMMON_MESON_FLAGS: "--fatal-meson-warnings -Dgtk:werror=true" COMMON_MESON_FLAGS: "--fatal-meson-warnings --werror"
BACKEND_FLAGS: "-Dx11-backend=true -Dwayland-backend=true -Dbroadway-backend=true" MESON_TEST_TIMEOUT_MULTIPLIER: 2
FEATURE_FLAGS: "-Dvulkan=enabled -Dcloudproviders=enabled"
MESON_TEST_TIMEOUT_MULTIPLIER: 3
FEDORA_IMAGE: "registry.gitlab.gnome.org/gnome/gtk/fedora:v22"
FLATPAK_IMAGE: "registry.gitlab.gnome.org/gnome/gnome-runtime-images/gnome:master"
DOCS_IMAGE: "registry.gitlab.gnome.org/gnome/gtk/fedora-docs:v19"
.only-default: .only-default:
only: only:
@@ -32,91 +27,76 @@ variables:
style-check-diff: style-check-diff:
extends: .only-default extends: .only-default
image: $FEDORA_IMAGE image: registry.gitlab.gnome.org/gnome/gtk/fedora:v16
stage: .pre stage: .pre
allow_failure: true allow_failure: true
script: script:
- .gitlab-ci/run-style-check-diff.sh - .gitlab-ci/run-style-check-diff.sh
.build-fedora-default: fedora-x86_64:
image: $FEDORA_IMAGE image: registry.gitlab.gnome.org/gnome/gtk/fedora:v16
stage: build
variables:
EXTRA_MESON_FLAGS: "--buildtype=debug --default-library=both"
script:
- meson ${COMMON_MESON_FLAGS} ${EXTRA_MESON_FLAGS}
-Dx11-backend=true
-Dwayland-backend=true
-Dbroadway-backend=true
-Dvulkan=yes
-Dprofiler=true
_build
- ninja -C _build
- .gitlab-ci/run-tests.sh _build
artifacts: artifacts:
when: always when: always
reports: reports:
junit: junit:
- "${CI_PROJECT_DIR}/_build/report-x11.xml" - "${CI_PROJECT_DIR}/_build/report.xml"
- "${CI_PROJECT_DIR}/_build/report-wayland.xml"
- "${CI_PROJECT_DIR}/_build/report-broadway.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"
- "${CI_PROJECT_DIR}/_build/report*.xml" - "${CI_PROJECT_DIR}/_build/report.xml"
- "${CI_PROJECT_DIR}/_build/report*.html" - "${CI_PROJECT_DIR}/_build/report.html"
- "${CI_PROJECT_DIR}/_build/testsuite/reftests/output/*/*.png" - "${CI_PROJECT_DIR}/_build/testsuite/reftests/output/*.png"
- "${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"
cache: cache:
key: "$CI_JOB_NAME" key: "$CI_JOB_NAME"
paths: <<: *cache-paths
- _ccache/
- subprojects/gdk-pixbuf/
- subprojects/glib/
- subprojects/graphene/
- subprojects/libepoxy/
- subprojects/pango/
fedora-x86_64:
extends: .build-fedora-default
stage: build
needs: []
variables:
EXTRA_MESON_FLAGS: "--buildtype=debug --default-library=both"
script:
- meson subprojects update
- meson ${COMMON_MESON_FLAGS} ${EXTRA_MESON_FLAGS} ${BACKEND_FLAGS} ${FEATURE_FLAGS}
-Dsysprof=enabled
_build
- ninja -C _build
- .gitlab-ci/run-tests.sh _build x11
- .gitlab-ci/run-tests.sh _build wayland
- .gitlab-ci/run-tests.sh _build broadway
release-build: release-build:
extends: .build-fedora-default image: registry.gitlab.gnome.org/gnome/gtk/fedora:v16
stage: build stage: build
needs: []
variables: variables:
EXTRA_MESON_FLAGS: "--buildtype=release" EXTRA_MESON_FLAGS: "--buildtype=release"
script: script:
- meson subprojects update - meson ${COMMON_MESON_FLAGS} ${EXTRA_MESON_FLAGS}
- meson ${COMMON_MESON_FLAGS} ${EXTRA_MESON_FLAGS} ${BACKEND_FLAGS} ${FEATURE_FLAGS} -Dx11-backend=true
-Dwayland-backend=true
-Dbroadway-backend=true
-Dvulkan=yes
_build _build
- ninja -C _build - ninja -C _build
- .gitlab-ci/run-tests.sh _build x11 - .gitlab-ci/run-tests.sh _build
installed-tests:
extends: .build-fedora-default
stage: build
needs: []
variables:
EXTRA_MESON_FLAGS: "--prefix=/usr --libdir=/usr/lib64 -Dinstall-tests=true"
script:
- meson subprojects update
- meson ${COMMON_MESON_FLAGS} ${EXTRA_MESON_FLAGS} ${BACKEND_FLAGS} ${FEATURE_FLAGS}
_build
- ninja -C _build
- sudo ninja -C _build install
- dbus-run-session xvfb-run -a -s "-screen 0 1024x768x24"
gnome-desktop-testing-runner
--report-directory=_build/installed-tests-report/failed/
--parallel=0
gtk-4.0
artifacts: artifacts:
when: always
reports:
junit:
- "${CI_PROJECT_DIR}/_build/report.xml"
name: "gtk-${CI_COMMIT_REF_NAME}"
paths: paths:
- "_build/installed-tests-report/" - "${CI_PROJECT_DIR}/_build/meson-logs"
- "${CI_PROJECT_DIR}/_build/report.xml"
- "${CI_PROJECT_DIR}/_build/report.html"
- "${CI_PROJECT_DIR}/_build/testsuite/reftests/output/*.png"
- "${CI_PROJECT_DIR}/_build/testsuite/gsk/compare/*/*.png"
- "${CI_PROJECT_DIR}/_build/testsuite/css/output/*.syscap"
cache:
key: "$CI_JOB_NAME"
<<: *cache-paths
.mingw-defaults: &mingw-defaults
.mingw-defaults:
stage: build stage: build
tags: tags:
- win32-ps - win32-ps
@@ -125,23 +105,16 @@ installed-tests:
- C:\msys64\usr\bin\bash -lc "bash -x ./.gitlab-ci/test-msys2.sh" - C:\msys64\usr\bin\bash -lc "bash -x ./.gitlab-ci/test-msys2.sh"
cache: cache:
key: "$CI_JOB_NAME" key: "$CI_JOB_NAME"
paths: <<: *cache-paths
- _ccache/
- subprojects/gdk-pixbuf/
- subprojects/glib/
- subprojects/graphene/
- subprojects/libepoxy/
- subprojects/pango/
msys2-mingw64: msys2-mingw32:
extends: .mingw-defaults
needs: []
variables: variables:
MSYSTEM: "MINGW64" MSYSTEM: "MINGW32"
CHERE_INVOKING: "yes" CHERE_INVOKING: "yes"
<<: *mingw-defaults
.flatpak-defaults: .flatpak-defaults: &flatpak-defaults
image: $FLATPAK_IMAGE image: registry.gitlab.gnome.org/gnome/gnome-runtime-images/gnome:master
stage: flatpak stage: flatpak
allow_failure: true allow_failure: true
tags: tags:
@@ -154,56 +127,49 @@ msys2-mingw64:
- bash -x ./.gitlab-ci/flatpak-build.sh "${APPID}" - bash -x ./.gitlab-ci/flatpak-build.sh "${APPID}"
# Manual jobs, for branches and MRs # Manual jobs, for branches and MRs
.flatpak-manual: .flatpak-manual: &flatpak-manual
extends: .flatpak-defaults <<: *flatpak-defaults
when: manual when: manual
# Only build Flatpak bundles automatically on master # Only build Flatpak bundles automatically on master
.flatpak-master: .flatpak-master: &flatpak-master
extends: .flatpak-defaults <<: *flatpak-defaults
only: only:
- master - master
flatpak-manual:demo: flatpak-manual:demo:
extends: .flatpak-manual
needs: []
variables: variables:
APPID: org.gtk.Demo4 APPID: org.gtk.Demo4
<<: *flatpak-manual
flatpak-master:demo: flatpak-master:demo:
extends: .flatpak-master
needs: []
variables: variables:
APPID: org.gtk.Demo4 APPID: org.gtk.Demo4
<<: *flatpak-master
flatpak-manual:widget-factory: flatpak-manual:widget-factory:
extends: .flatpak-manual
needs: []
variables: variables:
APPID: org.gtk.WidgetFactory4 APPID: org.gtk.WidgetFactory4
<<: *flatpak-manual
flatpak-master:widget-factory: flatpak-master:widget-factory:
extends: .flatpak-master
needs: []
variables: variables:
APPID: org.gtk.WidgetFactory4 APPID: org.gtk.WidgetFactory4
<<: *flatpak-master
flatpak-manual:icon-browser: flatpak-manual:icon-browser:
extends: .flatpak-manual
needs: []
variables: variables:
APPID: org.gtk.IconBrowser4 APPID: org.gtk.IconBrowser4
<<: *flatpak-manual
flatpak-master:icon-browser: flatpak-master:icon-browser:
extends: .flatpak-master
needs: []
variables: variables:
APPID: org.gtk.IconBrowser4 APPID: org.gtk.IconBrowser4
<<: *flatpak-master
static-scan: static-scan:
image: $FEDORA_IMAGE image: registry.gitlab.gnome.org/gnome/gtk/fedora:v16
stage: analysis stage: analysis
needs: []
variables: variables:
EXTRA_MESON_FLAGS: "--buildtype=debug" EXTRA_MESON_FLAGS: "--buildtype=debug"
script: script:
@@ -214,27 +180,9 @@ static-scan:
- _scan_build/meson-logs - _scan_build/meson-logs
allow_failure: true allow_failure: true
# Run tests with the address sanitizer. We need to turn off introspection,
# since it is incompatible with asan
asan-build:
image: $FEDORA_IMAGE
tags: [ asan ]
stage: analysis
needs: []
variables:
script:
- CC=clang meson --buildtype=debugoptimized -Db_sanitize=address -Db_lundef=false -Dintrospection=false _build
- ninja -C _build
- .gitlab-ci/run-tests.sh _build wayland
artifacts:
paths:
- _build/meson-logs
allow_failure: true
reference: reference:
image: $DOCS_IMAGE image: registry.gitlab.gnome.org/gnome/gtk/fedora:v16
stage: docs stage: docs
needs: []
variables: variables:
EXTRA_MESON_FLAGS: "--buildtype=release" EXTRA_MESON_FLAGS: "--buildtype=release"
script: script:
@@ -250,7 +198,6 @@ reference:
pages: pages:
stage: deploy stage: deploy
needs: ['reference']
script: script:
- mv _reference/ public/ - mv _reference/ public/
artifacts: artifacts:

View File

View File

@@ -35,13 +35,4 @@ branch, as well as their available versions.
- [ ] Add the new job to `.gitlab-ci.yml` referencing the image - [ ] Add the new job to `.gitlab-ci.yml` referencing the image
- [ ] Open a merge request with your changes and let it run - [ ] Open a merge request with your changes and let it run
### Checklist for Adding a new dependency to a CI image
Our images are layered, and the base (called fedora-base) contains
all the rpm payload. Therefore, adding a new dependency is a 2-step
process:
1. [ ] Build and upload fedora-base:$version+1
1. [ ] Build and upload fedora:$version+1 based on fedora-base:version+1
[registry]: https://gitlab.gnome.org/GNOME/gtk/container_registry [registry]: https://gitlab.gnome.org/GNOME/gtk/container_registry

View File

@@ -1,90 +0,0 @@
FROM fedora:31
RUN dnf -y install \
adwaita-icon-theme \
atk-devel \
at-spi2-atk-devel \
avahi-gobject-devel \
cairo-devel \
cairo-gobject-devel \
ccache \
clang \
clang-analyzer \
colord-devel \
cups-devel \
dbus-daemon \
dbus-x11 \
dejavu-sans-mono-fonts \
desktop-file-utils \
diffutils \
elfutils-libelf-devel \
fribidi-devel \
gcc \
gcc-c++ \
gdk-pixbuf2-devel \
gdk-pixbuf2-modules \
gettext \
git \
glib2-devel \
glib2-static \
glibc-devel \
glibc-headers \
gnome-desktop-testing \
gobject-introspection-devel \
graphene-devel \
gstreamer1-devel \
gstreamer1-plugins-good \
gstreamer1-plugins-bad-free-devel \
gstreamer1-plugins-base-devel \
gtk-doc \
hicolor-icon-theme \
iso-codes \
itstool \
json-glib-devel \
lcov \
libasan \
libattr-devel \
libepoxy-devel \
libffi-devel \
libmount-devel \
librsvg2 \
libselinux-devel \
libubsan \
libXcomposite-devel \
libXcursor-devel \
libXcursor-devel \
libXdamage-devel \
libXfixes-devel \
libXi-devel \
libXinerama-devel \
libxkbcommon-devel \
libXrandr-devel \
libXrender-devel \
libXtst-devel \
libxslt \
mesa-dri-drivers \
mesa-libEGL-devel \
mesa-libwayland-egl-devel \
ninja-build \
pango-devel \
pcre-devel \
pcre-static \
python3 \
python3-jinja2 \
python3-pip \
python3-pygments \
python3-wheel \
redhat-rpm-config \
sassc \
systemtap-sdt-devel \
vulkan-devel \
wayland-devel \
wayland-protocols-devel \
weston \
weston-libs \
which \
xorg-x11-server-Xvfb \
&& dnf clean all
RUN pip3 install meson==0.53.1

View File

@@ -1,12 +0,0 @@
FROM registry.gitlab.gnome.org/gnome/gtk/fedora-base:v19
RUN dnf -y install pandoc
ARG HOST_USER_ID=5555
ENV HOST_USER_ID ${HOST_USER_ID}
RUN useradd -u $HOST_USER_ID -ms /bin/bash user
USER user
WORKDIR /home/user
ENV LANG C.UTF-8

View File

@@ -1,11 +1,92 @@
FROM registry.gitlab.gnome.org/gnome/gtk/fedora-base:v21 FROM fedora:31
# Enable sudo for wheel users RUN dnf -y install \
RUN sed -i -e 's/# %wheel/%wheel/' -e '0,/%wheel/{s/%wheel/# %wheel/}' /etc/sudoers adwaita-icon-theme \
atk-devel \
at-spi2-atk-devel \
avahi-gobject-devel \
cairo-devel \
cairo-gobject-devel \
ccache \
clang \
clang-analyzer \
colord-devel \
cups-devel \
dbus-daemon \
dbus-x11 \
dejavu-sans-mono-fonts \
desktop-file-utils \
diffutils \
elfutils-libelf-devel \
fribidi-devel \
gcc \
gcc-c++ \
gdk-pixbuf2-devel \
gdk-pixbuf2-modules \
gettext \
git \
glib2-devel \
glib2-static \
glibc-devel \
glibc-headers \
gobject-introspection-devel \
graphene-devel \
gstreamer1-devel \
gstreamer1-plugins-good \
gstreamer1-plugins-bad-free-devel \
gstreamer1-plugins-base-devel \
gtk-doc \
hicolor-icon-theme \
iso-codes \
itstool \
json-glib-devel \
lcov \
libattr-devel \
libepoxy-devel \
libffi-devel \
libmount-devel \
librsvg2 \
libselinux-devel \
libXcomposite-devel \
libXcursor-devel \
libXcursor-devel \
libXdamage-devel \
libXfixes-devel \
libXi-devel \
libXinerama-devel \
libxkbcommon-devel \
libXrandr-devel \
libXrender-devel \
libXtst-devel \
libxslt \
mesa-dri-drivers \
mesa-libEGL-devel \
mesa-libwayland-egl-devel \
ninja-build \
pango-devel \
pcre-devel \
pcre-static \
python3 \
python3-jinja2 \
python3-pip \
python3-pygments \
python3-wheel \
redhat-rpm-config \
sassc \
sysprof-devel \
systemtap-sdt-devel \
vulkan-devel \
wayland-devel \
wayland-protocols-devel \
which \
xorg-x11-server-Xvfb \
&& dnf clean all
RUN pip3 install meson==0.53.1
ARG HOST_USER_ID=5555 ARG HOST_USER_ID=5555
ENV HOST_USER_ID ${HOST_USER_ID} ENV HOST_USER_ID ${HOST_USER_ID}
RUN useradd -u $HOST_USER_ID -G wheel -ms /bin/bash user RUN useradd -u $HOST_USER_ID -ms /bin/bash user
USER user USER user
WORKDIR /home/user WORKDIR /home/user

View File

@@ -138,13 +138,12 @@ ul.images li {
</head> </head>
<body> <body>
<header> <header>
<h1>{{ report.project_name }}/{{ report.backend }}/{{ report.branch_name }} :: Test Reports</h1> <h1>{{ report.project_name }}/{{ report.branch_name }} :: Test Reports</h1>
</header> </header>
<article> <article>
<section> <section>
<div class="report-meta"> <div class="report-meta">
<p><strong>Backend:</strong> {{ report.backend }}</p>
<p><strong>Branch:</strong> {{ report.branch_name }}</p> <p><strong>Branch:</strong> {{ report.branch_name }}</p>
<p><strong>Date:</strong> <time datetime="{{ report.date.isoformat() }}">{{ report.locale_date }}</time></p> <p><strong>Date:</strong> <time datetime="{{ report.date.isoformat() }}">{{ report.locale_date }}</time></p>
{% if report.job_id %}<p><strong>Job ID:</strong> {{ report.job_id }}</p>{% endif %} {% if report.job_id %}<p><strong>Job ID:</strong> {{ report.job_id }}</p>{% endif %}
@@ -260,9 +259,6 @@ aparser = argparse.ArgumentParser(description='Turns a Meson test log into an HT
aparser.add_argument('--project-name', metavar='NAME', aparser.add_argument('--project-name', metavar='NAME',
help='The project name', help='The project name',
default='Unknown') default='Unknown')
aparser.add_argument('--backend', metavar='NAME',
help='The used backend',
default='unknown')
aparser.add_argument('--job-id', metavar='ID', aparser.add_argument('--job-id', metavar='ID',
help='The job ID for the report', help='The job ID for the report',
default=None) default=None)
@@ -323,7 +319,6 @@ report = {}
report['date'] = datetime.datetime.utcnow() report['date'] = datetime.datetime.utcnow()
report['locale_date'] = report['date'].strftime("%c") report['locale_date'] = report['date'].strftime("%c")
report['project_name'] = args.project_name report['project_name'] = args.project_name
report['backend'] = args.backend
report['job_id'] = args.job_id report['job_id'] = args.job_id
report['branch_name'] = args.branch report['branch_name'] = args.branch
report['total_successes'] = 0 report['total_successes'] = 0

View File

@@ -19,9 +19,6 @@ aparser = argparse.ArgumentParser(description='Turns a Meson test log into a JUn
aparser.add_argument('--project-name', metavar='NAME', aparser.add_argument('--project-name', metavar='NAME',
help='The project name', help='The project name',
default='unknown') default='unknown')
aparser.add_argument('--backend', metavar='NAME',
help='The used backend',
default='unknown')
aparser.add_argument('--job-id', metavar='ID', aparser.add_argument('--job-id', metavar='ID',
help='The job ID for the report', help='The job ID for the report',
default='Unknown') default='Unknown')
@@ -95,18 +92,18 @@ for name, units in suites.items():
for unit in successes: for unit in successes:
testcase = ET.SubElement(testsuite, 'testcase') testcase = ET.SubElement(testsuite, 'testcase')
testcase.set('classname', '{}/{}'.format(args.project_name, unit['suite'])) testcase.set('classname', '{}/{}'.format(args.project_name, unit['suite']))
testcase.set('name', '{}/{}'.format(args.backend, unit['name'])) testcase.set('name', unit['name'])
testcase.set('time', str(unit['duration'])) testcase.set('time', str(unit['duration']))
for unit in failures: for unit in failures:
testcase = ET.SubElement(testsuite, 'testcase') testcase = ET.SubElement(testsuite, 'testcase')
testcase.set('classname', '{}/{}'.format(args.project_name, unit['suite'])) testcase.set('classname', '{}/{}'.format(args.project_name, unit['suite']))
testcase.set('name', '{}/{}'.format(args.backend, unit['name'])) testcase.set('name', unit['name'])
testcase.set('time', str(unit['duration'])) testcase.set('time', str(unit['duration']))
failure = ET.SubElement(testcase, 'failure') failure = ET.SubElement(testcase, 'failure')
failure.set('classname', '{}/{}'.format(args.project_name, unit['suite'])) failure.set('classname', '{}/{}'.format(args.project_name, unit['suite']))
testcase.set('name', '{}/{}'.format(args.backend, unit['name'])) failure.set('name', unit['name'])
failure.set('type', 'error') failure.set('type', 'error')
failure.text = unit['stdout'] failure.text = unit['stdout']

View File

@@ -81,7 +81,7 @@ fi
if [ -z $base_version ]; then if [ -z $base_version ]; then
base_version="latest" base_version="latest"
elif [ $base_version != "latest" ]; then else
base_version="v$base_version" base_version="v$base_version"
fi fi
@@ -95,7 +95,7 @@ if [ ! -x "$(command -v docker)" ] || [ docker --help |& grep -q podman ]; then
else else
echo "Using: Docker" echo "Using: Docker"
format="" format=""
CMD="sudo docker" CMD="sudo socker"
fi fi
REGISTRY="registry.gitlab.gnome.org" REGISTRY="registry.gitlab.gnome.org"

View File

@@ -4,15 +4,8 @@ set -e
# We need to add a new remote for the upstream master, since this script could # We need to add a new remote for the upstream master, since this script could
# be running in a personal fork of the repository which has out of date branches. # be running in a personal fork of the repository which has out of date branches.
if [ "${CI_PROJECT_NAMESPACE}" != "GNOME" ]; then git remote add upstream https://gitlab.gnome.org/GNOME/gtk.git
echo "Retrieving the current upstream repository from ${CI_PROJECT_NAMESPACE}/${CI_PROJECT_NAME}..." git fetch upstream
git remote add upstream https://gitlab.gnome.org/GNOME/gtk.git
git fetch upstream
ORIGIN="upstream"
else
echo "Reusing the existing repository on ${CI_PROJECT_NAMESPACE}/${CI_PROJECT_NAME}"
ORIGIN="origin"
fi
# Work out the newest common ancestor between the detached HEAD that this CI job # Work out the newest common ancestor between the detached HEAD that this CI job
# has checked out, and the upstream target branch (which will typically be # has checked out, and the upstream target branch (which will typically be
@@ -20,7 +13,7 @@ fi
# #
# `${CI_MERGE_REQUEST_TARGET_BRANCH_NAME}` is only defined if were running in # `${CI_MERGE_REQUEST_TARGET_BRANCH_NAME}` is only defined if were running in
# a merge request pipeline; fall back to `${CI_DEFAULT_BRANCH}` otherwise. # a merge request pipeline; fall back to `${CI_DEFAULT_BRANCH}` otherwise.
newest_common_ancestor_sha=$(diff --old-line-format='' --new-line-format='' <(git rev-list --first-parent "${ORIGIN}/${CI_MERGE_REQUEST_TARGET_BRANCH_NAME:-${CI_DEFAULT_BRANCH}}") <(git rev-list --first-parent HEAD) | head -1) newest_common_ancestor_sha=$(diff --old-line-format='' --new-line-format='' <(git rev-list --first-parent "upstream/${CI_MERGE_REQUEST_TARGET_BRANCH_NAME:-${CI_DEFAULT_BRANCH}}") <(git rev-list --first-parent HEAD) | head -1)
git diff -U0 --no-color "${newest_common_ancestor_sha}" | .gitlab-ci/clang-format-diff.py -binary "clang-format" -p1 git diff -U0 --no-color "${newest_common_ancestor_sha}" | .gitlab-ci/clang-format-diff.py -binary "clang-format" -p1
exit_status=$? exit_status=$?

View File

@@ -5,78 +5,30 @@ set +e
srcdir=$( pwd ) srcdir=$( pwd )
builddir=$1 builddir=$1
backend=$2
# Ignore memory leaks lower in dependencies export GDK_BACKEND=x11
export LSAN_OPTIONS=suppressions=$srcdir/lsan.supp xvfb-run -a -s "-screen 0 1024x768x24" \
meson test -C ${builddir} \
case "${backend}" in
x11)
xvfb-run -a -s "-screen 0 1024x768x24 -noreset" \
meson test -C ${builddir} \
--timeout-multiplier "${MESON_TEST_TIMEOUT_MULTIPLIER}" \
--print-errorlogs \ --print-errorlogs \
--setup=${backend} \
--suite=gtk \ --suite=gtk \
--no-suite=gsk-compare-broadway --no-suite=gtk:a11y
# 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=$?
;;
wayland)
export XDG_RUNTIME_DIR="$(mktemp -p $(pwd) -d xdg-runtime-XXXXXX)"
weston --backend=headless-backend.so --socket=wayland-5 --idle-time=0 &
compositor=$!
export WAYLAND_DISPLAY=wayland-5
meson test -C ${builddir} \
--timeout-multiplier "${MESON_TEST_TIMEOUT_MULTIPLIER}" \
--print-errorlogs \
--setup=${backend} \
--suite=gtk \
--no-suite=gsk-compare-broadway
exit_code=$?
kill ${compositor}
;;
broadway)
export XDG_RUNTIME_DIR="$(mktemp -p $(pwd) -d xdg-runtime-XXXXXX)"
${builddir}/gdk/broadway/gtk4-broadwayd :5 &
server=$!
export BROADWAY_DISPLAY=:5
meson test -C ${builddir} \
--timeout-multiplier "${MESON_TEST_TIMEOUT_MULTIPLIER}" \
--print-errorlogs \
--setup=${backend} \
--suite=gtk \
--no-suite=gsk-compare-opengl
# don't let Broadway failures fail the run, for now
exit_code=0
kill ${server}
;;
esac
cd ${builddir} cd ${builddir}
$srcdir/.gitlab-ci/meson-junit-report.py \ $srcdir/.gitlab-ci/meson-junit-report.py \
--project-name=gtk \ --project-name=gtk \
--backend=${backend} \
--job-id="${CI_JOB_NAME}" \ --job-id="${CI_JOB_NAME}" \
--output=report-${backend}.xml \ --output=report.xml \
meson-logs/testlog-${backend}.json meson-logs/testlog.json
$srcdir/.gitlab-ci/meson-html-report.py \ $srcdir/.gitlab-ci/meson-html-report.py \
--project-name=gtk \ --project-name=gtk \
--backend=${backend} \
--job-id="${CI_JOB_NAME}" \ --job-id="${CI_JOB_NAME}" \
--reftest-output-dir="testsuite/reftests/output/${backend}" \ --reftest-output-dir="testsuite/reftests/output" \
--output=report-${backend}.html \ --output=report.html \
meson-logs/testlog-${backend}.json meson-logs/testlog.json
exit $exit_code exit $exit_code

View File

@@ -33,29 +33,14 @@ pacman --noconfirm -S --needed \
mingw-w64-$MSYS2_ARCH-gst-plugins-bad \ mingw-w64-$MSYS2_ARCH-gst-plugins-bad \
mingw-w64-$MSYS2_ARCH-shared-mime-info mingw-w64-$MSYS2_ARCH-shared-mime-info
# https://gitlab.gnome.org/GNOME/gtk/issues/2243
wget "https://gitlab.gnome.org/creiter/gitlab-ci-win32-runner-v2/raw/master/pango/mingw-w64-$MSYS2_ARCH-pango-1.44.7-1-any.pkg.tar.xz"
pacman --noconfirm -U "mingw-w64-$MSYS2_ARCH-pango-1.44.7-1-any.pkg.tar.xz"
mkdir -p _ccache mkdir -p _ccache
export CCACHE_BASEDIR="$(pwd)" export CCACHE_BASEDIR="$(pwd)"
export CCACHE_DIR="${CCACHE_BASEDIR}/_ccache" export CCACHE_DIR="${CCACHE_BASEDIR}/_ccache"
# https://gitlab.gnome.org/GNOME/gtk/-/issues/2243
# https://gitlab.gnome.org/GNOME/gtk/-/issues/3002
if ! pkg-config --atleast-version=2.65.0 glib-2.0; then
git clone https://gitlab.gnome.org/GNOME/glib.git _glib
meson setup _glib_build _glib
meson compile -C _glib_build
meson install -C _glib_build
fi
pkg-config --modversion glib-2.0
if ! pkg-config --atleast-version=1.47.0 pango; then
git clone https://gitlab.gnome.org/GNOME/pango.git _pango
meson setup _pango_build _pango
meson compile -C _pango_build
meson install -C _pango_build
fi
pkg-config --modversion pango
# Build # Build
ccache --zero-stats ccache --zero-stats
ccache --show-stats ccache --show-stats
@@ -66,9 +51,9 @@ meson \
-Dx11-backend=false \ -Dx11-backend=false \
-Dwayland-backend=false \ -Dwayland-backend=false \
-Dwin32-backend=true \ -Dwin32-backend=true \
-Dvulkan=disabled \ -Dvulkan=no \
-Dintrospection=false \ -Dintrospection=false \
-Dgtk:werror=true \ --werror \
_build _build
unset CCACHE_DISABLE unset CCACHE_DISABLE

30
AUTHORS
View File

@@ -1,5 +1,5 @@
Please do not mail any of the authors listed here Please do not mail any of the authors listed here
asking questions about this version of GTK. asking questions about this version of GTK+.
Original Authors Original Authors
---------------- ----------------
@@ -7,8 +7,8 @@ Peter Mattis <petm@xcf.berkeley.edu>
Spencer Kimball <spencer@xcf.berkeley.edu> Spencer Kimball <spencer@xcf.berkeley.edu>
Josh MacDonald <jmacd@xcf.berkeley.edu> Josh MacDonald <jmacd@xcf.berkeley.edu>
The Team that build GTK 2 (in alphabetical order) The GTK+ Team (in alphabetical order)
------------------------------------------------- -------------------------------------
Shawn T. Amundson <amundson@gtk.org> Shawn T. Amundson <amundson@gtk.org>
Jerome Bolliet <bolliet@gtk.org> Jerome Bolliet <bolliet@gtk.org>
Damon Chaplin <damon@gtk.org> Damon Chaplin <damon@gtk.org>
@@ -28,24 +28,11 @@ Jay Painter <jpaint@gtk.org>
Manish Singh <manish@gtk.org> Manish Singh <manish@gtk.org>
Owen Taylor <otaylor@gtk.org> Owen Taylor <otaylor@gtk.org>
The current team (GTK 3 and 4)
------------------------------
Jonas Ådahl <jadahl@gmail.com>
Tim Bäder <mail@baedert.org>
Emmanuele Bassi <ebassi@gnome.org>
Chun-wei Fan <fanchunwei@src.gnome.org>
Matthias Clasen <mclasen@redhat.com>
Carlos Garnacho <mrgarnacho@gmail.com>
Alexander Larsson <alexl@redhat.com>
Benjamin Otte <otte@gnome.org>
There are many others who have contributed patches; we thank them, There are many others who have contributed patches; we thank them,
GTK is much better because of them. GTK+ is much better because of them.
Over time, GTK has incorporated some pieces of software which Over time, GTK+ has incorporated some pieces of software which
started as independent projects. We list the original authors here: started as independent projects. We list the original authors here:
@@ -76,8 +63,3 @@ DirectFB backend
Denis Oliver Kropp Denis Oliver Kropp
Sven Neumann Sven Neumann
Mike Emmel Mike Emmel
gtkparasite
-----------
Christian Hammond

510
NEWS
View File

@@ -1,513 +1,3 @@
Overview of Changes in GTK 3.99.2
=================================
* GtkEntry:
- Fix issues with Emoji insertion
- Fix issues with dnd
- Set correct hotspot for dnd icon
* GtkPasswordEntry:
- Use non-pageable memory
* GtkSearchEntry:
- Don't handle forwarded events twice
* GtkPasswordEntry:
- Add an ::activate signal
* GtkTextView:
- Fix dnd
- Improve undo state tracking
- Speed rendering in the presence of selections
- Make clickable links work again
- Fix handling of anchored children
* GtkRevealer:
- Fix clipping issues in the swing transitions
* GtkColorChooser:
- Update the default palette
* GtkFileChooser:
- Fix a crash
- Fix setting unlisted filters
* GtkFontChooser:
- Determine sample text based on font coverage
- Allow filtering by language
* GtkStack:
- Add gtk_stack_add_child
* GtkVideo:
- Make autoplay work
* CSS:
- Allow more than 64 selectors per rule
* Adwaita:
- Improve gesture graphics
- Tweak DND highlight color
- Add spacing to .navigation-sidebar
* GDK:
- Add gdk_frame_clock_get_fps
* GSK:
- Add radial gradient nodes
* GL renderer:
- Fix clipping with projective transforms
- Use linear interpolation for offscreen rendering
with non-axis-aligned transforms
- Fix texture caching to avoid size mismatches
* Vulkan renderer:
- Fix swapchain creation
* Windows:
- Fix display of CSD windows
* Wayland
- Always ack configure to avoid jumping windows
* API cleanups:
- Make filter and sorter constructors return exact types
- Rename GdkSurfaceState to GdkToplevelState
- Remove GdkWaylandSurface::committed
- Make Wayland backend api take GdkToplevel
* Demos:
- Bug and crash fixes
- Cosmetic improvements for several demos
- Improve search in the sidebar
- Add a Shadertoy demo
- Add an Emblem demo
- Add a demo for input validation and error states
- Add a demo for context menus
- Make gtk-demo demo itself
* Build:
- Fix Vulkan dependency checking
- Make sysprof truly optional
* Translation updates:
Basque
British English
Catalan
Croatian
Czech
Danish
French
Galician
German
Hungarian
Indonesian
Italian
Kazakh
Latvian
Lithuanian
Persian
Polish
Slovak
Slovenian
Spanish
Turkish
Ukrainian
Overview of Changes in GTK 3.99.1
=================================
* GtkGridLayout: Rename left-/top-attach to column/row
* Drop GtkAccelLabel - it is no longer used
* GtkTextView:
- Fix redraw issues with selections
- Make insert-emoji replace the selection
* GtkTreeView:
- Fix selection handling in cell editables
* GtkPopover:
- Allow setting popup offset
* GtkPlacesSidebar:
- Fix DND
* GtkTextview:
- Speed up gtk_text_buffer_insert_markup
* GtkFrame:
- Set GTK_OVERFLOW_HIDDEN
* GtkSpinButton:
- Fix spinning
* GtkFontChooser:
- Populate the list incrementally
* GtkButton: Simplify the button hierarchy; GtkRadioButton
is gone, GtkCheckButton and GtkToggleButton can be grouped
* list widgets:
- Change apis to make models explicitly GtkSelectionModel
- Simplify constructors
* CSS:
- Hexadecimal colors can now specify alpha
- Fix parsing of numbers in scientific notation
* Themes:
- Add and document highlevel list styles
- Drop the style class defines. Just use string literals
- Round the corners of frames
- Make circular buttons square
* GL renderer:
- Fix clipping with projective transforms
* Documentation:
- Refresh the widget gallery
- Add images for new widgets to the gallery
- Fix many cross-references
- Make sure tutorial examples are buildable
* Demos:
- Numerous crash- and bug fixes
- Improve about dialogs
- gtk4-demo: Modernize source highlighting
- gtk4-demo: Improve sidebar filtering
- gtk4-demo: Drop some outdated demos
- gtk4-demo: Polish a number of existing demos
- gtk4-demo: Add several new demos
- widget-factory: Show error states
* Tools:
- Make gtk4-builder-tool rewrite GtkBox
- Make gtk4-builder-tool rewrite radio buttons
- Rewrite the profiling support, drop support
for D-Bus profiler activation, use SYSPROF_TRACE_FD
* Printing:
- Fix build with cups < 2.3
* win32:
- Default to the GL renderer when we can
* Broadway:
- Fix handling of opaque colors
- Fix handling of debug nodes
- Prune clipped render nodes
* Wayland:
- Support newer schemas for settings
- Fix DND hotspot handling
- Disconnect on display close
* Translation updates:
Basque
Brazilian Portuguese
British English
Catalan
Chinese (China)
Croatian
Galician
German
Greek
Indonesian
Japanese
Kazakh
Korean
Lithuanian
Polish
Romanian
Slovenian
Spanish
Turkish
Ukrainian
Overview of Changes in GTK 3.99.0
=================================
* Remove the old accessibility implementation and
add the foundations for a new one that is based
on ARIA. The relevant widget api is GtkAccessible,
the backend implementations will use GtkATContext.
Currently, there is just a nascent test backend.
* Update the GTK headers to use char *, int, float and
double instead of the corresponding GLib types.
* Add GtkEditableLabel, a label that can be edited
* Add GtkBookmarkList, a list model for bookmarks
* Add GtkStringList, a list model for strings
* Add GtkBitset, and use it for representing selections
* GtkTreeView:
- Make cell editing work again
* GtkSpinButton:
- Make autosizing work again
* Printing:
- Use GtkDropDown in the print dialog
* GtkApplication
- Support opening files on OS X
* GtkFileChooser:
- Fix libcloudproviders support
- Turn GtkFileFilter into a GtkFilter
- Simplify the api
* GtkGridView, GtkListView:
- Improve scrolling behavior
- Autoscroll and autoexpand during DND
* GtkScrolledWindow:
- Make autoscrolling work again
* GtkFilterListModel:
- Add incremental filtering
- Add a boolean filter, GtkBoolFilter
* GtkSortListModel:
- Use timsort
- Add various tweaks that massively speed up sorting
- Add incremental sorting
* GtkWidget:
- Massively speed up action handling
* GtkEntry:
- Make entry completion work again
- Drop action support from GtkEntryCompletion
* Inspector:
- Improve list model support
- Add direct navigation between objects
- Show accessibility information
* GDK:
- Compress scroll events
- Keep a scroll history
- Clean up GdkDevice api
- Drop the master/slave device split
- Move axes to GdkDeviceTool
- Change monitor workarea to be per-backend API
- Improve frame clock accuracy
- Add a new macOS backend
- Add an ANGLE-based GLES renderer for Windows
* GSK:
- Use GL_ARB_framebuffer_object
* gtk-demo:
- Add incremental refill to the color grid
- Improve performance of the color grid
- Add an incrementally filtering word list
- Improve the sidebar
* Install print-editor as another demo
* Translation updates
Basque
Catalan
Chinese
Japanese
Kazakh
Lithuanian
Polish
Romanian
Spanish
Turkish
Ukrainian
Overview of Changes in GTK 3.98.5
=================================
* Introduce new list widgets and supporting infrastructure.
The main APIs are:
- GtkListView
- GtkGridView
- GtkColumnView and GtkColumnViewColumn
- GtkDropDown
- GtkListItemFactory and implementations
- GtkExpression
- GtkFilter and subclasses, and GtkFilterListModel
- GtkSorter and subclasses, and GtkSortListModel
- GtkSelectionModel and subclasses
- GtkTreeListModel, GtkTreeExpander and GtkTreeListRowSorter
* GtkFileChooser:
- Add a tracker3-based search engine implementation
- Rate-limit updates from the trash monitor
* GtkWindow:
- Redo the css node setup. There is now a single 'window' node
- Fix rounded corners on tiled windows
* GtkApplication:
- Drop app menu support. Menubar support is still there
* GtkFixed:
- Change coordinate APIs to take doubles
* GtkOverlay:
- Make GtkOverlayLayout public
* GtkTooltips:
- Fix line wrapping of tooltips
* Shortcuts:
- Fix mnemonic cycling
- Fix using '0' as a mnemonic
* Menus:
- Differentiate keypad keys in accelerators
* GtkIMContext:
- Add gtk_im_context_filter_key to allow event reinjection
* Themes:
- Adwaita: Limit the scope of backdrop
* Accessibility:
- Clean up and reorganize the code to prepare for the
dropping of ATK
* GDK:
- Drop unused enum and struct definitions from headers
- Make keymap translation API public again. Still needed
- Frameclock: Always use compositor refresh rate info
- Frameclock: Use quadratic correction for frame time jitter
- Frameclock: Ensure monotonicity
- Frameclock: Track resason for paint
- X11: Improve sync when the Nvidia driver is used
* GSK:
- GL renderer: Fix blurred outset shadows
- GL renderer: handle nested transform nodes properly
- GL renderer: Optimize clip handling
* gtk-demo:
- Improve the Drag-and-Drop demo with proper drag icons
- Don't show the main window if --run is given
- Add demos for list widgets and GtkDropDrown
* Documentation:
- Convert freestanding sections to markdown
- Drop the glossary
- Expand and improve the migration guide
* Build:
- We require pandoc now, for building the documentation
- Require Pango 1.45
* Translation updates:
Polish
Romanian
Slovenian
Turkish
Ukrainian
Overview of Changes in GTK 3.98.4
=================================
* Themes
- Refine menu styling
- Tweak visible focus behavior
- HighConstrast: Add public colors
- HighContrast: Fix scale borders
* CSS:
- Drop the nonstandard -gtk-icon-theme property
- Add a system_setting_changed vfunc to propagate global changes
* Untangle titlebars from windows:
- Add a GtkWindowControls widget
- Add a GtkWindowHandle widget
- Add actions for window menu items
- Remove app menu fallback from GtkHeaderBar
- Remove title and subtitle properties from GtkHeaderBar,
rename custom-title to title-widget
* GtkWidget
- Add a focusable property
* GtkPopover:
- Fix (re-)positioning issues
* GtkStack:
- Drop the homogeneous property
- Add a use-underline property to stack pages
* GtkScale:
- Make area around the trough clickable
* GtkScrolledWindow:
- Fix kinetic scrolling
* GtkTreeView:
- Break reference cycles in unroot
* Drop GtkBin and GtkContainer. All existing GtkBin subclasses
have grown a child property with setter and getter. All
existing GtkContainer subclasses have grown widget-specific
remove (and in some cases, add) functions. <child> in ui
files continues to work as before
* Replace gtk_widget_destroy by gtk_window_destroy
* Drop the ::size-allocate signal. Use a GtkWidgetPaintable
if you need to be informed about changes to a widgets
content or size
* Remove gtk_dialog_run
* GDK:
- Wayland: Provide a builtin cursor of last resort
- Change the monitor api to use a GListModel
* GSK:
- Don't include renderer-specific headers automatically
- GL: Fix nested rounded clips
* Introspection:
- Assorted annotation fixes
* Inspector:
- Preview media resources
- Show media backend information
* gtk4-widget-factory:
- Add GtkVideo
- Add text styles
- Add a print dialog
- Add a password entry
- Improve toolbar styling
- Revamp transition effects
* gtk4-demo:
- Replace some demos
* Translation updates:
Chinese (Taiwan)
Esperanto
Japanese
Romanian
Spanish
Ukrainian
Overview of Changes in GTK 3.98.3 Overview of Changes in GTK 3.98.3
================================= =================================

View File

@@ -1,7 +1,7 @@
GTK — The GTK toolkit GTK — The GTK toolkit
===================== =====================
[![Build status](https://gitlab.gnome.org/GNOME/gtk/badges/master/pipeline.svg)](https://gitlab.gnome.org/GNOME/gtk/-/commits/master) [![Build Status](https://gitlab.gnome.org/GNOME/gtk/badges/master/build.svg)](https://gitlab.gnome.org/GNOME/gtk/pipelines)
General information General information
------------------- -------------------
@@ -56,6 +56,7 @@ building for:
- [Pango](https://download.gnome.org/sources/pango) - [Pango](https://download.gnome.org/sources/pango)
- [Epoxy](https://github.com/anholt/libepoxy) - [Epoxy](https://github.com/anholt/libepoxy)
- [Graphene](https://github.com/ebassi/graphene) - [Graphene](https://github.com/ebassi/graphene)
- [ATK](https://download.gnome.org/sources/atk)
- [Xkb-common](https://github.com/xkbcommon/libxkbcommon) - [Xkb-common](https://github.com/xkbcommon/libxkbcommon)
If you are building the X11 backend, you will also need: If you are building the X11 backend, you will also need:
@@ -69,6 +70,7 @@ If you are building the X11 backend, you will also need:
- xcursor - xcursor
- xdamage - xdamage
- xcomposite - xcomposite
- [atk-bridge-2.0](https://download.gnome.org/sources/at-spi2-atk)
If you are building the Wayland backend, you will also need: If you are building the Wayland backend, you will also need:
@@ -98,7 +100,7 @@ And, finally, you can install GTK using:
$ sudo ninja install $ sudo ninja install
``` ```
Complete information about installing GTK and related libraries Complete information about installing GTK+ and related libraries
can be found in the file: can be found in the file:
``` ```
@@ -161,7 +163,3 @@ version 2.1 or, at your option, any later version, as published by the Free
Software Foundation. Software Foundation.
Please, see the [`COPYING`](./COPYING) file for further information. Please, see the [`COPYING`](./COPYING) file for further information.
GTK includes a small number of source files under the Apache license:
- A fork of the roaring bitmaps implementation in [gtk/roaring](./gtk/roaring)
- An adaptation of timsort from python in [gtk/timsort](./gtk/timsort)

View File

@@ -1,38 +1,29 @@
{ {
"app-id" : "org.gtk.Demo4", "app-id": "org.gtk.Demo4",
"runtime" : "org.gnome.Platform", "runtime": "org.gnome.Platform",
"runtime-version" : "master", "runtime-version": "master",
"sdk" : "org.gnome.Sdk", "sdk": "org.gnome.Sdk",
"command" : "gtk4-demo", "command": "gtk4-demo",
"tags" : [ "tags": ["devel", "development", "nightly"],
"devel", "desktop-file-name-prefix": "(Development) ",
"development", "finish-args": [
"nightly"
],
"desktop-file-name-prefix" : "(Development) ",
"finish-args" : [
"--device=dri", "--device=dri",
"--share=ipc", "--share=ipc",
"--socket=fallback-x11", "--socket=fallback-x11",
"--socket=wayland", "--socket=wayland",
"--talk-name=org.gtk.vfs", "--talk-name=org.gtk.vfs", "--talk-name=org.gtk.vfs.*"
"--talk-name=org.gtk.vfs.*"
], ],
"cleanup" : [ "cleanup": [
"/include", "/include",
"/lib/pkgconfig", "/lib/pkgconfig", "/share/pkgconfig",
"/share/pkgconfig",
"/share/aclocal", "/share/aclocal",
"/man", "/man", "/share/man", "/share/gtk-doc",
"/share/man", "*.la", ".a",
"/share/gtk-doc",
"*.la",
".a",
"/lib/girepository-1.0", "/lib/girepository-1.0",
"/share/gir-1.0", "/share/gir-1.0",
"/share/doc" "/share/doc"
], ],
"modules" : [ "modules": [
{ {
"name" : "wayland", "name" : "wayland",
"buildsystem" : "autotools", "buildsystem" : "autotools",
@@ -48,18 +39,18 @@
] ]
}, },
{ {
"name" : "graphene", "name": "graphene",
"buildsystem" : "meson", "buildsystem": "meson",
"builddir" : true, "builddir": true,
"config-opts" : [ "config-opts": [
"--libdir=/app/lib", "--libdir=/app/lib",
"-Dtests=false", "-Dtests=false",
"-Dbenchmarks=false" "-Dbenchmarks=false"
], ],
"sources" : [ "sources": [
{ {
"type" : "git", "type": "git",
"url" : "https://github.com/ebassi/graphene.git" "url": "https://github.com/ebassi/graphene.git"
} }
] ]
}, },
@@ -67,7 +58,7 @@
"name" : "libsass", "name" : "libsass",
"buildsystem" : "meson", "buildsystem" : "meson",
"builddir" : true, "builddir" : true,
"config-opts" : [ "config-opts": [
"--libdir=/app/lib" "--libdir=/app/lib"
], ],
"sources" : [ "sources" : [
@@ -82,7 +73,7 @@
"name" : "sassc", "name" : "sassc",
"buildsystem" : "meson", "buildsystem" : "meson",
"builddir" : true, "builddir" : true,
"config-opts" : [ "config-opts": [
"--libdir=/app/lib" "--libdir=/app/lib"
], ],
"sources" : [ "sources" : [
@@ -94,25 +85,18 @@
] ]
}, },
{ {
"name" : "gtk", "name": "gtk",
"buildsystem" : "meson", "buildsystem": "meson",
"builddir" : true, "builddir": true,
"config-opts" : [ "config-opts": [
"--libdir=/app/lib", "--libdir=/app/lib"
"-Denable_vulkan=no",
"-Dbuildtype=debugoptimized"
], ],
"sources" : [ "sources": [
{ {
"type" : "git", "type": "git",
"url" : "https://gitlab.gnome.org/GNOME/gtk.git" "url": "https://gitlab.gnome.org/GNOME/gtk.git"
} }
] ]
} }
], ]
"build-options" : {
"env" : {
"GSK_RENDERER" : "opengl"
}
}
} }

View File

@@ -1,38 +1,29 @@
{ {
"app-id" : "org.gtk.IconBrowser4", "app-id": "org.gtk.IconBrowser4",
"runtime" : "org.gnome.Platform", "runtime": "org.gnome.Platform",
"runtime-version" : "master", "runtime-version": "master",
"sdk" : "org.gnome.Sdk", "sdk": "org.gnome.Sdk",
"command" : "gtk4-icon-browser", "command": "gtk4-icon-browser",
"tags" : [ "tags": ["devel", "development", "nightly"],
"devel", "desktop-file-name-prefix": "(Development) ",
"development", "finish-args": [
"nightly"
],
"desktop-file-name-prefix" : "(Development) ",
"finish-args" : [
"--device=dri", "--device=dri",
"--share=ipc", "--share=ipc",
"--socket=fallback-x11", "--socket=fallback-x11",
"--socket=wayland", "--socket=wayland",
"--talk-name=org.gtk.vfs", "--talk-name=org.gtk.vfs", "--talk-name=org.gtk.vfs.*"
"--talk-name=org.gtk.vfs.*"
], ],
"cleanup" : [ "cleanup": [
"/include", "/include",
"/lib/pkgconfig", "/lib/pkgconfig", "/share/pkgconfig",
"/share/pkgconfig",
"/share/aclocal", "/share/aclocal",
"/man", "/man", "/share/man", "/share/gtk-doc",
"/share/man", "*.la", ".a",
"/share/gtk-doc",
"*.la",
".a",
"/lib/girepository-1.0", "/lib/girepository-1.0",
"/share/gir-1.0", "/share/gir-1.0",
"/share/doc" "/share/doc"
], ],
"modules" : [ "modules": [
{ {
"name" : "wayland", "name" : "wayland",
"buildsystem" : "autotools", "buildsystem" : "autotools",
@@ -48,18 +39,18 @@
] ]
}, },
{ {
"name" : "graphene", "name": "graphene",
"buildsystem" : "meson", "buildsystem": "meson",
"builddir" : true, "builddir": true,
"config-opts" : [ "config-opts": [
"--libdir=/app/lib", "--libdir=/app/lib",
"-Dtests=false", "-Dtests=false",
"-Dbenchmarks=false" "-Dbenchmarks=false"
], ],
"sources" : [ "sources": [
{ {
"type" : "git", "type": "git",
"url" : "https://github.com/ebassi/graphene.git" "url": "https://github.com/ebassi/graphene.git"
} }
] ]
}, },
@@ -67,7 +58,7 @@
"name" : "libsass", "name" : "libsass",
"buildsystem" : "meson", "buildsystem" : "meson",
"builddir" : true, "builddir" : true,
"config-opts" : [ "config-opts": [
"--libdir=/app/lib" "--libdir=/app/lib"
], ],
"sources" : [ "sources" : [
@@ -82,7 +73,7 @@
"name" : "sassc", "name" : "sassc",
"buildsystem" : "meson", "buildsystem" : "meson",
"builddir" : true, "builddir" : true,
"config-opts" : [ "config-opts": [
"--libdir=/app/lib" "--libdir=/app/lib"
], ],
"sources" : [ "sources" : [
@@ -94,24 +85,18 @@
] ]
}, },
{ {
"name" : "gtk", "name": "gtk",
"buildsystem" : "meson", "buildsystem": "meson",
"builddir" : true, "builddir": true,
"config-opts" : [ "config-opts": [
"--libdir=/app/lib", "--libdir=/app/lib"
"-Denable_vulkan=no",
"-Dbuildtype=debugoptimized"
], ],
"sources" : [ "sources": [
{ {
"type" : "git", "type": "git",
"url" : "https://gitlab.gnome.org/GNOME/gtk.git" "url": "https://gitlab.gnome.org/GNOME/gtk.git"
} }
] ]
} }
], ]
"build-options" : {
"env" : {
}
}
} }

View File

@@ -1,38 +1,29 @@
{ {
"app-id" : "org.gtk.WidgetFactory4", "app-id": "org.gtk.WidgetFactory4",
"runtime" : "org.gnome.Platform", "runtime": "org.gnome.Platform",
"runtime-version" : "master", "runtime-version": "master",
"sdk" : "org.gnome.Sdk", "sdk": "org.gnome.Sdk",
"command" : "gtk4-widget-factory", "command": "gtk4-widget-factory",
"tags" : [ "tags": ["devel", "development", "nightly"],
"devel", "desktop-file-name-prefix": "(Development) ",
"development", "finish-args": [
"nightly"
],
"desktop-file-name-prefix" : "(Development) ",
"finish-args" : [
"--device=dri", "--device=dri",
"--share=ipc", "--share=ipc",
"--socket=fallback-x11", "--socket=fallback-x11",
"--socket=wayland", "--socket=wayland",
"--talk-name=org.gtk.vfs", "--talk-name=org.gtk.vfs", "--talk-name=org.gtk.vfs.*"
"--talk-name=org.gtk.vfs.*"
], ],
"cleanup" : [ "cleanup": [
"/include", "/include",
"/lib/pkgconfig", "/lib/pkgconfig", "/share/pkgconfig",
"/share/pkgconfig",
"/share/aclocal", "/share/aclocal",
"/man", "/man", "/share/man", "/share/gtk-doc",
"/share/man", "*.la", ".a",
"/share/gtk-doc",
"*.la",
".a",
"/lib/girepository-1.0", "/lib/girepository-1.0",
"/share/gir-1.0", "/share/gir-1.0",
"/share/doc" "/share/doc"
], ],
"modules" : [ "modules": [
{ {
"name" : "wayland", "name" : "wayland",
"buildsystem" : "autotools", "buildsystem" : "autotools",
@@ -48,18 +39,18 @@
] ]
}, },
{ {
"name" : "graphene", "name": "graphene",
"buildsystem" : "meson", "buildsystem": "meson",
"builddir" : true, "builddir": true,
"config-opts" : [ "config-opts": [
"--libdir=/app/lib", "--libdir=/app/lib",
"-Dtests=false", "-Dtests=false",
"-Dbenchmarks=false" "-Dbenchmarks=false"
], ],
"sources" : [ "sources": [
{ {
"type" : "git", "type": "git",
"url" : "https://github.com/ebassi/graphene.git" "url": "https://github.com/ebassi/graphene.git"
} }
] ]
}, },
@@ -67,7 +58,7 @@
"name" : "libsass", "name" : "libsass",
"buildsystem" : "meson", "buildsystem" : "meson",
"builddir" : true, "builddir" : true,
"config-opts" : [ "config-opts": [
"--libdir=/app/lib" "--libdir=/app/lib"
], ],
"sources" : [ "sources" : [
@@ -82,7 +73,7 @@
"name" : "sassc", "name" : "sassc",
"buildsystem" : "meson", "buildsystem" : "meson",
"builddir" : true, "builddir" : true,
"config-opts" : [ "config-opts": [
"--libdir=/app/lib" "--libdir=/app/lib"
], ],
"sources" : [ "sources" : [
@@ -94,28 +85,18 @@
] ]
}, },
{ {
"name" : "gtk", "name": "gtk",
"buildsystem" : "meson", "buildsystem": "meson",
"builddir" : true, "builddir": true,
"config-opts" : [ "config-opts": [
"--libdir=/app/lib", "--libdir=/app/lib"
"-Denable_vulkan=no",
"-Dbuildtype=debugoptimized"
], ],
"sources" : [ "sources": [
{ {
"type" : "git", "type": "git",
"url" : "https://gitlab.gnome.org/GNOME/gtk.git" "url": "https://gitlab.gnome.org/GNOME/gtk.git"
} }
] ]
} }
], ]
"build-options" : {
"env" : {
"DBUS_SESSION_BUS_ADDRESS" : "''",
"GSK_RENDERER" : "opengl",
"GDK_DEBUG" : "vulkan-disable",
"G_ENABLE_DEBUG" : "true"
}
}
} }

View File

@@ -15,13 +15,7 @@ if 'DESTDIR' not in os.environ:
gtk_immodule_dir = os.path.join(gtk_moduledir, 'immodules') gtk_immodule_dir = os.path.join(gtk_moduledir, 'immodules')
print('Compiling GSettings schemas...') print('Compiling GSettings schemas...')
glib_compile_schemas = subprocess.check_output(['pkg-config', subprocess.call(['glib-compile-schemas',
'--variable=glib_compile_schemas',
'gio-2.0']).strip()
if not os.path.exists(glib_compile_schemas):
# pkg-config variables only available since GLib 2.62.0.
glib_compile_schemas = 'glib-compile-schemas'
subprocess.call([glib_compile_schemas,
os.path.join(gtk_datadir, 'glib-2.0', 'schemas')]) os.path.join(gtk_datadir, 'glib-2.0', 'schemas')])
print('Updating icon cache...') print('Updating icon cache...')
@@ -30,14 +24,8 @@ if 'DESTDIR' not in os.environ:
print('Updating module cache for print backends...') print('Updating module cache for print backends...')
os.makedirs(gtk_printmodule_dir, exist_ok=True) os.makedirs(gtk_printmodule_dir, exist_ok=True)
gio_querymodules = subprocess.check_output(['pkg-config', subprocess.call(['gio-querymodules', gtk_printmodule_dir])
'--variable=gio_querymodules',
'gio-2.0']).strip()
if not os.path.exists(gio_querymodules):
# pkg-config variables only available since GLib 2.62.0.
gio_querymodules = 'gio-querymodules'
subprocess.call([gio_querymodules, gtk_printmodule_dir])
print('Updating module cache for input methods...') print('Updating module cache for input methods...')
os.makedirs(gtk_immodule_dir, exist_ok=True) os.makedirs(gtk_immodule_dir, exist_ok=True)
subprocess.call([gio_querymodules, gtk_immodule_dir]) subprocess.call(['gio-querymodules', gtk_immodule_dir])

View File

@@ -27,6 +27,14 @@
/* Define to 1 if you have the `dcgettext' function. */ /* Define to 1 if you have the `dcgettext' function. */
#mesondefine HAVE_DCGETTEXT #mesondefine HAVE_DCGETTEXT
/* Define to 1 if you have the declaration of `isinf', and to 0 if you don't.
*/
#mesondefine HAVE_DECL_ISINF
/* Define to 1 if you have the declaration of `isnan', and to 0 if you don't.
*/
#mesondefine HAVE_DECL_ISNAN
/* Define to 1 if you have the <dlfcn.h> header file. */ /* Define to 1 if you have the <dlfcn.h> header file. */
#mesondefine HAVE_DLFCN_H #mesondefine HAVE_DLFCN_H
@@ -69,12 +77,12 @@
/* Define to 1 if you have the `mkstemp' function. */ /* Define to 1 if you have the `mkstemp' function. */
#mesondefine HAVE_MKSTEMP #mesondefine HAVE_MKSTEMP
/* Define to 1 if you have the `mlock` function. */
#mesondefine HAVE_MLOCK
/* Define to 1 if you have a working `mmap' system call. */ /* Define to 1 if you have a working `mmap' system call. */
#mesondefine HAVE_MMAP #mesondefine HAVE_MMAP
/* Define to 1 if you have the `nearbyint' function. */
#mesondefine HAVE_NEARBYINT
/* Define to 1 if you have the `posix_fallocate' function. */ /* Define to 1 if you have the `posix_fallocate' function. */
#mesondefine HAVE_POSIX_FALLOCATE #mesondefine HAVE_POSIX_FALLOCATE
@@ -84,9 +92,21 @@
/* Have the Xrandr 1.5 extension library */ /* Have the Xrandr 1.5 extension library */
#mesondefine HAVE_RANDR15 #mesondefine HAVE_RANDR15
/* Define to 1 if you have the `rint' function. */
#mesondefine HAVE_RINT
/* Define to 1 if you have the `round' function. */
#mesondefine HAVE_ROUND
/* Define to 1 if you have the `sincos' function. */ /* Define to 1 if you have the `sincos' function. */
#mesondefine HAVE_SINCOS #mesondefine HAVE_SINCOS
/* Define to 1 if you have the `log2` function */
#mesondefine HAVE_LOG2
/* Define to 1 if you ahve the `exp2` function */
#mesondefine HAVE_EXP2
/* Define to 1 if you have the <stdint.h> header file. */ /* Define to 1 if you have the <stdint.h> header file. */
#mesondefine HAVE_STDINT_H #mesondefine HAVE_STDINT_H
@@ -106,7 +126,7 @@
#mesondefine HAVE_SYS_PARAM_H #mesondefine HAVE_SYS_PARAM_H
/* Have the sysprof-capture library */ /* Have the sysprof-capture library */
#mesondefine HAVE_SYSPROF #mesondefine HAVE_SYSPROF_CAPTURE
/* Define to 1 if you have the <sys/stat.h> header file. */ /* Define to 1 if you have the <sys/stat.h> header file. */
#mesondefine HAVE_SYS_STAT_H #mesondefine HAVE_SYS_STAT_H
@@ -275,6 +295,3 @@
#mesondefine HAVE_PANGOFT #mesondefine HAVE_PANGOFT
#mesondefine ISO_CODES_PREFIX #mesondefine ISO_CODES_PREFIX
/* Define if tracker3 is available */
#mesondefine HAVE_TRACKER3

View File

@@ -81,11 +81,11 @@ constraint_editor_application_activate (GApplication *app)
static void static void
constraint_editor_application_open (GApplication *app, constraint_editor_application_open (GApplication *app,
GFile **files, GFile **files,
int n_files, gint n_files,
const char *hint) const gchar *hint)
{ {
ConstraintEditorWindow *win; ConstraintEditorWindow *win;
int i; gint i;
for (i = 0; i < n_files; i++) for (i = 0; i < n_files; i++)
{ {

View File

@@ -193,7 +193,7 @@ constraint_editor_window_load (ConstraintEditorWindow *self,
static void static void
open_response_cb (GtkNativeDialog *dialog, open_response_cb (GtkNativeDialog *dialog,
int response, gint response,
ConstraintEditorWindow *self) ConstraintEditorWindow *self)
{ {
gtk_native_dialog_hide (dialog); gtk_native_dialog_hide (dialog);
@@ -285,7 +285,7 @@ serialize_model (GListModel *list)
static void static void
save_response_cb (GtkNativeDialog *dialog, save_response_cb (GtkNativeDialog *dialog,
int response, gint response,
ConstraintEditorWindow *self) ConstraintEditorWindow *self)
{ {
gtk_native_dialog_hide (dialog); gtk_native_dialog_hide (dialog);
@@ -317,7 +317,7 @@ save_response_cb (GtkNativeDialog *dialog,
"Saving failed"); "Saving failed");
gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (message_dialog), gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (message_dialog),
"%s", error->message); "%s", error->message);
g_signal_connect (message_dialog, "response", G_CALLBACK (gtk_window_destroy), NULL); g_signal_connect (message_dialog, "response", G_CALLBACK (gtk_widget_destroy), NULL);
gtk_widget_show (message_dialog); gtk_widget_show (message_dialog);
g_error_free (error); g_error_free (error);
} }
@@ -403,7 +403,7 @@ constraint_editor_done (ConstraintEditor *editor,
g_clear_object (&old_constraint); g_clear_object (&old_constraint);
gtk_window_destroy (GTK_WINDOW (gtk_widget_get_ancestor (GTK_WIDGET (editor), GTK_TYPE_WINDOW))); gtk_widget_destroy (gtk_widget_get_ancestor (GTK_WIDGET (editor), GTK_TYPE_WINDOW));
} }
static void static void
@@ -444,7 +444,7 @@ guide_editor_done (GuideEditor *editor,
GtkConstraintGuide *guide, GtkConstraintGuide *guide,
ConstraintEditorWindow *win) ConstraintEditorWindow *win)
{ {
gtk_window_destroy (GTK_WINDOW (gtk_widget_get_ancestor (GTK_WIDGET (editor), GTK_TYPE_WINDOW))); gtk_widget_destroy (gtk_widget_get_ancestor (GTK_WIDGET (editor), GTK_TYPE_WINDOW));
} }
static void static void
@@ -487,6 +487,8 @@ constraint_editor_window_class_init (ConstraintEditorWindowClass *class)
GObjectClass *object_class = G_OBJECT_CLASS (class); GObjectClass *object_class = G_OBJECT_CLASS (class);
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class); GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class);
g_type_ensure (CONSTRAINT_VIEW_TYPE);
object_class->finalize = constraint_editor_window_finalize; object_class->finalize = constraint_editor_window_finalize;
gtk_widget_class_set_template_from_resource (widget_class, gtk_widget_class_set_template_from_resource (widget_class,
@@ -605,8 +607,8 @@ create_widget_func (gpointer item,
gtk_widget_set_margin_bottom (label, 10); gtk_widget_set_margin_bottom (label, 10);
gtk_label_set_xalign (GTK_LABEL (label), 0.0); gtk_label_set_xalign (GTK_LABEL (label), 0.0);
gtk_widget_set_hexpand (label, TRUE); gtk_widget_set_hexpand (label, TRUE);
gtk_list_box_row_set_child (GTK_LIST_BOX_ROW (row), box); gtk_container_add (GTK_CONTAINER (row), box);
gtk_box_append (GTK_BOX (box), label); gtk_container_add (GTK_CONTAINER (box), label);
if (GTK_IS_CONSTRAINT (item) || GTK_IS_CONSTRAINT_GUIDE (item)) if (GTK_IS_CONSTRAINT (item) || GTK_IS_CONSTRAINT_GUIDE (item))
{ {
@@ -614,18 +616,18 @@ create_widget_func (gpointer item,
gtk_button_set_has_frame (GTK_BUTTON (button), FALSE); gtk_button_set_has_frame (GTK_BUTTON (button), FALSE);
g_signal_connect (button, "clicked", G_CALLBACK (row_edit), win); g_signal_connect (button, "clicked", G_CALLBACK (row_edit), win);
g_object_set_data (G_OBJECT (row), "edit", button); g_object_set_data (G_OBJECT (row), "edit", button);
gtk_box_append (GTK_BOX (box), button); gtk_container_add (GTK_CONTAINER (box), button);
button = gtk_button_new_from_icon_name ("edit-delete-symbolic"); button = gtk_button_new_from_icon_name ("edit-delete-symbolic");
gtk_button_set_has_frame (GTK_BUTTON (button), FALSE); gtk_button_set_has_frame (GTK_BUTTON (button), FALSE);
g_signal_connect (button, "clicked", G_CALLBACK (row_delete), win); g_signal_connect (button, "clicked", G_CALLBACK (row_delete), win);
gtk_box_append (GTK_BOX (box), button); gtk_container_add (GTK_CONTAINER (box), button);
} }
else if (GTK_IS_WIDGET (item)) else if (GTK_IS_WIDGET (item))
{ {
button = gtk_button_new_from_icon_name ("edit-delete-symbolic"); button = gtk_button_new_from_icon_name ("edit-delete-symbolic");
gtk_button_set_has_frame (GTK_BUTTON (button), FALSE); gtk_button_set_has_frame (GTK_BUTTON (button), FALSE);
g_signal_connect (button, "clicked", G_CALLBACK (row_delete), win); g_signal_connect (button, "clicked", G_CALLBACK (row_delete), win);
gtk_box_append (GTK_BOX (box), button); gtk_container_add (GTK_CONTAINER (box), button);
} }
g_free (freeme); g_free (freeme);

View File

@@ -9,6 +9,7 @@
<property name="default-height">768</property> <property name="default-height">768</property>
<child type="titlebar"> <child type="titlebar">
<object class="GtkHeaderBar" id="header"> <object class="GtkHeaderBar" id="header">
<property name="show-title-buttons">1</property>
<child type="start"> <child type="start">
<object class="GtkButton"> <object class="GtkButton">
<property name="icon-name">document-open-symbolic</property> <property name="icon-name">document-open-symbolic</property>

View File

@@ -13,8 +13,8 @@
<object class="GtkLabel"> <object class="GtkLabel">
<property name="label">Target</property> <property name="label">Target</property>
<layout> <layout>
<property name="column">0</property> <property name="left-attach">0</property>
<property name="row">1</property> <property name="top-attach">1</property>
</layout> </layout>
</object> </object>
</child> </child>
@@ -23,8 +23,8 @@
<signal name="changed" handler="update_preview" swapped="yes"/> <signal name="changed" handler="update_preview" swapped="yes"/>
<signal name="changed" handler="update_button" swapped="yes"/> <signal name="changed" handler="update_button" swapped="yes"/>
<layout> <layout>
<property name="column">1</property> <property name="left-attach">1</property>
<property name="row">1</property> <property name="top-attach">1</property>
</layout> </layout>
</object> </object>
</child> </child>
@@ -32,8 +32,8 @@
<object class="GtkComboBoxText" id="target_attr"> <object class="GtkComboBoxText" id="target_attr">
<signal name="changed" handler="update_preview" swapped="yes"/> <signal name="changed" handler="update_preview" swapped="yes"/>
<layout> <layout>
<property name="column">2</property> <property name="left-attach">2</property>
<property name="row">1</property> <property name="top-attach">1</property>
</layout> </layout>
</object> </object>
</child> </child>
@@ -41,8 +41,8 @@
<object class="GtkLabel"> <object class="GtkLabel">
<property name="label">Relation</property> <property name="label">Relation</property>
<layout> <layout>
<property name="column">0</property> <property name="left-attach">0</property>
<property name="row">2</property> <property name="top-attach">2</property>
</layout> </layout>
</object> </object>
</child> </child>
@@ -50,8 +50,8 @@
<object class="GtkComboBoxText" id="relation"> <object class="GtkComboBoxText" id="relation">
<signal name="changed" handler="update_preview" swapped="yes"/> <signal name="changed" handler="update_preview" swapped="yes"/>
<layout> <layout>
<property name="column">1</property> <property name="left-attach">1</property>
<property name="row">2</property> <property name="top-attach">2</property>
</layout> </layout>
</object> </object>
</child> </child>
@@ -59,8 +59,8 @@
<object class="GtkLabel"> <object class="GtkLabel">
<property name="label">Source</property> <property name="label">Source</property>
<layout> <layout>
<property name="column">0</property> <property name="left-attach">0</property>
<property name="row">3</property> <property name="top-attach">3</property>
</layout> </layout>
</object> </object>
</child> </child>
@@ -69,8 +69,8 @@
<signal name="changed" handler="update_preview" swapped="yes"/> <signal name="changed" handler="update_preview" swapped="yes"/>
<signal name="changed" handler="update_button" swapped="yes"/> <signal name="changed" handler="update_button" swapped="yes"/>
<layout> <layout>
<property name="column">1</property> <property name="left-attach">1</property>
<property name="row">3</property> <property name="top-attach">3</property>
</layout> </layout>
</object> </object>
</child> </child>
@@ -79,8 +79,8 @@
<signal name="changed" handler="update_preview" swapped="yes"/> <signal name="changed" handler="update_preview" swapped="yes"/>
<signal name="changed" handler="source_attr_changed" swapped="yes"/> <signal name="changed" handler="source_attr_changed" swapped="yes"/>
<layout> <layout>
<property name="column">2</property> <property name="left-attach">2</property>
<property name="row">3</property> <property name="top-attach">3</property>
</layout> </layout>
</object> </object>
</child> </child>
@@ -88,8 +88,8 @@
<object class="GtkLabel"> <object class="GtkLabel">
<property name="label">Multiplier</property> <property name="label">Multiplier</property>
<layout> <layout>
<property name="column">0</property> <property name="left-attach">0</property>
<property name="row">4</property> <property name="top-attach">4</property>
</layout> </layout>
</object> </object>
</child> </child>
@@ -97,8 +97,8 @@
<object class="GtkEntry" id="multiplier"> <object class="GtkEntry" id="multiplier">
<signal name="changed" handler="update_preview" swapped="yes"/> <signal name="changed" handler="update_preview" swapped="yes"/>
<layout> <layout>
<property name="column">1</property> <property name="left-attach">1</property>
<property name="row">4</property> <property name="top-attach">4</property>
</layout> </layout>
</object> </object>
</child> </child>
@@ -106,8 +106,8 @@
<object class="GtkLabel"> <object class="GtkLabel">
<property name="label">Constant</property> <property name="label">Constant</property>
<layout> <layout>
<property name="column">0</property> <property name="left-attach">0</property>
<property name="row">5</property> <property name="top-attach">5</property>
</layout> </layout>
</object> </object>
</child> </child>
@@ -115,8 +115,8 @@
<object class="GtkEntry" id="constant"> <object class="GtkEntry" id="constant">
<signal name="changed" handler="update_preview" swapped="yes"/> <signal name="changed" handler="update_preview" swapped="yes"/>
<layout> <layout>
<property name="column">1</property> <property name="left-attach">1</property>
<property name="row">5</property> <property name="top-attach">5</property>
</layout> </layout>
</object> </object>
</child> </child>
@@ -124,16 +124,16 @@
<object class="GtkLabel"> <object class="GtkLabel">
<property name="label">Strength</property> <property name="label">Strength</property>
<layout> <layout>
<property name="column">0</property> <property name="left-attach">0</property>
<property name="row">6</property> <property name="top-attach">6</property>
</layout> </layout>
</object> </object>
</child> </child>
<child> <child>
<object class="GtkComboBoxText" id="strength"> <object class="GtkComboBoxText" id="strength">
<layout> <layout>
<property name="column">1</property> <property name="left-attach">1</property>
<property name="row">6</property> <property name="top-attach">6</property>
</layout> </layout>
</object> </object>
</child> </child>
@@ -141,8 +141,8 @@
<object class="GtkLabel" id="preview"> <object class="GtkLabel" id="preview">
<property name="xalign">0</property> <property name="xalign">0</property>
<layout> <layout>
<property name="column">1</property> <property name="left-attach">1</property>
<property name="row">7</property> <property name="top-attach">7</property>
<property name="column-span">2</property> <property name="column-span">2</property>
</layout> </layout>
<attributes> <attributes>
@@ -155,8 +155,8 @@
<property name="label">Create</property> <property name="label">Create</property>
<signal name="clicked" handler="create_constraint"/> <signal name="clicked" handler="create_constraint"/>
<layout> <layout>
<property name="column">2</property> <property name="left-attach">2</property>
<property name="row">8</property> <property name="top-attach">8</property>
</layout> </layout>
</object> </object>
</child> </child>

View File

@@ -169,30 +169,28 @@ constraint_view_init (ConstraintView *self)
GListModel *guides; GListModel *guides;
GListModel *children; GListModel *children;
GListModel *constraints; GListModel *constraints;
GtkFilter *filter;
manager = gtk_constraint_layout_new (); manager = gtk_constraint_layout_new ();
gtk_widget_set_layout_manager (GTK_WIDGET (self), manager); gtk_widget_set_layout_manager (GTK_WIDGET (self), manager);
guides = gtk_constraint_layout_observe_guides (GTK_CONSTRAINT_LAYOUT (manager));
all_constraints = gtk_constraint_layout_observe_constraints (GTK_CONSTRAINT_LAYOUT (manager));
filter = GTK_FILTER (gtk_custom_filter_new (omit_internal, NULL, NULL));
constraints = (GListModel *)gtk_filter_list_model_new (all_constraints, filter);
all_children = gtk_widget_observe_children (GTK_WIDGET (self)); all_children = gtk_widget_observe_children (GTK_WIDGET (self));
filter = GTK_FILTER (gtk_custom_filter_new (omit_internal, NULL, NULL)); all_constraints = gtk_constraint_layout_observe_constraints (GTK_CONSTRAINT_LAYOUT (manager));
children = (GListModel *)gtk_filter_list_model_new (all_children, filter); guides = gtk_constraint_layout_observe_guides (GTK_CONSTRAINT_LAYOUT (manager));
constraints = (GListModel *)gtk_filter_list_model_new (all_constraints, omit_internal, NULL, NULL);
children = (GListModel *)gtk_filter_list_model_new (all_children, omit_internal, NULL, NULL);
list = g_list_store_new (G_TYPE_LIST_MODEL); list = g_list_store_new (G_TYPE_LIST_MODEL);
g_list_store_append (list, children); g_list_store_append (list, children);
g_list_store_append (list, guides); g_list_store_append (list, guides);
g_list_store_append (list, constraints); g_list_store_append (list, constraints);
self->model = G_LIST_MODEL (gtk_flatten_list_model_new (G_TYPE_OBJECT, G_LIST_MODEL (list)));
g_object_unref (children); g_object_unref (children);
g_object_unref (guides); g_object_unref (guides);
g_object_unref (constraints); g_object_unref (constraints);
g_object_unref (all_children);
g_object_unref (all_constraints);
g_object_unref (list);
self->model = G_LIST_MODEL (gtk_flatten_list_model_new (G_LIST_MODEL (list)));
controller = (GtkEventController *)gtk_gesture_drag_new (); controller = (GtkEventController *)gtk_gesture_drag_new ();
g_signal_connect (controller, "drag-begin", G_CALLBACK (drag_begin), self); g_signal_connect (controller, "drag-begin", G_CALLBACK (drag_begin), self);

View File

@@ -23,7 +23,6 @@
#define CONSTRAINT_VIEW_TYPE (constraint_view_get_type ()) #define CONSTRAINT_VIEW_TYPE (constraint_view_get_type ())
G_MODULE_EXPORT
G_DECLARE_FINAL_TYPE (ConstraintView, constraint_view, CONSTRAINT, VIEW, GtkWidget) G_DECLARE_FINAL_TYPE (ConstraintView, constraint_view, CONSTRAINT, VIEW, GtkWidget)
ConstraintView * constraint_view_new (void); ConstraintView * constraint_view_new (void);

View File

@@ -184,6 +184,58 @@ max_input (GtkSpinButton *spin_button,
return FALSE; return FALSE;
} }
static gboolean
min_output (GtkSpinButton *spin_button)
{
GtkAdjustment *adjustment;
double value;
GtkWidget *box, *text;
adjustment = gtk_spin_button_get_adjustment (spin_button);
value = gtk_adjustment_get_value (adjustment);
box = gtk_widget_get_first_child (GTK_WIDGET (spin_button));
text = gtk_widget_get_first_child (box);
if (value == 0.0)
{
gtk_editable_set_text (GTK_EDITABLE (spin_button), "");
gtk_text_set_placeholder_text (GTK_TEXT (text), "unset");
return TRUE;
}
else
{
gtk_text_set_placeholder_text (GTK_TEXT (text), "");
return FALSE;
}
}
static gboolean
max_output (GtkSpinButton *spin_button)
{
GtkAdjustment *adjustment;
double value;
GtkWidget *box, *text;
adjustment = gtk_spin_button_get_adjustment (spin_button);
value = gtk_adjustment_get_value (adjustment);
box = gtk_widget_get_first_child (GTK_WIDGET (spin_button));
text = gtk_widget_get_first_child (box);
if (value == (double)G_MAXINT)
{
gtk_editable_set_text (GTK_EDITABLE (spin_button), "");
gtk_text_set_placeholder_text (GTK_TEXT (text), "unset");
return TRUE;
}
else
{
gtk_text_set_placeholder_text (GTK_TEXT (text), "");
return FALSE;
}
}
static void static void
guide_editor_constructed (GObject *object) guide_editor_constructed (GObject *object)
{ {
@@ -192,12 +244,16 @@ guide_editor_constructed (GObject *object)
guide_strength_combo (editor->strength); guide_strength_combo (editor->strength);
g_signal_connect (editor->min_width, "input", G_CALLBACK (min_input), NULL); g_signal_connect (editor->min_width, "input", G_CALLBACK (min_input), NULL);
g_signal_connect (editor->min_width, "output", G_CALLBACK (min_output), NULL);
g_signal_connect (editor->min_height, "input", G_CALLBACK (min_input), NULL); g_signal_connect (editor->min_height, "input", G_CALLBACK (min_input), NULL);
g_signal_connect (editor->min_height, "output", G_CALLBACK (min_output), NULL);
g_signal_connect (editor->max_width, "input", G_CALLBACK (max_input), NULL); g_signal_connect (editor->max_width, "input", G_CALLBACK (max_input), NULL);
g_signal_connect (editor->max_width, "output", G_CALLBACK (max_output), NULL);
g_signal_connect (editor->max_height, "input", G_CALLBACK (max_input), NULL); g_signal_connect (editor->max_height, "input", G_CALLBACK (max_input), NULL);
g_signal_connect (editor->max_height, "output", G_CALLBACK (max_output), NULL);
if (editor->guide) if (editor->guide)
{ {

View File

@@ -55,8 +55,8 @@
<object class="GtkLabel"> <object class="GtkLabel">
<property name="label">Name</property> <property name="label">Name</property>
<layout> <layout>
<property name="column">0</property> <property name="left-attach">0</property>
<property name="row">0</property> <property name="top-attach">0</property>
</layout> </layout>
</object> </object>
</child> </child>
@@ -64,8 +64,8 @@
<object class="GtkEntry" id="name"> <object class="GtkEntry" id="name">
<property name="max-width-chars">20</property> <property name="max-width-chars">20</property>
<layout> <layout>
<property name="column">1</property> <property name="left-attach">1</property>
<property name="row">0</property> <property name="top-attach">0</property>
<property name="column-span">2</property> <property name="column-span">2</property>
</layout> </layout>
</object> </object>
@@ -74,8 +74,8 @@
<object class="GtkLabel"> <object class="GtkLabel">
<property name="label">Min Size</property> <property name="label">Min Size</property>
<layout> <layout>
<property name="column">0</property> <property name="left-attach">0</property>
<property name="row">1</property> <property name="top-attach">1</property>
</layout> </layout>
</object> </object>
</child> </child>
@@ -84,8 +84,8 @@
<property name="adjustment">min_width_adj</property> <property name="adjustment">min_width_adj</property>
<property name="max-width-chars">5</property> <property name="max-width-chars">5</property>
<layout> <layout>
<property name="column">1</property> <property name="left-attach">1</property>
<property name="row">1</property> <property name="top-attach">1</property>
</layout> </layout>
</object> </object>
</child> </child>
@@ -94,8 +94,8 @@
<property name="adjustment">min_height_adj</property> <property name="adjustment">min_height_adj</property>
<property name="max-width-chars">5</property> <property name="max-width-chars">5</property>
<layout> <layout>
<property name="column">2</property> <property name="left-attach">2</property>
<property name="row">1</property> <property name="top-attach">1</property>
</layout> </layout>
</object> </object>
</child> </child>
@@ -103,8 +103,8 @@
<object class="GtkLabel"> <object class="GtkLabel">
<property name="label">Nat Size</property> <property name="label">Nat Size</property>
<layout> <layout>
<property name="column">0</property> <property name="left-attach">0</property>
<property name="row">2</property> <property name="top-attach">2</property>
</layout> </layout>
</object> </object>
</child> </child>
@@ -113,8 +113,8 @@
<property name="adjustment">nat_width_adj</property> <property name="adjustment">nat_width_adj</property>
<property name="max-width-chars">5</property> <property name="max-width-chars">5</property>
<layout> <layout>
<property name="column">1</property> <property name="left-attach">1</property>
<property name="row">2</property> <property name="top-attach">2</property>
</layout> </layout>
</object> </object>
</child> </child>
@@ -123,8 +123,8 @@
<property name="adjustment">nat_height_adj</property> <property name="adjustment">nat_height_adj</property>
<property name="max-width-chars">5</property> <property name="max-width-chars">5</property>
<layout> <layout>
<property name="column">2</property> <property name="left-attach">2</property>
<property name="row">2</property> <property name="top-attach">2</property>
</layout> </layout>
</object> </object>
</child> </child>
@@ -132,8 +132,8 @@
<object class="GtkLabel"> <object class="GtkLabel">
<property name="label">Max Size</property> <property name="label">Max Size</property>
<layout> <layout>
<property name="column">0</property> <property name="left-attach">0</property>
<property name="row">3</property> <property name="top-attach">3</property>
</layout> </layout>
</object> </object>
</child> </child>
@@ -142,8 +142,8 @@
<property name="adjustment">max_width_adj</property> <property name="adjustment">max_width_adj</property>
<property name="max-width-chars">5</property> <property name="max-width-chars">5</property>
<layout> <layout>
<property name="column">1</property> <property name="left-attach">1</property>
<property name="row">3</property> <property name="top-attach">3</property>
</layout> </layout>
</object> </object>
</child> </child>
@@ -152,8 +152,8 @@
<property name="adjustment">max_height_adj</property> <property name="adjustment">max_height_adj</property>
<property name="max-width-chars">5</property> <property name="max-width-chars">5</property>
<layout> <layout>
<property name="column">2</property> <property name="left-attach">2</property>
<property name="row">3</property> <property name="top-attach">3</property>
</layout> </layout>
</object> </object>
</child> </child>
@@ -161,16 +161,16 @@
<object class="GtkLabel"> <object class="GtkLabel">
<property name="label">Strength</property> <property name="label">Strength</property>
<layout> <layout>
<property name="column">0</property> <property name="left-attach">0</property>
<property name="row">4</property> <property name="top-attach">4</property>
</layout> </layout>
</object> </object>
</child> </child>
<child> <child>
<object class="GtkComboBoxText" id="strength"> <object class="GtkComboBoxText" id="strength">
<layout> <layout>
<property name="column">1</property> <property name="left-attach">1</property>
<property name="row">4</property> <property name="top-attach">4</property>
<property name="column-span">2</property> <property name="column-span">2</property>
</layout> </layout>
</object> </object>
@@ -180,8 +180,8 @@
<property name="label">Create</property> <property name="label">Create</property>
<signal name="clicked" handler="create_guide"/> <signal name="clicked" handler="create_guide"/>
<layout> <layout>
<property name="column">2</property> <property name="left-attach">2</property>
<property name="row">5</property> <property name="top-attach">5</property>
</layout> </layout>
</object> </object>
</child> </child>

View File

@@ -1,345 +0,0 @@
// Originally from: https://www.shadertoy.com/view/wsjBD3
// License CC0: A battered alien planet
// Been experimenting with space inspired shaders
#define PI 3.141592654
#define TAU (2.0*PI)
#define TOLERANCE 0.00001
#define MAX_ITER 65
#define MIN_DISTANCE 0.01
#define MAX_DISTANCE 9.0
const vec3 skyCol1 = vec3(0.35, 0.45, 0.6);
const vec3 skyCol2 = vec3(0.4, 0.7, 1.0);
const vec3 skyCol3 = pow(skyCol1, vec3(0.25));
const vec3 sunCol1 = vec3(1.0,0.6,0.4);
const vec3 sunCol2 = vec3(1.0,0.9,0.7);
const vec3 smallSunCol1 = vec3(1.0,0.5,0.25)*0.5;
const vec3 smallSunCol2 = vec3(1.0,0.5,0.25)*0.5;
const vec3 mountainColor = 1.0*sqrt(vec3(0.95, 0.65, 0.45));
const float cellWidth = 1.0;
const vec4 planet = vec4(80.0, -20.0, 100.0, 50.0)*1000.0;
void rot(inout vec2 p, float a) {
float c = cos(a);
float s = sin(a);
p = vec2(p.x*c + p.y*s, -p.x*s + p.y*c);
}
vec2 mod2(inout vec2 p, vec2 size) {
vec2 c = floor((p + size*0.5)/size);
p = mod(p + size*0.5,size) - size*0.5;
return c;
}
float circle(vec2 p, float r) {
return length(p) - r;
}
float egg(vec2 p, float ra, float rb) {
const float k = sqrt(3.0);
p.x = abs(p.x);
float r = ra - rb;
return ((p.y<0.0) ? length(vec2(p.x, p.y )) - r :
(k*(p.x+r)<p.y) ? length(vec2(p.x, p.y-k*r)) :
length(vec2(p.x+r,p.y )) - 2.0*r) - rb;
}
vec2 hash(vec2 p) {
p = vec2(dot (p, vec2 (127.1, 311.7)), dot (p, vec2 (269.5, 183.3)));
return -1. + 2.*fract (sin (p)*43758.5453123);
}
vec2 raySphere(vec3 ro, vec3 rd, vec4 sphere) {
vec3 center = sphere.xyz;
float radius = sphere.w;
vec3 m = ro - center.xyz;
float b = dot(m, rd);
float c = dot(m, m) - radius*radius;
if(c > 0.0 && b > 0.0) return vec2(-1.0, -1.0);
float discr = b * b - c;
if(discr < 0.0) return vec2(-1.0);
float normalMultiplier = 1.0;
float s = sqrt(discr);
float t0 = -b - s;
float t1 = -b + s;;
return vec2(t0, t1);
}
float noise1(vec2 p) {
vec2 n = mod2(p, vec2(cellWidth));
vec2 hh = hash(sqrt(2.0)*(n+1000.0));
hh.x *= hh.y;
float r = 0.225*cellWidth;
float d = circle(p, 2.0*r);
float h = hh.x*smoothstep(0.0, r, -d);
return h*0.25;
}
float noise2(vec2 p) {
vec2 n = mod2(p, vec2(cellWidth));
vec2 hh = hash(sqrt(2.0)*(n+1000.0));
hh.x *= hh.y;
rot(p, TAU*hh.y);
float r = 0.45*cellWidth;
// float d = circle(p, 1.0*r);
float d = egg(p, 0.75*r, 0.5*r*abs(hh.y));
float h = (hh.x)*smoothstep(0.0, r, -2.0*d);
return h*0.275;
}
float height(vec2 p, float dd, int mx) {
const float aa = 0.45;
const float ff = 2.03;
const float tt = 1.2;
const float oo = 3.93;
const float near = 0.25;
const float far = 0.65;
float a = 1.0;
float o = 0.2;
float s = 0.0;
float d = 0.0;
int i = 0;
for (; i < 4;++i) {
float nn = a*noise2(p);
s += nn;
d += abs(a);
p += o;
a *= aa;
p *= ff;
o *= oo;
rot(p, tt);
}
float lod = s/d;
float rdd = dd/MAX_DISTANCE;
mx = int(mix(float(4), float(mx), step(rdd, far)));
for (; i < mx; ++i) {
float nn = a*noise1(p);
s += nn;
d += abs(a);
p += o;
a *= aa;
p *= ff;
o *= oo;
rot(p, tt);
}
float hid = (s/d);
return mix(hid, lod, smoothstep(near, far, rdd));
}
float loheight(vec2 p, float d) {
return height(p, d, 0);
}
float height(vec2 p, float d) {
return height(p, d, 6);
}
float hiheight(vec2 p, float d) {
return height(p, d, 8);
}
vec3 normal(vec2 p, float d) {
vec2 eps = vec2(0.00125, 0.0);
vec3 n;
n.x = (hiheight(p - eps.xy, d) - hiheight(p + eps.xy, d));
n.y = 2.0*eps.x;
n.z = (hiheight(p - eps.yx, d) - hiheight(p + eps.yx, d));
return normalize(n);
}
const float stepLength[] = float[](0.9, 0.25);
float march(vec3 ro, vec3 rd, out int max_iter) {
float dt = 0.1;
float d = MIN_DISTANCE;
int currentStep = 0;
float lastd = d;
for (int i = 0; i < MAX_ITER; ++i)
{
vec3 p = ro + d*rd;
float h = height(p.xz, d);
if (d > MAX_DISTANCE) {
max_iter = i;
return MAX_DISTANCE;
}
float hd = p.y - h;
if (hd < TOLERANCE) {
++currentStep;
if (currentStep >= stepLength.length()) {
max_iter = i;
return d;
}
d = lastd;
continue;
}
float sl = stepLength[currentStep];
dt = max(hd, TOLERANCE)*sl + 0.0025*d;
lastd = d;
d += dt;
}
max_iter = MAX_ITER;
return MAX_DISTANCE;
}
vec3 sunDirection() {
return normalize(vec3(-0.5, 0.085, 1.0));
}
vec3 smallSunDirection() {
return normalize(vec3(-0.2, -0.05, 1.0));
}
float psin(float f) {
return 0.5 + 0.5*sin(f);
}
vec3 skyColor(vec3 ro, vec3 rd) {
vec3 sunDir = sunDirection();
vec3 smallSunDir = smallSunDirection();
float sunDot = max(dot(rd, sunDir), 0.0);
float smallSunDot = max(dot(rd, smallSunDir), 0.0);
float angle = atan(rd.y, length(rd.xz))*2.0/PI;
vec3 skyCol = mix(mix(skyCol1, skyCol2, max(0.0, angle)), skyCol3, clamp(-angle*2.0, 0.0, 1.0));
vec3 sunCol = 0.5*sunCol1*pow(sunDot, 20.0) + 8.0*sunCol2*pow(sunDot, 2000.0);
vec3 smallSunCol = 0.5*smallSunCol1*pow(smallSunDot, 200.0) + 8.0*smallSunCol2*pow(smallSunDot, 20000.0);
vec3 dust = pow(sunCol2*mountainColor, vec3(1.75))*smoothstep(0.05, -0.1, rd.y)*0.5;
vec2 si = raySphere(ro, rd, planet);
vec3 planetSurface = ro + si.x*rd;
vec3 planetNormal = normalize(planetSurface - planet.xyz);
float planetDiff = max(dot(planetNormal, sunDir), 0.0);
float planetBorder = max(dot(planetNormal, -rd), 0.0);
float planetLat = (planetSurface.x+planetSurface.y)*0.0005;
vec3 planetCol = mix(1.3*vec3(0.9, 0.8, 0.7), 0.3*vec3(0.9, 0.8, 0.7), pow(psin(planetLat+1.0)*psin(sqrt(2.0)*planetLat+2.0)*psin(sqrt(3.5)*planetLat+3.0), 0.5));
vec3 final = vec3(0.0);
final += step(0.0, si.x)*pow(planetDiff, 0.75)*planetCol*smoothstep(-0.075, 0.0, rd.y)*smoothstep(0.0, 0.1, planetBorder);
final += skyCol + sunCol + smallSunCol + dust;
return final;
}
vec3 getColor(vec3 ro, vec3 rd) {
int max_iter = 0;
vec3 skyCol = skyColor(ro, rd);
vec3 col = vec3(0);
float d = march(ro, rd, max_iter);
if (d < MAX_DISTANCE) {
vec3 sunDir = sunDirection();
vec3 osunDir = sunDir*vec3(-1.0, .0, -1.0);
vec3 p = ro + d*rd;
vec3 normal = normal(p.xz, d);
float amb = 0.2;
float dif1 = max(0.0, dot(sunDir, normal));
vec3 shd1 = sunCol2*mix(amb, 1.0, pow(dif1, 0.75));
float dif2 = max(0.0, dot(osunDir, normal));
vec3 shd2 = sunCol1*mix(amb, 1.0, pow(dif2, 0.75));
vec3 ref = reflect(rd, normal);
vec3 rcol = skyColor(p, ref);
col = mountainColor*amb*skyCol3;
col += mix(shd1, shd2, -0.5)*mountainColor;
float fre = max(dot(normal, -rd), 0.0);
fre = pow(1.0 - fre, 5.0);
col += rcol*fre*0.5;
col += (1.0*p.y);
col = tanh(col);
col = mix(col, skyCol, smoothstep(0.5*MAX_DISTANCE, 1.0*MAX_DISTANCE, d));
} else {
col = skyCol;
}
// col += vec3(1.1, 0.0, 0.0)* smoothstep(0.25, 1.0,(float(max_iter)/float(MAX_ITER)));
return col;
}
vec3 getSample1(vec2 p, float time) {
float off = 0.5*iTime;
vec3 ro = vec3(0.5, 1.0-0.25, -2.0 + off);
vec3 la = ro + vec3(0.0, -0.30, 2.0);
vec3 ww = normalize(la - ro);
vec3 uu = normalize(cross(vec3(0.0,1.0,0.0), ww));
vec3 vv = normalize(cross(ww, uu));
vec3 rd = normalize(p.x*uu + p.y*vv + 2.0*ww);
vec3 col = getColor(ro, rd) ;
return col;
}
vec3 getSample2(vec2 p, float time) {
p.y-=time*0.25;
float h = height(p, 0.0);
vec3 n = normal(p, 0.0);
vec3 lp = vec3(10.0, -1.2, 0.0);
vec3 ld = normalize(vec3(p.x, h, p.y)- lp);
float d = max(dot(ld, n), 0.0);
vec3 col = vec3(0.0);
col = vec3(1.0)*(h+0.1);
col += vec3(1.5)*pow(d, 0.75);
return col;
}
void mainImage(out vec4 fragColor, vec2 fragCoord) {
vec2 q = fragCoord.xy/iResolution.xy;
vec2 p = -1.0 + 2.0*q;
p.x *= iResolution.x/iResolution.y;
vec3 col = getSample1(p, iTime);
fragColor = vec4(col, 1.0);
}

View File

@@ -1,3 +1,4 @@
#include "config.h" #include "config.h"
#include <gtk/gtk.h> #include <gtk/gtk.h>
@@ -33,7 +34,7 @@ static void create_window (GApplication *app, const char *contents);
static void static void
show_action_dialog (GSimpleAction *action) show_action_dialog (GSimpleAction *action)
{ {
const char *name; const gchar *name;
GtkWidget *dialog; GtkWidget *dialog;
name = g_action_get_name (G_ACTION (action)); name = g_action_get_name (G_ACTION (action));
@@ -46,7 +47,7 @@ show_action_dialog (GSimpleAction *action)
name); name);
g_signal_connect (dialog, "response", g_signal_connect (dialog, "response",
G_CALLBACK (gtk_window_destroy), NULL); G_CALLBACK (gtk_widget_destroy), NULL);
gtk_widget_show (dialog); gtk_widget_show (dialog);
} }
@@ -57,9 +58,9 @@ show_action_infobar (GSimpleAction *action,
gpointer data) gpointer data)
{ {
DemoApplicationWindow *window = data; DemoApplicationWindow *window = data;
char *text; gchar *text;
const char *name; const gchar *name;
const char *value; const gchar *value;
name = g_action_get_name (G_ACTION (action)); name = g_action_get_name (G_ACTION (action));
value = g_variant_get_string (parameter, NULL); value = g_variant_get_string (parameter, NULL);
@@ -91,7 +92,7 @@ activate_new (GSimpleAction *action,
static void static void
open_response_cb (GtkNativeDialog *dialog, open_response_cb (GtkNativeDialog *dialog,
int response_id, gint response_id,
gpointer user_data) gpointer user_data)
{ {
GtkFileChooserNative *native = user_data; GtkFileChooserNative *native = user_data;
@@ -119,7 +120,7 @@ open_response_cb (GtkNativeDialog *dialog,
"Error loading file: \"%s\"", "Error loading file: \"%s\"",
error->message); error->message);
g_signal_connect (message_dialog, "response", g_signal_connect (message_dialog, "response",
G_CALLBACK (gtk_window_destroy), NULL); G_CALLBACK (gtk_widget_destroy), NULL);
gtk_widget_show (message_dialog); gtk_widget_show (message_dialog);
g_error_free (error); g_error_free (error);
} }
@@ -184,7 +185,7 @@ activate_about (GSimpleAction *action,
{ {
GtkWidget *window = user_data; GtkWidget *window = user_data;
const char *authors[] = { const gchar *authors[] = {
"Peter Mattis", "Peter Mattis",
"Spencer Kimball", "Spencer Kimball",
"Josh MacDonald", "Josh MacDonald",
@@ -192,7 +193,7 @@ activate_about (GSimpleAction *action,
NULL NULL
}; };
const char *documentors[] = { const gchar *documentors[] = {
"Owen Taylor", "Owen Taylor",
"Tony Gale", "Tony Gale",
"Matthias Clasen <mclasen@redhat.com>", "Matthias Clasen <mclasen@redhat.com>",
@@ -233,7 +234,7 @@ activate_quit (GSimpleAction *action,
win = list->data; win = list->data;
next = list->next; next = list->next;
gtk_window_destroy (GTK_WINDOW (win)); gtk_widget_destroy (GTK_WIDGET (win));
list = next; list = next;
} }
@@ -243,9 +244,9 @@ static void
update_statusbar (GtkTextBuffer *buffer, update_statusbar (GtkTextBuffer *buffer,
DemoApplicationWindow *window) DemoApplicationWindow *window)
{ {
char *msg; gchar *msg;
int row, col; gint row, col;
int count; gint count;
GtkTextIter iter; GtkTextIter iter;
/* clear any previous message, underflow is allowed */ /* clear any previous message, underflow is allowed */
@@ -327,14 +328,19 @@ static void
startup (GApplication *app) startup (GApplication *app)
{ {
GtkBuilder *builder; GtkBuilder *builder;
GMenuModel *appmenu;
GMenuModel *menubar;
G_APPLICATION_CLASS (demo_application_parent_class)->startup (app); G_APPLICATION_CLASS (demo_application_parent_class)->startup (app);
builder = gtk_builder_new (); builder = gtk_builder_new ();
gtk_builder_add_from_resource (builder, "/application_demo/menus.ui", NULL); gtk_builder_add_from_resource (builder, "/application_demo/menus.ui", NULL);
gtk_application_set_menubar (GTK_APPLICATION (app), appmenu = (GMenuModel *)gtk_builder_get_object (builder, "appmenu");
G_MENU_MODEL (gtk_builder_get_object (builder, "menubar"))); menubar = (GMenuModel *)gtk_builder_get_object (builder, "menubar");
gtk_application_set_app_menu (GTK_APPLICATION (app), appmenu);
gtk_application_set_menubar (GTK_APPLICATION (app), menubar);
g_object_unref (builder); g_object_unref (builder);
} }
@@ -347,7 +353,6 @@ create_window (GApplication *app,
window = (DemoApplicationWindow *)g_object_new (demo_application_window_get_type (), window = (DemoApplicationWindow *)g_object_new (demo_application_window_get_type (),
"application", app, "application", app,
"show-menubar", TRUE,
NULL); NULL);
if (content) if (content)
gtk_text_buffer_set_text (window->buffer, content, -1); gtk_text_buffer_set_text (window->buffer, content, -1);
@@ -472,11 +477,11 @@ static void
surface_state_changed (GtkWidget *widget) surface_state_changed (GtkWidget *widget)
{ {
DemoApplicationWindow *window = (DemoApplicationWindow *)widget; DemoApplicationWindow *window = (DemoApplicationWindow *)widget;
GdkToplevelState new_state; GdkSurfaceState new_state;
new_state = gdk_toplevel_get_state (GDK_TOPLEVEL (gtk_native_get_surface (GTK_NATIVE (widget)))); new_state = gdk_toplevel_get_state (GDK_TOPLEVEL (gtk_native_get_surface (GTK_NATIVE (widget))));
window->maximized = (new_state & GDK_TOPLEVEL_STATE_MAXIMIZED) != 0; window->maximized = (new_state & GDK_SURFACE_STATE_MAXIMIZED) != 0;
window->fullscreen = (new_state & GDK_TOPLEVEL_STATE_FULLSCREEN) != 0; window->fullscreen = (new_state & GDK_SURFACE_STATE_FULLSCREEN) != 0;
} }
static void static void

View File

@@ -31,8 +31,8 @@
</object> </object>
</child> </child>
<layout> <layout>
<property name="column">0</property> <property name="left-attach">0</property>
<property name="row">0</property> <property name="top-attach">0</property>
</layout> </layout>
</object> </object>
</child> </child>
@@ -54,8 +54,8 @@
</object> </object>
</child> </child>
<layout> <layout>
<property name="column">0</property> <property name="left-attach">0</property>
<property name="row">1</property> <property name="top-attach">1</property>
</layout> </layout>
</object> </object>
</child> </child>
@@ -70,8 +70,8 @@
</object> </object>
</child> </child>
<layout> <layout>
<property name="column">0</property> <property name="left-attach">0</property>
<property name="row">2</property> <property name="top-attach">2</property>
</layout> </layout>
</object> </object>
</child> </child>
@@ -79,8 +79,8 @@
<object class="GtkStatusbar" id="status"> <object class="GtkStatusbar" id="status">
<property name="hexpand">1</property> <property name="hexpand">1</property>
<layout> <layout>
<property name="column">0</property> <property name="left-attach">0</property>
<property name="row">3</property> <property name="top-attach">3</property>
</layout> </layout>
</object> </object>
</child> </child>

View File

@@ -16,8 +16,8 @@ static GtkWidget *placeholder;
static void static void
on_name_appeared (GDBusConnection *connection, on_name_appeared (GDBusConnection *connection,
const char *name, const gchar *name,
const char *name_owner, const gchar *name_owner,
gpointer user_data) gpointer user_data)
{ {
name_seen = TRUE; name_seen = TRUE;
@@ -25,13 +25,18 @@ on_name_appeared (GDBusConnection *connection,
static void static void
on_name_vanished (GDBusConnection *connection, on_name_vanished (GDBusConnection *connection,
const char *name, const gchar *name,
gpointer user_data) gpointer user_data)
{ {
if (!name_seen) if (!name_seen)
return; return;
g_clear_object (&placeholder); if (placeholder)
{
gtk_widget_destroy (placeholder);
g_object_unref (placeholder);
placeholder = NULL;
}
} }
#ifdef G_OS_WIN32 #ifdef G_OS_WIN32
@@ -55,7 +60,7 @@ do_application_demo (GtkWidget *toplevel)
if (placeholder == NULL) if (placeholder == NULL)
{ {
const char *command; const gchar *command;
GError *error = NULL; GError *error = NULL;
if (g_file_test ("./gtk4-demo-application" APP_EXTENSION, G_FILE_TEST_IS_EXECUTABLE)) if (g_file_test ("./gtk4-demo-application" APP_EXTENSION, G_FILE_TEST_IS_EXECUTABLE))

18
demos/gtk-demo/appmenu.ui Normal file
View File

@@ -0,0 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<menu id="appmenu">
<section>
<item>
<attribute name="label" translatable="yes">About</attribute>
<attribute name="action">app.about</attribute>
</item>
</section>
<section>
<item>
<attribute name="label" translatable="yes">_Quit</attribute>
<attribute name="action">app.quit</attribute>
<attribute name="accel">&lt;Control&gt;q</attribute>
</item>
</section>
</menu>
</interface>

View File

@@ -1,8 +1,8 @@
/* Assistant /* Assistant
* *
* Demonstrates a sample multi-step assistant with GtkAssistant. Assistants * Demonstrates a sample multi-step assistant. Assistants are used to divide
* are used to divide an operation into several simpler sequential steps, * an operation into several simpler sequential steps, and to guide the user
* and to guide the user through these steps. * through these steps.
*/ */
#include <gtk/gtk.h> #include <gtk/gtk.h>
@@ -12,7 +12,7 @@ static GtkWidget *progress_bar = NULL;
static gboolean static gboolean
apply_changes_gradually (gpointer data) apply_changes_gradually (gpointer data)
{ {
double fraction; gdouble fraction;
/* Work, work, work... */ /* Work, work, work... */
fraction = gtk_progress_bar_get_fraction (GTK_PROGRESS_BAR (progress_bar)); fraction = gtk_progress_bar_get_fraction (GTK_PROGRESS_BAR (progress_bar));
@@ -26,7 +26,7 @@ apply_changes_gradually (gpointer data)
else else
{ {
/* Close automatically once changes are fully applied. */ /* Close automatically once changes are fully applied. */
gtk_window_destroy (GTK_WINDOW (data)); gtk_widget_destroy (data);
return G_SOURCE_REMOVE; return G_SOURCE_REMOVE;
} }
} }
@@ -41,14 +41,14 @@ on_assistant_apply (GtkWidget *widget, gpointer data)
static void static void
on_assistant_close_cancel (GtkWidget *widget, gpointer data) on_assistant_close_cancel (GtkWidget *widget, gpointer data)
{ {
gtk_window_destroy (GTK_WINDOW (widget)); gtk_widget_destroy (widget);
} }
static void static void
on_assistant_prepare (GtkWidget *widget, GtkWidget *page, gpointer data) on_assistant_prepare (GtkWidget *widget, GtkWidget *page, gpointer data)
{ {
int current_page, n_pages; gint current_page, n_pages;
char *title; gchar *title;
current_page = gtk_assistant_get_current_page (GTK_ASSISTANT (widget)); current_page = gtk_assistant_get_current_page (GTK_ASSISTANT (widget));
n_pages = gtk_assistant_get_n_pages (GTK_ASSISTANT (widget)); n_pages = gtk_assistant_get_n_pages (GTK_ASSISTANT (widget));
@@ -70,8 +70,8 @@ on_entry_changed (GtkWidget *widget, gpointer data)
{ {
GtkAssistant *assistant = GTK_ASSISTANT (data); GtkAssistant *assistant = GTK_ASSISTANT (data);
GtkWidget *current_page; GtkWidget *current_page;
int page_number; gint page_number;
const char *text; const gchar *text;
page_number = gtk_assistant_get_current_page (assistant); page_number = gtk_assistant_get_current_page (assistant);
current_page = gtk_assistant_get_nth_page (assistant, page_number); current_page = gtk_assistant_get_nth_page (assistant, page_number);
@@ -95,12 +95,12 @@ create_page1 (GtkWidget *assistant)
gtk_widget_set_margin_bottom (box, 12); gtk_widget_set_margin_bottom (box, 12);
label = gtk_label_new ("You must fill out this entry to continue:"); label = gtk_label_new ("You must fill out this entry to continue:");
gtk_box_append (GTK_BOX (box), label); gtk_container_add (GTK_CONTAINER (box), label);
entry = gtk_entry_new (); entry = gtk_entry_new ();
gtk_entry_set_activates_default (GTK_ENTRY (entry), TRUE); gtk_entry_set_activates_default (GTK_ENTRY (entry), TRUE);
gtk_widget_set_valign (entry, GTK_ALIGN_CENTER); gtk_widget_set_valign (entry, GTK_ALIGN_CENTER);
gtk_box_append (GTK_BOX (box), entry); gtk_container_add (GTK_CONTAINER (box), entry);
g_signal_connect (G_OBJECT (entry), "changed", g_signal_connect (G_OBJECT (entry), "changed",
G_CALLBACK (on_entry_changed), assistant); G_CALLBACK (on_entry_changed), assistant);
@@ -123,7 +123,7 @@ create_page2 (GtkWidget *assistant)
checkbutton = gtk_check_button_new_with_label ("This is optional data, you may continue " checkbutton = gtk_check_button_new_with_label ("This is optional data, you may continue "
"even if you do not check this"); "even if you do not check this");
gtk_widget_set_valign (checkbutton, GTK_ALIGN_CENTER); gtk_widget_set_valign (checkbutton, GTK_ALIGN_CENTER);
gtk_box_append (GTK_BOX (box), checkbutton); gtk_container_add (GTK_CONTAINER (box), checkbutton);
gtk_assistant_append_page (GTK_ASSISTANT (assistant), box); gtk_assistant_append_page (GTK_ASSISTANT (assistant), box);
gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), box, TRUE); gtk_assistant_set_page_complete (GTK_ASSISTANT (assistant), box, TRUE);
@@ -178,7 +178,8 @@ do_assistant (GtkWidget *do_widget)
gtk_window_set_display (GTK_WINDOW (assistant), gtk_window_set_display (GTK_WINDOW (assistant),
gtk_widget_get_display (do_widget)); gtk_widget_get_display (do_widget));
g_object_add_weak_pointer (G_OBJECT (assistant), (gpointer *)&assistant); g_signal_connect (assistant, "destroy",
G_CALLBACK (gtk_widget_destroyed), &assistant);
create_page1 (assistant); create_page1 (assistant);
create_page2 (assistant); create_page2 (assistant);
@@ -198,7 +199,7 @@ do_assistant (GtkWidget *do_widget)
if (!gtk_widget_get_visible (assistant)) if (!gtk_widget_get_visible (assistant))
gtk_widget_show (assistant); gtk_widget_show (assistant);
else else
gtk_window_destroy (GTK_WINDOW (assistant)); gtk_widget_destroy (assistant);
return assistant; return assistant;
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

View File

@@ -8,10 +8,6 @@
<property name="default-height">300</property> <property name="default-height">300</property>
<child> <child>
<object class="GtkGrid"> <object class="GtkGrid">
<property name="margin-start">12</property>
<property name="margin-end">12</property>
<property name="margin-top">12</property>
<property name="margin-bottom">12</property>
<property name="row-spacing">12</property> <property name="row-spacing">12</property>
<property name="column-spacing">12</property> <property name="column-spacing">12</property>
<child> <child>
@@ -22,8 +18,8 @@
<class name="dim-label"/> <class name="dim-label"/>
</style> </style>
<layout> <layout>
<property name="column">0</property> <property name="left-attach">0</property>
<property name="row">0</property> <property name="top-attach">0</property>
</layout> </layout>
</object> </object>
</child> </child>
@@ -33,8 +29,8 @@
<property name="has-frame">1</property> <property name="has-frame">1</property>
<property name="min-content-width">150</property> <property name="min-content-width">150</property>
<layout> <layout>
<property name="column">0</property> <property name="left-attach">0</property>
<property name="row">1</property> <property name="top-attach">1</property>
</layout> </layout>
</object> </object>
</child> </child>
@@ -44,8 +40,8 @@
<property name="hexpand">1</property> <property name="hexpand">1</property>
<property name="stack">stack</property> <property name="stack">stack</property>
<layout> <layout>
<property name="column">1</property> <property name="left-attach">1</property>
<property name="row">0</property> <property name="top-attach">0</property>
</layout> </layout>
</object> </object>
</child> </child>
@@ -71,8 +67,8 @@
<object class="GtkLabel"> <object class="GtkLabel">
<property name="label" translatable="yes">Duck</property> <property name="label" translatable="yes">Duck</property>
<layout> <layout>
<property name="column">0</property> <property name="left-attach">0</property>
<property name="row">0</property> <property name="top-attach">0</property>
</layout> </layout>
</object> </object>
</child> </child>
@@ -80,8 +76,8 @@
<object class="GtkLabel"> <object class="GtkLabel">
<property name="label" translatable="yes">Background</property> <property name="label" translatable="yes">Background</property>
<layout> <layout>
<property name="column">1</property> <property name="left-attach">1</property>
<property name="row">0</property> <property name="top-attach">0</property>
</layout> </layout>
</object> </object>
</child> </child>
@@ -91,8 +87,8 @@
<class name="duck"/> <class name="duck"/>
</style> </style>
<layout> <layout>
<property name="column">0</property> <property name="left-attach">0</property>
<property name="row">1</property> <property name="top-attach">1</property>
</layout> </layout>
</object> </object>
</child> </child>
@@ -102,8 +98,8 @@
<class name="gradient"/> <class name="gradient"/>
</style> </style>
<layout> <layout>
<property name="column">1</property> <property name="left-attach">1</property>
<property name="row">1</property> <property name="top-attach">1</property>
</layout> </layout>
</object> </object>
</child> </child>
@@ -112,8 +108,8 @@
<property name="label" translatable="yes"> <property name="label" translatable="yes">
Blended picture</property> Blended picture</property>
<layout> <layout>
<property name="column">0</property> <property name="left-attach">0</property>
<property name="row">2</property> <property name="top-attach">2</property>
<property name="column-span">2</property> <property name="column-span">2</property>
</layout> </layout>
</object> </object>
@@ -125,8 +121,8 @@ Blended picture</property>
<class name="blend0"/> <class name="blend0"/>
</style> </style>
<layout> <layout>
<property name="column">0</property> <property name="left-attach">0</property>
<property name="row">3</property> <property name="top-attach">3</property>
<property name="column-span">2</property> <property name="column-span">2</property>
</layout> </layout>
</object> </object>
@@ -150,8 +146,8 @@ Blended picture</property>
<object class="GtkLabel"> <object class="GtkLabel">
<property name="label" translatable="yes">Red</property> <property name="label" translatable="yes">Red</property>
<layout> <layout>
<property name="column">0</property> <property name="left-attach">0</property>
<property name="row">0</property> <property name="top-attach">0</property>
</layout> </layout>
</object> </object>
</child> </child>
@@ -159,8 +155,8 @@ Blended picture</property>
<object class="GtkLabel"> <object class="GtkLabel">
<property name="label" translatable="yes">Blue</property> <property name="label" translatable="yes">Blue</property>
<layout> <layout>
<property name="column">1</property> <property name="left-attach">1</property>
<property name="row">0</property> <property name="top-attach">0</property>
</layout> </layout>
</object> </object>
</child> </child>
@@ -170,8 +166,8 @@ Blended picture</property>
<class name="red"/> <class name="red"/>
</style> </style>
<layout> <layout>
<property name="column">0</property> <property name="left-attach">0</property>
<property name="row">1</property> <property name="top-attach">1</property>
</layout> </layout>
</object> </object>
</child> </child>
@@ -181,8 +177,8 @@ Blended picture</property>
<class name="blue"/> <class name="blue"/>
</style> </style>
<layout> <layout>
<property name="column">1</property> <property name="left-attach">1</property>
<property name="row">1</property> <property name="top-attach">1</property>
</layout> </layout>
</object> </object>
</child> </child>
@@ -191,8 +187,8 @@ Blended picture</property>
<property name="label" translatable="yes"> <property name="label" translatable="yes">
Blended picture</property> Blended picture</property>
<layout> <layout>
<property name="column">0</property> <property name="left-attach">0</property>
<property name="row">2</property> <property name="top-attach">2</property>
<property name="column-span">2</property> <property name="column-span">2</property>
</layout> </layout>
</object> </object>
@@ -204,8 +200,8 @@ Blended picture</property>
<class name="blend1"/> <class name="blend1"/>
</style> </style>
<layout> <layout>
<property name="column">0</property> <property name="left-attach">0</property>
<property name="row">3</property> <property name="top-attach">3</property>
<property name="column-span">2</property> <property name="column-span">2</property>
</layout> </layout>
</object> </object>
@@ -232,8 +228,8 @@ Blended picture</property>
<class name="cyan"/> <class name="cyan"/>
</style> </style>
<layout> <layout>
<property name="column">0</property> <property name="left-attach">0</property>
<property name="row">1</property> <property name="top-attach">1</property>
</layout> </layout>
</object> </object>
</child> </child>
@@ -243,8 +239,8 @@ Blended picture</property>
<class name="magenta"/> <class name="magenta"/>
</style> </style>
<layout> <layout>
<property name="column">1</property> <property name="left-attach">1</property>
<property name="row">1</property> <property name="top-attach">1</property>
</layout> </layout>
</object> </object>
</child> </child>
@@ -254,8 +250,8 @@ Blended picture</property>
<class name="yellow"/> <class name="yellow"/>
</style> </style>
<layout> <layout>
<property name="column">0</property> <property name="left-attach">0</property>
<property name="row">3</property> <property name="top-attach">3</property>
</layout> </layout>
</object> </object>
</child> </child>
@@ -266,8 +262,8 @@ Blended picture</property>
<class name="blend2"/> <class name="blend2"/>
</style> </style>
<layout> <layout>
<property name="column">1</property> <property name="left-attach">1</property>
<property name="row">3</property> <property name="top-attach">3</property>
</layout> </layout>
</object> </object>
</child> </child>
@@ -279,8 +275,8 @@ Blended picture</property>
<class name="dim-label"/> <class name="dim-label"/>
</style> </style>
<layout> <layout>
<property name="column">0</property> <property name="left-attach">0</property>
<property name="row">0</property> <property name="top-attach">0</property>
</layout> </layout>
</object> </object>
</child> </child>
@@ -292,8 +288,8 @@ Blended picture</property>
<class name="dim-label"/> <class name="dim-label"/>
</style> </style>
<layout> <layout>
<property name="column">1</property> <property name="left-attach">1</property>
<property name="row">0</property> <property name="top-attach">0</property>
</layout> </layout>
</object> </object>
</child> </child>
@@ -305,8 +301,8 @@ Blended picture</property>
<class name="dim-label"/> <class name="dim-label"/>
</style> </style>
<layout> <layout>
<property name="column">0</property> <property name="left-attach">0</property>
<property name="row">2</property> <property name="top-attach">2</property>
</layout> </layout>
</object> </object>
</child> </child>
@@ -318,8 +314,8 @@ Blended picture</property>
<attribute name="weight" value="bold"></attribute> <attribute name="weight" value="bold"></attribute>
</attributes> </attributes>
<layout> <layout>
<property name="column">1</property> <property name="left-attach">1</property>
<property name="row">2</property> <property name="top-attach">2</property>
</layout> </layout>
</object> </object>
</child> </child>
@@ -328,8 +324,8 @@ Blended picture</property>
</object> </object>
</child> </child>
<layout> <layout>
<property name="column">1</property> <property name="left-attach">1</property>
<property name="row">1</property> <property name="top-attach">1</property>
</layout> </layout>
</object> </object>
</child> </child>

View File

@@ -132,10 +132,10 @@ blur_overlay_child_update_style_classes (BlurOverlay *overlay,
gboolean is_left, is_right, is_top, is_bottom; gboolean is_left, is_right, is_top, is_bottom;
gboolean has_left, has_right, has_top, has_bottom; gboolean has_left, has_right, has_top, has_bottom;
has_left = gtk_widget_has_css_class (child, "left"); has_left = gtk_widget_has_css_class (child, GTK_STYLE_CLASS_LEFT);
has_right = gtk_widget_has_css_class (child, "right"); has_right = gtk_widget_has_css_class (child, GTK_STYLE_CLASS_RIGHT);
has_top = gtk_widget_has_css_class (child, "top"); has_top = gtk_widget_has_css_class (child, GTK_STYLE_CLASS_TOP);
has_bottom = gtk_widget_has_css_class (child, "bottom"); has_bottom = gtk_widget_has_css_class (child, GTK_STYLE_CLASS_BOTTOM);
is_left = is_right = is_top = is_bottom = FALSE; is_left = is_right = is_top = is_bottom = FALSE;
@@ -158,24 +158,24 @@ blur_overlay_child_update_style_classes (BlurOverlay *overlay,
is_bottom = (child_allocation->y + child_allocation->height == height); is_bottom = (child_allocation->y + child_allocation->height == height);
if (has_left && !is_left) if (has_left && !is_left)
gtk_widget_remove_css_class (child, "left"); gtk_widget_remove_css_class (child, GTK_STYLE_CLASS_LEFT);
else if (!has_left && is_left) else if (!has_left && is_left)
gtk_widget_add_css_class (child, "left"); gtk_widget_add_css_class (child, GTK_STYLE_CLASS_LEFT);
if (has_right && !is_right) if (has_right && !is_right)
gtk_widget_remove_css_class (child, "right"); gtk_widget_remove_css_class (child, GTK_STYLE_CLASS_RIGHT);
else if (!has_right && is_right) else if (!has_right && is_right)
gtk_widget_add_css_class (child, "right"); gtk_widget_add_css_class (child, GTK_STYLE_CLASS_RIGHT);
if (has_top && !is_top) if (has_top && !is_top)
gtk_widget_remove_css_class (child, "top"); gtk_widget_remove_css_class (child, GTK_STYLE_CLASS_TOP);
else if (!has_top && is_top) else if (!has_top && is_top)
gtk_widget_add_css_class (child, "top"); gtk_widget_add_css_class (child, GTK_STYLE_CLASS_TOP);
if (has_bottom && !is_bottom) if (has_bottom && !is_bottom)
gtk_widget_remove_css_class (child, "bottom"); gtk_widget_remove_css_class (child, GTK_STYLE_CLASS_BOTTOM);
else if (!has_bottom && is_bottom) else if (!has_bottom && is_bottom)
gtk_widget_add_css_class (child, "bottom"); gtk_widget_add_css_class (child, GTK_STYLE_CLASS_BOTTOM);
} }
static void static void

View File

@@ -1,8 +1,6 @@
/* Builder /* Builder
* #Keywords: GMenu, GtkPopoverMenuBar, GtkBuilder, GtkStatusBar, toolbar
* *
* Demonstrates a traditional interface, loaded from a XML description, * Demonstrates an interface loaded from a XML description.
* and shows how to connect actions to the menu items and toolbar buttons.
*/ */
#include <gtk/gtk.h> #include <gtk/gtk.h>
@@ -14,7 +12,7 @@ quit_activate (GSimpleAction *action,
{ {
GtkWidget *window = user_data; GtkWidget *window = user_data;
gtk_window_destroy (GTK_WINDOW (window)); gtk_widget_destroy (window);
} }
static void static void
@@ -23,38 +21,13 @@ about_activate (GSimpleAction *action,
gpointer user_data) gpointer user_data)
{ {
GtkWidget *window = user_data; GtkWidget *window = user_data;
GtkBuilder *builder;
GtkWidget *about_dlg; GtkWidget *about_dlg;
about_dlg = GTK_WIDGET (g_object_get_data (G_OBJECT (window), "about")); builder = g_object_get_data (G_OBJECT (window), "builder");
gtk_window_present (GTK_WINDOW (about_dlg)); about_dlg = GTK_WIDGET (gtk_builder_get_object (builder, "aboutdialog1"));
} gtk_dialog_run (GTK_DIALOG (about_dlg));
gtk_widget_hide (about_dlg);
static void
remove_timeout (gpointer data)
{
guint id = GPOINTER_TO_UINT (data);
g_source_remove (id);
}
static gboolean
pop_status (gpointer data)
{
gtk_statusbar_pop (GTK_STATUSBAR (data), 0);
g_object_set_data (G_OBJECT (data), "timeout", NULL);
return G_SOURCE_REMOVE;
}
static void
status_message (GtkStatusbar *status,
const char *text)
{
guint id;
gtk_statusbar_push (GTK_STATUSBAR (status), 0, text);
id = g_timeout_add (5000, pop_status, status);
g_object_set_data_full (G_OBJECT (status), "timeout", GUINT_TO_POINTER (id), remove_timeout);
} }
static void static void
@@ -62,10 +35,7 @@ help_activate (GSimpleAction *action,
GVariant *parameter, GVariant *parameter,
gpointer user_data) gpointer user_data)
{ {
GtkWidget *status; g_print ("Help not available\n");
status = GTK_WIDGET (g_object_get_data (G_OBJECT (user_data), "status"));
status_message (GTK_STATUSBAR (status), "Help not available");
} }
static void static void
@@ -73,13 +43,7 @@ not_implemented (GSimpleAction *action,
GVariant *parameter, GVariant *parameter,
gpointer user_data) gpointer user_data)
{ {
GtkWidget *status; g_print ("Action “%s” not implemented\n", g_action_get_name (G_ACTION (action)));
char *text;
text = g_strdup_printf ("Action “%s” not implemented", g_action_get_name (G_ACTION (action)));
status = GTK_WIDGET (g_object_get_data (G_OBJECT (user_data), "status"));
status_message (GTK_STATUSBAR (status), text);
g_free (text);
} }
static GActionEntry win_entries[] = { static GActionEntry win_entries[] = {
@@ -104,74 +68,27 @@ do_builder (GtkWidget *do_widget)
if (!window) if (!window)
{ {
GtkBuilder *builder; GtkBuilder *builder;
GtkWidget *about;
GtkWidget *status;
GtkEventController *controller;
builder = gtk_builder_new_from_resource ("/builder/demo.ui"); builder = gtk_builder_new_from_resource ("/builder/demo.ui");
window = GTK_WIDGET (gtk_builder_get_object (builder, "window1")); window = GTK_WIDGET (gtk_builder_get_object (builder, "window1"));
gtk_window_set_display (GTK_WINDOW (window), gtk_window_set_display (GTK_WINDOW (window),
gtk_widget_get_display (do_widget)); gtk_widget_get_display (do_widget));
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window); g_signal_connect (window, "destroy",
G_CALLBACK (gtk_widget_destroyed), &window);
actions = (GActionGroup*)g_simple_action_group_new (); actions = (GActionGroup*)g_simple_action_group_new ();
g_action_map_add_action_entries (G_ACTION_MAP (actions), g_action_map_add_action_entries (G_ACTION_MAP (actions),
win_entries, G_N_ELEMENTS (win_entries), win_entries, G_N_ELEMENTS (win_entries),
window); window);
gtk_widget_insert_action_group (window, "win", actions); gtk_widget_insert_action_group (window, "win", actions);
controller = gtk_shortcut_controller_new (); g_object_set_data_full (G_OBJECT(window), "builder", builder, g_object_unref);
gtk_shortcut_controller_set_scope (GTK_SHORTCUT_CONTROLLER (controller),
GTK_SHORTCUT_SCOPE_GLOBAL);
gtk_widget_add_controller (window, controller);
gtk_shortcut_controller_add_shortcut (GTK_SHORTCUT_CONTROLLER (controller),
gtk_shortcut_new (gtk_keyval_trigger_new (GDK_KEY_n, GDK_CONTROL_MASK),
gtk_named_action_new ("win.new")));
gtk_shortcut_controller_add_shortcut (GTK_SHORTCUT_CONTROLLER (controller),
gtk_shortcut_new (gtk_keyval_trigger_new (GDK_KEY_o, GDK_CONTROL_MASK),
gtk_named_action_new ("win.open")));
gtk_shortcut_controller_add_shortcut (GTK_SHORTCUT_CONTROLLER (controller),
gtk_shortcut_new (gtk_keyval_trigger_new (GDK_KEY_s, GDK_CONTROL_MASK),
gtk_named_action_new ("win.save")));
gtk_shortcut_controller_add_shortcut (GTK_SHORTCUT_CONTROLLER (controller),
gtk_shortcut_new (gtk_keyval_trigger_new (GDK_KEY_s, GDK_CONTROL_MASK|GDK_SHIFT_MASK),
gtk_named_action_new ("win.save-as")));
gtk_shortcut_controller_add_shortcut (GTK_SHORTCUT_CONTROLLER (controller),
gtk_shortcut_new (gtk_keyval_trigger_new (GDK_KEY_q, GDK_CONTROL_MASK),
gtk_named_action_new ("win.quit")));
gtk_shortcut_controller_add_shortcut (GTK_SHORTCUT_CONTROLLER (controller),
gtk_shortcut_new (gtk_keyval_trigger_new (GDK_KEY_c, GDK_CONTROL_MASK),
gtk_named_action_new ("win.copy")));
gtk_shortcut_controller_add_shortcut (GTK_SHORTCUT_CONTROLLER (controller),
gtk_shortcut_new (gtk_keyval_trigger_new (GDK_KEY_x, GDK_CONTROL_MASK),
gtk_named_action_new ("win.cut")));
gtk_shortcut_controller_add_shortcut (GTK_SHORTCUT_CONTROLLER (controller),
gtk_shortcut_new (gtk_keyval_trigger_new (GDK_KEY_v, GDK_CONTROL_MASK),
gtk_named_action_new ("win.paste")));
gtk_shortcut_controller_add_shortcut (GTK_SHORTCUT_CONTROLLER (controller),
gtk_shortcut_new (gtk_keyval_trigger_new (GDK_KEY_F1, 0),
gtk_named_action_new ("win.help")));
gtk_shortcut_controller_add_shortcut (GTK_SHORTCUT_CONTROLLER (controller),
gtk_shortcut_new (gtk_keyval_trigger_new (GDK_KEY_F7, 0),
gtk_named_action_new ("win.about")));
about = GTK_WIDGET (gtk_builder_get_object (builder, "aboutdialog1"));
gtk_window_set_transient_for (GTK_WINDOW (about), GTK_WINDOW (window));
gtk_window_set_hide_on_close (GTK_WINDOW (about), TRUE);
g_signal_connect (about, "response", G_CALLBACK (gtk_widget_hide), NULL);
g_object_set_data_full (G_OBJECT (window), "about",
about, (GDestroyNotify)gtk_window_destroy);
status = GTK_WIDGET (gtk_builder_get_object (builder, "statusbar1"));
g_object_set_data (G_OBJECT (window), "status", status);
g_object_unref (builder);
} }
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
gtk_widget_show (window); gtk_widget_show (window);
else else
gtk_window_destroy (GTK_WINDOW (window)); gtk_widget_destroy (window);
return window; return window;
} }

View File

@@ -69,7 +69,7 @@ paste_received (GObject *source_object,
"Could not paste text: %s", "Could not paste text: %s",
error->message); error->message);
g_signal_connect (dialog, "response", g_signal_connect (dialog, "response",
G_CALLBACK (gtk_window_destroy), NULL); G_CALLBACK (gtk_widget_destroy), NULL);
gtk_widget_show (dialog); gtk_widget_show (dialog);
g_error_free (error); g_error_free (error);
@@ -108,7 +108,9 @@ do_clipboard (GtkWidget *do_widget)
gtk_window_set_display (GTK_WINDOW (window), gtk_window_set_display (GTK_WINDOW (window),
gtk_widget_get_display (do_widget)); gtk_widget_get_display (do_widget));
gtk_window_set_title (GTK_WINDOW (window), "Clipboard"); gtk_window_set_title (GTK_WINDOW (window), "Clipboard");
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
g_signal_connect (window, "destroy",
G_CALLBACK (gtk_widget_destroyed), &window);
vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
gtk_widget_set_margin_start (vbox, 8); gtk_widget_set_margin_start (vbox, 8);
@@ -120,72 +122,72 @@ do_clipboard (GtkWidget *do_widget)
label = gtk_label_new ("\"Copy\" will copy the text\nin the entry to the clipboard"); label = gtk_label_new ("\"Copy\" will copy the text\nin the entry to the clipboard");
gtk_box_append (GTK_BOX (vbox), label); gtk_container_add (GTK_CONTAINER (vbox), label);
hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 4); hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 4);
gtk_widget_set_margin_start (hbox, 8); gtk_widget_set_margin_start (hbox, 8);
gtk_widget_set_margin_end (hbox, 8); gtk_widget_set_margin_end (hbox, 8);
gtk_widget_set_margin_top (hbox, 8); gtk_widget_set_margin_top (hbox, 8);
gtk_widget_set_margin_bottom (hbox, 8); gtk_widget_set_margin_bottom (hbox, 8);
gtk_box_append (GTK_BOX (vbox), hbox); gtk_container_add (GTK_CONTAINER (vbox), hbox);
/* Create the first entry */ /* Create the first entry */
entry = gtk_entry_new (); entry = gtk_entry_new ();
gtk_box_append (GTK_BOX (hbox), entry); gtk_container_add (GTK_CONTAINER (hbox), entry);
/* Create the button */ /* Create the button */
button = gtk_button_new_with_mnemonic (_("_Copy")); button = gtk_button_new_with_mnemonic (_("_Copy"));
gtk_box_append (GTK_BOX (hbox), button); gtk_container_add (GTK_CONTAINER (hbox), button);
g_signal_connect (button, "clicked", g_signal_connect (button, "clicked",
G_CALLBACK (copy_button_clicked), entry); G_CALLBACK (copy_button_clicked), entry);
label = gtk_label_new ("\"Paste\" will paste the text from the clipboard to the entry"); label = gtk_label_new ("\"Paste\" will paste the text from the clipboard to the entry");
gtk_box_append (GTK_BOX (vbox), label); gtk_container_add (GTK_CONTAINER (vbox), label);
hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 4); hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 4);
gtk_widget_set_margin_start (hbox, 8); gtk_widget_set_margin_start (hbox, 8);
gtk_widget_set_margin_end (hbox, 8); gtk_widget_set_margin_end (hbox, 8);
gtk_widget_set_margin_top (hbox, 8); gtk_widget_set_margin_top (hbox, 8);
gtk_widget_set_margin_bottom (hbox, 8); gtk_widget_set_margin_bottom (hbox, 8);
gtk_box_append (GTK_BOX (vbox), hbox); gtk_container_add (GTK_CONTAINER (vbox), hbox);
/* Create the second entry */ /* Create the second entry */
entry = gtk_entry_new (); entry = gtk_entry_new ();
gtk_box_append (GTK_BOX (hbox), entry); gtk_container_add (GTK_CONTAINER (hbox), entry);
/* Create the button */ /* Create the button */
button = gtk_button_new_with_mnemonic (_("_Paste")); button = gtk_button_new_with_mnemonic (_("_Paste"));
gtk_box_append (GTK_BOX (hbox), button); gtk_container_add (GTK_CONTAINER (hbox), button);
g_signal_connect (button, "clicked", g_signal_connect (button, "clicked",
G_CALLBACK (paste_button_clicked), entry); G_CALLBACK (paste_button_clicked), entry);
label = gtk_label_new ("Images can be transferred via the clipboard, too"); label = gtk_label_new ("Images can be transferred via the clipboard, too");
gtk_box_append (GTK_BOX (vbox), label); gtk_container_add (GTK_CONTAINER (vbox), label);
hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 4); hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 4);
gtk_widget_set_margin_start (hbox, 8); gtk_widget_set_margin_start (hbox, 8);
gtk_widget_set_margin_end (hbox, 8); gtk_widget_set_margin_end (hbox, 8);
gtk_widget_set_margin_top (hbox, 8); gtk_widget_set_margin_top (hbox, 8);
gtk_widget_set_margin_bottom (hbox, 8); gtk_widget_set_margin_bottom (hbox, 8);
gtk_box_append (GTK_BOX (vbox), hbox); gtk_container_add (GTK_CONTAINER (vbox), hbox);
/* Create the first image */ /* Create the first image */
image = demo_image_new ("dialog-warning"); image = demo_image_new ("dialog-warning");
gtk_box_append (GTK_BOX (hbox), image); gtk_container_add (GTK_CONTAINER (hbox), image);
/* Create the second image */ /* Create the second image */
image = demo_image_new ("process-stop"); image = demo_image_new ("process-stop");
gtk_box_append (GTK_BOX (hbox), image); gtk_container_add (GTK_CONTAINER (hbox), image);
/* Create the third image */ /* Create the third image */
image = demo_image_new ("weather-clear"); image = demo_image_new ("weather-clear");
gtk_box_append (GTK_BOX (hbox), image); gtk_container_add (GTK_CONTAINER (hbox), image);
} }
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
gtk_widget_show (window); gtk_widget_show (window);
else else
gtk_window_destroy (GTK_WINDOW (window)); gtk_widget_destroy (window);
return window; return window;
} }

View File

@@ -1,224 +0,0 @@
// Originally from: https://www.shadertoy.com/view/3ljyDD
// License CC0: Hexagonal tiling + cog wheels
// Nothing fancy, just hexagonal tiling + cog wheels
#define PI 3.141592654
#define TAU (2.0*PI)
#define MROT(a) mat2(cos(a), sin(a), -sin(a), cos(a))
float hash(in vec2 co) {
return fract(sin(dot(co.xy ,vec2(12.9898,58.233))) * 13758.5453);
}
float pcos(float a) {
return 0.5 + 0.5*cos(a);
}
void rot(inout vec2 p, float a) {
float c = cos(a);
float s = sin(a);
p = vec2(c*p.x + s*p.y, -s*p.x + c*p.y);
}
float modPolar(inout vec2 p, float repetitions) {
float angle = 2.0*PI/repetitions;
float a = atan(p.y, p.x) + angle/2.;
float r = length(p);
float c = floor(a/angle);
a = mod(a,angle) - angle/2.;
p = vec2(cos(a), sin(a))*r;
// For an odd number of repetitions, fix cell index of the cell in -x direction
// (cell index would be e.g. -5 and 5 in the two halves of the cell):
if (abs(c) >= (repetitions/2.0)) c = abs(c);
return c;
}
float pmin(float a, float b, float k) {
float h = clamp( 0.5+0.5*(b-a)/k, 0.0, 1.0 );
return mix( b, a, h ) - k*h*(1.0-h);
}
const vec2 sz = vec2(1.0, sqrt(3.0));
const vec2 hsz = 0.5*sz;
const float smallCount = 16.0;
vec2 hextile(inout vec2 p) {
// See Art of Code: Hexagonal Tiling Explained!
// https://www.youtube.com/watch?v=VmrIDyYiJBA
vec2 p1 = mod(p, sz)-hsz;
vec2 p2 = mod(p - hsz*1.0, sz)-hsz;
vec2 p3 = mix(p2, p1, vec2(length(p1) < length(p2)));
vec2 n = p3 - p;
p = p3;
return n;
}
float circle(vec2 p, float r) {
return length(p) - r;
}
float box(vec2 p, vec2 b) {
vec2 d = abs(p)-b;
return length(max(d,0.0)) + min(max(d.x,d.y),0.0);
}
float unevenCapsule(vec2 p, float r1, float r2, float h) {
p.x = abs(p.x);
float b = (r1-r2)/h;
float a = sqrt(1.0-b*b);
float k = dot(p,vec2(-b,a));
if( k < 0.0 ) return length(p) - r1;
if( k > a*h ) return length(p-vec2(0.0,h)) - r2;
return dot(p, vec2(a,b) ) - r1;
}
float cogwheel(vec2 p, float innerRadius, float outerRadius, float cogs, float holes) {
float cogWidth = 0.25*innerRadius*TAU/cogs;
float d0 = circle(p, innerRadius);
vec2 icp = p;
modPolar(icp, holes);
icp -= vec2(innerRadius*0.55, 0.0);
float d1 = circle(icp, innerRadius*0.25);
vec2 cp = p;
modPolar(cp, cogs);
cp -= vec2(innerRadius, 0.0);
float d2 = unevenCapsule(cp.yx, cogWidth, cogWidth*0.75, (outerRadius-innerRadius));
float d3 = circle(p, innerRadius*0.20);
float d = 1E6;
d = min(d, d0);
d = pmin(d, d2, 0.5*cogWidth);
d = min(d, d2);
d = max(d, -d1);
d = max(d, -d3);
return d;
}
float ccell1(vec2 p, float r) {
float d = 1E6;
const float bigCount = 60.0;
vec2 cp0 = p;
rot(cp0, -iTime*TAU/bigCount);
float d0 = cogwheel(cp0, 0.36, 0.38, bigCount, 5.0);
vec2 cp1 = p;
float nm = modPolar(cp1, 6.0);
cp1 -= vec2(0.5, 0.0);
rot(cp1, 0.2+TAU*nm/2.0 + iTime*TAU/smallCount);
float d1 = cogwheel(cp1, 0.11, 0.125, smallCount, 5.0);
d = min(d, d0);
d = min(d, d1);
return d;
}
float ccell2(vec2 p, float r) {
float d = 1E6;
vec2 cp0 = p;
float nm = modPolar(cp0, 6.0);
vec2 cp1 = cp0;
const float off = 0.275;
const float count = smallCount + 2.0;
cp0 -= vec2(off, 0.0);
rot(cp0, 0.+TAU*nm/2.0 - iTime*TAU/count);
float d0 = cogwheel(cp0, 0.09, 0.105, count, 5.0);
cp1 -= vec2(0.5, 0.0);
rot(cp1, 0.2+TAU*nm/2.0 + iTime*TAU/smallCount);
float d1 = cogwheel(cp1, 0.11, 0.125, smallCount, 5.0);
float l = length(p);
float d2 = l - (off+0.055);
float d3 = d2 + 0.020;;
vec2 tp0 = p;
modPolar(tp0, 60.0);
tp0.x -= off;
float d4 = box(tp0, vec2(0.0125, 0.005));
float ctime = -(iTime*0.05 + r)*TAU;
vec2 tp1 = p;
rot(tp1, ctime*12.0);
tp1.x -= 0.13;
float d5 = box(tp1, vec2(0.125, 0.005));
vec2 tp2 = p;
rot(tp2, ctime);
tp2.x -= 0.13*0.5;
float d6 = box(tp2, vec2(0.125*0.5, 0.0075));
float d7 = l - 0.025;
float d8 = l - 0.0125;
d = min(d, d0);
d = min(d, d1);
d = min(d, d2);
d = max(d, -d3);
d = min(d, d4);
d = min(d, d5);
d = min(d, d6);
d = min(d, d7);
d = max(d, -d8);
return d;
}
float df(vec2 p, float scale, inout vec2 nn) {
p /= scale;
nn = hextile(p);
nn = round(nn);
float r = hash(nn);
float d;;
if (r < 0.5) {
d = ccell1(p, r);
} else {
d = ccell2(p, r);
}
return d*scale;
}
vec3 postProcess(vec3 col, vec2 q) {
//col = saturate(col);
col=pow(clamp(col,0.0,1.0),vec3(0.75));
col=col*0.6+0.4*col*col*(3.0-2.0*col); // contrast
col=mix(col, vec3(dot(col, vec3(0.33))), -0.4); // satuation
col*=0.5+0.5*pow(19.0*q.x*q.y*(1.0-q.x)*(1.0-q.y),0.7); // vigneting
return col;
}
void mainImage(out vec4 fragColor, vec2 fragCoord) {
vec2 q = fragCoord/iResolution.xy;
vec2 p = -1.0 + 2.0*q;
p.x *= iResolution.x/iResolution.y;
float tm = iTime*0.1;
p += vec2(cos(tm), sin(tm*sqrt(0.5)));
float z = mix(0.5, 1.0, pcos(tm*sqrt(0.3)));
float aa = 4.0 / iResolution.y;
vec2 nn = vec2(0.0);
float d = df(p, z, nn);
vec3 col = vec3(160.0)/vec3(255.0);
vec3 baseCol = vec3(0.3);
vec4 logoCol = vec4(baseCol, 1.0)*smoothstep(-aa, 0.0, -d);
col = mix(col, logoCol.xyz, pow(logoCol.w, 8.0));
col += 0.4*pow(abs(sin(20.0*d)), 0.6);
col = postProcess(col, q);
fragColor = vec4(col, 1.0);
}

View File

@@ -1,226 +0,0 @@
uniform float iTime;
// Originally from: https://www.shadertoy.com/view/3ljyDD
// License CC0: Hexagonal tiling + cog wheels
// Nothing fancy, just hexagonal tiling + cog wheels
#define PI 3.141592654
#define TAU (2.0*PI)
#define MROT(a) mat2(cos(a), sin(a), -sin(a), cos(a))
float hash(in vec2 co) {
return fract(sin(dot(co.xy ,vec2(12.9898,58.233))) * 13758.5453);
}
float pcos(float a) {
return 0.5 + 0.5*cos(a);
}
void rot(inout vec2 p, float a) {
float c = cos(a);
float s = sin(a);
p = vec2(c*p.x + s*p.y, -s*p.x + c*p.y);
}
float modPolar(inout vec2 p, float repetitions) {
float angle = 2.0*PI/repetitions;
float a = atan(p.y, p.x) + angle/2.;
float r = length(p);
float c = floor(a/angle);
a = mod(a,angle) - angle/2.;
p = vec2(cos(a), sin(a))*r;
// For an odd number of repetitions, fix cell index of the cell in -x direction
// (cell index would be e.g. -5 and 5 in the two halves of the cell):
if (abs(c) >= (repetitions/2.0)) c = abs(c);
return c;
}
float pmin(float a, float b, float k) {
float h = clamp( 0.5+0.5*(b-a)/k, 0.0, 1.0 );
return mix( b, a, h ) - k*h*(1.0-h);
}
const vec2 sz = vec2(1.0, sqrt(3.0));
const vec2 hsz = 0.5*sz;
const float smallCount = 16.0;
vec2 hextile(inout vec2 p) {
// See Art of Code: Hexagonal Tiling Explained!
// https://www.youtube.com/watch?v=VmrIDyYiJBA
vec2 p1 = mod(p, sz)-hsz;
vec2 p2 = mod(p - hsz*1.0, sz)-hsz;
vec2 p3 = mix(p2, p1, vec2(length(p1) < length(p2)));
vec2 n = p3 - p;
p = p3;
return n;
}
float circle(vec2 p, float r) {
return length(p) - r;
}
float box(vec2 p, vec2 b) {
vec2 d = abs(p)-b;
return length(max(d,0.0)) + min(max(d.x,d.y),0.0);
}
float unevenCapsule(vec2 p, float r1, float r2, float h) {
p.x = abs(p.x);
float b = (r1-r2)/h;
float a = sqrt(1.0-b*b);
float k = dot(p,vec2(-b,a));
if( k < 0.0 ) return length(p) - r1;
if( k > a*h ) return length(p-vec2(0.0,h)) - r2;
return dot(p, vec2(a,b) ) - r1;
}
float cogwheel(vec2 p, float innerRadius, float outerRadius, float cogs, float holes) {
float cogWidth = 0.25*innerRadius*TAU/cogs;
float d0 = circle(p, innerRadius);
vec2 icp = p;
modPolar(icp, holes);
icp -= vec2(innerRadius*0.55, 0.0);
float d1 = circle(icp, innerRadius*0.25);
vec2 cp = p;
modPolar(cp, cogs);
cp -= vec2(innerRadius, 0.0);
float d2 = unevenCapsule(cp.yx, cogWidth, cogWidth*0.75, (outerRadius-innerRadius));
float d3 = circle(p, innerRadius*0.20);
float d = 1E6;
d = min(d, d0);
d = pmin(d, d2, 0.5*cogWidth);
d = min(d, d2);
d = max(d, -d1);
d = max(d, -d3);
return d;
}
float ccell1(vec2 p, float r) {
float d = 1E6;
const float bigCount = 60.0;
vec2 cp0 = p;
rot(cp0, -iTime*TAU/bigCount);
float d0 = cogwheel(cp0, 0.36, 0.38, bigCount, 5.0);
vec2 cp1 = p;
float nm = modPolar(cp1, 6.0);
cp1 -= vec2(0.5, 0.0);
rot(cp1, 0.2+TAU*nm/2.0 + iTime*TAU/smallCount);
float d1 = cogwheel(cp1, 0.11, 0.125, smallCount, 5.0);
d = min(d, d0);
d = min(d, d1);
return d;
}
float ccell2(vec2 p, float r) {
float d = 1E6;
vec2 cp0 = p;
float nm = modPolar(cp0, 6.0);
vec2 cp1 = cp0;
const float off = 0.275;
const float count = smallCount + 2.0;
cp0 -= vec2(off, 0.0);
rot(cp0, 0.+TAU*nm/2.0 - iTime*TAU/count);
float d0 = cogwheel(cp0, 0.09, 0.105, count, 5.0);
cp1 -= vec2(0.5, 0.0);
rot(cp1, 0.2+TAU*nm/2.0 + iTime*TAU/smallCount);
float d1 = cogwheel(cp1, 0.11, 0.125, smallCount, 5.0);
float l = length(p);
float d2 = l - (off+0.055);
float d3 = d2 + 0.020;;
vec2 tp0 = p;
modPolar(tp0, 60.0);
tp0.x -= off;
float d4 = box(tp0, vec2(0.0125, 0.005));
float ctime = -(iTime*0.05 + r)*TAU;
vec2 tp1 = p;
rot(tp1, ctime*12.0);
tp1.x -= 0.13;
float d5 = box(tp1, vec2(0.125, 0.005));
vec2 tp2 = p;
rot(tp2, ctime);
tp2.x -= 0.13*0.5;
float d6 = box(tp2, vec2(0.125*0.5, 0.0075));
float d7 = l - 0.025;
float d8 = l - 0.0125;
d = min(d, d0);
d = min(d, d1);
d = min(d, d2);
d = max(d, -d3);
d = min(d, d4);
d = min(d, d5);
d = min(d, d6);
d = min(d, d7);
d = max(d, -d8);
return d;
}
float df(vec2 p, float scale, inout vec2 nn) {
p /= scale;
nn = hextile(p);
nn = round(nn);
float r = hash(nn);
float d;;
if (r < 0.5) {
d = ccell1(p, r);
} else {
d = ccell2(p, r);
}
return d*scale;
}
vec3 postProcess(vec3 col, vec2 q) {
//col = saturate(col);
col=pow(clamp(col,0.0,1.0),vec3(0.75));
col=col*0.6+0.4*col*col*(3.0-2.0*col); // contrast
col=mix(col, vec3(dot(col, vec3(0.33))), -0.4); // satuation
col*=0.5+0.5*pow(19.0*q.x*q.y*(1.0-q.x)*(1.0-q.y),0.7); // vigneting
return col;
}
void mainImage(out vec4 fragColor, in vec2 fragCoord, in vec2 resolution, in vec2 uv) {
vec2 q = fragCoord/resolution.xy;
vec2 p = -1.0 + 2.0*q;
p.x *= resolution.x/resolution.y;
float tm = iTime*0.1;
p += vec2(cos(tm), sin(tm*sqrt(0.5)));
float z = mix(0.5, 1.0, pcos(tm*sqrt(0.3)));
float aa = 4.0 / resolution.y;
vec2 nn = vec2(0.0);
float d = df(p, z, nn);
vec3 col = vec3(160.0)/vec3(255.0);
vec3 baseCol = vec3(0.3);
vec4 logoCol = vec4(baseCol, 1.0)*smoothstep(-aa, 0.0, -d);
col = mix(col, logoCol.xyz, pow(logoCol.w, 8.0));
col += 0.4*pow(abs(sin(20.0*d)), 0.6);
col = postProcess(col, q);
fragColor = vec4(col, 1.0);
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,5 +1,4 @@
/* Combo Boxes /* Combo Boxes
* #Keywords: GtkCellRenderer
* *
* The GtkComboBox widget allows to select one option out of a list. * The GtkComboBox widget allows to select one option out of a list.
* The GtkComboBoxEntry additionally allows the user to enter a value * The GtkComboBoxEntry additionally allows the user to enter a value
@@ -39,7 +38,7 @@ create_icon_store (void)
GtkTreeIter iter; GtkTreeIter iter;
GtkListStore *store; GtkListStore *store;
int i; gint i;
store = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_STRING); store = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_STRING);
@@ -78,7 +77,7 @@ set_sensitive (GtkCellLayout *cell_layout,
gpointer data) gpointer data)
{ {
GtkTreePath *path; GtkTreePath *path;
int *indices; gint *indices;
gboolean sensitive; gboolean sensitive;
path = gtk_tree_model_get_path (tree_model, iter); path = gtk_tree_model_get_path (tree_model, iter);
@@ -176,7 +175,7 @@ create_capital_store (void)
GtkTreeIter iter, iter2; GtkTreeIter iter, iter2;
GtkTreeStore *store; GtkTreeStore *store;
int i; gint i;
store = gtk_tree_store_new (1, G_TYPE_STRING); store = gtk_tree_store_new (1, G_TYPE_STRING);
@@ -316,7 +315,9 @@ do_combobox (GtkWidget *do_widget)
gtk_window_set_display (GTK_WINDOW (window), gtk_window_set_display (GTK_WINDOW (window),
gtk_widget_get_display (do_widget)); gtk_widget_get_display (do_widget));
gtk_window_set_title (GTK_WINDOW (window), "Combo Boxes"); gtk_window_set_title (GTK_WINDOW (window), "Combo Boxes");
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
g_signal_connect (window, "destroy",
G_CALLBACK (gtk_widget_destroyed), &window);
vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 2); vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 2);
gtk_widget_set_margin_start (vbox, 10); gtk_widget_set_margin_start (vbox, 10);
@@ -329,7 +330,7 @@ do_combobox (GtkWidget *do_widget)
* insensitive rows * insensitive rows
*/ */
frame = gtk_frame_new ("Items with icons"); frame = gtk_frame_new ("Items with icons");
gtk_box_append (GTK_BOX (vbox), frame); gtk_container_add (GTK_CONTAINER (vbox), frame);
box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
gtk_widget_set_margin_start (box, 5); gtk_widget_set_margin_start (box, 5);
@@ -341,7 +342,7 @@ do_combobox (GtkWidget *do_widget)
model = create_icon_store (); model = create_icon_store ();
combo = gtk_combo_box_new_with_model (model); combo = gtk_combo_box_new_with_model (model);
g_object_unref (model); g_object_unref (model);
gtk_box_append (GTK_BOX (box), combo); gtk_container_add (GTK_CONTAINER (box), combo);
renderer = gtk_cell_renderer_pixbuf_new (); renderer = gtk_cell_renderer_pixbuf_new ();
gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combo), renderer, FALSE); gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combo), renderer, FALSE);
@@ -373,7 +374,7 @@ do_combobox (GtkWidget *do_widget)
/* A combobox demonstrating trees. /* A combobox demonstrating trees.
*/ */
frame = gtk_frame_new ("Where are we ?"); frame = gtk_frame_new ("Where are we ?");
gtk_box_append (GTK_BOX (vbox), frame); gtk_container_add (GTK_CONTAINER (vbox), frame);
box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
gtk_widget_set_margin_start (box, 5); gtk_widget_set_margin_start (box, 5);
@@ -385,7 +386,7 @@ do_combobox (GtkWidget *do_widget)
model = create_capital_store (); model = create_capital_store ();
combo = gtk_combo_box_new_with_model (model); combo = gtk_combo_box_new_with_model (model);
g_object_unref (model); g_object_unref (model);
gtk_box_append (GTK_BOX (box), combo); gtk_container_add (GTK_CONTAINER (box), combo);
renderer = gtk_cell_renderer_text_new (); renderer = gtk_cell_renderer_text_new ();
gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combo), renderer, TRUE); gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combo), renderer, TRUE);
@@ -404,7 +405,7 @@ do_combobox (GtkWidget *do_widget)
/* A GtkComboBoxEntry with validation */ /* A GtkComboBoxEntry with validation */
frame = gtk_frame_new ("Editable"); frame = gtk_frame_new ("Editable");
gtk_box_append (GTK_BOX (vbox), frame); gtk_container_add (GTK_CONTAINER (vbox), frame);
box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
gtk_widget_set_margin_start (box, 5); gtk_widget_set_margin_start (box, 5);
@@ -415,7 +416,7 @@ do_combobox (GtkWidget *do_widget)
combo = gtk_combo_box_text_new_with_entry (); combo = gtk_combo_box_text_new_with_entry ();
fill_combo_entry (combo); fill_combo_entry (combo);
gtk_box_append (GTK_BOX (box), combo); gtk_container_add (GTK_CONTAINER (box), combo);
entry = g_object_new (TYPE_MASK_ENTRY, NULL); entry = g_object_new (TYPE_MASK_ENTRY, NULL);
MASK_ENTRY (entry)->mask = "^([0-9]*|One|Two|2\302\275|Three)$"; MASK_ENTRY (entry)->mask = "^([0-9]*|One|Two|2\302\275|Three)$";
@@ -424,7 +425,7 @@ do_combobox (GtkWidget *do_widget)
/* A combobox with string IDs */ /* A combobox with string IDs */
frame = gtk_frame_new ("String IDs"); frame = gtk_frame_new ("String IDs");
gtk_box_append (GTK_BOX (vbox), frame); gtk_container_add (GTK_CONTAINER (vbox), frame);
box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
gtk_widget_set_margin_start (box, 5); gtk_widget_set_margin_start (box, 5);
@@ -437,19 +438,19 @@ do_combobox (GtkWidget *do_widget)
gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (combo), "never", "Not visible"); gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (combo), "never", "Not visible");
gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (combo), "when-active", "Visible when active"); gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (combo), "when-active", "Visible when active");
gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (combo), "always", "Always visible"); gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (combo), "always", "Always visible");
gtk_box_append (GTK_BOX (box), combo); gtk_container_add (GTK_CONTAINER (box), combo);
entry = gtk_entry_new (); entry = gtk_entry_new ();
g_object_bind_property (combo, "active-id", g_object_bind_property (combo, "active-id",
entry, "text", entry, "text",
G_BINDING_BIDIRECTIONAL); G_BINDING_BIDIRECTIONAL);
gtk_box_append (GTK_BOX (box), entry); gtk_container_add (GTK_CONTAINER (box), entry);
} }
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
gtk_widget_show (window); gtk_widget_show (window);
else else
gtk_window_destroy (GTK_WINDOW (window)); gtk_widget_destroy (window);
return window; return window;
} }

View File

@@ -1,5 +1,4 @@
/* Constraints/Simple /* Constraints/Simple
* #Keywords: GtkLayoutManager
* *
* GtkConstraintLayout provides a layout manager that uses relations * GtkConstraintLayout provides a layout manager that uses relations
* between widgets (also known as "constraints") to compute the position * between widgets (also known as "constraints") to compute the position
@@ -26,9 +25,9 @@ simple_grid_dispose (GObject *object)
{ {
SimpleGrid *self = SIMPLE_GRID (object); SimpleGrid *self = SIMPLE_GRID (object);
g_clear_pointer (&self->button1, gtk_widget_unparent); g_clear_pointer (&self->button1, gtk_widget_destroy);
g_clear_pointer (&self->button2, gtk_widget_unparent); g_clear_pointer (&self->button2, gtk_widget_destroy);
g_clear_pointer (&self->button3, gtk_widget_unparent); g_clear_pointer (&self->button3, gtk_widget_destroy);
G_OBJECT_CLASS (simple_grid_parent_class)->dispose (object); G_OBJECT_CLASS (simple_grid_parent_class)->dispose (object);
} }
@@ -255,12 +254,17 @@ do_constraints (GtkWidget *do_widget)
if (!window) if (!window)
{ {
GtkWidget *box, *grid; GtkWidget *header, *box, *grid, *button;
window = gtk_window_new (); window = gtk_window_new ();
gtk_window_set_display (GTK_WINDOW (window), gtk_widget_get_display (do_widget)); gtk_window_set_display (GTK_WINDOW (window), gtk_widget_get_display (do_widget));
gtk_window_set_title (GTK_WINDOW (window), "Constraints"); gtk_window_set_title (GTK_WINDOW (window), "Constraints");
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
header = gtk_header_bar_new ();
gtk_header_bar_set_show_title_buttons (GTK_HEADER_BAR (header), FALSE);
gtk_window_set_titlebar (GTK_WINDOW (window), header);
g_signal_connect (window, "destroy",
G_CALLBACK (gtk_widget_destroyed), &window);
box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12); box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12);
gtk_window_set_child (GTK_WINDOW (window), box); gtk_window_set_child (GTK_WINDOW (window), box);
@@ -268,13 +272,19 @@ do_constraints (GtkWidget *do_widget)
grid = g_object_new (simple_grid_get_type (), NULL); grid = g_object_new (simple_grid_get_type (), NULL);
gtk_widget_set_hexpand (grid, TRUE); gtk_widget_set_hexpand (grid, TRUE);
gtk_widget_set_vexpand (grid, TRUE); gtk_widget_set_vexpand (grid, TRUE);
gtk_box_append (GTK_BOX (box), grid); gtk_container_add (GTK_CONTAINER (box), grid);
button = gtk_button_new_with_label ("Close");
gtk_container_add (GTK_CONTAINER (box), button);
gtk_widget_set_hexpand (grid, TRUE);
g_signal_connect_swapped (button, "clicked",
G_CALLBACK (gtk_widget_destroy), window);
} }
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
gtk_widget_show (window); gtk_widget_show (window);
else else
gtk_window_destroy (GTK_WINDOW (window)); gtk_widget_destroy (window);
return window; return window;
} }

View File

@@ -1,8 +1,7 @@
/* Constraints/Interactive /* Constraints/Interactive
* #Keywords: GtkConstraintLayout
* *
* Demonstrate how constraints can be updates during user interaction. * Demonstrate how constraints can be updates during
* The vertical edge between the buttons can be dragged with the mouse. * user interaction.
*/ */
#include <glib/gi18n.h> #include <glib/gi18n.h>
@@ -27,9 +26,9 @@ interactive_grid_dispose (GObject *object)
{ {
InteractiveGrid *self = INTERACTIVE_GRID (object); InteractiveGrid *self = INTERACTIVE_GRID (object);
g_clear_pointer (&self->button1, gtk_widget_unparent); g_clear_pointer (&self->button1, gtk_widget_destroy);
g_clear_pointer (&self->button2, gtk_widget_unparent); g_clear_pointer (&self->button2, gtk_widget_destroy);
g_clear_pointer (&self->button3, gtk_widget_unparent); g_clear_pointer (&self->button3, gtk_widget_destroy);
G_OBJECT_CLASS (interactive_grid_parent_class)->dispose (object); G_OBJECT_CLASS (interactive_grid_parent_class)->dispose (object);
} }
@@ -211,12 +210,17 @@ do_constraints2 (GtkWidget *do_widget)
if (!window) if (!window)
{ {
GtkWidget *box, *grid; GtkWidget *header, *box, *grid, *button;
window = gtk_window_new (); window = gtk_window_new ();
gtk_window_set_display (GTK_WINDOW (window), gtk_widget_get_display (do_widget)); gtk_window_set_display (GTK_WINDOW (window), gtk_widget_get_display (do_widget));
gtk_window_set_title (GTK_WINDOW (window), "Constraints"); gtk_window_set_title (GTK_WINDOW (window), "Constraints");
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
header = gtk_header_bar_new ();
gtk_header_bar_set_show_title_buttons (GTK_HEADER_BAR (header), FALSE);
gtk_window_set_titlebar (GTK_WINDOW (window), header);
g_signal_connect (window, "destroy",
G_CALLBACK (gtk_widget_destroyed), &window);
box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12); box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12);
gtk_window_set_child (GTK_WINDOW (window), box); gtk_window_set_child (GTK_WINDOW (window), box);
@@ -224,13 +228,19 @@ do_constraints2 (GtkWidget *do_widget)
grid = g_object_new (interactive_grid_get_type (), NULL); grid = g_object_new (interactive_grid_get_type (), NULL);
gtk_widget_set_hexpand (grid, TRUE); gtk_widget_set_hexpand (grid, TRUE);
gtk_widget_set_vexpand (grid, TRUE); gtk_widget_set_vexpand (grid, TRUE);
gtk_box_append (GTK_BOX (box), grid); gtk_container_add (GTK_CONTAINER (box), grid);
button = gtk_button_new_with_label ("Close");
gtk_container_add (GTK_CONTAINER (box), button);
gtk_widget_set_hexpand (grid, TRUE);
g_signal_connect_swapped (button, "clicked",
G_CALLBACK (gtk_widget_destroy), window);
} }
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
gtk_widget_show (window); gtk_widget_show (window);
else else
gtk_window_destroy (GTK_WINDOW (window)); gtk_widget_destroy (window);
return window; return window;
} }

View File

@@ -24,9 +24,9 @@ vfl_grid_dispose (GObject *object)
{ {
VflGrid *self = VFL_GRID (object); VflGrid *self = VFL_GRID (object);
g_clear_pointer (&self->button1, gtk_widget_unparent); g_clear_pointer (&self->button1, gtk_widget_destroy);
g_clear_pointer (&self->button2, gtk_widget_unparent); g_clear_pointer (&self->button2, gtk_widget_destroy);
g_clear_pointer (&self->button3, gtk_widget_unparent); g_clear_pointer (&self->button3, gtk_widget_destroy);
G_OBJECT_CLASS (vfl_grid_parent_class)->dispose (object); G_OBJECT_CLASS (vfl_grid_parent_class)->dispose (object);
} }
@@ -130,12 +130,17 @@ do_constraints3 (GtkWidget *do_widget)
if (!window) if (!window)
{ {
GtkWidget *box, *grid; GtkWidget *header, *box, *grid, *button;
window = gtk_window_new (); window = gtk_window_new ();
gtk_window_set_display (GTK_WINDOW (window), gtk_widget_get_display (do_widget)); gtk_window_set_display (GTK_WINDOW (window), gtk_widget_get_display (do_widget));
gtk_window_set_title (GTK_WINDOW (window), "Constraints"); gtk_window_set_title (GTK_WINDOW (window), "Constraints");
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
header = gtk_header_bar_new ();
gtk_header_bar_set_show_title_buttons (GTK_HEADER_BAR (header), FALSE);
gtk_window_set_titlebar (GTK_WINDOW (window), header);
g_signal_connect (window, "destroy",
G_CALLBACK (gtk_widget_destroyed), &window);
box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12); box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12);
gtk_window_set_child (GTK_WINDOW (window), box); gtk_window_set_child (GTK_WINDOW (window), box);
@@ -143,13 +148,19 @@ do_constraints3 (GtkWidget *do_widget)
grid = g_object_new (vfl_grid_get_type (), NULL); grid = g_object_new (vfl_grid_get_type (), NULL);
gtk_widget_set_hexpand (grid, TRUE); gtk_widget_set_hexpand (grid, TRUE);
gtk_widget_set_vexpand (grid, TRUE); gtk_widget_set_vexpand (grid, TRUE);
gtk_box_append (GTK_BOX (box), grid); gtk_container_add (GTK_CONTAINER (box), grid);
button = gtk_button_new_with_label ("Close");
gtk_container_add (GTK_CONTAINER (box), button);
gtk_widget_set_hexpand (grid, TRUE);
g_signal_connect_swapped (button, "clicked",
G_CALLBACK (gtk_widget_destroy), window);
} }
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
gtk_widget_show (window); gtk_widget_show (window);
else else
gtk_window_destroy (GTK_WINDOW (window)); gtk_widget_destroy (window);
return window; return window;
} }

View File

@@ -1,6 +1,7 @@
/* Theming/CSS Accordion /* Theming/CSS Accordion
* *
* A simple accordion demo written using CSS transitions and multiple backgrounds * A simple accordion demo written using CSS transitions and multiple backgrounds
*
*/ */
#include <gtk/gtk.h> #include <gtk/gtk.h>
@@ -8,13 +9,9 @@
static void static void
apply_css (GtkWidget *widget, GtkStyleProvider *provider) apply_css (GtkWidget *widget, GtkStyleProvider *provider)
{ {
GtkWidget *child;
gtk_style_context_add_provider (gtk_widget_get_style_context (widget), provider, G_MAXUINT); gtk_style_context_add_provider (gtk_widget_get_style_context (widget), provider, G_MAXUINT);
for (child = gtk_widget_get_first_child (widget); if (GTK_IS_CONTAINER (widget))
child != NULL; gtk_container_forall (GTK_CONTAINER (widget), (GtkCallback) apply_css, provider);
child = gtk_widget_get_next_sibling (child))
apply_css (child, provider);
} }
GtkWidget * GtkWidget *
@@ -31,7 +28,8 @@ do_css_accordion (GtkWidget *do_widget)
gtk_window_set_title (GTK_WINDOW (window), "CSS Accordion"); gtk_window_set_title (GTK_WINDOW (window), "CSS Accordion");
gtk_window_set_transient_for (GTK_WINDOW (window), GTK_WINDOW (do_widget)); gtk_window_set_transient_for (GTK_WINDOW (window), GTK_WINDOW (do_widget));
gtk_window_set_default_size (GTK_WINDOW (window), 600, 300); gtk_window_set_default_size (GTK_WINDOW (window), 600, 300);
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window); g_signal_connect (window, "destroy",
G_CALLBACK (gtk_widget_destroyed), &window);
container = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); container = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
gtk_widget_set_halign (container, GTK_ALIGN_CENTER); gtk_widget_set_halign (container, GTK_ALIGN_CENTER);
@@ -39,22 +37,22 @@ do_css_accordion (GtkWidget *do_widget)
gtk_window_set_child (GTK_WINDOW (window), container); gtk_window_set_child (GTK_WINDOW (window), container);
child = gtk_button_new_with_label ("This"); child = gtk_button_new_with_label ("This");
gtk_box_append (GTK_BOX (container), child); gtk_container_add (GTK_CONTAINER (container), child);
child = gtk_button_new_with_label ("Is"); child = gtk_button_new_with_label ("Is");
gtk_box_append (GTK_BOX (container), child); gtk_container_add (GTK_CONTAINER (container), child);
child = gtk_button_new_with_label ("A"); child = gtk_button_new_with_label ("A");
gtk_box_append (GTK_BOX (container), child); gtk_container_add (GTK_CONTAINER (container), child);
child = gtk_button_new_with_label ("CSS"); child = gtk_button_new_with_label ("CSS");
gtk_box_append (GTK_BOX (container), child); gtk_container_add (GTK_CONTAINER (container), child);
child = gtk_button_new_with_label ("Accordion"); child = gtk_button_new_with_label ("Accordion");
gtk_box_append (GTK_BOX (container), child); gtk_container_add (GTK_CONTAINER (container), child);
child = gtk_button_new_with_label (":-)"); child = gtk_button_new_with_label (":-)");
gtk_box_append (GTK_BOX (container), child); gtk_container_add (GTK_CONTAINER (container), child);
provider = GTK_STYLE_PROVIDER (gtk_css_provider_new ()); provider = GTK_STYLE_PROVIDER (gtk_css_provider_new ());
gtk_css_provider_load_from_resource (GTK_CSS_PROVIDER (provider), "/css_accordion/css_accordion.css"); gtk_css_provider_load_from_resource (GTK_CSS_PROVIDER (provider), "/css_accordion/css_accordion.css");
@@ -65,7 +63,7 @@ do_css_accordion (GtkWidget *do_widget)
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
gtk_widget_show (window); gtk_widget_show (window);
else else
gtk_window_destroy (GTK_WINDOW (window)); gtk_widget_destroy (window);
return window; return window;
} }

View File

@@ -1,7 +1,8 @@
/* Theming/CSS Basics /* Theming/CSS Basics
* *
* GTK themes are written using CSS. Every widget is build of multiple items * Gtk themes are written using CSS. Every widget is build of multiple items
* that you can style very similarly to a regular website. * that you can style very similarly to a regular website.
*
*/ */
#include <gtk/gtk.h> #include <gtk/gtk.h>
@@ -54,13 +55,9 @@ css_text_changed (GtkTextBuffer *buffer,
static void static void
apply_css (GtkWidget *widget, GtkStyleProvider *provider) apply_css (GtkWidget *widget, GtkStyleProvider *provider)
{ {
GtkWidget *child;
gtk_style_context_add_provider (gtk_widget_get_style_context (widget), provider, G_MAXUINT); gtk_style_context_add_provider (gtk_widget_get_style_context (widget), provider, G_MAXUINT);
for (child = gtk_widget_get_first_child (widget); if (GTK_IS_CONTAINER (widget))
child != NULL; gtk_container_forall (GTK_CONTAINER (widget), (GtkCallback) apply_css, provider);
child = gtk_widget_get_next_sibling (child))
apply_css (child, provider);
} }
GtkWidget * GtkWidget *
@@ -79,7 +76,8 @@ do_css_basics (GtkWidget *do_widget)
gtk_window_set_title (GTK_WINDOW (window), "CSS Basics"); gtk_window_set_title (GTK_WINDOW (window), "CSS Basics");
gtk_window_set_transient_for (GTK_WINDOW (window), GTK_WINDOW (do_widget)); gtk_window_set_transient_for (GTK_WINDOW (window), GTK_WINDOW (do_widget));
gtk_window_set_default_size (GTK_WINDOW (window), 400, 300); gtk_window_set_default_size (GTK_WINDOW (window), 400, 300);
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window); g_signal_connect (window, "destroy",
G_CALLBACK (gtk_widget_destroyed), &window);
text = gtk_text_buffer_new (NULL); text = gtk_text_buffer_new (NULL);
gtk_text_buffer_create_tag (text, gtk_text_buffer_create_tag (text,
@@ -93,10 +91,10 @@ do_css_basics (GtkWidget *do_widget)
provider = GTK_STYLE_PROVIDER (gtk_css_provider_new ()); provider = GTK_STYLE_PROVIDER (gtk_css_provider_new ());
container = gtk_scrolled_window_new (); container = gtk_scrolled_window_new (NULL, NULL);
gtk_window_set_child (GTK_WINDOW (window), container); gtk_window_set_child (GTK_WINDOW (window), container);
child = gtk_text_view_new_with_buffer (text); child = gtk_text_view_new_with_buffer (text);
gtk_scrolled_window_set_child (GTK_SCROLLED_WINDOW (container), child); gtk_container_add (GTK_CONTAINER (container), child);
g_signal_connect (text, "changed", g_signal_connect (text, "changed",
G_CALLBACK (css_text_changed), provider); G_CALLBACK (css_text_changed), provider);
@@ -115,7 +113,7 @@ do_css_basics (GtkWidget *do_widget)
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
gtk_widget_show (window); gtk_widget_show (window);
else else
gtk_window_destroy (GTK_WINDOW (window)); gtk_widget_destroy (window);
return window; return window;
} }

View File

@@ -15,10 +15,6 @@
border: 1px solid; border: 1px solid;
} }
window {
background-color: white;
}
/* Make sure selections are visible */ /* Make sure selections are visible */
selection { selection {
background-color: darkGreen; background-color: darkGreen;

View File

@@ -38,14 +38,14 @@ struct {
#pragma GCC diagnostic ignored "-Wformat-nonliteral" #pragma GCC diagnostic ignored "-Wformat-nonliteral"
static void static void
update_css_for_blend_mode (GtkCssProvider *provider, update_css_for_blend_mode (GtkCssProvider *provider,
const char *blend_mode) const gchar *blend_mode)
{ {
GBytes *bytes; GBytes *bytes;
char *css; gchar *css;
bytes = g_resources_lookup_data ("/css_blendmodes/css_blendmodes.css", 0, NULL); bytes = g_resources_lookup_data ("/css_blendmodes/css_blendmodes.css", 0, NULL);
css = g_strdup_printf ((char *) g_bytes_get_data (bytes, NULL), css = g_strdup_printf ((gchar*) g_bytes_get_data (bytes, NULL),
blend_mode, blend_mode,
blend_mode, blend_mode,
blend_mode); blend_mode);
@@ -62,7 +62,7 @@ row_activated (GtkListBox *listbox,
GtkListBoxRow *row, GtkListBoxRow *row,
GtkCssProvider *provider) GtkCssProvider *provider)
{ {
const char *blend_mode; const gchar *blend_mode;
blend_mode = blend_modes[gtk_list_box_row_get_index (row)].id; blend_mode = blend_modes[gtk_list_box_row_get_index (row)].id;
@@ -75,11 +75,11 @@ setup_listbox (GtkBuilder *builder,
{ {
GtkWidget *normal_row; GtkWidget *normal_row;
GtkWidget *listbox; GtkWidget *listbox;
int i; gint i;
normal_row = NULL; normal_row = NULL;
listbox = gtk_list_box_new (); listbox = gtk_list_box_new ();
gtk_scrolled_window_set_child (GTK_SCROLLED_WINDOW (WID ("scrolledwindow")), listbox); gtk_container_add (GTK_CONTAINER (WID ("scrolledwindow")), listbox);
g_signal_connect (listbox, "row-activated", G_CALLBACK (row_activated), provider); g_signal_connect (listbox, "row-activated", G_CALLBACK (row_activated), provider);
@@ -95,8 +95,9 @@ setup_listbox (GtkBuilder *builder,
"xalign", 0.0, "xalign", 0.0,
NULL); NULL);
gtk_list_box_row_set_child (GTK_LIST_BOX_ROW (row), label); gtk_container_add (GTK_CONTAINER (row), label);
gtk_list_box_insert (GTK_LIST_BOX (listbox), row, -1);
gtk_container_add (GTK_CONTAINER (listbox), row);
/* The first selected row is "normal" */ /* The first selected row is "normal" */
if (g_strcmp0 (blend_modes[i].id, "normal") == 0) if (g_strcmp0 (blend_modes[i].id, "normal") == 0)
@@ -124,7 +125,7 @@ do_css_blendmodes (GtkWidget *do_widget)
window = WID ("window"); window = WID ("window");
gtk_window_set_transient_for (GTK_WINDOW (window), GTK_WINDOW (do_widget)); gtk_window_set_transient_for (GTK_WINDOW (window), GTK_WINDOW (do_widget));
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window); g_signal_connect (window, "destroy", G_CALLBACK (gtk_widget_destroyed), &window);
/* Setup the CSS provider for window */ /* Setup the CSS provider for window */
provider = GTK_STYLE_PROVIDER (gtk_css_provider_new ()); provider = GTK_STYLE_PROVIDER (gtk_css_provider_new ());
@@ -134,14 +135,12 @@ do_css_blendmodes (GtkWidget *do_widget)
GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
setup_listbox (builder, provider); setup_listbox (builder, provider);
g_object_unref (builder);
} }
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
gtk_widget_show (window); gtk_widget_show (window);
else else
gtk_window_destroy (GTK_WINDOW (window)); gtk_widget_destroy (window);
return window; return window;
} }

View File

@@ -1,7 +1,8 @@
/* Theming/Multiple Backgrounds /* Theming/Multiple Backgrounds
* *
* GTK themes are written using CSS. Every widget is build of multiple items * Gtk themes are written using CSS. Every widget is build of multiple items
* that you can style very similarly to a regular website. * that you can style very similarly to a regular website.
*
*/ */
#include <gtk/gtk.h> #include <gtk/gtk.h>
@@ -68,13 +69,9 @@ drawing_area_draw (GtkDrawingArea *da,
static void static void
apply_css (GtkWidget *widget, GtkStyleProvider *provider) apply_css (GtkWidget *widget, GtkStyleProvider *provider)
{ {
GtkWidget *child;
gtk_style_context_add_provider (gtk_widget_get_style_context (widget), provider, G_MAXUINT); gtk_style_context_add_provider (gtk_widget_get_style_context (widget), provider, G_MAXUINT);
for (child = gtk_widget_get_first_child (widget); if (GTK_IS_CONTAINER (widget))
child != NULL; gtk_container_forall (GTK_CONTAINER (widget), (GtkCallback) apply_css, provider);
child = gtk_widget_get_next_sibling (child))
apply_css (child, provider);
} }
GtkWidget * GtkWidget *
@@ -84,7 +81,7 @@ do_css_multiplebgs (GtkWidget *do_widget)
if (!window) if (!window)
{ {
GtkWidget *paned, *overlay, *child, *sw; GtkWidget *paned, *container, *child;
GtkStyleProvider *provider; GtkStyleProvider *provider;
GtkTextBuffer *text; GtkTextBuffer *text;
GBytes *bytes; GBytes *bytes;
@@ -93,31 +90,32 @@ do_css_multiplebgs (GtkWidget *do_widget)
gtk_window_set_title (GTK_WINDOW (window), "Multiple Backgrounds"); gtk_window_set_title (GTK_WINDOW (window), "Multiple Backgrounds");
gtk_window_set_transient_for (GTK_WINDOW (window), GTK_WINDOW (do_widget)); gtk_window_set_transient_for (GTK_WINDOW (window), GTK_WINDOW (do_widget));
gtk_window_set_default_size (GTK_WINDOW (window), 400, 300); gtk_window_set_default_size (GTK_WINDOW (window), 400, 300);
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window); g_signal_connect (window, "destroy",
G_CALLBACK (gtk_widget_destroyed), &window);
overlay = gtk_overlay_new (); container = gtk_overlay_new ();
gtk_window_set_child (GTK_WINDOW (window), overlay); gtk_window_set_child (GTK_WINDOW (window), container);
child = gtk_drawing_area_new (); child = gtk_drawing_area_new ();
gtk_widget_set_name (child, "canvas"); gtk_widget_set_name (child, "canvas");
gtk_drawing_area_set_draw_func (GTK_DRAWING_AREA (child), gtk_drawing_area_set_draw_func (GTK_DRAWING_AREA (child),
drawing_area_draw, drawing_area_draw,
NULL, NULL); NULL, NULL);
gtk_overlay_set_child (GTK_OVERLAY (overlay), child); gtk_container_add (GTK_CONTAINER (container), child);
child = gtk_button_new (); child = gtk_button_new ();
gtk_overlay_add_overlay (GTK_OVERLAY (overlay), child); gtk_overlay_add_overlay (GTK_OVERLAY (container), child);
gtk_widget_set_name (child, "bricks-button"); gtk_widget_set_name (child, "bricks-button");
gtk_widget_set_halign (child, GTK_ALIGN_CENTER); gtk_widget_set_halign (child, GTK_ALIGN_CENTER);
gtk_widget_set_valign (child, GTK_ALIGN_CENTER); gtk_widget_set_valign (child, GTK_ALIGN_CENTER);
gtk_widget_set_size_request (child, 250, 84); gtk_widget_set_size_request (child, 250, 84);
paned = gtk_paned_new (GTK_ORIENTATION_VERTICAL); paned = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
gtk_overlay_add_overlay (GTK_OVERLAY (overlay), paned); gtk_overlay_add_overlay (GTK_OVERLAY (container), paned);
/* Need a filler so we get a handle */ /* Need a filler so we get a handle */
child = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); child = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
gtk_paned_set_start_child (GTK_PANED (paned), child); gtk_container_add (GTK_CONTAINER (paned), child);
text = gtk_text_buffer_new (NULL); text = gtk_text_buffer_new (NULL);
gtk_text_buffer_create_tag (text, gtk_text_buffer_create_tag (text,
@@ -131,10 +129,10 @@ do_css_multiplebgs (GtkWidget *do_widget)
provider = GTK_STYLE_PROVIDER (gtk_css_provider_new ()); provider = GTK_STYLE_PROVIDER (gtk_css_provider_new ());
sw = gtk_scrolled_window_new (); container = gtk_scrolled_window_new (NULL, NULL);
gtk_paned_set_end_child (GTK_PANED (paned), sw); gtk_container_add (GTK_CONTAINER (paned), container);
child = gtk_text_view_new_with_buffer (text); child = gtk_text_view_new_with_buffer (text);
gtk_scrolled_window_set_child (GTK_SCROLLED_WINDOW (sw), child); gtk_container_add (GTK_CONTAINER (container), child);
g_signal_connect (text, g_signal_connect (text,
"changed", "changed",
G_CALLBACK (css_text_changed), G_CALLBACK (css_text_changed),
@@ -155,7 +153,7 @@ do_css_multiplebgs (GtkWidget *do_widget)
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
gtk_widget_show (window); gtk_widget_show (window);
else else
gtk_window_destroy (GTK_WINDOW (window)); gtk_widget_destroy (window);
return window; return window;
} }

View File

@@ -1,7 +1,6 @@
/* Theming/Animated Backgrounds /* Theming/Animated Backgrounds
* *
* This demo is in honour of a classic Pixbufs demo. * This demo is done in honour of the Pixbufs demo further down.
*
* It is done exclusively with CSS as the background of the window. * It is done exclusively with CSS as the background of the window.
*/ */
@@ -56,13 +55,9 @@ css_text_changed (GtkTextBuffer *buffer,
static void static void
apply_css (GtkWidget *widget, GtkStyleProvider *provider) apply_css (GtkWidget *widget, GtkStyleProvider *provider)
{ {
GtkWidget *child;
gtk_style_context_add_provider (gtk_widget_get_style_context (widget), provider, G_MAXUINT); gtk_style_context_add_provider (gtk_widget_get_style_context (widget), provider, G_MAXUINT);
for (child = gtk_widget_get_first_child (widget); if (GTK_IS_CONTAINER (widget))
child != NULL; gtk_container_forall (GTK_CONTAINER (widget), (GtkCallback) apply_css, provider);
child = gtk_widget_get_next_sibling (child))
apply_css (child, provider);
} }
GtkWidget * GtkWidget *
@@ -81,14 +76,15 @@ do_css_pixbufs (GtkWidget *do_widget)
gtk_window_set_title (GTK_WINDOW (window), "Animated Backgrounds"); gtk_window_set_title (GTK_WINDOW (window), "Animated Backgrounds");
gtk_window_set_transient_for (GTK_WINDOW (window), GTK_WINDOW (do_widget)); gtk_window_set_transient_for (GTK_WINDOW (window), GTK_WINDOW (do_widget));
gtk_window_set_default_size (GTK_WINDOW (window), 400, 300); gtk_window_set_default_size (GTK_WINDOW (window), 400, 300);
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window); g_signal_connect (window, "destroy",
G_CALLBACK (gtk_widget_destroyed), &window);
paned = gtk_paned_new (GTK_ORIENTATION_VERTICAL); paned = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
gtk_window_set_child (GTK_WINDOW (window), paned); gtk_window_set_child (GTK_WINDOW (window), paned);
/* Need a filler so we get a handle */ /* Need a filler so we get a handle */
child = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); child = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
gtk_paned_set_start_child (GTK_PANED (paned), child); gtk_container_add (GTK_CONTAINER (paned), child);
text = gtk_text_buffer_new (NULL); text = gtk_text_buffer_new (NULL);
gtk_text_buffer_create_tag (text, gtk_text_buffer_create_tag (text,
@@ -102,10 +98,10 @@ do_css_pixbufs (GtkWidget *do_widget)
provider = GTK_STYLE_PROVIDER (gtk_css_provider_new ()); provider = GTK_STYLE_PROVIDER (gtk_css_provider_new ());
container = gtk_scrolled_window_new (); container = gtk_scrolled_window_new (NULL, NULL);
gtk_paned_set_end_child (GTK_PANED (paned), container); gtk_container_add (GTK_CONTAINER (paned), container);
child = gtk_text_view_new_with_buffer (text); child = gtk_text_view_new_with_buffer (text);
gtk_scrolled_window_set_child (GTK_SCROLLED_WINDOW (container), child); gtk_container_add (GTK_CONTAINER (container), child);
g_signal_connect (text, "changed", g_signal_connect (text, "changed",
G_CALLBACK (css_text_changed), provider); G_CALLBACK (css_text_changed), provider);
@@ -124,7 +120,7 @@ do_css_pixbufs (GtkWidget *do_widget)
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
gtk_widget_show (window); gtk_widget_show (window);
else else
gtk_window_destroy (GTK_WINDOW (window)); gtk_widget_destroy (window);
return window; return window;
} }

View File

@@ -46,19 +46,19 @@
} }
@keyframes size-the-image { @keyframes size-the-image {
0% { background-size: 96px, 12px, 96px, 12px, 96px, 12px, 96px, 12px, auto; } 0% { background-size: 96px, 12px, 96px, 12px, 96px, 12px, 96px, 12px, auto }
100% { background-size: 12px, 96px, 12px, 96px, 12px, 96px, 12px, 96px, auto; } 100% { background-size: 12px, 96px, 12px, 96px, 12px, 96px, 12px, 96px, auto }
} }
window { window {
background-image: url("resource://css_pixbufs/images/apple-red.png"), background-image: url("resource://css_pixbufs/apple-red.png"),
url("resource://css_pixbufs/images/gnome-applets.png"), url("resource://css_pixbufs/gnome-applets.png"),
url("resource://css_pixbufs/images/gnome-calendar.png"), url("resource://css_pixbufs/gnome-calendar.png"),
url("resource://css_pixbufs/images/gnome-foot.png"), url("resource://css_pixbufs/gnome-foot.png"),
url("resource://css_pixbufs/images/gnome-gmush.png"), url("resource://css_pixbufs/gnome-gmush.png"),
url("resource://css_pixbufs/images/gnome-gimp.png"), url("resource://css_pixbufs/gnome-gimp.png"),
url("resource://css_pixbufs/images/gnome-gsame.png"), url("resource://css_pixbufs/gnome-gsame.png"),
url("resource://css_pixbufs/images/gnu-keys.png"), url("resource://css_pixbufs/gnu-keys.png"),
url("resource://css_pixbufs/background.jpg"); url("resource://css_pixbufs/background.jpg");
background-position: 50.00% 75.00%, 67.68% 67.68%, 75.00% 50.00%, 67.68% 32.32%, 50.00% 25.00%, 32.32% 32.32%, 25.00% 50.00%, 32.32% 67.68%, 0% 0%; background-position: 50.00% 75.00%, 67.68% 67.68%, 75.00% 50.00%, 67.68% 32.32%, 50.00% 25.00%, 32.32% 32.32%, 25.00% 50.00%, 32.32% 67.68%, 0% 0%;
background-repeat: no-repeat, no-repeat, no-repeat, no-repeat, no-repeat, no-repeat, no-repeat, no-repeat, repeat; background-repeat: no-repeat, no-repeat, no-repeat, no-repeat, no-repeat, no-repeat, no-repeat, no-repeat, repeat;

View File

@@ -53,13 +53,9 @@ css_text_changed (GtkTextBuffer *buffer,
static void static void
apply_css (GtkWidget *widget, GtkStyleProvider *provider) apply_css (GtkWidget *widget, GtkStyleProvider *provider)
{ {
GtkWidget *child;
gtk_style_context_add_provider (gtk_widget_get_style_context (widget), provider, G_MAXUINT); gtk_style_context_add_provider (gtk_widget_get_style_context (widget), provider, G_MAXUINT);
for (child = gtk_widget_get_first_child (widget); if (GTK_IS_CONTAINER (widget))
child != NULL; gtk_container_forall (GTK_CONTAINER (widget), (GtkCallback) apply_css, provider);
child = gtk_widget_get_next_sibling (child))
apply_css (child, provider);
} }
static GtkWidget * static GtkWidget *
@@ -72,13 +68,13 @@ create_toolbar (void)
gtk_widget_set_valign (toolbar, GTK_ALIGN_CENTER); gtk_widget_set_valign (toolbar, GTK_ALIGN_CENTER);
item = gtk_button_new_from_icon_name ("go-next"); item = gtk_button_new_from_icon_name ("go-next");
gtk_box_append (GTK_BOX (toolbar), item); gtk_container_add (GTK_CONTAINER (toolbar), item);
item = gtk_button_new_from_icon_name ("go-previous"); item = gtk_button_new_from_icon_name ("go-previous");
gtk_box_append (GTK_BOX (toolbar), item); gtk_container_add (GTK_CONTAINER (toolbar), item);
item = gtk_button_new_with_label ("Hello World"); item = gtk_button_new_with_label ("Hello World");
gtk_box_append (GTK_BOX (toolbar), item); gtk_container_add (GTK_CONTAINER (toolbar), item);
return toolbar; return toolbar;
} }
@@ -99,14 +95,14 @@ do_css_shadows (GtkWidget *do_widget)
gtk_window_set_title (GTK_WINDOW (window), "Shadows"); gtk_window_set_title (GTK_WINDOW (window), "Shadows");
gtk_window_set_transient_for (GTK_WINDOW (window), GTK_WINDOW (do_widget)); gtk_window_set_transient_for (GTK_WINDOW (window), GTK_WINDOW (do_widget));
gtk_window_set_default_size (GTK_WINDOW (window), 400, 300); gtk_window_set_default_size (GTK_WINDOW (window), 400, 300);
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window); g_signal_connect (window, "destroy",
G_CALLBACK (gtk_widget_destroyed), &window);
paned = gtk_paned_new (GTK_ORIENTATION_VERTICAL); paned = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
gtk_window_set_child (GTK_WINDOW (window), paned); gtk_window_set_child (GTK_WINDOW (window), paned);
child = create_toolbar (); child = create_toolbar ();
gtk_paned_set_start_child (GTK_PANED (paned), child); gtk_container_add (GTK_CONTAINER (paned), child);
gtk_paned_set_resize_start_child (GTK_PANED (paned), FALSE);
text = gtk_text_buffer_new (NULL); text = gtk_text_buffer_new (NULL);
gtk_text_buffer_create_tag (text, gtk_text_buffer_create_tag (text,
@@ -120,10 +116,10 @@ do_css_shadows (GtkWidget *do_widget)
provider = GTK_STYLE_PROVIDER (gtk_css_provider_new ()); provider = GTK_STYLE_PROVIDER (gtk_css_provider_new ());
container = gtk_scrolled_window_new (); container = gtk_scrolled_window_new (NULL, NULL);
gtk_paned_set_end_child (GTK_PANED (paned), container); gtk_container_add (GTK_CONTAINER (paned), container);
child = gtk_text_view_new_with_buffer (text); child = gtk_text_view_new_with_buffer (text);
gtk_scrolled_window_set_child (GTK_SCROLLED_WINDOW (container), child); gtk_container_add (GTK_CONTAINER (container), child);
g_signal_connect (text, "changed", g_signal_connect (text, "changed",
G_CALLBACK (css_text_changed), provider); G_CALLBACK (css_text_changed), provider);
@@ -142,7 +138,7 @@ do_css_shadows (GtkWidget *do_widget)
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
gtk_widget_show (window); gtk_widget_show (window);
else else
gtk_window_destroy (GTK_WINDOW (window)); gtk_widget_destroy (window);
return window; return window;
} }

View File

@@ -1,8 +1,9 @@
/* Cursors /* Cursors
* *
* Demonstrates a useful set of available cursors. The cursors shown here are the * Demonstrates a useful set of available cursors. The cursors shown here are the ones
* ones defined by CSS, which we assume to be available. The example shows creating * defined by CSS, which we assume to be available.
* cursors by name or from an image, with or without a fallback. *
* The example shows creating cursors by name or from an image, with or without a fallback.
*/ */
#include <gtk/gtk.h> #include <gtk/gtk.h>
@@ -28,14 +29,14 @@ do_cursors (GtkWidget *do_widget)
gtk_widget_get_display (do_widget)); gtk_widget_get_display (do_widget));
g_signal_connect (window, "destroy", g_signal_connect (window, "destroy",
G_CALLBACK (on_destroy), NULL); G_CALLBACK (on_destroy), NULL);
g_object_unref (builder); g_object_set_data_full (G_OBJECT (window), "builder", builder, g_object_unref);
} }
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
gtk_widget_show (window); gtk_widget_show (window);
else else
{ {
gtk_window_destroy (GTK_WINDOW (window)); gtk_widget_destroy (window);
} }
return window; return window;

View File

@@ -4,7 +4,7 @@
<property name="name">default</property> <property name="name">default</property>
</object> </object>
<object class="GdkCursor" id="default_cursor_image"> <object class="GdkCursor" id="default_cursor_image">
<property name="texture">resource:///cursors/images/default_cursor.png</property> <property name="texture">resource:///cursors/default_cursor.png</property>
<property name="hotspot-x">5</property> <property name="hotspot-x">5</property>
<property name="hotspot-y">5</property> <property name="hotspot-y">5</property>
</object> </object>
@@ -13,7 +13,7 @@
<property name="fallback">default_cursor_image</property> <property name="fallback">default_cursor_image</property>
</object> </object>
<object class="GdkCursor" id="default_cursor_image_fallback"> <object class="GdkCursor" id="default_cursor_image_fallback">
<property name="texture">resource:///cursors/images/default_cursor.png</property> <property name="texture">resource:///cursors/default_cursor.png</property>
<property name="hotspot-x">5</property> <property name="hotspot-x">5</property>
<property name="hotspot-y">5</property> <property name="hotspot-y">5</property>
<property name="fallback">default_cursor</property> <property name="fallback">default_cursor</property>
@@ -22,21 +22,21 @@
<property name="name">none</property> <property name="name">none</property>
</object> </object>
<object class="GdkCursor" id="none_cursor_image"> <object class="GdkCursor" id="none_cursor_image">
<property name="texture">resource:///cursors/images/none_cursor.png</property> <property name="texture">resource:///cursors/none_cursor.png</property>
</object> </object>
<object class="GdkCursor" id="none_cursor_fallback"> <object class="GdkCursor" id="none_cursor_fallback">
<property name="name">none</property> <property name="name">none</property>
<property name="fallback">none_cursor_image</property> <property name="fallback">none_cursor_image</property>
</object> </object>
<object class="GdkCursor" id="none_cursor_image_fallback"> <object class="GdkCursor" id="none_cursor_image_fallback">
<property name="texture">resource:///cursors/images/none_cursor.png</property> <property name="texture">resource:///cursors/none_cursor.png</property>
<property name="fallback">none_cursor</property> <property name="fallback">none_cursor</property>
</object> </object>
<object class="GdkCursor" id="gtk-logo_cursor"> <object class="GdkCursor" id="gtk-logo_cursor">
<property name="name">gtk-logo</property> <property name="name">gtk-logo</property>
</object> </object>
<object class="GdkCursor" id="gtk-logo_cursor_image"> <object class="GdkCursor" id="gtk-logo_cursor_image">
<property name="texture">resource:///cursors/images/gtk_logo_cursor.png</property> <property name="texture">resource:///cursors/gtk_logo_cursor.png</property>
<property name="hotspot-x">18</property> <property name="hotspot-x">18</property>
<property name="hotspot-y">2</property> <property name="hotspot-y">2</property>
</object> </object>
@@ -45,7 +45,7 @@
<property name="fallback">gtk-logo_cursor_image</property> <property name="fallback">gtk-logo_cursor_image</property>
</object> </object>
<object class="GdkCursor" id="gtk-logo_cursor_image_fallback"> <object class="GdkCursor" id="gtk-logo_cursor_image_fallback">
<property name="texture">resource:///cursors/images/gtk_logo_cursor.png</property> <property name="texture">resource:///cursors/gtk_logo_cursor.png</property>
<property name="hotspot-x">18</property> <property name="hotspot-x">18</property>
<property name="hotspot-y">2</property> <property name="hotspot-y">2</property>
<property name="fallback">gtk-logo_cursor</property> <property name="fallback">gtk-logo_cursor</property>
@@ -54,7 +54,7 @@
<property name="name">context-menu</property> <property name="name">context-menu</property>
</object> </object>
<object class="GdkCursor" id="context-menu_cursor_image"> <object class="GdkCursor" id="context-menu_cursor_image">
<property name="texture">resource:///cursors/images/context_menu_cursor.png</property> <property name="texture">resource:///cursors/context_menu_cursor.png</property>
<property name="hotspot-x">5</property> <property name="hotspot-x">5</property>
<property name="hotspot-y">5</property> <property name="hotspot-y">5</property>
</object> </object>
@@ -63,7 +63,7 @@
<property name="fallback">context-menu_cursor_image</property> <property name="fallback">context-menu_cursor_image</property>
</object> </object>
<object class="GdkCursor" id="context-menu_cursor_image_fallback"> <object class="GdkCursor" id="context-menu_cursor_image_fallback">
<property name="texture">resource:///cursors/images/context_menu_cursor.png</property> <property name="texture">resource:///cursors/context_menu_cursor.png</property>
<property name="hotspot-x">5</property> <property name="hotspot-x">5</property>
<property name="hotspot-y">5</property> <property name="hotspot-y">5</property>
<property name="fallback">context-menu_cursor</property> <property name="fallback">context-menu_cursor</property>
@@ -72,7 +72,7 @@
<property name="name">help</property> <property name="name">help</property>
</object> </object>
<object class="GdkCursor" id="help_cursor_image"> <object class="GdkCursor" id="help_cursor_image">
<property name="texture">resource:///cursors/images/help_cursor.png</property> <property name="texture">resource:///cursors/help_cursor.png</property>
<property name="hotspot-x">16</property> <property name="hotspot-x">16</property>
<property name="hotspot-y">27</property> <property name="hotspot-y">27</property>
</object> </object>
@@ -81,7 +81,7 @@
<property name="fallback">help_cursor_image</property> <property name="fallback">help_cursor_image</property>
</object> </object>
<object class="GdkCursor" id="help_cursor_image_fallback"> <object class="GdkCursor" id="help_cursor_image_fallback">
<property name="texture">resource:///cursors/images/help_cursor.png</property> <property name="texture">resource:///cursors/help_cursor.png</property>
<property name="hotspot-x">16</property> <property name="hotspot-x">16</property>
<property name="hotspot-y">27</property> <property name="hotspot-y">27</property>
<property name="fallback">help_cursor</property> <property name="fallback">help_cursor</property>
@@ -90,7 +90,7 @@
<property name="name">pointer</property> <property name="name">pointer</property>
</object> </object>
<object class="GdkCursor" id="pointer_cursor_image"> <object class="GdkCursor" id="pointer_cursor_image">
<property name="texture">resource:///cursors/images/pointer_cursor.png</property> <property name="texture">resource:///cursors/pointer_cursor.png</property>
<property name="hotspot-x">14</property> <property name="hotspot-x">14</property>
<property name="hotspot-y">9</property> <property name="hotspot-y">9</property>
</object> </object>
@@ -99,7 +99,7 @@
<property name="fallback">pointer_cursor_image</property> <property name="fallback">pointer_cursor_image</property>
</object> </object>
<object class="GdkCursor" id="pointer_cursor_image_fallback"> <object class="GdkCursor" id="pointer_cursor_image_fallback">
<property name="texture">resource:///cursors/images/pointer_cursor.png</property> <property name="texture">resource:///cursors/pointer_cursor.png</property>
<property name="hotspot-x">14</property> <property name="hotspot-x">14</property>
<property name="hotspot-y">9</property> <property name="hotspot-y">9</property>
<property name="fallback">pointer_cursor</property> <property name="fallback">pointer_cursor</property>
@@ -108,7 +108,7 @@
<property name="name">progress</property> <property name="name">progress</property>
</object> </object>
<object class="GdkCursor" id="progress_cursor_image"> <object class="GdkCursor" id="progress_cursor_image">
<property name="texture">resource:///cursors/images/progress_cursor.png</property> <property name="texture">resource:///cursors/progress_cursor.png</property>
<property name="hotspot-x">5</property> <property name="hotspot-x">5</property>
<property name="hotspot-y">4</property> <property name="hotspot-y">4</property>
</object> </object>
@@ -117,7 +117,7 @@
<property name="fallback">progress_cursor_image</property> <property name="fallback">progress_cursor_image</property>
</object> </object>
<object class="GdkCursor" id="progress_cursor_image_fallback"> <object class="GdkCursor" id="progress_cursor_image_fallback">
<property name="texture">resource:///cursors/images/progress_cursor.png</property> <property name="texture">resource:///cursors/progress_cursor.png</property>
<property name="hotspot-x">5</property> <property name="hotspot-x">5</property>
<property name="hotspot-y">4</property> <property name="hotspot-y">4</property>
<property name="fallback">progress_cursor</property> <property name="fallback">progress_cursor</property>
@@ -126,7 +126,7 @@
<property name="name">wait</property> <property name="name">wait</property>
</object> </object>
<object class="GdkCursor" id="wait_cursor_image"> <object class="GdkCursor" id="wait_cursor_image">
<property name="texture">resource:///cursors/images/wait_cursor.png</property> <property name="texture">resource:///cursors/wait_cursor.png</property>
<property name="hotspot-x">11</property> <property name="hotspot-x">11</property>
<property name="hotspot-y">11</property> <property name="hotspot-y">11</property>
</object> </object>
@@ -135,7 +135,7 @@
<property name="fallback">wait_cursor_image</property> <property name="fallback">wait_cursor_image</property>
</object> </object>
<object class="GdkCursor" id="wait_cursor_image_fallback"> <object class="GdkCursor" id="wait_cursor_image_fallback">
<property name="texture">resource:///cursors/images/wait_cursor.png</property> <property name="texture">resource:///cursors/wait_cursor.png</property>
<property name="hotspot-x">11</property> <property name="hotspot-x">11</property>
<property name="hotspot-y">11</property> <property name="hotspot-y">11</property>
<property name="fallback">wait_cursor</property> <property name="fallback">wait_cursor</property>
@@ -144,7 +144,7 @@
<property name="name">cell</property> <property name="name">cell</property>
</object> </object>
<object class="GdkCursor" id="cell_cursor_image"> <object class="GdkCursor" id="cell_cursor_image">
<property name="texture">resource:///cursors/images/cell_cursor.png</property> <property name="texture">resource:///cursors/cell_cursor.png</property>
<property name="hotspot-x">15</property> <property name="hotspot-x">15</property>
<property name="hotspot-y">15</property> <property name="hotspot-y">15</property>
</object> </object>
@@ -153,7 +153,7 @@
<property name="fallback">cell_cursor_image</property> <property name="fallback">cell_cursor_image</property>
</object> </object>
<object class="GdkCursor" id="cell_cursor_image_fallback"> <object class="GdkCursor" id="cell_cursor_image_fallback">
<property name="texture">resource:///cursors/images/cell_cursor.png</property> <property name="texture">resource:///cursors/cell_cursor.png</property>
<property name="hotspot-x">15</property> <property name="hotspot-x">15</property>
<property name="hotspot-y">15</property> <property name="hotspot-y">15</property>
<property name="fallback">cell_cursor</property> <property name="fallback">cell_cursor</property>
@@ -162,7 +162,7 @@
<property name="name">crosshair</property> <property name="name">crosshair</property>
</object> </object>
<object class="GdkCursor" id="crosshair_cursor_image"> <object class="GdkCursor" id="crosshair_cursor_image">
<property name="texture">resource:///cursors/images/crosshair_cursor.png</property> <property name="texture">resource:///cursors/crosshair_cursor.png</property>
<property name="hotspot-x">15</property> <property name="hotspot-x">15</property>
<property name="hotspot-y">15</property> <property name="hotspot-y">15</property>
</object> </object>
@@ -171,7 +171,7 @@
<property name="fallback">crosshair_cursor_image</property> <property name="fallback">crosshair_cursor_image</property>
</object> </object>
<object class="GdkCursor" id="crosshair_cursor_image_fallback"> <object class="GdkCursor" id="crosshair_cursor_image_fallback">
<property name="texture">resource:///cursors/images/crosshair_cursor.png</property> <property name="texture">resource:///cursors/crosshair_cursor.png</property>
<property name="hotspot-x">15</property> <property name="hotspot-x">15</property>
<property name="hotspot-y">15</property> <property name="hotspot-y">15</property>
<property name="fallback">crosshair_cursor</property> <property name="fallback">crosshair_cursor</property>
@@ -180,7 +180,7 @@
<property name="name">text</property> <property name="name">text</property>
</object> </object>
<object class="GdkCursor" id="text_cursor_image"> <object class="GdkCursor" id="text_cursor_image">
<property name="texture">resource:///cursors/images/text_cursor.png</property> <property name="texture">resource:///cursors/text_cursor.png</property>
<property name="hotspot-x">14</property> <property name="hotspot-x">14</property>
<property name="hotspot-y">15</property> <property name="hotspot-y">15</property>
</object> </object>
@@ -189,7 +189,7 @@
<property name="fallback">text_cursor_image</property> <property name="fallback">text_cursor_image</property>
</object> </object>
<object class="GdkCursor" id="text_cursor_image_fallback"> <object class="GdkCursor" id="text_cursor_image_fallback">
<property name="texture">resource:///cursors/images/text_cursor.png</property> <property name="texture">resource:///cursors/text_cursor.png</property>
<property name="hotspot-x">14</property> <property name="hotspot-x">14</property>
<property name="hotspot-y">15</property> <property name="hotspot-y">15</property>
<property name="fallback">text_cursor</property> <property name="fallback">text_cursor</property>
@@ -198,7 +198,7 @@
<property name="name">vertical-text</property> <property name="name">vertical-text</property>
</object> </object>
<object class="GdkCursor" id="vertical-text_cursor_image"> <object class="GdkCursor" id="vertical-text_cursor_image">
<property name="texture">resource:///cursors/images/vertical_text_cursor.png</property> <property name="texture">resource:///cursors/vertical_text_cursor.png</property>
<property name="hotspot-x">16</property> <property name="hotspot-x">16</property>
<property name="hotspot-y">15</property> <property name="hotspot-y">15</property>
</object> </object>
@@ -207,7 +207,7 @@
<property name="fallback">vertical-text_cursor_image</property> <property name="fallback">vertical-text_cursor_image</property>
</object> </object>
<object class="GdkCursor" id="vertical-text_cursor_image_fallback"> <object class="GdkCursor" id="vertical-text_cursor_image_fallback">
<property name="texture">resource:///cursors/images/vertical_text_cursor.png</property> <property name="texture">resource:///cursors/vertical_text_cursor.png</property>
<property name="hotspot-x">16</property> <property name="hotspot-x">16</property>
<property name="hotspot-y">15</property> <property name="hotspot-y">15</property>
<property name="fallback">vertical-text_cursor</property> <property name="fallback">vertical-text_cursor</property>
@@ -216,7 +216,7 @@
<property name="name">alias</property> <property name="name">alias</property>
</object> </object>
<object class="GdkCursor" id="alias_cursor_image"> <object class="GdkCursor" id="alias_cursor_image">
<property name="texture">resource:///cursors/images/alias_cursor.png</property> <property name="texture">resource:///cursors/alias_cursor.png</property>
<property name="hotspot-x">12</property> <property name="hotspot-x">12</property>
<property name="hotspot-y">11</property> <property name="hotspot-y">11</property>
</object> </object>
@@ -225,7 +225,7 @@
<property name="fallback">alias_cursor_image</property> <property name="fallback">alias_cursor_image</property>
</object> </object>
<object class="GdkCursor" id="alias_cursor_image_fallback"> <object class="GdkCursor" id="alias_cursor_image_fallback">
<property name="texture">resource:///cursors/images/alias_cursor.png</property> <property name="texture">resource:///cursors/alias_cursor.png</property>
<property name="hotspot-x">12</property> <property name="hotspot-x">12</property>
<property name="hotspot-y">11</property> <property name="hotspot-y">11</property>
<property name="fallback">alias_cursor</property> <property name="fallback">alias_cursor</property>
@@ -234,7 +234,7 @@
<property name="name">copy</property> <property name="name">copy</property>
</object> </object>
<object class="GdkCursor" id="copy_cursor_image"> <object class="GdkCursor" id="copy_cursor_image">
<property name="texture">resource:///cursors/images/copy_cursor.png</property> <property name="texture">resource:///cursors/copy_cursor.png</property>
<property name="hotspot-x">12</property> <property name="hotspot-x">12</property>
<property name="hotspot-y">11</property> <property name="hotspot-y">11</property>
</object> </object>
@@ -243,7 +243,7 @@
<property name="fallback">copy_cursor_image</property> <property name="fallback">copy_cursor_image</property>
</object> </object>
<object class="GdkCursor" id="copy_cursor_image_fallback"> <object class="GdkCursor" id="copy_cursor_image_fallback">
<property name="texture">resource:///cursors/images/copy_cursor.png</property> <property name="texture">resource:///cursors/copy_cursor.png</property>
<property name="hotspot-x">12</property> <property name="hotspot-x">12</property>
<property name="hotspot-y">11</property> <property name="hotspot-y">11</property>
<property name="fallback">copy_cursor</property> <property name="fallback">copy_cursor</property>
@@ -252,7 +252,7 @@
<property name="name">move</property> <property name="name">move</property>
</object> </object>
<object class="GdkCursor" id="move_cursor_image"> <object class="GdkCursor" id="move_cursor_image">
<property name="texture">resource:///cursors/images/move_cursor.png</property> <property name="texture">resource:///cursors/move_cursor.png</property>
<property name="hotspot-x">12</property> <property name="hotspot-x">12</property>
<property name="hotspot-y">11</property> <property name="hotspot-y">11</property>
</object> </object>
@@ -261,7 +261,7 @@
<property name="fallback">move_cursor_image</property> <property name="fallback">move_cursor_image</property>
</object> </object>
<object class="GdkCursor" id="move_cursor_image_fallback"> <object class="GdkCursor" id="move_cursor_image_fallback">
<property name="texture">resource:///cursors/images/move_cursor.png</property> <property name="texture">resource:///cursors/move_cursor.png</property>
<property name="hotspot-x">12</property> <property name="hotspot-x">12</property>
<property name="hotspot-y">11</property> <property name="hotspot-y">11</property>
<property name="fallback">move_cursor</property> <property name="fallback">move_cursor</property>
@@ -270,7 +270,7 @@
<property name="name">no-drop</property> <property name="name">no-drop</property>
</object> </object>
<object class="GdkCursor" id="no-drop_cursor_image"> <object class="GdkCursor" id="no-drop_cursor_image">
<property name="texture">resource:///cursors/images/no_drop_cursor.png</property> <property name="texture">resource:///cursors/no_drop_cursor.png</property>
<property name="hotspot-x">12</property> <property name="hotspot-x">12</property>
<property name="hotspot-y">11</property> <property name="hotspot-y">11</property>
</object> </object>
@@ -279,7 +279,7 @@
<property name="fallback">no-drop_cursor_image</property> <property name="fallback">no-drop_cursor_image</property>
</object> </object>
<object class="GdkCursor" id="no-drop_cursor_image_fallback"> <object class="GdkCursor" id="no-drop_cursor_image_fallback">
<property name="texture">resource:///cursors/images/no_drop_cursor.png</property> <property name="texture">resource:///cursors/no_drop_cursor.png</property>
<property name="hotspot-x">12</property> <property name="hotspot-x">12</property>
<property name="hotspot-y">11</property> <property name="hotspot-y">11</property>
<property name="fallback">no-drop_cursor</property> <property name="fallback">no-drop_cursor</property>
@@ -288,7 +288,7 @@
<property name="name">not-allowed</property> <property name="name">not-allowed</property>
</object> </object>
<object class="GdkCursor" id="not-allowed_cursor_image"> <object class="GdkCursor" id="not-allowed_cursor_image">
<property name="texture">resource:///cursors/images/not_allowed_cursor.png</property> <property name="texture">resource:///cursors/not_allowed_cursor.png</property>
<property name="hotspot-x">12</property> <property name="hotspot-x">12</property>
<property name="hotspot-y">11</property> <property name="hotspot-y">11</property>
</object> </object>
@@ -297,7 +297,7 @@
<property name="fallback">not-allowed_cursor_image</property> <property name="fallback">not-allowed_cursor_image</property>
</object> </object>
<object class="GdkCursor" id="not-allowed_cursor_image_fallback"> <object class="GdkCursor" id="not-allowed_cursor_image_fallback">
<property name="texture">resource:///cursors/images/not_allowed_cursor.png</property> <property name="texture">resource:///cursors/not_allowed_cursor.png</property>
<property name="hotspot-x">12</property> <property name="hotspot-x">12</property>
<property name="hotspot-y">11</property> <property name="hotspot-y">11</property>
<property name="fallback">not-allowed_cursor</property> <property name="fallback">not-allowed_cursor</property>
@@ -306,7 +306,7 @@
<property name="name">grab</property> <property name="name">grab</property>
</object> </object>
<object class="GdkCursor" id="grab_cursor_image"> <object class="GdkCursor" id="grab_cursor_image">
<property name="texture">resource:///cursors/images/grab_cursor.png</property> <property name="texture">resource:///cursors/grab_cursor.png</property>
<property name="hotspot-x">10</property> <property name="hotspot-x">10</property>
<property name="hotspot-y">6</property> <property name="hotspot-y">6</property>
</object> </object>
@@ -315,7 +315,7 @@
<property name="fallback">grab_cursor_image</property> <property name="fallback">grab_cursor_image</property>
</object> </object>
<object class="GdkCursor" id="grab_cursor_image_fallback"> <object class="GdkCursor" id="grab_cursor_image_fallback">
<property name="texture">resource:///cursors/images/grab_cursor.png</property> <property name="texture">resource:///cursors/grab_cursor.png</property>
<property name="hotspot-x">10</property> <property name="hotspot-x">10</property>
<property name="hotspot-y">6</property> <property name="hotspot-y">6</property>
<property name="fallback">grab_cursor</property> <property name="fallback">grab_cursor</property>
@@ -324,7 +324,7 @@
<property name="name">grabbing</property> <property name="name">grabbing</property>
</object> </object>
<object class="GdkCursor" id="grabbing_cursor_image"> <object class="GdkCursor" id="grabbing_cursor_image">
<property name="texture">resource:///cursors/images/grabbing_cursor.png</property> <property name="texture">resource:///cursors/grabbing_cursor.png</property>
<property name="hotspot-x">15</property> <property name="hotspot-x">15</property>
<property name="hotspot-y">14</property> <property name="hotspot-y">14</property>
</object> </object>
@@ -333,7 +333,7 @@
<property name="fallback">grabbing_cursor_image</property> <property name="fallback">grabbing_cursor_image</property>
</object> </object>
<object class="GdkCursor" id="grabbing_cursor_image_fallback"> <object class="GdkCursor" id="grabbing_cursor_image_fallback">
<property name="texture">resource:///cursors/images/grabbing_cursor.png</property> <property name="texture">resource:///cursors/grabbing_cursor.png</property>
<property name="hotspot-x">15</property> <property name="hotspot-x">15</property>
<property name="hotspot-y">14</property> <property name="hotspot-y">14</property>
<property name="fallback">grabbing_cursor</property> <property name="fallback">grabbing_cursor</property>
@@ -342,7 +342,7 @@
<property name="name">all-scroll</property> <property name="name">all-scroll</property>
</object> </object>
<object class="GdkCursor" id="all-scroll_cursor_image"> <object class="GdkCursor" id="all-scroll_cursor_image">
<property name="texture">resource:///cursors/images/all_scroll_cursor.png</property> <property name="texture">resource:///cursors/all_scroll_cursor.png</property>
<property name="hotspot-x">15</property> <property name="hotspot-x">15</property>
<property name="hotspot-y">15</property> <property name="hotspot-y">15</property>
</object> </object>
@@ -351,7 +351,7 @@
<property name="fallback">all-scroll_cursor_image</property> <property name="fallback">all-scroll_cursor_image</property>
</object> </object>
<object class="GdkCursor" id="all-scroll_cursor_image_fallback"> <object class="GdkCursor" id="all-scroll_cursor_image_fallback">
<property name="texture">resource:///cursors/images/all_scroll_cursor.png</property> <property name="texture">resource:///cursors/all_scroll_cursor.png</property>
<property name="hotspot-x">15</property> <property name="hotspot-x">15</property>
<property name="hotspot-y">15</property> <property name="hotspot-y">15</property>
<property name="fallback">all-scroll_cursor</property> <property name="fallback">all-scroll_cursor</property>
@@ -360,7 +360,7 @@
<property name="name">col-resize</property> <property name="name">col-resize</property>
</object> </object>
<object class="GdkCursor" id="col-resize_cursor_image"> <object class="GdkCursor" id="col-resize_cursor_image">
<property name="texture">resource:///cursors/images/col_resize_cursor.png</property> <property name="texture">resource:///cursors/col_resize_cursor.png</property>
<property name="hotspot-x">16</property> <property name="hotspot-x">16</property>
<property name="hotspot-y">15</property> <property name="hotspot-y">15</property>
</object> </object>
@@ -369,7 +369,7 @@
<property name="fallback">col-resize_cursor_image</property> <property name="fallback">col-resize_cursor_image</property>
</object> </object>
<object class="GdkCursor" id="col-resize_cursor_image_fallback"> <object class="GdkCursor" id="col-resize_cursor_image_fallback">
<property name="texture">resource:///cursors/images/col_resize_cursor.png</property> <property name="texture">resource:///cursors/col_resize_cursor.png</property>
<property name="hotspot-x">16</property> <property name="hotspot-x">16</property>
<property name="hotspot-y">15</property> <property name="hotspot-y">15</property>
<property name="fallback">col-resize_cursor</property> <property name="fallback">col-resize_cursor</property>
@@ -378,7 +378,7 @@
<property name="name">row-resize</property> <property name="name">row-resize</property>
</object> </object>
<object class="GdkCursor" id="row-resize_cursor_image"> <object class="GdkCursor" id="row-resize_cursor_image">
<property name="texture">resource:///cursors/images/row_resize_cursor.png</property> <property name="texture">resource:///cursors/row_resize_cursor.png</property>
<property name="hotspot-x">15</property> <property name="hotspot-x">15</property>
<property name="hotspot-y">17</property> <property name="hotspot-y">17</property>
</object> </object>
@@ -387,7 +387,7 @@
<property name="fallback">row-resize_cursor_image</property> <property name="fallback">row-resize_cursor_image</property>
</object> </object>
<object class="GdkCursor" id="row-resize_cursor_image_fallback"> <object class="GdkCursor" id="row-resize_cursor_image_fallback">
<property name="texture">resource:///cursors/images/row_resize_cursor.png</property> <property name="texture">resource:///cursors/row_resize_cursor.png</property>
<property name="hotspot-x">15</property> <property name="hotspot-x">15</property>
<property name="hotspot-y">17</property> <property name="hotspot-y">17</property>
<property name="fallback">row-resize_cursor</property> <property name="fallback">row-resize_cursor</property>
@@ -396,7 +396,7 @@
<property name="name">n-resize</property> <property name="name">n-resize</property>
</object> </object>
<object class="GdkCursor" id="n-resize_cursor_image"> <object class="GdkCursor" id="n-resize_cursor_image">
<property name="texture">resource:///cursors/images/n_resize_cursor.png</property> <property name="texture">resource:///cursors/n_resize_cursor.png</property>
<property name="hotspot-x">17</property> <property name="hotspot-x">17</property>
<property name="hotspot-y">7</property> <property name="hotspot-y">7</property>
</object> </object>
@@ -405,7 +405,7 @@
<property name="fallback">n-resize_cursor_image</property> <property name="fallback">n-resize_cursor_image</property>
</object> </object>
<object class="GdkCursor" id="n-resize_cursor_image_fallback"> <object class="GdkCursor" id="n-resize_cursor_image_fallback">
<property name="texture">resource:///cursors/images/n_resize_cursor.png</property> <property name="texture">resource:///cursors/n_resize_cursor.png</property>
<property name="hotspot-x">17</property> <property name="hotspot-x">17</property>
<property name="hotspot-y">7</property> <property name="hotspot-y">7</property>
<property name="fallback">n-resize_cursor</property> <property name="fallback">n-resize_cursor</property>
@@ -414,7 +414,7 @@
<property name="name">e-resize</property> <property name="name">e-resize</property>
</object> </object>
<object class="GdkCursor" id="e-resize_cursor_image"> <object class="GdkCursor" id="e-resize_cursor_image">
<property name="texture">resource:///cursors/images/e_resize_cursor.png</property> <property name="texture">resource:///cursors/e_resize_cursor.png</property>
<property name="hotspot-x">25</property> <property name="hotspot-x">25</property>
<property name="hotspot-y">17</property> <property name="hotspot-y">17</property>
</object> </object>
@@ -423,7 +423,7 @@
<property name="fallback">e-resize_cursor_image</property> <property name="fallback">e-resize_cursor_image</property>
</object> </object>
<object class="GdkCursor" id="e-resize_cursor_image_fallback"> <object class="GdkCursor" id="e-resize_cursor_image_fallback">
<property name="texture">resource:///cursors/images/e_resize_cursor.png</property> <property name="texture">resource:///cursors/e_resize_cursor.png</property>
<property name="hotspot-x">25</property> <property name="hotspot-x">25</property>
<property name="hotspot-y">17</property> <property name="hotspot-y">17</property>
<property name="fallback">e-resize_cursor</property> <property name="fallback">e-resize_cursor</property>
@@ -432,7 +432,7 @@
<property name="name">s-resize</property> <property name="name">s-resize</property>
</object> </object>
<object class="GdkCursor" id="s-resize_cursor_image"> <object class="GdkCursor" id="s-resize_cursor_image">
<property name="texture">resource:///cursors/images/s_resize_cursor.png</property> <property name="texture">resource:///cursors/s_resize_cursor.png</property>
<property name="hotspot-x">17</property> <property name="hotspot-x">17</property>
<property name="hotspot-y">23</property> <property name="hotspot-y">23</property>
</object> </object>
@@ -441,7 +441,7 @@
<property name="fallback">s-resize_cursor_image</property> <property name="fallback">s-resize_cursor_image</property>
</object> </object>
<object class="GdkCursor" id="s-resize_cursor_image_fallback"> <object class="GdkCursor" id="s-resize_cursor_image_fallback">
<property name="texture">resource:///cursors/images/s_resize_cursor.png</property> <property name="texture">resource:///cursors/s_resize_cursor.png</property>
<property name="hotspot-x">17</property> <property name="hotspot-x">17</property>
<property name="hotspot-y">23</property> <property name="hotspot-y">23</property>
<property name="fallback">s-resize_cursor</property> <property name="fallback">s-resize_cursor</property>
@@ -450,7 +450,7 @@
<property name="name">w-resize</property> <property name="name">w-resize</property>
</object> </object>
<object class="GdkCursor" id="w-resize_cursor_image"> <object class="GdkCursor" id="w-resize_cursor_image">
<property name="texture">resource:///cursors/images/w_resize_cursor.png</property> <property name="texture">resource:///cursors/w_resize_cursor.png</property>
<property name="hotspot-x">8</property> <property name="hotspot-x">8</property>
<property name="hotspot-y">17</property> <property name="hotspot-y">17</property>
</object> </object>
@@ -459,7 +459,7 @@
<property name="fallback">w-resize_cursor_image</property> <property name="fallback">w-resize_cursor_image</property>
</object> </object>
<object class="GdkCursor" id="w-resize_cursor_image_fallback"> <object class="GdkCursor" id="w-resize_cursor_image_fallback">
<property name="texture">resource:///cursors/images/w_resize_cursor.png</property> <property name="texture">resource:///cursors/w_resize_cursor.png</property>
<property name="hotspot-x">8</property> <property name="hotspot-x">8</property>
<property name="hotspot-y">17</property> <property name="hotspot-y">17</property>
<property name="fallback">w-resize_cursor</property> <property name="fallback">w-resize_cursor</property>
@@ -468,7 +468,7 @@
<property name="name">ne-resize</property> <property name="name">ne-resize</property>
</object> </object>
<object class="GdkCursor" id="ne-resize_cursor_image"> <object class="GdkCursor" id="ne-resize_cursor_image">
<property name="texture">resource:///cursors/images/ne_resize_cursor.png</property> <property name="texture">resource:///cursors/ne_resize_cursor.png</property>
<property name="hotspot-x">20</property> <property name="hotspot-x">20</property>
<property name="hotspot-y">13</property> <property name="hotspot-y">13</property>
</object> </object>
@@ -477,7 +477,7 @@
<property name="fallback">ne-resize_cursor_image</property> <property name="fallback">ne-resize_cursor_image</property>
</object> </object>
<object class="GdkCursor" id="ne-resize_cursor_image_fallback"> <object class="GdkCursor" id="ne-resize_cursor_image_fallback">
<property name="texture">resource:///cursors/images/ne_resize_cursor.png</property> <property name="texture">resource:///cursors/ne_resize_cursor.png</property>
<property name="hotspot-x">20</property> <property name="hotspot-x">20</property>
<property name="hotspot-y">13</property> <property name="hotspot-y">13</property>
<property name="fallback">ne-resize_cursor</property> <property name="fallback">ne-resize_cursor</property>
@@ -486,7 +486,7 @@
<property name="name">nw-resize</property> <property name="name">nw-resize</property>
</object> </object>
<object class="GdkCursor" id="nw-resize_cursor_image"> <object class="GdkCursor" id="nw-resize_cursor_image">
<property name="texture">resource:///cursors/images/nw_resize_cursor.png</property> <property name="texture">resource:///cursors/nw_resize_cursor.png</property>
<property name="hotspot-x">13</property> <property name="hotspot-x">13</property>
<property name="hotspot-y">13</property> <property name="hotspot-y">13</property>
</object> </object>
@@ -495,7 +495,7 @@
<property name="fallback">nw-resize_cursor_image</property> <property name="fallback">nw-resize_cursor_image</property>
</object> </object>
<object class="GdkCursor" id="nw-resize_cursor_image_fallback"> <object class="GdkCursor" id="nw-resize_cursor_image_fallback">
<property name="texture">resource:///cursors/images/nw_resize_cursor.png</property> <property name="texture">resource:///cursors/nw_resize_cursor.png</property>
<property name="hotspot-x">13</property> <property name="hotspot-x">13</property>
<property name="hotspot-y">13</property> <property name="hotspot-y">13</property>
<property name="fallback">nw-resize_cursor</property> <property name="fallback">nw-resize_cursor</property>
@@ -504,7 +504,7 @@
<property name="name">se-resize</property> <property name="name">se-resize</property>
</object> </object>
<object class="GdkCursor" id="se-resize_cursor_image"> <object class="GdkCursor" id="se-resize_cursor_image">
<property name="texture">resource:///cursors/images/se_resize_cursor.png</property> <property name="texture">resource:///cursors/se_resize_cursor.png</property>
<property name="hotspot-x">19</property> <property name="hotspot-x">19</property>
<property name="hotspot-y">19</property> <property name="hotspot-y">19</property>
</object> </object>
@@ -513,7 +513,7 @@
<property name="fallback">se-resize_cursor_image</property> <property name="fallback">se-resize_cursor_image</property>
</object> </object>
<object class="GdkCursor" id="se-resize_cursor_image_fallback"> <object class="GdkCursor" id="se-resize_cursor_image_fallback">
<property name="texture">resource:///cursors/images/se_resize_cursor.png</property> <property name="texture">resource:///cursors/se_resize_cursor.png</property>
<property name="hotspot-x">19</property> <property name="hotspot-x">19</property>
<property name="hotspot-y">19</property> <property name="hotspot-y">19</property>
<property name="fallback">se-resize_cursor</property> <property name="fallback">se-resize_cursor</property>
@@ -522,7 +522,7 @@
<property name="name">sw-resize</property> <property name="name">sw-resize</property>
</object> </object>
<object class="GdkCursor" id="sw-resize_cursor_image"> <object class="GdkCursor" id="sw-resize_cursor_image">
<property name="texture">resource:///cursors/images/sw_resize_cursor.png</property> <property name="texture">resource:///cursors/sw_resize_cursor.png</property>
<property name="hotspot-x">13</property> <property name="hotspot-x">13</property>
<property name="hotspot-y">19</property> <property name="hotspot-y">19</property>
</object> </object>
@@ -531,7 +531,7 @@
<property name="fallback">sw-resize_cursor_image</property> <property name="fallback">sw-resize_cursor_image</property>
</object> </object>
<object class="GdkCursor" id="sw-resize_cursor_image_fallback"> <object class="GdkCursor" id="sw-resize_cursor_image_fallback">
<property name="texture">resource:///cursors/images/sw_resize_cursor.png</property> <property name="texture">resource:///cursors/sw_resize_cursor.png</property>
<property name="hotspot-x">13</property> <property name="hotspot-x">13</property>
<property name="hotspot-y">19</property> <property name="hotspot-y">19</property>
<property name="fallback">sw-resize_cursor</property> <property name="fallback">sw-resize_cursor</property>
@@ -540,7 +540,7 @@
<property name="name">ew-resize</property> <property name="name">ew-resize</property>
</object> </object>
<object class="GdkCursor" id="ew-resize_cursor_image"> <object class="GdkCursor" id="ew-resize_cursor_image">
<property name="texture">resource:///cursors/images/ew_resize_cursor.png</property> <property name="texture">resource:///cursors/ew_resize_cursor.png</property>
<property name="hotspot-x">16</property> <property name="hotspot-x">16</property>
<property name="hotspot-y">15</property> <property name="hotspot-y">15</property>
</object> </object>
@@ -549,7 +549,7 @@
<property name="fallback">ew-resize_cursor_image</property> <property name="fallback">ew-resize_cursor_image</property>
</object> </object>
<object class="GdkCursor" id="ew-resize_cursor_image_fallback"> <object class="GdkCursor" id="ew-resize_cursor_image_fallback">
<property name="texture">resource:///cursors/images/ew_resize_cursor.png</property> <property name="texture">resource:///cursors/ew_resize_cursor.png</property>
<property name="hotspot-x">16</property> <property name="hotspot-x">16</property>
<property name="hotspot-y">15</property> <property name="hotspot-y">15</property>
<property name="fallback">ew-resize_cursor</property> <property name="fallback">ew-resize_cursor</property>
@@ -558,7 +558,7 @@
<property name="name">ns-resize</property> <property name="name">ns-resize</property>
</object> </object>
<object class="GdkCursor" id="ns-resize_cursor_image"> <object class="GdkCursor" id="ns-resize_cursor_image">
<property name="texture">resource:///cursors/images/ns_resize_cursor.png</property> <property name="texture">resource:///cursors/ns_resize_cursor.png</property>
<property name="hotspot-x">15</property> <property name="hotspot-x">15</property>
<property name="hotspot-y">17</property> <property name="hotspot-y">17</property>
</object> </object>
@@ -567,7 +567,7 @@
<property name="fallback">ns-resize_cursor_image</property> <property name="fallback">ns-resize_cursor_image</property>
</object> </object>
<object class="GdkCursor" id="ns-resize_cursor_image_fallback"> <object class="GdkCursor" id="ns-resize_cursor_image_fallback">
<property name="texture">resource:///cursors/images/ns_resize_cursor.png</property> <property name="texture">resource:///cursors/ns_resize_cursor.png</property>
<property name="hotspot-x">15</property> <property name="hotspot-x">15</property>
<property name="hotspot-y">17</property> <property name="hotspot-y">17</property>
<property name="fallback">ns-resize_cursor</property> <property name="fallback">ns-resize_cursor</property>
@@ -576,7 +576,7 @@
<property name="name">nesw-resize</property> <property name="name">nesw-resize</property>
</object> </object>
<object class="GdkCursor" id="nesw-resize_cursor_image"> <object class="GdkCursor" id="nesw-resize_cursor_image">
<property name="texture">resource:///cursors/images/nesw_resize_cursor.png</property> <property name="texture">resource:///cursors/nesw_resize_cursor.png</property>
<property name="hotspot-x">14</property> <property name="hotspot-x">14</property>
<property name="hotspot-y">14</property> <property name="hotspot-y">14</property>
</object> </object>
@@ -585,7 +585,7 @@
<property name="fallback">nesw-resize_cursor_image</property> <property name="fallback">nesw-resize_cursor_image</property>
</object> </object>
<object class="GdkCursor" id="nesw-resize_cursor_image_fallback"> <object class="GdkCursor" id="nesw-resize_cursor_image_fallback">
<property name="texture">resource:///cursors/images/nesw_resize_cursor.png</property> <property name="texture">resource:///cursors/nesw_resize_cursor.png</property>
<property name="hotspot-x">14</property> <property name="hotspot-x">14</property>
<property name="hotspot-y">14</property> <property name="hotspot-y">14</property>
<property name="fallback">nesw-resize_cursor</property> <property name="fallback">nesw-resize_cursor</property>
@@ -594,7 +594,7 @@
<property name="name">nwse-resize</property> <property name="name">nwse-resize</property>
</object> </object>
<object class="GdkCursor" id="nwse-resize_cursor_image"> <object class="GdkCursor" id="nwse-resize_cursor_image">
<property name="texture">resource:///cursors/images/nwse_resize_cursor.png</property> <property name="texture">resource:///cursors/nwse_resize_cursor.png</property>
<property name="hotspot-x">14</property> <property name="hotspot-x">14</property>
<property name="hotspot-y">14</property> <property name="hotspot-y">14</property>
</object> </object>
@@ -603,7 +603,7 @@
<property name="fallback">nwse-resize_cursor_image</property> <property name="fallback">nwse-resize_cursor_image</property>
</object> </object>
<object class="GdkCursor" id="nwse-resize_cursor_image_fallback"> <object class="GdkCursor" id="nwse-resize_cursor_image_fallback">
<property name="texture">resource:///cursors/images/nwse_resize_cursor.png</property> <property name="texture">resource:///cursors/nwse_resize_cursor.png</property>
<property name="hotspot-x">14</property> <property name="hotspot-x">14</property>
<property name="hotspot-y">14</property> <property name="hotspot-y">14</property>
<property name="fallback">nwse-resize_cursor</property> <property name="fallback">nwse-resize_cursor</property>
@@ -612,7 +612,7 @@
<property name="name">zoom-in</property> <property name="name">zoom-in</property>
</object> </object>
<object class="GdkCursor" id="zoom-in_cursor_image"> <object class="GdkCursor" id="zoom-in_cursor_image">
<property name="texture">resource:///cursors/images/zoom_in_cursor.png</property> <property name="texture">resource:///cursors/zoom_in_cursor.png</property>
<property name="hotspot-x">14</property> <property name="hotspot-x">14</property>
<property name="hotspot-y">13</property> <property name="hotspot-y">13</property>
</object> </object>
@@ -621,7 +621,7 @@
<property name="fallback">zoom-in_cursor_image</property> <property name="fallback">zoom-in_cursor_image</property>
</object> </object>
<object class="GdkCursor" id="zoom-in_cursor_image_fallback"> <object class="GdkCursor" id="zoom-in_cursor_image_fallback">
<property name="texture">resource:///cursors/images/zoom_in_cursor.png</property> <property name="texture">resource:///cursors/zoom_in_cursor.png</property>
<property name="hotspot-x">14</property> <property name="hotspot-x">14</property>
<property name="hotspot-y">13</property> <property name="hotspot-y">13</property>
<property name="fallback">zoom-in_cursor</property> <property name="fallback">zoom-in_cursor</property>
@@ -630,7 +630,7 @@
<property name="name">zoom-out</property> <property name="name">zoom-out</property>
</object> </object>
<object class="GdkCursor" id="zoom-out_cursor_image"> <object class="GdkCursor" id="zoom-out_cursor_image">
<property name="texture">resource:///cursors/images/zoom_out_cursor.png</property> <property name="texture">resource:///cursors/zoom_out_cursor.png</property>
<property name="hotspot-x">14</property> <property name="hotspot-x">14</property>
<property name="hotspot-y">13</property> <property name="hotspot-y">13</property>
</object> </object>
@@ -639,7 +639,7 @@
<property name="fallback">zoom-out_cursor_image</property> <property name="fallback">zoom-out_cursor_image</property>
</object> </object>
<object class="GdkCursor" id="zoom-out_cursor_image_fallback"> <object class="GdkCursor" id="zoom-out_cursor_image_fallback">
<property name="texture">resource:///cursors/images/zoom_out_cursor.png</property> <property name="texture">resource:///cursors/zoom_out_cursor.png</property>
<property name="hotspot-x">14</property> <property name="hotspot-x">14</property>
<property name="hotspot-y">13</property> <property name="hotspot-y">13</property>
<property name="fallback">zoom-out_cursor</property> <property name="fallback">zoom-out_cursor</property>
@@ -682,7 +682,7 @@
<property name="spacing">10</property> <property name="spacing">10</property>
<child> <child>
<object class="GtkImage"> <object class="GtkImage">
<property name="paintable">resource:///cursors/images/default_cursor.png</property> <property name="paintable">resource:///cursors/default_cursor.png</property>
</object> </object>
</child> </child>
<child> <child>
@@ -742,7 +742,7 @@
<property name="spacing">10</property> <property name="spacing">10</property>
<child> <child>
<object class="GtkImage"> <object class="GtkImage">
<property name="paintable">resource:///cursors/images/none_cursor.png</property> <property name="paintable">resource:///cursors/none_cursor.png</property>
</object> </object>
</child> </child>
<child> <child>
@@ -802,7 +802,7 @@
<property name="spacing">10</property> <property name="spacing">10</property>
<child> <child>
<object class="GtkImage"> <object class="GtkImage">
<property name="paintable">resource:///cursors/images/gtk_logo_cursor.png</property> <property name="paintable">resource:///cursors/gtk_logo_cursor.png</property>
</object> </object>
</child> </child>
<child> <child>
@@ -875,7 +875,7 @@
<property name="spacing">10</property> <property name="spacing">10</property>
<child> <child>
<object class="GtkImage"> <object class="GtkImage">
<property name="paintable">resource:///cursors/images/context_menu_cursor.png</property> <property name="paintable">resource:///cursors/context_menu_cursor.png</property>
</object> </object>
</child> </child>
<child> <child>
@@ -935,7 +935,7 @@
<property name="spacing">10</property> <property name="spacing">10</property>
<child> <child>
<object class="GtkImage"> <object class="GtkImage">
<property name="paintable">resource:///cursors/images/help_cursor.png</property> <property name="paintable">resource:///cursors/help_cursor.png</property>
</object> </object>
</child> </child>
<child> <child>
@@ -995,7 +995,7 @@
<property name="spacing">10</property> <property name="spacing">10</property>
<child> <child>
<object class="GtkImage"> <object class="GtkImage">
<property name="paintable">resource:///cursors/images/pointer_cursor.png</property> <property name="paintable">resource:///cursors/pointer_cursor.png</property>
</object> </object>
</child> </child>
<child> <child>
@@ -1055,7 +1055,7 @@
<property name="spacing">10</property> <property name="spacing">10</property>
<child> <child>
<object class="GtkImage"> <object class="GtkImage">
<property name="paintable">resource:///cursors/images/progress_cursor.png</property> <property name="paintable">resource:///cursors/progress_cursor.png</property>
</object> </object>
</child> </child>
<child> <child>
@@ -1115,7 +1115,7 @@
<property name="spacing">10</property> <property name="spacing">10</property>
<child> <child>
<object class="GtkImage"> <object class="GtkImage">
<property name="paintable">resource:///cursors/images/wait_cursor.png</property> <property name="paintable">resource:///cursors/wait_cursor.png</property>
</object> </object>
</child> </child>
<child> <child>
@@ -1188,7 +1188,7 @@
<property name="spacing">10</property> <property name="spacing">10</property>
<child> <child>
<object class="GtkImage"> <object class="GtkImage">
<property name="paintable">resource:///cursors/images/cell_cursor.png</property> <property name="paintable">resource:///cursors/cell_cursor.png</property>
</object> </object>
</child> </child>
<child> <child>
@@ -1248,7 +1248,7 @@
<property name="spacing">10</property> <property name="spacing">10</property>
<child> <child>
<object class="GtkImage"> <object class="GtkImage">
<property name="paintable">resource:///cursors/images/crosshair_cursor.png</property> <property name="paintable">resource:///cursors/crosshair_cursor.png</property>
</object> </object>
</child> </child>
<child> <child>
@@ -1308,7 +1308,7 @@
<property name="spacing">10</property> <property name="spacing">10</property>
<child> <child>
<object class="GtkImage"> <object class="GtkImage">
<property name="paintable">resource:///cursors/images/text_cursor.png</property> <property name="paintable">resource:///cursors/text_cursor.png</property>
</object> </object>
</child> </child>
<child> <child>
@@ -1368,7 +1368,7 @@
<property name="spacing">10</property> <property name="spacing">10</property>
<child> <child>
<object class="GtkImage"> <object class="GtkImage">
<property name="paintable">resource:///cursors/images/vertical_text_cursor.png</property> <property name="paintable">resource:///cursors/vertical_text_cursor.png</property>
</object> </object>
</child> </child>
<child> <child>
@@ -1441,7 +1441,7 @@
<property name="spacing">10</property> <property name="spacing">10</property>
<child> <child>
<object class="GtkImage"> <object class="GtkImage">
<property name="paintable">resource:///cursors/images/alias_cursor.png</property> <property name="paintable">resource:///cursors/alias_cursor.png</property>
</object> </object>
</child> </child>
<child> <child>
@@ -1501,7 +1501,7 @@
<property name="spacing">10</property> <property name="spacing">10</property>
<child> <child>
<object class="GtkImage"> <object class="GtkImage">
<property name="paintable">resource:///cursors/images/copy_cursor.png</property> <property name="paintable">resource:///cursors/copy_cursor.png</property>
</object> </object>
</child> </child>
<child> <child>
@@ -1561,7 +1561,7 @@
<property name="spacing">10</property> <property name="spacing">10</property>
<child> <child>
<object class="GtkImage"> <object class="GtkImage">
<property name="paintable">resource:///cursors/images/move_cursor.png</property> <property name="paintable">resource:///cursors/move_cursor.png</property>
</object> </object>
</child> </child>
<child> <child>
@@ -1621,7 +1621,7 @@
<property name="spacing">10</property> <property name="spacing">10</property>
<child> <child>
<object class="GtkImage"> <object class="GtkImage">
<property name="paintable">resource:///cursors/images/no_drop_cursor.png</property> <property name="paintable">resource:///cursors/no_drop_cursor.png</property>
</object> </object>
</child> </child>
<child> <child>
@@ -1681,7 +1681,7 @@
<property name="spacing">10</property> <property name="spacing">10</property>
<child> <child>
<object class="GtkImage"> <object class="GtkImage">
<property name="paintable">resource:///cursors/images/not_allowed_cursor.png</property> <property name="paintable">resource:///cursors/not_allowed_cursor.png</property>
</object> </object>
</child> </child>
<child> <child>
@@ -1741,7 +1741,7 @@
<property name="spacing">10</property> <property name="spacing">10</property>
<child> <child>
<object class="GtkImage"> <object class="GtkImage">
<property name="paintable">resource:///cursors/images/grab_cursor.png</property> <property name="paintable">resource:///cursors/grab_cursor.png</property>
</object> </object>
</child> </child>
<child> <child>
@@ -1801,7 +1801,7 @@
<property name="spacing">10</property> <property name="spacing">10</property>
<child> <child>
<object class="GtkImage"> <object class="GtkImage">
<property name="paintable">resource:///cursors/images/grabbing_cursor.png</property> <property name="paintable">resource:///cursors/grabbing_cursor.png</property>
</object> </object>
</child> </child>
<child> <child>
@@ -1874,7 +1874,7 @@
<property name="spacing">10</property> <property name="spacing">10</property>
<child> <child>
<object class="GtkImage"> <object class="GtkImage">
<property name="paintable">resource:///cursors/images/all_scroll_cursor.png</property> <property name="paintable">resource:///cursors/all_scroll_cursor.png</property>
</object> </object>
</child> </child>
<child> <child>
@@ -1934,7 +1934,7 @@
<property name="spacing">10</property> <property name="spacing">10</property>
<child> <child>
<object class="GtkImage"> <object class="GtkImage">
<property name="paintable">resource:///cursors/images/col_resize_cursor.png</property> <property name="paintable">resource:///cursors/col_resize_cursor.png</property>
</object> </object>
</child> </child>
<child> <child>
@@ -1994,7 +1994,7 @@
<property name="spacing">10</property> <property name="spacing">10</property>
<child> <child>
<object class="GtkImage"> <object class="GtkImage">
<property name="paintable">resource:///cursors/images/row_resize_cursor.png</property> <property name="paintable">resource:///cursors/row_resize_cursor.png</property>
</object> </object>
</child> </child>
<child> <child>
@@ -2054,7 +2054,7 @@
<property name="spacing">10</property> <property name="spacing">10</property>
<child> <child>
<object class="GtkImage"> <object class="GtkImage">
<property name="paintable">resource:///cursors/images/n_resize_cursor.png</property> <property name="paintable">resource:///cursors/n_resize_cursor.png</property>
</object> </object>
</child> </child>
<child> <child>
@@ -2114,7 +2114,7 @@
<property name="spacing">10</property> <property name="spacing">10</property>
<child> <child>
<object class="GtkImage"> <object class="GtkImage">
<property name="paintable">resource:///cursors/images/e_resize_cursor.png</property> <property name="paintable">resource:///cursors/e_resize_cursor.png</property>
</object> </object>
</child> </child>
<child> <child>
@@ -2174,7 +2174,7 @@
<property name="spacing">10</property> <property name="spacing">10</property>
<child> <child>
<object class="GtkImage"> <object class="GtkImage">
<property name="paintable">resource:///cursors/images/s_resize_cursor.png</property> <property name="paintable">resource:///cursors/s_resize_cursor.png</property>
</object> </object>
</child> </child>
<child> <child>
@@ -2234,7 +2234,7 @@
<property name="spacing">10</property> <property name="spacing">10</property>
<child> <child>
<object class="GtkImage"> <object class="GtkImage">
<property name="paintable">resource:///cursors/images/w_resize_cursor.png</property> <property name="paintable">resource:///cursors/w_resize_cursor.png</property>
</object> </object>
</child> </child>
<child> <child>
@@ -2294,7 +2294,7 @@
<property name="spacing">10</property> <property name="spacing">10</property>
<child> <child>
<object class="GtkImage"> <object class="GtkImage">
<property name="paintable">resource:///cursors/images/ne_resize_cursor.png</property> <property name="paintable">resource:///cursors/ne_resize_cursor.png</property>
</object> </object>
</child> </child>
<child> <child>
@@ -2354,7 +2354,7 @@
<property name="spacing">10</property> <property name="spacing">10</property>
<child> <child>
<object class="GtkImage"> <object class="GtkImage">
<property name="paintable">resource:///cursors/images/nw_resize_cursor.png</property> <property name="paintable">resource:///cursors/nw_resize_cursor.png</property>
</object> </object>
</child> </child>
<child> <child>
@@ -2414,7 +2414,7 @@
<property name="spacing">10</property> <property name="spacing">10</property>
<child> <child>
<object class="GtkImage"> <object class="GtkImage">
<property name="paintable">resource:///cursors/images/sw_resize_cursor.png</property> <property name="paintable">resource:///cursors/sw_resize_cursor.png</property>
</object> </object>
</child> </child>
<child> <child>
@@ -2474,7 +2474,7 @@
<property name="spacing">10</property> <property name="spacing">10</property>
<child> <child>
<object class="GtkImage"> <object class="GtkImage">
<property name="paintable">resource:///cursors/images/se_resize_cursor.png</property> <property name="paintable">resource:///cursors/se_resize_cursor.png</property>
</object> </object>
</child> </child>
<child> <child>
@@ -2534,7 +2534,7 @@
<property name="spacing">10</property> <property name="spacing">10</property>
<child> <child>
<object class="GtkImage"> <object class="GtkImage">
<property name="paintable">resource:///cursors/images/ew_resize_cursor.png</property> <property name="paintable">resource:///cursors/ew_resize_cursor.png</property>
</object> </object>
</child> </child>
<child> <child>
@@ -2594,7 +2594,7 @@
<property name="spacing">10</property> <property name="spacing">10</property>
<child> <child>
<object class="GtkImage"> <object class="GtkImage">
<property name="paintable">resource:///cursors/images/ns_resize_cursor.png</property> <property name="paintable">resource:///cursors/ns_resize_cursor.png</property>
</object> </object>
</child> </child>
<child> <child>
@@ -2654,7 +2654,7 @@
<property name="spacing">10</property> <property name="spacing">10</property>
<child> <child>
<object class="GtkImage"> <object class="GtkImage">
<property name="paintable">resource:///cursors/images/nesw_resize_cursor.png</property> <property name="paintable">resource:///cursors/nesw_resize_cursor.png</property>
</object> </object>
</child> </child>
<child> <child>
@@ -2714,7 +2714,7 @@
<property name="spacing">10</property> <property name="spacing">10</property>
<child> <child>
<object class="GtkImage"> <object class="GtkImage">
<property name="paintable">resource:///cursors/images/nwse_resize_cursor.png</property> <property name="paintable">resource:///cursors/nwse_resize_cursor.png</property>
</object> </object>
</child> </child>
<child> <child>
@@ -2787,7 +2787,7 @@
<property name="spacing">10</property> <property name="spacing">10</property>
<child> <child>
<object class="GtkImage"> <object class="GtkImage">
<property name="paintable">resource:///cursors/images/zoom_in_cursor.png</property> <property name="paintable">resource:///cursors/zoom_in_cursor.png</property>
</object> </object>
</child> </child>
<child> <child>
@@ -2847,7 +2847,7 @@
<property name="spacing">10</property> <property name="spacing">10</property>
<child> <child>
<object class="GtkImage"> <object class="GtkImage">
<property name="paintable">resource:///cursors/images/zoom_out_cursor.png</property> <property name="paintable">resource:///cursors/zoom_out_cursor.png</property>
</object> </object>
</child> </child>
<child> <child>

View File

@@ -1,10 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<gresources> <gresources>
<gresource prefix="/">
</gresource>
<gresource prefix="/ui"> <gresource prefix="/ui">
<file preprocess="xml-stripblanks">main.ui</file> <file preprocess="xml-stripblanks">main.ui</file>
<file preprocess="xml-stripblanks">main-listitem.ui</file> <file preprocess="xml-stripblanks">appmenu.ui</file>
</gresource> </gresource>
<gresource prefix="/application_demo"> <gresource prefix="/application_demo">
<file>application.c</file> <file>application.c</file>
@@ -51,8 +49,6 @@
<file>cssview.css</file> <file>cssview.css</file>
<file>reset.css</file> <file>reset.css</file>
<file>background.jpg</file> <file>background.jpg</file>
</gresource>
<gresource prefix="/css_pixbufs/images">
<file>apple-red.png</file> <file>apple-red.png</file>
<file>gnome-applets.png</file> <file>gnome-applets.png</file>
<file>gnome-calendar.png</file> <file>gnome-calendar.png</file>
@@ -69,8 +65,6 @@
</gresource> </gresource>
<gresource prefix="/cursors"> <gresource prefix="/cursors">
<file>cursors.ui</file> <file>cursors.ui</file>
</gresource>
<gresource prefix="/cursors/images">
<file>alias_cursor.png</file> <file>alias_cursor.png</file>
<file>all_scroll_cursor.png</file> <file>all_scroll_cursor.png</file>
<file>cell_cursor.png</file> <file>cell_cursor.png</file>
@@ -109,12 +103,6 @@
<file>zoom_in_cursor.png</file> <file>zoom_in_cursor.png</file>
<file>zoom_out_cursor.png</file> <file>zoom_out_cursor.png</file>
</gresource> </gresource>
<gresource prefix="/dnd">
<file>dnd.css</file>
</gresource>
<gresource prefix="/errorstates">
<file>errorstates.ui</file>
</gresource>
<gresource prefix="/fishbowl"> <gresource prefix="/fishbowl">
<file>fishbowl.ui</file> <file>fishbowl.ui</file>
<file>gtkfishbowl.c</file> <file>gtkfishbowl.c</file>
@@ -124,27 +112,6 @@
<file>gtkgears.c</file> <file>gtkgears.c</file>
<file>gtkgears.h</file> <file>gtkgears.h</file>
</gresource> </gresource>
<gresource prefix="/shadertoy">
<file>gtkshadertoy.c</file>
<file>gtkshadertoy.h</file>
<file>alienplanet.glsl</file>
<file>mandelbrot.glsl</file>
<file>neon.glsl</file>
<file>cogs.glsl</file>
<file>glowingstars.glsl</file>
</gresource>
<gresource prefix="/gltransition">
<file>gtkshaderstack.c</file>
<file>gtkshaderstack.h</file>
<file>gtkshaderbin.h</file>
<file>gtkshaderbin.c</file>
<file>fire.glsl</file>
<file>transition1.glsl</file>
<file>transition2.glsl</file>
<file>transition3.glsl</file>
<file>transition4.glsl</file>
<file>cogs2.glsl</file>
</gresource>
<gresource prefix="/iconscroll"> <gresource prefix="/iconscroll">
<file>iconscroll.ui</file> <file>iconscroll.ui</file>
</gresource> </gresource>
@@ -152,52 +119,6 @@
<file>gnome-fs-directory.png</file> <file>gnome-fs-directory.png</file>
<file>gnome-fs-regular.png</file> <file>gnome-fs-regular.png</file>
</gresource> </gresource>
<gresource prefix="/layoutmanager">
<file>demolayout.h</file>
<file>demolayout.c</file>
<file>demowidget.h</file>
<file>demowidget.c</file>
<file>demochild.h</file>
<file>demochild.c</file>
</gresource>
<gresource prefix="/layoutmanager2">
<file>demo2layout.h</file>
<file>demo2layout.c</file>
<file>demo2widget.h</file>
<file>demo2widget.c</file>
<file>four_point_transform.h</file>
<file>four_point_transform.c</file>
<file>singular_value_decomposition.h</file>
<file>singular_value_decomposition.c</file>
</gresource>
<gresource prefix="/listview_filebrowser">
<file>listview_filebrowser.ui</file>
<file>listview_filebrowser.css</file>
</gresource>
<gresource prefix="/listview_minesweeper">
<file>listview_minesweeper.ui</file>
<file>listview_minesweeper_cell.ui</file>
</gresource>
<gresource prefix="/listview_settings">
<file>listview_settings.ui</file>
</gresource>
<gresource prefix="/listview_weather">
<file compressed="true">listview_weather.txt</file>
</gresource>
<gresource prefix="/listview_colors">
<file compressed="true">color.names.txt</file>
<file>listview_colors.css</file>
</gresource>
<gresource prefix="/main">
<file>fontify.c</file>
<file>fontify.h</file>
<file>main.ui</file>
</gresource>
<gresource prefix="/menu">
<file>demo3widget.c</file>
<file>demo3widget.h</file>
<file>demo3widget.ui</file>
</gresource>
<gresource prefix="/shortcuts"> <gresource prefix="/shortcuts">
<file>shortcuts.ui</file> <file>shortcuts.ui</file>
<file>shortcuts-builder.ui</file> <file>shortcuts-builder.ui</file>
@@ -221,8 +142,16 @@
<file>floppybuddy.gif</file> <file>floppybuddy.gif</file>
<file>gtk-logo.webm</file> <file>gtk-logo.webm</file>
</gresource> </gresource>
<gresource prefix="/video-player"> <gresource prefix="/pixbufs">
<file>bbb.png</file> <file>apple-red.png</file>
<file>background.jpg</file>
<file>gnome-applets.png</file>
<file>gnome-calendar.png</file>
<file>gnome-foot.png</file>
<file>gnome-gmush.png</file>
<file>gnome-gimp.png</file>
<file>gnome-gsame.png</file>
<file>gnu-keys.png</file>
</gresource> </gresource>
<gresource prefix="/sources"> <gresource prefix="/sources">
<file>application_demo.c</file> <file>application_demo.c</file>
@@ -242,12 +171,10 @@
<file>cursors.c</file> <file>cursors.c</file>
<file>dialog.c</file> <file>dialog.c</file>
<file>drawingarea.c</file> <file>drawingarea.c</file>
<file>dropdown.c</file>
<file>dnd.c</file> <file>dnd.c</file>
<file>editable_cells.c</file> <file>editable_cells.c</file>
<file>entry_completion.c</file> <file>entry_completion.c</file>
<file>entry_undo.c</file> <file>entry_undo.c</file>
<file>errorstates.c</file>
<file>expander.c</file> <file>expander.c</file>
<file>filtermodel.c</file> <file>filtermodel.c</file>
<file>fishbowl.c</file> <file>fishbowl.c</file>
@@ -259,7 +186,6 @@
<file>gears.c</file> <file>gears.c</file>
<file>gestures.c</file> <file>gestures.c</file>
<file>glarea.c</file> <file>glarea.c</file>
<file>gltransition.c</file>
<file>headerbar.c</file> <file>headerbar.c</file>
<file>hypertext.c</file> <file>hypertext.c</file>
<file>iconscroll.c</file> <file>iconscroll.c</file>
@@ -267,42 +193,29 @@
<file>iconview_edit.c</file> <file>iconview_edit.c</file>
<file>images.c</file> <file>images.c</file>
<file>infobar.c</file> <file>infobar.c</file>
<file>layoutmanager.c</file>
<file>layoutmanager2.c</file>
<file>links.c</file> <file>links.c</file>
<file>listbox.c</file> <file>listbox.c</file>
<file>listbox2.c</file>
<file>listview_applauncher.c</file>
<file>listview_colors.c</file>
<file>listview_clocks.c</file>
<file>listview_filebrowser.c</file>
<file>listview_minesweeper.c</file>
<file>listview_settings.c</file>
<file>listview_weather.c</file>
<file>listview_words.c</file>
<file>list_store.c</file> <file>list_store.c</file>
<file>main.c</file>
<file>markup.c</file> <file>markup.c</file>
<file>menu.c</file> <file>modelbutton.c</file>
<file>overlay.c</file> <file>overlay.c</file>
<file>overlay2.c</file> <file>overlay2.c</file>
<file>paint.c</file> <file>paint.c</file>
<file>pagesetup.c</file> <file>pagesetup.c</file>
<file>paintable.c</file> <file>paintable.c</file>
<file>paintable_animated.c</file> <file>paintable_animated.c</file>
<file>paintable_emblem.c</file>
<file>paintable_mediastream.c</file> <file>paintable_mediastream.c</file>
<file>panes.c</file> <file>panes.c</file>
<file>password_entry.c</file> <file>password_entry.c</file>
<file>peg_solitaire.c</file> <file>peg_solitaire.c</file>
<file>pickers.c</file> <file>pickers.c</file>
<file>pixbufs.c</file>
<file>printing.c</file> <file>printing.c</file>
<file>revealer.c</file> <file>revealer.c</file>
<file>rotated_text.c</file> <file>rotated_text.c</file>
<file>scale.c</file> <file>scale.c</file>
<file>search_entry.c</file> <file>search_entry.c</file>
<file>search_entry2.c</file> <file>search_entry2.c</file>
<file>shadertoy.c</file>
<file>shortcuts.c</file> <file>shortcuts.c</file>
<file>shortcut_triggers.c</file> <file>shortcut_triggers.c</file>
<file>sizegroup.c</file> <file>sizegroup.c</file>
@@ -334,9 +247,6 @@
<file>messages.txt</file> <file>messages.txt</file>
<file>apple-red.png</file> <file>apple-red.png</file>
</gresource> </gresource>
<gresource prefix="/listbox2">
<file>listbox2.ui</file>
</gresource>
<gresource prefix="/glarea"> <gresource prefix="/glarea">
<file>glarea-gl.fs.glsl</file> <file>glarea-gl.fs.glsl</file>
<file>glarea-gl.vs.glsl</file> <file>glarea-gl.vs.glsl</file>
@@ -359,7 +269,6 @@
</gresource> </gresource>
<gresource prefix="/transparent"> <gresource prefix="/transparent">
<file>portland-rose.jpg</file> <file>portland-rose.jpg</file>
<file>bluroverlay.h</file>
<file>bluroverlay.c</file> <file>bluroverlay.c</file>
</gresource> </gresource>
<gresource prefix="/markup"> <gresource prefix="/markup">
@@ -368,6 +277,9 @@
<gresource prefix="/scale"> <gresource prefix="/scale">
<file>scale.ui</file> <file>scale.ui</file>
</gresource> </gresource>
<gresource prefix="/modelbutton">
<file>modelbutton.ui</file>
</gresource>
<gresource prefix="/tagged_entry"> <gresource prefix="/tagged_entry">
<file>demotaggedentry.c</file> <file>demotaggedentry.c</file>
<file>demotaggedentry.h</file> <file>demotaggedentry.h</file>

View File

@@ -29,24 +29,29 @@
<item> <item>
<attribute name="label" translatable="yes">_New</attribute> <attribute name="label" translatable="yes">_New</attribute>
<attribute name="action">win.new</attribute> <attribute name="action">win.new</attribute>
<attribute name="accel">&lt;Control&gt;n</attribute>
</item> </item>
<item> <item>
<attribute name="label" translatable="yes">_Open</attribute> <attribute name="label" translatable="yes">_Open</attribute>
<attribute name="action">win.open</attribute> <attribute name="action">win.open</attribute>
<attribute name="accel">&lt;Control&gt;o</attribute>
</item> </item>
<item> <item>
<attribute name="label" translatable="yes">_Save</attribute> <attribute name="label" translatable="yes">_Save</attribute>
<attribute name="action">win.save</attribute> <attribute name="action">win.save</attribute>
<attribute name="accel">&lt;Control&gt;s</attribute>
</item> </item>
<item> <item>
<attribute name="label" translatable="yes">Save _As</attribute> <attribute name="label" translatable="yes">Save _As</attribute>
<attribute name="action">win.save-as</attribute> <attribute name="action">win.save-as</attribute>
<attribute name="accel">&lt;Control&gt;q</attribute>
</item> </item>
</section> </section>
<section> <section>
<item> <item>
<attribute name="label" translatable="yes">_Quit</attribute> <attribute name="label" translatable="yes">_Quit</attribute>
<attribute name="action">win.quit</attribute> <attribute name="action">win.quit</attribute>
<attribute name="accel">&lt;Control&gt;&lt;Shift&gt;s</attribute>
</item> </item>
</section> </section>
</submenu> </submenu>
@@ -56,14 +61,17 @@
<item> <item>
<attribute name="label" translatable="yes">_Copy</attribute> <attribute name="label" translatable="yes">_Copy</attribute>
<attribute name="action">win.copy</attribute> <attribute name="action">win.copy</attribute>
<attribute name="accel">&lt;Control&gt;c</attribute>
</item> </item>
<item> <item>
<attribute name="label" translatable="yes">_Cut</attribute> <attribute name="label" translatable="yes">_Cut</attribute>
<attribute name="action">win.cut</attribute> <attribute name="action">win.cut</attribute>
<attribute name="accel">&lt;Control&gt;x</attribute>
</item> </item>
<item> <item>
<attribute name="label" translatable="yes">_Paste</attribute> <attribute name="label" translatable="yes">_Paste</attribute>
<attribute name="action">win.paste</attribute> <attribute name="action">win.paste</attribute>
<attribute name="accel">&lt;Control&gt;v</attribute>
</item> </item>
</section> </section>
</submenu> </submenu>
@@ -73,10 +81,12 @@
<item> <item>
<attribute name="label" translatable="yes">_Help</attribute> <attribute name="label" translatable="yes">_Help</attribute>
<attribute name="action">win.help</attribute> <attribute name="action">win.help</attribute>
<attribute name="accel">F1</attribute>
</item> </item>
<item> <item>
<attribute name="label" translatable="yes">_About</attribute> <attribute name="label" translatable="yes">_About</attribute>
<attribute name="action">win.about</attribute> <attribute name="action">win.about</attribute>
<attribute name="accel">F7</attribute>
</item> </item>
</section> </section>
</submenu> </submenu>
@@ -84,7 +94,9 @@
<object class="GtkAboutDialog" id="aboutdialog1"> <object class="GtkAboutDialog" id="aboutdialog1">
<property name="program-name" translatable="yes">Builder demo</property> <property name="program-name" translatable="yes">Builder demo</property>
<property name="logo-icon-name" translatable="yes">gtk3-demo</property> <property name="logo-icon-name" translatable="yes">gtk3-demo</property>
<property name="modal">True</property> <accessibility>
<relation target="window1" type="subwindow-of"/>
</accessibility>
</object> </object>
<object class="GtkWindow" id="window1"> <object class="GtkWindow" id="window1">
<property name="default-height">250</property> <property name="default-height">250</property>
@@ -100,15 +112,16 @@
</child> </child>
<child> <child>
<object class="GtkBox" id="toolbar1"> <object class="GtkBox" id="toolbar1">
<style> <child internal-child="accessible">
<class name="toolbar"/> <object class="AtkObject" id="a11y-toolbar">
</style> <property name="AtkObject::accessible-name">The toolbar</property>
</object>
</child>
<child> <child>
<object class="GtkButton"> <object class="GtkButton">
<property name="label" translatable="yes">New</property> <property name="label" translatable="yes">New</property>
<property name="tooltip-text" translatable="yes">Create a new file</property> <property name="tooltip-text" translatable="yes">Create a new file</property>
<property name="icon-name">document-new</property> <property name="icon-name">document-new</property>
<property name="action-name">win.new</property>
</object> </object>
</child> </child>
<child> <child>
@@ -116,7 +129,6 @@
<property name="label" translatable="yes">Open</property> <property name="label" translatable="yes">Open</property>
<property name="tooltip-text" translatable="yes">Open a file</property> <property name="tooltip-text" translatable="yes">Open a file</property>
<property name="icon-name">document-open</property> <property name="icon-name">document-open</property>
<property name="action-name">win.open</property>
</object> </object>
</child> </child>
<child> <child>
@@ -124,7 +136,6 @@
<property name="label" translatable="yes">Save</property> <property name="label" translatable="yes">Save</property>
<property name="tooltip-text" translatable="yes">Save a file</property> <property name="tooltip-text" translatable="yes">Save a file</property>
<property name="icon-name">document-save</property> <property name="icon-name">document-save</property>
<property name="action-name">win.save</property>
</object> </object>
</child> </child>
<child> <child>
@@ -135,7 +146,6 @@
<property name="label" translatable="yes">Copy</property> <property name="label" translatable="yes">Copy</property>
<property name="tooltip-text" translatable="yes">Copy selected object into the clipboard</property> <property name="tooltip-text" translatable="yes">Copy selected object into the clipboard</property>
<property name="icon-name">edit-copy</property> <property name="icon-name">edit-copy</property>
<property name="action-name">win.copy</property>
</object> </object>
</child> </child>
<child> <child>
@@ -143,7 +153,6 @@
<property name="label" translatable="yes">Cut</property> <property name="label" translatable="yes">Cut</property>
<property name="tooltip-text" translatable="yes">Cut selected object into the clipboard</property> <property name="tooltip-text" translatable="yes">Cut selected object into the clipboard</property>
<property name="icon-name">edit-cut</property> <property name="icon-name">edit-cut</property>
<property name="action-name">win.cut</property>
</object> </object>
</child> </child>
<child> <child>
@@ -151,7 +160,6 @@
<property name="label" translatable="yes">Paste</property> <property name="label" translatable="yes">Paste</property>
<property name="tooltip-text" translatable="yes">Paste object from the clipboard</property> <property name="tooltip-text" translatable="yes">Paste object from the clipboard</property>
<property name="icon-name">edit-paste</property> <property name="icon-name">edit-paste</property>
<property name="action-name">win.paste</property>
</object> </object>
</child> </child>
</object> </object>
@@ -165,6 +173,14 @@
<object class="GtkTreeView" id="treeview1"> <object class="GtkTreeView" id="treeview1">
<property name="model">liststore1</property> <property name="model">liststore1</property>
<property name="tooltip-column">3</property> <property name="tooltip-column">3</property>
<child internal-child="accessible">
<object class="AtkObject" id="a11y-treeview">
<property name="AtkObject::accessible-name">Name list</property>
<property name="AtkObject::accessible-description">
A list of person with name, surname and age columns
</property>
</object>
</child>
<child> <child>
<object class="GtkTreeViewColumn" id="column1"> <object class="GtkTreeViewColumn" id="column1">
<property name="title">Name</property> <property name="title">Name</property>

View File

@@ -1,204 +0,0 @@
#include "demo2layout.h"
#include "four_point_transform.h"
struct _Demo2Layout
{
GtkLayoutManager parent_instance;
float position;
float offset;
};
struct _Demo2LayoutClass
{
GtkLayoutManagerClass parent_class;
};
G_DEFINE_TYPE (Demo2Layout, demo2_layout, GTK_TYPE_LAYOUT_MANAGER)
static void
demo2_layout_measure (GtkLayoutManager *layout_manager,
GtkWidget *widget,
GtkOrientation orientation,
int for_size,
int *minimum,
int *natural,
int *minimum_baseline,
int *natural_baseline)
{
GtkWidget *child;
int minimum_size = 0;
int natural_size = 0;
for (child = gtk_widget_get_first_child (widget);
child != NULL;
child = gtk_widget_get_next_sibling (child))
{
int child_min = 0, child_nat = 0;
if (!gtk_widget_should_layout (child))
continue;
gtk_widget_measure (child, orientation, -1,
&child_min, &child_nat,
NULL, NULL);
minimum_size = MAX (minimum_size, child_min);
natural_size = MAX (natural_size, child_nat);
}
*minimum = minimum_size;
*natural = 3 * natural_size;
}
#define RADIANS(angle) ((angle)*M_PI/180.0);
/* Spherical coordinates */
#define SX(r,t,p) ((r) * sin (t) * cos (p))
#define SZ(r,t,p) ((r) * sin (t) * sin (p))
#define SY(r,t,p) ((r) * cos (t))
static double
map_offset (double x)
{
x = fmod (x, 180.0);
if (x < 0.0)
x += 180.0;
return x;
}
static void
demo2_layout_allocate (GtkLayoutManager *layout_manager,
GtkWidget *widget,
int width,
int height,
int baseline)
{
GtkWidget *child;
GtkRequisition child_req;
int i, j, k;
float x0, y0;
float w, h;
graphene_point3d_t p1, p2, p3, p4;
graphene_point3d_t q1, q2, q3, q4;
double t_1, t_2, p_1, p_2;
double r;
graphene_matrix_t m;
GskTransform *transform;
double position = DEMO2_LAYOUT (layout_manager)->position;
double offset = DEMO2_LAYOUT (layout_manager)->offset;
/* for simplicity, assume all children are the same size */
gtk_widget_get_preferred_size (gtk_widget_get_first_child (widget), &child_req, NULL);
w = child_req.width;
h = child_req.height;
r = 300;
x0 = y0 = 300;
for (child = gtk_widget_get_first_child (widget), i = 0;
child != NULL;
child = gtk_widget_get_next_sibling (child), i++)
{
j = i / 36;
k = i % 36;
gtk_widget_set_child_visible (child, FALSE);
graphene_point3d_init (&p1, w, h, 1.);
graphene_point3d_init (&p2, w, 0., 1.);
graphene_point3d_init (&p3, 0., 0., 1.);
graphene_point3d_init (&p4, 0., h, 1.);
t_1 = RADIANS (map_offset (offset + 10 * j));
t_2 = RADIANS (map_offset (offset + 10 * (j + 1)));
p_1 = RADIANS (position + 10 * k);
p_2 = RADIANS (position + 10 * (k + 1));
if (t_2 < t_1)
continue;
if (SZ (r, t_1, p_1) > 0 ||
SZ (r, t_2, p_1) > 0 ||
SZ (r, t_1, p_2) > 0 ||
SZ (r, t_2, p_2) > 0)
continue;
gtk_widget_set_child_visible (child, TRUE);
graphene_point3d_init (&q1, x0 + SX (r, t_1, p_1), y0 + SY (r, t_1, p_1), SZ (r, t_1, p_1));
graphene_point3d_init (&q2, x0 + SX (r, t_2, p_1), y0 + SY (r, t_2, p_1), SZ (r, t_2, p_1));
graphene_point3d_init (&q3, x0 + SX (r, t_2, p_2), y0 + SY (r, t_2, p_2), SZ (r, t_2, p_2));
graphene_point3d_init (&q4, x0 + SX (r, t_1, p_2), y0 + SY (r, t_1, p_2), SZ (r, t_1, p_2));
/* Get a matrix that moves p1 -> q1, p2 -> q2, ... */
perspective_3d (&p1, &p2, &p3, &p4,
&q1, &q2, &q3, &q4,
&m);
transform = gsk_transform_matrix (NULL, &m);
/* Since our matrix was built for transforming points with z = 1,
* prepend a translation to the z = 1 plane.
*/
transform = gsk_transform_translate_3d (transform,
&GRAPHENE_POINT3D_INIT (0, 0, 1));
gtk_widget_allocate (child, w, h, -1, transform);
}
}
static GtkSizeRequestMode
demo2_layout_get_request_mode (GtkLayoutManager *layout_manager,
GtkWidget *widget)
{
return GTK_SIZE_REQUEST_CONSTANT_SIZE;
}
static void
demo2_layout_class_init (Demo2LayoutClass *klass)
{
GtkLayoutManagerClass *layout_class = GTK_LAYOUT_MANAGER_CLASS (klass);
layout_class->get_request_mode = demo2_layout_get_request_mode;
layout_class->measure = demo2_layout_measure;
layout_class->allocate = demo2_layout_allocate;
}
static void
demo2_layout_init (Demo2Layout *self)
{
}
GtkLayoutManager *
demo2_layout_new (void)
{
return g_object_new (DEMO2_TYPE_LAYOUT, NULL);
}
void
demo2_layout_set_position (Demo2Layout *layout,
float position)
{
layout->position = position;
}
float
demo2_layout_get_position (Demo2Layout *layout)
{
return layout->position;
}
void
demo2_layout_set_offset (Demo2Layout *layout,
float offset)
{
layout->offset = offset;
}
float
demo2_layout_get_offset (Demo2Layout *layout)
{
return layout->offset;
}

View File

@@ -1,16 +0,0 @@
#pragma once
#include <gtk/gtk.h>
#define DEMO2_TYPE_LAYOUT (demo2_layout_get_type ())
G_DECLARE_FINAL_TYPE (Demo2Layout, demo2_layout, DEMO2, LAYOUT, GtkLayoutManager)
GtkLayoutManager * demo2_layout_new (void);
void demo2_layout_set_position (Demo2Layout *layout,
float position);
float demo2_layout_get_position (Demo2Layout *layout);
void demo2_layout_set_offset (Demo2Layout *layout,
float offset);
float demo2_layout_get_offset (Demo2Layout *layout);

View File

@@ -1,172 +0,0 @@
#include "demo2widget.h"
#include "demo2layout.h"
struct _Demo2Widget
{
GtkWidget parent_instance;
gint64 start_time;
gint64 end_time;
float start_position;
float end_position;
float start_offset;
float end_offset;
gboolean animating;
};
struct _Demo2WidgetClass
{
GtkWidgetClass parent_class;
};
G_DEFINE_TYPE (Demo2Widget, demo2_widget, GTK_TYPE_WIDGET)
static void
demo2_widget_init (Demo2Widget *self)
{
gtk_widget_set_focusable (GTK_WIDGET (self), TRUE);
}
static void
demo2_widget_dispose (GObject *object)
{
GtkWidget *child;
while ((child = gtk_widget_get_first_child (GTK_WIDGET (object))))
gtk_widget_unparent (child);
G_OBJECT_CLASS (demo2_widget_parent_class)->dispose (object);
}
/* From clutter-easing.c, based on Robert Penner's
* infamous easing equations, MIT license.
*/
static double
ease_out_cubic (double t)
{
double p = t - 1;
return p * p * p + 1;
}
static gboolean
update_position (GtkWidget *widget,
GdkFrameClock *clock,
gpointer data)
{
Demo2Widget *self = DEMO2_WIDGET (widget);
Demo2Layout *layout = DEMO2_LAYOUT (gtk_widget_get_layout_manager (widget));
gint64 now;
double t;
now = gdk_frame_clock_get_frame_time (clock);
if (now >= self->end_time)
{
self->animating = FALSE;
return G_SOURCE_REMOVE;
}
t = (now - self->start_time) / (double) (self->end_time - self->start_time);
t = ease_out_cubic (t);
demo2_layout_set_position (layout, self->start_position + t * (self->end_position - self->start_position));
demo2_layout_set_offset (layout, self->start_offset + t * (self->end_offset - self->start_offset));
gtk_widget_queue_allocate (widget);
return G_SOURCE_CONTINUE;
}
static void
rotate_sphere (GtkWidget *widget,
const char *action,
GVariant *parameters)
{
Demo2Widget *self = DEMO2_WIDGET (widget);
Demo2Layout *layout = DEMO2_LAYOUT (gtk_widget_get_layout_manager (widget));
GtkOrientation orientation;
int direction;
g_variant_get (parameters, "(ii)", &orientation, &direction);
self->end_position = self->start_position = demo2_layout_get_position (layout);
self->end_offset = self->start_offset = demo2_layout_get_offset (layout);
if (orientation == GTK_ORIENTATION_HORIZONTAL)
self->end_position += 10 * direction;
else
self->end_offset += 10 * direction;
self->start_time = g_get_monotonic_time ();
self->end_time = self->start_time + 0.5 * G_TIME_SPAN_SECOND;
if (!self->animating)
{
gtk_widget_add_tick_callback (widget, update_position, NULL, NULL);
self->animating = TRUE;
}
}
static void
demo2_widget_snapshot (GtkWidget *widget,
GtkSnapshot *snapshot)
{
GtkWidget *child;
for (child = gtk_widget_get_first_child (widget);
child != NULL;
child = gtk_widget_get_next_sibling (child))
{
/* our layout manager sets this for children that are out of view */
if (!gtk_widget_get_child_visible (child))
continue;
gtk_widget_snapshot_child (widget, child, snapshot);
}
}
static void
demo2_widget_class_init (Demo2WidgetClass *class)
{
GObjectClass *object_class = G_OBJECT_CLASS (class);
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class);
object_class->dispose = demo2_widget_dispose;
widget_class->snapshot = demo2_widget_snapshot;
gtk_widget_class_install_action (widget_class, "rotate", "(ii)", rotate_sphere);
gtk_widget_class_add_binding_action (widget_class,
GDK_KEY_Left, 0,
"rotate",
"(ii)", GTK_ORIENTATION_HORIZONTAL, -1);
gtk_widget_class_add_binding_action (widget_class,
GDK_KEY_Right, 0,
"rotate",
"(ii)", GTK_ORIENTATION_HORIZONTAL, 1);
gtk_widget_class_add_binding_action (widget_class,
GDK_KEY_Up, 0,
"rotate",
"(ii)", GTK_ORIENTATION_VERTICAL, 1);
gtk_widget_class_add_binding_action (widget_class,
GDK_KEY_Down, 0,
"rotate",
"(ii)", GTK_ORIENTATION_VERTICAL, -1);
/* here is where we use our custom layout manager */
gtk_widget_class_set_layout_manager_type (widget_class, DEMO2_TYPE_LAYOUT);
}
GtkWidget *
demo2_widget_new (void)
{
return g_object_new (DEMO2_TYPE_WIDGET, NULL);
}
void
demo2_widget_add_child (Demo2Widget *self,
GtkWidget *child)
{
gtk_widget_set_parent (child, GTK_WIDGET (self));
}

View File

@@ -1,11 +0,0 @@
#pragma once
#include <gtk/gtk.h>
#define DEMO2_TYPE_WIDGET (demo2_widget_get_type ())
G_DECLARE_FINAL_TYPE (Demo2Widget, demo2_widget, DEMO2, WIDGET, GtkWidget)
GtkWidget * demo2_widget_new (void);
void demo2_widget_add_child (Demo2Widget *self,
GtkWidget *child);

View File

@@ -1,243 +0,0 @@
#include <math.h>
#include "demo3widget.h"
enum
{
PROP_PAINTABLE = 1,
PROP_SCALE
};
struct _Demo3Widget
{
GtkWidget parent_instance;
GdkPaintable *paintable;
float scale;
GtkWidget *menu;
};
struct _Demo3WidgetClass
{
GtkWidgetClass parent_class;
};
G_DEFINE_TYPE (Demo3Widget, demo3_widget, GTK_TYPE_WIDGET)
static void
demo3_widget_init (Demo3Widget *self)
{
self->scale = 1.f;
gtk_widget_init_template (GTK_WIDGET (self));
}
static void
demo3_widget_dispose (GObject *object)
{
Demo3Widget *self = DEMO3_WIDGET (object);
g_clear_object (&self->paintable);
g_clear_pointer (&self->menu, gtk_widget_unparent);
G_OBJECT_CLASS (demo3_widget_parent_class)->dispose (object);
}
static void
demo3_widget_snapshot (GtkWidget *widget,
GtkSnapshot *snapshot)
{
Demo3Widget *self = DEMO3_WIDGET (widget);
int x, y, width, height;
double w, h;
width = gtk_widget_get_width (widget);
height = gtk_widget_get_height (widget);
w = self->scale * gdk_paintable_get_intrinsic_width (self->paintable);
h = self->scale * gdk_paintable_get_intrinsic_height (self->paintable);
x = MAX (0, (width - ceil (w)) / 2);
y = MAX (0, (height - ceil (h)) / 2);
gtk_snapshot_push_clip (snapshot, &GRAPHENE_RECT_INIT (0, 0, width, height));
gtk_snapshot_save (snapshot);
gtk_snapshot_translate (snapshot, &GRAPHENE_POINT_INIT (x, y));
gdk_paintable_snapshot (self->paintable, snapshot, w, h);
gtk_snapshot_restore (snapshot);
gtk_snapshot_pop (snapshot);
}
static void
demo3_widget_measure (GtkWidget *widget,
GtkOrientation orientation,
int for_size,
int *minimum,
int *natural,
int *minimum_baseline,
int *natural_baseline)
{
Demo3Widget *self = DEMO3_WIDGET (widget);
int size;
if (orientation == GTK_ORIENTATION_HORIZONTAL)
size = gdk_paintable_get_intrinsic_width (self->paintable);
else
size = gdk_paintable_get_intrinsic_height (self->paintable);
*minimum = *natural = self->scale * size;
}
static void
demo3_widget_size_allocate (GtkWidget *widget,
int width,
int height,
int baseline)
{
Demo3Widget *self = DEMO3_WIDGET (widget);
/* Since we are not using a layout manager (who would do this
* for us), we need to allocate a size for our menu by calling
* gtk_native_check_resize().
*/
gtk_native_check_resize (GTK_NATIVE (self->menu));
}
static void
demo3_widget_set_property (GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
{
Demo3Widget *self = DEMO3_WIDGET (object);
switch (prop_id)
{
case PROP_PAINTABLE:
g_clear_object (&self->paintable);
self->paintable = g_value_dup_object (value);
gtk_widget_queue_resize (GTK_WIDGET (object));
break;
case PROP_SCALE:
self->scale = g_value_get_float (value);
gtk_widget_queue_resize (GTK_WIDGET (object));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static void
demo3_widget_get_property (GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec)
{
Demo3Widget *self = DEMO3_WIDGET (object);
switch (prop_id)
{
case PROP_PAINTABLE:
g_value_set_object (value, self->paintable);
break;
case PROP_SCALE:
g_value_set_float (value, self->scale);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static void
pressed_cb (GtkGestureClick *gesture,
guint n_press,
double x,
double y,
Demo3Widget *self)
{
/* We are placing our menu at the point where
* the click happened, before popping it up.
*/
gtk_popover_set_pointing_to (GTK_POPOVER (self->menu),
&(const GdkRectangle){ x, y, 1, 1 });
gtk_popover_popup (GTK_POPOVER (self->menu));
}
static void
zoom_cb (GtkWidget *widget,
const char *action_name,
GVariant *parameter)
{
Demo3Widget *self = DEMO3_WIDGET (widget);
float scale;
if (g_str_equal (action_name, "zoom.in"))
scale = MIN (10, self->scale * M_SQRT2);
else if (g_str_equal (action_name, "zoom.out"))
scale = MAX (0.01, self->scale / M_SQRT2);
else
scale = 1.0;
gtk_widget_action_set_enabled (widget, "zoom.in", scale < 10);
gtk_widget_action_set_enabled (widget, "zoom.out", scale > 0.01);
gtk_widget_action_set_enabled (widget, "zoom.reset", scale != 1);
g_object_set (widget, "scale", scale, NULL);
}
static void
demo3_widget_class_init (Demo3WidgetClass *class)
{
GObjectClass *object_class = G_OBJECT_CLASS (class);
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class);
object_class->dispose = demo3_widget_dispose;
object_class->set_property = demo3_widget_set_property;
object_class->get_property = demo3_widget_get_property;
widget_class->snapshot = demo3_widget_snapshot;
widget_class->measure = demo3_widget_measure;
widget_class->size_allocate = demo3_widget_size_allocate;
g_object_class_install_property (object_class, PROP_PAINTABLE,
g_param_spec_object ("paintable", "Paintable", "Paintable",
GDK_TYPE_PAINTABLE,
G_PARAM_READWRITE));
g_object_class_install_property (object_class, PROP_SCALE,
g_param_spec_float ("scale", "Scale", "Scale",
0.0, 10.0, 1.0,
G_PARAM_READWRITE));
/* These are the actions that we are using in the menu */
gtk_widget_class_install_action (widget_class, "zoom.in", NULL, zoom_cb);
gtk_widget_class_install_action (widget_class, "zoom.out", NULL, zoom_cb);
gtk_widget_class_install_action (widget_class, "zoom.reset", NULL, zoom_cb);
gtk_widget_class_set_template_from_resource (widget_class, "/menu/demo3widget.ui");
gtk_widget_class_bind_template_child (widget_class, Demo3Widget, menu);
gtk_widget_class_bind_template_callback (widget_class, pressed_cb);
}
GtkWidget *
demo3_widget_new (const char *resource)
{
Demo3Widget *self;
GdkPixbuf *pixbuf;
GdkPaintable *paintable;
pixbuf = gdk_pixbuf_new_from_resource (resource, NULL);
paintable = GDK_PAINTABLE (gdk_texture_new_for_pixbuf (pixbuf));
self = g_object_new (DEMO3_TYPE_WIDGET, "paintable", paintable, NULL);
g_object_unref (pixbuf);
g_object_unref (paintable);
return GTK_WIDGET (self);
}

View File

@@ -1,8 +0,0 @@
#pragma once
#include <gtk/gtk.h>
#define DEMO3_TYPE_WIDGET (demo3_widget_get_type ())
G_DECLARE_FINAL_TYPE (Demo3Widget, demo3_widget, DEMO3, WIDGET, GtkWidget)
GtkWidget * demo3_widget_new (const char *resource);

View File

@@ -1,30 +0,0 @@
<interface>
<menu id="model">
<item>
<attribute name="label">Zoom Out</attribute>
<attribute name="action">zoom.out</attribute>
</item>
<item>
<attribute name="label">Zoom In</attribute>
<attribute name="action">zoom.in</attribute>
</item>
<item>
<attribute name="label">11</attribute>
<attribute name="action">zoom.reset</attribute>
</item>
</menu>
<template class="Demo3Widget">
<child>
<object class="GtkPopoverMenu" id="menu">
<property name="has-arrow">0</property>
<property name="menu-model">model</property>
</object>
</child>
<child>
<object class="GtkGestureClick">
<property name="button">3</property>
<signal name="pressed" handler="pressed_cb"/>
</object>
</child>
</template>
</interface>

View File

@@ -1,72 +0,0 @@
#include "demochild.h"
/* This is a trivial child widget just for demo purposes.
* It draws a 32x32 square in fixed color.
*/
struct _DemoChild
{
GtkWidget parent_instance;
GdkRGBA color;
};
struct _DemoChildClass
{
GtkWidgetClass parent_class;
};
G_DEFINE_TYPE (DemoChild, demo_child, GTK_TYPE_WIDGET)
static void
demo_child_init (DemoChild *self)
{
}
static void
demo_child_snapshot (GtkWidget *widget,
GtkSnapshot *snapshot)
{
DemoChild *self = DEMO_CHILD (widget);
int width, height;
width = gtk_widget_get_width (widget);
height = gtk_widget_get_height (widget);
gtk_snapshot_append_color (snapshot, &self->color,
&GRAPHENE_RECT_INIT(0, 0, width, height));
}
static void
demo_child_measure (GtkWidget *widget,
GtkOrientation orientation,
int for_size,
int *minimum,
int *natural,
int *minimum_baseline,
int *natural_baseline)
{
*minimum = *natural = 32;
}
static void
demo_child_class_init (DemoChildClass *class)
{
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class);
widget_class->snapshot = demo_child_snapshot;
widget_class->measure = demo_child_measure;
}
GtkWidget *
demo_child_new (const char *color)
{
DemoChild *self;
self = g_object_new (DEMO_TYPE_CHILD,
"tooltip-text", color,
NULL);
gdk_rgba_parse (&self->color, color);
return GTK_WIDGET (self);
}

View File

@@ -1,8 +0,0 @@
#pragma once
#include <gtk/gtk.h>
#define DEMO_TYPE_CHILD (demo_child_get_type ())
G_DECLARE_FINAL_TYPE (DemoChild, demo_child, DEMO, CHILD, GtkWidget)
GtkWidget * demo_child_new (const char *color);

View File

@@ -17,7 +17,7 @@ G_DEFINE_TYPE(DemoImage, demo_image, GTK_TYPE_WIDGET)
static GdkPaintable * static GdkPaintable *
get_image_paintable (GtkImage *image) get_image_paintable (GtkImage *image)
{ {
const char *icon_name; const gchar *icon_name;
GtkIconTheme *icon_theme; GtkIconTheme *icon_theme;
GtkIconPaintable *icon; GtkIconPaintable *icon;

View File

@@ -1,189 +0,0 @@
#include "demolayout.h"
struct _DemoLayout
{
GtkLayoutManager parent_instance;
float position;
int pos[16];
};
struct _DemoLayoutClass
{
GtkLayoutManagerClass parent_class;
};
G_DEFINE_TYPE (DemoLayout, demo_layout, GTK_TYPE_LAYOUT_MANAGER)
static void
demo_layout_measure (GtkLayoutManager *layout_manager,
GtkWidget *widget,
GtkOrientation orientation,
int for_size,
int *minimum,
int *natural,
int *minimum_baseline,
int *natural_baseline)
{
GtkWidget *child;
int minimum_size = 0;
int natural_size = 0;
for (child = gtk_widget_get_first_child (widget);
child != NULL;
child = gtk_widget_get_next_sibling (child))
{
int child_min = 0, child_nat = 0;
if (!gtk_widget_should_layout (child))
continue;
gtk_widget_measure (child, orientation, -1,
&child_min, &child_nat,
NULL, NULL);
minimum_size = MAX (minimum_size, child_min);
natural_size = MAX (natural_size, child_nat);
}
/* A back-of-a-napkin calculation to reserve enough
* space for arranging 16 children in a circle.
*/
*minimum = 16 * minimum_size / G_PI + minimum_size;
*natural = 16 * natural_size / G_PI + natural_size;
}
static void
demo_layout_allocate (GtkLayoutManager *layout_manager,
GtkWidget *widget,
int width,
int height,
int baseline)
{
DemoLayout *self = DEMO_LAYOUT (layout_manager);
GtkWidget *child;
int i;
int child_width = 0;
int child_height = 0;
int x0, y0;
float r;
float t;
t = self->position;
for (child = gtk_widget_get_first_child (widget);
child != NULL;
child = gtk_widget_get_next_sibling (child))
{
GtkRequisition child_req;
if (!gtk_widget_should_layout (child))
continue;
gtk_widget_get_preferred_size (child, &child_req, NULL);
child_width = MAX (child_width, child_req.width);
child_height = MAX (child_height, child_req.height);
}
/* the center of our layout */
x0 = (width / 2);
y0 = (height / 2);
/* the radius for our circle of children */
r = 8 * child_width / G_PI;
for (child = gtk_widget_get_first_child (widget), i = 0;
child != NULL;
child = gtk_widget_get_next_sibling (child), i++)
{
GtkRequisition child_req;
float a = self->pos[i] * G_PI / 8;
int gx, gy;
int cx, cy;
int x, y;
if (!gtk_widget_should_layout (child))
continue;
gtk_widget_get_preferred_size (child, &child_req, NULL);
/* The grid position of child. */
gx = x0 + (i % 4 - 2) * child_width;
gy = y0 + (i / 4 - 2) * child_height;
/* The circle position of child. Note that we
* are adjusting the position by half the child size
* to place the center of child on a centered circle.
* This assumes that the children don't use align flags
* or uneven margins that would shift the center.
*/
cx = x0 + sin (a) * r - child_req.width / 2;
cy = y0 + cos (a) * r - child_req.height / 2;
/* we interpolate between the two layouts according to
* the position value that has been set on the layout.
*/
x = t * cx + (1 - t) * gx;
y = t * cy + (1 - t) * gy;
gtk_widget_size_allocate (child,
&(const GtkAllocation){ x, y, child_width, child_height},
-1);
}
}
static GtkSizeRequestMode
demo_layout_get_request_mode (GtkLayoutManager *layout_manager,
GtkWidget *widget)
{
return GTK_SIZE_REQUEST_CONSTANT_SIZE;
}
static void
demo_layout_class_init (DemoLayoutClass *klass)
{
GtkLayoutManagerClass *layout_class = GTK_LAYOUT_MANAGER_CLASS (klass);
layout_class->get_request_mode = demo_layout_get_request_mode;
layout_class->measure = demo_layout_measure;
layout_class->allocate = demo_layout_allocate;
}
static void
demo_layout_init (DemoLayout *self)
{
int i;
for (i = 0; i < 16; i++)
self->pos[i] = i;
}
GtkLayoutManager *
demo_layout_new (void)
{
return g_object_new (DEMO_TYPE_LAYOUT, NULL);
}
void
demo_layout_set_position (DemoLayout *layout,
float position)
{
layout->position = position;
}
/* Shuffle the circle positions of the children.
* Should be called when we are in the grid layout.
*/
void
demo_layout_shuffle (DemoLayout *layout)
{
int i, j, tmp;
for (i = 0; i < 16; i++)
{
j = g_random_int_range (0, i + 1);
tmp = layout->pos[i];
layout->pos[i] = layout->pos[j];
layout->pos[j] = tmp;
}
}

View File

@@ -1,13 +0,0 @@
#pragma once
#include <gtk/gtk.h>
#define DEMO_TYPE_LAYOUT (demo_layout_get_type ())
G_DECLARE_FINAL_TYPE (DemoLayout, demo_layout, DEMO, LAYOUT, GtkLayoutManager)
GtkLayoutManager * demo_layout_new (void);
void demo_layout_set_position (DemoLayout *layout,
float position);
void demo_layout_shuffle (DemoLayout *layout);

View File

@@ -23,31 +23,33 @@
#include "demotaggedentry.h" #include "demotaggedentry.h"
#include <gtk/gtk.h> #include <gtk/gtk.h>
#include <gtk/gtk-a11y.h>
struct _DemoTaggedEntry typedef struct {
{ GtkWidget *box;
GtkWidget parent_instance; GtkWidget *entry;
} DemoTaggedEntryPrivate;
GtkWidget *text;
};
struct _DemoTaggedEntryClass
{
GtkWidgetClass parent_class;
};
static void demo_tagged_entry_editable_init (GtkEditableInterface *iface); static void demo_tagged_entry_editable_init (GtkEditableInterface *iface);
G_DEFINE_TYPE_WITH_CODE (DemoTaggedEntry, demo_tagged_entry, GTK_TYPE_WIDGET, G_DEFINE_TYPE_WITH_CODE (DemoTaggedEntry, demo_tagged_entry, GTK_TYPE_WIDGET,
G_ADD_PRIVATE (DemoTaggedEntry)
G_IMPLEMENT_INTERFACE (GTK_TYPE_EDITABLE, demo_tagged_entry_editable_init)) G_IMPLEMENT_INTERFACE (GTK_TYPE_EDITABLE, demo_tagged_entry_editable_init))
static void static void
demo_tagged_entry_init (DemoTaggedEntry *entry) demo_tagged_entry_init (DemoTaggedEntry *entry)
{ {
entry->text = gtk_text_new (); DemoTaggedEntryPrivate *priv = demo_tagged_entry_get_instance_private (entry);
gtk_widget_set_hexpand (entry->text, TRUE);
gtk_widget_set_vexpand (entry->text, TRUE); priv->box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
gtk_widget_set_parent (entry->text, GTK_WIDGET (entry)); gtk_widget_set_parent (priv->box, GTK_WIDGET (entry));
priv->entry = gtk_text_new ();
gtk_widget_set_hexpand (priv->entry, TRUE);
gtk_widget_set_vexpand (priv->entry, TRUE);
gtk_widget_set_hexpand (priv->box, FALSE);
gtk_widget_set_vexpand (priv->box, FALSE);
gtk_container_add (GTK_CONTAINER (priv->box), priv->entry);
gtk_editable_init_delegate (GTK_EDITABLE (entry)); gtk_editable_init_delegate (GTK_EDITABLE (entry));
} }
@@ -55,19 +57,23 @@ static void
demo_tagged_entry_dispose (GObject *object) demo_tagged_entry_dispose (GObject *object)
{ {
DemoTaggedEntry *entry = DEMO_TAGGED_ENTRY (object); DemoTaggedEntry *entry = DEMO_TAGGED_ENTRY (object);
GtkWidget *child; DemoTaggedEntryPrivate *priv = demo_tagged_entry_get_instance_private (entry);
if (entry->text) if (priv->entry)
gtk_editable_finish_delegate (GTK_EDITABLE (entry)); gtk_editable_finish_delegate (GTK_EDITABLE (entry));
while ((child = gtk_widget_get_first_child (GTK_WIDGET (entry)))) g_clear_pointer (&priv->entry, gtk_widget_unparent);
gtk_widget_unparent (child); g_clear_pointer (&priv->box, gtk_widget_unparent);
entry->text = NULL;
G_OBJECT_CLASS (demo_tagged_entry_parent_class)->dispose (object); G_OBJECT_CLASS (demo_tagged_entry_parent_class)->dispose (object);
} }
static void
demo_tagged_entry_finalize (GObject *object)
{
G_OBJECT_CLASS (demo_tagged_entry_parent_class)->finalize (object);
}
static void static void
demo_tagged_entry_set_property (GObject *object, demo_tagged_entry_set_property (GObject *object,
guint prop_id, guint prop_id,
@@ -92,12 +98,44 @@ demo_tagged_entry_get_property (GObject *object,
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
} }
static void
demo_tagged_entry_measure (GtkWidget *widget,
GtkOrientation orientation,
int for_size,
int *minimum,
int *natural,
int *minimum_baseline,
int *natural_baseline)
{
DemoTaggedEntry *entry = DEMO_TAGGED_ENTRY (widget);
DemoTaggedEntryPrivate *priv = demo_tagged_entry_get_instance_private (entry);
gtk_widget_measure (priv->box, orientation, for_size,
minimum, natural,
minimum_baseline, natural_baseline);
}
static void
demo_tagged_entry_size_allocate (GtkWidget *widget,
int width,
int height,
int baseline)
{
DemoTaggedEntry *entry = DEMO_TAGGED_ENTRY (widget);
DemoTaggedEntryPrivate *priv = demo_tagged_entry_get_instance_private (entry);
gtk_widget_size_allocate (priv->box,
&(GtkAllocation) { 0, 0, width, height },
baseline);
}
static gboolean static gboolean
demo_tagged_entry_grab_focus (GtkWidget *widget) demo_tagged_entry_grab_focus (GtkWidget *widget)
{ {
DemoTaggedEntry *entry = DEMO_TAGGED_ENTRY (widget); DemoTaggedEntry *entry = DEMO_TAGGED_ENTRY (widget);
DemoTaggedEntryPrivate *priv = demo_tagged_entry_get_instance_private (entry);
return gtk_widget_grab_focus (entry->text); return gtk_widget_grab_focus (priv->entry);
} }
static void static void
@@ -107,21 +145,27 @@ demo_tagged_entry_class_init (DemoTaggedEntryClass *klass)
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
object_class->dispose = demo_tagged_entry_dispose; object_class->dispose = demo_tagged_entry_dispose;
object_class->finalize = demo_tagged_entry_finalize;
object_class->get_property = demo_tagged_entry_get_property; object_class->get_property = demo_tagged_entry_get_property;
object_class->set_property = demo_tagged_entry_set_property; object_class->set_property = demo_tagged_entry_set_property;
widget_class->measure = demo_tagged_entry_measure;
widget_class->size_allocate = demo_tagged_entry_size_allocate;
widget_class->grab_focus = demo_tagged_entry_grab_focus; widget_class->grab_focus = demo_tagged_entry_grab_focus;
gtk_editable_install_properties (object_class, 1); gtk_editable_install_properties (object_class, 1);
gtk_widget_class_set_layout_manager_type (widget_class, GTK_TYPE_BOX_LAYOUT); gtk_widget_class_set_accessible_type (widget_class, GTK_TYPE_ENTRY_ACCESSIBLE);
gtk_widget_class_set_css_name (widget_class, "entry"); gtk_widget_class_set_css_name (widget_class, "entry");
} }
static GtkEditable * static GtkEditable *
demo_tagged_entry_get_delegate (GtkEditable *editable) demo_tagged_entry_get_delegate (GtkEditable *editable)
{ {
return GTK_EDITABLE (DEMO_TAGGED_ENTRY (editable)->text); DemoTaggedEntry *entry = DEMO_TAGGED_ENTRY (editable);
DemoTaggedEntryPrivate *priv = demo_tagged_entry_get_instance_private (entry);
return GTK_EDITABLE (priv->entry);
} }
static void static void
@@ -140,9 +184,11 @@ void
demo_tagged_entry_add_tag (DemoTaggedEntry *entry, demo_tagged_entry_add_tag (DemoTaggedEntry *entry,
GtkWidget *tag) GtkWidget *tag)
{ {
DemoTaggedEntryPrivate *priv = demo_tagged_entry_get_instance_private (entry);
g_return_if_fail (DEMO_IS_TAGGED_ENTRY (entry)); g_return_if_fail (DEMO_IS_TAGGED_ENTRY (entry));
gtk_widget_set_parent (tag, GTK_WIDGET (entry)); gtk_container_add (GTK_CONTAINER (priv->box), tag);
} }
void void
@@ -150,24 +196,30 @@ demo_tagged_entry_insert_tag_after (DemoTaggedEntry *entry,
GtkWidget *tag, GtkWidget *tag,
GtkWidget *sibling) GtkWidget *sibling)
{ {
DemoTaggedEntryPrivate *priv = demo_tagged_entry_get_instance_private (entry);
g_return_if_fail (DEMO_IS_TAGGED_ENTRY (entry)); g_return_if_fail (DEMO_IS_TAGGED_ENTRY (entry));
gtk_widget_insert_after (tag, GTK_WIDGET (entry), sibling); if (sibling == NULL)
gtk_container_add (GTK_CONTAINER (priv->box), tag);
else
gtk_box_insert_child_after (GTK_BOX (priv->box), tag, sibling);
} }
void void
demo_tagged_entry_remove_tag (DemoTaggedEntry *entry, demo_tagged_entry_remove_tag (DemoTaggedEntry *entry,
GtkWidget *tag) GtkWidget *tag)
{ {
DemoTaggedEntryPrivate *priv = demo_tagged_entry_get_instance_private (entry);
g_return_if_fail (DEMO_IS_TAGGED_ENTRY (entry)); g_return_if_fail (DEMO_IS_TAGGED_ENTRY (entry));
gtk_widget_unparent (tag); gtk_container_remove (GTK_CONTAINER (priv->box), tag);
} }
struct _DemoTaggedEntryTag struct _DemoTaggedEntryTag
{ {
GtkWidget parent; GtkWidget parent;
GtkWidget *box; GtkWidget *box;
GtkWidget *label; GtkWidget *label;
GtkWidget *button; GtkWidget *button;
@@ -198,11 +250,11 @@ static guint signals[LAST_SIGNAL] = { 0, };
G_DEFINE_TYPE (DemoTaggedEntryTag, demo_tagged_entry_tag, GTK_TYPE_WIDGET) G_DEFINE_TYPE (DemoTaggedEntryTag, demo_tagged_entry_tag, GTK_TYPE_WIDGET)
static void static void
on_released (GtkGestureClick *gesture, on_released (GtkGestureClick *gesture,
int n_press, int n_press,
double x, double x,
double y, double y,
DemoTaggedEntryTag *tag) DemoTaggedEntryTag *tag)
{ {
g_signal_emit (tag, signals[SIGNAL_CLICKED], 0); g_signal_emit (tag, signals[SIGNAL_CLICKED], 0);
} }
@@ -216,7 +268,7 @@ demo_tagged_entry_tag_init (DemoTaggedEntryTag *tag)
tag->box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); tag->box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
gtk_widget_set_parent (tag->box, GTK_WIDGET (tag)); gtk_widget_set_parent (tag->box, GTK_WIDGET (tag));
tag->label = gtk_label_new (""); tag->label = gtk_label_new ("");
gtk_box_append (GTK_BOX (tag->box), tag->label); gtk_container_add (GTK_CONTAINER (tag->box), tag->label);
gesture = gtk_gesture_click_new (); gesture = gtk_gesture_click_new ();
g_signal_connect (gesture, "released", G_CALLBACK (on_released), tag); g_signal_connect (gesture, "released", G_CALLBACK (on_released), tag);
@@ -408,7 +460,7 @@ demo_tagged_entry_tag_set_has_close_button (DemoTaggedEntryTag *tag,
if (!has_close_button && tag->button) if (!has_close_button && tag->button)
{ {
gtk_box_remove (GTK_BOX (tag->box), tag->button); gtk_container_remove (GTK_CONTAINER (tag->box), tag->button);
tag->button = NULL; tag->button = NULL;
} }
else if (has_close_button && tag->button == NULL) else if (has_close_button && tag->button == NULL)
@@ -417,11 +469,11 @@ demo_tagged_entry_tag_set_has_close_button (DemoTaggedEntryTag *tag,
image = gtk_image_new_from_icon_name ("window-close-symbolic"); image = gtk_image_new_from_icon_name ("window-close-symbolic");
tag->button = gtk_button_new (); tag->button = gtk_button_new ();
gtk_button_set_child (GTK_BUTTON (tag->button), image); gtk_container_add (GTK_CONTAINER (tag->button), image);
gtk_widget_set_halign (tag->button, GTK_ALIGN_CENTER); gtk_widget_set_halign (tag->button, GTK_ALIGN_CENTER);
gtk_widget_set_valign (tag->button, GTK_ALIGN_CENTER); gtk_widget_set_valign (tag->button, GTK_ALIGN_CENTER);
gtk_button_set_has_frame (GTK_BUTTON (tag->button), FALSE); gtk_button_set_has_frame (GTK_BUTTON (tag->button), FALSE);
gtk_box_append (GTK_BOX (tag->box), tag->button); gtk_container_add (GTK_CONTAINER (tag->box), tag->button);
g_signal_connect (tag->button, "clicked", G_CALLBACK (on_button_clicked), tag); g_signal_connect (tag->button, "clicked", G_CALLBACK (on_button_clicked), tag);
} }

View File

@@ -25,11 +25,39 @@
G_BEGIN_DECLS G_BEGIN_DECLS
#define DEMO_TYPE_TAGGED_ENTRY (demo_tagged_entry_get_type ()) #define DEMO_TYPE_TAGGED_ENTRY (demo_tagged_entry_get_type ())
G_DECLARE_FINAL_TYPE (DemoTaggedEntry, demo_tagged_entry, DEMO, TAGGED_ENTRY, GtkWidget) #define DEMO_TAGGED_ENTRY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), DEMO_TYPE_TAGGED_ENTRY, DemoTaggedEntry))
#define DEMO_TAGGED_ENTRY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), DEMO_TYPE_TAGGED_ENTRY, DemoTaggedEntryClass))
#define DEMO_IS_TAGGED_ENTRY(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), DEMO_TYPE_TAGGED_ENTRY))
#define DEMO_IS_TAGGED_ENTRY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), DEMO_TYPE_TAGGED_ENTRY))
#define DEMO_TAGGED_ENTRY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), DEMO_TYPE_TAGGED_ENTRY, DemoTaggedEntryClass))
#define DEMO_TYPE_TAGGED_ENTRY_TAG (demo_tagged_entry_tag_get_type ()) typedef struct _DemoTaggedEntry DemoTaggedEntry;
G_DECLARE_FINAL_TYPE (DemoTaggedEntryTag, demo_tagged_entry_tag, DEMO, TAGGED_ENTRY_TAG, GtkWidget) typedef struct _DemoTaggedEntryClass DemoTaggedEntryClass;
struct _DemoTaggedEntry
{
GtkWidget parent;
};
struct _DemoTaggedEntryClass
{
GtkWidgetClass parent_class;
};
#define DEMO_TYPE_TAGGED_ENTRY_TAG (demo_tagged_entry_tag_get_type ())
#define DEMO_TAGGED_ENTRY_TAG(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), DEMO_TYPE_TAGGED_ENTRY_TAG, DemoTaggedEntryTag))
#define DEMO_TAGGED_ENTRY_TAG_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), DEMO_TYPE_TAGGED_ENTRY_TAG, DemoTaggedEntryTag))
#define DEMO_IS_TAGGED_ENTRY_TAG(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), DEMO_TYPE_TAGGED_ENTRY_TAG))
#define DEMO_IS_TAGGED_ENTRY_TAG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), DEMO_TYPE_TAGGED_ENTRY_TAG))
#define DEMO_TAGGED_ENTRY_TAG_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), DEMO_TYPE_TAGGED_ENTRY_TAG, DemoTaggedEntryTagClass))
typedef struct _DemoTaggedEntryTag DemoTaggedEntryTag;
typedef struct _DemoTaggedEntryTagClass DemoTaggedEntryTagClass;
GType demo_tagged_entry_get_type (void) G_GNUC_CONST;
GType demo_tagged_entry_tag_get_type (void) G_GNUC_CONST;
GtkWidget * demo_tagged_entry_new (void); GtkWidget * demo_tagged_entry_new (void);

View File

@@ -1,121 +0,0 @@
#include "demowidget.h"
#include "demolayout.h"
/* parent widget */
struct _DemoWidget
{
GtkWidget parent_instance;
gboolean backward; /* whether we go 0 -> 1 or 1 -> 0 */
gint64 start_time; /* time the transition started */
guint tick_id; /* our tick cb */
};
struct _DemoWidgetClass
{
GtkWidgetClass parent_class;
};
G_DEFINE_TYPE (DemoWidget, demo_widget, GTK_TYPE_WIDGET)
/* The widget is controlling the transition by calling
* demo_layout_set_position() in a tick callback.
*
* We take half a second to go from one layout to the other.
*/
#define DURATION (0.5 * G_TIME_SPAN_SECOND)
static gboolean
transition (GtkWidget *widget,
GdkFrameClock *frame_clock,
gpointer data)
{
DemoWidget *self = DEMO_WIDGET (widget);
DemoLayout *demo_layout = DEMO_LAYOUT (gtk_widget_get_layout_manager (widget));
gint64 now = g_get_monotonic_time ();
gtk_widget_queue_allocate (widget);
if (self->backward)
demo_layout_set_position (demo_layout, 1.0 - (now - self->start_time) / DURATION);
else
demo_layout_set_position (demo_layout, (now - self->start_time) / DURATION);
if (now - self->start_time >= DURATION)
{
self->backward = !self->backward;
demo_layout_set_position (demo_layout, self->backward ? 1.0 : 0.0);
/* keep things interesting by shuffling the positions */
if (!self->backward)
demo_layout_shuffle (demo_layout);
self->tick_id = 0;
return G_SOURCE_REMOVE;
}
return G_SOURCE_CONTINUE;
}
static void
clicked (GtkGestureClick *gesture,
guint n_press,
double x,
double y,
gpointer data)
{
DemoWidget *self = data;
if (self->tick_id != 0)
return;
self->start_time = g_get_monotonic_time ();
self->tick_id = gtk_widget_add_tick_callback (GTK_WIDGET (self), transition, NULL, NULL);
}
static void
demo_widget_init (DemoWidget *self)
{
GtkGesture *gesture;
gesture = gtk_gesture_click_new ();
g_signal_connect (gesture, "pressed", G_CALLBACK (clicked), self);
gtk_widget_add_controller (GTK_WIDGET (self), GTK_EVENT_CONTROLLER (gesture));
}
static void
demo_widget_dispose (GObject *object)
{
GtkWidget *child;
while ((child = gtk_widget_get_first_child (GTK_WIDGET (object))))
gtk_widget_unparent (child);
G_OBJECT_CLASS (demo_widget_parent_class)->dispose (object);
}
static void
demo_widget_class_init (DemoWidgetClass *class)
{
GObjectClass *object_class = G_OBJECT_CLASS (class);
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class);
object_class->dispose = demo_widget_dispose;
/* here is where we use our custom layout manager */
gtk_widget_class_set_layout_manager_type (widget_class, DEMO_TYPE_LAYOUT);
}
GtkWidget *
demo_widget_new (void)
{
return g_object_new (DEMO_TYPE_WIDGET, NULL);
}
void
demo_widget_add_child (DemoWidget *self,
GtkWidget *child)
{
gtk_widget_set_parent (child, GTK_WIDGET (self));
}

View File

@@ -1,11 +0,0 @@
#pragma once
#include <gtk/gtk.h>
#define DEMO_TYPE_WIDGET (demo_widget_get_type ())
G_DECLARE_FINAL_TYPE (DemoWidget, demo_widget, DEMO, WIDGET, GtkWidget)
GtkWidget * demo_widget_new (void);
void demo_widget_add_child (DemoWidget *self,
GtkWidget *child);

View File

@@ -1,8 +1,6 @@
/* Dialogs /* Dialogs and Message Boxes
* #Keywords: GtkMessageDialog
* *
* Dialogs are used to pop up transient windows for information * Dialog widgets are used to pop up a transient window for user feedback.
* and user feedback.
*/ */
#include <glib/gi18n.h> #include <glib/gi18n.h>
@@ -17,77 +15,57 @@ message_dialog_clicked (GtkButton *button,
gpointer user_data) gpointer user_data)
{ {
GtkWidget *dialog; GtkWidget *dialog;
static int i = 1; static gint i = 1;
dialog = gtk_message_dialog_new (GTK_WINDOW (window), dialog = gtk_message_dialog_new (GTK_WINDOW (window),
GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
GTK_MESSAGE_INFO, GTK_MESSAGE_INFO,
GTK_BUTTONS_OK_CANCEL, GTK_BUTTONS_OK_CANCEL,
"Test message"); "This message box has been popped up the following\n"
"number of times:");
gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog), gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
ngettext ("Has been shown once", "Has been shown %d times", i), i); "%d", i);
g_signal_connect (dialog, "response", G_CALLBACK (gtk_window_destroy), NULL); gtk_dialog_run (GTK_DIALOG (dialog));
gtk_widget_show (dialog); gtk_widget_destroy (dialog);
i++; i++;
} }
typedef struct {
GtkWidget *local_entry1;
GtkWidget *local_entry2;
GtkWidget *global_entry1;
GtkWidget *global_entry2;
} ResponseData;
static void
on_dialog_response (GtkDialog *dialog,
int response,
gpointer user_data)
{
ResponseData *data = user_data;
if (response == GTK_RESPONSE_OK)
{
gtk_editable_set_text (GTK_EDITABLE (data->global_entry1),
gtk_editable_get_text (GTK_EDITABLE (data->local_entry1)));
gtk_editable_set_text (GTK_EDITABLE (data->global_entry2),
gtk_editable_get_text (GTK_EDITABLE (data->local_entry2)));
}
gtk_window_destroy (GTK_WINDOW (dialog));
}
static void static void
interactive_dialog_clicked (GtkButton *button, interactive_dialog_clicked (GtkButton *button,
gpointer user_data) gpointer user_data)
{ {
GtkWidget *content_area; GtkWidget *content_area;
GtkWidget *dialog; GtkWidget *dialog;
GtkWidget *hbox;
GtkWidget *image;
GtkWidget *table; GtkWidget *table;
GtkWidget *local_entry1; GtkWidget *local_entry1;
GtkWidget *local_entry2; GtkWidget *local_entry2;
GtkWidget *label; GtkWidget *label;
ResponseData *data; gint response;
dialog = gtk_dialog_new_with_buttons ("Interactive Dialog", dialog = gtk_dialog_new_with_buttons ("Interactive Dialog",
GTK_WINDOW (window), GTK_WINDOW (window),
GTK_DIALOG_MODAL| GTK_DIALOG_DESTROY_WITH_PARENT|GTK_DIALOG_USE_HEADER_BAR, GTK_DIALOG_MODAL| GTK_DIALOG_DESTROY_WITH_PARENT,
_("_OK"), GTK_RESPONSE_OK, _("_OK"),
_("_Cancel"), GTK_RESPONSE_CANCEL, GTK_RESPONSE_OK,
"_Cancel",
GTK_RESPONSE_CANCEL,
NULL); NULL);
gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK);
content_area = gtk_dialog_get_content_area (GTK_DIALOG (dialog)); content_area = gtk_dialog_get_content_area (GTK_DIALOG (dialog));
table = gtk_grid_new (); hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 8);
gtk_widget_set_hexpand (table, TRUE); gtk_container_add (GTK_CONTAINER (content_area), hbox);
gtk_widget_set_vexpand (table, TRUE);
gtk_widget_set_halign (table, GTK_ALIGN_CENTER);
gtk_widget_set_valign (table, GTK_ALIGN_CENTER);
gtk_box_append (GTK_BOX (content_area), table);
gtk_grid_set_row_spacing (GTK_GRID (table), 6);
gtk_grid_set_column_spacing (GTK_GRID (table), 6);
image = gtk_image_new_from_icon_name ("dialog-question");
gtk_image_set_icon_size (GTK_IMAGE (image), GTK_ICON_SIZE_LARGE);
gtk_container_add (GTK_CONTAINER (hbox), image);
table = gtk_grid_new ();
gtk_grid_set_row_spacing (GTK_GRID (table), 4);
gtk_grid_set_column_spacing (GTK_GRID (table), 4);
gtk_container_add (GTK_CONTAINER (hbox), table);
label = gtk_label_new_with_mnemonic ("_Entry 1"); label = gtk_label_new_with_mnemonic ("_Entry 1");
gtk_grid_attach (GTK_GRID (table), label, 0, 0, 1, 1); gtk_grid_attach (GTK_GRID (table), label, 0, 0, 1, 1);
local_entry1 = gtk_entry_new (); local_entry1 = gtk_entry_new ();
@@ -103,23 +81,21 @@ interactive_dialog_clicked (GtkButton *button,
gtk_grid_attach (GTK_GRID (table), local_entry2, 1, 1, 1, 1); gtk_grid_attach (GTK_GRID (table), local_entry2, 1, 1, 1, 1);
gtk_label_set_mnemonic_widget (GTK_LABEL (label), local_entry2); gtk_label_set_mnemonic_widget (GTK_LABEL (label), local_entry2);
data = g_new (ResponseData, 1); response = gtk_dialog_run (GTK_DIALOG (dialog));
data->local_entry1 = local_entry1;
data->local_entry2 = local_entry2;
data->global_entry1 = entry1;
data->global_entry2 = entry2;
g_signal_connect_data (dialog, "response", if (response == GTK_RESPONSE_OK)
G_CALLBACK (on_dialog_response), {
data, (GClosureNotify) g_free, gtk_editable_set_text (GTK_EDITABLE (entry1), gtk_editable_get_text (GTK_EDITABLE (local_entry1)));
0); gtk_editable_set_text (GTK_EDITABLE (entry2), gtk_editable_get_text (GTK_EDITABLE (local_entry2)));
}
gtk_widget_show (dialog); gtk_widget_destroy (dialog);
} }
GtkWidget * GtkWidget *
do_dialog (GtkWidget *do_widget) do_dialog (GtkWidget *do_widget)
{ {
GtkWidget *frame;
GtkWidget *vbox; GtkWidget *vbox;
GtkWidget *vbox2; GtkWidget *vbox2;
GtkWidget *hbox; GtkWidget *hbox;
@@ -132,42 +108,50 @@ do_dialog (GtkWidget *do_widget)
window = gtk_window_new (); window = gtk_window_new ();
gtk_window_set_display (GTK_WINDOW (window), gtk_window_set_display (GTK_WINDOW (window),
gtk_widget_get_display (do_widget)); gtk_widget_get_display (do_widget));
gtk_window_set_title (GTK_WINDOW (window), "Dialogs"); gtk_window_set_title (GTK_WINDOW (window), "Dialogs and Message Boxes");
gtk_window_set_resizable (GTK_WINDOW (window), FALSE);
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window); g_signal_connect (window, "destroy",
G_CALLBACK (gtk_widget_destroyed), &window);
frame = gtk_frame_new ("Dialogs");
gtk_widget_set_margin_start (frame, 8);
gtk_widget_set_margin_end (frame, 8);
gtk_widget_set_margin_top (frame, 8);
gtk_widget_set_margin_bottom (frame, 8);
gtk_window_set_child (GTK_WINDOW (window), frame);
vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 8); vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 8);
gtk_widget_set_margin_start (vbox, 8); gtk_widget_set_margin_start (vbox, 8);
gtk_widget_set_margin_end (vbox, 8); gtk_widget_set_margin_end (vbox, 8);
gtk_widget_set_margin_top (vbox, 8); gtk_widget_set_margin_top (vbox, 8);
gtk_widget_set_margin_bottom (vbox, 8); gtk_widget_set_margin_bottom (vbox, 8);
gtk_window_set_child (GTK_WINDOW (window), vbox); gtk_frame_set_child (GTK_FRAME (frame), vbox);
/* Standard message dialog */ /* Standard message dialog */
hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 8); hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 8);
gtk_box_append (GTK_BOX (vbox), hbox); gtk_container_add (GTK_CONTAINER (vbox), hbox);
button = gtk_button_new_with_mnemonic ("_Message Dialog"); button = gtk_button_new_with_mnemonic ("_Message Dialog");
g_signal_connect (button, "clicked", g_signal_connect (button, "clicked",
G_CALLBACK (message_dialog_clicked), NULL); G_CALLBACK (message_dialog_clicked), NULL);
gtk_box_append (GTK_BOX (hbox), button); gtk_container_add (GTK_CONTAINER (hbox), button);
gtk_box_append (GTK_BOX (vbox), gtk_separator_new (GTK_ORIENTATION_HORIZONTAL)); gtk_container_add (GTK_CONTAINER (vbox), gtk_separator_new (GTK_ORIENTATION_HORIZONTAL));
/* Interactive dialog*/ /* Interactive dialog*/
hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 8); hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 8);
gtk_box_append (GTK_BOX (vbox), hbox); gtk_container_add (GTK_CONTAINER (vbox), hbox);
vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
button = gtk_button_new_with_mnemonic ("_Interactive Dialog"); button = gtk_button_new_with_mnemonic ("_Interactive Dialog");
g_signal_connect (button, "clicked", g_signal_connect (button, "clicked",
G_CALLBACK (interactive_dialog_clicked), NULL); G_CALLBACK (interactive_dialog_clicked), NULL);
gtk_box_append (GTK_BOX (hbox), vbox2); gtk_container_add (GTK_CONTAINER (hbox), vbox2);
gtk_box_append (GTK_BOX (vbox2), button); gtk_container_add (GTK_CONTAINER (vbox2), button);
table = gtk_grid_new (); table = gtk_grid_new ();
gtk_grid_set_row_spacing (GTK_GRID (table), 4); gtk_grid_set_row_spacing (GTK_GRID (table), 4);
gtk_grid_set_column_spacing (GTK_GRID (table), 4); gtk_grid_set_column_spacing (GTK_GRID (table), 4);
gtk_box_append (GTK_BOX (hbox), table); gtk_container_add (GTK_CONTAINER (hbox), table);
label = gtk_label_new_with_mnemonic ("_Entry 1"); label = gtk_label_new_with_mnemonic ("_Entry 1");
gtk_grid_attach (GTK_GRID (table), label, 0, 0, 1, 1); gtk_grid_attach (GTK_GRID (table), label, 0, 0, 1, 1);
@@ -186,7 +170,7 @@ do_dialog (GtkWidget *do_widget)
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
gtk_widget_show (window); gtk_widget_show (window);
else else
gtk_window_destroy (GTK_WINDOW (window)); gtk_widget_destroy (window);
return window; return window;
} }

View File

@@ -1,362 +1,12 @@
/* Drag-and-Drop /* Drag-and-Drop
* #Keywords: dnd, menu, popover, gesture
* *
* This demo shows dragging colors and widgets. * This demo shows dragging colors and widgets.
* The items in this demo can be moved, recolored * The items in this demo can be moved, recolored
* and rotated. * and rotated.
*
* The demo also has an example for creating a
* menu-like popover without using a menu model.
*/ */
#include <gtk/gtk.h> #include <gtk/gtk.h>
G_DECLARE_FINAL_TYPE (CanvasItem, canvas_item, CANVAS, ITEM, GtkWidget)
struct _CanvasItem {
GtkWidget parent;
GtkWidget *fixed;
GtkWidget *label;
double r;
double angle;
double delta;
GtkWidget *editor;
};
struct _CanvasItemClass {
GtkWidgetClass parent_class;
};
G_DEFINE_TYPE (CanvasItem, canvas_item, GTK_TYPE_WIDGET)
static int n_items = 0;
static void
set_color (CanvasItem *item,
GdkRGBA *color)
{
char *css;
char *str;
GtkStyleContext *context;
GtkCssProvider *provider;
const char *old_class;
str = gdk_rgba_to_string (color);
css = g_strdup_printf ("* { background: %s; }", str);
context = gtk_widget_get_style_context (item->label);
provider = g_object_get_data (G_OBJECT (context), "style-provider");
if (provider)
gtk_style_context_remove_provider (context, GTK_STYLE_PROVIDER (provider));
old_class = (const char *)g_object_get_data (G_OBJECT (item->label), "css-class");
if (old_class)
gtk_widget_remove_css_class (item->label, old_class);
provider = gtk_css_provider_new ();
gtk_css_provider_load_from_data (provider, css, -1);
gtk_style_context_add_provider (gtk_widget_get_style_context (item->label), GTK_STYLE_PROVIDER (provider), 800);
g_object_set_data_full (G_OBJECT (context), "style-provider", provider, g_object_unref);
g_free (str);
g_free (css);
}
static void
set_css (CanvasItem *item,
const char *class)
{
GtkStyleContext *context;
GtkCssProvider *provider;
const char *old_class;
context = gtk_widget_get_style_context (item->label);
provider = g_object_get_data (G_OBJECT (context), "style-provider");
if (provider)
gtk_style_context_remove_provider (context, GTK_STYLE_PROVIDER (provider));
old_class = (const char *)g_object_get_data (G_OBJECT (item->label), "css-class");
if (old_class)
gtk_widget_remove_css_class (item->label, old_class);
g_object_set_data_full (G_OBJECT (item->label), "css-class", g_strdup (class), g_free);
gtk_widget_add_css_class (item->label, class);
}
static gboolean
item_drag_drop (GtkDropTarget *dest,
const GValue *value,
double x,
double y)
{
GtkWidget *label = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (dest));
CanvasItem *item = CANVAS_ITEM (gtk_widget_get_parent (gtk_widget_get_parent (label)));
if (G_VALUE_TYPE (value) == GDK_TYPE_RGBA)
set_color (item, g_value_get_boxed (value));
else if (G_VALUE_TYPE (value) == G_TYPE_STRING)
set_css (item, g_value_get_string (value));
return TRUE;
}
static void
apply_transform (CanvasItem *item)
{
GskTransform *transform;
double x, y;
x = gtk_widget_get_allocated_width (item->label) / 2.0;
y = gtk_widget_get_allocated_height (item->label) / 2.0;
item->r = sqrt (x*x + y*y);
transform = gsk_transform_translate (
gsk_transform_rotate (
gsk_transform_translate (NULL,
&(graphene_point_t) { item->r, item->r }),
item->angle + item->delta),
&(graphene_point_t) { - x, - y });
gtk_fixed_set_child_transform (GTK_FIXED (item->fixed), item->label, transform);
gsk_transform_unref (transform);
}
static void
angle_changed (GtkGestureRotate *gesture,
double angle,
double delta)
{
CanvasItem *item = CANVAS_ITEM (gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (gesture)));
item->delta = angle / M_PI * 180.0;
apply_transform (item);
}
static void
rotate_done (GtkGesture *gesture)
{
CanvasItem *item = CANVAS_ITEM (gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (gesture)));
item->angle = item->angle + item->delta;
item->delta = 0;
}
static void
click_done (GtkGesture *gesture)
{
GtkWidget *item = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (gesture));
GtkWidget *canvas = gtk_widget_get_parent (item);
GtkWidget *last_child;
last_child = gtk_widget_get_last_child (canvas);
if (item != last_child)
gtk_widget_insert_after (item, canvas, last_child);
}
static gboolean
theme_is_dark (void)
{
GtkSettings *settings;
char *theme;
gboolean prefer_dark;
gboolean dark;
settings = gtk_settings_get_default ();
g_object_get (settings,
"gtk-theme-name", &theme,
"gtk-application-prefer-dark-theme", &prefer_dark,
NULL);
if ((strcmp (theme, "Adwaita") == 0 && prefer_dark) || strcmp (theme, "HighContrastInverse") == 0)
dark = TRUE;
else
dark = FALSE;
g_free (theme);
return dark;
}
static void
canvas_item_init (CanvasItem *item)
{
char *text;
char *id;
GdkRGBA rgba;
GtkDropTarget *dest;
GtkGesture *gesture;
GType types[2] = { GDK_TYPE_RGBA, G_TYPE_STRING };
n_items++;
text = g_strdup_printf ("Item %d", n_items);
item->label = gtk_label_new (text);
gtk_widget_add_css_class (item->label, "canvasitem");
g_free (text);
item->fixed = gtk_fixed_new ();
gtk_widget_set_parent (item->fixed, GTK_WIDGET (item));
gtk_fixed_put (GTK_FIXED (item->fixed), item->label, 0, 0);
gtk_widget_add_css_class (item->label, "frame");
id = g_strdup_printf ("item%d", n_items);
gtk_widget_set_name (item->label, id);
g_free (id);
if (theme_is_dark ())
gdk_rgba_parse (&rgba, "blue");
else
gdk_rgba_parse (&rgba, "yellow");
set_color (item, &rgba);
item->angle = 0;
dest = gtk_drop_target_new (G_TYPE_INVALID, GDK_ACTION_COPY);
gtk_drop_target_set_gtypes (dest, types, G_N_ELEMENTS (types));
g_signal_connect (dest, "drop", G_CALLBACK (item_drag_drop), NULL);
gtk_widget_add_controller (GTK_WIDGET (item->label), GTK_EVENT_CONTROLLER (dest));
gesture = gtk_gesture_rotate_new ();
g_signal_connect (gesture, "angle-changed", G_CALLBACK (angle_changed), NULL);
g_signal_connect (gesture, "end", G_CALLBACK (rotate_done), NULL);
gtk_widget_add_controller (GTK_WIDGET (item), GTK_EVENT_CONTROLLER (gesture));
gesture = gtk_gesture_click_new ();
g_signal_connect (gesture, "released", G_CALLBACK (click_done), NULL);
gtk_widget_add_controller (GTK_WIDGET (item), GTK_EVENT_CONTROLLER (gesture));
}
static void
canvas_item_dispose (GObject *object)
{
CanvasItem *item = CANVAS_ITEM (object);
g_clear_pointer (&item->fixed, gtk_widget_unparent);
g_clear_pointer (&item->editor, gtk_widget_unparent);
G_OBJECT_CLASS (canvas_item_parent_class)->dispose (object);
}
static void
canvas_item_map (GtkWidget *widget)
{
CanvasItem *item = CANVAS_ITEM (widget);
GTK_WIDGET_CLASS (canvas_item_parent_class)->map (widget);
apply_transform (item);
}
static void
canvas_item_class_init (CanvasItemClass *class)
{
GObjectClass *object_class = G_OBJECT_CLASS (class);
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class);
object_class->dispose = canvas_item_dispose;
widget_class->map = canvas_item_map;
gtk_widget_class_set_layout_manager_type (widget_class, GTK_TYPE_BIN_LAYOUT);
gtk_widget_class_set_css_name (widget_class, "item");
}
static GtkWidget *
canvas_item_new (void)
{
CanvasItem *item = g_object_new (canvas_item_get_type (), NULL);
return GTK_WIDGET (item);
}
static GdkPaintable *
canvas_item_get_drag_icon (CanvasItem *item)
{
return gtk_widget_paintable_new (item->fixed);
}
static gboolean
canvas_item_is_editing (CanvasItem *item)
{
return item->editor != NULL;
}
static void
scale_changed (GtkRange *range,
CanvasItem *item)
{
item->angle = gtk_range_get_value (range);
apply_transform (item);
}
static void
text_changed (GtkEditable *editable,
GParamSpec *pspec,
CanvasItem *item)
{
gtk_label_set_text (GTK_LABEL (item->label), gtk_editable_get_text (editable));
apply_transform (item);
}
static void
canvas_item_stop_editing (CanvasItem *item)
{
GtkWidget *scale;
if (!item->editor)
return;
scale = gtk_widget_get_last_child (item->editor);
g_signal_handlers_disconnect_by_func (scale, scale_changed, item);
gtk_fixed_remove (GTK_FIXED (gtk_widget_get_parent (item->editor)), item->editor);
item->editor = NULL;
}
static void
canvas_item_start_editing (CanvasItem *item)
{
GtkWidget *canvas = gtk_widget_get_parent (GTK_WIDGET (item));
GtkWidget *entry;
GtkWidget *scale;
double x, y;
if (item->editor)
return;
item->editor = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12);
entry = gtk_entry_new ();
gtk_editable_set_text (GTK_EDITABLE (entry),
gtk_label_get_text (GTK_LABEL (item->label)));
gtk_editable_set_width_chars (GTK_EDITABLE (entry), 12);
g_signal_connect (entry, "notify::text", G_CALLBACK (text_changed), item);
g_signal_connect_swapped (entry, "activate", G_CALLBACK (canvas_item_stop_editing), item);
gtk_box_append (GTK_BOX (item->editor), entry);
scale = gtk_scale_new_with_range (GTK_ORIENTATION_HORIZONTAL, 0, 360, 1);
gtk_scale_set_draw_value (GTK_SCALE (scale), FALSE);
gtk_range_set_value (GTK_RANGE (scale), fmod (item->angle, 360));
g_signal_connect (scale, "value-changed", G_CALLBACK (scale_changed), item);
gtk_box_append (GTK_BOX (item->editor), scale);
gtk_widget_translate_coordinates (GTK_WIDGET (item), canvas, 0, 0, &x, &y);
gtk_fixed_put (GTK_FIXED (canvas), item->editor, x, y + 2 * item->r);
gtk_widget_grab_focus (entry);
}
static GdkContentProvider * static GdkContentProvider *
prepare (GtkDragSource *source, prepare (GtkDragSource *source,
double x, double x,
@@ -368,8 +18,7 @@ prepare (GtkDragSource *source,
canvas = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (source)); canvas = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (source));
item = gtk_widget_pick (canvas, x, y, GTK_PICK_DEFAULT); item = gtk_widget_pick (canvas, x, y, GTK_PICK_DEFAULT);
item = gtk_widget_get_ancestor (item, canvas_item_get_type ()); if (!GTK_IS_LABEL (item))
if (!item)
return NULL; return NULL;
g_object_set_data (G_OBJECT (canvas), "dragged-item", item); g_object_set_data (G_OBJECT (canvas), "dragged-item", item);
@@ -382,17 +31,12 @@ drag_begin (GtkDragSource *source,
GdkDrag *drag) GdkDrag *drag)
{ {
GtkWidget *canvas; GtkWidget *canvas;
CanvasItem *item; GtkWidget *item;
GdkPaintable *paintable;
canvas = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (source)); canvas = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (source));
item = CANVAS_ITEM (g_object_get_data (G_OBJECT (canvas), "dragged-item")); item = g_object_get_data (G_OBJECT (canvas), "dragged-item");
paintable = canvas_item_get_drag_icon (item); gtk_widget_set_opacity (item, 0.5);
gtk_drag_source_set_icon (source, paintable, item->r, item->r);
g_object_unref (paintable);
gtk_widget_set_opacity (GTK_WIDGET (item), 0.3);
} }
static void static void
@@ -409,12 +53,32 @@ drag_end (GtkDragSource *source,
gtk_widget_set_opacity (item, 1.0); gtk_widget_set_opacity (item, 1.0);
} }
static gboolean static void
drag_cancel (GtkDragSource *source, drag_cancel (GtkDragSource *source,
GdkDrag *drag, GdkDrag *drag,
GdkDragCancelReason reason) GdkDragCancelReason reason)
{ {
return FALSE; drag_end (source, drag);
}
typedef struct {
double x, y;
double angle;
double delta;
} TransformData;
static void
apply_transform (GtkWidget *item)
{
GtkWidget *canvas = gtk_widget_get_parent (item);
TransformData *data;
GskTransform *transform;
data = g_object_get_data (G_OBJECT (item), "transform-data");
transform = gsk_transform_rotate (gsk_transform_translate (NULL, &(graphene_point_t){data->x, data->y}),
data->angle + data->delta);
gtk_fixed_set_child_transform (GTK_FIXED (canvas), item, transform);
gsk_transform_unref (transform);
} }
static gboolean static gboolean
@@ -423,58 +87,90 @@ drag_drop (GtkDropTarget *target,
double x, double x,
double y) double y)
{ {
CanvasItem *item; GtkWidget *item;
TransformData *transform_data;
GtkWidget *canvas; GtkWidget *canvas;
GtkWidget *last_child; GtkWidget *last_child;
item = g_value_get_object (value); item = g_value_get_object (value);
transform_data = g_object_get_data (G_OBJECT (item), "transform-data");
canvas = gtk_widget_get_parent (GTK_WIDGET (item)); transform_data->x = x;
transform_data->y = y;
canvas = gtk_widget_get_parent (item);
last_child = gtk_widget_get_last_child (canvas); last_child = gtk_widget_get_last_child (canvas);
if (GTK_WIDGET (item) != last_child) if (item != last_child)
gtk_widget_insert_after (GTK_WIDGET (item), canvas, last_child); gtk_widget_insert_after (item, canvas, last_child);
gtk_fixed_move (GTK_FIXED (canvas), GTK_WIDGET (item), x - item->r, y - item->r); apply_transform (item);
return TRUE; return TRUE;
} }
static double pos_x, pos_y;
static GtkWidget * canvas_item_new (double x, double y);
static void static void
new_item_cb (GtkWidget *button, gpointer data) new_item_cb (GtkWidget *button, gpointer data)
{ {
GtkWidget *canvas = data; GtkWidget *canvas = data;
GtkWidget *popover;
GtkWidget *item; GtkWidget *item;
GdkRectangle rect;
popover = gtk_widget_get_ancestor (button, GTK_TYPE_POPOVER); item = canvas_item_new (pos_x, pos_y);
gtk_popover_get_pointing_to (GTK_POPOVER (popover), &rect); gtk_container_add (GTK_CONTAINER (canvas), item);
apply_transform (item);
item = canvas_item_new ();
gtk_fixed_put (GTK_FIXED (canvas), item, rect.x, rect.y);
apply_transform (CANVAS_ITEM (item));
gtk_popover_popdown (GTK_POPOVER (gtk_widget_get_ancestor (button, GTK_TYPE_POPOVER))); gtk_popover_popdown (GTK_POPOVER (gtk_widget_get_ancestor (button, GTK_TYPE_POPOVER)));
} }
static void
edit_label_done (GtkWidget *entry, gpointer data)
{
GtkWidget *canvas = gtk_widget_get_parent (entry);
GtkWidget *label;
int x, y;
gtk_fixed_get_child_position (GTK_FIXED (canvas), entry, &x, &y);
label = GTK_WIDGET (g_object_get_data (G_OBJECT (entry), "label"));
gtk_label_set_text (GTK_LABEL (label), gtk_editable_get_text (GTK_EDITABLE (entry)));
gtk_widget_show (label);
gtk_widget_destroy (entry);
}
static void static void
edit_cb (GtkWidget *button, GtkWidget *child) edit_cb (GtkWidget *button, GtkWidget *child)
{ {
CanvasItem *item = CANVAS_ITEM (child); GtkWidget *canvas = gtk_widget_get_parent (child);
int x, y;
gtk_fixed_get_child_position (GTK_FIXED (canvas), child, &x, &y);
if (GTK_IS_LABEL (child))
{
GtkWidget *entry = gtk_entry_new ();
g_object_set_data (G_OBJECT (entry), "label", child);
gtk_editable_set_text (GTK_EDITABLE (entry), gtk_label_get_text (GTK_LABEL (child)));
gtk_editable_set_width_chars (GTK_EDITABLE (entry), 12);
g_signal_connect (entry, "activate", G_CALLBACK (edit_label_done), NULL);
gtk_fixed_put (GTK_FIXED (canvas), entry, x, y);
gtk_widget_grab_focus (entry);
gtk_widget_hide (child);
}
if (button) if (button)
gtk_popover_popdown (GTK_POPOVER (gtk_widget_get_ancestor (button, GTK_TYPE_POPOVER))); gtk_popover_popdown (GTK_POPOVER (gtk_widget_get_ancestor (button, GTK_TYPE_POPOVER)));
if (!canvas_item_is_editing (item))
canvas_item_start_editing (item);
} }
static void static void
delete_cb (GtkWidget *button, GtkWidget *child) delete_cb (GtkWidget *button, GtkWidget *child)
{ {
GtkWidget *canvas = gtk_widget_get_parent (child); gtk_widget_destroy (child);
gtk_fixed_remove (GTK_FIXED (canvas), child);
gtk_popover_popdown (GTK_POPOVER (gtk_widget_get_ancestor (button, GTK_TYPE_POPOVER))); gtk_popover_popdown (GTK_POPOVER (gtk_widget_get_ancestor (button, GTK_TYPE_POPOVER)));
} }
@@ -491,7 +187,6 @@ pressed_cb (GtkGesture *gesture,
widget = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (gesture)); widget = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (gesture));
child = gtk_widget_pick (widget, x, y, GTK_PICK_DEFAULT); child = gtk_widget_pick (widget, x, y, GTK_PICK_DEFAULT);
child = gtk_widget_get_ancestor (child, canvas_item_get_type ());
if (gtk_gesture_single_get_current_button (GTK_GESTURE_SINGLE (gesture)) == GDK_BUTTON_SECONDARY) if (gtk_gesture_single_get_current_button (GTK_GESTURE_SINGLE (gesture)) == GDK_BUTTON_SECONDARY)
{ {
@@ -499,35 +194,38 @@ pressed_cb (GtkGesture *gesture,
GtkWidget *box; GtkWidget *box;
GtkWidget *item; GtkWidget *item;
pos_x = x;
pos_y = y;
menu = gtk_popover_new (); menu = gtk_popover_new ();
gtk_widget_set_parent (menu, widget); gtk_widget_set_parent (menu, widget);
gtk_popover_set_has_arrow (GTK_POPOVER (menu), FALSE); gtk_popover_set_has_arrow (GTK_POPOVER (menu), FALSE);
gtk_popover_set_pointing_to (GTK_POPOVER (menu), &(GdkRectangle){ x, y, 1, 1}); gtk_popover_set_pointing_to (GTK_POPOVER (menu), &(GdkRectangle){ x, y, 1, 1});
box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
gtk_popover_set_child (GTK_POPOVER (menu), box); gtk_container_add (GTK_CONTAINER (menu), box);
item = gtk_button_new_with_label ("New"); item = gtk_button_new_with_label ("New");
gtk_button_set_has_frame (GTK_BUTTON (item), FALSE); gtk_button_set_has_frame (GTK_BUTTON (item), FALSE);
g_signal_connect (item, "clicked", G_CALLBACK (new_item_cb), widget); g_signal_connect (item, "clicked", G_CALLBACK (new_item_cb), widget);
gtk_box_append (GTK_BOX (box), item); gtk_container_add (GTK_CONTAINER (box), item);
item = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL); item = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
gtk_box_append (GTK_BOX (box), item); gtk_container_add (GTK_CONTAINER (box), item);
item = gtk_button_new_with_label ("Edit"); item = gtk_button_new_with_label ("Edit");
gtk_button_set_has_frame (GTK_BUTTON (item), FALSE); gtk_button_set_has_frame (GTK_BUTTON (item), FALSE);
gtk_widget_set_sensitive (item, child != NULL && child != widget); gtk_widget_set_sensitive (item, child != NULL && child != widget);
g_signal_connect (item, "clicked", G_CALLBACK (edit_cb), child); g_signal_connect (item, "clicked", G_CALLBACK (edit_cb), child);
gtk_box_append (GTK_BOX (box), item); gtk_container_add (GTK_CONTAINER (box), item);
item = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL); item = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
gtk_box_append (GTK_BOX (box), item); gtk_container_add (GTK_CONTAINER (box), item);
item = gtk_button_new_with_label ("Delete"); item = gtk_button_new_with_label ("Delete");
gtk_button_set_has_frame (GTK_BUTTON (item), FALSE); gtk_button_set_has_frame (GTK_BUTTON (item), FALSE);
gtk_widget_set_sensitive (item, child != NULL && child != widget); gtk_widget_set_sensitive (item, child != NULL && child != widget);
g_signal_connect (item, "clicked", G_CALLBACK (delete_cb), child); g_signal_connect (item, "clicked", G_CALLBACK (delete_cb), child);
gtk_box_append (GTK_BOX (box), item); gtk_container_add (GTK_CONTAINER (box), item);
gtk_popover_popup (GTK_POPOVER (menu)); gtk_popover_popup (GTK_POPOVER (menu));
} }
@@ -542,20 +240,14 @@ released_cb (GtkGesture *gesture,
{ {
GtkWidget *widget; GtkWidget *widget;
GtkWidget *child; GtkWidget *child;
CanvasItem *item;
widget = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (gesture)); widget = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (gesture));
child = gtk_widget_pick (widget, x, y, 0); child = gtk_widget_pick (widget, x, y, 0);
item = (CanvasItem *)gtk_widget_get_ancestor (child, canvas_item_get_type ());
if (!item)
return;
if (gtk_gesture_single_get_current_button (GTK_GESTURE_SINGLE (gesture)) == GDK_BUTTON_PRIMARY) if (gtk_gesture_single_get_current_button (GTK_GESTURE_SINGLE (gesture)) == GDK_BUTTON_PRIMARY)
{ {
if (canvas_item_is_editing (item)) if (child != NULL && child != widget)
canvas_item_stop_editing (item); edit_cb (NULL, child);
else
canvas_item_start_editing (item);
} }
} }
@@ -570,6 +262,7 @@ canvas_new (void)
canvas = gtk_fixed_new (); canvas = gtk_fixed_new ();
gtk_widget_set_hexpand (canvas, TRUE); gtk_widget_set_hexpand (canvas, TRUE);
gtk_widget_set_vexpand (canvas, TRUE); gtk_widget_set_vexpand (canvas, TRUE);
gtk_widget_add_css_class (canvas, "frame");
source = gtk_drag_source_new (); source = gtk_drag_source_new ();
gtk_drag_source_set_actions (source, GDK_ACTION_MOVE); gtk_drag_source_set_actions (source, GDK_ACTION_MOVE);
@@ -592,117 +285,129 @@ canvas_new (void)
return canvas; return canvas;
} }
static GdkContentProvider * static void
css_drag_prepare (GtkDragSource *source, set_color (GtkWidget *item,
double x, GdkRGBA *color)
double y,
GtkWidget *button)
{ {
const char *class; char *css;
GdkPaintable *paintable; char *str;
GtkStyleContext *context;
GtkCssProvider *provider;
class = (const char *)g_object_get_data (G_OBJECT (button), "css-class"); str = gdk_rgba_to_string (color);
css = g_strdup_printf ("* { background: %s; padding: 10px; }", str);
paintable = gtk_widget_paintable_new (button); context = gtk_widget_get_style_context (item);
gtk_drag_source_set_icon (source, paintable, 0, 0); provider = g_object_get_data (G_OBJECT (context), "style-provider");
g_object_unref (paintable); if (provider)
gtk_style_context_remove_provider (context, GTK_STYLE_PROVIDER (provider));
return gdk_content_provider_new_typed (G_TYPE_STRING, class); provider = gtk_css_provider_new ();
gtk_css_provider_load_from_data (provider, css, -1);
gtk_style_context_add_provider (gtk_widget_get_style_context (item), GTK_STYLE_PROVIDER (provider), 800);
g_object_set_data_full (G_OBJECT (context), "style-provider", provider, g_object_unref);
g_free (str);
g_free (css);
} }
static gboolean
item_drag_drop (GtkDropTarget *dest,
const GValue *value,
double x,
double y)
{
GtkWidget *item = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (dest));
set_color (item, g_value_get_boxed (value));
return TRUE;
}
static void
angle_changed (GtkGestureRotate *gesture,
double angle,
double delta)
{
GtkWidget *item = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (gesture));
TransformData *data = g_object_get_data (G_OBJECT (item), "transform-data");
data->delta = angle / M_PI * 180.0;
apply_transform (item);
}
static void
rotate_done (GtkGesture *gesture)
{
GtkWidget *item = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (gesture));
TransformData *data = g_object_get_data (G_OBJECT (item), "transform-data");
data->angle = data->angle + data->delta;
data->delta = 0;
}
static void
click_done (GtkGesture *gesture)
{
GtkWidget *item = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (gesture));
GtkWidget *canvas = gtk_widget_get_parent (item);
GtkWidget *last_child;
last_child = gtk_widget_get_last_child (canvas);
if (item != last_child)
gtk_widget_insert_after (item, canvas, last_child);
}
static int n_items = 0;
static GtkWidget * static GtkWidget *
css_button_new (const char *class) canvas_item_new (double x,
double y)
{ {
GtkWidget *button; GtkWidget *widget;
GtkDragSource *source; char *label;
char *id;
TransformData *transform_data;
GdkRGBA rgba;
GtkDropTarget *dest;
GtkGesture *gesture;
button = gtk_image_new (); n_items++;
gtk_widget_set_size_request (button, 48, 32);
gtk_widget_add_css_class (button, class);
g_object_set_data (G_OBJECT (button), "css-class", (gpointer)class);
source = gtk_drag_source_new (); label = g_strdup_printf ("Item %d", n_items);
g_signal_connect (source, "prepare", G_CALLBACK (css_drag_prepare), button); id = g_strdup_printf ("item%d", n_items);
gtk_widget_add_controller (button, GTK_EVENT_CONTROLLER (source));
return button; gdk_rgba_parse (&rgba, "yellow");
}
typedef struct widget = gtk_label_new (label);
{ gtk_widget_add_css_class (widget, "frame");
GtkWidget parent_instance; gtk_widget_set_name (widget, id);
GdkRGBA color;
} ColorSwatch;
typedef struct set_color (widget, &rgba);
{ transform_data = g_new0 (TransformData, 1);
GtkWidgetClass parent_class; transform_data->x = x;
} ColorSwatchClass; transform_data->y = y;
transform_data->angle = 0.0;
g_object_set_data_full (G_OBJECT (widget), "transform-data", transform_data, g_free);
G_DEFINE_TYPE (ColorSwatch, color_swatch, GTK_TYPE_WIDGET) g_free (label);
g_free (id);
static GdkContentProvider * dest = gtk_drop_target_new (GDK_TYPE_RGBA, GDK_ACTION_COPY);
color_swatch_drag_prepare (GtkDragSource *source, g_signal_connect (dest, "drop", G_CALLBACK (item_drag_drop), NULL);
double x, gtk_widget_add_controller (widget, GTK_EVENT_CONTROLLER (dest));
double y,
ColorSwatch *swatch)
{
return gdk_content_provider_new_typed (GDK_TYPE_RGBA, &swatch->color);
}
static void gesture = gtk_gesture_rotate_new ();
color_swatch_init (ColorSwatch *swatch) g_signal_connect (gesture, "angle-changed", G_CALLBACK (angle_changed), NULL);
{ g_signal_connect (gesture, "end", G_CALLBACK (rotate_done), NULL);
GtkDragSource *source = gtk_drag_source_new (); gtk_widget_add_controller (widget, GTK_EVENT_CONTROLLER (gesture));
g_signal_connect (source, "prepare", G_CALLBACK (color_swatch_drag_prepare), swatch);
gtk_widget_add_controller (GTK_WIDGET (swatch), GTK_EVENT_CONTROLLER (source));
}
static void gesture = gtk_gesture_click_new ();
color_swatch_snapshot (GtkWidget *widget, g_signal_connect (gesture, "released", G_CALLBACK (click_done), NULL);
GtkSnapshot *snapshot) gtk_widget_add_controller (widget, GTK_EVENT_CONTROLLER (gesture));
{
ColorSwatch *swatch = (ColorSwatch *)widget; return widget;
float w = gtk_widget_get_width (widget);
float h = gtk_widget_get_height (widget);
gtk_snapshot_append_color (snapshot, &swatch->color,
&GRAPHENE_RECT_INIT(0, 0, w, h));
}
void
color_swatch_measure (GtkWidget *widget,
GtkOrientation orientation,
int for_size,
int *minimum_size,
int *natural_size,
int *minimum_baseline,
int *natural_baseline)
{
if (orientation == GTK_ORIENTATION_HORIZONTAL)
*minimum_size = *natural_size = 48;
else
*minimum_size = *natural_size = 32;
}
static void
color_swatch_class_init (ColorSwatchClass *class)
{
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class);
widget_class->snapshot = color_swatch_snapshot;
widget_class->measure = color_swatch_measure;
gtk_widget_class_set_css_name (widget_class, "colorswatch");
}
static GtkWidget *
color_swatch_new (const char *color)
{
ColorSwatch *swatch = g_object_new (color_swatch_get_type (), NULL);
gdk_rgba_parse (&swatch->color, color);
return GTK_WIDGET (swatch);
} }
static GtkWidget *window = NULL; static GtkWidget *window = NULL;
@@ -712,9 +417,9 @@ do_dnd (GtkWidget *do_widget)
{ {
if (!window) if (!window)
{ {
GtkWidget *button;
GtkWidget *sw; GtkWidget *sw;
GtkWidget *canvas; GtkWidget *canvas;
GtkWidget *widget;
GtkWidget *box, *box2, *box3; GtkWidget *box, *box2, *box3;
const char *colors[] = { const char *colors[] = {
"red", "green", "blue", "magenta", "orange", "gray", "black", "yellow", "red", "green", "blue", "magenta", "orange", "gray", "black", "yellow",
@@ -724,33 +429,27 @@ do_dnd (GtkWidget *do_widget)
}; };
int i; int i;
int x, y; int x, y;
GtkCssProvider *provider;
button = gtk_color_button_new ();
g_object_unref (g_object_ref_sink (button));
provider = gtk_css_provider_new ();
gtk_css_provider_load_from_resource (provider, "/dnd/dnd.css");
gtk_style_context_add_provider_for_display (gdk_display_get_default (),
GTK_STYLE_PROVIDER (provider),
800);
g_object_unref (provider);
widget = gtk_color_button_new ();
gtk_widget_destroy (widget);
window = gtk_window_new (); window = gtk_window_new ();
gtk_window_set_display (GTK_WINDOW (window), gtk_window_set_display (GTK_WINDOW (window),
gtk_widget_get_display (do_widget)); gtk_widget_get_display (do_widget));
gtk_window_set_title (GTK_WINDOW (window), "Drag-and-Drop"); gtk_window_set_title (GTK_WINDOW (window), "Drag-and-Drop");
gtk_window_set_default_size (GTK_WINDOW (window), 640, 480); gtk_window_set_default_size (GTK_WINDOW (window), 640, 480);
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
g_signal_connect (window, "destroy",
G_CALLBACK (gtk_widget_destroyed), &window);
box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
gtk_window_set_child (GTK_WINDOW (window), box); gtk_window_set_child (GTK_WINDOW (window), box);
box2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); box2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
gtk_box_append (GTK_BOX (box), box2); gtk_container_add (GTK_CONTAINER (box), box2);
canvas = canvas_new (); canvas = canvas_new ();
gtk_box_append (GTK_BOX (box2), canvas); gtk_container_add (GTK_CONTAINER (box2), canvas);
n_items = 0; n_items = 0;
@@ -759,38 +458,43 @@ do_dnd (GtkWidget *do_widget)
{ {
GtkWidget *item; GtkWidget *item;
item = canvas_item_new (); item = canvas_item_new (x, y);
gtk_fixed_put (GTK_FIXED (canvas), item, x, y); gtk_container_add (GTK_CONTAINER (canvas), item);
apply_transform (CANVAS_ITEM (item)); apply_transform (item);
x += 150; x += 150;
y += 100; y += 100;
} }
gtk_box_append (GTK_BOX (box), gtk_separator_new (GTK_ORIENTATION_HORIZONTAL)); sw = gtk_scrolled_window_new (NULL, NULL);
sw = gtk_scrolled_window_new ();
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw), gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC,
GTK_POLICY_NEVER); GTK_POLICY_NEVER);
gtk_box_append (GTK_BOX (box), sw); gtk_container_add (GTK_CONTAINER (box), sw);
box3 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); box3 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
gtk_widget_add_css_class (box3, "linked"); gtk_widget_add_css_class (box3, "linked");
gtk_scrolled_window_set_child (GTK_SCROLLED_WINDOW (sw), box3); gtk_scrolled_window_set_child (GTK_SCROLLED_WINDOW (sw), box3);
for (i = 0; colors[i]; i++) for (i = 0; colors[i]; i++)
gtk_box_append (GTK_BOX (box3), color_swatch_new (colors[i])); {
GdkRGBA rgba;
GtkWidget *swatch;
gtk_box_append (GTK_BOX (box3), css_button_new ("rainbow1")); gdk_rgba_parse (&rgba, colors[i]);
gtk_box_append (GTK_BOX (box3), css_button_new ("rainbow2"));
gtk_box_append (GTK_BOX (box3), css_button_new ("rainbow3")); swatch = g_object_new (g_type_from_name ("GtkColorSwatch"),
"rgba", &rgba,
"selectable", FALSE,
NULL);
gtk_container_add (GTK_CONTAINER (box3), swatch);
}
} }
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
gtk_widget_show (window); gtk_widget_show (window);
else else
gtk_window_destroy (GTK_WINDOW (window)); gtk_widget_destroy (window);
return window; return window;
} }

View File

@@ -1,37 +0,0 @@
label.canvasitem {
padding: 10px;
margin: 1px;
}
.canvasitem.rainbow1,
image.rainbow1 {
background: linear-gradient(140deg,red,orange,yellow,green,blue,purple);
}
.canvasitem.rainbow2,
image.rainbow2 {
animation: rainbow2 1s infinite linear;
}
@keyframes rainbow2 {
0% { background: linear-gradient(0deg,red,orange,yellow,green,blue,purple); }
25% { background: linear-gradient(90deg,red,orange,yellow,green,blue,purple); }
50% { background: linear-gradient(180deg,red,orange,yellow,green,blue,purple); }
75% { background: linear-gradient(270deg,red,orange,yellow,green,blue,purple); }
100% { background: linear-gradient(360deg,red,orange,yellow,green,blue,purple); }
}
.canvasitem.rainbow3,
image.rainbow3 {
animation: rainbow3 1s infinite linear;
}
@keyframes rainbow3 {
0% { background: linear-gradient(140deg,red,orange,yellow,green,blue,purple); }
16.6% { background: linear-gradient(140deg,purple,red,orange,yellow,green,blue); }
33.2% { background: linear-gradient(140deg,blue,purple,red,orange,yellow,green); }
50% { background: linear-gradient(140deg,green,blue,purple,red,orange,yellow); }
66.6% { background: linear-gradient(140deg,yellow,green,blue,purple,red,orange); }
83.2% { background: linear-gradient(140deg,orange,yellow,green,blue,purple,red); }
100% { background: linear-gradient(140deg,red,orange,yellow,green,blue,purple); }
}

View File

@@ -1,5 +1,4 @@
/* Drawing Area /* Drawing Area
* #Keywords: GtkDrawingArea
* *
* GtkDrawingArea is a blank area where you can draw custom displays * GtkDrawingArea is a blank area where you can draw custom displays
* of various kinds. * of various kinds.
@@ -65,8 +64,8 @@ scribble_draw (GtkDrawingArea *da,
/* Draw a rectangle on the screen */ /* Draw a rectangle on the screen */
static void static void
draw_brush (GtkWidget *widget, draw_brush (GtkWidget *widget,
double x, gdouble x,
double y) gdouble y)
{ {
GdkRectangle update_rect; GdkRectangle update_rect;
cairo_t *cr; cairo_t *cr;
@@ -126,164 +125,49 @@ drag_end (GtkGestureDrag *gesture,
} }
static void static void
oval_path (cairo_t *cr, checkerboard_draw (GtkDrawingArea *da,
double xc, double yc, cairo_t *cr,
double xr, double yr) int width,
int height,
gpointer data)
{ {
cairo_save (cr); gint i, j, xcount, ycount;
cairo_translate (cr, xc, yc); #define CHECK_SIZE 10
cairo_scale (cr, 1.0, yr / xr); #define SPACING 2
cairo_move_to (cr, xr, 0.0);
cairo_arc (cr,
0, 0,
xr,
0, 2 * G_PI);
cairo_close_path (cr);
cairo_restore (cr); /* At the start of a draw handler, a clip region has been set on
} * the Cairo context, and the contents have been cleared to the
* widget's background color. The docs for
* gdk_surface_begin_paint_region() give more details on how this
* works.
*/
/* Fill the given area with checks in the standard style xcount = 0;
* for showing compositing effects. i = SPACING;
* while (i < width)
* It would make sense to do this as a repeating surface,
* but most implementations of RENDER currently have broken
* implementations of repeat + transform, even when the
* transform is a translation.
*/
static void
fill_checks (cairo_t *cr,
int x, int y,
int width, int height)
{
int i, j;
#define CHECK_SIZE 16
cairo_rectangle (cr, x, y, width, height);
cairo_set_source_rgb (cr, 0.4, 0.4, 0.4);
cairo_fill (cr);
/* Only works for CHECK_SIZE a power of 2 */
j = x & (-CHECK_SIZE);
for (; j < height; j += CHECK_SIZE)
{ {
i = y & (-CHECK_SIZE); j = SPACING;
for (; i < width; i += CHECK_SIZE) ycount = xcount % 2; /* start with even/odd depending on row */
if ((i / CHECK_SIZE + j / CHECK_SIZE) % 2 == 0) while (j < height)
{
if (ycount % 2)
cairo_set_source_rgb (cr, 0.45777, 0, 0.45777);
else
cairo_set_source_rgb (cr, 1, 1, 1);
/* If we're outside the clip, this will do nothing.
*/
cairo_rectangle (cr, i, j, CHECK_SIZE, CHECK_SIZE); cairo_rectangle (cr, i, j, CHECK_SIZE, CHECK_SIZE);
cairo_fill (cr);
j += CHECK_SIZE + SPACING;
++ycount;
}
i += CHECK_SIZE + SPACING;
++xcount;
} }
cairo_set_source_rgb (cr, 0.7, 0.7, 0.7);
cairo_fill (cr);
#undef CHECK_SIZE
}
/* Draw a red, green, and blue circle equally spaced inside
* the larger circle of radius r at (xc, yc)
*/
static void
draw_3circles (cairo_t *cr,
double xc, double yc,
double radius,
double alpha)
{
double subradius = radius * (2 / 3. - 0.1);
cairo_set_source_rgba (cr, 1., 0., 0., alpha);
oval_path (cr,
xc + radius / 3. * cos (G_PI * (0.5)),
yc - radius / 3. * sin (G_PI * (0.5)),
subradius, subradius);
cairo_fill (cr);
cairo_set_source_rgba (cr, 0., 1., 0., alpha);
oval_path (cr,
xc + radius / 3. * cos (G_PI * (0.5 + 2/.3)),
yc - radius / 3. * sin (G_PI * (0.5 + 2/.3)),
subradius, subradius);
cairo_fill (cr);
cairo_set_source_rgba (cr, 0., 0., 1., alpha);
oval_path (cr,
xc + radius / 3. * cos (G_PI * (0.5 + 4/.3)),
yc - radius / 3. * sin (G_PI * (0.5 + 4/.3)),
subradius, subradius);
cairo_fill (cr);
}
static void
groups_draw (GtkDrawingArea *darea,
cairo_t *cr,
int width,
int height,
gpointer data)
{
cairo_surface_t *overlay, *punch, *circles;
cairo_t *overlay_cr, *punch_cr, *circles_cr;
/* Fill the background */
double radius = 0.5 * (width < height ? width : height) - 10;
double xc = width / 2.;
double yc = height / 2.;
overlay = cairo_surface_create_similar (cairo_get_target (cr),
CAIRO_CONTENT_COLOR_ALPHA,
width, height);
punch = cairo_surface_create_similar (cairo_get_target (cr),
CAIRO_CONTENT_ALPHA,
width, height);
circles = cairo_surface_create_similar (cairo_get_target (cr),
CAIRO_CONTENT_COLOR_ALPHA,
width, height);
fill_checks (cr, 0, 0, width, height);
/* Draw a black circle on the overlay
*/
overlay_cr = cairo_create (overlay);
cairo_set_source_rgb (overlay_cr, 0., 0., 0.);
oval_path (overlay_cr, xc, yc, radius, radius);
cairo_fill (overlay_cr);
/* Draw 3 circles to the punch surface, then cut
* that out of the main circle in the overlay
*/
punch_cr = cairo_create (punch);
draw_3circles (punch_cr, xc, yc, radius, 1.0);
cairo_destroy (punch_cr);
cairo_set_operator (overlay_cr, CAIRO_OPERATOR_DEST_OUT);
cairo_set_source_surface (overlay_cr, punch, 0, 0);
cairo_paint (overlay_cr);
/* Now draw the 3 circles in a subgroup again
* at half intensity, and use OperatorAdd to join up
* without seams.
*/
circles_cr = cairo_create (circles);
cairo_set_operator (circles_cr, CAIRO_OPERATOR_OVER);
draw_3circles (circles_cr, xc, yc, radius, 0.5);
cairo_destroy (circles_cr);
cairo_set_operator (overlay_cr, CAIRO_OPERATOR_ADD);
cairo_set_source_surface (overlay_cr, circles, 0, 0);
cairo_paint (overlay_cr);
cairo_destroy (overlay_cr);
cairo_set_source_surface (cr, overlay, 0, 0);
cairo_paint (cr);
cairo_surface_destroy (overlay);
cairo_surface_destroy (punch);
cairo_surface_destroy (circles);
} }
static void static void
@@ -323,21 +207,22 @@ do_drawingarea (GtkWidget *do_widget)
gtk_window_set_child (GTK_WINDOW (window), vbox); gtk_window_set_child (GTK_WINDOW (window), vbox);
/* /*
* Create the groups area * Create the checkerboard area
*/ */
label = gtk_label_new (NULL); label = gtk_label_new (NULL);
gtk_label_set_markup (GTK_LABEL (label), gtk_label_set_markup (GTK_LABEL (label),
"<u>Knockout groups</u>"); "<u>Checkerboard pattern</u>");
gtk_box_append (GTK_BOX (vbox), label); gtk_container_add (GTK_CONTAINER (vbox), label);
frame = gtk_frame_new (NULL); frame = gtk_frame_new (NULL);
gtk_widget_set_vexpand (frame, TRUE); gtk_widget_set_vexpand (frame, TRUE);
gtk_box_append (GTK_BOX (vbox), frame); gtk_container_add (GTK_CONTAINER (vbox), frame);
da = gtk_drawing_area_new (); da = gtk_drawing_area_new ();
gtk_drawing_area_set_content_width (GTK_DRAWING_AREA (da), 100); gtk_drawing_area_set_content_width (GTK_DRAWING_AREA (da), 100);
gtk_drawing_area_set_content_height (GTK_DRAWING_AREA (da), 100); gtk_drawing_area_set_content_height (GTK_DRAWING_AREA (da), 100);
gtk_drawing_area_set_draw_func (GTK_DRAWING_AREA (da), groups_draw, NULL, NULL); gtk_drawing_area_set_draw_func (GTK_DRAWING_AREA (da), checkerboard_draw, NULL, NULL);
gtk_frame_set_child (GTK_FRAME (frame), da); gtk_frame_set_child (GTK_FRAME (frame), da);
/* /*
@@ -347,11 +232,11 @@ do_drawingarea (GtkWidget *do_widget)
label = gtk_label_new (NULL); label = gtk_label_new (NULL);
gtk_label_set_markup (GTK_LABEL (label), gtk_label_set_markup (GTK_LABEL (label),
"<u>Scribble area</u>"); "<u>Scribble area</u>");
gtk_box_append (GTK_BOX (vbox), label); gtk_container_add (GTK_CONTAINER (vbox), label);
frame = gtk_frame_new (NULL); frame = gtk_frame_new (NULL);
gtk_widget_set_vexpand (frame, TRUE); gtk_widget_set_vexpand (frame, TRUE);
gtk_box_append (GTK_BOX (vbox), frame); gtk_container_add (GTK_CONTAINER (vbox), frame);
da = gtk_drawing_area_new (); da = gtk_drawing_area_new ();
gtk_drawing_area_set_content_width (GTK_DRAWING_AREA (da), 100); gtk_drawing_area_set_content_width (GTK_DRAWING_AREA (da), 100);
@@ -375,7 +260,7 @@ do_drawingarea (GtkWidget *do_widget)
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
gtk_widget_show (window); gtk_widget_show (window);
else else
gtk_window_destroy (GTK_WINDOW (window)); gtk_widget_destroy (window);
return window; return window;
} }

View File

@@ -1,305 +0,0 @@
/* Drop Downs
*
* The GtkDropDown widget is a modern alternative to GtkComboBox.
* It uses list models instead of tree models, and the content is
* displayed using widgets instead of cell renderers.
*
* The examples here demonstrate how to use different kinds of
* list models with GtkDropDown, how to use search and how to
* display the selected item differently from the presentation
* in the popup.
*/
#include <gtk/gtk.h>
#define STRING_TYPE_HOLDER (string_holder_get_type ())
G_DECLARE_FINAL_TYPE (StringHolder, string_holder, STRING, HOLDER, GObject)
struct _StringHolder {
GObject parent_instance;
char *title;
char *icon;
char *description;
};
G_DEFINE_TYPE (StringHolder, string_holder, G_TYPE_OBJECT);
static void
string_holder_init (StringHolder *holder)
{
}
static void
string_holder_finalize (GObject *object)
{
StringHolder *holder = STRING_HOLDER (object);
g_free (holder->title);
g_free (holder->icon);
g_free (holder->description);
G_OBJECT_CLASS (string_holder_parent_class)->finalize (object);
}
static void
string_holder_class_init (StringHolderClass *class)
{
GObjectClass *object_class = G_OBJECT_CLASS (class);
object_class->finalize = string_holder_finalize;
}
static StringHolder *
string_holder_new (const char *title, const char *icon, const char *description)
{
StringHolder *holder = g_object_new (STRING_TYPE_HOLDER, NULL);
holder->title = g_strdup (title);
holder->icon = g_strdup (icon);
holder->description = g_strdup (description);
return holder;
}
static void
strings_setup_item_single_line (GtkSignalListItemFactory *factory,
GtkListItem *item)
{
GtkWidget *box, *image, *title;
box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 10);
image = gtk_image_new ();
title = gtk_label_new ("");
gtk_label_set_xalign (GTK_LABEL (title), 0.0);
gtk_box_append (GTK_BOX (box), image);
gtk_box_append (GTK_BOX (box), title);
g_object_set_data (G_OBJECT (item), "title", title);
g_object_set_data (G_OBJECT (item), "image", image);
gtk_list_item_set_child (item, box);
}
static void
strings_setup_item_full (GtkSignalListItemFactory *factory,
GtkListItem *item)
{
GtkWidget *box, *box2, *image, *title, *description;
image = gtk_image_new ();
title = gtk_label_new ("");
gtk_label_set_xalign (GTK_LABEL (title), 0.0);
description = gtk_label_new ("");
gtk_label_set_xalign (GTK_LABEL (description), 0.0);
gtk_widget_add_css_class (description, "dim-label");
box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 10);
box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 2);
gtk_box_append (GTK_BOX (box), image);
gtk_box_append (GTK_BOX (box), box2);
gtk_box_append (GTK_BOX (box2), title);
gtk_box_append (GTK_BOX (box2), description);
g_object_set_data (G_OBJECT (item), "title", title);
g_object_set_data (G_OBJECT (item), "image", image);
g_object_set_data (G_OBJECT (item), "description", description);
gtk_list_item_set_child (item, box);
}
static void
strings_bind_item (GtkSignalListItemFactory *factory,
GtkListItem *item)
{
GtkWidget *image, *title, *description;
StringHolder *holder;
holder = gtk_list_item_get_item (item);
title = g_object_get_data (G_OBJECT (item), "title");
image = g_object_get_data (G_OBJECT (item), "image");
description = g_object_get_data (G_OBJECT (item), "description");
gtk_label_set_label (GTK_LABEL (title), holder->title);
if (image)
{
gtk_image_set_from_icon_name (GTK_IMAGE (image), holder->icon);
gtk_widget_set_visible (image, holder->icon != NULL);
}
if (description)
{
gtk_label_set_label (GTK_LABEL (description), holder->description);
gtk_widget_set_visible (description , holder->description != NULL);
}
}
static GtkListItemFactory *
strings_factory_new (gboolean full)
{
GtkListItemFactory *factory;
factory = gtk_signal_list_item_factory_new ();
if (full)
g_signal_connect (factory, "setup", G_CALLBACK (strings_setup_item_full), NULL);
else
g_signal_connect (factory, "setup", G_CALLBACK (strings_setup_item_single_line), NULL);
g_signal_connect (factory, "bind", G_CALLBACK (strings_bind_item), NULL);
return factory;
}
static GListModel *
strings_model_new (const char *const *titles,
const char *const *icons,
const char *const *descriptions)
{
GListStore *store;
int i;
store = g_list_store_new (STRING_TYPE_HOLDER);
for (i = 0; titles[i]; i++)
{
StringHolder *holder = string_holder_new (titles[i],
icons ? icons[i] : NULL,
descriptions ? descriptions[i] : NULL);
g_list_store_append (store, holder);
g_object_unref (holder);
}
return G_LIST_MODEL (store);
}
static GtkWidget *
drop_down_new_from_strings (const char *const *titles,
const char *const *icons,
const char *const *descriptions)
{
GtkWidget *widget;
GListModel *model;
GtkListItemFactory *factory;
GtkListItemFactory *list_factory;
g_return_val_if_fail (titles != NULL, NULL);
g_return_val_if_fail (icons == NULL || g_strv_length ((char **)icons) == g_strv_length ((char **)titles), NULL);
g_return_val_if_fail (descriptions == NULL || g_strv_length ((char **)icons) == g_strv_length ((char **)descriptions), NULL);
model = strings_model_new (titles, icons, descriptions);
factory = strings_factory_new (FALSE);
if (icons != NULL || descriptions != NULL)
list_factory = strings_factory_new (TRUE);
else
list_factory = NULL;
widget = g_object_new (GTK_TYPE_DROP_DOWN,
"model", model,
"factory", factory,
"list-factory", list_factory,
NULL);
g_object_unref (model);
g_object_unref (factory);
if (list_factory)
g_object_unref (list_factory);
return widget;
}
static char *
get_family_name (gpointer item)
{
return g_strdup (pango_font_family_get_name (PANGO_FONT_FAMILY (item)));
}
static char *
get_title (gpointer item)
{
return g_strdup (STRING_HOLDER (item)->title);
}
GtkWidget *
do_dropdown (GtkWidget *do_widget)
{
static GtkWidget *window = NULL;
GtkWidget *button, *box, *spin, *check;
GListModel *model;
GtkExpression *expression;
const char * const times[] = { "1 minute", "2 minutes", "5 minutes", "20 minutes", NULL };
const char * const many_times[] = {
"1 minute", "2 minutes", "5 minutes", "10 minutes", "15 minutes", "20 minutes",
"25 minutes", "30 minutes", "35 minutes", "40 minutes", "45 minutes", "50 minutes",
"55 minutes", "1 hour", "2 hours", "3 hours", "5 hours", "6 hours", "7 hours",
"8 hours", "9 hours", "10 hours", "11 hours", "12 hours", NULL
};
const char * const device_titles[] = { "Digital Output", "Headphones", "Digital Output", "Analog Output", NULL };
const char * const device_icons[] = { "audio-card-symbolic", "audio-headphones-symbolic", "audio-card-symbolic", "audio-card-symbolic", NULL };
const char * const device_descriptions[] = {
"Built-in Audio", "Built-in audio", "Thinkpad Tunderbolt 3 Dock USB Audio", "Thinkpad Tunderbolt 3 Dock USB Audio", NULL
};
if (!window)
{
window = gtk_window_new ();
gtk_window_set_display (GTK_WINDOW (window),
gtk_widget_get_display (do_widget));
gtk_window_set_title (GTK_WINDOW (window), "Drop Downs");
gtk_window_set_resizable (GTK_WINDOW (window), FALSE);
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
gtk_widget_set_margin_start (box, 10);
gtk_widget_set_margin_end (box, 10);
gtk_widget_set_margin_top (box, 10);
gtk_widget_set_margin_bottom (box, 10);
gtk_window_set_child (GTK_WINDOW (window), box);
button = gtk_drop_down_new (NULL, NULL);
model = G_LIST_MODEL (pango_cairo_font_map_get_default ());
gtk_drop_down_set_model (GTK_DROP_DOWN (button), model);
gtk_drop_down_set_selected (GTK_DROP_DOWN (button), 0);
expression = gtk_cclosure_expression_new (G_TYPE_STRING, NULL,
0, NULL,
(GCallback)get_family_name,
NULL, NULL);
gtk_drop_down_set_expression (GTK_DROP_DOWN (button), expression);
gtk_expression_unref (expression);
gtk_box_append (GTK_BOX (box), button);
spin = gtk_spin_button_new_with_range (-1, g_list_model_get_n_items (G_LIST_MODEL (model)), 1);
gtk_widget_set_halign (spin, GTK_ALIGN_START);
g_object_bind_property (button, "selected", spin, "value", G_BINDING_SYNC_CREATE | G_BINDING_BIDIRECTIONAL);
gtk_box_append (GTK_BOX (box), spin);
check = gtk_check_button_new_with_label ("Enable search");
g_object_bind_property (button, "enable-search", check, "active", G_BINDING_SYNC_CREATE | G_BINDING_BIDIRECTIONAL);
gtk_box_append (GTK_BOX (box), check);
g_object_unref (model);
button = drop_down_new_from_strings (times, NULL, NULL);
gtk_box_append (GTK_BOX (box), button);
button = drop_down_new_from_strings (many_times, NULL, NULL);
gtk_drop_down_set_enable_search (GTK_DROP_DOWN (button), TRUE);
expression = gtk_cclosure_expression_new (G_TYPE_STRING, NULL,
0, NULL,
(GCallback)get_title,
NULL, NULL);
gtk_drop_down_set_expression (GTK_DROP_DOWN (button), expression);
gtk_expression_unref (expression);
gtk_box_append (GTK_BOX (box), button);
button = drop_down_new_from_strings (device_titles, device_icons, device_descriptions);
gtk_box_append (GTK_BOX (box), button);
}
if (!gtk_widget_get_visible (window))
gtk_widget_show (window);
else
gtk_window_destroy (GTK_WINDOW (window));
return window;
}

View File

@@ -16,9 +16,9 @@
typedef struct typedef struct
{ {
int number; gint number;
char *product; gchar *product;
int yummy; gint yummy;
} }
Item; Item;
@@ -74,7 +74,7 @@ add_items (void)
static GtkTreeModel * static GtkTreeModel *
create_items_model (void) create_items_model (void)
{ {
int i = 0; gint i = 0;
GtkListStore *model; GtkListStore *model;
GtkTreeIter iter; GtkTreeIter iter;
@@ -109,7 +109,7 @@ static GtkTreeModel *
create_numbers_model (void) create_numbers_model (void)
{ {
#define N_NUMBERS 10 #define N_NUMBERS 10
int i = 0; gint i = 0;
GtkListStore *model; GtkListStore *model;
GtkTreeIter iter; GtkTreeIter iter;
@@ -192,7 +192,7 @@ remove_item (GtkWidget *widget, gpointer data)
if (gtk_tree_selection_get_selected (selection, NULL, &iter)) if (gtk_tree_selection_get_selected (selection, NULL, &iter))
{ {
int i; gint i;
GtkTreePath *path; GtkTreePath *path;
path = gtk_tree_model_get_path (model, &iter); path = gtk_tree_model_get_path (model, &iter);
@@ -211,7 +211,7 @@ separator_row (GtkTreeModel *model,
gpointer data) gpointer data)
{ {
GtkTreePath *path; GtkTreePath *path;
int idx; gint idx;
path = gtk_tree_model_get_path (model, iter); path = gtk_tree_model_get_path (model, iter);
idx = gtk_tree_path_get_indices (path)[0]; idx = gtk_tree_path_get_indices (path)[0];
@@ -224,7 +224,7 @@ separator_row (GtkTreeModel *model,
static void static void
editing_started (GtkCellRenderer *cell, editing_started (GtkCellRenderer *cell,
GtkCellEditable *editable, GtkCellEditable *editable,
const char *path, const gchar *path,
gpointer data) gpointer data)
{ {
gtk_combo_box_set_row_separator_func (GTK_COMBO_BOX (editable), gtk_combo_box_set_row_separator_func (GTK_COMBO_BOX (editable),
@@ -233,15 +233,15 @@ editing_started (GtkCellRenderer *cell,
static void static void
cell_edited (GtkCellRendererText *cell, cell_edited (GtkCellRendererText *cell,
const char *path_string, const gchar *path_string,
const char *new_text, const gchar *new_text,
gpointer data) gpointer data)
{ {
GtkTreeModel *model = (GtkTreeModel *)data; GtkTreeModel *model = (GtkTreeModel *)data;
GtkTreePath *path = gtk_tree_path_new_from_string (path_string); GtkTreePath *path = gtk_tree_path_new_from_string (path_string);
GtkTreeIter iter; GtkTreeIter iter;
int column = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (cell), "column")); gint column = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (cell), "column"));
gtk_tree_model_get_iter (model, &iter, path); gtk_tree_model_get_iter (model, &iter, path);
@@ -249,7 +249,7 @@ cell_edited (GtkCellRendererText *cell,
{ {
case COLUMN_ITEM_NUMBER: case COLUMN_ITEM_NUMBER:
{ {
int i; gint i;
i = gtk_tree_path_get_indices (path)[0]; i = gtk_tree_path_get_indices (path)[0];
g_array_index (articles, Item, i).number = atoi (new_text); g_array_index (articles, Item, i).number = atoi (new_text);
@@ -261,8 +261,8 @@ cell_edited (GtkCellRendererText *cell,
case COLUMN_ITEM_PRODUCT: case COLUMN_ITEM_PRODUCT:
{ {
int i; gint i;
char *old_text; gchar *old_text;
gtk_tree_model_get (model, &iter, column, &old_text, -1); gtk_tree_model_get (model, &iter, column, &old_text, -1);
g_free (old_text); g_free (old_text);
@@ -352,7 +352,8 @@ do_editable_cells (GtkWidget *do_widget)
gtk_window_set_display (GTK_WINDOW (window), gtk_window_set_display (GTK_WINDOW (window),
gtk_widget_get_display (do_widget)); gtk_widget_get_display (do_widget));
gtk_window_set_title (GTK_WINDOW (window), "Editable Cells"); gtk_window_set_title (GTK_WINDOW (window), "Editable Cells");
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window); g_signal_connect (window, "destroy",
G_CALLBACK (gtk_widget_destroyed), &window);
vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5); vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
gtk_widget_set_margin_start (vbox, 5); gtk_widget_set_margin_start (vbox, 5);
@@ -361,15 +362,15 @@ do_editable_cells (GtkWidget *do_widget)
gtk_widget_set_margin_bottom (vbox, 5); gtk_widget_set_margin_bottom (vbox, 5);
gtk_window_set_child (GTK_WINDOW (window), vbox); gtk_window_set_child (GTK_WINDOW (window), vbox);
gtk_box_append (GTK_BOX (vbox), gtk_container_add (GTK_CONTAINER (vbox),
gtk_label_new ("Shopping list (you can edit the cells!)")); gtk_label_new ("Shopping list (you can edit the cells!)"));
sw = gtk_scrolled_window_new (); sw = gtk_scrolled_window_new (NULL, NULL);
gtk_scrolled_window_set_has_frame (GTK_SCROLLED_WINDOW (sw), TRUE); gtk_scrolled_window_set_has_frame (GTK_SCROLLED_WINDOW (sw), TRUE);
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw), gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC,
GTK_POLICY_AUTOMATIC); GTK_POLICY_AUTOMATIC);
gtk_box_append (GTK_BOX (vbox), sw); gtk_container_add (GTK_CONTAINER (vbox), sw);
/* create models */ /* create models */
items_model = create_items_model (); items_model = create_items_model ();
@@ -391,17 +392,17 @@ do_editable_cells (GtkWidget *do_widget)
/* some buttons */ /* some buttons */
hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 4); hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 4);
gtk_box_set_homogeneous (GTK_BOX (hbox), TRUE); gtk_box_set_homogeneous (GTK_BOX (hbox), TRUE);
gtk_box_append (GTK_BOX (vbox), hbox); gtk_container_add (GTK_CONTAINER (vbox), hbox);
button = gtk_button_new_with_label ("Add item"); button = gtk_button_new_with_label ("Add item");
g_signal_connect (button, "clicked", g_signal_connect (button, "clicked",
G_CALLBACK (add_item), treeview); G_CALLBACK (add_item), treeview);
gtk_box_append (GTK_BOX (hbox), button); gtk_container_add (GTK_CONTAINER (hbox), button);
button = gtk_button_new_with_label ("Remove item"); button = gtk_button_new_with_label ("Remove item");
g_signal_connect (button, "clicked", g_signal_connect (button, "clicked",
G_CALLBACK (remove_item), treeview); G_CALLBACK (remove_item), treeview);
gtk_box_append (GTK_BOX (hbox), button); gtk_container_add (GTK_CONTAINER (hbox), button);
gtk_window_set_default_size (GTK_WINDOW (window), 320, 200); gtk_window_set_default_size (GTK_WINDOW (window), 320, 200);
} }
@@ -409,7 +410,7 @@ do_editable_cells (GtkWidget *do_widget)
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
gtk_widget_show (window); gtk_widget_show (window);
else else
gtk_window_destroy (GTK_WINDOW (window)); gtk_widget_destroy (window);
return window; return window;
} }

View File

@@ -1,4 +1,4 @@
/* Entry/Completion /* Entry/Entry Completion
* *
* GtkEntryCompletion provides a mechanism for adding support for * GtkEntryCompletion provides a mechanism for adding support for
* completion in GtkEntry. * completion in GtkEntry.
@@ -12,48 +12,22 @@
static GtkTreeModel * static GtkTreeModel *
create_completion_model (void) create_completion_model (void)
{ {
const char *strings[] = {
"GNOME",
"gnominious",
"Gnomonic projection",
"Gnosophy",
"total",
"totally",
"toto",
"tottery",
"totterer",
"Totten trust",
"Tottenham hotspurs",
"totipotent",
"totipotency",
"totemism",
"totem pole",
"Totara",
"totalizer",
"totalizator",
"totalitarianism",
"total parenteral nutrition",
"total eclipse",
"Totipresence",
"Totipalmi",
"zombie",
"aæx",
"aæy",
"aæz",
NULL
};
int i;
GtkListStore *store; GtkListStore *store;
GtkTreeIter iter; GtkTreeIter iter;
store = gtk_list_store_new (1, G_TYPE_STRING); store = gtk_list_store_new (1, G_TYPE_STRING);
for (i = 0; strings[i]; i++) /* Append one word */
{ gtk_list_store_append (store, &iter);
/* Append one word */ gtk_list_store_set (store, &iter, 0, "GNOME", -1);
gtk_list_store_append (store, &iter);
gtk_list_store_set (store, &iter, 0, strings[i], -1); /* Append another word */
} gtk_list_store_append (store, &iter);
gtk_list_store_set (store, &iter, 0, "total", -1);
/* And another word */
gtk_list_store_append (store, &iter);
gtk_list_store_set (store, &iter, 0, "totally", -1);
return GTK_TREE_MODEL (store); return GTK_TREE_MODEL (store);
} }
@@ -74,9 +48,11 @@ do_entry_completion (GtkWidget *do_widget)
window = gtk_window_new (); window = gtk_window_new ();
gtk_window_set_display (GTK_WINDOW (window), gtk_window_set_display (GTK_WINDOW (window),
gtk_widget_get_display (do_widget)); gtk_widget_get_display (do_widget));
gtk_window_set_title (GTK_WINDOW (window), "Completion"); gtk_window_set_title (GTK_WINDOW (window), "Entry Completion");
gtk_window_set_resizable (GTK_WINDOW (window), FALSE); gtk_window_set_resizable (GTK_WINDOW (window), FALSE);
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
g_signal_connect (window, "destroy",
G_CALLBACK (gtk_widget_destroyed), &window);
vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5); vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
gtk_widget_set_margin_start (vbox, 5); gtk_widget_set_margin_start (vbox, 5);
@@ -86,12 +62,12 @@ do_entry_completion (GtkWidget *do_widget)
gtk_window_set_child (GTK_WINDOW (window), vbox); gtk_window_set_child (GTK_WINDOW (window), vbox);
label = gtk_label_new (NULL); label = gtk_label_new (NULL);
gtk_label_set_markup (GTK_LABEL (label), "Try writing <b>total</b> or <b>gnome</b> for example."); gtk_label_set_markup (GTK_LABEL (label), "Completion demo, try writing <b>total</b> or <b>gnome</b> for example.");
gtk_box_append (GTK_BOX (vbox), label); gtk_container_add (GTK_CONTAINER (vbox), label);
/* Create our entry */ /* Create our entry */
entry = gtk_entry_new (); entry = gtk_entry_new ();
gtk_box_append (GTK_BOX (vbox), entry); gtk_container_add (GTK_CONTAINER (vbox), entry);
/* Create the completion object */ /* Create the completion object */
completion = gtk_entry_completion_new (); completion = gtk_entry_completion_new ();
@@ -107,15 +83,12 @@ do_entry_completion (GtkWidget *do_widget)
/* Use model column 0 as the text column */ /* Use model column 0 as the text column */
gtk_entry_completion_set_text_column (completion, 0); gtk_entry_completion_set_text_column (completion, 0);
gtk_entry_completion_set_inline_completion (completion, TRUE);
gtk_entry_completion_set_inline_selection (completion, TRUE);
} }
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
gtk_widget_show (window); gtk_widget_show (window);
else else
gtk_window_destroy (GTK_WINDOW (window)); gtk_widget_destroy (window);
return window; return window;
} }

View File

@@ -1,8 +1,8 @@
/* Entry/Undo and Redo /* Entry/Entry Undo
* *
* GtkEntry can provide basic Undo/Redo support using standard keyboard * GtkEntry can provide basic Undo/Redo support using standard keyboard
* accelerators such as Control+z to undo and Control+Shift+z to redo. * accelerators such as Primary+z to undo and Primary+Shift+z to redo.
* Additionally, Control+y can be used to redo. * Additionally, Primary+y can be used to redo.
* *
* Use gtk_entry_set_enable_undo() to enable undo/redo support. * Use gtk_entry_set_enable_undo() to enable undo/redo support.
*/ */
@@ -23,9 +23,10 @@ do_entry_undo (GtkWidget *do_widget)
window = gtk_window_new (); window = gtk_window_new ();
gtk_window_set_display (GTK_WINDOW (window), gtk_window_set_display (GTK_WINDOW (window),
gtk_widget_get_display (do_widget)); gtk_widget_get_display (do_widget));
gtk_window_set_title (GTK_WINDOW (window), "Undo and Redo"); gtk_window_set_title (GTK_WINDOW (window), "Entry Undo");
gtk_window_set_resizable (GTK_WINDOW (window), FALSE); gtk_window_set_resizable (GTK_WINDOW (window), FALSE);
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window); g_signal_connect (window, "destroy",
G_CALLBACK (gtk_widget_destroyed), &window);
vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5); vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
gtk_widget_set_margin_start (vbox, 5); gtk_widget_set_margin_start (vbox, 5);
@@ -37,18 +38,18 @@ do_entry_undo (GtkWidget *do_widget)
label = gtk_label_new (NULL); label = gtk_label_new (NULL);
gtk_label_set_markup (GTK_LABEL (label), gtk_label_set_markup (GTK_LABEL (label),
"Use Primary+z or Primary+Shift+z to undo or redo changes"); "Use Primary+z or Primary+Shift+z to undo or redo changes");
gtk_box_append (GTK_BOX (vbox), label); gtk_container_add (GTK_CONTAINER (vbox), label);
/* Create our entry */ /* Create our entry */
entry = gtk_entry_new (); entry = gtk_entry_new ();
gtk_editable_set_enable_undo (GTK_EDITABLE (entry), TRUE); gtk_editable_set_enable_undo (GTK_EDITABLE (entry), TRUE);
gtk_box_append (GTK_BOX (vbox), entry); gtk_container_add (GTK_CONTAINER (vbox), entry);
} }
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
gtk_widget_show (window); gtk_widget_show (window);
else else
gtk_window_destroy (GTK_WINDOW (window)); gtk_widget_destroy (window);
return window; return window;
} }

View File

@@ -1,124 +0,0 @@
/* Error states
*
* GtkLabel and GtkEntry can indicate errors if you set the .error
* style class on them.
*
* This examples shows how this can be used in a dialog for input validation.
*
* It also shows how pass callbacks and objects to GtkBuilder with
* GtkBuilderScope and gtk_builder_expose_object().
*/
#include <glib/gi18n.h>
#include <gtk/gtk.h>
static void
validate_more_details (GtkEntry *entry,
GParamSpec *pspec,
GtkEntry *details)
{
if (strlen (gtk_editable_get_text (GTK_EDITABLE (entry))) > 0 &&
strlen (gtk_editable_get_text (GTK_EDITABLE (details))) == 0)
{
gtk_widget_set_tooltip_text (GTK_WIDGET (entry), "Must have details first");
gtk_widget_add_css_class (GTK_WIDGET (entry), "error");
}
else
{
gtk_widget_set_tooltip_text (GTK_WIDGET (entry), "");
gtk_widget_remove_css_class (GTK_WIDGET (entry), "error");
}
}
static gboolean
mode_switch_state_set (GtkSwitch *sw,
gboolean state,
GtkWidget *scale)
{
GtkWidget *label;
label = GTK_WIDGET (g_object_get_data (G_OBJECT (sw), "error_label"));
if (!state ||
(gtk_range_get_value (GTK_RANGE (scale)) > 50))
{
gtk_widget_hide (label);
gtk_switch_set_state (sw, state);
}
else
{
gtk_widget_show (label);
}
return TRUE;
}
static void
level_scale_value_changed (GtkRange *range,
GtkWidget *sw)
{
GtkWidget *label;
label = GTK_WIDGET (g_object_get_data (G_OBJECT (sw), "error_label"));
if (gtk_switch_get_active (GTK_SWITCH (sw)) &&
!gtk_switch_get_state (GTK_SWITCH (sw)) &&
(gtk_range_get_value (range) > 50))
{
gtk_widget_hide (label);
gtk_switch_set_state (GTK_SWITCH (sw), TRUE);
}
else if (gtk_switch_get_state (GTK_SWITCH (sw)) &&
(gtk_range_get_value (range) <= 50))
{
gtk_switch_set_state (GTK_SWITCH (sw), FALSE);
}
}
GtkWidget *
do_errorstates (GtkWidget *do_widget)
{
static GtkWidget *window = NULL;
if (!window)
{
GtkWidget *toplevel;
GtkBuilder *builder;
GtkBuilderScope *scope;
GtkWidget *sw, *label;
toplevel = GTK_WIDGET (gtk_widget_get_root (do_widget));
scope = gtk_builder_cscope_new ();
gtk_builder_cscope_add_callback_symbols (GTK_BUILDER_CSCOPE (scope),
"validate_more_details", G_CALLBACK (validate_more_details),
"mode_switch_state_set", G_CALLBACK (mode_switch_state_set),
"level_scale_value_changed", G_CALLBACK (level_scale_value_changed),
NULL);
builder = gtk_builder_new ();
gtk_builder_set_scope (builder, scope);
gtk_builder_expose_object (builder, "toplevel", G_OBJECT (toplevel));
gtk_builder_add_from_resource (builder, "/errorstates/errorstates.ui", NULL);
window = GTK_WIDGET (gtk_builder_get_object (builder, "dialog"));
gtk_window_set_display (GTK_WINDOW (window),
gtk_widget_get_display (do_widget));
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
sw = GTK_WIDGET (gtk_builder_get_object (builder, "mode_switch"));
label = GTK_WIDGET (gtk_builder_get_object (builder, "error_label"));
g_object_set_data (G_OBJECT (sw), "error_label", label);
g_object_unref (builder);
g_object_unref (scope);
}
if (!gtk_widget_get_visible (window))
gtk_widget_show (window);
else
gtk_window_destroy (GTK_WINDOW (window));
return window;
}

View File

@@ -1,158 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<object class="GtkDialog" id="dialog">
<property name="transient-for">toplevel</property>
<property name="modal">1</property>
<property name="resizable">0</property>
<property name="use-header-bar">1</property>
<property name="title" translatable="yes">Settings</property>
<property name="hide-on-close">1</property>
<child internal-child="content_area">
<object class="GtkBox">
<child>
<object class="GtkGrid">
<property name="row-spacing">10</property>
<property name="column-spacing">10</property>
<property name="margin-start">20</property>
<property name="margin-end">20</property>
<property name="margin-top">20</property>
<property name="margin-bottom">20</property>
<child>
<object class="GtkLabel">
<property name="halign">end</property>
<property name="valign">baseline</property>
<property name="label">_Details</property>
<property name="use-underline">1</property>
<property name="mnemonic-widget">details_entry</property>
<style>
<class name="dim-label"/>
</style>
<layout>
<property name="column">0</property>
<property name="row">0</property>
</layout>
</object>
</child>
<child>
<object class="GtkEntry" id="details_entry">
<property name="valign">baseline</property>
<signal name="notify::text" handler="validate_more_details" object="more_details_entry" swapped="yes"/>
<layout>
<property name="column">1</property>
<property name="row">0</property>
<property name="column-span">2</property>
</layout>
</object>
</child>
<child>
<object class="GtkLabel">
<property name="halign">end</property>
<property name="valign">baseline</property>
<property name="label">More D_etails</property>
<property name="use-underline">1</property>
<property name="mnemonic-widget">more_details_entry</property>
<style>
<class name="dim-label"/>
</style>
<layout>
<property name="column">0</property>
<property name="row">1</property>
</layout>
</object>
</child>
<child>
<object class="GtkEntry" id="more_details_entry">
<property name="valign">baseline</property>
<signal name="notify::text" handler="validate_more_details" object="details_entry" swapped="no"/>
<layout>
<property name="column">1</property>
<property name="row">1</property>
<property name="column-span">2</property>
</layout>
</object>
</child>
<child>
<object class="GtkLabel">
<property name="halign">end</property>
<property name="valign">baseline</property>
<property name="label">_Level</property>
<property name="use-underline">1</property>
<property name="mnemonic-widget">level_scale</property>
<style>
<class name="dim-label"/>
</style>
<layout>
<property name="column">0</property>
<property name="row">2</property>
</layout>
</object>
</child>
<child>
<object class="GtkScale" id="level_scale">
<property name="valign">baseline</property>
<property name="draw-value">0</property>
<property name="adjustment">
<object class="GtkAdjustment">
<property name="upper">100</property>
<property name="lower">0</property>
<property name="value">50</property>
<property name="step-increment">1</property>
<property name="page-increment">10</property>
</object>
</property>
<signal name="value-changed" handler="level_scale_value_changed" object="mode_switch" swapped="no"/>
<layout>
<property name="column">1</property>
<property name="row">2</property>
<property name="column-span">2</property>
</layout>
</object>
</child>
<child>
<object class="GtkLabel">
<property name="halign">end</property>
<property name="valign">baseline</property>
<property name="label">_Mode</property>
<property name="use-underline">1</property>
<property name="mnemonic-widget">mode_switch</property>
<style>
<class name="dim-label"/>
</style>
<layout>
<property name="column">0</property>
<property name="row">3</property>
</layout>
</object>
</child>
<child>
<object class="GtkSwitch" id="mode_switch">
<property name="halign">start</property>
<property name="valign">baseline</property>
<signal name="state-set" handler="mode_switch_state_set" object="level_scale" swapped="no"/>
<layout>
<property name="column">1</property>
<property name="row">3</property>
</layout>
</object>
</child>
<child>
<object class="GtkLabel" id="error_label">
<property name="visible">0</property>
<property name="halign">start</property>
<property name="valign">baseline</property>
<property name="label">Level too low</property>
<style>
<class name="error"/>
</style>
<layout>
<property name="column">2</property>
<property name="row">3</property>
</layout>
</object>
</child>
</object>
</child>
</object>
</child>
</object>
</interface>

View File

@@ -13,9 +13,9 @@
static GtkWidget *window = NULL; static GtkWidget *window = NULL;
static void static void
response_cb (GtkDialog *dialog, int response_id) response_cb (GtkDialog *dialog, gint response_id)
{ {
gtk_window_destroy (GTK_WINDOW (window)); gtk_widget_destroy (window);
window = NULL; window = NULL;
} }
@@ -35,10 +35,6 @@ do_expander (GtkWidget *do_widget)
GtkWidget *sw; GtkWidget *sw;
GtkWidget *tv; GtkWidget *tv;
GtkTextBuffer *buffer; GtkTextBuffer *buffer;
GtkTextIter start;
GtkTextIter end;
GtkTextTag *tag;
GdkPaintable *paintable;
if (!window) if (!window)
{ {
@@ -61,32 +57,19 @@ do_expander (GtkWidget *do_widget)
expander = gtk_expander_new ("Details:"); expander = gtk_expander_new ("Details:");
gtk_widget_set_vexpand (expander, TRUE); gtk_widget_set_vexpand (expander, TRUE);
sw = gtk_scrolled_window_new (); sw = gtk_scrolled_window_new (NULL, NULL);
gtk_scrolled_window_set_min_content_height (GTK_SCROLLED_WINDOW (sw), 100); gtk_scrolled_window_set_min_content_height (GTK_SCROLLED_WINDOW (sw), 100);
gtk_scrolled_window_set_has_frame (GTK_SCROLLED_WINDOW (sw), TRUE); gtk_scrolled_window_set_has_frame (GTK_SCROLLED_WINDOW (sw), TRUE);
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw), gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
GTK_POLICY_NEVER, GTK_POLICY_NEVER,
GTK_POLICY_AUTOMATIC); GTK_POLICY_AUTOMATIC);
gtk_scrolled_window_set_propagate_natural_height (GTK_SCROLLED_WINDOW (sw), TRUE); gtk_scrolled_window_set_propagate_natural_height (GTK_SCROLLED_WINDOW (sw), TRUE);
gtk_widget_set_vexpand (sw, TRUE);
tv = gtk_text_view_new (); tv = gtk_text_view_new ();
g_object_set (tv,
"left-margin", 10,
"right-margin", 10,
"top-margin", 10,
"bottom-margin", 10,
NULL);
buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (tv)); buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (tv));
gtk_text_view_set_editable (GTK_TEXT_VIEW (tv), FALSE); gtk_text_view_set_editable (GTK_TEXT_VIEW (tv), FALSE);
gtk_text_view_set_cursor_visible (GTK_TEXT_VIEW (tv), FALSE);
gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (tv), GTK_WRAP_WORD); gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (tv), GTK_WRAP_WORD);
gtk_text_view_set_pixels_above_lines (GTK_TEXT_VIEW (tv), 2); gtk_text_buffer_set_text (GTK_TEXT_BUFFER (buffer),
gtk_text_view_set_pixels_below_lines (GTK_TEXT_VIEW (tv), 2);
gtk_text_buffer_set_text (buffer,
"Finally, the full story with all details. " "Finally, the full story with all details. "
"And all the inside information, including " "And all the inside information, including "
"error codes, etc etc. Pages of information, " "error codes, etc etc. Pages of information, "
@@ -94,25 +77,10 @@ do_expander (GtkWidget *do_widget)
"or even resize the window - it works !\n" "or even resize the window - it works !\n"
"A second paragraph will contain even more " "A second paragraph will contain even more "
"innuendo, just to make you scroll down or " "innuendo, just to make you scroll down or "
"resize the window.\n" "resize the window. Do it already !", -1);
"Do it already!\n", -1);
gtk_text_buffer_get_end_iter (buffer, &start);
paintable = GDK_PAINTABLE (gdk_texture_new_from_resource ("/cursors/images/gtk_logo_cursor.png"));
gtk_text_buffer_insert_paintable (buffer, &start, paintable);
g_object_unref (paintable);
gtk_text_iter_backward_char (&start);
gtk_text_buffer_get_end_iter (buffer, &end);
tag = gtk_text_buffer_create_tag (buffer, NULL,
"pixels-above-lines", 200,
"justification", GTK_JUSTIFY_RIGHT,
NULL);
gtk_text_buffer_apply_tag (buffer, tag, &start, &end);
gtk_scrolled_window_set_child (GTK_SCROLLED_WINDOW (sw), tv); gtk_scrolled_window_set_child (GTK_SCROLLED_WINDOW (sw), tv);
gtk_expander_set_child (GTK_EXPANDER (expander), sw); gtk_container_add (GTK_CONTAINER (expander), sw);
gtk_box_append (GTK_BOX (area), expander); gtk_container_add (GTK_CONTAINER (area), expander);
g_signal_connect (expander, "notify::expanded", g_signal_connect (expander, "notify::expanded",
G_CALLBACK (expander_cb), window); G_CALLBACK (expander_cb), window);
@@ -122,7 +90,7 @@ do_expander (GtkWidget *do_widget)
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
gtk_widget_show (window); gtk_widget_show (window);
else else
gtk_window_destroy (GTK_WINDOW (window)); gtk_widget_destroy (window);
return window; return window;
} }

View File

@@ -1,5 +1,4 @@
/* Tree View/Filter Model /* Tree View/Filter Model
* #Keywords: GtkTreeView
* *
* This example demonstrates how GtkTreeModelFilter can be used not * This example demonstrates how GtkTreeModelFilter can be used not
* just to show a subset of the rows, but also to compute columns * just to show a subset of the rows, but also to compute columns
@@ -23,8 +22,8 @@ format_number (GtkTreeViewColumn *col,
GtkTreeIter *iter, GtkTreeIter *iter,
gpointer data) gpointer data)
{ {
int num; gint num;
char *text; gchar *text;
gtk_tree_model_get (model, iter, GPOINTER_TO_INT (data), &num, -1); gtk_tree_model_get (model, iter, GPOINTER_TO_INT (data), &num, -1);
text = g_strdup_printf ("%d", num); text = g_strdup_printf ("%d", num);
@@ -36,11 +35,11 @@ static void
filter_modify_func (GtkTreeModel *model, filter_modify_func (GtkTreeModel *model,
GtkTreeIter *iter, GtkTreeIter *iter,
GValue *value, GValue *value,
int column, gint column,
gpointer data) gpointer data)
{ {
GtkTreeModelFilter *filter_model = GTK_TREE_MODEL_FILTER (model); GtkTreeModelFilter *filter_model = GTK_TREE_MODEL_FILTER (model);
int width, height; gint width, height;
GtkTreeModel *child_model; GtkTreeModel *child_model;
GtkTreeIter child_iter; GtkTreeIter child_iter;
@@ -76,7 +75,7 @@ visible_func (GtkTreeModel *model,
GtkTreeIter *iter, GtkTreeIter *iter,
gpointer data) gpointer data)
{ {
int width; gint width;
gtk_tree_model_get (model, iter, gtk_tree_model_get (model, iter,
WIDTH_COLUMN, &width, WIDTH_COLUMN, &width,
@@ -126,7 +125,8 @@ do_filtermodel (GtkWidget *do_widget)
window = GTK_WIDGET (gtk_builder_get_object (builder, "window1")); window = GTK_WIDGET (gtk_builder_get_object (builder, "window1"));
gtk_window_set_display (GTK_WINDOW (window), gtk_window_set_display (GTK_WINDOW (window),
gtk_widget_get_display (do_widget)); gtk_widget_get_display (do_widget));
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window); g_signal_connect (window, "destroy",
G_CALLBACK (gtk_widget_destroyed), &window);
store = (GtkListStore*)gtk_builder_get_object (builder, "liststore1"); store = (GtkListStore*)gtk_builder_get_object (builder, "liststore1");
@@ -199,7 +199,7 @@ do_filtermodel (GtkWidget *do_widget)
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
gtk_widget_show (window); gtk_widget_show (window);
else else
gtk_window_destroy (GTK_WINDOW (window)); gtk_widget_destroy (window);
return window; return window;
} }

View File

@@ -45,9 +45,12 @@
<attributes> <attributes>
<attribute name="weight" value="bold"></attribute> <attribute name="weight" value="bold"></attribute>
</attributes> </attributes>
<accessibility>
<relation type="label-for" target="treeview1"/>
</accessibility>
<layout> <layout>
<property name="column">0</property> <property name="left-attach">0</property>
<property name="row">0</property> <property name="top-attach">0</property>
</layout> </layout>
</object> </object>
</child> </child>
@@ -80,9 +83,12 @@
</child> </child>
</object> </object>
</child> </child>
<accessibility>
<relation type="labelled-by" target="label1"/>
</accessibility>
<layout> <layout>
<property name="column">0</property> <property name="left-attach">0</property>
<property name="row">1</property> <property name="top-attach">1</property>
</layout> </layout>
</object> </object>
</child> </child>
@@ -127,9 +133,12 @@
</child> </child>
</object> </object>
</child> </child>
<accessibility>
<relation type="labelled-by" target="label2"/>
</accessibility>
<layout> <layout>
<property name="column">1</property> <property name="left-attach">1</property>
<property name="row">1</property> <property name="top-attach">1</property>
</layout> </layout>
</object> </object>
</child> </child>
@@ -140,9 +149,12 @@
<attributes> <attributes>
<attribute name="weight" value="bold"></attribute> <attribute name="weight" value="bold"></attribute>
</attributes> </attributes>
<accessibility>
<relation type="label-for" target="treeview2"/>
</accessibility>
<layout> <layout>
<property name="column">1</property> <property name="left-attach">1</property>
<property name="row">0</property> <property name="top-attach">0</property>
</layout> </layout>
</object> </object>
</child> </child>
@@ -153,9 +165,12 @@
<attributes> <attributes>
<attribute name="weight" value="bold"></attribute> <attribute name="weight" value="bold"></attribute>
</attributes> </attributes>
<accessibility>
<relation type="label-for" target="treeview3"/>
</accessibility>
<layout> <layout>
<property name="column">0</property> <property name="left-attach">0</property>
<property name="row">2</property> <property name="top-attach">2</property>
</layout> </layout>
</object> </object>
</child> </child>
@@ -182,9 +197,12 @@
</child> </child>
</object> </object>
</child> </child>
<accessibility>
<relation type="labelled-by" target="label3"/>
</accessibility>
<layout> <layout>
<property name="column">0</property> <property name="left-attach">0</property>
<property name="row">3</property> <property name="top-attach">3</property>
</layout> </layout>
</object> </object>
</child> </child>

View File

@@ -1,72 +0,0 @@
uniform float u_time;
uniform sampler2D u_texture1;
/* 2D -> [0..1] random number generator */
float random(vec2 st) {
return fract(sin(dot(st.xy,
vec2(12.9898,78.233))) *
43758.5453123);
}
/* Generate a smoothed 2d noise based on random() */
float noise(vec2 v) {
/* Round point v to integer grid grid */
vec2 grid_point = floor(v);
/* Randomize in grid corners */
float corner1 = random(grid_point);
float corner2 = random(grid_point + vec2(1, 0));
float corner3 = random(grid_point + vec2(0, 1));
float corner4 = random(grid_point + vec2(1, 1));
/* Interpolate smoothly between grid points */
vec2 fraction = smoothstep(vec2(0.0), vec2(1.0), fract(v));
return mix(mix(corner1, corner2, fraction.x),
mix(corner3, corner4, fraction.x),
fraction.y);
}
/* fractal brownian motion noice, see https://www.iquilezles.org/www/articles/fbm/fbm.htm */
float fbm(in vec2 x)
{
const float octaveScale = 1.9;
const float G = 0.5;
float f = 1.0;
float a = 1.0;
float t = 0.0;
int numOctaves = 5;
for (int i = 0; i < numOctaves; i++) {
t += a*noise(f*x);
f *= octaveScale;
a *= G;
}
return t;
}
void mainImage(out vec4 fragColor, in vec2 fragCoord, in vec2 resolution, in vec2 uv)
{
vec2 xy = fragCoord / resolution;
float zoom = 3.0 - sin(u_time*0.5)*0.3;
// Normalize coord to height of widget
vec2 p = (vec2 (-resolution.x/2.0 + fragCoord.x, resolution.y - fragCoord.y) / resolution.yy)* zoom;
// Use recursive incantations of fbm
float q1 = fbm(p - vec2(0.8, 0.3) * u_time);
float q2 = fbm(p - vec2(0.5, 1.3) * u_time);
float r = fbm(2.0*p + vec2(q1,q2) - vec2(0.0, 1.0)*u_time*10.0 *0.4);
// Compute intensity, mostly on the bottom
float w = 2.0 * r * p.y;
// Smooth out left/right side and fade in at start
w /= smoothstep(0.0,0.1, xy.x)* smoothstep(0.0,0.1, 1.0-xy.x) * smoothstep(0.0,0.4, u_time);
// Compute colors
vec3 c = vec3(1.0,.2,.05);
vec3 color = 1.0 / (w*w/c + 1.0);
// Mix in widget
vec4 widget = GskTexture(u_texture1,uv);
fragColor = mix(vec4(color,1), widget, 1.0-color.x);
}

View File

@@ -9,7 +9,6 @@
#include "gtkfishbowl.h" #include "gtkfishbowl.h"
#include "gtkgears.h" #include "gtkgears.h"
#include "gskshaderpaintable.h"
const char *const css = const char *const css =
".blurred-button {" ".blurred-button {"
@@ -150,38 +149,6 @@ create_switch (void)
return w; return w;
} }
static gboolean
update_paintable (GtkWidget *widget,
GdkFrameClock *frame_clock,
gpointer user_data)
{
GskShaderPaintable *paintable;
gint64 frame_time;
paintable = GSK_SHADER_PAINTABLE (gtk_picture_get_paintable (GTK_PICTURE (widget)));
frame_time = gdk_frame_clock_get_frame_time (frame_clock);
gsk_shader_paintable_update_time (paintable, 0, frame_time);
return G_SOURCE_CONTINUE;
}
static GtkWidget *
create_cogs (void)
{
GtkWidget *picture;
static GskGLShader *cog_shader = NULL;
GdkPaintable *paintable;
if (cog_shader == NULL)
cog_shader = gsk_gl_shader_new_from_resource ("/gltransition/cogs2.glsl");
paintable = gsk_shader_paintable_new (g_object_ref (cog_shader), NULL);
picture = gtk_picture_new_for_paintable (paintable);
gtk_widget_set_size_request (picture, 150, 75);
gtk_widget_add_tick_callback (picture, update_paintable, NULL, NULL);
return picture;
}
static void static void
mapped (GtkWidget *w) mapped (GtkWidget *w)
{ {
@@ -218,7 +185,6 @@ static const struct {
{ "Gears", create_gears }, { "Gears", create_gears },
{ "Switch", create_switch }, { "Switch", create_switch },
{ "Menubutton", create_menu_button }, { "Menubutton", create_menu_button },
{ "Shader", create_cogs },
}; };
static int selected_widget_type = -1; static int selected_widget_type = -1;
@@ -243,7 +209,7 @@ set_widget_type (GtkFishbowl *fishbowl,
widget_types[selected_widget_type].name); widget_types[selected_widget_type].name);
} }
G_MODULE_EXPORT void void
fishbowl_next_button_clicked_cb (GtkButton *source, fishbowl_next_button_clicked_cb (GtkButton *source,
gpointer user_data) gpointer user_data)
{ {
@@ -258,7 +224,7 @@ fishbowl_next_button_clicked_cb (GtkButton *source,
set_widget_type (fishbowl, new_index); set_widget_type (fishbowl, new_index);
} }
G_MODULE_EXPORT void void
fishbowl_prev_button_clicked_cb (GtkButton *source, fishbowl_prev_button_clicked_cb (GtkButton *source,
gpointer user_data) gpointer user_data)
{ {
@@ -273,7 +239,7 @@ fishbowl_prev_button_clicked_cb (GtkButton *source,
set_widget_type (fishbowl, new_index); set_widget_type (fishbowl, new_index);
} }
G_MODULE_EXPORT void void
fishbowl_changes_toggled_cb (GtkToggleButton *button, fishbowl_changes_toggled_cb (GtkToggleButton *button,
gpointer user_data) gpointer user_data)
{ {
@@ -283,14 +249,6 @@ fishbowl_changes_toggled_cb (GtkToggleButton *button,
gtk_button_set_icon_name (GTK_BUTTON (button), "changes-allow"); gtk_button_set_icon_name (GTK_BUTTON (button), "changes-allow");
} }
G_MODULE_EXPORT char *
format_header_cb (GObject *object,
guint count,
double fps)
{
return g_strdup_printf ("%u Icons, %.2f fps", count, fps);
}
GtkWidget * GtkWidget *
do_fishbowl (GtkWidget *do_widget) do_fishbowl (GtkWidget *do_widget)
{ {
@@ -315,13 +273,15 @@ do_fishbowl (GtkWidget *do_widget)
builder = gtk_builder_new_from_resource ("/fishbowl/fishbowl.ui"); builder = gtk_builder_new_from_resource ("/fishbowl/fishbowl.ui");
window = GTK_WIDGET (gtk_builder_get_object (builder, "window")); window = GTK_WIDGET (gtk_builder_get_object (builder, "window"));
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window); g_signal_connect (window, "destroy",
G_CALLBACK (gtk_widget_destroyed), &window);
bowl = GTK_WIDGET (gtk_builder_get_object (builder, "bowl")); bowl = GTK_WIDGET (gtk_builder_get_object (builder, "bowl"));
selected_widget_type = -1; selected_widget_type = -1;
set_widget_type (GTK_FISHBOWL (bowl), 0); set_widget_type (GTK_FISHBOWL (bowl), 0);
gtk_window_set_display (GTK_WINDOW (window), gtk_window_set_display (GTK_WINDOW (window),
gtk_widget_get_display (do_widget)); gtk_widget_get_display (do_widget));
g_signal_connect (window, "destroy",
G_CALLBACK (gtk_widget_destroyed), &window);
gtk_widget_realize (window); gtk_widget_realize (window);
g_object_unref (builder); g_object_unref (builder);
@@ -330,7 +290,7 @@ do_fishbowl (GtkWidget *do_widget)
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
gtk_widget_show (window); gtk_widget_show (window);
else else
gtk_window_destroy (GTK_WINDOW (window)); gtk_widget_destroy (window);
return window; return window;
} }

View File

@@ -6,6 +6,7 @@
<property name="default-height">400</property> <property name="default-height">400</property>
<child type="titlebar"> <child type="titlebar">
<object class="GtkHeaderBar" id=""> <object class="GtkHeaderBar" id="">
<property name="show-title-buttons">1</property>
<child> <child>
<object class="GtkBox"> <object class="GtkBox">
<style> <style>
@@ -27,15 +28,22 @@
</child> </child>
<child type="end"> <child type="end">
<object class="GtkLabel"> <object class="GtkLabel">
<binding name="label"> <property name="label">fps</property>
<closure type="gchararray" function="format_header_cb"> </object>
<lookup name="count">bowl</lookup> </child>
<lookup name="framerate">bowl</lookup> <child type="end">
</closure> <object class="GtkLabel">
</binding> <property name="label" bind-source="bowl" bind-property="framerate-string"/>
<attributes> </object>
<attribute name="font-features" value="tnum=1"/> </child>
</attributes> <child type="end">
<object class="GtkLabel">
<property name="label">Icons, </property>
</object>
</child>
<child type="end">
<object class="GtkLabel">
<property name="label" bind-source="bowl" bind-property="count"/>
</object> </object>
</child> </child>
<child type="end"> <child type="end">
@@ -50,7 +58,6 @@
<child> <child>
<object class="GtkFishbowl" id="bowl"> <object class="GtkFishbowl" id="bowl">
<property name="visible">True</property> <property name="visible">True</property>
<property name="overflow">hidden</property>
<property name="animating">True</property> <property name="animating">True</property>
<property name="benchmark" bind-source="changes_allow" bind-property="active" bind-flags="invert-boolean | sync-create"/> <property name="benchmark" bind-source="changes_allow" bind-property="active" bind-flags="invert-boolean | sync-create"/>
</object> </object>

View File

@@ -1,5 +1,4 @@
/* Fixed Layout /* Fixed layout
* #Keywords: GtkLayoutManager
* *
* GtkFixed is a container that allows placing and transforming * GtkFixed is a container that allows placing and transforming
* widgets manually. * widgets manually.
@@ -54,7 +53,7 @@ create_faces (void)
faces[i].face = gtk_frame_new (NULL); faces[i].face = gtk_frame_new (NULL);
gtk_widget_set_size_request (faces[i].face, face_size, face_size); gtk_widget_set_size_request (faces[i].face, face_size, face_size);
gtk_widget_add_css_class (faces[i].face, faces[i].css_class); gtk_widget_add_css_class (faces[i].face, faces[i].css_class);
gtk_fixed_put (GTK_FIXED (fixed), faces[i].face, 0, 0); gtk_container_add (GTK_CONTAINER (fixed), faces[i].face);
/* Set up the transformation for each face */ /* Set up the transformation for each face */
transform = gsk_transform_translate (transform, &GRAPHENE_POINT_INIT (w, h)); transform = gsk_transform_translate (transform, &GRAPHENE_POINT_INIT (w, h));
@@ -127,11 +126,11 @@ create_demo_window (GtkWidget *do_widget)
window = gtk_window_new (); window = gtk_window_new ();
gtk_window_set_display (GTK_WINDOW (window), gtk_widget_get_display (do_widget)); gtk_window_set_display (GTK_WINDOW (window), gtk_widget_get_display (do_widget));
gtk_window_set_title (GTK_WINDOW (window), "Fixed Layout"); gtk_window_set_title (GTK_WINDOW (window), "Fixed layout");
gtk_window_set_default_size (GTK_WINDOW (window), 600, 400); gtk_window_set_default_size (GTK_WINDOW (window), 600, 400);
g_signal_connect (window, "destroy", G_CALLBACK (close_window), NULL); g_signal_connect (window, "destroy", G_CALLBACK (close_window), NULL);
sw = gtk_scrolled_window_new (); sw = gtk_scrolled_window_new (NULL, NULL);
gtk_window_set_child (GTK_WINDOW (window), sw); gtk_window_set_child (GTK_WINDOW (window), sw);
fixed = gtk_fixed_new (); fixed = gtk_fixed_new ();
@@ -140,7 +139,7 @@ create_demo_window (GtkWidget *do_widget)
gtk_widget_set_valign (GTK_WIDGET (fixed), GTK_ALIGN_CENTER); gtk_widget_set_valign (GTK_WIDGET (fixed), GTK_ALIGN_CENTER);
cube = create_faces (); cube = create_faces ();
gtk_fixed_put (GTK_FIXED (fixed), cube, 0, 0); gtk_container_add (GTK_CONTAINER (fixed), cube);
gtk_widget_set_overflow (fixed, GTK_OVERFLOW_VISIBLE); gtk_widget_set_overflow (fixed, GTK_OVERFLOW_VISIBLE);
provider = gtk_css_provider_new (); provider = gtk_css_provider_new ();
@@ -162,7 +161,7 @@ do_fixed (GtkWidget *do_widget)
if (!gtk_widget_get_visible (demo_window)) if (!gtk_widget_get_visible (demo_window))
gtk_widget_show (demo_window); gtk_widget_show (demo_window);
else else
gtk_window_destroy (GTK_WINDOW (demo_window)); gtk_widget_destroy (demo_window);
return demo_window; return demo_window;
} }

View File

@@ -1,10 +1,9 @@
/* Flow Box /* Flow Box
* *
* GtkFlowBox allows flexible and responsive grids which reflow * GtkFlowBox allows flexible and responsive grids which reflow
* as needed and support sorting and filtering. The children of * as needed and support sorting and filtering.
* a GtkFlowBox are regular widgets
* *
* The dataset used here has 665 colors. * The children of a GtkFlowBox are regular widgets
*/ */
#include <gtk/gtk.h> #include <gtk/gtk.h>
@@ -29,7 +28,7 @@ draw_color (GtkDrawingArea *drawingarea,
} }
static GtkWidget * static GtkWidget *
color_swatch_new (const char *color) color_swatch_new (const gchar *color)
{ {
GtkWidget *button, *area; GtkWidget *button, *area;
@@ -48,7 +47,7 @@ do_flowbox (GtkWidget *do_widget)
{ {
static GtkWidget *window = NULL; static GtkWidget *window = NULL;
GtkWidget *scrolled, *flowbox; GtkWidget *scrolled, *flowbox;
const char *colors[] = { const gchar *colors[] = {
"AliceBlue", "AliceBlue",
"AntiqueWhite", "AntiqueWhite",
"AntiqueWhite1", "AntiqueWhite1",
@@ -716,7 +715,7 @@ do_flowbox (GtkWidget *do_widget)
"YellowGreen", "YellowGreen",
NULL NULL
}; };
int i; gint i;
if (!window) if (!window)
{ {
@@ -725,9 +724,11 @@ do_flowbox (GtkWidget *do_widget)
gtk_widget_get_display (do_widget)); gtk_widget_get_display (do_widget));
gtk_window_set_title (GTK_WINDOW (window), "Flow Box"); gtk_window_set_title (GTK_WINDOW (window), "Flow Box");
gtk_window_set_default_size (GTK_WINDOW (window), 400, 600); gtk_window_set_default_size (GTK_WINDOW (window), 400, 600);
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
scrolled = gtk_scrolled_window_new (); g_signal_connect (window, "destroy",
G_CALLBACK (gtk_widget_destroyed), &window);
scrolled = gtk_scrolled_window_new (NULL, NULL);
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
flowbox = gtk_flow_box_new (); flowbox = gtk_flow_box_new ();
gtk_widget_set_valign (flowbox, GTK_ALIGN_START); gtk_widget_set_valign (flowbox, GTK_ALIGN_START);
@@ -738,13 +739,13 @@ do_flowbox (GtkWidget *do_widget)
gtk_window_set_child (GTK_WINDOW (window), scrolled); gtk_window_set_child (GTK_WINDOW (window), scrolled);
for (i = 0; colors[i]; i++) for (i = 0; colors[i]; i++)
gtk_flow_box_insert (GTK_FLOW_BOX (flowbox), color_swatch_new (colors[i]), -1); gtk_container_add (GTK_CONTAINER (flowbox), color_swatch_new (colors[i]));
} }
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
gtk_widget_show (window); gtk_widget_show (window);
else else
gtk_window_destroy (GTK_WINDOW (window)); gtk_widget_destroy (window);
return window; return window;
} }

View File

@@ -7,6 +7,7 @@
<property name="title">Font Explorer</property> <property name="title">Font Explorer</property>
<child type="titlebar"> <child type="titlebar">
<object class="GtkHeaderBar"> <object class="GtkHeaderBar">
<property name="show-title-buttons">1</property>
<child> <child>
<object class="GtkButton" id="reset"> <object class="GtkButton" id="reset">
<property name="receives-default">1</property> <property name="receives-default">1</property>

View File

@@ -130,10 +130,6 @@ static const char *
get_feature_display_name (unsigned int tag) get_feature_display_name (unsigned int tag)
{ {
int i; int i;
static char buf[5] = { 0, };
if (tag == MAKE_TAG ('x', 'x', 'x', 'x'))
return _("Default");
for (i = 0; i < G_N_ELEMENTS (open_type_layout_features); i++) for (i = 0; i < G_N_ELEMENTS (open_type_layout_features); i++)
{ {
@@ -141,10 +137,7 @@ get_feature_display_name (unsigned int tag)
return g_dpgettext2 (NULL, "OpenType layout", open_type_layout_features[i].name); return g_dpgettext2 (NULL, "OpenType layout", open_type_layout_features[i].name);
} }
hb_tag_to_string (tag, buf); return NULL;
g_warning ("unknown OpenType layout feature tag: %s", buf);
return buf;
} }
static void update_display (void); static void update_display (void);
@@ -158,38 +151,26 @@ set_inconsistent (GtkCheckButton *button,
} }
static void static void
feat_pressed (GtkGestureClick *gesture, feat_clicked (GtkWidget *feat,
int n_press, gpointer data)
double x,
double y,
GtkWidget *feat)
{ {
const guint button = gtk_gesture_single_get_current_button (GTK_GESTURE_SINGLE (gesture)); g_signal_handlers_block_by_func (feat, feat_clicked, NULL);
if (button == GDK_BUTTON_PRIMARY) if (gtk_check_button_get_inconsistent (GTK_CHECK_BUTTON (feat)))
{ {
g_signal_handlers_block_by_func (feat, feat_pressed, NULL); set_inconsistent (GTK_CHECK_BUTTON (feat), FALSE);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (feat), TRUE);
if (gtk_check_button_get_inconsistent (GTK_CHECK_BUTTON (feat)))
{
set_inconsistent (GTK_CHECK_BUTTON (feat), FALSE);
gtk_check_button_set_active (GTK_CHECK_BUTTON (feat), TRUE);
}
g_signal_handlers_unblock_by_func (feat, feat_pressed, NULL);
} }
else if (button == GDK_BUTTON_SECONDARY) else if (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (feat)))
{ {
gboolean inconsistent = gtk_check_button_get_inconsistent (GTK_CHECK_BUTTON (feat)); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (feat), FALSE);
set_inconsistent (GTK_CHECK_BUTTON (feat), !inconsistent); }
else
{
set_inconsistent (GTK_CHECK_BUTTON (feat), TRUE);
} }
}
static void g_signal_handlers_unblock_by_func (feat, feat_clicked, NULL);
feat_toggled_cb (GtkCheckButton *check_button,
gpointer data)
{
set_inconsistent (check_button, FALSE);
} }
static void static void
@@ -213,14 +194,13 @@ add_check_group (GtkWidget *box,
pango_attr_list_insert (attrs, pango_attr_weight_new (PANGO_WEIGHT_BOLD)); pango_attr_list_insert (attrs, pango_attr_weight_new (PANGO_WEIGHT_BOLD));
gtk_label_set_attributes (GTK_LABEL (label), attrs); gtk_label_set_attributes (GTK_LABEL (label), attrs);
pango_attr_list_unref (attrs); pango_attr_list_unref (attrs);
gtk_box_append (GTK_BOX (group), label); gtk_container_add (GTK_CONTAINER (group), label);
for (i = 0; tags[i]; i++) for (i = 0; tags[i]; i++)
{ {
unsigned int tag; unsigned int tag;
GtkWidget *feat; GtkWidget *feat;
FeatureItem *item; FeatureItem *item;
GtkGesture *gesture;
tag = hb_tag_from_string (tags[i], -1); tag = hb_tag_from_string (tags[i], -1);
@@ -229,14 +209,9 @@ add_check_group (GtkWidget *box,
g_signal_connect (feat, "notify::active", G_CALLBACK (update_display), NULL); g_signal_connect (feat, "notify::active", G_CALLBACK (update_display), NULL);
g_signal_connect (feat, "notify::inconsistent", G_CALLBACK (update_display), NULL); g_signal_connect (feat, "notify::inconsistent", G_CALLBACK (update_display), NULL);
g_signal_connect (feat, "toggled", G_CALLBACK (feat_toggled_cb), NULL); g_signal_connect (feat, "clicked", G_CALLBACK (feat_clicked), NULL);
gesture = gtk_gesture_click_new (); gtk_container_add (GTK_CONTAINER (group), feat);
gtk_gesture_single_set_button (GTK_GESTURE_SINGLE (gesture), GDK_BUTTON_SECONDARY);
g_signal_connect (gesture, "pressed", G_CALLBACK (feat_pressed), feat);
gtk_widget_add_controller (feat, GTK_EVENT_CONTROLLER (gesture));
gtk_box_append (GTK_BOX (group), feat);
item = g_new (FeatureItem, 1); item = g_new (FeatureItem, 1);
item->name = tags[i]; item->name = tags[i];
@@ -248,7 +223,7 @@ add_check_group (GtkWidget *box,
feature_items = g_list_prepend (feature_items, item); feature_items = g_list_prepend (feature_items, item);
} }
gtk_box_append (GTK_BOX (box), group); gtk_container_add (GTK_CONTAINER (box), group);
} }
static void static void
@@ -273,7 +248,7 @@ add_radio_group (GtkWidget *box,
pango_attr_list_insert (attrs, pango_attr_weight_new (PANGO_WEIGHT_BOLD)); pango_attr_list_insert (attrs, pango_attr_weight_new (PANGO_WEIGHT_BOLD));
gtk_label_set_attributes (GTK_LABEL (label), attrs); gtk_label_set_attributes (GTK_LABEL (label), attrs);
pango_attr_list_unref (attrs); pango_attr_list_unref (attrs);
gtk_box_append (GTK_BOX (group), label); gtk_container_add (GTK_CONTAINER (group), label);
for (i = 0; tags[i]; i++) for (i = 0; tags[i]; i++)
{ {
@@ -285,16 +260,15 @@ add_radio_group (GtkWidget *box,
tag = hb_tag_from_string (tags[i], -1); tag = hb_tag_from_string (tags[i], -1);
name = get_feature_display_name (tag); name = get_feature_display_name (tag);
feat = gtk_check_button_new_with_label (name ? name : _("Default")); feat = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (group_button),
name ? name : _("Default"));
if (group_button == NULL) if (group_button == NULL)
group_button = feat; group_button = feat;
else
gtk_check_button_set_group (GTK_CHECK_BUTTON (feat), GTK_CHECK_BUTTON (group_button));
g_signal_connect (feat, "notify::active", G_CALLBACK (update_display), NULL); g_signal_connect (feat, "notify::active", G_CALLBACK (update_display), NULL);
g_object_set_data (G_OBJECT (feat), "default", group_button); g_object_set_data (G_OBJECT (feat), "default", group_button);
gtk_box_append (GTK_BOX (group), feat); gtk_container_add (GTK_CONTAINER (group), feat);
item = g_new (FeatureItem, 1); item = g_new (FeatureItem, 1);
item->name = tags[i]; item->name = tags[i];
@@ -306,7 +280,7 @@ add_radio_group (GtkWidget *box,
feature_items = g_list_prepend (feature_items, item); feature_items = g_list_prepend (feature_items, item);
} }
gtk_box_append (GTK_BOX (box), group); gtk_container_add (GTK_CONTAINER (box), group);
} }
static void static void
@@ -321,7 +295,7 @@ update_display (void)
GList *l; GList *l;
PangoAttrList *attrs; PangoAttrList *attrs;
PangoAttribute *attr; PangoAttribute *attr;
int ins, bound; gint ins, bound;
guint start, end; guint start, end;
PangoLanguage *lang; PangoLanguage *lang;
char *font_desc; char *font_desc;
@@ -362,35 +336,32 @@ update_display (void)
if (!gtk_widget_is_sensitive (item->feat)) if (!gtk_widget_is_sensitive (item->feat))
continue; continue;
if (GTK_IS_CHECK_BUTTON (item->feat)) if (GTK_IS_RADIO_BUTTON (item->feat))
{ {
if (g_object_get_data (G_OBJECT (item->feat), "default")) if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (item->feat)) &&
strcmp (item->name, "xxxx") != 0)
{ {
if (gtk_check_button_get_active (GTK_CHECK_BUTTON (item->feat)) &&
strcmp (item->name, "xxxx") != 0)
{
if (has_feature)
g_string_append (s, ", ");
g_string_append (s, item->name);
g_string_append (s, " 1");
has_feature = TRUE;
}
}
else
{
if (gtk_check_button_get_inconsistent (GTK_CHECK_BUTTON (item->feat)))
continue;
if (has_feature) if (has_feature)
g_string_append (s, ", "); g_string_append (s, ", ");
g_string_append (s, item->name); g_string_append (s, item->name);
if (gtk_check_button_get_active (GTK_CHECK_BUTTON (item->feat))) g_string_append (s, " 1");
g_string_append (s, " 1");
else
g_string_append (s, " 0");
has_feature = TRUE; has_feature = TRUE;
} }
} }
else if (GTK_IS_CHECK_BUTTON (item->feat))
{
if (gtk_check_button_get_inconsistent (GTK_CHECK_BUTTON (item->feat)))
continue;
if (has_feature)
g_string_append (s, ", ");
g_string_append (s, item->name);
if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (item->feat)))
g_string_append (s, " 1");
else
g_string_append (s, " 0");
has_feature = TRUE;
}
} }
features = g_string_free (s, FALSE); features = g_string_free (s, FALSE);
@@ -508,7 +479,7 @@ update_script_combo (void)
{ {
GtkListStore *store; GtkListStore *store;
hb_font_t *hb_font; hb_font_t *hb_font;
int i, j, k; gint i, j, k;
PangoFont *pango_font; PangoFont *pango_font;
GHashTable *tags; GHashTable *tags;
GHashTableIter iter; GHashTableIter iter;
@@ -622,7 +593,7 @@ update_script_combo (void)
static void static void
update_features (void) update_features (void)
{ {
int i, j; gint i, j;
GtkTreeModel *model; GtkTreeModel *model;
GtkTreeIter iter; GtkTreeIter iter;
guint script_index, lang_index; guint script_index, lang_index;
@@ -636,7 +607,7 @@ update_features (void)
gtk_widget_hide (item->feat); gtk_widget_hide (item->feat);
gtk_widget_hide (gtk_widget_get_parent (item->feat)); gtk_widget_hide (gtk_widget_get_parent (item->feat));
if (strcmp (item->name, "xxxx") == 0) if (strcmp (item->name, "xxxx") == 0)
gtk_check_button_set_active (GTK_CHECK_BUTTON (item->feat), TRUE); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item->feat), TRUE);
} }
/* set feature presence checks from the font features */ /* set feature presence checks from the font features */
@@ -690,17 +661,14 @@ update_features (void)
{ {
gtk_widget_show (item->feat); gtk_widget_show (item->feat);
gtk_widget_show (gtk_widget_get_parent (item->feat)); gtk_widget_show (gtk_widget_get_parent (item->feat));
if (GTK_IS_CHECK_BUTTON (item->feat)) if (GTK_IS_RADIO_BUTTON (item->feat))
{ {
GtkWidget *def = GTK_WIDGET (g_object_get_data (G_OBJECT (item->feat), "default")); GtkWidget *def = GTK_WIDGET (g_object_get_data (G_OBJECT (item->feat), "default"));
if (def) gtk_widget_show (def);
{ }
gtk_widget_show (def); else if (GTK_IS_CHECK_BUTTON (item->feat))
gtk_widget_show (gtk_widget_get_parent (def)); {
gtk_check_button_set_active (GTK_CHECK_BUTTON (def), TRUE); set_inconsistent (GTK_CHECK_BUTTON (item->feat), TRUE);
}
else
set_inconsistent (GTK_CHECK_BUTTON (item->feat), TRUE);
} }
} }
} }
@@ -722,14 +690,14 @@ update_features (void)
p = strstr (feat, buf); p = strstr (feat, buf);
if (p) if (p)
{ {
if (GTK_IS_CHECK_BUTTON (item->feat) && g_object_get_data (G_OBJECT (item->feat), "default")) if (GTK_IS_RADIO_BUTTON (item->feat))
{ {
gtk_check_button_set_active (GTK_CHECK_BUTTON (item->feat), p[6] == '1'); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item->feat), p[6] == '1');
} }
else if (GTK_IS_CHECK_BUTTON (item->feat)) else if (GTK_IS_CHECK_BUTTON (item->feat))
{ {
set_inconsistent (GTK_CHECK_BUTTON (item->feat), FALSE); set_inconsistent (GTK_CHECK_BUTTON (item->feat), FALSE);
gtk_check_button_set_active (GTK_CHECK_BUTTON (item->feat), p[6] == '1'); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item->feat), p[6] == '1');
} }
} }
} }
@@ -760,8 +728,8 @@ static void
entry_activated (GtkEntry *entry, entry_activated (GtkEntry *entry,
GtkAdjustment *adjustment) GtkAdjustment *adjustment)
{ {
double value; gdouble value;
char *err = NULL; gchar *err = NULL;
value = g_strtod (gtk_editable_get_text (GTK_EDITABLE (entry)), &err); value = g_strtod (gtk_editable_get_text (GTK_EDITABLE (entry)), &err);
if (err != NULL) if (err != NULL)
@@ -971,7 +939,7 @@ instance_changed (GtkComboBox *combo)
{ {
Axis *axis; Axis *axis;
Axis akey; Axis akey;
double value; gdouble value;
value = coords[ai[i].axis_index]; value = coords[ai[i].axis_index];
@@ -1057,7 +1025,7 @@ denorm_coord (hb_ot_var_axis_info_t *axis, int coord)
static void static void
update_font_variations (void) update_font_variations (void)
{ {
GtkWidget *child; GtkWidget *child, *next;
PangoFont *pango_font = NULL; PangoFont *pango_font = NULL;
hb_font_t *hb_font; hb_font_t *hb_font;
hb_face_t *hb_face; hb_face_t *hb_face;
@@ -1069,8 +1037,12 @@ update_font_variations (void)
int i; int i;
child = gtk_widget_get_first_child (variations_grid); child = gtk_widget_get_first_child (variations_grid);
while ((child = gtk_widget_get_first_child (variations_grid))) while (child != NULL)
gtk_grid_remove (GTK_GRID (variations_grid), child); {
next = gtk_widget_get_next_sibling (child);
gtk_widget_destroy (child);
child = next;
}
instance_combo = NULL; instance_combo = NULL;
@@ -1166,15 +1138,15 @@ font_features_reset_features (void)
{ {
FeatureItem *item = l->data; FeatureItem *item = l->data;
if (GTK_IS_CHECK_BUTTON (item->feat)) if (GTK_IS_RADIO_BUTTON (item->feat))
{ {
if (strcmp (item->name, "xxxx") == 0) if (strcmp (item->name, "xxxx") == 0)
gtk_check_button_set_active (GTK_CHECK_BUTTON (item->feat), TRUE); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item->feat), TRUE);
else }
{ else if (GTK_IS_CHECK_BUTTON (item->feat))
gtk_check_button_set_active (GTK_CHECK_BUTTON (item->feat), FALSE); {
set_inconsistent (GTK_CHECK_BUTTON (item->feat), TRUE); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item->feat), FALSE);
} set_inconsistent (GTK_CHECK_BUTTON (item->feat), TRUE);
} }
} }
} }
@@ -1317,7 +1289,8 @@ do_font_features (GtkWidget *do_widget)
"palt", "palt",
"twid", "twid",
"qwid", NULL }); "qwid", NULL });
add_check_group (feature_list, _("Alternative Stylistic Sets"), (const char *[]){ "ss01", add_check_group (feature_list, _("Alternative Stylistic Sets"), (const char *[]){ "ss00",
"ss01",
"ss02", "ss02",
"ss03", "ss03",
"ss04", "ss04",
@@ -1360,7 +1333,8 @@ do_font_features (GtkWidget *do_widget)
font_features_font_changed (); font_features_font_changed ();
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window); g_signal_connect (window, "destroy",
G_CALLBACK (gtk_widget_destroyed), &window);
g_object_unref (builder); g_object_unref (builder);
@@ -1370,7 +1344,7 @@ do_font_features (GtkWidget *do_widget)
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
gtk_window_present (GTK_WINDOW (window)); gtk_window_present (GTK_WINDOW (window));
else else
gtk_window_destroy (GTK_WINDOW (window)); gtk_widget_destroy (window);
return window; return window;
} }

View File

@@ -1,573 +0,0 @@
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "config.h"
#include <gtk/gtk.h>
#include <glib/gstdio.h>
#ifdef HAVE_GIO_UNIX
#include <gio/gunixoutputstream.h>
#include <fcntl.h>
#endif
/* This is the guts of gtk_text_buffer_insert_markup,
* copied here so we can make an incremental version.
*/
static void
insert_tags_for_attributes (GtkTextBuffer *buffer,
PangoAttrIterator *iter,
GtkTextIter *start,
GtkTextIter *end)
{
GtkTextTagTable *table;
GSList *attrs, *l;
GtkTextTag *tag;
char name[256];
float fg_alpha, bg_alpha;
table = gtk_text_buffer_get_tag_table (buffer);
#define LANGUAGE_ATTR(attr_name) \
{ \
const char *language = pango_language_to_string (((PangoAttrLanguage*)attr)->value); \
g_snprintf (name, 256, "language=%s", language); \
tag = gtk_text_tag_table_lookup (table, name); \
if (!tag) \
{ \
tag = gtk_text_tag_new (name); \
g_object_set (tag, #attr_name, language, NULL); \
gtk_text_tag_table_add (table, tag); \
g_object_unref (tag); \
} \
gtk_text_buffer_apply_tag (buffer, tag, start, end); \
}
#define STRING_ATTR(attr_name) \
{ \
const char *string = ((PangoAttrString*)attr)->value; \
g_snprintf (name, 256, #attr_name "=%s", string); \
tag = gtk_text_tag_table_lookup (table, name); \
if (!tag) \
{ \
tag = gtk_text_tag_new (name); \
g_object_set (tag, #attr_name, string, NULL); \
gtk_text_tag_table_add (table, tag); \
g_object_unref (tag); \
} \
gtk_text_buffer_apply_tag (buffer, tag, start, end); \
}
#define INT_ATTR(attr_name) \
{ \
int value = ((PangoAttrInt*)attr)->value; \
g_snprintf (name, 256, #attr_name "=%d", value); \
tag = gtk_text_tag_table_lookup (table, name); \
if (!tag) \
{ \
tag = gtk_text_tag_new (name); \
g_object_set (tag, #attr_name, value, NULL); \
gtk_text_tag_table_add (table, tag); \
g_object_unref (tag); \
} \
gtk_text_buffer_apply_tag (buffer, tag, start, end); \
}
#define FONT_ATTR(attr_name) \
{ \
PangoFontDescription *desc = ((PangoAttrFontDesc*)attr)->desc; \
char *str = pango_font_description_to_string (desc); \
g_snprintf (name, 256, "font-desc=%s", str); \
g_free (str); \
tag = gtk_text_tag_table_lookup (table, name); \
if (!tag) \
{ \
tag = gtk_text_tag_new (name); \
g_object_set (tag, #attr_name, desc, NULL); \
gtk_text_tag_table_add (table, tag); \
g_object_unref (tag); \
} \
gtk_text_buffer_apply_tag (buffer, tag, start, end); \
}
#define FLOAT_ATTR(attr_name) \
{ \
float value = ((PangoAttrFloat*)attr)->value; \
g_snprintf (name, 256, #attr_name "=%g", value); \
tag = gtk_text_tag_table_lookup (table, name); \
if (!tag) \
{ \
tag = gtk_text_tag_new (name); \
g_object_set (tag, #attr_name, value, NULL); \
gtk_text_tag_table_add (table, tag); \
g_object_unref (tag); \
} \
gtk_text_buffer_apply_tag (buffer, tag, start, end); \
}
#define RGBA_ATTR(attr_name, alpha_value) \
{ \
PangoColor *color; \
GdkRGBA rgba; \
color = &((PangoAttrColor*)attr)->color; \
rgba.red = color->red / 65535.; \
rgba.green = color->green / 65535.; \
rgba.blue = color->blue / 65535.; \
rgba.alpha = alpha_value; \
char *str = gdk_rgba_to_string (&rgba); \
g_snprintf (name, 256, #attr_name "=%s", str); \
g_free (str); \
tag = gtk_text_tag_table_lookup (table, name); \
if (!tag) \
{ \
tag = gtk_text_tag_new (name); \
g_object_set (tag, #attr_name, &rgba, NULL); \
gtk_text_tag_table_add (table, tag); \
g_object_unref (tag); \
} \
gtk_text_buffer_apply_tag (buffer, tag, start, end); \
}
fg_alpha = bg_alpha = 1.;
attrs = pango_attr_iterator_get_attrs (iter);
for (l = attrs; l; l = l->next)
{
PangoAttribute *attr = l->data;
switch ((int)attr->klass->type)
{
case PANGO_ATTR_FOREGROUND_ALPHA:
fg_alpha = ((PangoAttrInt*)attr)->value / 65535.;
break;
case PANGO_ATTR_BACKGROUND_ALPHA:
bg_alpha = ((PangoAttrInt*)attr)->value / 65535.;
break;
default:
break;
}
}
for (l = attrs; l; l = l->next)
{
PangoAttribute *attr = l->data;
switch (attr->klass->type)
{
case PANGO_ATTR_LANGUAGE:
LANGUAGE_ATTR (language);
break;
case PANGO_ATTR_FAMILY:
STRING_ATTR (family);
break;
case PANGO_ATTR_STYLE:
INT_ATTR (style);
break;
case PANGO_ATTR_WEIGHT:
INT_ATTR (weight);
break;
case PANGO_ATTR_VARIANT:
INT_ATTR (variant);
break;
case PANGO_ATTR_STRETCH:
INT_ATTR (stretch);
break;
case PANGO_ATTR_SIZE:
INT_ATTR (size);
break;
case PANGO_ATTR_FONT_DESC:
FONT_ATTR (font-desc);
break;
case PANGO_ATTR_FOREGROUND:
RGBA_ATTR (foreground_rgba, fg_alpha);
break;
case PANGO_ATTR_BACKGROUND:
RGBA_ATTR (background_rgba, bg_alpha);
break;
case PANGO_ATTR_UNDERLINE:
INT_ATTR (underline);
break;
case PANGO_ATTR_UNDERLINE_COLOR:
RGBA_ATTR (underline_rgba, fg_alpha);
break;
case PANGO_ATTR_OVERLINE:
INT_ATTR (overline);
break;
case PANGO_ATTR_OVERLINE_COLOR:
RGBA_ATTR (overline_rgba, fg_alpha);
break;
case PANGO_ATTR_STRIKETHROUGH:
INT_ATTR (strikethrough);
break;
case PANGO_ATTR_STRIKETHROUGH_COLOR:
RGBA_ATTR (strikethrough_rgba, fg_alpha);
break;
case PANGO_ATTR_RISE:
INT_ATTR (rise);
break;
case PANGO_ATTR_SCALE:
FLOAT_ATTR (scale);
break;
case PANGO_ATTR_FALLBACK:
INT_ATTR (fallback);
break;
case PANGO_ATTR_LETTER_SPACING:
INT_ATTR (letter_spacing);
break;
case PANGO_ATTR_FONT_FEATURES:
STRING_ATTR (font_features);
break;
case PANGO_ATTR_ALLOW_BREAKS:
INT_ATTR (allow_breaks);
break;
case PANGO_ATTR_SHOW:
INT_ATTR (show_spaces);
break;
case PANGO_ATTR_INSERT_HYPHENS:
INT_ATTR (insert_hyphens);
break;
case PANGO_ATTR_SHAPE:
case PANGO_ATTR_ABSOLUTE_SIZE:
case PANGO_ATTR_GRAVITY:
case PANGO_ATTR_GRAVITY_HINT:
case PANGO_ATTR_FOREGROUND_ALPHA:
case PANGO_ATTR_BACKGROUND_ALPHA:
break;
case PANGO_ATTR_INVALID:
default:
g_assert_not_reached ();
break;
}
}
g_slist_free_full (attrs, (GDestroyNotify)pango_attribute_destroy);
#undef LANGUAGE_ATTR
#undef STRING_ATTR
#undef INT_ATTR
#undef FONT_ATTR
#undef FLOAT_ATTR
#undef RGBA_ATTR
}
typedef struct
{
GMarkupParseContext *parser;
char *markup;
gsize pos;
gsize len;
GtkTextBuffer *buffer;
GtkTextIter iter;
GtkTextMark *mark;
PangoAttrList *attributes;
char *text;
PangoAttrIterator *attr;
} MarkupData;
static void
free_markup_data (MarkupData *mdata)
{
g_free (mdata->markup);
g_clear_pointer (&mdata->parser, g_markup_parse_context_free);
gtk_text_buffer_delete_mark (mdata->buffer, mdata->mark);
g_clear_pointer (&mdata->attr, pango_attr_iterator_destroy);
g_clear_pointer (&mdata->attributes, pango_attr_list_unref);
g_free (mdata->text);
g_object_unref (mdata->buffer);
g_free (mdata);
}
static gboolean
insert_markup_idle (gpointer data)
{
MarkupData *mdata = data;
gint64 begin;
begin = g_get_monotonic_time ();
do
{
int start, end;
int start_offset;
GtkTextIter start_iter;
if (g_get_monotonic_time () - begin > G_TIME_SPAN_MILLISECOND)
{
g_idle_add (insert_markup_idle, data);
return G_SOURCE_REMOVE;
}
pango_attr_iterator_range (mdata->attr, &start, &end);
if (end == G_MAXINT) /* last chunk */
end = start - 1; /* resulting in -1 to be passed to _insert */
start_offset = gtk_text_iter_get_offset (&mdata->iter);
gtk_text_buffer_insert (mdata->buffer, &mdata->iter, mdata->text + start, end - start);
gtk_text_buffer_get_iter_at_offset (mdata->buffer, &start_iter, start_offset);
insert_tags_for_attributes (mdata->buffer, mdata->attr, &start_iter, &mdata->iter);
gtk_text_buffer_get_iter_at_mark (mdata->buffer, &mdata->iter, mdata->mark);
}
while (pango_attr_iterator_next (mdata->attr));
free_markup_data (mdata);
return G_SOURCE_REMOVE;
}
static gboolean
parse_markup_idle (gpointer data)
{
MarkupData *mdata = data;
gint64 begin;
GError *error = NULL;
begin = g_get_monotonic_time ();
do {
if (g_get_monotonic_time () - begin > G_TIME_SPAN_MILLISECOND)
{
g_idle_add (parse_markup_idle, data);
return G_SOURCE_REMOVE;
}
if (!g_markup_parse_context_parse (mdata->parser,
mdata->markup + mdata->pos,
MIN (4096, mdata->len - mdata->pos),
&error))
{
g_warning ("Invalid markup string: %s", error->message);
g_error_free (error);
free_markup_data (mdata);
return G_SOURCE_REMOVE;
}
mdata->pos += 4096;
} while (mdata->pos < mdata->len);
if (!pango_markup_parser_finish (mdata->parser,
&mdata->attributes,
&mdata->text,
NULL,
&error))
{
g_warning ("Invalid markup string: %s", error->message);
g_error_free (error);
free_markup_data (mdata);
return G_SOURCE_REMOVE;
}
if (!mdata->attributes)
{
gtk_text_buffer_insert (mdata->buffer, &mdata->iter, mdata->text, -1);
free_markup_data (mdata);
return G_SOURCE_REMOVE;
}
mdata->attr = pango_attr_list_get_iterator (mdata->attributes);
insert_markup_idle (data);
return G_SOURCE_REMOVE;
}
/* Takes a ref on @buffer while it is operating,
* and consumes @markup.
*/
static void
insert_markup (GtkTextBuffer *buffer,
GtkTextIter *iter,
char *markup,
int len)
{
MarkupData *data;
g_return_if_fail (GTK_IS_TEXT_BUFFER (buffer));
data = g_new0 (MarkupData, 1);
data->buffer = g_object_ref (buffer);
data->iter = *iter;
data->markup = markup;
data->len = len;
data->parser = pango_markup_parser_new (0);
data->pos = 0;
/* create mark with right gravity */
data->mark = gtk_text_buffer_create_mark (buffer, NULL, iter, FALSE);
parse_markup_idle (data);
}
static void
fontify_finish (GObject *source,
GAsyncResult *result,
gpointer data)
{
GSubprocess *subprocess = G_SUBPROCESS (source);
GtkTextBuffer *buffer = data;
GBytes *stdout_buf = NULL;
GBytes *stderr_buf = NULL;
GError *error = NULL;
if (!g_subprocess_communicate_finish (subprocess,
result,
&stdout_buf,
&stderr_buf,
&error))
{
g_clear_pointer (&stdout_buf, g_bytes_unref);
g_clear_pointer (&stderr_buf, g_bytes_unref);
g_warning ("%s", error->message);
g_clear_error (&error);
g_object_unref (subprocess);
g_object_unref (buffer);
return;
}
if (g_subprocess_get_exit_status (subprocess) != 0)
{
if (stderr_buf)
g_warning ("%s", (char *)g_bytes_get_data (stderr_buf, NULL));
g_clear_pointer (&stderr_buf, g_bytes_unref);
}
g_object_unref (subprocess);
g_clear_pointer (&stderr_buf, g_bytes_unref);
if (stdout_buf)
{
char *markup;
gsize len;
char *p;
GtkTextIter start;
gtk_text_buffer_set_text (buffer, "", 0);
/* highlight puts a span with font and size around its output,
* which we don't want.
*/
markup = g_bytes_unref_to_data (stdout_buf, &len);
for (p = markup + strlen ("<span "); *p != '>'; p++) *p = ' ';
gtk_text_buffer_get_start_iter (buffer, &start);
insert_markup (buffer, &start, markup, len);
}
g_object_unref (buffer);
}
void
fontify (const char *format,
GtkTextBuffer *source_buffer)
{
GSubprocess *subprocess;
char *format_arg;
GtkSettings *settings;
char *theme;
gboolean prefer_dark;
const char *style_arg;
const char *text;
GtkTextIter start, end;
GBytes *bytes;
GError *error = NULL;
settings = gtk_settings_get_default ();
g_object_get (settings,
"gtk-theme-name", &theme,
"gtk-application-prefer-dark-theme", &prefer_dark,
NULL);
if (prefer_dark || strcmp (theme, "HighContrastInverse") == 0)
style_arg = "--style=edit-vim-dark";
else
style_arg = "--style=edit-kwrite";
g_free (theme);
format_arg = g_strconcat ("--syntax=", format, NULL);
subprocess = g_subprocess_new (G_SUBPROCESS_FLAGS_STDIN_PIPE |
G_SUBPROCESS_FLAGS_STDOUT_PIPE |
G_SUBPROCESS_FLAGS_STDERR_PIPE,
&error,
"highlight",
format_arg,
"--out-format=pango",
style_arg,
NULL);
g_free (format_arg);
if (!subprocess)
{
if (g_error_matches (error, G_SPAWN_ERROR, G_SPAWN_ERROR_NOENT))
{
static gboolean warned = FALSE;
if (!warned)
{
warned = TRUE;
g_message ("For syntax highlighting, install the “highlight” program");
}
}
else
g_warning ("%s", error->message);
g_clear_error (&error);
return;
}
gtk_text_buffer_get_bounds (source_buffer, &start, &end);
text = gtk_text_buffer_get_text (source_buffer, &start, &end, TRUE);
bytes = g_bytes_new_static (text, strlen (text));
#ifdef HAVE_GIO_UNIX
/* Work around https://gitlab.gnome.org/GNOME/glib/-/issues/2182 */
if (G_IS_UNIX_OUTPUT_STREAM (g_subprocess_get_stdin_pipe (subprocess)))
{
GOutputStream *stdin_pipe = g_subprocess_get_stdin_pipe (subprocess);
int fd = g_unix_output_stream_get_fd (G_UNIX_OUTPUT_STREAM (stdin_pipe));
fcntl (fd, F_SETFL, O_NONBLOCK);
}
#endif
g_subprocess_communicate_async (subprocess,
bytes,
NULL,
fontify_finish,
g_object_ref (source_buffer));
}

View File

@@ -1,6 +0,0 @@
#pragma once
#include <gtk/gtk.h>
void fontify (const char *format,
GtkTextBuffer *buffer);

View File

@@ -36,11 +36,11 @@ adjustment_get_normalized_value (GtkAdjustment *adj)
static void static void
val_to_xy (GtkFontPlane *plane, val_to_xy (GtkFontPlane *plane,
int *x, gint *x,
int *y) gint *y)
{ {
double u, v; gdouble u, v;
int width, height; gint width, height;
width = gtk_widget_get_allocated_width (GTK_WIDGET (plane)); width = gtk_widget_get_allocated_width (GTK_WIDGET (plane));
height = gtk_widget_get_allocated_height (GTK_WIDGET (plane)); height = gtk_widget_get_allocated_height (GTK_WIDGET (plane));
@@ -57,8 +57,8 @@ plane_snapshot (GtkWidget *widget,
GtkSnapshot *snapshot) GtkSnapshot *snapshot)
{ {
GtkFontPlane *plane = GTK_FONT_PLANE (widget); GtkFontPlane *plane = GTK_FONT_PLANE (widget);
int x, y; gint x, y;
int width, height; gint width, height;
cairo_t *cr; cairo_t *cr;
val_to_xy (plane, &x, &y); val_to_xy (plane, &x, &y);
@@ -125,11 +125,11 @@ adjustment_set_normalized_value (GtkAdjustment *adj,
static void static void
update_value (GtkFontPlane *plane, update_value (GtkFontPlane *plane,
int x, gint x,
int y) gint y)
{ {
GtkWidget *widget = GTK_WIDGET (plane); GtkWidget *widget = GTK_WIDGET (plane);
double u, v; gdouble u, v;
u = CLAMP (x * (1.0 / gtk_widget_get_allocated_width (widget)), 0, 1); u = CLAMP (x * (1.0 / gtk_widget_get_allocated_width (widget)), 0, 1);
v = CLAMP (1 - y * (1.0 / gtk_widget_get_allocated_height (widget)), 0, 1); v = CLAMP (1 - y * (1.0 / gtk_widget_get_allocated_height (widget)), 0, 1);
@@ -142,8 +142,8 @@ update_value (GtkFontPlane *plane,
static void static void
plane_drag_gesture_begin (GtkGestureDrag *gesture, plane_drag_gesture_begin (GtkGestureDrag *gesture,
double start_x, gdouble start_x,
double start_y, gdouble start_y,
GtkFontPlane *plane) GtkFontPlane *plane)
{ {
guint button; guint button;
@@ -164,11 +164,11 @@ plane_drag_gesture_begin (GtkGestureDrag *gesture,
static void static void
plane_drag_gesture_update (GtkGestureDrag *gesture, plane_drag_gesture_update (GtkGestureDrag *gesture,
double offset_x, gdouble offset_x,
double offset_y, gdouble offset_y,
GtkFontPlane *plane) GtkFontPlane *plane)
{ {
double start_x, start_y; gdouble start_x, start_y;
gtk_gesture_drag_get_start_point (GTK_GESTURE_DRAG (gesture), gtk_gesture_drag_get_start_point (GTK_GESTURE_DRAG (gesture),
&start_x, &start_y); &start_x, &start_y);
@@ -177,8 +177,8 @@ plane_drag_gesture_update (GtkGestureDrag *gesture,
static void static void
plane_drag_gesture_end (GtkGestureDrag *gesture, plane_drag_gesture_end (GtkGestureDrag *gesture,
double offset_x, gdouble offset_x,
double offset_y, gdouble offset_y,
GtkFontPlane *plane) GtkFontPlane *plane)
{ {
set_cross_cursor (GTK_WIDGET (plane), FALSE); set_cross_cursor (GTK_WIDGET (plane), FALSE);

View File

@@ -19,7 +19,13 @@ static GtkWidget *show_extents = NULL;
static PangoContext *context; static PangoContext *context;
static int scale = 9; static int scale = 10;
static void
on_destroy (gpointer data)
{
window = NULL;
}
static void static void
update_image (void) update_image (void)
@@ -59,7 +65,7 @@ update_image (void)
hintstyle = CAIRO_HINT_STYLE_DEFAULT; hintstyle = CAIRO_HINT_STYLE_DEFAULT;
cairo_font_options_set_hint_style (fopt, hintstyle); cairo_font_options_set_hint_style (fopt, hintstyle);
if (gtk_check_button_get_active (GTK_CHECK_BUTTON (hint_metrics))) if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (hint_metrics)))
hintmetrics = CAIRO_HINT_METRICS_ON; hintmetrics = CAIRO_HINT_METRICS_ON;
else else
hintmetrics = CAIRO_HINT_METRICS_OFF; hintmetrics = CAIRO_HINT_METRICS_OFF;
@@ -107,7 +113,7 @@ update_image (void)
cr = cairo_create (surface); cr = cairo_create (surface);
cairo_set_line_width (cr, 1); cairo_set_line_width (cr, 1);
if (gtk_check_button_get_active (GTK_CHECK_BUTTON (show_grid))) if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (show_grid)))
{ {
int i; int i;
cairo_set_source_rgba (cr, 0.2, 0, 0, 0.2); cairo_set_source_rgba (cr, 0.2, 0, 0, 0.2);
@@ -125,7 +131,7 @@ update_image (void)
} }
} }
if (gtk_check_button_get_active (GTK_CHECK_BUTTON (show_extents))) if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (show_extents)))
{ {
cairo_set_source_rgba (cr, 0, 0, 1, 1); cairo_set_source_rgba (cr, 0, 0, 1, 1);
@@ -245,7 +251,9 @@ do_fontrendering (GtkWidget *do_widget)
window = GTK_WIDGET (gtk_builder_get_object (builder, "window")); window = GTK_WIDGET (gtk_builder_get_object (builder, "window"));
gtk_window_set_display (GTK_WINDOW (window), gtk_window_set_display (GTK_WINDOW (window),
gtk_widget_get_display (do_widget)); gtk_widget_get_display (do_widget));
g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window); g_signal_connect (window, "destroy",
G_CALLBACK (on_destroy), NULL);
g_object_set_data_full (G_OBJECT (window), "builder", builder, g_object_unref);
font_button = GTK_WIDGET (gtk_builder_get_object (builder, "font_button")); font_button = GTK_WIDGET (gtk_builder_get_object (builder, "font_button"));
up_button = GTK_WIDGET (gtk_builder_get_object (builder, "up_button")); up_button = GTK_WIDGET (gtk_builder_get_object (builder, "up_button"));
down_button = GTK_WIDGET (gtk_builder_get_object (builder, "down_button")); down_button = GTK_WIDGET (gtk_builder_get_object (builder, "down_button"));
@@ -268,14 +276,12 @@ do_fontrendering (GtkWidget *do_widget)
g_signal_connect (show_extents, "notify::active", G_CALLBACK (update_image), NULL); g_signal_connect (show_extents, "notify::active", G_CALLBACK (update_image), NULL);
update_image (); update_image ();
g_object_unref (builder);
} }
if (!gtk_widget_get_visible (window)) if (!gtk_widget_get_visible (window))
gtk_widget_show (window); gtk_widget_show (window);
else else
gtk_window_destroy (GTK_WINDOW (window)); gtk_widget_destroy (window);
return window; return window;
} }

View File

@@ -6,11 +6,164 @@
<property name="page-increment">4</property> <property name="page-increment">4</property>
</object> </object>
<object class="GtkWindow" id="window"> <object class="GtkWindow" id="window">
<property name="default-width">1080</property> <property name="default-width">600</property>
<property name="default-height">430</property> <property name="default-height">300</property>
<child type="titlebar"> <property name="title">Font rendering</property>
<object class="GtkHeaderBar"> <child>
<child type="title"> <object class="GtkGrid">
<property name="margin-top">10</property>
<property name="row-spacing">10</property>
<property name="column-spacing">10</property>
<child>
<object class="GtkLabel">
<property name="margin-start">10</property>
<property name="label">Text</property>
<property name="xalign">1</property>
<style>
<class name="dim-label"/>
</style>
</object>
</child>
<child>
<object class="GtkEntry" id="entry">
<property name="text">Fonts render</property>
<layout>
<property name="left-attach">1</property>
</layout>
</object>
</child>
<child>
<object class="GtkLabel">
<property name="margin-start">10</property>
<property name="label">Font</property>
<property name="xalign">1</property>
<style>
<class name="dim-label"/>
</style>
<layout>
<property name="left-attach">0</property>
<property name="top-attach">1</property>
</layout>
</object>
</child>
<child>
<object class="GtkFontButton" id="font_button">
<layout>
<property name="left-attach">1</property>
<property name="top-attach">1</property>
</layout>
</object>
</child>
<child>
<object class="GtkLabel">
<property name="label">Hinting</property>
<property name="xalign">1</property>
<style>
<class name="dim-label"/>
</style>
<layout>
<property name="left-attach">2</property>
</layout>
</object>
</child>
<child>
<object class="GtkComboBoxText" id="hinting">
<property name="active">0</property>
<property name="valign">center</property>
<items>
<item translatable="yes" id="none">None</item>
<item translatable="yes" id="slight">Slight</item>
<item translatable="yes" id="medium">Medium</item>
<item translatable="yes" id="full">Full</item>
</items>
<layout>
<property name="left-attach">3</property>
</layout>
</object>
</child>
<child>
<object class="GtkCheckButton" id="hint_metrics">
<child>
<object class="GtkLabel">
<property name="label">Hint Metrics</property>
<style>
<class name="dim-label"/>
</style>
</object>
</child>
<layout>
<property name="left-attach">3</property>
<property name="top-attach">1</property>
</layout>
</object>
</child>
<child>
<object class="GtkCheckButton" id="show_extents">
<property name="active">1</property>
<child>
<object class="GtkLabel">
<property name="label">Show Extents</property>
<style>
<class name="dim-label"/>
</style>
</object>
</child>
<layout>
<property name="left-attach">4</property>
<property name="top-attach">0</property>
</layout>
</object>
</child>
<child>
<object class="GtkCheckButton" id="show_grid">
<property name="active">1</property>
<child>
<object class="GtkLabel">
<property name="label">Show Grid</property>
<style>
<class name="dim-label"/>
</style>
</object>
</child>
<layout>
<property name="left-attach">4</property>
<property name="top-attach">1</property>
</layout>
</object>
</child>
<child>
<object class="GtkButton" id="up_button">
<property name="icon-name">list-add-symbolic</property>
<style>
<class name="circular"/>
</style>
<layout>
<property name="left-attach">5</property>
<property name="top-attach">0</property>
</layout>
</object>
</child>
<child>
<object class="GtkButton" id="down_button">
<property name="icon-name">list-remove-symbolic</property>
<style>
<class name="circular"/>
</style>
<layout>
<property name="left-attach">5</property>
<property name="top-attach">1</property>
</layout>
</object>
</child>
<child>
<object class="GtkLabel">
<property name="hexpand">1</property>
<layout>
<property name="left-attach">6</property>
</layout>
</object>
</child>
<child>
<object class="GtkBox"> <object class="GtkBox">
<property name="halign">center</property> <property name="halign">center</property>
<property name="valign">center</property> <property name="valign">center</property>
@@ -18,170 +171,29 @@
<class name="linked"/> <class name="linked"/>
</style> </style>
<child> <child>
<object class="GtkToggleButton" id="text_radio"> <object class="GtkRadioButton" id="text_radio">
<property name="draw-indicator">0</property>
<property name="label">Text</property> <property name="label">Text</property>
<property name="active">1</property>
</object> </object>
</child> </child>
<child> <child>
<object class="GtkToggleButton" id="grid_radio"> <object class="GtkRadioButton" id="grid_radio">
<property name="draw-indicator">0</property>
<property name="label">Grid</property> <property name="label">Grid</property>
<property name="group">text_radio</property> <property name="group">text_radio</property>
</object> </object>
</child> </child>
<layout>
<property name="left-attach">0</property>
<property name="top-attach">3</property>
<property name="column-span">7</property>
</layout>
</object> </object>
</child> </child>
</object>
</child>
<child>
<object class="GtkBox">
<property name="orientation">vertical</property>
<child>
<object class="GtkGrid">
<property name="halign">center</property>
<property name="margin-top">10</property>
<property name="margin-bottom">10</property>
<property name="row-spacing">10</property>
<property name="column-spacing">10</property>
<child>
<object class="GtkLabel">
<property name="margin-start">10</property>
<property name="label">Text</property>
<property name="xalign">1</property>
<style>
<class name="dim-label"/>
</style>
<layout>
<property name="column">1</property>
</layout>
</object>
</child>
<child>
<object class="GtkEntry" id="entry">
<property name="text">Fonts render</property>
<layout>
<property name="column">2</property>
</layout>
</object>
</child>
<child>
<object class="GtkLabel">
<property name="margin-start">10</property>
<property name="label">Font</property>
<property name="xalign">1</property>
<style>
<class name="dim-label"/>
</style>
<layout>
<property name="column">1</property>
<property name="row">1</property>
</layout>
</object>
</child>
<child>
<object class="GtkFontButton" id="font_button">
<layout>
<property name="column">2</property>
<property name="row">1</property>
</layout>
</object>
</child>
<child>
<object class="GtkLabel">
<property name="label">Hinting</property>
<property name="xalign">1</property>
<style>
<class name="dim-label"/>
</style>
<layout>
<property name="column">3</property>
</layout>
</object>
</child>
<child>
<object class="GtkComboBoxText" id="hinting">
<property name="active">0</property>
<property name="valign">center</property>
<items>
<item translatable="yes" id="none">None</item>
<item translatable="yes" id="slight">Slight</item>
<item translatable="yes" id="medium">Medium</item>
<item translatable="yes" id="full">Full</item>
</items>
<layout>
<property name="column">4</property>
</layout>
</object>
</child>
<child>
<object class="GtkCheckButton" id="hint_metrics">
<property name="label">Hint Metrics</property>
<layout>
<property name="column">4</property>
<property name="row">1</property>
</layout>
</object>
</child>
<child>
<object class="GtkCheckButton" id="show_extents">
<property name="label">Show Extents</property>
<property name="active">1</property>
<layout>
<property name="column">5</property>
<property name="row">0</property>
</layout>
</object>
</child>
<child>
<object class="GtkCheckButton" id="show_grid">
<property name="active">1</property>
<property name="label">Show Grid</property>
<layout>
<property name="column">5</property>
<property name="row">1</property>
</layout>
</object>
</child>
<child>
<object class="GtkButton" id="up_button">
<property name="icon-name">list-add-symbolic</property>
<style>
<class name="circular"/>
</style>
<layout>
<property name="column">6</property>
<property name="row">0</property>
</layout>
</object>
</child>
<child>
<object class="GtkButton" id="down_button">
<property name="icon-name">list-remove-symbolic</property>
<style>
<class name="circular"/>
</style>
<layout>
<property name="column">6</property>
<property name="row">1</property>
</layout>
</object>
</child>
<child>
<object class="GtkLabel">
<property name="hexpand">1</property>
<layout>
<property name="column">7</property>
</layout>
</object>
</child>
</object>
</child>
<child>
<object class="GtkSeparator"/>
</child>
<child> <child>
<object class="GtkScrolledWindow"> <object class="GtkScrolledWindow">
<property name="propagate-natural-height">1</property> <property name="propagate-natural-height">1</property>
<property name="has-frame">1</property>
<property name="hexpand">1</property> <property name="hexpand">1</property>
<property name="vexpand">1</property> <property name="vexpand">1</property>
<child> <child>
@@ -191,6 +203,11 @@
<property name="can-shrink">0</property> <property name="can-shrink">0</property>
</object> </object>
</child> </child>
<layout>
<property name="left-attach">0</property>
<property name="top-attach">4</property>
<property name="column-span">7</property>
</layout>
</object> </object>
</child> </child>
</object> </object>

View File

@@ -1,94 +0,0 @@
#include "four_point_transform.h"
#include "singular_value_decomposition.h"
/* Make a 4x4 matrix that maps
* e1 -> p1
* e2 -> p3
* e3 -> p3
* (1,1,1,0) -> p4
*/
static void
unit_to (graphene_point3d_t *p1,
graphene_point3d_t *p2,
graphene_point3d_t *p3,
graphene_point3d_t *p4,
graphene_matrix_t *m)
{
graphene_vec3_t v1, v2, v3, v4;
graphene_vec4_t vv1, vv2, vv3, vv4, p;
graphene_matrix_t u, s;
float v[16] = { 0., };
double A[16];
double U[16];
double S[4];
double V[16];
double B[4];
double x[4];
int i, j;
graphene_point3d_to_vec3 (p1, &v1);
graphene_point3d_to_vec3 (p2, &v2);
graphene_point3d_to_vec3 (p3, &v3);
graphene_point3d_to_vec3 (p4, &v4);
graphene_vec4_init_from_vec3 (&vv1, &v1, 1.);
graphene_vec4_init_from_vec3 (&vv2, &v2, 1.);
graphene_vec4_init_from_vec3 (&vv3, &v3, 1.);
graphene_vec4_init_from_vec3 (&vv4, &v4, 1.);
graphene_vec4_init (&p, 0., 0., 0., 1.);
graphene_matrix_init_from_vec4 (&u, &vv1, &vv2, &vv3, &p);
/* solve x * u = vv4 */
for (i = 0; i < 4; i++)
for (j = 0; j < 4; j++)
A[j * 4 + i] = graphene_matrix_get_value (&u, i, j);
B[0] = graphene_vec4_get_x (&vv4);
B[1] = graphene_vec4_get_y (&vv4);
B[2] = graphene_vec4_get_z (&vv4);
B[3] = graphene_vec4_get_w (&vv4);
singular_value_decomposition (A, 4, 4, U, S, V);
singular_value_decomposition_solve (U, S, V, 4, 4, B, x);
v[ 0] = x[0];
v[ 5] = x[1];
v[10] = x[2];
v[15] = 1;
graphene_matrix_init_from_float (&s, (const float *)&v);
graphene_matrix_multiply (&s, &u, m);
}
/* Compute a 4x4 matrix m that maps
* p1 -> q1
* p2 -> q2
* p3 -> q3
* p4 -> q4
*
* This is not in general possible, because projective
* transforms preserve coplanarity. But in the cases we
* care about here, both sets of points are always coplanar.
*/
void
perspective_3d (graphene_point3d_t *p1,
graphene_point3d_t *p2,
graphene_point3d_t *p3,
graphene_point3d_t *p4,
graphene_point3d_t *q1,
graphene_point3d_t *q2,
graphene_point3d_t *q3,
graphene_point3d_t *q4,
graphene_matrix_t *m)
{
graphene_matrix_t a, a_inv, b;
unit_to (p1, p2, p3, p4, &a);
unit_to (q1, q2, q3, q4, &b);
graphene_matrix_inverse (&a, &a_inv);
graphene_matrix_multiply (&a_inv, &b, m);
}

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