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