//#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);
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 */
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);
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);
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);
_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);
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
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); */
_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;
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;
/* 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);
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);
focus_stack = eina_list_append(focus_stack, bd);
- bd->pointer = e_pointer_window_new(bd->win, 0);
return 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);
}
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);
}
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,
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)
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;
if (bd->internal_ecore_evas)
{
- bd->changed = 1;
+ BD_CHANGED(bd);
bd->changes.size = 1;
}
else
}
else
{
- bd->changed = 1;
+ BD_CHANGED(bd);
bd->changes.size = 1;
}
}
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))))
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)
bd->changes.pos = 1;
}
- if ((bd->shaped) || (bd->client.shaped))
+ if (bd->client.shaped)
{
bd->need_shape_merge = 1;
bd->need_shape_export = 1;
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);
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)
{
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);
}
}
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;
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);
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
{
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
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;
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;
e_border_layer_set(bd, layer);
bd->client.border.changed = 1;
- bd->changed = 1;
+ BD_CHANGED(bd);
}
}
}
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;
Eina_List *l;
E_Border *tmp;
- ecore_evas_show(bd->bg_ecore_evas);
-
if (bd->post_job)
{
bd->post_show = 1;
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);
return 0;
e_grabinput_release(action_input_win, action_input_win);
- ecore_x_window_free(action_input_win);
action_input_win = 0;
return 1;
}
_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;
{
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];
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
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);
}
}
{
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];
{
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
{
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;
}
}
else
{
- bdresize->resize_mode = RESIZE_NONE;
+ bdresize->resize_mode = E_POINTER_RESIZE_NONE;
_e_border_resize_end(bdresize);
}
}
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;
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)
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_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;
}
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)
{
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
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)
{
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);
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)
focused = NULL;
}
- E_FREE_LIST(bd->handlers, ecore_event_handler_del);
if (bd->remember)
{
E_Remember *rem;
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;
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;
*/
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;
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));
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;
}
(!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)
{
(!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)
{
{
*/
bd->client.mwm.fetch.hints = 1;
- bd->changed = 1;
+ BD_CHANGED(bd);
/*
}
*/
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)
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)
{
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;
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;
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;
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)
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))
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)
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;
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,
bd->desktop = NULL;
}
bd->changes.icon = 1;
- bd->changed = 1;
+ BD_CHANGED(bd);
}
/*
e_init_status_set(_("Desktop files scan done"));
EINA_LIST_FOREACH(borders, l, bd)
{
bd->changes.icon = 1;
- bd->changed = 1;
+ BD_CHANGED(bd);
}
return ECORE_CALLBACK_PASS_ON;
}
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
{
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
}
}
-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;
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))
{
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))
{
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)
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
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;
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)
// 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;
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);
}
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);
}
}
{
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) &&
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;
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")))
}
}
- 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)
{
// 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;
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;
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;
}
}
}
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);
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);
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,
{
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);
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)
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))
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))
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))
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))
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);
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);
bd->changes.pos = 1;
}
- if ((bd->shaped) || (bd->client.shaped))
+ if (bd->client.shaped)
{
bd->need_shape_merge = 1;
bd->need_shape_export = 1;
bd->need_shape_merge = 1;
}
bd->changes.size = 1;
- bd->changed = 1;
+ BD_CHANGED(bd);
/* we're done */
if (val == 1)
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)
/* 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);
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;
#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);
{
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)
)
{
}
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
{
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)
{
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");
}
}
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);
_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));
}
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)
{
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)
{
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;
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;
// 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))
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);
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);
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++;
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);
{
Evas_Object *o;
- if (cw->real_obj && cw->eobj)
+ if (cw->eobj)
{
e_object_unref(E_OBJECT(cw->eobj));
cw->eobj = NULL;
/* 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);
{
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;
_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;
}
{
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;
}
{
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;
}
_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;
}
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;
}
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;
}
* 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)
}
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);
+ }
}
}
*/
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);
}
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);
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);
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);
{
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;
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 |
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);
}
}
}
+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)
{
_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;
_e_comp_win_raise(cw);
else if (stack == E_COMP_CANVAS_STACK_UNDER)
_e_comp_win_lower(cw);
+ return cw;
}
EAPI void
{
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)
}
}
-
EAPI unsigned int
e_comp_e_object_layer_get(const E_Object *obj)
{