4 #include "eom-server-protocol.h"
6 #define CHECK_ERR(val) if (WL_KEYROUTER_ERROR_NONE != val) return;
7 #define CHECK_ERR_VAL(val) if (WL_KEYROUTER_ERROR_NONE != val) return val;
8 #define CHECK_NULL(val) if (!val) return;
9 #define CHECK_NULL_VAL(val) if (!val) return val;
11 #define EOM_ERR(msg, ARG...) ERR("[eom module][%s:%d] "msg"\n", __FUNCTION__, __LINE__, ##ARG)
12 #define EOM_WARN(msg, ARG...) WARN("[eom module][%s:%d] "msg"\n", __FUNCTION__, __LINE__, ##ARG)
13 #define EOM_DBG(msg, ARG...) DBG("[eom module][%s:%d] "msg"\n", __FUNCTION__, __LINE__, ##ARG)
15 #define RETURNIFTRUE(statement, msg, ARG...) \
18 EOM_ERR( msg, ##ARG); \
22 #define RETURNVALIFTRUE(statement, ret, msg, ARG...) \
25 EOM_ERR( msg, ##ARG); \
29 #define GOTOIFTRUE(statement, lable, msg, ARG...) \
32 EOM_ERR( msg, ##ARG); \
37 E_API extern E_Module_Api e_modapi;
38 E_API void *e_modapi_init(E_Module *m);
39 E_API int e_modapi_shutdown(E_Module *m);
40 E_API int e_modapi_save(E_Module *m);
42 #define NUM_MAIN_BUF 2
45 typedef struct _E_Eom E_Eom, *E_EomPtr;
46 typedef struct _E_Eom_Out_Mode E_EomOutMode, *E_EomOutModePtr;
47 typedef struct _E_Eom_Event_Data E_EomEventData, *E_EomEventDataPtr;
48 typedef struct _E_Eom_Output E_EomOutput, *E_EomOutputPtr;
49 typedef struct _E_Eom_Fake_Buffers E_EomFakeBuffers, *E_EomFakeBuffersPtr;
50 typedef struct _E_Eom_Client_Buffer E_EomClientBuffer, *E_EomClientBufferPtr;
58 struct _E_Eom_Out_Mode
67 eom_output_type_e type;
68 eom_output_mode_e mode;
71 unsigned int phys_width;
72 unsigned int phys_height;
74 tdm_output_conn_status status;
76 eom_output_attribute_e attribute;
77 eom_output_attribute_state_e attribute_state;
79 /* external output data */
80 char *ext_output_name;
81 E_EomFlag is_external_init;
82 E_EomOutMode src_mode;
83 E_Comp_Wl_Output *wl_output;
85 /* internal output data */
86 char *int_output_name;
87 E_EomFlag is_internal_grab;
88 E_EomOutMode dst_mode;
93 struct wl_global *global;
94 Eina_List *eom_clients;
102 unsigned int output_count;
106 enum wl_eom_mode eom_mode;
107 enum wl_eom_attribute eom_attribute;
108 enum wl_eom_attribute_state eom_attribute_state;
109 enum wl_eom_status eom_status;
111 /*data related to cooperating with clients */
112 E_EomFlag is_mirror_mode;
114 /* external output data */
115 char *ext_output_name;
116 E_EomFlag is_external_init;
118 E_EomOutMode src_mode;
119 E_Comp_Wl_Output *wl_output;
121 /* internal output data */
122 char *int_output_name;
123 E_EomFlag is_internal_grab;
124 E_EomOutMode dst_mode;
128 struct _E_Eom_Event_Data
134 /* mirror mode data*/
135 tbm_surface_h dst_buffers[NUM_MAIN_BUF];
139 /* extended mode data */
140 Eina_List *client_buffers_list;
143 struct _E_Eom_Client_Buffer
145 E_Comp_Wl_Buffer *wl_buffer;
146 tbm_surface_h tbm_buffer;
151 struct _E_Eom_Fake_Buffers
153 tbm_surface_h fake_buffers[NUM_MAIN_BUF];
154 int current_fake_buffer;
158 /* handle external output */
159 static E_Comp_Wl_Output *_e_eom_e_comp_wl_output_get(const Eina_List *outputs, const char *id);
160 static Eina_Bool _e_eom_set_up_external_output(const char *output_name, int width, int height);
161 static tdm_output * _e_eom_hal_output_get(const char *id);
162 static tdm_layer * _e_eom_hal_layer_get(tdm_output *output, int width, int height);
163 static Eina_Bool _e_eom_create_output_buffers(E_EomEventDataPtr eom_data, int width, int height);
164 static enum wl_eom_type _e_eom_output_name_to_eom_type(const char *output_name);
166 /* handle internal output, pp */
167 static Eina_Bool _e_eom_mirror_start(const char *output_name, int width, int height);
168 static tbm_surface_h _e_eom_root_internal_tdm_surface_get(const char *name);
169 static Eina_Bool _e_eom_pp_src_to_dst( tbm_surface_h src_buffer);
170 static Eina_Bool _e_eom_pp_is_needed(int src_w, int src_h, int dst_w, int dst_h);
171 static void _e_eom_pp_calculate_new_size(int *x, int *new_w, int src_w, int src_h, int dst_w, int dst_h);
174 static void _e_eom_pp_cb(tbm_surface_h surface, void *user_data);
175 static void _e_eom_commit_cb(tdm_output *output EINA_UNUSED, unsigned int sequence EINA_UNUSED,
176 unsigned int tv_sec EINA_UNUSED, unsigned int tv_usec EINA_UNUSED,
179 /* clients buffers */
180 static E_EomClientBufferPtr _e_eom_create_client_buffer(E_Comp_Wl_Buffer *wl_buffer, tbm_surface_h tbm_buffer);
181 static void _e_eom_add_client_buffer_to_list(E_EomClientBufferPtr client_buffer);
182 static void _e_eom_client_buffers_list_free();
183 static E_EomClientBufferPtr _e_eom_get_client_buffer_from_list();
185 /*eom utils functions*/
186 static int _e_eom_get_time_in_mseconds();
187 static void _e_eom_create_fake_buffers(int width, int height);