Enlightenment CVS committal Author : doursse Project : e17 Module : proto
Dir : e17/proto/etk/src/lib Modified Files: etk_popup_window.c Log Message: _etk_popup_window_popped_windows can be NULL =================================================================== RCS file: /cvs/e/e17/proto/etk/src/lib/etk_popup_window.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -3 -r1.1 -r1.2 --- etk_popup_window.c 28 Mar 2006 07:24:57 -0000 1.1 +++ etk_popup_window.c 4 Apr 2006 09:53:32 -0000 1.2 @@ -74,7 +74,7 @@ if (!popup_window_type) { popup_window_type = etk_type_new("Etk_Popup_Window", ETK_WINDOW_TYPE, sizeof(Etk_Popup_Window), ETK_CONSTRUCTOR(_etk_popup_window_constructor), NULL); - + _etk_popup_window_signals[ETK_POPUP_WINDOW_POPPED_UP_SIGNAL] = etk_signal_new("popped_up", popup_window_type, -1, etk_marshaller_VOID__VOID, NULL, NULL); _etk_popup_window_signals[ETK_POPUP_WINDOW_POPPED_DOWN_SIGNAL] = etk_signal_new("popped_down", popup_window_type, -1, etk_marshaller_VOID__VOID, NULL, NULL); } @@ -101,14 +101,14 @@ root = ETK_WINDOW(popup_window)->x_window; while ((parent = ecore_x_window_parent_get(root)) != 0) root = parent; - + ecore_x_window_geometry_get(root, &root_x, &root_y, &root_w, &root_h); _etk_popup_window_input_window = ecore_x_window_input_new(root, root_x, root_y, root_w, root_h); ecore_x_window_show(_etk_popup_window_input_window); /* TODO: fixme pointer_grab!! */ /* ecore_x_pointer_confine_grab(_etk_popup_window_input_window); */ ecore_x_keyboard_grab(_etk_popup_window_input_window); - + _etk_popup_window_key_down_handler = ecore_event_handler_add(ECORE_X_EVENT_KEY_DOWN, _etk_popup_window_key_down_cb, popup_window); _etk_popup_window_key_up_handler = ecore_event_handler_add(ECORE_X_EVENT_KEY_UP, _etk_popup_window_key_up_cb, popup_window); _etk_popup_window_mouse_up_handler = ecore_event_handler_add(ECORE_X_EVENT_MOUSE_BUTTON_UP, _etk_popup_window_mouse_up_cb, popup_window); @@ -116,16 +116,16 @@ _etk_popup_window_popup_timestamp = ecore_x_current_time_get(); } - + etk_window_move(ETK_WINDOW(popup_window), x, y); etk_widget_show(ETK_WIDGET(popup_window)); evas_event_feed_mouse_move(ETK_TOPLEVEL_WIDGET(popup_window)->evas, -100000, -100000, ecore_x_current_time_get(), NULL); evas_event_feed_mouse_in(ETK_TOPLEVEL_WIDGET(popup_window)->evas, ecore_x_current_time_get(), NULL); _etk_popup_window_popped_windows = evas_list_append(_etk_popup_window_popped_windows, popup_window); - + etk_popup_window_focused_window_set(popup_window); _etk_popup_window_slide_timer_update(popup_window); - + etk_signal_emit(_etk_popup_window_signals[ETK_POPUP_WINDOW_POPPED_UP_SIGNAL], ETK_OBJECT(popup_window), NULL); } @@ -147,15 +147,17 @@ */ void etk_popup_window_popdown(Etk_Popup_Window *popup_window) { - Evas_List *l; + Evas_List *l, *last; if (!popup_window || !(l = evas_list_find_list(_etk_popup_window_popped_windows, popup_window))) return; etk_widget_hide(ETK_WIDGET(popup_window)); _etk_popup_window_popped_windows = evas_list_remove_list(_etk_popup_window_popped_windows, l); - etk_popup_window_focused_window_set(ETK_POPUP_WINDOW(evas_list_last(_etk_popup_window_popped_windows))); - + last = evas_list_last(_etk_popup_window_popped_windows); + if (last) + etk_popup_window_focused_window_set(ETK_POPUP_WINDOW(last->data)); + if (!_etk_popup_window_popped_windows) { /* TODO: pointer ungrab, fixme!! */ @@ -163,7 +165,7 @@ ecore_x_keyboard_ungrab(); ecore_x_window_del(_etk_popup_window_input_window); _etk_popup_window_input_window = 0; - + ecore_event_handler_del(_etk_popup_window_key_down_handler); ecore_event_handler_del(_etk_popup_window_key_up_handler); ecore_event_handler_del(_etk_popup_window_mouse_up_handler); @@ -173,7 +175,7 @@ _etk_popup_window_mouse_up_handler = NULL; _etk_popup_window_mouse_move_handler = NULL; } - + etk_signal_emit(_etk_popup_window_signals[ETK_POPUP_WINDOW_POPPED_DOWN_SIGNAL], ETK_OBJECT(popup_window), NULL); } @@ -198,7 +200,7 @@ { if (!popup_window) return; - + etk_window_decorated_set(ETK_WINDOW(popup_window), ETK_FALSE); etk_window_skip_taskbar_hint_set(ETK_WINDOW(popup_window), ETK_TRUE); etk_window_skip_pager_hint_set(ETK_WINDOW(popup_window), ETK_TRUE); @@ -254,12 +256,12 @@ { Etk_Popup_Window *popup_window; Ecore_X_Event_Key_Down *key_event; - + if (!(popup_window = ETK_POPUP_WINDOW(data)) || !(key_event = event) || key_event->win != _etk_popup_window_input_window) return 1; if (!_etk_popup_window_focused_window) return 1; - + evas_event_feed_key_down(ETK_TOPLEVEL_WIDGET(_etk_popup_window_focused_window)->evas, key_event->keyname, key_event->keysymbol, key_event->key_compose, NULL, key_event->time, NULL); return 1; @@ -270,12 +272,12 @@ { Etk_Popup_Window *popup_window; Ecore_X_Event_Key_Up *key_event; - + if (!(popup_window = ETK_POPUP_WINDOW(data)) || !(key_event = event) || key_event->win != _etk_popup_window_input_window) return 1; if (!_etk_popup_window_focused_window) return 1; - + evas_event_feed_key_up(ETK_TOPLEVEL_WIDGET(_etk_popup_window_focused_window)->evas, key_event->keyname, key_event->keysymbol, key_event->key_compose, NULL, key_event->time, NULL); return 1; @@ -291,7 +293,7 @@ Evas_List *l; Ecore_X_Event_Mouse_Button_Up *mouse_event; Etk_Bool pointer_over_window = ETK_FALSE; - + if (!(popup_window = ETK_POPUP_WINDOW(data)) || !(mouse_event = event) || mouse_event->win != _etk_popup_window_input_window) return 1; @@ -299,7 +301,7 @@ for (l = _etk_popup_window_popped_windows; l; l = l->next) { int px, py, pw, ph; - + pwin = ETK_POPUP_WINDOW(l->data); etk_window_geometry_get(ETK_WINDOW(pwin), &px, &py, &pw, &ph); if (_etk_popup_window_mouse_x >= px && _etk_popup_window_mouse_x <= px + pw && _etk_popup_window_mouse_y >= py && _etk_popup_window_mouse_y <= py + ph) @@ -338,11 +340,11 @@ pwin = ETK_POPUP_WINDOW(l->data); etk_window_geometry_get(ETK_WINDOW(pwin), &px, &py, NULL, NULL); evas_event_feed_mouse_move(ETK_TOPLEVEL_WIDGET(pwin)->evas, mouse_event->x - px, mouse_event->y - py, mouse_event->time, NULL); - + /* Start to make the popup window slide if needed */ _etk_popup_window_slide_timer_update(pwin); } - + return 1; } @@ -373,7 +375,7 @@ result |= ETK_POPUP_WINDOW_TOP_EDGE; if (py + ph > ry + rh) result |= ETK_POPUP_WINDOW_BOTTOM_EDGE; - + return result; } @@ -385,7 +387,7 @@ if (_etk_popup_window_input_window == 0) return ETK_POPUP_WINDOW_NO_EDGE; - + ecore_x_window_geometry_get(_etk_popup_window_input_window, &rx, &ry, &rw, &rh); if (_etk_popup_window_mouse_x - rx + 1 >= rw) result |= ETK_POPUP_WINDOW_RIGHT_EDGE; ------------------------------------------------------- This SF.Net email is sponsored by xPML, a groundbreaking scripting language that extends applications into web and mobile media. Attend the live webcast and join the prime developer group breaking into this new coding territory! http://sel.as-us.falkag.net/sel?cmd=lnk&kid=110944&bid=241720&dat=121642 _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs