giant comp rejiggering commit #5:
authorMike Blumenkrantz <m.blumenkran@samsung.com>
Mon, 25 Feb 2013 14:04:12 +0000 (14:04 +0000)
committerMike Blumenkrantz <m.blumenkran@samsung.com>
Mon, 15 Apr 2013 07:39:16 +0000 (08:39 +0100)
* border frame/object now drawn directly on compositor canvas

* border shadows now in border theme with edje hint, non-updated themes still receive comp object shadows FOR NOW

* e_border MOVE/RESIZE pointer mode defines are now e_pointer.h enums

* added BD_CHANGED() util macro for setting bd->changed and printing a debug line to assist in finding places where this all-important flag is wrongly set

* bd->bg_win removed entirely

* bd->pointer objects moved to compositor object; now only one pointer object exists for each compositor

* resizing windows now shows a new and totally-intended scaling effect for window contents

* some additional retooling of border deletion/free callbacks

* fixed lurking potential bug where window could recieve focus from autoraise timer after border had been deleted

* more comp shape improvements/rewrites

* desk transitions are now BROKEN(ish)

* various modules updated to not be totally broken with these changes

25 files changed:
ChangeLog
NEWS
data/themes/edc/border.edc
src/bin/e_actions.c
src/bin/e_border.c
src/bin/e_border.h
src/bin/e_comp.c
src/bin/e_comp.h
src/bin/e_container.c
src/bin/e_container.h
src/bin/e_desklock.c
src/bin/e_dnd.c
src/bin/e_manager.c
src/bin/e_pointer.c
src/bin/e_pointer.h
src/bin/e_shelf.c
src/bin/e_win.c
src/modules/everything/e_mod_main.h
src/modules/everything/evry.c
src/modules/everything/evry_gadget.c
src/modules/fileman/e_fwin.c
src/modules/illume-indicator/e_mod_ind_win.c
src/modules/shot/e_mod_main.c
src/modules/tasks/e_mod_main.c
src/modules/winlist/e_winlist.c

index 1e76acb..5204c34 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2013-04-15 Mike Blumenkrantz
+
+        * window borders now drawn on compositor canvas
+
 2013-04-05 Jérémy Zurcher
 
         * added support for systemd halt and poweroff
diff --git a/NEWS b/NEWS
index 3cf0eb1..a25ba46 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -126,6 +126,7 @@ Improvements:
     * shelf gadcon can no longer resize smaller than 16x16, ensuring dnd success
     * Don't rely on bash or zsh behavior when starting enlightenment_init and tempget.
     * menus are now drawn directly on the compositor canvas
+    * window borders now drawn on compositor canvas
 
 Fixes:
     * IBar menu didn't allow to configure different icon sources, show contents menu even on empty IBar.
index 28f5d41..d445a47 100644 (file)
@@ -19,6 +19,8 @@ group { name: "e/widgets/border/default/border";
    images.image: "sym_up_light_selected.png" COMP;
    images.image: "glow_round_corners_small.png" COMP;
    images.image: "knob_round_small_busy.png" COMP;
+   images.image: "screen_circular_shadow.png" COMP;
+   data.item: "shadow" "1";
    parts {
       part { name: "client_clip"; type: RECT;
          description { state: "default" 0.0;
@@ -71,7 +73,7 @@ group { name: "e/widgets/border/default/border";
             fill.smooth: 0;
          }
       }
-      part { name: "e.text.title"; type: TEXT;
+      part { name: "e.text.title"; type: TEXT; mouse_events: 0;
          scale: 1;
          effect: SHADOW BOTTOM;
          description { state: "default" 0.0;
@@ -97,7 +99,7 @@ group { name: "e/widgets/border/default/border";
             visible: 0;
          }
       }
-      part { name: "title2"; type: TEXT;
+      part { name: "title2"; type: TEXT; mouse_events: 0;
          scale: 1;
          effect: SOFT_SHADOW BOTTOM;
          description { state: "default" 0.0;
@@ -141,7 +143,7 @@ group { name: "e/widgets/border/default/border";
             rel2.relative: 1.0 0.85;
          }
       }
-      part { name: "e.swallow.icon"; type: SWALLOW;
+      part { name: "e.swallow.icon"; type: SWALLOW; mouse_events: 0;
          description { state: "default" 0.0;
             rel1.to: "icon";
             rel1.relative: 0.15 0.15;
@@ -150,7 +152,7 @@ group { name: "e/widgets/border/default/border";
             rel2.offset: 0 0;
          }
       }
-      part { name: "busy_clip"; type: RECT;
+      part { name: "busy_clip"; type: RECT; mouse_events: 0;
          description { state: "default" 0.0;
             color: 255 255 255 0;
             visible: 0;
@@ -194,7 +196,7 @@ group { name: "e/widgets/border/default/border";
             map.rotation.z: 360;
          }
       }
-      part { name: "clip1"; type: RECT;
+      part { name: "clip1"; type: RECT; mouse_events: 0;
          description { state: "default" 0.0;
             rel1.to: "top";
             rel2.to: "top";
@@ -204,7 +206,7 @@ group { name: "e/widgets/border/default/border";
             visible: 0;
          }
       }
-      part { name: "clip2"; type: RECT;
+      part { name: "clip2"; type: RECT; mouse_events: 0;
          description { state: "default" 0.0;
             rel1.to: "top";
             rel2.to: "top";
@@ -215,7 +217,7 @@ group { name: "e/widgets/border/default/border";
             visible: 1;
          }
       }
-      part { name: "close1";
+      part { name: "close1";  mouse_events: 0;
          clip_to: "clip1";
          description { state: "default" 0.0;
             image.normal: "sym_close_dark_normal.png";
@@ -230,7 +232,7 @@ group { name: "e/widgets/border/default/border";
             image.normal: "sym_close_dark_selected.png";
          }
       }
-      part { name: "max1";
+      part { name: "max1"; mouse_events: 0;
          clip_to: "clip1";
          description { state: "default" 0.0;
             image.normal: "sym_up_dark_normal.png";
@@ -245,7 +247,7 @@ group { name: "e/widgets/border/default/border";
             image.normal: "sym_up_dark_selected.png";
          }
       }
-      part { name: "min1";
+      part { name: "min1"; mouse_events: 0;
          clip_to: "clip1";
          description { state: "default" 0.0;
             image.normal: "sym_down_dark_normal.png";
@@ -260,7 +262,7 @@ group { name: "e/widgets/border/default/border";
             image.normal: "sym_down_dark_selected.png";
          }
       }
-      part { name: "close2";
+      part { name: "close2"; mouse_events: 0;
          clip_to: "clip2";
          description { state: "default" 0.0;
             image.normal: "sym_close_light_normal.png";
@@ -275,7 +277,7 @@ group { name: "e/widgets/border/default/border";
             image.normal: "sym_close_light_selected.png";
          }
       }
-      part { name: "max2";
+      part { name: "max2"; mouse_events: 0;
          clip_to: "clip2";
          description { state: "default" 0.0;
             image.normal: "sym_up_light_normal.png";
@@ -290,7 +292,7 @@ group { name: "e/widgets/border/default/border";
             image.normal: "sym_up_light_selected.png";
          }
       }
-      part { name: "min2";
+      part { name: "min2"; mouse_events: 0;
          clip_to: "clip2";
          description { state: "default" 0.0;
             image.normal: "sym_down_light_normal.png";
@@ -389,7 +391,7 @@ group { name: "e/widgets/border/default/border";
             color: 0 0 0 0;
          }
       }
-      part { name: "bottom"; type: RECT;
+      part { name: "bottom"; type: RECT; mouse_events: 0;
          description { state: "default" 0.0;
             color_class: "border_bottom";
             rel1.relative: 0.0 1.0;
@@ -410,7 +412,7 @@ group { name: "e/widgets/border/default/border";
             visible: 0;
          }
       }
-      part { name: "bevel2";
+      part { name: "bevel2"; mouse_events: 0;
          description { state: "default" 0.0;
             image.normal: "bevel_dark_out.png";
             image.border: 1 1 1 1;
@@ -428,6 +430,24 @@ group { name: "e/widgets/border/default/border";
             visible: 0;
          }
       }
+      part { name: "shadow";
+         mouse_events: 0;
+         description { state: "default" 0.0;
+            image.normal: "win_shadow.png";
+            image.border: 14 14 14 14;
+            image.middle: 0;
+            rel1.relative: 0.0 1.0;
+            rel1.to: "top";
+            rel1.offset: -7 -3;
+            rel2.to: "bottom";
+            rel2.offset: 6 11;
+            fill.smooth: 0;
+         }
+         description { state: "hidden" 0.0;
+            inherit: "default" 0.0;
+            visible: 0;
+         }
+      }
       part { name: "e.event.resize.bl"; type: RECT;
          description { state: "default" 0.0;
             rel1.relative: 0.0 1.0;
@@ -501,9 +521,24 @@ group { name: "e/widgets/border/default/border";
             FIXED_SIZE(69, 5)
          }
       }
+      part { name: "events"; type: RECT; repeat_events: 1;
+        description { state: "default";
+           color: 0 0 0 0;
+        }
+      }
    }
    programs {
       program {
+         signal: "e,state,shadow,on"; source: "e";
+         action: STATE_SET "default" 0.0;
+         target: "shadow";
+      }
+      program {
+         signal: "e,state,shadow,off"; source: "e";
+         action: STATE_SET "hidden" 0.0;
+         target: "shadow";
+      }
+      program {
          signal: "e,state,focused"; source: "e";
          action: STATE_SET "focused" 0.0;
          target: "top";
index 038feb3..599df02 100644 (file)
@@ -119,9 +119,7 @@ ACT_FN_GO_SIGNAL(window_move, )
           e_border_signal_move_end((E_Border *)obj, sig, src);
         else
           {
-             if (((E_Border *)obj)->moving)
-               e_border_signal_move_end((E_Border *)obj, sig, src);
-             else
+             if (!((E_Border *)obj)->moving)
                e_border_signal_move_begin((E_Border *)obj, sig, src);
           }
      }
@@ -2488,7 +2486,7 @@ ACT_FN_GO(pointer_resize_push, )
         if ((bd->lock_user_size) || (bd->shaded) || (bd->shading) ||
             (bd->fullscreen) || ((bd->maximized) && (!e_config->allow_manip)))
           return;
-        e_pointer_type_push(bd->pointer, bd, params);
+        e_pointer_type_push(e_comp_get(bd)->pointer, bd, params);
      }
 }
 
@@ -2504,7 +2502,7 @@ ACT_FN_GO(pointer_resize_pop, )
         if ((bd->lock_user_size) || (bd->shaded) || (bd->shading) ||
             (bd->fullscreen) || ((bd->maximized) && (!e_config->allow_manip)))
           return;
-        e_pointer_type_pop(bd->pointer, bd, params);
+        e_pointer_type_pop(e_comp_get(bd)->pointer, bd, params);
      }
 }
 
index 9c90aee..cbf277f 100644 (file)
@@ -3,18 +3,6 @@
 //#define INOUTDEBUG_MOUSE 1
 //#define INOUTDEBUG_FOCUS 1
 
-/* These are compatible with netwm */
-#define RESIZE_TL   0
-#define RESIZE_T    1
-#define RESIZE_TR   2
-#define RESIZE_R    3
-#define RESIZE_BR   4
-#define RESIZE_B    5
-#define RESIZE_BL   6
-#define RESIZE_L    7
-#define MOVE        8
-#define RESIZE_NONE 11
-
 /* local subsystem functions */
 static void _e_border_pri_raise(E_Border *bd);
 static void _e_border_pri_norm(E_Border *bd);
@@ -29,6 +17,8 @@ static void _e_border_print(E_Border *bd,
                             const char *func);
 #endif
 
+static void _e_border_shadow(E_Border *bd);
+
 /* FIXME: these likely belong in a separate icccm/client handler */
 /* and the border needs to become a dumb object that just does what its */
 /* told to do */
@@ -101,24 +91,6 @@ static void      _e_border_cb_signal_bind(void *data,
                                           Evas_Object *obj,
                                           const char *emission,
                                           const char *source);
-static Eina_Bool _e_border_cb_mouse_in(void *data,
-                                       int type,
-                                       void *event);
-static Eina_Bool _e_border_cb_mouse_out(void *data,
-                                        int type,
-                                        void *event);
-static Eina_Bool _e_border_cb_mouse_wheel(void *data,
-                                          int type,
-                                          void *event);
-static Eina_Bool _e_border_cb_mouse_down(void *data,
-                                         int type,
-                                         void *event);
-static Eina_Bool _e_border_cb_mouse_up(void *data,
-                                       int type,
-                                       void *event);
-static Eina_Bool _e_border_cb_mouse_move(void *data,
-                                         int type,
-                                         void *event);
 static Eina_Bool _e_border_cb_grab_replay(void *data,
                                           int type,
                                           void *event);
@@ -193,23 +165,22 @@ static void      _e_border_move_update(E_Border *bd);
 static Eina_Bool _e_border_cb_ping_poller(void *data);
 static Eina_Bool _e_border_cb_kill_timer(void *data);
 
-static void      _e_border_pointer_resize_begin(E_Border *bd);
-static void      _e_border_pointer_resize_end(E_Border *bd);
-static void      _e_border_pointer_move_begin(E_Border *bd);
-static void      _e_border_pointer_move_end(E_Border *bd);
-
 static void      _e_border_hook_call(E_Border_Hook_Point hookpoint,
                                      void *bd);
 
 static void      _e_border_client_move_resize_send(E_Border *bd);
 
-static void      _e_border_frame_replace(E_Border *bd,
-                                         Eina_Bool argb);
-
 static void      _e_border_shape_input_rectangle_set(E_Border *bd);
 static void      _e_border_show(E_Border *bd);
 static void      _e_border_hide(E_Border *bd);
 
+static Eina_Bool _e_border_cb_mouse_x_wheel(void *d EINA_UNUSED, int t, Ecore_Event_Mouse_Wheel *ev);
+static Eina_Bool _e_border_cb_mouse_x_up(void *d EINA_UNUSED, int t, Ecore_Event_Mouse_Button *ev);
+static Eina_Bool _e_border_cb_mouse_x_down(void *d EINA_UNUSED, int t, Ecore_Event_Mouse_Button *ev);
+static Eina_Bool _e_border_cb_mouse_x_move(void *d, int t EINA_UNUSED, Ecore_Event_Mouse_Move *ev);
+static Eina_Bool _e_border_cb_mouse_x_in(void *d, int t EINA_UNUSED, Ecore_X_Event_Mouse_In *ev);
+static Eina_Bool _e_border_cb_mouse_x_out(void *d, int t EINA_UNUSED, Ecore_X_Event_Mouse_Out *ev);
+
 static void      _e_border_move_lost_window_to_center(E_Border *bd);
 static void      _e_border_reset_lost_window(E_Border *bd);
 static Eina_Bool _e_border_pointer_warp_to_center_timer(void *data);
@@ -269,8 +240,7 @@ EAPI int E_EVENT_BORDER_FULLSCREEN = 0;
 EAPI int E_EVENT_BORDER_UNFULLSCREEN = 0;
 
 #define GRAV_SET(bd, grav)                                                         \
-  ecore_x_window_gravity_set(bd->bg_win, grav);                                    \
-  ecore_x_window_gravity_set(bd->client.shell_win, grav);                          \
+  ecore_x_window_gravity_set(bd->win, grav);                          \
   if (bd->client.lock_win) ecore_x_window_gravity_set(bd->client.lock_win, grav);  \
   ecore_x_window_gravity_set(bd->client.win, grav);
 
@@ -328,6 +298,18 @@ e_border_init(void)
                          _e_border_cb_desktop_change, NULL);
    E_LIST_HANDLER_APPEND(handlers, ECORE_X_EVENT_SYNC_ALARM,
                          _e_border_cb_sync_alarm, NULL);
+   E_LIST_HANDLER_APPEND(handlers, ECORE_EVENT_MOUSE_BUTTON_DOWN,
+                         _e_border_cb_mouse_x_down, NULL);
+   E_LIST_HANDLER_APPEND(handlers, ECORE_EVENT_MOUSE_BUTTON_UP,
+                         _e_border_cb_mouse_x_up, NULL);
+   E_LIST_HANDLER_APPEND(handlers, ECORE_X_EVENT_MOUSE_IN,
+                         _e_border_cb_mouse_x_in, NULL);
+   E_LIST_HANDLER_APPEND(handlers, ECORE_X_EVENT_MOUSE_OUT,
+                         _e_border_cb_mouse_x_out, NULL);
+   E_LIST_HANDLER_APPEND(handlers, ECORE_EVENT_MOUSE_WHEEL,
+                         _e_border_cb_mouse_x_wheel, NULL);
+   E_LIST_HANDLER_APPEND(handlers, ECORE_EVENT_MOUSE_MOVE,
+                         _e_border_cb_mouse_x_move, NULL);
 
    ecore_x_passive_grab_replay_func_set(_e_border_cb_grab_replay, NULL);
 
@@ -421,6 +403,7 @@ e_border_new(E_Container *con,
    bd->h = 1;
    /* FIXME: ewww - round trip */
    bd->client.argb = ecore_x_window_argb_get(win);
+   /* match bd parent argbness */
    if (bd->client.argb)
      bd->win = ecore_x_window_manager_argb_new(con->win, 0, 0, bd->w, bd->h);
    else
@@ -431,37 +414,27 @@ e_border_new(E_Container *con,
    e_bindings_mouse_grab(E_BINDING_CONTEXT_WINDOW, bd->win);
    e_bindings_wheel_grab(E_BINDING_CONTEXT_WINDOW, bd->win);
    e_focus_setup(bd);
-   bd->bg_ecore_evas = e_canvas_new(bd->win,
-                                    0, 0, bd->w, bd->h, 1, 0,
-                                    &(bd->bg_win));
-   ecore_evas_ignore_events_set(bd->bg_ecore_evas, EINA_TRUE);
-   e_canvas_add(bd->bg_ecore_evas);
-   bd->event_win = ecore_x_window_input_new(bd->win, 0, 0, bd->w, bd->h);
-   bd->bg_evas = ecore_evas_get(bd->bg_ecore_evas);
-   ecore_x_window_shape_events_select(bd->bg_win, 1);
-   ecore_evas_name_class_set(bd->bg_ecore_evas, "E", "Frame_Window");
-   ecore_evas_title_set(bd->bg_ecore_evas, "Enlightenment Frame");
-   if (bd->client.argb)
-     bd->client.shell_win = ecore_x_window_manager_argb_new(bd->win, 0, 0, 1, 1);
-   else
-     bd->client.shell_win = ecore_x_window_override_new(bd->win, 0, 0, 1, 1);
-   ecore_x_window_container_manage(bd->client.shell_win);
-   if (!internal) ecore_x_window_client_manage(win);
    /* FIXME: Round trip. XCB */
    /* fetch needed to avoid grabbing the server as window may vanish */
    att = &bd->client.initial_attributes;
    if ((!ecore_x_window_attributes_get(win, att)) || (att->input_only))
      {
         //     printf("##- ATTR FETCH FAILED/INPUT ONLY FOR 0x%x - ABORT MANAGE\n", win);
-        e_canvas_del(bd->bg_ecore_evas);
-        ecore_evas_free(bd->bg_ecore_evas);
-        ecore_x_window_free(bd->client.shell_win);
+        ecore_x_window_free(bd->win);
         e_bindings_mouse_ungrab(E_BINDING_CONTEXT_WINDOW, bd->win);
         e_bindings_wheel_ungrab(E_BINDING_CONTEXT_WINDOW, bd->win);
         ecore_x_window_free(bd->win);
         free(bd);
         return NULL;
      }
+   ecore_x_window_container_manage(bd->win);
+   if (!internal) ecore_x_window_client_manage(win);
+   ecore_x_window_configure(bd->win,
+                            ECORE_X_WINDOW_CONFIGURE_MASK_SIBLING |
+                            ECORE_X_WINDOW_CONFIGURE_MASK_STACK_MODE,
+                            0, 0, 0, 0, 0,
+                            win, ECORE_X_WINDOW_STACK_BELOW);
+   ecore_x_event_mask_set(bd->win, ECORE_X_EVENT_MASK_MOUSE_IN | ECORE_X_EVENT_MASK_MOUSE_OUT);
 
    /* printf("##- ON MAP CLIENT 0x%x SIZE %ix%i %i:%i\n",
     *     bd->client.win, bd->client.w, bd->client.h, att->x, att->y); */
@@ -485,19 +458,6 @@ e_border_new(E_Container *con,
 
    _e_border_hook_call(E_BORDER_HOOK_NEW_BORDER, bd);
 
-   E_LIST_HANDLER_APPEND(bd->handlers, ECORE_X_EVENT_MOUSE_IN,
-                         _e_border_cb_mouse_in, bd);
-   E_LIST_HANDLER_APPEND(bd->handlers, ECORE_X_EVENT_MOUSE_OUT,
-                         _e_border_cb_mouse_out, bd);
-   E_LIST_HANDLER_APPEND(bd->handlers, ECORE_EVENT_MOUSE_BUTTON_DOWN,
-                         _e_border_cb_mouse_down, bd);
-   E_LIST_HANDLER_APPEND(bd->handlers, ECORE_EVENT_MOUSE_BUTTON_UP,
-                         _e_border_cb_mouse_up, bd);
-   E_LIST_HANDLER_APPEND(bd->handlers, ECORE_EVENT_MOUSE_MOVE,
-                         _e_border_cb_mouse_move, bd);
-   E_LIST_HANDLER_APPEND(bd->handlers, ECORE_EVENT_MOUSE_WHEEL,
-                         _e_border_cb_mouse_wheel, bd);
-
    bd->client.icccm.title = NULL;
    bd->client.icccm.name = NULL;
    bd->client.icccm.class = NULL;
@@ -700,7 +660,7 @@ e_border_new(E_Container *con,
    bd->w = bd->client.w;
    bd->h = bd->client.h;
 
-   bd->resize_mode = RESIZE_NONE;
+   bd->resize_mode = E_POINTER_RESIZE_NONE;
    bd->layer = 100;
    bd->saved.layer = bd->layer;
    bd->changes.icon = 1;
@@ -713,17 +673,15 @@ e_border_new(E_Container *con,
    /* just to friggin make java happy - we're DELAYING the reparent until
     * eval time...
     */
-/*   ecore_x_window_reparent(win, bd->client.shell_win, 0, 0); */
+/*   ecore_x_window_reparent(win, bd->win, 0, 0); */
    bd->need_reparent = 1;
 
    ecore_x_window_border_width_set(win, 0);
-   ecore_x_window_show(bd->event_win);
-   ecore_x_window_show(bd->client.shell_win);
    bd->shape = e_container_shape_add(con);
 
    bd->take_focus = 1;
    bd->new_client = 1;
-   bd->changed = 1;
+   BD_CHANGED(bd);
 
 //   bd->zone = e_zone_current_get(con);
    bd->desk = e_desk_current_get(bd->zone);
@@ -748,11 +706,9 @@ e_border_new(E_Container *con,
                bd2->client.win);
 #endif
         eina_hash_del(borders_hash, e_util_winid_str_get(bd->client.win), bd2);
-        eina_hash_del(borders_hash, e_util_winid_str_get(bd2->bg_win), bd2);
         eina_hash_del(borders_hash, e_util_winid_str_get(bd2->win), bd2);
      }
    eina_hash_add(borders_hash, e_util_winid_str_get(bd->client.win), bd);
-   eina_hash_add(borders_hash, e_util_winid_str_get(bd->bg_win), bd);
    eina_hash_add(borders_hash, e_util_winid_str_get(bd->win), bd);
    managed = 1;
    ecore_x_window_prop_card32_set(win, E_ATOM_MANAGED, &managed, 1);
@@ -774,7 +730,6 @@ e_border_new(E_Container *con,
 
    focus_stack = eina_list_append(focus_stack, bd);
 
-   bd->pointer = e_pointer_window_new(bd->win, 0);
    return bd;
 }
 
@@ -1048,10 +1003,10 @@ e_border_hide(E_Border *bd,
    ecore_x_window_shadow_tree_flush();
    if (bd->moving)
      _e_border_move_end(bd);
-   if (bd->resize_mode != RESIZE_NONE)
+   if (bd->resize_mode != E_POINTER_RESIZE_NONE)
      {
-        _e_border_pointer_resize_end(bd);
-        bd->resize_mode = RESIZE_NONE;
+        e_pointer_mode_pop(bd, bd->resize_mode);
+        bd->resize_mode = E_POINTER_RESIZE_NONE;
         _e_border_resize_end(bd);
      }
 
@@ -1122,6 +1077,7 @@ send_event:
 
         ev = E_NEW(E_Event_Border_Hide, 1);
         ev->border = bd;
+        ev->manage = manage;
         e_object_ref(E_OBJECT(bd));
 //     e_object_breadcrumb_add(E_OBJECT(bd), "border_hide_event");
         ecore_event_add(E_EVENT_BORDER_HIDE, ev, _e_border_event_border_hide_free, NULL);
@@ -1207,107 +1163,12 @@ _e_border_pri_norm(E_Border *bd)
 }
 
 static void
-_e_border_frame_replace(E_Border *bd, Eina_Bool argb)
-{
-   Ecore_X_Window win;
-   Ecore_Evas *bg_ecore_evas;
-   char buf[4096];
-
-   bd->argb = argb;
-
-   win = bd->win;
-   bg_ecore_evas = bd->bg_ecore_evas;
-
-   /* unregister old frame window */
-   eina_hash_del(borders_hash, e_util_winid_str_get(bd->bg_win), bd);
-   eina_hash_del(borders_hash, e_util_winid_str_get(bd->win), bd);
-
-   e_focus_setdown(bd);
-   e_bindings_mouse_ungrab(E_BINDING_CONTEXT_WINDOW, bd->win);
-   e_bindings_wheel_ungrab(E_BINDING_CONTEXT_WINDOW, bd->win);
-
-   if (bd->icon_object)
-     evas_object_del(bd->icon_object);
-
-   evas_object_del(bd->bg_object);
-   e_canvas_del(bg_ecore_evas);
-   ecore_evas_free(bg_ecore_evas);
-
-   if (bd->pointer)
-     e_object_del(E_OBJECT(bd->pointer));
-
-   /* create new frame */
-   if (argb)
-     bd->win = ecore_x_window_manager_argb_new(bd->zone->container->win,
-                                               bd->x, bd->y, bd->w, bd->h);
-   else
-     {
-        bd->win = ecore_x_window_override_new(bd->zone->container->win,
-                                              bd->x, bd->y, bd->w, bd->h);
-        ecore_x_window_shape_events_select(bd->win, 1);
-     }
-
-   ecore_x_window_configure(bd->win,
-                            ECORE_X_WINDOW_CONFIGURE_MASK_SIBLING |
-                            ECORE_X_WINDOW_CONFIGURE_MASK_STACK_MODE,
-                            0, 0, 0, 0, 0,
-                            win, ECORE_X_WINDOW_STACK_BELOW);
-
-   e_bindings_mouse_grab(E_BINDING_CONTEXT_WINDOW, bd->win);
-   e_bindings_wheel_grab(E_BINDING_CONTEXT_WINDOW, bd->win);
-   e_focus_setup(bd);
-
-   bd->bg_ecore_evas = e_canvas_new(bd->win,
-                                    0, 0, bd->w, bd->h, 1, 0,
-                                    &(bd->bg_win));
-
-   e_canvas_add(bd->bg_ecore_evas);
-   ecore_x_window_reparent(bd->event_win, bd->win, 0, 0);
-
-   bd->bg_evas = ecore_evas_get(bd->bg_ecore_evas);
-   ecore_evas_name_class_set(bd->bg_ecore_evas, "E", "Frame_Window");
-   ecore_evas_title_set(bd->bg_ecore_evas, "Enlightenment Frame");
-
-   ecore_x_window_shape_events_select(bd->bg_win, 1);
-
-   /* move client with shell win over to new frame */
-   ecore_x_window_reparent(bd->client.shell_win, bd->win,
-                           bd->client_inset.l, bd->client_inset.t);
-
-   bd->pointer = e_pointer_window_new(bd->win, 0);
-
-   eina_hash_add(borders_hash, e_util_winid_str_get(bd->bg_win), bd);
-   eina_hash_add(borders_hash, e_util_winid_str_get(bd->win), bd);
-
-   if (bd->visible)
-     {
-        E_Border *tmp;
-        Eina_List *l;
-
-        ecore_evas_show(bd->bg_ecore_evas);
-        ecore_x_window_show(bd->win);
-
-        EINA_LIST_FOREACH(bd->client.e.state.video_child, l, tmp)
-          ecore_x_window_show(tmp->win);
-     }
-
-   bd->bg_object = edje_object_add(bd->bg_evas);
-   snprintf(buf, sizeof(buf), "e/widgets/border/%s/border", bd->client.border.name);
-   e_theme_edje_object_set(bd->bg_object, "base/theme/borders", buf);
-
-   bd->icon_object = e_border_icon_add(bd, bd->bg_evas);
-
-   /* cleanup old frame */
-   ecore_x_window_free(win);
-}
-
-static void
 _e_border_client_move_resize_send(E_Border *bd)
 {
    if (bd->internal_ecore_evas)
      ecore_evas_managed_move(bd->internal_ecore_evas,
-                             bd->x + bd->fx.x + bd->client_inset.l,
-                             bd->y + bd->fx.y + bd->client_inset.t);
+                             bd->client_inset.l,
+                             bd->client_inset.t);
 
    ecore_x_icccm_move_resize_send(bd->client.win,
                                   bd->x + bd->fx.x + bd->client_inset.l,
@@ -1400,7 +1261,7 @@ _e_border_move_internal(E_Border *bd,
    bd->pre_res_change.valid = 0;
    bd->x = x;
    bd->y = y;
-   bd->changed = 1;
+   BD_CHANGED(bd);
    bd->changes.pos = 1;
 #if 0
    if (bd->client.netwm.sync.request)
@@ -1596,7 +1457,7 @@ _e_border_move_resize_internal(E_Border *bd,
    bd->client.w = bd->w - (bd->client_inset.l + bd->client_inset.r);
    bd->client.h = bd->h - (bd->client_inset.t + bd->client_inset.b);
 
-   if ((bd->shaped) || (bd->client.shaped))
+   if (bd->client.shaped)
      {
         bd->need_shape_merge = 1;
         bd->need_shape_export = 1;
@@ -1608,7 +1469,7 @@ _e_border_move_resize_internal(E_Border *bd,
 
    if (bd->internal_ecore_evas)
      {
-        bd->changed = 1;
+        BD_CHANGED(bd);
         bd->changes.size = 1;
      }
    else
@@ -1626,7 +1487,7 @@ _e_border_move_resize_internal(E_Border *bd,
           }
         else
           {
-             bd->changed = 1;
+             BD_CHANGED(bd);
              bd->changes.size = 1;
           }
      }
@@ -2230,7 +2091,7 @@ e_border_focus_set(E_Border *bd,
              if (bd->visible && bd->changes.visible)
                {
                   bd->want_focus = 1;
-                  bd->changed = 1;
+                  BD_CHANGED(bd);
                }
              else if ((!bd->focused) ||
                       (focus_next && (bd != eina_list_data_get(focus_next))))
@@ -2455,7 +2316,7 @@ e_border_shade(E_Border *bd,
         bd->shade.start = ecore_loop_time_get();
         bd->shading = 1;
         bd->changes.shading = 1;
-        bd->changed = 1;
+        BD_CHANGED(bd);
 
         if (bd->shade.dir == E_DIRECTION_UP ||
             bd->shade.dir == E_DIRECTION_LEFT)
@@ -2495,7 +2356,7 @@ e_border_shade(E_Border *bd,
              bd->changes.pos = 1;
           }
 
-        if ((bd->shaped) || (bd->client.shaped))
+        if (bd->client.shaped)
           {
              bd->need_shape_merge = 1;
              bd->need_shape_export = 1;
@@ -2508,7 +2369,7 @@ e_border_shade(E_Border *bd,
         bd->changes.size = 1;
         bd->shaded = 1;
         bd->changes.shaded = 1;
-        bd->changed = 1;
+        BD_CHANGED(bd);
         edje_object_signal_emit(bd->bg_object, "e,state,shaded", "e");
         e_border_frame_recalc(bd);
         ev = E_NEW(E_Event_Border_Resize, 1);
@@ -2562,7 +2423,7 @@ e_border_unshade(E_Border *bd,
         bd->shade.start = ecore_loop_time_get();
         bd->shading = 1;
         bd->changes.shading = 1;
-        bd->changed = 1;
+        BD_CHANGED(bd);
 
         if (bd->shade.dir == E_DIRECTION_UP)
           {
@@ -2585,14 +2446,14 @@ e_border_unshade(E_Border *bd,
              ecore_x_window_gravity_set(bd->client.win, ECORE_X_GRAVITY_SW);
              ecore_x_window_move_resize(bd->client.win,
                                         bd->w - (bd->client_inset.l + bd->client_inset.r) -
-                                        bd->client.h,
+                                        bd->client.w,
                                         0, bd->client.w, bd->client.h);
              if (bd->client.lock_win)
                {
                   ecore_x_window_gravity_set(bd->client.lock_win, ECORE_X_GRAVITY_SW);
                   ecore_x_window_move_resize(bd->client.lock_win,
                                              bd->w - (bd->client_inset.l + bd->client_inset.r) -
-                                             bd->client.h,
+                                             bd->client.w,
                                              0, bd->client.w, bd->client.h);
                }
           }
@@ -2627,7 +2488,7 @@ e_border_unshade(E_Border *bd,
              bd->x = bd->x - bd->client.w;
              bd->changes.pos = 1;
           }
-        if ((bd->shaped) || (bd->client.shaped))
+        if (bd->client.shaped)
           {
              bd->need_shape_merge = 1;
              bd->need_shape_export = 1;
@@ -2640,7 +2501,7 @@ e_border_unshade(E_Border *bd,
         bd->changes.size = 1;
         bd->shaded = 0;
         bd->changes.shaded = 1;
-        bd->changed = 1;
+        BD_CHANGED(bd);
         edje_object_signal_emit(bd->bg_object, "e,state,unshaded", "e");
         e_border_frame_recalc(bd);
         ev = E_NEW(E_Event_Border_Resize, 1);
@@ -2658,18 +2519,25 @@ e_border_unshade(E_Border *bd,
 static void
 _e_border_client_inset_calc(E_Border *bd)
 {
-   int cx, cy, cw, ch;
+   int w, h, cx, cy, cw, ch;
 
    if (bd->bg_object)
      {
-        evas_object_resize(bd->bg_object, MAX(bd->w, 500), MAX(bd->h, 500));
+        Evas_Object *layout;
+
+        layout = e_comp_get(bd)->layout;
+        if (layout) e_layout_freeze(layout);
+        evas_object_geometry_get(bd->bg_object, NULL, NULL, &w, &h);
+        evas_object_resize(bd->bg_object, MAX(w, 50), MAX(h, 50));
         edje_object_message_signal_process(bd->bg_object);
         edje_object_calc_force(bd->bg_object);
         edje_object_part_geometry_get(bd->bg_object, "e.swallow.client", &cx, &cy, &cw, &ch);
         bd->client_inset.l = cx;
-        bd->client_inset.r = MAX(bd->w, 500) - (cx + cw);
+        bd->client_inset.r = MAX(w, 50) - (cx + cw);
         bd->client_inset.t = cy;
-        bd->client_inset.b = MAX(bd->h, 500) - (cy + ch);
+        bd->client_inset.b = MAX(h, 50) - (cy + ch);
+        evas_object_resize(bd->bg_object, w, h);
+        if (layout) e_layout_thaw(layout);
      }
    else
      {
@@ -2685,6 +2553,7 @@ _e_border_client_inset_calc(E_Border *bd)
    ecore_x_e_frame_size_set(bd->client.win,
                             bd->client_inset.l, bd->client_inset.r,
                             bd->client_inset.t, bd->client_inset.b);
+   bd->client_inset.calc = 1;
 }
 
 static void
@@ -3131,9 +3000,10 @@ e_border_fullscreen(E_Border *bd,
         e_hints_window_fullscreen_set(bd, 1);
         e_hints_window_size_unset(bd);
         bd->client.border.changed = 1;
-        bd->changed = 1;
+        BD_CHANGED(bd);
      }
    bd->fullscreen_policy = policy;
+   _e_border_shadow(bd);
 
    ev = E_NEW(E_Event_Border_Fullscreen, 1);
    ev->border = bd;
@@ -3180,9 +3050,10 @@ e_border_unfullscreen(E_Border *bd)
 
         e_hints_window_fullscreen_set(bd, 0);
         bd->client.border.changed = 1;
-        bd->changed = 1;
+        BD_CHANGED(bd);
      }
    bd->fullscreen_policy = 0;
+   _e_border_shadow(bd);
 
    ev = E_NEW(E_Event_Border_Unfullscreen, 1);
    ev->border = bd;
@@ -3359,7 +3230,7 @@ e_border_pinned_set(E_Border *bd,
         e_border_layer_set(bd, layer);
 
         bd->client.border.changed = 1;
-        bd->changed = 1;
+        BD_CHANGED(bd);
      }
 }
 
@@ -3387,18 +3258,6 @@ e_border_find_all_by_client_window(Ecore_X_Window win)
 }
 
 EAPI E_Border *
-e_border_find_by_frame_window(Ecore_X_Window win)
-{
-   E_Border *bd;
-
-   bd = eina_hash_find(borders_hash, e_util_winid_str_get(win));
-   if ((bd) && (!e_object_is_del(E_OBJECT(bd))) &&
-       (bd->bg_win == win))
-     return bd;
-   return NULL;
-}
-
-EAPI E_Border *
 e_border_find_by_window(Ecore_X_Window win)
 {
    E_Border *bd;
@@ -3648,8 +3507,6 @@ _e_border_show(E_Border *bd)
    Eina_List *l;
    E_Border *tmp;
 
-   ecore_evas_show(bd->bg_ecore_evas);
-
    if (bd->post_job)
      {
         bd->post_show = 1;
@@ -3679,7 +3536,6 @@ _e_border_hide(E_Border *bd)
    if (!e_comp_evas_exists(bd))
      {
         ecore_x_window_hide(bd->win);
-        ecore_evas_hide(bd->bg_ecore_evas);
 
         EINA_LIST_FOREACH(bd->client.e.state.video_child, l, tmp)
           ecore_x_window_hide(tmp->win);
@@ -3698,7 +3554,6 @@ _e_border_action_input_win_del(void)
      return 0;
 
    e_grabinput_release(action_input_win, action_input_win);
-   ecore_x_window_free(action_input_win);
    action_input_win = 0;
    return 1;
 }
@@ -3707,14 +3562,8 @@ static int
 _e_border_action_input_win_new(E_Border *bd)
 {
    if (!action_input_win)
-     {
-        Ecore_X_Window parent = bd->zone->container->win;
-        action_input_win = ecore_x_window_input_new(parent, 0, 0, 1, 1);
-        if (!action_input_win)
-          return 0;
-     }
+     action_input_win = e_comp_get(bd)->ee_win;
 
-   ecore_x_window_show(action_input_win);
    if (e_grabinput_get(action_input_win, 0, action_input_win))
      return 1;
 
@@ -4029,13 +3878,19 @@ e_border_act_move_begin(E_Border *bd,
 {
    E_OBJECT_CHECK(bd);
    E_OBJECT_TYPE_CHECK(bd, E_BORDER_TYPE);
-   if ((bd->resize_mode != RESIZE_NONE) || (bd->moving)) return;
+   if ((bd->resize_mode != E_POINTER_RESIZE_NONE) || (bd->moving)) return;
    if (!_e_border_move_begin(bd))
      return;
 
+   if (!_e_border_action_input_win_new(bd))
+     {
+        _e_border_move_end(bd);
+        return;
+     }
+   _e_border_action_init(bd);
    e_zone_edge_disable();
    bd->moving = 1;
-   _e_border_pointer_move_begin(bd);
+   e_pointer_mode_push(bd, E_POINTER_MOVE);
    if (ev)
      {
         char source[256];
@@ -4053,10 +3908,11 @@ e_border_act_move_end(E_Border *bd,
    E_OBJECT_TYPE_CHECK(bd, E_BORDER_TYPE);
    if (!bd->moving) return;
    bd->moving = 0;
-   _e_border_pointer_move_end(bd);
+   e_pointer_mode_pop(bd, E_POINTER_MOVE);
    e_zone_edge_enable();
    _e_border_move_end(bd);
    e_zone_flip_coords_handle(bd->zone, -1, -1);
+   _e_border_action_finish();
 }
 
 EAPI void
@@ -4066,19 +3922,25 @@ e_border_act_resize_begin(E_Border *bd,
    E_OBJECT_CHECK(bd);
    E_OBJECT_TYPE_CHECK(bd, E_BORDER_TYPE);
    if (bd->lock_user_size) return;
-   if ((bd->resize_mode != RESIZE_NONE) || (bd->moving)) return;
+   if ((bd->resize_mode != E_POINTER_RESIZE_NONE) || (bd->moving)) return;
    if (!_e_border_resize_begin(bd))
      return;
+   if (!_e_border_action_input_win_new(bd))
+     {
+        _e_border_resize_end(bd);
+        return;
+     }
+   _e_border_action_init(bd);
    if (bd->mouse.current.mx < (bd->x + bd->w / 2))
      {
         if (bd->mouse.current.my < (bd->y + bd->h / 2))
           {
-             bd->resize_mode = RESIZE_TL;
+             bd->resize_mode = E_POINTER_RESIZE_TL;
              GRAV_SET(bd, ECORE_X_GRAVITY_SE);
           }
         else
           {
-             bd->resize_mode = RESIZE_BL;
+             bd->resize_mode = E_POINTER_RESIZE_BL;
              GRAV_SET(bd, ECORE_X_GRAVITY_NE);
           }
      }
@@ -4086,16 +3948,16 @@ e_border_act_resize_begin(E_Border *bd,
      {
         if (bd->mouse.current.my < (bd->y + bd->h / 2))
           {
-             bd->resize_mode = RESIZE_TR;
+             bd->resize_mode = E_POINTER_RESIZE_TR;
              GRAV_SET(bd, ECORE_X_GRAVITY_SW);
           }
         else
           {
-             bd->resize_mode = RESIZE_BR;
+             bd->resize_mode = E_POINTER_RESIZE_BR;
              GRAV_SET(bd, ECORE_X_GRAVITY_NW);
           }
      }
-   _e_border_pointer_resize_begin(bd);
+   e_pointer_mode_push(bd, bd->resize_mode);
    if (ev)
      {
         char source[256];
@@ -4111,14 +3973,15 @@ e_border_act_resize_end(E_Border *bd,
 {
    E_OBJECT_CHECK(bd);
    E_OBJECT_TYPE_CHECK(bd, E_BORDER_TYPE);
-   if (bd->resize_mode != RESIZE_NONE)
+   if (bd->resize_mode != E_POINTER_RESIZE_NONE)
      {
-        _e_border_pointer_resize_end(bd);
-        bd->resize_mode = RESIZE_NONE;
+        e_pointer_mode_pop(bd, bd->resize_mode);
+        bd->resize_mode = E_POINTER_RESIZE_NONE;
         _e_border_resize_end(bd);
         bd->changes.reset_gravity = 1;
-        bd->changed = 1;
+        BD_CHANGED(bd);
      }
+   _e_border_action_finish();
 }
 
 EAPI void
@@ -4333,38 +4196,6 @@ e_border_lost_windows_get(E_Zone *zone)
           {
              list = eina_list_append(list, bd);
           }
-        else if ((!E_CONTAINS(bd->zone->x, bd->zone->y,
-                              bd->zone->w, bd->zone->h,
-                              bd->x, bd->y, bd->w, bd->h)) &&
-                 (bd->shaped))
-          {
-             Ecore_X_Rectangle *rect;
-             int i, num;
-
-             rect = ecore_x_window_shape_rectangles_get(bd->win, &num);
-             if (rect)
-               {
-                  int ok;
-
-                  ok = 0;
-                  for (i = 0; i < num; i++)
-                    {
-                       if (E_INTERSECTS(bd->zone->x + loss_overlap,
-                                        bd->zone->y + loss_overlap,
-                                        bd->zone->w - (2 * loss_overlap),
-                                        bd->zone->h - (2 * loss_overlap),
-                                        rect[i].x, rect[i].y,
-                                        (int)rect[i].width, (int)rect[i].height))
-                         {
-                            ok = 1;
-                            break;
-                         }
-                    }
-                  free(rect);
-                  if (!ok)
-                    list = eina_list_append(list, bd);
-               }
-          }
      }
    return list;
 }
@@ -4561,7 +4392,7 @@ e_border_resize_cancel(void)
           }
         else
           {
-             bdresize->resize_mode = RESIZE_NONE;
+             bdresize->resize_mode = E_POINTER_RESIZE_NONE;
              _e_border_resize_end(bdresize);
           }
      }
@@ -4580,9 +4411,9 @@ e_border_frame_recalc(E_Border *bd)
    bd->w += (bd->client_inset.l + bd->client_inset.r);
    bd->h += (bd->client_inset.t + bd->client_inset.b);
 
-   bd->changed = 1;
+   BD_CHANGED(bd);
    bd->changes.size = 1;
-   if ((bd->shaped) || (bd->client.shaped))
+   if (bd->client.shaped)
      {
         bd->need_shape_merge = 1;
         bd->need_shape_export = 1;
@@ -4628,10 +4459,10 @@ e_border_signal_move_begin(E_Border *bd,
    E_OBJECT_CHECK(bd);
    E_OBJECT_TYPE_CHECK(bd, E_BORDER_TYPE);
 
-   if ((bd->resize_mode != RESIZE_NONE) || (bd->moving)) return;
+   if ((bd->resize_mode != E_POINTER_RESIZE_NONE) || (bd->moving)) return;
    if (!_e_border_move_begin(bd)) return;
    bd->moving = 1;
-   _e_border_pointer_move_begin(bd);
+   e_pointer_mode_push(bd, E_POINTER_MOVE);
    e_zone_edge_disable();
    _e_border_moveinfo_gather(bd, sig);
    if (bd->cur_mouse_action)
@@ -4656,7 +4487,7 @@ e_border_signal_move_end(E_Border *bd,
    E_OBJECT_TYPE_CHECK(bd, E_BORDER_TYPE);
    if (!bd->moving) return;
    bd->moving = 0;
-   _e_border_pointer_move_end(bd);
+   e_pointer_mode_pop(bd, E_POINTER_MOVE);
    e_zone_edge_enable();
    _e_border_move_end(bd);
    e_zone_flip_coords_handle(bd->zone, -1, -1);
@@ -4667,7 +4498,7 @@ e_border_resizing_get(E_Border *bd)
 {
    E_OBJECT_CHECK_RETURN(bd, 0);
    E_OBJECT_TYPE_CHECK_RETURN(bd, E_BORDER_TYPE, 0);
-   if (bd->resize_mode == RESIZE_NONE) return 0;
+   if (bd->resize_mode == E_POINTER_RESIZE_NONE) return 0;
    return 1;
 }
 
@@ -4678,56 +4509,56 @@ e_border_signal_resize_begin(E_Border *bd,
                              const char *src __UNUSED__)
 {
    Ecore_X_Gravity grav = ECORE_X_GRAVITY_NW;
-   int resize_mode = RESIZE_BR;
+   int resize_mode = E_POINTER_RESIZE_BR;
 
    E_OBJECT_CHECK(bd);
    E_OBJECT_TYPE_CHECK(bd, E_BORDER_TYPE);
 
-   if ((bd->resize_mode != RESIZE_NONE) || (bd->moving)) return;
+   if ((bd->resize_mode != E_POINTER_RESIZE_NONE) || (bd->moving)) return;
    if (!_e_border_resize_begin(bd))
      return;
    if (!strcmp(dir, "tl"))
      {
-        resize_mode = RESIZE_TL;
+        resize_mode = E_POINTER_RESIZE_TL;
         grav = ECORE_X_GRAVITY_SE;
      }
    else if (!strcmp(dir, "t"))
      {
-        resize_mode = RESIZE_T;
+        resize_mode = E_POINTER_RESIZE_T;
         grav = ECORE_X_GRAVITY_S;
      }
    else if (!strcmp(dir, "tr"))
      {
-        resize_mode = RESIZE_TR;
+        resize_mode = E_POINTER_RESIZE_TR;
         grav = ECORE_X_GRAVITY_SW;
      }
    else if (!strcmp(dir, "r"))
      {
-        resize_mode = RESIZE_R;
+        resize_mode = E_POINTER_RESIZE_R;
         grav = ECORE_X_GRAVITY_W;
      }
    else if (!strcmp(dir, "br"))
      {
-        resize_mode = RESIZE_BR;
+        resize_mode = E_POINTER_RESIZE_BR;
         grav = ECORE_X_GRAVITY_NW;
      }
    else if (!strcmp(dir, "b"))
      {
-        resize_mode = RESIZE_B;
+        resize_mode = E_POINTER_RESIZE_B;
         grav = ECORE_X_GRAVITY_N;
      }
    else if (!strcmp(dir, "bl"))
      {
-        resize_mode = RESIZE_BL;
+        resize_mode = E_POINTER_RESIZE_BL;
         grav = ECORE_X_GRAVITY_NE;
      }
    else if (!strcmp(dir, "l"))
      {
-        resize_mode = RESIZE_L;
+        resize_mode = E_POINTER_RESIZE_L;
         grav = ECORE_X_GRAVITY_E;
      }
    bd->resize_mode = resize_mode;
-   _e_border_pointer_resize_begin(bd);
+   e_pointer_mode_push(bd, bd->resize_mode);
    _e_border_moveinfo_gather(bd, sig);
    GRAV_SET(bd, grav);
    if (bd->cur_mouse_action)
@@ -4751,13 +4582,13 @@ e_border_signal_resize_end(E_Border *bd,
 {
    E_OBJECT_CHECK(bd);
    E_OBJECT_TYPE_CHECK(bd, E_BORDER_TYPE);
-   if (bd->resize_mode == RESIZE_NONE) return;
+   if (bd->resize_mode == E_POINTER_RESIZE_NONE) return;
    _e_border_resize_handle(bd);
-   _e_border_pointer_resize_end(bd);
-   bd->resize_mode = RESIZE_NONE;
+   e_pointer_mode_pop(bd, bd->resize_mode);
+   bd->resize_mode = E_POINTER_RESIZE_NONE;
    _e_border_resize_end(bd);
    bd->changes.reset_gravity = 1;
-   bd->changed = 1;
+   BD_CHANGED(bd);
 }
 
 EAPI void
@@ -4859,12 +4690,6 @@ e_border_resize_limit(E_Border *bd,
 static void
 _e_border_free(E_Border *bd)
 {
-   if (warp_timer_border == bd)
-     {
-        if (warp_timer) ecore_timer_del(warp_timer);
-        warp_timer = NULL;
-        warp_timer_border = NULL;
-     }
 #if (ECORE_VERSION_MAJOR > 1) || (ECORE_VERSION_MINOR >= 8)
    if (bd->client.e.state.profile.use)
      {
@@ -4911,6 +4736,12 @@ _e_border_free(E_Border *bd)
              tmp->client.e.state.video_parent_border = NULL;
           }
      }
+   if (bd->internal_ecore_evas)
+     {
+        e_canvas_del(bd->internal_ecore_evas);
+        ecore_evas_free(bd->internal_ecore_evas);
+        bd->internal_ecore_evas = NULL;
+     }
    if (bd->desktop)
      {
         efreet_desktop_free(bd->desktop);
@@ -4921,11 +4752,7 @@ _e_border_free(E_Border *bd)
         ecore_idle_enterer_del(bd->post_job);
         bd->post_job = NULL;
      }
-   if (bd->pointer)
-     {
-        e_object_del(E_OBJECT(bd->pointer));
-        bd->pointer = NULL;
-     }
+
    if (bdresize == bd)
      _e_border_resize_end(bd);
    if (bdmove == bd)
@@ -5002,7 +4829,6 @@ _e_border_free(E_Border *bd)
 
         focused = NULL;
      }
-   E_FREE_LIST(bd->handlers, ecore_event_handler_del);
    if (bd->remember)
      {
         E_Remember *rem;
@@ -5079,7 +4905,7 @@ _e_border_free(E_Border *bd)
    if (bd->client.netwm.icon_name)
      eina_stringshare_del(bd->client.netwm.icon_name);
    bd->client.netwm.icon_name = NULL;
-   e_object_del(E_OBJECT(bd->shape));
+   if (bd->shape) e_object_del(E_OBJECT(bd->shape));
    bd->shape = NULL;
    if (bd->internal_icon) eina_stringshare_del(bd->internal_icon);
    bd->internal_icon = NULL;
@@ -5089,16 +4915,10 @@ _e_border_free(E_Border *bd)
    bd->icon_object = NULL;
    evas_object_del(bd->bg_object);
    bd->bg_object = NULL;
-   e_canvas_del(bd->bg_ecore_evas);
-   ecore_evas_free(bd->bg_ecore_evas);
-   bd->bg_ecore_evas = NULL;
-   ecore_x_window_free(bd->client.shell_win);
-   bd->client.shell_win = 0;
    e_focus_setdown(bd);
    e_bindings_mouse_ungrab(E_BINDING_CONTEXT_WINDOW, bd->win);
    e_bindings_wheel_ungrab(E_BINDING_CONTEXT_WINDOW, bd->win);
    eina_hash_del(borders_hash, e_util_winid_str_get(bd->client.win), bd);
-   eina_hash_del(borders_hash, e_util_winid_str_get(bd->bg_win), bd);
    eina_hash_del(borders_hash, e_util_winid_str_get(bd->win), bd);
    ecore_x_window_free(bd->win);
    bd->win = 0;
@@ -5130,6 +4950,22 @@ _e_border_free(E_Border *bd)
  */
 
 static void
+_e_border_shadow(E_Border *bd)
+{
+   Eina_Bool on = EINA_FALSE;
+   if (!bd->bg_object) return;
+   on = !bd->client.e.state.video;
+   if (on)
+     on = !bd->fullscreen;
+   if (on)
+     on = !!e_util_strcmp(bd->client.border.name, "borderless");
+   if (on)
+     edje_object_signal_emit(bd->bg_object, "e,state,shadow,on", "e");
+   else
+     edje_object_signal_emit(bd->bg_object, "e,state,shadow,off", "e");
+}
+
+static void
 _e_border_del(E_Border *bd)
 {
    E_Event_Border_Remove *ev;
@@ -5144,9 +4980,17 @@ _e_border_del(E_Border *bd)
      focusing = NULL;
 
    focus_next = eina_list_remove(focus_next, bd);
+   bd->changed = 0;
 
    if (bd->fullscreen) bd->desk->fullscreen_borders--;
 
+   if (warp_timer_border == bd)
+     {
+        if (warp_timer) ecore_timer_del(warp_timer);
+        warp_timer = NULL;
+        warp_timer_border = NULL;
+     }
+
    if ((drag_border) && (drag_border->data == bd))
      {
         e_object_del(E_OBJECT(drag_border));
@@ -5370,8 +5214,8 @@ _e_border_cb_window_reparent(void *data  __UNUSED__,
    e = ev;
    bd = e_border_find_by_client_window(e->win);
    if (!bd) return 1;
-   if (e->parent == bd->client.shell_win) return 1;
-   if (ecore_x_window_parent_get(e->win) == bd->client.shell_win)
+   if (e->parent == bd->win) return 1;
+   if (ecore_x_window_parent_get(e->win) == bd->win)
      {
         return 1;
      }
@@ -5767,18 +5611,18 @@ _e_border_cb_window_property(void *data  __UNUSED__,
             (!bd->client.netwm.fetch.name))
           {
              bd->client.icccm.fetch.title = 1;
-             bd->changed = 1;
+             BD_CHANGED(bd);
           }
      }
    else if (e->atom == ECORE_X_ATOM_NET_WM_NAME)
      {
         bd->client.netwm.fetch.name = 1;
-        bd->changed = 1;
+        BD_CHANGED(bd);
      }
    else if (e->atom == ECORE_X_ATOM_WM_CLASS)
      {
         bd->client.icccm.fetch.name_class = 1;
-        bd->changed = 1;
+        BD_CHANGED(bd);
      }
    else if (e->atom == ECORE_X_ATOM_WM_ICON_NAME)
      {
@@ -5786,33 +5630,33 @@ _e_border_cb_window_property(void *data  __UNUSED__,
             (!bd->client.netwm.fetch.icon_name))
           {
              bd->client.icccm.fetch.icon_name = 1;
-             bd->changed = 1;
+             BD_CHANGED(bd);
           }
      }
    else if (e->atom == ECORE_X_ATOM_NET_WM_ICON_NAME)
      {
         bd->client.netwm.fetch.icon_name = 1;
-        bd->changed = 1;
+        BD_CHANGED(bd);
      }
    else if (e->atom == ECORE_X_ATOM_WM_CLIENT_MACHINE)
      {
         bd->client.icccm.fetch.machine = 1;
-        bd->changed = 1;
+        BD_CHANGED(bd);
      }
    else if (e->atom == ECORE_X_ATOM_WM_PROTOCOLS)
      {
         bd->client.icccm.fetch.protocol = 1;
-        bd->changed = 1;
+        BD_CHANGED(bd);
      }
    else if (e->atom == ECORE_X_ATOM_WM_HINTS)
      {
         bd->client.icccm.fetch.hints = 1;
-        bd->changed = 1;
+        BD_CHANGED(bd);
      }
    else if (e->atom == ECORE_X_ATOM_WM_NORMAL_HINTS)
      {
         bd->client.icccm.fetch.size_pos_hints = 1;
-        bd->changed = 1;
+        BD_CHANGED(bd);
      }
    else if (e->atom == ECORE_X_ATOM_MOTIF_WM_HINTS)
      {
@@ -5822,7 +5666,7 @@ _e_border_cb_window_property(void *data  __UNUSED__,
            {
          */
         bd->client.mwm.fetch.hints = 1;
-        bd->changed = 1;
+        BD_CHANGED(bd);
         /*
            }
          */
@@ -5830,103 +5674,103 @@ _e_border_cb_window_property(void *data  __UNUSED__,
    else if (e->atom == ECORE_X_ATOM_WM_TRANSIENT_FOR)
      {
         bd->client.icccm.fetch.transient_for = 1;
-        bd->changed = 1;
+        BD_CHANGED(bd);
      }
    else if (e->atom == ECORE_X_ATOM_WM_CLIENT_LEADER)
      {
         bd->client.icccm.fetch.client_leader = 1;
-        bd->changed = 1;
+        BD_CHANGED(bd);
      }
    else if (e->atom == ECORE_X_ATOM_WM_WINDOW_ROLE)
      {
         bd->client.icccm.fetch.window_role = 1;
-        bd->changed = 1;
+        BD_CHANGED(bd);
      }
    else if (e->atom == ECORE_X_ATOM_NET_WM_ICON)
      {
         bd->client.netwm.fetch.icon = 1;
-        bd->changed = 1;
+        BD_CHANGED(bd);
      }
    else if (e->atom == ATM__QTOPIA_SOFT_MENU)
      {
         bd->client.qtopia.fetch.soft_menu = 1;
-        bd->changed = 1;
+        BD_CHANGED(bd);
      }
    else if (e->atom == ATM__QTOPIA_SOFT_MENUS)
      {
         bd->client.qtopia.fetch.soft_menus = 1;
-        bd->changed = 1;
+        BD_CHANGED(bd);
      }
    else if (e->atom == ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_STATE)
      {
         bd->client.vkbd.fetch.state = 1;
-        bd->changed = 1;
+        BD_CHANGED(bd);
      }
    else if (e->atom == ECORE_X_ATOM_E_VIRTUAL_KEYBOARD)
      {
         bd->client.vkbd.fetch.vkbd = 1;
-        bd->changed = 1;
+        BD_CHANGED(bd);
      }
    else if (e->atom == ECORE_X_ATOM_E_ILLUME_CONFORMANT)
      {
         bd->client.illume.conformant.fetch.conformant = 1;
-        bd->changed = 1;
+        BD_CHANGED(bd);
      }
    else if (e->atom == ECORE_X_ATOM_E_ILLUME_QUICKPANEL_STATE)
      {
         bd->client.illume.quickpanel.fetch.state = 1;
-        bd->changed = 1;
+        BD_CHANGED(bd);
      }
    else if (e->atom == ECORE_X_ATOM_E_ILLUME_QUICKPANEL)
      {
         bd->client.illume.quickpanel.fetch.quickpanel = 1;
-        bd->changed = 1;
+        BD_CHANGED(bd);
      }
    else if (e->atom == ECORE_X_ATOM_E_ILLUME_QUICKPANEL_PRIORITY_MAJOR)
      {
         bd->client.illume.quickpanel.fetch.priority.major = 1;
-        bd->changed = 1;
+        BD_CHANGED(bd);
      }
    else if (e->atom == ECORE_X_ATOM_E_ILLUME_QUICKPANEL_PRIORITY_MINOR)
      {
         bd->client.illume.quickpanel.fetch.priority.minor = 1;
-        bd->changed = 1;
+        BD_CHANGED(bd);
      }
    else if (e->atom == ECORE_X_ATOM_E_ILLUME_QUICKPANEL_ZONE)
      {
         bd->client.illume.quickpanel.fetch.zone = 1;
-        bd->changed = 1;
+        BD_CHANGED(bd);
      }
    else if (e->atom == ECORE_X_ATOM_E_ILLUME_DRAG_LOCKED)
      {
         bd->client.illume.drag.fetch.locked = 1;
-        bd->changed = 1;
+        BD_CHANGED(bd);
      }
    else if (e->atom == ECORE_X_ATOM_E_ILLUME_DRAG)
      {
         bd->client.illume.drag.fetch.drag = 1;
-        bd->changed = 1;
+        BD_CHANGED(bd);
      }
    else if (e->atom == ECORE_X_ATOM_E_ILLUME_WINDOW_STATE)
      {
         bd->client.illume.win_state.fetch.state = 1;
-        bd->changed = 1;
+        BD_CHANGED(bd);
      }
    /*
       else if (e->atom == ECORE_X_ATOM_NET_WM_USER_TIME)
       {
         bd->client.netwm.fetch.user_time = 1;
-        bd->changed = 1;
+        BD_CHANGED(bd);
       }
       else if (e->atom == ECORE_X_ATOM_NET_WM_STRUT)
       {
         bd->client.netwm.fetch.strut = 1;
-        bd->changed = 1;
+        BD_CHANGED(bd);
       }
       else if (e->atom == ECORE_X_ATOM_NET_WM_STRUT_PARTIAL)
       {
         bd->client.netwm.fetch.strut = 1;
-        bd->changed = 1;
+        BD_CHANGED(bd);
       }
     */
    else if (e->atom == ECORE_X_ATOM_NET_WM_SYNC_REQUEST_COUNTER)
@@ -5936,17 +5780,17 @@ _e_border_cb_window_property(void *data  __UNUSED__,
    else if (e->atom == ECORE_X_ATOM_E_VIDEO_POSITION)
      {
         bd->client.e.fetch.video_position = 1;
-        bd->changed = 1;
+        BD_CHANGED(bd);
      }
    else if (e->atom == ECORE_X_ATOM_E_VIDEO_PARENT)
      {
         bd->client.e.fetch.video_parent = 1;
-        bd->changed = 1;
+        BD_CHANGED(bd);
      }
    else if (e->atom == ECORE_X_ATOM_NET_WM_STATE)
      {
         bd->client.netwm.fetch.state = 1;
-        bd->changed = 1;
+        BD_CHANGED(bd);
      }
    else if (e->atom == ECORE_X_ATOM_NET_WM_WINDOW_OPACITY)
      {
@@ -5955,19 +5799,19 @@ _e_border_cb_window_property(void *data  __UNUSED__,
         else
           {
              bd->client.netwm.fetch.opacity = 1;
-             bd->changed = 1;
+             BD_CHANGED(bd);
           }
      }
 #if (ECORE_VERSION_MAJOR > 1) || (ECORE_VERSION_MINOR >= 8)
    else if (e->atom == ECORE_X_ATOM_E_WINDOW_PROFILE_SUPPORTED)
      {
         bd->client.e.fetch.profile = 1;
-        bd->changed = 1;
+        BD_CHANGED(bd);
      }
    else if (e->atom == ECORE_X_ATOM_E_WINDOW_PROFILE_AVAILABLE_LIST)
      {
         bd->client.e.fetch.profile = 1;
-        bd->changed = 1;
+        BD_CHANGED(bd);
      }
 #endif
    return ECORE_CALLBACK_PASS_ON;
@@ -6005,7 +5849,7 @@ _e_border_cb_window_shape(void *data  __UNUSED__,
              bd->need_shape_merge = 1;
 // YYY             bd->shaped_input = 1;
              bd->changes.shape_input = 1;
-             bd->changed = 1;
+             BD_CHANGED(bd);
           }
 
         return ECORE_CALLBACK_PASS_ON;
@@ -6014,21 +5858,14 @@ _e_border_cb_window_shape(void *data  __UNUSED__,
    if (bd)
      {
         bd->changes.shape = 1;
-        bd->changed = 1;
+        BD_CHANGED(bd);
         return ECORE_CALLBACK_PASS_ON;
      }
    bd = e_border_find_by_window(e->win);
    if (bd)
      {
         bd->need_shape_export = 1;
-        bd->changed = 1;
-        return ECORE_CALLBACK_PASS_ON;
-     }
-   bd = e_border_find_by_frame_window(e->win);
-   if (bd)
-     {
-        bd->need_shape_merge = 1;
-        bd->changed = 1;
+        BD_CHANGED(bd);
         return ECORE_CALLBACK_PASS_ON;
      }
    return ECORE_CALLBACK_PASS_ON;
@@ -6205,7 +6042,7 @@ _e_border_cb_client_message(void *data  __UNUSED__, int ev_type __UNUSED__, void
    if (e->message_type == ECORE_X_ATOM_NET_WM_WINDOW_OPACITY)
      {
         bd->client.netwm.fetch.opacity = 1;
-        bd->changed = 1;
+        BD_CHANGED(bd);
      }
 #if (ECORE_VERSION_MAJOR > 1) || (ECORE_VERSION_MINOR >= 8)
    else if (e->message_type == ECORE_X_ATOM_E_WINDOW_PROFILE_CHANGE)
@@ -6279,7 +6116,7 @@ _e_border_cb_window_move_resize_request(void *data  __UNUSED__,
 
    if ((bd->shaded) || (bd->shading) ||
        (bd->fullscreen) || (bd->moving) ||
-       (bd->resize_mode != RESIZE_NONE))
+       (bd->resize_mode != E_POINTER_RESIZE_NONE))
      return ECORE_CALLBACK_PASS_ON;
 
    if ((e->button >= 1) && (e->button <= 3))
@@ -6308,7 +6145,7 @@ _e_border_cb_window_move_resize_request(void *data  __UNUSED__,
    if (!bd->lock_user_stacking)
      e_border_raise(bd);
 
-   if (e->direction == MOVE)
+   if (e->direction == E_POINTER_MOVE)
      {
         bd->cur_mouse_action = e_action_find("window_move");
         if (bd->cur_mouse_action)
@@ -6330,43 +6167,43 @@ _e_border_cb_window_move_resize_request(void *data  __UNUSED__,
 
    switch (e->direction)
      {
-      case RESIZE_TL:
-        bd->resize_mode = RESIZE_TL;
+      case E_POINTER_RESIZE_TL:
+        bd->resize_mode = E_POINTER_RESIZE_TL;
         GRAV_SET(bd, ECORE_X_GRAVITY_SE);
         break;
 
-      case RESIZE_T:
-        bd->resize_mode = RESIZE_T;
+      case E_POINTER_RESIZE_T:
+        bd->resize_mode = E_POINTER_RESIZE_T;
         GRAV_SET(bd, ECORE_X_GRAVITY_S);
         break;
 
-      case RESIZE_TR:
-        bd->resize_mode = RESIZE_TR;
+      case E_POINTER_RESIZE_TR:
+        bd->resize_mode = E_POINTER_RESIZE_TR;
         GRAV_SET(bd, ECORE_X_GRAVITY_SW);
         break;
 
-      case RESIZE_R:
-        bd->resize_mode = RESIZE_R;
+      case E_POINTER_RESIZE_R:
+        bd->resize_mode = E_POINTER_RESIZE_R;
         GRAV_SET(bd, ECORE_X_GRAVITY_W);
         break;
 
-      case RESIZE_BR:
-        bd->resize_mode = RESIZE_BR;
+      case E_POINTER_RESIZE_BR:
+        bd->resize_mode = E_POINTER_RESIZE_BR;
         GRAV_SET(bd, ECORE_X_GRAVITY_NW);
         break;
 
-      case RESIZE_B:
-        bd->resize_mode = RESIZE_B;
+      case E_POINTER_RESIZE_B:
+        bd->resize_mode = E_POINTER_RESIZE_B;
         GRAV_SET(bd, ECORE_X_GRAVITY_N);
         break;
 
-      case RESIZE_BL:
-        bd->resize_mode = RESIZE_BL;
+      case E_POINTER_RESIZE_BL:
+        bd->resize_mode = E_POINTER_RESIZE_BL;
         GRAV_SET(bd, ECORE_X_GRAVITY_NE);
         break;
 
-      case RESIZE_L:
-        bd->resize_mode = RESIZE_L;
+      case E_POINTER_RESIZE_L:
+        bd->resize_mode = E_POINTER_RESIZE_L;
         GRAV_SET(bd, ECORE_X_GRAVITY_E);
         break;
 
@@ -6465,7 +6302,6 @@ _e_border_cb_sync_alarm(void *data  __UNUSED__,
    bd->changes.pos = 1;
 
    _e_border_eval(bd);
-   evas_render(bd->bg_evas);
 
    ecore_x_pointer_xy_get(e_manager_current_get()->root,
                           &bd->mouse.current.mx,
@@ -6494,7 +6330,7 @@ _e_border_cb_efreet_cache_update(void *data  __UNUSED__,
              bd->desktop = NULL;
           }
         bd->changes.icon = 1;
-        bd->changed = 1;
+        BD_CHANGED(bd);
      }
    /*
       e_init_status_set(_("Desktop files scan done"));
@@ -6515,7 +6351,7 @@ _e_border_cb_config_icon_theme(void *data  __UNUSED__,
    EINA_LIST_FOREACH(borders, l, bd)
      {
         bd->changes.icon = 1;
-        bd->changed = 1;
+        BD_CHANGED(bd);
      }
    return ECORE_CALLBACK_PASS_ON;
 }
@@ -6583,253 +6419,175 @@ _e_border_cb_signal_bind(void *data,
                             emission, source);
 }
 
+static void
+_e_border_cb_mouse_in(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+   Evas_Event_Mouse_In *ev = event_info;
+   E_Border *bd = data;
+
+   if (grabbed) return;
+   if ((bd == focused) || (bd == focusing)) return;
+   if (focus_locked && (bd != warp_timer_border)) return;
+   if (e_object_is_del(E_OBJECT(bd))) return;
+   if (!bd->iconic)
+     e_focus_event_mouse_in(bd);
+   bd->mouse.current.mx = ev->output.x;
+   bd->mouse.current.my = ev->output.y;
+   return;
+}
+
 static Eina_Bool
-_e_border_cb_mouse_in(void *data,
-                      int type __UNUSED__,
-                      void *event)
+_e_border_cb_mouse_x_in(void *data EINA_UNUSED, int t EINA_UNUSED, Ecore_X_Event_Mouse_In *ev)
 {
-   Ecore_X_Event_Mouse_In *ev;
    E_Border *bd;
 
-   ev = event;
-   bd = data;
-#ifdef INOUTDEBUG_MOUSE
-   {
-      time_t t;
-      char *ct;
-
-      const char *modes[] = {
-         "MODE_NORMAL",
-         "MODE_WHILE_GRABBED",
-         "MODE_GRAB",
-         "MODE_UNGRAB"
-      };
-      const char *details[] = {
-         "DETAIL_ANCESTOR",
-         "DETAIL_VIRTUAL",
-         "DETAIL_INFERIOR",
-         "DETAIL_NON_LINEAR",
-         "DETAIL_NON_LINEAR_VIRTUAL",
-         "DETAIL_POINTER",
-         "DETAIL_POINTER_ROOT",
-         "DETAIL_DETAIL_NONE"
-      };
-      t = time(NULL);
-      ct = ctime(&t);
-      ct[strlen(ct) - 1] = 0;
-      DBG("@@ ->IN 0x%x 0x%x %s md=%s dt=%s",
-          ev->win, ev->event_win,
-          ct,
-          modes[ev->mode],
-          details[ev->detail]);
-   }
-#endif
-   if (grabbed) return ECORE_CALLBACK_PASS_ON;
-   if (focus_locked) return ECORE_CALLBACK_RENEW;
-   if (ev->event_win == bd->win)
-     {
-        if (focus_locked && (bd != warp_timer_border)) return ECORE_CALLBACK_RENEW;
-        if (!bd->iconic)
-          e_focus_event_mouse_in(bd);
-     }
-   else if (focus_locked)
-     return ECORE_CALLBACK_RENEW;
-#if 0
-   if ((ev->win != bd->win) &&
-       (ev->win != bd->event_win) &&
-       (ev->event_win != bd->win) &&
-       (ev->event_win != bd->event_win))
-     return ECORE_CALLBACK_PASS_ON;
-#else
-   if (ev->win != bd->event_win) return ECORE_CALLBACK_PASS_ON;
-#endif
+   if (grabbed) return ECORE_CALLBACK_RENEW;
+   bd = e_border_find_by_window(ev->event_win);
+   if (!bd) return ECORE_CALLBACK_RENEW;
+   if ((bd == focused) || (bd == focusing)) return ECORE_CALLBACK_RENEW;
+   if (focus_locked && (bd != warp_timer_border)) return ECORE_CALLBACK_RENEW;
+   if (e_object_is_del(E_OBJECT(bd))) return ECORE_CALLBACK_RENEW;
+   if (!bd->iconic)
+     e_focus_event_mouse_in(bd);
    bd->mouse.current.mx = ev->root.x;
    bd->mouse.current.my = ev->root.y;
-   if (!bd->bg_evas_in)
-     {
-        evas_event_feed_mouse_in(bd->bg_evas, ev->time, NULL);
-        bd->bg_evas_in = EINA_TRUE;
-     }
-   return ECORE_CALLBACK_PASS_ON;
+   return ECORE_CALLBACK_RENEW;
+}
+
+static void
+_e_border_cb_mouse_out(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+   Evas_Event_Mouse_Out *ev = event_info;
+   E_Border *bd = data;
+
+   if (grabbed) return;
+   if (bd->fullscreen) return;
+   if ((bd != focused) && (bd == focusing)) return;
+   if (e_object_is_del(E_OBJECT(bd))) return;
+   if (E_INSIDE(ev->output.x, ev->output.y, bd->x, bd->y, bd->w, bd->h)) return;
+   if (!bd->iconic)
+     e_focus_event_mouse_out(bd);
+   bd->mouse.current.mx = ev->output.x;
+   bd->mouse.current.my = ev->output.y;
 }
 
 static Eina_Bool
-_e_border_cb_mouse_out(void *data,
-                       int type __UNUSED__,
-                       void *event)
+_e_border_cb_mouse_x_out(void *data EINA_UNUSED, int t EINA_UNUSED, Ecore_X_Event_Mouse_Out *ev)
 {
-   Ecore_X_Event_Mouse_Out *ev;
    E_Border *bd;
 
-   ev = event;
-   bd = data;
-#ifdef INOUTDEBUG_MOUSE
-   {
-      time_t t;
-      char *ct;
+   if (grabbed) return ECORE_CALLBACK_RENEW;
+   bd = e_border_find_by_window(ev->event_win);
+   if (!bd) return ECORE_CALLBACK_RENEW;
+   if (bd->fullscreen) return ECORE_CALLBACK_RENEW;
+   if ((bd != focused) && (bd == focusing)) return ECORE_CALLBACK_RENEW;
+   if (e_object_is_del(E_OBJECT(bd))) return ECORE_CALLBACK_RENEW;
+   if (E_INSIDE(ev->root.x, ev->root.y, bd->x, bd->y, bd->w, bd->h)) return ECORE_CALLBACK_RENEW;
 
-      const char *modes[] = {
-         "MODE_NORMAL",
-         "MODE_WHILE_GRABBED",
-         "MODE_GRAB",
-         "MODE_UNGRAB"
-      };
-      const char *details[] = {
-         "DETAIL_ANCESTOR",
-         "DETAIL_VIRTUAL",
-         "DETAIL_INFERIOR",
-         "DETAIL_NON_LINEAR",
-         "DETAIL_NON_LINEAR_VIRTUAL",
-         "DETAIL_POINTER",
-         "DETAIL_POINTER_ROOT",
-         "DETAIL_DETAIL_NONE"
-      };
-      t = time(NULL);
-      ct = ctime(&t);
-      ct[strlen(ct) - 1] = 0;
-      DBG("@@ <-OUT 0x%x 0x%x %s md=%s dt=%s",
-          ev->win, ev->event_win,
-          ct,
-          modes[ev->mode],
-          details[ev->detail]);
-   }
-#endif
-   if (grabbed) return ECORE_CALLBACK_PASS_ON;
-   if (ev->event_win == bd->win)
-     {
-        if (bd->fullscreen)
-          return ECORE_CALLBACK_PASS_ON;
-        if ((ev->mode == ECORE_X_EVENT_MODE_UNGRAB) &&
-            (ev->detail == ECORE_X_EVENT_DETAIL_INFERIOR))
-          return ECORE_CALLBACK_PASS_ON;
-        if (ev->mode == ECORE_X_EVENT_MODE_GRAB)
-          return ECORE_CALLBACK_PASS_ON;
-        if ((ev->mode == ECORE_X_EVENT_MODE_NORMAL) &&
-            (ev->detail == ECORE_X_EVENT_DETAIL_INFERIOR))
-          return ECORE_CALLBACK_PASS_ON;
-        if (!bd->iconic)
-          e_focus_event_mouse_out(bd);
-     }
-#if 0
-   if ((ev->win != bd->win) &&
-       (ev->win != bd->event_win) &&
-       (ev->event_win != bd->win) &&
-       (ev->event_win != bd->event_win))
+   if ((ev->mode == ECORE_X_EVENT_MODE_UNGRAB) &&
+       (ev->detail == ECORE_X_EVENT_DETAIL_INFERIOR))
      return ECORE_CALLBACK_PASS_ON;
-#else
-   if (ev->win != bd->event_win) return ECORE_CALLBACK_PASS_ON;
-#endif
+   if (ev->mode == ECORE_X_EVENT_MODE_GRAB)
+     return ECORE_CALLBACK_PASS_ON;
+   if ((ev->mode == ECORE_X_EVENT_MODE_NORMAL) &&
+       (ev->detail == ECORE_X_EVENT_DETAIL_INFERIOR))
+     return ECORE_CALLBACK_PASS_ON;
+   if (!bd->iconic)
+     e_focus_event_mouse_out(bd);
    bd->mouse.current.mx = ev->root.x;
    bd->mouse.current.my = ev->root.y;
-   if (bd->bg_evas_in)
+   return ECORE_CALLBACK_RENEW;
+}
+
+static void
+_e_border_cb_mouse_wheel_helper(E_Border *bd, Evas_Point *output, E_Binding_Event_Wheel *ev)
+{
+   bd->mouse.current.mx = output->x;
+   bd->mouse.current.my = output->y;
+   if (!bd->cur_mouse_action)
      {
-        if (!((evas_event_down_count_get(bd->bg_evas) > 0) &&
-              (!((ev->mode == ECORE_X_EVENT_MODE_GRAB) &&
-                 (ev->detail == ECORE_X_EVENT_DETAIL_NON_LINEAR)))))
-          {
-             if (ev->mode == ECORE_X_EVENT_MODE_GRAB)
-               evas_event_feed_mouse_cancel(bd->bg_evas, ev->time, NULL);
-             evas_event_feed_mouse_out(bd->bg_evas, ev->time, NULL);
-             bd->bg_evas_in = EINA_FALSE;
-          }
+        e_bindings_wheel_event_handle(E_BINDING_CONTEXT_WINDOW,
+                                      E_OBJECT(bd), ev);
      }
-   return ECORE_CALLBACK_PASS_ON;
 }
 
 static Eina_Bool
-_e_border_cb_mouse_wheel(void *data,
-                         int type __UNUSED__,
-                         void *event)
+_e_border_cb_mouse_x_wheel(void *d EINA_UNUSED, int t EINA_UNUSED, Ecore_Event_Mouse_Wheel *ev)
 {
-   Ecore_Event_Mouse_Wheel *ev;
    E_Border *bd;
+   E_Binding_Event_Wheel ev2;
 
-   ev = event;
-   bd = data;
-   if ((ev->event_window == bd->win) ||
-       (ev->event_window == bd->event_win))
+   if (action_input_win)
+     bd = action_border;
+   else
      {
-        bd->mouse.current.mx = ev->root.x;
-        bd->mouse.current.my = ev->root.y;
-        if (!bd->cur_mouse_action)
-          {
-             E_Binding_Event_Wheel ev2;
-
-             e_bindings_ecore_event_mouse_wheel_convert(ev, &ev2);
-             e_bindings_wheel_event_handle(E_BINDING_CONTEXT_WINDOW,
-                                           E_OBJECT(bd), &ev2);
-          }
+        bd = e_border_find_by_client_window(ev->window);
+        if (!bd) return ECORE_CALLBACK_RENEW;
+        /* event_window here should be bd->win if it isn't the same as window, not sure if this can NOT happen */
+        if ((ev->window != ev->event_window) && (bd->win != ev->event_window))
+          return ECORE_CALLBACK_RENEW;
      }
-   evas_event_feed_mouse_wheel(bd->bg_evas, ev->direction, ev->z, ev->timestamp, NULL);
-   return ECORE_CALLBACK_PASS_ON;
+   e_bindings_ecore_event_mouse_wheel_convert(ev, &ev2);
+   _e_border_cb_mouse_wheel_helper(bd, (Evas_Point*)&ev->root, &ev2);
+   return ECORE_CALLBACK_RENEW;
 }
 
-static Eina_Bool
-_e_border_cb_mouse_down(void *data,
-                        int type __UNUSED__,
-                        void *event)
+static void
+_e_border_cb_mouse_wheel(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
 {
-   Ecore_Event_Mouse_Button *ev;
-   E_Border *bd;
+   Evas_Event_Mouse_Wheel *ev = event_info;
+   E_Border *bd = data;
+   E_Binding_Event_Wheel ev2;
 
-   ev = event;
-   bd = data;
-   if ((ev->event_window == bd->win) ||
-       (ev->event_window == bd->event_win))
-     {
-        if ((ev->buttons >= 1) && (ev->buttons <= 3))
-          {
-             bd->mouse.last_down[ev->buttons - 1].mx = ev->root.x;
-             bd->mouse.last_down[ev->buttons - 1].my = ev->root.y;
-             bd->mouse.last_down[ev->buttons - 1].x = bd->x + bd->fx.x;
-             bd->mouse.last_down[ev->buttons - 1].y = bd->y + bd->fx.y;
-             bd->mouse.last_down[ev->buttons - 1].w = bd->w;
-             bd->mouse.last_down[ev->buttons - 1].h = bd->h;
-          }
-        else
-          {
-             bd->moveinfo.down.x = bd->x + bd->fx.x;
-             bd->moveinfo.down.y = bd->y + bd->fx.y;
-             bd->moveinfo.down.w = bd->w;
-             bd->moveinfo.down.h = bd->h;
-          }
-        bd->mouse.current.mx = ev->root.x;
-        bd->mouse.current.my = ev->root.y;
-        if (!bd->cur_mouse_action)
-          {
-             E_Binding_Event_Mouse_Button ev2;
+   if (action_border) return; // already existing border doing something
+   e_bindings_evas_event_mouse_wheel_convert(ev, &ev2);
+   _e_border_cb_mouse_wheel_helper(bd, &ev->output, &ev2);
+}
 
-             e_bindings_ecore_event_mouse_button_convert(ev, &ev2);
-             bd->cur_mouse_action =
-               e_bindings_mouse_down_event_handle(E_BINDING_CONTEXT_WINDOW,
-                                                  E_OBJECT(bd), &ev2);
-             if (bd->cur_mouse_action)
-               {
-                  if ((!bd->cur_mouse_action->func.end_mouse) &&
-                      (!bd->cur_mouse_action->func.end))
-                    bd->cur_mouse_action = NULL;
-                  if (bd->cur_mouse_action)
-                    e_object_ref(E_OBJECT(bd->cur_mouse_action));
-               }
-          }
-        e_focus_event_mouse_down(bd);
+static void
+_e_border_cb_mouse_down_helper(E_Border *bd, int button, Evas_Point *output, E_Binding_Event_Mouse_Button *ev)
+{
+   if ((button >= 1) && (button <= 3))
+     {
+        bd->mouse.last_down[button - 1].mx = output->x;
+        bd->mouse.last_down[button - 1].my = output->y;
+        bd->mouse.last_down[button - 1].x = bd->x + bd->fx.x;
+        bd->mouse.last_down[button - 1].y = bd->y + bd->fx.y;
+        bd->mouse.last_down[button - 1].w = bd->w;
+        bd->mouse.last_down[button - 1].h = bd->h;
      }
-   if (ev->window != ev->event_window)
+   else
      {
-        return 1;
+        bd->moveinfo.down.x = bd->x + bd->fx.x;
+        bd->moveinfo.down.y = bd->y + bd->fx.y;
+        bd->moveinfo.down.w = bd->w;
+        bd->moveinfo.down.h = bd->h;
      }
-   if ((ev->window != bd->event_win) && (ev->event_window != bd->win))
+   bd->mouse.current.mx = output->x;
+   bd->mouse.current.my = output->y;
+   if (!bd->cur_mouse_action)
      {
-        return 1;
+        bd->cur_mouse_action =
+          e_bindings_mouse_down_event_handle(E_BINDING_CONTEXT_WINDOW,
+                                             E_OBJECT(bd), ev);
+        if (bd->cur_mouse_action)
+          {
+             if ((!bd->cur_mouse_action->func.end_mouse) &&
+                 (!bd->cur_mouse_action->func.end))
+               bd->cur_mouse_action = NULL;
+             if (bd->cur_mouse_action)
+               e_object_ref(E_OBJECT(bd->cur_mouse_action));
+          }
      }
-   if ((ev->buttons >= 1) && (ev->buttons <= 3))
+   e_focus_event_mouse_down(bd);
+   if ((button >= 1) && (button <= 3))
      {
-        bd->mouse.last_down[ev->buttons - 1].mx = ev->root.x;
-        bd->mouse.last_down[ev->buttons - 1].my = ev->root.y;
-        bd->mouse.last_down[ev->buttons - 1].x = bd->x + bd->fx.x;
-        bd->mouse.last_down[ev->buttons - 1].y = bd->y + bd->fx.y;
-        bd->mouse.last_down[ev->buttons - 1].w = bd->w;
-        bd->mouse.last_down[ev->buttons - 1].h = bd->h;
+        bd->mouse.last_down[button - 1].mx = output->x;
+        bd->mouse.last_down[button - 1].my = output->y;
+        bd->mouse.last_down[button - 1].x = bd->x + bd->fx.x;
+        bd->mouse.last_down[button - 1].y = bd->y + bd->fx.y;
+        bd->mouse.last_down[button - 1].w = bd->w;
+        bd->mouse.last_down[button - 1].h = bd->h;
      }
    else
      {
@@ -6838,87 +6596,122 @@ _e_border_cb_mouse_down(void *data,
         bd->moveinfo.down.w = bd->w;
         bd->moveinfo.down.h = bd->h;
      }
-   bd->mouse.current.mx = ev->root.x;
-   bd->mouse.current.my = ev->root.y;
+   bd->mouse.current.mx = output->x;
+   bd->mouse.current.my = output->y;
 /*
    if (bd->moving)
      {
      }
-   else if (bd->resize_mode != RESIZE_NONE)
+   else if (bd->resize_mode != E_POINTER_RESIZE_NONE)
      {
      }
    else
  */
-   {
-      Evas_Button_Flags flags = EVAS_BUTTON_NONE;
-
-      if (ev->double_click) flags |= EVAS_BUTTON_DOUBLE_CLICK;
-      if (ev->triple_click) flags |= EVAS_BUTTON_TRIPLE_CLICK;
-      evas_event_feed_mouse_down(bd->bg_evas, ev->buttons, flags, ev->timestamp, NULL);
-   }
-   return ECORE_CALLBACK_PASS_ON;
 }
 
 static Eina_Bool
-_e_border_cb_mouse_up(void *data,
-                      int type __UNUSED__,
-                      void *event)
+_e_border_cb_mouse_x_down(void *d EINA_UNUSED, int t EINA_UNUSED, Ecore_Event_Mouse_Button *ev)
 {
-   Ecore_Event_Mouse_Button *ev;
    E_Border *bd;
+   E_Binding_Event_Mouse_Button ev2;
 
-   ev = event;
-   bd = data;
-   if ((ev->event_window == bd->win) ||
-       (ev->event_window == bd->event_win))
+   if (action_input_win)
+     bd = action_border;
+   else
      {
-        if ((ev->buttons >= 1) && (ev->buttons <= 3))
-          {
-             bd->mouse.last_up[ev->buttons - 1].mx = ev->root.x;
-             bd->mouse.last_up[ev->buttons - 1].my = ev->root.y;
-             bd->mouse.last_up[ev->buttons - 1].x = bd->x + bd->fx.x;
-             bd->mouse.last_up[ev->buttons - 1].y = bd->y + bd->fx.y;
-          }
-        bd->mouse.current.mx = ev->root.x;
-        bd->mouse.current.my = ev->root.y;
-        /* also we dont pass the same params that went in - then again that */
-        /* should be ok as we are just ending the action if it has an end */
-        if (bd->cur_mouse_action)
-          {
-             E_Binding_Event_Mouse_Button ev2;
+        bd = e_border_find_by_client_window(ev->window);
+        if (!bd) return ECORE_CALLBACK_RENEW;
+        /* event_window here should be bd->win if it isn't the same as window, not sure if this can NOT happen */
+        if ((ev->window != ev->event_window) && (bd->win != ev->event_window))
+          return ECORE_CALLBACK_RENEW;
+     }
+   e_bindings_ecore_event_mouse_button_convert(ev, &ev2);
+   _e_border_cb_mouse_down_helper(bd, ev->buttons, (Evas_Point*)&ev->root, &ev2);
+   return ECORE_CALLBACK_RENEW;
+}
 
-             e_bindings_ecore_event_mouse_button_convert(ev, &ev2);
-             if (bd->cur_mouse_action->func.end_mouse)
-               bd->cur_mouse_action->func.end_mouse(E_OBJECT(bd), "", &ev2);
-             else if (bd->cur_mouse_action->func.end)
-               bd->cur_mouse_action->func.end(E_OBJECT(bd), "");
-             e_object_unref(E_OBJECT(bd->cur_mouse_action));
-             bd->cur_mouse_action = NULL;
-          }
-        else
-          {
-             E_Binding_Event_Mouse_Button ev2;
+static void
+_e_border_cb_mouse_down(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+   Evas_Event_Mouse_Down *ev = event_info;
+   E_Border *bd = data;
+   E_Binding_Event_Mouse_Button ev2;
 
-             e_bindings_ecore_event_mouse_button_convert(ev, &ev2);
-             if (!e_bindings_mouse_up_event_handle(E_BINDING_CONTEXT_WINDOW, E_OBJECT(bd), &ev2))
-               e_focus_event_mouse_up(bd);
-          }
+   if (action_border) return; // already existing border doing something
+   e_bindings_evas_event_mouse_button_convert(ev, &ev2);
+   _e_border_cb_mouse_down_helper(bd, ev->button, &ev->output, &ev2);
+}
+
+static void
+_e_border_cb_mouse_up_helper(E_Border *bd, int button, Evas_Point *output, E_Binding_Event_Mouse_Button* ev)
+{
+   if ((button >= 1) && (button <= 3))
+     {
+        bd->mouse.last_up[button - 1].mx = output->x;
+        bd->mouse.last_up[button - 1].my = output->y;
+        bd->mouse.last_up[button - 1].x = bd->x + bd->fx.x;
+        bd->mouse.last_up[button - 1].y = bd->y + bd->fx.y;
      }
-   if (ev->window != bd->event_win) return ECORE_CALLBACK_PASS_ON;
-   if ((ev->buttons >= 1) && (ev->buttons <= 3))
+   bd->mouse.current.mx = output->x;
+   bd->mouse.current.my = output->y;
+   /* also we dont pass the same params that went in - then again that */
+   /* should be ok as we are just ending the action if it has an end */
+   if (bd->cur_mouse_action)
      {
-        bd->mouse.last_up[ev->buttons - 1].mx = ev->root.x;
-        bd->mouse.last_up[ev->buttons - 1].my = ev->root.y;
-        bd->mouse.last_up[ev->buttons - 1].x = bd->x + bd->fx.x;
-        bd->mouse.last_up[ev->buttons - 1].y = bd->y + bd->fx.y;
+        if (bd->cur_mouse_action->func.end_mouse)
+          bd->cur_mouse_action->func.end_mouse(E_OBJECT(bd), "", ev);
+        else if (bd->cur_mouse_action->func.end)
+          bd->cur_mouse_action->func.end(E_OBJECT(bd), "");
+        e_object_unref(E_OBJECT(bd->cur_mouse_action));
+        bd->cur_mouse_action = NULL;
+     }
+   else
+     {
+        if (!e_bindings_mouse_up_event_handle(E_BINDING_CONTEXT_WINDOW, E_OBJECT(bd), ev))
+          e_focus_event_mouse_up(bd);
+     }
+   if ((button >= 1) && (button <= 3))
+     {
+        bd->mouse.last_up[button - 1].mx = output->x;
+        bd->mouse.last_up[button - 1].my = output->y;
+        bd->mouse.last_up[button - 1].x = bd->x + bd->fx.x;
+        bd->mouse.last_up[button - 1].y = bd->y + bd->fx.y;
      }
-   bd->mouse.current.mx = ev->root.x;
-   bd->mouse.current.my = ev->root.y;
 
    bd->drag.start = 0;
+}
 
-   evas_event_feed_mouse_up(bd->bg_evas, ev->buttons, EVAS_BUTTON_NONE, ev->timestamp, NULL);
-   return ECORE_CALLBACK_PASS_ON;
+static Eina_Bool
+_e_border_cb_mouse_x_up(void *d EINA_UNUSED, int t EINA_UNUSED, Ecore_Event_Mouse_Button *ev)
+{
+   E_Border *bd;
+   E_Binding_Event_Mouse_Button ev2;
+
+   if (action_input_win)
+     bd = action_border;
+   else
+     {
+        bd = e_border_find_by_client_window(ev->window);
+        if (!bd) return ECORE_CALLBACK_RENEW;
+        /* event_window here should be bd->win if it isn't the same as window, not sure if this can NOT happen */
+        if ((ev->window != ev->event_window) && (bd->win != ev->event_window))
+          return ECORE_CALLBACK_RENEW;
+     }
+   e_bindings_ecore_event_mouse_button_convert(ev, &ev2);
+   _e_border_cb_mouse_up_helper(bd, ev->buttons, (Evas_Point*)&ev->root, &ev2);
+   return ECORE_CALLBACK_RENEW;
+}
+
+static void
+_e_border_cb_mouse_up(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+   Evas_Event_Mouse_Down *ev = event_info;
+   E_Border *bd = data;
+   E_Binding_Event_Mouse_Button ev2;
+
+   if (action_border) return; // already existing border doing something
+   e_bindings_evas_event_mouse_button_convert(ev, &ev2);
+   _e_border_cb_mouse_up_helper(bd, ev->button, &ev->output, &ev2);
 }
 
 static void
@@ -6973,20 +6766,12 @@ _e_border_stay_within_container(E_Border *bd, int x, int y, int *new_x, int *new
      }
 }
 
-static Eina_Bool
-_e_border_cb_mouse_move(void *data,
-                        int type __UNUSED__,
-                        void *event)
+static void
+_e_border_cb_mouse_move_helper(E_Border *bd, Evas_Point *output)
 {
-   Ecore_Event_Mouse_Move *ev;
-   E_Border *bd;
 
-   ev = event;
-   bd = data;
-   if ((ev->window != bd->event_win) &&
-       (ev->event_window != bd->win)) return ECORE_CALLBACK_PASS_ON;
-   bd->mouse.current.mx = ev->root.x;
-   bd->mouse.current.my = ev->root.y;
+   bd->mouse.current.mx = output->x;
+   bd->mouse.current.my = output->y;
    if (bd->moving)
      {
         int x, y, new_x, new_y;
@@ -6998,7 +6783,7 @@ _e_border_cb_mouse_move(void *data,
           bd->client.netwm.sync.wait = 0;
         if ((bd->client.netwm.sync.request) &&
             (bd->client.netwm.sync.alarm) &&
-            (bd->client.netwm.sync.wait > 1)) return ECORE_CALLBACK_PASS_ON;
+            (bd->client.netwm.sync.wait > 1)) return;
 #endif
         if ((bd->moveinfo.down.button >= 1) && (bd->moveinfo.down.button <= 3))
           {
@@ -7031,9 +6816,9 @@ _e_border_cb_mouse_move(void *data,
         bd->shelf_fix.y = 0;
         bd->shelf_fix.modified = 0;
         e_border_move(bd, new_x, new_y);
-        e_zone_flip_coords_handle(bd->zone, ev->root.x, ev->root.y);
+        e_zone_flip_coords_handle(bd->zone, output->x, output->y);
      }
-   else if (bd->resize_mode != RESIZE_NONE)
+   else if (bd->resize_mode != E_POINTER_RESIZE_NONE)
      {
         if ((bd->client.netwm.sync.request) &&
             (bd->client.netwm.sync.alarm))
@@ -7046,7 +6831,7 @@ _e_border_cb_mouse_move(void *data,
                     {
                        bd->changes.pos = 1;
                        bd->changes.size = 1;
-                       bd->changed = 1;
+                       BD_CHANGED(bd);
                        _e_border_client_move_resize_send(bd);
                     }
                   EINA_LIST_FREE(bd->pending_move_resize, pnd)
@@ -7065,59 +6850,71 @@ _e_border_cb_mouse_move(void *data,
         else
           _e_border_resize_handle(bd);
      }
-   else
+   else if (bd->drag.start)
      {
-        if (bd->drag.start)
+        if ((bd->drag.x == -1) && (bd->drag.y == -1))
           {
-             if ((bd->drag.x == -1) && (bd->drag.y == -1))
-               {
-                  bd->drag.x = ev->root.x;
-                  bd->drag.y = ev->root.y;
-               }
-             else
-               {
-                  int dx, dy;
+             bd->drag.x = output->x;
+             bd->drag.y = output->y;
+          }
+        else
+          {
+             int dx, dy;
 
-                  dx = bd->drag.x - ev->root.x;
-                  dy = bd->drag.y - ev->root.y;
-                  if (((dx * dx) + (dy * dy)) >
-                      (e_config->drag_resist * e_config->drag_resist))
+             dx = bd->drag.x - output->x;
+             dy = bd->drag.y - output->y;
+             if (((dx * dx) + (dy * dy)) >
+                 (e_config->drag_resist * e_config->drag_resist))
+               {
+                  /* start drag! */
+                  if (bd->icon_object)
                     {
-                       /* start drag! */
-                       if (bd->icon_object)
+                       Evas_Object *o = NULL;
+                       Evas_Coord x, y, w, h;
+                       const char *drag_types[] = { "enlightenment/border" };
+
+                       e_object_ref(E_OBJECT(bd));
+                       evas_object_geometry_get(bd->icon_object,
+                                                &x, &y, &w, &h);
+                       drag_border = e_drag_new(bd->zone->container,
+                                                x, y,
+                                                drag_types, 1, bd, -1,
+                                                NULL,
+                                                _e_border_cb_drag_finished);
+                       o = e_border_icon_add(bd, drag_border->evas);
+                       if (!o)
                          {
-                            Evas_Object *o = NULL;
-                            Evas_Coord x, y, w, h;
-                            const char *drag_types[] = { "enlightenment/border" };
-
-                            e_object_ref(E_OBJECT(bd));
-                            evas_object_geometry_get(bd->icon_object,
-                                                     &x, &y, &w, &h);
-                            drag_border = e_drag_new(bd->zone->container,
-                                                     bd->x + bd->fx.x + x,
-                                                     bd->y + bd->fx.y + y,
-                                                     drag_types, 1, bd, -1,
-                                                     NULL,
-                                                     _e_border_cb_drag_finished);
-                            o = e_border_icon_add(bd, drag_border->evas);
-                            if (!o)
-                              {
-                                 /* FIXME: fallback icon for drag */
-                                 o = evas_object_rectangle_add(drag_border->evas);
-                                 evas_object_color_set(o, 255, 255, 255, 255);
-                              }
-                            e_drag_object_set(drag_border, o);
-
-                            e_drag_resize(drag_border, w, h);
-                            e_drag_start(drag_border, bd->drag.x, bd->drag.y);
+                            /* FIXME: fallback icon for drag */
+                            o = evas_object_rectangle_add(drag_border->evas);
+                            evas_object_color_set(o, 255, 255, 255, 255);
                          }
-                       bd->drag.start = 0;
+                       e_drag_object_set(drag_border, o);
+
+                       e_drag_resize(drag_border, w, h);
+                       e_drag_start(drag_border, bd->drag.x, bd->drag.y);
                     }
+                  bd->drag.start = 0;
                }
           }
-        evas_event_feed_mouse_move(bd->bg_evas, ev->x, ev->y, ev->timestamp, NULL);
      }
-   return ECORE_CALLBACK_PASS_ON;
+}
+
+static Eina_Bool
+_e_border_cb_mouse_x_move(void *d EINA_UNUSED, int t EINA_UNUSED, Ecore_Event_Mouse_Move *ev)
+{
+   if (!action_input_win) return ECORE_CALLBACK_RENEW;
+   _e_border_cb_mouse_move_helper(action_border, (Evas_Point*)&ev->root);
+   return ECORE_CALLBACK_RENEW;
+}
+
+static void
+_e_border_cb_mouse_move(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
+{
+   Evas_Event_Mouse_Move *ev = event_info;
+   E_Border *bd = data;
+
+   if (action_border) return; // already existing border doing something
+   _e_border_cb_mouse_move_helper(bd, &ev->cur.output);
 }
 
 static Eina_Bool
@@ -7181,7 +6978,7 @@ _e_border_cb_desk_window_profile_change(void *data  __UNUSED__,
         if (!e_object_is_del(E_OBJECT(bd)))
           {
              bd->client.e.fetch.profile = 1;
-             bd->changed = 1;
+             BD_CHANGED(bd);
           }
      }
    return ECORE_CALLBACK_PASS_ON;
@@ -7228,17 +7025,20 @@ _e_border_post_move_resize_job(void *data)
    else if ((bd->post_move) && (bd->post_resize))
      {
         ecore_x_window_move_resize(bd->win,
-                                   bd->x + bd->fx.x,
-                                   bd->y + bd->fx.y,
-                                   bd->w, bd->h);
+                                   bd->x + bd->fx.x + bd->client_inset.l,
+                                   bd->y + bd->fx.y + bd->client_inset.t,
+                                   bd->w - (bd->client_inset.l + bd->client_inset.r),
+                                   bd->h - (bd->client_inset.t + bd->client_inset.b));
      }
    else if (bd->post_move)
      {
-        ecore_x_window_move(bd->win, bd->x + bd->fx.x, bd->y + bd->fx.y);
+        ecore_x_window_move(bd->win, bd->x + bd->fx.x + bd->client_inset.l, bd->y + bd->fx.y + bd->client_inset.t);
      }
    else if (bd->post_resize)
      {
-        ecore_x_window_resize(bd->win, bd->w, bd->h);
+        ecore_x_window_resize(bd->win,
+                              bd->w - (bd->client_inset.l + bd->client_inset.r),
+                              bd->h - (bd->client_inset.t + bd->client_inset.b));
      }
 
    if (bd->client.e.state.video)
@@ -7598,7 +7398,7 @@ _e_border_eval0(E_Border *bd)
         //     if (bd->client.icccm.step_w < 1) bd->client.icccm.step_w = 1;
         //     if (bd->client.icccm.step_h < 1) bd->client.icccm.step_h = 1;
         // if doing a resize, fix it up
-        if (bd->resize_mode != RESIZE_NONE)
+        if (bd->resize_mode != E_POINTER_RESIZE_NONE)
           {
              int x, y, w, h, new_w, new_h;
 
@@ -7609,13 +7409,13 @@ _e_border_eval0(E_Border *bd)
              new_w = w;
              new_h = h;
              e_border_resize_limit(bd, &new_w, &new_h);
-             if ((bd->resize_mode == RESIZE_TL) ||
-                 (bd->resize_mode == RESIZE_L) ||
-                 (bd->resize_mode == RESIZE_BL))
+             if ((bd->resize_mode == E_POINTER_RESIZE_TL) ||
+                 (bd->resize_mode == E_POINTER_RESIZE_L) ||
+                 (bd->resize_mode == E_POINTER_RESIZE_BL))
                x += (w - new_w);
-             if ((bd->resize_mode == RESIZE_TL) ||
-                 (bd->resize_mode == RESIZE_T) ||
-                 (bd->resize_mode == RESIZE_TR))
+             if ((bd->resize_mode == E_POINTER_RESIZE_TL) ||
+                 (bd->resize_mode == E_POINTER_RESIZE_T) ||
+                 (bd->resize_mode == E_POINTER_RESIZE_TR))
                y += (h - new_h);
              e_border_move_resize(bd, x, y, new_w, new_h);
           }
@@ -7692,7 +7492,7 @@ _e_border_eval0(E_Border *bd)
                   bd->parent->lock_close = 1;
                   if (!bd->parent->client.lock_win)
                     {
-                       bd->parent->client.lock_win = ecore_x_window_input_new(bd->parent->client.shell_win, 0, 0, bd->parent->client.w, bd->parent->client.h);
+                       bd->parent->client.lock_win = ecore_x_window_input_new(bd->parent->win, 0, 0, bd->parent->client.w, bd->parent->client.h);
                        ecore_x_window_show(bd->parent->client.lock_win);
                     }
                }
@@ -8273,7 +8073,7 @@ _e_border_eval0(E_Border *bd)
      {
         if (!bd->internal)
           ecore_x_window_save_set_add(bd->client.win);
-        ecore_x_window_reparent(bd->client.win, bd->client.shell_win, 0, 0);
+        ecore_x_window_reparent(bd->client.win, bd->win, bd->client_inset.l, bd->client_inset.t);
         if (bd->visible)
           {
              if ((bd->new_client) && (bd->internal) &&
@@ -8329,7 +8129,7 @@ _e_border_eval0(E_Border *bd)
 
         if ((!bd->client.border.name) || (strcmp(bd->client.border.name, bordername)))
           {
-             Evas_Object *o;
+             Evas_Object *o, *pbg = bd->bg_object;
              char buf[4096];
              int ok;
 
@@ -8338,12 +8138,15 @@ _e_border_eval0(E_Border *bd)
 
              if (bd->bg_object)
                {
+                  int w, h;
+
+                  w = bd->w, h = bd->h;
                   bd->w -= (bd->client_inset.l + bd->client_inset.r);
                   bd->h -= (bd->client_inset.t + bd->client_inset.b);
-                  bd->changes.size = 1;
+                  if ((bd->w != w) || (h != bd->h)) bd->changes.size = 1;
                   evas_object_del(bd->bg_object);
                }
-             o = edje_object_add(bd->bg_evas);
+             o = edje_object_add(e_comp_get(bd)->evas);
              snprintf(buf, sizeof(buf), "e/widgets/border/%s/border", bd->client.border.name);
              ok = e_theme_edje_object_set(o, "base/theme/borders", buf);
              if ((!ok) && (strcmp(bd->client.border.name, "borderless")))
@@ -8366,67 +8169,76 @@ _e_border_eval0(E_Border *bd)
                     }
                }
 
-             bd->shaped = 0;
              if (ok)
                {
-                  const char *shape_option, *argb_option;
-                  int use_argb = 0;
-
                   bd->bg_object = o;
 
-                  if ((!e_config->use_shaped_win) && (!bd->client.argb))
-                    {
-                       argb_option = edje_object_data_get(o, "argb");
-                       if ((argb_option) && (!strcmp(argb_option, "1")))
-                         use_argb = 1;
-
-                       o = bd->bg_object;
-                       if (use_argb != bd->argb)
-                         _e_border_frame_replace(bd, use_argb);
-
-                       if (bd->icon_object != o)
-                         {
-                            if (bd->bg_object)
-                              {
-                                 evas_object_show(bd->icon_object);
-                                 edje_object_part_swallow(bd->bg_object, "e.swallow.icon", bd->icon_object);
-                              }
-                            else
-                              evas_object_hide(bd->icon_object);
-                         }
-                       o = bd->bg_object;
-                    }
-
-                  if (!bd->argb)
-                    {
-                       shape_option = edje_object_data_get(o, "shaped");
-                       if ((shape_option) && (!strcmp(shape_option, "1")))
-                         bd->shaped = 1;
-                    }
-
                   if (bd->client.netwm.name)
                     edje_object_part_text_set(o, "e.text.title",
                                               bd->client.netwm.name);
                   else if (bd->client.icccm.title)
                     edje_object_part_text_set(o, "e.text.title",
                                               bd->client.icccm.title);
+                  bd->theme_shadow = !!edje_object_data_get(o, "shadow");
+                  _e_border_shadow(bd);
                }
              else
                {
+                  if (strcmp(bordername, "borderless"))
+                  /* it should never happen that a theme fails to set the edje
+                   * unless it's using borderless
+                   */
+                    CRI("USER IS USING A SHITTY THEME! ABORT!!!!");
                   evas_object_del(o);
                   bd->bg_object = NULL;
+                  E_FREE_FUNC(bd->icon_object, evas_object_del);
+                  o = bd->cw ? bd->cw->obj : NULL;
+               }
+             if (bd->cw) e_comp_win_reshadow(bd->cw);
+             /* FIXME: it's theoretically possible that o is NULL here if first border eval occurs for a fullscreen
+              * borderless window before its comp win has been set up;
+              * E19 material imo
+              */
+             if (o)
+               {
+                  if (bd->cw && (o == bd->cw->obj))
+                    {
+                       /* TODO: set these on cw->effect_obj...always. */
+                       evas_object_event_callback_del_full(o, EVAS_CALLBACK_MOUSE_IN, _e_border_cb_mouse_in, bd);
+                       evas_object_event_callback_del_full(o, EVAS_CALLBACK_MOUSE_MOVE, _e_border_cb_mouse_move, bd);
+                       evas_object_event_callback_del_full(o, EVAS_CALLBACK_MOUSE_OUT, _e_border_cb_mouse_out, bd);
+                       evas_object_event_callback_del_full(o, EVAS_CALLBACK_MOUSE_DOWN, _e_border_cb_mouse_down, bd);
+                       evas_object_event_callback_del_full(o, EVAS_CALLBACK_MOUSE_UP, _e_border_cb_mouse_up, bd);
+                       evas_object_event_callback_del_full(o, EVAS_CALLBACK_MOUSE_WHEEL, _e_border_cb_mouse_wheel, bd);
+                    }
+                  evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_IN, _e_border_cb_mouse_in, bd);
+                  evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_MOVE, _e_border_cb_mouse_move, bd);
+                  evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_OUT, _e_border_cb_mouse_out, bd);
+                  evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_DOWN, _e_border_cb_mouse_down, bd);
+                  evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_UP, _e_border_cb_mouse_up, bd);
+                  evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_WHEEL, _e_border_cb_mouse_wheel, bd);
                }
 
-             _e_border_client_inset_calc(bd);
+             {
+                // previously calculated
+                Eina_Bool calc = bd->client_inset.calc;
+                // previously was borderless
+                Eina_Bool inset, pinset = !!(bd->client_inset.l + bd->client_inset.r + bd->client_inset.t + bd->client_inset.b);
+
+                _e_border_client_inset_calc(bd);
+                inset = !!(bd->client_inset.l + bd->client_inset.r + bd->client_inset.t + bd->client_inset.b);
+                if (calc && (inset != pinset) && (pbg || (!bd->bg_object)))
+                  {
+                     if (inset)
+                       bd->x -= bd->client_inset.l, bd->y -= bd->client_inset.t;
+                     else
+                       bd->x += bd->client_inset.l, bd->y += bd->client_inset.t;
+                  }
+             }
 
              bd->w += (bd->client_inset.l + bd->client_inset.r);
              bd->h += (bd->client_inset.t + bd->client_inset.b);
-             ecore_evas_shaped_set(bd->bg_ecore_evas, bd->shaped);
              bd->changes.size = 1;
-             /*  really needed ? */
-             ecore_x_window_move(bd->client.shell_win,
-                                 bd->client_inset.l,
-                                 bd->client_inset.t);
 
              if (bd->maximized != E_MAXIMIZE_NONE)
                {
@@ -8462,10 +8274,6 @@ _e_border_eval0(E_Border *bd)
                   // FIXME: in eval -do differently
                   //        edje_object_message_signal_process(bd->bg_object);
                   //        e_border_frame_recalc(bd);
-
-                  evas_object_move(bd->bg_object, 0, 0);
-                  evas_object_resize(bd->bg_object, bd->w, bd->h);
-                  evas_object_show(bd->bg_object);
                }
           }
         bd->client.border.changed = 0;
@@ -8808,45 +8616,45 @@ _e_border_eval(E_Border *bd)
    if ((bd->changes.shading))
      {
         /*  show at start of unshade (but don't hide until end of shade) */
-        if (bd->shaded)
-          ecore_x_window_raise(bd->client.shell_win);
+        //if (bd->shaded)
+          //ecore_x_window_raise(bd->win);
         bd->changes.shading = 0;
         rem_change = 1;
      }
    if ((bd->changes.shaded) && (bd->changes.pos) && (bd->changes.size))
      {
-        if (bd->shaded)
-          ecore_x_window_lower(bd->client.shell_win);
-        else
-          ecore_x_window_raise(bd->client.shell_win);
+        //if (bd->shaded)
+          //ecore_x_window_lower(bd->win);
+        //else
+          //ecore_x_window_raise(bd->win);
         bd->changes.shaded = 0;
         rem_change = 1;
      }
    else if ((bd->changes.shaded) && (bd->changes.pos))
      {
-        if (bd->shaded)
-          ecore_x_window_lower(bd->client.shell_win);
-        else
-          ecore_x_window_raise(bd->client.shell_win);
+        //if (bd->shaded)
+          //ecore_x_window_lower(bd->win);
+        //else
+          //ecore_x_window_raise(bd->win);
         bd->changes.size = 1;
         bd->changes.shaded = 0;
         rem_change = 1;
      }
    else if ((bd->changes.shaded) && (bd->changes.size))
      {
-        if (bd->shaded)
-          ecore_x_window_lower(bd->client.shell_win);
-        else
-          ecore_x_window_raise(bd->client.shell_win);
+        //if (bd->shaded)
+          //ecore_x_window_lower(bd->win);
+        //else
+          //ecore_x_window_raise(bd->win);
         bd->changes.shaded = 0;
         rem_change = 1;
      }
    else if (bd->changes.shaded)
      {
-        if (bd->shaded)
-          ecore_x_window_lower(bd->client.shell_win);
-        else
-          ecore_x_window_raise(bd->client.shell_win);
+        //if (bd->shaded)
+          //ecore_x_window_lower(bd->win);
+        //else
+          //ecore_x_window_raise(bd->win);
         bd->changes.size = 1;
         bd->changes.shaded = 0;
         rem_change = 1;
@@ -8854,30 +8662,24 @@ _e_border_eval(E_Border *bd)
 
    if (bd->changes.size)
      {
-        int x = 0, y = 0, xx = 0, yy = 0;
+        int x, y, w = 0, h = 0;
 
-        if ((bd->shaded) && (!bd->shading))
-          {
-             evas_obscured_clear(bd->bg_evas);
-          }
-        else
+        x = bd->x + bd->client_inset.l;
+        y = bd->y + bd->client_inset.t;
+        if ((!bd->shaded) || (bd->shading))
           {
-             xx = bd->w - (bd->client_inset.l + bd->client_inset.r);
-             yy = bd->h - (bd->client_inset.t + bd->client_inset.b);
-
-             evas_obscured_clear(bd->bg_evas);
-             evas_obscured_rectangle_add(bd->bg_evas,
-                                         bd->client_inset.l, bd->client_inset.t, xx, yy);
+             w = bd->w - (bd->client_inset.l + bd->client_inset.r);
+             h = bd->h - (bd->client_inset.t + bd->client_inset.b);
 
              if (bd->shading)
                {
                   if (bd->shade.dir == E_DIRECTION_UP)
                     {
-                       y = yy - bd->client.h;
+                       y = h - bd->client.h;
                     }
                   else if (bd->shade.dir == E_DIRECTION_LEFT)
                     {
-                       x = xx - bd->client.w;
+                       x = w - bd->client.w;
                     }
                }
           }
@@ -8909,36 +8711,26 @@ _e_border_eval(E_Border *bd)
              E_Border *tmp;
              Eina_List *l;
 
-             ecore_x_window_move_resize(bd->win,
-                                        bd->x + bd->fx.x,
-                                        bd->y + bd->fx.y,
-                                        bd->w, bd->h);
-
              EINA_LIST_FOREACH(bd->client.e.state.video_child, l, tmp)
                ecore_x_window_move(tmp->win,
                                    bd->x + bd->fx.x + bd->client_inset.l + tmp->client.e.state.video_position.x,
                                    bd->y + bd->fx.y + bd->client_inset.t + tmp->client.e.state.video_position.y);
           }
 
-        ecore_x_window_move_resize(bd->event_win, 0, 0, bd->w, bd->h);
-
         if ((!bd->shaded) || (bd->shading))
-          ecore_x_window_move_resize(bd->client.shell_win,
-                                     bd->client_inset.l, bd->client_inset.t, xx, yy);
+          ecore_x_window_move_resize(bd->win, x, y, w, h);
 
         if (bd->internal_ecore_evas)
-          ecore_evas_move_resize(bd->internal_ecore_evas, x, y, bd->client.w, bd->client.h);
+          ecore_evas_move_resize(bd->internal_ecore_evas, 0, 0, w, h);
         else if (!bd->client.e.state.video)
           {
-             ecore_x_window_move_resize(bd->client.win, x, y, bd->client.w, bd->client.h);
-             ecore_x_window_move_resize(bd->client.lock_win, x, y, bd->client.w, bd->client.h);
+             ecore_x_window_move_resize(bd->client.win, 0, 0, bd->client.w, bd->client.h);
+             ecore_x_window_move_resize(bd->client.lock_win, 0, 0, bd->client.w, bd->client.h);
           }
 
-        ecore_evas_move_resize(bd->bg_ecore_evas, 0, 0, bd->w, bd->h);
-        evas_object_resize(bd->bg_object, bd->w, bd->h);
-        e_container_shape_resize(bd->shape, bd->w, bd->h);
+        e_container_shape_resize(bd->shape, w, h);
         if (bd->changes.pos)
-          e_container_shape_move(bd->shape, bd->x + bd->fx.x, bd->y + bd->fx.y);
+          e_container_shape_move(bd->shape, x, y);
 
         _e_border_client_move_resize_send(bd);
 
@@ -8952,7 +8744,7 @@ _e_border_eval(E_Border *bd)
         bd->post_job = ecore_idle_enterer_add(_e_border_post_move_resize_job, bd);
         bd->post_move = 1;
 
-        e_container_shape_move(bd->shape, bd->x + bd->fx.x, bd->y + bd->fx.y);
+        e_container_shape_move(bd->shape, bd->x + bd->fx.x + bd->client_inset.l, bd->y + bd->fx.y + bd->client_inset.t);
 
         _e_border_client_move_resize_send(bd);
 
@@ -8970,37 +8762,33 @@ _e_border_eval(E_Border *bd)
    if (bd->need_shape_merge)
      {
         _e_border_shape_input_rectangle_set(bd);
-        if ((bd->shaped) || (bd->client.shaped))
+        if (bd->client.shaped)
           {
              Ecore_X_Window twin, twin2;
              int x, y;
+             Ecore_X_Rectangle rects[4];
 
              twin = ecore_x_window_override_new
                  (bd->zone->container->scratch_win, 0, 0, bd->w, bd->h);
-             if (bd->shaped)
-               ecore_x_window_shape_window_set(twin, bd->bg_win);
-             else
-               {
-                  Ecore_X_Rectangle rects[4];
-
-                  rects[0].x = 0;
-                  rects[0].y = 0;
-                  rects[0].width = bd->w;
-                  rects[0].height = bd->client_inset.t;
-                  rects[1].x = 0;
-                  rects[1].y = bd->client_inset.t;
-                  rects[1].width = bd->client_inset.l;
-                  rects[1].height = bd->h - bd->client_inset.t - bd->client_inset.b;
-                  rects[2].x = bd->w - bd->client_inset.r;
-                  rects[2].y = bd->client_inset.t;
-                  rects[2].width = bd->client_inset.r;
-                  rects[2].height = bd->h - bd->client_inset.t - bd->client_inset.b;
-                  rects[3].x = 0;
-                  rects[3].y = bd->h - bd->client_inset.b;
-                  rects[3].width = bd->w;
-                  rects[3].height = bd->client_inset.b;
-                  ecore_x_window_shape_rectangles_set(twin, rects, 4);
-               }
+                  
+
+             rects[0].x = 0;
+             rects[0].y = 0;
+             rects[0].width = bd->w;
+             rects[0].height = bd->client_inset.t;
+             rects[1].x = 0;
+             rects[1].y = bd->client_inset.t;
+             rects[1].width = bd->client_inset.l;
+             rects[1].height = bd->h - bd->client_inset.t - bd->client_inset.b;
+             rects[2].x = bd->w - bd->client_inset.r;
+             rects[2].y = bd->client_inset.t;
+             rects[2].width = bd->client_inset.r;
+             rects[2].height = bd->h - bd->client_inset.t - bd->client_inset.b;
+             rects[3].x = 0;
+             rects[3].y = bd->h - bd->client_inset.b;
+             rects[3].width = bd->w;
+             rects[3].height = bd->client_inset.b;
+             ecore_x_window_shape_rectangles_set(twin, rects, 4);
              twin2 = ecore_x_window_override_new
                  (bd->zone->container->scratch_win, 0, 0,
                  bd->w - bd->client_inset.l - bd->client_inset.r,
@@ -9123,7 +8911,7 @@ _e_border_eval(E_Border *bd)
                     {
                        bd->x = x - (bd->w >> 1);
                        bd->y = y - (bd->client_inset.t >> 1);
-                       bd->changed = 1;
+                       BD_CHANGED(bd);
                        bd->changes.pos = 1;
 
                        _e_border_client_move_resize_send(bd);
@@ -9220,7 +9008,7 @@ _e_border_eval(E_Border *bd)
                                             bd->desktop->orig_path);
           }
 
-        bd->icon_object = e_border_icon_add(bd, bd->bg_evas);
+        bd->icon_object = e_border_icon_add(bd, e_comp_get(bd)->evas);
         if ((bd->focused) && (bd->icon_object))
           edje_object_signal_emit(bd->icon_object, "e,state,focused", "e");
         if (bd->bg_object)
@@ -9349,9 +9137,9 @@ _e_border_resize_handle(E_Border *bd)
    w = bd->w;
    h = bd->h;
 
-   if ((bd->resize_mode == RESIZE_TR) ||
-       (bd->resize_mode == RESIZE_R) ||
-       (bd->resize_mode == RESIZE_BR))
+   if ((bd->resize_mode == E_POINTER_RESIZE_TR) ||
+       (bd->resize_mode == E_POINTER_RESIZE_R) ||
+       (bd->resize_mode == E_POINTER_RESIZE_BR))
      {
         if ((bd->moveinfo.down.button >= 1) &&
             (bd->moveinfo.down.button <= 3))
@@ -9360,9 +9148,9 @@ _e_border_resize_handle(E_Border *bd)
         else
           w = bd->moveinfo.down.w + (bd->mouse.current.mx - bd->moveinfo.down.mx);
      }
-   else if ((bd->resize_mode == RESIZE_TL) ||
-            (bd->resize_mode == RESIZE_L) ||
-            (bd->resize_mode == RESIZE_BL))
+   else if ((bd->resize_mode == E_POINTER_RESIZE_TL) ||
+            (bd->resize_mode == E_POINTER_RESIZE_L) ||
+            (bd->resize_mode == E_POINTER_RESIZE_BL))
      {
         if ((bd->moveinfo.down.button >= 1) &&
             (bd->moveinfo.down.button <= 3))
@@ -9372,9 +9160,9 @@ _e_border_resize_handle(E_Border *bd)
           w = bd->moveinfo.down.w - (bd->mouse.current.mx - bd->moveinfo.down.mx);
      }
 
-   if ((bd->resize_mode == RESIZE_TL) ||
-       (bd->resize_mode == RESIZE_T) ||
-       (bd->resize_mode == RESIZE_TR))
+   if ((bd->resize_mode == E_POINTER_RESIZE_TL) ||
+       (bd->resize_mode == E_POINTER_RESIZE_T) ||
+       (bd->resize_mode == E_POINTER_RESIZE_TR))
      {
         if ((bd->moveinfo.down.button >= 1) &&
             (bd->moveinfo.down.button <= 3))
@@ -9383,9 +9171,9 @@ _e_border_resize_handle(E_Border *bd)
         else
           h = bd->moveinfo.down.h - (bd->mouse.current.my - bd->moveinfo.down.my);
      }
-   else if ((bd->resize_mode == RESIZE_BL) ||
-            (bd->resize_mode == RESIZE_B) ||
-            (bd->resize_mode == RESIZE_BR))
+   else if ((bd->resize_mode == E_POINTER_RESIZE_BL) ||
+            (bd->resize_mode == E_POINTER_RESIZE_B) ||
+            (bd->resize_mode == E_POINTER_RESIZE_BR))
      {
         if ((bd->moveinfo.down.button >= 1) &&
             (bd->moveinfo.down.button <= 3))
@@ -9398,13 +9186,13 @@ _e_border_resize_handle(E_Border *bd)
    tw = bd->w;
    th = bd->h;
 
-   if ((bd->resize_mode == RESIZE_TL) ||
-       (bd->resize_mode == RESIZE_L) ||
-       (bd->resize_mode == RESIZE_BL))
+   if ((bd->resize_mode == E_POINTER_RESIZE_TL) ||
+       (bd->resize_mode == E_POINTER_RESIZE_L) ||
+       (bd->resize_mode == E_POINTER_RESIZE_BL))
      x += (tw - w);
-   if ((bd->resize_mode == RESIZE_TL) ||
-       (bd->resize_mode == RESIZE_T) ||
-       (bd->resize_mode == RESIZE_TR))
+   if ((bd->resize_mode == E_POINTER_RESIZE_TL) ||
+       (bd->resize_mode == E_POINTER_RESIZE_T) ||
+       (bd->resize_mode == E_POINTER_RESIZE_TR))
      y += (th - h);
 
    skiplist = eina_list_append(skiplist, bd);
@@ -9417,13 +9205,13 @@ _e_border_resize_handle(E_Border *bd)
    w = new_w;
    h = new_h;
    e_border_resize_limit(bd, &new_w, &new_h);
-   if ((bd->resize_mode == RESIZE_TL) ||
-       (bd->resize_mode == RESIZE_L) ||
-       (bd->resize_mode == RESIZE_BL))
+   if ((bd->resize_mode == E_POINTER_RESIZE_TL) ||
+       (bd->resize_mode == E_POINTER_RESIZE_L) ||
+       (bd->resize_mode == E_POINTER_RESIZE_BL))
      new_x += (w - new_w);
-   if ((bd->resize_mode == RESIZE_TL) ||
-       (bd->resize_mode == RESIZE_T) ||
-       (bd->resize_mode == RESIZE_TR))
+   if ((bd->resize_mode == E_POINTER_RESIZE_TL) ||
+       (bd->resize_mode == E_POINTER_RESIZE_T) ||
+       (bd->resize_mode == E_POINTER_RESIZE_TR))
      new_y += (h - new_h);
 
    e_border_move_resize(bd, new_x, new_y, new_w, new_h);
@@ -9526,7 +9314,7 @@ _e_border_shade_animator(void *data)
         bd->changes.pos = 1;
      }
 
-   if ((bd->shaped) || (bd->client.shaped))
+   if (bd->client.shaped)
      {
         bd->need_shape_merge = 1;
         bd->need_shape_export = 1;
@@ -9536,7 +9324,7 @@ _e_border_shade_animator(void *data)
         bd->need_shape_merge = 1;
      }
    bd->changes.size = 1;
-   bd->changed = 1;
+   BD_CHANGED(bd);
 
    /* we're done */
    if (val == 1)
@@ -9548,7 +9336,7 @@ _e_border_shade_animator(void *data)
         bd->changes.size = 1;
         bd->changes.shaded = 1;
         bd->changes.shading = 1;
-        bd->changed = 1;
+        BD_CHANGED(bd);
         bd->shade.anim = NULL;
 
         if (bd->shaded)
@@ -9886,7 +9674,7 @@ _e_border_resize_end(E_Border *bd)
         /* resize to last geometry if sync alarm for it was not yet handled */
         if (bd->pending_move_resize)
           {
-             bd->changed = 1;
+             BD_CHANGED(bd);
              bd->changes.pos = 1;
              bd->changes.size = 1;
              _e_border_client_move_resize_send(bd);
@@ -10033,96 +9821,6 @@ _e_border_cb_kill_timer(void *data)
    return ECORE_CALLBACK_CANCEL;
 }
 
-static void
-_e_border_pointer_resize_begin(E_Border *bd)
-{
-   switch (bd->resize_mode)
-     {
-      case RESIZE_TL:
-        e_pointer_type_push(bd->pointer, bd, "resize_tl");
-        break;
-
-      case RESIZE_T:
-        e_pointer_type_push(bd->pointer, bd, "resize_t");
-        break;
-
-      case RESIZE_TR:
-        e_pointer_type_push(bd->pointer, bd, "resize_tr");
-        break;
-
-      case RESIZE_R:
-        e_pointer_type_push(bd->pointer, bd, "resize_r");
-        break;
-
-      case RESIZE_BR:
-        e_pointer_type_push(bd->pointer, bd, "resize_br");
-        break;
-
-      case RESIZE_B:
-        e_pointer_type_push(bd->pointer, bd, "resize_b");
-        break;
-
-      case RESIZE_BL:
-        e_pointer_type_push(bd->pointer, bd, "resize_bl");
-        break;
-
-      case RESIZE_L:
-        e_pointer_type_push(bd->pointer, bd, "resize_l");
-        break;
-     }
-}
-
-static void
-_e_border_pointer_resize_end(E_Border *bd)
-{
-   switch (bd->resize_mode)
-     {
-      case RESIZE_TL:
-        e_pointer_type_pop(bd->pointer, bd, "resize_tl");
-        break;
-
-      case RESIZE_T:
-        e_pointer_type_pop(bd->pointer, bd, "resize_t");
-        break;
-
-      case RESIZE_TR:
-        e_pointer_type_pop(bd->pointer, bd, "resize_tr");
-        break;
-
-      case RESIZE_R:
-        e_pointer_type_pop(bd->pointer, bd, "resize_r");
-        break;
-
-      case RESIZE_BR:
-        e_pointer_type_pop(bd->pointer, bd, "resize_br");
-        break;
-
-      case RESIZE_B:
-        e_pointer_type_pop(bd->pointer, bd, "resize_b");
-        break;
-
-      case RESIZE_BL:
-        e_pointer_type_pop(bd->pointer, bd, "resize_bl");
-        break;
-
-      case RESIZE_L:
-        e_pointer_type_pop(bd->pointer, bd, "resize_l");
-        break;
-     }
-}
-
-static void
-_e_border_pointer_move_begin(E_Border *bd)
-{
-   e_pointer_type_push(bd->pointer, bd, "move");
-}
-
-static void
-_e_border_pointer_move_end(E_Border *bd)
-{
-   e_pointer_type_pop(bd->pointer, bd, "move");
-}
-
 static Eina_List *_e_border_hooks = NULL;
 static int _e_border_hooks_delete = 0;
 static int _e_border_hooks_walking = 0;
index 19a4358..fd4dac4 100644 (file)
@@ -125,7 +125,7 @@ typedef struct _E_Event_Border_Simple        E_Event_Border_Move;
 typedef struct _E_Event_Border_Simple        E_Event_Border_Add;
 typedef struct _E_Event_Border_Simple        E_Event_Border_Remove;
 typedef struct _E_Event_Border_Simple        E_Event_Border_Show;
-typedef struct _E_Event_Border_Simple        E_Event_Border_Hide;
+typedef struct _E_Event_Border_Hide             E_Event_Border_Hide;
 typedef struct _E_Event_Border_Simple        E_Event_Border_Iconify;
 typedef struct _E_Event_Border_Simple        E_Event_Border_Uniconify;
 typedef struct _E_Event_Border_Simple        E_Event_Border_Stick;
@@ -170,12 +170,10 @@ struct _E_Border
       } down;
    } moveinfo;
 
-   Ecore_X_Window win;
    int            x, y, w, h;
    int            ref;
    E_Zone        *zone;
    E_Desk        *desk;
-   Eina_List     *handlers;
 
    struct
    {
@@ -190,26 +188,22 @@ struct _E_Border
    struct
    {
       int l, r, t, b;
+      Eina_Bool calc : 1; // inset has been calculated
    } client_inset;
 
    E_Comp_Win   *cw;
-   Ecore_Evas    *bg_ecore_evas;
-   Evas          *bg_evas;
-   Ecore_X_Window bg_win;
+   Ecore_X_Window win;
    Evas_Object   *bg_object;
    Evas_Object   *icon_object;
-   Ecore_X_Window event_win;
    Eina_Stringshare  *internal_icon;
    Eina_Stringshare  *internal_icon_key;
-   Eina_Bool      bg_evas_in : 1;
 
    struct
    {
-      Ecore_X_Window shell_win;
       Ecore_X_Window lock_win;
       Ecore_X_Window win;
 
-      int            x, y, w, h;
+      int            w, h;
 
       struct
       {
@@ -516,7 +510,6 @@ struct _E_Border
    unsigned int       iconic : 1;
    unsigned int       deskshow : 1;
    unsigned int       sticky : 1;
-   unsigned int       shaped : 1;
    unsigned int       shaped_input : 1;
    unsigned int       need_shape_merge : 1;
    unsigned int       need_shape_export : 1;
@@ -566,6 +559,7 @@ struct _E_Border
    unsigned int       internal_no_remember : 1;
    unsigned int       internal_no_reopen : 1;
    unsigned int       stolen : 1;
+   Eina_Bool          theme_shadow : 1;
 
    Ecore_Evas        *internal_ecore_evas;
 
@@ -659,7 +653,6 @@ struct _E_Border
    Eina_List                 *transients;
 
    Efreet_Desktop            *desktop;
-   E_Pointer                 *pointer;
 
    unsigned char              comp_hidden   : 1;
 
@@ -692,6 +685,12 @@ struct _E_Border_Hook
    unsigned char       delete_me : 1;
 };
 
+struct _E_Event_Border_Hide
+{
+   E_Border *border;
+   int manage;
+};
+
 struct _E_Event_Border_Simple
 {
    E_Border *border;
@@ -762,7 +761,6 @@ EAPI void           e_border_pinned_set(E_Border *bd, int set);
 
 EAPI E_Border      *e_border_find_by_client_window(Ecore_X_Window win);
 EAPI E_Border      *e_border_find_all_by_client_window(Ecore_X_Window win);
-EAPI E_Border      *e_border_find_by_frame_window(Ecore_X_Window win);
 EAPI E_Border      *e_border_find_by_window(Ecore_X_Window win);
 EAPI E_Border      *e_border_find_by_alarm(Ecore_X_Sync_Alarm alarm);
 EAPI E_Border      *e_border_focused_get(void);
@@ -844,5 +842,12 @@ extern EAPI int E_EVENT_BORDER_PROPERTY;
 extern EAPI int E_EVENT_BORDER_FULLSCREEN;
 extern EAPI int E_EVENT_BORDER_UNFULLSCREEN;
 
+/* macro for finding misuse of changed flag */
+#if 0
+# define BD_CHANGED(BD) BD->changed = 1; INF("%s:%d - BD CHANGED: %p", __FILE__, __LINE__, BD)
+#else
+# define BD_CHANGED(BD) BD->changed = 1
+#endif
+
 #endif
 #endif
index e2b9ce0..ca72ab7 100644 (file)
@@ -81,6 +81,7 @@ static int _e_comp_log_dom = -1;
 #define CRI(f, x ...)
 #endif
 
+static Eina_Bool _e_comp_win_do_shadow(E_Comp_Win *cw);
 static void _e_comp_win_ready_timeout_setup(E_Comp_Win *cw);
 static void _e_comp_render_queue(E_Comp *c);
 static void _e_comp_win_damage(E_Comp_Win *cw, int x, int y, int w, int h, Eina_Bool dmg);
@@ -201,9 +202,10 @@ _e_comp_fullscreen_check(E_Comp *c)
      {
         if ((!cw->visible) || (cw->input_only) || (cw->invalid) || (cw->real_obj))
           continue;
+        if (!cw->bd) continue;
         if ((cw->x == 0) && (cw->y == 0) &&
-            ((cw->x + cw->w) >= c->man->w) &&
-            ((cw->y + cw->h) >= c->man->h) &&
+            ((cw->bd->client.w) >= c->man->w) &&
+            ((cw->bd->client.h) >= c->man->h) &&
             (!cw->argb) && (!cw->shaped) && (!cw->bg_win)
             )
           {
@@ -455,10 +457,11 @@ _e_comp_win_restack(E_Comp_Win *cw)
      }
    EINA_LIST_FOREACH(cw->stack_below, l, cwp)
      {
-        e_layout_child_lower_below(cwp->shobj, cw->shobj);
+        e_layout_child_lower_below(cwp->effect_obj, cw->effect_obj);
         cw->c->wins = eina_inlist_remove(cw->c->wins, EINA_INLIST_GET(cwp));
-        cw->c->wins = eina_inlist_prepend_relative(cw->c->wins, EINA_INLIST_GET(cwp), EINA_INLIST_GET(cw));        
+        cw->c->wins = eina_inlist_prepend_relative(cw->c->wins, EINA_INLIST_GET(cwp), EINA_INLIST_GET(cw));
      }
+   _e_comp_shapes_update(cw->c, NULL, E_CONTAINER_SHAPE_MOVE);
 }
 
 static void
@@ -466,12 +469,16 @@ _e_comp_win_geometry_update(E_Comp_Win *cw)
 {
    int x, y, w, h;
 
-   if (cw->visible)
+   if (cw->bd)
+     x = cw->bd->x, y = cw->bd->y;
+   else if (cw->visible)
      x = cw->x, y = cw->y;
    else
      x = cw->hidden.x, y = cw->hidden.y;
    if (cw->real_obj)
      w = cw->w, h = cw->h;
+   else if (cw->bd)
+     w = cw->bd->w, h = cw->bd->h;
    else
      w = cw->pw, h = cw->ph;
    if (cw->not_in_layout)
@@ -865,10 +872,10 @@ _e_comp_win_update(E_Comp_Win *cw)
      {
         if (pshaped != cw->shaped)
           {
-             if (cw->shaped)
-               edje_object_signal_emit(cw->shobj, "e,state,shadow,off", "e");
-             else
+             if (_e_comp_win_do_shadow(cw))
                edje_object_signal_emit(cw->shobj, "e,state,shadow,on", "e");
+             else
+               edje_object_signal_emit(cw->shobj, "e,state,shadow,off", "e");
           }
      }
 
@@ -1006,6 +1013,7 @@ _e_comp_win_adopt(E_Comp_Win *cw)
         cw->c->updates = eina_list_append(cw->c->updates, cw);
      }
    cw->redirected = 1;
+   if (cw->bd) e_comp_win_reshadow(cw);
    e_comp_render_update_resize(cw->up, cw->pw, cw->ph);
    e_comp_render_update_add(cw->up, 0, 0, cw->pw, cw->ph);
    _e_comp_win_damage(cw, 0, 0, cw->w, cw->h, 0);
@@ -1442,6 +1450,7 @@ static Eina_Bool
 _e_comp_win_do_shadow(E_Comp_Win *cw)
 {
    if (cw->shaped) return 0;
+   if (cw->bd && cw->bd->theme_shadow) return 0;
    if (cw->real_obj)
      {
         return ((!!cw->pop) || (!!cw->menu));
@@ -1812,17 +1821,16 @@ _e_comp_win_shadow_setup(E_Comp_Win *cw)
           }
         break;
      }
-   if (reshadow) return;
-   edje_object_part_swallow(cw->shobj, "e.swallow.content", cw->obj);
-   if (cw->bd && cw->bd->client.e.state.video)
-     edje_object_signal_emit(cw->shobj, "e,state,shadow,off", "e");
-   else
+   if (reshadow)
      {
-        if (_e_comp_win_do_shadow(cw) && (!no_shadow))
-          edje_object_signal_emit(cw->shobj, "e,state,shadow,on", "e");
-        else
-          edje_object_signal_emit(cw->shobj, "e,state,shadow,off", "e");
+        if (!cw->bd) return;
+        if (cw->bd->bg_object && (edje_object_part_swallow_get(cw->shobj, "e.swallow.content") == cw->bd->bg_object))
+          return;
      }
+   if (_e_comp_win_do_shadow(cw) && (!no_shadow))
+     edje_object_signal_emit(cw->shobj, "e,state,shadow,on", "e");
+   else
+     edje_object_signal_emit(cw->shobj, "e,state,shadow,off", "e");
 
    if (cw->bd)
      {
@@ -1835,13 +1843,24 @@ _e_comp_win_shadow_setup(E_Comp_Win *cw)
         else
           edje_object_signal_emit(cw->shobj, "e,state,urgent,off", "e");
      }
-   if (!cw->visible)
+   if (cw->visible)
+     edje_object_signal_emit(cw->shobj, "e,state,visible,on", "e");
+   else
+     edje_object_signal_emit(cw->shobj, "e,state,visible,off", "e");
+
+   if (cw->bd && cw->bd->bg_object)
      {
-        edje_object_signal_emit(cw->shobj, "e,state,visible,off", "e");
-        return;
+        edje_object_part_swallow(cw->bd->bg_object, "e.swallow.client", cw->obj);
+        edje_object_part_swallow(cw->shobj, "e.swallow.content", cw->bd->bg_object);
+        no_shadow = 1;
+     }
+   else
+     {
+        edje_object_part_swallow(cw->shobj, "e.swallow.content", cw->obj);
+        if (cw->bd) no_shadow = 1;
      }
 
-   edje_object_signal_emit(cw->shobj, "e,state,visible,on", "e");
+   if (!cw->visible) return;
 
    if (!cw->animating)
      {
@@ -2014,11 +2033,31 @@ _e_comp_win_dummy_add(E_Comp *c, Evas_Object *obj, E_Object *eobj, Eina_Bool nol
    return cw;
 }
 
+static void
+_e_comp_win_bd_setup(E_Comp_Win *cw, E_Border *bd)
+{
+   cw->bd = bd;
+   eina_hash_add(borders, e_util_winid_str_get(cw->bd->client.win), cw);
+   cw->dfn = e_object_delfn_add(E_OBJECT(cw->bd), _e_comp_object_del, cw);
+   cw->shape = cw->bd->shape;
+   cw->bd->cw = cw;
+   cw->opacity = cw->bd->client.netwm.opacity;
+   cw->eobj = E_OBJECT(cw->bd);
+   e_object_ref(cw->eobj);
+   // setup on show
+   // _e_comp_win_sync_setup(cw, cw->bd->client.win);
+   cw->input_only = cw->bd->client.initial_attributes.input_only;
+   cw->override = cw->bd->client.initial_attributes.override;
+   cw->vis = cw->bd->client.initial_attributes.visual;
+   cw->cmap = cw->bd->client.initial_attributes.colormap;
+   cw->depth = cw->bd->client.initial_attributes.depth;
+}
+
 static E_Comp_Win *
-_e_comp_win_add(E_Comp *c, Ecore_X_Window win)
+_e_comp_win_add(E_Comp *c, Ecore_X_Window win, E_Border *bd)
 {
-   Ecore_X_Window_Attributes att;
    E_Comp_Win *cw;
+   int w, h;
 
    cw = calloc(1, sizeof(E_Comp_Win));
    if (!cw) return NULL;
@@ -2026,42 +2065,42 @@ _e_comp_win_add(E_Comp *c, Ecore_X_Window win)
    cw->c = c;
    cw->real_hid = 1;
    cw->opacity = 255.0;
-   cw->bd = e_border_find_by_window(cw->win);
    if (conf->grab) ecore_x_grab();
-   if (cw->bd)
+   if (bd)
      {
-        eina_hash_add(borders, e_util_winid_str_get(cw->bd->client.win), cw);
-        cw->dfn = e_object_delfn_add(E_OBJECT(cw->bd), _e_comp_object_del, cw);
-        cw->shape = cw->bd->shape;
-        cw->bd->cw = cw;
-        cw->opacity = cw->bd->client.netwm.opacity;
-        // setup on show
-        // _e_comp_win_sync_setup(cw, cw->bd->client.win);
+        _e_comp_win_bd_setup(cw, bd);
+        w = cw->bd->client.w, h = cw->bd->client.h;
      }
-   /* popups handled in _dummy_add */
-   /* menus handled in _dummy_add */
-   // fixme: could use bd/pop/menu for this too
-   memset((&att), 0, sizeof(Ecore_X_Window_Attributes));
-   if (!ecore_x_window_attributes_get(cw->win, &att))
-     {
-        free(cw->name);
-        free(cw->clas);
-        free(cw->role);
-        free(cw);
-        if (conf->grab) ecore_x_ungrab();
-        return NULL;
-     }
-   if ((!att.input_only) &&
-       ((att.depth != 24) && (att.depth != 32)))
+   else
      {
-        //        printf("WARNING: window 0x%x not 24/32bpp -> %ibpp", cw->win, att.depth);
-        //        cw->invalid = 1;
+        Ecore_X_Window_Attributes att;
+
+        memset((&att), 0, sizeof(Ecore_X_Window_Attributes));
+        if (!ecore_x_window_attributes_get(cw->win, &att))
+          {
+             free(cw->name);
+             free(cw->clas);
+             free(cw->role);
+             free(cw);
+             if (conf->grab) ecore_x_ungrab();
+             return NULL;
+          }
+        if ((!att.input_only) &&
+            ((att.depth != 24) && (att.depth != 32)))
+          {
+             //        printf("WARNING: window 0x%x not 24/32bpp -> %ibpp", cw->win, att.depth);
+             //        cw->invalid = 1;
+          }
+        cw->input_only = att.input_only;
+        cw->override = att.override;
+        cw->vis = att.visual;
+        cw->cmap = att.colormap;
+        cw->depth = att.depth;
+        w = att.w, h = att.h;
+
+        if (cw->override && !(att.event_mask.mine & ECORE_X_EVENT_MASK_WINDOW_PROPERTY))
+          ecore_x_event_mask_set(cw->win, ECORE_X_EVENT_MASK_WINDOW_PROPERTY);
      }
-   cw->input_only = att.input_only;
-   cw->override = att.override;
-   cw->vis = att.visual;
-   cw->cmap = att.colormap;
-   cw->depth = att.depth;
    if ((!cw->bd) && (!cw->menu) && (!cw->input_only))
      {
         char *netwm_title = NULL;
@@ -2093,7 +2132,10 @@ _e_comp_win_add(E_Comp *c, Ecore_X_Window win)
         //        cw->show_ready = 1;
      }
 
-   cw->argb = ecore_x_window_argb_get(cw->win);
+   if (cw->bd)
+     cw->argb = cw->bd->client.argb;
+   else
+     cw->argb = ecore_x_window_argb_get(cw->win);
    eina_hash_add(windows, e_util_winid_str_get(cw->win), cw);
    cw->inhash = 1;
    if ((!cw->input_only) && (!cw->invalid))
@@ -2110,9 +2152,6 @@ _e_comp_win_add(E_Comp *c, Ecore_X_Window win)
         if (cw->argb) evas_object_image_alpha_set(cw->obj, 1);
         else evas_object_image_alpha_set(cw->obj, 0);
 
-        if (cw->override && !(att.event_mask.mine & ECORE_X_EVENT_MASK_WINDOW_PROPERTY))
-          ecore_x_event_mask_set(cw->win, ECORE_X_EVENT_MASK_WINDOW_PROPERTY);
-
         _e_comp_win_shadow_setup(cw);
 
         edje_object_signal_callback_add(cw->shobj, "e,action,show,done", "e", _e_comp_show_done, cw);
@@ -2129,9 +2168,9 @@ _e_comp_win_add(E_Comp *c, Ecore_X_Window win)
 
              for (i = 0; i < num; i++)
                E_RECTS_CLIP_TO_RECT(rects[i].x, rects[i].y,
-                                    rects[i].width, rects[i].height, 0, 0, (int)att.w, (int)att.h);
+                                    rects[i].width, rects[i].height, 0, 0, w, h);
 
-             if (_e_comp_shaped_check(att.w, att.h, rects, num))
+             if (_e_comp_shaped_check(w, h, rects, num))
                cw->shape_changed = 1;
 
              free(rects);
@@ -2155,7 +2194,6 @@ _e_comp_win_add(E_Comp *c, Ecore_X_Window win)
         else
           evas_object_name_set(cw->shobj, "cw->shobj::WINDOW");
 
-        evas_object_pass_events_set(cw->obj, 1);
         evas_object_name_set(cw->obj, "cw->obj");
 
         cw->pending_count++;
@@ -2168,7 +2206,6 @@ _e_comp_win_add(E_Comp *c, Ecore_X_Window win)
 
         evas_object_color_set(cw->shobj, 0, 0, 0, 0);
      }
-   evas_object_pass_events_set(cw->shobj, 1);
    evas_object_data_set(cw->shobj, "win", (void *)((unsigned long)cw->win));
    evas_object_data_set(cw->shobj, "comp_win", cw);
 
@@ -2197,7 +2234,7 @@ _e_comp_win_del(E_Comp_Win *cw)
 {
    Evas_Object *o;
 
-   if (cw->real_obj && cw->eobj)
+   if (cw->eobj)
      {
         e_object_unref(E_OBJECT(cw->eobj));
         cw->eobj = NULL;
@@ -2740,7 +2777,7 @@ _e_comp_win_configure(E_Comp_Win *cw, int x, int y, int w, int h, int border)
    /* need to block move/resize of the edje for real objects so the external object doesn't
     * accidentally get shown and block our show callback
     */
-   if ((moved || resized) && ((!cw->real_obj) || cw->visible)) _e_comp_win_geometry_update(cw);
+   if ((cw->real_obj && cw->visible) || moved || resized) _e_comp_win_geometry_update(cw);
    // add pending manager comp event count to match below config send
    cw->pending_count++;
    _e_comp_event_source_configure(cw);
@@ -2810,17 +2847,18 @@ _e_comp_create(void *data EINA_UNUSED, int type EINA_UNUSED, void *event)
 {
    Ecore_X_Event_Window_Create *ev = event;
    E_Comp_Win *cw;
-   E_Comp *c = _e_comp_find(ev->parent);
+   E_Comp *c;
+
+   c = _e_comp_find(ev->parent);
    if (!c) return ECORE_CALLBACK_PASS_ON;
    if (_e_comp_win_find(ev->win)) return ECORE_CALLBACK_PASS_ON;
    if (c->win == ev->win) return ECORE_CALLBACK_PASS_ON;
    if (c->ee_win == ev->win) return ECORE_CALLBACK_PASS_ON;
    if (c->man->root == ev->win) return ECORE_CALLBACK_PASS_ON;
    if (_e_comp_ignore_find(ev->win)) return ECORE_CALLBACK_PASS_ON;
-   cw = _e_comp_win_add(c, ev->win);
+   cw = _e_comp_win_add(c, ev->win, NULL);
    if (!cw) return ECORE_CALLBACK_RENEW;
    _e_comp_win_configure(cw, ev->x, ev->y, ev->w, ev->h, ev->border);
-   
    if (cw->free_shape)
      {
         Eina_List *l;
@@ -3282,9 +3320,70 @@ static Eina_Bool
 _e_comp_bd_add(void *data EINA_UNUSED, int type EINA_UNUSED, void *event)
 {
    E_Event_Border_Add *ev = event;
-   E_Comp_Win *cw = _e_comp_win_find(ev->border->win);
-   if (!cw) return ECORE_CALLBACK_PASS_ON;
-   // fimxe: add/enable compositing here not in show event for borders
+   E_Comp_Win *cw;
+   E_Container *con;
+   int x;
+
+   cw = ev->border->cw;
+   if (!cw)
+     {
+        cw = _e_comp_win_find(ev->border->win);
+        if (cw)
+          {
+             _e_comp_win_bd_setup(cw, ev->border);
+             evas_object_data_set(cw->shobj, "border", cw->bd);
+             evas_object_data_set(cw->effect_obj, "border", cw->bd);
+             evas_object_name_set(cw->shobj, "cw->shobj::BORDER");
+             evas_object_name_set(cw->effect_obj, "cw->effect_obj::BORDER");
+             e_comp_win_reshadow(cw);
+          }
+        else
+          cw = _e_comp_win_add(e_comp_get(ev->border), ev->border->win, ev->border);
+     }
+   _e_comp_win_configure(cw, ev->border->x, ev->border->y,
+                         ev->border->w, ev->border->h,
+                         ev->border->client.initial_attributes.border);
+   if (cw->shape) cw->shape->comp_win = cw;
+   con = cw->bd->zone->container;
+   /* we previously ignored potential stacking requests before the border setup,
+    * so we have to manually stack it here */
+   for (x = 0; x < E_CONTAINER_LAYER_COUNT; x++)
+     {
+        Eina_List *l;
+        E_Border *bd;
+        E_Comp_Win *cw2;
+
+        if (!con->layers[x].clients) continue;
+        l = eina_list_data_find_list(con->layers[x].clients, cw->bd);
+        if (!l) continue;
+        if (l->prev)
+          {
+             bd = eina_list_data_get(l->prev);
+             cw2 = _e_comp_win_find(bd->win);
+             if (cw2)
+               {
+                  _e_comp_win_raise_above(cw, cw2);
+                  break;
+               }
+          }
+        if (l->next)
+          {
+             bd = eina_list_data_get(l->next);
+             cw2 = _e_comp_win_find(bd->win);
+             if (cw2)
+               {
+                  _e_comp_win_lower_below(cw, cw2);
+                  break;
+               }
+          }
+        cw2 = _e_comp_win_find(con->layers[x].win);
+        if (cw2) _e_comp_win_raise_above(cw, cw2);
+        break;
+     }
+   //if (cw->bd->visible)
+     //{
+        //_e_comp_win_show(cw);
+     //}
    return ECORE_CALLBACK_PASS_ON;
 }
 
@@ -3293,8 +3392,7 @@ _e_comp_bd_del(void *data EINA_UNUSED, int type EINA_UNUSED, void *event)
 {
    E_Event_Border_Remove *ev = event;
    E_Comp_Win *cw = _e_comp_win_find(ev->border->win);
-   if (!cw) return ECORE_CALLBACK_PASS_ON;
-   if (cw->bd == ev->border) _e_comp_object_del(cw, ev->border);
+   if (cw) e_comp_win_del(cw);
    return ECORE_CALLBACK_PASS_ON;
 }
 
@@ -3303,9 +3401,7 @@ _e_comp_bd_show(void *data EINA_UNUSED, int type EINA_UNUSED, void *event)
 {
    E_Event_Border_Show *ev = event;
    E_Comp_Win *cw = _e_comp_win_find(ev->border->win);
-   if (!cw) return ECORE_CALLBACK_PASS_ON;
-   if (cw->visible) return ECORE_CALLBACK_PASS_ON;
-   _e_comp_win_show(cw);
+   if (cw) _e_comp_win_show(cw);
    return ECORE_CALLBACK_PASS_ON;
 }
 
@@ -3313,10 +3409,9 @@ static Eina_Bool
 _e_comp_bd_hide(void *data EINA_UNUSED, int type EINA_UNUSED, void *event)
 {
    E_Event_Border_Hide *ev = event;
+   if (ev->manage == 2) return ECORE_CALLBACK_RENEW; //desk hide
    E_Comp_Win *cw = _e_comp_win_find(ev->border->win);
-   if (!cw) return ECORE_CALLBACK_PASS_ON;
-   if (!cw->visible) return ECORE_CALLBACK_PASS_ON;
-   _e_comp_win_hide(cw);
+   if (cw) _e_comp_win_hide(cw);
    return ECORE_CALLBACK_PASS_ON;
 }
 
@@ -3403,39 +3498,15 @@ _e_comp_bd_property(void *data EINA_UNUSED, int type EINA_UNUSED, void *event)
    return ECORE_CALLBACK_PASS_ON;
 }
 
-static void
-_e_comp_reshadow(E_Comp_Win *cw)
-{
-   if (cw->visible) evas_object_hide(cw->shobj);
-   _e_comp_win_shadow_setup(cw);
-   //   evas_object_move(cw->shobj, cw->x, cw->y);
-   //   evas_object_resize(cw->shobj, cw->pw, cw->ph);
-   _e_comp_win_geometry_update(cw);
-   if (cw->visible)
-     {
-        evas_object_show(cw->shobj);
-        if (cw->show_ready)
-          {
-             cw->defer_hide = 0;
-             if (!cw->hidden_override) _e_comp_child_show(cw);
-             edje_object_signal_emit(cw->shobj, "e,state,visible,on", "e");
-             if (!cw->animating)
-               {
-                  cw->c->animating++;
-               }
-             cw->animating = 1;
-             _e_comp_win_render_queue(cw);
-          }
-     }
-}
-
 static Eina_Bool
 _e_comp_bd_fullscreen(void *data EINA_UNUSED, int type EINA_UNUSED, void *event)
 {
    E_Event_Border_Property *ev = event;
    E_Comp_Win *cw = _e_comp_win_find(ev->border->win);
    if (!cw) return ECORE_CALLBACK_PASS_ON;
-   _e_comp_reshadow(cw);
+   e_comp_win_reshadow(cw);
+   /* bd->bg_object deletion pending */
+   edje_object_part_swallow(cw->shobj, "e.swallow.content", cw->obj);
    return ECORE_CALLBACK_PASS_ON;
 }
 
@@ -3445,7 +3516,7 @@ _e_comp_bd_unfullscreen(void *data EINA_UNUSED, int type EINA_UNUSED, void *even
    E_Event_Border_Property *ev = event;
    E_Comp_Win *cw = _e_comp_win_find(ev->border->win);
    if (!cw) return ECORE_CALLBACK_PASS_ON;
-   _e_comp_reshadow(cw);
+   e_comp_win_reshadow(cw);
    return ECORE_CALLBACK_PASS_ON;
 }
 
@@ -3610,7 +3681,7 @@ _e_comp_shapes_update_comp_win_shape_comp_helper(E_Comp_Win *cw, Eina_Tiler *tb)
     * propagated to the comp_win :/
     */
    if (cw->bd)
-     x = cw->bd->x, y = cw->bd->y, w = cw->bd->w, h = cw->bd->h;
+     x = cw->bd->x + cw->bd->client_inset.l, y = cw->bd->y + cw->bd->client_inset.t, w = cw->bd->client.w, h = cw->bd->client.h;
    else if (cw->pop)
      x = cw->pop->x + cw->pop->zone->x, y = cw->pop->y + cw->pop->zone->y, w = cw->pop->w, h = cw->pop->h;
    //else if (cw->menu)
@@ -3634,8 +3705,24 @@ _e_comp_shapes_update_comp_win_shape_comp_helper(E_Comp_Win *cw, Eina_Tiler *tb)
      }
    else
      {
-        eina_tiler_rect_del(tb, &(Eina_Rectangle){x, y, w, h});
-        SHAPE_INF("DEL: %d,%d@%dx%d", x, y, w, h);
+        if (cw->bd)
+          {
+             /* add the frame */
+             eina_tiler_rect_add(tb, &(Eina_Rectangle){cw->bd->x, cw->bd->y, cw->bd->w, cw->bd->h});
+             SHAPE_INF("ADD: %d,%d@%dx%d", cw->bd->x, cw->bd->y, cw->bd->w, cw->bd->h);
+
+             if (!cw->bd->shaded)
+               {
+                  /* delete the client if not shaded */
+                  eina_tiler_rect_del(tb, &(Eina_Rectangle){x, y, w, h});
+                  SHAPE_INF("DEL: %d,%d@%dx%d", x, y, w, h);
+               }
+          }
+        else
+          {
+             eina_tiler_rect_del(tb, &(Eina_Rectangle){x, y, w, h});
+             SHAPE_INF("DEL: %d,%d@%dx%d", x, y, w, h);
+          }
      }
 }
 
@@ -3780,8 +3867,8 @@ _e_comp_shapes_update(void *data, E_Container_Shape *es, E_Container_Shape_Chang
               */
              if (!es->visible) return;
           }
+        SHAPE_INF("RESHAPE %u: %s", es->comp_win->win, change_text[change]);
      }
-   SHAPE_INF("RESHAPE %u: %s", es->comp_win->win, change_text[change]);
    if (!c->shape_job) c->shape_job = ecore_job_add((Ecore_Cb)_e_comp_shapes_update_job, c);
 }
 
@@ -3881,7 +3968,10 @@ _e_comp_populate(E_Comp *c)
         free(wname);
         free(wclass);
         wname = wclass = NULL;
-        cw = _e_comp_win_add(c, wins[i]);
+        if (e_comp_win_find(wins[i]) ||
+            e_comp_win_find_client_win(wins[i]) ||
+            e_border_find_by_client_window(wins[i])) continue;
+        cw = _e_comp_win_add(c, wins[i], NULL);
         if (!cw) continue;
         ecore_x_window_geometry_get(cw->win, &x, &y, &w, &h);
         border = ecore_x_window_border_width_get(cw->win);
@@ -3903,7 +3993,7 @@ _e_comp_populate(E_Comp *c)
              e_container_shape_move(cw->shape, x, y);
              e_container_shape_resize(cw->shape, w, h);
           }
-        if (ecore_x_window_visible_get(wins[i]))
+        if ((!cw->bd) && (ecore_x_window_visible_get(wins[i])))
           _e_comp_win_show(cw);
      }
    free(wins);
@@ -4038,6 +4128,7 @@ _e_comp_add(E_Manager *man)
    ecore_evas_show(c->ee);
 
    c->ee_win = ecore_evas_window_get(c->ee);
+   c->pointer = e_pointer_window_new(c->ee_win, 0);
    ecore_x_composite_redirect_subwindows
      (c->man->root, ECORE_X_COMPOSITE_UPDATE_MANUAL);
 
@@ -4059,8 +4150,7 @@ _e_comp_del(E_Comp *c)
 {
    E_Comp_Win *cw;
    E_Comp_Zone *cz;
-   Eina_List *l, *hide_bd = NULL;
-   E_Border *bd;
+   Eina_List *l;
    E_Container *con;
 
    c->man->comp = NULL;
@@ -4068,15 +4158,11 @@ _e_comp_del(E_Comp *c)
    edje_freeze();
    EINA_LIST_FOREACH(c->man->containers, l, con)
      e_container_shape_change_callback_del(con, _e_comp_shapes_update, c);
-   EINA_LIST_FOREACH(e_border_client_list(), l, bd)
-     {
-        if (!bd->visible)
-          hide_bd = eina_list_append(hide_bd, bd);
-     }
 
    E_FREE_FUNC(c->fps_fg, evas_object_del);
    E_FREE_FUNC(c->fps_bg, evas_object_del);
    E_FREE_FUNC(c->shape_job, ecore_job_del);
+   E_FREE_FUNC(c->pointer, e_object_del);
 
    ecore_x_window_key_ungrab(c->man->root, "F", ECORE_EVENT_MODIFIER_SHIFT |
                              ECORE_EVENT_MODIFIER_CTRL |
@@ -4137,12 +4223,6 @@ _e_comp_del(E_Comp *c)
    ecore_x_e_comp_sync_supported_set(c->man->root, 0);
    ecore_x_screen_is_composited_set(c->man->num, 0);
 
-   EINA_LIST_FREE(hide_bd, bd)
-     {
-        e_border_show(bd);
-        e_border_hide(bd, 1);
-     }
-
    free(c);
 }
 
@@ -4880,6 +4960,32 @@ e_comp_win_hidden_set(E_Comp_Win *cw, Eina_Bool hidden)
      }
 }
 
+EAPI void
+e_comp_win_reshadow(E_Comp_Win *cw)
+{
+   if (cw->visible) evas_object_hide(cw->effect_obj);
+   _e_comp_win_shadow_setup(cw);
+   //   evas_object_move(cw->effect_obj, cw->x, cw->y);
+   //   evas_object_resize(cw->effect_obj, cw->pw, cw->ph);
+   _e_comp_win_geometry_update(cw);
+   if (cw->visible)
+     {
+        evas_object_show(cw->effect_obj);
+        if (cw->show_ready)
+          {
+             cw->defer_hide = 0;
+             if (!cw->hidden_override) _e_comp_child_show(cw);
+             edje_object_signal_emit(cw->shobj, "e,state,visible,on", "e");
+             if (!cw->animating)
+               {
+                  cw->c->animating++;
+               }
+             cw->animating = 1;
+             _e_comp_win_render_queue(cw);
+          }
+     }
+}
+
 EAPI E_Comp *
 e_comp_get(void *o)
 {
@@ -5168,7 +5274,7 @@ e_comp_win_show(E_Comp_Win *cw)
    _e_comp_win_show(cw);
 }
 
-EAPI void
+EAPI E_Comp_Win *
 e_comp_canvas_layer_set(Evas_Object *obj, E_Comp_Canvas_Layer comp_layer, E_Layer layer, E_Comp_Canvas_Stack stack)
 {
    E_Comp_Win *cw;
@@ -5188,6 +5294,7 @@ e_comp_canvas_layer_set(Evas_Object *obj, E_Comp_Canvas_Layer comp_layer, E_Laye
      _e_comp_win_raise(cw);
    else if (stack == E_COMP_CANVAS_STACK_UNDER)
      _e_comp_win_lower(cw);
+   return cw;
 }
 
 EAPI void
@@ -5195,10 +5302,11 @@ e_comp_util_wins_print(const E_Comp *c)
 {
    E_Comp_Win *cw;
 
+   if (!c) c = e_comp_get(NULL);
    EINA_INLIST_FOREACH(c->wins, cw)
      {
         if (cw->bd)
-          fprintf(stderr, "COMP BD: %p - %s\n", cw, cw->bd->client.icccm.name);
+          fprintf(stderr, "COMP BD:  %p - %u '%s:%s'\n", cw, cw->win, cw->bd->client.icccm.name, cw->bd->client.icccm.class);
         else if (cw->pop)
           fprintf(stderr, "COMP POP: %p - %s\n", cw, cw->pop->name);
         else if (cw->menu)
@@ -5297,7 +5405,6 @@ e_comp_block_window_del(void)
      }
 }
 
-
 EAPI unsigned int
 e_comp_e_object_layer_get(const E_Object *obj)
 {
index 808b915..b3d56b3 100644 (file)
@@ -56,6 +56,7 @@ struct _E_Comp
    Evas_Object    *layout;
    Eina_List      *zones;
    E_Manager      *man;
+   E_Pointer      *pointer;
 
    Eina_List *debug_rects;
    Eina_List *ignore_wins;
@@ -248,6 +249,7 @@ EAPI void e_comp_win_moveresize(E_Comp_Win *cw, Evas_Coord x, Evas_Coord y, int
 EAPI void e_comp_win_hide(E_Comp_Win *cw);
 EAPI void e_comp_win_show(E_Comp_Win *cw);
 EAPI void e_comp_win_del(E_Comp_Win *cw);
+EAPI void e_comp_win_reshadow(E_Comp_Win *cw);
 
 EAPI void e_comp_ignore_win_add(Ecore_X_Window win);
 
@@ -258,7 +260,7 @@ EAPI void e_comp_ignore_win_add(Ecore_X_Window win);
 #define E_LAYER_LAYOUT_ADD_UNDER(obj, layer) e_comp_canvas_layer_set(obj, E_COMP_CANVAS_LAYER_LAYOUT, layer, E_COMP_CANVAS_STACK_UNDER)
 #define E_LAYER_LAYOUT_ADD_ABOVE(obj, layer) e_comp_canvas_layer_set(obj, E_COMP_CANVAS_LAYER_LAYOUT, layer, E_COMP_CANVAS_STACK_ABOVE)
 
-EAPI void e_comp_canvas_layer_set(Evas_Object *obj, E_Comp_Canvas_Layer comp_layer, E_Layer layer, E_Comp_Canvas_Stack stack);
+EAPI E_Comp_Win *e_comp_canvas_layer_set(Evas_Object *obj, E_Comp_Canvas_Layer comp_layer, E_Layer layer, E_Comp_Canvas_Stack stack);
 EAPI unsigned int e_comp_e_object_layer_get(const E_Object *obj);
 
 static inline E_Comp *
index e676efa..724d2da 100644 (file)
@@ -907,7 +907,7 @@ _e_container_cb_mouse_in(E_Container *con EINA_UNUSED, Evas *e EINA_UNUSED, Evas
    E_Border *bd;
 
    bd = e_border_focused_get();
-   if (bd) e_focus_event_mouse_out(bd);
+   if (bd && (!bd->border_menu)) e_focus_event_mouse_out(bd);
 }
 
 static void
index a2ae088..4b9c272 100644 (file)
@@ -26,6 +26,8 @@ typedef void (*E_Container_Shape_Cb)(void *data, E_Container_Shape *es, E_Contai
 #define E_CONTAINER_TYPE (int) 0xE0b01003
 #define E_CONTAINER_SHAPE_TYPE (int) 0xE0b01004
 
+#define E_CONTAINER_LAYER_COUNT 12
+
 struct _E_Container
 {
    E_Object             e_obj_inherit;
@@ -52,7 +54,7 @@ struct _E_Container
    struct {
       Ecore_X_Window win;
       Eina_List *clients; /* E_Border */
-   } layers[12];
+   } layers[E_CONTAINER_LAYER_COUNT];
 
    Ecore_X_Window       scratch_win;
 };
index 87e4e2e..bc77c79 100644 (file)
@@ -472,9 +472,9 @@ _e_desklock_popup_add(E_Zone *zone)
 
    evas_object_move(edp->bg_object, zone->x, zone->y);
    evas_object_resize(edp->bg_object, zone->w, zone->h);
+   evas_object_show(edp->bg_object);
    E_LAYER_SET_ABOVE(edp->bg_object, E_COMP_CANVAS_LAYER_DESKLOCK);
    evas_object_clip_set(edp->bg_object, edp->zone->bg_clip_object);
-   evas_object_show(edp->bg_object);
 
    _e_desklock_login_box_add(edp);
    evas_event_thaw(evas);
@@ -521,11 +521,11 @@ _e_desklock_login_box_add(E_Desklock_Popup_Data *edp)
         evas_object_move(edp->login_box,
                          zone->x + ((zone->w - mw) / 2),
                          zone->y + ((zone->h - mh) / 2));
+        evas_object_show(edp->login_box);
         E_LAYER_SET_ABOVE(edp->login_box, E_COMP_CANVAS_LAYER_DESKLOCK);
      }
 
    evas_object_clip_set(edp->login_box, edp->zone->bg_clip_object);
-   evas_object_show(edp->login_box);
 }
 
 static void
index 42e780d..99c3826 100644 (file)
@@ -664,9 +664,6 @@ _e_drag_win_get(const E_Drop_Handler *h, int xdnd)
              break;
 
            case E_BORDER_TYPE:
-             hwin = ((E_Border *)(h->obj))->event_win;
-             break;
-
            case E_ZONE_TYPE:
            case E_POPUP_TYPE:
              hwin = e_comp_get(h->obj)->ee_win;
index 64eec95..4fdba46 100644 (file)
@@ -566,13 +566,23 @@ _e_manager_cb_window_configure(void *data, int ev_type __UNUSED__, void *ev)
 static Eina_Bool
 _e_manager_cb_key_down(void *data, int ev_type __UNUSED__, void *ev)
 {
-   E_Manager *man;
-   Ecore_Event_Key *e;
-
-   man = data;
-   e = ev;
+   E_Manager *man = data;
+   Ecore_Event_Key *e = ev;
 
-   if (e->event_window != man->root) return ECORE_CALLBACK_PASS_ON;
+   if (e->event_window != man->root)
+     {
+        E_Border *bd;
+
+        bd = e_border_focused_get();
+        /* *block actions when no border is focused (probably something else did a grab here so we'll play nice)
+         * *block actions when border menu is up
+         * *block actions when event (grab) window isn't comp window
+         * *other cases?
+         */
+        if (!bd) return ECORE_CALLBACK_RENEW;
+        if ((bd->border_menu) || (e->event_window != e_comp_get(bd)->ee_win))
+          return ECORE_CALLBACK_PASS_ON;
+     }
    if (e->root_window != man->root) man = _e_manager_get_for_root(e->root_window);
    if (e_bindings_key_down_event_handle(E_BINDING_CONTEXT_MANAGER, E_OBJECT(man), ev))
      return ECORE_CALLBACK_DONE;
index e02a246..d101c64 100644 (file)
@@ -241,6 +241,97 @@ e_pointer_idler_before(void)
      }
 }
 
+
+EAPI void
+e_pointer_mode_push(void *obj, E_Pointer_Mode mode)
+{
+   switch (mode)
+     {
+      case E_POINTER_RESIZE_TL:
+        e_pointer_type_push(e_comp_get(obj)->pointer, obj, "resize_tl");
+        break;
+
+      case E_POINTER_RESIZE_T:
+        e_pointer_type_push(e_comp_get(obj)->pointer, obj, "resize_t");
+        break;
+
+      case E_POINTER_RESIZE_TR:
+        e_pointer_type_push(e_comp_get(obj)->pointer, obj, "resize_tr");
+        break;
+
+      case E_POINTER_RESIZE_R:
+        e_pointer_type_push(e_comp_get(obj)->pointer, obj, "resize_r");
+        break;
+
+      case E_POINTER_RESIZE_BR:
+        e_pointer_type_push(e_comp_get(obj)->pointer, obj, "resize_br");
+        break;
+
+      case E_POINTER_RESIZE_B:
+        e_pointer_type_push(e_comp_get(obj)->pointer, obj, "resize_b");
+        break;
+
+      case E_POINTER_RESIZE_BL:
+        e_pointer_type_push(e_comp_get(obj)->pointer, obj, "resize_bl");
+        break;
+
+      case E_POINTER_RESIZE_L:
+        e_pointer_type_push(e_comp_get(obj)->pointer, obj, "resize_l");
+        break;
+
+      case E_POINTER_MOVE:
+        e_pointer_type_push(e_comp_get(obj)->pointer, obj, "move");
+        break;
+
+      default: break;
+     }
+}
+
+EAPI void
+e_pointer_mode_pop(void *obj, E_Pointer_Mode mode)
+{
+   switch (mode)
+     {
+      case E_POINTER_RESIZE_TL:
+        e_pointer_type_pop(e_comp_get(obj)->pointer, obj, "resize_tl");
+        break;
+
+      case E_POINTER_RESIZE_T:
+        e_pointer_type_pop(e_comp_get(obj)->pointer, obj, "resize_t");
+        break;
+
+      case E_POINTER_RESIZE_TR:
+        e_pointer_type_pop(e_comp_get(obj)->pointer, obj, "resize_tr");
+        break;
+
+      case E_POINTER_RESIZE_R:
+        e_pointer_type_pop(e_comp_get(obj)->pointer, obj, "resize_r");
+        break;
+
+      case E_POINTER_RESIZE_BR:
+        e_pointer_type_pop(e_comp_get(obj)->pointer, obj, "resize_br");
+        break;
+
+      case E_POINTER_RESIZE_B:
+        e_pointer_type_pop(e_comp_get(obj)->pointer, obj, "resize_b");
+        break;
+
+      case E_POINTER_RESIZE_BL:
+        e_pointer_type_pop(e_comp_get(obj)->pointer, obj, "resize_bl");
+        break;
+
+      case E_POINTER_RESIZE_L:
+        e_pointer_type_pop(e_comp_get(obj)->pointer, obj, "resize_l");
+        break;
+
+      case E_POINTER_MOVE:
+        e_pointer_type_pop(e_comp_get(obj)->pointer, obj, "move");
+        break;
+
+      default: break;
+     }
+}
+
 /* local subsystem functions */
 static void
 _e_pointer_canvas_add(E_Pointer *p)
index c1fa50d..f96f6ba 100644 (file)
@@ -2,6 +2,22 @@
 
 typedef struct _E_Pointer E_Pointer;
 
+
+typedef enum
+{
+   /* These are compatible with netwm */
+   E_POINTER_RESIZE_TL = 0,
+   E_POINTER_RESIZE_T = 1,
+   E_POINTER_RESIZE_TR = 2,
+   E_POINTER_RESIZE_R = 3,
+   E_POINTER_RESIZE_BR = 4,
+   E_POINTER_RESIZE_B = 5,
+   E_POINTER_RESIZE_BL = 6,
+   E_POINTER_RESIZE_L = 7,
+   E_POINTER_MOVE = 8,
+   E_POINTER_RESIZE_NONE = 11
+} E_Pointer_Mode;
+
 #else
 #ifndef E_POINTER_H
 #define E_POINTER_H
@@ -45,5 +61,8 @@ EAPI void       e_pointer_type_pop(E_Pointer *p, void *obj, const char *type);
 EAPI void       e_pointers_size_set(int size);
 EAPI void       e_pointer_idler_before(void);
 
+EAPI void e_pointer_mode_push(void *obj, E_Pointer_Mode mode);
+EAPI void e_pointer_mode_pop(void *obj, E_Pointer_Mode mode);
+
 #endif
 #endif
index 0504596..ced6fcc 100644 (file)
@@ -244,6 +244,7 @@ e_shelf_zone_new(E_Zone *zone, const char *name, const char *style, int popup, E
    else
      {
         evas_object_move(es->o_base, es->zone->x + es->x, es->zone->y + es->y);
+        evas_object_show(es->o_base);
         E_LAYER_SET(es->o_base, layer);
      }
 
index da732b1..daf0c96 100644 (file)
@@ -2,7 +2,6 @@
 
 /* local subsystem functions */
 static void _e_win_free(E_Win *win);
-static void _e_win_del(void *obj);
 static void _e_win_prop_update(E_Win *win);
 static void _e_win_state_update(E_Win *win);
 static void _e_win_cb_move(Ecore_Evas *ee);
@@ -236,6 +235,17 @@ static const Elm_Win_Trap _elm_win_trap = {
 };
 #endif
 
+
+static void
+_e_win_hide(void *obj)
+{
+   E_Win *win = obj;
+
+   if (!win->border) return;
+   if (win->border->visible) e_border_hide(win->border, 1);
+   e_object_del(E_OBJECT(win->border));
+}
+
 /* externally accessible functions */
 EINTERN int
 e_win_init(void)
@@ -276,8 +286,7 @@ e_win_new(E_Container *con)
 
    win = E_OBJECT_ALLOC(E_Win, E_WIN_TYPE, _e_win_free);
    if (!win) return NULL;
-   e_object_del_func_set(E_OBJECT(win), _e_win_del);
-   e_object_delay_del_set(E_OBJECT(win), e_win_hide);
+   e_object_delay_del_set(E_OBJECT(win), _e_win_hide);
    win->container = con;
    win->ecore_evas = e_canvas_new(con->manager->root,
                                   0, 0, 1, 1, 1, 0,
@@ -682,27 +691,23 @@ _e_win_free(E_Win *win)
    if (win->pointer)
      e_object_del(E_OBJECT(win->pointer));
 
-   e_canvas_del(win->ecore_evas);
-   ecore_evas_free(win->ecore_evas);
    if (win->border)
      {
-        e_border_hide(win->border, 1);
-        e_object_del(E_OBJECT(win->border));
+        ecore_evas_callback_move_set(win->ecore_evas, NULL);
+        ecore_evas_callback_resize_set(win->ecore_evas, NULL);
+        ecore_evas_callback_delete_request_set(win->ecore_evas, NULL);
+        ecore_evas_callback_state_change_set(win->ecore_evas, NULL);
+     }
+   else
+     {
+        e_canvas_del(win->ecore_evas);
+        ecore_evas_free(win->ecore_evas);
      }
    wins = eina_list_remove(wins, win);
    free(win);
 }
 
 static void
-_e_win_del(void *obj)
-{
-   E_Win *win;
-
-   win = obj;
-   if (win->border) e_border_hide(win->border, 1);
-}
-
-static void
 _e_win_prop_update(E_Win *win)
 {
    ecore_x_icccm_size_pos_hints_set(win->evas_win,
@@ -736,7 +741,10 @@ _e_win_cb_move(Ecore_Evas *ee)
 
    win = ecore_evas_data_get(ee, "E_Win");
    if (!win) return;
-   ecore_evas_geometry_get(win->ecore_evas, &win->x, &win->y, &win->w, &win->h);
+   if (win->border)
+     win->x = win->border->x, win->y = win->border->y;
+   else
+     ecore_evas_geometry_get(win->ecore_evas, &win->x, &win->y, NULL, NULL);
    if (win->cb_move) win->cb_move(win);
 }
 
@@ -747,7 +755,7 @@ _e_win_cb_resize(Ecore_Evas *ee)
 
    win = ecore_evas_data_get(ee, "E_Win");
    if (!win) return;
-   ecore_evas_geometry_get(win->ecore_evas, &win->x, &win->y, &win->w, &win->h);
+   ecore_evas_geometry_get(win->ecore_evas, NULL, NULL, &win->w, &win->h);
    if (win->cb_resize) win->cb_resize(win);
 }
 
index 82006bb..d058115 100644 (file)
@@ -25,7 +25,6 @@ struct _Evry_Window
   E_Win *ewin;
   Evas *evas;
   E_Zone *zone;
-  Eina_Bool shaped;
   Evas_Object *o_main;
 
   Eina_Bool request_selection;
index 4fc593e..e4e6e37 100644 (file)
@@ -64,6 +64,7 @@ static void           _evry_view_hide(Evry_Window *win, Evry_View *v, int slide)
 static void           _evry_item_desel(Evry_State *s);
 static void           _evry_item_sel(Evry_State *s, Evry_Item *it);
 
+static Eina_Bool      _evry_cb_show(Evry_Window *win, int type __UNUSED__, Ecore_X_Event_Window_Show *ev);
 static Eina_Bool      _evry_cb_key_down(void *data, int type, void *event);
 static Eina_Bool      _evry_cb_selection_notify(void *data, int type, void *event);
 static Eina_Bool      _evry_cb_mouse(void *data, int type, void *event);
@@ -177,18 +178,16 @@ evry_show(E_Zone *zone, E_Zone_Edge edge, const char *params, Eina_Bool popup)
 
    if (popup)
      {
-        e_win_layer_set(win->ewin, E_WIN_LAYER_ABOVE);
+        //e_win_layer_set(win->ewin, E_WIN_LAYER_ABOVE);
         ecore_x_netwm_window_type_set(win->ewin->evas_win,
                                       ECORE_X_WINDOW_TYPE_UTILITY);
 
         ecore_evas_name_class_set(win->ewin->ecore_evas, "E", "everything");
 
-        ecore_evas_show(win->ewin->ecore_evas);
+        e_win_show(win->ewin);
+        win->ewin->border->client.netwm.state.skip_taskbar = win->ewin->border->changed = 1;
 
-        if (e_grabinput_get(win->ewin->evas_win, 0, win->ewin->evas_win))
-          win->grab = 1;
-        else
-          ERR("could not acquire grab");
+        win->grab = 1;
      }
 
    evry_history_load();
@@ -203,51 +202,25 @@ evry_show(E_Zone *zone, E_Zone_Edge edge, const char *params, Eina_Bool popup)
    _evry_selector_new(win, EVRY_PLUGIN_ACTION);
    _evry_selector_new(win, EVRY_PLUGIN_OBJECT);
 
-   win->handlers = eina_list_append
-       (win->handlers, ecore_event_handler_add
-         (ECORE_EVENT_KEY_DOWN,
-         _evry_cb_key_down, win));
-
-   win->handlers = eina_list_append
-       (win->handlers, ecore_event_handler_add
-         (ECORE_X_EVENT_SELECTION_NOTIFY,
-         _evry_cb_selection_notify, win));
-
-   win->handlers = eina_list_append
-       (win->handlers, evry_event_handler_add
-         (EVRY_EVENT_ITEM_CHANGED,
-         _evry_cb_item_changed, win));
-
-   win->handlers = eina_list_append
-       (win->handlers, ecore_event_handler_add
-         (ECORE_EVENT_MOUSE_BUTTON_DOWN,
-         _evry_cb_mouse, win));
-
-   win->handlers = eina_list_append
-       (win->handlers, ecore_event_handler_add
-         (ECORE_EVENT_MOUSE_BUTTON_UP,
-         _evry_cb_mouse, win));
+   E_LIST_HANDLER_APPEND(win->handlers, ECORE_EVENT_KEY_DOWN, _evry_cb_key_down, win);
+
+   E_LIST_HANDLER_APPEND(win->handlers, ECORE_X_EVENT_SELECTION_NOTIFY, _evry_cb_selection_notify, win);
+   E_LIST_HANDLER_APPEND(win->handlers, ECORE_X_EVENT_WINDOW_SHOW, _evry_cb_show, win);
+
+   E_LIST_HANDLER_APPEND(win->handlers, EVRY_EVENT_ITEM_CHANGED, _evry_cb_item_changed, win);
+
+   E_LIST_HANDLER_APPEND(win->handlers, ECORE_EVENT_MOUSE_BUTTON_DOWN, _evry_cb_mouse, win);
+
+   E_LIST_HANDLER_APPEND(win->handlers, ECORE_EVENT_MOUSE_BUTTON_UP, _evry_cb_mouse, win);
    E_LIST_HANDLER_APPEND(win->handlers, E_EVENT_DESKLOCK, _evry_cb_desklock, win);
 #if 0
-   win->handlers = eina_list_append
-       (win->handlers, ecore_event_handler_add
-         (ECORE_EVENT_MOUSE_MOVE,
-         _evry_cb_mouse, win));
-
-   win->handlers = eina_list_append
-       (win->handlers, ecore_event_handler_add
-         (ECORE_EVENT_MOUSE_WHEEL,
-         _evry_cb_mouse, win));
-
-   win->handlers = eina_list_append
-       (win->handlers, ecore_event_handler_add
-         (ECORE_X_EVENT_MOUSE_IN,
-         _evry_cb_mouse_in, win));
-
-   win->handlers = eina_list_append
-       (win->handlers, ecore_event_handler_add
-         (ECORE_X_EVENT_MOUSE_OUT,
-         _evry_cb_mouse_out, win));
+   E_LIST_HANDLER_APPEND(win->handlers, ECORE_EVENT_MOUSE_MOVE, _evry_cb_mouse, win);
+
+   E_LIST_HANDLER_APPEND(win->handlers, ECORE_EVENT_MOUSE_WHEEL, _evry_cb_mouse, win);
+
+   E_LIST_HANDLER_APPEND(win->handlers, ECORE_X_EVENT_MOUSE_IN, _evry_cb_mouse_in, win);
+
+   E_LIST_HANDLER_APPEND(win->handlers, ECORE_X_EVENT_MOUSE_OUT, _evry_cb_mouse_out, win);
 #endif
    _evry_selector_plugins_get(SUBJ_SEL, NULL, params);
    _evry_selector_update(SUBJ_SEL);
@@ -783,14 +756,12 @@ _evry_window_new(E_Zone *zone, E_Zone_Edge edge)
    Evas_Object *o;
    const char *tmp;
    int offset_s = 0;
-   const char *shape_option;
 
    win = E_NEW(Evry_Window, 1);
    win->ewin = e_win_new(zone->container);
    e_win_borderless_set(win->ewin, 1);
    e_win_no_remember_set(win->ewin, 1);
    e_win_placed_set(win->ewin, 1);
-   e_object_delay_del_set(E_OBJECT(win->ewin), NULL); //prevent deferred delete
    ecore_evas_override_set(win->ewin->ecore_evas, 1);
    win->evas = e_win_evas_get(win->ewin);
    win->zone = zone;
@@ -801,27 +772,13 @@ _evry_window_new(E_Zone *zone, E_Zone_Edge edge)
    e_theme_edje_object_set(o, "base/theme/modules/everything",
                            "e/modules/everything/main");
 
-   if ((shape_option = edje_object_data_get(o, "shaped")) &&
-       (!strcmp(shape_option, "1")))
-     {
-        win->shaped = EINA_TRUE;
-
-        if (!e_config->use_shaped_win)
-          {
-             ecore_evas_alpha_set(win->ewin->ecore_evas, 1);
-             win->ewin->evas_win = ecore_evas_software_x11_window_get(win->ewin->ecore_evas);
-             edje_object_signal_emit(o, "e,state,composited", "e");
-             edje_object_signal_emit(o, "list:e,state,composited", "e");
-             edje_object_message_signal_process(o);
-             edje_object_calc_force(o);
-
-             tmp = edje_object_data_get(o, "shadow_offset");
-             offset_s = tmp ? atoi(tmp) : 0;
-          }
-        else
-          ecore_evas_shaped_set(win->ewin->ecore_evas, 1);
-     }
+   edje_object_signal_emit(o, "e,state,composited", "e");
+   edje_object_signal_emit(o, "list:e,state,composited", "e");
+   edje_object_message_signal_process(o);
+   edje_object_calc_force(o);
 
+   tmp = edje_object_data_get(o, "shadow_offset");
+   offset_s = tmp ? atoi(tmp) : 0;
    edje_object_size_min_calc(o, &mw, &mh);
 
    if (edge == E_ZONE_EDGE_NONE)
@@ -895,8 +852,6 @@ _evry_window_new(E_Zone *zone, E_Zone_Edge edge)
    win->ewin->w = mw;
    win->ewin->h = mh;
 
-   o = win->o_main;
-   evas_object_move(o, 0, 0);
    evas_object_resize(o, mw, mh);
    evas_object_show(o);
 
@@ -1027,13 +982,7 @@ _evry_cb_mouse(void *data, int type, void *event)
 static void
 _evry_window_free(Evry_Window *win)
 {
-   if (win->ewin->border)
-     ecore_x_window_hide(win->ewin->border->win);
-   else
-     ecore_x_window_hide(win->ewin->evas_win);
-
    evas_event_freeze(win->evas);
-   evas_object_del(win->o_main);
    if (!e_object_is_del(E_OBJECT(win->ewin)))
      e_object_del(E_OBJECT(win->ewin));
    E_FREE(win);
@@ -1961,16 +1910,15 @@ _evry_cb_key_down(void *data, int type __UNUSED__, void *event)
         E_Win *ewin = win->ewin;
 
         e_grabinput_release(ewin->evas_win, ewin->evas_win);
-        if (!win->shaped)
-          e_win_borderless_set(ewin, 0);
-        ecore_evas_lower(ewin->ecore_evas);
-        ewin->border = e_border_new(ewin->container, ewin->evas_win, 1, 1);
-        // dont need this - special stuff - here it is needed
-        ewin->border->ignore_first_unmap = 1;
-        ewin->border->internal = 1;
-        ewin->border->internal_ecore_evas = ewin->ecore_evas;
+        e_border_layer_set(ewin->border, E_LAYER_NORMAL);
+        ecore_x_netwm_window_type_set(ewin->evas_win,
+                                      ECORE_X_WINDOW_TYPE_DIALOG);
+        ewin->border->client.netwm.fetch.type = 1;
+        ewin->border->client.netwm.state.skip_taskbar = 0;
+        ewin->border->changed = 1;
+        ewin->border->client.netwm.update.state = 1;
         ewin->border->internal_no_remember = 1;
-        e_border_show(ewin->border);
+        e_win_borderless_set(ewin, 0);
 
         win->grab = 0;
         return ECORE_CALLBACK_PASS_ON;
@@ -3060,6 +3008,15 @@ _evry_plugin_list_insert(Evry_State *s, Evry_Plugin *p)
 }
 
 static Eina_Bool
+_evry_cb_show(Evry_Window *win, int type __UNUSED__, Ecore_X_Event_Window_Show *ev)
+{
+   if (win->ewin->evas_win != ev->event_win) return ECORE_CALLBACK_RENEW;
+   if (win->grab)
+     e_grabinput_get(win->ewin->evas_win, 0, win->ewin->evas_win);
+   return ECORE_CALLBACK_RENEW;
+}
+
+static Eina_Bool
 _evry_cb_selection_notify(void *data, int type __UNUSED__, void *event)
 {
    Ecore_X_Event_Selection_Notify *ev;
index 558a129..37e18e2 100644 (file)
@@ -216,7 +216,6 @@ _del_func(void *data, void *obj __UNUSED__)
    Instance *inst = data;
 
    e_gadcon_locked_set(inst->gcc->gadcon, 0);
-   e_object_delfn_del(E_OBJECT(inst->win->ewin), inst->del_fn);
 
    if (inst->hide_animator) ecore_animator_del(inst->hide_animator);
    inst->del_fn = NULL;
@@ -320,28 +319,28 @@ _gadget_popup_show(Instance *inst)
       case E_GADCON_ORIENT_TOP:
       case E_GADCON_ORIENT_CORNER_TL:
       case E_GADCON_ORIENT_CORNER_TR:
-        e_win_move(ewin, x, y + h);
+        y += h;
         inst->hide_y = -1;
         break;
 
       case E_GADCON_ORIENT_BOTTOM:
       case E_GADCON_ORIENT_CORNER_BR:
       case E_GADCON_ORIENT_CORNER_BL:
-        e_win_move(ewin, x, y - ph);
+        y -= ph;
         inst->hide_y = 1;
         break;
 
       case E_GADCON_ORIENT_LEFT:
       case E_GADCON_ORIENT_CORNER_LT:
       case E_GADCON_ORIENT_CORNER_LB:
-        e_win_move(ewin, x + w, y);
+        x += w;
         inst->hide_x = -1;
         break;
 
       case E_GADCON_ORIENT_RIGHT:
       case E_GADCON_ORIENT_CORNER_RT:
       case E_GADCON_ORIENT_CORNER_RB:
-        e_win_move(ewin, x - pw, y);
+        x -= pw;
         inst->hide_x = 1;
         break;
 
@@ -353,10 +352,12 @@ _gadget_popup_show(Instance *inst)
      }
 
    if (ewin->x + pw > inst->win->zone->w)
-     e_win_move(ewin, inst->win->zone->w - pw, ewin->y);
+     x = inst->win->zone->w - pw;
 
    if (ewin->y + ph > inst->win->zone->h)
-     e_win_move(ewin, ewin->x, inst->win->zone->h - ph);
+     y = inst->win->zone->h - ph;
+
+   e_win_move(ewin, x, y);
 }
 
 static void
index f224799..cef8dd9 100644 (file)
@@ -489,6 +489,7 @@ e_fwin_zone_new(E_Zone *zone, void *p)
    evas_object_move(o, x, y);
    evas_object_resize(o, w, h);
    E_LAYER_SET_UNDER(o, E_COMP_CANVAS_LAYER_DESKTOP);
+   evas_object_hide(o);
    evas_object_show(o);
    page->scrollframe_obj = page->scr = o;
 
@@ -739,7 +740,6 @@ _e_fwin_free(E_Fwin *fwin)
    if (fwin->spring_parent) fwin->spring_parent->spring_child = NULL;
    if (fwin->win)
      {
-        e_object_delay_del_set(E_OBJECT(fwin->win), NULL);
         e_object_del(E_OBJECT(fwin->win));
      }
    free(fwin);
index 2f0ef88..2b3fe72 100644 (file)
@@ -322,8 +322,7 @@ _e_mod_ind_win_cb_mouse_up(void *data, Evas *evas __UNUSED__, Evas_Object *obj _
         bd = iwin->win->border;
 
         /* reset mouse pointer */
-        if (bd->pointer) 
-          e_pointer_type_pop(bd->pointer, bd, "move");
+        e_pointer_type_pop(e_comp_get(bd)->pointer, bd, "move");
 
         /* tell edj we are done moving */
         edje_object_signal_emit(iwin->o_base, "e,action,move,stop", "e");
@@ -363,9 +362,8 @@ _e_mod_ind_win_cb_mouse_move(void *data, Evas *evas __UNUSED__, Evas_Object *obj
         iwin->drag.start = 0;
 
         /* change mouse pointer to indicate we are dragging */
-        if (iwin->win->border->pointer) 
-          e_pointer_type_push(iwin->win->border->pointer, 
-                              iwin->win->border, "move");
+        e_pointer_type_push(e_comp_get(iwin->win)->pointer, 
+                            iwin->win->border, "move");
 
         /* tell edj we are going to start moving */
         edje_object_signal_emit(iwin->o_base, "e,action,move,start", "e");
index 1637f10..d72fb6a 100644 (file)
@@ -611,13 +611,14 @@ _shot_now(E_Zone *zone, E_Border *bd)
    Evas_Object *o, *oa, *op, *ol;
    int x, y, w, h;
    Evas_Modifier_Mask mask;
-   Ecore_X_Window xwin, root;
+   Ecore_X_Window xwin;
    E_Radio_Group *rg;
    Ecore_X_Visual visual;
    Ecore_X_Display *display;
    Ecore_X_Screen *scr;
    Ecore_X_Window_Attributes watt;
    Ecore_X_Colormap colormap;
+   int depth;
 
    if ((!zone) && (!bd)) return;
    if (zone)
@@ -628,28 +629,24 @@ _shot_now(E_Zone *zone, E_Border *bd)
         w = sw = sman->w;
         h = sh = sman->h;
         x = y = 0;
+        if (!ecore_x_window_attributes_get(xwin, &watt)) return;
+        visual = watt.visual;
+        depth = watt.depth;
      }
    else
      {
-        root = bd->zone->container->manager->root;
-        xwin = bd->client.win;
-        while (xwin != root)
-          {
-             if (ecore_x_window_parent_get(xwin) == root) break;
-             xwin = ecore_x_window_parent_get(xwin);
-          }
-        ecore_x_window_geometry_get(xwin, &x, &y, &sw, &sh);
+        xwin = e_comp_get(bd)->ee_win;
+        x = bd->x, y = bd->y, sw = bd->w, sh = bd->h;
         w = sw;
         h = sh;
-        xwin = root;
-        x = E_CLAMP(bd->x, bd->zone->x, bd->zone->x + bd->zone->w);
-        y = E_CLAMP(bd->y, bd->zone->y, bd->zone->y + bd->zone->h);
+        x = E_CLAMP(x, bd->zone->x, bd->zone->x + bd->zone->w);
+        y = E_CLAMP(y, bd->zone->y, bd->zone->y + bd->zone->h);
         sw = E_CLAMP(sw, 0, bd->zone->x + bd->zone->w - x);
         sh = E_CLAMP(sh, 0, bd->zone->y + bd->zone->h - y);
+        visual = bd->client.initial_attributes.visual;
+        depth = bd->client.initial_attributes.depth;
      }
-   if (!ecore_x_window_attributes_get(xwin, &watt)) return;
-   visual = watt.visual;
-   img = ecore_x_image_new(w, h, visual, ecore_x_window_depth_get(xwin));
+   img = ecore_x_image_new(w, h, visual, depth);
    ecore_x_image_get(img, xwin, x, y, 0, 0, sw, sh);
    src = ecore_x_image_data_get(img, &bpl, &rows, &bpp);
    display = ecore_x_display_get();
index fb8a904..bd9638e 100644 (file)
@@ -846,11 +846,13 @@ _tasks_cb_item_mouse_up(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSE
 static Eina_Bool
 _tasks_cb_event_border_add(void *data __UNUSED__, int type __UNUSED__, void *event)
 {
-   E_Event_Border_Add *ev;
+   E_Event_Border_Add *ev = event;
 
-   ev = event;
-   tasks_config->borders = eina_list_append(tasks_config->borders, ev->border);
-   _tasks_refill_all();
+   if ((!tasks_config->borders) || (!eina_list_data_find(tasks_config->borders, ev->border)))
+     {
+        tasks_config->borders = eina_list_append(tasks_config->borders, ev->border);
+        _tasks_refill_all();
+     }
    return EINA_TRUE;
 }
 
index 73b0f02..c88a9a8 100644 (file)
@@ -259,8 +259,8 @@ e_winlist_hide(void)
    E_FREE_FUNC(_scroll_timer, ecore_timer_del);
    E_FREE_FUNC(_animator, ecore_animator_del);
 
-   ecore_x_window_free(_input_window);
    e_grabinput_release(_input_window, _input_window);
+   ecore_x_window_free(_input_window);
    _input_window = 0;
    if (bd)
      {
@@ -1334,10 +1334,11 @@ _e_winlist_cb_mouse_move(void *data __UNUSED__, int type __UNUSED__, void *event
 
    ev = event;
    if (ev->window != _input_window) return ECORE_CALLBACK_PASS_ON;
-
-   evas_event_feed_mouse_move(_winlist->evas, ev->x - _winlist->x +
-                              _winlist->zone->x, ev->y - _winlist->y +
-                              _winlist->zone->y, ev->timestamp, NULL);
+   /* only feed mouse move if it's within the winlist popup */
+   if (E_INSIDE(ev->x - _winlist->zone->x, ev->y - _winlist->zone->y, _winlist->x, _winlist->y, _winlist->w, _winlist->h))
+     evas_event_feed_mouse_move(_winlist->evas, ev->x - _winlist->x +
+                                _winlist->zone->x, ev->y - _winlist->y +
+                                _winlist->zone->y, ev->timestamp, NULL);
 
    return ECORE_CALLBACK_PASS_ON;
 }