Add e_buffer files.

Signed-off-by: Chris Michael <devilhorns@comcast.net>
This commit is contained in:
Chris Michael 2013-05-06 13:24:22 +01:00
parent 17d28fedca
commit d8ab66b113
2 changed files with 73 additions and 0 deletions

View File

@ -0,0 +1,55 @@
#include "e.h"
/* local function prototypes */
static void _e_buffer_cb_destroy(struct wl_listener *listener, void *data);
EAPI void
e_buffer_reference(E_Buffer_Reference *br, struct wl_buffer *buffer)
{
/* check for valid buffer reference */
if (!br) return;
/* check if the new buffer is difference than the one we already have
* referenced */
if ((br->buffer) && (br->buffer != buffer))
{
br->buffer->busy_count--;
if (br->buffer->busy_count == 0)
{
/* queue a release event */
wl_resource_queue_event(&br->buffer->resource,
WL_BUFFER_RELEASE);
}
/* remove any existing destroy listener */
wl_list_remove(&br->buffer_destroy.link);
}
/* if we have a valid buffer, reference it */
if ((buffer) && (br->buffer != buffer))
{
buffer->busy_count++;
/* setup destroy listener */
wl_signal_add(&buffer->resource.destroy_signal, &br->buffer_destroy);
}
br->buffer = buffer;
br->buffer_destroy.notify = _e_buffer_cb_destroy;
}
/* local functions */
static void
_e_buffer_cb_destroy(struct wl_listener *listener, void *data)
{
E_Buffer_Reference *br;
/* try to get the buffer_reference structure from the listener */
if (!(br = container_of(listener, E_Buffer_Reference, buffer_destroy)))
return;
/* if this buffer is not equal to the one referenced, then get out */
if ((struct wl_buffer *)data != br->buffer) return;
br->buffer = NULL;
}

View File

@ -0,0 +1,18 @@
#ifdef E_TYPEDEFS
typedef struct _E_Buffer_Reference E_Buffer_Reference;
#else
# ifndef E_BUFFER_H
# define E_BUFFER_H
struct _E_Buffer_Reference
{
struct wl_buffer *buffer;
struct wl_listener buffer_destroy;
};
EAPI void e_buffer_reference(E_Buffer_Reference *br, struct wl_buffer *buffer);
# endif
#endif