summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Michael <cp.michael@samsung.com>2014-03-28 10:36:44 +0000
committerChris Michael <cp.michael@samsung.com>2014-04-01 07:09:49 +0100
commit86258cd16551f1261b5a4027f6574b266e95bd23 (patch)
tree71a396347b19d9d632296fb81b2bf4810baeab59
parent531d6f35157ee0c1e2029ad44348db03f4f5f688 (diff)
downloadefl-86258cd16551f1261b5a4027f6574b266e95bd23.tar.gz
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 <cp.michael@samsung.com>
-rw-r--r--src/modules/ecore_evas/engines/drm/ecore_evas_drm.c61
1 files changed, 61 insertions, 0 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 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 <Ecore_Drm.h>
//#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