static int _ecore_evas_wl_init_count = 0;
static Ecore_Event_Handler *_ecore_evas_wl_event_hdls[5];
+/* Frame listener */
+static void _ecore_evas_wl_frame_complete(void *data, struct wl_callback *callback, uint32_t tm);
+static const struct wl_callback_listener frame_listener =
+{
+ _ecore_evas_wl_frame_complete,
+};
static Eina_Bool
_ecore_evas_wl_common_cb_mouse_in(void *data EINA_UNUSED, int type EINA_UNUSED, void *event)
if (ee->func.fn_post_render) ee->func.fn_post_render(ee);
}
+static void
+_ecore_evas_wl_frame_complete(void *data, struct wl_callback *callback, uint32_t tm EINA_UNUSED)
+{
+ Ecore_Evas *ee = data;
+ Ecore_Wl_Window *win = NULL;
+ Ecore_Evas_Engine_Wl_Data *wdata;
+
+ if (!ee) return;
+ wdata = ee->engine.data;
+ if (!(win = wdata->win)) return;
+
+ win->frame_callback = NULL;
+ win->frame_pending = EINA_FALSE;
+ wl_callback_destroy(callback);
+
+ if (win->surface)
+ {
+ win->frame_callback = wl_surface_frame(win->surface);
+ wl_callback_add_listener(win->frame_callback, &frame_listener, ee);
+ }
+}
+
int
_ecore_evas_wl_common_render(Ecore_Evas *ee)
{
int rend = 0;
-
- LOGFN(__FILE__, __LINE__, __FUNCTION__);
+ Ecore_Wl_Window *win = NULL;
+ Ecore_Evas_Engine_Wl_Data *wdata;
if (!ee) return 0;
if (!ee->visible)
return 0;
}
+ wdata = ee->engine.data;
+ if (!(win = wdata->win)) return 0;
+
rend = _ecore_evas_wl_common_pre_render(ee);
- rend |= _ecore_evas_wl_common_render_updates(ee);
- _ecore_evas_wl_common_post_render(ee);
+ if (!(win->frame_pending))
+ {
+ /* FIXME - ideally have an evas_changed_get to return the value
+ * of evas->changed to avoid creating this callback and
+ * destroying it again
+ */
+
+ if (!win->frame_callback)
+ {
+ win->frame_callback = wl_surface_frame(win->surface);
+ wl_callback_add_listener(win->frame_callback, &frame_listener, ee);
+ }
+ rend |= _ecore_evas_wl_common_render_updates(ee);
+ if (rend)
+ win->frame_pending = EINA_TRUE;
+ }
+ _ecore_evas_wl_common_post_render(ee);
return rend;
}
/* local function prototypes */
-static int _ecore_evas_wl_render(Ecore_Evas *ee);
static void _ecore_evas_wl_resize(Ecore_Evas *ee, int w, int h);
static void _ecore_evas_wl_show(Ecore_Evas *ee);
static void _ecore_evas_wl_hide(Ecore_Evas *ee);
NULL, // modal set
NULL, // demand attention set
NULL, // focus skip set
- _ecore_evas_wl_render,
+ _ecore_evas_wl_common_render,
_ecore_evas_wl_common_screen_geometry_get,
_ecore_evas_wl_common_screen_dpi_get
};
return NULL;
}
-static void
-_ecore_evas_wl_frame_complete (void *data, struct wl_callback *callback, uint32_t time EINA_UNUSED);
-
-static const struct wl_callback_listener frame_listener = {
- _ecore_evas_wl_frame_complete,
-};
-
-static void
-_ecore_evas_wl_frame_complete (void *data, struct wl_callback *callback, uint32_t time EINA_UNUSED)
-{
- Ecore_Evas *ee = data;
- Ecore_Evas_Engine_Wl_Data *wdata = ee->engine.data;
-
- wdata->win->frame_callback = NULL;
- wdata->win->frame_pending = EINA_FALSE;
- wl_callback_destroy(callback);
-
- wdata->win->frame_callback =
- wl_surface_frame(wdata->win->surface);
-
- wl_callback_add_listener(wdata->win->frame_callback,
- &frame_listener, ee);
-}
-
-int
-_ecore_evas_wl_render_updates(Ecore_Evas *ee)
-{
- int rend = 0;
- Eina_List *updates = NULL;
- Ecore_Evas_Engine_Wl_Data *wdata = ee->engine.data;
-
- LOGFN(__FILE__, __LINE__, __FUNCTION__);
-
- /* eglSwapBuffers is ultimately called by evas_render_updates() if
- * there is some update to make. So we must pre-emptively create a
- * frame callback handler. We make sure we always have one of these in
- * available to track if the event is presented.
- *
- * This frame callback will be fired when the frame has been presented
- * and we can safely call eglSwapBuffers without it blocking. Whether
- * to render or not is handled by the frame_pending boolean which is
- * reset on the frame callback event.
- */
- if (!wdata->win->frame_pending)
- {
- /* FIXME - ideally have an evas_changed_get to return the value
- * of evas->changed to avoid creating this callback and
- * destroying it again
- */
-
- if (!wdata->win->frame_callback)
- {
- wdata->win->frame_callback =
- wl_surface_frame(wdata->win->surface);
-
- wl_callback_add_listener(wdata->win->frame_callback,
- &frame_listener, ee);
- }
-
- if ((updates = evas_render_updates(ee->evas)))
- {
- Eina_List *l = NULL;
- Eina_Rectangle *r;
-
- EINA_LIST_FOREACH(updates, l, r)
- ecore_wl_window_damage(wdata->win,
- r->x, r->y, r->w, r->h);
-
- ecore_wl_flush();
-
- evas_render_updates_free(updates);
-
- wdata->win->frame_pending = EINA_TRUE;
-
- rend = 1;
- }
- }
-
- return rend;
-}
-
-static int
-_ecore_evas_wl_render(Ecore_Evas *ee)
-{
- int rend = 0;
-
- LOGFN(__FILE__, __LINE__, __FUNCTION__);
-
- if (!ee) return 0;
- if (!ee->visible)
- {
- evas_norender(ee->evas);
- return 0;
- }
-
- rend = _ecore_evas_wl_common_pre_render(ee);
- rend |= _ecore_evas_wl_render_updates(ee);
- _ecore_evas_wl_common_post_render(ee);
-
- return rend;
-}
-
static void
_ecore_evas_wl_resize(Ecore_Evas *ee, int w, int h)
{
static void _ecore_evas_wl_hide(Ecore_Evas *ee);
static void _ecore_evas_wl_alpha_set(Ecore_Evas *ee, int alpha);
static void _ecore_evas_wl_transparent_set(Ecore_Evas *ee, int transparent);
-static int _ecore_evas_wl_render(Ecore_Evas *ee);
-
-/* Frame listener */
-static void _ecore_evas_wl_frame_complete(void *data, struct wl_callback *callback, uint32_t tm);
-static const struct wl_callback_listener frame_listener =
-{
- _ecore_evas_wl_frame_complete,
-};
static Ecore_Evas_Engine_Func _ecore_wl_engine_func =
{
NULL, // modal set
NULL, // demand attention set
NULL, // focus skip set
- _ecore_evas_wl_render,
+ _ecore_evas_wl_common_render,
_ecore_evas_wl_common_screen_geometry_get,
_ecore_evas_wl_common_screen_dpi_get
};
ecore_wl_window_update_size(wdata->win, ee->w + fw, ee->h + fh);
}
-static void
-_ecore_evas_wl_frame_complete(void *data, struct wl_callback *callback, uint32_t tm EINA_UNUSED)
-{
- Ecore_Evas *ee = data;
- Ecore_Wl_Window *win = NULL;
- Ecore_Evas_Engine_Wl_Data *wdata;
-
- if (!ee) return;
- wdata = ee->engine.data;
- if (!(win = wdata->win)) return;
-
- win->frame_callback = NULL;
- win->frame_pending = EINA_FALSE;
- wl_callback_destroy(callback);
-
- if (win->surface)
- {
- win->frame_callback = wl_surface_frame(win->surface);
- wl_callback_add_listener(win->frame_callback, &frame_listener, ee);
- }
-}
-
-static int
-_ecore_evas_wl_render(Ecore_Evas *ee)
-{
- int rend = 0;
- Ecore_Wl_Window *win = NULL;
- Ecore_Evas_Engine_Wl_Data *wdata;
-
- if (!ee) return 0;
- if (!ee->visible)
- {
- evas_norender(ee->evas);
- return 0;
- }
-
- wdata = ee->engine.data;
- if (!(win = wdata->win)) return 0;
-
- rend = _ecore_evas_wl_common_pre_render(ee);
- if (!(win->frame_pending))
- {
- /* FIXME - ideally have an evas_changed_get to return the value
- * of evas->changed to avoid creating this callback and
- * destroying it again
- */
-
- if (!win->frame_callback)
- {
- win->frame_callback = wl_surface_frame(win->surface);
- wl_callback_add_listener(win->frame_callback, &frame_listener, ee);
- }
-
- rend |= _ecore_evas_wl_common_render_updates(ee);
- if (rend)
- win->frame_pending = EINA_TRUE;
- }
- _ecore_evas_wl_common_post_render(ee);
- return rend;
-}
-
void
_ecore_evas_wayland_shm_resize(Ecore_Evas *ee, int location)
{