#include "e.h" #ifdef HAVE_WAYLAND_CLIENTS # include # include "e_comp_wl.h" # include "e_comp_wl_comp.h" # include "e_comp_wl_output.h" # include "e_comp_wl_input.h" # include "e_comp_wl_shell.h" #endif /* local function prototypes */ static Eina_Bool _e_comp_wl_fd_handle(void *data, Ecore_Fd_Handler *hdl); /* private variables */ static Ecore_Fd_Handler *_wl_fd_handler = NULL; /* extern variables */ struct wl_display *_wl_disp; Eina_Bool e_comp_wl_init(void) { struct wl_event_loop *loop; int fd = 0; LOGFN(__FILE__, __LINE__, __FUNCTION__); /* init wayland display */ if (!(_wl_disp = wl_display_create())) { EINA_LOG_ERR("Failed to create wayland display\n"); return EINA_FALSE; } if (wl_display_add_socket(_wl_disp, NULL)) { wl_display_terminate(_wl_disp); EINA_LOG_ERR("Failed to add socket to wayland display\n"); return EINA_FALSE; } /* init a wayland compositor ?? */ if (!e_comp_wl_comp_init()) { wl_display_terminate(_wl_disp); EINA_LOG_ERR("Failed to create wayland compositor\n"); return EINA_FALSE; } /* init output */ if (!e_comp_wl_output_init()) { e_comp_wl_comp_shutdown(); wl_display_terminate(_wl_disp); EINA_LOG_ERR("Failed to create wayland output\n"); return EINA_FALSE; } /* init input */ if (!e_comp_wl_input_init()) { e_comp_wl_output_shutdown(); e_comp_wl_comp_shutdown(); wl_display_terminate(_wl_disp); EINA_LOG_ERR("Failed to create wayland input\n"); return EINA_FALSE; } /* init a wayland shell */ if (!e_comp_wl_shell_init()) { e_comp_wl_input_shutdown(); e_comp_wl_output_shutdown(); e_comp_wl_comp_shutdown(); wl_display_terminate(_wl_disp); EINA_LOG_ERR("Failed to create wayland shell\n"); return EINA_FALSE; } loop = wl_display_get_event_loop(_wl_disp); fd = wl_event_loop_get_fd(loop); _wl_fd_handler = ecore_main_fd_handler_add(fd, ECORE_FD_READ,// | ECORE_FD_WRITE, _e_comp_wl_fd_handle, NULL, NULL, NULL); wl_event_loop_dispatch(loop, 0); return EINA_TRUE; } void e_comp_wl_shutdown(void) { LOGFN(__FILE__, __LINE__, __FUNCTION__); if (_wl_fd_handler) ecore_main_fd_handler_del(_wl_fd_handler); _wl_fd_handler = NULL; e_comp_wl_shell_shutdown(); e_comp_wl_input_shutdown(); e_comp_wl_output_shutdown(); e_comp_wl_comp_shutdown(); if (_wl_disp) wl_display_terminate(_wl_disp); _wl_disp = NULL; } uint32_t e_comp_wl_time_get(void) { struct timeval tv; gettimeofday(&tv, NULL); return tv.tv_sec * 1000 + tv.tv_usec / 1000; } Ecore_X_Pixmap e_comp_wl_pixmap_get(Ecore_X_Window win) { /* Wayland_Compositor *comp; */ /* Wayland_Surface *ws; */ Ecore_X_Pixmap pmap = 0; /* LOGFN(__FILE__, __LINE__, __FUNCTION__); */ /* comp = e_comp_wl_comp_get(); */ /* if (wl_list_empty(&comp->surfaces)) return 0; */ /* wl_list_for_each(ws, &comp->surfaces, link) */ /* { */ /* if (!ws->buffer) continue; */ /* if (((ws->win) && (ws->win->border)) */ /* && (ws->win->border->win == win)) */ /* { */ /* Ecore_X_Connection *conn; */ /* xcb_gc_t gc; */ /* uint8_t *pix = 0; */ /* int depth; */ /* if (ws->buffer) */ /* { */ /* if (wl_buffer_is_shm(ws->buffer)) */ /* pix = (uint8_t *)wl_shm_buffer_get_data(ws->buffer); */ /* else */ /* { */ /* if (ws->texture) pix = (uint8_t *)ws->texture; */ /* else if (ws->saved_texture) */ /* pix = (uint8_t *)ws->saved_texture; */ /* } */ /* } */ /* else if (ws->image) */ /* { */ /* if (ws->texture) pix = (uint8_t *)ws->texture; */ /* else if (ws->saved_texture) */ /* pix = (uint8_t *)ws->saved_texture; */ /* } */ /* if (!pix) return 0; */ /* depth = ecore_x_window_depth_get(win); */ /* conn = ecore_x_connection_get(); */ /* pmap = xcb_generate_id(conn); */ /* xcb_create_pixmap(conn, depth, pmap, win, ws->w, ws->h); */ /* gc = xcb_generate_id(conn); */ /* xcb_put_image(conn, 2, pmap, gc, ws->w, ws->h, */ /* 0, 0, 0, depth, */ /* (ws->w * ws->h * sizeof(int)), pix); */ /* xcb_free_gc(conn, gc); */ /* xcb_free_pixmap(conn, pmap); */ /* } */ /* } */ return pmap; } /* local functions */ static Eina_Bool _e_comp_wl_fd_handle(void *data __UNUSED__, Ecore_Fd_Handler *hdl) { struct wl_event_loop *loop; loop = wl_display_get_event_loop(_wl_disp); wl_event_loop_dispatch(loop, 0); return ECORE_CALLBACK_RENEW; }