Enlightenment CVS committal Author : moom Project : e17 Module : proto
Dir : e17/proto/etk/src/engines/ecore_evas_x11 Modified Files: ecore_evas_x11.c Log Message: A lot of changes and API breaks. Most of the existing apps are probably broken... * [Etk_Theme] The whole theme system has been rewritten to make it simpler and more powerful * [Etk_Theme] The widgets now use the same theme naming convention as e17 (i.e. "etk/widget" for the groups, "etk.swallow.name" for the swallow parts, "etk.text.name" for the text parts, ...). It means that all the (few) existing themes are broken :( * [Etk_Main] Replace the main Ecore_Job by an idle-enterer: it improves the perfs A LOT when a large part of the screen has to be redrawn (e.g scrolling the iconbox or the tree is now ultra fast!!) * [Etk_Selection] Rewrite the selection/clipboard system * [Etk_Widgets] Fix problems caused by the premul-color change * [Etk_Entry] The entry has received more work: it is now entirely themable and it now supports copy/paste * [Etk_Box] Fix a bug/segv that happened when more than one child were packed in the end-group * [Etk_Toolbar] Some work on the toolbar * [Etk_Button] Bugs have been fixed, and the code has been fully documented/cleaned up * [Etk_Label] Bugs have been fixed, and the code has been fully documented/cleaned up * [Etk_Dialog] The behaviour of etk_dialog_pack_*() has been changed: packing a widget in the end-group now *appends* it into this group (it was prepended before) * [X11 engine] Fix a bug with the popup window creation (the mouse was not correctly grabbed) * [Etk_Statusbar] The API has been changed: etk_statusbar_push/pop/remove() --> etk_statusbar_message_push/pop/remove() * [Etk_Tooltip] The tooltips are disabled for now since they are a bit buggy * [Etk_Widget] etk_widget_visibility_locked_set/get() --> etk_widget_internal_set/get() * [Etk_Toplevel] Etk_Toplevel_Widget --> Etk_Toplevel * [Etk_Container] Add etk_container_remove_all() * [Etk_Iconbox] Add etk_iconbox_scrolled_view_get() * [Etk_Main] Don't use the "-e" program arg to detect the engine to use * [Documentation] More documentation for a lot of widgets More API breaks to come... enjoy! :) =================================================================== RCS file: /cvs/e/e17/proto/etk/src/engines/ecore_evas_x11/ecore_evas_x11.c,v retrieving revision 1.16 retrieving revision 1.17 diff -u -3 -r1.16 -r1.17 --- ecore_evas_x11.c 5 Sep 2006 00:14:57 -0000 1.16 +++ ecore_evas_x11.c 6 Oct 2006 17:04:14 -0000 1.17 @@ -47,6 +47,13 @@ static void _mouse_position_get(int *x, int *y); static void _mouse_screen_geometry_get(int *x, int *y, int *w, int *h); +/* Etk_Selection functions */ +static void _selection_text_set(Etk_Selection_Type selection, const char *text); +static void _selection_text_request(Etk_Selection_Type selection, Etk_Widget *target); +static void _selection_clear(Etk_Selection_Type selection); +static int _selection_notify_handler_cb(void *data, int type, void *event); + + /* Etk_Drag functions */ static void _drag_constructor(Etk_Drag *drag); static void _drag_begin(Etk_Drag *drag); @@ -54,9 +61,7 @@ static int _drag_mouse_move_cb(void *data, int type, void *event); /* Etk_Dnd functions */ -static Etk_Bool _dnd_init(); -static void _dnd_shutdown(); -static void _dnd_container_get_widgets_at(Etk_Toplevel_Widget *top, int x, int y, int offx, int offy, Evas_List **list); +static void _dnd_container_get_widgets_at(Etk_Toplevel *top, int x, int y, int offx, int offy, Evas_List **list); static int _dnd_enter_handler(void *data, int type, void *event); static int _dnd_position_handler(void *data, int type, void *event); static int _dnd_drop_handler(void *data, int type, void *event); @@ -65,15 +70,6 @@ static int _dnd_status_handler(void *data, int type, void *event); static int _dnd_finished_handler(void *data, int type, void *event); -/* Etk_Clipboard functions */ -static void _clipboard_text_request(Etk_Widget *widget); -static void _clipboard_text_set(Etk_Widget *widget, const char *text, int length); - -/* Etk_Selection functions */ -static void _selection_text_request(Etk_Widget *widget); -static void _selection_text_set(Etk_Widget *widget, const char *text, int length); -static void _selection_clear(void); - /* Private functions */ static void _window_netwm_state_active_set(Etk_Window *window, Ecore_X_Window_State state, Etk_Bool active); static Etk_Bool _window_netwm_state_active_get(Etk_Window *window, Ecore_X_Window_State state); @@ -81,16 +77,19 @@ /* Private vars */ +static Evas_List *_popup_window_popped_windows = NULL; +static Ecore_X_Window _popup_window_input_window = 0; + static void (*_event_callback)(Etk_Event_Type event, Etk_Event_Global event_info) = NULL; static Ecore_Event_Handler *_event_input_handlers[NUM_INPUT_HANDLERS]; -static Evas_List *_popup_window_popped_windows = NULL; -static Ecore_X_Window _popup_window_input_window = 0; +static Etk_Widget *_selection_widget = NULL; +static Ecore_Event_Handler *_selection_notify_handler = NULL; + static Ecore_Event_Handler *_drag_mouse_move_handler; static Ecore_Event_Handler *_drag_mouse_up_handler; -extern Etk_Widget *_etk_selection_widget; extern Etk_Widget *_etk_drag_widget; static char **_dnd_types = NULL; static int _dnd_types_num = 0; @@ -157,18 +156,12 @@ _mouse_position_get, _mouse_screen_geometry_get, + _selection_text_set, + _selection_text_request, + _selection_clear, + _drag_constructor, _drag_begin, - - _dnd_init, - _dnd_shutdown, - - _clipboard_text_request, - _clipboard_text_set, - - _selection_text_request, - _selection_text_set, - _selection_clear }; /************************** @@ -208,6 +201,16 @@ _event_input_handlers[4] = ecore_event_handler_add(ECORE_X_EVENT_MOUSE_MOVE, _event_input_handler_cb, NULL); _event_input_handlers[5] = ecore_event_handler_add(ECORE_X_EVENT_MOUSE_WHEEL, _event_input_handler_cb, NULL); + _selection_notify_handler = ecore_event_handler_add(ECORE_X_EVENT_SELECTION_NOTIFY, _selection_notify_handler_cb, NULL); + + _dnd_handlers = evas_list_append(_dnd_handlers, ecore_event_handler_add(ECORE_X_EVENT_XDND_ENTER, _dnd_enter_handler, NULL)); + _dnd_handlers = evas_list_append(_dnd_handlers, ecore_event_handler_add(ECORE_X_EVENT_XDND_POSITION, _dnd_position_handler, NULL)); + _dnd_handlers = evas_list_append(_dnd_handlers, ecore_event_handler_add(ECORE_X_EVENT_XDND_DROP, _dnd_drop_handler, NULL)); + _dnd_handlers = evas_list_append(_dnd_handlers, ecore_event_handler_add(ECORE_X_EVENT_XDND_LEAVE, _dnd_leave_handler, NULL)); + _dnd_handlers = evas_list_append(_dnd_handlers, ecore_event_handler_add(ECORE_X_EVENT_SELECTION_NOTIFY, _dnd_selection_handler, NULL)); + _dnd_handlers = evas_list_append(_dnd_handlers, ecore_event_handler_add(ECORE_X_EVENT_XDND_STATUS, _dnd_status_handler, NULL)); + _dnd_handlers = evas_list_append(_dnd_handlers, ecore_event_handler_add(ECORE_X_EVENT_XDND_FINISHED, _dnd_finished_handler, NULL)); + return ETK_TRUE; } @@ -225,6 +228,15 @@ } } + ecore_event_handler_del(_selection_notify_handler); + _selection_notify_handler = NULL; + + while (_dnd_handlers) + { + ecore_event_handler_del(_dnd_handlers->data); + _dnd_handlers = evas_list_remove_list(_dnd_handlers, _dnd_handlers); + } + ecore_x_shutdown(); } @@ -294,23 +306,25 @@ /* Makes the window modal for another window */ static void _window_modal_for_window(Etk_Window *window_to_modal, Etk_Window *window) { - Etk_Engine_Window_Data *engine_data; + Etk_Engine_Window_Data *win_to_modal_data; if (!window_to_modal) return; - engine_data = window_to_modal->engine_data; + win_to_modal_data = window_to_modal->engine_data; if (window) { - Etk_Engine_Window_Data *engine_data2 = window->engine_data; - Ecore_X_Window_State states[] = { ECORE_X_WINDOW_STATE_MODAL }; + Etk_Engine_Window_Data *win_data = window->engine_data; - ecore_x_icccm_transient_for_set(engine_data->x_window, engine_data2->x_window); - /* TODO: Should we get the previous state here?? */ - ecore_x_netwm_window_state_set(engine_data->x_window, states, 1); + ecore_x_icccm_transient_for_set(win_to_modal_data->x_window, win_data->x_window); + _window_netwm_state_active_set(window_to_modal, ECORE_X_WINDOW_STATE_MODAL, ETK_TRUE); + } + else + { + ecore_x_icccm_transient_for_unset(win_to_modal_data->x_window); + _window_netwm_state_active_set(window_to_modal, ECORE_X_WINDOW_STATE_MODAL, ETK_FALSE); } - //TODO: else... } /* Sets the stacking layer of the window ("normal", "always on top" or "always below") */ @@ -344,42 +358,12 @@ } /* Sets whether or not the window should appear in the taskbar */ -/* TODO: maybe there is a better way to do this? */ static void _window_skip_taskbar_hint_set(Etk_Window *window, Etk_Bool skip_taskbar_hint) { - Etk_Engine_Window_Data *engine_data; - - if (!window || skip_taskbar_hint == etk_window_skip_taskbar_hint_get(window)) + if (!window) return; - engine_data = window->engine_data; - if (skip_taskbar_hint) - { - if (etk_window_skip_pager_hint_get(window)) - { - Ecore_X_Window_State states[2]; - states[0] = ECORE_X_WINDOW_STATE_SKIP_TASKBAR; - states[1] = ECORE_X_WINDOW_STATE_SKIP_PAGER; - ecore_x_netwm_window_state_set(engine_data->x_window, states, 2); - } - else - { - Ecore_X_Window_State state[1]; - state[0] = ECORE_X_WINDOW_STATE_SKIP_TASKBAR; - ecore_x_netwm_window_state_set(engine_data->x_window, state, 1); - } - } - else - { - if (etk_window_skip_pager_hint_get(window)) - { - Ecore_X_Window_State state[1]; - state[0] = ECORE_X_WINDOW_STATE_SKIP_PAGER; - ecore_x_netwm_window_state_set(engine_data->x_window, state, 1); - } - else - ecore_x_netwm_window_state_set(engine_data->x_window, NULL, 0); - } + _window_netwm_state_active_set(window, ECORE_X_WINDOW_STATE_SKIP_TASKBAR, skip_taskbar_hint); etk_object_notify(ETK_OBJECT(window), "skip_taskbar"); } @@ -390,42 +374,12 @@ } /* Sets whether or not the window should appear in the pager */ -/* TODO: maybe there is a better way to do this? */ static void _window_skip_pager_hint_set(Etk_Window *window, Etk_Bool skip_pager_hint) { - Etk_Engine_Window_Data *engine_data; - - if (!window || skip_pager_hint == etk_window_skip_pager_hint_get(window)) + if (!window) return; - engine_data = window->engine_data; - if (skip_pager_hint) - { - if (etk_window_skip_taskbar_hint_get(window)) - { - Ecore_X_Window_State states[2]; - states[0] = ECORE_X_WINDOW_STATE_SKIP_TASKBAR; - states[1] = ECORE_X_WINDOW_STATE_SKIP_PAGER; - ecore_x_netwm_window_state_set(engine_data->x_window, states, 2); - } - else - { - Ecore_X_Window_State state[1]; - state[0] = ECORE_X_WINDOW_STATE_SKIP_PAGER; - ecore_x_netwm_window_state_set(engine_data->x_window, state, 1); - } - } - else - { - if (etk_window_skip_taskbar_hint_get(window)) - { - Ecore_X_Window_State state[1]; - state[0] = ECORE_X_WINDOW_STATE_SKIP_TASKBAR; - ecore_x_netwm_window_state_set(engine_data->x_window, state, 1); - } - else - ecore_x_netwm_window_state_set(engine_data->x_window, NULL, 0); - } + _window_netwm_state_active_set(window, ECORE_X_WINDOW_STATE_SKIP_PAGER, skip_pager_hint); etk_object_notify(ETK_OBJECT(window), "skip_pager"); } @@ -526,19 +480,30 @@ if (_popup_window_input_window == 0) { - Ecore_X_Window root, parent; + Ecore_X_Window root, win; int root_x, root_y, root_w, root_h; + int mx, my; + + /* Release all the buttons of the mouse */ + ecore_x_pointer_last_xy_get(&mx, &my); + if ((win = ecore_x_window_at_xy_get(mx, my)) != 0) + { + int i; + + ecore_x_pointer_xy_get(win, &mx, &my); + for (i = 1; i <= 32; i++) + ecore_x_mouse_up_send(win, mx, my, i); + } + /* Create the input window */ root = engine_data->x_window; - - while ((parent = ecore_x_window_parent_get(root)) != 0) - root = parent; + while ((win = ecore_x_window_parent_get(root)) != 0) + root = win; ecore_x_window_geometry_get(root, &root_x, &root_y, &root_w, &root_h); _popup_window_input_window = ecore_x_window_input_new(root, root_x, root_y, root_w, root_h); ecore_x_window_show(_popup_window_input_window); - /* TODO: fixme pointer_grab!! */ - /* ecore_x_pointer_confine_grab(_popup_window_input_window); */ + ecore_x_pointer_confine_grab(_popup_window_input_window); ecore_x_keyboard_grab(_popup_window_input_window); } _popup_window_popped_windows = evas_list_append(_popup_window_popped_windows, popup_window); @@ -551,8 +516,7 @@ if (!_popup_window_popped_windows) { - /* TODO: FIXME: pointer ungrab */ - /* ecore_x_pointer_ungrab(); */ + ecore_x_pointer_ungrab(); ecore_x_keyboard_ungrab(); ecore_x_window_del(_popup_window_input_window); _popup_window_input_window = 0; @@ -609,6 +573,62 @@ /************************** * + * Etk_Selection's functions + * + **************************/ + +/* Sets the text of the given selection */ +static void _selection_text_set(Etk_Selection_Type selection, const char *text) +{ + int len; + Ecore_X_Window win; + + if (!text) + return; + + win = ecore_x_window_root_first_get(); + len = strlen(text) + 1; + if (selection == ETK_SELECTION_PRIMARY) + ecore_x_selection_primary_set(win, text, len); + else if (selection == ETK_SELECTION_SECONDARY) + ecore_x_selection_secondary_set(win, text, len); + else if (selection == ETK_SELECTION_CLIPBOARD) + ecore_x_selection_clipboard_set(win, text, len); + +} + +/* Requests the text from a selection */ +static void _selection_text_request(Etk_Selection_Type selection, Etk_Widget *target) +{ + Etk_Engine_Window_Data *engine_data; + Etk_Toplevel *toplevel; + + if (!(toplevel = etk_widget_toplevel_parent_get(target)) || !ETK_IS_WINDOW(toplevel)) + return; + + _selection_widget = target; + engine_data = ETK_WINDOW(toplevel)->engine_data; + if (selection == ETK_SELECTION_PRIMARY) + ecore_x_selection_primary_request(engine_data->x_window, ECORE_X_SELECTION_TARGET_UTF8_STRING); + else if (selection == ETK_SELECTION_SECONDARY) + ecore_x_selection_secondary_request(engine_data->x_window, ECORE_X_SELECTION_TARGET_UTF8_STRING); + else if (selection == ETK_SELECTION_CLIPBOARD) + ecore_x_selection_clipboard_request(engine_data->x_window, ECORE_X_SELECTION_TARGET_UTF8_STRING); +} + +/* Clears the given selection */ +static void _selection_clear(Etk_Selection_Type selection) +{ + if (selection == ETK_SELECTION_PRIMARY) + ecore_x_selection_primary_clear(); + else if (selection == ETK_SELECTION_SECONDARY) + ecore_x_selection_secondary_clear(); + else if (selection == ETK_SELECTION_CLIPBOARD) + ecore_x_selection_clipboard_clear(); +} + +/************************** + * * Etk_Drag's functions * **************************/ @@ -645,103 +665,6 @@ /************************** * - * Etk_Dnd's functions - * - **************************/ - -/* TODOC */ -static Etk_Bool _dnd_init() -{ - if (_dnd_handlers) - return ETK_TRUE; - - _dnd_handlers = evas_list_append(_dnd_handlers, ecore_event_handler_add(ECORE_X_EVENT_XDND_ENTER, _dnd_enter_handler, NULL)); - _dnd_handlers = evas_list_append(_dnd_handlers, ecore_event_handler_add(ECORE_X_EVENT_XDND_POSITION, _dnd_position_handler, NULL)); - _dnd_handlers = evas_list_append(_dnd_handlers, ecore_event_handler_add(ECORE_X_EVENT_XDND_DROP, _dnd_drop_handler, NULL)); - _dnd_handlers = evas_list_append(_dnd_handlers, ecore_event_handler_add(ECORE_X_EVENT_XDND_LEAVE, _dnd_leave_handler, NULL)); - _dnd_handlers = evas_list_append(_dnd_handlers, ecore_event_handler_add(ECORE_X_EVENT_SELECTION_NOTIFY, _dnd_selection_handler, NULL)); - _dnd_handlers = evas_list_append(_dnd_handlers, ecore_event_handler_add(ECORE_X_EVENT_XDND_STATUS, _dnd_status_handler, NULL)); - _dnd_handlers = evas_list_append(_dnd_handlers, ecore_event_handler_add(ECORE_X_EVENT_XDND_FINISHED, _dnd_finished_handler, NULL)); - - return ETK_TRUE; -} - -/* TODOC */ -static void _dnd_shutdown() -{ - while (_dnd_handlers) - { - ecore_event_handler_del(_dnd_handlers->data); - _dnd_handlers = evas_list_remove(_dnd_handlers, _dnd_handlers->data); - } -} - -/************************** - * - * Etk_Clipboard's functions - * - **************************/ - -/* TODOC */ -static void _clipboard_text_request(Etk_Widget *widget) -{ - Etk_Engine_Window_Data *engine_data; - Ecore_X_Window win; - - engine_data = ETK_WINDOW(widget->toplevel_parent)->engine_data; - win = engine_data->x_window; - _etk_selection_widget = widget; - ecore_x_selection_clipboard_request(win, ECORE_X_SELECTION_TARGET_UTF8_STRING); -} - -/* TODOC */ -static void _clipboard_text_set(Etk_Widget *widget, const char *text, int length) -{ - Etk_Engine_Window_Data *engine_data; - Ecore_X_Window win; - - engine_data = ETK_WINDOW(widget->toplevel_parent)->engine_data; - win = engine_data->x_window; - ecore_x_selection_clipboard_set(win, (char *)text, length); -} - -/************************** - * - * Etk_Selection's functions - * - **************************/ - -/* TODOC */ -static void _selection_text_request(Etk_Widget *widget) -{ - Etk_Engine_Window_Data *engine_data; - Ecore_X_Window win; - - engine_data = ETK_WINDOW(widget->toplevel_parent)->engine_data; - win = engine_data->x_window; - _etk_selection_widget = widget; - ecore_x_selection_primary_request(win, ECORE_X_SELECTION_TARGET_UTF8_STRING); -} - -/* TODOC */ -static void _selection_text_set(Etk_Widget *widget, const char *text, int length) -{ - Etk_Engine_Window_Data *engine_data; - Ecore_X_Window win; - - engine_data = ETK_WINDOW(widget->toplevel_parent)->engine_data; - win = engine_data->x_window; - ecore_x_selection_primary_set(win, (char *)text, length); -} - -/* TODOC */ -static void _selection_clear() -{ - ecore_x_selection_primary_clear(); -} - -/************************** - * * Callbacks and handlers * **************************/ @@ -839,6 +762,41 @@ return 1; } +/* Called when the content of the selection/clipboard has been received */ +static int _selection_notify_handler_cb(void *data, int type, void *event) +{ + Ecore_X_Event_Selection_Notify *ev; + Ecore_X_Selection_Data *sel_data; + Etk_Selection_Event etk_event; + + if (!_selection_widget) + return 1; + + ev = event; + sel_data = ev->data; + + if (ev->selection == ECORE_X_SELECTION_PRIMARY) + etk_event.from = ETK_SELECTION_PRIMARY; + else if (ev->selection == ECORE_X_SELECTION_SECONDARY) + etk_event.from = ETK_SELECTION_SECONDARY; + else if (ev->selection == ECORE_X_SELECTION_CLIPBOARD) + etk_event.from = ETK_SELECTION_CLIPBOARD; + else + return 1; + + if (sel_data->content == ECORE_X_SELECTION_CONTENT_TEXT) + { + Ecore_X_Selection_Data_Text *text_data = (Ecore_X_Selection_Data_Text *)sel_data; + + etk_event.type = ETK_SELECTION_TEXT; + etk_event.data.text = text_data->text; + + etk_signal_emit_by_name("selection_received", ETK_OBJECT(_selection_widget), NULL, &etk_event); + } + + return 1; +} + /* TODOC */ static int _drag_mouse_up_cb(void *data, int type, void *event) { @@ -850,7 +808,7 @@ ecore_event_handler_del(_drag_mouse_up_handler); ecore_x_dnd_drop(); etk_widget_drag_end(ETK_WIDGET(drag)); - etk_toplevel_widget_pointer_push(etk_widget_toplevel_parent_get(drag->widget), ETK_POINTER_DEFAULT); + etk_toplevel_pointer_push(etk_widget_toplevel_parent_get(drag->widget), ETK_POINTER_DEFAULT); return 1; } @@ -870,7 +828,7 @@ } /* Searchs the container recursively for the widget that accepts xdnd */ -static void _dnd_container_get_widgets_at(Etk_Toplevel_Widget *top, int x, int y, int offx, int offy, Evas_List **list) +static void _dnd_container_get_widgets_at(Etk_Toplevel *top, int x, int y, int offx, int offy, Evas_List **list) { Evas_List *l; @@ -943,7 +901,7 @@ //printf("position!\n"); /* loop top level widgets (windows) */ - for (l = etk_main_toplevel_widgets_get(); l; l = l->next) + for (l = etk_toplevel_widgets_get(); l; l = l->next) { if (!ETK_IS_WINDOW(l->data)) continue; @@ -958,7 +916,7 @@ etk_window_geometry_get(window, &x, &y, NULL, NULL); /* find the widget we want to drop on */ - _dnd_container_get_widgets_at(ETK_TOPLEVEL_WIDGET(window), ev->position.x, ev->position.y, x, y, &children); + _dnd_container_get_widgets_at(ETK_TOPLEVEL(window), ev->position.x, ev->position.y, x, y, &children); /* check if we're leaving a widget */ if (_dnd_widget) @@ -1083,54 +1041,14 @@ static int _dnd_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 - { - /* 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; - - 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; - - case ECORE_X_SELECTION_SECONDARY: - sel = ev->data; - //printf("secondary: %s %s\n", ev->target, sel->data); - break; - case ECORE_X_SELECTION_XDND: if(!strcmp(ev->target, "text/uri-list")) { @@ -1192,50 +1110,6 @@ ecore_x_dnd_send_finished(); break; - - case ECORE_X_SELECTION_CLIPBOARD: - if (!strcmp(ev->target, ECORE_X_SELECTION_TARGET_TARGETS)) - { - /* REDO THIS CODE!!! - - Etk_Event_Selection_Get event; - Etk_Selection_Data_Targets _targets; - - event.content = ETK_SELECTION_CONTENT_TARGETS; - - targets = ev->data; - - _targets.num_targets = targets->num_targets; - _targets.targets = targets->targets; - - //printf("clipboard: %s\n", ev->target); - //for (i = 0; i < targets->num_targets; i++) - // printf("target: %s\n", targets->targets[i]); - - */ - } - else - { - /* 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; - - 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; default: break; @@ -1258,11 +1132,11 @@ if (ev->win != x_window) return 1; if(!ev->will_accept) { - etk_toplevel_widget_pointer_push(etk_widget_toplevel_parent_get(etk_drag_parent_widget_get(ETK_DRAG(_etk_drag_widget))), ETK_POINTER_DEFAULT); + etk_toplevel_pointer_push(etk_widget_toplevel_parent_get(etk_drag_parent_widget_get(ETK_DRAG(_etk_drag_widget))), ETK_POINTER_DEFAULT); return 1; } - etk_toplevel_widget_pointer_push(etk_widget_toplevel_parent_get(etk_drag_parent_widget_get(ETK_DRAG(_etk_drag_widget))), ETK_POINTER_DND_DROP); + etk_toplevel_pointer_push(etk_widget_toplevel_parent_get(etk_drag_parent_widget_get(ETK_DRAG(_etk_drag_widget))), ETK_POINTER_DND_DROP); return 1; } @@ -1281,32 +1155,99 @@ /* Sets whether or not the given netwm state is active */ static void _window_netwm_state_active_set(Etk_Window *window, Ecore_X_Window_State state, Etk_Bool active) { - int num_states; + Etk_Engine_Window_Data *engine_data; + Ecore_Evas *ecore_evas; + + if (!window) + return; + + engine_data = window->engine_data; + ecore_evas = ETK_ENGINE_ECORE_EVAS_WINDOW_DATA(engine_data)->ecore_evas; + if (ecore_evas_visibility_get(ecore_evas)) + { + Ecore_X_Window root, parent; + + root = engine_data->x_window; + while ((parent = ecore_x_window_parent_get(root)) != 0) + root = parent; + + ecore_x_netwm_state_request_send(engine_data->x_window, root, state, -1, active); + } + else + { + int cur_num, new_num; + int i, j; + Ecore_X_Window_State *cur_state, *new_state; + Etk_Bool is_set = ETK_FALSE; + + ecore_x_netwm_window_state_get(engine_data->x_window, &cur_state, &cur_num); + if (cur_state) + { + for (i = 0; i < cur_num; i++) + { + if (cur_state[i] == state) + { + is_set = ETK_TRUE; + break; + } + } + + if (is_set != active) + { + new_num = active ? (cur_num + 1) : (cur_num - 1); + if (new_num > 0) + { + new_state = malloc(new_num * sizeof(Ecore_X_Window_State)); + + for (i = 0, j = 0; i < cur_num; i++) + { + if (cur_state[i] == state) + continue; + + new_state[j] = cur_state[i]; + j++; + } + + if (active) + new_state[new_num - 1] = state; + + ecore_x_netwm_window_state_set(engine_data->x_window, new_state, new_num); + free(new_state); + } + else + ecore_x_netwm_window_state_set(engine_data->x_window, NULL, 0); + } + + free(cur_state); + } + } } /* Gets whether or not the given netwm state is active */ static Etk_Bool _window_netwm_state_active_get(Etk_Window *window, Ecore_X_Window_State state) { - unsigned int num_states, i; - Ecore_X_Window_State *states; + unsigned int num, i; + Ecore_X_Window_State *cur_state; Etk_Engine_Window_Data *engine_data; if (!window) return ETK_FALSE; - engine_data = window->engine_data; - ecore_x_netwm_window_state_get(engine_data->x_window, &states, &num_states); - for (i = 0; i < num_states; i++) + engine_data = window->engine_data; + ecore_x_netwm_window_state_get(engine_data->x_window, &cur_state, &num); + if (cur_state) { - if (states[i] == state) + for (i = 0; i < num; i++) { - free(states); - return ETK_TRUE; + if (cur_state[i] == state) + { + free(cur_state); + return ETK_TRUE; + } } + free(cur_state); } - if (num_states > 0) - free(states); return ETK_FALSE; } ------------------------------------------------------------------------- Take Surveys. Earn Cash. Influence the Future of IT Join SourceForge.net's Techsay panel and you'll get the chance to share your opinions on IT & business topics through brief surveys -- and earn cash http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs