expedite/src/bin/engine_wayland_shm.c

126 lines
3.3 KiB
C

#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <sys/mman.h>
#include "main.h"
#include "engine_wayland_common.h"
#include <Evas_Engine_Wayland_Shm.h>
#include <wayland-client.h>
/*
* Global struct
*/
struct _engine_wayland_shm_display
{
struct wl_display *display;
struct wl_registry *registry;
struct wl_compositor *compositor;
struct wl_surface *surface;
struct wl_shell *shell;
struct wl_shell_surface *shell_surface;
struct wl_shm *shm;
int width;
int height;
};
static struct _engine_wayland_shm_display wl;
/*
* Function Prototypes
*/
/* static void _engine_wayland_shm_create_buffer(int width, int height); */
/* Registry handler */
static void _registry_handle_global(void *data, struct wl_registry *registry, unsigned int id, const char *interface, unsigned int version __UNUSED__);
static const struct wl_registry_listener _registry_listener =
{
_registry_handle_global,
NULL, /* global_remove */
};
/*
* API
*/
Eina_Bool
engine_wayland_shm_args(const char *engine __UNUSED__, int width, int height)
{
Evas_Engine_Info_Wayland_Shm *einfo;
evas_output_method_set(evas, evas_render_method_lookup("wayland_shm"));
einfo = (Evas_Engine_Info_Wayland_Shm *)evas_engine_info_get(evas);
if (!einfo)
{
printf("Evas does not support the Wayland SHM Engine\n");
return EINA_FALSE;
}
wl.display = wl_display_connect(NULL);
if (!wl.display)
{
printf("Expedite cannot connect to wayland display\n");
return EINA_FALSE;
}
wl.registry = wl_display_get_registry(wl.display);
wl_registry_add_listener(wl.registry, &_registry_listener, NULL);
wl_display_roundtrip(wl.display);
assert(wl.compositor != NULL);
assert(wl.shell != NULL);
assert(wl.shm != NULL);
wl.surface = wl_compositor_create_surface(wl.compositor);
wl.shell_surface = engine_wayland_create_shell_surface(wl.shell, wl.surface, "Expedite Wayland SHM");
einfo->info.wl_shm = wl.shm;
einfo->info.wl_surface = wl.surface;
if (!evas_engine_info_set(evas, (Evas_Engine_Info *) einfo))
{
printf("Evas can not setup the informations of the Wayland SHM Engine\n");
return EINA_FALSE;
}
wl.width = width;
wl.height = height;
return EINA_TRUE;
}
void
engine_wayland_shm_loop(void)
{
assert(wl_display_dispatch_pending(wl.display) != -1);
}
void
engine_wayland_shm_shutdown(void)
{
wl_shell_surface_destroy(wl.shell_surface);
wl_surface_destroy(wl.surface);
wl_shm_destroy(wl.shm);
wl_shell_destroy(wl.shell);
wl_compositor_destroy(wl.compositor);
wl_registry_destroy(wl.registry);
wl_display_flush(wl.display);
wl_display_disconnect(wl.display);
}
/*
* Function implementation
*/
static void
_registry_handle_global(void *data __UNUSED__, struct wl_registry *registry, unsigned int id, const char *interface, unsigned int version __UNUSED__)
{
if (!strcmp(interface, "wl_compositor"))
wl.compositor = wl_registry_bind(registry, id, &wl_compositor_interface, 1);
else if (!strcmp(interface, "wl_shell"))
wl.shell = wl_registry_bind(registry, id, &wl_shell_interface, 1);
else if (!strcmp(interface, "wl_seat"))
engine_wayland_register_seat(registry, id);
else if (!strcmp(interface, "wl_shm"))
wl.shm = wl_registry_bind(registry, id, &wl_shm_interface, 1);
}