From 86258cd16551f1261b5a4027f6574b266e95bd23 Mon Sep 17 00:00:00 2001 From: Chris Michael Date: Fri, 28 Mar 2014 10:36:44 +0000 Subject: [PATCH] ecore-evas-drm: Add better support for ecore_evas_fullscreen_set @bugfix: This fixes ecore_evas_drm to function properly when ecore_evas_fullsreen_set is called. This is needed for running Elementary apps 'standalone' in drm. Signed-off-by: Chris Michael --- .../ecore_evas/engines/drm/ecore_evas_drm.c | 61 +++++++++++++++++++ 1 file changed, 61 insertions(+) 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 4b1a0d31de..731f0fc64c 100644 --- a/src/modules/ecore_evas/engines/drm/ecore_evas_drm.c +++ b/src/modules/ecore_evas/engines/drm/ecore_evas_drm.c @@ -19,6 +19,13 @@ # include //#endif +typedef struct _Ecore_Evas_Engine_Drm_Data Ecore_Evas_Engine_Drm_Data; + +struct _Ecore_Evas_Engine_Drm_Data +{ + int w, h; +}; + /* local function prototypes */ static int _ecore_evas_drm_init(const char *device); static int _ecore_evas_drm_shutdown(void); @@ -145,6 +152,7 @@ ecore_evas_drm_new_internal(const char *device, unsigned int parent EINA_UNUSED, Ecore_Evas *ee; Evas_Engine_Info_Drm *einfo; Ecore_Evas_Interface_Drm *iface; + Ecore_Evas_Engine_Drm_Data *edata; int method; /* try to find the evas drm engine */ @@ -164,6 +172,15 @@ ecore_evas_drm_new_internal(const char *device, unsigned int parent EINA_UNUSED, goto ee_err; } + if (!(edata = calloc(1, sizeof(Ecore_Evas_Engine_Drm_Data)))) + { + ERR("Failed to allocate space for new Ecore_Evas_Engine_Data"); + free(ee); + goto ee_err; + } + + ee->engine.data = edata; + ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS); ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_evas_drm_engine_func; @@ -374,7 +391,11 @@ _ecore_evas_drm_interface_new(void) static void _ecore_evas_drm_free(Ecore_Evas *ee) { + Ecore_Evas_Engine_Drm_Data *data; + + data = ee->engine.data; ecore_evas_input_event_unregister(ee); + free(data); _ecore_evas_drm_shutdown(); } @@ -619,8 +640,48 @@ _ecore_evas_drm_maximized_set(Ecore_Evas *ee, Eina_Bool on) static void _ecore_evas_drm_fullscreen_set(Ecore_Evas *ee, Eina_Bool on) { + Eina_Bool resized = EINA_FALSE; + Ecore_Evas_Engine_Drm_Data *edata; + + edata = ee->engine.data; if (ee->prop.fullscreen == on) return; + if (on) + { + Evas_Engine_Info_Drm *einfo; + int ow = 0, oh = 0; + + edata->w = ee->w; + edata->h = ee->h; + if ((einfo = (Evas_Engine_Info_Drm *)evas_engine_info_get(ee->evas))) + ecore_drm_output_size_get(dev, einfo->info.output, &ow, &oh); + + if ((ow == 0) || (oh == 0)) + { + ow = ee->w; + oh = ee->h; + } + if ((ow != ee->w) || (oh != ee->h)) resized = EINA_TRUE; + ee->w = ow; + ee->h = oh; + } + else + { + if ((edata->w != ee->w) || (edata->h != ee->h)) resized = EINA_TRUE; + ee->w = edata->w; + ee->h = edata->h; + } + + ee->req.w = ee->w; + ee->req.h = ee->h; ee->prop.fullscreen = on; + evas_output_size_set(ee->evas, ee->w, ee->h); + evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h); + evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h); + + if (resized) + { + if (ee->func.fn_resize) ee->func.fn_resize(ee); + } } static void