Enlightenment CVS committal

Author  : lordchaos
Project : e17
Module  : libs/ewl

Dir     : e17/libs/ewl/src/lib


Modified Files:
        ewl_menu.c ewl_menu.h ewl_menubar.c ewl_menubar.h 


Log Message:
* Menu-active-mouseover-activate.  Menus behave more realistically now.

===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/ewl/src/lib/ewl_menu.c,v
retrieving revision 1.19
retrieving revision 1.20
diff -u -3 -r1.19 -r1.20
--- ewl_menu.c  17 Dec 2005 21:40:53 -0000      1.19
+++ ewl_menu.c  7 Jan 2006 06:45:23 -0000       1.20
@@ -3,6 +3,7 @@
 #include "ewl_macros.h"
 #include "ewl_private.h"
 
+
 /**
  * @param image: the image icon to use for this menu
  * @param title: the text to place in the menu
@@ -49,6 +50,9 @@
 
        ewl_widget_inherit(EWL_WIDGET(menu), "menu");
 
+       ewl_callback_append(EWL_WIDGET(menu), EWL_CALLBACK_MOUSE_MOVE,
+                           ewl_menu_expand_mouse_move_cb, NULL);
+
        ewl_callback_append(EWL_WIDGET(menu), EWL_CALLBACK_FOCUS_IN,
                            ewl_menu_expand_cb, NULL);
        ewl_callback_append(EWL_WIDGET(menu), EWL_CALLBACK_REALIZE,
@@ -56,6 +60,8 @@
        ewl_callback_append(EWL_WIDGET(menu), EWL_CALLBACK_CONFIGURE,
                            ewl_menu_configure_cb, NULL);
 
+       menu->menubar_parent = NULL;
+
        /*
         * Create the popup menu portion of the widget.
         */
@@ -63,8 +69,7 @@
        ewl_window_keyboard_grab_set(EWL_WINDOW(menu->base.popup), TRUE);
        ewl_window_pointer_grab_set(EWL_WINDOW(menu->base.popup), TRUE);
        
-       /*Turn this off until we can figure out why this stops windows being 
moved*/
-       /*ewl_window_override_set(EWL_WINDOW(menu->base.popup), TRUE); */
+       ewl_window_override_set(EWL_WINDOW(menu->base.popup), TRUE); 
        ewl_window_borderless_set(EWL_WINDOW(menu->base.popup));
        ewl_widget_internal_set(menu->base.popup, TRUE);
        ewl_widget_appearance_set(EWL_WIDGET(menu->base.popup), "menu");
@@ -73,7 +78,11 @@
        ewl_object_alignment_set(EWL_OBJECT(menu->base.popup),
                                 EWL_FLAG_ALIGN_LEFT | EWL_FLAG_ALIGN_TOP);
        ewl_callback_append(menu->base.popup, EWL_CALLBACK_MOUSE_DOWN,
-                           ewl_menu_hide_cb, NULL);
+                           ewl_menu_hide_cb, menu);
+
+       ewl_callback_append(menu->base.popup, EWL_CALLBACK_MOUSE_MOVE,
+                               ewl_menu_mouse_move_cb, menu);
+                           
        ewl_callback_prepend(menu->base.popup, EWL_CALLBACK_DESTROY,
                                ewl_menu_popup_destroy_cb, menu);
 
@@ -128,6 +137,46 @@
        DLEAVE_FUNCTION(DLEVEL_STABLE);
 }
 
+
+void
+ewl_menu_expand_mouse_move_cb(Ewl_Widget *w, void *ev_data __UNUSED__,
+                                       void *user_data __UNUSED__) 
+{
+       Ewl_Menu* menu;
+       
+       DENTER_FUNCTION(DLEVEL_STABLE);
+       DCHECK_PARAM_PTR("w", w);
+       DCHECK_TYPE("w", w, "widget");
+       
+       menu= EWL_MENU(w);
+                                       
+       if (menu->menubar_parent) {
+               Ewl_Menu* sub;
+               int vis=0;
+               Ewl_Menu* hide_menu = NULL;
+               Ewl_Menubar* bar = EWL_MENUBAR(menu->menubar_parent);
+               ewl_container_child_iterate_begin(EWL_CONTAINER(bar));
+
+               while ( (sub = 
EWL_MENU(ewl_container_child_next(EWL_CONTAINER(bar))))) {
+                       if (sub != EWL_MENU(w) && sub->base.popup && 
+                         VISIBLE(sub->base.popup)) {
+                               hide_menu = sub;
+                               vis++;
+                               break;
+                       }
+               }
+
+               if (vis && hide_menu) {
+                       ewl_widget_hide(hide_menu->base.popup);
+                       ewl_callback_call(w, EWL_CALLBACK_FOCUS_IN);
+               }
+       }
+
+       DLEAVE_FUNCTION(DLEVEL_STABLE);
+}
+
+
+
 void
 ewl_menu_expand_cb(Ewl_Widget *w, void *ev_data __UNUSED__,
                                        void *user_data __UNUSED__)
@@ -139,6 +188,7 @@
        DCHECK_TYPE("w", w, "widget");
 
        menu = EWL_MENU(w);
+       
        ewl_widget_show(menu->base.popup);
        ewl_window_raise(EWL_WINDOW(menu->base.popup));
 
@@ -178,15 +228,45 @@
 }
 
 void
+ewl_menu_mouse_move_cb(Ewl_Widget *w, void *ev_data, void *user_data) 
+{
+
+       Ewl_Event_Mouse_Move* ev;
+       Ewl_Menu* menu;
+       Ewl_Embed* embed;
+       int wx, wy;
+       int x, y;
+
+       DENTER_FUNCTION(DLEVEL_STABLE);
+       DCHECK_PARAM_PTR("w", w);
+       DCHECK_TYPE("w", w, "widget");
+       DCHECK_TYPE("user_data", user_data, "menu");
+
+       ev = ev_data;
+       menu = EWL_MENU(user_data);
+       
+       embed = ewl_embed_widget_find(EWL_WIDGET(menu)->parent);
+       ewl_window_position_get(EWL_WINDOW(embed), &wx, &wy);
+       ewl_window_position_get(EWL_WINDOW(menu->base.popup), &x, &y);
+       
+       if (menu->menubar_parent) {
+               ewl_embed_mouse_move_feed(embed, ev->x+x - wx, ev->y+y - wy,0);
+       }
+}
+
+
+void
 ewl_menu_hide_cb(Ewl_Widget *w, void *ev_data __UNUSED__,
-                                       void *user_data __UNUSED__)
+                                       void *user_data )
 {
        DENTER_FUNCTION(DLEVEL_STABLE);
        DCHECK_PARAM_PTR("w", w);
        DCHECK_TYPE("w", w, "widget");
 
-       if (w == ewl_embed_focused_widget_get(EWL_EMBED(w)))
+       if (w == ewl_embed_focused_widget_get(EWL_EMBED(w))) {
                ewl_widget_hide(w);
+               
+       }
 
        DLEAVE_FUNCTION(DLEVEL_STABLE);
 }
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/ewl/src/lib/ewl_menu.h,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -3 -r1.7 -r1.8
--- ewl_menu.h  17 Dec 2005 21:40:53 -0000      1.7
+++ ewl_menu.h  7 Jan 2006 06:45:23 -0000       1.8
@@ -36,6 +36,8 @@
        Ewl_Menu_Base  base;
         int            popup_x;
         int            popup_y;
+
+       Ewl_Widget* menubar_parent;
 };
 
 Ewl_Widget     *ewl_menu_new(void);
@@ -50,6 +52,9 @@
 void ewl_menu_popup_move_cb(Ewl_Widget *w, void *ev_data, void *user_data);
 void ewl_menu_hide_cb(Ewl_Widget *w, void *ev_data, void *user_data);
 void ewl_menu_popup_destroy_cb(Ewl_Widget *w, void *ev, void *data);
+void ewl_menu_expand_mouse_move_cb(Ewl_Widget *w, void *ev_data, void 
*user_data);
+void ewl_menu_mouse_move_cb(Ewl_Widget *w, void *ev_data, void *user_data);
+
 
 /**
  * @}
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/ewl/src/lib/ewl_menubar.c,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -3 -r1.7 -r1.8
--- ewl_menubar.c       24 Oct 2005 04:39:57 -0000      1.7
+++ ewl_menubar.c       7 Jan 2006 06:45:23 -0000       1.8
@@ -92,6 +92,10 @@
        ewl_container_redirect_set(EWL_CONTAINER(mb),
                                        EWL_CONTAINER(mb->inner_box));
 
+       ewl_container_add_notify_set(EWL_CONTAINER(mb->inner_box),
+                               ewl_menubar_cb_child_add);
+
+
        ewl_menubar_orientation_set(mb, EWL_ORIENTATION_HORIZONTAL);
 
 
@@ -145,3 +149,22 @@
        DRETURN_INT(ewl_box_orientation_get(EWL_BOX(mb)), DLEVEL_STABLE);
 }
 
+
+void
+ewl_menubar_cb_child_add(Ewl_Container *c, Ewl_Widget *w)
+{
+       Ewl_Menubar *mb;
+
+       DENTER_FUNCTION(DLEVEL_STABLE);
+       DCHECK_PARAM_PTR("c", c);
+       DCHECK_PARAM_PTR("w", w);
+       DCHECK_TYPE("c", c, "container");
+       DCHECK_TYPE("w", w, "widget");
+
+       mb = EWL_MENUBAR(c);
+       if (ewl_widget_type_is(w,"menu")) 
+               EWL_MENU(w)->menubar_parent = EWL_WIDGET(mb);
+
+       DLEAVE_FUNCTION(DLEVEL_STABLE);
+
+}
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/ewl/src/lib/ewl_menubar.h,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -3 -r1.5 -r1.6
--- ewl_menubar.h       24 Oct 2005 04:39:57 -0000      1.5
+++ ewl_menubar.h       7 Jan 2006 06:45:23 -0000       1.6
@@ -43,6 +43,8 @@
 void            ewl_menubar_orientation_set(Ewl_Menubar *mb, Ewl_Orientation 
o);
 Ewl_Orientation         ewl_menubar_orientation_get(Ewl_Menubar *mb);
 
+void           ewl_menubar_cb_child_add(Ewl_Container *c, Ewl_Widget *w);
+
 /**
   * @}
   */




-------------------------------------------------------
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://ads.osdn.com/?ad_id=7637&alloc_id=16865&op=click
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to