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

Reply via email to