1 #include "e_mod_move_shared_types.h"
2 #include "e_mod_move_debug.h"
3 #include "e_mod_move.h"
4 #include "e_mod_move_atoms.h"
6 struct _E_Move_Quickpanel_Animation_Data
15 Ecore_Animator *animator;
18 /* local subsystem functions */
19 static Eina_Bool _e_mod_move_quickpanel_cb_motion_start(void *data, void *event_info);
20 static Eina_Bool _e_mod_move_quickpanel_cb_motion_move(void *data, void *event_info);
21 static Eina_Bool _e_mod_move_quickpanel_cb_motion_end(void *data, void *event_info);
22 static Eina_Bool _e_mod_move_quickpanel_objs_position_set(E_Move_Border *mb, int x, int y);
23 static Eina_Bool _e_mod_move_quickpanel_objs_position_get(E_Move_Border *mb, int *x, int *y);
24 static Eina_Bool _e_mod_move_quickpanel_objs_moving_distance_rate_get(E_Move_Border *mb, int angle, double *rate);
25 static Eina_Bool _e_mod_move_quickpanel_objs_animation_frame(void *data, double pos);
26 static Eina_Bool _e_mod_move_quickpanel_flick_process(E_Move_Border *mb, int angle, Eina_Bool state);
27 static Eina_Bool _e_mod_move_quickpanel_dim_objs_apply(E_Move_Border *mb, int x, int y);
28 static Eina_Bool _e_mod_move_quickpanel_below_window_set(void);
29 static void _e_mod_move_quickpanel_below_window_unset(void);
30 static Eina_Bool _e_mod_move_quickpanel_below_window_objs_add(void);
31 static Eina_Bool _e_mod_move_quickpanel_below_window_objs_del(void);
32 static Eina_Bool _e_mod_move_quickpanel_below_window_objs_move(int x, int y);
33 static Eina_Bool _e_mod_move_quickpanel_handle_objs_add(E_Move_Border *mb);
34 static Eina_Bool _e_mod_move_quickpanel_handle_objs_del(E_Move_Border *mb);
35 static Eina_Bool _e_mod_move_quickpanel_handle_objs_size_update(E_Move_Border *mb, int w, int h);
36 static Eina_Bool _e_mod_move_quickpanel_handle_objs_move(E_Move_Border *mb, int x, int y);
37 static Eina_Bool _e_mod_move_quickpanel_objs_check_on_screen(E_Move_Border *mb, int x, int y);
38 static Eina_Bool _e_mod_move_quickpanel_objs_outside_movable_pos_get(E_Move_Border *mb, int *x, int *y);
39 static Eina_Bool _e_mod_move_quickpanel_animation_change_with_angle(E_Move_Border *mb);
40 static Eina_Bool _e_mod_move_quickpanel_fb_move_change_with_angle(E_Move_Border *mb);
41 static Eina_Bool _e_mod_move_quickpanel_comp_layer_obj_move(int x, int y);
42 static Eina_Bool _e_mod_move_quickpanel_comp_layer_obj_move_intern(int x, int y);
44 /* local subsystem functions */
46 _e_mod_move_quickpanel_cb_motion_start(void *data,
49 E_Move_Border *mb = (E_Move_Border *)data;
50 E_Move_Event_Motion_Info *info;
51 E_Move_Control_Object *mco = NULL;
52 Evas_Event_Mouse_Down *mouse_down_event = NULL;
53 Eina_Bool clicked = EINA_FALSE;
57 info = (E_Move_Event_Motion_Info *)event_info;
58 if (!mb || !info) return EINA_FALSE;
60 mouse_down_event = info->event_info;
61 E_CHECK_RETURN(mouse_down_event, EINA_FALSE);
62 if (mouse_down_event->button != 1)
65 EINA_LIST_FOREACH(mb->ctl_objs, l, mco)
68 clicked = e_mod_move_event_click_get(mco->event);
74 "[MOVE] ev:%15.15s w:0x%08x %s()\n", "EVAS_OBJ", mb->bd->win, __func__);
76 if (e_mod_move_quickpanel_objs_animation_state_get(mb)) goto error_cleanup;
78 EINA_LIST_FOREACH(mb->ctl_objs, l, mco)
81 angle = e_mod_move_event_angle_get(mco->event);
85 EINA_LIST_FOREACH(mb->ctl_objs, l, mco)
88 e_mod_move_event_click_set(mco->event, EINA_TRUE);
91 E_CHECK_GOTO(mb->visible, error_cleanup);
92 if (!(REGION_INTERSECTS_WITH_ZONE(mb, mb->bd->zone)))
95 E_CHECK_GOTO(e_mod_move_flick_data_new(mb), error_cleanup);
96 e_mod_move_flick_data_init(mb, info->coord.x, info->coord.y);
98 e_mod_move_quickpanel_objs_add(mb);
100 // send quickpanel to "move start message".
101 e_mod_move_quickpanel_anim_state_send(mb, EINA_TRUE);
107 EINA_LIST_FOREACH(mb->ctl_objs, l, mco)
110 e_mod_move_event_click_set(mco->event, EINA_FALSE);
116 _e_mod_move_quickpanel_cb_motion_move(void *data,
120 E_Move_Border *mb = (E_Move_Border *)data;
121 E_Move_Event_Motion_Info *info;
122 E_Move_Control_Object *mco = NULL;
126 Eina_Bool click = EINA_FALSE;
129 info = (E_Move_Event_Motion_Info *)event_info;
130 if (!mb || !info) return EINA_FALSE;
133 "[MOVE] ev:%15.15s w:0x%08x ,angle:%d, (%d,%d) %s()\n",
134 "EVAS_OBJ", mb->bd->win, mb->angle, info->coord.x, info->coord.y,
141 EINA_LIST_FOREACH(mb->ctl_objs, l, mco)
144 click = e_mod_move_event_click_get(mco->event);
146 E_CHECK_RETURN(click, EINA_FALSE);
148 if (m->qp_scroll_with_clipping)
149 e_mod_move_quickpanel_objs_move(mb, info->coord.x, info->coord.y);
155 if (info->coord.y < mb->h)
157 if (e_mod_move_border_contents_rect_get(mb, &cx, &cy ,&cw, &ch))
159 if (info->coord.y < ch)
161 e_mod_move_quickpanel_objs_move(mb, 0,
167 e_mod_move_quickpanel_objs_move(mb, 0,
168 info->coord.y - mb->h);
173 if (info->coord.x < mb->w)
175 if (e_mod_move_border_contents_rect_get(mb, &cx, &cy ,&cw, &ch))
177 if (info->coord.x < cw)
179 e_mod_move_quickpanel_objs_move(mb, info->coord.x - cw,
185 e_mod_move_quickpanel_objs_move(mb, info->coord.x - mb->w,
191 if (info->coord.y > (zone->h - mb->h))
193 if (e_mod_move_border_contents_rect_get(mb, &cx, &cy ,&cw, &ch))
195 if (info->coord.y > cy)
197 e_mod_move_quickpanel_objs_move(mb, 0,
203 e_mod_move_quickpanel_objs_move(mb, 0, info->coord.y);
208 if (info->coord.x > (zone->w - mb->w))
210 if (e_mod_move_border_contents_rect_get(mb, &cx, &cy ,&cw, &ch))
212 if (info->coord.x > cx)
214 e_mod_move_quickpanel_objs_move(mb,
221 e_mod_move_quickpanel_objs_move(mb, info->coord.x, 0);
234 _e_mod_move_quickpanel_cb_motion_end(void *data,
238 E_Move_Border *mb = (E_Move_Border *)data;
239 E_Move_Event_Motion_Info *info;
240 E_Move_Control_Object *mco = NULL;
241 Evas_Event_Mouse_Up *mouse_up_event;
245 Eina_Bool click = EINA_FALSE;
246 Eina_Bool flick_state = EINA_FALSE;
248 int check_w, check_h;
250 info = (E_Move_Event_Motion_Info *)event_info;
251 if (!mb || !info) return EINA_FALSE;
253 mouse_up_event = info->event_info;
255 E_CHECK_RETURN(mouse_up_event, EINA_FALSE);
256 if (mouse_up_event->button != 1)
260 "[MOVE] ev:%15.15s w:0x%08x ,angle:%d, (%d,%d) %s()\n",
261 "EVAS_OBJ", mb->bd->win, mb->angle, info->coord.x, info->coord.y,
268 EINA_LIST_FOREACH(mb->ctl_objs, l, mco)
271 click = e_mod_move_event_click_get(mco->event);
273 E_CHECK_GOTO(click, finish);
275 e_mod_move_flick_data_update(mb, info->coord.x, info->coord.y);
276 flick_state = e_mod_move_flick_state_get(mb, EINA_FALSE);
277 if (_e_mod_move_quickpanel_flick_process(mb, angle, flick_state))
286 if (check_h) check_h /= 2;
287 if (info->coord.y < check_h)
289 if (m->qp_scroll_with_clipping)
291 e_mod_move_quickpanel_e_border_move(mb, 0, mb->h * -1);
292 e_mod_move_quickpanel_objs_animation_move(mb, zone->x, zone->y);
296 if (e_mod_move_border_contents_rect_get(mb, &cx, &cy ,&cw, &ch))
299 if (check_h) check_h /= 2;
300 if (info->coord.y < check_h)
302 e_mod_move_quickpanel_e_border_move(mb, 0, mb->h * -1);
303 e_mod_move_quickpanel_objs_animation_move(mb, 0, ch * -1);
307 e_mod_move_quickpanel_objs_animation_move(mb, 0, 0);
314 if (m->qp_scroll_with_clipping)
316 e_mod_move_quickpanel_objs_animation_move(mb,
322 e_mod_move_quickpanel_objs_animation_move(mb, 0, 0);
328 if (check_w) check_w /= 2;
329 if (info->coord.x < check_w)
331 if (m->qp_scroll_with_clipping)
333 e_mod_move_quickpanel_e_border_move(mb, mb->w * -1, 0);
334 e_mod_move_quickpanel_objs_animation_move(mb, zone->x, zone->y);
338 if (e_mod_move_border_contents_rect_get(mb, &cx, &cy ,&cw, &ch))
341 if (check_w) check_w /= 2;
342 if (info->coord.x < check_w)
344 e_mod_move_quickpanel_e_border_move(mb, mb->w * -1, 0);
345 e_mod_move_quickpanel_objs_animation_move(mb, cw * -1, 0);
349 e_mod_move_quickpanel_objs_animation_move(mb, 0, 0);
356 if (m->qp_scroll_with_clipping)
358 e_mod_move_quickpanel_objs_animation_move(mb,
364 e_mod_move_quickpanel_objs_animation_move(mb, 0, 0);
370 if (check_h) check_h /= 2;
371 if (info->coord.y > (zone->h - check_h))
373 if (m->qp_scroll_with_clipping)
375 e_mod_move_quickpanel_e_border_move(mb, 0, zone->h);
376 e_mod_move_quickpanel_objs_animation_move(mb,
382 if (e_mod_move_border_contents_rect_get(mb, &cx, &cy ,&cw, &ch))
385 if (check_h) check_h /= 2;
386 if (info->coord.y > (cy + check_h))
388 e_mod_move_quickpanel_e_border_move(mb, 0, zone->h);
389 e_mod_move_quickpanel_objs_animation_move(mb, 0, ch);
393 e_mod_move_quickpanel_objs_animation_move(mb, 0, 0);
400 e_mod_move_quickpanel_e_border_move(mb, 0, 0);
401 if (m->qp_scroll_with_clipping)
403 e_mod_move_quickpanel_objs_animation_move(mb,
409 e_mod_move_quickpanel_objs_animation_move(mb, 0, 0);
415 if (check_w) check_w /= 2;
416 if (info->coord.x > (zone->w - check_w))
418 if (m->qp_scroll_with_clipping)
420 e_mod_move_quickpanel_e_border_move(mb, zone->w, 0);
421 e_mod_move_quickpanel_objs_animation_move(mb,
427 if (e_mod_move_border_contents_rect_get(mb, &cx, &cy ,&cw, &ch))
430 if (check_w) check_w /= 2;
431 if (info->coord.x > (cx + check_w))
433 e_mod_move_quickpanel_e_border_move(mb, zone->w, 0);
434 e_mod_move_quickpanel_objs_animation_move(mb, cw, 0);
438 e_mod_move_quickpanel_objs_animation_move(mb, 0, 0);
445 e_mod_move_quickpanel_e_border_move(mb, 0, 0);
446 if (m->qp_scroll_with_clipping)
448 e_mod_move_quickpanel_objs_animation_move(mb, zone->x, zone->y);
452 e_mod_move_quickpanel_objs_animation_move(mb, 0, 0);
460 EINA_LIST_FOREACH(mb->ctl_objs, l, mco)
463 e_mod_move_event_click_set(mco->event, EINA_FALSE);
467 if (mb->flick_data) e_mod_move_flick_data_free(mb);
472 _e_mod_move_quickpanel_objs_position_set(E_Move_Border *mb,
476 E_Move_Quickpanel_Data *qp_data = NULL;
477 E_CHECK_RETURN(mb, EINA_FALSE);
478 E_CHECK_RETURN(TYPE_QUICKPANEL_CHECK(mb), EINA_FALSE);
479 qp_data = (E_Move_Quickpanel_Data *)mb->data;
481 qp_data = (E_Move_Quickpanel_Data *)e_mod_move_quickpanel_internal_data_add(mb);
482 E_CHECK_RETURN(qp_data, EINA_FALSE);
483 qp_data->x = x; qp_data->y = y;
489 _e_mod_move_quickpanel_objs_position_get(E_Move_Border *mb,
493 E_Move_Quickpanel_Data *qp_data = NULL;
494 E_CHECK_RETURN(mb, EINA_FALSE);
495 E_CHECK_RETURN(x, EINA_FALSE);
496 E_CHECK_RETURN(y, EINA_FALSE);
497 E_CHECK_RETURN(TYPE_QUICKPANEL_CHECK(mb), EINA_FALSE);
498 qp_data = (E_Move_Quickpanel_Data *)mb->data;
499 E_CHECK_RETURN(qp_data, EINA_FALSE);
500 *x = qp_data->x; *y = qp_data->y;
505 _e_mod_move_quickpanel_objs_moving_distance_rate_get(E_Move_Border *mb,
512 E_Move_Quickpanel_Data *qp_data = NULL;
514 int cx = 0, cy = 0, cw = 0, ch = 0;
515 double dist_rate = 0.0;
517 E_CHECK_RETURN(mb, EINA_FALSE);
518 E_CHECK_RETURN(rate, EINA_FALSE);
520 E_CHECK_RETURN(m, EINA_FALSE);
521 E_CHECK_RETURN(TYPE_QUICKPANEL_CHECK(mb), EINA_FALSE);
522 qp_data = (E_Move_Quickpanel_Data *)mb->data;
523 E_CHECK_RETURN(qp_data, EINA_FALSE);
525 E_CHECK_RETURN(bd, EINA_FALSE);
527 E_CHECK_RETURN(zone, EINA_FALSE);
529 if (!_e_mod_move_quickpanel_objs_position_get(mb, &x, &y))
535 if (m->qp_scroll_with_clipping)
536 dist_rate = (double)y / (zone->y + zone->h);
539 if (e_mod_move_border_contents_rect_get(mb, &cx, &cy ,&cw, &ch))
540 dist_rate = (double)(y + ch) / (zone->y + zone->h);
542 dist_rate = (double)(y + mb->h) / (zone->y + zone->h);
546 if (m->qp_scroll_with_clipping)
547 dist_rate = (double)x / (zone->x + zone->w);
550 if (e_mod_move_border_contents_rect_get(mb, &cx, &cy ,&cw, &ch))
551 dist_rate = (double)(x + cw) / (zone->x + zone->w);
553 dist_rate = (double)(x + mb->w) / (zone->x + zone->w);
557 if (m->qp_scroll_with_clipping)
558 dist_rate = 1.0 - ((double)y / (zone->y + zone->h));
561 if (e_mod_move_border_contents_rect_get(mb, &cx, &cy ,&cw, &ch))
562 dist_rate = 1.0 - ((double)(y + cy) / (zone->y + zone->h));
564 dist_rate = 1.0 - ((double)y / (zone->y + zone->h));
568 if (m->qp_scroll_with_clipping)
569 dist_rate = 1.0 - ((double)x / (zone->x + zone->w));
572 if (e_mod_move_border_contents_rect_get(mb, &cx, &cy ,&cw, &ch))
573 dist_rate = 1.0 - ((double)(x + cx) / (zone->x + zone->w));
575 dist_rate = 1.0 - ((double)x / (zone->x + zone->w));
589 _e_mod_move_quickpanel_objs_animation_frame(void *data,
592 E_Move_Quickpanel_Animation_Data *anim_data = NULL;
593 E_Move_Border *mb = NULL;
594 E_Move_Border *find_mb = NULL;
601 Eina_Bool mv_ret = EINA_FALSE;
603 anim_data = (E_Move_Quickpanel_Animation_Data *)data;
604 E_CHECK_RETURN(anim_data, EINA_FALSE);
606 mb = e_mod_move_quickpanel_find();
607 E_CHECK_RETURN(mb, EINA_FALSE);
610 frame = ecore_animator_pos_map(pos, ECORE_POS_MAP_ACCELERATE, 0.0, 0.0);
611 x = anim_data->sx + anim_data->dx * frame;
612 y = anim_data->sy + anim_data->dy * frame;
614 // When Animation is ended, if new window is added or window stack changed, then apply new info
616 && m->qp_scroll_with_clipping)
617 e_mod_move_quickpanel_below_window_reset();
619 e_mod_move_quickpanel_objs_move(mb, x, y);
625 mv_ret = e_mod_move_quickpanel_objs_move(mb, anim_data->ex, anim_data->ey);
627 if (!mv_ret) // objs move fail case
629 // while quickpanel is animating, if quickpanel angle changed, qp_objs move could fail. so qp_objs move again with changed angle.
630 if (!E_INTERSECTS(bd->x, bd->y, bd->w, bd->h,
631 zone->x, zone->y, zone->w, zone->h))
633 if (_e_mod_move_quickpanel_objs_outside_movable_pos_get(mb,
636 e_mod_move_quickpanel_objs_move(mb, x, y);
640 // send quickpanel to "move end message".
641 e_mod_move_quickpanel_anim_state_send(mb, EINA_FALSE);
643 e_mod_move_quickpanel_objs_del(mb);
644 if (!E_INTERSECTS(bd->x, bd->y, bd->w, bd->h,
645 zone->x, zone->y, zone->w, zone->h)) // it work when quickpanel is not equal to zone size
647 win = e_mod_move_util_client_xid_get(mb);
649 EINA_INLIST_REVERSE_FOREACH(m->borders, find_mb)
651 if (find_mb->visible)
654 ecore_x_e_illume_quickpanel_state_send(find_mb->bd->client.win,
655 ECORE_X_ILLUME_QUICKPANEL_STATE_OFF);
659 if (find_mb->bd && find_mb->bd->iconic)
660 ecore_x_e_illume_quickpanel_state_send(find_mb->bd->client.win,
661 ECORE_X_ILLUME_QUICKPANEL_STATE_OFF);
665 if (!m->qp_scroll_with_clipping)
667 // if dim use case, hold below windows until dim is on screen
668 // dim hide calls deletion of below window mirror object
669 e_mod_move_quickpanel_dim_hide(mb);
671 // Set No Composite Mode & Rotation UnLock & Destroy below win's mirror object
672 e_mod_move_quickpanel_stage_deinit(mb);
674 ecore_x_e_illume_quickpanel_state_set(zone->black_win, ECORE_X_ILLUME_QUICKPANEL_STATE_OFF);
677 // restore comp layer's position
678 _e_mod_move_quickpanel_comp_layer_obj_move_intern(zone->x, zone->y);
680 memset(anim_data, 0, sizeof(E_Move_Quickpanel_Animation_Data));
682 mb->anim_data = NULL;
688 _e_mod_move_quickpanel_flick_process(E_Move_Border *mb,
693 E_Move_Control_Object *mco = NULL;
695 int mx = 0, my = 0, ax = 0, ay = 0;
697 E_CHECK_RETURN(mb, EINA_FALSE);
698 E_CHECK_RETURN(TYPE_QUICKPANEL_CHECK(mb), EINA_FALSE);
699 E_CHECK_RETURN(state, EINA_FALSE);
704 EINA_LIST_FOREACH(mb->ctl_objs, l, mco) // apptray click unset
707 e_mod_move_event_click_set(mco->event, EINA_FALSE);
710 e_mod_move_flick_data_free(mb);
715 mx = mb->w * -1; my = 0;
716 if (m->qp_scroll_with_clipping)
718 ax = zone->x; ay = zone->y;
726 mx = 0; my = zone->h;
727 if (m->qp_scroll_with_clipping)
729 ax = zone->x + mb->w;
730 ay = zone->y + mb->h;
738 mx = zone->w; my = 0;
739 if (m->qp_scroll_with_clipping)
741 ax = zone->x + mb->w;
742 ay = zone->y + mb->h;
751 mx = 0; my = mb->h * -1;
752 if (m->qp_scroll_with_clipping)
754 ax = zone->x; ay = zone->y;
763 e_mod_move_quickpanel_e_border_move(mb, mx, my);
764 e_mod_move_quickpanel_objs_animation_move(mb, ax, ay);
770 _e_mod_move_quickpanel_dim_objs_apply(E_Move_Border *mb,
779 E_Move_Quickpanel_Data *qp_data = NULL;
782 E_CHECK_RETURN(mb, EINA_FALSE);
783 E_CHECK_RETURN(TYPE_QUICKPANEL_CHECK(mb), EINA_FALSE);
784 E_CHECK_RETURN(mb->data, EINA_FALSE);
786 qp_data = (E_Move_Quickpanel_Data *)mb->data;
787 E_CHECK_RETURN(qp_data->dim_objs, EINA_FALSE);
791 dim_max = mb->m->dim_max_opacity;
796 if (e_mod_move_border_contents_rect_get(mb, &cx, &cy ,&cw, &ch))
800 opacity = dim_max * mx / cw;
808 opacity = dim_max * mx / mb->w;
814 if (e_mod_move_border_contents_rect_get(mb, &cx, &cy ,&cw, &ch))
816 my = zone->h - (cy + y);
818 opacity = dim_max * my / ch;
826 opacity = dim_max * my / zone->h;
832 if (e_mod_move_border_contents_rect_get(mb, &cx, &cy ,&cw, &ch))
834 mx = zone->w - (cx + x);
836 opacity = dim_max * mx / cw;
844 opacity = dim_max * mx / zone->w;
851 if (e_mod_move_border_contents_rect_get(mb, &cx, &cy ,&cw, &ch))
855 opacity = dim_max * my / ch;
863 opacity = dim_max * my / mb->h;
870 e_mod_move_bd_move_dim_objs_opacity_set(qp_data->dim_objs, opacity);
871 qp_data->opacity = opacity;
876 _e_mod_move_quickpanel_below_window_set(void)
881 Eina_Bool found = EINA_FALSE;
883 m = e_mod_move_util_get();
884 E_CHECK_RETURN(m, EINA_FALSE);
886 EINA_INLIST_REVERSE_FOREACH(m->borders, mb)
888 if (!found && TYPE_QUICKPANEL_CHECK(mb))
896 if (!TYPE_QUICKPANEL_CHECK(mb)
897 && !TYPE_INDICATOR_CHECK(mb)
898 && !TYPE_APPTRAY_CHECK(mb)
899 && E_INTERSECTS(mb->x, mb->y, mb->w, mb->h,
900 zone->x, zone->y, zone->w, zone->h)
904 "[MOVE] ev:%15.15s w:0x%08x %s() \n", "EVAS_OBJ",
905 mb->bd->win, __func__);
906 mb->animate_move = EINA_TRUE;
914 _e_mod_move_quickpanel_below_window_unset(void)
919 m = e_mod_move_util_get();
922 EINA_INLIST_REVERSE_FOREACH(m->borders, mb)
925 "[MOVE] ev:%15.15s w:0x%08x %s() \n", "EVAS_OBJ",
926 mb->bd->win, __func__);
927 mb->animate_move = EINA_FALSE;
932 _e_mod_move_quickpanel_below_window_objs_add(void)
936 Eina_Bool mirror = EINA_TRUE;
937 m = e_mod_move_util_get();
938 E_CHECK_RETURN(m, EINA_FALSE);
940 EINA_INLIST_REVERSE_FOREACH(m->borders, mb)
942 if (mb->animate_move)
947 "[MOVE] ev:%15.15s w:0x%08x %s() \n",
948 "EVAS_OBJ", mb->bd->win, __func__);
950 if (TYPE_NOTIFICATION_CHECK(mb))
951 mb->objs = e_mod_move_bd_move_objs_add(mb, !mirror);
954 mb->objs = e_mod_move_bd_move_objs_add(mb, mirror);
955 e_mod_move_bd_move_objs_move(mb, mb->x, mb->y);
956 e_mod_move_bd_move_objs_resize(mb, mb->w, mb->h);
957 e_mod_move_bd_move_objs_show(mb);
967 _e_mod_move_quickpanel_below_window_objs_del(void)
971 m = e_mod_move_util_get();
972 E_CHECK_RETURN(m, EINA_FALSE);
974 EINA_INLIST_REVERSE_FOREACH(m->borders, mb)
976 if (mb->animate_move)
979 "[MOVE] ev:%15.15s w:0x%08x %s() \n",
980 "EVAS_OBJ", mb->bd->win, __func__);
981 e_mod_move_bd_move_objs_del(mb, mb->objs);
989 _e_mod_move_quickpanel_below_window_objs_move(int x,
993 E_Move_Border *mb, *qp_mb;
996 int cx = 0, cy = 0, cw = 0, ch = 0;
998 m = e_mod_move_util_get();
999 E_CHECK_RETURN(m, EINA_FALSE);
1000 qp_mb = e_mod_move_quickpanel_find();
1001 E_CHECK_RETURN(qp_mb, EINA_FALSE);
1003 if (!m->qp_scroll_with_clipping
1004 && !e_mod_move_border_contents_rect_get(qp_mb, &cx, &cy ,&cw, &ch))
1007 angle = qp_mb->angle;
1008 zone = qp_mb->bd->zone;
1010 EINA_INLIST_REVERSE_FOREACH(m->borders, mb)
1012 if (mb->animate_move)
1018 if (m->qp_scroll_with_clipping)
1021 my = y + ch + mb->y;
1024 if (m->qp_scroll_with_clipping)
1027 mx = x + cw + mb->x;
1032 if (m->qp_scroll_with_clipping)
1033 my = mb->y - (zone->h - y);
1035 my = y - ch + mb->y;
1038 if (m->qp_scroll_with_clipping)
1039 mx = mb->x - (zone->w - x);
1041 mx = x - cw + mb->x;
1048 "[MOVE] ev:%15.15s w:0x%08x %s() (%d,%d)\n",
1049 "EVAS_OBJ", mb->bd->win, __func__, mx, my);
1050 e_mod_move_bd_move_objs_move(mb, mx, my);
1054 // if qp_scroll_with_clipping case, make cw / ch data for e_mod_move_util_fb_move()
1055 if (m->qp_scroll_with_clipping)
1070 e_mod_move_util_fb_move(angle, cw, ch, x, y);
1076 _e_mod_move_quickpanel_handle_objs_add(E_Move_Border *mb)
1079 int hx = 0, hy = 0, hw = 0, hh = 0;
1080 E_Move_Quickpanel_Data *qp_data = NULL;
1081 E_CHECK_RETURN(mb, EINA_FALSE);
1082 E_CHECK_RETURN(TYPE_QUICKPANEL_CHECK(mb), EINA_FALSE);
1084 qp_data = (E_Move_Quickpanel_Data *)mb->data;
1085 E_CHECK_RETURN(qp_data, EINA_FALSE);
1087 if (!e_mod_move_border_shape_input_rect_get(mb, &hx, &hy, &hw, &hh))
1091 qp_data->handle_objs = e_mod_move_evas_objs_add(m, mb->bd);
1093 E_CHECK_RETURN(qp_data->handle_objs, EINA_FALSE);
1095 e_mod_move_evas_objs_raise(qp_data->handle_objs);
1096 e_mod_move_evas_objs_move(qp_data->handle_objs, mb->x, mb->y);
1097 e_mod_move_evas_objs_resize(qp_data->handle_objs, mb->w, mb->h);
1098 e_mod_move_evas_objs_show(qp_data->handle_objs);
1100 e_mod_move_evas_objs_clipper_add(qp_data->handle_objs);
1101 e_mod_move_evas_objs_clipper_move(qp_data->handle_objs, mb->x + hx, mb->y + hy);
1102 e_mod_move_evas_objs_clipper_resize(qp_data->handle_objs, hw, hh);
1103 e_mod_move_evas_objs_clipper_show(qp_data->handle_objs);
1105 e_mod_move_evas_objs_del_cb_set(&(qp_data->handle_objs));
1111 _e_mod_move_quickpanel_handle_objs_del(E_Move_Border *mb)
1114 E_Move_Quickpanel_Data *qp_data = NULL;
1115 E_CHECK_RETURN(mb, EINA_FALSE);
1116 E_CHECK_RETURN(TYPE_QUICKPANEL_CHECK(mb), EINA_FALSE);
1118 qp_data = (E_Move_Quickpanel_Data *)mb->data;
1119 E_CHECK_RETURN(qp_data, EINA_FALSE);
1122 E_CHECK_RETURN(qp_data->handle_objs,EINA_FALSE);
1124 e_mod_move_evas_objs_clipper_hide(qp_data->handle_objs);
1125 e_mod_move_evas_objs_clipper_del(qp_data->handle_objs);
1126 e_mod_move_evas_objs_hide(qp_data->handle_objs);
1127 e_mod_move_evas_objs_del(qp_data->handle_objs);
1129 qp_data->handle_objs = NULL;
1135 _e_mod_move_quickpanel_handle_objs_size_update(E_Move_Border *mb,
1139 E_Move_Quickpanel_Data *qp_data = NULL;
1141 E_CHECK_RETURN(mb, EINA_FALSE);
1142 E_CHECK_RETURN(TYPE_QUICKPANEL_CHECK(mb), EINA_FALSE);
1144 qp_data = (E_Move_Quickpanel_Data *)mb->data;
1145 E_CHECK_RETURN(qp_data, EINA_FALSE);
1147 E_CHECK_RETURN(qp_data->handle_objs,EINA_FALSE);
1149 e_mod_move_evas_objs_clipper_resize(qp_data->handle_objs, w, h);
1154 static Eina_Bool _e_mod_move_quickpanel_handle_objs_move(E_Move_Border *mb,
1158 int hx = 0, hy = 0, hw = 0, hh = 0; // handle's x, y, w, h
1159 E_Zone *zone = NULL;
1161 E_Move_Quickpanel_Data *qp_data = NULL;
1163 E_CHECK_RETURN(mb, EINA_FALSE);
1164 E_CHECK_RETURN(TYPE_QUICKPANEL_CHECK(mb), EINA_FALSE);
1166 qp_data = (E_Move_Quickpanel_Data *)mb->data;
1167 E_CHECK_RETURN(qp_data, EINA_FALSE);
1170 E_CHECK_RETURN(qp_data->handle_objs,EINA_FALSE);
1172 if (!e_mod_move_border_shape_input_rect_get(mb, &hx, &hy, &hw, &hh))
1176 zone = mb->bd->zone;
1180 e_mod_move_evas_objs_move(qp_data->handle_objs, x - mb->w + hw, zone->y);
1181 e_mod_move_evas_objs_clipper_move(qp_data->handle_objs, x, zone->y);
1184 e_mod_move_evas_objs_move(qp_data->handle_objs, zone->x, y - hh);
1185 e_mod_move_evas_objs_clipper_move(qp_data->handle_objs, zone->x, y - hh);
1186 // y - hh 's -hh means overlaping app's indicator region
1189 e_mod_move_evas_objs_move(qp_data->handle_objs, x - hw, zone->y);
1190 e_mod_move_evas_objs_clipper_move(qp_data->handle_objs, x - hw, zone->y);
1191 // x - hw 's -hw means overlaping app's indicator region
1195 e_mod_move_evas_objs_move(qp_data->handle_objs, zone->x, y - mb->h + hh);
1196 e_mod_move_evas_objs_clipper_move(qp_data->handle_objs, zone->x, y);
1203 // this function check moving objs go over screen or not
1205 _e_mod_move_quickpanel_objs_check_on_screen(E_Move_Border *mb,
1209 E_Zone *zone = NULL;
1210 Eina_Bool ret = EINA_FALSE;
1211 int hx = 0, hy = 0, hw = 0, hh = 0; // handle's x, y, w, h
1213 E_CHECK_RETURN(mb, FALSE);
1214 E_CHECK_RETURN(TYPE_QUICKPANEL_CHECK(mb), FALSE);
1216 if (!e_mod_move_border_shape_input_rect_get(mb, &hx, &hy, &hw, &hh))
1219 zone = mb->bd->zone;
1222 // don't go over screen
1224 if (x + hw <= zone->x + zone->w) ret = EINA_TRUE;
1227 if (y - hh >= zone->y) ret = EINA_TRUE;
1230 if (x - hw >= zone->x) ret = EINA_TRUE;
1234 if (y + hh <= zone->y + zone->h) ret = EINA_TRUE;
1241 _e_mod_move_quickpanel_animation_change_with_angle(E_Move_Border *mb)
1244 E_Border *bd = NULL;
1245 int ax = 0, ay = 0; // animation x, animation y
1246 int px = 0, py = 0; // position x, position y
1247 int cx = 0, cy = 0, cw = 0, ch = 0;
1248 int curr_angle = 0, prev_angle = 0;
1249 double dist_rate = 0.0;
1250 E_Zone *zone = NULL;
1252 E_CHECK_RETURN(mb, EINA_FALSE);
1253 E_CHECK_RETURN(TYPE_QUICKPANEL_CHECK(mb), EINA_FALSE);
1256 E_CHECK_RETURN(m, EINA_FALSE);
1258 E_CHECK_RETURN(bd, EINA_FALSE);
1260 E_CHECK_RETURN(zone, EINA_FALSE);
1262 if (!e_mod_move_util_win_prop_angle_get(bd->client.win,
1267 if (!e_mod_move_quickpanel_objs_animation_state_get(mb))
1270 if (!_e_mod_move_quickpanel_objs_moving_distance_rate_get(mb, prev_angle, &dist_rate))
1273 // new_position set with distance rate
1277 if (m->qp_scroll_with_clipping)
1278 px = (dist_rate * (zone->x + zone->w));
1281 if (e_mod_move_border_contents_rect_get(mb, &cx, &cy ,&cw, &ch))
1282 px = (dist_rate * (zone->x + zone->w)) - cw;
1284 px = (dist_rate * (zone->x + zone->w)) - mb->w;
1288 if (m->qp_scroll_with_clipping)
1289 py = (1.0 - dist_rate) * (zone->y + zone->h);
1292 if (e_mod_move_border_contents_rect_get(mb, &cx, &cy ,&cw, &ch))
1293 py = (1.0 - dist_rate) * (zone->y + zone->h) - cy;
1295 py = (1.0 - dist_rate) * (zone->y + zone->h);
1299 if (m->qp_scroll_with_clipping)
1300 px = (1.0 - dist_rate) * (zone->x + zone->w);
1303 if (e_mod_move_border_contents_rect_get(mb, &cx, &cy ,&cw, &ch))
1304 px = (1.0 - dist_rate) * (zone->x + zone->w) - ch;
1306 px = (1.0 - dist_rate) * (zone->x + zone->w);
1311 if (m->qp_scroll_with_clipping)
1312 py = (dist_rate * (zone->y + zone->h));
1315 if (e_mod_move_border_contents_rect_get(mb, &cx, &cy ,&cw, &ch))
1316 py = (dist_rate * (zone->y + zone->h)) - ch;
1318 py = (dist_rate * (zone->y + zone->h)) - mb->h;
1322 _e_mod_move_quickpanel_objs_position_set(mb, px, py);
1324 // set info for new animation
1325 switch(e_mod_move_quickpanel_objs_animation_direction_get(mb))
1327 case E_MOVE_ANIMATION_DIRECTION_INSIDE:
1332 if (m->qp_scroll_with_clipping)
1341 if (m->qp_scroll_with_clipping)
1343 ax = zone->x + mb->w;
1344 ay = zone->y + mb->h;
1349 case E_MOVE_ANIMATION_DIRECTION_OUTSIDE:
1354 if (m->qp_scroll_with_clipping)
1356 ax = zone->x; ay = zone->y;
1364 if (m->qp_scroll_with_clipping)
1366 ax = zone->x + mb->w;
1367 ay = zone->y + mb->h;
1375 if (m->qp_scroll_with_clipping)
1377 ax = zone->x + mb->w;
1378 ay = zone->y + mb->h;
1387 if (m->qp_scroll_with_clipping)
1389 ax = zone->x; ay = zone->y;
1399 case E_MOVE_ANIMATION_DIRECTION_NONE:
1404 e_mod_move_quickpanel_objs_animation_stop(mb);
1405 e_mod_move_quickpanel_objs_animation_clear(mb);
1406 e_mod_move_quickpanel_objs_add(mb);
1408 //prevent handler object flickering, if input region update, then show handler again.
1409 _e_mod_move_quickpanel_handle_objs_size_update(mb, 0, 0);
1411 e_mod_move_quickpanel_objs_animation_move(mb, ax, ay);
1416 _e_mod_move_quickpanel_fb_move_change_with_angle(E_Move_Border *mb)
1419 E_Border *bd = NULL;
1421 int cx = 0, cy = 0, cw = 0, ch = 0;
1422 int curr_angle = 0, prev_angle = 0;
1423 E_Zone *zone = NULL;
1425 E_CHECK_RETURN(mb, EINA_FALSE);
1426 E_CHECK_RETURN(TYPE_QUICKPANEL_CHECK(mb), EINA_FALSE);
1429 E_CHECK_RETURN(m, EINA_FALSE);
1431 E_CHECK_RETURN(bd, EINA_FALSE);
1433 E_CHECK_RETURN(zone, EINA_FALSE);
1435 if (!e_mod_move_util_win_prop_angle_get(bd->client.win,
1440 if (e_mod_move_quickpanel_objs_animation_state_get(mb))
1443 if (!E_INTERSECTS(bd->x, bd->y, bd->w, bd->h,
1444 zone->x, zone->y, zone->w, zone->h)) // it work when quickpanel exists inside zone
1447 // if none-clipping scroll and none-content-rect then return, because there are not scroll info
1448 if (!m->qp_scroll_with_clipping
1449 && !e_mod_move_border_contents_rect_get(mb, &cx, &cy ,&cw, &ch))
1455 if (m->qp_scroll_with_clipping)
1457 ax = zone->x + mb->w;
1458 ay = zone->y + mb->h;
1462 if (m->qp_scroll_with_clipping)
1464 ax = zone->x; ay = zone->y;
1468 ay = zone->h - mb->h;
1472 if (m->qp_scroll_with_clipping)
1474 ax = zone->x; ay = zone->y;
1478 ax = zone->w - mb->w;
1483 if (m->qp_scroll_with_clipping)
1485 ax = zone->x + mb->w;
1486 ay = zone->y + mb->h;
1491 if (m->qp_scroll_with_clipping)
1506 e_mod_move_util_fb_move(curr_angle, cw, ch, ax, ay);
1512 _e_mod_move_quickpanel_comp_layer_obj_move(int x,
1516 E_Move_Border *qp_mb;
1519 int cx = 0, cy = 0, cw = 0, ch = 0;
1521 m = e_mod_move_util_get();
1522 E_CHECK_RETURN(m, EINA_FALSE);
1523 qp_mb = e_mod_move_quickpanel_find();
1524 E_CHECK_RETURN(qp_mb, EINA_FALSE);
1525 if (!m->qp_scroll_with_clipping
1526 && !e_mod_move_border_contents_rect_get(qp_mb, &cx, &cy ,&cw, &ch))
1529 angle = qp_mb->angle;
1530 zone = qp_mb->bd->zone;
1536 if (m->qp_scroll_with_clipping)
1539 my = y + ch + zone->y;
1542 if (m->qp_scroll_with_clipping)
1545 mx = x + cw + zone->x;
1550 if (m->qp_scroll_with_clipping)
1551 my = zone->y - (zone->h - y);
1553 my = y - ch + zone->y;
1556 if (m->qp_scroll_with_clipping)
1557 mx = zone->x - (zone->w - x);
1559 mx = x - cw + zone->x;
1566 _e_mod_move_quickpanel_comp_layer_obj_move_intern(mx, my);
1568 // if qp_scroll_with_clipping case, make cw / ch data for e_mod_move_util_fb_move()
1569 if (m->qp_scroll_with_clipping)
1584 e_mod_move_util_fb_move(angle, cw, ch, x, y);
1590 _e_mod_move_quickpanel_comp_layer_obj_move_intern(int x,
1594 Evas_Object *comp_layer = NULL;
1595 Evas_Object *effect_layer = NULL;
1597 m = e_mod_move_util_get();
1598 E_CHECK_RETURN(m, EINA_FALSE);
1600 comp_layer = e_mod_move_util_comp_layer_get(m, "comp");
1603 evas_object_move(comp_layer, x, y);
1605 "[MOVE] ev:%15.15s comp_layer_obj:0x%x %s() (%d,%d)\n",
1606 "EVAS_OBJ", comp_layer, __func__, x, y);
1610 effect_layer = e_mod_move_util_comp_layer_get(m, "effect");
1613 evas_object_move(effect_layer, x, y);
1615 "[MOVE] ev:%15.15s effect_layer_obj:0x%x %s() (%d,%d)\n",
1616 "EVAS_OBJ", effect_layer, __func__, x, y);
1622 /* externally accessible functions */
1624 e_mod_move_quickpanel_ctl_obj_event_setup(E_Move_Border *mb,
1625 E_Move_Control_Object *mco)
1629 E_CHECK(TYPE_QUICKPANEL_CHECK(mb));
1631 mco->event = e_mod_move_event_new(mb->bd->client.win, mco->obj);
1632 E_CHECK(mco->event);
1634 e_mod_move_event_data_type_set(mco->event, E_MOVE_EVENT_DATA_TYPE_BORDER);
1635 e_mod_move_event_angle_cb_set(mco->event,
1636 e_mod_move_util_win_prop_angle_get);
1637 e_mod_move_event_cb_set(mco->event, E_MOVE_EVENT_TYPE_MOTION_START,
1638 _e_mod_move_quickpanel_cb_motion_start, mb);
1639 e_mod_move_event_cb_set(mco->event, E_MOVE_EVENT_TYPE_MOTION_MOVE,
1640 _e_mod_move_quickpanel_cb_motion_move, mb);
1641 e_mod_move_event_cb_set(mco->event, E_MOVE_EVENT_TYPE_MOTION_END,
1642 _e_mod_move_quickpanel_cb_motion_end, mb);
1643 e_mod_move_event_propagate_type_set(mco->event,
1644 E_MOVE_EVENT_PROPAGATE_TYPE_IMMEDIATELY);
1647 EINTERN E_Move_Border *
1648 e_mod_move_quickpanel_base_find(void)
1653 m = e_mod_move_util_get();
1654 E_CHECK_RETURN(m, 0);
1656 EINA_INLIST_REVERSE_FOREACH(m->borders, mb)
1658 if (TYPE_QUICKPANEL_BASE_CHECK(mb)) return mb;
1663 EINTERN E_Move_Border *
1664 e_mod_move_quickpanel_find(void)
1669 m = e_mod_move_util_get();
1670 E_CHECK_RETURN(m, 0);
1672 EINA_INLIST_REVERSE_FOREACH(m->borders, mb)
1674 if (TYPE_QUICKPANEL_CHECK(mb)) return mb;
1680 e_mod_move_quickpanel_click_get(void)
1682 E_Move_Border *mb = NULL;
1683 Eina_Bool click = EINA_FALSE;
1684 E_Move_Control_Object *mco = NULL;
1687 mb = e_mod_move_quickpanel_find();
1688 E_CHECK_RETURN(mb, EINA_FALSE);
1690 EINA_LIST_FOREACH(mb->ctl_objs, l, mco)
1693 click = e_mod_move_event_click_get(mco->event);
1700 e_mod_move_quickpanel_event_clear(void)
1702 E_Move_Border *mb = NULL;
1703 Eina_Bool click = EINA_FALSE;
1704 E_Move_Control_Object *mco = NULL;
1707 mb = e_mod_move_quickpanel_find();
1708 E_CHECK_RETURN(mb, EINA_FALSE);
1710 click = e_mod_move_quickpanel_click_get();
1711 E_CHECK_RETURN(click, EINA_FALSE);
1713 EINA_LIST_FOREACH(mb->ctl_objs, l, mco)
1716 e_mod_move_event_data_clear(mco->event);
1717 e_mod_move_event_click_set(mco->event, EINA_FALSE);
1720 if (mb->flick_data) e_mod_move_flick_data_free(mb);
1726 e_mod_move_quickpanel_objs_add(E_Move_Border *mb)
1729 Eina_Bool mirror = EINA_TRUE;
1730 Evas_Object *move_layer = NULL;
1731 E_CHECK_RETURN(mb, EINA_FALSE);
1732 E_CHECK_RETURN(TYPE_QUICKPANEL_CHECK(mb), EINA_FALSE);
1736 move_layer = e_mod_move_util_comp_layer_get(m, "move");
1737 E_CHECK_RETURN(move_layer, EINA_FALSE);
1741 mb->objs = e_mod_move_bd_move_objs_add(mb, mirror);
1742 e_mod_move_bd_move_objs_move(mb, mb->x, mb->y);
1743 e_mod_move_bd_move_objs_resize(mb, mb->w, mb->h);
1744 e_mod_move_bd_move_objs_show(mb);
1746 e_mod_move_util_screen_input_block(m);
1748 if (!evas_object_visible_get(move_layer))
1749 evas_object_show(move_layer);
1751 if (mb->objs) e_mod_move_util_rotation_lock(mb->m);
1753 if (m->qp_scroll_with_clipping)
1755 e_mod_move_quickpanel_objs_clipper_add(mb);
1756 _e_mod_move_quickpanel_handle_objs_add(mb);
1763 e_mod_move_quickpanel_objs_del(E_Move_Border *mb)
1766 Evas_Object *move_layer = NULL;
1767 E_CHECK_RETURN(mb, EINA_FALSE);
1768 E_CHECK_RETURN(TYPE_QUICKPANEL_CHECK(mb), EINA_FALSE);
1771 move_layer = e_mod_move_util_comp_layer_get(m, "move");
1772 E_CHECK_RETURN(move_layer, EINA_FALSE);
1774 if (evas_object_visible_get(move_layer))
1775 evas_object_hide(move_layer);
1777 if (m->qp_scroll_with_clipping)
1779 e_mod_move_quickpanel_objs_clipper_del(mb);
1780 _e_mod_move_quickpanel_handle_objs_del(mb);
1783 e_mod_move_bd_move_objs_del(mb, mb->objs);
1784 e_mod_move_util_rotation_unlock(mb->m);
1785 e_mod_move_util_screen_input_unblock(mb->m);
1793 e_mod_move_quickpanel_objs_move(E_Move_Border *mb,
1798 E_Zone *zone = NULL;
1799 int cx = 0, cy = 0, cw = 0, ch = 0;
1801 E_CHECK_RETURN(mb, EINA_FALSE);
1802 E_CHECK_RETURN(TYPE_QUICKPANEL_CHECK(mb), EINA_FALSE);
1805 zone = mb->bd->zone;
1807 _e_mod_move_quickpanel_objs_position_set(mb, x, y);
1810 if (m->qp_scroll_with_clipping)
1812 e_mod_move_bd_move_objs_move(mb, zone->x, zone->y); // in general, zone->x:0, zone->y: 0
1813 e_mod_move_quickpanel_objs_clipper_apply(mb, x, y); // move clipper
1815 // check handle & below window don't go over screen
1816 if (!_e_mod_move_quickpanel_objs_check_on_screen(mb, x , y))
1819 _e_mod_move_quickpanel_handle_objs_move(mb, x, y);; // move handle (mirror with clipper) object
1821 if (m->qp_scroll_with_visible_win)
1823 if (POINT_INSIDE_ZONE(x, y, zone))
1824 _e_mod_move_quickpanel_comp_layer_obj_move(x, y);
1829 e_mod_move_bd_move_objs_move(mb, x, y);
1830 _e_mod_move_quickpanel_dim_objs_apply(mb, x, y);
1832 if (m->qp_scroll_with_visible_win)
1834 if (e_mod_move_border_contents_rect_get(mb, &cx, &cy ,&cw, &ch))
1836 if (E_INTERSECTS(x+cx, y+cy, cw, ch, zone->x, zone->y, zone->w, zone->h))
1837 _e_mod_move_quickpanel_comp_layer_obj_move(x, y);
1845 e_mod_move_quickpanel_objs_animation_move_with_time(E_Move_Border *mb,
1850 E_Move_Quickpanel_Animation_Data *anim_data = NULL;
1851 Ecore_Animator *animator = NULL;
1852 int sx, sy; //start x, start y
1855 E_CHECK_RETURN(mb, EINA_FALSE);
1856 E_CHECK_RETURN(TYPE_QUICKPANEL_CHECK(mb), EINA_FALSE);
1857 E_CHECK_RETURN(mb->m, EINA_FALSE);
1859 if (e_mod_move_quickpanel_objs_animation_state_get(mb))
1861 e_mod_move_quickpanel_objs_animation_stop(mb);
1862 e_mod_move_quickpanel_objs_animation_clear(mb);
1865 anim_data = E_NEW(E_Move_Quickpanel_Animation_Data, 1);
1866 E_CHECK_RETURN(anim_data, EINA_FALSE);
1868 if (_e_mod_move_quickpanel_objs_position_get(mb, &sx, &sy))
1875 // below cases are quickpanel is on screen case, so set start position with quickpanel's screen position
1876 if (mb->m->qp_scroll_with_clipping)
1884 anim_data->sx = mb->x + mb->w;
1885 anim_data->sy = mb->y + mb->h;
1889 anim_data->sx = mb->x;
1890 anim_data->sy = mb->y;
1896 anim_data->sx = mb->x;
1897 anim_data->sy = mb->y;
1899 _e_mod_move_quickpanel_objs_position_set(mb,
1906 anim_data->dx = anim_data->ex - anim_data->sx;
1907 anim_data->dy = anim_data->ey - anim_data->sy;
1909 animator = ecore_animator_timeline_add(anim_time,
1910 _e_mod_move_quickpanel_objs_animation_frame,
1914 memset(anim_data, 0, sizeof(E_Move_Quickpanel_Animation_Data));
1919 anim_data->animator = animator;
1920 anim_data->animating = EINA_TRUE;
1921 mb->anim_data = anim_data;
1927 e_mod_move_quickpanel_objs_animation_move(E_Move_Border *mb,
1931 double anim_time = 0.0;
1933 E_CHECK_RETURN(mb, EINA_FALSE);
1934 E_CHECK_RETURN(TYPE_QUICKPANEL_CHECK(mb), EINA_FALSE);
1935 E_CHECK_RETURN(mb->m, EINA_FALSE);
1936 anim_time = mb->m->animation_duration;
1937 return e_mod_move_quickpanel_objs_animation_move_with_time(mb, x, y, anim_time);
1941 e_mod_move_quickpanel_objs_animation_state_get(E_Move_Border *mb)
1943 E_Move_Quickpanel_Animation_Data *anim_data = NULL;
1944 E_CHECK_RETURN(mb, EINA_FALSE);
1945 E_CHECK_RETURN(TYPE_QUICKPANEL_CHECK(mb), EINA_FALSE);
1947 E_CHECK_RETURN(mb->anim_data, EINA_FALSE);
1948 anim_data = (E_Move_Quickpanel_Animation_Data *)mb->anim_data;
1949 E_CHECK_RETURN(anim_data->animating, EINA_FALSE);
1953 EINTERN E_Move_Animation_Direction
1954 e_mod_move_quickpanel_objs_animation_direction_get(E_Move_Border *mb)
1956 E_Border *bd = NULL;
1957 E_Zone *zone = NULL;
1958 E_Move_Quickpanel_Animation_Data *anim_data = NULL;
1959 E_CHECK_RETURN(mb, E_MOVE_ANIMATION_DIRECTION_NONE);
1960 E_CHECK_RETURN(TYPE_QUICKPANEL_CHECK(mb), E_MOVE_ANIMATION_DIRECTION_NONE);
1962 E_CHECK_RETURN(bd, E_MOVE_ANIMATION_DIRECTION_NONE);
1964 E_CHECK_RETURN(zone, E_MOVE_ANIMATION_DIRECTION_NONE);
1965 E_CHECK_RETURN(mb->anim_data, E_MOVE_ANIMATION_DIRECTION_NONE);
1966 anim_data = (E_Move_Quickpanel_Animation_Data *)mb->anim_data;
1968 if (E_INTERSECTS(bd->x, bd->y, bd->w, bd->h,
1969 zone->x, zone->y, zone->w, zone->h))
1971 // animation's end position is inside zone.
1972 return E_MOVE_ANIMATION_DIRECTION_INSIDE;
1976 // animation's end position is outside zone.
1977 return E_MOVE_ANIMATION_DIRECTION_OUTSIDE;
1982 e_mod_move_quickpanel_objs_animation_stop(E_Move_Border *mb)
1984 E_Move_Quickpanel_Animation_Data *anim_data = NULL;
1985 E_CHECK_RETURN(mb, EINA_FALSE);
1986 E_CHECK_RETURN(TYPE_QUICKPANEL_CHECK(mb), EINA_FALSE);
1988 E_CHECK_RETURN(mb->anim_data, EINA_FALSE);
1989 anim_data = (E_Move_Quickpanel_Animation_Data *)mb->anim_data;
1990 ecore_animator_freeze(anim_data->animator);
1995 e_mod_move_quickpanel_objs_animation_clear(E_Move_Border *mb)
1997 E_Move_Quickpanel_Animation_Data *anim_data = NULL;
1998 E_CHECK_RETURN(mb, EINA_FALSE);
1999 E_CHECK_RETURN(TYPE_QUICKPANEL_CHECK(mb), EINA_FALSE);
2001 E_CHECK_RETURN(mb->anim_data, EINA_FALSE);
2002 anim_data = (E_Move_Quickpanel_Animation_Data *)mb->anim_data;
2003 ecore_animator_del(anim_data->animator);
2004 memset(anim_data, 0, sizeof(E_Move_Quickpanel_Animation_Data));
2006 mb->anim_data = NULL;
2012 e_mod_move_quickpanel_internal_data_add(E_Move_Border *mb)
2015 E_Move_Quickpanel_Data *qp_data = NULL;
2016 E_CHECK_RETURN(mb, NULL);
2017 E_CHECK_RETURN(TYPE_QUICKPANEL_CHECK(mb), NULL);
2018 E_CHECK_RETURN(mb->m, NULL);
2019 dim_min = mb->m->dim_min_opacity;
2020 qp_data = (E_Move_Quickpanel_Data *)mb->data;
2023 qp_data = E_NEW(E_Move_Quickpanel_Data, 1);
2024 E_CHECK_RETURN(qp_data, NULL);
2027 qp_data->dim_objs = NULL;
2028 qp_data->opacity = dim_min;
2035 e_mod_move_quickpanel_internal_data_del(E_Move_Border *mb)
2037 E_Move_Quickpanel_Data *qp_data = NULL;
2038 E_CHECK_RETURN(mb, EINA_FALSE);
2039 E_CHECK_RETURN(TYPE_QUICKPANEL_CHECK(mb), EINA_FALSE);
2040 E_CHECK_RETURN(mb->data, EINA_FALSE);
2041 qp_data = (E_Move_Quickpanel_Data *)mb->data;
2043 if (mb->m->qp_scroll_with_clipping) // "scroll with clipping" uses handle objs so delete here.
2045 _e_mod_move_quickpanel_handle_objs_del(mb);
2047 else // general quickpanel scroll uses dim objs so delete here.
2049 e_mod_move_quickpanel_dim_hide(mb);
2052 // Set No Composite Mode & Rotation UnLock & Destroy below win's mirror object
2053 e_mod_move_quickpanel_stage_deinit(mb);
2061 e_mod_move_quickpanel_e_border_move(E_Move_Border *mb,
2066 E_Border *bd = NULL;
2067 E_Zone *zone = NULL;
2068 E_Move_Border *find_mb = NULL;
2070 E_CHECK_RETURN(mb, EINA_FALSE);
2071 E_CHECK_RETURN(TYPE_QUICKPANEL_CHECK(mb), EINA_FALSE);
2072 E_CHECK_RETURN(mb->bd, EINA_FALSE);
2077 if (E_CONTAINS(zone->x, zone->y, zone->w, zone->h, x, y, mb->w, mb->h))// On Screen Case, if zone contains border geometry?
2079 win = e_mod_move_util_client_xid_get(mb);
2081 EINA_INLIST_REVERSE_FOREACH(m->borders, find_mb)
2083 if (find_mb->visible)
2086 ecore_x_e_illume_quickpanel_state_send(find_mb->bd->client.win,
2087 ECORE_X_ILLUME_QUICKPANEL_STATE_ON);
2091 if (find_mb->bd && find_mb->bd->iconic)
2092 ecore_x_e_illume_quickpanel_state_send(find_mb->bd->client.win,
2093 ECORE_X_ILLUME_QUICKPANEL_STATE_ON);
2097 ecore_x_e_illume_quickpanel_state_set(zone->black_win, ECORE_X_ILLUME_QUICKPANEL_STATE_ON);
2100 e_border_move(bd, x, y);
2106 e_mod_move_quickpanel_dim_show(E_Move_Border *mb)
2110 E_Move_Quickpanel_Data *qp_data = NULL;
2111 E_CHECK_RETURN(mb, NULL);
2112 E_CHECK_RETURN(TYPE_QUICKPANEL_CHECK(mb), NULL);
2113 qp_data = (E_Move_Quickpanel_Data *)mb->data;
2115 dim_min = m->dim_min_opacity;
2118 qp_data = E_NEW(E_Move_Quickpanel_Data, 1);
2119 E_CHECK_RETURN(qp_data, NULL);
2123 qp_data->dim_objs = e_mod_move_bd_move_dim_objs_add(mb);
2124 e_mod_move_bd_move_dim_objs_show(qp_data->dim_objs);
2125 qp_data->opacity = dim_min;
2130 if (!(qp_data->dim_objs))
2131 qp_data->dim_objs = e_mod_move_bd_move_dim_objs_add(mb);
2133 if (qp_data->dim_objs)
2135 e_mod_move_bd_move_dim_objs_show(qp_data->dim_objs);
2136 qp_data->opacity = dim_min;
2141 "[MOVE] ev:%15.15s w:0x%08x %s()\n",
2142 "EVAS_OBJ", mb->bd ? mb->bd->win : 0, __func__);
2144 return qp_data->dim_objs;
2148 e_mod_move_quickpanel_dim_hide(E_Move_Border *mb)
2152 E_Move_Quickpanel_Data *qp_data = NULL;
2153 E_CHECK_RETURN(mb, EINA_FALSE);
2154 E_CHECK_RETURN(TYPE_QUICKPANEL_CHECK(mb), EINA_FALSE);
2155 E_CHECK_RETURN(mb->m, EINA_FALSE);
2156 E_CHECK_RETURN(mb->data, EINA_FALSE);
2157 dim_min = mb->m->dim_min_opacity;
2158 qp_data = (E_Move_Quickpanel_Data *)mb->data;
2159 E_CHECK_RETURN(qp_data->dim_objs, EINA_FALSE);
2160 e_mod_move_bd_move_dim_objs_hide(qp_data->dim_objs);
2161 e_mod_move_bd_move_dim_objs_del(qp_data->dim_objs);
2162 qp_data->dim_objs = NULL;
2163 qp_data->opacity = dim_min;
2167 "[MOVE] ev:%15.15s w:0x%08x %s()\n",
2168 "EVAS_OBJ", ((mb->bd) ? mb->bd->win : NULL), __func__);
2174 e_mod_move_quickpanel_objs_animation_start_position_set(E_Move_Border *mb,
2177 int x = 0; int y = 0;
2178 int cx = 0; int cy = 0; int cw = 0; int ch = 0;
2179 E_Zone *zone = NULL;
2183 E_CHECK_RETURN(mb, EINA_FALSE);
2184 E_CHECK_RETURN(TYPE_QUICKPANEL_CHECK(mb), EINA_FALSE);
2187 zone = mb->bd->zone;
2188 angle = ((angle % 360) / 90) * 90;
2189 contents = e_mod_move_border_contents_rect_get(mb, &cx, &cy ,&cw, &ch);
2191 if (m->qp_scroll_with_clipping)
2198 x = mb->x; y = mb->y;
2202 x = mb->x + mb->w; y = mb->y + mb->h;
2218 y = zone->y + zone->h - cy;
2220 y = zone->y + zone->h;
2224 x = zone->x + zone->w - cx;
2226 x = zone->x + zone->w;
2238 _e_mod_move_quickpanel_objs_position_set(mb, x, y);
2243 EINTERN E_Move_Event_Cb
2244 e_mod_move_quickpanel_event_cb_get(E_Move_Event_Type type)
2246 if (type == E_MOVE_EVENT_TYPE_MOTION_START)
2247 return _e_mod_move_quickpanel_cb_motion_start;
2248 else if (type == E_MOVE_EVENT_TYPE_MOTION_MOVE)
2249 return _e_mod_move_quickpanel_cb_motion_move;
2250 else if (type == E_MOVE_EVENT_TYPE_MOTION_END)
2251 return _e_mod_move_quickpanel_cb_motion_end;
2257 e_mod_move_quickpanel_visible_check(void)
2261 mb = e_mod_move_quickpanel_find();
2262 E_CHECK_RETURN(mb, EINA_FALSE);
2263 E_CHECK_RETURN(mb->visible, EINA_FALSE);
2265 zone = mb->bd->zone;
2266 E_CHECK_RETURN(REGION_INSIDE_ZONE(mb, zone), EINA_FALSE);
2272 e_mod_move_quickpanel_below_window_reset(void)
2274 E_Move *m = e_mod_move_util_get();
2275 E_CHECK_RETURN(m, EINA_FALSE);
2280 e_mod_move_quickpanel_objs_clipper_add(E_Move_Border *mb)
2282 E_CHECK_RETURN(mb, EINA_FALSE);
2283 E_CHECK_RETURN(TYPE_QUICKPANEL_CHECK(mb), EINA_FALSE);
2285 e_mod_move_bd_move_objs_clipper_add(mb);
2286 e_mod_move_bd_move_objs_clipper_move(mb, mb->x, mb->y);
2287 e_mod_move_bd_move_objs_clipper_resize(mb, mb->w, mb->h);
2288 e_mod_move_bd_move_objs_clipper_show(mb);
2294 e_mod_move_quickpanel_objs_clipper_del(E_Move_Border *mb)
2296 E_CHECK_RETURN(mb, EINA_FALSE);
2297 E_CHECK_RETURN(TYPE_QUICKPANEL_CHECK(mb), EINA_FALSE);
2299 e_mod_move_bd_move_objs_clipper_hide(mb);
2300 e_mod_move_bd_move_objs_clipper_del(mb);
2305 e_mod_move_quickpanel_objs_clipper_apply(E_Move_Border *mb, int x, int y)
2307 int cx = 0, cy = 0, cw = 0, ch = 0; // clip_x, clip_y, clip_w, clip_h
2309 E_Zone *zone = NULL;
2311 E_CHECK_RETURN(mb, EINA_FALSE);
2312 E_CHECK_RETURN(TYPE_QUICKPANEL_CHECK(mb), EINA_FALSE);
2314 zone = mb->bd->zone;
2342 e_mod_move_bd_move_objs_clipper_move(mb, cx, cy);
2343 e_mod_move_bd_move_objs_clipper_resize(mb, cw, ch);
2349 e_mod_move_quickpanel_stage_init(E_Move_Border *mb)
2352 E_CHECK_RETURN(mb, EINA_FALSE);
2353 E_CHECK_RETURN(TYPE_QUICKPANEL_CHECK(mb), EINA_FALSE);
2357 // Composite mode set true
2358 e_mod_move_util_compositor_composite_mode_set(m, EINA_TRUE);
2364 e_mod_move_quickpanel_stage_deinit(E_Move_Border *mb)
2367 E_CHECK_RETURN(mb, EINA_FALSE);
2368 E_CHECK_RETURN(TYPE_QUICKPANEL_CHECK(mb), EINA_FALSE);
2372 // Composite mode set false
2373 e_mod_move_util_compositor_composite_mode_set(m, EINA_FALSE);
2378 e_mod_move_quickpanel_angle_change_post_job(E_Move_Border *mb)
2380 E_CHECK_RETURN(mb, EINA_FALSE);
2381 E_CHECK_RETURN(TYPE_QUICKPANEL_CHECK(mb), EINA_FALSE);
2383 if (e_mod_move_quickpanel_objs_animation_state_get(mb))
2384 return _e_mod_move_quickpanel_animation_change_with_angle(mb);
2386 return _e_mod_move_quickpanel_fb_move_change_with_angle(mb);
2390 _e_mod_move_quickpanel_objs_outside_movable_pos_get(E_Move_Border *mb,
2393 // while quickpanel is animating,
2394 // if quickpanel angle changed, qp_objs move could fail. so qp_objs move again with changed angle.
2399 E_Zone *zone = NULL;
2400 E_Border *bd = NULL;
2401 E_CHECK_RETURN(x, EINA_FALSE);
2402 E_CHECK_RETURN(y, EINA_FALSE);
2403 E_CHECK_RETURN(mb, EINA_FALSE);
2404 E_CHECK_RETURN(TYPE_QUICKPANEL_CHECK(mb), EINA_FALSE);
2407 E_CHECK_RETURN(m, EINA_FALSE);
2409 E_CHECK_RETURN(bd, EINA_FALSE);
2411 E_CHECK_RETURN(zone, EINA_FALSE);
2417 if (m->qp_scroll_with_clipping)
2419 ax = zone->x; ay = zone->y;
2427 if (m->qp_scroll_with_clipping)
2429 ax = zone->x + mb->w;
2430 ay = zone->y + mb->h;
2438 if (m->qp_scroll_with_clipping)
2440 ax = zone->x + mb->w;
2441 ay = zone->y + mb->h;
2450 if (m->qp_scroll_with_clipping)
2452 ax = zone->x; ay = zone->y;
2466 e_mod_move_quickpanel_window_input_region_change_post_job(E_Move_Border *mb)
2469 int hx = 0, hy = 0, hw = 0, hh = 0; // handle's x, y, w, h
2471 E_CHECK_RETURN(mb, EINA_FALSE);
2472 E_CHECK_RETURN(TYPE_QUICKPANEL_CHECK(mb), EINA_FALSE);
2475 E_CHECK_RETURN(m, EINA_FALSE);
2477 if (m->qp_scroll_with_clipping)
2479 if (e_mod_move_border_shape_input_rect_get(mb, &hx, &hy, &hw, &hh))
2480 _e_mod_move_quickpanel_handle_objs_size_update(mb, hw, hh);
2487 e_mod_move_quickpanel_anim_state_send(E_Move_Border *mb,
2490 long d[5] = {0L, 0L, 0L, 0L, 0L};
2492 E_CHECK_RETURN(mb, EINA_FALSE);
2493 E_CHECK_RETURN(TYPE_QUICKPANEL_CHECK(mb), EINA_FALSE);
2495 win = e_mod_move_util_client_xid_get(mb);
2496 E_CHECK_RETURN(win, 0);
2498 if (state) d[0] = 1L;
2501 ecore_x_client_message32_send
2502 (win, ATOM_MV_QUICKPANEL_STATE,
2503 ECORE_X_EVENT_MASK_WINDOW_CONFIGURE,
2504 d[0], d[1], d[2], d[3], d[4]);