diff options
author | Mike Blumenkrantz <zmike@osg.samsung.com> | 2014-07-30 19:28:55 -0400 |
---|---|---|
committer | Mike Blumenkrantz <zmike@osg.samsung.com> | 2014-08-07 10:23:59 -0400 |
commit | 6191dca3343ce85f69e2d4934dc97fdebcbab191 (patch) | |
tree | 6e20950454e2fdd5db0d28d49210c2418e315926 | |
parent | 4e7c44d534d4443fb5af71d04ea6b2ac0810f4e8 (diff) | |
download | enlightenment-devs/discomfitor/align.tar.gz |
feature: add alignment client menudevs/discomfitor/align
-rw-r--r-- | src/bin/e_int_client_menu.c | 236 |
1 files changed, 236 insertions, 0 deletions
diff --git a/src/bin/e_int_client_menu.c b/src/bin/e_int_client_menu.c index 2a1eb45197..1c216ef012 100644 --- a/src/bin/e_int_client_menu.c +++ b/src/bin/e_int_client_menu.c @@ -34,6 +34,7 @@ static void _e_client_menu_cb_skip_winlist(void *data, E_Menu *m, E_Menu_Item *m static void _e_client_menu_cb_skip_pager(void *data, E_Menu *m, E_Menu_Item *mi); static void _e_client_menu_cb_skip_taskbar(void *data, E_Menu *m, E_Menu_Item *mi); static void _e_client_menu_cb_sendto_pre(void *data, E_Menu *m, E_Menu_Item *mi); +static void _e_client_menu_cb_align_pre(void *data, E_Menu *m, E_Menu_Item *mi); static void _e_client_menu_cb_sendto(void *data, E_Menu *m, E_Menu_Item *mi); static void _e_client_menu_cb_pin(void *data, E_Menu *m, E_Menu_Item *mi); static void _e_client_menu_cb_unpin(void *data, E_Menu *m, E_Menu_Item *mi); @@ -148,6 +149,13 @@ e_int_client_menu_create(E_Client *ec) "e/widgets/border/default/sendto"); } + if ((!ec->lock_user_location) && (!ec->iconic) && (!ec->maximized) && (!ec->fullscreen)) + { + mi = e_menu_item_new(m); + e_menu_item_label_set(mi, _("Align")); + e_menu_item_submenu_pre_callback_set(mi, _e_client_menu_cb_align_pre, ec); + } + mi = e_menu_item_new(m); e_menu_item_label_set(mi, _("Always on Top")); e_menu_item_check_set(mi, 1); @@ -958,6 +966,234 @@ _e_client_menu_cb_sendto_icon_pre(void *data, E_Menu *m, E_Menu_Item *mi) #endif static void +_e_client_menu_cb_align_setup(E_Client *ec, Evas_Object_Event_Cb cb) +{ + E_Notification_Notify n; + Evas_Object *o; + + memset(&n, 0, sizeof(E_Notification_Notify)); + n.timeout = 3000; + n.summary = _("Alignment"); + n.body = _("Click an object to align with."); + n.urgency = E_NOTIFICATION_NOTIFY_URGENCY_NORMAL; + e_notification_client_send(&n, NULL, NULL); + + o = evas_object_rectangle_add(ec->comp->evas); + evas_object_resize(o, ec->comp->man->w, ec->comp->man->h); + evas_object_color_set(o, 0, 0, 0, 0); + evas_object_layer_set(o, E_LAYER_POPUP); + evas_object_show(o); + evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_DOWN, cb, ec); + e_comp_shape_queue(ec->comp); +} + +static Evas_Object * +_e_client_menu_cb_align_cb(Evas *e, Evas_Object *obj, Evas_Event_Mouse_Down *ev) +{ + evas_object_hide(obj); + evas_object_del(obj); + e_comp_shape_queue(e_comp_util_evas_object_comp_get(obj)); + return evas_object_top_at_xy_get(e, ev->output.x, ev->output.y, 0, 0); +} + +static void +_e_client_menu_cb_align_on_center(E_Client *ec, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Down *ev) +{ + Evas_Object *o; + + o = _e_client_menu_cb_align_cb(e, obj, ev); + e_comp_object_util_center_on(ec->frame, o); +} + +static void +_e_client_menu_cb_align_center(void *data, E_Menu *m, E_Menu_Item *mi EINA_UNUSED) +{ + E_Client *ec = e_object_data_get(E_OBJECT(m)); + + if (data) + _e_client_menu_cb_align_setup(ec, (Evas_Object_Event_Cb)_e_client_menu_cb_align_on_center); + else + e_comp_object_util_center(ec->frame); +} + +static void +_e_client_menu_cb_align_on_top(E_Client *ec, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Down *ev) +{ + Evas_Object *o; + int y; + + o = _e_client_menu_cb_align_cb(e, obj, ev); + evas_object_geometry_get(o, NULL, &y, NULL, NULL); + evas_object_move(ec->frame, ec->x, y); +} + +static void +_e_client_menu_cb_align_top(void *data, E_Menu *m, E_Menu_Item *mi EINA_UNUSED) +{ + E_Client *ec = e_object_data_get(E_OBJECT(m)); + + if (data) + _e_client_menu_cb_align_setup(ec, (Evas_Object_Event_Cb)_e_client_menu_cb_align_on_top); + else + { + int y; + + e_zone_useful_geometry_get(ec->zone, NULL, &y, NULL, NULL); + evas_object_move(ec->frame, ec->x, y); + } +} + +static void +_e_client_menu_cb_align_on_left(E_Client *ec, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Down *ev) +{ + Evas_Object *o; + int x; + + o = _e_client_menu_cb_align_cb(e, obj, ev); + evas_object_geometry_get(o, &x, NULL, NULL, NULL); + evas_object_move(ec->frame, x, ec->y); +} + +static void +_e_client_menu_cb_align_left(void *data, E_Menu *m, E_Menu_Item *mi EINA_UNUSED) +{ + E_Client *ec = e_object_data_get(E_OBJECT(m)); + + if (data) + _e_client_menu_cb_align_setup(ec, (Evas_Object_Event_Cb)_e_client_menu_cb_align_on_left); + else + { + int x; + + e_zone_useful_geometry_get(ec->zone, &x, NULL, NULL, NULL); + evas_object_move(ec->frame, x, ec->y); + } +} + +static void +_e_client_menu_cb_align_on_right(E_Client *ec, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Down *ev) +{ + Evas_Object *o; + int x, w; + + o = _e_client_menu_cb_align_cb(e, obj, ev); + evas_object_geometry_get(o, &x, NULL, &w, NULL); + evas_object_move(ec->frame, x + w - ec->w, ec->y); +} + +static void +_e_client_menu_cb_align_right(void *data, E_Menu *m, E_Menu_Item *mi EINA_UNUSED) +{ + E_Client *ec = e_object_data_get(E_OBJECT(m)); + + if (data) + _e_client_menu_cb_align_setup(ec, (Evas_Object_Event_Cb)_e_client_menu_cb_align_on_right); + else + { + int x, w; + + e_zone_useful_geometry_get(ec->zone, &x, NULL, &w, NULL); + evas_object_move(ec->frame, x + w - ec->w, ec->y); + } +} + +static void +_e_client_menu_cb_align_on_bottom(E_Client *ec, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Down *ev) +{ + Evas_Object *o; + int y, h; + + o = _e_client_menu_cb_align_cb(e, obj, ev); + evas_object_geometry_get(o, NULL, &y, NULL, &h); + evas_object_move(ec->frame, ec->x, y + h - ec->h); +} + +static void +_e_client_menu_cb_align_bottom(void *data, E_Menu *m, E_Menu_Item *mi EINA_UNUSED) +{ + E_Client *ec = e_object_data_get(E_OBJECT(m)); + + if (data) + _e_client_menu_cb_align_setup(ec, (Evas_Object_Event_Cb)_e_client_menu_cb_align_on_bottom); + else + { + int y, h; + + e_zone_useful_geometry_get(ec->zone, NULL, &y, NULL, &h); + evas_object_move(ec->frame, ec->x, y + h - ec->h); + } +} + +static void +_e_client_menu_cb_align_pre(void *data, E_Menu *m EINA_UNUSED, E_Menu_Item *mi) +{ + E_Menu *subm, *mm; + E_Menu_Item *submi; + E_Client *ec = data; + + subm = e_menu_new(); + e_menu_title_set(subm, _("Alignment")); + e_object_data_set(E_OBJECT(subm), ec); + e_menu_item_submenu_set(mi, subm); + e_object_unref(E_OBJECT(subm)); + + submi = e_menu_item_new(subm); + e_menu_item_label_set(submi, _("Center")); + e_menu_item_callback_set(submi, _e_client_menu_cb_align_center, NULL); + mm = e_menu_new(); + e_object_data_set(E_OBJECT(mm), ec); + e_menu_item_submenu_set(submi, mm); + e_object_unref(E_OBJECT(mm)); + submi = e_menu_item_new(mm); + e_menu_item_label_set(submi, _("On window...")); + e_menu_item_callback_set(submi, _e_client_menu_cb_align_center, (void*)1); + + submi = e_menu_item_new(subm); + e_menu_item_label_set(submi, _("Top")); + e_menu_item_callback_set(submi, _e_client_menu_cb_align_top, NULL); + mm = e_menu_new(); + e_object_data_set(E_OBJECT(mm), ec); + e_menu_item_submenu_set(submi, mm); + e_object_unref(E_OBJECT(mm)); + submi = e_menu_item_new(mm); + e_menu_item_label_set(submi, _("Of window...")); + e_menu_item_callback_set(submi, _e_client_menu_cb_align_top, (void*)1); + + submi = e_menu_item_new(subm); + e_menu_item_label_set(submi, _("Left")); + e_menu_item_callback_set(submi, _e_client_menu_cb_align_left, NULL); + mm = e_menu_new(); + e_object_data_set(E_OBJECT(mm), ec); + e_menu_item_submenu_set(submi, mm); + e_object_unref(E_OBJECT(mm)); + submi = e_menu_item_new(mm); + e_menu_item_label_set(submi, _("Of window...")); + e_menu_item_callback_set(submi, _e_client_menu_cb_align_left, (void*)1); + + submi = e_menu_item_new(subm); + e_menu_item_label_set(submi, _("Right")); + e_menu_item_callback_set(submi, _e_client_menu_cb_align_right, NULL); + mm = e_menu_new(); + e_object_data_set(E_OBJECT(mm), ec); + e_menu_item_submenu_set(submi, mm); + e_object_unref(E_OBJECT(mm)); + submi = e_menu_item_new(mm); + e_menu_item_label_set(submi, _("Of window...")); + e_menu_item_callback_set(submi, _e_client_menu_cb_align_right, (void*)1); + + submi = e_menu_item_new(subm); + e_menu_item_label_set(submi, _("Bottom")); + e_menu_item_callback_set(submi, _e_client_menu_cb_align_bottom, NULL); + mm = e_menu_new(); + e_object_data_set(E_OBJECT(mm), ec); + e_menu_item_submenu_set(submi, mm); + e_object_unref(E_OBJECT(mm)); + submi = e_menu_item_new(mm); + e_menu_item_label_set(submi, _("Of window...")); + e_menu_item_callback_set(submi, _e_client_menu_cb_align_bottom, (void*)1); +} + +static void _e_client_menu_cb_sendto_pre(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi) { E_Menu *subm; |