2011-12-26 15:27:20 -08:00
|
|
|
#ifdef HAVE_CONFIG_H
|
2012-02-28 13:55:51 -08:00
|
|
|
# include <config.h>
|
2011-12-26 15:27:20 -08:00
|
|
|
#endif
|
|
|
|
|
2012-02-28 13:55:51 -08:00
|
|
|
#include <fcntl.h>
|
2011-12-26 15:27:20 -08:00
|
|
|
|
|
|
|
/* FIXME: This gives BTN_LEFT/RIGHT/MIDDLE for linux systems ...
|
|
|
|
* What about other OSs ?? */
|
|
|
|
#ifdef __linux__
|
|
|
|
# include <linux/input.h>
|
|
|
|
#else
|
|
|
|
# define BTN_LEFT 0x110
|
|
|
|
# define BTN_RIGHT 0x111
|
|
|
|
# define BTN_MIDDLE 0x112
|
|
|
|
# define BTN_SIDE 0x113
|
|
|
|
# define BTN_EXTRA 0x114
|
|
|
|
# define BTN_FORWARD 0x115
|
|
|
|
# define BTN_BACK 0x116
|
|
|
|
#endif
|
|
|
|
|
2012-02-28 13:55:51 -08:00
|
|
|
#include "Ecore.h"
|
|
|
|
#include "ecore_private.h"
|
|
|
|
#include "Ecore_Input.h"
|
|
|
|
#include "ecore_wl_private.h"
|
|
|
|
#include "Ecore_Wayland.h"
|
2011-12-26 15:27:20 -08:00
|
|
|
|
|
|
|
/* local function prototypes */
|
2012-02-28 13:55:51 -08:00
|
|
|
static Eina_Bool _ecore_wl_shutdown(Eina_Bool close);
|
|
|
|
static int _ecore_wl_cb_event_mask_update(unsigned int mask, void *data);
|
|
|
|
static Eina_Bool _ecore_wl_cb_handle_data(void *data, Ecore_Fd_Handler *hdl __UNUSED__);
|
|
|
|
static void _ecore_wl_cb_handle_global(struct wl_display *disp, unsigned int id, const char *interface, unsigned int version __UNUSED__, void *data);
|
|
|
|
static Eina_Bool _ecore_wl_egl_init(Ecore_Wl_Display *ewd);
|
|
|
|
static Eina_Bool _ecore_wl_egl_shutdown(Ecore_Wl_Display *ewd);
|
|
|
|
static Eina_Bool _ecore_wl_xkb_init(Ecore_Wl_Display *ewd);
|
|
|
|
static Eina_Bool _ecore_wl_xkb_shutdown(Ecore_Wl_Display *ewd);
|
2012-03-07 13:46:52 -08:00
|
|
|
static void _ecore_wl_cb_interfaces_bound_free(void *data __UNUSED__, void *event);
|
2011-12-26 15:27:20 -08:00
|
|
|
|
|
|
|
/* local variables */
|
|
|
|
static int _ecore_wl_init_count = 0;
|
|
|
|
|
|
|
|
/* external variables */
|
|
|
|
int _ecore_wl_log_dom = -1;
|
2012-02-28 13:55:51 -08:00
|
|
|
Ecore_Wl_Display *_ecore_wl_disp = NULL;
|
|
|
|
|
2011-12-26 15:27:20 -08:00
|
|
|
EAPI int ECORE_WL_EVENT_MOUSE_IN = 0;
|
|
|
|
EAPI int ECORE_WL_EVENT_MOUSE_OUT = 0;
|
|
|
|
EAPI int ECORE_WL_EVENT_FOCUS_IN = 0;
|
|
|
|
EAPI int ECORE_WL_EVENT_FOCUS_OUT = 0;
|
2012-02-28 13:55:51 -08:00
|
|
|
EAPI int ECORE_WL_EVENT_WINDOW_CONFIGURE = 0;
|
|
|
|
EAPI int ECORE_WL_EVENT_DND_ENTER = 0;
|
|
|
|
EAPI int ECORE_WL_EVENT_DND_POSITION = 0;
|
|
|
|
EAPI int ECORE_WL_EVENT_DND_LEAVE = 0;
|
|
|
|
EAPI int ECORE_WL_EVENT_DND_DROP = 0;
|
2012-03-07 13:46:52 -08:00
|
|
|
EAPI int ECORE_WL_EVENT_INTERFACES_BOUND = 0;
|
2012-02-28 13:55:51 -08:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @defgroup Ecore_Wl_Init_Group Wayland Library Init and Shutdown Functions
|
|
|
|
*
|
|
|
|
* Functions that start and shutdown the Ecore Wayland Library.
|
|
|
|
*/
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Initialize the Wayland display connection to the given display.
|
|
|
|
*
|
|
|
|
* @param name Display target name. if @c NULL, the default display is
|
|
|
|
* assumed.
|
|
|
|
* @return The number of times the library has been initialized without being
|
|
|
|
* shut down. 0 is returned if an error occurs.
|
|
|
|
*
|
|
|
|
* @ingroup Ecore_Wl_Init_Group
|
|
|
|
*/
|
2011-12-26 15:27:20 -08:00
|
|
|
EAPI int
|
2012-02-28 13:55:51 -08:00
|
|
|
ecore_wl_init(const char *name)
|
2011-12-26 15:27:20 -08:00
|
|
|
{
|
|
|
|
LOGFN(__FILE__, __LINE__, __FUNCTION__);
|
|
|
|
|
2012-02-28 13:55:51 -08:00
|
|
|
if (++_ecore_wl_init_count != 1) return _ecore_wl_init_count;
|
|
|
|
|
2011-12-26 15:27:20 -08:00
|
|
|
if (!eina_init()) return --_ecore_wl_init_count;
|
|
|
|
|
|
|
|
_ecore_wl_log_dom =
|
|
|
|
eina_log_domain_register("ecore_wl", ECORE_WL_DEFAULT_LOG_COLOR);
|
2012-02-28 13:55:51 -08:00
|
|
|
if (_ecore_wl_log_dom < 0)
|
2011-12-26 15:27:20 -08:00
|
|
|
{
|
2012-02-28 13:55:51 -08:00
|
|
|
EINA_LOG_ERR("Cannot create a log domain for Ecore Wayland");
|
2011-12-26 15:27:20 -08:00
|
|
|
eina_shutdown();
|
|
|
|
return --_ecore_wl_init_count;
|
|
|
|
}
|
|
|
|
|
2012-02-28 13:55:51 -08:00
|
|
|
if (!ecore_init())
|
2011-12-26 15:27:20 -08:00
|
|
|
{
|
2012-02-28 13:55:51 -08:00
|
|
|
ERR("Could not initialize ecore");
|
2011-12-26 15:27:20 -08:00
|
|
|
eina_log_domain_unregister(_ecore_wl_log_dom);
|
|
|
|
_ecore_wl_log_dom = -1;
|
|
|
|
eina_shutdown();
|
|
|
|
return --_ecore_wl_init_count;
|
|
|
|
}
|
|
|
|
|
2012-02-28 13:55:51 -08:00
|
|
|
if (!ecore_event_init())
|
2011-12-26 15:27:20 -08:00
|
|
|
{
|
2012-02-28 13:55:51 -08:00
|
|
|
ERR("Could not initialize ecore_event");
|
2011-12-26 15:27:20 -08:00
|
|
|
eina_log_domain_unregister(_ecore_wl_log_dom);
|
|
|
|
_ecore_wl_log_dom = -1;
|
|
|
|
ecore_shutdown();
|
|
|
|
eina_shutdown();
|
|
|
|
return --_ecore_wl_init_count;
|
|
|
|
}
|
|
|
|
|
2012-02-28 13:55:51 -08:00
|
|
|
if (!ECORE_WL_EVENT_MOUSE_IN)
|
2011-12-26 15:27:20 -08:00
|
|
|
{
|
|
|
|
ECORE_WL_EVENT_MOUSE_IN = ecore_event_type_new();
|
|
|
|
ECORE_WL_EVENT_MOUSE_OUT = ecore_event_type_new();
|
|
|
|
ECORE_WL_EVENT_FOCUS_IN = ecore_event_type_new();
|
|
|
|
ECORE_WL_EVENT_FOCUS_OUT = ecore_event_type_new();
|
2012-02-28 13:55:51 -08:00
|
|
|
ECORE_WL_EVENT_WINDOW_CONFIGURE = ecore_event_type_new();
|
|
|
|
ECORE_WL_EVENT_DND_ENTER = ecore_event_type_new();
|
|
|
|
ECORE_WL_EVENT_DND_POSITION = ecore_event_type_new();
|
|
|
|
ECORE_WL_EVENT_DND_LEAVE = ecore_event_type_new();
|
|
|
|
ECORE_WL_EVENT_DND_DROP = ecore_event_type_new();
|
2012-03-07 13:46:52 -08:00
|
|
|
ECORE_WL_EVENT_INTERFACES_BOUND = ecore_event_type_new();
|
2011-12-26 15:27:20 -08:00
|
|
|
}
|
|
|
|
|
2012-02-28 13:55:51 -08:00
|
|
|
if (!(_ecore_wl_disp = malloc(sizeof(Ecore_Wl_Display))))
|
2011-12-26 15:27:20 -08:00
|
|
|
{
|
2012-02-28 13:55:51 -08:00
|
|
|
ERR("Could not allocate memory for Ecore_Wl_Display structure");
|
2011-12-26 15:27:20 -08:00
|
|
|
eina_log_domain_unregister(_ecore_wl_log_dom);
|
|
|
|
_ecore_wl_log_dom = -1;
|
|
|
|
ecore_event_shutdown();
|
|
|
|
ecore_shutdown();
|
|
|
|
eina_shutdown();
|
|
|
|
return --_ecore_wl_init_count;
|
|
|
|
}
|
|
|
|
|
2012-02-28 13:55:51 -08:00
|
|
|
memset(_ecore_wl_disp, 0, sizeof(Ecore_Wl_Display));
|
|
|
|
|
|
|
|
if (!(_ecore_wl_disp->wl.display = wl_display_connect(name)))
|
2011-12-26 15:27:20 -08:00
|
|
|
{
|
2012-02-28 13:55:51 -08:00
|
|
|
ERR("Could not connect to Wayland display");
|
2011-12-26 15:27:20 -08:00
|
|
|
eina_log_domain_unregister(_ecore_wl_log_dom);
|
|
|
|
_ecore_wl_log_dom = -1;
|
|
|
|
ecore_event_shutdown();
|
|
|
|
ecore_shutdown();
|
|
|
|
eina_shutdown();
|
|
|
|
return --_ecore_wl_init_count;
|
|
|
|
}
|
|
|
|
|
2012-02-28 13:55:51 -08:00
|
|
|
_ecore_wl_disp->fd =
|
|
|
|
wl_display_get_fd(_ecore_wl_disp->wl.display,
|
|
|
|
_ecore_wl_cb_event_mask_update, _ecore_wl_disp);
|
2011-12-26 15:27:20 -08:00
|
|
|
|
2012-02-28 13:55:51 -08:00
|
|
|
_ecore_wl_disp->fd_hdl =
|
|
|
|
ecore_main_fd_handler_add(_ecore_wl_disp->fd, ECORE_FD_READ,
|
|
|
|
_ecore_wl_cb_handle_data, _ecore_wl_disp,
|
|
|
|
NULL, NULL);
|
2011-12-26 15:27:20 -08:00
|
|
|
|
2012-02-28 13:55:51 -08:00
|
|
|
wl_list_init(&_ecore_wl_disp->inputs);
|
|
|
|
wl_list_init(&_ecore_wl_disp->outputs);
|
2011-12-26 15:27:20 -08:00
|
|
|
|
2012-02-28 13:55:51 -08:00
|
|
|
wl_display_add_global_listener(_ecore_wl_disp->wl.display,
|
|
|
|
_ecore_wl_cb_handle_global, _ecore_wl_disp);
|
|
|
|
|
|
|
|
/* FIXME: Process connection events ?? */
|
|
|
|
/* wl_display_iterate(_ecore_wl_disp->wl.display, WL_DISPLAY_READABLE); */
|
|
|
|
|
2012-03-07 13:46:52 -08:00
|
|
|
/* if (!_ecore_wl_egl_init(_ecore_wl_disp)) */
|
|
|
|
/* { */
|
|
|
|
/* ERR("Could not initialize EGL"); */
|
|
|
|
/* free(_ecore_wl_disp); */
|
|
|
|
/* eina_log_domain_unregister(_ecore_wl_log_dom); */
|
|
|
|
/* _ecore_wl_log_dom = -1; */
|
|
|
|
/* ecore_event_shutdown(); */
|
|
|
|
/* ecore_shutdown(); */
|
|
|
|
/* eina_shutdown(); */
|
|
|
|
/* return --_ecore_wl_init_count; */
|
|
|
|
/* } */
|
|
|
|
|
|
|
|
/* _ecore_wl_disp->create_image = */
|
|
|
|
/* (void *)eglGetProcAddress("eglCreateImageKHR"); */
|
|
|
|
/* _ecore_wl_disp->destroy_image = */
|
|
|
|
/* (void *)eglGetProcAddress("eglDestroyImageKHR"); */
|
2011-12-26 15:27:20 -08:00
|
|
|
|
2012-02-28 13:55:51 -08:00
|
|
|
/* TODO: create pointer surfaces */
|
2011-12-26 15:27:20 -08:00
|
|
|
|
2012-02-28 13:55:51 -08:00
|
|
|
if (!_ecore_wl_xkb_init(_ecore_wl_disp))
|
|
|
|
{
|
|
|
|
ERR("Could not initialize XKB");
|
|
|
|
_ecore_wl_egl_shutdown(_ecore_wl_disp);
|
|
|
|
free(_ecore_wl_disp);
|
|
|
|
eina_log_domain_unregister(_ecore_wl_log_dom);
|
|
|
|
_ecore_wl_log_dom = -1;
|
|
|
|
ecore_event_shutdown();
|
|
|
|
ecore_shutdown();
|
|
|
|
eina_shutdown();
|
|
|
|
return --_ecore_wl_init_count;
|
|
|
|
}
|
2011-12-26 15:27:20 -08:00
|
|
|
|
2012-02-28 13:55:51 -08:00
|
|
|
_ecore_wl_window_init();
|
2011-12-26 15:27:20 -08:00
|
|
|
|
2012-02-28 13:55:51 -08:00
|
|
|
return _ecore_wl_init_count;
|
2011-12-26 15:27:20 -08:00
|
|
|
}
|
|
|
|
|
2012-02-28 13:55:51 -08:00
|
|
|
/**
|
|
|
|
* Shuts down the Ecore Wayland Library
|
|
|
|
*
|
|
|
|
* In shutting down the library, the Wayland display connection is terminated
|
|
|
|
* and any event handlers for it are removed.
|
|
|
|
*
|
|
|
|
* @return The number of times the library has been initialized without
|
|
|
|
* being shut down.
|
|
|
|
*
|
|
|
|
* @ingroup Ecore_Wl_Init_Group
|
|
|
|
*/
|
|
|
|
EAPI int
|
|
|
|
ecore_wl_shutdown(void)
|
2011-12-26 15:27:20 -08:00
|
|
|
{
|
2012-02-28 13:55:51 -08:00
|
|
|
LOGFN(__FILE__, __LINE__, __FUNCTION__);
|
2011-12-26 15:27:20 -08:00
|
|
|
|
2012-02-28 13:55:51 -08:00
|
|
|
return _ecore_wl_shutdown(EINA_TRUE);
|
2011-12-26 15:27:20 -08:00
|
|
|
}
|
|
|
|
|
2012-02-28 14:31:27 -08:00
|
|
|
/**
|
|
|
|
* @defgroup Ecore_Wl_Flush_Group Wayland Synchronization Functions
|
|
|
|
*
|
|
|
|
* Functions that ensure that all commands which have been issued by the
|
|
|
|
* Ecore Wayland library have been sent to the server.
|
|
|
|
*/
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Sends all Wayland commands to the Wayland Display.
|
|
|
|
*
|
|
|
|
* @ingroup Ecore_Wl_Flush_Group
|
|
|
|
* @since 1.2
|
|
|
|
*/
|
2011-12-26 15:27:20 -08:00
|
|
|
EAPI void
|
2012-02-28 13:55:51 -08:00
|
|
|
ecore_wl_flush(void)
|
2011-12-26 15:27:20 -08:00
|
|
|
{
|
2012-02-28 13:55:51 -08:00
|
|
|
LOGFN(__FILE__, __LINE__, __FUNCTION__);
|
2011-12-26 15:27:20 -08:00
|
|
|
|
2012-02-28 13:55:51 -08:00
|
|
|
while (_ecore_wl_disp->mask & WL_DISPLAY_WRITABLE)
|
|
|
|
wl_display_iterate(_ecore_wl_disp->wl.display, WL_DISPLAY_WRITABLE);
|
|
|
|
// wl_display_flush(_ecore_wl_disp->wl.display); // old flush code
|
2011-12-26 15:27:20 -08:00
|
|
|
}
|
|
|
|
|
2012-02-28 14:31:27 -08:00
|
|
|
/**
|
|
|
|
* Flushes the command buffer and waits until all requests have been
|
|
|
|
* processed by the server.
|
|
|
|
*
|
|
|
|
* @ingroup Ecore_Wl_Flush_Group
|
|
|
|
* @since 1.2
|
|
|
|
*/
|
2011-12-26 15:27:20 -08:00
|
|
|
EAPI void
|
2012-02-28 13:55:51 -08:00
|
|
|
ecore_wl_sync(void)
|
2011-12-26 15:27:20 -08:00
|
|
|
{
|
2012-02-28 13:55:51 -08:00
|
|
|
LOGFN(__FILE__, __LINE__, __FUNCTION__);
|
2011-12-26 15:27:20 -08:00
|
|
|
|
2012-02-28 13:55:51 -08:00
|
|
|
wl_display_roundtrip(_ecore_wl_disp->wl.display);
|
|
|
|
// old sync code
|
|
|
|
// wl_display_iterate(_ecore_wl_disp->wl.display, WL_DISPLAY_READABLE);
|
2012-01-03 12:37:30 -08:00
|
|
|
}
|
|
|
|
|
2012-02-28 14:31:27 -08:00
|
|
|
/**
|
|
|
|
* @defgroup Ecore_Wl_Display_Group Wayland Display Functions
|
|
|
|
*
|
|
|
|
* Functions that set and retrieve various information about the Wayland Display.
|
|
|
|
*/
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Retrieves the Wayland Shm Interface used for the current Wayland connection.
|
|
|
|
*
|
|
|
|
* @return The current wayland shm interface
|
|
|
|
*
|
|
|
|
* @ingroup Ecore_Wl_Display_Group
|
|
|
|
* @since 1.2
|
|
|
|
*/
|
2012-02-28 13:55:51 -08:00
|
|
|
EAPI struct wl_shm *
|
|
|
|
ecore_wl_shm_get(void)
|
2012-01-13 01:33:33 -08:00
|
|
|
{
|
2012-02-28 13:55:51 -08:00
|
|
|
return _ecore_wl_disp->wl.shm;
|
2012-01-13 01:33:33 -08:00
|
|
|
}
|
|
|
|
|
2012-02-28 14:31:27 -08:00
|
|
|
/**
|
|
|
|
* Retrieves the Wayland Display Interface used for the current Wayland connection.
|
|
|
|
*
|
|
|
|
* @return The current wayland display interface
|
|
|
|
*
|
|
|
|
* @ingroup Ecore_Wl_Display_Group
|
|
|
|
* @since 1.2
|
|
|
|
*/
|
2012-02-28 13:55:51 -08:00
|
|
|
EAPI struct wl_display *
|
|
|
|
ecore_wl_display_get(void)
|
2012-01-13 01:33:33 -08:00
|
|
|
{
|
2012-02-28 13:55:51 -08:00
|
|
|
return _ecore_wl_disp->wl.display;
|
2012-01-13 01:33:33 -08:00
|
|
|
}
|
|
|
|
|
2012-02-28 14:31:27 -08:00
|
|
|
/**
|
|
|
|
* Retrieves the size of the current screen.
|
|
|
|
*
|
|
|
|
* @param w where to return the width. May be NULL. Returns 0 on error.
|
|
|
|
* @param h where to return the height. May be NULL. Returns 0 on error.
|
|
|
|
*
|
|
|
|
* @ingroup Ecore_Wl_Display_Group
|
|
|
|
* @since 1.2
|
|
|
|
*/
|
2012-01-13 01:33:33 -08:00
|
|
|
EAPI void
|
2012-02-28 13:55:51 -08:00
|
|
|
ecore_wl_screen_size_get(int *w, int *h)
|
2012-01-13 01:33:33 -08:00
|
|
|
{
|
2012-02-28 13:55:51 -08:00
|
|
|
LOGFN(__FILE__, __LINE__, __FUNCTION__);
|
2012-01-13 01:33:33 -08:00
|
|
|
|
2012-02-28 13:55:51 -08:00
|
|
|
if (w) *w = _ecore_wl_disp->output->allocation.w;
|
|
|
|
if (h) *h = _ecore_wl_disp->output->allocation.h;
|
2012-01-13 01:33:33 -08:00
|
|
|
}
|
|
|
|
|
2012-03-01 05:43:41 -08:00
|
|
|
/* @since 1.2 */
|
|
|
|
EAPI void
|
2012-03-05 08:50:20 -08:00
|
|
|
ecore_wl_pointer_xy_get(int *x, int *y)
|
2012-03-01 05:43:41 -08:00
|
|
|
{
|
|
|
|
LOGFN(__FILE__, __LINE__, __FUNCTION__);
|
|
|
|
|
2012-03-05 08:50:20 -08:00
|
|
|
_ecore_wl_input_pointer_xy_get(x, y);
|
2012-03-01 05:43:41 -08:00
|
|
|
}
|
|
|
|
|
2011-12-26 15:27:20 -08:00
|
|
|
/* local functions */
|
|
|
|
static Eina_Bool
|
2012-02-28 13:55:51 -08:00
|
|
|
_ecore_wl_shutdown(Eina_Bool close)
|
2011-12-26 15:27:20 -08:00
|
|
|
{
|
|
|
|
LOGFN(__FILE__, __LINE__, __FUNCTION__);
|
|
|
|
|
2012-02-28 13:55:51 -08:00
|
|
|
if (--_ecore_wl_init_count != 0) return _ecore_wl_init_count;
|
2011-12-26 15:27:20 -08:00
|
|
|
if (!_ecore_wl_disp) return _ecore_wl_init_count;
|
|
|
|
|
2012-02-28 13:55:51 -08:00
|
|
|
_ecore_wl_window_shutdown();
|
2011-12-26 15:27:20 -08:00
|
|
|
|
2012-02-28 13:55:51 -08:00
|
|
|
if (_ecore_wl_disp->fd_hdl)
|
|
|
|
ecore_main_fd_handler_del(_ecore_wl_disp->fd_hdl);
|
2011-12-26 15:27:20 -08:00
|
|
|
|
2012-02-28 13:55:51 -08:00
|
|
|
if (close)
|
2011-12-26 15:27:20 -08:00
|
|
|
{
|
2012-02-28 13:55:51 -08:00
|
|
|
Ecore_Wl_Output *out, *tout;
|
|
|
|
Ecore_Wl_Input *in, *tin;
|
|
|
|
|
|
|
|
wl_list_for_each_safe(out, tout, &_ecore_wl_disp->outputs, link)
|
|
|
|
_ecore_wl_output_del(out);
|
|
|
|
|
|
|
|
wl_list_for_each_safe(in, tin, &_ecore_wl_disp->inputs, link)
|
|
|
|
_ecore_wl_input_del(in);
|
|
|
|
|
|
|
|
_ecore_wl_xkb_shutdown(_ecore_wl_disp);
|
2012-03-07 13:46:52 -08:00
|
|
|
/* _ecore_wl_egl_shutdown(_ecore_wl_disp); */
|
2012-02-28 13:55:51 -08:00
|
|
|
|
|
|
|
if (_ecore_wl_disp->wl.shell)
|
|
|
|
wl_shell_destroy(_ecore_wl_disp->wl.shell);
|
|
|
|
if (_ecore_wl_disp->wl.shm) wl_shm_destroy(_ecore_wl_disp->wl.shm);
|
|
|
|
if (_ecore_wl_disp->wl.data_device_manager)
|
|
|
|
wl_data_device_manager_destroy(_ecore_wl_disp->wl.data_device_manager);
|
|
|
|
if (_ecore_wl_disp->wl.compositor)
|
|
|
|
wl_compositor_destroy(_ecore_wl_disp->wl.compositor);
|
|
|
|
if (_ecore_wl_disp->wl.display)
|
2012-01-12 22:34:40 -08:00
|
|
|
{
|
2012-02-28 13:55:51 -08:00
|
|
|
wl_display_flush(_ecore_wl_disp->wl.display);
|
|
|
|
wl_display_destroy(_ecore_wl_disp->wl.display);
|
2012-01-12 22:34:40 -08:00
|
|
|
}
|
2012-02-28 13:55:51 -08:00
|
|
|
free(_ecore_wl_disp);
|
2011-12-26 15:27:20 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
ecore_event_shutdown();
|
|
|
|
ecore_shutdown();
|
2012-02-28 13:55:51 -08:00
|
|
|
|
|
|
|
eina_log_domain_unregister(_ecore_wl_log_dom);
|
|
|
|
_ecore_wl_log_dom = -1;
|
2011-12-26 15:27:20 -08:00
|
|
|
eina_shutdown();
|
|
|
|
|
|
|
|
return _ecore_wl_init_count;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
2012-02-28 13:55:51 -08:00
|
|
|
_ecore_wl_cb_event_mask_update(unsigned int mask, void *data)
|
2011-12-26 15:27:20 -08:00
|
|
|
{
|
2012-02-28 13:55:51 -08:00
|
|
|
Ecore_Wl_Display *ewd;
|
2011-12-26 15:27:20 -08:00
|
|
|
|
2012-02-28 13:55:51 -08:00
|
|
|
LOGFN(__FILE__, __LINE__, __FUNCTION__);
|
2012-01-09 02:50:26 -08:00
|
|
|
|
2012-02-28 13:55:51 -08:00
|
|
|
ewd = data;
|
|
|
|
ewd->mask = mask;
|
2011-12-26 15:27:20 -08:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static Eina_Bool
|
2012-02-28 13:55:51 -08:00
|
|
|
_ecore_wl_cb_handle_data(void *data, Ecore_Fd_Handler *hdl __UNUSED__)
|
2011-12-26 15:27:20 -08:00
|
|
|
{
|
2012-02-28 13:55:51 -08:00
|
|
|
Ecore_Wl_Display *ewd;
|
2011-12-26 15:27:20 -08:00
|
|
|
|
2012-02-28 13:55:51 -08:00
|
|
|
LOGFN(__FILE__, __LINE__, __FUNCTION__);
|
2011-12-26 15:27:20 -08:00
|
|
|
|
2012-02-28 13:55:51 -08:00
|
|
|
if (!(ewd = data)) return ECORE_CALLBACK_RENEW;
|
|
|
|
wl_display_iterate(ewd->wl.display, ewd->mask);
|
2011-12-26 15:27:20 -08:00
|
|
|
return ECORE_CALLBACK_RENEW;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2012-02-28 13:55:51 -08:00
|
|
|
_ecore_wl_cb_handle_global(struct wl_display *disp, unsigned int id, const char *interface, unsigned int version __UNUSED__, void *data)
|
2011-12-26 15:27:20 -08:00
|
|
|
{
|
2012-02-28 13:55:51 -08:00
|
|
|
Ecore_Wl_Display *ewd;
|
2011-12-26 15:27:20 -08:00
|
|
|
|
2012-02-09 00:15:10 -08:00
|
|
|
LOGFN(__FILE__, __LINE__, __FUNCTION__);
|
|
|
|
|
2012-03-07 13:46:52 -08:00
|
|
|
if ((!strcmp(interface, "wl_display")) ||
|
|
|
|
(!strcmp(interface, "wl_drm")) ||
|
|
|
|
(!strcmp(interface, "desktop_shell")))
|
|
|
|
return;
|
|
|
|
|
2012-02-28 13:55:51 -08:00
|
|
|
ewd = data;
|
2012-03-07 13:46:52 -08:00
|
|
|
|
2012-02-28 13:55:51 -08:00
|
|
|
if (!strcmp(interface, "wl_compositor"))
|
|
|
|
ewd->wl.compositor = wl_display_bind(disp, id, &wl_compositor_interface);
|
|
|
|
else if (!strcmp(interface, "wl_output"))
|
|
|
|
_ecore_wl_output_add(ewd, id);
|
|
|
|
else if (!strcmp(interface, "wl_input_device"))
|
|
|
|
_ecore_wl_input_add(ewd, id);
|
|
|
|
else if (!strcmp(interface, "wl_shell"))
|
|
|
|
ewd->wl.shell = wl_display_bind(disp, id, &wl_shell_interface);
|
|
|
|
else if (!strcmp(interface, "wl_shm"))
|
|
|
|
ewd->wl.shm = wl_display_bind(disp, id, &wl_shm_interface);
|
|
|
|
else if (!strcmp(interface, "wl_data_device_manager"))
|
2011-12-26 15:27:20 -08:00
|
|
|
{
|
2012-02-28 13:55:51 -08:00
|
|
|
ewd->wl.data_device_manager =
|
|
|
|
wl_display_bind(disp, id, &wl_data_device_manager_interface);
|
2011-12-26 15:27:20 -08:00
|
|
|
}
|
2012-03-07 13:46:52 -08:00
|
|
|
|
|
|
|
if ((ewd->wl.compositor) && (ewd->wl.shm) && (ewd->wl.shell))
|
|
|
|
{
|
|
|
|
Ecore_Wl_Event_Interfaces_Bound *ev;
|
|
|
|
|
|
|
|
if (!(ev = calloc(1, sizeof(Ecore_Wl_Event_Interfaces_Bound))))
|
|
|
|
return;
|
|
|
|
|
|
|
|
ev->compositor = (ewd->wl.compositor != NULL);
|
|
|
|
ev->shm = (ewd->wl.shm != NULL);
|
|
|
|
ev->shell = (ewd->wl.shell != NULL);
|
|
|
|
|
|
|
|
ecore_event_add(ECORE_WL_EVENT_INTERFACES_BOUND, ev,
|
|
|
|
_ecore_wl_cb_interfaces_bound_free, NULL);
|
|
|
|
}
|
2011-12-26 15:27:20 -08:00
|
|
|
}
|
|
|
|
|
2012-02-28 13:55:51 -08:00
|
|
|
static Eina_Bool
|
|
|
|
_ecore_wl_egl_init(Ecore_Wl_Display *ewd)
|
2011-12-26 15:27:20 -08:00
|
|
|
{
|
2012-02-28 13:55:51 -08:00
|
|
|
EGLint major, minor, n;
|
|
|
|
static const EGLint context_attribs[] =
|
2012-01-09 02:50:26 -08:00
|
|
|
{
|
2012-02-28 13:55:51 -08:00
|
|
|
EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE
|
|
|
|
};
|
|
|
|
static const EGLint argb_attribs[] =
|
2011-12-26 15:27:20 -08:00
|
|
|
{
|
2012-02-28 13:55:51 -08:00
|
|
|
EGL_RED_SIZE, 8, EGL_GREEN_SIZE, 8, EGL_BLUE_SIZE, 8,
|
|
|
|
EGL_ALPHA_SIZE, 1, EGL_DEPTH_SIZE, 0, EGL_STENCIL_SIZE, 0,
|
|
|
|
EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, EGL_SURFACE_TYPE,
|
|
|
|
EGL_WINDOW_BIT, EGL_NONE
|
|
|
|
};
|
2011-12-26 15:27:20 -08:00
|
|
|
|
2012-02-09 00:15:10 -08:00
|
|
|
LOGFN(__FILE__, __LINE__, __FUNCTION__);
|
|
|
|
|
2012-02-28 13:55:51 -08:00
|
|
|
ewd->egl.display = eglGetDisplay(ewd->wl.display);
|
|
|
|
if (!eglInitialize(ewd->egl.display, &major, &minor))
|
2012-01-08 03:29:04 -08:00
|
|
|
{
|
2012-02-28 13:55:51 -08:00
|
|
|
ERR("Failed to initialize EGL display");
|
|
|
|
return EINA_FALSE;
|
2012-01-08 03:29:04 -08:00
|
|
|
}
|
2012-01-12 17:26:52 -08:00
|
|
|
|
2012-02-28 13:55:51 -08:00
|
|
|
if (!eglBindAPI(EGL_OPENGL_ES_API))
|
2012-01-12 17:26:52 -08:00
|
|
|
{
|
2012-02-28 13:55:51 -08:00
|
|
|
ERR("Failed to bind EGL Api");
|
|
|
|
return EINA_FALSE;
|
2012-01-12 17:26:52 -08:00
|
|
|
}
|
|
|
|
|
2012-02-28 13:55:51 -08:00
|
|
|
if ((!eglChooseConfig(ewd->egl.display, argb_attribs, &ewd->egl.argb_config,
|
|
|
|
1, &n)) || (n == 0))
|
2012-01-12 17:26:52 -08:00
|
|
|
{
|
2012-02-28 13:55:51 -08:00
|
|
|
ERR("Failed to choose ARGB config");
|
|
|
|
return EINA_FALSE;
|
2012-01-12 17:26:52 -08:00
|
|
|
}
|
|
|
|
|
2012-02-28 13:55:51 -08:00
|
|
|
ewd->egl.argb_context =
|
|
|
|
eglCreateContext(ewd->egl.display, ewd->egl.argb_config,
|
|
|
|
EGL_NO_CONTEXT, context_attribs);
|
|
|
|
if (!ewd->egl.argb_context)
|
2012-01-12 17:26:52 -08:00
|
|
|
{
|
2012-02-28 13:55:51 -08:00
|
|
|
ERR("Failed to create ARGB context");
|
|
|
|
return EINA_FALSE;
|
2012-01-12 17:26:52 -08:00
|
|
|
}
|
|
|
|
|
2012-02-28 13:55:51 -08:00
|
|
|
if (!eglMakeCurrent(ewd->egl.display, EGL_NO_SURFACE,
|
|
|
|
EGL_NO_SURFACE, ewd->egl.argb_context))
|
2012-01-04 00:27:31 -08:00
|
|
|
{
|
2012-02-28 13:55:51 -08:00
|
|
|
ERR("Failed to make ARGB context current");
|
|
|
|
return EINA_FALSE;
|
2012-01-04 00:27:31 -08:00
|
|
|
}
|
|
|
|
|
2012-02-28 13:55:51 -08:00
|
|
|
return EINA_TRUE;
|
2012-01-04 00:27:31 -08:00
|
|
|
}
|
|
|
|
|
2012-02-28 13:55:51 -08:00
|
|
|
static Eina_Bool
|
|
|
|
_ecore_wl_egl_shutdown(Ecore_Wl_Display *ewd)
|
2011-12-26 15:27:20 -08:00
|
|
|
{
|
2012-02-28 13:55:51 -08:00
|
|
|
LOGFN(__FILE__, __LINE__, __FUNCTION__);
|
2011-12-26 15:27:20 -08:00
|
|
|
|
2012-02-28 13:55:51 -08:00
|
|
|
eglMakeCurrent(ewd->egl.display,
|
|
|
|
EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
|
2011-12-26 15:27:20 -08:00
|
|
|
|
2012-02-28 13:55:51 -08:00
|
|
|
eglDestroyContext(ewd->egl.display, ewd->egl.argb_context);
|
2011-12-26 15:27:20 -08:00
|
|
|
|
2012-02-28 13:55:51 -08:00
|
|
|
/* NB: This is hanging when we run elm apps as wayland clients
|
|
|
|
* inside the weston compositor */
|
2011-12-26 15:27:20 -08:00
|
|
|
|
2012-02-28 13:55:51 -08:00
|
|
|
/* printf("Egl Terminate\n"); */
|
|
|
|
/* eglTerminate(ewd->egl.display); */
|
|
|
|
/* printf("Egl Terminate Done\n"); */
|
2011-12-26 15:27:20 -08:00
|
|
|
|
2012-02-28 13:55:51 -08:00
|
|
|
eglReleaseThread();
|
2011-12-26 15:27:20 -08:00
|
|
|
|
2012-02-28 13:55:51 -08:00
|
|
|
return EINA_TRUE;
|
2011-12-26 15:27:20 -08:00
|
|
|
}
|
|
|
|
|
2012-02-28 13:55:51 -08:00
|
|
|
static Eina_Bool
|
|
|
|
_ecore_wl_xkb_init(Ecore_Wl_Display *ewd)
|
2012-01-08 03:29:04 -08:00
|
|
|
{
|
2012-02-28 13:55:51 -08:00
|
|
|
struct xkb_rule_names names;
|
2012-01-08 03:29:04 -08:00
|
|
|
|
2012-02-09 00:15:10 -08:00
|
|
|
LOGFN(__FILE__, __LINE__, __FUNCTION__);
|
|
|
|
|
2012-02-28 13:55:51 -08:00
|
|
|
names.rules = "evdev";
|
|
|
|
names.model = "evdev";
|
|
|
|
names.layout = "us";
|
|
|
|
names.variant = "";
|
|
|
|
names.options = "";
|
2012-01-08 03:29:04 -08:00
|
|
|
|
2012-02-28 13:55:51 -08:00
|
|
|
if (!(ewd->xkb = xkb_compile_keymap_from_rules(&names)))
|
2012-01-08 03:29:04 -08:00
|
|
|
{
|
2012-02-28 13:55:51 -08:00
|
|
|
ERR("Failed to compile keymap");
|
|
|
|
return EINA_FALSE;
|
2012-01-08 03:29:04 -08:00
|
|
|
}
|
|
|
|
|
2012-02-28 13:55:51 -08:00
|
|
|
return EINA_TRUE;
|
2012-01-08 03:29:04 -08:00
|
|
|
}
|
|
|
|
|
2012-02-28 13:55:51 -08:00
|
|
|
static Eina_Bool
|
|
|
|
_ecore_wl_xkb_shutdown(Ecore_Wl_Display *ewd)
|
2012-01-08 03:29:04 -08:00
|
|
|
{
|
2012-02-09 00:15:10 -08:00
|
|
|
LOGFN(__FILE__, __LINE__, __FUNCTION__);
|
|
|
|
|
2012-02-28 13:55:51 -08:00
|
|
|
if (ewd->xkb) xkb_free_keymap(ewd->xkb);
|
|
|
|
return EINA_TRUE;
|
2011-12-26 15:27:20 -08:00
|
|
|
}
|
2012-03-07 13:46:52 -08:00
|
|
|
|
|
|
|
static void
|
|
|
|
_ecore_wl_cb_interfaces_bound_free(void *data __UNUSED__, void *event)
|
|
|
|
{
|
|
|
|
Ecore_Wl_Event_Interfaces_Bound *ev;
|
|
|
|
|
|
|
|
LOGFN(__FILE__, __LINE__, __FUNCTION__);
|
|
|
|
|
|
|
|
if ((ev = event)) free(ev);
|
|
|
|
}
|