#include #include #include #include #include #include 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; int i; printf("selection\n"); ev = event; /* ecore_x_selection_xdnd_request_data_get(&buf, &len); printf("%s\n", buf); free(buf); */ for (i = 0; i < ev->num_files; i++) printf("%s\n", ev->files[i]); ecore_x_dnd_send_finished(); return 1; } int main(int argc, char **argv) { Ecore_Evas *ee; Ecore_X_Window win; 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.eet", "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); ecore_main_loop_begin(); edje_shutdown(); ecore_evas_shutdown(); ecore_shutdown(); return 0; }