Compare commits
	
		
			1 Commits
		
	
	
		
			wip/cherge
			...
			wip/fmuell
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					9622733140 | 
@@ -1,4 +1,4 @@
 | 
			
		||||
image: registry.gitlab.gnome.org/gnome/mutter/master:v3
 | 
			
		||||
image: registry.gitlab.gnome.org/gnome/mutter/master:v1
 | 
			
		||||
 | 
			
		||||
stages:
 | 
			
		||||
 - review
 | 
			
		||||
@@ -7,8 +7,6 @@ stages:
 | 
			
		||||
 | 
			
		||||
check-commit-log:
 | 
			
		||||
  stage: review
 | 
			
		||||
  variables:
 | 
			
		||||
    GIT_DEPTH: "100"
 | 
			
		||||
  script:
 | 
			
		||||
    - ./.gitlab-ci/check-commit-log.sh
 | 
			
		||||
  only:
 | 
			
		||||
@@ -17,21 +15,7 @@ check-commit-log:
 | 
			
		||||
build-mutter:
 | 
			
		||||
  stage: build
 | 
			
		||||
  script:
 | 
			
		||||
    - meson . build -Dbuildtype=debugoptimized -Degl_device=true -Dwayland_eglstream=true --werror --prefix /usr
 | 
			
		||||
    - ninja -C build
 | 
			
		||||
    - ninja -C build install
 | 
			
		||||
  artifacts:
 | 
			
		||||
    expire_in: 1 day
 | 
			
		||||
    paths:
 | 
			
		||||
      - build
 | 
			
		||||
  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
 | 
			
		||||
    - meson . build -Dbuildtype=debugoptimized -Degl_device=true -Dwayland_eglstream=true --werror
 | 
			
		||||
    - ninja -C build
 | 
			
		||||
    - ninja -C build install
 | 
			
		||||
  artifacts:
 | 
			
		||||
@@ -49,31 +33,12 @@ test-mutter:
 | 
			
		||||
  variables:
 | 
			
		||||
    XDG_RUNTIME_DIR: "$CI_PROJECT_DIR/runtime-dir"
 | 
			
		||||
    GSETTINGS_SCHEMA_DIR: "$CI_PROJECT_DIR/build/data"
 | 
			
		||||
    G_SLICE: "always-malloc"
 | 
			
		||||
    MALLOC_CHECK_: "3"
 | 
			
		||||
    NO_AT_BRIDGE: "1"
 | 
			
		||||
    MALLOC_PERTURB_: "123"
 | 
			
		||||
  script:
 | 
			
		||||
    - dconf update
 | 
			
		||||
    - mkdir -m 700 $XDG_RUNTIME_DIR
 | 
			
		||||
    - glib-compile-schemas $GSETTINGS_SCHEMA_DIR
 | 
			
		||||
    - >
 | 
			
		||||
      dbus-run-session -- xvfb-run -s '+iglx -noreset'
 | 
			
		||||
      meson test -C build --no-rebuild -t 10 --verbose --no-stdsplit --print-errorlogs --wrap catchsegv
 | 
			
		||||
  only:
 | 
			
		||||
    - merge_requests
 | 
			
		||||
    - /^.*$/
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
      meson test -C build --no-rebuild -t 10 --verbose --no-stdsplit --wrap catchsegv
 | 
			
		||||
  only:
 | 
			
		||||
    - merge_requests
 | 
			
		||||
    - /^.*$/
 | 
			
		||||
 
 | 
			
		||||
@@ -1,32 +1,17 @@
 | 
			
		||||
# Rebuild and push with
 | 
			
		||||
#
 | 
			
		||||
#     cd .gitlab-ci/
 | 
			
		||||
#     podman build --format docker --no-cache -t registry.gitlab.gnome.org/gnome/mutter/master:v3 .
 | 
			
		||||
#     podman push registry.gitlab.gnome.org/gnome/mutter/master:v3
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
FROM fedora:31
 | 
			
		||||
FROM fedora:29
 | 
			
		||||
 | 
			
		||||
RUN dnf -y update && dnf -y upgrade && \
 | 
			
		||||
    dnf install -y 'dnf-command(builddep)' && \
 | 
			
		||||
    dnf install -y 'dnf-command(copr)' && \
 | 
			
		||||
    dnf copr enable -y fmuellner/gnome-shell-ci && \
 | 
			
		||||
    dnf copr enable -y jadahl/mutter-ci && \
 | 
			
		||||
    dnf -y update && dnf -y upgrade && \
 | 
			
		||||
 | 
			
		||||
    dnf builddep -y mutter && \
 | 
			
		||||
 | 
			
		||||
    # Until Fedora catches up with new build-deps
 | 
			
		||||
    dnf install -y 'pkgconfig(graphene-gobject-1.0)' 'pkgconfig(sysprof-capture-3)' && \
 | 
			
		||||
    # 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
 | 
			
		||||
    dnf install -y xorg-x11-server-Xvfb mesa-dri-drivers dbus dbus-x11 '*/xvfb-run' gdm-lib accountsservice-libs gnome-control-center && \
 | 
			
		||||
    dnf install -y xorg-x11-server-Xvfb mesa-dri-drivers dbus dbus-x11 && \
 | 
			
		||||
 | 
			
		||||
    # GNOME Shell
 | 
			
		||||
    dnf builddep -y gnome-shell --setopt=install_weak_deps=False && \
 | 
			
		||||
    dnf remove -y gnome-bluetooth-libs-devel dbus-glib-devel upower-devel python3-devel && \
 | 
			
		||||
    dnf remove -y --noautoremove mutter mutter-devel && \
 | 
			
		||||
 | 
			
		||||
    dnf upgrade -y 'pkgconfig(libpipewire-0.3)' && \
 | 
			
		||||
    # Unpackaged versions
 | 
			
		||||
    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 install -y intltool redhat-rpm-config make && \
 | 
			
		||||
    dnf clean all
 | 
			
		||||
 
 | 
			
		||||
@@ -23,38 +23,9 @@ function commit_message_has_url() {
 | 
			
		||||
  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
 | 
			
		||||
  commit_short=$(echo $commit | cut -c -8)
 | 
			
		||||
 | 
			
		||||
  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
 | 
			
		||||
  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
 | 
			
		||||
 | 
			
		||||
exit $RET
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
@@ -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"
 | 
			
		||||
@@ -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"
 | 
			
		||||
							
								
								
									
										414
									
								
								NEWS
									
									
									
									
									
								
							
							
						
						
									
										414
									
								
								NEWS
									
									
									
									
									
								
							@@ -1,417 +1,3 @@
 | 
			
		||||
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
 | 
			
		||||
=======
 | 
			
		||||
* Fix infinite loop in EDID matching [Marco; #459]
 | 
			
		||||
 
 | 
			
		||||
@@ -310,7 +310,11 @@ cally_actor_finalize (GObject *obj)
 | 
			
		||||
 | 
			
		||||
  _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)
 | 
			
		||||
    {
 | 
			
		||||
@@ -600,11 +604,10 @@ cally_actor_real_remove_actor (ClutterActor *container,
 | 
			
		||||
  g_return_val_if_fail (CLUTTER_IS_ACTOR (actor), 0);
 | 
			
		||||
 | 
			
		||||
  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_set_pointer (&values.old_value, atk_parent);
 | 
			
		||||
 | 
			
		||||
@@ -654,7 +657,7 @@ cally_actor_get_extents (AtkComponent *component,
 | 
			
		||||
  ClutterActor *actor      = NULL;
 | 
			
		||||
  gint          top_level_x, top_level_y;
 | 
			
		||||
  gfloat        f_width, f_height;
 | 
			
		||||
  graphene_point3d_t verts[4];
 | 
			
		||||
  ClutterVertex verts[4];
 | 
			
		||||
  ClutterActor  *stage = NULL;
 | 
			
		||||
 | 
			
		||||
  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
 | 
			
		||||
 * 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
 | 
			
		||||
_cally_actor_get_top_level_origin (ClutterActor *actor,
 | 
			
		||||
@@ -742,11 +749,54 @@ _cally_actor_get_top_level_origin (ClutterActor *actor,
 | 
			
		||||
                                   gint         *yp)
 | 
			
		||||
{
 | 
			
		||||
  /* 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)
 | 
			
		||||
    *xp = 0;
 | 
			
		||||
    *xp = x;
 | 
			
		||||
 | 
			
		||||
  if (yp)
 | 
			
		||||
    *yp = 0;
 | 
			
		||||
    *yp = y;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* AtkAction implementation */
 | 
			
		||||
@@ -994,8 +1044,10 @@ _cally_actor_clean_action_list (CallyActor *cally_actor)
 | 
			
		||||
 | 
			
		||||
  if (priv->action_list)
 | 
			
		||||
    {
 | 
			
		||||
      g_list_free_full (priv->action_list,
 | 
			
		||||
                        (GDestroyNotify) _cally_actor_destroy_action_info);
 | 
			
		||||
      g_list_foreach (priv->action_list,
 | 
			
		||||
                      (GFunc) _cally_actor_destroy_action_info,
 | 
			
		||||
                      NULL);
 | 
			
		||||
      g_list_free (priv->action_list);
 | 
			
		||||
      priv->action_list = NULL;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -75,8 +75,8 @@ struct _CallyRootPrivate
 | 
			
		||||
  GSList *stage_list;
 | 
			
		||||
 | 
			
		||||
  /* signals id */
 | 
			
		||||
  gulong stage_added_id;
 | 
			
		||||
  gulong stage_removed_id;
 | 
			
		||||
  guint stage_added_id;
 | 
			
		||||
  guint stage_removed_id;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
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));
 | 
			
		||||
 | 
			
		||||
  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);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -247,7 +247,11 @@ cally_text_finalize   (GObject *obj)
 | 
			
		||||
/*   g_object_unref (cally_text->priv->textutil); */
 | 
			
		||||
/*   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);
 | 
			
		||||
}
 | 
			
		||||
@@ -1434,7 +1438,7 @@ static void cally_text_get_character_extents (AtkText *text,
 | 
			
		||||
  PangoLayout *layout;
 | 
			
		||||
  PangoRectangle extents;
 | 
			
		||||
  const gchar *text_value;
 | 
			
		||||
  graphene_point3d_t verts[4];
 | 
			
		||||
  ClutterVertex verts[4];
 | 
			
		||||
 | 
			
		||||
  actor = CALLY_GET_CLUTTER_ACTOR (text);
 | 
			
		||||
  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 x_temp, y_temp;
 | 
			
		||||
  gboolean ret;
 | 
			
		||||
  graphene_point3d_t verts[4];
 | 
			
		||||
  ClutterVertex verts[4];
 | 
			
		||||
  PangoLayout *layout;
 | 
			
		||||
  gint x_layout, y_layout;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										98
									
								
								clutter/clutter/cally/cally-texture.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										98
									
								
								clutter/clutter/cally/cally-texture.c
									
									
									
									
									
										Normal 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;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										84
									
								
								clutter/clutter/cally/cally-texture.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										84
									
								
								clutter/clutter/cally/cally-texture.h
									
									
									
									
									
										Normal 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__ */
 | 
			
		||||
@@ -39,6 +39,7 @@
 | 
			
		||||
#include "cally-group.h"
 | 
			
		||||
#include "cally-stage.h"
 | 
			
		||||
#include "cally-text.h"
 | 
			
		||||
#include "cally-texture.h"
 | 
			
		||||
#include "cally-rectangle.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_STAGE, cally_stage, cally_stage_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_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_STAGE, cally_stage);
 | 
			
		||||
  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_CLONE, cally_clone);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -32,6 +32,7 @@
 | 
			
		||||
#include "cally-root.h"
 | 
			
		||||
#include "cally-stage.h"
 | 
			
		||||
#include "cally-text.h"
 | 
			
		||||
#include "cally-texture.h"
 | 
			
		||||
#include "cally-util.h"
 | 
			
		||||
 | 
			
		||||
#undef __CALLY_H_INSIDE__
 | 
			
		||||
 
 | 
			
		||||
@@ -340,7 +340,7 @@ clutter_actor_box_contains (const ClutterActorBox *box,
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_actor_box_from_vertices:
 | 
			
		||||
 * @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
 | 
			
		||||
 * 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
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
clutter_actor_box_from_vertices (ClutterActorBox          *box,
 | 
			
		||||
                                 const graphene_point3d_t  verts[])
 | 
			
		||||
clutter_actor_box_from_vertices (ClutterActorBox     *box,
 | 
			
		||||
                                 const ClutterVertex  verts[])
 | 
			
		||||
{
 | 
			
		||||
  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;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 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,
 | 
			
		||||
                               clutter_actor_box_copy,
 | 
			
		||||
                               clutter_actor_box_free,
 | 
			
		||||
 
 | 
			
		||||
@@ -51,7 +51,7 @@
 | 
			
		||||
struct _ClutterActorMetaPrivate
 | 
			
		||||
{
 | 
			
		||||
  ClutterActor *actor;
 | 
			
		||||
  gulong destroy_id;
 | 
			
		||||
  guint destroy_id;
 | 
			
		||||
 | 
			
		||||
  gchar *name;
 | 
			
		||||
 | 
			
		||||
@@ -91,7 +91,11 @@ clutter_actor_meta_real_set_actor (ClutterActorMeta *meta,
 | 
			
		||||
  if (meta->priv->actor == actor)
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  g_clear_signal_handler (&meta->priv->destroy_id, meta->priv->actor);
 | 
			
		||||
  if (meta->priv->destroy_id != 0)
 | 
			
		||||
    {
 | 
			
		||||
      g_signal_handler_disconnect (meta->priv->actor, meta->priv->destroy_id);
 | 
			
		||||
      meta->priv->destroy_id = 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  meta->priv->actor = actor;
 | 
			
		||||
 | 
			
		||||
@@ -158,8 +162,8 @@ clutter_actor_meta_finalize (GObject *gobject)
 | 
			
		||||
{
 | 
			
		||||
  ClutterActorMetaPrivate *priv = CLUTTER_ACTOR_META (gobject)->priv;
 | 
			
		||||
 | 
			
		||||
  if (priv->actor != NULL)
 | 
			
		||||
    g_clear_signal_handler (&priv->destroy_id, priv->actor);
 | 
			
		||||
  if (priv->destroy_id != 0 && priv->actor != NULL)
 | 
			
		||||
    g_signal_handler_disconnect (priv->actor, priv->destroy_id);
 | 
			
		||||
 | 
			
		||||
  g_free (priv->name);
 | 
			
		||||
 | 
			
		||||
@@ -573,7 +577,8 @@ _clutter_meta_group_clear_metas (ClutterMetaGroup *group)
 | 
			
		||||
{
 | 
			
		||||
  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;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -53,8 +53,7 @@ typedef enum
 | 
			
		||||
 * Controls some options for how clutter_actor_traverse() iterates
 | 
			
		||||
 * through the graph.
 | 
			
		||||
 */
 | 
			
		||||
typedef enum
 | 
			
		||||
{
 | 
			
		||||
typedef enum {
 | 
			
		||||
  CLUTTER_ACTOR_TRAVERSE_DEPTH_FIRST   = 1L<<0,
 | 
			
		||||
  CLUTTER_ACTOR_TRAVERSE_BREADTH_FIRST = 1L<<1
 | 
			
		||||
} ClutterActorTraverseFlags;
 | 
			
		||||
@@ -75,8 +74,7 @@ typedef enum
 | 
			
		||||
 * the continuing traversal. It may stop traversal completely, just
 | 
			
		||||
 * 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_SKIP_CHILDREN  = 1L<<1,
 | 
			
		||||
  CLUTTER_ACTOR_TRAVERSE_VISIT_BREAK          = 1L<<2
 | 
			
		||||
@@ -135,7 +133,7 @@ struct _AnchorCoord
 | 
			
		||||
    } fraction;
 | 
			
		||||
 | 
			
		||||
    /* Use when is_fractional == FALSE */
 | 
			
		||||
    graphene_point3d_t units;
 | 
			
		||||
    ClutterVertex units;
 | 
			
		||||
  } v;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@@ -163,7 +161,7 @@ struct _SizeRequest
 | 
			
		||||
struct _ClutterLayoutInfo
 | 
			
		||||
{
 | 
			
		||||
  /* fixed position coordinates */
 | 
			
		||||
  graphene_point_t fixed_pos;
 | 
			
		||||
  ClutterPoint fixed_pos;
 | 
			
		||||
 | 
			
		||||
  ClutterMargin margin;
 | 
			
		||||
 | 
			
		||||
@@ -173,8 +171,8 @@ struct _ClutterLayoutInfo
 | 
			
		||||
  guint x_expand : 1;
 | 
			
		||||
  guint y_expand : 1;
 | 
			
		||||
 | 
			
		||||
  graphene_size_t minimum;
 | 
			
		||||
  graphene_size_t natural;
 | 
			
		||||
  ClutterSize minimum;
 | 
			
		||||
  ClutterSize natural;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const ClutterLayoutInfo *       _clutter_actor_get_layout_info_or_defaults      (ClutterActor *self);
 | 
			
		||||
@@ -203,13 +201,13 @@ struct _ClutterTransformInfo
 | 
			
		||||
  AnchorCoord anchor;
 | 
			
		||||
 | 
			
		||||
  /* translation */
 | 
			
		||||
  graphene_point3d_t translation;
 | 
			
		||||
  ClutterVertex translation;
 | 
			
		||||
 | 
			
		||||
  /* z_position */
 | 
			
		||||
  gfloat z_position;
 | 
			
		||||
 | 
			
		||||
  /* transformation center */
 | 
			
		||||
  graphene_point_t pivot;
 | 
			
		||||
  ClutterPoint pivot;
 | 
			
		||||
  gfloat pivot_z;
 | 
			
		||||
 | 
			
		||||
  CoglMatrix transform;
 | 
			
		||||
@@ -242,6 +240,9 @@ ClutterAnimationInfo *          _clutter_actor_get_animation_info
 | 
			
		||||
ClutterTransition *             _clutter_actor_create_transition                        (ClutterActor *self,
 | 
			
		||||
                                                                                         GParamSpec   *pspec,
 | 
			
		||||
                                                                                         ...);
 | 
			
		||||
ClutterTransition *             _clutter_actor_get_transition                           (ClutterActor *self,
 | 
			
		||||
                                                                                         GParamSpec   *pspec);
 | 
			
		||||
 | 
			
		||||
gboolean                        _clutter_actor_foreach_child                            (ClutterActor *self,
 | 
			
		||||
                                                                                         ClutterForeachCallback callback,
 | 
			
		||||
                                                                                         gpointer user_data);
 | 
			
		||||
@@ -274,9 +275,6 @@ void                            _clutter_actor_set_enable_paint_unmapped
 | 
			
		||||
void                            _clutter_actor_set_has_pointer                          (ClutterActor *self,
 | 
			
		||||
                                                                                         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,
 | 
			
		||||
                                                                                         ClutterRedrawFlags        flags,
 | 
			
		||||
                                                                                         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_pop_clone_paint                          (void);
 | 
			
		||||
 | 
			
		||||
guint32                         _clutter_actor_get_pick_id                              (ClutterActor *self);
 | 
			
		||||
 | 
			
		||||
void                            _clutter_actor_shader_pre_paint                         (ClutterActor *actor,
 | 
			
		||||
                                                                                         gboolean      repeat);
 | 
			
		||||
void                            _clutter_actor_shader_post_paint                        (ClutterActor *actor);
 | 
			
		||||
@@ -313,10 +313,8 @@ void                            _clutter_actor_detach_clone
 | 
			
		||||
void                            _clutter_actor_queue_redraw_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_update_resource_scale_recursive    (ClutterActor *actor);
 | 
			
		||||
 | 
			
		||||
gboolean                        _clutter_actor_get_real_resource_scale                  (ClutterActor *actor,
 | 
			
		||||
                                                                                         float        *resource_scale);
 | 
			
		||||
CoglFramebuffer *               _clutter_actor_get_active_framebuffer                   (ClutterActor *actor);
 | 
			
		||||
 | 
			
		||||
ClutterPaintNode *              clutter_actor_create_texture_paint_node                 (ClutterActor *self,
 | 
			
		||||
                                                                                         CoglTexture  *texture);
 | 
			
		||||
 
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -39,8 +39,6 @@
 | 
			
		||||
 | 
			
		||||
#include <clutter/clutter-types.h>
 | 
			
		||||
#include <clutter/clutter-event.h>
 | 
			
		||||
#include <clutter/clutter-paint-context.h>
 | 
			
		||||
#include <clutter/clutter-pick-context.h>
 | 
			
		||||
 | 
			
		||||
G_BEGIN_DECLS
 | 
			
		||||
 | 
			
		||||
@@ -230,14 +228,13 @@ struct _ClutterActorClass
 | 
			
		||||
  void (* unrealize)            (ClutterActor          *self);
 | 
			
		||||
  void (* map)                  (ClutterActor          *self);
 | 
			
		||||
  void (* unmap)                (ClutterActor          *self);
 | 
			
		||||
  void (* paint)                (ClutterActor          *self,
 | 
			
		||||
                                 ClutterPaintContext   *paint_context);
 | 
			
		||||
  void (* paint)                (ClutterActor          *self);
 | 
			
		||||
  void (* parent_set)           (ClutterActor          *actor,
 | 
			
		||||
                                 ClutterActor          *old_parent);
 | 
			
		||||
 | 
			
		||||
  void (* destroy)              (ClutterActor          *self);
 | 
			
		||||
  void (* pick)                 (ClutterActor          *actor,
 | 
			
		||||
                                 ClutterPickContext    *pick_context);
 | 
			
		||||
                                 const ClutterColor    *color);
 | 
			
		||||
 | 
			
		||||
  gboolean (* queue_redraw)     (ClutterActor          *actor,
 | 
			
		||||
                                 ClutterActor          *leaf_that_queued,
 | 
			
		||||
@@ -299,11 +296,10 @@ struct _ClutterActorClass
 | 
			
		||||
 | 
			
		||||
  gboolean (* touch_event)          (ClutterActor         *self,
 | 
			
		||||
                                     ClutterTouchEvent    *event);
 | 
			
		||||
  gboolean (* has_accessible)       (ClutterActor         *self);
 | 
			
		||||
 | 
			
		||||
  /*< private >*/
 | 
			
		||||
  /* padding for future expansion */
 | 
			
		||||
  gpointer _padding_dummy[25];
 | 
			
		||||
  gpointer _padding_dummy[26];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -354,17 +350,9 @@ void                            clutter_actor_map
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void                            clutter_actor_unmap                             (ClutterActor                *self);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void                            clutter_actor_paint                             (ClutterActor                *self,
 | 
			
		||||
                                                                                 ClutterPaintContext         *paint_context);
 | 
			
		||||
void                            clutter_actor_paint                             (ClutterActor                *self);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
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);
 | 
			
		||||
void                            clutter_actor_continue_paint                    (ClutterActor                *self);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void                            clutter_actor_queue_redraw                      (ClutterActor                *self);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
@@ -381,8 +369,6 @@ CLUTTER_EXPORT
 | 
			
		||||
const gchar *                   clutter_actor_get_name                          (ClutterActor                *self);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
AtkObject *                     clutter_actor_get_accessible                    (ClutterActor                *self);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
gboolean                        clutter_actor_has_accessible                    (ClutterActor                *self);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
gboolean                        clutter_actor_is_visible                        (ClutterActor                *self);
 | 
			
		||||
@@ -445,7 +431,7 @@ void                            clutter_actor_get_allocation_box
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void                            clutter_actor_get_allocation_vertices           (ClutterActor                *self,
 | 
			
		||||
                                                                                 ClutterActor                *ancestor,
 | 
			
		||||
                                                                                 graphene_point3d_t          *verts);
 | 
			
		||||
                                                                                 ClutterVertex                verts[]);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
gboolean                        clutter_actor_has_allocation                    (ClutterActor                *self);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
@@ -598,11 +584,6 @@ gboolean                        clutter_actor_is_in_clone_paint
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
gboolean                        clutter_actor_get_paint_box                     (ClutterActor               *self,
 | 
			
		||||
                                                                                 ClutterActorBox            *box);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
gboolean                        clutter_actor_get_resource_scale                (ClutterActor *self,
 | 
			
		||||
                                                                                 gfloat       *resource_scale);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
gboolean                        clutter_actor_has_overlaps                      (ClutterActor               *self);
 | 
			
		||||
 | 
			
		||||
@@ -831,16 +812,16 @@ gboolean                        clutter_actor_transform_stage_point
 | 
			
		||||
                                                                                 gfloat                     *y_out);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void                            clutter_actor_get_abs_allocation_vertices       (ClutterActor               *self,
 | 
			
		||||
                                                                                 graphene_point3d_t         *verts);
 | 
			
		||||
                                                                                 ClutterVertex               verts[]);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void                            clutter_actor_apply_transform_to_point          (ClutterActor               *self,
 | 
			
		||||
                                                                                 const graphene_point3d_t   *point,
 | 
			
		||||
                                                                                 graphene_point3d_t         *vertex);
 | 
			
		||||
                                                                                 const ClutterVertex        *point,
 | 
			
		||||
                                                                                 ClutterVertex              *vertex);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void                            clutter_actor_apply_relative_transform_to_point (ClutterActor               *self,
 | 
			
		||||
                                                                                 ClutterActor               *ancestor,
 | 
			
		||||
                                                                                 const graphene_point3d_t   *point,
 | 
			
		||||
                                                                                 graphene_point3d_t         *vertex);
 | 
			
		||||
                                                                                 const ClutterVertex        *point,
 | 
			
		||||
                                                                                 ClutterVertex              *vertex);
 | 
			
		||||
 | 
			
		||||
/* Implicit animations */
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
@@ -916,11 +897,6 @@ void                            clutter_actor_bind_model_with_properties
 | 
			
		||||
                                                                                 const char                 *first_model_property,
 | 
			
		||||
                                                                                 ...);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void clutter_actor_pick_box (ClutterActor          *self,
 | 
			
		||||
                             ClutterPickContext    *pick_context,
 | 
			
		||||
                             const ClutterActorBox *box);
 | 
			
		||||
 | 
			
		||||
G_END_DECLS
 | 
			
		||||
 | 
			
		||||
#endif /* __CLUTTER_ACTOR_H__ */
 | 
			
		||||
 
 | 
			
		||||
@@ -54,6 +54,7 @@
 | 
			
		||||
#include "clutter-debug.h"
 | 
			
		||||
#include "clutter-private.h"
 | 
			
		||||
 | 
			
		||||
#include "deprecated/clutter-animatable.h"
 | 
			
		||||
#include "deprecated/clutter-animation.h"
 | 
			
		||||
 | 
			
		||||
G_DEFINE_INTERFACE (ClutterAnimatable, clutter_animatable, G_TYPE_OBJECT);
 | 
			
		||||
@@ -63,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:
 | 
			
		||||
 * @animatable: a #ClutterAnimatable
 | 
			
		||||
 
 | 
			
		||||
@@ -50,6 +50,7 @@ G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterConstraint, 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 (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)
 | 
			
		||||
@@ -90,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 (ClutterMargin, clutter_margin_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 (ClutterPaintVolume, clutter_paint_volume_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__ */
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -23,9 +23,12 @@
 | 
			
		||||
#define __CLUTTER_BACKEND_PRIVATE_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-event-translator.h"
 | 
			
		||||
 | 
			
		||||
#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_BACKEND_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), CLUTTER_TYPE_BACKEND, ClutterBackendClass))
 | 
			
		||||
@@ -46,6 +49,8 @@ struct _ClutterBackend
 | 
			
		||||
 | 
			
		||||
  CoglOnscreen *dummy_onscreen;
 | 
			
		||||
 | 
			
		||||
  ClutterDeviceManager *device_manager;
 | 
			
		||||
 | 
			
		||||
  cairo_font_options_t *font_options;
 | 
			
		||||
 | 
			
		||||
  gchar *font_name;
 | 
			
		||||
@@ -53,9 +58,11 @@ struct _ClutterBackend
 | 
			
		||||
  gfloat units_per_em;
 | 
			
		||||
  gint32 units_serial;
 | 
			
		||||
 | 
			
		||||
  ClutterStageWindow *stage_window;
 | 
			
		||||
  GList *event_translators;
 | 
			
		||||
 | 
			
		||||
  ClutterInputMethod *input_method;
 | 
			
		||||
 | 
			
		||||
  ClutterKeymap *keymap;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct _ClutterBackendClass
 | 
			
		||||
@@ -84,12 +91,23 @@ struct _ClutterBackendClass
 | 
			
		||||
                                                GError         **error);
 | 
			
		||||
  gboolean              (* create_context)     (ClutterBackend  *backend,
 | 
			
		||||
                                                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,
 | 
			
		||||
                                                gpointer            native,
 | 
			
		||||
                                                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 */
 | 
			
		||||
  void (* resolution_changed) (ClutterBackend *backend);
 | 
			
		||||
@@ -118,21 +136,31 @@ void                    _clutter_backend_copy_event_data                (Clutter
 | 
			
		||||
                                                                         ClutterEvent           *dest);
 | 
			
		||||
void                    _clutter_backend_free_event_data                (ClutterBackend         *backend,
 | 
			
		||||
                                                                         ClutterEvent           *event);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
gboolean                _clutter_backend_translate_event                (ClutterBackend         *backend,
 | 
			
		||||
                                                                         gpointer                native,
 | 
			
		||||
                                                                         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);
 | 
			
		||||
 | 
			
		||||
gfloat                  _clutter_backend_get_units_per_em               (ClutterBackend         *backend,
 | 
			
		||||
                                                                         PangoFontDescription   *font_desc);
 | 
			
		||||
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
 | 
			
		||||
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
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -51,6 +51,7 @@
 | 
			
		||||
#include "clutter-stage-manager-private.h"
 | 
			
		||||
#include "clutter-stage-private.h"
 | 
			
		||||
#include "clutter-stage-window.h"
 | 
			
		||||
#include "clutter-device-manager-private.h"
 | 
			
		||||
 | 
			
		||||
#ifdef CLUTTER_HAS_WAYLAND_COMPOSITOR_SUPPORT
 | 
			
		||||
#include "wayland/clutter-wayland-compositor.h"
 | 
			
		||||
@@ -61,6 +62,9 @@
 | 
			
		||||
#ifdef CLUTTER_INPUT_X11
 | 
			
		||||
#include "x11/clutter-backend-x11.h"
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef CLUTTER_INPUT_EVDEV
 | 
			
		||||
#include "evdev/clutter-device-manager-evdev.h"
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef CLUTTER_WINDOWING_EGL
 | 
			
		||||
#include "egl/clutter-backend-eglnative.h"
 | 
			
		||||
#endif
 | 
			
		||||
@@ -100,12 +104,10 @@ clutter_backend_dispose (GObject *gobject)
 | 
			
		||||
  /* clear the events still in the queue of the main context */
 | 
			
		||||
  _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);
 | 
			
		||||
  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);
 | 
			
		||||
}
 | 
			
		||||
@@ -395,7 +397,7 @@ clutter_backend_real_create_context (ClutterBackend  *backend,
 | 
			
		||||
      else
 | 
			
		||||
        g_set_error_literal (error, CLUTTER_INIT_ERROR,
 | 
			
		||||
                             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;
 | 
			
		||||
    }
 | 
			
		||||
@@ -524,7 +526,92 @@ _clutter_create_backend (void)
 | 
			
		||||
static void
 | 
			
		||||
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
 | 
			
		||||
@@ -549,7 +636,8 @@ clutter_backend_class_init (ClutterBackendClass *klass)
 | 
			
		||||
                  G_TYPE_FROM_CLASS (klass),
 | 
			
		||||
                  G_SIGNAL_RUN_FIRST,
 | 
			
		||||
                  G_STRUCT_OFFSET (ClutterBackendClass, resolution_changed),
 | 
			
		||||
                  NULL, NULL, NULL,
 | 
			
		||||
                  NULL, NULL,
 | 
			
		||||
                  _clutter_marshal_VOID__VOID,
 | 
			
		||||
                  G_TYPE_NONE, 0);
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
@@ -566,7 +654,8 @@ clutter_backend_class_init (ClutterBackendClass *klass)
 | 
			
		||||
                  G_TYPE_FROM_CLASS (klass),
 | 
			
		||||
                  G_SIGNAL_RUN_FIRST,
 | 
			
		||||
                  G_STRUCT_OFFSET (ClutterBackendClass, font_changed),
 | 
			
		||||
                  NULL, NULL, NULL,
 | 
			
		||||
                  NULL, NULL,
 | 
			
		||||
                  _clutter_marshal_VOID__VOID,
 | 
			
		||||
                  G_TYPE_NONE, 0);
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
@@ -583,15 +672,19 @@ clutter_backend_class_init (ClutterBackendClass *klass)
 | 
			
		||||
                  G_TYPE_FROM_CLASS (klass),
 | 
			
		||||
                  G_SIGNAL_RUN_FIRST,
 | 
			
		||||
                  G_STRUCT_OFFSET (ClutterBackendClass, settings_changed),
 | 
			
		||||
                  NULL, NULL, NULL,
 | 
			
		||||
                  NULL, NULL,
 | 
			
		||||
                  _clutter_marshal_VOID__VOID,
 | 
			
		||||
                  G_TYPE_NONE, 0);
 | 
			
		||||
 | 
			
		||||
  klass->resolution_changed = clutter_backend_real_resolution_changed;
 | 
			
		||||
  klass->font_changed = clutter_backend_real_font_changed;
 | 
			
		||||
 | 
			
		||||
  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->get_features = clutter_backend_real_get_features;
 | 
			
		||||
  klass->get_keymap = clutter_backend_real_get_keymap;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
@@ -600,7 +693,7 @@ clutter_backend_init (ClutterBackend *self)
 | 
			
		||||
  self->units_per_em = -1.0;
 | 
			
		||||
  self->units_serial = 1;
 | 
			
		||||
 | 
			
		||||
  self->dummy_onscreen = NULL;
 | 
			
		||||
  self->dummy_onscreen = COGL_INVALID_HANDLE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
@@ -668,10 +761,6 @@ _clutter_backend_create_stage (ClutterBackend  *backend,
 | 
			
		||||
 | 
			
		||||
  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;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -756,24 +845,37 @@ _clutter_backend_copy_event_data (ClutterBackend     *backend,
 | 
			
		||||
                                  const ClutterEvent *src,
 | 
			
		||||
                                  ClutterEvent       *dest)
 | 
			
		||||
{
 | 
			
		||||
  ClutterSeatClass *seat_class;
 | 
			
		||||
  ClutterSeat *seat;
 | 
			
		||||
  ClutterEventExtenderInterface *iface;
 | 
			
		||||
  ClutterBackendClass *klass;
 | 
			
		||||
 | 
			
		||||
  seat = clutter_backend_get_default_seat (backend);
 | 
			
		||||
  seat_class = CLUTTER_SEAT_GET_CLASS (seat);
 | 
			
		||||
  seat_class->copy_event_data (seat, src, dest);
 | 
			
		||||
  klass = CLUTTER_BACKEND_GET_CLASS (backend);
 | 
			
		||||
  if (CLUTTER_IS_EVENT_EXTENDER (backend->device_manager))
 | 
			
		||||
    {
 | 
			
		||||
      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
 | 
			
		||||
_clutter_backend_free_event_data (ClutterBackend *backend,
 | 
			
		||||
                                  ClutterEvent   *event)
 | 
			
		||||
{
 | 
			
		||||
  ClutterSeatClass *seat_class;
 | 
			
		||||
  ClutterSeat *seat;
 | 
			
		||||
  ClutterEventExtenderInterface *iface;
 | 
			
		||||
  ClutterBackendClass *klass;
 | 
			
		||||
 | 
			
		||||
  seat = clutter_backend_get_default_seat (backend);
 | 
			
		||||
  seat_class = CLUTTER_SEAT_GET_CLASS (seat);
 | 
			
		||||
  seat_class->free_event_data (seat, event);
 | 
			
		||||
  klass = CLUTTER_BACKEND_GET_CLASS (backend);
 | 
			
		||||
 | 
			
		||||
  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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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)
 | 
			
		||||
 * @backend: a #ClutterBackend
 | 
			
		||||
@@ -970,6 +1094,94 @@ clutter_wayland_set_compositor_display (void *display)
 | 
			
		||||
}
 | 
			
		||||
#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
 | 
			
		||||
clutter_set_allowed_drivers (const char *drivers)
 | 
			
		||||
{
 | 
			
		||||
@@ -982,6 +1194,16 @@ clutter_set_allowed_drivers (const char *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:
 | 
			
		||||
 * @backend: the #CLutterBackend
 | 
			
		||||
@@ -1010,24 +1232,16 @@ clutter_backend_set_input_method (ClutterBackend     *backend,
 | 
			
		||||
  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
 | 
			
		||||
 *
 | 
			
		||||
 * Returns the default seat
 | 
			
		||||
 * Gets the keymap used by Clutter
 | 
			
		||||
 *
 | 
			
		||||
 * Returns: (transfer none): the default seat
 | 
			
		||||
 * Returns: (transfer none): the keymap
 | 
			
		||||
 **/
 | 
			
		||||
ClutterSeat *
 | 
			
		||||
clutter_backend_get_default_seat (ClutterBackend *backend)
 | 
			
		||||
ClutterKeymap *
 | 
			
		||||
clutter_backend_get_keymap (ClutterBackend *backend)
 | 
			
		||||
{
 | 
			
		||||
  g_return_val_if_fail (CLUTTER_IS_BACKEND (backend), NULL);
 | 
			
		||||
 | 
			
		||||
  return CLUTTER_BACKEND_GET_CLASS (backend)->get_default_seat (backend);
 | 
			
		||||
  return CLUTTER_BACKEND_GET_CLASS (backend)->get_keymap (backend);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -36,7 +36,6 @@
 | 
			
		||||
#include <clutter/clutter-config.h>
 | 
			
		||||
#include <clutter/clutter-keymap.h>
 | 
			
		||||
#include <clutter/clutter-types.h>
 | 
			
		||||
#include <clutter/clutter-seat.h>
 | 
			
		||||
 | 
			
		||||
G_BEGIN_DECLS
 | 
			
		||||
 | 
			
		||||
@@ -61,6 +60,9 @@ GType clutter_backend_get_type (void) G_GNUC_CONST;
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
ClutterBackend *                clutter_get_default_backend             (void);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void                            clutter_set_windowing_backend           (const char *backend_type);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
gdouble                         clutter_backend_get_resolution          (ClutterBackend             *backend);
 | 
			
		||||
 | 
			
		||||
@@ -73,6 +75,9 @@ const cairo_font_options_t *    clutter_backend_get_font_options        (Clutter
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
CoglContext *                   clutter_backend_get_cogl_context        (ClutterBackend             *backend);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void                            clutter_backend_bell_notify             (ClutterBackend             *backend);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
ClutterInputMethod *            clutter_backend_get_input_method        (ClutterBackend             *backend);
 | 
			
		||||
 | 
			
		||||
@@ -80,7 +85,7 @@ CLUTTER_EXPORT
 | 
			
		||||
void                            clutter_backend_set_input_method        (ClutterBackend             *backend,
 | 
			
		||||
                                                                         ClutterInputMethod         *method);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
ClutterSeat *                   clutter_backend_get_default_seat        (ClutterBackend             *backend);
 | 
			
		||||
ClutterKeymap *                 clutter_backend_get_keymap              (ClutterBackend             *backend);
 | 
			
		||||
 | 
			
		||||
G_END_DECLS
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -49,10 +49,10 @@
 | 
			
		||||
 | 
			
		||||
#define CLUTTER_DISABLE_DEPRECATION_WARNINGS
 | 
			
		||||
#include "deprecated/clutter-container.h"
 | 
			
		||||
#include "deprecated/clutter-bin-layout.h"
 | 
			
		||||
 | 
			
		||||
#include "clutter-actor-private.h"
 | 
			
		||||
#include "clutter-animatable.h"
 | 
			
		||||
#include "clutter-bin-layout.h"
 | 
			
		||||
#include "clutter-child-meta.h"
 | 
			
		||||
#include "clutter-debug.h"
 | 
			
		||||
#include "clutter-enum-types.h"
 | 
			
		||||
@@ -698,3 +698,187 @@ clutter_bin_layout_new (ClutterBinAlignment x_align,
 | 
			
		||||
                       "y-align", y_align,
 | 
			
		||||
                       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);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -144,55 +144,6 @@ source_destroyed (ClutterActor          *actor,
 | 
			
		||||
  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
 | 
			
		||||
clutter_bind_constraint_update_allocation (ClutterConstraint *constraint,
 | 
			
		||||
                                           ClutterActor      *actor,
 | 
			
		||||
@@ -201,9 +152,7 @@ clutter_bind_constraint_update_allocation (ClutterConstraint *constraint,
 | 
			
		||||
  ClutterBindConstraint *bind = CLUTTER_BIND_CONSTRAINT (constraint);
 | 
			
		||||
  gfloat source_width, source_height;
 | 
			
		||||
  gfloat actor_width, actor_height;
 | 
			
		||||
  graphene_point3d_t source_position;
 | 
			
		||||
 | 
			
		||||
  source_position = GRAPHENE_POINT3D_INIT (0.f, 0.f, 0.f);
 | 
			
		||||
  ClutterVertex source_position = { 0., };
 | 
			
		||||
 | 
			
		||||
  if (bind->source == NULL)
 | 
			
		||||
    return;
 | 
			
		||||
@@ -377,8 +326,6 @@ clutter_bind_constraint_class_init (ClutterBindConstraintClass *klass)
 | 
			
		||||
  meta_class->set_actor = clutter_bind_constraint_set_actor;
 | 
			
		||||
 | 
			
		||||
  constraint_class->update_allocation = clutter_bind_constraint_update_allocation;
 | 
			
		||||
  constraint_class->update_preferred_size = clutter_bind_constraint_update_preferred_size;
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * ClutterBindConstraint:source:
 | 
			
		||||
   *
 | 
			
		||||
 
 | 
			
		||||
@@ -235,7 +235,8 @@ clutter_binding_pool_finalize (GObject *gobject)
 | 
			
		||||
 | 
			
		||||
  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);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -99,8 +99,7 @@ G_DEFINE_TYPE (ClutterBlurEffect,
 | 
			
		||||
               CLUTTER_TYPE_OFFSCREEN_EFFECT);
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
clutter_blur_effect_pre_paint (ClutterEffect       *effect,
 | 
			
		||||
                               ClutterPaintContext *paint_context)
 | 
			
		||||
clutter_blur_effect_pre_paint (ClutterEffect *effect)
 | 
			
		||||
{
 | 
			
		||||
  ClutterBlurEffect *self = CLUTTER_BLUR_EFFECT (effect);
 | 
			
		||||
  ClutterEffectClass *parent_class;
 | 
			
		||||
@@ -125,7 +124,7 @@ clutter_blur_effect_pre_paint (ClutterEffect       *effect,
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  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 =
 | 
			
		||||
        CLUTTER_OFFSCREEN_EFFECT (effect);
 | 
			
		||||
@@ -158,12 +157,10 @@ clutter_blur_effect_pre_paint (ClutterEffect       *effect,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_blur_effect_paint_target (ClutterOffscreenEffect *effect,
 | 
			
		||||
                                  ClutterPaintContext    *paint_context)
 | 
			
		||||
clutter_blur_effect_paint_target (ClutterOffscreenEffect *effect)
 | 
			
		||||
{
 | 
			
		||||
  ClutterBlurEffect *self = CLUTTER_BLUR_EFFECT (effect);
 | 
			
		||||
  CoglFramebuffer *framebuffer =
 | 
			
		||||
    clutter_paint_context_get_framebuffer (paint_context);
 | 
			
		||||
  CoglFramebuffer *framebuffer = cogl_get_draw_framebuffer ();
 | 
			
		||||
  guint8 paint_opacity;
 | 
			
		||||
 | 
			
		||||
  paint_opacity = clutter_actor_get_paint_opacity (self->actor);
 | 
			
		||||
@@ -181,11 +178,11 @@ clutter_blur_effect_paint_target (ClutterOffscreenEffect *effect,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
clutter_blur_effect_modify_paint_volume (ClutterEffect      *effect,
 | 
			
		||||
                                         ClutterPaintVolume *volume)
 | 
			
		||||
clutter_blur_effect_get_paint_volume (ClutterEffect      *effect,
 | 
			
		||||
                                      ClutterPaintVolume *volume)
 | 
			
		||||
{
 | 
			
		||||
  gfloat cur_width, cur_height;
 | 
			
		||||
  graphene_point3d_t origin;
 | 
			
		||||
  ClutterVertex origin;
 | 
			
		||||
 | 
			
		||||
  clutter_paint_volume_get_origin (volume, &origin);
 | 
			
		||||
  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;
 | 
			
		||||
 | 
			
		||||
  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->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_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);
 | 
			
		||||
 
 | 
			
		||||
@@ -121,17 +121,16 @@ G_DEFINE_TYPE (ClutterBrightnessContrastEffect,
 | 
			
		||||
static gboolean
 | 
			
		||||
will_have_no_effect (ClutterBrightnessContrastEffect *self)
 | 
			
		||||
{
 | 
			
		||||
  return (G_APPROX_VALUE (self->brightness_red, no_change, FLT_EPSILON) &&
 | 
			
		||||
          G_APPROX_VALUE (self->brightness_green, no_change, FLT_EPSILON) &&
 | 
			
		||||
          G_APPROX_VALUE (self->brightness_blue, no_change, FLT_EPSILON) &&
 | 
			
		||||
          G_APPROX_VALUE (self->contrast_red, no_change, FLT_EPSILON) &&
 | 
			
		||||
          G_APPROX_VALUE (self->contrast_green, no_change, FLT_EPSILON) &&
 | 
			
		||||
          G_APPROX_VALUE (self->contrast_blue, no_change, FLT_EPSILON));
 | 
			
		||||
  return (self->brightness_red == no_change &&
 | 
			
		||||
          self->brightness_green == no_change &&
 | 
			
		||||
          self->brightness_blue == no_change &&
 | 
			
		||||
          self->contrast_red == no_change &&
 | 
			
		||||
          self->contrast_green == no_change &&
 | 
			
		||||
          self->contrast_blue == no_change);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
clutter_brightness_contrast_effect_pre_paint (ClutterEffect       *effect,
 | 
			
		||||
                                              ClutterPaintContext *paint_context)
 | 
			
		||||
clutter_brightness_contrast_effect_pre_paint (ClutterEffect *effect)
 | 
			
		||||
{
 | 
			
		||||
  ClutterBrightnessContrastEffect *self = CLUTTER_BRIGHTNESS_CONTRAST_EFFECT (effect);
 | 
			
		||||
  ClutterEffectClass *parent_class;
 | 
			
		||||
@@ -157,7 +156,7 @@ clutter_brightness_contrast_effect_pre_paint (ClutterEffect       *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 =
 | 
			
		||||
        CLUTTER_OFFSCREEN_EFFECT (effect);
 | 
			
		||||
@@ -176,12 +175,10 @@ clutter_brightness_contrast_effect_pre_paint (ClutterEffect       *effect,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_brightness_contrast_effect_paint_target (ClutterOffscreenEffect *effect,
 | 
			
		||||
                                                 ClutterPaintContext    *paint_context)
 | 
			
		||||
clutter_brightness_contrast_effect_paint_target (ClutterOffscreenEffect *effect)
 | 
			
		||||
{
 | 
			
		||||
  ClutterBrightnessContrastEffect *self = CLUTTER_BRIGHTNESS_CONTRAST_EFFECT (effect);
 | 
			
		||||
  CoglFramebuffer *framebuffer =
 | 
			
		||||
   clutter_paint_context_get_framebuffer (paint_context);
 | 
			
		||||
  CoglFramebuffer *framebuffer = cogl_get_draw_framebuffer ();
 | 
			
		||||
  ClutterActor *actor;
 | 
			
		||||
  guint8 paint_opacity;
 | 
			
		||||
 | 
			
		||||
@@ -441,7 +438,9 @@ clutter_brightness_contrast_effect_init (ClutterBrightnessContrastEffect *self)
 | 
			
		||||
      cogl_pipeline_add_snippet (klass->base_pipeline, 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);
 | 
			
		||||
@@ -497,9 +496,9 @@ clutter_brightness_contrast_effect_set_brightness_full (ClutterBrightnessContras
 | 
			
		||||
{
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_BRIGHTNESS_CONTRAST_EFFECT (effect));
 | 
			
		||||
 | 
			
		||||
  if (G_APPROX_VALUE (red, effect->brightness_red, FLT_EPSILON) &&
 | 
			
		||||
      G_APPROX_VALUE (green, effect->brightness_green, FLT_EPSILON) &&
 | 
			
		||||
      G_APPROX_VALUE (blue, effect->brightness_blue, FLT_EPSILON))
 | 
			
		||||
  if (red == effect->brightness_red &&
 | 
			
		||||
      green == effect->brightness_green &&
 | 
			
		||||
      blue == effect->brightness_blue)
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  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));
 | 
			
		||||
 | 
			
		||||
  if (G_APPROX_VALUE (red, effect->contrast_red, FLT_EPSILON) &&
 | 
			
		||||
      G_APPROX_VALUE (green, effect->contrast_green, FLT_EPSILON) &&
 | 
			
		||||
      G_APPROX_VALUE (blue, effect->contrast_blue, FLT_EPSILON))
 | 
			
		||||
  if (red == effect->contrast_red &&
 | 
			
		||||
      green == effect->contrast_green &&
 | 
			
		||||
      blue == effect->contrast_blue)
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  effect->contrast_red = red;
 | 
			
		||||
 
 | 
			
		||||
@@ -44,7 +44,6 @@
 | 
			
		||||
 | 
			
		||||
#include "clutter-build-config.h"
 | 
			
		||||
 | 
			
		||||
#include <math.h>
 | 
			
		||||
#include <cogl/cogl.h>
 | 
			
		||||
#include <cairo-gobject.h>
 | 
			
		||||
 | 
			
		||||
@@ -70,7 +69,6 @@ struct _ClutterCanvasPrivate
 | 
			
		||||
 | 
			
		||||
  int width;
 | 
			
		||||
  int height;
 | 
			
		||||
  float scale_factor;
 | 
			
		||||
 | 
			
		||||
  CoglTexture *texture;
 | 
			
		||||
  gboolean dirty;
 | 
			
		||||
@@ -84,7 +82,6 @@ enum
 | 
			
		||||
 | 
			
		||||
  PROP_WIDTH,
 | 
			
		||||
  PROP_HEIGHT,
 | 
			
		||||
  PROP_SCALE_FACTOR,
 | 
			
		||||
 | 
			
		||||
  LAST_PROP
 | 
			
		||||
};
 | 
			
		||||
@@ -181,19 +178,6 @@ clutter_canvas_set_property (GObject      *gobject,
 | 
			
		||||
      }
 | 
			
		||||
      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:
 | 
			
		||||
      G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);
 | 
			
		||||
      break;
 | 
			
		||||
@@ -218,10 +202,6 @@ clutter_canvas_get_property (GObject    *gobject,
 | 
			
		||||
      g_value_set_int (value, priv->height);
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
    case PROP_SCALE_FACTOR:
 | 
			
		||||
      g_value_set_float (value, priv->scale_factor);
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
    default:
 | 
			
		||||
      G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);
 | 
			
		||||
      break;
 | 
			
		||||
@@ -265,19 +245,6 @@ clutter_canvas_class_init (ClutterCanvasClass *klass)
 | 
			
		||||
                      G_PARAM_READWRITE |
 | 
			
		||||
                      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:
 | 
			
		||||
@@ -324,14 +291,12 @@ clutter_canvas_init (ClutterCanvas *self)
 | 
			
		||||
 | 
			
		||||
  self->priv->width = -1;
 | 
			
		||||
  self->priv->height = -1;
 | 
			
		||||
  self->priv->scale_factor = 1.0f;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_canvas_paint_content (ClutterContent      *content,
 | 
			
		||||
                              ClutterActor        *actor,
 | 
			
		||||
                              ClutterPaintNode    *root,
 | 
			
		||||
                              ClutterPaintContext *paint_context)
 | 
			
		||||
clutter_canvas_paint_content (ClutterContent   *content,
 | 
			
		||||
                              ClutterActor     *actor,
 | 
			
		||||
                              ClutterPaintNode *root)
 | 
			
		||||
{
 | 
			
		||||
  ClutterCanvas *self = CLUTTER_CANVAS (content);
 | 
			
		||||
  ClutterCanvasPrivate *priv = self->priv;
 | 
			
		||||
@@ -352,7 +317,7 @@ clutter_canvas_paint_content (ClutterContent      *content,
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  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_unref (node);
 | 
			
		||||
 | 
			
		||||
@@ -375,8 +340,8 @@ clutter_canvas_emit_draw (ClutterCanvas *self)
 | 
			
		||||
 | 
			
		||||
  priv->dirty = TRUE;
 | 
			
		||||
 | 
			
		||||
  real_width = ceilf (priv->width * priv->scale_factor);
 | 
			
		||||
  real_height = ceilf (priv->height * priv->scale_factor);
 | 
			
		||||
  real_width = priv->width;
 | 
			
		||||
  real_height = priv->height;
 | 
			
		||||
 | 
			
		||||
  CLUTTER_NOTE (MISC, "Creating Cairo surface with size %d x %d",
 | 
			
		||||
                priv->width, priv->height);
 | 
			
		||||
@@ -422,10 +387,6 @@ clutter_canvas_emit_draw (ClutterCanvas *self)
 | 
			
		||||
      mapped_buffer = FALSE;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  cairo_surface_set_device_scale (surface,
 | 
			
		||||
                                  priv->scale_factor,
 | 
			
		||||
                                  priv->scale_factor);
 | 
			
		||||
 | 
			
		||||
  self->priv->cr = cr = cairo_create (surface);
 | 
			
		||||
 | 
			
		||||
  g_signal_emit (self, canvas_signals[DRAW], 0,
 | 
			
		||||
@@ -487,10 +448,10 @@ clutter_canvas_get_preferred_size (ClutterContent *content,
 | 
			
		||||
    return FALSE;
 | 
			
		||||
 | 
			
		||||
  if (width != NULL)
 | 
			
		||||
    *width = ceilf (priv->width * priv->scale_factor);
 | 
			
		||||
    *width = priv->width;
 | 
			
		||||
 | 
			
		||||
  if (height != NULL)
 | 
			
		||||
    *height = ceilf (priv->height * priv->scale_factor);
 | 
			
		||||
    *height = priv->height;
 | 
			
		||||
 | 
			
		||||
  return TRUE;
 | 
			
		||||
}
 | 
			
		||||
@@ -599,48 +560,3 @@ clutter_canvas_set_size (ClutterCanvas *canvas,
 | 
			
		||||
 | 
			
		||||
  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;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -97,9 +97,9 @@ gboolean                clutter_canvas_set_size                 (ClutterCanvas *
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void                    clutter_canvas_set_scale_factor         (ClutterCanvas *canvas,
 | 
			
		||||
                                                                 float          scale);
 | 
			
		||||
                                                                 int            scale);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
float                   clutter_canvas_get_scale_factor         (ClutterCanvas *canvas);
 | 
			
		||||
int                     clutter_canvas_get_scale_factor         (ClutterCanvas *canvas);
 | 
			
		||||
 | 
			
		||||
G_END_DECLS
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -105,8 +105,8 @@ struct _ClutterClickActionPrivate
 | 
			
		||||
{
 | 
			
		||||
  ClutterActor *stage;
 | 
			
		||||
 | 
			
		||||
  gulong event_id;
 | 
			
		||||
  gulong capture_id;
 | 
			
		||||
  guint event_id;
 | 
			
		||||
  guint capture_id;
 | 
			
		||||
  guint long_press_id;
 | 
			
		||||
 | 
			
		||||
  gint long_press_threshold;
 | 
			
		||||
@@ -202,7 +202,11 @@ click_action_emit_long_press (gpointer data)
 | 
			
		||||
                 CLUTTER_LONG_PRESS_ACTIVATE,
 | 
			
		||||
                 &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_held (action, FALSE);
 | 
			
		||||
@@ -257,7 +261,8 @@ click_action_cancel_long_press (ClutterClickAction *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,
 | 
			
		||||
                     actor,
 | 
			
		||||
@@ -350,10 +355,6 @@ on_captured_event (ClutterActor       *stage,
 | 
			
		||||
 | 
			
		||||
  switch (clutter_event_type (event))
 | 
			
		||||
    {
 | 
			
		||||
    case CLUTTER_TOUCH_CANCEL:
 | 
			
		||||
      clutter_click_action_release (action);
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
    case CLUTTER_TOUCH_END:
 | 
			
		||||
      has_button = FALSE;
 | 
			
		||||
    case CLUTTER_BUTTON_RELEASE:
 | 
			
		||||
@@ -370,9 +371,17 @@ on_captured_event (ClutterActor       *stage,
 | 
			
		||||
      click_action_cancel_long_press (action);
 | 
			
		||||
 | 
			
		||||
      /* 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)))
 | 
			
		||||
        return CLUTTER_EVENT_PROPAGATE;
 | 
			
		||||
@@ -440,7 +449,7 @@ clutter_click_action_set_actor (ClutterActorMeta *meta,
 | 
			
		||||
      ClutterActor *old_actor = clutter_actor_meta_get_actor (meta);
 | 
			
		||||
 | 
			
		||||
      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;
 | 
			
		||||
    }
 | 
			
		||||
@@ -448,13 +457,17 @@ clutter_click_action_set_actor (ClutterActorMeta *meta,
 | 
			
		||||
  if (priv->capture_id != 0)
 | 
			
		||||
    {
 | 
			
		||||
      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->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_held (action, FALSE);
 | 
			
		||||
@@ -528,12 +541,24 @@ clutter_click_action_dispose (GObject *gobject)
 | 
			
		||||
{
 | 
			
		||||
  ClutterClickActionPrivate *priv = CLUTTER_CLICK_ACTION (gobject)->priv;
 | 
			
		||||
 | 
			
		||||
  g_clear_signal_handler (&priv->event_id,
 | 
			
		||||
                          clutter_actor_meta_get_actor (CLUTTER_ACTOR_META (gobject)));
 | 
			
		||||
  if (priv->event_id)
 | 
			
		||||
    {
 | 
			
		||||
      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);
 | 
			
		||||
}
 | 
			
		||||
@@ -637,7 +662,8 @@ clutter_click_action_class_init (ClutterClickActionClass *klass)
 | 
			
		||||
                  G_TYPE_FROM_CLASS (klass),
 | 
			
		||||
                  G_SIGNAL_RUN_LAST,
 | 
			
		||||
                  G_STRUCT_OFFSET (ClutterClickActionClass, clicked),
 | 
			
		||||
                  NULL, NULL, NULL,
 | 
			
		||||
                  NULL, NULL,
 | 
			
		||||
                  _clutter_marshal_VOID__OBJECT,
 | 
			
		||||
                  G_TYPE_NONE, 1,
 | 
			
		||||
                  CLUTTER_TYPE_ACTOR);
 | 
			
		||||
 | 
			
		||||
@@ -731,7 +757,11 @@ clutter_click_action_release (ClutterClickAction *action)
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  /* 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_set_held (action, FALSE);
 | 
			
		||||
 
 | 
			
		||||
@@ -152,8 +152,7 @@ clutter_clone_apply_transform (ClutterActor *self, CoglMatrix *matrix)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_clone_paint (ClutterActor        *actor,
 | 
			
		||||
                     ClutterPaintContext *paint_context)
 | 
			
		||||
clutter_clone_paint (ClutterActor *actor)
 | 
			
		||||
{
 | 
			
		||||
  ClutterClone *self = CLUTTER_CLONE (actor);
 | 
			
		||||
  ClutterClonePrivate *priv = self->priv;
 | 
			
		||||
@@ -190,7 +189,7 @@ clutter_clone_paint (ClutterActor        *actor,
 | 
			
		||||
  if (clutter_actor_is_realized (priv->clone_source))
 | 
			
		||||
    {
 | 
			
		||||
      _clutter_actor_push_clone_paint ();
 | 
			
		||||
      clutter_actor_paint (priv->clone_source, paint_context);
 | 
			
		||||
      clutter_actor_paint (priv->clone_source);
 | 
			
		||||
      _clutter_actor_pop_clone_paint ();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -253,13 +252,6 @@ clutter_clone_allocate (ClutterActor           *self,
 | 
			
		||||
  if (priv->clone_source == NULL)
 | 
			
		||||
    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, flags);
 | 
			
		||||
 | 
			
		||||
#if 0
 | 
			
		||||
  /* XXX - this is wrong: ClutterClone cannot clone unparented
 | 
			
		||||
   * actors, as it will break all invariants
 | 
			
		||||
@@ -401,7 +393,8 @@ clutter_clone_set_source_internal (ClutterClone *self,
 | 
			
		||||
 | 
			
		||||
  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));
 | 
			
		||||
      g_object_unref (priv->clone_source);
 | 
			
		||||
      priv->clone_source = NULL;
 | 
			
		||||
 
 | 
			
		||||
@@ -105,8 +105,7 @@ G_DEFINE_TYPE (ClutterColorizeEffect,
 | 
			
		||||
               CLUTTER_TYPE_OFFSCREEN_EFFECT);
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
clutter_colorize_effect_pre_paint (ClutterEffect       *effect,
 | 
			
		||||
                                   ClutterPaintContext *paint_context)
 | 
			
		||||
clutter_colorize_effect_pre_paint (ClutterEffect *effect)
 | 
			
		||||
{
 | 
			
		||||
  ClutterColorizeEffect *self = CLUTTER_COLORIZE_EFFECT (effect);
 | 
			
		||||
  ClutterEffectClass *parent_class;
 | 
			
		||||
@@ -127,7 +126,7 @@ clutter_colorize_effect_pre_paint (ClutterEffect       *effect,
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  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 =
 | 
			
		||||
        CLUTTER_OFFSCREEN_EFFECT (effect);
 | 
			
		||||
@@ -146,12 +145,10 @@ clutter_colorize_effect_pre_paint (ClutterEffect       *effect,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_colorize_effect_paint_target (ClutterOffscreenEffect *effect,
 | 
			
		||||
                                      ClutterPaintContext    *paint_context)
 | 
			
		||||
clutter_colorize_effect_paint_target (ClutterOffscreenEffect *effect)
 | 
			
		||||
{
 | 
			
		||||
  ClutterColorizeEffect *self = CLUTTER_COLORIZE_EFFECT (effect);
 | 
			
		||||
  CoglFramebuffer *framebuffer =
 | 
			
		||||
    clutter_paint_context_get_framebuffer (paint_context);
 | 
			
		||||
  CoglFramebuffer *framebuffer = cogl_get_draw_framebuffer ();
 | 
			
		||||
  ClutterActor *actor;
 | 
			
		||||
  guint8 paint_opacity;
 | 
			
		||||
 | 
			
		||||
@@ -296,7 +293,9 @@ clutter_colorize_effect_init (ClutterColorizeEffect *self)
 | 
			
		||||
      cogl_pipeline_add_snippet (klass->base_pipeline, 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);
 | 
			
		||||
 
 | 
			
		||||
@@ -30,6 +30,13 @@ gboolean clutter_constraint_update_allocation (ClutterConstraint *constraint,
 | 
			
		||||
                                               ClutterActor      *actor,
 | 
			
		||||
                                               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
 | 
			
		||||
 | 
			
		||||
#endif /* __CLUTTER_CONSTRAINT_PRIVATE_H__ */
 | 
			
		||||
 
 | 
			
		||||
@@ -48,7 +48,7 @@
 | 
			
		||||
 * Constraints provide a way to build user interfaces by using
 | 
			
		||||
 * relations between #ClutterActors, without explicit fixed
 | 
			
		||||
 * 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
 | 
			
		||||
 * for inspection using clutter_actor_get_constraints().
 | 
			
		||||
@@ -222,17 +222,6 @@ clutter_constraint_update_allocation (ClutterConstraint *constraint,
 | 
			
		||||
  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
 | 
			
		||||
clutter_constraint_update_preferred_size (ClutterConstraint  *constraint,
 | 
			
		||||
                                          ClutterActor       *actor,
 | 
			
		||||
 
 | 
			
		||||
@@ -99,14 +99,6 @@ struct _ClutterConstraintClass
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
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 */
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void               clutter_actor_add_constraint            (ClutterActor      *self,
 | 
			
		||||
 
 | 
			
		||||
@@ -37,7 +37,6 @@
 | 
			
		||||
 | 
			
		||||
#include "clutter-actor-private.h"
 | 
			
		||||
#include "clutter-child-meta.h"
 | 
			
		||||
#include "clutter-container-private.h"
 | 
			
		||||
#include "clutter-debug.h"
 | 
			
		||||
#include "clutter-main.h"
 | 
			
		||||
#include "clutter-marshal.h"
 | 
			
		||||
@@ -119,6 +118,37 @@ container_real_remove (ClutterContainer *container,
 | 
			
		||||
  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
 | 
			
		||||
container_real_raise (ClutterContainer *container,
 | 
			
		||||
                      ClutterActor     *child,
 | 
			
		||||
@@ -167,7 +197,8 @@ clutter_container_default_init (ClutterContainerInterface *iface)
 | 
			
		||||
                  iface_type,
 | 
			
		||||
                  G_SIGNAL_RUN_FIRST,
 | 
			
		||||
                  G_STRUCT_OFFSET (ClutterContainerIface, actor_added),
 | 
			
		||||
                  NULL, NULL, NULL,
 | 
			
		||||
                  NULL, NULL,
 | 
			
		||||
                  _clutter_marshal_VOID__OBJECT,
 | 
			
		||||
                  G_TYPE_NONE, 1,
 | 
			
		||||
                  CLUTTER_TYPE_ACTOR);
 | 
			
		||||
  /**
 | 
			
		||||
@@ -185,7 +216,8 @@ clutter_container_default_init (ClutterContainerInterface *iface)
 | 
			
		||||
                  iface_type,
 | 
			
		||||
                  G_SIGNAL_RUN_FIRST,
 | 
			
		||||
                  G_STRUCT_OFFSET (ClutterContainerIface, actor_removed),
 | 
			
		||||
                  NULL, NULL, NULL,
 | 
			
		||||
                  NULL, NULL,
 | 
			
		||||
                  _clutter_marshal_VOID__OBJECT,
 | 
			
		||||
                  G_TYPE_NONE, 1,
 | 
			
		||||
                  CLUTTER_TYPE_ACTOR);
 | 
			
		||||
 | 
			
		||||
@@ -213,6 +245,7 @@ clutter_container_default_init (ClutterContainerInterface *iface)
 | 
			
		||||
 | 
			
		||||
  iface->add = container_real_add;
 | 
			
		||||
  iface->remove = container_real_remove;
 | 
			
		||||
  iface->foreach = container_real_foreach;
 | 
			
		||||
  iface->raise = container_real_raise;
 | 
			
		||||
  iface->lower = container_real_lower;
 | 
			
		||||
  iface->sort_depth_order = container_real_sort_depth_order;
 | 
			
		||||
@@ -385,6 +418,33 @@ clutter_container_add_actor (ClutterContainer *container,
 | 
			
		||||
  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)
 | 
			
		||||
 * @container: a #ClutterContainer
 | 
			
		||||
@@ -448,6 +508,42 @@ clutter_container_remove_actor (ClutterContainer *container,
 | 
			
		||||
  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:
 | 
			
		||||
 * @container: a #ClutterContainer
 | 
			
		||||
@@ -465,9 +561,108 @@ clutter_container_remove_actor (ClutterContainer *container,
 | 
			
		||||
GList *
 | 
			
		||||
clutter_container_get_children (ClutterContainer *container)
 | 
			
		||||
{
 | 
			
		||||
  GList *retval;
 | 
			
		||||
 | 
			
		||||
  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,
 | 
			
		||||
                                                         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);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -59,6 +59,14 @@ typedef struct _ClutterContainerIface   ClutterContainerIface;
 | 
			
		||||
 *   function is deprecated, and it should not be overridden.
 | 
			
		||||
 * @remove: virtual function for removing an actor from the container. This
 | 
			
		||||
 *   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
 | 
			
		||||
 *   deprecated and it should not be overridden.
 | 
			
		||||
 * @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
 | 
			
		||||
 * @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 are optional.
 | 
			
		||||
 *
 | 
			
		||||
@@ -96,6 +104,13 @@ struct _ClutterContainerIface
 | 
			
		||||
                             ClutterActor     *actor);
 | 
			
		||||
  void (* remove)           (ClutterContainer *container,
 | 
			
		||||
                             ClutterActor     *actor);
 | 
			
		||||
  void (* foreach)          (ClutterContainer *container,
 | 
			
		||||
                             ClutterCallback   callback,
 | 
			
		||||
                             gpointer          user_data);
 | 
			
		||||
 | 
			
		||||
  void (* foreach_with_internals) (ClutterContainer *container,
 | 
			
		||||
                                   ClutterCallback   callback,
 | 
			
		||||
                                   gpointer          user_data);
 | 
			
		||||
 | 
			
		||||
  /* child stacking */
 | 
			
		||||
  void (* raise)            (ClutterContainer *container,
 | 
			
		||||
 
 | 
			
		||||
@@ -34,10 +34,9 @@ void            _clutter_content_attached               (ClutterContent   *conte
 | 
			
		||||
void            _clutter_content_detached               (ClutterContent   *content,
 | 
			
		||||
                                                         ClutterActor     *actor);
 | 
			
		||||
 | 
			
		||||
void            _clutter_content_paint_content          (ClutterContent      *content,
 | 
			
		||||
                                                         ClutterActor        *actor,
 | 
			
		||||
                                                         ClutterPaintNode    *node,
 | 
			
		||||
                                                         ClutterPaintContext *paint_context);
 | 
			
		||||
void            _clutter_content_paint_content          (ClutterContent   *content,
 | 
			
		||||
                                                         ClutterActor     *actor,
 | 
			
		||||
                                                         ClutterPaintNode *node);
 | 
			
		||||
 | 
			
		||||
G_END_DECLS
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -96,10 +96,9 @@ clutter_content_real_invalidate_size (ClutterContent *content)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_content_real_paint_content (ClutterContent      *content,
 | 
			
		||||
                                    ClutterActor        *actor,
 | 
			
		||||
                                    ClutterPaintNode    *context,
 | 
			
		||||
                                    ClutterPaintContext *paint_context)
 | 
			
		||||
clutter_content_real_paint_content (ClutterContent   *content,
 | 
			
		||||
                                    ClutterActor     *actor,
 | 
			
		||||
                                    ClutterPaintNode *context)
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -130,7 +129,8 @@ clutter_content_default_init (ClutterContentInterface *iface)
 | 
			
		||||
                  G_TYPE_FROM_INTERFACE (iface),
 | 
			
		||||
                  G_SIGNAL_RUN_FIRST,
 | 
			
		||||
                  G_STRUCT_OFFSET (ClutterContentInterface, attached),
 | 
			
		||||
                  NULL, NULL, NULL,
 | 
			
		||||
                  NULL, NULL,
 | 
			
		||||
                  _clutter_marshal_VOID__OBJECT,
 | 
			
		||||
                  G_TYPE_NONE, 1,
 | 
			
		||||
                  CLUTTER_TYPE_ACTOR);
 | 
			
		||||
 | 
			
		||||
@@ -149,7 +149,8 @@ clutter_content_default_init (ClutterContentInterface *iface)
 | 
			
		||||
                  G_TYPE_FROM_INTERFACE (iface),
 | 
			
		||||
                  G_SIGNAL_RUN_FIRST,
 | 
			
		||||
                  G_STRUCT_OFFSET (ClutterContentInterface, detached),
 | 
			
		||||
                  NULL, NULL, NULL,
 | 
			
		||||
                  NULL, NULL,
 | 
			
		||||
                  _clutter_marshal_VOID__OBJECT,
 | 
			
		||||
                  G_TYPE_NONE, 1,
 | 
			
		||||
                  CLUTTER_TYPE_ACTOR);
 | 
			
		||||
}
 | 
			
		||||
@@ -301,8 +302,7 @@ _clutter_content_detached (ClutterContent *content,
 | 
			
		||||
 * _clutter_content_paint_content:
 | 
			
		||||
 * @content: a #ClutterContent
 | 
			
		||||
 * @actor: a #ClutterActor
 | 
			
		||||
 * @node: a #ClutterPaintNode
 | 
			
		||||
 * @paint_context: a #ClutterPaintContext
 | 
			
		||||
 * @context: a #ClutterPaintNode
 | 
			
		||||
 *
 | 
			
		||||
 * Creates the render tree for the @content and @actor.
 | 
			
		||||
 *
 | 
			
		||||
@@ -310,13 +310,11 @@ _clutter_content_detached (ClutterContent *content,
 | 
			
		||||
 * virtual function.
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
_clutter_content_paint_content (ClutterContent      *content,
 | 
			
		||||
                                ClutterActor        *actor,
 | 
			
		||||
                                ClutterPaintNode    *node,
 | 
			
		||||
                                ClutterPaintContext *paint_context)
 | 
			
		||||
_clutter_content_paint_content (ClutterContent   *content,
 | 
			
		||||
                                ClutterActor     *actor,
 | 
			
		||||
                                ClutterPaintNode *node)
 | 
			
		||||
{
 | 
			
		||||
  CLUTTER_CONTENT_GET_IFACE (content)->paint_content (content, actor, node,
 | 
			
		||||
                                                      paint_context);
 | 
			
		||||
  CLUTTER_CONTENT_GET_IFACE (content)->paint_content (content, actor, node);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 
 | 
			
		||||
@@ -65,10 +65,9 @@ struct _ClutterContentInterface
 | 
			
		||||
  gboolean      (* get_preferred_size)  (ClutterContent   *content,
 | 
			
		||||
                                         gfloat           *width,
 | 
			
		||||
                                         gfloat           *height);
 | 
			
		||||
  void          (* paint_content)       (ClutterContent      *content,
 | 
			
		||||
                                         ClutterActor        *actor,
 | 
			
		||||
                                         ClutterPaintNode    *node,
 | 
			
		||||
                                         ClutterPaintContext *paint_context);
 | 
			
		||||
  void          (* paint_content)       (ClutterContent   *content,
 | 
			
		||||
                                         ClutterActor     *actor,
 | 
			
		||||
                                         ClutterPaintNode *node);
 | 
			
		||||
 | 
			
		||||
  void          (* attached)            (ClutterContent   *content,
 | 
			
		||||
                                         ClutterActor     *actor);
 | 
			
		||||
 
 | 
			
		||||
@@ -6,6 +6,43 @@
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
 | 
			
		||||
#define CLUTTER_HAS_DEBUG(type)         ((clutter_debug_flags & CLUTTER_DEBUG_##type) != FALSE)
 | 
			
		||||
 
 | 
			
		||||
@@ -147,7 +147,7 @@ clutter_deform_effect_set_actor (ClutterActorMeta *meta,
 | 
			
		||||
      ClutterActor *old_actor = clutter_actor_meta_get_actor (meta);
 | 
			
		||||
 | 
			
		||||
      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;
 | 
			
		||||
    }
 | 
			
		||||
@@ -166,20 +166,18 @@ clutter_deform_effect_set_actor (ClutterActorMeta *meta,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_deform_effect_paint_target (ClutterOffscreenEffect *effect,
 | 
			
		||||
                                    ClutterPaintContext    *paint_context)
 | 
			
		||||
clutter_deform_effect_paint_target (ClutterOffscreenEffect *effect)
 | 
			
		||||
{
 | 
			
		||||
  ClutterDeformEffect *self= CLUTTER_DEFORM_EFFECT (effect);
 | 
			
		||||
  ClutterDeformEffectPrivate *priv = self->priv;
 | 
			
		||||
  CoglHandle material;
 | 
			
		||||
  CoglPipeline *pipeline;
 | 
			
		||||
  CoglDepthState depth_state;
 | 
			
		||||
  CoglFramebuffer *fb =
 | 
			
		||||
    clutter_paint_context_get_framebuffer (paint_context);
 | 
			
		||||
  CoglFramebuffer *fb = cogl_get_draw_framebuffer ();
 | 
			
		||||
 | 
			
		||||
  if (priv->is_dirty)
 | 
			
		||||
    {
 | 
			
		||||
      graphene_rect_t rect;
 | 
			
		||||
      ClutterRect rect;
 | 
			
		||||
      gboolean mapped_buffer;
 | 
			
		||||
      CoglVertexP3T2C4 *verts;
 | 
			
		||||
      ClutterActor *actor;
 | 
			
		||||
@@ -195,8 +193,8 @@ clutter_deform_effect_paint_target (ClutterOffscreenEffect *effect,
 | 
			
		||||
       */
 | 
			
		||||
      if (clutter_offscreen_effect_get_target_rect (effect, &rect))
 | 
			
		||||
        {
 | 
			
		||||
          width = graphene_rect_get_width (&rect);
 | 
			
		||||
          height = graphene_rect_get_height (&rect);
 | 
			
		||||
          width = clutter_rect_get_width (&rect);
 | 
			
		||||
          height = clutter_rect_get_height (&rect);
 | 
			
		||||
        }
 | 
			
		||||
      else
 | 
			
		||||
        clutter_actor_get_size (actor, &width, &height);
 | 
			
		||||
@@ -284,7 +282,6 @@ clutter_deform_effect_paint_target (ClutterOffscreenEffect *effect,
 | 
			
		||||
  /* enable depth testing */
 | 
			
		||||
  cogl_depth_state_init (&depth_state);
 | 
			
		||||
  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);
 | 
			
		||||
 | 
			
		||||
  /* enable backface culling if we have a back material */
 | 
			
		||||
 
 | 
			
		||||
@@ -5,13 +5,32 @@
 | 
			
		||||
 | 
			
		||||
#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-cairo-texture.h"
 | 
			
		||||
#include "deprecated/clutter-container.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-shader.h"
 | 
			
		||||
#include "deprecated/clutter-stage-manager.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"
 | 
			
		||||
 | 
			
		||||
#undef __CLUTTER_DEPRECATED_H_INSIDE__
 | 
			
		||||
 
 | 
			
		||||
@@ -112,8 +112,7 @@ G_DEFINE_TYPE (ClutterDesaturateEffect,
 | 
			
		||||
               CLUTTER_TYPE_OFFSCREEN_EFFECT);
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
clutter_desaturate_effect_pre_paint (ClutterEffect       *effect,
 | 
			
		||||
                                     ClutterPaintContext *paint_context)
 | 
			
		||||
clutter_desaturate_effect_pre_paint (ClutterEffect *effect)
 | 
			
		||||
{
 | 
			
		||||
  ClutterDesaturateEffect *self = CLUTTER_DESATURATE_EFFECT (effect);
 | 
			
		||||
  ClutterEffectClass *parent_class;
 | 
			
		||||
@@ -134,7 +133,7 @@ clutter_desaturate_effect_pre_paint (ClutterEffect       *effect,
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  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 =
 | 
			
		||||
        CLUTTER_OFFSCREEN_EFFECT (effect);
 | 
			
		||||
@@ -153,12 +152,10 @@ clutter_desaturate_effect_pre_paint (ClutterEffect       *effect,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_desaturate_effect_paint_target (ClutterOffscreenEffect *effect,
 | 
			
		||||
                                        ClutterPaintContext    *paint_context)
 | 
			
		||||
clutter_desaturate_effect_paint_target (ClutterOffscreenEffect *effect)
 | 
			
		||||
{
 | 
			
		||||
  ClutterDesaturateEffect *self = CLUTTER_DESATURATE_EFFECT (effect);
 | 
			
		||||
  CoglFramebuffer *framebuffer =
 | 
			
		||||
   clutter_paint_context_get_framebuffer (paint_context);
 | 
			
		||||
  CoglFramebuffer *framebuffer = cogl_get_draw_framebuffer ();
 | 
			
		||||
  ClutterActor *actor;
 | 
			
		||||
  CoglHandle texture;
 | 
			
		||||
  guint8 paint_opacity;
 | 
			
		||||
@@ -300,7 +297,9 @@ clutter_desaturate_effect_init (ClutterDesaturateEffect *self)
 | 
			
		||||
      cogl_pipeline_add_snippet (klass->base_pipeline, 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);
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										285
									
								
								clutter/clutter/clutter-device-manager-private.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										285
									
								
								clutter/clutter/clutter-device-manager-private.h
									
									
									
									
									
										Normal 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__ */
 | 
			
		||||
							
								
								
									
										587
									
								
								clutter/clutter/clutter-device-manager.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										587
									
								
								clutter/clutter/clutter-device-manager.c
									
									
									
									
									
										Normal 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;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										161
									
								
								clutter/clutter/clutter-device-manager.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										161
									
								
								clutter/clutter/clutter-device-manager.h
									
									
									
									
									
										Normal 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__ */
 | 
			
		||||
@@ -81,7 +81,7 @@ struct _ClutterDragActionPrivate
 | 
			
		||||
  gint y_drag_threshold;
 | 
			
		||||
  ClutterActor *drag_handle;
 | 
			
		||||
  ClutterDragAxis drag_axis;
 | 
			
		||||
  graphene_rect_t drag_area;
 | 
			
		||||
  ClutterRect drag_area;
 | 
			
		||||
 | 
			
		||||
  ClutterInputDevice *device;
 | 
			
		||||
  ClutterEventSequence *sequence;
 | 
			
		||||
@@ -315,7 +315,11 @@ emit_drag_end (ClutterDragAction *action,
 | 
			
		||||
    goto out;
 | 
			
		||||
 | 
			
		||||
  /* 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;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  clutter_stage_set_motion_events_enabled (priv->stage,
 | 
			
		||||
                                           priv->motion_events_enabled);
 | 
			
		||||
@@ -474,8 +478,8 @@ clutter_drag_action_set_actor (ClutterActorMeta *meta,
 | 
			
		||||
      old_actor = clutter_actor_meta_get_actor (meta);
 | 
			
		||||
      if (old_actor != NULL)
 | 
			
		||||
        {
 | 
			
		||||
          g_clear_signal_handler (&priv->button_press_id, old_actor);
 | 
			
		||||
          g_clear_signal_handler (&priv->touch_begin_id, old_actor);
 | 
			
		||||
          g_signal_handler_disconnect (old_actor, priv->button_press_id);
 | 
			
		||||
          g_signal_handler_disconnect (old_actor, priv->touch_begin_id);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
      priv->button_press_id = 0;
 | 
			
		||||
@@ -485,7 +489,7 @@ clutter_drag_action_set_actor (ClutterActorMeta *meta,
 | 
			
		||||
  if (priv->capture_id != 0)
 | 
			
		||||
    {
 | 
			
		||||
      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->stage = NULL;
 | 
			
		||||
@@ -538,7 +542,7 @@ clutter_drag_action_real_drag_motion (ClutterDragAction *action,
 | 
			
		||||
 | 
			
		||||
  if (action->priv->drag_area_set)
 | 
			
		||||
    {
 | 
			
		||||
      graphene_rect_t *drag_area = &action->priv->drag_area;
 | 
			
		||||
      ClutterRect *drag_area = &action->priv->drag_area;
 | 
			
		||||
 | 
			
		||||
      x = CLAMP (x, drag_area->origin.x, drag_area->origin.x + drag_area->size.width);
 | 
			
		||||
      y = CLAMP (y, drag_area->origin.y, drag_area->origin.y + drag_area->size.height);
 | 
			
		||||
@@ -664,7 +668,7 @@ clutter_drag_action_dispose (GObject *gobject)
 | 
			
		||||
                                               priv->motion_events_enabled);
 | 
			
		||||
 | 
			
		||||
      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->stage = NULL;
 | 
			
		||||
@@ -677,8 +681,8 @@ clutter_drag_action_dispose (GObject *gobject)
 | 
			
		||||
      actor = clutter_actor_meta_get_actor (CLUTTER_ACTOR_META (gobject));
 | 
			
		||||
      if (actor != NULL)
 | 
			
		||||
        {
 | 
			
		||||
          g_clear_signal_handler (&priv->button_press_id, actor);
 | 
			
		||||
          g_clear_signal_handler (&priv->touch_begin_id, actor);
 | 
			
		||||
          g_signal_handler_disconnect (actor, priv->button_press_id);
 | 
			
		||||
          g_signal_handler_disconnect (actor, priv->touch_begin_id);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
      priv->button_press_id = 0;
 | 
			
		||||
@@ -807,7 +811,7 @@ clutter_drag_action_class_init (ClutterDragActionClass *klass)
 | 
			
		||||
    g_param_spec_boxed ("drag-area",
 | 
			
		||||
			P_("Drag Area"),
 | 
			
		||||
			P_("Constrains the dragging to a rectangle"),
 | 
			
		||||
			GRAPHENE_TYPE_RECT,
 | 
			
		||||
			CLUTTER_TYPE_RECT,
 | 
			
		||||
			CLUTTER_PARAM_READWRITE);
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
@@ -1263,10 +1267,10 @@ clutter_drag_action_get_motion_coords (ClutterDragAction *action,
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_drag_action_get_drag_area:
 | 
			
		||||
 * @action: a #ClutterDragAction
 | 
			
		||||
 * @drag_area: (out caller-allocates): a #graphene_rect_t to be filled
 | 
			
		||||
 * @drag_area: (out caller-allocates): a #ClutterRect to be filled
 | 
			
		||||
 *
 | 
			
		||||
 * Retrieves the "drag area" associated with @action, that
 | 
			
		||||
 * is a #graphene_rect_t that constrains the actor movements,
 | 
			
		||||
 * is a #ClutterRect that constrains the actor movements,
 | 
			
		||||
 * in parents coordinates.
 | 
			
		||||
 *
 | 
			
		||||
 * Returns: %TRUE if the actor is actually constrained (and thus
 | 
			
		||||
@@ -1274,7 +1278,7 @@ clutter_drag_action_get_motion_coords (ClutterDragAction *action,
 | 
			
		||||
 */
 | 
			
		||||
gboolean
 | 
			
		||||
clutter_drag_action_get_drag_area (ClutterDragAction *action,
 | 
			
		||||
                                   graphene_rect_t   *drag_area)
 | 
			
		||||
				   ClutterRect       *drag_area)
 | 
			
		||||
{
 | 
			
		||||
  g_return_val_if_fail (CLUTTER_IS_DRAG_ACTION (action), FALSE);
 | 
			
		||||
 | 
			
		||||
@@ -1294,8 +1298,8 @@ clutter_drag_action_get_drag_area (ClutterDragAction *action,
 | 
			
		||||
 * If @drag_area is %NULL, the actor is not constrained.
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
clutter_drag_action_set_drag_area (ClutterDragAction     *action,
 | 
			
		||||
                                   const graphene_rect_t *drag_area)
 | 
			
		||||
clutter_drag_action_set_drag_area (ClutterDragAction *action,
 | 
			
		||||
				   const ClutterRect *drag_area)
 | 
			
		||||
{
 | 
			
		||||
  ClutterDragActionPrivate *priv;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -141,11 +141,11 @@ void            clutter_drag_action_get_motion_coords  (ClutterDragAction *actio
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
gboolean        clutter_drag_action_get_drag_area      (ClutterDragAction *action,
 | 
			
		||||
                                                        graphene_rect_t   *drag_area);
 | 
			
		||||
                                                        ClutterRect       *drag_area);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void            clutter_drag_action_set_drag_area      (ClutterDragAction     *action,
 | 
			
		||||
                                                        const graphene_rect_t *drag_area);
 | 
			
		||||
void            clutter_drag_action_set_drag_area      (ClutterDragAction *action,
 | 
			
		||||
                                                        const ClutterRect *drag_area);
 | 
			
		||||
 | 
			
		||||
G_END_DECLS
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -107,7 +107,7 @@ drop_target_free (gpointer _data)
 | 
			
		||||
{
 | 
			
		||||
  DropTarget *data = _data;
 | 
			
		||||
 | 
			
		||||
  g_clear_signal_handler (&data->capture_id, data->stage);
 | 
			
		||||
  g_signal_handler_disconnect (data->stage, data->capture_id);
 | 
			
		||||
  g_hash_table_destroy (data->actions);
 | 
			
		||||
  g_free (data);
 | 
			
		||||
}
 | 
			
		||||
@@ -326,10 +326,12 @@ clutter_drop_action_set_actor (ClutterActorMeta *meta,
 | 
			
		||||
    {
 | 
			
		||||
      drop_action_unregister (CLUTTER_DROP_ACTION (meta));
 | 
			
		||||
 | 
			
		||||
      g_clear_signal_handler (&priv->mapped_id, priv->actor);
 | 
			
		||||
      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;
 | 
			
		||||
@@ -426,7 +428,8 @@ clutter_drop_action_class_init (ClutterDropActionClass *klass)
 | 
			
		||||
                  G_TYPE_FROM_CLASS (klass),
 | 
			
		||||
                  G_SIGNAL_RUN_LAST,
 | 
			
		||||
                  G_STRUCT_OFFSET (ClutterDropActionClass, over_in),
 | 
			
		||||
                  NULL, NULL, NULL,
 | 
			
		||||
                  NULL, NULL,
 | 
			
		||||
                  _clutter_marshal_VOID__OBJECT,
 | 
			
		||||
                  G_TYPE_NONE, 1,
 | 
			
		||||
                  CLUTTER_TYPE_ACTOR);
 | 
			
		||||
 | 
			
		||||
@@ -445,7 +448,8 @@ clutter_drop_action_class_init (ClutterDropActionClass *klass)
 | 
			
		||||
                  G_TYPE_FROM_CLASS (klass),
 | 
			
		||||
                  G_SIGNAL_RUN_LAST,
 | 
			
		||||
                  G_STRUCT_OFFSET (ClutterDropActionClass, over_out),
 | 
			
		||||
                  NULL, NULL, NULL,
 | 
			
		||||
                  NULL, NULL,
 | 
			
		||||
                  _clutter_marshal_VOID__OBJECT,
 | 
			
		||||
                  G_TYPE_NONE, 1,
 | 
			
		||||
                  CLUTTER_TYPE_ACTOR);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -5,18 +5,15 @@
 | 
			
		||||
 | 
			
		||||
G_BEGIN_DECLS
 | 
			
		||||
 | 
			
		||||
gboolean        _clutter_effect_pre_paint               (ClutterEffect           *effect,
 | 
			
		||||
                                                         ClutterPaintContext     *paint_context);
 | 
			
		||||
void            _clutter_effect_post_paint              (ClutterEffect           *effect,
 | 
			
		||||
                                                         ClutterPaintContext     *paint_context);
 | 
			
		||||
gboolean        _clutter_effect_modify_paint_volume     (ClutterEffect           *effect,
 | 
			
		||||
gboolean        _clutter_effect_pre_paint               (ClutterEffect           *effect);
 | 
			
		||||
void            _clutter_effect_post_paint              (ClutterEffect           *effect);
 | 
			
		||||
gboolean        _clutter_effect_get_paint_volume        (ClutterEffect           *effect,
 | 
			
		||||
                                                         ClutterPaintVolume      *volume);
 | 
			
		||||
gboolean        _clutter_effect_has_custom_paint_volume (ClutterEffect           *effect);
 | 
			
		||||
void            _clutter_effect_paint                   (ClutterEffect           *effect,
 | 
			
		||||
                                                         ClutterPaintContext     *paint_context,
 | 
			
		||||
                                                         ClutterEffectPaintFlags  flags);
 | 
			
		||||
void            _clutter_effect_pick                    (ClutterEffect           *effect,
 | 
			
		||||
                                                         ClutterPickContext      *pick_context);
 | 
			
		||||
                                                         ClutterEffectPaintFlags  flags);
 | 
			
		||||
 | 
			
		||||
G_END_DECLS
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -100,13 +100,13 @@
 | 
			
		||||
 *    // Clear the previous state //
 | 
			
		||||
 *    if (self->rect_1)
 | 
			
		||||
 *      {
 | 
			
		||||
 *        cogl_object_unref (self->rect_1);
 | 
			
		||||
 *        cogl_handle_unref (self->rect_1);
 | 
			
		||||
 *        self->rect_1 = NULL;
 | 
			
		||||
 *      }
 | 
			
		||||
 *
 | 
			
		||||
 *    if (self->rect_2)
 | 
			
		||||
 *      {
 | 
			
		||||
 *        cogl_object_unref (self->rect_2);
 | 
			
		||||
 *        cogl_handle_unref (self->rect_2);
 | 
			
		||||
 *        self->rect_2 = NULL;
 | 
			
		||||
 *      }
 | 
			
		||||
 *
 | 
			
		||||
@@ -177,28 +177,25 @@ G_DEFINE_ABSTRACT_TYPE (ClutterEffect,
 | 
			
		||||
                        CLUTTER_TYPE_ACTOR_META);
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
clutter_effect_real_pre_paint (ClutterEffect       *effect,
 | 
			
		||||
                               ClutterPaintContext *paint_context)
 | 
			
		||||
clutter_effect_real_pre_paint (ClutterEffect *effect)
 | 
			
		||||
{
 | 
			
		||||
  return TRUE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_effect_real_post_paint (ClutterEffect       *effect,
 | 
			
		||||
                                ClutterPaintContext *paint_context)
 | 
			
		||||
clutter_effect_real_post_paint (ClutterEffect *effect)
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
clutter_effect_real_modify_paint_volume (ClutterEffect      *effect,
 | 
			
		||||
                                         ClutterPaintVolume *volume)
 | 
			
		||||
clutter_effect_real_get_paint_volume (ClutterEffect      *effect,
 | 
			
		||||
                                      ClutterPaintVolume *volume)
 | 
			
		||||
{
 | 
			
		||||
  return TRUE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_effect_real_paint (ClutterEffect           *effect,
 | 
			
		||||
                           ClutterPaintContext     *paint_context,
 | 
			
		||||
                           ClutterEffectPaintFlags  flags)
 | 
			
		||||
{
 | 
			
		||||
  ClutterActorMeta *actor_meta = CLUTTER_ACTOR_META (effect);
 | 
			
		||||
@@ -209,24 +206,24 @@ clutter_effect_real_paint (ClutterEffect           *effect,
 | 
			
		||||
     effects that haven't migrated to use the 'paint' virtual yet. This
 | 
			
		||||
     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);
 | 
			
		||||
  clutter_actor_continue_paint (actor, paint_context);
 | 
			
		||||
  clutter_actor_continue_paint (actor);
 | 
			
		||||
 | 
			
		||||
  if (pre_paint_succeeded)
 | 
			
		||||
    _clutter_effect_post_paint (effect, paint_context);
 | 
			
		||||
    _clutter_effect_post_paint (effect);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_effect_real_pick (ClutterEffect      *effect,
 | 
			
		||||
                          ClutterPickContext *pick_context)
 | 
			
		||||
clutter_effect_real_pick (ClutterEffect           *effect,
 | 
			
		||||
                          ClutterEffectPaintFlags  flags)
 | 
			
		||||
{
 | 
			
		||||
  ClutterActorMeta *actor_meta = CLUTTER_ACTOR_META (effect);
 | 
			
		||||
  ClutterActor *actor;
 | 
			
		||||
 | 
			
		||||
  actor = clutter_actor_meta_get_actor (actor_meta);
 | 
			
		||||
  clutter_actor_continue_pick (actor, pick_context);
 | 
			
		||||
  clutter_actor_continue_paint (actor);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
@@ -255,7 +252,7 @@ clutter_effect_class_init (ClutterEffectClass *klass)
 | 
			
		||||
 | 
			
		||||
  klass->pre_paint = clutter_effect_real_pre_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->pick = clutter_effect_real_pick;
 | 
			
		||||
}
 | 
			
		||||
@@ -266,51 +263,47 @@ clutter_effect_init (ClutterEffect *self)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
gboolean
 | 
			
		||||
_clutter_effect_pre_paint (ClutterEffect       *effect,
 | 
			
		||||
                           ClutterPaintContext *paint_context)
 | 
			
		||||
_clutter_effect_pre_paint (ClutterEffect *effect)
 | 
			
		||||
{
 | 
			
		||||
  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
 | 
			
		||||
_clutter_effect_post_paint (ClutterEffect       *effect,
 | 
			
		||||
                            ClutterPaintContext *paint_context)
 | 
			
		||||
_clutter_effect_post_paint (ClutterEffect *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
 | 
			
		||||
_clutter_effect_paint (ClutterEffect           *effect,
 | 
			
		||||
                       ClutterPaintContext     *paint_context,
 | 
			
		||||
                       ClutterEffectPaintFlags  flags)
 | 
			
		||||
{
 | 
			
		||||
  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
 | 
			
		||||
_clutter_effect_pick (ClutterEffect      *effect,
 | 
			
		||||
                      ClutterPickContext *pick_context)
 | 
			
		||||
_clutter_effect_pick (ClutterEffect           *effect,
 | 
			
		||||
                      ClutterEffectPaintFlags  flags)
 | 
			
		||||
{
 | 
			
		||||
  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
 | 
			
		||||
_clutter_effect_modify_paint_volume (ClutterEffect      *effect,
 | 
			
		||||
                                     ClutterPaintVolume *volume)
 | 
			
		||||
_clutter_effect_get_paint_volume (ClutterEffect      *effect,
 | 
			
		||||
                                  ClutterPaintVolume *volume)
 | 
			
		||||
{
 | 
			
		||||
  g_return_val_if_fail (CLUTTER_IS_EFFECT (effect), FALSE);
 | 
			
		||||
  g_return_val_if_fail (volume != NULL, FALSE);
 | 
			
		||||
 | 
			
		||||
  return CLUTTER_EFFECT_GET_CLASS (effect)->modify_paint_volume (effect,
 | 
			
		||||
                                                                 volume);
 | 
			
		||||
  return CLUTTER_EFFECT_GET_CLASS (effect)->get_paint_volume (effect, volume);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
gboolean
 | 
			
		||||
@@ -318,7 +311,7 @@ _clutter_effect_has_custom_paint_volume (ClutterEffect *effect)
 | 
			
		||||
{
 | 
			
		||||
  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;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 
 | 
			
		||||
@@ -30,8 +30,6 @@
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include <clutter/clutter-actor-meta.h>
 | 
			
		||||
#include <clutter/clutter-paint-context.h>
 | 
			
		||||
#include <clutter/clutter-pick-context.h>
 | 
			
		||||
 | 
			
		||||
G_BEGIN_DECLS
 | 
			
		||||
 | 
			
		||||
@@ -62,7 +60,7 @@ struct _ClutterEffect
 | 
			
		||||
 * ClutterEffectClass:
 | 
			
		||||
 * @pre_paint: virtual function
 | 
			
		||||
 * @post_paint: virtual function
 | 
			
		||||
 * @modify_paint_volume: virtual function
 | 
			
		||||
 * @get_paint_volume: virtual function
 | 
			
		||||
 * @paint: virtual function
 | 
			
		||||
 * @pick: virtual function
 | 
			
		||||
 *
 | 
			
		||||
@@ -76,19 +74,16 @@ struct _ClutterEffectClass
 | 
			
		||||
  ClutterActorMetaClass parent_class;
 | 
			
		||||
 | 
			
		||||
  /*< public >*/
 | 
			
		||||
  gboolean (* pre_paint)           (ClutterEffect           *effect,
 | 
			
		||||
                                    ClutterPaintContext     *paint_context);
 | 
			
		||||
  void     (* post_paint)          (ClutterEffect           *effect,
 | 
			
		||||
                                    ClutterPaintContext     *paint_context);
 | 
			
		||||
  gboolean (* pre_paint)        (ClutterEffect           *effect);
 | 
			
		||||
  void     (* post_paint)       (ClutterEffect           *effect);
 | 
			
		||||
 | 
			
		||||
  gboolean (* modify_paint_volume) (ClutterEffect           *effect,
 | 
			
		||||
                                    ClutterPaintVolume      *volume);
 | 
			
		||||
  gboolean (* get_paint_volume) (ClutterEffect           *effect,
 | 
			
		||||
                                 ClutterPaintVolume      *volume);
 | 
			
		||||
 | 
			
		||||
  void     (* paint)               (ClutterEffect           *effect,
 | 
			
		||||
                                    ClutterPaintContext     *paint_context,
 | 
			
		||||
                                    ClutterEffectPaintFlags  flags);
 | 
			
		||||
  void     (* pick)                (ClutterEffect           *effect,
 | 
			
		||||
                                    ClutterPickContext      *pick_context);
 | 
			
		||||
  void     (* paint)            (ClutterEffect           *effect,
 | 
			
		||||
                                 ClutterEffectPaintFlags  flags);
 | 
			
		||||
  void     (* pick)             (ClutterEffect           *effect,
 | 
			
		||||
                                 ClutterEffectPaintFlags  flags);
 | 
			
		||||
 | 
			
		||||
  /*< private >*/
 | 
			
		||||
  void (* _clutter_effect4) (void);
 | 
			
		||||
 
 | 
			
		||||
@@ -13,7 +13,7 @@ G_BEGIN_DECLS
 | 
			
		||||
/*** END file-header ***/
 | 
			
		||||
 | 
			
		||||
/*** BEGIN file-production ***/
 | 
			
		||||
/* enumerations from "@basename@" */
 | 
			
		||||
/* enumerations from "@filename@" */
 | 
			
		||||
/*** END file-production ***/
 | 
			
		||||
 | 
			
		||||
/*** BEGIN value-header ***/
 | 
			
		||||
 
 | 
			
		||||
@@ -51,8 +51,7 @@ G_BEGIN_DECLS
 | 
			
		||||
 *
 | 
			
		||||
 * 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_NORTH,
 | 
			
		||||
  CLUTTER_GRAVITY_NORTH_EAST,
 | 
			
		||||
@@ -75,8 +74,7 @@ typedef enum /*< prefix=CLUTTER_GRAVITY >*/
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 0.4
 | 
			
		||||
 */
 | 
			
		||||
typedef enum /*< prefix=CLUTTER >*/
 | 
			
		||||
{
 | 
			
		||||
typedef enum { /*< prefix=CLUTTER >*/
 | 
			
		||||
  CLUTTER_X_AXIS,
 | 
			
		||||
  CLUTTER_Y_AXIS,
 | 
			
		||||
  CLUTTER_Z_AXIS
 | 
			
		||||
@@ -93,8 +91,7 @@ typedef enum /*< prefix=CLUTTER >*/
 | 
			
		||||
 *
 | 
			
		||||
 * Deprecated: 1.22
 | 
			
		||||
 */
 | 
			
		||||
typedef enum /*< prefix=CLUTTER_ROTATE >*/
 | 
			
		||||
{
 | 
			
		||||
typedef enum { /*< prefix=CLUTTER_ROTATE >*/
 | 
			
		||||
  CLUTTER_ROTATE_CW,
 | 
			
		||||
  CLUTTER_ROTATE_CCW
 | 
			
		||||
} ClutterRotateDirection;
 | 
			
		||||
@@ -110,8 +107,7 @@ typedef enum /*< prefix=CLUTTER_ROTATE >*/
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 0.8
 | 
			
		||||
 */
 | 
			
		||||
typedef enum /*< prefix=CLUTTER_REQUEST >*/
 | 
			
		||||
{
 | 
			
		||||
typedef enum { /*< prefix=CLUTTER_REQUEST >*/
 | 
			
		||||
  CLUTTER_REQUEST_HEIGHT_FOR_WIDTH,
 | 
			
		||||
  CLUTTER_REQUEST_WIDTH_FOR_HEIGHT,
 | 
			
		||||
  CLUTTER_REQUEST_CONTENT_SIZE
 | 
			
		||||
@@ -204,8 +200,7 @@ typedef enum /*< prefix=CLUTTER_REQUEST >*/
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 1.0
 | 
			
		||||
 */
 | 
			
		||||
typedef enum
 | 
			
		||||
{
 | 
			
		||||
typedef enum {
 | 
			
		||||
  CLUTTER_CUSTOM_MODE = 0,
 | 
			
		||||
 | 
			
		||||
  /* linear */
 | 
			
		||||
@@ -277,6 +272,23 @@ typedef enum
 | 
			
		||||
  CLUTTER_ANIMATION_LAST
 | 
			
		||||
} 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:
 | 
			
		||||
 * @CLUTTER_TEXT_DIRECTION_DEFAULT: Use the default setting, as returned
 | 
			
		||||
@@ -288,8 +300,7 @@ typedef enum
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 1.2
 | 
			
		||||
 */
 | 
			
		||||
typedef enum
 | 
			
		||||
{
 | 
			
		||||
typedef enum {
 | 
			
		||||
  CLUTTER_TEXT_DIRECTION_DEFAULT,
 | 
			
		||||
  CLUTTER_TEXT_DIRECTION_LTR,
 | 
			
		||||
  CLUTTER_TEXT_DIRECTION_RTL
 | 
			
		||||
@@ -304,8 +315,7 @@ typedef enum
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 1.4
 | 
			
		||||
 */
 | 
			
		||||
typedef enum
 | 
			
		||||
{
 | 
			
		||||
typedef enum {
 | 
			
		||||
  CLUTTER_VERTEX_SHADER,
 | 
			
		||||
  CLUTTER_FRAGMENT_SHADER
 | 
			
		||||
} ClutterShaderType;
 | 
			
		||||
@@ -340,8 +350,7 @@ typedef enum
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 0.4
 | 
			
		||||
 */
 | 
			
		||||
typedef enum
 | 
			
		||||
{
 | 
			
		||||
typedef enum {
 | 
			
		||||
  CLUTTER_SHIFT_MASK    = 1 << 0,
 | 
			
		||||
  CLUTTER_LOCK_MASK     = 1 << 1,
 | 
			
		||||
  CLUTTER_CONTROL_MASK  = 1 << 2,
 | 
			
		||||
@@ -407,8 +416,7 @@ typedef enum
 | 
			
		||||
 * Keyboard accessibility features applied to a ClutterInputDevice keyboard.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
typedef enum
 | 
			
		||||
{
 | 
			
		||||
typedef enum {
 | 
			
		||||
  CLUTTER_A11Y_KEYBOARD_ENABLED          = 1 << 0,
 | 
			
		||||
  CLUTTER_A11Y_TIMEOUT_ENABLED           = 1 << 1,
 | 
			
		||||
  CLUTTER_A11Y_MOUSE_KEYS_ENABLED        = 1 << 2,
 | 
			
		||||
@@ -425,88 +433,6 @@ typedef enum
 | 
			
		||||
  CLUTTER_A11Y_FEATURE_STATE_CHANGE_BEEP = 1 << 13,
 | 
			
		||||
} 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:
 | 
			
		||||
 * @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.
 | 
			
		||||
 */
 | 
			
		||||
typedef enum /*< prefix=CLUTTER_ACTOR >*/
 | 
			
		||||
{
 | 
			
		||||
typedef enum { /*< prefix=CLUTTER_ACTOR >*/
 | 
			
		||||
  CLUTTER_ACTOR_MAPPED    = 1 << 1,
 | 
			
		||||
  CLUTTER_ACTOR_REALIZED  = 1 << 2,
 | 
			
		||||
  CLUTTER_ACTOR_REACTIVE  = 1 << 3,
 | 
			
		||||
@@ -535,23 +460,17 @@ typedef enum /*< prefix=CLUTTER_ACTOR >*/
 | 
			
		||||
 * ClutterOffscreenRedirect:
 | 
			
		||||
 * @CLUTTER_OFFSCREEN_REDIRECT_AUTOMATIC_FOR_OPACITY: Only redirect
 | 
			
		||||
 *   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
 | 
			
		||||
 *   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().
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 1.8
 | 
			
		||||
 */
 | 
			
		||||
typedef enum /*< prefix=CLUTTER_OFFSCREEN_REDIRECT >*/
 | 
			
		||||
{
 | 
			
		||||
  CLUTTER_OFFSCREEN_REDIRECT_AUTOMATIC_FOR_OPACITY = 1 << 0,
 | 
			
		||||
  CLUTTER_OFFSCREEN_REDIRECT_ALWAYS                = 1 << 1,
 | 
			
		||||
  CLUTTER_OFFSCREEN_REDIRECT_ON_IDLE               = 1 << 2
 | 
			
		||||
typedef enum { /*< prefix=CLUTTER_OFFSCREEN_REDIRECT >*/
 | 
			
		||||
  CLUTTER_OFFSCREEN_REDIRECT_AUTOMATIC_FOR_OPACITY = 1<<0,
 | 
			
		||||
  CLUTTER_OFFSCREEN_REDIRECT_ALWAYS = 1<<1
 | 
			
		||||
} ClutterOffscreenRedirect;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -573,8 +492,7 @@ typedef enum /*< prefix=CLUTTER_OFFSCREEN_REDIRECT >*/
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 1.0
 | 
			
		||||
 */
 | 
			
		||||
typedef enum
 | 
			
		||||
{
 | 
			
		||||
typedef enum {
 | 
			
		||||
  CLUTTER_ALLOCATION_NONE         = 0,
 | 
			
		||||
  CLUTTER_ABSOLUTE_ORIGIN_CHANGED = 1 << 1,
 | 
			
		||||
  CLUTTER_DELEGATE_LAYOUT         = 1 << 2
 | 
			
		||||
@@ -591,8 +509,7 @@ typedef enum
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 1.4
 | 
			
		||||
 */
 | 
			
		||||
typedef enum /*< prefix=CLUTTER_ALIGN >*/
 | 
			
		||||
{
 | 
			
		||||
typedef enum { /*< prefix=CLUTTER_ALIGN >*/
 | 
			
		||||
  CLUTTER_ALIGN_X_AXIS,
 | 
			
		||||
  CLUTTER_ALIGN_Y_AXIS,
 | 
			
		||||
  CLUTTER_ALIGN_BOTH
 | 
			
		||||
@@ -609,8 +526,7 @@ typedef enum /*< prefix=CLUTTER_ALIGN >*/
 | 
			
		||||
 *
 | 
			
		||||
 * Deprecated: 1.22
 | 
			
		||||
 */
 | 
			
		||||
typedef enum
 | 
			
		||||
{
 | 
			
		||||
typedef enum {
 | 
			
		||||
  CLUTTER_INTERPOLATION_LINEAR,
 | 
			
		||||
  CLUTTER_INTERPOLATION_CUBIC
 | 
			
		||||
} ClutterInterpolation;
 | 
			
		||||
@@ -635,8 +551,7 @@ typedef enum
 | 
			
		||||
 * Deprecated: 1.12: Use #ClutterActorAlign and the #ClutterActor
 | 
			
		||||
 *   API instead
 | 
			
		||||
 */
 | 
			
		||||
typedef enum
 | 
			
		||||
{
 | 
			
		||||
typedef enum {
 | 
			
		||||
  CLUTTER_BIN_ALIGNMENT_FIXED,
 | 
			
		||||
  CLUTTER_BIN_ALIGNMENT_FILL,
 | 
			
		||||
  CLUTTER_BIN_ALIGNMENT_START,
 | 
			
		||||
@@ -661,8 +576,7 @@ typedef enum
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 1.4
 | 
			
		||||
 */
 | 
			
		||||
typedef enum /*< prefix=CLUTTER_BIND >*/
 | 
			
		||||
{
 | 
			
		||||
typedef enum { /*< prefix=CLUTTER_BIND >*/
 | 
			
		||||
  CLUTTER_BIND_X,
 | 
			
		||||
  CLUTTER_BIND_Y,
 | 
			
		||||
  CLUTTER_BIND_WIDTH,
 | 
			
		||||
@@ -678,15 +592,11 @@ typedef enum /*< prefix=CLUTTER_BIND >*/
 | 
			
		||||
 *   has queued a redraw before this paint. This implies that the effect
 | 
			
		||||
 *   should call clutter_actor_continue_paint() to chain to the next
 | 
			
		||||
 *   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.
 | 
			
		||||
 */
 | 
			
		||||
typedef enum /*< prefix=CLUTTER_EFFECT_PAINT >*/
 | 
			
		||||
{
 | 
			
		||||
  CLUTTER_EFFECT_PAINT_ACTOR_DIRTY   = (1 << 0),
 | 
			
		||||
  CLUTTER_EFFECT_PAINT_BYPASS_EFFECT = (1 << 1)
 | 
			
		||||
typedef enum { /*< prefix=CLUTTER_EFFECT_PAINT >*/
 | 
			
		||||
  CLUTTER_EFFECT_PAINT_ACTOR_DIRTY = (1 << 0)
 | 
			
		||||
} ClutterEffectPaintFlags;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -701,8 +611,7 @@ typedef enum /*< prefix=CLUTTER_EFFECT_PAINT >*/
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 1.2
 | 
			
		||||
 */
 | 
			
		||||
typedef enum
 | 
			
		||||
{
 | 
			
		||||
typedef enum {
 | 
			
		||||
  CLUTTER_BOX_ALIGNMENT_START,
 | 
			
		||||
  CLUTTER_BOX_ALIGNMENT_END,
 | 
			
		||||
  CLUTTER_BOX_ALIGNMENT_CENTER
 | 
			
		||||
@@ -719,8 +628,7 @@ typedef enum
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 1.8
 | 
			
		||||
 */
 | 
			
		||||
typedef enum /*< prefix=CLUTTER_LONG_PRESS >*/
 | 
			
		||||
{
 | 
			
		||||
typedef enum { /*< prefix=CLUTTER_LONG_PRESS >*/
 | 
			
		||||
  CLUTTER_LONG_PRESS_QUERY,
 | 
			
		||||
  CLUTTER_LONG_PRESS_ACTIVATE,
 | 
			
		||||
  CLUTTER_LONG_PRESS_CANCEL
 | 
			
		||||
@@ -778,8 +686,7 @@ typedef enum /*< prefix=CLUTTER_LONG_PRESS >*/
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 1.6
 | 
			
		||||
 */
 | 
			
		||||
typedef enum /*< prefix=CLUTTER_COLOR >*/
 | 
			
		||||
{
 | 
			
		||||
typedef enum { /*< prefix=CLUTTER_COLOR >*/
 | 
			
		||||
  /* CGA/EGA-like palette */
 | 
			
		||||
  CLUTTER_COLOR_WHITE           = 0,
 | 
			
		||||
  CLUTTER_COLOR_BLACK,
 | 
			
		||||
@@ -843,8 +750,7 @@ typedef enum /*< prefix=CLUTTER_COLOR >*/
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 1.4
 | 
			
		||||
 */
 | 
			
		||||
typedef enum /*< prefix=CLUTTER_DRAG >*/
 | 
			
		||||
{
 | 
			
		||||
typedef enum { /*< prefix=CLUTTER_DRAG >*/
 | 
			
		||||
  CLUTTER_DRAG_AXIS_NONE = 0,
 | 
			
		||||
 | 
			
		||||
  CLUTTER_DRAG_X_AXIS,
 | 
			
		||||
@@ -861,8 +767,7 @@ typedef enum /*< prefix=CLUTTER_DRAG >*/
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 0.6
 | 
			
		||||
 */
 | 
			
		||||
typedef enum /*< flags prefix=CLUTTER_EVENT >*/
 | 
			
		||||
{
 | 
			
		||||
typedef enum { /*< flags prefix=CLUTTER_EVENT >*/
 | 
			
		||||
  CLUTTER_EVENT_NONE              = 0,
 | 
			
		||||
  CLUTTER_EVENT_FLAG_SYNTHETIC    = 1 << 0,
 | 
			
		||||
  CLUTTER_EVENT_FLAG_INPUT_METHOD = 1 << 1,
 | 
			
		||||
@@ -907,8 +812,7 @@ typedef enum /*< flags prefix=CLUTTER_EVENT >*/
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 0.4
 | 
			
		||||
 */
 | 
			
		||||
typedef enum /*< prefix=CLUTTER >*/
 | 
			
		||||
{
 | 
			
		||||
typedef enum { /*< prefix=CLUTTER >*/
 | 
			
		||||
  CLUTTER_NOTHING = 0,
 | 
			
		||||
  CLUTTER_KEY_PRESS,
 | 
			
		||||
  CLUTTER_KEY_RELEASE,
 | 
			
		||||
@@ -953,8 +857,7 @@ typedef enum /*< prefix=CLUTTER >*/
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 0.4
 | 
			
		||||
 */
 | 
			
		||||
typedef enum /*< prefix=CLUTTER_SCROLL >*/
 | 
			
		||||
{
 | 
			
		||||
typedef enum { /*< prefix=CLUTTER_SCROLL >*/
 | 
			
		||||
  CLUTTER_SCROLL_UP,
 | 
			
		||||
  CLUTTER_SCROLL_DOWN,
 | 
			
		||||
  CLUTTER_SCROLL_LEFT,
 | 
			
		||||
@@ -964,21 +867,28 @@ typedef enum /*< prefix=CLUTTER_SCROLL >*/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ClutterStageState:
 | 
			
		||||
 * @CLUTTER_STAGE_STATE_FULLSCREEN: Fullscreen mask
 | 
			
		||||
 * @CLUTTER_STAGE_STATE_OFFSCREEN: Offscreen mask (deprecated)
 | 
			
		||||
 * @CLUTTER_STAGE_STATE_ACTIVATED: Activated mask
 | 
			
		||||
 *
 | 
			
		||||
 * Stage state masks, used by the #ClutterEvent of type %CLUTTER_STAGE_STATE.
 | 
			
		||||
 *
 | 
			
		||||
 * 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)
 | 
			
		||||
} ClutterStageState;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ClutterFeatureFlags:
 | 
			
		||||
 * @CLUTTER_FEATURE_TEXTURE_NPOT: Set if NPOTS textures supported.
 | 
			
		||||
 * @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_USER_RESIZE: Set if stage is able to be user resized.
 | 
			
		||||
 * @CLUTTER_FEATURE_STAGE_CURSOR: Set if stage has a graphical cursor.
 | 
			
		||||
 * @CLUTTER_FEATURE_SHADERS_GLSL: Set if the backend supports GLSL shaders.
 | 
			
		||||
 * @CLUTTER_FEATURE_OFFSCREEN: Set if the backend supports offscreen rendering.
 | 
			
		||||
@@ -992,8 +902,12 @@ typedef enum
 | 
			
		||||
 */
 | 
			
		||||
typedef enum
 | 
			
		||||
{
 | 
			
		||||
  CLUTTER_FEATURE_TEXTURE_NPOT           = (1 << 2),
 | 
			
		||||
  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_USER_RESIZE      = (1 << 7),
 | 
			
		||||
  CLUTTER_FEATURE_STAGE_CURSOR           = (1 << 8),
 | 
			
		||||
  CLUTTER_FEATURE_SHADERS_GLSL           = (1 << 9),
 | 
			
		||||
  CLUTTER_FEATURE_OFFSCREEN              = (1 << 10),
 | 
			
		||||
@@ -1013,8 +927,7 @@ typedef enum
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 1.2
 | 
			
		||||
 */
 | 
			
		||||
typedef enum /*< prefix=CLUTTER_FLOW >*/
 | 
			
		||||
{
 | 
			
		||||
typedef enum { /*< prefix=CLUTTER_FLOW >*/
 | 
			
		||||
  CLUTTER_FLOW_HORIZONTAL,
 | 
			
		||||
  CLUTTER_FLOW_VERTICAL
 | 
			
		||||
} ClutterFlowOrientation;
 | 
			
		||||
@@ -1041,8 +954,7 @@ typedef enum /*< prefix=CLUTTER_FLOW >*/
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 1.0
 | 
			
		||||
 */
 | 
			
		||||
typedef enum
 | 
			
		||||
{
 | 
			
		||||
typedef enum {
 | 
			
		||||
  CLUTTER_POINTER_DEVICE,
 | 
			
		||||
  CLUTTER_KEYBOARD_DEVICE,
 | 
			
		||||
  CLUTTER_EXTENSION_DEVICE,
 | 
			
		||||
@@ -1070,8 +982,7 @@ typedef enum
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 1.6
 | 
			
		||||
 */
 | 
			
		||||
typedef enum
 | 
			
		||||
{
 | 
			
		||||
typedef enum {
 | 
			
		||||
  CLUTTER_INPUT_MODE_MASTER,
 | 
			
		||||
  CLUTTER_INPUT_MODE_SLAVE,
 | 
			
		||||
  CLUTTER_INPUT_MODE_FLOATING
 | 
			
		||||
@@ -1096,8 +1007,7 @@ typedef enum
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 1.6
 | 
			
		||||
 */
 | 
			
		||||
typedef enum
 | 
			
		||||
{
 | 
			
		||||
typedef enum {
 | 
			
		||||
  CLUTTER_INPUT_AXIS_IGNORE,
 | 
			
		||||
 | 
			
		||||
  CLUTTER_INPUT_AXIS_X,
 | 
			
		||||
@@ -1124,8 +1034,7 @@ typedef enum
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 1.6
 | 
			
		||||
 */
 | 
			
		||||
typedef enum
 | 
			
		||||
{
 | 
			
		||||
typedef enum {
 | 
			
		||||
  CLUTTER_SNAP_EDGE_TOP,
 | 
			
		||||
  CLUTTER_SNAP_EDGE_RIGHT,
 | 
			
		||||
  CLUTTER_SNAP_EDGE_BOTTOM,
 | 
			
		||||
@@ -1142,8 +1051,7 @@ typedef enum
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 1.0
 | 
			
		||||
 */
 | 
			
		||||
typedef enum
 | 
			
		||||
{
 | 
			
		||||
typedef enum {
 | 
			
		||||
  CLUTTER_PICK_NONE = 0,
 | 
			
		||||
  CLUTTER_PICK_REACTIVE,
 | 
			
		||||
  CLUTTER_PICK_ALL
 | 
			
		||||
@@ -1160,8 +1068,7 @@ typedef enum
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 1.8
 | 
			
		||||
 */
 | 
			
		||||
typedef enum /*< prefix=CLUTTER_SWIPE_DIRECTION >*/
 | 
			
		||||
{
 | 
			
		||||
typedef enum { /*< prefix=CLUTTER_SWIPE_DIRECTION >*/
 | 
			
		||||
  CLUTTER_SWIPE_DIRECTION_UP    = 1 << 0,
 | 
			
		||||
  CLUTTER_SWIPE_DIRECTION_DOWN  = 1 << 1,
 | 
			
		||||
  CLUTTER_SWIPE_DIRECTION_LEFT  = 1 << 2,
 | 
			
		||||
@@ -1181,8 +1088,7 @@ typedef enum /*< prefix=CLUTTER_SWIPE_DIRECTION >*/
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 1.12
 | 
			
		||||
 */
 | 
			
		||||
typedef enum /*< prefix=CLUTTER_PAN >*/
 | 
			
		||||
{
 | 
			
		||||
typedef enum { /*< prefix=CLUTTER_PAN >*/
 | 
			
		||||
  CLUTTER_PAN_AXIS_NONE = 0,
 | 
			
		||||
 | 
			
		||||
  CLUTTER_PAN_X_AXIS,
 | 
			
		||||
@@ -1191,6 +1097,28 @@ typedef enum /*< prefix=CLUTTER_PAN >*/
 | 
			
		||||
  CLUTTER_PAN_AXIS_AUTO
 | 
			
		||||
} 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:
 | 
			
		||||
 * @CLUTTER_TEXTURE_NONE: No flags
 | 
			
		||||
@@ -1198,15 +1126,15 @@ typedef enum /*< prefix=CLUTTER_PAN >*/
 | 
			
		||||
 * @CLUTTER_TEXTURE_RGB_FLAG_PREMULT: 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
 | 
			
		||||
 *
 | 
			
		||||
 * Deprecated: 1.22: The #ClutterTexture class was the only user of
 | 
			
		||||
 *   this API
 | 
			
		||||
 */
 | 
			
		||||
typedef enum /*< prefix=CLUTTER_TEXTURE >*/
 | 
			
		||||
{
 | 
			
		||||
typedef enum { /*< prefix=CLUTTER_TEXTURE >*/
 | 
			
		||||
  CLUTTER_TEXTURE_NONE             = 0,
 | 
			
		||||
  CLUTTER_TEXTURE_RGB_FLAG_BGR     = 1 << 1,
 | 
			
		||||
  CLUTTER_TEXTURE_RGB_FLAG_PREMULT = 1 << 2, /* FIXME: not handled */
 | 
			
		||||
@@ -1230,8 +1158,7 @@ typedef enum /*< prefix=CLUTTER_TEXTURE >*/
 | 
			
		||||
 *   this API; use #ClutterImage and clutter_actor_set_content_scaling_filters()
 | 
			
		||||
 *   instead.
 | 
			
		||||
 */
 | 
			
		||||
typedef enum /*< prefix=CLUTTER_TEXTURE_QUALITY >*/
 | 
			
		||||
{
 | 
			
		||||
typedef enum { /*< prefix=CLUTTER_TEXTURE_QUALITY >*/
 | 
			
		||||
  CLUTTER_TEXTURE_QUALITY_LOW,
 | 
			
		||||
  CLUTTER_TEXTURE_QUALITY_MEDIUM,
 | 
			
		||||
  CLUTTER_TEXTURE_QUALITY_HIGH
 | 
			
		||||
@@ -1246,8 +1173,7 @@ typedef enum /*< prefix=CLUTTER_TEXTURE_QUALITY >*/
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 0.6
 | 
			
		||||
 */
 | 
			
		||||
typedef enum
 | 
			
		||||
{
 | 
			
		||||
typedef enum {
 | 
			
		||||
  CLUTTER_TIMELINE_FORWARD,
 | 
			
		||||
  CLUTTER_TIMELINE_BACKWARD
 | 
			
		||||
} ClutterTimelineDirection;
 | 
			
		||||
@@ -1266,8 +1192,7 @@ typedef enum
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 1.0
 | 
			
		||||
 */
 | 
			
		||||
typedef enum /*< prefix=CLUTTER_UNIT >*/
 | 
			
		||||
{
 | 
			
		||||
typedef enum { /*< prefix=CLUTTER_UNIT >*/
 | 
			
		||||
  CLUTTER_UNIT_PIXEL,
 | 
			
		||||
  CLUTTER_UNIT_EM,
 | 
			
		||||
  CLUTTER_UNIT_MM,
 | 
			
		||||
@@ -1297,8 +1222,7 @@ typedef enum /*< prefix=CLUTTER_UNIT >*/
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 1.0
 | 
			
		||||
 */
 | 
			
		||||
typedef enum
 | 
			
		||||
{
 | 
			
		||||
typedef enum {
 | 
			
		||||
  CLUTTER_PATH_MOVE_TO      = 0,
 | 
			
		||||
  CLUTTER_PATH_LINE_TO      = 1,
 | 
			
		||||
  CLUTTER_PATH_CURVE_TO     = 2,
 | 
			
		||||
@@ -1329,8 +1253,7 @@ typedef enum
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 1.10
 | 
			
		||||
 */
 | 
			
		||||
typedef enum
 | 
			
		||||
{
 | 
			
		||||
typedef enum {
 | 
			
		||||
  CLUTTER_ACTOR_ALIGN_FILL,
 | 
			
		||||
  CLUTTER_ACTOR_ALIGN_START,
 | 
			
		||||
  CLUTTER_ACTOR_ALIGN_CENTER,
 | 
			
		||||
@@ -1350,8 +1273,7 @@ typedef enum
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 1.10
 | 
			
		||||
 */
 | 
			
		||||
typedef enum
 | 
			
		||||
{
 | 
			
		||||
typedef enum {
 | 
			
		||||
  CLUTTER_REPAINT_FLAGS_PRE_PAINT = 1 << 0,
 | 
			
		||||
  CLUTTER_REPAINT_FLAGS_POST_PAINT = 1 << 1,
 | 
			
		||||
  CLUTTER_REPAINT_FLAGS_QUEUE_REDRAW_ON_ADD = 1 << 2
 | 
			
		||||
@@ -1376,8 +1298,7 @@ typedef enum
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 1.10
 | 
			
		||||
 */
 | 
			
		||||
typedef enum
 | 
			
		||||
{
 | 
			
		||||
typedef enum {
 | 
			
		||||
  CLUTTER_CONTENT_GRAVITY_TOP_LEFT,
 | 
			
		||||
  CLUTTER_CONTENT_GRAVITY_TOP,
 | 
			
		||||
  CLUTTER_CONTENT_GRAVITY_TOP_RIGHT,
 | 
			
		||||
@@ -1407,8 +1328,7 @@ typedef enum
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 1.10
 | 
			
		||||
 */
 | 
			
		||||
typedef enum
 | 
			
		||||
{
 | 
			
		||||
typedef enum {
 | 
			
		||||
  CLUTTER_SCALING_FILTER_LINEAR,
 | 
			
		||||
  CLUTTER_SCALING_FILTER_NEAREST,
 | 
			
		||||
  CLUTTER_SCALING_FILTER_TRILINEAR
 | 
			
		||||
@@ -1423,8 +1343,7 @@ typedef enum
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 1.12
 | 
			
		||||
 */
 | 
			
		||||
typedef enum
 | 
			
		||||
{
 | 
			
		||||
typedef enum {
 | 
			
		||||
  CLUTTER_ORIENTATION_HORIZONTAL,
 | 
			
		||||
  CLUTTER_ORIENTATION_VERTICAL
 | 
			
		||||
} ClutterOrientation;
 | 
			
		||||
@@ -1440,8 +1359,7 @@ typedef enum
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 1.12
 | 
			
		||||
 */
 | 
			
		||||
typedef enum /*< prefix=CLUTTER_SCROLL >*/
 | 
			
		||||
{
 | 
			
		||||
typedef enum { /*< prefix=CLUTTER_SCROLL >*/
 | 
			
		||||
  CLUTTER_SCROLL_NONE         = 0,
 | 
			
		||||
 | 
			
		||||
  CLUTTER_SCROLL_HORIZONTALLY = 1 << 0,
 | 
			
		||||
@@ -1461,8 +1379,7 @@ typedef enum /*< prefix=CLUTTER_SCROLL >*/
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 1.12
 | 
			
		||||
 */
 | 
			
		||||
typedef enum
 | 
			
		||||
{
 | 
			
		||||
typedef enum {
 | 
			
		||||
  CLUTTER_GRID_POSITION_LEFT,
 | 
			
		||||
  CLUTTER_GRID_POSITION_RIGHT,
 | 
			
		||||
  CLUTTER_GRID_POSITION_TOP,
 | 
			
		||||
@@ -1480,8 +1397,7 @@ typedef enum
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 1.12
 | 
			
		||||
 */
 | 
			
		||||
typedef enum
 | 
			
		||||
{
 | 
			
		||||
typedef enum {
 | 
			
		||||
  CLUTTER_REPEAT_NONE   = 0,
 | 
			
		||||
  CLUTTER_REPEAT_X_AXIS = 1 << 0,
 | 
			
		||||
  CLUTTER_REPEAT_Y_AXIS = 1 << 1,
 | 
			
		||||
@@ -1503,8 +1419,7 @@ typedef enum
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 1.12
 | 
			
		||||
 */
 | 
			
		||||
typedef enum
 | 
			
		||||
{
 | 
			
		||||
typedef enum {
 | 
			
		||||
  CLUTTER_STEP_MODE_START,
 | 
			
		||||
  CLUTTER_STEP_MODE_END
 | 
			
		||||
} ClutterStepMode;
 | 
			
		||||
@@ -1520,8 +1435,7 @@ typedef enum
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 1.12
 | 
			
		||||
 */
 | 
			
		||||
typedef enum /*< prefix=CLUTTER_ZOOM >*/
 | 
			
		||||
{
 | 
			
		||||
typedef enum { /*< prefix=CLUTTER_ZOOM >*/
 | 
			
		||||
  CLUTTER_ZOOM_X_AXIS,
 | 
			
		||||
  CLUTTER_ZOOM_Y_AXIS,
 | 
			
		||||
  CLUTTER_ZOOM_BOTH
 | 
			
		||||
@@ -1544,8 +1458,7 @@ typedef enum /*< prefix=CLUTTER_ZOOM >*/
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 1.18
 | 
			
		||||
 */
 | 
			
		||||
typedef enum
 | 
			
		||||
{
 | 
			
		||||
typedef enum {
 | 
			
		||||
  CLUTTER_GESTURE_TRIGGER_EDGE_NONE  = 0,
 | 
			
		||||
  CLUTTER_GESTURE_TRIGGER_EDGE_AFTER,
 | 
			
		||||
  CLUTTER_GESTURE_TRIGGER_EDGE_BEFORE
 | 
			
		||||
@@ -1581,8 +1494,7 @@ typedef enum
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 1.24
 | 
			
		||||
 */
 | 
			
		||||
typedef enum
 | 
			
		||||
{
 | 
			
		||||
typedef enum {
 | 
			
		||||
  CLUTTER_TOUCHPAD_GESTURE_PHASE_BEGIN,
 | 
			
		||||
  CLUTTER_TOUCHPAD_GESTURE_PHASE_UPDATE,
 | 
			
		||||
  CLUTTER_TOUCHPAD_GESTURE_PHASE_END,
 | 
			
		||||
@@ -1604,8 +1516,7 @@ typedef enum
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 1.26
 | 
			
		||||
 */
 | 
			
		||||
typedef enum
 | 
			
		||||
{
 | 
			
		||||
typedef enum {
 | 
			
		||||
  CLUTTER_SCROLL_SOURCE_UNKNOWN,
 | 
			
		||||
  CLUTTER_SCROLL_SOURCE_WHEEL,
 | 
			
		||||
  CLUTTER_SCROLL_SOURCE_FINGER,
 | 
			
		||||
@@ -1623,8 +1534,7 @@ typedef enum
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 1.26
 | 
			
		||||
 */
 | 
			
		||||
typedef enum
 | 
			
		||||
{
 | 
			
		||||
typedef enum {
 | 
			
		||||
  CLUTTER_SCROLL_FINISHED_NONE       = 0,
 | 
			
		||||
  CLUTTER_SCROLL_FINISHED_HORIZONTAL = 1 << 0,
 | 
			
		||||
  CLUTTER_SCROLL_FINISHED_VERTICAL   = 1 << 1
 | 
			
		||||
@@ -1645,8 +1555,7 @@ typedef enum
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 1.28
 | 
			
		||||
 */
 | 
			
		||||
typedef enum
 | 
			
		||||
{
 | 
			
		||||
typedef enum {
 | 
			
		||||
  CLUTTER_INPUT_DEVICE_TOOL_NONE,
 | 
			
		||||
  CLUTTER_INPUT_DEVICE_TOOL_PEN,
 | 
			
		||||
  CLUTTER_INPUT_DEVICE_TOOL_ERASER,
 | 
			
		||||
@@ -1657,20 +1566,17 @@ typedef enum
 | 
			
		||||
  CLUTTER_INPUT_DEVICE_TOOL_LENS
 | 
			
		||||
} ClutterInputDeviceToolType;
 | 
			
		||||
 | 
			
		||||
typedef enum
 | 
			
		||||
{
 | 
			
		||||
typedef enum {
 | 
			
		||||
  CLUTTER_INPUT_DEVICE_PAD_SOURCE_UNKNOWN,
 | 
			
		||||
  CLUTTER_INPUT_DEVICE_PAD_SOURCE_FINGER,
 | 
			
		||||
} ClutterInputDevicePadSource;
 | 
			
		||||
 | 
			
		||||
typedef enum
 | 
			
		||||
{
 | 
			
		||||
typedef enum {
 | 
			
		||||
  CLUTTER_INPUT_DEVICE_MAPPING_ABSOLUTE,
 | 
			
		||||
  CLUTTER_INPUT_DEVICE_MAPPING_RELATIVE,
 | 
			
		||||
} ClutterInputDeviceMapping;
 | 
			
		||||
 | 
			
		||||
typedef enum
 | 
			
		||||
{
 | 
			
		||||
typedef enum {
 | 
			
		||||
  CLUTTER_INPUT_CONTENT_HINT_COMPLETION          = 1 << 0,
 | 
			
		||||
  CLUTTER_INPUT_CONTENT_HINT_SPELLCHECK          = 1 << 1,
 | 
			
		||||
  CLUTTER_INPUT_CONTENT_HINT_AUTO_CAPITALIZATION = 1 << 2,
 | 
			
		||||
@@ -1683,8 +1589,7 @@ typedef enum
 | 
			
		||||
  CLUTTER_INPUT_CONTENT_HINT_MULTILINE           = 1 << 9,
 | 
			
		||||
} ClutterInputContentHintFlags;
 | 
			
		||||
 | 
			
		||||
typedef enum
 | 
			
		||||
{
 | 
			
		||||
typedef enum {
 | 
			
		||||
  CLUTTER_INPUT_CONTENT_PURPOSE_NORMAL,
 | 
			
		||||
  CLUTTER_INPUT_CONTENT_PURPOSE_ALPHA,
 | 
			
		||||
  CLUTTER_INPUT_CONTENT_PURPOSE_DIGITS,
 | 
			
		||||
@@ -1700,8 +1605,7 @@ typedef enum
 | 
			
		||||
  CLUTTER_INPUT_CONTENT_PURPOSE_TERMINAL,
 | 
			
		||||
} ClutterInputContentPurpose;
 | 
			
		||||
 | 
			
		||||
typedef enum
 | 
			
		||||
{
 | 
			
		||||
typedef enum {
 | 
			
		||||
  CLUTTER_INPUT_PANEL_STATE_OFF,
 | 
			
		||||
  CLUTTER_INPUT_PANEL_STATE_ON,
 | 
			
		||||
  CLUTTER_INPUT_PANEL_STATE_TOGGLE,
 | 
			
		||||
 
 | 
			
		||||
@@ -5,28 +5,22 @@
 | 
			
		||||
 | 
			
		||||
G_BEGIN_DECLS
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void            _clutter_event_set_pointer_emulated     (ClutterEvent       *event,
 | 
			
		||||
                                                         gboolean            is_emulated);
 | 
			
		||||
 | 
			
		||||
/* Reinjecting queued events for processing */
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void            _clutter_process_event                  (ClutterEvent       *event);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
gboolean        _clutter_event_process_filters          (ClutterEvent       *event);
 | 
			
		||||
 | 
			
		||||
/* clears the event queue inside the main context */
 | 
			
		||||
void            _clutter_clear_events_queue             (void);
 | 
			
		||||
void            _clutter_clear_events_queue_for_stage   (ClutterStage       *stage);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void            _clutter_event_set_platform_data        (ClutterEvent       *event,
 | 
			
		||||
                                                         gpointer            data);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
gpointer        _clutter_event_get_platform_data        (const ClutterEvent *event);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void            _clutter_event_set_state_full           (ClutterEvent        *event,
 | 
			
		||||
							 ClutterModifierType  button_state,
 | 
			
		||||
							 ClutterModifierType  base_state,
 | 
			
		||||
@@ -34,7 +28,6 @@ void            _clutter_event_set_state_full           (ClutterEvent        *ev
 | 
			
		||||
							 ClutterModifierType  locked_state,
 | 
			
		||||
							 ClutterModifierType  effective_state);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void            _clutter_event_push                     (const ClutterEvent *event,
 | 
			
		||||
                                                         gboolean            do_copy);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										38
									
								
								clutter/clutter/clutter-event-translator.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								clutter/clutter/clutter-event-translator.c
									
									
									
									
									
										Normal 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);
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										41
									
								
								clutter/clutter/clutter-event-translator.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								clutter/clutter/clutter-event-translator.h
									
									
									
									
									
										Normal 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__ */
 | 
			
		||||
@@ -370,7 +370,7 @@ clutter_event_get_coords (const ClutterEvent *event,
 | 
			
		||||
                          gfloat             *x,
 | 
			
		||||
                          gfloat             *y)
 | 
			
		||||
{
 | 
			
		||||
  graphene_point_t coords;
 | 
			
		||||
  ClutterPoint coords;
 | 
			
		||||
 | 
			
		||||
  g_return_if_fail (event != NULL);
 | 
			
		||||
 | 
			
		||||
@@ -386,15 +386,15 @@ clutter_event_get_coords (const ClutterEvent *event,
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_event_get_position:
 | 
			
		||||
 * @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
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
clutter_event_get_position (const ClutterEvent *event,
 | 
			
		||||
                            graphene_point_t   *position)
 | 
			
		||||
                            ClutterPoint       *position)
 | 
			
		||||
{
 | 
			
		||||
  g_return_if_fail (event != 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_STRIP:
 | 
			
		||||
    case CLUTTER_PAD_RING:
 | 
			
		||||
      graphene_point_init (position, 0.f, 0.f);
 | 
			
		||||
      clutter_point_init (position, 0.f, 0.f);
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
    case CLUTTER_ENTER:
 | 
			
		||||
    case CLUTTER_LEAVE:
 | 
			
		||||
      graphene_point_init (position, event->crossing.x, event->crossing.y);
 | 
			
		||||
      clutter_point_init (position, event->crossing.x, event->crossing.y);
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
    case CLUTTER_BUTTON_PRESS:
 | 
			
		||||
    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;
 | 
			
		||||
 | 
			
		||||
    case CLUTTER_MOTION:
 | 
			
		||||
      graphene_point_init (position, event->motion.x, event->motion.y);
 | 
			
		||||
      clutter_point_init (position, event->motion.x, event->motion.y);
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
    case CLUTTER_TOUCH_BEGIN:
 | 
			
		||||
    case CLUTTER_TOUCH_UPDATE:
 | 
			
		||||
    case CLUTTER_TOUCH_END:
 | 
			
		||||
    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;
 | 
			
		||||
 | 
			
		||||
    case CLUTTER_SCROLL:
 | 
			
		||||
      graphene_point_init (position, event->scroll.x, event->scroll.y);
 | 
			
		||||
      clutter_point_init (position, event->scroll.x, event->scroll.y);
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
    case CLUTTER_TOUCHPAD_PINCH:
 | 
			
		||||
      graphene_point_init (position, event->touchpad_pinch.x,
 | 
			
		||||
                           event->touchpad_pinch.y);
 | 
			
		||||
      clutter_point_init (position, event->touchpad_pinch.x,
 | 
			
		||||
                          event->touchpad_pinch.y);
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
    case CLUTTER_TOUCHPAD_SWIPE:
 | 
			
		||||
      graphene_point_init (position, event->touchpad_swipe.x,
 | 
			
		||||
                           event->touchpad_swipe.y);
 | 
			
		||||
      clutter_point_init (position, event->touchpad_swipe.x,
 | 
			
		||||
                          event->touchpad_swipe.y);
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -1021,9 +1021,6 @@ clutter_event_get_event_sequence (const ClutterEvent *event)
 | 
			
		||||
      event->type == CLUTTER_TOUCH_END ||
 | 
			
		||||
      event->type == CLUTTER_TOUCH_CANCEL)
 | 
			
		||||
    return event->touch.sequence;
 | 
			
		||||
  else if (event->type == CLUTTER_ENTER ||
 | 
			
		||||
           event->type == CLUTTER_LEAVE)
 | 
			
		||||
    return event->crossing.sequence;
 | 
			
		||||
 | 
			
		||||
  return NULL;
 | 
			
		||||
}
 | 
			
		||||
@@ -1796,12 +1793,12 @@ float
 | 
			
		||||
clutter_event_get_distance (const ClutterEvent *source,
 | 
			
		||||
                            const ClutterEvent *target)
 | 
			
		||||
{
 | 
			
		||||
  graphene_point_t p0, p1;
 | 
			
		||||
  ClutterPoint p0, p1;
 | 
			
		||||
 | 
			
		||||
  clutter_event_get_position (source, &p0);
 | 
			
		||||
  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,
 | 
			
		||||
                         const ClutterEvent *target)
 | 
			
		||||
{
 | 
			
		||||
  graphene_point_t p0, p1;
 | 
			
		||||
  ClutterPoint p0, p1;
 | 
			
		||||
  float x_distance, y_distance;
 | 
			
		||||
  double angle;
 | 
			
		||||
 | 
			
		||||
  clutter_event_get_position (source, &p0);
 | 
			
		||||
  clutter_event_get_position (target, &p1);
 | 
			
		||||
 | 
			
		||||
  if (graphene_point_equal (&p0, &p1))
 | 
			
		||||
  if (clutter_point_equals (&p0, &p1))
 | 
			
		||||
    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);
 | 
			
		||||
 | 
			
		||||
@@ -2161,9 +2158,9 @@ clutter_event_get_scroll_source (const ClutterEvent *event)
 | 
			
		||||
ClutterScrollFinishFlags
 | 
			
		||||
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,
 | 
			
		||||
                        CLUTTER_SCROLL_FINISHED_NONE);
 | 
			
		||||
                        CLUTTER_SCROLL_SOURCE_UNKNOWN);
 | 
			
		||||
 | 
			
		||||
  return event->scroll.finish_flags;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -269,7 +269,6 @@ struct _ClutterCrossingEvent
 | 
			
		||||
  gfloat x;
 | 
			
		||||
  gfloat y;
 | 
			
		||||
  ClutterInputDevice *device;
 | 
			
		||||
  ClutterEventSequence *sequence;
 | 
			
		||||
  ClutterActor *related;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@@ -686,7 +685,7 @@ void                    clutter_event_get_coords                (const ClutterEv
 | 
			
		||||
                                                                 gfloat                 *y);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void                    clutter_event_get_position              (const ClutterEvent     *event,
 | 
			
		||||
                                                                 graphene_point_t       *position);
 | 
			
		||||
                                                                 ClutterPoint           *position);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
float                   clutter_event_get_distance              (const ClutterEvent     *source,
 | 
			
		||||
                                                                 const ClutterEvent     *target);
 | 
			
		||||
 
 | 
			
		||||
@@ -33,6 +33,8 @@
 | 
			
		||||
 *
 | 
			
		||||
 * It is possible to ask whether Clutter has support for specific features at
 | 
			
		||||
 * run-time.
 | 
			
		||||
 *
 | 
			
		||||
 * See also cogl_get_features() and #CoglFeatureFlags
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "clutter-build-config.h"
 | 
			
		||||
@@ -58,13 +60,24 @@ typedef struct ClutterFeatures
 | 
			
		||||
static ClutterFeatures* __features = NULL;
 | 
			
		||||
 | 
			
		||||
static ClutterFeatureFlags
 | 
			
		||||
clutter_features_from_cogl (void)
 | 
			
		||||
clutter_features_from_cogl (guint cogl_flags)
 | 
			
		||||
{
 | 
			
		||||
  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;
 | 
			
		||||
}
 | 
			
		||||
@@ -92,7 +105,7 @@ _clutter_feature_init (GError **error)
 | 
			
		||||
  if (!_clutter_backend_create_context (context->backend, error))
 | 
			
		||||
    return FALSE;
 | 
			
		||||
 | 
			
		||||
  __features->flags = (clutter_features_from_cogl ()
 | 
			
		||||
  __features->flags = (clutter_features_from_cogl (cogl_get_features ())
 | 
			
		||||
                    | _clutter_backend_get_features (context->backend));
 | 
			
		||||
 | 
			
		||||
  __features->features_set = TRUE;
 | 
			
		||||
 
 | 
			
		||||
@@ -118,7 +118,7 @@ struct _ClutterGestureActionPrivate
 | 
			
		||||
  gint requested_nb_points;
 | 
			
		||||
  GArray *points;
 | 
			
		||||
 | 
			
		||||
  gulong actor_capture_id;
 | 
			
		||||
  guint actor_capture_id;
 | 
			
		||||
  gulong stage_capture_id;
 | 
			
		||||
 | 
			
		||||
  ClutterGestureTriggerEdge edge;
 | 
			
		||||
@@ -308,7 +308,11 @@ cancel_gesture (ClutterGestureAction *action)
 | 
			
		||||
 | 
			
		||||
  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));
 | 
			
		||||
  g_signal_emit (action, gesture_signals[GESTURE_CANCEL], 0, actor);
 | 
			
		||||
@@ -477,8 +481,11 @@ stage_captured_event_cb (ClutterActor         *stage,
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  if (priv->points->len == 0)
 | 
			
		||||
    g_clear_signal_handler (&priv->stage_capture_id, priv->stage);
 | 
			
		||||
  if (priv->points->len == 0 && priv->stage_capture_id)
 | 
			
		||||
    {
 | 
			
		||||
      g_signal_handler_disconnect (priv->stage, priv->stage_capture_id);
 | 
			
		||||
      priv->stage_capture_id = 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return CLUTTER_EVENT_PROPAGATE;
 | 
			
		||||
}
 | 
			
		||||
@@ -531,7 +538,7 @@ clutter_gesture_action_set_actor (ClutterActorMeta *meta,
 | 
			
		||||
      ClutterActor *old_actor = clutter_actor_meta_get_actor (meta);
 | 
			
		||||
 | 
			
		||||
      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;
 | 
			
		||||
    }
 | 
			
		||||
@@ -539,7 +546,7 @@ clutter_gesture_action_set_actor (ClutterActorMeta *meta,
 | 
			
		||||
  if (priv->stage_capture_id != 0)
 | 
			
		||||
    {
 | 
			
		||||
      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 = NULL;
 | 
			
		||||
@@ -797,7 +804,8 @@ clutter_gesture_action_class_init (ClutterGestureActionClass *klass)
 | 
			
		||||
                  G_TYPE_FROM_CLASS (klass),
 | 
			
		||||
                  G_SIGNAL_RUN_LAST,
 | 
			
		||||
                  G_STRUCT_OFFSET (ClutterGestureActionClass, gesture_end),
 | 
			
		||||
                  NULL, NULL, NULL,
 | 
			
		||||
                  NULL, NULL,
 | 
			
		||||
                  _clutter_marshal_VOID__OBJECT,
 | 
			
		||||
                  G_TYPE_NONE, 1,
 | 
			
		||||
                  CLUTTER_TYPE_ACTOR);
 | 
			
		||||
 | 
			
		||||
@@ -819,7 +827,8 @@ clutter_gesture_action_class_init (ClutterGestureActionClass *klass)
 | 
			
		||||
                  G_TYPE_FROM_CLASS (klass),
 | 
			
		||||
                  G_SIGNAL_RUN_LAST,
 | 
			
		||||
                  G_STRUCT_OFFSET (ClutterGestureActionClass, gesture_cancel),
 | 
			
		||||
                  NULL, NULL, NULL,
 | 
			
		||||
                  NULL, NULL,
 | 
			
		||||
                  _clutter_marshal_VOID__OBJECT,
 | 
			
		||||
                  G_TYPE_NONE, 1,
 | 
			
		||||
                  CLUTTER_TYPE_ACTOR);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -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);
 | 
			
		||||
}
 | 
			
		||||
@@ -44,12 +44,12 @@
 | 
			
		||||
 * SECTION:clutter-grid-layout
 | 
			
		||||
 * @Short_description: A layout manager for a grid of actors
 | 
			
		||||
 * @Title: ClutterGridLayout
 | 
			
		||||
 * @See_also: #ClutterBoxLayout
 | 
			
		||||
 * @See_also: #ClutterTableLayout, #ClutterBoxLayout
 | 
			
		||||
 *
 | 
			
		||||
 * #ClutterGridLayout is a layout manager which arranges its child widgets in
 | 
			
		||||
 * rows and columns. It is a very similar to #ClutterBoxLayout, but it
 | 
			
		||||
 * consistently uses #ClutterActor's alignment and expansion flags instead of
 | 
			
		||||
 * custom child properties.
 | 
			
		||||
 * rows and columns. It is a very similar to #ClutterTableLayout and
 | 
			
		||||
 * #ClutterBoxLayout, but it consistently uses #ClutterActor's
 | 
			
		||||
 * alignment and expansion flags instead of custom child properties.
 | 
			
		||||
 *
 | 
			
		||||
 * 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
 | 
			
		||||
 
 | 
			
		||||
@@ -118,10 +118,9 @@ clutter_image_init (ClutterImage *self)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_image_paint_content (ClutterContent      *content,
 | 
			
		||||
                             ClutterActor        *actor,
 | 
			
		||||
                             ClutterPaintNode    *root,
 | 
			
		||||
                             ClutterPaintContext *paint_context)
 | 
			
		||||
clutter_image_paint_content (ClutterContent   *content,
 | 
			
		||||
                             ClutterActor     *actor,
 | 
			
		||||
                             ClutterPaintNode *root)
 | 
			
		||||
{
 | 
			
		||||
  ClutterImagePrivate *priv = CLUTTER_IMAGE (content)->priv;
 | 
			
		||||
  ClutterPaintNode *node;
 | 
			
		||||
@@ -130,7 +129,7 @@ clutter_image_paint_content (ClutterContent      *content,
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  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_unref (node);
 | 
			
		||||
}
 | 
			
		||||
@@ -257,7 +256,7 @@ clutter_image_set_data (ClutterImage     *image,
 | 
			
		||||
    {
 | 
			
		||||
      g_set_error_literal (error, CLUTTER_IMAGE_ERROR,
 | 
			
		||||
                           CLUTTER_IMAGE_ERROR_INVALID_DATA,
 | 
			
		||||
                           "Unable to load image data");
 | 
			
		||||
                           _("Unable to load image data"));
 | 
			
		||||
      return FALSE;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -326,7 +325,7 @@ clutter_image_set_bytes (ClutterImage     *image,
 | 
			
		||||
    {
 | 
			
		||||
      g_set_error_literal (error, CLUTTER_IMAGE_ERROR,
 | 
			
		||||
                           CLUTTER_IMAGE_ERROR_INVALID_DATA,
 | 
			
		||||
                           "Unable to load image data");
 | 
			
		||||
                           _("Unable to load image data"));
 | 
			
		||||
      return FALSE;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -420,7 +419,7 @@ clutter_image_set_area (ClutterImage                 *image,
 | 
			
		||||
    {
 | 
			
		||||
      g_set_error_literal (error, CLUTTER_IMAGE_ERROR,
 | 
			
		||||
                           CLUTTER_IMAGE_ERROR_INVALID_DATA,
 | 
			
		||||
                           "Unable to load image data");
 | 
			
		||||
                           _("Unable to load image data"));
 | 
			
		||||
      return FALSE;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -63,8 +63,7 @@ typedef struct _ClutterImageClass      ClutterImageClass;
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 1.10
 | 
			
		||||
 */
 | 
			
		||||
typedef enum
 | 
			
		||||
{
 | 
			
		||||
typedef enum {
 | 
			
		||||
  CLUTTER_IMAGE_ERROR_INVALID_DATA
 | 
			
		||||
} ClutterImageError;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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 */
 | 
			
		||||
@@ -35,8 +35,7 @@ struct _ClutterInputDeviceToolPrivate
 | 
			
		||||
  guint64 id;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum
 | 
			
		||||
{
 | 
			
		||||
enum {
 | 
			
		||||
  PROP_0,
 | 
			
		||||
  PROP_TYPE,
 | 
			
		||||
  PROP_SERIAL,
 | 
			
		||||
 
 | 
			
		||||
@@ -37,12 +37,12 @@
 | 
			
		||||
 | 
			
		||||
#include "clutter-actor-private.h"
 | 
			
		||||
#include "clutter-debug.h"
 | 
			
		||||
#include "clutter-device-manager-private.h"
 | 
			
		||||
#include "clutter-enum-types.h"
 | 
			
		||||
#include "clutter-event-private.h"
 | 
			
		||||
#include "clutter-marshal.h"
 | 
			
		||||
#include "clutter-private.h"
 | 
			
		||||
#include "clutter-stage-private.h"
 | 
			
		||||
#include "clutter-input-device-private.h"
 | 
			
		||||
#include "clutter-input-device-tool.h"
 | 
			
		||||
 | 
			
		||||
#include <math.h>
 | 
			
		||||
@@ -57,7 +57,7 @@ enum
 | 
			
		||||
  PROP_NAME,
 | 
			
		||||
 | 
			
		||||
  PROP_DEVICE_TYPE,
 | 
			
		||||
  PROP_SEAT,
 | 
			
		||||
  PROP_DEVICE_MANAGER,
 | 
			
		||||
  PROP_DEVICE_MODE,
 | 
			
		||||
 | 
			
		||||
  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->vendor_id, g_free);
 | 
			
		||||
  g_clear_pointer (&device->product_id, g_free);
 | 
			
		||||
  g_clear_pointer (&device->node_path, g_free);
 | 
			
		||||
 | 
			
		||||
  if (device->associated != NULL)
 | 
			
		||||
    {
 | 
			
		||||
@@ -108,9 +107,6 @@ clutter_input_device_dispose (GObject *gobject)
 | 
			
		||||
      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->keys, 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);
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
    case PROP_SEAT:
 | 
			
		||||
      self->seat = g_value_get_object (value);
 | 
			
		||||
    case PROP_DEVICE_MANAGER:
 | 
			
		||||
      self->device_manager = g_value_get_object (value);
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
    case PROP_DEVICE_MODE:
 | 
			
		||||
@@ -247,8 +243,8 @@ clutter_input_device_get_property (GObject    *gobject,
 | 
			
		||||
      g_value_set_enum (value, self->device_type);
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
    case PROP_SEAT:
 | 
			
		||||
      g_value_set_object (value, self->seat);
 | 
			
		||||
    case PROP_DEVICE_MANAGER:
 | 
			
		||||
      g_value_set_object (value, self->device_manager);
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
    case PROP_DEVICE_MODE:
 | 
			
		||||
@@ -362,15 +358,17 @@ clutter_input_device_class_init (ClutterInputDeviceClass *klass)
 | 
			
		||||
                       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] =
 | 
			
		||||
    g_param_spec_object ("seat",
 | 
			
		||||
                         P_("Seat"),
 | 
			
		||||
                         P_("Seat"),
 | 
			
		||||
                         CLUTTER_TYPE_SEAT,
 | 
			
		||||
  obj_props[PROP_DEVICE_MANAGER] =
 | 
			
		||||
    g_param_spec_object ("device-manager",
 | 
			
		||||
                         P_("Device Manager"),
 | 
			
		||||
                         P_("The device manager instance"),
 | 
			
		||||
                         CLUTTER_TYPE_DEVICE_MANAGER,
 | 
			
		||||
                         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
 | 
			
		||||
 *
 | 
			
		||||
 * This function is called by clutter_input_device_update()
 | 
			
		||||
 * This function is called by _clutter_input_device_update()
 | 
			
		||||
 * and it will:
 | 
			
		||||
 *
 | 
			
		||||
 *   - 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.y = device->current_y;
 | 
			
		||||
          event->crossing.related = actor;
 | 
			
		||||
          event->crossing.sequence = sequence;
 | 
			
		||||
          clutter_event_set_device (event, device);
 | 
			
		||||
 | 
			
		||||
          /* 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.source = actor;
 | 
			
		||||
          event->crossing.related = old_actor;
 | 
			
		||||
          event->crossing.sequence = sequence;
 | 
			
		||||
          clutter_event_set_device (event, device);
 | 
			
		||||
 | 
			
		||||
          /* see above */
 | 
			
		||||
@@ -990,7 +986,7 @@ clutter_input_device_get_enabled (ClutterInputDevice *device)
 | 
			
		||||
gboolean
 | 
			
		||||
clutter_input_device_get_coords (ClutterInputDevice   *device,
 | 
			
		||||
                                 ClutterEventSequence *sequence,
 | 
			
		||||
                                 graphene_point_t     *point)
 | 
			
		||||
                                 ClutterPoint         *point)
 | 
			
		||||
{
 | 
			
		||||
  g_return_val_if_fail (CLUTTER_IS_INPUT_DEVICE (device), 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
 | 
			
		||||
 *
 | 
			
		||||
 * Updates the input @device by determining the #ClutterActor underneath the
 | 
			
		||||
@@ -1030,18 +1026,17 @@ clutter_input_device_get_coords (ClutterInputDevice   *device,
 | 
			
		||||
 * Since: 1.2
 | 
			
		||||
 */
 | 
			
		||||
ClutterActor *
 | 
			
		||||
clutter_input_device_update (ClutterInputDevice   *device,
 | 
			
		||||
                             ClutterEventSequence *sequence,
 | 
			
		||||
                             gboolean              emit_crossing)
 | 
			
		||||
_clutter_input_device_update (ClutterInputDevice   *device,
 | 
			
		||||
                              ClutterEventSequence *sequence,
 | 
			
		||||
                              gboolean              emit_crossing)
 | 
			
		||||
{
 | 
			
		||||
  ClutterStage *stage;
 | 
			
		||||
  ClutterActor *new_cursor_actor;
 | 
			
		||||
  ClutterActor *old_cursor_actor;
 | 
			
		||||
  graphene_point_t point = GRAPHENE_POINT_INIT (-1.0f, -1.0f);
 | 
			
		||||
  ClutterInputDeviceType device_type = device->device_type;
 | 
			
		||||
  ClutterPoint point = { -1, -1 };
 | 
			
		||||
 | 
			
		||||
  g_assert (device_type != CLUTTER_KEYBOARD_DEVICE &&
 | 
			
		||||
            device_type != CLUTTER_PAD_DEVICE);
 | 
			
		||||
  if (device->device_type == CLUTTER_KEYBOARD_DEVICE)
 | 
			
		||||
    return NULL;
 | 
			
		||||
 | 
			
		||||
  stage = device->stage;
 | 
			
		||||
  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);
 | 
			
		||||
 *
 | 
			
		||||
 *   // get the seat
 | 
			
		||||
 *   seat = clutter_backend_get_deafult_seat (clutter_get_default_backend ());
 | 
			
		||||
 *   // get the device manager
 | 
			
		||||
 *   manager = clutter_device_manager_get_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
 | 
			
		||||
 *   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
 | 
			
		||||
on_grab_sequence_actor_destroy (ClutterActor       *actor,
 | 
			
		||||
                                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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_input_device_get_seat:
 | 
			
		||||
 * @device: a #ClutterInputDevice
 | 
			
		||||
 *
 | 
			
		||||
 * Returns the seat the device belongs to
 | 
			
		||||
 *
 | 
			
		||||
 * Returns: (transfer none): the device seat
 | 
			
		||||
 **/
 | 
			
		||||
ClutterSeat *
 | 
			
		||||
clutter_input_device_get_seat (ClutterInputDevice *device)
 | 
			
		||||
gboolean
 | 
			
		||||
clutter_input_device_get_physical_size (ClutterInputDevice *device,
 | 
			
		||||
                                        gdouble            *width,
 | 
			
		||||
                                        gdouble            *height)
 | 
			
		||||
{
 | 
			
		||||
  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);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -28,40 +28,10 @@
 | 
			
		||||
#error "Only <clutter/clutter.h> can be included directly."
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include <clutter/clutter-backend.h>
 | 
			
		||||
#include <clutter/clutter-types.h>
 | 
			
		||||
#include <clutter/clutter-seat.h>
 | 
			
		||||
 | 
			
		||||
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_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))
 | 
			
		||||
@@ -88,7 +58,7 @@ gint                    clutter_input_device_get_device_id      (ClutterInputDev
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
gboolean                clutter_input_device_get_coords        (ClutterInputDevice   *device,
 | 
			
		||||
                                                                ClutterEventSequence *sequence,
 | 
			
		||||
                                                                graphene_point_t     *point);
 | 
			
		||||
                                                                ClutterPoint         *point);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
ClutterModifierType     clutter_input_device_get_modifier_state (ClutterInputDevice  *device);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
@@ -202,7 +172,9 @@ CLUTTER_EXPORT
 | 
			
		||||
gboolean                  clutter_input_device_is_grouped       (ClutterInputDevice *device,
 | 
			
		||||
                                                                 ClutterInputDevice *other_device);
 | 
			
		||||
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
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -89,8 +89,8 @@ clutter_input_focus_reset (ClutterInputFocus *focus)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
clutter_input_focus_set_cursor_location (ClutterInputFocus     *focus,
 | 
			
		||||
                                         const graphene_rect_t *rect)
 | 
			
		||||
clutter_input_focus_set_cursor_location (ClutterInputFocus *focus,
 | 
			
		||||
                                         const ClutterRect *rect)
 | 
			
		||||
{
 | 
			
		||||
  ClutterInputFocusPrivate *priv;
 | 
			
		||||
 | 
			
		||||
@@ -175,8 +175,7 @@ clutter_input_focus_set_can_show_preedit (ClutterInputFocus *focus,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
clutter_input_focus_set_input_panel_state (ClutterInputFocus      *focus,
 | 
			
		||||
                                           ClutterInputPanelState  state)
 | 
			
		||||
clutter_input_focus_request_toggle_input_panel (ClutterInputFocus *focus)
 | 
			
		||||
{
 | 
			
		||||
  ClutterInputFocusPrivate *priv;
 | 
			
		||||
 | 
			
		||||
@@ -185,7 +184,7 @@ clutter_input_focus_set_input_panel_state (ClutterInputFocus      *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
 | 
			
		||||
 
 | 
			
		||||
@@ -57,8 +57,8 @@ gboolean clutter_input_focus_is_focused (ClutterInputFocus *focus);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void clutter_input_focus_reset (ClutterInputFocus *focus);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void clutter_input_focus_set_cursor_location (ClutterInputFocus     *focus,
 | 
			
		||||
                                              const graphene_rect_t *rect);
 | 
			
		||||
void clutter_input_focus_set_cursor_location (ClutterInputFocus *focus,
 | 
			
		||||
                                              const ClutterRect *rect);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void clutter_input_focus_set_surrounding (ClutterInputFocus *focus,
 | 
			
		||||
@@ -78,7 +78,6 @@ CLUTTER_EXPORT
 | 
			
		||||
void clutter_input_focus_set_can_show_preedit (ClutterInputFocus *focus,
 | 
			
		||||
                                               gboolean           can_show_preedit);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void clutter_input_focus_set_input_panel_state (ClutterInputFocus      *focus,
 | 
			
		||||
                                                ClutterInputPanelState  state);
 | 
			
		||||
void clutter_input_focus_request_toggle_input_panel (ClutterInputFocus *focus);
 | 
			
		||||
 | 
			
		||||
#endif /* __CLUTTER_INPUT_FOCUS_H__ */
 | 
			
		||||
 
 | 
			
		||||
@@ -26,8 +26,8 @@ ClutterInputFocus * clutter_input_method_get_focus (ClutterInputMethod *method);
 | 
			
		||||
 | 
			
		||||
void clutter_input_method_reset               (ClutterInputMethod *method);
 | 
			
		||||
 | 
			
		||||
void clutter_input_method_set_cursor_location (ClutterInputMethod    *method,
 | 
			
		||||
                                               const graphene_rect_t *rect);
 | 
			
		||||
void clutter_input_method_set_cursor_location (ClutterInputMethod *method,
 | 
			
		||||
                                               const ClutterRect  *rect);
 | 
			
		||||
void clutter_input_method_set_surrounding     (ClutterInputMethod *method,
 | 
			
		||||
                                               const gchar        *text,
 | 
			
		||||
                                               guint               cursor,
 | 
			
		||||
 
 | 
			
		||||
@@ -22,10 +22,10 @@
 | 
			
		||||
#include "clutter-build-config.h"
 | 
			
		||||
 | 
			
		||||
#include "clutter-private.h"
 | 
			
		||||
#include "clutter/clutter-input-device-private.h"
 | 
			
		||||
#include "clutter/clutter-input-method.h"
 | 
			
		||||
#include "clutter/clutter-input-method-private.h"
 | 
			
		||||
#include "clutter/clutter-input-focus-private.h"
 | 
			
		||||
#include "clutter/clutter-device-manager-private.h"
 | 
			
		||||
 | 
			
		||||
typedef struct _ClutterInputMethodPrivate ClutterInputMethodPrivate;
 | 
			
		||||
 | 
			
		||||
@@ -37,8 +37,7 @@ struct _ClutterInputMethodPrivate
 | 
			
		||||
  gboolean can_show_preedit;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum
 | 
			
		||||
{
 | 
			
		||||
enum {
 | 
			
		||||
  COMMIT,
 | 
			
		||||
  DELETE_SURROUNDING,
 | 
			
		||||
  REQUEST_SURROUNDING,
 | 
			
		||||
@@ -47,8 +46,7 @@ enum
 | 
			
		||||
  N_SIGNALS,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum
 | 
			
		||||
{
 | 
			
		||||
enum {
 | 
			
		||||
  PROP_0,
 | 
			
		||||
  PROP_CONTENT_HINTS,
 | 
			
		||||
  PROP_CONTENT_PURPOSE,
 | 
			
		||||
@@ -187,7 +185,7 @@ clutter_input_method_class_init (ClutterInputMethodClass *klass)
 | 
			
		||||
                  G_TYPE_FROM_CLASS (object_class),
 | 
			
		||||
                  G_SIGNAL_RUN_LAST,
 | 
			
		||||
                  0, NULL, NULL, NULL,
 | 
			
		||||
                  G_TYPE_NONE, 1, GRAPHENE_TYPE_RECT);
 | 
			
		||||
                  G_TYPE_NONE, 1, CLUTTER_TYPE_RECT);
 | 
			
		||||
 | 
			
		||||
  pspecs[PROP_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->focus_out (im);
 | 
			
		||||
 | 
			
		||||
  g_signal_emit (im, signals[INPUT_PANEL_STATE],
 | 
			
		||||
                 0, CLUTTER_INPUT_PANEL_STATE_OFF);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ClutterInputFocus *
 | 
			
		||||
@@ -360,12 +361,12 @@ clutter_input_method_notify_key_event (ClutterInputMethod *im,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
clutter_input_method_set_input_panel_state (ClutterInputMethod     *im,
 | 
			
		||||
                                            ClutterInputPanelState  state)
 | 
			
		||||
clutter_input_method_toggle_input_panel (ClutterInputMethod *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
 | 
			
		||||
@@ -377,8 +378,8 @@ clutter_input_method_reset (ClutterInputMethod *im)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
clutter_input_method_set_cursor_location (ClutterInputMethod    *im,
 | 
			
		||||
                                          const graphene_rect_t *rect)
 | 
			
		||||
clutter_input_method_set_cursor_location (ClutterInputMethod *im,
 | 
			
		||||
                                          const ClutterRect  *rect)
 | 
			
		||||
{
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_INPUT_METHOD (im));
 | 
			
		||||
 | 
			
		||||
@@ -452,8 +453,8 @@ clutter_input_method_forward_key (ClutterInputMethod *im,
 | 
			
		||||
                                  gboolean            press)
 | 
			
		||||
{
 | 
			
		||||
  ClutterInputMethodPrivate *priv;
 | 
			
		||||
  ClutterDeviceManager *device_manager;
 | 
			
		||||
  ClutterInputDevice *keyboard;
 | 
			
		||||
  ClutterSeat *seat;
 | 
			
		||||
  ClutterStage *stage;
 | 
			
		||||
  ClutterEvent *event;
 | 
			
		||||
 | 
			
		||||
@@ -463,8 +464,9 @@ clutter_input_method_forward_key (ClutterInputMethod *im,
 | 
			
		||||
  if (!priv->focus)
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  seat = clutter_backend_get_default_seat (clutter_get_default_backend ());
 | 
			
		||||
  keyboard = clutter_seat_get_keyboard (seat);
 | 
			
		||||
  device_manager = clutter_device_manager_get_default ();
 | 
			
		||||
  keyboard = clutter_device_manager_get_core_device (device_manager,
 | 
			
		||||
                                                     CLUTTER_KEYBOARD_DEVICE);
 | 
			
		||||
  stage = _clutter_input_device_get_stage (keyboard);
 | 
			
		||||
  if (stage == NULL)
 | 
			
		||||
    return;
 | 
			
		||||
 
 | 
			
		||||
@@ -42,8 +42,8 @@ struct _ClutterInputMethodClass
 | 
			
		||||
 | 
			
		||||
  void (* reset) (ClutterInputMethod *im);
 | 
			
		||||
 | 
			
		||||
  void (* set_cursor_location) (ClutterInputMethod    *im,
 | 
			
		||||
                                const graphene_rect_t *rect);
 | 
			
		||||
  void (* set_cursor_location) (ClutterInputMethod          *im,
 | 
			
		||||
                                const ClutterRect           *rect);
 | 
			
		||||
  void (* set_surrounding) (ClutterInputMethod *im,
 | 
			
		||||
                            const gchar        *text,
 | 
			
		||||
                            guint               cursor,
 | 
			
		||||
@@ -83,8 +83,7 @@ void clutter_input_method_notify_key_event (ClutterInputMethod *im,
 | 
			
		||||
                                            const ClutterEvent *event,
 | 
			
		||||
                                            gboolean            filtered);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void clutter_input_method_set_input_panel_state (ClutterInputMethod     *im,
 | 
			
		||||
                                                 ClutterInputPanelState  state);
 | 
			
		||||
void clutter_input_method_request_toggle_input_panel (ClutterInputMethod *im);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void clutter_input_method_forward_key (ClutterInputMethod *im,
 | 
			
		||||
 
 | 
			
		||||
@@ -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__ */
 | 
			
		||||
@@ -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));
 | 
			
		||||
}
 | 
			
		||||
@@ -62,9 +62,3 @@ clutter_keymap_get_caps_lock_state (ClutterKeymap *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);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -29,7 +29,6 @@
 | 
			
		||||
#include <clutter/clutter-macros.h>
 | 
			
		||||
 | 
			
		||||
#include <glib-object.h>
 | 
			
		||||
#include <pango/pango.h>
 | 
			
		||||
 | 
			
		||||
typedef struct _ClutterKeymap ClutterKeymap;
 | 
			
		||||
typedef struct _ClutterKeymapClass ClutterKeymapClass;
 | 
			
		||||
@@ -40,7 +39,6 @@ struct _ClutterKeymapClass
 | 
			
		||||
 | 
			
		||||
  gboolean (* get_num_lock_state)  (ClutterKeymap *keymap);
 | 
			
		||||
  gboolean (* get_caps_lock_state) (ClutterKeymap *keymap);
 | 
			
		||||
  PangoDirection (* get_direction) (ClutterKeymap *keymap);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define CLUTTER_TYPE_KEYMAP (clutter_keymap_get_type ())
 | 
			
		||||
@@ -55,6 +53,4 @@ gboolean clutter_keymap_get_num_lock_state  (ClutterKeymap *keymap);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
gboolean clutter_keymap_get_caps_lock_state (ClutterKeymap *keymap);
 | 
			
		||||
 | 
			
		||||
PangoDirection clutter_keymap_get_direction (ClutterKeymap *keymap);
 | 
			
		||||
 | 
			
		||||
#endif /* CLUTTER_KEYMAP_H */
 | 
			
		||||
 
 | 
			
		||||
@@ -58,6 +58,10 @@ die "Could not open file keysymdef.h: $!\n"
 | 
			
		||||
die "Could not open file clutter-keysyms.h: $!\n"
 | 
			
		||||
    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;
 | 
			
		||||
/* Clutter
 | 
			
		||||
 *
 | 
			
		||||
@@ -81,6 +85,7 @@ my $LICENSE_HEADER= <<EOF;
 | 
			
		||||
EOF
 | 
			
		||||
 | 
			
		||||
print OUT_KEYSYMS $LICENSE_HEADER;
 | 
			
		||||
print OUT_KEYSYMS_COMPAT $LICENSE_HEADER;
 | 
			
		||||
 | 
			
		||||
print OUT_KEYSYMS<<EOF;
 | 
			
		||||
 | 
			
		||||
@@ -99,6 +104,23 @@ print OUT_KEYSYMS<<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>)
 | 
			
		||||
{
 | 
			
		||||
	next if ( ! /^#define / );
 | 
			
		||||
@@ -115,8 +137,13 @@ while (<IN_KEYSYMDEF>)
 | 
			
		||||
	my $element = $keysymelements[1];
 | 
			
		||||
	my $binding = $element;
 | 
			
		||||
	$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_COMPAT "#define %s 0x%03x %s\n", $compat_binding, hex($keysymelements[2]), $deprecation;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
close IN_KEYSYMDEF;
 | 
			
		||||
@@ -160,8 +187,11 @@ while (<IN_XF86KEYSYM>)
 | 
			
		||||
	my $element = $keysymelements[1];
 | 
			
		||||
	my $binding = $element;
 | 
			
		||||
	$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_COMPAT "#define %s 0x%03x\n", $compat_binding, hex($keysymelements[2]);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
close IN_XF86KEYSYM;
 | 
			
		||||
@@ -172,6 +202,13 @@ print OUT_KEYSYMS<<EOF;
 | 
			
		||||
#endif /* __CLUTTER_KEYSYMS_H__ */
 | 
			
		||||
EOF
 | 
			
		||||
 | 
			
		||||
print OUT_KEYSYMS_COMPAT<<EOF;
 | 
			
		||||
 | 
			
		||||
#endif /* CLUTTER_DISABLE_DEPRECATED */
 | 
			
		||||
 | 
			
		||||
#endif /* __CLUTTER_KEYSYMS_DEPRECATED_H__ */
 | 
			
		||||
EOF
 | 
			
		||||
 | 
			
		||||
foreach my $f (qw/ keysymdef.h XF86keysym.h /) {
 | 
			
		||||
    unlink $f or die "Unable to delete $f: $!";
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -98,11 +98,11 @@
 | 
			
		||||
 * |[
 | 
			
		||||
 * {
 | 
			
		||||
 *   "type" : "ClutterBox",
 | 
			
		||||
 *   "layout-manager" : { "type" : "ClutterGridLayout" },
 | 
			
		||||
 *   "layout-manager" : { "type" : "ClutterTableLayout" },
 | 
			
		||||
 *   "children" : [
 | 
			
		||||
 *     {
 | 
			
		||||
 *       "type" : "ClutterText",
 | 
			
		||||
 *       "text" : "Some text",
 | 
			
		||||
 *       "type" : "ClutterTexture",
 | 
			
		||||
 *       "filename" : "image-00.png",
 | 
			
		||||
 *
 | 
			
		||||
 *       "layout::row" : 0,
 | 
			
		||||
 *       "layout::column" : 0,
 | 
			
		||||
@@ -112,8 +112,8 @@
 | 
			
		||||
 *       "layout::y-expand" : true
 | 
			
		||||
 *     },
 | 
			
		||||
 *     {
 | 
			
		||||
 *       "type" : "ClutterText",
 | 
			
		||||
 *       "text" : "Some more text",
 | 
			
		||||
 *       "type" : "ClutterTexture",
 | 
			
		||||
 *       "filename" : "image-01.png",
 | 
			
		||||
 *
 | 
			
		||||
 *       "layout::row" : 0,
 | 
			
		||||
 *       "layout::column" : 1,
 | 
			
		||||
@@ -329,6 +329,9 @@ layout_manager_real_begin_animation (ClutterLayoutManager *manager,
 | 
			
		||||
  /* 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);
 | 
			
		||||
@@ -372,6 +375,9 @@ layout_manager_real_end_animation (ClutterLayoutManager *manager)
 | 
			
		||||
  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);
 | 
			
		||||
@@ -438,7 +444,8 @@ clutter_layout_manager_class_init (ClutterLayoutManagerClass *klass)
 | 
			
		||||
                  G_SIGNAL_RUN_LAST,
 | 
			
		||||
                  G_STRUCT_OFFSET (ClutterLayoutManagerClass,
 | 
			
		||||
                                   layout_changed),
 | 
			
		||||
                  NULL, NULL, NULL,
 | 
			
		||||
                  NULL, NULL,
 | 
			
		||||
                  _clutter_marshal_VOID__VOID,
 | 
			
		||||
                  G_TYPE_NONE, 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -213,6 +213,15 @@ void               clutter_layout_manager_child_get_property    (ClutterLayoutMa
 | 
			
		||||
                                                                 const gchar            *property_name,
 | 
			
		||||
                                                                 GValue                 *value);
 | 
			
		||||
 | 
			
		||||
CLUTTER_DEPRECATED
 | 
			
		||||
ClutterAlpha *     clutter_layout_manager_begin_animation       (ClutterLayoutManager   *manager,
 | 
			
		||||
                                                                 guint                   duration,
 | 
			
		||||
                                                                 gulong                  mode);
 | 
			
		||||
CLUTTER_DEPRECATED
 | 
			
		||||
void               clutter_layout_manager_end_animation         (ClutterLayoutManager   *manager);
 | 
			
		||||
CLUTTER_DEPRECATED
 | 
			
		||||
gdouble            clutter_layout_manager_get_animation_progress (ClutterLayoutManager   *manager);
 | 
			
		||||
 | 
			
		||||
G_END_DECLS
 | 
			
		||||
 | 
			
		||||
#endif /* __CLUTTER_LAYOUT_MANAGER_H__ */
 | 
			
		||||
 
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -34,45 +34,6 @@
 | 
			
		||||
 | 
			
		||||
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,
 | 
			
		||||
} 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;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * CLUTTER_INIT_ERROR:
 | 
			
		||||
 *
 | 
			
		||||
@@ -92,8 +53,7 @@ typedef enum
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 0.2
 | 
			
		||||
 */
 | 
			
		||||
typedef enum
 | 
			
		||||
{
 | 
			
		||||
typedef enum {
 | 
			
		||||
  CLUTTER_INIT_SUCCESS        =  1,
 | 
			
		||||
  CLUTTER_INIT_ERROR_UNKNOWN  =  0,
 | 
			
		||||
  CLUTTER_INIT_ERROR_THREADS  = -1,
 | 
			
		||||
@@ -156,6 +116,9 @@ void                    clutter_disable_accessibility           (void);
 | 
			
		||||
 | 
			
		||||
/* Threading functions */
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void                    clutter_threads_set_lock_functions      (GCallback enter_fn,
 | 
			
		||||
                                                                 GCallback leave_fn);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
guint                   clutter_threads_add_idle                (GSourceFunc    func,
 | 
			
		||||
                                                                 gpointer       data);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
@@ -185,6 +148,19 @@ guint                   clutter_threads_add_repaint_func_full   (ClutterRepaintF
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void                    clutter_threads_remove_repaint_func     (guint          handle_id);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void                    clutter_grab_pointer                    (ClutterActor  *actor);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void                    clutter_ungrab_pointer                  (void);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
ClutterActor *          clutter_get_pointer_grab                (void);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void                    clutter_grab_keyboard                   (ClutterActor  *actor);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void                    clutter_ungrab_keyboard                 (void);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
ClutterActor *          clutter_get_keyboard_grab               (void);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
PangoFontMap *          clutter_get_font_map                    (void);
 | 
			
		||||
 | 
			
		||||
@@ -197,15 +173,6 @@ guint                   clutter_get_default_frame_rate          (void);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
gboolean                clutter_check_windowing_backend         (const char *backend_type);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void                    clutter_add_debug_flags                 (ClutterDebugFlag     debug_flags,
 | 
			
		||||
                                                                 ClutterDrawDebugFlag draw_flags,
 | 
			
		||||
                                                                 ClutterPickDebugFlag pick_flags);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void                    clutter_remove_debug_flags              (ClutterDebugFlag     debug_flags,
 | 
			
		||||
                                                                 ClutterDrawDebugFlag draw_flags,
 | 
			
		||||
                                                                 ClutterPickDebugFlag pick_flags);
 | 
			
		||||
 | 
			
		||||
G_END_DECLS
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -12,24 +12,29 @@ BOOLEAN:OBJECT,FLOAT,FLOAT
 | 
			
		||||
BOXED:UINT,UINT
 | 
			
		||||
DOUBLE:VOID
 | 
			
		||||
UINT:VOID
 | 
			
		||||
VOID:BOOLEAN
 | 
			
		||||
VOID:BOXED
 | 
			
		||||
VOID:BOXED,FLAGS
 | 
			
		||||
VOID:INT
 | 
			
		||||
VOID:INT64,INT64,FLOAT,BOOLEAN
 | 
			
		||||
VOID:INT,INT
 | 
			
		||||
VOID:INT,POINTER
 | 
			
		||||
VOID:FLOAT,FLOAT
 | 
			
		||||
VOID:INT,INT,INT,INT
 | 
			
		||||
VOID:OBJECT
 | 
			
		||||
VOID:OBJECT,FLAGS
 | 
			
		||||
VOID:OBJECT,FLAGS,BOOLEAN
 | 
			
		||||
VOID:OBJECT,FLAGS,UINT
 | 
			
		||||
VOID:OBJECT,FLOAT,FLOAT
 | 
			
		||||
VOID:OBJECT,FLOAT,FLOAT,FLAGS
 | 
			
		||||
VOID:OBJECT,OBJECT
 | 
			
		||||
VOID:OBJECT,PARAM
 | 
			
		||||
VOID:OBJECT,POINTER
 | 
			
		||||
VOID:OBJECT,UINT
 | 
			
		||||
VOID:POINTER
 | 
			
		||||
VOID:STRING,BOOLEAN
 | 
			
		||||
VOID:STRING,BOOLEAN,BOOLEAN
 | 
			
		||||
VOID:STRING,INT
 | 
			
		||||
VOID:UINT
 | 
			
		||||
VOID:UINT,STRING,UINT
 | 
			
		||||
VOID:UINT,UINT
 | 
			
		||||
VOID:VOID
 | 
			
		||||
VOID:STRING,INT,POINTER
 | 
			
		||||
 
 | 
			
		||||
@@ -64,6 +64,9 @@ struct _ClutterMasterClockDefault
 | 
			
		||||
  /* the current state of the clock, in usecs */
 | 
			
		||||
  gint64 cur_tick;
 | 
			
		||||
 | 
			
		||||
  /* the previous state of the clock, in usecs, used to compute the delta */
 | 
			
		||||
  gint64 prev_tick;
 | 
			
		||||
 | 
			
		||||
#ifdef CLUTTER_ENABLE_DEBUG
 | 
			
		||||
  gint64 frame_budget;
 | 
			
		||||
  gint64 remaining_budget;
 | 
			
		||||
@@ -74,6 +77,12 @@ struct _ClutterMasterClockDefault
 | 
			
		||||
   */
 | 
			
		||||
  GSource *source;
 | 
			
		||||
 | 
			
		||||
  /* If the master clock is idle that means it has
 | 
			
		||||
   * fallen back to idle polling for timeline
 | 
			
		||||
   * progressions and it may have been some time since
 | 
			
		||||
   * the last real stage update.
 | 
			
		||||
   */
 | 
			
		||||
  guint idle : 1;
 | 
			
		||||
  guint ensure_next_iteration : 1;
 | 
			
		||||
 | 
			
		||||
  guint paused : 1;
 | 
			
		||||
@@ -266,12 +275,78 @@ master_clock_reschedule_stage_updates (ClutterMasterClockDefault *master_clock,
 | 
			
		||||
static gint
 | 
			
		||||
master_clock_next_frame_delay (ClutterMasterClockDefault *master_clock)
 | 
			
		||||
{
 | 
			
		||||
  gint64 now, next;
 | 
			
		||||
  gint swap_delay;
 | 
			
		||||
 | 
			
		||||
  if (!master_clock_is_running (master_clock))
 | 
			
		||||
    return -1;
 | 
			
		||||
 | 
			
		||||
  /* If all of the stages are busy waiting for a swap-buffers to complete
 | 
			
		||||
   * then we wait for one to be ready.. */
 | 
			
		||||
  return master_clock_get_swap_wait_time (master_clock);
 | 
			
		||||
  swap_delay = master_clock_get_swap_wait_time (master_clock);
 | 
			
		||||
  if (swap_delay != 0)
 | 
			
		||||
    return swap_delay;
 | 
			
		||||
 | 
			
		||||
  /* When we have sync-to-vblank, we count on swap-buffer requests (or
 | 
			
		||||
   * swap-buffer-complete events if supported in the backend) to throttle our
 | 
			
		||||
   * frame rate so no additional delay is needed to start the next frame.
 | 
			
		||||
   *
 | 
			
		||||
   * If the master-clock has become idle due to no timeline progression causing
 | 
			
		||||
   * redraws then we can no longer rely on vblank synchronization because the
 | 
			
		||||
   * last real stage update/redraw may have happened a long time ago and so we
 | 
			
		||||
   * fallback to polling for timeline progressions every 1/frame_rate seconds.
 | 
			
		||||
   *
 | 
			
		||||
   * (NB: if there aren't even any timelines running then the master clock will
 | 
			
		||||
   * be completely stopped in master_clock_is_running())
 | 
			
		||||
   */
 | 
			
		||||
  if (clutter_feature_available (CLUTTER_FEATURE_SWAP_THROTTLE) &&
 | 
			
		||||
      !master_clock->idle)
 | 
			
		||||
    {
 | 
			
		||||
      CLUTTER_NOTE (SCHEDULER, "swap throttling available and updated stages");
 | 
			
		||||
      return 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  if (master_clock->prev_tick == 0)
 | 
			
		||||
    {
 | 
			
		||||
      /* If we weren't previously running, then draw the next frame
 | 
			
		||||
       * immediately
 | 
			
		||||
       */
 | 
			
		||||
      CLUTTER_NOTE (SCHEDULER, "draw the first frame immediately");
 | 
			
		||||
      return 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  /* Otherwise, wait at least 1/frame_rate seconds since we last
 | 
			
		||||
   * started a frame
 | 
			
		||||
   */
 | 
			
		||||
  now = g_source_get_time (master_clock->source);
 | 
			
		||||
 | 
			
		||||
  next = master_clock->prev_tick;
 | 
			
		||||
 | 
			
		||||
  /* If time has gone backwards then there's no way of knowing how
 | 
			
		||||
     long we should wait so let's just dispatch immediately */
 | 
			
		||||
  if (now <= next)
 | 
			
		||||
    {
 | 
			
		||||
      CLUTTER_NOTE (SCHEDULER, "Time has gone backwards");
 | 
			
		||||
 | 
			
		||||
      return 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  next += (1000000L / clutter_get_default_frame_rate ());
 | 
			
		||||
 | 
			
		||||
  if (next <= now)
 | 
			
		||||
    {
 | 
			
		||||
      CLUTTER_NOTE (SCHEDULER, "Less than %lu microsecs",
 | 
			
		||||
                    1000000L / (gulong) clutter_get_default_frame_rate ());
 | 
			
		||||
 | 
			
		||||
      return 0;
 | 
			
		||||
    }
 | 
			
		||||
  else
 | 
			
		||||
    {
 | 
			
		||||
      CLUTTER_NOTE (SCHEDULER, "Waiting %" G_GINT64_FORMAT " msecs",
 | 
			
		||||
                   (next - now) / 1000);
 | 
			
		||||
 | 
			
		||||
      return (next - now) / 1000;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
@@ -337,7 +412,8 @@ master_clock_advance_timelines (ClutterMasterClockDefault *master_clock)
 | 
			
		||||
  for (l = timelines; l != NULL; l = l->next)
 | 
			
		||||
    _clutter_timeline_do_tick (l->data, master_clock->cur_tick / 1000);
 | 
			
		||||
 | 
			
		||||
  g_slist_free_full (timelines, g_object_unref);
 | 
			
		||||
  g_slist_foreach (timelines, (GFunc) g_object_unref, NULL);
 | 
			
		||||
  g_slist_free (timelines);
 | 
			
		||||
 | 
			
		||||
#ifdef CLUTTER_ENABLE_DEBUG
 | 
			
		||||
  if (_clutter_diagnostic_enabled ())
 | 
			
		||||
@@ -455,6 +531,7 @@ clutter_clock_dispatch (GSource     *source,
 | 
			
		||||
{
 | 
			
		||||
  ClutterClockSource *clock_source = (ClutterClockSource *) source;
 | 
			
		||||
  ClutterMasterClockDefault *master_clock = clock_source->master_clock;
 | 
			
		||||
  gboolean stages_updated = FALSE;
 | 
			
		||||
  GSList *stages;
 | 
			
		||||
 | 
			
		||||
  CLUTTER_NOTE (SCHEDULER, "Master clock [tick]");
 | 
			
		||||
@@ -474,6 +551,8 @@ clutter_clock_dispatch (GSource     *source,
 | 
			
		||||
   */
 | 
			
		||||
  stages = master_clock_list_ready_stages (master_clock);
 | 
			
		||||
 | 
			
		||||
  master_clock->idle = FALSE;
 | 
			
		||||
 | 
			
		||||
  /* Each frame is split into three separate phases: */
 | 
			
		||||
 | 
			
		||||
  /* 1. process all the events; each stage goes through its events queue
 | 
			
		||||
@@ -486,11 +565,19 @@ clutter_clock_dispatch (GSource     *source,
 | 
			
		||||
  master_clock_advance_timelines (master_clock);
 | 
			
		||||
 | 
			
		||||
  /* 3. relayout and redraw the stages */
 | 
			
		||||
  master_clock_update_stages (master_clock, stages);
 | 
			
		||||
  stages_updated = master_clock_update_stages (master_clock, stages);
 | 
			
		||||
 | 
			
		||||
  /* The master clock goes idle if no stages were updated and falls back
 | 
			
		||||
   * to polling for timeline progressions... */
 | 
			
		||||
  if (!stages_updated)
 | 
			
		||||
    master_clock->idle = TRUE;
 | 
			
		||||
 | 
			
		||||
  master_clock_reschedule_stage_updates (master_clock, stages);
 | 
			
		||||
 | 
			
		||||
  g_slist_free_full (stages, g_object_unref);
 | 
			
		||||
  g_slist_foreach (stages, (GFunc) g_object_unref, NULL);
 | 
			
		||||
  g_slist_free (stages);
 | 
			
		||||
 | 
			
		||||
  master_clock->prev_tick = master_clock->cur_tick;
 | 
			
		||||
 | 
			
		||||
  _clutter_threads_release_lock ();
 | 
			
		||||
 | 
			
		||||
@@ -523,6 +610,7 @@ clutter_master_clock_default_init (ClutterMasterClockDefault *self)
 | 
			
		||||
  source = clutter_clock_source_new (self);
 | 
			
		||||
  self->source = source;
 | 
			
		||||
 | 
			
		||||
  self->idle = FALSE;
 | 
			
		||||
  self->ensure_next_iteration = FALSE;
 | 
			
		||||
  self->paused = FALSE;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -26,15 +26,10 @@
 | 
			
		||||
#define __CLUTTER_H_INSIDE__
 | 
			
		||||
 | 
			
		||||
#include "clutter-backend.h"
 | 
			
		||||
#include "clutter-event-private.h"
 | 
			
		||||
#include "clutter-input-device-private.h"
 | 
			
		||||
#include "clutter-input-pointer-a11y-private.h"
 | 
			
		||||
#include "clutter-macros.h"
 | 
			
		||||
#include "clutter-private.h"
 | 
			
		||||
#include "clutter-stage-private.h"
 | 
			
		||||
#include "clutter-stage-view.h"
 | 
			
		||||
#include "cogl/clutter-stage-cogl.h"
 | 
			
		||||
#include "clutter/x11/clutter-backend-x11.h"
 | 
			
		||||
#include "x11/clutter-stage-x11.h"
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void clutter_set_custom_backend_func (ClutterBackend *(* func) (void));
 | 
			
		||||
@@ -54,9 +49,6 @@ void clutter_stage_freeze_updates (ClutterStage *stage);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void clutter_stage_thaw_updates (ClutterStage *stage);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void clutter_stage_update_resource_scales (ClutterStage *stage);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
gboolean clutter_actor_has_damage (ClutterActor *actor);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -66,15 +66,12 @@
 | 
			
		||||
 | 
			
		||||
#include "clutter-offscreen-effect.h"
 | 
			
		||||
 | 
			
		||||
#include <math.h>
 | 
			
		||||
 | 
			
		||||
#include "cogl/cogl.h"
 | 
			
		||||
 | 
			
		||||
#include "clutter-actor-private.h"
 | 
			
		||||
#include "clutter-debug.h"
 | 
			
		||||
#include "clutter-private.h"
 | 
			
		||||
#include "clutter-stage-private.h"
 | 
			
		||||
#include "clutter-paint-context-private.h"
 | 
			
		||||
#include "clutter-paint-volume-private.h"
 | 
			
		||||
#include "clutter-actor-box-private.h"
 | 
			
		||||
 | 
			
		||||
@@ -87,7 +84,7 @@ struct _ClutterOffscreenEffectPrivate
 | 
			
		||||
  ClutterActor *actor;
 | 
			
		||||
  ClutterActor *stage;
 | 
			
		||||
 | 
			
		||||
  graphene_point3d_t position;
 | 
			
		||||
  ClutterVertex position;
 | 
			
		||||
 | 
			
		||||
  int fbo_offset_x;
 | 
			
		||||
  int fbo_offset_y;
 | 
			
		||||
@@ -96,8 +93,8 @@ struct _ClutterOffscreenEffectPrivate
 | 
			
		||||
     through create_texture(). This needs to be tracked separately so
 | 
			
		||||
     that we can detect when a different size is calculated and
 | 
			
		||||
     regenerate the fbo */
 | 
			
		||||
  int target_width;
 | 
			
		||||
  int target_height;
 | 
			
		||||
  int fbo_width;
 | 
			
		||||
  int fbo_height;
 | 
			
		||||
 | 
			
		||||
  gint old_opacity_override;
 | 
			
		||||
};
 | 
			
		||||
@@ -118,7 +115,11 @@ clutter_offscreen_effect_set_actor (ClutterActorMeta *meta,
 | 
			
		||||
  meta_class->set_actor (meta, actor);
 | 
			
		||||
 | 
			
		||||
  /* clear out the previous state */
 | 
			
		||||
  g_clear_pointer (&priv->offscreen, cogl_object_unref);
 | 
			
		||||
  if (priv->offscreen != NULL)
 | 
			
		||||
    {
 | 
			
		||||
      cogl_handle_unref (priv->offscreen);
 | 
			
		||||
      priv->offscreen = NULL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  /* we keep a back pointer here, to avoid going through the ActorMeta */
 | 
			
		||||
  priv->actor = clutter_actor_meta_get_actor (meta);
 | 
			
		||||
@@ -134,35 +135,8 @@ clutter_offscreen_effect_real_create_texture (ClutterOffscreenEffect *effect,
 | 
			
		||||
                                     COGL_PIXEL_FORMAT_RGBA_8888_PRE);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
ensure_pipeline_filter_for_scale (ClutterOffscreenEffect *self,
 | 
			
		||||
                                  float                   resource_scale)
 | 
			
		||||
{
 | 
			
		||||
  CoglPipelineFilter filter;
 | 
			
		||||
 | 
			
		||||
  if (!self->priv->target)
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  /* If no fractional scaling is set, we're always going to render the texture
 | 
			
		||||
     at a 1:1 texel:pixel ratio so, in such case we can use 'nearest' filtering
 | 
			
		||||
     to decrease the effects of rounding errors in the geometry calculation;
 | 
			
		||||
     if instead we we're using a global fractional scaling we need to make sure
 | 
			
		||||
     that we're using the default linear effect, not to create artifacts when
 | 
			
		||||
     scaling down the texture */
 | 
			
		||||
  if (fmodf (resource_scale, 1.0f) == 0)
 | 
			
		||||
    filter = COGL_PIPELINE_FILTER_NEAREST;
 | 
			
		||||
  else
 | 
			
		||||
    filter = COGL_PIPELINE_FILTER_LINEAR;
 | 
			
		||||
 | 
			
		||||
  cogl_pipeline_set_layer_filters (self->priv->target, 0 /* layer_index */,
 | 
			
		||||
                                   filter, filter);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
update_fbo (ClutterEffect *effect,
 | 
			
		||||
            int            target_width,
 | 
			
		||||
            int            target_height,
 | 
			
		||||
            float          resource_scale)
 | 
			
		||||
update_fbo (ClutterEffect *effect, int fbo_width, int fbo_height)
 | 
			
		||||
{
 | 
			
		||||
  ClutterOffscreenEffect *self = CLUTTER_OFFSCREEN_EFFECT (effect);
 | 
			
		||||
  ClutterOffscreenEffectPrivate *priv = self->priv;
 | 
			
		||||
@@ -177,13 +151,10 @@ update_fbo (ClutterEffect *effect,
 | 
			
		||||
      return FALSE;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  if (priv->target_width == target_width &&
 | 
			
		||||
      priv->target_height == target_height &&
 | 
			
		||||
  if (priv->fbo_width == fbo_width &&
 | 
			
		||||
      priv->fbo_height == fbo_height &&
 | 
			
		||||
      priv->offscreen != NULL)
 | 
			
		||||
  {
 | 
			
		||||
    ensure_pipeline_filter_for_scale (self, resource_scale);
 | 
			
		||||
    return TRUE;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (priv->target == NULL)
 | 
			
		||||
    {
 | 
			
		||||
@@ -191,32 +162,48 @@ update_fbo (ClutterEffect *effect,
 | 
			
		||||
        clutter_backend_get_cogl_context (clutter_get_default_backend ());
 | 
			
		||||
 | 
			
		||||
      priv->target = cogl_pipeline_new (ctx);
 | 
			
		||||
      ensure_pipeline_filter_for_scale (self, resource_scale);
 | 
			
		||||
 | 
			
		||||
      /* We're always going to render the texture at a 1:1 texel:pixel
 | 
			
		||||
         ratio so we can use 'nearest' filtering to decrease the
 | 
			
		||||
         effects of rounding errors in the geometry calculation */
 | 
			
		||||
      cogl_pipeline_set_layer_filters (priv->target,
 | 
			
		||||
                                       0, /* layer_index */
 | 
			
		||||
                                       COGL_PIPELINE_FILTER_NEAREST,
 | 
			
		||||
                                       COGL_PIPELINE_FILTER_NEAREST);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  g_clear_pointer (&priv->texture, cogl_object_unref);
 | 
			
		||||
  g_clear_pointer (&priv->offscreen, cogl_object_unref);
 | 
			
		||||
  if (priv->texture != NULL)
 | 
			
		||||
    {
 | 
			
		||||
      cogl_handle_unref (priv->texture);
 | 
			
		||||
      priv->texture = NULL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  if (priv->offscreen != NULL)
 | 
			
		||||
    {
 | 
			
		||||
      cogl_handle_unref (priv->offscreen);
 | 
			
		||||
      priv->offscreen = NULL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  priv->texture =
 | 
			
		||||
    clutter_offscreen_effect_create_texture (self, target_width, target_height);
 | 
			
		||||
    clutter_offscreen_effect_create_texture (self, fbo_width, fbo_height);
 | 
			
		||||
  if (priv->texture == NULL)
 | 
			
		||||
    return FALSE;
 | 
			
		||||
 | 
			
		||||
  cogl_pipeline_set_layer_texture (priv->target, 0, priv->texture);
 | 
			
		||||
 | 
			
		||||
  priv->target_width = target_width;
 | 
			
		||||
  priv->target_height = target_height;
 | 
			
		||||
  priv->fbo_width = fbo_width;
 | 
			
		||||
  priv->fbo_height = fbo_height;
 | 
			
		||||
 | 
			
		||||
  priv->offscreen = cogl_offscreen_new_to_texture (priv->texture);
 | 
			
		||||
  if (priv->offscreen == NULL)
 | 
			
		||||
    {
 | 
			
		||||
      g_warning ("%s: Unable to create an Offscreen buffer", G_STRLOC);
 | 
			
		||||
 | 
			
		||||
      cogl_object_unref (priv->target);
 | 
			
		||||
      cogl_handle_unref (priv->target);
 | 
			
		||||
      priv->target = NULL;
 | 
			
		||||
 | 
			
		||||
      priv->target_width = 0;
 | 
			
		||||
      priv->target_height = 0;
 | 
			
		||||
      priv->fbo_width = 0;
 | 
			
		||||
      priv->fbo_height = 0;
 | 
			
		||||
 | 
			
		||||
      return FALSE;
 | 
			
		||||
    }
 | 
			
		||||
@@ -225,8 +212,7 @@ update_fbo (ClutterEffect *effect,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
clutter_offscreen_effect_pre_paint (ClutterEffect       *effect,
 | 
			
		||||
                                    ClutterPaintContext *paint_context)
 | 
			
		||||
clutter_offscreen_effect_pre_paint (ClutterEffect *effect)
 | 
			
		||||
{
 | 
			
		||||
  ClutterOffscreenEffect *self = CLUTTER_OFFSCREEN_EFFECT (effect);
 | 
			
		||||
  ClutterOffscreenEffectPrivate *priv = self->priv;
 | 
			
		||||
@@ -236,15 +222,10 @@ clutter_offscreen_effect_pre_paint (ClutterEffect       *effect,
 | 
			
		||||
  const ClutterPaintVolume *volume;
 | 
			
		||||
  CoglColor transparent;
 | 
			
		||||
  gfloat stage_width, stage_height;
 | 
			
		||||
  gfloat target_width = -1, target_height = -1;
 | 
			
		||||
  CoglFramebuffer *framebuffer;
 | 
			
		||||
  gfloat resource_scale;
 | 
			
		||||
  gfloat ceiled_resource_scale;
 | 
			
		||||
  graphene_point3d_t local_offset;
 | 
			
		||||
  gfloat fbo_width = -1, fbo_height = -1;
 | 
			
		||||
  ClutterVertex local_offset = { 0.f, 0.f, 0.f };
 | 
			
		||||
  gfloat old_viewport[4];
 | 
			
		||||
 | 
			
		||||
  local_offset = GRAPHENE_POINT3D_INIT (0.0f, 0.0f, 0.0f);
 | 
			
		||||
 | 
			
		||||
  if (!clutter_actor_meta_get_enabled (CLUTTER_ACTOR_META (effect)))
 | 
			
		||||
    return FALSE;
 | 
			
		||||
 | 
			
		||||
@@ -254,18 +235,6 @@ clutter_offscreen_effect_pre_paint (ClutterEffect       *effect,
 | 
			
		||||
  stage = _clutter_actor_get_stage_internal (priv->actor);
 | 
			
		||||
  clutter_actor_get_size (stage, &stage_width, &stage_height);
 | 
			
		||||
 | 
			
		||||
  if (_clutter_actor_get_real_resource_scale (priv->actor, &resource_scale))
 | 
			
		||||
    {
 | 
			
		||||
      ceiled_resource_scale = ceilf (resource_scale);
 | 
			
		||||
      stage_width *= ceiled_resource_scale;
 | 
			
		||||
      stage_height *= ceiled_resource_scale;
 | 
			
		||||
    }
 | 
			
		||||
  else
 | 
			
		||||
    {
 | 
			
		||||
      /* We are sure we have a resource scale set to a good value at paint */
 | 
			
		||||
      g_assert_not_reached ();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  /* Get the minimal bounding box for what we want to paint, relative to the
 | 
			
		||||
   * parent of priv->actor. Note that we may actually be painting a clone of
 | 
			
		||||
   * priv->actor so we need to be careful to avoid querying the transformation
 | 
			
		||||
@@ -292,20 +261,16 @@ clutter_offscreen_effect_pre_paint (ClutterEffect       *effect,
 | 
			
		||||
  priv->fbo_offset_x = box.x1 - raw_box.x1;
 | 
			
		||||
  priv->fbo_offset_y = box.y1 - raw_box.y1;
 | 
			
		||||
 | 
			
		||||
  clutter_actor_box_scale (&box, ceiled_resource_scale);
 | 
			
		||||
  clutter_actor_box_get_size (&box, &target_width, &target_height);
 | 
			
		||||
 | 
			
		||||
  target_width = ceilf (target_width);
 | 
			
		||||
  target_height = ceilf (target_height);
 | 
			
		||||
  clutter_actor_box_get_size (&box, &fbo_width, &fbo_height);
 | 
			
		||||
 | 
			
		||||
  /* First assert that the framebuffer is the right size... */
 | 
			
		||||
  if (!update_fbo (effect, target_width, target_height, resource_scale))
 | 
			
		||||
  if (!update_fbo (effect, fbo_width, fbo_height))
 | 
			
		||||
    return FALSE;
 | 
			
		||||
 | 
			
		||||
  framebuffer = clutter_paint_context_get_framebuffer (paint_context);
 | 
			
		||||
  cogl_framebuffer_get_modelview_matrix (framebuffer, &old_modelview);
 | 
			
		||||
  cogl_get_modelview_matrix (&old_modelview);
 | 
			
		||||
 | 
			
		||||
  clutter_paint_context_push_framebuffer (paint_context, priv->offscreen);
 | 
			
		||||
  /* let's draw offscreen */
 | 
			
		||||
  cogl_push_framebuffer (priv->offscreen);
 | 
			
		||||
 | 
			
		||||
  /* We don't want the FBO contents to be transformed. That could waste memory
 | 
			
		||||
   * (e.g. during zoom), or result in something that's not rectangular (clipped
 | 
			
		||||
@@ -315,7 +280,7 @@ clutter_offscreen_effect_pre_paint (ClutterEffect       *effect,
 | 
			
		||||
   * contents on screen...
 | 
			
		||||
   */
 | 
			
		||||
  clutter_actor_get_transform (priv->stage, &modelview);
 | 
			
		||||
  cogl_framebuffer_set_modelview_matrix (priv->offscreen, &modelview);
 | 
			
		||||
  cogl_set_modelview_matrix (&modelview);
 | 
			
		||||
 | 
			
		||||
  /* Save the original viewport for calculating priv->position */
 | 
			
		||||
  _clutter_stage_get_viewport (CLUTTER_STAGE (priv->stage),
 | 
			
		||||
@@ -327,11 +292,10 @@ clutter_offscreen_effect_pre_paint (ClutterEffect       *effect,
 | 
			
		||||
  /* Set up the viewport so that it has the same size as the stage (avoid
 | 
			
		||||
   * distortion), but translated to account for the FBO offset...
 | 
			
		||||
   */
 | 
			
		||||
  cogl_framebuffer_set_viewport (priv->offscreen,
 | 
			
		||||
                                 -priv->fbo_offset_x,
 | 
			
		||||
                                 -priv->fbo_offset_y,
 | 
			
		||||
                                 stage_width,
 | 
			
		||||
                                 stage_height);
 | 
			
		||||
  cogl_set_viewport (-priv->fbo_offset_x,
 | 
			
		||||
                     -priv->fbo_offset_y,
 | 
			
		||||
                     stage_width,
 | 
			
		||||
                     stage_height);
 | 
			
		||||
 | 
			
		||||
  /* Copy the stage's projection matrix across to the framebuffer */
 | 
			
		||||
  _clutter_stage_get_projection_matrix (CLUTTER_STAGE (priv->stage),
 | 
			
		||||
@@ -348,15 +312,14 @@ clutter_offscreen_effect_pre_paint (ClutterEffect       *effect,
 | 
			
		||||
                                          &priv->position,
 | 
			
		||||
                                          1);
 | 
			
		||||
 | 
			
		||||
  cogl_framebuffer_set_projection_matrix (priv->offscreen, &projection);
 | 
			
		||||
  cogl_set_projection_matrix (&projection);
 | 
			
		||||
 | 
			
		||||
  cogl_color_init_from_4ub (&transparent, 0, 0, 0, 0);
 | 
			
		||||
  cogl_framebuffer_clear (priv->offscreen,
 | 
			
		||||
                          COGL_BUFFER_BIT_COLOR |
 | 
			
		||||
                          COGL_BUFFER_BIT_DEPTH,
 | 
			
		||||
                          &transparent);
 | 
			
		||||
  cogl_clear (&transparent,
 | 
			
		||||
              COGL_BUFFER_BIT_COLOR |
 | 
			
		||||
              COGL_BUFFER_BIT_DEPTH);
 | 
			
		||||
 | 
			
		||||
  cogl_framebuffer_push_matrix (priv->offscreen);
 | 
			
		||||
  cogl_push_matrix ();
 | 
			
		||||
 | 
			
		||||
  /* Override the actor's opacity to fully opaque - we paint the offscreen
 | 
			
		||||
   * texture with the actor's paint opacity, so we need to do this to avoid
 | 
			
		||||
@@ -370,12 +333,10 @@ clutter_offscreen_effect_pre_paint (ClutterEffect       *effect,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_offscreen_effect_real_paint_target (ClutterOffscreenEffect *effect,
 | 
			
		||||
                                            ClutterPaintContext    *paint_context)
 | 
			
		||||
clutter_offscreen_effect_real_paint_target (ClutterOffscreenEffect *effect)
 | 
			
		||||
{
 | 
			
		||||
  ClutterOffscreenEffectPrivate *priv = effect->priv;
 | 
			
		||||
  CoglFramebuffer *framebuffer =
 | 
			
		||||
    clutter_paint_context_get_framebuffer (paint_context);
 | 
			
		||||
  CoglFramebuffer *framebuffer = cogl_get_draw_framebuffer ();
 | 
			
		||||
  guint8 paint_opacity;
 | 
			
		||||
 | 
			
		||||
  paint_opacity = clutter_actor_get_paint_opacity (priv->actor);
 | 
			
		||||
@@ -401,50 +362,36 @@ clutter_offscreen_effect_real_paint_target (ClutterOffscreenEffect *effect,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_offscreen_effect_paint_texture (ClutterOffscreenEffect *effect,
 | 
			
		||||
                                        ClutterPaintContext    *paint_context)
 | 
			
		||||
clutter_offscreen_effect_paint_texture (ClutterOffscreenEffect *effect)
 | 
			
		||||
{
 | 
			
		||||
  ClutterOffscreenEffectPrivate *priv = effect->priv;
 | 
			
		||||
  CoglFramebuffer *framebuffer =
 | 
			
		||||
    clutter_paint_context_get_framebuffer (paint_context);
 | 
			
		||||
  CoglMatrix modelview;
 | 
			
		||||
  float resource_scale;
 | 
			
		||||
 | 
			
		||||
  cogl_framebuffer_push_matrix (framebuffer);
 | 
			
		||||
  cogl_push_matrix ();
 | 
			
		||||
 | 
			
		||||
  /* The current modelview matrix is *almost* perfect already. It's only
 | 
			
		||||
   * missing a correction for the expanded FBO and offset rendering within...
 | 
			
		||||
   */
 | 
			
		||||
  cogl_framebuffer_get_modelview_matrix (framebuffer, &modelview);
 | 
			
		||||
 | 
			
		||||
  if (clutter_actor_get_resource_scale (priv->actor, &resource_scale) &&
 | 
			
		||||
      resource_scale != 1.0f)
 | 
			
		||||
    {
 | 
			
		||||
      float paint_scale = 1.0f / resource_scale;
 | 
			
		||||
      cogl_matrix_scale (&modelview, paint_scale, paint_scale, 1);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  cogl_get_modelview_matrix (&modelview);
 | 
			
		||||
  cogl_matrix_translate (&modelview,
 | 
			
		||||
                         priv->fbo_offset_x,
 | 
			
		||||
                         priv->fbo_offset_y,
 | 
			
		||||
                         0.0f);
 | 
			
		||||
  cogl_framebuffer_set_modelview_matrix (framebuffer, &modelview);
 | 
			
		||||
  cogl_set_modelview_matrix (&modelview);
 | 
			
		||||
 | 
			
		||||
  /* paint the target material; this is virtualized for
 | 
			
		||||
   * sub-classes that require special hand-holding
 | 
			
		||||
   */
 | 
			
		||||
  clutter_offscreen_effect_paint_target (effect, paint_context);
 | 
			
		||||
  clutter_offscreen_effect_paint_target (effect);
 | 
			
		||||
 | 
			
		||||
  cogl_framebuffer_pop_matrix (framebuffer);
 | 
			
		||||
  cogl_pop_matrix ();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_offscreen_effect_post_paint (ClutterEffect       *effect,
 | 
			
		||||
                                     ClutterPaintContext *paint_context)
 | 
			
		||||
clutter_offscreen_effect_post_paint (ClutterEffect *effect)
 | 
			
		||||
{
 | 
			
		||||
  ClutterOffscreenEffect *self = CLUTTER_OFFSCREEN_EFFECT (effect);
 | 
			
		||||
  ClutterOffscreenEffectPrivate *priv = self->priv;
 | 
			
		||||
  CoglFramebuffer *framebuffer;
 | 
			
		||||
 | 
			
		||||
  if (priv->offscreen == NULL ||
 | 
			
		||||
      priv->target == NULL ||
 | 
			
		||||
@@ -454,60 +401,31 @@ clutter_offscreen_effect_post_paint (ClutterEffect       *effect,
 | 
			
		||||
  /* Restore the previous opacity override */
 | 
			
		||||
  clutter_actor_set_opacity_override (priv->actor, priv->old_opacity_override);
 | 
			
		||||
 | 
			
		||||
  framebuffer = clutter_paint_context_get_framebuffer (paint_context);
 | 
			
		||||
  cogl_framebuffer_pop_matrix (framebuffer);
 | 
			
		||||
  clutter_paint_context_pop_framebuffer (paint_context);
 | 
			
		||||
  cogl_pop_matrix ();
 | 
			
		||||
  cogl_pop_framebuffer ();
 | 
			
		||||
 | 
			
		||||
  clutter_offscreen_effect_paint_texture (self, paint_context);
 | 
			
		||||
  clutter_offscreen_effect_paint_texture (self);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_offscreen_effect_paint (ClutterEffect           *effect,
 | 
			
		||||
                                ClutterPaintContext     *paint_context,
 | 
			
		||||
                                ClutterEffectPaintFlags  flags)
 | 
			
		||||
{
 | 
			
		||||
  ClutterOffscreenEffect *self = CLUTTER_OFFSCREEN_EFFECT (effect);
 | 
			
		||||
  ClutterOffscreenEffectPrivate *priv = self->priv;
 | 
			
		||||
 | 
			
		||||
  if (flags & CLUTTER_EFFECT_PAINT_BYPASS_EFFECT)
 | 
			
		||||
    {
 | 
			
		||||
      clutter_actor_continue_paint (priv->actor, paint_context);
 | 
			
		||||
      cogl_clear_object (&priv->offscreen);
 | 
			
		||||
      return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  /* If we've already got a cached image and the actor hasn't been redrawn
 | 
			
		||||
   * then we can just use the cached image in the FBO.
 | 
			
		||||
   */
 | 
			
		||||
  if (priv->offscreen == NULL || (flags & CLUTTER_EFFECT_PAINT_ACTOR_DIRTY))
 | 
			
		||||
    {
 | 
			
		||||
      ClutterEffectClass *effect_class = CLUTTER_EFFECT_GET_CLASS (effect);
 | 
			
		||||
      gboolean pre_paint_succeeded;
 | 
			
		||||
 | 
			
		||||
      pre_paint_succeeded = effect_class->pre_paint (effect, paint_context);
 | 
			
		||||
 | 
			
		||||
      clutter_actor_continue_paint (priv->actor, paint_context);
 | 
			
		||||
 | 
			
		||||
      if (pre_paint_succeeded)
 | 
			
		||||
        effect_class->post_paint (effect, paint_context);
 | 
			
		||||
      else
 | 
			
		||||
        g_clear_pointer (&priv->offscreen, cogl_object_unref);
 | 
			
		||||
      /* Chain up to the parent paint method which will call the pre and
 | 
			
		||||
         post paint functions to update the image */
 | 
			
		||||
      CLUTTER_EFFECT_CLASS (clutter_offscreen_effect_parent_class)->
 | 
			
		||||
        paint (effect, flags);
 | 
			
		||||
    }
 | 
			
		||||
  else
 | 
			
		||||
    clutter_offscreen_effect_paint_texture (self, paint_context);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_offscreen_effect_notify (GObject    *gobject,
 | 
			
		||||
                                 GParamSpec *pspec)
 | 
			
		||||
{
 | 
			
		||||
  ClutterOffscreenEffect *offscreen_effect = CLUTTER_OFFSCREEN_EFFECT (gobject);
 | 
			
		||||
  ClutterOffscreenEffectPrivate *priv = offscreen_effect->priv;
 | 
			
		||||
 | 
			
		||||
  if (strcmp (pspec->name, "enabled") == 0)
 | 
			
		||||
    g_clear_pointer (&priv->offscreen, cogl_object_unref);
 | 
			
		||||
 | 
			
		||||
  G_OBJECT_CLASS (clutter_offscreen_effect_parent_class)->notify (gobject, pspec);
 | 
			
		||||
    clutter_offscreen_effect_paint_texture (self);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
@@ -516,9 +434,14 @@ clutter_offscreen_effect_finalize (GObject *gobject)
 | 
			
		||||
  ClutterOffscreenEffect *self = CLUTTER_OFFSCREEN_EFFECT (gobject);
 | 
			
		||||
  ClutterOffscreenEffectPrivate *priv = self->priv;
 | 
			
		||||
 | 
			
		||||
  g_clear_pointer (&priv->offscreen, cogl_object_unref);
 | 
			
		||||
  g_clear_pointer (&priv->texture, cogl_object_unref);
 | 
			
		||||
  g_clear_pointer (&priv->target, cogl_object_unref);
 | 
			
		||||
  if (priv->offscreen)
 | 
			
		||||
    cogl_handle_unref (priv->offscreen);
 | 
			
		||||
 | 
			
		||||
  if (priv->target)
 | 
			
		||||
    cogl_handle_unref (priv->target);
 | 
			
		||||
 | 
			
		||||
  if (priv->texture)
 | 
			
		||||
    cogl_handle_unref (priv->texture);
 | 
			
		||||
 | 
			
		||||
  G_OBJECT_CLASS (clutter_offscreen_effect_parent_class)->finalize (gobject);
 | 
			
		||||
}
 | 
			
		||||
@@ -540,7 +463,6 @@ clutter_offscreen_effect_class_init (ClutterOffscreenEffectClass *klass)
 | 
			
		||||
  effect_class->paint = clutter_offscreen_effect_paint;
 | 
			
		||||
 | 
			
		||||
  gobject_class->finalize = clutter_offscreen_effect_finalize;
 | 
			
		||||
  gobject_class->notify = clutter_offscreen_effect_notify;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
@@ -563,7 +485,7 @@ clutter_offscreen_effect_init (ClutterOffscreenEffect *self)
 | 
			
		||||
 * used instead of clutter_offscreen_effect_get_target() when the
 | 
			
		||||
 * effect subclass wants to paint using its own material.
 | 
			
		||||
 *
 | 
			
		||||
 * Return value: (transfer none): a #CoglHandle or %NULL. The
 | 
			
		||||
 * Return value: (transfer none): a #CoglHandle or %COGL_INVALID_HANDLE. The
 | 
			
		||||
 *   returned texture is owned by Clutter and it should not be
 | 
			
		||||
 *   modified or freed
 | 
			
		||||
 *
 | 
			
		||||
@@ -606,20 +528,17 @@ clutter_offscreen_effect_get_target (ClutterOffscreenEffect *effect)
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_offscreen_effect_paint_target:
 | 
			
		||||
 * @effect: a #ClutterOffscreenEffect
 | 
			
		||||
 * @paint_context: a #ClutterPaintContext
 | 
			
		||||
 *
 | 
			
		||||
 * Calls the paint_target() virtual function of the @effect
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 1.4
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
clutter_offscreen_effect_paint_target (ClutterOffscreenEffect *effect,
 | 
			
		||||
                                       ClutterPaintContext    *paint_context)
 | 
			
		||||
clutter_offscreen_effect_paint_target (ClutterOffscreenEffect *effect)
 | 
			
		||||
{
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_OFFSCREEN_EFFECT (effect));
 | 
			
		||||
 | 
			
		||||
  CLUTTER_OFFSCREEN_EFFECT_GET_CLASS (effect)->paint_target (effect,
 | 
			
		||||
                                                             paint_context);
 | 
			
		||||
  CLUTTER_OFFSCREEN_EFFECT_GET_CLASS (effect)->paint_target (effect);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -631,7 +550,7 @@ clutter_offscreen_effect_paint_target (ClutterOffscreenEffect *effect,
 | 
			
		||||
 * Calls the create_texture() virtual function of the @effect
 | 
			
		||||
 *
 | 
			
		||||
 * Return value: (transfer full): a handle to a Cogl texture, or
 | 
			
		||||
 *   %NULL. The returned handle has its reference
 | 
			
		||||
 *   %COGL_INVALID_HANDLE. The returned handle has its reference
 | 
			
		||||
 *   count increased.
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 1.4
 | 
			
		||||
@@ -711,7 +630,7 @@ clutter_offscreen_effect_get_target_size (ClutterOffscreenEffect *effect,
 | 
			
		||||
 */
 | 
			
		||||
gboolean
 | 
			
		||||
clutter_offscreen_effect_get_target_rect (ClutterOffscreenEffect *effect,
 | 
			
		||||
                                          graphene_rect_t        *rect)
 | 
			
		||||
                                          ClutterRect            *rect)
 | 
			
		||||
{
 | 
			
		||||
  ClutterOffscreenEffectPrivate *priv;
 | 
			
		||||
 | 
			
		||||
@@ -723,11 +642,11 @@ clutter_offscreen_effect_get_target_rect (ClutterOffscreenEffect *effect,
 | 
			
		||||
  if (priv->texture == NULL)
 | 
			
		||||
    return FALSE;
 | 
			
		||||
 | 
			
		||||
  graphene_rect_init (rect,
 | 
			
		||||
                      priv->position.x,
 | 
			
		||||
                      priv->position.y,
 | 
			
		||||
                      cogl_texture_get_width (priv->texture),
 | 
			
		||||
                      cogl_texture_get_height (priv->texture));
 | 
			
		||||
  clutter_rect_init (rect,
 | 
			
		||||
                     priv->position.x,
 | 
			
		||||
                     priv->position.y,
 | 
			
		||||
                     cogl_texture_get_width (priv->texture),
 | 
			
		||||
                     cogl_texture_get_height (priv->texture));
 | 
			
		||||
 | 
			
		||||
  return TRUE;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -79,8 +79,7 @@ struct _ClutterOffscreenEffectClass
 | 
			
		||||
  CoglHandle (* create_texture) (ClutterOffscreenEffect *effect,
 | 
			
		||||
                                 gfloat                  width,
 | 
			
		||||
                                 gfloat                  height);
 | 
			
		||||
  void       (* paint_target)   (ClutterOffscreenEffect *effect,
 | 
			
		||||
                                 ClutterPaintContext    *paint_context);
 | 
			
		||||
  void       (* paint_target)   (ClutterOffscreenEffect *effect);
 | 
			
		||||
 | 
			
		||||
  /*< private >*/
 | 
			
		||||
  void (* _clutter_offscreen1) (void);
 | 
			
		||||
@@ -102,8 +101,7 @@ CLUTTER_EXPORT
 | 
			
		||||
CoglHandle      clutter_offscreen_effect_get_texture            (ClutterOffscreenEffect *effect);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void            clutter_offscreen_effect_paint_target           (ClutterOffscreenEffect *effect,
 | 
			
		||||
                                                                 ClutterPaintContext    *paint_context);
 | 
			
		||||
void            clutter_offscreen_effect_paint_target           (ClutterOffscreenEffect *effect);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
CoglHandle      clutter_offscreen_effect_create_texture         (ClutterOffscreenEffect *effect,
 | 
			
		||||
                                                                 gfloat                  width,
 | 
			
		||||
@@ -116,7 +114,7 @@ gboolean        clutter_offscreen_effect_get_target_size        (ClutterOffscree
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
gboolean        clutter_offscreen_effect_get_target_rect        (ClutterOffscreenEffect *effect,
 | 
			
		||||
                                                                 graphene_rect_t        *rect);
 | 
			
		||||
                                                                 ClutterRect            *rect);
 | 
			
		||||
 | 
			
		||||
G_END_DECLS
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,29 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) 2019 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_PAINT_CONTEXT_PRIVATE_H
 | 
			
		||||
#define CLUTTER_PAINT_CONTEXT_PRIVATE_H
 | 
			
		||||
 | 
			
		||||
#include "clutter-paint-context.h"
 | 
			
		||||
 | 
			
		||||
ClutterPaintContext * clutter_paint_context_new_for_view (ClutterStageView *view);
 | 
			
		||||
 | 
			
		||||
gboolean clutter_paint_context_is_drawing_off_stage (ClutterPaintContext *paint_context);
 | 
			
		||||
 | 
			
		||||
CoglFramebuffer * clutter_paint_context_get_base_framebuffer (ClutterPaintContext *paint_context);
 | 
			
		||||
 | 
			
		||||
#endif /* CLUTTER_PAINT_CONTEXT_PRIVATE_H */
 | 
			
		||||
@@ -1,161 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) 2019 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-paint-context-private.h"
 | 
			
		||||
 | 
			
		||||
struct _ClutterPaintContext
 | 
			
		||||
{
 | 
			
		||||
  grefcount ref_count;
 | 
			
		||||
 | 
			
		||||
  GList *framebuffers;
 | 
			
		||||
 | 
			
		||||
  ClutterStageView *view;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
G_DEFINE_BOXED_TYPE (ClutterPaintContext, clutter_paint_context,
 | 
			
		||||
                     clutter_paint_context_ref,
 | 
			
		||||
                     clutter_paint_context_unref)
 | 
			
		||||
 | 
			
		||||
ClutterPaintContext *
 | 
			
		||||
clutter_paint_context_new_for_view (ClutterStageView *view)
 | 
			
		||||
{
 | 
			
		||||
  ClutterPaintContext *paint_context;
 | 
			
		||||
  CoglFramebuffer *framebuffer;
 | 
			
		||||
 | 
			
		||||
  paint_context = g_new0 (ClutterPaintContext, 1);
 | 
			
		||||
  g_ref_count_init (&paint_context->ref_count);
 | 
			
		||||
  paint_context->view = view;
 | 
			
		||||
 | 
			
		||||
  framebuffer = clutter_stage_view_get_framebuffer (view);
 | 
			
		||||
  clutter_paint_context_push_framebuffer (paint_context, framebuffer);
 | 
			
		||||
 | 
			
		||||
  return paint_context;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_paint_context_new_for_framebuffer: (skip)
 | 
			
		||||
 */
 | 
			
		||||
ClutterPaintContext *
 | 
			
		||||
clutter_paint_context_new_for_framebuffer (CoglFramebuffer *framebuffer)
 | 
			
		||||
{
 | 
			
		||||
  ClutterPaintContext *paint_context;
 | 
			
		||||
 | 
			
		||||
  paint_context = g_new0 (ClutterPaintContext, 1);
 | 
			
		||||
  g_ref_count_init (&paint_context->ref_count);
 | 
			
		||||
 | 
			
		||||
  clutter_paint_context_push_framebuffer (paint_context, framebuffer);
 | 
			
		||||
 | 
			
		||||
  return paint_context;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ClutterPaintContext *
 | 
			
		||||
clutter_paint_context_ref (ClutterPaintContext *paint_context)
 | 
			
		||||
{
 | 
			
		||||
  g_ref_count_inc (&paint_context->ref_count);
 | 
			
		||||
  return paint_context;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_paint_context_dispose (ClutterPaintContext *paint_context)
 | 
			
		||||
{
 | 
			
		||||
  g_list_free_full (paint_context->framebuffers,
 | 
			
		||||
                    cogl_object_unref);
 | 
			
		||||
  paint_context->framebuffers = NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
clutter_paint_context_unref (ClutterPaintContext *paint_context)
 | 
			
		||||
{
 | 
			
		||||
  if (g_ref_count_dec (&paint_context->ref_count))
 | 
			
		||||
    {
 | 
			
		||||
      clutter_paint_context_dispose (paint_context);
 | 
			
		||||
      g_free (paint_context);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
clutter_paint_context_destroy (ClutterPaintContext *paint_context)
 | 
			
		||||
{
 | 
			
		||||
  clutter_paint_context_dispose (paint_context);
 | 
			
		||||
  clutter_paint_context_unref (paint_context);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
clutter_paint_context_push_framebuffer (ClutterPaintContext *paint_context,
 | 
			
		||||
                                        CoglFramebuffer     *framebuffer)
 | 
			
		||||
{
 | 
			
		||||
  paint_context->framebuffers = g_list_prepend (paint_context->framebuffers,
 | 
			
		||||
                                                cogl_object_ref (framebuffer));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
clutter_paint_context_pop_framebuffer (ClutterPaintContext *paint_context)
 | 
			
		||||
{
 | 
			
		||||
  g_return_if_fail (paint_context->framebuffers);
 | 
			
		||||
 | 
			
		||||
  cogl_object_unref (paint_context->framebuffers->data);
 | 
			
		||||
  paint_context->framebuffers =
 | 
			
		||||
    g_list_delete_link (paint_context->framebuffers,
 | 
			
		||||
                        paint_context->framebuffers);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_paint_context_get_framebuffer:
 | 
			
		||||
 * @paint_context: The #ClutterPaintContext
 | 
			
		||||
 *
 | 
			
		||||
 * Returns: (transfer none): The #CoglFramebuffer used for drawing
 | 
			
		||||
 */
 | 
			
		||||
CoglFramebuffer *
 | 
			
		||||
clutter_paint_context_get_framebuffer (ClutterPaintContext *paint_context)
 | 
			
		||||
{
 | 
			
		||||
  g_return_val_if_fail (paint_context->framebuffers, NULL);
 | 
			
		||||
 | 
			
		||||
  return paint_context->framebuffers->data;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
CoglFramebuffer *
 | 
			
		||||
clutter_paint_context_get_base_framebuffer (ClutterPaintContext *paint_context)
 | 
			
		||||
{
 | 
			
		||||
  return g_list_last (paint_context->framebuffers)->data;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_paint_context_get_stage_view: (skip)
 | 
			
		||||
 */
 | 
			
		||||
ClutterStageView *
 | 
			
		||||
clutter_paint_context_get_stage_view (ClutterPaintContext *paint_context)
 | 
			
		||||
{
 | 
			
		||||
  return paint_context->view;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_paint_context_is_drawing_off_stage: (skip)
 | 
			
		||||
 *
 | 
			
		||||
 * Return %TRUE if the paint context is currently drawing off stage.
 | 
			
		||||
 * This happens if there are any framebuffers pushed, and the base framebuffer
 | 
			
		||||
 * comes from the stage view.
 | 
			
		||||
 */
 | 
			
		||||
gboolean
 | 
			
		||||
clutter_paint_context_is_drawing_off_stage (ClutterPaintContext *paint_context)
 | 
			
		||||
{
 | 
			
		||||
  if (g_list_length (paint_context->framebuffers) > 1)
 | 
			
		||||
    return TRUE;
 | 
			
		||||
 | 
			
		||||
  return !paint_context->view;
 | 
			
		||||
}
 | 
			
		||||
@@ -1,62 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) 2019 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_PAINT_CONTEXT_H
 | 
			
		||||
#define CLUTTER_PAINT_CONTEXT_H
 | 
			
		||||
 | 
			
		||||
#if !defined(__CLUTTER_H_INSIDE__) && !defined(CLUTTER_COMPILATION)
 | 
			
		||||
#error "Only <clutter/clutter.h> can be included directly."
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include <glib-object.h>
 | 
			
		||||
 | 
			
		||||
#include "clutter-macros.h"
 | 
			
		||||
#include "clutter-stage-view.h"
 | 
			
		||||
 | 
			
		||||
typedef struct _ClutterPaintContext ClutterPaintContext;
 | 
			
		||||
 | 
			
		||||
#define CLUTTER_TYPE_PAINT_CONTEXT (clutter_paint_context_get_type ())
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
GType clutter_paint_context_get_type (void);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
ClutterPaintContext * clutter_paint_context_new_for_framebuffer (CoglFramebuffer *framebuffer);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
ClutterPaintContext * clutter_paint_context_ref (ClutterPaintContext *paint_context);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void clutter_paint_context_unref (ClutterPaintContext *paint_context);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void clutter_paint_context_destroy (ClutterPaintContext *paint_context);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
CoglFramebuffer * clutter_paint_context_get_framebuffer (ClutterPaintContext *paint_context);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
ClutterStageView * clutter_paint_context_get_stage_view (ClutterPaintContext *paint_context);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void clutter_paint_context_push_framebuffer (ClutterPaintContext *paint_context,
 | 
			
		||||
                                             CoglFramebuffer     *framebuffer);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void clutter_paint_context_pop_framebuffer (ClutterPaintContext *paint_context);
 | 
			
		||||
 | 
			
		||||
#endif /* CLUTTER_PAINT_CONTEXT_H */
 | 
			
		||||
@@ -27,7 +27,6 @@
 | 
			
		||||
 | 
			
		||||
#include <glib-object.h>
 | 
			
		||||
#include <json-glib/json-glib.h>
 | 
			
		||||
#include <clutter/clutter-paint-context.h>
 | 
			
		||||
#include <clutter/clutter-paint-node.h>
 | 
			
		||||
 | 
			
		||||
G_BEGIN_DECLS
 | 
			
		||||
@@ -49,11 +48,11 @@ struct _ClutterPaintNode
 | 
			
		||||
  ClutterPaintNode *next_sibling;
 | 
			
		||||
  ClutterPaintNode *last_child;
 | 
			
		||||
 | 
			
		||||
  guint n_children;
 | 
			
		||||
 | 
			
		||||
  GArray *operations;
 | 
			
		||||
 | 
			
		||||
  const gchar *name;
 | 
			
		||||
 | 
			
		||||
  guint n_children;
 | 
			
		||||
  gchar *name;
 | 
			
		||||
 | 
			
		||||
  volatile int ref_count;
 | 
			
		||||
};
 | 
			
		||||
@@ -64,12 +63,9 @@ struct _ClutterPaintNodeClass
 | 
			
		||||
 | 
			
		||||
  void     (* finalize)  (ClutterPaintNode *node);
 | 
			
		||||
 | 
			
		||||
  gboolean (* pre_draw)  (ClutterPaintNode    *node,
 | 
			
		||||
                          ClutterPaintContext *paint_context);
 | 
			
		||||
  void     (* draw)      (ClutterPaintNode    *node,
 | 
			
		||||
                          ClutterPaintContext *paint_context);
 | 
			
		||||
  void     (* post_draw) (ClutterPaintNode    *node,
 | 
			
		||||
                          ClutterPaintContext *paint_context);
 | 
			
		||||
  gboolean (* pre_draw)  (ClutterPaintNode *node);
 | 
			
		||||
  void     (* draw)      (ClutterPaintNode *node);
 | 
			
		||||
  void     (* post_draw) (ClutterPaintNode *node);
 | 
			
		||||
 | 
			
		||||
  JsonNode*(* serialize) (ClutterPaintNode *node);
 | 
			
		||||
 | 
			
		||||
@@ -78,8 +74,7 @@ struct _ClutterPaintNodeClass
 | 
			
		||||
 | 
			
		||||
#define PAINT_OP_INIT   { PAINT_OP_INVALID }
 | 
			
		||||
 | 
			
		||||
typedef enum
 | 
			
		||||
{
 | 
			
		||||
typedef enum {
 | 
			
		||||
  PAINT_OP_INVALID = 0,
 | 
			
		||||
  PAINT_OP_TEX_RECT,
 | 
			
		||||
  PAINT_OP_MULTITEX_RECT,
 | 
			
		||||
@@ -115,8 +110,7 @@ void                    _clutter_paint_node_init_types                  (void);
 | 
			
		||||
gpointer                _clutter_paint_node_create                      (GType gtype);
 | 
			
		||||
 | 
			
		||||
ClutterPaintNode *      _clutter_transform_node_new                     (const CoglMatrix            *matrix);
 | 
			
		||||
ClutterPaintNode *      _clutter_dummy_node_new                         (ClutterActor                *actor,
 | 
			
		||||
                                                                         CoglFramebuffer             *framebuffer);
 | 
			
		||||
ClutterPaintNode *      _clutter_dummy_node_new                         (ClutterActor                *actor);
 | 
			
		||||
 | 
			
		||||
void                    _clutter_paint_node_dump_tree                   (ClutterPaintNode            *root);
 | 
			
		||||
 | 
			
		||||
@@ -143,6 +137,32 @@ G_GNUC_INTERNAL
 | 
			
		||||
ClutterPaintNode *      clutter_paint_node_get_last_child               (ClutterPaintNode      *node);
 | 
			
		||||
G_GNUC_INTERNAL
 | 
			
		||||
ClutterPaintNode *      clutter_paint_node_get_parent                   (ClutterPaintNode      *node);
 | 
			
		||||
G_GNUC_INTERNAL
 | 
			
		||||
CoglFramebuffer *       clutter_paint_node_get_framebuffer              (ClutterPaintNode      *node);
 | 
			
		||||
 | 
			
		||||
#define CLUTTER_TYPE_LAYER_NODE                 (_clutter_layer_node_get_type ())
 | 
			
		||||
#define CLUTTER_LAYER_NODE(obj)                 (G_TYPE_CHECK_INSTANCE_CAST ((obj), CLUTTER_TYPE_LAYER_NODE, ClutterLayerNode))
 | 
			
		||||
#define CLUTTER_IS_LAYER_NODE(obj)              (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CLUTTER_TYPE_LAYER_NODE))
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * ClutterLayerNode:
 | 
			
		||||
 *
 | 
			
		||||
 * The #ClutterLayerNode structure is an opaque
 | 
			
		||||
 * type whose members cannot be directly accessed.
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 1.10
 | 
			
		||||
 */
 | 
			
		||||
typedef struct _ClutterLayerNode                ClutterLayerNode;
 | 
			
		||||
typedef struct _ClutterLayerNodeClass           ClutterLayerNodeClass;
 | 
			
		||||
 | 
			
		||||
GType _clutter_layer_node_get_type (void) G_GNUC_CONST;
 | 
			
		||||
 | 
			
		||||
ClutterPaintNode *      _clutter_layer_node_new         (const CoglMatrix        *projection,
 | 
			
		||||
                                                         const cairo_rectangle_t *viewport,
 | 
			
		||||
                                                         float                    width,
 | 
			
		||||
                                                         float                    height,
 | 
			
		||||
                                                         guint8                   opacity);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
G_END_DECLS
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -171,6 +171,8 @@ clutter_paint_node_real_finalize (ClutterPaintNode *node)
 | 
			
		||||
{
 | 
			
		||||
  ClutterPaintNode *iter;
 | 
			
		||||
 | 
			
		||||
  g_free (node->name);
 | 
			
		||||
 | 
			
		||||
  if (node->operations != NULL)
 | 
			
		||||
    {
 | 
			
		||||
      guint i;
 | 
			
		||||
@@ -200,21 +202,18 @@ clutter_paint_node_real_finalize (ClutterPaintNode *node)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
clutter_paint_node_real_pre_draw (ClutterPaintNode    *node,
 | 
			
		||||
                                  ClutterPaintContext *paint_context)
 | 
			
		||||
clutter_paint_node_real_pre_draw (ClutterPaintNode *node)
 | 
			
		||||
{
 | 
			
		||||
  return FALSE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_paint_node_real_draw (ClutterPaintNode    *node,
 | 
			
		||||
                              ClutterPaintContext *paint_context)
 | 
			
		||||
clutter_paint_node_real_draw (ClutterPaintNode *node)
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_paint_node_real_post_draw (ClutterPaintNode    *node,
 | 
			
		||||
                                   ClutterPaintContext *paint_context)
 | 
			
		||||
clutter_paint_node_real_post_draw (ClutterPaintNode *node)
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -295,8 +294,7 @@ clutter_paint_node_get_type (void)
 | 
			
		||||
 *
 | 
			
		||||
 * The @name will be used for debugging purposes.
 | 
			
		||||
 *
 | 
			
		||||
 * The @node will intern @name using g_intern_string(). If you have access to a
 | 
			
		||||
 * static string, use clutter_paint_node_set_static_name() instead.
 | 
			
		||||
 * The @node will copy the passed string.
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 1.10
 | 
			
		||||
 */
 | 
			
		||||
@@ -306,22 +304,8 @@ clutter_paint_node_set_name (ClutterPaintNode *node,
 | 
			
		||||
{
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_PAINT_NODE (node));
 | 
			
		||||
 | 
			
		||||
  node->name = g_intern_string (name);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_paint_node_set_static_name: (skip)
 | 
			
		||||
 *
 | 
			
		||||
 * Like clutter_paint_node_set_name() but uses a static or interned string
 | 
			
		||||
 * containing the name.
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
clutter_paint_node_set_static_name (ClutterPaintNode *node,
 | 
			
		||||
                                    const char       *name)
 | 
			
		||||
{
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_PAINT_NODE (node));
 | 
			
		||||
 | 
			
		||||
  node->name = name;
 | 
			
		||||
  g_free (node->name);
 | 
			
		||||
  node->name = g_strdup (name);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -1013,30 +997,29 @@ clutter_paint_node_add_primitive (ClutterPaintNode *node,
 | 
			
		||||
 * its children, if any.
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
clutter_paint_node_paint (ClutterPaintNode    *node,
 | 
			
		||||
                          ClutterPaintContext *paint_context)
 | 
			
		||||
clutter_paint_node_paint (ClutterPaintNode *node)
 | 
			
		||||
{
 | 
			
		||||
  ClutterPaintNodeClass *klass = CLUTTER_PAINT_NODE_GET_CLASS (node);
 | 
			
		||||
  ClutterPaintNode *iter;
 | 
			
		||||
  gboolean res;
 | 
			
		||||
 | 
			
		||||
  res = klass->pre_draw (node, paint_context);
 | 
			
		||||
  res = klass->pre_draw (node);
 | 
			
		||||
 | 
			
		||||
  if (res)
 | 
			
		||||
    {
 | 
			
		||||
      klass->draw (node, paint_context);
 | 
			
		||||
      klass->draw (node);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  for (iter = node->first_child;
 | 
			
		||||
       iter != NULL;
 | 
			
		||||
       iter = iter->next_sibling)
 | 
			
		||||
    {
 | 
			
		||||
      clutter_paint_node_paint (iter, paint_context);
 | 
			
		||||
      clutter_paint_node_paint (iter);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  if (res)
 | 
			
		||||
    {
 | 
			
		||||
      klass->post_draw (node, paint_context);
 | 
			
		||||
      klass->post_draw (node);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -1116,12 +1099,12 @@ clutter_paint_node_to_json (ClutterPaintNode *node)
 | 
			
		||||
 | 
			
		||||
            case PAINT_OP_PATH:
 | 
			
		||||
              json_builder_set_member_name (builder, "path");
 | 
			
		||||
              json_builder_add_int_value (builder, (intptr_t) op->op.path);
 | 
			
		||||
              json_builder_add_int_value (builder, (gint64) op->op.path);
 | 
			
		||||
              break;
 | 
			
		||||
 | 
			
		||||
            case PAINT_OP_PRIMITIVE:
 | 
			
		||||
              json_builder_set_member_name (builder, "primitive");
 | 
			
		||||
              json_builder_add_int_value (builder, (intptr_t) op->op.primitive);
 | 
			
		||||
              json_builder_add_int_value (builder, (gint64) op->op.primitive);
 | 
			
		||||
              break;
 | 
			
		||||
 | 
			
		||||
            case PAINT_OP_INVALID:
 | 
			
		||||
@@ -1211,25 +1194,18 @@ clutter_paint_node_get_root (ClutterPaintNode *node)
 | 
			
		||||
  return iter;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_paint_node_get_framebuffer:
 | 
			
		||||
 * @node: a #ClutterPaintNode
 | 
			
		||||
 *
 | 
			
		||||
 * Retrieves the #CoglFramebuffer that @node will draw
 | 
			
		||||
 * into, if it the root node has a custom framebuffer set.
 | 
			
		||||
 *
 | 
			
		||||
 * Returns: (transfer none): a #CoglFramebuffer or %NULL if no custom one is
 | 
			
		||||
 * set.
 | 
			
		||||
 */
 | 
			
		||||
CoglFramebuffer *
 | 
			
		||||
clutter_paint_node_get_framebuffer (ClutterPaintNode *node)
 | 
			
		||||
{
 | 
			
		||||
  ClutterPaintNode *root = clutter_paint_node_get_root (node);
 | 
			
		||||
  ClutterPaintNodeClass *klass;
 | 
			
		||||
 | 
			
		||||
  if (root == NULL)
 | 
			
		||||
    return NULL;
 | 
			
		||||
 | 
			
		||||
  klass = CLUTTER_PAINT_NODE_GET_CLASS (root);
 | 
			
		||||
  if (klass->get_framebuffer != NULL)
 | 
			
		||||
    return klass->get_framebuffer (root);
 | 
			
		||||
  else
 | 
			
		||||
    return NULL;
 | 
			
		||||
 | 
			
		||||
  return cogl_get_draw_framebuffer ();
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -50,18 +50,11 @@ CLUTTER_EXPORT
 | 
			
		||||
void                    clutter_paint_node_unref                        (ClutterPaintNode      *node);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void                    clutter_paint_node_paint                        (ClutterPaintNode      *node,
 | 
			
		||||
                                                                         ClutterPaintContext   *paint_context);
 | 
			
		||||
void                    clutter_paint_node_paint                        (ClutterPaintNode      *node);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void                    clutter_paint_node_set_name                     (ClutterPaintNode      *node,
 | 
			
		||||
                                                                         const char            *name);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void                    clutter_paint_node_set_static_name              (ClutterPaintNode      *node,
 | 
			
		||||
                                                                         const char            *name);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
CoglFramebuffer *       clutter_paint_node_get_framebuffer              (ClutterPaintNode      *node);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void                    clutter_paint_node_add_child                    (ClutterPaintNode      *node,
 | 
			
		||||
 
 | 
			
		||||
@@ -44,7 +44,6 @@
 | 
			
		||||
#include "clutter-color.h"
 | 
			
		||||
#include "clutter-debug.h"
 | 
			
		||||
#include "clutter-private.h"
 | 
			
		||||
#include "clutter-paint-context-private.h"
 | 
			
		||||
 | 
			
		||||
#include "clutter-paint-nodes.h"
 | 
			
		||||
 | 
			
		||||
@@ -76,7 +75,8 @@ _clutter_paint_node_init_types (void)
 | 
			
		||||
  cogl_pipeline_set_color (default_color_pipeline, &cogl_color);
 | 
			
		||||
 | 
			
		||||
  default_texture_pipeline = cogl_pipeline_new (ctx);
 | 
			
		||||
  cogl_pipeline_set_layer_null_texture (default_texture_pipeline, 0);
 | 
			
		||||
  cogl_pipeline_set_layer_null_texture (default_texture_pipeline, 0,
 | 
			
		||||
                                        COGL_TEXTURE_TYPE_2D);
 | 
			
		||||
  cogl_pipeline_set_color (default_texture_pipeline, &cogl_color);
 | 
			
		||||
  cogl_pipeline_set_layer_wrap_mode (default_texture_pipeline, 0,
 | 
			
		||||
                                     COGL_PIPELINE_WRAP_MODE_AUTOMATIC);
 | 
			
		||||
@@ -104,12 +104,11 @@ struct _ClutterRootNode
 | 
			
		||||
G_DEFINE_TYPE (ClutterRootNode, clutter_root_node, CLUTTER_TYPE_PAINT_NODE)
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
clutter_root_node_pre_draw (ClutterPaintNode    *node,
 | 
			
		||||
                            ClutterPaintContext *paint_context)
 | 
			
		||||
clutter_root_node_pre_draw (ClutterPaintNode *node)
 | 
			
		||||
{
 | 
			
		||||
  ClutterRootNode *rnode = (ClutterRootNode *) node;
 | 
			
		||||
 | 
			
		||||
  clutter_paint_context_push_framebuffer (paint_context, rnode->framebuffer);
 | 
			
		||||
  cogl_push_framebuffer (rnode->framebuffer);
 | 
			
		||||
 | 
			
		||||
  cogl_framebuffer_clear (rnode->framebuffer,
 | 
			
		||||
                          rnode->clear_flags,
 | 
			
		||||
@@ -119,10 +118,9 @@ clutter_root_node_pre_draw (ClutterPaintNode    *node,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_root_node_post_draw (ClutterPaintNode    *node,
 | 
			
		||||
                             ClutterPaintContext *paint_context)
 | 
			
		||||
clutter_root_node_post_draw (ClutterPaintNode *node)
 | 
			
		||||
{
 | 
			
		||||
  clutter_paint_context_pop_framebuffer (paint_context);
 | 
			
		||||
  cogl_pop_framebuffer ();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
@@ -166,8 +164,6 @@ clutter_root_node_new (CoglFramebuffer    *framebuffer,
 | 
			
		||||
{
 | 
			
		||||
  ClutterRootNode *res;
 | 
			
		||||
 | 
			
		||||
  g_return_val_if_fail (framebuffer, NULL);
 | 
			
		||||
 | 
			
		||||
  res = _clutter_paint_node_create (CLUTTER_TYPE_ROOT_NODE);
 | 
			
		||||
 | 
			
		||||
  cogl_color_init_from_4ub (&res->clear_color,
 | 
			
		||||
@@ -177,52 +173,54 @@ clutter_root_node_new (CoglFramebuffer    *framebuffer,
 | 
			
		||||
                            clear_color->alpha);
 | 
			
		||||
  cogl_color_premultiply (&res->clear_color);
 | 
			
		||||
 | 
			
		||||
  res->framebuffer = cogl_object_ref (framebuffer);
 | 
			
		||||
  if (G_LIKELY (framebuffer != NULL))
 | 
			
		||||
    res->framebuffer = cogl_object_ref (framebuffer);
 | 
			
		||||
  else
 | 
			
		||||
    res->framebuffer = cogl_object_ref (cogl_get_draw_framebuffer ());
 | 
			
		||||
 | 
			
		||||
  res->clear_flags = clear_flags;
 | 
			
		||||
 | 
			
		||||
  return (ClutterPaintNode *) res;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * ClutterTransformNode
 | 
			
		||||
 * Transform node
 | 
			
		||||
 *
 | 
			
		||||
 * A private PaintNode, that changes the modelview of its child
 | 
			
		||||
 * nodes.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
struct _ClutterTransformNode
 | 
			
		||||
{
 | 
			
		||||
#define clutter_transform_node_get_type _clutter_transform_node_get_type
 | 
			
		||||
 | 
			
		||||
typedef struct _ClutterTransformNode {
 | 
			
		||||
  ClutterPaintNode parent_instance;
 | 
			
		||||
 | 
			
		||||
  CoglMatrix transform;
 | 
			
		||||
};
 | 
			
		||||
  CoglMatrix modelview;
 | 
			
		||||
} ClutterTransformNode;
 | 
			
		||||
 | 
			
		||||
struct _ClutterTransformNodeClass
 | 
			
		||||
{
 | 
			
		||||
  ClutterPaintNodeClass parent_class;
 | 
			
		||||
};
 | 
			
		||||
typedef struct _ClutterPaintNodeClass   ClutterTransformNodeClass;
 | 
			
		||||
 | 
			
		||||
G_DEFINE_TYPE (ClutterTransformNode, clutter_transform_node, CLUTTER_TYPE_PAINT_NODE)
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
clutter_transform_node_pre_draw (ClutterPaintNode    *node,
 | 
			
		||||
                                 ClutterPaintContext *paint_context)
 | 
			
		||||
clutter_transform_node_pre_draw (ClutterPaintNode *node)
 | 
			
		||||
{
 | 
			
		||||
  ClutterTransformNode *transform_node = (ClutterTransformNode *) node;
 | 
			
		||||
  CoglFramebuffer *fb =
 | 
			
		||||
   clutter_paint_context_get_framebuffer (paint_context);
 | 
			
		||||
  ClutterTransformNode *tnode = (ClutterTransformNode *) node;
 | 
			
		||||
  CoglMatrix matrix;
 | 
			
		||||
 | 
			
		||||
  cogl_framebuffer_push_matrix (fb);
 | 
			
		||||
  cogl_framebuffer_transform (fb, &transform_node->transform);
 | 
			
		||||
  cogl_push_matrix ();
 | 
			
		||||
 | 
			
		||||
  cogl_get_modelview_matrix (&matrix);
 | 
			
		||||
  cogl_matrix_multiply (&matrix, &matrix, &tnode->modelview);
 | 
			
		||||
  cogl_set_modelview_matrix (&matrix);
 | 
			
		||||
 | 
			
		||||
  return TRUE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_transform_node_post_draw (ClutterPaintNode    *node,
 | 
			
		||||
                                  ClutterPaintContext *paint_context)
 | 
			
		||||
clutter_transform_node_post_draw (ClutterPaintNode *node)
 | 
			
		||||
{
 | 
			
		||||
  CoglFramebuffer *fb =
 | 
			
		||||
   clutter_paint_context_get_framebuffer (paint_context);
 | 
			
		||||
 | 
			
		||||
  cogl_framebuffer_pop_matrix (fb);
 | 
			
		||||
  cogl_pop_matrix ();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
@@ -238,24 +236,18 @@ clutter_transform_node_class_init (ClutterTransformNodeClass *klass)
 | 
			
		||||
static void
 | 
			
		||||
clutter_transform_node_init (ClutterTransformNode *self)
 | 
			
		||||
{
 | 
			
		||||
  cogl_matrix_init_identity (&self->transform);
 | 
			
		||||
  cogl_matrix_init_identity (&self->modelview);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * clutter_transform_node_new:
 | 
			
		||||
 * @transform: (nullable): the transform matrix to apply
 | 
			
		||||
 *
 | 
			
		||||
 * Return value: (transfer full): the newly created #ClutterTransformNode.
 | 
			
		||||
 *   Use clutter_paint_node_unref() when done.
 | 
			
		||||
 */
 | 
			
		||||
ClutterPaintNode *
 | 
			
		||||
clutter_transform_node_new (const CoglMatrix *transform)
 | 
			
		||||
_clutter_transform_node_new (const CoglMatrix *modelview)
 | 
			
		||||
{
 | 
			
		||||
  ClutterTransformNode *res;
 | 
			
		||||
 | 
			
		||||
  res = _clutter_paint_node_create (CLUTTER_TYPE_TRANSFORM_NODE);
 | 
			
		||||
  if (transform)
 | 
			
		||||
    res->transform = *transform;
 | 
			
		||||
  res = _clutter_paint_node_create (_clutter_transform_node_get_type ());
 | 
			
		||||
 | 
			
		||||
  if (modelview != NULL)
 | 
			
		||||
    res->modelview = *modelview;
 | 
			
		||||
 | 
			
		||||
  return (ClutterPaintNode *) res;
 | 
			
		||||
}
 | 
			
		||||
@@ -283,8 +275,7 @@ struct _ClutterDummyNode
 | 
			
		||||
G_DEFINE_TYPE (ClutterDummyNode, clutter_dummy_node, CLUTTER_TYPE_PAINT_NODE)
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
clutter_dummy_node_pre_draw (ClutterPaintNode    *node,
 | 
			
		||||
                             ClutterPaintContext *paint_context)
 | 
			
		||||
clutter_dummy_node_pre_draw (ClutterPaintNode *node)
 | 
			
		||||
{
 | 
			
		||||
  return TRUE;
 | 
			
		||||
}
 | 
			
		||||
@@ -321,16 +312,6 @@ clutter_dummy_node_get_framebuffer (ClutterPaintNode *node)
 | 
			
		||||
  return dnode->framebuffer;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_dummy_node_finalize (ClutterPaintNode *node)
 | 
			
		||||
{
 | 
			
		||||
  ClutterDummyNode *dnode = (ClutterDummyNode *) node;
 | 
			
		||||
 | 
			
		||||
  cogl_clear_object (&dnode->framebuffer);
 | 
			
		||||
 | 
			
		||||
  CLUTTER_PAINT_NODE_CLASS (clutter_dummy_node_parent_class)->finalize (node);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_dummy_node_class_init (ClutterDummyNodeClass *klass)
 | 
			
		||||
{
 | 
			
		||||
@@ -339,7 +320,6 @@ clutter_dummy_node_class_init (ClutterDummyNodeClass *klass)
 | 
			
		||||
  node_class->pre_draw = clutter_dummy_node_pre_draw;
 | 
			
		||||
  node_class->serialize = clutter_dummy_node_serialize;
 | 
			
		||||
  node_class->get_framebuffer = clutter_dummy_node_get_framebuffer;
 | 
			
		||||
  node_class->finalize = clutter_dummy_node_finalize;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
@@ -348,8 +328,7 @@ clutter_dummy_node_init (ClutterDummyNode *self)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ClutterPaintNode *
 | 
			
		||||
_clutter_dummy_node_new (ClutterActor    *actor,
 | 
			
		||||
                         CoglFramebuffer *framebuffer)
 | 
			
		||||
_clutter_dummy_node_new (ClutterActor *actor)
 | 
			
		||||
{
 | 
			
		||||
  ClutterPaintNode *res;
 | 
			
		||||
  ClutterDummyNode *dnode;
 | 
			
		||||
@@ -358,7 +337,7 @@ _clutter_dummy_node_new (ClutterActor    *actor,
 | 
			
		||||
 | 
			
		||||
  dnode = (ClutterDummyNode *) res;
 | 
			
		||||
  dnode->actor = actor;
 | 
			
		||||
  dnode->framebuffer = cogl_object_ref (framebuffer);
 | 
			
		||||
  dnode->framebuffer = _clutter_actor_get_active_framebuffer (actor);
 | 
			
		||||
 | 
			
		||||
  return res;
 | 
			
		||||
}
 | 
			
		||||
@@ -401,34 +380,22 @@ clutter_pipeline_node_finalize (ClutterPaintNode *node)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
clutter_pipeline_node_pre_draw (ClutterPaintNode    *node,
 | 
			
		||||
                                ClutterPaintContext *paint_context)
 | 
			
		||||
clutter_pipeline_node_pre_draw (ClutterPaintNode *node)
 | 
			
		||||
{
 | 
			
		||||
  ClutterPipelineNode *pnode = CLUTTER_PIPELINE_NODE (node);
 | 
			
		||||
 | 
			
		||||
  if (node->operations != NULL &&
 | 
			
		||||
      pnode->pipeline != NULL)
 | 
			
		||||
    return TRUE;
 | 
			
		||||
    {
 | 
			
		||||
      cogl_push_source (pnode->pipeline);
 | 
			
		||||
      return TRUE;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return FALSE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static CoglFramebuffer *
 | 
			
		||||
get_target_framebuffer (ClutterPaintNode    *node,
 | 
			
		||||
                        ClutterPaintContext *paint_context)
 | 
			
		||||
{
 | 
			
		||||
  CoglFramebuffer *framebuffer;
 | 
			
		||||
 | 
			
		||||
  framebuffer = clutter_paint_node_get_framebuffer (node);
 | 
			
		||||
  if (framebuffer)
 | 
			
		||||
    return framebuffer;
 | 
			
		||||
 | 
			
		||||
  return clutter_paint_context_get_framebuffer (paint_context);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_pipeline_node_draw (ClutterPaintNode    *node,
 | 
			
		||||
                            ClutterPaintContext *paint_context)
 | 
			
		||||
clutter_pipeline_node_draw (ClutterPaintNode *node)
 | 
			
		||||
{
 | 
			
		||||
  ClutterPipelineNode *pnode = CLUTTER_PIPELINE_NODE (node);
 | 
			
		||||
  CoglFramebuffer *fb;
 | 
			
		||||
@@ -440,7 +407,7 @@ clutter_pipeline_node_draw (ClutterPaintNode    *node,
 | 
			
		||||
  if (node->operations == NULL)
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  fb = clutter_paint_context_get_framebuffer (paint_context);
 | 
			
		||||
  fb = clutter_paint_node_get_framebuffer (node);
 | 
			
		||||
 | 
			
		||||
  for (i = 0; i < node->operations->len; i++)
 | 
			
		||||
    {
 | 
			
		||||
@@ -454,20 +421,18 @@ clutter_pipeline_node_draw (ClutterPaintNode    *node,
 | 
			
		||||
          break;
 | 
			
		||||
 | 
			
		||||
        case PAINT_OP_TEX_RECT:
 | 
			
		||||
          cogl_framebuffer_draw_textured_rectangle (fb,
 | 
			
		||||
                                                    pnode->pipeline,
 | 
			
		||||
                                                    op->op.texrect[0],
 | 
			
		||||
                                                    op->op.texrect[1],
 | 
			
		||||
                                                    op->op.texrect[2],
 | 
			
		||||
                                                    op->op.texrect[3],
 | 
			
		||||
                                                    op->op.texrect[4],
 | 
			
		||||
                                                    op->op.texrect[5],
 | 
			
		||||
                                                    op->op.texrect[6],
 | 
			
		||||
                                                    op->op.texrect[7]);
 | 
			
		||||
          cogl_rectangle_with_texture_coords (op->op.texrect[0],
 | 
			
		||||
                                              op->op.texrect[1],
 | 
			
		||||
                                              op->op.texrect[2],
 | 
			
		||||
                                              op->op.texrect[3],
 | 
			
		||||
                                              op->op.texrect[4],
 | 
			
		||||
                                              op->op.texrect[5],
 | 
			
		||||
                                              op->op.texrect[6],
 | 
			
		||||
                                              op->op.texrect[7]);
 | 
			
		||||
          break;
 | 
			
		||||
 | 
			
		||||
        case PAINT_OP_MULTITEX_RECT:
 | 
			
		||||
          cogl_framebuffer_draw_multitextured_rectangle (fb,
 | 
			
		||||
          cogl_framebuffer_draw_multitextured_rectangle (cogl_get_draw_framebuffer (),
 | 
			
		||||
                                                         pnode->pipeline,
 | 
			
		||||
                                                         op->op.texrect[0],
 | 
			
		||||
                                                         op->op.texrect[1],
 | 
			
		||||
@@ -478,7 +443,7 @@ clutter_pipeline_node_draw (ClutterPaintNode    *node,
 | 
			
		||||
          break;
 | 
			
		||||
 | 
			
		||||
        case PAINT_OP_PATH:
 | 
			
		||||
          cogl_framebuffer_fill_path (fb, pnode->pipeline, op->op.path);
 | 
			
		||||
          cogl_path_fill (op->op.path);
 | 
			
		||||
          break;
 | 
			
		||||
 | 
			
		||||
        case PAINT_OP_PRIMITIVE:
 | 
			
		||||
@@ -491,9 +456,9 @@ clutter_pipeline_node_draw (ClutterPaintNode    *node,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_pipeline_node_post_draw (ClutterPaintNode    *node,
 | 
			
		||||
                                 ClutterPaintContext *paint_context)
 | 
			
		||||
clutter_pipeline_node_post_draw (ClutterPaintNode *node)
 | 
			
		||||
{
 | 
			
		||||
  cogl_pop_source ();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static JsonNode *
 | 
			
		||||
@@ -812,8 +777,7 @@ clutter_text_node_finalize (ClutterPaintNode *node)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
clutter_text_node_pre_draw (ClutterPaintNode    *node,
 | 
			
		||||
                            ClutterPaintContext *paint_context)
 | 
			
		||||
clutter_text_node_pre_draw (ClutterPaintNode *node)
 | 
			
		||||
{
 | 
			
		||||
  ClutterTextNode *tnode = CLUTTER_TEXT_NODE (node);
 | 
			
		||||
 | 
			
		||||
@@ -821,8 +785,7 @@ clutter_text_node_pre_draw (ClutterPaintNode    *node,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_text_node_draw (ClutterPaintNode    *node,
 | 
			
		||||
                        ClutterPaintContext *paint_context)
 | 
			
		||||
clutter_text_node_draw (ClutterPaintNode *node)
 | 
			
		||||
{
 | 
			
		||||
  ClutterTextNode *tnode = CLUTTER_TEXT_NODE (node);
 | 
			
		||||
  PangoRectangle extents;
 | 
			
		||||
@@ -832,7 +795,7 @@ clutter_text_node_draw (ClutterPaintNode    *node,
 | 
			
		||||
  if (node->operations == NULL)
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  fb = get_target_framebuffer (node, paint_context);
 | 
			
		||||
  fb = clutter_paint_node_get_framebuffer (node);
 | 
			
		||||
 | 
			
		||||
  pango_layout_get_pixel_extents (tnode->layout, NULL, &extents);
 | 
			
		||||
 | 
			
		||||
@@ -865,11 +828,11 @@ clutter_text_node_draw (ClutterPaintNode    *node,
 | 
			
		||||
              clipped = TRUE;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
          cogl_pango_show_layout (fb,
 | 
			
		||||
                                  tnode->layout,
 | 
			
		||||
                                  op->op.texrect[0],
 | 
			
		||||
                                  op->op.texrect[1],
 | 
			
		||||
                                  &tnode->color);
 | 
			
		||||
          cogl_pango_render_layout (tnode->layout,
 | 
			
		||||
                                    op->op.texrect[0],
 | 
			
		||||
                                    op->op.texrect[1],
 | 
			
		||||
                                    &tnode->color,
 | 
			
		||||
                                    0);
 | 
			
		||||
 | 
			
		||||
          if (clipped)
 | 
			
		||||
            cogl_framebuffer_pop_clip (fb);
 | 
			
		||||
@@ -1008,8 +971,7 @@ struct _ClutterClipNodeClass
 | 
			
		||||
G_DEFINE_TYPE (ClutterClipNode, clutter_clip_node, CLUTTER_TYPE_PAINT_NODE)
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
clutter_clip_node_pre_draw (ClutterPaintNode    *node,
 | 
			
		||||
                            ClutterPaintContext *paint_context)
 | 
			
		||||
clutter_clip_node_pre_draw (ClutterPaintNode *node)
 | 
			
		||||
{
 | 
			
		||||
  gboolean retval = FALSE;
 | 
			
		||||
  CoglFramebuffer *fb;
 | 
			
		||||
@@ -1018,7 +980,7 @@ clutter_clip_node_pre_draw (ClutterPaintNode    *node,
 | 
			
		||||
  if (node->operations == NULL)
 | 
			
		||||
    return FALSE;
 | 
			
		||||
 | 
			
		||||
  fb = get_target_framebuffer (node, paint_context);
 | 
			
		||||
  fb = clutter_paint_node_get_framebuffer (node);
 | 
			
		||||
 | 
			
		||||
  for (i = 0; i < node->operations->len; i++)
 | 
			
		||||
    {
 | 
			
		||||
@@ -1053,8 +1015,7 @@ clutter_clip_node_pre_draw (ClutterPaintNode    *node,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_clip_node_post_draw (ClutterPaintNode    *node,
 | 
			
		||||
                             ClutterPaintContext *paint_context)
 | 
			
		||||
clutter_clip_node_post_draw (ClutterPaintNode *node)
 | 
			
		||||
{
 | 
			
		||||
  CoglFramebuffer *fb;
 | 
			
		||||
  guint i;
 | 
			
		||||
@@ -1062,7 +1023,7 @@ clutter_clip_node_post_draw (ClutterPaintNode    *node,
 | 
			
		||||
  if (node->operations == NULL)
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  fb = get_target_framebuffer (node, paint_context);
 | 
			
		||||
  fb = clutter_paint_node_get_framebuffer (node);
 | 
			
		||||
 | 
			
		||||
  for (i = 0; i < node->operations->len; i++)
 | 
			
		||||
    {
 | 
			
		||||
@@ -1118,118 +1079,10 @@ clutter_clip_node_new (void)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * ClutterActorNode
 | 
			
		||||
 * ClutterLayerNode (private)
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
struct _ClutterActorNode
 | 
			
		||||
{
 | 
			
		||||
  ClutterPaintNode parent_instance;
 | 
			
		||||
 | 
			
		||||
  ClutterActor *actor;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct _ClutterActorNodeClass
 | 
			
		||||
{
 | 
			
		||||
  ClutterPaintNodeClass parent_class;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
G_DEFINE_TYPE (ClutterActorNode, clutter_actor_node, CLUTTER_TYPE_PAINT_NODE)
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
clutter_actor_node_pre_draw (ClutterPaintNode    *node,
 | 
			
		||||
                             ClutterPaintContext *paint_context)
 | 
			
		||||
{
 | 
			
		||||
  ClutterActorNode *actor_node = CLUTTER_ACTOR_NODE (node);
 | 
			
		||||
 | 
			
		||||
  CLUTTER_SET_PRIVATE_FLAGS (actor_node->actor, CLUTTER_IN_PAINT);
 | 
			
		||||
 | 
			
		||||
  return TRUE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_actor_node_draw (ClutterPaintNode    *node,
 | 
			
		||||
                         ClutterPaintContext *paint_context)
 | 
			
		||||
{
 | 
			
		||||
  ClutterActorNode *actor_node = CLUTTER_ACTOR_NODE (node);
 | 
			
		||||
 | 
			
		||||
  clutter_actor_continue_paint (actor_node->actor, paint_context);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_actor_node_post_draw (ClutterPaintNode    *node,
 | 
			
		||||
                              ClutterPaintContext *paint_context)
 | 
			
		||||
{
 | 
			
		||||
  ClutterActorNode *actor_node = CLUTTER_ACTOR_NODE (node);
 | 
			
		||||
 | 
			
		||||
  CLUTTER_UNSET_PRIVATE_FLAGS (actor_node->actor, CLUTTER_IN_PAINT);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static JsonNode *
 | 
			
		||||
clutter_actor_node_serialize (ClutterPaintNode *node)
 | 
			
		||||
{
 | 
			
		||||
  ClutterActorNode *actor_node = CLUTTER_ACTOR_NODE (node);
 | 
			
		||||
  g_autoptr (JsonBuilder) builder = NULL;
 | 
			
		||||
  const char *debug_name;
 | 
			
		||||
 | 
			
		||||
  debug_name = _clutter_actor_get_debug_name (actor_node->actor);
 | 
			
		||||
 | 
			
		||||
  builder = json_builder_new ();
 | 
			
		||||
 | 
			
		||||
  json_builder_begin_object (builder);
 | 
			
		||||
  json_builder_set_member_name (builder, "actor");
 | 
			
		||||
  json_builder_add_string_value (builder, debug_name);
 | 
			
		||||
  json_builder_end_object (builder);
 | 
			
		||||
 | 
			
		||||
  return json_builder_get_root (builder);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_actor_node_class_init (ClutterActorNodeClass *klass)
 | 
			
		||||
{
 | 
			
		||||
  ClutterPaintNodeClass *node_class;
 | 
			
		||||
 | 
			
		||||
  node_class = CLUTTER_PAINT_NODE_CLASS (klass);
 | 
			
		||||
  node_class->pre_draw = clutter_actor_node_pre_draw;
 | 
			
		||||
  node_class->draw = clutter_actor_node_draw;
 | 
			
		||||
  node_class->post_draw = clutter_actor_node_post_draw;
 | 
			
		||||
  node_class->serialize = clutter_actor_node_serialize;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_actor_node_init (ClutterActorNode *self)
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * clutter_actor_node_new:
 | 
			
		||||
 * @actor: the actor to paint
 | 
			
		||||
 *
 | 
			
		||||
 * Creates a new #ClutterActorNode.
 | 
			
		||||
 *
 | 
			
		||||
 * The actor is painted together with any effects
 | 
			
		||||
 * applied to it. Children of this node will draw
 | 
			
		||||
 * over the actor contents.
 | 
			
		||||
 *
 | 
			
		||||
 * Return value: (transfer full): the newly created #ClutterActorNode.
 | 
			
		||||
 *   Use clutter_paint_node_unref() when done.
 | 
			
		||||
 */
 | 
			
		||||
ClutterPaintNode *
 | 
			
		||||
clutter_actor_node_new (ClutterActor *actor)
 | 
			
		||||
{
 | 
			
		||||
  ClutterActorNode *res;
 | 
			
		||||
 | 
			
		||||
  g_assert (actor != NULL);
 | 
			
		||||
 | 
			
		||||
  res = _clutter_paint_node_create (CLUTTER_TYPE_ACTOR_NODE);
 | 
			
		||||
  res->actor = actor;
 | 
			
		||||
 | 
			
		||||
  return (ClutterPaintNode *) res;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * ClutterLayerNode
 | 
			
		||||
 */
 | 
			
		||||
#define clutter_layer_node_get_type     _clutter_layer_node_get_type
 | 
			
		||||
 | 
			
		||||
struct _ClutterLayerNode
 | 
			
		||||
{
 | 
			
		||||
@@ -1257,11 +1110,9 @@ struct _ClutterLayerNodeClass
 | 
			
		||||
G_DEFINE_TYPE (ClutterLayerNode, clutter_layer_node, CLUTTER_TYPE_PAINT_NODE)
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
clutter_layer_node_pre_draw (ClutterPaintNode *node,
 | 
			
		||||
                             ClutterPaintContext *paint_context)
 | 
			
		||||
clutter_layer_node_pre_draw (ClutterPaintNode *node)
 | 
			
		||||
{
 | 
			
		||||
  ClutterLayerNode *lnode = (ClutterLayerNode *) node;
 | 
			
		||||
  CoglFramebuffer *framebuffer;
 | 
			
		||||
  CoglMatrix matrix;
 | 
			
		||||
 | 
			
		||||
  /* if we were unable to create an offscreen buffer for this node, then
 | 
			
		||||
@@ -1277,10 +1128,9 @@ clutter_layer_node_pre_draw (ClutterPaintNode *node,
 | 
			
		||||
  /* copy the same modelview from the current framebuffer to the one we
 | 
			
		||||
   * are going to use
 | 
			
		||||
   */
 | 
			
		||||
  framebuffer = clutter_paint_context_get_framebuffer (paint_context);
 | 
			
		||||
  cogl_framebuffer_get_modelview_matrix (framebuffer, &matrix);
 | 
			
		||||
  cogl_get_modelview_matrix (&matrix);
 | 
			
		||||
 | 
			
		||||
  clutter_paint_context_push_framebuffer (paint_context, lnode->offscreen);
 | 
			
		||||
  cogl_push_framebuffer (lnode->offscreen);
 | 
			
		||||
 | 
			
		||||
  cogl_framebuffer_set_modelview_matrix (lnode->offscreen, &matrix);
 | 
			
		||||
 | 
			
		||||
@@ -1298,7 +1148,7 @@ clutter_layer_node_pre_draw (ClutterPaintNode *node,
 | 
			
		||||
                            COGL_BUFFER_BIT_COLOR | COGL_BUFFER_BIT_DEPTH,
 | 
			
		||||
                            0.f, 0.f, 0.f, 0.f);
 | 
			
		||||
 | 
			
		||||
  cogl_framebuffer_push_matrix (lnode->offscreen);
 | 
			
		||||
  cogl_push_matrix ();
 | 
			
		||||
 | 
			
		||||
  /* every draw operation after this point will happen an offscreen
 | 
			
		||||
   * framebuffer
 | 
			
		||||
@@ -1308,18 +1158,17 @@ clutter_layer_node_pre_draw (ClutterPaintNode *node,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_layer_node_post_draw (ClutterPaintNode    *node,
 | 
			
		||||
                              ClutterPaintContext *paint_context)
 | 
			
		||||
clutter_layer_node_post_draw (ClutterPaintNode *node)
 | 
			
		||||
{
 | 
			
		||||
  ClutterLayerNode *lnode = CLUTTER_LAYER_NODE (node);
 | 
			
		||||
  CoglFramebuffer *fb;
 | 
			
		||||
  guint i;
 | 
			
		||||
 | 
			
		||||
  /* switch to the previous framebuffer */
 | 
			
		||||
  cogl_framebuffer_pop_matrix (lnode->offscreen);
 | 
			
		||||
  clutter_paint_context_pop_framebuffer (paint_context);
 | 
			
		||||
  cogl_pop_matrix ();
 | 
			
		||||
  cogl_pop_framebuffer ();
 | 
			
		||||
 | 
			
		||||
  fb = clutter_paint_context_get_framebuffer (paint_context);
 | 
			
		||||
  fb = cogl_get_draw_framebuffer ();
 | 
			
		||||
 | 
			
		||||
  for (i = 0; i < node->operations->len; i++)
 | 
			
		||||
    {
 | 
			
		||||
@@ -1333,20 +1182,20 @@ clutter_layer_node_post_draw (ClutterPaintNode    *node,
 | 
			
		||||
 | 
			
		||||
        case PAINT_OP_TEX_RECT:
 | 
			
		||||
          /* now we need to paint the texture */
 | 
			
		||||
          cogl_framebuffer_draw_textured_rectangle (fb,
 | 
			
		||||
                                                    lnode->state,
 | 
			
		||||
                                                    op->op.texrect[0],
 | 
			
		||||
                                                    op->op.texrect[1],
 | 
			
		||||
                                                    op->op.texrect[2],
 | 
			
		||||
                                                    op->op.texrect[3],
 | 
			
		||||
                                                    op->op.texrect[4],
 | 
			
		||||
                                                    op->op.texrect[5],
 | 
			
		||||
                                                    op->op.texrect[6],
 | 
			
		||||
                                                    op->op.texrect[7]);
 | 
			
		||||
          cogl_push_source (lnode->state);
 | 
			
		||||
          cogl_rectangle_with_texture_coords (op->op.texrect[0],
 | 
			
		||||
                                              op->op.texrect[1],
 | 
			
		||||
                                              op->op.texrect[2],
 | 
			
		||||
                                              op->op.texrect[3],
 | 
			
		||||
                                              op->op.texrect[4],
 | 
			
		||||
                                              op->op.texrect[5],
 | 
			
		||||
                                              op->op.texrect[6],
 | 
			
		||||
                                              op->op.texrect[7]);
 | 
			
		||||
          cogl_pop_source ();
 | 
			
		||||
          break;
 | 
			
		||||
 | 
			
		||||
        case PAINT_OP_MULTITEX_RECT:
 | 
			
		||||
          cogl_framebuffer_draw_multitextured_rectangle (fb,
 | 
			
		||||
          cogl_framebuffer_draw_multitextured_rectangle (cogl_get_draw_framebuffer (),
 | 
			
		||||
                                                         lnode->state,
 | 
			
		||||
                                                         op->op.texrect[0],
 | 
			
		||||
                                                         op->op.texrect[1],
 | 
			
		||||
@@ -1357,7 +1206,9 @@ clutter_layer_node_post_draw (ClutterPaintNode    *node,
 | 
			
		||||
          break;
 | 
			
		||||
 | 
			
		||||
        case PAINT_OP_PATH:
 | 
			
		||||
          cogl_framebuffer_fill_path (fb, lnode->state, op->op.path);
 | 
			
		||||
          cogl_push_source (lnode->state);
 | 
			
		||||
          cogl_path_fill (op->op.path);
 | 
			
		||||
          cogl_pop_source ();
 | 
			
		||||
          break;
 | 
			
		||||
 | 
			
		||||
        case PAINT_OP_PRIMITIVE:
 | 
			
		||||
@@ -1418,11 +1269,11 @@ clutter_layer_node_init (ClutterLayerNode *self)
 | 
			
		||||
 * Since: 1.10
 | 
			
		||||
 */
 | 
			
		||||
ClutterPaintNode *
 | 
			
		||||
clutter_layer_node_new (const CoglMatrix        *projection,
 | 
			
		||||
                        const cairo_rectangle_t *viewport,
 | 
			
		||||
                        float                    width,
 | 
			
		||||
                        float                    height,
 | 
			
		||||
                        guint8                   opacity)
 | 
			
		||||
_clutter_layer_node_new (const CoglMatrix        *projection,
 | 
			
		||||
                         const cairo_rectangle_t *viewport,
 | 
			
		||||
                         float                    width,
 | 
			
		||||
                         float                    height,
 | 
			
		||||
                         guint8                   opacity)
 | 
			
		||||
{
 | 
			
		||||
  ClutterLayerNode *res;
 | 
			
		||||
  CoglColor color;
 | 
			
		||||
 
 | 
			
		||||
@@ -143,25 +143,6 @@ CLUTTER_EXPORT
 | 
			
		||||
ClutterPaintNode *      clutter_text_node_new           (PangoLayout           *layout,
 | 
			
		||||
                                                         const ClutterColor    *color);
 | 
			
		||||
 | 
			
		||||
#define CLUTTER_TYPE_ACTOR_NODE                 (clutter_actor_node_get_type ())
 | 
			
		||||
#define CLUTTER_ACTOR_NODE(obj)                 (G_TYPE_CHECK_INSTANCE_CAST ((obj), CLUTTER_TYPE_ACTOR_NODE, ClutterActorNode))
 | 
			
		||||
#define CLUTTER_IS_ACTOR_NODE(obj)              (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CLUTTER_TYPE_ACTOR_NODE))
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ClutterActorNode:
 | 
			
		||||
 *
 | 
			
		||||
 * The #ClutterActorNode structure is an opaque
 | 
			
		||||
 * type whose members cannot be directly accessed.
 | 
			
		||||
 */
 | 
			
		||||
typedef struct _ClutterActorNode ClutterActorNode;
 | 
			
		||||
typedef struct _ClutterActorNode ClutterActorNodeClass;
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
GType clutter_actor_node_get_type (void) G_GNUC_CONST;
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
ClutterPaintNode * clutter_actor_node_new (ClutterActor *actor);
 | 
			
		||||
 | 
			
		||||
#define CLUTTER_TYPE_ROOT_NODE                  (clutter_root_node_get_type ())
 | 
			
		||||
#define CLUTTER_ROOT_NODE(obj)                  (G_TYPE_CHECK_INSTANCE_CAST ((obj), CLUTTER_TYPE_ROOT_NODE, ClutterRootNode))
 | 
			
		||||
#define CLUTTER_IS_ROOT_NODE(obj)               (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CLUTTER_TYPE_ROOT_NODE))
 | 
			
		||||
@@ -182,54 +163,6 @@ CLUTTER_EXPORT
 | 
			
		||||
ClutterPaintNode *      clutter_root_node_new           (CoglFramebuffer       *framebuffer,
 | 
			
		||||
                                                         const ClutterColor    *clear_color,
 | 
			
		||||
                                                         CoglBufferBit          clear_flags);
 | 
			
		||||
 | 
			
		||||
#define CLUTTER_TYPE_LAYER_NODE                 (clutter_layer_node_get_type ())
 | 
			
		||||
#define CLUTTER_LAYER_NODE(obj)                 (G_TYPE_CHECK_INSTANCE_CAST ((obj), CLUTTER_TYPE_LAYER_NODE, ClutterLayerNode))
 | 
			
		||||
#define CLUTTER_IS_LAYER_NODE(obj)              (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CLUTTER_TYPE_LAYER_NODE))
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * ClutterLayerNode:
 | 
			
		||||
 *
 | 
			
		||||
 * The #ClutterLayerNode structure is an opaque
 | 
			
		||||
 * type whose members cannot be directly accessed.
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 1.10
 | 
			
		||||
 */
 | 
			
		||||
typedef struct _ClutterLayerNode                ClutterLayerNode;
 | 
			
		||||
typedef struct _ClutterLayerNodeClass           ClutterLayerNodeClass;
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
GType clutter_layer_node_get_type (void) G_GNUC_CONST;
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
ClutterPaintNode *      clutter_layer_node_new          (const CoglMatrix        *projection,
 | 
			
		||||
                                                         const cairo_rectangle_t *viewport,
 | 
			
		||||
                                                         float                    width,
 | 
			
		||||
                                                         float                    height,
 | 
			
		||||
                                                         guint8                   opacity);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define CLUTTER_TYPE_TRANSFORM_NODE             (clutter_transform_node_get_type ())
 | 
			
		||||
#define CLUTTER_TRANSFORM_NODE(obj)             (G_TYPE_CHECK_INSTANCE_CAST ((obj), CLUTTER_TYPE_TRANSFORM_NODE, ClutterTransformNode))
 | 
			
		||||
#define CLUTTER_IS_TRANSFORM_NODE(obj)          (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CLUTTER_TYPE_TRANSFORM_NODE))
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * ClutterTransformNode:
 | 
			
		||||
 *
 | 
			
		||||
 * The #ClutterLayerNode structure is an opaque
 | 
			
		||||
 * type whose members cannot be directly accessed.
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 1.10
 | 
			
		||||
 */
 | 
			
		||||
typedef struct _ClutterTransformNode            ClutterTransformNode;
 | 
			
		||||
typedef struct _ClutterPaintNodeClass           ClutterTransformNodeClass;
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
GType clutter_transform_node_get_type (void) G_GNUC_CONST;
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
ClutterPaintNode *      clutter_transform_node_new          (const CoglMatrix *projection);
 | 
			
		||||
 | 
			
		||||
G_END_DECLS
 | 
			
		||||
 | 
			
		||||
#endif /* __CLUTTER_PAINT_NODES_H__ */
 | 
			
		||||
 
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user