From 329869ecfb48e8a7328ca45d52a170f1e7b7ac32 Mon Sep 17 00:00:00 2001 From: Hannes Janetzek Date: Thu, 3 Mar 2011 23:24:08 +0000 Subject: [PATCH] e-modules/comp-scale: - use comps' mirror objects instead of shobj fixes stacking issues and should be done like that anyway - slide mouse pointer to selected window when using scale with keybindings - focus currently selected border. for themes that have less sublime window focused theme than detour. TODO need to revert window focus order on finish SVN revision: 57508 --- e-module-scale.edc | 50 ++++++++++ sh.png | Bin 0 -> 1108 bytes src/e_mod_main.c | 14 +-- src/e_mod_main.h | 56 ++++++----- src/e_mod_pager.c | 153 ++++++++++++------------------ src/e_mod_scale.c | 227 +++++++++++++++++++-------------------------- 6 files changed, 242 insertions(+), 258 deletions(-) create mode 100644 sh.png diff --git a/e-module-scale.edc b/e-module-scale.edc index 41cbb68..71e48cc 100644 --- a/e-module-scale.edc +++ b/e-module-scale.edc @@ -1,6 +1,7 @@ images { image: "module_icon.png" COMP; + image: "sh.png" COMP; } collections @@ -77,6 +78,55 @@ collections name: "modules/scale/win"; parts { + part { name: "clipper"; + type: RECT; + mouse_events: 0; + description { state: "default" 0.0; + visible: 1; + color: 255 255 255 255; + rel1 { + relative: -1.0 -1.0; + offset: -9999 -9999; + } + rel2 { + relative: 2.0 2.0; + offset: 9999 9999; + } + } + description { state: "visible" 0.0; + inherit: "default" 0.0; + visible: 1; + color: 255 255 255 255; + } + } + part { name: "shadow"; + mouse_events: 0; + clip_to: "clipper"; + description { state: "default" 0.0; + image { + normal: "sh.png"; + border: 18 18 18 18; + middle: 0; + } + fill { + smooth: 0; + } + rel1 { + to: "e.swallow.win"; + relative: 0.0 0.0; + offset: -16 -14; + } + rel2 { + to: "e.swallow.win"; + relative: 1.0 1.0; + offset: 15 17; + } + } + description { state: "hidden" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } part { name: "e.swallow.win"; diff --git a/sh.png b/sh.png new file mode 100644 index 0000000000000000000000000000000000000000..cf83b7850ca436a3b907f312c6cb9a484c0a2971 GIT binary patch literal 1108 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSEX7WqAsj$Z!;#VfpgFY0K#xMY76=eEfY-9LA+yyva=k4s%5^d*OJ=Y`7`m6(ja zO#c`4;kV&(OUYHy2d-`Swf955=a218JWi$-TVEaJtQDWw9+~pn@O>E5cCIaXjA2dD zi4mMfRWiZz|U?h5A9>=21pZ-r& zG@Dkh`GwJ7KU2<3Hk&Ob_ctn5tQSn-j&N_d!?|WkdO7O}(>nnEo`rZu6AMfFQ2uhw#S=W^ik-k($cIcbM;K9J>C{%k+jLTVom%Z;lE z2coqbzO?D9hZ#IvuiLnV>tYd)&Rypw(?jc@3c9f<+g^1wfAlZ2 zznE& zKf1yN1$Fy-L+l9%>x_^PDa?ZJMT<$}M=G$%R z8xDIZsB%WlIxykpTqUXUjM^yyIv<=xF)!7hTDZ{D<4d$m9}8o z!W~d0mYlkQ_rXft1z(na^GS~2o_AsWd(JHaRi7sxxbRa>KjqMT^~R7x*Ecg&2whp{ zZqNPa!Iesf<>!R$_by`cSU7R@UFAR5y)G2JH)33J>0&##J@YHaxKH=Lx*t}2^L1&( jN`{tw`*?sknnACg(bMJRg?U=jEkImPS3j3^P6modifiers, 0); + _e_mod_action(params, ev->modifiers, GO_KEY); } static void _e_mod_action_cb_mouse(E_Object *obj, const char *params, Ecore_Event_Mouse_Button *ev) { - _e_mod_action(params, 0, 1); + _e_mod_action(params, 0, GO_MOUSE); } /* Module and Gadcon stuff */ @@ -240,12 +240,14 @@ e_modapi_init(E_Module *m) "scale-windows", "go_scale", NULL, 0); e_action_predef_name_set(D_("Scale Windows"), D_("Scale Windows (All Desktops)"), "scale-windows", "go_scale_all", NULL, 0); - e_action_predef_name_set(D_("Scale Windows"), D_("Scale Pager"), - "scale-windows", "go_pager", NULL, 0); e_action_predef_name_set(D_("Scale Windows"), D_("Select Next"), "scale-windows", "go_scale_next", NULL, 0); e_action_predef_name_set(D_("Scale Windows"), D_("Select Previous"), "scale-windows", "go_scale_prev", NULL, 0); + e_action_predef_name_set(D_("Scale Windows"), D_("Select Next (All)"), + "scale-windows", "go_scale_all_next", NULL, 0); + e_action_predef_name_set(D_("Scale Windows"), D_("Select Previous (All)"), + "scale-windows", "go_scale_all_prev", NULL, 0); e_action_predef_name_set(D_("Scale Pager"), D_("Scale Pager"), "scale-windows", "go_pager", NULL, 0); diff --git a/src/e_mod_main.h b/src/e_mod_main.h index ba913ac..7def263 100644 --- a/src/e_mod_main.h +++ b/src/e_mod_main.h @@ -12,6 +12,11 @@ #define DBG(...) /* #define DBG(...) printf(__VA_ARGS__) */ +#define GO_KEY 0 +#define GO_MOUSE 1 +#define GO_EDGE 2 +#define GO_ACTION 3 + typedef struct _Config_Item Config_Item; typedef struct _Config Config; @@ -56,37 +61,38 @@ struct _Config_Item int switch2; }; + struct _E_Comp_Win { EINA_INLIST; - void *c; - Ecore_X_Window win; - E_Border *bd; - E_Popup *pop; - E_Menu *menu; - int x, y, w, h; + void *c; + Ecore_X_Window win; + E_Border *bd; + E_Popup *pop; + E_Menu *menu; + int x, y, w, h; struct { - int x, y, w, h; + int x, y, w, h; } hidden; - int pw, ph; - int border; - Ecore_X_Pixmap pixmap; - Ecore_X_Damage damage; - Ecore_X_Visual vis; - int depth; - Evas_Object *obj; - Evas_Object *shobj; - Eina_List *obj_mirror; - Ecore_X_Image *xim; - void *up; - E_Object_Delfn *dfn; - Ecore_X_Sync_Counter counter; - Ecore_Timer *update_timeout; - Ecore_Timer *ready_timeout; - int dmg_updates; - Ecore_X_Rectangle *rects; - int rects_num; + int pw, ph; + int border; + Ecore_X_Pixmap pixmap; + Ecore_X_Damage damage; + Ecore_X_Visual vis; + int depth; + Evas_Object *obj; + Evas_Object *shobj; + Eina_List *obj_mirror; + Ecore_X_Image *xim; + void *up; + E_Object_Delfn *dfn; + Ecore_X_Sync_Counter counter; + Ecore_Timer *update_timeout; + Ecore_Timer *ready_timeout; + int dmg_updates; + Ecore_X_Rectangle *rects; + int rects_num; Ecore_X_Pixmap cache_pixmap; int cache_w, cache_h; diff --git a/src/e_mod_pager.c b/src/e_mod_pager.c index b5f79cf..c94ae2f 100644 --- a/src/e_mod_pager.c +++ b/src/e_mod_pager.c @@ -11,6 +11,7 @@ struct _Item E_Border *bd; E_Desk *desk; E_Comp_Win *cw; + E_Manager *man; int alpha; double x; @@ -43,12 +44,7 @@ static void _pager_win_cb_mouse_out(void *data, Evas *e, Evas_Object *obj, void static void _pager_win_cb_mouse_down(void *data, Evas *e, Evas_Object *obj, void *event_info); static void _pager_win_cb_mouse_up(void *data, Evas *e, Evas_Object *obj, void *event_info); static void _pager_win_cb_mouse_move(void *data, Evas *e, Evas_Object *obj, void *event_info); - static void _pager_win_cb_delorig(void *data, Evas *e, Evas_Object *obj, void *event_info); -static void _pager_win_cb_intercept_move(void *data, Evas_Object *obj, Evas_Coord x, Evas_Coord y); -static void _pager_win_cb_intercept_resize(void *data, Evas_Object *obj, Evas_Coord x, Evas_Coord y); -static void _pager_win_cb_intercept_color(void *data, Evas_Object *obj, int r, int g, int b, int a); -static void _pager_win_cb_intercept_stack_above(void *data, Evas_Object *obj, Evas_Object *above); static void _pager_win_new(Evas *e, E_Manager *man, E_Manager_Comp_Source *src); static void _pager_win_del(Item *it); @@ -57,7 +53,6 @@ static void _pager_finish(); static void _pager_handler(void *data, const char *name, const char *info, int val, E_Object *obj, void *msgdata); - static Ecore_X_Window input_win = 0; static E_Msg_Handler *msg_handler = NULL; @@ -285,23 +280,10 @@ _pager_finish() e_config->desk_flip_animate_mode = tmp; } - EINA_LIST_FOREACH(items, l, it) - { - it->bd_x = it->bd->x; - it->bd_y = it->bd->y; - } - - _pager_place_windows(1.0); + /* _pager_place_windows(1.0); */ EINA_LIST_FREE(items, it) - { - if (it->bd->desk != current_desk) - { - e_border_hide(it->bd, 2); - evas_object_hide(it->o_win); - } - _pager_win_del(it); - } + _pager_win_del(it); EINA_LIST_FREE(desks, o) evas_object_del(o); @@ -312,20 +294,9 @@ _pager_finish() if (background) _pager_win_del(background); - EINA_LIST_FREE(handlers, handler) ecore_event_handler_del(handler); - /* XXX fix stacking */ - E_Comp_Win *cw, *prev = NULL; - Eina_List *list = (Eina_List *)e_manager_comp_src_list(e_manager_current_get()); - EINA_LIST_FOREACH(list, l, cw) - { - if (!cw->shobj) continue; - if (prev) evas_object_stack_above(cw->shobj, prev->shobj); - prev = cw; - } - e_msg_handler_del(msg_handler); msg_handler = NULL; zone = NULL; @@ -378,13 +349,15 @@ _pager_win_cb_mouse_down(void *data, Evas *e, Evas_Object *obj, void *event_info selected_item = it; _pager_desk_select(it->desk); - _pager_out(); return; } else if (ev->button == 1) { e_border_raise(it->bd); + e_border_focus_set(it->bd, 1, 1); + + evas_object_raise(it->o); if (current_desk != it->desk) _pager_desk_select(it->desk); @@ -587,46 +560,45 @@ _pager_win_cb_intercept_color(void *data, Evas_Object *obj, int r, int g, int b, static void _pager_win_del(Item *it) { - evas_object_event_callback_del(it->o, EVAS_CALLBACK_MOUSE_IN, - _pager_win_cb_mouse_in); - - evas_object_event_callback_del(it->o, EVAS_CALLBACK_MOUSE_OUT, - _pager_win_cb_mouse_out); - - evas_object_event_callback_del(it->o, EVAS_CALLBACK_MOUSE_DOWN, - _pager_win_cb_mouse_down); - - evas_object_event_callback_del(it->o, EVAS_CALLBACK_MOUSE_UP, - _pager_win_cb_mouse_up); - - evas_object_event_callback_del(it->o, EVAS_CALLBACK_MOUSE_MOVE, - _pager_win_cb_mouse_move); - evas_object_event_callback_del(it->o_win, EVAS_CALLBACK_DEL, _pager_win_cb_delorig); - evas_object_intercept_move_callback_del - (it->o_win, _pager_win_cb_intercept_move); - - evas_object_intercept_resize_callback_del - (it->o_win, _pager_win_cb_intercept_resize); - - evas_object_intercept_color_set_callback_del - (it->o_win, _pager_win_cb_intercept_color); - - evas_object_intercept_stack_above_callback_del - (it->o_win, _pager_win_cb_intercept_stack_above); - if (it->bd) { - it->alpha = 255; - evas_object_color_set(it->o_win, 255, 255, 255, 255); - edje_object_part_unswallow(it->o, it->o_win); - evas_object_stack_above(it->o_win, it->o); + evas_object_event_callback_del(it->o, EVAS_CALLBACK_MOUSE_IN, + _pager_win_cb_mouse_in); + + evas_object_event_callback_del(it->o, EVAS_CALLBACK_MOUSE_OUT, + _pager_win_cb_mouse_out); + + evas_object_event_callback_del(it->o, EVAS_CALLBACK_MOUSE_DOWN, + _pager_win_cb_mouse_down); + + evas_object_event_callback_del(it->o, EVAS_CALLBACK_MOUSE_UP, + _pager_win_cb_mouse_up); + + evas_object_event_callback_del(it->o, EVAS_CALLBACK_MOUSE_MOVE, + _pager_win_cb_mouse_move); + + e_manager_comp_src_hidden_set(it->man, + (E_Manager_Comp_Source *)it->cw, + EINA_FALSE); + + if (it->bd->desk != current_desk) + { + e_border_hide(it->bd, 2); + evas_object_hide(it->cw->shobj); + } + + evas_object_del(it->o_win); + evas_object_del(it->o); + e_object_unref(E_OBJECT(it->bd)); } - - evas_object_del(it->o); + else + { + evas_object_color_set(it->o_win, 255, 255, 255, 255); + } E_FREE(it); } @@ -649,19 +621,19 @@ _pager_win_new(Evas *e, E_Manager *man, E_Manager_Comp_Source *src) if (cw->win == zone->container->bg_win) { it = E_NEW(Item, 1); + it->man = man; it->o_win = o; - evas_object_event_callback_add - (it->o_win, EVAS_CALLBACK_DEL, - _pager_win_cb_delorig, it); + evas_object_event_callback_add(it->o_win, EVAS_CALLBACK_DEL, + _pager_win_cb_delorig, it); background = it; } else if (scale_conf->pager_fade_popups) { it = E_NEW(Item, 1); + it->man = man; it->o_win = o; - evas_object_event_callback_add - (it->o_win, EVAS_CALLBACK_DEL, - _pager_win_cb_delorig, it); + evas_object_event_callback_add(it->o_win, EVAS_CALLBACK_DEL, + _pager_win_cb_delorig, it); popups = eina_list_append(popups, it); } @@ -677,11 +649,14 @@ _pager_win_new(Evas *e, E_Manager *man, E_Manager_Comp_Source *src) it = E_NEW(Item, 1); it->bd = cw->bd; it->desk = it->bd->desk; + it->man = man; it->cw = cw; it->alpha = 255.0; e_object_ref(E_OBJECT(it->bd)); - it->o_win = e_manager_comp_src_shadow_get(man, src); + e_manager_comp_src_hidden_set(man, src, EINA_TRUE); + it->o_win = e_manager_comp_src_image_mirror_add(man, src); + it->o = edje_object_add(e); if (!e_theme_edje_object_set(it->o, "base/theme/modules/scale", "modules/scale/win")) @@ -695,18 +670,6 @@ _pager_win_new(Evas *e, E_Manager *man, E_Manager_Comp_Source *src) evas_object_event_callback_add(it->o_win, EVAS_CALLBACK_DEL, _pager_win_cb_delorig, it); - evas_object_intercept_move_callback_add - (it->o_win, _pager_win_cb_intercept_move, it); - - evas_object_intercept_resize_callback_add - (it->o_win, _pager_win_cb_intercept_resize, it); - - evas_object_intercept_color_set_callback_add - (it->o_win, _pager_win_cb_intercept_color, it); - - evas_object_intercept_stack_above_callback_add - (it->o_win, _pager_win_cb_intercept_stack_above, it); - evas_object_event_callback_add(it->o, EVAS_CALLBACK_MOUSE_IN, _pager_win_cb_mouse_in, it); @@ -739,17 +702,10 @@ _pager_win_new(Evas *e, E_Manager *man, E_Manager_Comp_Source *src) if (it->desk != current_desk) { e_border_show(it->bd); - evas_object_move(it->o, it->cur_x, it->cur_y); - - if (scale_conf->pager_fade_windows) - { - it->alpha = 0.0; - evas_object_color_set(it->o_win, 0, 0, 0, 0); - } } _pager_win_final_position_set(it); - evas_object_color_set(it->o, 255, 255, 255, 255); + it->w = it->bd->w / zoom - OFFSET*2.0; it->h = it->bd->h / zoom - OFFSET*2.0; @@ -1067,6 +1023,17 @@ _pager_run(E_Manager *man) _pager_place_desks(1.0); } + _pager_place_windows(1.0); + + if (scale_conf->pager_fade_windows) + { + Item *it; + + EINA_LIST_FOREACH(items, l, it) + if (it->bd->desk != current_desk) + evas_object_color_set(it->o_win, 0, 0, 0, 0); + } + evas_event_feed_mouse_in(e, ecore_x_current_time_get(), NULL); evas_event_feed_mouse_move(e, -1000000, -1000000, ecore_x_current_time_get(), NULL); diff --git a/src/e_mod_scale.c b/src/e_mod_scale.c index 477ebdd..71d1600 100644 --- a/src/e_mod_scale.c +++ b/src/e_mod_scale.c @@ -15,6 +15,7 @@ struct _Item Evas_Object *o, *o_win; E_Border *bd; E_Comp_Win *cw; + E_Manager *man; double scale; int alpha; @@ -36,10 +37,9 @@ struct _Item /* borders' desk distance to the current desk */ int dx, dy; - int overlaps; + Eina_Bool overlaps; int in_slots; - int slot_x; int slot_y; @@ -63,12 +63,7 @@ static void _scale_win_cb_mouse_in(void *data, Evas *e, Evas_Object *obj, void * static void _scale_win_cb_mouse_out(void *data, Evas *e, Evas_Object *obj, void *event_info); static void _scale_win_cb_mouse_down(void *data, Evas *e, Evas_Object *obj, void *event_info); static void _scale_win_cb_mouse_up(void *data, Evas *e, Evas_Object *obj, void *event_info); - static void _scale_win_cb_delorig(void *data, Evas *e, Evas_Object *obj, void *event_info); -static void _scale_win_cb_intercept_move(void *data, Evas_Object *obj, Evas_Coord x, Evas_Coord y); -static void _scale_win_cb_intercept_resize(void *data, Evas_Object *obj, Evas_Coord x, Evas_Coord y); -static void _scale_win_cb_intercept_color(void *data, Evas_Object *obj, int r, int g, int b, int a); -static void _scale_win_cb_intercept_stack_above(void *data, Evas_Object *obj, Evas_Object *above); static void _scale_win_new(Evas *e, E_Manager *man, E_Manager_Comp_Source *src, E_Desk *desk); static void _scale_win_del(Item *it); @@ -76,7 +71,6 @@ static void _scale_win_del(Item *it); static void _scale_finish(void); static void _scale_in(void); static void _scale_out(int mode); - static void _scale_handler(void *data, const char *name, const char *info, int val, E_Object *obj, void *msgdata); @@ -101,6 +95,7 @@ static E_Desk *current_desk = NULL; static int show_all_desks = EINA_FALSE; static int send_to_desk = EINA_FALSE; static int scale_layout; +static int init_method = 0; static void _scale_place_windows(double scale) @@ -201,6 +196,8 @@ _scale_in() start_time = ecore_time_get(); scale_state = EINA_TRUE; + _scale_place_windows(1.0); + if (!scale_animator) scale_animator = ecore_animator_add(_scale_redraw, NULL); } @@ -215,9 +212,10 @@ _scale_out(int mode) { selected_item = NULL; } - else if (mode == 1) + else if (it && (mode == 1)) { /* goto selected windows desk */ + current_desk = it->bd->desk; EINA_LIST_FOREACH(items, l, ot) @@ -241,7 +239,7 @@ _scale_out(int mode) } } } - else if (mode == 2) + else if (it && (mode == 2)) { send_to_desk = EINA_TRUE; it->bd_x = it->bd->x; @@ -263,8 +261,28 @@ _scale_out(int mode) if (selected_item) { - e_border_raise(selected_item->bd); - edje_object_signal_emit(selected_item->o, "hide", "e"); + it = selected_item; + + evas_object_raise(it->o); + e_border_raise(it->bd); + + if ((init_method == GO_KEY) && (e_config->focus_policy != E_FOCUS_CLICK)) + { + int slide = e_config->pointer_slide; + int focus = e_config->focus_policy; + + e_config->pointer_slide = 1; + e_config->focus_policy = E_FOCUS_MOUSE; + + e_border_focus_set_with_pointer(it->bd); + + e_config->pointer_slide = slide; + e_config->focus_policy = focus; + } + else + e_border_focus_set(it->bd, 1, 1); + + edje_object_signal_emit(it->o, "hide", "e"); } scale_state = EINA_FALSE; @@ -298,26 +316,14 @@ _scale_finish() e_config->desk_flip_animate_mode = 0; e_desk_show(desk); e_config->desk_flip_animate_mode = tmp; + current_desk = desk; } } - EINA_LIST_FOREACH(items, l, it) - { - it->bd_x = it->bd->x; - it->bd_y = it->bd->y; - } - - _scale_place_windows(1.0); + /* _scale_place_windows(1.0); */ EINA_LIST_FREE(items, it) - { - if (it->bd->desk != desk) - { - e_border_hide(it->bd, 2); - evas_object_hide(it->o_win); - } - _scale_win_del(it); - } + _scale_win_del(it); EINA_LIST_FREE(popups, it) _scale_win_del(it); @@ -328,16 +334,6 @@ _scale_finish() EINA_LIST_FREE(handlers, handler) ecore_event_handler_del(handler); - /* XXX fix stacking */ - E_Comp_Win *cw, *prev = NULL; - Eina_List *list = (Eina_List *)e_manager_comp_src_list(e_manager_current_get()); - EINA_LIST_FOREACH(list, l, cw) - { - if (!cw->shobj) continue; - if (prev) evas_object_stack_above(cw->shobj, prev->shobj); - prev = cw; - } - e_msg_handler_del(msg_handler); msg_handler = NULL; zone = NULL; @@ -422,85 +418,45 @@ _scale_win_cb_delorig(void *data, Evas *e, Evas_Object *obj, void *event_info) _scale_win_del(it); } -static void -_scale_win_cb_intercept_stack_above(void *data, Evas_Object *obj, Evas_Object *above) -{ - Item *ot, *it = data; - Eina_List *l; - - EINA_LIST_FOREACH(items, l, ot) - if (ot->o_win == above) break; - - if (ot) - evas_object_stack_above(it->o, ot->o); -} - -static void -_scale_win_cb_intercept_move(void *data, Evas_Object *obj, Evas_Coord x, Evas_Coord y) -{ - Item *it = data; - evas_object_move(obj, it->cur_x, it->cur_y); -} - -static void -_scale_win_cb_intercept_resize(void *data, Evas_Object *obj, Evas_Coord w, Evas_Coord h) -{ - Item *it = data; - evas_object_resize(obj, it->cur_w, it->cur_h); -} - -static void -_scale_win_cb_intercept_color(void *data, Evas_Object *obj, int r, int g, int b, int a) -{ - Item *it = data; - evas_object_color_set(obj, it->alpha, it->alpha, it->alpha, it->alpha); -} - static void _scale_win_del(Item *it) { - evas_object_event_callback_del(it->o, EVAS_CALLBACK_MOUSE_IN, - _scale_win_cb_mouse_in); - - evas_object_event_callback_del(it->o, EVAS_CALLBACK_MOUSE_OUT, - _scale_win_cb_mouse_out); - - evas_object_event_callback_del(it->o, EVAS_CALLBACK_MOUSE_DOWN, - _scale_win_cb_mouse_down); - - evas_object_event_callback_del(it->o, EVAS_CALLBACK_MOUSE_UP, - _scale_win_cb_mouse_up); - - /* evas_object_event_callback_del(it->o, EVAS_CALLBACK_MOUSE_MOVE, - * _scale_win_cb_mouse_move); */ - evas_object_event_callback_del(it->o_win, EVAS_CALLBACK_DEL, _scale_win_cb_delorig); - evas_object_intercept_move_callback_del - (it->o_win, _scale_win_cb_intercept_move); - - evas_object_intercept_resize_callback_del - (it->o_win, _scale_win_cb_intercept_resize); - - evas_object_intercept_color_set_callback_del - (it->o_win, _scale_win_cb_intercept_color); - - evas_object_intercept_stack_above_callback_del - (it->o_win, _scale_win_cb_intercept_stack_above); - - evas_object_del(it->o); - - evas_object_color_set(it->o_win, 255, 255, 255, 255); - if (it->bd) { - it->alpha = 255; - evas_object_color_set(it->o_win, 255, 255, 255, 255); - edje_object_part_unswallow(it->o, it->o_win); - evas_object_stack_above(it->o_win, it->o); + evas_object_event_callback_del(it->o, EVAS_CALLBACK_MOUSE_IN, + _scale_win_cb_mouse_in); + + evas_object_event_callback_del(it->o, EVAS_CALLBACK_MOUSE_OUT, + _scale_win_cb_mouse_out); + + evas_object_event_callback_del(it->o, EVAS_CALLBACK_MOUSE_DOWN, + _scale_win_cb_mouse_down); + + evas_object_event_callback_del(it->o, EVAS_CALLBACK_MOUSE_UP, + _scale_win_cb_mouse_up); + + e_manager_comp_src_hidden_set(it->man, + (E_Manager_Comp_Source *)it->cw, + EINA_FALSE); + + if (it->bd->desk != current_desk) + { + e_border_hide(it->bd, 2); + evas_object_hide(it->cw->shobj); + } + + evas_object_del(it->o_win); + evas_object_del(it->o); + e_object_unref(E_OBJECT(it->bd)); } + else + { + evas_object_color_set(it->o_win, 255, 255, 255, 255); + } E_FREE(it); } @@ -521,19 +477,20 @@ _scale_win_new(Evas *e, E_Manager *man, E_Manager_Comp_Source *src, E_Desk *desk if (scale_conf->fade_desktop) { it = E_NEW(Item, 1); + it->man = man; it->o_win = e_manager_comp_src_shadow_get(man, src); evas_object_event_callback_add(it->o_win, EVAS_CALLBACK_DEL, - _scale_win_cb_delorig, it); + _scale_win_cb_delorig, it); background = it; } } else if (scale_conf->fade_popups) { it = E_NEW(Item, 1); + it->man = man; it->o_win = e_manager_comp_src_shadow_get(man, src); evas_object_event_callback_add(it->o_win, EVAS_CALLBACK_DEL, - _scale_win_cb_delorig, it); - + _scale_win_cb_delorig, it); popups = eina_list_append(popups, it); } return; @@ -555,33 +512,24 @@ _scale_win_new(Evas *e, E_Manager *man, E_Manager_Comp_Source *src, E_Desk *desk e_object_ref(E_OBJECT(cw->bd)); it->bd = cw->bd; + it->man = man; it->cw = cw; - it->o_win = e_manager_comp_src_shadow_get(man, src); + e_manager_comp_src_hidden_set(man, src, EINA_TRUE); + it->o_win = e_manager_comp_src_image_mirror_add(man, src); + evas_object_show(it->o_win); it->o = edje_object_add(e); if (!e_theme_edje_object_set(it->o, "base/theme/modules/scale", "modules/scale/win")) edje_object_file_set(it->o, scale_conf->theme_path, "modules/scale/win"); - evas_object_stack_above(it->o, it->o_win); + evas_object_stack_below(it->o, it->o_win); evas_object_show(it->o); edje_object_part_swallow(it->o, "e.swallow.win", it->o_win); evas_object_event_callback_add(it->o_win, EVAS_CALLBACK_DEL, _scale_win_cb_delorig, it); - evas_object_intercept_move_callback_add - (it->o_win, _scale_win_cb_intercept_move, it); - - evas_object_intercept_resize_callback_add - (it->o_win, _scale_win_cb_intercept_resize, it); - - evas_object_intercept_color_set_callback_add - (it->o_win, _scale_win_cb_intercept_color, it); - - evas_object_intercept_stack_above_callback_add - (it->o_win, _scale_win_cb_intercept_stack_above, it); - evas_object_event_callback_add(it->o, EVAS_CALLBACK_MOUSE_IN, _scale_win_cb_mouse_in, it); @@ -614,10 +562,7 @@ _scale_win_new(Evas *e, E_Manager *man, E_Manager_Comp_Source *src, E_Desk *desk it->cur_h = it->h; if (it->bd->desk != desk) - { - e_border_show(it->bd); - evas_object_move(it->o_win, it->x, it->y); - } + e_border_show(it->bd); edje_object_signal_emit(it->o, "show", "e"); @@ -1428,6 +1373,7 @@ _scale_switch(const char *params) edje_object_signal_emit(it->o, "mouse,out", "e"); it = it->next; edje_object_signal_emit(it->o, "mouse,in", "e"); + e_border_focus_set(it->bd, 1, 1); selected_item = it; } else if (!strcmp(params, "_prev")) @@ -1436,6 +1382,7 @@ _scale_switch(const char *params) edje_object_signal_emit(it->o, "mouse,out", "e"); it = it->prev; edje_object_signal_emit(it->o, "mouse,in", "e"); + e_border_focus_set(it->bd, 1, 1); selected_item = it; } } @@ -1530,7 +1477,7 @@ _scale_cb_key_up(void *data, int type, void *event) } static Eina_Bool -_scale_run(E_Manager *man, int init_method) +_scale_run(E_Manager *man) { Eina_List *l; E_Manager_Comp_Source *src; @@ -1680,7 +1627,7 @@ _scale_run(E_Manager *man, int init_method) evas_event_feed_mouse_move(e, -1000000, -1000000, ecore_x_current_time_get(), NULL); - if (init_method == 0) + if (init_method == GO_KEY) { E_Border *bd = e_border_focused_get(); @@ -1695,6 +1642,13 @@ _scale_run(E_Manager *man, int init_method) edje_object_signal_emit(selected_item->o, "mouse,in", "e"); } + if (scale_conf->pager_fade_windows) + { + EINA_LIST_FOREACH(items, l, it) + if (it->bd->desk != current_desk) + evas_object_color_set(it->o_win, 0, 0, 0, 0); + } + _scale_in(); return EINA_TRUE; @@ -1748,12 +1702,12 @@ _scale_cb_mouse_up(void *data, int type, void *event) } Eina_Bool -scale_run(E_Manager *man, const char *params, int init_method) +scale_run(E_Manager *man, const char *params, int _init_method) { Eina_List *l; Eina_Bool ret = EINA_FALSE; - if (!strcmp(params, "go_scale_all")) + if (!strncmp(params, "go_scale_all", 12)) { scale_layout = scale_conf->desks_layout_mode; show_all_desks = EINA_TRUE; @@ -1765,20 +1719,25 @@ scale_run(E_Manager *man, const char *params, int init_method) show_all_desks = EINA_FALSE; } + init_method = _init_method; + /* FIXME means: if keyboard use slotted layout */ - if (init_method == 0) + if (init_method == GO_KEY) scale_layout = 1; if (scale_state) { - _scale_switch(params+8); + if (show_all_desks) + _scale_switch(params+12); + else + _scale_switch(params+8); } else { if (input_win) return ret; - ret = _scale_run(man, init_method); + ret = _scale_run(man); } return ret;