Enlightenment CVS committal

Author  : handyande
Project : misc
Module  : engage

Dir     : misc/engage/src/module


Modified Files:
        e_mod_main.c e_mod_main.h 


Log Message:
Add mouse wheel support for flicking between apps
Thanks to Ben Rose for the code here :)
Note: if you place a (say) equate on each desktop then mouse-wheeling over the 
equate icon will give you a pretty sweet desktop switch :)
===================================================================
RCS file: /cvsroot/enlightenment/misc/engage/src/module/e_mod_main.c,v
retrieving revision 1.27
retrieving revision 1.28
diff -u -3 -r1.27 -r1.28
--- e_mod_main.c        14 Mar 2005 14:12:33 -0000      1.27
+++ e_mod_main.c        15 Mar 2005 18:28:35 -0000      1.28
@@ -14,6 +14,7 @@
  * * fix mouse overs etc to reach all the sub icons (currently missine ends)
  *
  * * pick up apps on enable (startup OK, disable then enable not)
+ * * When a window gets focus move the selected_app pointer
  * * zoom and unzoom (eb->zoom from 1.0 to conf->zoom_factor) on timer
  * * bounce icons on click ( following e_app exec hints? )
  *
@@ -90,6 +91,7 @@
 static void    _engage_icon_cb_mouse_out(void *data, Evas *e, Evas_Object 
*obj, void *event_info);
 static void    _engage_icon_cb_mouse_down(void *data, Evas *e, Evas_Object 
*obj, void *event_info);
 static void    _engage_icon_cb_mouse_up(void *data, Evas *e, Evas_Object *obj, 
void *event_info);
+static void    _engage_icon_cb_mouse_wheel(void *data, Evas *e, Evas_Object 
*obj, void *event_info);
 
 #if 0
 static void    _engage_icon_reorder_before(Engage_Icon *ic, Engage_Icon 
*before);
@@ -660,6 +662,7 @@
    ic->app = a;
    ic->scale = 1.0;
    ic->temp = 0;
+   ic->selected_app = NULL;
    e_object_ref(E_OBJECT(a));
    eb->icons = evas_list_append(eb->icons, ic);
 
@@ -673,6 +676,7 @@
    evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_OUT, 
_engage_icon_cb_mouse_out, ic);
    evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_DOWN, 
_engage_icon_cb_mouse_down, ic);
    evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_UP, 
_engage_icon_cb_mouse_up, ic);
+   evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_WHEEL, 
_engage_icon_cb_mouse_wheel, ic);
    evas_object_show(o);
 
    o = edje_object_add(eb->evas);
@@ -810,6 +814,21 @@
 static void
 _engage_app_icon_free(Engage_App_Icon *ai)
 {
+  // If this app_icon is selected_app, then try to make next the
+   // selected_app, then the previous, or make it null if was only app.
+   if(ai->ic->selected_app)
+     {
+       if(ai->ic->selected_app->data == ai)
+        {
+          if(ai->ic->selected_app->next)
+            ai->ic->selected_app = ai->ic->selected_app->next;
+          else if(ai->ic->selected_app->prev)
+            ai->ic->selected_app = ai->ic->selected_app->prev;
+          else
+            ai->ic->selected_app = NULL;
+        }
+     }
+
    ai->ic->extra_icons = evas_list_remove(ai->ic->extra_icons, ai);
    if (ai->bg_object) evas_object_del(ai->bg_object);
    if (ai->overlay_object) evas_object_del(ai->overlay_object);
@@ -1395,13 +1414,46 @@
               }
             else
               {
-                 arc = ((2 * M_PI) / 3) / (evas_list_count(icon->extra_icons) 
- 1);
+                 int i = 0, selected_pos = 0, app_cnt;
+
+                 app_cnt = evas_list_count(icon->extra_icons);
+
+                 extras = icon->extra_icons;
+
+                 // if first time through, then set to first app
+                 if(!icon->selected_app)
+                   icon->selected_app = icon->extra_icons;
+
+                 // get the position we are currently in
+                 while(extras)
+                   {
+                     if(icon->selected_app == extras)
+                       break;
+
+                     selected_pos++;
+                     extras = extras->next;
+                   }
+
+                 // divide the 120 degrees of a circle into the proper number 
of
+                 // divisions to make it possible to rotate the app icons 
around
+                 // in their 60 degree arc
+                 arc = ((2 * M_PI) / 3) / (app_cnt * 2 - 2);
                  theta = (-2 * M_PI) / 6;
- 
-                 for (extras = icon->extra_icons; extras; extras = 
extras->next)
+
+                 // start at back of list so that the app_icon for the 
+                 // first item will be placed directly above the main engage 
icon
+                 extras = evas_list_last(icon->extra_icons);
+
+                 // loop through twice as many times (-1) times the number of 
apps
+                 // so that we have the proper number of places to put icons
+                 while(i < app_cnt * 2 - 1)
                    {
                       Engage_App_Icon *ai;
-                      Evas_Coord x, y;
+                      Evas_Coord x, y, ax, ay;
+
+                      // if we've placed all the icons, then break
+                      if(!extras)
+                        break;
 
                       ai = extras->data;
                       x = radius * sin(theta);
@@ -1410,16 +1462,44 @@
                       evas_object_resize(ai->bg_object, app_size, app_size);
 
                       if (edge == E_GADMAN_EDGE_LEFT)
-                        evas_object_move(ai->bg_object, cx + y - halfapp_size, 
cy + x - halfapp_size);
+                        {
+                          ax = cx + y - halfapp_size;
+                          ay = cy + x - halfapp_size;
+                        }
                       else if (edge == E_GADMAN_EDGE_RIGHT)
-                        evas_object_move(ai->bg_object, cx - y - halfapp_size, 
cy - x - halfapp_size);
+                        {
+                          ax = cx - y - halfapp_size;
+                          ay = cy - x - halfapp_size;
+                        }           
                       else if (edge == E_GADMAN_EDGE_TOP)
-                        evas_object_move(ai->bg_object, cx + x - halfapp_size, 
cy + y - halfapp_size);
+                        {
+                          ax = cx + x - halfapp_size;
+                          ay = cy + y - halfapp_size;
+                        }
                       else
-                        evas_object_move(ai->bg_object, cx - x - halfapp_size, 
cy - y - halfapp_size);
-
-                      evas_object_show(ai->bg_object);
-                      theta += arc;
+                        {
+                          ax = cx - x - halfapp_size;
+                          ay = cy - y - halfapp_size;
+                        }
+                        
+                      // if we are currently in a position that is above the 
number of
+                      // the currently selected app icon but is not past the 
slots where 
+                      // we place the app icons
+                      if(i >= selected_pos && i <= app_cnt + selected_pos)
+                        {
+                          evas_object_move(ai->bg_object, ax, ay);
+                          evas_object_show(ai->bg_object);
+                              
+                          // raise the app icon we are on above the others
+                          if(x == 0)
+                            evas_object_layer_set(ai->bg_object, 1);
+                          else
+                            evas_object_layer_set(ai->bg_object, 0);
+
+                          extras = extras->prev;
+                        }                     
+                      theta += arc;
+                      i++;
                    }
               }
          }
@@ -1660,6 +1740,52 @@
 }
 
 static void
+_engage_icon_cb_mouse_wheel(void *data, Evas *e, Evas_Object *obj, void 
*event_info)
+{
+  Evas_Event_Mouse_Wheel *ev;
+  Engage_Icon *ic;
+  Engage_App_Icon *ai;
+  
+  ev = event_info;
+  ic = data;
+
+  if(!ic->extra_icons)
+    return;
+
+  if(ev->z > 0) // Wheel Down, traverse clockwise
+    {
+      if(!ic->selected_app)
+       ic->selected_app = ic->extra_icons;
+      else
+       {
+         if(ic->selected_app->next)
+           ic->selected_app = ic->selected_app->next;
+       }
+    }
+  else // Wheel Up, traverse counterclockwise
+    {
+      if(!ic->selected_app)
+       ic->selected_app = evas_list_last(ic->extra_icons);
+      else
+       {
+         if(ic->selected_app->prev)
+           ic->selected_app = ic->selected_app->prev;
+       }
+    }
+  
+   ai = ic->selected_app->data;
+   edje_object_signal_emit(ai->bg_object, "start", "");
+   edje_object_signal_emit(ai->overlay_object, "start", "");
+   if (ai->min)
+     e_border_uniconify(ai->border);
+   e_border_raise(ai->border);
+   e_desk_show(ai->border->desk);
+
+   _engage_bar_motion_handle(ic->eb, ev->canvas.x, ev->canvas.y);
+}
+
+
+static void
 _engage_bar_cb_mouse_in(void *data, Evas *e, Evas_Object *obj, void 
*event_info)
 {
    Evas_Event_Mouse_In *ev;
===================================================================
RCS file: /cvsroot/enlightenment/misc/engage/src/module/e_mod_main.h,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -3 -r1.7 -r1.8
--- e_mod_main.h        14 Mar 2005 14:12:34 -0000      1.7
+++ e_mod_main.h        15 Mar 2005 18:28:35 -0000      1.8
@@ -77,7 +77,7 @@
    Evas_Object   *overlay_object;
    Evas_Object   *icon_object;
    Evas_Object   *event_object;
-   Evas_List     *extra_icons;
+   Evas_List     *extra_icons, *selected_app;
 
    double         scale;
    int            temp;




-------------------------------------------------------
SF email is sponsored by - The IT Product Guide
Read honest & candid reviews on hundreds of IT Products from real users.
Discover which products truly live up to the hype. Start reading now.
http://ads.osdn.com/?ad_id=6595&alloc_id=14396&op=click
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to