])
AM_CONDITIONAL([HAVE_WL_X11], [test "x${WL_X11}" = "xtrue"])
+WL_WL=false
+define([CHECK_MODULE_WL_WL],
+[
+ if test "x${have_wayland}" = "xyes"; then
+ WL_WL=true
+ else
+ WL_WL=false
+ fi
+])
+AM_CONDITIONAL([HAVE_WL_WL], [test "x${WL_WL}" = "xtrue"])
+
WL_DESKTOP_SHELL=false
define([CHECK_MODULE_WL_DESKTOP_SHELL],
[
AC_E_OPTIONAL_MODULE([packagekit], true)
AC_E_OPTIONAL_MODULE([wl_desktop_shell], $have_wayland, [CHECK_MODULE_WL_DESKTOP_SHELL])
AC_E_OPTIONAL_MODULE([wl_x11], $have_wayland, [CHECK_MODULE_WL_X11])
+AC_E_OPTIONAL_MODULE([wl_wl], $have_wayland, [CHECK_MODULE_WL_WL])
#AC_E_OPTIONAL_MODULE([wl_fb], $have_wayland, [CHECK_MODULE_WL_FB])
AC_E_OPTIONAL_MODULE([wl_drm], $have_wayland, [CHECK_MODULE_WL_DRM])
AC_E_OPTIONAL_MODULE([policy_mobile], true)
/* free handlers */
E_FREE_LIST(handlers, ecore_event_handler_del);
+ while (e_comp->wl_comp_data->wl.globals)
+ {
+ Ecore_Wl_Global *global = EINA_INLIST_CONTAINER_GET(e_comp->wl_comp_data->wl.globals, Ecore_Wl_Global);
+ e_comp->wl_comp_data->wl.globals =
+ eina_inlist_remove(e_comp->wl_comp_data->wl.globals,
+ e_comp->wl_comp_data->wl.globals);
+ free(global->interface);
+ free(global);
+ }
+ if (e_comp->wl_comp_data->wl.shm) wl_shm_destroy(e_comp->wl_comp_data->wl.shm);
+
/* shutdown ecore_wayland */
ecore_wl_shutdown();
}
struct
{
struct wl_display *disp;
+ struct wl_registry *registry; // only used for nested wl compositors
struct wl_event_loop *loop;
+ Eina_Inlist *globals; // only used for nested wl compositors
+ struct wl_shm *shm; // only used for nested wl compositors
} wl;
struct
"wizard",
"wl_desktop_shell",
"wl_x11",
+ "wl_wl",
"wl_drm",
"wl_screenshot",
"wl_shell",
include src/modules/Makefile_wl_drm.mk
+include src/modules/Makefile_wl_wl.mk
+
include src/modules/Makefile_wl_desktop_shell.mk
include src/modules/Makefile_wl_x11.mk
--- /dev/null
+if USE_MODULE_WL_WL
+wl_wldir = $(MDIR)/wl_wl
+
+wl_wlpkgdir = $(MDIR)/wl_wl/$(MODULE_ARCH)
+wl_wlpkg_LTLIBRARIES = src/modules/wl_wl/module.la
+
+src_modules_wl_wl_module_la_DEPENDENCIES = $(MDEPENDENCIES)
+src_modules_wl_wl_module_la_CPPFLAGS = $(MOD_CPPFLAGS) @WAYLAND_CFLAGS@
+src_modules_wl_wl_module_la_LIBADD = $(LIBS) @WAYLAND_LIBS@
+src_modules_wl_wl_module_la_LDFLAGS = $(MOD_LDFLAGS)
+src_modules_wl_wl_module_la_SOURCES = \
+src/modules/wl_wl/e_mod_main.c \
+src/modules/wl_wl/wl.c
+
+PHONIES += wl_wl install-wl_wl
+wl_wl: $(wl_wlpkg_LTLIBRARIES) $(wl_wl_DATA)
+install-wl_wl: install-wl_wlpkgLTLIBRARIES
+endif
--- /dev/null
+#include "e.h"
+
+EINTERN void wl_wl_init(void);
+
+E_API E_Module_Api e_modapi = { E_MODULE_API_VERSION, "Wl_Wl" };
+
+static void
+_cb_delete_request(Ecore_Evas *ee EINA_UNUSED)
+{
+ ecore_main_loop_quit();
+}
+
+E_API void *
+e_modapi_init(E_Module *m)
+{
+ int w = 0, h = 0;
+
+ printf("LOAD WL_WL MODULE\n");
+
+ if (e_comp_config_get()->engine == E_COMP_ENGINE_GL)
+ {
+ e_comp->ee = ecore_evas_new("wayland_egl", 0, 0, 1, 1, NULL);
+ e_comp_gl_set(!!e_comp->ee);
+ }
+ if (!e_comp->ee)
+ {
+ if ((e_comp->ee = ecore_evas_new("wayland_shm", 0, 0, 1, 1, NULL)))
+ {
+ e_comp_gl_set(EINA_FALSE);
+ elm_config_accel_preference_set("none");
+ elm_config_accel_preference_override_set(EINA_TRUE);
+ elm_config_all_flush();
+ elm_config_save();
+ }
+ else
+ {
+ fprintf(stderr, "Could not create ecore_evas_drm canvas");
+ return NULL;
+ }
+ }
+ ecore_evas_callback_delete_request_set(e_comp->ee, _cb_delete_request);
+ ecore_evas_title_set(e_comp->ee, "Enlightenment: WL-WL");
+ ecore_evas_name_class_set(e_comp->ee, "E", "compositor");
+
+ ecore_evas_screen_geometry_get(e_comp->ee, NULL, NULL, &w, &h);
+
+ if (!e_comp_wl_init()) return NULL;
+ if (!e_comp_canvas_init(w * 3 / 4, h * 3 / 4)) return NULL;
+
+ ecore_evas_pointer_xy_get(e_comp->ee, &e_comp->wl_comp_data->ptr.x,
+ &e_comp->wl_comp_data->ptr.y);
+ e_comp_wl_input_pointer_enabled_set(EINA_TRUE);
+ e_comp_wl_input_keyboard_enabled_set(EINA_TRUE);
+ e_comp_wl_input_touch_enabled_set(EINA_TRUE);
+
+ /* e_comp->pointer = */
+ /* e_pointer_window_new(ecore_evas_window_get(e_comp->ee), EINA_TRUE); */
+ e_comp->pointer = e_pointer_canvas_new(e_comp->ee, EINA_TRUE);
+ e_comp->pointer->color = EINA_TRUE;
+
+ e_comp_wl_input_keymap_set(NULL, NULL, NULL);
+ wl_wl_init();
+
+ return m;
+}
+
+E_API int
+e_modapi_shutdown(E_Module *m EINA_UNUSED)
+{
+ return 1;
+}
--- /dev/null
+#include "e.h"
+
+static struct wl_display *disp;
+static Ecore_Fd_Handler *wl_fdh;
+
+static void
+_wl_handle_global(void *data EINA_UNUSED, struct wl_registry *registry EINA_UNUSED, unsigned int id, const char *interface, unsigned int version)
+{
+ Ecore_Wl_Global *global;
+
+ if (!(global = calloc(1, sizeof(Ecore_Wl_Global)))) return;
+
+ global->id = id;
+ global->interface = strdup(interface);
+ global->version = version;
+ e_comp->wl_comp_data->wl.globals = eina_inlist_append(e_comp->wl_comp_data->wl.globals, EINA_INLIST_GET(global));
+
+ if (!strcmp(interface, "wl_shm"))
+ e_comp->wl_comp_data->wl.shm = wl_registry_bind(registry, id, &wl_shm_interface, 1);
+}
+
+static void
+_wl_handle_global_remove(void *data EINA_UNUSED, struct wl_registry *registry EINA_UNUSED, unsigned int id)
+{
+ Ecore_Wl_Global *global;
+ Eina_Inlist *tmp;
+
+ EINA_INLIST_FOREACH_SAFE(e_comp->wl_comp_data->wl.globals, tmp, global)
+ {
+ if (global->id != id) continue;
+ e_comp->wl_comp_data->wl.globals =
+ eina_inlist_remove(e_comp->wl_comp_data->wl.globals, EINA_INLIST_GET(global));
+ free(global->interface);
+ free(global);
+ }
+}
+
+static const struct wl_registry_listener _global_registry_listener =
+{
+ _wl_handle_global,
+ _wl_handle_global_remove
+};
+
+
+static Eina_Bool
+_ecore_wl_cb_idle_enterer(void *data EINA_UNUSED)
+{
+ int ret = 0;
+
+ ret = wl_display_get_error(disp);
+ if (ret < 0) goto err;
+
+ ret = wl_display_dispatch_pending(disp);
+ if (ret < 0) goto err;
+
+ ret = wl_display_flush(disp);
+ if ((ret < 0) && (errno == EAGAIN))
+ ecore_main_fd_handler_active_set(wl_fdh, ECORE_FD_READ | ECORE_FD_WRITE);
+
+ return ECORE_CALLBACK_RENEW;
+
+err:
+ if ((ret < 0) && ((errno != EAGAIN) && (errno != EINVAL)))
+ {
+ /* raise exit signal */
+ fprintf(stderr, "Wayland socket error: %s\n", strerror(errno));
+ abort();
+
+ return ECORE_CALLBACK_CANCEL;
+ }
+
+ return ECORE_CALLBACK_RENEW;
+}
+
+
+static Eina_Bool
+_ecore_wl_cb_handle_data(void *data EINA_UNUSED, Ecore_Fd_Handler *hdl)
+{
+ int ret = 0;
+
+ if (ecore_main_fd_handler_active_get(hdl, ECORE_FD_ERROR))
+ {
+ fprintf(stderr, "Received error on wayland display fd\n");
+ abort();
+
+ return ECORE_CALLBACK_CANCEL;
+ }
+
+ if (ecore_main_fd_handler_active_get(hdl, ECORE_FD_READ))
+ ret = wl_display_dispatch(disp);
+ else if (ecore_main_fd_handler_active_get(hdl, ECORE_FD_WRITE))
+ {
+ ret = wl_display_flush(disp);
+ if (ret == 0)
+ ecore_main_fd_handler_active_set(hdl, ECORE_FD_READ);
+ }
+
+ if ((ret < 0) && ((errno != EAGAIN) && (errno != EINVAL)))
+ {
+ /* raise exit signal */
+ abort();
+
+ return ECORE_CALLBACK_CANCEL;
+ }
+
+ return ECORE_CALLBACK_RENEW;
+}
+
+EINTERN void
+wl_wl_init(void)
+{
+ disp = wl_display_connect(getenv("WAYLAND_DISPLAY"));
+ ecore_main_fd_handler_add(wl_display_get_fd(disp), ECORE_FD_READ | ECORE_FD_WRITE | ECORE_FD_ERROR,
+ _ecore_wl_cb_handle_data, NULL, NULL, NULL);
+ e_comp->wl_comp_data->wl.registry = wl_display_get_registry(disp);
+ wl_registry_add_listener(e_comp->wl_comp_data->wl.registry, &_global_registry_listener, NULL);
+ ecore_idle_enterer_add(_ecore_wl_cb_idle_enterer, NULL);
+}