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: - begin working on drag support =================================================================== RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/etk_dnd.c,v retrieving revision 1.7 retrieving revision 1.8 diff -u -3 -r1.7 -r1.8 --- etk_dnd.c 14 Feb 2006 13:37:38 -0000 1.7 +++ etk_dnd.c 15 Feb 2006 03:13:54 -0000 1.8 @@ -3,9 +3,11 @@ #include <stdlib.h> #include <string.h> #include <Ecore.h> +#include <Ecore_Evas.h> #include <Ecore_X.h> #include "etk_main.h" #include "etk_widget.h" +#include "etk_toplevel_widget.h" #include "etk_window.h" #include "config.h" @@ -35,6 +37,7 @@ extern Etk_Widget *_etk_selection_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; @@ -48,6 +51,8 @@ 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 int _etk_xdnd_status_handler(void *data, int type, void *event); +static int _etk_xdnd_finished_handler(void *data, int type, void *event); #endif /************************** @@ -71,6 +76,9 @@ _etk_dnd_handlers = evas_list_append(_etk_dnd_handlers, ecore_event_handler_add(ECORE_X_EVENT_XDND_DROP, _etk_xdnd_drop_handler, NULL)); _etk_dnd_handlers = evas_list_append(_etk_dnd_handlers, ecore_event_handler_add(ECORE_X_EVENT_XDND_LEAVE, _etk_xdnd_leave_handler, NULL)); _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; @@ -90,6 +98,123 @@ #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 @@ -476,5 +601,31 @@ return 1; } + +static int _etk_xdnd_status_handler(void *data, int type, void *event) +{ + Ecore_X_Event_Xdnd_Status *ev; + + ev = event; + + if (ev->win != (ETK_WINDOW(_etk_drag_widget))->x_window) return 1; + + if(!ev->will_accept) + { + // etk_toplevel_widget_pointer_pop(etk_widget_toplevel_parent_get(ETK_WIDGET(_etk_drag_widget)), ETK_POINTER_RESIZE_BR); + return 1; + } + +// etk_toplevel_widget_pointer_push(etk_widget_toplevel_parent_get(ETK_WIDGET(_etk_drag_widget)), ETK_POINTER_RESIZE_BR); + etk_toplevel_widget_pointer_push(ETK_TOPLEVEL_WIDGET(ETK_WINDOW(_etk_drag_widget)), ETK_POINTER_RESIZE_BR); + + return 1; +} + +static int _etk_xdnd_finished_handler(void *data, int type, void *event) +{ + return 1; +} + #endif =================================================================== RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/etk_dnd.h,v retrieving revision 1.6 retrieving revision 1.7 diff -u -3 -r1.6 -r1.7 --- etk_dnd.h 14 Feb 2006 13:37:38 -0000 1.6 +++ etk_dnd.h 15 Feb 2006 03:13:54 -0000 1.7 @@ -2,6 +2,7 @@ #ifndef _ETK_DND_H_ #define _ETK_DND_H_ +#include "etk_window.h" #include "etk_types.h" #define ETK_SELECTION_TARGET_TARGETS "TARGETS" @@ -55,6 +56,23 @@ 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_types.h,v retrieving revision 1.27 retrieving revision 1.28 diff -u -3 -r1.27 -r1.28 --- etk_types.h 14 Feb 2006 13:37:38 -0000 1.27 +++ etk_types.h 15 Feb 2006 03:13:54 -0000 1.28 @@ -111,6 +111,7 @@ 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; +typedef struct _Etk_Drag Etk_Drag; /** * @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.33 retrieving revision 1.34 diff -u -3 -r1.33 -r1.34 --- etk_widget.c 14 Feb 2006 13:37:38 -0000 1.33 +++ etk_widget.c 15 Feb 2006 03:13:54 -0000 1.34 @@ -58,7 +58,8 @@ ETK_WIDGET_DRAG_DROP_SIGNAL, ETK_WIDGET_DRAG_ENTER_SIGNAL, ETK_WIDGET_DRAG_MOTION_SIGNAL, - ETK_WIDGET_DRAG_LEAVE_SIGNAL, + ETK_WIDGET_DRAG_LEAVE_SIGNAL, + ETK_WIDGET_DRAG_END_SIGNAL, ETK_WIDGET_SELECTION_RECEIVED_SIGNAL, ETK_WIDGET_CLIPBOARD_RECEIVED_SIGNAL, ETK_WIDGET_NUM_SIGNALS @@ -96,6 +97,7 @@ static void _etk_widget_drag_motion_handler(Etk_Widget *widget); static void _etk_widget_drag_enter_handler(Etk_Widget *widget); static void _etk_widget_drag_leave_handler(Etk_Widget *widget); +static void _etk_widget_drag_end_handler(Etk_Widget *widget); static void _etk_widget_mouse_in_cb(void *data, Evas *evas, Evas_Object *object, void *event_info); static void _etk_widget_signal_mouse_in_cb(Etk_Object *object, Etk_Event_Mouse_In_Out *event, void *data); @@ -184,6 +186,7 @@ _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); + _etk_widget_signals[ETK_WIDGET_DRAG_END_SIGNAL] = etk_signal_new("drag_end", widget_type, ETK_MEMBER_OFFSET(Etk_Widget, drag_end), etk_marshaller_VOID__VOID, NULL, NULL); _etk_widget_signals[ETK_WIDGET_SELECTION_RECEIVED_SIGNAL] = etk_signal_new("selection_received", widget_type, -1, etk_marshaller_VOID__POINTER, NULL, NULL); _etk_widget_signals[ETK_WIDGET_CLIPBOARD_RECEIVED_SIGNAL] = etk_signal_new("clipboard_received", widget_type, -1, etk_marshaller_VOID__POINTER, 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); @@ -1411,6 +1414,17 @@ } /** + * @brief Sends the "drag_end" signal + * @param widget a widget + */ +void etk_widget_drag_end(Etk_Widget *widget) +{ + if (!widget) + return; + etk_signal_emit(_etk_widget_signals[ETK_WIDGET_DRAG_END_SIGNAL], ETK_OBJECT(widget), NULL); +} + +/** * @brief Sends the "selection_received" signal * @param widget a widget */ @@ -1469,7 +1483,8 @@ widget->drag_drop = _etk_widget_drag_drop_handler; widget->drag_motion = _etk_widget_drag_motion_handler; widget->drag_enter = _etk_widget_drag_enter_handler; - widget->drag_leave = _etk_widget_drag_leave_handler; + widget->drag_leave = _etk_widget_drag_leave_handler; + widget->drag_end = _etk_widget_drag_end_handler; widget->left_inset = 0; widget->right_inset = 0; @@ -1731,6 +1746,14 @@ etk_widget_theme_object_signal_emit(widget, "drag_leave"); } +/* Default handler for the "drag_end" signal */ +static void _etk_widget_drag_end_handler(Etk_Widget *widget) +{ + if (!widget) + return; + etk_widget_theme_object_signal_emit(widget, "drag_end"); +} + /* Called when the mouse pointer enters the widget */ static void _etk_widget_mouse_in_cb(void *data, Evas *evas, Evas_Object *object, void *event_info) { =================================================================== RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/etk_widget.h,v retrieving revision 1.21 retrieving revision 1.22 diff -u -3 -r1.21 -r1.22 --- etk_widget.h 14 Feb 2006 13:37:38 -0000 1.21 +++ etk_widget.h 15 Feb 2006 03:13:54 -0000 1.22 @@ -177,6 +177,7 @@ void (*drag_motion)(Etk_Widget *widget); void (*drag_enter)(Etk_Widget *widget); void (*drag_leave)(Etk_Widget *widget); + void (*drag_end)(Etk_Widget *widget); unsigned char realized : 1; unsigned char swallowed : 1; @@ -275,6 +276,7 @@ void etk_widget_drag_motion(Etk_Widget *widget); void etk_widget_drag_enter(Etk_Widget *widget); void etk_widget_drag_leave(Etk_Widget *widget); +void etk_widget_drag_end(Etk_Widget *widget); void etk_widget_selection_received(Etk_Widget *widget, Etk_Event_Selection_Request *event); void etk_widget_clipboard_received(Etk_Widget *widget, Etk_Event_Selection_Request *event); ------------------------------------------------------- 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