From: <enl...@li...> - 2006-02-12 13:14:21
|
Enlightenment CVS committal Author : codewarrior Project : e17 Module : proto Dir : e17/proto/etk/src/bin Modified Files: etk_xdnd_test.c Log Message: - seperate selections and clipboard stuff. for now, we have an etk_clipboard_* API that handles text copy / paste. Next up is finished selection support for text, then image/* for clipboard and dnd. =================================================================== RCS file: /cvsroot/enlightenment/e17/proto/etk/src/bin/etk_xdnd_test.c,v retrieving revision 1.4 retrieving revision 1.5 diff -u -3 -r1.4 -r1.5 --- etk_xdnd_test.c 11 Feb 2006 10:27:14 -0000 1.4 +++ etk_xdnd_test.c 12 Feb 2006 13:13:44 -0000 1.5 @@ -54,7 +54,7 @@ etk_box_pack_start(ETK_BOX(vbox), image, ETK_FALSE, ETK_FALSE, 0); label = etk_label_new(""); - etk_signal_connect("selection_get", ETK_OBJECT(label), ETK_CALLBACK(_etk_test_xdnd_clipboard_text_request_cb), NULL); + etk_signal_connect("clipboard_received", ETK_OBJECT(label), ETK_CALLBACK(_etk_test_xdnd_clipboard_text_request_cb), NULL); button = etk_button_new_with_label(_("Press me to paste text")); etk_signal_connect("clicked", ETK_OBJECT(button), ETK_CALLBACK(_etk_test_xdnd_button_paste_cb), label); @@ -120,7 +120,7 @@ /* Called when a some text is pasted */ static void _etk_test_xdnd_clipboard_text_request_cb(Etk_Object *object, void *event, void *data) { - Etk_Event_Selection_Get *ev; + Etk_Event_Selection_Request *ev; ev = event; etk_label_set(ETK_LABEL(object), (char *)ev->data); @@ -129,11 +129,15 @@ /* Called when the "paste" button is clicked */ static void _etk_test_xdnd_button_paste_cb(Etk_Object *object, void *data) { - etk_selection_text_request(ETK_WIDGET(data)); + etk_clipboard_text_request(ETK_WIDGET(data)); } /* Called when the "copy" button is clicked */ static void _etk_test_xdnd_button_copy_cb(Etk_Object *object, void *data) { - etk_selection_text_set(ETK_WIDGET(data), etk_entry_text_get(ETK_ENTRY(data))); + const char *text = NULL; + + text = etk_entry_text_get(ETK_ENTRY(data)); + if(text) + etk_clipboard_text_set(ETK_WIDGET(data), text, strlen(text) + 1); } |
From: <enl...@li...> - 2006-02-13 00:00:15
|
Enlightenment CVS committal Author : codewarrior Project : e17 Module : proto Dir : e17/proto/etk/src/lib Modified Files: Etk.h Makefile.am etk_dnd.c etk_dnd.h Added Files: etk_selection.c etk_selection.h Log Message: - move selection functions to etk_selection.[ch] - begin working on selections (text) =================================================================== RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/Etk.h,v retrieving revision 1.20 retrieving revision 1.21 diff -u -3 -r1.20 -r1.21 --- Etk.h 12 Feb 2006 13:13:44 -0000 1.20 +++ Etk.h 13 Feb 2006 00:00:01 -0000 1.21 @@ -64,5 +64,6 @@ #include "etk_spin_button.h" #include "etk_dnd.h" #include "etk_clipboard.h" +#include "etk_selection.h" #endif =================================================================== RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/Makefile.am,v retrieving revision 1.24 retrieving revision 1.25 diff -u -3 -r1.24 -r1.25 --- Makefile.am 12 Feb 2006 13:13:45 -0000 1.24 +++ Makefile.am 13 Feb 2006 00:00:01 -0000 1.25 @@ -44,7 +44,8 @@ etk_progress_bar.h \ etk_spin_button.h \ etk_dnd.h \ -etk_clipboard.h +etk_clipboard.h \ +etk_selection.h libetk_la_SOURCES = \ etk_main.c etk_utils.c \ @@ -76,6 +77,7 @@ etk_spin_button.c \ etk_dnd.c \ etk_clipboard.c \ +etk_selection.c \ $(ETKHEADERS) installed_headersdir = $(prefix)/include/etk =================================================================== RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/etk_dnd.c,v retrieving revision 1.4 retrieving revision 1.5 diff -u -3 -r1.4 -r1.5 --- etk_dnd.c 12 Feb 2006 13:13:45 -0000 1.4 +++ etk_dnd.c 13 Feb 2006 00:00:01 -0000 1.5 @@ -33,7 +33,7 @@ #define ETK_DND_INSIDE(x, y, xx, yy, ww, hh) (((x) < ((xx) + (ww))) && ((y) < ((yy) + (hh))) && ((x) >= (xx)) && ((y) >= (yy))) -Etk_Widget *_etk_selection_widget = NULL; +extern Etk_Widget *_etk_selection_widget; static Etk_Widget *_etk_dnd_widget = NULL; static Evas_List *_etk_dnd_handlers = NULL; @@ -253,20 +253,23 @@ */ } else - { + { + /* emit signal to widget that the clipboard text is sent to it */ + Etk_Event_Selection_Request event; + text = ev->data; - /* printf("primary: %s %s\n", ev->target, text->text); */ + event.data = text->text; + event.content = ETK_SELECTION_CONTENT_TEXT; + etk_widget_selection_received(_etk_selection_widget, &event); } break; case ECORE_X_SELECTION_SECONDARY: sel = ev->data; - /* printf("secondary: %s %s\n", ev->target, sel->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; if (!_etk_dnd_widget || files->num_files < 1) @@ -279,15 +282,10 @@ _etk_dnd_widget->dnd_files = calloc(files->num_files, sizeof(char*)); - /* printf("num_files: %d\n", files->num_files); */ - /* Fill in the drop data into the widget */ _etk_dnd_widget->dnd_files_num = files->num_files; - for (i = 0; i < files->num_files; i++) - { - /* printf("file: %s\n", files->files[i]); */ - _etk_dnd_widget->dnd_files[i] = strdup(files->files[i]); - } + for (i = 0; i < files->num_files; i++) + _etk_dnd_widget->dnd_files[i] = strdup(files->files[i]); /* emit the drop signal so the widget can react */ etk_widget_drag_drop(_etk_dnd_widget); =================================================================== RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/etk_dnd.h,v retrieving revision 1.4 retrieving revision 1.5 diff -u -3 -r1.4 -r1.5 --- etk_dnd.h 12 Feb 2006 13:13:45 -0000 1.4 +++ etk_dnd.h 13 Feb 2006 00:00:01 -0000 1.5 @@ -32,9 +32,6 @@ Etk_Bool etk_dnd_init(); void etk_dnd_shutdown(); - -void etk_selection_text_request(Etk_Widget *widget); -void etk_selection_text_set(Etk_Widget *widget, const char *data); /** @} */ |
From: <enl...@li...> - 2006-02-13 23:10:23
|
Enlightenment CVS committal Author : codewarrior Project : e17 Module : proto Dir : e17/proto/etk/data/themes/default/images Added Files: drop_glow.png Log Message: theme work |
From: <enl...@li...> - 2006-02-14 02:28:09
|
Enlightenment CVS committal Author : codewarrior Project : e17 Module : proto Dir : e17/proto/etk/data/themes/default/macros Modified Files: dnd.edc Log Message: - add theme stuff to show when a widget accepts a drop - add per widget dnd types, now widgets can opt to only get image/png or text/uri-list etc. - remove generate dnd aware code for widgets, make widgets select wether they want to be a drag source or drag destinaion or both - reflect new changes in etk_test =================================================================== RCS file: /cvsroot/enlightenment/e17/proto/etk/data/themes/default/macros/dnd.edc,v retrieving revision 1.1 retrieving revision 1.2 diff -u -3 -r1.1 -r1.2 --- dnd.edc 13 Feb 2006 23:28:43 -0000 1.1 +++ dnd.edc 14 Feb 2006 02:28:02 -0000 1.2 @@ -1,6 +1,6 @@ -#define DROP_GLOW(x1, y1, offx1, offy1, to1, x2, y2, offx2, offy2, to2) \ +#define DRAG_GLOW(x1, y1, offx1, offy1, to1, x2, y2, offx2, offy2, to2) \ part { \ - name: "drop_glow"; \ + name: "drag_glow"; \ mouse_events: 0; \ description { \ state: "default" 0.0; \ @@ -17,7 +17,7 @@ to: to2; \ } \ image { \ - normal: "drop_glow.png"; \ + normal: "drag_glow.png"; \ border: 7 7 7 7; \ } \ fill { \ @@ -32,12 +32,12 @@ } \ } -#define DROP_ENTER_ACTION \ +#define DRAG_ENTER_ACTION \ action: STATE_SET "visible" 0.0; \ transition: DECELERATE 0.2; \ -target: "drop_glow"; +target: "drag_glow"; -#define DROP_LEAVE_ACTION \ +#define DRAG_LEAVE_ACTION \ action: STATE_SET "default" 0.0; \ transition: ACCELERATE 0.5; \ -target: "drop_glow"; +target: "drag_glow"; |
From: <enl...@li...> - 2006-02-14 02:28:09
|
Enlightenment CVS committal Author : codewarrior Project : e17 Module : proto Dir : e17/proto/etk/src/bin Modified Files: etk_button_test.c etk_xdnd_test.c Log Message: - add theme stuff to show when a widget accepts a drop - add per widget dnd types, now widgets can opt to only get image/png or text/uri-list etc. - remove generate dnd aware code for widgets, make widgets select wether they want to be a drag source or drag destinaion or both - reflect new changes in etk_test =================================================================== RCS file: /cvsroot/enlightenment/e17/proto/etk/src/bin/etk_button_test.c,v retrieving revision 1.8 retrieving revision 1.9 diff -u -3 -r1.8 -r1.9 --- etk_button_test.c 11 Feb 2006 10:27:14 -0000 1.8 +++ etk_button_test.c 14 Feb 2006 02:28:02 -0000 1.9 @@ -1,8 +1,6 @@ #include "etk_test.h" #include "config.h" -static void _etk_test_button_drag_drop_cb(Etk_Object *object, void *data); - /* Creates the window for the button test */ void etk_test_button_window_create(void *data) { @@ -52,8 +50,6 @@ etk_box_pack_start(ETK_BOX(vbox), button_radio, ETK_FALSE, ETK_FALSE, 0); button_toggle = etk_toggle_button_new_with_label(_("Toggle button")); - etk_widget_dnd_aware_set(button_toggle, ETK_TRUE); - etk_signal_connect("drag_drop", ETK_OBJECT(button_toggle), ETK_CALLBACK(_etk_test_button_drag_drop_cb), button_toggle); etk_box_pack_start(ETK_BOX(vbox), button_toggle, ETK_FALSE, ETK_FALSE, 0); button_toggle = etk_toggle_button_new(); @@ -61,19 +57,3 @@ etk_widget_show_all(win); } - -/* Called when a file is dropped on the button */ -static void _etk_test_button_drag_drop_cb(Etk_Object *object, void *data) -{ - int num_files, i; - const char **files; - - if (!object) - return; - - files = etk_widget_dnd_files_get(ETK_WIDGET(object), &num_files); - printf("Our test widget got a drop with %d files\n", num_files); - - for (i = 0; i < num_files; i++) - printf("Widget got the file: %s\n", files[i]); -} =================================================================== RCS file: /cvsroot/enlightenment/e17/proto/etk/src/bin/etk_xdnd_test.c,v retrieving revision 1.5 retrieving revision 1.6 diff -u -3 -r1.5 -r1.6 --- etk_xdnd_test.c 12 Feb 2006 13:13:44 -0000 1.5 +++ etk_xdnd_test.c 14 Feb 2006 02:28:02 -0000 1.6 @@ -9,16 +9,21 @@ static void _etk_test_xdnd_clipboard_text_request_cb(Etk_Object *object, void *event, void *data); static void _etk_test_xdnd_button_paste_cb(Etk_Object *object, void *data); static void _etk_test_xdnd_button_copy_cb(Etk_Object *object, void *data); +static void _etk_test_xdnd_selection_text_request_cb(Etk_Object *object, void *event, void *data); +static void _etk_test_xdnd_button_selection_set_cb(Etk_Object *object, void *data); +static void _etk_test_xdnd_button_selection_get_cb(Etk_Object *object, void *data); /* Creates the window for the xdnd test */ void etk_test_xdnd_window_create(void *data) { - static Etk_Widget *win = NULL; - Etk_Widget *vbox; - Etk_Widget *button; - Etk_Widget *label; - Etk_Widget *image; - Etk_Widget *entry; + static Etk_Widget *win = NULL; + Etk_Widget *vbox; + Etk_Widget *button; + Etk_Widget *label; + Etk_Widget *image; + Etk_Widget *entry; + char **dnd_types; + int dnd_types_num; if (win) { @@ -36,8 +41,13 @@ label = etk_label_new(_("No File Set")); + dnd_types_num = 1; + dnd_types = calloc(dnd_types_num, sizeof(char*)); + dnd_types[0] = strdup("text/uri-list"); + button = etk_button_new_with_label(_("Drag Any File Onto Me")); - etk_widget_dnd_aware_set(button, ETK_TRUE); + etk_widget_dnd_dest_set(button, ETK_TRUE); + etk_widget_dnd_types_set(button, dnd_types, dnd_types_num); etk_signal_connect("drag_drop", ETK_OBJECT(button), ETK_CALLBACK(_etk_test_xdnd_drag_drop_cb), label); etk_signal_connect("drag_motion", ETK_OBJECT(button), ETK_CALLBACK(_etk_test_xdnd_drag_motion_cb), NULL); etk_signal_connect("drag_leave", ETK_OBJECT(button), ETK_CALLBACK(_etk_test_xdnd_drag_leave_cb), NULL); @@ -48,7 +58,7 @@ image = etk_image_new_from_file(PACKAGE_DATA_DIR "/images/e_icon.png"); button = etk_button_new_with_label(_("Drag Any Image Onto Me")); - etk_widget_dnd_aware_set(button, ETK_TRUE); + etk_widget_dnd_dest_set(button, ETK_TRUE); etk_signal_connect("drag_drop", ETK_OBJECT(button), ETK_CALLBACK(_etk_test_xdnd_drag_drop_cb2), image); etk_box_pack_start(ETK_BOX(vbox), button, ETK_FALSE, ETK_FALSE, 0); etk_box_pack_start(ETK_BOX(vbox), image, ETK_FALSE, ETK_FALSE, 0); @@ -67,6 +77,20 @@ etk_box_pack_start(ETK_BOX(vbox), button, ETK_FALSE, ETK_FALSE, 0); etk_box_pack_start(ETK_BOX(vbox), entry, ETK_FALSE, ETK_FALSE, 0); + label = etk_label_new(""); + etk_signal_connect("selection_received", ETK_OBJECT(label), ETK_CALLBACK(_etk_test_xdnd_selection_text_request_cb), NULL); + + button = etk_button_new_with_label(_("Press me to get selection text")); + etk_signal_connect("clicked", ETK_OBJECT(button), ETK_CALLBACK(_etk_test_xdnd_button_selection_get_cb), label); + etk_box_pack_start(ETK_BOX(vbox), button, ETK_FALSE, ETK_FALSE, 0); + etk_box_pack_start(ETK_BOX(vbox), label, ETK_FALSE, ETK_FALSE, 0); + + entry = etk_entry_new(); + button = etk_button_new_with_label(_("Click me to set selection text")); + etk_signal_connect("clicked", ETK_OBJECT(button), ETK_CALLBACK(_etk_test_xdnd_button_selection_set_cb), entry); + etk_box_pack_start(ETK_BOX(vbox), button, ETK_FALSE, ETK_FALSE, 0); + etk_box_pack_start(ETK_BOX(vbox), entry, ETK_FALSE, ETK_FALSE, 0); + etk_widget_show_all(win); } @@ -105,6 +129,10 @@ const char **files; files = etk_widget_dnd_files_get(ETK_WIDGET(object), &num_files); + + if(files == NULL || num_files < 1) + return; + printf("Our test widget got a drop with %d files\n", num_files); for (i = 0; i < num_files; i++) @@ -141,3 +169,28 @@ if(text) etk_clipboard_text_set(ETK_WIDGET(data), text, strlen(text) + 1); } + +/* Called when a some text is fetched from a selection */ +static void _etk_test_xdnd_selection_text_request_cb(Etk_Object *object, void *event, void *data) +{ + Etk_Event_Selection_Request *ev; + + ev = event; + etk_label_set(ETK_LABEL(object), (char *)ev->data); +} + +/* Called when the "get selection" button is clicked */ +static void _etk_test_xdnd_button_selection_get_cb(Etk_Object *object, void *data) +{ + etk_selection_text_request(ETK_WIDGET(data)); +} + +/* Called when the "set selection" button is clicked */ +static void _etk_test_xdnd_button_selection_set_cb(Etk_Object *object, void *data) +{ + const char *text = NULL; + + text = etk_entry_text_get(ETK_ENTRY(data)); + if(text) + etk_selection_text_set(ETK_WIDGET(data), text, strlen(text) + 1); +} |
From: <enl...@li...> - 2006-02-14 02:28:09
|
Enlightenment CVS committal Author : codewarrior Project : e17 Module : proto Dir : e17/proto/etk/data/themes/default/widgets Modified Files: button.edc entry.edc toggle_button.edc Log Message: - add theme stuff to show when a widget accepts a drop - add per widget dnd types, now widgets can opt to only get image/png or text/uri-list etc. - remove generate dnd aware code for widgets, make widgets select wether they want to be a drag source or drag destinaion or both - reflect new changes in etk_test =================================================================== RCS file: /cvsroot/enlightenment/e17/proto/etk/data/themes/default/widgets/button.edc,v retrieving revision 1.7 retrieving revision 1.8 diff -u -3 -r1.7 -r1.8 --- button.edc 13 Feb 2006 23:28:43 -0000 1.7 +++ button.edc 14 Feb 2006 02:28:02 -0000 1.8 @@ -202,7 +202,7 @@ } } FOCUS_GLOW(0.0, 0.0, 0, 0, "button", 1.0, 1.0, -1, -1, "button") - DROP_GLOW(0.0, 0.0, 0, 0, "button", 1.0, 1.0, -1, -1, "button") + DRAG_GLOW(0.0, 0.0, 0, 0, "button", 1.0, 1.0, -1, -1, "button") } programs { program { @@ -246,22 +246,22 @@ UNFOCUS_GLOW_ACTION } program { - name: "drop_enter"; - signal: "drop_enter"; + name: "drag_enter"; + signal: "drag_enter"; source: ""; - DROP_ENTER_ACTION + DRAG_ENTER_ACTION } program { name: "drag_leave"; signal: "drag_leave"; source: ""; - DROP_LEAVE_ACTION + DRAG_LEAVE_ACTION } program { name: "drag_drop"; signal: "drag_drop"; source: ""; - DROP_LEAVE_ACTION + DRAG_LEAVE_ACTION } program { name: "go_active"; =================================================================== RCS file: /cvsroot/enlightenment/e17/proto/etk/data/themes/default/widgets/entry.edc,v retrieving revision 1.4 retrieving revision 1.5 diff -u -3 -r1.4 -r1.5 --- entry.edc 13 Feb 2006 23:28:43 -0000 1.4 +++ entry.edc 14 Feb 2006 02:28:02 -0000 1.5 @@ -41,7 +41,7 @@ } } FOCUS_GLOW(0.0, 0.0, -1, -1, "entry", 1.0, 1.0, 0, 0, "entry") - DROP_GLOW(0.0, 0.0, -1, -1, "entry", 1.0, 1.0, 0, 0, "entry") + DRAG_GLOW(0.0, 0.0, -1, -1, "entry", 1.0, 1.0, 0, 0, "entry") } programs { program { @@ -57,22 +57,22 @@ UNFOCUS_GLOW_ACTION } program { - name: "drop_enter"; - signal: "drop_enter"; + name: "drag_enter"; + signal: "drag_enter"; source: ""; - DROP_ENTER_ACTION + DRAG_ENTER_ACTION } program { name: "drag_leave"; signal: "drag_leave"; source: ""; - DROP_LEAVE_ACTION + DRAG_LEAVE_ACTION } program { name: "drag_drop"; signal: "drag_drop"; source: ""; - DROP_LEAVE_ACTION + DRAG_LEAVE_ACTION } } } =================================================================== RCS file: /cvsroot/enlightenment/e17/proto/etk/data/themes/default/widgets/toggle_button.edc,v retrieving revision 1.5 retrieving revision 1.6 diff -u -3 -r1.5 -r1.6 --- toggle_button.edc 13 Feb 2006 23:28:43 -0000 1.5 +++ toggle_button.edc 14 Feb 2006 02:28:02 -0000 1.6 @@ -222,7 +222,7 @@ } } FOCUS_GLOW(0.0, 0.0, 0, 0, "toggle_button", 1.0, 1.0, -1, -1, "toggle_button") - DROP_GLOW(0.0, 0.0, 0, 0, "toggle_button", 1.0, 1.0, -1, -1, "toggle_button") + DRAG_GLOW(0.0, 0.0, 0, 0, "toggle_button", 1.0, 1.0, -1, -1, "toggle_button") } programs { program { @@ -284,22 +284,22 @@ UNFOCUS_GLOW_ACTION } program { - name: "drop_enter"; - signal: "drop_enter"; + name: "drag_enter"; + signal: "drag_enter"; source: ""; - DROP_ENTER_ACTION + DRAG_ENTER_ACTION } program { name: "drag_leave"; signal: "drag_leave"; source: ""; - DROP_LEAVE_ACTION + DRAG_LEAVE_ACTION } program { name: "drag_drop"; signal: "drag_drop"; source: ""; - DROP_LEAVE_ACTION + DRAG_LEAVE_ACTION } program { |
From: <enl...@li...> - 2006-02-14 02:28:09
|
Enlightenment CVS committal Author : codewarrior Project : e17 Module : proto Dir : e17/proto/etk/src/lib Modified Files: etk_dnd.c etk_widget.c etk_widget.h Log Message: - add theme stuff to show when a widget accepts a drop - add per widget dnd types, now widgets can opt to only get image/png or text/uri-list etc. - remove generate dnd aware code for widgets, make widgets select wether they want to be a drag source or drag destinaion or both - reflect new changes in etk_test =================================================================== RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/etk_dnd.c,v retrieving revision 1.5 retrieving revision 1.6 diff -u -3 -r1.5 -r1.6 --- etk_dnd.c 13 Feb 2006 00:00:01 -0000 1.5 +++ etk_dnd.c 14 Feb 2006 02:28:02 -0000 1.6 @@ -33,10 +33,13 @@ #define ETK_DND_INSIDE(x, y, xx, yy, ww, hh) (((x) < ((xx) + (ww))) && ((y) < ((yy) + (hh))) && ((x) >= (xx)) && ((y) >= (yy))) -extern Etk_Widget *_etk_selection_widget; +extern Etk_Widget *_etk_selection_widget; -static Etk_Widget *_etk_dnd_widget = NULL; -static Evas_List *_etk_dnd_handlers = NULL; +static char **_etk_dnd_types = NULL; +static int _etk_dnd_types_num = 0; +static Etk_Widget *_etk_dnd_widget = NULL; +static Evas_List *_etk_dnd_handlers = NULL; +static int _etk_dnd_widget_accepts = 0; #if HAVE_ECORE_X static void _etk_xdnd_container_get_widgets_at(Etk_Toplevel_Widget *top, int x, int y, int offx, int offy, Evas_List **list); @@ -94,7 +97,15 @@ **************************/ #if HAVE_ECORE_X -/* Search the container recursively for the widget that accepts xdnd */ +/** + * @brief Search the container recursively for the widget that accepts xdnd + * @param top top level widget + * @param x the x coord we're searching under + * @param y the y coord we're searching under + * @param xoff the x offset for the window + * @param yoff the y offset for the window + * @param list the evas list we're going to append widgets to + */ static void _etk_xdnd_container_get_widgets_at(Etk_Toplevel_Widget *top, int x, int y, int offx, int offy, Evas_List **list) { @@ -104,7 +115,7 @@ if (!top || !list) return; - for (l = etk_widget_dnd_aware_widgets_get(); l; l = l->next) + for (l = etk_widget_dnd_dest_widgets_get(); l; l = l->next) { Etk_Widget *widget; @@ -117,22 +128,44 @@ } } -/* TODO: doc */ +/** + * @brief The event handler for when a drag enters our window + */ static int _etk_xdnd_enter_handler(void *data, int type, void *event) { Ecore_X_Event_Xdnd_Enter *ev; - //int i; + int i; ev = event; -// printf("enter window!\n"); -// for (i = 0; i < ev->num_types; i++) -// printf("type: %s\n", ev->types[i]); + printf("enter window!\n"); + for (i = 0; i < ev->num_types; i++) + printf("type: %s\n", ev->types[i]); + + if(_etk_dnd_types != NULL && _etk_dnd_types_num >= 0) + { + for (i = 0; i < _etk_dnd_types_num; i++) + if(_etk_dnd_types[i]) free(_etk_dnd_types[i]); + } + + if(_etk_dnd_types != NULL) free(_etk_dnd_types); + _etk_dnd_types_num = 0; + + if(ev->num_types > 0) + { + _etk_dnd_types = calloc(ev->num_types, sizeof(char*)); + for (i = 0; i < ev->num_types; i++) + _etk_dnd_types[i] = strdup(ev->types[i]); + + _etk_dnd_types_num = ev->num_types; + } return 1; } -/* TODO: doc */ +/** + * @brief The event handler for when a drag is moving in our window + */ static int _etk_xdnd_position_handler(void *data, int type, void *event) { Ecore_X_Event_Xdnd_Position *ev; @@ -171,6 +204,7 @@ { etk_widget_drag_leave(_etk_dnd_widget); _etk_dnd_widget = NULL; + _etk_dnd_widget_accepts = 0; } } @@ -181,18 +215,55 @@ if (children != NULL) { Ecore_X_Rectangle rect; + int i; widget = (evas_list_last(children))->data; etk_widget_geometry_get(widget, &wx, &wy, &ww, &wh); - _etk_dnd_widget = widget; - /* TODO: filter types according to what widget wants */ + rect.x = wx; rect.y = wy; rect.width = ww; - rect.height = wh; - ecore_x_dnd_send_status(1, 1, rect, ECORE_X_DND_ACTION_PRIVATE); + rect.height = wh; + + if(_etk_dnd_widget == widget && _etk_dnd_widget_accepts) + { + etk_widget_drag_motion(widget); + ecore_x_dnd_send_status(1, 1, rect, ECORE_X_DND_ACTION_PRIVATE); + } + else + { + _etk_dnd_widget = widget; - etk_widget_drag_motion(widget); + /* first case - no specific types, so just accept */ + if(_etk_dnd_widget->dnd_types == NULL || _etk_dnd_widget->dnd_types_num <= 0) + { + ecore_x_dnd_send_status(1, 1, rect, ECORE_X_DND_ACTION_PRIVATE); + _etk_dnd_widget_accepts = 1; + etk_widget_drag_enter(widget); + return 1; + } + + /* second case - we found matching types, accept */ + for(i = 0; i < _etk_dnd_types_num; i++) + { + int j; + + for(j = 0; j < _etk_dnd_widget->dnd_types_num; j++) + { + if(!strcmp(_etk_dnd_widget->dnd_types[j], _etk_dnd_types[i])) + { + ecore_x_dnd_send_status(1, 1, rect, ECORE_X_DND_ACTION_PRIVATE); + _etk_dnd_widget_accepts = 1; + etk_widget_drag_enter(widget); + return 1; + } + } + } + + /* third case - no matches at all, dont accept */ + ecore_x_dnd_send_status(0, 1, rect, ECORE_X_DND_ACTION_PRIVATE); + _etk_dnd_widget_accepts = 0; + } } else { @@ -212,11 +283,24 @@ static int _etk_xdnd_drop_handler(void *data, int type, void *event) { Ecore_X_Event_Xdnd_Drop *ev; + int i; //printf("drop\n"); ev = event; - ecore_x_selection_xdnd_request(ev->win, "text/uri-list"); + /* first case - if we dont have a type preferece, send everyting */ + if(_etk_dnd_widget->dnd_types == NULL || _etk_dnd_widget->dnd_types_num <= 0) + { + for(i = 0; i < _etk_dnd_types_num; i++) + ecore_x_selection_xdnd_request(ev->win, _etk_dnd_types[i]); + } + /* second case - send only our preferred types */ + else + { + for(i = 0; i < _etk_dnd_widget->dnd_types_num; i++) + ecore_x_selection_xdnd_request(ev->win, _etk_dnd_widget->dnd_types[i]); + } + return 1; } @@ -270,27 +354,30 @@ break; case ECORE_X_SELECTION_XDND: - files = ev->data; - - if (!_etk_dnd_widget || files->num_files < 1) - break; - - /* free old data, should this be done here? */ - for (i = 0; i < _etk_dnd_widget->dnd_files_num; i++) - free(_etk_dnd_widget->dnd_files[i]); - free(_etk_dnd_widget->dnd_files); - - _etk_dnd_widget->dnd_files = calloc(files->num_files, sizeof(char*)); - - /* Fill in the drop data into the widget */ - _etk_dnd_widget->dnd_files_num = files->num_files; - for (i = 0; i < files->num_files; i++) - _etk_dnd_widget->dnd_files[i] = strdup(files->files[i]); - - /* emit the drop signal so the widget can react */ - etk_widget_drag_drop(_etk_dnd_widget); - _etk_dnd_widget = NULL; + if(!strcmp(ev->target, "text/uri-list")) + { + files = ev->data; + if (!_etk_dnd_widget || files->num_files < 1) + break; + + /* free old data, should this be done here? */ + for (i = 0; i < _etk_dnd_widget->dnd_files_num; i++) + free(_etk_dnd_widget->dnd_files[i]); + free(_etk_dnd_widget->dnd_files); + + _etk_dnd_widget->dnd_files = calloc(files->num_files, sizeof(char*)); + + /* Fill in the drop data into the widget */ + _etk_dnd_widget->dnd_files_num = files->num_files; + for (i = 0; i < files->num_files; i++) + _etk_dnd_widget->dnd_files[i] = strdup(files->files[i]); + } + + /* emit the drop signal so the widget can react */ + etk_widget_drag_drop(_etk_dnd_widget); + _etk_dnd_widget = NULL; + ecore_x_dnd_send_finished(); break; =================================================================== RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/etk_widget.c,v retrieving revision 1.31 retrieving revision 1.32 diff -u -3 -r1.31 -r1.32 --- etk_widget.c 13 Feb 2006 01:10:20 -0000 1.31 +++ etk_widget.c 14 Feb 2006 02:28:02 -0000 1.32 @@ -56,6 +56,7 @@ ETK_WIDGET_UNFOCUS_SIGNAL, ETK_WIDGET_SCROLL_SIZE_CHANGED_SIGNAL, ETK_WIDGET_DRAG_DROP_SIGNAL, + ETK_WIDGET_DRAG_ENTER_SIGNAL, ETK_WIDGET_DRAG_MOTION_SIGNAL, ETK_WIDGET_DRAG_LEAVE_SIGNAL, ETK_WIDGET_SELECTION_RECEIVED_SIGNAL, @@ -93,6 +94,7 @@ static void _etk_widget_drag_drop_handler(Etk_Widget *widget); static void _etk_widget_drag_motion_handler(Etk_Widget *widget); +static void _etk_widget_drag_enter_handler(Etk_Widget *widget); static void _etk_widget_drag_leave_handler(Etk_Widget *widget); static void _etk_widget_mouse_in_cb(void *data, Evas *evas, Evas_Object *object, void *event_info); @@ -139,7 +141,7 @@ static Etk_Bool _etk_widget_propagate_event = ETK_TRUE; static Etk_Bool _etk_widget_intercept_show_hide = ETK_TRUE; static Evas_Smart *_etk_widget_event_object_smart = NULL; -static Evas_List *_etk_widget_dnd_widgets; +static Evas_List *_etk_widget_dnd_dest_widgets; /************************** * @@ -180,6 +182,7 @@ _etk_widget_signals[ETK_WIDGET_UNFOCUS_SIGNAL] = etk_signal_new("unfocus", widget_type, ETK_MEMBER_OFFSET(Etk_Widget, unfocus), etk_marshaller_VOID__VOID, NULL, NULL); _etk_widget_signals[ETK_WIDGET_DRAG_DROP_SIGNAL] = etk_signal_new("drag_drop", widget_type, ETK_MEMBER_OFFSET(Etk_Widget, drag_drop), etk_marshaller_VOID__VOID, NULL, NULL); _etk_widget_signals[ETK_WIDGET_DRAG_MOTION_SIGNAL] = etk_signal_new("drag_motion", widget_type, ETK_MEMBER_OFFSET(Etk_Widget, drag_motion), etk_marshaller_VOID__VOID, NULL, NULL); + _etk_widget_signals[ETK_WIDGET_DRAG_ENTER_SIGNAL] = etk_signal_new("drag_enter", widget_type, ETK_MEMBER_OFFSET(Etk_Widget, drag_enter), etk_marshaller_VOID__VOID, NULL, NULL); _etk_widget_signals[ETK_WIDGET_DRAG_LEAVE_SIGNAL] = etk_signal_new("drag_leave", widget_type, ETK_MEMBER_OFFSET(Etk_Widget, drag_leave), etk_marshaller_VOID__VOID, NULL, NULL); _etk_widget_signals[ETK_WIDGET_SELECTION_RECEIVED_SIGNAL] = etk_signal_new("selection_received", widget_type, -1, etk_marshaller_VOID__POINTER, NULL, NULL); _etk_widget_signals[ETK_WIDGET_CLIPBOARD_RECEIVED_SIGNAL] = etk_signal_new("clipboard_received", widget_type, -1, etk_marshaller_VOID__POINTER, NULL, NULL); @@ -1267,11 +1270,11 @@ } /** - * @brief Sets whether the widget is dnd aware or not + * @brief Sets whether the widget is dnd destination * @param widget a widget - * @param on ETK_TRUE to enable dnd, ETK_FALSE to disable it + * @param on ETK_TRUE to enable this widget as a dnd destination, ETK_FALSE to disable it */ -void etk_widget_dnd_aware_set(Etk_Widget *widget, Etk_Bool on) +void etk_widget_dnd_dest_set(Etk_Widget *widget, Etk_Bool on) { if (!widget) return; @@ -1279,21 +1282,21 @@ if (on) { widget->accepts_dnd = ETK_TRUE; - _etk_widget_dnd_widgets = evas_list_append(_etk_widget_dnd_widgets, widget); + _etk_widget_dnd_dest_widgets = evas_list_append(_etk_widget_dnd_dest_widgets, widget); } else { widget->accepts_dnd = ETK_FALSE; - _etk_widget_dnd_widgets = evas_list_remove(_etk_widget_dnd_widgets, widget); + _etk_widget_dnd_dest_widgets = evas_list_remove(_etk_widget_dnd_dest_widgets, widget); } } /** - * @brief Checks whether the widget is dnd aware + * @brief Checks whether the widget is a dnd destination * @param widget a widget - * @return Returns ETK_TRUE if the widget is dnd aware, ETK_FALSE otherwise + * @return Returns ETK_TRUE if the widget is a dnd destination, ETK_FALSE otherwise */ -Etk_Bool etk_widget_dnd_aware_get(Etk_Widget *widget) +Etk_Bool etk_widget_dnd_dest_get(Etk_Widget *widget) { if (!widget) return ETK_FALSE; @@ -1301,6 +1304,57 @@ } /** + * @brief Sets the possible types for dnd + * @param widget a widget + * @param types list of acceptable types + * @param num number of types + */ +void etk_widget_dnd_types_set(Etk_Widget *widget, char **types, int num) +{ + int i; + + if (!widget) + return; + + /* free old data */ + if(num <= 0 || types == NULL || + (widget->dnd_types_num > 0 && widget->dnd_types != NULL)) + { + + for(i = 0; i < widget->dnd_types_num; i++) + if(widget->dnd_types[i]) free(widget->dnd_types[i]); + + if(widget->dnd_types) free(widget->dnd_types); + + widget->dnd_types = NULL; + widget->dnd_types_num = 0; + return; + } + + widget->dnd_types = calloc(num, sizeof(char*)); + for(i = 0; i < num; i++) + widget->dnd_types[i] = strdup(types[i]); + + widget->dnd_types_num = num; +} + +/** + * @brief Gets the possible types for dnd + * @param widget a widget + * @param num number of types that the widget has + * @return returns the dnd types this widget supports + */ +const char **etk_widget_dnd_types_get(Etk_Widget *widget, int *num) +{ + if (!widget) + return ETK_FALSE; + + if(num) + *num = widget->dnd_types_num; + return widget->dnd_types; +} + +/** * @brief Gets the list of the files dropped on the widget * @param widget a widget * @param on ETK_TRUE to enable dnd, ETK_FALSE to disable it @@ -1320,12 +1374,12 @@ } /** - * @brief Gets the list of the dnd-aware widgets - * @return Returns the list of the dnd-aware widgets + * @brief Gets the list of the widgets that are dnd destinations + * @return Returns the list of the dnd destination widgets */ -Evas_List *etk_widget_dnd_aware_widgets_get() +Evas_List *etk_widget_dnd_dest_widgets_get() { - return _etk_widget_dnd_widgets; + return _etk_widget_dnd_dest_widgets; } /** @@ -1351,7 +1405,19 @@ } /** - * @brief Sends the "drag_motion" signal + * @brief Sends the "drag_enter" signal + * @param widget a widget + */ +void etk_widget_drag_enter(Etk_Widget *widget) +{ + if (!widget) + return; + + etk_signal_emit(_etk_widget_signals[ETK_WIDGET_DRAG_ENTER_SIGNAL], ETK_OBJECT(widget), NULL); +} + +/** + * @brief Sends the "drag_leave" signal * @param widget a widget */ void etk_widget_drag_leave(Etk_Widget *widget) @@ -1419,6 +1485,7 @@ widget->unfocus = _etk_widget_unfocus_handler; widget->drag_drop = _etk_widget_drag_drop_handler; widget->drag_motion = _etk_widget_drag_motion_handler; + widget->drag_enter = _etk_widget_drag_enter_handler; widget->drag_leave = _etk_widget_drag_leave_handler; widget->left_inset = 0; @@ -1455,7 +1522,9 @@ widget->accepts_dnd = ETK_FALSE; widget->dnd_files = NULL; widget->dnd_files_num = 0; - + widget->dnd_types = NULL; + widget->dnd_types_num = 0; + etk_signal_connect_full(_etk_widget_signals[ETK_WIDGET_MOUSE_IN_SIGNAL], ETK_OBJECT(widget), ETK_CALLBACK(_etk_widget_signal_mouse_in_cb), NULL, ETK_FALSE, ETK_FALSE); etk_signal_connect_full(_etk_widget_signals[ETK_WIDGET_MOUSE_OUT_SIGNAL], ETK_OBJECT(widget), ETK_CALLBACK(_etk_widget_signal_mouse_out_cb), NULL, ETK_FALSE, ETK_FALSE); etk_signal_connect_full(_etk_widget_signals[ETK_WIDGET_MOUSE_DOWN_SIGNAL], ETK_OBJECT(widget), ETK_CALLBACK(_etk_widget_signal_mouse_down_cb), NULL, ETK_FALSE, ETK_FALSE); @@ -1488,7 +1557,7 @@ free(widget->dnd_files[i]); free(widget->dnd_files); if (widget->accepts_dnd) - _etk_widget_dnd_widgets = evas_list_remove(_etk_widget_dnd_widgets, widget); + _etk_widget_dnd_dest_widgets = evas_list_remove(_etk_widget_dnd_dest_widgets, widget); free(widget->theme_file); free(widget->theme_group); @@ -1666,6 +1735,15 @@ etk_widget_theme_object_signal_emit(widget, "drag_motion"); } +/* Default handler for the "drag_enter" signal */ +static void _etk_widget_drag_enter_handler(Etk_Widget *widget) +{ + if (!widget) + return; + + etk_widget_theme_object_signal_emit(widget, "drag_enter"); +} + /* Default handler for the "drag_leave" signal */ static void _etk_widget_drag_leave_handler(Etk_Widget *widget) { =================================================================== RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/etk_widget.h,v retrieving revision 1.19 retrieving revision 1.20 diff -u -3 -r1.19 -r1.20 --- etk_widget.h 12 Feb 2006 20:08:20 -0000 1.19 +++ etk_widget.h 14 Feb 2006 02:28:02 -0000 1.20 @@ -175,6 +175,7 @@ void (*unfocus)(Etk_Widget *widget); void (*drag_drop)(Etk_Widget *widget); void (*drag_motion)(Etk_Widget *widget); + void (*drag_enter)(Etk_Widget *widget); void (*drag_leave)(Etk_Widget *widget); unsigned char realized : 1; @@ -192,7 +193,9 @@ unsigned char accepts_dnd : 1; char **dnd_files; - int dnd_files_num; + int dnd_files_num; + char **dnd_types; + int dnd_types_num; }; Etk_Type *etk_widget_type_get(); @@ -263,13 +266,14 @@ void etk_widget_clip_unset(Etk_Widget *widget); Evas_Object *etk_widget_clip_get(Etk_Widget *widget); -void etk_widget_dnd_aware_set(Etk_Widget *widget, Etk_Bool on); -Etk_Bool etk_widget_dnd_aware_get(Etk_Widget *widget); -Evas_List *etk_widget_dnd_aware_widgets_get(); +void etk_widget_dnd_dest_set(Etk_Widget *widget, Etk_Bool on); +Etk_Bool etk_widget_dnd_dest_get(Etk_Widget *widget); +Evas_List *etk_widget_dnd_dest_widgets_get(); const char **etk_widget_dnd_files_get(Etk_Widget *e, int *num_files); void etk_widget_drag_drop(Etk_Widget *widget); void etk_widget_drag_motion(Etk_Widget *widget); +void etk_widget_drag_enter(Etk_Widget *widget); void etk_widget_drag_leave(Etk_Widget *widget); void etk_widget_selection_received(Etk_Widget *widget, Etk_Event_Selection_Request *event); |
From: <enl...@li...> - 2006-02-14 02:28:39
|
Enlightenment CVS committal Author : codewarrior Project : e17 Module : proto Dir : e17/proto/etk/data/themes/default/images Modified Files: images.edc Removed Files: drop_glow.png Log Message: - add theme stuff to show when a widget accepts a drop - add per widget dnd types, now widgets can opt to only get image/png or text/uri-list etc. - remove generate dnd aware code for widgets, make widgets select wether they want to be a drag source or drag destinaion or both - reflect new changes in etk_test =================================================================== RCS file: /cvsroot/enlightenment/e17/proto/etk/data/themes/default/images/images.edc,v retrieving revision 1.19 retrieving revision 1.20 diff -u -3 -r1.19 -r1.20 --- images.edc 13 Feb 2006 23:28:43 -0000 1.19 +++ images.edc 14 Feb 2006 02:28:02 -0000 1.20 @@ -2,7 +2,7 @@ image: "border.png" COMP; image: "background.png" COMP; image: "focus_glow.png" COMP; - image: "drop_glow.png" COMP; + image: "drag_glow.png" COMP; image: "button_down.png" COMP; image: "button_up.png" COMP; image: "button_toggled.png" COMP; |
From: <enl...@li...> - 2006-02-14 02:29:02
|
Enlightenment CVS committal Author : codewarrior Project : e17 Module : proto Dir : e17/proto/etk/data/themes/default/images Added Files: drag_glow.png Log Message: add image |
From: <enl...@li...> - 2006-02-14 13:37:46
|
Enlightenment CVS committal Author : codewarrior Project : e17 Module : proto Dir : e17/proto/etk/src/lib Modified Files: etk_dnd.c etk_dnd.h etk_types.h etk_widget.c etk_widget.h Log Message: - add two new type: Etk_Selection_Data_Files Etk_Selection_Data_Text - make all dnd, selection, clipboard stuff work properly with events and event structs - remove useless junk =================================================================== RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/etk_dnd.c,v retrieving revision 1.6 retrieving revision 1.7 diff -u -3 -r1.6 -r1.7 --- etk_dnd.c 14 Feb 2006 02:28:02 -0000 1.6 +++ etk_dnd.c 14 Feb 2006 13:37:38 -0000 1.7 @@ -138,9 +138,9 @@ ev = event; - printf("enter window!\n"); - for (i = 0; i < ev->num_types; i++) - printf("type: %s\n", ev->types[i]); + //printf("enter window!\n"); + //for (i = 0; i < ev->num_types; i++) + // printf("type: %s\n", ev->types[i]); if(_etk_dnd_types != NULL && _etk_dnd_types_num >= 0) { @@ -320,7 +320,7 @@ Ecore_X_Selection_Data_Files *files; Ecore_X_Selection_Data_Text *text; Ecore_X_Selection_Data_Targets *targets; - int i; + //int i; //printf("selection\n"); ev = event; @@ -340,10 +340,21 @@ { /* emit signal to widget that the clipboard text is sent to it */ Etk_Event_Selection_Request event; + Etk_Selection_Data_Text event_text; text = ev->data; - event.data = text->text; - event.content = ETK_SELECTION_CONTENT_TEXT; + + if (!_etk_selection_widget) + break; + + event_text.text = text->text; + event_text.data.data = text->data.data; + event_text.data.length = text->data.length; + event_text.data.free = text->data.free; + + event.data = &event_text; + event.content = ETK_SELECTION_CONTENT_TEXT; + etk_widget_selection_received(_etk_selection_widget, &event); } break; @@ -355,27 +366,61 @@ case ECORE_X_SELECTION_XDND: if(!strcmp(ev->target, "text/uri-list")) - { + { + Etk_Event_Selection_Request event; + Etk_Selection_Data_Files event_files; + files = ev->data; if (!_etk_dnd_widget || files->num_files < 1) - break; + break; + + event_files.files = files->files; + event_files.num_files = files->num_files; + event_files.data.data = files->data.data; + event_files.data.length = files->data.length; + event_files.data.free = files->data.free; - /* free old data, should this be done here? */ - for (i = 0; i < _etk_dnd_widget->dnd_files_num; i++) - free(_etk_dnd_widget->dnd_files[i]); - free(_etk_dnd_widget->dnd_files); - - _etk_dnd_widget->dnd_files = calloc(files->num_files, sizeof(char*)); - - /* Fill in the drop data into the widget */ - _etk_dnd_widget->dnd_files_num = files->num_files; - for (i = 0; i < files->num_files; i++) - _etk_dnd_widget->dnd_files[i] = strdup(files->files[i]); + event.data = &event_files; + event.content = ETK_SELECTION_CONTENT_FILES; + + /* emit the drop signal so the widget can react */ + etk_widget_drag_drop(_etk_dnd_widget, &event); } + else if(!strcmp(ev->target, "text/plain") || + !strcmp(ev->target, ECORE_X_SELECTION_TARGET_UTF8_STRING)) + { + Etk_Event_Selection_Request event; + Etk_Selection_Data_Text event_text; + + text = ev->data; + + if (!_etk_dnd_widget) + break; + + event_text.text = text->text; + event_text.data.data = text->data.data; + event_text.data.length = text->data.length; + event_text.data.free = text->data.free; - /* emit the drop signal so the widget can react */ - etk_widget_drag_drop(_etk_dnd_widget); + event.data = &event_text; + event.content = ETK_SELECTION_CONTENT_TEXT; + + /* emit the drop signal so the widget can react */ + etk_widget_drag_drop(_etk_dnd_widget, &event); + } + else + { + /* couldnt find any data type that etk supports, send raw data */ + Etk_Event_Selection_Request event; + + event.data = ev->data; + event.content = ETK_SELECTION_CONTENT_CUSTOM; + + /* emit the drop signal so the widget can react */ + etk_widget_drag_drop(_etk_dnd_widget, &event); + } + _etk_dnd_widget = NULL; ecore_x_dnd_send_finished(); @@ -406,10 +451,21 @@ { /* emit signal to widget that the clipboard text is sent to it */ Etk_Event_Selection_Request event; + Etk_Selection_Data_Text event_text; text = ev->data; - event.data = text->text; - event.content = ETK_SELECTION_CONTENT_TEXT; + + if (!_etk_selection_widget) + break; + + event_text.text = text->text; + event_text.data.data = text->data.data; + event_text.data.length = text->data.length; + event_text.data.free = text->data.free; + + event.data = &event_text; + event.content = ETK_SELECTION_CONTENT_TEXT; + etk_widget_clipboard_received(_etk_selection_widget, &event); } break; =================================================================== RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/etk_dnd.h,v retrieving revision 1.5 retrieving revision 1.6 diff -u -3 -r1.5 -r1.6 --- etk_dnd.h 13 Feb 2006 00:00:01 -0000 1.5 +++ etk_dnd.h 14 Feb 2006 13:37:38 -0000 1.6 @@ -11,21 +11,46 @@ #define ETK_SELECTION_TARGET_UTF8_STRING "UTF8_STRING" #define ETK_SELECTION_TARGET_FILENAME "FILENAME" +enum _Etk_Selection_Content +{ + ETK_SELECTION_CONTENT_NONE, + ETK_SELECTION_CONTENT_TEXT, + ETK_SELECTION_CONTENT_FILES, + ETK_SELECTION_CONTENT_TARGETS, + ETK_SELECTION_CONTENT_CUSTOM +}; + struct _Etk_Event_Selection_Request -{ +{ void *data; - enum - { - ETK_SELECTION_CONTENT_NONE, - ETK_SELECTION_CONTENT_TEXT, - ETK_SELECTION_CONTENT_FILES, - ETK_SELECTION_CONTENT_TARGETS, - ETK_SELECTION_CONTENT_CUSTOM - } content; + Etk_Selection_Content content; }; +struct _Etk_Selection_Data +{ + unsigned char *data; + int length; + + int (*free)(void *data); +}; + +struct _Etk_Selection_Data_Files +{ + Etk_Selection_Data data; + char **files; + int num_files; +}; + +struct _Etk_Selection_Data_Text +{ + Etk_Selection_Data data; + char *text; +}; + + struct _Etk_Selection_Data_Targets { + Etk_Selection_Data data; char **targets; int num_targets; }; =================================================================== RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/etk_types.h,v retrieving revision 1.26 retrieving revision 1.27 diff -u -3 -r1.26 -r1.27 --- etk_types.h 12 Feb 2006 13:13:45 -0000 1.26 +++ etk_types.h 14 Feb 2006 13:37:38 -0000 1.27 @@ -20,8 +20,8 @@ typedef struct _Etk_Signal_Callback Etk_Signal_Callback; typedef struct _Etk_Property Etk_Property; typedef struct _Etk_Property_Value Etk_Property_Value; -typedef enum _Etk_Property_Type Etk_Property_Type; -typedef enum _Etk_Property_Flags Etk_Property_Flags; +typedef enum _Etk_Property_Type Etk_Property_Type; +typedef enum _Etk_Property_Flags Etk_Property_Flags; typedef struct _Etk_String Etk_String; typedef void (*Etk_Constructor)(Etk_Object *object); @@ -40,13 +40,13 @@ typedef struct _Etk_Event_Key_Up_Down Etk_Event_Key_Up_Down; typedef struct _Etk_Size Etk_Size; typedef struct _Etk_Geometry Etk_Geometry; -typedef enum _Etk_Stock_Id Etk_Stock_Id; -typedef enum _Etk_Stock_Size Etk_Stock_Size; -typedef enum _Etk_Pointer_Type Etk_Pointer_Type; +typedef enum _Etk_Stock_Id Etk_Stock_Id; +typedef enum _Etk_Stock_Size Etk_Stock_Size; +typedef enum _Etk_Pointer_Type Etk_Pointer_Type; typedef struct _Etk_Toplevel_Widget Etk_Toplevel_Widget; typedef struct _Etk_Window Etk_Window; typedef struct _Etk_Dialog Etk_Dialog; -typedef enum _Etk_Dialog_Response_ID Etk_Dialog_Response_ID; +typedef enum _Etk_Dialog_Response_ID Etk_Dialog_Response_ID; typedef struct _Etk_Container Etk_Container; typedef struct _Etk_Bin Etk_Bin; typedef struct _Etk_Box Etk_Box; @@ -59,7 +59,7 @@ typedef struct _Etk_Paned Etk_Paned; typedef struct _Etk_HPaned Etk_HPaned; typedef struct _Etk_VPaned Etk_VPaned; -typedef enum _Etk_Scrolled_View_Policy Etk_Scrolled_View_Policy; +typedef enum _Etk_Scrolled_View_Policy Etk_Scrolled_View_Policy; typedef struct _Etk_Scrolled_View Etk_Scrolled_View; typedef struct _Etk_Viewport Etk_Viewport; typedef struct _Etk_Image Etk_Image; @@ -76,13 +76,13 @@ typedef struct _Etk_Colorpicker Etk_Colorpicker; typedef struct _Etk_Colorpicker_Vertical Etk_Colorpicker_Vertical; typedef struct _Etk_Colorpicker_Square Etk_Colorpicker_Square; -typedef enum _Etk_Color_Mode Etk_Color_Mode; +typedef enum _Etk_Color_Mode Etk_Color_Mode; typedef struct _Etk_Tree Etk_Tree; -typedef enum _Etk_Tree_Mode Etk_Tree_Mode; +typedef enum _Etk_Tree_Mode Etk_Tree_Mode; typedef struct _Etk_Tree_Col Etk_Tree_Col; typedef struct _Etk_Tree_Row Etk_Tree_Row; typedef struct _Etk_Tree_Model Etk_Tree_Model; -typedef enum _Etk_Tree_Model_Image_Type Etk_Tree_Model_Image_Type; +typedef enum _Etk_Tree_Model_Image_Type Etk_Tree_Model_Image_Type; typedef struct _Etk_Range Etk_Range; typedef struct _Etk_Slider Etk_Slider; typedef struct _Etk_HSlider Etk_HSlider; @@ -103,11 +103,14 @@ typedef struct _Etk_Filechooser_Widget Etk_Filechooser_Widget; typedef struct _Etk_Notebook Etk_Notebook; typedef struct _Etk_Progress_Bar Etk_Progress_Bar; -typedef enum _Etk_Progress_Bar_Orientation Etk_Progress_Bar_Orientation; +typedef enum _Etk_Progress_Bar_Orientation Etk_Progress_Bar_Orientation; typedef struct _Etk_Spin_Button Etk_Spin_Button; typedef struct _Etk_Event_Selection_Request Etk_Event_Selection_Request; +typedef struct _Etk_Selection_Data Etk_Selection_Data; +typedef struct _Etk_Selection_Data_Files Etk_Selection_Data_Files; +typedef struct _Etk_Selection_Data_Text Etk_Selection_Data_Text; typedef struct _Etk_Selection_Data_Targets Etk_Selection_Data_Targets; - +typedef enum _Etk_Selection_Content Etk_Selection_Content; /** * @enum Etk_Fill_Policy_Flags * @brief Describes how a child should fill the space allocated by its parent container =================================================================== RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/etk_widget.c,v retrieving revision 1.32 retrieving revision 1.33 diff -u -3 -r1.32 -r1.33 --- etk_widget.c 14 Feb 2006 02:28:02 -0000 1.32 +++ etk_widget.c 14 Feb 2006 13:37:38 -0000 1.33 @@ -180,7 +180,7 @@ _etk_widget_signals[ETK_WIDGET_LEAVE_SIGNAL] = etk_signal_new("leave", widget_type, ETK_MEMBER_OFFSET(Etk_Widget, leave), etk_marshaller_VOID__VOID, NULL, NULL); _etk_widget_signals[ETK_WIDGET_FOCUS_SIGNAL] = etk_signal_new("focus", widget_type, ETK_MEMBER_OFFSET(Etk_Widget, focus), etk_marshaller_VOID__VOID, NULL, NULL); _etk_widget_signals[ETK_WIDGET_UNFOCUS_SIGNAL] = etk_signal_new("unfocus", widget_type, ETK_MEMBER_OFFSET(Etk_Widget, unfocus), etk_marshaller_VOID__VOID, NULL, NULL); - _etk_widget_signals[ETK_WIDGET_DRAG_DROP_SIGNAL] = etk_signal_new("drag_drop", widget_type, ETK_MEMBER_OFFSET(Etk_Widget, drag_drop), etk_marshaller_VOID__VOID, NULL, NULL); + _etk_widget_signals[ETK_WIDGET_DRAG_DROP_SIGNAL] = etk_signal_new("drag_drop", widget_type, -1, etk_marshaller_VOID__POINTER, NULL, NULL); _etk_widget_signals[ETK_WIDGET_DRAG_MOTION_SIGNAL] = etk_signal_new("drag_motion", widget_type, ETK_MEMBER_OFFSET(Etk_Widget, drag_motion), etk_marshaller_VOID__VOID, NULL, NULL); _etk_widget_signals[ETK_WIDGET_DRAG_ENTER_SIGNAL] = etk_signal_new("drag_enter", widget_type, ETK_MEMBER_OFFSET(Etk_Widget, drag_enter), etk_marshaller_VOID__VOID, NULL, NULL); _etk_widget_signals[ETK_WIDGET_DRAG_LEAVE_SIGNAL] = etk_signal_new("drag_leave", widget_type, ETK_MEMBER_OFFSET(Etk_Widget, drag_leave), etk_marshaller_VOID__VOID, NULL, NULL); @@ -1355,25 +1355,6 @@ } /** - * @brief Gets the list of the files dropped on the widget - * @param widget a widget - * @param on ETK_TRUE to enable dnd, ETK_FALSE to disable it - */ -const char **etk_widget_dnd_files_get(Etk_Widget *widget, int *num_files) -{ - if (!widget || !widget->accepts_dnd || !widget->dnd_files) - { - if (num_files) - num_files = 0; - return NULL; - } - - if (num_files) - *num_files = widget->dnd_files_num; - return (const char **)widget->dnd_files; -} - -/** * @brief Gets the list of the widgets that are dnd destinations * @return Returns the list of the dnd destination widgets */ @@ -1386,11 +1367,13 @@ * @brief Sends the "drag_drop" signal * @param widget a widget */ -void etk_widget_drag_drop(Etk_Widget *widget) +void etk_widget_drag_drop(Etk_Widget *widget, Etk_Event_Selection_Request *event) { if (!widget) return; - etk_signal_emit(_etk_widget_signals[ETK_WIDGET_DRAG_DROP_SIGNAL], ETK_OBJECT(widget), NULL); + etk_signal_emit(_etk_widget_signals[ETK_WIDGET_DRAG_DROP_SIGNAL], ETK_OBJECT(widget), NULL, event); + /* FIXME: why isnt this being emitted automatically?!? */ + etk_widget_theme_object_signal_emit(widget, "drag_drop"); } /** @@ -1520,8 +1503,6 @@ widget->need_theme_min_size_recalc = ETK_FALSE; widget->swallowed = ETK_FALSE; widget->accepts_dnd = ETK_FALSE; - widget->dnd_files = NULL; - widget->dnd_files_num = 0; widget->dnd_types = NULL; widget->dnd_types_num = 0; @@ -1553,9 +1534,6 @@ etk_widget_parent_set(widget, NULL); } - for (i = 0; i < widget->dnd_files_num; i++) - free(widget->dnd_files[i]); - free(widget->dnd_files); if (widget->accepts_dnd) _etk_widget_dnd_dest_widgets = evas_list_remove(_etk_widget_dnd_dest_widgets, widget); @@ -1724,6 +1702,7 @@ { if (!widget) return; + etk_widget_theme_object_signal_emit(widget, "drag_drop"); } =================================================================== RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/etk_widget.h,v retrieving revision 1.20 retrieving revision 1.21 diff -u -3 -r1.20 -r1.21 --- etk_widget.h 14 Feb 2006 02:28:02 -0000 1.20 +++ etk_widget.h 14 Feb 2006 13:37:38 -0000 1.21 @@ -192,8 +192,6 @@ unsigned char need_theme_min_size_recalc : 1; unsigned char accepts_dnd : 1; - char **dnd_files; - int dnd_files_num; char **dnd_types; int dnd_types_num; }; @@ -266,12 +264,14 @@ void etk_widget_clip_unset(Etk_Widget *widget); Evas_Object *etk_widget_clip_get(Etk_Widget *widget); -void etk_widget_dnd_dest_set(Etk_Widget *widget, Etk_Bool on); -Etk_Bool etk_widget_dnd_dest_get(Etk_Widget *widget); -Evas_List *etk_widget_dnd_dest_widgets_get(); +void etk_widget_dnd_dest_set(Etk_Widget *widget, Etk_Bool on); +Etk_Bool etk_widget_dnd_dest_get(Etk_Widget *widget); +Evas_List *etk_widget_dnd_dest_widgets_get(); const char **etk_widget_dnd_files_get(Etk_Widget *e, int *num_files); - -void etk_widget_drag_drop(Etk_Widget *widget); +void etk_widget_dnd_types_set(Etk_Widget *widget, char **types, int num); +const char **etk_widget_dnd_types_get(Etk_Widget *widget, int *num); + +void etk_widget_drag_drop(Etk_Widget *widget, Etk_Event_Selection_Request *event); void etk_widget_drag_motion(Etk_Widget *widget); void etk_widget_drag_enter(Etk_Widget *widget); void etk_widget_drag_leave(Etk_Widget *widget); |
From: <enl...@li...> - 2006-02-14 13:38:18
|
Enlightenment CVS committal Author : codewarrior Project : e17 Module : proto Dir : e17/proto/etk/src/bin Modified Files: etk_xdnd_test.c Log Message: - add two new type: Etk_Selection_Data_Files Etk_Selection_Data_Text - make all dnd, selection, clipboard stuff work properly with events and event structs - remove useless junk =================================================================== RCS file: /cvsroot/enlightenment/e17/proto/etk/src/bin/etk_xdnd_test.c,v retrieving revision 1.6 retrieving revision 1.7 diff -u -3 -r1.6 -r1.7 --- etk_xdnd_test.c 14 Feb 2006 02:28:02 -0000 1.6 +++ etk_xdnd_test.c 14 Feb 2006 13:37:38 -0000 1.7 @@ -1,11 +1,12 @@ #include "etk_test.h" #include <string.h> +#include <stdlib.h> #include "config.h" -static void _etk_test_xdnd_drag_drop_cb(Etk_Object *object, void *data); +static void _etk_test_xdnd_drag_drop_cb(Etk_Object *object, void *event, void *data); static void _etk_test_xdnd_drag_motion_cb(Etk_Object *object, void *data); static void _etk_test_xdnd_drag_leave_cb(Etk_Object *object, void *data); -static void _etk_test_xdnd_drag_drop_cb2(Etk_Object *object, void *data); +static void _etk_test_xdnd_drag_drop_cb2(Etk_Object *object, void *event, void *data); static void _etk_test_xdnd_clipboard_text_request_cb(Etk_Object *object, void *event, void *data); static void _etk_test_xdnd_button_paste_cb(Etk_Object *object, void *data); static void _etk_test_xdnd_button_copy_cb(Etk_Object *object, void *data); @@ -95,18 +96,26 @@ } /* Called when a file is dropped on the button */ -static void _etk_test_xdnd_drag_drop_cb(Etk_Object *object, void *data) +static void _etk_test_xdnd_drag_drop_cb(Etk_Object *object, void *event, void *data) { - int num_files, i; - const char **files; + Etk_Event_Selection_Request *ev; + Etk_Selection_Data_Files *files; - files = etk_widget_dnd_files_get(ETK_WIDGET(object), &num_files); - printf("Our test widget got a drop with %d files\n", num_files); + int i; - for (i = 0; i < num_files; i++) + ev = event; + + if(ev->content != ETK_SELECTION_CONTENT_FILES) + return; + + files = ev->data; + + printf("Our test widget got a drop with %d files\n", files->num_files); + + for (i = 0; i < files->num_files; i++) { - printf("Widget got the file: %s\n", files[i]); - etk_label_set(ETK_LABEL(data), files[i]); + printf("Widget got the file: %s\n", files->files[i]); + etk_label_set(ETK_LABEL(data), files->files[i]); } } @@ -123,24 +132,27 @@ } /* Called when a file is dropped on the second button */ -static void _etk_test_xdnd_drag_drop_cb2(Etk_Object *object, void *data) +static void _etk_test_xdnd_drag_drop_cb2(Etk_Object *object, void *event, void *data) { - int num_files, i; - const char **files; - - files = etk_widget_dnd_files_get(ETK_WIDGET(object), &num_files); + Etk_Event_Selection_Request *ev; + Etk_Selection_Data_Files *files; + int i; + + ev = event; - if(files == NULL || num_files < 1) + if(ev->content != ETK_SELECTION_CONTENT_FILES) return; - printf("Our test widget got a drop with %d files\n", num_files); + files = ev->data; + + printf("Our test widget got a drop with %d files\n", files->num_files); - for (i = 0; i < num_files; i++) + for (i = 0; i < files->num_files; i++) { char *image; - printf("Widget got the file: %s\n", files[i]); - if ((image = strstr(files[i], "file://")) != NULL) + printf("Widget got the file: %s\n", files->files[i]); + if ((image = strstr(files->files[i], "file://")) != NULL) etk_image_set_from_file(ETK_IMAGE(data), image + strlen("file://")); } } @@ -149,9 +161,11 @@ static void _etk_test_xdnd_clipboard_text_request_cb(Etk_Object *object, void *event, void *data) { Etk_Event_Selection_Request *ev; + Etk_Selection_Data_Text *ev_text; ev = event; - etk_label_set(ETK_LABEL(object), (char *)ev->data); + ev_text = ev->data; + etk_label_set(ETK_LABEL(object), ev_text->text); } /* Called when the "paste" button is clicked */ @@ -174,9 +188,11 @@ static void _etk_test_xdnd_selection_text_request_cb(Etk_Object *object, void *event, void *data) { Etk_Event_Selection_Request *ev; + Etk_Selection_Data_Text *ev_text; ev = event; - etk_label_set(ETK_LABEL(object), (char *)ev->data); + ev_text = ev->data; + etk_label_set(ETK_LABEL(object), ev_text->text); } /* Called when the "get selection" button is clicked */ |
From: <enl...@li...> - 2006-02-14 23:33:07
|
Enlightenment CVS committal Author : codewarrior Project : e17 Module : proto Dir : e17/proto/etk/src/bin Modified Files: etk_xdnd_test.c Log Message: - add test for text dnd - ++pretyyness =================================================================== RCS file: /cvsroot/enlightenment/e17/proto/etk/src/bin/etk_xdnd_test.c,v retrieving revision 1.7 retrieving revision 1.8 diff -u -3 -r1.7 -r1.8 --- etk_xdnd_test.c 14 Feb 2006 13:37:38 -0000 1.7 +++ etk_xdnd_test.c 14 Feb 2006 23:32:59 -0000 1.8 @@ -7,6 +7,7 @@ static void _etk_test_xdnd_drag_motion_cb(Etk_Object *object, void *data); static void _etk_test_xdnd_drag_leave_cb(Etk_Object *object, void *data); static void _etk_test_xdnd_drag_drop_cb2(Etk_Object *object, void *event, void *data); +static void _etk_test_xdnd_drag_drop_cb3(Etk_Object *object, void *event, void *data); static void _etk_test_xdnd_clipboard_text_request_cb(Etk_Object *object, void *event, void *data); static void _etk_test_xdnd_button_paste_cb(Etk_Object *object, void *data); static void _etk_test_xdnd_button_copy_cb(Etk_Object *object, void *data); @@ -19,10 +20,13 @@ { static Etk_Widget *win = NULL; Etk_Widget *vbox; + Etk_Widget *vbox2; Etk_Widget *button; Etk_Widget *label; Etk_Widget *image; Etk_Widget *entry; + Etk_Widget *frame; + Etk_Widget *sep; char **dnd_types; int dnd_types_num; @@ -32,65 +36,107 @@ return; } + /* create window */ win = etk_window_new(); - etk_window_title_set(ETK_WINDOW(win), _("Etk X Drag / Drop Test")); + etk_window_title_set(ETK_WINDOW(win), _("Etk DnD / Selections Test")); etk_container_border_width_set(ETK_CONTAINER(win), 5); etk_signal_connect("delete_event", ETK_OBJECT(win), ETK_CALLBACK(etk_window_hide_on_delete), NULL); + /* create main box */ vbox = etk_vbox_new(ETK_FALSE, 3); etk_container_add(ETK_CONTAINER(win), vbox); - - label = etk_label_new(_("No File Set")); + + /* frame for DnD tests */ + frame = etk_frame_new("Drag and Drop"); + etk_container_add(ETK_CONTAINER(vbox), frame); + vbox2 = etk_vbox_new(ETK_FALSE, 3); + etk_container_add(ETK_CONTAINER(frame), vbox2); dnd_types_num = 1; dnd_types = calloc(dnd_types_num, sizeof(char*)); dnd_types[0] = strdup("text/uri-list"); - button = etk_button_new_with_label(_("Drag Any File Onto Me")); + label = etk_label_new(_("No File Set")); + button = etk_button_new_with_label(_("Drop a file here (text/uri-list)")); etk_widget_dnd_dest_set(button, ETK_TRUE); etk_widget_dnd_types_set(button, dnd_types, dnd_types_num); etk_signal_connect("drag_drop", ETK_OBJECT(button), ETK_CALLBACK(_etk_test_xdnd_drag_drop_cb), label); etk_signal_connect("drag_motion", ETK_OBJECT(button), ETK_CALLBACK(_etk_test_xdnd_drag_motion_cb), NULL); etk_signal_connect("drag_leave", ETK_OBJECT(button), ETK_CALLBACK(_etk_test_xdnd_drag_leave_cb), NULL); - etk_box_pack_start(ETK_BOX(vbox), button, ETK_FALSE, ETK_FALSE, 0); - - etk_box_pack_start(ETK_BOX(vbox), label, ETK_FALSE, ETK_FALSE, 0); + etk_box_pack_start(ETK_BOX(vbox2), button, ETK_FALSE, ETK_FALSE, 0); + etk_box_pack_start(ETK_BOX(vbox2), label, ETK_FALSE, ETK_FALSE, 0); + sep = etk_hseparator_new(); + etk_box_pack_start(ETK_BOX(vbox2), sep, ETK_FALSE, ETK_FALSE, 0); + image = etk_image_new_from_file(PACKAGE_DATA_DIR "/images/e_icon.png"); - - button = etk_button_new_with_label(_("Drag Any Image Onto Me")); + button = etk_button_new_with_label(_("Drop an image here")); etk_widget_dnd_dest_set(button, ETK_TRUE); + dnd_types_num = 1; + dnd_types = calloc(dnd_types_num, sizeof(char*)); + dnd_types[0] = strdup("text/uri-list"); + etk_widget_dnd_types_set(button, dnd_types, dnd_types_num); etk_signal_connect("drag_drop", ETK_OBJECT(button), ETK_CALLBACK(_etk_test_xdnd_drag_drop_cb2), image); - etk_box_pack_start(ETK_BOX(vbox), button, ETK_FALSE, ETK_FALSE, 0); - etk_box_pack_start(ETK_BOX(vbox), image, ETK_FALSE, ETK_FALSE, 0); + etk_box_pack_start(ETK_BOX(vbox2), button, ETK_FALSE, ETK_FALSE, 0); + etk_box_pack_start(ETK_BOX(vbox2), image, ETK_FALSE, ETK_FALSE, 0); - label = etk_label_new(""); - etk_signal_connect("clipboard_received", ETK_OBJECT(label), ETK_CALLBACK(_etk_test_xdnd_clipboard_text_request_cb), NULL); + sep = etk_hseparator_new(); + etk_box_pack_start(ETK_BOX(vbox2), sep, ETK_FALSE, ETK_FALSE, 0); + label = etk_label_new(_("Drop some text below")); + entry = etk_entry_new(); + dnd_types_num = 1; + dnd_types = calloc(dnd_types_num, sizeof(char*)); + dnd_types[0] = strdup("text/plain"); + etk_widget_dnd_types_set(entry, dnd_types, dnd_types_num); + etk_widget_dnd_dest_set(entry, ETK_TRUE); + etk_signal_connect("drag_drop", ETK_OBJECT(entry), ETK_CALLBACK(_etk_test_xdnd_drag_drop_cb3), NULL); + etk_box_pack_start(ETK_BOX(vbox2), label, ETK_FALSE, ETK_FALSE, 0); + etk_box_pack_start(ETK_BOX(vbox2), entry, ETK_FALSE, ETK_FALSE, 0); + + /* frame for clipboard tests */ + frame = etk_frame_new("Clipboard"); + etk_container_add(ETK_CONTAINER(vbox), frame); + vbox2 = etk_vbox_new(ETK_FALSE, 0); + etk_container_add(ETK_CONTAINER(frame), vbox2); + + label = etk_label_new(""); + etk_signal_connect("clipboard_received", ETK_OBJECT(label), ETK_CALLBACK(_etk_test_xdnd_clipboard_text_request_cb), NULL); button = etk_button_new_with_label(_("Press me to paste text")); etk_signal_connect("clicked", ETK_OBJECT(button), ETK_CALLBACK(_etk_test_xdnd_button_paste_cb), label); - etk_box_pack_start(ETK_BOX(vbox), button, ETK_FALSE, ETK_FALSE, 0); - etk_box_pack_start(ETK_BOX(vbox), label, ETK_FALSE, ETK_FALSE, 0); + etk_box_pack_start(ETK_BOX(vbox2), button, ETK_FALSE, ETK_FALSE, 0); + etk_box_pack_start(ETK_BOX(vbox2), label, ETK_FALSE, ETK_FALSE, 0); + + sep = etk_hseparator_new(); + etk_box_pack_start(ETK_BOX(vbox2), sep, ETK_FALSE, ETK_FALSE, 0); entry = etk_entry_new(); button = etk_button_new_with_label(_("Click me to copy text below")); etk_signal_connect("clicked", ETK_OBJECT(button), ETK_CALLBACK(_etk_test_xdnd_button_copy_cb), entry); - etk_box_pack_start(ETK_BOX(vbox), button, ETK_FALSE, ETK_FALSE, 0); - etk_box_pack_start(ETK_BOX(vbox), entry, ETK_FALSE, ETK_FALSE, 0); + etk_box_pack_start(ETK_BOX(vbox2), button, ETK_FALSE, ETK_FALSE, 0); + etk_box_pack_start(ETK_BOX(vbox2), entry, ETK_FALSE, ETK_FALSE, 0); - label = etk_label_new(""); - etk_signal_connect("selection_received", ETK_OBJECT(label), ETK_CALLBACK(_etk_test_xdnd_selection_text_request_cb), NULL); + /* frame for selection test */ + frame = etk_frame_new("Selections"); + etk_container_add(ETK_CONTAINER(vbox), frame); + vbox2 = etk_vbox_new(ETK_FALSE, 0); + etk_container_add(ETK_CONTAINER(frame), vbox2); + label = etk_label_new(""); + etk_signal_connect("selection_received", ETK_OBJECT(label), ETK_CALLBACK(_etk_test_xdnd_selection_text_request_cb), NULL); button = etk_button_new_with_label(_("Press me to get selection text")); etk_signal_connect("clicked", ETK_OBJECT(button), ETK_CALLBACK(_etk_test_xdnd_button_selection_get_cb), label); - etk_box_pack_start(ETK_BOX(vbox), button, ETK_FALSE, ETK_FALSE, 0); - etk_box_pack_start(ETK_BOX(vbox), label, ETK_FALSE, ETK_FALSE, 0); + etk_box_pack_start(ETK_BOX(vbox2), button, ETK_FALSE, ETK_FALSE, 0); + etk_box_pack_start(ETK_BOX(vbox2), label, ETK_FALSE, ETK_FALSE, 0); + + sep = etk_hseparator_new(); + etk_box_pack_start(ETK_BOX(vbox2), sep, ETK_FALSE, ETK_FALSE, 0); entry = etk_entry_new(); button = etk_button_new_with_label(_("Click me to set selection text")); etk_signal_connect("clicked", ETK_OBJECT(button), ETK_CALLBACK(_etk_test_xdnd_button_selection_set_cb), entry); - etk_box_pack_start(ETK_BOX(vbox), button, ETK_FALSE, ETK_FALSE, 0); - etk_box_pack_start(ETK_BOX(vbox), entry, ETK_FALSE, ETK_FALSE, 0); + etk_box_pack_start(ETK_BOX(vbox2), button, ETK_FALSE, ETK_FALSE, 0); + etk_box_pack_start(ETK_BOX(vbox2), entry, ETK_FALSE, ETK_FALSE, 0); etk_widget_show_all(win); } @@ -157,6 +203,22 @@ } } +/* Called when text is dropped on the entry */ +static void _etk_test_xdnd_drag_drop_cb3(Etk_Object *object, void *event, void *data) +{ + Etk_Event_Selection_Request *ev; + Etk_Selection_Data_Text *text; + + ev = event; + + if(ev->content != ETK_SELECTION_CONTENT_TEXT) + return; + + text = ev->data; + + etk_entry_text_set(ETK_ENTRY(object), text->text); +} + /* Called when a some text is pasted */ static void _etk_test_xdnd_clipboard_text_request_cb(Etk_Object *object, void *event, void *data) { |
From: <enl...@li...> - 2006-02-14 23:37:31
|
Enlightenment CVS committal Author : codewarrior Project : e17 Module : proto Dir : e17/proto/extrackt Modified Files: TODO Log Message: - ++todo =================================================================== RCS file: /cvsroot/enlightenment/e17/proto/extrackt/TODO,v retrieving revision 1.4 retrieving revision 1.5 diff -u -3 -r1.4 -r1.5 --- TODO 7 Feb 2006 02:34:01 -0000 1.4 +++ TODO 14 Feb 2006 23:37:25 -0000 1.5 @@ -1,4 +1,6 @@ TODO: +- when new cd is added, clear tracks and re-populate before cddb lookup + - make sure we save ALL config - segv when rippers / encoders are not installed |
From: <enl...@li...> - 2006-02-15 03:14:00
|
Enlightenment CVS committal Author : codewarrior Project : e17 Module : proto Dir : e17/proto/etk/src/bin Modified Files: etk_xdnd_test.c Log Message: - begin working on drag support =================================================================== RCS file: /cvsroot/enlightenment/e17/proto/etk/src/bin/etk_xdnd_test.c,v retrieving revision 1.8 retrieving revision 1.9 diff -u -3 -r1.8 -r1.9 --- etk_xdnd_test.c 14 Feb 2006 23:32:59 -0000 1.8 +++ etk_xdnd_test.c 15 Feb 2006 03:13:54 -0000 1.9 @@ -3,6 +3,9 @@ #include <stdlib.h> #include "config.h" +static Etk_Widget *drag; +static int start = 1; + static void _etk_test_xdnd_drag_drop_cb(Etk_Object *object, void *event, void *data); static void _etk_test_xdnd_drag_motion_cb(Etk_Object *object, void *data); static void _etk_test_xdnd_drag_leave_cb(Etk_Object *object, void *data); @@ -14,7 +17,9 @@ static void _etk_test_xdnd_selection_text_request_cb(Etk_Object *object, void *event, void *data); static void _etk_test_xdnd_button_selection_set_cb(Etk_Object *object, void *data); static void _etk_test_xdnd_button_selection_get_cb(Etk_Object *object, void *data); - +static void _etk_test_xdnd_mouse_move_cb(Etk_Object *object, void *event, void *data); +static void _etk_test_xdnd_drag_end_cb(Etk_Object *object, void *data); + /* Creates the window for the xdnd test */ void etk_test_xdnd_window_create(void *data) { @@ -93,6 +98,18 @@ etk_signal_connect("drag_drop", ETK_OBJECT(entry), ETK_CALLBACK(_etk_test_xdnd_drag_drop_cb3), NULL); etk_box_pack_start(ETK_BOX(vbox2), label, ETK_FALSE, ETK_FALSE, 0); etk_box_pack_start(ETK_BOX(vbox2), entry, ETK_FALSE, ETK_FALSE, 0); + + sep = etk_hseparator_new(); + etk_box_pack_start(ETK_BOX(vbox2), sep, ETK_FALSE, ETK_FALSE, 0); + + button = etk_button_new_with_label(_("Drag Me!")); + etk_signal_connect("mouse_move", ETK_OBJECT(button), ETK_CALLBACK(_etk_test_xdnd_mouse_move_cb), NULL); + drag = etk_drag_new(); + etk_signal_connect("drag_end", ETK_OBJECT(drag), ETK_CALLBACK(_etk_test_xdnd_drag_end_cb), NULL); + label = etk_label_new(_("Dragged Text!")); + etk_container_add(ETK_CONTAINER(drag), etk_button_new_with_label("Foo!")); + etk_box_pack_start(ETK_BOX(vbox2), button, ETK_FALSE, ETK_FALSE, 0); + /* frame for clipboard tests */ frame = etk_frame_new("Clipboard"); @@ -130,13 +147,13 @@ etk_box_pack_start(ETK_BOX(vbox2), label, ETK_FALSE, ETK_FALSE, 0); sep = etk_hseparator_new(); - etk_box_pack_start(ETK_BOX(vbox2), sep, ETK_FALSE, ETK_FALSE, 0); + etk_box_pack_start(ETK_BOX(vbox2), sep, ETK_FALSE, ETK_FALSE, 0); entry = etk_entry_new(); button = etk_button_new_with_label(_("Click me to set selection text")); etk_signal_connect("clicked", ETK_OBJECT(button), ETK_CALLBACK(_etk_test_xdnd_button_selection_set_cb), entry); etk_box_pack_start(ETK_BOX(vbox2), button, ETK_FALSE, ETK_FALSE, 0); - etk_box_pack_start(ETK_BOX(vbox2), entry, ETK_FALSE, ETK_FALSE, 0); + etk_box_pack_start(ETK_BOX(vbox2), entry, ETK_FALSE, ETK_FALSE, 0); etk_widget_show_all(win); } @@ -272,3 +289,33 @@ if(text) etk_selection_text_set(ETK_WIDGET(data), text, strlen(text) + 1); } + +static void _etk_test_xdnd_mouse_move_cb(Etk_Object *object, void *event, void *data) +{ + Etk_Event_Mouse_Move *ev; + + ev = event; + + if(ev->buttons & 0x001 && start) + { + const char **types; + unsigned int num_types; + char *data; + + start = 0; + types = calloc(1, sizeof(char*)); + num_types = 1; + types[0] = strdup("text/plain"); + data = strdup("This is the drag data!"); + + etk_drag_types_set(ETK_DRAG(drag), types, num_types); + etk_drag_data_set(ETK_DRAG(drag), data, strlen(data) + 1); + etk_drag_begin(ETK_DRAG(drag)); + } +} + +static void _etk_test_xdnd_drag_end_cb(Etk_Object *object, void *data) +{ + start = 1; +} + |
From: <enl...@li...> - 2006-02-15 03:14:00
|
Enlightenment CVS committal Author : codewarrior Project : e17 Module : proto Dir : e17/proto/etk/src/lib Modified Files: etk_dnd.c etk_dnd.h etk_types.h etk_widget.c etk_widget.h Log Message: - begin working on drag support =================================================================== RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/etk_dnd.c,v retrieving revision 1.7 retrieving revision 1.8 diff -u -3 -r1.7 -r1.8 --- etk_dnd.c 14 Feb 2006 13:37:38 -0000 1.7 +++ etk_dnd.c 15 Feb 2006 03:13:54 -0000 1.8 @@ -3,9 +3,11 @@ #include <stdlib.h> #include <string.h> #include <Ecore.h> +#include <Ecore_Evas.h> #include <Ecore_X.h> #include "etk_main.h" #include "etk_widget.h" +#include "etk_toplevel_widget.h" #include "etk_window.h" #include "config.h" @@ -35,6 +37,7 @@ extern Etk_Widget *_etk_selection_widget; +static Etk_Drag *_etk_drag_widget = NULL; static char **_etk_dnd_types = NULL; static int _etk_dnd_types_num = 0; static Etk_Widget *_etk_dnd_widget = NULL; @@ -48,6 +51,8 @@ static int _etk_xdnd_drop_handler(void *data, int type, void *event); static int _etk_xdnd_leave_handler(void *data, int type, void *event); static int _etk_xdnd_selection_handler(void *data, int type, void *event); +static int _etk_xdnd_status_handler(void *data, int type, void *event); +static int _etk_xdnd_finished_handler(void *data, int type, void *event); #endif /************************** @@ -71,6 +76,9 @@ _etk_dnd_handlers = evas_list_append(_etk_dnd_handlers, ecore_event_handler_add(ECORE_X_EVENT_XDND_DROP, _etk_xdnd_drop_handler, NULL)); _etk_dnd_handlers = evas_list_append(_etk_dnd_handlers, ecore_event_handler_add(ECORE_X_EVENT_XDND_LEAVE, _etk_xdnd_leave_handler, NULL)); _etk_dnd_handlers = evas_list_append(_etk_dnd_handlers, ecore_event_handler_add(ECORE_X_EVENT_SELECTION_NOTIFY, _etk_xdnd_selection_handler, NULL)); + _etk_dnd_handlers = evas_list_append(_etk_dnd_handlers, ecore_event_handler_add(ECORE_X_EVENT_XDND_STATUS, _etk_xdnd_status_handler, NULL)); + _etk_dnd_handlers = evas_list_append(_etk_dnd_handlers, ecore_event_handler_add(ECORE_X_EVENT_XDND_FINISHED, _etk_xdnd_finished_handler, NULL)); + #endif return ETK_TRUE; @@ -90,6 +98,123 @@ #endif } +/************************ + * TEMPORARY CODE BEGIN * + ************************/ + +static Ecore_Event_Handler *_etk_drag_mouse_move_handler; +static Ecore_Event_Handler *_etk_drag_mouse_up_handler; + +static void _etk_drag_constructor(Etk_Drag *drag); + +static int _etk_drag_mouse_up_cb(void *data, int type, void *event); +static int _etk_drag_mouse_move_cb(void *data, int type, void *event); + +/** + * @brief Gets the type of an Etk_Drag + * @return Returns the type on an Etk_Drag + */ +Etk_Type *etk_drag_type_get() +{ + static Etk_Type *drag_type = NULL; + + if(!drag_type) + { + drag_type = etk_type_new("Etk_Drag", ETK_WINDOW_TYPE, sizeof(Etk_Drag), ETK_CONSTRUCTOR(_etk_drag_constructor), NULL); + } + + return drag_type; +} + + +/** + * @brief Create a new drag widget + * @return Returns the new drag widget + */ +Etk_Widget *etk_drag_new() +{ + return etk_widget_new(ETK_DRAG_TYPE, NULL); +} + +void etk_drag_types_set(Etk_Drag *drag, const char **types, unsigned int num_types) +{ + int i; + + drag->types = malloc(num_types * sizeof(char *)); + + for (i = 0; i < num_types; i++) + drag->types[i] = strdup(types[i]); + + drag->num_types = num_types; +} + +void etk_drag_data_set(Etk_Drag *drag, void *data, int size) +{ + drag->data = data; + drag->data_size = size; +} + +void etk_drag_begin(Etk_Drag *drag) +{ + _etk_drag_widget = drag; + + etk_widget_show_all(ETK_WIDGET(drag)); + ecore_evas_ignore_events_set((ETK_WINDOW(drag))->ecore_evas, 1); + ecore_x_dnd_types_set((ETK_WINDOW(drag))->x_window, drag->types, drag->num_types); + ecore_x_dnd_begin((ETK_WINDOW(drag))->x_window, drag->data, drag->data_size); + _etk_drag_mouse_move_handler = ecore_event_handler_add(ECORE_X_EVENT_MOUSE_MOVE, _etk_drag_mouse_move_cb, drag); + _etk_drag_mouse_up_handler = ecore_event_handler_add(ECORE_X_EVENT_MOUSE_BUTTON_UP, _etk_drag_mouse_up_cb, drag); +} + +static int _etk_drag_mouse_up_cb(void *data, int type, void *event) +{ + Etk_Drag *drag; + + drag = data; + etk_widget_hide_all(ETK_WIDGET(drag)); + ecore_event_handler_del(_etk_drag_mouse_move_handler); + ecore_event_handler_del(_etk_drag_mouse_up_handler); + ecore_x_dnd_drop(); + etk_widget_drag_end(ETK_WIDGET(drag)); + return 1; +} + +static int _etk_drag_mouse_move_cb(void *data, int type, void *event) +{ + Ecore_X_Event_Mouse_Move *ev; + Etk_Drag *drag; + + drag = data; + ev = event; + + etk_window_move(ETK_WINDOW(drag), ev->root.x, ev->root.y); + return 1; +} + + +/************************** + * + * Etk specific functions + * + **************************/ + +/* Initializes the members */ +static void _etk_drag_constructor(Etk_Drag *drag) +{ + if (!drag) + return; + + etk_window_decorated_set(ETK_WINDOW(drag), ETK_FALSE); + etk_window_shaped_set(ETK_WINDOW(drag), ETK_TRUE); + etk_window_skip_pager_hint_set(ETK_WINDOW(drag), ETK_TRUE); + etk_window_skip_taskbar_hint_set(ETK_WINDOW(drag), ETK_TRUE); + ecore_x_dnd_aware_set((ETK_WINDOW(drag))->x_window, 1); +} + +/********************** + * TEMPORARY CODE END * + **********************/ + /************************** * * Private functions @@ -476,5 +601,31 @@ return 1; } + +static int _etk_xdnd_status_handler(void *data, int type, void *event) +{ + Ecore_X_Event_Xdnd_Status *ev; + + ev = event; + + if (ev->win != (ETK_WINDOW(_etk_drag_widget))->x_window) return 1; + + if(!ev->will_accept) + { + // etk_toplevel_widget_pointer_pop(etk_widget_toplevel_parent_get(ETK_WIDGET(_etk_drag_widget)), ETK_POINTER_RESIZE_BR); + return 1; + } + +// etk_toplevel_widget_pointer_push(etk_widget_toplevel_parent_get(ETK_WIDGET(_etk_drag_widget)), ETK_POINTER_RESIZE_BR); + etk_toplevel_widget_pointer_push(ETK_TOPLEVEL_WIDGET(ETK_WINDOW(_etk_drag_widget)), ETK_POINTER_RESIZE_BR); + + return 1; +} + +static int _etk_xdnd_finished_handler(void *data, int type, void *event) +{ + return 1; +} + #endif =================================================================== RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/etk_dnd.h,v retrieving revision 1.6 retrieving revision 1.7 diff -u -3 -r1.6 -r1.7 --- etk_dnd.h 14 Feb 2006 13:37:38 -0000 1.6 +++ etk_dnd.h 15 Feb 2006 03:13:54 -0000 1.7 @@ -2,6 +2,7 @@ #ifndef _ETK_DND_H_ #define _ETK_DND_H_ +#include "etk_window.h" #include "etk_types.h" #define ETK_SELECTION_TARGET_TARGETS "TARGETS" @@ -55,6 +56,23 @@ int num_targets; }; + +#define ETK_DRAG_TYPE (etk_drag_type_get()) +#define ETK_DRAG(obj) (ETK_OBJECT_CAST((obj), ETK_DRAG_TYPE, Etk_Drag)) +#define ETK_IS_DRAG(obj) (ETK_OBJECT_CHECK_TYPE((obj), ETK_DRAG_TYPE)) + +struct _Etk_Drag +{ + /* private: */ + /* Inherit from Etk_Window */ + Etk_Window window; + + char **types; + unsigned int num_types; + void *data; + int data_size; +}; + Etk_Bool etk_dnd_init(); void etk_dnd_shutdown(); =================================================================== RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/etk_types.h,v retrieving revision 1.27 retrieving revision 1.28 diff -u -3 -r1.27 -r1.28 --- etk_types.h 14 Feb 2006 13:37:38 -0000 1.27 +++ etk_types.h 15 Feb 2006 03:13:54 -0000 1.28 @@ -111,6 +111,7 @@ typedef struct _Etk_Selection_Data_Text Etk_Selection_Data_Text; typedef struct _Etk_Selection_Data_Targets Etk_Selection_Data_Targets; typedef enum _Etk_Selection_Content Etk_Selection_Content; +typedef struct _Etk_Drag Etk_Drag; /** * @enum Etk_Fill_Policy_Flags * @brief Describes how a child should fill the space allocated by its parent container =================================================================== RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/etk_widget.c,v retrieving revision 1.33 retrieving revision 1.34 diff -u -3 -r1.33 -r1.34 --- etk_widget.c 14 Feb 2006 13:37:38 -0000 1.33 +++ etk_widget.c 15 Feb 2006 03:13:54 -0000 1.34 @@ -58,7 +58,8 @@ ETK_WIDGET_DRAG_DROP_SIGNAL, ETK_WIDGET_DRAG_ENTER_SIGNAL, ETK_WIDGET_DRAG_MOTION_SIGNAL, - ETK_WIDGET_DRAG_LEAVE_SIGNAL, + ETK_WIDGET_DRAG_LEAVE_SIGNAL, + ETK_WIDGET_DRAG_END_SIGNAL, ETK_WIDGET_SELECTION_RECEIVED_SIGNAL, ETK_WIDGET_CLIPBOARD_RECEIVED_SIGNAL, ETK_WIDGET_NUM_SIGNALS @@ -96,6 +97,7 @@ static void _etk_widget_drag_motion_handler(Etk_Widget *widget); static void _etk_widget_drag_enter_handler(Etk_Widget *widget); static void _etk_widget_drag_leave_handler(Etk_Widget *widget); +static void _etk_widget_drag_end_handler(Etk_Widget *widget); static void _etk_widget_mouse_in_cb(void *data, Evas *evas, Evas_Object *object, void *event_info); static void _etk_widget_signal_mouse_in_cb(Etk_Object *object, Etk_Event_Mouse_In_Out *event, void *data); @@ -184,6 +186,7 @@ _etk_widget_signals[ETK_WIDGET_DRAG_MOTION_SIGNAL] = etk_signal_new("drag_motion", widget_type, ETK_MEMBER_OFFSET(Etk_Widget, drag_motion), etk_marshaller_VOID__VOID, NULL, NULL); _etk_widget_signals[ETK_WIDGET_DRAG_ENTER_SIGNAL] = etk_signal_new("drag_enter", widget_type, ETK_MEMBER_OFFSET(Etk_Widget, drag_enter), etk_marshaller_VOID__VOID, NULL, NULL); _etk_widget_signals[ETK_WIDGET_DRAG_LEAVE_SIGNAL] = etk_signal_new("drag_leave", widget_type, ETK_MEMBER_OFFSET(Etk_Widget, drag_leave), etk_marshaller_VOID__VOID, NULL, NULL); + _etk_widget_signals[ETK_WIDGET_DRAG_END_SIGNAL] = etk_signal_new("drag_end", widget_type, ETK_MEMBER_OFFSET(Etk_Widget, drag_end), etk_marshaller_VOID__VOID, NULL, NULL); _etk_widget_signals[ETK_WIDGET_SELECTION_RECEIVED_SIGNAL] = etk_signal_new("selection_received", widget_type, -1, etk_marshaller_VOID__POINTER, NULL, NULL); _etk_widget_signals[ETK_WIDGET_CLIPBOARD_RECEIVED_SIGNAL] = etk_signal_new("clipboard_received", widget_type, -1, etk_marshaller_VOID__POINTER, NULL, NULL); _etk_widget_signals[ETK_WIDGET_SCROLL_SIZE_CHANGED_SIGNAL] = etk_signal_new("scroll_size_changed", widget_type, -1, etk_marshaller_VOID__VOID, NULL, NULL); @@ -1411,6 +1414,17 @@ } /** + * @brief Sends the "drag_end" signal + * @param widget a widget + */ +void etk_widget_drag_end(Etk_Widget *widget) +{ + if (!widget) + return; + etk_signal_emit(_etk_widget_signals[ETK_WIDGET_DRAG_END_SIGNAL], ETK_OBJECT(widget), NULL); +} + +/** * @brief Sends the "selection_received" signal * @param widget a widget */ @@ -1469,7 +1483,8 @@ widget->drag_drop = _etk_widget_drag_drop_handler; widget->drag_motion = _etk_widget_drag_motion_handler; widget->drag_enter = _etk_widget_drag_enter_handler; - widget->drag_leave = _etk_widget_drag_leave_handler; + widget->drag_leave = _etk_widget_drag_leave_handler; + widget->drag_end = _etk_widget_drag_end_handler; widget->left_inset = 0; widget->right_inset = 0; @@ -1731,6 +1746,14 @@ etk_widget_theme_object_signal_emit(widget, "drag_leave"); } +/* Default handler for the "drag_end" signal */ +static void _etk_widget_drag_end_handler(Etk_Widget *widget) +{ + if (!widget) + return; + etk_widget_theme_object_signal_emit(widget, "drag_end"); +} + /* Called when the mouse pointer enters the widget */ static void _etk_widget_mouse_in_cb(void *data, Evas *evas, Evas_Object *object, void *event_info) { =================================================================== RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/etk_widget.h,v retrieving revision 1.21 retrieving revision 1.22 diff -u -3 -r1.21 -r1.22 --- etk_widget.h 14 Feb 2006 13:37:38 -0000 1.21 +++ etk_widget.h 15 Feb 2006 03:13:54 -0000 1.22 @@ -177,6 +177,7 @@ void (*drag_motion)(Etk_Widget *widget); void (*drag_enter)(Etk_Widget *widget); void (*drag_leave)(Etk_Widget *widget); + void (*drag_end)(Etk_Widget *widget); unsigned char realized : 1; unsigned char swallowed : 1; @@ -275,6 +276,7 @@ void etk_widget_drag_motion(Etk_Widget *widget); void etk_widget_drag_enter(Etk_Widget *widget); void etk_widget_drag_leave(Etk_Widget *widget); +void etk_widget_drag_end(Etk_Widget *widget); void etk_widget_selection_received(Etk_Widget *widget, Etk_Event_Selection_Request *event); void etk_widget_clipboard_received(Etk_Widget *widget, Etk_Event_Selection_Request *event); |
From: <enl...@li...> - 2006-02-15 12:48:44
|
Enlightenment CVS committal Author : codewarrior Project : e17 Module : proto Dir : e17/proto/etk/src/lib Modified Files: etk_tree.c Log Message: - free at the end. =================================================================== RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/etk_tree.c,v retrieving revision 1.32 retrieving revision 1.33 diff -u -3 -r1.32 -r1.33 --- etk_tree.c 14 Feb 2006 18:39:05 -0000 1.32 +++ etk_tree.c 15 Feb 2006 12:48:39 -0000 1.33 @@ -770,13 +770,14 @@ break; } } - _etk_tree_row_free(row); if (!row->tree->frozen) { etk_signal_emit_by_name("scroll_size_changed", ETK_OBJECT(row->tree->grid), NULL); etk_widget_redraw_queue(ETK_WIDGET(row->tree->grid)); } + + _etk_tree_row_free(row); } /** |
From: <enl...@li...> - 2006-02-15 15:03:25
|
Enlightenment CVS committal Author : codewarrior Project : e17 Module : proto Dir : e17/proto/etk/src/bin Modified Files: etk_xdnd_test.c Log Message: - move Etk_Drag code to its own files - implement several drag / widget helpers - reflect changes in dnd test =================================================================== RCS file: /cvsroot/enlightenment/e17/proto/etk/src/bin/etk_xdnd_test.c,v retrieving revision 1.9 retrieving revision 1.10 diff -u -3 -r1.9 -r1.10 --- etk_xdnd_test.c 15 Feb 2006 03:13:54 -0000 1.9 +++ etk_xdnd_test.c 15 Feb 2006 15:03:15 -0000 1.10 @@ -3,9 +3,6 @@ #include <stdlib.h> #include "config.h" -static Etk_Widget *drag; -static int start = 1; - static void _etk_test_xdnd_drag_drop_cb(Etk_Object *object, void *event, void *data); static void _etk_test_xdnd_drag_motion_cb(Etk_Object *object, void *data); static void _etk_test_xdnd_drag_leave_cb(Etk_Object *object, void *data); @@ -17,8 +14,6 @@ static void _etk_test_xdnd_selection_text_request_cb(Etk_Object *object, void *event, void *data); static void _etk_test_xdnd_button_selection_set_cb(Etk_Object *object, void *data); static void _etk_test_xdnd_button_selection_get_cb(Etk_Object *object, void *data); -static void _etk_test_xdnd_mouse_move_cb(Etk_Object *object, void *event, void *data); -static void _etk_test_xdnd_drag_end_cb(Etk_Object *object, void *data); /* Creates the window for the xdnd test */ void etk_test_xdnd_window_create(void *data) @@ -103,11 +98,9 @@ etk_box_pack_start(ETK_BOX(vbox2), sep, ETK_FALSE, ETK_FALSE, 0); button = etk_button_new_with_label(_("Drag Me!")); - etk_signal_connect("mouse_move", ETK_OBJECT(button), ETK_CALLBACK(_etk_test_xdnd_mouse_move_cb), NULL); - drag = etk_drag_new(); - etk_signal_connect("drag_end", ETK_OBJECT(drag), ETK_CALLBACK(_etk_test_xdnd_drag_end_cb), NULL); - label = etk_label_new(_("Dragged Text!")); - etk_container_add(ETK_CONTAINER(drag), etk_button_new_with_label("Foo!")); + etk_widget_dnd_source_set(button, ETK_TRUE); + etk_widget_dnd_drag_widget_set(button, etk_button_new_with_label("This is a test!")); + etk_widget_dnd_drag_data_set(button, dnd_types, dnd_types_num, "This is the drag data!", strlen("This is the drag data!") + 1); etk_box_pack_start(ETK_BOX(vbox2), button, ETK_FALSE, ETK_FALSE, 0); @@ -289,33 +282,3 @@ if(text) etk_selection_text_set(ETK_WIDGET(data), text, strlen(text) + 1); } - -static void _etk_test_xdnd_mouse_move_cb(Etk_Object *object, void *event, void *data) -{ - Etk_Event_Mouse_Move *ev; - - ev = event; - - if(ev->buttons & 0x001 && start) - { - const char **types; - unsigned int num_types; - char *data; - - start = 0; - types = calloc(1, sizeof(char*)); - num_types = 1; - types[0] = strdup("text/plain"); - data = strdup("This is the drag data!"); - - etk_drag_types_set(ETK_DRAG(drag), types, num_types); - etk_drag_data_set(ETK_DRAG(drag), data, strlen(data) + 1); - etk_drag_begin(ETK_DRAG(drag)); - } -} - -static void _etk_test_xdnd_drag_end_cb(Etk_Object *object, void *data) -{ - start = 1; -} - |
From: <enl...@li...> - 2006-02-15 15:03:32
|
Enlightenment CVS committal Author : codewarrior Project : e17 Module : proto Dir : e17/proto/etk/src/lib Modified Files: Etk.h Makefile.am etk_dnd.c etk_dnd.h etk_widget.c etk_widget.h Added Files: etk_drag.c etk_drag.h Log Message: - move Etk_Drag code to its own files - implement several drag / widget helpers - reflect changes in dnd test =================================================================== RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/Etk.h,v retrieving revision 1.21 retrieving revision 1.22 diff -u -3 -r1.21 -r1.22 --- Etk.h 13 Feb 2006 00:00:01 -0000 1.21 +++ Etk.h 15 Feb 2006 15:03:17 -0000 1.22 @@ -65,5 +65,6 @@ #include "etk_dnd.h" #include "etk_clipboard.h" #include "etk_selection.h" +#include "etk_drag.h" #endif =================================================================== RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/Makefile.am,v retrieving revision 1.25 retrieving revision 1.26 diff -u -3 -r1.25 -r1.26 --- Makefile.am 13 Feb 2006 00:00:01 -0000 1.25 +++ Makefile.am 15 Feb 2006 15:03:17 -0000 1.26 @@ -45,7 +45,8 @@ etk_spin_button.h \ etk_dnd.h \ etk_clipboard.h \ -etk_selection.h +etk_selection.h \ +etk_drag.h libetk_la_SOURCES = \ etk_main.c etk_utils.c \ @@ -78,6 +79,7 @@ etk_dnd.c \ etk_clipboard.c \ etk_selection.c \ +etk_drag.c \ $(ETKHEADERS) installed_headersdir = $(prefix)/include/etk =================================================================== RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/etk_dnd.c,v retrieving revision 1.8 retrieving revision 1.9 diff -u -3 -r1.8 -r1.9 --- etk_dnd.c 15 Feb 2006 03:13:54 -0000 1.8 +++ etk_dnd.c 15 Feb 2006 15:03:17 -0000 1.9 @@ -36,8 +36,8 @@ #define ETK_DND_INSIDE(x, y, xx, yy, ww, hh) (((x) < ((xx) + (ww))) && ((y) < ((yy) + (hh))) && ((x) >= (xx)) && ((y) >= (yy))) extern Etk_Widget *_etk_selection_widget; +extern Etk_Widget *_etk_drag_widget; -static Etk_Drag *_etk_drag_widget = NULL; static char **_etk_dnd_types = NULL; static int _etk_dnd_types_num = 0; static Etk_Widget *_etk_dnd_widget = NULL; @@ -78,7 +78,6 @@ _etk_dnd_handlers = evas_list_append(_etk_dnd_handlers, ecore_event_handler_add(ECORE_X_EVENT_SELECTION_NOTIFY, _etk_xdnd_selection_handler, NULL)); _etk_dnd_handlers = evas_list_append(_etk_dnd_handlers, ecore_event_handler_add(ECORE_X_EVENT_XDND_STATUS, _etk_xdnd_status_handler, NULL)); _etk_dnd_handlers = evas_list_append(_etk_dnd_handlers, ecore_event_handler_add(ECORE_X_EVENT_XDND_FINISHED, _etk_xdnd_finished_handler, NULL)); - #endif return ETK_TRUE; @@ -98,123 +97,6 @@ #endif } -/************************ - * TEMPORARY CODE BEGIN * - ************************/ - -static Ecore_Event_Handler *_etk_drag_mouse_move_handler; -static Ecore_Event_Handler *_etk_drag_mouse_up_handler; - -static void _etk_drag_constructor(Etk_Drag *drag); - -static int _etk_drag_mouse_up_cb(void *data, int type, void *event); -static int _etk_drag_mouse_move_cb(void *data, int type, void *event); - -/** - * @brief Gets the type of an Etk_Drag - * @return Returns the type on an Etk_Drag - */ -Etk_Type *etk_drag_type_get() -{ - static Etk_Type *drag_type = NULL; - - if(!drag_type) - { - drag_type = etk_type_new("Etk_Drag", ETK_WINDOW_TYPE, sizeof(Etk_Drag), ETK_CONSTRUCTOR(_etk_drag_constructor), NULL); - } - - return drag_type; -} - - -/** - * @brief Create a new drag widget - * @return Returns the new drag widget - */ -Etk_Widget *etk_drag_new() -{ - return etk_widget_new(ETK_DRAG_TYPE, NULL); -} - -void etk_drag_types_set(Etk_Drag *drag, const char **types, unsigned int num_types) -{ - int i; - - drag->types = malloc(num_types * sizeof(char *)); - - for (i = 0; i < num_types; i++) - drag->types[i] = strdup(types[i]); - - drag->num_types = num_types; -} - -void etk_drag_data_set(Etk_Drag *drag, void *data, int size) -{ - drag->data = data; - drag->data_size = size; -} - -void etk_drag_begin(Etk_Drag *drag) -{ - _etk_drag_widget = drag; - - etk_widget_show_all(ETK_WIDGET(drag)); - ecore_evas_ignore_events_set((ETK_WINDOW(drag))->ecore_evas, 1); - ecore_x_dnd_types_set((ETK_WINDOW(drag))->x_window, drag->types, drag->num_types); - ecore_x_dnd_begin((ETK_WINDOW(drag))->x_window, drag->data, drag->data_size); - _etk_drag_mouse_move_handler = ecore_event_handler_add(ECORE_X_EVENT_MOUSE_MOVE, _etk_drag_mouse_move_cb, drag); - _etk_drag_mouse_up_handler = ecore_event_handler_add(ECORE_X_EVENT_MOUSE_BUTTON_UP, _etk_drag_mouse_up_cb, drag); -} - -static int _etk_drag_mouse_up_cb(void *data, int type, void *event) -{ - Etk_Drag *drag; - - drag = data; - etk_widget_hide_all(ETK_WIDGET(drag)); - ecore_event_handler_del(_etk_drag_mouse_move_handler); - ecore_event_handler_del(_etk_drag_mouse_up_handler); - ecore_x_dnd_drop(); - etk_widget_drag_end(ETK_WIDGET(drag)); - return 1; -} - -static int _etk_drag_mouse_move_cb(void *data, int type, void *event) -{ - Ecore_X_Event_Mouse_Move *ev; - Etk_Drag *drag; - - drag = data; - ev = event; - - etk_window_move(ETK_WINDOW(drag), ev->root.x, ev->root.y); - return 1; -} - - -/************************** - * - * Etk specific functions - * - **************************/ - -/* Initializes the members */ -static void _etk_drag_constructor(Etk_Drag *drag) -{ - if (!drag) - return; - - etk_window_decorated_set(ETK_WINDOW(drag), ETK_FALSE); - etk_window_shaped_set(ETK_WINDOW(drag), ETK_TRUE); - etk_window_skip_pager_hint_set(ETK_WINDOW(drag), ETK_TRUE); - etk_window_skip_taskbar_hint_set(ETK_WINDOW(drag), ETK_TRUE); - ecore_x_dnd_aware_set((ETK_WINDOW(drag))->x_window, 1); -} - -/********************** - * TEMPORARY CODE END * - **********************/ - /************************** * * Private functions @@ -629,3 +511,4 @@ #endif +/** @} */ =================================================================== RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/etk_dnd.h,v retrieving revision 1.7 retrieving revision 1.8 diff -u -3 -r1.7 -r1.8 --- etk_dnd.h 15 Feb 2006 03:13:54 -0000 1.7 +++ etk_dnd.h 15 Feb 2006 15:03:17 -0000 1.8 @@ -56,23 +56,6 @@ int num_targets; }; - -#define ETK_DRAG_TYPE (etk_drag_type_get()) -#define ETK_DRAG(obj) (ETK_OBJECT_CAST((obj), ETK_DRAG_TYPE, Etk_Drag)) -#define ETK_IS_DRAG(obj) (ETK_OBJECT_CHECK_TYPE((obj), ETK_DRAG_TYPE)) - -struct _Etk_Drag -{ - /* private: */ - /* Inherit from Etk_Window */ - Etk_Window window; - - char **types; - unsigned int num_types; - void *data; - int data_size; -}; - Etk_Bool etk_dnd_init(); void etk_dnd_shutdown(); =================================================================== RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/etk_widget.c,v retrieving revision 1.34 retrieving revision 1.35 diff -u -3 -r1.34 -r1.35 --- etk_widget.c 15 Feb 2006 03:13:54 -0000 1.34 +++ etk_widget.c 15 Feb 2006 15:03:17 -0000 1.35 @@ -13,6 +13,7 @@ #include "etk_marshallers.h" #include "etk_signal.h" #include "etk_signal_callback.h" +#include "etk_drag.h" /** * @addtogroup Etk_Widget @@ -138,12 +139,16 @@ static void _etk_widget_event_object_hide_cb(Evas_Object *obj); static void _etk_widget_event_object_clip_set_cb(Evas_Object *object, Evas_Object *clip); static void _etk_widget_event_object_clip_unset_cb(Evas_Object *object); +static void _etk_widget_dnd_drag_mouse_move_cb(Etk_Object *object, void *event, void *data); +static void _etk_widget_dnd_drag_end_cb(Etk_Object *object, void *data); static Etk_Signal *_etk_widget_signals[ETK_WIDGET_NUM_SIGNALS]; -static Etk_Bool _etk_widget_propagate_event = ETK_TRUE; -static Etk_Bool _etk_widget_intercept_show_hide = ETK_TRUE; +static Etk_Bool _etk_widget_propagate_event = ETK_TRUE; +static Etk_Bool _etk_widget_intercept_show_hide = ETK_TRUE; static Evas_Smart *_etk_widget_event_object_smart = NULL; -static Evas_List *_etk_widget_dnd_dest_widgets; +static Evas_List *_etk_widget_dnd_dest_widgets = NULL; +static Evas_List *_etk_widget_dnd_source_widgets = NULL; +static Etk_Bool _etk_dnd_drag_start = ETK_TRUE; /************************** * @@ -1285,11 +1290,13 @@ if (on) { widget->accepts_dnd = ETK_TRUE; + widget->dnd_dest = ETK_TRUE; _etk_widget_dnd_dest_widgets = evas_list_append(_etk_widget_dnd_dest_widgets, widget); } else { widget->accepts_dnd = ETK_FALSE; + widget->dnd_dest = ETK_FALSE; _etk_widget_dnd_dest_widgets = evas_list_remove(_etk_widget_dnd_dest_widgets, widget); } } @@ -1303,7 +1310,71 @@ { if (!widget) return ETK_FALSE; - return widget->accepts_dnd; + return (widget->accepts_dnd && widget->dnd_dest); +} + +/** + * @brief Sets whether the widget is dnd source + * @param widget a widget + * @param on ETK_TRUE to enable this widget as a dnd source, ETK_FALSE to disable it + */ +void etk_widget_dnd_source_set(Etk_Widget *widget, Etk_Bool on) +{ + if (!widget) + return; + + if (on) + { + widget->accepts_dnd = ETK_TRUE; + widget->dnd_source = ETK_TRUE; + _etk_widget_dnd_source_widgets = evas_list_append(_etk_widget_dnd_source_widgets, widget); + widget->drag = etk_drag_new(); + etk_signal_connect("mouse_move", ETK_OBJECT(widget), ETK_CALLBACK(_etk_widget_dnd_drag_mouse_move_cb), NULL); + etk_signal_connect("drag_end", ETK_OBJECT(widget->drag), ETK_CALLBACK(_etk_widget_dnd_drag_end_cb), NULL); + } + else + { + widget->accepts_dnd = ETK_FALSE; + widget->dnd_source = ETK_TRUE; + _etk_widget_dnd_source_widgets = evas_list_remove(_etk_widget_dnd_source_widgets, widget); + } +} + +/** + * @brief Checks whether the widget is a dnd source + * @param widget a widget + * @return Returns ETK_TRUE if the widget is a dnd source, ETK_FALSE otherwise + */ +Etk_Bool etk_widget_dnd_source_get(Etk_Widget *widget) +{ + if (!widget) + return ETK_FALSE; + return (widget->accepts_dnd && widget->dnd_source); +} + +/** + * @brief Sets the visual data for the drag (the widget to be displayed) + * @param widget a widget + * @param drag_widget the widget that will appear in the drag window + */ +void etk_widget_dnd_drag_widget_set(Etk_Widget *widget, Etk_Widget *drag_widget) +{ + if(!widget || !drag_widget) + return; + + etk_container_add(ETK_CONTAINER(widget->drag), drag_widget); +} + +void etk_widget_dnd_drag_data_set(Etk_Widget *widget, const char **types, int num_types, void *data, int data_size) +{ + if(!widget) + return; + + if(!widget->drag || !widget->dnd_source) + return; + + etk_drag_types_set(widget->drag, types, num_types); + etk_drag_data_set(widget->drag, data, data_size); } /** @@ -1549,9 +1620,12 @@ etk_widget_parent_set(widget, NULL); } - if (widget->accepts_dnd) + if (widget->accepts_dnd && widget->dnd_dest) _etk_widget_dnd_dest_widgets = evas_list_remove(_etk_widget_dnd_dest_widgets, widget); + if (widget->accepts_dnd && widget->dnd_source) + _etk_widget_dnd_source_widgets = evas_list_remove(_etk_widget_dnd_source_widgets, widget); + free(widget->theme_file); free(widget->theme_group); } @@ -2620,4 +2694,36 @@ widget->clip = NULL; } +static void _etk_widget_dnd_drag_mouse_move_cb(Etk_Object *object, void *event, void *data) +{ + Etk_Event_Mouse_Move *ev; + + ev = event; + + if(ev->buttons & 0x001 && _etk_dnd_drag_start) + { + const char **types; + unsigned int num_types; + char *data; + Etk_Drag *drag; + + drag = (ETK_WIDGET(object))->drag; + + _etk_dnd_drag_start = ETK_FALSE; + types = calloc(1, sizeof(char*)); + num_types = 1; + types[0] = strdup("text/plain"); + data = strdup("This is the drag data!"); + +// etk_drag_types_set(drag, types, num_types); +// etk_drag_data_set(drag, data, strlen(data) + 1); + etk_drag_begin(drag); + } +} + +static void _etk_widget_dnd_drag_end_cb(Etk_Object *object, void *data) +{ + _etk_dnd_drag_start = ETK_TRUE; +} + /** @} */ =================================================================== RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/etk_widget.h,v retrieving revision 1.22 retrieving revision 1.23 diff -u -3 -r1.22 -r1.23 --- etk_widget.h 15 Feb 2006 03:13:54 -0000 1.22 +++ etk_widget.h 15 Feb 2006 15:03:17 -0000 1.23 @@ -192,9 +192,12 @@ unsigned char need_redraw : 1; unsigned char need_theme_min_size_recalc : 1; unsigned char accepts_dnd : 1; - - char **dnd_types; - int dnd_types_num; + unsigned char dnd_source : 1; + unsigned char dnd_dest : 1; + + Etk_Drag *drag; + char **dnd_types; + int dnd_types_num; }; Etk_Type *etk_widget_type_get(); @@ -268,6 +271,10 @@ void etk_widget_dnd_dest_set(Etk_Widget *widget, Etk_Bool on); Etk_Bool etk_widget_dnd_dest_get(Etk_Widget *widget); Evas_List *etk_widget_dnd_dest_widgets_get(); +void etk_widget_dnd_source_set(Etk_Widget *widget, Etk_Bool on); +Etk_Bool etk_widget_dnd_source_get(Etk_Widget *widget); +void etk_widget_dnd_drag_widget_set(Etk_Widget *widget, Etk_Widget *drag_widget); +void etk_widget_dnd_drag_data_set(Etk_Widget *widget, const char **types, int num_types, void *data, int data_size); const char **etk_widget_dnd_files_get(Etk_Widget *e, int *num_files); void etk_widget_dnd_types_set(Etk_Widget *widget, char **types, int num); const char **etk_widget_dnd_types_get(Etk_Widget *widget, int *num); |
From: <enl...@li...> - 2006-02-16 01:40:24
|
Enlightenment CVS committal Author : codewarrior Project : e17 Module : proto Dir : e17/proto/etk/src/lib Modified Files: etk_dnd.c etk_drag.c etk_drag.h etk_toplevel_widget.h etk_widget.c etk_window.c Log Message: - add parent widget property to Etk_Drag - add cursor support for dragging =================================================================== RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/etk_dnd.c,v retrieving revision 1.9 retrieving revision 1.10 diff -u -3 -r1.9 -r1.10 --- etk_dnd.c 15 Feb 2006 15:03:17 -0000 1.9 +++ etk_dnd.c 16 Feb 2006 01:40:16 -0000 1.10 @@ -9,6 +9,7 @@ #include "etk_widget.h" #include "etk_toplevel_widget.h" #include "etk_window.h" +#include "etk_drag.h" #include "config.h" /* Some notes for when we're developing this: @@ -494,13 +495,11 @@ if(!ev->will_accept) { - // etk_toplevel_widget_pointer_pop(etk_widget_toplevel_parent_get(ETK_WIDGET(_etk_drag_widget)), ETK_POINTER_RESIZE_BR); + etk_toplevel_widget_pointer_push(etk_widget_toplevel_parent_get(etk_drag_parent_widget_get(ETK_DRAG(_etk_drag_widget))), ETK_POINTER_DEFAULT); return 1; } -// etk_toplevel_widget_pointer_push(etk_widget_toplevel_parent_get(ETK_WIDGET(_etk_drag_widget)), ETK_POINTER_RESIZE_BR); - etk_toplevel_widget_pointer_push(ETK_TOPLEVEL_WIDGET(ETK_WINDOW(_etk_drag_widget)), ETK_POINTER_RESIZE_BR); - + etk_toplevel_widget_pointer_push(etk_widget_toplevel_parent_get(etk_drag_parent_widget_get(ETK_DRAG(_etk_drag_widget))), ETK_POINTER_DND_DROP); return 1; } =================================================================== RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/etk_drag.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -3 -r1.1 -r1.2 --- etk_drag.c 15 Feb 2006 15:03:17 -0000 1.1 +++ etk_drag.c 16 Feb 2006 01:40:16 -0000 1.2 @@ -9,12 +9,24 @@ #include "etk_window.h" #include "config.h" +/** + * @addtogroup Etk_Ddrag + * @{ + */ + +enum _Etk_Drag_Propery_Id +{ + ETK_DRAG_PARENT_WIDGET_PROPERTY +}; + Etk_Drag *_etk_drag_widget = NULL; static Ecore_Event_Handler *_etk_drag_mouse_move_handler; static Ecore_Event_Handler *_etk_drag_mouse_up_handler; static void _etk_drag_constructor(Etk_Drag *drag); +static void _etk_drag_property_set(Etk_Object *object, int property_id, Etk_Property_Value *value); +static void _etk_drag_property_get(Etk_Object *object, int property_id, Etk_Property_Value *value); static int _etk_drag_mouse_up_cb(void *data, int type, void *event); static int _etk_drag_mouse_move_cb(void *data, int type, void *event); @@ -28,7 +40,13 @@ if(!drag_type) { - drag_type = etk_type_new("Etk_Drag", ETK_WINDOW_TYPE, sizeof(Etk_Drag), ETK_CONSTRUCTOR(_etk_drag_constructor), NULL); + drag_type = etk_type_new("Etk_Drag", ETK_WINDOW_TYPE, sizeof(Etk_Drag), ETK_CONSTRUCTOR(_etk_drag_constructor), NULL); + + etk_type_property_add(drag_type, "parent_widget", ETK_DRAG_PARENT_WIDGET_PROPERTY, ETK_PROPERTY_POINTER, ETK_PROPERTY_READABLE_WRITABLE, etk_property_value_pointer(NULL)); + + drag_type->property_set = _etk_drag_property_set; + drag_type->property_get = _etk_drag_property_get; + } return drag_type; @@ -36,11 +54,12 @@ /** * @brief Create a new drag widget + * @param widget the parent widget of this drag * @return Returns the new drag widget */ -Etk_Widget *etk_drag_new() +Etk_Widget *etk_drag_new(Etk_Widget *widget) { - return etk_widget_new(ETK_DRAG_TYPE, NULL); + return etk_widget_new(ETK_DRAG_TYPE, "parent_widget", widget, NULL); } void etk_drag_types_set(Etk_Drag *drag, const char **types, unsigned int num_types) @@ -73,6 +92,32 @@ _etk_drag_mouse_up_handler = ecore_event_handler_add(ECORE_X_EVENT_MOUSE_BUTTON_UP, _etk_drag_mouse_up_cb, drag); } +/** + * @brief Sets the parent widget of a drag + * @param drag a drag + * @param widget a widget + */ +void etk_drag_parent_widget_set(Etk_Drag *drag, Etk_Widget *widget) +{ + if(!drag || !widget) + return; + + drag->widget = widget; +} + +/** + * @brief Gets the parent widget of a drag + * @param drag a drag + * @return Returns the parent widget of the drag + */ +Etk_Widget *etk_drag_parent_widget_get(Etk_Drag *drag) +{ + if(!drag) + return NULL; + + return drag->widget; +} + /************************** * * Etk specific functions @@ -85,11 +130,53 @@ if (!drag) return; + drag->widget = NULL; + drag->types = NULL; + drag->num_types = 0; + drag->data = NULL; + drag->data_size = 0; + etk_window_decorated_set(ETK_WINDOW(drag), ETK_FALSE); etk_window_shaped_set(ETK_WINDOW(drag), ETK_TRUE); etk_window_skip_pager_hint_set(ETK_WINDOW(drag), ETK_TRUE); etk_window_skip_taskbar_hint_set(ETK_WINDOW(drag), ETK_TRUE); - ecore_x_dnd_aware_set((ETK_WINDOW(drag))->x_window, 1); + ecore_x_dnd_aware_set((ETK_WINDOW(drag))->x_window, 1); +} + +/* Sets the property whose id is "property_id" to the value "value" */ +static void _etk_drag_property_set(Etk_Object *object, int property_id, Etk_Property_Value *value) +{ + Etk_Dialog *drag; + + if (!(drag = ETK_DRAG(object)) || !value) + return; + + switch (property_id) + { + case ETK_DRAG_PARENT_WIDGET_PROPERTY: + etk_drag_parent_widget_set(drag, etk_property_value_pointer_get(value)); + break; + default: + break; + } +} + +/* Gets the value of the property whose id is "property_id" */ +static void _etk_drag_property_get(Etk_Object *object, int property_id, Etk_Property_Value *value) +{ + Etk_Drag *drag; + + if (!(drag = ETK_DRAG(object)) || !value) + return; + + switch (property_id) + { + case ETK_DRAG_PARENT_WIDGET_PROPERTY: + etk_property_value_pointer_set(value, etk_drag_parent_widget_get(drag)); + break; + default: + break; + } } static int _etk_drag_mouse_up_cb(void *data, int type, void *event) @@ -102,6 +189,7 @@ ecore_event_handler_del(_etk_drag_mouse_up_handler); ecore_x_dnd_drop(); etk_widget_drag_end(ETK_WIDGET(drag)); + etk_toplevel_widget_pointer_push(etk_widget_toplevel_parent_get(drag->widget), ETK_POINTER_DEFAULT); return 1; } =================================================================== RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/etk_drag.h,v retrieving revision 1.1 retrieving revision 1.2 diff -u -3 -r1.1 -r1.2 --- etk_drag.h 15 Feb 2006 15:03:17 -0000 1.1 +++ etk_drag.h 16 Feb 2006 01:40:16 -0000 1.2 @@ -14,9 +14,8 @@ /* private: */ /* Inherit from Etk_Window */ Etk_Window window; - - int dx, dy; - int win_x, win_y; + + Etk_Widget *widget; char **types; unsigned int num_types; @@ -24,11 +23,14 @@ int data_size; }; -Etk_Widget *etk_drag_new(); +Etk_Type *etk_drag_type_get(); +Etk_Widget *etk_drag_new(Etk_Widget *widget); void etk_drag_types_set(Etk_Drag *drag, const char **types, unsigned int num_types); void etk_drag_data_set(Etk_Drag *drag, void *data, int size); void etk_drag_begin(Etk_Drag *drag); - +void etk_drag_parent_widget_set(Etk_Drag *drag, Etk_Widget *widget); +Etk_Widget *etk_drag_parent_widget_get(Etk_Drag *drag); + /** @} */ =================================================================== RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/etk_toplevel_widget.h,v retrieving revision 1.4 retrieving revision 1.5 diff -u -3 -r1.4 -r1.5 --- etk_toplevel_widget.h 20 Nov 2005 10:33:28 -0000 1.4 +++ etk_toplevel_widget.h 16 Feb 2006 01:40:16 -0000 1.5 @@ -25,6 +25,7 @@ enum _Etk_Pointer_Type { ETK_POINTER_DEFAULT, + ETK_POINTER_DND_DROP, ETK_POINTER_MOVE, ETK_POINTER_H_DOUBLE_ARROW, ETK_POINTER_V_DOUBLE_ARROW, =================================================================== RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/etk_widget.c,v retrieving revision 1.36 retrieving revision 1.37 diff -u -3 -r1.36 -r1.37 --- etk_widget.c 15 Feb 2006 21:01:33 -0000 1.36 +++ etk_widget.c 16 Feb 2006 01:40:16 -0000 1.37 @@ -1328,7 +1328,7 @@ widget->accepts_dnd = ETK_TRUE; widget->dnd_source = ETK_TRUE; _etk_widget_dnd_source_widgets = evas_list_append(_etk_widget_dnd_source_widgets, widget); - widget->drag = etk_drag_new(); + widget->drag = etk_drag_new(widget); etk_signal_connect("mouse_move", ETK_OBJECT(widget), ETK_CALLBACK(_etk_widget_dnd_drag_mouse_move_cb), NULL); etk_signal_connect("drag_end", ETK_OBJECT(widget->drag), ETK_CALLBACK(_etk_widget_dnd_drag_end_cb), NULL); } @@ -1425,7 +1425,7 @@ if(num) *num = widget->dnd_types_num; - return widget->dnd_types; + return (const char **)(widget->dnd_types); } /** @@ -1606,8 +1606,6 @@ /* Destroys the widget */ static void _etk_widget_destructor(Etk_Widget *widget) { - int i; - if (!widget) return; =================================================================== RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/etk_window.c,v retrieving revision 1.12 retrieving revision 1.13 diff -u -3 -r1.12 -r1.13 --- etk_window.c 12 Feb 2006 20:08:20 -0000 1.12 +++ etk_window.c 16 Feb 2006 01:40:16 -0000 1.13 @@ -620,6 +620,9 @@ switch (pointer_type) { + case ETK_POINTER_DND_DROP: + x_pointer_type = ECORE_X_CURSOR_PLUS; + break; case ETK_POINTER_MOVE: x_pointer_type = ECORE_X_CURSOR_FLEUR; break; |
From: <enl...@li...> - 2006-02-16 15:05:56
|
Enlightenment CVS committal Author : codewarrior Project : e17 Module : proto Dir : e17/proto/etk/src/lib Modified Files: etk_toplevel_widget.h Log Message: always add new cursor definitions at the end =================================================================== RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/etk_toplevel_widget.h,v retrieving revision 1.5 retrieving revision 1.6 diff -u -3 -r1.5 -r1.6 --- etk_toplevel_widget.h 16 Feb 2006 01:40:16 -0000 1.5 +++ etk_toplevel_widget.h 16 Feb 2006 15:05:47 -0000 1.6 @@ -25,7 +25,6 @@ enum _Etk_Pointer_Type { ETK_POINTER_DEFAULT, - ETK_POINTER_DND_DROP, ETK_POINTER_MOVE, ETK_POINTER_H_DOUBLE_ARROW, ETK_POINTER_V_DOUBLE_ARROW, @@ -38,7 +37,8 @@ ETK_POINTER_RESIZE_B, ETK_POINTER_RESIZE_BL, ETK_POINTER_RESIZE_L, - ETK_POINTER_TEXT_EDIT + ETK_POINTER_TEXT_EDIT, + ETK_POINTER_DND_DROP }; /** |
From: <enl...@li...> - 2006-02-20 02:41:23
|
Enlightenment CVS committal Author : codewarrior Project : e17 Module : proto Dir : e17/proto/etk/src/lib Modified Files: etk_tree.c etk_tree.h Log Message: add ability for Etk_Tree to receive drops. once a drop is received, just fetch the current selected row in the drop cb. =================================================================== RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/etk_tree.c,v retrieving revision 1.33 retrieving revision 1.34 diff -u -3 -r1.33 -r1.34 --- etk_tree.c 15 Feb 2006 12:48:39 -0000 1.33 +++ etk_tree.c 20 Feb 2006 02:41:13 -0000 1.34 @@ -13,6 +13,8 @@ #include "etk_signal.h" #include "etk_signal_callback.h" #include "etk_utils.h" +#include "etk_window.h" +#include "config.h" /** * @addtogroup Etk_Tree @@ -120,6 +122,8 @@ static void _etk_tree_header_mouse_move_cb(Etk_Object *object, void *event, void *data); static void _etk_tree_header_mouse_in_cb(Etk_Object *object, void *event, void *data); static void _etk_tree_header_mouse_out_cb(Etk_Object *object, void *event, void *data); +static void _etk_tree_drag_drop_cb(Etk_Object *object, void *event, void *data); + static void _etk_tree_update(Etk_Tree *tree); static int _etk_tree_rows_draw(Etk_Tree *tree, Etk_Tree_Row *first_row, Evas_List **items_objects, @@ -1529,6 +1533,8 @@ tree->xoffset = 0; tree->yoffset = 0.0; + tree->dnd_event = ETK_FALSE; + ETK_WIDGET(tree)->size_allocate = _etk_tree_size_allocate; etk_signal_connect("realize", ETK_OBJECT(tree), ETK_CALLBACK(_etk_tree_realize_cb), NULL); @@ -1536,6 +1542,7 @@ etk_signal_connect("focus", ETK_OBJECT(tree), ETK_CALLBACK(_etk_tree_focus_cb), NULL); etk_signal_connect("unfocus", ETK_OBJECT(tree), ETK_CALLBACK(_etk_tree_unfocus_cb), NULL); etk_signal_connect("key_down", ETK_OBJECT(tree), ETK_CALLBACK(_etk_tree_key_down_cb), NULL); + etk_signal_connect("drag_drop", ETK_OBJECT(tree), ETK_CALLBACK(_etk_tree_drag_drop_cb), NULL); } /* Destroys the tree */ @@ -1888,13 +1895,14 @@ event.locks = evas_event->locks; event.flags = evas_event->flags; event.timestamp = evas_event->timestamp; - etk_signal_emit(_etk_tree_signals[ETK_TREE_ROW_CLICKED_SIGNAL], ETK_OBJECT(row_objects->row->tree), NULL, row_objects->row, &event); + if(!row_objects->row->tree->dnd_event) + etk_signal_emit(_etk_tree_signals[ETK_TREE_ROW_CLICKED_SIGNAL], ETK_OBJECT(row_objects->row->tree), NULL, row_objects->row, &event); /* We have to check this again because the user can remove the row on the "clicked" signal */ if (!row_objects->row) return; - if (!(evas_event->flags & EVAS_BUTTON_TRIPLE_CLICK) && (evas_event->button == 1)) + if (!(evas_event->flags & EVAS_BUTTON_TRIPLE_CLICK) && (evas_event->button == 1) && !row_objects->row->tree->dnd_event) etk_signal_emit(_etk_tree_signals[ETK_TREE_ROW_ACTIVATED_SIGNAL], ETK_OBJECT(row_objects->row->tree), NULL, row_objects->row); } @@ -1932,8 +1940,11 @@ event.locks = evas_event->locks; event.flags = EVAS_BUTTON_NONE; event.timestamp = evas_event->timestamp; - - etk_signal_emit(_etk_tree_signals[ETK_TREE_ROW_CLICKED_SIGNAL], ETK_OBJECT(row_objects->row->tree), NULL, row_objects->row, &event); + + if(row_objects->row->tree->dnd_event) + row_objects->row->tree->dnd_event = ETK_FALSE; + else + etk_signal_emit(_etk_tree_signals[ETK_TREE_ROW_CLICKED_SIGNAL], ETK_OBJECT(row_objects->row->tree), NULL, row_objects->row, &event); _etk_tree_last_clicked_row = row_objects->row; } } @@ -2029,6 +2040,8 @@ Etk_Tree_Col *col; Etk_Event_Mouse_Up_Down *down_event; + printf("mouse down!\n"); + if (!(col = data) || !(down_event = event)) return; @@ -2664,13 +2677,16 @@ { if (!tree || !row) return; - + if (!tree->multiple_select || !modifiers) { etk_tree_unselect_all(tree); row->selected = ETK_TRUE; tree->last_selected = row; - etk_signal_emit(_etk_tree_signals[ETK_TREE_ROW_SELECTED_SIGNAL], ETK_OBJECT(tree), NULL, row); + if(tree->dnd_event) + etk_widget_theme_object_signal_emit(ETK_WIDGET(tree), "selected"); + else + etk_signal_emit(_etk_tree_signals[ETK_TREE_ROW_SELECTED_SIGNAL], ETK_OBJECT(tree), NULL, row); } else { @@ -2703,7 +2719,11 @@ } } tree->last_selected = row; - etk_signal_emit(_etk_tree_signals[ETK_TREE_ROW_SELECTED_SIGNAL], ETK_OBJECT(tree), NULL, row); + + if(tree->dnd_event) + etk_widget_theme_object_signal_emit(ETK_WIDGET(tree), "selected"); + else + etk_signal_emit(_etk_tree_signals[ETK_TREE_ROW_SELECTED_SIGNAL], ETK_OBJECT(tree), NULL, row); } else if (evas_key_modifier_is_set(modifiers, "Control")) { @@ -2711,13 +2731,19 @@ { row->selected = ETK_FALSE; tree->last_selected = row; - etk_signal_emit(_etk_tree_signals[ETK_TREE_ROW_UNSELECTED_SIGNAL], ETK_OBJECT(tree), NULL, row); + if(tree->dnd_event) + etk_widget_theme_object_signal_emit(ETK_WIDGET(tree), "selected"); + else + etk_signal_emit(_etk_tree_signals[ETK_TREE_ROW_SELECTED_SIGNAL], ETK_OBJECT(tree), NULL, row); } else { row->selected = ETK_TRUE; tree->last_selected = row; - etk_signal_emit(_etk_tree_signals[ETK_TREE_ROW_SELECTED_SIGNAL], ETK_OBJECT(tree), NULL, row); + if(tree->dnd_event) + etk_widget_theme_object_signal_emit(ETK_WIDGET(tree), "selected"); + else + etk_signal_emit(_etk_tree_signals[ETK_TREE_ROW_SELECTED_SIGNAL], ETK_OBJECT(tree), NULL, row); } } else @@ -2725,7 +2751,10 @@ etk_tree_unselect_all(tree); row->selected = ETK_TRUE; tree->last_selected = row; - etk_signal_emit(_etk_tree_signals[ETK_TREE_ROW_SELECTED_SIGNAL], ETK_OBJECT(tree), NULL, row); + if(tree->dnd_event) + etk_widget_theme_object_signal_emit(ETK_WIDGET(tree), "selected"); + else + etk_signal_emit(_etk_tree_signals[ETK_TREE_ROW_SELECTED_SIGNAL], ETK_OBJECT(tree), NULL, row); } } @@ -2758,3 +2787,31 @@ _etk_tree_heapify(tree, heap, max, size, compare_cb, asc, col, data); } } + +static void _etk_tree_drag_drop_cb(Etk_Object *object, void *event, void *data) +{ +#if HAVE_ECORE_X + Etk_Event_Selection_Request *ev; + Etk_Widget *win; + + win = etk_widget_toplevel_parent_get(ETK_WIDGET(object)); + if(ETK_IS_WINDOW(win)) + { + Etk_Tree *tree; + + tree = ETK_TREE(object); + tree->dnd_event = ETK_TRUE; + + evas_event_feed_mouse_down(etk_toplevel_widget_evas_get(win), 1, + EVAS_BUTTON_NONE, + ecore_x_current_time_get(), + NULL); + + evas_event_feed_mouse_up(etk_toplevel_widget_evas_get(win), 1, + EVAS_BUTTON_NONE, + ecore_x_current_time_get(), + NULL); + } +#endif +} + =================================================================== RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/etk_tree.h,v retrieving revision 1.16 retrieving revision 1.17 diff -u -3 -r1.16 -r1.17 --- etk_tree.h 14 Feb 2006 18:39:05 -0000 1.16 +++ etk_tree.h 20 Feb 2006 02:41:13 -0000 1.17 @@ -102,6 +102,8 @@ int cell_margins[4]; int expander_size; Etk_Color separator_color; + + Etk_Bool dnd_event; }; /** |
From: <enl...@li...> - 2006-02-20 02:41:50
|
Enlightenment CVS committal Author : codewarrior Project : e17 Module : proto Dir : e17/proto/etk/src/bin Modified Files: etk_tree_test.c Log Message: add ability for Etk_Tree to receive drops. once a drop is received, just fetch the current selected row in the drop cb. =================================================================== RCS file: /cvsroot/enlightenment/e17/proto/etk/src/bin/etk_tree_test.c,v retrieving revision 1.23 retrieving revision 1.24 diff -u -3 -r1.23 -r1.24 --- etk_tree_test.c 14 Feb 2006 18:39:04 -0000 1.23 +++ etk_tree_test.c 20 Feb 2006 02:41:12 -0000 1.24 @@ -3,6 +3,7 @@ #include <stdlib.h> #include "config.h" +static void _etk_test_tree_drag_drop_cb(Etk_Object *object, void *event, void *data); static void _etk_test_tree_add_items(Etk_Tree *tree, int n); static void _etk_test_tree_row_selected(Etk_Object *object, Etk_Tree_Row *row, void *data); static void _etk_test_tree_row_unselected(Etk_Object *object, Etk_Tree_Row *row, void *data); @@ -81,6 +82,8 @@ etk_table_attach(ETK_TABLE(table), label, 1, 1, 0, 0, 0, 0, ETK_FILL_POLICY_HFILL | ETK_FILL_POLICY_VFILL); tree = etk_tree_new(); + etk_widget_dnd_dest_set(tree, ETK_TRUE); + etk_signal_connect("drag_drop", ETK_OBJECT(tree), ETK_CALLBACK(_etk_test_tree_drag_drop_cb), NULL); etk_widget_size_request_set(tree, 320, 400); etk_table_attach_defaults(ETK_TABLE(table), tree, 1, 1, 1, 1); @@ -130,6 +133,20 @@ etk_widget_show_all(win); } +static void _etk_test_tree_drag_drop_cb(Etk_Object *object, void *event, void *data) +{ + Etk_Event_Selection_Request *ev; + Etk_Tree *tree; + Etk_Tree_Row *row; + char *col1_string, *col3_path; + int col2_value; + + tree = ETK_TREE(object); + row = etk_tree_selected_row_get(tree); + etk_tree_row_fields_get(row, etk_tree_nth_col_get(tree, 0), NULL, &col1_string, etk_tree_nth_col_get(tree, 1), &col2_value, etk_tree_nth_col_get(tree, 2), &col3_path, NULL); + printf(_("Row dropped on %p: \"%s\" %d %s\n"), row, col1_string, col2_value, col3_path); +} + /* Adds n items to the tree */ static void _etk_test_tree_add_items(Etk_Tree *tree, int n) { |
From: <enl...@li...> - 2006-02-20 10:31:33
|
Enlightenment CVS committal Author : codewarrior Project : e17 Module : proto Dir : e17/proto/etk/src/lib Modified Files: etk_drag.c etk_tree.c etk_widget.c etk_widget.h Log Message: - add ability for trees to have drags started from them. now we can drop to and drag from an Etk_Tree. =================================================================== RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/etk_drag.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -3 -r1.2 -r1.3 --- etk_drag.c 16 Feb 2006 01:40:16 -0000 1.2 +++ etk_drag.c 20 Feb 2006 10:31:28 -0000 1.3 @@ -84,6 +84,7 @@ { _etk_drag_widget = drag; + etk_widget_drag_begin(drag->widget); etk_widget_show_all(ETK_WIDGET(drag)); ecore_evas_ignore_events_set((ETK_WINDOW(drag))->ecore_evas, 1); ecore_x_dnd_types_set((ETK_WINDOW(drag))->x_window, drag->types, drag->num_types); =================================================================== RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/etk_tree.c,v retrieving revision 1.35 retrieving revision 1.36 diff -u -3 -r1.35 -r1.36 --- etk_tree.c 20 Feb 2006 02:44:51 -0000 1.35 +++ etk_tree.c 20 Feb 2006 10:31:29 -0000 1.36 @@ -114,6 +114,7 @@ static void _etk_tree_expander_clicked_cb(void *data, Evas *e, Evas_Object *obj, void *event_info); static void _etk_tree_row_pressed_cb(void *data, Evas *e, Evas_Object *obj, void *event_info); static void _etk_tree_row_clicked_cb(void *data, Evas *e, Evas_Object *obj, void *event_info); +static void _etk_tree_row_mouse_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info); static void _etk_tree_focus_cb(Etk_Object *object, void *event, void *data); static void _etk_tree_unfocus_cb(Etk_Object *object, void *event, void *data); static void _etk_tree_key_down_cb(Etk_Object *object, void *event, void *data); @@ -123,7 +124,7 @@ static void _etk_tree_header_mouse_in_cb(Etk_Object *object, void *event, void *data); static void _etk_tree_header_mouse_out_cb(Etk_Object *object, void *event, void *data); static void _etk_tree_drag_drop_cb(Etk_Object *object, void *event, void *data); - +static void _etk_tree_drag_end_cb(Etk_Object *object, void *data); static void _etk_tree_update(Etk_Tree *tree); static int _etk_tree_rows_draw(Etk_Tree *tree, Etk_Tree_Row *first_row, Evas_List **items_objects, @@ -145,6 +146,7 @@ static Etk_Tree_Row *_etk_tree_last_clicked_row = NULL; static Etk_Signal *_etk_tree_signals[ETK_TREE_NUM_SIGNALS]; static Etk_Signal *_etk_tree_col_signals[ETK_TREE_COL_NUM_SIGNALS]; +static Etk_Bool _etk_tree_drag_start = ETK_TRUE; /************************** * @@ -179,7 +181,7 @@ etk_type_property_add(tree_type, "row_height", ETK_TREE_ROW_HEIGHT_PROPERTY, ETK_PROPERTY_INT, ETK_PROPERTY_READABLE_WRITABLE, etk_property_value_int(24)); tree_type->property_set = _etk_tree_property_set; - tree_type->property_get = _etk_tree_property_get; + tree_type->property_get = _etk_tree_property_get; } return tree_type; @@ -1536,13 +1538,17 @@ tree->dnd_event = ETK_FALSE; ETK_WIDGET(tree)->size_allocate = _etk_tree_size_allocate; + etk_widget_dnd_internal_set(ETK_WIDGET(tree), ETK_TRUE); + (ETK_WIDGET(tree))->drag = etk_drag_new(ETK_WIDGET(tree)); etk_signal_connect("realize", ETK_OBJECT(tree), ETK_CALLBACK(_etk_tree_realize_cb), NULL); etk_signal_connect("unrealize", ETK_OBJECT(tree), ETK_CALLBACK(_etk_tree_unrealize_cb), NULL); etk_signal_connect("focus", ETK_OBJECT(tree), ETK_CALLBACK(_etk_tree_focus_cb), NULL); etk_signal_connect("unfocus", ETK_OBJECT(tree), ETK_CALLBACK(_etk_tree_unfocus_cb), NULL); etk_signal_connect("key_down", ETK_OBJECT(tree), ETK_CALLBACK(_etk_tree_key_down_cb), NULL); - etk_signal_connect("drag_drop", ETK_OBJECT(tree), ETK_CALLBACK(_etk_tree_drag_drop_cb), NULL); + etk_signal_connect("drag_drop", ETK_OBJECT(tree), ETK_CALLBACK(_etk_tree_drag_drop_cb), NULL); + etk_signal_connect("drag_end", ETK_OBJECT((ETK_WIDGET(tree))->drag), ETK_CALLBACK(_etk_tree_drag_end_cb), NULL); + } /* Destroys the tree */ @@ -1949,6 +1955,26 @@ } } +/* Called when the mouse moves over a row */ +static void _etk_tree_row_mouse_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + Etk_Event_Mouse_Move *ev; + Etk_Tree_Row_Objects *row_objects; + + ev = event_info; + if (!(row_objects = data) || !row_objects->row) + return; + + if(ev->buttons & 0x001 && _etk_tree_drag_start) + { + Etk_Drag *drag; + + _etk_tree_drag_start = ETK_FALSE; + drag = (ETK_WIDGET(row_objects->row->tree))->drag; + etk_drag_begin(drag); + } +} + /* Called when the tree is focused */ static void _etk_tree_focus_cb(Etk_Object *object, void *event, void *data) { @@ -2515,6 +2541,7 @@ evas_object_clip_set(new_row_objects->background, ETK_TREE_GRID(tree->grid)->clip); evas_object_event_callback_add(new_row_objects->background, EVAS_CALLBACK_MOUSE_DOWN, _etk_tree_row_pressed_cb, new_row_objects); evas_object_event_callback_add(new_row_objects->background, EVAS_CALLBACK_MOUSE_UP, _etk_tree_row_clicked_cb, new_row_objects); + evas_object_event_callback_add(new_row_objects->background, EVAS_CALLBACK_MOUSE_MOVE, _etk_tree_row_mouse_move_cb, new_row_objects); etk_widget_member_object_add(tree->grid, new_row_objects->background); /* Creates the expander of the row */ @@ -2813,3 +2840,7 @@ #endif } +static void _etk_tree_drag_end_cb(Etk_Object *object, void *data) +{ + _etk_tree_drag_start = ETK_TRUE; +} =================================================================== RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/etk_widget.c,v retrieving revision 1.37 retrieving revision 1.38 diff -u -3 -r1.37 -r1.38 --- etk_widget.c 16 Feb 2006 01:40:16 -0000 1.37 +++ etk_widget.c 20 Feb 2006 10:31:30 -0000 1.38 @@ -59,7 +59,8 @@ ETK_WIDGET_DRAG_DROP_SIGNAL, ETK_WIDGET_DRAG_ENTER_SIGNAL, ETK_WIDGET_DRAG_MOTION_SIGNAL, - ETK_WIDGET_DRAG_LEAVE_SIGNAL, + ETK_WIDGET_DRAG_LEAVE_SIGNAL, + ETK_WIDGET_DRAG_BEGIN_SIGNAL, ETK_WIDGET_DRAG_END_SIGNAL, ETK_WIDGET_SELECTION_RECEIVED_SIGNAL, ETK_WIDGET_CLIPBOARD_RECEIVED_SIGNAL, @@ -98,6 +99,7 @@ static void _etk_widget_drag_motion_handler(Etk_Widget *widget); static void _etk_widget_drag_enter_handler(Etk_Widget *widget); static void _etk_widget_drag_leave_handler(Etk_Widget *widget); +static void _etk_widget_drag_begin_handler(Etk_Widget *widget); static void _etk_widget_drag_end_handler(Etk_Widget *widget); static void _etk_widget_mouse_in_cb(void *data, Evas *evas, Evas_Object *object, void *event_info); @@ -191,6 +193,7 @@ _etk_widget_signals[ETK_WIDGET_DRAG_MOTION_SIGNAL] = etk_signal_new("drag_motion", widget_type, ETK_MEMBER_OFFSET(Etk_Widget, drag_motion), etk_marshaller_VOID__VOID, NULL, NULL); _etk_widget_signals[ETK_WIDGET_DRAG_ENTER_SIGNAL] = etk_signal_new("drag_enter", widget_type, ETK_MEMBER_OFFSET(Etk_Widget, drag_enter), etk_marshaller_VOID__VOID, NULL, NULL); _etk_widget_signals[ETK_WIDGET_DRAG_LEAVE_SIGNAL] = etk_signal_new("drag_leave", widget_type, ETK_MEMBER_OFFSET(Etk_Widget, drag_leave), etk_marshaller_VOID__VOID, NULL, NULL); + _etk_widget_signals[ETK_WIDGET_DRAG_BEGIN_SIGNAL] = etk_signal_new("drag_begin", widget_type, ETK_MEMBER_OFFSET(Etk_Widget, drag_begin), etk_marshaller_VOID__VOID, NULL, NULL); _etk_widget_signals[ETK_WIDGET_DRAG_END_SIGNAL] = etk_signal_new("drag_end", widget_type, ETK_MEMBER_OFFSET(Etk_Widget, drag_end), etk_marshaller_VOID__VOID, NULL, NULL); _etk_widget_signals[ETK_WIDGET_SELECTION_RECEIVED_SIGNAL] = etk_signal_new("selection_received", widget_type, -1, etk_marshaller_VOID__POINTER, NULL, NULL); _etk_widget_signals[ETK_WIDGET_CLIPBOARD_RECEIVED_SIGNAL] = etk_signal_new("clipboard_received", widget_type, -1, etk_marshaller_VOID__POINTER, NULL, NULL); @@ -1325,18 +1328,29 @@ if (on) { + widget->accepts_dnd = ETK_TRUE; widget->dnd_source = ETK_TRUE; _etk_widget_dnd_source_widgets = evas_list_append(_etk_widget_dnd_source_widgets, widget); - widget->drag = etk_drag_new(widget); - etk_signal_connect("mouse_move", ETK_OBJECT(widget), ETK_CALLBACK(_etk_widget_dnd_drag_mouse_move_cb), NULL); - etk_signal_connect("drag_end", ETK_OBJECT(widget->drag), ETK_CALLBACK(_etk_widget_dnd_drag_end_cb), NULL); + + if(!widget->dnd_internal) + { + widget->drag = etk_drag_new(widget); + etk_signal_connect("mouse_move", ETK_OBJECT(widget), ETK_CALLBACK(_etk_widget_dnd_drag_mouse_move_cb), NULL); + etk_signal_connect("drag_end", ETK_OBJECT(widget->drag), ETK_CALLBACK(_etk_widget_dnd_drag_end_cb), NULL); + } } else { widget->accepts_dnd = ETK_FALSE; - widget->dnd_source = ETK_TRUE; + widget->dnd_source = ETK_FALSE; _etk_widget_dnd_source_widgets = evas_list_remove(_etk_widget_dnd_source_widgets, widget); + + if(!widget->dnd_internal) + { + etk_signal_disconnect("mouse_move", ETK_OBJECT(widget), ETK_CALLBACK(_etk_widget_dnd_drag_mouse_move_cb)); + etk_signal_disconnect("drag_end", ETK_OBJECT(widget->drag), ETK_CALLBACK(_etk_widget_dnd_drag_end_cb)); + } } } @@ -1353,6 +1367,30 @@ } /** + * @brief Set whether the widget wants to handle its own dnd or not + * @param widget a widget + * @parab on ETK_TRUE if the widget handles its own dnd, ETK_FALSE otherwise + */ +void etk_widget_dnd_internal_set(Etk_Widget *widget, Etk_Bool on) +{ + if (!widget) + return ETK_FALSE; + widget->dnd_internal = on; +} + +/** + * @brief Checks whether the widget wants to handle its own dnd or not + * @param widget a widget + * @return Returns ETK_TRUE if the widget handles its own dnd, ETK_FALSE otherwise + */ +Etk_Bool etk_widget_dnd_internal_get(Etk_Widget *widget) +{ + if (!widget) + return ETK_FALSE; + return (widget->dnd_internal); +} + +/** * @brief Sets the visual data for the drag (the widget to be displayed) * @param widget a widget * @param drag_widget the widget that will appear in the drag window @@ -1485,6 +1523,17 @@ } /** + * @brief Sends the "drag_begin" signal + * @param widget a widget + */ +void etk_widget_drag_begin(Etk_Widget *widget) +{ + if (!widget) + return; + etk_signal_emit(_etk_widget_signals[ETK_WIDGET_DRAG_BEGIN_SIGNAL], ETK_OBJECT(widget), NULL); +} + +/** * @brief Sends the "drag_end" signal * @param widget a widget */ @@ -1555,7 +1604,8 @@ widget->drag_motion = _etk_widget_drag_motion_handler; widget->drag_enter = _etk_widget_drag_enter_handler; widget->drag_leave = _etk_widget_drag_leave_handler; - widget->drag_end = _etk_widget_drag_end_handler; + widget->drag_begin = _etk_widget_drag_begin_handler; + widget->drag_end = _etk_widget_drag_end_handler; widget->left_inset = 0; widget->right_inset = 0; @@ -1589,6 +1639,7 @@ widget->need_theme_min_size_recalc = ETK_FALSE; widget->swallowed = ETK_FALSE; widget->accepts_dnd = ETK_FALSE; + widget->dnd_internal = ETK_FALSE; widget->dnd_source = ETK_FALSE; widget->dnd_dest = ETK_FALSE; widget->dnd_types = NULL; @@ -1820,6 +1871,14 @@ etk_widget_theme_object_signal_emit(widget, "drag_leave"); } +/* Default handler for the "drag_begin" signal */ +static void _etk_widget_drag_begin_handler(Etk_Widget *widget) +{ + if (!widget) + return; + etk_widget_theme_object_signal_emit(widget, "drag_begin"); +} + /* Default handler for the "drag_end" signal */ static void _etk_widget_drag_end_handler(Etk_Widget *widget) { @@ -2701,24 +2760,24 @@ ev = event; if(ev->buttons & 0x001 && _etk_dnd_drag_start) - { - const char **types; - unsigned int num_types; - char *data; - Etk_Drag *drag; - - drag = (ETK_WIDGET(object))->drag; - - _etk_dnd_drag_start = ETK_FALSE; - types = calloc(1, sizeof(char*)); - num_types = 1; - types[0] = strdup("text/plain"); - data = strdup("This is the drag data!"); - -// etk_drag_types_set(drag, types, num_types); -// etk_drag_data_set(drag, data, strlen(data) + 1); - etk_drag_begin(drag); - } + { + const char **types; + unsigned int num_types; + char *data; + Etk_Drag *drag; + + drag = (ETK_WIDGET(object))->drag; + + _etk_dnd_drag_start = ETK_FALSE; + types = calloc(1, sizeof(char*)); + num_types = 1; + types[0] = strdup("text/plain"); + data = strdup("This is the drag data!"); + + //etk_drag_types_set(drag, types, num_types); + //etk_drag_data_set(drag, data, strlen(data) + 1); + etk_drag_begin(drag); + } } static void _etk_widget_dnd_drag_end_cb(Etk_Object *object, void *data) =================================================================== RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/etk_widget.h,v retrieving revision 1.23 retrieving revision 1.24 diff -u -3 -r1.23 -r1.24 --- etk_widget.h 15 Feb 2006 15:03:17 -0000 1.23 +++ etk_widget.h 20 Feb 2006 10:31:30 -0000 1.24 @@ -177,7 +177,8 @@ void (*drag_motion)(Etk_Widget *widget); void (*drag_enter)(Etk_Widget *widget); void (*drag_leave)(Etk_Widget *widget); - void (*drag_end)(Etk_Widget *widget); + void (*drag_begin)(Etk_Widget *widget); + void (*drag_end)(Etk_Widget *widget); unsigned char realized : 1; unsigned char swallowed : 1; @@ -193,7 +194,8 @@ unsigned char need_theme_min_size_recalc : 1; unsigned char accepts_dnd : 1; unsigned char dnd_source : 1; - unsigned char dnd_dest : 1; + unsigned char dnd_dest : 1; + unsigned char dnd_internal: 1; Etk_Drag *drag; char **dnd_types; @@ -278,11 +280,14 @@ const char **etk_widget_dnd_files_get(Etk_Widget *e, int *num_files); void etk_widget_dnd_types_set(Etk_Widget *widget, char **types, int num); const char **etk_widget_dnd_types_get(Etk_Widget *widget, int *num); - +Etk_Bool etk_widget_dnd_internal_get(Etk_Widget *widget); +void etk_widget_dnd_internal_set(Etk_Widget *widget, Etk_Bool on); + void etk_widget_drag_drop(Etk_Widget *widget, Etk_Event_Selection_Request *event); void etk_widget_drag_motion(Etk_Widget *widget); void etk_widget_drag_enter(Etk_Widget *widget); void etk_widget_drag_leave(Etk_Widget *widget); +void etk_widget_drag_begin(Etk_Widget *widget); void etk_widget_drag_end(Etk_Widget *widget); void etk_widget_selection_received(Etk_Widget *widget, Etk_Event_Selection_Request *event); |
From: <enl...@li...> - 2006-02-20 10:32:06
|
Enlightenment CVS committal Author : codewarrior Project : e17 Module : proto Dir : e17/proto/etk/src/bin Modified Files: etk_tree_test.c Log Message: - add ability for trees to have drags started from them. now we can drop to and drag from an Etk_Tree. =================================================================== RCS file: /cvsroot/enlightenment/e17/proto/etk/src/bin/etk_tree_test.c,v retrieving revision 1.24 retrieving revision 1.25 diff -u -3 -r1.24 -r1.25 --- etk_tree_test.c 20 Feb 2006 02:41:12 -0000 1.24 +++ etk_tree_test.c 20 Feb 2006 10:31:23 -0000 1.25 @@ -4,6 +4,7 @@ #include "config.h" static void _etk_test_tree_drag_drop_cb(Etk_Object *object, void *event, void *data); +static void _etk_test_tree_drag_begin_cb(Etk_Object *object, void *event, void *data); static void _etk_test_tree_add_items(Etk_Tree *tree, int n); static void _etk_test_tree_row_selected(Etk_Object *object, Etk_Tree_Row *row, void *data); static void _etk_test_tree_row_unselected(Etk_Object *object, Etk_Tree_Row *row, void *data); @@ -82,8 +83,10 @@ etk_table_attach(ETK_TABLE(table), label, 1, 1, 0, 0, 0, 0, ETK_FILL_POLICY_HFILL | ETK_FILL_POLICY_VFILL); tree = etk_tree_new(); - etk_widget_dnd_dest_set(tree, ETK_TRUE); - etk_signal_connect("drag_drop", ETK_OBJECT(tree), ETK_CALLBACK(_etk_test_tree_drag_drop_cb), NULL); + etk_widget_dnd_source_set(ETK_WIDGET(tree), ETK_TRUE); + etk_widget_dnd_dest_set(ETK_WIDGET(tree), ETK_TRUE); + etk_signal_connect("drag_drop", ETK_OBJECT(tree), ETK_CALLBACK(_etk_test_tree_drag_drop_cb), NULL); + etk_signal_connect("drag_begin", ETK_OBJECT(tree), ETK_CALLBACK(_etk_test_tree_drag_begin_cb), NULL); etk_widget_size_request_set(tree, 320, 400); etk_table_attach_defaults(ETK_TABLE(table), tree, 1, 1, 1, 1); @@ -147,6 +150,37 @@ printf(_("Row dropped on %p: \"%s\" %d %s\n"), row, col1_string, col2_value, col3_path); } +static void _etk_test_tree_drag_begin_cb(Etk_Object *object, void *event, void *data) +{ + Etk_Tree *tree; + Etk_Tree_Row *row; + char *col1_string, *col3_path; + int col2_value; + const char **types; + unsigned int num_types; + char *drag_data; + Etk_Drag *drag; + Etk_Widget *button; + + tree = ETK_TREE(object); + row = etk_tree_selected_row_get(tree); + + drag = (ETK_WIDGET(tree))->drag; + + etk_tree_row_fields_get(row, etk_tree_nth_col_get(tree, 0), NULL, &col1_string, etk_tree_nth_col_get(tree, 1), &col2_value, etk_tree_nth_col_get(tree, 2), &col3_path, NULL); + + types = calloc(1, sizeof(char*)); + num_types = 1; + types[0] = strdup("text/plain"); + drag_data = strdup(col1_string); + + etk_drag_types_set(drag, types, num_types); + etk_drag_data_set(drag, drag_data, strlen(drag_data) + 1); + button = etk_button_new_with_label(col1_string); + etk_button_image_set(ETK_BUTTON(button), ETK_IMAGE(etk_image_new_from_file(col3_path))); + etk_container_add(ETK_CONTAINER(drag), button); +} + /* Adds n items to the tree */ static void _etk_test_tree_add_items(Etk_Tree *tree, int n) { |
From: <enl...@li...> - 2006-02-20 10:42:12
|
Enlightenment CVS committal Author : codewarrior Project : e17 Module : proto Dir : e17/proto/etk/src/lib Modified Files: etk_tree.c Log Message: properly set the dnd flag =================================================================== RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/etk_tree.c,v retrieving revision 1.36 retrieving revision 1.37 diff -u -3 -r1.36 -r1.37 --- etk_tree.c 20 Feb 2006 10:31:29 -0000 1.36 +++ etk_tree.c 20 Feb 2006 10:42:09 -0000 1.37 @@ -2842,5 +2842,5 @@ static void _etk_tree_drag_end_cb(Etk_Object *object, void *data) { - _etk_tree_drag_start = ETK_TRUE; + _etk_tree_drag_start = ETK_FALSE; } |