Enlightenment SVN wrote: > Log: > Bug 496, now internal drag and drop works without any X calls. If anyone > knows what the format field in Ecore_X_Selection_Data is for, it'd be nice to > know.
The format is 8, 16 or 32, indicates the block size of the data. So sizeof(data) == len * format Sebastian > > Author: jethomas > Date: 2008-12-02 17:03:16 -0800 (Tue, 02 Dec 2008) > New Revision: 37911 > > Modified: > trunk/ewl/src/bin/tests/dnd_snoop/ewl_dnd_snoop_test.c > trunk/ewl/src/engines/x11/ewl_engine_x11.c trunk/ewl/src/lib/ewl_dnd.c > trunk/ewl/src/lib/ewl_dnd.h trunk/ewl/src/lib/ewl_embed.c > trunk/ewl/src/lib/ewl_embed.h trunk/ewl/src/lib/ewl_filelist_view.c > trunk/ewl/src/lib/ewl_widget.c > > Modified: trunk/ewl/src/bin/tests/dnd_snoop/ewl_dnd_snoop_test.c > =================================================================== > --- trunk/ewl/src/bin/tests/dnd_snoop/ewl_dnd_snoop_test.c 2008-12-03 > 00:36:31 UTC (rev 37910) > +++ trunk/ewl/src/bin/tests/dnd_snoop/ewl_dnd_snoop_test.c 2008-12-03 > 01:03:16 UTC (rev 37911) > @@ -189,7 +189,7 @@ > { > char buf[PATH_MAX]; > Ewl_Event_Dnd_Data_Received *ev = event; > - snprintf(buf, PATH_MAX, "Data event on widget %p: %p length %d\n", > w, ev->data, ev->len); > + snprintf(buf, PATH_MAX, "Data event on widget %p: %p length %d > format %d\n", w, ev->data, ev->len, ev->format); > ewl_dnd_snoop_output(buf); > } > > @@ -208,8 +208,7 @@ > ewl_dnd_snoop_output(buf); > emb = ewl_embed_widget_find(w); > if (emb) > - ewl_engine_embed_dnd_drag_data_send(emb, ev->handle, > - (void *)w->inheritance, > + ewl_dnd_drag_data_send(emb, ev->handle, (void > *)w->inheritance, > strlen(w->inheritance) + 1); > } > > > Modified: trunk/ewl/src/engines/x11/ewl_engine_x11.c > =================================================================== > --- trunk/ewl/src/engines/x11/ewl_engine_x11.c 2008-12-03 00:36:31 UTC > (rev 37910) > +++ trunk/ewl/src/engines/x11/ewl_engine_x11.c 2008-12-03 01:03:16 UTC > (rev 37911) > @@ -1465,7 +1465,6 @@ > { > Ewl_Embed *embed; > Ecore_X_Event_Xdnd_Drop *ev; > - int internal = 0; > > DENTER_FUNCTION(DLEVEL_STABLE); > DCHECK_PARAM_PTR_RET(e, FALSE); > @@ -1479,13 +1478,10 @@ > > ewl_embed_window_position_get(embed, &wx, &wy); > > - if (ev->source == UINTPTR_TO_UINT(embed->canvas_window)) > - internal = 1; > - > x = ev->position.x - wx; > y = ev->position.y - wy; > > - type = ewl_embed_dnd_drop_feed(embed, x, y, internal); > + type = ewl_embed_dnd_drop_feed(embed, x, y); > if (type) > ecore_x_selection_xdnd_request(ev->win, (char > *)type); > } > > Modified: trunk/ewl/src/lib/ewl_dnd.c > =================================================================== > --- trunk/ewl/src/lib/ewl_dnd.c 2008-12-03 00:36:31 UTC (rev 37910) > +++ trunk/ewl/src/lib/ewl_dnd.c 2008-12-03 01:03:16 UTC (rev 37911) > @@ -5,6 +5,9 @@ > #include "ewl_debug.h" > > #define EWL_DND_WINDOW_ROOT 0 > +#define EWL_DRAGGING_NONE 0 > +#define EWL_DRAGGING_INTERNAL 1 > +#define EWL_DRAGGING_EXTERNAL 2 > > unsigned int EWL_CALLBACK_DND_POSITION; /**< A DND position event **/ > unsigned int EWL_CALLBACK_DND_ENTER; /**< On enter of a widget **/ > @@ -17,6 +20,9 @@ > static int ewl_dragging_current; > static int ewl_dnd_status; > > +static void *ewl_dnd_req_data; > +static int ewl_dnd_req_data_len; > + > static Ewl_Widget *ewl_dnd_widget; > static Ewl_Widget *ewl_dnd_default_cursor; > > @@ -60,7 +66,7 @@ > ecore_hash_free_value_cb_set(ewl_dnd_accepted_hash, free); > ewl_dnd_widget = NULL; > ewl_dnd_default_cursor = NULL; > - ewl_dragging_current = 0; > + ewl_dragging_current = EWL_DRAGGING_NONE; > ewl_dnd_status = 1; > > DRETURN_INT(TRUE, DLEVEL_STABLE); > @@ -256,42 +262,27 @@ > /** > * @param w: The widget to start dragging > * @return Returns no value > - * @brief Tells the widget to start dragging > + * @brief Creates the proper condition for internal dragging > */ > void > -ewl_dnd_drag_start(Ewl_Widget *w) > +ewl_dnd_internal_drag_start(Ewl_Widget *w) > { > - unsigned int i; > - char **types; > Ewl_Embed *emb; > > DENTER_FUNCTION(DLEVEL_STABLE); > DCHECK_PARAM_PTR(w); > DCHECK_TYPE(w, EWL_WIDGET_TYPE); > > - if (!ewl_dnd_status || ewl_dragging_current) > + if (!ewl_dnd_status) > DRETURN(DLEVEL_STABLE); > > emb = ewl_embed_widget_find(w); > if (!emb) DRETURN(DLEVEL_STABLE); > > - ewl_dragging_current = 1; > + ewl_dragging_current = EWL_DRAGGING_INTERNAL; > ewl_dnd_widget = w; > > - types = ewl_dnd_provided_types_get(w); > /* > - * Count the number of mime types set on the widget. > - */ > - for (i = 0; types && types[i]; i++) > - ; > - > - /* > - * Flag the provided DND types on the embed and begin the DND > process. > - */ > - ewl_engine_embed_dnd_drag_types_set(emb, types, i); > - ewl_engine_embed_dnd_drag_start(emb); > - > - /* > * Create a fallback cursor to display during DND operations. > */ > if (!ewl_dnd_default_cursor) { > @@ -317,9 +308,50 @@ > /** > * @param w: The widget to start dragging > * @return Returns no value > - * @brief Tells the widget to start dragging > + * @brief Creates the proper condition for external dragging > */ > void > +ewl_dnd_external_drag_start(Ewl_Widget *w) > +{ > + unsigned int i; > + char ** types; > + Ewl_Embed *emb; > + > + DENTER_FUNCTION(DLEVEL_STABLE); > + DCHECK_PARAM_PTR(w); > + DCHECK_TYPE(w, EWL_WIDGET_TYPE); > + > + if ((!ewl_dnd_status) || (ewl_dragging_current != > + EWL_DRAGGING_INTERNAL)) > + DRETURN(DLEVEL_STABLE); > + > + emb = ewl_embed_widget_find(w); > + if (!emb) DRETURN(DLEVEL_STABLE); > + > + ewl_dragging_current = EWL_DRAGGING_EXTERNAL; > + > + types = ewl_dnd_provided_types_get(w); > + /* > + * Count the number of mime types set on the widget > + */ > + for (i = 0; types && types[i]; i++) > + ; > + > + /* > + * Flag the provided DND types on the embed and begin the DND process > + */ > + ewl_engine_embed_dnd_drag_types_set(emb, types, i); > + ewl_engine_embed_dnd_drag_start(emb); > + > + DLEAVE_FUNCTION(DLEVEL_STABLE); > +} > + > +/** > + * @param w: The widget to stop dragging > + * @return Returns no value > + * @brief Tells the widget to drop its data > + */ > +void > ewl_dnd_drag_drop(Ewl_Widget *w) > { > Ewl_Embed *emb; > @@ -328,7 +360,6 @@ > DCHECK_PARAM_PTR(w); > DCHECK_TYPE(w, EWL_WIDGET_TYPE); > > - ewl_dragging_current = 0; > ewl_dnd_widget = NULL; > > emb = ewl_embed_widget_find(w); > @@ -338,12 +369,79 @@ > ewl_attach_list_del(EWL_WIDGET(emb)->attach, > EWL_ATTACH_TYPE_MOUSE_ARGB_CURSOR); > ewl_embed_mouse_cursor_set(EWL_WIDGET(emb)); > - ewl_engine_embed_dnd_drag_drop(emb); > > + if (ewl_dragging_current == EWL_DRAGGING_EXTERNAL) > + { > + ewl_engine_embed_dnd_drag_drop(emb); > + } > + else if (ewl_dragging_current == EWL_DRAGGING_INTERNAL) > + { > + Ewl_Event_Dnd_Data_Request req_ev; > + Ewl_Widget *drop, *drag; > + char ** types; > + int i; > + > + drop = emb->last.drop_widget; > + drag = emb->last.drag_widget; > + if (!drop || !drag) DRETURN(DLEVEL_STABLE); > + > + types = ewl_dnd_provided_types_get(drag); > + for (i = 0; types && types[i]; i++) > + { > + if (ewl_dnd_accepted_types_contains(drop, types[i])) > + { > + req_ev.type = types[i]; > + ewl_callback_call_with_event_data > + (emb->last.drag_widget, > + EWL_CALLBACK_DND_DATA_REQUEST, > &req_ev); > + break; > + } > + } > + > + if (!ewl_dnd_req_data || !ewl_dnd_req_data_len) > + { > + DWARNING("No data received for internal drop!\n"); > + DRETURN(DLEVEL_STABLE); > + } > + > + /* FIXME What is the format parameter supposed to be?! */ > + ewl_embed_dnd_data_received_feed(emb, req_ev.type, > + ewl_dnd_req_data, ewl_dnd_req_data_len, 0); > + } > + > + ewl_dragging_current = EWL_DRAGGING_NONE; > + ewl_dnd_req_data = NULL; > + ewl_dnd_req_data_len = 0; > + > DLEAVE_FUNCTION(DLEVEL_STABLE); > } > > /** > + * @param emb: Embed to send to > + * @param handle: Handle to the window > + * @param data: Data to send > + * @param len: The size of the data > + */ > +void > +ewl_dnd_drag_data_send(Ewl_Embed *emb, void *handle, void *data, int len) > +{ > + DENTER_FUNCTION(DLEVEL_STABLE); > + DCHECK_PARAM_PTR(emb); > + > + if (ewl_dragging_current == EWL_DRAGGING_INTERNAL) > + { > + ewl_dnd_req_data = data; > + ewl_dnd_req_data_len = len; > + } > + else > + { > + ewl_engine_embed_dnd_drag_data_send(emb, handle, data, len); > + } > + > + DRETURN(DLEVEL_STABLE); > +} > + > +/** > * @return Returns no value > * @brief Disables DND > */ > > Modified: trunk/ewl/src/lib/ewl_dnd.h > =================================================================== > --- trunk/ewl/src/lib/ewl_dnd.h 2008-12-03 00:36:31 UTC (rev 37910) > +++ trunk/ewl/src/lib/ewl_dnd.h 2008-12-03 01:03:16 UTC (rev 37911) > @@ -19,8 +19,11 @@ > int ewl_dnd_init(void); > void ewl_dnd_shutdown(void); > > -void ewl_dnd_drag_start(Ewl_Widget *w); > +void ewl_dnd_internal_drag_start(Ewl_Widget *w); > +void ewl_dnd_external_drag_start(Ewl_Widget *w); > void ewl_dnd_drag_drop(Ewl_Widget *w); > +void ewl_dnd_drag_data_send(Ewl_Embed *emb, void *handle, > + void *data, int len); > void ewl_dnd_drag_widget_clear(void); > Ewl_Widget *ewl_dnd_drag_widget_get(void); > > > Modified: trunk/ewl/src/lib/ewl_embed.c > =================================================================== > --- trunk/ewl/src/lib/ewl_embed.c 2008-12-03 00:36:31 UTC (rev 37910) > +++ trunk/ewl/src/lib/ewl_embed.c 2008-12-03 01:03:16 UTC (rev 37911) > @@ -840,7 +840,7 @@ > * @brief Sends the event for a DND drop into an embed. > */ > const char * > -ewl_embed_dnd_drop_feed(Ewl_Embed *embed, int x, int y, int internal > __UNUSED__) > +ewl_embed_dnd_drop_feed(Ewl_Embed *embed, int x, int y) > { > Ewl_Widget *widget = NULL, *parent = NULL; > const char *result = NULL; > @@ -1018,6 +1018,10 @@ > embed->last.mouse_in = embed->last.mouse_in->parent; > } > > + if ((embed->last.drag_widget) && (ewl_widget_state_has > + (embed->last.drag_widget, > EWL_FLAG_STATE_DND))) > + ewl_dnd_external_drag_start(embed->last.drag_widget); > + > DLEAVE_FUNCTION(DLEVEL_STABLE); > } > > > Modified: trunk/ewl/src/lib/ewl_embed.h > =================================================================== > --- trunk/ewl/src/lib/ewl_embed.h 2008-12-03 00:36:31 UTC (rev 37910) > +++ trunk/ewl/src/lib/ewl_embed.h 2008-12-03 01:03:16 UTC (rev 37911) > @@ -129,8 +129,7 @@ > > const char *ewl_embed_dnd_position_feed(Ewl_Embed *embed, int x, int y, > int *, int *, int *, int *); > -const char *ewl_embed_dnd_drop_feed(Ewl_Embed* embed, int x, int y, > - int internal); > +const char *ewl_embed_dnd_drop_feed(Ewl_Embed* embed, int x, int y); > void ewl_embed_dnd_data_received_feed(Ewl_Embed* embed, char > *type, > void *data, unsigned int len, > unsigned int format); > > Modified: trunk/ewl/src/lib/ewl_filelist_view.c > =================================================================== > --- trunk/ewl/src/lib/ewl_filelist_view.c 2008-12-03 00:36:31 UTC (rev > 37910) > +++ trunk/ewl/src/lib/ewl_filelist_view.c 2008-12-03 01:03:16 UTC (rev > 37911) > @@ -82,8 +82,7 @@ > len = strlen(buf); > } > > - ewl_engine_embed_dnd_drag_data_send(emb, ev->handle, > - (void *)uri, len); > + ewl_dnd_drag_data_send(emb, ev->handle, (void *)uri, len); > > DLEAVE_FUNCTION(DLEVEL_STABLE); > } > > Modified: trunk/ewl/src/lib/ewl_widget.c > =================================================================== > --- trunk/ewl/src/lib/ewl_widget.c 2008-12-03 00:36:31 UTC (rev 37910) > +++ trunk/ewl/src/lib/ewl_widget.c 2008-12-03 01:03:16 UTC (rev 37911) > @@ -3181,7 +3181,7 @@ > if (!ewl_widget_state_has(w, EWL_FLAG_STATE_DND)) { > ewl_widget_state_add(w, EWL_FLAG_STATE_DND); > embed->last.drag_widget = w; > - ewl_dnd_drag_start(w); > + ewl_dnd_internal_drag_start(w); > } > > if (ev && (ev->x > CURRENT_X(embed) && > > > ------------------------------------------------------------------------- > This SF.Net email is sponsored by the Moblin Your Move Developer's challenge > Build the coolest Linux based applications with Moblin SDK & win great prizes > Grand prize is a trip for two to an Open Source event anywhere in the world > http://moblin-contest.org/redirect.php?banner_id=100&url=/ > _______________________________________________ > enlightenment-svn mailing list > [EMAIL PROTECTED] > https://lists.sourceforge.net/lists/listinfo/enlightenment-svn ------------------------------------------------------------------------- This SF.Net email is sponsored by the Moblin Your Move Developer's challenge Build the coolest Linux based applications with Moblin SDK & win great prizes Grand prize is a trip for two to an Open Source event anywhere in the world http://moblin-contest.org/redirect.php?banner_id=100&url=/ _______________________________________________ enlightenment-devel mailing list enlightenment-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-devel