clutter: Do not special case allocated events

All events should be allocated, stack allocation is avoided and should
be avoided in the future, probably by making ClutterEvent structs opaque.

https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1475
This commit is contained in:
Carlos Garnacho 2020-09-24 17:25:21 +02:00
parent a3c95f6023
commit 0cab71ea52

View File

@ -73,8 +73,6 @@ typedef struct _ClutterEventFilter {
gpointer user_data; gpointer user_data;
} ClutterEventFilter; } ClutterEventFilter;
static GHashTable *all_events = NULL;
G_DEFINE_BOXED_TYPE (ClutterEvent, clutter_event, G_DEFINE_BOXED_TYPE (ClutterEvent, clutter_event,
clutter_event_copy, clutter_event_copy,
clutter_event_free); clutter_event_free);
@ -96,15 +94,6 @@ G_DEFINE_BOXED_TYPE (ClutterEventSequence, clutter_event_sequence,
clutter_event_sequence_copy, clutter_event_sequence_copy,
clutter_event_sequence_free); clutter_event_sequence_free);
static gboolean
is_event_allocated (const ClutterEvent *event)
{
if (all_events == NULL)
return FALSE;
return g_hash_table_lookup (all_events, event) != NULL;
}
/* /*
* _clutter_event_get_platform_data: * _clutter_event_get_platform_data:
* @event: a #ClutterEvent * @event: a #ClutterEvent
@ -118,9 +107,6 @@ is_event_allocated (const ClutterEvent *event)
gpointer gpointer
_clutter_event_get_platform_data (const ClutterEvent *event) _clutter_event_get_platform_data (const ClutterEvent *event)
{ {
if (!is_event_allocated (event))
return NULL;
return ((ClutterEventPrivate *) event)->platform_data; return ((ClutterEventPrivate *) event)->platform_data;
} }
@ -137,9 +123,6 @@ void
_clutter_event_set_platform_data (ClutterEvent *event, _clutter_event_set_platform_data (ClutterEvent *event,
gpointer data) gpointer data)
{ {
if (!is_event_allocated (event))
return;
((ClutterEventPrivate *) event)->platform_data = data; ((ClutterEventPrivate *) event)->platform_data = data;
} }
@ -147,9 +130,6 @@ void
_clutter_event_set_pointer_emulated (ClutterEvent *event, _clutter_event_set_pointer_emulated (ClutterEvent *event,
gboolean is_emulated) gboolean is_emulated)
{ {
if (!is_event_allocated (event))
return;
((ClutterEventPrivate *) event)->is_pointer_emulated = !!is_emulated; ((ClutterEventPrivate *) event)->is_pointer_emulated = !!is_emulated;
} }
@ -723,9 +703,6 @@ clutter_event_set_scroll_delta (ClutterEvent *event,
g_return_if_fail (event != NULL); g_return_if_fail (event != NULL);
g_return_if_fail (event->type == CLUTTER_SCROLL); g_return_if_fail (event->type == CLUTTER_SCROLL);
if (!is_event_allocated (event))
return;
event->scroll.direction = CLUTTER_SCROLL_SMOOTH; event->scroll.direction = CLUTTER_SCROLL_SMOOTH;
((ClutterEventPrivate *) event)->delta_x = dx; ((ClutterEventPrivate *) event)->delta_x = dx;
@ -756,13 +733,8 @@ clutter_event_get_scroll_delta (const ClutterEvent *event,
g_return_if_fail (event->type == CLUTTER_SCROLL); g_return_if_fail (event->type == CLUTTER_SCROLL);
g_return_if_fail (event->scroll.direction == CLUTTER_SCROLL_SMOOTH); g_return_if_fail (event->scroll.direction == CLUTTER_SCROLL_SMOOTH);
delta_x = delta_y = 0;
if (is_event_allocated (event))
{
delta_x = ((ClutterEventPrivate *) event)->delta_x; delta_x = ((ClutterEventPrivate *) event)->delta_x;
delta_y = ((ClutterEventPrivate *) event)->delta_y; delta_y = ((ClutterEventPrivate *) event)->delta_y;
}
if (dx != NULL) if (dx != NULL)
*dx = delta_x; *dx = delta_x;
@ -1097,15 +1069,12 @@ void
clutter_event_set_device (ClutterEvent *event, clutter_event_set_device (ClutterEvent *event,
ClutterInputDevice *device) ClutterInputDevice *device)
{ {
ClutterEventPrivate *real_event = (ClutterEventPrivate *) event;
g_return_if_fail (event != NULL); g_return_if_fail (event != NULL);
g_return_if_fail (device == NULL || CLUTTER_IS_INPUT_DEVICE (device)); g_return_if_fail (device == NULL || CLUTTER_IS_INPUT_DEVICE (device));
if (is_event_allocated (event))
{
ClutterEventPrivate *real_event = (ClutterEventPrivate *) event;
g_set_object (&real_event->device, device); g_set_object (&real_event->device, device);
}
switch (event->type) switch (event->type)
{ {
@ -1200,16 +1169,12 @@ ClutterInputDevice *
clutter_event_get_device (const ClutterEvent *event) clutter_event_get_device (const ClutterEvent *event)
{ {
ClutterInputDevice *device = NULL; ClutterInputDevice *device = NULL;
ClutterEventPrivate *real_event = (ClutterEventPrivate *) event;
g_return_val_if_fail (event != NULL, NULL); g_return_val_if_fail (event != NULL, NULL);
if (is_event_allocated (event))
{
ClutterEventPrivate *real_event = (ClutterEventPrivate *) event;
if (real_event->device != NULL) if (real_event->device != NULL)
return real_event->device; return real_event->device;
}
switch (event->type) switch (event->type)
{ {
@ -1297,16 +1262,13 @@ clutter_event_get_device (const ClutterEvent *event)
void void
clutter_event_set_device_tool (ClutterEvent *event, clutter_event_set_device_tool (ClutterEvent *event,
ClutterInputDeviceTool *tool) ClutterInputDeviceTool *tool)
{
g_return_if_fail (event != NULL);
if (is_event_allocated (event))
{ {
ClutterEventPrivate *real_event = (ClutterEventPrivate *) event; ClutterEventPrivate *real_event = (ClutterEventPrivate *) event;
g_return_if_fail (event != NULL);
real_event->tool = tool; real_event->tool = tool;
} }
}
/** /**
* clutter_event_get_device_tool: * clutter_event_get_device_tool:
@ -1320,17 +1282,12 @@ clutter_event_set_device_tool (ClutterEvent *event,
**/ **/
ClutterInputDeviceTool * ClutterInputDeviceTool *
clutter_event_get_device_tool (const ClutterEvent *event) clutter_event_get_device_tool (const ClutterEvent *event)
{
g_return_val_if_fail (event != NULL, NULL);
if (is_event_allocated (event))
{ {
ClutterEventPrivate *real_event = (ClutterEventPrivate *) event; ClutterEventPrivate *real_event = (ClutterEventPrivate *) event;
return real_event->tool; g_return_val_if_fail (event != NULL, NULL);
}
return NULL; return real_event->tool;
} }
/** /**
@ -1352,11 +1309,6 @@ clutter_event_new (ClutterEventType type)
new_event = (ClutterEvent *) priv; new_event = (ClutterEvent *) priv;
new_event->type = new_event->any.type = type; new_event->type = new_event->any.type = type;
if (G_UNLIKELY (all_events == NULL))
all_events = g_hash_table_new (NULL, NULL);
g_hash_table_replace (all_events, priv, GUINT_TO_POINTER (1));
return new_event; return new_event;
} }
@ -1374,6 +1326,7 @@ clutter_event_copy (const ClutterEvent *event)
ClutterEvent *new_event; ClutterEvent *new_event;
ClutterEventPrivate *new_real_event; ClutterEventPrivate *new_real_event;
ClutterInputDevice *device; ClutterInputDevice *device;
ClutterEventPrivate *real_event = (ClutterEventPrivate *) event;
gint n_axes = 0; gint n_axes = 0;
g_return_val_if_fail (event != NULL, NULL); g_return_val_if_fail (event != NULL, NULL);
@ -1383,10 +1336,6 @@ clutter_event_copy (const ClutterEvent *event)
*new_event = *event; *new_event = *event;
if (is_event_allocated (event))
{
ClutterEventPrivate *real_event = (ClutterEventPrivate *) event;
g_set_object (&new_real_event->device, real_event->device); g_set_object (&new_real_event->device, real_event->device);
g_set_object (&new_real_event->source_device, real_event->source_device); g_set_object (&new_real_event->source_device, real_event->source_device);
new_real_event->delta_x = real_event->delta_x; new_real_event->delta_x = real_event->delta_x;
@ -1397,7 +1346,6 @@ clutter_event_copy (const ClutterEvent *event)
new_real_event->latched_state = real_event->latched_state; new_real_event->latched_state = real_event->latched_state;
new_real_event->locked_state = real_event->locked_state; new_real_event->locked_state = real_event->locked_state;
new_real_event->tool = real_event->tool; new_real_event->tool = real_event->tool;
}
device = clutter_event_get_device (event); device = clutter_event_get_device (event);
if (device != NULL) if (device != NULL)
@ -1446,7 +1394,6 @@ clutter_event_copy (const ClutterEvent *event)
break; break;
} }
if (is_event_allocated (event))
_clutter_backend_copy_event_data (clutter_get_default_backend (), _clutter_backend_copy_event_data (clutter_get_default_backend (),
event, event,
new_event); new_event);
@ -1464,16 +1411,13 @@ void
clutter_event_free (ClutterEvent *event) clutter_event_free (ClutterEvent *event)
{ {
if (G_LIKELY (event != NULL)) if (G_LIKELY (event != NULL))
{
_clutter_backend_free_event_data (clutter_get_default_backend (), event);
if (is_event_allocated (event))
{ {
ClutterEventPrivate *real_event = (ClutterEventPrivate *) event; ClutterEventPrivate *real_event = (ClutterEventPrivate *) event;
_clutter_backend_free_event_data (clutter_get_default_backend (), event);
g_clear_object (&real_event->device); g_clear_object (&real_event->device);
g_clear_object (&real_event->source_device); g_clear_object (&real_event->source_device);
}
switch (event->type) switch (event->type)
{ {
@ -1506,7 +1450,6 @@ clutter_event_free (ClutterEvent *event)
break; break;
} }
g_hash_table_remove (all_events, event);
g_slice_free (ClutterEventPrivate, (ClutterEventPrivate *) event); g_slice_free (ClutterEventPrivate, (ClutterEventPrivate *) event);
} }
} }
@ -1673,9 +1616,6 @@ clutter_event_get_source_device (const ClutterEvent *event)
{ {
ClutterEventPrivate *real_event; ClutterEventPrivate *real_event;
if (!is_event_allocated (event))
return NULL;
real_event = (ClutterEventPrivate *) event; real_event = (ClutterEventPrivate *) event;
if (real_event->source_device != NULL) if (real_event->source_device != NULL)
@ -1704,9 +1644,6 @@ clutter_event_set_source_device (ClutterEvent *event,
g_return_if_fail (event != NULL); g_return_if_fail (event != NULL);
g_return_if_fail (device == NULL || CLUTTER_IS_INPUT_DEVICE (device)); g_return_if_fail (device == NULL || CLUTTER_IS_INPUT_DEVICE (device));
if (!is_event_allocated (event))
return;
real_event = (ClutterEventPrivate *) event; real_event = (ClutterEventPrivate *) event;
g_set_object (&real_event->source_device, device); g_set_object (&real_event->source_device, device);
} }
@ -1909,9 +1846,6 @@ clutter_event_is_pointer_emulated (const ClutterEvent *event)
{ {
g_return_val_if_fail (event != NULL, FALSE); g_return_val_if_fail (event != NULL, FALSE);
if (!is_event_allocated (event))
return FALSE;
return ((ClutterEventPrivate *) event)->is_pointer_emulated; return ((ClutterEventPrivate *) event)->is_pointer_emulated;
} }