Enlightenment CVS committal Author : dj2 Project : e17 Module : libs/ewl
Dir : e17/libs/ewl/src/lib Modified Files: ewl_context_menu.c ewl_menu.c ewl_menu.h ewl_popup.c ewl_window.c Log Message: - work on the menu/submenu interaction - only reset the grab in the engine if the window requesting has the grab to begin with =================================================================== RCS file: /cvs/e/e17/libs/ewl/src/lib/ewl_context_menu.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -3 -r1.3 -r1.4 --- ewl_context_menu.c 7 Mar 2007 04:21:00 -0000 1.3 +++ ewl_context_menu.c 7 Mar 2007 09:13:51 -0000 1.4 @@ -78,9 +78,7 @@ ewl_container_add_notify_set(EWL_CONTAINER(box), ewl_context_menu_cb_child_add); - /* - * add the callbacks - */ + /* add the callbacks */ ewl_callback_append(w, EWL_CALLBACK_MOUSE_DOWN, ewl_context_menu_cb_mouse_down, NULL); ewl_callback_append(w, EWL_CALLBACK_MOUSE_MOVE, @@ -199,8 +197,17 @@ DENTER_FUNCTION(DLEVEL_STABLE); DCHECK_PARAM_PTR("w", w); DCHECK_TYPE("w", w, EWL_WIDGET_TYPE); - + if (w == ewl_embed_focused_widget_get(EWL_EMBED(w))) { + Ewl_Context_Menu *cm; + + cm = EWL_CONTEXT_MENU(w); + if (cm->open_menu) + { + ewl_menu_collapse(EWL_MENU(cm->open_menu)); + cm->open_menu = NULL; + } + while (EWL_POPUP_IS(w)) { ewl_widget_hide(w); @@ -233,9 +240,9 @@ DCHECK_TYPE("w", w, EWL_WIDGET_TYPE); cm = EWL_CONTEXT_MENU(w); - + if (cm->open_menu) { - ewl_widget_hide(cm->open_menu); + ewl_menu_collapse(EWL_MENU(cm->open_menu)); cm->open_menu = NULL; } @@ -287,8 +294,8 @@ DRETURN(DLEVEL_STABLE); } - else if (cm->open_menu && ewl_context_menu_mouse_feed(cm, - EWL_EMBED(cm->open_menu), ex, ey)) { + else if (cm->open_menu && + ewl_menu_mouse_feed(EWL_MENU(cm->open_menu), ex, ey)) { DRETURN(DLEVEL_STABLE); } else { @@ -329,24 +336,23 @@ DCHECK_TYPE("c", c, EWL_CONTAINER_TYPE); DCHECK_TYPE("w", w, EWL_WIDGET_TYPE); - if (EWL_MENU_ITEM_IS(w)) { + if (ewl_widget_internal_is(w) || !ewl_widget_focusable_get(w)) + DRETURN(DLEVEL_STABLE); + + if (EWL_MENU_IS(w)) { Ewl_Widget *cm; cm = ewl_widget_parent_get(EWL_WIDGET(c)); EWL_MENU_ITEM(w)->inmenu = cm; } - - if (ewl_widget_internal_is(w) || !ewl_widget_focusable_get(w)) - DRETURN(DLEVEL_STABLE); - - ewl_callback_append(w, EWL_CALLBACK_MOUSE_IN, - ewl_context_menu_cb_child_mouse_in, c); - - if (!EWL_MENU_IS(w)) + else ewl_callback_append(w, EWL_CALLBACK_CLICKED, ewl_context_menu_cb_child_clicked, ewl_widget_parent_get(EWL_WIDGET(c))); + ewl_callback_append(w, EWL_CALLBACK_MOUSE_IN, + ewl_context_menu_cb_child_mouse_in, c); + DLEAVE_FUNCTION(DLEVEL_STABLE); } @@ -373,8 +379,9 @@ cm = EWL_CONTEXT_MENU(emb); /* hide the open sub menu */ - if (cm->open_menu) { - ewl_widget_hide(cm->open_menu); + if (cm->open_menu && (cm->open_menu != w)) + { + ewl_menu_collapse(EWL_MENU(cm->open_menu)); cm->open_menu = NULL; } @@ -449,6 +456,9 @@ DENTER_FUNCTION(DLEVEL_STABLE); DCHECK_PARAM_PTR("cm", cm); DCHECK_TYPE("cm", cm, EWL_CONTEXT_MENU_TYPE); + + if (cm == ewl_context_menu_grabber) + DRETURN(DLEVEL_STABLE); if (ewl_context_menu_grabber) ewl_context_menu_grabber_unset(ewl_context_menu_grabber); =================================================================== RCS file: /cvs/e/e17/libs/ewl/src/lib/ewl_menu.c,v retrieving revision 1.45 retrieving revision 1.46 diff -u -3 -r1.45 -r1.46 --- ewl_menu.c 7 Mar 2007 07:24:24 -0000 1.45 +++ ewl_menu.c 7 Mar 2007 09:13:51 -0000 1.46 @@ -115,6 +115,23 @@ } /** + * @param menu: the menu to work with + * @return Returns no value + * @brief Collapses the popup portion of the menu + */ +void +ewl_menu_collapse(Ewl_Menu *menu) +{ + DENTER_FUNCTION(DLEVEL_STABLE); + DCHECK_PARAM_PTR("menu", menu); + DCHECK_TYPE("menu", menu, EWL_MENU_TYPE); + + ewl_widget_hide(menu->popup); + + DLEAVE_FUNCTION(DLEVEL_STABLE); +} + +/** * @internal * @param w: The widget to work with * @param ev_data: UNUSED @@ -216,11 +233,12 @@ ewl_widget_show(menu->popup); ewl_window_raise(EWL_WINDOW(menu->popup)); + if (item->inmenu) { Ewl_Context_Menu *cm; cm = EWL_CONTEXT_MENU(item->inmenu); - cm->open_menu = menu->popup; + cm->open_menu = EWL_WIDGET(menu); } DLEAVE_FUNCTION(DLEVEL_STABLE); @@ -276,5 +294,28 @@ ewl_menu_cb_popup_destroy); DLEAVE_FUNCTION(DLEVEL_STABLE); +} + +int +ewl_menu_mouse_feed(Ewl_Menu *menu, int x, int y) +{ + int emb_x = 0, emb_y = 0, emb_w = 0, emb_h = 0; + + DCHECK_PARAM_PTR_RET("menu", menu, FALSE); + DCHECK_TYPE_RET("menu", menu, EWL_MENU_TYPE, FALSE); + + ewl_embed_window_position_get(EWL_EMBED(menu->popup), &emb_x, &emb_y); + ewl_object_current_size_get(EWL_OBJECT(menu->popup), &emb_w, &emb_h); + + x -= emb_x; + y -= emb_y; + + if ((x > 0) && (y > 0) && (x <= emb_w) && (y <= emb_h)) + { + ewl_embed_mouse_move_feed(EWL_EMBED(menu->popup), x, y, 0); + DRETURN_INT(TRUE, DLEVEL_STABLE); + } + + DRETURN_INT(FALSE, DLEVEL_STABLE); } =================================================================== RCS file: /cvs/e/e17/libs/ewl/src/lib/ewl_menu.h,v retrieving revision 1.28 retrieving revision 1.29 diff -u -3 -r1.28 -r1.29 --- ewl_menu.h 7 Mar 2007 07:24:24 -0000 1.28 +++ ewl_menu.h 7 Mar 2007 09:13:51 -0000 1.29 @@ -74,6 +74,8 @@ void ewl_menu_from_info(Ewl_Menu *menu, Ewl_Menu_Info *info); +void ewl_menu_collapse(Ewl_Menu *menu); + /* * Internally used callbacks, override at your own risk. */ @@ -84,6 +86,8 @@ void ewl_menu_cb_destroy(Ewl_Widget *w, void *ev, void *data); void ewl_menu_cb_popup_destroy(Ewl_Widget *w, void *ev, void *data); void ewl_menu_cb_mouse_move(Ewl_Widget *w, void *ev_data, void *user_data); + +int ewl_menu_mouse_feed(Ewl_Menu *menu, int x, int y); /** * @} =================================================================== RCS file: /cvs/e/e17/libs/ewl/src/lib/ewl_popup.c,v retrieving revision 1.10 retrieving revision 1.11 diff -u -3 -r1.10 -r1.11 --- ewl_popup.c 7 Mar 2007 04:29:17 -0000 1.10 +++ ewl_popup.c 7 Mar 2007 09:13:51 -0000 1.11 @@ -259,6 +259,7 @@ if (ewl_window_keyboard_grab_get(EWL_WINDOW(w))) ewl_window_keyboard_grab_set(EWL_WINDOW(w), TRUE); + DLEAVE_FUNCTION(DLEVEL_STABLE); } =================================================================== RCS file: /cvs/e/e17/libs/ewl/src/lib/ewl_window.c,v retrieving revision 1.73 retrieving revision 1.74 diff -u -3 -r1.73 -r1.74 --- ewl_window.c 12 Feb 2007 13:16:05 -0000 1.73 +++ ewl_window.c 7 Mar 2007 09:13:51 -0000 1.74 @@ -857,7 +857,6 @@ void *user_data __UNUSED__) { Ewl_Window *win; - int grabval; DENTER_FUNCTION(DLEVEL_STABLE); DCHECK_PARAM_PTR("w", w); @@ -866,7 +865,7 @@ win = EWL_WINDOW(w); ewl_engine_keyboard_grab(win); - grabval = ewl_engine_pointer_grab(win); + ewl_engine_pointer_grab(win); DLEAVE_FUNCTION(DLEVEL_STABLE); } ------------------------------------------------------------------------- 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