summaryrefslogtreecommitdiff
path: root/src/modules/ecore_evas/engines/drm/ecore_evas_drm.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/modules/ecore_evas/engines/drm/ecore_evas_drm.c')
-rw-r--r--src/modules/ecore_evas/engines/drm/ecore_evas_drm.c65
1 files changed, 44 insertions, 21 deletions
diff --git a/src/modules/ecore_evas/engines/drm/ecore_evas_drm.c b/src/modules/ecore_evas/engines/drm/ecore_evas_drm.c
index 73e3a45621..c1c60f8b15 100644
--- a/src/modules/ecore_evas/engines/drm/ecore_evas_drm.c
+++ b/src/modules/ecore_evas/engines/drm/ecore_evas_drm.c
@@ -63,6 +63,7 @@ typedef struct _Ecore_Evas_Engine_Drm_Data
Eina_Bool ticking : 1;
Eina_Bool once : 1;
Ecore_Job *tick_job;
+ Ecore_Job *focus_job;
} Ecore_Evas_Engine_Drm_Data;
static int _drm_init_count = 0;
@@ -198,6 +199,11 @@ _ecore_evas_drm_shutdown(Ecore_Evas_Engine_Drm_Data *edata)
Ecore_Event_Handler *h;
if (--_drm_init_count != 0) return _drm_init_count;
+ if (edata->focus_job)
+ {
+ ecore_job_del(edata->focus_job);
+ edata->focus_job = NULL;
+ }
ecore_drm2_outputs_destroy(edata->dev);
ecore_drm2_device_close(edata->dev);
ecore_drm2_shutdown();
@@ -383,6 +389,17 @@ _drm_pointer_warp(const Ecore_Evas *ee, Evas_Coord x, Evas_Coord y)
}
static void
+_drm_show_focus_job(void *data)
+{
+ Ecore_Evas *ee = data;
+ Ecore_Evas_Engine_Drm_Data *edata;
+
+ _ecore_evas_focus_device_set(ee, NULL, EINA_TRUE);
+ edata = ee->engine.data;
+ edata->focus_job = NULL;
+}
+
+static void
_drm_show(Ecore_Evas *ee)
{
Ecore_Evas_Engine_Drm_Data *edata;
@@ -406,14 +423,10 @@ _drm_show(Ecore_Evas *ee)
if (ee->visible) return;
ee->visible = 1;
- if (ee->prop.fullscreen)
- {
- evas_focus_in(ee->evas);
- if (ee->func.fn_focus_in) ee->func.fn_focus_in(ee);
- }
if (ee->func.fn_show) ee->func.fn_show(ee);
edata = ee->engine.data;
+ edata->focus_job = ecore_job_add(_drm_show_focus_job, ee);
/* HACK: sometimes we still have an animator ticking when we vc switch
* so for now we just fire off a flip here to kick it when we come back.
* This is just papering over a bug for now until I have time to track
@@ -715,10 +728,14 @@ _cb_pageflip(int fd EINA_UNUSED, unsigned int frame EINA_UNUSED, unsigned int se
if (edata->ticking)
{
+ int x, y, w, h;
double t = (double)sec + ((double)usec / 1000000);
+ ecore_drm2_output_info_get(edata->output, &x, &y, &w, &h, NULL);
+
if (!edata->once) t = ecore_time_get();
- ecore_evas_animator_tick(ee, NULL, t - edata->offset);
+ ecore_evas_animator_tick(ee, &(Eina_Rectangle){x, y, w, h},
+ t - edata->offset);
}
else if (ret)
ecore_drm2_fb_flip(NULL, edata->output);
@@ -741,11 +758,16 @@ _tick_job(void *data)
{
Ecore_Evas_Engine_Drm_Data *edata;
Ecore_Evas *ee;
+ int x, y, w, h;
ee = data;
edata = ee->engine.data;
edata->tick_job = NULL;
- ecore_evas_animator_tick(ee, NULL, edata->tick_job_timestamp);
+
+ ecore_drm2_output_info_get(edata->output, &x, &y, &w, &h, NULL);
+
+ ecore_evas_animator_tick(ee, &(Eina_Rectangle){x, y, w, h},
+ edata->tick_job_timestamp);
}
static void
@@ -787,6 +809,12 @@ _drm_animator_register(Ecore_Evas *ee)
}
}
+ if (ee->animator_ticked || ee->animator_ran)
+ {
+ edata->ticking = EINA_TRUE;
+ return;
+ }
+
if (edata->tick_job) ERR("Double animator register");
else
if (!edata->ticking &&
@@ -799,11 +827,10 @@ _drm_animator_register(Ecore_Evas *ee)
+ ((double)usec / 1000000);
edata->tick_job = ecore_job_add(_tick_job, ee);
}
+ else
+ ecore_drm2_fb_flip(NULL, edata->output);
}
- if (!ecore_drm2_output_pending_get(edata->output) && !ee->in_async_render)
- ecore_drm2_fb_flip(NULL, edata->output);
-
edata->ticking = EINA_TRUE;
}
@@ -1000,11 +1027,13 @@ _ecore_evas_new_internal(const char *device, int x, int y, int w, int h, Eina_Bo
if (getenv("ECORE_EVAS_FORCE_SYNC_RENDER"))
ee->can_async_render = 0;
- ee->evas = evas_new();
- evas_data_attach_set(ee->evas, ee);
+ if (!ecore_evas_evas_new(ee, w, h))
+ {
+ ERR("Can not create a Canvas.");
+ goto eng_err;
+ }
+
evas_output_method_set(ee->evas, method);
- evas_output_size_set(ee->evas, w, h);
- evas_output_viewport_set(ee->evas, 0, 0, w, h);
if (ee->can_async_render)
evas_event_callback_add(ee->evas, EVAS_CALLBACK_RENDER_POST,
@@ -1059,13 +1088,7 @@ _ecore_evas_new_internal(const char *device, int x, int y, int w, int h, Eina_Bo
ecore_evas_data_set(ee, "device", edata->dev);
- _ecore_evas_register(ee);
- ecore_event_window_register(ee->prop.window, ee, ee->evas,
- (Ecore_Event_Mouse_Move_Cb)_ecore_evas_mouse_move_process,
- (Ecore_Event_Multi_Move_Cb)_ecore_evas_mouse_multi_move_process,
- (Ecore_Event_Multi_Down_Cb)_ecore_evas_mouse_multi_down_process,
- (Ecore_Event_Multi_Up_Cb)_ecore_evas_mouse_multi_up_process);
- _ecore_event_window_direct_cb_set(ee->prop.window, _ecore_evas_input_direct_cb);
+ ecore_evas_done(ee, EINA_FALSE);
ecore_drm2_output_info_get(edata->output, NULL, NULL, &mw, &mh, NULL);