e-modules/engage: added 'autohide when window overlaps' mode

SVN revision: 58367
This commit is contained in:
Hannes Janetzek 2011-04-05 19:35:35 +00:00
parent 76212fd783
commit 4cd476b00d
3 changed files with 133 additions and 80 deletions

View File

@ -29,7 +29,8 @@ static void _ngi_zoom_function(Ng *ng, double d, double *disp);
static Eina_Bool _ngi_animator(void *data);
static void _ngi_redraw(Ng *ng);
static int _ngi_autohide(Ng *ng, int hide);
/* static int _ngi_check_fullscreen(E_Desk *desk); */
static Eina_Bool _ngi_win_border_intersects(Ng *ng);
static int initialized = 0;
@ -110,7 +111,7 @@ ngi_new(Config_Item *cfg)
ng->state = unzoomed;
ng->hide_state = show;
ng->hide = EINA_TRUE;
ng->clip = evas_object_rectangle_add(ng->evas);
evas_object_color_set(ng->clip, 255, 255, 255, 0);
@ -221,35 +222,43 @@ ngi_new(Config_Item *cfg)
}
ng->handlers = eina_list_append
(ng->handlers, ecore_event_handler_add
(ECORE_X_EVENT_MOUSE_IN, _ngi_win_cb_mouse_in, ng));
(ng->handlers, ecore_event_handler_add
(ECORE_X_EVENT_MOUSE_IN, _ngi_win_cb_mouse_in, ng));
ng->handlers = eina_list_append
(ng->handlers, ecore_event_handler_add
(ECORE_X_EVENT_MOUSE_OUT, _ngi_win_cb_mouse_out, ng));
(ng->handlers, ecore_event_handler_add
(ECORE_X_EVENT_MOUSE_OUT, _ngi_win_cb_mouse_out, ng));
ng->handlers = eina_list_append
(ng->handlers, ecore_event_handler_add
(ECORE_EVENT_MOUSE_BUTTON_DOWN, _ngi_win_cb_mouse_down, ng));
(ng->handlers, ecore_event_handler_add
(ECORE_EVENT_MOUSE_BUTTON_DOWN, _ngi_win_cb_mouse_down, ng));
ng->handlers = eina_list_append
(ng->handlers, ecore_event_handler_add
(ECORE_EVENT_MOUSE_BUTTON_UP, _ngi_win_cb_mouse_up, ng));
(ng->handlers, ecore_event_handler_add
(ECORE_EVENT_MOUSE_BUTTON_UP, _ngi_win_cb_mouse_up, ng));
ng->handlers = eina_list_append
(ng->handlers, ecore_event_handler_add
(ECORE_EVENT_MOUSE_WHEEL, _ngi_win_cb_mouse_wheel, ng));
(ng->handlers, ecore_event_handler_add
(ECORE_EVENT_MOUSE_WHEEL, _ngi_win_cb_mouse_wheel, ng));
ng->handlers = eina_list_append
(ng->handlers, ecore_event_handler_add
(ECORE_EVENT_MOUSE_MOVE, _ngi_win_cb_mouse_move, ng));
(ng->handlers, ecore_event_handler_add
(ECORE_EVENT_MOUSE_MOVE, _ngi_win_cb_mouse_move, ng));
ng->handlers = eina_list_append
(ng->handlers, ecore_event_handler_add
(E_EVENT_DESK_SHOW, _ngi_win_cb_desk_show, ng));
ng->handlers = eina_list_append
(ng->handlers, ecore_event_handler_add
(E_EVENT_BORDER_PROPERTY, _ngi_win_cb_border_event, ng));
ng->handlers = eina_list_append
(ng->handlers, ecore_event_handler_add
(E_EVENT_BORDER_MOVE, _ngi_win_cb_border_event, ng));
ng->handlers = eina_list_append
(ng->handlers, ecore_event_handler_add
(E_EVENT_BORDER_RESIZE, _ngi_win_cb_border_event, ng));
if (ng->cfg->autohide == AUTOHIDE_FULLSCREEN)
{
int fullscreen = e_desk_current_get(ng->zone)->fullscreen_borders;
ng->hide_fullscreen = fullscreen;
ng->hide = e_desk_current_get(ng->zone)->fullscreen_borders;
}
else if (ng->cfg->autohide == AUTOHIDE_OVERLAP)
{
ng->hide = _ngi_win_border_intersects(ng);
}
else if (ng->cfg->stacking == below_fullscreen)
{
@ -261,8 +270,9 @@ ngi_new(Config_Item *cfg)
e_popup_show(ng->win->popup);
}
if ((ng->cfg->autohide == AUTOHIDE_NORMAL) || ng->hide_fullscreen)
if (ng->cfg->autohide && ng->hide)
{
ng->hide = EINA_TRUE;
ng->hide_step = ng->size + ng->opt.edge_offset + ng->opt.bg_offset;
ng->hide_state = hidden;
}
@ -1085,8 +1095,7 @@ _ngi_zoom_out(Ng *ng)
ng->zoom = 1.0;
ng->state = unzoomed;
if (!(ng->cfg->autohide == AUTOHIDE_NORMAL) &&
!(ng->cfg->autohide == AUTOHIDE_FULLSCREEN && !ng->hide_fullscreen))
if (!ng->hide)
ngi_input_extents_calc(ng);
if (ng->item_active)
@ -1153,6 +1162,7 @@ _ngi_autohide(Ng *ng, int hide)
ng->hide_step = 0;
_ngi_proxy_geometry_calc(ng);
ngi_input_extents_calc(ng);
return 0;
}
}
@ -1210,8 +1220,7 @@ _ngi_animator(void *data)
if (ng->cfg->autohide)
{
if ((ng->mouse_in || ng->show_bar || ng->menu_wait_timer) ||
(ng->cfg->autohide == AUTOHIDE_FULLSCREEN && (!ng->hide_fullscreen)))
if (ng->mouse_in || ng->show_bar || ng->menu_wait_timer || (!ng->hide))
{
if (ng->hide_state != show)
{
@ -1219,7 +1228,7 @@ _ngi_animator(void *data)
cont = 1;
}
}
else if ((ng->cfg->autohide == AUTOHIDE_NORMAL) || (ng->hide_fullscreen))
else
{
if ((ng->hide_state != hidden) &&
((ng->zoom - 1.0) <= (ng->cfg->zoomfactor - 1.0) / 2.0))
@ -1274,7 +1283,7 @@ ngi_reposition(Ng *ng)
range = ng->cfg->zoom_range * ng->size;
disp = erf(distance / range) * range * (ng->cfg->zoomfactor - 1.0) + 0.6;
disp = erf(distance / range) * range * (ng->cfg->zoomfactor - 1.0);
end = ng->start - SIDE_OFFSET + disp;
@ -1360,7 +1369,7 @@ _ngi_zoom_function(Ng *ng, double d, double *disp)
{
float range = ng->cfg->zoom_range * ng->size;
*disp = erf(d / range) * range * (ng->zoom - 1.0) + 0.6;
*disp = erf(d / range) * range * (ng->zoom - 1.0);
}
static void
@ -1510,7 +1519,15 @@ _ngi_redraw(Ng *ng)
_ngi_zoom_function(ng, it->pos + (ng->size * it->scale) - ng->pos, &pos2);
pos2 = (double)it->pos + ((double)ng->size * it->scale) + pos2;
size = (int)pos2 - (int)pos;
if (pos2 > ng->pos)
{
/* pos2 += 0.5; */
size = (int)(pos2 - (pos - 0.5));
pos += 0.5;
}
else
size = (int)(pos2 - pos);
switch (cfg->orient)
{
@ -1578,23 +1595,65 @@ ngi_thaw(Ng *ng)
ngi_animate(ng);
}
/* static int
* _ngi_check_fullscreen(E_Desk *desk)
* {
* Eina_List *l;
* E_Border *bd;
*
* EINA_LIST_FOREACH(e_border_client_list(), l, bd)
* {
* if (bd->desk != desk)
* continue;
*
* if (bd->fullscreen)
* return 1;
* }
*
* return 0;
* } */
static Eina_Bool
_ngi_win_border_intersects(Ng *ng)
{
Eina_List *l;
E_Border *bd;
E_Desk *desk;
int x, y, w, h, size;
desk = e_desk_current_get(ng->zone);
size = ng->size + ng->opt.bg_offset + ng->opt.edge_offset;
switch (ng->cfg->orient)
{
case E_GADCON_ORIENT_BOTTOM:
x = ng->start;
y = ng->win->popup->h - size;
w = ng->w;
h = size;
break;
case E_GADCON_ORIENT_TOP:
x = ng->start;
y = 0;
w = ng->w;
h = size;
break;
case E_GADCON_ORIENT_LEFT:
x = 0;
y = ng->start;
w = size;
h = ng->w;
break;
case E_GADCON_ORIENT_RIGHT:
x = ng->win->popup->w - size;
y = ng->start;
w = size;
h = ng->w;
break;
}
x += ng->zone->x + ng->win->popup->x;
y += ng->zone->y + ng->win->popup->y;
EINA_LIST_FOREACH(e_border_client_list(), l, bd)
{
if (bd->zone != ng->zone)
continue;
if ((bd->desk != desk) && (!bd->sticky))
continue;
if (E_INTERSECTS(x, y, w, h, bd->x, bd->y, bd->w, bd->h))
return EINA_TRUE;
}
return EINA_FALSE;
}
static Eina_Bool
_ngi_win_cb_desk_show(void *data, int type, void *event)
@ -1616,10 +1675,10 @@ _ngi_win_cb_desk_show(void *data, int type, void *event)
{
fullscreen = ev->desk->fullscreen_borders;
if (ng->hide_fullscreen != fullscreen)
if (ng->hide != fullscreen)
ngi_animate(ng);
ng->hide_fullscreen = fullscreen;
ng->hide = fullscreen;
}
return EINA_TRUE;
}
@ -1630,35 +1689,41 @@ _ngi_win_cb_border_event(void *data, int type, void *event)
E_Event_Border_Property *ev = event;
Ng *ng = data;
E_Desk *desk;
int fullscreen;
int hide;
if (ng->cfg->stacking == below_fullscreen)
{
desk = e_desk_current_get(ng->zone);
if (ev->border->desk != desk)
return EINA_TRUE;
hide = desk->fullscreen_borders;
fullscreen = desk->fullscreen_borders;
if (fullscreen)
if (hide)
e_popup_hide(ng->win->popup);
else
e_popup_show(ng->win->popup);
}
else if (ng->cfg->autohide == AUTOHIDE_FULLSCREEN)
if (ng->cfg->autohide == AUTOHIDE_FULLSCREEN)
{
desk = e_desk_current_get(ng->zone);
if (ev->border->desk != desk)
return EINA_TRUE;
hide = desk->fullscreen_borders;
fullscreen = desk->fullscreen_borders;
if (ng->hide_fullscreen != fullscreen)
if (ng->hide != hide)
ngi_animate(ng);
ng->hide_fullscreen = fullscreen;
ng->hide = hide;
}
else if (ng->cfg->autohide == AUTOHIDE_OVERLAP)
{
desk = e_desk_current_get(ng->zone);
hide = _ngi_win_border_intersects(ng);
if (ng->hide != hide)
ngi_animate(ng);
ng->hide = hide;
}
return EINA_TRUE;

View File

@ -11,25 +11,10 @@
#define MOD_CONFIG_FILE_VERSION \
((MOD_CONFIG_FILE_EPOCH << 16) | MOD_CONFIG_FILE_GENERATION)
#define AUTOHIDE_NONE 0
#define AUTOHIDE_NORMAL 1
#define AUTOHIDE_FULLSCREEN 2
/* #define ITEM_MOUSE_DOWN(_item, _ev) \
* if(_item && _item->cb_mouse_down) \
* _item->cb_mouse_down(_item, _ev); \
*
* #define ITEM_MOUSE_UP(_item, _ev) \
* if(_item && _item->cb_mouse_up) \
* _item->cb_mouse_up(_item, _ev); \
*
* #define ITEM_MOUSE_OUT(_item) \
* if(_item && _item->cb_mouse_out) \
* _item->cb_mouse_out(_item); \
*
* #define ITEM_MOUSE_IN(_item) \
* if(_item && _item->cb_mouse_in) \
* _item->cb_mouse_in(_item); \ */
#define AUTOHIDE_NONE 0
#define AUTOHIDE_NORMAL 1
#define AUTOHIDE_FULLSCREEN 2
#define AUTOHIDE_OVERLAP 3
#define ITEM_MOUSE_WHEEL(_item, ev) \
if(_item && _item->cb_mouse_wheel) \
@ -173,7 +158,7 @@ struct _Ng
enum { unzoomed, zooming, zoomed, unzooming } state;
enum { hidden, hiding, showing, show } hide_state;
int hide_fullscreen;
int hide;
double zoom;
double start_zoom;

View File

@ -292,7 +292,10 @@ _basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cf
ob = e_widget_radio_add(evas, "Autohide",
AUTOHIDE_NORMAL, rg);
e_widget_framelist_object_append(of, ob);
ob = e_widget_radio_add(evas, "Autohide on Fullscreen",
ob = e_widget_radio_add(evas, "Hide when Window overlaps",
AUTOHIDE_OVERLAP, rg);
e_widget_framelist_object_append(of, ob);
ob = e_widget_radio_add(evas, "Hide on Fullscreen",
AUTOHIDE_FULLSCREEN, rg);
e_widget_framelist_object_append(of, ob);