efl/ecore_evas/wayland: Report the requested window width x height.

Before this commit, when using any of the wayland backends, if the user
requested an ecore_evas window of width x height, the reported size of
the window would include the frames width and height.

Now the requested size is stored on the ecore_evas and reported when
ecore_evas_geometry_get() is used, although the ecore_evas is still
created with additional space for the frame area.

This is one of the reasons causing bug #1673.

SVN revision: 83042
This commit is contained in:
Rafael Antognolli 2013-01-21 16:05:12 +00:00
parent 167c19ca29
commit 43894851a7
2 changed files with 70 additions and 25 deletions

View File

@ -90,6 +90,7 @@ ecore_evas_wayland_egl_new_internal(const char *disp_name, unsigned int parent,
Ecore_Evas_Engine_Wl_Data *wdata;
Ecore_Evas *ee;
int method = 0, count = 0;
int fx, fy, fw, fh;
LOGFN(__FILE__, __LINE__, __FUNCTION__);
@ -154,15 +155,21 @@ ecore_evas_wayland_egl_new_internal(const char *disp_name, unsigned int parent,
ee->prop.draw_frame = frame;
ee->alpha = EINA_FALSE;
/* frame offset and size */
fx = 4;
fy = 18;
fw = 8;
fh = 22;
ee->evas = evas_new();
evas_data_attach_set(ee->evas, ee);
evas_output_method_set(ee->evas, method);
evas_output_size_set(ee->evas, ee->w, ee->h);
evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
evas_output_size_set(ee->evas, ee->w + fw, ee->h + fh);
evas_output_viewport_set(ee->evas, 0, 0, ee->w + fw, ee->h + fh);
/* FIXME: This needs to be set based on theme & scale */
if (ee->prop.draw_frame)
evas_output_framespace_set(ee->evas, 4, 18, 8, 22);
evas_output_framespace_set(ee->evas, fx, fy, fw, fh);
if (parent)
p = ecore_wl_window_find(parent);
@ -226,6 +233,7 @@ _ecore_evas_wl_resize(Ecore_Evas *ee, int w, int h)
{
Ecore_Evas_Engine_Wl_Data *wdata;
LOGFN(__FILE__, __LINE__, __FUNCTION__);
int orig_w, orig_h;
if (!ee) return;
if (w < 1) w = 1;
@ -233,6 +241,8 @@ _ecore_evas_wl_resize(Ecore_Evas *ee, int w, int h)
ee->req.w = w;
ee->req.h = h;
orig_w = w;
orig_h = h;
wdata = ee->engine.data;
if (!ee->prop.fullscreen)
@ -244,6 +254,9 @@ _ecore_evas_wl_resize(Ecore_Evas *ee, int w, int h)
if (ee->prop.min.h > h) h = ee->prop.min.h;
else if (h > ee->prop.max.h) h = ee->prop.max.h;
orig_w = w;
orig_h = h;
evas_output_framespace_get(ee->evas, NULL, NULL, &fw, &fh);
w += fw;
h += fh;
@ -251,8 +264,8 @@ _ecore_evas_wl_resize(Ecore_Evas *ee, int w, int h)
if ((ee->w != w) || (ee->h != h))
{
ee->w = w;
ee->h = h;
ee->w = orig_w;
ee->h = orig_h;
if ((ee->rotation == 90) || (ee->rotation == 270))
{
@ -293,16 +306,19 @@ _ecore_evas_wl_show(Ecore_Evas *ee)
{
Evas_Engine_Info_Wayland_Egl *einfo;
Ecore_Evas_Engine_Wl_Data *wdata;
int fw, fh;
LOGFN(__FILE__, __LINE__, __FUNCTION__);
if ((!ee) || (ee->visible)) return;
evas_output_framespace_get(ee->evas, NULL, NULL, &fw, &fh);
wdata = ee->engine.data;
if (wdata->win)
{
ecore_wl_window_show(wdata->win);
ecore_wl_window_update_size(wdata->win, ee->w, ee->h);
ecore_wl_window_update_size(wdata->win, ee->w + fw, ee->h + fh);
ecore_wl_window_buffer_attach(wdata->win, NULL, 0, 0);
if ((ee->prop.clas) && (wdata->win->shell_surface))
@ -316,7 +332,7 @@ _ecore_evas_wl_show(Ecore_Evas *ee)
if (wdata->frame)
{
evas_object_show(wdata->frame);
evas_object_resize(wdata->frame, ee->w, ee->h);
evas_object_resize(wdata->frame, ee->w + fw, ee->h + fh);
}
if (wdata->win)
@ -378,10 +394,13 @@ _ecore_evas_wl_alpha_set(Ecore_Evas *ee, int alpha)
ee->alpha = alpha;
if ((einfo = (Evas_Engine_Info_Wayland_Egl *)evas_engine_info_get(ee->evas)))
{
int fw, fh;
einfo->info.destination_alpha = alpha;
if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
evas_output_framespace_get(ee->evas, NULL, NULL, &fw, &fh);
evas_damage_rectangle_add(ee->evas, 0, 0, ee->w + fw, ee->h + fh);
}
}
@ -398,10 +417,12 @@ _ecore_evas_wl_transparent_set(Ecore_Evas *ee, int transparent)
if (!ee->visible) return;
if ((einfo = (Evas_Engine_Info_Wayland_Egl *)evas_engine_info_get(ee->evas)))
{
int fw, fh;
einfo->info.destination_alpha = transparent;
if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
evas_output_framespace_get(ee->evas, NULL, NULL, &fw, &fh);
evas_damage_rectangle_add(ee->evas, 0, 0, ee->w + fw, ee->h + fh);
}
}
@ -417,6 +438,7 @@ _ecore_evas_wayland_egl_resize(Ecore_Evas *ee, int location)
if (wdata->win)
{
Evas_Engine_Info_Wayland_Egl *einfo;
int fw, fh;
if ((einfo = (Evas_Engine_Info_Wayland_Egl *)evas_engine_info_get(ee->evas)))
{
@ -426,7 +448,8 @@ _ecore_evas_wayland_egl_resize(Ecore_Evas *ee, int location)
}
wdata->win->resizing = EINA_TRUE;
ecore_wl_window_resize(wdata->win, ee->w, ee->h, location);
evas_output_framespace_get(ee->evas, NULL, NULL, &fw, &fh);
ecore_wl_window_resize(wdata->win, ee->w + fw, ee->h + fh, location);
}
}
#endif

View File

@ -104,6 +104,7 @@ ecore_evas_wayland_shm_new_internal(const char *disp_name, unsigned int parent,
Ecore_Evas_Interface_Wayland *iface;
Ecore_Evas *ee;
int method = 0, count = 0;
int fx, fy, fw, fh;
LOGFN(__FILE__, __LINE__, __FUNCTION__);
@ -167,15 +168,21 @@ ecore_evas_wayland_shm_new_internal(const char *disp_name, unsigned int parent,
ee->prop.draw_frame = frame;
ee->alpha = EINA_FALSE;
/* frame offset and size */
fx = 4;
fy = 18;
fw = 8;
fh = 22;
ee->evas = evas_new();
evas_data_attach_set(ee->evas, ee);
evas_output_method_set(ee->evas, method);
evas_output_size_set(ee->evas, ee->w, ee->h);
evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
evas_output_size_set(ee->evas, ee->w + fw, ee->h + fh);
evas_output_viewport_set(ee->evas, 0, 0, ee->w + fw, ee->h + fh);
/* FIXME: This needs to be set based on theme & scale */
if (ee->prop.draw_frame)
evas_output_framespace_set(ee->evas, 4, 18, 8, 22);
evas_output_framespace_set(ee->evas, fx, fy, fw, fh);
if (parent)
p = ecore_wl_window_find(parent);
@ -244,6 +251,7 @@ _ecore_evas_wl_resize(Ecore_Evas *ee, int w, int h)
{
Evas_Engine_Info_Wayland_Shm *einfo;
Ecore_Evas_Engine_Wl_Data *wdata;
int orig_w, orig_h;
LOGFN(__FILE__, __LINE__, __FUNCTION__);
@ -253,6 +261,8 @@ _ecore_evas_wl_resize(Ecore_Evas *ee, int w, int h)
ee->req.w = w;
ee->req.h = h;
orig_w = w;
orig_h = h;
wdata = ee->engine.data;
@ -265,6 +275,9 @@ _ecore_evas_wl_resize(Ecore_Evas *ee, int w, int h)
if (ee->prop.min.h > h) h = ee->prop.min.h;
else if (h > ee->prop.max.h) h = ee->prop.max.h;
orig_w = w;
orig_h = h;
evas_output_framespace_get(ee->evas, NULL, NULL, &fw, &fh);
w += fw;
h += fh;
@ -272,8 +285,8 @@ _ecore_evas_wl_resize(Ecore_Evas *ee, int w, int h)
if ((ee->w != w) || (ee->h != h))
{
ee->w = w;
ee->h = h;
ee->w = orig_w;
ee->h = orig_h;
if ((ee->rotation == 90) || (ee->rotation == 270))
{
@ -338,12 +351,14 @@ _ecore_evas_wl_show(Ecore_Evas *ee)
{
Evas_Engine_Info_Wayland_Shm *einfo;
Ecore_Evas_Engine_Wl_Data *wdata;
int fw, fh;
LOGFN(__FILE__, __LINE__, __FUNCTION__);
if ((!ee) || (ee->visible)) return;
_ecore_evas_wl_buffer_new(ee, ee->w, ee->h);
evas_output_framespace_get(ee->evas, NULL, NULL, &fw, &fh);
_ecore_evas_wl_buffer_new(ee, ee->w + fw, ee->h + fh);
wdata = ee->engine.data;
einfo = (Evas_Engine_Info_Wayland_Shm *)evas_engine_info_get(ee->evas);
@ -359,7 +374,7 @@ _ecore_evas_wl_show(Ecore_Evas *ee)
if (wdata->win)
{
ecore_wl_window_show(wdata->win);
ecore_wl_window_update_size(wdata->win, ee->w, ee->h);
ecore_wl_window_update_size(wdata->win, ee->w + fw, ee->h + fh);
ecore_wl_window_buffer_attach(wdata->win,
wdata->buffer, 0, 0);
@ -374,7 +389,7 @@ _ecore_evas_wl_show(Ecore_Evas *ee)
if (wdata->frame)
{
evas_object_show(wdata->frame);
evas_object_resize(wdata->frame, ee->w, ee->h);
evas_object_resize(wdata->frame, ee->w + fw, ee->h + fh);
}
ee->visible = 1;
@ -418,6 +433,7 @@ _ecore_evas_wl_alpha_set(Ecore_Evas *ee, int alpha)
Evas_Engine_Info_Wayland_Shm *einfo;
Ecore_Evas_Engine_Wl_Data *wdata;
Ecore_Wl_Window *win = NULL;
int fw, fh;
LOGFN(__FILE__, __LINE__, __FUNCTION__);
@ -435,7 +451,8 @@ _ecore_evas_wl_alpha_set(Ecore_Evas *ee, int alpha)
/* if (wdata->win) */
/* ecore_wl_window_transparent_set(wdata->win, alpha); */
_ecore_evas_wl_buffer_new(ee, ee->w, ee->h);
evas_output_framespace_get(ee->evas, NULL, NULL, &fw, &fh);
_ecore_evas_wl_buffer_new(ee, ee->w + fw, ee->h + fh);
if ((einfo = (Evas_Engine_Info_Wayland_Shm *)evas_engine_info_get(ee->evas)))
{
@ -443,12 +460,12 @@ _ecore_evas_wl_alpha_set(Ecore_Evas *ee, int alpha)
einfo->info.dest = wdata->pool_data;
if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
evas_damage_rectangle_add(ee->evas, 0, 0, ee->w + fw, ee->h + fh);
}
if (win)
{
ecore_wl_window_update_size(win, ee->w, ee->h);
ecore_wl_window_update_size(win, ee->w + fw, ee->h + fh);
ecore_wl_window_buffer_attach(win, wdata->buffer, 0, 0);
}
}
@ -458,6 +475,7 @@ _ecore_evas_wl_transparent_set(Ecore_Evas *ee, int transparent)
{
Evas_Engine_Info_Wayland_Shm *einfo;
Ecore_Evas_Engine_Wl_Data *wdata;
int fw, fh;
LOGFN(__FILE__, __LINE__, __FUNCTION__);
@ -469,7 +487,8 @@ _ecore_evas_wl_transparent_set(Ecore_Evas *ee, int transparent)
if (wdata->win)
ecore_wl_window_transparent_set(wdata->win, transparent);
_ecore_evas_wl_buffer_new(ee, ee->w, ee->h);
evas_output_framespace_get(ee->evas, NULL, NULL, &fw, &fh);
_ecore_evas_wl_buffer_new(ee, ee->w + fw, ee->h + fh);
if ((einfo = (Evas_Engine_Info_Wayland_Shm *)evas_engine_info_get(ee->evas)))
{
@ -477,12 +496,12 @@ _ecore_evas_wl_transparent_set(Ecore_Evas *ee, int transparent)
einfo->info.dest = wdata->pool_data;
if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
evas_damage_rectangle_add(ee->evas, 0, 0, ee->w + fw, ee->h + fh);
}
if (wdata->win)
{
ecore_wl_window_update_size(wdata->win, ee->w, ee->h);
ecore_wl_window_update_size(wdata->win, ee->w + fw, ee->h + fh);
ecore_wl_window_buffer_attach(wdata->win,
wdata->buffer, 0, 0);
}
@ -656,8 +675,11 @@ _ecore_evas_wayland_shm_resize(Ecore_Evas *ee, int location)
wdata = ee->engine.data;
if (wdata->win)
{
int fw, fh;
wdata->win->resizing = EINA_TRUE;
ecore_wl_window_resize(wdata->win, ee->w, ee->h, location);
evas_output_framespace_get(ee->evas, NULL, NULL, &fw, &fh);
ecore_wl_window_resize(wdata->win, ee->w + fw, ee->h + fh, location);
}
}
#endif