From 4cd476b00d1c91787291b745ae8544240332ebb1 Mon Sep 17 00:00:00 2001 From: Hannes Janetzek Date: Tue, 5 Apr 2011 19:35:35 +0000 Subject: [PATCH] e-modules/engage: added 'autohide when window overlaps' mode SVN revision: 58367 --- src/e_mod_main.c | 183 ++++++++++++++++++++++++++++++++--------------- src/e_mod_main.h | 25 ++----- src/ng_config.c | 5 +- 3 files changed, 133 insertions(+), 80 deletions(-) diff --git a/src/e_mod_main.c b/src/e_mod_main.c index b0b4f30..e328aec 100644 --- a/src/e_mod_main.c +++ b/src/e_mod_main.c @@ -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,8 +111,8 @@ 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,37 +1689,43 @@ _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; } diff --git a/src/e_mod_main.h b/src/e_mod_main.h index 7a295f5..3012006 100644 --- a/src/e_mod_main.h +++ b/src/e_mod_main.h @@ -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; diff --git a/src/ng_config.c b/src/ng_config.c index 00dd7da..bc8e18a 100644 --- a/src/ng_config.c +++ b/src/ng_config.c @@ -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);