#include #include #include #include #include #include Ecore_Evas *ee; Ecore_X_Window win; Evas_Object *obj; const char * atom_to_string(Ecore_X_Atom atom) { if (atom == ECORE_X_DND_ACTION_COPY) return "copy"; else if (atom == ECORE_X_DND_ACTION_MOVE) return "move"; else if (atom == ECORE_X_DND_ACTION_LINK) return "link"; else if (atom == ECORE_X_DND_ACTION_ASK) return "ask"; else if (atom == ECORE_X_DND_ACTION_PRIVATE) return "private"; else return "unknown"; } int exit_handler(void *data, int type, void *event) { ecore_main_loop_quit(); return 1; } int enter_handler(void *data, int type, void *event) { Ecore_X_Event_Xdnd_Enter *ev; int i; printf("enter\n"); ev = event; for (i = 0; i < ev->num_types; i++) printf("type: %s\n", ev->types[i]); return 1; } int position_handler(void *data, int type, void *event) { Ecore_X_Event_Xdnd_Position *ev; Ecore_X_Rectangle rect; /* printf("position\n"); printf("action: %s\n", atom_to_string(ev->action)); */ ev = event; evas_object_geometry_get(obj, &rect.x, &rect.y, &rect.width, &rect.height); rect.x = 500; rect.y = 20; ecore_x_dnd_send_status(1, 1, rect, ECORE_X_DND_ACTION_PRIVATE); return 1; } int drop_handler(void *data, int type, void *event) { Ecore_X_Event_Xdnd_Drop *ev; printf("drop\n"); ev = event; ecore_x_selection_xdnd_request(ev->win, "text/uri-list"); /* ecore_x_selection_xdnd_request(ev->win, "text/plain"); ecore_x_selection_xdnd_request(ev->win, "_NETSCAPE_URL"); ecore_x_selection_xdnd_request(ev->win, "x-special/gnome-icon-list"); */ return 1; } int leave_handler(void *data, int type, void *event) { printf("leave\n"); return 1; } int selection_handler(void *data, int type, void *event) { Ecore_X_Event_Selection_Notify *ev; Ecore_X_Selection_Data *sel; Ecore_X_Selection_Data_Files *files; Ecore_X_Selection_Data_Text *text; Ecore_X_Selection_Data_Targets *targets; int i; ev = event; switch (ev->selection) { case ECORE_X_SELECTION_PRIMARY: if (!strcmp(ev->target, ECORE_X_SELECTION_TARGET_TARGETS)) { printf("primary: %s\n", ev->target); targets = ev->data; for (i = 0; i < targets->num_targets; i++) printf("target: %s\n", targets->targets[i]); } else { text = ev->data; printf("primary: %s %s\n", ev->target, text->text); } break; case ECORE_X_SELECTION_SECONDARY: sel = ev->data; printf("secondary: %s %s\n", ev->target, sel->data); break; case ECORE_X_SELECTION_XDND: printf("xdnd: %s\n", ev->target); files = ev->data; printf("num_files: %d\n", files->num_files); for (i = 0; i < files->num_files; i++) printf("file: %s\n", files->files[i]); ecore_x_dnd_send_finished(); break; case ECORE_X_SELECTION_CLIPBOARD: if (!strcmp(ev->target, ECORE_X_SELECTION_TARGET_TARGETS)) { printf("clipboard: %s\n", ev->target); targets = ev->data; for (i = 0; i < targets->num_targets; i++) printf("target: %s\n", targets->targets[i]); } else { text = ev->data; printf("clipboard: %s %s\n", ev->target, text->text); } break; } return 1; } void mouse_handler(void *data, Evas *e, Evas_Object *obj, void *event_info) { Evas_Event_Mouse_Down *ev; printf("mouse down\n"); ev = event_info; if (ev->button != 2) return; if (ev->flags != EVAS_BUTTON_NONE) return; if (ev->modifiers) return; ecore_x_selection_primary_request(win, ECORE_X_SELECTION_TARGET_UTF8_STRING); /* ecore_x_selection_primary_request(win, ECORE_X_SELECTION_TARGET_TARGETS); */ } void key_handler(void *data, Evas *e, Evas_Object *obj, void *event_info) { Evas_Event_Key_Down *ev; ev = event_info; printf("key down\n"); if (!evas_key_modifier_is_set_get(ev->modifiers, "Control")) return; if (strcmp(ev->keyname, "v")) return; printf("paste\n"); ecore_x_selection_clipboard_request(win, ECORE_X_SELECTION_TARGET_UTF8_STRING); /* ecore_x_selection_clipboard_request(win, ECORE_X_SELECTION_TARGET_TARGETS); */ } int main(int argc, char **argv) { int w, h; ecore_init(); ecore_evas_init(); edje_init(); ee = ecore_evas_software_x11_new(NULL, 0, 0, 0, 10, 10); ecore_evas_borderless_set(ee, 1); ecore_evas_layer_set(ee, 999); ecore_evas_show(ee); win = ecore_evas_software_x11_window_get(ee); ecore_x_dnd_aware_set(win, 1); ecore_x_dnd_type_set(win, "*", 1); obj = edje_object_add(ecore_evas_get(ee)); edje_object_file_set(obj, "default.edj", "drop"); w = 400; h = 400; evas_object_move(obj, 0, 0); evas_object_resize(obj, w, h); evas_object_show(obj); ecore_evas_move(ee, 500, 20); ecore_evas_resize(ee, w, h); ecore_evas_show(ee); ecore_event_handler_add(ECORE_EVENT_SIGNAL_EXIT, exit_handler, NULL); ecore_event_handler_add(ECORE_X_EVENT_XDND_ENTER, enter_handler, NULL); ecore_event_handler_add(ECORE_X_EVENT_XDND_POSITION, position_handler, NULL); ecore_event_handler_add(ECORE_X_EVENT_XDND_DROP, drop_handler, NULL); ecore_event_handler_add(ECORE_X_EVENT_XDND_LEAVE, leave_handler, NULL); ecore_event_handler_add(ECORE_X_EVENT_SELECTION_NOTIFY, selection_handler, NULL); evas_object_event_callback_add(obj, EVAS_CALLBACK_MOUSE_DOWN, mouse_handler, NULL); printf("0x%llo, 0x%llo\n", evas_key_modifier_mask_get(evas_object_evas_get(obj), "Control"), ~(evas_key_modifier_mask_get(evas_object_evas_get(obj), "Control"))); evas_object_key_grab(obj, "v", evas_key_modifier_mask_get(evas_object_evas_get(obj), "Control"), 0, 1); evas_object_event_callback_add(obj, EVAS_CALLBACK_KEY_DOWN, key_handler, NULL); ecore_main_loop_begin(); edje_shutdown(); ecore_evas_shutdown(); ecore_shutdown(); return 0; }