Enlightenment CVS committal Author : devilhorns Project : e17 Module : apps/e
Dir : e17/apps/e/src/bin Modified Files: e_entry.c Log Message: Add right-click copy/paste popup menu to e_entry for Codewarrior :) =================================================================== RCS file: /cvs/e/e17/apps/e/src/bin/e_entry.c,v retrieving revision 1.34 retrieving revision 1.35 diff -u -3 -r1.34 -r1.35 --- e_entry.c 17 Apr 2007 11:57:55 -0000 1.34 +++ e_entry.c 19 Apr 2007 00:45:34 -0000 1.35 @@ -9,6 +9,7 @@ { Evas_Object *entry_object; Evas_Object *editable_object; + E_Menu *popup; Ecore_Event_Handler *selection_handler; int enabled; @@ -40,6 +41,10 @@ static void _e_entry_color_set(Evas_Object *object, int r, int g, int b, int a); static void _e_entry_clip_set(Evas_Object *object, Evas_Object *clip); static void _e_entry_clip_unset(Evas_Object *object); +static void _e_entry_cb_menu_post(void *data, E_Menu *m); +static void _e_entry_cb_cut(void *data, E_Menu *m, E_Menu_Item *mi); +static void _e_entry_cb_copy(void *data, E_Menu *m, E_Menu_Item *mi); +static void _e_entry_cb_paste(void *data, E_Menu *m, E_Menu_Item *mi); /* local subsystem globals */ static Evas_Smart *_e_entry_smart = NULL; @@ -333,6 +338,47 @@ ecore_x_selection_primary_request(win->evas_win, ECORE_X_SELECTION_TARGET_UTF8_STRING); } + else if (event->button == 3) + { + E_Menu_Item *mi; + E_Manager *man; + E_Container *con; + int x, y; + + if (!sd->enabled) return; + + man = e_manager_current_get(); + con = e_container_current_get(man); + ecore_x_pointer_xy_get(con->win, &x, &y); + + /* Popup a menu */ + sd->popup = e_menu_new(); + e_menu_post_deactivate_callback_set(sd->popup, + _e_entry_cb_menu_post, sd); + mi = e_menu_item_new(sd->popup); + e_menu_item_label_set(mi, _("Cut")); + e_menu_item_icon_edje_set(mi, e_theme_edje_file_get("base/theme/fileman", + "e/fileman/button/cut"), + "e/fileman/button/cut"); + e_menu_item_callback_set(mi, _e_entry_cb_cut, sd); + mi = e_menu_item_new(sd->popup); + e_menu_item_label_set(mi, _("Copy")); + e_menu_item_icon_edje_set(mi, e_theme_edje_file_get("base/theme/fileman", + "e/fileman/button/copy"), + "e/fileman/button/copy"); + e_menu_item_callback_set(mi, _e_entry_cb_copy, sd); + mi = e_menu_item_new(sd->popup); + e_menu_item_label_set(mi, _("Paste")); + e_menu_item_icon_edje_set(mi, e_theme_edje_file_get("base/theme/fileman", + "e/fileman/button/paste"), + "e/fileman/button/paste"); + e_menu_item_callback_set(mi, _e_entry_cb_paste, sd); + + e_menu_activate_mouse(sd->popup, e_util_zone_current_get(man), + x, y, 1, 1, + E_MENU_POP_DIRECTION_DOWN, event->timestamp); + e_util_evas_fake_mouse_up_later(e, event->button); + } } /* Called when the entry object is released by the mouse */ @@ -896,4 +942,96 @@ if ((!object) || !(sd = evas_object_smart_data_get(object))) return; evas_object_clip_unset(sd->entry_object); +} + +static void +_e_entry_cb_menu_post(void *data, E_Menu *m) +{ + E_Entry_Smart_Data *sd; + + sd = data; + if (!sd->popup) return; + e_object_del(E_OBJECT(sd->popup)); + sd->popup = NULL; +} + +static void +_e_entry_cb_cut(void *data, E_Menu *m, E_Menu_Item *mi) +{ + E_Entry_Smart_Data *sd; + Evas_Object *editable; + int cursor_pos, selection_pos; + int start_pos, end_pos; + int selecting, changed; + char *range; + E_Win *win; + + sd = data; + if (!sd->enabled) return; + + editable = sd->editable_object; + cursor_pos = e_editable_cursor_pos_get(editable); + selection_pos = e_editable_selection_pos_get(editable); + start_pos = (cursor_pos <= selection_pos) ? cursor_pos : selection_pos; + end_pos = (cursor_pos >= selection_pos) ? cursor_pos : selection_pos; + selecting = (start_pos != end_pos); + if (!selecting) return; + + range = e_editable_text_range_get(editable, start_pos, end_pos); + if (range) + { + if ((win = e_win_evas_object_win_get(sd->entry_object))) + ecore_x_selection_clipboard_set(win->evas_win, + range, strlen(range) + 1); + free(range); + } + changed = e_editable_delete(editable, start_pos, end_pos); + if (changed) + evas_object_smart_callback_call(sd->entry_object, "changed", NULL); +} + +static void +_e_entry_cb_copy(void *data, E_Menu *m, E_Menu_Item *mi) +{ + E_Entry_Smart_Data *sd; + Evas_Object *editable; + int cursor_pos, selection_pos; + int start_pos, end_pos; + int selecting; + char *range; + E_Win *win; + + sd = data; + if (!sd->enabled) return; + + editable = sd->editable_object; + cursor_pos = e_editable_cursor_pos_get(editable); + selection_pos = e_editable_selection_pos_get(editable); + start_pos = (cursor_pos <= selection_pos) ? cursor_pos : selection_pos; + end_pos = (cursor_pos >= selection_pos) ? cursor_pos : selection_pos; + selecting = (start_pos != end_pos); + if (!selecting) return; + + range = e_editable_text_range_get(editable, start_pos, end_pos); + if (range) + { + if ((win = e_win_evas_object_win_get(sd->entry_object))) + ecore_x_selection_clipboard_set(win->evas_win, + range, strlen(range) + 1); + free(range); + } +} + +static void +_e_entry_cb_paste(void *data, E_Menu *m, E_Menu_Item *mi) +{ + E_Entry_Smart_Data *sd; + E_Win *win; + + sd = data; + if (!sd->enabled) return; + + if ((win = e_win_evas_object_win_get(sd->entry_object))) + ecore_x_selection_clipboard_request(win->evas_win, + ECORE_X_SELECTION_TARGET_UTF8_STRING); } ------------------------------------------------------------------------- This SF.net email is sponsored by DB2 Express Download DB2 Express C - the FREE version of DB2 express and take control of your XML. No limits. Just data. Click to get it now. http://sourceforge.net/powerbar/db2/ _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs