Enlightenment CVS committal Author : codewarrior Project : e17 Module : proto
Dir : e17/proto/etk/src/lib Modified Files: Etk.h Makefile.am etk_main.c etk_types.h etk_widget.c etk_widget.h Added Files: etk_dnd.c etk_dnd.h Log Message: create new files for xdnd stuff and implement paste support for selections. =================================================================== RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/Etk.h,v retrieving revision 1.17 retrieving revision 1.18 diff -u -3 -r1.17 -r1.18 --- Etk.h 8 Feb 2006 12:49:38 -0000 1.17 +++ Etk.h 9 Feb 2006 22:41:20 -0000 1.18 @@ -58,5 +58,6 @@ #include "etk_notebook.h" #include "etk_progress_bar.h" #include "etk_spin_button.h" +#include "etk_dnd.h" #endif =================================================================== RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/Makefile.am,v retrieving revision 1.20 retrieving revision 1.21 diff -u -3 -r1.20 -r1.21 --- Makefile.am 8 Feb 2006 12:49:38 -0000 1.20 +++ Makefile.am 9 Feb 2006 22:41:20 -0000 1.21 @@ -41,7 +41,8 @@ etk_filechooser_widget.h \ etk_notebook.h \ etk_progress_bar.h \ -etk_spin_button.h +etk_spin_button.h \ +etk_dnd.h libetk_la_SOURCES = \ etk_main.c etk_utils.c \ @@ -70,6 +71,7 @@ etk_notebook.c \ etk_progress_bar.c \ etk_spin_button.c \ +etk_dnd.c \ $(ETKHEADERS) installed_headersdir = $(prefix)/include/etk =================================================================== RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/etk_main.c,v retrieving revision 1.12 retrieving revision 1.13 diff -u -3 -r1.12 -r1.13 --- etk_main.c 9 Feb 2006 01:52:19 -0000 1.12 +++ etk_main.c 9 Feb 2006 22:41:20 -0000 1.13 @@ -1,5 +1,6 @@ /** @file etk_main.c */ #include "etk_main.h" +#include "etk_dnd.h" #include <locale.h> #include <string.h> #include <stdlib.h> @@ -27,18 +28,9 @@ static void _etk_main_size_request_recursive(Etk_Widget *widget); static void _etk_main_size_allocate_recursive(Etk_Widget *widget, Etk_Bool is_top_level); -#if HAVE_ECORE_X -static int _etk_xdnd_enter_handler(void *data, int type, void *event); -static int _etk_xdnd_position_handler(void *data, int type, void *event); -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 Etk_Widget *_etk_dnd_widget = NULL; -Evas_List *_etk_dnd_widgets = NULL; -#endif +/* we need this in etk_dnd */ +Evas_List *_etk_main_toplevel_widgets = NULL; -static Evas_List *_etk_main_toplevel_widgets = NULL; static Etk_Bool _etk_main_running = ETK_FALSE; static Etk_Bool _etk_main_initialized = ETK_FALSE; static Ecore_Job *_etk_main_iterate_job = NULL; @@ -80,9 +72,9 @@ } #if HAVE_ECORE_X - if (!ecore_x_init(NULL)) + if (!etk_dnd_init()) { - ETK_WARNING("Ecore_X initialzation failed!"); + ETK_WARNING("Etk_dnd and Ecore_X initialzation failed!"); return ETK_FALSE; } #endif @@ -93,14 +85,6 @@ setlocale(LC_ALL, ""); bindtextdomain(PACKAGE, LOCALEDIR); textdomain(PACKAGE); - -#if HAVE_ECORE_X - ecore_event_handler_add(ECORE_X_EVENT_XDND_ENTER, _etk_xdnd_enter_handler, NULL); - ecore_event_handler_add(ECORE_X_EVENT_XDND_POSITION, _etk_xdnd_position_handler, NULL); - ecore_event_handler_add(ECORE_X_EVENT_XDND_DROP, _etk_xdnd_drop_handler, NULL); - ecore_event_handler_add(ECORE_X_EVENT_XDND_LEAVE, _etk_xdnd_leave_handler, NULL); - ecore_event_handler_add(ECORE_X_EVENT_SELECTION_NOTIFY, _etk_xdnd_selection_handler, NULL); -#endif _etk_main_initialized = ETK_TRUE; return ETK_TRUE; @@ -116,6 +100,7 @@ etk_signal_shutdown(); etk_type_shutdown(); etk_theme_shutdown(); + etk_dnd_shutdown(); edje_shutdown(); ecore_evas_shutdown(); ecore_shutdown(); @@ -246,216 +231,4 @@ } } - -#if HAVE_ECORE_X -#define E_INSIDE(x, y, xx, yy, ww, hh) (((x) < ((xx) + (ww))) && ((y) < ((yy) + (hh))) && ((x) >= (xx)) && ((y) >= (yy))) - -/* Search the container recursively for the widget that accepts xdnd */ -static void _etk_xdnd_container_get_widgets_at(Etk_Toplevel_Widget *top, int x, int y, int offx, int offy, Evas_List **list) -{ - Evas_List *l; - - for(l = _etk_dnd_widgets; l; l = l->next) - { - Etk_Widget *widget; - - if(!(widget = ETK_WIDGET(l->data))) - continue; - - if(E_INSIDE(x, y, - widget->inner_geometry.x + offx, - widget->inner_geometry.y + offy, - widget->inner_geometry.w, - widget->inner_geometry.h)) - *list = evas_list_append(*list, widget); - } -} - -static int _etk_xdnd_enter_handler(void *data, int type, void *event) -{ - Ecore_X_Event_Xdnd_Enter *ev; - int i; - - ev = event; - -// printf("enter window!\n"); -// for (i = 0; i < ev->num_types; i++) -// printf("type: %s\n", ev->types[i]); - - return 1; -} - -static int _etk_xdnd_position_handler(void *data, int type, void *event) -{ - Ecore_X_Event_Xdnd_Position *ev; - Etk_Window *window; - Evas_List *l; - Evas_List *children = NULL; - Etk_Widget *widget; - int x = 0, y = 0; - - ev = event; - - /* loop top level widgets (windows) */ - for(l = _etk_main_toplevel_widgets; l; l = l->next) - { - if (!(window = ETK_WINDOW(l->data))) - continue; - - /* if this isnt the active window, dont waste time */ - if(ev->win != window->x_window) - continue; - - ecore_evas_geometry_get(window->ecore_evas, &x, &y, NULL, NULL); - - /* find the widget we want to drop on */ - _etk_xdnd_container_get_widgets_at(ETK_TOPLEVEL_WIDGET(window), ev->position.x, ev->position.y, x, y, &children); - - /* check if we're leaving a widget */ - if(_etk_dnd_widget) - { - if(!E_INSIDE(ev->position.x, ev->position.y, - _etk_dnd_widget->geometry.x + x, _etk_dnd_widget->geometry.y + y, - _etk_dnd_widget->geometry.w, _etk_dnd_widget->geometry.h)) - { - etk_widget_drag_leave(_etk_dnd_widget); - _etk_dnd_widget = NULL; - } - } - - break; - } - - /* if we found a widget, emit signals */ - if(children != NULL) - { - Ecore_X_Rectangle rect; - - widget = (evas_list_last(children))->data; - _etk_dnd_widget = widget; - /* TODO: filter types according to what widget wants */ - rect.x = widget->inner_geometry.x; - rect.y = widget->inner_geometry.y; - rect.width = widget->inner_geometry.w; - rect.height = widget->inner_geometry.h; - ecore_x_dnd_send_status(1, 1, rect, ECORE_X_DND_ACTION_PRIVATE); - - etk_widget_drag_motion(widget); - } - - return 1; -} - -static int _etk_xdnd_drop_handler(void *data, int type, void *event) -{ - Ecore_X_Event_Xdnd_Drop *ev; - - /* printf("drop\n"); */ - ev = event; - - ecore_x_selection_xdnd_request(ev->win, "text/uri-list"); - return 1; -} - -static int _etk_xdnd_leave_handler(void *data, int type, void *event) -{ - //printf("leave window\n"); - - return 1; -} - -static int _etk_xdnd_selection_handler(void *data, int type, void *event) -{ - Ecore_X_Event_Selection_Notify *ev; - Ecore_X_Selection_Data *sel; - Ecore_X_Selection_Data_Files *files; - Ecore_X_Selection_Data_Text *text; - Ecore_X_Selection_Data_Targets *targets; - int i; - - //printf("selection\n"); - ev = event; - switch (ev->selection) - { - case ECORE_X_SELECTION_PRIMARY: - if (!strcmp(ev->target, ECORE_X_SELECTION_TARGET_TARGETS)) - { - /* printf("primary: %s\n", ev->target); */ - targets = ev->data; - /* - for (i = 0; i < targets->num_targets; i++) - printf("target: %s\n", targets->targets[i]); - */ - } - else - { - text = ev->data; - /* printf("primary: %s %s\n", ev->target, text->text); */ - } - break; - - case ECORE_X_SELECTION_SECONDARY: - sel = ev->data; - /* printf("secondary: %s %s\n", ev->target, sel->data); */ - break; - - case ECORE_X_SELECTION_XDND: - /* printf("xdnd: %s\n", ev->target); */ - - files = ev->data; - - if(!_etk_dnd_widget || files->num_files < 1) - break; - - /* free old data, should this be done here? */ - for (i = 0; i < _etk_dnd_widget->xdnd_files_num; i++) - { - if(_etk_dnd_widget->xdnd_files[i]) - free(_etk_dnd_widget->xdnd_files[i]); - } - - if(_etk_dnd_widget->xdnd_files) - free(_etk_dnd_widget->xdnd_files); - - _etk_dnd_widget->xdnd_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->xdnd_files_num = files->num_files; - for (i = 0; i < files->num_files; i++) - { - /* printf("file: %s\n", files->files[i]); */ - _etk_dnd_widget->xdnd_files[i] = strdup(files->files[i]); - } - - /* emit the drop signal so the widget can react */ - etk_widget_drag_drop(_etk_dnd_widget); - - ecore_x_dnd_send_finished(); - break; - - case ECORE_X_SELECTION_CLIPBOARD: - if (!strcmp(ev->target, ECORE_X_SELECTION_TARGET_TARGETS)) - { - //printf("clipboard: %s\n", ev->target); - targets = ev->data; - /* - for (i = 0; i < targets->num_targets; i++) - printf("target: %s\n", targets->targets[i]); - */ - } - else - { - text = ev->data; - /* printf("clipboard: %s %s\n", ev->target, text->text); */ - } - break; - } - - return 1; -} - -#endif - /** @} */ =================================================================== RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/etk_types.h,v retrieving revision 1.23 retrieving revision 1.24 diff -u -3 -r1.23 -r1.24 --- etk_types.h 8 Feb 2006 12:49:38 -0000 1.23 +++ etk_types.h 9 Feb 2006 22:41:20 -0000 1.24 @@ -106,6 +106,8 @@ typedef struct _Etk_Progress_Bar Etk_Progress_Bar; typedef enum _Etk_Progress_Bar_Orientation Etk_Progress_Bar_Orientation; typedef struct _Etk_Spin_Button Etk_Spin_Button; +typedef struct _Etk_Event_Selection_Get Etk_Event_Selection_Get; +typedef struct _Etk_Selection_Data_Targets Etk_Selection_Data_Targets; /** * @enum Etk_Fill_Policy_Flags =================================================================== RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/etk_widget.c,v retrieving revision 1.20 retrieving revision 1.21 diff -u -3 -r1.20 -r1.21 --- etk_widget.c 9 Feb 2006 01:52:20 -0000 1.20 +++ etk_widget.c 9 Feb 2006 22:41:20 -0000 1.21 @@ -13,6 +13,7 @@ #include "etk_marshallers.h" #include "etk_signal.h" #include "etk_signal_callback.h" +#include "etk_dnd.h" #include "config.h" /** @@ -63,9 +64,12 @@ ETK_WIDGET_FOCUS_SIGNAL, ETK_WIDGET_UNFOCUS_SIGNAL, ETK_WIDGET_SCROLL_SIZE_CHANGED_SIGNAL, +#if HAVE_ECORE_X ETK_WIDGET_DRAG_DROP_SIGNAL, ETK_WIDGET_DRAG_MOTION_SIGNAL, - ETK_WIDGET_DRAG_LEAVE_SIGNAL, + ETK_WIDGET_DRAG_LEAVE_SIGNAL, + ETK_WIDGET_SELECTION_GET_SIGNAL, +#endif ETK_WIDGET_NUM_SIGNALS }; @@ -176,9 +180,12 @@ _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_SCROLL_SIZE_CHANGED_SIGNAL] = etk_signal_new("scroll_size_changed", widget_type, -1, 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_LEAVE_SIGNAL] = etk_signal_new("drag_leave", widget_type, ETK_MEMBER_OFFSET(Etk_Widget, drag_leave),etk_marshaller_VOID__VOID, NULL, NULL); +#if HAVE_ECORE_X + _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_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_GET_SIGNAL] = etk_signal_new("selection_get", widget_type, -1, etk_marshaller_VOID__POINTER, NULL, NULL); +#endif etk_type_property_add(widget_type, "name", ETK_WIDGET_NAME_PROPERTY, ETK_PROPERTY_STRING, ETK_PROPERTY_READABLE_WRITABLE, etk_property_value_string(NULL)); etk_type_property_add(widget_type, "parent", ETK_WIDGET_PARENT_PROPERTY, ETK_PROPERTY_POINTER, ETK_PROPERTY_READABLE_WRITABLE, etk_property_value_pointer(NULL)); @@ -1441,6 +1448,20 @@ etk_signal_emit(_etk_widget_signals[ETK_WIDGET_DRAG_LEAVE_SIGNAL], ETK_OBJECT(widget), NULL); } +/** + * @brief Sends the "selection_get" signal + * @param widget a widget + */ +void etk_widget_selection_get(Etk_Widget *widget, Etk_Event_Selection_Get *event) +{ + if (!widget) + return; + + printf("%s <=-\n", (char*)event->data); + + etk_signal_emit(_etk_widget_signals[ETK_WIDGET_SELECTION_GET_SIGNAL], ETK_OBJECT(widget), NULL, event); +} + #endif /************************** @@ -1712,7 +1733,6 @@ etk_widget_theme_object_signal_emit(widget, "drag_leave"); } - /* Sets the widget as visible and queues a visibility update */ static void _etk_widget_show_handler(Etk_Widget *widget) { @@ -2028,7 +2048,7 @@ return ETK_FALSE; } -const char ** etk_widget_xdnd_files_get(Etk_Widget *widget, int *num_files) +const char **etk_widget_xdnd_files_get(Etk_Widget *widget, int *num_files) { if(!widget->accepts_xdnd || widget->xdnd_files == NULL) return NULL; =================================================================== RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/etk_widget.h,v retrieving revision 1.14 retrieving revision 1.15 diff -u -3 -r1.14 -r1.15 --- etk_widget.h 9 Feb 2006 01:52:21 -0000 1.14 +++ etk_widget.h 9 Feb 2006 22:41:20 -0000 1.15 @@ -272,6 +272,8 @@ void etk_widget_drag_drop(Etk_Widget *widget); void etk_widget_drag_motion(Etk_Widget *widget); void etk_widget_drag_leave(Etk_Widget *widget); + +void etk_widget_selection_get(Etk_Widget *widget, Etk_Event_Selection_Get *event); //#endif /** @} */ ------------------------------------------------------- This SF.net email is sponsored by: Splunk Inc. Do you grep through log files for problems? Stop! Download the new AJAX search engine that makes searching your log files as easy as surfing the web. DOWNLOAD SPLUNK! http://sel.as-us.falkag.net/sel?cmd=lnk&kid=103432&bid=230486&dat=121642 _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs