From: <enl...@li...> - 2006-02-09 22:41:30
|
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 /** @} */ |