Compare commits

..

1 Commits

Author SHA1 Message Date
Benjamin Berg
07aef68670 startup: Fix possible crash in startup notifications
A GAppInfo is not guaranteed to have a filename or an application (or
rather a desktop ID). Add a check for application_id to be non-NULL
before trying to call sn_launcher_set_application_id, which would crash
otherwise.

https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1392
2020-07-31 15:27:08 +02:00
252 changed files with 10775 additions and 13619 deletions

View File

@@ -17,7 +17,6 @@ check-commit-log:
build-mutter: build-mutter:
stage: build stage: build
needs: []
script: script:
- meson . build -Dbuildtype=debugoptimized -Db_coverage=true -Degl_device=true -Dwayland_eglstream=true --werror --prefix /usr - meson . build -Dbuildtype=debugoptimized -Db_coverage=true -Degl_device=true -Dwayland_eglstream=true --werror --prefix /usr
- ninja -C build - ninja -C build
@@ -32,7 +31,6 @@ build-mutter:
build-without-opengl-and-glx: build-without-opengl-and-glx:
stage: build stage: build
needs: []
script: script:
- meson . build -Dbuildtype=debugoptimized -Dopengl=false -Dglx=false -Degl_device=true -Dwayland_eglstream=true --werror --prefix /usr - meson . build -Dbuildtype=debugoptimized -Dopengl=false -Dglx=false -Degl_device=true -Dwayland_eglstream=true --werror --prefix /usr
- ninja -C build - ninja -C build
@@ -46,7 +44,6 @@ build-without-opengl-and-glx:
build-without-native-backend-and-wayland: build-without-native-backend-and-wayland:
stage: build stage: build
needs: []
script: script:
- meson . build -Dbuildtype=debugoptimized -Dnative_backend=false -Dudev=false -Dwayland=false -Dcore_tests=false --werror --prefix /usr - meson . build -Dbuildtype=debugoptimized -Dnative_backend=false -Dudev=false -Dwayland=false -Dcore_tests=false --werror --prefix /usr
- ninja -C build - ninja -C build
@@ -62,7 +59,6 @@ test-mutter:
stage: test stage: test
dependencies: dependencies:
- build-mutter - build-mutter
needs: ["build-mutter"]
variables: variables:
XDG_RUNTIME_DIR: "$CI_PROJECT_DIR/runtime-dir" XDG_RUNTIME_DIR: "$CI_PROJECT_DIR/runtime-dir"
GSETTINGS_SCHEMA_DIR: "$CI_PROJECT_DIR/build/data" GSETTINGS_SCHEMA_DIR: "$CI_PROJECT_DIR/build/data"
@@ -88,7 +84,6 @@ test-mutter-coverage:
stage: coverage stage: coverage
dependencies: dependencies:
- test-mutter - test-mutter
needs: ["test-mutter"]
script: script:
- ninja -C build coverage - ninja -C build coverage
- cat build/meson-logs/coverage.txt - cat build/meson-logs/coverage.txt
@@ -105,7 +100,6 @@ can-build-gnome-shell:
stage: test stage: test
dependencies: dependencies:
- build-mutter - build-mutter
needs: ["build-mutter"]
before_script: before_script:
- meson install --no-rebuild -C build - meson install --no-rebuild -C build
script: script:

View File

@@ -17,7 +17,6 @@ RUN dnf -y update && dnf -y upgrade && \
# For running unit tests # For running unit tests
dnf install -y xorg-x11-server-Xvfb mesa-dri-drivers dbus dbus-x11 \ dnf install -y xorg-x11-server-Xvfb mesa-dri-drivers dbus dbus-x11 \
'*/xvfb-run' gdm-lib accountsservice-libs gnome-control-center gcovr \ '*/xvfb-run' gdm-lib accountsservice-libs gnome-control-center gcovr \
libnma python3-gobject python3-dbusmock \
--setopt=install_weak_deps=False && \ --setopt=install_weak_deps=False && \
# GNOME Shell # GNOME Shell

27
NEWS
View File

@@ -1,30 +1,3 @@
3.37.90
=======
* Fix using NEAREST filter for backgrounds on scaled monitors [Daniel V.; !1346]
* Screencast fixes and improvements [Jonas; !1361, !1377, !1391]
* Support tap-button-map and tap-drag-lock touchpad settings [Giusy; !1319]
* Fix wine copy & paste [Sebastian; !1369]
* Fix shadows of server-side decorated XWayland windows [Olivier; #1358]
* Replace some loaded terms with more descriptive ones [Olivier; !1396]
* Add API to launch trusted wayland clients [Sergio; #741]
* Skip displays with 'non-desktop' property set [Philipp; !1393]
* Invalidate offscreen effect cache on video memory purge [Daniel V.; !1374]
* Add wl_shm support for 10 bpc and 16 bpc half float formats [Jonas; !804]
* Fixed crashes [Jonas, Erik, Martin; !1365, !1375, #1343]
* Misc. bug fixes and cleanups [Daniel V., Carlos, Olivier, Christian,
Daniel * G., Jonas, Florian; !1370, !1376, !1385, !1352, !1386, !1390,
!1388, !1397, !1398, !1401]
Contributors:
Jonas Ådahl, Sergio Costas, Olivier Fourdan, Carlos Garnacho,
Christian Hergert, Sebastian Keller, Erik Kurzinger, Giusy Margarita,
Daniel García Moreno, Florian Müllner, Daniel van Vugt, Martin Whitaker,
Philipp Zabel
Translators:
Fabio Tomat [fur], Rafael Fontenelle [pt_BR], Jordi Mas [ca],
Yuri Chornoivan [uk], Alexandre Franke [fr]
3.37.3 3.37.3
====== ======
* Support custom keyboard layouts in $XDG_CONFIG_HOME/xkb [Peter; !936] * Support custom keyboard layouts in $XDG_CONFIG_HOME/xkb [Peter; !936]

View File

@@ -1093,6 +1093,7 @@ static GQuark quark_scroll = 0;
static GQuark quark_stage = 0; static GQuark quark_stage = 0;
static GQuark quark_destroy = 0; static GQuark quark_destroy = 0;
static GQuark quark_client = 0; static GQuark quark_client = 0;
static GQuark quark_delete = 0;
static GQuark quark_touch = 0; static GQuark quark_touch = 0;
static GQuark quark_touchpad = 0; static GQuark quark_touchpad = 0;
static GQuark quark_proximity = 0; static GQuark quark_proximity = 0;
@@ -6002,6 +6003,7 @@ clutter_actor_class_init (ClutterActorClass *klass)
quark_stage = g_quark_from_static_string ("stage"); quark_stage = g_quark_from_static_string ("stage");
quark_destroy = g_quark_from_static_string ("destroy"); quark_destroy = g_quark_from_static_string ("destroy");
quark_client = g_quark_from_static_string ("client"); quark_client = g_quark_from_static_string ("client");
quark_delete = g_quark_from_static_string ("delete");
quark_touch = g_quark_from_static_string ("touch"); quark_touch = g_quark_from_static_string ("touch");
quark_touchpad = g_quark_from_static_string ("touchpad"); quark_touchpad = g_quark_from_static_string ("touchpad");
quark_proximity = g_quark_from_static_string ("proximity"); quark_proximity = g_quark_from_static_string ("proximity");
@@ -12703,6 +12705,10 @@ clutter_actor_event (ClutterActor *actor,
signal_num = -1; signal_num = -1;
detail = quark_pad; detail = quark_pad;
break; break;
case CLUTTER_DELETE:
signal_num = -1;
detail = quark_delete;
break;
case CLUTTER_DESTROY_NOTIFY: case CLUTTER_DESTROY_NOTIFY:
signal_num = -1; signal_num = -1;
detail = quark_destroy; detail = quark_destroy;
@@ -12715,9 +12721,6 @@ clutter_actor_event (ClutterActor *actor,
signal_num = -1; signal_num = -1;
detail = quark_stage; detail = quark_stage;
break; break;
case CLUTTER_DEVICE_ADDED:
case CLUTTER_DEVICE_REMOVED:
break;
case CLUTTER_EVENT_LAST: /* Just keep compiler warnings quiet */ case CLUTTER_EVENT_LAST: /* Just keep compiler warnings quiet */
break; break;
} }
@@ -16351,19 +16354,15 @@ clutter_actor_is_effectively_on_stage_view (ClutterActor *self,
} }
/** /**
* clutter_actor_pick_frame_clock: (skip) * clutter_actor_pick_frame_clock:
* @self: a #ClutterActor * @self: a #ClutterActor
* @out_actor: (nullable): a pointer to an #ClutterActor
* *
* Pick the most suitable frame clock for driving animations for this actor. * Pick the most suitable frame clock for driving animations for this actor.
* *
* The #ClutterActor used for picking the frame clock is written @out_actor.
*
* Returns: (transfer none): a #ClutterFrameClock * Returns: (transfer none): a #ClutterFrameClock
*/ */
ClutterFrameClock * ClutterFrameClock *
clutter_actor_pick_frame_clock (ClutterActor *self, clutter_actor_pick_frame_clock (ClutterActor *self)
ClutterActor **out_actor)
{ {
ClutterActorPrivate *priv = self->priv; ClutterActorPrivate *priv = self->priv;
float max_refresh_rate = 0.0; float max_refresh_rate = 0.0;
@@ -16373,7 +16372,7 @@ clutter_actor_pick_frame_clock (ClutterActor *self,
if (!priv->stage_views) if (!priv->stage_views)
{ {
if (priv->parent) if (priv->parent)
return clutter_actor_pick_frame_clock (priv->parent, out_actor); return clutter_actor_pick_frame_clock (priv->parent);
else else
return NULL; return NULL;
} }
@@ -16392,15 +16391,9 @@ clutter_actor_pick_frame_clock (ClutterActor *self,
} }
if (best_view) if (best_view)
{ return clutter_stage_view_get_frame_clock (best_view);
if (out_actor)
*out_actor = self;
return clutter_stage_view_get_frame_clock (best_view);
}
else else
{ return NULL;
return NULL;
}
} }
/** /**

View File

@@ -935,6 +935,9 @@ GList * clutter_actor_peek_stage_views (ClutterActor *self);
CLUTTER_EXPORT CLUTTER_EXPORT
void clutter_actor_invalidate_transform (ClutterActor *self); void clutter_actor_invalidate_transform (ClutterActor *self);
CLUTTER_EXPORT
ClutterFrameClock * clutter_actor_pick_frame_clock (ClutterActor *self);
G_END_DECLS G_END_DECLS
#endif /* __CLUTTER_ACTOR_H__ */ #endif /* __CLUTTER_ACTOR_H__ */

View File

@@ -93,8 +93,6 @@ struct _ClutterBackendClass
ClutterSeat * (* get_default_seat) (ClutterBackend *backend); ClutterSeat * (* get_default_seat) (ClutterBackend *backend);
gboolean (* is_display_server) (ClutterBackend *backend);
/* signals */ /* signals */
void (* resolution_changed) (ClutterBackend *backend); void (* resolution_changed) (ClutterBackend *backend);
void (* font_changed) (ClutterBackend *backend); void (* font_changed) (ClutterBackend *backend);
@@ -144,8 +142,6 @@ void clutter_backend_set_fallback_resource_scale (ClutterBackend *backend,
float clutter_backend_get_fallback_resource_scale (ClutterBackend *backend); float clutter_backend_get_fallback_resource_scale (ClutterBackend *backend);
gboolean clutter_backend_is_display_server (ClutterBackend *backend);
G_END_DECLS G_END_DECLS
#endif /* __CLUTTER_BACKEND_PRIVATE_H__ */ #endif /* __CLUTTER_BACKEND_PRIVATE_H__ */

View File

@@ -58,6 +58,13 @@
#include <cogl/cogl.h> #include <cogl/cogl.h>
#ifdef CLUTTER_INPUT_X11
#include "x11/clutter-backend-x11.h"
#endif
#ifdef CLUTTER_WINDOWING_EGL
#include "egl/clutter-backend-eglnative.h"
#endif
#ifdef CLUTTER_HAS_WAYLAND_COMPOSITOR_SUPPORT #ifdef CLUTTER_HAS_WAYLAND_COMPOSITOR_SUPPORT
#include <cogl/cogl-wayland-server.h> #include <cogl/cogl-wayland-server.h>
#include <wayland-server.h> #include <wayland-server.h>
@@ -415,6 +422,14 @@ clutter_backend_real_get_features (ClutterBackend *backend)
flags |= CLUTTER_FEATURE_STAGE_STATIC; flags |= CLUTTER_FEATURE_STAGE_STATIC;
} }
if (cogl_clutter_winsys_has_feature (COGL_WINSYS_FEATURE_SWAP_THROTTLE))
{
CLUTTER_NOTE (BACKEND, "Cogl supports swap buffers throttling");
flags |= CLUTTER_FEATURE_SWAP_THROTTLE;
}
else
CLUTTER_NOTE (BACKEND, "Cogl doesn't support swap buffers throttling");
if (cogl_clutter_winsys_has_feature (COGL_WINSYS_FEATURE_SWAP_BUFFERS_EVENT)) if (cogl_clutter_winsys_has_feature (COGL_WINSYS_FEATURE_SWAP_BUFFERS_EVENT))
{ {
CLUTTER_NOTE (BACKEND, "Cogl supports swap buffers complete events"); CLUTTER_NOTE (BACKEND, "Cogl supports swap buffers complete events");
@@ -424,8 +439,23 @@ clutter_backend_real_get_features (ClutterBackend *backend)
return flags; return flags;
} }
static const char *allowed_backends;
static ClutterBackend * (* custom_backend_func) (void); static ClutterBackend * (* custom_backend_func) (void);
static const struct {
const char *name;
ClutterBackend * (* create_backend) (void);
} available_backends[] = {
#ifdef CLUTTER_WINDOWING_X11
{ CLUTTER_WINDOWING_X11, clutter_backend_x11_new },
#endif
#ifdef CLUTTER_WINDOWING_EGL
{ CLUTTER_WINDOWING_EGL, clutter_backend_egl_native_new },
#endif
{ NULL, NULL },
};
void void
clutter_set_custom_backend_func (ClutterBackend *(* func) (void)) clutter_set_custom_backend_func (ClutterBackend *(* func) (void))
{ {
@@ -435,13 +465,58 @@ clutter_set_custom_backend_func (ClutterBackend *(* func) (void))
ClutterBackend * ClutterBackend *
_clutter_create_backend (void) _clutter_create_backend (void)
{ {
const char *backends_list;
ClutterBackend *retval; ClutterBackend *retval;
gboolean allow_any;
char **backends;
int i;
g_return_val_if_fail (custom_backend_func, NULL); if (custom_backend_func)
{
retval = custom_backend_func ();
retval = custom_backend_func (); if (!retval)
if (!retval) g_error ("Failed to create custom backend.");
g_error ("Failed to create custom backend.");
return retval;
}
if (allowed_backends == NULL)
allowed_backends = "*";
allow_any = strstr (allowed_backends, "*") != NULL;
backends_list = g_getenv ("CLUTTER_BACKEND");
if (backends_list == NULL)
backends_list = allowed_backends;
backends = g_strsplit (backends_list, ",", 0);
retval = NULL;
for (i = 0; retval == NULL && backends[i] != NULL; i++)
{
const char *backend = backends[i];
gboolean is_any = g_str_equal (backend, "*");
int j;
for (j = 0; available_backends[j].name != NULL; j++)
{
if ((is_any && allow_any) ||
(is_any && strstr (allowed_backends, available_backends[j].name)) ||
g_str_equal (backend, available_backends[j].name))
{
retval = available_backends[j].create_backend ();
if (retval != NULL)
break;
}
}
}
g_strfreev (backends);
if (retval == NULL)
g_error ("No default Clutter backend found.");
return retval; return retval;
} }
@@ -971,9 +1046,3 @@ clutter_backend_get_fallback_resource_scale (ClutterBackend *backend)
{ {
return backend->fallback_resource_scale; return backend->fallback_resource_scale;
} }
gboolean
clutter_backend_is_display_server (ClutterBackend *backend)
{
return CLUTTER_BACKEND_GET_CLASS (backend)->is_display_server (backend);
}

View File

@@ -387,6 +387,44 @@ typedef enum
CLUTTER_MODIFIER_MASK = 0x5c001fff CLUTTER_MODIFIER_MASK = 0x5c001fff
} ClutterModifierType; } ClutterModifierType;
/**
* ClutterKeyboardA11yFlags:
* @CLUTTER_A11Y_KEYBOARD_ENABLED:
* @CLUTTER_A11Y_TIMEOUT_ENABLED:
* @CLUTTER_A11Y_MOUSE_KEYS_ENABLED:
* @CLUTTER_A11Y_SLOW_KEYS_ENABLED:
* @CLUTTER_A11Y_SLOW_KEYS_BEEP_PRESS:
* @CLUTTER_A11Y_SLOW_KEYS_BEEP_ACCEPT:
* @CLUTTER_A11Y_SLOW_KEYS_BEEP_REJECT:
* @CLUTTER_A11Y_BOUNCE_KEYS_ENABLED:
* @CLUTTER_A11Y_BOUNCE_KEYS_BEEP_REJECT:
* @CLUTTER_A11Y_TOGGLE_KEYS_ENABLED:
* @CLUTTER_A11Y_STICKY_KEYS_ENABLED:
* @CLUTTER_A11Y_STICKY_KEYS_TWO_KEY_OFF:
* @CLUTTER_A11Y_STICKY_KEYS_BEEP:
* @CLUTTER_A11Y_FEATURE_STATE_CHANGE_BEEP:
*
* Keyboard accessibility features applied to a ClutterInputDevice keyboard.
*
*/
typedef enum
{
CLUTTER_A11Y_KEYBOARD_ENABLED = 1 << 0,
CLUTTER_A11Y_TIMEOUT_ENABLED = 1 << 1,
CLUTTER_A11Y_MOUSE_KEYS_ENABLED = 1 << 2,
CLUTTER_A11Y_SLOW_KEYS_ENABLED = 1 << 3,
CLUTTER_A11Y_SLOW_KEYS_BEEP_PRESS = 1 << 4,
CLUTTER_A11Y_SLOW_KEYS_BEEP_ACCEPT = 1 << 5,
CLUTTER_A11Y_SLOW_KEYS_BEEP_REJECT = 1 << 6,
CLUTTER_A11Y_BOUNCE_KEYS_ENABLED = 1 << 7,
CLUTTER_A11Y_BOUNCE_KEYS_BEEP_REJECT = 1 << 8,
CLUTTER_A11Y_TOGGLE_KEYS_ENABLED = 1 << 9,
CLUTTER_A11Y_STICKY_KEYS_ENABLED = 1 << 10,
CLUTTER_A11Y_STICKY_KEYS_TWO_KEY_OFF = 1 << 11,
CLUTTER_A11Y_STICKY_KEYS_BEEP = 1 << 12,
CLUTTER_A11Y_FEATURE_STATE_CHANGE_BEEP = 1 << 13,
} ClutterKeyboardA11yFlags;
/** /**
* ClutterPointerA11yFlags: * ClutterPointerA11yFlags:
* @CLUTTER_A11Y_POINTER_ENABLED: * @CLUTTER_A11Y_POINTER_ENABLED:
@@ -819,6 +857,7 @@ typedef enum /*< flags prefix=CLUTTER_EVENT >*/
* @CLUTTER_STAGE_STATE: Stage state change event * @CLUTTER_STAGE_STATE: Stage state change event
* @CLUTTER_DESTROY_NOTIFY: Destroy notification event * @CLUTTER_DESTROY_NOTIFY: Destroy notification event
* @CLUTTER_CLIENT_MESSAGE: Client message event * @CLUTTER_CLIENT_MESSAGE: Client message event
* @CLUTTER_DELETE: Stage delete event
* @CLUTTER_TOUCH_BEGIN: A new touch event sequence has started; * @CLUTTER_TOUCH_BEGIN: A new touch event sequence has started;
* event added in 1.10 * event added in 1.10
* @CLUTTER_TOUCH_UPDATE: A touch event sequence has been updated; * @CLUTTER_TOUCH_UPDATE: A touch event sequence has been updated;
@@ -856,6 +895,7 @@ typedef enum /*< prefix=CLUTTER >*/
CLUTTER_STAGE_STATE, CLUTTER_STAGE_STATE,
CLUTTER_DESTROY_NOTIFY, CLUTTER_DESTROY_NOTIFY,
CLUTTER_CLIENT_MESSAGE, CLUTTER_CLIENT_MESSAGE,
CLUTTER_DELETE,
CLUTTER_TOUCH_BEGIN, CLUTTER_TOUCH_BEGIN,
CLUTTER_TOUCH_UPDATE, CLUTTER_TOUCH_UPDATE,
CLUTTER_TOUCH_END, CLUTTER_TOUCH_END,
@@ -868,8 +908,6 @@ typedef enum /*< prefix=CLUTTER >*/
CLUTTER_PAD_BUTTON_RELEASE, CLUTTER_PAD_BUTTON_RELEASE,
CLUTTER_PAD_STRIP, CLUTTER_PAD_STRIP,
CLUTTER_PAD_RING, CLUTTER_PAD_RING,
CLUTTER_DEVICE_ADDED,
CLUTTER_DEVICE_REMOVED,
CLUTTER_EVENT_LAST /* helper */ CLUTTER_EVENT_LAST /* helper */
} ClutterEventType; } ClutterEventType;
@@ -913,6 +951,7 @@ typedef enum
/** /**
* ClutterFeatureFlags: * ClutterFeatureFlags:
* @CLUTTER_FEATURE_SWAP_THROTTLE: Set if backend throttles buffer swaps.
* @CLUTTER_FEATURE_STAGE_STATIC: Set if stage size if fixed (i.e framebuffer) * @CLUTTER_FEATURE_STAGE_STATIC: Set if stage size if fixed (i.e framebuffer)
* @CLUTTER_FEATURE_STAGE_CURSOR: Set if stage has a graphical cursor. * @CLUTTER_FEATURE_STAGE_CURSOR: Set if stage has a graphical cursor.
* @CLUTTER_FEATURE_SHADERS_GLSL: Set if the backend supports GLSL shaders. * @CLUTTER_FEATURE_SHADERS_GLSL: Set if the backend supports GLSL shaders.
@@ -927,6 +966,7 @@ typedef enum
*/ */
typedef enum typedef enum
{ {
CLUTTER_FEATURE_SWAP_THROTTLE = (1 << 3),
CLUTTER_FEATURE_STAGE_STATIC = (1 << 6), CLUTTER_FEATURE_STAGE_STATIC = (1 << 6),
CLUTTER_FEATURE_STAGE_CURSOR = (1 << 8), CLUTTER_FEATURE_STAGE_CURSOR = (1 << 8),
CLUTTER_FEATURE_SHADERS_GLSL = (1 << 9), CLUTTER_FEATURE_SHADERS_GLSL = (1 << 9),
@@ -1594,6 +1634,12 @@ typedef enum
CLUTTER_INPUT_DEVICE_PAD_SOURCE_FINGER, CLUTTER_INPUT_DEVICE_PAD_SOURCE_FINGER,
} ClutterInputDevicePadSource; } ClutterInputDevicePadSource;
typedef enum
{
CLUTTER_INPUT_DEVICE_MAPPING_ABSOLUTE,
CLUTTER_INPUT_DEVICE_MAPPING_RELATIVE,
} ClutterInputDeviceMapping;
typedef enum typedef enum
{ {
CLUTTER_INPUT_CONTENT_HINT_COMPLETION = 1 << 0, CLUTTER_INPUT_CONTENT_HINT_COMPLETION = 1 << 0,

View File

@@ -407,6 +407,7 @@ clutter_event_get_position (const ClutterEvent *event,
case CLUTTER_STAGE_STATE: case CLUTTER_STAGE_STATE:
case CLUTTER_DESTROY_NOTIFY: case CLUTTER_DESTROY_NOTIFY:
case CLUTTER_CLIENT_MESSAGE: case CLUTTER_CLIENT_MESSAGE:
case CLUTTER_DELETE:
case CLUTTER_EVENT_LAST: case CLUTTER_EVENT_LAST:
case CLUTTER_PROXIMITY_IN: case CLUTTER_PROXIMITY_IN:
case CLUTTER_PROXIMITY_OUT: case CLUTTER_PROXIMITY_OUT:
@@ -414,8 +415,6 @@ clutter_event_get_position (const ClutterEvent *event,
case CLUTTER_PAD_BUTTON_RELEASE: case CLUTTER_PAD_BUTTON_RELEASE:
case CLUTTER_PAD_STRIP: case CLUTTER_PAD_STRIP:
case CLUTTER_PAD_RING: case CLUTTER_PAD_RING:
case CLUTTER_DEVICE_ADDED:
case CLUTTER_DEVICE_REMOVED:
graphene_point_init (position, 0.f, 0.f); graphene_point_init (position, 0.f, 0.f);
break; break;
@@ -482,6 +481,7 @@ clutter_event_set_coords (ClutterEvent *event,
case CLUTTER_STAGE_STATE: case CLUTTER_STAGE_STATE:
case CLUTTER_DESTROY_NOTIFY: case CLUTTER_DESTROY_NOTIFY:
case CLUTTER_CLIENT_MESSAGE: case CLUTTER_CLIENT_MESSAGE:
case CLUTTER_DELETE:
case CLUTTER_EVENT_LAST: case CLUTTER_EVENT_LAST:
case CLUTTER_PROXIMITY_IN: case CLUTTER_PROXIMITY_IN:
case CLUTTER_PROXIMITY_OUT: case CLUTTER_PROXIMITY_OUT:
@@ -489,8 +489,6 @@ clutter_event_set_coords (ClutterEvent *event,
case CLUTTER_PAD_BUTTON_RELEASE: case CLUTTER_PAD_BUTTON_RELEASE:
case CLUTTER_PAD_STRIP: case CLUTTER_PAD_STRIP:
case CLUTTER_PAD_RING: case CLUTTER_PAD_RING:
case CLUTTER_DEVICE_ADDED:
case CLUTTER_DEVICE_REMOVED:
break; break;
case CLUTTER_ENTER: case CLUTTER_ENTER:
@@ -1107,6 +1105,7 @@ clutter_event_set_device (ClutterEvent *event,
case CLUTTER_STAGE_STATE: case CLUTTER_STAGE_STATE:
case CLUTTER_DESTROY_NOTIFY: case CLUTTER_DESTROY_NOTIFY:
case CLUTTER_CLIENT_MESSAGE: case CLUTTER_CLIENT_MESSAGE:
case CLUTTER_DELETE:
case CLUTTER_EVENT_LAST: case CLUTTER_EVENT_LAST:
break; break;
@@ -1162,11 +1161,6 @@ clutter_event_set_device (ClutterEvent *event,
case CLUTTER_PAD_RING: case CLUTTER_PAD_RING:
event->pad_ring.device = device; event->pad_ring.device = device;
break; break;
case CLUTTER_DEVICE_ADDED:
case CLUTTER_DEVICE_REMOVED:
event->device.device = device;
break;
} }
} }
@@ -1208,6 +1202,7 @@ clutter_event_get_device (const ClutterEvent *event)
case CLUTTER_STAGE_STATE: case CLUTTER_STAGE_STATE:
case CLUTTER_DESTROY_NOTIFY: case CLUTTER_DESTROY_NOTIFY:
case CLUTTER_CLIENT_MESSAGE: case CLUTTER_CLIENT_MESSAGE:
case CLUTTER_DELETE:
case CLUTTER_EVENT_LAST: case CLUTTER_EVENT_LAST:
break; break;
@@ -1263,11 +1258,6 @@ clutter_event_get_device (const ClutterEvent *event)
case CLUTTER_PAD_RING: case CLUTTER_PAD_RING:
device = event->pad_ring.device; device = event->pad_ring.device;
break; break;
case CLUTTER_DEVICE_ADDED:
case CLUTTER_DEVICE_REMOVED:
device = event->device.device;
break;
} }
return device; return device;
@@ -1421,8 +1411,6 @@ clutter_event_copy (const ClutterEvent *event)
sizeof (gdouble) * n_axes); sizeof (gdouble) * n_axes);
break; break;
case CLUTTER_DEVICE_ADDED:
case CLUTTER_DEVICE_REMOVED:
default: default:
break; break;
} }
@@ -1477,9 +1465,6 @@ clutter_event_free (ClutterEvent *event)
case CLUTTER_TOUCH_CANCEL: case CLUTTER_TOUCH_CANCEL:
g_free (event->touch.axes); g_free (event->touch.axes);
break; break;
case CLUTTER_DEVICE_ADDED:
case CLUTTER_DEVICE_REMOVED:
break;
default: default:
break; break;
@@ -1504,17 +1489,40 @@ ClutterEvent *
clutter_event_get (void) clutter_event_get (void)
{ {
ClutterMainContext *context = _clutter_context_get_default (); ClutterMainContext *context = _clutter_context_get_default ();
ClutterEvent *event;
event = g_async_queue_try_pop (context->events_queue); if (context->events_queue == NULL)
return NULL;
return event; if (g_queue_is_empty (context->events_queue))
return NULL;
return g_queue_pop_tail (context->events_queue);
} }
static gboolean /**
spin_context (gpointer data) * clutter_event_peek:
*
* Returns a pointer to the first event from the event queue but
* does not remove it.
*
* Return value: (transfer none): A #ClutterEvent or NULL if queue empty.
*
* Since: 0.4
*/
ClutterEvent *
clutter_event_peek (void)
{ {
return G_SOURCE_REMOVE; ClutterMainContext *context = _clutter_context_get_default ();
g_return_val_if_fail (context != NULL, NULL);
if (context->events_queue == NULL)
return NULL;
if (g_queue_is_empty (context->events_queue))
return NULL;
return g_queue_peek_tail (context->events_queue);
} }
void void
@@ -1522,9 +1530,21 @@ _clutter_event_push (const ClutterEvent *event,
gboolean do_copy) gboolean do_copy)
{ {
ClutterMainContext *context = _clutter_context_get_default (); ClutterMainContext *context = _clutter_context_get_default ();
ClutterInputDevice *device;
g_assert (context != NULL); g_assert (context != NULL);
if (context->events_queue == NULL)
context->events_queue = g_queue_new ();
/* disabled devices don't propagate events */
device = clutter_event_get_device (event);
if (device != NULL)
{
if (!clutter_input_device_get_enabled (device))
return;
}
if (do_copy) if (do_copy)
{ {
ClutterEvent *copy; ClutterEvent *copy;
@@ -1533,8 +1553,7 @@ _clutter_event_push (const ClutterEvent *event,
event = copy; event = copy;
} }
g_async_queue_push (context->events_queue, (gpointer) event); g_queue_push_head (context->events_queue, (gpointer) event);
g_idle_add (spin_context, NULL);
} }
/** /**
@@ -1571,7 +1590,10 @@ clutter_events_pending (void)
g_return_val_if_fail (context != NULL, FALSE); g_return_val_if_fail (context != NULL, FALSE);
return g_async_queue_length (context->events_queue) > 0; if (context->events_queue == NULL)
return FALSE;
return g_queue_is_empty (context->events_queue) == FALSE;
} }
/** /**
@@ -1703,6 +1725,7 @@ clutter_event_get_axes (const ClutterEvent *event,
case CLUTTER_STAGE_STATE: case CLUTTER_STAGE_STATE:
case CLUTTER_DESTROY_NOTIFY: case CLUTTER_DESTROY_NOTIFY:
case CLUTTER_CLIENT_MESSAGE: case CLUTTER_CLIENT_MESSAGE:
case CLUTTER_DELETE:
case CLUTTER_ENTER: case CLUTTER_ENTER:
case CLUTTER_LEAVE: case CLUTTER_LEAVE:
case CLUTTER_KEY_PRESS: case CLUTTER_KEY_PRESS:
@@ -1710,8 +1733,6 @@ clutter_event_get_axes (const ClutterEvent *event,
case CLUTTER_EVENT_LAST: case CLUTTER_EVENT_LAST:
case CLUTTER_PROXIMITY_IN: case CLUTTER_PROXIMITY_IN:
case CLUTTER_PROXIMITY_OUT: case CLUTTER_PROXIMITY_OUT:
case CLUTTER_DEVICE_ADDED:
case CLUTTER_DEVICE_REMOVED:
break; break;
case CLUTTER_SCROLL: case CLUTTER_SCROLL:

View File

@@ -121,7 +121,6 @@ typedef struct _ClutterProximityEvent ClutterProximityEvent;
typedef struct _ClutterPadButtonEvent ClutterPadButtonEvent; typedef struct _ClutterPadButtonEvent ClutterPadButtonEvent;
typedef struct _ClutterPadStripEvent ClutterPadStripEvent; typedef struct _ClutterPadStripEvent ClutterPadStripEvent;
typedef struct _ClutterPadRingEvent ClutterPadRingEvent; typedef struct _ClutterPadRingEvent ClutterPadRingEvent;
typedef struct _ClutterDeviceEvent ClutterDeviceEvent;
/** /**
* ClutterAnyEvent: * ClutterAnyEvent:
@@ -545,17 +544,6 @@ struct _ClutterPadRingEvent
guint32 mode; guint32 mode;
}; };
struct _ClutterDeviceEvent
{
ClutterEventType type;
guint32 time;
ClutterEventFlags flags;
ClutterStage *stage;
ClutterActor *source;
ClutterInputDevice *device;
};
/** /**
* ClutterEvent: * ClutterEvent:
* *
@@ -582,7 +570,6 @@ union _ClutterEvent
ClutterPadButtonEvent pad_button; ClutterPadButtonEvent pad_button;
ClutterPadStripEvent pad_strip; ClutterPadStripEvent pad_strip;
ClutterPadRingEvent pad_ring; ClutterPadRingEvent pad_ring;
ClutterDeviceEvent device;
}; };
/** /**
@@ -614,6 +601,8 @@ gboolean clutter_events_pending (void);
CLUTTER_EXPORT CLUTTER_EXPORT
ClutterEvent * clutter_event_get (void); ClutterEvent * clutter_event_get (void);
CLUTTER_EXPORT CLUTTER_EXPORT
ClutterEvent * clutter_event_peek (void);
CLUTTER_EXPORT
void clutter_event_put (const ClutterEvent *event); void clutter_event_put (const ClutterEvent *event);
CLUTTER_EXPORT CLUTTER_EXPORT

View File

@@ -514,7 +514,7 @@ clutter_frame_clock_destroy (ClutterFrameClock *frame_clock)
static void static void
clutter_frame_clock_dispose (GObject *object) clutter_frame_clock_dispose (GObject *object)
{ {
ClutterFrameClock *frame_clock = CLUTTER_FRAME_CLOCK (object); ClutterFrameClock *frame_clock = CLUTTER_FRAME_CLOCK (object);
if (frame_clock->source) if (frame_clock->source)
{ {

View File

@@ -61,6 +61,15 @@ typedef struct _ClutterScrollInfo
guint last_value_valid : 1; guint last_value_valid : 1;
} ClutterScrollInfo; } ClutterScrollInfo;
typedef struct _ClutterTouchInfo
{
ClutterEventSequence *sequence;
ClutterActor *actor;
float current_x;
float current_y;
} ClutterTouchInfo;
typedef struct _ClutterPtrA11yData typedef struct _ClutterPtrA11yData
{ {
int n_btn_pressed; int n_btn_pressed;
@@ -111,18 +120,25 @@ struct _ClutterInputDevice
/* the current click count */ /* the current click count */
int click_count; int click_count;
/* the stage the device is on */
ClutterStage *stage;
/* the current state */ /* the current state */
float current_x;
float current_y;
uint32_t current_time;
int current_button_number; int current_button_number;
ClutterModifierType current_state; ClutterModifierType current_state;
/* the current touch points targets */ /* the current touch points states */
GHashTable *touch_sequence_actors; GHashTable *touch_sequences_info;
/* the previous state, used for click count generation */ /* the previous state, used for click count generation */
int previous_x; int previous_x;
int previous_y; int previous_y;
uint32_t previous_time; uint32_t previous_time;
int previous_button_number; int previous_button_number;
ClutterModifierType previous_state;
GArray *axes; GArray *axes;
@@ -141,6 +157,8 @@ struct _ClutterInputDevice
int n_strips; int n_strips;
int n_mode_groups; int n_mode_groups;
ClutterInputDeviceMapping mapping_mode;
guint has_cursor : 1; guint has_cursor : 1;
guint is_enabled : 1; guint is_enabled : 1;
@@ -162,11 +180,33 @@ CLUTTER_EXPORT
void clutter_input_device_update_from_tool (ClutterInputDevice *device, void clutter_input_device_update_from_tool (ClutterInputDevice *device,
ClutterInputDeviceTool *tool); ClutterInputDeviceTool *tool);
CLUTTER_EXPORT 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, ClutterActor * clutter_input_device_update (ClutterInputDevice *device,
ClutterEventSequence *sequence, ClutterEventSequence *sequence,
ClutterStage *stage, gboolean emit_crossing);
gboolean emit_crossing, CLUTTER_EXPORT
ClutterEvent *for_event); void _clutter_input_device_add_event_sequence (ClutterInputDevice *device,
ClutterEvent *event);
CLUTTER_EXPORT CLUTTER_EXPORT
void _clutter_input_device_remove_event_sequence (ClutterInputDevice *device, void _clutter_input_device_remove_event_sequence (ClutterInputDevice *device,
ClutterEvent *event); ClutterEvent *event);
@@ -174,12 +214,6 @@ CLUTTER_EXPORT
void _clutter_input_device_set_n_keys (ClutterInputDevice *device, void _clutter_input_device_set_n_keys (ClutterInputDevice *device,
guint n_keys); guint n_keys);
CLUTTER_EXPORT CLUTTER_EXPORT
void clutter_input_device_set_key (ClutterInputDevice *device,
guint index_,
guint keyval,
ClutterModifierType modifiers);
CLUTTER_EXPORT
gboolean _clutter_input_device_translate_axis (ClutterInputDevice *device, gboolean _clutter_input_device_translate_axis (ClutterInputDevice *device,
guint index_, guint index_,
gdouble value, gdouble value,
@@ -218,9 +252,4 @@ ClutterInputDeviceTool *
guint64 serial, guint64 serial,
ClutterInputDeviceToolType type); ClutterInputDeviceToolType type);
CLUTTER_EXPORT
gboolean clutter_input_device_keycode_to_evdev (ClutterInputDevice *device,
guint hardware_keycode,
guint *evdev_keycode);
#endif /* CLUTTER_INPUT_DEVICE_PRIVATE_H */ #endif /* CLUTTER_INPUT_DEVICE_PRIVATE_H */

View File

@@ -61,6 +61,7 @@ enum
PROP_DEVICE_MODE, PROP_DEVICE_MODE,
PROP_HAS_CURSOR, PROP_HAS_CURSOR,
PROP_ENABLED,
PROP_N_AXES, PROP_N_AXES,
@@ -71,10 +72,12 @@ enum
PROP_N_RINGS, PROP_N_RINGS,
PROP_N_MODE_GROUPS, PROP_N_MODE_GROUPS,
PROP_DEVICE_NODE, PROP_DEVICE_NODE,
PROP_MAPPING_MODE,
PROP_LAST PROP_LAST
}; };
static void _clutter_input_device_free_touch_info (gpointer data);
static void on_cursor_actor_destroy (ClutterActor *actor, static void on_cursor_actor_destroy (ClutterActor *actor,
ClutterInputDevice *device); ClutterInputDevice *device);
static void on_cursor_actor_reactive_changed (ClutterActor *actor, static void on_cursor_actor_reactive_changed (ClutterActor *actor,
@@ -111,7 +114,7 @@ clutter_input_device_dispose (GObject *gobject)
g_clear_pointer (&device->axes, g_array_unref); g_clear_pointer (&device->axes, g_array_unref);
g_clear_pointer (&device->keys, g_array_unref); g_clear_pointer (&device->keys, g_array_unref);
g_clear_pointer (&device->scroll_info, g_array_unref); g_clear_pointer (&device->scroll_info, g_array_unref);
g_clear_pointer (&device->touch_sequence_actors, g_hash_table_unref); g_clear_pointer (&device->touch_sequences_info, g_hash_table_unref);
if (device->cursor_actor) if (device->cursor_actor)
{ {
@@ -188,6 +191,10 @@ clutter_input_device_set_property (GObject *gobject,
self->has_cursor = g_value_get_boolean (value); self->has_cursor = g_value_get_boolean (value);
break; break;
case PROP_ENABLED:
clutter_input_device_set_enabled (self, g_value_get_boolean (value));
break;
case PROP_VENDOR_ID: case PROP_VENDOR_ID:
self->vendor_id = g_value_dup_string (value); self->vendor_id = g_value_dup_string (value);
break; break;
@@ -212,6 +219,10 @@ clutter_input_device_set_property (GObject *gobject,
self->node_path = g_value_dup_string (value); self->node_path = g_value_dup_string (value);
break; break;
case PROP_MAPPING_MODE:
self->mapping_mode = g_value_get_enum (value);
break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);
break; break;
@@ -260,6 +271,10 @@ clutter_input_device_get_property (GObject *gobject,
g_value_set_uint (value, clutter_input_device_get_n_axes (self)); g_value_set_uint (value, clutter_input_device_get_n_axes (self));
break; break;
case PROP_ENABLED:
g_value_set_boolean (value, self->is_enabled);
break;
case PROP_VENDOR_ID: case PROP_VENDOR_ID:
g_value_set_string (value, self->vendor_id); g_value_set_string (value, self->vendor_id);
break; break;
@@ -284,6 +299,10 @@ clutter_input_device_get_property (GObject *gobject,
g_value_set_string (value, self->node_path); g_value_set_string (value, self->node_path);
break; break;
case PROP_MAPPING_MODE:
g_value_set_enum (value, self->mapping_mode);
break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);
break; break;
@@ -383,6 +402,25 @@ clutter_input_device_class_init (ClutterInputDeviceClass *klass)
FALSE, FALSE,
CLUTTER_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY); CLUTTER_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY);
/**
* ClutterInputDevice:enabled:
*
* Whether the device is enabled.
*
* A device with the #ClutterInputDevice:device-mode property set
* to %CLUTTER_INPUT_MODE_MASTER cannot be disabled.
*
* A device must be enabled in order to receive events from it.
*
* Since: 1.6
*/
obj_props[PROP_ENABLED] =
g_param_spec_boolean ("enabled",
P_("Enabled"),
P_("Whether the device is enabled"),
FALSE,
CLUTTER_PARAM_READWRITE);
/** /**
* ClutterInputDevice:n-axes: * ClutterInputDevice:n-axes:
* *
@@ -468,6 +506,14 @@ clutter_input_device_class_init (ClutterInputDeviceClass *klass)
NULL, NULL,
CLUTTER_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY); CLUTTER_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY);
obj_props[PROP_MAPPING_MODE] =
g_param_spec_enum ("mapping-mode",
P_("Device mapping mode"),
P_("Device mapping mode"),
CLUTTER_TYPE_INPUT_DEVICE_MAPPING,
CLUTTER_INPUT_DEVICE_MAPPING_ABSOLUTE,
CLUTTER_PARAM_READWRITE);
gobject_class->dispose = clutter_input_device_dispose; gobject_class->dispose = clutter_input_device_dispose;
gobject_class->set_property = clutter_input_device_set_property; gobject_class->set_property = clutter_input_device_set_property;
gobject_class->get_property = clutter_input_device_get_property; gobject_class->get_property = clutter_input_device_get_property;
@@ -482,15 +528,91 @@ clutter_input_device_init (ClutterInputDevice *self)
self->click_count = 0; self->click_count = 0;
self->previous_time = CLUTTER_CURRENT_TIME; self->current_time = self->previous_time = CLUTTER_CURRENT_TIME;
self->previous_x = -1; self->current_x = self->previous_x = -1;
self->previous_y = -1; self->current_y = self->previous_y = -1;
self->current_button_number = self->previous_button_number = -1; self->current_button_number = self->previous_button_number = -1;
self->current_state = self->previous_state = 0;
self->touch_sequence_actors = g_hash_table_new (NULL, NULL); self->touch_sequences_info =
g_hash_table_new_full (NULL, NULL,
NULL, _clutter_input_device_free_touch_info);
self->inv_touch_sequence_actors = g_hash_table_new (NULL, NULL); self->inv_touch_sequence_actors = g_hash_table_new (NULL, NULL);
} }
static ClutterTouchInfo *
_clutter_input_device_ensure_touch_info (ClutterInputDevice *device,
ClutterEventSequence *sequence,
ClutterStage *stage)
{
ClutterTouchInfo *info;
info = g_hash_table_lookup (device->touch_sequences_info, sequence);
if (info == NULL)
{
info = g_slice_new0 (ClutterTouchInfo);
info->sequence = sequence;
g_hash_table_insert (device->touch_sequences_info, sequence, info);
if (g_hash_table_size (device->touch_sequences_info) == 1)
_clutter_input_device_set_stage (device, stage);
}
return info;
}
/*< private >
* clutter_input_device_set_coords:
* @device: a #ClutterInputDevice
* @sequence: a #ClutterEventSequence or NULL
* @x: X coordinate of the device
* @y: Y coordinate of the device
*
* Stores the last known coordinates of the device
*/
void
_clutter_input_device_set_coords (ClutterInputDevice *device,
ClutterEventSequence *sequence,
gfloat x,
gfloat y,
ClutterStage *stage)
{
g_return_if_fail (CLUTTER_IS_INPUT_DEVICE (device));
if (sequence == NULL)
{
if (device->current_x != x)
device->current_x = x;
if (device->current_y != y)
device->current_y = y;
}
else
{
ClutterTouchInfo *info;
info = _clutter_input_device_ensure_touch_info (device, sequence, stage);
info->current_x = x;
info->current_y = y;
}
}
/*< private >
* clutter_input_device_set_state:
* @device: a #ClutterInputDevice
* @state: a bitmask of modifiers
*
* Stores the last known modifiers state of the device
*/
void
_clutter_input_device_set_state (ClutterInputDevice *device,
ClutterModifierType state)
{
g_return_if_fail (CLUTTER_IS_INPUT_DEVICE (device));
device->current_state = state;
}
/** /**
* clutter_input_device_get_modifier_state: * clutter_input_device_get_modifier_state:
* @device: a #ClutterInputDevice * @device: a #ClutterInputDevice
@@ -505,17 +627,69 @@ clutter_input_device_init (ClutterInputDevice *self)
ClutterModifierType ClutterModifierType
clutter_input_device_get_modifier_state (ClutterInputDevice *device) clutter_input_device_get_modifier_state (ClutterInputDevice *device)
{ {
uint32_t modifiers;
ClutterSeat *seat;
g_return_val_if_fail (CLUTTER_IS_INPUT_DEVICE (device), 0); g_return_val_if_fail (CLUTTER_IS_INPUT_DEVICE (device), 0);
seat = clutter_input_device_get_seat (device); return device->current_state;
}
if (!clutter_seat_query_state (seat, device, NULL, NULL, &modifiers)) /*< private >
return 0; * clutter_input_device_set_time:
* @device: a #ClutterInputDevice
* @time_: the time
*
* Stores the last known event time of the device
*/
void
_clutter_input_device_set_time (ClutterInputDevice *device,
guint32 time_)
{
g_return_if_fail (CLUTTER_IS_INPUT_DEVICE (device));
return modifiers; if (device->current_time != time_)
device->current_time = time_;
}
/*< private >
* clutter_input_device_set_stage:
* @device: a #ClutterInputDevice
* @stage: a #ClutterStage or %NULL
*
* Stores the stage under the device
*/
void
_clutter_input_device_set_stage (ClutterInputDevice *device,
ClutterStage *stage)
{
if (device->stage == stage)
return;
device->stage = stage;
/* we leave the ->cursor_actor in place in order to check
* if we left the stage without crossing it again; this way
* we can emit a leave event on the cursor actor right before
* we emit the leave event on the stage.
*/
}
/*< private >
* clutter_input_device_get_stage:
* @device: a #ClutterInputDevice
*
* Retrieves the stage currently associated with @device.
*
* Return value: The stage currently associated with @device.
*/
ClutterStage *
_clutter_input_device_get_stage (ClutterInputDevice *device)
{
return device->stage;
}
static void
_clutter_input_device_free_touch_info (gpointer data)
{
g_slice_free (ClutterTouchInfo, data);
} }
static void static void
@@ -529,8 +703,12 @@ _clutter_input_device_associate_actor (ClutterInputDevice *device,
{ {
GList *sequences = GList *sequences =
g_hash_table_lookup (device->inv_touch_sequence_actors, actor); g_hash_table_lookup (device->inv_touch_sequence_actors, actor);
ClutterTouchInfo *info;
ClutterStage *stage = CLUTTER_STAGE (clutter_actor_get_stage (actor));
info = _clutter_input_device_ensure_touch_info (device, sequence, stage);
info->actor = actor;
g_hash_table_insert (device->touch_sequence_actors, sequence, actor);
g_hash_table_insert (device->inv_touch_sequence_actors, g_hash_table_insert (device->inv_touch_sequence_actors,
actor, g_list_prepend (sequences, sequence)); actor, g_list_prepend (sequences, sequence));
} }
@@ -558,7 +736,13 @@ _clutter_input_device_unassociate_actor (ClutterInputDevice *device,
actor); actor);
for (l = sequences; l != NULL; l = l->next) for (l = sequences; l != NULL; l = l->next)
g_hash_table_remove (device->touch_sequence_actors, l->data); {
ClutterTouchInfo *info =
g_hash_table_lookup (device->touch_sequences_info, l->data);
if (info)
info->actor = NULL;
}
g_list_free (sequences); g_list_free (sequences);
g_hash_table_remove (device->inv_touch_sequence_actors, actor); g_hash_table_remove (device->inv_touch_sequence_actors, actor);
@@ -611,31 +795,17 @@ on_cursor_actor_reactive_changed (ClutterActor *actor,
* - set to %TRUE the :has-pointer property of the new pointer * - set to %TRUE the :has-pointer property of the new pointer
* actor * actor
*/ */
static void void
_clutter_input_device_set_actor (ClutterInputDevice *device, _clutter_input_device_set_actor (ClutterInputDevice *device,
ClutterEventSequence *sequence, ClutterEventSequence *sequence,
ClutterActor *actor, ClutterActor *actor,
gboolean emit_crossing, gboolean emit_crossing)
graphene_point_t coords,
uint32_t time_)
{ {
ClutterActor *old_actor = clutter_input_device_get_actor (device, sequence); ClutterActor *old_actor = clutter_input_device_get_actor (device, sequence);
ClutterStage *stage = NULL;
if (old_actor == actor) if (old_actor == actor)
return; return;
if (emit_crossing)
{
if (actor)
stage = CLUTTER_STAGE (clutter_actor_get_stage (actor));
else if (old_actor)
stage = CLUTTER_STAGE (clutter_actor_get_stage (old_actor));
if (!stage)
return;
}
if (old_actor != NULL) if (old_actor != NULL)
{ {
ClutterActor *tmp_old_actor; ClutterActor *tmp_old_actor;
@@ -645,12 +815,12 @@ _clutter_input_device_set_actor (ClutterInputDevice *device,
ClutterEvent *event; ClutterEvent *event;
event = clutter_event_new (CLUTTER_LEAVE); event = clutter_event_new (CLUTTER_LEAVE);
event->crossing.time = time_; event->crossing.time = device->current_time;
event->crossing.flags = 0; event->crossing.flags = 0;
event->crossing.stage = stage; event->crossing.stage = device->stage;
event->crossing.source = old_actor; event->crossing.source = old_actor;
event->crossing.x = coords.x; event->crossing.x = device->current_x;
event->crossing.y = coords.y; event->crossing.y = device->current_y;
event->crossing.related = actor; event->crossing.related = actor;
event->crossing.sequence = sequence; event->crossing.sequence = sequence;
clutter_event_set_device (event, device); clutter_event_set_device (event, device);
@@ -682,11 +852,11 @@ _clutter_input_device_set_actor (ClutterInputDevice *device,
ClutterEvent *event; ClutterEvent *event;
event = clutter_event_new (CLUTTER_ENTER); event = clutter_event_new (CLUTTER_ENTER);
event->crossing.time = time_; event->crossing.time = device->current_time;
event->crossing.flags = 0; event->crossing.flags = 0;
event->crossing.stage = stage; event->crossing.stage = device->stage;
event->crossing.x = coords.x; event->crossing.x = device->current_x;
event->crossing.y = coords.y; event->crossing.y = device->current_y;
event->crossing.source = actor; event->crossing.source = actor;
event->crossing.related = old_actor; event->crossing.related = old_actor;
event->crossing.sequence = sequence; event->crossing.sequence = sequence;
@@ -737,6 +907,56 @@ clutter_input_device_get_device_id (ClutterInputDevice *device)
return device->id; return device->id;
} }
/**
* clutter_input_device_set_enabled:
* @device: a #ClutterInputDevice
* @enabled: %TRUE to enable the @device
*
* Enables or disables a #ClutterInputDevice.
*
* Only devices with a #ClutterInputDevice:device-mode property set
* to %CLUTTER_INPUT_MODE_SLAVE or %CLUTTER_INPUT_MODE_FLOATING can
* be disabled.
*
* Since: 1.6
*/
void
clutter_input_device_set_enabled (ClutterInputDevice *device,
gboolean enabled)
{
g_return_if_fail (CLUTTER_IS_INPUT_DEVICE (device));
enabled = !!enabled;
if (!enabled && device->device_mode == CLUTTER_INPUT_MODE_MASTER)
return;
if (device->is_enabled == enabled)
return;
device->is_enabled = enabled;
g_object_notify_by_pspec (G_OBJECT (device), obj_props[PROP_ENABLED]);
}
/**
* clutter_input_device_get_enabled:
* @device: a #ClutterInputDevice
*
* Retrieves whether @device is enabled.
*
* Return value: %TRUE if the device is enabled
*
* Since: 1.6
*/
gboolean
clutter_input_device_get_enabled (ClutterInputDevice *device)
{
g_return_val_if_fail (CLUTTER_IS_INPUT_DEVICE (device), FALSE);
return device->is_enabled;
}
/** /**
* clutter_input_device_get_coords: * clutter_input_device_get_coords:
* @device: a #ClutterInputDevice * @device: a #ClutterInputDevice
@@ -758,14 +978,27 @@ clutter_input_device_get_coords (ClutterInputDevice *device,
ClutterEventSequence *sequence, ClutterEventSequence *sequence,
graphene_point_t *point) graphene_point_t *point)
{ {
ClutterSeat *seat;
g_return_val_if_fail (CLUTTER_IS_INPUT_DEVICE (device), FALSE); g_return_val_if_fail (CLUTTER_IS_INPUT_DEVICE (device), FALSE);
g_return_val_if_fail (point != NULL, FALSE); g_return_val_if_fail (point != NULL, FALSE);
seat = clutter_input_device_get_seat (device); if (sequence == NULL)
{
point->x = device->current_x;
point->y = device->current_y;
}
else
{
ClutterTouchInfo *info =
g_hash_table_lookup (device->touch_sequences_info, sequence);
return clutter_seat_query_state (seat, device, sequence, point, NULL); if (info == NULL)
return FALSE;
point->x = info->current_x;
point->y = info->current_y;
}
return TRUE;
} }
/* /*
@@ -785,30 +1018,28 @@ clutter_input_device_get_coords (ClutterInputDevice *device,
ClutterActor * ClutterActor *
clutter_input_device_update (ClutterInputDevice *device, clutter_input_device_update (ClutterInputDevice *device,
ClutterEventSequence *sequence, ClutterEventSequence *sequence,
ClutterStage *stage, gboolean emit_crossing)
gboolean emit_crossing,
ClutterEvent *for_event)
{ {
ClutterStage *stage;
ClutterActor *new_cursor_actor; ClutterActor *new_cursor_actor;
ClutterActor *old_cursor_actor; ClutterActor *old_cursor_actor;
graphene_point_t point = GRAPHENE_POINT_INIT (-1.0f, -1.0f); graphene_point_t point = GRAPHENE_POINT_INIT (-1.0f, -1.0f);
ClutterInputDeviceType device_type = device->device_type; ClutterInputDeviceType device_type = device->device_type;
uint32_t time_;
g_assert (device_type != CLUTTER_KEYBOARD_DEVICE && g_assert (device_type != CLUTTER_KEYBOARD_DEVICE &&
device_type != CLUTTER_PAD_DEVICE); device_type != CLUTTER_PAD_DEVICE);
if (for_event) stage = device->stage;
if (G_UNLIKELY (stage == NULL))
{ {
clutter_event_get_coords (for_event, &point.x, &point.y); CLUTTER_NOTE (EVENT, "No stage defined for device %d '%s'",
time_ = clutter_event_get_time (for_event); clutter_input_device_get_device_id (device),
} clutter_input_device_get_device_name (device));
else return NULL;
{
clutter_input_device_get_coords (device, sequence, &point);
time_ = CLUTTER_CURRENT_TIME;
} }
clutter_input_device_get_coords (device, sequence, &point);
old_cursor_actor = clutter_input_device_get_actor (device, sequence); old_cursor_actor = clutter_input_device_get_actor (device, sequence);
new_cursor_actor = new_cursor_actor =
_clutter_stage_do_pick (stage, point.x, point.y, CLUTTER_PICK_REACTIVE); _clutter_stage_do_pick (stage, point.x, point.y, CLUTTER_PICK_REACTIVE);
@@ -834,8 +1065,7 @@ clutter_input_device_update (ClutterInputDevice *device,
_clutter_input_device_set_actor (device, sequence, _clutter_input_device_set_actor (device, sequence,
new_cursor_actor, new_cursor_actor,
emit_crossing, emit_crossing);
point, time_);
return new_cursor_actor; return new_cursor_actor;
} }
@@ -856,12 +1086,37 @@ ClutterActor *
clutter_input_device_get_actor (ClutterInputDevice *device, clutter_input_device_get_actor (ClutterInputDevice *device,
ClutterEventSequence *sequence) ClutterEventSequence *sequence)
{ {
ClutterTouchInfo *info;
g_return_val_if_fail (CLUTTER_IS_INPUT_DEVICE (device), NULL); g_return_val_if_fail (CLUTTER_IS_INPUT_DEVICE (device), NULL);
if (sequence == NULL) if (sequence == NULL)
return device->cursor_actor; return device->cursor_actor;
return g_hash_table_lookup (device->touch_sequence_actors, sequence); info = g_hash_table_lookup (device->touch_sequences_info, sequence);
g_return_val_if_fail (info != NULL, NULL);
return info->actor;
}
/**
* clutter_input_device_get_pointer_stage:
* @device: a #ClutterInputDevice of type %CLUTTER_POINTER_DEVICE
*
* Retrieves the #ClutterStage underneath the pointer of @device
*
* Return value: (transfer none): a pointer to the #ClutterStage or %NULL
*
* Since: 1.2
*/
ClutterStage *
clutter_input_device_get_pointer_stage (ClutterInputDevice *device)
{
g_return_val_if_fail (CLUTTER_IS_INPUT_DEVICE (device), NULL);
g_return_val_if_fail (device->device_type == CLUTTER_POINTER_DEVICE, NULL);
return device->stage;
} }
/** /**
@@ -922,6 +1177,95 @@ clutter_input_device_get_device_mode (ClutterInputDevice *device)
return device->device_mode; return device->device_mode;
} }
/**
* clutter_input_device_update_from_event:
* @device: a #ClutterInputDevice
* @event: a #ClutterEvent
* @update_stage: whether to update the #ClutterStage of the @device
* using the stage of the event
*
* Forcibly updates the state of the @device using a #ClutterEvent
*
* This function should never be used by applications: it is meant
* for integration with embedding toolkits, like clutter-gtk
*
* Embedding toolkits that disable the event collection inside Clutter
* need to use this function to update the state of input devices depending
* on a #ClutterEvent that they are going to submit to the event handling code
* in Clutter though clutter_do_event(). Since the input devices hold the state
* that is going to be used to fill in fields like the #ClutterButtonEvent
* click count, or to emit synthesized events like %CLUTTER_ENTER and
* %CLUTTER_LEAVE, it is necessary for embedding toolkits to also be
* responsible of updating the input device state.
*
* For instance, this might be the code to translate an embedding toolkit
* native motion notification into a Clutter #ClutterMotionEvent and ask
* Clutter to process it:
*
* |[
* ClutterEvent c_event;
*
* translate_native_event_to_clutter (native_event, &c_event);
*
* clutter_do_event (&c_event);
* ]|
*
* Before letting clutter_do_event() process the event, it is necessary to call
* clutter_input_device_update_from_event():
*
* |[
* ClutterEvent c_event;
* ClutterDeviceManager *manager;
* ClutterInputDevice *device;
*
* translate_native_event_to_clutter (native_event, &c_event);
*
* // get the seat
* seat = clutter_backend_get_deafult_seat (clutter_get_default_backend ());
*
* // use the default Core Pointer that Clutter backends register by default
* device = clutter_seat_get_pointer (seat);
*
* // update the state of the input device
* clutter_input_device_update_from_event (device, &c_event, FALSE);
*
* clutter_do_event (&c_event);
* ]|
*
* The @update_stage boolean argument should be used when the input device
* enters and leaves a #ClutterStage; it will use the #ClutterStage field
* of the passed @event to update the stage associated to the input device.
*
* Since: 1.2
*/
void
clutter_input_device_update_from_event (ClutterInputDevice *device,
ClutterEvent *event,
gboolean update_stage)
{
ClutterModifierType event_state;
ClutterEventSequence *sequence;
ClutterStage *event_stage;
gfloat event_x, event_y;
guint32 event_time;
g_return_if_fail (CLUTTER_IS_INPUT_DEVICE (device));
g_return_if_fail (event != NULL);
event_state = clutter_event_get_state (event);
event_time = clutter_event_get_time (event);
event_stage = clutter_event_get_stage (event);
sequence = clutter_event_get_event_sequence (event);
clutter_event_get_coords (event, &event_x, &event_y);
_clutter_input_device_set_coords (device, sequence, event_x, event_y, event_stage);
_clutter_input_device_set_state (device, event_state);
_clutter_input_device_set_time (device, event_time);
if (update_stage)
_clutter_input_device_set_stage (device, event_stage);
}
/*< private > /*< private >
* clutter_input_device_reset_axes: * clutter_input_device_reset_axes:
* @device: a #ClutterInputDevice * @device: a #ClutterInputDevice
@@ -1302,6 +1646,31 @@ _clutter_input_device_remove_slave (ClutterInputDevice *master,
master->slaves = g_list_remove (master->slaves, slave); master->slaves = g_list_remove (master->slaves, slave);
} }
/*< private >
* clutter_input_device_add_sequence:
* @device: a #ClutterInputDevice
* @sequence: a #ClutterEventSequence
*
* Start tracking informations related to a touch point (position,
* actor underneath the touch point).
*/
void
_clutter_input_device_add_event_sequence (ClutterInputDevice *device,
ClutterEvent *event)
{
ClutterEventSequence *sequence = clutter_event_get_event_sequence (event);
ClutterStage *stage;
if (sequence == NULL)
return;
stage = clutter_event_get_stage (event);
if (stage == NULL)
return;
_clutter_input_device_ensure_touch_info (device, sequence, stage);
}
/*< private > /*< private >
* clutter_input_device_remove_sequence: * clutter_input_device_remove_sequence:
* @device: a #ClutterInputDevice * @device: a #ClutterInputDevice
@@ -1314,25 +1683,25 @@ _clutter_input_device_remove_event_sequence (ClutterInputDevice *device,
ClutterEvent *event) ClutterEvent *event)
{ {
ClutterEventSequence *sequence = clutter_event_get_event_sequence (event); ClutterEventSequence *sequence = clutter_event_get_event_sequence (event);
ClutterActor *actor = ClutterTouchInfo *info =
g_hash_table_lookup (device->touch_sequence_actors, sequence); g_hash_table_lookup (device->touch_sequences_info, sequence);
if (actor != NULL) if (info == NULL)
return;
if (info->actor != NULL)
{ {
GList *sequences = GList *sequences =
g_hash_table_lookup (device->inv_touch_sequence_actors, actor); g_hash_table_lookup (device->inv_touch_sequence_actors, info->actor);
graphene_point_t point;
sequences = g_list_remove (sequences, sequence); sequences = g_list_remove (sequences, sequence);
g_hash_table_replace (device->inv_touch_sequence_actors, g_hash_table_replace (device->inv_touch_sequence_actors,
actor, sequences); info->actor, sequences);
clutter_event_get_coords (event, &point.x, &point.y); _clutter_input_device_set_actor (device, sequence, NULL, TRUE);
_clutter_input_device_set_actor (device, sequence, NULL, TRUE, point,
clutter_event_get_time (event));
} }
g_hash_table_remove (device->touch_sequence_actors, sequence); g_hash_table_remove (device->touch_sequences_info, sequence);
} }
/** /**
@@ -2022,6 +2391,43 @@ clutter_input_device_get_device_node (ClutterInputDevice *device)
return device->node_path; return device->node_path;
} }
ClutterInputDeviceMapping
clutter_input_device_get_mapping_mode (ClutterInputDevice *device)
{
ClutterInputDeviceType device_type;
g_return_val_if_fail (CLUTTER_IS_INPUT_DEVICE (device),
CLUTTER_INPUT_DEVICE_MAPPING_ABSOLUTE);
device_type = clutter_input_device_get_device_type (device);
g_return_val_if_fail (device_type == CLUTTER_TABLET_DEVICE ||
device_type == CLUTTER_PEN_DEVICE ||
device_type == CLUTTER_ERASER_DEVICE,
CLUTTER_INPUT_DEVICE_MAPPING_ABSOLUTE);
return device->mapping_mode;
}
void
clutter_input_device_set_mapping_mode (ClutterInputDevice *device,
ClutterInputDeviceMapping mapping)
{
ClutterInputDeviceType device_type;
g_return_if_fail (CLUTTER_IS_INPUT_DEVICE (device));
device_type = clutter_input_device_get_device_type (device);
g_return_if_fail (device_type == CLUTTER_TABLET_DEVICE ||
device_type == CLUTTER_PEN_DEVICE ||
device_type == CLUTTER_ERASER_DEVICE);
if (device->mapping_mode == mapping)
return;
device->mapping_mode = mapping;
g_object_notify (G_OBJECT (device), "mapping-mode");
}
gboolean gboolean
clutter_input_device_is_grouped (ClutterInputDevice *device, clutter_input_device_is_grouped (ClutterInputDevice *device,
ClutterInputDevice *other_device) ClutterInputDevice *other_device)

View File

@@ -95,11 +95,18 @@ CLUTTER_EXPORT
ClutterActor * clutter_input_device_get_actor (ClutterInputDevice *device, ClutterActor * clutter_input_device_get_actor (ClutterInputDevice *device,
ClutterEventSequence *sequence); ClutterEventSequence *sequence);
CLUTTER_EXPORT CLUTTER_EXPORT
ClutterStage * clutter_input_device_get_pointer_stage (ClutterInputDevice *device);
CLUTTER_EXPORT
const gchar * clutter_input_device_get_device_name (ClutterInputDevice *device); const gchar * clutter_input_device_get_device_name (ClutterInputDevice *device);
CLUTTER_EXPORT CLUTTER_EXPORT
ClutterInputMode clutter_input_device_get_device_mode (ClutterInputDevice *device); ClutterInputMode clutter_input_device_get_device_mode (ClutterInputDevice *device);
CLUTTER_EXPORT CLUTTER_EXPORT
gboolean clutter_input_device_get_has_cursor (ClutterInputDevice *device); gboolean clutter_input_device_get_has_cursor (ClutterInputDevice *device);
CLUTTER_EXPORT
void clutter_input_device_set_enabled (ClutterInputDevice *device,
gboolean enabled);
CLUTTER_EXPORT
gboolean clutter_input_device_get_enabled (ClutterInputDevice *device);
CLUTTER_EXPORT CLUTTER_EXPORT
guint clutter_input_device_get_n_axes (ClutterInputDevice *device); guint clutter_input_device_get_n_axes (ClutterInputDevice *device);
@@ -115,6 +122,11 @@ gboolean clutter_input_device_get_axis_value (ClutterInputDev
CLUTTER_EXPORT CLUTTER_EXPORT
guint clutter_input_device_get_n_keys (ClutterInputDevice *device); guint clutter_input_device_get_n_keys (ClutterInputDevice *device);
CLUTTER_EXPORT CLUTTER_EXPORT
void clutter_input_device_set_key (ClutterInputDevice *device,
guint index_,
guint keyval,
ClutterModifierType modifiers);
CLUTTER_EXPORT
gboolean clutter_input_device_get_key (ClutterInputDevice *device, gboolean clutter_input_device_get_key (ClutterInputDevice *device,
guint index_, guint index_,
guint *keyval, guint *keyval,
@@ -125,6 +137,11 @@ ClutterInputDevice * clutter_input_device_get_associated_device (ClutterInput
CLUTTER_EXPORT CLUTTER_EXPORT
GList * clutter_input_device_get_slave_devices (ClutterInputDevice *device); GList * clutter_input_device_get_slave_devices (ClutterInputDevice *device);
CLUTTER_EXPORT
void clutter_input_device_update_from_event (ClutterInputDevice *device,
ClutterEvent *event,
gboolean update_stage);
CLUTTER_EXPORT CLUTTER_EXPORT
void clutter_input_device_grab (ClutterInputDevice *device, void clutter_input_device_grab (ClutterInputDevice *device,
ClutterActor *actor); ClutterActor *actor);
@@ -144,6 +161,11 @@ CLUTTER_EXPORT
ClutterActor * clutter_input_device_sequence_get_grabbed_actor (ClutterInputDevice *device, ClutterActor * clutter_input_device_sequence_get_grabbed_actor (ClutterInputDevice *device,
ClutterEventSequence *sequence); ClutterEventSequence *sequence);
CLUTTER_EXPORT
gboolean clutter_input_device_keycode_to_evdev (ClutterInputDevice *device,
guint hardware_keycode,
guint *evdev_keycode);
CLUTTER_EXPORT CLUTTER_EXPORT
const gchar * clutter_input_device_get_vendor_id (ClutterInputDevice *device); const gchar * clutter_input_device_get_vendor_id (ClutterInputDevice *device);
CLUTTER_EXPORT CLUTTER_EXPORT
@@ -171,6 +193,12 @@ gint clutter_input_device_get_mode_switch_button_group (Clutt
CLUTTER_EXPORT CLUTTER_EXPORT
const gchar * clutter_input_device_get_device_node (ClutterInputDevice *device); const gchar * clutter_input_device_get_device_node (ClutterInputDevice *device);
CLUTTER_EXPORT
ClutterInputDeviceMapping clutter_input_device_get_mapping_mode (ClutterInputDevice *device);
CLUTTER_EXPORT
void clutter_input_device_set_mapping_mode (ClutterInputDevice *device,
ClutterInputDeviceMapping mapping);
CLUTTER_EXPORT CLUTTER_EXPORT
gboolean clutter_input_device_is_grouped (ClutterInputDevice *device, gboolean clutter_input_device_is_grouped (ClutterInputDevice *device,
ClutterInputDevice *other_device); ClutterInputDevice *other_device);

View File

@@ -454,7 +454,6 @@ clutter_input_method_forward_key (ClutterInputMethod *im,
ClutterInputMethodPrivate *priv; ClutterInputMethodPrivate *priv;
ClutterInputDevice *keyboard; ClutterInputDevice *keyboard;
ClutterSeat *seat; ClutterSeat *seat;
ClutterStageManager *stage_manager;
ClutterStage *stage; ClutterStage *stage;
ClutterEvent *event; ClutterEvent *event;
@@ -465,9 +464,10 @@ clutter_input_method_forward_key (ClutterInputMethod *im,
return; return;
seat = clutter_backend_get_default_seat (clutter_get_default_backend ()); seat = clutter_backend_get_default_seat (clutter_get_default_backend ());
stage_manager = clutter_stage_manager_get_default ();
stage = clutter_stage_manager_get_default_stage (stage_manager);
keyboard = clutter_seat_get_keyboard (seat); keyboard = clutter_seat_get_keyboard (seat);
stage = _clutter_input_device_get_stage (keyboard);
if (stage == NULL)
return;
event = clutter_event_new (press ? CLUTTER_KEY_PRESS : CLUTTER_KEY_RELEASE); event = clutter_event_new (press ? CLUTTER_KEY_PRESS : CLUTTER_KEY_RELEASE);
event->key.time = time_; event->key.time = time_;

View File

@@ -67,7 +67,13 @@
#include "clutter-settings-private.h" #include "clutter-settings-private.h"
#include "clutter-stage-manager.h" #include "clutter-stage-manager.h"
#include "clutter-stage-private.h" #include "clutter-stage-private.h"
#include "clutter-backend-private.h"
#ifdef CLUTTER_WINDOWING_X11
#include "x11/clutter-backend-x11.h"
#endif
#ifdef CLUTTER_WINDOWING_EGL
#include "egl/clutter-backend-eglnative.h"
#endif
#include <cogl/cogl.h> #include <cogl/cogl.h>
#include <cogl-pango/cogl-pango.h> #include <cogl-pango/cogl-pango.h>
@@ -82,6 +88,7 @@ static gboolean clutter_is_initialized = FALSE;
static gboolean clutter_show_fps = FALSE; static gboolean clutter_show_fps = FALSE;
static gboolean clutter_fatal_warnings = FALSE; static gboolean clutter_fatal_warnings = FALSE;
static gboolean clutter_disable_mipmap_text = FALSE; static gboolean clutter_disable_mipmap_text = FALSE;
static gboolean clutter_use_fuzzy_picking = FALSE;
static gboolean clutter_enable_accessibility = TRUE; static gboolean clutter_enable_accessibility = TRUE;
static gboolean clutter_sync_to_vblank = TRUE; static gboolean clutter_sync_to_vblank = TRUE;
@@ -89,6 +96,9 @@ static guint clutter_default_fps = 60;
static ClutterTextDirection clutter_text_direction = CLUTTER_TEXT_DIRECTION_LTR; static ClutterTextDirection clutter_text_direction = CLUTTER_TEXT_DIRECTION_LTR;
static guint clutter_main_loop_level = 0;
static GSList *main_loops = NULL;
/* debug flags */ /* debug flags */
guint clutter_debug_flags = 0; guint clutter_debug_flags = 0;
guint clutter_paint_debug_flags = 0; guint clutter_paint_debug_flags = 0;
@@ -175,6 +185,16 @@ clutter_config_read_from_key_file (GKeyFile *keyfile)
else else
clutter_disable_mipmap_text = bool_value; clutter_disable_mipmap_text = bool_value;
bool_value =
g_key_file_get_boolean (keyfile, ENVIRONMENT_GROUP,
"UseFuzzyPicking",
&key_error);
if (key_error != NULL)
g_clear_error (&key_error);
else
clutter_use_fuzzy_picking = bool_value;
bool_value = bool_value =
g_key_file_get_boolean (keyfile, ENVIRONMENT_GROUP, g_key_file_get_boolean (keyfile, ENVIRONMENT_GROUP,
"EnableAccessibility", "EnableAccessibility",
@@ -429,6 +449,76 @@ clutter_get_text_direction (void)
return dir; return dir;
} }
/**
* clutter_main_quit:
*
* Terminates the Clutter mainloop.
*/
void
clutter_main_quit (void)
{
if (main_loops == NULL)
{
g_critical ("Calling clutter_main_quit() without calling clutter_main() "
"is not allowed. If you are using another main loop, use the "
"appropriate API to terminate it.");
return;
}
CLUTTER_NOTE (MISC, "Terminating main loop level %d", clutter_main_loop_level);
g_main_loop_quit (main_loops->data);
}
/**
* clutter_main_level:
*
* Retrieves the depth of the Clutter mainloop.
*
* Return value: The level of the mainloop.
*/
gint
clutter_main_level (void)
{
return clutter_main_loop_level;
}
/**
* clutter_main:
*
* Starts the Clutter mainloop.
*/
void
clutter_main (void)
{
GMainLoop *loop;
if (!_clutter_context_is_initialized ())
{
g_warning ("Called clutter_main() but Clutter wasn't initialised. "
"You must call clutter_init() first.");
return;
}
clutter_main_loop_level++;
CLUTTER_NOTE (MISC, "Entering main loop level %d", clutter_main_loop_level);
loop = g_main_loop_new (NULL, TRUE);
main_loops = g_slist_prepend (main_loops, loop);
if (g_main_loop_is_running (main_loops->data))
g_main_loop_run (loop);
main_loops = g_slist_remove (main_loops, loop);
g_main_loop_unref (loop);
CLUTTER_NOTE (MISC, "Leaving main loop level %d", clutter_main_loop_level);
clutter_main_loop_level--;
}
gboolean gboolean
_clutter_threads_dispatch (gpointer data) _clutter_threads_dispatch (gpointer data)
{ {
@@ -697,8 +787,6 @@ _clutter_context_get_default (void)
ctx->settings = clutter_settings_get_default (); ctx->settings = clutter_settings_get_default ();
_clutter_settings_set_backend (ctx->settings, ctx->backend); _clutter_settings_set_backend (ctx->settings, ctx->backend);
ctx->events_queue = g_async_queue_new ();
ctx->last_repaint_id = 1; ctx->last_repaint_id = 1;
} }
@@ -835,6 +923,9 @@ static GOptionEntry clutter_args[] = {
{ "clutter-disable-mipmapped-text", 0, 0, G_OPTION_ARG_NONE, { "clutter-disable-mipmapped-text", 0, 0, G_OPTION_ARG_NONE,
&clutter_disable_mipmap_text, &clutter_disable_mipmap_text,
N_("Disable mipmapping on text"), NULL }, N_("Disable mipmapping on text"), NULL },
{ "clutter-use-fuzzy-picking", 0, 0, G_OPTION_ARG_NONE,
&clutter_use_fuzzy_picking,
N_("Use 'fuzzy' picking"), NULL },
#ifdef CLUTTER_ENABLE_DEBUG #ifdef CLUTTER_ENABLE_DEBUG
{ "clutter-debug", 0, 0, G_OPTION_ARG_CALLBACK, clutter_arg_debug_cb, { "clutter-debug", 0, 0, G_OPTION_ARG_CALLBACK, clutter_arg_debug_cb,
N_("Clutter debugging flags to set"), "FLAGS" }, N_("Clutter debugging flags to set"), "FLAGS" },
@@ -916,6 +1007,10 @@ pre_parse_hook (GOptionContext *context,
if (env_string) if (env_string)
clutter_disable_mipmap_text = TRUE; clutter_disable_mipmap_text = TRUE;
env_string = g_getenv ("CLUTTER_FUZZY_PICK");
if (env_string)
clutter_use_fuzzy_picking = TRUE;
return _clutter_backend_pre_parse (backend, error); return _clutter_backend_pre_parse (backend, error);
} }
@@ -1574,11 +1669,6 @@ _clutter_process_event_details (ClutterActor *stage,
ClutterEvent *event) ClutterEvent *event)
{ {
ClutterInputDevice *device = clutter_event_get_device (event); ClutterInputDevice *device = clutter_event_get_device (event);
ClutterMainContext *clutter_context;
ClutterBackend *backend;
clutter_context = _clutter_context_get_default ();
backend = clutter_context->backend;
switch (event->type) switch (event->type)
{ {
@@ -1623,9 +1713,7 @@ _clutter_process_event_details (ClutterActor *stage,
emit_crossing_event (event, device); emit_crossing_event (event, device);
actor = clutter_input_device_update (device, NULL, actor = clutter_input_device_update (device, NULL, FALSE);
CLUTTER_STAGE (stage), FALSE,
event);
if (actor != stage) if (actor != stage)
{ {
ClutterEvent *crossing; ClutterEvent *crossing;
@@ -1666,6 +1754,7 @@ _clutter_process_event_details (ClutterActor *stage,
break; break;
case CLUTTER_DESTROY_NOTIFY: case CLUTTER_DESTROY_NOTIFY:
case CLUTTER_DELETE:
event->any.source = stage; event->any.source = stage;
if (_clutter_event_process_filters (event)) if (_clutter_event_process_filters (event))
@@ -1676,7 +1765,8 @@ _clutter_process_event_details (ClutterActor *stage,
break; break;
case CLUTTER_MOTION: case CLUTTER_MOTION:
if (clutter_backend_is_display_server (backend) && #ifdef CLUTTER_WINDOWING_X11
if (!clutter_check_windowing_backend (CLUTTER_WINDOWING_X11) &&
!(event->any.flags & CLUTTER_EVENT_FLAG_SYNTHETIC)) !(event->any.flags & CLUTTER_EVENT_FLAG_SYNTHETIC))
{ {
if (_clutter_is_input_pointer_a11y_enabled (device)) if (_clutter_is_input_pointer_a11y_enabled (device))
@@ -1687,6 +1777,7 @@ _clutter_process_event_details (ClutterActor *stage,
_clutter_input_pointer_a11y_on_motion_event (device, x, y); _clutter_input_pointer_a11y_on_motion_event (device, x, y);
} }
} }
#endif /* CLUTTER_WINDOWING_X11 */
/* only the stage gets motion events if they are enabled */ /* only the stage gets motion events if they are enabled */
if (!clutter_stage_get_motion_events_enabled (CLUTTER_STAGE (stage)) && if (!clutter_stage_get_motion_events_enabled (CLUTTER_STAGE (stage)) &&
event->any.source == NULL) event->any.source == NULL)
@@ -1717,7 +1808,8 @@ _clutter_process_event_details (ClutterActor *stage,
G_GNUC_FALLTHROUGH; G_GNUC_FALLTHROUGH;
case CLUTTER_BUTTON_PRESS: case CLUTTER_BUTTON_PRESS:
case CLUTTER_BUTTON_RELEASE: case CLUTTER_BUTTON_RELEASE:
if (clutter_backend_is_display_server (backend)) #ifdef CLUTTER_WINDOWING_X11
if (!clutter_check_windowing_backend (CLUTTER_WINDOWING_X11))
{ {
if (_clutter_is_input_pointer_a11y_enabled (device) && (event->type != CLUTTER_MOTION)) if (_clutter_is_input_pointer_a11y_enabled (device) && (event->type != CLUTTER_MOTION))
{ {
@@ -1726,6 +1818,7 @@ _clutter_process_event_details (ClutterActor *stage,
event->type == CLUTTER_BUTTON_PRESS); event->type == CLUTTER_BUTTON_PRESS);
} }
} }
#endif /* CLUTTER_WINDOWING_X11 */
case CLUTTER_SCROLL: case CLUTTER_SCROLL:
case CLUTTER_TOUCHPAD_PINCH: case CLUTTER_TOUCHPAD_PINCH:
case CLUTTER_TOUCHPAD_SWIPE: case CLUTTER_TOUCHPAD_SWIPE:
@@ -1774,9 +1867,21 @@ _clutter_process_event_details (ClutterActor *stage,
break; break;
} }
actor = clutter_input_device_update (device, NULL, /* if the backend provides a device then we should
CLUTTER_STAGE (stage), * already have everything we need to update it and
TRUE, event); * get the actor underneath
*/
if (device != NULL)
actor = clutter_input_device_update (device, NULL, TRUE);
else
{
CLUTTER_NOTE (EVENT, "No device found: picking");
actor = _clutter_stage_do_pick (CLUTTER_STAGE (stage),
x, y,
CLUTTER_PICK_REACTIVE);
}
if (actor == NULL) if (actor == NULL)
break; break;
@@ -1852,6 +1957,9 @@ _clutter_process_event_details (ClutterActor *stage,
sequence = sequence =
clutter_event_get_event_sequence (event); clutter_event_get_event_sequence (event);
if (event->type == CLUTTER_TOUCH_BEGIN)
_clutter_input_device_add_event_sequence (device, event);
clutter_event_get_coords (event, &x, &y); clutter_event_get_coords (event, &x, &y);
/* Only do a pick to find the source if source is not already set /* Only do a pick to find the source if source is not already set
@@ -1881,9 +1989,17 @@ _clutter_process_event_details (ClutterActor *stage,
break; break;
} }
actor = clutter_input_device_update (device, sequence, if (device != NULL)
CLUTTER_STAGE (stage), actor = clutter_input_device_update (device, sequence, TRUE);
TRUE, event); else
{
CLUTTER_NOTE (EVENT, "No device found: picking");
actor = _clutter_stage_do_pick (CLUTTER_STAGE (stage),
x, y,
CLUTTER_PICK_REACTIVE);
}
if (actor == NULL) if (actor == NULL)
break; break;
@@ -1935,11 +2051,6 @@ _clutter_process_event_details (ClutterActor *stage,
case CLUTTER_CLIENT_MESSAGE: case CLUTTER_CLIENT_MESSAGE:
break; break;
case CLUTTER_DEVICE_ADDED:
case CLUTTER_DEVICE_REMOVED:
_clutter_event_process_filters (event);
break;
case CLUTTER_EVENT_LAST: case CLUTTER_EVENT_LAST:
break; break;
} }
@@ -2288,16 +2399,39 @@ void
_clutter_clear_events_queue (void) _clutter_clear_events_queue (void)
{ {
ClutterMainContext *context = _clutter_context_get_default (); ClutterMainContext *context = _clutter_context_get_default ();
ClutterEvent *event;
/* Lock the queue for as long as it lives */ if (context->events_queue != NULL)
g_async_queue_lock (context->events_queue); {
g_queue_foreach (context->events_queue,
(GFunc) clutter_event_free,
NULL);
g_queue_free (context->events_queue);
context->events_queue = NULL;
}
}
while ((event = g_async_queue_try_pop_unlocked (context->events_queue))) void
clutter_event_free (event); _clutter_clear_events_queue_for_stage (ClutterStage *stage)
{
ClutterMainContext *context = _clutter_context_get_default ();
GList *l, *next;
g_async_queue_unref (context->events_queue); if (context->events_queue == NULL)
context->events_queue = NULL; return;
/* Remove any pending events for this stage from the event queue */
for (l = context->events_queue->head; l; l = next)
{
ClutterEvent *event = l->data;
next = l->next;
if (event->any.stage == stage)
{
g_queue_delete_link (context->events_queue, l);
clutter_event_free (event);
}
}
} }
ClutterPickMode ClutterPickMode
@@ -2308,6 +2442,58 @@ _clutter_context_get_pick_mode (void)
return context->pick_mode; return context->pick_mode;
} }
/**
* clutter_check_windowing_backend:
* @backend_type: the name of the backend to check
*
* Checks the run-time name of the Clutter windowing system backend, using
* the symbolic macros like %CLUTTER_WINDOWING_X11.
*
* This function should be used in conjuction with the compile-time macros
* inside applications and libraries that are using the platform-specific
* windowing system API, to ensure that they are running on the correct
* windowing system; for instance:
*
* |[
* #ifdef CLUTTER_WINDOWING_X11
* if (clutter_check_windowing_backend (CLUTTER_WINDOWING_X11))
* {
* // it is safe to use the clutter_x11_* API
* }
* else
* #endif
* g_error ("Unknown Clutter backend.");
* ]|
*
* Return value: %TRUE if the current Clutter windowing system backend is
* the one checked, and %FALSE otherwise
*
* Since: 1.10
*/
gboolean
clutter_check_windowing_backend (const char *backend_type)
{
ClutterMainContext *context = _clutter_context_get_default ();
g_return_val_if_fail (backend_type != NULL, FALSE);
backend_type = g_intern_string (backend_type);
#ifdef CLUTTER_WINDOWING_EGL
if (backend_type == I_(CLUTTER_WINDOWING_EGL) &&
CLUTTER_IS_BACKEND_EGL_NATIVE (context->backend))
return TRUE;
else
#endif
#ifdef CLUTTER_WINDOWING_X11
if (backend_type == I_(CLUTTER_WINDOWING_X11) &&
CLUTTER_IS_BACKEND_X11 (context->backend))
return TRUE;
else
#endif
return FALSE;
}
/** /**
* clutter_add_debug_flags: (skip) * clutter_add_debug_flags: (skip)
* *

View File

@@ -136,6 +136,14 @@ GOptionGroup * clutter_get_option_group (void);
CLUTTER_EXPORT CLUTTER_EXPORT
GOptionGroup * clutter_get_option_group_without_init (void); GOptionGroup * clutter_get_option_group_without_init (void);
/* Mainloop */
CLUTTER_EXPORT
void clutter_main (void);
CLUTTER_EXPORT
void clutter_main_quit (void);
CLUTTER_EXPORT
gint clutter_main_level (void);
CLUTTER_EXPORT CLUTTER_EXPORT
void clutter_do_event (ClutterEvent *event); void clutter_do_event (ClutterEvent *event);
@@ -186,6 +194,9 @@ ClutterTextDirection clutter_get_default_text_direction (void);
CLUTTER_EXPORT CLUTTER_EXPORT
guint clutter_get_default_frame_rate (void); guint clutter_get_default_frame_rate (void);
CLUTTER_EXPORT
gboolean clutter_check_windowing_backend (const char *backend_type);
CLUTTER_EXPORT CLUTTER_EXPORT
void clutter_add_debug_flags (ClutterDebugFlag debug_flags, void clutter_add_debug_flags (ClutterDebugFlag debug_flags,
ClutterDrawDebugFlag draw_flags, ClutterDrawDebugFlag draw_flags,

View File

@@ -55,6 +55,23 @@ void clutter_stage_capture_into (ClutterStage *stage,
cairo_rectangle_int_t *rect, cairo_rectangle_int_t *rect,
uint8_t *data); 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 CLUTTER_EXPORT
void clutter_stage_clear_stage_views (ClutterStage *stage); void clutter_stage_clear_stage_views (ClutterStage *stage);
@@ -68,13 +85,6 @@ gboolean clutter_actor_has_damage (ClutterActor *actor);
CLUTTER_EXPORT CLUTTER_EXPORT
gboolean clutter_actor_has_transitions (ClutterActor *actor); gboolean clutter_actor_has_transitions (ClutterActor *actor);
CLUTTER_EXPORT
ClutterFrameClock * clutter_actor_pick_frame_clock (ClutterActor *self,
ClutterActor **out_actor);
CLUTTER_EXPORT
gboolean clutter_seat_handle_event_post (ClutterSeat *seat,
const ClutterEvent *event);
#undef __CLUTTER_H_INSIDE__ #undef __CLUTTER_H_INSIDE__
#endif /* __CLUTTER_MUTTER_H__ */ #endif /* __CLUTTER_MUTTER_H__ */

View File

@@ -100,8 +100,6 @@ struct _ClutterOffscreenEffectPrivate
int target_height; int target_height;
gint old_opacity_override; gint old_opacity_override;
gulong purge_handler_id;
}; };
G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (ClutterOffscreenEffect, G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (ClutterOffscreenEffect,
@@ -160,12 +158,6 @@ ensure_pipeline_filter_for_scale (ClutterOffscreenEffect *self,
filter, filter); filter, filter);
} }
static void
video_memory_purged (ClutterOffscreenEffect *self)
{
g_clear_pointer (&self->priv->offscreen, cogl_object_unref);
}
static gboolean static gboolean
update_fbo (ClutterEffect *effect, update_fbo (ClutterEffect *effect,
int target_width, int target_width,
@@ -174,26 +166,8 @@ update_fbo (ClutterEffect *effect,
{ {
ClutterOffscreenEffect *self = CLUTTER_OFFSCREEN_EFFECT (effect); ClutterOffscreenEffect *self = CLUTTER_OFFSCREEN_EFFECT (effect);
ClutterOffscreenEffectPrivate *priv = self->priv; ClutterOffscreenEffectPrivate *priv = self->priv;
ClutterActor *stage_actor;
stage_actor = clutter_actor_get_stage (priv->actor);
if (stage_actor != priv->stage)
{
g_clear_signal_handler (&priv->purge_handler_id, priv->stage);
priv->stage = stage_actor;
if (priv->stage)
{
priv->purge_handler_id =
g_signal_connect_object (priv->stage,
"gl-video-memory-purged",
G_CALLBACK (video_memory_purged),
self,
G_CONNECT_SWAPPED);
}
}
priv->stage = clutter_actor_get_stage (priv->actor);
if (priv->stage == NULL) if (priv->stage == NULL)
{ {
CLUTTER_NOTE (MISC, "The actor '%s' is not part of a stage", CLUTTER_NOTE (MISC, "The actor '%s' is not part of a stage",

View File

@@ -33,7 +33,6 @@ typedef enum _ClutterPaintFlag
{ {
CLUTTER_PAINT_FLAG_NONE = 0, CLUTTER_PAINT_FLAG_NONE = 0,
CLUTTER_PAINT_FLAG_NO_CURSORS = 1 << 0, CLUTTER_PAINT_FLAG_NO_CURSORS = 1 << 0,
CLUTTER_PAINT_FLAG_FORCE_CURSORS = 1 << 1,
} ClutterPaintFlag; } ClutterPaintFlag;
#define CLUTTER_TYPE_PAINT_CONTEXT (clutter_paint_context_get_type ()) #define CLUTTER_TYPE_PAINT_CONTEXT (clutter_paint_context_get_type ())

View File

@@ -122,7 +122,7 @@ struct _ClutterMainContext
ClutterStageManager *stage_manager; ClutterStageManager *stage_manager;
/* the main event queue */ /* the main event queue */
GAsyncQueue *events_queue; GQueue *events_queue;
/* the event filters added via clutter_event_add_filter. these are /* the event filters added via clutter_event_add_filter. these are
* ordered from least recently added to most recently added */ * ordered from least recently added to most recently added */
@@ -313,12 +313,6 @@ us (uint64_t us)
return us; return us;
} }
static inline uint32_t
ms (uint32_t ms)
{
return ms;
}
static inline uint64_t static inline uint64_t
ms2us (uint64_t ms) ms2us (uint64_t ms)
{ {

View File

@@ -27,7 +27,6 @@
#include "clutter-input-device-tool.h" #include "clutter-input-device-tool.h"
#include "clutter-input-pointer-a11y-private.h" #include "clutter-input-pointer-a11y-private.h"
#include "clutter-marshal.h" #include "clutter-marshal.h"
#include "clutter-mutter.h"
#include "clutter-private.h" #include "clutter-private.h"
#include "clutter-seat.h" #include "clutter-seat.h"
#include "clutter-virtual-input-device.h" #include "clutter-virtual-input-device.h"
@@ -66,6 +65,9 @@ struct _ClutterSeatPrivate
unsigned int inhibit_unfocus_count; unsigned int inhibit_unfocus_count;
/* Keyboard a11y */
ClutterKbdA11ySettings kbd_a11y_settings;
/* Pointer a11y */ /* Pointer a11y */
ClutterPointerA11ySettings pointer_a11y_settings; ClutterPointerA11ySettings pointer_a11y_settings;
}; };
@@ -402,6 +404,43 @@ clutter_seat_get_keymap (ClutterSeat *seat)
return CLUTTER_SEAT_GET_CLASS (seat)->get_keymap (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 void
clutter_seat_ensure_a11y_state (ClutterSeat *seat) clutter_seat_ensure_a11y_state (ClutterSeat *seat)
{ {
@@ -635,40 +674,6 @@ clutter_seat_compress_motion (ClutterSeat *seat,
seat_class->compress_motion (seat, event, to_discard); seat_class->compress_motion (seat, event, to_discard);
} }
gboolean
clutter_seat_handle_event_post (ClutterSeat *seat,
const ClutterEvent *event)
{
ClutterSeatClass *seat_class;
ClutterInputDevice *device;
g_return_val_if_fail (CLUTTER_IS_SEAT (seat), FALSE);
g_return_val_if_fail (event, FALSE);
seat_class = CLUTTER_SEAT_GET_CLASS (seat);
if (seat_class->handle_event_post)
seat_class->handle_event_post (seat, event);
device = clutter_event_get_source_device (event);
g_assert_true (CLUTTER_IS_INPUT_DEVICE (device));
switch (event->type)
{
case CLUTTER_DEVICE_ADDED:
g_signal_emit (seat, signals[DEVICE_ADDED], 0, device);
break;
case CLUTTER_DEVICE_REMOVED:
g_signal_emit (seat, signals[DEVICE_REMOVED], 0, device);
g_object_run_dispose (G_OBJECT (device));
break;
default:
break;
}
return TRUE;
}
void void
clutter_seat_warp_pointer (ClutterSeat *seat, clutter_seat_warp_pointer (ClutterSeat *seat,
int x, int x,
@@ -704,20 +709,3 @@ clutter_seat_get_touch_mode (ClutterSeat *seat)
return touch_mode; return touch_mode;
} }
gboolean
clutter_seat_query_state (ClutterSeat *seat,
ClutterInputDevice *device,
ClutterEventSequence *sequence,
graphene_point_t *coords,
ClutterModifierType *modifiers)
{
g_return_val_if_fail (CLUTTER_IS_SEAT (seat), FALSE);
g_return_val_if_fail (CLUTTER_IS_INPUT_DEVICE (device), FALSE);
return CLUTTER_SEAT_GET_CLASS (seat)->query_state (seat,
device,
sequence,
coords,
modifiers);
}

View File

@@ -37,6 +37,24 @@ CLUTTER_EXPORT
G_DECLARE_DERIVABLE_TYPE (ClutterSeat, clutter_seat, G_DECLARE_DERIVABLE_TYPE (ClutterSeat, clutter_seat,
CLUTTER, SEAT, GObject) 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: * ClutterPointerA11ySettings:
* *
@@ -88,19 +106,10 @@ struct _ClutterSeatClass
ClutterEvent *event, ClutterEvent *event,
const ClutterEvent *to_discard); const ClutterEvent *to_discard);
gboolean (* handle_event_post) (ClutterSeat *seat,
const ClutterEvent *event);
void (* warp_pointer) (ClutterSeat *seat, void (* warp_pointer) (ClutterSeat *seat,
int x, int x,
int y); int y);
gboolean (* query_state) (ClutterSeat *seat,
ClutterInputDevice *device,
ClutterEventSequence *sequence,
graphene_point_t *coords,
ClutterModifierType *modifiers);
/* Event platform data */ /* Event platform data */
void (* copy_event_data) (ClutterSeat *seat, void (* copy_event_data) (ClutterSeat *seat,
const ClutterEvent *src, const ClutterEvent *src,
@@ -108,6 +117,10 @@ struct _ClutterSeatClass
void (* free_event_data) (ClutterSeat *seat, void (* free_event_data) (ClutterSeat *seat,
ClutterEvent *event); ClutterEvent *event);
/* Keyboard accessibility */
void (* apply_kbd_a11y_settings) (ClutterSeat *seat,
ClutterKbdA11ySettings *settings);
/* Virtual devices */ /* Virtual devices */
ClutterVirtualInputDevice * (* create_virtual_device) (ClutterSeat *seat, ClutterVirtualInputDevice * (* create_virtual_device) (ClutterSeat *seat,
ClutterInputDeviceType device_type); ClutterInputDeviceType device_type);
@@ -127,6 +140,12 @@ void clutter_seat_bell_notify (ClutterSeat *seat);
CLUTTER_EXPORT CLUTTER_EXPORT
ClutterKeymap * clutter_seat_get_keymap (ClutterSeat *seat); 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 CLUTTER_EXPORT
void clutter_seat_ensure_a11y_state (ClutterSeat *seat); void clutter_seat_ensure_a11y_state (ClutterSeat *seat);
@@ -169,11 +188,4 @@ void clutter_seat_warp_pointer (ClutterSeat *seat,
CLUTTER_EXPORT CLUTTER_EXPORT
gboolean clutter_seat_get_touch_mode (ClutterSeat *seat); gboolean clutter_seat_get_touch_mode (ClutterSeat *seat);
CLUTTER_EXPORT
gboolean clutter_seat_query_state (ClutterSeat *seat,
ClutterInputDevice *device,
ClutterEventSequence *sequence,
graphene_point_t *coords,
ClutterModifierType *modifiers);
#endif /* CLUTTER_SEAT_H */ #endif /* CLUTTER_SEAT_H */

View File

@@ -40,18 +40,6 @@
#define CLUTTER_IS_SETTINGS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), CLUTTER_TYPE_SETTINGS)) #define CLUTTER_IS_SETTINGS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), CLUTTER_TYPE_SETTINGS))
#define CLUTTER_SETTINGS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), CLUTTER_TYPE_SETTINGS, ClutterSettingsClass)) #define CLUTTER_SETTINGS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), CLUTTER_TYPE_SETTINGS, ClutterSettingsClass))
typedef struct
{
cairo_antialias_t cairo_antialias;
gint clutter_font_antialias;
cairo_hint_style_t cairo_hint_style;
const char *clutter_font_hint_style;
cairo_subpixel_order_t cairo_subpixel_order;
const char *clutter_font_subpixel_order;
} FontSettings;
/** /**
* ClutterSettings: * ClutterSettings:
* *
@@ -65,7 +53,6 @@ struct _ClutterSettings
GObject parent_instance; GObject parent_instance;
ClutterBackend *backend; ClutterBackend *backend;
GSettings *xsettings;
gint double_click_time; gint double_click_time;
gint double_click_distance; gint double_click_distance;
@@ -280,159 +267,6 @@ settings_update_fontmap (ClutterSettings *self,
#endif /* HAVE_PANGO_FT2 */ #endif /* HAVE_PANGO_FT2 */
} }
static void
get_font_gsettings (GSettings *xsettings,
FontSettings *output)
{
/* org.gnome.settings-daemon.GsdFontAntialiasingMode */
static const struct
{
cairo_antialias_t cairo_antialias;
gint clutter_font_antialias;
}
antialiasings[] =
{
/* none=0 */ {CAIRO_ANTIALIAS_NONE, 0},
/* grayscale=1 */ {CAIRO_ANTIALIAS_GRAY, 1},
/* rgba=2 */ {CAIRO_ANTIALIAS_SUBPIXEL, 1},
};
/* org.gnome.settings-daemon.GsdFontHinting */
static const struct
{
cairo_hint_style_t cairo_hint_style;
const char *clutter_font_hint_style;
}
hintings[] =
{
/* none=0 */ {CAIRO_HINT_STYLE_NONE, "hintnone"},
/* slight=1 */ {CAIRO_HINT_STYLE_SLIGHT, "hintslight"},
/* medium=2 */ {CAIRO_HINT_STYLE_MEDIUM, "hintmedium"},
/* full=3 */ {CAIRO_HINT_STYLE_FULL, "hintfull"},
};
/* org.gnome.settings-daemon.GsdFontRgbaOrder */
static const struct
{
cairo_subpixel_order_t cairo_subpixel_order;
const char *clutter_font_subpixel_order;
}
rgba_orders[] =
{
/* rgba=0 */ {CAIRO_SUBPIXEL_ORDER_RGB, "rgb"}, /* XXX what is 'rgba'? */
/* rgb=1 */ {CAIRO_SUBPIXEL_ORDER_RGB, "rgb"},
/* bgr=2 */ {CAIRO_SUBPIXEL_ORDER_BGR, "bgr"},
/* vrgb=3 */ {CAIRO_SUBPIXEL_ORDER_VRGB, "vrgb"},
/* vbgr=4 */ {CAIRO_SUBPIXEL_ORDER_VBGR, "vbgr"},
};
guint i;
i = g_settings_get_enum (xsettings, "hinting");
if (i < G_N_ELEMENTS (hintings))
{
output->cairo_hint_style = hintings[i].cairo_hint_style;
output->clutter_font_hint_style = hintings[i].clutter_font_hint_style;
}
else
{
output->cairo_hint_style = CAIRO_HINT_STYLE_DEFAULT;
output->clutter_font_hint_style = NULL;
}
i = g_settings_get_enum (xsettings, "antialiasing");
if (i < G_N_ELEMENTS (antialiasings))
{
output->cairo_antialias = antialiasings[i].cairo_antialias;
output->clutter_font_antialias = antialiasings[i].clutter_font_antialias;
}
else
{
output->cairo_antialias = CAIRO_ANTIALIAS_DEFAULT;
output->clutter_font_antialias = -1;
}
i = g_settings_get_enum (xsettings, "rgba-order");
if (i < G_N_ELEMENTS (rgba_orders))
{
output->cairo_subpixel_order = rgba_orders[i].cairo_subpixel_order;
output->clutter_font_subpixel_order = rgba_orders[i].clutter_font_subpixel_order;
}
else
{
output->cairo_subpixel_order = CAIRO_SUBPIXEL_ORDER_DEFAULT;
output->clutter_font_subpixel_order = NULL;
}
if (output->cairo_antialias == CAIRO_ANTIALIAS_GRAY)
output->clutter_font_subpixel_order = "none";
}
static void
init_font_options (ClutterSettings *self)
{
GSettings *xsettings = self->xsettings;
cairo_font_options_t *options = cairo_font_options_create ();
FontSettings fs;
get_font_gsettings (xsettings, &fs);
cairo_font_options_set_hint_style (options, fs.cairo_hint_style);
cairo_font_options_set_antialias (options, fs.cairo_antialias);
cairo_font_options_set_subpixel_order (options, fs.cairo_subpixel_order);
clutter_backend_set_font_options (self->backend, options);
cairo_font_options_destroy (options);
}
static gboolean
on_xsettings_change_event (GSettings *xsettings,
gpointer keys,
gint n_keys,
gpointer user_data)
{
ClutterSettings *self = CLUTTER_SETTINGS (user_data);
FontSettings fs;
gint hinting;
get_font_gsettings (xsettings, &fs);
hinting = fs.cairo_hint_style == CAIRO_HINT_STYLE_NONE ? 0 : 1;
g_object_set (self,
"font-hinting", hinting,
"font-hint-style", fs.clutter_font_hint_style,
"font-antialias", fs.clutter_font_antialias,
"font-subpixel-order", fs.clutter_font_subpixel_order,
NULL);
return FALSE;
}
static void
load_initial_settings (ClutterSettings *self)
{
static const gchar xsettings_path[] =
"org.gnome.settings-daemon.plugins.xsettings";
GSettingsSchemaSource *source = g_settings_schema_source_get_default ();
GSettingsSchema *schema;
schema = g_settings_schema_source_lookup (source, xsettings_path, TRUE);
if (!schema)
{
g_warning ("Failed to find schema: %s", xsettings_path);
}
else
{
self->xsettings = g_settings_new_full (schema, NULL, NULL);
if (self->xsettings)
{
init_font_options (self);
g_signal_connect (self->xsettings, "change-event",
G_CALLBACK (on_xsettings_change_event),
self);
}
}
}
static void static void
clutter_settings_finalize (GObject *gobject) clutter_settings_finalize (GObject *gobject)
{ {
@@ -442,8 +276,6 @@ clutter_settings_finalize (GObject *gobject)
g_free (self->xft_hint_style); g_free (self->xft_hint_style);
g_free (self->xft_rgba); g_free (self->xft_rgba);
g_clear_object (&self->xsettings);
G_OBJECT_CLASS (clutter_settings_parent_class)->finalize (gobject); G_OBJECT_CLASS (clutter_settings_parent_class)->finalize (gobject);
} }
@@ -908,8 +740,6 @@ _clutter_settings_set_backend (ClutterSettings *settings,
g_assert (CLUTTER_IS_BACKEND (backend)); g_assert (CLUTTER_IS_BACKEND (backend));
settings->backend = backend; settings->backend = backend;
load_initial_settings (settings);
} }
#define SETTINGS_GROUP "Settings" #define SETTINGS_GROUP "Settings"

View File

@@ -86,13 +86,6 @@ typedef struct _ClutterStageViewPrivate
G_DEFINE_TYPE_WITH_PRIVATE (ClutterStageView, clutter_stage_view, G_TYPE_OBJECT) G_DEFINE_TYPE_WITH_PRIVATE (ClutterStageView, clutter_stage_view, G_TYPE_OBJECT)
void
clutter_stage_view_destroy (ClutterStageView *view)
{
g_object_run_dispose (G_OBJECT (view));
g_object_unref (view);
}
void void
clutter_stage_view_get_layout (ClutterStageView *view, clutter_stage_view_get_layout (ClutterStageView *view,
cairo_rectangle_int_t *rect) cairo_rectangle_int_t *rect)

View File

@@ -52,9 +52,6 @@ struct _ClutterStageViewClass
cairo_rectangle_int_t *dst_rect); cairo_rectangle_int_t *dst_rect);
}; };
CLUTTER_EXPORT
void clutter_stage_view_destroy (ClutterStageView *view);
CLUTTER_EXPORT CLUTTER_EXPORT
void clutter_stage_view_get_layout (ClutterStageView *view, void clutter_stage_view_get_layout (ClutterStageView *view,
cairo_rectangle_int_t *rect); cairo_rectangle_int_t *rect);

View File

@@ -172,7 +172,6 @@ enum
AFTER_UPDATE, AFTER_UPDATE,
PAINT_VIEW, PAINT_VIEW,
PRESENTED, PRESENTED,
GL_VIDEO_MEMORY_PURGED,
LAST_SIGNAL LAST_SIGNAL
}; };
@@ -545,6 +544,23 @@ queue_full_redraw (ClutterStage *stage)
clutter_stage_add_redraw_clip (stage, NULL); clutter_stage_add_redraw_clip (stage, NULL);
} }
static gboolean
stage_is_default (ClutterStage *stage)
{
ClutterStageManager *stage_manager;
ClutterStageWindow *impl;
stage_manager = clutter_stage_manager_get_default ();
if (stage != clutter_stage_manager_get_default_stage (stage_manager))
return FALSE;
impl = _clutter_stage_get_window (stage);
if (impl != _clutter_stage_get_default_window ())
return FALSE;
return TRUE;
}
static void static void
clutter_stage_allocate (ClutterActor *self, clutter_stage_allocate (ClutterActor *self,
const ClutterActorBox *box) const ClutterActorBox *box)
@@ -1013,6 +1029,7 @@ _clutter_stage_queue_event (ClutterStage *stage,
{ {
ClutterStagePrivate *priv; ClutterStagePrivate *priv;
gboolean first_event; gboolean first_event;
ClutterInputDevice *device;
g_return_if_fail (CLUTTER_IS_STAGE (stage)); g_return_if_fail (CLUTTER_IS_STAGE (stage));
@@ -1023,6 +1040,25 @@ _clutter_stage_queue_event (ClutterStage *stage,
if (copy_event) if (copy_event)
event = clutter_event_copy (event); event = clutter_event_copy (event);
/* if needed, update the state of the input device of the event.
* we do it here to avoid calling the same code from every backend
* event processing function
*/
device = clutter_event_get_device (event);
if (device != NULL &&
event->type != CLUTTER_PROXIMITY_IN &&
event->type != CLUTTER_PROXIMITY_OUT)
{
ClutterEventSequence *sequence = clutter_event_get_event_sequence (event);
guint32 event_time = clutter_event_get_time (event);
gfloat event_x, event_y;
clutter_event_get_coords (event, &event_x, &event_y);
_clutter_input_device_set_coords (device, sequence, event_x, event_y, stage);
_clutter_input_device_set_time (device, event_time);
}
if (first_event) if (first_event)
{ {
gboolean compressible = event->type == CLUTTER_MOTION || gboolean compressible = event->type == CLUTTER_MOTION ||
@@ -1343,7 +1379,7 @@ clutter_stage_update_devices (ClutterStage *stage,
for (l = devices; l; l = l->next) for (l = devices; l; l = l->next)
{ {
ClutterInputDevice *device = l->data; ClutterInputDevice *device = l->data;
clutter_input_device_update (device, NULL, stage, TRUE, NULL); clutter_input_device_update (device, NULL, TRUE);
} }
} }
@@ -1554,6 +1590,18 @@ _clutter_stage_do_pick (ClutterStage *stage,
return actor; return actor;
} }
static gboolean
clutter_stage_real_delete_event (ClutterStage *stage,
ClutterEvent *event)
{
if (stage_is_default (stage))
clutter_main_quit ();
else
clutter_actor_destroy (CLUTTER_ACTOR (stage));
return CLUTTER_EVENT_STOP;
}
static void static void
clutter_stage_real_apply_transform (ClutterActor *stage, clutter_stage_real_apply_transform (ClutterActor *stage,
CoglMatrix *matrix) CoglMatrix *matrix)
@@ -1660,7 +1708,7 @@ clutter_stage_dispose (GObject *object)
clutter_actor_hide (CLUTTER_ACTOR (object)); clutter_actor_hide (CLUTTER_ACTOR (object));
_clutter_clear_events_queue (); _clutter_clear_events_queue_for_stage (stage);
if (priv->impl != NULL) if (priv->impl != NULL)
{ {
@@ -1829,6 +1877,37 @@ clutter_stage_class_init (ClutterStageClass *klass)
NULL, NULL, NULL, NULL, NULL, NULL,
G_TYPE_NONE, 0); G_TYPE_NONE, 0);
/**
* ClutterStage::delete-event:
* @stage: the stage that received the event
* @event: a #ClutterEvent of type %CLUTTER_DELETE
*
* The ::delete-event signal is emitted when the user closes a
* #ClutterStage window using the window controls.
*
* Clutter by default will call clutter_main_quit() if @stage is
* the default stage, and clutter_actor_destroy() for any other
* stage.
*
* It is possible to override the default behaviour by connecting
* a new handler and returning %TRUE there.
*
* This signal is emitted only on Clutter backends that
* embed #ClutterStage in native windows. It is not emitted for
* backends that use a static frame buffer.
*
* Since: 1.2
*/
stage_signals[DELETE_EVENT] =
g_signal_new (I_("delete-event"),
G_TYPE_FROM_CLASS (gobject_class),
G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (ClutterStageClass, delete_event),
_clutter_boolean_handled_accumulator, NULL,
_clutter_marshal_BOOLEAN__BOXED,
G_TYPE_BOOLEAN, 1,
CLUTTER_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE);
/** /**
* ClutterStage::before-update: * ClutterStage::before-update:
* @stage: the #ClutterStage * @stage: the #ClutterStage
@@ -1932,24 +2011,9 @@ clutter_stage_class_init (ClutterStageClass *klass)
CLUTTER_TYPE_STAGE_VIEW, CLUTTER_TYPE_STAGE_VIEW,
G_TYPE_POINTER); G_TYPE_POINTER);
/**
* ClutterStage::gl-video-memory-purged: (skip)
* @stage: the stage that received the event
*
* Signals that the underlying GL driver has had its texture memory purged
* so anything presently held in texture memory is now invalidated, and
* likely corrupt. It needs redrawing.
*/
stage_signals[GL_VIDEO_MEMORY_PURGED] =
g_signal_new (I_("gl-video-memory-purged"),
G_TYPE_FROM_CLASS (gobject_class),
G_SIGNAL_RUN_LAST,
0,
NULL, NULL, NULL,
G_TYPE_NONE, 0);
klass->activate = clutter_stage_real_activate; klass->activate = clutter_stage_real_activate;
klass->deactivate = clutter_stage_real_deactivate; klass->deactivate = clutter_stage_real_deactivate;
klass->delete_event = clutter_stage_real_delete_event;
} }
static void static void
@@ -2396,6 +2460,18 @@ clutter_stage_event (ClutterStage *stage,
g_return_val_if_fail (CLUTTER_IS_STAGE (stage), FALSE); g_return_val_if_fail (CLUTTER_IS_STAGE (stage), FALSE);
g_return_val_if_fail (event != NULL, FALSE); g_return_val_if_fail (event != NULL, FALSE);
if (event->type == CLUTTER_DELETE)
{
gboolean retval = FALSE;
g_signal_emit_by_name (stage, "event", event, &retval);
if (!retval)
g_signal_emit_by_name (stage, "delete-event", event, &retval);
return retval;
}
if (event->type != CLUTTER_STAGE_STATE) if (event->type != CLUTTER_STAGE_STATE)
return FALSE; return FALSE;
@@ -2571,6 +2647,29 @@ G_DEFINE_BOXED_TYPE (ClutterPerspective, clutter_perspective,
clutter_perspective_copy, clutter_perspective_copy,
clutter_perspective_free); clutter_perspective_free);
/**
* clutter_stage_new:
*
* Creates a new, non-default stage. A non-default stage is a new
* top-level actor which can be used as another container.
*
* The ability to support multiple stages depends on the current
* backend. Use clutter_feature_available() and
* %CLUTTER_FEATURE_STAGE_MULTIPLE to check at runtime whether a
* backend supports multiple stages.
*
* Return value: a new stage, or %NULL if the default backend does
* not support multiple stages. Use clutter_actor_destroy() to
* programmatically close the returned stage.
*
* Since: 0.8
*/
ClutterActor *
clutter_stage_new (void)
{
return g_object_new (CLUTTER_TYPE_STAGE, NULL);
}
/** /**
* clutter_stage_ensure_viewport: * clutter_stage_ensure_viewport:
* @stage: a #ClutterStage * @stage: a #ClutterStage
@@ -3525,6 +3624,102 @@ clutter_stage_presented (ClutterStage *stage,
g_signal_emit (stage, stage_signals[PRESENTED], 0, view, frame_info); g_signal_emit (stage, stage_signals[PRESENTED], 0, view, frame_info);
} }
static void
capture_view (ClutterStage *stage,
gboolean paint,
ClutterStageView *view,
ClutterCapture *capture)
{
cairo_surface_t *image;
uint8_t *data;
int stride;
cairo_rectangle_int_t *rect;
float view_scale;
float texture_width;
float texture_height;
rect = &capture->rect;
view_scale = clutter_stage_view_get_scale (view);
texture_width = roundf (rect->width * view_scale);
texture_height = roundf (rect->height * view_scale);
image = cairo_image_surface_create (CAIRO_FORMAT_ARGB32,
texture_width, texture_height);
cairo_surface_set_device_scale (image, view_scale, view_scale);
data = cairo_image_surface_get_data (image);
stride = cairo_image_surface_get_stride (image);
capture_view_into (stage, paint, view, rect, data, stride);
capture->image = image;
cairo_surface_mark_dirty (capture->image);
}
/**
* clutter_stage_capture:
* @stage: a #ClutterStage
* @paint: whether to pain the frame
* @rect: a #cairo_rectangle_int_t in stage coordinates
* @out_captures: (out) (array length=out_n_captures): an array of
* #ClutterCapture
* @out_n_captures: (out): the number of captures in @out_captures
*
* Captures the stage pixels of @rect into @captures. @rect is in stage
* coordinates.
*
* Returns: %TRUE if a #ClutterCapture has been created, %FALSE otherwise
*/
gboolean
clutter_stage_capture (ClutterStage *stage,
gboolean paint,
cairo_rectangle_int_t *rect,
ClutterCapture **out_captures,
int *out_n_captures)
{
ClutterStagePrivate *priv = stage->priv;
GList *views = _clutter_stage_window_get_views (priv->impl);
GList *l;
ClutterCapture *captures;
int n_captures;
g_return_val_if_fail (CLUTTER_IS_STAGE (stage), FALSE);
captures = g_new0 (ClutterCapture, g_list_length (views));
n_captures = 0;
for (l = views; l; l = l->next)
{
ClutterStageView *view = l->data;
ClutterCapture *capture;
cairo_rectangle_int_t view_layout;
cairo_region_t *region;
clutter_stage_view_get_layout (view, &view_layout);
region = cairo_region_create_rectangle (&view_layout);
cairo_region_intersect_rectangle (region, rect);
capture = &captures[n_captures];
cairo_region_get_extents (region, &capture->rect);
cairo_region_destroy (region);
if (capture->rect.width == 0 || capture->rect.height == 0)
continue;
capture_view (stage, paint, view, capture);
n_captures++;
}
if (n_captures == 0)
g_clear_pointer (&captures, g_free);
*out_captures = captures;
*out_n_captures = n_captures;
return n_captures > 0;
}
gboolean gboolean
clutter_stage_get_capture_final_size (ClutterStage *stage, clutter_stage_get_capture_final_size (ClutterStage *stage,
cairo_rectangle_int_t *rect, cairo_rectangle_int_t *rect,

View File

@@ -64,6 +64,7 @@ struct _ClutterStage
* ClutterStageClass: * ClutterStageClass:
* @activate: handler for the #ClutterStage::activate signal * @activate: handler for the #ClutterStage::activate signal
* @deactivate: handler for the #ClutterStage::deactivate signal * @deactivate: handler for the #ClutterStage::deactivate signal
* @delete_event: handler for the #ClutterStage::delete-event signal
* *
* The #ClutterStageClass structure contains only private data * The #ClutterStageClass structure contains only private data
* *
@@ -80,13 +81,16 @@ struct _ClutterStageClass
void (* activate) (ClutterStage *stage); void (* activate) (ClutterStage *stage);
void (* deactivate) (ClutterStage *stage); void (* deactivate) (ClutterStage *stage);
gboolean (* delete_event) (ClutterStage *stage,
ClutterEvent *event);
void (* paint_view) (ClutterStage *stage, void (* paint_view) (ClutterStage *stage,
ClutterStageView *view, ClutterStageView *view,
const cairo_region_t *redraw_clip); const cairo_region_t *redraw_clip);
/*< private >*/ /*< private >*/
/* padding for future expansion */ /* padding for future expansion */
gpointer _padding_dummy[31]; gpointer _padding_dummy[30];
}; };
/** /**
@@ -132,6 +136,9 @@ GType clutter_perspective_get_type (void) G_GNUC_CONST;
CLUTTER_EXPORT CLUTTER_EXPORT
GType clutter_stage_get_type (void) G_GNUC_CONST; GType clutter_stage_get_type (void) G_GNUC_CONST;
CLUTTER_EXPORT
ClutterActor * clutter_stage_new (void);
CLUTTER_EXPORT CLUTTER_EXPORT
void clutter_stage_get_perspective (ClutterStage *stage, void clutter_stage_get_perspective (ClutterStage *stage,
ClutterPerspective *perspective); ClutterPerspective *perspective);
@@ -212,22 +219,11 @@ gboolean clutter_stage_get_capture_final_size (ClutterStage *stage,
float *scale); float *scale);
CLUTTER_EXPORT CLUTTER_EXPORT
void clutter_stage_paint_to_framebuffer (ClutterStage *stage, gboolean clutter_stage_capture (ClutterStage *stage,
CoglFramebuffer *framebuffer, gboolean paint,
const cairo_rectangle_int_t *rect, cairo_rectangle_int_t *rect,
float scale, ClutterCapture **out_captures,
ClutterPaintFlag paint_flags); int *out_n_captures);
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 CLUTTER_EXPORT
ClutterStageView * clutter_stage_get_view_at (ClutterStage *stage, ClutterStageView * clutter_stage_get_view_at (ClutterStage *stage,
float x, float x,

View File

@@ -103,7 +103,6 @@
#include "clutter-frame-clock.h" #include "clutter-frame-clock.h"
#include "clutter-main.h" #include "clutter-main.h"
#include "clutter-marshal.h" #include "clutter-marshal.h"
#include "clutter-mutter.h"
#include "clutter-private.h" #include "clutter-private.h"
#include "clutter-scriptable.h" #include "clutter-scriptable.h"
#include "clutter-timeline-private.h" #include "clutter-timeline-private.h"
@@ -114,8 +113,6 @@ struct _ClutterTimelinePrivate
ClutterFrameClock *custom_frame_clock; ClutterFrameClock *custom_frame_clock;
ClutterFrameClock *frame_clock; ClutterFrameClock *frame_clock;
ClutterActor *frame_clock_actor;
gulong frame_clock_actor_stage_views_handler_id;
ClutterActor *actor; ClutterActor *actor;
gulong actor_destroy_handler_id; gulong actor_destroy_handler_id;
@@ -385,40 +382,19 @@ on_stage_stage_views_changed (ClutterActor *stage,
update_frame_clock (timeline); update_frame_clock (timeline);
} }
static void
on_frame_clock_actor_stage_views_changed (ClutterActor *frame_clock_actor,
ClutterTimeline *timeline)
{
update_frame_clock (timeline);
}
static void static void
update_frame_clock (ClutterTimeline *timeline) update_frame_clock (ClutterTimeline *timeline)
{ {
ClutterTimelinePrivate *priv = timeline->priv; ClutterTimelinePrivate *priv = timeline->priv;
ClutterFrameClock *frame_clock = NULL; ClutterFrameClock *frame_clock = NULL;
ClutterActor *stage; ClutterActor *stage;
ClutterActor *frame_clock_actor;
if (!priv->actor) if (!priv->actor)
goto out; goto out;
if (priv->frame_clock_actor) frame_clock = clutter_actor_pick_frame_clock (priv->actor);
{
g_clear_signal_handler (&priv->frame_clock_actor_stage_views_handler_id,
priv->frame_clock_actor);
g_clear_weak_pointer (&priv->frame_clock_actor);
}
frame_clock = clutter_actor_pick_frame_clock (priv->actor, &frame_clock_actor);
if (frame_clock) if (frame_clock)
{ {
g_set_weak_pointer (&priv->frame_clock_actor, frame_clock_actor);
priv->frame_clock_actor_stage_views_handler_id =
g_signal_connect (frame_clock_actor, "stage-views-changed",
G_CALLBACK (on_frame_clock_actor_stage_views_changed),
timeline);
g_clear_signal_handler (&priv->stage_stage_views_handler_id, priv->stage); g_clear_signal_handler (&priv->stage_stage_views_handler_id, priv->stage);
goto out; goto out;
} }
@@ -760,13 +736,6 @@ clutter_timeline_dispose (GObject *object)
priv->actor = NULL; priv->actor = NULL;
} }
if (priv->frame_clock_actor)
{
g_clear_signal_handler (&priv->frame_clock_actor_stage_views_handler_id,
priv->frame_clock_actor);
g_clear_weak_pointer (&priv->frame_clock_actor);
}
if (priv->progress_notify != NULL) if (priv->progress_notify != NULL)
{ {
priv->progress_notify (priv->progress_data); priv->progress_notify (priv->progress_data);

View File

@@ -773,16 +773,16 @@ on_framebuffer_set (ClutterStageView *view)
} }
static void static void
clutter_stage_view_cogl_dispose (GObject *object) clutter_stage_view_cogl_finalize (GObject *object)
{ {
ClutterStageViewCogl *view_cogl = CLUTTER_STAGE_VIEW_COGL (object); ClutterStageViewCogl *view_cogl = CLUTTER_STAGE_VIEW_COGL (object);
ClutterStageViewCoglPrivate *view_priv = ClutterStageViewCoglPrivate *view_priv =
clutter_stage_view_cogl_get_instance_private (view_cogl); clutter_stage_view_cogl_get_instance_private (view_cogl);
g_clear_handle_id (&view_priv->notify_presented_handle_id, g_source_remove); g_clear_handle_id (&view_priv->notify_presented_handle_id, g_source_remove);
g_clear_pointer (&view_priv->damage_history, clutter_damage_history_free); clutter_damage_history_free (view_priv->damage_history);
G_OBJECT_CLASS (clutter_stage_view_cogl_parent_class)->dispose (object); G_OBJECT_CLASS (clutter_stage_view_cogl_parent_class)->finalize (object);
} }
static void static void
@@ -802,5 +802,5 @@ clutter_stage_view_cogl_class_init (ClutterStageViewCoglClass *klass)
{ {
GObjectClass *object_class = G_OBJECT_CLASS (klass); GObjectClass *object_class = G_OBJECT_CLASS (klass);
object_class->dispose = clutter_stage_view_cogl_dispose; object_class->finalize = clutter_stage_view_cogl_finalize;
} }

View File

@@ -0,0 +1,297 @@
/*
* Clutter.
*
* An OpenGL based 'interactive canvas' library.
*
* Copyright (C) 2010,2011 Intel Corporation.
* 2011 Giovanni Campagna <scampa.giovanni@gmail.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
* Authors:
* Matthew Allum
* Emmanuele Bassi
* Robert Bragg
* Neil Roberts
*/
#include "clutter-build-config.h"
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include "clutter-backend-eglnative.h"
/* This is a Cogl based backend */
#include "cogl/clutter-stage-cogl.h"
#include "clutter-debug.h"
#include "clutter-private.h"
#include "clutter-main.h"
#include "clutter-stage-private.h"
#include "clutter-settings-private.h"
#ifdef COGL_HAS_EGL_SUPPORT
#include "clutter-egl.h"
#endif
G_DEFINE_TYPE (ClutterBackendEglNative, clutter_backend_egl_native, CLUTTER_TYPE_BACKEND);
static void
clutter_backend_egl_native_dispose (GObject *gobject)
{
ClutterBackendEglNative *backend_egl_native = CLUTTER_BACKEND_EGL_NATIVE (gobject);
g_clear_object (&backend_egl_native->xsettings);
if (backend_egl_native->event_timer != NULL)
{
g_timer_destroy (backend_egl_native->event_timer);
backend_egl_native->event_timer = NULL;
}
G_OBJECT_CLASS (clutter_backend_egl_native_parent_class)->dispose (gobject);
}
static void
clutter_backend_egl_native_class_init (ClutterBackendEglNativeClass *klass)
{
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
gobject_class->dispose = clutter_backend_egl_native_dispose;
}
typedef struct
{
cairo_antialias_t cairo_antialias;
gint clutter_font_antialias;
cairo_hint_style_t cairo_hint_style;
const char *clutter_font_hint_style;
cairo_subpixel_order_t cairo_subpixel_order;
const char *clutter_font_subpixel_order;
} FontSettings;
static void
get_font_gsettings (GSettings *xsettings,
FontSettings *output)
{
/* org.gnome.settings-daemon.GsdFontAntialiasingMode */
static const struct
{
cairo_antialias_t cairo_antialias;
gint clutter_font_antialias;
}
antialiasings[] =
{
/* none=0 */ {CAIRO_ANTIALIAS_NONE, 0},
/* grayscale=1 */ {CAIRO_ANTIALIAS_GRAY, 1},
/* rgba=2 */ {CAIRO_ANTIALIAS_SUBPIXEL, 1},
};
/* org.gnome.settings-daemon.GsdFontHinting */
static const struct
{
cairo_hint_style_t cairo_hint_style;
const char *clutter_font_hint_style;
}
hintings[] =
{
/* none=0 */ {CAIRO_HINT_STYLE_NONE, "hintnone"},
/* slight=1 */ {CAIRO_HINT_STYLE_SLIGHT, "hintslight"},
/* medium=2 */ {CAIRO_HINT_STYLE_MEDIUM, "hintmedium"},
/* full=3 */ {CAIRO_HINT_STYLE_FULL, "hintfull"},
};
/* org.gnome.settings-daemon.GsdFontRgbaOrder */
static const struct
{
cairo_subpixel_order_t cairo_subpixel_order;
const char *clutter_font_subpixel_order;
}
rgba_orders[] =
{
/* rgba=0 */ {CAIRO_SUBPIXEL_ORDER_RGB, "rgb"}, /* XXX what is 'rgba'? */
/* rgb=1 */ {CAIRO_SUBPIXEL_ORDER_RGB, "rgb"},
/* bgr=2 */ {CAIRO_SUBPIXEL_ORDER_BGR, "bgr"},
/* vrgb=3 */ {CAIRO_SUBPIXEL_ORDER_VRGB, "vrgb"},
/* vbgr=4 */ {CAIRO_SUBPIXEL_ORDER_VBGR, "vbgr"},
};
guint i;
i = g_settings_get_enum (xsettings, "hinting");
if (i < G_N_ELEMENTS (hintings))
{
output->cairo_hint_style = hintings[i].cairo_hint_style;
output->clutter_font_hint_style = hintings[i].clutter_font_hint_style;
}
else
{
output->cairo_hint_style = CAIRO_HINT_STYLE_DEFAULT;
output->clutter_font_hint_style = NULL;
}
i = g_settings_get_enum (xsettings, "antialiasing");
if (i < G_N_ELEMENTS (antialiasings))
{
output->cairo_antialias = antialiasings[i].cairo_antialias;
output->clutter_font_antialias = antialiasings[i].clutter_font_antialias;
}
else
{
output->cairo_antialias = CAIRO_ANTIALIAS_DEFAULT;
output->clutter_font_antialias = -1;
}
i = g_settings_get_enum (xsettings, "rgba-order");
if (i < G_N_ELEMENTS (rgba_orders))
{
output->cairo_subpixel_order = rgba_orders[i].cairo_subpixel_order;
output->clutter_font_subpixel_order = rgba_orders[i].clutter_font_subpixel_order;
}
else
{
output->cairo_subpixel_order = CAIRO_SUBPIXEL_ORDER_DEFAULT;
output->clutter_font_subpixel_order = NULL;
}
if (output->cairo_antialias == CAIRO_ANTIALIAS_GRAY)
output->clutter_font_subpixel_order = "none";
}
static void
init_font_options (ClutterBackendEglNative *backend_egl_native)
{
GSettings *xsettings = backend_egl_native->xsettings;
cairo_font_options_t *options = cairo_font_options_create ();
FontSettings fs;
get_font_gsettings (xsettings, &fs);
cairo_font_options_set_hint_style (options, fs.cairo_hint_style);
cairo_font_options_set_antialias (options, fs.cairo_antialias);
cairo_font_options_set_subpixel_order (options, fs.cairo_subpixel_order);
clutter_backend_set_font_options (CLUTTER_BACKEND (backend_egl_native),
options);
cairo_font_options_destroy (options);
}
static gboolean
on_xsettings_change_event (GSettings *xsettings,
gpointer keys,
gint n_keys,
gpointer user_data)
{
/*
* A simpler alternative to this function that does not update the screen
* immediately (like macOS :P):
*
* init_font_options (CLUTTER_BACKEND_EGL_NATIVE (user_data));
*
* which has the added benefit of eliminating the need for all the
* FontSettings.clutter_ fields. However the below approach is better for
* testing settings and more consistent with the existing x11 backend...
*/
ClutterSettings *csettings = clutter_settings_get_default ();
FontSettings fs;
gint hinting;
get_font_gsettings (xsettings, &fs);
hinting = fs.cairo_hint_style == CAIRO_HINT_STYLE_NONE ? 0 : 1;
g_object_set (csettings,
"font-hinting", hinting,
"font-hint-style", fs.clutter_font_hint_style,
"font-antialias", fs.clutter_font_antialias,
"font-subpixel-order", fs.clutter_font_subpixel_order,
NULL);
return FALSE;
}
static void
clutter_backend_egl_native_init (ClutterBackendEglNative *backend_egl_native)
{
static const gchar xsettings_path[] = "org.gnome.settings-daemon.plugins.xsettings";
GSettingsSchemaSource *source = g_settings_schema_source_get_default ();
GSettingsSchema *schema = g_settings_schema_source_lookup (source,
xsettings_path,
TRUE);
if (!schema)
{
g_warning ("Failed to find schema: %s", xsettings_path);
}
else
{
backend_egl_native->xsettings = g_settings_new_full (schema, NULL, NULL);
if (backend_egl_native->xsettings)
{
init_font_options (backend_egl_native);
g_signal_connect (backend_egl_native->xsettings, "change-event",
G_CALLBACK (on_xsettings_change_event),
backend_egl_native);
}
}
backend_egl_native->event_timer = g_timer_new ();
}
ClutterBackend *
clutter_backend_egl_native_new (void)
{
return g_object_new (CLUTTER_TYPE_BACKEND_EGL_NATIVE, NULL);
}
/**
* clutter_egl_get_egl_display:
*
* Retrieves the EGL display used by Clutter, if it supports the
* EGL windowing system and if it is running using an EGL backend.
*
* Return value: the EGL display used by Clutter, or 0
*
* Since: 1.6
*/
EGLDisplay
clutter_egl_get_egl_display (void)
{
ClutterBackend *backend;
if (!_clutter_context_is_initialized ())
{
g_critical ("The Clutter backend has not been initialized yet");
return 0;
}
backend = clutter_get_default_backend ();
if (!CLUTTER_IS_BACKEND_EGL_NATIVE (backend))
{
g_critical ("The Clutter backend is not an EGL backend");
return 0;
}
#ifdef COGL_HAS_EGL_SUPPORT
return cogl_egl_context_get_egl_display (backend->cogl_context);
#else
return 0;
#endif
}

View File

@@ -0,0 +1,78 @@
/* Clutter.
* An OpenGL based 'interactive canvas' library.
*
* Copyright (C) 2006, 2007 OpenedHand
* Copyright (C) 2010 Intel Corp
* 2011 Giovanni Campagna <scampa.giovanni@gmail.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
* Authors:
* Matthew Allum
* Robert Bragg
*/
#ifndef __CLUTTER_BACKEND_EGL_NATIVE_H__
#define __CLUTTER_BACKEND_EGL_NATIVE_H__
#include <glib-object.h>
#include <gio/gio.h>
#include <cogl/cogl.h>
#include <cogl/cogl-egl.h>
#include <clutter/clutter-event.h>
#include <clutter/clutter-backend.h>
#include "clutter-backend-private.h"
G_BEGIN_DECLS
#define CLUTTER_TYPE_BACKEND_EGL_NATIVE (clutter_backend_egl_native_get_type ())
#define CLUTTER_BACKEND_EGL_NATIVE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), CLUTTER_TYPE_BACKEND_EGL_NATIVE, ClutterBackendEglNative))
#define CLUTTER_IS_BACKEND_EGL_NATIVE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CLUTTER_TYPE_BACKEND_EGL_NATIVE))
#define CLUTTER_BACKEND_EGL_NATIVE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), CLUTTER_TYPE_BACKEND_EGL_NATIVE, ClutterBackendEglNativeClass))
#define CLUTTER_IS_BACKEND_EGL_NATIVE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), CLUTTER_TYPE_BACKEND_EGL_NATIVE))
#define CLUTTER_BACKEND_EGL_NATIVE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), CLUTTER_TYPE_BACKEND_EGL_NATIVE, ClutterBackendEglNativeClass))
typedef struct _ClutterBackendEglNative ClutterBackendEglNative;
typedef struct _ClutterBackendEglNativeClass ClutterBackendEglNativeClass;
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterBackendEglNative, g_object_unref)
struct _ClutterBackendEglNative
{
ClutterBackend parent_instance;
/* event source */
GSource *event_source;
/* event timer */
GTimer *event_timer;
/* "xsettings" is still the defacto place for Xft settings, even in Wayland */
GSettings *xsettings;
};
struct _ClutterBackendEglNativeClass
{
ClutterBackendClass parent_class;
};
CLUTTER_EXPORT
GType clutter_backend_egl_native_get_type (void) G_GNUC_CONST;
ClutterBackend *clutter_backend_egl_native_new (void);
G_END_DECLS
#endif /* __CLUTTER_BACKEND_EGL_NATIVE_H__ */

View File

@@ -0,0 +1,59 @@
/*
* Clutter.
*
* An OpenGL based 'interactive canvas' library.
*
* Authored By Matthew Allum <mallum@openedhand.com>
*
* Copyright (C) 2006 OpenedHand
*
* 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/>.
*
*
*/
/**
* SECTION:clutter-egl
* @short_description: EGL specific API
*
* The EGL backend for Clutter provides some EGL specific API
*
* You need to include `clutter-egl.h` to have access to the functions documented here.
*/
#ifndef __CLUTTER_EGL_H__
#define __CLUTTER_EGL_H__
#include <glib.h>
#include "clutter-egl-headers.h"
#include <clutter/clutter.h>
G_BEGIN_DECLS
/**
* clutter_egl_get_egl_display:
*
* Retrieves the #EGLDisplay used by Clutter.
*
* Return value: the EGL display
*
* Since: 1.6
*/
CLUTTER_EXPORT
EGLDisplay clutter_egl_get_egl_display (void);
G_END_DECLS
#endif /* __CLUTTER_EGL_H__ */

View File

@@ -257,6 +257,13 @@ if have_x11
clutter_backend_nonintrospected_sources += clutter_x11_nonintrospected_sources clutter_backend_nonintrospected_sources += clutter_x11_nonintrospected_sources
endif endif
if have_native_backend
clutter_native_nonintrospected_sources = [
'egl/clutter-backend-eglnative.c',
]
clutter_backend_nonintrospected_sources += clutter_native_nonintrospected_sources
endif
if have_wayland if have_wayland
clutter_wayland_private_headers = [ clutter_wayland_private_headers = [
'wayland/clutter-wayland-compositor.h', 'wayland/clutter-wayland-compositor.h',

View File

@@ -98,6 +98,7 @@ static const gchar *atom_names[] = {
/* various flags corresponding to pre init setup calls */ /* various flags corresponding to pre init setup calls */
static gboolean clutter_enable_xinput = TRUE; static gboolean clutter_enable_xinput = TRUE;
static gboolean clutter_enable_argb = FALSE;
static gboolean clutter_enable_stereo = FALSE; static gboolean clutter_enable_stereo = FALSE;
static Display *_foreign_dpy = NULL; static Display *_foreign_dpy = NULL;
@@ -239,6 +240,13 @@ clutter_backend_x11_pre_parse (ClutterBackend *backend,
env_string = NULL; env_string = NULL;
} }
env_string = g_getenv ("CLUTTER_DISABLE_ARGB_VISUAL");
if (env_string)
{
clutter_enable_argb = FALSE;
env_string = NULL;
}
env_string = g_getenv ("CLUTTER_DISABLE_XINPUT"); env_string = g_getenv ("CLUTTER_DISABLE_XINPUT");
if (env_string) if (env_string)
{ {
@@ -542,12 +550,15 @@ clutter_backend_x11_get_renderer (ClutterBackend *backend,
static gboolean static gboolean
check_onscreen_template (CoglRenderer *renderer, check_onscreen_template (CoglRenderer *renderer,
CoglSwapChain *swap_chain,
CoglOnscreenTemplate *onscreen_template, CoglOnscreenTemplate *onscreen_template,
gboolean enable_argb,
gboolean enable_stereo, gboolean enable_stereo,
GError **error) GError **error)
{ {
GError *internal_error = NULL; GError *internal_error = NULL;
cogl_swap_chain_set_has_alpha (swap_chain, enable_argb);
cogl_onscreen_template_set_stereo_enabled (onscreen_template, cogl_onscreen_template_set_stereo_enabled (onscreen_template,
clutter_enable_stereo); clutter_enable_stereo);
@@ -562,15 +573,17 @@ check_onscreen_template (CoglRenderer *renderer,
*/ */
if (cogl_renderer_check_onscreen_template (renderer, onscreen_template, &internal_error)) if (cogl_renderer_check_onscreen_template (renderer, onscreen_template, &internal_error))
{ {
clutter_enable_argb = enable_argb;
clutter_enable_stereo = enable_stereo; clutter_enable_stereo = enable_stereo;
return TRUE; return TRUE;
} }
else else
{ {
if (enable_stereo) /* More possibilities to try */ if (enable_argb || enable_stereo) /* More possibilities to try */
CLUTTER_NOTE (BACKEND, CLUTTER_NOTE (BACKEND,
"Creation of a CoglDisplay with, stereo=%s failed: %s", "Creation of a CoglDisplay with alpha=%s, stereo=%s failed: %s",
enable_argb ? "enabled" : "disabled",
enable_stereo ? "enabled" : "disabled", enable_stereo ? "enabled" : "disabled",
internal_error != NULL internal_error != NULL
? internal_error->message ? internal_error->message
@@ -598,7 +611,8 @@ clutter_backend_x11_get_display (ClutterBackend *backend,
CoglDisplay *display = NULL; CoglDisplay *display = NULL;
gboolean res = FALSE; gboolean res = FALSE;
CLUTTER_NOTE (BACKEND, "Creating CoglDisplay, stereo=%s", CLUTTER_NOTE (BACKEND, "Creating CoglDisplay, alpha=%s, stereo=%s",
clutter_enable_argb ? "enabled" : "disabled",
clutter_enable_stereo ? "enabled" : "disabled"); clutter_enable_stereo ? "enabled" : "disabled");
onscreen_template = cogl_onscreen_template_new (swap_chain); onscreen_template = cogl_onscreen_template_new (swap_chain);
@@ -606,13 +620,22 @@ clutter_backend_x11_get_display (ClutterBackend *backend,
/* It's possible that the current renderer doesn't support transparency /* It's possible that the current renderer doesn't support transparency
* or doesn't support stereo, so we try the different combinations. * or doesn't support stereo, so we try the different combinations.
*/ */
if (clutter_enable_stereo) if (clutter_enable_argb && clutter_enable_stereo)
res = check_onscreen_template (renderer, onscreen_template, res = check_onscreen_template (renderer, swap_chain, onscreen_template,
TRUE, error); TRUE, TRUE, error);
/* Prioritize stereo over alpha */
if (!res && clutter_enable_stereo)
res = check_onscreen_template (renderer, swap_chain, onscreen_template,
FALSE, TRUE, error);
if (!res && clutter_enable_argb)
res = check_onscreen_template (renderer, swap_chain, onscreen_template,
TRUE, FALSE, error);
if (!res) if (!res)
res = check_onscreen_template (renderer, onscreen_template, res = check_onscreen_template (renderer, swap_chain, onscreen_template,
FALSE, error); FALSE, FALSE, error);
if (res) if (res)
display = cogl_display_new (renderer, onscreen_template); display = cogl_display_new (renderer, onscreen_template);
@@ -906,6 +929,99 @@ clutter_x11_remove_filter (ClutterX11FilterFunc func,
} }
} }
/**
* clutter_x11_has_composite_extension:
*
* Retrieves whether Clutter is running on an X11 server with the
* XComposite extension
*
* Return value: %TRUE if the XComposite extension is available
*/
gboolean
clutter_x11_has_composite_extension (void)
{
static gboolean have_composite = FALSE, done_check = FALSE;
int error = 0, event = 0;
Display *dpy;
if (done_check)
return have_composite;
if (!_clutter_context_is_initialized ())
{
g_critical ("X11 backend has not been initialised");
return FALSE;
}
dpy = clutter_x11_get_default_display();
if (dpy == NULL)
return FALSE;
if (XCompositeQueryExtension (dpy, &event, &error))
{
int major = 0, minor = 0;
if (XCompositeQueryVersion (dpy, &major, &minor))
{
if (major >= 0 && minor >= 3)
have_composite = TRUE;
}
}
done_check = TRUE;
return have_composite;
}
/**
* clutter_x11_set_use_argb_visual:
* @use_argb: %TRUE if ARGB visuals should be requested by default
*
* Sets whether the Clutter X11 backend should request ARGB visuals by default
* or not.
*
* By default, Clutter requests RGB visuals.
*
* If no ARGB visuals are found, the X11 backend will fall back to
* requesting a RGB visual instead.
*
* ARGB visuals are required for the #ClutterStage:use-alpha property to work.
*
* This function can only be called once, and before clutter_init() is
* called.
*
* Since: 1.2
*/
void
clutter_x11_set_use_argb_visual (gboolean use_argb)
{
if (_clutter_context_is_initialized ())
{
g_warning ("%s() can only be used before calling clutter_init()",
G_STRFUNC);
return;
}
CLUTTER_NOTE (BACKEND, "ARGB visuals are %s",
use_argb ? "enabled" : "disabled");
clutter_enable_argb = use_argb;
}
/**
* clutter_x11_get_use_argb_visual:
*
* Retrieves whether the Clutter X11 backend is using ARGB visuals by default
*
* Return value: %TRUE if ARGB visuals are queried by default
*
* Since: 1.2
*/
gboolean
clutter_x11_get_use_argb_visual (void)
{
return clutter_enable_argb;
}
/** /**
* clutter_x11_set_use_stereo_stage: * clutter_x11_set_use_stereo_stage:
* @use_stereo: %TRUE if the stereo stages should be used if possible. * @use_stereo: %TRUE if the stereo stages should be used if possible.

View File

@@ -8,6 +8,12 @@ static const struct {
} _clutter_settings_map[] = { } _clutter_settings_map[] = {
{ "Net/DoubleClickDistance", "double-click-distance" }, { "Net/DoubleClickDistance", "double-click-distance" },
{ "Net/DndDragThreshold", "dnd-drag-threshold" }, { "Net/DndDragThreshold", "dnd-drag-threshold" },
{ "Gtk/FontName", "font-name" },
{ "Xft/Antialias", "font-antialias" },
{ "Xft/Hinting", "font-hinting" },
{ "Xft/HintStyle", "font-hint-style" },
{ "Xft/RGBA", "font-subpixel-order" },
{ "Fontconfig/Timestamp", "fontconfig-timestamp" },
}; };
static const gint _n_clutter_settings_map = G_N_ELEMENTS (_clutter_settings_map); static const gint _n_clutter_settings_map = G_N_ELEMENTS (_clutter_settings_map);

View File

@@ -109,6 +109,14 @@ CLUTTER_EXPORT
void clutter_x11_remove_filter (ClutterX11FilterFunc func, void clutter_x11_remove_filter (ClutterX11FilterFunc func,
gpointer data); gpointer data);
CLUTTER_EXPORT
gboolean clutter_x11_has_composite_extension (void);
CLUTTER_EXPORT
void clutter_x11_set_use_argb_visual (gboolean use_argb);
CLUTTER_EXPORT
gboolean clutter_x11_get_use_argb_visual (void);
CLUTTER_EXPORT CLUTTER_EXPORT
void clutter_x11_set_use_stereo_stage (gboolean use_stereo); void clutter_x11_set_use_stereo_stage (gboolean use_stereo);
CLUTTER_EXPORT CLUTTER_EXPORT

View File

@@ -351,14 +351,6 @@ _cogl_bitmap_needs_short_temp_buffer (CoglPixelFormat format)
case COGL_PIXEL_FORMAT_BGRA_1010102_PRE: case COGL_PIXEL_FORMAT_BGRA_1010102_PRE:
case COGL_PIXEL_FORMAT_ARGB_2101010_PRE: case COGL_PIXEL_FORMAT_ARGB_2101010_PRE:
case COGL_PIXEL_FORMAT_ABGR_2101010_PRE: case COGL_PIXEL_FORMAT_ABGR_2101010_PRE:
case COGL_PIXEL_FORMAT_RGBA_FP_16161616:
case COGL_PIXEL_FORMAT_BGRA_FP_16161616:
case COGL_PIXEL_FORMAT_ARGB_FP_16161616:
case COGL_PIXEL_FORMAT_ABGR_FP_16161616:
case COGL_PIXEL_FORMAT_RGBA_FP_16161616_PRE:
case COGL_PIXEL_FORMAT_BGRA_FP_16161616_PRE:
case COGL_PIXEL_FORMAT_ARGB_FP_16161616_PRE:
case COGL_PIXEL_FORMAT_ABGR_FP_16161616_PRE:
return TRUE; return TRUE;
} }

View File

@@ -40,13 +40,13 @@
#define UNPACK_2(b) (((b) * ((1 << (sizeof (component_type) * 8)) - 1) + \ #define UNPACK_2(b) (((b) * ((1 << (sizeof (component_type) * 8)) - 1) + \
1) / 3) 1) / 3)
#define UNPACK_4(b) (((b) * ((1 << (sizeof (component_type) * 8)) - 1) + \ #define UNPACK_4(b) (((b) * ((1 << (sizeof (component_type) * 8)) - 1) + \
7) / 0xf) 7) / 15)
#define UNPACK_5(b) (((b) * ((1 << (sizeof (component_type) * 8)) - 1) + \ #define UNPACK_5(b) (((b) * ((1 << (sizeof (component_type) * 8)) - 1) + \
0xf) / 0x1f) 15) / 31)
#define UNPACK_6(b) (((b) * ((1 << (sizeof (component_type) * 8)) - 1) + \ #define UNPACK_6(b) (((b) * ((1 << (sizeof (component_type) * 8)) - 1) + \
0x1f) / 0x3f) 31) / 63)
#define UNPACK_10(b) (((b) * ((1 << (sizeof (component_type) * 8)) - 1) + \ #define UNPACK_10(b) (((b) * ((1 << (sizeof (component_type) * 8)) - 1) + \
0x1ff) / 0x3ff) 511) / 1023)
inline static void inline static void
G_PASTE (_cogl_unpack_a_8_, component_size) (const uint8_t *src, G_PASTE (_cogl_unpack_a_8_, component_size) (const uint8_t *src,
@@ -207,8 +207,8 @@ G_PASTE (_cogl_unpack_rgb_565_, component_size) (const uint8_t *src,
uint16_t v = *(const uint16_t *) src; uint16_t v = *(const uint16_t *) src;
dst[0] = UNPACK_5 (v >> 11); dst[0] = UNPACK_5 (v >> 11);
dst[1] = UNPACK_6 ((v >> 5) & 0x3f); dst[1] = UNPACK_6 ((v >> 5) & 63);
dst[2] = UNPACK_5 (v & 0x1f); dst[2] = UNPACK_5 (v & 31);
dst[3] = UNPACK_BYTE (255); dst[3] = UNPACK_BYTE (255);
dst += 4; dst += 4;
src += 2; src += 2;
@@ -225,9 +225,9 @@ G_PASTE (_cogl_unpack_rgba_4444_, component_size) (const uint8_t *src,
uint16_t v = *(const uint16_t *) src; uint16_t v = *(const uint16_t *) src;
dst[0] = UNPACK_4 (v >> 12); dst[0] = UNPACK_4 (v >> 12);
dst[1] = UNPACK_4 ((v >> 8) & 0xf); dst[1] = UNPACK_4 ((v >> 8) & 15);
dst[2] = UNPACK_4 ((v >> 4) & 0xf); dst[2] = UNPACK_4 ((v >> 4) & 15);
dst[3] = UNPACK_4 (v & 0xf); dst[3] = UNPACK_4 (v & 15);
dst += 4; dst += 4;
src += 2; src += 2;
} }
@@ -243,8 +243,8 @@ G_PASTE (_cogl_unpack_rgba_5551_, component_size) (const uint8_t *src,
uint16_t v = *(const uint16_t *) src; uint16_t v = *(const uint16_t *) src;
dst[0] = UNPACK_5 (v >> 11); dst[0] = UNPACK_5 (v >> 11);
dst[1] = UNPACK_5 ((v >> 6) & 0x1f); dst[1] = UNPACK_5 ((v >> 6) & 31);
dst[2] = UNPACK_5 ((v >> 1) & 0x1f); dst[2] = UNPACK_5 ((v >> 1) & 31);
dst[3] = UNPACK_1 (v & 1); dst[3] = UNPACK_1 (v & 1);
dst += 4; dst += 4;
src += 2; src += 2;
@@ -261,8 +261,8 @@ G_PASTE (_cogl_unpack_rgba_1010102_, component_size) (const uint8_t *src,
uint32_t v = *(const uint32_t *) src; uint32_t v = *(const uint32_t *) src;
dst[0] = UNPACK_10 (v >> 22); dst[0] = UNPACK_10 (v >> 22);
dst[1] = UNPACK_10 ((v >> 12) & 0x3ff); dst[1] = UNPACK_10 ((v >> 12) & 1023);
dst[2] = UNPACK_10 ((v >> 2) & 0x3ff); dst[2] = UNPACK_10 ((v >> 2) & 1023);
dst[3] = UNPACK_2 (v & 3); dst[3] = UNPACK_2 (v & 3);
dst += 4; dst += 4;
src += 2; src += 2;
@@ -279,8 +279,8 @@ G_PASTE (_cogl_unpack_bgra_1010102_, component_size) (const uint8_t *src,
uint32_t v = *(const uint32_t *) src; uint32_t v = *(const uint32_t *) src;
dst[2] = UNPACK_10 (v >> 22); dst[2] = UNPACK_10 (v >> 22);
dst[1] = UNPACK_10 ((v >> 12) & 0x3ff); dst[1] = UNPACK_10 ((v >> 12) & 1023);
dst[0] = UNPACK_10 ((v >> 2) & 0x3ff); dst[0] = UNPACK_10 ((v >> 2) & 1023);
dst[3] = UNPACK_2 (v & 3); dst[3] = UNPACK_2 (v & 3);
dst += 4; dst += 4;
src += 2; src += 2;
@@ -297,9 +297,9 @@ G_PASTE (_cogl_unpack_argb_2101010_, component_size) (const uint8_t *src,
uint32_t v = *(const uint32_t *) src; uint32_t v = *(const uint32_t *) src;
dst[3] = UNPACK_2 (v >> 30); dst[3] = UNPACK_2 (v >> 30);
dst[0] = UNPACK_10 ((v >> 20) & 0x3ff); dst[0] = UNPACK_10 ((v >> 20) & 1023);
dst[1] = UNPACK_10 ((v >> 10) & 0x3ff); dst[1] = UNPACK_10 ((v >> 10) & 1023);
dst[2] = UNPACK_10 (v & 0x3ff); dst[2] = UNPACK_10 (v & 1023);
dst += 4; dst += 4;
src += 2; src += 2;
} }
@@ -315,22 +315,14 @@ G_PASTE (_cogl_unpack_abgr_2101010_, component_size) (const uint8_t *src,
uint32_t v = *(const uint32_t *) src; uint32_t v = *(const uint32_t *) src;
dst[3] = UNPACK_2 (v >> 30); dst[3] = UNPACK_2 (v >> 30);
dst[2] = UNPACK_10 ((v >> 20) & 0x3ff); dst[2] = UNPACK_10 ((v >> 20) & 1023);
dst[1] = UNPACK_10 ((v >> 10) & 0x3ff); dst[1] = UNPACK_10 ((v >> 10) & 1023);
dst[0] = UNPACK_10 (v & 0x3ff); dst[0] = UNPACK_10 (v & 1023);
dst += 4; dst += 4;
src += 2; src += 2;
} }
} }
inline static void
G_PASTE (_cogl_unpack_argb_fp_16161616_, component_size) (const uint8_t *src,
component_type *dst,
int width)
{
g_warning ("Not implemented");
}
#undef UNPACK_1 #undef UNPACK_1
#undef UNPACK_2 #undef UNPACK_2
#undef UNPACK_4 #undef UNPACK_4
@@ -404,16 +396,6 @@ G_PASTE (_cogl_unpack_, component_size) (CoglPixelFormat format,
case COGL_PIXEL_FORMAT_ABGR_2101010_PRE: case COGL_PIXEL_FORMAT_ABGR_2101010_PRE:
G_PASTE (_cogl_unpack_abgr_2101010_, component_size) (src, dst, width); G_PASTE (_cogl_unpack_abgr_2101010_, component_size) (src, dst, width);
break; break;
case COGL_PIXEL_FORMAT_RGBA_FP_16161616:
case COGL_PIXEL_FORMAT_BGRA_FP_16161616:
case COGL_PIXEL_FORMAT_ARGB_FP_16161616:
case COGL_PIXEL_FORMAT_ABGR_FP_16161616:
case COGL_PIXEL_FORMAT_RGBA_FP_16161616_PRE:
case COGL_PIXEL_FORMAT_BGRA_FP_16161616_PRE:
case COGL_PIXEL_FORMAT_ARGB_FP_16161616_PRE:
case COGL_PIXEL_FORMAT_ABGR_FP_16161616_PRE:
G_PASTE (_cogl_unpack_argb_fp_16161616_, component_size) (src, dst, width);
break;
case COGL_PIXEL_FORMAT_DEPTH_16: case COGL_PIXEL_FORMAT_DEPTH_16:
case COGL_PIXEL_FORMAT_DEPTH_32: case COGL_PIXEL_FORMAT_DEPTH_32:
case COGL_PIXEL_FORMAT_DEPTH_24_STENCIL_8: case COGL_PIXEL_FORMAT_DEPTH_24_STENCIL_8:
@@ -432,10 +414,10 @@ G_PASTE (_cogl_unpack_, component_size) (CoglPixelFormat format,
#define PACK_1(b) PACK_SIZE (b, 1) #define PACK_1(b) PACK_SIZE (b, 1)
#define PACK_2(b) PACK_SIZE (b, 3) #define PACK_2(b) PACK_SIZE (b, 3)
#define PACK_4(b) PACK_SIZE (b, 0xf) #define PACK_4(b) PACK_SIZE (b, 15)
#define PACK_5(b) PACK_SIZE (b, 0x1f) #define PACK_5(b) PACK_SIZE (b, 31)
#define PACK_6(b) PACK_SIZE (b, 0x3f) #define PACK_6(b) PACK_SIZE (b, 63)
#define PACK_10(b) PACK_SIZE (b, 0x3ff) #define PACK_10(b) PACK_SIZE (b, 1023)
inline static void inline static void
G_PASTE (_cogl_pack_a_8_, component_size) (const component_type *src, G_PASTE (_cogl_pack_a_8_, component_size) (const component_type *src,
@@ -701,14 +683,6 @@ G_PASTE (_cogl_pack_abgr_2101010_, component_size) (const component_type *src,
} }
} }
inline static void
G_PASTE (_cogl_pack_argb_fp_16161616_, component_size) (const component_type *src,
uint8_t *dst,
int width)
{
g_warning ("Not implemented");
}
#undef PACK_SIZE #undef PACK_SIZE
#undef PACK_1 #undef PACK_1
#undef PACK_2 #undef PACK_2
@@ -783,16 +757,6 @@ G_PASTE (_cogl_pack_, component_size) (CoglPixelFormat format,
case COGL_PIXEL_FORMAT_ABGR_2101010_PRE: case COGL_PIXEL_FORMAT_ABGR_2101010_PRE:
G_PASTE (_cogl_pack_abgr_2101010_, component_size) (src, dst, width); G_PASTE (_cogl_pack_abgr_2101010_, component_size) (src, dst, width);
break; break;
case COGL_PIXEL_FORMAT_RGBA_FP_16161616:
case COGL_PIXEL_FORMAT_BGRA_FP_16161616:
case COGL_PIXEL_FORMAT_ARGB_FP_16161616:
case COGL_PIXEL_FORMAT_ABGR_FP_16161616:
case COGL_PIXEL_FORMAT_RGBA_FP_16161616_PRE:
case COGL_PIXEL_FORMAT_BGRA_FP_16161616_PRE:
case COGL_PIXEL_FORMAT_ARGB_FP_16161616_PRE:
case COGL_PIXEL_FORMAT_ABGR_FP_16161616_PRE:
G_PASTE (_cogl_pack_argb_fp_16161616_, component_size) (src, dst, width);
break;
case COGL_PIXEL_FORMAT_DEPTH_16: case COGL_PIXEL_FORMAT_DEPTH_16:
case COGL_PIXEL_FORMAT_DEPTH_32: case COGL_PIXEL_FORMAT_DEPTH_32:
case COGL_PIXEL_FORMAT_DEPTH_24_STENCIL_8: case COGL_PIXEL_FORMAT_DEPTH_24_STENCIL_8:

View File

@@ -30,7 +30,6 @@
#include "cogl-config.h" #include "cogl-config.h"
#include "cogl-mutter.h"
#include "cogl-object.h" #include "cogl-object.h"
#include "cogl-private.h" #include "cogl-private.h"
#include "cogl-profile.h" #include "cogl-profile.h"
@@ -465,10 +464,3 @@ cogl_context_is_hardware_accelerated (CoglContext *context)
{ {
return context->driver_vtable->is_hardware_accelerated (context); return context->driver_vtable->is_hardware_accelerated (context);
} }
gboolean
cogl_context_format_supports_upload (CoglContext *ctx,
CoglPixelFormat format)
{
return ctx->texture_driver->format_supports_upload (ctx, format);
}

View File

@@ -48,8 +48,4 @@ void cogl_renderer_set_custom_winsys (CoglRenderer *renderer,
CoglCustomWinsysVtableGetter winsys_vtable_getter, CoglCustomWinsysVtableGetter winsys_vtable_getter,
void *user_data); void *user_data);
COGL_EXPORT
gboolean cogl_context_format_supports_upload (CoglContext *ctx,
CoglPixelFormat format);
#endif /* __COGL_MUTTER_H___ */ #endif /* __COGL_MUTTER_H___ */

View File

@@ -245,62 +245,6 @@ static const CoglPixelFormatInfo format_info_table[] = {
.aligned = 0, .aligned = 0,
.bpp = { 4 }, .bpp = { 4 },
}, },
{
.cogl_format = COGL_PIXEL_FORMAT_RGBA_FP_16161616,
.format_str = "RGBA_FP_16161616",
.n_planes = 1,
.bpp = { 8 },
.aligned = 1
},
{
.cogl_format = COGL_PIXEL_FORMAT_BGRA_FP_16161616,
.format_str = "BGRA_FP_16161616",
.n_planes = 1,
.bpp = { 8 },
.aligned = 1
},
{
.cogl_format = COGL_PIXEL_FORMAT_ARGB_FP_16161616,
.format_str = "ARGB_FP_16161616",
.n_planes = 1,
.bpp = { 8 },
.aligned = 1
},
{
.cogl_format = COGL_PIXEL_FORMAT_ABGR_FP_16161616,
.format_str = "ABGR_FP_16161616",
.n_planes = 1,
.bpp = { 8 },
.aligned = 1
},
{
.cogl_format = COGL_PIXEL_FORMAT_RGBA_FP_16161616_PRE,
.format_str = "RGBA_FP_16161616_PRE",
.n_planes = 1,
.bpp = { 8 },
.aligned = 1
},
{
.cogl_format = COGL_PIXEL_FORMAT_BGRA_FP_16161616_PRE,
.format_str = "BGRA_FP_16161616_PRE",
.n_planes = 1,
.bpp = { 8 },
.aligned = 1
},
{
.cogl_format = COGL_PIXEL_FORMAT_ARGB_FP_16161616_PRE,
.format_str = "ARGB_FP_16161616_PRE",
.n_planes = 1,
.bpp = { 8 },
.aligned = 1
},
{
.cogl_format = COGL_PIXEL_FORMAT_ABGR_FP_16161616_PRE,
.format_str = "ABGR_FP_16161616_PRE",
.n_planes = 1,
.bpp = { 8 },
.aligned = 1
},
{ {
.cogl_format = COGL_PIXEL_FORMAT_DEPTH_16, .cogl_format = COGL_PIXEL_FORMAT_DEPTH_16,
.format_str = "DEPTH_16", .format_str = "DEPTH_16",

View File

@@ -103,7 +103,7 @@ G_BEGIN_DECLS
* 7 = YUV: undefined bpp, undefined alignment * 7 = YUV: undefined bpp, undefined alignment
* 9 = 2 bpp, aligned * 9 = 2 bpp, aligned
* 10 = depth, aligned (8, 16, 24, 32, 32f) * 10 = depth, aligned (8, 16, 24, 32, 32f)
* 11 = 8 bpp fp16 * 11 = undefined
* 12 = 3 bpp, not aligned * 12 = 3 bpp, not aligned
* 13 = 4 bpp, not aligned (e.g. 2101010) * 13 = 4 bpp, not aligned (e.g. 2101010)
* 14-15 = undefined * 14-15 = undefined
@@ -168,14 +168,6 @@ G_BEGIN_DECLS
* @COGL_PIXEL_FORMAT_BGRA_1010102_PRE: Premultiplied BGRA, 32 bits, 10 bpc * @COGL_PIXEL_FORMAT_BGRA_1010102_PRE: Premultiplied BGRA, 32 bits, 10 bpc
* @COGL_PIXEL_FORMAT_ARGB_2101010_PRE: Premultiplied ARGB, 32 bits, 10 bpc * @COGL_PIXEL_FORMAT_ARGB_2101010_PRE: Premultiplied ARGB, 32 bits, 10 bpc
* @COGL_PIXEL_FORMAT_ABGR_2101010_PRE: Premultiplied ABGR, 32 bits, 10 bpc * @COGL_PIXEL_FORMAT_ABGR_2101010_PRE: Premultiplied ABGR, 32 bits, 10 bpc
* @COGL_PIXEL_FORMAT_RGBA_FP_16161616: RGBA half floating point, 64 bit
* @COGL_PIXEL_FORMAT_BGRA_FP_16161616: BGRA half floating point, 64 bit
* @COGL_PIXEL_FORMAT_ARGB_FP_16161616: ARGB half floating point, 64 bit
* @COGL_PIXEL_FORMAT_ABGR_FP_16161616: ABGR half floating point, 64 bit
* @COGL_PIXEL_FORMAT_RGBA_FP_16161616_PRE: Premultiplied RGBA half floating point, 64 bit
* @COGL_PIXEL_FORMAT_BGRA_FP_16161616_PRE: Premultiplied BGRA half floating point, 64 bit
* @COGL_PIXEL_FORMAT_ARGB_FP_16161616_PRE: Premultiplied ARGB half floating point, 64 bit
* @COGL_PIXEL_FORMAT_ABGR_FP_16161616_PRE: Premultiplied ABGR half floating point, 64 bit
* *
* Pixel formats used by Cogl. For the formats with a byte per * Pixel formats used by Cogl. For the formats with a byte per
* component, the order of the components specify the order in * component, the order of the components specify the order in
@@ -224,11 +216,6 @@ typedef enum /*< prefix=COGL_PIXEL_FORMAT >*/
COGL_PIXEL_FORMAT_ARGB_2101010 = (13 | COGL_A_BIT | COGL_AFIRST_BIT), COGL_PIXEL_FORMAT_ARGB_2101010 = (13 | COGL_A_BIT | COGL_AFIRST_BIT),
COGL_PIXEL_FORMAT_ABGR_2101010 = (13 | COGL_A_BIT | COGL_BGR_BIT | COGL_AFIRST_BIT), COGL_PIXEL_FORMAT_ABGR_2101010 = (13 | COGL_A_BIT | COGL_BGR_BIT | COGL_AFIRST_BIT),
COGL_PIXEL_FORMAT_RGBA_FP_16161616 = (11 | COGL_A_BIT),
COGL_PIXEL_FORMAT_BGRA_FP_16161616 = (11 | COGL_A_BIT | COGL_BGR_BIT),
COGL_PIXEL_FORMAT_ARGB_FP_16161616 = (11 | COGL_A_BIT | COGL_AFIRST_BIT),
COGL_PIXEL_FORMAT_ABGR_FP_16161616 = (11 | COGL_A_BIT | COGL_BGR_BIT | COGL_AFIRST_BIT),
COGL_PIXEL_FORMAT_RGBA_8888_PRE = (3 | COGL_A_BIT | COGL_PREMULT_BIT), COGL_PIXEL_FORMAT_RGBA_8888_PRE = (3 | COGL_A_BIT | COGL_PREMULT_BIT),
COGL_PIXEL_FORMAT_BGRA_8888_PRE = (3 | COGL_A_BIT | COGL_PREMULT_BIT | COGL_BGR_BIT), COGL_PIXEL_FORMAT_BGRA_8888_PRE = (3 | COGL_A_BIT | COGL_PREMULT_BIT | COGL_BGR_BIT),
COGL_PIXEL_FORMAT_ARGB_8888_PRE = (3 | COGL_A_BIT | COGL_PREMULT_BIT | COGL_AFIRST_BIT), COGL_PIXEL_FORMAT_ARGB_8888_PRE = (3 | COGL_A_BIT | COGL_PREMULT_BIT | COGL_AFIRST_BIT),
@@ -241,11 +228,6 @@ typedef enum /*< prefix=COGL_PIXEL_FORMAT >*/
COGL_PIXEL_FORMAT_ARGB_2101010_PRE = (COGL_PIXEL_FORMAT_ARGB_2101010 | COGL_PREMULT_BIT), COGL_PIXEL_FORMAT_ARGB_2101010_PRE = (COGL_PIXEL_FORMAT_ARGB_2101010 | COGL_PREMULT_BIT),
COGL_PIXEL_FORMAT_ABGR_2101010_PRE = (COGL_PIXEL_FORMAT_ABGR_2101010 | COGL_PREMULT_BIT), COGL_PIXEL_FORMAT_ABGR_2101010_PRE = (COGL_PIXEL_FORMAT_ABGR_2101010 | COGL_PREMULT_BIT),
COGL_PIXEL_FORMAT_RGBA_FP_16161616_PRE = (11 | COGL_A_BIT | COGL_PREMULT_BIT),
COGL_PIXEL_FORMAT_BGRA_FP_16161616_PRE = (11 | COGL_A_BIT | COGL_PREMULT_BIT | COGL_BGR_BIT),
COGL_PIXEL_FORMAT_ARGB_FP_16161616_PRE = (11 | COGL_A_BIT | COGL_PREMULT_BIT | COGL_AFIRST_BIT),
COGL_PIXEL_FORMAT_ABGR_FP_16161616_PRE = (11 | COGL_A_BIT | COGL_PREMULT_BIT | COGL_BGR_BIT | COGL_AFIRST_BIT),
COGL_PIXEL_FORMAT_DEPTH_16 = (9 | COGL_DEPTH_BIT), COGL_PIXEL_FORMAT_DEPTH_16 = (9 | COGL_DEPTH_BIT),
COGL_PIXEL_FORMAT_DEPTH_32 = (3 | COGL_DEPTH_BIT), COGL_PIXEL_FORMAT_DEPTH_32 = (3 | COGL_DEPTH_BIT),

View File

@@ -46,8 +46,6 @@ typedef enum
COGL_PRIVATE_FEATURE_EXT_PACKED_DEPTH_STENCIL, COGL_PRIVATE_FEATURE_EXT_PACKED_DEPTH_STENCIL,
COGL_PRIVATE_FEATURE_OES_PACKED_DEPTH_STENCIL, COGL_PRIVATE_FEATURE_OES_PACKED_DEPTH_STENCIL,
COGL_PRIVATE_FEATURE_TEXTURE_FORMAT_BGRA8888, COGL_PRIVATE_FEATURE_TEXTURE_FORMAT_BGRA8888,
COGL_PRIVATE_FEATURE_TEXTURE_FORMAT_RGBA1010102,
COGL_PRIVATE_FEATURE_TEXTURE_FORMAT_HALF_FLOAT,
COGL_PRIVATE_FEATURE_UNPACK_SUBIMAGE, COGL_PRIVATE_FEATURE_UNPACK_SUBIMAGE,
COGL_PRIVATE_FEATURE_SAMPLER_OBJECTS, COGL_PRIVATE_FEATURE_SAMPLER_OBJECTS,
COGL_PRIVATE_FEATURE_READ_PIXELS_ANY_FORMAT, COGL_PRIVATE_FEATURE_READ_PIXELS_ANY_FORMAT,

View File

@@ -37,6 +37,8 @@ struct _CoglSwapChain
{ {
CoglObject _parent; CoglObject _parent;
gboolean has_alpha;
int length; int length;
}; };

View File

@@ -59,6 +59,13 @@ cogl_swap_chain_new (void)
return _cogl_swap_chain_object_new (swap_chain); return _cogl_swap_chain_object_new (swap_chain);
} }
void
cogl_swap_chain_set_has_alpha (CoglSwapChain *swap_chain,
gboolean has_alpha)
{
swap_chain->has_alpha = has_alpha;
}
void void
cogl_swap_chain_set_length (CoglSwapChain *swap_chain, cogl_swap_chain_set_length (CoglSwapChain *swap_chain,
int length) int length)

View File

@@ -128,11 +128,6 @@ struct _CoglTextureDriver
int width, int width,
int height); int height);
gboolean
(* format_supports_upload) (CoglContext *ctx,
CoglPixelFormat format);
/* /*
* The driver may impose constraints on what formats can be used to store * The driver may impose constraints on what formats can be used to store
* texture data read from textures. For example GLES currently only supports * texture data read from textures. For example GLES currently only supports

View File

@@ -428,6 +428,10 @@ typedef enum _CoglWinsysFeature
* framebuffers at the same time. */ * framebuffers at the same time. */
COGL_WINSYS_FEATURE_MULTIPLE_ONSCREEN, COGL_WINSYS_FEATURE_MULTIPLE_ONSCREEN,
/* Available if onscreen framebuffer swaps can be automatically
* throttled to the vblank frequency. */
COGL_WINSYS_FEATURE_SWAP_THROTTLE,
/* Available if its possible to query a counter that /* Available if its possible to query a counter that
* increments at each vblank. */ * increments at each vblank. */
COGL_WINSYS_FEATURE_VBLANK_COUNTER, COGL_WINSYS_FEATURE_VBLANK_COUNTER,

View File

@@ -288,31 +288,6 @@ _cogl_driver_pixel_format_to_gl (CoglContext *context,
gltype = GL_UNSIGNED_SHORT_5_5_5_1; gltype = GL_UNSIGNED_SHORT_5_5_5_1;
break; break;
case COGL_PIXEL_FORMAT_RGBA_FP_16161616:
case COGL_PIXEL_FORMAT_RGBA_FP_16161616_PRE:
glintformat = GL_RGBA;
glformat = GL_RGBA;
gltype = GL_HALF_FLOAT;
break;
case COGL_PIXEL_FORMAT_BGRA_FP_16161616:
case COGL_PIXEL_FORMAT_BGRA_FP_16161616_PRE:
glintformat = GL_RGBA;
glformat = GL_BGRA;
gltype = GL_HALF_FLOAT;
break;
case COGL_PIXEL_FORMAT_ARGB_FP_16161616:
case COGL_PIXEL_FORMAT_ARGB_FP_16161616_PRE:
glintformat = GL_RGBA;
glformat = GL_BGRA;
gltype = GL_HALF_FLOAT;
break;
case COGL_PIXEL_FORMAT_ABGR_FP_16161616:
case COGL_PIXEL_FORMAT_ABGR_FP_16161616_PRE:
glintformat = GL_RGBA;
glformat = GL_RGBA;
gltype = GL_HALF_FLOAT;
break;
case COGL_PIXEL_FORMAT_DEPTH_16: case COGL_PIXEL_FORMAT_DEPTH_16:
glintformat = GL_DEPTH_COMPONENT16; glintformat = GL_DEPTH_COMPONENT16;
glformat = GL_DEPTH_COMPONENT; glformat = GL_DEPTH_COMPONENT;
@@ -531,14 +506,6 @@ _cogl_driver_update_features (CoglContext *ctx,
COGL_FEATURE_ID_TEXTURE_RG, COGL_FEATURE_ID_TEXTURE_RG,
TRUE); TRUE);
COGL_FLAGS_SET (private_features,
COGL_PRIVATE_FEATURE_TEXTURE_FORMAT_RGBA1010102, TRUE);
if (COGL_CHECK_GL_VERSION (gl_major, gl_minor, 3, 0))
COGL_FLAGS_SET (private_features,
COGL_PRIVATE_FEATURE_TEXTURE_FORMAT_HALF_FLOAT,
TRUE);
/* Cache features */ /* Cache features */
for (i = 0; i < G_N_ELEMENTS (private_features); i++) for (i = 0; i < G_N_ELEMENTS (private_features); i++)
ctx->private_features[i] |= private_features[i]; ctx->private_features[i] |= private_features[i];

View File

@@ -396,64 +396,6 @@ _cogl_texture_driver_size_supported (CoglContext *ctx,
return new_width != 0; return new_width != 0;
} }
static gboolean
_cogl_texture_driver_upload_supported (CoglContext *ctx,
CoglPixelFormat format)
{
switch (format)
{
case COGL_PIXEL_FORMAT_A_8:
case COGL_PIXEL_FORMAT_G_8:
case COGL_PIXEL_FORMAT_RG_88:
case COGL_PIXEL_FORMAT_BGRA_8888:
case COGL_PIXEL_FORMAT_BGRA_8888_PRE:
case COGL_PIXEL_FORMAT_RGB_888:
case COGL_PIXEL_FORMAT_BGR_888:
case COGL_PIXEL_FORMAT_RGBA_1010102:
case COGL_PIXEL_FORMAT_RGBA_1010102_PRE:
case COGL_PIXEL_FORMAT_BGRA_1010102:
case COGL_PIXEL_FORMAT_BGRA_1010102_PRE:
case COGL_PIXEL_FORMAT_ABGR_2101010:
case COGL_PIXEL_FORMAT_ABGR_2101010_PRE:
case COGL_PIXEL_FORMAT_ARGB_2101010:
case COGL_PIXEL_FORMAT_ARGB_2101010_PRE:
case COGL_PIXEL_FORMAT_RGBA_8888:
case COGL_PIXEL_FORMAT_RGBA_8888_PRE:
case COGL_PIXEL_FORMAT_ARGB_8888:
case COGL_PIXEL_FORMAT_ARGB_8888_PRE:
case COGL_PIXEL_FORMAT_ABGR_8888:
case COGL_PIXEL_FORMAT_ABGR_8888_PRE:
case COGL_PIXEL_FORMAT_RGB_565:
case COGL_PIXEL_FORMAT_RGBA_4444:
case COGL_PIXEL_FORMAT_RGBA_4444_PRE:
case COGL_PIXEL_FORMAT_RGBA_5551:
case COGL_PIXEL_FORMAT_RGBA_5551_PRE:
return TRUE;
case COGL_PIXEL_FORMAT_BGRA_FP_16161616:
case COGL_PIXEL_FORMAT_ARGB_FP_16161616:
case COGL_PIXEL_FORMAT_ABGR_FP_16161616:
case COGL_PIXEL_FORMAT_BGRA_FP_16161616_PRE:
case COGL_PIXEL_FORMAT_ARGB_FP_16161616_PRE:
case COGL_PIXEL_FORMAT_ABGR_FP_16161616_PRE:
case COGL_PIXEL_FORMAT_RGBA_FP_16161616:
case COGL_PIXEL_FORMAT_RGBA_FP_16161616_PRE:
if (_cogl_has_private_feature
(ctx, COGL_PRIVATE_FEATURE_TEXTURE_FORMAT_HALF_FLOAT))
return TRUE;
else
return FALSE;
case COGL_PIXEL_FORMAT_DEPTH_16:
case COGL_PIXEL_FORMAT_DEPTH_32:
case COGL_PIXEL_FORMAT_DEPTH_24_STENCIL_8:
case COGL_PIXEL_FORMAT_ANY:
case COGL_PIXEL_FORMAT_YUV:
return TRUE;
}
g_assert_not_reached ();
return FALSE;
}
static CoglPixelFormat static CoglPixelFormat
_cogl_texture_driver_find_best_gl_get_data_format _cogl_texture_driver_find_best_gl_get_data_format
(CoglContext *context, (CoglContext *context,
@@ -477,6 +419,5 @@ _cogl_texture_driver_gl =
_cogl_texture_driver_prep_gl_for_pixels_download, _cogl_texture_driver_prep_gl_for_pixels_download,
_cogl_texture_driver_gl_get_tex_image, _cogl_texture_driver_gl_get_tex_image,
_cogl_texture_driver_size_supported, _cogl_texture_driver_size_supported,
_cogl_texture_driver_upload_supported,
_cogl_texture_driver_find_best_gl_get_data_format _cogl_texture_driver_find_best_gl_get_data_format
}; };

View File

@@ -56,12 +56,6 @@
#ifndef GL_RG8 #ifndef GL_RG8
#define GL_RG8 0x822B #define GL_RG8 0x822B
#endif #endif
#ifndef GL_UNSIGNED_INT_2_10_10_10_REV_EXT
#define GL_UNSIGNED_INT_2_10_10_10_REV_EXT 0x8368
#endif
#ifndef GL_HALF_FLOAT_OES
#define GL_HALF_FLOAT_OES 0x8D61
#endif
static gboolean static gboolean
_cogl_driver_pixel_format_from_gl_internal (CoglContext *context, _cogl_driver_pixel_format_from_gl_internal (CoglContext *context,
@@ -144,44 +138,21 @@ _cogl_driver_pixel_format_to_gl (CoglContext *context,
required_format = COGL_PIXEL_FORMAT_RGB_888; required_format = COGL_PIXEL_FORMAT_RGB_888;
break; break;
case COGL_PIXEL_FORMAT_RGBA_1010102: /* Just one 32-bit ordering supported */
case COGL_PIXEL_FORMAT_RGBA_1010102_PRE:
#if G_BYTE_ORDER == G_LITTLE_ENDIAN
if (_cogl_has_private_feature
(context, COGL_PRIVATE_FEATURE_TEXTURE_FORMAT_RGBA1010102))
{
glintformat = GL_RGBA;
glformat = GL_RGBA;
gltype = GL_UNSIGNED_INT_2_10_10_10_REV_EXT;
break;
}
#endif
case COGL_PIXEL_FORMAT_BGRA_1010102:
case COGL_PIXEL_FORMAT_BGRA_1010102_PRE:
case COGL_PIXEL_FORMAT_ABGR_2101010:
case COGL_PIXEL_FORMAT_ABGR_2101010_PRE:
case COGL_PIXEL_FORMAT_ARGB_2101010:
case COGL_PIXEL_FORMAT_ARGB_2101010_PRE:
#if G_BYTE_ORDER == G_LITTLE_ENDIAN
if (_cogl_has_private_feature
(context, COGL_PRIVATE_FEATURE_TEXTURE_FORMAT_RGBA1010102))
{
glintformat = GL_RGBA;
glformat = GL_RGBA;
gltype = GL_UNSIGNED_INT_2_10_10_10_REV_EXT;
required_format = COGL_PIXEL_FORMAT_RGBA_1010102;
required_format |= (format & COGL_PREMULT_BIT);
break;
}
#endif
G_GNUC_FALLTHROUGH;
case COGL_PIXEL_FORMAT_RGBA_8888: case COGL_PIXEL_FORMAT_RGBA_8888:
case COGL_PIXEL_FORMAT_RGBA_8888_PRE: case COGL_PIXEL_FORMAT_RGBA_8888_PRE:
case COGL_PIXEL_FORMAT_ARGB_8888: case COGL_PIXEL_FORMAT_ARGB_8888:
case COGL_PIXEL_FORMAT_ARGB_8888_PRE: case COGL_PIXEL_FORMAT_ARGB_8888_PRE:
case COGL_PIXEL_FORMAT_ABGR_8888: case COGL_PIXEL_FORMAT_ABGR_8888:
case COGL_PIXEL_FORMAT_ABGR_8888_PRE: case COGL_PIXEL_FORMAT_ABGR_8888_PRE:
case COGL_PIXEL_FORMAT_RGBA_1010102:
case COGL_PIXEL_FORMAT_RGBA_1010102_PRE:
case COGL_PIXEL_FORMAT_BGRA_1010102:
case COGL_PIXEL_FORMAT_BGRA_1010102_PRE:
case COGL_PIXEL_FORMAT_ABGR_2101010:
case COGL_PIXEL_FORMAT_ABGR_2101010_PRE:
case COGL_PIXEL_FORMAT_ARGB_2101010:
case COGL_PIXEL_FORMAT_ARGB_2101010_PRE:
glintformat = GL_RGBA; glintformat = GL_RGBA;
glformat = GL_RGBA; glformat = GL_RGBA;
gltype = GL_UNSIGNED_BYTE; gltype = GL_UNSIGNED_BYTE;
@@ -210,26 +181,6 @@ _cogl_driver_pixel_format_to_gl (CoglContext *context,
gltype = GL_UNSIGNED_SHORT_5_5_5_1; gltype = GL_UNSIGNED_SHORT_5_5_5_1;
break; break;
case COGL_PIXEL_FORMAT_BGRA_FP_16161616:
case COGL_PIXEL_FORMAT_ARGB_FP_16161616:
case COGL_PIXEL_FORMAT_ABGR_FP_16161616:
case COGL_PIXEL_FORMAT_BGRA_FP_16161616_PRE:
case COGL_PIXEL_FORMAT_ARGB_FP_16161616_PRE:
case COGL_PIXEL_FORMAT_ABGR_FP_16161616_PRE:
g_warning ("Unhandled 16 bpc pixel format used");
G_GNUC_FALLTHROUGH;
case COGL_PIXEL_FORMAT_RGBA_FP_16161616:
case COGL_PIXEL_FORMAT_RGBA_FP_16161616_PRE:
if (!_cogl_has_private_feature
(context, COGL_PRIVATE_FEATURE_TEXTURE_FORMAT_HALF_FLOAT))
g_warning ("Missing 16 bpc half float extension");
glintformat = GL_RGBA;
glformat = GL_RGBA;
gltype = GL_HALF_FLOAT_OES;
break;
case COGL_PIXEL_FORMAT_DEPTH_16: case COGL_PIXEL_FORMAT_DEPTH_16:
glintformat = GL_DEPTH_COMPONENT; glintformat = GL_DEPTH_COMPONENT;
glformat = GL_DEPTH_COMPONENT; glformat = GL_DEPTH_COMPONENT;
@@ -404,14 +355,6 @@ _cogl_driver_update_features (CoglContext *context,
COGL_FLAGS_SET (private_features, COGL_FLAGS_SET (private_features,
COGL_PRIVATE_FEATURE_TEXTURE_FORMAT_BGRA8888, TRUE); COGL_PRIVATE_FEATURE_TEXTURE_FORMAT_BGRA8888, TRUE);
if (_cogl_check_extension ("GL_EXT_texture_type_2_10_10_10_REV", gl_extensions))
COGL_FLAGS_SET (private_features,
COGL_PRIVATE_FEATURE_TEXTURE_FORMAT_RGBA1010102, TRUE);
if (_cogl_check_extension ("GL_OES_texture_half_float", gl_extensions))
COGL_FLAGS_SET (private_features,
COGL_PRIVATE_FEATURE_TEXTURE_FORMAT_HALF_FLOAT, TRUE);
if (_cogl_check_extension ("GL_EXT_unpack_subimage", gl_extensions)) if (_cogl_check_extension ("GL_EXT_unpack_subimage", gl_extensions))
COGL_FLAGS_SET (private_features, COGL_FLAGS_SET (private_features,
COGL_PRIVATE_FEATURE_UNPACK_SUBIMAGE, TRUE); COGL_PRIVATE_FEATURE_UNPACK_SUBIMAGE, TRUE);

View File

@@ -439,75 +439,6 @@ _cogl_texture_driver_size_supported (CoglContext *ctx,
return width <= max_size && height <= max_size; return width <= max_size && height <= max_size;
} }
static gboolean
_cogl_texture_driver_upload_supported (CoglContext *ctx,
CoglPixelFormat format)
{
switch (format)
{
case COGL_PIXEL_FORMAT_A_8:
case COGL_PIXEL_FORMAT_G_8:
case COGL_PIXEL_FORMAT_RG_88:
case COGL_PIXEL_FORMAT_BGRA_8888:
case COGL_PIXEL_FORMAT_BGRA_8888_PRE:
case COGL_PIXEL_FORMAT_RGB_888:
case COGL_PIXEL_FORMAT_BGR_888:
return TRUE;
case COGL_PIXEL_FORMAT_RGBA_1010102:
case COGL_PIXEL_FORMAT_RGBA_1010102_PRE:
case COGL_PIXEL_FORMAT_BGRA_1010102:
case COGL_PIXEL_FORMAT_BGRA_1010102_PRE:
case COGL_PIXEL_FORMAT_ABGR_2101010:
case COGL_PIXEL_FORMAT_ABGR_2101010_PRE:
case COGL_PIXEL_FORMAT_ARGB_2101010:
case COGL_PIXEL_FORMAT_ARGB_2101010_PRE:
#if G_BYTE_ORDER == G_LITTLE_ENDIAN
if (_cogl_has_private_feature
(ctx, COGL_PRIVATE_FEATURE_TEXTURE_FORMAT_RGBA1010102))
return TRUE;
else
return FALSE;
#else
return FALSE;
#endif
case COGL_PIXEL_FORMAT_RGBA_8888:
case COGL_PIXEL_FORMAT_RGBA_8888_PRE:
case COGL_PIXEL_FORMAT_ARGB_8888:
case COGL_PIXEL_FORMAT_ARGB_8888_PRE:
case COGL_PIXEL_FORMAT_ABGR_8888:
case COGL_PIXEL_FORMAT_ABGR_8888_PRE:
case COGL_PIXEL_FORMAT_RGB_565:
case COGL_PIXEL_FORMAT_RGBA_4444:
case COGL_PIXEL_FORMAT_RGBA_4444_PRE:
case COGL_PIXEL_FORMAT_RGBA_5551:
case COGL_PIXEL_FORMAT_RGBA_5551_PRE:
return TRUE;
case COGL_PIXEL_FORMAT_BGRA_FP_16161616:
case COGL_PIXEL_FORMAT_ARGB_FP_16161616:
case COGL_PIXEL_FORMAT_ABGR_FP_16161616:
case COGL_PIXEL_FORMAT_BGRA_FP_16161616_PRE:
case COGL_PIXEL_FORMAT_ARGB_FP_16161616_PRE:
case COGL_PIXEL_FORMAT_ABGR_FP_16161616_PRE:
return FALSE;
case COGL_PIXEL_FORMAT_RGBA_FP_16161616:
case COGL_PIXEL_FORMAT_RGBA_FP_16161616_PRE:
if (_cogl_has_private_feature
(ctx, COGL_PRIVATE_FEATURE_TEXTURE_FORMAT_HALF_FLOAT))
return TRUE;
else
return FALSE;
case COGL_PIXEL_FORMAT_DEPTH_16:
case COGL_PIXEL_FORMAT_DEPTH_32:
case COGL_PIXEL_FORMAT_DEPTH_24_STENCIL_8:
case COGL_PIXEL_FORMAT_ANY:
case COGL_PIXEL_FORMAT_YUV:
return TRUE;
}
g_assert_not_reached ();
return FALSE;
}
static CoglPixelFormat static CoglPixelFormat
_cogl_texture_driver_find_best_gl_get_data_format _cogl_texture_driver_find_best_gl_get_data_format
(CoglContext *context, (CoglContext *context,
@@ -532,6 +463,5 @@ _cogl_texture_driver_gles =
_cogl_texture_driver_prep_gl_for_pixels_download, _cogl_texture_driver_prep_gl_for_pixels_download,
_cogl_texture_driver_gl_get_tex_image, _cogl_texture_driver_gl_get_tex_image,
_cogl_texture_driver_size_supported, _cogl_texture_driver_size_supported,
_cogl_texture_driver_upload_supported,
_cogl_texture_driver_find_best_gl_get_data_format _cogl_texture_driver_find_best_gl_get_data_format
}; };

View File

@@ -50,6 +50,7 @@ typedef struct _CoglGLXDisplay
CoglGLXCachedConfig glx_cached_configs[COGL_GLX_N_CACHED_CONFIGS]; CoglGLXCachedConfig glx_cached_configs[COGL_GLX_N_CACHED_CONFIGS];
gboolean found_fbconfig; gboolean found_fbconfig;
gboolean fbconfig_has_rgba_visual;
gboolean is_direct; gboolean is_direct;
gboolean have_vblank_counter; gboolean have_vblank_counter;
gboolean can_vblank_wait; gboolean can_vblank_wait;

View File

@@ -223,7 +223,7 @@ egl_attributes_from_framebuffer_config (CoglDisplay *display,
attributes[i++] = 1; attributes[i++] = 1;
attributes[i++] = EGL_ALPHA_SIZE; attributes[i++] = EGL_ALPHA_SIZE;
attributes[i++] = EGL_DONT_CARE; attributes[i++] = config->swap_chain->has_alpha ? 1 : EGL_DONT_CARE;
attributes[i++] = EGL_DEPTH_SIZE; attributes[i++] = EGL_DEPTH_SIZE;
attributes[i++] = 1; attributes[i++] = 1;

View File

@@ -130,7 +130,7 @@ COGL_WINSYS_FEATURE_BEGIN (255, 255,
"SGI\0", "SGI\0",
"swap_control\0", "swap_control\0",
0, 0,
0) COGL_WINSYS_FEATURE_SWAP_THROTTLE)
COGL_WINSYS_FEATURE_FUNCTION (int, glXSwapInterval, COGL_WINSYS_FEATURE_FUNCTION (int, glXSwapInterval,
(int interval)) (int interval))
COGL_WINSYS_FEATURE_END () COGL_WINSYS_FEATURE_END ()

View File

@@ -885,7 +885,7 @@ glx_attributes_from_framebuffer_config (CoglDisplay *display,
attributes[i++] = GLX_BLUE_SIZE; attributes[i++] = GLX_BLUE_SIZE;
attributes[i++] = 1; attributes[i++] = 1;
attributes[i++] = GLX_ALPHA_SIZE; attributes[i++] = GLX_ALPHA_SIZE;
attributes[i++] = GLX_DONT_CARE; attributes[i++] = config->swap_chain->has_alpha ? 1 : GLX_DONT_CARE;
attributes[i++] = GLX_DEPTH_SIZE; attributes[i++] = GLX_DEPTH_SIZE;
attributes[i++] = 1; attributes[i++] = 1;
attributes[i++] = GLX_STENCIL_SIZE; attributes[i++] = GLX_STENCIL_SIZE;
@@ -944,8 +944,40 @@ find_fbconfig (CoglDisplay *display,
goto done; goto done;
} }
COGL_NOTE (WINSYS, "Using the first available FBConfig"); if (config->swap_chain->has_alpha)
*config_ret = configs[0]; {
int i;
for (i = 0; i < n_configs; i++)
{
XVisualInfo *vinfo;
vinfo = glx_renderer->glXGetVisualFromFBConfig (xlib_renderer->xdpy,
configs[i]);
if (vinfo == NULL)
continue;
if (vinfo->depth == 32 &&
(vinfo->red_mask | vinfo->green_mask | vinfo->blue_mask)
!= 0xffffffff)
{
COGL_NOTE (WINSYS, "Found an ARGB FBConfig [index:%d]", i);
*config_ret = configs[i];
goto done;
}
}
g_set_error_literal (error, COGL_WINSYS_ERROR,
COGL_WINSYS_ERROR_CREATE_CONTEXT,
"Unable to find fbconfig with rgba visual");
ret = FALSE;
goto done;
}
else
{
COGL_NOTE (WINSYS, "Using the first available FBConfig");
*config_ret = configs[0];
}
done: done:
XFree (configs); XFree (configs);
@@ -1027,6 +1059,8 @@ create_context (CoglDisplay *display, GError **error)
CoglXlibRenderer *xlib_renderer = CoglXlibRenderer *xlib_renderer =
_cogl_xlib_renderer_get_data (display->renderer); _cogl_xlib_renderer_get_data (display->renderer);
CoglGLXRenderer *glx_renderer = display->renderer->winsys; CoglGLXRenderer *glx_renderer = display->renderer->winsys;
gboolean support_transparent_windows =
display->onscreen_template->config.swap_chain->has_alpha;
GLXFBConfig config; GLXFBConfig config;
GError *fbconfig_error = NULL; GError *fbconfig_error = NULL;
XSetWindowAttributes attrs; XSetWindowAttributes attrs;
@@ -1050,6 +1084,7 @@ create_context (CoglDisplay *display, GError **error)
} }
glx_display->fbconfig = config; glx_display->fbconfig = config;
glx_display->fbconfig_has_rgba_visual = support_transparent_windows;
COGL_NOTE (WINSYS, "Creating GLX Context (display: %p)", COGL_NOTE (WINSYS, "Creating GLX Context (display: %p)",
xlib_renderer->xdpy); xlib_renderer->xdpy);

View File

@@ -162,7 +162,7 @@ on_paint (ClutterActor *actor,
/* Comment this out if you want visual feedback for what this test paints */ /* Comment this out if you want visual feedback for what this test paints */
#if 1 #if 1
clutter_test_quit (); clutter_main_quit ();
#endif #endif
} }
@@ -191,7 +191,7 @@ test_multitexture (TestUtilsGTestFixture *fixture,
clutter_container_add_actor (CLUTTER_CONTAINER (stage), group); clutter_container_add_actor (CLUTTER_CONTAINER (stage), group);
/* We force continuous redrawing incase someone comments out the /* We force continuous redrawing incase someone comments out the
* clutter_test_quit and wants visual feedback for the test since we * clutter_main_quit and wants visual feedback for the test since we
* wont be doing anything else that will trigger redrawing. */ * wont be doing anything else that will trigger redrawing. */
idle_source = g_idle_add (queue_redraw, stage); idle_source = g_idle_add (queue_redraw, stage);
@@ -199,7 +199,7 @@ test_multitexture (TestUtilsGTestFixture *fixture,
clutter_actor_show (stage); clutter_actor_show (stage);
clutter_test_main (); clutter_main ();
g_clear_handle_id (&idle_source, g_source_remove); g_clear_handle_id (&idle_source, g_source_remove);

View File

@@ -137,7 +137,7 @@ on_paint (ClutterActor *actor,
/* Comment this out if you want visual feedback of what this test /* Comment this out if you want visual feedback of what this test
* paints. * paints.
*/ */
clutter_test_quit (); clutter_main_quit ();
} }
static gboolean static gboolean
@@ -165,7 +165,7 @@ test_readpixels (TestUtilsGTestFixture *fixture,
g_signal_connect_after (stage, "paint", G_CALLBACK (on_paint), NULL); g_signal_connect_after (stage, "paint", G_CALLBACK (on_paint), NULL);
clutter_actor_show (stage); clutter_actor_show (stage);
clutter_test_main (); clutter_main ();
g_clear_handle_id (&idle_source, g_source_remove); g_clear_handle_id (&idle_source, g_source_remove);

View File

@@ -92,7 +92,7 @@ on_paint (ClutterActor *actor,
/* Comment this out if you want visual feedback for what this test paints */ /* Comment this out if you want visual feedback for what this test paints */
#if 1 #if 1
clutter_test_quit (); clutter_main_quit ();
#endif #endif
} }
@@ -129,7 +129,7 @@ test_texture_mipmaps (TestUtilsGTestFixture *fixture,
clutter_actor_show (stage); clutter_actor_show (stage);
clutter_test_main (); clutter_main ();
g_clear_handle_id (&idle_source, g_source_remove); g_clear_handle_id (&idle_source, g_source_remove);

View File

@@ -183,7 +183,7 @@ on_paint (ClutterActor *actor,
update_pixmap (state); update_pixmap (state);
else if (big_updated) else if (big_updated)
/* If we successfully got the update then the test is over */ /* If we successfully got the update then the test is over */
clutter_test_quit (); clutter_main_quit ();
} }
state->frame_count++; state->frame_count++;
@@ -226,7 +226,7 @@ test_texture_pixmap_x11 (TestUtilsGTestFixture *fixture,
clutter_actor_show (state.stage); clutter_actor_show (state.stage);
clutter_test_main (); clutter_main ();
g_clear_signal_handler (&paint_handler, state.stage); g_clear_signal_handler (&paint_handler, state.stage);

View File

@@ -375,7 +375,7 @@ on_paint (ClutterActor *actor,
/* Comment this out if you want visual feedback of what this test /* Comment this out if you want visual feedback of what this test
* paints. * paints.
*/ */
clutter_test_quit (); clutter_main_quit ();
} }
static gboolean static gboolean
@@ -403,7 +403,7 @@ test_viewport (TestUtilsGTestFixture *fixture,
g_signal_connect_after (stage, "paint", G_CALLBACK (on_paint), NULL); g_signal_connect_after (stage, "paint", G_CALLBACK (on_paint), NULL);
clutter_actor_show (stage); clutter_actor_show (stage);
clutter_test_main (); clutter_main ();
g_clear_handle_id (&idle_source, g_source_remove); g_clear_handle_id (&idle_source, g_source_remove);

View File

@@ -75,7 +75,7 @@
For a X11 grab to be taken into account under Wayland, the client must For a X11 grab to be taken into account under Wayland, the client must
also either send a specific X11 ClientMessage to the root window or be also either send a specific X11 ClientMessage to the root window or be
among the applications allowed in key “xwayland-grab-access-rules”. among the applications white-listed in key “xwayland-grab-access-rules”.
</description> </description>
</key> </key>
@@ -91,9 +91,8 @@
Wildcards “*” and jokers “?” in the values are supported. Wildcards “*” and jokers “?” in the values are supported.
Values starting with “!” are denied, which has precedence over Values starting with “!” are blacklisted, which has precedence over
the list of values allowed, to revoke applications from the default the whitelist, to revoke applications from the default system list.
system list.
The default system list includes the following applications: The default system list includes the following applications:

View File

@@ -1,5 +1,5 @@
project('mutter', 'c', project('mutter', 'c',
version: '3.37.90', version: '3.37.3',
meson_version: '>= 0.51.0', meson_version: '>= 0.51.0',
license: 'GPLv2+' license: 'GPLv2+'
) )
@@ -42,7 +42,7 @@ udev_req = '>= 228'
gudev_req = '>= 232' gudev_req = '>= 232'
# wayland version requirements # wayland version requirements
wayland_server_req = '>= 1.18' wayland_server_req = '>= 1.13.0'
wayland_protocols_req = '>= 1.19' wayland_protocols_req = '>= 1.19'
# native backend version requirements # native backend version requirements

172
po/ca.po
View File

@@ -12,7 +12,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: metacity 2.24\n" "Project-Id-Version: metacity 2.24\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/mutter/issues\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/mutter/issues\n"
"POT-Creation-Date: 2020-05-26 13:44+0000\n" "POT-Creation-Date: 2019-08-06 00:49+0000\n"
"PO-Revision-Date: 2018-06-17 10:25+0200\n" "PO-Revision-Date: 2018-06-17 10:25+0200\n"
"Last-Translator: Jordi Mas <jmas@softcatala.org>\n" "Last-Translator: Jordi Mas <jmas@softcatala.org>\n"
"Language-Team: Catalan <tradgnome@softcatala.org>\n" "Language-Team: Catalan <tradgnome@softcatala.org>\n"
@@ -261,16 +261,16 @@ msgstr ""
#: data/org.gnome.mutter.gschema.xml.in:8 #: data/org.gnome.mutter.gschema.xml.in:8
msgid "" msgid ""
"This key will initiate the “overlay”, which is a combination window overview" "This key will initiate the “overlay”, which is a combination window overview "
" and application launching system. The default is intended to be the " "and application launching system. The default is intended to be the “Windows "
"“Windows key” on PC hardware. Its expected that this binding either the " "key” on PC hardware. Its expected that this binding either the default or "
"default or set to the empty string." "set to the empty string."
msgstr "" msgstr ""
"Aquesta tecla iniciarà l'«overlay» (superposador), el qual és una combinació" "Aquesta tecla iniciarà l'«overlay» (superposador), el qual és una combinació "
" de visualització de finestres i sistema de llançament d'aplicacions. El " "de visualització de finestres i sistema de llançament d'aplicacions. El "
"valor predeterminat és la «tecla Windows» en maquinari basat en ordinadors " "valor predeterminat és la «tecla Windows» en maquinari basat en ordinadors "
"PC. El valor d'aquesta vinculació s'espera que sigui el predeterminat o text" "PC. El valor d'aquesta vinculació s'espera que sigui el predeterminat o text "
" en blanc." "en blanc."
#: data/org.gnome.mutter.gschema.xml.in:20 #: data/org.gnome.mutter.gschema.xml.in:20
msgid "Attach modal dialogs" msgid "Attach modal dialogs"
@@ -282,9 +282,9 @@ msgid ""
"attached to the titlebar of the parent window and are moved together with " "attached to the titlebar of the parent window and are moved together with "
"the parent window." "the parent window."
msgstr "" msgstr ""
"Quan sigui «true» (cert), en lloc de tenir barres de títol independents, els" "Quan sigui «true» (cert), en lloc de tenir barres de títol independents, els "
" diàlegs modals apareixeran adjuntats a la barra de títol de la finestra " "diàlegs modals apareixeran adjuntats a la barra de títol de la finestra mare "
"mare i es mouran juntament amb aquesta." "i es mouran juntament amb aquesta."
#: data/org.gnome.mutter.gschema.xml.in:30 #: data/org.gnome.mutter.gschema.xml.in:30
msgid "Enable edge tiling when dropping windows on screen edges" msgid "Enable edge tiling when dropping windows on screen edges"
@@ -299,9 +299,9 @@ msgid ""
"area. Dropping windows on the top screen edge maximizes them completely." "area. Dropping windows on the top screen edge maximizes them completely."
msgstr "" msgstr ""
"Si s'habilita, es maximitzaran les finestres verticalment i es " "Si s'habilita, es maximitzaran les finestres verticalment i es "
"redimensionaran horitzontalment per cobrir la meitat de l'àrea disponible en" "redimensionaran horitzontalment per cobrir la meitat de l'àrea disponible en "
" deixar-les anar a les vores verticals de la pantalla. Si es deixen anar a " "deixar-les anar a les vores verticals de la pantalla. Si es deixen anar a la "
"la vora superior de la pantalla es maximitzaran completament." "vora superior de la pantalla es maximitzaran completament."
#: data/org.gnome.mutter.gschema.xml.in:40 #: data/org.gnome.mutter.gschema.xml.in:40
msgid "Workspaces are managed dynamically" msgid "Workspaces are managed dynamically"
@@ -310,8 +310,8 @@ msgstr "Els espais de treball es gestionen dinàmicament"
#: data/org.gnome.mutter.gschema.xml.in:41 #: data/org.gnome.mutter.gschema.xml.in:41
msgid "" msgid ""
"Determines whether workspaces are managed dynamically or whether theres a " "Determines whether workspaces are managed dynamically or whether theres a "
"static number of workspaces (determined by the num-workspaces key in " "static number of workspaces (determined by the num-workspaces key in org."
"org.gnome.desktop.wm.preferences)." "gnome.desktop.wm.preferences)."
msgstr "" msgstr ""
"Determina si els espais de treball es gestionen dinàmicament o hi ha un " "Determina si els espais de treball es gestionen dinàmicament o hi ha un "
"nombre determinat d'espais de treball (determinat per la clau «num-" "nombre determinat d'espais de treball (determinat per la clau «num-"
@@ -348,8 +348,8 @@ msgstr "Retarda el canvi del focus fins que s'aturi el punter"
#: data/org.gnome.mutter.gschema.xml.in:69 #: data/org.gnome.mutter.gschema.xml.in:69
msgid "" msgid ""
"If set to true, and the focus mode is either “sloppy” or “mouse” then the " "If set to true, and the focus mode is either “sloppy” or “mouse” then the "
"focus will not be changed immediately when entering a window, but only after" "focus will not be changed immediately when entering a window, but only after "
" the pointer stops moving." "the pointer stops moving."
msgstr "" msgstr ""
"Si és «true» (cert), i el mode del focus és «sloppy» o «mouse», no es " "Si és «true» (cert), i el mode del focus és «sloppy» o «mouse», no es "
"canviarà el focus immediatament quan s'entri a una finestra, només es " "canviarà el focus immediatament quan s'entri a una finestra, només es "
@@ -365,8 +365,8 @@ msgid ""
"not enough, invisible borders will be added to meet this value." "not enough, invisible borders will be added to meet this value."
msgstr "" msgstr ""
"La quantitat total de contorn arrossegable. Si els contorns visibles del " "La quantitat total de contorn arrossegable. Si els contorns visibles del "
"tema no són suficients, s'afegiran contorns invisibles per aconseguir aquest" "tema no són suficients, s'afegiran contorns invisibles per aconseguir aquest "
" valor." "valor."
#: data/org.gnome.mutter.gschema.xml.in:89 #: data/org.gnome.mutter.gschema.xml.in:89
msgid "Auto maximize nearly monitor sized windows" msgid "Auto maximize nearly monitor sized windows"
@@ -399,7 +399,6 @@ msgid "Enable experimental features"
msgstr "Habilita les funcionalitats experimentals" msgstr "Habilita les funcionalitats experimentals"
#: data/org.gnome.mutter.gschema.xml.in:108 #: data/org.gnome.mutter.gschema.xml.in:108
#, fuzzy
msgid "" msgid ""
"To enable experimental features, add the feature keyword to the list. " "To enable experimental features, add the feature keyword to the list. "
"Whether the feature requires restarting the compositor depends on the given " "Whether the feature requires restarting the compositor depends on the given "
@@ -413,14 +412,6 @@ msgid ""
"must have CAP_SYS_NICE. Requires a restart. • “autostart-xwayland” — " "must have CAP_SYS_NICE. Requires a restart. • “autostart-xwayland” — "
"initializes Xwayland lazily if there are X11 clients. Requires restart." "initializes Xwayland lazily if there are X11 clients. Requires restart."
msgstr "" msgstr ""
"Per habilitar les característiques experimentals afegiu la paraula clau de "
"la característica a la llista. Si la característica requereix reiniciar el "
"compositor depèn de la característica donada. Qualsevol característica "
"experimental no es requereix per estar disponible o configurable. No espereu"
" afegir res en aquest ajustament per ser una prova futura. Actualment les "
"paraules clau possibles • • “inici del monitor d'escala” framebuffer — fa "
"que el «mutter-start» estigui disponible per defecte als monitors lògics en "
"un espai de reinici de píxels lògic mentre que cal «ICE»"
#: data/org.gnome.mutter.gschema.xml.in:134 #: data/org.gnome.mutter.gschema.xml.in:134
msgid "Modifier to use to locate the pointer" msgid "Modifier to use to locate the pointer"
@@ -430,32 +421,19 @@ msgstr "Modificar a usar per localitzar el punter"
msgid "This key will initiate the “locate pointer” action." msgid "This key will initiate the “locate pointer” action."
msgstr "Aquesta clau inicialitzarà l'acció «locate pointer»." msgstr "Aquesta clau inicialitzarà l'acció «locate pointer»."
#: data/org.gnome.mutter.gschema.xml.in:142 #: data/org.gnome.mutter.gschema.xml.in:155
msgid "Timeout for check-alive ping"
msgstr "Temps d'espera per a la comprovació «ping alive»"
#: data/org.gnome.mutter.gschema.xml.in:143
msgid ""
"Number of milliseconds a client has to respond to a ping request in order to"
" not be detected as frozen. Using 0 will disable the alive check completely."
msgstr ""
"Nombre de mil·lisegons en què un client ha de respondre a una sol·licitud de"
" «ping» per no ser detectat com a congelat. L'ús de 0 inhabilitarà "
"completament la comprovació."
#: data/org.gnome.mutter.gschema.xml.in:165
msgid "Select window from tab popup" msgid "Select window from tab popup"
msgstr "Selecció de finestra entre les emergents d'una pestanya" msgstr "Selecció de finestra entre les emergents d'una pestanya"
#: data/org.gnome.mutter.gschema.xml.in:170 #: data/org.gnome.mutter.gschema.xml.in:160
msgid "Cancel tab popup" msgid "Cancel tab popup"
msgstr "Cancel·lació de les finestres emergents a les pestanyes" msgstr "Cancel·lació de les finestres emergents a les pestanyes"
#: data/org.gnome.mutter.gschema.xml.in:175 #: data/org.gnome.mutter.gschema.xml.in:165
msgid "Switch monitor configurations" msgid "Switch monitor configurations"
msgstr "Canvia configuracions de monitor" msgstr "Canvia configuracions de monitor"
#: data/org.gnome.mutter.gschema.xml.in:180 #: data/org.gnome.mutter.gschema.xml.in:170
msgid "Rotates the built-in monitor configuration" msgid "Rotates the built-in monitor configuration"
msgstr "Gira la configuració del monitor integrada" msgstr "Gira la configuració del monitor integrada"
@@ -513,12 +491,9 @@ msgstr "Torna a habilitar les dreceres"
#: data/org.gnome.mutter.wayland.gschema.xml.in:64 #: data/org.gnome.mutter.wayland.gschema.xml.in:64
msgid "Allow X11 grabs to lock keyboard focus with Xwayland" msgid "Allow X11 grabs to lock keyboard focus with Xwayland"
msgstr "" msgstr "Permetre la captura amb Xwayland per bloquejar el focus del teclat amb Xwayland"
"Permetre la captura amb Xwayland per bloquejar el focus del teclat amb "
"Xwayland"
#: data/org.gnome.mutter.wayland.gschema.xml.in:65 #: data/org.gnome.mutter.wayland.gschema.xml.in:65
#, fuzzy
msgid "" msgid ""
"Allow all keyboard events to be routed to X11 “override redirect” windows " "Allow all keyboard events to be routed to X11 “override redirect” windows "
"with a grab when running in Xwayland. This option is to support X11 clients " "with a grab when running in Xwayland. This option is to support X11 clients "
@@ -530,25 +505,16 @@ msgid ""
"specific X11 ClientMessage to the root window or be among the applications " "specific X11 ClientMessage to the root window or be among the applications "
"white-listed in key “xwayland-grab-access-rules”." "white-listed in key “xwayland-grab-access-rules”."
msgstr "" msgstr ""
"Permet que tots els esdeveniments de teclat s'encaminin a les finestres X11 "
"«sobredirigir redirecció» amb una captura en executar-se a Xwayland. Aquesta"
" opció és per donar suport als clients X11 que mapan una finestra «override "
"redirect» (que no rep el focus del teclat) i emeten un teclat per forçar "
"tots els esdeveniments del teclat a aquesta finestra. Aquesta opció "
"s'utilitza rarament i no té cap efecte en les finestres regulars de "
"l'enviament de X11 que poden rebre el focus del teclat segons el client "
"arrel"
#: data/org.gnome.mutter.wayland.gschema.xml.in:84 #: data/org.gnome.mutter.wayland.gschema.xml.in:84
msgid "Xwayland applications allowed to issue keyboard grabs" msgid "Xwayland applications allowed to issue keyboard grabs"
msgstr "Les aplicacions Xwayland poden capturar el teclat" msgstr "Les aplicacions Xwayland poden capturar el teclat"
#: data/org.gnome.mutter.wayland.gschema.xml.in:85 #: data/org.gnome.mutter.wayland.gschema.xml.in:85
#, fuzzy
msgid "" msgid ""
"List the resource names or resource class of X11 windows either allowed or " "List the resource names or resource class of X11 windows either allowed or "
"not allowed to issue X11 keyboard grabs under Xwayland. The resource name or" "not allowed to issue X11 keyboard grabs under Xwayland. The resource name or "
" resource class of a given X11 window can be obtained using the command " "resource class of a given X11 window can be obtained using the command "
"“xprop WM_CLASS”. Wildcards “*” and jokers “?” in the values are supported. " "“xprop WM_CLASS”. Wildcards “*” and jokers “?” in the values are supported. "
"Values starting with “!” are blacklisted, which has precedence over the " "Values starting with “!” are blacklisted, which has precedence over the "
"whitelist, to revoke applications from the default system list. The default " "whitelist, to revoke applications from the default system list. The default "
@@ -557,52 +523,46 @@ msgid ""
"using the specific keyboard shortcut defined by the keybinding key “restore-" "using the specific keyboard shortcut defined by the keybinding key “restore-"
"shortcuts”." "shortcuts”."
msgstr "" msgstr ""
"Llista els noms dels recursos o la classe de recursos de les finestres X11 "
"ja sigui permet o no permet emetre captures de teclat X11 sota Xwayland. El "
"nom dels recursos o la classe dels recursos d'una finestra X11 donada es pot"
" obtenir usant l'ordre «xprop WMCLASS». Els usuaris de les targetes "
"salvatges «*» i els bromistes «?» als valors que comencen amb «EFABD» tenen "
"prioritat sobre la llista blancaESS les aplicacions de dreceres del sistema "
"per defecte."
#. TRANSLATORS: This string refers to a button that switches between #. TRANSLATORS: This string refers to a button that switches between
#. * different modes. #. * different modes.
#: src/backends/meta-input-settings.c:2631 #.
#: src/backends/meta-input-settings.c:2531
#, c-format #, c-format
msgid "Mode Switch (Group %d)" msgid "Mode Switch (Group %d)"
msgstr "Mode de commutació (grup %d)" msgstr "Mode de commutació (grup %d)"
#. TRANSLATORS: This string refers to an action, cycles drawing tablets' #. TRANSLATORS: This string refers to an action, cycles drawing tablets'
#. * mapping through the available outputs. #. * mapping through the available outputs.
#: src/backends/meta-input-settings.c:2654 #.
#: src/backends/meta-input-settings.c:2554
msgid "Switch monitor" msgid "Switch monitor"
msgstr "Commuta el monitor" msgstr "Commuta el monitor"
#: src/backends/meta-input-settings.c:2656 #: src/backends/meta-input-settings.c:2556
msgid "Show on-screen help" msgid "Show on-screen help"
msgstr "Mostra l'ajuda en pantalla" msgstr "Mostra l'ajuda en pantalla"
#: src/backends/meta-monitor.c:226 #: src/backends/meta-monitor.c:223
msgid "Built-in display" msgid "Built-in display"
msgstr "Pantalla integrada" msgstr "Pantalla integrada"
#: src/backends/meta-monitor.c:255 #: src/backends/meta-monitor.c:252
msgid "Unknown" msgid "Unknown"
msgstr "Desconeguda" msgstr "Desconeguda"
#: src/backends/meta-monitor.c:257 #: src/backends/meta-monitor.c:254
msgid "Unknown Display" msgid "Unknown Display"
msgstr "Pantalla desconeguda" msgstr "Pantalla desconeguda"
#: src/backends/meta-monitor.c:265 #: src/backends/meta-monitor.c:262
#, c-format #, c-format
msgctxt "" msgctxt ""
"This is a monitor vendor name, followed by a size in inches, like 'Dell " "This is a monitor vendor name, followed by a size in inches, like 'Dell 15\"'"
"15\"'"
msgid "%s %s" msgid "%s %s"
msgstr "%s %s" msgstr "%s %s"
#: src/backends/meta-monitor.c:273 #: src/backends/meta-monitor.c:270
#, c-format #, c-format
msgctxt "" msgctxt ""
"This is a monitor vendor name followed by product/model name where size in " "This is a monitor vendor name followed by product/model name where size in "
@@ -611,13 +571,13 @@ msgid "%s %s"
msgstr "%s %s" msgstr "%s %s"
#. Translators: this string will appear in Sysprof #. Translators: this string will appear in Sysprof
#: src/backends/meta-profiler.c:79 #: src/backends/meta-profiler.c:82
msgid "Compositor" msgid "Compositor"
msgstr "Compositor" msgstr "Compositor"
#. This probably means that a non-WM compositor like xcompmgr is running; #. This probably means that a non-WM compositor like xcompmgr is running;
#. * we have no way to get it to exit #. * we have no way to get it to exit
#: src/compositor/compositor.c:545 #: src/compositor/compositor.c:510
#, c-format #, c-format
msgid "" msgid ""
"Another compositing manager is already running on screen %i on display “%s”." "Another compositing manager is already running on screen %i on display “%s”."
@@ -629,52 +589,52 @@ msgstr ""
msgid "Bell event" msgid "Bell event"
msgstr "Esdeveniment de campana" msgstr "Esdeveniment de campana"
#: src/core/main.c:190 #: src/core/main.c:185
msgid "Disable connection to session manager" msgid "Disable connection to session manager"
msgstr "Inhabilita la connexió al gestor de sessions" msgstr "Inhabilita la connexió al gestor de sessions"
#: src/core/main.c:196 #: src/core/main.c:191
msgid "Replace the running window manager" msgid "Replace the running window manager"
msgstr "Reemplaça el gestor de finestres en execució" msgstr "Reemplaça el gestor de finestres en execució"
#: src/core/main.c:202 #: src/core/main.c:197
msgid "Specify session management ID" msgid "Specify session management ID"
msgstr "Especifica l'ID de gestió de sessió" msgstr "Especifica l'ID de gestió de sessió"
#: src/core/main.c:207 #: src/core/main.c:202
msgid "X Display to use" msgid "X Display to use"
msgstr "Visualització X per usar" msgstr "Visualització X per usar"
#: src/core/main.c:213 #: src/core/main.c:208
msgid "Initialize session from savefile" msgid "Initialize session from savefile"
msgstr "Inicialitza la sessió des del fitxer desat" msgstr "Inicialitza la sessió des del fitxer desat"
#: src/core/main.c:219 #: src/core/main.c:214
msgid "Make X calls synchronous" msgid "Make X calls synchronous"
msgstr "Fes que les crides a l'X siguin síncrones" msgstr "Fes que les crides a l'X siguin síncrones"
#: src/core/main.c:226 #: src/core/main.c:221
msgid "Run as a wayland compositor" msgid "Run as a wayland compositor"
msgstr "Funciona com a compositor de Wayland" msgstr "Funciona com a compositor de Wayland"
# Notes: # Notes:
# Afegeix una nota # Afegeix una nota
# #
# Camins: # Camins:
# ../src/core/main.c:223 # ../src/core/main.c:223
#: src/core/main.c:232 #: src/core/main.c:227
msgid "Run as a nested compositor" msgid "Run as a nested compositor"
msgstr "Funciona com a compositor imbricat" msgstr "Funciona com a compositor imbricat"
#: src/core/main.c:238 #: src/core/main.c:233
msgid "Run wayland compositor without starting Xwayland" msgid "Run wayland compositor without starting Xwayland"
msgstr "Executa el compositor wayland sense iniciar Xwayland" msgstr "Executa el compositor wayland sense iniciar Xwayland"
#: src/core/main.c:246 #: src/core/main.c:241
msgid "Run as a full display server, rather than nested" msgid "Run as a full display server, rather than nested"
msgstr "Funciona com a servidor de pantalla completa, en comptes d'imbricat" msgstr "Funciona com a servidor de pantalla completa, en comptes d'imbricat"
#: src/core/main.c:252 #: src/core/main.c:247
msgid "Run with X11 backend" msgid "Run with X11 backend"
msgstr "Executa amb un rerefons X11" msgstr "Executa amb un rerefons X11"
@@ -710,7 +670,8 @@ msgid ""
"mutter %s\n" "mutter %s\n"
"Copyright © 2001-%d Havoc Pennington, Red Hat, Inc., and others\n" "Copyright © 2001-%d Havoc Pennington, Red Hat, Inc., and others\n"
"This is free software; see the source for copying conditions.\n" "This is free software; see the source for copying conditions.\n"
"There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n" "There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A "
"PARTICULAR PURPOSE.\n"
msgstr "" msgstr ""
"Mutter %s\n" "Mutter %s\n"
"Copyright © 2001-%d Havoc Pennington, Red Hat, Inc., i d'altres\n" "Copyright © 2001-%d Havoc Pennington, Red Hat, Inc., i d'altres\n"
@@ -727,45 +688,45 @@ msgstr "Escriu versió"
msgid "Mutter plugin to use" msgid "Mutter plugin to use"
msgstr "Connector del Mutter a utilitzar" msgstr "Connector del Mutter a utilitzar"
#: src/core/prefs.c:1911 #: src/core/prefs.c:1849
#, c-format #, c-format
msgid "Workspace %d" msgid "Workspace %d"
msgstr "Espai de treball %d" msgstr "Espai de treball %d"
#: src/core/util.c:119 #: src/core/util.c:121
msgid "Mutter was compiled without support for verbose mode\n" msgid "Mutter was compiled without support for verbose mode\n"
msgstr "Mutter es va compilar sense compatibilitat per al mode detallat\n" msgstr "Mutter es va compilar sense compatibilitat per al mode detallat\n"
#: src/wayland/meta-wayland-tablet-pad.c:568 #: src/wayland/meta-wayland-tablet-pad.c:567
#, c-format #, c-format
msgid "Mode Switch: Mode %d" msgid "Mode Switch: Mode %d"
msgstr "Mode de commutació: mode %d" msgstr "Mode de commutació: mode %d"
#: src/x11/meta-x11-display.c:676 #: src/x11/meta-x11-display.c:671
#, c-format #, c-format
msgid "" msgid ""
"Display “%s” already has a window manager; try using the --replace option to" "Display “%s” already has a window manager; try using the --replace option to "
" replace the current window manager." "replace the current window manager."
msgstr "" msgstr ""
"La pantalla «%s» ja té un gestor de finestres; proveu l'opció --replace per " "La pantalla «%s» ja té un gestor de finestres; proveu l'opció --replace per "
"reemplaçar el gestor de finestres actual." "reemplaçar el gestor de finestres actual."
#: src/x11/meta-x11-display.c:1089 #: src/x11/meta-x11-display.c:1032
msgid "Failed to initialize GDK\n" msgid "Failed to initialize GDK\n"
msgstr "S'ha produït un error en inicialitzar GDK\n" msgstr "S'ha produït un error en inicialitzar GDK\n"
#: src/x11/meta-x11-display.c:1113 #: src/x11/meta-x11-display.c:1056
#, c-format #, c-format
msgid "Failed to open X Window System display “%s”\n" msgid "Failed to open X Window System display “%s”\n"
msgstr "" msgstr ""
"S'ha produït un error en obrir la pantalla del sistema de finestres X «%s»\n" "S'ha produït un error en obrir la pantalla del sistema de finestres X «%s»\n"
#: src/x11/meta-x11-display.c:1196 #: src/x11/meta-x11-display.c:1140
#, c-format #, c-format
msgid "Screen %d on display “%s” is invalid\n" msgid "Screen %d on display “%s” is invalid\n"
msgstr "El monitor %d en la pantalla «%s»' no és vàlida\n" msgstr "El monitor %d en la pantalla «%s»' no és vàlida\n"
#: src/x11/meta-x11-selection-input-stream.c:460 #: src/x11/meta-x11-selection-input-stream.c:445
#, c-format #, c-format
msgid "Format %s not supported" msgid "Format %s not supported"
msgstr "El format %s no és compatible" msgstr "El format %s no és compatible"
@@ -778,7 +739,8 @@ msgstr ""
"Aquestes finestres no implementen «desa la configuració actual» i s'hauran " "Aquestes finestres no implementen «desa la configuració actual» i s'hauran "
"de reiniciar manualment la pròxima vegada que entreu." "de reiniciar manualment la pròxima vegada que entreu."
#: src/x11/window-props.c:548 #: src/x11/window-props.c:569
#, c-format #, c-format
msgid "%s (on %s)" msgid "%s (on %s)"
msgstr "%s (a %s)" msgstr "%s (a %s)"

View File

@@ -13,8 +13,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: mutter.master\n" "Project-Id-Version: mutter.master\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/mutter/issues\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/mutter/issues\n"
"POT-Creation-Date: 2020-08-04 08:31+0000\n" "POT-Creation-Date: 2020-02-23 17:41+0000\n"
"PO-Revision-Date: 2020-08-13 10:31+0200\n" "PO-Revision-Date: 2020-02-24 13:15+0100\n"
"Last-Translator: Daniel Mustieles <daniel.mustieles@gmail.com>\n" "Last-Translator: Daniel Mustieles <daniel.mustieles@gmail.com>\n"
"Language-Team: Spanish - Spain <gnome-es-list@gnome.org>\n" "Language-Team: Spanish - Spain <gnome-es-list@gnome.org>\n"
"Language: es_ES\n" "Language: es_ES\n"
@@ -22,7 +22,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Gtranslator 3.36.0\n" "X-Generator: Gtranslator 3.34.0\n"
#: data/50-mutter-navigation.xml:6 #: data/50-mutter-navigation.xml:6
msgid "Navigation" msgid "Navigation"
@@ -518,16 +518,6 @@ msgstr ""
"Permitir capturas con X11 para bloquear el foco del teclado con Xwayland" "Permitir capturas con X11 para bloquear el foco del teclado con Xwayland"
#: data/org.gnome.mutter.wayland.gschema.xml.in:65 #: data/org.gnome.mutter.wayland.gschema.xml.in:65
#| msgid ""
#| "Allow all keyboard events to be routed to X11 “override redirect” windows "
#| "with a grab when running in Xwayland. This option is to support X11 "
#| "clients which map an “override redirect” window (which do not receive "
#| "keyboard focus) and issue a keyboard grab to force all keyboard events to "
#| "that window. This option is seldom used and has no effect on regular X11 "
#| "windows which can receive keyboard focus under normal circumstances. For "
#| "a X11 grab to be taken into account under Wayland, the client must also "
#| "either send a specific X11 ClientMessage to the root window or be among "
#| "the applications white-listed in key “xwayland-grab-access-rules”."
msgid "" msgid ""
"Allow all keyboard events to be routed to X11 “override redirect” windows " "Allow all keyboard events to be routed to X11 “override redirect” windows "
"with a grab when running in Xwayland. This option is to support X11 clients " "with a grab when running in Xwayland. This option is to support X11 clients "
@@ -537,7 +527,7 @@ msgid ""
"which can receive keyboard focus under normal circumstances. For a X11 grab " "which can receive keyboard focus under normal circumstances. For a X11 grab "
"to be taken into account under Wayland, the client must also either send a " "to be taken into account under Wayland, the client must also either send a "
"specific X11 ClientMessage to the root window or be among the applications " "specific X11 ClientMessage to the root window or be among the applications "
"allowed in key “xwayland-grab-access-rules”." "white-listed in key “xwayland-grab-access-rules”."
msgstr "" msgstr ""
"Permitir que los eventos del teclado se dirijan a ventanas X11 “override " "Permitir que los eventos del teclado se dirijan a ventanas X11 “override "
"redirect” con una pulsación cuando se ejecutan en Xwayland. Esta opción es " "redirect” con una pulsación cuando se ejecutan en Xwayland. Esta opción es "
@@ -555,25 +545,14 @@ msgid "Xwayland applications allowed to issue keyboard grabs"
msgstr "Aplicaciones de Xwayland que pueden capturar el teclado" msgstr "Aplicaciones de Xwayland que pueden capturar el teclado"
#: data/org.gnome.mutter.wayland.gschema.xml.in:85 #: data/org.gnome.mutter.wayland.gschema.xml.in:85
#| msgid ""
#| "List the resource names or resource class of X11 windows either allowed "
#| "or not allowed to issue X11 keyboard grabs under Xwayland. The resource "
#| "name or resource class of a given X11 window can be obtained using the "
#| "command “xprop WM_CLASS”. Wildcards “*” and jokers “?” in the values are "
#| "supported. Values starting with “!” are blacklisted, which has precedence "
#| "over the whitelist, to revoke applications from the default system list. "
#| "The default system list includes the following applications: "
#| "“@XWAYLAND_GRAB_DEFAULT_ACCESS_RULES@” Users can break an existing grab "
#| "by using the specific keyboard shortcut defined by the keybinding key "
#| "“restore-shortcuts”."
msgid "" msgid ""
"List the resource names or resource class of X11 windows either allowed or " "List the resource names or resource class of X11 windows either allowed or "
"not allowed to issue X11 keyboard grabs under Xwayland. The resource name or " "not allowed to issue X11 keyboard grabs under Xwayland. The resource name or "
"resource class of a given X11 window can be obtained using the command " "resource class of a given X11 window can be obtained using the command "
"“xprop WM_CLASS”. Wildcards “*” and jokers “?” in the values are supported. " "“xprop WM_CLASS”. Wildcards “*” and jokers “?” in the values are supported. "
"Values starting with “!” are denied, which has precedence over the list of " "Values starting with “!” are blacklisted, which has precedence over the "
"values allowed, to revoke applications from the default system list. The " "whitelist, to revoke applications from the default system list. The default "
"default system list includes the following applications: " "system list includes the following applications: "
"“@XWAYLAND_GRAB_DEFAULT_ACCESS_RULES@” Users can break an existing grab by " "“@XWAYLAND_GRAB_DEFAULT_ACCESS_RULES@” Users can break an existing grab by "
"using the specific keyboard shortcut defined by the keybinding key “restore-" "using the specific keyboard shortcut defined by the keybinding key “restore-"
"shortcuts”." "shortcuts”."
@@ -591,7 +570,7 @@ msgstr ""
#. TRANSLATORS: This string refers to a button that switches between #. TRANSLATORS: This string refers to a button that switches between
#. * different modes. #. * different modes.
#. #.
#: src/backends/meta-input-settings.c:2698 #: src/backends/meta-input-settings.c:2567
#, c-format #, c-format
msgid "Mode Switch (Group %d)" msgid "Mode Switch (Group %d)"
msgstr "Cambiar modo (grupo %d)" msgstr "Cambiar modo (grupo %d)"
@@ -599,34 +578,34 @@ msgstr "Cambiar modo (grupo %d)"
#. TRANSLATORS: This string refers to an action, cycles drawing tablets' #. TRANSLATORS: This string refers to an action, cycles drawing tablets'
#. * mapping through the available outputs. #. * mapping through the available outputs.
#. #.
#: src/backends/meta-input-settings.c:2721 #: src/backends/meta-input-settings.c:2590
msgid "Switch monitor" msgid "Switch monitor"
msgstr "Cambiar monitor" msgstr "Cambiar monitor"
#: src/backends/meta-input-settings.c:2723 #: src/backends/meta-input-settings.c:2592
msgid "Show on-screen help" msgid "Show on-screen help"
msgstr "Mostrar la ayuda en pantalla" msgstr "Mostrar la ayuda en pantalla"
#: src/backends/meta-monitor.c:235 #: src/backends/meta-monitor.c:223
msgid "Built-in display" msgid "Built-in display"
msgstr "Pantalla integrada" msgstr "Pantalla integrada"
#: src/backends/meta-monitor.c:264 #: src/backends/meta-monitor.c:252
msgid "Unknown" msgid "Unknown"
msgstr "Desconocida" msgstr "Desconocida"
#: src/backends/meta-monitor.c:266 #: src/backends/meta-monitor.c:254
msgid "Unknown Display" msgid "Unknown Display"
msgstr "Pantalla desconocida" msgstr "Pantalla desconocida"
#: src/backends/meta-monitor.c:274 #: src/backends/meta-monitor.c:262
#, c-format #, c-format
msgctxt "" msgctxt ""
"This is a monitor vendor name, followed by a size in inches, like 'Dell 15\"'" "This is a monitor vendor name, followed by a size in inches, like 'Dell 15\"'"
msgid "%s %s" msgid "%s %s"
msgstr "%s %s" msgstr "%s %s"
#: src/backends/meta-monitor.c:282 #: src/backends/meta-monitor.c:270
#, c-format #, c-format
msgctxt "" msgctxt ""
"This is a monitor vendor name followed by product/model name where size in " "This is a monitor vendor name followed by product/model name where size in "
@@ -641,7 +620,7 @@ msgstr "Compositor"
#. This probably means that a non-WM compositor like xcompmgr is running; #. This probably means that a non-WM compositor like xcompmgr is running;
#. * we have no way to get it to exit #. * we have no way to get it to exit
#: src/compositor/compositor.c:516 #: src/compositor/compositor.c:533
#, c-format #, c-format
msgid "" msgid ""
"Another compositing manager is already running on screen %i on display “%s”." "Another compositing manager is already running on screen %i on display “%s”."
@@ -752,7 +731,7 @@ msgstr "Complemento de mutter que usar"
msgid "Workspace %d" msgid "Workspace %d"
msgstr "Área de trabajo %d" msgstr "Área de trabajo %d"
#: src/core/util.c:119 #: src/core/util.c:122
msgid "Mutter was compiled without support for verbose mode\n" msgid "Mutter was compiled without support for verbose mode\n"
msgstr "Mutter fue compilado sin soporte para modo prolijo\n" msgstr "Mutter fue compilado sin soporte para modo prolijo\n"
@@ -797,7 +776,7 @@ msgstr ""
"Estas ventanas no soportan «guardar la configuración actual» y tendrán que " "Estas ventanas no soportan «guardar la configuración actual» y tendrán que "
"reiniciarse manualmente la próxima vez que inicie una sesión." "reiniciarse manualmente la próxima vez que inicie una sesión."
#: src/x11/window-props.c:548 #: src/x11/window-props.c:569
#, c-format #, c-format
msgid "%s (on %s)" msgid "%s (on %s)"
msgstr "%s (on %s)" msgstr "%s (on %s)"

View File

@@ -20,8 +20,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: mutter master\n" "Project-Id-Version: mutter master\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/mutter/issues\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/mutter/issues\n"
"POT-Creation-Date: 2020-08-04 08:31+0000\n" "POT-Creation-Date: 2020-02-23 17:41+0000\n"
"PO-Revision-Date: 2020-08-10 12:54+0200\n" "PO-Revision-Date: 2020-03-01 13:19+0100\n"
"Last-Translator: Guillaume Bernard <associations@guillaume-bernard.fr>\n" "Last-Translator: Guillaume Bernard <associations@guillaume-bernard.fr>\n"
"Language-Team: GNOME French Team <gnomefr@traduc.org>\n" "Language-Team: GNOME French Team <gnomefr@traduc.org>\n"
"Language: fr\n" "Language: fr\n"
@@ -536,7 +536,7 @@ msgid ""
"which can receive keyboard focus under normal circumstances. For a X11 grab " "which can receive keyboard focus under normal circumstances. For a X11 grab "
"to be taken into account under Wayland, the client must also either send a " "to be taken into account under Wayland, the client must also either send a "
"specific X11 ClientMessage to the root window or be among the applications " "specific X11 ClientMessage to the root window or be among the applications "
"allowed in key “xwayland-grab-access-rules”." "white-listed in key “xwayland-grab-access-rules”."
msgstr "" msgstr ""
"Permettre à tous les évènements clavier dêtre routés vers les fenêtres X11 " "Permettre à tous les évènements clavier dêtre routés vers les fenêtres X11 "
 override redirect » avec capture lors du fonctionnement avec Xwayland. "  override redirect » avec capture lors du fonctionnement avec Xwayland. "
@@ -547,7 +547,7 @@ msgstr ""
"fenêtres X11 normales qui peuvent recevoir le focus du clavier dans des " "fenêtres X11 normales qui peuvent recevoir le focus du clavier dans des "
"circonstances normales. Pour quune capture X11 soit prise en compte sous " "circonstances normales. Pour quune capture X11 soit prise en compte sous "
"Wayland, le client doit aussi soit envoyer un ClientMessage X11 spécifique à " "Wayland, le client doit aussi soit envoyer un ClientMessage X11 spécifique à "
"la fenêtre racine, soit figurer parmi la liste des applications autorisées dans " "la fenêtre racine, soit figurer parmi la liste blanche des applications dans "
"la clé « xwayland-grab-access-rules »." "la clé « xwayland-grab-access-rules »."
#: data/org.gnome.mutter.wayland.gschema.xml.in:84 #: data/org.gnome.mutter.wayland.gschema.xml.in:84
@@ -560,9 +560,9 @@ msgid ""
"not allowed to issue X11 keyboard grabs under Xwayland. The resource name or " "not allowed to issue X11 keyboard grabs under Xwayland. The resource name or "
"resource class of a given X11 window can be obtained using the command " "resource class of a given X11 window can be obtained using the command "
"“xprop WM_CLASS”. Wildcards “*” and jokers “?” in the values are supported. " "“xprop WM_CLASS”. Wildcards “*” and jokers “?” in the values are supported. "
"Values starting with “!” are denied, which has precedence over the list of " "Values starting with “!” are blacklisted, which has precedence over the "
"values allowed, to revoke applications from the default system list. The " "whitelist, to revoke applications from the default system list. The default "
"default system list includes the following applications: " "system list includes the following applications: "
"“@XWAYLAND_GRAB_DEFAULT_ACCESS_RULES@” Users can break an existing grab by " "“@XWAYLAND_GRAB_DEFAULT_ACCESS_RULES@” Users can break an existing grab by "
"using the specific keyboard shortcut defined by the keybinding key “restore-" "using the specific keyboard shortcut defined by the keybinding key “restore-"
"shortcuts”." "shortcuts”."
@@ -571,8 +571,8 @@ msgstr ""
"autorisées ou non à émettre des captures clavier sous Xwayland. Le nom ou la " "autorisées ou non à émettre des captures clavier sous Xwayland. Le nom ou la "
"classe de ressource dune fenêtre X11 donnée peut être obtenue à laide de " "classe de ressource dune fenêtre X11 donnée peut être obtenue à laide de "
"la commande « xprop WM_CLASS ». Les caractères joker « * » et « ? » sont " "la commande « xprop WM_CLASS ». Les caractères joker « * » et « ? » sont "
"acceptées dans les valeurs. Les valeurs commençant par « ! » sont bloquées, " "acceptées dans les valeurs. Les valeurs commençant par « ! » sont en liste "
"en priorité par rapport à la liste des applications autorisées, pour révoquer les applications " "noire, qui a priorité sur la liste blanche, pour révoquer les applications "
"de la liste système par défaut. Celle-ci contient les applications " "de la liste système par défaut. Celle-ci contient les applications "
"suivantes : « @XWAYLAND_GRAB_DEFAULT_ACCESS_RULES@ ». Les utilisateurs " "suivantes : « @XWAYLAND_GRAB_DEFAULT_ACCESS_RULES@ ». Les utilisateurs "
"peuvent casser une capture existante en utilisant le raccourci clavier " "peuvent casser une capture existante en utilisant le raccourci clavier "
@@ -581,7 +581,7 @@ msgstr ""
#. TRANSLATORS: This string refers to a button that switches between #. TRANSLATORS: This string refers to a button that switches between
#. * different modes. #. * different modes.
#. #.
#: src/backends/meta-input-settings.c:2698 #: src/backends/meta-input-settings.c:2567
#, c-format #, c-format
msgid "Mode Switch (Group %d)" msgid "Mode Switch (Group %d)"
msgstr "Changement de mode (groupe %d)" msgstr "Changement de mode (groupe %d)"
@@ -589,34 +589,34 @@ msgstr "Changement de mode (groupe %d)"
#. TRANSLATORS: This string refers to an action, cycles drawing tablets' #. TRANSLATORS: This string refers to an action, cycles drawing tablets'
#. * mapping through the available outputs. #. * mapping through the available outputs.
#. #.
#: src/backends/meta-input-settings.c:2721 #: src/backends/meta-input-settings.c:2590
msgid "Switch monitor" msgid "Switch monitor"
msgstr "Changer de moniteur" msgstr "Changer de moniteur"
#: src/backends/meta-input-settings.c:2723 #: src/backends/meta-input-settings.c:2592
msgid "Show on-screen help" msgid "Show on-screen help"
msgstr "Afficher laide à lécran" msgstr "Afficher laide à lécran"
#: src/backends/meta-monitor.c:235 #: src/backends/meta-monitor.c:223
msgid "Built-in display" msgid "Built-in display"
msgstr "Affichage intégré" msgstr "Affichage intégré"
#: src/backends/meta-monitor.c:264 #: src/backends/meta-monitor.c:252
msgid "Unknown" msgid "Unknown"
msgstr "Inconnu" msgstr "Inconnu"
#: src/backends/meta-monitor.c:266 #: src/backends/meta-monitor.c:254
msgid "Unknown Display" msgid "Unknown Display"
msgstr "Affichage inconnu" msgstr "Affichage inconnu"
#: src/backends/meta-monitor.c:274 #: src/backends/meta-monitor.c:262
#, c-format #, c-format
msgctxt "" msgctxt ""
"This is a monitor vendor name, followed by a size in inches, like 'Dell 15\"'" "This is a monitor vendor name, followed by a size in inches, like 'Dell 15\"'"
msgid "%s %s" msgid "%s %s"
msgstr "%s %s" msgstr "%s %s"
#: src/backends/meta-monitor.c:282 #: src/backends/meta-monitor.c:270
#, c-format #, c-format
msgctxt "" msgctxt ""
"This is a monitor vendor name followed by product/model name where size in " "This is a monitor vendor name followed by product/model name where size in "
@@ -631,7 +631,7 @@ msgstr "Compositeur"
#. This probably means that a non-WM compositor like xcompmgr is running; #. This probably means that a non-WM compositor like xcompmgr is running;
#. * we have no way to get it to exit #. * we have no way to get it to exit
#: src/compositor/compositor.c:516 #: src/compositor/compositor.c:533
#, c-format #, c-format
msgid "" msgid ""
"Another compositing manager is already running on screen %i on display “%s”." "Another compositing manager is already running on screen %i on display “%s”."
@@ -742,7 +742,7 @@ msgstr "Greffon de Mutter à utiliser"
msgid "Workspace %d" msgid "Workspace %d"
msgstr "Espace de travail %d" msgstr "Espace de travail %d"
#: src/core/util.c:119 #: src/core/util.c:122
msgid "Mutter was compiled without support for verbose mode\n" msgid "Mutter was compiled without support for verbose mode\n"
msgstr "Mutter a été compilé sans la prise en charge du mode bavard\n" msgstr "Mutter a été compilé sans la prise en charge du mode bavard\n"
@@ -788,7 +788,7 @@ msgstr ""
"configuration actuelle » et devront être redémarrées manuellement à la " "configuration actuelle » et devront être redémarrées manuellement à la "
"prochaine connexion." "prochaine connexion."
#: src/x11/window-props.c:548 #: src/x11/window-props.c:569
#, c-format #, c-format
msgid "%s (on %s)" msgid "%s (on %s)"
msgstr "%s (sur %s)" msgstr "%s (sur %s)"

View File

@@ -9,22 +9,21 @@
# Mancomún - Centro de Referencia e Servizos de Software Libre <g11n@mancomun.org>, 2009. # Mancomún - Centro de Referencia e Servizos de Software Libre <g11n@mancomun.org>, 2009.
# Fran Diéguez <frandieguez@gnome.org>, 2009, 2010, 2011, 2012. # Fran Diéguez <frandieguez@gnome.org>, 2009, 2010, 2011, 2012.
# Leandro Regueiro <leandro.regueiro@gmail.com>, 2012. # Leandro Regueiro <leandro.regueiro@gmail.com>, 2012.
# Fran Dieguez <frandieguez@gnome.org>, 2012-2020. # Fran Dieguez <frandieguez@gnome.org>, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019.
#
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: gl\n" "Project-Id-Version: gl\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/mutter/issues\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/mutter/issues\n"
"POT-Creation-Date: 2020-08-04 08:31+0000\n" "POT-Creation-Date: 2020-02-23 17:41+0000\n"
"PO-Revision-Date: 2020-08-13 00:46+0200\n" "PO-Revision-Date: 2020-02-26 21:56+0100\n"
"Last-Translator: Fran Dieguez <frandieguez@gnome.org>\n" "Last-Translator: Fran Dieguez <frandieguez@gnome.org>\n"
"Language-Team: Galician <proxecto@trasno.gal>\n" "Language-Team: Galician\n"
"Language: gl\n" "Language: gl\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Gtranslator 3.36.0\n" "X-Generator: Poedit 2.3\n"
"X-Project-Style: gnome\n" "X-Project-Style: gnome\n"
#: data/50-mutter-navigation.xml:6 #: data/50-mutter-navigation.xml:6
@@ -515,16 +514,6 @@ msgstr ""
"Permitir os capturadores de X11 bloquear o foco do teclado con Xwayland" "Permitir os capturadores de X11 bloquear o foco do teclado con Xwayland"
#: data/org.gnome.mutter.wayland.gschema.xml.in:65 #: data/org.gnome.mutter.wayland.gschema.xml.in:65
#| msgid ""
#| "Allow all keyboard events to be routed to X11 “override redirect” windows "
#| "with a grab when running in Xwayland. This option is to support X11 "
#| "clients which map an “override redirect” window (which do not receive "
#| "keyboard focus) and issue a keyboard grab to force all keyboard events to "
#| "that window. This option is seldom used and has no effect on regular X11 "
#| "windows which can receive keyboard focus under normal circumstances. For "
#| "a X11 grab to be taken into account under Wayland, the client must also "
#| "either send a specific X11 ClientMessage to the root window or be among "
#| "the applications white-listed in key “xwayland-grab-access-rules”."
msgid "" msgid ""
"Allow all keyboard events to be routed to X11 “override redirect” windows " "Allow all keyboard events to be routed to X11 “override redirect” windows "
"with a grab when running in Xwayland. This option is to support X11 clients " "with a grab when running in Xwayland. This option is to support X11 clients "
@@ -534,7 +523,7 @@ msgid ""
"which can receive keyboard focus under normal circumstances. For a X11 grab " "which can receive keyboard focus under normal circumstances. For a X11 grab "
"to be taken into account under Wayland, the client must also either send a " "to be taken into account under Wayland, the client must also either send a "
"specific X11 ClientMessage to the root window or be among the applications " "specific X11 ClientMessage to the root window or be among the applications "
"allowed in key “xwayland-grab-access-rules”." "white-listed in key “xwayland-grab-access-rules”."
msgstr "" msgstr ""
"Permite que todos os eventos de teclado se redirixan a xanelas X11 " "Permite que todos os eventos de teclado se redirixan a xanelas X11 "
"«invalidar redirección» con un capturador ao executarse en Xwayland. Esta " "«invalidar redirección» con un capturador ao executarse en Xwayland. Esta "
@@ -544,7 +533,7 @@ msgstr ""
"esta xanela. Esta opción é rara vez usada e non ten efecto en xanelas X11 " "esta xanela. Esta opción é rara vez usada e non ten efecto en xanelas X11 "
"normais que poden recibir o foco do teclado baixo circunstancias normais. " "normais que poden recibir o foco do teclado baixo circunstancias normais. "
"Para que a captura de X11 se leve a cabo baixo Wayland, o cliente debe " "Para que a captura de X11 se leve a cabo baixo Wayland, o cliente debe "
"enviar un ClientMessage de X11 específico á xanela pai ou estar na lista " "enviar un ClienteMessage de X11 específico á xanela pai ou estar na lista "
"branca de aplicacións na chave «xwayland-grab-access-rules»." "branca de aplicacións na chave «xwayland-grab-access-rules»."
#: data/org.gnome.mutter.wayland.gschema.xml.in:84 #: data/org.gnome.mutter.wayland.gschema.xml.in:84
@@ -552,25 +541,14 @@ msgid "Xwayland applications allowed to issue keyboard grabs"
msgstr "Aplicaciones de Xwayland que poden capturar o teclado" msgstr "Aplicaciones de Xwayland que poden capturar o teclado"
#: data/org.gnome.mutter.wayland.gschema.xml.in:85 #: data/org.gnome.mutter.wayland.gschema.xml.in:85
#| msgid ""
#| "List the resource names or resource class of X11 windows either allowed "
#| "or not allowed to issue X11 keyboard grabs under Xwayland. The resource "
#| "name or resource class of a given X11 window can be obtained using the "
#| "command “xprop WM_CLASS”. Wildcards “*” and jokers “?” in the values are "
#| "supported. Values starting with “!” are blacklisted, which has precedence "
#| "over the whitelist, to revoke applications from the default system list. "
#| "The default system list includes the following applications: "
#| "“@XWAYLAND_GRAB_DEFAULT_ACCESS_RULES@” Users can break an existing grab "
#| "by using the specific keyboard shortcut defined by the keybinding key "
#| "“restore-shortcuts”."
msgid "" msgid ""
"List the resource names or resource class of X11 windows either allowed or " "List the resource names or resource class of X11 windows either allowed or "
"not allowed to issue X11 keyboard grabs under Xwayland. The resource name or " "not allowed to issue X11 keyboard grabs under Xwayland. The resource name or "
"resource class of a given X11 window can be obtained using the command " "resource class of a given X11 window can be obtained using the command "
"“xprop WM_CLASS”. Wildcards “*” and jokers “?” in the values are supported. " "“xprop WM_CLASS”. Wildcards “*” and jokers “?” in the values are supported. "
"Values starting with “!” are denied, which has precedence over the list of " "Values starting with “!” are blacklisted, which has precedence over the "
"values allowed, to revoke applications from the default system list. The " "whitelist, to revoke applications from the default system list. The default "
"default system list includes the following applications: " "system list includes the following applications: "
"“@XWAYLAND_GRAB_DEFAULT_ACCESS_RULES@” Users can break an existing grab by " "“@XWAYLAND_GRAB_DEFAULT_ACCESS_RULES@” Users can break an existing grab by "
"using the specific keyboard shortcut defined by the keybinding key “restore-" "using the specific keyboard shortcut defined by the keybinding key “restore-"
"shortcuts”." "shortcuts”."
@@ -589,7 +567,7 @@ msgstr ""
#. TRANSLATORS: This string refers to a button that switches between #. TRANSLATORS: This string refers to a button that switches between
#. * different modes. #. * different modes.
#. #.
#: src/backends/meta-input-settings.c:2698 #: src/backends/meta-input-settings.c:2567
#, c-format #, c-format
msgid "Mode Switch (Group %d)" msgid "Mode Switch (Group %d)"
msgstr "Modo conmutador (Grupo %d)" msgstr "Modo conmutador (Grupo %d)"
@@ -597,34 +575,34 @@ msgstr "Modo conmutador (Grupo %d)"
#. TRANSLATORS: This string refers to an action, cycles drawing tablets' #. TRANSLATORS: This string refers to an action, cycles drawing tablets'
#. * mapping through the available outputs. #. * mapping through the available outputs.
#. #.
#: src/backends/meta-input-settings.c:2721 #: src/backends/meta-input-settings.c:2590
msgid "Switch monitor" msgid "Switch monitor"
msgstr "Cambiar monitor" msgstr "Cambiar monitor"
#: src/backends/meta-input-settings.c:2723 #: src/backends/meta-input-settings.c:2592
msgid "Show on-screen help" msgid "Show on-screen help"
msgstr "Mostrar axuda en pantalla" msgstr "Mostrar axuda en pantalla"
#: src/backends/meta-monitor.c:235 #: src/backends/meta-monitor.c:223
msgid "Built-in display" msgid "Built-in display"
msgstr "Pantalla embebida" msgstr "Pantalla embebida"
#: src/backends/meta-monitor.c:264 #: src/backends/meta-monitor.c:252
msgid "Unknown" msgid "Unknown"
msgstr "Descoñecido" msgstr "Descoñecido"
#: src/backends/meta-monitor.c:266 #: src/backends/meta-monitor.c:254
msgid "Unknown Display" msgid "Unknown Display"
msgstr "Pantalla descoñecida" msgstr "Pantalla descoñecida"
#: src/backends/meta-monitor.c:274 #: src/backends/meta-monitor.c:262
#, c-format #, c-format
msgctxt "" msgctxt ""
"This is a monitor vendor name, followed by a size in inches, like 'Dell 15\"'" "This is a monitor vendor name, followed by a size in inches, like 'Dell 15\"'"
msgid "%s %s" msgid "%s %s"
msgstr "%s %s" msgstr "%s %s"
#: src/backends/meta-monitor.c:282 #: src/backends/meta-monitor.c:270
#, c-format #, c-format
msgctxt "" msgctxt ""
"This is a monitor vendor name followed by product/model name where size in " "This is a monitor vendor name followed by product/model name where size in "
@@ -639,7 +617,7 @@ msgstr "Compositor"
#. This probably means that a non-WM compositor like xcompmgr is running; #. This probably means that a non-WM compositor like xcompmgr is running;
#. * we have no way to get it to exit #. * we have no way to get it to exit
#: src/compositor/compositor.c:516 #: src/compositor/compositor.c:533
#, c-format #, c-format
msgid "" msgid ""
"Another compositing manager is already running on screen %i on display “%s”." "Another compositing manager is already running on screen %i on display “%s”."
@@ -749,7 +727,7 @@ msgstr "Engadido de mutter que usar"
msgid "Workspace %d" msgid "Workspace %d"
msgstr "Espazo de traballo %d" msgstr "Espazo de traballo %d"
#: src/core/util.c:119 #: src/core/util.c:122
msgid "Mutter was compiled without support for verbose mode\n" msgid "Mutter was compiled without support for verbose mode\n"
msgstr "Mutter foi compilado sen compatibilidade para o modo detallado\n" msgstr "Mutter foi compilado sen compatibilidade para o modo detallado\n"
@@ -794,7 +772,7 @@ msgstr ""
"Estas xanelas non soportan «save current setup» e terán que reiniciarse " "Estas xanelas non soportan «save current setup» e terán que reiniciarse "
"manualmente a próxima vez que inicie a sesión." "manualmente a próxima vez que inicie a sesión."
#: src/x11/window-props.c:548 #: src/x11/window-props.c:569
#, c-format #, c-format
msgid "%s (on %s)" msgid "%s (on %s)"
msgstr "%s (en %s)" msgstr "%s (en %s)"

184
po/uk.po
View File

@@ -7,8 +7,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: metacity\n" "Project-Id-Version: metacity\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/mutter/issues\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/mutter/issues\n"
"POT-Creation-Date: 2020-08-04 08:31+0000\n" "POT-Creation-Date: 2020-02-23 17:41+0000\n"
"PO-Revision-Date: 2020-08-08 18:00+0300\n" "PO-Revision-Date: 2020-03-03 19:30+0200\n"
"Last-Translator: Yuri Chornoivan <yurchor@ukr.net>\n" "Last-Translator: Yuri Chornoivan <yurchor@ukr.net>\n"
"Language-Team: Ukrainian <kde-i18n-uk@kde.org>\n" "Language-Team: Ukrainian <kde-i18n-uk@kde.org>\n"
"Language: uk\n" "Language: uk\n"
@@ -17,7 +17,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<"
"=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
"X-Generator: Lokalize 20.07.70\n" "X-Generator: Lokalize 20.03.70\n"
"X-Project-Style: gnome\n" "X-Project-Style: gnome\n"
#: data/50-mutter-navigation.xml:6 #: data/50-mutter-navigation.xml:6
@@ -255,6 +255,11 @@ msgstr ""
"Модифікатор, що використовується для розширених дій віконного менеджера" "Модифікатор, що використовується для розширених дій віконного менеджера"
#: data/org.gnome.mutter.gschema.xml.in:8 #: data/org.gnome.mutter.gschema.xml.in:8
#| msgid ""
#| "This key will initiate the \"overlay\", which is a combination window "
#| "overview and application launching system. The default is intended to be "
#| "the \"Windows key\" on PC hardware. It's expected that this binding "
#| "either the default or set to the empty string."
msgid "" msgid ""
"This key will initiate the “overlay”, which is a combination window overview " "This key will initiate the “overlay”, which is a combination window overview "
"and application launching system. The default is intended to be the “Windows " "and application launching system. The default is intended to be the “Windows "
@@ -298,6 +303,10 @@ msgid "Workspaces are managed dynamically"
msgstr "Робочі простори організовуються динамічно" msgstr "Робочі простори організовуються динамічно"
#: data/org.gnome.mutter.gschema.xml.in:41 #: data/org.gnome.mutter.gschema.xml.in:41
#| msgid ""
#| "Determines whether workspaces are managed dynamically or whether there's "
#| "a static number of workspaces (determined by the num-workspaces key in "
#| "org.gnome.desktop.wm.preferences)."
msgid "" msgid ""
"Determines whether workspaces are managed dynamically or whether theres a " "Determines whether workspaces are managed dynamically or whether theres a "
"static number of workspaces (determined by the num-workspaces key in org." "static number of workspaces (determined by the num-workspaces key in org."
@@ -336,6 +345,10 @@ msgid "Delay focus changes until the pointer stops moving"
msgstr "Затримувати зміни фокусу, поки вказівник не перестане рухатись" msgstr "Затримувати зміни фокусу, поки вказівник не перестане рухатись"
#: data/org.gnome.mutter.gschema.xml.in:69 #: data/org.gnome.mutter.gschema.xml.in:69
#| msgid ""
#| "If set to true, and the focus mode is either \"sloppy\" or \"mouse\" then "
#| "the focus will not be changed immediately when entering a window, but "
#| "only after the pointer stops moving."
msgid "" msgid ""
"If set to true, and the focus mode is either “sloppy” or “mouse” then the " "If set to true, and the focus mode is either “sloppy” or “mouse” then the "
"focus will not be changed immediately when entering a window, but only after " "focus will not be changed immediately when entering a window, but only after "
@@ -350,6 +363,9 @@ msgid "Draggable border width"
msgstr "Перетяжна ширина меж" msgstr "Перетяжна ширина меж"
#: data/org.gnome.mutter.gschema.xml.in:80 #: data/org.gnome.mutter.gschema.xml.in:80
#| msgid ""
#| "The amount of total draggable borders. If the theme's visible borders are "
#| "not enough, invisible borders will be added to meet this value."
msgid "" msgid ""
"The amount of total draggable borders. If the themes visible borders are " "The amount of total draggable borders. If the themes visible borders are "
"not enough, invisible borders will be added to meet this value." "not enough, invisible borders will be added to meet this value."
@@ -397,21 +413,21 @@ msgid ""
"must have CAP_SYS_NICE. Requires a restart. • “autostart-xwayland” — " "must have CAP_SYS_NICE. Requires a restart. • “autostart-xwayland” — "
"initializes Xwayland lazily if there are X11 clients. Requires restart." "initializes Xwayland lazily if there are X11 clients. Requires restart."
msgstr "" msgstr ""
"Щоб увімкнути експериментальну можливість, додайте до списку ключове слово " "Щоб увімкнути експериментальну можливість, додайте до списку ключове слово"
"можливості. Те, чи потребуватиме вмикання можливості перезапуску " " можливості. Те, чи потребуватиме вмикання можливості перезапуску"
"композитора, залежить від типу можливості. Експериментальні можливості не " " композитора, залежить від типу можливості. Експериментальні можливості не"
"обов'язково завжди доступні чи придатні до налаштовування. Не слід " " обов'язково завжди доступні чи придатні до налаштовування. Не слід"
"очікувати, що у майбутніх версіях обов'язково буде збережено якусь із " " очікувати, що у майбутніх версіях обов'язково буде збережено якусь із"
"експериментальних можливостей. У поточній версії передбачено такі ключові " " експериментальних можливостей. У поточній версії передбачено такі ключові"
"слова: • «scale-monitor-framebuffer» — наказує mutter типово розташовувати " " слова: • «scale-monitor-framebuffer» — наказує mutter типово розташовувати"
"логічні монітори у координатному просторі логічних пікселів, масштабуючи " " логічні монітори у координатному просторі логічних пікселів, масштабуючи"
"буфери кадрів моніторів, замість вмісту вікон. Призначено для роботи із " " буфери кадрів моніторів, замість вмісту вікон. Призначено для роботи із"
"моніторами із високою роздільною здатністю. Не потребує перезапуску " " моніторами із високою роздільною здатністю. Не потребує перезапуску"
"композитора. • «rt-scheduler» — наказати mutter надсилати до системи запит " " композитора. • «rt-scheduler» — наказати mutter надсилати до системи запит"
"щодо низькопріоритетного планування режиму реального часу. Для виконуваного " " щодо низькопріоритетного планування режиму реального часу. Для виконуваного"
"файла або запису користувача має бути встановлено CAP_SYS_NICE. Потребує " " файла або запису користувача має бути встановлено CAP_SYS_NICE. Потребує"
"перезапуску композитора. • «autostart-xwayland» — лінива ініціалізація " " перезапуску композитора. • «autostart-xwayland» — лінива ініціалізація"
"Xwayland, якщо виявлено клієнти X11. Потребує перезапуску композитора." " Xwayland, якщо виявлено клієнти X11. Потребує перезапуску композитора."
#: data/org.gnome.mutter.gschema.xml.in:134 #: data/org.gnome.mutter.gschema.xml.in:134
msgid "Modifier to use to locate the pointer" msgid "Modifier to use to locate the pointer"
@@ -430,9 +446,9 @@ msgid ""
"Number of milliseconds a client has to respond to a ping request in order to " "Number of milliseconds a client has to respond to a ping request in order to "
"not be detected as frozen. Using 0 will disable the alive check completely." "not be detected as frozen. Using 0 will disable the alive check completely."
msgstr "" msgstr ""
"Проміжок часу у мілісекундах, протягом якого клієнт має відповісти на луна-" "Проміжок часу у мілісекундах, протягом якого клієнт має відповісти на"
"запит, щоб вважатися працездатним. Скористайтеся значенням 0, щоб повністю " " луна-запит, щоб вважатися працездатним. Скористайтеся значенням 0, щоб"
"вимкнути перевірку працездатності." " повністю вимкнути перевірку працездатності."
#: data/org.gnome.mutter.gschema.xml.in:165 #: data/org.gnome.mutter.gschema.xml.in:165
msgid "Select window from tab popup" msgid "Select window from tab popup"
@@ -443,6 +459,7 @@ msgid "Cancel tab popup"
msgstr "Скасувати контекстні вкладки" msgstr "Скасувати контекстні вкладки"
#: data/org.gnome.mutter.gschema.xml.in:175 #: data/org.gnome.mutter.gschema.xml.in:175
#| msgid "Switch applications"
msgid "Switch monitor configurations" msgid "Switch monitor configurations"
msgstr "Перемкнути налаштування монітора" msgstr "Перемкнути налаштування монітора"
@@ -508,16 +525,6 @@ msgstr ""
"Дозволити захопленням у X11 блокувати зміну фокусування клавіатури з Xwayland" "Дозволити захопленням у X11 блокувати зміну фокусування клавіатури з Xwayland"
#: data/org.gnome.mutter.wayland.gschema.xml.in:65 #: data/org.gnome.mutter.wayland.gschema.xml.in:65
#| msgid ""
#| "Allow all keyboard events to be routed to X11 “override redirect” windows "
#| "with a grab when running in Xwayland. This option is to support X11 "
#| "clients which map an “override redirect” window (which do not receive "
#| "keyboard focus) and issue a keyboard grab to force all keyboard events to "
#| "that window. This option is seldom used and has no effect on regular X11 "
#| "windows which can receive keyboard focus under normal circumstances. For "
#| "a X11 grab to be taken into account under Wayland, the client must also "
#| "either send a specific X11 ClientMessage to the root window or be among "
#| "the applications white-listed in key “xwayland-grab-access-rules”."
msgid "" msgid ""
"Allow all keyboard events to be routed to X11 “override redirect” windows " "Allow all keyboard events to be routed to X11 “override redirect” windows "
"with a grab when running in Xwayland. This option is to support X11 clients " "with a grab when running in Xwayland. This option is to support X11 clients "
@@ -527,20 +534,20 @@ msgid ""
"which can receive keyboard focus under normal circumstances. For a X11 grab " "which can receive keyboard focus under normal circumstances. For a X11 grab "
"to be taken into account under Wayland, the client must also either send a " "to be taken into account under Wayland, the client must also either send a "
"specific X11 ClientMessage to the root window or be among the applications " "specific X11 ClientMessage to the root window or be among the applications "
"allowed in key “xwayland-grab-access-rules”." "white-listed in key “xwayland-grab-access-rules”."
msgstr "" msgstr ""
"Дозволяє маршрутизацію усіх подій клавіатури до вікон X11 із " "Дозволяє маршрутизацію усіх подій клавіатури до вікон X11 із «перевизначенням"
"«перевизначенням переспрямовування», які захоплюють клавіатуру, коли їх " " переспрямовування», які захоплюють клавіатуру, коли їх запущено у Xwayland."
"запущено у Xwayland. Цей параметр призначено для реалізації підтримки " " Цей параметр призначено для реалізації підтримки клієнтів X11, які"
"клієнтів X11, які здійснюють відображення вікна із «перевизначенням " " здійснюють відображення вікна із «перевизначенням переспрямовування» (вікна,"
"переспрямовування» (вікна, яке не отримує фокусування клавіатури) і видають " " яке не отримує фокусування клавіатури) і видають сигнал щодо захоплення"
"сигнал щодо захоплення клавіатури, щоб примусово переспрямувати усі події з " " клавіатури, щоб примусово переспрямувати усі події з клавіатури у відповідне"
"клавіатури у відповідне вікно. Використання цього параметра є рідкісним. " " вікно. Використання цього параметра є рідкісним. Воно не впливає на звичайні"
"Воно не впливає на звичайні вікна X11, які можуть отримувати фокусування " " вікна X11, які можуть отримувати фокусування клавіатури за звичних обставин."
"клавіатури за звичних обставин. Щоб захоплення клавіатури X11 бралося до " " Щоб захоплення клавіатури X11 бралося до уваги у Wayland, клієнтська"
"уваги у Wayland, клієнтська програма також має або надіслати специфічне " " програма також має або надіслати специфічне ClientMessage X11 до кореневого"
"ClientMessage X11 до кореневого вікна, або мати свій пункт у списку" " вікна, або мати свій пункт у «білому» списку ключа"
" дозволених програм ключа «xwayland-grab-access-rules»." " «xwayland-grab-access-rules»."
#: data/org.gnome.mutter.wayland.gschema.xml.in:84 #: data/org.gnome.mutter.wayland.gschema.xml.in:84
msgid "Xwayland applications allowed to issue keyboard grabs" msgid "Xwayland applications allowed to issue keyboard grabs"
@@ -548,46 +555,35 @@ msgstr ""
"Програми Xwayland, яким дозволено надсилати запит щодо захоплення клавіатури" "Програми Xwayland, яким дозволено надсилати запит щодо захоплення клавіатури"
#: data/org.gnome.mutter.wayland.gschema.xml.in:85 #: data/org.gnome.mutter.wayland.gschema.xml.in:85
#| msgid ""
#| "List the resource names or resource class of X11 windows either allowed "
#| "or not allowed to issue X11 keyboard grabs under Xwayland. The resource "
#| "name or resource class of a given X11 window can be obtained using the "
#| "command “xprop WM_CLASS”. Wildcards “*” and jokers “?” in the values are "
#| "supported. Values starting with “!” are blacklisted, which has precedence "
#| "over the whitelist, to revoke applications from the default system list. "
#| "The default system list includes the following applications: "
#| "“@XWAYLAND_GRAB_DEFAULT_ACCESS_RULES@” Users can break an existing grab "
#| "by using the specific keyboard shortcut defined by the keybinding key "
#| "“restore-shortcuts”."
msgid "" msgid ""
"List the resource names or resource class of X11 windows either allowed or " "List the resource names or resource class of X11 windows either allowed or "
"not allowed to issue X11 keyboard grabs under Xwayland. The resource name or " "not allowed to issue X11 keyboard grabs under Xwayland. The resource name or "
"resource class of a given X11 window can be obtained using the command " "resource class of a given X11 window can be obtained using the command "
"“xprop WM_CLASS”. Wildcards “*” and jokers “?” in the values are supported. " "“xprop WM_CLASS”. Wildcards “*” and jokers “?” in the values are supported. "
"Values starting with “!” are denied, which has precedence over the list of " "Values starting with “!” are blacklisted, which has precedence over the "
"values allowed, to revoke applications from the default system list. The " "whitelist, to revoke applications from the default system list. The default "
"default system list includes the following applications: " "system list includes the following applications: "
"“@XWAYLAND_GRAB_DEFAULT_ACCESS_RULES@” Users can break an existing grab by " "“@XWAYLAND_GRAB_DEFAULT_ACCESS_RULES@” Users can break an existing grab by "
"using the specific keyboard shortcut defined by the keybinding key “restore-" "using the specific keyboard shortcut defined by the keybinding key “restore-"
"shortcuts”." "shortcuts”."
msgstr "" msgstr ""
"Список назв ресурсів або клас ресурсів вікон X11, яким дозволено або " "Список назв ресурсів або клас ресурсів вікон X11, яким дозволено або"
"заборонено видавати запити на захоплення фокусу клавіатури X11 у Xwayland. " " заборонено видавати запити на захоплення фокусу клавіатури X11 у Xwayland."
"Назву ресурсу або клас ресурсу певного вікна X11 можна визначити за " " Назву ресурсу або клас ресурсу певного вікна X11 можна визначити за"
"допомогою команди «xprop WM_CLASS». Передбачено підтримку символів-" " допомогою команди «xprop WM_CLASS». Передбачено підтримку"
"замінників «*» і «?» у записах. Значення, які починатимуться з «!», буде " " символів-замінників «*» і «?» у записах. Значення, які починатимуться з «!»,"
"додано до списку заборонених, який матиме пріоритет над списком дозволених" " буде додано до «чорного» списку, який матиме пріоритет над «білим» списком,"
" значень, щоб " " щоб програми можна було вилучати із типового загальносистемного списку."
"програми можна було вилучати із типового загальносистемного списку. Типовий " " Типовий загальносистемний список містить записи таких програм:"
"загальносистемний список містить записи таких програм: " " «@XWAYLAND_GRAB_DEFAULT_ACCESS_RULES@». Користувачі можуть усувати наявне"
"«@XWAYLAND_GRAB_DEFAULT_ACCESS_RULES@». Користувачі можуть усувати наявне " " захоплення фокуса за допомогою певного клавіатурного скорочення, яке"
"захоплення фокуса за допомогою певного клавіатурного скорочення, яке " " визначається ключем «restore-"
"визначається ключем «restore-shortcuts»." "shortcuts»."
#. TRANSLATORS: This string refers to a button that switches between #. TRANSLATORS: This string refers to a button that switches between
#. * different modes. #. * different modes.
#. #.
#: src/backends/meta-input-settings.c:2698 #: src/backends/meta-input-settings.c:2567
#, c-format #, c-format
msgid "Mode Switch (Group %d)" msgid "Mode Switch (Group %d)"
msgstr "Перемкнути режим (група %d)" msgstr "Перемкнути режим (група %d)"
@@ -595,35 +591,38 @@ msgstr "Перемкнути режим (група %d)"
#. TRANSLATORS: This string refers to an action, cycles drawing tablets' #. TRANSLATORS: This string refers to an action, cycles drawing tablets'
#. * mapping through the available outputs. #. * mapping through the available outputs.
#. #.
#: src/backends/meta-input-settings.c:2721 #: src/backends/meta-input-settings.c:2590
#| msgid "Switch system controls"
msgid "Switch monitor" msgid "Switch monitor"
msgstr "Перемкнути монітор" msgstr "Перемкнути монітор"
#: src/backends/meta-input-settings.c:2723 #: src/backends/meta-input-settings.c:2592
msgid "Show on-screen help" msgid "Show on-screen help"
msgstr "Показати довідку на екрані" msgstr "Показати довідку на екрані"
#: src/backends/meta-monitor.c:235 #: src/backends/meta-monitor.c:223
msgid "Built-in display" msgid "Built-in display"
msgstr "Вбудований екран" msgstr "Вбудований екран"
#: src/backends/meta-monitor.c:264 #: src/backends/meta-monitor.c:252
msgid "Unknown" msgid "Unknown"
msgstr "Невідомо" msgstr "Невідомо"
#: src/backends/meta-monitor.c:266 #: src/backends/meta-monitor.c:254
msgid "Unknown Display" msgid "Unknown Display"
msgstr "Невідомий екран" msgstr "Невідомий екран"
#: src/backends/meta-monitor.c:274 #: src/backends/meta-monitor.c:262
#, c-format #, c-format
#| msgid "%s %s"
msgctxt "" msgctxt ""
"This is a monitor vendor name, followed by a size in inches, like 'Dell 15\"'" "This is a monitor vendor name, followed by a size in inches, like 'Dell 15\"'"
msgid "%s %s" msgid "%s %s"
msgstr "%s %s" msgstr "%s %s"
#: src/backends/meta-monitor.c:282 #: src/backends/meta-monitor.c:270
#, c-format #, c-format
#| msgid "%s %s"
msgctxt "" msgctxt ""
"This is a monitor vendor name followed by product/model name where size in " "This is a monitor vendor name followed by product/model name where size in "
"inches could not be calculated, e.g. Dell U2414H" "inches could not be calculated, e.g. Dell U2414H"
@@ -632,13 +631,17 @@ msgstr "%s %s"
#. Translators: this string will appear in Sysprof #. Translators: this string will appear in Sysprof
#: src/backends/meta-profiler.c:79 #: src/backends/meta-profiler.c:79
#| msgid "Compositing Manager"
msgid "Compositor" msgid "Compositor"
msgstr "Композитор" msgstr "Композитор"
#. This probably means that a non-WM compositor like xcompmgr is running; #. This probably means that a non-WM compositor like xcompmgr is running;
#. * we have no way to get it to exit #. * we have no way to get it to exit
#: src/compositor/compositor.c:516 #: src/compositor/compositor.c:533
#, c-format #, c-format
#| msgid ""
#| "Another compositing manager is already running on screen %i on display "
#| "\"%s\"."
msgid "" msgid ""
"Another compositing manager is already running on screen %i on display “%s”." "Another compositing manager is already running on screen %i on display “%s”."
msgstr "Уже запущено інший композитний менеджер на екрані %i через показ «%s»." msgstr "Уже запущено інший композитний менеджер на екрані %i через показ «%s»."
@@ -676,6 +679,7 @@ msgid "Run as a wayland compositor"
msgstr "запустити як композитор wayland" msgstr "запустити як композитор wayland"
#: src/core/main.c:232 #: src/core/main.c:232
#| msgid "Run as a wayland compositor"
msgid "Run as a nested compositor" msgid "Run as a nested compositor"
msgstr "Запустити як вкладений композитор" msgstr "Запустити як вкладений композитор"
@@ -718,6 +722,12 @@ msgstr "_Зачекати"
#: src/core/mutter.c:38 #: src/core/mutter.c:38
#, c-format #, c-format
#| msgid ""
#| "mutter %s\n"
#| "Copyright (C) 2001-%d Havoc Pennington, Red Hat, Inc., and others\n"
#| "This is free software; see the source for copying conditions.\n"
#| "There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A "
#| "PARTICULAR PURPOSE.\n"
msgid "" msgid ""
"mutter %s\n" "mutter %s\n"
"Copyright © 2001-%d Havoc Pennington, Red Hat, Inc., and others\n" "Copyright © 2001-%d Havoc Pennington, Red Hat, Inc., and others\n"
@@ -744,7 +754,7 @@ msgstr "Додатки Clutter для використання"
msgid "Workspace %d" msgid "Workspace %d"
msgstr "Робочий простір %d" msgstr "Робочий простір %d"
#: src/core/util.c:119 #: src/core/util.c:122
msgid "Mutter was compiled without support for verbose mode\n" msgid "Mutter was compiled without support for verbose mode\n"
msgstr "Mutter зібрано без підтримки докладного режиму\n" msgstr "Mutter зібрано без підтримки докладного режиму\n"
@@ -755,6 +765,9 @@ msgstr "Перемикання режимів: режим %d"
#: src/x11/meta-x11-display.c:676 #: src/x11/meta-x11-display.c:676
#, c-format #, c-format
#| msgid ""
#| "Display \"%s\" already has a window manager; try using the --replace "
#| "option to replace the current window manager."
msgid "" msgid ""
"Display “%s” already has a window manager; try using the --replace option to " "Display “%s” already has a window manager; try using the --replace option to "
"replace the current window manager." "replace the current window manager."
@@ -768,11 +781,13 @@ msgstr "Не вдалося ініціалізувати GDK\n"
#: src/x11/meta-x11-display.c:1113 #: src/x11/meta-x11-display.c:1113
#, c-format #, c-format
#| msgid "Failed to open X Window System display '%s'\n"
msgid "Failed to open X Window System display “%s”\n" msgid "Failed to open X Window System display “%s”\n"
msgstr "Не вдалось відкрити дисплей віконної системи X «%s»\n" msgstr "Не вдалось відкрити дисплей віконної системи X «%s»\n"
#: src/x11/meta-x11-display.c:1196 #: src/x11/meta-x11-display.c:1196
#, c-format #, c-format
#| msgid "Screen %d on display '%s' is invalid\n"
msgid "Screen %d on display “%s” is invalid\n" msgid "Screen %d on display “%s” is invalid\n"
msgstr "Екран %d на дисплеї «%s» не правильний\n" msgstr "Екран %d на дисплеї «%s» не правильний\n"
@@ -782,14 +797,17 @@ msgid "Format %s not supported"
msgstr "Підтримки формату %s не передбачено" msgstr "Підтримки формату %s не передбачено"
#: src/x11/session.c:1821 #: src/x11/session.c:1821
#| msgid ""
#| "These windows do not support &quot;save current setup&quot; and will have "
#| "to be restarted manually next time you log in."
msgid "" msgid ""
"These windows do not support “save current setup” and will have to be " "These windows do not support “save current setup” and will have to be "
"restarted manually next time you log in." "restarted manually next time you log in."
msgstr "" msgstr ""
"Ці вікна не підтримують «збереження поточних параметрів», і при наступному " "Ці вікна не підтримують «збереження поточних параметрів», і при "
"входженні їх треба запустити власноруч." "наступному входженні їх треба запустити власноруч."
#: src/x11/window-props.c:548 #: src/x11/window-props.c:569
#, c-format #, c-format
msgid "%s (on %s)" msgid "%s (on %s)"
msgstr "%s (на %s)" msgstr "%s (на %s)"

View File

@@ -34,7 +34,6 @@
#include "backends/meta-backend-types.h" #include "backends/meta-backend-types.h"
#include "backends/meta-cursor-renderer.h" #include "backends/meta-cursor-renderer.h"
#include "backends/meta-egl.h" #include "backends/meta-egl.h"
#include "backends/meta-input-mapper-private.h"
#include "backends/meta-input-settings-private.h" #include "backends/meta-input-settings-private.h"
#include "backends/meta-monitor-manager-private.h" #include "backends/meta-monitor-manager-private.h"
#include "backends/meta-orientation-manager.h" #include "backends/meta-orientation-manager.h"
@@ -68,9 +67,7 @@ struct _MetaBackendClass
MetaMonitorManager * (* create_monitor_manager) (MetaBackend *backend, MetaMonitorManager * (* create_monitor_manager) (MetaBackend *backend,
GError **error); GError **error);
MetaCursorRenderer * (* get_cursor_renderer) (MetaBackend *backend, MetaCursorRenderer * (* create_cursor_renderer) (MetaBackend *backend);
ClutterInputDevice *device);
MetaCursorTracker * (* create_cursor_tracker) (MetaBackend *backend);
MetaRenderer * (* create_renderer) (MetaBackend *backend, MetaRenderer * (* create_renderer) (MetaBackend *backend,
GError **error); GError **error);
MetaInputSettings * (* create_input_settings) (MetaBackend *backend); MetaInputSettings * (* create_input_settings) (MetaBackend *backend);
@@ -107,8 +104,6 @@ struct _MetaBackendClass
void (* set_numlock) (MetaBackend *backend, void (* set_numlock) (MetaBackend *backend,
gboolean numlock_state); gboolean numlock_state);
void (* set_pointer_constraint) (MetaBackend *backend,
MetaPointerConstraint *constraint);
}; };
void meta_init_backend (GType backend_gtype); void meta_init_backend (GType backend_gtype);
@@ -133,8 +128,6 @@ META_EXPORT_TEST
MetaMonitorManager * meta_backend_get_monitor_manager (MetaBackend *backend); MetaMonitorManager * meta_backend_get_monitor_manager (MetaBackend *backend);
MetaOrientationManager * meta_backend_get_orientation_manager (MetaBackend *backend); MetaOrientationManager * meta_backend_get_orientation_manager (MetaBackend *backend);
MetaCursorTracker * meta_backend_get_cursor_tracker (MetaBackend *backend); MetaCursorTracker * meta_backend_get_cursor_tracker (MetaBackend *backend);
MetaCursorRenderer * meta_backend_get_cursor_renderer_for_device (MetaBackend *backend,
ClutterInputDevice *device);
MetaCursorRenderer * meta_backend_get_cursor_renderer (MetaBackend *backend); MetaCursorRenderer * meta_backend_get_cursor_renderer (MetaBackend *backend);
META_EXPORT_TEST META_EXPORT_TEST
MetaRenderer * meta_backend_get_renderer (MetaBackend *backend); MetaRenderer * meta_backend_get_renderer (MetaBackend *backend);
@@ -177,7 +170,6 @@ gboolean meta_is_stage_views_enabled (void);
gboolean meta_is_stage_views_scaled (void); gboolean meta_is_stage_views_scaled (void);
MetaInputMapper *meta_backend_get_input_mapper (MetaBackend *backend);
MetaInputSettings *meta_backend_get_input_settings (MetaBackend *backend); MetaInputSettings *meta_backend_get_input_settings (MetaBackend *backend);
void meta_backend_notify_keymap_changed (MetaBackend *backend); void meta_backend_notify_keymap_changed (MetaBackend *backend);
@@ -198,12 +190,4 @@ GList * meta_backend_get_gpus (MetaBackend *backend);
WacomDeviceDatabase * meta_backend_get_wacom_database (MetaBackend *backend); WacomDeviceDatabase * meta_backend_get_wacom_database (MetaBackend *backend);
#endif #endif
void meta_backend_add_hw_cursor_inhibitor (MetaBackend *backend,
MetaHwCursorInhibitor *inhibitor);
void meta_backend_remove_hw_cursor_inhibitor (MetaBackend *backend,
MetaHwCursorInhibitor *inhibitor);
gboolean meta_backend_is_hw_cursors_inhibited (MetaBackend *backend);
#endif /* META_BACKEND_PRIVATE_H */ #endif /* META_BACKEND_PRIVATE_H */

View File

@@ -53,10 +53,8 @@
#include <stdlib.h> #include <stdlib.h>
#include "backends/meta-cursor-renderer.h"
#include "backends/meta-cursor-tracker-private.h" #include "backends/meta-cursor-tracker-private.h"
#include "backends/meta-idle-monitor-private.h" #include "backends/meta-idle-monitor-private.h"
#include "backends/meta-input-mapper-private.h"
#include "backends/meta-input-settings-private.h" #include "backends/meta-input-settings-private.h"
#include "backends/meta-logical-monitor.h" #include "backends/meta-logical-monitor.h"
#include "backends/meta-monitor-manager-dummy.h" #include "backends/meta-monitor-manager-dummy.h"
@@ -122,9 +120,8 @@ struct _MetaBackendPrivate
MetaMonitorManager *monitor_manager; MetaMonitorManager *monitor_manager;
MetaOrientationManager *orientation_manager; MetaOrientationManager *orientation_manager;
MetaCursorTracker *cursor_tracker; MetaCursorTracker *cursor_tracker;
GHashTable *cursor_renderers; MetaCursorRenderer *cursor_renderer;
MetaInputSettings *input_settings; MetaInputSettings *input_settings;
MetaInputMapper *input_mapper;
MetaRenderer *renderer; MetaRenderer *renderer;
#ifdef HAVE_EGL #ifdef HAVE_EGL
MetaEgl *egl; MetaEgl *egl;
@@ -153,7 +150,6 @@ struct _MetaBackendPrivate
ClutterActor *stage; ClutterActor *stage;
GList *gpus; GList *gpus;
GList *hw_cursor_inhibitors;
gboolean is_pointer_position_initialized; gboolean is_pointer_position_initialized;
@@ -177,14 +173,6 @@ struct _MetaBackendPrivate
}; };
typedef struct _MetaBackendPrivate MetaBackendPrivate; typedef struct _MetaBackendPrivate MetaBackendPrivate;
typedef struct _MetaBackendSource MetaBackendSource;
struct _MetaBackendSource
{
GSource parent;
MetaBackend *backend;
};
static void static void
initable_iface_init (GInitableIface *initable_iface); initable_iface_init (GInitableIface *initable_iface);
@@ -225,8 +213,6 @@ meta_backend_finalize (GObject *object)
g_clear_pointer (&priv->wacom_db, libwacom_database_destroy); g_clear_pointer (&priv->wacom_db, libwacom_database_destroy);
#endif #endif
g_hash_table_unref (priv->cursor_renderers);
if (priv->sleep_signal_id) if (priv->sleep_signal_id)
g_dbus_connection_signal_unsubscribe (priv->system_bus, priv->sleep_signal_id); g_dbus_connection_signal_unsubscribe (priv->system_bus, priv->sleep_signal_id);
if (priv->upower_watch_id) if (priv->upower_watch_id)
@@ -278,19 +264,6 @@ reset_pointer_position (MetaBackend *backend)
primary->rect.y + primary->rect.height * 0.9); primary->rect.y + primary->rect.height * 0.9);
} }
static void
update_cursors (MetaBackend *backend)
{
MetaBackendPrivate *priv = meta_backend_get_instance_private (backend);
MetaCursorRenderer *renderer;
GHashTableIter iter;
g_hash_table_iter_init (&iter, priv->cursor_renderers);
while (g_hash_table_iter_next (&iter, NULL, (gpointer *) &renderer))
meta_cursor_renderer_force_update (renderer);
}
void void
meta_backend_monitors_changed (MetaBackend *backend) meta_backend_monitors_changed (MetaBackend *backend)
{ {
@@ -316,7 +289,7 @@ meta_backend_monitors_changed (MetaBackend *backend)
} }
} }
update_cursors (backend); meta_cursor_renderer_force_update (priv->cursor_renderer);
} }
void void
@@ -382,19 +355,8 @@ on_device_added (ClutterSeat *seat,
gpointer user_data) gpointer user_data)
{ {
MetaBackend *backend = META_BACKEND (user_data); MetaBackend *backend = META_BACKEND (user_data);
MetaBackendPrivate *priv = meta_backend_get_instance_private (backend);
ClutterInputDeviceType device_type;
create_device_monitor (backend, device); create_device_monitor (backend, device);
device_type = clutter_input_device_get_device_type (device);
if (device_type == CLUTTER_TOUCHSCREEN_DEVICE ||
device_type == CLUTTER_TABLET_DEVICE ||
device_type == CLUTTER_PEN_DEVICE ||
device_type == CLUTTER_ERASER_DEVICE ||
device_type == CLUTTER_CURSOR_DEVICE ||
device_type == CLUTTER_PAD_DEVICE)
meta_input_mapper_add_device (priv->input_mapper, device);
} }
static inline gboolean static inline gboolean
@@ -466,8 +428,6 @@ on_device_removed (ClutterSeat *seat,
destroy_device_monitor (backend, device); destroy_device_monitor (backend, device);
meta_input_mapper_remove_device (priv->input_mapper, device);
/* If the device the user last interacted goes away, check again pointer /* If the device the user last interacted goes away, check again pointer
* visibility. * visibility.
*/ */
@@ -478,7 +438,6 @@ on_device_removed (ClutterSeat *seat,
ClutterInputDeviceType device_type; ClutterInputDeviceType device_type;
priv->current_device = NULL; priv->current_device = NULL;
g_clear_handle_id (&priv->device_update_idle_id, g_source_remove);
device_type = clutter_input_device_get_device_type (device); device_type = clutter_input_device_get_device_type (device);
has_touchscreen = check_has_slave_touchscreen (seat); has_touchscreen = check_has_slave_touchscreen (seat);
@@ -545,42 +504,6 @@ meta_backend_create_input_settings (MetaBackend *backend)
return META_BACKEND_GET_CLASS (backend)->create_input_settings (backend); return META_BACKEND_GET_CLASS (backend)->create_input_settings (backend);
} }
static void
input_mapper_device_mapped_cb (MetaInputMapper *mapper,
ClutterInputDevice *device,
float matrix[6],
MetaBackend *backend)
{
MetaBackendPrivate *priv = meta_backend_get_instance_private (backend);
MetaInputSettings *input_settings = priv->input_settings;
meta_input_settings_set_device_matrix (input_settings, device, matrix);
}
static void
input_mapper_device_enabled_cb (MetaInputMapper *mapper,
ClutterInputDevice *device,
gboolean enabled,
MetaBackend *backend)
{
MetaBackendPrivate *priv = meta_backend_get_instance_private (backend);
MetaInputSettings *input_settings = priv->input_settings;
meta_input_settings_set_device_enabled (input_settings, device, enabled);
}
static void
input_mapper_device_aspect_ratio_cb (MetaInputMapper *mapper,
ClutterInputDevice *device,
double aspect_ratio,
MetaBackend *backend)
{
MetaBackendPrivate *priv = meta_backend_get_instance_private (backend);
MetaInputSettings *input_settings = priv->input_settings;
meta_input_settings_set_device_aspect_ratio (input_settings, device, aspect_ratio);
}
static void static void
meta_backend_real_post_init (MetaBackend *backend) meta_backend_real_post_init (MetaBackend *backend)
{ {
@@ -596,6 +519,8 @@ meta_backend_real_post_init (MetaBackend *backend)
meta_backend_sync_screen_size (backend); meta_backend_sync_screen_size (backend);
priv->cursor_renderer = META_BACKEND_GET_CLASS (backend)->create_cursor_renderer (backend);
priv->device_monitors = priv->device_monitors =
g_hash_table_new_full (NULL, NULL, NULL, (GDestroyNotify) g_object_unref); g_hash_table_new_full (NULL, NULL, NULL, (GDestroyNotify) g_object_unref);
@@ -604,8 +529,7 @@ meta_backend_real_post_init (MetaBackend *backend)
g_signal_connect_object (seat, "device-added", g_signal_connect_object (seat, "device-added",
G_CALLBACK (on_device_added), backend, 0); G_CALLBACK (on_device_added), backend, 0);
g_signal_connect_object (seat, "device-removed", g_signal_connect_object (seat, "device-removed",
G_CALLBACK (on_device_removed), backend, G_CALLBACK (on_device_removed), backend, 0);
G_CONNECT_AFTER);
set_initial_pointer_visibility (backend, seat); set_initial_pointer_visibility (backend, seat);
@@ -620,14 +544,6 @@ meta_backend_real_post_init (MetaBackend *backend)
meta_input_settings_maybe_restore_numlock_state (priv->input_settings); meta_input_settings_maybe_restore_numlock_state (priv->input_settings);
} }
priv->input_mapper = meta_input_mapper_new ();
g_signal_connect (priv->input_mapper, "device-mapped",
G_CALLBACK (input_mapper_device_mapped_cb), backend);
g_signal_connect (priv->input_mapper, "device-enabled",
G_CALLBACK (input_mapper_device_enabled_cb), backend);
g_signal_connect (priv->input_mapper, "device-aspect-ratio",
G_CALLBACK (input_mapper_device_aspect_ratio_cb), backend);
#ifdef HAVE_REMOTE_DESKTOP #ifdef HAVE_REMOTE_DESKTOP
priv->dbus_session_watcher = g_object_new (META_TYPE_DBUS_SESSION_WATCHER, NULL); priv->dbus_session_watcher = g_object_new (META_TYPE_DBUS_SESSION_WATCHER, NULL);
priv->screen_cast = meta_screen_cast_new (backend, priv->screen_cast = meta_screen_cast_new (backend,
@@ -676,14 +592,6 @@ meta_backend_real_is_lid_closed (MetaBackend *backend)
return priv->lid_is_closed; return priv->lid_is_closed;
} }
static MetaCursorTracker *
meta_backend_real_create_cursor_tracker (MetaBackend *backend)
{
return g_object_new (META_TYPE_CURSOR_TRACKER,
"backend", backend,
NULL);
}
gboolean gboolean
meta_backend_is_lid_closed (MetaBackend *backend) meta_backend_is_lid_closed (MetaBackend *backend)
{ {
@@ -837,7 +745,6 @@ meta_backend_class_init (MetaBackendClass *klass)
klass->ungrab_device = meta_backend_real_ungrab_device; klass->ungrab_device = meta_backend_real_ungrab_device;
klass->select_stage_events = meta_backend_real_select_stage_events; klass->select_stage_events = meta_backend_real_select_stage_events;
klass->is_lid_closed = meta_backend_real_is_lid_closed; klass->is_lid_closed = meta_backend_real_is_lid_closed;
klass->create_cursor_tracker = meta_backend_real_create_cursor_tracker;
signals[KEYMAP_CHANGED] = signals[KEYMAP_CHANGED] =
g_signal_new ("keymap-changed", g_signal_new ("keymap-changed",
@@ -1000,18 +907,10 @@ clutter_source_dispatch (GSource *source,
GSourceFunc callback, GSourceFunc callback,
gpointer user_data) gpointer user_data)
{ {
MetaBackendSource *backend_source = (MetaBackendSource *) source;
MetaBackendPrivate *priv =
meta_backend_get_instance_private (backend_source->backend);
ClutterEvent *event = clutter_event_get (); ClutterEvent *event = clutter_event_get ();
ClutterSeat *seat;
if (event) if (event)
{ {
event->any.stage =
CLUTTER_STAGE (meta_backend_get_stage (backend_source->backend));
seat = clutter_backend_get_default_seat (priv->clutter_backend);
clutter_seat_handle_event_post (seat, event);
clutter_do_event (event); clutter_do_event (event);
clutter_event_free (event); clutter_event_free (event);
} }
@@ -1037,7 +936,6 @@ static gboolean
init_clutter (MetaBackend *backend, init_clutter (MetaBackend *backend,
GError **error) GError **error)
{ {
MetaBackendSource *backend_source;
GSource *source; GSource *source;
clutter_set_custom_backend_func (meta_get_clutter_backend); clutter_set_custom_backend_func (meta_get_clutter_backend);
@@ -1049,9 +947,7 @@ init_clutter (MetaBackend *backend,
return FALSE; return FALSE;
} }
source = g_source_new (&clutter_source_funcs, sizeof (MetaBackendSource)); source = g_source_new (&clutter_source_funcs, sizeof (GSource));
backend_source = (MetaBackendSource *) source;
backend_source->backend = backend;
g_source_attach (source, NULL); g_source_attach (source, NULL);
g_source_unref (source); g_source_unref (source);
@@ -1092,8 +988,7 @@ meta_backend_initable_init (GInitable *initable,
if (!priv->renderer) if (!priv->renderer)
return FALSE; return FALSE;
priv->cursor_tracker = priv->cursor_tracker = g_object_new (META_TYPE_CURSOR_TRACKER, NULL);
META_BACKEND_GET_CLASS (backend)->create_cursor_tracker (backend);
priv->dnd = g_object_new (META_TYPE_DND, NULL); priv->dnd = g_object_new (META_TYPE_DND, NULL);
@@ -1176,25 +1071,8 @@ MetaCursorRenderer *
meta_backend_get_cursor_renderer (MetaBackend *backend) meta_backend_get_cursor_renderer (MetaBackend *backend)
{ {
MetaBackendPrivate *priv = meta_backend_get_instance_private (backend); MetaBackendPrivate *priv = meta_backend_get_instance_private (backend);
ClutterInputDevice *pointer;
ClutterSeat *seat;
seat = clutter_backend_get_default_seat (priv->clutter_backend); return priv->cursor_renderer;
pointer = clutter_seat_get_pointer (seat);
return meta_backend_get_cursor_renderer_for_device (backend, pointer);
}
MetaCursorRenderer *
meta_backend_get_cursor_renderer_for_device (MetaBackend *backend,
ClutterInputDevice *device)
{
g_return_val_if_fail (META_IS_BACKEND (backend), NULL);
g_return_val_if_fail (CLUTTER_IS_INPUT_DEVICE (device), NULL);
g_return_val_if_fail (clutter_input_device_get_device_type (device) !=
CLUTTER_KEYBOARD_DEVICE, NULL);
return META_BACKEND_GET_CLASS (backend)->get_cursor_renderer (backend, device);
} }
/** /**
@@ -1441,7 +1319,7 @@ meta_backend_get_client_pointer_constraint (MetaBackend *backend)
* @constraint: (nullable): the client constraint to follow. * @constraint: (nullable): the client constraint to follow.
* *
* Sets the current pointer constraint and removes (and unrefs) the previous * Sets the current pointer constraint and removes (and unrefs) the previous
* one. If @constraint is %NULL, this means that there is no * one. If @constrant is %NULL, this means that there is no
* #MetaPointerConstraint active. * #MetaPointerConstraint active.
*/ */
void void
@@ -1450,8 +1328,11 @@ meta_backend_set_client_pointer_constraint (MetaBackend *backend,
{ {
MetaBackendPrivate *priv = meta_backend_get_instance_private (backend); MetaBackendPrivate *priv = meta_backend_get_instance_private (backend);
META_BACKEND_GET_CLASS (backend)->set_pointer_constraint (backend, constraint); g_assert (!constraint || !priv->client_pointer_constraint);
g_set_object (&priv->client_pointer_constraint, constraint);
g_clear_object (&priv->client_pointer_constraint);
if (constraint)
priv->client_pointer_constraint = g_object_ref (constraint);
} }
ClutterBackend * ClutterBackend *
@@ -1517,14 +1398,6 @@ meta_is_stage_views_scaled (void)
return layout_mode == META_LOGICAL_MONITOR_LAYOUT_MODE_LOGICAL; return layout_mode == META_LOGICAL_MONITOR_LAYOUT_MODE_LOGICAL;
} }
MetaInputMapper *
meta_backend_get_input_mapper (MetaBackend *backend)
{
MetaBackendPrivate *priv = meta_backend_get_instance_private (backend);
return priv->input_mapper;
}
MetaInputSettings * MetaInputSettings *
meta_backend_get_input_settings (MetaBackend *backend) meta_backend_get_input_settings (MetaBackend *backend)
{ {
@@ -1591,40 +1464,3 @@ meta_backend_get_wacom_database (MetaBackend *backend)
return priv->wacom_db; return priv->wacom_db;
} }
#endif #endif
void
meta_backend_add_hw_cursor_inhibitor (MetaBackend *backend,
MetaHwCursorInhibitor *inhibitor)
{
MetaBackendPrivate *priv = meta_backend_get_instance_private (backend);
priv->hw_cursor_inhibitors = g_list_prepend (priv->hw_cursor_inhibitors,
inhibitor);
}
void
meta_backend_remove_hw_cursor_inhibitor (MetaBackend *backend,
MetaHwCursorInhibitor *inhibitor)
{
MetaBackendPrivate *priv = meta_backend_get_instance_private (backend);
priv->hw_cursor_inhibitors = g_list_remove (priv->hw_cursor_inhibitors,
inhibitor);
}
gboolean
meta_backend_is_hw_cursors_inhibited (MetaBackend *backend)
{
MetaBackendPrivate *priv = meta_backend_get_instance_private (backend);
GList *l;
for (l = priv->hw_cursor_inhibitors; l; l = l->next)
{
MetaHwCursorInhibitor *inhibitor = l->data;
if (meta_hw_cursor_inhibitor_is_cursor_inhibited (inhibitor))
return TRUE;
}
return FALSE;
}

View File

@@ -28,8 +28,6 @@
#include <math.h> #include <math.h>
#include "backends/meta-backend-private.h"
#include "backends/meta-logical-monitor.h"
#include "backends/meta-stage-private.h" #include "backends/meta-stage-private.h"
#include "clutter/clutter.h" #include "clutter/clutter.h"
#include "clutter/clutter-mutter.h" #include "clutter/clutter-mutter.h"
@@ -46,7 +44,6 @@ enum
PROP_0, PROP_0,
PROP_BACKEND, PROP_BACKEND,
PROP_DEVICE,
N_PROPS N_PROPS
}; };
@@ -60,10 +57,7 @@ struct _MetaCursorRendererPrivate
float current_x; float current_x;
float current_y; float current_y;
ClutterInputDevice *device;
MetaCursorSprite *displayed_cursor; MetaCursorSprite *displayed_cursor;
MetaCursorSprite *overlay_cursor;
MetaOverlay *stage_overlay; MetaOverlay *stage_overlay;
gboolean handled_by_backend; gboolean handled_by_backend;
gulong after_paint_handler_id; gulong after_paint_handler_id;
@@ -81,13 +75,14 @@ static guint signals[LAST_SIGNAL];
G_DEFINE_TYPE_WITH_PRIVATE (MetaCursorRenderer, meta_cursor_renderer, G_TYPE_OBJECT); G_DEFINE_TYPE_WITH_PRIVATE (MetaCursorRenderer, meta_cursor_renderer, G_TYPE_OBJECT);
gboolean static gboolean
meta_hw_cursor_inhibitor_is_cursor_inhibited (MetaHwCursorInhibitor *inhibitor) meta_hw_cursor_inhibitor_is_cursor_sprite_inhibited (MetaHwCursorInhibitor *inhibitor,
MetaCursorSprite *cursor_sprite)
{ {
MetaHwCursorInhibitorInterface *iface = MetaHwCursorInhibitorInterface *iface =
META_HW_CURSOR_INHIBITOR_GET_IFACE (inhibitor); META_HW_CURSOR_INHIBITOR_GET_IFACE (inhibitor);
return iface->is_cursor_inhibited (inhibitor); return iface->is_cursor_sprite_inhibited (inhibitor, cursor_sprite);
} }
static void static void
@@ -128,16 +123,18 @@ align_cursor_position (MetaCursorRenderer *renderer,
graphene_rect_offset (rect, view_layout.x, view_layout.y); graphene_rect_offset (rect, view_layout.x, view_layout.y);
} }
void static void
meta_cursor_renderer_update_stage_overlay (MetaCursorRenderer *renderer, queue_redraw (MetaCursorRenderer *renderer,
MetaCursorSprite *cursor_sprite) MetaCursorSprite *cursor_sprite)
{ {
MetaCursorRendererPrivate *priv = meta_cursor_renderer_get_instance_private (renderer); MetaCursorRendererPrivate *priv = meta_cursor_renderer_get_instance_private (renderer);
ClutterActor *stage = meta_backend_get_stage (priv->backend); ClutterActor *stage = meta_backend_get_stage (priv->backend);
CoglTexture *texture; CoglTexture *texture;
graphene_rect_t rect = GRAPHENE_RECT_INIT_ZERO; graphene_rect_t rect = GRAPHENE_RECT_INIT_ZERO;
g_set_object (&priv->overlay_cursor, cursor_sprite); /* During early initialization, we can have no stage */
if (!stage)
return;
if (cursor_sprite) if (cursor_sprite)
{ {
@@ -148,12 +145,11 @@ meta_cursor_renderer_update_stage_overlay (MetaCursorRenderer *renderer,
if (!priv->stage_overlay) if (!priv->stage_overlay)
priv->stage_overlay = meta_stage_create_cursor_overlay (META_STAGE (stage)); priv->stage_overlay = meta_stage_create_cursor_overlay (META_STAGE (stage));
if (cursor_sprite) if (cursor_sprite && !priv->handled_by_backend)
texture = meta_cursor_sprite_get_cogl_texture (cursor_sprite); texture = meta_cursor_sprite_get_cogl_texture (cursor_sprite);
else else
texture = NULL; texture = NULL;
meta_overlay_set_visible (priv->stage_overlay, !priv->handled_by_backend);
meta_stage_update_cursor_overlay (META_STAGE (stage), priv->stage_overlay, meta_stage_update_cursor_overlay (META_STAGE (stage), priv->stage_overlay,
texture, &rect); texture, &rect);
} }
@@ -206,9 +202,6 @@ meta_cursor_renderer_get_property (GObject *object,
case PROP_BACKEND: case PROP_BACKEND:
g_value_set_object (value, priv->backend); g_value_set_object (value, priv->backend);
break; break;
case PROP_DEVICE:
g_value_set_object (value, priv->device);
break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break; break;
@@ -230,9 +223,6 @@ meta_cursor_renderer_set_property (GObject *object,
case PROP_BACKEND: case PROP_BACKEND:
priv->backend = g_value_get_object (value); priv->backend = g_value_get_object (value);
break; break;
case PROP_DEVICE:
priv->device = g_value_get_object (value);
break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break; break;
@@ -251,9 +241,6 @@ meta_cursor_renderer_finalize (GObject *object)
g_clear_signal_handler (&priv->after_paint_handler_id, stage); g_clear_signal_handler (&priv->after_paint_handler_id, stage);
g_clear_object (&priv->displayed_cursor);
g_clear_object (&priv->overlay_cursor);
G_OBJECT_CLASS (meta_cursor_renderer_parent_class)->finalize (object); G_OBJECT_CLASS (meta_cursor_renderer_parent_class)->finalize (object);
} }
@@ -293,14 +280,6 @@ meta_cursor_renderer_class_init (MetaCursorRendererClass *klass)
G_PARAM_READWRITE | G_PARAM_READWRITE |
G_PARAM_CONSTRUCT_ONLY | G_PARAM_CONSTRUCT_ONLY |
G_PARAM_STATIC_STRINGS); G_PARAM_STATIC_STRINGS);
obj_props[PROP_DEVICE] =
g_param_spec_object ("device",
"device",
"Input device",
CLUTTER_TYPE_INPUT_DEVICE,
G_PARAM_READWRITE |
G_PARAM_CONSTRUCT_ONLY |
G_PARAM_STATIC_STRINGS);
g_object_class_install_properties (object_class, N_PROPS, obj_props); g_object_class_install_properties (object_class, N_PROPS, obj_props);
signals[CURSOR_PAINTED] = g_signal_new ("cursor-painted", signals[CURSOR_PAINTED] = g_signal_new ("cursor-painted",
@@ -349,74 +328,40 @@ meta_cursor_renderer_calculate_rect (MetaCursorRenderer *renderer,
}; };
} }
static float
find_highest_logical_monitor_scale (MetaBackend *backend,
MetaCursorSprite *cursor_sprite)
{
MetaMonitorManager *monitor_manager =
meta_backend_get_monitor_manager (backend);
MetaCursorRenderer *cursor_renderer =
meta_backend_get_cursor_renderer (backend);
graphene_rect_t cursor_rect;
GList *logical_monitors;
GList *l;
float highest_scale = 0.0;
cursor_rect = meta_cursor_renderer_calculate_rect (cursor_renderer,
cursor_sprite);
logical_monitors =
meta_monitor_manager_get_logical_monitors (monitor_manager);
for (l = logical_monitors; l; l = l->next)
{
MetaLogicalMonitor *logical_monitor = l->data;
graphene_rect_t logical_monitor_rect =
meta_rectangle_to_graphene_rect (&logical_monitor->rect);
if (!graphene_rect_intersection (&cursor_rect,
&logical_monitor_rect,
NULL))
continue;
highest_scale = MAX (highest_scale, logical_monitor->scale);
}
return highest_scale;
}
static void static void
meta_cursor_renderer_update_cursor (MetaCursorRenderer *renderer, meta_cursor_renderer_update_cursor (MetaCursorRenderer *renderer,
MetaCursorSprite *cursor_sprite) MetaCursorSprite *cursor_sprite)
{ {
MetaCursorRendererPrivate *priv = meta_cursor_renderer_get_instance_private (renderer); MetaCursorRendererPrivate *priv = meta_cursor_renderer_get_instance_private (renderer);
gboolean handled_by_backend; gboolean handled_by_backend;
gboolean should_redraw = FALSE;
if (cursor_sprite) if (cursor_sprite)
{ meta_cursor_sprite_prepare_at (cursor_sprite,
float scale = find_highest_logical_monitor_scale (priv->backend, (int) priv->current_x,
cursor_sprite); (int) priv->current_y);
meta_cursor_sprite_prepare_at (cursor_sprite,
MAX (1, scale),
(int) priv->current_x,
(int) priv->current_y);
}
handled_by_backend = handled_by_backend =
META_CURSOR_RENDERER_GET_CLASS (renderer)->update_cursor (renderer, META_CURSOR_RENDERER_GET_CLASS (renderer)->update_cursor (renderer,
cursor_sprite); cursor_sprite);
if (handled_by_backend != priv->handled_by_backend) if (handled_by_backend != priv->handled_by_backend)
priv->handled_by_backend = handled_by_backend; {
priv->handled_by_backend = handled_by_backend;
should_redraw = TRUE;
}
meta_cursor_renderer_update_stage_overlay (renderer, cursor_sprite); if (!handled_by_backend)
should_redraw = TRUE;
if (should_redraw)
queue_redraw (renderer, cursor_sprite);
} }
MetaCursorRenderer * MetaCursorRenderer *
meta_cursor_renderer_new (MetaBackend *backend, meta_cursor_renderer_new (MetaBackend *backend)
ClutterInputDevice *device)
{ {
return g_object_new (META_TYPE_CURSOR_RENDERER, return g_object_new (META_TYPE_CURSOR_RENDERER,
"backend", backend, "backend", backend,
"device", device,
NULL); NULL);
} }
@@ -428,7 +373,7 @@ meta_cursor_renderer_set_cursor (MetaCursorRenderer *renderer,
if (priv->displayed_cursor == cursor_sprite) if (priv->displayed_cursor == cursor_sprite)
return; return;
g_set_object (&priv->displayed_cursor, cursor_sprite); priv->displayed_cursor = cursor_sprite;
meta_cursor_renderer_update_cursor (renderer, cursor_sprite); meta_cursor_renderer_update_cursor (renderer, cursor_sprite);
} }
@@ -443,43 +388,78 @@ meta_cursor_renderer_force_update (MetaCursorRenderer *renderer)
} }
void void
meta_cursor_renderer_update_position (MetaCursorRenderer *renderer) meta_cursor_renderer_set_position (MetaCursorRenderer *renderer,
float x,
float y)
{ {
MetaCursorRendererPrivate *priv = meta_cursor_renderer_get_instance_private (renderer); MetaCursorRendererPrivate *priv = meta_cursor_renderer_get_instance_private (renderer);
graphene_point_t pos;
clutter_input_device_get_coords (priv->device, NULL, &pos); g_assert (meta_is_wayland_compositor ());
priv->current_x = pos.x;
priv->current_y = pos.y; priv->current_x = x;
priv->current_y = y;
meta_cursor_renderer_update_cursor (renderer, priv->displayed_cursor); meta_cursor_renderer_update_cursor (renderer, priv->displayed_cursor);
} }
graphene_point_t
meta_cursor_renderer_get_position (MetaCursorRenderer *renderer)
{
MetaCursorRendererPrivate *priv =
meta_cursor_renderer_get_instance_private (renderer);
return (graphene_point_t) {
.x = priv->current_x,
.y = priv->current_y
};
}
MetaCursorSprite * MetaCursorSprite *
meta_cursor_renderer_get_cursor (MetaCursorRenderer *renderer) meta_cursor_renderer_get_cursor (MetaCursorRenderer *renderer)
{ {
MetaCursorRendererPrivate *priv = meta_cursor_renderer_get_instance_private (renderer); MetaCursorRendererPrivate *priv = meta_cursor_renderer_get_instance_private (renderer);
return priv->overlay_cursor; return priv->displayed_cursor;
}
void
meta_cursor_renderer_add_hw_cursor_inhibitor (MetaCursorRenderer *renderer,
MetaHwCursorInhibitor *inhibitor)
{
MetaCursorRendererPrivate *priv =
meta_cursor_renderer_get_instance_private (renderer);
priv->hw_cursor_inhibitors = g_list_prepend (priv->hw_cursor_inhibitors,
inhibitor);
}
void
meta_cursor_renderer_remove_hw_cursor_inhibitor (MetaCursorRenderer *renderer,
MetaHwCursorInhibitor *inhibitor)
{
MetaCursorRendererPrivate *priv =
meta_cursor_renderer_get_instance_private (renderer);
priv->hw_cursor_inhibitors = g_list_remove (priv->hw_cursor_inhibitors,
inhibitor);
} }
gboolean gboolean
meta_cursor_renderer_is_overlay_visible (MetaCursorRenderer *renderer) meta_cursor_renderer_is_hw_cursors_inhibited (MetaCursorRenderer *renderer,
MetaCursorSprite *cursor_sprite)
{ {
MetaCursorRendererPrivate *priv = MetaCursorRendererPrivate *priv =
meta_cursor_renderer_get_instance_private (renderer); meta_cursor_renderer_get_instance_private (renderer);
GList *l;
if (!priv->stage_overlay) for (l = priv->hw_cursor_inhibitors; l; l = l->next)
return FALSE; {
MetaHwCursorInhibitor *inhibitor = l->data;
return meta_overlay_is_visible (priv->stage_overlay); if (meta_hw_cursor_inhibitor_is_cursor_sprite_inhibited (inhibitor,
} cursor_sprite))
return TRUE;
ClutterInputDevice * }
meta_cursor_renderer_get_input_device (MetaCursorRenderer *renderer)
{ return FALSE;
MetaCursorRendererPrivate *priv =
meta_cursor_renderer_get_instance_private (renderer);
return priv->device;
} }

View File

@@ -38,11 +38,10 @@ struct _MetaHwCursorInhibitorInterface
{ {
GTypeInterface parent_iface; GTypeInterface parent_iface;
gboolean (* is_cursor_inhibited) (MetaHwCursorInhibitor *inhibitor); gboolean (* is_cursor_sprite_inhibited) (MetaHwCursorInhibitor *inhibitor,
MetaCursorSprite *cursor_sprite);
}; };
gboolean meta_hw_cursor_inhibitor_is_cursor_inhibited (MetaHwCursorInhibitor *inhibitor);
#define META_TYPE_CURSOR_RENDERER (meta_cursor_renderer_get_type ()) #define META_TYPE_CURSOR_RENDERER (meta_cursor_renderer_get_type ())
G_DECLARE_DERIVABLE_TYPE (MetaCursorRenderer, meta_cursor_renderer, G_DECLARE_DERIVABLE_TYPE (MetaCursorRenderer, meta_cursor_renderer,
META, CURSOR_RENDERER, GObject); META, CURSOR_RENDERER, GObject);
@@ -55,27 +54,32 @@ struct _MetaCursorRendererClass
MetaCursorSprite *cursor_sprite); MetaCursorSprite *cursor_sprite);
}; };
MetaCursorRenderer * meta_cursor_renderer_new (MetaBackend *backend, MetaCursorRenderer * meta_cursor_renderer_new (MetaBackend *backend);
ClutterInputDevice *device);
void meta_cursor_renderer_set_cursor (MetaCursorRenderer *renderer, void meta_cursor_renderer_set_cursor (MetaCursorRenderer *renderer,
MetaCursorSprite *cursor_sprite); MetaCursorSprite *cursor_sprite);
void meta_cursor_renderer_update_position (MetaCursorRenderer *renderer); void meta_cursor_renderer_set_position (MetaCursorRenderer *renderer,
float x,
float y);
graphene_point_t meta_cursor_renderer_get_position (MetaCursorRenderer *renderer);
void meta_cursor_renderer_force_update (MetaCursorRenderer *renderer); void meta_cursor_renderer_force_update (MetaCursorRenderer *renderer);
MetaCursorSprite * meta_cursor_renderer_get_cursor (MetaCursorRenderer *renderer); MetaCursorSprite * meta_cursor_renderer_get_cursor (MetaCursorRenderer *renderer);
gboolean meta_cursor_renderer_is_overlay_visible (MetaCursorRenderer *renderer); void meta_cursor_renderer_add_hw_cursor_inhibitor (MetaCursorRenderer *renderer,
MetaHwCursorInhibitor *inhibitor);
void meta_cursor_renderer_remove_hw_cursor_inhibitor (MetaCursorRenderer *renderer,
MetaHwCursorInhibitor *inhibitor);
gboolean meta_cursor_renderer_is_hw_cursors_inhibited (MetaCursorRenderer *renderer,
MetaCursorSprite *cursor_sprite);
graphene_rect_t meta_cursor_renderer_calculate_rect (MetaCursorRenderer *renderer, graphene_rect_t meta_cursor_renderer_calculate_rect (MetaCursorRenderer *renderer,
MetaCursorSprite *cursor_sprite); MetaCursorSprite *cursor_sprite);
void meta_cursor_renderer_emit_painted (MetaCursorRenderer *renderer, void meta_cursor_renderer_emit_painted (MetaCursorRenderer *renderer,
MetaCursorSprite *cursor_sprite); MetaCursorSprite *cursor_sprite);
ClutterInputDevice * meta_cursor_renderer_get_input_device (MetaCursorRenderer *renderer);
void meta_cursor_renderer_update_stage_overlay (MetaCursorRenderer *renderer,
MetaCursorSprite *cursor_sprite);
#endif /* META_CURSOR_RENDERER_H */ #endif /* META_CURSOR_RENDERER_H */

View File

@@ -24,31 +24,44 @@
#include "backends/meta-cursor.h" #include "backends/meta-cursor.h"
#include "backends/meta-cursor-renderer.h" #include "backends/meta-cursor-renderer.h"
#include "backends/x11/cm/meta-cursor-sprite-xfixes.h"
#include "meta/meta-cursor-tracker.h" #include "meta/meta-cursor-tracker.h"
struct _MetaCursorTrackerClass struct _MetaCursorTracker {
{ GObject parent_instance;
GObjectClass parent_class;
void (* set_force_track_position) (MetaCursorTracker *tracker, gboolean is_showing;
gboolean is_enabled);
MetaCursorSprite * (* get_sprite) (MetaCursorTracker *tracker); MetaCursorSprite *effective_cursor; /* May be NULL when hidden */
MetaCursorSprite *displayed_cursor;
/* Wayland clients can set a NULL buffer as their cursor
* explicitly, which means that we shouldn't display anything.
* So, we can't simply store a NULL in window_cursor to
* determine an unset window cursor; we need an extra boolean.
*/
gboolean has_window_cursor;
MetaCursorSprite *window_cursor;
MetaCursorSprite *root_cursor;
/* The cursor from the X11 server. */
MetaCursorSpriteXfixes *xfixes_cursor;
}; };
gboolean meta_cursor_tracker_handle_xevent (MetaCursorTracker *tracker,
XEvent *xevent);
void meta_cursor_tracker_set_window_cursor (MetaCursorTracker *tracker, void meta_cursor_tracker_set_window_cursor (MetaCursorTracker *tracker,
MetaCursorSprite *cursor_sprite); MetaCursorSprite *cursor_sprite);
void meta_cursor_tracker_unset_window_cursor (MetaCursorTracker *tracker); void meta_cursor_tracker_unset_window_cursor (MetaCursorTracker *tracker);
void meta_cursor_tracker_set_root_cursor (MetaCursorTracker *tracker, void meta_cursor_tracker_set_root_cursor (MetaCursorTracker *tracker,
MetaCursorSprite *cursor_sprite); MetaCursorSprite *cursor_sprite);
void meta_cursor_tracker_update_position (MetaCursorTracker *tracker); void meta_cursor_tracker_update_position (MetaCursorTracker *tracker,
float new_x,
float new_y);
void meta_cursor_tracker_track_position (MetaCursorTracker *tracker); MetaCursorSprite * meta_cursor_tracker_get_displayed_cursor (MetaCursorTracker *tracker);
void meta_cursor_tracker_untrack_position (MetaCursorTracker *tracker);
MetaBackend * meta_cursor_tracker_get_backend (MetaCursorTracker *tracker);
void meta_cursor_tracker_notify_cursor_changed (MetaCursorTracker *tracker);
#endif #endif

View File

@@ -31,53 +31,21 @@
#include "backends/meta-cursor-tracker-private.h" #include "backends/meta-cursor-tracker-private.h"
#include <gdk/gdk.h>
#include <gdk/gdkx.h>
#include <string.h> #include <string.h>
#include "backends/meta-backend-private.h" #include "backends/meta-backend-private.h"
#include "backends/x11/cm/meta-cursor-sprite-xfixes.h"
#include "cogl/cogl.h" #include "cogl/cogl.h"
#include "core/display-private.h"
#include "clutter/clutter.h" #include "clutter/clutter.h"
#include "meta-marshal.h"
#include "meta/main.h" #include "meta/main.h"
#include "meta/meta-x11-errors.h"
#include "meta/util.h" #include "meta/util.h"
#include "x11/meta-x11-display-private.h"
enum G_DEFINE_TYPE (MetaCursorTracker, meta_cursor_tracker, G_TYPE_OBJECT);
{
PROP_0,
PROP_BACKEND,
N_PROPS
};
static GParamSpec *obj_props[N_PROPS];
typedef struct _MetaCursorTrackerPrivate
{
MetaBackend *backend;
gboolean is_showing;
int track_position_count;
float x;
float y;
MetaCursorSprite *effective_cursor; /* May be NULL when hidden */
MetaCursorSprite *displayed_cursor;
/* Wayland clients can set a NULL buffer as their cursor
* explicitly, which means that we shouldn't display anything.
* So, we can't simply store a NULL in window_cursor to
* determine an unset window cursor; we need an extra boolean.
*/
gboolean has_window_cursor;
MetaCursorSprite *window_cursor;
MetaCursorSprite *root_cursor;
} MetaCursorTrackerPrivate;
G_DEFINE_TYPE_WITH_PRIVATE (MetaCursorTracker, meta_cursor_tracker,
G_TYPE_OBJECT)
enum enum
{ {
@@ -89,12 +57,6 @@ enum
static guint signals[LAST_SIGNAL]; static guint signals[LAST_SIGNAL];
void
meta_cursor_tracker_notify_cursor_changed (MetaCursorTracker *tracker)
{
g_signal_emit (tracker, signals[CURSOR_CHANGED], 0);
}
static void static void
cursor_texture_updated (MetaCursorSprite *cursor, cursor_texture_updated (MetaCursorSprite *cursor,
MetaCursorTracker *tracker) MetaCursorTracker *tracker)
@@ -105,28 +67,26 @@ cursor_texture_updated (MetaCursorSprite *cursor,
static gboolean static gboolean
update_displayed_cursor (MetaCursorTracker *tracker) update_displayed_cursor (MetaCursorTracker *tracker)
{ {
MetaCursorTrackerPrivate *priv =
meta_cursor_tracker_get_instance_private (tracker);
MetaDisplay *display = meta_get_display (); MetaDisplay *display = meta_get_display ();
MetaCursorSprite *cursor = NULL; MetaCursorSprite *cursor = NULL;
if (display && meta_display_windows_are_interactable (display) && if (display && meta_display_windows_are_interactable (display) &&
priv->has_window_cursor) tracker->has_window_cursor)
cursor = priv->window_cursor; cursor = tracker->window_cursor;
else else
cursor = priv->root_cursor; cursor = tracker->root_cursor;
if (priv->displayed_cursor == cursor) if (tracker->displayed_cursor == cursor)
return FALSE; return FALSE;
if (priv->displayed_cursor) if (tracker->displayed_cursor)
{ {
g_signal_handlers_disconnect_by_func (priv->displayed_cursor, g_signal_handlers_disconnect_by_func (tracker->displayed_cursor,
cursor_texture_updated, cursor_texture_updated,
tracker); tracker);
} }
g_set_object (&priv->displayed_cursor, cursor); g_set_object (&tracker->displayed_cursor, cursor);
if (cursor) if (cursor)
{ {
@@ -140,25 +100,22 @@ update_displayed_cursor (MetaCursorTracker *tracker)
static gboolean static gboolean
update_effective_cursor (MetaCursorTracker *tracker) update_effective_cursor (MetaCursorTracker *tracker)
{ {
MetaCursorTrackerPrivate *priv =
meta_cursor_tracker_get_instance_private (tracker);
MetaCursorSprite *cursor = NULL; MetaCursorSprite *cursor = NULL;
if (priv->is_showing) if (tracker->is_showing)
cursor = priv->displayed_cursor; cursor = tracker->displayed_cursor;
return g_set_object (&priv->effective_cursor, cursor); return g_set_object (&tracker->effective_cursor, cursor);
} }
static void static void
change_cursor_renderer (MetaCursorTracker *tracker) change_cursor_renderer (MetaCursorTracker *tracker)
{ {
MetaCursorTrackerPrivate *priv = MetaBackend *backend = meta_get_backend ();
meta_cursor_tracker_get_instance_private (tracker);
MetaCursorRenderer *cursor_renderer = MetaCursorRenderer *cursor_renderer =
meta_backend_get_cursor_renderer (priv->backend); meta_backend_get_cursor_renderer (backend);
meta_cursor_renderer_set_cursor (cursor_renderer, priv->effective_cursor); meta_cursor_renderer_set_cursor (cursor_renderer, tracker->effective_cursor);
} }
static void static void
@@ -176,83 +133,22 @@ sync_cursor (MetaCursorTracker *tracker)
} }
static void static void
meta_cursor_tracker_real_set_force_track_position (MetaCursorTracker *tracker, meta_cursor_tracker_init (MetaCursorTracker *self)
gboolean is_enabled)
{ {
} self->is_showing = TRUE;
static MetaCursorSprite *
meta_cursor_tracker_real_get_sprite (MetaCursorTracker *tracker)
{
MetaCursorTrackerPrivate *priv =
meta_cursor_tracker_get_instance_private (tracker);
return priv->displayed_cursor;
}
static void
meta_cursor_tracker_init (MetaCursorTracker *tracker)
{
MetaCursorTrackerPrivate *priv =
meta_cursor_tracker_get_instance_private (tracker);
priv->is_showing = TRUE;
priv->x = -1.0;
priv->y = -1.0;
}
static void
meta_cursor_tracker_get_property (GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec)
{
MetaCursorTracker *tracker = META_CURSOR_TRACKER (object);
MetaCursorTrackerPrivate *priv =
meta_cursor_tracker_get_instance_private (tracker);
switch (prop_id)
{
case PROP_BACKEND:
g_value_set_object (value, priv->backend);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static void
meta_cursor_tracker_set_property (GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
{
MetaCursorTracker *tracker = META_CURSOR_TRACKER (object);
MetaCursorTrackerPrivate *priv =
meta_cursor_tracker_get_instance_private (tracker);
switch (prop_id)
{
case PROP_BACKEND:
priv->backend = g_value_get_object (value);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
} }
static void static void
meta_cursor_tracker_finalize (GObject *object) meta_cursor_tracker_finalize (GObject *object)
{ {
MetaCursorTracker *tracker = META_CURSOR_TRACKER (object); MetaCursorTracker *self = META_CURSOR_TRACKER (object);
MetaCursorTrackerPrivate *priv =
meta_cursor_tracker_get_instance_private (tracker);
g_clear_object (&priv->effective_cursor); if (self->effective_cursor)
g_clear_object (&priv->displayed_cursor); g_object_unref (self->effective_cursor);
g_clear_object (&priv->root_cursor); if (self->displayed_cursor)
g_object_unref (self->displayed_cursor);
if (self->root_cursor)
g_object_unref (self->root_cursor);
G_OBJECT_CLASS (meta_cursor_tracker_parent_class)->finalize (object); G_OBJECT_CLASS (meta_cursor_tracker_parent_class)->finalize (object);
} }
@@ -262,25 +158,8 @@ meta_cursor_tracker_class_init (MetaCursorTrackerClass *klass)
{ {
GObjectClass *object_class = G_OBJECT_CLASS (klass); GObjectClass *object_class = G_OBJECT_CLASS (klass);
object_class->get_property = meta_cursor_tracker_get_property;
object_class->set_property = meta_cursor_tracker_set_property;
object_class->finalize = meta_cursor_tracker_finalize; object_class->finalize = meta_cursor_tracker_finalize;
klass->set_force_track_position =
meta_cursor_tracker_real_set_force_track_position;
klass->get_sprite =
meta_cursor_tracker_real_get_sprite;
obj_props[PROP_BACKEND] =
g_param_spec_object ("backend",
"backend",
"MetaBackend",
META_TYPE_BACKEND,
G_PARAM_READWRITE |
G_PARAM_CONSTRUCT_ONLY |
G_PARAM_STATIC_STRINGS);
g_object_class_install_properties (object_class, N_PROPS, obj_props);
signals[CURSOR_CHANGED] = g_signal_new ("cursor-changed", signals[CURSOR_CHANGED] = g_signal_new ("cursor-changed",
G_TYPE_FROM_CLASS (klass), G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST, G_SIGNAL_RUN_LAST,
@@ -300,8 +179,14 @@ meta_cursor_tracker_class_init (MetaCursorTrackerClass *klass)
G_TYPE_FROM_CLASS (klass), G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST, G_SIGNAL_RUN_LAST,
0, 0,
NULL, NULL, NULL, NULL, NULL,
G_TYPE_NONE, 0); meta_marshal_VOID__FLOAT_FLOAT,
G_TYPE_NONE, 2,
G_TYPE_FLOAT,
G_TYPE_FLOAT);
g_signal_set_va_marshaller (signals[CURSOR_MOVED],
G_TYPE_FROM_CLASS (klass),
meta_marshal_VOID__FLOAT_FLOATv);
signals[VISIBILITY_CHANGED] = g_signal_new ("visibility-changed", signals[VISIBILITY_CHANGED] = g_signal_new ("visibility-changed",
G_TYPE_FROM_CLASS (klass), G_TYPE_FROM_CLASS (klass),
@@ -334,16 +219,50 @@ set_window_cursor (MetaCursorTracker *tracker,
gboolean has_cursor, gboolean has_cursor,
MetaCursorSprite *cursor_sprite) MetaCursorSprite *cursor_sprite)
{ {
MetaCursorTrackerPrivate *priv = g_clear_object (&tracker->window_cursor);
meta_cursor_tracker_get_instance_private (tracker);
g_clear_object (&priv->window_cursor);
if (cursor_sprite) if (cursor_sprite)
priv->window_cursor = g_object_ref (cursor_sprite); tracker->window_cursor = g_object_ref (cursor_sprite);
priv->has_window_cursor = has_cursor; tracker->has_window_cursor = has_cursor;
sync_cursor (tracker); sync_cursor (tracker);
} }
gboolean
meta_cursor_tracker_handle_xevent (MetaCursorTracker *tracker,
XEvent *xevent)
{
MetaX11Display *x11_display = meta_get_display ()->x11_display;
XFixesCursorNotifyEvent *notify_event;
if (meta_is_wayland_compositor ())
return FALSE;
if (xevent->xany.type != x11_display->xfixes_event_base + XFixesCursorNotify)
return FALSE;
notify_event = (XFixesCursorNotifyEvent *)xevent;
if (notify_event->subtype != XFixesDisplayCursorNotify)
return FALSE;
g_clear_object (&tracker->xfixes_cursor);
g_signal_emit (tracker, signals[CURSOR_CHANGED], 0);
return TRUE;
}
static void
ensure_xfixes_cursor (MetaCursorTracker *tracker)
{
MetaDisplay *display = meta_get_display ();
g_autoptr (GError) error = NULL;
if (tracker->xfixes_cursor)
return;
tracker->xfixes_cursor = meta_cursor_sprite_xfixes_new (display, &error);
if (!tracker->xfixes_cursor)
g_warning ("Failed to create XFIXES cursor: %s", error->message);
}
/** /**
* meta_cursor_tracker_get_sprite: * meta_cursor_tracker_get_sprite:
* *
@@ -354,13 +273,27 @@ meta_cursor_tracker_get_sprite (MetaCursorTracker *tracker)
{ {
MetaCursorSprite *cursor_sprite; MetaCursorSprite *cursor_sprite;
cursor_sprite = META_CURSOR_TRACKER_GET_CLASS (tracker)->get_sprite (tracker); g_return_val_if_fail (META_IS_CURSOR_TRACKER (tracker), NULL);
if (!cursor_sprite) if (meta_is_wayland_compositor ())
return NULL; {
cursor_sprite = tracker->displayed_cursor;
}
else
{
ensure_xfixes_cursor (tracker);
cursor_sprite = META_CURSOR_SPRITE (tracker->xfixes_cursor);
}
meta_cursor_sprite_realize_texture (cursor_sprite); if (cursor_sprite)
return meta_cursor_sprite_get_cogl_texture (cursor_sprite); {
meta_cursor_sprite_realize_texture (cursor_sprite);
return meta_cursor_sprite_get_cogl_texture (cursor_sprite);
}
else
{
return NULL;
}
} }
/** /**
@@ -379,7 +312,15 @@ meta_cursor_tracker_get_hot (MetaCursorTracker *tracker,
g_return_if_fail (META_IS_CURSOR_TRACKER (tracker)); g_return_if_fail (META_IS_CURSOR_TRACKER (tracker));
cursor_sprite = META_CURSOR_TRACKER_GET_CLASS (tracker)->get_sprite (tracker); if (meta_is_wayland_compositor ())
{
cursor_sprite = tracker->displayed_cursor;
}
else
{
ensure_xfixes_cursor (tracker);
cursor_sprite = META_CURSOR_SPRITE (tracker->xfixes_cursor);
}
if (cursor_sprite) if (cursor_sprite)
meta_cursor_sprite_get_hotspot (cursor_sprite, x, y); meta_cursor_sprite_get_hotspot (cursor_sprite, x, y);
@@ -417,99 +358,107 @@ void
meta_cursor_tracker_set_root_cursor (MetaCursorTracker *tracker, meta_cursor_tracker_set_root_cursor (MetaCursorTracker *tracker,
MetaCursorSprite *cursor_sprite) MetaCursorSprite *cursor_sprite)
{ {
MetaCursorTrackerPrivate *priv = g_clear_object (&tracker->root_cursor);
meta_cursor_tracker_get_instance_private (tracker);
g_clear_object (&priv->root_cursor);
if (cursor_sprite) if (cursor_sprite)
priv->root_cursor = g_object_ref (cursor_sprite); tracker->root_cursor = g_object_ref (cursor_sprite);
sync_cursor (tracker); sync_cursor (tracker);
} }
void void
meta_cursor_tracker_update_position (MetaCursorTracker *tracker) meta_cursor_tracker_update_position (MetaCursorTracker *tracker,
float new_x,
float new_y)
{ {
g_signal_emit (tracker, signals[CURSOR_MOVED], 0); MetaBackend *backend = meta_get_backend ();
MetaCursorRenderer *cursor_renderer =
meta_backend_get_cursor_renderer (backend);
g_assert (meta_is_wayland_compositor ());
meta_cursor_renderer_set_position (cursor_renderer, new_x, new_y);
g_signal_emit (tracker, signals[CURSOR_MOVED], 0, new_x, new_y);
} }
void static void
meta_cursor_tracker_get_pointer (MetaCursorTracker *tracker, get_pointer_position_gdk (int *x,
graphene_point_t *coords, int *y,
ClutterModifierType *mods) int *mods)
{
GdkSeat *gseat;
GdkDevice *gdevice;
GdkScreen *gscreen;
gseat = gdk_display_get_default_seat (gdk_display_get_default ());
gdevice = gdk_seat_get_pointer (gseat);
gdk_device_get_position (gdevice, &gscreen, x, y);
if (mods)
gdk_device_get_state (gdevice,
gdk_screen_get_root_window (gscreen),
NULL, (GdkModifierType*)mods);
}
static void
get_pointer_position_clutter (int *x,
int *y,
int *mods)
{ {
ClutterSeat *seat; ClutterSeat *seat;
ClutterInputDevice *cdevice; ClutterInputDevice *cdevice;
graphene_point_t point;
seat = clutter_backend_get_default_seat (clutter_get_default_backend ()); seat = clutter_backend_get_default_seat (clutter_get_default_backend ());
cdevice = clutter_seat_get_pointer (seat); cdevice = clutter_seat_get_pointer (seat);
clutter_seat_query_state (seat, cdevice, NULL, coords, mods); clutter_input_device_get_coords (cdevice, NULL, &point);
if (x)
*x = point.x;
if (y)
*y = point.y;
if (mods)
*mods = clutter_input_device_get_modifier_state (cdevice);
} }
void void
meta_cursor_tracker_track_position (MetaCursorTracker *tracker) meta_cursor_tracker_get_pointer (MetaCursorTracker *tracker,
int *x,
int *y,
ClutterModifierType *mods)
{ {
MetaCursorTrackerPrivate *priv = /* We can't use the clutter interface when not running as a wayland compositor,
meta_cursor_tracker_get_instance_private (tracker); because we need to query the server, rather than using the last cached value.
OTOH, on wayland we can't use GDK, because that only sees the events
priv->track_position_count++; we forward to xwayland.
if (priv->track_position_count == 1) */
{ if (meta_is_wayland_compositor ())
MetaCursorTrackerClass *klass = get_pointer_position_clutter (x, y, (int*)mods);
META_CURSOR_TRACKER_GET_CLASS (tracker); else
get_pointer_position_gdk (x, y, (int*)mods);
klass->set_force_track_position (tracker, TRUE);
}
}
void
meta_cursor_tracker_untrack_position (MetaCursorTracker *tracker)
{
MetaCursorTrackerPrivate *priv =
meta_cursor_tracker_get_instance_private (tracker);
g_return_if_fail (priv->track_position_count > 0);
priv->track_position_count--;
if (priv->track_position_count == 0)
{
MetaCursorTrackerClass *klass =
META_CURSOR_TRACKER_GET_CLASS (tracker);
klass->set_force_track_position (tracker, FALSE);
}
} }
gboolean gboolean
meta_cursor_tracker_get_pointer_visible (MetaCursorTracker *tracker) meta_cursor_tracker_get_pointer_visible (MetaCursorTracker *tracker)
{ {
MetaCursorTrackerPrivate *priv = return tracker->is_showing;
meta_cursor_tracker_get_instance_private (tracker);
return priv->is_showing;
} }
void void
meta_cursor_tracker_set_pointer_visible (MetaCursorTracker *tracker, meta_cursor_tracker_set_pointer_visible (MetaCursorTracker *tracker,
gboolean visible) gboolean visible)
{ {
MetaCursorTrackerPrivate *priv = if (visible == tracker->is_showing)
meta_cursor_tracker_get_instance_private (tracker);
if (visible == priv->is_showing)
return; return;
priv->is_showing = visible; tracker->is_showing = visible;
sync_cursor (tracker); sync_cursor (tracker);
g_signal_emit (tracker, signals[VISIBILITY_CHANGED], 0); g_signal_emit (tracker, signals[VISIBILITY_CHANGED], 0);
} }
MetaBackend *
meta_cursor_tracker_get_backend (MetaCursorTracker *tracker)
{
MetaCursorTrackerPrivate *priv =
meta_cursor_tracker_get_instance_private (tracker);
return priv->backend; MetaCursorSprite *
meta_cursor_tracker_get_displayed_cursor (MetaCursorTracker *tracker)
{
return tracker->displayed_cursor;
} }

View File

@@ -179,18 +179,20 @@ meta_cursor_sprite_get_texture_transform (MetaCursorSprite *sprite)
} }
void void
meta_cursor_sprite_prepare_at (MetaCursorSprite *sprite, meta_cursor_sprite_prepare_at (MetaCursorSprite *sprite,
float best_scale, int x,
int x, int y)
int y)
{ {
g_signal_emit (sprite, signals[PREPARE_AT], 0, best_scale, x, y); g_signal_emit (sprite, signals[PREPARE_AT], 0, x, y);
} }
void void
meta_cursor_sprite_realize_texture (MetaCursorSprite *sprite) meta_cursor_sprite_realize_texture (MetaCursorSprite *sprite)
{ {
META_CURSOR_SPRITE_GET_CLASS (sprite)->realize_texture (sprite); MetaCursorSpriteClass *klass = META_CURSOR_SPRITE_GET_CLASS (sprite);
if (klass->realize_texture)
klass->realize_texture (sprite);
} }
static void static void
@@ -227,8 +229,7 @@ meta_cursor_sprite_class_init (MetaCursorSpriteClass *klass)
G_SIGNAL_RUN_LAST, G_SIGNAL_RUN_LAST,
0, 0,
NULL, NULL, NULL, NULL, NULL, NULL,
G_TYPE_NONE, 3, G_TYPE_NONE, 2,
G_TYPE_FLOAT,
G_TYPE_INT, G_TYPE_INT,
G_TYPE_INT); G_TYPE_INT);
signals[TEXTURE_CHANGED] = g_signal_new ("texture-changed", signals[TEXTURE_CHANGED] = g_signal_new ("texture-changed",

View File

@@ -43,7 +43,6 @@ struct _MetaCursorSpriteClass
}; };
void meta_cursor_sprite_prepare_at (MetaCursorSprite *sprite, void meta_cursor_sprite_prepare_at (MetaCursorSprite *sprite,
float best_scale,
int x, int x,
int y); int y);

View File

@@ -23,8 +23,7 @@
#define META_INPUT_MAPPER_H #define META_INPUT_MAPPER_H
#include <clutter/clutter.h> #include <clutter/clutter.h>
#include "meta-monitor-manager-private.h"
#include "backends/meta-backend-types.h"
#define META_TYPE_INPUT_MAPPER (meta_input_mapper_get_type ()) #define META_TYPE_INPUT_MAPPER (meta_input_mapper_get_type ())
@@ -34,9 +33,10 @@ G_DECLARE_FINAL_TYPE (MetaInputMapper, meta_input_mapper,
MetaInputMapper * meta_input_mapper_new (void); MetaInputMapper * meta_input_mapper_new (void);
void meta_input_mapper_add_device (MetaInputMapper *mapper, void meta_input_mapper_add_device (MetaInputMapper *mapper,
ClutterInputDevice *device); ClutterInputDevice *device,
gboolean builtin);
void meta_input_mapper_remove_device (MetaInputMapper *mapper, void meta_input_mapper_remove_device (MetaInputMapper *mapper,
ClutterInputDevice *device); ClutterInputDevice *device);
ClutterInputDevice * ClutterInputDevice *
meta_input_mapper_get_logical_monitor_device (MetaInputMapper *mapper, meta_input_mapper_get_logical_monitor_device (MetaInputMapper *mapper,
@@ -46,7 +46,4 @@ MetaLogicalMonitor *
meta_input_mapper_get_device_logical_monitor (MetaInputMapper *mapper, meta_input_mapper_get_device_logical_monitor (MetaInputMapper *mapper,
ClutterInputDevice *device); ClutterInputDevice *device);
GSettings * meta_input_mapper_get_tablet_settings (MetaInputMapper *mapper,
ClutterInputDevice *device);
#endif /* META_INPUT_MAPPER_H */ #endif /* META_INPUT_MAPPER_H */

View File

@@ -24,7 +24,6 @@
#include <gudev/gudev.h> #include <gudev/gudev.h>
#endif #endif
#include "backends/meta-input-device-private.h"
#include "meta-input-mapper-private.h" #include "meta-input-mapper-private.h"
#include "meta-monitor-manager-private.h" #include "meta-monitor-manager-private.h"
#include "meta-logical-monitor.h" #include "meta-logical-monitor.h"
@@ -60,7 +59,6 @@ typedef enum
typedef enum typedef enum
{ {
META_MATCH_CONFIG, /* Specified by config */
META_MATCH_IS_BUILTIN, /* Output is builtin, applies mainly to system-integrated devices */ META_MATCH_IS_BUILTIN, /* Output is builtin, applies mainly to system-integrated devices */
META_MATCH_SIZE, /* Size from input device and output match */ META_MATCH_SIZE, /* Size from input device and output match */
META_MATCH_EDID_FULL, /* Full EDID model match, eg. "Cintiq 12WX" */ META_MATCH_EDID_FULL, /* Full EDID model match, eg. "Cintiq 12WX" */
@@ -74,7 +72,6 @@ struct _MetaMapperInputInfo
ClutterInputDevice *device; ClutterInputDevice *device;
MetaInputMapper *mapper; MetaInputMapper *mapper;
MetaMapperOutputInfo *output; MetaMapperOutputInfo *output;
GSettings *settings;
guint builtin : 1; guint builtin : 1;
}; };
@@ -102,149 +99,24 @@ struct _DeviceCandidates
enum enum
{ {
DEVICE_MAPPED, DEVICE_MAPPED,
DEVICE_ENABLED,
DEVICE_ASPECT_RATIO,
N_SIGNALS N_SIGNALS
}; };
static guint signals[N_SIGNALS] = { 0, }; static guint signals[N_SIGNALS] = { 0, };
static void mapper_recalculate_input (MetaInputMapper *mapper,
MetaMapperInputInfo *input);
G_DEFINE_TYPE (MetaInputMapper, meta_input_mapper, G_TYPE_OBJECT) G_DEFINE_TYPE (MetaInputMapper, meta_input_mapper, G_TYPE_OBJECT)
static GSettings *
get_device_settings (ClutterInputDevice *device)
{
const gchar *group, *schema, *vendor, *product;
ClutterInputDeviceType type;
GSettings *settings;
gchar *path;
type = clutter_input_device_get_device_type (device);
if (type == CLUTTER_TOUCHSCREEN_DEVICE)
{
group = "touchscreens";
schema = "org.gnome.desktop.peripherals.touchscreen";
}
else if (type == CLUTTER_TABLET_DEVICE ||
type == CLUTTER_PEN_DEVICE ||
type == CLUTTER_ERASER_DEVICE ||
type == CLUTTER_CURSOR_DEVICE ||
type == CLUTTER_PAD_DEVICE)
{
group = "tablets";
schema = "org.gnome.desktop.peripherals.tablet";
}
else
return NULL;
vendor = clutter_input_device_get_vendor_id (device);
product = clutter_input_device_get_product_id (device);
path = g_strdup_printf ("/org/gnome/desktop/peripherals/%s/%s:%s/",
group, vendor, product);
settings = g_settings_new_with_path (schema, path);
g_free (path);
return settings;
}
static MetaMonitor *
logical_monitor_find_monitor (MetaLogicalMonitor *logical_monitor,
const char *vendor,
const char *product,
const char *serial)
{
GList *monitors;
GList *l;
monitors = meta_logical_monitor_get_monitors (logical_monitor);
for (l = monitors; l; l = l->next)
{
MetaMonitor *monitor = l->data;
if (g_strcmp0 (meta_monitor_get_vendor (monitor), vendor) == 0 &&
g_strcmp0 (meta_monitor_get_product (monitor), product) == 0 &&
g_strcmp0 (meta_monitor_get_serial (monitor), serial) == 0)
return monitor;
}
return NULL;
}
static void
find_settings_monitor (MetaInputMapper *mapper,
GSettings *settings,
ClutterInputDevice *device,
MetaMonitor **out_monitor,
MetaLogicalMonitor **out_logical_monitor)
{
MetaMonitor *monitor;
guint n_values;
GList *logical_monitors;
GList *l;
gchar **edid;
edid = g_settings_get_strv (settings, "output");
n_values = g_strv_length (edid);
if (n_values != 3)
{
g_warning ("EDID configuration for device '%s' "
"is incorrect, must have 3 values",
clutter_input_device_get_device_name (device));
goto out;
}
if (!*edid[0] && !*edid[1] && !*edid[2])
goto out;
logical_monitors =
meta_monitor_manager_get_logical_monitors (mapper->monitor_manager);
for (l = logical_monitors; l; l = l->next)
{
MetaLogicalMonitor *logical_monitor = l->data;
monitor = logical_monitor_find_monitor (logical_monitor,
edid[0], edid[1], edid[2]);
if (monitor)
{
if (out_monitor)
*out_monitor = monitor;
if (out_logical_monitor)
*out_logical_monitor = logical_monitor;
break;
}
}
out:
g_strfreev (edid);
}
static void
settings_output_changed_cb (GSettings *settings,
const gchar *key,
MetaMapperInputInfo *info)
{
mapper_recalculate_input (info->mapper, info);
}
static MetaMapperInputInfo * static MetaMapperInputInfo *
mapper_input_info_new (ClutterInputDevice *device, mapper_input_info_new (ClutterInputDevice *device,
MetaInputMapper *mapper) MetaInputMapper *mapper,
gboolean builtin)
{ {
MetaMapperInputInfo *info; MetaMapperInputInfo *info;
info = g_new0 (MetaMapperInputInfo, 1); info = g_new0 (MetaMapperInputInfo, 1);
info->mapper = mapper; info->mapper = mapper;
info->device = device; info->device = device;
info->settings = get_device_settings (device); info->builtin = builtin;
g_signal_connect (info->settings, "changed::output",
G_CALLBACK (settings_output_changed_cb), info);
return info; return info;
} }
@@ -252,7 +124,6 @@ mapper_input_info_new (ClutterInputDevice *device,
static void static void
mapper_input_info_free (MetaMapperInputInfo *info) mapper_input_info_free (MetaMapperInputInfo *info)
{ {
g_object_unref (info->settings);
g_free (info); g_free (info);
} }
@@ -303,36 +174,13 @@ mapper_input_info_set_output (MetaMapperInputInfo *input,
MetaMapperOutputInfo *output, MetaMapperOutputInfo *output,
MetaMonitor *monitor) MetaMonitor *monitor)
{ {
MetaInputMapper *mapper = input->mapper;
float matrix[6] = { 1, 0, 0, 0, 1, 0 };
double aspect_ratio;
int width, height;
if (input->output == output) if (input->output == output)
return; return;
input->output = output; input->output = output;
if (output && monitor)
{
meta_monitor_manager_get_monitor_matrix (mapper->monitor_manager,
monitor,
output->logical_monitor,
matrix);
meta_monitor_get_current_resolution (monitor, &width, &height);
}
else
{
meta_monitor_manager_get_screen_size (mapper->monitor_manager,
&width, &height);
}
aspect_ratio = (double) width / height;
g_signal_emit (input->mapper, signals[DEVICE_MAPPED], 0, g_signal_emit (input->mapper, signals[DEVICE_MAPPED], 0,
input->device, matrix); input->device,
g_signal_emit (input->mapper, signals[DEVICE_ASPECT_RATIO], 0, output ? output->logical_monitor : NULL, monitor);
input->device, aspect_ratio);
} }
static void static void
@@ -513,32 +361,6 @@ guess_candidates (MetaInputMapper *mapper,
MetaOutputMatchType best = N_OUTPUT_MATCHES; MetaOutputMatchType best = N_OUTPUT_MATCHES;
GList *monitors, *l; GList *monitors, *l;
MetaMonitor *matched_monitor = NULL; MetaMonitor *matched_monitor = NULL;
gboolean builtin = FALSE;
gboolean integrated = TRUE;
#ifdef HAVE_LIBWACOM
if (clutter_input_device_get_device_type (input->device) != CLUTTER_TOUCHSCREEN_DEVICE)
{
WacomDevice *wacom_device;
WacomIntegrationFlags flags = 0;
wacom_device =
meta_input_device_get_wacom_device (META_INPUT_DEVICE (input->device));
if (wacom_device)
{
flags = libwacom_get_integration_flags (wacom_device);
if ((flags & (WACOM_DEVICE_INTEGRATED_SYSTEM |
WACOM_DEVICE_INTEGRATED_DISPLAY)) == 0)
return;
integrated = (flags & (WACOM_DEVICE_INTEGRATED_SYSTEM |
WACOM_DEVICE_INTEGRATED_DISPLAY)) != 0;
builtin = (flags & WACOM_DEVICE_INTEGRATED_SYSTEM) != 0;
}
}
#endif
monitors = meta_monitor_manager_get_monitors (mapper->monitor_manager); monitors = meta_monitor_manager_get_monitors (mapper->monitor_manager);
@@ -553,23 +375,18 @@ guess_candidates (MetaInputMapper *mapper,
} }
} }
if (integrated && find_size_match (input, monitors, &matched_monitor)) if (find_size_match (input, monitors, &matched_monitor))
{ {
best = MIN (best, META_MATCH_SIZE); best = MIN (best, META_MATCH_SIZE);
info->candidates[META_MATCH_SIZE] = matched_monitor; info->candidates[META_MATCH_SIZE] = matched_monitor;
} }
if (builtin || best == N_OUTPUT_MATCHES) if (input->builtin || best == N_OUTPUT_MATCHES)
{ {
best = MIN (best, META_MATCH_IS_BUILTIN); best = MIN (best, META_MATCH_IS_BUILTIN);
find_builtin_output (mapper, &info->candidates[META_MATCH_IS_BUILTIN]); find_builtin_output (mapper, &info->candidates[META_MATCH_IS_BUILTIN]);
} }
find_settings_monitor (mapper, input->settings, input->device,
&info->candidates[META_MATCH_CONFIG], NULL);
if (info->candidates[META_MATCH_CONFIG])
best = MIN (best, META_MATCH_CONFIG);
info->best = best; info->best = best;
} }
@@ -707,37 +524,6 @@ input_mapper_monitors_changed_cb (MetaMonitorManager *monitor_manager,
mapper_update_outputs (mapper); mapper_update_outputs (mapper);
} }
static void
input_mapper_power_save_mode_changed_cb (MetaMonitorManager *monitor_manager,
MetaInputMapper *mapper)
{
ClutterInputDevice *device;
MetaLogicalMonitor *logical_monitor;
MetaMonitor *builtin;
MetaPowerSave power_save_mode;
gboolean on;
power_save_mode =
meta_monitor_manager_get_power_save_mode (mapper->monitor_manager);
on = power_save_mode == META_POWER_SAVE_ON;
if (!find_builtin_output (mapper, &builtin))
return;
logical_monitor = meta_monitor_get_logical_monitor (builtin);
if (!logical_monitor)
return;
device =
meta_input_mapper_get_logical_monitor_device (mapper,
logical_monitor,
CLUTTER_TOUCHSCREEN_DEVICE);
if (!device)
return;
g_signal_emit (mapper, signals[DEVICE_ENABLED], 0, device, on);
}
static void static void
input_mapper_device_removed_cb (ClutterSeat *seat, input_mapper_device_removed_cb (ClutterSeat *seat,
ClutterInputDevice *device, ClutterInputDevice *device,
@@ -790,9 +576,6 @@ meta_input_mapper_constructed (GObject *object)
mapper->monitor_manager = meta_backend_get_monitor_manager (backend); mapper->monitor_manager = meta_backend_get_monitor_manager (backend);
g_signal_connect (mapper->monitor_manager, "monitors-changed-internal", g_signal_connect (mapper->monitor_manager, "monitors-changed-internal",
G_CALLBACK (input_mapper_monitors_changed_cb), mapper); G_CALLBACK (input_mapper_monitors_changed_cb), mapper);
g_signal_connect (mapper->monitor_manager, "power-save-mode-changed",
G_CALLBACK (input_mapper_power_save_mode_changed_cb),
mapper);
mapper_update_outputs (mapper); mapper_update_outputs (mapper);
} }
@@ -811,27 +594,9 @@ meta_input_mapper_class_init (MetaInputMapperClass *klass)
G_SIGNAL_RUN_LAST, G_SIGNAL_RUN_LAST,
0, 0,
NULL, NULL, NULL, NULL, NULL, NULL,
G_TYPE_NONE, 2, G_TYPE_NONE, 3,
CLUTTER_TYPE_INPUT_DEVICE, CLUTTER_TYPE_INPUT_DEVICE,
G_TYPE_POINTER); G_TYPE_POINTER, G_TYPE_POINTER);
signals[DEVICE_ENABLED] =
g_signal_new ("device-enabled",
G_TYPE_FROM_CLASS (object_class),
G_SIGNAL_RUN_LAST,
0,
NULL, NULL, NULL,
G_TYPE_NONE, 2,
CLUTTER_TYPE_INPUT_DEVICE,
G_TYPE_BOOLEAN);
signals[DEVICE_ASPECT_RATIO] =
g_signal_new ("device-aspect-ratio",
G_TYPE_FROM_CLASS (object_class),
G_SIGNAL_RUN_LAST,
0,
NULL, NULL, NULL,
G_TYPE_NONE, 2,
CLUTTER_TYPE_INPUT_DEVICE,
G_TYPE_DOUBLE);
} }
static void static void
@@ -853,7 +618,8 @@ meta_input_mapper_new (void)
void void
meta_input_mapper_add_device (MetaInputMapper *mapper, meta_input_mapper_add_device (MetaInputMapper *mapper,
ClutterInputDevice *device) ClutterInputDevice *device,
gboolean builtin)
{ {
MetaMapperInputInfo *info; MetaMapperInputInfo *info;
@@ -863,7 +629,7 @@ meta_input_mapper_add_device (MetaInputMapper *mapper,
if (g_hash_table_contains (mapper->input_devices, device)) if (g_hash_table_contains (mapper->input_devices, device))
return; return;
info = mapper_input_info_new (device, mapper); info = mapper_input_info_new (device, mapper, builtin);
g_hash_table_insert (mapper->input_devices, device, info); g_hash_table_insert (mapper->input_devices, device, info);
mapper_recalculate_input (mapper, info); mapper_recalculate_input (mapper, info);
} }
@@ -910,43 +676,6 @@ meta_input_mapper_get_logical_monitor_device (MetaInputMapper *mapper,
return NULL; return NULL;
} }
static ClutterInputDevice *
find_grouped_pen (ClutterInputDevice *device)
{
GList *l, *devices;
ClutterInputDeviceType device_type;
ClutterInputDevice *pen = NULL;
ClutterSeat *seat;
device_type = clutter_input_device_get_device_type (device);
if (device_type == CLUTTER_TABLET_DEVICE ||
device_type == CLUTTER_PEN_DEVICE)
return device;
seat = clutter_input_device_get_seat (device);
devices = clutter_seat_list_devices (seat);
for (l = devices; l; l = l->next)
{
ClutterInputDevice *other_device = l->data;
device_type = clutter_input_device_get_device_type (other_device);
if ((device_type == CLUTTER_TABLET_DEVICE ||
device_type == CLUTTER_PEN_DEVICE) &&
clutter_input_device_is_grouped (device, other_device))
{
pen = other_device;
break;
}
}
g_list_free (devices);
return pen;
}
MetaLogicalMonitor * MetaLogicalMonitor *
meta_input_mapper_get_device_logical_monitor (MetaInputMapper *mapper, meta_input_mapper_get_device_logical_monitor (MetaInputMapper *mapper,
ClutterInputDevice *device) ClutterInputDevice *device)
@@ -956,13 +685,6 @@ meta_input_mapper_get_device_logical_monitor (MetaInputMapper *mapper,
GHashTableIter iter; GHashTableIter iter;
GList *l; GList *l;
if (clutter_input_device_get_device_type (device) == CLUTTER_PAD_DEVICE)
{
device = find_grouped_pen (device);
if (!device)
return NULL;
}
g_hash_table_iter_init (&iter, mapper->output_devices); g_hash_table_iter_init (&iter, mapper->output_devices);
while (g_hash_table_iter_next (&iter, (gpointer *) &logical_monitor, while (g_hash_table_iter_next (&iter, (gpointer *) &logical_monitor,
@@ -979,19 +701,3 @@ meta_input_mapper_get_device_logical_monitor (MetaInputMapper *mapper,
return NULL; return NULL;
} }
GSettings *
meta_input_mapper_get_tablet_settings (MetaInputMapper *mapper,
ClutterInputDevice *device)
{
MetaMapperInputInfo *input;
g_return_val_if_fail (META_IS_INPUT_MAPPER (mapper), NULL);
g_return_val_if_fail (CLUTTER_IS_INPUT_DEVICE (device), NULL);
input = g_hash_table_lookup (mapper->input_devices, device);
if (!input)
return NULL;
return input->settings;
}

View File

@@ -36,62 +36,6 @@
G_DECLARE_DERIVABLE_TYPE (MetaInputSettings, meta_input_settings, G_DECLARE_DERIVABLE_TYPE (MetaInputSettings, meta_input_settings,
META, INPUT_SETTINGS, GObject) META, INPUT_SETTINGS, GObject)
/**
* MetaKeyboardA11yFlags:
* @CLUTTER_A11Y_KEYBOARD_ENABLED:
* @CLUTTER_A11Y_TIMEOUT_ENABLED:
* @CLUTTER_A11Y_MOUSE_KEYS_ENABLED:
* @CLUTTER_A11Y_SLOW_KEYS_ENABLED:
* @CLUTTER_A11Y_SLOW_KEYS_BEEP_PRESS:
* @CLUTTER_A11Y_SLOW_KEYS_BEEP_ACCEPT:
* @CLUTTER_A11Y_SLOW_KEYS_BEEP_REJECT:
* @CLUTTER_A11Y_BOUNCE_KEYS_ENABLED:
* @CLUTTER_A11Y_BOUNCE_KEYS_BEEP_REJECT:
* @CLUTTER_A11Y_TOGGLE_KEYS_ENABLED:
* @CLUTTER_A11Y_STICKY_KEYS_ENABLED:
* @CLUTTER_A11Y_STICKY_KEYS_TWO_KEY_OFF:
* @CLUTTER_A11Y_STICKY_KEYS_BEEP:
* @CLUTTER_A11Y_FEATURE_STATE_CHANGE_BEEP:
*
* Keyboard accessibility features applied to a ClutterInputDevice keyboard.
*
*/
typedef enum
{
META_A11Y_KEYBOARD_ENABLED = 1 << 0,
META_A11Y_TIMEOUT_ENABLED = 1 << 1,
META_A11Y_MOUSE_KEYS_ENABLED = 1 << 2,
META_A11Y_SLOW_KEYS_ENABLED = 1 << 3,
META_A11Y_SLOW_KEYS_BEEP_PRESS = 1 << 4,
META_A11Y_SLOW_KEYS_BEEP_ACCEPT = 1 << 5,
META_A11Y_SLOW_KEYS_BEEP_REJECT = 1 << 6,
META_A11Y_BOUNCE_KEYS_ENABLED = 1 << 7,
META_A11Y_BOUNCE_KEYS_BEEP_REJECT = 1 << 8,
META_A11Y_TOGGLE_KEYS_ENABLED = 1 << 9,
META_A11Y_STICKY_KEYS_ENABLED = 1 << 10,
META_A11Y_STICKY_KEYS_TWO_KEY_OFF = 1 << 11,
META_A11Y_STICKY_KEYS_BEEP = 1 << 12,
META_A11Y_FEATURE_STATE_CHANGE_BEEP = 1 << 13,
} MetaKeyboardA11yFlags;
/**
* MetaKbdA11ySettings:
*
* The #MetaKbdA11ySettings structure contains keyboard accessibility
* settings
*
*/
typedef struct _MetaKbdA11ySettings
{
MetaKeyboardA11yFlags controls;
gint slowkeys_delay;
gint debounce_delay;
gint timeout_delay;
gint mousekeys_init_delay;
gint mousekeys_max_speed;
gint mousekeys_accel_time;
} MetaKbdA11ySettings;
struct _MetaInputSettingsClass struct _MetaInputSettingsClass
{ {
GObjectClass parent_class; GObjectClass parent_class;
@@ -148,9 +92,10 @@ struct _MetaInputSettingsClass
void (* set_tablet_mapping) (MetaInputSettings *settings, void (* set_tablet_mapping) (MetaInputSettings *settings,
ClutterInputDevice *device, ClutterInputDevice *device,
GDesktopTabletMapping mapping); GDesktopTabletMapping mapping);
void (* set_tablet_aspect_ratio) (MetaInputSettings *settings, void (* set_tablet_keep_aspect) (MetaInputSettings *settings,
ClutterInputDevice *device, ClutterInputDevice *device,
double ratio); MetaLogicalMonitor *logical_monitor,
gboolean keep_aspect);
void (* set_tablet_area) (MetaInputSettings *settings, void (* set_tablet_area) (MetaInputSettings *settings,
ClutterInputDevice *device, ClutterInputDevice *device,
gdouble padding_left, gdouble padding_left,
@@ -192,31 +137,26 @@ struct _MetaInputSettingsClass
ClutterInputDevice *device); ClutterInputDevice *device);
}; };
GSettings * meta_input_settings_get_tablet_settings (MetaInputSettings *settings,
ClutterInputDevice *device);
MetaLogicalMonitor * meta_input_settings_get_tablet_logical_monitor (MetaInputSettings *settings,
ClutterInputDevice *device);
GDesktopTabletMapping meta_input_settings_get_tablet_mapping (MetaInputSettings *settings,
ClutterInputDevice *device);
gboolean meta_input_settings_is_pad_button_grabbed (MetaInputSettings *input_settings,
ClutterInputDevice *pad,
guint button);
gboolean meta_input_settings_handle_pad_event (MetaInputSettings *input_settings,
const ClutterEvent *event);
gchar * meta_input_settings_get_pad_action_label (MetaInputSettings *input_settings,
ClutterInputDevice *pad,
MetaPadActionType action,
guint number);
void meta_input_settings_maybe_save_numlock_state (MetaInputSettings *input_settings); void meta_input_settings_maybe_save_numlock_state (MetaInputSettings *input_settings);
void meta_input_settings_maybe_restore_numlock_state (MetaInputSettings *input_settings); void meta_input_settings_maybe_restore_numlock_state (MetaInputSettings *input_settings);
void meta_input_settings_set_device_matrix (MetaInputSettings *input_settings,
ClutterInputDevice *device,
float matrix[6]);
void meta_input_settings_set_device_enabled (MetaInputSettings *input_settings,
ClutterInputDevice *device,
gboolean enabled);
void meta_input_settings_set_device_aspect_ratio (MetaInputSettings *input_settings,
ClutterInputDevice *device,
double aspect_ratio);
void meta_input_settings_get_kbd_a11y_settings (MetaInputSettings *input_settings,
MetaKbdA11ySettings *a11y_settings);
void meta_input_settings_add_device (MetaInputSettings *input_settings,
ClutterInputDevice *device);
void meta_input_settings_remove_device (MetaInputSettings *input_settings,
ClutterInputDevice *device);
void meta_input_settings_notify_tool_change (MetaInputSettings *input_settings,
ClutterInputDevice *device,
ClutterInputDeviceTool *tool);
void meta_input_settings_notify_kbd_a11y_change (MetaInputSettings *input_settings,
MetaKeyboardA11yFlags new_flags,
MetaKeyboardA11yFlags what_changed);
#endif /* META_INPUT_SETTINGS_PRIVATE_H */ #endif /* META_INPUT_SETTINGS_PRIVATE_H */

File diff suppressed because it is too large Load Diff

View File

@@ -31,7 +31,6 @@
#include "backends/meta-cursor.h" #include "backends/meta-cursor.h"
#include "backends/meta-display-config-shared.h" #include "backends/meta-display-config-shared.h"
#include "backends/meta-monitor-transform.h" #include "backends/meta-monitor-transform.h"
#include "backends/meta-viewport-info.h"
#include "core/util-private.h" #include "core/util-private.h"
#include "meta/display.h" #include "meta/display.h"
#include "meta/meta-monitor-manager.h" #include "meta/meta-monitor-manager.h"
@@ -406,6 +405,4 @@ meta_find_output_assignment (MetaOutputAssignment **outputs,
return NULL; return NULL;
} }
MetaViewportInfo * meta_monitor_manager_get_viewports (MetaMonitorManager *manager);
#endif /* META_MONITOR_MANAGER_PRIVATE_H */ #endif /* META_MONITOR_MANAGER_PRIVATE_H */

View File

@@ -3175,37 +3175,3 @@ meta_monitor_manager_get_vendor_name (MetaMonitorManager *manager,
return gnome_pnp_ids_get_pnp_id (manager->pnp_ids, vendor); return gnome_pnp_ids_get_pnp_id (manager->pnp_ids, vendor);
} }
MetaViewportInfo *
meta_monitor_manager_get_viewports (MetaMonitorManager *manager)
{
MetaViewportInfo *info;
GArray *views, *scales;
GList *logical_monitors, *l;
views = g_array_new (FALSE, FALSE, sizeof (cairo_rectangle_int_t));
scales = g_array_new (FALSE, FALSE, sizeof (float));
logical_monitors = meta_monitor_manager_get_logical_monitors (manager);
for (l = logical_monitors; l; l = l->next)
{
MetaLogicalMonitor *logical_monitor = l->data;
cairo_rectangle_int_t rect;
float scale;
rect = logical_monitor->rect;
g_array_append_val (views, rect);
scale = logical_monitor->scale;
g_array_append_val (scales, scale);
}
info = meta_viewport_info_new ((cairo_rectangle_int_t *) views->data,
(float *) scales->data,
views->len);
g_array_unref (views);
g_array_unref (scales);
return info;
}

View File

@@ -39,19 +39,8 @@
#include "backends/meta-pointer-constraint.h" #include "backends/meta-pointer-constraint.h"
#ifdef HAVE_NATIVE_BACKEND
#include "backends/native/meta-backend-native.h"
#include "backends/native/meta-pointer-constraint-native.h"
#endif
#include <glib-object.h> #include <glib-object.h>
struct _MetaPointerConstraint
{
GObject parent_instance;
cairo_region_t *region;
};
G_DEFINE_TYPE (MetaPointerConstraint, meta_pointer_constraint, G_TYPE_OBJECT); G_DEFINE_TYPE (MetaPointerConstraint, meta_pointer_constraint, G_TYPE_OBJECT);
static void static void
@@ -64,40 +53,9 @@ meta_pointer_constraint_class_init (MetaPointerConstraintClass *klass)
{ {
} }
MetaPointerConstraint *
meta_pointer_constraint_new (const cairo_region_t *region)
{
MetaPointerConstraint *constraint;
constraint = g_object_new (META_TYPE_POINTER_CONSTRAINT, NULL);
constraint->region = cairo_region_copy (region);
return constraint;
}
cairo_region_t *
meta_pointer_constraint_get_region (MetaPointerConstraint *constraint)
{
return constraint->region;
}
G_DEFINE_TYPE (MetaPointerConstraintImpl, meta_pointer_constraint_impl,
G_TYPE_OBJECT);
static void
meta_pointer_constraint_impl_init (MetaPointerConstraintImpl *impl)
{
}
static void
meta_pointer_constraint_impl_class_init (MetaPointerConstraintImplClass *klass)
{
}
/** /**
* meta_pointer_constraint_impl_constrain: * meta_pointer_constraint_constrain:
* @impl: a #MetaPointerConstraintImpl. * @constraint: a #MetaPointerConstraint.
* @device; the device of the pointer. * @device; the device of the pointer.
* @time: the timestamp (in ms) of the event. * @time: the timestamp (in ms) of the event.
* @prev_x: X-coordinate of the previous pointer position. * @prev_x: X-coordinate of the previous pointer position.
@@ -109,25 +67,17 @@ meta_pointer_constraint_impl_class_init (MetaPointerConstraintImplClass *klass)
* if needed. * if needed.
*/ */
void void
meta_pointer_constraint_impl_constrain (MetaPointerConstraintImpl *impl, meta_pointer_constraint_constrain (MetaPointerConstraint *constraint,
ClutterInputDevice *device, ClutterInputDevice *device,
uint32_t time, guint32 time,
float prev_x, float prev_x,
float prev_y, float prev_y,
float *x, float *x,
float *y) float *y)
{ {
META_POINTER_CONSTRAINT_IMPL_GET_CLASS (impl)->constrain (impl, META_POINTER_CONSTRAINT_GET_CLASS (constraint)->constrain (constraint,
device, device,
time, time,
prev_x, prev_y, prev_x, prev_y,
x, y); x, y);
}
void
meta_pointer_constraint_impl_ensure_constrained (MetaPointerConstraintImpl *impl,
ClutterInputDevice *device)
{
META_POINTER_CONSTRAINT_IMPL_GET_CLASS (impl)->ensure_constrained (impl,
device);
} }

View File

@@ -32,45 +32,34 @@
G_BEGIN_DECLS G_BEGIN_DECLS
#define META_TYPE_POINTER_CONSTRAINT (meta_pointer_constraint_get_type ()) #define META_TYPE_POINTER_CONSTRAINT (meta_pointer_constraint_get_type ())
G_DECLARE_FINAL_TYPE (MetaPointerConstraint, meta_pointer_constraint, G_DECLARE_DERIVABLE_TYPE (MetaPointerConstraint, meta_pointer_constraint,
META, POINTER_CONSTRAINT, GObject); META, POINTER_CONSTRAINT, GObject);
MetaPointerConstraint * meta_pointer_constraint_new (const cairo_region_t *region);
cairo_region_t * meta_pointer_constraint_get_region (MetaPointerConstraint *constraint);
#define META_TYPE_POINTER_CONSTRAINT_IMPL (meta_pointer_constraint_impl_get_type ())
G_DECLARE_DERIVABLE_TYPE (MetaPointerConstraintImpl, meta_pointer_constraint_impl,
META, POINTER_CONSTRAINT_IMPL, GObject);
/** /**
* MetaPointerConstraintImplClass: * MetaPointerConstraintClass:
* @constrain: the virtual function pointer for * @constrain: the virtual function pointer for
* meta_pointer_constraint_impl_constrain(). * meta_pointer_constraint_constrain().
*/ */
struct _MetaPointerConstraintImplClass struct _MetaPointerConstraintClass
{ {
GObjectClass parent_class; GObjectClass parent_class;
void (* constrain) (MetaPointerConstraintImpl *impl, void (*constrain) (MetaPointerConstraint *constraint,
ClutterInputDevice *device, ClutterInputDevice *device,
uint32_t time, guint32 time,
float prev_x, float prev_x,
float prev_y, float prev_y,
float *x, float *x,
float *y); float *y);
void (* ensure_constrained) (MetaPointerConstraintImpl *impl,
ClutterInputDevice *device);
}; };
void meta_pointer_constraint_impl_constrain (MetaPointerConstraintImpl *impl, void meta_pointer_constraint_constrain (MetaPointerConstraint *constraint,
ClutterInputDevice *device, ClutterInputDevice *device,
uint32_t time, guint32 time,
float prev_x, float prev_x,
float prev_y, float prev_y,
float *x, float *x,
float *y); float *y);
void meta_pointer_constraint_impl_ensure_constrained (MetaPointerConstraintImpl *impl,
ClutterInputDevice *device);
G_END_DECLS G_END_DECLS

View File

@@ -143,7 +143,7 @@ meta_renderer_real_rebuild_views (MetaRenderer *renderer)
meta_backend_get_monitor_manager (backend); meta_backend_get_monitor_manager (backend);
GList *logical_monitors, *l; GList *logical_monitors, *l;
g_list_free_full (priv->views, (GDestroyNotify) clutter_stage_view_destroy); g_list_free_full (priv->views, g_object_unref);
priv->views = NULL; priv->views = NULL;
logical_monitors = logical_monitors =

View File

@@ -83,6 +83,19 @@ get_backend (MetaScreenCastAreaStreamSrc *area_src)
return meta_screen_cast_get_backend (screen_cast); return meta_screen_cast_get_backend (screen_cast);
} }
static MetaCursorRenderer *
get_cursor_renderer (MetaScreenCastAreaStreamSrc *area_src)
{
MetaScreenCastStreamSrc *src = META_SCREEN_CAST_STREAM_SRC (area_src);
MetaScreenCastStream *stream = meta_screen_cast_stream_src_get_stream (src);
MetaScreenCastSession *session = meta_screen_cast_stream_get_session (stream);
MetaScreenCast *screen_cast =
meta_screen_cast_session_get_screen_cast (session);
MetaBackend *backend = meta_screen_cast_get_backend (screen_cast);
return meta_backend_get_cursor_renderer (backend);
}
static void static void
meta_screen_cast_area_stream_src_get_specs (MetaScreenCastStreamSrc *src, meta_screen_cast_area_stream_src_get_specs (MetaScreenCastStreamSrc *src,
int *width, int *width,
@@ -129,11 +142,9 @@ is_cursor_in_stream (MetaScreenCastAreaStreamSrc *area_src)
} }
else else
{ {
MetaCursorTracker *cursor_tracker =
meta_backend_get_cursor_tracker (backend);
graphene_point_t cursor_position; graphene_point_t cursor_position;
meta_cursor_tracker_get_pointer (cursor_tracker, &cursor_position, NULL); cursor_position = meta_cursor_renderer_get_position (cursor_renderer);
return graphene_rect_contains_point (&area_rect, &cursor_position); return graphene_rect_contains_point (&area_rect, &cursor_position);
} }
} }
@@ -173,6 +184,8 @@ sync_cursor_state (MetaScreenCastAreaStreamSrc *area_src)
static void static void
cursor_moved (MetaCursorTracker *cursor_tracker, cursor_moved (MetaCursorTracker *cursor_tracker,
float x,
float y,
MetaScreenCastAreaStreamSrc *area_src) MetaScreenCastAreaStreamSrc *area_src)
{ {
sync_cursor_state (area_src); sync_cursor_state (area_src);
@@ -189,14 +202,14 @@ cursor_changed (MetaCursorTracker *cursor_tracker,
static void static void
inhibit_hw_cursor (MetaScreenCastAreaStreamSrc *area_src) inhibit_hw_cursor (MetaScreenCastAreaStreamSrc *area_src)
{ {
MetaCursorRenderer *cursor_renderer;
MetaHwCursorInhibitor *inhibitor; MetaHwCursorInhibitor *inhibitor;
MetaBackend *backend;
g_return_if_fail (!area_src->hw_cursor_inhibited); g_return_if_fail (!area_src->hw_cursor_inhibited);
backend = get_backend (area_src); cursor_renderer = get_cursor_renderer (area_src);
inhibitor = META_HW_CURSOR_INHIBITOR (area_src); inhibitor = META_HW_CURSOR_INHIBITOR (area_src);
meta_backend_add_hw_cursor_inhibitor (backend, inhibitor); meta_cursor_renderer_add_hw_cursor_inhibitor (cursor_renderer, inhibitor);
area_src->hw_cursor_inhibited = TRUE; area_src->hw_cursor_inhibited = TRUE;
} }
@@ -204,14 +217,14 @@ inhibit_hw_cursor (MetaScreenCastAreaStreamSrc *area_src)
static void static void
uninhibit_hw_cursor (MetaScreenCastAreaStreamSrc *area_src) uninhibit_hw_cursor (MetaScreenCastAreaStreamSrc *area_src)
{ {
MetaCursorRenderer *cursor_renderer;
MetaHwCursorInhibitor *inhibitor; MetaHwCursorInhibitor *inhibitor;
MetaBackend *backend;
g_return_if_fail (area_src->hw_cursor_inhibited); g_return_if_fail (area_src->hw_cursor_inhibited);
backend = get_backend (area_src); cursor_renderer = get_cursor_renderer (area_src);
inhibitor = META_HW_CURSOR_INHIBITOR (area_src); inhibitor = META_HW_CURSOR_INHIBITOR (area_src);
meta_backend_remove_hw_cursor_inhibitor (backend, inhibitor); meta_cursor_renderer_remove_hw_cursor_inhibitor (cursor_renderer, inhibitor);
area_src->hw_cursor_inhibited = FALSE; area_src->hw_cursor_inhibited = FALSE;
} }
@@ -330,7 +343,6 @@ meta_screen_cast_area_stream_src_enable (MetaScreenCastStreamSrc *src)
g_signal_connect_after (cursor_tracker, "cursor-changed", g_signal_connect_after (cursor_tracker, "cursor-changed",
G_CALLBACK (cursor_changed), G_CALLBACK (cursor_changed),
area_src); area_src);
meta_cursor_tracker_track_position (cursor_tracker);
G_GNUC_FALLTHROUGH; G_GNUC_FALLTHROUGH;
case META_SCREEN_CAST_CURSOR_MODE_HIDDEN: case META_SCREEN_CAST_CURSOR_MODE_HIDDEN:
add_view_painted_watches (area_src, add_view_painted_watches (area_src,
@@ -338,7 +350,6 @@ meta_screen_cast_area_stream_src_enable (MetaScreenCastStreamSrc *src)
break; break;
case META_SCREEN_CAST_CURSOR_MODE_EMBEDDED: case META_SCREEN_CAST_CURSOR_MODE_EMBEDDED:
inhibit_hw_cursor (area_src); inhibit_hw_cursor (area_src);
meta_cursor_tracker_track_position (cursor_tracker);
add_view_painted_watches (area_src, add_view_painted_watches (area_src,
META_STAGE_WATCH_AFTER_ACTOR_PAINT); META_STAGE_WATCH_AFTER_ACTOR_PAINT);
break; break;
@@ -352,7 +363,6 @@ meta_screen_cast_area_stream_src_disable (MetaScreenCastStreamSrc *src)
{ {
MetaScreenCastAreaStreamSrc *area_src = MetaScreenCastAreaStreamSrc *area_src =
META_SCREEN_CAST_AREA_STREAM_SRC (src); META_SCREEN_CAST_AREA_STREAM_SRC (src);
MetaScreenCastStream *stream = meta_screen_cast_stream_src_get_stream (src);
MetaBackend *backend = get_backend (area_src); MetaBackend *backend = get_backend (area_src);
MetaCursorTracker *cursor_tracker = meta_backend_get_cursor_tracker (backend); MetaCursorTracker *cursor_tracker = meta_backend_get_cursor_tracker (backend);
ClutterStage *stage; ClutterStage *stage;
@@ -379,16 +389,6 @@ meta_screen_cast_area_stream_src_disable (MetaScreenCastStreamSrc *src)
cursor_tracker); cursor_tracker);
g_clear_handle_id (&area_src->maybe_record_idle_id, g_source_remove); g_clear_handle_id (&area_src->maybe_record_idle_id, g_source_remove);
switch (meta_screen_cast_stream_get_cursor_mode (stream))
{
case META_SCREEN_CAST_CURSOR_MODE_METADATA:
case META_SCREEN_CAST_CURSOR_MODE_EMBEDDED:
meta_cursor_tracker_untrack_position (cursor_tracker);
break;
case META_SCREEN_CAST_CURSOR_MODE_HIDDEN:
break;
}
} }
static gboolean static gboolean
@@ -418,7 +418,6 @@ meta_screen_cast_area_stream_src_record_to_buffer (MetaScreenCastStreamSrc *src
paint_flags |= CLUTTER_PAINT_FLAG_NO_CURSORS; paint_flags |= CLUTTER_PAINT_FLAG_NO_CURSORS;
break; break;
case META_SCREEN_CAST_CURSOR_MODE_EMBEDDED: case META_SCREEN_CAST_CURSOR_MODE_EMBEDDED:
paint_flags |= CLUTTER_PAINT_FLAG_FORCE_CURSORS;
break; break;
} }
@@ -459,7 +458,6 @@ meta_screen_cast_area_stream_src_record_to_framebuffer (MetaScreenCastStreamSrc
paint_flags |= CLUTTER_PAINT_FLAG_NO_CURSORS; paint_flags |= CLUTTER_PAINT_FLAG_NO_CURSORS;
break; break;
case META_SCREEN_CAST_CURSOR_MODE_EMBEDDED: case META_SCREEN_CAST_CURSOR_MODE_EMBEDDED:
paint_flags |= CLUTTER_PAINT_FLAG_FORCE_CURSORS;
break; break;
} }
clutter_stage_paint_to_framebuffer (stage, framebuffer, clutter_stage_paint_to_framebuffer (stage, framebuffer,
@@ -493,8 +491,6 @@ meta_screen_cast_area_stream_src_set_cursor_metadata (MetaScreenCastStreamSrc *s
MetaScreenCastStream *stream = meta_screen_cast_stream_src_get_stream (src); MetaScreenCastStream *stream = meta_screen_cast_stream_src_get_stream (src);
MetaScreenCastAreaStream *area_stream = META_SCREEN_CAST_AREA_STREAM (stream); MetaScreenCastAreaStream *area_stream = META_SCREEN_CAST_AREA_STREAM (stream);
MetaBackend *backend = get_backend (area_src); MetaBackend *backend = get_backend (area_src);
MetaCursorTracker *cursor_tracker =
meta_backend_get_cursor_tracker (backend);
MetaCursorRenderer *cursor_renderer = MetaCursorRenderer *cursor_renderer =
meta_backend_get_cursor_renderer (backend); meta_backend_get_cursor_renderer (backend);
MetaCursorSprite *cursor_sprite; MetaCursorSprite *cursor_sprite;
@@ -515,7 +511,7 @@ meta_screen_cast_area_stream_src_set_cursor_metadata (MetaScreenCastStreamSrc *s
area = meta_screen_cast_area_stream_get_area (area_stream); area = meta_screen_cast_area_stream_get_area (area_stream);
scale = meta_screen_cast_area_stream_get_scale (area_stream); scale = meta_screen_cast_area_stream_get_scale (area_stream);
meta_cursor_tracker_get_pointer (cursor_tracker, &cursor_position, NULL); cursor_position = meta_cursor_renderer_get_position (cursor_renderer);
cursor_position.x -= area->x; cursor_position.x -= area->x;
cursor_position.y -= area->y; cursor_position.y -= area->y;
cursor_position.x *= scale; cursor_position.x *= scale;
@@ -557,7 +553,8 @@ meta_screen_cast_area_stream_src_set_cursor_metadata (MetaScreenCastStreamSrc *s
} }
static gboolean static gboolean
meta_screen_cast_area_stream_src_is_cursor_inhibited (MetaHwCursorInhibitor *inhibitor) meta_screen_cast_area_stream_src_is_cursor_sprite_inhibited (MetaHwCursorInhibitor *inhibitor,
MetaCursorSprite *cursor_sprite)
{ {
MetaScreenCastAreaStreamSrc *area_src = MetaScreenCastAreaStreamSrc *area_src =
META_SCREEN_CAST_AREA_STREAM_SRC (inhibitor); META_SCREEN_CAST_AREA_STREAM_SRC (inhibitor);
@@ -568,8 +565,8 @@ meta_screen_cast_area_stream_src_is_cursor_inhibited (MetaHwCursorInhibitor *inh
static void static void
hw_cursor_inhibitor_iface_init (MetaHwCursorInhibitorInterface *iface) hw_cursor_inhibitor_iface_init (MetaHwCursorInhibitorInterface *iface)
{ {
iface->is_cursor_inhibited = iface->is_cursor_sprite_inhibited =
meta_screen_cast_area_stream_src_is_cursor_inhibited; meta_screen_cast_area_stream_src_is_cursor_sprite_inhibited;
} }
MetaScreenCastAreaStreamSrc * MetaScreenCastAreaStreamSrc *

View File

@@ -170,11 +170,9 @@ is_cursor_in_stream (MetaScreenCastMonitorStreamSrc *monitor_src)
} }
else else
{ {
MetaCursorTracker *cursor_tracker =
meta_backend_get_cursor_tracker (backend);
graphene_point_t cursor_position; graphene_point_t cursor_position;
meta_cursor_tracker_get_pointer (cursor_tracker, &cursor_position, NULL); cursor_position = meta_cursor_renderer_get_position (cursor_renderer);
return graphene_rect_contains_point (&logical_monitor_rect, return graphene_rect_contains_point (&logical_monitor_rect,
&cursor_position); &cursor_position);
} }
@@ -223,6 +221,8 @@ sync_cursor_state (MetaScreenCastMonitorStreamSrc *monitor_src)
static void static void
cursor_moved (MetaCursorTracker *cursor_tracker, cursor_moved (MetaCursorTracker *cursor_tracker,
float x,
float y,
MetaScreenCastMonitorStreamSrc *monitor_src) MetaScreenCastMonitorStreamSrc *monitor_src)
{ {
sync_cursor_state (monitor_src); sync_cursor_state (monitor_src);
@@ -236,17 +236,30 @@ cursor_changed (MetaCursorTracker *cursor_tracker,
sync_cursor_state (monitor_src); sync_cursor_state (monitor_src);
} }
static MetaCursorRenderer *
get_cursor_renderer (MetaScreenCastMonitorStreamSrc *monitor_src)
{
MetaScreenCastStreamSrc *src = META_SCREEN_CAST_STREAM_SRC (monitor_src);
MetaScreenCastStream *stream = meta_screen_cast_stream_src_get_stream (src);
MetaScreenCastSession *session = meta_screen_cast_stream_get_session (stream);
MetaScreenCast *screen_cast =
meta_screen_cast_session_get_screen_cast (session);
MetaBackend *backend = meta_screen_cast_get_backend (screen_cast);
return meta_backend_get_cursor_renderer (backend);
}
static void static void
inhibit_hw_cursor (MetaScreenCastMonitorStreamSrc *monitor_src) inhibit_hw_cursor (MetaScreenCastMonitorStreamSrc *monitor_src)
{ {
MetaCursorRenderer *cursor_renderer;
MetaHwCursorInhibitor *inhibitor; MetaHwCursorInhibitor *inhibitor;
MetaBackend *backend;
g_return_if_fail (!monitor_src->hw_cursor_inhibited); g_return_if_fail (!monitor_src->hw_cursor_inhibited);
backend = get_backend (monitor_src); cursor_renderer = get_cursor_renderer (monitor_src);
inhibitor = META_HW_CURSOR_INHIBITOR (monitor_src); inhibitor = META_HW_CURSOR_INHIBITOR (monitor_src);
meta_backend_add_hw_cursor_inhibitor (backend, inhibitor); meta_cursor_renderer_add_hw_cursor_inhibitor (cursor_renderer, inhibitor);
monitor_src->hw_cursor_inhibited = TRUE; monitor_src->hw_cursor_inhibited = TRUE;
} }
@@ -254,14 +267,14 @@ inhibit_hw_cursor (MetaScreenCastMonitorStreamSrc *monitor_src)
static void static void
uninhibit_hw_cursor (MetaScreenCastMonitorStreamSrc *monitor_src) uninhibit_hw_cursor (MetaScreenCastMonitorStreamSrc *monitor_src)
{ {
MetaCursorRenderer *cursor_renderer;
MetaHwCursorInhibitor *inhibitor; MetaHwCursorInhibitor *inhibitor;
MetaBackend *backend;
g_return_if_fail (monitor_src->hw_cursor_inhibited); g_return_if_fail (monitor_src->hw_cursor_inhibited);
backend = get_backend (monitor_src); cursor_renderer = get_cursor_renderer (monitor_src);
inhibitor = META_HW_CURSOR_INHIBITOR (monitor_src); inhibitor = META_HW_CURSOR_INHIBITOR (monitor_src);
meta_backend_remove_hw_cursor_inhibitor (backend, inhibitor); meta_cursor_renderer_remove_hw_cursor_inhibitor (cursor_renderer, inhibitor);
monitor_src->hw_cursor_inhibited = FALSE; monitor_src->hw_cursor_inhibited = FALSE;
} }
@@ -330,7 +343,6 @@ meta_screen_cast_monitor_stream_src_enable (MetaScreenCastStreamSrc *src)
g_signal_connect_after (cursor_tracker, "cursor-changed", g_signal_connect_after (cursor_tracker, "cursor-changed",
G_CALLBACK (cursor_changed), G_CALLBACK (cursor_changed),
monitor_src); monitor_src);
meta_cursor_tracker_track_position (cursor_tracker);
G_GNUC_FALLTHROUGH; G_GNUC_FALLTHROUGH;
case META_SCREEN_CAST_CURSOR_MODE_HIDDEN: case META_SCREEN_CAST_CURSOR_MODE_HIDDEN:
add_view_painted_watches (monitor_src, add_view_painted_watches (monitor_src,
@@ -338,7 +350,6 @@ meta_screen_cast_monitor_stream_src_enable (MetaScreenCastStreamSrc *src)
break; break;
case META_SCREEN_CAST_CURSOR_MODE_EMBEDDED: case META_SCREEN_CAST_CURSOR_MODE_EMBEDDED:
inhibit_hw_cursor (monitor_src); inhibit_hw_cursor (monitor_src);
meta_cursor_tracker_track_position (cursor_tracker);
add_view_painted_watches (monitor_src, add_view_painted_watches (monitor_src,
META_STAGE_WATCH_AFTER_PAINT); META_STAGE_WATCH_AFTER_PAINT);
break; break;
@@ -352,7 +363,6 @@ meta_screen_cast_monitor_stream_src_disable (MetaScreenCastStreamSrc *src)
{ {
MetaScreenCastMonitorStreamSrc *monitor_src = MetaScreenCastMonitorStreamSrc *monitor_src =
META_SCREEN_CAST_MONITOR_STREAM_SRC (src); META_SCREEN_CAST_MONITOR_STREAM_SRC (src);
MetaScreenCastStream *stream = meta_screen_cast_stream_src_get_stream (src);
MetaBackend *backend = get_backend (monitor_src); MetaBackend *backend = get_backend (monitor_src);
MetaCursorTracker *cursor_tracker = meta_backend_get_cursor_tracker (backend); MetaCursorTracker *cursor_tracker = meta_backend_get_cursor_tracker (backend);
ClutterStage *stage; ClutterStage *stage;
@@ -377,79 +387,6 @@ meta_screen_cast_monitor_stream_src_disable (MetaScreenCastStreamSrc *src)
cursor_tracker); cursor_tracker);
g_clear_signal_handler (&monitor_src->cursor_changed_handler_id, g_clear_signal_handler (&monitor_src->cursor_changed_handler_id,
cursor_tracker); cursor_tracker);
switch (meta_screen_cast_stream_get_cursor_mode (stream))
{
case META_SCREEN_CAST_CURSOR_MODE_METADATA:
case META_SCREEN_CAST_CURSOR_MODE_EMBEDDED:
meta_cursor_tracker_untrack_position (cursor_tracker);
break;
case META_SCREEN_CAST_CURSOR_MODE_HIDDEN:
break;
}
}
static void
maybe_paint_cursor_sprite (MetaScreenCastMonitorStreamSrc *monitor_src,
uint8_t *data)
{
MetaScreenCastStreamSrc *src = META_SCREEN_CAST_STREAM_SRC (monitor_src);
MetaBackend *backend = get_backend (monitor_src);
MetaCursorRenderer *cursor_renderer =
meta_backend_get_cursor_renderer (backend);
MetaCursorSprite *cursor_sprite;
CoglTexture *sprite_texture;
int sprite_width, sprite_height, sprite_stride;
float sprite_scale;
uint8_t *sprite_data;
cairo_surface_t *sprite_surface;
graphene_rect_t sprite_rect;
int width, height, stride;
cairo_surface_t *surface;
cairo_t *cr;
cursor_sprite = meta_cursor_renderer_get_cursor (cursor_renderer);
if (!cursor_sprite)
return;
if (meta_cursor_renderer_is_overlay_visible (cursor_renderer))
return;
sprite_rect = meta_cursor_renderer_calculate_rect (cursor_renderer,
cursor_sprite);
sprite_texture = meta_cursor_sprite_get_cogl_texture (cursor_sprite);
sprite_width = cogl_texture_get_width (sprite_texture);
sprite_height = cogl_texture_get_height (sprite_texture);
sprite_stride = sprite_width * 4;
sprite_scale = meta_cursor_sprite_get_texture_scale (cursor_sprite);
sprite_data = g_new0 (uint8_t, sprite_stride * sprite_height);
cogl_texture_get_data (sprite_texture,
CLUTTER_CAIRO_FORMAT_ARGB32,
sprite_stride,
sprite_data);
sprite_surface = cairo_image_surface_create_for_data (sprite_data,
CAIRO_FORMAT_ARGB32,
sprite_width,
sprite_height,
sprite_stride);
cairo_surface_set_device_scale (sprite_surface, sprite_scale, sprite_scale);
stride = meta_screen_cast_stream_src_get_stride (src);
width = meta_screen_cast_stream_src_get_width (src);
height = meta_screen_cast_stream_src_get_height (src);
surface = cairo_image_surface_create_for_data (data,
CAIRO_FORMAT_ARGB32,
width, height, stride);
cr = cairo_create (surface);
cairo_set_source_surface (cr, sprite_surface,
sprite_rect.origin.x,
sprite_rect.origin.y);
cairo_paint (cr);
cairo_destroy (cr);
cairo_surface_destroy (sprite_surface);
cairo_surface_destroy (surface);
g_free (sprite_data);
} }
static gboolean static gboolean
@@ -459,7 +396,6 @@ meta_screen_cast_monitor_stream_src_record_to_buffer (MetaScreenCastStreamSrc *
{ {
MetaScreenCastMonitorStreamSrc *monitor_src = MetaScreenCastMonitorStreamSrc *monitor_src =
META_SCREEN_CAST_MONITOR_STREAM_SRC (src); META_SCREEN_CAST_MONITOR_STREAM_SRC (src);
MetaScreenCastStream *stream = meta_screen_cast_stream_src_get_stream (src);
ClutterStage *stage; ClutterStage *stage;
MetaMonitor *monitor; MetaMonitor *monitor;
MetaLogicalMonitor *logical_monitor; MetaLogicalMonitor *logical_monitor;
@@ -469,16 +405,6 @@ meta_screen_cast_monitor_stream_src_record_to_buffer (MetaScreenCastStreamSrc *
stage = get_stage (monitor_src); stage = get_stage (monitor_src);
clutter_stage_capture_into (stage, FALSE, &logical_monitor->rect, data); clutter_stage_capture_into (stage, FALSE, &logical_monitor->rect, data);
switch (meta_screen_cast_stream_get_cursor_mode (stream))
{
case META_SCREEN_CAST_CURSOR_MODE_EMBEDDED:
maybe_paint_cursor_sprite (monitor_src, data);
break;
case META_SCREEN_CAST_CURSOR_MODE_METADATA:
case META_SCREEN_CAST_CURSOR_MODE_HIDDEN:
break;
}
return TRUE; return TRUE;
} }
@@ -585,8 +511,6 @@ meta_screen_cast_monitor_stream_src_set_cursor_metadata (MetaScreenCastStreamSrc
MetaBackend *backend = get_backend (monitor_src); MetaBackend *backend = get_backend (monitor_src);
MetaCursorRenderer *cursor_renderer = MetaCursorRenderer *cursor_renderer =
meta_backend_get_cursor_renderer (backend); meta_backend_get_cursor_renderer (backend);
MetaCursorTracker *cursor_tracker =
meta_backend_get_cursor_tracker (backend);
MetaCursorSprite *cursor_sprite; MetaCursorSprite *cursor_sprite;
MetaMonitor *monitor; MetaMonitor *monitor;
MetaLogicalMonitor *logical_monitor; MetaLogicalMonitor *logical_monitor;
@@ -616,7 +540,7 @@ meta_screen_cast_monitor_stream_src_set_cursor_metadata (MetaScreenCastStreamSrc
else else
view_scale = 1.0; view_scale = 1.0;
meta_cursor_tracker_get_pointer (cursor_tracker, &cursor_position, NULL); cursor_position = meta_cursor_renderer_get_position (cursor_renderer);
cursor_position.x -= logical_monitor_rect.origin.x; cursor_position.x -= logical_monitor_rect.origin.x;
cursor_position.y -= logical_monitor_rect.origin.y; cursor_position.y -= logical_monitor_rect.origin.y;
cursor_position.x *= view_scale; cursor_position.x *= view_scale;
@@ -658,7 +582,8 @@ meta_screen_cast_monitor_stream_src_set_cursor_metadata (MetaScreenCastStreamSrc
} }
static gboolean static gboolean
meta_screen_cast_monitor_stream_src_is_cursor_inhibited (MetaHwCursorInhibitor *inhibitor) meta_screen_cast_monitor_stream_src_is_cursor_sprite_inhibited (MetaHwCursorInhibitor *inhibitor,
MetaCursorSprite *cursor_sprite)
{ {
MetaScreenCastMonitorStreamSrc *monitor_src = MetaScreenCastMonitorStreamSrc *monitor_src =
META_SCREEN_CAST_MONITOR_STREAM_SRC (inhibitor); META_SCREEN_CAST_MONITOR_STREAM_SRC (inhibitor);
@@ -669,8 +594,8 @@ meta_screen_cast_monitor_stream_src_is_cursor_inhibited (MetaHwCursorInhibitor *
static void static void
hw_cursor_inhibitor_iface_init (MetaHwCursorInhibitorInterface *iface) hw_cursor_inhibitor_iface_init (MetaHwCursorInhibitorInterface *iface)
{ {
iface->is_cursor_inhibited = iface->is_cursor_sprite_inhibited =
meta_screen_cast_monitor_stream_src_is_cursor_inhibited; meta_screen_cast_monitor_stream_src_is_cursor_sprite_inhibited;
} }
MetaScreenCastMonitorStreamSrc * MetaScreenCastMonitorStreamSrc *

View File

@@ -1058,24 +1058,6 @@ meta_screen_cast_stream_src_get_stride (MetaScreenCastStreamSrc *src)
return priv->video_stride; return priv->video_stride;
} }
int
meta_screen_cast_stream_src_get_width (MetaScreenCastStreamSrc *src)
{
MetaScreenCastStreamSrcPrivate *priv =
meta_screen_cast_stream_src_get_instance_private (src);
return priv->stream_width;
}
int
meta_screen_cast_stream_src_get_height (MetaScreenCastStreamSrc *src)
{
MetaScreenCastStreamSrcPrivate *priv =
meta_screen_cast_stream_src_get_instance_private (src);
return priv->stream_height;
}
MetaScreenCastStream * MetaScreenCastStream *
meta_screen_cast_stream_src_get_stream (MetaScreenCastStreamSrc *src) meta_screen_cast_stream_src_get_stream (MetaScreenCastStreamSrc *src)
{ {

View File

@@ -80,10 +80,6 @@ gboolean meta_screen_cast_stream_src_pending_follow_up_frame (MetaScreenCastStre
int meta_screen_cast_stream_src_get_stride (MetaScreenCastStreamSrc *src); int meta_screen_cast_stream_src_get_stride (MetaScreenCastStreamSrc *src);
int meta_screen_cast_stream_src_get_width (MetaScreenCastStreamSrc *src);
int meta_screen_cast_stream_src_get_height (MetaScreenCastStreamSrc *src);
MetaScreenCastStream * meta_screen_cast_stream_src_get_stream (MetaScreenCastStreamSrc *src); MetaScreenCastStream * meta_screen_cast_stream_src_get_stream (MetaScreenCastStreamSrc *src);
gboolean meta_screen_cast_stream_src_draw_cursor_into (MetaScreenCastStreamSrc *src, gboolean meta_screen_cast_stream_src_draw_cursor_into (MetaScreenCastStreamSrc *src,

View File

@@ -23,7 +23,6 @@
#include "backends/meta-screen-cast-window-stream-src.h" #include "backends/meta-screen-cast-window-stream-src.h"
#include "backends/meta-backend-private.h" #include "backends/meta-backend-private.h"
#include "backends/meta-cursor-tracker-private.h"
#include "backends/meta-screen-cast-session.h" #include "backends/meta-screen-cast-session.h"
#include "backends/meta-screen-cast-window.h" #include "backends/meta-screen-cast-window.h"
#include "backends/meta-screen-cast-window-stream.h" #include "backends/meta-screen-cast-window-stream.h"
@@ -110,8 +109,6 @@ maybe_draw_cursor_sprite (MetaScreenCastWindowStreamSrc *window_src,
MetaBackend *backend = get_backend (window_src); MetaBackend *backend = get_backend (window_src);
MetaCursorRenderer *cursor_renderer = MetaCursorRenderer *cursor_renderer =
meta_backend_get_cursor_renderer (backend); meta_backend_get_cursor_renderer (backend);
MetaCursorTracker *cursor_tracker =
meta_backend_get_cursor_tracker (backend);
MetaCursorSprite *cursor_sprite; MetaCursorSprite *cursor_sprite;
CoglTexture *cursor_texture; CoglTexture *cursor_texture;
MetaScreenCastWindow *screen_cast_window; MetaScreenCastWindow *screen_cast_window;
@@ -135,7 +132,7 @@ maybe_draw_cursor_sprite (MetaScreenCastWindowStreamSrc *window_src,
return; return;
screen_cast_window = window_src->screen_cast_window; screen_cast_window = window_src->screen_cast_window;
meta_cursor_tracker_get_pointer (cursor_tracker, &cursor_position, NULL); cursor_position = meta_cursor_renderer_get_position (cursor_renderer);
if (!meta_screen_cast_window_transform_cursor_position (screen_cast_window, if (!meta_screen_cast_window_transform_cursor_position (screen_cast_window,
cursor_sprite, cursor_sprite,
&cursor_position, &cursor_position,
@@ -191,8 +188,6 @@ maybe_blit_cursor_sprite (MetaScreenCastWindowStreamSrc *window_src,
clutter_backend_get_cogl_context (clutter_get_default_backend ()); clutter_backend_get_cogl_context (clutter_get_default_backend ());
MetaCursorRenderer *cursor_renderer = MetaCursorRenderer *cursor_renderer =
meta_backend_get_cursor_renderer (backend); meta_backend_get_cursor_renderer (backend);
MetaCursorTracker *cursor_tracker =
meta_backend_get_cursor_tracker (backend);
MetaScreenCastWindow *screen_cast_window; MetaScreenCastWindow *screen_cast_window;
MetaCursorSprite *cursor_sprite; MetaCursorSprite *cursor_sprite;
graphene_point_t relative_cursor_position; graphene_point_t relative_cursor_position;
@@ -213,7 +208,7 @@ maybe_blit_cursor_sprite (MetaScreenCastWindowStreamSrc *window_src,
return; return;
screen_cast_window = window_src->screen_cast_window; screen_cast_window = window_src->screen_cast_window;
meta_cursor_tracker_get_pointer (cursor_tracker, &cursor_position, NULL); cursor_position = meta_cursor_renderer_get_position (cursor_renderer);
if (!meta_screen_cast_window_transform_cursor_position (screen_cast_window, if (!meta_screen_cast_window_transform_cursor_position (screen_cast_window,
cursor_sprite, cursor_sprite,
&cursor_position, &cursor_position,
@@ -311,8 +306,6 @@ static void
meta_screen_cast_window_stream_src_stop (MetaScreenCastWindowStreamSrc *window_src) meta_screen_cast_window_stream_src_stop (MetaScreenCastWindowStreamSrc *window_src)
{ {
MetaScreenCastStreamSrc *src = META_SCREEN_CAST_STREAM_SRC (window_src);
MetaScreenCastStream *stream = meta_screen_cast_stream_src_get_stream (src);
MetaBackend *backend = get_backend (window_src); MetaBackend *backend = get_backend (window_src);
MetaCursorTracker *cursor_tracker = meta_backend_get_cursor_tracker (backend); MetaCursorTracker *cursor_tracker = meta_backend_get_cursor_tracker (backend);
@@ -327,16 +320,6 @@ meta_screen_cast_window_stream_src_stop (MetaScreenCastWindowStreamSrc *window_s
cursor_tracker); cursor_tracker);
g_clear_signal_handler (&window_src->cursor_changed_handler_id, g_clear_signal_handler (&window_src->cursor_changed_handler_id,
cursor_tracker); cursor_tracker);
switch (meta_screen_cast_stream_get_cursor_mode (stream))
{
case META_SCREEN_CAST_CURSOR_MODE_METADATA:
case META_SCREEN_CAST_CURSOR_MODE_EMBEDDED:
meta_cursor_tracker_untrack_position (cursor_tracker);
break;
case META_SCREEN_CAST_CURSOR_MODE_HIDDEN:
break;
}
} }
static void static void
@@ -364,15 +347,13 @@ is_cursor_in_stream (MetaScreenCastWindowStreamSrc *window_src)
MetaBackend *backend = get_backend (window_src); MetaBackend *backend = get_backend (window_src);
MetaCursorRenderer *cursor_renderer = MetaCursorRenderer *cursor_renderer =
meta_backend_get_cursor_renderer (backend); meta_backend_get_cursor_renderer (backend);
MetaCursorTracker *cursor_tracker =
meta_backend_get_cursor_tracker (backend);
MetaCursorSprite *cursor_sprite; MetaCursorSprite *cursor_sprite;
graphene_point_t cursor_position; graphene_point_t cursor_position;
MetaScreenCastWindow *screen_cast_window; MetaScreenCastWindow *screen_cast_window;
cursor_sprite = meta_cursor_renderer_get_cursor (cursor_renderer); cursor_sprite = meta_cursor_renderer_get_cursor (cursor_renderer);
meta_cursor_tracker_get_pointer (cursor_tracker, &cursor_position, NULL); cursor_position = meta_cursor_renderer_get_position (cursor_renderer);
screen_cast_window = window_src->screen_cast_window; screen_cast_window = window_src->screen_cast_window;
return meta_screen_cast_window_transform_cursor_position (screen_cast_window, return meta_screen_cast_window_transform_cursor_position (screen_cast_window,
@@ -400,6 +381,8 @@ sync_cursor_state (MetaScreenCastWindowStreamSrc *window_src)
static void static void
cursor_moved (MetaCursorTracker *cursor_tracker, cursor_moved (MetaCursorTracker *cursor_tracker,
float x,
float y,
MetaScreenCastWindowStreamSrc *window_src) MetaScreenCastWindowStreamSrc *window_src)
{ {
sync_cursor_state (window_src); sync_cursor_state (window_src);
@@ -455,7 +438,6 @@ meta_screen_cast_window_stream_src_enable (MetaScreenCastStreamSrc *src)
g_signal_connect_after (cursor_tracker, "cursor-changed", g_signal_connect_after (cursor_tracker, "cursor-changed",
G_CALLBACK (cursor_changed), G_CALLBACK (cursor_changed),
window_src); window_src);
meta_cursor_tracker_track_position (cursor_tracker);
break; break;
case META_SCREEN_CAST_CURSOR_MODE_HIDDEN: case META_SCREEN_CAST_CURSOR_MODE_HIDDEN:
break; break;
@@ -545,8 +527,6 @@ meta_screen_cast_window_stream_src_set_cursor_metadata (MetaScreenCastStreamSrc
MetaBackend *backend = get_backend (window_src); MetaBackend *backend = get_backend (window_src);
MetaCursorRenderer *cursor_renderer = MetaCursorRenderer *cursor_renderer =
meta_backend_get_cursor_renderer (backend); meta_backend_get_cursor_renderer (backend);
MetaCursorTracker *cursor_tracker =
meta_backend_get_cursor_tracker (backend);
MetaScreenCastWindow *screen_cast_window = window_src->screen_cast_window; MetaScreenCastWindow *screen_cast_window = window_src->screen_cast_window;
MetaCursorSprite *cursor_sprite; MetaCursorSprite *cursor_sprite;
graphene_point_t cursor_position; graphene_point_t cursor_position;
@@ -555,7 +535,7 @@ meta_screen_cast_window_stream_src_set_cursor_metadata (MetaScreenCastStreamSrc
int x, y; int x, y;
cursor_sprite = meta_cursor_renderer_get_cursor (cursor_renderer); cursor_sprite = meta_cursor_renderer_get_cursor (cursor_renderer);
meta_cursor_tracker_get_pointer (cursor_tracker, &cursor_position, NULL); cursor_position = meta_cursor_renderer_get_position (cursor_renderer);
if (!meta_screen_cast_window_transform_cursor_position (screen_cast_window, if (!meta_screen_cast_window_transform_cursor_position (screen_cast_window,
cursor_sprite, cursor_sprite,

View File

@@ -64,8 +64,8 @@ void meta_settings_enable_experimental_feature (MetaSettings *settings
MetaExperimentalFeature feature); MetaExperimentalFeature feature);
void meta_settings_get_xwayland_grab_patterns (MetaSettings *settings, void meta_settings_get_xwayland_grab_patterns (MetaSettings *settings,
GPtrArray **allow_list_patterns, GPtrArray **whitelist_patterns,
GPtrArray **deny_list_patterns); GPtrArray **blacklist_patterns);
gboolean meta_settings_are_xwayland_grabs_allowed (MetaSettings *settings); gboolean meta_settings_are_xwayland_grabs_allowed (MetaSettings *settings);

View File

@@ -66,8 +66,8 @@ struct _MetaSettings
gboolean experimental_features_overridden; gboolean experimental_features_overridden;
gboolean xwayland_allow_grabs; gboolean xwayland_allow_grabs;
GPtrArray *xwayland_grab_allow_list_patterns; GPtrArray *xwayland_grab_whitelist_patterns;
GPtrArray *xwayland_grab_deny_list_patterns; GPtrArray *xwayland_grab_blacklist_patterns;
}; };
G_DEFINE_TYPE (MetaSettings, meta_settings, G_TYPE_OBJECT) G_DEFINE_TYPE (MetaSettings, meta_settings, G_TYPE_OBJECT)
@@ -321,12 +321,12 @@ static void
xwayland_grab_list_add_item (MetaSettings *settings, xwayland_grab_list_add_item (MetaSettings *settings,
char *item) char *item)
{ {
/* If first character is '!', it's a denied value */ /* If first character is '!', it's a blacklisted item */
if (item[0] != '!') if (item[0] != '!')
g_ptr_array_add (settings->xwayland_grab_allow_list_patterns, g_ptr_array_add (settings->xwayland_grab_whitelist_patterns,
g_pattern_spec_new (item)); g_pattern_spec_new (item));
else if (item[1] != 0) else if (item[1] != 0)
g_ptr_array_add (settings->xwayland_grab_deny_list_patterns, g_ptr_array_add (settings->xwayland_grab_blacklist_patterns,
g_pattern_spec_new (&item[1])); g_pattern_spec_new (&item[1]));
} }
@@ -356,14 +356,14 @@ update_xwayland_grab_access_rules (MetaSettings *settings)
int i; int i;
/* Free previous patterns and create new arrays */ /* Free previous patterns and create new arrays */
g_clear_pointer (&settings->xwayland_grab_allow_list_patterns, g_clear_pointer (&settings->xwayland_grab_whitelist_patterns,
g_ptr_array_unref); g_ptr_array_unref);
settings->xwayland_grab_allow_list_patterns = settings->xwayland_grab_whitelist_patterns =
g_ptr_array_new_with_free_func ((GDestroyNotify) g_pattern_spec_free); g_ptr_array_new_with_free_func ((GDestroyNotify) g_pattern_spec_free);
g_clear_pointer (&settings->xwayland_grab_deny_list_patterns, g_clear_pointer (&settings->xwayland_grab_blacklist_patterns,
g_ptr_array_unref); g_ptr_array_unref);
settings->xwayland_grab_deny_list_patterns = settings->xwayland_grab_blacklist_patterns =
g_ptr_array_new_with_free_func ((GDestroyNotify) g_pattern_spec_free); g_ptr_array_new_with_free_func ((GDestroyNotify) g_pattern_spec_free);
/* Add system defaults values */ /* Add system defaults values */
@@ -405,11 +405,11 @@ wayland_settings_changed (GSettings *wayland_settings,
void void
meta_settings_get_xwayland_grab_patterns (MetaSettings *settings, meta_settings_get_xwayland_grab_patterns (MetaSettings *settings,
GPtrArray **allow_list_patterns, GPtrArray **whitelist_patterns,
GPtrArray **deny_list_patterns) GPtrArray **blacklist_patterns)
{ {
*allow_list_patterns = settings->xwayland_grab_allow_list_patterns; *whitelist_patterns = settings->xwayland_grab_whitelist_patterns;
*deny_list_patterns = settings->xwayland_grab_deny_list_patterns; *blacklist_patterns = settings->xwayland_grab_blacklist_patterns;
} }
gboolean gboolean
@@ -437,9 +437,9 @@ meta_settings_dispose (GObject *object)
g_clear_object (&settings->mutter_settings); g_clear_object (&settings->mutter_settings);
g_clear_object (&settings->interface_settings); g_clear_object (&settings->interface_settings);
g_clear_object (&settings->wayland_settings); g_clear_object (&settings->wayland_settings);
g_clear_pointer (&settings->xwayland_grab_allow_list_patterns, g_clear_pointer (&settings->xwayland_grab_whitelist_patterns,
g_ptr_array_unref); g_ptr_array_unref);
g_clear_pointer (&settings->xwayland_grab_deny_list_patterns, g_clear_pointer (&settings->xwayland_grab_blacklist_patterns,
g_ptr_array_unref); g_ptr_array_unref);
G_OBJECT_CLASS (meta_settings_parent_class)->dispose (object); G_OBJECT_CLASS (meta_settings_parent_class)->dispose (object);

View File

@@ -54,11 +54,6 @@ void meta_stage_update_cursor_overlay (MetaStage *stage,
CoglTexture *texture, CoglTexture *texture,
graphene_rect_t *rect); graphene_rect_t *rect);
void meta_overlay_set_visible (MetaOverlay *overlay,
gboolean is_visible);
gboolean meta_overlay_is_visible (MetaOverlay *overlay);
void meta_stage_set_active (MetaStage *stage, void meta_stage_set_active (MetaStage *stage,
gboolean is_active); gboolean is_active);

View File

@@ -25,7 +25,6 @@
#include "backends/meta-stage-private.h" #include "backends/meta-stage-private.h"
#include "backends/meta-backend-private.h" #include "backends/meta-backend-private.h"
#include "backends/meta-cursor-tracker-private.h"
#include "clutter/clutter-mutter.h" #include "clutter/clutter-mutter.h"
#include "meta/meta-backend.h" #include "meta/meta-backend.h"
#include "meta/meta-monitor-manager.h" #include "meta/meta-monitor-manager.h"
@@ -51,9 +50,7 @@ struct _MetaStageWatch
struct _MetaOverlay struct _MetaOverlay
{ {
MetaStage *stage; gboolean enabled;
gboolean is_visible;
CoglPipeline *pipeline; CoglPipeline *pipeline;
CoglTexture *texture; CoglTexture *texture;
@@ -67,8 +64,6 @@ struct _MetaStage
{ {
ClutterStage parent; ClutterStage parent;
MetaBackend *backend;
GPtrArray *watchers[N_WATCH_MODES]; GPtrArray *watchers[N_WATCH_MODES];
GList *overlays; GList *overlays;
@@ -78,15 +73,12 @@ struct _MetaStage
G_DEFINE_TYPE (MetaStage, meta_stage, CLUTTER_TYPE_STAGE); G_DEFINE_TYPE (MetaStage, meta_stage, CLUTTER_TYPE_STAGE);
static MetaOverlay * static MetaOverlay *
meta_overlay_new (MetaStage *stage) meta_overlay_new (void)
{ {
ClutterBackend *clutter_backend =
meta_backend_get_clutter_backend (stage->backend);
CoglContext *ctx = clutter_backend_get_cogl_context (clutter_backend);
MetaOverlay *overlay; MetaOverlay *overlay;
CoglContext *ctx = clutter_backend_get_cogl_context (clutter_get_default_backend ());
overlay = g_slice_new0 (MetaOverlay); overlay = g_slice_new0 (MetaOverlay);
overlay->stage = stage;
overlay->pipeline = cogl_pipeline_new (ctx); overlay->pipeline = cogl_pipeline_new (ctx);
return overlay; return overlay;
@@ -111,9 +103,15 @@ meta_overlay_set (MetaOverlay *overlay,
overlay->texture = texture; overlay->texture = texture;
if (texture) if (texture)
cogl_pipeline_set_layer_texture (overlay->pipeline, 0, texture); {
cogl_pipeline_set_layer_texture (overlay->pipeline, 0, texture);
overlay->enabled = TRUE;
}
else else
cogl_pipeline_set_layer_texture (overlay->pipeline, 0, NULL); {
cogl_pipeline_set_layer_texture (overlay->pipeline, 0, NULL);
overlay->enabled = FALSE;
}
} }
overlay->current_rect = *rect; overlay->current_rect = *rect;
@@ -125,13 +123,10 @@ meta_overlay_paint (MetaOverlay *overlay,
{ {
CoglFramebuffer *framebuffer; CoglFramebuffer *framebuffer;
if (!overlay->texture) if (!overlay->enabled)
return; return;
if (!overlay->is_visible && g_assert (meta_is_wayland_compositor ());
!(clutter_paint_context_get_paint_flags (paint_context) &
CLUTTER_PAINT_FLAG_FORCE_CURSORS))
return;
framebuffer = clutter_paint_context_get_framebuffer (paint_context); framebuffer = clutter_paint_context_get_framebuffer (paint_context);
cogl_framebuffer_draw_rectangle (framebuffer, cogl_framebuffer_draw_rectangle (framebuffer,
@@ -198,6 +193,7 @@ meta_stage_paint (ClutterActor *actor,
{ {
MetaStage *stage = META_STAGE (actor); MetaStage *stage = META_STAGE (actor);
ClutterStageView *view; ClutterStageView *view;
GList *l;
CLUTTER_ACTOR_CLASS (meta_stage_parent_class)->paint (actor, paint_context); CLUTTER_ACTOR_CLASS (meta_stage_parent_class)->paint (actor, paint_context);
@@ -210,26 +206,11 @@ meta_stage_paint (ClutterActor *actor,
g_signal_emit (stage, signals[ACTORS_PAINTED], 0); g_signal_emit (stage, signals[ACTORS_PAINTED], 0);
if ((clutter_paint_context_get_paint_flags (paint_context) &
CLUTTER_PAINT_FLAG_FORCE_CURSORS))
{
MetaCursorTracker *cursor_tracker =
meta_backend_get_cursor_tracker (stage->backend);
meta_cursor_tracker_track_position (cursor_tracker);
}
if (!(clutter_paint_context_get_paint_flags (paint_context) & if (!(clutter_paint_context_get_paint_flags (paint_context) &
CLUTTER_PAINT_FLAG_NO_CURSORS)) CLUTTER_PAINT_FLAG_NO_CURSORS))
g_list_foreach (stage->overlays, (GFunc) meta_overlay_paint, paint_context);
if ((clutter_paint_context_get_paint_flags (paint_context) &
CLUTTER_PAINT_FLAG_FORCE_CURSORS))
{ {
MetaCursorTracker *cursor_tracker = for (l = stage->overlays; l; l = l->next)
meta_backend_get_cursor_tracker (stage->backend); meta_overlay_paint (l->data, paint_context);
meta_cursor_tracker_untrack_position (cursor_tracker);
} }
if (view) if (view)
@@ -324,7 +305,6 @@ meta_stage_new (MetaBackend *backend)
MetaMonitorManager *monitor_manager; MetaMonitorManager *monitor_manager;
stage = g_object_new (META_TYPE_STAGE, NULL); stage = g_object_new (META_TYPE_STAGE, NULL);
stage->backend = backend;
monitor_manager = meta_backend_get_monitor_manager (backend); monitor_manager = meta_backend_get_monitor_manager (backend);
g_signal_connect (monitor_manager, "power-save-mode-changed", g_signal_connect (monitor_manager, "power-save-mode-changed",
@@ -366,7 +346,7 @@ queue_redraw_for_overlay (MetaStage *stage,
} }
/* Draw the overlay at the new position */ /* Draw the overlay at the new position */
if (overlay->is_visible && overlay->texture) if (overlay->enabled)
queue_redraw_clutter_rect (stage, overlay, &overlay->current_rect); queue_redraw_clutter_rect (stage, overlay, &overlay->current_rect);
} }
@@ -375,7 +355,7 @@ meta_stage_create_cursor_overlay (MetaStage *stage)
{ {
MetaOverlay *overlay; MetaOverlay *overlay;
overlay = meta_overlay_new (stage); overlay = meta_overlay_new ();
stage->overlays = g_list_prepend (stage->overlays, overlay); stage->overlays = g_list_prepend (stage->overlays, overlay);
return overlay; return overlay;
@@ -401,27 +381,12 @@ meta_stage_update_cursor_overlay (MetaStage *stage,
CoglTexture *texture, CoglTexture *texture,
graphene_rect_t *rect) graphene_rect_t *rect)
{ {
g_assert (meta_is_wayland_compositor () || texture == NULL);
meta_overlay_set (overlay, texture, rect); meta_overlay_set (overlay, texture, rect);
queue_redraw_for_overlay (stage, overlay); queue_redraw_for_overlay (stage, overlay);
} }
void
meta_overlay_set_visible (MetaOverlay *overlay,
gboolean is_visible)
{
if (overlay->is_visible == is_visible)
return;
overlay->is_visible = is_visible;
queue_redraw_for_overlay (overlay->stage, overlay);
}
gboolean
meta_overlay_is_visible (MetaOverlay *overlay)
{
return overlay->is_visible;
}
void void
meta_stage_set_active (MetaStage *stage, meta_stage_set_active (MetaStage *stage,
gboolean is_active) gboolean is_active)

View File

@@ -1,212 +0,0 @@
/*
* Copyright (C) 2020 Red Hat
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
* 02111-1307, USA.
*
* Written by:
* Carlos Garnacho <carlosg@gnome.org>
*/
#include "config.h"
#include "meta-viewport-info.h"
#include "core/main-private.h"
#include "core/boxes-private.h"
typedef struct _ViewInfo ViewInfo;
struct _ViewInfo
{
cairo_rectangle_int_t rect;
float scale;
};
struct _MetaViewportInfo
{
GObject parent_class;
GArray *views;
};
G_DEFINE_TYPE (MetaViewportInfo, meta_viewport_info, G_TYPE_OBJECT)
static void
meta_viewport_info_finalize (GObject *object)
{
MetaViewportInfo *info = META_VIEWPORT_INFO (object);
g_array_unref (info->views);
G_OBJECT_CLASS (meta_viewport_info_parent_class)->finalize (object);
}
static void
meta_viewport_info_class_init (MetaViewportInfoClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
object_class->finalize = meta_viewport_info_finalize;
}
static void
meta_viewport_info_init (MetaViewportInfo *info)
{
info->views = g_array_new (FALSE, FALSE, sizeof (ViewInfo));
}
MetaViewportInfo *
meta_viewport_info_new (cairo_rectangle_int_t *views,
float *scales,
guint n_views)
{
MetaViewportInfo *viewport_info;
int i;
viewport_info = g_object_new (META_TYPE_VIEWPORT_INFO, NULL);
for (i = 0; i < n_views; i++)
{
ViewInfo info;
info.rect = views[i];
info.scale = scales[i];
g_array_append_val (viewport_info->views, info);
}
return viewport_info;
}
int
meta_viewport_info_get_view_at (MetaViewportInfo *viewport_info,
float x,
float y)
{
int i;
for (i = 0; i < viewport_info->views->len; i++)
{
ViewInfo *info = &g_array_index (viewport_info->views, ViewInfo, i);
if (META_POINT_IN_RECT (x, y, info->rect))
return i;
}
return -1;
}
gboolean
meta_viewport_info_get_view (MetaViewportInfo *viewport_info,
int idx,
cairo_rectangle_int_t *rect,
float *scale)
{
ViewInfo *info;
if (idx < 0 || idx >= viewport_info->views->len)
return FALSE;
info = &g_array_index (viewport_info->views, ViewInfo, idx);
if (rect)
*rect = info->rect;
if (scale)
*scale = info->scale;
return TRUE;
}
static gboolean
view_has_neighbor (cairo_rectangle_int_t *view,
cairo_rectangle_int_t *neighbor,
MetaDisplayDirection neighbor_direction)
{
switch (neighbor_direction)
{
case META_DISPLAY_RIGHT:
if (neighbor->x == (view->x + view->width) &&
meta_rectangle_vert_overlap (neighbor, view))
return TRUE;
break;
case META_DISPLAY_LEFT:
if (view->x == (neighbor->x + neighbor->width) &&
meta_rectangle_vert_overlap (neighbor, view))
return TRUE;
break;
case META_DISPLAY_UP:
if (view->y == (neighbor->y + neighbor->height) &&
meta_rectangle_horiz_overlap (neighbor, view))
return TRUE;
break;
case META_DISPLAY_DOWN:
if (neighbor->y == (view->y + view->height) &&
meta_rectangle_horiz_overlap (neighbor, view))
return TRUE;
break;
}
return FALSE;
}
int
meta_viewport_info_get_neighbor (MetaViewportInfo *viewport_info,
int idx,
MetaDisplayDirection direction)
{
cairo_rectangle_int_t rect;
int i;
if (!meta_viewport_info_get_view (viewport_info, idx, &rect, NULL))
return -1;
for (i = 0; i < viewport_info->views->len; i++)
{
ViewInfo *info = &g_array_index (viewport_info->views, ViewInfo, i);
if (idx == i)
continue;
if (view_has_neighbor (&rect, &info->rect, direction))
return i;
}
return -1;
}
int
meta_viewport_info_get_num_views (MetaViewportInfo *info)
{
return info->views->len;
}
void
meta_viewport_info_get_extents (MetaViewportInfo *viewport_info,
float *width,
float *height)
{
int min_x = G_MAXINT, min_y = G_MAXINT, max_x = G_MININT, max_y = G_MININT, i;
for (i = 0; i < viewport_info->views->len; i++)
{
ViewInfo *info = &g_array_index (viewport_info->views, ViewInfo, i);
min_x = MIN (min_x, info->rect.x);
max_x = MAX (max_x, info->rect.x + info->rect.width);
min_y = MIN (min_y, info->rect.y);
max_y = MAX (max_y, info->rect.y + info->rect.height);
}
if (width)
*width = (float) max_x - min_x;
if (height)
*height = (float) max_y - min_y;
}

View File

@@ -1,57 +0,0 @@
/*
* Copyright (C) 2020 Red Hat
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
* 02111-1307, USA.
*
* Written by:
* Carlos Garnacho <carlosg@gnome.org>
*/
#ifndef META_VIEWPORT_INFO_H
#define META_VIEWPORT_INFO_H
#include <cairo.h>
#include <glib-object.h>
#include "meta/display.h"
#define META_TYPE_VIEWPORT_INFO (meta_viewport_info_get_type ())
G_DECLARE_FINAL_TYPE (MetaViewportInfo, meta_viewport_info,
META, VIEWPORT_INFO, GObject)
MetaViewportInfo * meta_viewport_info_new (cairo_rectangle_int_t *views,
float *scales,
guint n_views);
int meta_viewport_info_get_view_at (MetaViewportInfo *info,
float x,
float y);
gboolean meta_viewport_info_get_view (MetaViewportInfo *viewport_info,
int idx,
cairo_rectangle_int_t *rect,
float *scale);
int meta_viewport_info_get_neighbor (MetaViewportInfo *info,
int idx,
MetaDisplayDirection direction);
int meta_viewport_info_get_num_views (MetaViewportInfo *info);
void meta_viewport_info_get_extents (MetaViewportInfo *info,
float *width,
float *height);
#endif /* META_VIEWPORT_INFO_H */

View File

@@ -22,6 +22,5 @@
#define META_BACKEND_NATIVE_TYPES_H #define META_BACKEND_NATIVE_TYPES_H
typedef struct _MetaBackendNative MetaBackendNative; typedef struct _MetaBackendNative MetaBackendNative;
typedef struct _MetaSeatNative MetaSeatNative;
#endif /* META_BACKEND_NATIVE_TYPES_H */ #endif /* META_BACKEND_NATIVE_TYPES_H */

View File

@@ -48,9 +48,10 @@
#include "backends/meta-pointer-constraint.h" #include "backends/meta-pointer-constraint.h"
#include "backends/meta-settings-private.h" #include "backends/meta-settings-private.h"
#include "backends/meta-stage-private.h" #include "backends/meta-stage-private.h"
#include "backends/native/meta-barrier-native.h"
#include "backends/native/meta-clutter-backend-native.h" #include "backends/native/meta-clutter-backend-native.h"
#include "backends/native/meta-cursor-renderer-native.h"
#include "backends/native/meta-event-native.h" #include "backends/native/meta-event-native.h"
#include "backends/native/meta-input-device-native.h"
#include "backends/native/meta-input-settings-native.h" #include "backends/native/meta-input-settings-native.h"
#include "backends/native/meta-kms.h" #include "backends/native/meta-kms.h"
#include "backends/native/meta-kms-device.h" #include "backends/native/meta-kms-device.h"
@@ -70,7 +71,7 @@ struct _MetaBackendNative
MetaLauncher *launcher; MetaLauncher *launcher;
MetaUdev *udev; MetaUdev *udev;
MetaKms *kms; MetaKms *kms;
MetaInputSettings *input_settings; MetaBarrierManagerNative *barrier_manager;
gulong udev_device_added_handler_id; gulong udev_device_added_handler_id;
}; };
@@ -98,11 +99,239 @@ meta_backend_native_finalize (GObject *object)
g_clear_object (&native->udev); g_clear_object (&native->udev);
g_clear_object (&native->kms); g_clear_object (&native->kms);
meta_launcher_free (native->launcher); meta_launcher_free (native->launcher);
g_clear_object (&native->input_settings);
G_OBJECT_CLASS (meta_backend_native_parent_class)->finalize (object); G_OBJECT_CLASS (meta_backend_native_parent_class)->finalize (object);
} }
static void
constrain_to_barriers (ClutterInputDevice *device,
guint32 time,
float *new_x,
float *new_y)
{
MetaBackendNative *native = META_BACKEND_NATIVE (meta_get_backend ());
meta_barrier_manager_native_process (native->barrier_manager,
device,
time,
new_x, new_y);
}
static void
constrain_to_client_constraint (ClutterInputDevice *device,
guint32 time,
float prev_x,
float prev_y,
float *x,
float *y)
{
MetaBackend *backend = meta_get_backend ();
MetaPointerConstraint *constraint =
meta_backend_get_client_pointer_constraint (backend);
if (!constraint)
return;
meta_pointer_constraint_constrain (constraint, device,
time, prev_x, prev_y, x, y);
}
/*
* The pointer constrain code is mostly a rip-off of the XRandR code from Xorg.
* (from xserver/randr/rrcrtc.c, RRConstrainCursorHarder)
*
* Copyright © 2006 Keith Packard
* Copyright 2010 Red Hat, Inc
*
*/
static void
constrain_all_screen_monitors (ClutterInputDevice *device,
MetaMonitorManager *monitor_manager,
float *x,
float *y)
{
graphene_point_t current;
float cx, cy;
GList *logical_monitors, *l;
clutter_input_device_get_coords (device, NULL, &current);
cx = current.x;
cy = current.y;
/* if we're trying to escape, clamp to the CRTC we're coming from */
logical_monitors =
meta_monitor_manager_get_logical_monitors (monitor_manager);
for (l = logical_monitors; l; l = l->next)
{
MetaLogicalMonitor *logical_monitor = l->data;
int left, right, top, bottom;
left = logical_monitor->rect.x;
right = left + logical_monitor->rect.width;
top = logical_monitor->rect.y;
bottom = top + logical_monitor->rect.height;
if ((cx >= left) && (cx < right) && (cy >= top) && (cy < bottom))
{
if (*x < left)
*x = left;
if (*x >= right)
*x = right - 1;
if (*y < top)
*y = top;
if (*y >= bottom)
*y = bottom - 1;
return;
}
}
}
static void
pointer_constrain_callback (ClutterInputDevice *device,
guint32 time,
float prev_x,
float prev_y,
float *new_x,
float *new_y,
gpointer user_data)
{
MetaBackend *backend = meta_get_backend ();
MetaMonitorManager *monitor_manager =
meta_backend_get_monitor_manager (backend);
/* Constrain to barriers */
constrain_to_barriers (device, time, new_x, new_y);
/* Constrain to pointer lock */
constrain_to_client_constraint (device, time, prev_x, prev_y, new_x, new_y);
/* if we're moving inside a monitor, we're fine */
if (meta_monitor_manager_get_logical_monitor_at (monitor_manager,
*new_x, *new_y))
return;
/* if we're trying to escape, clamp to the CRTC we're coming from */
constrain_all_screen_monitors (device, monitor_manager, new_x, new_y);
}
static void
relative_motion_across_outputs (MetaMonitorManager *monitor_manager,
MetaLogicalMonitor *current,
float cur_x,
float cur_y,
float *dx_inout,
float *dy_inout)
{
MetaLogicalMonitor *cur = current;
float x = cur_x, y = cur_y;
float target_x = cur_x, target_y = cur_y;
float dx = *dx_inout, dy = *dy_inout;
MetaDisplayDirection direction = -1;
while (cur)
{
MetaLine2 left, right, top, bottom, motion;
MetaVector2 intersection;
motion = (MetaLine2) {
.a = { x, y },
.b = { x + (dx * cur->scale), y + (dy * cur->scale) }
};
left = (MetaLine2) {
{ cur->rect.x, cur->rect.y },
{ cur->rect.x, cur->rect.y + cur->rect.height }
};
right = (MetaLine2) {
{ cur->rect.x + cur->rect.width, cur->rect.y },
{ cur->rect.x + cur->rect.width, cur->rect.y + cur->rect.height }
};
top = (MetaLine2) {
{ cur->rect.x, cur->rect.y },
{ cur->rect.x + cur->rect.width, cur->rect.y }
};
bottom = (MetaLine2) {
{ cur->rect.x, cur->rect.y + cur->rect.height },
{ cur->rect.x + cur->rect.width, cur->rect.y + cur->rect.height }
};
target_x = motion.b.x;
target_y = motion.b.y;
if (direction != META_DISPLAY_RIGHT &&
meta_line2_intersects_with (&motion, &left, &intersection))
direction = META_DISPLAY_LEFT;
else if (direction != META_DISPLAY_LEFT &&
meta_line2_intersects_with (&motion, &right, &intersection))
direction = META_DISPLAY_RIGHT;
else if (direction != META_DISPLAY_DOWN &&
meta_line2_intersects_with (&motion, &top, &intersection))
direction = META_DISPLAY_UP;
else if (direction != META_DISPLAY_UP &&
meta_line2_intersects_with (&motion, &bottom, &intersection))
direction = META_DISPLAY_DOWN;
else
/* We reached the dest logical monitor */
break;
x = intersection.x;
y = intersection.y;
dx -= intersection.x - motion.a.x;
dy -= intersection.y - motion.a.y;
cur = meta_monitor_manager_get_logical_monitor_neighbor (monitor_manager,
cur, direction);
}
*dx_inout = target_x - cur_x;
*dy_inout = target_y - cur_y;
}
static void
relative_motion_filter (ClutterInputDevice *device,
float x,
float y,
float *dx,
float *dy,
gpointer user_data)
{
MetaMonitorManager *monitor_manager = user_data;
MetaLogicalMonitor *logical_monitor, *dest_logical_monitor;
float new_dx, new_dy;
if (meta_is_stage_views_scaled ())
return;
logical_monitor = meta_monitor_manager_get_logical_monitor_at (monitor_manager,
x, y);
if (!logical_monitor)
return;
new_dx = (*dx) * logical_monitor->scale;
new_dy = (*dy) * logical_monitor->scale;
dest_logical_monitor = meta_monitor_manager_get_logical_monitor_at (monitor_manager,
x + new_dx,
y + new_dy);
if (dest_logical_monitor &&
dest_logical_monitor != logical_monitor)
{
/* If we are crossing monitors, attempt to bisect the distance on each
* axis and apply the relative scale for each of them.
*/
new_dx = *dx;
new_dy = *dy;
relative_motion_across_outputs (monitor_manager, logical_monitor,
x, y, &new_dx, &new_dy);
}
*dx = new_dx;
*dy = new_dy;
}
static ClutterBackend * static ClutterBackend *
meta_backend_native_create_clutter_backend (MetaBackend *backend) meta_backend_native_create_clutter_backend (MetaBackend *backend)
{ {
@@ -110,47 +339,18 @@ meta_backend_native_create_clutter_backend (MetaBackend *backend)
} }
static void static void
update_viewports (MetaBackend *backend) meta_backend_native_post_init (MetaBackend *backend)
{
MetaMonitorManager *monitor_manager =
meta_backend_get_monitor_manager (backend);
ClutterBackend *clutter_backend = meta_backend_get_clutter_backend (backend);
MetaSeatNative *seat =
META_SEAT_NATIVE (clutter_backend_get_default_seat (clutter_backend));
MetaViewportInfo *viewports;
viewports = meta_monitor_manager_get_viewports (monitor_manager);
meta_seat_native_set_viewports (seat, viewports);
g_object_unref (viewports);
}
static void
kbd_a11y_changed_cb (MetaInputSettings *input_settings,
MetaKbdA11ySettings *a11y_settings,
MetaBackend *backend)
{ {
ClutterBackend *clutter_backend = meta_backend_get_clutter_backend (backend); ClutterBackend *clutter_backend = meta_backend_get_clutter_backend (backend);
ClutterSeat *seat = clutter_backend_get_default_seat (clutter_backend); ClutterSeat *seat = clutter_backend_get_default_seat (clutter_backend);
ClutterInputDevice *device;
device = clutter_seat_get_keyboard (seat);
if (device)
meta_input_device_native_apply_kbd_a11y_settings (META_INPUT_DEVICE_NATIVE (device),
a11y_settings);
}
static void
meta_backend_native_post_init (MetaBackend *backend)
{
MetaBackendNative *native = META_BACKEND_NATIVE (backend);
MetaSettings *settings = meta_backend_get_settings (backend); MetaSettings *settings = meta_backend_get_settings (backend);
ClutterBackend *clutter_backend = meta_backend_get_clutter_backend (backend);
MetaSeatNative *seat =
META_SEAT_NATIVE (clutter_backend_get_default_seat (clutter_backend));
native->input_settings = meta_seat_impl_get_input_settings (seat->impl); meta_seat_native_set_pointer_constrain_callback (META_SEAT_NATIVE (seat),
g_signal_connect_object (native->input_settings, "kbd-a11y-changed", pointer_constrain_callback,
G_CALLBACK (kbd_a11y_changed_cb), backend, 0); NULL, NULL);
meta_seat_native_set_relative_motion_filter (META_SEAT_NATIVE (seat),
relative_motion_filter,
meta_backend_get_monitor_manager (backend));
META_BACKEND_CLASS (meta_backend_native_parent_class)->post_init (backend); META_BACKEND_CLASS (meta_backend_native_parent_class)->post_init (backend);
@@ -168,8 +368,6 @@ meta_backend_native_post_init (MetaBackend *backend)
g_warning ("Failed to set RT scheduler: %m"); g_warning ("Failed to set RT scheduler: %m");
} }
update_viewports (backend);
#ifdef HAVE_WAYLAND #ifdef HAVE_WAYLAND
meta_backend_init_wayland (backend); meta_backend_init_wayland (backend);
#endif #endif
@@ -179,26 +377,15 @@ static MetaMonitorManager *
meta_backend_native_create_monitor_manager (MetaBackend *backend, meta_backend_native_create_monitor_manager (MetaBackend *backend,
GError **error) GError **error)
{ {
MetaMonitorManager *manager; return g_initable_new (META_TYPE_MONITOR_MANAGER_KMS, NULL, error,
"backend", backend,
manager = g_initable_new (META_TYPE_MONITOR_MANAGER_KMS, NULL, error, NULL);
"backend", backend,
NULL);
g_signal_connect_swapped (manager, "monitors-changed-internal",
G_CALLBACK (update_viewports), backend);
return manager;
} }
static MetaCursorRenderer * static MetaCursorRenderer *
meta_backend_native_get_cursor_renderer (MetaBackend *backend, meta_backend_native_create_cursor_renderer (MetaBackend *backend)
ClutterInputDevice *device)
{ {
ClutterBackend *clutter_backend = meta_backend_get_clutter_backend (backend); return META_CURSOR_RENDERER (meta_cursor_renderer_native_new (backend));
MetaSeatNative *seat =
META_SEAT_NATIVE (clutter_backend_get_default_seat (clutter_backend));
return meta_seat_native_get_cursor_renderer (seat, device);
} }
static MetaRenderer * static MetaRenderer *
@@ -218,9 +405,7 @@ meta_backend_native_create_renderer (MetaBackend *backend,
static MetaInputSettings * static MetaInputSettings *
meta_backend_native_create_input_settings (MetaBackend *backend) meta_backend_native_create_input_settings (MetaBackend *backend)
{ {
MetaBackendNative *native = META_BACKEND_NATIVE (backend); return g_object_new (META_TYPE_INPUT_SETTINGS_NATIVE, NULL);
return native->input_settings;
} }
static MetaLogicalMonitor * static MetaLogicalMonitor *
@@ -229,11 +414,10 @@ meta_backend_native_get_current_logical_monitor (MetaBackend *backend)
MetaCursorTracker *cursor_tracker = meta_backend_get_cursor_tracker (backend); MetaCursorTracker *cursor_tracker = meta_backend_get_cursor_tracker (backend);
MetaMonitorManager *monitor_manager = MetaMonitorManager *monitor_manager =
meta_backend_get_monitor_manager (backend); meta_backend_get_monitor_manager (backend);
graphene_point_t point; int x, y;
meta_cursor_tracker_get_pointer (cursor_tracker, &point, NULL); meta_cursor_tracker_get_pointer (cursor_tracker, &x, &y, NULL);
return meta_monitor_manager_get_logical_monitor_at (monitor_manager, return meta_monitor_manager_get_logical_monitor_at (monitor_manager, x, y);
point.x, point.y);
} }
static void static void
@@ -243,13 +427,27 @@ meta_backend_native_set_keymap (MetaBackend *backend,
const char *options) const char *options)
{ {
ClutterBackend *clutter_backend = meta_backend_get_clutter_backend (backend); ClutterBackend *clutter_backend = meta_backend_get_clutter_backend (backend);
struct xkb_rule_names names;
struct xkb_keymap *keymap;
struct xkb_context *context;
ClutterSeat *seat; ClutterSeat *seat;
names.rules = DEFAULT_XKB_RULES_FILE;
names.model = DEFAULT_XKB_MODEL;
names.layout = layouts;
names.variant = variants;
names.options = options;
context = meta_create_xkb_context ();
keymap = xkb_keymap_new_from_names (context, &names, XKB_KEYMAP_COMPILE_NO_FLAGS);
xkb_context_unref (context);
seat = clutter_backend_get_default_seat (clutter_backend); seat = clutter_backend_get_default_seat (clutter_backend);
meta_seat_native_set_keyboard_map (META_SEAT_NATIVE (seat), meta_seat_native_set_keyboard_map (META_SEAT_NATIVE (seat), keymap);
layouts, variants, options);
meta_backend_notify_keymap_changed (backend); meta_backend_notify_keymap_changed (backend);
xkb_keymap_unref (keymap);
} }
static struct xkb_keymap * static struct xkb_keymap *
@@ -301,25 +499,6 @@ meta_backend_native_set_numlock (MetaBackend *backend,
numlock_state); numlock_state);
} }
static void
meta_backend_native_set_pointer_constraint (MetaBackend *backend,
MetaPointerConstraint *constraint)
{
ClutterBackend *clutter_backend = meta_backend_get_clutter_backend (backend);
ClutterSeat *seat = clutter_backend_get_default_seat (clutter_backend);
MetaPointerConstraintImpl *constraint_impl = NULL;
cairo_region_t *region;
if (constraint)
{
region = meta_pointer_constraint_get_region (constraint);
constraint_impl = meta_pointer_constraint_impl_native_new (constraint, region);
}
meta_seat_native_set_pointer_constraint (META_SEAT_NATIVE (seat),
constraint_impl);
}
static void static void
meta_backend_native_update_screen_size (MetaBackend *backend, meta_backend_native_update_screen_size (MetaBackend *backend,
int width, int height) int width, int height)
@@ -483,6 +662,7 @@ meta_backend_native_initable_init (GInitable *initable,
#endif #endif
native->udev = meta_udev_new (native); native->udev = meta_udev_new (native);
native->barrier_manager = meta_barrier_manager_native_new ();
native->kms = meta_kms_new (META_BACKEND (native), error); native->kms = meta_kms_new (META_BACKEND (native), error);
if (!native->kms) if (!native->kms)
@@ -515,7 +695,7 @@ meta_backend_native_class_init (MetaBackendNativeClass *klass)
backend_class->post_init = meta_backend_native_post_init; backend_class->post_init = meta_backend_native_post_init;
backend_class->create_monitor_manager = meta_backend_native_create_monitor_manager; backend_class->create_monitor_manager = meta_backend_native_create_monitor_manager;
backend_class->get_cursor_renderer = meta_backend_native_get_cursor_renderer; backend_class->create_cursor_renderer = meta_backend_native_create_cursor_renderer;
backend_class->create_renderer = meta_backend_native_create_renderer; backend_class->create_renderer = meta_backend_native_create_renderer;
backend_class->create_input_settings = meta_backend_native_create_input_settings; backend_class->create_input_settings = meta_backend_native_create_input_settings;
@@ -527,8 +707,6 @@ meta_backend_native_class_init (MetaBackendNativeClass *klass)
backend_class->lock_layout_group = meta_backend_native_lock_layout_group; backend_class->lock_layout_group = meta_backend_native_lock_layout_group;
backend_class->update_screen_size = meta_backend_native_update_screen_size; backend_class->update_screen_size = meta_backend_native_update_screen_size;
backend_class->set_numlock = meta_backend_native_set_numlock; backend_class->set_numlock = meta_backend_native_set_numlock;
backend_class->set_pointer_constraint = meta_backend_native_set_pointer_constraint;
} }
static void static void
@@ -564,6 +742,12 @@ meta_activate_vt (int vt, GError **error)
return meta_launcher_activate_vt (launcher, vt, error); return meta_launcher_activate_vt (launcher, vt, error);
} }
MetaBarrierManagerNative *
meta_backend_native_get_barrier_manager (MetaBackendNative *native)
{
return native->barrier_manager;
}
/** /**
* meta_activate_session: * meta_activate_session:
* *
@@ -625,6 +809,7 @@ void meta_backend_native_resume (MetaBackendNative *native)
meta_backend_get_monitor_manager (backend); meta_backend_get_monitor_manager (backend);
MetaMonitorManagerKms *monitor_manager_kms = MetaMonitorManagerKms *monitor_manager_kms =
META_MONITOR_MANAGER_KMS (monitor_manager); META_MONITOR_MANAGER_KMS (monitor_manager);
MetaInputSettings *input_settings;
MetaIdleMonitor *idle_monitor; MetaIdleMonitor *idle_monitor;
ClutterBackend *clutter_backend = meta_backend_get_clutter_backend (backend); ClutterBackend *clutter_backend = meta_backend_get_clutter_backend (backend);
MetaSeatNative *seat = MetaSeatNative *seat =
@@ -646,7 +831,8 @@ void meta_backend_native_resume (MetaBackendNative *native)
idle_monitor = meta_idle_monitor_get_core (); idle_monitor = meta_idle_monitor_get_core ();
meta_idle_monitor_reset_idletime (idle_monitor); meta_idle_monitor_reset_idletime (idle_monitor);
meta_input_settings_maybe_restore_numlock_state (native->input_settings); input_settings = meta_backend_get_input_settings (backend);
meta_input_settings_maybe_restore_numlock_state (input_settings);
clutter_seat_ensure_a11y_state (CLUTTER_SEAT (seat)); clutter_seat_ensure_a11y_state (CLUTTER_SEAT (seat));
} }

View File

@@ -36,14 +36,14 @@
#include "backends/meta-backend-private.h" #include "backends/meta-backend-private.h"
#include "backends/meta-barrier-private.h" #include "backends/meta-barrier-private.h"
#include "backends/native/meta-seat-native.h" #include "backends/native/meta-backend-native.h"
#include "backends/native/meta-backend-native-private.h"
#include "meta/barrier.h" #include "meta/barrier.h"
#include "meta/util.h" #include "meta/util.h"
struct _MetaBarrierManagerNative struct _MetaBarrierManagerNative
{ {
GHashTable *barriers; GHashTable *barriers;
GMutex mutex;
}; };
typedef enum typedef enum
@@ -78,7 +78,6 @@ struct _MetaBarrierImplNative
int trigger_serial; int trigger_serial;
guint32 last_event_time; guint32 last_event_time;
MetaBarrierDirection blocked_dir; MetaBarrierDirection blocked_dir;
GMainContext *context;
}; };
G_DEFINE_TYPE (MetaBarrierImplNative, G_DEFINE_TYPE (MetaBarrierImplNative,
@@ -342,48 +341,6 @@ typedef struct _MetaBarrierEventData
float dy; float dy;
} MetaBarrierEventData; } MetaBarrierEventData;
typedef struct
{
MetaBarrierEvent *event;
MetaBarrier *barrier;
MetaBarrierState state;
} MetaBarrierIdleData;
static gboolean
emit_event_idle (MetaBarrierIdleData *idle_data)
{
if (idle_data->state == META_BARRIER_STATE_HELD)
_meta_barrier_emit_hit_signal (idle_data->barrier, idle_data->event);
else
_meta_barrier_emit_left_signal (idle_data->barrier, idle_data->event);
meta_barrier_event_unref (idle_data->event);
return G_SOURCE_REMOVE;
}
static void
emit_event (MetaBarrierImplNative *self,
MetaBarrierEvent *event)
{
MetaBarrierIdleData *idle_data;
GSource *source;
idle_data = g_new0 (MetaBarrierIdleData, 1);
idle_data->state = self->state;
idle_data->barrier = self->barrier;
idle_data->event = event;
source = g_idle_source_new ();
g_source_set_priority (source, G_PRIORITY_HIGH);
g_source_set_callback (source,
(GSourceFunc) emit_event_idle,
idle_data,
g_free);
g_source_attach (source, self->context);
}
static void static void
emit_barrier_event (MetaBarrierImplNative *self, emit_barrier_event (MetaBarrierImplNative *self,
guint32 time, guint32 time,
@@ -394,6 +351,7 @@ emit_barrier_event (MetaBarrierImplNative *self,
float dx, float dx,
float dy) float dy)
{ {
MetaBarrier *barrier = self->barrier;
MetaBarrierEvent *event = g_slice_new0 (MetaBarrierEvent); MetaBarrierEvent *event = g_slice_new0 (MetaBarrierEvent);
MetaBarrierState old_state = self->state; MetaBarrierState old_state = self->state;
@@ -432,7 +390,12 @@ emit_barrier_event (MetaBarrierImplNative *self,
self->last_event_time = time; self->last_event_time = time;
emit_event (self, event); if (self->state == META_BARRIER_STATE_HELD)
_meta_barrier_emit_hit_signal (barrier, event);
else
_meta_barrier_emit_left_signal (barrier, event);
meta_barrier_event_unref (event);
} }
static void static void
@@ -517,8 +480,6 @@ meta_barrier_manager_native_process (MetaBarrierManagerNative *manager,
if (!clutter_input_device_get_coords (device, NULL, &prev_pos)) if (!clutter_input_device_get_coords (device, NULL, &prev_pos))
return; return;
g_mutex_lock (&manager->mutex);
prev_x = prev_pos.x; prev_x = prev_pos.x;
prev_y = prev_pos.y; prev_y = prev_pos.y;
@@ -563,8 +524,6 @@ meta_barrier_manager_native_process (MetaBarrierManagerNative *manager,
g_hash_table_foreach (manager->barriers, g_hash_table_foreach (manager->barriers,
maybe_emit_barrier_event, maybe_emit_barrier_event,
&barrier_event_data); &barrier_event_data);
g_mutex_unlock (&manager->mutex);
} }
static gboolean static gboolean
@@ -591,10 +550,7 @@ _meta_barrier_impl_native_destroy (MetaBarrierImpl *impl)
{ {
MetaBarrierImplNative *self = META_BARRIER_IMPL_NATIVE (impl); MetaBarrierImplNative *self = META_BARRIER_IMPL_NATIVE (impl);
g_mutex_lock (&self->manager->mutex);
g_hash_table_remove (self->manager->barriers, self); g_hash_table_remove (self->manager->barriers, self);
g_mutex_unlock (&self->manager->mutex);
g_main_context_unref (self->context);
self->is_active = FALSE; self->is_active = FALSE;
} }
@@ -602,21 +558,18 @@ MetaBarrierImpl *
meta_barrier_impl_native_new (MetaBarrier *barrier) meta_barrier_impl_native_new (MetaBarrier *barrier)
{ {
MetaBarrierImplNative *self; MetaBarrierImplNative *self;
MetaBackendNative *native;
MetaBarrierManagerNative *manager; MetaBarrierManagerNative *manager;
ClutterBackend *backend = clutter_get_default_backend ();
ClutterSeat *seat = clutter_backend_get_default_seat (backend);
self = g_object_new (META_TYPE_BARRIER_IMPL_NATIVE, NULL); self = g_object_new (META_TYPE_BARRIER_IMPL_NATIVE, NULL);
self->barrier = barrier; self->barrier = barrier;
self->is_active = TRUE; self->is_active = TRUE;
self->context = g_main_context_ref_thread_default ();
manager = meta_seat_native_get_barrier_manager (META_SEAT_NATIVE (seat)); native = META_BACKEND_NATIVE (meta_get_backend ());
manager = meta_backend_native_get_barrier_manager (native);
self->manager = manager; self->manager = manager;
g_mutex_lock (&manager->mutex);
g_hash_table_add (manager->barriers, self); g_hash_table_add (manager->barriers, self);
g_mutex_unlock (&manager->mutex);
return META_BARRIER_IMPL (self); return META_BARRIER_IMPL (self);
} }
@@ -644,7 +597,6 @@ meta_barrier_manager_native_new (void)
manager = g_new0 (MetaBarrierManagerNative, 1); manager = g_new0 (MetaBarrierManagerNative, 1);
manager->barriers = g_hash_table_new (NULL, NULL); manager->barriers = g_hash_table_new (NULL, NULL);
g_mutex_init (&manager->mutex);
return manager; return manager;
} }

View File

@@ -52,7 +52,7 @@
struct _MetaClutterBackendNative struct _MetaClutterBackendNative
{ {
ClutterBackend parent; ClutterBackendEglNative parent;
MetaSeatNative *main_seat; MetaSeatNative *main_seat;
MetaStageNative *stage_native; MetaStageNative *stage_native;
@@ -61,7 +61,7 @@ struct _MetaClutterBackendNative
static gchar *evdev_seat_id; static gchar *evdev_seat_id;
G_DEFINE_TYPE (MetaClutterBackendNative, meta_clutter_backend_native, G_DEFINE_TYPE (MetaClutterBackendNative, meta_clutter_backend_native,
CLUTTER_TYPE_BACKEND) CLUTTER_TYPE_BACKEND_EGL_NATIVE)
MetaStageNative * MetaStageNative *
meta_clutter_backend_native_get_stage_native (ClutterBackend *backend) meta_clutter_backend_native_get_stage_native (ClutterBackend *backend)
@@ -119,12 +119,6 @@ meta_clutter_backend_native_get_default_seat (ClutterBackend *backend)
return CLUTTER_SEAT (backend_native->main_seat); return CLUTTER_SEAT (backend_native->main_seat);
} }
static gboolean
meta_clutter_backend_native_is_display_server (ClutterBackend *backend)
{
return TRUE;
}
static void static void
meta_clutter_backend_native_init (MetaClutterBackendNative *clutter_backend_nativen) meta_clutter_backend_native_init (MetaClutterBackendNative *clutter_backend_nativen)
{ {
@@ -139,7 +133,6 @@ meta_clutter_backend_native_class_init (MetaClutterBackendNativeClass *klass)
clutter_backend_class->create_stage = meta_clutter_backend_native_create_stage; clutter_backend_class->create_stage = meta_clutter_backend_native_create_stage;
clutter_backend_class->init_events = meta_clutter_backend_native_init_events; clutter_backend_class->init_events = meta_clutter_backend_native_init_events;
clutter_backend_class->get_default_seat = meta_clutter_backend_native_get_default_seat; clutter_backend_class->get_default_seat = meta_clutter_backend_native_get_default_seat;
clutter_backend_class->is_display_server = meta_clutter_backend_native_is_display_server;
} }
/** /**

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