enlightenment/src/bin/e_comp_wl.h

639 lines
16 KiB
C
Raw Normal View History

#ifdef E_TYPEDEFS
#else
# ifndef E_COMP_WL_H
# define E_COMP_WL_H
# define WL_HIDE_DEPRECATED
# include <pixman.h>
# include <wayland-server.h>
# include <xkbcommon/xkbcommon.h>
/* headers for terminal support */
# include <termios.h>
# include <linux/vt.h>
# 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
# ifdef HAVE_WAYLAND_EGL
# include <EGL/egl.h>
# include <EGL/eglext.h>
# endif
# define container_of(ptr, type, member) ({ \
const __typeof__(((type *)0)->member) *__mptr = (ptr); \
(type *)((char *)__mptr - offsetof(type,member));})
typedef enum _E_Wayland_Shell_Surface_Type E_Wayland_Shell_Surface_Type;
typedef struct _E_Wayland_Region E_Wayland_Region;
typedef struct _E_Wayland_Surface E_Wayland_Surface;
typedef struct _E_Wayland_Surface_Frame_Callback E_Wayland_Surface_Frame_Callback;
typedef struct _E_Wayland_Shell_Surface E_Wayland_Shell_Surface;
typedef struct _E_Wayland_Shell_Interface E_Wayland_Shell_Interface;
typedef struct _E_Wayland_Shell_Grab E_Wayland_Shell_Grab;
typedef struct _E_Wayland_Keyboard_Info E_Wayland_Keyboard_Info;
typedef struct _E_Wayland_Input E_Wayland_Input;
typedef struct _E_Wayland_Compositor E_Wayland_Compositor;
typedef struct _E_Wayland_Output E_Wayland_Output;
typedef struct _E_Wayland_Output_Mode E_Wayland_Output_Mode;
typedef struct _E_Wayland_Terminal E_Wayland_Terminal;
typedef struct _E_Wayland_Plane E_Wayland_Plane;
typedef struct _E_Wayland_Buffer E_Wayland_Buffer;
typedef struct _E_Wayland_Buffer_Reference E_Wayland_Buffer_Reference;
/*
* NB: All of these structs and interfaces were recently removed from
* wayland so for now, reimplement them here
*/
struct wl_seat;
struct wl_pointer;
struct wl_keyboard;
struct wl_touch;
struct wl_pointer_grab;
struct wl_pointer_grab_interface
{
void (*focus)(struct wl_pointer_grab *grab, struct wl_resource *surface, wl_fixed_t x, wl_fixed_t y);
void (*motion)(struct wl_pointer_grab *grab, unsigned int timestamp, wl_fixed_t x, wl_fixed_t y);
void (*button)(struct wl_pointer_grab *grab, unsigned int timestamp, unsigned int button, unsigned int state);
};
struct wl_pointer_grab
{
const struct wl_pointer_grab_interface *interface;
struct wl_pointer *pointer;
struct wl_resource *focus;
wl_fixed_t x, y;
unsigned int edges;
};
struct wl_keyboard_grab;
struct wl_keyboard_grab_interface
{
void (*key)(struct wl_keyboard_grab *grab, unsigned int timestamp, unsigned int key, unsigned int state);
void (*modifiers)(struct wl_keyboard_grab *grab, unsigned int serial, unsigned int mods_depressed, unsigned int mods_latched, unsigned int mods_locked, unsigned int group);
};
struct wl_keyboard_grab
{
const struct wl_keyboard_grab_interface *interface;
struct wl_keyboard *keyboard;
struct wl_resource *focus;
unsigned int key;
};
struct wl_touch_grab;
struct wl_touch_grab_interface
{
void (*down)(struct wl_touch_grab *grab, unsigned int timestamp, int touch_id, wl_fixed_t sx, wl_fixed_t sy);
void (*up)(struct wl_touch_grab *grab, unsigned int timestamp, int touch_id);
void (*motion)(struct wl_touch_grab *grab, unsigned int timestamp, int touch_id, wl_fixed_t sx, wl_fixed_t sy);
};
struct wl_touch_grab
{
const struct wl_touch_grab_interface *interface;
struct wl_touch *touch;
struct wl_resource *focus;
};
struct wl_pointer
{
struct wl_seat *seat;
struct wl_list resource_list;
struct wl_list focus_resource_list;
struct wl_resource *focus;
unsigned int focus_serial;
struct wl_signal focus_signal;
struct wl_pointer_grab *grab;
struct wl_pointer_grab default_grab;
wl_fixed_t grab_x, grab_y;
unsigned int grab_button;
unsigned int grab_serial;
unsigned int grab_time;
wl_fixed_t x, y;
struct wl_resource *current;
struct wl_listener current_listener;
wl_fixed_t current_x, current_y;
unsigned int button_count;
};
struct wl_keyboard
{
struct wl_seat *seat;
struct wl_list resource_list;
struct wl_list focus_resource_list;
struct wl_resource *focus;
unsigned int focus_serial;
struct wl_signal focus_signal;
struct wl_keyboard_grab *grab;
struct wl_keyboard_grab default_grab;
unsigned int grab_key;
unsigned int grab_serial;
unsigned int grab_time;
struct wl_array keys;
struct
{
unsigned int mods_depressed;
unsigned int mods_latched;
unsigned int mods_locked;
unsigned int group;
} modifiers;
};
struct wl_touch
{
struct wl_seat *seat;
struct wl_list resource_list;
struct wl_list focus_resource_list;
struct wl_resource *focus;
unsigned int focus_serial;
struct wl_signal focus_signal;
struct wl_touch_grab *grab;
struct wl_touch_grab default_grab;
wl_fixed_t grab_x, grab_y;
unsigned int grab_serial;
unsigned int grab_time;
};
struct wl_data_offer
{
struct wl_resource *resource;
struct wl_data_source *source;
struct wl_listener source_destroy_listener;
};
struct wl_data_source
{
struct wl_resource *resource;
struct wl_array mime_types;
struct wl_signal destroy_signal;
void (*accept)(struct wl_data_source *source,
uint32_t serial, const char *mime_type);
void (*send)(struct wl_data_source *source,
const char *mime_type, int32_t fd);
void (*cancel)(struct wl_data_source *source);
};
struct wl_seat
{
struct wl_list base_resource_list;
struct wl_signal destroy_signal;
struct wl_pointer *pointer;
struct wl_keyboard *keyboard;
struct wl_touch *touch;
unsigned int selection_serial;
struct wl_data_source *selection_data_source;
struct wl_listener selection_data_source_listener;
struct wl_signal selection_signal;
struct wl_list drag_resource_list;
struct wl_client *drag_client;
struct wl_data_source *drag_data_source;
struct wl_listener drag_data_source_listener;
struct wl_resource *drag_focus;
struct wl_resource *drag_focus_resource;
struct wl_listener drag_focus_listener;
struct wl_pointer_grab drag_grab;
struct wl_resource *drag_surface;
struct wl_listener drag_icon_listener;
struct wl_signal drag_icon_signal;
};
enum _E_Wayland_Shell_Surface_Type
{
E_WAYLAND_SHELL_SURFACE_TYPE_NONE,
E_WAYLAND_SHELL_SURFACE_TYPE_TOPLEVEL,
E_WAYLAND_SHELL_SURFACE_TYPE_TRANSIENT,
E_WAYLAND_SHELL_SURFACE_TYPE_FULLSCREEN,
E_WAYLAND_SHELL_SURFACE_TYPE_MAXIMIZED,
E_WAYLAND_SHELL_SURFACE_TYPE_POPUP
};
struct _E_Wayland_Region
{
struct
{
struct wl_resource *resource;
} wl;
pixman_region32_t region;
};
struct _E_Wayland_Surface_Frame_Callback
{
struct
{
struct wl_resource *resource;
struct wl_list link;
} wl;
};
struct _E_Wayland_Buffer
{
EINA_INLIST;
struct
{
struct wl_resource *resource;
struct wl_signal destroy_signal;
struct wl_listener destroy_listener;
union
{
struct wl_shm_buffer *shm_buffer;
void *legacy_buffer;
};
} wl;
int w, h;
unsigned int busy_count;
compositor rewrite / charlie-foxtrot situation huge fustercluck commit because there wasn't really a way to separate out the changes. better to just rip it all out at once. * compositor and window management completely rewritten. this was the goal for E19, but it pretty much required everything existing to be scrapped since it wasn't optimized, streamlined, or sensible. now instead of having the compositor strapped to the window manager like an outboard motor, it's housed more like an automobile engine. ** various comp structs have been merged into other places (eg. E_Comp_Zone is now just part of E_Zone where applicable), leading to a large deduplication of attributes ** awful E_Comp_Win is totally dead, having been replaced with e_comp_object smart objects which work just like normal canvas objects ** protocol-specific window management and compositor functionality is now kept exclusively in backend files ** e_pixmap api provides generic client finding and rendering api ** screen/xinerama screens are now provided directly by compositor on startup and re-set on change ** e_comp_render_update finally replaced with eina_tiler ** wayland compositor no longer creates X windows ** compositor e_layout removed entirely * e_container is gone. this was made unnecessary in E18, but I kept it to avoid having too much code churn in one release. its sole purpose was to catch some events and handle window stacking, both of which are now just done by the compositor infra * e_manager is just for screensaver and keybind stuff now, possibly remove later? * e_border is gone along with a lot of its api. e_client has replaced it, and e_client has been rewritten completely; some parts may be similar, but the design now relies upon having a functional compositor ** window configuration/focus functions are all removed. all windows are now managed solely with evas_object_X functions on the "frame" member of a client, just as any other canvas object can be managed. *** do NOT set interceptors on a client's comp_object. seriously. * startup order rewritten: compositor now starts much earlier, other things just use attrs and members of the compositor * ecore_x_pointer_xy_get usage replaced with ecore_evas_pointer_xy_get * e_popup is totally gone, existing usage replaced by e_comp_object_util_add where applicable, otherwise just placed normally on the canvas * deskmirror is (more) broken for now * illume is totally fucked * Ecore_X_Window replaced with Ecore_Window in most cases * edge binding XWindows replaced with regular canvas objects * some E_Win functionality has changed such that delete callbacks are now correctly called in ALL cases. various dialogs have been updated to not crash as a result comp files and descriptions: e_comp.c - overall compositor functions, rendering/update loop, shape cutting e_comp_x.c - X window management and compositor functionality e_comp_wl.c - Wayland surface management and compositor functionality e_comp_canvas.c - general compositor canvas functions and utilities e_comp_object.c - E_Client->frame member for managing clients as Evas_Objects, utility functions for adding objects to the compositor rendering systems additional authors: ivan.briano@intel.com feature: new compositor removal: e_border, e_container, e_popup
2014-01-14 17:19:12 -08:00
E_Wayland_Surface *ews;
};
struct _E_Wayland_Buffer_Reference
{
E_Wayland_Buffer *buffer;
struct wl_listener destroy_listener;
};
struct _E_Wayland_Surface
{
2013-08-18 19:31:24 -07:00
EINA_INLIST;
2013-09-11 01:01:18 -07:00
Ecore_Window id;
struct
{
compositor rewrite / charlie-foxtrot situation huge fustercluck commit because there wasn't really a way to separate out the changes. better to just rip it all out at once. * compositor and window management completely rewritten. this was the goal for E19, but it pretty much required everything existing to be scrapped since it wasn't optimized, streamlined, or sensible. now instead of having the compositor strapped to the window manager like an outboard motor, it's housed more like an automobile engine. ** various comp structs have been merged into other places (eg. E_Comp_Zone is now just part of E_Zone where applicable), leading to a large deduplication of attributes ** awful E_Comp_Win is totally dead, having been replaced with e_comp_object smart objects which work just like normal canvas objects ** protocol-specific window management and compositor functionality is now kept exclusively in backend files ** e_pixmap api provides generic client finding and rendering api ** screen/xinerama screens are now provided directly by compositor on startup and re-set on change ** e_comp_render_update finally replaced with eina_tiler ** wayland compositor no longer creates X windows ** compositor e_layout removed entirely * e_container is gone. this was made unnecessary in E18, but I kept it to avoid having too much code churn in one release. its sole purpose was to catch some events and handle window stacking, both of which are now just done by the compositor infra * e_manager is just for screensaver and keybind stuff now, possibly remove later? * e_border is gone along with a lot of its api. e_client has replaced it, and e_client has been rewritten completely; some parts may be similar, but the design now relies upon having a functional compositor ** window configuration/focus functions are all removed. all windows are now managed solely with evas_object_X functions on the "frame" member of a client, just as any other canvas object can be managed. *** do NOT set interceptors on a client's comp_object. seriously. * startup order rewritten: compositor now starts much earlier, other things just use attrs and members of the compositor * ecore_x_pointer_xy_get usage replaced with ecore_evas_pointer_xy_get * e_popup is totally gone, existing usage replaced by e_comp_object_util_add where applicable, otherwise just placed normally on the canvas * deskmirror is (more) broken for now * illume is totally fucked * Ecore_X_Window replaced with Ecore_Window in most cases * edge binding XWindows replaced with regular canvas objects * some E_Win functionality has changed such that delete callbacks are now correctly called in ALL cases. various dialogs have been updated to not crash as a result comp files and descriptions: e_comp.c - overall compositor functions, rendering/update loop, shape cutting e_comp_x.c - X window management and compositor functionality e_comp_wl.c - Wayland surface management and compositor functionality e_comp_canvas.c - general compositor canvas functions and utilities e_comp_object.c - E_Client->frame member for managing clients as Evas_Objects, utility functions for adding objects to the compositor rendering systems additional authors: ivan.briano@intel.com feature: new compositor removal: e_border, e_container, e_popup
2014-01-14 17:19:12 -08:00
struct wl_client *client;
struct wl_resource *surface;
struct wl_signal destroy_signal;
struct wl_list link, frames;
} wl;
struct
{
E_Wayland_Buffer *buffer;
struct wl_listener buffer_destroy;
struct wl_list frames;
Evas_Coord x, y;
Eina_Bool new_buffer : 1;
pixman_region32_t damage, opaque, input;
} pending;
E_Wayland_Buffer_Reference buffer_reference;
struct
{
Evas_Coord x, y;
Evas_Coord w, h;
Eina_Bool changed : 1;
} geometry;
struct
{
pixman_region32_t opaque, input;
pixman_region32_t damage, clip;
} region;
compositor rewrite / charlie-foxtrot situation huge fustercluck commit because there wasn't really a way to separate out the changes. better to just rip it all out at once. * compositor and window management completely rewritten. this was the goal for E19, but it pretty much required everything existing to be scrapped since it wasn't optimized, streamlined, or sensible. now instead of having the compositor strapped to the window manager like an outboard motor, it's housed more like an automobile engine. ** various comp structs have been merged into other places (eg. E_Comp_Zone is now just part of E_Zone where applicable), leading to a large deduplication of attributes ** awful E_Comp_Win is totally dead, having been replaced with e_comp_object smart objects which work just like normal canvas objects ** protocol-specific window management and compositor functionality is now kept exclusively in backend files ** e_pixmap api provides generic client finding and rendering api ** screen/xinerama screens are now provided directly by compositor on startup and re-set on change ** e_comp_render_update finally replaced with eina_tiler ** wayland compositor no longer creates X windows ** compositor e_layout removed entirely * e_container is gone. this was made unnecessary in E18, but I kept it to avoid having too much code churn in one release. its sole purpose was to catch some events and handle window stacking, both of which are now just done by the compositor infra * e_manager is just for screensaver and keybind stuff now, possibly remove later? * e_border is gone along with a lot of its api. e_client has replaced it, and e_client has been rewritten completely; some parts may be similar, but the design now relies upon having a functional compositor ** window configuration/focus functions are all removed. all windows are now managed solely with evas_object_X functions on the "frame" member of a client, just as any other canvas object can be managed. *** do NOT set interceptors on a client's comp_object. seriously. * startup order rewritten: compositor now starts much earlier, other things just use attrs and members of the compositor * ecore_x_pointer_xy_get usage replaced with ecore_evas_pointer_xy_get * e_popup is totally gone, existing usage replaced by e_comp_object_util_add where applicable, otherwise just placed normally on the canvas * deskmirror is (more) broken for now * illume is totally fucked * Ecore_X_Window replaced with Ecore_Window in most cases * edge binding XWindows replaced with regular canvas objects * some E_Win functionality has changed such that delete callbacks are now correctly called in ALL cases. various dialogs have been updated to not crash as a result comp files and descriptions: e_comp.c - overall compositor functions, rendering/update loop, shape cutting e_comp_x.c - X window management and compositor functionality e_comp_wl.c - Wayland surface management and compositor functionality e_comp_canvas.c - general compositor canvas functions and utilities e_comp_object.c - E_Client->frame member for managing clients as Evas_Objects, utility functions for adding objects to the compositor rendering systems additional authors: ivan.briano@intel.com feature: new compositor removal: e_border, e_container, e_popup
2014-01-14 17:19:12 -08:00
E_Client *ec;
E_Pixmap *pixmap;
Eina_Inlist *buffers;
E_Wayland_Shell_Surface *shell_surface;
Eina_Bool mapped : 1;
compositor rewrite / charlie-foxtrot situation huge fustercluck commit because there wasn't really a way to separate out the changes. better to just rip it all out at once. * compositor and window management completely rewritten. this was the goal for E19, but it pretty much required everything existing to be scrapped since it wasn't optimized, streamlined, or sensible. now instead of having the compositor strapped to the window manager like an outboard motor, it's housed more like an automobile engine. ** various comp structs have been merged into other places (eg. E_Comp_Zone is now just part of E_Zone where applicable), leading to a large deduplication of attributes ** awful E_Comp_Win is totally dead, having been replaced with e_comp_object smart objects which work just like normal canvas objects ** protocol-specific window management and compositor functionality is now kept exclusively in backend files ** e_pixmap api provides generic client finding and rendering api ** screen/xinerama screens are now provided directly by compositor on startup and re-set on change ** e_comp_render_update finally replaced with eina_tiler ** wayland compositor no longer creates X windows ** compositor e_layout removed entirely * e_container is gone. this was made unnecessary in E18, but I kept it to avoid having too much code churn in one release. its sole purpose was to catch some events and handle window stacking, both of which are now just done by the compositor infra * e_manager is just for screensaver and keybind stuff now, possibly remove later? * e_border is gone along with a lot of its api. e_client has replaced it, and e_client has been rewritten completely; some parts may be similar, but the design now relies upon having a functional compositor ** window configuration/focus functions are all removed. all windows are now managed solely with evas_object_X functions on the "frame" member of a client, just as any other canvas object can be managed. *** do NOT set interceptors on a client's comp_object. seriously. * startup order rewritten: compositor now starts much earlier, other things just use attrs and members of the compositor * ecore_x_pointer_xy_get usage replaced with ecore_evas_pointer_xy_get * e_popup is totally gone, existing usage replaced by e_comp_object_util_add where applicable, otherwise just placed normally on the canvas * deskmirror is (more) broken for now * illume is totally fucked * Ecore_X_Window replaced with Ecore_Window in most cases * edge binding XWindows replaced with regular canvas objects * some E_Win functionality has changed such that delete callbacks are now correctly called in ALL cases. various dialogs have been updated to not crash as a result comp files and descriptions: e_comp.c - overall compositor functions, rendering/update loop, shape cutting e_comp_x.c - X window management and compositor functionality e_comp_wl.c - Wayland surface management and compositor functionality e_comp_canvas.c - general compositor canvas functions and utilities e_comp_object.c - E_Client->frame member for managing clients as Evas_Objects, utility functions for adding objects to the compositor rendering systems additional authors: ivan.briano@intel.com feature: new compositor removal: e_border, e_container, e_popup
2014-01-14 17:19:12 -08:00
Eina_Bool updates : 1; //surface has render updates
E_Wayland_Input *input;
void (*map) (E_Wayland_Surface *ews, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h);
void (*unmap) (E_Wayland_Surface *ews);
void (*configure) (E_Wayland_Surface *ews, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h);
};
struct _E_Wayland_Shell_Surface
{
struct
{
struct wl_resource *resource;
struct wl_listener surface_destroy;
struct wl_signal destroy_signal;
struct wl_list link;
} wl;
struct
{
Evas_Coord x, y;
Evas_Coord w, h;
Eina_Bool valid : 1;
} saved;
struct
{
struct wl_pointer_grab grab;
struct wl_seat *seat;
struct wl_listener parent_destroy;
int x, y;
Eina_Bool up : 1;
unsigned int serial;
} popup;
struct
{
Evas_Coord x, y;
unsigned int flags;
} transient;
E_Wayland_Surface *surface, *parent;
E_Wayland_Shell_Surface_Type type, next_type;
compositor rewrite / charlie-foxtrot situation huge fustercluck commit because there wasn't really a way to separate out the changes. better to just rip it all out at once. * compositor and window management completely rewritten. this was the goal for E19, but it pretty much required everything existing to be scrapped since it wasn't optimized, streamlined, or sensible. now instead of having the compositor strapped to the window manager like an outboard motor, it's housed more like an automobile engine. ** various comp structs have been merged into other places (eg. E_Comp_Zone is now just part of E_Zone where applicable), leading to a large deduplication of attributes ** awful E_Comp_Win is totally dead, having been replaced with e_comp_object smart objects which work just like normal canvas objects ** protocol-specific window management and compositor functionality is now kept exclusively in backend files ** e_pixmap api provides generic client finding and rendering api ** screen/xinerama screens are now provided directly by compositor on startup and re-set on change ** e_comp_render_update finally replaced with eina_tiler ** wayland compositor no longer creates X windows ** compositor e_layout removed entirely * e_container is gone. this was made unnecessary in E18, but I kept it to avoid having too much code churn in one release. its sole purpose was to catch some events and handle window stacking, both of which are now just done by the compositor infra * e_manager is just for screensaver and keybind stuff now, possibly remove later? * e_border is gone along with a lot of its api. e_client has replaced it, and e_client has been rewritten completely; some parts may be similar, but the design now relies upon having a functional compositor ** window configuration/focus functions are all removed. all windows are now managed solely with evas_object_X functions on the "frame" member of a client, just as any other canvas object can be managed. *** do NOT set interceptors on a client's comp_object. seriously. * startup order rewritten: compositor now starts much earlier, other things just use attrs and members of the compositor * ecore_x_pointer_xy_get usage replaced with ecore_evas_pointer_xy_get * e_popup is totally gone, existing usage replaced by e_comp_object_util_add where applicable, otherwise just placed normally on the canvas * deskmirror is (more) broken for now * illume is totally fucked * Ecore_X_Window replaced with Ecore_Window in most cases * edge binding XWindows replaced with regular canvas objects * some E_Win functionality has changed such that delete callbacks are now correctly called in ALL cases. various dialogs have been updated to not crash as a result comp files and descriptions: e_comp.c - overall compositor functions, rendering/update loop, shape cutting e_comp_x.c - X window management and compositor functionality e_comp_wl.c - Wayland surface management and compositor functionality e_comp_canvas.c - general compositor canvas functions and utilities e_comp_object.c - E_Client->frame member for managing clients as Evas_Objects, utility functions for adding objects to the compositor rendering systems additional authors: ivan.briano@intel.com feature: new compositor removal: e_border, e_container, e_popup
2014-01-14 17:19:12 -08:00
Eina_Stringshare *title, *clas;
Eina_Bool active : 1;
void *shell;
void *ping_timer;
};
struct _E_Wayland_Shell_Interface
{
void *shell;
E_Wayland_Shell_Surface *(*shell_surface_create) (void *shell, E_Wayland_Surface *ews, const void *client);
void (*toplevel_set) (E_Wayland_Shell_Surface *ewss);
void (*transient_set) (E_Wayland_Shell_Surface *ewss, E_Wayland_Surface *ews, int x, int y, unsigned int flags);
void (*fullscreen_set) (E_Wayland_Shell_Surface *ewss, unsigned int method, unsigned int framerate, void *output);
void (*popup_set) (E_Wayland_Shell_Surface *ewss, E_Wayland_Surface *ews, void *seat, unsigned int serial, int x, int y, unsigned int flags);
void (*maximized_set) (E_Wayland_Shell_Surface *ewss, unsigned int edges);
int (*move) (E_Wayland_Shell_Surface *ewss, void *seat);
int (*resize) (E_Wayland_Shell_Surface *ewss, void *seat, unsigned int edges);
};
struct _E_Wayland_Shell_Grab
{
struct wl_pointer_grab grab;
Evas_Coord x, y, w, h;
unsigned int edges;
E_Wayland_Shell_Surface *shell_surface;
struct wl_listener shell_surface_destroy;
};
struct _E_Wayland_Keyboard_Info
{
struct xkb_keymap *keymap;
int fd;
size_t size;
char *area;
xkb_mod_index_t mod_shift, mod_caps, mod_ctrl, mod_alt, mod_super;
};
struct _E_Wayland_Input
{
struct
{
struct wl_seat seat;
struct wl_pointer pointer;
struct wl_keyboard keyboard;
struct wl_resource *keyboard_resource;
struct wl_list link;
} wl;
struct
{
E_Wayland_Keyboard_Info *info;
struct xkb_state *state;
} xkb;
struct
{
E_Wayland_Surface *surface;
struct wl_listener surface_destroy;
struct
{
Evas_Coord x, y;
} hot;
} pointer;
Eina_Bool has_pointer : 1;
Eina_Bool has_keyboard : 1;
Eina_Bool has_touch : 1;
};
struct _E_Wayland_Compositor
{
struct
{
struct wl_display *display;
struct wl_event_loop *loop;
} wl;
struct
{
struct wl_signal destroy;
struct wl_signal activate;
struct wl_signal kill;
struct wl_signal seat;
} signals;
struct
{
struct xkb_rule_names names;
struct xkb_context *context;
} xkb;
#ifdef HAVE_WAYLAND_EGL
struct
{
EGLDisplay display;
EGLContext context;
EGLConfig config;
PFNEGLBINDWAYLANDDISPLAYWL bind_display;
PFNEGLUNBINDWAYLANDDISPLAYWL unbind_display;
Eina_Bool bound : 1;
} egl;
#endif
E_Wayland_Shell_Interface shell_interface;
#ifdef WAYLAND_ONLY
Eina_Bool focus : 1;
unsigned int output_pool;
struct xkb_rule_names xkb_names;
struct xkb_context *xkb_context;
#endif
Ecore_Event_Handler *kbd_handler;
Ecore_Fd_Handler *fd_handler;
Ecore_Idler *idler;
E_Wayland_Input *input;
2013-08-18 19:31:24 -07:00
Eina_Inlist *surfaces;
Eina_List *seats;
void (*ping_cb) (E_Wayland_Surface *ews, unsigned int serial);
};
struct _E_Wayland_Output
{
unsigned int id;
void *render_state;
struct
{
struct wl_list link;
struct wl_list resources;
struct wl_global *global;
} wl;
E_Wayland_Compositor *compositor;
struct
{
Evas_Coord x, y, w, h;
Evas_Coord mm_w, mm_h;
} geometry;
pixman_region32_t region, prev_damage;
Eina_Bool repaint_needed : 1;
Eina_Bool repaint_scheduled : 1;
Eina_Bool dirty : 1;
struct
{
struct wl_signal sig;
unsigned int timestamp;
} frame;
char *make, *model;
unsigned int subpixel, transform;
struct
{
E_Wayland_Output_Mode *current;
E_Wayland_Output_Mode *origin;
struct wl_list list;
} mode;
void (*repaint) (E_Wayland_Output *output, pixman_region32_t *damage);
void (*destroy) (E_Wayland_Output *output);
int (*switch_mode) (E_Wayland_Output *output, E_Wayland_Output_Mode *mode);
/* TODO: add backlight support */
};
struct _E_Wayland_Output_Mode
{
struct
{
struct wl_list link;
} wl;
unsigned int flags;
Evas_Coord w, h;
unsigned int refresh;
};
struct _E_Wayland_Terminal
{
E_Wayland_Compositor *compositor;
int fd, kbd_mode;
struct termios attributes;
struct
{
struct wl_event_source *input;
struct wl_event_source *vt;
} wl;
struct
{
void (*func) (E_Wayland_Compositor *compositor, int event);
int current, starting;
Eina_Bool exists : 1;
} vt;
};
struct _E_Wayland_Plane
{
pixman_region32_t damage, clip;
Evas_Coord x, y;
struct wl_list link;
};
/* external variables */
extern EAPI E_Wayland_Compositor *_e_wl_comp;
EAPI Eina_Bool e_comp_wl_init(void);
EINTERN void e_comp_wl_shutdown(void);
#ifdef WAYLAND_ONLY
EAPI int e_comp_wl_input_read(int fd EINA_UNUSED, unsigned int mask EINA_UNUSED, void *data);
#endif
EAPI void wl_seat_init(struct wl_seat *seat);
EAPI void wl_seat_release(struct wl_seat *seat);
EAPI void wl_seat_set_pointer(struct wl_seat *seat, struct wl_pointer *pointer);
EAPI void wl_seat_set_keyboard(struct wl_seat *seat, struct wl_keyboard *keyboard);
EAPI void wl_seat_set_touch(struct wl_seat *seat, struct wl_touch *touch);
EAPI void wl_pointer_init(struct wl_pointer *pointer);
EAPI void wl_pointer_set_focus(struct wl_pointer *pointer, struct wl_resource *surface, wl_fixed_t sx, wl_fixed_t sy);
EAPI void wl_pointer_start_grab(struct wl_pointer *pointer, struct wl_pointer_grab *grab);
EAPI void wl_pointer_end_grab(struct wl_pointer *pointer);
EAPI void wl_keyboard_init(struct wl_keyboard *keyboard);
EAPI void wl_keyboard_set_focus(struct wl_keyboard *keyboard, struct wl_resource *surface);
EAPI void wl_keyboard_start_grab(struct wl_keyboard *device, struct wl_keyboard_grab *grab);
EAPI void wl_keyboard_end_grab(struct wl_keyboard *keyboard);
EAPI void wl_touch_init(struct wl_touch *touch);
EAPI void wl_touch_start_grab(struct wl_touch *device, struct wl_touch_grab *grab);
EAPI void wl_touch_end_grab(struct wl_touch *touch);
EAPI void wl_data_device_set_keyboard_focus(struct wl_seat *seat);
EAPI int wl_data_device_manager_init(struct wl_display *display);
EAPI struct wl_resource *wl_data_source_send_offer(struct wl_data_source *source, struct wl_resource *target);
EAPI void wl_seat_set_selection(struct wl_seat *seat, struct wl_data_source *source, uint32_t serial);
EAPI unsigned int e_comp_wl_time_get(void);
EAPI void e_comp_wl_input_modifiers_update(unsigned int serial);
EAPI void e_comp_wl_mouse_button(struct wl_resource *resource, uint32_t serial, uint32_t timestamp, uint32_t button, uint32_t state_w);
EAPI Eina_Bool e_comp_wl_cb_keymap_changed(void *data EINA_UNUSED, int type EINA_UNUSED, void *event EINA_UNUSED);
static inline uint64_t
e_comp_wl_id_get(uint32_t client, uint32_t surface)
{
return ((uint64_t)surface << 32) + (uint64_t)client;
}
# endif
#endif