Implement our own E_Buffer structure.
Signed-off-by: Chris Michael <cp.michael@samsung.com>
This commit is contained in:
parent
bf2ab8d933
commit
ba0b2a339b
|
@ -1,10 +1,34 @@
|
||||||
#include "e.h"
|
#include "e.h"
|
||||||
|
|
||||||
/* local function prototypes */
|
/* local function prototypes */
|
||||||
static void _e_buffer_cb_destroy(struct wl_listener *listener, void *data);
|
static void _e_buffer_cb_destroy(struct wl_listener *listener, void *data EINA_UNUSED);
|
||||||
|
static void _e_buffer_reference_cb_destroy(struct wl_listener *listener, void *data);
|
||||||
|
|
||||||
|
EAPI E_Buffer *
|
||||||
|
e_buffer_resource_get(struct wl_resource *resource)
|
||||||
|
{
|
||||||
|
E_Buffer *buffer;
|
||||||
|
struct wl_listener *listener;
|
||||||
|
|
||||||
|
listener = wl_resource_get_destroy_listener(resource, _e_buffer_cb_destroy);
|
||||||
|
if (listener)
|
||||||
|
buffer = container_of(listener, E_Buffer, buffer_destroy);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (!(buffer = E_NEW_RAW(E_Buffer, 1)))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
buffer->wl.resource = resource;
|
||||||
|
wl_signal_init(&buffer->signals.destroy);
|
||||||
|
buffer->buffer_destroy.notify = _e_buffer_cb_destroy;
|
||||||
|
wl_resource_add_destroy_listener(resource, &buffer->buffer_destroy);
|
||||||
|
}
|
||||||
|
|
||||||
|
return buffer;
|
||||||
|
}
|
||||||
|
|
||||||
EAPI void
|
EAPI void
|
||||||
e_buffer_reference(E_Buffer_Reference *br, struct wl_buffer *buffer)
|
e_buffer_reference(E_Buffer_Reference *br, E_Buffer *buffer)
|
||||||
{
|
{
|
||||||
/* check for valid buffer reference */
|
/* check for valid buffer reference */
|
||||||
if (!br) return;
|
if (!br) return;
|
||||||
|
@ -17,7 +41,7 @@ e_buffer_reference(E_Buffer_Reference *br, struct wl_buffer *buffer)
|
||||||
if (br->buffer->busy_count == 0)
|
if (br->buffer->busy_count == 0)
|
||||||
{
|
{
|
||||||
/* queue a release event */
|
/* queue a release event */
|
||||||
wl_resource_queue_event(&br->buffer->resource,
|
wl_resource_queue_event(br->buffer->wl.resource,
|
||||||
WL_BUFFER_RELEASE);
|
WL_BUFFER_RELEASE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -31,25 +55,37 @@ e_buffer_reference(E_Buffer_Reference *br, struct wl_buffer *buffer)
|
||||||
buffer->busy_count++;
|
buffer->busy_count++;
|
||||||
|
|
||||||
/* setup destroy listener */
|
/* setup destroy listener */
|
||||||
wl_signal_add(&buffer->resource.destroy_signal, &br->buffer_destroy);
|
wl_signal_add(&buffer->signals.destroy, &br->buffer_destroy);
|
||||||
}
|
}
|
||||||
|
|
||||||
br->buffer = buffer;
|
br->buffer = buffer;
|
||||||
br->buffer_destroy.notify = _e_buffer_cb_destroy;
|
br->buffer_destroy.notify = _e_buffer_reference_cb_destroy;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* local functions */
|
/* local functions */
|
||||||
static void
|
static void
|
||||||
_e_buffer_cb_destroy(struct wl_listener *listener, void *data)
|
_e_buffer_cb_destroy(struct wl_listener *listener, void *data EINA_UNUSED)
|
||||||
|
{
|
||||||
|
E_Buffer *buffer;
|
||||||
|
|
||||||
|
/* try to get the buffer_reference structure from the listener */
|
||||||
|
if (!(buffer = container_of(listener, E_Buffer, buffer_destroy)))
|
||||||
|
return;
|
||||||
|
|
||||||
|
wl_signal_emit(&buffer->signals.destroy, buffer);
|
||||||
|
|
||||||
|
E_FREE(buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_e_buffer_reference_cb_destroy(struct wl_listener *listener, void *data)
|
||||||
{
|
{
|
||||||
E_Buffer_Reference *br;
|
E_Buffer_Reference *br;
|
||||||
|
|
||||||
/* try to get the buffer_reference structure from the listener */
|
|
||||||
if (!(br = container_of(listener, E_Buffer_Reference, buffer_destroy)))
|
if (!(br = container_of(listener, E_Buffer_Reference, buffer_destroy)))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* if this buffer is not equal to the one referenced, then get out */
|
if ((E_Buffer *)data != br->buffer) return;
|
||||||
if ((struct wl_buffer *)data != br->buffer) return;
|
|
||||||
|
|
||||||
br->buffer = NULL;
|
br->buffer = NULL;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,18 +1,44 @@
|
||||||
#ifdef E_TYPEDEFS
|
#ifdef E_TYPEDEFS
|
||||||
|
|
||||||
|
typedef struct _E_Buffer E_Buffer;
|
||||||
typedef struct _E_Buffer_Reference E_Buffer_Reference;
|
typedef struct _E_Buffer_Reference E_Buffer_Reference;
|
||||||
|
|
||||||
#else
|
#else
|
||||||
# ifndef E_BUFFER_H
|
# ifndef E_BUFFER_H
|
||||||
# define E_BUFFER_H
|
# define E_BUFFER_H
|
||||||
|
|
||||||
|
struct _E_Buffer
|
||||||
|
{
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
struct wl_resource *resource;
|
||||||
|
} wl;
|
||||||
|
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
struct wl_signal destroy;
|
||||||
|
} signals;
|
||||||
|
|
||||||
|
struct wl_listener buffer_destroy;
|
||||||
|
|
||||||
|
union
|
||||||
|
{
|
||||||
|
struct wl_shm_buffer *shm_buffer;
|
||||||
|
struct wl_buffer *legacy_buffer;
|
||||||
|
};
|
||||||
|
|
||||||
|
Evas_Coord w, h;
|
||||||
|
unsigned int busy_count;
|
||||||
|
};
|
||||||
|
|
||||||
struct _E_Buffer_Reference
|
struct _E_Buffer_Reference
|
||||||
{
|
{
|
||||||
struct wl_buffer *buffer;
|
E_Buffer *buffer;
|
||||||
struct wl_listener buffer_destroy;
|
struct wl_listener buffer_destroy;
|
||||||
};
|
};
|
||||||
|
|
||||||
EAPI void e_buffer_reference(E_Buffer_Reference *br, struct wl_buffer *buffer);
|
EAPI E_Buffer *e_buffer_resource_get(struct wl_resource *resource);
|
||||||
|
EAPI void e_buffer_reference(E_Buffer_Reference *br, E_Buffer *buffer);
|
||||||
|
|
||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue