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); ------------------------------------------------------- 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