#include <stdlib.h>
#include <string.h>
#include <memory.h>
+#include <errno.h>
#include <pthread.h>
#include <signal.h>
#include <stdbool.h>
#include <unistd.h>
#include <poll.h>
+#include <sys/eventfd.h>
+
#include "ilm_common.h"
#include "ilm_control_platform.h"
#include "wayland-util.h"
#include "ivi-controller-client-protocol.h"
-static ilmErrorTypes wayland_getPropertiesOfLayer(t_ilm_uint layerID,
- struct ilmLayerProperties* pLayerProperties);
-static ilmErrorTypes wayland_getPropertiesOfScreen(t_ilm_display screenID,
- struct ilmScreenProperties* pScreenProperties);
-static ilmErrorTypes wayland_getNumberOfHardwareLayers(t_ilm_uint screenID,
- t_ilm_uint* pNumberOfHardwareLayers);
-static ilmErrorTypes wayland_getScreenIDs(t_ilm_uint* pNumberOfIDs,
- t_ilm_uint** ppIDs);
-static ilmErrorTypes wayland_getLayerIDs(t_ilm_int* pLength,
- t_ilm_layer** ppArray);
-static ilmErrorTypes wayland_getLayerIDsOnScreen(t_ilm_uint screenId,
- t_ilm_int* pLength, t_ilm_layer** ppArray);
-static ilmErrorTypes wayland_getSurfaceIDs(t_ilm_int* pLength,
- t_ilm_surface** ppArray);
-static ilmErrorTypes wayland_getSurfaceIDsOnLayer(t_ilm_layer layer,
- t_ilm_int* pLength, t_ilm_surface** ppArray);
-static ilmErrorTypes wayland_layerCreateWithDimension(t_ilm_layer* pLayerId,
- t_ilm_uint width, t_ilm_uint height);
-static ilmErrorTypes wayland_layerRemove(t_ilm_layer layerId);
-static ilmErrorTypes wayland_layerGetType(t_ilm_layer layerId,
- ilmLayerType* pLayerType);
-static ilmErrorTypes wayland_layerSetVisibility(t_ilm_layer layerId,
- t_ilm_bool newVisibility);
-static ilmErrorTypes wayland_layerGetVisibility(t_ilm_layer layerId,
- t_ilm_bool *pVisibility);
-static ilmErrorTypes wayland_layerSetOpacity(t_ilm_layer layerId,
- t_ilm_float opacity);
-static ilmErrorTypes wayland_layerGetOpacity(t_ilm_layer layerId,
- t_ilm_float *pOpacity);
-static ilmErrorTypes wayland_layerSetSourceRectangle(t_ilm_layer layerId,
- t_ilm_uint x, t_ilm_uint y,
- t_ilm_uint width, t_ilm_uint height);
-static ilmErrorTypes wayland_layerSetDestinationRectangle(t_ilm_layer layerId,
- t_ilm_int x, t_ilm_int y,
- t_ilm_int width, t_ilm_int height);
-static ilmErrorTypes wayland_layerGetDimension(t_ilm_layer layerId,
- t_ilm_uint *pDimension);
-static ilmErrorTypes wayland_layerSetDimension(t_ilm_layer layerId,
- t_ilm_uint *pDimension);
-static ilmErrorTypes wayland_layerGetPosition(t_ilm_layer layerId,
- t_ilm_uint *pPosition);
-static ilmErrorTypes wayland_layerSetPosition(t_ilm_layer layerId,
- t_ilm_uint *pPosition);
-static ilmErrorTypes wayland_layerSetOrientation(t_ilm_layer layerId,
- ilmOrientation orientation);
-static ilmErrorTypes wayland_layerGetOrientation(t_ilm_layer layerId,
- ilmOrientation *pOrientation);
-static ilmErrorTypes wayland_layerSetChromaKey(t_ilm_layer layerId,
- t_ilm_int* pColor);
-static ilmErrorTypes wayland_layerSetRenderOrder(t_ilm_layer layerId,
- t_ilm_layer *pSurfaceId,
- t_ilm_int number);
-static ilmErrorTypes wayland_layerGetCapabilities(t_ilm_layer layerId,
- t_ilm_layercapabilities *pCapabilities);
-static ilmErrorTypes wayland_layerTypeGetCapabilities(ilmLayerType layerType,
- t_ilm_layercapabilities *pCapabilities);
-static ilmErrorTypes wayland_surfaceSetVisibility(t_ilm_surface surfaceId,
- t_ilm_bool newVisibility);
-static ilmErrorTypes wayland_surfaceSetOpacity(t_ilm_surface surfaceId,
- t_ilm_float opacity);
-static ilmErrorTypes wayland_surfaceGetOpacity(t_ilm_surface surfaceId,
- t_ilm_float *pOpacity);
-static ilmErrorTypes wayland_SetKeyboardFocusOn(t_ilm_surface surfaceId);
-static ilmErrorTypes wayland_GetKeyboardFocusSurfaceId(
- t_ilm_surface* pSurfaceId);
-static ilmErrorTypes wayland_surfaceSetDestinationRectangle(
- t_ilm_surface surfaceId,
- t_ilm_int x, t_ilm_int y,
- t_ilm_int width, t_ilm_int height);
-static ilmErrorTypes wayland_surfaceSetDimension(t_ilm_surface surfaceId,
- t_ilm_uint *pDimension);
-static ilmErrorTypes wayland_surfaceGetPosition(t_ilm_surface surfaceId,
- t_ilm_uint *pPosition);
-static ilmErrorTypes wayland_surfaceSetPosition(t_ilm_surface surfaceId,
- t_ilm_uint *pPosition);
-static ilmErrorTypes wayland_surfaceSetOrientation(t_ilm_surface surfaceId,
- ilmOrientation orientation);
-static ilmErrorTypes wayland_surfaceGetOrientation(t_ilm_surface surfaceId,
- ilmOrientation *pOrientation);
-static ilmErrorTypes wayland_surfaceGetPixelformat(t_ilm_layer surfaceId,
- ilmPixelFormat *pPixelformat);
-static ilmErrorTypes wayland_surfaceSetChromaKey(t_ilm_surface surfaceId,
- t_ilm_int* pColor);
-static ilmErrorTypes wayland_displaySetRenderOrder(t_ilm_display display,
- t_ilm_layer *pLayerId, const t_ilm_uint number);
-static ilmErrorTypes wayland_takeScreenshot(t_ilm_uint screen,
- t_ilm_const_string filename);
-static ilmErrorTypes wayland_takeLayerScreenshot(t_ilm_const_string filename,
- t_ilm_layer layerid);
-static ilmErrorTypes wayland_takeSurfaceScreenshot(t_ilm_const_string filename,
- t_ilm_surface surfaceid);
-static ilmErrorTypes wayland_SetOptimizationMode(ilmOptimization id,
- ilmOptimizationMode mode);
-static ilmErrorTypes wayland_GetOptimizationMode(ilmOptimization id,
- ilmOptimizationMode* pMode);
-static ilmErrorTypes wayland_layerAddNotification(t_ilm_layer layer,
- layerNotificationFunc callback);
-static ilmErrorTypes wayland_layerRemoveNotification(t_ilm_layer layer);
-static ilmErrorTypes wayland_surfaceAddNotification(t_ilm_surface surface,
- surfaceNotificationFunc callback);
-static ilmErrorTypes wayland_surfaceRemoveNotification(t_ilm_surface surface);
-static ilmErrorTypes wayland_init(t_ilm_nativedisplay nativedisplay);
-static void wayland_destroy(void);
-static ilmErrorTypes wayland_getNativeHandle(t_ilm_uint pid,
- t_ilm_int *n_handle,
- t_ilm_nativehandle **p_handles);
-static ilmErrorTypes wayland_getPropertiesOfSurface(t_ilm_uint surfaceID,
- struct ilmSurfaceProperties* pSurfaceProperties);
-static ilmErrorTypes wayland_layerAddSurface(t_ilm_layer layerId,
- t_ilm_surface surfaceId);
-static ilmErrorTypes wayland_layerRemoveSurface(t_ilm_layer layerId,
- t_ilm_surface surfaceId);
-static ilmErrorTypes wayland_surfaceGetDimension(t_ilm_surface surfaceId,
- t_ilm_uint *pDimension);
-static ilmErrorTypes wayland_surfaceGetVisibility(t_ilm_surface surfaceId,
- t_ilm_bool *pVisibility);
-static ilmErrorTypes wayland_surfaceSetSourceRectangle(t_ilm_surface surfaceId,
- t_ilm_int x, t_ilm_int y,
- t_ilm_int width, t_ilm_int height);
-static ilmErrorTypes wayland_commitChanges(void);
-
-void init_ilmControlPlatformTable(void)
-{
- gIlmControlPlatformFunc.getPropertiesOfLayer =
- wayland_getPropertiesOfLayer;
- gIlmControlPlatformFunc.getPropertiesOfScreen =
- wayland_getPropertiesOfScreen;
- gIlmControlPlatformFunc.getNumberOfHardwareLayers =
- wayland_getNumberOfHardwareLayers;
- gIlmControlPlatformFunc.getScreenIDs =
- wayland_getScreenIDs;
- gIlmControlPlatformFunc.getLayerIDs =
- wayland_getLayerIDs;
- gIlmControlPlatformFunc.getLayerIDsOnScreen =
- wayland_getLayerIDsOnScreen;
- gIlmControlPlatformFunc.getSurfaceIDs =
- wayland_getSurfaceIDs;
- gIlmControlPlatformFunc.getSurfaceIDsOnLayer =
- wayland_getSurfaceIDsOnLayer;
- gIlmControlPlatformFunc.layerCreateWithDimension =
- wayland_layerCreateWithDimension;
- gIlmControlPlatformFunc.layerRemove =
- wayland_layerRemove;
- gIlmControlPlatformFunc.layerGetType =
- wayland_layerGetType;
- gIlmControlPlatformFunc.layerSetVisibility =
- wayland_layerSetVisibility;
- gIlmControlPlatformFunc.layerGetVisibility =
- wayland_layerGetVisibility;
- gIlmControlPlatformFunc.layerSetOpacity =
- wayland_layerSetOpacity;
- gIlmControlPlatformFunc.layerGetOpacity =
- wayland_layerGetOpacity;
- gIlmControlPlatformFunc.layerSetSourceRectangle =
- wayland_layerSetSourceRectangle;
- gIlmControlPlatformFunc.layerSetDestinationRectangle =
- wayland_layerSetDestinationRectangle;
- gIlmControlPlatformFunc.layerGetDimension =
- wayland_layerGetDimension;
- gIlmControlPlatformFunc.layerSetDimension =
- wayland_layerSetDimension;
- gIlmControlPlatformFunc.layerGetPosition =
- wayland_layerGetPosition;
- gIlmControlPlatformFunc.layerSetPosition =
- wayland_layerSetPosition;
- gIlmControlPlatformFunc.layerSetOrientation =
- wayland_layerSetOrientation;
- gIlmControlPlatformFunc.layerGetOrientation =
- wayland_layerGetOrientation;
- gIlmControlPlatformFunc.layerSetChromaKey =
- wayland_layerSetChromaKey;
- gIlmControlPlatformFunc.layerSetRenderOrder =
- wayland_layerSetRenderOrder;
- gIlmControlPlatformFunc.layerGetCapabilities =
- wayland_layerGetCapabilities;
- gIlmControlPlatformFunc.layerTypeGetCapabilities =
- wayland_layerTypeGetCapabilities;
- gIlmControlPlatformFunc.surfaceSetVisibility =
- wayland_surfaceSetVisibility;
- gIlmControlPlatformFunc.surfaceSetOpacity =
- wayland_surfaceSetOpacity;
- gIlmControlPlatformFunc.surfaceGetOpacity =
- wayland_surfaceGetOpacity;
- gIlmControlPlatformFunc.SetKeyboardFocusOn =
- wayland_SetKeyboardFocusOn;
- gIlmControlPlatformFunc.GetKeyboardFocusSurfaceId =
- wayland_GetKeyboardFocusSurfaceId;
- gIlmControlPlatformFunc.surfaceSetDestinationRectangle =
- wayland_surfaceSetDestinationRectangle;
- gIlmControlPlatformFunc.surfaceSetDimension =
- wayland_surfaceSetDimension;
- gIlmControlPlatformFunc.surfaceGetPosition =
- wayland_surfaceGetPosition;
- gIlmControlPlatformFunc.surfaceSetPosition =
- wayland_surfaceSetPosition;
- gIlmControlPlatformFunc.surfaceSetOrientation =
- wayland_surfaceSetOrientation;
- gIlmControlPlatformFunc.surfaceGetOrientation =
- wayland_surfaceGetOrientation;
- gIlmControlPlatformFunc.surfaceGetPixelformat =
- wayland_surfaceGetPixelformat;
- gIlmControlPlatformFunc.surfaceSetChromaKey =
- wayland_surfaceSetChromaKey;
- gIlmControlPlatformFunc.displaySetRenderOrder =
- wayland_displaySetRenderOrder;
- gIlmControlPlatformFunc.takeScreenshot =
- wayland_takeScreenshot;
- gIlmControlPlatformFunc.takeLayerScreenshot =
- wayland_takeLayerScreenshot;
- gIlmControlPlatformFunc.takeSurfaceScreenshot =
- wayland_takeSurfaceScreenshot;
- gIlmControlPlatformFunc.SetOptimizationMode =
- wayland_SetOptimizationMode;
- gIlmControlPlatformFunc.GetOptimizationMode =
- wayland_GetOptimizationMode;
- gIlmControlPlatformFunc.layerAddNotification =
- wayland_layerAddNotification;
- gIlmControlPlatformFunc.layerRemoveNotification =
- wayland_layerRemoveNotification;
- gIlmControlPlatformFunc.surfaceAddNotification =
- wayland_surfaceAddNotification;
- gIlmControlPlatformFunc.surfaceRemoveNotification =
- wayland_surfaceRemoveNotification;
- gIlmControlPlatformFunc.init =
- wayland_init;
- gIlmControlPlatformFunc.destroy =
- wayland_destroy;
- gIlmControlPlatformFunc.getNativeHandle =
- wayland_getNativeHandle;
- gIlmControlPlatformFunc.getPropertiesOfSurface =
- wayland_getPropertiesOfSurface;
- gIlmControlPlatformFunc.layerAddSurface =
- wayland_layerAddSurface;
- gIlmControlPlatformFunc.layerRemoveSurface =
- wayland_layerRemoveSurface;
- gIlmControlPlatformFunc.surfaceGetDimension =
- wayland_surfaceGetDimension;
- gIlmControlPlatformFunc.surfaceGetVisibility =
- wayland_surfaceGetVisibility;
- gIlmControlPlatformFunc.surfaceSetSourceRectangle =
- wayland_surfaceSetSourceRectangle;
- gIlmControlPlatformFunc.commitChanges =
- wayland_commitChanges;
-}
+/* GCC visibility */
+#if defined(__GNUC__) && __GNUC__ >= 4
+#define ILM_EXPORT __attribute__ ((visibility("default")))
+#else
+#define ILM_EXPORT
+#endif
struct surface_context {
struct wl_list link;
} order;
struct wayland_context *ctx;
+ bool is_surface_creation_noticed;
};
struct layer_context {
pthread_t thread;
pthread_mutex_t mutex;
+ int shutdown_fd;
uint32_t internal_id_surface;
};
static int init_control(void);
static struct ilm_control_context* sync_and_acquire_instance(void);
+static struct surface_context* get_surface_context(struct wayland_context *, uint32_t);
static void release_instance(void);
{
struct surface_context *ctx_surf = data;
+ if (ctx_surf->notification != NULL) {
+ ctx_surf->notification(ctx_surf->id_surface,
+ &ctx_surf->prop,
+ ILM_NOTIFICATION_CONTENT_REMOVED);
+ }
+
wl_list_remove(&ctx_surf->link);
free(ctx_surf);
}
struct ivi_controller_surface *controller,
int32_t content_state)
{
+ struct surface_context *ctx_surf = data;
+
// if client surface (=content) was removed with ilm_surfaceDestroy()
// the expected behavior within ILM API mandates a full removal
// of the surface from the scene. We must remove the controller
// from scene, too.
if (IVI_CONTROLLER_SURFACE_CONTENT_STATE_CONTENT_REMOVED == content_state)
{
- struct surface_context *ctx_surf = data;
+ if (ctx_surf->notification != NULL) {
+ ctx_surf->notification(ctx_surf->id_surface,
+ &ctx_surf->prop,
+ ILM_NOTIFICATION_CONTENT_REMOVED);
+ }
ivi_controller_surface_destroy(controller, 1);
wl_list_remove(&ctx_surf->link);
free(ctx_surf);
}
+ else if (IVI_CONTROLLER_SURFACE_CONTENT_STATE_CONTENT_AVAILABLE == content_state)
+ {
+ if (ctx_surf->notification != NULL) {
+ ctx_surf->notification(ctx_surf->id_surface,
+ &ctx_surf->prop,
+ ILM_NOTIFICATION_CONTENT_AVAILABLE);
+ }
+ }
}
static void
controller_surface_listener_input_focus(void *data,
struct ivi_controller_surface *controller,
+ uint32_t device,
int32_t enabled)
{
(void)data;
(void)controller;
+ (void)device;
(void)enabled;
}
{
struct wayland_context *ctx = data;
struct surface_context *ctx_surf = NULL;
- int32_t is_inside = 0;
- is_inside = wayland_controller_is_inside_surface_list(
- &ctx->list_surface, id_surface);
-
- if (is_inside != 0) {
- fprintf(stderr, "invalid id_surface in controller_listener_surface\n");
+ ctx_surf = get_surface_context(ctx, id_surface);
+ if (ctx_surf != NULL) {
+ if (!ctx_surf->is_surface_creation_noticed) {
+ if (ctx_surf->notification != NULL) {
+ ctx_surf->notification(ctx_surf->id_surface,
+ &ctx_surf->prop,
+ ILM_NOTIFICATION_CONTENT_AVAILABLE);
+ ctx_surf->is_surface_creation_noticed = true;
+ }
+ ctx_surf->controller = ivi_controller_surface_create(
+ controller, id_surface);
+ }
+ else {
+ fprintf(stderr, "invalid id_surface in controller_listener_surface\n");
+ }
return;
}
ctx_surf->id_surface = id_surface;
ctx_surf->prop.inputDevicesAcceptance = ILM_INPUT_DEVICE_ALL;
ctx_surf->ctx = ctx;
+ ctx_surf->is_surface_creation_noticed = true;
wl_list_init(&ctx_surf->link);
wl_list_insert(&ctx->list_surface, &ctx_surf->link);
NULL
};
-static struct ilm_control_context ilm_context = {0};
+static struct ilm_control_context ilm_context;
-static void
-destroy_control_resources(void)
+static void destroy_control_resources(void)
{
struct ilm_control_context *ctx = &ilm_context;
- struct screen_context *ctx_scrn;
- struct screen_context *next;
- wl_list_for_each_safe(ctx_scrn, next, &ctx->wl.list_screen, link) {
- if (ctx_scrn->output != NULL) {
- wl_list_remove(&ctx_scrn->link);
- wl_output_destroy(ctx_scrn->output);
- free(ctx_scrn);
- }
- }
if (ctx->wl.controller != NULL) {
+ {
+ struct surface_context *l;
+ struct surface_context *n;
+ wl_list_for_each_safe(l, n, &ctx->wl.list_surface, link) {
+ wl_list_remove(&l->link);
+ wl_list_remove(&l->order.link);
+ ivi_controller_surface_destroy(l->controller, 0);
+ free(l);
+ }
+ }
+
+ {
+ struct layer_context *l;
+ struct layer_context *n;
+ wl_list_for_each_safe(l, n, &ctx->wl.list_layer, link) {
+ wl_list_remove(&l->link);
+ wl_list_remove(&l->order.link);
+ free(l);
+ }
+ }
+
+ {
+ struct screen_context *ctx_scrn;
+ struct screen_context *next;
+
+ wl_list_for_each_safe(ctx_scrn, next, &ctx->wl.list_screen, link) {
+ if (ctx_scrn->output != NULL) {
+ wl_output_destroy(ctx_scrn->output);
+ }
+
+ wl_list_remove(&ctx_scrn->link);
+ ivi_controller_screen_destroy(ctx_scrn->controller);
+ free(ctx_scrn);
+ }
+ }
+
ivi_controller_destroy(ctx->wl.controller);
ctx->wl.controller = NULL;
}
wl_event_queue_destroy(ctx->wl.queue);
ctx->wl.queue = NULL;
+ wl_registry_destroy(ctx->wl.registry);
+ ctx->wl.registry = NULL;
+
if (0 != pthread_mutex_destroy(&ctx->mutex)) {
fprintf(stderr, "failed to destroy pthread_mutex\n");
}
}
-static void
-wayland_destroy(void)
+static void send_shutdown_event(struct ilm_control_context *ctx)
+{
+ uint64_t buf = 1;
+ while (write(ctx->shutdown_fd, &buf, sizeof buf) == -1 && errno == EINTR)
+ ;
+}
+
+ILM_EXPORT void
+ilmControl_destroy(void)
{
struct ilm_control_context *ctx = &ilm_context;
- pthread_cancel(ctx->thread);
+
+ send_shutdown_event(ctx);
+
if (0 != pthread_join(ctx->thread, NULL)) {
fprintf(stderr, "failed to join control thread\n");
}
+
destroy_control_resources();
+
+ close(ctx->shutdown_fd);
+
memset(ctx, 0, sizeof *ctx);
}
-static ilmErrorTypes
-wayland_init(t_ilm_nativedisplay nativedisplay)
+ILM_EXPORT ilmErrorTypes
+ilmControl_init(t_ilm_nativedisplay nativedisplay)
{
struct ilm_control_context *ctx = &ilm_context;
pthread_mutexattr_destroy(&a);
}
- return init_control() == 0 ? ILM_SUCCESS : ILM_FAILED;
-}
+ ctx->shutdown_fd = eventfd(0, EFD_CLOEXEC | EFD_NONBLOCK);
-static void cancel_read(void *d)
-{
- wl_display_cancel_read(d);
+ if (ctx->shutdown_fd == -1)
+ {
+ fprintf(stderr, "Could not setup shutdown-fd: %s\n", strerror(errno));
+ return ILM_FAILED;
+ }
+
+ return init_control() == 0 ? ILM_SUCCESS : ILM_FAILED;
}
static void*
control_thread(void *p_ret)
{
- struct ilm_control_context *ctx = &ilm_context;
- struct wayland_context *wl = &ctx->wl;
- struct wl_display *display = wl->display;
- struct wl_event_queue *queue = wl->queue;
- int fd = wl_display_get_fd(display);
-
+ struct ilm_control_context *const ctx = &ilm_context;
+ struct wayland_context *const wl = &ctx->wl;
+ struct wl_display *const display = wl->display;
+ struct wl_event_queue *const queue = wl->queue;
+ int const fd = wl_display_get_fd(display);
+ int const shutdown_fd = ctx->shutdown_fd;
(void) p_ret;
while (1)
{
- if (wl_display_prepare_read_queue(display, queue) != 0)
+ while (wl_display_prepare_read_queue(display, queue) != 0)
{
lock_context(ctx);
wl_display_dispatch_queue_pending(display, queue);
unlock_context(ctx);
-
- continue;
}
if (wl_display_flush(display) == -1)
break;
}
- struct pollfd pfd;
-
- pfd.fd = fd;
- pfd.events = POLLIN;
- pfd.revents = 0;
-
- int pollret = -1;
+ struct pollfd pfd[2] = {
+ { .fd = fd, .events = POLLIN },
+ { .fd = shutdown_fd, .events = POLLIN }
+ };
- pthread_cleanup_push(cancel_read, display);
- pollret = poll(&pfd, 1, -1);
- pthread_cleanup_pop(0);
-
- if (pollret != -1 && (pfd.revents & POLLIN))
+ int pollret = poll(pfd, 2, -1);
+ if (pollret != -1 && (pfd[0].revents & POLLIN))
{
wl_display_read_events(display);
else
{
wl_display_cancel_read(display);
+
+ if (pollret == -1 || (pfd[1].revents & POLLIN))
+ {
+ break;
+ }
}
}
/* registry_add_listener for request by ivi-controller */
wl->registry = wl_display_get_registry(wl->display);
if (wl->registry == NULL) {
+ wl_event_queue_destroy(wl->queue);
+ wl->queue = NULL;
fprintf(stderr, "Failed to get registry\n");
return -1;
}
return 0;
}
-static struct ilm_control_context*
-sync_and_acquire_instance(void)
-{
- struct ilm_control_context *ctx = &ilm_context;
- lock_context(ctx);
- display_roundtrip_queue(ctx->wl.display, ctx->wl.queue);
- return ctx;
-}
+#define sync_and_acquire_instance() ({ \
+ struct ilm_control_context *ctx = &ilm_context; \
+ if (! ctx->initialized) { \
+ fputs("Not initialized\n", stderr); \
+ return ILM_FAILED; \
+ } \
+ lock_context(ctx); \
+ display_roundtrip_queue(ctx->wl.display, ctx->wl.queue); \
+ ctx; \
+})
static void release_instance(void)
{
return NULL;
}
-static ilmErrorTypes
-wayland_getPropertiesOfLayer(t_ilm_uint layerID,
+ILM_EXPORT ilmErrorTypes
+ilm_getPropertiesOfLayer(t_ilm_uint layerID,
struct ilmLayerProperties* pLayerProperties)
{
ilmErrorTypes returnValue = ILM_FAILED;
}
}
-static ilmErrorTypes
-wayland_getPropertiesOfScreen(t_ilm_display screenID,
+ILM_EXPORT ilmErrorTypes
+ilm_getPropertiesOfScreen(t_ilm_display screenID,
struct ilmScreenProperties* pScreenProperties)
{
ilmErrorTypes returnValue = ILM_FAILED;
return returnValue;
}
-static ilmErrorTypes
-wayland_getNumberOfHardwareLayers(t_ilm_uint screenID,
+ILM_EXPORT ilmErrorTypes
+ilm_getNumberOfHardwareLayers(t_ilm_uint screenID,
t_ilm_uint* pNumberOfHardwareLayers)
{
(void)screenID;
}
}
-static ilmErrorTypes
-wayland_getScreenIDs(t_ilm_uint* pNumberOfIDs, t_ilm_uint** ppIDs)
+ILM_EXPORT ilmErrorTypes
+ilm_getScreenIDs(t_ilm_uint* pNumberOfIDs, t_ilm_uint** ppIDs)
{
ilmErrorTypes returnValue = ILM_FAILED;
struct ilm_control_context *ctx = sync_and_acquire_instance();
t_ilm_uint length = wl_list_length(&ctx->wl.list_screen);
*pNumberOfIDs = 0;
- *ppIDs = (t_ilm_uint*)malloc(length * sizeof *ppIDs);
+ *ppIDs = (t_ilm_uint*)malloc(length * sizeof **ppIDs);
if (*ppIDs != NULL) {
t_ilm_uint* ids = *ppIDs;
wl_list_for_each(ctx_scrn, &ctx->wl.list_screen, link) {
return returnValue;
}
-static ilmErrorTypes
-wayland_getLayerIDs(t_ilm_int* pLength, t_ilm_layer** ppArray)
+ILM_EXPORT ilmErrorTypes
+ilm_getLayerIDs(t_ilm_int* pLength, t_ilm_layer** ppArray)
{
ilmErrorTypes returnValue = ILM_FAILED;
struct ilm_control_context *ctx = sync_and_acquire_instance();
t_ilm_uint length = wl_list_length(&ctx->wl.list_layer);
*pLength = 0;
- *ppArray = (t_ilm_layer*)malloc(length * sizeof *ppArray);
+ *ppArray = (t_ilm_layer*)malloc(length * sizeof **ppArray);
if (*ppArray != NULL) {
// compositor sends layers in opposite order
// write ids from back to front to turn them around
return returnValue;
}
-static ilmErrorTypes
-wayland_getLayerIDsOnScreen(t_ilm_uint screenId,
+ILM_EXPORT ilmErrorTypes
+ilm_getLayerIDsOnScreen(t_ilm_uint screenId,
t_ilm_int* pLength,
t_ilm_layer** ppArray)
{
if (0 < length)
{
- *ppArray = (t_ilm_layer*)malloc(length * sizeof *ppArray);
+ *ppArray = (t_ilm_layer*)malloc(length * sizeof **ppArray);
if (*ppArray != NULL) {
// compositor sends layers in opposite order
// write ids from back to front to turn them around
return returnValue;
}
-static ilmErrorTypes
-wayland_getSurfaceIDs(t_ilm_int* pLength, t_ilm_surface** ppArray)
+ILM_EXPORT ilmErrorTypes
+ilm_getSurfaceIDs(t_ilm_int* pLength, t_ilm_surface** ppArray)
{
ilmErrorTypes returnValue = ILM_FAILED;
struct ilm_control_context *ctx = sync_and_acquire_instance();
t_ilm_uint length = wl_list_length(&ctx->wl.list_surface);
*pLength = 0;
- *ppArray = (t_ilm_surface*)malloc(length * sizeof *ppArray);
+ *ppArray = (t_ilm_surface*)malloc(length * sizeof **ppArray);
if (*ppArray != NULL) {
t_ilm_surface* ids = *ppArray;
wl_list_for_each_reverse(ctx_surf, &ctx->wl.list_surface, link) {
return returnValue;
}
-static ilmErrorTypes
-wayland_getSurfaceIDsOnLayer(t_ilm_layer layer,
+ILM_EXPORT ilmErrorTypes
+ilm_getSurfaceIDsOnLayer(t_ilm_layer layer,
t_ilm_int* pLength,
t_ilm_surface** ppArray)
{
}
length = wl_list_length(&ctx_layer->order.list_surface);
- *ppArray = (t_ilm_surface*)malloc(length * sizeof *ppArray);
+ *ppArray = (t_ilm_surface*)malloc(length * sizeof **ppArray);
if (*ppArray == NULL) {
release_instance();
return ILM_FAILED;
return 0;
}
-static ilmErrorTypes
-wayland_layerCreateWithDimension(t_ilm_layer* pLayerId,
+ILM_EXPORT ilmErrorTypes
+ilm_layerCreateWithDimension(t_ilm_layer* pLayerId,
t_ilm_uint width,
t_ilm_uint height)
{
return returnValue;
}
-static ilmErrorTypes
-wayland_layerRemove(t_ilm_layer layerId)
+ILM_EXPORT ilmErrorTypes
+ilm_layerRemove(t_ilm_layer layerId)
{
ilmErrorTypes returnValue = ILM_FAILED;
struct ilm_control_context *ctx = sync_and_acquire_instance();
return returnValue;
}
-static ilmErrorTypes
-wayland_layerGetType(t_ilm_layer layerId, ilmLayerType* pLayerType)
+ILM_EXPORT ilmErrorTypes
+ilm_layerGetType(t_ilm_layer layerId, ilmLayerType* pLayerType)
{
if (!pLayerType)
{
return ILM_SUCCESS; // even if non existent?
}
-static ilmErrorTypes
-wayland_layerSetVisibility(t_ilm_layer layerId, t_ilm_bool newVisibility)
+ILM_EXPORT ilmErrorTypes
+ilm_layerSetVisibility(t_ilm_layer layerId, t_ilm_bool newVisibility)
{
ilmErrorTypes returnValue = ILM_FAILED;
struct ilm_control_context *ctx = sync_and_acquire_instance();
return returnValue;
}
-static ilmErrorTypes
-wayland_layerGetVisibility(t_ilm_layer layerId, t_ilm_bool *pVisibility)
+ILM_EXPORT ilmErrorTypes
+ilm_layerGetVisibility(t_ilm_layer layerId, t_ilm_bool *pVisibility)
{
ilmErrorTypes returnValue = ILM_FAILED;
struct ilm_control_context *ctx = sync_and_acquire_instance();
return returnValue;
}
-static ilmErrorTypes
-wayland_layerSetOpacity(t_ilm_layer layerId, t_ilm_float opacity)
+ILM_EXPORT ilmErrorTypes
+ilm_layerSetOpacity(t_ilm_layer layerId, t_ilm_float opacity)
{
ilmErrorTypes returnValue = ILM_FAILED;
struct ilm_control_context *ctx = sync_and_acquire_instance();
return returnValue;
}
-static ilmErrorTypes
-wayland_layerGetOpacity(t_ilm_layer layerId, t_ilm_float *pOpacity)
+ILM_EXPORT ilmErrorTypes
+ilm_layerGetOpacity(t_ilm_layer layerId, t_ilm_float *pOpacity)
{
ilmErrorTypes returnValue = ILM_FAILED;
struct ilm_control_context *ctx = sync_and_acquire_instance();
return returnValue;
}
-static ilmErrorTypes
-wayland_layerSetSourceRectangle(t_ilm_layer layerId,
+ILM_EXPORT ilmErrorTypes
+ilm_layerSetSourceRectangle(t_ilm_layer layerId,
t_ilm_uint x, t_ilm_uint y,
t_ilm_uint width, t_ilm_uint height)
{
return returnValue;
}
-static ilmErrorTypes
-wayland_layerSetDestinationRectangle(t_ilm_layer layerId,
+ILM_EXPORT ilmErrorTypes
+ilm_layerSetDestinationRectangle(t_ilm_layer layerId,
t_ilm_int x, t_ilm_int y,
t_ilm_int width, t_ilm_int height)
{
return returnValue;
}
-static ilmErrorTypes
-wayland_layerGetDimension(t_ilm_layer layerId, t_ilm_uint *pDimension)
+ILM_EXPORT ilmErrorTypes
+ilm_layerGetDimension(t_ilm_layer layerId, t_ilm_uint *pDimension)
{
ilmErrorTypes returnValue = ILM_FAILED;
struct ilm_control_context *ctx = sync_and_acquire_instance();
return returnValue;
}
-static ilmErrorTypes
-wayland_layerSetDimension(t_ilm_layer layerId, t_ilm_uint *pDimension)
+ILM_EXPORT ilmErrorTypes
+ilm_layerSetDimension(t_ilm_layer layerId, t_ilm_uint *pDimension)
{
ilmErrorTypes returnValue = ILM_FAILED;
struct ilm_control_context *ctx = sync_and_acquire_instance();
return returnValue;
}
-static ilmErrorTypes
-wayland_layerGetPosition(t_ilm_layer layerId, t_ilm_uint *pPosition)
+ILM_EXPORT ilmErrorTypes
+ilm_layerGetPosition(t_ilm_layer layerId, t_ilm_uint *pPosition)
{
ilmErrorTypes returnValue = ILM_FAILED;
struct ilm_control_context *ctx = sync_and_acquire_instance();
return returnValue;
}
-static ilmErrorTypes
-wayland_layerSetPosition(t_ilm_layer layerId, t_ilm_uint *pPosition)
+ILM_EXPORT ilmErrorTypes
+ilm_layerSetPosition(t_ilm_layer layerId, t_ilm_uint *pPosition)
{
ilmErrorTypes returnValue = ILM_FAILED;
struct ilm_control_context *ctx = sync_and_acquire_instance();
return returnValue;
}
-static ilmErrorTypes
-wayland_layerSetOrientation(t_ilm_layer layerId, ilmOrientation orientation)
+ILM_EXPORT ilmErrorTypes
+ilm_layerSetOrientation(t_ilm_layer layerId, ilmOrientation orientation)
{
ilmErrorTypes returnValue = ILM_FAILED;
struct ilm_control_context *ctx = sync_and_acquire_instance();
return returnValue;
}
-static ilmErrorTypes
-wayland_layerGetOrientation(t_ilm_layer layerId, ilmOrientation *pOrientation)
+ILM_EXPORT ilmErrorTypes
+ilm_layerGetOrientation(t_ilm_layer layerId, ilmOrientation *pOrientation)
{
ilmErrorTypes returnValue = ILM_FAILED;
struct ilm_control_context *ctx = sync_and_acquire_instance();
return returnValue;
}
-static ilmErrorTypes
-wayland_layerSetChromaKey(t_ilm_layer layerId, t_ilm_int* pColor)
+ILM_EXPORT ilmErrorTypes
+ilm_layerSetChromaKey(t_ilm_layer layerId, t_ilm_int* pColor)
{
(void)layerId;
(void)pColor;
return ILM_FAILED;
}
-static ilmErrorTypes
-wayland_layerSetRenderOrder(t_ilm_layer layerId,
+ILM_EXPORT ilmErrorTypes
+ilm_layerSetRenderOrder(t_ilm_layer layerId,
t_ilm_surface *pSurfaceId,
t_ilm_int number)
{
return returnValue;
}
-static ilmErrorTypes
-wayland_layerGetCapabilities(t_ilm_layer layerId,
+ILM_EXPORT ilmErrorTypes
+ilm_layerGetCapabilities(t_ilm_layer layerId,
t_ilm_layercapabilities *pCapabilities)
{
(void)layerId;
return ILM_FAILED;
}
-static ilmErrorTypes
-wayland_layerTypeGetCapabilities(ilmLayerType layerType,
+ILM_EXPORT ilmErrorTypes
+ilm_layerTypeGetCapabilities(ilmLayerType layerType,
t_ilm_layercapabilities *pCapabilities)
{
(void)layerType;
return ILM_FAILED;
}
-static ilmErrorTypes
-wayland_surfaceSetVisibility(t_ilm_surface surfaceId, t_ilm_bool newVisibility)
+ILM_EXPORT ilmErrorTypes
+ilm_surfaceSetVisibility(t_ilm_surface surfaceId, t_ilm_bool newVisibility)
{
ilmErrorTypes returnValue = ILM_FAILED;
struct ilm_control_context *ctx = sync_and_acquire_instance();
return returnValue;
}
-static ilmErrorTypes
-wayland_surfaceSetOpacity(t_ilm_surface surfaceId, t_ilm_float opacity)
+ILM_EXPORT ilmErrorTypes
+ilm_surfaceSetOpacity(t_ilm_surface surfaceId, t_ilm_float opacity)
{
ilmErrorTypes returnValue = ILM_FAILED;
struct ilm_control_context *ctx = sync_and_acquire_instance();
return returnValue;
}
-static ilmErrorTypes
-wayland_surfaceGetOpacity(t_ilm_surface surfaceId, t_ilm_float *pOpacity)
+ILM_EXPORT ilmErrorTypes
+ilm_surfaceGetOpacity(t_ilm_surface surfaceId, t_ilm_float *pOpacity)
{
ilmErrorTypes returnValue = ILM_FAILED;
struct ilm_control_context *ctx = sync_and_acquire_instance();
return returnValue;
}
-static ilmErrorTypes
-wayland_SetKeyboardFocusOn(t_ilm_surface surfaceId)
+ILM_EXPORT ilmErrorTypes
+ilm_SetKeyboardFocusOn(t_ilm_surface surfaceId)
{
ilmErrorTypes returnValue = ILM_FAILED;
(void)surfaceId;
return returnValue;
}
-static ilmErrorTypes
-wayland_GetKeyboardFocusSurfaceId(t_ilm_surface* pSurfaceId)
+ILM_EXPORT ilmErrorTypes
+ilm_GetKeyboardFocusSurfaceId(t_ilm_surface* pSurfaceId)
{
ilmErrorTypes returnValue = ILM_FAILED;
(void)pSurfaceId;
return returnValue;
}
-static ilmErrorTypes
-wayland_surfaceSetDestinationRectangle(t_ilm_surface surfaceId,
+ILM_EXPORT ilmErrorTypes
+ilm_surfaceSetDestinationRectangle(t_ilm_surface surfaceId,
t_ilm_int x, t_ilm_int y,
t_ilm_int width, t_ilm_int height)
{
return returnValue;
}
-static ilmErrorTypes
-wayland_surfaceSetDimension(t_ilm_surface surfaceId, t_ilm_uint *pDimension)
+ILM_EXPORT ilmErrorTypes
+ilm_surfaceSetDimension(t_ilm_surface surfaceId, t_ilm_uint *pDimension)
{
ilmErrorTypes returnValue = ILM_FAILED;
struct ilm_control_context *ctx = sync_and_acquire_instance();
return returnValue;
}
-static ilmErrorTypes
-wayland_surfaceGetPosition(t_ilm_surface surfaceId, t_ilm_uint *pPosition)
+ILM_EXPORT ilmErrorTypes
+ilm_surfaceGetPosition(t_ilm_surface surfaceId, t_ilm_uint *pPosition)
{
ilmErrorTypes returnValue = ILM_FAILED;
struct ilm_control_context *ctx = sync_and_acquire_instance();
return returnValue;
}
-static ilmErrorTypes
-wayland_surfaceSetPosition(t_ilm_surface surfaceId, t_ilm_uint *pPosition)
+ILM_EXPORT ilmErrorTypes
+ilm_surfaceSetPosition(t_ilm_surface surfaceId, t_ilm_uint *pPosition)
{
ilmErrorTypes returnValue = ILM_FAILED;
struct ilm_control_context *ctx = sync_and_acquire_instance();
return returnValue;
}
-static ilmErrorTypes
-wayland_surfaceSetOrientation(t_ilm_surface surfaceId,
+ILM_EXPORT ilmErrorTypes
+ilm_surfaceSetOrientation(t_ilm_surface surfaceId,
ilmOrientation orientation)
{
ilmErrorTypes returnValue = ILM_FAILED;
return returnValue;
}
-static ilmErrorTypes
-wayland_surfaceGetOrientation(t_ilm_surface surfaceId,
+ILM_EXPORT ilmErrorTypes
+ilm_surfaceGetOrientation(t_ilm_surface surfaceId,
ilmOrientation *pOrientation)
{
ilmErrorTypes returnValue = ILM_FAILED;
return returnValue;
}
-static ilmErrorTypes
-wayland_surfaceGetPixelformat(t_ilm_layer surfaceId,
+ILM_EXPORT ilmErrorTypes
+ilm_surfaceGetPixelformat(t_ilm_layer surfaceId,
ilmPixelFormat *pPixelformat)
{
ilmErrorTypes returnValue = ILM_FAILED;
return returnValue;
}
-static ilmErrorTypes
-wayland_surfaceSetChromaKey(t_ilm_surface surfaceId, t_ilm_int* pColor)
+ILM_EXPORT ilmErrorTypes
+ilm_surfaceSetChromaKey(t_ilm_surface surfaceId, t_ilm_int* pColor)
{
(void)surfaceId;
(void)pColor;
return ILM_FAILED;
}
-static ilmErrorTypes
-wayland_displaySetRenderOrder(t_ilm_display display,
+ILM_EXPORT ilmErrorTypes
+ilm_displaySetRenderOrder(t_ilm_display display,
t_ilm_layer *pLayerId, const t_ilm_uint number)
{
ilmErrorTypes returnValue = ILM_FAILED;
return returnValue;
}
-static ilmErrorTypes
-wayland_takeScreenshot(t_ilm_uint screen, t_ilm_const_string filename)
+ILM_EXPORT ilmErrorTypes
+ilm_takeScreenshot(t_ilm_uint screen, t_ilm_const_string filename)
{
ilmErrorTypes returnValue = ILM_FAILED;
struct ilm_control_context *ctx = sync_and_acquire_instance();
return returnValue;
}
-static ilmErrorTypes
-wayland_takeLayerScreenshot(t_ilm_const_string filename, t_ilm_layer layerid)
+ILM_EXPORT ilmErrorTypes
+ilm_takeLayerScreenshot(t_ilm_const_string filename, t_ilm_layer layerid)
{
ilmErrorTypes returnValue = ILM_FAILED;
struct ilm_control_context *ctx = sync_and_acquire_instance();
return returnValue;
}
-static ilmErrorTypes
-wayland_takeSurfaceScreenshot(t_ilm_const_string filename,
+ILM_EXPORT ilmErrorTypes
+ilm_takeSurfaceScreenshot(t_ilm_const_string filename,
t_ilm_surface surfaceid)
{
ilmErrorTypes returnValue = ILM_FAILED;
return returnValue;
}
-static ilmErrorTypes
-wayland_SetOptimizationMode(ilmOptimization id, ilmOptimizationMode mode)
+ILM_EXPORT ilmErrorTypes
+ilm_SetOptimizationMode(ilmOptimization id, ilmOptimizationMode mode)
{
(void)id;
(void)mode;
return ILM_FAILED;
}
-static ilmErrorTypes
-wayland_GetOptimizationMode(ilmOptimization id, ilmOptimizationMode* pMode)
+ILM_EXPORT ilmErrorTypes
+ilm_GetOptimizationMode(ilmOptimization id, ilmOptimizationMode* pMode)
{
(void)id;
(void)pMode;
return ILM_FAILED;
}
-// TODO
-static ilmErrorTypes
-wayland_layerAddNotification(t_ilm_layer layer,
+ILM_EXPORT ilmErrorTypes
+ilm_layerAddNotification(t_ilm_layer layer,
layerNotificationFunc callback)
{
ilmErrorTypes returnValue = ILM_FAILED;
return returnValue;
}
-// TODO
-static ilmErrorTypes
-wayland_layerRemoveNotification(t_ilm_layer layer)
+ILM_EXPORT ilmErrorTypes
+ilm_layerRemoveNotification(t_ilm_layer layer)
{
- return wayland_layerAddNotification(layer, NULL);
+ return ilm_layerAddNotification(layer, NULL);
}
-// TODO
-static ilmErrorTypes
-wayland_surfaceAddNotification(t_ilm_surface surface,
+ILM_EXPORT ilmErrorTypes
+ilm_surfaceAddNotification(t_ilm_surface surface,
surfaceNotificationFunc callback)
{
ilmErrorTypes returnValue = ILM_FAILED;
ctx_surf = (struct surface_context*)get_surface_context(
&ctx->wl, (uint32_t)surface);
if (ctx_surf == NULL) {
+ if (callback != NULL) {
+ callback((uint32_t)surface, NULL, ILM_NOTIFICATION_CONTENT_REMOVED);
+ controller_listener_surface(ctx, ctx->wl.controller, (uint32_t)surface);
+ ctx_surf = (struct surface_context*)get_surface_context(
+ &ctx->wl, (uint32_t)surface);
+ ctx_surf->is_surface_creation_noticed = false;
+ }
+ }
+
+ if (ctx_surf == NULL) {
returnValue = ILM_ERROR_INVALID_ARGUMENTS;
- } else {
+ }
+ else {
ctx_surf->notification = callback;
returnValue = ILM_SUCCESS;
return returnValue;
}
-// TODO
-static ilmErrorTypes
-wayland_surfaceRemoveNotification(t_ilm_surface surface)
+ILM_EXPORT ilmErrorTypes
+ilm_surfaceRemoveNotification(t_ilm_surface surface)
{
- return wayland_surfaceAddNotification(surface, NULL);
+ return ilm_surfaceAddNotification(surface, NULL);
}
-static ilmErrorTypes
-wayland_getNativeHandle(t_ilm_uint pid, t_ilm_int *n_handle,
+ILM_EXPORT ilmErrorTypes
+ilm_getNativeHandle(t_ilm_uint pid, t_ilm_int *n_handle,
t_ilm_nativehandle **p_handles)
{
struct ilm_control_context *ctx = sync_and_acquire_instance();
return (*n_handle > 0) ? ILM_SUCCESS : ILM_FAILED;
}
-static ilmErrorTypes
-wayland_getPropertiesOfSurface(t_ilm_uint surfaceID,
+ILM_EXPORT ilmErrorTypes
+ilm_getPropertiesOfSurface(t_ilm_uint surfaceID,
struct ilmSurfaceProperties* pSurfaceProperties)
{
ilmErrorTypes returnValue = ILM_FAILED;
return returnValue;
}
-static ilmErrorTypes
-wayland_layerAddSurface(t_ilm_layer layerId,
+ILM_EXPORT ilmErrorTypes
+ilm_layerAddSurface(t_ilm_layer layerId,
t_ilm_surface surfaceId)
{
ilmErrorTypes returnValue = ILM_FAILED;
return returnValue;
}
-static ilmErrorTypes
-wayland_layerRemoveSurface(t_ilm_layer layerId,
+ILM_EXPORT ilmErrorTypes
+ilm_layerRemoveSurface(t_ilm_layer layerId,
t_ilm_surface surfaceId)
{
ilmErrorTypes returnValue = ILM_FAILED;
return returnValue;
}
-static ilmErrorTypes
-wayland_surfaceGetDimension(t_ilm_surface surfaceId,
+ILM_EXPORT ilmErrorTypes
+ilm_surfaceGetDimension(t_ilm_surface surfaceId,
t_ilm_uint *pDimension)
{
ilmErrorTypes returnValue = ILM_FAILED;
return returnValue;
}
-static ilmErrorTypes
-wayland_surfaceGetVisibility(t_ilm_surface surfaceId,
+ILM_EXPORT ilmErrorTypes
+ilm_surfaceGetVisibility(t_ilm_surface surfaceId,
t_ilm_bool *pVisibility)
{
ilmErrorTypes returnValue = ILM_FAILED;
return returnValue;
}
-static ilmErrorTypes
-wayland_surfaceSetSourceRectangle(t_ilm_surface surfaceId,
+ILM_EXPORT ilmErrorTypes
+ilm_surfaceSetSourceRectangle(t_ilm_surface surfaceId,
t_ilm_int x, t_ilm_int y,
t_ilm_int width, t_ilm_int height)
{
return returnValue;
}
-static ilmErrorTypes
-wayland_commitChanges(void)
+ILM_EXPORT ilmErrorTypes
+ilm_commitChanges(void)
{
ilmErrorTypes returnValue = ILM_FAILED;
struct ilm_control_context *ctx = sync_and_acquire_instance();