Compare commits
	
		
			1 Commits
		
	
	
		
			3.37.2
			...
			benzea/ci-
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					422f6f52b4 | 
@@ -1,10 +1,9 @@
 | 
			
		||||
image: registry.gitlab.gnome.org/gnome/mutter/master:v4
 | 
			
		||||
image: registry.gitlab.gnome.org/gnome/mutter/master:v3
 | 
			
		||||
 | 
			
		||||
stages:
 | 
			
		||||
 - review
 | 
			
		||||
 - build
 | 
			
		||||
 - test
 | 
			
		||||
 - coverage
 | 
			
		||||
 | 
			
		||||
check-commit-log:
 | 
			
		||||
  stage: review
 | 
			
		||||
@@ -18,7 +17,7 @@ check-commit-log:
 | 
			
		||||
build-mutter:
 | 
			
		||||
  stage: build
 | 
			
		||||
  script:
 | 
			
		||||
    - meson . build -Dbuildtype=debugoptimized -Db_coverage=true -Degl_device=true -Dwayland_eglstream=true --werror --prefix /usr
 | 
			
		||||
    - meson . build -Dbuildtype=debugoptimized -Degl_device=true -Dwayland_eglstream=true --werror --prefix /usr
 | 
			
		||||
    - ninja -C build
 | 
			
		||||
    - ninja -C build install
 | 
			
		||||
  artifacts:
 | 
			
		||||
@@ -29,19 +28,6 @@ build-mutter:
 | 
			
		||||
    - merge_requests
 | 
			
		||||
    - /^.*$/
 | 
			
		||||
 | 
			
		||||
build-without-opengl-and-glx:
 | 
			
		||||
  stage: build
 | 
			
		||||
  script:
 | 
			
		||||
    - meson . build -Dbuildtype=debugoptimized -Dopengl=false -Dglx=false -Degl_device=true -Dwayland_eglstream=true --werror --prefix /usr
 | 
			
		||||
    - ninja -C build
 | 
			
		||||
    - ninja -C build install
 | 
			
		||||
  artifacts:
 | 
			
		||||
    paths:
 | 
			
		||||
      - build/meson-logs
 | 
			
		||||
  only:
 | 
			
		||||
    - merge_requests
 | 
			
		||||
    - /^.*$/
 | 
			
		||||
 | 
			
		||||
build-without-native-backend-and-wayland:
 | 
			
		||||
  stage: build
 | 
			
		||||
  script:
 | 
			
		||||
@@ -49,8 +35,9 @@ build-without-native-backend-and-wayland:
 | 
			
		||||
    - ninja -C build
 | 
			
		||||
    - ninja -C build install
 | 
			
		||||
  artifacts:
 | 
			
		||||
    expire_in: 1 day
 | 
			
		||||
    paths:
 | 
			
		||||
      - build/meson-logs
 | 
			
		||||
      - build
 | 
			
		||||
  only:
 | 
			
		||||
    - merge_requests
 | 
			
		||||
    - /^.*$/
 | 
			
		||||
@@ -65,6 +52,7 @@ test-mutter:
 | 
			
		||||
    G_SLICE: "always-malloc"
 | 
			
		||||
    MALLOC_CHECK_: "3"
 | 
			
		||||
    NO_AT_BRIDGE: "1"
 | 
			
		||||
    MALLOC_PERTURB_: "123"
 | 
			
		||||
  script:
 | 
			
		||||
    - dconf update
 | 
			
		||||
    - mkdir -m 700 $XDG_RUNTIME_DIR
 | 
			
		||||
@@ -72,30 +60,10 @@ test-mutter:
 | 
			
		||||
    - >
 | 
			
		||||
      dbus-run-session -- xvfb-run -s '+iglx -noreset'
 | 
			
		||||
      meson test -C build --no-rebuild -t 10 --verbose --no-stdsplit --print-errorlogs --wrap catchsegv
 | 
			
		||||
  artifacts:
 | 
			
		||||
    expire_in: 1 day
 | 
			
		||||
    paths:
 | 
			
		||||
      - build
 | 
			
		||||
  only:
 | 
			
		||||
    - merge_requests
 | 
			
		||||
    - /^.*$/
 | 
			
		||||
 | 
			
		||||
test-mutter-coverage:
 | 
			
		||||
  stage: coverage
 | 
			
		||||
  dependencies:
 | 
			
		||||
    - test-mutter
 | 
			
		||||
  script:
 | 
			
		||||
    - ninja -C build coverage
 | 
			
		||||
    - cat build/meson-logs/coverage.txt
 | 
			
		||||
  artifacts:
 | 
			
		||||
    paths:
 | 
			
		||||
      - build/meson-logs
 | 
			
		||||
  when: manual
 | 
			
		||||
  except:
 | 
			
		||||
    refs:
 | 
			
		||||
      - tags
 | 
			
		||||
      - master
 | 
			
		||||
 | 
			
		||||
can-build-gnome-shell:
 | 
			
		||||
  stage: test
 | 
			
		||||
  dependencies:
 | 
			
		||||
 
 | 
			
		||||
@@ -1,27 +1,33 @@
 | 
			
		||||
# Rebuild and push with
 | 
			
		||||
#
 | 
			
		||||
#     cd .gitlab-ci/
 | 
			
		||||
#     podman build --format docker --no-cache -t registry.gitlab.gnome.org/gnome/mutter/master:v4 .
 | 
			
		||||
#     podman push registry.gitlab.gnome.org/gnome/mutter/master:v4
 | 
			
		||||
#     docker build --no-cache -t registry.gitlab.gnome.org/gnome/mutter/master:v3 .
 | 
			
		||||
#     docker push registry.gitlab.gnome.org/gnome/mutter/master:v3
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
FROM fedora:32
 | 
			
		||||
FROM fedora:31
 | 
			
		||||
 | 
			
		||||
RUN dnf -y update && dnf -y upgrade && \
 | 
			
		||||
    dnf install -y 'dnf-command(builddep)' && \
 | 
			
		||||
    dnf install -y 'dnf-command(copr)' && \
 | 
			
		||||
    dnf copr enable -y jadahl/mutter-ci && \
 | 
			
		||||
    dnf copr enable -y fmuellner/gnome-shell-ci && \
 | 
			
		||||
    dnf -y update && dnf -y upgrade && \
 | 
			
		||||
 | 
			
		||||
    dnf builddep -y mutter --setopt=install_weak_deps=False && \
 | 
			
		||||
    dnf builddep -y mutter && \
 | 
			
		||||
 | 
			
		||||
    # Until Fedora catches up with new build-deps
 | 
			
		||||
    dnf install -y 'pkgconfig(graphene-gobject-1.0)' 'pkgconfig(sysprof-capture-3)' && \
 | 
			
		||||
 | 
			
		||||
    # 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 gcovr \
 | 
			
		||||
        --setopt=install_weak_deps=False && \
 | 
			
		||||
    dnf install -y xorg-x11-server-Xvfb mesa-dri-drivers dbus dbus-x11 '*/xvfb-run' gdm-lib accountsservice-libs gnome-control-center && \
 | 
			
		||||
 | 
			
		||||
    # GNOME Shell
 | 
			
		||||
    dnf builddep -y gnome-shell --setopt=install_weak_deps=False && \
 | 
			
		||||
    dnf remove -y gnome-bluetooth-libs-devel && \
 | 
			
		||||
    dnf remove -y gnome-bluetooth-libs-devel dbus-glib-devel upower-devel python3-devel && \
 | 
			
		||||
    dnf remove -y --noautoremove mutter mutter-devel && \
 | 
			
		||||
 | 
			
		||||
    dnf clean all
 | 
			
		||||
 | 
			
		||||
# Add a machine-id as specified in the freedesktop spec:
 | 
			
		||||
# https://www.freedesktop.org/software/systemd/man/machine-id.html
 | 
			
		||||
RUN cat /dev/urandom | tr -dc a-f0-9 | head -c32 > /etc/machine-id && echo "" >> /etc/machine-id
 | 
			
		||||
 
 | 
			
		||||
@@ -19,7 +19,7 @@ fi
 | 
			
		||||
function commit_message_has_url() {
 | 
			
		||||
  commit=$1
 | 
			
		||||
  commit_message=$(git show -s --format='format:%b' $commit)
 | 
			
		||||
  echo "$commit_message" | grep -qe "\($CI_MERGE_REQUEST_PROJECT_URL/\(-/\)\?\(issues\|merge_requests\)/[0-9]\+\|https://bugzilla.gnome.org/show_bug.cgi?id=[0-9]\+\)"
 | 
			
		||||
  echo "$commit_message" | grep -qe "\($CI_MERGE_REQUEST_PROJECT_URL/\(issues\|merge_requests\)/[0-9]\+\|https://bugzilla.gnome.org/show_bug.cgi?id=[0-9]\+\)"
 | 
			
		||||
  return $?
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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"
 | 
			
		||||
							
								
								
									
										231
									
								
								NEWS
									
									
									
									
									
								
							
							
						
						
									
										231
									
								
								NEWS
									
									
									
									
									
								
							@@ -1,234 +1,3 @@
 | 
			
		||||
3.37.2
 | 
			
		||||
======
 | 
			
		||||
* Fix move-to-center keybinding with multiple monitors [Sergey; #1073]
 | 
			
		||||
* Fix stuck buttons when a virtual device is destroyed [Carlos; !1239]
 | 
			
		||||
* Use workarea when centering new windows [Akatsuki; #964]
 | 
			
		||||
* Limit mipmap levels when rendering background [Daniel; !1003]
 | 
			
		||||
* Broadcast clipboard/primary offers [Carlos; !1253]
 | 
			
		||||
* Support primary-selection protocol from wayland-protocols [Carlos; !1255]
 | 
			
		||||
* Fix monitor screen cast on X11 [Jonas Å.; !1251]
 | 
			
		||||
* Support a "blank" cursor type [Florian; !1244]
 | 
			
		||||
* Improve stage view damage tracking [Jonas Å.; !1237]
 | 
			
		||||
* Implement touch-mode detecation for the X11 backend [Carlos; !1278]
 | 
			
		||||
* Drop external keyboard detection from touch-mode heuristics [Carlos; !1277]
 | 
			
		||||
* Optimize actor allocations [Jonas D.; !1247]
 | 
			
		||||
* Fixed crashes [Daniel, Carlos, Jonas Å., Jonas D.; !1256, !1258, !1217, !1280]
 | 
			
		||||
* Misc. bug fixes and cleanups [Christian, Jonas D., Olivier, Ting-Wei,
 | 
			
		||||
  Jonas Å., Marco, Corentin, Daniel, Robert, Niels, Florian, Simon; !1231,
 | 
			
		||||
  !1228, !1238, !1229, !1192, !1236, !1171, !1134, #1126, !1234, !1230, !1210,
 | 
			
		||||
  !1242, !1243, !1252, !1113, !1232, !1259, !1245, !1265, !1180, !1261, !788,
 | 
			
		||||
  !1264, !1235, !1218, !1150, !1274, !1271, !1279, !1283, !1272]
 | 
			
		||||
 | 
			
		||||
Contributors:
 | 
			
		||||
  Marco Trevisan (Treviño), Akatsuki, Jonas Dreßler, Olivier Fourdan,
 | 
			
		||||
  Carlos Garnacho, Niels De Graef, Ting-Wei Lan, Robert Mader, Simon McVittie,
 | 
			
		||||
  Florian Müllner, Corentin Noël, Christian Rauch, Daniel van Vugt,
 | 
			
		||||
  Sergey Zigachev, Jonas Ådahl
 | 
			
		||||
 | 
			
		||||
3.37.1
 | 
			
		||||
======
 | 
			
		||||
* Fix screencasting non-maximized windows [Jonas Å.; !1174]
 | 
			
		||||
* Make window-aliveness checks less aggressive [Jonas Å.; !1182]
 | 
			
		||||
* Fix stylus coordinates when using screen rotation [Jonas T.; #1118]
 | 
			
		||||
* Preserve keyboard state on VT switch [Olivier; !1185]
 | 
			
		||||
* Remove Clutter's drag and drop actions [Jonas D.; !789]
 | 
			
		||||
* Cancel clicks/gestures actions on disable [Georges; !1188]
 | 
			
		||||
* Fix various clipboard issues [Carlos; !1186, !1198, !1203, !1204, !1206]
 | 
			
		||||
* Fix trackball button scrolling [Phillip; #1120]
 | 
			
		||||
* Fix tiled monitor support [Jonas; !1199]
 | 
			
		||||
* Support unredirecting fullscreen wayland surfaces [Jonas Å.; !798]
 | 
			
		||||
* Support area screencasts [Jonas Å.; !1207]
 | 
			
		||||
* Synchronize shadows to server-side decorations [Olivier; !1214]
 | 
			
		||||
* Allow inhibiting remote access [Jonas Å.; !1212]
 | 
			
		||||
* Fix overview key on X11 when using multiple keyboard layouts [Olivier; !1219]
 | 
			
		||||
* Fixed crashes [Jonas, D., Carlos; !1173, !1183, !1012]
 | 
			
		||||
* Misc. bug fixes and cleanups [Andre, Georges, Christian, Jonas Å., Andre,
 | 
			
		||||
  Simon, Florian, Carlos, Adam, Marco, Thomas, Elias, Pekka, Jonas D.,
 | 
			
		||||
  Laurent; !1169, !1168, !1166, !1170, !1167, !1172, !1175, !1176, !1184,
 | 
			
		||||
  !1126, !1187, !1191, !1195, !1179, !1200, !1193, !1209, !1213, !1208,
 | 
			
		||||
  #1074, !1223]
 | 
			
		||||
 | 
			
		||||
Contributors:
 | 
			
		||||
  Marco Trevisan (Treviño), Elias Aebi, Thomas Hindoe Paaboel Andersen,
 | 
			
		||||
  Laurent Bigonville, Jonas Dreßler, Olivier Fourdan, Carlos Garnacho,
 | 
			
		||||
  Adam Jackson, Andre Moreira Magalhaes, Simon McVittie, Florian Müllner,
 | 
			
		||||
  Georges Basile Stavracas Neto, Pekka Paalanen, Christian Rauch, Jonas Troeger,
 | 
			
		||||
  Phillip Wood, Jonas Ådahl
 | 
			
		||||
 | 
			
		||||
Translators:
 | 
			
		||||
  Dušan Kazik [sk], Christian Kirbach [de]
 | 
			
		||||
 | 
			
		||||
3.36.0
 | 
			
		||||
======
 | 
			
		||||
* Fix placement of popup windows in multi-monitor setups [Jonas; !1110]
 | 
			
		||||
* Fix invisible mouse cursor on some hardware [Jonas; !1079]
 | 
			
		||||
 | 
			
		||||
Contributors:
 | 
			
		||||
  Jonas Ådahl
 | 
			
		||||
 | 
			
		||||
Translators:
 | 
			
		||||
  Aurimas Černius [lt], Goran Vidović [hr], Anders Jonsson [sv],
 | 
			
		||||
  Guillaume Bernard [fr], Milo Casagrande [it], Daniel Korostil [uk],
 | 
			
		||||
  Andre Klapper [cy], Aman Alam [pa], Nathan Follens [nl]
 | 
			
		||||
 | 
			
		||||
3.35.92
 | 
			
		||||
=======
 | 
			
		||||
* Fix visibility of initially hidden windows [Jonas Å.; !1066]
 | 
			
		||||
* Avoid flicker when (un)redirecting windows [Sebastian; #997]
 | 
			
		||||
* Let BindConstraints update the preferred size [Emmanuele; !1070]
 | 
			
		||||
* Learn about GLES3 [Adam; !882]
 | 
			
		||||
* Ping windows on every window focus [Jonas D.; !891]
 | 
			
		||||
* Remove overhead from hot code paths [Christian;
 | 
			
		||||
  #1056, !1081, !1083, !1071, !1087]
 | 
			
		||||
* Allow remote desktop services to inhibit animations [Jonas Å.; !838]
 | 
			
		||||
* Update screen-cast code to PipeWire 0.3 API [Wim; !1062]
 | 
			
		||||
* Make check-alive timeouts configurable [Jonas Å.; !1080]
 | 
			
		||||
* Make each stage view correspond to a single CRTC [Jonas Å.; !1042]
 | 
			
		||||
* Implement scaled/transformed hardware cursors [Robert; !526]
 | 
			
		||||
* Use DMA buffers for screencasting if possible [Georges; !1086]
 | 
			
		||||
* Make Xwayland startup asynchronous [Carlos; !944]
 | 
			
		||||
* Fix clipping glitches in long text entries [Jonas D.; !1096]
 | 
			
		||||
* Add side channel for starting required X11 services [Carlos; !945]
 | 
			
		||||
* Support synchronized wayland popup moving [Jonas Å.; !705]
 | 
			
		||||
* Fixed crashes [Olivier, Jonas Å.; !1073, !1093]
 | 
			
		||||
* Plugged memory leaks [Sebastian, Jonas Å.; !1089, !1095]
 | 
			
		||||
* Misc. bug fixes and cleanups [Jonas Å, Olivier, Florian, Daniel, Jonas D.,
 | 
			
		||||
  Robert, Sebastian, Christian, Arun, Carlos, worldofpeace; !1061, #1043,
 | 
			
		||||
  !1067, !1068, !1065, !835, !1058, !1069, !1075, #1060, !1077, !423, !1090,
 | 
			
		||||
  !1088, !1094, #1067, !1064, !1099, !957, !1000, !1082]
 | 
			
		||||
 | 
			
		||||
Contributors:
 | 
			
		||||
  Emmanuele Bassi, Jonas Dreßler, Olivier Fourdan, Carlos Garnacho,
 | 
			
		||||
  Christian Hergert, Adam Jackson, Sebastian Keller, Robert Mader,
 | 
			
		||||
  Florian Müllner, Georges Basile Stavracas Neto, Arun Raghavan, Wim Taymans,
 | 
			
		||||
  Daniel van Vugt, worldofpeace, Jonas Ådahl
 | 
			
		||||
 | 
			
		||||
Translators:
 | 
			
		||||
  Yi-Jyun Pan [zh_TW], Asier Sarasua Garmendia [eu], Rafael Fontenelle [pt_BR],
 | 
			
		||||
  Emin Tufan Çetin [tr], Daniel Mustieles [es], Balázs Úr [hu],
 | 
			
		||||
  Gwan-gyeong Mun [ko], Marek Černocký [cs], Fran Dieguez [gl],
 | 
			
		||||
  Kukuh Syafaat [id], Alan Mortensen [da], Piotr Drąg [pl], sicklylife [ja],
 | 
			
		||||
  Matej Urbančič [sl]
 | 
			
		||||
 | 
			
		||||
3.35.91
 | 
			
		||||
=======
 | 
			
		||||
* Honor accelerometer orientation on monitor config changes [Hans; !959]
 | 
			
		||||
* Enable culling for integer-scaled actors [Robert; !1036]
 | 
			
		||||
* Add ClutterSeat::touch-mode property [Carlos; !1044]
 | 
			
		||||
* Fix mis-scaling when streaming windows [Olivier; !1022]
 | 
			
		||||
* Make the cursor renderer use the transactional KMS API [Jonas; !930]
 | 
			
		||||
* Advertise MetaMonitor as wl_output [Olivier; !994]
 | 
			
		||||
* Fix culling of XWayland windows [Robert; !1049]
 | 
			
		||||
* Only consider enabled effects when disabling culling [Robert; !1052]
 | 
			
		||||
* Misc. bug fixes and cleanups [Olivier, Sergio, Adam, Carlos, Björn; !1040,
 | 
			
		||||
  #985, !1024, !1039, !1051]
 | 
			
		||||
 | 
			
		||||
Contributors:
 | 
			
		||||
  Sergio Costas, Björn Daase, Olivier Fourdan, Carlos Garnacho, Hans de Goede,
 | 
			
		||||
  Adam Jackson, Robert Mader, Jonas Ådahl
 | 
			
		||||
 | 
			
		||||
Translators:
 | 
			
		||||
  sicklylife [ja]
 | 
			
		||||
 | 
			
		||||
3.35.90
 | 
			
		||||
=======
 | 
			
		||||
* Cull out clip region [Robert; !985]
 | 
			
		||||
* Always enable tap-to-click/drag on opaque Wacom tablets [Carlos; !968]
 | 
			
		||||
* Fix visual glitches with offscreen effects applied [Georges; !992]
 | 
			
		||||
* Fix "sticky corner" in multi-head setups [Jonas D.; #774]
 | 
			
		||||
* Fix black shadows around XWayland windows during resizes [Ray, Olivier; #858]
 | 
			
		||||
* Zero-copy path for GPU-less secondary GPUs [Pekka; !810]
 | 
			
		||||
* Cancel DND on Esc [Carlos; #1020]
 | 
			
		||||
* Sync XWayland window shadows to frame during resizes [Olivier; !1009]
 | 
			
		||||
* Add support for per-monitor workareas [Alberts; !370]
 | 
			
		||||
* Ensure newly mapped wayland windows receive ENTER event [Olivier; !1026]
 | 
			
		||||
* Add ClutterSeat object [Carlos; !852]
 | 
			
		||||
* Honour CLUTTER_ACTOR_NO_LAYOUT flag more efficiently [Daniel; !575]
 | 
			
		||||
* Fix interoperation with wl_data_device_manager v1 [Carlos; #965]
 | 
			
		||||
* Favor text over images in clipboard manager [Carlos; #919]
 | 
			
		||||
* Apply monitor scale after background texture creation [Daniel; !1004]
 | 
			
		||||
* Plugged memory leaks [Sebastian, Adam; !991, #1000, !1011, !1020, !1030,
 | 
			
		||||
  !1001, !1033]
 | 
			
		||||
* Fixed crashes [Jonas Å., Florian, Olivier; !961, #1029, !1037]
 | 
			
		||||
* Misc. bug fixes and cleanups [Björn, Jonas Å., Adam, Sebastian, Jonas D.,
 | 
			
		||||
  Daniel, Carlos, Corentin, Sebastian, Robert, Daniel; #385, !998, !1007, !995,
 | 
			
		||||
  !1016, !1018, !1017, !1005, !1019, !1025, !1028, !1029, !1031, !1015, !1032,
 | 
			
		||||
  !1034, #1025]
 | 
			
		||||
 | 
			
		||||
Contributors:
 | 
			
		||||
  Björn Daase, Jonas Dreßler, Olivier Fourdan, Carlos Garnacho, Adam Jackson,
 | 
			
		||||
  Sebastian Keller, Robert Mader, Alberts Muktupāvels, Florian Müllner,
 | 
			
		||||
  Georges Basile Stavracas Neto, Corentin Noël, Pekka Paalanen, Ray Strode,
 | 
			
		||||
  Daniel van Vugt, Jonas Ådahl
 | 
			
		||||
 | 
			
		||||
Translators:
 | 
			
		||||
  sicklylife [ja], Umarzuki Bin Mochlis Moktar [ms]
 | 
			
		||||
 | 
			
		||||
3.35.3
 | 
			
		||||
======
 | 
			
		||||
* backends/native: Correct dy value in pinch gesture event [Yariv; !974]
 | 
			
		||||
* Upload clipping rectangles in parallel [Daniel; !969]
 | 
			
		||||
* More cogl API cleanups [Adam; !978, !977, !973]
 | 
			
		||||
* Fix window recording on HiDPI [Pascal; !976]
 | 
			
		||||
* Fix top-left pixel being insensitive to clicks [Sebastian; #893]
 | 
			
		||||
* Misc. bug fixes and cleanups [Daniel, Adam; !979, !980]
 | 
			
		||||
 | 
			
		||||
Contributors:
 | 
			
		||||
  Yariv Barkan, Adam Jackson, Sebastian Keller, Pascal Nowack, Daniel van Vugt
 | 
			
		||||
 | 
			
		||||
Translators:
 | 
			
		||||
  Fran Dieguez [gl], Dz Chen [zh_CN]
 | 
			
		||||
 | 
			
		||||
3.35.2
 | 
			
		||||
======
 | 
			
		||||
* Don't emit focus event after destruction [Marco; gnome-shell#1704, !860]
 | 
			
		||||
* Add a notion of pixel format planes [Niels; !858]
 | 
			
		||||
* Replace various Cogl/Clutter types with Graphene [Georges; !458]
 | 
			
		||||
* Improve CoglJournal [Georges, Jasper; !402]
 | 
			
		||||
* Split pick and paint [Georges; !865]
 | 
			
		||||
* Remove deprecated/unused cogl/clutter APIs [Adam; !866, !878, !879, !880,
 | 
			
		||||
  !885, !900, !902, !904, !896, !913, !922, !883, !903, !921, !933, !819]
 | 
			
		||||
* Fix hang when opening not-responding dialog on Xorg [Carlos; !876]
 | 
			
		||||
* Allow changing Clutter debug flags at runtime [Georges; !862]
 | 
			
		||||
* Fix frozen grabs on Xorg after weeks of inactivity [Jonas; !886]
 | 
			
		||||
* Fix triggering popups from stylus devices o wayland [Carlos; #886]
 | 
			
		||||
* Fix fallback to GLES2 [Adam; #635]
 | 
			
		||||
* Fix buffer age checks on multiple monitors [Carlos; !906]
 | 
			
		||||
* Adjust to Sysprof API change [Christian; !908]
 | 
			
		||||
* Improve support for (X11) fullscreen games under wayland [Hans; !739]
 | 
			
		||||
* Support shadow framebuffers for offscreen rendering [Olivier; !877]
 | 
			
		||||
* Fix hang after interacting with desktop icons on X11 [Marco; !909]
 | 
			
		||||
* Don't double scale when getting absolute surface coordinates [Xiang; !915]
 | 
			
		||||
* Respect NET_WM_TRANSIENT_FOR for override-redirect windows [Marco; !920]
 | 
			
		||||
* Kill window effects on destroy [Robert; !924]
 | 
			
		||||
* Remove deprecated ClutterTexture [Jonas; !932]
 | 
			
		||||
* Use regions instead of bounding box for clipping and culling [Carlos; !867]
 | 
			
		||||
* Use partial damage for dma-buf and EGLImage buffers on wayland [Robert; #947]
 | 
			
		||||
* Do not stack transients underneath their always-on-top parent [Florian; #587]
 | 
			
		||||
* Add explicit paint/pick contexts [Jonas; !935]
 | 
			
		||||
* Fix KMS freeze after pageflip fallback [Pekka; !953]
 | 
			
		||||
* Fixed crashes [Robert, Carlos, Jonas, Marco, Hans, Tim; !856, !869, !912,
 | 
			
		||||
  !895, !928, #591, !823, !960]
 | 
			
		||||
* Plugged memory leaks [Niels, Robert, Carlos, Marco; !847, !868, !873, #908]
 | 
			
		||||
* Misc. bug fixes and cleanups [Niels, Robert, Jonas, Marco, Carlos, Daniel,
 | 
			
		||||
  Jan, Adam, Cosimo, Florian, Thomas, Georges, Hans, Corentin, Christian,
 | 
			
		||||
  Benjamin; !853, !822, !451, !854, !816, !857, !859, !734, !844, !851, #876,
 | 
			
		||||
  !874, !673, !692, !888, !889, !894, !901, !905, !872, !898, !911, !918, !863,
 | 
			
		||||
  #878, !811, !893, !925, !926, !890, !931, !927, !934, !938, !940, !947, !941,
 | 
			
		||||
  !929, !949, !952, !871, !955, !956, !958, !907, !965, !964, !966]
 | 
			
		||||
 | 
			
		||||
Contributors:
 | 
			
		||||
  Marco Trevisan (Treviño), Jan Alexander Steffens (heftig),
 | 
			
		||||
  Thomas Hindoe Paaboel Andersen, Benjamin Berg, Cosimo Cecchi, Tim Crawford,
 | 
			
		||||
  Piotr Drąg, Xiang Fan, Olivier Fourdan, Carlos Garnacho, Hans de Goede,
 | 
			
		||||
  Niels De Graef, Christian Hergert, Adam Jackson, Robert Mader,
 | 
			
		||||
  Florian Müllner, Georges Basile Stavracas Neto, Bastien Nocera, Corentin Noël,
 | 
			
		||||
  Pekka Paalanen, Jasper St. Pierre, Christian Rauch, Daniel van Vugt,
 | 
			
		||||
  Jonas Ådahl
 | 
			
		||||
 | 
			
		||||
Translators:
 | 
			
		||||
  Bruce Cowan [en_GB]
 | 
			
		||||
 | 
			
		||||
3.35.1
 | 
			
		||||
======
 | 
			
		||||
* Fix immediate screen blank after releaseing inhibitor [Tim; #573]
 | 
			
		||||
 
 | 
			
		||||
@@ -600,11 +600,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);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -33,11 +33,28 @@
 | 
			
		||||
 | 
			
		||||
G_BEGIN_DECLS
 | 
			
		||||
 | 
			
		||||
#define CLUTTER_TYPE_ACTION (clutter_action_get_type ())
 | 
			
		||||
#define CLUTTER_TYPE_ACTION             (clutter_action_get_type ())
 | 
			
		||||
#define CLUTTER_ACTION(obj)             (G_TYPE_CHECK_INSTANCE_CAST ((obj), CLUTTER_TYPE_ACTION, ClutterAction))
 | 
			
		||||
#define CLUTTER_IS_ACTION(obj)          (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CLUTTER_TYPE_ACTION))
 | 
			
		||||
#define CLUTTER_ACTION_CLASS(klass)     (G_TYPE_CHECK_CLASS_CAST ((klass), CLUTTER_TYPE_ACTION, ClutterActionClass))
 | 
			
		||||
#define CLUTTER_IS_ACTION_CLASS(klass)  (G_TYPE_CHECK_CLASS_TYPE ((klass), CLUTTER_TYPE_ACTION))
 | 
			
		||||
#define CLUTTER_ACTION_GET_CLASS(obj)   (G_TYPE_INSTANCE_GET_CLASS ((obj), CLUTTER_TYPE_ACTION, ClutterActionClass))
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
G_DECLARE_DERIVABLE_TYPE (ClutterAction, clutter_action,
 | 
			
		||||
                          CLUTTER, ACTION, ClutterActorMeta);
 | 
			
		||||
typedef struct _ClutterActionClass      ClutterActionClass;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ClutterAction:
 | 
			
		||||
 *
 | 
			
		||||
 * The #ClutterAction structure contains only private data and
 | 
			
		||||
 * should be accessed using the provided API.
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 1.4
 | 
			
		||||
 */
 | 
			
		||||
struct _ClutterAction
 | 
			
		||||
{
 | 
			
		||||
  /*< private >*/
 | 
			
		||||
  ClutterActorMeta parent_instance;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ClutterActionClass:
 | 
			
		||||
@@ -61,6 +78,9 @@ struct _ClutterActionClass
 | 
			
		||||
  void (* _clutter_action8) (void);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
GType clutter_action_get_type (void) G_GNUC_CONST;
 | 
			
		||||
 | 
			
		||||
/* ClutterActor API */
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void           clutter_actor_add_action            (ClutterActor  *self,
 | 
			
		||||
 
 | 
			
		||||
@@ -81,49 +81,24 @@ static void
 | 
			
		||||
on_actor_destroy (ClutterActor     *actor,
 | 
			
		||||
                  ClutterActorMeta *meta)
 | 
			
		||||
{
 | 
			
		||||
  ClutterActorMetaPrivate *priv =
 | 
			
		||||
    clutter_actor_meta_get_instance_private (meta);
 | 
			
		||||
 | 
			
		||||
  priv->actor = NULL;
 | 
			
		||||
  meta->priv->actor = NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_actor_meta_real_set_actor (ClutterActorMeta *meta,
 | 
			
		||||
                                   ClutterActor     *actor)
 | 
			
		||||
{
 | 
			
		||||
  ClutterActorMetaPrivate *priv =
 | 
			
		||||
    clutter_actor_meta_get_instance_private (meta);
 | 
			
		||||
 | 
			
		||||
  g_warn_if_fail (!priv->actor ||
 | 
			
		||||
                  !CLUTTER_ACTOR_IN_PAINT (priv->actor));
 | 
			
		||||
  g_warn_if_fail (!actor || !CLUTTER_ACTOR_IN_PAINT (actor));
 | 
			
		||||
 | 
			
		||||
  if (priv->actor == actor)
 | 
			
		||||
  if (meta->priv->actor == actor)
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  g_clear_signal_handler (&priv->destroy_id, priv->actor);
 | 
			
		||||
  g_clear_signal_handler (&meta->priv->destroy_id, meta->priv->actor);
 | 
			
		||||
 | 
			
		||||
  priv->actor = actor;
 | 
			
		||||
  meta->priv->actor = actor;
 | 
			
		||||
 | 
			
		||||
  if (priv->actor != NULL)
 | 
			
		||||
    priv->destroy_id = g_signal_connect (priv->actor, "destroy",
 | 
			
		||||
                                         G_CALLBACK (on_actor_destroy),
 | 
			
		||||
                                         meta);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_actor_meta_real_set_enabled (ClutterActorMeta *meta,
 | 
			
		||||
                                     gboolean          is_enabled)
 | 
			
		||||
{
 | 
			
		||||
  ClutterActorMetaPrivate *priv =
 | 
			
		||||
    clutter_actor_meta_get_instance_private (meta);
 | 
			
		||||
 | 
			
		||||
  g_warn_if_fail (!priv->actor ||
 | 
			
		||||
                  !CLUTTER_ACTOR_IN_PAINT (priv->actor));
 | 
			
		||||
 | 
			
		||||
  priv->is_enabled = is_enabled;
 | 
			
		||||
 | 
			
		||||
  g_object_notify_by_pspec (G_OBJECT (meta), obj_props[PROP_ENABLED]);
 | 
			
		||||
  if (meta->priv->actor != NULL)
 | 
			
		||||
    meta->priv->destroy_id = g_signal_connect (meta->priv->actor, "destroy",
 | 
			
		||||
                                               G_CALLBACK (on_actor_destroy),
 | 
			
		||||
                                               meta);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
@@ -156,21 +131,20 @@ clutter_actor_meta_get_property (GObject    *gobject,
 | 
			
		||||
                                 GValue     *value,
 | 
			
		||||
                                 GParamSpec *pspec)
 | 
			
		||||
{
 | 
			
		||||
  ClutterActorMetaPrivate *priv =
 | 
			
		||||
    clutter_actor_meta_get_instance_private (CLUTTER_ACTOR_META (gobject));
 | 
			
		||||
  ClutterActorMeta *meta = CLUTTER_ACTOR_META (gobject);
 | 
			
		||||
 | 
			
		||||
  switch (prop_id)
 | 
			
		||||
    {
 | 
			
		||||
    case PROP_ACTOR:
 | 
			
		||||
      g_value_set_object (value, priv->actor);
 | 
			
		||||
      g_value_set_object (value, meta->priv->actor);
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
    case PROP_NAME:
 | 
			
		||||
      g_value_set_string (value, priv->name);
 | 
			
		||||
      g_value_set_string (value, meta->priv->name);
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
    case PROP_ENABLED:
 | 
			
		||||
      g_value_set_boolean (value, priv->is_enabled);
 | 
			
		||||
      g_value_set_boolean (value, meta->priv->is_enabled);
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
    default:
 | 
			
		||||
@@ -182,8 +156,7 @@ clutter_actor_meta_get_property (GObject    *gobject,
 | 
			
		||||
static void
 | 
			
		||||
clutter_actor_meta_finalize (GObject *gobject)
 | 
			
		||||
{
 | 
			
		||||
  ClutterActorMetaPrivate *priv =
 | 
			
		||||
    clutter_actor_meta_get_instance_private (CLUTTER_ACTOR_META (gobject));
 | 
			
		||||
  ClutterActorMetaPrivate *priv = CLUTTER_ACTOR_META (gobject)->priv;
 | 
			
		||||
 | 
			
		||||
  if (priv->actor != NULL)
 | 
			
		||||
    g_clear_signal_handler (&priv->destroy_id, priv->actor);
 | 
			
		||||
@@ -199,7 +172,6 @@ clutter_actor_meta_class_init (ClutterActorMetaClass *klass)
 | 
			
		||||
  GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
 | 
			
		||||
 | 
			
		||||
  klass->set_actor = clutter_actor_meta_real_set_actor;
 | 
			
		||||
  klass->set_enabled = clutter_actor_meta_real_set_enabled;
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * ClutterActorMeta:actor:
 | 
			
		||||
@@ -254,11 +226,9 @@ clutter_actor_meta_class_init (ClutterActorMetaClass *klass)
 | 
			
		||||
void
 | 
			
		||||
clutter_actor_meta_init (ClutterActorMeta *self)
 | 
			
		||||
{
 | 
			
		||||
  ClutterActorMetaPrivate *priv =
 | 
			
		||||
    clutter_actor_meta_get_instance_private (self);
 | 
			
		||||
 | 
			
		||||
  priv->is_enabled = TRUE;
 | 
			
		||||
  priv->priority = CLUTTER_ACTOR_META_PRIORITY_DEFAULT;
 | 
			
		||||
  self->priv = clutter_actor_meta_get_instance_private (self);
 | 
			
		||||
  self->priv->is_enabled = TRUE;
 | 
			
		||||
  self->priv->priority = CLUTTER_ACTOR_META_PRIORITY_DEFAULT;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -276,17 +246,13 @@ void
 | 
			
		||||
clutter_actor_meta_set_name (ClutterActorMeta *meta,
 | 
			
		||||
                             const gchar      *name)
 | 
			
		||||
{
 | 
			
		||||
  ClutterActorMetaPrivate *priv;
 | 
			
		||||
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_ACTOR_META (meta));
 | 
			
		||||
 | 
			
		||||
  priv = clutter_actor_meta_get_instance_private (meta);
 | 
			
		||||
 | 
			
		||||
  if (g_strcmp0 (priv->name, name) == 0)
 | 
			
		||||
  if (g_strcmp0 (meta->priv->name, name) == 0)
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  g_free (priv->name);
 | 
			
		||||
  priv->name = g_strdup (name);
 | 
			
		||||
  g_free (meta->priv->name);
 | 
			
		||||
  meta->priv->name = g_strdup (name);
 | 
			
		||||
 | 
			
		||||
  g_object_notify_by_pspec (G_OBJECT (meta), obj_props[PROP_NAME]);
 | 
			
		||||
}
 | 
			
		||||
@@ -307,13 +273,9 @@ clutter_actor_meta_set_name (ClutterActorMeta *meta,
 | 
			
		||||
const gchar *
 | 
			
		||||
clutter_actor_meta_get_name (ClutterActorMeta *meta)
 | 
			
		||||
{
 | 
			
		||||
  ClutterActorMetaPrivate *priv;
 | 
			
		||||
 | 
			
		||||
  g_return_val_if_fail (CLUTTER_IS_ACTOR_META (meta), NULL);
 | 
			
		||||
 | 
			
		||||
  priv = clutter_actor_meta_get_instance_private (meta);
 | 
			
		||||
 | 
			
		||||
  return priv->name;
 | 
			
		||||
  return meta->priv->name;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -329,17 +291,16 @@ void
 | 
			
		||||
clutter_actor_meta_set_enabled (ClutterActorMeta *meta,
 | 
			
		||||
                                gboolean          is_enabled)
 | 
			
		||||
{
 | 
			
		||||
  ClutterActorMetaPrivate *priv;
 | 
			
		||||
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_ACTOR_META (meta));
 | 
			
		||||
 | 
			
		||||
  priv = clutter_actor_meta_get_instance_private (meta);
 | 
			
		||||
  is_enabled = !!is_enabled;
 | 
			
		||||
 | 
			
		||||
  if (priv->is_enabled == is_enabled)
 | 
			
		||||
  if (meta->priv->is_enabled == is_enabled)
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  CLUTTER_ACTOR_META_GET_CLASS (meta)->set_enabled (meta, is_enabled);
 | 
			
		||||
  meta->priv->is_enabled = is_enabled;
 | 
			
		||||
 | 
			
		||||
  g_object_notify_by_pspec (G_OBJECT (meta), obj_props[PROP_ENABLED]);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -355,13 +316,9 @@ clutter_actor_meta_set_enabled (ClutterActorMeta *meta,
 | 
			
		||||
gboolean
 | 
			
		||||
clutter_actor_meta_get_enabled (ClutterActorMeta *meta)
 | 
			
		||||
{
 | 
			
		||||
  ClutterActorMetaPrivate *priv;
 | 
			
		||||
 | 
			
		||||
  g_return_val_if_fail (CLUTTER_IS_ACTOR_META (meta), FALSE);
 | 
			
		||||
 | 
			
		||||
  priv = clutter_actor_meta_get_instance_private (meta);
 | 
			
		||||
 | 
			
		||||
  return priv->is_enabled;
 | 
			
		||||
  return meta->priv->is_enabled;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
@@ -397,54 +354,40 @@ _clutter_actor_meta_set_actor (ClutterActorMeta *meta,
 | 
			
		||||
ClutterActor *
 | 
			
		||||
clutter_actor_meta_get_actor (ClutterActorMeta *meta)
 | 
			
		||||
{
 | 
			
		||||
  ClutterActorMetaPrivate *priv;
 | 
			
		||||
 | 
			
		||||
  g_return_val_if_fail (CLUTTER_IS_ACTOR_META (meta), NULL);
 | 
			
		||||
 | 
			
		||||
  priv = clutter_actor_meta_get_instance_private (meta);
 | 
			
		||||
 | 
			
		||||
  return priv->actor;
 | 
			
		||||
  return meta->priv->actor;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
_clutter_actor_meta_set_priority (ClutterActorMeta *meta,
 | 
			
		||||
                                  gint priority)
 | 
			
		||||
{
 | 
			
		||||
  ClutterActorMetaPrivate *priv;
 | 
			
		||||
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_ACTOR_META (meta));
 | 
			
		||||
 | 
			
		||||
  priv = clutter_actor_meta_get_instance_private (meta);
 | 
			
		||||
 | 
			
		||||
  /* This property shouldn't be modified after the actor meta is in
 | 
			
		||||
     use because ClutterMetaGroup doesn't resort the list when it
 | 
			
		||||
     changes. If we made the priority public then we could either make
 | 
			
		||||
     the priority a construct-only property or listen for
 | 
			
		||||
     notifications on the property from the ClutterMetaGroup and
 | 
			
		||||
     resort. */
 | 
			
		||||
  g_return_if_fail (priv->actor == NULL);
 | 
			
		||||
  g_return_if_fail (meta->priv->actor == NULL);
 | 
			
		||||
 | 
			
		||||
  priv->priority = priority;
 | 
			
		||||
  meta->priv->priority = priority;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
gint
 | 
			
		||||
_clutter_actor_meta_get_priority (ClutterActorMeta *meta)
 | 
			
		||||
{
 | 
			
		||||
  ClutterActorMetaPrivate *priv;
 | 
			
		||||
 | 
			
		||||
  g_return_val_if_fail (CLUTTER_IS_ACTOR_META (meta), 0);
 | 
			
		||||
 | 
			
		||||
  priv = clutter_actor_meta_get_instance_private (meta);
 | 
			
		||||
 | 
			
		||||
  return priv->priority;
 | 
			
		||||
  return meta->priv->priority;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
gboolean
 | 
			
		||||
_clutter_actor_meta_is_internal (ClutterActorMeta *meta)
 | 
			
		||||
{
 | 
			
		||||
  ClutterActorMetaPrivate *priv =
 | 
			
		||||
    clutter_actor_meta_get_instance_private (meta);
 | 
			
		||||
  gint priority = priv->priority;
 | 
			
		||||
  gint priority = meta->priv->priority;
 | 
			
		||||
 | 
			
		||||
  return (priority <= CLUTTER_ACTOR_META_PRIORITY_INTERNAL_LOW ||
 | 
			
		||||
          priority >= CLUTTER_ACTOR_META_PRIORITY_INTERNAL_HIGH);
 | 
			
		||||
@@ -491,21 +434,19 @@ void
 | 
			
		||||
_clutter_meta_group_add_meta (ClutterMetaGroup *group,
 | 
			
		||||
                              ClutterActorMeta *meta)
 | 
			
		||||
{
 | 
			
		||||
  ClutterActorMetaPrivate *priv =
 | 
			
		||||
    clutter_actor_meta_get_instance_private (meta);
 | 
			
		||||
  GList *prev = NULL, *l;
 | 
			
		||||
 | 
			
		||||
  if (priv->actor != NULL)
 | 
			
		||||
  if (meta->priv->actor != NULL)
 | 
			
		||||
    {
 | 
			
		||||
      g_warning ("The meta of type '%s' with name '%s' is "
 | 
			
		||||
                 "already attached to actor '%s'",
 | 
			
		||||
                 G_OBJECT_TYPE_NAME (meta),
 | 
			
		||||
                 priv->name != NULL
 | 
			
		||||
                   ? priv->name
 | 
			
		||||
                 meta->priv->name != NULL
 | 
			
		||||
                   ? meta->priv->name
 | 
			
		||||
                   : "<unknown>",
 | 
			
		||||
                 clutter_actor_get_name (priv->actor) != NULL
 | 
			
		||||
                   ? clutter_actor_get_name (priv->actor)
 | 
			
		||||
                   : G_OBJECT_TYPE_NAME (priv->actor));
 | 
			
		||||
                 clutter_actor_get_name (meta->priv->actor) != NULL
 | 
			
		||||
                   ? clutter_actor_get_name (meta->priv->actor)
 | 
			
		||||
                   : G_OBJECT_TYPE_NAME (meta->priv->actor));
 | 
			
		||||
      return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -541,16 +482,13 @@ void
 | 
			
		||||
_clutter_meta_group_remove_meta (ClutterMetaGroup *group,
 | 
			
		||||
                                 ClutterActorMeta *meta)
 | 
			
		||||
{
 | 
			
		||||
  ClutterActorMetaPrivate *priv =
 | 
			
		||||
    clutter_actor_meta_get_instance_private (meta);
 | 
			
		||||
 | 
			
		||||
  if (priv->actor != group->actor)
 | 
			
		||||
  if (meta->priv->actor != group->actor)
 | 
			
		||||
    {
 | 
			
		||||
      g_warning ("The meta of type '%s' with name '%s' is not "
 | 
			
		||||
                 "attached to the actor '%s'",
 | 
			
		||||
                 G_OBJECT_TYPE_NAME (meta),
 | 
			
		||||
                 priv->name != NULL
 | 
			
		||||
                   ? priv->name
 | 
			
		||||
                 meta->priv->name != NULL
 | 
			
		||||
                   ? meta->priv->name
 | 
			
		||||
                   : "<unknown>",
 | 
			
		||||
                 clutter_actor_get_name (group->actor) != NULL
 | 
			
		||||
                   ? clutter_actor_get_name (group->actor)
 | 
			
		||||
@@ -693,10 +631,8 @@ _clutter_meta_group_get_meta (ClutterMetaGroup *group,
 | 
			
		||||
  for (l = group->meta; l != NULL; l = l->next)
 | 
			
		||||
    {
 | 
			
		||||
      ClutterActorMeta *meta = l->data;
 | 
			
		||||
      ClutterActorMetaPrivate *priv =
 | 
			
		||||
        clutter_actor_meta_get_instance_private (meta);
 | 
			
		||||
 | 
			
		||||
      if (g_strcmp0 (priv->name, name) == 0)
 | 
			
		||||
      if (g_strcmp0 (meta->priv->name, name) == 0)
 | 
			
		||||
        return meta;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -716,8 +652,6 @@ _clutter_meta_group_get_meta (ClutterMetaGroup *group,
 | 
			
		||||
const gchar *
 | 
			
		||||
_clutter_actor_meta_get_debug_name (ClutterActorMeta *meta)
 | 
			
		||||
{
 | 
			
		||||
  ClutterActorMetaPrivate *priv =
 | 
			
		||||
    clutter_actor_meta_get_instance_private (meta);
 | 
			
		||||
 | 
			
		||||
  return priv->name != NULL ? priv->name : G_OBJECT_TYPE_NAME (meta);
 | 
			
		||||
  return meta->priv->name != NULL ? meta->priv->name
 | 
			
		||||
                                  : G_OBJECT_TYPE_NAME (meta);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -33,13 +33,31 @@
 | 
			
		||||
 | 
			
		||||
G_BEGIN_DECLS
 | 
			
		||||
 | 
			
		||||
#define CLUTTER_TYPE_ACTOR_META (clutter_actor_meta_get_type ())
 | 
			
		||||
#define CLUTTER_TYPE_ACTOR_META                 (clutter_actor_meta_get_type ())
 | 
			
		||||
#define CLUTTER_ACTOR_META(obj)                 (G_TYPE_CHECK_INSTANCE_CAST ((obj), CLUTTER_TYPE_ACTOR_META, ClutterActorMeta))
 | 
			
		||||
#define CLUTTER_IS_ACTOR_META(obj)              (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CLUTTER_TYPE_ACTOR_META))
 | 
			
		||||
#define CLUTTER_ACTOR_META_CLASS(klass)         (G_TYPE_CHECK_CLASS_CAST ((klass), CLUTTER_TYPE_ACTOR_META, ClutterActorMetaClass))
 | 
			
		||||
#define CLUTTER_IS_ACTOR_META_CLASS(klass)      (G_TYPE_CHECK_CLASS_TYPE ((klass), CLUTTER_TYPE_ACTOR_META))
 | 
			
		||||
#define CLUTTER_ACTOR_META_GET_CLASS(obj)       (G_TYPE_INSTANCE_GET_CLASS ((obj), CLUTTER_TYPE_ACTOR_META, ClutterActorMetaClass))
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
G_DECLARE_DERIVABLE_TYPE (ClutterActorMeta, clutter_actor_meta,
 | 
			
		||||
                          CLUTTER, ACTOR_META, GInitiallyUnowned);
 | 
			
		||||
typedef struct _ClutterActorMetaPrivate         ClutterActorMetaPrivate;
 | 
			
		||||
typedef struct _ClutterActorMetaClass           ClutterActorMetaClass;
 | 
			
		||||
 | 
			
		||||
typedef struct _ClutterActorMetaPrivate ClutterActorMetaPrivate;
 | 
			
		||||
/**
 | 
			
		||||
 * ClutterActorMeta:
 | 
			
		||||
 *
 | 
			
		||||
 * The #ClutterActorMeta structure contains only
 | 
			
		||||
 * private data and should be accessed using the provided API
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 1.4
 | 
			
		||||
 */
 | 
			
		||||
struct _ClutterActorMeta
 | 
			
		||||
{
 | 
			
		||||
  /*< private >*/
 | 
			
		||||
  GInitiallyUnowned parent_instance;
 | 
			
		||||
 | 
			
		||||
  ClutterActorMetaPrivate *priv;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ClutterActorMetaClass:
 | 
			
		||||
@@ -69,9 +87,6 @@ struct _ClutterActorMetaClass
 | 
			
		||||
  void (* set_actor) (ClutterActorMeta *meta,
 | 
			
		||||
                      ClutterActor     *actor);
 | 
			
		||||
 | 
			
		||||
  void (* set_enabled) (ClutterActorMeta *meta,
 | 
			
		||||
                        gboolean          is_enabled);
 | 
			
		||||
 | 
			
		||||
  /*< private >*/
 | 
			
		||||
  void (* _clutter_meta1) (void);
 | 
			
		||||
  void (* _clutter_meta2) (void);
 | 
			
		||||
@@ -79,8 +94,12 @@ struct _ClutterActorMetaClass
 | 
			
		||||
  void (* _clutter_meta4) (void);
 | 
			
		||||
  void (* _clutter_meta5) (void);
 | 
			
		||||
  void (* _clutter_meta6) (void);
 | 
			
		||||
  void (* _clutter_meta7) (void);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
GType clutter_actor_meta_get_type (void) G_GNUC_CONST;
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void            clutter_actor_meta_set_name     (ClutterActorMeta *meta,
 | 
			
		||||
                                                 const gchar      *name);
 | 
			
		||||
 
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -175,12 +175,9 @@ struct _ClutterActor
 | 
			
		||||
 * @get_preferred_height: virtual function, used when querying the minimum
 | 
			
		||||
 *   and natural heights of an actor for a given width; it is used by
 | 
			
		||||
 *   clutter_actor_get_preferred_height()
 | 
			
		||||
 * @allocate: virtual function, used when setting the coordinates of an
 | 
			
		||||
 *   actor; it is used by clutter_actor_allocate(); when overriding this
 | 
			
		||||
 *   function without chaining up, clutter_actor_set_allocation() must be
 | 
			
		||||
 *   called and children must be allocated by the implementation, when
 | 
			
		||||
 *   chaining up though, those things will be done by the parent's
 | 
			
		||||
 *   implementation.
 | 
			
		||||
 * @allocate: virtual function, used when settings the coordinates of an
 | 
			
		||||
 *   actor; it is used by clutter_actor_allocate(); it must chain up to
 | 
			
		||||
 *   the parent's implementation, or call clutter_actor_set_allocation()
 | 
			
		||||
 * @apply_transform: virtual function, used when applying the transformations
 | 
			
		||||
 *   to an actor before painting it or when transforming coordinates or
 | 
			
		||||
 *   the allocation; it must chain up to the parent's implementation
 | 
			
		||||
@@ -256,7 +253,8 @@ struct _ClutterActorClass
 | 
			
		||||
                                 gfloat                 *min_height_p,
 | 
			
		||||
                                 gfloat                 *natural_height_p);
 | 
			
		||||
  void (* allocate)             (ClutterActor           *self,
 | 
			
		||||
                                 const ClutterActorBox  *box);
 | 
			
		||||
                                 const ClutterActorBox  *box,
 | 
			
		||||
                                 ClutterAllocationFlags  flags);
 | 
			
		||||
 | 
			
		||||
  /* transformations */
 | 
			
		||||
  void (* apply_transform)      (ClutterActor           *actor,
 | 
			
		||||
@@ -301,11 +299,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];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -383,8 +380,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);
 | 
			
		||||
@@ -417,29 +412,38 @@ void                            clutter_actor_get_preferred_size
 | 
			
		||||
                                                                                 gfloat                      *natural_height_p);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void                            clutter_actor_allocate                          (ClutterActor                *self,
 | 
			
		||||
                                                                                 const ClutterActorBox       *box);
 | 
			
		||||
                                                                                 const ClutterActorBox       *box,
 | 
			
		||||
                                                                                 ClutterAllocationFlags       flags);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void                            clutter_actor_allocate_preferred_size           (ClutterActor                *self);
 | 
			
		||||
void                            clutter_actor_allocate_preferred_size           (ClutterActor                *self,
 | 
			
		||||
                                                                                 ClutterAllocationFlags       flags);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void                            clutter_actor_allocate_available_size           (ClutterActor                *self,
 | 
			
		||||
                                                                                 gfloat                       x,
 | 
			
		||||
                                                                                 gfloat                       y,
 | 
			
		||||
                                                                                 gfloat                       available_width,
 | 
			
		||||
                                                                                 gfloat                       available_height);
 | 
			
		||||
                                                                                 gfloat                       available_height,
 | 
			
		||||
                                                                                 ClutterAllocationFlags       flags);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void                            clutter_actor_allocate_align_fill               (ClutterActor                *self,
 | 
			
		||||
                                                                                 const ClutterActorBox       *box,
 | 
			
		||||
                                                                                 gdouble                      x_align,
 | 
			
		||||
                                                                                 gdouble                      y_align,
 | 
			
		||||
                                                                                 gboolean                     x_fill,
 | 
			
		||||
                                                                                 gboolean                     y_fill);
 | 
			
		||||
                                                                                 gboolean                     y_fill,
 | 
			
		||||
                                                                                 ClutterAllocationFlags       flags);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void                            clutter_actor_set_allocation                    (ClutterActor                *self,
 | 
			
		||||
                                                                                 const ClutterActorBox       *box);
 | 
			
		||||
                                                                                 const ClutterActorBox       *box,
 | 
			
		||||
                                                                                 ClutterAllocationFlags       flags);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void                            clutter_actor_get_allocation_box                (ClutterActor                *self,
 | 
			
		||||
                                                                                 ClutterActorBox             *box);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void                            clutter_actor_get_allocation_vertices           (ClutterActor                *self,
 | 
			
		||||
                                                                                 ClutterActor                *ancestor,
 | 
			
		||||
                                                                                 graphene_point3d_t          *verts);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
gboolean                        clutter_actor_has_allocation                    (ClutterActor                *self);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void                            clutter_actor_set_size                          (ClutterActor                *self,
 | 
			
		||||
@@ -877,11 +881,6 @@ void                            clutter_actor_set_opacity_override
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
gint                            clutter_actor_get_opacity_override              (ClutterActor               *self);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void                            clutter_actor_inhibit_culling                   (ClutterActor               *actor);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void                            clutter_actor_uninhibit_culling                 (ClutterActor               *actor);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ClutterActorCreateChildFunc:
 | 
			
		||||
 * @item: (type GObject): the item in the model
 | 
			
		||||
 
 | 
			
		||||
@@ -85,7 +85,8 @@ G_DEFINE_TYPE (ClutterAlignConstraint,
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
source_position_changed (ClutterActor           *actor,
 | 
			
		||||
                         GParamSpec             *pspec,
 | 
			
		||||
                         const ClutterActorBox  *allocation,
 | 
			
		||||
                         ClutterAllocationFlags  flags,
 | 
			
		||||
                         ClutterAlignConstraint *align)
 | 
			
		||||
{
 | 
			
		||||
  if (align->actor != NULL)
 | 
			
		||||
@@ -409,7 +410,7 @@ clutter_align_constraint_set_source (ClutterAlignConstraint *align,
 | 
			
		||||
  align->source = source;
 | 
			
		||||
  if (align->source != NULL)
 | 
			
		||||
    {
 | 
			
		||||
      g_signal_connect (align->source, "notify::allocation",
 | 
			
		||||
      g_signal_connect (align->source, "allocation-changed",
 | 
			
		||||
                        G_CALLBACK (source_position_changed),
 | 
			
		||||
                        align);
 | 
			
		||||
      g_signal_connect (align->source, "destroy",
 | 
			
		||||
 
 | 
			
		||||
@@ -27,23 +27,35 @@
 | 
			
		||||
 * @short_description: Interface for animatable classes
 | 
			
		||||
 *
 | 
			
		||||
 * #ClutterAnimatable is an interface that allows a #GObject class
 | 
			
		||||
 * to control how an actor will animate a property.
 | 
			
		||||
 * to control how a #ClutterAnimation will animate a property.
 | 
			
		||||
 *
 | 
			
		||||
 * Each #ClutterAnimatable should implement the
 | 
			
		||||
 * #ClutterAnimatableInterface.interpolate_property() virtual function of the
 | 
			
		||||
 * interface to compute the animation state between two values of an interval
 | 
			
		||||
 * depending on a progress factor, expressed as a floating point value.
 | 
			
		||||
 *
 | 
			
		||||
 * If a #ClutterAnimatable is animated by a #ClutterAnimation
 | 
			
		||||
 * instance, the #ClutterAnimation will call
 | 
			
		||||
 * clutter_animatable_interpolate_property() passing the name of the
 | 
			
		||||
 * currently animated property; the values interval; and the progress factor.
 | 
			
		||||
 * The #ClutterAnimatable implementation should return the computed value for
 | 
			
		||||
 * the animated
 | 
			
		||||
 * property.
 | 
			
		||||
 *
 | 
			
		||||
 * #ClutterAnimatable is available since Clutter 1.0
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "clutter-build-config.h"
 | 
			
		||||
 | 
			
		||||
#define CLUTTER_DISABLE_DEPRECATION_WARNINGS
 | 
			
		||||
 | 
			
		||||
#include "clutter-animatable.h"
 | 
			
		||||
#include "clutter-interval.h"
 | 
			
		||||
#include "clutter-debug.h"
 | 
			
		||||
#include "clutter-private.h"
 | 
			
		||||
 | 
			
		||||
#include "deprecated/clutter-animation.h"
 | 
			
		||||
 | 
			
		||||
G_DEFINE_INTERFACE (ClutterAnimatable, clutter_animatable, G_TYPE_OBJECT);
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
 
 | 
			
		||||
@@ -42,6 +42,8 @@ G_DECLARE_INTERFACE (ClutterAnimatable, clutter_animatable,
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ClutterAnimatableInterface:
 | 
			
		||||
 * @animate_property: virtual function for custom interpolation of a
 | 
			
		||||
 *   property. This virtual function is deprecated
 | 
			
		||||
 * @find_property: virtual function for retrieving the #GParamSpec of
 | 
			
		||||
 *   an animatable property
 | 
			
		||||
 * @get_initial_state: virtual function for retrieving the initial
 | 
			
		||||
@@ -51,6 +53,9 @@ G_DECLARE_INTERFACE (ClutterAnimatable, clutter_animatable,
 | 
			
		||||
 * @interpolate_value: virtual function for interpolating the progress
 | 
			
		||||
 *   of a property
 | 
			
		||||
 *
 | 
			
		||||
 * Base interface for #GObject<!-- -->s that can be animated by a
 | 
			
		||||
 * a #ClutterAnimation.
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 1.0
 | 
			
		||||
 */
 | 
			
		||||
struct _ClutterAnimatableInterface
 | 
			
		||||
@@ -59,6 +64,13 @@ struct _ClutterAnimatableInterface
 | 
			
		||||
  GTypeInterface parent_iface;
 | 
			
		||||
 | 
			
		||||
  /*< public >*/
 | 
			
		||||
  gboolean    (* animate_property)  (ClutterAnimatable *animatable,
 | 
			
		||||
                                     ClutterAnimation  *animation,
 | 
			
		||||
                                     const gchar       *property_name,
 | 
			
		||||
                                     const GValue      *initial_value,
 | 
			
		||||
                                     const GValue      *final_value,
 | 
			
		||||
                                     gdouble            progress,
 | 
			
		||||
                                     GValue            *value);
 | 
			
		||||
  GParamSpec *(* find_property)     (ClutterAnimatable *animatable,
 | 
			
		||||
                                     const gchar       *property_name);
 | 
			
		||||
  void        (* get_initial_state) (ClutterAnimatable *animatable,
 | 
			
		||||
 
 | 
			
		||||
@@ -30,7 +30,9 @@
 | 
			
		||||
 | 
			
		||||
#ifndef __GI_SCANNER__
 | 
			
		||||
 | 
			
		||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterAction, g_object_unref)
 | 
			
		||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterActor, g_object_unref)
 | 
			
		||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterActorMeta, g_object_unref)
 | 
			
		||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterAlignConstraint, g_object_unref)
 | 
			
		||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterBackend, g_object_unref)
 | 
			
		||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterBindConstraint, g_object_unref)
 | 
			
		||||
@@ -41,15 +43,19 @@ G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterBoxLayout, g_object_unref)
 | 
			
		||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterBrightnessContrastEffect, g_object_unref)
 | 
			
		||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterCanvas, g_object_unref)
 | 
			
		||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterChildMeta, g_object_unref)
 | 
			
		||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterClickAction, g_object_unref)
 | 
			
		||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterClone, g_object_unref)
 | 
			
		||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterColorizeEffect, g_object_unref)
 | 
			
		||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterConstraint, g_object_unref)
 | 
			
		||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterContainer, g_object_unref)
 | 
			
		||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterDeformEffect, g_object_unref)
 | 
			
		||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterDesaturateEffect, g_object_unref)
 | 
			
		||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterDragAction, g_object_unref)
 | 
			
		||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterDropAction, g_object_unref)
 | 
			
		||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterEffect, g_object_unref)
 | 
			
		||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterFixedLayout, g_object_unref)
 | 
			
		||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterFlowLayout, g_object_unref)
 | 
			
		||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterGestureAction, g_object_unref)
 | 
			
		||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterGridLayout, g_object_unref)
 | 
			
		||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterImage, g_object_unref)
 | 
			
		||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterInputDevice, g_object_unref)
 | 
			
		||||
 
 | 
			
		||||
@@ -23,7 +23,8 @@
 | 
			
		||||
#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>
 | 
			
		||||
 | 
			
		||||
#define CLUTTER_BACKEND_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), CLUTTER_TYPE_BACKEND, ClutterBackendClass))
 | 
			
		||||
@@ -46,6 +47,8 @@ struct _ClutterBackend
 | 
			
		||||
 | 
			
		||||
  CoglOnscreen *dummy_onscreen;
 | 
			
		||||
 | 
			
		||||
  ClutterDeviceManager *device_manager;
 | 
			
		||||
 | 
			
		||||
  cairo_font_options_t *font_options;
 | 
			
		||||
 | 
			
		||||
  gchar *font_name;
 | 
			
		||||
@@ -56,6 +59,8 @@ struct _ClutterBackend
 | 
			
		||||
  ClutterStageWindow *stage_window;
 | 
			
		||||
 | 
			
		||||
  ClutterInputMethod *input_method;
 | 
			
		||||
 | 
			
		||||
  ClutterKeymap *keymap;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct _ClutterBackendClass
 | 
			
		||||
@@ -84,12 +89,17 @@ struct _ClutterBackendClass
 | 
			
		||||
                                                GError         **error);
 | 
			
		||||
  gboolean              (* create_context)     (ClutterBackend  *backend,
 | 
			
		||||
                                                GError         **error);
 | 
			
		||||
  ClutterDeviceManager *(* get_device_manager) (ClutterBackend  *backend);
 | 
			
		||||
 | 
			
		||||
  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);
 | 
			
		||||
@@ -129,6 +139,8 @@ gfloat                  _clutter_backend_get_units_per_em               (Clutter
 | 
			
		||||
                                                                         PangoFontDescription   *font_desc);
 | 
			
		||||
gint32                  _clutter_backend_get_units_serial               (ClutterBackend         *backend);
 | 
			
		||||
 | 
			
		||||
PangoDirection          _clutter_backend_get_keymap_direction           (ClutterBackend         *backend);
 | 
			
		||||
 | 
			
		||||
void                    clutter_set_allowed_drivers                     (const char             *drivers);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
 
 | 
			
		||||
@@ -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"
 | 
			
		||||
@@ -527,6 +528,30 @@ clutter_backend_real_init_events (ClutterBackend *backend)
 | 
			
		||||
  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 void
 | 
			
		||||
clutter_backend_class_init (ClutterBackendClass *klass)
 | 
			
		||||
{
 | 
			
		||||
@@ -590,8 +615,10 @@ clutter_backend_class_init (ClutterBackendClass *klass)
 | 
			
		||||
  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->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
 | 
			
		||||
@@ -756,24 +783,24 @@ _clutter_backend_copy_event_data (ClutterBackend     *backend,
 | 
			
		||||
                                  const ClutterEvent *src,
 | 
			
		||||
                                  ClutterEvent       *dest)
 | 
			
		||||
{
 | 
			
		||||
  ClutterSeatClass *seat_class;
 | 
			
		||||
  ClutterSeat *seat;
 | 
			
		||||
  ClutterDeviceManagerClass *device_manager_class;
 | 
			
		||||
  ClutterDeviceManager *device_manager;
 | 
			
		||||
 | 
			
		||||
  seat = clutter_backend_get_default_seat (backend);
 | 
			
		||||
  seat_class = CLUTTER_SEAT_GET_CLASS (seat);
 | 
			
		||||
  seat_class->copy_event_data (seat, src, dest);
 | 
			
		||||
  device_manager = clutter_device_manager_get_default ();
 | 
			
		||||
  device_manager_class = CLUTTER_DEVICE_MANAGER_GET_CLASS (device_manager);
 | 
			
		||||
  device_manager_class->copy_event_data (device_manager, src, dest);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
_clutter_backend_free_event_data (ClutterBackend *backend,
 | 
			
		||||
                                  ClutterEvent   *event)
 | 
			
		||||
{
 | 
			
		||||
  ClutterSeatClass *seat_class;
 | 
			
		||||
  ClutterSeat *seat;
 | 
			
		||||
  ClutterDeviceManagerClass *device_manager_class;
 | 
			
		||||
  ClutterDeviceManager *device_manager;
 | 
			
		||||
 | 
			
		||||
  seat = clutter_backend_get_default_seat (backend);
 | 
			
		||||
  seat_class = CLUTTER_SEAT_GET_CLASS (seat);
 | 
			
		||||
  seat_class->free_event_data (seat, event);
 | 
			
		||||
  device_manager = clutter_device_manager_get_default ();
 | 
			
		||||
  device_manager_class = CLUTTER_DEVICE_MANAGER_GET_CLASS (device_manager);
 | 
			
		||||
  device_manager_class->free_event_data (device_manager, event);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -970,6 +997,18 @@ clutter_wayland_set_compositor_display (void *display)
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
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_set_allowed_drivers (const char *drivers)
 | 
			
		||||
{
 | 
			
		||||
@@ -982,6 +1021,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 +1059,22 @@ clutter_backend_set_input_method (ClutterBackend     *backend,
 | 
			
		||||
  g_set_object (&backend->input_method, method);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_backend_get_keymap:
 | 
			
		||||
 * @backend: the #ClutterBackend
 | 
			
		||||
 *
 | 
			
		||||
 * Gets the keymap used by Clutter
 | 
			
		||||
 *
 | 
			
		||||
 * Returns: (transfer none): the keymap
 | 
			
		||||
 **/
 | 
			
		||||
ClutterKeymap *
 | 
			
		||||
clutter_backend_get_keymap (ClutterBackend *backend)
 | 
			
		||||
{
 | 
			
		||||
  return CLUTTER_BACKEND_GET_CLASS (backend)->get_keymap (backend);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ClutterStageWindow *
 | 
			
		||||
clutter_backend_get_stage_window (ClutterBackend *backend)
 | 
			
		||||
{
 | 
			
		||||
  return backend->stage_window;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_backend_get_default_seat:
 | 
			
		||||
 * @backend: the #ClutterBackend
 | 
			
		||||
 *
 | 
			
		||||
 * Returns the default seat
 | 
			
		||||
 *
 | 
			
		||||
 * Returns: (transfer none): the default seat
 | 
			
		||||
 **/
 | 
			
		||||
ClutterSeat *
 | 
			
		||||
clutter_backend_get_default_seat (ClutterBackend *backend)
 | 
			
		||||
{
 | 
			
		||||
  g_return_val_if_fail (CLUTTER_IS_BACKEND (backend), NULL);
 | 
			
		||||
 | 
			
		||||
  return CLUTTER_BACKEND_GET_CLASS (backend)->get_default_seat (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
 | 
			
		||||
 | 
			
		||||
@@ -73,6 +72,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 +82,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
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -406,7 +406,8 @@ get_actor_align_factor (ClutterActorAlign alignment)
 | 
			
		||||
static void
 | 
			
		||||
clutter_bin_layout_allocate (ClutterLayoutManager   *manager,
 | 
			
		||||
                             ClutterContainer       *container,
 | 
			
		||||
                             const ClutterActorBox  *allocation)
 | 
			
		||||
                             const ClutterActorBox  *allocation,
 | 
			
		||||
                             ClutterAllocationFlags  flags)
 | 
			
		||||
{
 | 
			
		||||
  gfloat allocation_x, allocation_y;
 | 
			
		||||
  gfloat available_w, available_h;
 | 
			
		||||
@@ -514,7 +515,8 @@ clutter_bin_layout_allocate (ClutterLayoutManager   *manager,
 | 
			
		||||
 | 
			
		||||
      clutter_actor_allocate_align_fill (child, &child_alloc,
 | 
			
		||||
                                         x_align, y_align,
 | 
			
		||||
                                         x_fill, y_fill);
 | 
			
		||||
                                         x_fill, y_fill,
 | 
			
		||||
                                         flags);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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,
 | 
			
		||||
@@ -377,8 +328,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:
 | 
			
		||||
   *
 | 
			
		||||
 
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -105,6 +105,64 @@ void                    clutter_box_layout_set_pack_start       (ClutterBoxLayou
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
gboolean                clutter_box_layout_get_pack_start       (ClutterBoxLayout    *layout);
 | 
			
		||||
 | 
			
		||||
CLUTTER_DEPRECATED_FOR(clutter_box_layout_set_orientation)
 | 
			
		||||
void                    clutter_box_layout_set_vertical         (ClutterBoxLayout    *layout,
 | 
			
		||||
                                                                 gboolean             vertical);
 | 
			
		||||
CLUTTER_DEPRECATED_FOR(clutter_box_layout_get_orientation)
 | 
			
		||||
gboolean                clutter_box_layout_get_vertical         (ClutterBoxLayout    *layout);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void                    clutter_box_layout_pack                 (ClutterBoxLayout    *layout,
 | 
			
		||||
                                                                 ClutterActor        *actor,
 | 
			
		||||
                                                                 gboolean             expand,
 | 
			
		||||
                                                                 gboolean             x_fill,
 | 
			
		||||
                                                                 gboolean             y_fill,
 | 
			
		||||
                                                                 ClutterBoxAlignment  x_align,
 | 
			
		||||
                                                                 ClutterBoxAlignment  y_align);
 | 
			
		||||
CLUTTER_DEPRECATED
 | 
			
		||||
void                    clutter_box_layout_set_alignment        (ClutterBoxLayout    *layout,
 | 
			
		||||
                                                                 ClutterActor        *actor,
 | 
			
		||||
                                                                 ClutterBoxAlignment  x_align,
 | 
			
		||||
                                                                 ClutterBoxAlignment  y_align);
 | 
			
		||||
CLUTTER_DEPRECATED
 | 
			
		||||
void                    clutter_box_layout_get_alignment        (ClutterBoxLayout    *layout,
 | 
			
		||||
                                                                 ClutterActor        *actor,
 | 
			
		||||
                                                                 ClutterBoxAlignment *x_align,
 | 
			
		||||
                                                                 ClutterBoxAlignment *y_align);
 | 
			
		||||
CLUTTER_DEPRECATED
 | 
			
		||||
void                    clutter_box_layout_set_fill             (ClutterBoxLayout    *layout,
 | 
			
		||||
                                                                 ClutterActor        *actor,
 | 
			
		||||
                                                                 gboolean             x_fill,
 | 
			
		||||
                                                                 gboolean             y_fill);
 | 
			
		||||
CLUTTER_DEPRECATED
 | 
			
		||||
void                    clutter_box_layout_get_fill             (ClutterBoxLayout    *layout,
 | 
			
		||||
                                                                 ClutterActor        *actor,
 | 
			
		||||
                                                                 gboolean            *x_fill,
 | 
			
		||||
                                                                 gboolean            *y_fill);
 | 
			
		||||
CLUTTER_DEPRECATED
 | 
			
		||||
void                    clutter_box_layout_set_expand           (ClutterBoxLayout    *layout,
 | 
			
		||||
                                                                 ClutterActor        *actor,
 | 
			
		||||
                                                                 gboolean             expand);
 | 
			
		||||
CLUTTER_DEPRECATED
 | 
			
		||||
gboolean                clutter_box_layout_get_expand           (ClutterBoxLayout    *layout,
 | 
			
		||||
                                                                 ClutterActor        *actor);
 | 
			
		||||
 | 
			
		||||
CLUTTER_DEPRECATED
 | 
			
		||||
void                    clutter_box_layout_set_use_animations   (ClutterBoxLayout    *layout,
 | 
			
		||||
                                                                 gboolean             animate);
 | 
			
		||||
CLUTTER_DEPRECATED
 | 
			
		||||
gboolean                clutter_box_layout_get_use_animations   (ClutterBoxLayout    *layout);
 | 
			
		||||
CLUTTER_DEPRECATED
 | 
			
		||||
void                    clutter_box_layout_set_easing_mode      (ClutterBoxLayout    *layout,
 | 
			
		||||
                                                                 gulong               mode);
 | 
			
		||||
CLUTTER_DEPRECATED
 | 
			
		||||
gulong                  clutter_box_layout_get_easing_mode      (ClutterBoxLayout    *layout);
 | 
			
		||||
CLUTTER_DEPRECATED
 | 
			
		||||
void                    clutter_box_layout_set_easing_duration  (ClutterBoxLayout    *layout,
 | 
			
		||||
                                                                 guint                msecs);
 | 
			
		||||
CLUTTER_DEPRECATED
 | 
			
		||||
guint                   clutter_box_layout_get_easing_duration  (ClutterBoxLayout    *layout);
 | 
			
		||||
 | 
			
		||||
G_END_DECLS
 | 
			
		||||
 | 
			
		||||
#endif /* __CLUTTER_BOX_LAYOUT_H__ */
 | 
			
		||||
 
 | 
			
		||||
@@ -121,12 +121,12 @@ 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
 | 
			
		||||
@@ -497,9 +497,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 +587,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;
 | 
			
		||||
 
 | 
			
		||||
@@ -352,7 +352,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);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -159,8 +159,7 @@ static inline void
 | 
			
		||||
click_action_set_pressed (ClutterClickAction *action,
 | 
			
		||||
                          gboolean            is_pressed)
 | 
			
		||||
{
 | 
			
		||||
  ClutterClickActionPrivate *priv =
 | 
			
		||||
    clutter_click_action_get_instance_private (action);
 | 
			
		||||
  ClutterClickActionPrivate *priv = action->priv;
 | 
			
		||||
 | 
			
		||||
  is_pressed = !!is_pressed;
 | 
			
		||||
 | 
			
		||||
@@ -175,8 +174,7 @@ static inline void
 | 
			
		||||
click_action_set_held (ClutterClickAction *action,
 | 
			
		||||
                       gboolean            is_held)
 | 
			
		||||
{
 | 
			
		||||
  ClutterClickActionPrivate *priv =
 | 
			
		||||
    clutter_click_action_get_instance_private (action);
 | 
			
		||||
  ClutterClickActionPrivate *priv = action->priv;
 | 
			
		||||
 | 
			
		||||
  is_held = !!is_held;
 | 
			
		||||
 | 
			
		||||
@@ -191,8 +189,7 @@ static gboolean
 | 
			
		||||
click_action_emit_long_press (gpointer data)
 | 
			
		||||
{
 | 
			
		||||
  ClutterClickAction *action = data;
 | 
			
		||||
  ClutterClickActionPrivate *priv =
 | 
			
		||||
    clutter_click_action_get_instance_private (action);
 | 
			
		||||
  ClutterClickActionPrivate *priv = action->priv;
 | 
			
		||||
  ClutterActor *actor;
 | 
			
		||||
  gboolean result;
 | 
			
		||||
 | 
			
		||||
@@ -216,8 +213,7 @@ click_action_emit_long_press (gpointer data)
 | 
			
		||||
static inline void
 | 
			
		||||
click_action_query_long_press (ClutterClickAction *action)
 | 
			
		||||
{
 | 
			
		||||
  ClutterClickActionPrivate *priv =
 | 
			
		||||
    clutter_click_action_get_instance_private (action);
 | 
			
		||||
  ClutterClickActionPrivate *priv = action->priv;
 | 
			
		||||
  ClutterActor *actor;
 | 
			
		||||
  gboolean result = FALSE;
 | 
			
		||||
  gint timeout;
 | 
			
		||||
@@ -242,7 +238,6 @@ click_action_query_long_press (ClutterClickAction *action)
 | 
			
		||||
 | 
			
		||||
  if (result)
 | 
			
		||||
    {
 | 
			
		||||
      g_clear_handle_id (&priv->long_press_id, g_source_remove);
 | 
			
		||||
      priv->long_press_id =
 | 
			
		||||
        clutter_threads_add_timeout (timeout,
 | 
			
		||||
                                     click_action_emit_long_press,
 | 
			
		||||
@@ -253,8 +248,7 @@ click_action_query_long_press (ClutterClickAction *action)
 | 
			
		||||
static inline void
 | 
			
		||||
click_action_cancel_long_press (ClutterClickAction *action)
 | 
			
		||||
{
 | 
			
		||||
  ClutterClickActionPrivate *priv =
 | 
			
		||||
    clutter_click_action_get_instance_private (action);
 | 
			
		||||
  ClutterClickActionPrivate *priv = action->priv;
 | 
			
		||||
 | 
			
		||||
  if (priv->long_press_id != 0)
 | 
			
		||||
    {
 | 
			
		||||
@@ -277,8 +271,7 @@ on_event (ClutterActor       *actor,
 | 
			
		||||
          ClutterEvent       *event,
 | 
			
		||||
          ClutterClickAction *action)
 | 
			
		||||
{
 | 
			
		||||
  ClutterClickActionPrivate *priv =
 | 
			
		||||
    clutter_click_action_get_instance_private (action);
 | 
			
		||||
  ClutterClickActionPrivate *priv = action->priv;
 | 
			
		||||
  gboolean has_button = TRUE;
 | 
			
		||||
 | 
			
		||||
  if (!clutter_actor_meta_get_enabled (CLUTTER_ACTOR_META (action)))
 | 
			
		||||
@@ -348,8 +341,7 @@ on_captured_event (ClutterActor       *stage,
 | 
			
		||||
                   ClutterEvent       *event,
 | 
			
		||||
                   ClutterClickAction *action)
 | 
			
		||||
{
 | 
			
		||||
  ClutterClickActionPrivate *priv =
 | 
			
		||||
    clutter_click_action_get_instance_private (action);
 | 
			
		||||
  ClutterClickActionPrivate *priv = action->priv;
 | 
			
		||||
  ClutterActor *actor;
 | 
			
		||||
  ClutterModifierType modifier_state;
 | 
			
		||||
  gboolean has_button = TRUE;
 | 
			
		||||
@@ -441,8 +433,7 @@ clutter_click_action_set_actor (ClutterActorMeta *meta,
 | 
			
		||||
                                ClutterActor     *actor)
 | 
			
		||||
{
 | 
			
		||||
  ClutterClickAction *action = CLUTTER_CLICK_ACTION (meta);
 | 
			
		||||
  ClutterClickActionPrivate *priv =
 | 
			
		||||
    clutter_click_action_get_instance_private (action);
 | 
			
		||||
  ClutterClickActionPrivate *priv = action->priv;
 | 
			
		||||
 | 
			
		||||
  if (priv->event_id != 0)
 | 
			
		||||
    {
 | 
			
		||||
@@ -476,28 +467,13 @@ clutter_click_action_set_actor (ClutterActorMeta *meta,
 | 
			
		||||
  CLUTTER_ACTOR_META_CLASS (clutter_click_action_parent_class)->set_actor (meta, actor);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_click_action_set_enabled (ClutterActorMeta *meta,
 | 
			
		||||
                                  gboolean          is_enabled)
 | 
			
		||||
{
 | 
			
		||||
  ClutterClickAction *click_action = CLUTTER_CLICK_ACTION (meta);
 | 
			
		||||
  ClutterActorMetaClass *parent_class =
 | 
			
		||||
    CLUTTER_ACTOR_META_CLASS (clutter_click_action_parent_class);
 | 
			
		||||
 | 
			
		||||
  if (!is_enabled)
 | 
			
		||||
    clutter_click_action_release (click_action);
 | 
			
		||||
 | 
			
		||||
  parent_class->set_enabled (meta, is_enabled);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_click_action_set_property (GObject      *gobject,
 | 
			
		||||
                                   guint         prop_id,
 | 
			
		||||
                                   const GValue *value,
 | 
			
		||||
                                   GParamSpec   *pspec)
 | 
			
		||||
{
 | 
			
		||||
  ClutterClickActionPrivate *priv =
 | 
			
		||||
    clutter_click_action_get_instance_private (CLUTTER_CLICK_ACTION (gobject));
 | 
			
		||||
  ClutterClickActionPrivate *priv = CLUTTER_CLICK_ACTION (gobject)->priv;
 | 
			
		||||
 | 
			
		||||
  switch (prop_id)
 | 
			
		||||
    {
 | 
			
		||||
@@ -521,8 +497,7 @@ clutter_click_action_get_property (GObject    *gobject,
 | 
			
		||||
                                   GValue     *value,
 | 
			
		||||
                                   GParamSpec *pspec)
 | 
			
		||||
{
 | 
			
		||||
  ClutterClickActionPrivate *priv =
 | 
			
		||||
    clutter_click_action_get_instance_private (CLUTTER_CLICK_ACTION (gobject));
 | 
			
		||||
  ClutterClickActionPrivate *priv = CLUTTER_CLICK_ACTION (gobject)->priv;
 | 
			
		||||
 | 
			
		||||
  switch (prop_id)
 | 
			
		||||
    {
 | 
			
		||||
@@ -551,8 +526,7 @@ clutter_click_action_get_property (GObject    *gobject,
 | 
			
		||||
static void
 | 
			
		||||
clutter_click_action_dispose (GObject *gobject)
 | 
			
		||||
{
 | 
			
		||||
  ClutterClickActionPrivate *priv =
 | 
			
		||||
    clutter_click_action_get_instance_private (CLUTTER_CLICK_ACTION (gobject));
 | 
			
		||||
  ClutterClickActionPrivate *priv = CLUTTER_CLICK_ACTION (gobject)->priv;
 | 
			
		||||
 | 
			
		||||
  g_clear_signal_handler (&priv->event_id,
 | 
			
		||||
                          clutter_actor_meta_get_actor (CLUTTER_ACTOR_META (gobject)));
 | 
			
		||||
@@ -572,7 +546,6 @@ clutter_click_action_class_init (ClutterClickActionClass *klass)
 | 
			
		||||
  ClutterActorMetaClass *meta_class = CLUTTER_ACTOR_META_CLASS (klass);
 | 
			
		||||
 | 
			
		||||
  meta_class->set_actor = clutter_click_action_set_actor;
 | 
			
		||||
  meta_class->set_enabled = clutter_click_action_set_enabled;
 | 
			
		||||
 | 
			
		||||
  gobject_class->dispose = clutter_click_action_dispose;
 | 
			
		||||
  gobject_class->set_property = clutter_click_action_set_property;
 | 
			
		||||
@@ -710,11 +683,9 @@ clutter_click_action_class_init (ClutterClickActionClass *klass)
 | 
			
		||||
static void
 | 
			
		||||
clutter_click_action_init (ClutterClickAction *self)
 | 
			
		||||
{
 | 
			
		||||
  ClutterClickActionPrivate *priv =
 | 
			
		||||
    clutter_click_action_get_instance_private (self);
 | 
			
		||||
 | 
			
		||||
  priv->long_press_threshold = -1;
 | 
			
		||||
  priv->long_press_duration = -1;
 | 
			
		||||
  self->priv = clutter_click_action_get_instance_private (self);
 | 
			
		||||
  self->priv->long_press_threshold = -1;
 | 
			
		||||
  self->priv->long_press_duration = -1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -754,7 +725,7 @@ clutter_click_action_release (ClutterClickAction *action)
 | 
			
		||||
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_CLICK_ACTION (action));
 | 
			
		||||
 | 
			
		||||
  priv = clutter_click_action_get_instance_private (action);
 | 
			
		||||
  priv = action->priv;
 | 
			
		||||
 | 
			
		||||
  if (!priv->is_held)
 | 
			
		||||
    return;
 | 
			
		||||
@@ -780,13 +751,9 @@ clutter_click_action_release (ClutterClickAction *action)
 | 
			
		||||
guint
 | 
			
		||||
clutter_click_action_get_button (ClutterClickAction *action)
 | 
			
		||||
{
 | 
			
		||||
  ClutterClickActionPrivate *priv;
 | 
			
		||||
 | 
			
		||||
  g_return_val_if_fail (CLUTTER_IS_CLICK_ACTION (action), 0);
 | 
			
		||||
 | 
			
		||||
  priv = clutter_click_action_get_instance_private (action);
 | 
			
		||||
 | 
			
		||||
  return priv->press_button;
 | 
			
		||||
  return action->priv->press_button;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -802,13 +769,9 @@ clutter_click_action_get_button (ClutterClickAction *action)
 | 
			
		||||
ClutterModifierType
 | 
			
		||||
clutter_click_action_get_state (ClutterClickAction *action)
 | 
			
		||||
{
 | 
			
		||||
  ClutterClickActionPrivate *priv;
 | 
			
		||||
 | 
			
		||||
  g_return_val_if_fail (CLUTTER_IS_CLICK_ACTION (action), 0);
 | 
			
		||||
 | 
			
		||||
  priv = clutter_click_action_get_instance_private (action);
 | 
			
		||||
 | 
			
		||||
  return priv->modifier_state;
 | 
			
		||||
  return action->priv->modifier_state;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -826,15 +789,11 @@ clutter_click_action_get_coords (ClutterClickAction *action,
 | 
			
		||||
                                 gfloat             *press_x,
 | 
			
		||||
                                 gfloat             *press_y)
 | 
			
		||||
{
 | 
			
		||||
  ClutterClickActionPrivate *priv;
 | 
			
		||||
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_ACTION (action));
 | 
			
		||||
 | 
			
		||||
  priv = clutter_click_action_get_instance_private (action);
 | 
			
		||||
 | 
			
		||||
  if (press_x != NULL)
 | 
			
		||||
    *press_x = priv->press_x;
 | 
			
		||||
    *press_x = action->priv->press_x;
 | 
			
		||||
 | 
			
		||||
  if (press_y != NULL)
 | 
			
		||||
    *press_y = priv->press_y;
 | 
			
		||||
    *press_y = action->priv->press_y;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -37,13 +37,32 @@
 | 
			
		||||
 | 
			
		||||
G_BEGIN_DECLS
 | 
			
		||||
 | 
			
		||||
#define CLUTTER_TYPE_CLICK_ACTION (clutter_click_action_get_type ())
 | 
			
		||||
#define CLUTTER_TYPE_CLICK_ACTION               (clutter_click_action_get_type ())
 | 
			
		||||
#define CLUTTER_CLICK_ACTION(obj)               (G_TYPE_CHECK_INSTANCE_CAST ((obj), CLUTTER_TYPE_CLICK_ACTION, ClutterClickAction))
 | 
			
		||||
#define CLUTTER_IS_CLICK_ACTION(obj)            (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CLUTTER_TYPE_CLICK_ACTION))
 | 
			
		||||
#define CLUTTER_CLICK_ACTION_CLASS(klass)       (G_TYPE_CHECK_CLASS_CAST ((klass), CLUTTER_TYPE_CLICK_ACTION, ClutterClickActionClass))
 | 
			
		||||
#define CLUTTER_IS_CLICK_ACTION_CLASS(klass)    (G_TYPE_CHECK_CLASS_TYPE ((klass), CLUTTER_TYPE_CLICK_ACTION))
 | 
			
		||||
#define CLUTTER_CLICK_ACTION_GET_CLASS(obj)     (G_TYPE_INSTANCE_GET_CLASS ((obj), CLUTTER_TYPE_CLICK_ACTION, ClutterClickActionClass))
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
G_DECLARE_DERIVABLE_TYPE (ClutterClickAction, clutter_click_action,
 | 
			
		||||
                          CLUTTER, CLICK_ACTION, ClutterAction);
 | 
			
		||||
typedef struct _ClutterClickAction              ClutterClickAction;
 | 
			
		||||
typedef struct _ClutterClickActionPrivate       ClutterClickActionPrivate;
 | 
			
		||||
typedef struct _ClutterClickActionClass         ClutterClickActionClass;
 | 
			
		||||
 | 
			
		||||
typedef struct _ClutterClickActionPrivate ClutterClickActionPrivate;
 | 
			
		||||
/**
 | 
			
		||||
 * ClutterClickAction:
 | 
			
		||||
 *
 | 
			
		||||
 * The #ClutterClickAction structure contains
 | 
			
		||||
 * only private data and should be accessed using the provided API
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 1.4
 | 
			
		||||
 */
 | 
			
		||||
struct _ClutterClickAction
 | 
			
		||||
{
 | 
			
		||||
  /*< private >*/
 | 
			
		||||
  ClutterAction parent_instance;
 | 
			
		||||
 | 
			
		||||
  ClutterClickActionPrivate *priv;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ClutterClickActionClass:
 | 
			
		||||
@@ -78,6 +97,9 @@ struct _ClutterClickActionClass
 | 
			
		||||
  void (* _clutter_click_action7) (void);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
GType clutter_click_action_get_type (void) G_GNUC_CONST;
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
ClutterAction *        clutter_click_action_new        (void);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -240,14 +240,15 @@ clutter_clone_has_overlaps (ClutterActor *actor)
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_clone_allocate (ClutterActor           *self,
 | 
			
		||||
                        const ClutterActorBox  *box)
 | 
			
		||||
                        const ClutterActorBox  *box,
 | 
			
		||||
                        ClutterAllocationFlags  flags)
 | 
			
		||||
{
 | 
			
		||||
  ClutterClonePrivate *priv = CLUTTER_CLONE (self)->priv;
 | 
			
		||||
  ClutterActorClass *parent_class;
 | 
			
		||||
 | 
			
		||||
  /* chain up */
 | 
			
		||||
  parent_class = CLUTTER_ACTOR_CLASS (clutter_clone_parent_class);
 | 
			
		||||
  parent_class->allocate (self, box);
 | 
			
		||||
  parent_class->allocate (self, box, flags);
 | 
			
		||||
 | 
			
		||||
  if (priv->clone_source == NULL)
 | 
			
		||||
    return;
 | 
			
		||||
@@ -257,7 +258,7 @@ clutter_clone_allocate (ClutterActor           *self,
 | 
			
		||||
   */
 | 
			
		||||
  if (clutter_actor_get_parent (priv->clone_source) != NULL &&
 | 
			
		||||
      !clutter_actor_has_allocation (priv->clone_source))
 | 
			
		||||
    clutter_actor_allocate_preferred_size (priv->clone_source);
 | 
			
		||||
    clutter_actor_allocate_preferred_size (priv->clone_source, flags);
 | 
			
		||||
 | 
			
		||||
#if 0
 | 
			
		||||
  /* XXX - this is wrong: ClutterClone cannot clone unparented
 | 
			
		||||
@@ -272,7 +273,7 @@ clutter_clone_allocate (ClutterActor           *self,
 | 
			
		||||
   * paint cycle, we can safely give it as much size as it requires
 | 
			
		||||
   */
 | 
			
		||||
  if (clutter_actor_get_parent (priv->clone_source) == NULL)
 | 
			
		||||
    clutter_actor_allocate_preferred_size (priv->clone_source);
 | 
			
		||||
    clutter_actor_allocate_preferred_size (priv->clone_source, flags);
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -9,13 +9,7 @@
 | 
			
		||||
 | 
			
		||||
G_BEGIN_DECLS
 | 
			
		||||
 | 
			
		||||
#mesondefine CLUTTER_HAS_WAYLAND_COMPOSITOR_SUPPORT
 | 
			
		||||
#mesondefine CLUTTER_WINDOWING_X11
 | 
			
		||||
#mesondefine CLUTTER_INPUT_X11
 | 
			
		||||
#mesondefine CLUTTER_WINDOWING_GLX
 | 
			
		||||
#mesondefine CLUTTER_WINDOWING_EGL
 | 
			
		||||
#mesondefine CLUTTER_INPUT_EVDEV
 | 
			
		||||
#mesondefine CLUTTER_INPUT_NULL
 | 
			
		||||
@CLUTTER_CONFIG_DEFINES@
 | 
			
		||||
 | 
			
		||||
G_END_DECLS
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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__ */
 | 
			
		||||
 
 | 
			
		||||
@@ -160,26 +160,28 @@ constraint_update_preferred_size (ClutterConstraint  *constraint,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_constraint_set_enabled (ClutterActorMeta *meta,
 | 
			
		||||
                                gboolean          is_enabled)
 | 
			
		||||
clutter_constraint_notify (GObject    *gobject,
 | 
			
		||||
                           GParamSpec *pspec)
 | 
			
		||||
{
 | 
			
		||||
  ClutterActorMetaClass *parent_class =
 | 
			
		||||
    CLUTTER_ACTOR_META_CLASS (clutter_constraint_parent_class);
 | 
			
		||||
  ClutterActor *actor;
 | 
			
		||||
  if (strcmp (pspec->name, "enabled") == 0)
 | 
			
		||||
    {
 | 
			
		||||
      ClutterActorMeta *meta = CLUTTER_ACTOR_META (gobject);
 | 
			
		||||
      ClutterActor *actor = clutter_actor_meta_get_actor (meta);
 | 
			
		||||
 | 
			
		||||
  actor = clutter_actor_meta_get_actor (meta);
 | 
			
		||||
  if (actor)
 | 
			
		||||
    clutter_actor_queue_relayout (actor);
 | 
			
		||||
      if (actor != NULL)
 | 
			
		||||
        clutter_actor_queue_relayout (actor);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  parent_class->set_enabled (meta, is_enabled);
 | 
			
		||||
  if (G_OBJECT_CLASS (clutter_constraint_parent_class)->notify != NULL)
 | 
			
		||||
    G_OBJECT_CLASS (clutter_constraint_parent_class)->notify (gobject, pspec);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_constraint_class_init (ClutterConstraintClass *klass)
 | 
			
		||||
{
 | 
			
		||||
  ClutterActorMetaClass *actor_meta_class = CLUTTER_ACTOR_META_CLASS (klass);
 | 
			
		||||
  GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
 | 
			
		||||
 | 
			
		||||
  actor_meta_class->set_enabled = clutter_constraint_set_enabled;
 | 
			
		||||
  gobject_class->notify = clutter_constraint_notify;
 | 
			
		||||
 | 
			
		||||
  klass->update_allocation = constraint_update_allocation;
 | 
			
		||||
  klass->update_preferred_size = constraint_update_preferred_size;
 | 
			
		||||
@@ -220,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,
 | 
			
		||||
 
 | 
			
		||||
@@ -1,36 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Clutter.
 | 
			
		||||
 *
 | 
			
		||||
 * An OpenGL based 'interactive canvas' library.
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright 2020 Red Hat, Inc.
 | 
			
		||||
 *
 | 
			
		||||
 * This library is free software; you can redistribute it and/or
 | 
			
		||||
 * modify it under the terms of the GNU Lesser General Public
 | 
			
		||||
 * License as published by the Free Software Foundation; either
 | 
			
		||||
 * version 2 of the License, or (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This library is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | 
			
		||||
 * Lesser General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Lesser General Public
 | 
			
		||||
 * License along with this library. If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef __CLUTTER_CONTAINER_PRIVATE_H__
 | 
			
		||||
#define __CLUTTER_CONTAINER_PRIVATE_H__
 | 
			
		||||
 | 
			
		||||
#include <clutter/clutter-container.h>
 | 
			
		||||
 | 
			
		||||
G_BEGIN_DECLS
 | 
			
		||||
 | 
			
		||||
void _clutter_container_emit_actor_added   (ClutterContainer *container,
 | 
			
		||||
                                            ClutterActor     *actor);
 | 
			
		||||
void _clutter_container_emit_actor_removed (ClutterContainer *container,
 | 
			
		||||
                                            ClutterActor     *actor);
 | 
			
		||||
 | 
			
		||||
G_END_DECLS
 | 
			
		||||
 | 
			
		||||
#endif /* __CLUTTER_CONTAINER_PRIVATE_H__ */
 | 
			
		||||
@@ -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"
 | 
			
		||||
@@ -1251,23 +1250,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);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,92 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) 2007,2008,2009,2010,2011  Intel Corporation.
 | 
			
		||||
 * Copyright (C) 2020 Red Hat Inc
 | 
			
		||||
 *
 | 
			
		||||
 * This library is free software; you can redistribute it and/or
 | 
			
		||||
 * modify it under the terms of the GNU Lesser General Public
 | 
			
		||||
 * License as published by the Free Software Foundation; either
 | 
			
		||||
 * version 2 of the License, or (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This library is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | 
			
		||||
 * Lesser General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Lesser General Public
 | 
			
		||||
 * License along with this library. If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "clutter-build-config.h"
 | 
			
		||||
 | 
			
		||||
#include "clutter-damage-history.h"
 | 
			
		||||
 | 
			
		||||
#define DAMAGE_HISTORY_LENGTH 0x10
 | 
			
		||||
 | 
			
		||||
struct _ClutterDamageHistory
 | 
			
		||||
{
 | 
			
		||||
  cairo_region_t *damages[DAMAGE_HISTORY_LENGTH];
 | 
			
		||||
  int index;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
ClutterDamageHistory *
 | 
			
		||||
clutter_damage_history_new (void)
 | 
			
		||||
{
 | 
			
		||||
  ClutterDamageHistory *history;
 | 
			
		||||
 | 
			
		||||
  history = g_new0 (ClutterDamageHistory, 1);
 | 
			
		||||
 | 
			
		||||
  return history;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
clutter_damage_history_free (ClutterDamageHistory *history)
 | 
			
		||||
{
 | 
			
		||||
  int i;
 | 
			
		||||
 | 
			
		||||
  for (i = 0; i < G_N_ELEMENTS (history->damages); i++)
 | 
			
		||||
    g_clear_pointer (&history->damages[i], cairo_region_destroy);
 | 
			
		||||
 | 
			
		||||
  g_free (history);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
gboolean
 | 
			
		||||
clutter_damage_history_is_age_valid (ClutterDamageHistory *history,
 | 
			
		||||
                                     int                   age)
 | 
			
		||||
{
 | 
			
		||||
  if (age >= DAMAGE_HISTORY_LENGTH ||
 | 
			
		||||
      age < 1)
 | 
			
		||||
    return FALSE;
 | 
			
		||||
 | 
			
		||||
  if (!clutter_damage_history_lookup (history, age))
 | 
			
		||||
    return FALSE;
 | 
			
		||||
 | 
			
		||||
  return TRUE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
clutter_damage_history_record (ClutterDamageHistory *history,
 | 
			
		||||
                               const cairo_region_t *damage)
 | 
			
		||||
{
 | 
			
		||||
  g_clear_pointer (&history->damages[history->index], cairo_region_destroy);
 | 
			
		||||
  history->damages[history->index] = cairo_region_copy (damage);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline int
 | 
			
		||||
step_damage_index (int current,
 | 
			
		||||
                   int diff)
 | 
			
		||||
{
 | 
			
		||||
  return (current + diff) & (DAMAGE_HISTORY_LENGTH - 1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
clutter_damage_history_step (ClutterDamageHistory *history)
 | 
			
		||||
{
 | 
			
		||||
  history->index = step_damage_index (history->index, 1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const cairo_region_t *
 | 
			
		||||
clutter_damage_history_lookup (ClutterDamageHistory *history,
 | 
			
		||||
                               int                   age)
 | 
			
		||||
{
 | 
			
		||||
  return history->damages[step_damage_index (history->index, -age)];
 | 
			
		||||
}
 | 
			
		||||
@@ -1,42 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) 2007,2008,2009,2010,2011  Intel Corporation.
 | 
			
		||||
 * Copyright (C) 2020 Red Hat Inc
 | 
			
		||||
 *
 | 
			
		||||
 * This library is free software; you can redistribute it and/or
 | 
			
		||||
 * modify it under the terms of the GNU Lesser General Public
 | 
			
		||||
 * License as published by the Free Software Foundation; either
 | 
			
		||||
 * version 2 of the License, or (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This library is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | 
			
		||||
 * Lesser General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Lesser General Public
 | 
			
		||||
 * License along with this library. If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef CLUTTER_DAMAGE_HISTORY_H
 | 
			
		||||
#define CLUTTER_DAMAGE_HISTORY_H
 | 
			
		||||
 | 
			
		||||
#include <cairo.h>
 | 
			
		||||
#include <glib.h>
 | 
			
		||||
 | 
			
		||||
typedef struct _ClutterDamageHistory ClutterDamageHistory;
 | 
			
		||||
 | 
			
		||||
ClutterDamageHistory * clutter_damage_history_new (void);
 | 
			
		||||
 | 
			
		||||
void clutter_damage_history_free (ClutterDamageHistory *history);
 | 
			
		||||
 | 
			
		||||
gboolean clutter_damage_history_is_age_valid (ClutterDamageHistory *history,
 | 
			
		||||
                                              int                   age);
 | 
			
		||||
 | 
			
		||||
void clutter_damage_history_record (ClutterDamageHistory *history,
 | 
			
		||||
                                    const cairo_region_t *damage);
 | 
			
		||||
 | 
			
		||||
void clutter_damage_history_step (ClutterDamageHistory *history);
 | 
			
		||||
 | 
			
		||||
const cairo_region_t * clutter_damage_history_lookup (ClutterDamageHistory *history,
 | 
			
		||||
                                                      int                   age);
 | 
			
		||||
 | 
			
		||||
#endif /* CLUTTER_DAMAGE_HISTORY_H */
 | 
			
		||||
@@ -128,9 +128,10 @@ clutter_deform_effect_deform_vertex (ClutterDeformEffect *effect,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
vbo_invalidate (ClutterActor        *actor,
 | 
			
		||||
                GParamSpec          *pspec,
 | 
			
		||||
                ClutterDeformEffect *effect)
 | 
			
		||||
vbo_invalidate (ClutterActor           *actor,
 | 
			
		||||
                const ClutterActorBox  *allocation,
 | 
			
		||||
                ClutterAllocationFlags  flags,
 | 
			
		||||
                ClutterDeformEffect    *effect)
 | 
			
		||||
{
 | 
			
		||||
  effect->priv->is_dirty = TRUE;
 | 
			
		||||
}
 | 
			
		||||
@@ -155,7 +156,7 @@ clutter_deform_effect_set_actor (ClutterActorMeta *meta,
 | 
			
		||||
   * changes
 | 
			
		||||
   */
 | 
			
		||||
  if (actor != NULL)
 | 
			
		||||
    priv->allocation_id = g_signal_connect (actor, "notify::allocation",
 | 
			
		||||
    priv->allocation_id = g_signal_connect (actor, "allocation-changed",
 | 
			
		||||
                                            G_CALLBACK (vbo_invalidate),
 | 
			
		||||
                                            meta);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -4,11 +4,14 @@
 | 
			
		||||
#define __CLUTTER_DEPRECATED_H_INSIDE__
 | 
			
		||||
 | 
			
		||||
#include "deprecated/clutter-actor.h"
 | 
			
		||||
#include "deprecated/clutter-alpha.h"
 | 
			
		||||
#include "deprecated/clutter-animation.h"
 | 
			
		||||
#include "deprecated/clutter-box.h"
 | 
			
		||||
#include "deprecated/clutter-container.h"
 | 
			
		||||
#include "deprecated/clutter-group.h"
 | 
			
		||||
#include "deprecated/clutter-rectangle.h"
 | 
			
		||||
#include "deprecated/clutter-stage.h"
 | 
			
		||||
#include "deprecated/clutter-state.h"
 | 
			
		||||
#include "deprecated/clutter-timeline.h"
 | 
			
		||||
 | 
			
		||||
#undef __CLUTTER_DEPRECATED_H_INSIDE__
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										306
									
								
								clutter/clutter/clutter-device-manager-private.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										306
									
								
								clutter/clutter/clutter-device-manager-private.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,306 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 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;
 | 
			
		||||
 | 
			
		||||
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;
 | 
			
		||||
 | 
			
		||||
  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;
 | 
			
		||||
 | 
			
		||||
  /* Accessiblity */
 | 
			
		||||
  ClutterVirtualInputDevice *accessibility_virtual_device;
 | 
			
		||||
  ClutterPtrA11yData *ptr_a11y_data;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
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);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* device manager */
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void            _clutter_device_manager_add_device              (ClutterDeviceManager *device_manager,
 | 
			
		||||
                                                                 ClutterInputDevice   *device);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void            _clutter_device_manager_remove_device           (ClutterDeviceManager *device_manager,
 | 
			
		||||
                                                                 ClutterInputDevice   *device);
 | 
			
		||||
void            _clutter_device_manager_update_devices          (ClutterDeviceManager *device_manager);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
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);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void            clutter_device_manager_ensure_a11y_state        (ClutterDeviceManager *device_manager);
 | 
			
		||||
 | 
			
		||||
/* input device */
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
gboolean        _clutter_input_device_has_sequence              (ClutterInputDevice   *device,
 | 
			
		||||
                                                                 ClutterEventSequence *sequence);
 | 
			
		||||
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_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_);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void            _clutter_input_device_set_stage                 (ClutterInputDevice   *device,
 | 
			
		||||
                                                                 ClutterStage         *stage);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
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);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void            _clutter_input_device_set_n_keys                (ClutterInputDevice   *device,
 | 
			
		||||
                                                                 guint                 n_keys);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
guint           _clutter_input_device_add_axis                  (ClutterInputDevice   *device,
 | 
			
		||||
                                                                 ClutterInputAxis      axis,
 | 
			
		||||
                                                                 gdouble               min_value,
 | 
			
		||||
                                                                 gdouble               max_value,
 | 
			
		||||
                                                                 gdouble               resolution);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void            _clutter_input_device_reset_axes                (ClutterInputDevice   *device);
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
gboolean        _clutter_input_device_translate_axis            (ClutterInputDevice   *device,
 | 
			
		||||
                                                                 guint                 index_,
 | 
			
		||||
                                                                 gdouble               value,
 | 
			
		||||
                                                                 gdouble              *axis_value);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void            _clutter_input_device_add_scroll_info           (ClutterInputDevice   *device,
 | 
			
		||||
                                                                 guint                 index_,
 | 
			
		||||
                                                                 ClutterScrollDirection direction,
 | 
			
		||||
                                                                 gdouble               increment);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void            _clutter_input_device_reset_scroll_info         (ClutterInputDevice   *device);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
gboolean        _clutter_input_device_get_scroll_delta          (ClutterInputDevice   *device,
 | 
			
		||||
                                                                 guint                 index_,
 | 
			
		||||
                                                                 gdouble               value,
 | 
			
		||||
                                                                 ClutterScrollDirection *direction_p,
 | 
			
		||||
                                                                 gdouble                *delta_p);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
ClutterInputDeviceTool * clutter_input_device_lookup_tool       (ClutterInputDevice         *device,
 | 
			
		||||
                                                                 guint64                     serial,
 | 
			
		||||
                                                                 ClutterInputDeviceToolType  type);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void            clutter_input_device_add_tool                   (ClutterInputDevice     *device,
 | 
			
		||||
                                                                 ClutterInputDeviceTool *tool);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void            clutter_input_device_update_from_tool           (ClutterInputDevice     *device,
 | 
			
		||||
                                                                 ClutterInputDeviceTool *tool);
 | 
			
		||||
 | 
			
		||||
G_END_DECLS
 | 
			
		||||
 | 
			
		||||
#endif /* __CLUTTER_DEVICE_MANAGER_PRIVATE_H__ */
 | 
			
		||||
							
								
								
									
										753
									
								
								clutter/clutter/clutter-device-manager.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										753
									
								
								clutter/clutter/clutter-device-manager.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,753 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 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"
 | 
			
		||||
#include "clutter-input-pointer-a11y-private.h"
 | 
			
		||||
 | 
			
		||||
struct _ClutterDeviceManagerPrivate
 | 
			
		||||
{
 | 
			
		||||
  /* back-pointer to the backend */
 | 
			
		||||
  ClutterBackend *backend;
 | 
			
		||||
 | 
			
		||||
  /* Keyboard a11y */
 | 
			
		||||
  ClutterKbdA11ySettings kbd_a11y_settings;
 | 
			
		||||
  /* Pointer a11y */
 | 
			
		||||
  ClutterPointerA11ySettings pointer_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,
 | 
			
		||||
  PTR_A11Y_DWELL_CLICK_TYPE_CHANGED,
 | 
			
		||||
  PTR_A11Y_TIMEOUT_STARTED,
 | 
			
		||||
  PTR_A11Y_TIMEOUT_STOPPED,
 | 
			
		||||
 | 
			
		||||
  LAST_SIGNAL
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static guint manager_signals[LAST_SIGNAL] = { 0, };
 | 
			
		||||
 | 
			
		||||
G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (ClutterDeviceManager,
 | 
			
		||||
                                     clutter_device_manager,
 | 
			
		||||
                                     G_TYPE_OBJECT)
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_device_manager_set_property (GObject      *gobject,
 | 
			
		||||
                                     guint         prop_id,
 | 
			
		||||
                                     const GValue *value,
 | 
			
		||||
                                     GParamSpec   *pspec)
 | 
			
		||||
{
 | 
			
		||||
  ClutterDeviceManager *self = CLUTTER_DEVICE_MANAGER (gobject);
 | 
			
		||||
  ClutterDeviceManagerPrivate *priv = clutter_device_manager_get_instance_private (self);
 | 
			
		||||
 | 
			
		||||
  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)
 | 
			
		||||
{
 | 
			
		||||
  ClutterDeviceManager *self = CLUTTER_DEVICE_MANAGER (gobject);
 | 
			
		||||
  ClutterDeviceManagerPrivate *priv = clutter_device_manager_get_instance_private (self);
 | 
			
		||||
 | 
			
		||||
  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, NULL,
 | 
			
		||||
                  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, NULL,
 | 
			
		||||
                  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);
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * ClutterDeviceManager::ptr-a11y-dwell-click-type-changed:
 | 
			
		||||
   * @manager: the #ClutterDeviceManager that emitted the signal
 | 
			
		||||
   * @click_type: the new #ClutterPointerA11yDwellClickType mode
 | 
			
		||||
   *
 | 
			
		||||
   * The ::ptr-a11y-dwell-click-type-changed signal is emitted each time
 | 
			
		||||
   * the ClutterPointerA11yDwellClickType mode is changed as the result
 | 
			
		||||
   * of pointer accessibility operations.
 | 
			
		||||
   */
 | 
			
		||||
  manager_signals[PTR_A11Y_DWELL_CLICK_TYPE_CHANGED] =
 | 
			
		||||
    g_signal_new (I_("ptr-a11y-dwell-click-type-changed"),
 | 
			
		||||
                  G_TYPE_FROM_CLASS (klass),
 | 
			
		||||
                  G_SIGNAL_RUN_LAST,
 | 
			
		||||
                  0, NULL, NULL,
 | 
			
		||||
                  g_cclosure_marshal_VOID__FLAGS,
 | 
			
		||||
                  G_TYPE_NONE, 1,
 | 
			
		||||
                  CLUTTER_TYPE_POINTER_A11Y_DWELL_CLICK_TYPE);
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * ClutterDeviceManager::ptr-a11y-timeout-started:
 | 
			
		||||
   * @manager: the #ClutterDeviceManager that emitted the signal
 | 
			
		||||
   * @device: the core pointer #ClutterInputDevice
 | 
			
		||||
   * @timeout_type: the type of timeout #ClutterPointerA11yTimeoutType
 | 
			
		||||
   * @delay: the delay in ms before secondary-click is triggered.
 | 
			
		||||
   *
 | 
			
		||||
   * The ::ptr-a11y-timeout-started signal is emitted when a
 | 
			
		||||
   * pointer accessibility timeout delay is started, so that upper
 | 
			
		||||
   * layers can notify the user with some visual feedback.
 | 
			
		||||
   */
 | 
			
		||||
  manager_signals[PTR_A11Y_TIMEOUT_STARTED] =
 | 
			
		||||
    g_signal_new (I_("ptr-a11y-timeout-started"),
 | 
			
		||||
                  G_TYPE_FROM_CLASS (klass),
 | 
			
		||||
                  G_SIGNAL_RUN_LAST,
 | 
			
		||||
                  0, NULL, NULL,
 | 
			
		||||
                  _clutter_marshal_VOID__OBJECT_FLAGS_UINT,
 | 
			
		||||
                  G_TYPE_NONE, 3,
 | 
			
		||||
                  CLUTTER_TYPE_INPUT_DEVICE,
 | 
			
		||||
                  CLUTTER_TYPE_POINTER_A11Y_TIMEOUT_TYPE,
 | 
			
		||||
                  G_TYPE_UINT);
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * ClutterDeviceManager::ptr-a11y-timeout-stopped:
 | 
			
		||||
   * @manager: the #ClutterDeviceManager that emitted the signal
 | 
			
		||||
   * @device: the core pointer #ClutterInputDevice
 | 
			
		||||
   * @timeout_type: the type of timeout #ClutterPointerA11yTimeoutType
 | 
			
		||||
   * @clicked: %TRUE if the timeout finished and triggered a click
 | 
			
		||||
   *
 | 
			
		||||
   * The ::ptr-a11y-timeout-stopped signal is emitted when a running
 | 
			
		||||
   * pointer accessibility timeout delay is stopped, either because
 | 
			
		||||
   * it's triggered at the end of the delay or cancelled, so that
 | 
			
		||||
   * upper layers can notify the user with some visual feedback.
 | 
			
		||||
   */
 | 
			
		||||
  manager_signals[PTR_A11Y_TIMEOUT_STOPPED] =
 | 
			
		||||
    g_signal_new (I_("ptr-a11y-timeout-stopped"),
 | 
			
		||||
                  G_TYPE_FROM_CLASS (klass),
 | 
			
		||||
                  G_SIGNAL_RUN_LAST,
 | 
			
		||||
                  0, NULL, NULL,
 | 
			
		||||
                  _clutter_marshal_VOID__OBJECT_FLAGS_BOOLEAN,
 | 
			
		||||
                  G_TYPE_NONE, 3,
 | 
			
		||||
                  CLUTTER_TYPE_INPUT_DEVICE,
 | 
			
		||||
                  CLUTTER_TYPE_POINTER_A11Y_TIMEOUT_TYPE,
 | 
			
		||||
                  G_TYPE_BOOLEAN);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_device_manager_init (ClutterDeviceManager *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 CLUTTER_BACKEND_GET_CLASS (backend)->get_device_manager (backend);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 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)
 | 
			
		||||
{
 | 
			
		||||
  ClutterDeviceManagerPrivate *priv = clutter_device_manager_get_instance_private (manager);
 | 
			
		||||
 | 
			
		||||
  g_return_val_if_fail (CLUTTER_IS_DEVICE_MANAGER (manager), NULL);
 | 
			
		||||
 | 
			
		||||
  return 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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
clutter_device_manager_ensure_a11y_state (ClutterDeviceManager *device_manager)
 | 
			
		||||
{
 | 
			
		||||
  ClutterInputDevice *core_pointer;
 | 
			
		||||
 | 
			
		||||
  core_pointer = clutter_device_manager_get_core_device (device_manager,
 | 
			
		||||
                                                         CLUTTER_POINTER_DEVICE);
 | 
			
		||||
  if (core_pointer)
 | 
			
		||||
    {
 | 
			
		||||
      if (_clutter_is_input_pointer_a11y_enabled (core_pointer))
 | 
			
		||||
        _clutter_input_pointer_a11y_add_device (core_pointer);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
are_kbd_a11y_settings_equal (ClutterKbdA11ySettings *a,
 | 
			
		||||
                             ClutterKbdA11ySettings *b)
 | 
			
		||||
{
 | 
			
		||||
  return (memcmp (a, b, sizeof (ClutterKbdA11ySettings)) == 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
clutter_device_manager_set_kbd_a11y_settings (ClutterDeviceManager   *device_manager,
 | 
			
		||||
                                              ClutterKbdA11ySettings *settings)
 | 
			
		||||
{
 | 
			
		||||
  ClutterDeviceManagerClass *manager_class;
 | 
			
		||||
  ClutterDeviceManagerPrivate *priv = clutter_device_manager_get_instance_private (device_manager);
 | 
			
		||||
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_DEVICE_MANAGER (device_manager));
 | 
			
		||||
 | 
			
		||||
  if (are_kbd_a11y_settings_equal (&priv->kbd_a11y_settings, settings))
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  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)
 | 
			
		||||
{
 | 
			
		||||
  ClutterDeviceManagerPrivate *priv = clutter_device_manager_get_instance_private (device_manager);
 | 
			
		||||
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_DEVICE_MANAGER (device_manager));
 | 
			
		||||
 | 
			
		||||
  *settings = priv->kbd_a11y_settings;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
are_pointer_a11y_settings_equal (ClutterPointerA11ySettings *a,
 | 
			
		||||
                                 ClutterPointerA11ySettings *b)
 | 
			
		||||
{
 | 
			
		||||
  return (memcmp (a, b, sizeof (ClutterPointerA11ySettings)) == 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_device_manager_enable_pointer_a11y (ClutterDeviceManager *device_manager)
 | 
			
		||||
{
 | 
			
		||||
  ClutterInputDevice *core_pointer;
 | 
			
		||||
 | 
			
		||||
  core_pointer = clutter_device_manager_get_core_device (device_manager,
 | 
			
		||||
                                                         CLUTTER_POINTER_DEVICE);
 | 
			
		||||
 | 
			
		||||
  _clutter_input_pointer_a11y_add_device (core_pointer);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_device_manager_disable_pointer_a11y (ClutterDeviceManager *device_manager)
 | 
			
		||||
{
 | 
			
		||||
  ClutterInputDevice *core_pointer;
 | 
			
		||||
 | 
			
		||||
  core_pointer = clutter_device_manager_get_core_device (device_manager,
 | 
			
		||||
                                                         CLUTTER_POINTER_DEVICE);
 | 
			
		||||
 | 
			
		||||
  _clutter_input_pointer_a11y_remove_device (core_pointer);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_device_manager_set_pointer_a11y_settings:
 | 
			
		||||
 * @device_manager: a #ClutterDeviceManager
 | 
			
		||||
 * @settings: a pointer to a #ClutterPointerA11ySettings
 | 
			
		||||
 *
 | 
			
		||||
 * Sets the pointer accessibility settings
 | 
			
		||||
 **/
 | 
			
		||||
void
 | 
			
		||||
clutter_device_manager_set_pointer_a11y_settings (ClutterDeviceManager       *device_manager,
 | 
			
		||||
                                                  ClutterPointerA11ySettings *settings)
 | 
			
		||||
{
 | 
			
		||||
  ClutterDeviceManagerPrivate *priv =
 | 
			
		||||
    clutter_device_manager_get_instance_private (device_manager);
 | 
			
		||||
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_DEVICE_MANAGER (device_manager));
 | 
			
		||||
 | 
			
		||||
  if (are_pointer_a11y_settings_equal (&priv->pointer_a11y_settings, settings))
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  if (priv->pointer_a11y_settings.controls == 0 && settings->controls != 0)
 | 
			
		||||
    clutter_device_manager_enable_pointer_a11y (device_manager);
 | 
			
		||||
  else if (priv->pointer_a11y_settings.controls != 0 && settings->controls == 0)
 | 
			
		||||
    clutter_device_manager_disable_pointer_a11y (device_manager);
 | 
			
		||||
 | 
			
		||||
  priv->pointer_a11y_settings = *settings;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_device_manager_get_pointer_a11y_settings:
 | 
			
		||||
 * @device_manager: a #ClutterDeviceManager
 | 
			
		||||
 * @settings: a pointer to a #ClutterPointerA11ySettings
 | 
			
		||||
 *
 | 
			
		||||
 * Gets the current pointer accessibility settings
 | 
			
		||||
 **/
 | 
			
		||||
void
 | 
			
		||||
clutter_device_manager_get_pointer_a11y_settings (ClutterDeviceManager       *device_manager,
 | 
			
		||||
                                                  ClutterPointerA11ySettings *settings)
 | 
			
		||||
{
 | 
			
		||||
  ClutterDeviceManagerPrivate *priv =
 | 
			
		||||
    clutter_device_manager_get_instance_private (device_manager);
 | 
			
		||||
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_DEVICE_MANAGER (device_manager));
 | 
			
		||||
 | 
			
		||||
  *settings = priv->pointer_a11y_settings;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_device_manager_set_pointer_a11y_dwell_click_type:
 | 
			
		||||
 * @device_manager: a #ClutterDeviceManager
 | 
			
		||||
 * @click_type: type of click as #ClutterPointerA11yDwellClickType
 | 
			
		||||
 *
 | 
			
		||||
 * Sets the dwell click type
 | 
			
		||||
 **/
 | 
			
		||||
void
 | 
			
		||||
clutter_device_manager_set_pointer_a11y_dwell_click_type (ClutterDeviceManager             *device_manager,
 | 
			
		||||
                                                          ClutterPointerA11yDwellClickType  click_type)
 | 
			
		||||
{
 | 
			
		||||
  ClutterDeviceManagerPrivate *priv =
 | 
			
		||||
    clutter_device_manager_get_instance_private (device_manager);
 | 
			
		||||
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_DEVICE_MANAGER (device_manager));
 | 
			
		||||
 | 
			
		||||
  priv->pointer_a11y_settings.dwell_click_type = click_type;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										181
									
								
								clutter/clutter/clutter-device-manager.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										181
									
								
								clutter/clutter/clutter-device-manager.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,181 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 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 ())
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
G_DECLARE_DERIVABLE_TYPE (ClutterDeviceManager, clutter_device_manager,
 | 
			
		||||
                          CLUTTER, DEVICE_MANAGER, GObject)
 | 
			
		||||
 | 
			
		||||
typedef struct _ClutterDeviceManagerPrivate     ClutterDeviceManagerPrivate;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 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;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ClutterPointerA11ySettings:
 | 
			
		||||
 *
 | 
			
		||||
 * The #ClutterPointerA11ySettings structure contains pointer accessibility
 | 
			
		||||
 * settings
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
typedef struct _ClutterPointerA11ySettings
 | 
			
		||||
{
 | 
			
		||||
  ClutterPointerA11yFlags controls;
 | 
			
		||||
  ClutterPointerA11yDwellClickType dwell_click_type;
 | 
			
		||||
  ClutterPointerA11yDwellMode dwell_mode;
 | 
			
		||||
  ClutterPointerA11yDwellDirection dwell_gesture_single;
 | 
			
		||||
  ClutterPointerA11yDwellDirection dwell_gesture_double;
 | 
			
		||||
  ClutterPointerA11yDwellDirection dwell_gesture_drag;
 | 
			
		||||
  ClutterPointerA11yDwellDirection dwell_gesture_secondary;
 | 
			
		||||
  gint secondary_click_delay;
 | 
			
		||||
  gint dwell_delay;
 | 
			
		||||
  gint dwell_threshold;
 | 
			
		||||
} ClutterPointerA11ySettings;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 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);
 | 
			
		||||
 | 
			
		||||
  /* Event platform data */
 | 
			
		||||
  void (* copy_event_data) (ClutterDeviceManager *device_manager,
 | 
			
		||||
                            const ClutterEvent   *src,
 | 
			
		||||
                            ClutterEvent         *dest);
 | 
			
		||||
  void (* free_event_data) (ClutterDeviceManager *device_manager,
 | 
			
		||||
                            ClutterEvent         *event);
 | 
			
		||||
 | 
			
		||||
  /* padding */
 | 
			
		||||
  gpointer _padding[4];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
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);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void clutter_device_manager_set_pointer_a11y_settings (ClutterDeviceManager       *device_manager,
 | 
			
		||||
                                                       ClutterPointerA11ySettings *settings);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void clutter_device_manager_get_pointer_a11y_settings (ClutterDeviceManager       *device_manager,
 | 
			
		||||
                                                       ClutterPointerA11ySettings *settings);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void clutter_device_manager_set_pointer_a11y_dwell_click_type (ClutterDeviceManager             *device_manager,
 | 
			
		||||
                                                               ClutterPointerA11yDwellClickType  click_type);
 | 
			
		||||
 | 
			
		||||
G_END_DECLS
 | 
			
		||||
 | 
			
		||||
#endif /* __CLUTTER_DEVICE_MANAGER_H__ */
 | 
			
		||||
							
								
								
									
										1316
									
								
								clutter/clutter/clutter-drag-action.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1316
									
								
								clutter/clutter/clutter-drag-action.c
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										152
									
								
								clutter/clutter/clutter-drag-action.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										152
									
								
								clutter/clutter/clutter-drag-action.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,152 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Clutter.
 | 
			
		||||
 *
 | 
			
		||||
 * An OpenGL based 'interactive canvas' library.
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 2010  Intel Corporation.
 | 
			
		||||
 *
 | 
			
		||||
 * This library is free software; you can redistribute it and/or
 | 
			
		||||
 * modify it under the terms of the GNU Lesser General Public
 | 
			
		||||
 * License as published by the Free Software Foundation; either
 | 
			
		||||
 * version 2 of the License, or (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This library is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | 
			
		||||
 * Lesser General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Lesser General Public
 | 
			
		||||
 * License along with this library. If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 *
 | 
			
		||||
 * Author:
 | 
			
		||||
 *   Emmanuele Bassi <ebassi@linux.intel.com>
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef __CLUTTER_DRAG_ACTION_H__
 | 
			
		||||
#define __CLUTTER_DRAG_ACTION_H__
 | 
			
		||||
 | 
			
		||||
#if !defined(__CLUTTER_H_INSIDE__) && !defined(CLUTTER_COMPILATION)
 | 
			
		||||
#error "Only <clutter/clutter.h> can be included directly."
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include <clutter/clutter-action.h>
 | 
			
		||||
#include <clutter/clutter-event.h>
 | 
			
		||||
 | 
			
		||||
G_BEGIN_DECLS
 | 
			
		||||
 | 
			
		||||
#define CLUTTER_TYPE_DRAG_ACTION                (clutter_drag_action_get_type ())
 | 
			
		||||
#define CLUTTER_DRAG_ACTION(obj)                (G_TYPE_CHECK_INSTANCE_CAST ((obj), CLUTTER_TYPE_DRAG_ACTION, ClutterDragAction))
 | 
			
		||||
#define CLUTTER_IS_DRAG_ACTION(obj)             (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CLUTTER_TYPE_DRAG_ACTION))
 | 
			
		||||
#define CLUTTER_DRAG_ACTION_CLASS(klass)        (G_TYPE_CHECK_CLASS_CAST ((klass), CLUTTER_TYPE_DRAG_ACTION, ClutterDragActionClass))
 | 
			
		||||
#define CLUTTER_IS_DRAG_ACTION_CLASS(klass)     (G_TYPE_CHECK_CLASS_TYPE ((klass), CLUTTER_TYPE_DRAG_ACTION))
 | 
			
		||||
#define CLUTTER_DRAG_ACTION_GET_CLASS(obj)      (G_TYPE_INSTANCE_GET_CLASS ((obj), CLUTTER_TYPE_DRAG_ACTION, ClutterDragActionClass))
 | 
			
		||||
 | 
			
		||||
typedef struct _ClutterDragAction               ClutterDragAction;
 | 
			
		||||
typedef struct _ClutterDragActionPrivate        ClutterDragActionPrivate;
 | 
			
		||||
typedef struct _ClutterDragActionClass          ClutterDragActionClass;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ClutterDragAction:
 | 
			
		||||
 *
 | 
			
		||||
 * The #ClutterDragAction structure contains only
 | 
			
		||||
 * private data and should be accessed using the provided API
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 1.4
 | 
			
		||||
 */
 | 
			
		||||
struct _ClutterDragAction
 | 
			
		||||
{
 | 
			
		||||
  /*< private >*/
 | 
			
		||||
  ClutterAction parent_instance;
 | 
			
		||||
 | 
			
		||||
  ClutterDragActionPrivate *priv;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ClutterDragActionClass:
 | 
			
		||||
 * @drag_begin: class handler of the #ClutterDragAction::drag-begin signal
 | 
			
		||||
 * @drag_motion: class handler of the #ClutterDragAction::drag-motion signal
 | 
			
		||||
 * @drag_end: class handler of the #ClutterDragAction::drag-end signal
 | 
			
		||||
 * @drag_progress: class handler of the #ClutterDragAction::drag-progress signal
 | 
			
		||||
 *
 | 
			
		||||
 * The #ClutterDragActionClass structure contains
 | 
			
		||||
 * only private data
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 1.4
 | 
			
		||||
 */
 | 
			
		||||
struct _ClutterDragActionClass
 | 
			
		||||
{
 | 
			
		||||
  /*< private >*/
 | 
			
		||||
  ClutterActionClass parent_class;
 | 
			
		||||
 | 
			
		||||
  /*< public >*/
 | 
			
		||||
  void          (* drag_begin)          (ClutterDragAction   *action,
 | 
			
		||||
                                         ClutterActor        *actor,
 | 
			
		||||
                                         gfloat               event_x,
 | 
			
		||||
                                         gfloat               event_y,
 | 
			
		||||
                                         ClutterModifierType  modifiers);
 | 
			
		||||
  void          (* drag_motion)         (ClutterDragAction   *action,
 | 
			
		||||
                                         ClutterActor        *actor,
 | 
			
		||||
                                         gfloat               delta_x,
 | 
			
		||||
                                         gfloat               delta_y);
 | 
			
		||||
  void          (* drag_end)            (ClutterDragAction   *action,
 | 
			
		||||
                                         ClutterActor        *actor,
 | 
			
		||||
                                         gfloat               event_x,
 | 
			
		||||
                                         gfloat               event_y,
 | 
			
		||||
                                         ClutterModifierType  modifiers);
 | 
			
		||||
  gboolean      (* drag_progress)       (ClutterDragAction   *action,
 | 
			
		||||
                                         ClutterActor        *actor,
 | 
			
		||||
                                         gfloat               delta_x,
 | 
			
		||||
                                         gfloat               delta_y);
 | 
			
		||||
 | 
			
		||||
  /*< private >*/
 | 
			
		||||
  void (* _clutter_drag_action1) (void);
 | 
			
		||||
  void (* _clutter_drag_action2) (void);
 | 
			
		||||
  void (* _clutter_drag_action3) (void);
 | 
			
		||||
  void (* _clutter_drag_action4) (void);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
GType clutter_drag_action_get_type (void) G_GNUC_CONST;
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
ClutterAction * clutter_drag_action_new                   (void);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void            clutter_drag_action_set_drag_threshold (ClutterDragAction *action,
 | 
			
		||||
                                                        gint               x_threshold,
 | 
			
		||||
                                                        gint               y_threshold);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void            clutter_drag_action_get_drag_threshold (ClutterDragAction *action,
 | 
			
		||||
                                                        guint             *x_threshold,
 | 
			
		||||
                                                        guint             *y_threshold);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void            clutter_drag_action_set_drag_handle    (ClutterDragAction *action,
 | 
			
		||||
                                                        ClutterActor      *handle);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
ClutterActor *  clutter_drag_action_get_drag_handle    (ClutterDragAction *action);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void            clutter_drag_action_set_drag_axis      (ClutterDragAction *action,
 | 
			
		||||
                                                        ClutterDragAxis    axis);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
ClutterDragAxis clutter_drag_action_get_drag_axis      (ClutterDragAction *action);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void            clutter_drag_action_get_press_coords   (ClutterDragAction *action,
 | 
			
		||||
                                                        gfloat            *press_x,
 | 
			
		||||
                                                        gfloat            *press_y);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void            clutter_drag_action_get_motion_coords  (ClutterDragAction *action,
 | 
			
		||||
                                                        gfloat            *motion_x,
 | 
			
		||||
                                                        gfloat            *motion_y);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
gboolean        clutter_drag_action_get_drag_area      (ClutterDragAction *action,
 | 
			
		||||
                                                        graphene_rect_t   *drag_area);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void            clutter_drag_action_set_drag_area      (ClutterDragAction     *action,
 | 
			
		||||
                                                        const graphene_rect_t *drag_area);
 | 
			
		||||
 | 
			
		||||
G_END_DECLS
 | 
			
		||||
 | 
			
		||||
#endif /* __CLUTTER_DRAG_ACTION_H__ */
 | 
			
		||||
							
								
								
									
										527
									
								
								clutter/clutter/clutter-drop-action.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										527
									
								
								clutter/clutter/clutter-drop-action.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,527 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Clutter.
 | 
			
		||||
 *
 | 
			
		||||
 * An OpenGL based 'interactive canvas' library.
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright © 2011  Intel Corporation.
 | 
			
		||||
 *
 | 
			
		||||
 * This library is free software; you can redistribute it and/or
 | 
			
		||||
 * modify it under the terms of the GNU Lesser General Public
 | 
			
		||||
 * License as published by the Free Software Foundation; either
 | 
			
		||||
 * version 2 of the License, or (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This library is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | 
			
		||||
 * Lesser General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Lesser General Public
 | 
			
		||||
 * License along with this library. If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 *
 | 
			
		||||
 * Author:
 | 
			
		||||
 *   Emmanuele Bassi <ebassi@linux.intel.com>
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * SECTION:clutter-drop-action
 | 
			
		||||
 * @Title: ClutterDropAction
 | 
			
		||||
 * @short_description: An action for drop targets
 | 
			
		||||
 *
 | 
			
		||||
 * #ClutterDropAction is a #ClutterAction that allows a #ClutterActor
 | 
			
		||||
 * implementation to control what happens when an actor dragged using
 | 
			
		||||
 * a #ClutterDragAction crosses the target area or when a dragged actor
 | 
			
		||||
 * is released (or "dropped") on the target area.
 | 
			
		||||
 *
 | 
			
		||||
 * A trivial use of #ClutterDropAction consists in connecting to the
 | 
			
		||||
 * #ClutterDropAction::drop signal and handling the drop from there,
 | 
			
		||||
 * for instance:
 | 
			
		||||
 *
 | 
			
		||||
 * |[<!-- language="C" -->
 | 
			
		||||
 *   ClutterAction *action = clutter_drop_action ();
 | 
			
		||||
 *
 | 
			
		||||
 *   g_signal_connect (action, "drop", G_CALLBACK (on_drop), NULL);
 | 
			
		||||
 *   clutter_actor_add_action (an_actor, action);
 | 
			
		||||
 * ]|
 | 
			
		||||
 *
 | 
			
		||||
 * The #ClutterDropAction::can-drop can be used to control whether the
 | 
			
		||||
 * #ClutterDropAction::drop signal is going to be emitted; returning %FALSE
 | 
			
		||||
 * from a handler connected to the #ClutterDropAction::can-drop signal will
 | 
			
		||||
 * cause the #ClutterDropAction::drop signal to be skipped when the input
 | 
			
		||||
 * device button is released.
 | 
			
		||||
 *
 | 
			
		||||
 * It's important to note that #ClutterDropAction will only work with
 | 
			
		||||
 * actors dragged using #ClutterDragAction.
 | 
			
		||||
 *
 | 
			
		||||
 * See [drop-action.c](https://git.gnome.org/browse/clutter/tree/examples/drop-action.c?h=clutter-1.18)
 | 
			
		||||
 * for an example of how to use #ClutterDropAction.
 | 
			
		||||
 *
 | 
			
		||||
 * #ClutterDropAction is available since Clutter 1.8
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "clutter-build-config.h"
 | 
			
		||||
 | 
			
		||||
#include "clutter-drop-action.h"
 | 
			
		||||
 | 
			
		||||
#include "clutter-actor-meta-private.h"
 | 
			
		||||
#include "clutter-actor-private.h"
 | 
			
		||||
#include "clutter-drag-action.h"
 | 
			
		||||
#include "clutter-main.h"
 | 
			
		||||
#include "clutter-marshal.h"
 | 
			
		||||
#include "clutter-stage-private.h"
 | 
			
		||||
 | 
			
		||||
struct _ClutterDropActionPrivate
 | 
			
		||||
{
 | 
			
		||||
  ClutterActor *actor;
 | 
			
		||||
  ClutterActor *stage;
 | 
			
		||||
 | 
			
		||||
  gulong mapped_id;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
typedef struct _DropTarget {
 | 
			
		||||
  ClutterActor *stage;
 | 
			
		||||
 | 
			
		||||
  gulong capture_id;
 | 
			
		||||
 | 
			
		||||
  GHashTable *actions;
 | 
			
		||||
 | 
			
		||||
  ClutterDropAction *last_action;
 | 
			
		||||
} DropTarget;
 | 
			
		||||
 | 
			
		||||
enum
 | 
			
		||||
{
 | 
			
		||||
  CAN_DROP,
 | 
			
		||||
  OVER_IN,
 | 
			
		||||
  OVER_OUT,
 | 
			
		||||
  DROP,
 | 
			
		||||
  DROP_CANCEL,
 | 
			
		||||
 | 
			
		||||
  LAST_SIGNAL
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static guint drop_signals[LAST_SIGNAL] = { 0, };
 | 
			
		||||
 | 
			
		||||
G_DEFINE_TYPE_WITH_PRIVATE (ClutterDropAction, clutter_drop_action, CLUTTER_TYPE_ACTION)
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
drop_target_free (gpointer _data)
 | 
			
		||||
{
 | 
			
		||||
  DropTarget *data = _data;
 | 
			
		||||
 | 
			
		||||
  g_clear_signal_handler (&data->capture_id, data->stage);
 | 
			
		||||
  g_hash_table_destroy (data->actions);
 | 
			
		||||
  g_free (data);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
on_stage_capture (ClutterStage *stage,
 | 
			
		||||
                  ClutterEvent *event,
 | 
			
		||||
                  gpointer      user_data)
 | 
			
		||||
{
 | 
			
		||||
  DropTarget *data = user_data;
 | 
			
		||||
  gfloat event_x, event_y;
 | 
			
		||||
  ClutterActor *actor, *drag_actor;
 | 
			
		||||
  ClutterDropAction *drop_action;
 | 
			
		||||
  ClutterInputDevice *device;
 | 
			
		||||
  gboolean was_reactive;
 | 
			
		||||
 | 
			
		||||
  switch (clutter_event_type (event))
 | 
			
		||||
    {
 | 
			
		||||
    case CLUTTER_MOTION:
 | 
			
		||||
    case CLUTTER_BUTTON_RELEASE:
 | 
			
		||||
      if (clutter_event_type (event) == CLUTTER_MOTION &&
 | 
			
		||||
          !(clutter_event_get_state (event) & CLUTTER_BUTTON1_MASK))
 | 
			
		||||
        return CLUTTER_EVENT_PROPAGATE;
 | 
			
		||||
 | 
			
		||||
      if (clutter_event_type (event) == CLUTTER_BUTTON_RELEASE &&
 | 
			
		||||
          clutter_event_get_button (event) != CLUTTER_BUTTON_PRIMARY)
 | 
			
		||||
        return CLUTTER_EVENT_PROPAGATE;
 | 
			
		||||
 | 
			
		||||
      device = clutter_event_get_device (event);
 | 
			
		||||
      drag_actor = _clutter_stage_get_pointer_drag_actor (stage, device);
 | 
			
		||||
      if (drag_actor == NULL)
 | 
			
		||||
        return CLUTTER_EVENT_PROPAGATE;
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
    case CLUTTER_TOUCH_UPDATE:
 | 
			
		||||
    case CLUTTER_TOUCH_END:
 | 
			
		||||
      drag_actor = _clutter_stage_get_touch_drag_actor (stage,
 | 
			
		||||
                                                        clutter_event_get_event_sequence (event));
 | 
			
		||||
      if (drag_actor == NULL)
 | 
			
		||||
        return CLUTTER_EVENT_PROPAGATE;
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
    default:
 | 
			
		||||
      return CLUTTER_EVENT_PROPAGATE;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  clutter_event_get_coords (event, &event_x, &event_y);
 | 
			
		||||
 | 
			
		||||
  /* get the actor under the cursor, excluding the dragged actor; we
 | 
			
		||||
   * use reactivity because it won't cause any scene invalidation
 | 
			
		||||
   */
 | 
			
		||||
  was_reactive = clutter_actor_get_reactive (drag_actor);
 | 
			
		||||
  clutter_actor_set_reactive (drag_actor, FALSE);
 | 
			
		||||
 | 
			
		||||
  actor = clutter_stage_get_actor_at_pos (stage, CLUTTER_PICK_REACTIVE,
 | 
			
		||||
                                          event_x,
 | 
			
		||||
                                          event_y);
 | 
			
		||||
  if (actor == NULL || actor == CLUTTER_ACTOR (stage))
 | 
			
		||||
    {
 | 
			
		||||
      if (data->last_action != NULL)
 | 
			
		||||
        {
 | 
			
		||||
          ClutterActorMeta *meta = CLUTTER_ACTOR_META (data->last_action);
 | 
			
		||||
 | 
			
		||||
          g_signal_emit (data->last_action, drop_signals[OVER_OUT], 0,
 | 
			
		||||
                         clutter_actor_meta_get_actor (meta));
 | 
			
		||||
 | 
			
		||||
          data->last_action = NULL;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
      goto out;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  drop_action = g_hash_table_lookup (data->actions, actor);
 | 
			
		||||
 | 
			
		||||
  if (drop_action == NULL)
 | 
			
		||||
    {
 | 
			
		||||
      if (data->last_action != NULL)
 | 
			
		||||
        {
 | 
			
		||||
          ClutterActorMeta *meta = CLUTTER_ACTOR_META (data->last_action);
 | 
			
		||||
 | 
			
		||||
          g_signal_emit (data->last_action, drop_signals[OVER_OUT], 0,
 | 
			
		||||
                         clutter_actor_meta_get_actor (meta));
 | 
			
		||||
 | 
			
		||||
          data->last_action = NULL;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
      goto out;
 | 
			
		||||
    }
 | 
			
		||||
  else
 | 
			
		||||
    {
 | 
			
		||||
      if (data->last_action != drop_action)
 | 
			
		||||
        {
 | 
			
		||||
          ClutterActorMeta *meta;
 | 
			
		||||
 | 
			
		||||
          if (data->last_action != NULL)
 | 
			
		||||
            {
 | 
			
		||||
              meta = CLUTTER_ACTOR_META (data->last_action);
 | 
			
		||||
 | 
			
		||||
              g_signal_emit (data->last_action, drop_signals[OVER_OUT], 0,
 | 
			
		||||
                             clutter_actor_meta_get_actor (meta));
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
          meta = CLUTTER_ACTOR_META (drop_action);
 | 
			
		||||
 | 
			
		||||
          g_signal_emit (drop_action, drop_signals[OVER_IN], 0,
 | 
			
		||||
                         clutter_actor_meta_get_actor (meta));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
      data->last_action = drop_action;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
out:
 | 
			
		||||
  if (clutter_event_type (event) == CLUTTER_BUTTON_RELEASE ||
 | 
			
		||||
      clutter_event_type (event) == CLUTTER_TOUCH_END)
 | 
			
		||||
    {
 | 
			
		||||
      if (data->last_action != NULL)
 | 
			
		||||
        {
 | 
			
		||||
          ClutterActorMeta *meta = CLUTTER_ACTOR_META (data->last_action);
 | 
			
		||||
          gboolean can_drop = FALSE;
 | 
			
		||||
 | 
			
		||||
          g_signal_emit (data->last_action, drop_signals[CAN_DROP], 0,
 | 
			
		||||
                         clutter_actor_meta_get_actor (meta),
 | 
			
		||||
                         event_x, event_y,
 | 
			
		||||
                         &can_drop);
 | 
			
		||||
 | 
			
		||||
          if (can_drop)
 | 
			
		||||
            {
 | 
			
		||||
              g_signal_emit (data->last_action, drop_signals[DROP], 0,
 | 
			
		||||
                             clutter_actor_meta_get_actor (meta),
 | 
			
		||||
                             event_x, event_y);
 | 
			
		||||
            }
 | 
			
		||||
	  else
 | 
			
		||||
            {
 | 
			
		||||
              g_signal_emit (data->last_action, drop_signals[DROP_CANCEL], 0,
 | 
			
		||||
                             clutter_actor_meta_get_actor (meta),
 | 
			
		||||
                             event_x, event_y);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
      data->last_action = NULL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  if (drag_actor != NULL)
 | 
			
		||||
    clutter_actor_set_reactive (drag_actor, was_reactive);
 | 
			
		||||
 | 
			
		||||
  return CLUTTER_EVENT_PROPAGATE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
drop_action_register (ClutterDropAction *self)
 | 
			
		||||
{
 | 
			
		||||
  ClutterDropActionPrivate *priv = self->priv;
 | 
			
		||||
  DropTarget *data;
 | 
			
		||||
 | 
			
		||||
  g_assert (priv->stage != NULL);
 | 
			
		||||
 | 
			
		||||
  data = g_object_get_data (G_OBJECT (priv->stage), "__clutter_drop_targets");
 | 
			
		||||
  if (data == NULL)
 | 
			
		||||
    {
 | 
			
		||||
      data = g_new0 (DropTarget, 1);
 | 
			
		||||
 | 
			
		||||
      data->stage = priv->stage;
 | 
			
		||||
      data->actions = g_hash_table_new (NULL, NULL);
 | 
			
		||||
      data->capture_id = g_signal_connect (priv->stage, "captured-event",
 | 
			
		||||
                                           G_CALLBACK (on_stage_capture),
 | 
			
		||||
                                           data);
 | 
			
		||||
      g_object_set_data_full (G_OBJECT (priv->stage), "__clutter_drop_targets",
 | 
			
		||||
                              data,
 | 
			
		||||
                              drop_target_free);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  g_hash_table_replace (data->actions, priv->actor, self);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
drop_action_unregister (ClutterDropAction *self)
 | 
			
		||||
{
 | 
			
		||||
  ClutterDropActionPrivate *priv = self->priv;
 | 
			
		||||
  DropTarget *data = NULL;
 | 
			
		||||
 | 
			
		||||
  if (priv->stage != NULL)
 | 
			
		||||
    data = g_object_get_data (G_OBJECT (priv->stage), "__clutter_drop_targets");
 | 
			
		||||
 | 
			
		||||
  if (data == NULL)
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  g_hash_table_remove (data->actions, priv->actor);
 | 
			
		||||
  if (g_hash_table_size (data->actions) == 0)
 | 
			
		||||
    g_object_set_data (G_OBJECT (data->stage), "__clutter_drop_targets", NULL);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
on_actor_mapped (ClutterActor      *actor,
 | 
			
		||||
                 GParamSpec        *pspec,
 | 
			
		||||
                 ClutterDropAction *self)
 | 
			
		||||
{
 | 
			
		||||
  if (clutter_actor_is_mapped (actor))
 | 
			
		||||
    {
 | 
			
		||||
      if (self->priv->stage == NULL)
 | 
			
		||||
        self->priv->stage = clutter_actor_get_stage (actor);
 | 
			
		||||
 | 
			
		||||
      drop_action_register (self);
 | 
			
		||||
    }
 | 
			
		||||
  else
 | 
			
		||||
    drop_action_unregister (self);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_drop_action_set_actor (ClutterActorMeta *meta,
 | 
			
		||||
                               ClutterActor     *actor)
 | 
			
		||||
{
 | 
			
		||||
  ClutterDropActionPrivate *priv = CLUTTER_DROP_ACTION (meta)->priv;
 | 
			
		||||
 | 
			
		||||
  if (priv->actor != NULL)
 | 
			
		||||
    {
 | 
			
		||||
      drop_action_unregister (CLUTTER_DROP_ACTION (meta));
 | 
			
		||||
 | 
			
		||||
      g_clear_signal_handler (&priv->mapped_id, priv->actor);
 | 
			
		||||
 | 
			
		||||
      priv->stage = NULL;
 | 
			
		||||
      priv->actor = NULL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  priv->actor = actor;
 | 
			
		||||
 | 
			
		||||
  if (priv->actor != NULL)
 | 
			
		||||
    {
 | 
			
		||||
      priv->stage = clutter_actor_get_stage (actor);
 | 
			
		||||
      priv->mapped_id = g_signal_connect (actor, "notify::mapped",
 | 
			
		||||
                                          G_CALLBACK (on_actor_mapped),
 | 
			
		||||
                                          meta);
 | 
			
		||||
 | 
			
		||||
      if (priv->stage != NULL)
 | 
			
		||||
        drop_action_register (CLUTTER_DROP_ACTION (meta));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  CLUTTER_ACTOR_META_CLASS (clutter_drop_action_parent_class)->set_actor (meta, actor);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
signal_accumulator (GSignalInvocationHint *ihint,
 | 
			
		||||
                    GValue                *return_accu,
 | 
			
		||||
                    const GValue          *handler_return,
 | 
			
		||||
                    gpointer               user_data)
 | 
			
		||||
{
 | 
			
		||||
  gboolean continue_emission;
 | 
			
		||||
 | 
			
		||||
  continue_emission = g_value_get_boolean (handler_return);
 | 
			
		||||
  g_value_set_boolean (return_accu, continue_emission);
 | 
			
		||||
 | 
			
		||||
  return continue_emission;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
clutter_drop_action_real_can_drop (ClutterDropAction *action,
 | 
			
		||||
                                   ClutterActor      *actor,
 | 
			
		||||
                                   gfloat             event_x,
 | 
			
		||||
                                   gfloat             event_y)
 | 
			
		||||
{
 | 
			
		||||
  return TRUE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_drop_action_class_init (ClutterDropActionClass *klass)
 | 
			
		||||
{
 | 
			
		||||
  ClutterActorMetaClass *meta_class = CLUTTER_ACTOR_META_CLASS (klass);
 | 
			
		||||
 | 
			
		||||
  meta_class->set_actor = clutter_drop_action_set_actor;
 | 
			
		||||
 | 
			
		||||
  klass->can_drop = clutter_drop_action_real_can_drop;
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * ClutterDropAction::can-drop:
 | 
			
		||||
   * @action: the #ClutterDropAction that emitted the signal
 | 
			
		||||
   * @actor: the #ClutterActor attached to the @action
 | 
			
		||||
   * @event_x: the X coordinate (in stage space) of the drop event
 | 
			
		||||
   * @event_y: the Y coordinate (in stage space) of the drop event
 | 
			
		||||
   *
 | 
			
		||||
   * The ::can-drop signal is emitted when the dragged actor is dropped
 | 
			
		||||
   * on @actor. The return value of the ::can-drop signal will determine
 | 
			
		||||
   * whether or not the #ClutterDropAction::drop signal is going to be
 | 
			
		||||
   * emitted on @action.
 | 
			
		||||
   *
 | 
			
		||||
   * The default implementation of #ClutterDropAction returns %TRUE for
 | 
			
		||||
   * this signal.
 | 
			
		||||
   *
 | 
			
		||||
   * Return value: %TRUE if the drop is accepted, and %FALSE otherwise
 | 
			
		||||
   *
 | 
			
		||||
   * Since: 1.8
 | 
			
		||||
   */
 | 
			
		||||
  drop_signals[CAN_DROP] =
 | 
			
		||||
    g_signal_new (I_("can-drop"),
 | 
			
		||||
                  G_TYPE_FROM_CLASS (klass),
 | 
			
		||||
                  G_SIGNAL_RUN_LAST,
 | 
			
		||||
                  G_STRUCT_OFFSET (ClutterDropActionClass, can_drop),
 | 
			
		||||
                  signal_accumulator, NULL,
 | 
			
		||||
                  _clutter_marshal_BOOLEAN__OBJECT_FLOAT_FLOAT,
 | 
			
		||||
                  G_TYPE_BOOLEAN, 3,
 | 
			
		||||
                  CLUTTER_TYPE_ACTOR,
 | 
			
		||||
                  G_TYPE_FLOAT,
 | 
			
		||||
                  G_TYPE_FLOAT);
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * ClutterDropAction::over-in:
 | 
			
		||||
   * @action: the #ClutterDropAction that emitted the signal
 | 
			
		||||
   * @actor: the #ClutterActor attached to the @action
 | 
			
		||||
   *
 | 
			
		||||
   * The ::over-in signal is emitted when the dragged actor crosses
 | 
			
		||||
   * into @actor.
 | 
			
		||||
   *
 | 
			
		||||
   * Since: 1.8
 | 
			
		||||
   */
 | 
			
		||||
  drop_signals[OVER_IN] =
 | 
			
		||||
    g_signal_new (I_("over-in"),
 | 
			
		||||
                  G_TYPE_FROM_CLASS (klass),
 | 
			
		||||
                  G_SIGNAL_RUN_LAST,
 | 
			
		||||
                  G_STRUCT_OFFSET (ClutterDropActionClass, over_in),
 | 
			
		||||
                  NULL, NULL, NULL,
 | 
			
		||||
                  G_TYPE_NONE, 1,
 | 
			
		||||
                  CLUTTER_TYPE_ACTOR);
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * ClutterDropAction::over-out:
 | 
			
		||||
   * @action: the #ClutterDropAction that emitted the signal
 | 
			
		||||
   * @actor: the #ClutterActor attached to the @action
 | 
			
		||||
   *
 | 
			
		||||
   * The ::over-out signal is emitted when the dragged actor crosses
 | 
			
		||||
   * outside @actor.
 | 
			
		||||
   *
 | 
			
		||||
   * Since: 1.8
 | 
			
		||||
   */
 | 
			
		||||
  drop_signals[OVER_OUT] =
 | 
			
		||||
    g_signal_new (I_("over-out"),
 | 
			
		||||
                  G_TYPE_FROM_CLASS (klass),
 | 
			
		||||
                  G_SIGNAL_RUN_LAST,
 | 
			
		||||
                  G_STRUCT_OFFSET (ClutterDropActionClass, over_out),
 | 
			
		||||
                  NULL, NULL, NULL,
 | 
			
		||||
                  G_TYPE_NONE, 1,
 | 
			
		||||
                  CLUTTER_TYPE_ACTOR);
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * ClutterDropAction::drop:
 | 
			
		||||
   * @action: the #ClutterDropAction that emitted the signal
 | 
			
		||||
   * @actor: the #ClutterActor attached to the @action
 | 
			
		||||
   * @event_x: the X coordinate (in stage space) of the drop event
 | 
			
		||||
   * @event_y: the Y coordinate (in stage space) of the drop event
 | 
			
		||||
   *
 | 
			
		||||
   * The ::drop signal is emitted when the dragged actor is dropped
 | 
			
		||||
   * on @actor. This signal is only emitted if at least an handler of
 | 
			
		||||
   * #ClutterDropAction::can-drop returns %TRUE.
 | 
			
		||||
   *
 | 
			
		||||
   * Since: 1.8
 | 
			
		||||
   */
 | 
			
		||||
  drop_signals[DROP] =
 | 
			
		||||
    g_signal_new (I_("drop"),
 | 
			
		||||
                  G_TYPE_FROM_CLASS (klass),
 | 
			
		||||
                  G_SIGNAL_RUN_LAST,
 | 
			
		||||
                  G_STRUCT_OFFSET (ClutterDropActionClass, drop),
 | 
			
		||||
                  NULL, NULL,
 | 
			
		||||
                  _clutter_marshal_VOID__OBJECT_FLOAT_FLOAT,
 | 
			
		||||
                  G_TYPE_NONE, 3,
 | 
			
		||||
                  CLUTTER_TYPE_ACTOR,
 | 
			
		||||
                  G_TYPE_FLOAT,
 | 
			
		||||
                  G_TYPE_FLOAT);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * ClutterDropAction::drop-cancel:
 | 
			
		||||
   * @action: the #ClutterDropAction that emitted the signal
 | 
			
		||||
   * @actor: the #ClutterActor attached to the @action
 | 
			
		||||
   * @event_x: the X coordinate (in stage space) of the drop event
 | 
			
		||||
   * @event_y: the Y coordinate (in stage space) of the drop event
 | 
			
		||||
   *
 | 
			
		||||
   * The ::drop-cancel signal is emitted when the drop is refused
 | 
			
		||||
   * by an emission of the #ClutterDropAction::can-drop signal.
 | 
			
		||||
   *
 | 
			
		||||
   * After the ::drop-cancel signal is fired the active drag is
 | 
			
		||||
   * terminated.
 | 
			
		||||
   *
 | 
			
		||||
   * Since: 1.12
 | 
			
		||||
   */
 | 
			
		||||
  drop_signals[DROP_CANCEL] =
 | 
			
		||||
    g_signal_new (I_("drop-cancel"),
 | 
			
		||||
                  G_TYPE_FROM_CLASS (klass),
 | 
			
		||||
                  G_SIGNAL_RUN_LAST,
 | 
			
		||||
                  G_STRUCT_OFFSET (ClutterDropActionClass, drop),
 | 
			
		||||
                  NULL, NULL,
 | 
			
		||||
                  _clutter_marshal_VOID__OBJECT_FLOAT_FLOAT,
 | 
			
		||||
                  G_TYPE_NONE, 3,
 | 
			
		||||
                  CLUTTER_TYPE_ACTOR,
 | 
			
		||||
                  G_TYPE_FLOAT,
 | 
			
		||||
                  G_TYPE_FLOAT);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_drop_action_init (ClutterDropAction *self)
 | 
			
		||||
{
 | 
			
		||||
  self->priv = clutter_drop_action_get_instance_private (self);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_drop_action_new:
 | 
			
		||||
 *
 | 
			
		||||
 * Creates a new #ClutterDropAction.
 | 
			
		||||
 *
 | 
			
		||||
 * Use clutter_actor_add_action() to add the action to a #ClutterActor.
 | 
			
		||||
 *
 | 
			
		||||
 * Return value: the newly created #ClutterDropAction
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 1.8
 | 
			
		||||
 */
 | 
			
		||||
ClutterAction *
 | 
			
		||||
clutter_drop_action_new (void)
 | 
			
		||||
{
 | 
			
		||||
  return g_object_new (CLUTTER_TYPE_DROP_ACTION, NULL);
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										115
									
								
								clutter/clutter/clutter-drop-action.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										115
									
								
								clutter/clutter/clutter-drop-action.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,115 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Clutter.
 | 
			
		||||
 *
 | 
			
		||||
 * An OpenGL based 'interactive canvas' library.
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright © 2011  Intel Corporation.
 | 
			
		||||
 *
 | 
			
		||||
 * This library is free software; you can redistribute it and/or
 | 
			
		||||
 * modify it under the terms of the GNU Lesser General Public
 | 
			
		||||
 * License as published by the Free Software Foundation; either
 | 
			
		||||
 * version 2 of the License, or (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This library is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | 
			
		||||
 * Lesser General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Lesser General Public
 | 
			
		||||
 * License along with this library. If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 *
 | 
			
		||||
 * Author:
 | 
			
		||||
 *   Emmanuele Bassi <ebassi@linux.intel.com>
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef __CLUTTER_DROP_ACTION_H__
 | 
			
		||||
#define __CLUTTER_DROP_ACTION_H__
 | 
			
		||||
 | 
			
		||||
#if !defined(__CLUTTER_H_INSIDE__) && !defined(CLUTTER_COMPILATION)
 | 
			
		||||
#error "Only <clutter/clutter.h> can be directly included."
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include <clutter/clutter-action.h>
 | 
			
		||||
 | 
			
		||||
G_BEGIN_DECLS
 | 
			
		||||
 | 
			
		||||
#define CLUTTER_TYPE_DROP_ACTION                (clutter_drop_action_get_type ())
 | 
			
		||||
#define CLUTTER_DROP_ACTION(obj)                (G_TYPE_CHECK_INSTANCE_CAST ((obj), CLUTTER_TYPE_DROP_ACTION, ClutterDropAction))
 | 
			
		||||
#define CLUTTER_IS_DROP_ACTION(obj)             (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CLUTTER_TYPE_DROP_ACTION))
 | 
			
		||||
#define CLUTTER_DROP_ACTION_CLASS(klass)        (G_TYPE_CHECK_CLASS_CAST ((klass), CLUTTER_TYPE_DROP_ACTION, ClutterDropActionClass))
 | 
			
		||||
#define CLUTTER_IS_DROP_ACTION_CLASS(klass)     (G_TYPE_CHECK_CLASS_TYPE ((klass), CLUTTER_TYPE_DROP_ACTION))
 | 
			
		||||
#define CLUTTER_DROP_ACTION_GET_CLASS(obj)      (G_TYPE_INSTANCE_GET_CLASS ((obj), CLUTTER_TYPE_DROP_ACTION, ClutterDropActionClass))
 | 
			
		||||
 | 
			
		||||
typedef struct _ClutterDropAction               ClutterDropAction;
 | 
			
		||||
typedef struct _ClutterDropActionPrivate        ClutterDropActionPrivate;
 | 
			
		||||
typedef struct _ClutterDropActionClass          ClutterDropActionClass;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ClutterDropAction:
 | 
			
		||||
 *
 | 
			
		||||
 * The #ClutterDropAction structure contains only
 | 
			
		||||
 * private data and should be accessed using the provided API.
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 1.8
 | 
			
		||||
 */
 | 
			
		||||
struct _ClutterDropAction
 | 
			
		||||
{
 | 
			
		||||
  /*< private >*/
 | 
			
		||||
  ClutterAction parent_instance;
 | 
			
		||||
 | 
			
		||||
  ClutterDropActionPrivate *priv;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ClutterDropActionClass:
 | 
			
		||||
 * @can_drop: class handler for the #ClutterDropAction::can-drop signal
 | 
			
		||||
 * @over_in: class handler for the #ClutterDropAction::over-in signal
 | 
			
		||||
 * @over_out: class handler for the #ClutterDropAction::over-out signal
 | 
			
		||||
 * @drop: class handler for the #ClutterDropAction::drop signal
 | 
			
		||||
 *
 | 
			
		||||
 * The #ClutterDropActionClass structure contains
 | 
			
		||||
 * only private data.
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 1.8
 | 
			
		||||
 */
 | 
			
		||||
struct _ClutterDropActionClass
 | 
			
		||||
{
 | 
			
		||||
  /*< private >*/
 | 
			
		||||
  ClutterActionClass parent_class;
 | 
			
		||||
 | 
			
		||||
  /*< public >*/
 | 
			
		||||
  gboolean (* can_drop) (ClutterDropAction *action,
 | 
			
		||||
                         ClutterActor      *actor,
 | 
			
		||||
                         gfloat             event_x,
 | 
			
		||||
                         gfloat             event_y);
 | 
			
		||||
 | 
			
		||||
  void     (* over_in)  (ClutterDropAction *action,
 | 
			
		||||
                         ClutterActor      *actor);
 | 
			
		||||
  void     (* over_out) (ClutterDropAction *action,
 | 
			
		||||
                         ClutterActor      *actor);
 | 
			
		||||
 | 
			
		||||
  void     (* drop)     (ClutterDropAction *action,
 | 
			
		||||
                         ClutterActor      *actor,
 | 
			
		||||
                         gfloat             event_x,
 | 
			
		||||
                         gfloat             event_y);
 | 
			
		||||
 | 
			
		||||
  /*< private >*/
 | 
			
		||||
  void (*_clutter_drop_action1) (void);
 | 
			
		||||
  void (*_clutter_drop_action2) (void);
 | 
			
		||||
  void (*_clutter_drop_action3) (void);
 | 
			
		||||
  void (*_clutter_drop_action4) (void);
 | 
			
		||||
  void (*_clutter_drop_action5) (void);
 | 
			
		||||
  void (*_clutter_drop_action6) (void);
 | 
			
		||||
  void (*_clutter_drop_action7) (void);
 | 
			
		||||
  void (*_clutter_drop_action8) (void);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
GType clutter_drop_action_get_type (void) G_GNUC_CONST;
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
ClutterAction *         clutter_drop_action_new         (void);
 | 
			
		||||
 | 
			
		||||
G_END_DECLS
 | 
			
		||||
 | 
			
		||||
#endif /* __CLUTTER_DROP_ACTION_H__ */
 | 
			
		||||
@@ -230,26 +230,28 @@ clutter_effect_real_pick (ClutterEffect      *effect,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_effect_set_enabled (ClutterActorMeta *meta,
 | 
			
		||||
                            gboolean          is_enabled)
 | 
			
		||||
clutter_effect_notify (GObject    *gobject,
 | 
			
		||||
                       GParamSpec *pspec)
 | 
			
		||||
{
 | 
			
		||||
  ClutterActorMetaClass *parent_class =
 | 
			
		||||
    CLUTTER_ACTOR_META_CLASS (clutter_effect_parent_class);
 | 
			
		||||
  ClutterActor *actor;
 | 
			
		||||
  if (strcmp (pspec->name, "enabled") == 0)
 | 
			
		||||
    {
 | 
			
		||||
      ClutterActorMeta *meta = CLUTTER_ACTOR_META (gobject);
 | 
			
		||||
      ClutterActor *actor = clutter_actor_meta_get_actor (meta);
 | 
			
		||||
 | 
			
		||||
  actor = clutter_actor_meta_get_actor (meta);
 | 
			
		||||
  if (actor)
 | 
			
		||||
    clutter_actor_queue_redraw (actor);
 | 
			
		||||
      if (actor != NULL)
 | 
			
		||||
        clutter_actor_queue_redraw (actor);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  parent_class->set_enabled (meta, is_enabled);
 | 
			
		||||
  if (G_OBJECT_CLASS (clutter_effect_parent_class)->notify != NULL)
 | 
			
		||||
    G_OBJECT_CLASS (clutter_effect_parent_class)->notify (gobject, pspec);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_effect_class_init (ClutterEffectClass *klass)
 | 
			
		||||
{
 | 
			
		||||
  ClutterActorMetaClass *actor_meta_class = CLUTTER_ACTOR_META_CLASS (klass);
 | 
			
		||||
  GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
 | 
			
		||||
 | 
			
		||||
  actor_meta_class->set_enabled = clutter_effect_set_enabled;
 | 
			
		||||
  gobject_class->notify = clutter_effect_notify;
 | 
			
		||||
 | 
			
		||||
  klass->pre_paint = clutter_effect_real_pre_paint;
 | 
			
		||||
  klass->post_paint = clutter_effect_real_post_paint;
 | 
			
		||||
 
 | 
			
		||||
@@ -190,7 +190,7 @@ typedef enum /*< prefix=CLUTTER_REQUEST >*/
 | 
			
		||||
 * @CLUTTER_ANIMATION_LAST: last animation mode, used as a guard for
 | 
			
		||||
 *   registered global alpha functions
 | 
			
		||||
 *
 | 
			
		||||
 * The animation modes used by #ClutterAnimatable. This
 | 
			
		||||
 * The animation modes used by #ClutterAlpha and #ClutterAnimation. This
 | 
			
		||||
 * enumeration can be expanded in later versions of Clutter.
 | 
			
		||||
 *
 | 
			
		||||
 * <figure id="easing-modes">
 | 
			
		||||
@@ -535,13 +535,9 @@ 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().
 | 
			
		||||
 *
 | 
			
		||||
@@ -549,11 +545,36 @@ typedef enum /*< prefix=CLUTTER_ACTOR >*/
 | 
			
		||||
 */
 | 
			
		||||
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
 | 
			
		||||
  CLUTTER_OFFSCREEN_REDIRECT_AUTOMATIC_FOR_OPACITY = 1<<0,
 | 
			
		||||
  CLUTTER_OFFSCREEN_REDIRECT_ALWAYS = 1<<1
 | 
			
		||||
} ClutterOffscreenRedirect;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ClutterAllocationFlags:
 | 
			
		||||
 * @CLUTTER_ALLOCATION_NONE: No flag set
 | 
			
		||||
 * @CLUTTER_ABSOLUTE_ORIGIN_CHANGED: Whether the absolute origin of the
 | 
			
		||||
 *   actor has changed; this implies that any ancestor of the actor has
 | 
			
		||||
 *   been moved.
 | 
			
		||||
 * @CLUTTER_DELEGATE_LAYOUT: Whether the allocation should be delegated
 | 
			
		||||
 *   to the #ClutterLayoutManager instance stored inside the
 | 
			
		||||
 *   #ClutterActor:layout-manager property of #ClutterActor. This flag
 | 
			
		||||
 *   should only be used if you are subclassing #ClutterActor and
 | 
			
		||||
 *   overriding the #ClutterActorClass.allocate() virtual function, but
 | 
			
		||||
 *   you wish to use the default implementation of the virtual function
 | 
			
		||||
 *   inside #ClutterActor. Added in Clutter 1.10.
 | 
			
		||||
 *
 | 
			
		||||
 * Flags passed to the #ClutterActorClass.allocate() virtual function
 | 
			
		||||
 * and to the clutter_actor_allocate() function.
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 1.0
 | 
			
		||||
 */
 | 
			
		||||
typedef enum
 | 
			
		||||
{
 | 
			
		||||
  CLUTTER_ALLOCATION_NONE         = 0,
 | 
			
		||||
  CLUTTER_ABSOLUTE_ORIGIN_CHANGED = 1 << 1,
 | 
			
		||||
  CLUTTER_DELEGATE_LAYOUT         = 1 << 2
 | 
			
		||||
} ClutterAllocationFlags;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ClutterAlignAxis:
 | 
			
		||||
 * @CLUTTER_ALIGN_X_AXIS: Maintain the alignment on the X axis
 | 
			
		||||
@@ -652,15 +673,12 @@ 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)
 | 
			
		||||
  CLUTTER_EFFECT_PAINT_ACTOR_DIRTY = (1 << 0)
 | 
			
		||||
} ClutterEffectPaintFlags;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 
 | 
			
		||||
@@ -131,7 +131,8 @@ clutter_fixed_layout_get_preferred_height (ClutterLayoutManager *manager,
 | 
			
		||||
static void
 | 
			
		||||
clutter_fixed_layout_allocate (ClutterLayoutManager   *manager,
 | 
			
		||||
                               ClutterContainer       *container,
 | 
			
		||||
                               const ClutterActorBox  *allocation)
 | 
			
		||||
                               const ClutterActorBox  *allocation,
 | 
			
		||||
                               ClutterAllocationFlags  flags)
 | 
			
		||||
{
 | 
			
		||||
  ClutterActor *child;
 | 
			
		||||
 | 
			
		||||
@@ -139,7 +140,7 @@ clutter_fixed_layout_allocate (ClutterLayoutManager   *manager,
 | 
			
		||||
       child != NULL;
 | 
			
		||||
       child = clutter_actor_get_next_sibling (child))
 | 
			
		||||
    {
 | 
			
		||||
      clutter_actor_allocate_preferred_size (child);
 | 
			
		||||
      clutter_actor_allocate_preferred_size (child, flags);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -566,7 +566,8 @@ clutter_flow_layout_get_preferred_height (ClutterLayoutManager *manager,
 | 
			
		||||
static void
 | 
			
		||||
clutter_flow_layout_allocate (ClutterLayoutManager   *manager,
 | 
			
		||||
                              ClutterContainer       *container,
 | 
			
		||||
                              const ClutterActorBox  *allocation)
 | 
			
		||||
                              const ClutterActorBox  *allocation,
 | 
			
		||||
                              ClutterAllocationFlags  flags)
 | 
			
		||||
{
 | 
			
		||||
  ClutterFlowLayoutPrivate *priv = CLUTTER_FLOW_LAYOUT (manager)->priv;
 | 
			
		||||
  ClutterActor *actor, *child;
 | 
			
		||||
@@ -728,7 +729,7 @@ clutter_flow_layout_allocate (ClutterLayoutManager   *manager,
 | 
			
		||||
      child_alloc.y1 = ceil (item_y);
 | 
			
		||||
      child_alloc.x2 = ceil (child_alloc.x1 + item_width);
 | 
			
		||||
      child_alloc.y2 = ceil (child_alloc.y1 + item_height);
 | 
			
		||||
      clutter_actor_allocate (child, &child_alloc);
 | 
			
		||||
      clutter_actor_allocate (child, &child_alloc, flags);
 | 
			
		||||
 | 
			
		||||
      if (priv->orientation == CLUTTER_FLOW_HORIZONTAL)
 | 
			
		||||
        item_x = new_x;
 | 
			
		||||
 
 | 
			
		||||
@@ -157,8 +157,7 @@ G_DEFINE_TYPE_WITH_PRIVATE (ClutterGestureAction, clutter_gesture_action, CLUTTE
 | 
			
		||||
static GesturePoint *
 | 
			
		||||
gesture_register_point (ClutterGestureAction *action, ClutterEvent *event)
 | 
			
		||||
{
 | 
			
		||||
  ClutterGestureActionPrivate *priv =
 | 
			
		||||
    clutter_gesture_action_get_instance_private (action);
 | 
			
		||||
  ClutterGestureActionPrivate *priv = action->priv;
 | 
			
		||||
  GesturePoint *point = NULL;
 | 
			
		||||
 | 
			
		||||
  if (priv->points->len >= MAX_GESTURE_POINTS)
 | 
			
		||||
@@ -191,8 +190,7 @@ gesture_find_point (ClutterGestureAction *action,
 | 
			
		||||
                    ClutterEvent *event,
 | 
			
		||||
                    gint *position)
 | 
			
		||||
{
 | 
			
		||||
  ClutterGestureActionPrivate *priv =
 | 
			
		||||
    clutter_gesture_action_get_instance_private (action);
 | 
			
		||||
  ClutterGestureActionPrivate *priv = action->priv;
 | 
			
		||||
  GesturePoint *point = NULL;
 | 
			
		||||
  ClutterEventType type = clutter_event_type (event);
 | 
			
		||||
  ClutterInputDevice *device = clutter_event_get_device (event);
 | 
			
		||||
@@ -222,10 +220,9 @@ gesture_find_point (ClutterGestureAction *action,
 | 
			
		||||
static void
 | 
			
		||||
gesture_unregister_point (ClutterGestureAction *action, gint position)
 | 
			
		||||
{
 | 
			
		||||
  ClutterGestureActionPrivate *priv =
 | 
			
		||||
    clutter_gesture_action_get_instance_private (action);
 | 
			
		||||
  ClutterGestureActionPrivate *priv = action->priv;
 | 
			
		||||
 | 
			
		||||
  if (priv->points->len == 0)
 | 
			
		||||
  if (action->priv->points->len == 0)
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  g_array_remove_index (priv->points, position);
 | 
			
		||||
@@ -306,8 +303,7 @@ gesture_point_unset (GesturePoint *point)
 | 
			
		||||
static void
 | 
			
		||||
cancel_gesture (ClutterGestureAction *action)
 | 
			
		||||
{
 | 
			
		||||
  ClutterGestureActionPrivate *priv =
 | 
			
		||||
    clutter_gesture_action_get_instance_private (action);
 | 
			
		||||
  ClutterGestureActionPrivate *priv = action->priv;
 | 
			
		||||
  ClutterActor *actor;
 | 
			
		||||
 | 
			
		||||
  priv->in_gesture = FALSE;
 | 
			
		||||
@@ -317,15 +313,14 @@ cancel_gesture (ClutterGestureAction *action)
 | 
			
		||||
  actor = clutter_actor_meta_get_actor (CLUTTER_ACTOR_META (action));
 | 
			
		||||
  g_signal_emit (action, gesture_signals[GESTURE_CANCEL], 0, actor);
 | 
			
		||||
 | 
			
		||||
  g_array_set_size (priv->points, 0);
 | 
			
		||||
  g_array_set_size (action->priv->points, 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
begin_gesture (ClutterGestureAction *action,
 | 
			
		||||
               ClutterActor         *actor)
 | 
			
		||||
{
 | 
			
		||||
  ClutterGestureActionPrivate *priv =
 | 
			
		||||
    clutter_gesture_action_get_instance_private (action);
 | 
			
		||||
  ClutterGestureActionPrivate *priv = action->priv;
 | 
			
		||||
  gboolean return_value;
 | 
			
		||||
 | 
			
		||||
  priv->in_gesture = TRUE;
 | 
			
		||||
@@ -358,8 +353,7 @@ stage_captured_event_cb (ClutterActor         *stage,
 | 
			
		||||
                         ClutterEvent         *event,
 | 
			
		||||
                         ClutterGestureAction *action)
 | 
			
		||||
{
 | 
			
		||||
  ClutterGestureActionPrivate *priv =
 | 
			
		||||
    clutter_gesture_action_get_instance_private (action);
 | 
			
		||||
  ClutterGestureActionPrivate *priv = action->priv;
 | 
			
		||||
  ClutterActor *actor;
 | 
			
		||||
  gint position;
 | 
			
		||||
  float threshold_x, threshold_y;
 | 
			
		||||
@@ -494,8 +488,7 @@ actor_captured_event_cb (ClutterActor *actor,
 | 
			
		||||
                         ClutterEvent *event,
 | 
			
		||||
                         ClutterGestureAction *action)
 | 
			
		||||
{
 | 
			
		||||
  ClutterGestureActionPrivate *priv =
 | 
			
		||||
    clutter_gesture_action_get_instance_private (action);
 | 
			
		||||
  ClutterGestureActionPrivate *priv = action->priv;
 | 
			
		||||
  GesturePoint *point G_GNUC_UNUSED;
 | 
			
		||||
 | 
			
		||||
  if ((clutter_event_type (event) != CLUTTER_BUTTON_PRESS) &&
 | 
			
		||||
@@ -529,8 +522,7 @@ static void
 | 
			
		||||
clutter_gesture_action_set_actor (ClutterActorMeta *meta,
 | 
			
		||||
                                  ClutterActor     *actor)
 | 
			
		||||
{
 | 
			
		||||
  ClutterGestureActionPrivate *priv =
 | 
			
		||||
    clutter_gesture_action_get_instance_private (CLUTTER_GESTURE_ACTION (meta));
 | 
			
		||||
  ClutterGestureActionPrivate *priv = CLUTTER_GESTURE_ACTION (meta)->priv;
 | 
			
		||||
  ClutterActorMetaClass *meta_class =
 | 
			
		||||
    CLUTTER_ACTOR_META_CLASS (clutter_gesture_action_parent_class);
 | 
			
		||||
 | 
			
		||||
@@ -564,22 +556,6 @@ clutter_gesture_action_set_actor (ClutterActorMeta *meta,
 | 
			
		||||
  meta_class->set_actor (meta, actor);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_gesture_action_set_enabled (ClutterActorMeta *meta,
 | 
			
		||||
                                    gboolean          is_enabled)
 | 
			
		||||
{
 | 
			
		||||
  ClutterActorMetaClass *meta_class =
 | 
			
		||||
    CLUTTER_ACTOR_META_CLASS (clutter_gesture_action_parent_class);
 | 
			
		||||
  ClutterGestureAction *gesture_action = CLUTTER_GESTURE_ACTION (meta);
 | 
			
		||||
  ClutterGestureActionPrivate *priv =
 | 
			
		||||
    clutter_gesture_action_get_instance_private (gesture_action);
 | 
			
		||||
 | 
			
		||||
  if (!is_enabled && priv->in_gesture)
 | 
			
		||||
    cancel_gesture (gesture_action);
 | 
			
		||||
 | 
			
		||||
  meta_class->set_enabled (meta, is_enabled);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
default_event_handler (ClutterGestureAction *action,
 | 
			
		||||
                       ClutterActor *actor)
 | 
			
		||||
@@ -594,8 +570,6 @@ clutter_gesture_action_set_property (GObject      *gobject,
 | 
			
		||||
                                     GParamSpec   *pspec)
 | 
			
		||||
{
 | 
			
		||||
  ClutterGestureAction *self = CLUTTER_GESTURE_ACTION (gobject);
 | 
			
		||||
  ClutterGestureActionPrivate *priv =
 | 
			
		||||
    clutter_gesture_action_get_instance_private (self);
 | 
			
		||||
 | 
			
		||||
  switch (prop_id)
 | 
			
		||||
    {
 | 
			
		||||
@@ -608,15 +582,11 @@ clutter_gesture_action_set_property (GObject      *gobject,
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
    case PROP_THRESHOLD_TRIGGER_DISTANCE_X:
 | 
			
		||||
      clutter_gesture_action_set_threshold_trigger_distance (self,
 | 
			
		||||
                                                             g_value_get_float (value),
 | 
			
		||||
                                                             priv->distance_y);
 | 
			
		||||
      clutter_gesture_action_set_threshold_trigger_distance (self, g_value_get_float (value), self->priv->distance_y);
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
    case PROP_THRESHOLD_TRIGGER_DISTANCE_Y:
 | 
			
		||||
      clutter_gesture_action_set_threshold_trigger_distance (self,
 | 
			
		||||
                                                             priv->distance_x,
 | 
			
		||||
                                                             g_value_get_float (value));
 | 
			
		||||
      clutter_gesture_action_set_threshold_trigger_distance (self, self->priv->distance_x, g_value_get_float (value));
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
    default:
 | 
			
		||||
@@ -631,29 +601,28 @@ clutter_gesture_action_get_property (GObject    *gobject,
 | 
			
		||||
                                     GValue     *value,
 | 
			
		||||
                                     GParamSpec *pspec)
 | 
			
		||||
{
 | 
			
		||||
  ClutterGestureActionPrivate *priv =
 | 
			
		||||
    clutter_gesture_action_get_instance_private (CLUTTER_GESTURE_ACTION (gobject));
 | 
			
		||||
  ClutterGestureAction *self = CLUTTER_GESTURE_ACTION (gobject);
 | 
			
		||||
 | 
			
		||||
  switch (prop_id)
 | 
			
		||||
    {
 | 
			
		||||
    case PROP_N_TOUCH_POINTS:
 | 
			
		||||
      g_value_set_int (value, priv->requested_nb_points);
 | 
			
		||||
      g_value_set_int (value, self->priv->requested_nb_points);
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
    case PROP_THRESHOLD_TRIGGER_EDGE:
 | 
			
		||||
      g_value_set_enum (value, priv->edge);
 | 
			
		||||
      g_value_set_enum (value, self->priv->edge);
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
    case PROP_THRESHOLD_TRIGGER_DISTANCE_X:
 | 
			
		||||
      if (priv->distance_x > 0.0)
 | 
			
		||||
        g_value_set_float (value, priv->distance_x);
 | 
			
		||||
      if (self->priv->distance_x > 0.0)
 | 
			
		||||
        g_value_set_float (value, self->priv->distance_x);
 | 
			
		||||
      else
 | 
			
		||||
        g_value_set_float (value, gesture_get_default_threshold ());
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
    case PROP_THRESHOLD_TRIGGER_DISTANCE_Y:
 | 
			
		||||
      if (priv->distance_y > 0.0)
 | 
			
		||||
        g_value_set_float (value, priv->distance_y);
 | 
			
		||||
      if (self->priv->distance_y > 0.0)
 | 
			
		||||
        g_value_set_float (value, self->priv->distance_y);
 | 
			
		||||
      else
 | 
			
		||||
        g_value_set_float (value, gesture_get_default_threshold ());
 | 
			
		||||
      break;
 | 
			
		||||
@@ -667,8 +636,7 @@ clutter_gesture_action_get_property (GObject    *gobject,
 | 
			
		||||
static void
 | 
			
		||||
clutter_gesture_action_finalize (GObject *gobject)
 | 
			
		||||
{
 | 
			
		||||
  ClutterGestureActionPrivate *priv =
 | 
			
		||||
    clutter_gesture_action_get_instance_private (CLUTTER_GESTURE_ACTION (gobject));
 | 
			
		||||
  ClutterGestureActionPrivate *priv = CLUTTER_GESTURE_ACTION (gobject)->priv;
 | 
			
		||||
 | 
			
		||||
  g_array_unref (priv->points);
 | 
			
		||||
 | 
			
		||||
@@ -686,7 +654,6 @@ clutter_gesture_action_class_init (ClutterGestureActionClass *klass)
 | 
			
		||||
  gobject_class->get_property = clutter_gesture_action_get_property;
 | 
			
		||||
 | 
			
		||||
  meta_class->set_actor = clutter_gesture_action_set_actor;
 | 
			
		||||
  meta_class->set_enabled = clutter_gesture_action_set_enabled;
 | 
			
		||||
 | 
			
		||||
  klass->gesture_begin = default_event_handler;
 | 
			
		||||
  klass->gesture_progress = default_event_handler;
 | 
			
		||||
@@ -860,14 +827,13 @@ clutter_gesture_action_class_init (ClutterGestureActionClass *klass)
 | 
			
		||||
static void
 | 
			
		||||
clutter_gesture_action_init (ClutterGestureAction *self)
 | 
			
		||||
{
 | 
			
		||||
  ClutterGestureActionPrivate *priv =
 | 
			
		||||
    clutter_gesture_action_get_instance_private (self);
 | 
			
		||||
  self->priv = clutter_gesture_action_get_instance_private (self);
 | 
			
		||||
 | 
			
		||||
  priv->points = g_array_sized_new (FALSE, TRUE, sizeof (GesturePoint), 3);
 | 
			
		||||
  g_array_set_clear_func (priv->points, (GDestroyNotify) gesture_point_unset);
 | 
			
		||||
  self->priv->points = g_array_sized_new (FALSE, TRUE, sizeof (GesturePoint), 3);
 | 
			
		||||
  g_array_set_clear_func (self->priv->points, (GDestroyNotify) gesture_point_unset);
 | 
			
		||||
 | 
			
		||||
  priv->requested_nb_points = 1;
 | 
			
		||||
  priv->edge = CLUTTER_GESTURE_TRIGGER_EDGE_NONE;
 | 
			
		||||
  self->priv->requested_nb_points = 1;
 | 
			
		||||
  self->priv->edge = CLUTTER_GESTURE_TRIGGER_EDGE_NONE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -906,21 +872,16 @@ clutter_gesture_action_get_press_coords (ClutterGestureAction *action,
 | 
			
		||||
                                         gfloat               *press_x,
 | 
			
		||||
                                         gfloat               *press_y)
 | 
			
		||||
{
 | 
			
		||||
  ClutterGestureActionPrivate *priv;
 | 
			
		||||
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_GESTURE_ACTION (action));
 | 
			
		||||
 | 
			
		||||
  priv = clutter_gesture_action_get_instance_private (action);
 | 
			
		||||
 | 
			
		||||
  g_return_if_fail (priv->points->len > point);
 | 
			
		||||
  g_return_if_fail (action->priv->points->len > point);
 | 
			
		||||
 | 
			
		||||
  if (press_x)
 | 
			
		||||
    *press_x = g_array_index (priv->points,
 | 
			
		||||
    *press_x = g_array_index (action->priv->points,
 | 
			
		||||
                              GesturePoint,
 | 
			
		||||
                              point).press_x;
 | 
			
		||||
 | 
			
		||||
  if (press_y)
 | 
			
		||||
    *press_y = g_array_index (priv->points,
 | 
			
		||||
    *press_y = g_array_index (action->priv->points,
 | 
			
		||||
                              GesturePoint,
 | 
			
		||||
                              point).press_y;
 | 
			
		||||
}
 | 
			
		||||
@@ -946,21 +907,16 @@ clutter_gesture_action_get_motion_coords (ClutterGestureAction *action,
 | 
			
		||||
                                          gfloat               *motion_x,
 | 
			
		||||
                                          gfloat               *motion_y)
 | 
			
		||||
{
 | 
			
		||||
  ClutterGestureActionPrivate *priv;
 | 
			
		||||
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_GESTURE_ACTION (action));
 | 
			
		||||
 | 
			
		||||
  priv = clutter_gesture_action_get_instance_private (action);
 | 
			
		||||
 | 
			
		||||
  g_return_if_fail (priv->points->len > point);
 | 
			
		||||
  g_return_if_fail (action->priv->points->len > point);
 | 
			
		||||
 | 
			
		||||
  if (motion_x)
 | 
			
		||||
    *motion_x = g_array_index (priv->points,
 | 
			
		||||
    *motion_x = g_array_index (action->priv->points,
 | 
			
		||||
                               GesturePoint,
 | 
			
		||||
                               point).last_motion_x;
 | 
			
		||||
 | 
			
		||||
  if (motion_y)
 | 
			
		||||
    *motion_y = g_array_index (priv->points,
 | 
			
		||||
    *motion_y = g_array_index (action->priv->points,
 | 
			
		||||
                               GesturePoint,
 | 
			
		||||
                               point).last_motion_y;
 | 
			
		||||
}
 | 
			
		||||
@@ -988,19 +944,15 @@ clutter_gesture_action_get_motion_delta (ClutterGestureAction *action,
 | 
			
		||||
                                         gfloat               *delta_x,
 | 
			
		||||
                                         gfloat               *delta_y)
 | 
			
		||||
{
 | 
			
		||||
  ClutterGestureActionPrivate *priv;
 | 
			
		||||
  gfloat d_x, d_y;
 | 
			
		||||
 | 
			
		||||
  g_return_val_if_fail (CLUTTER_IS_GESTURE_ACTION (action), 0);
 | 
			
		||||
  g_return_val_if_fail (action->priv->points->len > point, 0);
 | 
			
		||||
 | 
			
		||||
  priv = clutter_gesture_action_get_instance_private (action);
 | 
			
		||||
 | 
			
		||||
  g_return_val_if_fail (priv->points->len > point, 0);
 | 
			
		||||
 | 
			
		||||
  d_x = g_array_index (priv->points,
 | 
			
		||||
  d_x = g_array_index (action->priv->points,
 | 
			
		||||
                       GesturePoint,
 | 
			
		||||
                       point).last_delta_x;
 | 
			
		||||
  d_y = g_array_index (priv->points,
 | 
			
		||||
  d_y = g_array_index (action->priv->points,
 | 
			
		||||
                       GesturePoint,
 | 
			
		||||
                       point).last_delta_y;
 | 
			
		||||
 | 
			
		||||
@@ -1034,21 +986,16 @@ clutter_gesture_action_get_release_coords (ClutterGestureAction *action,
 | 
			
		||||
                                           gfloat               *release_x,
 | 
			
		||||
                                           gfloat               *release_y)
 | 
			
		||||
{
 | 
			
		||||
  ClutterGestureActionPrivate *priv;
 | 
			
		||||
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_GESTURE_ACTION (action));
 | 
			
		||||
 | 
			
		||||
  priv = clutter_gesture_action_get_instance_private (action);
 | 
			
		||||
 | 
			
		||||
  g_return_if_fail (priv->points->len > point);
 | 
			
		||||
  g_return_if_fail (action->priv->points->len > point);
 | 
			
		||||
 | 
			
		||||
  if (release_x)
 | 
			
		||||
    *release_x = g_array_index (priv->points,
 | 
			
		||||
    *release_x = g_array_index (action->priv->points,
 | 
			
		||||
                                GesturePoint,
 | 
			
		||||
                                point).release_x;
 | 
			
		||||
 | 
			
		||||
  if (release_y)
 | 
			
		||||
    *release_y = g_array_index (priv->points,
 | 
			
		||||
    *release_y = g_array_index (action->priv->points,
 | 
			
		||||
                                GesturePoint,
 | 
			
		||||
                                point).release_y;
 | 
			
		||||
}
 | 
			
		||||
@@ -1074,20 +1021,16 @@ clutter_gesture_action_get_velocity (ClutterGestureAction *action,
 | 
			
		||||
                                     gfloat               *velocity_x,
 | 
			
		||||
                                     gfloat               *velocity_y)
 | 
			
		||||
{
 | 
			
		||||
  ClutterGestureActionPrivate *priv;
 | 
			
		||||
  gfloat d_x, d_y, distance, velocity;
 | 
			
		||||
  gint64 d_t;
 | 
			
		||||
 | 
			
		||||
  g_return_val_if_fail (CLUTTER_IS_GESTURE_ACTION (action), 0);
 | 
			
		||||
 | 
			
		||||
  priv = clutter_gesture_action_get_instance_private (action);
 | 
			
		||||
 | 
			
		||||
  g_return_val_if_fail (priv->points->len > point, 0);
 | 
			
		||||
  g_return_val_if_fail (action->priv->points->len > point, 0);
 | 
			
		||||
 | 
			
		||||
  distance = clutter_gesture_action_get_motion_delta (action, point,
 | 
			
		||||
                                                      &d_x, &d_y);
 | 
			
		||||
 | 
			
		||||
  d_t = g_array_index (priv->points,
 | 
			
		||||
  d_t = g_array_index (action->priv->points,
 | 
			
		||||
                       GesturePoint,
 | 
			
		||||
                       point).last_delta_time;
 | 
			
		||||
 | 
			
		||||
@@ -1114,13 +1057,9 @@ clutter_gesture_action_get_velocity (ClutterGestureAction *action,
 | 
			
		||||
gint
 | 
			
		||||
clutter_gesture_action_get_n_touch_points (ClutterGestureAction *action)
 | 
			
		||||
{
 | 
			
		||||
  ClutterGestureActionPrivate *priv;
 | 
			
		||||
 | 
			
		||||
  g_return_val_if_fail (CLUTTER_IS_GESTURE_ACTION (action), 0);
 | 
			
		||||
 | 
			
		||||
  priv = clutter_gesture_action_get_instance_private (action);
 | 
			
		||||
 | 
			
		||||
  return priv->requested_nb_points;
 | 
			
		||||
  return action->priv->requested_nb_points;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -1141,7 +1080,7 @@ clutter_gesture_action_set_n_touch_points (ClutterGestureAction *action,
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_GESTURE_ACTION (action));
 | 
			
		||||
  g_return_if_fail (nb_points >= 1);
 | 
			
		||||
 | 
			
		||||
  priv = clutter_gesture_action_get_instance_private (action);
 | 
			
		||||
  priv = action->priv;
 | 
			
		||||
 | 
			
		||||
  if (priv->requested_nb_points == nb_points)
 | 
			
		||||
    return;
 | 
			
		||||
@@ -1195,13 +1134,9 @@ clutter_gesture_action_set_n_touch_points (ClutterGestureAction *action,
 | 
			
		||||
guint
 | 
			
		||||
clutter_gesture_action_get_n_current_points (ClutterGestureAction *action)
 | 
			
		||||
{
 | 
			
		||||
  ClutterGestureActionPrivate *priv;
 | 
			
		||||
 | 
			
		||||
  g_return_val_if_fail (CLUTTER_IS_GESTURE_ACTION (action), 0);
 | 
			
		||||
 | 
			
		||||
  priv = clutter_gesture_action_get_instance_private (action);
 | 
			
		||||
 | 
			
		||||
  return priv->points->len;
 | 
			
		||||
  return action->priv->points->len;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -1219,15 +1154,10 @@ ClutterEventSequence *
 | 
			
		||||
clutter_gesture_action_get_sequence (ClutterGestureAction *action,
 | 
			
		||||
                                     guint                 point)
 | 
			
		||||
{
 | 
			
		||||
  ClutterGestureActionPrivate *priv;
 | 
			
		||||
 | 
			
		||||
  g_return_val_if_fail (CLUTTER_IS_GESTURE_ACTION (action), NULL);
 | 
			
		||||
  g_return_val_if_fail (action->priv->points->len > point, NULL);
 | 
			
		||||
 | 
			
		||||
  priv = clutter_gesture_action_get_instance_private (action);
 | 
			
		||||
 | 
			
		||||
  g_return_val_if_fail (priv->points->len > point, NULL);
 | 
			
		||||
 | 
			
		||||
  return g_array_index (priv->points, GesturePoint, point).sequence;
 | 
			
		||||
  return g_array_index (action->priv->points, GesturePoint, point).sequence;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -1246,15 +1176,10 @@ ClutterInputDevice *
 | 
			
		||||
clutter_gesture_action_get_device (ClutterGestureAction *action,
 | 
			
		||||
                                   guint                 point)
 | 
			
		||||
{
 | 
			
		||||
  ClutterGestureActionPrivate *priv;
 | 
			
		||||
 | 
			
		||||
  g_return_val_if_fail (CLUTTER_IS_GESTURE_ACTION (action), NULL);
 | 
			
		||||
  g_return_val_if_fail (action->priv->points->len > point, NULL);
 | 
			
		||||
 | 
			
		||||
  priv = clutter_gesture_action_get_instance_private (action);
 | 
			
		||||
 | 
			
		||||
  g_return_val_if_fail (priv->points->len > point, NULL);
 | 
			
		||||
 | 
			
		||||
  return g_array_index (priv->points, GesturePoint, point).device;
 | 
			
		||||
  return g_array_index (action->priv->points, GesturePoint, point).device;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -1274,15 +1199,11 @@ clutter_gesture_action_get_last_event (ClutterGestureAction *action,
 | 
			
		||||
                                       guint                 point)
 | 
			
		||||
{
 | 
			
		||||
  GesturePoint *gesture_point;
 | 
			
		||||
  ClutterGestureActionPrivate *priv;
 | 
			
		||||
 | 
			
		||||
  g_return_val_if_fail (CLUTTER_IS_GESTURE_ACTION (action), NULL);
 | 
			
		||||
  g_return_val_if_fail (action->priv->points->len > point, NULL);
 | 
			
		||||
 | 
			
		||||
  priv = clutter_gesture_action_get_instance_private (action);
 | 
			
		||||
 | 
			
		||||
  g_return_val_if_fail (priv->points->len > point, NULL);
 | 
			
		||||
 | 
			
		||||
  gesture_point = &g_array_index (priv->points, GesturePoint, point);
 | 
			
		||||
  gesture_point = &g_array_index (action->priv->points, GesturePoint, point);
 | 
			
		||||
 | 
			
		||||
  return gesture_point->last_event;
 | 
			
		||||
}
 | 
			
		||||
@@ -1319,16 +1240,12 @@ void
 | 
			
		||||
clutter_gesture_action_set_threshold_trigger_edge (ClutterGestureAction      *action,
 | 
			
		||||
                                                   ClutterGestureTriggerEdge  edge)
 | 
			
		||||
{
 | 
			
		||||
  ClutterGestureActionPrivate *priv;
 | 
			
		||||
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_GESTURE_ACTION (action));
 | 
			
		||||
 | 
			
		||||
  priv = clutter_gesture_action_get_instance_private (action);
 | 
			
		||||
 | 
			
		||||
  if (priv->edge == edge)
 | 
			
		||||
  if (action->priv->edge == edge)
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  priv->edge = edge;
 | 
			
		||||
  action->priv->edge = edge;
 | 
			
		||||
 | 
			
		||||
  g_object_notify_by_pspec (G_OBJECT (action), gesture_props[PROP_THRESHOLD_TRIGGER_EDGE]);
 | 
			
		||||
}
 | 
			
		||||
@@ -1347,14 +1264,10 @@ clutter_gesture_action_set_threshold_trigger_edge (ClutterGestureAction      *ac
 | 
			
		||||
ClutterGestureTriggerEdge
 | 
			
		||||
clutter_gesture_action_get_threshold_trigger_edge (ClutterGestureAction *action)
 | 
			
		||||
{
 | 
			
		||||
  ClutterGestureActionPrivate *priv;
 | 
			
		||||
 | 
			
		||||
  g_return_val_if_fail (CLUTTER_IS_GESTURE_ACTION (action),
 | 
			
		||||
                        CLUTTER_GESTURE_TRIGGER_EDGE_NONE);
 | 
			
		||||
 | 
			
		||||
  priv = clutter_gesture_action_get_instance_private (action);
 | 
			
		||||
 | 
			
		||||
  return priv->edge;
 | 
			
		||||
  return action->priv->edge;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -1394,21 +1307,17 @@ clutter_gesture_action_set_threshold_trigger_distance (ClutterGestureAction
 | 
			
		||||
                                                       float                      x,
 | 
			
		||||
                                                       float                      y)
 | 
			
		||||
{
 | 
			
		||||
  ClutterGestureActionPrivate *priv;
 | 
			
		||||
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_GESTURE_ACTION (action));
 | 
			
		||||
 | 
			
		||||
  priv = clutter_gesture_action_get_instance_private (action);
 | 
			
		||||
 | 
			
		||||
  if (fabsf (x - priv->distance_x) > FLOAT_EPSILON)
 | 
			
		||||
  if (fabsf (x - action->priv->distance_x) > FLOAT_EPSILON)
 | 
			
		||||
    {
 | 
			
		||||
      priv->distance_x = x;
 | 
			
		||||
      action->priv->distance_x = x;
 | 
			
		||||
      g_object_notify_by_pspec (G_OBJECT (action), gesture_props[PROP_THRESHOLD_TRIGGER_DISTANCE_X]);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  if (fabsf (y - priv->distance_y) > FLOAT_EPSILON)
 | 
			
		||||
  if (fabsf (y - action->priv->distance_y) > FLOAT_EPSILON)
 | 
			
		||||
    {
 | 
			
		||||
      priv->distance_y = y;
 | 
			
		||||
      action->priv->distance_y = y;
 | 
			
		||||
      g_object_notify_by_pspec (G_OBJECT (action), gesture_props[PROP_THRESHOLD_TRIGGER_DISTANCE_Y]);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1429,23 +1338,19 @@ clutter_gesture_action_get_threshold_trigger_distance (ClutterGestureAction *act
 | 
			
		||||
                                                       float                *x,
 | 
			
		||||
                                                       float                *y)
 | 
			
		||||
{
 | 
			
		||||
  ClutterGestureActionPrivate *priv;
 | 
			
		||||
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_GESTURE_ACTION (action));
 | 
			
		||||
 | 
			
		||||
  priv = clutter_gesture_action_get_instance_private (action);
 | 
			
		||||
 | 
			
		||||
  if (x != NULL)
 | 
			
		||||
    {
 | 
			
		||||
      if (priv->distance_x > 0.0)
 | 
			
		||||
        *x = priv->distance_x;
 | 
			
		||||
      if (action->priv->distance_x > 0.0)
 | 
			
		||||
        *x = action->priv->distance_x;
 | 
			
		||||
      else
 | 
			
		||||
        *x = gesture_get_default_threshold ();
 | 
			
		||||
    }
 | 
			
		||||
  if (y != NULL)
 | 
			
		||||
    {
 | 
			
		||||
      if (priv->distance_y > 0.0)
 | 
			
		||||
        *y = priv->distance_y;
 | 
			
		||||
      if (action->priv->distance_y > 0.0)
 | 
			
		||||
        *y = action->priv->distance_y;
 | 
			
		||||
      else
 | 
			
		||||
        *y = gesture_get_default_threshold ();
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -34,13 +34,32 @@
 | 
			
		||||
 | 
			
		||||
G_BEGIN_DECLS
 | 
			
		||||
 | 
			
		||||
#define CLUTTER_TYPE_GESTURE_ACTION (clutter_gesture_action_get_type ())
 | 
			
		||||
#define CLUTTER_TYPE_GESTURE_ACTION               (clutter_gesture_action_get_type ())
 | 
			
		||||
#define CLUTTER_GESTURE_ACTION(obj)               (G_TYPE_CHECK_INSTANCE_CAST ((obj), CLUTTER_TYPE_GESTURE_ACTION, ClutterGestureAction))
 | 
			
		||||
#define CLUTTER_IS_GESTURE_ACTION(obj)            (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CLUTTER_TYPE_GESTURE_ACTION))
 | 
			
		||||
#define CLUTTER_GESTURE_ACTION_CLASS(klass)       (G_TYPE_CHECK_CLASS_CAST ((klass), CLUTTER_TYPE_GESTURE_ACTION, ClutterGestureActionClass))
 | 
			
		||||
#define CLUTTER_IS_GESTURE_ACTION_CLASS(klass)    (G_TYPE_CHECK_CLASS_TYPE ((klass), CLUTTER_TYPE_GESTURE_ACTION))
 | 
			
		||||
#define CLUTTER_GESTURE_ACTION_GET_CLASS(obj)     (G_TYPE_INSTANCE_GET_CLASS ((obj), CLUTTER_TYPE_GESTURE_ACTION, ClutterGestureActionClass))
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
G_DECLARE_DERIVABLE_TYPE (ClutterGestureAction, clutter_gesture_action,
 | 
			
		||||
                          CLUTTER, GESTURE_ACTION, ClutterAction);
 | 
			
		||||
typedef struct _ClutterGestureAction              ClutterGestureAction;
 | 
			
		||||
typedef struct _ClutterGestureActionPrivate       ClutterGestureActionPrivate;
 | 
			
		||||
typedef struct _ClutterGestureActionClass         ClutterGestureActionClass;
 | 
			
		||||
 | 
			
		||||
typedef struct _ClutterGestureActionPrivate ClutterGestureActionPrivate;
 | 
			
		||||
/**
 | 
			
		||||
 * ClutterGestureAction:
 | 
			
		||||
 *
 | 
			
		||||
 * The #ClutterGestureAction structure contains
 | 
			
		||||
 * only private data and should be accessed using the provided API
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 1.8
 | 
			
		||||
 */
 | 
			
		||||
struct _ClutterGestureAction
 | 
			
		||||
{
 | 
			
		||||
  /*< private >*/
 | 
			
		||||
  ClutterAction parent_instance;
 | 
			
		||||
 | 
			
		||||
  ClutterGestureActionPrivate *priv;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ClutterGestureActionClass:
 | 
			
		||||
@@ -82,6 +101,9 @@ struct _ClutterGestureActionClass
 | 
			
		||||
  void (* _clutter_gesture_action6) (void);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
GType clutter_gesture_action_get_type (void) G_GNUC_CONST;
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
ClutterAction *        clutter_gesture_action_new                      (void);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1391,7 +1391,8 @@ allocate_child (ClutterGridRequest *request,
 | 
			
		||||
static void
 | 
			
		||||
clutter_grid_layout_allocate (ClutterLayoutManager   *layout,
 | 
			
		||||
                              ClutterContainer       *container,
 | 
			
		||||
                              const ClutterActorBox  *allocation)
 | 
			
		||||
                              const ClutterActorBox  *allocation,
 | 
			
		||||
                              ClutterAllocationFlags  flags)
 | 
			
		||||
{
 | 
			
		||||
  ClutterGridLayout *self = CLUTTER_GRID_LAYOUT (layout);
 | 
			
		||||
  ClutterOrientation orientation;
 | 
			
		||||
@@ -1452,7 +1453,7 @@ clutter_grid_layout_allocate (ClutterLayoutManager   *layout,
 | 
			
		||||
      child_allocation.x2 = child_allocation.x1 + width;
 | 
			
		||||
      child_allocation.y2 = child_allocation.y1 + height;
 | 
			
		||||
 | 
			
		||||
      clutter_actor_allocate (child, &child_allocation);
 | 
			
		||||
      clutter_actor_allocate (child, &child_allocation, flags);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -130,7 +130,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);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -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 */
 | 
			
		||||
@@ -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)
 | 
			
		||||
    {
 | 
			
		||||
@@ -171,8 +170,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 +246,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 +361,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 +799,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
 | 
			
		||||
@@ -1016,7 +1017,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,9 +1031,9 @@ 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;
 | 
			
		||||
@@ -1223,11 +1224,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);
 | 
			
		||||
@@ -2440,19 +2441,3 @@ 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)
 | 
			
		||||
{
 | 
			
		||||
  g_return_val_if_fail (CLUTTER_IS_INPUT_DEVICE (device), NULL);
 | 
			
		||||
 | 
			
		||||
  return device->seat;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -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))
 | 
			
		||||
@@ -201,8 +171,6 @@ void                      clutter_input_device_set_mapping_mode (ClutterInputDev
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
gboolean                  clutter_input_device_is_grouped       (ClutterInputDevice *device,
 | 
			
		||||
                                                                 ClutterInputDevice *other_device);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
ClutterSeat *             clutter_input_device_get_seat         (ClutterInputDevice *device);
 | 
			
		||||
 | 
			
		||||
G_END_DECLS
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -29,7 +29,7 @@ void clutter_input_focus_focus_out (ClutterInputFocus  *focus);
 | 
			
		||||
void clutter_input_focus_commit (ClutterInputFocus *focus,
 | 
			
		||||
                                 const gchar       *text);
 | 
			
		||||
void clutter_input_focus_delete_surrounding (ClutterInputFocus *focus,
 | 
			
		||||
                                             int                offset,
 | 
			
		||||
                                             guint              offset,
 | 
			
		||||
                                             guint              len);
 | 
			
		||||
void clutter_input_focus_request_surrounding (ClutterInputFocus *focus);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -217,7 +217,7 @@ clutter_input_focus_commit (ClutterInputFocus *focus,
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
clutter_input_focus_delete_surrounding (ClutterInputFocus *focus,
 | 
			
		||||
                                        int                offset,
 | 
			
		||||
                                        guint              offset,
 | 
			
		||||
                                        guint              len)
 | 
			
		||||
{
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_INPUT_FOCUS (focus));
 | 
			
		||||
 
 | 
			
		||||
@@ -41,7 +41,7 @@ struct _ClutterInputFocusClass
 | 
			
		||||
 | 
			
		||||
  void (* request_surrounding) (ClutterInputFocus *focus);
 | 
			
		||||
  void (* delete_surrounding)  (ClutterInputFocus *focus,
 | 
			
		||||
                                int                offset,
 | 
			
		||||
                                guint              offset,
 | 
			
		||||
                                guint              len);
 | 
			
		||||
  void (* commit_text) (ClutterInputFocus *focus,
 | 
			
		||||
                        const gchar       *text);
 | 
			
		||||
 
 | 
			
		||||
@@ -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;
 | 
			
		||||
 | 
			
		||||
@@ -168,7 +168,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, 2, G_TYPE_INT, G_TYPE_UINT);
 | 
			
		||||
                  G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_UINT);
 | 
			
		||||
  signals[REQUEST_SURROUNDING] =
 | 
			
		||||
    g_signal_new ("request-surrounding",
 | 
			
		||||
                  G_TYPE_FROM_CLASS (object_class),
 | 
			
		||||
@@ -292,7 +292,7 @@ clutter_input_method_commit (ClutterInputMethod *im,
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
clutter_input_method_delete_surrounding (ClutterInputMethod *im,
 | 
			
		||||
                                         int                 offset,
 | 
			
		||||
                                         guint               offset,
 | 
			
		||||
                                         guint               len)
 | 
			
		||||
{
 | 
			
		||||
  ClutterInputMethodPrivate *priv;
 | 
			
		||||
@@ -452,8 +452,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 +463,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;
 | 
			
		||||
 
 | 
			
		||||
@@ -68,7 +68,7 @@ void clutter_input_method_commit (ClutterInputMethod *im,
 | 
			
		||||
                                  const gchar        *text);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void clutter_input_method_delete_surrounding (ClutterInputMethod *im,
 | 
			
		||||
                                              int                 offset,
 | 
			
		||||
                                              guint               offset,
 | 
			
		||||
                                              guint               len);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void clutter_input_method_request_surrounding (ClutterInputMethod *im);
 | 
			
		||||
 
 | 
			
		||||
@@ -25,9 +25,10 @@
 | 
			
		||||
 | 
			
		||||
#include "clutter-build-config.h"
 | 
			
		||||
 | 
			
		||||
#include "clutter-device-manager.h"
 | 
			
		||||
#include "clutter-device-manager-private.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"
 | 
			
		||||
@@ -37,7 +38,7 @@ is_secondary_click_enabled (ClutterInputDevice *device)
 | 
			
		||||
{
 | 
			
		||||
  ClutterPointerA11ySettings settings;
 | 
			
		||||
 | 
			
		||||
  clutter_seat_get_pointer_a11y_settings (device->seat, &settings);
 | 
			
		||||
  clutter_device_manager_get_pointer_a11y_settings (device->device_manager, &settings);
 | 
			
		||||
 | 
			
		||||
  return (settings.controls & CLUTTER_A11Y_SECONDARY_CLICK_ENABLED);
 | 
			
		||||
}
 | 
			
		||||
@@ -47,7 +48,7 @@ is_dwell_click_enabled (ClutterInputDevice *device)
 | 
			
		||||
{
 | 
			
		||||
  ClutterPointerA11ySettings settings;
 | 
			
		||||
 | 
			
		||||
  clutter_seat_get_pointer_a11y_settings (device->seat, &settings);
 | 
			
		||||
  clutter_device_manager_get_pointer_a11y_settings (device->device_manager, &settings);
 | 
			
		||||
 | 
			
		||||
  return (settings.controls & CLUTTER_A11Y_DWELL_ENABLED);
 | 
			
		||||
}
 | 
			
		||||
@@ -57,7 +58,7 @@ get_secondary_click_delay (ClutterInputDevice *device)
 | 
			
		||||
{
 | 
			
		||||
  ClutterPointerA11ySettings settings;
 | 
			
		||||
 | 
			
		||||
  clutter_seat_get_pointer_a11y_settings (device->seat, &settings);
 | 
			
		||||
  clutter_device_manager_get_pointer_a11y_settings (device->device_manager, &settings);
 | 
			
		||||
 | 
			
		||||
  return settings.secondary_click_delay;
 | 
			
		||||
}
 | 
			
		||||
@@ -67,7 +68,7 @@ get_dwell_delay (ClutterInputDevice *device)
 | 
			
		||||
{
 | 
			
		||||
  ClutterPointerA11ySettings settings;
 | 
			
		||||
 | 
			
		||||
  clutter_seat_get_pointer_a11y_settings (device->seat, &settings);
 | 
			
		||||
  clutter_device_manager_get_pointer_a11y_settings (device->device_manager, &settings);
 | 
			
		||||
 | 
			
		||||
  return settings.dwell_delay;
 | 
			
		||||
}
 | 
			
		||||
@@ -77,7 +78,7 @@ get_dwell_threshold (ClutterInputDevice *device)
 | 
			
		||||
{
 | 
			
		||||
  ClutterPointerA11ySettings settings;
 | 
			
		||||
 | 
			
		||||
  clutter_seat_get_pointer_a11y_settings (device->seat, &settings);
 | 
			
		||||
  clutter_device_manager_get_pointer_a11y_settings (device->device_manager, &settings);
 | 
			
		||||
 | 
			
		||||
  return settings.dwell_threshold;
 | 
			
		||||
}
 | 
			
		||||
@@ -87,7 +88,7 @@ get_dwell_mode (ClutterInputDevice *device)
 | 
			
		||||
{
 | 
			
		||||
  ClutterPointerA11ySettings settings;
 | 
			
		||||
 | 
			
		||||
  clutter_seat_get_pointer_a11y_settings (device->seat, &settings);
 | 
			
		||||
  clutter_device_manager_get_pointer_a11y_settings (device->device_manager, &settings);
 | 
			
		||||
 | 
			
		||||
  return settings.dwell_mode;
 | 
			
		||||
}
 | 
			
		||||
@@ -97,7 +98,7 @@ get_dwell_click_type (ClutterInputDevice *device)
 | 
			
		||||
{
 | 
			
		||||
  ClutterPointerA11ySettings settings;
 | 
			
		||||
 | 
			
		||||
  clutter_seat_get_pointer_a11y_settings (device->seat, &settings);
 | 
			
		||||
  clutter_device_manager_get_pointer_a11y_settings (device->device_manager, &settings);
 | 
			
		||||
 | 
			
		||||
  return settings.dwell_click_type;
 | 
			
		||||
}
 | 
			
		||||
@@ -108,7 +109,7 @@ get_dwell_click_type_for_direction (ClutterInputDevice               *device,
 | 
			
		||||
{
 | 
			
		||||
  ClutterPointerA11ySettings settings;
 | 
			
		||||
 | 
			
		||||
  clutter_seat_get_pointer_a11y_settings (device->seat, &settings);
 | 
			
		||||
  clutter_device_manager_get_pointer_a11y_settings (device->device_manager, &settings);
 | 
			
		||||
 | 
			
		||||
  if (direction == settings.dwell_gesture_single)
 | 
			
		||||
    return CLUTTER_A11Y_DWELL_CLICK_TYPE_PRIMARY;
 | 
			
		||||
@@ -167,7 +168,7 @@ trigger_secondary_click (gpointer data)
 | 
			
		||||
  device->ptr_a11y_data->secondary_click_triggered = TRUE;
 | 
			
		||||
  device->ptr_a11y_data->secondary_click_timer = 0;
 | 
			
		||||
 | 
			
		||||
  g_signal_emit_by_name (device->seat,
 | 
			
		||||
  g_signal_emit_by_name (device->device_manager,
 | 
			
		||||
                         "ptr-a11y-timeout-stopped",
 | 
			
		||||
                         device,
 | 
			
		||||
                         CLUTTER_A11Y_TIMEOUT_TYPE_SECONDARY_CLICK,
 | 
			
		||||
@@ -184,7 +185,7 @@ start_secondary_click_timeout (ClutterInputDevice *device)
 | 
			
		||||
  device->ptr_a11y_data->secondary_click_timer =
 | 
			
		||||
    clutter_threads_add_timeout (delay, trigger_secondary_click, device);
 | 
			
		||||
 | 
			
		||||
  g_signal_emit_by_name (device->seat,
 | 
			
		||||
  g_signal_emit_by_name (device->device_manager,
 | 
			
		||||
                         "ptr-a11y-timeout-started",
 | 
			
		||||
                         device,
 | 
			
		||||
                         CLUTTER_A11Y_TIMEOUT_TYPE_SECONDARY_CLICK,
 | 
			
		||||
@@ -199,7 +200,7 @@ stop_secondary_click_timeout (ClutterInputDevice *device)
 | 
			
		||||
      g_clear_handle_id (&device->ptr_a11y_data->secondary_click_timer,
 | 
			
		||||
                         g_source_remove);
 | 
			
		||||
 | 
			
		||||
      g_signal_emit_by_name (device->seat,
 | 
			
		||||
      g_signal_emit_by_name (device->device_manager,
 | 
			
		||||
                             "ptr-a11y-timeout-stopped",
 | 
			
		||||
                             device,
 | 
			
		||||
                             CLUTTER_A11Y_TIMEOUT_TYPE_SECONDARY_CLICK,
 | 
			
		||||
@@ -303,7 +304,7 @@ update_dwell_click_type (ClutterInputDevice *device)
 | 
			
		||||
  ClutterPointerA11ySettings settings;
 | 
			
		||||
  ClutterPointerA11yDwellClickType dwell_click_type;
 | 
			
		||||
 | 
			
		||||
  clutter_seat_get_pointer_a11y_settings (device->seat, &settings);
 | 
			
		||||
  clutter_device_manager_get_pointer_a11y_settings (device->device_manager, &settings);
 | 
			
		||||
 | 
			
		||||
  dwell_click_type = settings.dwell_click_type;
 | 
			
		||||
  switch (dwell_click_type)
 | 
			
		||||
@@ -328,9 +329,10 @@ update_dwell_click_type (ClutterInputDevice *device)
 | 
			
		||||
  if (dwell_click_type != settings.dwell_click_type)
 | 
			
		||||
    {
 | 
			
		||||
      settings.dwell_click_type = dwell_click_type;
 | 
			
		||||
      clutter_seat_set_pointer_a11y_settings (device->seat, &settings);
 | 
			
		||||
      clutter_device_manager_set_pointer_a11y_settings (device->device_manager,
 | 
			
		||||
                                                        &settings);
 | 
			
		||||
 | 
			
		||||
      g_signal_emit_by_name (device->seat,
 | 
			
		||||
      g_signal_emit_by_name (device->device_manager,
 | 
			
		||||
                             "ptr-a11y-dwell-click-type-changed",
 | 
			
		||||
                             dwell_click_type);
 | 
			
		||||
    }
 | 
			
		||||
@@ -435,7 +437,7 @@ trigger_dwell_gesture (gpointer data)
 | 
			
		||||
  device->ptr_a11y_data->dwell_timer =
 | 
			
		||||
    clutter_threads_add_timeout (delay, trigger_clear_dwell_gesture, device);
 | 
			
		||||
 | 
			
		||||
  g_signal_emit_by_name (device->seat,
 | 
			
		||||
  g_signal_emit_by_name (device->device_manager,
 | 
			
		||||
                         "ptr-a11y-timeout-stopped",
 | 
			
		||||
                         device,
 | 
			
		||||
                         CLUTTER_A11Y_TIMEOUT_TYPE_GESTURE,
 | 
			
		||||
@@ -453,7 +455,7 @@ start_dwell_gesture_timeout (ClutterInputDevice *device)
 | 
			
		||||
    clutter_threads_add_timeout (delay, trigger_dwell_gesture, device);
 | 
			
		||||
  device->ptr_a11y_data->dwell_gesture_started = TRUE;
 | 
			
		||||
 | 
			
		||||
  g_signal_emit_by_name (device->seat,
 | 
			
		||||
  g_signal_emit_by_name (device->device_manager,
 | 
			
		||||
                         "ptr-a11y-timeout-started",
 | 
			
		||||
                         device,
 | 
			
		||||
                         CLUTTER_A11Y_TIMEOUT_TYPE_GESTURE,
 | 
			
		||||
@@ -467,7 +469,7 @@ trigger_dwell_click (gpointer data)
 | 
			
		||||
 | 
			
		||||
  device->ptr_a11y_data->dwell_timer = 0;
 | 
			
		||||
 | 
			
		||||
  g_signal_emit_by_name (device->seat,
 | 
			
		||||
  g_signal_emit_by_name (device->device_manager,
 | 
			
		||||
                         "ptr-a11y-timeout-stopped",
 | 
			
		||||
                         device,
 | 
			
		||||
                         CLUTTER_A11Y_TIMEOUT_TYPE_DWELL,
 | 
			
		||||
@@ -497,7 +499,7 @@ start_dwell_timeout (ClutterInputDevice *device)
 | 
			
		||||
  device->ptr_a11y_data->dwell_timer =
 | 
			
		||||
    clutter_threads_add_timeout (delay, trigger_dwell_click, device);
 | 
			
		||||
 | 
			
		||||
  g_signal_emit_by_name (device->seat,
 | 
			
		||||
  g_signal_emit_by_name (device->device_manager,
 | 
			
		||||
                         "ptr-a11y-timeout-started",
 | 
			
		||||
                         device,
 | 
			
		||||
                         CLUTTER_A11Y_TIMEOUT_TYPE_DWELL,
 | 
			
		||||
@@ -512,7 +514,7 @@ stop_dwell_timeout (ClutterInputDevice *device)
 | 
			
		||||
      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,
 | 
			
		||||
      g_signal_emit_by_name (device->device_manager,
 | 
			
		||||
                             "ptr-a11y-timeout-stopped",
 | 
			
		||||
                             device,
 | 
			
		||||
                             CLUTTER_A11Y_TIMEOUT_TYPE_DWELL,
 | 
			
		||||
@@ -571,7 +573,8 @@ is_device_core_pointer (ClutterInputDevice *device)
 | 
			
		||||
{
 | 
			
		||||
  ClutterInputDevice *core_pointer;
 | 
			
		||||
 | 
			
		||||
  core_pointer = clutter_seat_get_pointer (device->seat);
 | 
			
		||||
  core_pointer = clutter_device_manager_get_core_device (device->device_manager,
 | 
			
		||||
                                                         CLUTTER_POINTER_DEVICE);
 | 
			
		||||
  if (core_pointer == NULL)
 | 
			
		||||
    return FALSE;
 | 
			
		||||
 | 
			
		||||
@@ -585,8 +588,8 @@ _clutter_input_pointer_a11y_add_device (ClutterInputDevice *device)
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  device->accessibility_virtual_device =
 | 
			
		||||
    clutter_seat_create_virtual_device (device->seat,
 | 
			
		||||
                                        CLUTTER_POINTER_DEVICE);
 | 
			
		||||
    clutter_device_manager_create_virtual_device (device->device_manager,
 | 
			
		||||
                                                  CLUTTER_POINTER_DEVICE);
 | 
			
		||||
 | 
			
		||||
  device->ptr_a11y_data = g_new0 (ClutterPtrA11yData, 1);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -37,6 +37,9 @@
 | 
			
		||||
 * any object taking a reference on a #ClutterInterval instance should
 | 
			
		||||
 * also take ownership of the interval by using g_object_ref_sink().
 | 
			
		||||
 *
 | 
			
		||||
 * #ClutterInterval is used by #ClutterAnimation to define the
 | 
			
		||||
 * interval of values that an implicit animation should tween over.
 | 
			
		||||
 *
 | 
			
		||||
 * #ClutterInterval can be subclassed to override the validation
 | 
			
		||||
 * and value computation.
 | 
			
		||||
 *
 | 
			
		||||
 
 | 
			
		||||
@@ -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 */
 | 
			
		||||
 
 | 
			
		||||
@@ -136,6 +136,7 @@
 | 
			
		||||
 | 
			
		||||
#define CLUTTER_DISABLE_DEPRECATION_WARNINGS
 | 
			
		||||
#include "deprecated/clutter-container.h"
 | 
			
		||||
#include "deprecated/clutter-alpha.h"
 | 
			
		||||
 | 
			
		||||
#include "clutter-debug.h"
 | 
			
		||||
#include "clutter-layout-manager.h"
 | 
			
		||||
@@ -163,6 +164,7 @@ G_DEFINE_ABSTRACT_TYPE (ClutterLayoutManager,
 | 
			
		||||
                        G_TYPE_INITIALLY_UNOWNED)
 | 
			
		||||
 | 
			
		||||
static GQuark quark_layout_meta  = 0;
 | 
			
		||||
static GQuark quark_layout_alpha = 0;
 | 
			
		||||
 | 
			
		||||
static guint manager_signals[LAST_SIGNAL] = { 0, };
 | 
			
		||||
 | 
			
		||||
@@ -253,7 +255,8 @@ layout_manager_real_get_preferred_height (ClutterLayoutManager *manager,
 | 
			
		||||
static void
 | 
			
		||||
layout_manager_real_allocate (ClutterLayoutManager   *manager,
 | 
			
		||||
                              ClutterContainer       *container,
 | 
			
		||||
                              const ClutterActorBox  *allocation)
 | 
			
		||||
                              const ClutterActorBox  *allocation,
 | 
			
		||||
                              ClutterAllocationFlags  flags)
 | 
			
		||||
{
 | 
			
		||||
  LAYOUT_MANAGER_WARN_NOT_IMPLEMENTED (manager, "allocate");
 | 
			
		||||
}
 | 
			
		||||
@@ -298,12 +301,96 @@ layout_manager_real_get_child_meta_type (ClutterLayoutManager *manager)
 | 
			
		||||
  return G_TYPE_INVALID;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* XXX:2.0 - Remove */
 | 
			
		||||
static ClutterAlpha *
 | 
			
		||||
layout_manager_real_begin_animation (ClutterLayoutManager *manager,
 | 
			
		||||
                                     guint                 duration,
 | 
			
		||||
                                     gulong                mode)
 | 
			
		||||
{
 | 
			
		||||
  ClutterTimeline *timeline;
 | 
			
		||||
  ClutterAlpha *alpha;
 | 
			
		||||
 | 
			
		||||
  alpha = g_object_get_qdata (G_OBJECT (manager), quark_layout_alpha);
 | 
			
		||||
  if (alpha != NULL)
 | 
			
		||||
    {
 | 
			
		||||
      clutter_alpha_set_mode (alpha, mode);
 | 
			
		||||
 | 
			
		||||
      timeline = clutter_alpha_get_timeline (alpha);
 | 
			
		||||
      clutter_timeline_set_duration (timeline, duration);
 | 
			
		||||
      clutter_timeline_rewind (timeline);
 | 
			
		||||
 | 
			
		||||
      return alpha;
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
  timeline = clutter_timeline_new (duration);
 | 
			
		||||
 | 
			
		||||
  alpha = clutter_alpha_new_full (timeline, mode);
 | 
			
		||||
 | 
			
		||||
  /* let the alpha take ownership of the timeline */
 | 
			
		||||
  g_object_unref (timeline);
 | 
			
		||||
 | 
			
		||||
  g_signal_connect_swapped (timeline, "new-frame",
 | 
			
		||||
                            G_CALLBACK (clutter_layout_manager_layout_changed),
 | 
			
		||||
                            manager);
 | 
			
		||||
 | 
			
		||||
  g_object_set_qdata_full (G_OBJECT (manager),
 | 
			
		||||
                           quark_layout_alpha, alpha,
 | 
			
		||||
                           (GDestroyNotify) g_object_unref);
 | 
			
		||||
 | 
			
		||||
  clutter_timeline_start (timeline);
 | 
			
		||||
 | 
			
		||||
  return alpha;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* XXX:2.0 - Remove */
 | 
			
		||||
static gdouble
 | 
			
		||||
layout_manager_real_get_animation_progress (ClutterLayoutManager *manager)
 | 
			
		||||
{
 | 
			
		||||
  ClutterAlpha *alpha;
 | 
			
		||||
 | 
			
		||||
  alpha = g_object_get_qdata (G_OBJECT (manager), quark_layout_alpha);
 | 
			
		||||
  if (alpha == NULL)
 | 
			
		||||
    return 1.0;
 | 
			
		||||
 | 
			
		||||
  return clutter_alpha_get_alpha (alpha);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* XXX:2.0 - Remove */
 | 
			
		||||
static void
 | 
			
		||||
layout_manager_real_end_animation (ClutterLayoutManager *manager)
 | 
			
		||||
{
 | 
			
		||||
  ClutterTimeline *timeline;
 | 
			
		||||
  ClutterAlpha *alpha;
 | 
			
		||||
 | 
			
		||||
  alpha = g_object_get_qdata (G_OBJECT (manager), quark_layout_alpha);
 | 
			
		||||
  if (alpha == NULL)
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  timeline = clutter_alpha_get_timeline (alpha);
 | 
			
		||||
  g_assert (timeline != NULL);
 | 
			
		||||
 | 
			
		||||
  if (clutter_timeline_is_playing (timeline))
 | 
			
		||||
    clutter_timeline_stop (timeline);
 | 
			
		||||
 | 
			
		||||
  g_signal_handlers_disconnect_by_func (timeline,
 | 
			
		||||
                                        G_CALLBACK (clutter_layout_manager_layout_changed),
 | 
			
		||||
                                        manager);
 | 
			
		||||
 | 
			
		||||
  g_object_set_qdata (G_OBJECT (manager), quark_layout_alpha, NULL);
 | 
			
		||||
 | 
			
		||||
  clutter_layout_manager_layout_changed (manager);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_layout_manager_class_init (ClutterLayoutManagerClass *klass)
 | 
			
		||||
{
 | 
			
		||||
  quark_layout_meta =
 | 
			
		||||
    g_quark_from_static_string ("clutter-layout-manager-child-meta");
 | 
			
		||||
 | 
			
		||||
  /* XXX:2.0 - Remove */
 | 
			
		||||
  quark_layout_alpha =
 | 
			
		||||
    g_quark_from_static_string ("clutter-layout-manager-alpha");
 | 
			
		||||
 | 
			
		||||
  klass->get_preferred_width = layout_manager_real_get_preferred_width;
 | 
			
		||||
  klass->get_preferred_height = layout_manager_real_get_preferred_height;
 | 
			
		||||
  klass->allocate = layout_manager_real_allocate;
 | 
			
		||||
@@ -311,6 +398,9 @@ clutter_layout_manager_class_init (ClutterLayoutManagerClass *klass)
 | 
			
		||||
  klass->get_child_meta_type = layout_manager_real_get_child_meta_type;
 | 
			
		||||
 | 
			
		||||
  /* XXX:2.0 - Remove */
 | 
			
		||||
  klass->begin_animation = layout_manager_real_begin_animation;
 | 
			
		||||
  klass->get_animation_progress = layout_manager_real_get_animation_progress;
 | 
			
		||||
  klass->end_animation = layout_manager_real_end_animation;
 | 
			
		||||
  klass->set_container = layout_manager_real_set_container;
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
@@ -433,6 +523,7 @@ clutter_layout_manager_get_preferred_height (ClutterLayoutManager *manager,
 | 
			
		||||
 * @container: the #ClutterContainer using @manager
 | 
			
		||||
 * @allocation: the #ClutterActorBox containing the allocated area
 | 
			
		||||
 *   of @container
 | 
			
		||||
 * @flags: the allocation flags
 | 
			
		||||
 *
 | 
			
		||||
 * Allocates the children of @container given an area
 | 
			
		||||
 *
 | 
			
		||||
@@ -443,7 +534,8 @@ clutter_layout_manager_get_preferred_height (ClutterLayoutManager *manager,
 | 
			
		||||
void
 | 
			
		||||
clutter_layout_manager_allocate (ClutterLayoutManager   *manager,
 | 
			
		||||
                                 ClutterContainer       *container,
 | 
			
		||||
                                 const ClutterActorBox  *allocation)
 | 
			
		||||
                                 const ClutterActorBox  *allocation,
 | 
			
		||||
                                 ClutterAllocationFlags  flags)
 | 
			
		||||
{
 | 
			
		||||
  ClutterLayoutManagerClass *klass;
 | 
			
		||||
 | 
			
		||||
@@ -452,7 +544,7 @@ clutter_layout_manager_allocate (ClutterLayoutManager   *manager,
 | 
			
		||||
  g_return_if_fail (allocation != NULL);
 | 
			
		||||
 | 
			
		||||
  klass = CLUTTER_LAYOUT_MANAGER_GET_CLASS (manager);
 | 
			
		||||
  klass->allocate (manager, container, allocation);
 | 
			
		||||
  klass->allocate (manager, container, allocation, flags);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 
 | 
			
		||||
@@ -115,7 +115,8 @@ struct _ClutterLayoutManagerClass
 | 
			
		||||
                                                 gfloat                 *nat_height_p);
 | 
			
		||||
  void               (* allocate)               (ClutterLayoutManager   *manager,
 | 
			
		||||
                                                 ClutterContainer       *container,
 | 
			
		||||
                                                 const ClutterActorBox  *allocation);
 | 
			
		||||
                                                 const ClutterActorBox  *allocation,
 | 
			
		||||
                                                 ClutterAllocationFlags  flags);
 | 
			
		||||
 | 
			
		||||
  void               (* set_container)          (ClutterLayoutManager   *manager,
 | 
			
		||||
                                                 ClutterContainer       *container);
 | 
			
		||||
@@ -125,6 +126,15 @@ struct _ClutterLayoutManagerClass
 | 
			
		||||
                                                 ClutterContainer       *container,
 | 
			
		||||
                                                 ClutterActor           *actor);
 | 
			
		||||
 | 
			
		||||
  /* deprecated */
 | 
			
		||||
  ClutterAlpha *     (* begin_animation)        (ClutterLayoutManager   *manager,
 | 
			
		||||
                                                 guint                   duration,
 | 
			
		||||
                                                 gulong                  mode);
 | 
			
		||||
  /* deprecated */
 | 
			
		||||
  gdouble            (* get_animation_progress) (ClutterLayoutManager   *manager);
 | 
			
		||||
  /* deprecated */
 | 
			
		||||
  void               (* end_animation)          (ClutterLayoutManager   *manager);
 | 
			
		||||
 | 
			
		||||
  void               (* layout_changed)         (ClutterLayoutManager   *manager);
 | 
			
		||||
 | 
			
		||||
  /*< private >*/
 | 
			
		||||
@@ -157,7 +167,8 @@ void               clutter_layout_manager_get_preferred_height  (ClutterLayoutMa
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void               clutter_layout_manager_allocate              (ClutterLayoutManager   *manager,
 | 
			
		||||
                                                                 ClutterContainer       *container,
 | 
			
		||||
                                                                 const ClutterActorBox  *allocation);
 | 
			
		||||
                                                                 const ClutterActorBox  *allocation,
 | 
			
		||||
                                                                 ClutterAllocationFlags  flags);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void               clutter_layout_manager_set_container         (ClutterLayoutManager   *manager,
 | 
			
		||||
 
 | 
			
		||||
@@ -55,15 +55,14 @@
 | 
			
		||||
#include "clutter-backend-private.h"
 | 
			
		||||
#include "clutter-config.h"
 | 
			
		||||
#include "clutter-debug.h"
 | 
			
		||||
#include "clutter-device-manager-private.h"
 | 
			
		||||
#include "clutter-event-private.h"
 | 
			
		||||
#include "clutter-feature.h"
 | 
			
		||||
#include "clutter-input-device-private.h"
 | 
			
		||||
#include "clutter-input-pointer-a11y-private.h"
 | 
			
		||||
#include "clutter-graphene.h"
 | 
			
		||||
#include "clutter-main.h"
 | 
			
		||||
#include "clutter-master-clock.h"
 | 
			
		||||
#include "clutter-mutter.h"
 | 
			
		||||
#include "clutter-paint-node-private.h"
 | 
			
		||||
#include "clutter-private.h"
 | 
			
		||||
#include "clutter-settings-private.h"
 | 
			
		||||
#include "clutter-stage-manager.h"
 | 
			
		||||
@@ -971,9 +970,6 @@ clutter_init_real (GError **error)
 | 
			
		||||
  if (clutter_enable_accessibility)
 | 
			
		||||
    cally_accessibility_init ();
 | 
			
		||||
 | 
			
		||||
  /* Initialize types required for paint nodes */
 | 
			
		||||
  _clutter_paint_node_init_types ();
 | 
			
		||||
 | 
			
		||||
  return CLUTTER_INIT_SUCCESS;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -1527,7 +1523,7 @@ event_click_count_generate (ClutterEvent *event)
 | 
			
		||||
        previous_y = event->button.y;
 | 
			
		||||
        previous_time = event->button.time;
 | 
			
		||||
 | 
			
		||||
        G_GNUC_FALLTHROUGH;
 | 
			
		||||
        /* fallthrough */
 | 
			
		||||
      case CLUTTER_BUTTON_RELEASE:
 | 
			
		||||
        event->button.click_count = click_count;
 | 
			
		||||
        break;
 | 
			
		||||
@@ -1780,7 +1776,7 @@ _clutter_process_event_details (ClutterActor        *stage,
 | 
			
		||||
 | 
			
		||||
            emit_crossing_event (event, device);
 | 
			
		||||
 | 
			
		||||
            actor = clutter_input_device_update (device, NULL, FALSE);
 | 
			
		||||
            actor = _clutter_input_device_update (device, NULL, FALSE);
 | 
			
		||||
            if (actor != stage)
 | 
			
		||||
              {
 | 
			
		||||
                ClutterEvent *crossing;
 | 
			
		||||
@@ -1838,10 +1834,13 @@ _clutter_process_event_details (ClutterActor        *stage,
 | 
			
		||||
          {
 | 
			
		||||
            if (_clutter_is_input_pointer_a11y_enabled (device))
 | 
			
		||||
              {
 | 
			
		||||
                ClutterInputDevice *core_pointer;
 | 
			
		||||
                gfloat x, y;
 | 
			
		||||
 | 
			
		||||
                clutter_event_get_coords (event, &x, &y);
 | 
			
		||||
                _clutter_input_pointer_a11y_on_motion_event (device, x, y);
 | 
			
		||||
                core_pointer = clutter_device_manager_get_core_device (device->device_manager,
 | 
			
		||||
                                                                       CLUTTER_POINTER_DEVICE);
 | 
			
		||||
                _clutter_input_pointer_a11y_on_motion_event (core_pointer, x, y);
 | 
			
		||||
              }
 | 
			
		||||
          }
 | 
			
		||||
#endif /* CLUTTER_WINDOWING_X11 */
 | 
			
		||||
@@ -1872,7 +1871,7 @@ _clutter_process_event_details (ClutterActor        *stage,
 | 
			
		||||
            break;
 | 
			
		||||
          }
 | 
			
		||||
 | 
			
		||||
        G_GNUC_FALLTHROUGH;
 | 
			
		||||
      /* fallthrough from motion */
 | 
			
		||||
      case CLUTTER_BUTTON_PRESS:
 | 
			
		||||
      case CLUTTER_BUTTON_RELEASE:
 | 
			
		||||
#ifdef CLUTTER_WINDOWING_X11
 | 
			
		||||
@@ -1880,7 +1879,12 @@ _clutter_process_event_details (ClutterActor        *stage,
 | 
			
		||||
          {
 | 
			
		||||
            if (_clutter_is_input_pointer_a11y_enabled (device) && (event->type != CLUTTER_MOTION))
 | 
			
		||||
              {
 | 
			
		||||
                _clutter_input_pointer_a11y_on_button_event (device,
 | 
			
		||||
                ClutterInputDevice *core_pointer;
 | 
			
		||||
 | 
			
		||||
                core_pointer = clutter_device_manager_get_core_device (device->device_manager,
 | 
			
		||||
                                                                       CLUTTER_POINTER_DEVICE);
 | 
			
		||||
 | 
			
		||||
                _clutter_input_pointer_a11y_on_button_event (core_pointer,
 | 
			
		||||
                                                             event->button.button,
 | 
			
		||||
                                                             event->type == CLUTTER_BUTTON_PRESS);
 | 
			
		||||
              }
 | 
			
		||||
@@ -1939,7 +1943,7 @@ _clutter_process_event_details (ClutterActor        *stage,
 | 
			
		||||
               * get the actor underneath
 | 
			
		||||
               */
 | 
			
		||||
              if (device != NULL)
 | 
			
		||||
                actor = clutter_input_device_update (device, NULL, TRUE);
 | 
			
		||||
                actor = _clutter_input_device_update (device, NULL, TRUE);
 | 
			
		||||
              else
 | 
			
		||||
                {
 | 
			
		||||
                  CLUTTER_NOTE (EVENT, "No device found: picking");
 | 
			
		||||
@@ -2012,7 +2016,7 @@ _clutter_process_event_details (ClutterActor        *stage,
 | 
			
		||||
            break;
 | 
			
		||||
          }
 | 
			
		||||
 | 
			
		||||
        G_GNUC_FALLTHROUGH;
 | 
			
		||||
      /* fallthrough from motion */
 | 
			
		||||
      case CLUTTER_TOUCH_BEGIN:
 | 
			
		||||
      case CLUTTER_TOUCH_CANCEL:
 | 
			
		||||
      case CLUTTER_TOUCH_END:
 | 
			
		||||
@@ -2056,7 +2060,7 @@ _clutter_process_event_details (ClutterActor        *stage,
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
              if (device != NULL)
 | 
			
		||||
                actor = clutter_input_device_update (device, sequence, TRUE);
 | 
			
		||||
                actor = _clutter_input_device_update (device, sequence, TRUE);
 | 
			
		||||
              else
 | 
			
		||||
                {
 | 
			
		||||
                  CLUTTER_NOTE (EVENT, "No device found: picking");
 | 
			
		||||
 
 | 
			
		||||
@@ -31,8 +31,6 @@
 | 
			
		||||
 | 
			
		||||
#include "clutter-build-config.h"
 | 
			
		||||
 | 
			
		||||
#include <cogl/cogl.h>
 | 
			
		||||
 | 
			
		||||
#include "clutter-master-clock.h"
 | 
			
		||||
#include "clutter-master-clock-default.h"
 | 
			
		||||
#include "clutter-debug.h"
 | 
			
		||||
@@ -199,7 +197,7 @@ master_clock_schedule_stage_updates (ClutterMasterClockDefault *master_clock)
 | 
			
		||||
  stages = clutter_stage_manager_peek_stages (stage_manager);
 | 
			
		||||
 | 
			
		||||
  for (l = stages; l != NULL; l = l->next)
 | 
			
		||||
    clutter_stage_schedule_update (l->data);
 | 
			
		||||
    _clutter_stage_schedule_update (l->data);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static GSList *
 | 
			
		||||
@@ -252,7 +250,7 @@ master_clock_reschedule_stage_updates (ClutterMasterClockDefault *master_clock,
 | 
			
		||||
      if (master_clock->timelines ||
 | 
			
		||||
          _clutter_stage_has_queued_events (l->data) ||
 | 
			
		||||
          _clutter_stage_needs_update (l->data))
 | 
			
		||||
        clutter_stage_schedule_update (l->data);
 | 
			
		||||
        _clutter_stage_schedule_update (l->data);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -463,8 +461,6 @@ clutter_clock_dispatch (GSource     *source,
 | 
			
		||||
 | 
			
		||||
  _clutter_threads_acquire_lock ();
 | 
			
		||||
 | 
			
		||||
  COGL_TRACE_BEGIN (ClutterMasterClockTick, "Master Clock (tick)");
 | 
			
		||||
 | 
			
		||||
  /* Get the time to use for this frame */
 | 
			
		||||
  master_clock->cur_tick = g_source_get_time (source);
 | 
			
		||||
 | 
			
		||||
@@ -496,8 +492,6 @@ clutter_clock_dispatch (GSource     *source,
 | 
			
		||||
 | 
			
		||||
  g_slist_free_full (stages, g_object_unref);
 | 
			
		||||
 | 
			
		||||
  COGL_TRACE_END (ClutterMasterClockTick);
 | 
			
		||||
 | 
			
		||||
  _clutter_threads_release_lock ();
 | 
			
		||||
 | 
			
		||||
  return TRUE;
 | 
			
		||||
 
 | 
			
		||||
@@ -26,8 +26,8 @@
 | 
			
		||||
#define __CLUTTER_H_INSIDE__
 | 
			
		||||
 | 
			
		||||
#include "clutter-backend.h"
 | 
			
		||||
#include "clutter-device-manager-private.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"
 | 
			
		||||
@@ -36,9 +36,6 @@
 | 
			
		||||
#include "cogl/clutter-stage-cogl.h"
 | 
			
		||||
#include "clutter/x11/clutter-backend-x11.h"
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
GList * clutter_stage_peek_stage_views (ClutterStage *stage);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void clutter_set_custom_backend_func (ClutterBackend *(* func) (void));
 | 
			
		||||
 | 
			
		||||
@@ -51,23 +48,6 @@ void clutter_stage_capture_into (ClutterStage          *stage,
 | 
			
		||||
                                 cairo_rectangle_int_t *rect,
 | 
			
		||||
                                 uint8_t               *data);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void clutter_stage_paint_to_framebuffer (ClutterStage                *stage,
 | 
			
		||||
                                         CoglFramebuffer             *framebuffer,
 | 
			
		||||
                                         const cairo_rectangle_int_t *rect,
 | 
			
		||||
                                         float                        scale,
 | 
			
		||||
                                         ClutterPaintFlag             paint_flags);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
gboolean clutter_stage_paint_to_buffer (ClutterStage                 *stage,
 | 
			
		||||
                                        const cairo_rectangle_int_t  *rect,
 | 
			
		||||
                                        float                         scale,
 | 
			
		||||
                                        uint8_t                      *data,
 | 
			
		||||
                                        int                           stride,
 | 
			
		||||
                                        CoglPixelFormat               format,
 | 
			
		||||
                                        ClutterPaintFlag              paint_flags,
 | 
			
		||||
                                        GError                      **error);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void clutter_stage_freeze_updates (ClutterStage *stage);
 | 
			
		||||
 | 
			
		||||
@@ -77,16 +57,9 @@ void clutter_stage_thaw_updates (ClutterStage *stage);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void clutter_stage_update_resource_scales (ClutterStage *stage);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void clutter_stage_view_assign_next_scanout (ClutterStageView *stage_view,
 | 
			
		||||
                                             CoglScanout      *scanout);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
gboolean clutter_actor_has_damage (ClutterActor *actor);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
gboolean clutter_actor_has_transitions (ClutterActor *actor);
 | 
			
		||||
 | 
			
		||||
#undef __CLUTTER_H_INSIDE__
 | 
			
		||||
 | 
			
		||||
#endif /* __CLUTTER_MUTTER_H__ */
 | 
			
		||||
 
 | 
			
		||||
@@ -81,7 +81,7 @@
 | 
			
		||||
struct _ClutterOffscreenEffectPrivate
 | 
			
		||||
{
 | 
			
		||||
  CoglHandle offscreen;
 | 
			
		||||
  CoglPipeline *pipeline;
 | 
			
		||||
  CoglPipeline *target;
 | 
			
		||||
  CoglHandle texture;
 | 
			
		||||
 | 
			
		||||
  ClutterActor *actor;
 | 
			
		||||
@@ -118,7 +118,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_object_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);
 | 
			
		||||
@@ -140,7 +144,7 @@ ensure_pipeline_filter_for_scale (ClutterOffscreenEffect *self,
 | 
			
		||||
{
 | 
			
		||||
  CoglPipelineFilter filter;
 | 
			
		||||
 | 
			
		||||
  if (!self->priv->pipeline)
 | 
			
		||||
  if (!self->priv->target)
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  /* If no fractional scaling is set, we're always going to render the texture
 | 
			
		||||
@@ -154,7 +158,7 @@ ensure_pipeline_filter_for_scale (ClutterOffscreenEffect *self,
 | 
			
		||||
  else
 | 
			
		||||
    filter = COGL_PIPELINE_FILTER_LINEAR;
 | 
			
		||||
 | 
			
		||||
  cogl_pipeline_set_layer_filters (self->priv->pipeline, 0 /* layer_index */,
 | 
			
		||||
  cogl_pipeline_set_layer_filters (self->priv->target, 0 /* layer_index */,
 | 
			
		||||
                                   filter, filter);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -185,24 +189,33 @@ update_fbo (ClutterEffect *effect,
 | 
			
		||||
    return TRUE;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (priv->pipeline == NULL)
 | 
			
		||||
  if (priv->target == NULL)
 | 
			
		||||
    {
 | 
			
		||||
      CoglContext *ctx =
 | 
			
		||||
        clutter_backend_get_cogl_context (clutter_get_default_backend ());
 | 
			
		||||
 | 
			
		||||
      priv->pipeline = cogl_pipeline_new (ctx);
 | 
			
		||||
      priv->target = cogl_pipeline_new (ctx);
 | 
			
		||||
      ensure_pipeline_filter_for_scale (self, resource_scale);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  g_clear_pointer (&priv->texture, cogl_object_unref);
 | 
			
		||||
  g_clear_pointer (&priv->offscreen, cogl_object_unref);
 | 
			
		||||
  if (priv->texture != NULL)
 | 
			
		||||
    {
 | 
			
		||||
      cogl_object_unref (priv->texture);
 | 
			
		||||
      priv->texture = NULL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  if (priv->offscreen != NULL)
 | 
			
		||||
    {
 | 
			
		||||
      cogl_object_unref (priv->offscreen);
 | 
			
		||||
      priv->offscreen = NULL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  priv->texture =
 | 
			
		||||
    clutter_offscreen_effect_create_texture (self, target_width, target_height);
 | 
			
		||||
  if (priv->texture == NULL)
 | 
			
		||||
    return FALSE;
 | 
			
		||||
 | 
			
		||||
  cogl_pipeline_set_layer_texture (priv->pipeline, 0, priv->texture);
 | 
			
		||||
  cogl_pipeline_set_layer_texture (priv->target, 0, priv->texture);
 | 
			
		||||
 | 
			
		||||
  priv->target_width = target_width;
 | 
			
		||||
  priv->target_height = target_height;
 | 
			
		||||
@@ -212,8 +225,8 @@ update_fbo (ClutterEffect *effect,
 | 
			
		||||
    {
 | 
			
		||||
      g_warning ("%s: Unable to create an Offscreen buffer", G_STRLOC);
 | 
			
		||||
 | 
			
		||||
      cogl_object_unref (priv->pipeline);
 | 
			
		||||
      priv->pipeline = NULL;
 | 
			
		||||
      cogl_object_unref (priv->target);
 | 
			
		||||
      priv->target = NULL;
 | 
			
		||||
 | 
			
		||||
      priv->target_width = 0;
 | 
			
		||||
      priv->target_height = 0;
 | 
			
		||||
@@ -380,7 +393,7 @@ clutter_offscreen_effect_real_paint_target (ClutterOffscreenEffect *effect,
 | 
			
		||||
 | 
			
		||||
  paint_opacity = clutter_actor_get_paint_opacity (priv->actor);
 | 
			
		||||
 | 
			
		||||
  cogl_pipeline_set_color4ub (priv->pipeline,
 | 
			
		||||
  cogl_pipeline_set_color4ub (priv->target,
 | 
			
		||||
                              paint_opacity,
 | 
			
		||||
                              paint_opacity,
 | 
			
		||||
                              paint_opacity,
 | 
			
		||||
@@ -392,7 +405,7 @@ clutter_offscreen_effect_real_paint_target (ClutterOffscreenEffect *effect,
 | 
			
		||||
   * hadn't been redirected offscreen.
 | 
			
		||||
   */
 | 
			
		||||
  cogl_framebuffer_draw_textured_rectangle (framebuffer,
 | 
			
		||||
                                            priv->pipeline,
 | 
			
		||||
                                            priv->target,
 | 
			
		||||
                                            0, 0,
 | 
			
		||||
                                            cogl_texture_get_width (priv->texture),
 | 
			
		||||
                                            cogl_texture_get_height (priv->texture),
 | 
			
		||||
@@ -446,16 +459,13 @@ clutter_offscreen_effect_post_paint (ClutterEffect       *effect,
 | 
			
		||||
  ClutterOffscreenEffectPrivate *priv = self->priv;
 | 
			
		||||
  CoglFramebuffer *framebuffer;
 | 
			
		||||
 | 
			
		||||
  g_warn_if_fail (priv->offscreen);
 | 
			
		||||
  g_warn_if_fail (priv->pipeline);
 | 
			
		||||
  g_warn_if_fail (priv->actor);
 | 
			
		||||
  if (priv->offscreen == NULL ||
 | 
			
		||||
      priv->target == NULL ||
 | 
			
		||||
      priv->actor == NULL)
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  /* Restore the previous opacity override */
 | 
			
		||||
  if (priv->actor)
 | 
			
		||||
    {
 | 
			
		||||
      clutter_actor_set_opacity_override (priv->actor,
 | 
			
		||||
                                          priv->old_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);
 | 
			
		||||
@@ -472,57 +482,34 @@ clutter_offscreen_effect_paint (ClutterEffect           *effect,
 | 
			
		||||
  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, paint_context, flags);
 | 
			
		||||
    }
 | 
			
		||||
  else
 | 
			
		||||
    clutter_offscreen_effect_paint_texture (self, paint_context);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_offscreen_effect_set_enabled (ClutterActorMeta *meta,
 | 
			
		||||
                                      gboolean          is_enabled)
 | 
			
		||||
{
 | 
			
		||||
  ClutterActorMetaClass *parent_class =
 | 
			
		||||
    CLUTTER_ACTOR_META_CLASS (clutter_offscreen_effect_parent_class);
 | 
			
		||||
  ClutterOffscreenEffect *offscreen_effect = CLUTTER_OFFSCREEN_EFFECT (meta);
 | 
			
		||||
  ClutterOffscreenEffectPrivate *priv = offscreen_effect->priv;
 | 
			
		||||
 | 
			
		||||
  g_clear_pointer (&priv->offscreen, cogl_object_unref);
 | 
			
		||||
 | 
			
		||||
  parent_class->set_enabled (meta, is_enabled);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
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->pipeline, cogl_object_unref);
 | 
			
		||||
  if (priv->offscreen)
 | 
			
		||||
    cogl_object_unref (priv->offscreen);
 | 
			
		||||
 | 
			
		||||
  if (priv->target)
 | 
			
		||||
    cogl_object_unref (priv->target);
 | 
			
		||||
 | 
			
		||||
  if (priv->texture)
 | 
			
		||||
    cogl_object_unref (priv->texture);
 | 
			
		||||
 | 
			
		||||
  G_OBJECT_CLASS (clutter_offscreen_effect_parent_class)->finalize (gobject);
 | 
			
		||||
}
 | 
			
		||||
@@ -538,7 +525,6 @@ clutter_offscreen_effect_class_init (ClutterOffscreenEffectClass *klass)
 | 
			
		||||
  klass->paint_target = clutter_offscreen_effect_real_paint_target;
 | 
			
		||||
 | 
			
		||||
  meta_class->set_actor = clutter_offscreen_effect_set_actor;
 | 
			
		||||
  meta_class->set_enabled = clutter_offscreen_effect_set_enabled;
 | 
			
		||||
 | 
			
		||||
  effect_class->pre_paint = clutter_offscreen_effect_pre_paint;
 | 
			
		||||
  effect_class->post_paint = clutter_offscreen_effect_post_paint;
 | 
			
		||||
@@ -604,7 +590,7 @@ clutter_offscreen_effect_get_target (ClutterOffscreenEffect *effect)
 | 
			
		||||
  g_return_val_if_fail (CLUTTER_IS_OFFSCREEN_EFFECT (effect),
 | 
			
		||||
                        NULL);
 | 
			
		||||
 | 
			
		||||
  return (CoglMaterial *)effect->priv->pipeline;
 | 
			
		||||
  return (CoglMaterial *)effect->priv->target;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 
 | 
			
		||||
@@ -20,9 +20,7 @@
 | 
			
		||||
 | 
			
		||||
#include "clutter-paint-context.h"
 | 
			
		||||
 | 
			
		||||
ClutterPaintContext * clutter_paint_context_new_for_view (ClutterStageView     *view,
 | 
			
		||||
                                                          const cairo_region_t *redraw_clip,
 | 
			
		||||
                                                          ClutterPaintFlag      paint_flags);
 | 
			
		||||
ClutterPaintContext * clutter_paint_context_new_for_view (ClutterStageView *view);
 | 
			
		||||
 | 
			
		||||
gboolean clutter_paint_context_is_drawing_off_stage (ClutterPaintContext *paint_context);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -23,13 +23,9 @@ struct _ClutterPaintContext
 | 
			
		||||
{
 | 
			
		||||
  grefcount ref_count;
 | 
			
		||||
 | 
			
		||||
  ClutterPaintFlag paint_flags;
 | 
			
		||||
 | 
			
		||||
  GList *framebuffers;
 | 
			
		||||
 | 
			
		||||
  ClutterStageView *view;
 | 
			
		||||
 | 
			
		||||
  cairo_region_t *redraw_clip;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
G_DEFINE_BOXED_TYPE (ClutterPaintContext, clutter_paint_context,
 | 
			
		||||
@@ -37,9 +33,7 @@ G_DEFINE_BOXED_TYPE (ClutterPaintContext, clutter_paint_context,
 | 
			
		||||
                     clutter_paint_context_unref)
 | 
			
		||||
 | 
			
		||||
ClutterPaintContext *
 | 
			
		||||
clutter_paint_context_new_for_view (ClutterStageView     *view,
 | 
			
		||||
                                    const cairo_region_t *redraw_clip,
 | 
			
		||||
                                    ClutterPaintFlag      paint_flags)
 | 
			
		||||
clutter_paint_context_new_for_view (ClutterStageView *view)
 | 
			
		||||
{
 | 
			
		||||
  ClutterPaintContext *paint_context;
 | 
			
		||||
  CoglFramebuffer *framebuffer;
 | 
			
		||||
@@ -47,8 +41,6 @@ clutter_paint_context_new_for_view (ClutterStageView     *view,
 | 
			
		||||
  paint_context = g_new0 (ClutterPaintContext, 1);
 | 
			
		||||
  g_ref_count_init (&paint_context->ref_count);
 | 
			
		||||
  paint_context->view = view;
 | 
			
		||||
  paint_context->redraw_clip = cairo_region_copy (redraw_clip);
 | 
			
		||||
  paint_context->paint_flags = paint_flags;
 | 
			
		||||
 | 
			
		||||
  framebuffer = clutter_stage_view_get_framebuffer (view);
 | 
			
		||||
  clutter_paint_context_push_framebuffer (paint_context, framebuffer);
 | 
			
		||||
@@ -60,16 +52,12 @@ clutter_paint_context_new_for_view (ClutterStageView     *view,
 | 
			
		||||
 * clutter_paint_context_new_for_framebuffer: (skip)
 | 
			
		||||
 */
 | 
			
		||||
ClutterPaintContext *
 | 
			
		||||
clutter_paint_context_new_for_framebuffer (CoglFramebuffer      *framebuffer,
 | 
			
		||||
                                           const cairo_region_t *redraw_clip,
 | 
			
		||||
                                           ClutterPaintFlag      paint_flags)
 | 
			
		||||
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);
 | 
			
		||||
  paint_context->redraw_clip = cairo_region_copy (redraw_clip);
 | 
			
		||||
  paint_context->paint_flags = paint_flags;
 | 
			
		||||
 | 
			
		||||
  clutter_paint_context_push_framebuffer (paint_context, framebuffer);
 | 
			
		||||
 | 
			
		||||
@@ -89,7 +77,6 @@ clutter_paint_context_dispose (ClutterPaintContext *paint_context)
 | 
			
		||||
  g_list_free_full (paint_context->framebuffers,
 | 
			
		||||
                    cogl_object_unref);
 | 
			
		||||
  paint_context->framebuffers = NULL;
 | 
			
		||||
  g_clear_pointer (&paint_context->redraw_clip, cairo_region_destroy);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
@@ -128,12 +115,6 @@ clutter_paint_context_pop_framebuffer (ClutterPaintContext *paint_context)
 | 
			
		||||
                        paint_context->framebuffers);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const cairo_region_t *
 | 
			
		||||
clutter_paint_context_get_redraw_clip (ClutterPaintContext *paint_context)
 | 
			
		||||
{
 | 
			
		||||
  return paint_context->redraw_clip;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_paint_context_get_framebuffer:
 | 
			
		||||
 * @paint_context: The #ClutterPaintContext
 | 
			
		||||
@@ -178,12 +159,3 @@ clutter_paint_context_is_drawing_off_stage (ClutterPaintContext *paint_context)
 | 
			
		||||
 | 
			
		||||
  return !paint_context->view;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_paint_context_get_paint_flags: (skip)
 | 
			
		||||
 */
 | 
			
		||||
ClutterPaintFlag
 | 
			
		||||
clutter_paint_context_get_paint_flags (ClutterPaintContext *paint_context)
 | 
			
		||||
{
 | 
			
		||||
  return paint_context->paint_flags;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -29,21 +29,13 @@
 | 
			
		||||
 | 
			
		||||
typedef struct _ClutterPaintContext ClutterPaintContext;
 | 
			
		||||
 | 
			
		||||
typedef enum _ClutterPaintFlag
 | 
			
		||||
{
 | 
			
		||||
  CLUTTER_PAINT_FLAG_NONE = 0,
 | 
			
		||||
  CLUTTER_PAINT_FLAG_NO_CURSORS = 1 << 0,
 | 
			
		||||
} ClutterPaintFlag;
 | 
			
		||||
 | 
			
		||||
#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,
 | 
			
		||||
                                                                 const cairo_region_t *redraw_clip,
 | 
			
		||||
                                                                 ClutterPaintFlag      paint_flags);
 | 
			
		||||
ClutterPaintContext * clutter_paint_context_new_for_framebuffer (CoglFramebuffer *framebuffer);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
ClutterPaintContext * clutter_paint_context_ref (ClutterPaintContext *paint_context);
 | 
			
		||||
@@ -67,10 +59,4 @@ void clutter_paint_context_push_framebuffer (ClutterPaintContext *paint_context,
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void clutter_paint_context_pop_framebuffer (ClutterPaintContext *paint_context);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
const cairo_region_t * clutter_paint_context_get_redraw_clip (ClutterPaintContext *paint_context);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
ClutterPaintFlag clutter_paint_context_get_paint_flags (ClutterPaintContext *paint_context);
 | 
			
		||||
 | 
			
		||||
#endif /* CLUTTER_PAINT_CONTEXT_H */
 | 
			
		||||
 
 | 
			
		||||
@@ -49,11 +49,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;
 | 
			
		||||
};
 | 
			
		||||
@@ -83,6 +83,7 @@ typedef enum
 | 
			
		||||
  PAINT_OP_INVALID = 0,
 | 
			
		||||
  PAINT_OP_TEX_RECT,
 | 
			
		||||
  PAINT_OP_MULTITEX_RECT,
 | 
			
		||||
  PAINT_OP_PATH,
 | 
			
		||||
  PAINT_OP_PRIMITIVE
 | 
			
		||||
} PaintOpCode;
 | 
			
		||||
 | 
			
		||||
@@ -95,6 +96,8 @@ struct _ClutterPaintOperation
 | 
			
		||||
  union {
 | 
			
		||||
    float texrect[8];
 | 
			
		||||
 | 
			
		||||
    CoglPath *path;
 | 
			
		||||
 | 
			
		||||
    CoglPrimitive *primitive;
 | 
			
		||||
  } op;
 | 
			
		||||
};
 | 
			
		||||
 
 | 
			
		||||
@@ -171,6 +171,8 @@ clutter_paint_node_real_finalize (ClutterPaintNode *node)
 | 
			
		||||
{
 | 
			
		||||
  ClutterPaintNode *iter;
 | 
			
		||||
 | 
			
		||||
  g_free (node->name);
 | 
			
		||||
 | 
			
		||||
  if (node->operations != NULL)
 | 
			
		||||
    {
 | 
			
		||||
      guint i;
 | 
			
		||||
@@ -295,8 +297,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 +307,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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -782,6 +769,11 @@ clutter_paint_operation_clear (ClutterPaintOperation *op)
 | 
			
		||||
        g_array_unref (op->multitex_coords);
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
    case PAINT_OP_PATH:
 | 
			
		||||
      if (op->op.path != NULL)
 | 
			
		||||
        cogl_object_unref (op->op.path);
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
    case PAINT_OP_PRIMITIVE:
 | 
			
		||||
      if (op->op.primitive != NULL)
 | 
			
		||||
        cogl_object_unref (op->op.primitive);
 | 
			
		||||
@@ -831,6 +823,16 @@ clutter_paint_op_init_multitex_rect (ClutterPaintOperation *op,
 | 
			
		||||
  op->op.texrect[3] = rect->y2;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline void
 | 
			
		||||
clutter_paint_op_init_path (ClutterPaintOperation *op,
 | 
			
		||||
                            CoglPath              *path)
 | 
			
		||||
{
 | 
			
		||||
  clutter_paint_operation_clear (op);
 | 
			
		||||
 | 
			
		||||
  op->opcode = PAINT_OP_PATH;
 | 
			
		||||
  op->op.path = cogl_object_ref (path);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline void
 | 
			
		||||
clutter_paint_op_init_primitive (ClutterPaintOperation *op,
 | 
			
		||||
                                 CoglPrimitive         *primitive)
 | 
			
		||||
@@ -935,6 +937,34 @@ clutter_paint_node_add_multitexture_rectangle (ClutterPaintNode      *node,
 | 
			
		||||
  g_array_append_val (node->operations, operation);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_paint_node_add_path: (skip)
 | 
			
		||||
 * @node: a #ClutterPaintNode
 | 
			
		||||
 * @path: a Cogl path
 | 
			
		||||
 *
 | 
			
		||||
 * Adds a region described as a path to the @node.
 | 
			
		||||
 *
 | 
			
		||||
 * This function acquires a reference on the passed @path, so it
 | 
			
		||||
 * is safe to call cogl_object_unref() when it returns.
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 1.10
 | 
			
		||||
 * Stability: unstable
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
clutter_paint_node_add_path (ClutterPaintNode *node,
 | 
			
		||||
                             CoglPath         *path)
 | 
			
		||||
{
 | 
			
		||||
  ClutterPaintOperation operation = PAINT_OP_INIT;
 | 
			
		||||
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_PAINT_NODE (node));
 | 
			
		||||
  g_return_if_fail (cogl_is_path (path));
 | 
			
		||||
 | 
			
		||||
  clutter_paint_node_maybe_init_operations (node);
 | 
			
		||||
 | 
			
		||||
  clutter_paint_op_init_path (&operation, path);
 | 
			
		||||
  g_array_append_val (node->operations, operation);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_paint_node_add_primitive: (skip)
 | 
			
		||||
 * @node: a #ClutterPaintNode
 | 
			
		||||
@@ -1071,6 +1101,11 @@ clutter_paint_node_to_json (ClutterPaintNode *node)
 | 
			
		||||
              json_builder_end_array (builder);
 | 
			
		||||
              break;
 | 
			
		||||
 | 
			
		||||
            case PAINT_OP_PATH:
 | 
			
		||||
              json_builder_set_member_name (builder, "path");
 | 
			
		||||
              json_builder_add_int_value (builder, (intptr_t) 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);
 | 
			
		||||
@@ -1146,6 +1181,8 @@ _clutter_paint_node_create (GType gtype)
 | 
			
		||||
{
 | 
			
		||||
  g_return_val_if_fail (g_type_is_a (gtype, CLUTTER_TYPE_PAINT_NODE), NULL);
 | 
			
		||||
 | 
			
		||||
  _clutter_paint_node_init_types ();
 | 
			
		||||
 | 
			
		||||
  return (gpointer) g_type_create_instance (gtype);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -56,9 +56,6 @@ void                    clutter_paint_node_paint                        (Clutter
 | 
			
		||||
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);
 | 
			
		||||
@@ -84,6 +81,9 @@ void                   clutter_paint_node_add_multitexture_rectangle   (ClutterP
 | 
			
		||||
                                                                        unsigned int            text_coords_len);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void                    clutter_paint_node_add_path                     (ClutterPaintNode      *node,
 | 
			
		||||
                                                                         CoglPath              *path);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void                    clutter_paint_node_add_primitive                (ClutterPaintNode      *node,
 | 
			
		||||
                                                                         CoglPrimitive         *primitive);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -477,6 +477,10 @@ clutter_pipeline_node_draw (ClutterPaintNode    *node,
 | 
			
		||||
                                                         op->multitex_coords->len);
 | 
			
		||||
          break;
 | 
			
		||||
 | 
			
		||||
        case PAINT_OP_PATH:
 | 
			
		||||
          cogl_framebuffer_fill_path (fb, pnode->pipeline, op->op.path);
 | 
			
		||||
          break;
 | 
			
		||||
 | 
			
		||||
        case PAINT_OP_PRIMITIVE:
 | 
			
		||||
          cogl_framebuffer_draw_primitive (fb,
 | 
			
		||||
                                           pnode->pipeline,
 | 
			
		||||
@@ -872,6 +876,7 @@ clutter_text_node_draw (ClutterPaintNode    *node,
 | 
			
		||||
          break;
 | 
			
		||||
 | 
			
		||||
        case PAINT_OP_MULTITEX_RECT:
 | 
			
		||||
        case PAINT_OP_PATH:
 | 
			
		||||
        case PAINT_OP_PRIMITIVE:
 | 
			
		||||
        case PAINT_OP_INVALID:
 | 
			
		||||
          break;
 | 
			
		||||
@@ -1032,6 +1037,11 @@ clutter_clip_node_pre_draw (ClutterPaintNode    *node,
 | 
			
		||||
          retval = TRUE;
 | 
			
		||||
          break;
 | 
			
		||||
 | 
			
		||||
        case PAINT_OP_PATH:
 | 
			
		||||
          cogl_framebuffer_push_path_clip (fb, op->op.path);
 | 
			
		||||
          retval = TRUE;
 | 
			
		||||
          break;
 | 
			
		||||
 | 
			
		||||
        case PAINT_OP_MULTITEX_RECT:
 | 
			
		||||
        case PAINT_OP_PRIMITIVE:
 | 
			
		||||
        case PAINT_OP_INVALID:
 | 
			
		||||
@@ -1062,6 +1072,7 @@ clutter_clip_node_post_draw (ClutterPaintNode    *node,
 | 
			
		||||
 | 
			
		||||
      switch (op->opcode)
 | 
			
		||||
        {
 | 
			
		||||
        case PAINT_OP_PATH:
 | 
			
		||||
        case PAINT_OP_TEX_RECT:
 | 
			
		||||
          cogl_framebuffer_pop_clip (fb);
 | 
			
		||||
          break;
 | 
			
		||||
@@ -1231,8 +1242,9 @@ struct _ClutterLayerNode
 | 
			
		||||
  float fbo_width;
 | 
			
		||||
  float fbo_height;
 | 
			
		||||
 | 
			
		||||
  CoglPipeline *pipeline;
 | 
			
		||||
  CoglPipeline *state;
 | 
			
		||||
  CoglFramebuffer *offscreen;
 | 
			
		||||
  CoglTexture *texture;
 | 
			
		||||
 | 
			
		||||
  guint8 opacity;
 | 
			
		||||
};
 | 
			
		||||
@@ -1322,7 +1334,7 @@ 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->pipeline,
 | 
			
		||||
                                                    lnode->state,
 | 
			
		||||
                                                    op->op.texrect[0],
 | 
			
		||||
                                                    op->op.texrect[1],
 | 
			
		||||
                                                    op->op.texrect[2],
 | 
			
		||||
@@ -1335,7 +1347,7 @@ clutter_layer_node_post_draw (ClutterPaintNode    *node,
 | 
			
		||||
 | 
			
		||||
        case PAINT_OP_MULTITEX_RECT:
 | 
			
		||||
          cogl_framebuffer_draw_multitextured_rectangle (fb,
 | 
			
		||||
                                                         lnode->pipeline,
 | 
			
		||||
                                                         lnode->state,
 | 
			
		||||
                                                         op->op.texrect[0],
 | 
			
		||||
                                                         op->op.texrect[1],
 | 
			
		||||
                                                         op->op.texrect[2],
 | 
			
		||||
@@ -1344,10 +1356,12 @@ clutter_layer_node_post_draw (ClutterPaintNode    *node,
 | 
			
		||||
                                                         op->multitex_coords->len);
 | 
			
		||||
          break;
 | 
			
		||||
 | 
			
		||||
        case PAINT_OP_PATH:
 | 
			
		||||
          cogl_framebuffer_fill_path (fb, lnode->state, op->op.path);
 | 
			
		||||
          break;
 | 
			
		||||
 | 
			
		||||
        case PAINT_OP_PRIMITIVE:
 | 
			
		||||
          cogl_framebuffer_draw_primitive (fb,
 | 
			
		||||
                                           lnode->pipeline,
 | 
			
		||||
                                           op->op.primitive);
 | 
			
		||||
          cogl_framebuffer_draw_primitive (fb, lnode->state, op->op.primitive);
 | 
			
		||||
          break;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@@ -1358,8 +1372,8 @@ clutter_layer_node_finalize (ClutterPaintNode *node)
 | 
			
		||||
{
 | 
			
		||||
  ClutterLayerNode *lnode = CLUTTER_LAYER_NODE (node);
 | 
			
		||||
 | 
			
		||||
  if (lnode->pipeline != NULL)
 | 
			
		||||
    cogl_object_unref (lnode->pipeline);
 | 
			
		||||
  if (lnode->state != NULL)
 | 
			
		||||
    cogl_object_unref (lnode->state);
 | 
			
		||||
 | 
			
		||||
  if (lnode->offscreen != NULL)
 | 
			
		||||
    cogl_object_unref (lnode->offscreen);
 | 
			
		||||
@@ -1411,8 +1425,6 @@ clutter_layer_node_new (const CoglMatrix        *projection,
 | 
			
		||||
                        guint8                   opacity)
 | 
			
		||||
{
 | 
			
		||||
  ClutterLayerNode *res;
 | 
			
		||||
  CoglContext *context;
 | 
			
		||||
  CoglTexture *texture;
 | 
			
		||||
  CoglColor color;
 | 
			
		||||
 | 
			
		||||
  res = _clutter_paint_node_create (CLUTTER_TYPE_LAYER_NODE);
 | 
			
		||||
@@ -1424,17 +1436,19 @@ clutter_layer_node_new (const CoglMatrix        *projection,
 | 
			
		||||
  res->opacity = opacity;
 | 
			
		||||
 | 
			
		||||
  /* the texture backing the FBO */
 | 
			
		||||
  context = clutter_backend_get_cogl_context (clutter_get_default_backend ());
 | 
			
		||||
  res->texture = cogl_texture_new_with_size (MAX (res->fbo_width, 1),
 | 
			
		||||
                                             MAX (res->fbo_height, 1),
 | 
			
		||||
                                             COGL_TEXTURE_NO_SLICING,
 | 
			
		||||
                                             COGL_PIXEL_FORMAT_RGBA_8888_PRE);
 | 
			
		||||
 | 
			
		||||
  texture = cogl_texture_2d_new_with_size (context,
 | 
			
		||||
                                           MAX (res->fbo_width, 1),
 | 
			
		||||
                                           MAX (res->fbo_height, 1));
 | 
			
		||||
  cogl_texture_set_premultiplied (texture, TRUE);
 | 
			
		||||
 | 
			
		||||
  res->offscreen = COGL_FRAMEBUFFER (cogl_offscreen_new_to_texture (texture));
 | 
			
		||||
  res->offscreen = COGL_FRAMEBUFFER (cogl_offscreen_new_to_texture (res->texture));
 | 
			
		||||
  if (res->offscreen == NULL)
 | 
			
		||||
    {
 | 
			
		||||
      g_critical ("%s: Unable to create an offscreen buffer", G_STRLOC);
 | 
			
		||||
 | 
			
		||||
      cogl_object_unref (res->texture);
 | 
			
		||||
      res->texture = NULL;
 | 
			
		||||
 | 
			
		||||
      goto out;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -1444,15 +1458,14 @@ clutter_layer_node_new (const CoglMatrix        *projection,
 | 
			
		||||
   * interpolation filters because the texture is always
 | 
			
		||||
   * going to be painted at a 1:1 texel:pixel ratio
 | 
			
		||||
   */
 | 
			
		||||
  res->pipeline = cogl_pipeline_copy (default_texture_pipeline);
 | 
			
		||||
  cogl_pipeline_set_layer_filters (res->pipeline, 0,
 | 
			
		||||
  res->state = cogl_pipeline_copy (default_texture_pipeline);
 | 
			
		||||
  cogl_pipeline_set_layer_filters (res->state, 0,
 | 
			
		||||
                                   COGL_PIPELINE_FILTER_NEAREST,
 | 
			
		||||
                                   COGL_PIPELINE_FILTER_NEAREST);
 | 
			
		||||
  cogl_pipeline_set_layer_texture (res->pipeline, 0, texture);
 | 
			
		||||
  cogl_pipeline_set_color (res->pipeline, &color);
 | 
			
		||||
  cogl_pipeline_set_layer_texture (res->state, 0, res->texture);
 | 
			
		||||
  cogl_pipeline_set_color (res->state, &color);
 | 
			
		||||
  cogl_object_unref (res->texture);
 | 
			
		||||
 | 
			
		||||
out:
 | 
			
		||||
  cogl_object_unref (texture);
 | 
			
		||||
 | 
			
		||||
  return (ClutterPaintNode *) res;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -65,6 +65,7 @@ typedef struct _ClutterVertex4          ClutterVertex4;
 | 
			
		||||
 | 
			
		||||
#define CLUTTER_ACTOR_IS_TOPLEVEL(a)            ((CLUTTER_PRIVATE_FLAGS (a) & CLUTTER_IS_TOPLEVEL) != FALSE)
 | 
			
		||||
#define CLUTTER_ACTOR_IN_DESTRUCTION(a)         ((CLUTTER_PRIVATE_FLAGS (a) & CLUTTER_IN_DESTRUCTION) != FALSE)
 | 
			
		||||
#define CLUTTER_ACTOR_IN_REPARENT(a)            ((CLUTTER_PRIVATE_FLAGS (a) & CLUTTER_IN_REPARENT) != FALSE)
 | 
			
		||||
#define CLUTTER_ACTOR_IN_PAINT(a)               ((CLUTTER_PRIVATE_FLAGS (a) & CLUTTER_IN_PAINT) != FALSE)
 | 
			
		||||
#define CLUTTER_ACTOR_IN_PICK(a)                ((CLUTTER_PRIVATE_FLAGS (a) & CLUTTER_IN_PICK) != FALSE)
 | 
			
		||||
#define CLUTTER_ACTOR_IN_RELAYOUT(a)            ((CLUTTER_PRIVATE_FLAGS (a) & CLUTTER_IN_RELAYOUT) != FALSE)
 | 
			
		||||
@@ -98,6 +99,7 @@ typedef enum
 | 
			
		||||
 | 
			
		||||
  CLUTTER_IN_DESTRUCTION = 1 << 0,
 | 
			
		||||
  CLUTTER_IS_TOPLEVEL    = 1 << 1,
 | 
			
		||||
  CLUTTER_IN_REPARENT    = 1 << 2,
 | 
			
		||||
  CLUTTER_IN_PREF_WIDTH  = 1 << 3,
 | 
			
		||||
  CLUTTER_IN_PREF_HEIGHT = 1 << 4,
 | 
			
		||||
 | 
			
		||||
@@ -246,9 +248,6 @@ gboolean _clutter_util_rectangle_intersection (const cairo_rectangle_int_t *src1
 | 
			
		||||
                                               const cairo_rectangle_int_t *src2,
 | 
			
		||||
                                               cairo_rectangle_int_t       *dest);
 | 
			
		||||
 | 
			
		||||
gboolean clutter_util_rectangle_equal (const cairo_rectangle_int_t *src1,
 | 
			
		||||
                                       const cairo_rectangle_int_t *src2);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
struct _ClutterVertex4
 | 
			
		||||
{
 | 
			
		||||
 
 | 
			
		||||
@@ -34,6 +34,7 @@
 | 
			
		||||
 | 
			
		||||
#define CLUTTER_DISABLE_DEPRECATION_WARNINGS
 | 
			
		||||
#include "deprecated/clutter-container.h"
 | 
			
		||||
#include "deprecated/clutter-alpha.h"
 | 
			
		||||
 | 
			
		||||
#include "clutter-actor.h"
 | 
			
		||||
#include "clutter-debug.h"
 | 
			
		||||
@@ -798,6 +799,232 @@ parse_signals (ClutterScript *script,
 | 
			
		||||
  return retval;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static ClutterTimeline *
 | 
			
		||||
construct_timeline (ClutterScript *script,
 | 
			
		||||
                    JsonObject    *object)
 | 
			
		||||
{
 | 
			
		||||
  ClutterTimeline *retval = NULL;
 | 
			
		||||
  ObjectInfo *oinfo;
 | 
			
		||||
  GList *members, *l;
 | 
			
		||||
 | 
			
		||||
  /* we fake an ObjectInfo so we can reuse clutter_script_construct_object()
 | 
			
		||||
   * here; we do not save it inside the hash table, because if this had
 | 
			
		||||
   * been a named object then we wouldn't have ended up here in the first
 | 
			
		||||
   * place
 | 
			
		||||
   */
 | 
			
		||||
  oinfo = g_slice_new0 (ObjectInfo);
 | 
			
		||||
  oinfo->gtype = CLUTTER_TYPE_TIMELINE;
 | 
			
		||||
  oinfo->id = g_strdup ("dummy");
 | 
			
		||||
 | 
			
		||||
  members = json_object_get_members (object);
 | 
			
		||||
  for (l = members; l != NULL; l = l->next)
 | 
			
		||||
    {
 | 
			
		||||
      const gchar *name = l->data;
 | 
			
		||||
      JsonNode *node = json_object_get_member (object, name);
 | 
			
		||||
      PropertyInfo *pinfo = g_slice_new0 (PropertyInfo);
 | 
			
		||||
 | 
			
		||||
      pinfo->name = g_strdelimit (g_strdup (name), G_STR_DELIMITERS, '-');
 | 
			
		||||
      pinfo->node = json_node_copy (node);
 | 
			
		||||
 | 
			
		||||
      oinfo->properties = g_list_prepend (oinfo->properties, pinfo);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  g_list_free (members);
 | 
			
		||||
 | 
			
		||||
  _clutter_script_construct_object (script, oinfo);
 | 
			
		||||
  _clutter_script_apply_properties (script, oinfo);
 | 
			
		||||
  retval = CLUTTER_TIMELINE (oinfo->object);
 | 
			
		||||
 | 
			
		||||
  /* we transfer ownership to the alpha function, so we ref before
 | 
			
		||||
   * destroying the ObjectInfo to avoid the timeline going away
 | 
			
		||||
   */
 | 
			
		||||
  g_object_ref (retval);
 | 
			
		||||
  object_info_free (oinfo);
 | 
			
		||||
 | 
			
		||||
  return retval;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* define the names of the animation modes to match the ones
 | 
			
		||||
 * that developers might be more accustomed to
 | 
			
		||||
 */
 | 
			
		||||
static const struct
 | 
			
		||||
{
 | 
			
		||||
  const gchar *name;
 | 
			
		||||
  ClutterAnimationMode mode;
 | 
			
		||||
} animation_modes[] = {
 | 
			
		||||
  { "linear", CLUTTER_LINEAR },
 | 
			
		||||
  { "easeInQuad", CLUTTER_EASE_IN_QUAD },
 | 
			
		||||
  { "easeOutQuad", CLUTTER_EASE_OUT_QUAD },
 | 
			
		||||
  { "easeInOutQuad", CLUTTER_EASE_IN_OUT_QUAD },
 | 
			
		||||
  { "easeInCubic", CLUTTER_EASE_IN_CUBIC },
 | 
			
		||||
  { "easeOutCubic", CLUTTER_EASE_OUT_CUBIC },
 | 
			
		||||
  { "easeInOutCubic", CLUTTER_EASE_IN_OUT_CUBIC },
 | 
			
		||||
  { "easeInQuart", CLUTTER_EASE_IN_QUART },
 | 
			
		||||
  { "easeOutQuart", CLUTTER_EASE_OUT_QUART },
 | 
			
		||||
  { "easeInOutQuart", CLUTTER_EASE_IN_OUT_QUART },
 | 
			
		||||
  { "easeInQuint", CLUTTER_EASE_IN_QUINT },
 | 
			
		||||
  { "easeOutQuint", CLUTTER_EASE_OUT_QUINT },
 | 
			
		||||
  { "easeInOutQuint", CLUTTER_EASE_IN_OUT_QUINT },
 | 
			
		||||
  { "easeInSine", CLUTTER_EASE_IN_SINE },
 | 
			
		||||
  { "easeOutSine", CLUTTER_EASE_OUT_SINE },
 | 
			
		||||
  { "easeInOutSine", CLUTTER_EASE_IN_OUT_SINE },
 | 
			
		||||
  { "easeInExpo", CLUTTER_EASE_IN_EXPO },
 | 
			
		||||
  { "easeOutExpo", CLUTTER_EASE_OUT_EXPO },
 | 
			
		||||
  { "easeInOutExpo", CLUTTER_EASE_IN_OUT_EXPO },
 | 
			
		||||
  { "easeInCirc", CLUTTER_EASE_IN_CIRC },
 | 
			
		||||
  { "easeOutCirc", CLUTTER_EASE_OUT_CIRC },
 | 
			
		||||
  { "easeInOutCirc", CLUTTER_EASE_IN_OUT_CIRC },
 | 
			
		||||
  { "easeInElastic", CLUTTER_EASE_IN_ELASTIC },
 | 
			
		||||
  { "easeOutElastic", CLUTTER_EASE_OUT_ELASTIC },
 | 
			
		||||
  { "easeInOutElastic", CLUTTER_EASE_IN_OUT_ELASTIC },
 | 
			
		||||
  { "easeInBack", CLUTTER_EASE_IN_BACK },
 | 
			
		||||
  { "easeOutBack", CLUTTER_EASE_OUT_BACK },
 | 
			
		||||
  { "easeInOutBack", CLUTTER_EASE_IN_OUT_BACK },
 | 
			
		||||
  { "easeInBounce", CLUTTER_EASE_IN_BOUNCE },
 | 
			
		||||
  { "easeOutBounce", CLUTTER_EASE_OUT_BOUNCE },
 | 
			
		||||
  { "easeInOutBounce", CLUTTER_EASE_IN_OUT_BOUNCE },
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static const gint n_animation_modes = G_N_ELEMENTS (animation_modes);
 | 
			
		||||
 | 
			
		||||
gulong
 | 
			
		||||
_clutter_script_resolve_animation_mode (JsonNode *node)
 | 
			
		||||
{
 | 
			
		||||
  gint i, res = CLUTTER_CUSTOM_MODE;
 | 
			
		||||
 | 
			
		||||
  if (JSON_NODE_TYPE (node) != JSON_NODE_VALUE)
 | 
			
		||||
    return CLUTTER_CUSTOM_MODE;
 | 
			
		||||
 | 
			
		||||
  if (json_node_get_value_type (node) == G_TYPE_INT64)
 | 
			
		||||
    return json_node_get_int (node);
 | 
			
		||||
 | 
			
		||||
  if (json_node_get_value_type (node) == G_TYPE_STRING)
 | 
			
		||||
    {
 | 
			
		||||
      const gchar *name = json_node_get_string (node);
 | 
			
		||||
 | 
			
		||||
      /* XXX - we might be able to optimize by changing the ordering
 | 
			
		||||
       * of the animation_modes array, e.g.
 | 
			
		||||
       *  - special casing linear
 | 
			
		||||
       *  - tokenizing ('ease', 'In', 'Sine') and matching on token
 | 
			
		||||
       *  - binary searching?
 | 
			
		||||
       */
 | 
			
		||||
      for (i = 0; i < n_animation_modes; i++)
 | 
			
		||||
        {
 | 
			
		||||
          if (strcmp (animation_modes[i].name, name) == 0)
 | 
			
		||||
            return animation_modes[i].mode;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
      if (_clutter_script_enum_from_string (CLUTTER_TYPE_ANIMATION_MODE,
 | 
			
		||||
                                            name,
 | 
			
		||||
                                            &res))
 | 
			
		||||
        return res;
 | 
			
		||||
 | 
			
		||||
      g_warning ("Unable to find the animation mode '%s'", name);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return CLUTTER_CUSTOM_MODE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static ClutterAlphaFunc
 | 
			
		||||
resolve_alpha_func (const gchar *name)
 | 
			
		||||
{
 | 
			
		||||
  static GModule *module = NULL;
 | 
			
		||||
  ClutterAlphaFunc func;
 | 
			
		||||
 | 
			
		||||
  CLUTTER_NOTE (SCRIPT, "Looking up '%s' alpha function", name);
 | 
			
		||||
 | 
			
		||||
  if (G_UNLIKELY (!module))
 | 
			
		||||
    module = g_module_open (NULL, 0);
 | 
			
		||||
 | 
			
		||||
  if (g_module_symbol (module, name, (gpointer) &func))
 | 
			
		||||
    {
 | 
			
		||||
      CLUTTER_NOTE (SCRIPT, "Found '%s' alpha function in the symbols table",
 | 
			
		||||
                    name);
 | 
			
		||||
      return func;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
GObject *
 | 
			
		||||
_clutter_script_parse_alpha (ClutterScript *script,
 | 
			
		||||
                             JsonNode      *node)
 | 
			
		||||
{
 | 
			
		||||
  GObject *retval = NULL;
 | 
			
		||||
  JsonObject *object;
 | 
			
		||||
  ClutterTimeline *timeline = NULL;
 | 
			
		||||
  ClutterAlphaFunc alpha_func = NULL;
 | 
			
		||||
  ClutterAnimationMode mode = CLUTTER_CUSTOM_MODE;
 | 
			
		||||
  JsonNode *val;
 | 
			
		||||
  gboolean unref_timeline = FALSE;
 | 
			
		||||
 | 
			
		||||
  if (JSON_NODE_TYPE (node) != JSON_NODE_OBJECT)
 | 
			
		||||
    return NULL;
 | 
			
		||||
 | 
			
		||||
  object = json_node_get_object (node);
 | 
			
		||||
 | 
			
		||||
  val = json_object_get_member (object, "timeline");
 | 
			
		||||
  if (val)
 | 
			
		||||
    {
 | 
			
		||||
      if (JSON_NODE_TYPE (val) == JSON_NODE_VALUE &&
 | 
			
		||||
          json_node_get_string (val) != NULL)
 | 
			
		||||
        {
 | 
			
		||||
          const gchar *id_ = json_node_get_string (val);
 | 
			
		||||
 | 
			
		||||
          timeline =
 | 
			
		||||
            CLUTTER_TIMELINE (clutter_script_get_object (script, id_));
 | 
			
		||||
        }
 | 
			
		||||
      else if (JSON_NODE_TYPE (val) == JSON_NODE_OBJECT)
 | 
			
		||||
        {
 | 
			
		||||
          timeline = construct_timeline (script, json_node_get_object (val));
 | 
			
		||||
          unref_timeline = TRUE;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  val = json_object_get_member (object, "mode");
 | 
			
		||||
  if (val != NULL)
 | 
			
		||||
    mode = _clutter_script_resolve_animation_mode (val);
 | 
			
		||||
 | 
			
		||||
  if (mode == CLUTTER_CUSTOM_MODE)
 | 
			
		||||
    {
 | 
			
		||||
      val = json_object_get_member (object, "function");
 | 
			
		||||
      if (val && json_node_get_string (val) != NULL)
 | 
			
		||||
        {
 | 
			
		||||
          alpha_func = resolve_alpha_func (json_node_get_string (val));
 | 
			
		||||
          if (!alpha_func)
 | 
			
		||||
            {
 | 
			
		||||
              g_warning ("Unable to find the function '%s' in the "
 | 
			
		||||
                         "Clutter alpha functions or the symbols table",
 | 
			
		||||
                         json_node_get_string (val));
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  CLUTTER_NOTE (SCRIPT, "Parsed alpha: %s timeline (%p) (mode:%d, func:%p)",
 | 
			
		||||
                unref_timeline ? "implicit" : "explicit",
 | 
			
		||||
                timeline ? timeline : 0x0,
 | 
			
		||||
                mode != CLUTTER_CUSTOM_MODE ? mode : 0,
 | 
			
		||||
                alpha_func ? alpha_func : 0x0);
 | 
			
		||||
 | 
			
		||||
  retval = g_object_new (CLUTTER_TYPE_ALPHA, NULL);
 | 
			
		||||
 | 
			
		||||
  if (mode != CLUTTER_CUSTOM_MODE)
 | 
			
		||||
    clutter_alpha_set_mode (CLUTTER_ALPHA (retval), mode);
 | 
			
		||||
 | 
			
		||||
  if (alpha_func != NULL)
 | 
			
		||||
    clutter_alpha_set_func (CLUTTER_ALPHA (retval), alpha_func, NULL, NULL);
 | 
			
		||||
 | 
			
		||||
  clutter_alpha_set_timeline (CLUTTER_ALPHA (retval), timeline);
 | 
			
		||||
 | 
			
		||||
  /* if we created an implicit timeline, the Alpha has full ownership
 | 
			
		||||
   * of it now, since it won't be accessible from ClutterScript
 | 
			
		||||
   */
 | 
			
		||||
  if (unref_timeline)
 | 
			
		||||
    g_object_unref (timeline);
 | 
			
		||||
 | 
			
		||||
  return retval;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_script_parser_object_end (JsonParser *json_parser,
 | 
			
		||||
                                  JsonObject *object)
 | 
			
		||||
 
 | 
			
		||||
@@ -110,6 +110,8 @@ gboolean _clutter_script_parse_node        (ClutterScript *script,
 | 
			
		||||
GType    _clutter_script_get_type_from_symbol (const gchar *symbol);
 | 
			
		||||
GType    _clutter_script_get_type_from_class  (const gchar *name);
 | 
			
		||||
 | 
			
		||||
gulong   _clutter_script_resolve_animation_mode (JsonNode *node);
 | 
			
		||||
 | 
			
		||||
gboolean _clutter_script_enum_from_string  (GType          gtype,
 | 
			
		||||
                                            const gchar   *string,
 | 
			
		||||
                                            gint          *enum_value);
 | 
			
		||||
@@ -126,6 +128,8 @@ gboolean _clutter_script_parse_rect        (ClutterScript   *script,
 | 
			
		||||
gboolean _clutter_script_parse_color       (ClutterScript   *script,
 | 
			
		||||
                                            JsonNode        *node,
 | 
			
		||||
                                            ClutterColor    *color);
 | 
			
		||||
GObject *_clutter_script_parse_alpha       (ClutterScript   *script,
 | 
			
		||||
                                            JsonNode        *node);
 | 
			
		||||
gboolean _clutter_script_parse_point       (ClutterScript    *script,
 | 
			
		||||
                                            JsonNode         *node,
 | 
			
		||||
                                            graphene_point_t *point);
 | 
			
		||||
 
 | 
			
		||||
@@ -98,6 +98,49 @@
 | 
			
		||||
 * respectively) and the "object" string member for calling
 | 
			
		||||
 * g_signal_connect_object() instead of g_signal_connect().
 | 
			
		||||
 *
 | 
			
		||||
 * Signals can also be directly attached to a specific state defined
 | 
			
		||||
 * inside a #ClutterState instance, for instance:
 | 
			
		||||
 *
 | 
			
		||||
 * |[
 | 
			
		||||
 *   ...
 | 
			
		||||
 *   "signals" : [
 | 
			
		||||
 *     {
 | 
			
		||||
 *       "name" : "enter-event",
 | 
			
		||||
 *       "states" : "button-states",
 | 
			
		||||
 *       "target-state" : "hover"
 | 
			
		||||
 *     },
 | 
			
		||||
 *     {
 | 
			
		||||
 *       "name" : "leave-event",
 | 
			
		||||
 *       "states" : "button-states",
 | 
			
		||||
 *       "target-state" : "base"
 | 
			
		||||
 *     },
 | 
			
		||||
 *     {
 | 
			
		||||
 *       "name" : "button-press-event",
 | 
			
		||||
 *       "states" : "button-states",
 | 
			
		||||
 *       "target-state" : "active",
 | 
			
		||||
 *     },
 | 
			
		||||
 *     {
 | 
			
		||||
 *       "name" : "key-press-event",
 | 
			
		||||
 *       "states" : "button-states",
 | 
			
		||||
 *       "target-state" : "key-focus",
 | 
			
		||||
 *       "warp" : true
 | 
			
		||||
 *     }
 | 
			
		||||
 *   ],
 | 
			
		||||
 *   ...
 | 
			
		||||
 * ]|
 | 
			
		||||
 *
 | 
			
		||||
 * The "states" key defines the #ClutterState instance to be used to
 | 
			
		||||
 * resolve the "target-state" key; it can be either a script id for a
 | 
			
		||||
 * #ClutterState built by the same #ClutterScript instance, or to a
 | 
			
		||||
 * #ClutterState built in code and associated to the #ClutterScript
 | 
			
		||||
 * instance through the clutter_script_add_states() function. If no
 | 
			
		||||
 * "states" key is present, then the default #ClutterState associated to
 | 
			
		||||
 * the #ClutterScript instance will be used; the default #ClutterState
 | 
			
		||||
 * can be set using clutter_script_add_states() using a %NULL name. The
 | 
			
		||||
 * "warp" key can be used to warp to a specific state instead of
 | 
			
		||||
 * animating to it. State changes on signal emission will not affect
 | 
			
		||||
 * the signal emission chain.
 | 
			
		||||
 *
 | 
			
		||||
 * Clutter reserves the following names, so classes defining properties
 | 
			
		||||
 * through the usual GObject registration process should avoid using these
 | 
			
		||||
 * names to avoid collisions:
 | 
			
		||||
@@ -141,7 +184,9 @@
 | 
			
		||||
#include "clutter-private.h"
 | 
			
		||||
#include "clutter-debug.h"
 | 
			
		||||
 | 
			
		||||
#include "deprecated/clutter-alpha.h"
 | 
			
		||||
#include "deprecated/clutter-container.h"
 | 
			
		||||
#include "deprecated/clutter-state.h"
 | 
			
		||||
 | 
			
		||||
enum
 | 
			
		||||
{
 | 
			
		||||
@@ -165,6 +210,8 @@ struct _ClutterScriptPrivate
 | 
			
		||||
 | 
			
		||||
  ClutterScriptParser *parser;
 | 
			
		||||
 | 
			
		||||
  GHashTable *states;
 | 
			
		||||
 | 
			
		||||
  gchar **search_paths;
 | 
			
		||||
 | 
			
		||||
  gchar *translation_domain;
 | 
			
		||||
@@ -217,6 +264,7 @@ signal_info_free (gpointer data)
 | 
			
		||||
      g_free (sinfo->name);
 | 
			
		||||
      g_free (sinfo->handler);
 | 
			
		||||
      g_free (sinfo->object);
 | 
			
		||||
      g_free (sinfo->state);
 | 
			
		||||
      g_free (sinfo->target);
 | 
			
		||||
 | 
			
		||||
      g_slice_free (SignalInfo, sinfo);
 | 
			
		||||
@@ -271,6 +319,7 @@ clutter_script_finalize (GObject *gobject)
 | 
			
		||||
  g_hash_table_destroy (priv->objects);
 | 
			
		||||
  g_strfreev (priv->search_paths);
 | 
			
		||||
  g_free (priv->filename);
 | 
			
		||||
  g_hash_table_destroy (priv->states);
 | 
			
		||||
  g_free (priv->translation_domain);
 | 
			
		||||
 | 
			
		||||
  G_OBJECT_CLASS (clutter_script_parent_class)->finalize (gobject);
 | 
			
		||||
@@ -405,6 +454,9 @@ clutter_script_init (ClutterScript *script)
 | 
			
		||||
  priv->objects = g_hash_table_new_full (g_str_hash, g_str_equal,
 | 
			
		||||
                                         NULL,
 | 
			
		||||
                                         object_info_free);
 | 
			
		||||
  priv->states = g_hash_table_new_full (g_str_hash, g_str_equal,
 | 
			
		||||
                                        g_free,
 | 
			
		||||
                                        (GDestroyNotify) g_object_unref);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -920,12 +972,65 @@ clutter_script_connect_signals (ClutterScript *script,
 | 
			
		||||
  g_free (cd);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
typedef struct {
 | 
			
		||||
  ClutterState *state;
 | 
			
		||||
  GObject *emitter;
 | 
			
		||||
  gchar *target;
 | 
			
		||||
  gulong signal_id;
 | 
			
		||||
  gulong hook_id;
 | 
			
		||||
  gboolean warp_to;
 | 
			
		||||
} HookData;
 | 
			
		||||
 | 
			
		||||
typedef struct {
 | 
			
		||||
  ClutterScript *script;
 | 
			
		||||
  ClutterScriptConnectFunc func;
 | 
			
		||||
  gpointer user_data;
 | 
			
		||||
} SignalConnectData;
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
hook_data_free (gpointer data)
 | 
			
		||||
{
 | 
			
		||||
  if (G_LIKELY (data != NULL))
 | 
			
		||||
    {
 | 
			
		||||
      HookData *hook_data = data;
 | 
			
		||||
 | 
			
		||||
      g_free (hook_data->target);
 | 
			
		||||
      g_slice_free (HookData, hook_data);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
clutter_script_state_change_hook (GSignalInvocationHint *ihint,
 | 
			
		||||
                                  guint                  n_params,
 | 
			
		||||
                                  const GValue          *params,
 | 
			
		||||
                                  gpointer               user_data)
 | 
			
		||||
{
 | 
			
		||||
  HookData *hook_data = user_data;
 | 
			
		||||
  GObject *emitter;
 | 
			
		||||
 | 
			
		||||
  emitter = g_value_get_object (¶ms[0]);
 | 
			
		||||
 | 
			
		||||
  if (emitter == hook_data->emitter)
 | 
			
		||||
    {
 | 
			
		||||
      if (hook_data->warp_to)
 | 
			
		||||
        clutter_state_warp_to_state (hook_data->state, hook_data->target);
 | 
			
		||||
      else
 | 
			
		||||
        clutter_state_set_state (hook_data->state, hook_data->target);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return TRUE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_script_remove_state_change_hook (gpointer  user_data,
 | 
			
		||||
                                         GObject  *object_p)
 | 
			
		||||
{
 | 
			
		||||
  HookData *hook_data = user_data;
 | 
			
		||||
 | 
			
		||||
  g_signal_remove_emission_hook (hook_data->signal_id,
 | 
			
		||||
                                 hook_data->hook_id);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
connect_each_object (gpointer key,
 | 
			
		||||
                     gpointer value,
 | 
			
		||||
@@ -965,7 +1070,64 @@ connect_each_object (gpointer key,
 | 
			
		||||
        }
 | 
			
		||||
      else
 | 
			
		||||
        {
 | 
			
		||||
          g_warn_if_reached ();
 | 
			
		||||
          GObject *state_object = NULL;
 | 
			
		||||
          const gchar *signal_name, *signal_detail;
 | 
			
		||||
          gchar **components;
 | 
			
		||||
          GQuark signal_quark;
 | 
			
		||||
          guint signal_id;
 | 
			
		||||
          HookData *hook_data;
 | 
			
		||||
 | 
			
		||||
          if (sinfo->state == NULL)
 | 
			
		||||
            state_object = (GObject *) clutter_script_get_states (script, NULL);
 | 
			
		||||
          else
 | 
			
		||||
            {
 | 
			
		||||
              state_object = clutter_script_get_object (script, sinfo->state);
 | 
			
		||||
              if (state_object == NULL)
 | 
			
		||||
                state_object = (GObject *) clutter_script_get_states (script, sinfo->state);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
          if (state_object == NULL)
 | 
			
		||||
            continue;
 | 
			
		||||
 | 
			
		||||
          components = g_strsplit (sinfo->name, "::", 2);
 | 
			
		||||
          if (g_strv_length (components) == 2)
 | 
			
		||||
            {
 | 
			
		||||
              signal_name = components[0];
 | 
			
		||||
              signal_detail = components[1];
 | 
			
		||||
            }
 | 
			
		||||
          else
 | 
			
		||||
            {
 | 
			
		||||
              signal_name = components[0];
 | 
			
		||||
              signal_detail = NULL;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
          signal_id = g_signal_lookup (signal_name, G_OBJECT_TYPE (object));
 | 
			
		||||
          if (signal_id == 0)
 | 
			
		||||
            {
 | 
			
		||||
              g_strfreev (components);
 | 
			
		||||
              continue;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
          if (signal_detail != NULL)
 | 
			
		||||
            signal_quark = g_quark_from_string (signal_detail);
 | 
			
		||||
          else
 | 
			
		||||
            signal_quark = 0;
 | 
			
		||||
 | 
			
		||||
          hook_data = g_slice_new (HookData);
 | 
			
		||||
          hook_data->emitter = object;
 | 
			
		||||
          hook_data->state = CLUTTER_STATE (state_object);
 | 
			
		||||
          hook_data->target = g_strdup (sinfo->target);
 | 
			
		||||
          hook_data->warp_to = sinfo->warp_to;
 | 
			
		||||
          hook_data->signal_id = signal_id;
 | 
			
		||||
          hook_data->hook_id =
 | 
			
		||||
            g_signal_add_emission_hook (signal_id, signal_quark,
 | 
			
		||||
                                        clutter_script_state_change_hook,
 | 
			
		||||
                                        hook_data,
 | 
			
		||||
                                        hook_data_free);
 | 
			
		||||
 | 
			
		||||
          g_object_weak_ref (hook_data->emitter,
 | 
			
		||||
                             clutter_script_remove_state_change_hook,
 | 
			
		||||
                             hook_data);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
      signal_info_free (sinfo);
 | 
			
		||||
@@ -1190,6 +1352,72 @@ clutter_script_list_objects (ClutterScript *script)
 | 
			
		||||
  return retval;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_script_add_states:
 | 
			
		||||
 * @script: a #ClutterScript
 | 
			
		||||
 * @name: (allow-none): a name for the @state, or %NULL to
 | 
			
		||||
 *   set the default #ClutterState
 | 
			
		||||
 * @state: a #ClutterState
 | 
			
		||||
 *
 | 
			
		||||
 * Associates a #ClutterState to the #ClutterScript instance using the given
 | 
			
		||||
 * name.
 | 
			
		||||
 *
 | 
			
		||||
 * The #ClutterScript instance will use @state to resolve target states when
 | 
			
		||||
 * connecting signal handlers.
 | 
			
		||||
 *
 | 
			
		||||
 * The #ClutterScript instance will take a reference on the #ClutterState
 | 
			
		||||
 * passed to this function.
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 1.8
 | 
			
		||||
 *
 | 
			
		||||
 * Deprecated: 1.12
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
clutter_script_add_states (ClutterScript *script,
 | 
			
		||||
                           const gchar   *name,
 | 
			
		||||
                           ClutterState  *state)
 | 
			
		||||
{
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_SCRIPT (script));
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_STATE (state));
 | 
			
		||||
 | 
			
		||||
  if (name == NULL || *name == '\0')
 | 
			
		||||
    name = "__clutter_script_default_state";
 | 
			
		||||
 | 
			
		||||
  g_hash_table_replace (script->priv->states,
 | 
			
		||||
                        g_strdup (name),
 | 
			
		||||
                        g_object_ref (state));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_script_get_states:
 | 
			
		||||
 * @script: a #ClutterScript
 | 
			
		||||
 * @name: (allow-none): the name of the #ClutterState, or %NULL
 | 
			
		||||
 *
 | 
			
		||||
 * Retrieves the #ClutterState for the given @state_name.
 | 
			
		||||
 *
 | 
			
		||||
 * If @name is %NULL, this function will return the default
 | 
			
		||||
 * #ClutterState instance.
 | 
			
		||||
 *
 | 
			
		||||
 * Return value: (transfer none): a pointer to the #ClutterState for the
 | 
			
		||||
 *   given name. The #ClutterState is owned by the #ClutterScript instance
 | 
			
		||||
 *   and it should not be unreferenced
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 1.8
 | 
			
		||||
 *
 | 
			
		||||
 * Deprecated: 1.12
 | 
			
		||||
 */
 | 
			
		||||
ClutterState *
 | 
			
		||||
clutter_script_get_states (ClutterScript *script,
 | 
			
		||||
                           const gchar   *name)
 | 
			
		||||
{
 | 
			
		||||
  g_return_val_if_fail (CLUTTER_IS_SCRIPT (script), NULL);
 | 
			
		||||
 | 
			
		||||
  if (name == NULL || *name == '\0')
 | 
			
		||||
    name = "__clutter_script_default_state";
 | 
			
		||||
 | 
			
		||||
  return g_hash_table_lookup (script->priv->states, name);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_script_set_translation_domain:
 | 
			
		||||
 * @script: a #ClutterScript
 | 
			
		||||
 
 | 
			
		||||
@@ -179,6 +179,15 @@ void            clutter_script_unmerge_objects          (ClutterScript
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void            clutter_script_ensure_objects           (ClutterScript             *script);
 | 
			
		||||
 | 
			
		||||
CLUTTER_DEPRECATED
 | 
			
		||||
void            clutter_script_add_states               (ClutterScript             *script,
 | 
			
		||||
                                                         const gchar               *name,
 | 
			
		||||
                                                         ClutterState              *state);
 | 
			
		||||
 | 
			
		||||
CLUTTER_DEPRECATED
 | 
			
		||||
ClutterState *  clutter_script_get_states               (ClutterScript             *script,
 | 
			
		||||
                                                         const gchar               *name);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void            clutter_script_connect_signals          (ClutterScript             *script,
 | 
			
		||||
                                                         gpointer                   user_data);
 | 
			
		||||
 
 | 
			
		||||
@@ -1,700 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Clutter.
 | 
			
		||||
 *
 | 
			
		||||
 * An OpenGL based 'interactive canvas' library.
 | 
			
		||||
 *
 | 
			
		||||
 * 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/>.
 | 
			
		||||
 *
 | 
			
		||||
 * Author: Carlos Garnacho <carlosg@gnome.org>
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "clutter-build-config.h"
 | 
			
		||||
 | 
			
		||||
#include "clutter-backend-private.h"
 | 
			
		||||
#include "clutter-input-device-tool.h"
 | 
			
		||||
#include "clutter-input-pointer-a11y-private.h"
 | 
			
		||||
#include "clutter-marshal.h"
 | 
			
		||||
#include "clutter-private.h"
 | 
			
		||||
#include "clutter-seat.h"
 | 
			
		||||
#include "clutter-virtual-input-device.h"
 | 
			
		||||
 | 
			
		||||
enum
 | 
			
		||||
{
 | 
			
		||||
  DEVICE_ADDED,
 | 
			
		||||
  DEVICE_REMOVED,
 | 
			
		||||
  TOOL_CHANGED,
 | 
			
		||||
  KBD_A11Y_MASK_CHANGED,
 | 
			
		||||
  KBD_A11Y_FLAGS_CHANGED,
 | 
			
		||||
  PTR_A11Y_DWELL_CLICK_TYPE_CHANGED,
 | 
			
		||||
  PTR_A11Y_TIMEOUT_STARTED,
 | 
			
		||||
  PTR_A11Y_TIMEOUT_STOPPED,
 | 
			
		||||
  IS_UNFOCUS_INHIBITED_CHANGED,
 | 
			
		||||
  N_SIGNALS,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static guint signals[N_SIGNALS] = { 0 };
 | 
			
		||||
 | 
			
		||||
enum
 | 
			
		||||
{
 | 
			
		||||
  PROP_0,
 | 
			
		||||
  PROP_BACKEND,
 | 
			
		||||
  PROP_TOUCH_MODE,
 | 
			
		||||
  N_PROPS
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static GParamSpec *props[N_PROPS];
 | 
			
		||||
 | 
			
		||||
typedef struct _ClutterSeatPrivate ClutterSeatPrivate;
 | 
			
		||||
 | 
			
		||||
struct _ClutterSeatPrivate
 | 
			
		||||
{
 | 
			
		||||
  ClutterBackend *backend;
 | 
			
		||||
 | 
			
		||||
  unsigned int inhibit_unfocus_count;
 | 
			
		||||
 | 
			
		||||
  /* Keyboard a11y */
 | 
			
		||||
  ClutterKbdA11ySettings kbd_a11y_settings;
 | 
			
		||||
 | 
			
		||||
  /* Pointer a11y */
 | 
			
		||||
  ClutterPointerA11ySettings pointer_a11y_settings;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (ClutterSeat, clutter_seat, G_TYPE_OBJECT)
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_seat_set_property (GObject      *object,
 | 
			
		||||
                           guint         prop_id,
 | 
			
		||||
                           const GValue *value,
 | 
			
		||||
                           GParamSpec   *pspec)
 | 
			
		||||
{
 | 
			
		||||
  ClutterSeat *seat = CLUTTER_SEAT (object);
 | 
			
		||||
  ClutterSeatPrivate *priv = clutter_seat_get_instance_private (seat);
 | 
			
		||||
 | 
			
		||||
  switch (prop_id)
 | 
			
		||||
    {
 | 
			
		||||
    case PROP_BACKEND:
 | 
			
		||||
      priv->backend = g_value_get_object (value);
 | 
			
		||||
      break;
 | 
			
		||||
    case PROP_TOUCH_MODE:
 | 
			
		||||
    default:
 | 
			
		||||
      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_seat_get_property (GObject    *object,
 | 
			
		||||
                           guint       prop_id,
 | 
			
		||||
                           GValue     *value,
 | 
			
		||||
                           GParamSpec *pspec)
 | 
			
		||||
{
 | 
			
		||||
  ClutterSeat *seat = CLUTTER_SEAT (object);
 | 
			
		||||
  ClutterSeatPrivate *priv = clutter_seat_get_instance_private (seat);
 | 
			
		||||
 | 
			
		||||
  switch (prop_id)
 | 
			
		||||
    {
 | 
			
		||||
    case PROP_BACKEND:
 | 
			
		||||
      g_value_set_object (value, priv->backend);
 | 
			
		||||
      break;
 | 
			
		||||
    case PROP_TOUCH_MODE:
 | 
			
		||||
      g_value_set_boolean (value, FALSE);
 | 
			
		||||
      break;
 | 
			
		||||
    default:
 | 
			
		||||
      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_seat_finalize (GObject *object)
 | 
			
		||||
{
 | 
			
		||||
  ClutterSeat *seat = CLUTTER_SEAT (object);
 | 
			
		||||
  ClutterSeatPrivate *priv = clutter_seat_get_instance_private (seat);
 | 
			
		||||
 | 
			
		||||
  g_clear_object (&priv->backend);
 | 
			
		||||
 | 
			
		||||
  G_OBJECT_CLASS (clutter_seat_parent_class)->finalize (object);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_seat_class_init (ClutterSeatClass *klass)
 | 
			
		||||
{
 | 
			
		||||
  GObjectClass *object_class = G_OBJECT_CLASS (klass);
 | 
			
		||||
 | 
			
		||||
  object_class->set_property = clutter_seat_set_property;
 | 
			
		||||
  object_class->get_property = clutter_seat_get_property;
 | 
			
		||||
  object_class->finalize = clutter_seat_finalize;
 | 
			
		||||
 | 
			
		||||
  signals[DEVICE_ADDED] =
 | 
			
		||||
    g_signal_new (I_("device-added"),
 | 
			
		||||
                  G_TYPE_FROM_CLASS (object_class),
 | 
			
		||||
                  G_SIGNAL_RUN_LAST,
 | 
			
		||||
                  0, NULL, NULL, NULL,
 | 
			
		||||
                  G_TYPE_NONE, 1,
 | 
			
		||||
                  CLUTTER_TYPE_INPUT_DEVICE);
 | 
			
		||||
 | 
			
		||||
  signals[DEVICE_REMOVED] =
 | 
			
		||||
    g_signal_new (I_("device-removed"),
 | 
			
		||||
                  G_TYPE_FROM_CLASS (object_class),
 | 
			
		||||
                  G_SIGNAL_RUN_LAST,
 | 
			
		||||
                  0, NULL, NULL, NULL,
 | 
			
		||||
                  G_TYPE_NONE, 1,
 | 
			
		||||
                  CLUTTER_TYPE_INPUT_DEVICE);
 | 
			
		||||
  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);
 | 
			
		||||
  g_signal_set_va_marshaller (signals[TOOL_CHANGED],
 | 
			
		||||
                              G_TYPE_FROM_CLASS (object_class),
 | 
			
		||||
                              _clutter_marshal_VOID__OBJECT_OBJECTv);
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * ClutterSeat::kbd-a11y-mods-state-changed:
 | 
			
		||||
   * @seat: the #ClutterSeat 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.
 | 
			
		||||
   */
 | 
			
		||||
  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);
 | 
			
		||||
  g_signal_set_va_marshaller (signals[KBD_A11Y_MASK_CHANGED],
 | 
			
		||||
                              G_TYPE_FROM_CLASS (object_class),
 | 
			
		||||
                              _clutter_marshal_VOID__UINT_UINTv);
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * ClutterSeat::kbd-a11y-flags-changed:
 | 
			
		||||
   * @seat: the #ClutterSeat 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 accessibility operations.
 | 
			
		||||
   */
 | 
			
		||||
  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);
 | 
			
		||||
  g_signal_set_va_marshaller (signals[KBD_A11Y_FLAGS_CHANGED],
 | 
			
		||||
                              G_TYPE_FROM_CLASS (object_class),
 | 
			
		||||
                              _clutter_marshal_VOID__UINT_UINTv);
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * ClutterSeat::ptr-a11y-dwell-click-type-changed:
 | 
			
		||||
   * @seat: the #ClutterSeat that emitted the signal
 | 
			
		||||
   * @click_type: the new #ClutterPointerA11yDwellClickType mode
 | 
			
		||||
   *
 | 
			
		||||
   * The ::ptr-a11y-dwell-click-type-changed signal is emitted each time
 | 
			
		||||
   * the ClutterPointerA11yDwellClickType mode is changed as the result
 | 
			
		||||
   * of pointer accessibility operations.
 | 
			
		||||
   */
 | 
			
		||||
  signals[PTR_A11Y_DWELL_CLICK_TYPE_CHANGED] =
 | 
			
		||||
    g_signal_new (I_("ptr-a11y-dwell-click-type-changed"),
 | 
			
		||||
                  G_TYPE_FROM_CLASS (klass),
 | 
			
		||||
                  G_SIGNAL_RUN_LAST,
 | 
			
		||||
                  0, NULL, NULL, NULL,
 | 
			
		||||
                  G_TYPE_NONE, 1,
 | 
			
		||||
                  CLUTTER_TYPE_POINTER_A11Y_DWELL_CLICK_TYPE);
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * ClutterSeat::ptr-a11y-timeout-started:
 | 
			
		||||
   * @seat: the #ClutterSeat that emitted the signal
 | 
			
		||||
   * @device: the core pointer #ClutterInputDevice
 | 
			
		||||
   * @timeout_type: the type of timeout #ClutterPointerA11yTimeoutType
 | 
			
		||||
   * @delay: the delay in ms before secondary-click is triggered.
 | 
			
		||||
   *
 | 
			
		||||
   * The ::ptr-a11y-timeout-started signal is emitted when a
 | 
			
		||||
   * pointer accessibility timeout delay is started, so that upper
 | 
			
		||||
   * layers can notify the user with some visual feedback.
 | 
			
		||||
   */
 | 
			
		||||
  signals[PTR_A11Y_TIMEOUT_STARTED] =
 | 
			
		||||
    g_signal_new (I_("ptr-a11y-timeout-started"),
 | 
			
		||||
                  G_TYPE_FROM_CLASS (klass),
 | 
			
		||||
                  G_SIGNAL_RUN_LAST,
 | 
			
		||||
                  0, NULL, NULL,
 | 
			
		||||
                  _clutter_marshal_VOID__OBJECT_FLAGS_UINT,
 | 
			
		||||
                  G_TYPE_NONE, 3,
 | 
			
		||||
                  CLUTTER_TYPE_INPUT_DEVICE,
 | 
			
		||||
                  CLUTTER_TYPE_POINTER_A11Y_TIMEOUT_TYPE,
 | 
			
		||||
                  G_TYPE_UINT);
 | 
			
		||||
  g_signal_set_va_marshaller (signals[PTR_A11Y_TIMEOUT_STARTED],
 | 
			
		||||
                              G_TYPE_FROM_CLASS (object_class),
 | 
			
		||||
                              _clutter_marshal_VOID__OBJECT_FLAGS_UINTv);
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * ClutterSeat::ptr-a11y-timeout-stopped:
 | 
			
		||||
   * @seat: the #ClutterSeat that emitted the signal
 | 
			
		||||
   * @device: the core pointer #ClutterInputDevice
 | 
			
		||||
   * @timeout_type: the type of timeout #ClutterPointerA11yTimeoutType
 | 
			
		||||
   * @clicked: %TRUE if the timeout finished and triggered a click
 | 
			
		||||
   *
 | 
			
		||||
   * The ::ptr-a11y-timeout-stopped signal is emitted when a running
 | 
			
		||||
   * pointer accessibility timeout delay is stopped, either because
 | 
			
		||||
   * it's triggered at the end of the delay or cancelled, so that
 | 
			
		||||
   * upper layers can notify the user with some visual feedback.
 | 
			
		||||
   */
 | 
			
		||||
  signals[PTR_A11Y_TIMEOUT_STOPPED] =
 | 
			
		||||
    g_signal_new (I_("ptr-a11y-timeout-stopped"),
 | 
			
		||||
                  G_TYPE_FROM_CLASS (klass),
 | 
			
		||||
                  G_SIGNAL_RUN_LAST,
 | 
			
		||||
                  0, NULL, NULL,
 | 
			
		||||
                  _clutter_marshal_VOID__OBJECT_FLAGS_BOOLEAN,
 | 
			
		||||
                  G_TYPE_NONE, 3,
 | 
			
		||||
                  CLUTTER_TYPE_INPUT_DEVICE,
 | 
			
		||||
                  CLUTTER_TYPE_POINTER_A11Y_TIMEOUT_TYPE,
 | 
			
		||||
                  G_TYPE_BOOLEAN);
 | 
			
		||||
  g_signal_set_va_marshaller (signals[PTR_A11Y_TIMEOUT_STOPPED],
 | 
			
		||||
                              G_TYPE_FROM_CLASS (object_class),
 | 
			
		||||
                              _clutter_marshal_VOID__OBJECT_FLAGS_BOOLEANv);
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * ClutterSeat::is-unfocus-inhibited-changed:
 | 
			
		||||
   * @seat: the #ClutterSeat that emitted the signal
 | 
			
		||||
   *
 | 
			
		||||
   * The ::is-unfocus-inhibited-changed signal is emitted when the
 | 
			
		||||
   * property to inhibit the unsetting of the focus-surface of the
 | 
			
		||||
   * #ClutterSeat changed. To get the current state of this property,
 | 
			
		||||
   * use clutter_seat_is_unfocus_inhibited().
 | 
			
		||||
   */
 | 
			
		||||
  signals[IS_UNFOCUS_INHIBITED_CHANGED] =
 | 
			
		||||
    g_signal_new (I_("is-unfocus-inhibited-changed"),
 | 
			
		||||
                  G_TYPE_FROM_CLASS (klass),
 | 
			
		||||
                  G_SIGNAL_RUN_LAST,
 | 
			
		||||
                  0, NULL, NULL, NULL,
 | 
			
		||||
                  G_TYPE_NONE, 0);
 | 
			
		||||
 | 
			
		||||
  props[PROP_BACKEND] =
 | 
			
		||||
    g_param_spec_object ("backend",
 | 
			
		||||
                         P_("Backend"),
 | 
			
		||||
                         P_("Backend"),
 | 
			
		||||
                         CLUTTER_TYPE_BACKEND,
 | 
			
		||||
                         CLUTTER_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY);
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * ClutterSeat:touch-mode:
 | 
			
		||||
   *
 | 
			
		||||
   * The current touch-mode of the #ClutterSeat, it is set to %TRUE if the
 | 
			
		||||
   * requirements documented in clutter_seat_get_touch_mode() are fulfilled.
 | 
			
		||||
   **/
 | 
			
		||||
  props[PROP_TOUCH_MODE] =
 | 
			
		||||
    g_param_spec_boolean ("touch-mode",
 | 
			
		||||
                          P_("Touch mode"),
 | 
			
		||||
                          P_("Touch mode"),
 | 
			
		||||
                          FALSE,
 | 
			
		||||
                          CLUTTER_PARAM_READABLE);
 | 
			
		||||
 | 
			
		||||
  g_object_class_install_properties (object_class, N_PROPS, props);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_seat_init (ClutterSeat *seat)
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_seat_get_pointer:
 | 
			
		||||
 * @seat: a #ClutterSeat
 | 
			
		||||
 *
 | 
			
		||||
 * Returns the master pointer
 | 
			
		||||
 *
 | 
			
		||||
 * Returns: (transfer none): the master pointer
 | 
			
		||||
 **/
 | 
			
		||||
ClutterInputDevice *
 | 
			
		||||
clutter_seat_get_pointer (ClutterSeat *seat)
 | 
			
		||||
{
 | 
			
		||||
  g_return_val_if_fail (CLUTTER_IS_SEAT (seat), NULL);
 | 
			
		||||
 | 
			
		||||
  return CLUTTER_SEAT_GET_CLASS (seat)->get_pointer (seat);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_seat_get_keyboard:
 | 
			
		||||
 * @seat: a #ClutterSeat
 | 
			
		||||
 *
 | 
			
		||||
 * Returns the master keyboard
 | 
			
		||||
 *
 | 
			
		||||
 * Returns: (transfer none): the master keyboard
 | 
			
		||||
 **/
 | 
			
		||||
ClutterInputDevice *
 | 
			
		||||
clutter_seat_get_keyboard (ClutterSeat *seat)
 | 
			
		||||
{
 | 
			
		||||
  g_return_val_if_fail (CLUTTER_IS_SEAT (seat), NULL);
 | 
			
		||||
 | 
			
		||||
  return CLUTTER_SEAT_GET_CLASS (seat)->get_keyboard (seat);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_seat_list_devices:
 | 
			
		||||
 * @seat: a #ClutterSeat
 | 
			
		||||
 *
 | 
			
		||||
 * Returns the list of HW devices
 | 
			
		||||
 *
 | 
			
		||||
 * Returns: (transfer container) (element-type Clutter.InputDevice): A list
 | 
			
		||||
 *   of #ClutterInputDevice. The elements of the returned list are owned by
 | 
			
		||||
 *   Clutter and may not be freed, the returned list should be freed using
 | 
			
		||||
 *   g_list_free() when done.
 | 
			
		||||
 **/
 | 
			
		||||
GList *
 | 
			
		||||
clutter_seat_list_devices (ClutterSeat *seat)
 | 
			
		||||
{
 | 
			
		||||
  g_return_val_if_fail (CLUTTER_IS_SEAT (seat), NULL);
 | 
			
		||||
 | 
			
		||||
  return CLUTTER_SEAT_GET_CLASS (seat)->list_devices (seat);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
clutter_seat_bell_notify (ClutterSeat *seat)
 | 
			
		||||
{
 | 
			
		||||
  CLUTTER_SEAT_GET_CLASS (seat)->bell_notify (seat);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_seat_get_keymap:
 | 
			
		||||
 * @seat: a #ClutterSeat
 | 
			
		||||
 *
 | 
			
		||||
 * Returns the seat keymap
 | 
			
		||||
 *
 | 
			
		||||
 * Returns: (transfer none): the seat keymap
 | 
			
		||||
 **/
 | 
			
		||||
ClutterKeymap *
 | 
			
		||||
clutter_seat_get_keymap (ClutterSeat *seat)
 | 
			
		||||
{
 | 
			
		||||
  return CLUTTER_SEAT_GET_CLASS (seat)->get_keymap (seat);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
are_kbd_a11y_settings_equal (ClutterKbdA11ySettings *a,
 | 
			
		||||
                             ClutterKbdA11ySettings *b)
 | 
			
		||||
{
 | 
			
		||||
  return (memcmp (a, b, sizeof (ClutterKbdA11ySettings)) == 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
clutter_seat_set_kbd_a11y_settings (ClutterSeat            *seat,
 | 
			
		||||
                                    ClutterKbdA11ySettings *settings)
 | 
			
		||||
{
 | 
			
		||||
  ClutterSeatClass *seat_class;
 | 
			
		||||
  ClutterSeatPrivate *priv = clutter_seat_get_instance_private (seat);
 | 
			
		||||
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_SEAT (seat));
 | 
			
		||||
 | 
			
		||||
  if (are_kbd_a11y_settings_equal (&priv->kbd_a11y_settings, settings))
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  priv->kbd_a11y_settings = *settings;
 | 
			
		||||
 | 
			
		||||
  seat_class = CLUTTER_SEAT_GET_CLASS (seat);
 | 
			
		||||
  if (seat_class->apply_kbd_a11y_settings)
 | 
			
		||||
    seat_class->apply_kbd_a11y_settings (seat, settings);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
clutter_seat_get_kbd_a11y_settings (ClutterSeat            *seat,
 | 
			
		||||
                                    ClutterKbdA11ySettings *settings)
 | 
			
		||||
{
 | 
			
		||||
  ClutterSeatPrivate *priv = clutter_seat_get_instance_private (seat);
 | 
			
		||||
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_SEAT (seat));
 | 
			
		||||
 | 
			
		||||
  *settings = priv->kbd_a11y_settings;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
clutter_seat_ensure_a11y_state (ClutterSeat *seat)
 | 
			
		||||
{
 | 
			
		||||
  ClutterInputDevice *core_pointer;
 | 
			
		||||
 | 
			
		||||
  core_pointer = clutter_seat_get_pointer (seat);
 | 
			
		||||
 | 
			
		||||
  if (core_pointer)
 | 
			
		||||
    {
 | 
			
		||||
      if (_clutter_is_input_pointer_a11y_enabled (core_pointer))
 | 
			
		||||
        _clutter_input_pointer_a11y_add_device (core_pointer);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
are_pointer_a11y_settings_equal (ClutterPointerA11ySettings *a,
 | 
			
		||||
                                 ClutterPointerA11ySettings *b)
 | 
			
		||||
{
 | 
			
		||||
  return (memcmp (a, b, sizeof (ClutterPointerA11ySettings)) == 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_seat_enable_pointer_a11y (ClutterSeat *seat)
 | 
			
		||||
{
 | 
			
		||||
  ClutterInputDevice *core_pointer;
 | 
			
		||||
 | 
			
		||||
  core_pointer = clutter_seat_get_pointer (seat);
 | 
			
		||||
 | 
			
		||||
  _clutter_input_pointer_a11y_add_device (core_pointer);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_seat_disable_pointer_a11y (ClutterSeat *seat)
 | 
			
		||||
{
 | 
			
		||||
  ClutterInputDevice *core_pointer;
 | 
			
		||||
 | 
			
		||||
  core_pointer = clutter_seat_get_pointer (seat);
 | 
			
		||||
 | 
			
		||||
  _clutter_input_pointer_a11y_remove_device (core_pointer);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_seat_set_pointer_a11y_settings:
 | 
			
		||||
 * @seat: a #ClutterSeat
 | 
			
		||||
 * @settings: a pointer to a #ClutterPointerA11ySettings
 | 
			
		||||
 *
 | 
			
		||||
 * Sets the pointer accessibility settings
 | 
			
		||||
 **/
 | 
			
		||||
void
 | 
			
		||||
clutter_seat_set_pointer_a11y_settings (ClutterSeat                *seat,
 | 
			
		||||
                                        ClutterPointerA11ySettings *settings)
 | 
			
		||||
{
 | 
			
		||||
  ClutterSeatPrivate *priv = clutter_seat_get_instance_private (seat);
 | 
			
		||||
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_SEAT (seat));
 | 
			
		||||
 | 
			
		||||
  if (are_pointer_a11y_settings_equal (&priv->pointer_a11y_settings, settings))
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  if (priv->pointer_a11y_settings.controls == 0 && settings->controls != 0)
 | 
			
		||||
    clutter_seat_enable_pointer_a11y (seat);
 | 
			
		||||
  else if (priv->pointer_a11y_settings.controls != 0 && settings->controls == 0)
 | 
			
		||||
    clutter_seat_disable_pointer_a11y (seat);
 | 
			
		||||
 | 
			
		||||
  priv->pointer_a11y_settings = *settings;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_seat_get_pointer_a11y_settings:
 | 
			
		||||
 * @seat: a #ClutterSeat
 | 
			
		||||
 * @settings: a pointer to a #ClutterPointerA11ySettings
 | 
			
		||||
 *
 | 
			
		||||
 * Gets the current pointer accessibility settings
 | 
			
		||||
 **/
 | 
			
		||||
void
 | 
			
		||||
clutter_seat_get_pointer_a11y_settings (ClutterSeat                *seat,
 | 
			
		||||
                                        ClutterPointerA11ySettings *settings)
 | 
			
		||||
{
 | 
			
		||||
  ClutterSeatPrivate *priv = clutter_seat_get_instance_private (seat);
 | 
			
		||||
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_SEAT (seat));
 | 
			
		||||
 | 
			
		||||
  *settings = priv->pointer_a11y_settings;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_seat_set_pointer_a11y_dwell_click_type:
 | 
			
		||||
 * @seat: a #ClutterSeat
 | 
			
		||||
 * @click_type: type of click as #ClutterPointerA11yDwellClickType
 | 
			
		||||
 *
 | 
			
		||||
 * Sets the dwell click type
 | 
			
		||||
 **/
 | 
			
		||||
void
 | 
			
		||||
clutter_seat_set_pointer_a11y_dwell_click_type (ClutterSeat                      *seat,
 | 
			
		||||
                                                ClutterPointerA11yDwellClickType  click_type)
 | 
			
		||||
{
 | 
			
		||||
  ClutterSeatPrivate *priv = clutter_seat_get_instance_private (seat);
 | 
			
		||||
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_SEAT (seat));
 | 
			
		||||
 | 
			
		||||
  priv->pointer_a11y_settings.dwell_click_type = click_type;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_seat_inhibit_unfocus:
 | 
			
		||||
 * @seat: a #ClutterSeat
 | 
			
		||||
 *
 | 
			
		||||
 * Inhibits unsetting of the pointer focus-surface for the #ClutterSeat @seat,
 | 
			
		||||
 * this allows to keep using the pointer even when it's hidden.
 | 
			
		||||
 *
 | 
			
		||||
 * This property is refcounted, so clutter_seat_uninhibit_unfocus() must be
 | 
			
		||||
 * called the exact same number of times as clutter_seat_inhibit_unfocus()
 | 
			
		||||
 * was called before.
 | 
			
		||||
 **/
 | 
			
		||||
void
 | 
			
		||||
clutter_seat_inhibit_unfocus (ClutterSeat *seat)
 | 
			
		||||
{
 | 
			
		||||
  ClutterSeatPrivate *priv;
 | 
			
		||||
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_SEAT (seat));
 | 
			
		||||
 | 
			
		||||
  priv = clutter_seat_get_instance_private (seat);
 | 
			
		||||
 | 
			
		||||
  priv->inhibit_unfocus_count++;
 | 
			
		||||
 | 
			
		||||
  if (priv->inhibit_unfocus_count == 1)
 | 
			
		||||
    g_signal_emit (G_OBJECT (seat), signals[IS_UNFOCUS_INHIBITED_CHANGED], 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_seat_uninhibit_unfocus:
 | 
			
		||||
 * @seat: a #ClutterSeat
 | 
			
		||||
 *
 | 
			
		||||
 * Disables the inhibiting of unsetting of the pointer focus-surface
 | 
			
		||||
 * previously enabled by calling clutter_seat_inhibit_unfocus().
 | 
			
		||||
 *
 | 
			
		||||
 * This property is refcounted, so clutter_seat_uninhibit_unfocus() must be
 | 
			
		||||
 * called the exact same number of times as clutter_seat_inhibit_unfocus()
 | 
			
		||||
 * was called before.
 | 
			
		||||
 **/
 | 
			
		||||
void
 | 
			
		||||
clutter_seat_uninhibit_unfocus (ClutterSeat *seat)
 | 
			
		||||
{
 | 
			
		||||
  ClutterSeatPrivate *priv;
 | 
			
		||||
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_SEAT (seat));
 | 
			
		||||
 | 
			
		||||
  priv = clutter_seat_get_instance_private (seat);
 | 
			
		||||
 | 
			
		||||
  if (priv->inhibit_unfocus_count == 0)
 | 
			
		||||
    {
 | 
			
		||||
      g_warning ("Called clutter_seat_uninhibit_unfocus without inhibiting before");
 | 
			
		||||
      return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  priv->inhibit_unfocus_count--;
 | 
			
		||||
 | 
			
		||||
  if (priv->inhibit_unfocus_count == 0)
 | 
			
		||||
    g_signal_emit (G_OBJECT (seat), signals[IS_UNFOCUS_INHIBITED_CHANGED], 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_seat_is_unfocus_inhibited:
 | 
			
		||||
 * @seat: a #ClutterSeat
 | 
			
		||||
 *
 | 
			
		||||
 * Gets whether unsetting of the pointer focus-surface is inhibited
 | 
			
		||||
 * for the #ClutterSeat @seat.
 | 
			
		||||
 *
 | 
			
		||||
 * Returns: %TRUE if unsetting is inhibited, %FALSE otherwise
 | 
			
		||||
 **/
 | 
			
		||||
gboolean
 | 
			
		||||
clutter_seat_is_unfocus_inhibited (ClutterSeat *seat)
 | 
			
		||||
{
 | 
			
		||||
  ClutterSeatPrivate *priv;
 | 
			
		||||
 | 
			
		||||
  g_return_val_if_fail (CLUTTER_IS_SEAT (seat), FALSE);
 | 
			
		||||
 | 
			
		||||
  priv = clutter_seat_get_instance_private (seat);
 | 
			
		||||
 | 
			
		||||
  return priv->inhibit_unfocus_count > 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_seat_create_virtual_device:
 | 
			
		||||
 * @seat: a #ClutterSeat
 | 
			
		||||
 * @device_type: the type of the virtual device
 | 
			
		||||
 *
 | 
			
		||||
 * Creates a virtual input device.
 | 
			
		||||
 *
 | 
			
		||||
 * Returns: (transfer full): a newly created virtual device
 | 
			
		||||
 **/
 | 
			
		||||
ClutterVirtualInputDevice *
 | 
			
		||||
clutter_seat_create_virtual_device (ClutterSeat            *seat,
 | 
			
		||||
                                    ClutterInputDeviceType  device_type)
 | 
			
		||||
{
 | 
			
		||||
  ClutterSeatClass *seat_class;
 | 
			
		||||
 | 
			
		||||
  g_return_val_if_fail (CLUTTER_IS_SEAT (seat), NULL);
 | 
			
		||||
 | 
			
		||||
  seat_class = CLUTTER_SEAT_GET_CLASS (seat);
 | 
			
		||||
  return seat_class->create_virtual_device (seat, device_type);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_seat_supported_virtual_device_types: (skip)
 | 
			
		||||
 */
 | 
			
		||||
ClutterVirtualDeviceType
 | 
			
		||||
clutter_seat_get_supported_virtual_device_types (ClutterSeat *seat)
 | 
			
		||||
{
 | 
			
		||||
  ClutterSeatClass *seat_class;
 | 
			
		||||
 | 
			
		||||
  g_return_val_if_fail (CLUTTER_IS_SEAT (seat),
 | 
			
		||||
                        CLUTTER_VIRTUAL_DEVICE_TYPE_NONE);
 | 
			
		||||
 | 
			
		||||
  seat_class = CLUTTER_SEAT_GET_CLASS (seat);
 | 
			
		||||
  return seat_class->get_supported_virtual_device_types (seat);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
clutter_seat_compress_motion (ClutterSeat        *seat,
 | 
			
		||||
                              ClutterEvent       *event,
 | 
			
		||||
                              const ClutterEvent *to_discard)
 | 
			
		||||
{
 | 
			
		||||
  ClutterSeatClass *seat_class;
 | 
			
		||||
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_SEAT (seat));
 | 
			
		||||
 | 
			
		||||
  seat_class = CLUTTER_SEAT_GET_CLASS (seat);
 | 
			
		||||
 | 
			
		||||
  if (seat_class->compress_motion)
 | 
			
		||||
    seat_class->compress_motion (seat, event, to_discard);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
clutter_seat_warp_pointer (ClutterSeat *seat,
 | 
			
		||||
                           int          x,
 | 
			
		||||
                           int          y)
 | 
			
		||||
{
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_SEAT (seat));
 | 
			
		||||
 | 
			
		||||
  CLUTTER_SEAT_GET_CLASS (seat)->warp_pointer (seat, x, y);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_seat_get_touch_mode:
 | 
			
		||||
 * @seat: a #ClutterSeat
 | 
			
		||||
 *
 | 
			
		||||
 * Gets the current touch-mode state of the #ClutterSeat @seat.
 | 
			
		||||
 * The #ClutterSeat:touch-mode property is set to %TRUE if the following
 | 
			
		||||
 * requirements are fulfilled:
 | 
			
		||||
 *
 | 
			
		||||
 *  - A touchscreen is available
 | 
			
		||||
 *  - A tablet mode switch, if present, is enabled
 | 
			
		||||
 *
 | 
			
		||||
 * Returns: %TRUE if the device is a tablet that doesn't have an external
 | 
			
		||||
 *   keyboard attached, %FALSE otherwise.
 | 
			
		||||
 **/
 | 
			
		||||
gboolean
 | 
			
		||||
clutter_seat_get_touch_mode (ClutterSeat *seat)
 | 
			
		||||
{
 | 
			
		||||
  gboolean touch_mode;
 | 
			
		||||
 | 
			
		||||
  g_return_val_if_fail (CLUTTER_IS_SEAT (seat), FALSE);
 | 
			
		||||
 | 
			
		||||
  g_object_get (G_OBJECT (seat), "touch-mode", &touch_mode, NULL);
 | 
			
		||||
 | 
			
		||||
  return touch_mode;
 | 
			
		||||
}
 | 
			
		||||
@@ -1,190 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Clutter.
 | 
			
		||||
 *
 | 
			
		||||
 * An OpenGL based 'interactive canvas' library.
 | 
			
		||||
 *
 | 
			
		||||
 * 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/>.
 | 
			
		||||
 *
 | 
			
		||||
 * Author: Carlos Garnacho <carlosg@gnome.org>
 | 
			
		||||
 */
 | 
			
		||||
#ifndef CLUTTER_SEAT_H
 | 
			
		||||
#define CLUTTER_SEAT_H
 | 
			
		||||
 | 
			
		||||
#if !defined(__CLUTTER_H_INSIDE__) && !defined(CLUTTER_COMPILATION)
 | 
			
		||||
#error "Only <clutter/clutter.h> can be included directly."
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include "clutter/clutter-types.h"
 | 
			
		||||
#include "clutter/clutter-keymap.h"
 | 
			
		||||
#include "clutter/clutter-virtual-input-device.h"
 | 
			
		||||
 | 
			
		||||
#define CLUTTER_TYPE_SEAT (clutter_seat_get_type ())
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
G_DECLARE_DERIVABLE_TYPE (ClutterSeat, clutter_seat,
 | 
			
		||||
			  CLUTTER, SEAT, GObject)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 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;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ClutterPointerA11ySettings:
 | 
			
		||||
 *
 | 
			
		||||
 * The #ClutterPointerA11ySettings structure contains pointer accessibility
 | 
			
		||||
 * settings
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
typedef struct _ClutterPointerA11ySettings
 | 
			
		||||
{
 | 
			
		||||
  ClutterPointerA11yFlags controls;
 | 
			
		||||
  ClutterPointerA11yDwellClickType dwell_click_type;
 | 
			
		||||
  ClutterPointerA11yDwellMode dwell_mode;
 | 
			
		||||
  ClutterPointerA11yDwellDirection dwell_gesture_single;
 | 
			
		||||
  ClutterPointerA11yDwellDirection dwell_gesture_double;
 | 
			
		||||
  ClutterPointerA11yDwellDirection dwell_gesture_drag;
 | 
			
		||||
  ClutterPointerA11yDwellDirection dwell_gesture_secondary;
 | 
			
		||||
  gint secondary_click_delay;
 | 
			
		||||
  gint dwell_delay;
 | 
			
		||||
  gint dwell_threshold;
 | 
			
		||||
} ClutterPointerA11ySettings;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ClutterVirtualDeviceType:
 | 
			
		||||
 */
 | 
			
		||||
typedef enum
 | 
			
		||||
{
 | 
			
		||||
  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;
 | 
			
		||||
 | 
			
		||||
typedef struct _ClutterSeatClass ClutterSeatClass;
 | 
			
		||||
 | 
			
		||||
struct _ClutterSeatClass
 | 
			
		||||
{
 | 
			
		||||
  GObjectClass parent_class;
 | 
			
		||||
 | 
			
		||||
  ClutterInputDevice * (* get_pointer)  (ClutterSeat *seat);
 | 
			
		||||
  ClutterInputDevice * (* get_keyboard) (ClutterSeat *seat);
 | 
			
		||||
 | 
			
		||||
  GList * (* list_devices) (ClutterSeat *seat);
 | 
			
		||||
 | 
			
		||||
  void (* bell_notify) (ClutterSeat *seat);
 | 
			
		||||
 | 
			
		||||
  ClutterKeymap * (* get_keymap) (ClutterSeat *seat);
 | 
			
		||||
 | 
			
		||||
  void (* compress_motion) (ClutterSeat        *seat,
 | 
			
		||||
                            ClutterEvent       *event,
 | 
			
		||||
                            const ClutterEvent *to_discard);
 | 
			
		||||
 | 
			
		||||
  void (* warp_pointer) (ClutterSeat *seat,
 | 
			
		||||
                         int          x,
 | 
			
		||||
                         int          y);
 | 
			
		||||
 | 
			
		||||
  /* Event platform data */
 | 
			
		||||
  void (* copy_event_data) (ClutterSeat        *seat,
 | 
			
		||||
                            const ClutterEvent *src,
 | 
			
		||||
                            ClutterEvent       *dest);
 | 
			
		||||
  void (* free_event_data) (ClutterSeat        *seat,
 | 
			
		||||
                            ClutterEvent       *event);
 | 
			
		||||
 | 
			
		||||
  /* Keyboard accessibility */
 | 
			
		||||
  void (* apply_kbd_a11y_settings) (ClutterSeat            *seat,
 | 
			
		||||
                                    ClutterKbdA11ySettings *settings);
 | 
			
		||||
 | 
			
		||||
  /* Virtual devices */
 | 
			
		||||
  ClutterVirtualInputDevice * (* create_virtual_device) (ClutterSeat            *seat,
 | 
			
		||||
                                                         ClutterInputDeviceType  device_type);
 | 
			
		||||
  ClutterVirtualDeviceType (* get_supported_virtual_device_types) (ClutterSeat *seat);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
ClutterInputDevice * clutter_seat_get_pointer  (ClutterSeat *seat);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
ClutterInputDevice * clutter_seat_get_keyboard (ClutterSeat *seat);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
GList * clutter_seat_list_devices (ClutterSeat *seat);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void clutter_seat_bell_notify (ClutterSeat *seat);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
ClutterKeymap * clutter_seat_get_keymap (ClutterSeat *seat);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void clutter_seat_set_kbd_a11y_settings (ClutterSeat            *seat,
 | 
			
		||||
                                         ClutterKbdA11ySettings *settings);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void clutter_seat_get_kbd_a11y_settings (ClutterSeat            *seat,
 | 
			
		||||
                                         ClutterKbdA11ySettings *settings);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void clutter_seat_ensure_a11y_state     (ClutterSeat            *seat);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void clutter_seat_set_pointer_a11y_settings (ClutterSeat                *seat,
 | 
			
		||||
                                             ClutterPointerA11ySettings *settings);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void clutter_seat_get_pointer_a11y_settings (ClutterSeat                *seat,
 | 
			
		||||
                                             ClutterPointerA11ySettings *settings);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void clutter_seat_set_pointer_a11y_dwell_click_type (ClutterSeat                      *seat,
 | 
			
		||||
                                                     ClutterPointerA11yDwellClickType  click_type);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void clutter_seat_inhibit_unfocus (ClutterSeat *seat);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void clutter_seat_uninhibit_unfocus (ClutterSeat *seat);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
gboolean clutter_seat_is_unfocus_inhibited (ClutterSeat *seat);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
ClutterVirtualInputDevice *clutter_seat_create_virtual_device (ClutterSeat            *seat,
 | 
			
		||||
                                                               ClutterInputDeviceType  device_type);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
ClutterVirtualDeviceType clutter_seat_get_supported_virtual_device_types (ClutterSeat *seat);
 | 
			
		||||
 | 
			
		||||
void clutter_seat_compress_motion (ClutterSeat        *seat,
 | 
			
		||||
                                   ClutterEvent       *event,
 | 
			
		||||
                                   const ClutterEvent *to_discard);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void clutter_seat_warp_pointer (ClutterSeat *seat,
 | 
			
		||||
                                int          x,
 | 
			
		||||
                                int          y);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
gboolean clutter_seat_get_touch_mode (ClutterSeat *seat);
 | 
			
		||||
 | 
			
		||||
#endif /* CLUTTER_SEAT_H */
 | 
			
		||||
@@ -367,12 +367,24 @@ clutter_shader_effect_try_static_source (ClutterShaderEffect *self)
 | 
			
		||||
 | 
			
		||||
          CLUTTER_NOTE (SHADER, "Compiling shader effect");
 | 
			
		||||
 | 
			
		||||
          class_priv->program = cogl_create_program ();
 | 
			
		||||
          cogl_shader_compile (class_priv->shader);
 | 
			
		||||
 | 
			
		||||
          cogl_program_attach_shader (class_priv->program,
 | 
			
		||||
                                      class_priv->shader);
 | 
			
		||||
          if (cogl_shader_is_compiled (class_priv->shader))
 | 
			
		||||
            {
 | 
			
		||||
              class_priv->program = cogl_create_program ();
 | 
			
		||||
 | 
			
		||||
          cogl_program_link (class_priv->program);
 | 
			
		||||
              cogl_program_attach_shader (class_priv->program,
 | 
			
		||||
                                          class_priv->shader);
 | 
			
		||||
 | 
			
		||||
              cogl_program_link (class_priv->program);
 | 
			
		||||
            }
 | 
			
		||||
          else
 | 
			
		||||
            {
 | 
			
		||||
              gchar *log_buf = cogl_shader_get_info_log (class_priv->shader);
 | 
			
		||||
 | 
			
		||||
              g_warning (G_STRLOC ": Unable to compile the GLSL shader: %s", log_buf);
 | 
			
		||||
              g_free (log_buf);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
      priv->shader = cogl_object_ref (class_priv->shader);
 | 
			
		||||
@@ -890,11 +902,23 @@ clutter_shader_effect_set_shader_source (ClutterShaderEffect *effect,
 | 
			
		||||
 | 
			
		||||
  CLUTTER_NOTE (SHADER, "Compiling shader effect");
 | 
			
		||||
 | 
			
		||||
  priv->program = cogl_create_program ();
 | 
			
		||||
  cogl_shader_compile (priv->shader);
 | 
			
		||||
 | 
			
		||||
  cogl_program_attach_shader (priv->program, priv->shader);
 | 
			
		||||
  if (cogl_shader_is_compiled (priv->shader))
 | 
			
		||||
    {
 | 
			
		||||
      priv->program = cogl_create_program ();
 | 
			
		||||
 | 
			
		||||
  cogl_program_link (priv->program);
 | 
			
		||||
      cogl_program_attach_shader (priv->program, priv->shader);
 | 
			
		||||
 | 
			
		||||
      cogl_program_link (priv->program);
 | 
			
		||||
    }
 | 
			
		||||
  else
 | 
			
		||||
    {
 | 
			
		||||
      gchar *log_buf = cogl_shader_get_info_log (priv->shader);
 | 
			
		||||
 | 
			
		||||
      g_warning (G_STRLOC ": Unable to compile the GLSL shader: %s", log_buf);
 | 
			
		||||
      g_free (log_buf);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return TRUE;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -36,9 +36,9 @@ typedef struct _ClutterStageQueueRedrawEntry ClutterStageQueueRedrawEntry;
 | 
			
		||||
/* stage */
 | 
			
		||||
ClutterStageWindow *_clutter_stage_get_default_window    (void);
 | 
			
		||||
 | 
			
		||||
void                clutter_stage_paint_view             (ClutterStage          *stage,
 | 
			
		||||
                                                          ClutterStageView      *view,
 | 
			
		||||
                                                          const cairo_region_t  *redraw_clip);
 | 
			
		||||
void                _clutter_stage_paint_view            (ClutterStage                *stage,
 | 
			
		||||
                                                          ClutterStageView            *view,
 | 
			
		||||
                                                          const cairo_rectangle_int_t *clip);
 | 
			
		||||
 | 
			
		||||
void                _clutter_stage_emit_after_paint      (ClutterStage          *stage);
 | 
			
		||||
 | 
			
		||||
@@ -50,6 +50,11 @@ ClutterStageWindow *_clutter_stage_get_window            (ClutterStage
 | 
			
		||||
void                _clutter_stage_get_projection_matrix (ClutterStage          *stage,
 | 
			
		||||
                                                          CoglMatrix            *projection);
 | 
			
		||||
void                _clutter_stage_dirty_projection      (ClutterStage          *stage);
 | 
			
		||||
void                _clutter_stage_set_viewport          (ClutterStage          *stage,
 | 
			
		||||
                                                          float                  x,
 | 
			
		||||
                                                          float                  y,
 | 
			
		||||
                                                          float                  width,
 | 
			
		||||
                                                          float                  height);
 | 
			
		||||
void                _clutter_stage_get_viewport          (ClutterStage          *stage,
 | 
			
		||||
                                                          float                 *x,
 | 
			
		||||
                                                          float                 *y,
 | 
			
		||||
@@ -69,6 +74,7 @@ void     _clutter_stage_queue_event                       (ClutterStage *stage,
 | 
			
		||||
gboolean _clutter_stage_has_queued_events                 (ClutterStage *stage);
 | 
			
		||||
void     _clutter_stage_process_queued_events             (ClutterStage *stage);
 | 
			
		||||
void     _clutter_stage_update_input_devices              (ClutterStage *stage);
 | 
			
		||||
void     _clutter_stage_schedule_update                   (ClutterStage *stage);
 | 
			
		||||
gint64    _clutter_stage_get_update_time                  (ClutterStage *stage);
 | 
			
		||||
void     _clutter_stage_clear_update_time                 (ClutterStage *stage);
 | 
			
		||||
gboolean _clutter_stage_has_full_redraw_queued            (ClutterStage *stage);
 | 
			
		||||
@@ -133,8 +139,7 @@ void            _clutter_stage_presented                (ClutterStage      *stag
 | 
			
		||||
                                                         CoglFrameEvent     frame_event,
 | 
			
		||||
                                                         ClutterFrameInfo  *frame_info);
 | 
			
		||||
 | 
			
		||||
void            clutter_stage_queue_actor_relayout      (ClutterStage *stage,
 | 
			
		||||
                                                         ClutterActor *actor);
 | 
			
		||||
GList *         _clutter_stage_peek_stage_views         (ClutterStage *stage);
 | 
			
		||||
 | 
			
		||||
G_END_DECLS
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -20,46 +20,20 @@
 | 
			
		||||
 | 
			
		||||
#include "clutter/clutter-stage-view.h"
 | 
			
		||||
 | 
			
		||||
void clutter_stage_view_after_paint (ClutterStageView *view,
 | 
			
		||||
                                     cairo_region_t   *redraw_clip);
 | 
			
		||||
 | 
			
		||||
void clutter_stage_view_before_swap_buffer (ClutterStageView     *view,
 | 
			
		||||
                                            const cairo_region_t *swap_region);
 | 
			
		||||
void clutter_stage_view_after_paint (ClutterStageView            *view,
 | 
			
		||||
                                     const cairo_rectangle_int_t *clip);
 | 
			
		||||
 | 
			
		||||
gboolean clutter_stage_view_is_dirty_viewport (ClutterStageView *view);
 | 
			
		||||
 | 
			
		||||
void clutter_stage_view_invalidate_viewport (ClutterStageView *view);
 | 
			
		||||
 | 
			
		||||
void clutter_stage_view_set_viewport (ClutterStageView *view,
 | 
			
		||||
                                      float             x,
 | 
			
		||||
                                      float             y,
 | 
			
		||||
                                      float             width,
 | 
			
		||||
                                      float             height);
 | 
			
		||||
void clutter_stage_view_set_dirty_viewport (ClutterStageView *view,
 | 
			
		||||
                                            gboolean          dirty);
 | 
			
		||||
 | 
			
		||||
gboolean clutter_stage_view_is_dirty_projection (ClutterStageView *view);
 | 
			
		||||
 | 
			
		||||
void clutter_stage_view_invalidate_projection (ClutterStageView *view);
 | 
			
		||||
void clutter_stage_view_set_dirty_projection (ClutterStageView *view,
 | 
			
		||||
                                              gboolean          dirty);
 | 
			
		||||
 | 
			
		||||
void clutter_stage_view_set_projection (ClutterStageView *view,
 | 
			
		||||
                                        const CoglMatrix *matrix);
 | 
			
		||||
 | 
			
		||||
void clutter_stage_view_add_redraw_clip (ClutterStageView            *view,
 | 
			
		||||
                                         const cairo_rectangle_int_t *clip);
 | 
			
		||||
 | 
			
		||||
gboolean clutter_stage_view_has_full_redraw_clip (ClutterStageView *view);
 | 
			
		||||
 | 
			
		||||
gboolean clutter_stage_view_has_redraw_clip (ClutterStageView *view);
 | 
			
		||||
 | 
			
		||||
const cairo_region_t * clutter_stage_view_peek_redraw_clip (ClutterStageView *view);
 | 
			
		||||
 | 
			
		||||
cairo_region_t * clutter_stage_view_take_redraw_clip (ClutterStageView *view);
 | 
			
		||||
 | 
			
		||||
CoglScanout * clutter_stage_view_take_scanout (ClutterStageView *view);
 | 
			
		||||
 | 
			
		||||
void clutter_stage_view_transform_rect_to_onscreen (ClutterStageView            *view,
 | 
			
		||||
                                                    const cairo_rectangle_int_t *src_rect,
 | 
			
		||||
                                                    int                          dst_width,
 | 
			
		||||
                                                    int                          dst_height,
 | 
			
		||||
                                                    cairo_rectangle_int_t       *dst_rect);
 | 
			
		||||
void clutter_stage_view_add_redraw_clip (ClutterStageView      *view,
 | 
			
		||||
                                         cairo_rectangle_int_t *clip);
 | 
			
		||||
 | 
			
		||||
#endif /* __CLUTTER_STAGE_VIEW_PRIVATE_H__ */
 | 
			
		||||
 
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -43,12 +43,6 @@ struct _ClutterStageViewClass
 | 
			
		||||
 | 
			
		||||
  void (* get_offscreen_transformation_matrix) (ClutterStageView *view,
 | 
			
		||||
                                                CoglMatrix       *matrix);
 | 
			
		||||
 | 
			
		||||
  void (* transform_rect_to_onscreen) (ClutterStageView            *view,
 | 
			
		||||
                                       const cairo_rectangle_int_t *src_rect,
 | 
			
		||||
                                       int                          dst_width,
 | 
			
		||||
                                       int                          dst_height,
 | 
			
		||||
                                       cairo_rectangle_int_t       *dst_rect);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
@@ -62,6 +56,11 @@ CoglFramebuffer *clutter_stage_view_get_onscreen (ClutterStageView *view);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void             clutter_stage_view_invalidate_offscreen_blit_pipeline (ClutterStageView *view);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void             clutter_stage_view_transform_to_onscreen (ClutterStageView *view,
 | 
			
		||||
                                                           gfloat           *x,
 | 
			
		||||
                                                           gfloat           *y);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
float clutter_stage_view_get_scale (ClutterStageView *view);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -62,6 +62,16 @@ _clutter_stage_window_set_title (ClutterStageWindow *window,
 | 
			
		||||
    iface->set_title (window, title);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
_clutter_stage_window_set_cursor_visible (ClutterStageWindow *window,
 | 
			
		||||
                                          gboolean            is_visible)
 | 
			
		||||
{
 | 
			
		||||
  ClutterStageWindowInterface *iface = CLUTTER_STAGE_WINDOW_GET_IFACE (window);
 | 
			
		||||
 | 
			
		||||
  if (iface->set_cursor_visible)
 | 
			
		||||
    iface->set_cursor_visible (window, is_visible);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
gboolean
 | 
			
		||||
_clutter_stage_window_realize (ClutterStageWindow *window)
 | 
			
		||||
{
 | 
			
		||||
@@ -168,6 +178,90 @@ _clutter_stage_window_clear_update_time (ClutterStageWindow *window)
 | 
			
		||||
  iface->clear_update_time (window);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
_clutter_stage_window_add_redraw_clip (ClutterStageWindow    *window,
 | 
			
		||||
                                       cairo_rectangle_int_t *stage_clip)
 | 
			
		||||
{
 | 
			
		||||
  ClutterStageWindowInterface *iface;
 | 
			
		||||
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_STAGE_WINDOW (window));
 | 
			
		||||
 | 
			
		||||
  iface = CLUTTER_STAGE_WINDOW_GET_IFACE (window);
 | 
			
		||||
  if (iface->add_redraw_clip != NULL)
 | 
			
		||||
    iface->add_redraw_clip (window, stage_clip);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Determines if the backend will clip the rendering of the next
 | 
			
		||||
 * frame.
 | 
			
		||||
 *
 | 
			
		||||
 * Note: at the start of each new frame there is an implied clip that
 | 
			
		||||
 * clips everything (i.e. nothing would be drawn) so this function
 | 
			
		||||
 * will return True at the start of a new frame if the backend
 | 
			
		||||
 * supports clipped redraws.
 | 
			
		||||
 */
 | 
			
		||||
gboolean
 | 
			
		||||
_clutter_stage_window_has_redraw_clips (ClutterStageWindow *window)
 | 
			
		||||
{
 | 
			
		||||
  ClutterStageWindowInterface *iface;
 | 
			
		||||
 | 
			
		||||
  g_return_val_if_fail (CLUTTER_IS_STAGE_WINDOW (window), FALSE);
 | 
			
		||||
 | 
			
		||||
  iface = CLUTTER_STAGE_WINDOW_GET_IFACE (window);
 | 
			
		||||
  if (iface->has_redraw_clips != NULL)
 | 
			
		||||
    return iface->has_redraw_clips (window);
 | 
			
		||||
 | 
			
		||||
  return FALSE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Determines if the backend will discard any additional redraw clips
 | 
			
		||||
 * and instead promote them to a full stage redraw.
 | 
			
		||||
 *
 | 
			
		||||
 * The ideas is that backend may have some heuristics that cause it to
 | 
			
		||||
 * give up tracking redraw clips so this can be used to avoid the cost
 | 
			
		||||
 * of calculating a redraw clip when we know it's going to be ignored
 | 
			
		||||
 * anyway.
 | 
			
		||||
 */
 | 
			
		||||
gboolean
 | 
			
		||||
_clutter_stage_window_ignoring_redraw_clips (ClutterStageWindow *window)
 | 
			
		||||
{
 | 
			
		||||
  ClutterStageWindowInterface *iface;
 | 
			
		||||
 | 
			
		||||
  g_return_val_if_fail (CLUTTER_IS_STAGE_WINDOW (window), FALSE);
 | 
			
		||||
 | 
			
		||||
  iface = CLUTTER_STAGE_WINDOW_GET_IFACE (window);
 | 
			
		||||
  if (iface->ignoring_redraw_clips != NULL)
 | 
			
		||||
    return iface->ignoring_redraw_clips (window);
 | 
			
		||||
 | 
			
		||||
  return TRUE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
cairo_region_t *
 | 
			
		||||
_clutter_stage_window_get_redraw_clip (ClutterStageWindow *window)
 | 
			
		||||
{
 | 
			
		||||
  ClutterStageWindowInterface *iface;
 | 
			
		||||
 | 
			
		||||
  g_return_val_if_fail (CLUTTER_IS_STAGE_WINDOW (window), FALSE);
 | 
			
		||||
 | 
			
		||||
  iface = CLUTTER_STAGE_WINDOW_GET_IFACE (window);
 | 
			
		||||
  if (iface->get_redraw_clip != NULL)
 | 
			
		||||
    return iface->get_redraw_clip (window);
 | 
			
		||||
 | 
			
		||||
  return NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
_clutter_stage_window_set_accept_focus (ClutterStageWindow *window,
 | 
			
		||||
                                        gboolean            accept_focus)
 | 
			
		||||
{
 | 
			
		||||
  ClutterStageWindowInterface *iface;
 | 
			
		||||
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_STAGE_WINDOW (window));
 | 
			
		||||
 | 
			
		||||
  iface = CLUTTER_STAGE_WINDOW_GET_IFACE (window);
 | 
			
		||||
  if (iface->set_accept_focus)
 | 
			
		||||
    iface->set_accept_focus (window, accept_focus);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
_clutter_stage_window_redraw (ClutterStageWindow *window)
 | 
			
		||||
{
 | 
			
		||||
 
 | 
			
		||||
@@ -30,6 +30,8 @@ struct _ClutterStageWindowInterface
 | 
			
		||||
 | 
			
		||||
  void              (* set_title)               (ClutterStageWindow *stage_window,
 | 
			
		||||
                                                 const gchar        *title);
 | 
			
		||||
  void              (* set_cursor_visible)      (ClutterStageWindow *stage_window,
 | 
			
		||||
                                                 gboolean            cursor_visible);
 | 
			
		||||
 | 
			
		||||
  gboolean          (* realize)                 (ClutterStageWindow *stage_window);
 | 
			
		||||
  void              (* unrealize)               (ClutterStageWindow *stage_window);
 | 
			
		||||
@@ -49,6 +51,15 @@ struct _ClutterStageWindowInterface
 | 
			
		||||
  gint64            (* get_update_time)         (ClutterStageWindow *stage_window);
 | 
			
		||||
  void              (* clear_update_time)       (ClutterStageWindow *stage_window);
 | 
			
		||||
 | 
			
		||||
  void              (* add_redraw_clip)         (ClutterStageWindow    *stage_window,
 | 
			
		||||
                                                 cairo_rectangle_int_t *stage_rectangle);
 | 
			
		||||
  gboolean          (* has_redraw_clips)        (ClutterStageWindow    *stage_window);
 | 
			
		||||
  gboolean          (* ignoring_redraw_clips)   (ClutterStageWindow    *stage_window);
 | 
			
		||||
  cairo_region_t *  (* get_redraw_clip)         (ClutterStageWindow    *stage_window);
 | 
			
		||||
 | 
			
		||||
  void              (* set_accept_focus)        (ClutterStageWindow *stage_window,
 | 
			
		||||
                                                 gboolean            accept_focus);
 | 
			
		||||
 | 
			
		||||
  void              (* redraw)                  (ClutterStageWindow *stage_window);
 | 
			
		||||
 | 
			
		||||
  gboolean          (* can_clip_redraws)        (ClutterStageWindow *stage_window);
 | 
			
		||||
@@ -83,6 +94,12 @@ void              _clutter_stage_window_schedule_update         (ClutterStageWin
 | 
			
		||||
gint64            _clutter_stage_window_get_update_time         (ClutterStageWindow *window);
 | 
			
		||||
void              _clutter_stage_window_clear_update_time       (ClutterStageWindow *window);
 | 
			
		||||
 | 
			
		||||
void              _clutter_stage_window_add_redraw_clip         (ClutterStageWindow    *window,
 | 
			
		||||
                                                                 cairo_rectangle_int_t *stage_clip);
 | 
			
		||||
gboolean          _clutter_stage_window_has_redraw_clips        (ClutterStageWindow    *window);
 | 
			
		||||
gboolean          _clutter_stage_window_ignoring_redraw_clips   (ClutterStageWindow    *window);
 | 
			
		||||
cairo_region_t *  _clutter_stage_window_get_redraw_clip         (ClutterStageWindow    *window);
 | 
			
		||||
 | 
			
		||||
void              _clutter_stage_window_set_accept_focus        (ClutterStageWindow *window,
 | 
			
		||||
                                                                 gboolean            accept_focus);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -84,9 +84,8 @@ struct _ClutterStageClass
 | 
			
		||||
  gboolean (* delete_event) (ClutterStage *stage,
 | 
			
		||||
                             ClutterEvent *event);
 | 
			
		||||
 | 
			
		||||
  void (* paint_view) (ClutterStage         *stage,
 | 
			
		||||
                       ClutterStageView     *view,
 | 
			
		||||
                       const cairo_region_t *redraw_clip);
 | 
			
		||||
  void (* paint_view) (ClutterStage     *stage,
 | 
			
		||||
                       ClutterStageView *view);
 | 
			
		||||
 | 
			
		||||
  /*< private >*/
 | 
			
		||||
  /* padding for future expansion */
 | 
			
		||||
@@ -103,7 +102,8 @@ struct _ClutterStageClass
 | 
			
		||||
 * @z_far: the distance from the viewer to the far clipping
 | 
			
		||||
 *   plane (always positive)
 | 
			
		||||
 *
 | 
			
		||||
 * Stage perspective definition.
 | 
			
		||||
 * Stage perspective definition. #ClutterPerspective is only used by
 | 
			
		||||
 * the fixed point version of clutter_stage_set_perspective().
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 0.4
 | 
			
		||||
 */
 | 
			
		||||
@@ -139,10 +139,17 @@ GType clutter_stage_get_type (void) G_GNUC_CONST;
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
ClutterActor *  clutter_stage_new                               (void);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void            clutter_stage_set_perspective                   (ClutterStage          *stage,
 | 
			
		||||
			                                         ClutterPerspective    *perspective);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void            clutter_stage_get_perspective                   (ClutterStage          *stage,
 | 
			
		||||
			                                         ClutterPerspective    *perspective);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void            clutter_stage_show_cursor                       (ClutterStage          *stage);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void            clutter_stage_hide_cursor                       (ClutterStage          *stage);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void            clutter_stage_set_title                         (ClutterStage          *stage,
 | 
			
		||||
                                                                 const gchar           *title);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
@@ -178,6 +185,11 @@ void            clutter_stage_set_motion_events_enabled         (ClutterStage
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
gboolean        clutter_stage_get_motion_events_enabled         (ClutterStage          *stage);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void            clutter_stage_set_accept_focus                  (ClutterStage          *stage,
 | 
			
		||||
                                                                 gboolean               accept_focus);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
gboolean        clutter_stage_get_accept_focus                  (ClutterStage          *stage);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
gboolean        clutter_stage_event                             (ClutterStage          *stage,
 | 
			
		||||
                                                                 ClutterEvent          *event);
 | 
			
		||||
 | 
			
		||||
@@ -193,6 +205,8 @@ guchar *        clutter_stage_read_pixels                       (ClutterStage
 | 
			
		||||
                                                                 gint                   width,
 | 
			
		||||
                                                                 gint                   height);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
cairo_region_t * clutter_stage_get_redraw_clip                  (ClutterStage          *stage);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void            clutter_stage_ensure_viewport                   (ClutterStage          *stage);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
@@ -209,9 +223,6 @@ CLUTTER_EXPORT
 | 
			
		||||
void            clutter_stage_skip_sync_delay                   (ClutterStage          *stage);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
void clutter_stage_schedule_update (ClutterStage *stage);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
gboolean clutter_stage_get_capture_final_size (ClutterStage          *stage,
 | 
			
		||||
                                               cairo_rectangle_int_t *rect,
 | 
			
		||||
@@ -223,8 +234,8 @@ CLUTTER_EXPORT
 | 
			
		||||
gboolean clutter_stage_capture (ClutterStage          *stage,
 | 
			
		||||
                                gboolean               paint,
 | 
			
		||||
                                cairo_rectangle_int_t *rect,
 | 
			
		||||
                                ClutterCapture       **out_captures,
 | 
			
		||||
                                int                   *out_n_captures);
 | 
			
		||||
                                ClutterCapture       **captures,
 | 
			
		||||
                                int                   *n_captures);
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
ClutterStageView * clutter_stage_get_view_at (ClutterStage *stage,
 | 
			
		||||
                                              float         x,
 | 
			
		||||
 
 | 
			
		||||
@@ -348,23 +348,13 @@ clutter_text_input_focus_request_surrounding (ClutterInputFocus *focus)
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_text_input_focus_delete_surrounding (ClutterInputFocus *focus,
 | 
			
		||||
                                             int                offset,
 | 
			
		||||
                                             guint              offset,
 | 
			
		||||
                                             guint              len)
 | 
			
		||||
{
 | 
			
		||||
  ClutterText *clutter_text = CLUTTER_TEXT_INPUT_FOCUS (focus)->text;
 | 
			
		||||
  int cursor;
 | 
			
		||||
  int start;
 | 
			
		||||
 | 
			
		||||
  cursor = clutter_text_get_cursor_position (clutter_text);
 | 
			
		||||
  start = cursor + offset;
 | 
			
		||||
  if (start < 0)
 | 
			
		||||
    {
 | 
			
		||||
      g_warning ("The offset '%d' of deleting surrounding is larger than the cursor pos '%d'",
 | 
			
		||||
                 offset, cursor);
 | 
			
		||||
      return;
 | 
			
		||||
    }
 | 
			
		||||
  if (clutter_text_get_editable (clutter_text))
 | 
			
		||||
    clutter_text_delete_text (clutter_text, start, len);
 | 
			
		||||
    clutter_text_delete_text (clutter_text, offset, len);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
@@ -769,14 +759,7 @@ clutter_text_create_layout_no_cache (ClutterText       *text,
 | 
			
		||||
          ClutterTextDirection text_dir;
 | 
			
		||||
 | 
			
		||||
          if (clutter_actor_has_key_focus (CLUTTER_ACTOR (text)))
 | 
			
		||||
            {
 | 
			
		||||
              ClutterSeat *seat;
 | 
			
		||||
              ClutterKeymap *keymap;
 | 
			
		||||
 | 
			
		||||
              seat = clutter_backend_get_default_seat (backend);
 | 
			
		||||
              keymap = clutter_seat_get_keymap (seat);
 | 
			
		||||
              pango_dir = clutter_keymap_get_direction (keymap);
 | 
			
		||||
            }
 | 
			
		||||
            pango_dir = _clutter_backend_get_keymap_direction (backend);
 | 
			
		||||
          else
 | 
			
		||||
            {
 | 
			
		||||
              text_dir = clutter_actor_get_text_direction (CLUTTER_ACTOR (text));
 | 
			
		||||
@@ -1907,6 +1890,14 @@ clutter_text_foreach_selection_rectangle (ClutterText              *self,
 | 
			
		||||
  g_free (utf8);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
add_selection_rectangle_to_path (ClutterText           *text,
 | 
			
		||||
                                 const ClutterActorBox *box,
 | 
			
		||||
                                 gpointer               user_data)
 | 
			
		||||
{
 | 
			
		||||
  cogl_path_rectangle (user_data, box->x1, box->y1, box->x2, box->y2);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_text_foreach_selection_rectangle_prescaled (ClutterText              *self,
 | 
			
		||||
                                                    ClutterTextSelectionFunc  func,
 | 
			
		||||
@@ -1915,60 +1906,6 @@ clutter_text_foreach_selection_rectangle_prescaled (ClutterText              *se
 | 
			
		||||
  clutter_text_foreach_selection_rectangle (self, 1.0f, func, user_data);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
paint_selection_rectangle (ClutterText           *self,
 | 
			
		||||
                           const ClutterActorBox *box,
 | 
			
		||||
                           gpointer               user_data)
 | 
			
		||||
{
 | 
			
		||||
  CoglFramebuffer *fb = user_data;
 | 
			
		||||
  ClutterTextPrivate *priv = self->priv;
 | 
			
		||||
  ClutterActor *actor = CLUTTER_ACTOR (self);
 | 
			
		||||
  guint8 paint_opacity = clutter_actor_get_paint_opacity (actor);
 | 
			
		||||
  CoglPipeline *color_pipeline = cogl_pipeline_copy (default_color_pipeline);
 | 
			
		||||
  PangoLayout *layout = clutter_text_get_layout (self);
 | 
			
		||||
  CoglColor cogl_color = { 0, };
 | 
			
		||||
  const ClutterColor *color;
 | 
			
		||||
 | 
			
		||||
  /* Paint selection background */
 | 
			
		||||
  if (priv->selection_color_set)
 | 
			
		||||
    color = &priv->selection_color;
 | 
			
		||||
  else if (priv->cursor_color_set)
 | 
			
		||||
    color = &priv->cursor_color;
 | 
			
		||||
  else
 | 
			
		||||
    color = &priv->text_color;
 | 
			
		||||
 | 
			
		||||
  cogl_color_init_from_4ub (&cogl_color,
 | 
			
		||||
                            color->red,
 | 
			
		||||
                            color->green,
 | 
			
		||||
                            color->blue,
 | 
			
		||||
                            paint_opacity * color->alpha / 255);
 | 
			
		||||
  cogl_color_premultiply (&cogl_color);
 | 
			
		||||
  cogl_pipeline_set_color (color_pipeline, &cogl_color);
 | 
			
		||||
 | 
			
		||||
  cogl_framebuffer_push_rectangle_clip (fb,
 | 
			
		||||
                                        box->x1, box->y1,
 | 
			
		||||
                                        box->x2, box->y2);
 | 
			
		||||
  cogl_framebuffer_draw_rectangle (fb, color_pipeline,
 | 
			
		||||
                                   box->x1, box->y1,
 | 
			
		||||
                                   box->x2, box->y2);
 | 
			
		||||
 | 
			
		||||
  if (priv->selected_text_color_set)
 | 
			
		||||
    color = &priv->selected_text_color;
 | 
			
		||||
  else
 | 
			
		||||
    color = &priv->text_color;
 | 
			
		||||
 | 
			
		||||
  cogl_color_init_from_4ub (&cogl_color,
 | 
			
		||||
                            color->red,
 | 
			
		||||
                            color->green,
 | 
			
		||||
                            color->blue,
 | 
			
		||||
                            paint_opacity * color->alpha / 255);
 | 
			
		||||
 | 
			
		||||
  cogl_pango_show_layout (fb, layout, priv->text_x, 0, &cogl_color);
 | 
			
		||||
 | 
			
		||||
  cogl_framebuffer_pop_clip (fb);
 | 
			
		||||
  cogl_object_unref (color_pipeline);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Draws the selected text, its background, and the cursor */
 | 
			
		||||
static void
 | 
			
		||||
selection_paint (ClutterText     *self,
 | 
			
		||||
@@ -2011,9 +1948,52 @@ selection_paint (ClutterText     *self,
 | 
			
		||||
    }
 | 
			
		||||
  else
 | 
			
		||||
    {
 | 
			
		||||
      /* Paint selection background first */
 | 
			
		||||
      CoglPipeline *color_pipeline = cogl_pipeline_copy (default_color_pipeline);
 | 
			
		||||
      PangoLayout *layout = clutter_text_get_layout (self);
 | 
			
		||||
      CoglPath *selection_path = cogl_path_new ();
 | 
			
		||||
      CoglColor cogl_color = { 0, };
 | 
			
		||||
 | 
			
		||||
      /* Paint selection background */
 | 
			
		||||
      if (priv->selection_color_set)
 | 
			
		||||
        color = &priv->selection_color;
 | 
			
		||||
      else if (priv->cursor_color_set)
 | 
			
		||||
        color = &priv->cursor_color;
 | 
			
		||||
      else
 | 
			
		||||
        color = &priv->text_color;
 | 
			
		||||
 | 
			
		||||
      cogl_color_init_from_4ub (&cogl_color,
 | 
			
		||||
                                color->red,
 | 
			
		||||
                                color->green,
 | 
			
		||||
                                color->blue,
 | 
			
		||||
                                paint_opacity * color->alpha / 255);
 | 
			
		||||
      cogl_color_premultiply (&cogl_color);
 | 
			
		||||
      cogl_pipeline_set_color (color_pipeline, &cogl_color);
 | 
			
		||||
 | 
			
		||||
      clutter_text_foreach_selection_rectangle_prescaled (self,
 | 
			
		||||
                                                          paint_selection_rectangle,
 | 
			
		||||
                                                          fb);
 | 
			
		||||
                                                          add_selection_rectangle_to_path,
 | 
			
		||||
                                                          selection_path);
 | 
			
		||||
 | 
			
		||||
      cogl_framebuffer_fill_path (fb, color_pipeline, selection_path);
 | 
			
		||||
 | 
			
		||||
      /* Paint selected text */
 | 
			
		||||
      cogl_framebuffer_push_path_clip (fb, selection_path);
 | 
			
		||||
      cogl_object_unref (selection_path);
 | 
			
		||||
 | 
			
		||||
      if (priv->selected_text_color_set)
 | 
			
		||||
        color = &priv->selected_text_color;
 | 
			
		||||
      else
 | 
			
		||||
        color = &priv->text_color;
 | 
			
		||||
 | 
			
		||||
      cogl_color_init_from_4ub (&cogl_color,
 | 
			
		||||
                                color->red,
 | 
			
		||||
                                color->green,
 | 
			
		||||
                                color->blue,
 | 
			
		||||
                                paint_opacity * color->alpha / 255);
 | 
			
		||||
 | 
			
		||||
      cogl_pango_show_layout (fb, layout, priv->text_x, 0, &cogl_color);
 | 
			
		||||
 | 
			
		||||
      cogl_framebuffer_pop_clip (fb);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -3037,7 +3017,8 @@ clutter_text_get_preferred_height (ClutterActor *self,
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_text_allocate (ClutterActor           *self,
 | 
			
		||||
                       const ClutterActorBox  *box)
 | 
			
		||||
                       const ClutterActorBox  *box,
 | 
			
		||||
                       ClutterAllocationFlags  flags)
 | 
			
		||||
{
 | 
			
		||||
  ClutterText *text = CLUTTER_TEXT (self);
 | 
			
		||||
  ClutterActorClass *parent_class;
 | 
			
		||||
@@ -3057,7 +3038,7 @@ clutter_text_allocate (ClutterActor           *self,
 | 
			
		||||
                                                  box->y2 - box->y1);
 | 
			
		||||
 | 
			
		||||
  parent_class = CLUTTER_ACTOR_CLASS (clutter_text_parent_class);
 | 
			
		||||
  parent_class->allocate (self, box);
 | 
			
		||||
  parent_class->allocate (self, box, flags);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
@@ -4786,11 +4767,11 @@ clutter_text_queue_redraw_or_relayout (ClutterText *self)
 | 
			
		||||
  clutter_text_get_preferred_height (actor, preferred_width, NULL, &preferred_height);
 | 
			
		||||
 | 
			
		||||
  if (clutter_actor_has_allocation (actor) &&
 | 
			
		||||
      fabsf (preferred_width - clutter_actor_get_width (actor)) <= 0.001 &&
 | 
			
		||||
      fabsf (preferred_height - clutter_actor_get_height (actor)) <= 0.001)
 | 
			
		||||
    clutter_text_queue_redraw (actor);
 | 
			
		||||
  else
 | 
			
		||||
      (fabsf (preferred_width - clutter_actor_get_width (actor)) > 0.001 ||
 | 
			
		||||
       fabsf (preferred_height - clutter_actor_get_height (actor)) > 0.001))
 | 
			
		||||
    clutter_actor_queue_relayout (actor);
 | 
			
		||||
  else
 | 
			
		||||
    clutter_text_queue_redraw (actor);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
 
 | 
			
		||||
@@ -24,6 +24,7 @@
 | 
			
		||||
/**
 | 
			
		||||
 * SECTION:clutter-timeline
 | 
			
		||||
 * @short_description: A class for time-based events
 | 
			
		||||
 * @see_also: #ClutterAnimation, #ClutterAnimator, #ClutterState
 | 
			
		||||
 *
 | 
			
		||||
 * #ClutterTimeline is a base class for managing time-based event that cause
 | 
			
		||||
 * Clutter to redraw a stage, such as animations.
 | 
			
		||||
@@ -70,7 +71,7 @@
 | 
			
		||||
 * when reaching completion by using the #ClutterTimeline:auto-reverse property.
 | 
			
		||||
 *
 | 
			
		||||
 * Timelines are used in the Clutter animation framework by classes like
 | 
			
		||||
 * #ClutterTransition.
 | 
			
		||||
 * #ClutterAnimation, #ClutterAnimator, and #ClutterState.
 | 
			
		||||
 *
 | 
			
		||||
 * ## Defining Timelines in ClutterScript
 | 
			
		||||
 *
 | 
			
		||||
 
 | 
			
		||||
@@ -79,6 +79,10 @@ typedef struct _ClutterKnot                     ClutterKnot;
 | 
			
		||||
typedef struct _ClutterMargin                   ClutterMargin;
 | 
			
		||||
typedef struct _ClutterPerspective              ClutterPerspective;
 | 
			
		||||
 | 
			
		||||
typedef struct _ClutterAlpha            	ClutterAlpha;
 | 
			
		||||
typedef struct _ClutterAnimation                ClutterAnimation;
 | 
			
		||||
typedef struct _ClutterState            	ClutterState;
 | 
			
		||||
 | 
			
		||||
typedef struct _ClutterInputDeviceTool          ClutterInputDeviceTool;
 | 
			
		||||
typedef struct _ClutterInputDevice              ClutterInputDevice;
 | 
			
		||||
typedef struct _ClutterVirtualInputDevice       ClutterVirtualInputDevice;
 | 
			
		||||
 
 | 
			
		||||
@@ -214,16 +214,6 @@ _clutter_util_rectangle_intersection (const cairo_rectangle_int_t *src1,
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
gboolean
 | 
			
		||||
clutter_util_rectangle_equal (const cairo_rectangle_int_t *src1,
 | 
			
		||||
                              const cairo_rectangle_int_t *src2)
 | 
			
		||||
{
 | 
			
		||||
  return ((src1->x == src2->x) &&
 | 
			
		||||
          (src1->y == src2->y) &&
 | 
			
		||||
          (src1->width == src2->width) &&
 | 
			
		||||
          (src1->height == src2->height));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
float
 | 
			
		||||
_clutter_util_matrix_determinant (const ClutterMatrix *matrix)
 | 
			
		||||
{
 | 
			
		||||
 
 | 
			
		||||
@@ -27,15 +27,15 @@
 | 
			
		||||
 | 
			
		||||
#include "clutter-virtual-input-device.h"
 | 
			
		||||
 | 
			
		||||
#include "clutter-enum-types.h"
 | 
			
		||||
#include "clutter-device-manager.h"
 | 
			
		||||
#include "clutter-private.h"
 | 
			
		||||
#include "clutter-seat.h"
 | 
			
		||||
#include "clutter-enum-types.h"
 | 
			
		||||
 | 
			
		||||
enum
 | 
			
		||||
{
 | 
			
		||||
  PROP_0,
 | 
			
		||||
 | 
			
		||||
  PROP_SEAT,
 | 
			
		||||
  PROP_DEVICE_MANAGER,
 | 
			
		||||
  PROP_DEVICE_TYPE,
 | 
			
		||||
 | 
			
		||||
  PROP_LAST
 | 
			
		||||
@@ -45,7 +45,7 @@ static GParamSpec *obj_props[PROP_LAST];
 | 
			
		||||
 | 
			
		||||
typedef struct _ClutterVirtualInputDevicePrivate
 | 
			
		||||
{
 | 
			
		||||
  ClutterSeat *seat;
 | 
			
		||||
  ClutterDeviceManager *manager;
 | 
			
		||||
  ClutterInputDeviceType device_type;
 | 
			
		||||
} ClutterVirtualInputDevicePrivate;
 | 
			
		||||
 | 
			
		||||
@@ -181,6 +181,23 @@ clutter_virtual_input_device_notify_touch_up (ClutterVirtualInputDevice *virtual
 | 
			
		||||
                          slot);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_virtual_input_device_get_manager:
 | 
			
		||||
 * @virtual_device: a virtual device
 | 
			
		||||
 *
 | 
			
		||||
 * Gets the device manager of this virtual device.
 | 
			
		||||
 *
 | 
			
		||||
 * Returns: (transfer none): The #ClutterDeviceManager of this virtual device
 | 
			
		||||
 **/
 | 
			
		||||
ClutterDeviceManager *
 | 
			
		||||
clutter_virtual_input_device_get_manager (ClutterVirtualInputDevice *virtual_device)
 | 
			
		||||
{
 | 
			
		||||
  ClutterVirtualInputDevicePrivate *priv =
 | 
			
		||||
    clutter_virtual_input_device_get_instance_private (virtual_device);
 | 
			
		||||
 | 
			
		||||
  return priv->manager;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
clutter_virtual_input_device_get_device_type (ClutterVirtualInputDevice *virtual_device)
 | 
			
		||||
{
 | 
			
		||||
@@ -203,8 +220,8 @@ clutter_virtual_input_device_get_property (GObject    *object,
 | 
			
		||||
 | 
			
		||||
  switch (prop_id)
 | 
			
		||||
    {
 | 
			
		||||
    case PROP_SEAT:
 | 
			
		||||
      g_value_set_object (value, priv->seat);
 | 
			
		||||
    case PROP_DEVICE_MANAGER:
 | 
			
		||||
      g_value_set_object (value, priv->manager);
 | 
			
		||||
      break;
 | 
			
		||||
    case PROP_DEVICE_TYPE:
 | 
			
		||||
      g_value_set_enum (value, priv->device_type);
 | 
			
		||||
@@ -228,8 +245,8 @@ clutter_virtual_input_device_set_property (GObject      *object,
 | 
			
		||||
 | 
			
		||||
  switch (prop_id)
 | 
			
		||||
    {
 | 
			
		||||
    case PROP_SEAT:
 | 
			
		||||
      priv->seat = g_value_get_object (value);
 | 
			
		||||
    case PROP_DEVICE_MANAGER:
 | 
			
		||||
      priv->manager = g_value_get_object (value);
 | 
			
		||||
      break;
 | 
			
		||||
    case PROP_DEVICE_TYPE:
 | 
			
		||||
      priv->device_type = g_value_get_enum (value);
 | 
			
		||||
@@ -253,11 +270,11 @@ clutter_virtual_input_device_class_init (ClutterVirtualInputDeviceClass *klass)
 | 
			
		||||
  object_class->get_property = clutter_virtual_input_device_get_property;
 | 
			
		||||
  object_class->set_property = clutter_virtual_input_device_set_property;
 | 
			
		||||
 | 
			
		||||
  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);
 | 
			
		||||
  obj_props[PROP_DEVICE_TYPE] =
 | 
			
		||||
    g_param_spec_enum ("device-type",
 | 
			
		||||
 
 | 
			
		||||
@@ -27,7 +27,7 @@
 | 
			
		||||
#include <glib-object.h>
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
 | 
			
		||||
#include "clutter-seat.h"
 | 
			
		||||
#include "clutter-device-manager.h"
 | 
			
		||||
 | 
			
		||||
#define CLUTTER_TYPE_VIRTUAL_INPUT_DEVICE (clutter_virtual_input_device_get_type ())
 | 
			
		||||
 | 
			
		||||
@@ -169,6 +169,9 @@ void clutter_virtual_input_device_notify_touch_up (ClutterVirtualInputDevice *vi
 | 
			
		||||
                                                   uint64_t                   time_us,
 | 
			
		||||
                                                   int                        slot);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
ClutterDeviceManager * clutter_virtual_input_device_get_manager (ClutterVirtualInputDevice *virtual_device);
 | 
			
		||||
 | 
			
		||||
CLUTTER_EXPORT
 | 
			
		||||
int clutter_virtual_input_device_get_device_type (ClutterVirtualInputDevice *virtual_device);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user