Compare commits

..

1 Commits

Author SHA1 Message Date
Florian Müllner
9622733140 window: Handle broken icon themes more gracefully
We assert that the icons used as default window icons are loaded correctly,
but currently this can fail simply because of an incomplete icon theme. After
all, "image-missing" was only added to the icon-naming spec in 2005 🙄

Handle this case more gracefully by falling back to a completely
transparent "icon".

https://bugzilla.gnome.org/show_bug.cgi?id=720583
https://gitlab.gnome.org/GNOME/mutter/merge_requests/462
2019-02-27 22:46:19 +01:00
1250 changed files with 133158 additions and 77830 deletions

View File

@@ -1,15 +1,12 @@
image: registry.gitlab.gnome.org/gnome/mutter/master:v4 image: registry.gitlab.gnome.org/gnome/mutter/master:v1
stages: stages:
- review - review
- build - build
- test - test
- coverage
check-commit-log: check-commit-log:
stage: review stage: review
variables:
GIT_DEPTH: "100"
script: script:
- ./.gitlab-ci/check-commit-log.sh - ./.gitlab-ci/check-commit-log.sh
only: only:
@@ -18,7 +15,7 @@ check-commit-log:
build-mutter: build-mutter:
stage: build stage: build
script: script:
- meson . build -Dbuildtype=debugoptimized -Db_coverage=true -Degl_device=true -Dwayland_eglstream=true --werror --prefix /usr - meson . build -Dbuildtype=debugoptimized -Degl_device=true -Dwayland_eglstream=true --werror
- ninja -C build - ninja -C build
- ninja -C build install - ninja -C build install
artifacts: artifacts:
@@ -29,32 +26,6 @@ build-mutter:
- merge_requests - merge_requests
- /^.*$/ - /^.*$/
build-without-opengl-and-glx:
stage: build
script:
- meson . build -Dbuildtype=debugoptimized -Dopengl=false -Dglx=false -Degl_device=true -Dwayland_eglstream=true --werror --prefix /usr
- ninja -C build
- ninja -C build install
artifacts:
paths:
- build/meson-logs
only:
- merge_requests
- /^.*$/
build-without-native-backend-and-wayland:
stage: build
script:
- meson . build -Dbuildtype=debugoptimized -Dnative_backend=false -Dudev=false -Dwayland=false -Dcore_tests=false --werror --prefix /usr
- ninja -C build
- ninja -C build install
artifacts:
paths:
- build/meson-logs
only:
- merge_requests
- /^.*$/
test-mutter: test-mutter:
stage: test stage: test
dependencies: dependencies:
@@ -62,50 +33,12 @@ test-mutter:
variables: variables:
XDG_RUNTIME_DIR: "$CI_PROJECT_DIR/runtime-dir" XDG_RUNTIME_DIR: "$CI_PROJECT_DIR/runtime-dir"
GSETTINGS_SCHEMA_DIR: "$CI_PROJECT_DIR/build/data" GSETTINGS_SCHEMA_DIR: "$CI_PROJECT_DIR/build/data"
G_SLICE: "always-malloc"
MALLOC_CHECK_: "3"
NO_AT_BRIDGE: "1"
script: script:
- dconf update
- mkdir -m 700 $XDG_RUNTIME_DIR - mkdir -m 700 $XDG_RUNTIME_DIR
- glib-compile-schemas $GSETTINGS_SCHEMA_DIR - glib-compile-schemas $GSETTINGS_SCHEMA_DIR
- > - >
dbus-run-session -- xvfb-run -s '+iglx -noreset' dbus-run-session -- xvfb-run -s '+iglx -noreset'
meson test -C build --no-rebuild -t 10 --verbose --no-stdsplit --print-errorlogs --wrap catchsegv meson test -C build --no-rebuild -t 10 --verbose --no-stdsplit --wrap catchsegv
artifacts:
expire_in: 1 day
paths:
- build
only:
- merge_requests
- /^.*$/
test-mutter-coverage:
stage: coverage
dependencies:
- test-mutter
script:
- ninja -C build coverage
- cat build/meson-logs/coverage.txt
artifacts:
paths:
- build/meson-logs
when: manual
except:
refs:
- tags
- master
can-build-gnome-shell:
stage: test
dependencies:
- build-mutter
before_script:
- meson install --no-rebuild -C build
script:
- .gitlab-ci/checkout-gnome-shell.sh
- meson gnome-shell gnome-shell/build --prefix /usr -Dman=false
- ninja -C gnome-shell/build install
only: only:
- merge_requests - merge_requests
- /^.*$/ - /^.*$/

View File

@@ -1,27 +1,17 @@
# Rebuild and push with FROM fedora:29
#
# cd .gitlab-ci/
# podman build --format docker --no-cache -t registry.gitlab.gnome.org/gnome/mutter/master:v4 .
# podman push registry.gitlab.gnome.org/gnome/mutter/master:v4
#
FROM fedora:32
RUN dnf -y update && dnf -y upgrade && \ RUN dnf -y update && dnf -y upgrade && \
dnf install -y 'dnf-command(builddep)' && \ dnf install -y 'dnf-command(builddep)' && \
dnf install -y 'dnf-command(copr)' && \ dnf builddep -y mutter && \
dnf copr enable -y jadahl/mutter-ci && \
dnf builddep -y mutter --setopt=install_weak_deps=False && \ # Until Fedora catches up with meson build-deps
dnf install -y meson xorg-x11-server-Xorg gnome-settings-daemon-devel egl-wayland-devel xorg-x11-server-Xwayland && \
# For running unit tests # For running unit tests
dnf install -y xorg-x11-server-Xvfb mesa-dri-drivers dbus dbus-x11 \ dnf install -y xorg-x11-server-Xvfb mesa-dri-drivers dbus dbus-x11 && \
'*/xvfb-run' gdm-lib accountsservice-libs gnome-control-center gcovr \
--setopt=install_weak_deps=False && \
# GNOME Shell # Unpackaged versions
dnf builddep -y gnome-shell --setopt=install_weak_deps=False && \ dnf install -y https://copr-be.cloud.fedoraproject.org/results/jadahl/mutter-ci/fedora-29-x86_64/00848426-gsettings-desktop-schemas/gsettings-desktop-schemas-3.30.1-1.20181206git918efdd69be53.fc29.x86_64.rpm https://copr-be.cloud.fedoraproject.org/results/jadahl/mutter-ci/fedora-29-x86_64/00848426-gsettings-desktop-schemas/gsettings-desktop-schemas-devel-3.30.1-1.20181206git918efdd69be53.fc29.x86_64.rpm && \
dnf remove -y gnome-bluetooth-libs-devel && \
dnf remove -y --noautoremove mutter mutter-devel && \
dnf install -y intltool redhat-rpm-config make && \
dnf clean all dnf clean all

View File

@@ -19,42 +19,13 @@ fi
function commit_message_has_url() { function commit_message_has_url() {
commit=$1 commit=$1
commit_message=$(git show -s --format='format:%b' $commit) commit_message=$(git show -s --format='format:%b' $commit)
echo "$commit_message" | grep -qe "\($CI_MERGE_REQUEST_PROJECT_URL/\(-/\)\?\(issues\|merge_requests\)/[0-9]\+\|https://bugzilla.gnome.org/show_bug.cgi?id=[0-9]\+\)" echo "$commit_message" | grep -qe "\($CI_MERGE_REQUEST_PROJECT_URL/\(issues\|merge_requests\)/[0-9]\+\|https://bugzilla.gnome.org/show_bug.cgi?id=[0-9]\+\)"
return $? return $?
} }
function commit_message_subject_is_compliant() {
commit=$1
commit_message_subject=$(git show -s --format='format:%s' $commit)
if echo "$commit_message_subject" | grep -qe "\(^meta-\|^Meta\)"; then
echo " - message subject should not be prefixed with 'meta-' or 'Meta'"
return 1
fi
if echo "$commit_message_subject" | grep -qe "\.[ch]:"; then
echo " - message subject prefix should not include .c, .h, etc."
return 1
fi
return 0
}
RET=0
for commit in $commits; do for commit in $commits; do
commit_short=$(echo $commit | cut -c -8)
if ! commit_message_has_url $commit; then if ! commit_message_has_url $commit; then
echo "Commit $commit_short needs a merge request or issue URL" echo "Missing merge request or issue URL on commit $(echo $commit | cut -c -8)"
exit 1 exit 1
fi fi
errors=$(commit_message_subject_is_compliant $commit)
if [ $? != 0 ]; then
echo "Commit message for $commit_short is not compliant:"
echo "$errors"
RET=1
fi
done done
exit $RET

View File

@@ -1,33 +0,0 @@
#!/usr/bin/bash
gnome_shell_target=
git clone https://gitlab.gnome.org/GNOME/gnome-shell.git
if [ $? -ne 0 ]; then
echo Checkout failed
exit 1
fi
cd gnome-shell
if [ "$CI_MERGE_REQUEST_TARGET_BRANCH_NAME" ]; then
merge_request_remote=${CI_MERGE_REQUEST_SOURCE_PROJECT_URL//mutter/gnome-shell}
merge_request_branch=$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME
echo Looking for $merge_request_branch on remote ...
if git fetch -q $merge_request_remote $merge_request_branch 2>/dev/null; then
gnome_shell_target=FETCH_HEAD
else
gnome_shell_target=origin/$CI_MERGE_REQUEST_TARGET_BRANCH_NAME
echo Using $gnome_shell_target instead
fi
fi
if [ -z "$gnome_shell_target" ]; then
gnome_shell_target=$(git branch -r -l origin/$CI_COMMIT_REF_NAME)
gnome_shell_target=${gnome_shell_target:-origin/master}
echo Using $gnome_shell_target instead
fi
git checkout -q $gnome_shell_target

View File

@@ -1,55 +0,0 @@
<!--
Please read https://wiki.gnome.org/Community/GettingInTouch/BugReportingGuidelines
first to ensure that you create a clear and specific issue.
-->
### Affected version
<!--
Provide at least the following information:
* Your OS and version
* Affected Mutter version
* Does this issue appear in XOrg and/or Wayland
-->
### Bug summary
<!--
Provide a short summary of the bug you encountered.
-->
### Steps to reproduce
<!--
1. Step one
2. Step two
3. ...
-->
### What happened
<!--
What did Mutter do that was unexpected?
-->
### What did you expect to happen
<!--
What did you expect Mutter to do?
-->
### Relevant logs, screenshots, screencasts etc.
<!--
If you have further information, such as technical documentation, logs,
screenshots or screencasts related, please provide them here.
If the bug is a crash, please obtain a stack trace with installed debug
symbols (at least for GNOME Shell and Mutter) and attach it to
this issue following the instructions on
https://wiki.gnome.org/Community/GettingInTouch/Bugzilla/GettingTraces.
-->
<!-- Do not remove the following line. -->
/label ~"1. Bug"

View File

@@ -1,30 +0,0 @@
<!--
Please read https://wiki.gnome.org/Community/GettingInTouch/BugReportingGuidelines
first to ensure that you create a clear and specific issue.
-->
### Feature summary
<!--
Describe what you would like to be able to do with Mutter
that you currently cannot do.
-->
### How would you like it to work
<!--
If you can think of a way Mutter might be able to do this,
let us know here.
-->
### Relevant links, screenshots, screencasts etc.
<!--
If you have further information, such as technical documentation,
code, mockups or a similar feature in another window managers,
please provide them here.
-->
<!-- Do not remove the following line. -->
/label ~"1. Feature"

526
NEWS
View File

@@ -1,529 +1,3 @@
3.37.2
======
* Fix move-to-center keybinding with multiple monitors [Sergey; #1073]
* Fix stuck buttons when a virtual device is destroyed [Carlos; !1239]
* Use workarea when centering new windows [Akatsuki; #964]
* Limit mipmap levels when rendering background [Daniel; !1003]
* Broadcast clipboard/primary offers [Carlos; !1253]
* Support primary-selection protocol from wayland-protocols [Carlos; !1255]
* Fix monitor screen cast on X11 [Jonas Å.; !1251]
* Support a "blank" cursor type [Florian; !1244]
* Improve stage view damage tracking [Jonas Å.; !1237]
* Implement touch-mode detecation for the X11 backend [Carlos; !1278]
* Drop external keyboard detection from touch-mode heuristics [Carlos; !1277]
* Optimize actor allocations [Jonas D.; !1247]
* Fixed crashes [Daniel, Carlos, Jonas Å., Jonas D.; !1256, !1258, !1217, !1280]
* Misc. bug fixes and cleanups [Christian, Jonas D., Olivier, Ting-Wei,
Jonas Å., Marco, Corentin, Daniel, Robert, Niels, Florian, Simon; !1231,
!1228, !1238, !1229, !1192, !1236, !1171, !1134, #1126, !1234, !1230, !1210,
!1242, !1243, !1252, !1113, !1232, !1259, !1245, !1265, !1180, !1261, !788,
!1264, !1235, !1218, !1150, !1274, !1271, !1279, !1283, !1272]
Contributors:
Marco Trevisan (Treviño), Akatsuki, Jonas Dreßler, Olivier Fourdan,
Carlos Garnacho, Niels De Graef, Ting-Wei Lan, Robert Mader, Simon McVittie,
Florian Müllner, Corentin Noël, Christian Rauch, Daniel van Vugt,
Sergey Zigachev, Jonas Ådahl
3.37.1
======
* Fix screencasting non-maximized windows [Jonas Å.; !1174]
* Make window-aliveness checks less aggressive [Jonas Å.; !1182]
* Fix stylus coordinates when using screen rotation [Jonas T.; #1118]
* Preserve keyboard state on VT switch [Olivier; !1185]
* Remove Clutter's drag and drop actions [Jonas D.; !789]
* Cancel clicks/gestures actions on disable [Georges; !1188]
* Fix various clipboard issues [Carlos; !1186, !1198, !1203, !1204, !1206]
* Fix trackball button scrolling [Phillip; #1120]
* Fix tiled monitor support [Jonas; !1199]
* Support unredirecting fullscreen wayland surfaces [Jonas Å.; !798]
* Support area screencasts [Jonas Å.; !1207]
* Synchronize shadows to server-side decorations [Olivier; !1214]
* Allow inhibiting remote access [Jonas Å.; !1212]
* Fix overview key on X11 when using multiple keyboard layouts [Olivier; !1219]
* Fixed crashes [Jonas, D., Carlos; !1173, !1183, !1012]
* Misc. bug fixes and cleanups [Andre, Georges, Christian, Jonas Å., Andre,
Simon, Florian, Carlos, Adam, Marco, Thomas, Elias, Pekka, Jonas D.,
Laurent; !1169, !1168, !1166, !1170, !1167, !1172, !1175, !1176, !1184,
!1126, !1187, !1191, !1195, !1179, !1200, !1193, !1209, !1213, !1208,
#1074, !1223]
Contributors:
Marco Trevisan (Treviño), Elias Aebi, Thomas Hindoe Paaboel Andersen,
Laurent Bigonville, Jonas Dreßler, Olivier Fourdan, Carlos Garnacho,
Adam Jackson, Andre Moreira Magalhaes, Simon McVittie, Florian Müllner,
Georges Basile Stavracas Neto, Pekka Paalanen, Christian Rauch, Jonas Troeger,
Phillip Wood, Jonas Ådahl
Translators:
Dušan Kazik [sk], Christian Kirbach [de]
3.36.0
======
* Fix placement of popup windows in multi-monitor setups [Jonas; !1110]
* Fix invisible mouse cursor on some hardware [Jonas; !1079]
Contributors:
Jonas Ådahl
Translators:
Aurimas Černius [lt], Goran Vidović [hr], Anders Jonsson [sv],
Guillaume Bernard [fr], Milo Casagrande [it], Daniel Korostil [uk],
Andre Klapper [cy], Aman Alam [pa], Nathan Follens [nl]
3.35.92
=======
* Fix visibility of initially hidden windows [Jonas Å.; !1066]
* Avoid flicker when (un)redirecting windows [Sebastian; #997]
* Let BindConstraints update the preferred size [Emmanuele; !1070]
* Learn about GLES3 [Adam; !882]
* Ping windows on every window focus [Jonas D.; !891]
* Remove overhead from hot code paths [Christian;
#1056, !1081, !1083, !1071, !1087]
* Allow remote desktop services to inhibit animations [Jonas Å.; !838]
* Update screen-cast code to PipeWire 0.3 API [Wim; !1062]
* Make check-alive timeouts configurable [Jonas Å.; !1080]
* Make each stage view correspond to a single CRTC [Jonas Å.; !1042]
* Implement scaled/transformed hardware cursors [Robert; !526]
* Use DMA buffers for screencasting if possible [Georges; !1086]
* Make Xwayland startup asynchronous [Carlos; !944]
* Fix clipping glitches in long text entries [Jonas D.; !1096]
* Add side channel for starting required X11 services [Carlos; !945]
* Support synchronized wayland popup moving [Jonas Å.; !705]
* Fixed crashes [Olivier, Jonas Å.; !1073, !1093]
* Plugged memory leaks [Sebastian, Jonas Å.; !1089, !1095]
* Misc. bug fixes and cleanups [Jonas Å, Olivier, Florian, Daniel, Jonas D.,
Robert, Sebastian, Christian, Arun, Carlos, worldofpeace; !1061, #1043,
!1067, !1068, !1065, !835, !1058, !1069, !1075, #1060, !1077, !423, !1090,
!1088, !1094, #1067, !1064, !1099, !957, !1000, !1082]
Contributors:
Emmanuele Bassi, Jonas Dreßler, Olivier Fourdan, Carlos Garnacho,
Christian Hergert, Adam Jackson, Sebastian Keller, Robert Mader,
Florian Müllner, Georges Basile Stavracas Neto, Arun Raghavan, Wim Taymans,
Daniel van Vugt, worldofpeace, Jonas Ådahl
Translators:
Yi-Jyun Pan [zh_TW], Asier Sarasua Garmendia [eu], Rafael Fontenelle [pt_BR],
Emin Tufan Çetin [tr], Daniel Mustieles [es], Balázs Úr [hu],
Gwan-gyeong Mun [ko], Marek Černocký [cs], Fran Dieguez [gl],
Kukuh Syafaat [id], Alan Mortensen [da], Piotr Drąg [pl], sicklylife [ja],
Matej Urbančič [sl]
3.35.91
=======
* Honor accelerometer orientation on monitor config changes [Hans; !959]
* Enable culling for integer-scaled actors [Robert; !1036]
* Add ClutterSeat::touch-mode property [Carlos; !1044]
* Fix mis-scaling when streaming windows [Olivier; !1022]
* Make the cursor renderer use the transactional KMS API [Jonas; !930]
* Advertise MetaMonitor as wl_output [Olivier; !994]
* Fix culling of XWayland windows [Robert; !1049]
* Only consider enabled effects when disabling culling [Robert; !1052]
* Misc. bug fixes and cleanups [Olivier, Sergio, Adam, Carlos, Björn; !1040,
#985, !1024, !1039, !1051]
Contributors:
Sergio Costas, Björn Daase, Olivier Fourdan, Carlos Garnacho, Hans de Goede,
Adam Jackson, Robert Mader, Jonas Ådahl
Translators:
sicklylife [ja]
3.35.90
=======
* Cull out clip region [Robert; !985]
* Always enable tap-to-click/drag on opaque Wacom tablets [Carlos; !968]
* Fix visual glitches with offscreen effects applied [Georges; !992]
* Fix "sticky corner" in multi-head setups [Jonas D.; #774]
* Fix black shadows around XWayland windows during resizes [Ray, Olivier; #858]
* Zero-copy path for GPU-less secondary GPUs [Pekka; !810]
* Cancel DND on Esc [Carlos; #1020]
* Sync XWayland window shadows to frame during resizes [Olivier; !1009]
* Add support for per-monitor workareas [Alberts; !370]
* Ensure newly mapped wayland windows receive ENTER event [Olivier; !1026]
* Add ClutterSeat object [Carlos; !852]
* Honour CLUTTER_ACTOR_NO_LAYOUT flag more efficiently [Daniel; !575]
* Fix interoperation with wl_data_device_manager v1 [Carlos; #965]
* Favor text over images in clipboard manager [Carlos; #919]
* Apply monitor scale after background texture creation [Daniel; !1004]
* Plugged memory leaks [Sebastian, Adam; !991, #1000, !1011, !1020, !1030,
!1001, !1033]
* Fixed crashes [Jonas Å., Florian, Olivier; !961, #1029, !1037]
* Misc. bug fixes and cleanups [Björn, Jonas Å., Adam, Sebastian, Jonas D.,
Daniel, Carlos, Corentin, Sebastian, Robert, Daniel; #385, !998, !1007, !995,
!1016, !1018, !1017, !1005, !1019, !1025, !1028, !1029, !1031, !1015, !1032,
!1034, #1025]
Contributors:
Björn Daase, Jonas Dreßler, Olivier Fourdan, Carlos Garnacho, Adam Jackson,
Sebastian Keller, Robert Mader, Alberts Muktupāvels, Florian Müllner,
Georges Basile Stavracas Neto, Corentin Noël, Pekka Paalanen, Ray Strode,
Daniel van Vugt, Jonas Ådahl
Translators:
sicklylife [ja], Umarzuki Bin Mochlis Moktar [ms]
3.35.3
======
* backends/native: Correct dy value in pinch gesture event [Yariv; !974]
* Upload clipping rectangles in parallel [Daniel; !969]
* More cogl API cleanups [Adam; !978, !977, !973]
* Fix window recording on HiDPI [Pascal; !976]
* Fix top-left pixel being insensitive to clicks [Sebastian; #893]
* Misc. bug fixes and cleanups [Daniel, Adam; !979, !980]
Contributors:
Yariv Barkan, Adam Jackson, Sebastian Keller, Pascal Nowack, Daniel van Vugt
Translators:
Fran Dieguez [gl], Dz Chen [zh_CN]
3.35.2
======
* Don't emit focus event after destruction [Marco; gnome-shell#1704, !860]
* Add a notion of pixel format planes [Niels; !858]
* Replace various Cogl/Clutter types with Graphene [Georges; !458]
* Improve CoglJournal [Georges, Jasper; !402]
* Split pick and paint [Georges; !865]
* Remove deprecated/unused cogl/clutter APIs [Adam; !866, !878, !879, !880,
!885, !900, !902, !904, !896, !913, !922, !883, !903, !921, !933, !819]
* Fix hang when opening not-responding dialog on Xorg [Carlos; !876]
* Allow changing Clutter debug flags at runtime [Georges; !862]
* Fix frozen grabs on Xorg after weeks of inactivity [Jonas; !886]
* Fix triggering popups from stylus devices o wayland [Carlos; #886]
* Fix fallback to GLES2 [Adam; #635]
* Fix buffer age checks on multiple monitors [Carlos; !906]
* Adjust to Sysprof API change [Christian; !908]
* Improve support for (X11) fullscreen games under wayland [Hans; !739]
* Support shadow framebuffers for offscreen rendering [Olivier; !877]
* Fix hang after interacting with desktop icons on X11 [Marco; !909]
* Don't double scale when getting absolute surface coordinates [Xiang; !915]
* Respect NET_WM_TRANSIENT_FOR for override-redirect windows [Marco; !920]
* Kill window effects on destroy [Robert; !924]
* Remove deprecated ClutterTexture [Jonas; !932]
* Use regions instead of bounding box for clipping and culling [Carlos; !867]
* Use partial damage for dma-buf and EGLImage buffers on wayland [Robert; #947]
* Do not stack transients underneath their always-on-top parent [Florian; #587]
* Add explicit paint/pick contexts [Jonas; !935]
* Fix KMS freeze after pageflip fallback [Pekka; !953]
* Fixed crashes [Robert, Carlos, Jonas, Marco, Hans, Tim; !856, !869, !912,
!895, !928, #591, !823, !960]
* Plugged memory leaks [Niels, Robert, Carlos, Marco; !847, !868, !873, #908]
* Misc. bug fixes and cleanups [Niels, Robert, Jonas, Marco, Carlos, Daniel,
Jan, Adam, Cosimo, Florian, Thomas, Georges, Hans, Corentin, Christian,
Benjamin; !853, !822, !451, !854, !816, !857, !859, !734, !844, !851, #876,
!874, !673, !692, !888, !889, !894, !901, !905, !872, !898, !911, !918, !863,
#878, !811, !893, !925, !926, !890, !931, !927, !934, !938, !940, !947, !941,
!929, !949, !952, !871, !955, !956, !958, !907, !965, !964, !966]
Contributors:
Marco Trevisan (Treviño), Jan Alexander Steffens (heftig),
Thomas Hindoe Paaboel Andersen, Benjamin Berg, Cosimo Cecchi, Tim Crawford,
Piotr Drąg, Xiang Fan, Olivier Fourdan, Carlos Garnacho, Hans de Goede,
Niels De Graef, Christian Hergert, Adam Jackson, Robert Mader,
Florian Müllner, Georges Basile Stavracas Neto, Bastien Nocera, Corentin Noël,
Pekka Paalanen, Jasper St. Pierre, Christian Rauch, Daniel van Vugt,
Jonas Ådahl
Translators:
Bruce Cowan [en_GB]
3.35.1
======
* Fix immediate screen blank after releaseing inhibitor [Tim; #573]
* Respond to frame callbacks regardless of damage [Jonas; !839]
* selection [Carlos; !842]
* Fix Night Light on wayland [Jonas; !840]
* Fix various copy+paste/DND regressions [Carlos; !848, #789, #842,
#793, #845, #854]
* Misc. bug fixes and cleanups [Daniel, Marco, Jonas, Georges;
!841, !764, !837, !846]
Contributors:
Marco Trevisan (Treviño), Carlos Garnacho, Tim Klocke,
Georges Basile Stavracas Neto, Daniel van Vugt, Jonas Ådahl
3.34.1
======
* Fix startup of X11 session services on wayland [Carlos; #771]
* Fix _NET_ACTIVE_WINDOW emission [Carlos; #751]
* Fix initial view perspective [Marco; !803]
* Fix screenshots and window animations when scaled [Robert; !758]
* Re-enable coredumps when capabilities are set [Jonas; !811]
* Fix scaling of DND surface actors [Robert; !780]
* Optimize blitting of untransformed offscreen stage views [Olivier; !809, !820]
* Fix freeze of pointer event delivery on X11 [Olivier; !821]
* Fix scaling of stylus input coordinates with HiDPI [Dorian; !830]
* Fix memory leak when using implicit animations [Jonas; !828]
* Fix numlock state for native backend [Carlos; #769]
* Fixed crashes [Marco, Olivier, Jonas Å.; !805, #823, !808, !825,
#844, !826, #779]
* Misc. bug fixes and cleanups [Jonas Å., Georges, Jonas D., Michal, Daniel,
Iain, Adam, Marco, Carlos, Ting-Wei, Hans, Robert; !787, !795, !791, !797,
!772, !775, !799, !778, !785, !782, !796, #819, !814, !769, !817, !783, !786,
!829, !774, #822]
Contributors:
Marco Trevisan (Treviño), Jonas Dreßler, Olivier Fourdan, Carlos Garnacho,
Hans de Goede, Adam Jackson, Ting-Wei Lan, Iain Lane, Michal Lazo,
Robert Mader, Georges Basile Stavracas Neto, Dorian Stoll, Daniel van Vugt,
Jonas Ådahl
Translators:
Milo Casagrande [it], Nathan Follens [nl], Matej Urbančič [sl],
Ask Hjorth Larsen [da], Alan Mortensen [da], Jordi Mas [ca]
3.34.0
======
* Fix xdg-output v3 support [Olivier; !771]
* Fix crash when changing decoration state [Jonas; !773]
* Add and remove connectors on hot-plug [Jonas; !743]
Contributors:
Olivier Fourdan, Jonas Ådahl
Translators:
Rafael Fontenelle [pt_BR], Gwan-gyeong Mun [ko], Christian Kirbach [de],
Claude Paroz [fr], Milo Casagrande [it], Emin Tufan Çetin [tr],
Ryuta Fujii [ja]
3.33.92
=======
* Turn MetaShapedTexture into a ClutterContent implementation [Georges; !409]
* Restore inhibit shortcut for overlay key [Olivier; #734]
* Misc. pointer a11y improvements [Jonas D., Olivier; !746, !747, !745, !761]
* Fix position of drag surfaces [Robert; !684]
* Implement subsurface.place_below() for parents [Robert; !664]
* Add meta_window_actor_get_image() [Jonas Å.; !752]
* Revert faulty optimization from !719 [Jonas Å.; #735]
* Add additional sysprof trace points [Jonas Å.; !757, !765]
* Remove GLX "threaded swap wait" used on Nvidia [Daniel; !602]
* Implement geometric picking [Daniel; !189]
* Fix lost keyboard focus after DND [Olivier; #747]
* Misc. bug fixes and cleanups [Florian, Carlos, Piotr, Hans, Georges, Robert,
Ray, Mart, Rémi; !740, !672, !749, !751, !753, !730, !755, !756, !750, !715,
#738944, !657, !768]
Contributors:
Jonas Ådahl, Rémi Bernon, Piotr Drąg, Jonas Dreßler, Olivier Fourdan,
Carlos Garnacho, Hans de Goede, Robert Mader, Florian Müllner,
Georges Basile Stavracas Neto, Mart Raudsepp, Ray Strode, Daniel van Vugt
Translators:
Piotr Drąg [pl], Марко Костић [sr], Rūdolfs Mazurs [lv], Matej Urbančič [sl],
Balázs Úr [hu], Fran Dieguez [gl], Jordi Mas [ca], Anders Jonsson [sv],
Trần Ngọc Quân [vi], Tim Sabsch [de], Fabio Tomat [fur], Goran Vidović [hr],
Marek Černocký [cs]
3.33.91
=======
* Fix primary selection copy and paste between X11 and wayland [Hans; #702]
* Improve monitor hotplug support [Hans; !713]
* Remove a source of frame skips [Daniel; !719]
* Fix windows being lowered after unmaximizing with double click [Olivier; #88]
* Remove Clutter API for global grabs [Jonas D.; !536]
* Improve processing of incompressible events [Daniel; !711]
* Add xdg-output v3 support [Olivier; !704]
* Misc. bug fixes and cleanups [Jonas Å., Marco, Carlos, Adam, Albert, Niels,
Olivier, Florian; !722, !385, !728, !726, !500, !731, !727, !700, !735, !738]
Contributors:
Jonas Ådahl, Albert Vaca Cintora, Jonas Dreßler, Olivier Fourdan,
Carlos Garnacho, Hans de Goede, Niels De Graef, Adam Jackson, Florian Müllner,
Marco Trevisan (Treviño), Daniel van Vugt
Translators:
Asier Sarasua Garmendia [eu], Kukuh Syafaat [id], Florentina Mușat [ro],
Aurimas Černius [lt], Daniel Mustieles [es]
3.33.90
=======
* Fix visibility of clones with hidden source [Florian; #683]
* Reduce freezes when opening some popup windows [Carlos; #556]
* Be more thorough when excluding obscured areas from painting [Carlos; !698]
* Make it possible to start Xwayland on demand [Carlos; !709]
* clutter: Expose layout_manager to transitions [Florian; !716]
* Misc. bug fixes and cleanups [Mark, Florian, Iain, Niels, Carlos, Ray; !671,
!691, !694, !696, !703, !707, !697, !710, !708, !714, #719, !721]
Contributors:
Mark Blakeney, Carlos Garnacho, Niels De Graef, Iain Lane, Florian Müllner,
Ray Strode
Translators:
Asier Sarasua Garmendia [eu], Rafael Fontenelle [pt_BR], Fabio Tomat [fur],
Florentina Mușat [ro]
3.33.4
======
* Discard page flip retries on hotplug [Jonas; !630]
* Add xdg-output v2 support [Olivier; #645]
* Restore DRM format fallbacks [Jonas; !662]
* Don't emit ::size-changed when only position changed [Daniel; !568]
* Expose workspace layout properties [Florian; !618]
* Don't use grab modifiers when shortcuts are inhibited [Olivier; #642]
* Fix stuttering due to unchanged power save mode notifications [Georges; !674]
* Add API to reorder workspaces [Adam; !670]
* Make picking a new focus window more reliable [Marco; !669]
* Defer actor allocation till shown [Carlos; !677]
* Try to use primary GPU for copy instead of glReadPixels [Pekka; !615]
* Unset pointer focus when the cursor is hidden [Jonas D.; !448]
* Fix modifier-drag on wayland subsurfaces [Robert; !604]
* Fix background corruption on Nvidia after resuming from suspend [Daniel; !600]
* Only grab the locate-pointer key when necessary [Olivier; !685, #647]
* Misc. bug fixes and cleanups [Florian, Jonas, Daniel, Robert, Olivier,
Georges, Marco, Carlos, Emmanuele; !648, !650, !647, !656, !658, !637,
!663, !660, !659, !665, !666, !668, !667, #667, !676, !678, #672, !680,
!683, !688, !689, !687]
Contributors:
Jonas Ådahl, Emmanuele Bassi, Adam Bieńkowski, Piotr Drąg, Jonas Dreßler,
Olivier Fourdan, Carlos Garnacho, Robert Mader, Florian Müllner,
Georges Basile Stavracas Neto, Pekka Paalanen, Marco Trevisan (Treviño),
Daniel van Vugt
Translators:
Fabio Tomat [fur], Kukuh Syafaat [id]
3.33.3
======
* Prepare for running Xwayland on demand [Carlos; !420]
* Fix text selection color rendering [Florian; #494]
* Fix black shadows when using fractional scaling [Robert; #609]
* Honor startup sequence workspace on wayland [Carlos; gnome-shell#674]
* Only emit 'grab-op-end` signal after dropping grabs [Marco; !596]
* Add a Sysprof-based profiler [Jonas, Georges; !197, !603]
* Relax "xwayland-allow-grabs" setting [Olivier; #597]
* Implement locate-pointer accessibility feature [Olivier; !453]
* Implement mouse accessibility [Olivier; !512]
* Consolidate frame throttling [Daniel, Georges; !363]
* Fix setting blank cursor under wayland [Jonas; #630]
* Pixel-align OpenGL cursors [Jonas; !610]
* Handle returning from fullscreen/maximization better [Jonas; !621]
* Improve screencast support on multi-monitor systems [Georges; !623]
* Fix running X11 applications with sudo under wayland [Hans; #643]
* Implement toggle-keys notification [Olivier; #637]
* Add initial KMS transactional support [Jonas; !525]
* Improve finding new focus window when the old one is closed [Marco; #308]
* Misc. bug fixes and cleanups [Jonas, Carlos, Marco, Florian, Pekka, Robert,
Douglas, Georges, Daniel, Emil, Niels, Hans, Olivier, Ting-Wei, Corentin;
!591, #398, !592, !581, !597, !598, !593, !497, #591, !545, gtk#1675, !601,
#568, !564, !605, !609, !115, !214, !611, !617, !616, !619, !624, !622, !627,
!628, !629, !632, !633, !631, !636, !639, !638, !634, !640, !529, !644, !590]
Contributors:
Jonas Ådahl, Piotr Drąg, Olivier Fourdan, Carlos Garnacho, Hans de Goede,
Niels De Graef, Ting-Wei Lan, Robert Mader, Florian Müllner,
Georges Basile Stavracas Neto, Corentin Noël, Pekka Paalanen, Douglas R. Reno,
Marco Trevisan (Treviño), Emil Velikov, Daniel van Vugt
Translators:
Balázs Úr [hu], Daniel Mustieles [es], Nathan Follens [nl], Goran Vidović [hr]
3.33.2
======
* Fix rendering lag on Xorg [Daniel; !520, !281]
* Misc. bug fixes and cleanups [Carlos, Marco, Jonas D., Florian, Niels,
Daniel, Benjamin, Jonas Å., Ignacio, Vasilis; #598, !576, !547, !578,
!583, !582, !469, !524, !119, !571, !584, !585, !586, #425]
Contributors:
Jonas Ådahl, Benjamin Berg, Jonas Dreßler, Carlos Garnacho, Niels De Graef,
Vasilis Liaskovitis, Florian Müllner, Ignacio Casal Quinteiro,
Marco Trevisan (Treviño), Daniel van Vugt
Translators:
Daniel Mustieles [es]
3.33.1
======
* Remove unused APIs and outdated driver support
[Adam; !481, !468, !489, !487, !546]
* Enable EGL_IMG_context_priority [Adam; !454]
* Disable mouse keys with Numlock on [Olivier; #530]
* Fix crash when restarting on X11 [Marco; #576]
* Implement clipboard manager [Carlos; !320]
* Fix spurious idle signals that prevent session unblank [Jonas Å.; !543]
* Fix mapping of touchscreens that don't report dimensions [Carlos; #581]
* Fix propagating fractional scaling factor [Robert; !537]
* Add experimental RT scheduling support [Carlos; !460]
* Misc. bug fixes and cleanups [Robert, Carlos, Olivier, Ray, Marco, Jonas D.,
Georges, Daniel V., Daniel M; !467, !504, !551, !552, #575, #556, !557, !442,
!562, !535, !548, #586, !567, !396, !422, !507]
Contributors:
Jonas Ådahl, Piotr Drąg, Jonas Dreßler, Olivier Fourdan, Carlos Garnacho,
Adam Jackson, Robert Mader, Daniel García Moreno, Florian Müllner,
Georges Basile Stavracas Neto, Ray Strode, Marco Trevisan (Treviño),
Daniel van Vugt
Translators:
Daniel Mustieles [es], Fabio Tomat [fur], Kukuh Syafaat [id]
3.32.1
======
* Fix fallback app menu on wayland [Florian; #493]
* Fix elogind support [Tom; !491]
* Fix startup notifications not timing out [Carlos; #501]
* Fix keyboard accessibility toggle from keys
[Olivier, Carlos; !501, #529, !531]
* Fix touchscreen input on rotated displays [Carlos; #514]
* Work around hangul text input bug [Carlos; #1365]
* Fix blurry wallpaper scaling [Daniel; !505]
* Fix placement of window menu when using fractional scaling [Jan; #527]
* Fix repaint issues of offscreen effects on secondary monitors [Daniel; !511]
* Fix windows not getting focus after launch [Daniel; #505]
* Properly advertise support for 'underscan' property [Jonas; !507]
* Improve power-saving handling [Jonas; !506]
* Fix moving windows by super+touch [Jonas D.; !495]
* Misc. bug fixes and cleanups [Benjamin, Florian, Adam, Marco, Pablo,
Erik, Jonas, Heiher, Pekka, Daniel, Olivier, Carlos; !478, !475, !480,
!482, #490, !488, #491, #480, !477, !496, !492, !485, !515, !519, !521,
!216, !538, #541, #523]
Contributors:
Jonas Ådahl, Pablo Barciela, Benjamin Berg, Tom Briden, Jonas Dreßler,
Olivier Fourdan, Carlos Garnacho, Jan Alexander Steffens (heftig), Heiher,
Adam Jackson, Erik Kurzinger, Florian Müllner, Pekka Paalanen,
Marco Trevisan (Treviño), Daniel van Vugt
Translators:
Khaled Hosny [ar], Goran Vidović [hr], Daniel Mustieles [es]
3.32.0
======
* Fix deadlock when cancelling a theme sound [Andrea; !474]
* Stop swizzling BGRA buffers (bye-bye inverted colors in screenshots
and animations) [Carlos; !486]
Contributors:
Andrea Azzarone, Carlos Garnacho, Robert Mader
3.31.92
=======
* Fix flicker of apps that use multiple SHM buffers [Jonas Å.; #199]
* Don't disable page flips after temporary failues [Jonas Å.; #460]
* Improve redraw performance [Carlos; !196]
* Add cursor-mode support to window screencasting [Jonas Å.; !413]
* Add back support for system-wide monitor configurations [Jonas Å.; !253]
* Add fractional scaling support [Marco, Jonas Å.; !3]
* Consider remapped keys when guessing keycode from keysym [Andrea; #443]
* Stop turning on-screen-keyboard off on focus changes [Carlos; !432]
* Fix crashes [Robert, Carlos, Jonas D., Florian; !447, #361, !426, #479]
* Misc. bug fixes and cleanups [Benjamin, Adam, Olivier, Niels, Piotr; !457,
!452, !459, !380, !361, !461, !464, !471, !473, !463]
Contributors:
Jonas Ådahl, Andrea Azzarone, Benjamin Berg, Piotr Drąg, Jonas Dreßler,
Olivier Fourdan, Carlos Garnacho, Niels De Graef, Adam Jackson, Robert Mader,
Florian Müllner, Marco Trevisan (Treviño)
Translators:
Milo Casagrande [it], Tim Sabsch [de], Trần Ngọc Quân [vi],
Gwan-gyeong Mun [ko], Марко Костић [sr], Daniel Mustieles [es],
Rūdolfs Mazurs [lv], Nathan Follens [nl]
3.31.91 3.31.91
======= =======
* Fix infinite loop in EDID matching [Marco; #459] * Fix infinite loop in EDID matching [Marco; #459]

View File

@@ -310,7 +310,11 @@ cally_actor_finalize (GObject *obj)
_cally_actor_clean_action_list (cally_actor); _cally_actor_clean_action_list (cally_actor);
g_clear_handle_id (&priv->action_idle_handler, g_source_remove); if (priv->action_idle_handler)
{
g_source_remove (priv->action_idle_handler);
priv->action_idle_handler = 0;
}
if (priv->action_queue) if (priv->action_queue)
{ {
@@ -600,11 +604,10 @@ cally_actor_real_remove_actor (ClutterActor *container,
g_return_val_if_fail (CLUTTER_IS_ACTOR (actor), 0); g_return_val_if_fail (CLUTTER_IS_ACTOR (actor), 0);
atk_parent = ATK_OBJECT (data); atk_parent = ATK_OBJECT (data);
atk_child = clutter_actor_get_accessible (actor);
if (clutter_actor_has_accessible (actor)) if (atk_child)
{ {
atk_child = clutter_actor_get_accessible (actor);
g_value_init (&values.old_value, G_TYPE_POINTER); g_value_init (&values.old_value, G_TYPE_POINTER);
g_value_set_pointer (&values.old_value, atk_parent); g_value_set_pointer (&values.old_value, atk_parent);
@@ -654,7 +657,7 @@ cally_actor_get_extents (AtkComponent *component,
ClutterActor *actor = NULL; ClutterActor *actor = NULL;
gint top_level_x, top_level_y; gint top_level_x, top_level_y;
gfloat f_width, f_height; gfloat f_width, f_height;
graphene_point3d_t verts[4]; ClutterVertex verts[4];
ClutterActor *stage = NULL; ClutterActor *stage = NULL;
g_return_if_fail (CALLY_IS_ACTOR (component)); g_return_if_fail (CALLY_IS_ACTOR (component));
@@ -734,7 +737,11 @@ cally_actor_grab_focus (AtkComponent *component)
* *
* This gets the top level origin, it is, the position of the stage in * This gets the top level origin, it is, the position of the stage in
* the global screen. You can see it as the absolute display position * the global screen. You can see it as the absolute display position
* of the stage. This is 0,0 for a compositor. * of the stage.
*
* FIXME: only the case with x11 is implemented, other backends are
* required
*
*/ */
void void
_cally_actor_get_top_level_origin (ClutterActor *actor, _cally_actor_get_top_level_origin (ClutterActor *actor,
@@ -742,11 +749,54 @@ _cally_actor_get_top_level_origin (ClutterActor *actor,
gint *yp) gint *yp)
{ {
/* default values */ /* default values */
gint x = 0;
gint y = 0;
#ifdef CLUTTER_WINDOWING_X11
if (clutter_check_windowing_backend (CLUTTER_WINDOWING_X11))
{
ClutterActor *stage = NULL;
Display *display = NULL;
Window root_window;
Window stage_window;
Window child;
gint return_val = 0;
stage = clutter_actor_get_stage (actor);
/* FIXME: what happens if you use another display with
clutter_backend_x11_set_display ?*/
display = clutter_x11_get_default_display ();
root_window = clutter_x11_get_root_window ();
stage_window = clutter_x11_get_stage_window (CLUTTER_STAGE (stage));
return_val = XTranslateCoordinates (display, stage_window, root_window,
0, 0, &x, &y,
&child);
if (!return_val)
g_warning ("[x11] We were not able to get proper absolute "
"position of the stage");
}
else
#endif
{
static gboolean yet_warned = FALSE;
if (!yet_warned)
{
yet_warned = TRUE;
g_warning ("The current Clutter backend does not support using "
"atk_component_get_extents() with ATK_XY_SCREEN.");
}
}
if (xp) if (xp)
*xp = 0; *xp = x;
if (yp) if (yp)
*yp = 0; *yp = y;
} }
/* AtkAction implementation */ /* AtkAction implementation */
@@ -994,8 +1044,10 @@ _cally_actor_clean_action_list (CallyActor *cally_actor)
if (priv->action_list) if (priv->action_list)
{ {
g_list_free_full (priv->action_list, g_list_foreach (priv->action_list,
(GDestroyNotify) _cally_actor_destroy_action_info); (GFunc) _cally_actor_destroy_action_info,
NULL);
g_list_free (priv->action_list);
priv->action_list = NULL; priv->action_list = NULL;
} }
} }

View File

@@ -75,8 +75,8 @@ struct _CallyRootPrivate
GSList *stage_list; GSList *stage_list;
/* signals id */ /* signals id */
gulong stage_added_id; guint stage_added_id;
gulong stage_removed_id; guint stage_removed_id;
}; };
G_DEFINE_TYPE_WITH_PRIVATE (CallyRoot, cally_root, ATK_TYPE_GOBJECT_ACCESSIBLE) G_DEFINE_TYPE_WITH_PRIVATE (CallyRoot, cally_root, ATK_TYPE_GOBJECT_ACCESSIBLE)
@@ -149,9 +149,11 @@ cally_root_finalize (GObject *object)
stage_manager = atk_gobject_accessible_get_object (ATK_GOBJECT_ACCESSIBLE (root)); stage_manager = atk_gobject_accessible_get_object (ATK_GOBJECT_ACCESSIBLE (root));
g_clear_signal_handler (&root->priv->stage_added_id, stage_manager); g_signal_handler_disconnect (stage_manager,
root->priv->stage_added_id);
g_clear_signal_handler (&root->priv->stage_removed_id, stage_manager); g_signal_handler_disconnect (stage_manager,
root->priv->stage_added_id);
G_OBJECT_CLASS (cally_root_parent_class)->finalize (object); G_OBJECT_CLASS (cally_root_parent_class)->finalize (object);
} }

View File

@@ -247,7 +247,11 @@ cally_text_finalize (GObject *obj)
/* g_object_unref (cally_text->priv->textutil); */ /* g_object_unref (cally_text->priv->textutil); */
/* cally_text->priv->textutil = NULL; */ /* cally_text->priv->textutil = NULL; */
g_clear_handle_id (&cally_text->priv->insert_idle_handler, g_source_remove); if (cally_text->priv->insert_idle_handler)
{
g_source_remove (cally_text->priv->insert_idle_handler);
cally_text->priv->insert_idle_handler = 0;
}
G_OBJECT_CLASS (cally_text_parent_class)->finalize (obj); G_OBJECT_CLASS (cally_text_parent_class)->finalize (obj);
} }
@@ -1434,7 +1438,7 @@ static void cally_text_get_character_extents (AtkText *text,
PangoLayout *layout; PangoLayout *layout;
PangoRectangle extents; PangoRectangle extents;
const gchar *text_value; const gchar *text_value;
graphene_point3d_t verts[4]; ClutterVertex verts[4];
actor = CALLY_GET_CLUTTER_ACTOR (text); actor = CALLY_GET_CLUTTER_ACTOR (text);
if (actor == NULL) /* State is defunct */ if (actor == NULL) /* State is defunct */
@@ -2290,7 +2294,7 @@ _cally_misc_get_index_at_point (ClutterText *clutter_text,
gint index, x_window, y_window, x_toplevel, y_toplevel; gint index, x_window, y_window, x_toplevel, y_toplevel;
gint x_temp, y_temp; gint x_temp, y_temp;
gboolean ret; gboolean ret;
graphene_point3d_t verts[4]; ClutterVertex verts[4];
PangoLayout *layout; PangoLayout *layout;
gint x_layout, y_layout; gint x_layout, y_layout;

View File

@@ -0,0 +1,98 @@
/* CALLY - The Clutter Accessibility Implementation Library
*
* Copyright (C) 2009 Igalia, S.L.
*
* Author: Alejandro Piñeiro Iglesias <apinheiro@igalia.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
/**
* SECTION:cally-texture
* @Title: CallyTexture
* @short_description: Implementation of the ATK interfaces for a #ClutterTexture
* @see_also: #ClutterTexture
*
* #CallyTexture implements the required ATK interfaces of #ClutterTexture
*
* In particular it sets a proper role for the texture.
*/
#include "clutter-build-config.h"
#define CLUTTER_DISABLE_DEPRECATION_WARNINGS
#include "cally-texture.h"
#include "cally-actor-private.h"
#include "deprecated/clutter-texture.h"
/* AtkObject */
static void cally_texture_real_initialize (AtkObject *obj,
gpointer data);
G_DEFINE_TYPE (CallyTexture, cally_texture, CALLY_TYPE_ACTOR)
static void
cally_texture_class_init (CallyTextureClass *klass)
{
/* GObjectClass *gobject_class = G_OBJECT_CLASS (klass); */
AtkObjectClass *class = ATK_OBJECT_CLASS (klass);
class->initialize = cally_texture_real_initialize;
}
static void
cally_texture_init (CallyTexture *texture)
{
/* nothing to do yet */
}
/**
* cally_texture_new:
* @actor: a #ClutterActor
*
* Creates a new #CallyTexture for the given @actor. @actor must be
* a #ClutterTexture.
*
* Return value: the newly created #AtkObject
*
* Since: 1.4
*/
AtkObject*
cally_texture_new (ClutterActor *actor)
{
GObject *object = NULL;
AtkObject *accessible = NULL;
g_return_val_if_fail (CLUTTER_IS_TEXTURE (actor), NULL);
object = g_object_new (CALLY_TYPE_TEXTURE, NULL);
accessible = ATK_OBJECT (object);
atk_object_initialize (accessible, actor);
return accessible;
}
static void
cally_texture_real_initialize (AtkObject *obj,
gpointer data)
{
ATK_OBJECT_CLASS (cally_texture_parent_class)->initialize (obj, data);
/* default role */
obj->role = ATK_ROLE_IMAGE;
}

View File

@@ -0,0 +1,84 @@
/* CALLY - The Clutter Accessibility Implementation Library
*
* Copyright (C) 2009 Igalia, S.L.
*
* Author: Alejandro Piñeiro Iglesias <apinheiro@igalia.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef __CALLY_TEXTURE_H__
#define __CALLY_TEXTURE_H__
#if !defined(__CALLY_H_INSIDE__) && !defined(CLUTTER_COMPILATION)
#error "Only <cally/cally.h> can be included directly."
#endif
#include <clutter/clutter.h>
#include <cally/cally-actor.h>
G_BEGIN_DECLS
#define CALLY_TYPE_TEXTURE (cally_texture_get_type ())
#define CALLY_TEXTURE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), CALLY_TYPE_TEXTURE, CallyTexture))
#define CALLY_TEXTURE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), CALLY_TYPE_TEXTURE, CallyTextureClass))
#define CALLY_IS_TEXTURE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CALLY_TYPE_TEXTURE))
#define CALLY_IS_TEXTURE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), CALLY_TYPE_TEXTURE))
#define CALLY_TEXTURE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), CALLY_TYPE_TEXTURE, CallyTextureClass))
typedef struct _CallyTexture CallyTexture;
typedef struct _CallyTextureClass CallyTextureClass;
typedef struct _CallyTexturePrivate CallyTexturePrivate;
/**
* CallyTexture:
*
* The <structname>CallyTexture</structname> structure contains only
* private data and should be accessed using the provided API
*
* Since: 1.4
*/
struct _CallyTexture
{
/*< private >*/
CallyActor parent;
CallyTexturePrivate *priv;
};
/**
* CallyTextureClass:
*
* The <structname>CallyTextureClass</structname> structure contains
* only private data
*
* Since: 1.4
*/
struct _CallyTextureClass
{
/*< private >*/
CallyActorClass parent_class;
/* padding for future expansion */
gpointer _padding_dummy[8];
};
CLUTTER_EXPORT
GType cally_texture_get_type (void) G_GNUC_CONST;
CLUTTER_EXPORT
AtkObject *cally_texture_new (ClutterActor *actor);
G_END_DECLS
#endif /* __CALLY_TEXTURE_H__ */

View File

@@ -39,6 +39,7 @@
#include "cally-group.h" #include "cally-group.h"
#include "cally-stage.h" #include "cally-stage.h"
#include "cally-text.h" #include "cally-text.h"
#include "cally-texture.h"
#include "cally-rectangle.h" #include "cally-rectangle.h"
#include "cally-clone.h" #include "cally-clone.h"
@@ -55,6 +56,7 @@ CALLY_ACCESSIBLE_FACTORY (CALLY_TYPE_ACTOR, cally_actor, cally_actor_new)
CALLY_ACCESSIBLE_FACTORY (CALLY_TYPE_GROUP, cally_group, cally_group_new) CALLY_ACCESSIBLE_FACTORY (CALLY_TYPE_GROUP, cally_group, cally_group_new)
CALLY_ACCESSIBLE_FACTORY (CALLY_TYPE_STAGE, cally_stage, cally_stage_new) CALLY_ACCESSIBLE_FACTORY (CALLY_TYPE_STAGE, cally_stage, cally_stage_new)
CALLY_ACCESSIBLE_FACTORY (CALLY_TYPE_TEXT, cally_text, cally_text_new) CALLY_ACCESSIBLE_FACTORY (CALLY_TYPE_TEXT, cally_text, cally_text_new)
CALLY_ACCESSIBLE_FACTORY (CALLY_TYPE_TEXTURE, cally_texture, cally_texture_new)
CALLY_ACCESSIBLE_FACTORY (CALLY_TYPE_RECTANGLE, cally_rectangle, cally_rectangle_new) CALLY_ACCESSIBLE_FACTORY (CALLY_TYPE_RECTANGLE, cally_rectangle, cally_rectangle_new)
CALLY_ACCESSIBLE_FACTORY (CALLY_TYPE_CLONE, cally_clone, cally_clone_new) CALLY_ACCESSIBLE_FACTORY (CALLY_TYPE_CLONE, cally_clone, cally_clone_new)
@@ -76,6 +78,7 @@ cally_accessibility_init (void)
CALLY_ACTOR_SET_FACTORY (CLUTTER_TYPE_GROUP, cally_group); CALLY_ACTOR_SET_FACTORY (CLUTTER_TYPE_GROUP, cally_group);
CALLY_ACTOR_SET_FACTORY (CLUTTER_TYPE_STAGE, cally_stage); CALLY_ACTOR_SET_FACTORY (CLUTTER_TYPE_STAGE, cally_stage);
CALLY_ACTOR_SET_FACTORY (CLUTTER_TYPE_TEXT, cally_text); CALLY_ACTOR_SET_FACTORY (CLUTTER_TYPE_TEXT, cally_text);
CALLY_ACTOR_SET_FACTORY (CLUTTER_TYPE_TEXTURE, cally_texture);
CALLY_ACTOR_SET_FACTORY (CLUTTER_TYPE_RECTANGLE, cally_rectangle); CALLY_ACTOR_SET_FACTORY (CLUTTER_TYPE_RECTANGLE, cally_rectangle);
CALLY_ACTOR_SET_FACTORY (CLUTTER_TYPE_CLONE, cally_clone); CALLY_ACTOR_SET_FACTORY (CLUTTER_TYPE_CLONE, cally_clone);

View File

@@ -32,6 +32,7 @@
#include "cally-root.h" #include "cally-root.h"
#include "cally-stage.h" #include "cally-stage.h"
#include "cally-text.h" #include "cally-text.h"
#include "cally-texture.h"
#include "cally-util.h" #include "cally-util.h"
#undef __CALLY_H_INSIDE__ #undef __CALLY_H_INSIDE__

View File

@@ -33,11 +33,28 @@
G_BEGIN_DECLS G_BEGIN_DECLS
#define CLUTTER_TYPE_ACTION (clutter_action_get_type ()) #define CLUTTER_TYPE_ACTION (clutter_action_get_type ())
#define CLUTTER_ACTION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), CLUTTER_TYPE_ACTION, ClutterAction))
#define CLUTTER_IS_ACTION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CLUTTER_TYPE_ACTION))
#define CLUTTER_ACTION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), CLUTTER_TYPE_ACTION, ClutterActionClass))
#define CLUTTER_IS_ACTION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), CLUTTER_TYPE_ACTION))
#define CLUTTER_ACTION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), CLUTTER_TYPE_ACTION, ClutterActionClass))
CLUTTER_EXPORT typedef struct _ClutterActionClass ClutterActionClass;
G_DECLARE_DERIVABLE_TYPE (ClutterAction, clutter_action,
CLUTTER, ACTION, ClutterActorMeta); /**
* ClutterAction:
*
* The #ClutterAction structure contains only private data and
* should be accessed using the provided API.
*
* Since: 1.4
*/
struct _ClutterAction
{
/*< private >*/
ClutterActorMeta parent_instance;
};
/** /**
* ClutterActionClass: * ClutterActionClass:
@@ -61,6 +78,9 @@ struct _ClutterActionClass
void (* _clutter_action8) (void); void (* _clutter_action8) (void);
}; };
CLUTTER_EXPORT
GType clutter_action_get_type (void) G_GNUC_CONST;
/* ClutterActor API */ /* ClutterActor API */
CLUTTER_EXPORT CLUTTER_EXPORT
void clutter_actor_add_action (ClutterActor *self, void clutter_actor_add_action (ClutterActor *self,

View File

@@ -340,7 +340,7 @@ clutter_actor_box_contains (const ClutterActorBox *box,
/** /**
* clutter_actor_box_from_vertices: * clutter_actor_box_from_vertices:
* @box: a #ClutterActorBox * @box: a #ClutterActorBox
* @verts: (array fixed-size=4): array of four #graphene_point3d_t * @verts: (array fixed-size=4): array of four #ClutterVertex
* *
* Calculates the bounding box represented by the four vertices; for details * Calculates the bounding box represented by the four vertices; for details
* of the vertex array see clutter_actor_get_abs_allocation_vertices(). * of the vertex array see clutter_actor_get_abs_allocation_vertices().
@@ -348,8 +348,8 @@ clutter_actor_box_contains (const ClutterActorBox *box,
* Since: 1.0 * Since: 1.0
*/ */
void void
clutter_actor_box_from_vertices (ClutterActorBox *box, clutter_actor_box_from_vertices (ClutterActorBox *box,
const graphene_point3d_t verts[]) const ClutterVertex verts[])
{ {
gfloat x_1, x_2, y_1, y_2; gfloat x_1, x_2, y_1, y_2;
@@ -594,27 +594,6 @@ _clutter_actor_box_enlarge_for_effects (ClutterActorBox *box)
box->y1 = box->y2 - height - 3; box->y1 = box->y2 - height - 3;
} }
/**
* clutter_actor_box_scale:
* @box: a #ClutterActorBox
* @scale: scale factor for resizing this box
*
* Rescale the @box by provided @scale factor.
*
* Since: 1.6
*/
void
clutter_actor_box_scale (ClutterActorBox *box,
gfloat scale)
{
g_return_if_fail (box != NULL);
box->x1 *= scale;
box->x2 *= scale;
box->y1 *= scale;
box->y2 *= scale;
}
G_DEFINE_BOXED_TYPE_WITH_CODE (ClutterActorBox, clutter_actor_box, G_DEFINE_BOXED_TYPE_WITH_CODE (ClutterActorBox, clutter_actor_box,
clutter_actor_box_copy, clutter_actor_box_copy,
clutter_actor_box_free, clutter_actor_box_free,

View File

@@ -51,7 +51,7 @@
struct _ClutterActorMetaPrivate struct _ClutterActorMetaPrivate
{ {
ClutterActor *actor; ClutterActor *actor;
gulong destroy_id; guint destroy_id;
gchar *name; gchar *name;
@@ -81,49 +81,28 @@ static void
on_actor_destroy (ClutterActor *actor, on_actor_destroy (ClutterActor *actor,
ClutterActorMeta *meta) ClutterActorMeta *meta)
{ {
ClutterActorMetaPrivate *priv = meta->priv->actor = NULL;
clutter_actor_meta_get_instance_private (meta);
priv->actor = NULL;
} }
static void static void
clutter_actor_meta_real_set_actor (ClutterActorMeta *meta, clutter_actor_meta_real_set_actor (ClutterActorMeta *meta,
ClutterActor *actor) ClutterActor *actor)
{ {
ClutterActorMetaPrivate *priv = if (meta->priv->actor == actor)
clutter_actor_meta_get_instance_private (meta);
g_warn_if_fail (!priv->actor ||
!CLUTTER_ACTOR_IN_PAINT (priv->actor));
g_warn_if_fail (!actor || !CLUTTER_ACTOR_IN_PAINT (actor));
if (priv->actor == actor)
return; return;
g_clear_signal_handler (&priv->destroy_id, priv->actor); if (meta->priv->destroy_id != 0)
{
g_signal_handler_disconnect (meta->priv->actor, meta->priv->destroy_id);
meta->priv->destroy_id = 0;
}
priv->actor = actor; meta->priv->actor = actor;
if (priv->actor != NULL) if (meta->priv->actor != NULL)
priv->destroy_id = g_signal_connect (priv->actor, "destroy", meta->priv->destroy_id = g_signal_connect (meta->priv->actor, "destroy",
G_CALLBACK (on_actor_destroy), G_CALLBACK (on_actor_destroy),
meta); meta);
}
static void
clutter_actor_meta_real_set_enabled (ClutterActorMeta *meta,
gboolean is_enabled)
{
ClutterActorMetaPrivate *priv =
clutter_actor_meta_get_instance_private (meta);
g_warn_if_fail (!priv->actor ||
!CLUTTER_ACTOR_IN_PAINT (priv->actor));
priv->is_enabled = is_enabled;
g_object_notify_by_pspec (G_OBJECT (meta), obj_props[PROP_ENABLED]);
} }
static void static void
@@ -156,21 +135,20 @@ clutter_actor_meta_get_property (GObject *gobject,
GValue *value, GValue *value,
GParamSpec *pspec) GParamSpec *pspec)
{ {
ClutterActorMetaPrivate *priv = ClutterActorMeta *meta = CLUTTER_ACTOR_META (gobject);
clutter_actor_meta_get_instance_private (CLUTTER_ACTOR_META (gobject));
switch (prop_id) switch (prop_id)
{ {
case PROP_ACTOR: case PROP_ACTOR:
g_value_set_object (value, priv->actor); g_value_set_object (value, meta->priv->actor);
break; break;
case PROP_NAME: case PROP_NAME:
g_value_set_string (value, priv->name); g_value_set_string (value, meta->priv->name);
break; break;
case PROP_ENABLED: case PROP_ENABLED:
g_value_set_boolean (value, priv->is_enabled); g_value_set_boolean (value, meta->priv->is_enabled);
break; break;
default: default:
@@ -182,11 +160,10 @@ clutter_actor_meta_get_property (GObject *gobject,
static void static void
clutter_actor_meta_finalize (GObject *gobject) clutter_actor_meta_finalize (GObject *gobject)
{ {
ClutterActorMetaPrivate *priv = ClutterActorMetaPrivate *priv = CLUTTER_ACTOR_META (gobject)->priv;
clutter_actor_meta_get_instance_private (CLUTTER_ACTOR_META (gobject));
if (priv->actor != NULL) if (priv->destroy_id != 0 && priv->actor != NULL)
g_clear_signal_handler (&priv->destroy_id, priv->actor); g_signal_handler_disconnect (priv->actor, priv->destroy_id);
g_free (priv->name); g_free (priv->name);
@@ -199,7 +176,6 @@ clutter_actor_meta_class_init (ClutterActorMetaClass *klass)
GObjectClass *gobject_class = G_OBJECT_CLASS (klass); GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
klass->set_actor = clutter_actor_meta_real_set_actor; klass->set_actor = clutter_actor_meta_real_set_actor;
klass->set_enabled = clutter_actor_meta_real_set_enabled;
/** /**
* ClutterActorMeta:actor: * ClutterActorMeta:actor:
@@ -254,11 +230,9 @@ clutter_actor_meta_class_init (ClutterActorMetaClass *klass)
void void
clutter_actor_meta_init (ClutterActorMeta *self) clutter_actor_meta_init (ClutterActorMeta *self)
{ {
ClutterActorMetaPrivate *priv = self->priv = clutter_actor_meta_get_instance_private (self);
clutter_actor_meta_get_instance_private (self); self->priv->is_enabled = TRUE;
self->priv->priority = CLUTTER_ACTOR_META_PRIORITY_DEFAULT;
priv->is_enabled = TRUE;
priv->priority = CLUTTER_ACTOR_META_PRIORITY_DEFAULT;
} }
/** /**
@@ -276,17 +250,13 @@ void
clutter_actor_meta_set_name (ClutterActorMeta *meta, clutter_actor_meta_set_name (ClutterActorMeta *meta,
const gchar *name) const gchar *name)
{ {
ClutterActorMetaPrivate *priv;
g_return_if_fail (CLUTTER_IS_ACTOR_META (meta)); g_return_if_fail (CLUTTER_IS_ACTOR_META (meta));
priv = clutter_actor_meta_get_instance_private (meta); if (g_strcmp0 (meta->priv->name, name) == 0)
if (g_strcmp0 (priv->name, name) == 0)
return; return;
g_free (priv->name); g_free (meta->priv->name);
priv->name = g_strdup (name); meta->priv->name = g_strdup (name);
g_object_notify_by_pspec (G_OBJECT (meta), obj_props[PROP_NAME]); g_object_notify_by_pspec (G_OBJECT (meta), obj_props[PROP_NAME]);
} }
@@ -307,13 +277,9 @@ clutter_actor_meta_set_name (ClutterActorMeta *meta,
const gchar * const gchar *
clutter_actor_meta_get_name (ClutterActorMeta *meta) clutter_actor_meta_get_name (ClutterActorMeta *meta)
{ {
ClutterActorMetaPrivate *priv;
g_return_val_if_fail (CLUTTER_IS_ACTOR_META (meta), NULL); g_return_val_if_fail (CLUTTER_IS_ACTOR_META (meta), NULL);
priv = clutter_actor_meta_get_instance_private (meta); return meta->priv->name;
return priv->name;
} }
/** /**
@@ -329,17 +295,16 @@ void
clutter_actor_meta_set_enabled (ClutterActorMeta *meta, clutter_actor_meta_set_enabled (ClutterActorMeta *meta,
gboolean is_enabled) gboolean is_enabled)
{ {
ClutterActorMetaPrivate *priv;
g_return_if_fail (CLUTTER_IS_ACTOR_META (meta)); g_return_if_fail (CLUTTER_IS_ACTOR_META (meta));
priv = clutter_actor_meta_get_instance_private (meta);
is_enabled = !!is_enabled; is_enabled = !!is_enabled;
if (priv->is_enabled == is_enabled) if (meta->priv->is_enabled == is_enabled)
return; return;
CLUTTER_ACTOR_META_GET_CLASS (meta)->set_enabled (meta, is_enabled); meta->priv->is_enabled = is_enabled;
g_object_notify_by_pspec (G_OBJECT (meta), obj_props[PROP_ENABLED]);
} }
/** /**
@@ -355,13 +320,9 @@ clutter_actor_meta_set_enabled (ClutterActorMeta *meta,
gboolean gboolean
clutter_actor_meta_get_enabled (ClutterActorMeta *meta) clutter_actor_meta_get_enabled (ClutterActorMeta *meta)
{ {
ClutterActorMetaPrivate *priv;
g_return_val_if_fail (CLUTTER_IS_ACTOR_META (meta), FALSE); g_return_val_if_fail (CLUTTER_IS_ACTOR_META (meta), FALSE);
priv = clutter_actor_meta_get_instance_private (meta); return meta->priv->is_enabled;
return priv->is_enabled;
} }
/* /*
@@ -397,54 +358,40 @@ _clutter_actor_meta_set_actor (ClutterActorMeta *meta,
ClutterActor * ClutterActor *
clutter_actor_meta_get_actor (ClutterActorMeta *meta) clutter_actor_meta_get_actor (ClutterActorMeta *meta)
{ {
ClutterActorMetaPrivate *priv;
g_return_val_if_fail (CLUTTER_IS_ACTOR_META (meta), NULL); g_return_val_if_fail (CLUTTER_IS_ACTOR_META (meta), NULL);
priv = clutter_actor_meta_get_instance_private (meta); return meta->priv->actor;
return priv->actor;
} }
void void
_clutter_actor_meta_set_priority (ClutterActorMeta *meta, _clutter_actor_meta_set_priority (ClutterActorMeta *meta,
gint priority) gint priority)
{ {
ClutterActorMetaPrivate *priv;
g_return_if_fail (CLUTTER_IS_ACTOR_META (meta)); g_return_if_fail (CLUTTER_IS_ACTOR_META (meta));
priv = clutter_actor_meta_get_instance_private (meta);
/* This property shouldn't be modified after the actor meta is in /* This property shouldn't be modified after the actor meta is in
use because ClutterMetaGroup doesn't resort the list when it use because ClutterMetaGroup doesn't resort the list when it
changes. If we made the priority public then we could either make changes. If we made the priority public then we could either make
the priority a construct-only property or listen for the priority a construct-only property or listen for
notifications on the property from the ClutterMetaGroup and notifications on the property from the ClutterMetaGroup and
resort. */ resort. */
g_return_if_fail (priv->actor == NULL); g_return_if_fail (meta->priv->actor == NULL);
priv->priority = priority; meta->priv->priority = priority;
} }
gint gint
_clutter_actor_meta_get_priority (ClutterActorMeta *meta) _clutter_actor_meta_get_priority (ClutterActorMeta *meta)
{ {
ClutterActorMetaPrivate *priv;
g_return_val_if_fail (CLUTTER_IS_ACTOR_META (meta), 0); g_return_val_if_fail (CLUTTER_IS_ACTOR_META (meta), 0);
priv = clutter_actor_meta_get_instance_private (meta); return meta->priv->priority;
return priv->priority;
} }
gboolean gboolean
_clutter_actor_meta_is_internal (ClutterActorMeta *meta) _clutter_actor_meta_is_internal (ClutterActorMeta *meta)
{ {
ClutterActorMetaPrivate *priv = gint priority = meta->priv->priority;
clutter_actor_meta_get_instance_private (meta);
gint priority = priv->priority;
return (priority <= CLUTTER_ACTOR_META_PRIORITY_INTERNAL_LOW || return (priority <= CLUTTER_ACTOR_META_PRIORITY_INTERNAL_LOW ||
priority >= CLUTTER_ACTOR_META_PRIORITY_INTERNAL_HIGH); priority >= CLUTTER_ACTOR_META_PRIORITY_INTERNAL_HIGH);
@@ -491,21 +438,19 @@ void
_clutter_meta_group_add_meta (ClutterMetaGroup *group, _clutter_meta_group_add_meta (ClutterMetaGroup *group,
ClutterActorMeta *meta) ClutterActorMeta *meta)
{ {
ClutterActorMetaPrivate *priv =
clutter_actor_meta_get_instance_private (meta);
GList *prev = NULL, *l; GList *prev = NULL, *l;
if (priv->actor != NULL) if (meta->priv->actor != NULL)
{ {
g_warning ("The meta of type '%s' with name '%s' is " g_warning ("The meta of type '%s' with name '%s' is "
"already attached to actor '%s'", "already attached to actor '%s'",
G_OBJECT_TYPE_NAME (meta), G_OBJECT_TYPE_NAME (meta),
priv->name != NULL meta->priv->name != NULL
? priv->name ? meta->priv->name
: "<unknown>", : "<unknown>",
clutter_actor_get_name (priv->actor) != NULL clutter_actor_get_name (meta->priv->actor) != NULL
? clutter_actor_get_name (priv->actor) ? clutter_actor_get_name (meta->priv->actor)
: G_OBJECT_TYPE_NAME (priv->actor)); : G_OBJECT_TYPE_NAME (meta->priv->actor));
return; return;
} }
@@ -541,16 +486,13 @@ void
_clutter_meta_group_remove_meta (ClutterMetaGroup *group, _clutter_meta_group_remove_meta (ClutterMetaGroup *group,
ClutterActorMeta *meta) ClutterActorMeta *meta)
{ {
ClutterActorMetaPrivate *priv = if (meta->priv->actor != group->actor)
clutter_actor_meta_get_instance_private (meta);
if (priv->actor != group->actor)
{ {
g_warning ("The meta of type '%s' with name '%s' is not " g_warning ("The meta of type '%s' with name '%s' is not "
"attached to the actor '%s'", "attached to the actor '%s'",
G_OBJECT_TYPE_NAME (meta), G_OBJECT_TYPE_NAME (meta),
priv->name != NULL meta->priv->name != NULL
? priv->name ? meta->priv->name
: "<unknown>", : "<unknown>",
clutter_actor_get_name (group->actor) != NULL clutter_actor_get_name (group->actor) != NULL
? clutter_actor_get_name (group->actor) ? clutter_actor_get_name (group->actor)
@@ -635,7 +577,8 @@ _clutter_meta_group_clear_metas (ClutterMetaGroup *group)
{ {
g_list_foreach (group->meta, (GFunc) _clutter_actor_meta_set_actor, NULL); g_list_foreach (group->meta, (GFunc) _clutter_actor_meta_set_actor, NULL);
g_list_free_full (group->meta, g_object_unref); g_list_foreach (group->meta, (GFunc) g_object_unref, NULL);
g_list_free (group->meta);
group->meta = NULL; group->meta = NULL;
} }
@@ -693,10 +636,8 @@ _clutter_meta_group_get_meta (ClutterMetaGroup *group,
for (l = group->meta; l != NULL; l = l->next) for (l = group->meta; l != NULL; l = l->next)
{ {
ClutterActorMeta *meta = l->data; ClutterActorMeta *meta = l->data;
ClutterActorMetaPrivate *priv =
clutter_actor_meta_get_instance_private (meta);
if (g_strcmp0 (priv->name, name) == 0) if (g_strcmp0 (meta->priv->name, name) == 0)
return meta; return meta;
} }
@@ -716,8 +657,6 @@ _clutter_meta_group_get_meta (ClutterMetaGroup *group,
const gchar * const gchar *
_clutter_actor_meta_get_debug_name (ClutterActorMeta *meta) _clutter_actor_meta_get_debug_name (ClutterActorMeta *meta)
{ {
ClutterActorMetaPrivate *priv = return meta->priv->name != NULL ? meta->priv->name
clutter_actor_meta_get_instance_private (meta); : G_OBJECT_TYPE_NAME (meta);
return priv->name != NULL ? priv->name : G_OBJECT_TYPE_NAME (meta);
} }

View File

@@ -33,13 +33,31 @@
G_BEGIN_DECLS G_BEGIN_DECLS
#define CLUTTER_TYPE_ACTOR_META (clutter_actor_meta_get_type ()) #define CLUTTER_TYPE_ACTOR_META (clutter_actor_meta_get_type ())
#define CLUTTER_ACTOR_META(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), CLUTTER_TYPE_ACTOR_META, ClutterActorMeta))
#define CLUTTER_IS_ACTOR_META(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CLUTTER_TYPE_ACTOR_META))
#define CLUTTER_ACTOR_META_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), CLUTTER_TYPE_ACTOR_META, ClutterActorMetaClass))
#define CLUTTER_IS_ACTOR_META_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), CLUTTER_TYPE_ACTOR_META))
#define CLUTTER_ACTOR_META_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), CLUTTER_TYPE_ACTOR_META, ClutterActorMetaClass))
CLUTTER_EXPORT typedef struct _ClutterActorMetaPrivate ClutterActorMetaPrivate;
G_DECLARE_DERIVABLE_TYPE (ClutterActorMeta, clutter_actor_meta, typedef struct _ClutterActorMetaClass ClutterActorMetaClass;
CLUTTER, ACTOR_META, GInitiallyUnowned);
typedef struct _ClutterActorMetaPrivate ClutterActorMetaPrivate; /**
* ClutterActorMeta:
*
* The #ClutterActorMeta structure contains only
* private data and should be accessed using the provided API
*
* Since: 1.4
*/
struct _ClutterActorMeta
{
/*< private >*/
GInitiallyUnowned parent_instance;
ClutterActorMetaPrivate *priv;
};
/** /**
* ClutterActorMetaClass: * ClutterActorMetaClass:
@@ -69,9 +87,6 @@ struct _ClutterActorMetaClass
void (* set_actor) (ClutterActorMeta *meta, void (* set_actor) (ClutterActorMeta *meta,
ClutterActor *actor); ClutterActor *actor);
void (* set_enabled) (ClutterActorMeta *meta,
gboolean is_enabled);
/*< private >*/ /*< private >*/
void (* _clutter_meta1) (void); void (* _clutter_meta1) (void);
void (* _clutter_meta2) (void); void (* _clutter_meta2) (void);
@@ -79,8 +94,12 @@ struct _ClutterActorMetaClass
void (* _clutter_meta4) (void); void (* _clutter_meta4) (void);
void (* _clutter_meta5) (void); void (* _clutter_meta5) (void);
void (* _clutter_meta6) (void); void (* _clutter_meta6) (void);
void (* _clutter_meta7) (void);
}; };
CLUTTER_EXPORT
GType clutter_actor_meta_get_type (void) G_GNUC_CONST;
CLUTTER_EXPORT CLUTTER_EXPORT
void clutter_actor_meta_set_name (ClutterActorMeta *meta, void clutter_actor_meta_set_name (ClutterActorMeta *meta,
const gchar *name); const gchar *name);

View File

@@ -53,8 +53,7 @@ typedef enum
* Controls some options for how clutter_actor_traverse() iterates * Controls some options for how clutter_actor_traverse() iterates
* through the graph. * through the graph.
*/ */
typedef enum typedef enum {
{
CLUTTER_ACTOR_TRAVERSE_DEPTH_FIRST = 1L<<0, CLUTTER_ACTOR_TRAVERSE_DEPTH_FIRST = 1L<<0,
CLUTTER_ACTOR_TRAVERSE_BREADTH_FIRST = 1L<<1 CLUTTER_ACTOR_TRAVERSE_BREADTH_FIRST = 1L<<1
} ClutterActorTraverseFlags; } ClutterActorTraverseFlags;
@@ -75,8 +74,7 @@ typedef enum
* the continuing traversal. It may stop traversal completely, just * the continuing traversal. It may stop traversal completely, just
* skip over children for the current actor or continue as normal. * skip over children for the current actor or continue as normal.
*/ */
typedef enum typedef enum {
{
CLUTTER_ACTOR_TRAVERSE_VISIT_CONTINUE = 1L<<0, CLUTTER_ACTOR_TRAVERSE_VISIT_CONTINUE = 1L<<0,
CLUTTER_ACTOR_TRAVERSE_VISIT_SKIP_CHILDREN = 1L<<1, CLUTTER_ACTOR_TRAVERSE_VISIT_SKIP_CHILDREN = 1L<<1,
CLUTTER_ACTOR_TRAVERSE_VISIT_BREAK = 1L<<2 CLUTTER_ACTOR_TRAVERSE_VISIT_BREAK = 1L<<2
@@ -135,7 +133,7 @@ struct _AnchorCoord
} fraction; } fraction;
/* Use when is_fractional == FALSE */ /* Use when is_fractional == FALSE */
graphene_point3d_t units; ClutterVertex units;
} v; } v;
}; };
@@ -163,7 +161,7 @@ struct _SizeRequest
struct _ClutterLayoutInfo struct _ClutterLayoutInfo
{ {
/* fixed position coordinates */ /* fixed position coordinates */
graphene_point_t fixed_pos; ClutterPoint fixed_pos;
ClutterMargin margin; ClutterMargin margin;
@@ -173,8 +171,8 @@ struct _ClutterLayoutInfo
guint x_expand : 1; guint x_expand : 1;
guint y_expand : 1; guint y_expand : 1;
graphene_size_t minimum; ClutterSize minimum;
graphene_size_t natural; ClutterSize natural;
}; };
const ClutterLayoutInfo * _clutter_actor_get_layout_info_or_defaults (ClutterActor *self); const ClutterLayoutInfo * _clutter_actor_get_layout_info_or_defaults (ClutterActor *self);
@@ -203,13 +201,13 @@ struct _ClutterTransformInfo
AnchorCoord anchor; AnchorCoord anchor;
/* translation */ /* translation */
graphene_point3d_t translation; ClutterVertex translation;
/* z_position */ /* z_position */
gfloat z_position; gfloat z_position;
/* transformation center */ /* transformation center */
graphene_point_t pivot; ClutterPoint pivot;
gfloat pivot_z; gfloat pivot_z;
CoglMatrix transform; CoglMatrix transform;
@@ -242,6 +240,9 @@ ClutterAnimationInfo * _clutter_actor_get_animation_info
ClutterTransition * _clutter_actor_create_transition (ClutterActor *self, ClutterTransition * _clutter_actor_create_transition (ClutterActor *self,
GParamSpec *pspec, GParamSpec *pspec,
...); ...);
ClutterTransition * _clutter_actor_get_transition (ClutterActor *self,
GParamSpec *pspec);
gboolean _clutter_actor_foreach_child (ClutterActor *self, gboolean _clutter_actor_foreach_child (ClutterActor *self,
ClutterForeachCallback callback, ClutterForeachCallback callback,
gpointer user_data); gpointer user_data);
@@ -274,9 +275,6 @@ void _clutter_actor_set_enable_paint_unmapped
void _clutter_actor_set_has_pointer (ClutterActor *self, void _clutter_actor_set_has_pointer (ClutterActor *self,
gboolean has_pointer); gboolean has_pointer);
void _clutter_actor_set_has_key_focus (ClutterActor *self,
gboolean has_key_focus);
void _clutter_actor_queue_redraw_with_clip (ClutterActor *self, void _clutter_actor_queue_redraw_with_clip (ClutterActor *self,
ClutterRedrawFlags flags, ClutterRedrawFlags flags,
const ClutterPaintVolume *clip_volume); const ClutterPaintVolume *clip_volume);
@@ -297,6 +295,8 @@ const gchar * _clutter_actor_get_debug_name
void _clutter_actor_push_clone_paint (void); void _clutter_actor_push_clone_paint (void);
void _clutter_actor_pop_clone_paint (void); void _clutter_actor_pop_clone_paint (void);
guint32 _clutter_actor_get_pick_id (ClutterActor *self);
void _clutter_actor_shader_pre_paint (ClutterActor *actor, void _clutter_actor_shader_pre_paint (ClutterActor *actor,
gboolean repeat); gboolean repeat);
void _clutter_actor_shader_post_paint (ClutterActor *actor); void _clutter_actor_shader_post_paint (ClutterActor *actor);
@@ -313,16 +313,12 @@ void _clutter_actor_detach_clone
void _clutter_actor_queue_redraw_on_clones (ClutterActor *actor); void _clutter_actor_queue_redraw_on_clones (ClutterActor *actor);
void _clutter_actor_queue_relayout_on_clones (ClutterActor *actor); void _clutter_actor_queue_relayout_on_clones (ClutterActor *actor);
void _clutter_actor_queue_only_relayout (ClutterActor *actor); void _clutter_actor_queue_only_relayout (ClutterActor *actor);
void clutter_actor_clear_stage_views_recursive (ClutterActor *actor);
gboolean _clutter_actor_get_real_resource_scale (ClutterActor *actor, CoglFramebuffer * _clutter_actor_get_active_framebuffer (ClutterActor *actor);
float *resource_scale);
ClutterPaintNode * clutter_actor_create_texture_paint_node (ClutterActor *self, ClutterPaintNode * clutter_actor_create_texture_paint_node (ClutterActor *self,
CoglTexture *texture); CoglTexture *texture);
void clutter_actor_update_stage_views (ClutterActor *self);
G_END_DECLS G_END_DECLS
#endif /* __CLUTTER_ACTOR_PRIVATE_H__ */ #endif /* __CLUTTER_ACTOR_PRIVATE_H__ */

File diff suppressed because it is too large Load Diff

View File

@@ -39,8 +39,6 @@
#include <clutter/clutter-types.h> #include <clutter/clutter-types.h>
#include <clutter/clutter-event.h> #include <clutter/clutter-event.h>
#include <clutter/clutter-paint-context.h>
#include <clutter/clutter-pick-context.h>
G_BEGIN_DECLS G_BEGIN_DECLS
@@ -175,12 +173,9 @@ struct _ClutterActor
* @get_preferred_height: virtual function, used when querying the minimum * @get_preferred_height: virtual function, used when querying the minimum
* and natural heights of an actor for a given width; it is used by * and natural heights of an actor for a given width; it is used by
* clutter_actor_get_preferred_height() * clutter_actor_get_preferred_height()
* @allocate: virtual function, used when setting the coordinates of an * @allocate: virtual function, used when settings the coordinates of an
* actor; it is used by clutter_actor_allocate(); when overriding this * actor; it is used by clutter_actor_allocate(); it must chain up to
* function without chaining up, clutter_actor_set_allocation() must be * the parent's implementation, or call clutter_actor_set_allocation()
* called and children must be allocated by the implementation, when
* chaining up though, those things will be done by the parent's
* implementation.
* @apply_transform: virtual function, used when applying the transformations * @apply_transform: virtual function, used when applying the transformations
* to an actor before painting it or when transforming coordinates or * to an actor before painting it or when transforming coordinates or
* the allocation; it must chain up to the parent's implementation * the allocation; it must chain up to the parent's implementation
@@ -233,14 +228,13 @@ struct _ClutterActorClass
void (* unrealize) (ClutterActor *self); void (* unrealize) (ClutterActor *self);
void (* map) (ClutterActor *self); void (* map) (ClutterActor *self);
void (* unmap) (ClutterActor *self); void (* unmap) (ClutterActor *self);
void (* paint) (ClutterActor *self, void (* paint) (ClutterActor *self);
ClutterPaintContext *paint_context);
void (* parent_set) (ClutterActor *actor, void (* parent_set) (ClutterActor *actor,
ClutterActor *old_parent); ClutterActor *old_parent);
void (* destroy) (ClutterActor *self); void (* destroy) (ClutterActor *self);
void (* pick) (ClutterActor *actor, void (* pick) (ClutterActor *actor,
ClutterPickContext *pick_context); const ClutterColor *color);
gboolean (* queue_redraw) (ClutterActor *actor, gboolean (* queue_redraw) (ClutterActor *actor,
ClutterActor *leaf_that_queued, ClutterActor *leaf_that_queued,
@@ -256,7 +250,8 @@ struct _ClutterActorClass
gfloat *min_height_p, gfloat *min_height_p,
gfloat *natural_height_p); gfloat *natural_height_p);
void (* allocate) (ClutterActor *self, void (* allocate) (ClutterActor *self,
const ClutterActorBox *box); const ClutterActorBox *box,
ClutterAllocationFlags flags);
/* transformations */ /* transformations */
void (* apply_transform) (ClutterActor *actor, void (* apply_transform) (ClutterActor *actor,
@@ -301,11 +296,10 @@ struct _ClutterActorClass
gboolean (* touch_event) (ClutterActor *self, gboolean (* touch_event) (ClutterActor *self,
ClutterTouchEvent *event); ClutterTouchEvent *event);
gboolean (* has_accessible) (ClutterActor *self);
/*< private >*/ /*< private >*/
/* padding for future expansion */ /* padding for future expansion */
gpointer _padding_dummy[25]; gpointer _padding_dummy[26];
}; };
/** /**
@@ -356,17 +350,9 @@ void clutter_actor_map
CLUTTER_EXPORT CLUTTER_EXPORT
void clutter_actor_unmap (ClutterActor *self); void clutter_actor_unmap (ClutterActor *self);
CLUTTER_EXPORT CLUTTER_EXPORT
void clutter_actor_paint (ClutterActor *self, void clutter_actor_paint (ClutterActor *self);
ClutterPaintContext *paint_context);
CLUTTER_EXPORT CLUTTER_EXPORT
void clutter_actor_continue_paint (ClutterActor *self, void clutter_actor_continue_paint (ClutterActor *self);
ClutterPaintContext *paint_context);
CLUTTER_EXPORT
void clutter_actor_pick (ClutterActor *actor,
ClutterPickContext *pick_context);
CLUTTER_EXPORT
void clutter_actor_continue_pick (ClutterActor *actor,
ClutterPickContext *pick_context);
CLUTTER_EXPORT CLUTTER_EXPORT
void clutter_actor_queue_redraw (ClutterActor *self); void clutter_actor_queue_redraw (ClutterActor *self);
CLUTTER_EXPORT CLUTTER_EXPORT
@@ -383,8 +369,6 @@ CLUTTER_EXPORT
const gchar * clutter_actor_get_name (ClutterActor *self); const gchar * clutter_actor_get_name (ClutterActor *self);
CLUTTER_EXPORT CLUTTER_EXPORT
AtkObject * clutter_actor_get_accessible (ClutterActor *self); AtkObject * clutter_actor_get_accessible (ClutterActor *self);
CLUTTER_EXPORT
gboolean clutter_actor_has_accessible (ClutterActor *self);
CLUTTER_EXPORT CLUTTER_EXPORT
gboolean clutter_actor_is_visible (ClutterActor *self); gboolean clutter_actor_is_visible (ClutterActor *self);
@@ -417,29 +401,38 @@ void clutter_actor_get_preferred_size
gfloat *natural_height_p); gfloat *natural_height_p);
CLUTTER_EXPORT CLUTTER_EXPORT
void clutter_actor_allocate (ClutterActor *self, void clutter_actor_allocate (ClutterActor *self,
const ClutterActorBox *box); const ClutterActorBox *box,
ClutterAllocationFlags flags);
CLUTTER_EXPORT CLUTTER_EXPORT
void clutter_actor_allocate_preferred_size (ClutterActor *self); void clutter_actor_allocate_preferred_size (ClutterActor *self,
ClutterAllocationFlags flags);
CLUTTER_EXPORT CLUTTER_EXPORT
void clutter_actor_allocate_available_size (ClutterActor *self, void clutter_actor_allocate_available_size (ClutterActor *self,
gfloat x, gfloat x,
gfloat y, gfloat y,
gfloat available_width, gfloat available_width,
gfloat available_height); gfloat available_height,
ClutterAllocationFlags flags);
CLUTTER_EXPORT CLUTTER_EXPORT
void clutter_actor_allocate_align_fill (ClutterActor *self, void clutter_actor_allocate_align_fill (ClutterActor *self,
const ClutterActorBox *box, const ClutterActorBox *box,
gdouble x_align, gdouble x_align,
gdouble y_align, gdouble y_align,
gboolean x_fill, gboolean x_fill,
gboolean y_fill); gboolean y_fill,
ClutterAllocationFlags flags);
CLUTTER_EXPORT CLUTTER_EXPORT
void clutter_actor_set_allocation (ClutterActor *self, void clutter_actor_set_allocation (ClutterActor *self,
const ClutterActorBox *box); const ClutterActorBox *box,
ClutterAllocationFlags flags);
CLUTTER_EXPORT CLUTTER_EXPORT
void clutter_actor_get_allocation_box (ClutterActor *self, void clutter_actor_get_allocation_box (ClutterActor *self,
ClutterActorBox *box); ClutterActorBox *box);
CLUTTER_EXPORT CLUTTER_EXPORT
void clutter_actor_get_allocation_vertices (ClutterActor *self,
ClutterActor *ancestor,
ClutterVertex verts[]);
CLUTTER_EXPORT
gboolean clutter_actor_has_allocation (ClutterActor *self); gboolean clutter_actor_has_allocation (ClutterActor *self);
CLUTTER_EXPORT CLUTTER_EXPORT
void clutter_actor_set_size (ClutterActor *self, void clutter_actor_set_size (ClutterActor *self,
@@ -591,11 +584,6 @@ gboolean clutter_actor_is_in_clone_paint
CLUTTER_EXPORT CLUTTER_EXPORT
gboolean clutter_actor_get_paint_box (ClutterActor *self, gboolean clutter_actor_get_paint_box (ClutterActor *self,
ClutterActorBox *box); ClutterActorBox *box);
CLUTTER_EXPORT
gboolean clutter_actor_get_resource_scale (ClutterActor *self,
gfloat *resource_scale);
CLUTTER_EXPORT CLUTTER_EXPORT
gboolean clutter_actor_has_overlaps (ClutterActor *self); gboolean clutter_actor_has_overlaps (ClutterActor *self);
@@ -824,16 +812,16 @@ gboolean clutter_actor_transform_stage_point
gfloat *y_out); gfloat *y_out);
CLUTTER_EXPORT CLUTTER_EXPORT
void clutter_actor_get_abs_allocation_vertices (ClutterActor *self, void clutter_actor_get_abs_allocation_vertices (ClutterActor *self,
graphene_point3d_t *verts); ClutterVertex verts[]);
CLUTTER_EXPORT CLUTTER_EXPORT
void clutter_actor_apply_transform_to_point (ClutterActor *self, void clutter_actor_apply_transform_to_point (ClutterActor *self,
const graphene_point3d_t *point, const ClutterVertex *point,
graphene_point3d_t *vertex); ClutterVertex *vertex);
CLUTTER_EXPORT CLUTTER_EXPORT
void clutter_actor_apply_relative_transform_to_point (ClutterActor *self, void clutter_actor_apply_relative_transform_to_point (ClutterActor *self,
ClutterActor *ancestor, ClutterActor *ancestor,
const graphene_point3d_t *point, const ClutterVertex *point,
graphene_point3d_t *vertex); ClutterVertex *vertex);
/* Implicit animations */ /* Implicit animations */
CLUTTER_EXPORT CLUTTER_EXPORT
@@ -877,11 +865,6 @@ void clutter_actor_set_opacity_override
CLUTTER_EXPORT CLUTTER_EXPORT
gint clutter_actor_get_opacity_override (ClutterActor *self); gint clutter_actor_get_opacity_override (ClutterActor *self);
CLUTTER_EXPORT
void clutter_actor_inhibit_culling (ClutterActor *actor);
CLUTTER_EXPORT
void clutter_actor_uninhibit_culling (ClutterActor *actor);
/** /**
* ClutterActorCreateChildFunc: * ClutterActorCreateChildFunc:
* @item: (type GObject): the item in the model * @item: (type GObject): the item in the model
@@ -914,14 +897,6 @@ void clutter_actor_bind_model_with_properties
const char *first_model_property, const char *first_model_property,
...); ...);
CLUTTER_EXPORT
void clutter_actor_pick_box (ClutterActor *self,
ClutterPickContext *pick_context,
const ClutterActorBox *box);
CLUTTER_EXPORT
GList * clutter_actor_peek_stage_views (ClutterActor *self);
G_END_DECLS G_END_DECLS
#endif /* __CLUTTER_ACTOR_H__ */ #endif /* __CLUTTER_ACTOR_H__ */

View File

@@ -84,11 +84,13 @@ G_DEFINE_TYPE (ClutterAlignConstraint,
CLUTTER_TYPE_CONSTRAINT); CLUTTER_TYPE_CONSTRAINT);
static void static void
source_queue_relayout (ClutterActor *actor, source_position_changed (ClutterActor *actor,
ClutterAlignConstraint *align) const ClutterActorBox *allocation,
ClutterAllocationFlags flags,
ClutterAlignConstraint *align)
{ {
if (align->actor != NULL) if (align->actor != NULL)
_clutter_actor_queue_only_relayout (align->actor); clutter_actor_queue_relayout (align->actor);
} }
static void static void
@@ -185,7 +187,7 @@ clutter_align_constraint_dispose (GObject *gobject)
G_CALLBACK (source_destroyed), G_CALLBACK (source_destroyed),
align); align);
g_signal_handlers_disconnect_by_func (align->source, g_signal_handlers_disconnect_by_func (align->source,
G_CALLBACK (source_queue_relayout), G_CALLBACK (source_position_changed),
align); align);
align->source = NULL; align->source = NULL;
} }
@@ -401,15 +403,15 @@ clutter_align_constraint_set_source (ClutterAlignConstraint *align,
G_CALLBACK (source_destroyed), G_CALLBACK (source_destroyed),
align); align);
g_signal_handlers_disconnect_by_func (old_source, g_signal_handlers_disconnect_by_func (old_source,
G_CALLBACK (source_queue_relayout), G_CALLBACK (source_position_changed),
align); align);
} }
align->source = source; align->source = source;
if (align->source != NULL) if (align->source != NULL)
{ {
g_signal_connect (align->source, "queue-relayout", g_signal_connect (align->source, "allocation-changed",
G_CALLBACK (source_queue_relayout), G_CALLBACK (source_position_changed),
align); align);
g_signal_connect (align->source, "destroy", g_signal_connect (align->source, "destroy",
G_CALLBACK (source_destroyed), G_CALLBACK (source_destroyed),

View File

@@ -27,23 +27,36 @@
* @short_description: Interface for animatable classes * @short_description: Interface for animatable classes
* *
* #ClutterAnimatable is an interface that allows a #GObject class * #ClutterAnimatable is an interface that allows a #GObject class
* to control how an actor will animate a property. * to control how a #ClutterAnimation will animate a property.
* *
* Each #ClutterAnimatable should implement the * Each #ClutterAnimatable should implement the
* #ClutterAnimatableInterface.interpolate_property() virtual function of the * #ClutterAnimatableInterface.interpolate_property() virtual function of the
* interface to compute the animation state between two values of an interval * interface to compute the animation state between two values of an interval
* depending on a progress factor, expressed as a floating point value. * depending on a progress factor, expressed as a floating point value.
* *
* If a #ClutterAnimatable is animated by a #ClutterAnimation
* instance, the #ClutterAnimation will call
* clutter_animatable_interpolate_property() passing the name of the
* currently animated property; the values interval; and the progress factor.
* The #ClutterAnimatable implementation should return the computed value for
* the animated
* property.
*
* #ClutterAnimatable is available since Clutter 1.0 * #ClutterAnimatable is available since Clutter 1.0
*/ */
#include "clutter-build-config.h" #include "clutter-build-config.h"
#define CLUTTER_DISABLE_DEPRECATION_WARNINGS
#include "clutter-animatable.h" #include "clutter-animatable.h"
#include "clutter-interval.h" #include "clutter-interval.h"
#include "clutter-debug.h" #include "clutter-debug.h"
#include "clutter-private.h" #include "clutter-private.h"
#include "deprecated/clutter-animatable.h"
#include "deprecated/clutter-animation.h"
G_DEFINE_INTERFACE (ClutterAnimatable, clutter_animatable, G_TYPE_OBJECT); G_DEFINE_INTERFACE (ClutterAnimatable, clutter_animatable, G_TYPE_OBJECT);
static void static void
@@ -51,6 +64,80 @@ clutter_animatable_default_init (ClutterAnimatableInterface *iface)
{ {
} }
/**
* clutter_animatable_animate_property:
* @animatable: a #ClutterAnimatable
* @animation: a #ClutterAnimation
* @property_name: the name of the animated property
* @initial_value: the initial value of the animation interval
* @final_value: the final value of the animation interval
* @progress: the progress factor
* @value: return location for the animation value
*
* Calls the animate_property() virtual function for @animatable.
*
* The @initial_value and @final_value #GValue<!-- -->s must contain
* the same type; @value must have been initialized to the same
* type of @initial_value and @final_value.
*
* All implementation of the #ClutterAnimatable interface must
* implement this function.
*
* Return value: %TRUE if the value has been validated and can
* be applied to the #ClutterAnimatable, and %FALSE otherwise
*
* Since: 1.0
*
* Deprecated: 1.8: Use clutter_animatable_interpolate_value()
* instead
*/
gboolean
clutter_animatable_animate_property (ClutterAnimatable *animatable,
ClutterAnimation *animation,
const gchar *property_name,
const GValue *initial_value,
const GValue *final_value,
gdouble progress,
GValue *value)
{
ClutterAnimatableInterface *iface;
gboolean res;
g_return_val_if_fail (CLUTTER_IS_ANIMATABLE (animatable), FALSE);
g_return_val_if_fail (CLUTTER_IS_ANIMATION (animation), FALSE);
g_return_val_if_fail (property_name != NULL, FALSE);
g_return_val_if_fail (initial_value != NULL && final_value != NULL, FALSE);
g_return_val_if_fail (G_VALUE_TYPE (initial_value) != G_TYPE_INVALID, FALSE);
g_return_val_if_fail (G_VALUE_TYPE (final_value) != G_TYPE_INVALID, FALSE);
g_return_val_if_fail (value != NULL, FALSE);
g_return_val_if_fail (G_VALUE_TYPE (value) == G_VALUE_TYPE (initial_value) &&
G_VALUE_TYPE (value) == G_VALUE_TYPE (final_value),
FALSE);
iface = CLUTTER_ANIMATABLE_GET_IFACE (animatable);
if (iface->animate_property == NULL)
{
ClutterInterval *interval;
interval = clutter_animation_get_interval (animation, property_name);
if (interval == NULL)
return FALSE;
res = clutter_animatable_interpolate_value (animatable, property_name,
interval,
progress,
value);
}
else
res = iface->animate_property (animatable, animation,
property_name,
initial_value, final_value,
progress,
value);
return res;
}
/** /**
* clutter_animatable_find_property: * clutter_animatable_find_property:
* @animatable: a #ClutterAnimatable * @animatable: a #ClutterAnimatable

View File

@@ -42,6 +42,8 @@ G_DECLARE_INTERFACE (ClutterAnimatable, clutter_animatable,
/** /**
* ClutterAnimatableInterface: * ClutterAnimatableInterface:
* @animate_property: virtual function for custom interpolation of a
* property. This virtual function is deprecated
* @find_property: virtual function for retrieving the #GParamSpec of * @find_property: virtual function for retrieving the #GParamSpec of
* an animatable property * an animatable property
* @get_initial_state: virtual function for retrieving the initial * @get_initial_state: virtual function for retrieving the initial
@@ -51,6 +53,9 @@ G_DECLARE_INTERFACE (ClutterAnimatable, clutter_animatable,
* @interpolate_value: virtual function for interpolating the progress * @interpolate_value: virtual function for interpolating the progress
* of a property * of a property
* *
* Base interface for #GObject<!-- -->s that can be animated by a
* a #ClutterAnimation.
*
* Since: 1.0 * Since: 1.0
*/ */
struct _ClutterAnimatableInterface struct _ClutterAnimatableInterface
@@ -59,6 +64,13 @@ struct _ClutterAnimatableInterface
GTypeInterface parent_iface; GTypeInterface parent_iface;
/*< public >*/ /*< public >*/
gboolean (* animate_property) (ClutterAnimatable *animatable,
ClutterAnimation *animation,
const gchar *property_name,
const GValue *initial_value,
const GValue *final_value,
gdouble progress,
GValue *value);
GParamSpec *(* find_property) (ClutterAnimatable *animatable, GParamSpec *(* find_property) (ClutterAnimatable *animatable,
const gchar *property_name); const gchar *property_name);
void (* get_initial_state) (ClutterAnimatable *animatable, void (* get_initial_state) (ClutterAnimatable *animatable,

View File

@@ -30,7 +30,9 @@
#ifndef __GI_SCANNER__ #ifndef __GI_SCANNER__
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterAction, g_object_unref)
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterActor, g_object_unref) G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterActor, g_object_unref)
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterActorMeta, g_object_unref)
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterAlignConstraint, g_object_unref) G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterAlignConstraint, g_object_unref)
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterBackend, g_object_unref) G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterBackend, g_object_unref)
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterBindConstraint, g_object_unref) G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterBindConstraint, g_object_unref)
@@ -41,15 +43,20 @@ G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterBoxLayout, g_object_unref)
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterBrightnessContrastEffect, g_object_unref) G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterBrightnessContrastEffect, g_object_unref)
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterCanvas, g_object_unref) G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterCanvas, g_object_unref)
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterChildMeta, g_object_unref) G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterChildMeta, g_object_unref)
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterClickAction, g_object_unref)
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterClone, g_object_unref) G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterClone, g_object_unref)
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterColorizeEffect, g_object_unref) G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterColorizeEffect, g_object_unref)
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterConstraint, g_object_unref) G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterConstraint, g_object_unref)
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterContainer, g_object_unref) G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterContainer, g_object_unref)
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterDeformEffect, g_object_unref) G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterDeformEffect, g_object_unref)
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterDesaturateEffect, g_object_unref) G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterDesaturateEffect, g_object_unref)
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterDeviceManager, g_object_unref)
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterDragAction, g_object_unref)
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterDropAction, g_object_unref)
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterEffect, g_object_unref) G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterEffect, g_object_unref)
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterFixedLayout, g_object_unref) G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterFixedLayout, g_object_unref)
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterFlowLayout, g_object_unref) G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterFlowLayout, g_object_unref)
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterGestureAction, g_object_unref)
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterGridLayout, g_object_unref) G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterGridLayout, g_object_unref)
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterImage, g_object_unref) G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterImage, g_object_unref)
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterInputDevice, g_object_unref) G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterInputDevice, g_object_unref)
@@ -84,10 +91,13 @@ G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterActorBox, clutter_actor_box_free)
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterColor, clutter_color_free) G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterColor, clutter_color_free)
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterMargin, clutter_margin_free) G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterMargin, clutter_margin_free)
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterMatrix, clutter_matrix_free) G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterMatrix, clutter_matrix_free)
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterPaintContext, clutter_paint_context_unref)
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterPaintNode, clutter_paint_node_unref) G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterPaintNode, clutter_paint_node_unref)
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterPaintVolume, clutter_paint_volume_free) G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterPaintVolume, clutter_paint_volume_free)
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterPathNode, clutter_path_node_free) G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterPathNode, clutter_path_node_free)
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterPoint, clutter_point_free)
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterRect, clutter_rect_free)
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterSize, clutter_size_free)
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterVertex, clutter_vertex_free)
#endif /* __GI_SCANNER__ */ #endif /* __GI_SCANNER__ */

View File

@@ -23,9 +23,12 @@
#define __CLUTTER_BACKEND_PRIVATE_H__ #define __CLUTTER_BACKEND_PRIVATE_H__
#include <clutter/clutter-backend.h> #include <clutter/clutter-backend.h>
#include <clutter/clutter-seat.h> #include <clutter/clutter-device-manager.h>
#include <clutter/clutter-keymap.h>
#include <clutter/clutter-stage-window.h> #include <clutter/clutter-stage-window.h>
#include "clutter-event-translator.h"
#define CLUTTER_BACKEND_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), CLUTTER_TYPE_BACKEND, ClutterBackendClass)) #define CLUTTER_BACKEND_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), CLUTTER_TYPE_BACKEND, ClutterBackendClass))
#define CLUTTER_IS_BACKEND_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), CLUTTER_TYPE_BACKEND)) #define CLUTTER_IS_BACKEND_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), CLUTTER_TYPE_BACKEND))
#define CLUTTER_BACKEND_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), CLUTTER_TYPE_BACKEND, ClutterBackendClass)) #define CLUTTER_BACKEND_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), CLUTTER_TYPE_BACKEND, ClutterBackendClass))
@@ -46,6 +49,8 @@ struct _ClutterBackend
CoglOnscreen *dummy_onscreen; CoglOnscreen *dummy_onscreen;
ClutterDeviceManager *device_manager;
cairo_font_options_t *font_options; cairo_font_options_t *font_options;
gchar *font_name; gchar *font_name;
@@ -53,9 +58,11 @@ struct _ClutterBackend
gfloat units_per_em; gfloat units_per_em;
gint32 units_serial; gint32 units_serial;
ClutterStageWindow *stage_window; GList *event_translators;
ClutterInputMethod *input_method; ClutterInputMethod *input_method;
ClutterKeymap *keymap;
}; };
struct _ClutterBackendClass struct _ClutterBackendClass
@@ -84,12 +91,23 @@ struct _ClutterBackendClass
GError **error); GError **error);
gboolean (* create_context) (ClutterBackend *backend, gboolean (* create_context) (ClutterBackend *backend,
GError **error); GError **error);
ClutterDeviceManager *(* get_device_manager) (ClutterBackend *backend);
void (* copy_event_data) (ClutterBackend *backend,
const ClutterEvent *src,
ClutterEvent *dest);
void (* free_event_data) (ClutterBackend *backend,
ClutterEvent *event);
gboolean (* translate_event) (ClutterBackend *backend, gboolean (* translate_event) (ClutterBackend *backend,
gpointer native, gpointer native,
ClutterEvent *event); ClutterEvent *event);
ClutterSeat * (* get_default_seat) (ClutterBackend *backend); PangoDirection (* get_keymap_direction) (ClutterBackend *backend);
void (* bell_notify) (ClutterBackend *backend);
ClutterKeymap * (* get_keymap) (ClutterBackend *backend);
/* signals */ /* signals */
void (* resolution_changed) (ClutterBackend *backend); void (* resolution_changed) (ClutterBackend *backend);
@@ -118,21 +136,31 @@ void _clutter_backend_copy_event_data (Clutter
ClutterEvent *dest); ClutterEvent *dest);
void _clutter_backend_free_event_data (ClutterBackend *backend, void _clutter_backend_free_event_data (ClutterBackend *backend,
ClutterEvent *event); ClutterEvent *event);
CLUTTER_EXPORT
gboolean _clutter_backend_translate_event (ClutterBackend *backend, gboolean _clutter_backend_translate_event (ClutterBackend *backend,
gpointer native, gpointer native,
ClutterEvent *event); ClutterEvent *event);
CLUTTER_EXPORT
void _clutter_backend_add_event_translator (ClutterBackend *backend,
ClutterEventTranslator *translator);
void _clutter_backend_remove_event_translator (ClutterBackend *backend,
ClutterEventTranslator *translator);
ClutterFeatureFlags _clutter_backend_get_features (ClutterBackend *backend); ClutterFeatureFlags _clutter_backend_get_features (ClutterBackend *backend);
gfloat _clutter_backend_get_units_per_em (ClutterBackend *backend, gfloat _clutter_backend_get_units_per_em (ClutterBackend *backend,
PangoFontDescription *font_desc); PangoFontDescription *font_desc);
gint32 _clutter_backend_get_units_serial (ClutterBackend *backend); gint32 _clutter_backend_get_units_serial (ClutterBackend *backend);
void clutter_set_allowed_drivers (const char *drivers); PangoDirection _clutter_backend_get_keymap_direction (ClutterBackend *backend);
CLUTTER_EXPORT CLUTTER_EXPORT
ClutterStageWindow * clutter_backend_get_stage_window (ClutterBackend *backend); void _clutter_backend_reset_cogl_framebuffer (ClutterBackend *backend);
void clutter_set_allowed_drivers (const char *drivers);
void clutter_try_set_windowing_backend (const char *drivers);
G_END_DECLS G_END_DECLS

View File

@@ -51,6 +51,7 @@
#include "clutter-stage-manager-private.h" #include "clutter-stage-manager-private.h"
#include "clutter-stage-private.h" #include "clutter-stage-private.h"
#include "clutter-stage-window.h" #include "clutter-stage-window.h"
#include "clutter-device-manager-private.h"
#ifdef CLUTTER_HAS_WAYLAND_COMPOSITOR_SUPPORT #ifdef CLUTTER_HAS_WAYLAND_COMPOSITOR_SUPPORT
#include "wayland/clutter-wayland-compositor.h" #include "wayland/clutter-wayland-compositor.h"
@@ -61,6 +62,9 @@
#ifdef CLUTTER_INPUT_X11 #ifdef CLUTTER_INPUT_X11
#include "x11/clutter-backend-x11.h" #include "x11/clutter-backend-x11.h"
#endif #endif
#ifdef CLUTTER_INPUT_EVDEV
#include "evdev/clutter-device-manager-evdev.h"
#endif
#ifdef CLUTTER_WINDOWING_EGL #ifdef CLUTTER_WINDOWING_EGL
#include "egl/clutter-backend-eglnative.h" #include "egl/clutter-backend-eglnative.h"
#endif #endif
@@ -100,12 +104,10 @@ clutter_backend_dispose (GObject *gobject)
/* clear the events still in the queue of the main context */ /* clear the events still in the queue of the main context */
_clutter_clear_events_queue (); _clutter_clear_events_queue ();
/* remove all event translators */
g_clear_pointer (&backend->event_translators, g_list_free);
g_clear_pointer (&backend->dummy_onscreen, cogl_object_unref); g_clear_pointer (&backend->dummy_onscreen, cogl_object_unref);
if (backend->stage_window)
{
g_object_remove_weak_pointer (G_OBJECT (backend->stage_window),
(gpointer *) &backend->stage_window);
}
G_OBJECT_CLASS (clutter_backend_parent_class)->dispose (gobject); G_OBJECT_CLASS (clutter_backend_parent_class)->dispose (gobject);
} }
@@ -395,7 +397,7 @@ clutter_backend_real_create_context (ClutterBackend *backend,
else else
g_set_error_literal (error, CLUTTER_INIT_ERROR, g_set_error_literal (error, CLUTTER_INIT_ERROR,
CLUTTER_INIT_ERROR_BACKEND, CLUTTER_INIT_ERROR_BACKEND,
"Unable to initialize the Clutter backend: no available drivers found."); _("Unable to initialize the Clutter backend: no available drivers found."));
return FALSE; return FALSE;
} }
@@ -524,7 +526,92 @@ _clutter_create_backend (void)
static void static void
clutter_backend_real_init_events (ClutterBackend *backend) clutter_backend_real_init_events (ClutterBackend *backend)
{ {
g_error ("Unknown input backend"); const char *input_backend = NULL;
input_backend = g_getenv ("CLUTTER_INPUT_BACKEND");
if (input_backend != NULL)
input_backend = g_intern_string (input_backend);
#ifdef CLUTTER_INPUT_X11
if (clutter_check_windowing_backend (CLUTTER_WINDOWING_X11) &&
(input_backend == NULL || input_backend == I_(CLUTTER_INPUT_X11)))
{
_clutter_backend_x11_events_init (backend);
}
else
#endif
#ifdef CLUTTER_INPUT_EVDEV
/* Evdev can be used regardless of the windowing system */
if ((input_backend != NULL && strcmp (input_backend, CLUTTER_INPUT_EVDEV) == 0)
#ifdef CLUTTER_WINDOWING_EGL
/* but we do want to always use it for EGL native */
|| clutter_check_windowing_backend (CLUTTER_WINDOWING_EGL)
#endif
)
{
_clutter_events_evdev_init (backend);
}
else
#endif
if (input_backend != NULL)
{
if (input_backend != I_(CLUTTER_INPUT_NULL))
g_error ("Unrecognized input backend '%s'", input_backend);
}
else
g_error ("Unknown input backend");
}
static ClutterDeviceManager *
clutter_backend_real_get_device_manager (ClutterBackend *backend)
{
if (G_UNLIKELY (backend->device_manager == NULL))
{
g_critical ("No device manager available, expect broken input");
return NULL;
}
return backend->device_manager;
}
static ClutterKeymap *
clutter_backend_real_get_keymap (ClutterBackend *backend)
{
if (G_UNLIKELY (backend->keymap == NULL))
{
g_critical ("No keymap available, expect broken keyboard input");
return NULL;
}
return backend->keymap;
}
static gboolean
clutter_backend_real_translate_event (ClutterBackend *backend,
gpointer native,
ClutterEvent *event)
{
GList *l;
for (l = backend->event_translators;
l != NULL;
l = l->next)
{
ClutterEventTranslator *translator = l->data;
ClutterTranslateReturn retval;
retval = _clutter_event_translator_translate_event (translator,
native,
event);
if (retval == CLUTTER_TRANSLATE_QUEUE)
return TRUE;
if (retval == CLUTTER_TRANSLATE_REMOVE)
return FALSE;
}
return FALSE;
} }
static void static void
@@ -549,7 +636,8 @@ clutter_backend_class_init (ClutterBackendClass *klass)
G_TYPE_FROM_CLASS (klass), G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_FIRST, G_SIGNAL_RUN_FIRST,
G_STRUCT_OFFSET (ClutterBackendClass, resolution_changed), G_STRUCT_OFFSET (ClutterBackendClass, resolution_changed),
NULL, NULL, NULL, NULL, NULL,
_clutter_marshal_VOID__VOID,
G_TYPE_NONE, 0); G_TYPE_NONE, 0);
/** /**
@@ -566,7 +654,8 @@ clutter_backend_class_init (ClutterBackendClass *klass)
G_TYPE_FROM_CLASS (klass), G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_FIRST, G_SIGNAL_RUN_FIRST,
G_STRUCT_OFFSET (ClutterBackendClass, font_changed), G_STRUCT_OFFSET (ClutterBackendClass, font_changed),
NULL, NULL, NULL, NULL, NULL,
_clutter_marshal_VOID__VOID,
G_TYPE_NONE, 0); G_TYPE_NONE, 0);
/** /**
@@ -583,15 +672,19 @@ clutter_backend_class_init (ClutterBackendClass *klass)
G_TYPE_FROM_CLASS (klass), G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_FIRST, G_SIGNAL_RUN_FIRST,
G_STRUCT_OFFSET (ClutterBackendClass, settings_changed), G_STRUCT_OFFSET (ClutterBackendClass, settings_changed),
NULL, NULL, NULL, NULL, NULL,
_clutter_marshal_VOID__VOID,
G_TYPE_NONE, 0); G_TYPE_NONE, 0);
klass->resolution_changed = clutter_backend_real_resolution_changed; klass->resolution_changed = clutter_backend_real_resolution_changed;
klass->font_changed = clutter_backend_real_font_changed; klass->font_changed = clutter_backend_real_font_changed;
klass->init_events = clutter_backend_real_init_events; klass->init_events = clutter_backend_real_init_events;
klass->get_device_manager = clutter_backend_real_get_device_manager;
klass->translate_event = clutter_backend_real_translate_event;
klass->create_context = clutter_backend_real_create_context; klass->create_context = clutter_backend_real_create_context;
klass->get_features = clutter_backend_real_get_features; klass->get_features = clutter_backend_real_get_features;
klass->get_keymap = clutter_backend_real_get_keymap;
} }
static void static void
@@ -600,7 +693,7 @@ clutter_backend_init (ClutterBackend *self)
self->units_per_em = -1.0; self->units_per_em = -1.0;
self->units_serial = 1; self->units_serial = 1;
self->dummy_onscreen = NULL; self->dummy_onscreen = COGL_INVALID_HANDLE;
} }
void void
@@ -668,10 +761,6 @@ _clutter_backend_create_stage (ClutterBackend *backend,
g_assert (CLUTTER_IS_STAGE_WINDOW (stage_window)); g_assert (CLUTTER_IS_STAGE_WINDOW (stage_window));
backend->stage_window = stage_window;
g_object_add_weak_pointer (G_OBJECT (backend->stage_window),
(gpointer *) &backend->stage_window);
return stage_window; return stage_window;
} }
@@ -756,24 +845,37 @@ _clutter_backend_copy_event_data (ClutterBackend *backend,
const ClutterEvent *src, const ClutterEvent *src,
ClutterEvent *dest) ClutterEvent *dest)
{ {
ClutterSeatClass *seat_class; ClutterEventExtenderInterface *iface;
ClutterSeat *seat; ClutterBackendClass *klass;
seat = clutter_backend_get_default_seat (backend); klass = CLUTTER_BACKEND_GET_CLASS (backend);
seat_class = CLUTTER_SEAT_GET_CLASS (seat); if (CLUTTER_IS_EVENT_EXTENDER (backend->device_manager))
seat_class->copy_event_data (seat, src, dest); {
iface = CLUTTER_EVENT_EXTENDER_GET_IFACE (backend->device_manager);
iface->copy_event_data (CLUTTER_EVENT_EXTENDER (backend->device_manager),
src, dest);
}
else if (klass->copy_event_data != NULL)
klass->copy_event_data (backend, src, dest);
} }
void void
_clutter_backend_free_event_data (ClutterBackend *backend, _clutter_backend_free_event_data (ClutterBackend *backend,
ClutterEvent *event) ClutterEvent *event)
{ {
ClutterSeatClass *seat_class; ClutterEventExtenderInterface *iface;
ClutterSeat *seat; ClutterBackendClass *klass;
seat = clutter_backend_get_default_seat (backend); klass = CLUTTER_BACKEND_GET_CLASS (backend);
seat_class = CLUTTER_SEAT_GET_CLASS (seat);
seat_class->free_event_data (seat, event); if (CLUTTER_IS_EVENT_EXTENDER (backend->device_manager))
{
iface = CLUTTER_EVENT_EXTENDER_GET_IFACE (backend->device_manager);
iface->free_event_data (CLUTTER_EVENT_EXTENDER (backend->device_manager),
event);
}
else if (klass->free_event_data != NULL)
klass->free_event_data (backend, event);
} }
/** /**
@@ -919,6 +1021,28 @@ _clutter_backend_translate_event (ClutterBackend *backend,
event); event);
} }
void
_clutter_backend_add_event_translator (ClutterBackend *backend,
ClutterEventTranslator *translator)
{
if (g_list_find (backend->event_translators, translator) != NULL)
return;
backend->event_translators =
g_list_prepend (backend->event_translators, translator);
}
void
_clutter_backend_remove_event_translator (ClutterBackend *backend,
ClutterEventTranslator *translator)
{
if (g_list_find (backend->event_translators, translator) == NULL)
return;
backend->event_translators =
g_list_remove (backend->event_translators, translator);
}
/** /**
* clutter_backend_get_cogl_context: (skip) * clutter_backend_get_cogl_context: (skip)
* @backend: a #ClutterBackend * @backend: a #ClutterBackend
@@ -970,6 +1094,94 @@ clutter_wayland_set_compositor_display (void *display)
} }
#endif #endif
/**
* clutter_set_windowing_backend:
* @backend_type: a comma separated list of windowing backends
*
* Restricts Clutter to only use the specified backend or list of backends.
*
* You can use one of the `CLUTTER_WINDOWING_*` symbols, e.g.
*
* |[<!-- language="C" -->
* clutter_set_windowing_backend (CLUTTER_WINDOWING_X11);
* ]|
*
* Will force Clutter to use the X11 windowing and input backend, and terminate
* if the X11 backend could not be initialized successfully.
*
* Since Clutter 1.26, you can also use a comma-separated list of windowing
* system backends to provide a fallback in case backends are not available or
* enabled, e.g.:
*
* |[<!-- language="C" -->
* clutter_set_windowing_backend ("gdk,wayland,x11");
* ]|
*
* Will make Clutter test for the GDK, Wayland, and X11 backends in that order.
*
* You can use the `*` special value to ask Clutter to use the internally
* defined list of backends. For instance:
*
* |[<!-- language="C" -->
* clutter_set_windowing_backend ("x11,wayland,*");
* ]|
*
* Will make Clutter test the X11 and Wayland backends, and then fall back
* to the internal list of available backends.
*
* This function must be called before the first API call to Clutter, including
* clutter_get_option_context()
*
* Since: 1.16
*/
void
clutter_set_windowing_backend (const char *backend_type)
{
g_return_if_fail (backend_type != NULL);
allowed_backends = g_strdup (backend_type);
}
void
clutter_try_set_windowing_backend (const char *backend_type)
{
if (allowed_backends == NULL)
clutter_set_windowing_backend (backend_type);
}
PangoDirection
_clutter_backend_get_keymap_direction (ClutterBackend *backend)
{
ClutterBackendClass *klass;
klass = CLUTTER_BACKEND_GET_CLASS (backend);
if (klass->get_keymap_direction != NULL)
return klass->get_keymap_direction (backend);
return PANGO_DIRECTION_NEUTRAL;
}
void
_clutter_backend_reset_cogl_framebuffer (ClutterBackend *backend)
{
if (backend->dummy_onscreen == COGL_INVALID_HANDLE)
{
CoglError *internal_error = NULL;
backend->dummy_onscreen = cogl_onscreen_new (backend->cogl_context, 1, 1);
if (!cogl_framebuffer_allocate (COGL_FRAMEBUFFER (backend->dummy_onscreen),
&internal_error))
{
g_critical ("Unable to create dummy onscreen: %s", internal_error->message);
cogl_error_free (internal_error);
return;
}
}
cogl_set_framebuffer (COGL_FRAMEBUFFER (backend->dummy_onscreen));
}
void void
clutter_set_allowed_drivers (const char *drivers) clutter_set_allowed_drivers (const char *drivers)
{ {
@@ -982,6 +1194,16 @@ clutter_set_allowed_drivers (const char *drivers)
allowed_drivers = g_strdup (drivers); allowed_drivers = g_strdup (drivers);
} }
void
clutter_backend_bell_notify (ClutterBackend *backend)
{
ClutterBackendClass *klass;
klass = CLUTTER_BACKEND_GET_CLASS (backend);
if (klass->bell_notify)
klass->bell_notify (backend);
}
/** /**
* clutter_backend_get_input_method: * clutter_backend_get_input_method:
* @backend: the #CLutterBackend * @backend: the #CLutterBackend
@@ -1010,24 +1232,16 @@ clutter_backend_set_input_method (ClutterBackend *backend,
g_set_object (&backend->input_method, method); g_set_object (&backend->input_method, method);
} }
ClutterStageWindow *
clutter_backend_get_stage_window (ClutterBackend *backend)
{
return backend->stage_window;
}
/** /**
* clutter_backend_get_default_seat: * clutter_backend_get_keymap:
* @backend: the #ClutterBackend * @backend: the #ClutterBackend
* *
* Returns the default seat * Gets the keymap used by Clutter
* *
* Returns: (transfer none): the default seat * Returns: (transfer none): the keymap
**/ **/
ClutterSeat * ClutterKeymap *
clutter_backend_get_default_seat (ClutterBackend *backend) clutter_backend_get_keymap (ClutterBackend *backend)
{ {
g_return_val_if_fail (CLUTTER_IS_BACKEND (backend), NULL); return CLUTTER_BACKEND_GET_CLASS (backend)->get_keymap (backend);
return CLUTTER_BACKEND_GET_CLASS (backend)->get_default_seat (backend);
} }

View File

@@ -36,7 +36,6 @@
#include <clutter/clutter-config.h> #include <clutter/clutter-config.h>
#include <clutter/clutter-keymap.h> #include <clutter/clutter-keymap.h>
#include <clutter/clutter-types.h> #include <clutter/clutter-types.h>
#include <clutter/clutter-seat.h>
G_BEGIN_DECLS G_BEGIN_DECLS
@@ -61,6 +60,9 @@ GType clutter_backend_get_type (void) G_GNUC_CONST;
CLUTTER_EXPORT CLUTTER_EXPORT
ClutterBackend * clutter_get_default_backend (void); ClutterBackend * clutter_get_default_backend (void);
CLUTTER_EXPORT
void clutter_set_windowing_backend (const char *backend_type);
CLUTTER_EXPORT CLUTTER_EXPORT
gdouble clutter_backend_get_resolution (ClutterBackend *backend); gdouble clutter_backend_get_resolution (ClutterBackend *backend);
@@ -73,6 +75,9 @@ const cairo_font_options_t * clutter_backend_get_font_options (Clutter
CLUTTER_EXPORT CLUTTER_EXPORT
CoglContext * clutter_backend_get_cogl_context (ClutterBackend *backend); CoglContext * clutter_backend_get_cogl_context (ClutterBackend *backend);
CLUTTER_EXPORT
void clutter_backend_bell_notify (ClutterBackend *backend);
CLUTTER_EXPORT CLUTTER_EXPORT
ClutterInputMethod * clutter_backend_get_input_method (ClutterBackend *backend); ClutterInputMethod * clutter_backend_get_input_method (ClutterBackend *backend);
@@ -80,7 +85,7 @@ CLUTTER_EXPORT
void clutter_backend_set_input_method (ClutterBackend *backend, void clutter_backend_set_input_method (ClutterBackend *backend,
ClutterInputMethod *method); ClutterInputMethod *method);
CLUTTER_EXPORT CLUTTER_EXPORT
ClutterSeat * clutter_backend_get_default_seat (ClutterBackend *backend); ClutterKeymap * clutter_backend_get_keymap (ClutterBackend *backend);
G_END_DECLS G_END_DECLS

File diff suppressed because it is too large Load Diff

View File

@@ -49,10 +49,10 @@
#define CLUTTER_DISABLE_DEPRECATION_WARNINGS #define CLUTTER_DISABLE_DEPRECATION_WARNINGS
#include "deprecated/clutter-container.h" #include "deprecated/clutter-container.h"
#include "deprecated/clutter-bin-layout.h"
#include "clutter-actor-private.h" #include "clutter-actor-private.h"
#include "clutter-animatable.h" #include "clutter-animatable.h"
#include "clutter-bin-layout.h"
#include "clutter-child-meta.h" #include "clutter-child-meta.h"
#include "clutter-debug.h" #include "clutter-debug.h"
#include "clutter-enum-types.h" #include "clutter-enum-types.h"
@@ -406,7 +406,8 @@ get_actor_align_factor (ClutterActorAlign alignment)
static void static void
clutter_bin_layout_allocate (ClutterLayoutManager *manager, clutter_bin_layout_allocate (ClutterLayoutManager *manager,
ClutterContainer *container, ClutterContainer *container,
const ClutterActorBox *allocation) const ClutterActorBox *allocation,
ClutterAllocationFlags flags)
{ {
gfloat allocation_x, allocation_y; gfloat allocation_x, allocation_y;
gfloat available_w, available_h; gfloat available_w, available_h;
@@ -514,7 +515,8 @@ clutter_bin_layout_allocate (ClutterLayoutManager *manager,
clutter_actor_allocate_align_fill (child, &child_alloc, clutter_actor_allocate_align_fill (child, &child_alloc,
x_align, y_align, x_align, y_align,
x_fill, y_fill); x_fill, y_fill,
flags);
} }
} }
@@ -696,3 +698,187 @@ clutter_bin_layout_new (ClutterBinAlignment x_align,
"y-align", y_align, "y-align", y_align,
NULL); NULL);
} }
/**
* clutter_bin_layout_set_alignment:
* @self: a #ClutterBinLayout
* @child: (allow-none): a child of @container
* @x_align: the horizontal alignment policy to be used for the @child
* inside @container
* @y_align: the vertical aligment policy to be used on the @child
* inside @container
*
* Sets the horizontal and vertical alignment policies to be applied
* to a @child of @self
*
* If @child is %NULL then the @x_align and @y_align values will
* be set as the default alignment policies
*
* Since: 1.2
*
* Deprecated: 1.12: Use the #ClutterActor:x-align and
* #ClutterActor:y-align properties of #ClutterActor instead.
*/
void
clutter_bin_layout_set_alignment (ClutterBinLayout *self,
ClutterActor *child,
ClutterBinAlignment x_align,
ClutterBinAlignment y_align)
{
ClutterBinLayoutPrivate *priv;
ClutterLayoutManager *manager;
ClutterLayoutMeta *meta;
g_return_if_fail (CLUTTER_IS_BIN_LAYOUT (self));
g_return_if_fail (child == NULL || CLUTTER_IS_ACTOR (child));
priv = self->priv;
if (priv->container == NULL)
{
if (child == NULL)
{
set_x_align (self, x_align);
set_y_align (self, y_align);
}
else
g_warning ("The layout of type '%s' must be associated to "
"a ClutterContainer before setting the alignment "
"on its children",
G_OBJECT_TYPE_NAME (self));
return;
}
manager = CLUTTER_LAYOUT_MANAGER (self);
meta = clutter_layout_manager_get_child_meta (manager,
priv->container,
child);
g_assert (CLUTTER_IS_BIN_LAYER (meta));
set_layer_x_align (CLUTTER_BIN_LAYER (meta), x_align);
set_layer_y_align (CLUTTER_BIN_LAYER (meta), y_align);
}
/**
* clutter_bin_layout_get_alignment:
* @self: a #ClutterBinLayout
* @child: (allow-none): a child of @container
* @x_align: (out) (allow-none): return location for the horizontal
* alignment policy
* @y_align: (out) (allow-none): return location for the vertical
* alignment policy
*
* Retrieves the horizontal and vertical alignment policies for
* a child of @self
*
* If @child is %NULL the default alignment policies will be returned
* instead
*
* Since: 1.2
*
* Deprecated: 1.12: Use the #ClutterActor:x-align and the
* #ClutterActor:y-align properties of #ClutterActor instead.
*/
void
clutter_bin_layout_get_alignment (ClutterBinLayout *self,
ClutterActor *child,
ClutterBinAlignment *x_align,
ClutterBinAlignment *y_align)
{
ClutterBinLayoutPrivate *priv;
ClutterLayoutManager *manager;
ClutterLayoutMeta *meta;
ClutterBinLayer *layer;
g_return_if_fail (CLUTTER_IS_BIN_LAYOUT (self));
priv = self->priv;
if (priv->container == NULL)
{
if (child == NULL)
{
if (x_align)
*x_align = priv->x_align;
if (y_align)
*y_align = priv->y_align;
}
else
g_warning ("The layout of type '%s' must be associated to "
"a ClutterContainer before getting the alignment "
"of its children",
G_OBJECT_TYPE_NAME (self));
return;
}
manager = CLUTTER_LAYOUT_MANAGER (self);
meta = clutter_layout_manager_get_child_meta (manager,
priv->container,
child);
g_assert (CLUTTER_IS_BIN_LAYER (meta));
layer = CLUTTER_BIN_LAYER (meta);
if (x_align)
*x_align = layer->x_align;
if (y_align)
*y_align = layer->y_align;
}
/**
* clutter_bin_layout_add:
* @self: a #ClutterBinLayout
* @child: a #ClutterActor
* @x_align: horizontal alignment policy for @child
* @y_align: vertical alignment policy for @child
*
* Adds a #ClutterActor to the container using @self and
* sets the alignment policies for it
*
* This function is equivalent to clutter_container_add_actor()
* and clutter_layout_manager_child_set_property() but it does not
* require a pointer to the #ClutterContainer associated to the
* #ClutterBinLayout
*
* Since: 1.2
*
* Deprecated: 1.12: Use clutter_actor_add_child() instead.
*/
void
clutter_bin_layout_add (ClutterBinLayout *self,
ClutterActor *child,
ClutterBinAlignment x_align,
ClutterBinAlignment y_align)
{
ClutterBinLayoutPrivate *priv;
ClutterLayoutManager *manager;
ClutterLayoutMeta *meta;
g_return_if_fail (CLUTTER_IS_BIN_LAYOUT (self));
g_return_if_fail (CLUTTER_IS_ACTOR (child));
priv = self->priv;
if (priv->container == NULL)
{
g_warning ("The layout of type '%s' must be associated to "
"a ClutterContainer before adding children",
G_OBJECT_TYPE_NAME (self));
return;
}
clutter_container_add_actor (priv->container, child);
manager = CLUTTER_LAYOUT_MANAGER (self);
meta = clutter_layout_manager_get_child_meta (manager,
priv->container,
child);
g_assert (CLUTTER_IS_BIN_LAYER (meta));
set_layer_x_align (CLUTTER_BIN_LAYER (meta), x_align);
set_layer_y_align (CLUTTER_BIN_LAYER (meta), y_align);
}

View File

@@ -144,55 +144,6 @@ source_destroyed (ClutterActor *actor,
bind->source = NULL; bind->source = NULL;
} }
static void
clutter_bind_constraint_update_preferred_size (ClutterConstraint *constraint,
ClutterActor *actor,
ClutterOrientation direction,
float for_size,
float *minimum_size,
float *natural_size)
{
ClutterBindConstraint *bind = CLUTTER_BIND_CONSTRAINT (constraint);
float source_min, source_nat;
if (bind->source == NULL)
return;
/* only these bindings affect the preferred size */
if (!(bind->coordinate == CLUTTER_BIND_WIDTH ||
bind->coordinate == CLUTTER_BIND_HEIGHT ||
bind->coordinate == CLUTTER_BIND_SIZE ||
bind->coordinate == CLUTTER_BIND_ALL))
return;
switch (direction)
{
case CLUTTER_ORIENTATION_HORIZONTAL:
if (bind->coordinate != CLUTTER_BIND_HEIGHT)
{
clutter_actor_get_preferred_width (bind->source, for_size,
&source_min,
&source_nat);
*minimum_size = source_min;
*natural_size = source_nat;
}
break;
case CLUTTER_ORIENTATION_VERTICAL:
if (bind->coordinate != CLUTTER_BIND_WIDTH)
{
clutter_actor_get_preferred_height (bind->source, for_size,
&source_min,
&source_nat);
*minimum_size = source_min;
*natural_size = source_nat;
}
break;
}
}
static void static void
clutter_bind_constraint_update_allocation (ClutterConstraint *constraint, clutter_bind_constraint_update_allocation (ClutterConstraint *constraint,
ClutterActor *actor, ClutterActor *actor,
@@ -201,9 +152,7 @@ clutter_bind_constraint_update_allocation (ClutterConstraint *constraint,
ClutterBindConstraint *bind = CLUTTER_BIND_CONSTRAINT (constraint); ClutterBindConstraint *bind = CLUTTER_BIND_CONSTRAINT (constraint);
gfloat source_width, source_height; gfloat source_width, source_height;
gfloat actor_width, actor_height; gfloat actor_width, actor_height;
graphene_point3d_t source_position; ClutterVertex source_position = { 0., };
source_position = GRAPHENE_POINT3D_INIT (0.f, 0.f, 0.f);
if (bind->source == NULL) if (bind->source == NULL)
return; return;
@@ -377,8 +326,6 @@ clutter_bind_constraint_class_init (ClutterBindConstraintClass *klass)
meta_class->set_actor = clutter_bind_constraint_set_actor; meta_class->set_actor = clutter_bind_constraint_set_actor;
constraint_class->update_allocation = clutter_bind_constraint_update_allocation; constraint_class->update_allocation = clutter_bind_constraint_update_allocation;
constraint_class->update_preferred_size = clutter_bind_constraint_update_preferred_size;
/** /**
* ClutterBindConstraint:source: * ClutterBindConstraint:source:
* *

View File

@@ -235,7 +235,8 @@ clutter_binding_pool_finalize (GObject *gobject)
g_hash_table_destroy (pool->entries_hash); g_hash_table_destroy (pool->entries_hash);
g_slist_free_full (pool->entries, (GDestroyNotify) binding_entry_free); g_slist_foreach (pool->entries, (GFunc) binding_entry_free, NULL);
g_slist_free (pool->entries);
G_OBJECT_CLASS (clutter_binding_pool_parent_class)->finalize (gobject); G_OBJECT_CLASS (clutter_binding_pool_parent_class)->finalize (gobject);
} }

View File

@@ -99,8 +99,7 @@ G_DEFINE_TYPE (ClutterBlurEffect,
CLUTTER_TYPE_OFFSCREEN_EFFECT); CLUTTER_TYPE_OFFSCREEN_EFFECT);
static gboolean static gboolean
clutter_blur_effect_pre_paint (ClutterEffect *effect, clutter_blur_effect_pre_paint (ClutterEffect *effect)
ClutterPaintContext *paint_context)
{ {
ClutterBlurEffect *self = CLUTTER_BLUR_EFFECT (effect); ClutterBlurEffect *self = CLUTTER_BLUR_EFFECT (effect);
ClutterEffectClass *parent_class; ClutterEffectClass *parent_class;
@@ -125,7 +124,7 @@ clutter_blur_effect_pre_paint (ClutterEffect *effect,
} }
parent_class = CLUTTER_EFFECT_CLASS (clutter_blur_effect_parent_class); parent_class = CLUTTER_EFFECT_CLASS (clutter_blur_effect_parent_class);
if (parent_class->pre_paint (effect, paint_context)) if (parent_class->pre_paint (effect))
{ {
ClutterOffscreenEffect *offscreen_effect = ClutterOffscreenEffect *offscreen_effect =
CLUTTER_OFFSCREEN_EFFECT (effect); CLUTTER_OFFSCREEN_EFFECT (effect);
@@ -158,12 +157,10 @@ clutter_blur_effect_pre_paint (ClutterEffect *effect,
} }
static void static void
clutter_blur_effect_paint_target (ClutterOffscreenEffect *effect, clutter_blur_effect_paint_target (ClutterOffscreenEffect *effect)
ClutterPaintContext *paint_context)
{ {
ClutterBlurEffect *self = CLUTTER_BLUR_EFFECT (effect); ClutterBlurEffect *self = CLUTTER_BLUR_EFFECT (effect);
CoglFramebuffer *framebuffer = CoglFramebuffer *framebuffer = cogl_get_draw_framebuffer ();
clutter_paint_context_get_framebuffer (paint_context);
guint8 paint_opacity; guint8 paint_opacity;
paint_opacity = clutter_actor_get_paint_opacity (self->actor); paint_opacity = clutter_actor_get_paint_opacity (self->actor);
@@ -181,11 +178,11 @@ clutter_blur_effect_paint_target (ClutterOffscreenEffect *effect,
} }
static gboolean static gboolean
clutter_blur_effect_modify_paint_volume (ClutterEffect *effect, clutter_blur_effect_get_paint_volume (ClutterEffect *effect,
ClutterPaintVolume *volume) ClutterPaintVolume *volume)
{ {
gfloat cur_width, cur_height; gfloat cur_width, cur_height;
graphene_point3d_t origin; ClutterVertex origin;
clutter_paint_volume_get_origin (volume, &origin); clutter_paint_volume_get_origin (volume, &origin);
cur_width = clutter_paint_volume_get_width (volume); cur_width = clutter_paint_volume_get_width (volume);
@@ -226,7 +223,7 @@ clutter_blur_effect_class_init (ClutterBlurEffectClass *klass)
gobject_class->dispose = clutter_blur_effect_dispose; gobject_class->dispose = clutter_blur_effect_dispose;
effect_class->pre_paint = clutter_blur_effect_pre_paint; effect_class->pre_paint = clutter_blur_effect_pre_paint;
effect_class->modify_paint_volume = clutter_blur_effect_modify_paint_volume; effect_class->get_paint_volume = clutter_blur_effect_get_paint_volume;
offscreen_class = CLUTTER_OFFSCREEN_EFFECT_CLASS (klass); offscreen_class = CLUTTER_OFFSCREEN_EFFECT_CLASS (klass);
offscreen_class->paint_target = clutter_blur_effect_paint_target; offscreen_class->paint_target = clutter_blur_effect_paint_target;
@@ -252,7 +249,9 @@ clutter_blur_effect_init (ClutterBlurEffect *self)
cogl_pipeline_add_layer_snippet (klass->base_pipeline, 0, snippet); cogl_pipeline_add_layer_snippet (klass->base_pipeline, 0, snippet);
cogl_object_unref (snippet); cogl_object_unref (snippet);
cogl_pipeline_set_layer_null_texture (klass->base_pipeline, 0); cogl_pipeline_set_layer_null_texture (klass->base_pipeline,
0, /* layer number */
COGL_TEXTURE_TYPE_2D);
} }
self->pipeline = cogl_pipeline_copy (klass->base_pipeline); self->pipeline = cogl_pipeline_copy (klass->base_pipeline);

File diff suppressed because it is too large Load Diff

View File

@@ -105,6 +105,64 @@ void clutter_box_layout_set_pack_start (ClutterBoxLayou
CLUTTER_EXPORT CLUTTER_EXPORT
gboolean clutter_box_layout_get_pack_start (ClutterBoxLayout *layout); gboolean clutter_box_layout_get_pack_start (ClutterBoxLayout *layout);
CLUTTER_DEPRECATED_FOR(clutter_box_layout_set_orientation)
void clutter_box_layout_set_vertical (ClutterBoxLayout *layout,
gboolean vertical);
CLUTTER_DEPRECATED_FOR(clutter_box_layout_get_orientation)
gboolean clutter_box_layout_get_vertical (ClutterBoxLayout *layout);
CLUTTER_EXPORT
void clutter_box_layout_pack (ClutterBoxLayout *layout,
ClutterActor *actor,
gboolean expand,
gboolean x_fill,
gboolean y_fill,
ClutterBoxAlignment x_align,
ClutterBoxAlignment y_align);
CLUTTER_DEPRECATED
void clutter_box_layout_set_alignment (ClutterBoxLayout *layout,
ClutterActor *actor,
ClutterBoxAlignment x_align,
ClutterBoxAlignment y_align);
CLUTTER_DEPRECATED
void clutter_box_layout_get_alignment (ClutterBoxLayout *layout,
ClutterActor *actor,
ClutterBoxAlignment *x_align,
ClutterBoxAlignment *y_align);
CLUTTER_DEPRECATED
void clutter_box_layout_set_fill (ClutterBoxLayout *layout,
ClutterActor *actor,
gboolean x_fill,
gboolean y_fill);
CLUTTER_DEPRECATED
void clutter_box_layout_get_fill (ClutterBoxLayout *layout,
ClutterActor *actor,
gboolean *x_fill,
gboolean *y_fill);
CLUTTER_DEPRECATED
void clutter_box_layout_set_expand (ClutterBoxLayout *layout,
ClutterActor *actor,
gboolean expand);
CLUTTER_DEPRECATED
gboolean clutter_box_layout_get_expand (ClutterBoxLayout *layout,
ClutterActor *actor);
CLUTTER_DEPRECATED
void clutter_box_layout_set_use_animations (ClutterBoxLayout *layout,
gboolean animate);
CLUTTER_DEPRECATED
gboolean clutter_box_layout_get_use_animations (ClutterBoxLayout *layout);
CLUTTER_DEPRECATED
void clutter_box_layout_set_easing_mode (ClutterBoxLayout *layout,
gulong mode);
CLUTTER_DEPRECATED
gulong clutter_box_layout_get_easing_mode (ClutterBoxLayout *layout);
CLUTTER_DEPRECATED
void clutter_box_layout_set_easing_duration (ClutterBoxLayout *layout,
guint msecs);
CLUTTER_DEPRECATED
guint clutter_box_layout_get_easing_duration (ClutterBoxLayout *layout);
G_END_DECLS G_END_DECLS
#endif /* __CLUTTER_BOX_LAYOUT_H__ */ #endif /* __CLUTTER_BOX_LAYOUT_H__ */

View File

@@ -121,17 +121,16 @@ G_DEFINE_TYPE (ClutterBrightnessContrastEffect,
static gboolean static gboolean
will_have_no_effect (ClutterBrightnessContrastEffect *self) will_have_no_effect (ClutterBrightnessContrastEffect *self)
{ {
return (G_APPROX_VALUE (self->brightness_red, no_change, FLT_EPSILON) && return (self->brightness_red == no_change &&
G_APPROX_VALUE (self->brightness_green, no_change, FLT_EPSILON) && self->brightness_green == no_change &&
G_APPROX_VALUE (self->brightness_blue, no_change, FLT_EPSILON) && self->brightness_blue == no_change &&
G_APPROX_VALUE (self->contrast_red, no_change, FLT_EPSILON) && self->contrast_red == no_change &&
G_APPROX_VALUE (self->contrast_green, no_change, FLT_EPSILON) && self->contrast_green == no_change &&
G_APPROX_VALUE (self->contrast_blue, no_change, FLT_EPSILON)); self->contrast_blue == no_change);
} }
static gboolean static gboolean
clutter_brightness_contrast_effect_pre_paint (ClutterEffect *effect, clutter_brightness_contrast_effect_pre_paint (ClutterEffect *effect)
ClutterPaintContext *paint_context)
{ {
ClutterBrightnessContrastEffect *self = CLUTTER_BRIGHTNESS_CONTRAST_EFFECT (effect); ClutterBrightnessContrastEffect *self = CLUTTER_BRIGHTNESS_CONTRAST_EFFECT (effect);
ClutterEffectClass *parent_class; ClutterEffectClass *parent_class;
@@ -157,7 +156,7 @@ clutter_brightness_contrast_effect_pre_paint (ClutterEffect *effect,
parent_class = parent_class =
CLUTTER_EFFECT_CLASS (clutter_brightness_contrast_effect_parent_class); CLUTTER_EFFECT_CLASS (clutter_brightness_contrast_effect_parent_class);
if (parent_class->pre_paint (effect, paint_context)) if (parent_class->pre_paint (effect))
{ {
ClutterOffscreenEffect *offscreen_effect = ClutterOffscreenEffect *offscreen_effect =
CLUTTER_OFFSCREEN_EFFECT (effect); CLUTTER_OFFSCREEN_EFFECT (effect);
@@ -176,12 +175,10 @@ clutter_brightness_contrast_effect_pre_paint (ClutterEffect *effect,
} }
static void static void
clutter_brightness_contrast_effect_paint_target (ClutterOffscreenEffect *effect, clutter_brightness_contrast_effect_paint_target (ClutterOffscreenEffect *effect)
ClutterPaintContext *paint_context)
{ {
ClutterBrightnessContrastEffect *self = CLUTTER_BRIGHTNESS_CONTRAST_EFFECT (effect); ClutterBrightnessContrastEffect *self = CLUTTER_BRIGHTNESS_CONTRAST_EFFECT (effect);
CoglFramebuffer *framebuffer = CoglFramebuffer *framebuffer = cogl_get_draw_framebuffer ();
clutter_paint_context_get_framebuffer (paint_context);
ClutterActor *actor; ClutterActor *actor;
guint8 paint_opacity; guint8 paint_opacity;
@@ -441,7 +438,9 @@ clutter_brightness_contrast_effect_init (ClutterBrightnessContrastEffect *self)
cogl_pipeline_add_snippet (klass->base_pipeline, snippet); cogl_pipeline_add_snippet (klass->base_pipeline, snippet);
cogl_object_unref (snippet); cogl_object_unref (snippet);
cogl_pipeline_set_layer_null_texture (klass->base_pipeline, 0); cogl_pipeline_set_layer_null_texture (klass->base_pipeline,
0, /* layer number */
COGL_TEXTURE_TYPE_2D);
} }
self->pipeline = cogl_pipeline_copy (klass->base_pipeline); self->pipeline = cogl_pipeline_copy (klass->base_pipeline);
@@ -497,9 +496,9 @@ clutter_brightness_contrast_effect_set_brightness_full (ClutterBrightnessContras
{ {
g_return_if_fail (CLUTTER_IS_BRIGHTNESS_CONTRAST_EFFECT (effect)); g_return_if_fail (CLUTTER_IS_BRIGHTNESS_CONTRAST_EFFECT (effect));
if (G_APPROX_VALUE (red, effect->brightness_red, FLT_EPSILON) && if (red == effect->brightness_red &&
G_APPROX_VALUE (green, effect->brightness_green, FLT_EPSILON) && green == effect->brightness_green &&
G_APPROX_VALUE (blue, effect->brightness_blue, FLT_EPSILON)) blue == effect->brightness_blue)
return; return;
effect->brightness_red = red; effect->brightness_red = red;
@@ -587,9 +586,9 @@ clutter_brightness_contrast_effect_set_contrast_full (ClutterBrightnessContrastE
{ {
g_return_if_fail (CLUTTER_IS_BRIGHTNESS_CONTRAST_EFFECT (effect)); g_return_if_fail (CLUTTER_IS_BRIGHTNESS_CONTRAST_EFFECT (effect));
if (G_APPROX_VALUE (red, effect->contrast_red, FLT_EPSILON) && if (red == effect->contrast_red &&
G_APPROX_VALUE (green, effect->contrast_green, FLT_EPSILON) && green == effect->contrast_green &&
G_APPROX_VALUE (blue, effect->contrast_blue, FLT_EPSILON)) blue == effect->contrast_blue)
return; return;
effect->contrast_red = red; effect->contrast_red = red;

View File

@@ -44,7 +44,6 @@
#include "clutter-build-config.h" #include "clutter-build-config.h"
#include <math.h>
#include <cogl/cogl.h> #include <cogl/cogl.h>
#include <cairo-gobject.h> #include <cairo-gobject.h>
@@ -70,7 +69,6 @@ struct _ClutterCanvasPrivate
int width; int width;
int height; int height;
float scale_factor;
CoglTexture *texture; CoglTexture *texture;
gboolean dirty; gboolean dirty;
@@ -84,7 +82,6 @@ enum
PROP_WIDTH, PROP_WIDTH,
PROP_HEIGHT, PROP_HEIGHT,
PROP_SCALE_FACTOR,
LAST_PROP LAST_PROP
}; };
@@ -181,19 +178,6 @@ clutter_canvas_set_property (GObject *gobject,
} }
break; break;
case PROP_SCALE_FACTOR:
{
gfloat new_scale_factor = g_value_get_float (value);
if (priv->scale_factor != new_scale_factor)
{
priv->scale_factor = new_scale_factor;
clutter_content_invalidate (CLUTTER_CONTENT (gobject));
}
}
break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);
break; break;
@@ -218,10 +202,6 @@ clutter_canvas_get_property (GObject *gobject,
g_value_set_int (value, priv->height); g_value_set_int (value, priv->height);
break; break;
case PROP_SCALE_FACTOR:
g_value_set_float (value, priv->scale_factor);
break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);
break; break;
@@ -265,19 +245,6 @@ clutter_canvas_class_init (ClutterCanvasClass *klass)
G_PARAM_READWRITE | G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS); G_PARAM_STATIC_STRINGS);
/**
* ClutterCanvas:scale-factor:
*
* The height of the canvas.
*/
obj_props[PROP_SCALE_FACTOR] =
g_param_spec_float ("scale-factor",
P_("Scale Factor"),
P_("The Scale factor of the canvas"),
0.01f, G_MAXFLOAT,
1.0f,
G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS);
/** /**
* ClutterCanvas::draw: * ClutterCanvas::draw:
@@ -324,14 +291,12 @@ clutter_canvas_init (ClutterCanvas *self)
self->priv->width = -1; self->priv->width = -1;
self->priv->height = -1; self->priv->height = -1;
self->priv->scale_factor = 1.0f;
} }
static void static void
clutter_canvas_paint_content (ClutterContent *content, clutter_canvas_paint_content (ClutterContent *content,
ClutterActor *actor, ClutterActor *actor,
ClutterPaintNode *root, ClutterPaintNode *root)
ClutterPaintContext *paint_context)
{ {
ClutterCanvas *self = CLUTTER_CANVAS (content); ClutterCanvas *self = CLUTTER_CANVAS (content);
ClutterCanvasPrivate *priv = self->priv; ClutterCanvasPrivate *priv = self->priv;
@@ -352,7 +317,7 @@ clutter_canvas_paint_content (ClutterContent *content,
return; return;
node = clutter_actor_create_texture_paint_node (actor, priv->texture); node = clutter_actor_create_texture_paint_node (actor, priv->texture);
clutter_paint_node_set_static_name (node, "Canvas Content"); clutter_paint_node_set_name (node, "Canvas Content");
clutter_paint_node_add_child (root, node); clutter_paint_node_add_child (root, node);
clutter_paint_node_unref (node); clutter_paint_node_unref (node);
@@ -375,8 +340,8 @@ clutter_canvas_emit_draw (ClutterCanvas *self)
priv->dirty = TRUE; priv->dirty = TRUE;
real_width = ceilf (priv->width * priv->scale_factor); real_width = priv->width;
real_height = ceilf (priv->height * priv->scale_factor); real_height = priv->height;
CLUTTER_NOTE (MISC, "Creating Cairo surface with size %d x %d", CLUTTER_NOTE (MISC, "Creating Cairo surface with size %d x %d",
priv->width, priv->height); priv->width, priv->height);
@@ -422,10 +387,6 @@ clutter_canvas_emit_draw (ClutterCanvas *self)
mapped_buffer = FALSE; mapped_buffer = FALSE;
} }
cairo_surface_set_device_scale (surface,
priv->scale_factor,
priv->scale_factor);
self->priv->cr = cr = cairo_create (surface); self->priv->cr = cr = cairo_create (surface);
g_signal_emit (self, canvas_signals[DRAW], 0, g_signal_emit (self, canvas_signals[DRAW], 0,
@@ -487,10 +448,10 @@ clutter_canvas_get_preferred_size (ClutterContent *content,
return FALSE; return FALSE;
if (width != NULL) if (width != NULL)
*width = ceilf (priv->width * priv->scale_factor); *width = priv->width;
if (height != NULL) if (height != NULL)
*height = ceilf (priv->height * priv->scale_factor); *height = priv->height;
return TRUE; return TRUE;
} }
@@ -599,48 +560,3 @@ clutter_canvas_set_size (ClutterCanvas *canvas,
return clutter_canvas_invalidate_internal (canvas, width, height); return clutter_canvas_invalidate_internal (canvas, width, height);
} }
/**
* clutter_canvas_set_scale_factor:
* @canvas: a #ClutterCanvas
* @scale: the integer scaling factor of the canvas
*
* Sets the scaling factor of the @canvas, and invalidates the content.
*
* This function will cause the @canvas to be invalidated only
* if the scale factor of the canvas surface has changed.
*/
void
clutter_canvas_set_scale_factor (ClutterCanvas *canvas,
float scale)
{
g_return_if_fail (CLUTTER_IS_CANVAS (canvas));
g_return_if_fail (scale > 0.0f);
if (canvas->priv->scale_factor != scale)
{
canvas->priv->scale_factor = scale;
g_object_freeze_notify (G_OBJECT (canvas));
clutter_content_invalidate (CLUTTER_CONTENT (canvas));
g_object_thaw_notify (G_OBJECT (canvas));
g_object_notify_by_pspec (G_OBJECT (canvas), obj_props[PROP_SCALE_FACTOR]);
}
}
/**
* clutter_canvas_get_scale_factor:
* @canvas: a #ClutterCanvas
*
* Gets the scale factor of the @canvas.
*
* Return value: the current @canvas scale factor or -1 if invalid
*/
float
clutter_canvas_get_scale_factor (ClutterCanvas *canvas)
{
g_return_val_if_fail (CLUTTER_IS_CANVAS (canvas), -1.0f);
return canvas->priv->scale_factor;
}

View File

@@ -97,9 +97,9 @@ gboolean clutter_canvas_set_size (ClutterCanvas *
CLUTTER_EXPORT CLUTTER_EXPORT
void clutter_canvas_set_scale_factor (ClutterCanvas *canvas, void clutter_canvas_set_scale_factor (ClutterCanvas *canvas,
float scale); int scale);
CLUTTER_EXPORT CLUTTER_EXPORT
float clutter_canvas_get_scale_factor (ClutterCanvas *canvas); int clutter_canvas_get_scale_factor (ClutterCanvas *canvas);
G_END_DECLS G_END_DECLS

View File

@@ -105,8 +105,8 @@ struct _ClutterClickActionPrivate
{ {
ClutterActor *stage; ClutterActor *stage;
gulong event_id; guint event_id;
gulong capture_id; guint capture_id;
guint long_press_id; guint long_press_id;
gint long_press_threshold; gint long_press_threshold;
@@ -159,8 +159,7 @@ static inline void
click_action_set_pressed (ClutterClickAction *action, click_action_set_pressed (ClutterClickAction *action,
gboolean is_pressed) gboolean is_pressed)
{ {
ClutterClickActionPrivate *priv = ClutterClickActionPrivate *priv = action->priv;
clutter_click_action_get_instance_private (action);
is_pressed = !!is_pressed; is_pressed = !!is_pressed;
@@ -175,8 +174,7 @@ static inline void
click_action_set_held (ClutterClickAction *action, click_action_set_held (ClutterClickAction *action,
gboolean is_held) gboolean is_held)
{ {
ClutterClickActionPrivate *priv = ClutterClickActionPrivate *priv = action->priv;
clutter_click_action_get_instance_private (action);
is_held = !!is_held; is_held = !!is_held;
@@ -191,8 +189,7 @@ static gboolean
click_action_emit_long_press (gpointer data) click_action_emit_long_press (gpointer data)
{ {
ClutterClickAction *action = data; ClutterClickAction *action = data;
ClutterClickActionPrivate *priv = ClutterClickActionPrivate *priv = action->priv;
clutter_click_action_get_instance_private (action);
ClutterActor *actor; ClutterActor *actor;
gboolean result; gboolean result;
@@ -205,7 +202,11 @@ click_action_emit_long_press (gpointer data)
CLUTTER_LONG_PRESS_ACTIVATE, CLUTTER_LONG_PRESS_ACTIVATE,
&result); &result);
g_clear_signal_handler (&priv->capture_id, priv->stage); if (priv->capture_id != 0)
{
g_signal_handler_disconnect (priv->stage, priv->capture_id);
priv->capture_id = 0;
}
click_action_set_pressed (action, FALSE); click_action_set_pressed (action, FALSE);
click_action_set_held (action, FALSE); click_action_set_held (action, FALSE);
@@ -216,8 +217,7 @@ click_action_emit_long_press (gpointer data)
static inline void static inline void
click_action_query_long_press (ClutterClickAction *action) click_action_query_long_press (ClutterClickAction *action)
{ {
ClutterClickActionPrivate *priv = ClutterClickActionPrivate *priv = action->priv;
clutter_click_action_get_instance_private (action);
ClutterActor *actor; ClutterActor *actor;
gboolean result = FALSE; gboolean result = FALSE;
gint timeout; gint timeout;
@@ -242,7 +242,6 @@ click_action_query_long_press (ClutterClickAction *action)
if (result) if (result)
{ {
g_clear_handle_id (&priv->long_press_id, g_source_remove);
priv->long_press_id = priv->long_press_id =
clutter_threads_add_timeout (timeout, clutter_threads_add_timeout (timeout,
click_action_emit_long_press, click_action_emit_long_press,
@@ -253,8 +252,7 @@ click_action_query_long_press (ClutterClickAction *action)
static inline void static inline void
click_action_cancel_long_press (ClutterClickAction *action) click_action_cancel_long_press (ClutterClickAction *action)
{ {
ClutterClickActionPrivate *priv = ClutterClickActionPrivate *priv = action->priv;
clutter_click_action_get_instance_private (action);
if (priv->long_press_id != 0) if (priv->long_press_id != 0)
{ {
@@ -263,7 +261,8 @@ click_action_cancel_long_press (ClutterClickAction *action)
actor = clutter_actor_meta_get_actor (CLUTTER_ACTOR_META (action)); actor = clutter_actor_meta_get_actor (CLUTTER_ACTOR_META (action));
g_clear_handle_id (&priv->long_press_id, g_source_remove); g_source_remove (priv->long_press_id);
priv->long_press_id = 0;
g_signal_emit (action, click_signals[LONG_PRESS], 0, g_signal_emit (action, click_signals[LONG_PRESS], 0,
actor, actor,
@@ -277,8 +276,7 @@ on_event (ClutterActor *actor,
ClutterEvent *event, ClutterEvent *event,
ClutterClickAction *action) ClutterClickAction *action)
{ {
ClutterClickActionPrivate *priv = ClutterClickActionPrivate *priv = action->priv;
clutter_click_action_get_instance_private (action);
gboolean has_button = TRUE; gboolean has_button = TRUE;
if (!clutter_actor_meta_get_enabled (CLUTTER_ACTOR_META (action))) if (!clutter_actor_meta_get_enabled (CLUTTER_ACTOR_META (action)))
@@ -348,8 +346,7 @@ on_captured_event (ClutterActor *stage,
ClutterEvent *event, ClutterEvent *event,
ClutterClickAction *action) ClutterClickAction *action)
{ {
ClutterClickActionPrivate *priv = ClutterClickActionPrivate *priv = action->priv;
clutter_click_action_get_instance_private (action);
ClutterActor *actor; ClutterActor *actor;
ClutterModifierType modifier_state; ClutterModifierType modifier_state;
gboolean has_button = TRUE; gboolean has_button = TRUE;
@@ -358,10 +355,6 @@ on_captured_event (ClutterActor *stage,
switch (clutter_event_type (event)) switch (clutter_event_type (event))
{ {
case CLUTTER_TOUCH_CANCEL:
clutter_click_action_release (action);
break;
case CLUTTER_TOUCH_END: case CLUTTER_TOUCH_END:
has_button = FALSE; has_button = FALSE;
case CLUTTER_BUTTON_RELEASE: case CLUTTER_BUTTON_RELEASE:
@@ -378,9 +371,17 @@ on_captured_event (ClutterActor *stage,
click_action_cancel_long_press (action); click_action_cancel_long_press (action);
/* disconnect the capture */ /* disconnect the capture */
g_clear_signal_handler (&priv->capture_id, priv->stage); if (priv->capture_id != 0)
{
g_signal_handler_disconnect (priv->stage, priv->capture_id);
priv->capture_id = 0;
}
g_clear_handle_id (&priv->long_press_id, g_source_remove); if (priv->long_press_id != 0)
{
g_source_remove (priv->long_press_id);
priv->long_press_id = 0;
}
if (!clutter_actor_contains (actor, clutter_event_get_source (event))) if (!clutter_actor_contains (actor, clutter_event_get_source (event)))
return CLUTTER_EVENT_PROPAGATE; return CLUTTER_EVENT_PROPAGATE;
@@ -441,15 +442,14 @@ clutter_click_action_set_actor (ClutterActorMeta *meta,
ClutterActor *actor) ClutterActor *actor)
{ {
ClutterClickAction *action = CLUTTER_CLICK_ACTION (meta); ClutterClickAction *action = CLUTTER_CLICK_ACTION (meta);
ClutterClickActionPrivate *priv = ClutterClickActionPrivate *priv = action->priv;
clutter_click_action_get_instance_private (action);
if (priv->event_id != 0) if (priv->event_id != 0)
{ {
ClutterActor *old_actor = clutter_actor_meta_get_actor (meta); ClutterActor *old_actor = clutter_actor_meta_get_actor (meta);
if (old_actor != NULL) if (old_actor != NULL)
g_clear_signal_handler (&priv->event_id, old_actor); g_signal_handler_disconnect (old_actor, priv->event_id);
priv->event_id = 0; priv->event_id = 0;
} }
@@ -457,13 +457,17 @@ clutter_click_action_set_actor (ClutterActorMeta *meta,
if (priv->capture_id != 0) if (priv->capture_id != 0)
{ {
if (priv->stage != NULL) if (priv->stage != NULL)
g_clear_signal_handler (&priv->capture_id, priv->stage); g_signal_handler_disconnect (priv->stage, priv->capture_id);
priv->capture_id = 0; priv->capture_id = 0;
priv->stage = NULL; priv->stage = NULL;
} }
g_clear_handle_id (&priv->long_press_id, g_source_remove); if (priv->long_press_id != 0)
{
g_source_remove (priv->long_press_id);
priv->long_press_id = 0;
}
click_action_set_pressed (action, FALSE); click_action_set_pressed (action, FALSE);
click_action_set_held (action, FALSE); click_action_set_held (action, FALSE);
@@ -476,28 +480,13 @@ clutter_click_action_set_actor (ClutterActorMeta *meta,
CLUTTER_ACTOR_META_CLASS (clutter_click_action_parent_class)->set_actor (meta, actor); CLUTTER_ACTOR_META_CLASS (clutter_click_action_parent_class)->set_actor (meta, actor);
} }
static void
clutter_click_action_set_enabled (ClutterActorMeta *meta,
gboolean is_enabled)
{
ClutterClickAction *click_action = CLUTTER_CLICK_ACTION (meta);
ClutterActorMetaClass *parent_class =
CLUTTER_ACTOR_META_CLASS (clutter_click_action_parent_class);
if (!is_enabled)
clutter_click_action_release (click_action);
parent_class->set_enabled (meta, is_enabled);
}
static void static void
clutter_click_action_set_property (GObject *gobject, clutter_click_action_set_property (GObject *gobject,
guint prop_id, guint prop_id,
const GValue *value, const GValue *value,
GParamSpec *pspec) GParamSpec *pspec)
{ {
ClutterClickActionPrivate *priv = ClutterClickActionPrivate *priv = CLUTTER_CLICK_ACTION (gobject)->priv;
clutter_click_action_get_instance_private (CLUTTER_CLICK_ACTION (gobject));
switch (prop_id) switch (prop_id)
{ {
@@ -521,8 +510,7 @@ clutter_click_action_get_property (GObject *gobject,
GValue *value, GValue *value,
GParamSpec *pspec) GParamSpec *pspec)
{ {
ClutterClickActionPrivate *priv = ClutterClickActionPrivate *priv = CLUTTER_CLICK_ACTION (gobject)->priv;
clutter_click_action_get_instance_private (CLUTTER_CLICK_ACTION (gobject));
switch (prop_id) switch (prop_id)
{ {
@@ -551,15 +539,26 @@ clutter_click_action_get_property (GObject *gobject,
static void static void
clutter_click_action_dispose (GObject *gobject) clutter_click_action_dispose (GObject *gobject)
{ {
ClutterClickActionPrivate *priv = ClutterClickActionPrivate *priv = CLUTTER_CLICK_ACTION (gobject)->priv;
clutter_click_action_get_instance_private (CLUTTER_CLICK_ACTION (gobject));
g_clear_signal_handler (&priv->event_id, if (priv->event_id)
clutter_actor_meta_get_actor (CLUTTER_ACTOR_META (gobject))); {
g_signal_handler_disconnect (clutter_actor_meta_get_actor (CLUTTER_ACTOR_META (gobject)),
priv->event_id);
priv->event_id = 0;
}
g_clear_signal_handler (&priv->capture_id, priv->stage); if (priv->capture_id)
{
g_signal_handler_disconnect (priv->stage, priv->capture_id);
priv->capture_id = 0;
}
g_clear_handle_id (&priv->long_press_id, g_source_remove); if (priv->long_press_id)
{
g_source_remove (priv->long_press_id);
priv->long_press_id = 0;
}
G_OBJECT_CLASS (clutter_click_action_parent_class)->dispose (gobject); G_OBJECT_CLASS (clutter_click_action_parent_class)->dispose (gobject);
} }
@@ -572,7 +571,6 @@ clutter_click_action_class_init (ClutterClickActionClass *klass)
ClutterActorMetaClass *meta_class = CLUTTER_ACTOR_META_CLASS (klass); ClutterActorMetaClass *meta_class = CLUTTER_ACTOR_META_CLASS (klass);
meta_class->set_actor = clutter_click_action_set_actor; meta_class->set_actor = clutter_click_action_set_actor;
meta_class->set_enabled = clutter_click_action_set_enabled;
gobject_class->dispose = clutter_click_action_dispose; gobject_class->dispose = clutter_click_action_dispose;
gobject_class->set_property = clutter_click_action_set_property; gobject_class->set_property = clutter_click_action_set_property;
@@ -664,7 +662,8 @@ clutter_click_action_class_init (ClutterClickActionClass *klass)
G_TYPE_FROM_CLASS (klass), G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST, G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (ClutterClickActionClass, clicked), G_STRUCT_OFFSET (ClutterClickActionClass, clicked),
NULL, NULL, NULL, NULL, NULL,
_clutter_marshal_VOID__OBJECT,
G_TYPE_NONE, 1, G_TYPE_NONE, 1,
CLUTTER_TYPE_ACTOR); CLUTTER_TYPE_ACTOR);
@@ -710,11 +709,9 @@ clutter_click_action_class_init (ClutterClickActionClass *klass)
static void static void
clutter_click_action_init (ClutterClickAction *self) clutter_click_action_init (ClutterClickAction *self)
{ {
ClutterClickActionPrivate *priv = self->priv = clutter_click_action_get_instance_private (self);
clutter_click_action_get_instance_private (self); self->priv->long_press_threshold = -1;
self->priv->long_press_duration = -1;
priv->long_press_threshold = -1;
priv->long_press_duration = -1;
} }
/** /**
@@ -754,13 +751,17 @@ clutter_click_action_release (ClutterClickAction *action)
g_return_if_fail (CLUTTER_IS_CLICK_ACTION (action)); g_return_if_fail (CLUTTER_IS_CLICK_ACTION (action));
priv = clutter_click_action_get_instance_private (action); priv = action->priv;
if (!priv->is_held) if (!priv->is_held)
return; return;
/* disconnect the capture */ /* disconnect the capture */
g_clear_signal_handler (&priv->capture_id, priv->stage); if (priv->capture_id != 0)
{
g_signal_handler_disconnect (priv->stage, priv->capture_id);
priv->capture_id = 0;
}
click_action_cancel_long_press (action); click_action_cancel_long_press (action);
click_action_set_held (action, FALSE); click_action_set_held (action, FALSE);
@@ -780,13 +781,9 @@ clutter_click_action_release (ClutterClickAction *action)
guint guint
clutter_click_action_get_button (ClutterClickAction *action) clutter_click_action_get_button (ClutterClickAction *action)
{ {
ClutterClickActionPrivate *priv;
g_return_val_if_fail (CLUTTER_IS_CLICK_ACTION (action), 0); g_return_val_if_fail (CLUTTER_IS_CLICK_ACTION (action), 0);
priv = clutter_click_action_get_instance_private (action); return action->priv->press_button;
return priv->press_button;
} }
/** /**
@@ -802,13 +799,9 @@ clutter_click_action_get_button (ClutterClickAction *action)
ClutterModifierType ClutterModifierType
clutter_click_action_get_state (ClutterClickAction *action) clutter_click_action_get_state (ClutterClickAction *action)
{ {
ClutterClickActionPrivate *priv;
g_return_val_if_fail (CLUTTER_IS_CLICK_ACTION (action), 0); g_return_val_if_fail (CLUTTER_IS_CLICK_ACTION (action), 0);
priv = clutter_click_action_get_instance_private (action); return action->priv->modifier_state;
return priv->modifier_state;
} }
/** /**
@@ -826,15 +819,11 @@ clutter_click_action_get_coords (ClutterClickAction *action,
gfloat *press_x, gfloat *press_x,
gfloat *press_y) gfloat *press_y)
{ {
ClutterClickActionPrivate *priv;
g_return_if_fail (CLUTTER_IS_ACTION (action)); g_return_if_fail (CLUTTER_IS_ACTION (action));
priv = clutter_click_action_get_instance_private (action);
if (press_x != NULL) if (press_x != NULL)
*press_x = priv->press_x; *press_x = action->priv->press_x;
if (press_y != NULL) if (press_y != NULL)
*press_y = priv->press_y; *press_y = action->priv->press_y;
} }

View File

@@ -37,13 +37,32 @@
G_BEGIN_DECLS G_BEGIN_DECLS
#define CLUTTER_TYPE_CLICK_ACTION (clutter_click_action_get_type ()) #define CLUTTER_TYPE_CLICK_ACTION (clutter_click_action_get_type ())
#define CLUTTER_CLICK_ACTION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), CLUTTER_TYPE_CLICK_ACTION, ClutterClickAction))
#define CLUTTER_IS_CLICK_ACTION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CLUTTER_TYPE_CLICK_ACTION))
#define CLUTTER_CLICK_ACTION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), CLUTTER_TYPE_CLICK_ACTION, ClutterClickActionClass))
#define CLUTTER_IS_CLICK_ACTION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), CLUTTER_TYPE_CLICK_ACTION))
#define CLUTTER_CLICK_ACTION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), CLUTTER_TYPE_CLICK_ACTION, ClutterClickActionClass))
CLUTTER_EXPORT typedef struct _ClutterClickAction ClutterClickAction;
G_DECLARE_DERIVABLE_TYPE (ClutterClickAction, clutter_click_action, typedef struct _ClutterClickActionPrivate ClutterClickActionPrivate;
CLUTTER, CLICK_ACTION, ClutterAction); typedef struct _ClutterClickActionClass ClutterClickActionClass;
typedef struct _ClutterClickActionPrivate ClutterClickActionPrivate; /**
* ClutterClickAction:
*
* The #ClutterClickAction structure contains
* only private data and should be accessed using the provided API
*
* Since: 1.4
*/
struct _ClutterClickAction
{
/*< private >*/
ClutterAction parent_instance;
ClutterClickActionPrivate *priv;
};
/** /**
* ClutterClickActionClass: * ClutterClickActionClass:
@@ -78,6 +97,9 @@ struct _ClutterClickActionClass
void (* _clutter_click_action7) (void); void (* _clutter_click_action7) (void);
}; };
CLUTTER_EXPORT
GType clutter_click_action_get_type (void) G_GNUC_CONST;
CLUTTER_EXPORT CLUTTER_EXPORT
ClutterAction * clutter_click_action_new (void); ClutterAction * clutter_click_action_new (void);

View File

@@ -152,8 +152,7 @@ clutter_clone_apply_transform (ClutterActor *self, CoglMatrix *matrix)
} }
static void static void
clutter_clone_paint (ClutterActor *actor, clutter_clone_paint (ClutterActor *actor)
ClutterPaintContext *paint_context)
{ {
ClutterClone *self = CLUTTER_CLONE (actor); ClutterClone *self = CLUTTER_CLONE (actor);
ClutterClonePrivate *priv = self->priv; ClutterClonePrivate *priv = self->priv;
@@ -190,7 +189,7 @@ clutter_clone_paint (ClutterActor *actor,
if (clutter_actor_is_realized (priv->clone_source)) if (clutter_actor_is_realized (priv->clone_source))
{ {
_clutter_actor_push_clone_paint (); _clutter_actor_push_clone_paint ();
clutter_actor_paint (priv->clone_source, paint_context); clutter_actor_paint (priv->clone_source);
_clutter_actor_pop_clone_paint (); _clutter_actor_pop_clone_paint ();
} }
@@ -240,25 +239,19 @@ clutter_clone_has_overlaps (ClutterActor *actor)
static void static void
clutter_clone_allocate (ClutterActor *self, clutter_clone_allocate (ClutterActor *self,
const ClutterActorBox *box) const ClutterActorBox *box,
ClutterAllocationFlags flags)
{ {
ClutterClonePrivate *priv = CLUTTER_CLONE (self)->priv; ClutterClonePrivate *priv = CLUTTER_CLONE (self)->priv;
ClutterActorClass *parent_class; ClutterActorClass *parent_class;
/* chain up */ /* chain up */
parent_class = CLUTTER_ACTOR_CLASS (clutter_clone_parent_class); parent_class = CLUTTER_ACTOR_CLASS (clutter_clone_parent_class);
parent_class->allocate (self, box); parent_class->allocate (self, box, flags);
if (priv->clone_source == NULL) if (priv->clone_source == NULL)
return; return;
/* ClutterActor delays allocating until the actor is shown; however
* we cannot paint it correctly in that case, so force an allocation.
*/
if (clutter_actor_get_parent (priv->clone_source) != NULL &&
!clutter_actor_has_allocation (priv->clone_source))
clutter_actor_allocate_preferred_size (priv->clone_source);
#if 0 #if 0
/* XXX - this is wrong: ClutterClone cannot clone unparented /* XXX - this is wrong: ClutterClone cannot clone unparented
* actors, as it will break all invariants * actors, as it will break all invariants
@@ -272,7 +265,7 @@ clutter_clone_allocate (ClutterActor *self,
* paint cycle, we can safely give it as much size as it requires * paint cycle, we can safely give it as much size as it requires
*/ */
if (clutter_actor_get_parent (priv->clone_source) == NULL) if (clutter_actor_get_parent (priv->clone_source) == NULL)
clutter_actor_allocate_preferred_size (priv->clone_source); clutter_actor_allocate_preferred_size (priv->clone_source, flags);
#endif #endif
} }
@@ -400,7 +393,8 @@ clutter_clone_set_source_internal (ClutterClone *self,
if (priv->clone_source != NULL) if (priv->clone_source != NULL)
{ {
g_clear_signal_handler (&priv->source_destroy_id, priv->clone_source); g_signal_handler_disconnect (priv->clone_source, priv->source_destroy_id);
priv->source_destroy_id = 0;
_clutter_actor_detach_clone (priv->clone_source, CLUTTER_ACTOR (self)); _clutter_actor_detach_clone (priv->clone_source, CLUTTER_ACTOR (self));
g_object_unref (priv->clone_source); g_object_unref (priv->clone_source);
priv->clone_source = NULL; priv->clone_source = NULL;

View File

@@ -105,8 +105,7 @@ G_DEFINE_TYPE (ClutterColorizeEffect,
CLUTTER_TYPE_OFFSCREEN_EFFECT); CLUTTER_TYPE_OFFSCREEN_EFFECT);
static gboolean static gboolean
clutter_colorize_effect_pre_paint (ClutterEffect *effect, clutter_colorize_effect_pre_paint (ClutterEffect *effect)
ClutterPaintContext *paint_context)
{ {
ClutterColorizeEffect *self = CLUTTER_COLORIZE_EFFECT (effect); ClutterColorizeEffect *self = CLUTTER_COLORIZE_EFFECT (effect);
ClutterEffectClass *parent_class; ClutterEffectClass *parent_class;
@@ -127,7 +126,7 @@ clutter_colorize_effect_pre_paint (ClutterEffect *effect,
} }
parent_class = CLUTTER_EFFECT_CLASS (clutter_colorize_effect_parent_class); parent_class = CLUTTER_EFFECT_CLASS (clutter_colorize_effect_parent_class);
if (parent_class->pre_paint (effect, paint_context)) if (parent_class->pre_paint (effect))
{ {
ClutterOffscreenEffect *offscreen_effect = ClutterOffscreenEffect *offscreen_effect =
CLUTTER_OFFSCREEN_EFFECT (effect); CLUTTER_OFFSCREEN_EFFECT (effect);
@@ -146,12 +145,10 @@ clutter_colorize_effect_pre_paint (ClutterEffect *effect,
} }
static void static void
clutter_colorize_effect_paint_target (ClutterOffscreenEffect *effect, clutter_colorize_effect_paint_target (ClutterOffscreenEffect *effect)
ClutterPaintContext *paint_context)
{ {
ClutterColorizeEffect *self = CLUTTER_COLORIZE_EFFECT (effect); ClutterColorizeEffect *self = CLUTTER_COLORIZE_EFFECT (effect);
CoglFramebuffer *framebuffer = CoglFramebuffer *framebuffer = cogl_get_draw_framebuffer ();
clutter_paint_context_get_framebuffer (paint_context);
ClutterActor *actor; ClutterActor *actor;
guint8 paint_opacity; guint8 paint_opacity;
@@ -296,7 +293,9 @@ clutter_colorize_effect_init (ClutterColorizeEffect *self)
cogl_pipeline_add_snippet (klass->base_pipeline, snippet); cogl_pipeline_add_snippet (klass->base_pipeline, snippet);
cogl_object_unref (snippet); cogl_object_unref (snippet);
cogl_pipeline_set_layer_null_texture (klass->base_pipeline, 0); cogl_pipeline_set_layer_null_texture (klass->base_pipeline,
0, /* layer number */
COGL_TEXTURE_TYPE_2D);
} }
self->pipeline = cogl_pipeline_copy (klass->base_pipeline); self->pipeline = cogl_pipeline_copy (klass->base_pipeline);

View File

@@ -9,13 +9,7 @@
G_BEGIN_DECLS G_BEGIN_DECLS
#mesondefine CLUTTER_HAS_WAYLAND_COMPOSITOR_SUPPORT @CLUTTER_CONFIG_DEFINES@
#mesondefine CLUTTER_WINDOWING_X11
#mesondefine CLUTTER_INPUT_X11
#mesondefine CLUTTER_WINDOWING_GLX
#mesondefine CLUTTER_WINDOWING_EGL
#mesondefine CLUTTER_INPUT_EVDEV
#mesondefine CLUTTER_INPUT_NULL
G_END_DECLS G_END_DECLS

View File

@@ -30,6 +30,13 @@ gboolean clutter_constraint_update_allocation (ClutterConstraint *constraint,
ClutterActor *actor, ClutterActor *actor,
ClutterActorBox *allocation); ClutterActorBox *allocation);
void clutter_constraint_update_preferred_size (ClutterConstraint *constraint,
ClutterActor *actor,
ClutterOrientation direction,
float for_size,
float *minimum_size,
float *natural_size);
G_END_DECLS G_END_DECLS
#endif /* __CLUTTER_CONSTRAINT_PRIVATE_H__ */ #endif /* __CLUTTER_CONSTRAINT_PRIVATE_H__ */

View File

@@ -48,7 +48,7 @@
* Constraints provide a way to build user interfaces by using * Constraints provide a way to build user interfaces by using
* relations between #ClutterActors, without explicit fixed * relations between #ClutterActors, without explicit fixed
* positioning and sizing, similarly to how fluid layout managers like * positioning and sizing, similarly to how fluid layout managers like
* #ClutterBoxLayout lay out their children. * #ClutterBoxLayout and #ClutterTableLayout lay out their children.
* *
* Constraints are attached to a #ClutterActor, and are available * Constraints are attached to a #ClutterActor, and are available
* for inspection using clutter_actor_get_constraints(). * for inspection using clutter_actor_get_constraints().
@@ -160,26 +160,28 @@ constraint_update_preferred_size (ClutterConstraint *constraint,
} }
static void static void
clutter_constraint_set_enabled (ClutterActorMeta *meta, clutter_constraint_notify (GObject *gobject,
gboolean is_enabled) GParamSpec *pspec)
{ {
ClutterActorMetaClass *parent_class = if (strcmp (pspec->name, "enabled") == 0)
CLUTTER_ACTOR_META_CLASS (clutter_constraint_parent_class); {
ClutterActor *actor; ClutterActorMeta *meta = CLUTTER_ACTOR_META (gobject);
ClutterActor *actor = clutter_actor_meta_get_actor (meta);
actor = clutter_actor_meta_get_actor (meta); if (actor != NULL)
if (actor) clutter_actor_queue_relayout (actor);
clutter_actor_queue_relayout (actor); }
parent_class->set_enabled (meta, is_enabled); if (G_OBJECT_CLASS (clutter_constraint_parent_class)->notify != NULL)
G_OBJECT_CLASS (clutter_constraint_parent_class)->notify (gobject, pspec);
} }
static void static void
clutter_constraint_class_init (ClutterConstraintClass *klass) clutter_constraint_class_init (ClutterConstraintClass *klass)
{ {
ClutterActorMetaClass *actor_meta_class = CLUTTER_ACTOR_META_CLASS (klass); GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
actor_meta_class->set_enabled = clutter_constraint_set_enabled; gobject_class->notify = clutter_constraint_notify;
klass->update_allocation = constraint_update_allocation; klass->update_allocation = constraint_update_allocation;
klass->update_preferred_size = constraint_update_preferred_size; klass->update_preferred_size = constraint_update_preferred_size;
@@ -220,17 +222,6 @@ clutter_constraint_update_allocation (ClutterConstraint *constraint,
return !clutter_actor_box_equal (allocation, &old_alloc); return !clutter_actor_box_equal (allocation, &old_alloc);
} }
/**
* clutter_constraint_update_preferred_size:
* @constraint: a #ClutterConstraint
* @actor: a #ClutterActor
* @direction: a #ClutterOrientation
* @for_size: the size in the opposite direction
* @minimum_size: (inout): the minimum size to modify
* @natural_size: (inout): the natural size to modify
*
* Asks the @constraint to update the size request of a #ClutterActor.
*/
void void
clutter_constraint_update_preferred_size (ClutterConstraint *constraint, clutter_constraint_update_preferred_size (ClutterConstraint *constraint,
ClutterActor *actor, ClutterActor *actor,

View File

@@ -99,14 +99,6 @@ struct _ClutterConstraintClass
CLUTTER_EXPORT CLUTTER_EXPORT
GType clutter_constraint_get_type (void) G_GNUC_CONST; GType clutter_constraint_get_type (void) G_GNUC_CONST;
CLUTTER_EXPORT
void clutter_constraint_update_preferred_size (ClutterConstraint *constraint,
ClutterActor *actor,
ClutterOrientation direction,
float for_size,
float *minimum_size,
float *natural_size);
/* ClutterActor API */ /* ClutterActor API */
CLUTTER_EXPORT CLUTTER_EXPORT
void clutter_actor_add_constraint (ClutterActor *self, void clutter_actor_add_constraint (ClutterActor *self,

View File

@@ -37,7 +37,6 @@
#include "clutter-actor-private.h" #include "clutter-actor-private.h"
#include "clutter-child-meta.h" #include "clutter-child-meta.h"
#include "clutter-container-private.h"
#include "clutter-debug.h" #include "clutter-debug.h"
#include "clutter-main.h" #include "clutter-main.h"
#include "clutter-marshal.h" #include "clutter-marshal.h"
@@ -119,6 +118,37 @@ container_real_remove (ClutterContainer *container,
clutter_actor_remove_child (CLUTTER_ACTOR (container), actor); clutter_actor_remove_child (CLUTTER_ACTOR (container), actor);
} }
typedef struct {
ClutterCallback callback;
gpointer data;
} ForeachClosure;
static gboolean
foreach_cb (ClutterActor *actor,
gpointer data)
{
ForeachClosure *clos = data;
clos->callback (actor, clos->data);
return TRUE;
}
static void
container_real_foreach (ClutterContainer *container,
ClutterCallback callback,
gpointer user_data)
{
ForeachClosure clos;
clos.callback = callback;
clos.data = user_data;
_clutter_actor_foreach_child (CLUTTER_ACTOR (container),
foreach_cb,
&clos);
}
static void static void
container_real_raise (ClutterContainer *container, container_real_raise (ClutterContainer *container,
ClutterActor *child, ClutterActor *child,
@@ -167,7 +197,8 @@ clutter_container_default_init (ClutterContainerInterface *iface)
iface_type, iface_type,
G_SIGNAL_RUN_FIRST, G_SIGNAL_RUN_FIRST,
G_STRUCT_OFFSET (ClutterContainerIface, actor_added), G_STRUCT_OFFSET (ClutterContainerIface, actor_added),
NULL, NULL, NULL, NULL, NULL,
_clutter_marshal_VOID__OBJECT,
G_TYPE_NONE, 1, G_TYPE_NONE, 1,
CLUTTER_TYPE_ACTOR); CLUTTER_TYPE_ACTOR);
/** /**
@@ -185,7 +216,8 @@ clutter_container_default_init (ClutterContainerInterface *iface)
iface_type, iface_type,
G_SIGNAL_RUN_FIRST, G_SIGNAL_RUN_FIRST,
G_STRUCT_OFFSET (ClutterContainerIface, actor_removed), G_STRUCT_OFFSET (ClutterContainerIface, actor_removed),
NULL, NULL, NULL, NULL, NULL,
_clutter_marshal_VOID__OBJECT,
G_TYPE_NONE, 1, G_TYPE_NONE, 1,
CLUTTER_TYPE_ACTOR); CLUTTER_TYPE_ACTOR);
@@ -213,6 +245,7 @@ clutter_container_default_init (ClutterContainerInterface *iface)
iface->add = container_real_add; iface->add = container_real_add;
iface->remove = container_real_remove; iface->remove = container_real_remove;
iface->foreach = container_real_foreach;
iface->raise = container_real_raise; iface->raise = container_real_raise;
iface->lower = container_real_lower; iface->lower = container_real_lower;
iface->sort_depth_order = container_real_sort_depth_order; iface->sort_depth_order = container_real_sort_depth_order;
@@ -385,6 +418,33 @@ clutter_container_add_actor (ClutterContainer *container,
container_add_actor (container, actor); container_add_actor (container, actor);
} }
/**
* clutter_container_add_valist: (skip)
* @container: a #ClutterContainer
* @first_actor: the first #ClutterActor to add
* @var_args: list of actors to add, followed by %NULL
*
* Alternative va_list version of clutter_container_add().
*
* This function will call #ClutterContainerIface.add(), which is a
* deprecated virtual function. The default implementation will
* call clutter_actor_add_child().
*
* Since: 0.4
*
* Deprecated: 1.10: Use clutter_actor_add_child() instead.
*/
void
clutter_container_add_valist (ClutterContainer *container,
ClutterActor *first_actor,
va_list var_args)
{
g_return_if_fail (CLUTTER_IS_CONTAINER (container));
g_return_if_fail (CLUTTER_IS_ACTOR (first_actor));
container_add_valist (container, first_actor, var_args);
}
/** /**
* clutter_container_remove: (skip) * clutter_container_remove: (skip)
* @container: a #ClutterContainer * @container: a #ClutterContainer
@@ -448,6 +508,42 @@ clutter_container_remove_actor (ClutterContainer *container,
container_remove_actor (container, actor); container_remove_actor (container, actor);
} }
/**
* clutter_container_remove_valist: (skip)
* @container: a #ClutterContainer
* @first_actor: the first #ClutterActor to add
* @var_args: list of actors to remove, followed by %NULL
*
* Alternative va_list version of clutter_container_remove().
*
* This function will call #ClutterContainerIface.remove(), which is a
* deprecated virtual function. The default implementation will call
* clutter_actor_remove_child().
*
* Since: 0.4
*
* Deprecated: 1.10: Use clutter_actor_remove_child() instead.
*/
void
clutter_container_remove_valist (ClutterContainer *container,
ClutterActor *first_actor,
va_list var_args)
{
g_return_if_fail (CLUTTER_IS_CONTAINER (container));
g_return_if_fail (CLUTTER_IS_ACTOR (first_actor));
container_remove_valist (container, first_actor, var_args);
}
static void
get_children_cb (ClutterActor *child,
gpointer data)
{
GList **children = data;
*children = g_list_prepend (*children, child);
}
/** /**
* clutter_container_get_children: * clutter_container_get_children:
* @container: a #ClutterContainer * @container: a #ClutterContainer
@@ -465,9 +561,108 @@ clutter_container_remove_actor (ClutterContainer *container,
GList * GList *
clutter_container_get_children (ClutterContainer *container) clutter_container_get_children (ClutterContainer *container)
{ {
GList *retval;
g_return_val_if_fail (CLUTTER_IS_CONTAINER (container), NULL); g_return_val_if_fail (CLUTTER_IS_CONTAINER (container), NULL);
return clutter_actor_get_children (CLUTTER_ACTOR (container)); retval = NULL;
clutter_container_foreach (container, get_children_cb, &retval);
return g_list_reverse (retval);
}
/**
* clutter_container_foreach:
* @container: a #ClutterContainer
* @callback: (scope call): a function to be called for each child
* @user_data: data to be passed to the function, or %NULL
*
* Calls @callback for each child of @container that was added
* by the application (with clutter_container_add_actor()). Does
* not iterate over "internal" children that are part of the
* container's own implementation, if any.
*
* This function calls the #ClutterContainerIface.foreach()
* virtual function, which has been deprecated.
*
* Since: 0.4
*
* Deprecated: 1.10: Use clutter_actor_get_first_child() or
* clutter_actor_get_last_child() to retrieve the beginning of
* the list of children, and clutter_actor_get_next_sibling()
* and clutter_actor_get_previous_sibling() to iterate over it;
* alternatively, use the #ClutterActorIter API.
*/
void
clutter_container_foreach (ClutterContainer *container,
ClutterCallback callback,
gpointer user_data)
{
g_return_if_fail (CLUTTER_IS_CONTAINER (container));
g_return_if_fail (callback != NULL);
#ifdef CLUTTER_ENABLE_DEBUG
if (G_UNLIKELY (_clutter_diagnostic_enabled ()))
{
ClutterContainerIface *iface = CLUTTER_CONTAINER_GET_IFACE (container);
if (iface->foreach != container_real_foreach)
_clutter_diagnostic_message ("The ClutterContainer::foreach() "
"virtual function has been deprecated "
"and it should not be overridden by "
"newly written code");
}
#endif /* CLUTTER_ENABLE_DEBUG */
CLUTTER_CONTAINER_GET_IFACE (container)->foreach (container,
callback,
user_data);
}
/**
* clutter_container_foreach_with_internals:
* @container: a #ClutterContainer
* @callback: (scope call): a function to be called for each child
* @user_data: data to be passed to the function, or %NULL
*
* Calls @callback for each child of @container, including "internal"
* children built in to the container itself that were never added
* by the application.
*
* This function calls the #ClutterContainerIface.foreach_with_internals()
* virtual function, which has been deprecated.
*
* Since: 1.0
*
* Deprecated: 1.10: See clutter_container_foreach().
*/
void
clutter_container_foreach_with_internals (ClutterContainer *container,
ClutterCallback callback,
gpointer user_data)
{
ClutterContainerIface *iface;
g_return_if_fail (CLUTTER_IS_CONTAINER (container));
g_return_if_fail (callback != NULL);
iface = CLUTTER_CONTAINER_GET_IFACE (container);
#ifdef CLUTTER_ENABLE_DEBUG
if (G_UNLIKELY (_clutter_diagnostic_enabled ()))
{
if (iface->foreach_with_internals != NULL)
_clutter_diagnostic_message ("The ClutterContainer::foreach_with_internals() "
"virtual function has been deprecated "
"and it should not be overridden by "
"newly written code");
}
#endif /* CLUTTER_ENABLE_DEBUG */
if (iface->foreach_with_internals != NULL)
iface->foreach_with_internals (container, callback, user_data);
else
iface->foreach (container, callback, user_data);
} }
/** /**
@@ -1251,23 +1446,3 @@ clutter_container_child_notify (ClutterContainer *container,
child, child,
pspec); pspec);
} }
void
_clutter_container_emit_actor_added (ClutterContainer *container,
ClutterActor *actor)
{
g_return_if_fail (CLUTTER_IS_CONTAINER (container));
g_return_if_fail (CLUTTER_IS_ACTOR (actor));
g_signal_emit (container, container_signals[ACTOR_ADDED], 0, actor);
}
void
_clutter_container_emit_actor_removed (ClutterContainer *container,
ClutterActor *actor)
{
g_return_if_fail (CLUTTER_IS_CONTAINER (container));
g_return_if_fail (CLUTTER_IS_ACTOR (actor));
g_signal_emit (container, container_signals[ACTOR_REMOVED], 0, actor);
}

View File

@@ -59,6 +59,14 @@ typedef struct _ClutterContainerIface ClutterContainerIface;
* function is deprecated, and it should not be overridden. * function is deprecated, and it should not be overridden.
* @remove: virtual function for removing an actor from the container. This * @remove: virtual function for removing an actor from the container. This
* virtual function is deprecated, and it should not be overridden. * virtual function is deprecated, and it should not be overridden.
* @foreach: virtual function for iterating over the container's children.
* This virtual function is deprecated, and it should not be overridden.
* @foreach_with_internals: virtual functions for iterating over the
* container's children, both added using the #ClutterContainer API
* and internal children. The implementation of this virtual function
* is required only if the #ClutterContainer implementation has
* internal children. This virtual function is deprecated, and it should
* not be overridden.
* @raise: virtual function for raising a child. This virtual function is * @raise: virtual function for raising a child. This virtual function is
* deprecated and it should not be overridden. * deprecated and it should not be overridden.
* @lower: virtual function for lowering a child. This virtual function is * @lower: virtual function for lowering a child. This virtual function is
@@ -80,7 +88,7 @@ typedef struct _ClutterContainerIface ClutterContainerIface;
* @actor_removed: class handler for #ClutterContainer::actor-removed * @actor_removed: class handler for #ClutterContainer::actor-removed
* @child_notify: class handler for #ClutterContainer::child-notify * @child_notify: class handler for #ClutterContainer::child-notify
* *
* Base interface for container actors. The @add and @remove * Base interface for container actors. The @add, @remove and @foreach
* virtual functions must be provided by any implementation; the other * virtual functions must be provided by any implementation; the other
* virtual functions are optional. * virtual functions are optional.
* *
@@ -96,6 +104,13 @@ struct _ClutterContainerIface
ClutterActor *actor); ClutterActor *actor);
void (* remove) (ClutterContainer *container, void (* remove) (ClutterContainer *container,
ClutterActor *actor); ClutterActor *actor);
void (* foreach) (ClutterContainer *container,
ClutterCallback callback,
gpointer user_data);
void (* foreach_with_internals) (ClutterContainer *container,
ClutterCallback callback,
gpointer user_data);
/* child stacking */ /* child stacking */
void (* raise) (ClutterContainer *container, void (* raise) (ClutterContainer *container,

View File

@@ -34,10 +34,9 @@ void _clutter_content_attached (ClutterContent *conte
void _clutter_content_detached (ClutterContent *content, void _clutter_content_detached (ClutterContent *content,
ClutterActor *actor); ClutterActor *actor);
void _clutter_content_paint_content (ClutterContent *content, void _clutter_content_paint_content (ClutterContent *content,
ClutterActor *actor, ClutterActor *actor,
ClutterPaintNode *node, ClutterPaintNode *node);
ClutterPaintContext *paint_context);
G_END_DECLS G_END_DECLS

View File

@@ -96,10 +96,9 @@ clutter_content_real_invalidate_size (ClutterContent *content)
} }
static void static void
clutter_content_real_paint_content (ClutterContent *content, clutter_content_real_paint_content (ClutterContent *content,
ClutterActor *actor, ClutterActor *actor,
ClutterPaintNode *context, ClutterPaintNode *context)
ClutterPaintContext *paint_context)
{ {
} }
@@ -130,7 +129,8 @@ clutter_content_default_init (ClutterContentInterface *iface)
G_TYPE_FROM_INTERFACE (iface), G_TYPE_FROM_INTERFACE (iface),
G_SIGNAL_RUN_FIRST, G_SIGNAL_RUN_FIRST,
G_STRUCT_OFFSET (ClutterContentInterface, attached), G_STRUCT_OFFSET (ClutterContentInterface, attached),
NULL, NULL, NULL, NULL, NULL,
_clutter_marshal_VOID__OBJECT,
G_TYPE_NONE, 1, G_TYPE_NONE, 1,
CLUTTER_TYPE_ACTOR); CLUTTER_TYPE_ACTOR);
@@ -149,7 +149,8 @@ clutter_content_default_init (ClutterContentInterface *iface)
G_TYPE_FROM_INTERFACE (iface), G_TYPE_FROM_INTERFACE (iface),
G_SIGNAL_RUN_FIRST, G_SIGNAL_RUN_FIRST,
G_STRUCT_OFFSET (ClutterContentInterface, detached), G_STRUCT_OFFSET (ClutterContentInterface, detached),
NULL, NULL, NULL, NULL, NULL,
_clutter_marshal_VOID__OBJECT,
G_TYPE_NONE, 1, G_TYPE_NONE, 1,
CLUTTER_TYPE_ACTOR); CLUTTER_TYPE_ACTOR);
} }
@@ -301,8 +302,7 @@ _clutter_content_detached (ClutterContent *content,
* _clutter_content_paint_content: * _clutter_content_paint_content:
* @content: a #ClutterContent * @content: a #ClutterContent
* @actor: a #ClutterActor * @actor: a #ClutterActor
* @node: a #ClutterPaintNode * @context: a #ClutterPaintNode
* @paint_context: a #ClutterPaintContext
* *
* Creates the render tree for the @content and @actor. * Creates the render tree for the @content and @actor.
* *
@@ -310,13 +310,11 @@ _clutter_content_detached (ClutterContent *content,
* virtual function. * virtual function.
*/ */
void void
_clutter_content_paint_content (ClutterContent *content, _clutter_content_paint_content (ClutterContent *content,
ClutterActor *actor, ClutterActor *actor,
ClutterPaintNode *node, ClutterPaintNode *node)
ClutterPaintContext *paint_context)
{ {
CLUTTER_CONTENT_GET_IFACE (content)->paint_content (content, actor, node, CLUTTER_CONTENT_GET_IFACE (content)->paint_content (content, actor, node);
paint_context);
} }
/** /**

View File

@@ -65,10 +65,9 @@ struct _ClutterContentInterface
gboolean (* get_preferred_size) (ClutterContent *content, gboolean (* get_preferred_size) (ClutterContent *content,
gfloat *width, gfloat *width,
gfloat *height); gfloat *height);
void (* paint_content) (ClutterContent *content, void (* paint_content) (ClutterContent *content,
ClutterActor *actor, ClutterActor *actor,
ClutterPaintNode *node, ClutterPaintNode *node);
ClutterPaintContext *paint_context);
void (* attached) (ClutterContent *content, void (* attached) (ClutterContent *content,
ClutterActor *actor); ClutterActor *actor);

View File

@@ -1,92 +0,0 @@
/*
* Copyright (C) 2007,2008,2009,2010,2011 Intel Corporation.
* Copyright (C) 2020 Red Hat Inc
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*/
#include "clutter-build-config.h"
#include "clutter-damage-history.h"
#define DAMAGE_HISTORY_LENGTH 0x10
struct _ClutterDamageHistory
{
cairo_region_t *damages[DAMAGE_HISTORY_LENGTH];
int index;
};
ClutterDamageHistory *
clutter_damage_history_new (void)
{
ClutterDamageHistory *history;
history = g_new0 (ClutterDamageHistory, 1);
return history;
}
void
clutter_damage_history_free (ClutterDamageHistory *history)
{
int i;
for (i = 0; i < G_N_ELEMENTS (history->damages); i++)
g_clear_pointer (&history->damages[i], cairo_region_destroy);
g_free (history);
}
gboolean
clutter_damage_history_is_age_valid (ClutterDamageHistory *history,
int age)
{
if (age >= DAMAGE_HISTORY_LENGTH ||
age < 1)
return FALSE;
if (!clutter_damage_history_lookup (history, age))
return FALSE;
return TRUE;
}
void
clutter_damage_history_record (ClutterDamageHistory *history,
const cairo_region_t *damage)
{
g_clear_pointer (&history->damages[history->index], cairo_region_destroy);
history->damages[history->index] = cairo_region_copy (damage);
}
static inline int
step_damage_index (int current,
int diff)
{
return (current + diff) & (DAMAGE_HISTORY_LENGTH - 1);
}
void
clutter_damage_history_step (ClutterDamageHistory *history)
{
history->index = step_damage_index (history->index, 1);
}
const cairo_region_t *
clutter_damage_history_lookup (ClutterDamageHistory *history,
int age)
{
return history->damages[step_damage_index (history->index, -age)];
}

View File

@@ -1,42 +0,0 @@
/*
* Copyright (C) 2007,2008,2009,2010,2011 Intel Corporation.
* Copyright (C) 2020 Red Hat Inc
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef CLUTTER_DAMAGE_HISTORY_H
#define CLUTTER_DAMAGE_HISTORY_H
#include <cairo.h>
#include <glib.h>
typedef struct _ClutterDamageHistory ClutterDamageHistory;
ClutterDamageHistory * clutter_damage_history_new (void);
void clutter_damage_history_free (ClutterDamageHistory *history);
gboolean clutter_damage_history_is_age_valid (ClutterDamageHistory *history,
int age);
void clutter_damage_history_record (ClutterDamageHistory *history,
const cairo_region_t *damage);
void clutter_damage_history_step (ClutterDamageHistory *history);
const cairo_region_t * clutter_damage_history_lookup (ClutterDamageHistory *history,
int age);
#endif /* CLUTTER_DAMAGE_HISTORY_H */

View File

@@ -6,6 +6,43 @@
G_BEGIN_DECLS G_BEGIN_DECLS
typedef enum {
CLUTTER_DEBUG_MISC = 1 << 0,
CLUTTER_DEBUG_ACTOR = 1 << 1,
CLUTTER_DEBUG_TEXTURE = 1 << 2,
CLUTTER_DEBUG_EVENT = 1 << 3,
CLUTTER_DEBUG_PAINT = 1 << 4,
CLUTTER_DEBUG_PANGO = 1 << 5,
CLUTTER_DEBUG_BACKEND = 1 << 6,
CLUTTER_DEBUG_SCHEDULER = 1 << 7,
CLUTTER_DEBUG_SCRIPT = 1 << 8,
CLUTTER_DEBUG_SHADER = 1 << 9,
CLUTTER_DEBUG_MULTISTAGE = 1 << 10,
CLUTTER_DEBUG_ANIMATION = 1 << 11,
CLUTTER_DEBUG_LAYOUT = 1 << 12,
CLUTTER_DEBUG_PICK = 1 << 13,
CLUTTER_DEBUG_EVENTLOOP = 1 << 14,
CLUTTER_DEBUG_CLIPPING = 1 << 15,
CLUTTER_DEBUG_OOB_TRANSFORMS = 1 << 16
} ClutterDebugFlag;
typedef enum {
CLUTTER_DEBUG_NOP_PICKING = 1 << 0,
CLUTTER_DEBUG_DUMP_PICK_BUFFERS = 1 << 1
} ClutterPickDebugFlag;
typedef enum {
CLUTTER_DEBUG_DISABLE_SWAP_EVENTS = 1 << 0,
CLUTTER_DEBUG_DISABLE_CLIPPED_REDRAWS = 1 << 1,
CLUTTER_DEBUG_REDRAWS = 1 << 2,
CLUTTER_DEBUG_PAINT_VOLUMES = 1 << 3,
CLUTTER_DEBUG_DISABLE_CULLING = 1 << 4,
CLUTTER_DEBUG_DISABLE_OFFSCREEN_REDIRECT = 1 << 5,
CLUTTER_DEBUG_CONTINUOUS_REDRAW = 1 << 6,
CLUTTER_DEBUG_PAINT_DEFORM_TILES = 1 << 7,
CLUTTER_DEBUG_PAINT_DAMAGE_REGION = 1 << 8,
} ClutterDrawDebugFlag;
#ifdef CLUTTER_ENABLE_DEBUG #ifdef CLUTTER_ENABLE_DEBUG
#define CLUTTER_HAS_DEBUG(type) ((clutter_debug_flags & CLUTTER_DEBUG_##type) != FALSE) #define CLUTTER_HAS_DEBUG(type) ((clutter_debug_flags & CLUTTER_DEBUG_##type) != FALSE)

View File

@@ -128,9 +128,10 @@ clutter_deform_effect_deform_vertex (ClutterDeformEffect *effect,
} }
static void static void
vbo_invalidate (ClutterActor *actor, vbo_invalidate (ClutterActor *actor,
GParamSpec *pspec, const ClutterActorBox *allocation,
ClutterDeformEffect *effect) ClutterAllocationFlags flags,
ClutterDeformEffect *effect)
{ {
effect->priv->is_dirty = TRUE; effect->priv->is_dirty = TRUE;
} }
@@ -146,7 +147,7 @@ clutter_deform_effect_set_actor (ClutterActorMeta *meta,
ClutterActor *old_actor = clutter_actor_meta_get_actor (meta); ClutterActor *old_actor = clutter_actor_meta_get_actor (meta);
if (old_actor != NULL) if (old_actor != NULL)
g_clear_signal_handler (&priv->allocation_id, old_actor); g_signal_handler_disconnect (old_actor, priv->allocation_id);
priv->allocation_id = 0; priv->allocation_id = 0;
} }
@@ -155,7 +156,7 @@ clutter_deform_effect_set_actor (ClutterActorMeta *meta,
* changes * changes
*/ */
if (actor != NULL) if (actor != NULL)
priv->allocation_id = g_signal_connect (actor, "notify::allocation", priv->allocation_id = g_signal_connect (actor, "allocation-changed",
G_CALLBACK (vbo_invalidate), G_CALLBACK (vbo_invalidate),
meta); meta);
@@ -165,20 +166,18 @@ clutter_deform_effect_set_actor (ClutterActorMeta *meta,
} }
static void static void
clutter_deform_effect_paint_target (ClutterOffscreenEffect *effect, clutter_deform_effect_paint_target (ClutterOffscreenEffect *effect)
ClutterPaintContext *paint_context)
{ {
ClutterDeformEffect *self= CLUTTER_DEFORM_EFFECT (effect); ClutterDeformEffect *self= CLUTTER_DEFORM_EFFECT (effect);
ClutterDeformEffectPrivate *priv = self->priv; ClutterDeformEffectPrivate *priv = self->priv;
CoglHandle material; CoglHandle material;
CoglPipeline *pipeline; CoglPipeline *pipeline;
CoglDepthState depth_state; CoglDepthState depth_state;
CoglFramebuffer *fb = CoglFramebuffer *fb = cogl_get_draw_framebuffer ();
clutter_paint_context_get_framebuffer (paint_context);
if (priv->is_dirty) if (priv->is_dirty)
{ {
graphene_rect_t rect; ClutterRect rect;
gboolean mapped_buffer; gboolean mapped_buffer;
CoglVertexP3T2C4 *verts; CoglVertexP3T2C4 *verts;
ClutterActor *actor; ClutterActor *actor;
@@ -194,8 +193,8 @@ clutter_deform_effect_paint_target (ClutterOffscreenEffect *effect,
*/ */
if (clutter_offscreen_effect_get_target_rect (effect, &rect)) if (clutter_offscreen_effect_get_target_rect (effect, &rect))
{ {
width = graphene_rect_get_width (&rect); width = clutter_rect_get_width (&rect);
height = graphene_rect_get_height (&rect); height = clutter_rect_get_height (&rect);
} }
else else
clutter_actor_get_size (actor, &width, &height); clutter_actor_get_size (actor, &width, &height);
@@ -283,7 +282,6 @@ clutter_deform_effect_paint_target (ClutterOffscreenEffect *effect,
/* enable depth testing */ /* enable depth testing */
cogl_depth_state_init (&depth_state); cogl_depth_state_init (&depth_state);
cogl_depth_state_set_test_enabled (&depth_state, TRUE); cogl_depth_state_set_test_enabled (&depth_state, TRUE);
cogl_depth_state_set_test_function (&depth_state, COGL_DEPTH_TEST_FUNCTION_LEQUAL);
cogl_pipeline_set_depth_state (pipeline, &depth_state, NULL); cogl_pipeline_set_depth_state (pipeline, &depth_state, NULL);
/* enable backface culling if we have a back material */ /* enable backface culling if we have a back material */

View File

@@ -4,11 +4,33 @@
#define __CLUTTER_DEPRECATED_H_INSIDE__ #define __CLUTTER_DEPRECATED_H_INSIDE__
#include "deprecated/clutter-actor.h" #include "deprecated/clutter-actor.h"
#include "deprecated/clutter-alpha.h"
#include "deprecated/clutter-animatable.h"
#include "deprecated/clutter-animation.h"
#include "deprecated/clutter-behaviour.h"
#include "deprecated/clutter-behaviour-depth.h"
#include "deprecated/clutter-behaviour-ellipse.h"
#include "deprecated/clutter-behaviour-opacity.h"
#include "deprecated/clutter-behaviour-path.h"
#include "deprecated/clutter-behaviour-rotate.h"
#include "deprecated/clutter-behaviour-scale.h"
#include "deprecated/clutter-bin-layout.h"
#include "deprecated/clutter-box.h" #include "deprecated/clutter-box.h"
#include "deprecated/clutter-cairo-texture.h"
#include "deprecated/clutter-container.h" #include "deprecated/clutter-container.h"
#include "deprecated/clutter-group.h" #include "deprecated/clutter-group.h"
#include "deprecated/clutter-input-device.h"
#include "deprecated/clutter-keysyms.h"
#include "deprecated/clutter-list-model.h"
#include "deprecated/clutter-main.h"
#include "deprecated/clutter-model.h"
#include "deprecated/clutter-rectangle.h" #include "deprecated/clutter-rectangle.h"
#include "deprecated/clutter-shader.h"
#include "deprecated/clutter-stage-manager.h"
#include "deprecated/clutter-stage.h" #include "deprecated/clutter-stage.h"
#include "deprecated/clutter-state.h"
#include "deprecated/clutter-table-layout.h"
#include "deprecated/clutter-texture.h"
#include "deprecated/clutter-timeline.h" #include "deprecated/clutter-timeline.h"
#undef __CLUTTER_DEPRECATED_H_INSIDE__ #undef __CLUTTER_DEPRECATED_H_INSIDE__

View File

@@ -112,8 +112,7 @@ G_DEFINE_TYPE (ClutterDesaturateEffect,
CLUTTER_TYPE_OFFSCREEN_EFFECT); CLUTTER_TYPE_OFFSCREEN_EFFECT);
static gboolean static gboolean
clutter_desaturate_effect_pre_paint (ClutterEffect *effect, clutter_desaturate_effect_pre_paint (ClutterEffect *effect)
ClutterPaintContext *paint_context)
{ {
ClutterDesaturateEffect *self = CLUTTER_DESATURATE_EFFECT (effect); ClutterDesaturateEffect *self = CLUTTER_DESATURATE_EFFECT (effect);
ClutterEffectClass *parent_class; ClutterEffectClass *parent_class;
@@ -134,7 +133,7 @@ clutter_desaturate_effect_pre_paint (ClutterEffect *effect,
} }
parent_class = CLUTTER_EFFECT_CLASS (clutter_desaturate_effect_parent_class); parent_class = CLUTTER_EFFECT_CLASS (clutter_desaturate_effect_parent_class);
if (parent_class->pre_paint (effect, paint_context)) if (parent_class->pre_paint (effect))
{ {
ClutterOffscreenEffect *offscreen_effect = ClutterOffscreenEffect *offscreen_effect =
CLUTTER_OFFSCREEN_EFFECT (effect); CLUTTER_OFFSCREEN_EFFECT (effect);
@@ -153,12 +152,10 @@ clutter_desaturate_effect_pre_paint (ClutterEffect *effect,
} }
static void static void
clutter_desaturate_effect_paint_target (ClutterOffscreenEffect *effect, clutter_desaturate_effect_paint_target (ClutterOffscreenEffect *effect)
ClutterPaintContext *paint_context)
{ {
ClutterDesaturateEffect *self = CLUTTER_DESATURATE_EFFECT (effect); ClutterDesaturateEffect *self = CLUTTER_DESATURATE_EFFECT (effect);
CoglFramebuffer *framebuffer = CoglFramebuffer *framebuffer = cogl_get_draw_framebuffer ();
clutter_paint_context_get_framebuffer (paint_context);
ClutterActor *actor; ClutterActor *actor;
CoglHandle texture; CoglHandle texture;
guint8 paint_opacity; guint8 paint_opacity;
@@ -300,7 +297,9 @@ clutter_desaturate_effect_init (ClutterDesaturateEffect *self)
cogl_pipeline_add_snippet (klass->base_pipeline, snippet); cogl_pipeline_add_snippet (klass->base_pipeline, snippet);
cogl_object_unref (snippet); cogl_object_unref (snippet);
cogl_pipeline_set_layer_null_texture (klass->base_pipeline, 0); cogl_pipeline_set_layer_null_texture (klass->base_pipeline,
0, /* layer number */
COGL_TEXTURE_TYPE_2D);
} }
self->pipeline = cogl_pipeline_copy (klass->base_pipeline); self->pipeline = cogl_pipeline_copy (klass->base_pipeline);

View File

@@ -0,0 +1,285 @@
/*
* Clutter.
*
* An OpenGL based 'interactive canvas' library.
*
* Copyright (C) 2010 Intel Corporation.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
* Author:
* Emmanuele Bassi <ebassi@linux.intel.com>
*/
#ifndef __CLUTTER_DEVICE_MANAGER_PRIVATE_H__
#define __CLUTTER_DEVICE_MANAGER_PRIVATE_H__
#include <clutter/clutter-backend.h>
#include <clutter/clutter-device-manager.h>
#include <clutter/clutter-event.h>
G_BEGIN_DECLS
typedef struct _ClutterAxisInfo
{
ClutterInputAxis axis;
gdouble min_axis;
gdouble max_axis;
gdouble min_value;
gdouble max_value;
gdouble resolution;
} ClutterAxisInfo;
typedef struct _ClutterKeyInfo
{
guint keyval;
ClutterModifierType modifiers;
} ClutterKeyInfo;
typedef struct _ClutterScrollInfo
{
guint axis_id;
ClutterScrollDirection direction;
gdouble increment;
gdouble last_value;
guint last_value_valid : 1;
} ClutterScrollInfo;
typedef struct _ClutterTouchInfo
{
ClutterEventSequence *sequence;
ClutterActor *actor;
gfloat current_x;
gfloat current_y;
} ClutterTouchInfo;
struct _ClutterInputDevice
{
GObject parent_instance;
gint id;
ClutterInputDeviceType device_type;
ClutterInputMode device_mode;
gchar *device_name;
ClutterDeviceManager *device_manager;
ClutterBackend *backend;
/* the associated device */
ClutterInputDevice *associated;
GList *slaves;
/* the actor underneath the pointer */
ClutterActor *cursor_actor;
GHashTable *inv_touch_sequence_actors;
/* the actor that has a grab in place for the device */
ClutterActor *pointer_grab_actor;
ClutterActor *keyboard_grab_actor;
GHashTable *sequence_grab_actors;
GHashTable *inv_sequence_grab_actors;
/* the current click count */
gint click_count;
/* the stage the device is on */
ClutterStage *stage;
/* the current state */
gfloat current_x;
gfloat current_y;
guint32 current_time;
gint current_button_number;
ClutterModifierType current_state;
/* the current touch points states */
GHashTable *touch_sequences_info;
/* the previous state, used for click count generation */
gint previous_x;
gint previous_y;
guint32 previous_time;
gint previous_button_number;
ClutterModifierType previous_state;
GArray *axes;
guint n_keys;
GArray *keys;
GArray *scroll_info;
gchar *vendor_id;
gchar *product_id;
gchar *node_path;
GPtrArray *tools;
gint n_rings;
gint n_strips;
gint n_mode_groups;
ClutterInputDeviceMapping mapping_mode;
guint has_cursor : 1;
guint is_enabled : 1;
};
typedef void (*ClutterEmitInputDeviceEvent) (ClutterEvent *event,
ClutterInputDevice *device);
struct _ClutterInputDeviceClass
{
GObjectClass parent_class;
gboolean (* keycode_to_evdev) (ClutterInputDevice *device,
guint hardware_keycode,
guint *evdev_keycode);
void (* update_from_tool) (ClutterInputDevice *device,
ClutterInputDeviceTool *tool);
gboolean (* is_mode_switch_button) (ClutterInputDevice *device,
guint group,
guint button);
gint (* get_group_n_modes) (ClutterInputDevice *device,
gint group);
gboolean (* is_grouped) (ClutterInputDevice *device,
ClutterInputDevice *other_device);
gboolean (* get_physical_size) (ClutterInputDevice *device,
gdouble *width,
gdouble *height);
/* Keyboard accessbility */
void (* process_kbd_a11y_event) (ClutterEvent *event,
ClutterInputDevice *device,
ClutterEmitInputDeviceEvent emit_event_func);
};
/* Platform-dependent interface */
typedef struct _ClutterEventExtender ClutterEventExtender;
typedef struct _ClutterEventExtenderInterface ClutterEventExtenderInterface;
#define CLUTTER_TYPE_EVENT_EXTENDER (clutter_event_extender_get_type ())
#define CLUTTER_EVENT_EXTENDER(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), CLUTTER_TYPE_EVENT_EXTENDER, ClutterEventExtender))
#define CLUTTER_IS_EVENT_EXTENDER(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), CLUTTER_TYPE_EVENT_EXTENDER))
#define CLUTTER_EVENT_EXTENDER_GET_IFACE(o) (G_TYPE_INSTANCE_GET_INTERFACE ((o), CLUTTER_TYPE_EVENT_EXTENDER, ClutterEventExtenderInterface))
struct _ClutterEventExtenderInterface
{
GTypeInterface g_iface;
void (* copy_event_data) (ClutterEventExtender *event_extender,
const ClutterEvent *src,
ClutterEvent *dest);
void (* free_event_data) (ClutterEventExtender *event_extender,
ClutterEvent *event);
};
GType clutter_event_extender_get_type (void) G_GNUC_CONST;
/* device manager */
void _clutter_device_manager_add_device (ClutterDeviceManager *device_manager,
ClutterInputDevice *device);
void _clutter_device_manager_remove_device (ClutterDeviceManager *device_manager,
ClutterInputDevice *device);
void _clutter_device_manager_update_devices (ClutterDeviceManager *device_manager);
void _clutter_device_manager_select_stage_events (ClutterDeviceManager *device_manager,
ClutterStage *stage);
ClutterBackend *_clutter_device_manager_get_backend (ClutterDeviceManager *device_manager);
void _clutter_device_manager_compress_motion (ClutterDeviceManager *device_manger,
ClutterEvent *event,
const ClutterEvent *to_discard);
/* input device */
gboolean _clutter_input_device_has_sequence (ClutterInputDevice *device,
ClutterEventSequence *sequence);
void _clutter_input_device_add_event_sequence (ClutterInputDevice *device,
ClutterEvent *event);
void _clutter_input_device_remove_event_sequence (ClutterInputDevice *device,
ClutterEvent *event);
void _clutter_input_device_set_coords (ClutterInputDevice *device,
ClutterEventSequence *sequence,
gfloat x,
gfloat y,
ClutterStage *stage);
void _clutter_input_device_set_state (ClutterInputDevice *device,
ClutterModifierType state);
void _clutter_input_device_set_time (ClutterInputDevice *device,
guint32 time_);
void _clutter_input_device_set_stage (ClutterInputDevice *device,
ClutterStage *stage);
ClutterStage * _clutter_input_device_get_stage (ClutterInputDevice *device);
void _clutter_input_device_set_actor (ClutterInputDevice *device,
ClutterEventSequence *sequence,
ClutterActor *actor,
gboolean emit_crossing);
ClutterActor * _clutter_input_device_update (ClutterInputDevice *device,
ClutterEventSequence *sequence,
gboolean emit_crossing);
void _clutter_input_device_set_n_keys (ClutterInputDevice *device,
guint n_keys);
guint _clutter_input_device_add_axis (ClutterInputDevice *device,
ClutterInputAxis axis,
gdouble min_value,
gdouble max_value,
gdouble resolution);
void _clutter_input_device_reset_axes (ClutterInputDevice *device);
void _clutter_input_device_set_associated_device (ClutterInputDevice *device,
ClutterInputDevice *associated);
void _clutter_input_device_add_slave (ClutterInputDevice *master,
ClutterInputDevice *slave);
void _clutter_input_device_remove_slave (ClutterInputDevice *master,
ClutterInputDevice *slave);
gboolean _clutter_input_device_translate_axis (ClutterInputDevice *device,
guint index_,
gdouble value,
gdouble *axis_value);
void _clutter_input_device_add_scroll_info (ClutterInputDevice *device,
guint index_,
ClutterScrollDirection direction,
gdouble increment);
void _clutter_input_device_reset_scroll_info (ClutterInputDevice *device);
gboolean _clutter_input_device_get_scroll_delta (ClutterInputDevice *device,
guint index_,
gdouble value,
ClutterScrollDirection *direction_p,
gdouble *delta_p);
ClutterInputDeviceTool * clutter_input_device_lookup_tool (ClutterInputDevice *device,
guint64 serial,
ClutterInputDeviceToolType type);
void clutter_input_device_add_tool (ClutterInputDevice *device,
ClutterInputDeviceTool *tool);
void clutter_input_device_update_from_tool (ClutterInputDevice *device,
ClutterInputDeviceTool *tool);
G_END_DECLS
#endif /* __CLUTTER_DEVICE_MANAGER_PRIVATE_H__ */

View File

@@ -0,0 +1,587 @@
/*
* Clutter.
*
* An OpenGL based 'interactive canvas' library.
*
* Copyright (C) 2009 Intel Corp.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
* Author: Emmanuele Bassi <ebassi@linux.intel.com>
*/
/**
* SECTION:clutter-device-manager
* @short_description: Maintains the list of input devices
*
* #ClutterDeviceManager is a singleton object, owned by Clutter, which
* maintains the list of #ClutterInputDevice<!-- -->s.
*
* Depending on the backend used by Clutter it is possible to use the
* #ClutterDeviceManager::device-added and
* #ClutterDeviceManager::device-removed to monitor addition and removal
* of devices.
*
* #ClutterDeviceManager is available since Clutter 1.2
*/
#include "clutter-build-config.h"
#include "clutter-backend-private.h"
#include "clutter-debug.h"
#include "clutter-device-manager-private.h"
#include "clutter-enum-types.h"
#include "clutter-marshal.h"
#include "clutter-private.h"
#include "clutter-stage-private.h"
#include "clutter-virtual-input-device.h"
#include "clutter-input-device-tool.h"
struct _ClutterDeviceManagerPrivate
{
/* back-pointer to the backend */
ClutterBackend *backend;
/* Keyboard a11y */
ClutterKbdA11ySettings kbd_a11y_settings;
};
enum
{
PROP_0,
PROP_BACKEND,
PROP_LAST
};
static GParamSpec *obj_props[PROP_LAST];
enum
{
DEVICE_ADDED,
DEVICE_REMOVED,
TOOL_CHANGED,
KBD_A11Y_MASK_CHANGED,
KBD_A11Y_FLAGS_CHANGED,
LAST_SIGNAL
};
static guint manager_signals[LAST_SIGNAL] = { 0, };
G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (ClutterDeviceManager,
clutter_device_manager,
G_TYPE_OBJECT)
G_DEFINE_INTERFACE (ClutterEventExtender,
clutter_event_extender,
CLUTTER_TYPE_DEVICE_MANAGER)
static void
clutter_event_extender_default_init (ClutterEventExtenderInterface *iface)
{
}
static void
clutter_device_manager_set_property (GObject *gobject,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
{
ClutterDeviceManagerPrivate *priv = CLUTTER_DEVICE_MANAGER (gobject)->priv;
switch (prop_id)
{
case PROP_BACKEND:
priv->backend = g_value_get_object (value);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);
}
}
static void
clutter_device_manager_get_property (GObject *gobject,
guint prop_id,
GValue *value,
GParamSpec *pspec)
{
ClutterDeviceManagerPrivate *priv = CLUTTER_DEVICE_MANAGER (gobject)->priv;
switch (prop_id)
{
case PROP_BACKEND:
g_value_set_object (value, priv->backend);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);
}
}
static void
clutter_device_manager_class_init (ClutterDeviceManagerClass *klass)
{
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
obj_props[PROP_BACKEND] =
g_param_spec_object ("backend",
P_("Backend"),
P_("The ClutterBackend of the device manager"),
CLUTTER_TYPE_BACKEND,
CLUTTER_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY);
gobject_class->set_property = clutter_device_manager_set_property;
gobject_class->get_property = clutter_device_manager_get_property;
g_object_class_install_properties (gobject_class,
PROP_LAST,
obj_props);
/**
* ClutterDeviceManager::device-added:
* @manager: the #ClutterDeviceManager that emitted the signal
* @device: the newly added #ClutterInputDevice
*
* The ::device-added signal is emitted each time a device has been
* added to the #ClutterDeviceManager
*
* Since: 1.2
*/
manager_signals[DEVICE_ADDED] =
g_signal_new (I_("device-added"),
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST,
0,
NULL, NULL,
_clutter_marshal_VOID__OBJECT,
G_TYPE_NONE, 1,
CLUTTER_TYPE_INPUT_DEVICE);
/**
* ClutterDeviceManager::device-removed:
* @manager: the #ClutterDeviceManager that emitted the signal
* @device: the removed #ClutterInputDevice
*
* The ::device-removed signal is emitted each time a device has been
* removed from the #ClutterDeviceManager
*
* Since: 1.2
*/
manager_signals[DEVICE_REMOVED] =
g_signal_new (I_("device-removed"),
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST,
0,
NULL, NULL,
_clutter_marshal_VOID__OBJECT,
G_TYPE_NONE, 1,
CLUTTER_TYPE_INPUT_DEVICE);
manager_signals[TOOL_CHANGED] =
g_signal_new (I_("tool-changed"),
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST,
0, NULL, NULL,
_clutter_marshal_VOID__OBJECT_OBJECT,
G_TYPE_NONE, 2,
CLUTTER_TYPE_INPUT_DEVICE,
CLUTTER_TYPE_INPUT_DEVICE_TOOL);
/**
* ClutterDeviceManager::kbd-a11y-mods-state-changed:
* @manager: the #ClutterDeviceManager that emitted the signal
* @latched_mask: the latched modifier mask from stickykeys
* @locked_mask: the locked modifier mask from stickykeys
*
* The ::kbd-a11y-mods-state-changed signal is emitted each time either the
* latched modifiers mask or locked modifiers mask are changed as the
* result of keyboard accessibilty's sticky keys operations.
*/
manager_signals[KBD_A11Y_MASK_CHANGED] =
g_signal_new (I_("kbd-a11y-mods-state-changed"),
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST,
0, NULL, NULL,
_clutter_marshal_VOID__UINT_UINT,
G_TYPE_NONE, 2,
G_TYPE_UINT,
G_TYPE_UINT);
/**
* ClutterDeviceManager::kbd-a11y-flags-changed:
* @manager: the #ClutterDeviceManager that emitted the signal
* @settings_flags: the new ClutterKeyboardA11yFlags configuration
* @changed_mask: the ClutterKeyboardA11yFlags changed
*
* The ::kbd-a11y-flags-changed signal is emitted each time the
* ClutterKeyboardA11yFlags configuration is changed as the result of
* keyboard accessibilty operations.
*/
manager_signals[KBD_A11Y_FLAGS_CHANGED] =
g_signal_new (I_("kbd-a11y-flags-changed"),
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST,
0, NULL, NULL,
_clutter_marshal_VOID__UINT_UINT,
G_TYPE_NONE, 2,
G_TYPE_UINT,
G_TYPE_UINT);
}
static void
clutter_device_manager_init (ClutterDeviceManager *self)
{
self->priv = clutter_device_manager_get_instance_private (self);
}
/**
* clutter_device_manager_get_default:
*
* Retrieves the device manager singleton
*
* Return value: (transfer none): the #ClutterDeviceManager singleton.
* The returned instance is owned by Clutter and it should not be
* modified or freed
*
* Since: 1.2
*/
ClutterDeviceManager *
clutter_device_manager_get_default (void)
{
ClutterBackend *backend = clutter_get_default_backend ();
return backend->device_manager;
}
/**
* clutter_device_manager_list_devices:
* @device_manager: a #ClutterDeviceManager
*
* Lists all currently registered input devices
*
* Return value: (transfer container) (element-type Clutter.InputDevice):
* a newly allocated list of #ClutterInputDevice objects. Use
* g_slist_free() to deallocate it when done
*
* Since: 1.2
*/
GSList *
clutter_device_manager_list_devices (ClutterDeviceManager *device_manager)
{
const GSList *devices;
g_return_val_if_fail (CLUTTER_IS_DEVICE_MANAGER (device_manager), NULL);
devices = clutter_device_manager_peek_devices (device_manager);
return g_slist_copy ((GSList *) devices);
}
/**
* clutter_device_manager_peek_devices:
* @device_manager: a #ClutterDeviceManager
*
* Lists all currently registered input devices
*
* Return value: (transfer none) (element-type Clutter.InputDevice):
* a pointer to the internal list of #ClutterInputDevice objects. The
* returned list is owned by the #ClutterDeviceManager and should never
* be modified or freed
*
* Since: 1.2
*/
const GSList *
clutter_device_manager_peek_devices (ClutterDeviceManager *device_manager)
{
ClutterDeviceManagerClass *manager_class;
g_return_val_if_fail (CLUTTER_IS_DEVICE_MANAGER (device_manager), NULL);
manager_class = CLUTTER_DEVICE_MANAGER_GET_CLASS (device_manager);
return manager_class->get_devices (device_manager);
}
/**
* clutter_device_manager_get_device:
* @device_manager: a #ClutterDeviceManager
* @device_id: the integer id of a device
*
* Retrieves the #ClutterInputDevice with the given @device_id
*
* Return value: (transfer none): a #ClutterInputDevice or %NULL. The
* returned device is owned by the #ClutterDeviceManager and should
* never be modified or freed
*
* Since: 1.2
*/
ClutterInputDevice *
clutter_device_manager_get_device (ClutterDeviceManager *device_manager,
gint device_id)
{
ClutterDeviceManagerClass *manager_class;
g_return_val_if_fail (CLUTTER_IS_DEVICE_MANAGER (device_manager), NULL);
manager_class = CLUTTER_DEVICE_MANAGER_GET_CLASS (device_manager);
return manager_class->get_device (device_manager, device_id);
}
/**
* clutter_device_manager_get_core_device:
* @device_manager: a #ClutterDeviceManager
* @device_type: the type of the core device
*
* Retrieves the core #ClutterInputDevice of type @device_type
*
* Core devices are devices created automatically by the default
* Clutter backend
*
* Return value: (transfer none): a #ClutterInputDevice or %NULL. The
* returned device is owned by the #ClutterDeviceManager and should
* not be modified or freed
*
* Since: 1.2
*/
ClutterInputDevice *
clutter_device_manager_get_core_device (ClutterDeviceManager *device_manager,
ClutterInputDeviceType device_type)
{
ClutterDeviceManagerClass *manager_class;
g_return_val_if_fail (CLUTTER_IS_DEVICE_MANAGER (device_manager), NULL);
manager_class = CLUTTER_DEVICE_MANAGER_GET_CLASS (device_manager);
return manager_class->get_core_device (device_manager, device_type);
}
void
_clutter_device_manager_select_stage_events (ClutterDeviceManager *device_manager,
ClutterStage *stage)
{
ClutterDeviceManagerClass *manager_class;
g_return_if_fail (CLUTTER_IS_DEVICE_MANAGER (device_manager));
manager_class = CLUTTER_DEVICE_MANAGER_GET_CLASS (device_manager);
if (manager_class->select_stage_events)
manager_class->select_stage_events (device_manager, stage);
}
/*
* _clutter_device_manager_add_device:
* @device_manager: a #ClutterDeviceManager
* @device: a #ClutterInputDevice
*
* Adds @device to the list of #ClutterInputDevice<!-- -->s maintained
* by @device_manager
*
* The reference count of @device is not increased
*
* The #ClutterDeviceManager::device-added signal is emitted after
* adding @device to the list
*/
void
_clutter_device_manager_add_device (ClutterDeviceManager *device_manager,
ClutterInputDevice *device)
{
ClutterDeviceManagerClass *manager_class;
g_return_if_fail (CLUTTER_IS_DEVICE_MANAGER (device_manager));
manager_class = CLUTTER_DEVICE_MANAGER_GET_CLASS (device_manager);
g_assert (manager_class->add_device != NULL);
manager_class->add_device (device_manager, device);
g_signal_emit (device_manager, manager_signals[DEVICE_ADDED], 0, device);
}
/*
* _clutter_device_manager_remove_device:
* @device_manager: a #ClutterDeviceManager
* @device: a #ClutterInputDevice
*
* Removes @device from the list of #ClutterInputDevice<!-- -->s
* maintained by @device_manager
*
* The reference count of @device is not decreased
*
* The #ClutterDeviceManager::device-removed signal is emitted after
* removing @device from the list
*/
void
_clutter_device_manager_remove_device (ClutterDeviceManager *device_manager,
ClutterInputDevice *device)
{
ClutterDeviceManagerClass *manager_class;
g_return_if_fail (CLUTTER_IS_DEVICE_MANAGER (device_manager));
manager_class = CLUTTER_DEVICE_MANAGER_GET_CLASS (device_manager);
g_assert (manager_class->remove_device != NULL);
/* The subclass remove_device() method will likely unref it but we
have to keep it alive during the signal emission. */
g_object_ref (device);
manager_class->remove_device (device_manager, device);
g_signal_emit (device_manager, manager_signals[DEVICE_REMOVED], 0, device);
g_object_unref (device);
}
/*
* _clutter_device_manager_update_devices:
* @device_manager: a #ClutterDeviceManager
*
* Updates every #ClutterInputDevice handled by @device_manager
* by performing a pick paint at the coordinates of each pointer
* device
*/
void
_clutter_device_manager_update_devices (ClutterDeviceManager *device_manager)
{
const GSList *d;
for (d = clutter_device_manager_peek_devices (device_manager);
d != NULL;
d = d->next)
{
ClutterInputDevice *device = d->data;
ClutterInputDeviceType device_type;
/* we only care about pointer devices */
device_type = clutter_input_device_get_device_type (device);
if (device_type != CLUTTER_POINTER_DEVICE)
continue;
/* out of stage */
if (device->stage == NULL)
continue;
/* the user disabled motion events delivery on actors for
* the stage the device is on; we don't perform any picking
* since the source of the events will always be set to be
* the stage
*/
if (!clutter_stage_get_motion_events_enabled (device->stage))
continue;
_clutter_input_device_update (device, NULL, TRUE);
}
}
ClutterBackend *
_clutter_device_manager_get_backend (ClutterDeviceManager *manager)
{
g_return_val_if_fail (CLUTTER_IS_DEVICE_MANAGER (manager), NULL);
return manager->priv->backend;
}
/**
* clutter_device_manager_create_virtual_device:
* @device_manager: a #ClutterDeviceManager
* @device_type: the type of the virtual device
*
* Creates a virtual input device.
*
* Returns: (transfer full): a newly created virtual device
**/
ClutterVirtualInputDevice *
clutter_device_manager_create_virtual_device (ClutterDeviceManager *device_manager,
ClutterInputDeviceType device_type)
{
ClutterDeviceManagerClass *manager_class;
g_return_val_if_fail (CLUTTER_IS_DEVICE_MANAGER (device_manager), NULL);
manager_class = CLUTTER_DEVICE_MANAGER_GET_CLASS (device_manager);
return manager_class->create_virtual_device (device_manager,
device_type);
}
/**
* clutter_device_manager_supported_virtua_device_types: (skip)
*/
ClutterVirtualDeviceType
clutter_device_manager_get_supported_virtual_device_types (ClutterDeviceManager *device_manager)
{
ClutterDeviceManagerClass *manager_class;
g_return_val_if_fail (CLUTTER_IS_DEVICE_MANAGER (device_manager),
CLUTTER_VIRTUAL_DEVICE_TYPE_NONE);
manager_class = CLUTTER_DEVICE_MANAGER_GET_CLASS (device_manager);
return manager_class->get_supported_virtual_device_types (device_manager);
}
void
_clutter_device_manager_compress_motion (ClutterDeviceManager *device_manager,
ClutterEvent *event,
const ClutterEvent *to_discard)
{
ClutterDeviceManagerClass *manager_class;
g_return_if_fail (CLUTTER_IS_DEVICE_MANAGER (device_manager));
manager_class = CLUTTER_DEVICE_MANAGER_GET_CLASS (device_manager);
if (!manager_class->compress_motion)
return;
manager_class->compress_motion (device_manager, event, to_discard);
}
static gboolean
are_kbd_a11y_settings_equal (ClutterKbdA11ySettings *a,
ClutterKbdA11ySettings *b)
{
return (a->controls == b->controls &&
a->slowkeys_delay == b->slowkeys_delay &&
a->debounce_delay == b->debounce_delay &&
a->timeout_delay == b->timeout_delay &&
a->mousekeys_init_delay == b->mousekeys_init_delay &&
a->mousekeys_max_speed == b->mousekeys_max_speed &&
a->mousekeys_accel_time == b->mousekeys_accel_time);
}
void
clutter_device_manager_set_kbd_a11y_settings (ClutterDeviceManager *device_manager,
ClutterKbdA11ySettings *settings)
{
ClutterDeviceManagerClass *manager_class;
g_return_if_fail (CLUTTER_IS_DEVICE_MANAGER (device_manager));
if (are_kbd_a11y_settings_equal (&device_manager->priv->kbd_a11y_settings, settings))
return;
device_manager->priv->kbd_a11y_settings = *settings;
manager_class = CLUTTER_DEVICE_MANAGER_GET_CLASS (device_manager);
if (manager_class->apply_kbd_a11y_settings)
manager_class->apply_kbd_a11y_settings (device_manager, settings);
}
void
clutter_device_manager_get_kbd_a11y_settings (ClutterDeviceManager *device_manager,
ClutterKbdA11ySettings *settings)
{
g_return_if_fail (CLUTTER_IS_DEVICE_MANAGER (device_manager));
*settings = device_manager->priv->kbd_a11y_settings;
}

View File

@@ -0,0 +1,161 @@
/*
* Clutter.
*
* An OpenGL based 'interactive canvas' library.
*
* Copyright (C) 2009 Intel Corp.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
* Author: Emmanuele Bassi <ebassi@linux.intel.com>
*/
#ifndef __CLUTTER_DEVICE_MANAGER_H__
#define __CLUTTER_DEVICE_MANAGER_H__
#if !defined(__CLUTTER_H_INSIDE__) && !defined(CLUTTER_COMPILATION)
#error "Only <clutter/clutter.h> can be included directly."
#endif
#include <clutter/clutter-input-device.h>
#include <clutter/clutter-stage.h>
G_BEGIN_DECLS
#define CLUTTER_TYPE_DEVICE_MANAGER (clutter_device_manager_get_type ())
#define CLUTTER_DEVICE_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), CLUTTER_TYPE_DEVICE_MANAGER, ClutterDeviceManager))
#define CLUTTER_IS_DEVICE_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CLUTTER_TYPE_DEVICE_MANAGER))
#define CLUTTER_DEVICE_MANAGER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), CLUTTER_TYPE_DEVICE_MANAGER, ClutterDeviceManagerClass))
#define CLUTTER_IS_DEVICE_MANAGER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), CLUTTER_TYPE_DEVICE_MANAGER))
#define CLUTTER_DEVICE_MANAGER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), CLUTTER_TYPE_DEVICE_MANAGER, ClutterDeviceManagerClass))
typedef struct _ClutterDeviceManager ClutterDeviceManager;
typedef struct _ClutterDeviceManagerPrivate ClutterDeviceManagerPrivate;
typedef struct _ClutterDeviceManagerClass ClutterDeviceManagerClass;
/**
* ClutterVirtualDeviceType:
*/
typedef enum _ClutterVirtualDeviceType
{
CLUTTER_VIRTUAL_DEVICE_TYPE_NONE = 0,
CLUTTER_VIRTUAL_DEVICE_TYPE_KEYBOARD = 1 << 0,
CLUTTER_VIRTUAL_DEVICE_TYPE_POINTER = 1 << 1,
CLUTTER_VIRTUAL_DEVICE_TYPE_TOUCHSCREEN = 1 << 2,
} ClutterVirtualDeviceType;
/**
* ClutterKbdA11ySettings:
*
* The #ClutterKbdA11ySettings structure contains keyboard accessibility
* settings
*
*/
typedef struct _ClutterKbdA11ySettings
{
ClutterKeyboardA11yFlags controls;
gint slowkeys_delay;
gint debounce_delay;
gint timeout_delay;
gint mousekeys_init_delay;
gint mousekeys_max_speed;
gint mousekeys_accel_time;
} ClutterKbdA11ySettings;
/**
* ClutterDeviceManager:
*
* The #ClutterDeviceManager structure contains only private data
*
* Since: 1.2
*/
struct _ClutterDeviceManager
{
/*< private >*/
GObject parent_instance;
ClutterDeviceManagerPrivate *priv;
};
/**
* ClutterDeviceManagerClass:
*
* The #ClutterDeviceManagerClass structure contains only private data
*
* Since: 1.2
*/
struct _ClutterDeviceManagerClass
{
/*< private >*/
GObjectClass parent_class;
const GSList * (* get_devices) (ClutterDeviceManager *device_manager);
ClutterInputDevice *(* get_core_device) (ClutterDeviceManager *device_manager,
ClutterInputDeviceType device_type);
ClutterInputDevice *(* get_device) (ClutterDeviceManager *device_manager,
gint device_id);
void (* add_device) (ClutterDeviceManager *manager,
ClutterInputDevice *device);
void (* remove_device) (ClutterDeviceManager *manager,
ClutterInputDevice *device);
void (* select_stage_events) (ClutterDeviceManager *manager,
ClutterStage *stage);
ClutterVirtualInputDevice *(* create_virtual_device) (ClutterDeviceManager *device_manager,
ClutterInputDeviceType device_type);
ClutterVirtualDeviceType (* get_supported_virtual_device_types) (ClutterDeviceManager *device_manager);
void (* compress_motion) (ClutterDeviceManager *device_manger,
ClutterEvent *event,
const ClutterEvent *to_discard);
/* Keyboard accessbility */
void (* apply_kbd_a11y_settings) (ClutterDeviceManager *device_manger,
ClutterKbdA11ySettings *settings);
/* padding */
gpointer _padding[6];
};
CLUTTER_EXPORT
GType clutter_device_manager_get_type (void) G_GNUC_CONST;
CLUTTER_EXPORT
ClutterDeviceManager *clutter_device_manager_get_default (void);
CLUTTER_EXPORT
GSList * clutter_device_manager_list_devices (ClutterDeviceManager *device_manager);
CLUTTER_EXPORT
const GSList * clutter_device_manager_peek_devices (ClutterDeviceManager *device_manager);
CLUTTER_EXPORT
ClutterInputDevice * clutter_device_manager_get_device (ClutterDeviceManager *device_manager,
gint device_id);
CLUTTER_EXPORT
ClutterInputDevice * clutter_device_manager_get_core_device (ClutterDeviceManager *device_manager,
ClutterInputDeviceType device_type);
CLUTTER_EXPORT
ClutterVirtualInputDevice *clutter_device_manager_create_virtual_device (ClutterDeviceManager *device_manager,
ClutterInputDeviceType device_type);
CLUTTER_EXPORT
ClutterVirtualDeviceType clutter_device_manager_get_supported_virtual_device_types (ClutterDeviceManager *device_manager);
CLUTTER_EXPORT
void clutter_device_manager_set_kbd_a11y_settings (ClutterDeviceManager *device_manager,
ClutterKbdA11ySettings *settings);
CLUTTER_EXPORT
void clutter_device_manager_get_kbd_a11y_settings (ClutterDeviceManager *device_manager,
ClutterKbdA11ySettings *settings);
G_END_DECLS
#endif /* __CLUTTER_DEVICE_MANAGER_H__ */

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,152 @@
/*
* Clutter.
*
* An OpenGL based 'interactive canvas' library.
*
* Copyright (C) 2010 Intel Corporation.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
* Author:
* Emmanuele Bassi <ebassi@linux.intel.com>
*/
#ifndef __CLUTTER_DRAG_ACTION_H__
#define __CLUTTER_DRAG_ACTION_H__
#if !defined(__CLUTTER_H_INSIDE__) && !defined(CLUTTER_COMPILATION)
#error "Only <clutter/clutter.h> can be included directly."
#endif
#include <clutter/clutter-action.h>
#include <clutter/clutter-event.h>
G_BEGIN_DECLS
#define CLUTTER_TYPE_DRAG_ACTION (clutter_drag_action_get_type ())
#define CLUTTER_DRAG_ACTION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), CLUTTER_TYPE_DRAG_ACTION, ClutterDragAction))
#define CLUTTER_IS_DRAG_ACTION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CLUTTER_TYPE_DRAG_ACTION))
#define CLUTTER_DRAG_ACTION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), CLUTTER_TYPE_DRAG_ACTION, ClutterDragActionClass))
#define CLUTTER_IS_DRAG_ACTION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), CLUTTER_TYPE_DRAG_ACTION))
#define CLUTTER_DRAG_ACTION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), CLUTTER_TYPE_DRAG_ACTION, ClutterDragActionClass))
typedef struct _ClutterDragAction ClutterDragAction;
typedef struct _ClutterDragActionPrivate ClutterDragActionPrivate;
typedef struct _ClutterDragActionClass ClutterDragActionClass;
/**
* ClutterDragAction:
*
* The #ClutterDragAction structure contains only
* private data and should be accessed using the provided API
*
* Since: 1.4
*/
struct _ClutterDragAction
{
/*< private >*/
ClutterAction parent_instance;
ClutterDragActionPrivate *priv;
};
/**
* ClutterDragActionClass:
* @drag_begin: class handler of the #ClutterDragAction::drag-begin signal
* @drag_motion: class handler of the #ClutterDragAction::drag-motion signal
* @drag_end: class handler of the #ClutterDragAction::drag-end signal
* @drag_progress: class handler of the #ClutterDragAction::drag-progress signal
*
* The #ClutterDragActionClass structure contains
* only private data
*
* Since: 1.4
*/
struct _ClutterDragActionClass
{
/*< private >*/
ClutterActionClass parent_class;
/*< public >*/
void (* drag_begin) (ClutterDragAction *action,
ClutterActor *actor,
gfloat event_x,
gfloat event_y,
ClutterModifierType modifiers);
void (* drag_motion) (ClutterDragAction *action,
ClutterActor *actor,
gfloat delta_x,
gfloat delta_y);
void (* drag_end) (ClutterDragAction *action,
ClutterActor *actor,
gfloat event_x,
gfloat event_y,
ClutterModifierType modifiers);
gboolean (* drag_progress) (ClutterDragAction *action,
ClutterActor *actor,
gfloat delta_x,
gfloat delta_y);
/*< private >*/
void (* _clutter_drag_action1) (void);
void (* _clutter_drag_action2) (void);
void (* _clutter_drag_action3) (void);
void (* _clutter_drag_action4) (void);
};
CLUTTER_EXPORT
GType clutter_drag_action_get_type (void) G_GNUC_CONST;
CLUTTER_EXPORT
ClutterAction * clutter_drag_action_new (void);
CLUTTER_EXPORT
void clutter_drag_action_set_drag_threshold (ClutterDragAction *action,
gint x_threshold,
gint y_threshold);
CLUTTER_EXPORT
void clutter_drag_action_get_drag_threshold (ClutterDragAction *action,
guint *x_threshold,
guint *y_threshold);
CLUTTER_EXPORT
void clutter_drag_action_set_drag_handle (ClutterDragAction *action,
ClutterActor *handle);
CLUTTER_EXPORT
ClutterActor * clutter_drag_action_get_drag_handle (ClutterDragAction *action);
CLUTTER_EXPORT
void clutter_drag_action_set_drag_axis (ClutterDragAction *action,
ClutterDragAxis axis);
CLUTTER_EXPORT
ClutterDragAxis clutter_drag_action_get_drag_axis (ClutterDragAction *action);
CLUTTER_EXPORT
void clutter_drag_action_get_press_coords (ClutterDragAction *action,
gfloat *press_x,
gfloat *press_y);
CLUTTER_EXPORT
void clutter_drag_action_get_motion_coords (ClutterDragAction *action,
gfloat *motion_x,
gfloat *motion_y);
CLUTTER_EXPORT
gboolean clutter_drag_action_get_drag_area (ClutterDragAction *action,
ClutterRect *drag_area);
CLUTTER_EXPORT
void clutter_drag_action_set_drag_area (ClutterDragAction *action,
const ClutterRect *drag_area);
G_END_DECLS
#endif /* __CLUTTER_DRAG_ACTION_H__ */

View File

@@ -0,0 +1,531 @@
/*
* Clutter.
*
* An OpenGL based 'interactive canvas' library.
*
* Copyright © 2011 Intel Corporation.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
* Author:
* Emmanuele Bassi <ebassi@linux.intel.com>
*/
/**
* SECTION:clutter-drop-action
* @Title: ClutterDropAction
* @short_description: An action for drop targets
*
* #ClutterDropAction is a #ClutterAction that allows a #ClutterActor
* implementation to control what happens when an actor dragged using
* a #ClutterDragAction crosses the target area or when a dragged actor
* is released (or "dropped") on the target area.
*
* A trivial use of #ClutterDropAction consists in connecting to the
* #ClutterDropAction::drop signal and handling the drop from there,
* for instance:
*
* |[<!-- language="C" -->
* ClutterAction *action = clutter_drop_action ();
*
* g_signal_connect (action, "drop", G_CALLBACK (on_drop), NULL);
* clutter_actor_add_action (an_actor, action);
* ]|
*
* The #ClutterDropAction::can-drop can be used to control whether the
* #ClutterDropAction::drop signal is going to be emitted; returning %FALSE
* from a handler connected to the #ClutterDropAction::can-drop signal will
* cause the #ClutterDropAction::drop signal to be skipped when the input
* device button is released.
*
* It's important to note that #ClutterDropAction will only work with
* actors dragged using #ClutterDragAction.
*
* See [drop-action.c](https://git.gnome.org/browse/clutter/tree/examples/drop-action.c?h=clutter-1.18)
* for an example of how to use #ClutterDropAction.
*
* #ClutterDropAction is available since Clutter 1.8
*/
#include "clutter-build-config.h"
#include "clutter-drop-action.h"
#include "clutter-actor-meta-private.h"
#include "clutter-actor-private.h"
#include "clutter-drag-action.h"
#include "clutter-main.h"
#include "clutter-marshal.h"
#include "clutter-stage-private.h"
struct _ClutterDropActionPrivate
{
ClutterActor *actor;
ClutterActor *stage;
gulong mapped_id;
};
typedef struct _DropTarget {
ClutterActor *stage;
gulong capture_id;
GHashTable *actions;
ClutterDropAction *last_action;
} DropTarget;
enum
{
CAN_DROP,
OVER_IN,
OVER_OUT,
DROP,
DROP_CANCEL,
LAST_SIGNAL
};
static guint drop_signals[LAST_SIGNAL] = { 0, };
G_DEFINE_TYPE_WITH_PRIVATE (ClutterDropAction, clutter_drop_action, CLUTTER_TYPE_ACTION)
static void
drop_target_free (gpointer _data)
{
DropTarget *data = _data;
g_signal_handler_disconnect (data->stage, data->capture_id);
g_hash_table_destroy (data->actions);
g_free (data);
}
static gboolean
on_stage_capture (ClutterStage *stage,
ClutterEvent *event,
gpointer user_data)
{
DropTarget *data = user_data;
gfloat event_x, event_y;
ClutterActor *actor, *drag_actor;
ClutterDropAction *drop_action;
ClutterInputDevice *device;
gboolean was_reactive;
switch (clutter_event_type (event))
{
case CLUTTER_MOTION:
case CLUTTER_BUTTON_RELEASE:
if (clutter_event_type (event) == CLUTTER_MOTION &&
!(clutter_event_get_state (event) & CLUTTER_BUTTON1_MASK))
return CLUTTER_EVENT_PROPAGATE;
if (clutter_event_type (event) == CLUTTER_BUTTON_RELEASE &&
clutter_event_get_button (event) != CLUTTER_BUTTON_PRIMARY)
return CLUTTER_EVENT_PROPAGATE;
device = clutter_event_get_device (event);
drag_actor = _clutter_stage_get_pointer_drag_actor (stage, device);
if (drag_actor == NULL)
return CLUTTER_EVENT_PROPAGATE;
break;
case CLUTTER_TOUCH_UPDATE:
case CLUTTER_TOUCH_END:
drag_actor = _clutter_stage_get_touch_drag_actor (stage,
clutter_event_get_event_sequence (event));
if (drag_actor == NULL)
return CLUTTER_EVENT_PROPAGATE;
break;
default:
return CLUTTER_EVENT_PROPAGATE;
}
clutter_event_get_coords (event, &event_x, &event_y);
/* get the actor under the cursor, excluding the dragged actor; we
* use reactivity because it won't cause any scene invalidation
*/
was_reactive = clutter_actor_get_reactive (drag_actor);
clutter_actor_set_reactive (drag_actor, FALSE);
actor = clutter_stage_get_actor_at_pos (stage, CLUTTER_PICK_REACTIVE,
event_x,
event_y);
if (actor == NULL || actor == CLUTTER_ACTOR (stage))
{
if (data->last_action != NULL)
{
ClutterActorMeta *meta = CLUTTER_ACTOR_META (data->last_action);
g_signal_emit (data->last_action, drop_signals[OVER_OUT], 0,
clutter_actor_meta_get_actor (meta));
data->last_action = NULL;
}
goto out;
}
drop_action = g_hash_table_lookup (data->actions, actor);
if (drop_action == NULL)
{
if (data->last_action != NULL)
{
ClutterActorMeta *meta = CLUTTER_ACTOR_META (data->last_action);
g_signal_emit (data->last_action, drop_signals[OVER_OUT], 0,
clutter_actor_meta_get_actor (meta));
data->last_action = NULL;
}
goto out;
}
else
{
if (data->last_action != drop_action)
{
ClutterActorMeta *meta;
if (data->last_action != NULL)
{
meta = CLUTTER_ACTOR_META (data->last_action);
g_signal_emit (data->last_action, drop_signals[OVER_OUT], 0,
clutter_actor_meta_get_actor (meta));
}
meta = CLUTTER_ACTOR_META (drop_action);
g_signal_emit (drop_action, drop_signals[OVER_IN], 0,
clutter_actor_meta_get_actor (meta));
}
data->last_action = drop_action;
}
out:
if (clutter_event_type (event) == CLUTTER_BUTTON_RELEASE ||
clutter_event_type (event) == CLUTTER_TOUCH_END)
{
if (data->last_action != NULL)
{
ClutterActorMeta *meta = CLUTTER_ACTOR_META (data->last_action);
gboolean can_drop = FALSE;
g_signal_emit (data->last_action, drop_signals[CAN_DROP], 0,
clutter_actor_meta_get_actor (meta),
event_x, event_y,
&can_drop);
if (can_drop)
{
g_signal_emit (data->last_action, drop_signals[DROP], 0,
clutter_actor_meta_get_actor (meta),
event_x, event_y);
}
else
{
g_signal_emit (data->last_action, drop_signals[DROP_CANCEL], 0,
clutter_actor_meta_get_actor (meta),
event_x, event_y);
}
}
data->last_action = NULL;
}
if (drag_actor != NULL)
clutter_actor_set_reactive (drag_actor, was_reactive);
return CLUTTER_EVENT_PROPAGATE;
}
static void
drop_action_register (ClutterDropAction *self)
{
ClutterDropActionPrivate *priv = self->priv;
DropTarget *data;
g_assert (priv->stage != NULL);
data = g_object_get_data (G_OBJECT (priv->stage), "__clutter_drop_targets");
if (data == NULL)
{
data = g_new0 (DropTarget, 1);
data->stage = priv->stage;
data->actions = g_hash_table_new (NULL, NULL);
data->capture_id = g_signal_connect (priv->stage, "captured-event",
G_CALLBACK (on_stage_capture),
data);
g_object_set_data_full (G_OBJECT (priv->stage), "__clutter_drop_targets",
data,
drop_target_free);
}
g_hash_table_replace (data->actions, priv->actor, self);
}
static void
drop_action_unregister (ClutterDropAction *self)
{
ClutterDropActionPrivate *priv = self->priv;
DropTarget *data = NULL;
if (priv->stage != NULL)
data = g_object_get_data (G_OBJECT (priv->stage), "__clutter_drop_targets");
if (data == NULL)
return;
g_hash_table_remove (data->actions, priv->actor);
if (g_hash_table_size (data->actions) == 0)
g_object_set_data (G_OBJECT (data->stage), "__clutter_drop_targets", NULL);
}
static void
on_actor_mapped (ClutterActor *actor,
GParamSpec *pspec,
ClutterDropAction *self)
{
if (clutter_actor_is_mapped (actor))
{
if (self->priv->stage == NULL)
self->priv->stage = clutter_actor_get_stage (actor);
drop_action_register (self);
}
else
drop_action_unregister (self);
}
static void
clutter_drop_action_set_actor (ClutterActorMeta *meta,
ClutterActor *actor)
{
ClutterDropActionPrivate *priv = CLUTTER_DROP_ACTION (meta)->priv;
if (priv->actor != NULL)
{
drop_action_unregister (CLUTTER_DROP_ACTION (meta));
if (priv->mapped_id != 0)
g_signal_handler_disconnect (priv->actor, priv->mapped_id);
priv->stage = NULL;
priv->actor = NULL;
priv->mapped_id = 0;
}
priv->actor = actor;
if (priv->actor != NULL)
{
priv->stage = clutter_actor_get_stage (actor);
priv->mapped_id = g_signal_connect (actor, "notify::mapped",
G_CALLBACK (on_actor_mapped),
meta);
if (priv->stage != NULL)
drop_action_register (CLUTTER_DROP_ACTION (meta));
}
CLUTTER_ACTOR_META_CLASS (clutter_drop_action_parent_class)->set_actor (meta, actor);
}
static gboolean
signal_accumulator (GSignalInvocationHint *ihint,
GValue *return_accu,
const GValue *handler_return,
gpointer user_data)
{
gboolean continue_emission;
continue_emission = g_value_get_boolean (handler_return);
g_value_set_boolean (return_accu, continue_emission);
return continue_emission;
}
static gboolean
clutter_drop_action_real_can_drop (ClutterDropAction *action,
ClutterActor *actor,
gfloat event_x,
gfloat event_y)
{
return TRUE;
}
static void
clutter_drop_action_class_init (ClutterDropActionClass *klass)
{
ClutterActorMetaClass *meta_class = CLUTTER_ACTOR_META_CLASS (klass);
meta_class->set_actor = clutter_drop_action_set_actor;
klass->can_drop = clutter_drop_action_real_can_drop;
/**
* ClutterDropAction::can-drop:
* @action: the #ClutterDropAction that emitted the signal
* @actor: the #ClutterActor attached to the @action
* @event_x: the X coordinate (in stage space) of the drop event
* @event_y: the Y coordinate (in stage space) of the drop event
*
* The ::can-drop signal is emitted when the dragged actor is dropped
* on @actor. The return value of the ::can-drop signal will determine
* whether or not the #ClutterDropAction::drop signal is going to be
* emitted on @action.
*
* The default implementation of #ClutterDropAction returns %TRUE for
* this signal.
*
* Return value: %TRUE if the drop is accepted, and %FALSE otherwise
*
* Since: 1.8
*/
drop_signals[CAN_DROP] =
g_signal_new (I_("can-drop"),
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (ClutterDropActionClass, can_drop),
signal_accumulator, NULL,
_clutter_marshal_BOOLEAN__OBJECT_FLOAT_FLOAT,
G_TYPE_BOOLEAN, 3,
CLUTTER_TYPE_ACTOR,
G_TYPE_FLOAT,
G_TYPE_FLOAT);
/**
* ClutterDropAction::over-in:
* @action: the #ClutterDropAction that emitted the signal
* @actor: the #ClutterActor attached to the @action
*
* The ::over-in signal is emitted when the dragged actor crosses
* into @actor.
*
* Since: 1.8
*/
drop_signals[OVER_IN] =
g_signal_new (I_("over-in"),
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (ClutterDropActionClass, over_in),
NULL, NULL,
_clutter_marshal_VOID__OBJECT,
G_TYPE_NONE, 1,
CLUTTER_TYPE_ACTOR);
/**
* ClutterDropAction::over-out:
* @action: the #ClutterDropAction that emitted the signal
* @actor: the #ClutterActor attached to the @action
*
* The ::over-out signal is emitted when the dragged actor crosses
* outside @actor.
*
* Since: 1.8
*/
drop_signals[OVER_OUT] =
g_signal_new (I_("over-out"),
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (ClutterDropActionClass, over_out),
NULL, NULL,
_clutter_marshal_VOID__OBJECT,
G_TYPE_NONE, 1,
CLUTTER_TYPE_ACTOR);
/**
* ClutterDropAction::drop:
* @action: the #ClutterDropAction that emitted the signal
* @actor: the #ClutterActor attached to the @action
* @event_x: the X coordinate (in stage space) of the drop event
* @event_y: the Y coordinate (in stage space) of the drop event
*
* The ::drop signal is emitted when the dragged actor is dropped
* on @actor. This signal is only emitted if at least an handler of
* #ClutterDropAction::can-drop returns %TRUE.
*
* Since: 1.8
*/
drop_signals[DROP] =
g_signal_new (I_("drop"),
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (ClutterDropActionClass, drop),
NULL, NULL,
_clutter_marshal_VOID__OBJECT_FLOAT_FLOAT,
G_TYPE_NONE, 3,
CLUTTER_TYPE_ACTOR,
G_TYPE_FLOAT,
G_TYPE_FLOAT);
/**
* ClutterDropAction::drop-cancel:
* @action: the #ClutterDropAction that emitted the signal
* @actor: the #ClutterActor attached to the @action
* @event_x: the X coordinate (in stage space) of the drop event
* @event_y: the Y coordinate (in stage space) of the drop event
*
* The ::drop-cancel signal is emitted when the drop is refused
* by an emission of the #ClutterDropAction::can-drop signal.
*
* After the ::drop-cancel signal is fired the active drag is
* terminated.
*
* Since: 1.12
*/
drop_signals[DROP_CANCEL] =
g_signal_new (I_("drop-cancel"),
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (ClutterDropActionClass, drop),
NULL, NULL,
_clutter_marshal_VOID__OBJECT_FLOAT_FLOAT,
G_TYPE_NONE, 3,
CLUTTER_TYPE_ACTOR,
G_TYPE_FLOAT,
G_TYPE_FLOAT);
}
static void
clutter_drop_action_init (ClutterDropAction *self)
{
self->priv = clutter_drop_action_get_instance_private (self);
}
/**
* clutter_drop_action_new:
*
* Creates a new #ClutterDropAction.
*
* Use clutter_actor_add_action() to add the action to a #ClutterActor.
*
* Return value: the newly created #ClutterDropAction
*
* Since: 1.8
*/
ClutterAction *
clutter_drop_action_new (void)
{
return g_object_new (CLUTTER_TYPE_DROP_ACTION, NULL);
}

View File

@@ -0,0 +1,115 @@
/*
* Clutter.
*
* An OpenGL based 'interactive canvas' library.
*
* Copyright © 2011 Intel Corporation.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
* Author:
* Emmanuele Bassi <ebassi@linux.intel.com>
*/
#ifndef __CLUTTER_DROP_ACTION_H__
#define __CLUTTER_DROP_ACTION_H__
#if !defined(__CLUTTER_H_INSIDE__) && !defined(CLUTTER_COMPILATION)
#error "Only <clutter/clutter.h> can be directly included."
#endif
#include <clutter/clutter-action.h>
G_BEGIN_DECLS
#define CLUTTER_TYPE_DROP_ACTION (clutter_drop_action_get_type ())
#define CLUTTER_DROP_ACTION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), CLUTTER_TYPE_DROP_ACTION, ClutterDropAction))
#define CLUTTER_IS_DROP_ACTION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CLUTTER_TYPE_DROP_ACTION))
#define CLUTTER_DROP_ACTION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), CLUTTER_TYPE_DROP_ACTION, ClutterDropActionClass))
#define CLUTTER_IS_DROP_ACTION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), CLUTTER_TYPE_DROP_ACTION))
#define CLUTTER_DROP_ACTION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), CLUTTER_TYPE_DROP_ACTION, ClutterDropActionClass))
typedef struct _ClutterDropAction ClutterDropAction;
typedef struct _ClutterDropActionPrivate ClutterDropActionPrivate;
typedef struct _ClutterDropActionClass ClutterDropActionClass;
/**
* ClutterDropAction:
*
* The #ClutterDropAction structure contains only
* private data and should be accessed using the provided API.
*
* Since: 1.8
*/
struct _ClutterDropAction
{
/*< private >*/
ClutterAction parent_instance;
ClutterDropActionPrivate *priv;
};
/**
* ClutterDropActionClass:
* @can_drop: class handler for the #ClutterDropAction::can-drop signal
* @over_in: class handler for the #ClutterDropAction::over-in signal
* @over_out: class handler for the #ClutterDropAction::over-out signal
* @drop: class handler for the #ClutterDropAction::drop signal
*
* The #ClutterDropActionClass structure contains
* only private data.
*
* Since: 1.8
*/
struct _ClutterDropActionClass
{
/*< private >*/
ClutterActionClass parent_class;
/*< public >*/
gboolean (* can_drop) (ClutterDropAction *action,
ClutterActor *actor,
gfloat event_x,
gfloat event_y);
void (* over_in) (ClutterDropAction *action,
ClutterActor *actor);
void (* over_out) (ClutterDropAction *action,
ClutterActor *actor);
void (* drop) (ClutterDropAction *action,
ClutterActor *actor,
gfloat event_x,
gfloat event_y);
/*< private >*/
void (*_clutter_drop_action1) (void);
void (*_clutter_drop_action2) (void);
void (*_clutter_drop_action3) (void);
void (*_clutter_drop_action4) (void);
void (*_clutter_drop_action5) (void);
void (*_clutter_drop_action6) (void);
void (*_clutter_drop_action7) (void);
void (*_clutter_drop_action8) (void);
};
CLUTTER_EXPORT
GType clutter_drop_action_get_type (void) G_GNUC_CONST;
CLUTTER_EXPORT
ClutterAction * clutter_drop_action_new (void);
G_END_DECLS
#endif /* __CLUTTER_DROP_ACTION_H__ */

View File

@@ -5,18 +5,15 @@
G_BEGIN_DECLS G_BEGIN_DECLS
gboolean _clutter_effect_pre_paint (ClutterEffect *effect, gboolean _clutter_effect_pre_paint (ClutterEffect *effect);
ClutterPaintContext *paint_context); void _clutter_effect_post_paint (ClutterEffect *effect);
void _clutter_effect_post_paint (ClutterEffect *effect, gboolean _clutter_effect_get_paint_volume (ClutterEffect *effect,
ClutterPaintContext *paint_context);
gboolean _clutter_effect_modify_paint_volume (ClutterEffect *effect,
ClutterPaintVolume *volume); ClutterPaintVolume *volume);
gboolean _clutter_effect_has_custom_paint_volume (ClutterEffect *effect); gboolean _clutter_effect_has_custom_paint_volume (ClutterEffect *effect);
void _clutter_effect_paint (ClutterEffect *effect, void _clutter_effect_paint (ClutterEffect *effect,
ClutterPaintContext *paint_context,
ClutterEffectPaintFlags flags); ClutterEffectPaintFlags flags);
void _clutter_effect_pick (ClutterEffect *effect, void _clutter_effect_pick (ClutterEffect *effect,
ClutterPickContext *pick_context); ClutterEffectPaintFlags flags);
G_END_DECLS G_END_DECLS

View File

@@ -100,13 +100,13 @@
* // Clear the previous state // * // Clear the previous state //
* if (self->rect_1) * if (self->rect_1)
* { * {
* cogl_object_unref (self->rect_1); * cogl_handle_unref (self->rect_1);
* self->rect_1 = NULL; * self->rect_1 = NULL;
* } * }
* *
* if (self->rect_2) * if (self->rect_2)
* { * {
* cogl_object_unref (self->rect_2); * cogl_handle_unref (self->rect_2);
* self->rect_2 = NULL; * self->rect_2 = NULL;
* } * }
* *
@@ -177,28 +177,25 @@ G_DEFINE_ABSTRACT_TYPE (ClutterEffect,
CLUTTER_TYPE_ACTOR_META); CLUTTER_TYPE_ACTOR_META);
static gboolean static gboolean
clutter_effect_real_pre_paint (ClutterEffect *effect, clutter_effect_real_pre_paint (ClutterEffect *effect)
ClutterPaintContext *paint_context)
{ {
return TRUE; return TRUE;
} }
static void static void
clutter_effect_real_post_paint (ClutterEffect *effect, clutter_effect_real_post_paint (ClutterEffect *effect)
ClutterPaintContext *paint_context)
{ {
} }
static gboolean static gboolean
clutter_effect_real_modify_paint_volume (ClutterEffect *effect, clutter_effect_real_get_paint_volume (ClutterEffect *effect,
ClutterPaintVolume *volume) ClutterPaintVolume *volume)
{ {
return TRUE; return TRUE;
} }
static void static void
clutter_effect_real_paint (ClutterEffect *effect, clutter_effect_real_paint (ClutterEffect *effect,
ClutterPaintContext *paint_context,
ClutterEffectPaintFlags flags) ClutterEffectPaintFlags flags)
{ {
ClutterActorMeta *actor_meta = CLUTTER_ACTOR_META (effect); ClutterActorMeta *actor_meta = CLUTTER_ACTOR_META (effect);
@@ -209,51 +206,53 @@ clutter_effect_real_paint (ClutterEffect *effect,
effects that haven't migrated to use the 'paint' virtual yet. This effects that haven't migrated to use the 'paint' virtual yet. This
just calls the old pre and post virtuals before chaining on */ just calls the old pre and post virtuals before chaining on */
pre_paint_succeeded = _clutter_effect_pre_paint (effect, paint_context); pre_paint_succeeded = _clutter_effect_pre_paint (effect);
actor = clutter_actor_meta_get_actor (actor_meta); actor = clutter_actor_meta_get_actor (actor_meta);
clutter_actor_continue_paint (actor, paint_context); clutter_actor_continue_paint (actor);
if (pre_paint_succeeded) if (pre_paint_succeeded)
_clutter_effect_post_paint (effect, paint_context); _clutter_effect_post_paint (effect);
} }
static void static void
clutter_effect_real_pick (ClutterEffect *effect, clutter_effect_real_pick (ClutterEffect *effect,
ClutterPickContext *pick_context) ClutterEffectPaintFlags flags)
{ {
ClutterActorMeta *actor_meta = CLUTTER_ACTOR_META (effect); ClutterActorMeta *actor_meta = CLUTTER_ACTOR_META (effect);
ClutterActor *actor; ClutterActor *actor;
actor = clutter_actor_meta_get_actor (actor_meta); actor = clutter_actor_meta_get_actor (actor_meta);
clutter_actor_continue_pick (actor, pick_context); clutter_actor_continue_paint (actor);
} }
static void static void
clutter_effect_set_enabled (ClutterActorMeta *meta, clutter_effect_notify (GObject *gobject,
gboolean is_enabled) GParamSpec *pspec)
{ {
ClutterActorMetaClass *parent_class = if (strcmp (pspec->name, "enabled") == 0)
CLUTTER_ACTOR_META_CLASS (clutter_effect_parent_class); {
ClutterActor *actor; ClutterActorMeta *meta = CLUTTER_ACTOR_META (gobject);
ClutterActor *actor = clutter_actor_meta_get_actor (meta);
actor = clutter_actor_meta_get_actor (meta); if (actor != NULL)
if (actor) clutter_actor_queue_redraw (actor);
clutter_actor_queue_redraw (actor); }
parent_class->set_enabled (meta, is_enabled); if (G_OBJECT_CLASS (clutter_effect_parent_class)->notify != NULL)
G_OBJECT_CLASS (clutter_effect_parent_class)->notify (gobject, pspec);
} }
static void static void
clutter_effect_class_init (ClutterEffectClass *klass) clutter_effect_class_init (ClutterEffectClass *klass)
{ {
ClutterActorMetaClass *actor_meta_class = CLUTTER_ACTOR_META_CLASS (klass); GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
actor_meta_class->set_enabled = clutter_effect_set_enabled; gobject_class->notify = clutter_effect_notify;
klass->pre_paint = clutter_effect_real_pre_paint; klass->pre_paint = clutter_effect_real_pre_paint;
klass->post_paint = clutter_effect_real_post_paint; klass->post_paint = clutter_effect_real_post_paint;
klass->modify_paint_volume = clutter_effect_real_modify_paint_volume; klass->get_paint_volume = clutter_effect_real_get_paint_volume;
klass->paint = clutter_effect_real_paint; klass->paint = clutter_effect_real_paint;
klass->pick = clutter_effect_real_pick; klass->pick = clutter_effect_real_pick;
} }
@@ -264,51 +263,47 @@ clutter_effect_init (ClutterEffect *self)
} }
gboolean gboolean
_clutter_effect_pre_paint (ClutterEffect *effect, _clutter_effect_pre_paint (ClutterEffect *effect)
ClutterPaintContext *paint_context)
{ {
g_return_val_if_fail (CLUTTER_IS_EFFECT (effect), FALSE); g_return_val_if_fail (CLUTTER_IS_EFFECT (effect), FALSE);
return CLUTTER_EFFECT_GET_CLASS (effect)->pre_paint (effect, paint_context); return CLUTTER_EFFECT_GET_CLASS (effect)->pre_paint (effect);
} }
void void
_clutter_effect_post_paint (ClutterEffect *effect, _clutter_effect_post_paint (ClutterEffect *effect)
ClutterPaintContext *paint_context)
{ {
g_return_if_fail (CLUTTER_IS_EFFECT (effect)); g_return_if_fail (CLUTTER_IS_EFFECT (effect));
CLUTTER_EFFECT_GET_CLASS (effect)->post_paint (effect, paint_context); CLUTTER_EFFECT_GET_CLASS (effect)->post_paint (effect);
} }
void void
_clutter_effect_paint (ClutterEffect *effect, _clutter_effect_paint (ClutterEffect *effect,
ClutterPaintContext *paint_context,
ClutterEffectPaintFlags flags) ClutterEffectPaintFlags flags)
{ {
g_return_if_fail (CLUTTER_IS_EFFECT (effect)); g_return_if_fail (CLUTTER_IS_EFFECT (effect));
CLUTTER_EFFECT_GET_CLASS (effect)->paint (effect, paint_context, flags); CLUTTER_EFFECT_GET_CLASS (effect)->paint (effect, flags);
} }
void void
_clutter_effect_pick (ClutterEffect *effect, _clutter_effect_pick (ClutterEffect *effect,
ClutterPickContext *pick_context) ClutterEffectPaintFlags flags)
{ {
g_return_if_fail (CLUTTER_IS_EFFECT (effect)); g_return_if_fail (CLUTTER_IS_EFFECT (effect));
CLUTTER_EFFECT_GET_CLASS (effect)->pick (effect, pick_context); CLUTTER_EFFECT_GET_CLASS (effect)->pick (effect, flags);
} }
gboolean gboolean
_clutter_effect_modify_paint_volume (ClutterEffect *effect, _clutter_effect_get_paint_volume (ClutterEffect *effect,
ClutterPaintVolume *volume) ClutterPaintVolume *volume)
{ {
g_return_val_if_fail (CLUTTER_IS_EFFECT (effect), FALSE); g_return_val_if_fail (CLUTTER_IS_EFFECT (effect), FALSE);
g_return_val_if_fail (volume != NULL, FALSE); g_return_val_if_fail (volume != NULL, FALSE);
return CLUTTER_EFFECT_GET_CLASS (effect)->modify_paint_volume (effect, return CLUTTER_EFFECT_GET_CLASS (effect)->get_paint_volume (effect, volume);
volume);
} }
gboolean gboolean
@@ -316,7 +311,7 @@ _clutter_effect_has_custom_paint_volume (ClutterEffect *effect)
{ {
g_return_val_if_fail (CLUTTER_IS_EFFECT (effect), FALSE); g_return_val_if_fail (CLUTTER_IS_EFFECT (effect), FALSE);
return CLUTTER_EFFECT_GET_CLASS (effect)->modify_paint_volume != clutter_effect_real_modify_paint_volume; return CLUTTER_EFFECT_GET_CLASS (effect)->get_paint_volume != clutter_effect_real_get_paint_volume;
} }
/** /**

View File

@@ -30,8 +30,6 @@
#endif #endif
#include <clutter/clutter-actor-meta.h> #include <clutter/clutter-actor-meta.h>
#include <clutter/clutter-paint-context.h>
#include <clutter/clutter-pick-context.h>
G_BEGIN_DECLS G_BEGIN_DECLS
@@ -62,7 +60,7 @@ struct _ClutterEffect
* ClutterEffectClass: * ClutterEffectClass:
* @pre_paint: virtual function * @pre_paint: virtual function
* @post_paint: virtual function * @post_paint: virtual function
* @modify_paint_volume: virtual function * @get_paint_volume: virtual function
* @paint: virtual function * @paint: virtual function
* @pick: virtual function * @pick: virtual function
* *
@@ -76,19 +74,16 @@ struct _ClutterEffectClass
ClutterActorMetaClass parent_class; ClutterActorMetaClass parent_class;
/*< public >*/ /*< public >*/
gboolean (* pre_paint) (ClutterEffect *effect, gboolean (* pre_paint) (ClutterEffect *effect);
ClutterPaintContext *paint_context); void (* post_paint) (ClutterEffect *effect);
void (* post_paint) (ClutterEffect *effect,
ClutterPaintContext *paint_context);
gboolean (* modify_paint_volume) (ClutterEffect *effect, gboolean (* get_paint_volume) (ClutterEffect *effect,
ClutterPaintVolume *volume); ClutterPaintVolume *volume);
void (* paint) (ClutterEffect *effect, void (* paint) (ClutterEffect *effect,
ClutterPaintContext *paint_context, ClutterEffectPaintFlags flags);
ClutterEffectPaintFlags flags); void (* pick) (ClutterEffect *effect,
void (* pick) (ClutterEffect *effect, ClutterEffectPaintFlags flags);
ClutterPickContext *pick_context);
/*< private >*/ /*< private >*/
void (* _clutter_effect4) (void); void (* _clutter_effect4) (void);

View File

@@ -13,7 +13,7 @@ G_BEGIN_DECLS
/*** END file-header ***/ /*** END file-header ***/
/*** BEGIN file-production ***/ /*** BEGIN file-production ***/
/* enumerations from "@basename@" */ /* enumerations from "@filename@" */
/*** END file-production ***/ /*** END file-production ***/
/*** BEGIN value-header ***/ /*** BEGIN value-header ***/

View File

@@ -51,8 +51,7 @@ G_BEGIN_DECLS
* *
* Deprecated: 1.22: Use the normalized #ClutterActor pivot point instead * Deprecated: 1.22: Use the normalized #ClutterActor pivot point instead
*/ */
typedef enum /*< prefix=CLUTTER_GRAVITY >*/ typedef enum { /*< prefix=CLUTTER_GRAVITY >*/
{
CLUTTER_GRAVITY_NONE = 0, CLUTTER_GRAVITY_NONE = 0,
CLUTTER_GRAVITY_NORTH, CLUTTER_GRAVITY_NORTH,
CLUTTER_GRAVITY_NORTH_EAST, CLUTTER_GRAVITY_NORTH_EAST,
@@ -75,8 +74,7 @@ typedef enum /*< prefix=CLUTTER_GRAVITY >*/
* *
* Since: 0.4 * Since: 0.4
*/ */
typedef enum /*< prefix=CLUTTER >*/ typedef enum { /*< prefix=CLUTTER >*/
{
CLUTTER_X_AXIS, CLUTTER_X_AXIS,
CLUTTER_Y_AXIS, CLUTTER_Y_AXIS,
CLUTTER_Z_AXIS CLUTTER_Z_AXIS
@@ -93,8 +91,7 @@ typedef enum /*< prefix=CLUTTER >*/
* *
* Deprecated: 1.22 * Deprecated: 1.22
*/ */
typedef enum /*< prefix=CLUTTER_ROTATE >*/ typedef enum { /*< prefix=CLUTTER_ROTATE >*/
{
CLUTTER_ROTATE_CW, CLUTTER_ROTATE_CW,
CLUTTER_ROTATE_CCW CLUTTER_ROTATE_CCW
} ClutterRotateDirection; } ClutterRotateDirection;
@@ -110,8 +107,7 @@ typedef enum /*< prefix=CLUTTER_ROTATE >*/
* *
* Since: 0.8 * Since: 0.8
*/ */
typedef enum /*< prefix=CLUTTER_REQUEST >*/ typedef enum { /*< prefix=CLUTTER_REQUEST >*/
{
CLUTTER_REQUEST_HEIGHT_FOR_WIDTH, CLUTTER_REQUEST_HEIGHT_FOR_WIDTH,
CLUTTER_REQUEST_WIDTH_FOR_HEIGHT, CLUTTER_REQUEST_WIDTH_FOR_HEIGHT,
CLUTTER_REQUEST_CONTENT_SIZE CLUTTER_REQUEST_CONTENT_SIZE
@@ -190,7 +186,7 @@ typedef enum /*< prefix=CLUTTER_REQUEST >*/
* @CLUTTER_ANIMATION_LAST: last animation mode, used as a guard for * @CLUTTER_ANIMATION_LAST: last animation mode, used as a guard for
* registered global alpha functions * registered global alpha functions
* *
* The animation modes used by #ClutterAnimatable. This * The animation modes used by #ClutterAlpha and #ClutterAnimation. This
* enumeration can be expanded in later versions of Clutter. * enumeration can be expanded in later versions of Clutter.
* *
* <figure id="easing-modes"> * <figure id="easing-modes">
@@ -204,8 +200,7 @@ typedef enum /*< prefix=CLUTTER_REQUEST >*/
* *
* Since: 1.0 * Since: 1.0
*/ */
typedef enum typedef enum {
{
CLUTTER_CUSTOM_MODE = 0, CLUTTER_CUSTOM_MODE = 0,
/* linear */ /* linear */
@@ -277,6 +272,23 @@ typedef enum
CLUTTER_ANIMATION_LAST CLUTTER_ANIMATION_LAST
} ClutterAnimationMode; } ClutterAnimationMode;
/**
* ClutterFontFlags:
* @CLUTTER_FONT_MIPMAPPING: Set to use mipmaps for the glyph cache textures.
* @CLUTTER_FONT_HINTING: Set to enable hinting on the glyphs.
*
* Runtime flags to change the font quality. To be used with
* clutter_set_font_flags().
*
* Since: 1.0
*
* Deprecated: 1.22: Use #cairo_font_options_t instead
*/
typedef enum { /*< prefix=CLUTTER_FONT >*/
CLUTTER_FONT_MIPMAPPING = (1 << 0),
CLUTTER_FONT_HINTING = (1 << 1)
} ClutterFontFlags;
/** /**
* ClutterTextDirection: * ClutterTextDirection:
* @CLUTTER_TEXT_DIRECTION_DEFAULT: Use the default setting, as returned * @CLUTTER_TEXT_DIRECTION_DEFAULT: Use the default setting, as returned
@@ -288,8 +300,7 @@ typedef enum
* *
* Since: 1.2 * Since: 1.2
*/ */
typedef enum typedef enum {
{
CLUTTER_TEXT_DIRECTION_DEFAULT, CLUTTER_TEXT_DIRECTION_DEFAULT,
CLUTTER_TEXT_DIRECTION_LTR, CLUTTER_TEXT_DIRECTION_LTR,
CLUTTER_TEXT_DIRECTION_RTL CLUTTER_TEXT_DIRECTION_RTL
@@ -304,8 +315,7 @@ typedef enum
* *
* Since: 1.4 * Since: 1.4
*/ */
typedef enum typedef enum {
{
CLUTTER_VERTEX_SHADER, CLUTTER_VERTEX_SHADER,
CLUTTER_FRAGMENT_SHADER CLUTTER_FRAGMENT_SHADER
} ClutterShaderType; } ClutterShaderType;
@@ -340,8 +350,7 @@ typedef enum
* *
* Since: 0.4 * Since: 0.4
*/ */
typedef enum typedef enum {
{
CLUTTER_SHIFT_MASK = 1 << 0, CLUTTER_SHIFT_MASK = 1 << 0,
CLUTTER_LOCK_MASK = 1 << 1, CLUTTER_LOCK_MASK = 1 << 1,
CLUTTER_CONTROL_MASK = 1 << 2, CLUTTER_CONTROL_MASK = 1 << 2,
@@ -407,8 +416,7 @@ typedef enum
* Keyboard accessibility features applied to a ClutterInputDevice keyboard. * Keyboard accessibility features applied to a ClutterInputDevice keyboard.
* *
*/ */
typedef enum typedef enum {
{
CLUTTER_A11Y_KEYBOARD_ENABLED = 1 << 0, CLUTTER_A11Y_KEYBOARD_ENABLED = 1 << 0,
CLUTTER_A11Y_TIMEOUT_ENABLED = 1 << 1, CLUTTER_A11Y_TIMEOUT_ENABLED = 1 << 1,
CLUTTER_A11Y_MOUSE_KEYS_ENABLED = 1 << 2, CLUTTER_A11Y_MOUSE_KEYS_ENABLED = 1 << 2,
@@ -425,88 +433,6 @@ typedef enum
CLUTTER_A11Y_FEATURE_STATE_CHANGE_BEEP = 1 << 13, CLUTTER_A11Y_FEATURE_STATE_CHANGE_BEEP = 1 << 13,
} ClutterKeyboardA11yFlags; } ClutterKeyboardA11yFlags;
/**
* ClutterPointerA11yFlags:
* @CLUTTER_A11Y_POINTER_ENABLED:
* @CLUTTER_A11Y_SECONDARY_CLICK_ENABLED:
* @CLUTTER_A11Y_DWELL_ENABLED:
*
* Pointer accessibility features applied to a ClutterInputDevice pointer.
*
*/
typedef enum {
CLUTTER_A11Y_SECONDARY_CLICK_ENABLED = 1 << 0,
CLUTTER_A11Y_DWELL_ENABLED = 1 << 1,
} ClutterPointerA11yFlags;
/**
* ClutterPointerA11yDwellClickType:
* @CLUTTER_A11Y_DWELL_CLICK_TYPE_NONE: Internal use only
* @CLUTTER_A11Y_DWELL_CLICK_TYPE_PRIMARY:
* @CLUTTER_A11Y_DWELL_CLICK_TYPE_SECONDARY:
* @CLUTTER_A11Y_DWELL_CLICK_TYPE_MIDDLE:
* @CLUTTER_A11Y_DWELL_CLICK_TYPE_DOUBLE:
* @CLUTTER_A11Y_DWELL_CLICK_TYPE_DRAG:
*
* Dwell click types.
*
*/
typedef enum {
CLUTTER_A11Y_DWELL_CLICK_TYPE_NONE,
CLUTTER_A11Y_DWELL_CLICK_TYPE_PRIMARY,
CLUTTER_A11Y_DWELL_CLICK_TYPE_SECONDARY,
CLUTTER_A11Y_DWELL_CLICK_TYPE_MIDDLE,
CLUTTER_A11Y_DWELL_CLICK_TYPE_DOUBLE,
CLUTTER_A11Y_DWELL_CLICK_TYPE_DRAG,
} ClutterPointerA11yDwellClickType;
/**
* ClutterPointerA11yDwellDirection:
* @CLUTTER_A11Y_DWELL_DIRECTION_NONE:
* @CLUTTER_A11Y_DWELL_DIRECTION_LEFT:
* @CLUTTER_A11Y_DWELL_DIRECTION_RIGHT:
* @CLUTTER_A11Y_DWELL_DIRECTION_UP:
* @CLUTTER_A11Y_DWELL_DIRECTION_DOWN:
*
* Dwell gesture directions.
*
*/
typedef enum {
CLUTTER_A11Y_DWELL_DIRECTION_NONE,
CLUTTER_A11Y_DWELL_DIRECTION_LEFT,
CLUTTER_A11Y_DWELL_DIRECTION_RIGHT,
CLUTTER_A11Y_DWELL_DIRECTION_UP,
CLUTTER_A11Y_DWELL_DIRECTION_DOWN,
} ClutterPointerA11yDwellDirection;
/**
* ClutterPointerA11yDwellMode:
* @CLUTTER_A11Y_DWELL_MODE_WINDOW:
* @CLUTTER_A11Y_DWELL_MODE_GESTURE:
*
* Dwell mode.
*
*/
typedef enum {
CLUTTER_A11Y_DWELL_MODE_WINDOW,
CLUTTER_A11Y_DWELL_MODE_GESTURE,
} ClutterPointerA11yDwellMode;
/**
* ClutterPointerA11yTimeoutType:
* @CLUTTER_A11Y_TIMEOUT_TYPE_SECONDARY_CLICK:
* @CLUTTER_A11Y_TIMEOUT_TYPE_DWELL:
* @CLUTTER_A11Y_TIMEOUT_TYPE_GESTURE:
*
* Pointer accessibility timeout type.
*
*/
typedef enum {
CLUTTER_A11Y_TIMEOUT_TYPE_SECONDARY_CLICK,
CLUTTER_A11Y_TIMEOUT_TYPE_DWELL,
CLUTTER_A11Y_TIMEOUT_TYPE_GESTURE,
} ClutterPointerA11yTimeoutType;
/** /**
* ClutterActorFlags: * ClutterActorFlags:
* @CLUTTER_ACTOR_MAPPED: the actor will be painted (is visible, and inside * @CLUTTER_ACTOR_MAPPED: the actor will be painted (is visible, and inside
@@ -522,8 +448,7 @@ typedef enum {
* *
* Flags used to signal the state of an actor. * Flags used to signal the state of an actor.
*/ */
typedef enum /*< prefix=CLUTTER_ACTOR >*/ typedef enum { /*< prefix=CLUTTER_ACTOR >*/
{
CLUTTER_ACTOR_MAPPED = 1 << 1, CLUTTER_ACTOR_MAPPED = 1 << 1,
CLUTTER_ACTOR_REALIZED = 1 << 2, CLUTTER_ACTOR_REALIZED = 1 << 2,
CLUTTER_ACTOR_REACTIVE = 1 << 3, CLUTTER_ACTOR_REACTIVE = 1 << 3,
@@ -535,25 +460,44 @@ typedef enum /*< prefix=CLUTTER_ACTOR >*/
* ClutterOffscreenRedirect: * ClutterOffscreenRedirect:
* @CLUTTER_OFFSCREEN_REDIRECT_AUTOMATIC_FOR_OPACITY: Only redirect * @CLUTTER_OFFSCREEN_REDIRECT_AUTOMATIC_FOR_OPACITY: Only redirect
* the actor if it is semi-transparent and its has_overlaps() * the actor if it is semi-transparent and its has_overlaps()
* virtual returns %TRUE. * virtual returns %TRUE. This is the default.
* @CLUTTER_OFFSCREEN_REDIRECT_ALWAYS: Always redirect the actor to an * @CLUTTER_OFFSCREEN_REDIRECT_ALWAYS: Always redirect the actor to an
* offscreen buffer even if it is fully opaque. * offscreen buffer even if it is fully opaque.
* @CLUTTER_OFFSCREEN_REDIRECT_ON_IDLE: Only redirect the actor if it is the
* most efficient thing to do based on its recent repaint behaviour. That
* means when its contents are changing less frequently than it's being used
* on stage.
* *
* Possible flags to pass to clutter_actor_set_offscreen_redirect(). * Possible flags to pass to clutter_actor_set_offscreen_redirect().
* *
* Since: 1.8 * Since: 1.8
*/ */
typedef enum /*< prefix=CLUTTER_OFFSCREEN_REDIRECT >*/ typedef enum { /*< prefix=CLUTTER_OFFSCREEN_REDIRECT >*/
{ CLUTTER_OFFSCREEN_REDIRECT_AUTOMATIC_FOR_OPACITY = 1<<0,
CLUTTER_OFFSCREEN_REDIRECT_AUTOMATIC_FOR_OPACITY = 1 << 0, CLUTTER_OFFSCREEN_REDIRECT_ALWAYS = 1<<1
CLUTTER_OFFSCREEN_REDIRECT_ALWAYS = 1 << 1,
CLUTTER_OFFSCREEN_REDIRECT_ON_IDLE = 1 << 2
} ClutterOffscreenRedirect; } ClutterOffscreenRedirect;
/**
* ClutterAllocationFlags:
* @CLUTTER_ALLOCATION_NONE: No flag set
* @CLUTTER_ABSOLUTE_ORIGIN_CHANGED: Whether the absolute origin of the
* actor has changed; this implies that any ancestor of the actor has
* been moved.
* @CLUTTER_DELEGATE_LAYOUT: Whether the allocation should be delegated
* to the #ClutterLayoutManager instance stored inside the
* #ClutterActor:layout-manager property of #ClutterActor. This flag
* should only be used if you are subclassing #ClutterActor and
* overriding the #ClutterActorClass.allocate() virtual function, but
* you wish to use the default implementation of the virtual function
* inside #ClutterActor. Added in Clutter 1.10.
*
* Flags passed to the #ClutterActorClass.allocate() virtual function
* and to the clutter_actor_allocate() function.
*
* Since: 1.0
*/
typedef enum {
CLUTTER_ALLOCATION_NONE = 0,
CLUTTER_ABSOLUTE_ORIGIN_CHANGED = 1 << 1,
CLUTTER_DELEGATE_LAYOUT = 1 << 2
} ClutterAllocationFlags;
/** /**
* ClutterAlignAxis: * ClutterAlignAxis:
* @CLUTTER_ALIGN_X_AXIS: Maintain the alignment on the X axis * @CLUTTER_ALIGN_X_AXIS: Maintain the alignment on the X axis
@@ -565,8 +509,7 @@ typedef enum /*< prefix=CLUTTER_OFFSCREEN_REDIRECT >*/
* *
* Since: 1.4 * Since: 1.4
*/ */
typedef enum /*< prefix=CLUTTER_ALIGN >*/ typedef enum { /*< prefix=CLUTTER_ALIGN >*/
{
CLUTTER_ALIGN_X_AXIS, CLUTTER_ALIGN_X_AXIS,
CLUTTER_ALIGN_Y_AXIS, CLUTTER_ALIGN_Y_AXIS,
CLUTTER_ALIGN_BOTH CLUTTER_ALIGN_BOTH
@@ -583,8 +526,7 @@ typedef enum /*< prefix=CLUTTER_ALIGN >*/
* *
* Deprecated: 1.22 * Deprecated: 1.22
*/ */
typedef enum typedef enum {
{
CLUTTER_INTERPOLATION_LINEAR, CLUTTER_INTERPOLATION_LINEAR,
CLUTTER_INTERPOLATION_CUBIC CLUTTER_INTERPOLATION_CUBIC
} ClutterInterpolation; } ClutterInterpolation;
@@ -609,8 +551,7 @@ typedef enum
* Deprecated: 1.12: Use #ClutterActorAlign and the #ClutterActor * Deprecated: 1.12: Use #ClutterActorAlign and the #ClutterActor
* API instead * API instead
*/ */
typedef enum typedef enum {
{
CLUTTER_BIN_ALIGNMENT_FIXED, CLUTTER_BIN_ALIGNMENT_FIXED,
CLUTTER_BIN_ALIGNMENT_FILL, CLUTTER_BIN_ALIGNMENT_FILL,
CLUTTER_BIN_ALIGNMENT_START, CLUTTER_BIN_ALIGNMENT_START,
@@ -635,8 +576,7 @@ typedef enum
* *
* Since: 1.4 * Since: 1.4
*/ */
typedef enum /*< prefix=CLUTTER_BIND >*/ typedef enum { /*< prefix=CLUTTER_BIND >*/
{
CLUTTER_BIND_X, CLUTTER_BIND_X,
CLUTTER_BIND_Y, CLUTTER_BIND_Y,
CLUTTER_BIND_WIDTH, CLUTTER_BIND_WIDTH,
@@ -652,15 +592,11 @@ typedef enum /*< prefix=CLUTTER_BIND >*/
* has queued a redraw before this paint. This implies that the effect * has queued a redraw before this paint. This implies that the effect
* should call clutter_actor_continue_paint() to chain to the next * should call clutter_actor_continue_paint() to chain to the next
* effect and can not cache any results from a previous paint. * effect and can not cache any results from a previous paint.
* @CLUTTER_EFFECT_PAINT_BYPASS_EFFECT: The effect should not be used
* on this frame, but it will be asked to paint the actor still.
* *
* Flags passed to the paint or pick method of #ClutterEffect. * Flags passed to the paint or pick method of #ClutterEffect.
*/ */
typedef enum /*< prefix=CLUTTER_EFFECT_PAINT >*/ typedef enum { /*< prefix=CLUTTER_EFFECT_PAINT >*/
{ CLUTTER_EFFECT_PAINT_ACTOR_DIRTY = (1 << 0)
CLUTTER_EFFECT_PAINT_ACTOR_DIRTY = (1 << 0),
CLUTTER_EFFECT_PAINT_BYPASS_EFFECT = (1 << 1)
} ClutterEffectPaintFlags; } ClutterEffectPaintFlags;
/** /**
@@ -675,8 +611,7 @@ typedef enum /*< prefix=CLUTTER_EFFECT_PAINT >*/
* *
* Since: 1.2 * Since: 1.2
*/ */
typedef enum typedef enum {
{
CLUTTER_BOX_ALIGNMENT_START, CLUTTER_BOX_ALIGNMENT_START,
CLUTTER_BOX_ALIGNMENT_END, CLUTTER_BOX_ALIGNMENT_END,
CLUTTER_BOX_ALIGNMENT_CENTER CLUTTER_BOX_ALIGNMENT_CENTER
@@ -693,8 +628,7 @@ typedef enum
* *
* Since: 1.8 * Since: 1.8
*/ */
typedef enum /*< prefix=CLUTTER_LONG_PRESS >*/ typedef enum { /*< prefix=CLUTTER_LONG_PRESS >*/
{
CLUTTER_LONG_PRESS_QUERY, CLUTTER_LONG_PRESS_QUERY,
CLUTTER_LONG_PRESS_ACTIVATE, CLUTTER_LONG_PRESS_ACTIVATE,
CLUTTER_LONG_PRESS_CANCEL CLUTTER_LONG_PRESS_CANCEL
@@ -752,8 +686,7 @@ typedef enum /*< prefix=CLUTTER_LONG_PRESS >*/
* *
* Since: 1.6 * Since: 1.6
*/ */
typedef enum /*< prefix=CLUTTER_COLOR >*/ typedef enum { /*< prefix=CLUTTER_COLOR >*/
{
/* CGA/EGA-like palette */ /* CGA/EGA-like palette */
CLUTTER_COLOR_WHITE = 0, CLUTTER_COLOR_WHITE = 0,
CLUTTER_COLOR_BLACK, CLUTTER_COLOR_BLACK,
@@ -817,8 +750,7 @@ typedef enum /*< prefix=CLUTTER_COLOR >*/
* *
* Since: 1.4 * Since: 1.4
*/ */
typedef enum /*< prefix=CLUTTER_DRAG >*/ typedef enum { /*< prefix=CLUTTER_DRAG >*/
{
CLUTTER_DRAG_AXIS_NONE = 0, CLUTTER_DRAG_AXIS_NONE = 0,
CLUTTER_DRAG_X_AXIS, CLUTTER_DRAG_X_AXIS,
@@ -835,8 +767,7 @@ typedef enum /*< prefix=CLUTTER_DRAG >*/
* *
* Since: 0.6 * Since: 0.6
*/ */
typedef enum /*< flags prefix=CLUTTER_EVENT >*/ typedef enum { /*< flags prefix=CLUTTER_EVENT >*/
{
CLUTTER_EVENT_NONE = 0, CLUTTER_EVENT_NONE = 0,
CLUTTER_EVENT_FLAG_SYNTHETIC = 1 << 0, CLUTTER_EVENT_FLAG_SYNTHETIC = 1 << 0,
CLUTTER_EVENT_FLAG_INPUT_METHOD = 1 << 1, CLUTTER_EVENT_FLAG_INPUT_METHOD = 1 << 1,
@@ -881,8 +812,7 @@ typedef enum /*< flags prefix=CLUTTER_EVENT >*/
* *
* Since: 0.4 * Since: 0.4
*/ */
typedef enum /*< prefix=CLUTTER >*/ typedef enum { /*< prefix=CLUTTER >*/
{
CLUTTER_NOTHING = 0, CLUTTER_NOTHING = 0,
CLUTTER_KEY_PRESS, CLUTTER_KEY_PRESS,
CLUTTER_KEY_RELEASE, CLUTTER_KEY_RELEASE,
@@ -927,8 +857,7 @@ typedef enum /*< prefix=CLUTTER >*/
* *
* Since: 0.4 * Since: 0.4
*/ */
typedef enum /*< prefix=CLUTTER_SCROLL >*/ typedef enum { /*< prefix=CLUTTER_SCROLL >*/
{
CLUTTER_SCROLL_UP, CLUTTER_SCROLL_UP,
CLUTTER_SCROLL_DOWN, CLUTTER_SCROLL_DOWN,
CLUTTER_SCROLL_LEFT, CLUTTER_SCROLL_LEFT,
@@ -938,21 +867,28 @@ typedef enum /*< prefix=CLUTTER_SCROLL >*/
/** /**
* ClutterStageState: * ClutterStageState:
* @CLUTTER_STAGE_STATE_FULLSCREEN: Fullscreen mask
* @CLUTTER_STAGE_STATE_OFFSCREEN: Offscreen mask (deprecated)
* @CLUTTER_STAGE_STATE_ACTIVATED: Activated mask * @CLUTTER_STAGE_STATE_ACTIVATED: Activated mask
* *
* Stage state masks, used by the #ClutterEvent of type %CLUTTER_STAGE_STATE. * Stage state masks, used by the #ClutterEvent of type %CLUTTER_STAGE_STATE.
* *
* Since: 0.4 * Since: 0.4
*/ */
typedef enum typedef enum {
{ CLUTTER_STAGE_STATE_FULLSCREEN = (1 << 1),
CLUTTER_STAGE_STATE_OFFSCREEN = (1 << 2),
CLUTTER_STAGE_STATE_ACTIVATED = (1 << 3) CLUTTER_STAGE_STATE_ACTIVATED = (1 << 3)
} ClutterStageState; } ClutterStageState;
/** /**
* ClutterFeatureFlags: * ClutterFeatureFlags:
* @CLUTTER_FEATURE_TEXTURE_NPOT: Set if NPOTS textures supported.
* @CLUTTER_FEATURE_SWAP_THROTTLE: Set if backend throttles buffer swaps. * @CLUTTER_FEATURE_SWAP_THROTTLE: Set if backend throttles buffer swaps.
* @CLUTTER_FEATURE_TEXTURE_YUV: Set if YUV based textures supported.
* @CLUTTER_FEATURE_TEXTURE_READ_PIXELS: Set if texture pixels can be read.
* @CLUTTER_FEATURE_STAGE_STATIC: Set if stage size if fixed (i.e framebuffer) * @CLUTTER_FEATURE_STAGE_STATIC: Set if stage size if fixed (i.e framebuffer)
* @CLUTTER_FEATURE_STAGE_USER_RESIZE: Set if stage is able to be user resized.
* @CLUTTER_FEATURE_STAGE_CURSOR: Set if stage has a graphical cursor. * @CLUTTER_FEATURE_STAGE_CURSOR: Set if stage has a graphical cursor.
* @CLUTTER_FEATURE_SHADERS_GLSL: Set if the backend supports GLSL shaders. * @CLUTTER_FEATURE_SHADERS_GLSL: Set if the backend supports GLSL shaders.
* @CLUTTER_FEATURE_OFFSCREEN: Set if the backend supports offscreen rendering. * @CLUTTER_FEATURE_OFFSCREEN: Set if the backend supports offscreen rendering.
@@ -966,8 +902,12 @@ typedef enum
*/ */
typedef enum typedef enum
{ {
CLUTTER_FEATURE_TEXTURE_NPOT = (1 << 2),
CLUTTER_FEATURE_SWAP_THROTTLE = (1 << 3), CLUTTER_FEATURE_SWAP_THROTTLE = (1 << 3),
CLUTTER_FEATURE_TEXTURE_YUV = (1 << 4),
CLUTTER_FEATURE_TEXTURE_READ_PIXELS = (1 << 5),
CLUTTER_FEATURE_STAGE_STATIC = (1 << 6), CLUTTER_FEATURE_STAGE_STATIC = (1 << 6),
CLUTTER_FEATURE_STAGE_USER_RESIZE = (1 << 7),
CLUTTER_FEATURE_STAGE_CURSOR = (1 << 8), CLUTTER_FEATURE_STAGE_CURSOR = (1 << 8),
CLUTTER_FEATURE_SHADERS_GLSL = (1 << 9), CLUTTER_FEATURE_SHADERS_GLSL = (1 << 9),
CLUTTER_FEATURE_OFFSCREEN = (1 << 10), CLUTTER_FEATURE_OFFSCREEN = (1 << 10),
@@ -987,8 +927,7 @@ typedef enum
* *
* Since: 1.2 * Since: 1.2
*/ */
typedef enum /*< prefix=CLUTTER_FLOW >*/ typedef enum { /*< prefix=CLUTTER_FLOW >*/
{
CLUTTER_FLOW_HORIZONTAL, CLUTTER_FLOW_HORIZONTAL,
CLUTTER_FLOW_VERTICAL CLUTTER_FLOW_VERTICAL
} ClutterFlowOrientation; } ClutterFlowOrientation;
@@ -1015,8 +954,7 @@ typedef enum /*< prefix=CLUTTER_FLOW >*/
* *
* Since: 1.0 * Since: 1.0
*/ */
typedef enum typedef enum {
{
CLUTTER_POINTER_DEVICE, CLUTTER_POINTER_DEVICE,
CLUTTER_KEYBOARD_DEVICE, CLUTTER_KEYBOARD_DEVICE,
CLUTTER_EXTENSION_DEVICE, CLUTTER_EXTENSION_DEVICE,
@@ -1044,8 +982,7 @@ typedef enum
* *
* Since: 1.6 * Since: 1.6
*/ */
typedef enum typedef enum {
{
CLUTTER_INPUT_MODE_MASTER, CLUTTER_INPUT_MODE_MASTER,
CLUTTER_INPUT_MODE_SLAVE, CLUTTER_INPUT_MODE_SLAVE,
CLUTTER_INPUT_MODE_FLOATING CLUTTER_INPUT_MODE_FLOATING
@@ -1070,8 +1007,7 @@ typedef enum
* *
* Since: 1.6 * Since: 1.6
*/ */
typedef enum typedef enum {
{
CLUTTER_INPUT_AXIS_IGNORE, CLUTTER_INPUT_AXIS_IGNORE,
CLUTTER_INPUT_AXIS_X, CLUTTER_INPUT_AXIS_X,
@@ -1098,8 +1034,7 @@ typedef enum
* *
* Since: 1.6 * Since: 1.6
*/ */
typedef enum typedef enum {
{
CLUTTER_SNAP_EDGE_TOP, CLUTTER_SNAP_EDGE_TOP,
CLUTTER_SNAP_EDGE_RIGHT, CLUTTER_SNAP_EDGE_RIGHT,
CLUTTER_SNAP_EDGE_BOTTOM, CLUTTER_SNAP_EDGE_BOTTOM,
@@ -1116,8 +1051,7 @@ typedef enum
* *
* Since: 1.0 * Since: 1.0
*/ */
typedef enum typedef enum {
{
CLUTTER_PICK_NONE = 0, CLUTTER_PICK_NONE = 0,
CLUTTER_PICK_REACTIVE, CLUTTER_PICK_REACTIVE,
CLUTTER_PICK_ALL CLUTTER_PICK_ALL
@@ -1134,8 +1068,7 @@ typedef enum
* *
* Since: 1.8 * Since: 1.8
*/ */
typedef enum /*< prefix=CLUTTER_SWIPE_DIRECTION >*/ typedef enum { /*< prefix=CLUTTER_SWIPE_DIRECTION >*/
{
CLUTTER_SWIPE_DIRECTION_UP = 1 << 0, CLUTTER_SWIPE_DIRECTION_UP = 1 << 0,
CLUTTER_SWIPE_DIRECTION_DOWN = 1 << 1, CLUTTER_SWIPE_DIRECTION_DOWN = 1 << 1,
CLUTTER_SWIPE_DIRECTION_LEFT = 1 << 2, CLUTTER_SWIPE_DIRECTION_LEFT = 1 << 2,
@@ -1155,8 +1088,7 @@ typedef enum /*< prefix=CLUTTER_SWIPE_DIRECTION >*/
* *
* Since: 1.12 * Since: 1.12
*/ */
typedef enum /*< prefix=CLUTTER_PAN >*/ typedef enum { /*< prefix=CLUTTER_PAN >*/
{
CLUTTER_PAN_AXIS_NONE = 0, CLUTTER_PAN_AXIS_NONE = 0,
CLUTTER_PAN_X_AXIS, CLUTTER_PAN_X_AXIS,
@@ -1165,6 +1097,28 @@ typedef enum /*< prefix=CLUTTER_PAN >*/
CLUTTER_PAN_AXIS_AUTO CLUTTER_PAN_AXIS_AUTO
} ClutterPanAxis; } ClutterPanAxis;
/**
* ClutterTableAlignment:
* @CLUTTER_TABLE_ALIGNMENT_START: Align the child to the top or to the
* left of a cell in the table, depending on the axis
* @CLUTTER_TABLE_ALIGNMENT_CENTER: Align the child to the center of
* a cell in the table
* @CLUTTER_TABLE_ALIGNMENT_END: Align the child to the bottom or to the
* right of a cell in the table, depending on the axis
*
* The alignment policies available on each axis of the #ClutterTableLayout
*
* Since: 1.4
*
* Deprecated: 1.22: Use the alignment properties of #ClutterActor
*/
typedef enum {
CLUTTER_TABLE_ALIGNMENT_START,
CLUTTER_TABLE_ALIGNMENT_CENTER,
CLUTTER_TABLE_ALIGNMENT_END
} ClutterTableAlignment;
/** /**
* ClutterTextureFlags: * ClutterTextureFlags:
* @CLUTTER_TEXTURE_NONE: No flags * @CLUTTER_TEXTURE_NONE: No flags
@@ -1172,15 +1126,15 @@ typedef enum /*< prefix=CLUTTER_PAN >*/
* @CLUTTER_TEXTURE_RGB_FLAG_PREMULT: Unused flag * @CLUTTER_TEXTURE_RGB_FLAG_PREMULT: Unused flag
* @CLUTTER_TEXTURE_YUV_FLAG_YUV2: Unused flag * @CLUTTER_TEXTURE_YUV_FLAG_YUV2: Unused flag
* *
* Flags for clutter_texture_set_from_rgb_data(). * Flags for clutter_texture_set_from_rgb_data() and
* clutter_texture_set_from_yuv_data().
* *
* Since: 0.4 * Since: 0.4
* *
* Deprecated: 1.22: The #ClutterTexture class was the only user of * Deprecated: 1.22: The #ClutterTexture class was the only user of
* this API * this API
*/ */
typedef enum /*< prefix=CLUTTER_TEXTURE >*/ typedef enum { /*< prefix=CLUTTER_TEXTURE >*/
{
CLUTTER_TEXTURE_NONE = 0, CLUTTER_TEXTURE_NONE = 0,
CLUTTER_TEXTURE_RGB_FLAG_BGR = 1 << 1, CLUTTER_TEXTURE_RGB_FLAG_BGR = 1 << 1,
CLUTTER_TEXTURE_RGB_FLAG_PREMULT = 1 << 2, /* FIXME: not handled */ CLUTTER_TEXTURE_RGB_FLAG_PREMULT = 1 << 2, /* FIXME: not handled */
@@ -1204,8 +1158,7 @@ typedef enum /*< prefix=CLUTTER_TEXTURE >*/
* this API; use #ClutterImage and clutter_actor_set_content_scaling_filters() * this API; use #ClutterImage and clutter_actor_set_content_scaling_filters()
* instead. * instead.
*/ */
typedef enum /*< prefix=CLUTTER_TEXTURE_QUALITY >*/ typedef enum { /*< prefix=CLUTTER_TEXTURE_QUALITY >*/
{
CLUTTER_TEXTURE_QUALITY_LOW, CLUTTER_TEXTURE_QUALITY_LOW,
CLUTTER_TEXTURE_QUALITY_MEDIUM, CLUTTER_TEXTURE_QUALITY_MEDIUM,
CLUTTER_TEXTURE_QUALITY_HIGH CLUTTER_TEXTURE_QUALITY_HIGH
@@ -1220,8 +1173,7 @@ typedef enum /*< prefix=CLUTTER_TEXTURE_QUALITY >*/
* *
* Since: 0.6 * Since: 0.6
*/ */
typedef enum typedef enum {
{
CLUTTER_TIMELINE_FORWARD, CLUTTER_TIMELINE_FORWARD,
CLUTTER_TIMELINE_BACKWARD CLUTTER_TIMELINE_BACKWARD
} ClutterTimelineDirection; } ClutterTimelineDirection;
@@ -1240,8 +1192,7 @@ typedef enum
* *
* Since: 1.0 * Since: 1.0
*/ */
typedef enum /*< prefix=CLUTTER_UNIT >*/ typedef enum { /*< prefix=CLUTTER_UNIT >*/
{
CLUTTER_UNIT_PIXEL, CLUTTER_UNIT_PIXEL,
CLUTTER_UNIT_EM, CLUTTER_UNIT_EM,
CLUTTER_UNIT_MM, CLUTTER_UNIT_MM,
@@ -1271,8 +1222,7 @@ typedef enum /*< prefix=CLUTTER_UNIT >*/
* *
* Since: 1.0 * Since: 1.0
*/ */
typedef enum typedef enum {
{
CLUTTER_PATH_MOVE_TO = 0, CLUTTER_PATH_MOVE_TO = 0,
CLUTTER_PATH_LINE_TO = 1, CLUTTER_PATH_LINE_TO = 1,
CLUTTER_PATH_CURVE_TO = 2, CLUTTER_PATH_CURVE_TO = 2,
@@ -1303,8 +1253,7 @@ typedef enum
* *
* Since: 1.10 * Since: 1.10
*/ */
typedef enum typedef enum {
{
CLUTTER_ACTOR_ALIGN_FILL, CLUTTER_ACTOR_ALIGN_FILL,
CLUTTER_ACTOR_ALIGN_START, CLUTTER_ACTOR_ALIGN_START,
CLUTTER_ACTOR_ALIGN_CENTER, CLUTTER_ACTOR_ALIGN_CENTER,
@@ -1317,15 +1266,17 @@ typedef enum
* painting the stages * painting the stages
* @CLUTTER_REPAINT_FLAGS_POST_PAINT: Run the repaint function after * @CLUTTER_REPAINT_FLAGS_POST_PAINT: Run the repaint function after
* painting the stages * painting the stages
* @CLUTTER_REPAINT_FLAGS_QUEUE_REDRAW_ON_ADD: Ensure that a new frame
* is queued after adding the repaint function
* *
* Flags to pass to clutter_threads_add_repaint_func_full(). * Flags to pass to clutter_threads_add_repaint_func_full().
* *
* Since: 1.10 * Since: 1.10
*/ */
typedef enum typedef enum {
{
CLUTTER_REPAINT_FLAGS_PRE_PAINT = 1 << 0, CLUTTER_REPAINT_FLAGS_PRE_PAINT = 1 << 0,
CLUTTER_REPAINT_FLAGS_POST_PAINT = 1 << 1, CLUTTER_REPAINT_FLAGS_POST_PAINT = 1 << 1,
CLUTTER_REPAINT_FLAGS_QUEUE_REDRAW_ON_ADD = 1 << 2
} ClutterRepaintFlags; } ClutterRepaintFlags;
/** /**
@@ -1347,8 +1298,7 @@ typedef enum
* *
* Since: 1.10 * Since: 1.10
*/ */
typedef enum typedef enum {
{
CLUTTER_CONTENT_GRAVITY_TOP_LEFT, CLUTTER_CONTENT_GRAVITY_TOP_LEFT,
CLUTTER_CONTENT_GRAVITY_TOP, CLUTTER_CONTENT_GRAVITY_TOP,
CLUTTER_CONTENT_GRAVITY_TOP_RIGHT, CLUTTER_CONTENT_GRAVITY_TOP_RIGHT,
@@ -1378,8 +1328,7 @@ typedef enum
* *
* Since: 1.10 * Since: 1.10
*/ */
typedef enum typedef enum {
{
CLUTTER_SCALING_FILTER_LINEAR, CLUTTER_SCALING_FILTER_LINEAR,
CLUTTER_SCALING_FILTER_NEAREST, CLUTTER_SCALING_FILTER_NEAREST,
CLUTTER_SCALING_FILTER_TRILINEAR CLUTTER_SCALING_FILTER_TRILINEAR
@@ -1394,8 +1343,7 @@ typedef enum
* *
* Since: 1.12 * Since: 1.12
*/ */
typedef enum typedef enum {
{
CLUTTER_ORIENTATION_HORIZONTAL, CLUTTER_ORIENTATION_HORIZONTAL,
CLUTTER_ORIENTATION_VERTICAL CLUTTER_ORIENTATION_VERTICAL
} ClutterOrientation; } ClutterOrientation;
@@ -1411,8 +1359,7 @@ typedef enum
* *
* Since: 1.12 * Since: 1.12
*/ */
typedef enum /*< prefix=CLUTTER_SCROLL >*/ typedef enum { /*< prefix=CLUTTER_SCROLL >*/
{
CLUTTER_SCROLL_NONE = 0, CLUTTER_SCROLL_NONE = 0,
CLUTTER_SCROLL_HORIZONTALLY = 1 << 0, CLUTTER_SCROLL_HORIZONTALLY = 1 << 0,
@@ -1432,8 +1379,7 @@ typedef enum /*< prefix=CLUTTER_SCROLL >*/
* *
* Since: 1.12 * Since: 1.12
*/ */
typedef enum typedef enum {
{
CLUTTER_GRID_POSITION_LEFT, CLUTTER_GRID_POSITION_LEFT,
CLUTTER_GRID_POSITION_RIGHT, CLUTTER_GRID_POSITION_RIGHT,
CLUTTER_GRID_POSITION_TOP, CLUTTER_GRID_POSITION_TOP,
@@ -1451,8 +1397,7 @@ typedef enum
* *
* Since: 1.12 * Since: 1.12
*/ */
typedef enum typedef enum {
{
CLUTTER_REPEAT_NONE = 0, CLUTTER_REPEAT_NONE = 0,
CLUTTER_REPEAT_X_AXIS = 1 << 0, CLUTTER_REPEAT_X_AXIS = 1 << 0,
CLUTTER_REPEAT_Y_AXIS = 1 << 1, CLUTTER_REPEAT_Y_AXIS = 1 << 1,
@@ -1474,8 +1419,7 @@ typedef enum
* *
* Since: 1.12 * Since: 1.12
*/ */
typedef enum typedef enum {
{
CLUTTER_STEP_MODE_START, CLUTTER_STEP_MODE_START,
CLUTTER_STEP_MODE_END CLUTTER_STEP_MODE_END
} ClutterStepMode; } ClutterStepMode;
@@ -1491,8 +1435,7 @@ typedef enum
* *
* Since: 1.12 * Since: 1.12
*/ */
typedef enum /*< prefix=CLUTTER_ZOOM >*/ typedef enum { /*< prefix=CLUTTER_ZOOM >*/
{
CLUTTER_ZOOM_X_AXIS, CLUTTER_ZOOM_X_AXIS,
CLUTTER_ZOOM_Y_AXIS, CLUTTER_ZOOM_Y_AXIS,
CLUTTER_ZOOM_BOTH CLUTTER_ZOOM_BOTH
@@ -1515,8 +1458,7 @@ typedef enum /*< prefix=CLUTTER_ZOOM >*/
* *
* Since: 1.18 * Since: 1.18
*/ */
typedef enum typedef enum {
{
CLUTTER_GESTURE_TRIGGER_EDGE_NONE = 0, CLUTTER_GESTURE_TRIGGER_EDGE_NONE = 0,
CLUTTER_GESTURE_TRIGGER_EDGE_AFTER, CLUTTER_GESTURE_TRIGGER_EDGE_AFTER,
CLUTTER_GESTURE_TRIGGER_EDGE_BEFORE CLUTTER_GESTURE_TRIGGER_EDGE_BEFORE
@@ -1552,8 +1494,7 @@ typedef enum
* *
* Since: 1.24 * Since: 1.24
*/ */
typedef enum typedef enum {
{
CLUTTER_TOUCHPAD_GESTURE_PHASE_BEGIN, CLUTTER_TOUCHPAD_GESTURE_PHASE_BEGIN,
CLUTTER_TOUCHPAD_GESTURE_PHASE_UPDATE, CLUTTER_TOUCHPAD_GESTURE_PHASE_UPDATE,
CLUTTER_TOUCHPAD_GESTURE_PHASE_END, CLUTTER_TOUCHPAD_GESTURE_PHASE_END,
@@ -1575,8 +1516,7 @@ typedef enum
* *
* Since: 1.26 * Since: 1.26
*/ */
typedef enum typedef enum {
{
CLUTTER_SCROLL_SOURCE_UNKNOWN, CLUTTER_SCROLL_SOURCE_UNKNOWN,
CLUTTER_SCROLL_SOURCE_WHEEL, CLUTTER_SCROLL_SOURCE_WHEEL,
CLUTTER_SCROLL_SOURCE_FINGER, CLUTTER_SCROLL_SOURCE_FINGER,
@@ -1594,8 +1534,7 @@ typedef enum
* *
* Since: 1.26 * Since: 1.26
*/ */
typedef enum typedef enum {
{
CLUTTER_SCROLL_FINISHED_NONE = 0, CLUTTER_SCROLL_FINISHED_NONE = 0,
CLUTTER_SCROLL_FINISHED_HORIZONTAL = 1 << 0, CLUTTER_SCROLL_FINISHED_HORIZONTAL = 1 << 0,
CLUTTER_SCROLL_FINISHED_VERTICAL = 1 << 1 CLUTTER_SCROLL_FINISHED_VERTICAL = 1 << 1
@@ -1616,8 +1555,7 @@ typedef enum
* *
* Since: 1.28 * Since: 1.28
*/ */
typedef enum typedef enum {
{
CLUTTER_INPUT_DEVICE_TOOL_NONE, CLUTTER_INPUT_DEVICE_TOOL_NONE,
CLUTTER_INPUT_DEVICE_TOOL_PEN, CLUTTER_INPUT_DEVICE_TOOL_PEN,
CLUTTER_INPUT_DEVICE_TOOL_ERASER, CLUTTER_INPUT_DEVICE_TOOL_ERASER,
@@ -1628,20 +1566,17 @@ typedef enum
CLUTTER_INPUT_DEVICE_TOOL_LENS CLUTTER_INPUT_DEVICE_TOOL_LENS
} ClutterInputDeviceToolType; } ClutterInputDeviceToolType;
typedef enum typedef enum {
{
CLUTTER_INPUT_DEVICE_PAD_SOURCE_UNKNOWN, CLUTTER_INPUT_DEVICE_PAD_SOURCE_UNKNOWN,
CLUTTER_INPUT_DEVICE_PAD_SOURCE_FINGER, CLUTTER_INPUT_DEVICE_PAD_SOURCE_FINGER,
} ClutterInputDevicePadSource; } ClutterInputDevicePadSource;
typedef enum typedef enum {
{
CLUTTER_INPUT_DEVICE_MAPPING_ABSOLUTE, CLUTTER_INPUT_DEVICE_MAPPING_ABSOLUTE,
CLUTTER_INPUT_DEVICE_MAPPING_RELATIVE, CLUTTER_INPUT_DEVICE_MAPPING_RELATIVE,
} ClutterInputDeviceMapping; } ClutterInputDeviceMapping;
typedef enum typedef enum {
{
CLUTTER_INPUT_CONTENT_HINT_COMPLETION = 1 << 0, CLUTTER_INPUT_CONTENT_HINT_COMPLETION = 1 << 0,
CLUTTER_INPUT_CONTENT_HINT_SPELLCHECK = 1 << 1, CLUTTER_INPUT_CONTENT_HINT_SPELLCHECK = 1 << 1,
CLUTTER_INPUT_CONTENT_HINT_AUTO_CAPITALIZATION = 1 << 2, CLUTTER_INPUT_CONTENT_HINT_AUTO_CAPITALIZATION = 1 << 2,
@@ -1654,8 +1589,7 @@ typedef enum
CLUTTER_INPUT_CONTENT_HINT_MULTILINE = 1 << 9, CLUTTER_INPUT_CONTENT_HINT_MULTILINE = 1 << 9,
} ClutterInputContentHintFlags; } ClutterInputContentHintFlags;
typedef enum typedef enum {
{
CLUTTER_INPUT_CONTENT_PURPOSE_NORMAL, CLUTTER_INPUT_CONTENT_PURPOSE_NORMAL,
CLUTTER_INPUT_CONTENT_PURPOSE_ALPHA, CLUTTER_INPUT_CONTENT_PURPOSE_ALPHA,
CLUTTER_INPUT_CONTENT_PURPOSE_DIGITS, CLUTTER_INPUT_CONTENT_PURPOSE_DIGITS,
@@ -1671,8 +1605,7 @@ typedef enum
CLUTTER_INPUT_CONTENT_PURPOSE_TERMINAL, CLUTTER_INPUT_CONTENT_PURPOSE_TERMINAL,
} ClutterInputContentPurpose; } ClutterInputContentPurpose;
typedef enum typedef enum {
{
CLUTTER_INPUT_PANEL_STATE_OFF, CLUTTER_INPUT_PANEL_STATE_OFF,
CLUTTER_INPUT_PANEL_STATE_ON, CLUTTER_INPUT_PANEL_STATE_ON,
CLUTTER_INPUT_PANEL_STATE_TOGGLE, CLUTTER_INPUT_PANEL_STATE_TOGGLE,

View File

@@ -5,28 +5,22 @@
G_BEGIN_DECLS G_BEGIN_DECLS
CLUTTER_EXPORT
void _clutter_event_set_pointer_emulated (ClutterEvent *event, void _clutter_event_set_pointer_emulated (ClutterEvent *event,
gboolean is_emulated); gboolean is_emulated);
/* Reinjecting queued events for processing */ /* Reinjecting queued events for processing */
CLUTTER_EXPORT
void _clutter_process_event (ClutterEvent *event); void _clutter_process_event (ClutterEvent *event);
CLUTTER_EXPORT
gboolean _clutter_event_process_filters (ClutterEvent *event); gboolean _clutter_event_process_filters (ClutterEvent *event);
/* clears the event queue inside the main context */ /* clears the event queue inside the main context */
void _clutter_clear_events_queue (void); void _clutter_clear_events_queue (void);
void _clutter_clear_events_queue_for_stage (ClutterStage *stage); void _clutter_clear_events_queue_for_stage (ClutterStage *stage);
CLUTTER_EXPORT
void _clutter_event_set_platform_data (ClutterEvent *event, void _clutter_event_set_platform_data (ClutterEvent *event,
gpointer data); gpointer data);
CLUTTER_EXPORT
gpointer _clutter_event_get_platform_data (const ClutterEvent *event); gpointer _clutter_event_get_platform_data (const ClutterEvent *event);
CLUTTER_EXPORT
void _clutter_event_set_state_full (ClutterEvent *event, void _clutter_event_set_state_full (ClutterEvent *event,
ClutterModifierType button_state, ClutterModifierType button_state,
ClutterModifierType base_state, ClutterModifierType base_state,
@@ -34,7 +28,6 @@ void _clutter_event_set_state_full (ClutterEvent *ev
ClutterModifierType locked_state, ClutterModifierType locked_state,
ClutterModifierType effective_state); ClutterModifierType effective_state);
CLUTTER_EXPORT
void _clutter_event_push (const ClutterEvent *event, void _clutter_event_push (const ClutterEvent *event,
gboolean do_copy); gboolean do_copy);

View File

@@ -0,0 +1,38 @@
#include "clutter-build-config.h"
#include "clutter-event-translator.h"
#include "clutter-backend.h"
#include "clutter-private.h"
#define clutter_event_translator_get_type _clutter_event_translator_get_type
typedef ClutterEventTranslatorIface ClutterEventTranslatorInterface;
G_DEFINE_INTERFACE (ClutterEventTranslator, clutter_event_translator, G_TYPE_OBJECT);
static ClutterTranslateReturn
default_translate_event (ClutterEventTranslator *translator,
gpointer native,
ClutterEvent *event)
{
return CLUTTER_TRANSLATE_CONTINUE;
}
static void
clutter_event_translator_default_init (ClutterEventTranslatorIface *iface)
{
iface->translate_event = default_translate_event;
}
ClutterTranslateReturn
_clutter_event_translator_translate_event (ClutterEventTranslator *translator,
gpointer native,
ClutterEvent *translated)
{
ClutterEventTranslatorIface *iface;
iface = CLUTTER_EVENT_TRANSLATOR_GET_IFACE (translator);
return iface->translate_event (translator, native, translated);
}

View File

@@ -0,0 +1,41 @@
#ifndef __CLUTTER_EVENT_TRANSLATOR_H__
#define __CLUTTER_EVENT_TRANSLATOR_H__
#include <glib-object.h>
#include <clutter/clutter-event.h>
G_BEGIN_DECLS
#define CLUTTER_TYPE_EVENT_TRANSLATOR (_clutter_event_translator_get_type ())
#define CLUTTER_EVENT_TRANSLATOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), CLUTTER_TYPE_EVENT_TRANSLATOR, ClutterEventTranslator))
#define CLUTTER_IS_EVENT_TRANSLATOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CLUTTER_TYPE_EVENT_TRANSLATOR))
#define CLUTTER_EVENT_TRANSLATOR_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), CLUTTER_TYPE_EVENT_TRANSLATOR, ClutterEventTranslatorIface))
typedef struct _ClutterEventTranslator ClutterEventTranslator;
typedef struct _ClutterEventTranslatorIface ClutterEventTranslatorIface;
typedef enum {
CLUTTER_TRANSLATE_CONTINUE,
CLUTTER_TRANSLATE_REMOVE,
CLUTTER_TRANSLATE_QUEUE
} ClutterTranslateReturn;
struct _ClutterEventTranslatorIface
{
GTypeInterface g_iface;
ClutterTranslateReturn (* translate_event) (ClutterEventTranslator *translator,
gpointer native,
ClutterEvent *translated);
};
CLUTTER_EXPORT
GType _clutter_event_translator_get_type (void) G_GNUC_CONST;
ClutterTranslateReturn _clutter_event_translator_translate_event (ClutterEventTranslator *translator,
gpointer native,
ClutterEvent *translated);
G_END_DECLS
#endif /* __CLUTTER_EVENT_TRANSLATOR_H__ */

View File

@@ -370,7 +370,7 @@ clutter_event_get_coords (const ClutterEvent *event,
gfloat *x, gfloat *x,
gfloat *y) gfloat *y)
{ {
graphene_point_t coords; ClutterPoint coords;
g_return_if_fail (event != NULL); g_return_if_fail (event != NULL);
@@ -386,15 +386,15 @@ clutter_event_get_coords (const ClutterEvent *event,
/** /**
* clutter_event_get_position: * clutter_event_get_position:
* @event: a #ClutterEvent * @event: a #ClutterEvent
* @position: a #graphene_point_t * @position: a #ClutterPoint
* *
* Retrieves the event coordinates as a #graphene_point_t. * Retrieves the event coordinates as a #ClutterPoint.
* *
* Since: 1.12 * Since: 1.12
*/ */
void void
clutter_event_get_position (const ClutterEvent *event, clutter_event_get_position (const ClutterEvent *event,
graphene_point_t *position) ClutterPoint *position)
{ {
g_return_if_fail (event != NULL); g_return_if_fail (event != NULL);
g_return_if_fail (position != NULL); g_return_if_fail (position != NULL);
@@ -415,42 +415,42 @@ clutter_event_get_position (const ClutterEvent *event,
case CLUTTER_PAD_BUTTON_RELEASE: case CLUTTER_PAD_BUTTON_RELEASE:
case CLUTTER_PAD_STRIP: case CLUTTER_PAD_STRIP:
case CLUTTER_PAD_RING: case CLUTTER_PAD_RING:
graphene_point_init (position, 0.f, 0.f); clutter_point_init (position, 0.f, 0.f);
break; break;
case CLUTTER_ENTER: case CLUTTER_ENTER:
case CLUTTER_LEAVE: case CLUTTER_LEAVE:
graphene_point_init (position, event->crossing.x, event->crossing.y); clutter_point_init (position, event->crossing.x, event->crossing.y);
break; break;
case CLUTTER_BUTTON_PRESS: case CLUTTER_BUTTON_PRESS:
case CLUTTER_BUTTON_RELEASE: case CLUTTER_BUTTON_RELEASE:
graphene_point_init (position, event->button.x, event->button.y); clutter_point_init (position, event->button.x, event->button.y);
break; break;
case CLUTTER_MOTION: case CLUTTER_MOTION:
graphene_point_init (position, event->motion.x, event->motion.y); clutter_point_init (position, event->motion.x, event->motion.y);
break; break;
case CLUTTER_TOUCH_BEGIN: case CLUTTER_TOUCH_BEGIN:
case CLUTTER_TOUCH_UPDATE: case CLUTTER_TOUCH_UPDATE:
case CLUTTER_TOUCH_END: case CLUTTER_TOUCH_END:
case CLUTTER_TOUCH_CANCEL: case CLUTTER_TOUCH_CANCEL:
graphene_point_init (position, event->touch.x, event->touch.y); clutter_point_init (position, event->touch.x, event->touch.y);
break; break;
case CLUTTER_SCROLL: case CLUTTER_SCROLL:
graphene_point_init (position, event->scroll.x, event->scroll.y); clutter_point_init (position, event->scroll.x, event->scroll.y);
break; break;
case CLUTTER_TOUCHPAD_PINCH: case CLUTTER_TOUCHPAD_PINCH:
graphene_point_init (position, event->touchpad_pinch.x, clutter_point_init (position, event->touchpad_pinch.x,
event->touchpad_pinch.y); event->touchpad_pinch.y);
break; break;
case CLUTTER_TOUCHPAD_SWIPE: case CLUTTER_TOUCHPAD_SWIPE:
graphene_point_init (position, event->touchpad_swipe.x, clutter_point_init (position, event->touchpad_swipe.x,
event->touchpad_swipe.y); event->touchpad_swipe.y);
break; break;
} }
@@ -1021,9 +1021,6 @@ clutter_event_get_event_sequence (const ClutterEvent *event)
event->type == CLUTTER_TOUCH_END || event->type == CLUTTER_TOUCH_END ||
event->type == CLUTTER_TOUCH_CANCEL) event->type == CLUTTER_TOUCH_CANCEL)
return event->touch.sequence; return event->touch.sequence;
else if (event->type == CLUTTER_ENTER ||
event->type == CLUTTER_LEAVE)
return event->crossing.sequence;
return NULL; return NULL;
} }
@@ -1796,12 +1793,12 @@ float
clutter_event_get_distance (const ClutterEvent *source, clutter_event_get_distance (const ClutterEvent *source,
const ClutterEvent *target) const ClutterEvent *target)
{ {
graphene_point_t p0, p1; ClutterPoint p0, p1;
clutter_event_get_position (source, &p0); clutter_event_get_position (source, &p0);
clutter_event_get_position (source, &p1); clutter_event_get_position (source, &p1);
return graphene_point_distance (&p0, &p1, NULL, NULL); return clutter_point_distance (&p0, &p1, NULL, NULL);
} }
/** /**
@@ -1822,17 +1819,17 @@ double
clutter_event_get_angle (const ClutterEvent *source, clutter_event_get_angle (const ClutterEvent *source,
const ClutterEvent *target) const ClutterEvent *target)
{ {
graphene_point_t p0, p1; ClutterPoint p0, p1;
float x_distance, y_distance; float x_distance, y_distance;
double angle; double angle;
clutter_event_get_position (source, &p0); clutter_event_get_position (source, &p0);
clutter_event_get_position (target, &p1); clutter_event_get_position (target, &p1);
if (graphene_point_equal (&p0, &p1)) if (clutter_point_equals (&p0, &p1))
return 0; return 0;
graphene_point_distance (&p0, &p1, &x_distance, &y_distance); clutter_point_distance (&p0, &p1, &x_distance, &y_distance);
angle = atan2 (x_distance, y_distance); angle = atan2 (x_distance, y_distance);
@@ -2161,9 +2158,9 @@ clutter_event_get_scroll_source (const ClutterEvent *event)
ClutterScrollFinishFlags ClutterScrollFinishFlags
clutter_event_get_scroll_finish_flags (const ClutterEvent *event) clutter_event_get_scroll_finish_flags (const ClutterEvent *event)
{ {
g_return_val_if_fail (event != NULL, CLUTTER_SCROLL_FINISHED_NONE); g_return_val_if_fail (event != NULL, CLUTTER_SCROLL_SOURCE_UNKNOWN);
g_return_val_if_fail (event->type == CLUTTER_SCROLL, g_return_val_if_fail (event->type == CLUTTER_SCROLL,
CLUTTER_SCROLL_FINISHED_NONE); CLUTTER_SCROLL_SOURCE_UNKNOWN);
return event->scroll.finish_flags; return event->scroll.finish_flags;
} }

View File

@@ -269,7 +269,6 @@ struct _ClutterCrossingEvent
gfloat x; gfloat x;
gfloat y; gfloat y;
ClutterInputDevice *device; ClutterInputDevice *device;
ClutterEventSequence *sequence;
ClutterActor *related; ClutterActor *related;
}; };
@@ -686,7 +685,7 @@ void clutter_event_get_coords (const ClutterEv
gfloat *y); gfloat *y);
CLUTTER_EXPORT CLUTTER_EXPORT
void clutter_event_get_position (const ClutterEvent *event, void clutter_event_get_position (const ClutterEvent *event,
graphene_point_t *position); ClutterPoint *position);
CLUTTER_EXPORT CLUTTER_EXPORT
float clutter_event_get_distance (const ClutterEvent *source, float clutter_event_get_distance (const ClutterEvent *source,
const ClutterEvent *target); const ClutterEvent *target);

View File

@@ -33,6 +33,8 @@
* *
* It is possible to ask whether Clutter has support for specific features at * It is possible to ask whether Clutter has support for specific features at
* run-time. * run-time.
*
* See also cogl_get_features() and #CoglFeatureFlags
*/ */
#include "clutter-build-config.h" #include "clutter-build-config.h"
@@ -58,13 +60,24 @@ typedef struct ClutterFeatures
static ClutterFeatures* __features = NULL; static ClutterFeatures* __features = NULL;
static ClutterFeatureFlags static ClutterFeatureFlags
clutter_features_from_cogl (void) clutter_features_from_cogl (guint cogl_flags)
{ {
ClutterFeatureFlags clutter_flags = 0; ClutterFeatureFlags clutter_flags = 0;
clutter_flags |= CLUTTER_FEATURE_SHADERS_GLSL; if (cogl_flags & COGL_FEATURE_TEXTURE_NPOT)
clutter_flags |= CLUTTER_FEATURE_TEXTURE_NPOT;
if (cogl_flags & COGL_FEATURE_TEXTURE_YUV)
clutter_flags |= CLUTTER_FEATURE_TEXTURE_YUV;
clutter_flags |= CLUTTER_FEATURE_OFFSCREEN; if (cogl_flags & COGL_FEATURE_TEXTURE_READ_PIXELS)
clutter_flags |= CLUTTER_FEATURE_TEXTURE_READ_PIXELS;
if (cogl_flags & COGL_FEATURE_SHADERS_GLSL)
clutter_flags |= CLUTTER_FEATURE_SHADERS_GLSL;
if (cogl_flags & COGL_FEATURE_OFFSCREEN)
clutter_flags |= CLUTTER_FEATURE_OFFSCREEN;
return clutter_flags; return clutter_flags;
} }
@@ -92,7 +105,7 @@ _clutter_feature_init (GError **error)
if (!_clutter_backend_create_context (context->backend, error)) if (!_clutter_backend_create_context (context->backend, error))
return FALSE; return FALSE;
__features->flags = (clutter_features_from_cogl () __features->flags = (clutter_features_from_cogl (cogl_get_features ())
| _clutter_backend_get_features (context->backend)); | _clutter_backend_get_features (context->backend));
__features->features_set = TRUE; __features->features_set = TRUE;

View File

@@ -131,7 +131,8 @@ clutter_fixed_layout_get_preferred_height (ClutterLayoutManager *manager,
static void static void
clutter_fixed_layout_allocate (ClutterLayoutManager *manager, clutter_fixed_layout_allocate (ClutterLayoutManager *manager,
ClutterContainer *container, ClutterContainer *container,
const ClutterActorBox *allocation) const ClutterActorBox *allocation,
ClutterAllocationFlags flags)
{ {
ClutterActor *child; ClutterActor *child;
@@ -139,7 +140,7 @@ clutter_fixed_layout_allocate (ClutterLayoutManager *manager,
child != NULL; child != NULL;
child = clutter_actor_get_next_sibling (child)) child = clutter_actor_get_next_sibling (child))
{ {
clutter_actor_allocate_preferred_size (child); clutter_actor_allocate_preferred_size (child, flags);
} }
} }

View File

@@ -566,7 +566,8 @@ clutter_flow_layout_get_preferred_height (ClutterLayoutManager *manager,
static void static void
clutter_flow_layout_allocate (ClutterLayoutManager *manager, clutter_flow_layout_allocate (ClutterLayoutManager *manager,
ClutterContainer *container, ClutterContainer *container,
const ClutterActorBox *allocation) const ClutterActorBox *allocation,
ClutterAllocationFlags flags)
{ {
ClutterFlowLayoutPrivate *priv = CLUTTER_FLOW_LAYOUT (manager)->priv; ClutterFlowLayoutPrivate *priv = CLUTTER_FLOW_LAYOUT (manager)->priv;
ClutterActor *actor, *child; ClutterActor *actor, *child;
@@ -728,7 +729,7 @@ clutter_flow_layout_allocate (ClutterLayoutManager *manager,
child_alloc.y1 = ceil (item_y); child_alloc.y1 = ceil (item_y);
child_alloc.x2 = ceil (child_alloc.x1 + item_width); child_alloc.x2 = ceil (child_alloc.x1 + item_width);
child_alloc.y2 = ceil (child_alloc.y1 + item_height); child_alloc.y2 = ceil (child_alloc.y1 + item_height);
clutter_actor_allocate (child, &child_alloc); clutter_actor_allocate (child, &child_alloc, flags);
if (priv->orientation == CLUTTER_FLOW_HORIZONTAL) if (priv->orientation == CLUTTER_FLOW_HORIZONTAL)
item_x = new_x; item_x = new_x;

View File

@@ -118,7 +118,7 @@ struct _ClutterGestureActionPrivate
gint requested_nb_points; gint requested_nb_points;
GArray *points; GArray *points;
gulong actor_capture_id; guint actor_capture_id;
gulong stage_capture_id; gulong stage_capture_id;
ClutterGestureTriggerEdge edge; ClutterGestureTriggerEdge edge;
@@ -157,8 +157,7 @@ G_DEFINE_TYPE_WITH_PRIVATE (ClutterGestureAction, clutter_gesture_action, CLUTTE
static GesturePoint * static GesturePoint *
gesture_register_point (ClutterGestureAction *action, ClutterEvent *event) gesture_register_point (ClutterGestureAction *action, ClutterEvent *event)
{ {
ClutterGestureActionPrivate *priv = ClutterGestureActionPrivate *priv = action->priv;
clutter_gesture_action_get_instance_private (action);
GesturePoint *point = NULL; GesturePoint *point = NULL;
if (priv->points->len >= MAX_GESTURE_POINTS) if (priv->points->len >= MAX_GESTURE_POINTS)
@@ -191,8 +190,7 @@ gesture_find_point (ClutterGestureAction *action,
ClutterEvent *event, ClutterEvent *event,
gint *position) gint *position)
{ {
ClutterGestureActionPrivate *priv = ClutterGestureActionPrivate *priv = action->priv;
clutter_gesture_action_get_instance_private (action);
GesturePoint *point = NULL; GesturePoint *point = NULL;
ClutterEventType type = clutter_event_type (event); ClutterEventType type = clutter_event_type (event);
ClutterInputDevice *device = clutter_event_get_device (event); ClutterInputDevice *device = clutter_event_get_device (event);
@@ -222,10 +220,9 @@ gesture_find_point (ClutterGestureAction *action,
static void static void
gesture_unregister_point (ClutterGestureAction *action, gint position) gesture_unregister_point (ClutterGestureAction *action, gint position)
{ {
ClutterGestureActionPrivate *priv = ClutterGestureActionPrivate *priv = action->priv;
clutter_gesture_action_get_instance_private (action);
if (priv->points->len == 0) if (action->priv->points->len == 0)
return; return;
g_array_remove_index (priv->points, position); g_array_remove_index (priv->points, position);
@@ -306,26 +303,28 @@ gesture_point_unset (GesturePoint *point)
static void static void
cancel_gesture (ClutterGestureAction *action) cancel_gesture (ClutterGestureAction *action)
{ {
ClutterGestureActionPrivate *priv = ClutterGestureActionPrivate *priv = action->priv;
clutter_gesture_action_get_instance_private (action);
ClutterActor *actor; ClutterActor *actor;
priv->in_gesture = FALSE; priv->in_gesture = FALSE;
g_clear_signal_handler (&priv->stage_capture_id, priv->stage); if (priv->stage_capture_id != 0)
{
g_signal_handler_disconnect (priv->stage, priv->stage_capture_id);
priv->stage_capture_id = 0;
}
actor = clutter_actor_meta_get_actor (CLUTTER_ACTOR_META (action)); actor = clutter_actor_meta_get_actor (CLUTTER_ACTOR_META (action));
g_signal_emit (action, gesture_signals[GESTURE_CANCEL], 0, actor); g_signal_emit (action, gesture_signals[GESTURE_CANCEL], 0, actor);
g_array_set_size (priv->points, 0); g_array_set_size (action->priv->points, 0);
} }
static gboolean static gboolean
begin_gesture (ClutterGestureAction *action, begin_gesture (ClutterGestureAction *action,
ClutterActor *actor) ClutterActor *actor)
{ {
ClutterGestureActionPrivate *priv = ClutterGestureActionPrivate *priv = action->priv;
clutter_gesture_action_get_instance_private (action);
gboolean return_value; gboolean return_value;
priv->in_gesture = TRUE; priv->in_gesture = TRUE;
@@ -358,8 +357,7 @@ stage_captured_event_cb (ClutterActor *stage,
ClutterEvent *event, ClutterEvent *event,
ClutterGestureAction *action) ClutterGestureAction *action)
{ {
ClutterGestureActionPrivate *priv = ClutterGestureActionPrivate *priv = action->priv;
clutter_gesture_action_get_instance_private (action);
ClutterActor *actor; ClutterActor *actor;
gint position; gint position;
float threshold_x, threshold_y; float threshold_x, threshold_y;
@@ -483,8 +481,11 @@ stage_captured_event_cb (ClutterActor *stage,
break; break;
} }
if (priv->points->len == 0) if (priv->points->len == 0 && priv->stage_capture_id)
g_clear_signal_handler (&priv->stage_capture_id, priv->stage); {
g_signal_handler_disconnect (priv->stage, priv->stage_capture_id);
priv->stage_capture_id = 0;
}
return CLUTTER_EVENT_PROPAGATE; return CLUTTER_EVENT_PROPAGATE;
} }
@@ -494,8 +495,7 @@ actor_captured_event_cb (ClutterActor *actor,
ClutterEvent *event, ClutterEvent *event,
ClutterGestureAction *action) ClutterGestureAction *action)
{ {
ClutterGestureActionPrivate *priv = ClutterGestureActionPrivate *priv = action->priv;
clutter_gesture_action_get_instance_private (action);
GesturePoint *point G_GNUC_UNUSED; GesturePoint *point G_GNUC_UNUSED;
if ((clutter_event_type (event) != CLUTTER_BUTTON_PRESS) && if ((clutter_event_type (event) != CLUTTER_BUTTON_PRESS) &&
@@ -529,8 +529,7 @@ static void
clutter_gesture_action_set_actor (ClutterActorMeta *meta, clutter_gesture_action_set_actor (ClutterActorMeta *meta,
ClutterActor *actor) ClutterActor *actor)
{ {
ClutterGestureActionPrivate *priv = ClutterGestureActionPrivate *priv = CLUTTER_GESTURE_ACTION (meta)->priv;
clutter_gesture_action_get_instance_private (CLUTTER_GESTURE_ACTION (meta));
ClutterActorMetaClass *meta_class = ClutterActorMetaClass *meta_class =
CLUTTER_ACTOR_META_CLASS (clutter_gesture_action_parent_class); CLUTTER_ACTOR_META_CLASS (clutter_gesture_action_parent_class);
@@ -539,7 +538,7 @@ clutter_gesture_action_set_actor (ClutterActorMeta *meta,
ClutterActor *old_actor = clutter_actor_meta_get_actor (meta); ClutterActor *old_actor = clutter_actor_meta_get_actor (meta);
if (old_actor != NULL) if (old_actor != NULL)
g_clear_signal_handler (&priv->actor_capture_id, old_actor); g_signal_handler_disconnect (old_actor, priv->actor_capture_id);
priv->actor_capture_id = 0; priv->actor_capture_id = 0;
} }
@@ -547,7 +546,7 @@ clutter_gesture_action_set_actor (ClutterActorMeta *meta,
if (priv->stage_capture_id != 0) if (priv->stage_capture_id != 0)
{ {
if (priv->stage != NULL) if (priv->stage != NULL)
g_clear_signal_handler (&priv->stage_capture_id, priv->stage); g_signal_handler_disconnect (priv->stage, priv->stage_capture_id);
priv->stage_capture_id = 0; priv->stage_capture_id = 0;
priv->stage = NULL; priv->stage = NULL;
@@ -564,22 +563,6 @@ clutter_gesture_action_set_actor (ClutterActorMeta *meta,
meta_class->set_actor (meta, actor); meta_class->set_actor (meta, actor);
} }
static void
clutter_gesture_action_set_enabled (ClutterActorMeta *meta,
gboolean is_enabled)
{
ClutterActorMetaClass *meta_class =
CLUTTER_ACTOR_META_CLASS (clutter_gesture_action_parent_class);
ClutterGestureAction *gesture_action = CLUTTER_GESTURE_ACTION (meta);
ClutterGestureActionPrivate *priv =
clutter_gesture_action_get_instance_private (gesture_action);
if (!is_enabled && priv->in_gesture)
cancel_gesture (gesture_action);
meta_class->set_enabled (meta, is_enabled);
}
static gboolean static gboolean
default_event_handler (ClutterGestureAction *action, default_event_handler (ClutterGestureAction *action,
ClutterActor *actor) ClutterActor *actor)
@@ -594,8 +577,6 @@ clutter_gesture_action_set_property (GObject *gobject,
GParamSpec *pspec) GParamSpec *pspec)
{ {
ClutterGestureAction *self = CLUTTER_GESTURE_ACTION (gobject); ClutterGestureAction *self = CLUTTER_GESTURE_ACTION (gobject);
ClutterGestureActionPrivate *priv =
clutter_gesture_action_get_instance_private (self);
switch (prop_id) switch (prop_id)
{ {
@@ -608,15 +589,11 @@ clutter_gesture_action_set_property (GObject *gobject,
break; break;
case PROP_THRESHOLD_TRIGGER_DISTANCE_X: case PROP_THRESHOLD_TRIGGER_DISTANCE_X:
clutter_gesture_action_set_threshold_trigger_distance (self, clutter_gesture_action_set_threshold_trigger_distance (self, g_value_get_float (value), self->priv->distance_y);
g_value_get_float (value),
priv->distance_y);
break; break;
case PROP_THRESHOLD_TRIGGER_DISTANCE_Y: case PROP_THRESHOLD_TRIGGER_DISTANCE_Y:
clutter_gesture_action_set_threshold_trigger_distance (self, clutter_gesture_action_set_threshold_trigger_distance (self, self->priv->distance_x, g_value_get_float (value));
priv->distance_x,
g_value_get_float (value));
break; break;
default: default:
@@ -631,29 +608,28 @@ clutter_gesture_action_get_property (GObject *gobject,
GValue *value, GValue *value,
GParamSpec *pspec) GParamSpec *pspec)
{ {
ClutterGestureActionPrivate *priv = ClutterGestureAction *self = CLUTTER_GESTURE_ACTION (gobject);
clutter_gesture_action_get_instance_private (CLUTTER_GESTURE_ACTION (gobject));
switch (prop_id) switch (prop_id)
{ {
case PROP_N_TOUCH_POINTS: case PROP_N_TOUCH_POINTS:
g_value_set_int (value, priv->requested_nb_points); g_value_set_int (value, self->priv->requested_nb_points);
break; break;
case PROP_THRESHOLD_TRIGGER_EDGE: case PROP_THRESHOLD_TRIGGER_EDGE:
g_value_set_enum (value, priv->edge); g_value_set_enum (value, self->priv->edge);
break; break;
case PROP_THRESHOLD_TRIGGER_DISTANCE_X: case PROP_THRESHOLD_TRIGGER_DISTANCE_X:
if (priv->distance_x > 0.0) if (self->priv->distance_x > 0.0)
g_value_set_float (value, priv->distance_x); g_value_set_float (value, self->priv->distance_x);
else else
g_value_set_float (value, gesture_get_default_threshold ()); g_value_set_float (value, gesture_get_default_threshold ());
break; break;
case PROP_THRESHOLD_TRIGGER_DISTANCE_Y: case PROP_THRESHOLD_TRIGGER_DISTANCE_Y:
if (priv->distance_y > 0.0) if (self->priv->distance_y > 0.0)
g_value_set_float (value, priv->distance_y); g_value_set_float (value, self->priv->distance_y);
else else
g_value_set_float (value, gesture_get_default_threshold ()); g_value_set_float (value, gesture_get_default_threshold ());
break; break;
@@ -667,8 +643,7 @@ clutter_gesture_action_get_property (GObject *gobject,
static void static void
clutter_gesture_action_finalize (GObject *gobject) clutter_gesture_action_finalize (GObject *gobject)
{ {
ClutterGestureActionPrivate *priv = ClutterGestureActionPrivate *priv = CLUTTER_GESTURE_ACTION (gobject)->priv;
clutter_gesture_action_get_instance_private (CLUTTER_GESTURE_ACTION (gobject));
g_array_unref (priv->points); g_array_unref (priv->points);
@@ -686,7 +661,6 @@ clutter_gesture_action_class_init (ClutterGestureActionClass *klass)
gobject_class->get_property = clutter_gesture_action_get_property; gobject_class->get_property = clutter_gesture_action_get_property;
meta_class->set_actor = clutter_gesture_action_set_actor; meta_class->set_actor = clutter_gesture_action_set_actor;
meta_class->set_enabled = clutter_gesture_action_set_enabled;
klass->gesture_begin = default_event_handler; klass->gesture_begin = default_event_handler;
klass->gesture_progress = default_event_handler; klass->gesture_progress = default_event_handler;
@@ -830,7 +804,8 @@ clutter_gesture_action_class_init (ClutterGestureActionClass *klass)
G_TYPE_FROM_CLASS (klass), G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST, G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (ClutterGestureActionClass, gesture_end), G_STRUCT_OFFSET (ClutterGestureActionClass, gesture_end),
NULL, NULL, NULL, NULL, NULL,
_clutter_marshal_VOID__OBJECT,
G_TYPE_NONE, 1, G_TYPE_NONE, 1,
CLUTTER_TYPE_ACTOR); CLUTTER_TYPE_ACTOR);
@@ -852,7 +827,8 @@ clutter_gesture_action_class_init (ClutterGestureActionClass *klass)
G_TYPE_FROM_CLASS (klass), G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST, G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (ClutterGestureActionClass, gesture_cancel), G_STRUCT_OFFSET (ClutterGestureActionClass, gesture_cancel),
NULL, NULL, NULL, NULL, NULL,
_clutter_marshal_VOID__OBJECT,
G_TYPE_NONE, 1, G_TYPE_NONE, 1,
CLUTTER_TYPE_ACTOR); CLUTTER_TYPE_ACTOR);
} }
@@ -860,14 +836,13 @@ clutter_gesture_action_class_init (ClutterGestureActionClass *klass)
static void static void
clutter_gesture_action_init (ClutterGestureAction *self) clutter_gesture_action_init (ClutterGestureAction *self)
{ {
ClutterGestureActionPrivate *priv = self->priv = clutter_gesture_action_get_instance_private (self);
clutter_gesture_action_get_instance_private (self);
priv->points = g_array_sized_new (FALSE, TRUE, sizeof (GesturePoint), 3); self->priv->points = g_array_sized_new (FALSE, TRUE, sizeof (GesturePoint), 3);
g_array_set_clear_func (priv->points, (GDestroyNotify) gesture_point_unset); g_array_set_clear_func (self->priv->points, (GDestroyNotify) gesture_point_unset);
priv->requested_nb_points = 1; self->priv->requested_nb_points = 1;
priv->edge = CLUTTER_GESTURE_TRIGGER_EDGE_NONE; self->priv->edge = CLUTTER_GESTURE_TRIGGER_EDGE_NONE;
} }
/** /**
@@ -906,21 +881,16 @@ clutter_gesture_action_get_press_coords (ClutterGestureAction *action,
gfloat *press_x, gfloat *press_x,
gfloat *press_y) gfloat *press_y)
{ {
ClutterGestureActionPrivate *priv;
g_return_if_fail (CLUTTER_IS_GESTURE_ACTION (action)); g_return_if_fail (CLUTTER_IS_GESTURE_ACTION (action));
g_return_if_fail (action->priv->points->len > point);
priv = clutter_gesture_action_get_instance_private (action);
g_return_if_fail (priv->points->len > point);
if (press_x) if (press_x)
*press_x = g_array_index (priv->points, *press_x = g_array_index (action->priv->points,
GesturePoint, GesturePoint,
point).press_x; point).press_x;
if (press_y) if (press_y)
*press_y = g_array_index (priv->points, *press_y = g_array_index (action->priv->points,
GesturePoint, GesturePoint,
point).press_y; point).press_y;
} }
@@ -946,21 +916,16 @@ clutter_gesture_action_get_motion_coords (ClutterGestureAction *action,
gfloat *motion_x, gfloat *motion_x,
gfloat *motion_y) gfloat *motion_y)
{ {
ClutterGestureActionPrivate *priv;
g_return_if_fail (CLUTTER_IS_GESTURE_ACTION (action)); g_return_if_fail (CLUTTER_IS_GESTURE_ACTION (action));
g_return_if_fail (action->priv->points->len > point);
priv = clutter_gesture_action_get_instance_private (action);
g_return_if_fail (priv->points->len > point);
if (motion_x) if (motion_x)
*motion_x = g_array_index (priv->points, *motion_x = g_array_index (action->priv->points,
GesturePoint, GesturePoint,
point).last_motion_x; point).last_motion_x;
if (motion_y) if (motion_y)
*motion_y = g_array_index (priv->points, *motion_y = g_array_index (action->priv->points,
GesturePoint, GesturePoint,
point).last_motion_y; point).last_motion_y;
} }
@@ -988,19 +953,15 @@ clutter_gesture_action_get_motion_delta (ClutterGestureAction *action,
gfloat *delta_x, gfloat *delta_x,
gfloat *delta_y) gfloat *delta_y)
{ {
ClutterGestureActionPrivate *priv;
gfloat d_x, d_y; gfloat d_x, d_y;
g_return_val_if_fail (CLUTTER_IS_GESTURE_ACTION (action), 0); g_return_val_if_fail (CLUTTER_IS_GESTURE_ACTION (action), 0);
g_return_val_if_fail (action->priv->points->len > point, 0);
priv = clutter_gesture_action_get_instance_private (action); d_x = g_array_index (action->priv->points,
g_return_val_if_fail (priv->points->len > point, 0);
d_x = g_array_index (priv->points,
GesturePoint, GesturePoint,
point).last_delta_x; point).last_delta_x;
d_y = g_array_index (priv->points, d_y = g_array_index (action->priv->points,
GesturePoint, GesturePoint,
point).last_delta_y; point).last_delta_y;
@@ -1034,21 +995,16 @@ clutter_gesture_action_get_release_coords (ClutterGestureAction *action,
gfloat *release_x, gfloat *release_x,
gfloat *release_y) gfloat *release_y)
{ {
ClutterGestureActionPrivate *priv;
g_return_if_fail (CLUTTER_IS_GESTURE_ACTION (action)); g_return_if_fail (CLUTTER_IS_GESTURE_ACTION (action));
g_return_if_fail (action->priv->points->len > point);
priv = clutter_gesture_action_get_instance_private (action);
g_return_if_fail (priv->points->len > point);
if (release_x) if (release_x)
*release_x = g_array_index (priv->points, *release_x = g_array_index (action->priv->points,
GesturePoint, GesturePoint,
point).release_x; point).release_x;
if (release_y) if (release_y)
*release_y = g_array_index (priv->points, *release_y = g_array_index (action->priv->points,
GesturePoint, GesturePoint,
point).release_y; point).release_y;
} }
@@ -1074,20 +1030,16 @@ clutter_gesture_action_get_velocity (ClutterGestureAction *action,
gfloat *velocity_x, gfloat *velocity_x,
gfloat *velocity_y) gfloat *velocity_y)
{ {
ClutterGestureActionPrivate *priv;
gfloat d_x, d_y, distance, velocity; gfloat d_x, d_y, distance, velocity;
gint64 d_t; gint64 d_t;
g_return_val_if_fail (CLUTTER_IS_GESTURE_ACTION (action), 0); g_return_val_if_fail (CLUTTER_IS_GESTURE_ACTION (action), 0);
g_return_val_if_fail (action->priv->points->len > point, 0);
priv = clutter_gesture_action_get_instance_private (action);
g_return_val_if_fail (priv->points->len > point, 0);
distance = clutter_gesture_action_get_motion_delta (action, point, distance = clutter_gesture_action_get_motion_delta (action, point,
&d_x, &d_y); &d_x, &d_y);
d_t = g_array_index (priv->points, d_t = g_array_index (action->priv->points,
GesturePoint, GesturePoint,
point).last_delta_time; point).last_delta_time;
@@ -1114,13 +1066,9 @@ clutter_gesture_action_get_velocity (ClutterGestureAction *action,
gint gint
clutter_gesture_action_get_n_touch_points (ClutterGestureAction *action) clutter_gesture_action_get_n_touch_points (ClutterGestureAction *action)
{ {
ClutterGestureActionPrivate *priv;
g_return_val_if_fail (CLUTTER_IS_GESTURE_ACTION (action), 0); g_return_val_if_fail (CLUTTER_IS_GESTURE_ACTION (action), 0);
priv = clutter_gesture_action_get_instance_private (action); return action->priv->requested_nb_points;
return priv->requested_nb_points;
} }
/** /**
@@ -1141,7 +1089,7 @@ clutter_gesture_action_set_n_touch_points (ClutterGestureAction *action,
g_return_if_fail (CLUTTER_IS_GESTURE_ACTION (action)); g_return_if_fail (CLUTTER_IS_GESTURE_ACTION (action));
g_return_if_fail (nb_points >= 1); g_return_if_fail (nb_points >= 1);
priv = clutter_gesture_action_get_instance_private (action); priv = action->priv;
if (priv->requested_nb_points == nb_points) if (priv->requested_nb_points == nb_points)
return; return;
@@ -1195,13 +1143,9 @@ clutter_gesture_action_set_n_touch_points (ClutterGestureAction *action,
guint guint
clutter_gesture_action_get_n_current_points (ClutterGestureAction *action) clutter_gesture_action_get_n_current_points (ClutterGestureAction *action)
{ {
ClutterGestureActionPrivate *priv;
g_return_val_if_fail (CLUTTER_IS_GESTURE_ACTION (action), 0); g_return_val_if_fail (CLUTTER_IS_GESTURE_ACTION (action), 0);
priv = clutter_gesture_action_get_instance_private (action); return action->priv->points->len;
return priv->points->len;
} }
/** /**
@@ -1219,15 +1163,10 @@ ClutterEventSequence *
clutter_gesture_action_get_sequence (ClutterGestureAction *action, clutter_gesture_action_get_sequence (ClutterGestureAction *action,
guint point) guint point)
{ {
ClutterGestureActionPrivate *priv;
g_return_val_if_fail (CLUTTER_IS_GESTURE_ACTION (action), NULL); g_return_val_if_fail (CLUTTER_IS_GESTURE_ACTION (action), NULL);
g_return_val_if_fail (action->priv->points->len > point, NULL);
priv = clutter_gesture_action_get_instance_private (action); return g_array_index (action->priv->points, GesturePoint, point).sequence;
g_return_val_if_fail (priv->points->len > point, NULL);
return g_array_index (priv->points, GesturePoint, point).sequence;
} }
/** /**
@@ -1246,15 +1185,10 @@ ClutterInputDevice *
clutter_gesture_action_get_device (ClutterGestureAction *action, clutter_gesture_action_get_device (ClutterGestureAction *action,
guint point) guint point)
{ {
ClutterGestureActionPrivate *priv;
g_return_val_if_fail (CLUTTER_IS_GESTURE_ACTION (action), NULL); g_return_val_if_fail (CLUTTER_IS_GESTURE_ACTION (action), NULL);
g_return_val_if_fail (action->priv->points->len > point, NULL);
priv = clutter_gesture_action_get_instance_private (action); return g_array_index (action->priv->points, GesturePoint, point).device;
g_return_val_if_fail (priv->points->len > point, NULL);
return g_array_index (priv->points, GesturePoint, point).device;
} }
/** /**
@@ -1274,15 +1208,11 @@ clutter_gesture_action_get_last_event (ClutterGestureAction *action,
guint point) guint point)
{ {
GesturePoint *gesture_point; GesturePoint *gesture_point;
ClutterGestureActionPrivate *priv;
g_return_val_if_fail (CLUTTER_IS_GESTURE_ACTION (action), NULL); g_return_val_if_fail (CLUTTER_IS_GESTURE_ACTION (action), NULL);
g_return_val_if_fail (action->priv->points->len > point, NULL);
priv = clutter_gesture_action_get_instance_private (action); gesture_point = &g_array_index (action->priv->points, GesturePoint, point);
g_return_val_if_fail (priv->points->len > point, NULL);
gesture_point = &g_array_index (priv->points, GesturePoint, point);
return gesture_point->last_event; return gesture_point->last_event;
} }
@@ -1319,16 +1249,12 @@ void
clutter_gesture_action_set_threshold_trigger_edge (ClutterGestureAction *action, clutter_gesture_action_set_threshold_trigger_edge (ClutterGestureAction *action,
ClutterGestureTriggerEdge edge) ClutterGestureTriggerEdge edge)
{ {
ClutterGestureActionPrivate *priv;
g_return_if_fail (CLUTTER_IS_GESTURE_ACTION (action)); g_return_if_fail (CLUTTER_IS_GESTURE_ACTION (action));
priv = clutter_gesture_action_get_instance_private (action); if (action->priv->edge == edge)
if (priv->edge == edge)
return; return;
priv->edge = edge; action->priv->edge = edge;
g_object_notify_by_pspec (G_OBJECT (action), gesture_props[PROP_THRESHOLD_TRIGGER_EDGE]); g_object_notify_by_pspec (G_OBJECT (action), gesture_props[PROP_THRESHOLD_TRIGGER_EDGE]);
} }
@@ -1347,14 +1273,10 @@ clutter_gesture_action_set_threshold_trigger_edge (ClutterGestureAction *ac
ClutterGestureTriggerEdge ClutterGestureTriggerEdge
clutter_gesture_action_get_threshold_trigger_edge (ClutterGestureAction *action) clutter_gesture_action_get_threshold_trigger_edge (ClutterGestureAction *action)
{ {
ClutterGestureActionPrivate *priv;
g_return_val_if_fail (CLUTTER_IS_GESTURE_ACTION (action), g_return_val_if_fail (CLUTTER_IS_GESTURE_ACTION (action),
CLUTTER_GESTURE_TRIGGER_EDGE_NONE); CLUTTER_GESTURE_TRIGGER_EDGE_NONE);
priv = clutter_gesture_action_get_instance_private (action); return action->priv->edge;
return priv->edge;
} }
/** /**
@@ -1394,21 +1316,17 @@ clutter_gesture_action_set_threshold_trigger_distance (ClutterGestureAction
float x, float x,
float y) float y)
{ {
ClutterGestureActionPrivate *priv;
g_return_if_fail (CLUTTER_IS_GESTURE_ACTION (action)); g_return_if_fail (CLUTTER_IS_GESTURE_ACTION (action));
priv = clutter_gesture_action_get_instance_private (action); if (fabsf (x - action->priv->distance_x) > FLOAT_EPSILON)
if (fabsf (x - priv->distance_x) > FLOAT_EPSILON)
{ {
priv->distance_x = x; action->priv->distance_x = x;
g_object_notify_by_pspec (G_OBJECT (action), gesture_props[PROP_THRESHOLD_TRIGGER_DISTANCE_X]); g_object_notify_by_pspec (G_OBJECT (action), gesture_props[PROP_THRESHOLD_TRIGGER_DISTANCE_X]);
} }
if (fabsf (y - priv->distance_y) > FLOAT_EPSILON) if (fabsf (y - action->priv->distance_y) > FLOAT_EPSILON)
{ {
priv->distance_y = y; action->priv->distance_y = y;
g_object_notify_by_pspec (G_OBJECT (action), gesture_props[PROP_THRESHOLD_TRIGGER_DISTANCE_Y]); g_object_notify_by_pspec (G_OBJECT (action), gesture_props[PROP_THRESHOLD_TRIGGER_DISTANCE_Y]);
} }
} }
@@ -1429,23 +1347,19 @@ clutter_gesture_action_get_threshold_trigger_distance (ClutterGestureAction *act
float *x, float *x,
float *y) float *y)
{ {
ClutterGestureActionPrivate *priv;
g_return_if_fail (CLUTTER_IS_GESTURE_ACTION (action)); g_return_if_fail (CLUTTER_IS_GESTURE_ACTION (action));
priv = clutter_gesture_action_get_instance_private (action);
if (x != NULL) if (x != NULL)
{ {
if (priv->distance_x > 0.0) if (action->priv->distance_x > 0.0)
*x = priv->distance_x; *x = action->priv->distance_x;
else else
*x = gesture_get_default_threshold (); *x = gesture_get_default_threshold ();
} }
if (y != NULL) if (y != NULL)
{ {
if (priv->distance_y > 0.0) if (action->priv->distance_y > 0.0)
*y = priv->distance_y; *y = action->priv->distance_y;
else else
*y = gesture_get_default_threshold (); *y = gesture_get_default_threshold ();
} }

View File

@@ -34,13 +34,32 @@
G_BEGIN_DECLS G_BEGIN_DECLS
#define CLUTTER_TYPE_GESTURE_ACTION (clutter_gesture_action_get_type ()) #define CLUTTER_TYPE_GESTURE_ACTION (clutter_gesture_action_get_type ())
#define CLUTTER_GESTURE_ACTION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), CLUTTER_TYPE_GESTURE_ACTION, ClutterGestureAction))
#define CLUTTER_IS_GESTURE_ACTION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CLUTTER_TYPE_GESTURE_ACTION))
#define CLUTTER_GESTURE_ACTION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), CLUTTER_TYPE_GESTURE_ACTION, ClutterGestureActionClass))
#define CLUTTER_IS_GESTURE_ACTION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), CLUTTER_TYPE_GESTURE_ACTION))
#define CLUTTER_GESTURE_ACTION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), CLUTTER_TYPE_GESTURE_ACTION, ClutterGestureActionClass))
CLUTTER_EXPORT typedef struct _ClutterGestureAction ClutterGestureAction;
G_DECLARE_DERIVABLE_TYPE (ClutterGestureAction, clutter_gesture_action, typedef struct _ClutterGestureActionPrivate ClutterGestureActionPrivate;
CLUTTER, GESTURE_ACTION, ClutterAction); typedef struct _ClutterGestureActionClass ClutterGestureActionClass;
typedef struct _ClutterGestureActionPrivate ClutterGestureActionPrivate; /**
* ClutterGestureAction:
*
* The #ClutterGestureAction structure contains
* only private data and should be accessed using the provided API
*
* Since: 1.8
*/
struct _ClutterGestureAction
{
/*< private >*/
ClutterAction parent_instance;
ClutterGestureActionPrivate *priv;
};
/** /**
* ClutterGestureActionClass: * ClutterGestureActionClass:
@@ -82,6 +101,9 @@ struct _ClutterGestureActionClass
void (* _clutter_gesture_action6) (void); void (* _clutter_gesture_action6) (void);
}; };
CLUTTER_EXPORT
GType clutter_gesture_action_get_type (void) G_GNUC_CONST;
CLUTTER_EXPORT CLUTTER_EXPORT
ClutterAction * clutter_gesture_action_new (void); ClutterAction * clutter_gesture_action_new (void);

View File

@@ -1,111 +0,0 @@
/*
* Clutter.
*
* An OpenGL based 'interactive canvas' library.
*
* Authored By Georges Basile Stavracas Neto <georges.stavracas@gmail.com>
*
* Copyright (C) 2019 Endless, Inc
* Copyright (C) 2009, 2010 Intel Corp
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*/
#include "clutter-build-config.h"
#include "clutter-graphene.h"
#include "clutter-private.h"
#include "clutter-types.h"
static gboolean
graphene_point_progress (const GValue *a,
const GValue *b,
double progress,
GValue *retval)
{
const graphene_point_t *ap = g_value_get_boxed (a);
const graphene_point_t *bp = g_value_get_boxed (b);
graphene_point_t res;
graphene_point_interpolate (ap, bp, progress, &res);
g_value_set_boxed (retval, &res);
return TRUE;
}
static gboolean
graphene_point3d_progress (const GValue *a,
const GValue *b,
double progress,
GValue *retval)
{
const graphene_point3d_t *av = g_value_get_boxed (a);
const graphene_point3d_t *bv = g_value_get_boxed (b);
graphene_point3d_t res;
graphene_point3d_interpolate (av, bv, progress, &res);
g_value_set_boxed (retval, &res);
return TRUE;
}
static gboolean
graphene_rect_progress (const GValue *a,
const GValue *b,
double progress,
GValue *retval)
{
const graphene_rect_t *rect_a = g_value_get_boxed (a);
const graphene_rect_t *rect_b = g_value_get_boxed (b);
graphene_rect_t res;
graphene_rect_interpolate (rect_a, rect_b, progress, &res);
g_value_set_boxed (retval, &res);
return TRUE;
}
static gboolean
graphene_size_progress (const GValue *a,
const GValue *b,
double progress,
GValue *retval)
{
const graphene_size_t *as = g_value_get_boxed (a);
const graphene_size_t *bs = g_value_get_boxed (b);
graphene_size_t res;
graphene_size_interpolate (as, bs, progress, &res);
g_value_set_boxed (retval, &res);
return TRUE;
}
void
clutter_graphene_init (void)
{
clutter_interval_register_progress_func (GRAPHENE_TYPE_POINT,
graphene_point_progress);
clutter_interval_register_progress_func (GRAPHENE_TYPE_POINT3D,
graphene_point3d_progress);
clutter_interval_register_progress_func (GRAPHENE_TYPE_RECT,
graphene_rect_progress);
clutter_interval_register_progress_func (GRAPHENE_TYPE_SIZE,
graphene_size_progress);
}

View File

@@ -44,12 +44,12 @@
* SECTION:clutter-grid-layout * SECTION:clutter-grid-layout
* @Short_description: A layout manager for a grid of actors * @Short_description: A layout manager for a grid of actors
* @Title: ClutterGridLayout * @Title: ClutterGridLayout
* @See_also: #ClutterBoxLayout * @See_also: #ClutterTableLayout, #ClutterBoxLayout
* *
* #ClutterGridLayout is a layout manager which arranges its child widgets in * #ClutterGridLayout is a layout manager which arranges its child widgets in
* rows and columns. It is a very similar to #ClutterBoxLayout, but it * rows and columns. It is a very similar to #ClutterTableLayout and
* consistently uses #ClutterActor's alignment and expansion flags instead of * #ClutterBoxLayout, but it consistently uses #ClutterActor's
* custom child properties. * alignment and expansion flags instead of custom child properties.
* *
* Children are added using clutter_grid_layout_attach(). They can span * Children are added using clutter_grid_layout_attach(). They can span
* multiple rows or columns. It is also possible to add a child next to an * multiple rows or columns. It is also possible to add a child next to an
@@ -1391,7 +1391,8 @@ allocate_child (ClutterGridRequest *request,
static void static void
clutter_grid_layout_allocate (ClutterLayoutManager *layout, clutter_grid_layout_allocate (ClutterLayoutManager *layout,
ClutterContainer *container, ClutterContainer *container,
const ClutterActorBox *allocation) const ClutterActorBox *allocation,
ClutterAllocationFlags flags)
{ {
ClutterGridLayout *self = CLUTTER_GRID_LAYOUT (layout); ClutterGridLayout *self = CLUTTER_GRID_LAYOUT (layout);
ClutterOrientation orientation; ClutterOrientation orientation;
@@ -1452,7 +1453,7 @@ clutter_grid_layout_allocate (ClutterLayoutManager *layout,
child_allocation.x2 = child_allocation.x1 + width; child_allocation.x2 = child_allocation.x1 + width;
child_allocation.y2 = child_allocation.y1 + height; child_allocation.y2 = child_allocation.y1 + height;
clutter_actor_allocate (child, &child_allocation); clutter_actor_allocate (child, &child_allocation, flags);
} }
} }

View File

@@ -118,10 +118,9 @@ clutter_image_init (ClutterImage *self)
} }
static void static void
clutter_image_paint_content (ClutterContent *content, clutter_image_paint_content (ClutterContent *content,
ClutterActor *actor, ClutterActor *actor,
ClutterPaintNode *root, ClutterPaintNode *root)
ClutterPaintContext *paint_context)
{ {
ClutterImagePrivate *priv = CLUTTER_IMAGE (content)->priv; ClutterImagePrivate *priv = CLUTTER_IMAGE (content)->priv;
ClutterPaintNode *node; ClutterPaintNode *node;
@@ -130,7 +129,7 @@ clutter_image_paint_content (ClutterContent *content,
return; return;
node = clutter_actor_create_texture_paint_node (actor, priv->texture); node = clutter_actor_create_texture_paint_node (actor, priv->texture);
clutter_paint_node_set_static_name (node, "Image Content"); clutter_paint_node_set_name (node, "Image Content");
clutter_paint_node_add_child (root, node); clutter_paint_node_add_child (root, node);
clutter_paint_node_unref (node); clutter_paint_node_unref (node);
} }
@@ -257,7 +256,7 @@ clutter_image_set_data (ClutterImage *image,
{ {
g_set_error_literal (error, CLUTTER_IMAGE_ERROR, g_set_error_literal (error, CLUTTER_IMAGE_ERROR,
CLUTTER_IMAGE_ERROR_INVALID_DATA, CLUTTER_IMAGE_ERROR_INVALID_DATA,
"Unable to load image data"); _("Unable to load image data"));
return FALSE; return FALSE;
} }
@@ -326,7 +325,7 @@ clutter_image_set_bytes (ClutterImage *image,
{ {
g_set_error_literal (error, CLUTTER_IMAGE_ERROR, g_set_error_literal (error, CLUTTER_IMAGE_ERROR,
CLUTTER_IMAGE_ERROR_INVALID_DATA, CLUTTER_IMAGE_ERROR_INVALID_DATA,
"Unable to load image data"); _("Unable to load image data"));
return FALSE; return FALSE;
} }
@@ -420,7 +419,7 @@ clutter_image_set_area (ClutterImage *image,
{ {
g_set_error_literal (error, CLUTTER_IMAGE_ERROR, g_set_error_literal (error, CLUTTER_IMAGE_ERROR,
CLUTTER_IMAGE_ERROR_INVALID_DATA, CLUTTER_IMAGE_ERROR_INVALID_DATA,
"Unable to load image data"); _("Unable to load image data"));
return FALSE; return FALSE;
} }

View File

@@ -63,8 +63,7 @@ typedef struct _ClutterImageClass ClutterImageClass;
* *
* Since: 1.10 * Since: 1.10
*/ */
typedef enum typedef enum {
{
CLUTTER_IMAGE_ERROR_INVALID_DATA CLUTTER_IMAGE_ERROR_INVALID_DATA
} ClutterImageError; } ClutterImageError;

View File

@@ -1,255 +0,0 @@
/*
* Clutter.
*
* An OpenGL based 'interactive canvas' library.
*
* Copyright © 2009, 2010, 2011 Intel Corp.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
* Author: Emmanuele Bassi <ebassi@linux.intel.com>
*/
#ifndef CLUTTER_INPUT_DEVICE_PRIVATE_H
#define CLUTTER_INPUT_DEVICE_PRIVATE_H
#if !defined(__CLUTTER_H_INSIDE__) && !defined(CLUTTER_COMPILATION)
#error "Only <clutter/clutter.h> can be included directly."
#endif
#include <clutter/clutter-input-device.h>
G_BEGIN_DECLS
typedef struct _ClutterAxisInfo
{
ClutterInputAxis axis;
double min_axis;
double max_axis;
double min_value;
double max_value;
double resolution;
} ClutterAxisInfo;
typedef struct _ClutterKeyInfo
{
guint keyval;
ClutterModifierType modifiers;
} ClutterKeyInfo;
typedef struct _ClutterScrollInfo
{
guint axis_id;
ClutterScrollDirection direction;
double increment;
double last_value;
guint last_value_valid : 1;
} ClutterScrollInfo;
typedef struct _ClutterTouchInfo
{
ClutterEventSequence *sequence;
ClutterActor *actor;
float current_x;
float current_y;
} ClutterTouchInfo;
typedef struct _ClutterPtrA11yData
{
int n_btn_pressed;
float current_x;
float current_y;
float dwell_x;
float dwell_y;
gboolean dwell_drag_started;
gboolean dwell_gesture_started;
guint dwell_timer;
guint dwell_position_timer;
guint secondary_click_timer;
gboolean secondary_click_triggered;
} ClutterPtrA11yData;
struct _ClutterInputDevice
{
GObject parent_instance;
int id;
ClutterInputDeviceType device_type;
ClutterInputMode device_mode;
char *device_name;
ClutterSeat *seat;
ClutterBackend *backend;
/* the associated device */
ClutterInputDevice *associated;
GList *slaves;
/* the actor underneath the pointer */
ClutterActor *cursor_actor;
GHashTable *inv_touch_sequence_actors;
/* the actor that has a grab in place for the device */
ClutterActor *pointer_grab_actor;
ClutterActor *keyboard_grab_actor;
GHashTable *sequence_grab_actors;
GHashTable *inv_sequence_grab_actors;
/* the current click count */
int click_count;
/* the stage the device is on */
ClutterStage *stage;
/* the current state */
float current_x;
float current_y;
uint32_t current_time;
int current_button_number;
ClutterModifierType current_state;
/* the current touch points states */
GHashTable *touch_sequences_info;
/* the previous state, used for click count generation */
int previous_x;
int previous_y;
uint32_t previous_time;
int previous_button_number;
ClutterModifierType previous_state;
GArray *axes;
guint n_keys;
GArray *keys;
GArray *scroll_info;
char *vendor_id;
char *product_id;
char *node_path;
GPtrArray *tools;
int n_rings;
int n_strips;
int n_mode_groups;
ClutterInputDeviceMapping mapping_mode;
guint has_cursor : 1;
guint is_enabled : 1;
/* Accessiblity */
ClutterVirtualInputDevice *accessibility_virtual_device;
ClutterPtrA11yData *ptr_a11y_data;
};
CLUTTER_EXPORT
void _clutter_input_device_set_associated_device (ClutterInputDevice *device,
ClutterInputDevice *associated);
CLUTTER_EXPORT
void _clutter_input_device_add_slave (ClutterInputDevice *master,
ClutterInputDevice *slave);
CLUTTER_EXPORT
void _clutter_input_device_remove_slave (ClutterInputDevice *master,
ClutterInputDevice *slave);
CLUTTER_EXPORT
void clutter_input_device_update_from_tool (ClutterInputDevice *device,
ClutterInputDeviceTool *tool);
CLUTTER_EXPORT
ClutterStage * _clutter_input_device_get_stage (ClutterInputDevice *device);
CLUTTER_EXPORT
void _clutter_input_device_set_stage (ClutterInputDevice *device,
ClutterStage *stage);
CLUTTER_EXPORT
void _clutter_input_device_set_coords (ClutterInputDevice *device,
ClutterEventSequence *sequence,
gfloat x,
gfloat y,
ClutterStage *stage);
CLUTTER_EXPORT
void _clutter_input_device_set_state (ClutterInputDevice *device,
ClutterModifierType state);
CLUTTER_EXPORT
void _clutter_input_device_set_time (ClutterInputDevice *device,
guint32 time_);
void _clutter_input_device_set_actor (ClutterInputDevice *device,
ClutterEventSequence *sequence,
ClutterActor *actor,
gboolean emit_crossing);
CLUTTER_EXPORT
ClutterActor * clutter_input_device_update (ClutterInputDevice *device,
ClutterEventSequence *sequence,
gboolean emit_crossing);
CLUTTER_EXPORT
void _clutter_input_device_add_event_sequence (ClutterInputDevice *device,
ClutterEvent *event);
CLUTTER_EXPORT
void _clutter_input_device_remove_event_sequence (ClutterInputDevice *device,
ClutterEvent *event);
CLUTTER_EXPORT
void _clutter_input_device_set_n_keys (ClutterInputDevice *device,
guint n_keys);
CLUTTER_EXPORT
gboolean _clutter_input_device_translate_axis (ClutterInputDevice *device,
guint index_,
gdouble value,
gdouble *axis_value);
CLUTTER_EXPORT
guint _clutter_input_device_add_axis (ClutterInputDevice *device,
ClutterInputAxis axis,
gdouble minimum,
gdouble maximum,
gdouble resolution);
CLUTTER_EXPORT
void _clutter_input_device_reset_axes (ClutterInputDevice *device);
CLUTTER_EXPORT
void _clutter_input_device_add_scroll_info (ClutterInputDevice *device,
guint index_,
ClutterScrollDirection direction,
gdouble increment);
CLUTTER_EXPORT
gboolean _clutter_input_device_get_scroll_delta (ClutterInputDevice *device,
guint index_,
gdouble value,
ClutterScrollDirection *direction_p,
gdouble *delta_p);
CLUTTER_EXPORT
void _clutter_input_device_reset_scroll_info (ClutterInputDevice *device);
CLUTTER_EXPORT
void clutter_input_device_add_tool (ClutterInputDevice *device,
ClutterInputDeviceTool *tool);
CLUTTER_EXPORT
ClutterInputDeviceTool *
clutter_input_device_lookup_tool (ClutterInputDevice *device,
guint64 serial,
ClutterInputDeviceToolType type);
#endif /* CLUTTER_INPUT_DEVICE_PRIVATE_H */

View File

@@ -35,8 +35,7 @@ struct _ClutterInputDeviceToolPrivate
guint64 id; guint64 id;
}; };
enum enum {
{
PROP_0, PROP_0,
PROP_TYPE, PROP_TYPE,
PROP_SERIAL, PROP_SERIAL,

View File

@@ -37,12 +37,12 @@
#include "clutter-actor-private.h" #include "clutter-actor-private.h"
#include "clutter-debug.h" #include "clutter-debug.h"
#include "clutter-device-manager-private.h"
#include "clutter-enum-types.h" #include "clutter-enum-types.h"
#include "clutter-event-private.h" #include "clutter-event-private.h"
#include "clutter-marshal.h" #include "clutter-marshal.h"
#include "clutter-private.h" #include "clutter-private.h"
#include "clutter-stage-private.h" #include "clutter-stage-private.h"
#include "clutter-input-device-private.h"
#include "clutter-input-device-tool.h" #include "clutter-input-device-tool.h"
#include <math.h> #include <math.h>
@@ -57,7 +57,7 @@ enum
PROP_NAME, PROP_NAME,
PROP_DEVICE_TYPE, PROP_DEVICE_TYPE,
PROP_SEAT, PROP_DEVICE_MANAGER,
PROP_DEVICE_MODE, PROP_DEVICE_MODE,
PROP_HAS_CURSOR, PROP_HAS_CURSOR,
@@ -96,7 +96,6 @@ clutter_input_device_dispose (GObject *gobject)
g_clear_pointer (&device->device_name, g_free); g_clear_pointer (&device->device_name, g_free);
g_clear_pointer (&device->vendor_id, g_free); g_clear_pointer (&device->vendor_id, g_free);
g_clear_pointer (&device->product_id, g_free); g_clear_pointer (&device->product_id, g_free);
g_clear_pointer (&device->node_path, g_free);
if (device->associated != NULL) if (device->associated != NULL)
{ {
@@ -108,9 +107,6 @@ clutter_input_device_dispose (GObject *gobject)
device->associated = NULL; device->associated = NULL;
} }
if (device->accessibility_virtual_device)
g_clear_object (&device->accessibility_virtual_device);
g_clear_pointer (&device->axes, g_array_unref); g_clear_pointer (&device->axes, g_array_unref);
g_clear_pointer (&device->keys, g_array_unref); g_clear_pointer (&device->keys, g_array_unref);
g_clear_pointer (&device->scroll_info, g_array_unref); g_clear_pointer (&device->scroll_info, g_array_unref);
@@ -171,8 +167,8 @@ clutter_input_device_set_property (GObject *gobject,
self->device_type = g_value_get_enum (value); self->device_type = g_value_get_enum (value);
break; break;
case PROP_SEAT: case PROP_DEVICE_MANAGER:
self->seat = g_value_get_object (value); self->device_manager = g_value_get_object (value);
break; break;
case PROP_DEVICE_MODE: case PROP_DEVICE_MODE:
@@ -247,8 +243,8 @@ clutter_input_device_get_property (GObject *gobject,
g_value_set_enum (value, self->device_type); g_value_set_enum (value, self->device_type);
break; break;
case PROP_SEAT: case PROP_DEVICE_MANAGER:
g_value_set_object (value, self->seat); g_value_set_object (value, self->device_manager);
break; break;
case PROP_DEVICE_MODE: case PROP_DEVICE_MODE:
@@ -362,15 +358,17 @@ clutter_input_device_class_init (ClutterInputDeviceClass *klass)
G_PARAM_CONSTRUCT_ONLY); G_PARAM_CONSTRUCT_ONLY);
/** /**
* ClutterInputDevice:seat: * ClutterInputDevice:device-manager:
* *
* The #ClutterSeat instance which owns the device * The #ClutterDeviceManager instance which owns the device
*
* Since: 1.6
*/ */
obj_props[PROP_SEAT] = obj_props[PROP_DEVICE_MANAGER] =
g_param_spec_object ("seat", g_param_spec_object ("device-manager",
P_("Seat"), P_("Device Manager"),
P_("Seat"), P_("The device manager instance"),
CLUTTER_TYPE_SEAT, CLUTTER_TYPE_DEVICE_MANAGER,
CLUTTER_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY); CLUTTER_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY);
/** /**
@@ -798,7 +796,7 @@ on_cursor_actor_reactive_changed (ClutterActor *actor,
* *
* Sets the actor under the pointer coordinates of @device * Sets the actor under the pointer coordinates of @device
* *
* This function is called by clutter_input_device_update() * This function is called by _clutter_input_device_update()
* and it will: * and it will:
* *
* - queue a %CLUTTER_LEAVE event on the previous pointer actor * - queue a %CLUTTER_LEAVE event on the previous pointer actor
@@ -836,7 +834,6 @@ _clutter_input_device_set_actor (ClutterInputDevice *device,
event->crossing.x = device->current_x; event->crossing.x = device->current_x;
event->crossing.y = device->current_y; event->crossing.y = device->current_y;
event->crossing.related = actor; event->crossing.related = actor;
event->crossing.sequence = sequence;
clutter_event_set_device (event, device); clutter_event_set_device (event, device);
/* we need to make sure that this event is processed /* we need to make sure that this event is processed
@@ -873,7 +870,6 @@ _clutter_input_device_set_actor (ClutterInputDevice *device,
event->crossing.y = device->current_y; event->crossing.y = device->current_y;
event->crossing.source = actor; event->crossing.source = actor;
event->crossing.related = old_actor; event->crossing.related = old_actor;
event->crossing.sequence = sequence;
clutter_event_set_device (event, device); clutter_event_set_device (event, device);
/* see above */ /* see above */
@@ -990,7 +986,7 @@ clutter_input_device_get_enabled (ClutterInputDevice *device)
gboolean gboolean
clutter_input_device_get_coords (ClutterInputDevice *device, clutter_input_device_get_coords (ClutterInputDevice *device,
ClutterEventSequence *sequence, ClutterEventSequence *sequence,
graphene_point_t *point) ClutterPoint *point)
{ {
g_return_val_if_fail (CLUTTER_IS_INPUT_DEVICE (device), FALSE); g_return_val_if_fail (CLUTTER_IS_INPUT_DEVICE (device), FALSE);
g_return_val_if_fail (point != NULL, FALSE); g_return_val_if_fail (point != NULL, FALSE);
@@ -1016,7 +1012,7 @@ clutter_input_device_get_coords (ClutterInputDevice *device,
} }
/* /*
* clutter_input_device_update: * _clutter_input_device_update:
* @device: a #ClutterInputDevice * @device: a #ClutterInputDevice
* *
* Updates the input @device by determining the #ClutterActor underneath the * Updates the input @device by determining the #ClutterActor underneath the
@@ -1030,18 +1026,17 @@ clutter_input_device_get_coords (ClutterInputDevice *device,
* Since: 1.2 * Since: 1.2
*/ */
ClutterActor * ClutterActor *
clutter_input_device_update (ClutterInputDevice *device, _clutter_input_device_update (ClutterInputDevice *device,
ClutterEventSequence *sequence, ClutterEventSequence *sequence,
gboolean emit_crossing) gboolean emit_crossing)
{ {
ClutterStage *stage; ClutterStage *stage;
ClutterActor *new_cursor_actor; ClutterActor *new_cursor_actor;
ClutterActor *old_cursor_actor; ClutterActor *old_cursor_actor;
graphene_point_t point = GRAPHENE_POINT_INIT (-1.0f, -1.0f); ClutterPoint point = { -1, -1 };
ClutterInputDeviceType device_type = device->device_type;
g_assert (device_type != CLUTTER_KEYBOARD_DEVICE && if (device->device_type == CLUTTER_KEYBOARD_DEVICE)
device_type != CLUTTER_PAD_DEVICE); return NULL;
stage = device->stage; stage = device->stage;
if (G_UNLIKELY (stage == NULL)) if (G_UNLIKELY (stage == NULL))
@@ -1223,11 +1218,11 @@ clutter_input_device_get_device_mode (ClutterInputDevice *device)
* *
* translate_native_event_to_clutter (native_event, &c_event); * translate_native_event_to_clutter (native_event, &c_event);
* *
* // get the seat * // get the device manager
* seat = clutter_backend_get_deafult_seat (clutter_get_default_backend ()); * manager = clutter_device_manager_get_default ();
* *
* // use the default Core Pointer that Clutter backends register by default * // use the default Core Pointer that Clutter backends register by default
* device = clutter_seat_get_pointer (seat); * device = clutter_device_manager_get_core_device (manager, %CLUTTER_POINTER_DEVICE);
* *
* // update the state of the input device * // update the state of the input device
* clutter_input_device_update_from_event (device, &c_event, FALSE); * clutter_input_device_update_from_event (device, &c_event, FALSE);
@@ -1924,157 +1919,6 @@ _clutter_input_device_reset_scroll_info (ClutterInputDevice *device)
} }
} }
static void
on_grab_actor_destroy (ClutterActor *actor,
ClutterInputDevice *device)
{
switch (device->device_type)
{
case CLUTTER_POINTER_DEVICE:
case CLUTTER_TABLET_DEVICE:
device->pointer_grab_actor = NULL;
break;
case CLUTTER_KEYBOARD_DEVICE:
device->keyboard_grab_actor = NULL;
break;
default:
g_assert_not_reached ();
}
}
/**
* clutter_input_device_grab:
* @device: a #ClutterInputDevice
* @actor: a #ClutterActor
*
* Acquires a grab on @actor for the given @device.
*
* Any event coming from @device will be delivered to @actor, bypassing
* the usual event delivery mechanism, until the grab is released by
* calling clutter_input_device_ungrab().
*
* The grab is client-side: even if the windowing system used by the Clutter
* backend has the concept of "device grabs", Clutter will not use them.
*
* Only #ClutterInputDevice of types %CLUTTER_POINTER_DEVICE,
* %CLUTTER_TABLET_DEVICE and %CLUTTER_KEYBOARD_DEVICE can hold a grab.
*
* Since: 1.10
*/
void
clutter_input_device_grab (ClutterInputDevice *device,
ClutterActor *actor)
{
ClutterActor **grab_actor;
g_return_if_fail (CLUTTER_IS_INPUT_DEVICE (device));
g_return_if_fail (CLUTTER_IS_ACTOR (actor));
switch (device->device_type)
{
case CLUTTER_POINTER_DEVICE:
case CLUTTER_TABLET_DEVICE:
grab_actor = &device->pointer_grab_actor;
break;
case CLUTTER_KEYBOARD_DEVICE:
grab_actor = &device->keyboard_grab_actor;
break;
default:
g_critical ("Only pointer and keyboard devices can grab an actor");
return;
}
if (*grab_actor != NULL)
{
g_signal_handlers_disconnect_by_func (*grab_actor,
G_CALLBACK (on_grab_actor_destroy),
device);
}
*grab_actor = actor;
g_signal_connect (*grab_actor,
"destroy",
G_CALLBACK (on_grab_actor_destroy),
device);
}
/**
* clutter_input_device_ungrab:
* @device: a #ClutterInputDevice
*
* Releases the grab on the @device, if one is in place.
*
* Since: 1.10
*/
void
clutter_input_device_ungrab (ClutterInputDevice *device)
{
ClutterActor **grab_actor;
g_return_if_fail (CLUTTER_IS_INPUT_DEVICE (device));
switch (device->device_type)
{
case CLUTTER_POINTER_DEVICE:
case CLUTTER_TABLET_DEVICE:
grab_actor = &device->pointer_grab_actor;
break;
case CLUTTER_KEYBOARD_DEVICE:
grab_actor = &device->keyboard_grab_actor;
break;
default:
return;
}
if (*grab_actor == NULL)
return;
g_signal_handlers_disconnect_by_func (*grab_actor,
G_CALLBACK (on_grab_actor_destroy),
device);
*grab_actor = NULL;
}
/**
* clutter_input_device_get_grabbed_actor:
* @device: a #ClutterInputDevice
*
* Retrieves a pointer to the #ClutterActor currently grabbing all
* the events coming from @device.
*
* Return value: (transfer none): a #ClutterActor, or %NULL
*
* Since: 1.10
*/
ClutterActor *
clutter_input_device_get_grabbed_actor (ClutterInputDevice *device)
{
g_return_val_if_fail (CLUTTER_IS_INPUT_DEVICE (device), NULL);
switch (device->device_type)
{
case CLUTTER_POINTER_DEVICE:
case CLUTTER_TABLET_DEVICE:
return device->pointer_grab_actor;
case CLUTTER_KEYBOARD_DEVICE:
return device->keyboard_grab_actor;
default:
g_critical ("Only pointer and keyboard devices can grab an actor");
}
return NULL;
}
static void static void
on_grab_sequence_actor_destroy (ClutterActor *actor, on_grab_sequence_actor_destroy (ClutterActor *actor,
ClutterInputDevice *device) ClutterInputDevice *device)
@@ -2441,18 +2285,14 @@ clutter_input_device_is_grouped (ClutterInputDevice *device,
return CLUTTER_INPUT_DEVICE_GET_CLASS (device)->is_grouped (device, other_device); return CLUTTER_INPUT_DEVICE_GET_CLASS (device)->is_grouped (device, other_device);
} }
/** gboolean
* clutter_input_device_get_seat: clutter_input_device_get_physical_size (ClutterInputDevice *device,
* @device: a #ClutterInputDevice gdouble *width,
* gdouble *height)
* Returns the seat the device belongs to
*
* Returns: (transfer none): the device seat
**/
ClutterSeat *
clutter_input_device_get_seat (ClutterInputDevice *device)
{ {
g_return_val_if_fail (CLUTTER_IS_INPUT_DEVICE (device), NULL); g_return_val_if_fail (CLUTTER_IS_INPUT_DEVICE (device), FALSE);
return device->seat; return CLUTTER_INPUT_DEVICE_GET_CLASS (device)->get_physical_size (device,
width,
height);
} }

View File

@@ -28,40 +28,10 @@
#error "Only <clutter/clutter.h> can be included directly." #error "Only <clutter/clutter.h> can be included directly."
#endif #endif
#include <clutter/clutter-backend.h>
#include <clutter/clutter-types.h> #include <clutter/clutter-types.h>
#include <clutter/clutter-seat.h>
G_BEGIN_DECLS G_BEGIN_DECLS
typedef void (*ClutterEmitInputDeviceEvent) (ClutterEvent *event,
ClutterInputDevice *device);
struct _ClutterInputDeviceClass
{
GObjectClass parent_class;
gboolean (* keycode_to_evdev) (ClutterInputDevice *device,
guint hardware_keycode,
guint *evdev_keycode);
void (* update_from_tool) (ClutterInputDevice *device,
ClutterInputDeviceTool *tool);
gboolean (* is_mode_switch_button) (ClutterInputDevice *device,
guint group,
guint button);
gint (* get_group_n_modes) (ClutterInputDevice *device,
gint group);
gboolean (* is_grouped) (ClutterInputDevice *device,
ClutterInputDevice *other_device);
/* Keyboard accessbility */
void (* process_kbd_a11y_event) (ClutterEvent *event,
ClutterInputDevice *device,
ClutterEmitInputDeviceEvent emit_event_func);
};
#define CLUTTER_TYPE_INPUT_DEVICE (clutter_input_device_get_type ()) #define CLUTTER_TYPE_INPUT_DEVICE (clutter_input_device_get_type ())
#define CLUTTER_INPUT_DEVICE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), CLUTTER_TYPE_INPUT_DEVICE, ClutterInputDevice)) #define CLUTTER_INPUT_DEVICE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), CLUTTER_TYPE_INPUT_DEVICE, ClutterInputDevice))
#define CLUTTER_IS_INPUT_DEVICE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CLUTTER_TYPE_INPUT_DEVICE)) #define CLUTTER_IS_INPUT_DEVICE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CLUTTER_TYPE_INPUT_DEVICE))
@@ -88,7 +58,7 @@ gint clutter_input_device_get_device_id (ClutterInputDev
CLUTTER_EXPORT CLUTTER_EXPORT
gboolean clutter_input_device_get_coords (ClutterInputDevice *device, gboolean clutter_input_device_get_coords (ClutterInputDevice *device,
ClutterEventSequence *sequence, ClutterEventSequence *sequence,
graphene_point_t *point); ClutterPoint *point);
CLUTTER_EXPORT CLUTTER_EXPORT
ClutterModifierType clutter_input_device_get_modifier_state (ClutterInputDevice *device); ClutterModifierType clutter_input_device_get_modifier_state (ClutterInputDevice *device);
CLUTTER_EXPORT CLUTTER_EXPORT
@@ -202,7 +172,9 @@ CLUTTER_EXPORT
gboolean clutter_input_device_is_grouped (ClutterInputDevice *device, gboolean clutter_input_device_is_grouped (ClutterInputDevice *device,
ClutterInputDevice *other_device); ClutterInputDevice *other_device);
CLUTTER_EXPORT CLUTTER_EXPORT
ClutterSeat * clutter_input_device_get_seat (ClutterInputDevice *device); gboolean clutter_input_device_get_physical_size (ClutterInputDevice *device,
gdouble *width,
gdouble *height);
G_END_DECLS G_END_DECLS

View File

@@ -29,7 +29,7 @@ void clutter_input_focus_focus_out (ClutterInputFocus *focus);
void clutter_input_focus_commit (ClutterInputFocus *focus, void clutter_input_focus_commit (ClutterInputFocus *focus,
const gchar *text); const gchar *text);
void clutter_input_focus_delete_surrounding (ClutterInputFocus *focus, void clutter_input_focus_delete_surrounding (ClutterInputFocus *focus,
int offset, guint offset,
guint len); guint len);
void clutter_input_focus_request_surrounding (ClutterInputFocus *focus); void clutter_input_focus_request_surrounding (ClutterInputFocus *focus);

View File

@@ -89,8 +89,8 @@ clutter_input_focus_reset (ClutterInputFocus *focus)
} }
void void
clutter_input_focus_set_cursor_location (ClutterInputFocus *focus, clutter_input_focus_set_cursor_location (ClutterInputFocus *focus,
const graphene_rect_t *rect) const ClutterRect *rect)
{ {
ClutterInputFocusPrivate *priv; ClutterInputFocusPrivate *priv;
@@ -175,8 +175,7 @@ clutter_input_focus_set_can_show_preedit (ClutterInputFocus *focus,
} }
void void
clutter_input_focus_set_input_panel_state (ClutterInputFocus *focus, clutter_input_focus_request_toggle_input_panel (ClutterInputFocus *focus)
ClutterInputPanelState state)
{ {
ClutterInputFocusPrivate *priv; ClutterInputFocusPrivate *priv;
@@ -185,7 +184,7 @@ clutter_input_focus_set_input_panel_state (ClutterInputFocus *focus,
priv = clutter_input_focus_get_instance_private (focus); priv = clutter_input_focus_get_instance_private (focus);
clutter_input_method_set_input_panel_state (priv->im, state); clutter_input_method_toggle_input_panel (priv->im);
} }
void void
@@ -217,7 +216,7 @@ clutter_input_focus_commit (ClutterInputFocus *focus,
void void
clutter_input_focus_delete_surrounding (ClutterInputFocus *focus, clutter_input_focus_delete_surrounding (ClutterInputFocus *focus,
int offset, guint offset,
guint len) guint len)
{ {
g_return_if_fail (CLUTTER_IS_INPUT_FOCUS (focus)); g_return_if_fail (CLUTTER_IS_INPUT_FOCUS (focus));

View File

@@ -41,7 +41,7 @@ struct _ClutterInputFocusClass
void (* request_surrounding) (ClutterInputFocus *focus); void (* request_surrounding) (ClutterInputFocus *focus);
void (* delete_surrounding) (ClutterInputFocus *focus, void (* delete_surrounding) (ClutterInputFocus *focus,
int offset, guint offset,
guint len); guint len);
void (* commit_text) (ClutterInputFocus *focus, void (* commit_text) (ClutterInputFocus *focus,
const gchar *text); const gchar *text);
@@ -57,8 +57,8 @@ gboolean clutter_input_focus_is_focused (ClutterInputFocus *focus);
CLUTTER_EXPORT CLUTTER_EXPORT
void clutter_input_focus_reset (ClutterInputFocus *focus); void clutter_input_focus_reset (ClutterInputFocus *focus);
CLUTTER_EXPORT CLUTTER_EXPORT
void clutter_input_focus_set_cursor_location (ClutterInputFocus *focus, void clutter_input_focus_set_cursor_location (ClutterInputFocus *focus,
const graphene_rect_t *rect); const ClutterRect *rect);
CLUTTER_EXPORT CLUTTER_EXPORT
void clutter_input_focus_set_surrounding (ClutterInputFocus *focus, void clutter_input_focus_set_surrounding (ClutterInputFocus *focus,
@@ -78,7 +78,6 @@ CLUTTER_EXPORT
void clutter_input_focus_set_can_show_preedit (ClutterInputFocus *focus, void clutter_input_focus_set_can_show_preedit (ClutterInputFocus *focus,
gboolean can_show_preedit); gboolean can_show_preedit);
CLUTTER_EXPORT CLUTTER_EXPORT
void clutter_input_focus_set_input_panel_state (ClutterInputFocus *focus, void clutter_input_focus_request_toggle_input_panel (ClutterInputFocus *focus);
ClutterInputPanelState state);
#endif /* __CLUTTER_INPUT_FOCUS_H__ */ #endif /* __CLUTTER_INPUT_FOCUS_H__ */

View File

@@ -26,8 +26,8 @@ ClutterInputFocus * clutter_input_method_get_focus (ClutterInputMethod *method);
void clutter_input_method_reset (ClutterInputMethod *method); void clutter_input_method_reset (ClutterInputMethod *method);
void clutter_input_method_set_cursor_location (ClutterInputMethod *method, void clutter_input_method_set_cursor_location (ClutterInputMethod *method,
const graphene_rect_t *rect); const ClutterRect *rect);
void clutter_input_method_set_surrounding (ClutterInputMethod *method, void clutter_input_method_set_surrounding (ClutterInputMethod *method,
const gchar *text, const gchar *text,
guint cursor, guint cursor,

View File

@@ -22,10 +22,10 @@
#include "clutter-build-config.h" #include "clutter-build-config.h"
#include "clutter-private.h" #include "clutter-private.h"
#include "clutter/clutter-input-device-private.h"
#include "clutter/clutter-input-method.h" #include "clutter/clutter-input-method.h"
#include "clutter/clutter-input-method-private.h" #include "clutter/clutter-input-method-private.h"
#include "clutter/clutter-input-focus-private.h" #include "clutter/clutter-input-focus-private.h"
#include "clutter/clutter-device-manager-private.h"
typedef struct _ClutterInputMethodPrivate ClutterInputMethodPrivate; typedef struct _ClutterInputMethodPrivate ClutterInputMethodPrivate;
@@ -37,8 +37,7 @@ struct _ClutterInputMethodPrivate
gboolean can_show_preedit; gboolean can_show_preedit;
}; };
enum enum {
{
COMMIT, COMMIT,
DELETE_SURROUNDING, DELETE_SURROUNDING,
REQUEST_SURROUNDING, REQUEST_SURROUNDING,
@@ -47,8 +46,7 @@ enum
N_SIGNALS, N_SIGNALS,
}; };
enum enum {
{
PROP_0, PROP_0,
PROP_CONTENT_HINTS, PROP_CONTENT_HINTS,
PROP_CONTENT_PURPOSE, PROP_CONTENT_PURPOSE,
@@ -168,7 +166,7 @@ clutter_input_method_class_init (ClutterInputMethodClass *klass)
G_TYPE_FROM_CLASS (object_class), G_TYPE_FROM_CLASS (object_class),
G_SIGNAL_RUN_LAST, G_SIGNAL_RUN_LAST,
0, NULL, NULL, NULL, 0, NULL, NULL, NULL,
G_TYPE_NONE, 2, G_TYPE_INT, G_TYPE_UINT); G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_UINT);
signals[REQUEST_SURROUNDING] = signals[REQUEST_SURROUNDING] =
g_signal_new ("request-surrounding", g_signal_new ("request-surrounding",
G_TYPE_FROM_CLASS (object_class), G_TYPE_FROM_CLASS (object_class),
@@ -187,7 +185,7 @@ clutter_input_method_class_init (ClutterInputMethodClass *klass)
G_TYPE_FROM_CLASS (object_class), G_TYPE_FROM_CLASS (object_class),
G_SIGNAL_RUN_LAST, G_SIGNAL_RUN_LAST,
0, NULL, NULL, NULL, 0, NULL, NULL, NULL,
G_TYPE_NONE, 1, GRAPHENE_TYPE_RECT); G_TYPE_NONE, 1, CLUTTER_TYPE_RECT);
pspecs[PROP_CONTENT_HINTS] = pspecs[PROP_CONTENT_HINTS] =
g_param_spec_flags ("content-hints", g_param_spec_flags ("content-hints",
@@ -266,6 +264,9 @@ clutter_input_method_focus_out (ClutterInputMethod *im)
klass = CLUTTER_INPUT_METHOD_GET_CLASS (im); klass = CLUTTER_INPUT_METHOD_GET_CLASS (im);
klass->focus_out (im); klass->focus_out (im);
g_signal_emit (im, signals[INPUT_PANEL_STATE],
0, CLUTTER_INPUT_PANEL_STATE_OFF);
} }
ClutterInputFocus * ClutterInputFocus *
@@ -292,7 +293,7 @@ clutter_input_method_commit (ClutterInputMethod *im,
void void
clutter_input_method_delete_surrounding (ClutterInputMethod *im, clutter_input_method_delete_surrounding (ClutterInputMethod *im,
int offset, guint offset,
guint len) guint len)
{ {
ClutterInputMethodPrivate *priv; ClutterInputMethodPrivate *priv;
@@ -360,12 +361,12 @@ clutter_input_method_notify_key_event (ClutterInputMethod *im,
} }
void void
clutter_input_method_set_input_panel_state (ClutterInputMethod *im, clutter_input_method_toggle_input_panel (ClutterInputMethod *im)
ClutterInputPanelState state)
{ {
g_return_if_fail (CLUTTER_IS_INPUT_METHOD (im)); g_return_if_fail (CLUTTER_IS_INPUT_METHOD (im));
g_signal_emit (im, signals[INPUT_PANEL_STATE], 0, state); g_signal_emit (im, signals[INPUT_PANEL_STATE], 0,
CLUTTER_INPUT_PANEL_STATE_TOGGLE);
} }
void void
@@ -377,8 +378,8 @@ clutter_input_method_reset (ClutterInputMethod *im)
} }
void void
clutter_input_method_set_cursor_location (ClutterInputMethod *im, clutter_input_method_set_cursor_location (ClutterInputMethod *im,
const graphene_rect_t *rect) const ClutterRect *rect)
{ {
g_return_if_fail (CLUTTER_IS_INPUT_METHOD (im)); g_return_if_fail (CLUTTER_IS_INPUT_METHOD (im));
@@ -452,8 +453,8 @@ clutter_input_method_forward_key (ClutterInputMethod *im,
gboolean press) gboolean press)
{ {
ClutterInputMethodPrivate *priv; ClutterInputMethodPrivate *priv;
ClutterDeviceManager *device_manager;
ClutterInputDevice *keyboard; ClutterInputDevice *keyboard;
ClutterSeat *seat;
ClutterStage *stage; ClutterStage *stage;
ClutterEvent *event; ClutterEvent *event;
@@ -463,8 +464,9 @@ clutter_input_method_forward_key (ClutterInputMethod *im,
if (!priv->focus) if (!priv->focus)
return; return;
seat = clutter_backend_get_default_seat (clutter_get_default_backend ()); device_manager = clutter_device_manager_get_default ();
keyboard = clutter_seat_get_keyboard (seat); keyboard = clutter_device_manager_get_core_device (device_manager,
CLUTTER_KEYBOARD_DEVICE);
stage = _clutter_input_device_get_stage (keyboard); stage = _clutter_input_device_get_stage (keyboard);
if (stage == NULL) if (stage == NULL)
return; return;

View File

@@ -42,8 +42,8 @@ struct _ClutterInputMethodClass
void (* reset) (ClutterInputMethod *im); void (* reset) (ClutterInputMethod *im);
void (* set_cursor_location) (ClutterInputMethod *im, void (* set_cursor_location) (ClutterInputMethod *im,
const graphene_rect_t *rect); const ClutterRect *rect);
void (* set_surrounding) (ClutterInputMethod *im, void (* set_surrounding) (ClutterInputMethod *im,
const gchar *text, const gchar *text,
guint cursor, guint cursor,
@@ -68,7 +68,7 @@ void clutter_input_method_commit (ClutterInputMethod *im,
const gchar *text); const gchar *text);
CLUTTER_EXPORT CLUTTER_EXPORT
void clutter_input_method_delete_surrounding (ClutterInputMethod *im, void clutter_input_method_delete_surrounding (ClutterInputMethod *im,
int offset, guint offset,
guint len); guint len);
CLUTTER_EXPORT CLUTTER_EXPORT
void clutter_input_method_request_surrounding (ClutterInputMethod *im); void clutter_input_method_request_surrounding (ClutterInputMethod *im);
@@ -83,8 +83,7 @@ void clutter_input_method_notify_key_event (ClutterInputMethod *im,
const ClutterEvent *event, const ClutterEvent *event,
gboolean filtered); gboolean filtered);
CLUTTER_EXPORT CLUTTER_EXPORT
void clutter_input_method_set_input_panel_state (ClutterInputMethod *im, void clutter_input_method_request_toggle_input_panel (ClutterInputMethod *im);
ClutterInputPanelState state);
CLUTTER_EXPORT CLUTTER_EXPORT
void clutter_input_method_forward_key (ClutterInputMethod *im, void clutter_input_method_forward_key (ClutterInputMethod *im,

View File

@@ -1,47 +0,0 @@
/*
* Copyright (C) 2019 Red Hat
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
* 02111-1307, USA.
*
* Author: Olivier Fourdan <ofourdan@redhat.com>
*/
#ifndef __CLUTTER_INPUT_POINTER_A11Y_H__
#define __CLUTTER_INPUT_POINTER_A11Y_H__
#include <clutter/clutter-types.h>
#include "clutter-enum-types.h"
G_BEGIN_DECLS
CLUTTER_EXPORT
void _clutter_input_pointer_a11y_add_device (ClutterInputDevice *device);
CLUTTER_EXPORT
void _clutter_input_pointer_a11y_remove_device (ClutterInputDevice *device);
CLUTTER_EXPORT
void _clutter_input_pointer_a11y_on_motion_event (ClutterInputDevice *device,
float x,
float y);
CLUTTER_EXPORT
void _clutter_input_pointer_a11y_on_button_event (ClutterInputDevice *device,
int button,
gboolean pressed);
CLUTTER_EXPORT
gboolean _clutter_is_input_pointer_a11y_enabled (ClutterInputDevice *device);
G_END_DECLS
#endif /* __CLUTTER_INPUT_POINTER_A11Y_H__ */

View File

@@ -1,706 +0,0 @@
/*
* Copyright (C) 2019 Red Hat
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
* 02111-1307, USA.
*
* Author: Olivier Fourdan <ofourdan@redhat.com>
*
* This reimplements in Clutter the same behavior as mousetweaks original
* implementation by Gerd Kohlberger <gerdko gmail com>
* mousetweaks Copyright (C) 2007-2010 Gerd Kohlberger <gerdko gmail com>
*/
#include "clutter-build-config.h"
#include "clutter-enum-types.h"
#include "clutter-input-device.h"
#include "clutter-input-device-private.h"
#include "clutter-input-pointer-a11y-private.h"
#include "clutter-main.h"
#include "clutter-virtual-input-device.h"
static gboolean
is_secondary_click_enabled (ClutterInputDevice *device)
{
ClutterPointerA11ySettings settings;
clutter_seat_get_pointer_a11y_settings (device->seat, &settings);
return (settings.controls & CLUTTER_A11Y_SECONDARY_CLICK_ENABLED);
}
static gboolean
is_dwell_click_enabled (ClutterInputDevice *device)
{
ClutterPointerA11ySettings settings;
clutter_seat_get_pointer_a11y_settings (device->seat, &settings);
return (settings.controls & CLUTTER_A11Y_DWELL_ENABLED);
}
static unsigned int
get_secondary_click_delay (ClutterInputDevice *device)
{
ClutterPointerA11ySettings settings;
clutter_seat_get_pointer_a11y_settings (device->seat, &settings);
return settings.secondary_click_delay;
}
static unsigned int
get_dwell_delay (ClutterInputDevice *device)
{
ClutterPointerA11ySettings settings;
clutter_seat_get_pointer_a11y_settings (device->seat, &settings);
return settings.dwell_delay;
}
static unsigned int
get_dwell_threshold (ClutterInputDevice *device)
{
ClutterPointerA11ySettings settings;
clutter_seat_get_pointer_a11y_settings (device->seat, &settings);
return settings.dwell_threshold;
}
static ClutterPointerA11yDwellMode
get_dwell_mode (ClutterInputDevice *device)
{
ClutterPointerA11ySettings settings;
clutter_seat_get_pointer_a11y_settings (device->seat, &settings);
return settings.dwell_mode;
}
static ClutterPointerA11yDwellClickType
get_dwell_click_type (ClutterInputDevice *device)
{
ClutterPointerA11ySettings settings;
clutter_seat_get_pointer_a11y_settings (device->seat, &settings);
return settings.dwell_click_type;
}
static ClutterPointerA11yDwellClickType
get_dwell_click_type_for_direction (ClutterInputDevice *device,
ClutterPointerA11yDwellDirection direction)
{
ClutterPointerA11ySettings settings;
clutter_seat_get_pointer_a11y_settings (device->seat, &settings);
if (direction == settings.dwell_gesture_single)
return CLUTTER_A11Y_DWELL_CLICK_TYPE_PRIMARY;
else if (direction == settings.dwell_gesture_double)
return CLUTTER_A11Y_DWELL_CLICK_TYPE_DOUBLE;
else if (direction == settings.dwell_gesture_drag)
return CLUTTER_A11Y_DWELL_CLICK_TYPE_DRAG;
else if (direction == settings.dwell_gesture_secondary)
return CLUTTER_A11Y_DWELL_CLICK_TYPE_SECONDARY;
return CLUTTER_A11Y_DWELL_CLICK_TYPE_NONE;
}
static void
emit_button_press (ClutterInputDevice *device,
gint button)
{
clutter_virtual_input_device_notify_button (device->accessibility_virtual_device,
g_get_monotonic_time (),
button,
CLUTTER_BUTTON_STATE_PRESSED);
}
static void
emit_button_release (ClutterInputDevice *device,
gint button)
{
clutter_virtual_input_device_notify_button (device->accessibility_virtual_device,
g_get_monotonic_time (),
button,
CLUTTER_BUTTON_STATE_RELEASED);
}
static void
emit_button_click (ClutterInputDevice *device,
gint button)
{
emit_button_press (device, button);
emit_button_release (device, button);
}
static void
restore_dwell_position (ClutterInputDevice *device)
{
clutter_virtual_input_device_notify_absolute_motion (device->accessibility_virtual_device,
g_get_monotonic_time (),
device->ptr_a11y_data->dwell_x,
device->ptr_a11y_data->dwell_y);
}
static gboolean
trigger_secondary_click (gpointer data)
{
ClutterInputDevice *device = data;
device->ptr_a11y_data->secondary_click_triggered = TRUE;
device->ptr_a11y_data->secondary_click_timer = 0;
g_signal_emit_by_name (device->seat,
"ptr-a11y-timeout-stopped",
device,
CLUTTER_A11Y_TIMEOUT_TYPE_SECONDARY_CLICK,
TRUE);
return G_SOURCE_REMOVE;
}
static void
start_secondary_click_timeout (ClutterInputDevice *device)
{
unsigned int delay = get_secondary_click_delay (device);
device->ptr_a11y_data->secondary_click_timer =
clutter_threads_add_timeout (delay, trigger_secondary_click, device);
g_signal_emit_by_name (device->seat,
"ptr-a11y-timeout-started",
device,
CLUTTER_A11Y_TIMEOUT_TYPE_SECONDARY_CLICK,
delay);
}
static void
stop_secondary_click_timeout (ClutterInputDevice *device)
{
if (device->ptr_a11y_data->secondary_click_timer)
{
g_clear_handle_id (&device->ptr_a11y_data->secondary_click_timer,
g_source_remove);
g_signal_emit_by_name (device->seat,
"ptr-a11y-timeout-stopped",
device,
CLUTTER_A11Y_TIMEOUT_TYPE_SECONDARY_CLICK,
FALSE);
}
device->ptr_a11y_data->secondary_click_triggered = FALSE;
}
static gboolean
pointer_has_moved (ClutterInputDevice *device)
{
float dx, dy;
gint threshold;
dx = device->ptr_a11y_data->dwell_x - device->ptr_a11y_data->current_x;
dy = device->ptr_a11y_data->dwell_y - device->ptr_a11y_data->current_y;
threshold = get_dwell_threshold (device);
/* Pythagorean theorem */
return ((dx * dx) + (dy * dy)) > (threshold * threshold);
}
static gboolean
is_secondary_click_pending (ClutterInputDevice *device)
{
return device->ptr_a11y_data->secondary_click_timer != 0;
}
static gboolean
is_secondary_click_triggered (ClutterInputDevice *device)
{
return device->ptr_a11y_data->secondary_click_triggered;
}
static gboolean
is_dwell_click_pending (ClutterInputDevice *device)
{
return device->ptr_a11y_data->dwell_timer != 0;
}
static gboolean
is_dwell_dragging (ClutterInputDevice *device)
{
return device->ptr_a11y_data->dwell_drag_started;
}
static gboolean
is_dwell_gesturing (ClutterInputDevice *device)
{
return device->ptr_a11y_data->dwell_gesture_started;
}
static gboolean
has_button_pressed (ClutterInputDevice *device)
{
return device->ptr_a11y_data->n_btn_pressed > 0;
}
static gboolean
should_start_secondary_click_timeout (ClutterInputDevice *device)
{
return !is_dwell_dragging (device);
}
static gboolean
should_start_dwell (ClutterInputDevice *device)
{
/* We should trigger a dwell if we've not already started one, and if
* no button is currently pressed or we are in the middle of a dwell
* drag action.
*/
return !is_dwell_click_pending (device) &&
(is_dwell_dragging (device) ||
!has_button_pressed (device));
}
static gboolean
should_stop_dwell (ClutterInputDevice *device)
{
/* We should stop a dwell if the motion exceeds the threshold, unless
* we've started a gesture, because we want to keep the original dwell
* location to both detect a gesture and restore the original pointer
* location once the gesture is finished.
*/
return pointer_has_moved (device) &&
!is_dwell_gesturing (device);
}
static gboolean
should_update_dwell_position (ClutterInputDevice *device)
{
return !is_dwell_gesturing (device) &&
!is_dwell_click_pending (device) &&
!is_secondary_click_pending (device);
}
static void
update_dwell_click_type (ClutterInputDevice *device)
{
ClutterPointerA11ySettings settings;
ClutterPointerA11yDwellClickType dwell_click_type;
clutter_seat_get_pointer_a11y_settings (device->seat, &settings);
dwell_click_type = settings.dwell_click_type;
switch (dwell_click_type)
{
case CLUTTER_A11Y_DWELL_CLICK_TYPE_DOUBLE:
case CLUTTER_A11Y_DWELL_CLICK_TYPE_SECONDARY:
case CLUTTER_A11Y_DWELL_CLICK_TYPE_MIDDLE:
dwell_click_type = CLUTTER_A11Y_DWELL_CLICK_TYPE_PRIMARY;
break;
case CLUTTER_A11Y_DWELL_CLICK_TYPE_DRAG:
if (!is_dwell_dragging (device))
dwell_click_type = CLUTTER_A11Y_DWELL_CLICK_TYPE_PRIMARY;
break;
case CLUTTER_A11Y_DWELL_CLICK_TYPE_PRIMARY:
case CLUTTER_A11Y_DWELL_CLICK_TYPE_NONE:
default:
break;
}
if (dwell_click_type != settings.dwell_click_type)
{
settings.dwell_click_type = dwell_click_type;
clutter_seat_set_pointer_a11y_settings (device->seat, &settings);
g_signal_emit_by_name (device->seat,
"ptr-a11y-dwell-click-type-changed",
dwell_click_type);
}
}
static void
emit_dwell_click (ClutterInputDevice *device,
ClutterPointerA11yDwellClickType dwell_click_type)
{
switch (dwell_click_type)
{
case CLUTTER_A11Y_DWELL_CLICK_TYPE_PRIMARY:
emit_button_click (device, CLUTTER_BUTTON_PRIMARY);
break;
case CLUTTER_A11Y_DWELL_CLICK_TYPE_DOUBLE:
emit_button_click (device, CLUTTER_BUTTON_PRIMARY);
emit_button_click (device, CLUTTER_BUTTON_PRIMARY);
break;
case CLUTTER_A11Y_DWELL_CLICK_TYPE_DRAG:
if (is_dwell_dragging (device))
{
emit_button_release (device, CLUTTER_BUTTON_PRIMARY);
device->ptr_a11y_data->dwell_drag_started = FALSE;
}
else
{
emit_button_press (device, CLUTTER_BUTTON_PRIMARY);
device->ptr_a11y_data->dwell_drag_started = TRUE;
}
break;
case CLUTTER_A11Y_DWELL_CLICK_TYPE_SECONDARY:
emit_button_click (device, CLUTTER_BUTTON_SECONDARY);
break;
case CLUTTER_A11Y_DWELL_CLICK_TYPE_MIDDLE:
emit_button_click (device, CLUTTER_BUTTON_MIDDLE);
break;
case CLUTTER_A11Y_DWELL_CLICK_TYPE_NONE:
default:
break;
}
}
static ClutterPointerA11yDwellDirection
get_dwell_direction (ClutterInputDevice *device)
{
float dx, dy;
dx = ABS (device->ptr_a11y_data->dwell_x - device->ptr_a11y_data->current_x);
dy = ABS (device->ptr_a11y_data->dwell_y - device->ptr_a11y_data->current_y);
/* The pointer hasn't moved */
if (!pointer_has_moved (device))
return CLUTTER_A11Y_DWELL_DIRECTION_NONE;
if (device->ptr_a11y_data->dwell_x < device->ptr_a11y_data->current_x)
{
if (dx > dy)
return CLUTTER_A11Y_DWELL_DIRECTION_LEFT;
}
else
{
if (dx > dy)
return CLUTTER_A11Y_DWELL_DIRECTION_RIGHT;
}
if (device->ptr_a11y_data->dwell_y < device->ptr_a11y_data->current_y)
return CLUTTER_A11Y_DWELL_DIRECTION_UP;
return CLUTTER_A11Y_DWELL_DIRECTION_DOWN;
}
static gboolean
trigger_clear_dwell_gesture (gpointer data)
{
ClutterInputDevice *device = data;
device->ptr_a11y_data->dwell_timer = 0;
device->ptr_a11y_data->dwell_gesture_started = FALSE;
return G_SOURCE_REMOVE;
}
static gboolean
trigger_dwell_gesture (gpointer data)
{
ClutterInputDevice *device = data;
ClutterPointerA11yDwellDirection direction;
unsigned int delay = get_dwell_delay (device);
restore_dwell_position (device);
direction = get_dwell_direction (device);
emit_dwell_click (device,
get_dwell_click_type_for_direction (device,
direction));
/* Do not clear the gesture right away, otherwise we'll start another one */
device->ptr_a11y_data->dwell_timer =
clutter_threads_add_timeout (delay, trigger_clear_dwell_gesture, device);
g_signal_emit_by_name (device->seat,
"ptr-a11y-timeout-stopped",
device,
CLUTTER_A11Y_TIMEOUT_TYPE_GESTURE,
TRUE);
return G_SOURCE_REMOVE;
}
static void
start_dwell_gesture_timeout (ClutterInputDevice *device)
{
unsigned int delay = get_dwell_delay (device);
device->ptr_a11y_data->dwell_timer =
clutter_threads_add_timeout (delay, trigger_dwell_gesture, device);
device->ptr_a11y_data->dwell_gesture_started = TRUE;
g_signal_emit_by_name (device->seat,
"ptr-a11y-timeout-started",
device,
CLUTTER_A11Y_TIMEOUT_TYPE_GESTURE,
delay);
}
static gboolean
trigger_dwell_click (gpointer data)
{
ClutterInputDevice *device = data;
device->ptr_a11y_data->dwell_timer = 0;
g_signal_emit_by_name (device->seat,
"ptr-a11y-timeout-stopped",
device,
CLUTTER_A11Y_TIMEOUT_TYPE_DWELL,
TRUE);
if (get_dwell_mode (device) == CLUTTER_A11Y_DWELL_MODE_GESTURE)
{
if (is_dwell_dragging (device))
emit_dwell_click (device, CLUTTER_A11Y_DWELL_CLICK_TYPE_DRAG);
else
start_dwell_gesture_timeout (device);
}
else
{
emit_dwell_click (device, get_dwell_click_type (device));
update_dwell_click_type (device);
}
return G_SOURCE_REMOVE;
}
static void
start_dwell_timeout (ClutterInputDevice *device)
{
unsigned int delay = get_dwell_delay (device);
device->ptr_a11y_data->dwell_timer =
clutter_threads_add_timeout (delay, trigger_dwell_click, device);
g_signal_emit_by_name (device->seat,
"ptr-a11y-timeout-started",
device,
CLUTTER_A11Y_TIMEOUT_TYPE_DWELL,
delay);
}
static void
stop_dwell_timeout (ClutterInputDevice *device)
{
if (device->ptr_a11y_data->dwell_timer)
{
g_clear_handle_id (&device->ptr_a11y_data->dwell_timer, g_source_remove);
device->ptr_a11y_data->dwell_gesture_started = FALSE;
g_signal_emit_by_name (device->seat,
"ptr-a11y-timeout-stopped",
device,
CLUTTER_A11Y_TIMEOUT_TYPE_DWELL,
FALSE);
}
}
static gboolean
trigger_dwell_position_timeout (gpointer data)
{
ClutterInputDevice *device = data;
device->ptr_a11y_data->dwell_position_timer = 0;
if (is_dwell_click_enabled (device))
{
if (!pointer_has_moved (device))
start_dwell_timeout (device);
}
return G_SOURCE_REMOVE;
}
static void
start_dwell_position_timeout (ClutterInputDevice *device)
{
device->ptr_a11y_data->dwell_position_timer =
clutter_threads_add_timeout (100, trigger_dwell_position_timeout, device);
}
static void
stop_dwell_position_timeout (ClutterInputDevice *device)
{
g_clear_handle_id (&device->ptr_a11y_data->dwell_position_timer,
g_source_remove);
}
static void
update_dwell_position (ClutterInputDevice *device)
{
device->ptr_a11y_data->dwell_x = device->ptr_a11y_data->current_x;
device->ptr_a11y_data->dwell_y = device->ptr_a11y_data->current_y;
}
static void
update_current_position (ClutterInputDevice *device,
float x,
float y)
{
device->ptr_a11y_data->current_x = x;
device->ptr_a11y_data->current_y = y;
}
static gboolean
is_device_core_pointer (ClutterInputDevice *device)
{
ClutterInputDevice *core_pointer;
core_pointer = clutter_seat_get_pointer (device->seat);
if (core_pointer == NULL)
return FALSE;
return (core_pointer == device);
}
void
_clutter_input_pointer_a11y_add_device (ClutterInputDevice *device)
{
if (!is_device_core_pointer (device))
return;
device->accessibility_virtual_device =
clutter_seat_create_virtual_device (device->seat,
CLUTTER_POINTER_DEVICE);
device->ptr_a11y_data = g_new0 (ClutterPtrA11yData, 1);
}
void
_clutter_input_pointer_a11y_remove_device (ClutterInputDevice *device)
{
if (!is_device_core_pointer (device))
return;
/* Terminate a drag if started */
if (is_dwell_dragging (device))
emit_dwell_click (device, CLUTTER_A11Y_DWELL_CLICK_TYPE_DRAG);
stop_dwell_position_timeout (device);
stop_dwell_timeout (device);
stop_secondary_click_timeout (device);
g_clear_pointer (&device->ptr_a11y_data, g_free);
}
void
_clutter_input_pointer_a11y_on_motion_event (ClutterInputDevice *device,
float x,
float y)
{
if (!is_device_core_pointer (device))
return;
if (!_clutter_is_input_pointer_a11y_enabled (device))
return;
update_current_position (device, x, y);
if (is_secondary_click_enabled (device))
{
if (pointer_has_moved (device))
stop_secondary_click_timeout (device);
}
if (is_dwell_click_enabled (device))
{
stop_dwell_position_timeout (device);
if (should_stop_dwell (device))
stop_dwell_timeout (device);
if (should_start_dwell (device))
start_dwell_position_timeout (device);
}
if (should_update_dwell_position (device))
update_dwell_position (device);
}
void
_clutter_input_pointer_a11y_on_button_event (ClutterInputDevice *device,
int button,
gboolean pressed)
{
if (!is_device_core_pointer (device))
return;
if (!_clutter_is_input_pointer_a11y_enabled (device))
return;
if (pressed)
{
device->ptr_a11y_data->n_btn_pressed++;
stop_dwell_position_timeout (device);
if (is_dwell_click_enabled (device))
stop_dwell_timeout (device);
if (is_dwell_dragging (device))
stop_dwell_timeout (device);
if (is_secondary_click_enabled (device))
{
if (button == CLUTTER_BUTTON_PRIMARY)
{
if (should_start_secondary_click_timeout (device))
start_secondary_click_timeout (device);
}
else if (is_secondary_click_pending (device))
{
stop_secondary_click_timeout (device);
}
}
}
else
{
if (has_button_pressed (device))
device->ptr_a11y_data->n_btn_pressed--;
if (is_secondary_click_triggered (device))
{
emit_button_click (device, CLUTTER_BUTTON_SECONDARY);
stop_secondary_click_timeout (device);
}
if (is_secondary_click_pending (device))
stop_secondary_click_timeout (device);
if (is_dwell_dragging (device))
emit_dwell_click (device, CLUTTER_A11Y_DWELL_CLICK_TYPE_DRAG);
}
}
gboolean
_clutter_is_input_pointer_a11y_enabled (ClutterInputDevice *device)
{
g_return_val_if_fail (CLUTTER_IS_INPUT_DEVICE (device), FALSE);
return (is_secondary_click_enabled (device) || is_dwell_click_enabled (device));
}

View File

@@ -37,6 +37,9 @@
* any object taking a reference on a #ClutterInterval instance should * any object taking a reference on a #ClutterInterval instance should
* also take ownership of the interval by using g_object_ref_sink(). * also take ownership of the interval by using g_object_ref_sink().
* *
* #ClutterInterval is used by #ClutterAnimation to define the
* interval of values that an implicit animation should tween over.
*
* #ClutterInterval can be subclassed to override the validation * #ClutterInterval can be subclassed to override the validation
* and value computation. * and value computation.
* *

View File

@@ -62,9 +62,3 @@ clutter_keymap_get_caps_lock_state (ClutterKeymap *keymap)
{ {
return CLUTTER_KEYMAP_GET_CLASS (keymap)->get_caps_lock_state (keymap); return CLUTTER_KEYMAP_GET_CLASS (keymap)->get_caps_lock_state (keymap);
} }
PangoDirection
clutter_keymap_get_direction (ClutterKeymap *keymap)
{
return CLUTTER_KEYMAP_GET_CLASS (keymap)->get_direction (keymap);
}

View File

@@ -29,7 +29,6 @@
#include <clutter/clutter-macros.h> #include <clutter/clutter-macros.h>
#include <glib-object.h> #include <glib-object.h>
#include <pango/pango.h>
typedef struct _ClutterKeymap ClutterKeymap; typedef struct _ClutterKeymap ClutterKeymap;
typedef struct _ClutterKeymapClass ClutterKeymapClass; typedef struct _ClutterKeymapClass ClutterKeymapClass;
@@ -40,7 +39,6 @@ struct _ClutterKeymapClass
gboolean (* get_num_lock_state) (ClutterKeymap *keymap); gboolean (* get_num_lock_state) (ClutterKeymap *keymap);
gboolean (* get_caps_lock_state) (ClutterKeymap *keymap); gboolean (* get_caps_lock_state) (ClutterKeymap *keymap);
PangoDirection (* get_direction) (ClutterKeymap *keymap);
}; };
#define CLUTTER_TYPE_KEYMAP (clutter_keymap_get_type ()) #define CLUTTER_TYPE_KEYMAP (clutter_keymap_get_type ())
@@ -55,6 +53,4 @@ gboolean clutter_keymap_get_num_lock_state (ClutterKeymap *keymap);
CLUTTER_EXPORT CLUTTER_EXPORT
gboolean clutter_keymap_get_caps_lock_state (ClutterKeymap *keymap); gboolean clutter_keymap_get_caps_lock_state (ClutterKeymap *keymap);
PangoDirection clutter_keymap_get_direction (ClutterKeymap *keymap);
#endif /* CLUTTER_KEYMAP_H */ #endif /* CLUTTER_KEYMAP_H */

View File

@@ -58,6 +58,10 @@ die "Could not open file keysymdef.h: $!\n"
die "Could not open file clutter-keysyms.h: $!\n" die "Could not open file clutter-keysyms.h: $!\n"
unless open(OUT_KEYSYMS, ">:utf8", "clutter-keysyms.h"); unless open(OUT_KEYSYMS, ">:utf8", "clutter-keysyms.h");
# Output: clutter/clutter/deprecated/clutter-keysyms.h
die "Could not open file clutter-keysyms-compat.h: $!\n"
unless open(OUT_KEYSYMS_COMPAT, ">:utf8", "deprecated/clutter-keysyms.h");
my $LICENSE_HEADER= <<EOF; my $LICENSE_HEADER= <<EOF;
/* Clutter /* Clutter
* *
@@ -81,6 +85,7 @@ my $LICENSE_HEADER= <<EOF;
EOF EOF
print OUT_KEYSYMS $LICENSE_HEADER; print OUT_KEYSYMS $LICENSE_HEADER;
print OUT_KEYSYMS_COMPAT $LICENSE_HEADER;
print OUT_KEYSYMS<<EOF; print OUT_KEYSYMS<<EOF;
@@ -99,6 +104,23 @@ print OUT_KEYSYMS<<EOF;
EOF EOF
print OUT_KEYSYMS_COMPAT<<EOF;
/*
* Compatibility version of clutter-keysyms.h.
*
* Since Clutter 1.4, the key symbol defines have been changed to have
* a KEY_ prefix. This is a compatibility header that is included when
* deprecated symbols are enabled. Consider porting to the new names
* instead.
*/
#ifndef __CLUTTER_KEYSYMS_DEPRECATED_H__
#define __CLUTTER_KEYSYMS_DEPRECATED_H__
#ifndef CLUTTER_DISABLE_DEPRECATED
EOF
while (<IN_KEYSYMDEF>) while (<IN_KEYSYMDEF>)
{ {
next if ( ! /^#define / ); next if ( ! /^#define / );
@@ -115,8 +137,13 @@ while (<IN_KEYSYMDEF>)
my $element = $keysymelements[1]; my $element = $keysymelements[1];
my $binding = $element; my $binding = $element;
$binding =~ s/^XK_/CLUTTER_KEY_/g; $binding =~ s/^XK_/CLUTTER_KEY_/g;
my $compat_binding = $element;
$compat_binding =~ s/^XK_/CLUTTER_/g;
my $deprecation = "CLUTTER_DEPRECATED_MACRO_FOR(\"Deprecated key symbol. Use $binding instead.\")";
printf OUT_KEYSYMS "#define %s 0x%03x\n", $binding, hex($keysymelements[2]); printf OUT_KEYSYMS "#define %s 0x%03x\n", $binding, hex($keysymelements[2]);
printf OUT_KEYSYMS_COMPAT "#define %s 0x%03x %s\n", $compat_binding, hex($keysymelements[2]), $deprecation;
} }
close IN_KEYSYMDEF; close IN_KEYSYMDEF;
@@ -160,8 +187,11 @@ while (<IN_XF86KEYSYM>)
my $element = $keysymelements[1]; my $element = $keysymelements[1];
my $binding = $element; my $binding = $element;
$binding =~ s/^XF86XK_/CLUTTER_KEY_/g; $binding =~ s/^XF86XK_/CLUTTER_KEY_/g;
my $compat_binding = $element;
$compat_binding =~ s/^XF86XK_/CLUTTER_/g;
printf OUT_KEYSYMS "#define %s 0x%03x\n", $binding, hex($keysymelements[2]); printf OUT_KEYSYMS "#define %s 0x%03x\n", $binding, hex($keysymelements[2]);
printf OUT_KEYSYMS_COMPAT "#define %s 0x%03x\n", $compat_binding, hex($keysymelements[2]);
} }
close IN_XF86KEYSYM; close IN_XF86KEYSYM;
@@ -172,6 +202,13 @@ print OUT_KEYSYMS<<EOF;
#endif /* __CLUTTER_KEYSYMS_H__ */ #endif /* __CLUTTER_KEYSYMS_H__ */
EOF EOF
print OUT_KEYSYMS_COMPAT<<EOF;
#endif /* CLUTTER_DISABLE_DEPRECATED */
#endif /* __CLUTTER_KEYSYMS_DEPRECATED_H__ */
EOF
foreach my $f (qw/ keysymdef.h XF86keysym.h /) { foreach my $f (qw/ keysymdef.h XF86keysym.h /) {
unlink $f or die "Unable to delete $f: $!"; unlink $f or die "Unable to delete $f: $!";
} }

View File

@@ -98,11 +98,11 @@
* |[ * |[
* { * {
* "type" : "ClutterBox", * "type" : "ClutterBox",
* "layout-manager" : { "type" : "ClutterGridLayout" }, * "layout-manager" : { "type" : "ClutterTableLayout" },
* "children" : [ * "children" : [
* { * {
* "type" : "ClutterText", * "type" : "ClutterTexture",
* "text" : "Some text", * "filename" : "image-00.png",
* *
* "layout::row" : 0, * "layout::row" : 0,
* "layout::column" : 0, * "layout::column" : 0,
@@ -112,8 +112,8 @@
* "layout::y-expand" : true * "layout::y-expand" : true
* }, * },
* { * {
* "type" : "ClutterText", * "type" : "ClutterTexture",
* "text" : "Some more text", * "filename" : "image-01.png",
* *
* "layout::row" : 0, * "layout::row" : 0,
* "layout::column" : 1, * "layout::column" : 1,
@@ -136,6 +136,7 @@
#define CLUTTER_DISABLE_DEPRECATION_WARNINGS #define CLUTTER_DISABLE_DEPRECATION_WARNINGS
#include "deprecated/clutter-container.h" #include "deprecated/clutter-container.h"
#include "deprecated/clutter-alpha.h"
#include "clutter-debug.h" #include "clutter-debug.h"
#include "clutter-layout-manager.h" #include "clutter-layout-manager.h"
@@ -163,6 +164,7 @@ G_DEFINE_ABSTRACT_TYPE (ClutterLayoutManager,
G_TYPE_INITIALLY_UNOWNED) G_TYPE_INITIALLY_UNOWNED)
static GQuark quark_layout_meta = 0; static GQuark quark_layout_meta = 0;
static GQuark quark_layout_alpha = 0;
static guint manager_signals[LAST_SIGNAL] = { 0, }; static guint manager_signals[LAST_SIGNAL] = { 0, };
@@ -253,7 +255,8 @@ layout_manager_real_get_preferred_height (ClutterLayoutManager *manager,
static void static void
layout_manager_real_allocate (ClutterLayoutManager *manager, layout_manager_real_allocate (ClutterLayoutManager *manager,
ClutterContainer *container, ClutterContainer *container,
const ClutterActorBox *allocation) const ClutterActorBox *allocation,
ClutterAllocationFlags flags)
{ {
LAYOUT_MANAGER_WARN_NOT_IMPLEMENTED (manager, "allocate"); LAYOUT_MANAGER_WARN_NOT_IMPLEMENTED (manager, "allocate");
} }
@@ -298,12 +301,102 @@ layout_manager_real_get_child_meta_type (ClutterLayoutManager *manager)
return G_TYPE_INVALID; return G_TYPE_INVALID;
} }
/* XXX:2.0 - Remove */
static ClutterAlpha *
layout_manager_real_begin_animation (ClutterLayoutManager *manager,
guint duration,
gulong mode)
{
ClutterTimeline *timeline;
ClutterAlpha *alpha;
alpha = g_object_get_qdata (G_OBJECT (manager), quark_layout_alpha);
if (alpha != NULL)
{
clutter_alpha_set_mode (alpha, mode);
timeline = clutter_alpha_get_timeline (alpha);
clutter_timeline_set_duration (timeline, duration);
clutter_timeline_rewind (timeline);
return alpha;
};
timeline = clutter_timeline_new (duration);
alpha = clutter_alpha_new_full (timeline, mode);
/* let the alpha take ownership of the timeline */
g_object_unref (timeline);
g_signal_connect_swapped (timeline, "completed",
G_CALLBACK (clutter_layout_manager_end_animation),
manager);
g_signal_connect_swapped (timeline, "new-frame",
G_CALLBACK (clutter_layout_manager_layout_changed),
manager);
g_object_set_qdata_full (G_OBJECT (manager),
quark_layout_alpha, alpha,
(GDestroyNotify) g_object_unref);
clutter_timeline_start (timeline);
return alpha;
}
/* XXX:2.0 - Remove */
static gdouble
layout_manager_real_get_animation_progress (ClutterLayoutManager *manager)
{
ClutterAlpha *alpha;
alpha = g_object_get_qdata (G_OBJECT (manager), quark_layout_alpha);
if (alpha == NULL)
return 1.0;
return clutter_alpha_get_alpha (alpha);
}
/* XXX:2.0 - Remove */
static void
layout_manager_real_end_animation (ClutterLayoutManager *manager)
{
ClutterTimeline *timeline;
ClutterAlpha *alpha;
alpha = g_object_get_qdata (G_OBJECT (manager), quark_layout_alpha);
if (alpha == NULL)
return;
timeline = clutter_alpha_get_timeline (alpha);
g_assert (timeline != NULL);
if (clutter_timeline_is_playing (timeline))
clutter_timeline_stop (timeline);
g_signal_handlers_disconnect_by_func (timeline,
G_CALLBACK (clutter_layout_manager_end_animation),
manager);
g_signal_handlers_disconnect_by_func (timeline,
G_CALLBACK (clutter_layout_manager_layout_changed),
manager);
g_object_set_qdata (G_OBJECT (manager), quark_layout_alpha, NULL);
clutter_layout_manager_layout_changed (manager);
}
static void static void
clutter_layout_manager_class_init (ClutterLayoutManagerClass *klass) clutter_layout_manager_class_init (ClutterLayoutManagerClass *klass)
{ {
quark_layout_meta = quark_layout_meta =
g_quark_from_static_string ("clutter-layout-manager-child-meta"); g_quark_from_static_string ("clutter-layout-manager-child-meta");
/* XXX:2.0 - Remove */
quark_layout_alpha =
g_quark_from_static_string ("clutter-layout-manager-alpha");
klass->get_preferred_width = layout_manager_real_get_preferred_width; klass->get_preferred_width = layout_manager_real_get_preferred_width;
klass->get_preferred_height = layout_manager_real_get_preferred_height; klass->get_preferred_height = layout_manager_real_get_preferred_height;
klass->allocate = layout_manager_real_allocate; klass->allocate = layout_manager_real_allocate;
@@ -311,6 +404,9 @@ clutter_layout_manager_class_init (ClutterLayoutManagerClass *klass)
klass->get_child_meta_type = layout_manager_real_get_child_meta_type; klass->get_child_meta_type = layout_manager_real_get_child_meta_type;
/* XXX:2.0 - Remove */ /* XXX:2.0 - Remove */
klass->begin_animation = layout_manager_real_begin_animation;
klass->get_animation_progress = layout_manager_real_get_animation_progress;
klass->end_animation = layout_manager_real_end_animation;
klass->set_container = layout_manager_real_set_container; klass->set_container = layout_manager_real_set_container;
/** /**
@@ -348,7 +444,8 @@ clutter_layout_manager_class_init (ClutterLayoutManagerClass *klass)
G_SIGNAL_RUN_LAST, G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (ClutterLayoutManagerClass, G_STRUCT_OFFSET (ClutterLayoutManagerClass,
layout_changed), layout_changed),
NULL, NULL, NULL, NULL, NULL,
_clutter_marshal_VOID__VOID,
G_TYPE_NONE, 0); G_TYPE_NONE, 0);
} }
@@ -433,6 +530,7 @@ clutter_layout_manager_get_preferred_height (ClutterLayoutManager *manager,
* @container: the #ClutterContainer using @manager * @container: the #ClutterContainer using @manager
* @allocation: the #ClutterActorBox containing the allocated area * @allocation: the #ClutterActorBox containing the allocated area
* of @container * of @container
* @flags: the allocation flags
* *
* Allocates the children of @container given an area * Allocates the children of @container given an area
* *
@@ -443,7 +541,8 @@ clutter_layout_manager_get_preferred_height (ClutterLayoutManager *manager,
void void
clutter_layout_manager_allocate (ClutterLayoutManager *manager, clutter_layout_manager_allocate (ClutterLayoutManager *manager,
ClutterContainer *container, ClutterContainer *container,
const ClutterActorBox *allocation) const ClutterActorBox *allocation,
ClutterAllocationFlags flags)
{ {
ClutterLayoutManagerClass *klass; ClutterLayoutManagerClass *klass;
@@ -452,7 +551,7 @@ clutter_layout_manager_allocate (ClutterLayoutManager *manager,
g_return_if_fail (allocation != NULL); g_return_if_fail (allocation != NULL);
klass = CLUTTER_LAYOUT_MANAGER_GET_CLASS (manager); klass = CLUTTER_LAYOUT_MANAGER_GET_CLASS (manager);
klass->allocate (manager, container, allocation); klass->allocate (manager, container, allocation, flags);
} }
/** /**

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