forked from enlightenment/enlightenment
192 lines
4.9 KiB
C
192 lines
4.9 KiB
C
#include "e.h"
|
|
#ifdef HAVE_WAYLAND_CLIENTS
|
|
# include <xcb/xcb_image.h>
|
|
# 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;
|
|
}
|
|
|