clutter/frame: Allow setting a backend release function

The one set by the native backend is empty, but it will be used later.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2855>
This commit is contained in:
Jonas Ådahl 2022-10-14 18:24:46 +02:00 committed by Robert Mader
parent 7b634df379
commit 135ed27d27
4 changed files with 22 additions and 7 deletions

View File

@ -735,7 +735,7 @@ clutter_frame_clock_dispatch (ClutterFrameClock *frame_clock,
if (iface->new_frame) if (iface->new_frame)
frame = iface->new_frame (frame_clock, frame_clock->listener.user_data); frame = iface->new_frame (frame_clock, frame_clock->listener.user_data);
if (!frame) if (!frame)
frame = clutter_frame_new (ClutterFrame); frame = clutter_frame_new (ClutterFrame, NULL);
frame->frame_count = frame_count; frame->frame_count = frame_count;
frame->has_target_presentation_time = frame_clock->is_next_presentation_time_valid; frame->has_target_presentation_time = frame_clock->is_next_presentation_time_valid;

View File

@ -20,9 +20,12 @@
#include "clutter/clutter-frame.h" #include "clutter/clutter-frame.h"
typedef void (* ClutterFrameRelease) (ClutterFrame *frame);
struct _ClutterFrame struct _ClutterFrame
{ {
grefcount ref_count; grefcount ref_count;
ClutterFrameRelease release;
int64_t frame_count; int64_t frame_count;
@ -34,10 +37,11 @@ struct _ClutterFrame
}; };
CLUTTER_EXPORT CLUTTER_EXPORT
gpointer clutter_frame_new (size_t size); gpointer clutter_frame_new (size_t size,
ClutterFrameRelease release);
#define clutter_frame_new(FrameType) \ #define clutter_frame_new(FrameType, release) \
((FrameType *) (clutter_frame_new (sizeof (FrameType)))) ((FrameType *) (clutter_frame_new (sizeof (FrameType), release)))
ClutterFrameResult clutter_frame_get_result (ClutterFrame *frame); ClutterFrameResult clutter_frame_get_result (ClutterFrame *frame);

View File

@ -32,11 +32,16 @@ void
clutter_frame_unref (ClutterFrame *frame) clutter_frame_unref (ClutterFrame *frame)
{ {
if (g_ref_count_dec (&frame->ref_count)) if (g_ref_count_dec (&frame->ref_count))
{
if (frame->release)
frame->release (frame);
g_free (frame); g_free (frame);
}
} }
gpointer gpointer
(clutter_frame_new) (size_t size) (clutter_frame_new) (size_t size,
ClutterFrameRelease release)
{ {
ClutterFrame *frame; ClutterFrame *frame;
@ -44,6 +49,7 @@ gpointer
frame = g_malloc0 (size); frame = g_malloc0 (size);
g_ref_count_init (&frame->ref_count); g_ref_count_init (&frame->ref_count);
frame->release = release;
return frame; return frame;
} }

View File

@ -28,8 +28,13 @@ struct _MetaFrameNative
ClutterFrame base; ClutterFrame base;
}; };
static void
meta_frame_native_release (ClutterFrame *frame)
{
}
MetaFrameNative * MetaFrameNative *
meta_frame_native_new (void) meta_frame_native_new (void)
{ {
return clutter_frame_new (MetaFrameNative); return clutter_frame_new (MetaFrameNative, meta_frame_native_release);
} }