itray is a little nicer
authorCarsten Haitzler <raster@rasterman.com>
Wed, 1 Feb 2006 09:36:56 +0000 (09:36 +0000)
committerCarsten Haitzler <raster@rasterman.com>
Wed, 1 Feb 2006 09:36:56 +0000 (09:36 +0000)
SVN revision: 20165

src/modules/itray/e_mod_config.c
src/modules/itray/e_mod_main.c
src/modules/itray/e_mod_main.h

index de69e65..2db50a3 100644 (file)
@@ -8,13 +8,8 @@ typedef struct _Cfg_File_Data Cfg_File_Data;
 
 struct _cfdata
 {
-   int follower;
    int rowsize;
-   double follow_speed;
    int allow_overlap;
-/*    double autoscroll_speed;
- *    int autofit;
- */
 };
 
 struct _Cfg_File_Data
@@ -55,12 +50,7 @@ _config_itray_module(E_Container *con, ITray *itray)
 static void 
 _fill_data(ITray *ib, CFData *cfdata)
 {
-/*    cfdata->autofit = (ib->conf->width == ITRAY_WIDTH_AUTO);
- *    cfdata->autoscroll_speed = ib->conf->autoscroll_speed;
- */
-   cfdata->follower = ib->conf->follower;
    cfdata->rowsize = ib->conf->rowsize;
-   cfdata->follow_speed = ib->conf->follow_speed;
    cfdata->allow_overlap = ib->conf->allow_overlap;
 }
 
@@ -96,11 +86,6 @@ _basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, CFData *cfdata)
    _fill_data(ib, cfdata);
 
    o = e_widget_list_add(evas, 0, 0);
-   ob = e_widget_check_add(evas, _("Show Follower"), &(cfdata->follower));
-   e_widget_list_object_append(o, ob, 1, 1, 0.5);
-/*    ob = e_widget_check_add(evas, _("Auto Fit Icons"), &(cfdata->autofit));
- *    e_widget_list_object_append(o, ob, 1, 1, 0.5);
- */
    
    of = e_widget_framelist_add(evas, _("Extras"), 0);
    ob = e_widget_check_add(evas, _("Allow windows to overlap this gadget"), &(cfdata->allow_overlap));
@@ -116,25 +101,10 @@ _basic_apply_data(E_Config_Dialog *cfd, CFData *cfdata)
    ITray *ib;
    
    ib = cfd->data;
-   if ((cfdata->follower) && (!ib->conf->follower)) 
-     ib->conf->follower = 1;
-   else if (!(cfdata->follower) && (ib->conf->follower)) 
-     ib->conf->follower = 0;
-
    if (cfdata->allow_overlap && !ib->conf->allow_overlap)
      ib->conf->allow_overlap = 1;
    else if (!cfdata->allow_overlap && ib->conf->allow_overlap)
      ib->conf->allow_overlap = 0;
-   
-/*    if ((cfdata->autofit) && (ib->conf->width == ITRAY_WIDTH_FIXED)) 
- *      {
- *     ib->conf->width = ITRAY_WIDTH_AUTO;
- *      }
- *    else if (!(cfdata->autofit) && (ib->conf->width == ITRAY_WIDTH_AUTO)) 
- *      {
- *     ib->conf->width = ITRAY_WIDTH_FIXED;
- *      }
- */
    e_config_save_queue();
 
    _itray_box_cb_config_updated(ib);
@@ -152,29 +122,10 @@ _advanced_create_widgets(E_Config_Dialog *cfd, Evas *evas, CFData *cfdata)
 
    o = e_widget_list_add(evas, 0, 0);
    
-   of = e_widget_framelist_add(evas, _("Follower"), 0);
-   ob = e_widget_check_add(evas, _("Visible"), &(cfdata->follower));
-   e_widget_framelist_object_append(of, ob);
-   ob = e_widget_label_add(evas, _("Follow Speed"));
-   e_widget_framelist_object_append(of, ob);
-   ob = e_widget_slider_add(evas, 1, 0, _("%1.2f px/s"), 0.0, 1.0, 0.01, 0,  &(cfdata->follow_speed), NULL,200);
-   e_widget_framelist_object_append(of, ob);
-   e_widget_list_object_append(o, of, 1, 1, 0.5);
-
    of = e_widget_framelist_add(evas, _("Number of Rows"), 0);
    ob = e_widget_slider_add(evas, 1, 0, _("%3.0f"), 1.0, 6.0, 1.0, 0,  NULL, &(cfdata->rowsize), 200);
    e_widget_framelist_object_append(of, ob);
    e_widget_list_object_append(o, of, 1, 1, 0.5);
-      
-/*    of = e_widget_framelist_add(evas, _("Width"), 0);
- *    ob = e_widget_check_add(evas, _("Auto Fit"), &(cfdata->autofit));
- *    e_widget_framelist_object_append(of, ob);
- *    ob = e_widget_label_add(evas, _("Autoscroll Speed:"));
- *    e_widget_framelist_object_append(of, ob);
- *    ob = e_widget_slider_add(evas, 1, 0, _("%1.2f px/s"), 0.0, 1.0, 0.01, 0,  &(cfdata->autoscroll_speed), NULL,200);
- *    e_widget_framelist_object_append(of, ob);
- *    e_widget_list_object_append(o, of, 1, 1, 0.5);
- */
    
    of = e_widget_framelist_add(evas, _("Extras"), 0);
    ob = e_widget_check_add(evas, _("Allow windows to overlap this gadget"), &(cfdata->allow_overlap));
@@ -191,46 +142,14 @@ _advanced_apply_data(E_Config_Dialog *cfd, CFData *cfdata)
    
    ib = cfd->data;
    e_border_button_bindings_ungrab_all();
-   if ((cfdata->follower) && (!ib->conf->follower)) 
-     {
-       ib->conf->follower = 1;
-     }
-   else if (!(cfdata->follower) && (ib->conf->follower)) 
-     {
-       ib->conf->follower = 0;
-     }
-   
-/*    if ((cfdata->autofit) && (ib->conf->width == ITRAY_WIDTH_FIXED)) 
- *      {
- *     ib->conf->width = ITRAY_WIDTH_AUTO;
- *      }
- *    else if (!(cfdata->autofit) && (ib->conf->width == ITRAY_WIDTH_AUTO)) 
- *      {
- *     ib->conf->width = ITRAY_WIDTH_FIXED;
- *      }
- */
-
    if (cfdata->rowsize != ib->conf->rowsize) 
      {
        ib->conf->rowsize = cfdata->rowsize;
      }
-   if (cfdata->follow_speed != ib->conf->follow_speed) 
-     { 
-       ib->conf->follow_speed = cfdata->follow_speed;
-     }
-   
    if (cfdata->allow_overlap && !ib->conf->allow_overlap)
      ib->conf->allow_overlap = 1;
    else if (!cfdata->allow_overlap && ib->conf->allow_overlap)
      ib->conf->allow_overlap = 0;
-   
-   
-/*    if (cfdata->autoscroll_speed != ib->conf->autoscroll_speed) 
- *      {
- *     ib->conf->autoscroll_speed = cfdata->autoscroll_speed;
- *      }
- */
-   
    e_border_button_bindings_grab_all();
    e_config_save_queue();
 
index 574fbed..dfbe17c 100644 (file)
@@ -27,7 +27,6 @@
  *
  * Changing the number of rows breaks the layout.
  *     It's magically fixed when the module is moved.
- * Remove the follower code, or make it work on top of the tray icons.
  *
  * TODO List:
  * 
@@ -64,9 +63,6 @@ static void    _itray_box_disable(ITray_Box *itb);
 static void    _itray_box_frame_resize(ITray_Box *itb);
 static void    _itray_box_edge_change(ITray_Box *itb, int edge);
 static void    _itray_box_update_policy(ITray_Box *itb);
-static void    _itray_box_motion_handle(ITray_Box *itb, Evas_Coord mx, Evas_Coord my);
-static void    _itray_box_timer_handle(ITray_Box *itb);
-static void    _itray_box_follower_reset(ITray_Box *itb);
 
 static void    _itray_box_cb_gmc_change(void *data, E_Gadman_Client *gmc, E_Gadman_Change change);
 static void    _itray_box_cb_mouse_in(void *data, Evas *e, Evas_Object *obj, void *event_info);
@@ -75,16 +71,11 @@ static void    _itray_box_cb_mouse_down(void *data, Evas *e, Evas_Object *obj, v
 static void    _itray_box_cb_mouse_up(void *data, Evas *e, Evas_Object *obj, void *event_info);
 static void    _itray_box_cb_mouse_move(void *data, Evas *e, Evas_Object *obj, void *event_info);
 
-/* Follower */
-static int     _itray_box_cb_timer(void *data);
-static int     _itray_box_cb_animator(void *data);
-
 static void    _itray_box_cb_menu_configure(void *data, E_Menu *m, E_Menu_Item *mi);
 static void    _itray_box_cb_menu_edit(void *data, E_Menu *m, E_Menu_Item *mi);
 
 /* Config Updated Function Protos */
 static void    _itray_box_cb_width_auto(void *data);
-static void    _itray_box_cb_follower(void *data);
 
 /* Tray */
 static void    _itray_tray_init(ITray_Box *itb);
@@ -92,6 +83,10 @@ static void    _itray_tray_shutdown(ITray_Box *itb);
 static int     _itray_tray_cb_msg(void *data, int type, void *event);
 static void    _itray_tray_active_set();
 
+static void    _itray_tray_add(ITray_Box *itb, Ecore_X_Window win);
+static void    _itray_tray_remove(ITray_Box *itb, Ecore_X_Window win);
+static int     _itray_tray_cb_msg(void *data, int type, void *event);
+
 static void    _itray_tray_cb_move(void *data, Evas_Object *o, Evas_Coord x, Evas_Coord y);
 static void    _itray_tray_cb_resize(void *data, Evas_Object *o, Evas_Coord w, Evas_Coord h);
 
@@ -212,9 +207,6 @@ _itray_new()
 #undef D
 #define T Config
 #define D conf_edd
-   E_CONFIG_VAL(D, T, follower, INT);
-   E_CONFIG_VAL(D, T, follow_speed, DOUBLE);
-   E_CONFIG_VAL(D, T, autoscroll_speed, DOUBLE);
    E_CONFIG_VAL(D, T, rowsize, INT);
    E_CONFIG_VAL(D, T, width, INT);
    E_CONFIG_LIST(D, T, boxes, conf_box_edd);
@@ -223,14 +215,9 @@ _itray_new()
    if (!it->conf)
      {
        it->conf = E_NEW(Config, 1);
-       it->conf->follower = 1;
-       it->conf->follow_speed = 0.9;
-       it->conf->autoscroll_speed = 0.95;
        it->conf->rowsize = 1;
        it->conf->width = ITRAY_WIDTH_AUTO;
      }
-   E_CONFIG_LIMIT(it->conf->follow_speed, 0.01, 1.0);
-   E_CONFIG_LIMIT(it->conf->autoscroll_speed, 0.01, 1.0);
    E_CONFIG_LIMIT(it->conf->rowsize, 1, 6);
    E_CONFIG_LIMIT(it->conf->width, -2, -1);
 
@@ -326,16 +313,6 @@ _itray_box_new(ITray *it, E_Container *con)
                           "modules/itray/main");
    evas_object_show(o);
 
-   if (itb->itray->conf->follower)
-     {
-       o = edje_object_add(itb->evas);
-       itb->overlay_object = o;
-       evas_object_layer_set(o, 1);
-       e_theme_edje_object_set(o, "base/theme/modules/itray",
-                               "modules/itray/follower");
-       evas_object_show(o);
-     }
-
    o = evas_object_rectangle_add(itb->evas);
    itb->event_object = o;
    evas_object_layer_set(o, 2);
@@ -355,8 +332,6 @@ _itray_box_new(ITray *it, E_Container *con)
    edje_object_part_swallow(itb->box_object, "tray", o);
    evas_object_show(o);
 
-   itb->align_req = 0.5;
-   itb->align = 0.5;
    e_box_align_set(itb->item_object, 0.5, 0.5);
 
    evas_object_resize(itb->box_object, 1000, 1000);
@@ -389,12 +364,6 @@ _itray_box_new(ITray *it, E_Container *con)
    /* We need to resize, if the width is auto and the number
     * of apps has changed since last startup */
    _itray_box_frame_resize(itb);
-
-   /*
-   edje_object_signal_emit(itb->box_object, "passive", "");
-   edje_object_signal_emit(itb->overlay_object, "passive", "");
-   */
-
    return itb;
 }
 
@@ -404,10 +373,7 @@ _itray_box_free(ITray_Box *itb)
    e_object_unref(E_OBJECT(itb->con));
    e_object_del(E_OBJECT(itb->menu));
 
-   if (itb->timer) ecore_timer_del(itb->timer);
-   if (itb->animator) ecore_animator_del(itb->animator);
    evas_object_del(itb->box_object);
-   if (itb->overlay_object) evas_object_del(itb->overlay_object);
    evas_object_del(itb->item_object);
    evas_object_del(itb->event_object);
 
@@ -462,7 +428,6 @@ _itray_box_disable(ITray_Box *itb)
 {
    itb->conf->enabled = 0;
    evas_object_hide(itb->box_object);
-   if (itb->overlay_object) evas_object_hide(itb->overlay_object);
    evas_object_hide(itb->item_object);
    evas_object_hide(itb->event_object);
    e_config_save_queue();
@@ -563,17 +528,7 @@ _itray_box_edge_change(ITray_Box *itb, int edge)
    edje_object_signal_emit(o, "set_orientation", _itray_main_orientation[edge]);
    edje_object_message_signal_process(o);
 
-   if (itb->overlay_object)
-     {
-       o = itb->overlay_object;
-       edje_object_signal_emit(o, "set_orientation", _itray_main_orientation[edge]);
-       edje_object_message_signal_process(o);
-     }
-
    e_box_freeze(itb->item_object);
-
-   itb->align_req = 0.5;
-   itb->align = 0.5;
    e_box_align_set(itb->item_object, 0.5, 0.5);
 
    policy = E_GADMAN_POLICY_EDGES | E_GADMAN_POLICY_HMOVE | E_GADMAN_POLICY_VMOVE;
@@ -637,78 +592,6 @@ _itray_box_update_policy(ITray_Box *itb)
 }
 
 static void
-_itray_box_motion_handle(ITray_Box *itb, Evas_Coord mx, Evas_Coord my)
-{
-   Evas_Coord x, y, w, h;
-   double relx, rely;
-
-   evas_object_geometry_get(itb->item_object, &x, &y, &w, &h);
-   if (w > 0) relx = (double)(mx - x) / (double)w;
-   else relx = 0.0;
-   if (h > 0) rely = (double)(my - y) / (double)h;
-   else rely = 0.0;
-   if ((e_gadman_client_edge_get(itb->gmc) == E_GADMAN_EDGE_BOTTOM) ||
-       (e_gadman_client_edge_get(itb->gmc) == E_GADMAN_EDGE_TOP))
-     {
-       itb->align_req = 1.0 - relx;
-       itb->follow_req = relx;
-     }
-   else if ((e_gadman_client_edge_get(itb->gmc) == E_GADMAN_EDGE_LEFT) ||
-           (e_gadman_client_edge_get(itb->gmc) == E_GADMAN_EDGE_RIGHT))
-     {
-       itb->align_req = 1.0 - rely;
-       itb->follow_req = rely;
-     }
-}
-
-static void
-_itray_box_timer_handle(ITray_Box *itb)
-{
-   if (!itb->timer)
-     itb->timer = ecore_timer_add(0.01, _itray_box_cb_timer, itb);
-   if (!itb->animator)
-     itb->animator = ecore_animator_add(_itray_box_cb_animator, itb);
-}
-
-static void
-_itray_box_follower_reset(ITray_Box *itb)
-{
-   Evas_Coord ww, hh, bx, by, bw, bh, d1, d2, mw, mh;
-
-   if (!itb->overlay_object) return;
-
-   evas_output_viewport_get(itb->evas, NULL, NULL, &ww, &hh);
-   evas_object_geometry_get(itb->item_object, &bx, &by, &bw, &bh);
-   edje_object_size_min_get(itb->overlay_object, &mw, &mh);
-   if ((e_gadman_client_edge_get(itb->gmc) == E_GADMAN_EDGE_BOTTOM) ||
-       (e_gadman_client_edge_get(itb->gmc) == E_GADMAN_EDGE_TOP))
-     {
-       d1 = bx;
-       d2 = ww - (bx + bw);
-       if (bw > 0)
-         {
-            if (d1 < d2)
-              itb->follow_req = -((double)(d1 + (mw * 4)) / (double)bw);
-            else
-              itb->follow_req = 1.0 + ((double)(d2 + (mw * 4)) / (double)bw);
-         }
-     }
-   else if ((e_gadman_client_edge_get(itb->gmc) == E_GADMAN_EDGE_LEFT) ||
-           (e_gadman_client_edge_get(itb->gmc) == E_GADMAN_EDGE_RIGHT))
-     {
-       d1 = by;
-       d2 = hh - (by + bh);
-       if (bh > 0)
-         {
-            if (d1 < d2)
-              itb->follow_req = -((double)(d1 + (mh * 4)) / (double)bh);
-            else
-              itb->follow_req = 1.0 + ((double)(d2 + (mh * 4)) / (double)bh);
-         }
-     }
-}
-
-static void
 _itray_box_cb_mouse_in(void *data, Evas *e, Evas_Object *obj, void *event_info)
 {
    Evas_Event_Mouse_In *ev;
@@ -716,10 +599,6 @@ _itray_box_cb_mouse_in(void *data, Evas *e, Evas_Object *obj, void *event_info)
 
    ev = event_info;
    itb = data;
-   if (itb->overlay_object)
-     edje_object_signal_emit(itb->overlay_object, "active", "");
-   _itray_box_motion_handle(itb, ev->canvas.x, ev->canvas.y);
-   _itray_box_timer_handle(itb);
 }
 
 static void
@@ -730,10 +609,6 @@ _itray_box_cb_mouse_out(void *data, Evas *e, Evas_Object *obj, void *event_info)
 
    ev = event_info;
    itb = data;
-   if (itb->overlay_object)
-     edje_object_signal_emit(itb->overlay_object, "passive", "");
-   _itray_box_follower_reset(itb);
-   _itray_box_timer_handle(itb);
 }
 
 static void
@@ -751,6 +626,10 @@ _itray_box_cb_mouse_down(void *data, Evas *e, Evas_Object *obj, void *event_info
                              E_MENU_POP_DIRECTION_DOWN, ev->timestamp);
        e_util_container_fake_mouse_up_later(itb->con, 3);
      }
+   else
+     {
+       /* FIXME: fake mouse events onto tray windows */
+     }
 }
 
 static void
@@ -761,6 +640,13 @@ _itray_box_cb_mouse_up(void *data, Evas *e, Evas_Object *obj, void *event_info)
 
    ev = event_info;
    itb = data;
+   if (ev->button == 3)
+     {
+     }
+   else
+     {
+       /* FIXME: fake mouse events onto tray windows */
+     }
 }
 
 static void
@@ -771,86 +657,7 @@ _itray_box_cb_mouse_move(void *data, Evas *e, Evas_Object *obj, void *event_info
 
    ev = event_info;
    itb = data;
-   _itray_box_motion_handle(itb, ev->cur.canvas.x, ev->cur.canvas.y);
-   _itray_box_timer_handle(itb);
-}
-
-static int
-_itray_box_cb_timer(void *data)
-{
-   ITray_Box *itb;
-   double dif, dif2;
-   double v;
-
-   itb = data;
-   v = itb->itray->conf->autoscroll_speed;
-   itb->align = (itb->align_req * (1.0 - v)) + (itb->align * v);
-   v = itb->itray->conf->follow_speed;
-   itb->follow = (itb->follow_req * (1.0 - v)) + (itb->follow * v);
-
-   dif = itb->align - itb->align_req;
-   if (dif < 0) dif = -dif;
-   if (dif < 0.001) itb->align = itb->align_req;
-
-   dif2 = itb->follow - itb->follow_req;
-   if (dif2 < 0) dif2 = -dif2;
-   if (dif2 < 0.001) itb->follow = itb->follow_req;
-
-   if ((dif < 0.001) && (dif2 < 0.001))
-     {
-       itb->timer = NULL;
-       return 0;
-     }
-   return 1;
-}
-
-static int
-_itray_box_cb_animator(void *data)
-{
-   ITray_Box *itb;
-   Evas_Coord x, y, w, h, mw, mh;
-
-   itb = data;
-
-   if ((e_gadman_client_edge_get(itb->gmc) == E_GADMAN_EDGE_BOTTOM) ||
-       (e_gadman_client_edge_get(itb->gmc) == E_GADMAN_EDGE_TOP))
-     {
-        e_box_min_size_get(itb->item_object, &mw, &mh);
-       evas_object_geometry_get(itb->item_object, NULL, NULL, &w, &h);
-       if (mw > w)
-         e_box_align_set(itb->item_object, itb->align, 0.5);
-       else
-         e_box_align_set(itb->item_object, 0.5, 0.5);
-
-       if (itb->overlay_object)
-         {
-            evas_object_geometry_get(itb->item_object, &x, &y, &w, &h);
-            edje_object_size_min_get(itb->overlay_object, &mw, &mh);
-            evas_object_resize(itb->overlay_object, mw, h);
-            evas_object_move(itb->overlay_object, x + (w * itb->follow) - (mw / 2), y);
-         }
-     }
-   else if ((e_gadman_client_edge_get(itb->gmc) == E_GADMAN_EDGE_LEFT) ||
-           (e_gadman_client_edge_get(itb->gmc) == E_GADMAN_EDGE_RIGHT))
-     {
-        e_box_min_size_get(itb->item_object, &mw, &mh);
-       evas_object_geometry_get(itb->item_object, NULL, NULL, &w, &h);
-       if (mh > h)
-         e_box_align_set(itb->item_object, 0.5, itb->align);
-       else
-         e_box_align_set(itb->item_object, 0.5, 0.5);
-
-       if (itb->overlay_object)
-         {
-            evas_object_geometry_get(itb->item_object, &x, &y, &w, &h);
-            edje_object_size_min_get(itb->overlay_object, &mw, &mh);
-            evas_object_resize(itb->overlay_object, w, mh);
-            evas_object_move(itb->overlay_object, x, y + (h * itb->follow) - (mh / 2));
-         }
-     }
-   if (itb->timer) return 1;
-   itb->animator = NULL;
-   return 0;
+   /* FIXME: fake mouse events onto tray windows */
 }
 
 static void
@@ -869,10 +676,6 @@ _itray_box_cb_gmc_change(void *data, E_Gadman_Client *gmc, E_Gadman_Change chang
 
        evas_object_move(itb->box_object, itb->x, itb->y);
        evas_object_resize(itb->box_object, itb->w, itb->h);
-
-       _itray_box_follower_reset(itb);
-       _itray_box_timer_handle(itb);
-
        break;
       case E_GADMAN_CHANGE_EDGE:
        _itray_box_edge_change(itb, e_gadman_client_edge_get(itb->gmc));
@@ -909,51 +712,10 @@ _itray_box_cb_menu_edit(void *data, E_Menu *m, E_Menu_Item *mi)
    e_gadman_mode_set(itb->gmc->gadman, E_GADMAN_MODE_EDIT);
 }
 
-static void
-_itray_box_cb_follower(void *data)
-{
-   ITray          *it;
-   ITray_Box      *itb;
-   unsigned char  enabled;
-   Evas_List     *l;
-
-   it = (ITray *)data;
-   enabled = it->conf->follower;
-   if (enabled)
-     {
-       for (l = it->boxes; l; l = l->next)
-         {
-            Evas_Object *o;
-
-            itb = l->data;
-            if (itb->overlay_object) continue;
-            o = edje_object_add(itb->evas);
-            itb->overlay_object = o;
-            evas_object_layer_set(o, 1);
-            e_theme_edje_object_set(o, "base/theme/modules/itray",
-                                    "modules/itray/follower");
-            edje_object_signal_emit(o, "set_orientation", _itray_main_orientation[e_gadman_client_edge_get(itb->gmc)]);
-            edje_object_message_signal_process(o);
-            evas_object_show(o);
-         }
-     }
-   else if (!enabled)
-     {
-       for (l = it->boxes; l; l = l->next)
-         {
-            itb = l->data;
-            if (!itb->overlay_object) continue;
-            evas_object_del(itb->overlay_object);
-            itb->overlay_object = NULL;
-         }
-     }
-}
-
 void
 _itray_box_cb_config_updated(void *data)
 {
    /* Call Any Needed Funcs To Let Module Handle Config Changes */
-   _itray_box_cb_follower(data);
    _itray_box_cb_width_auto(data);
 }
 
@@ -961,6 +723,8 @@ void
 _itray_tray_init(ITray_Box *itb)
 {
    Evas_Coord x, y, w, h;
+   Ecore_X_Window *windows;
+   int wnum;
 
    /* FIXME - temp */
    itb->tray = malloc(sizeof(ITray_Tray));
@@ -983,6 +747,55 @@ _itray_tray_init(ITray_Box *itb)
 
    itb->tray->msg_handler = ecore_event_handler_add(ECORE_X_EVENT_CLIENT_MESSAGE, _itray_tray_cb_msg, itb);
    itb->tray->dst_handler = ecore_event_handler_add(ECORE_X_EVENT_WINDOW_DESTROY, _itray_tray_cb_msg, itb);
+
+   windows = ecore_x_window_children_get(itb->con->manager->root, &wnum);
+   if (windows)
+     {
+        int i;
+       Ecore_X_Atom atom_xmbed, atom_kde_netwm_systray, atom_kwm_dockwindow,
+         atom_window;
+               
+       atom_window = ecore_x_atom_get("WINDOW");
+       atom_xmbed = ecore_x_atom_get("_XEMBED_INFO");
+       atom_kde_netwm_systray = ecore_x_atom_get("_KDE_NET_WM_SYSTEM_TRAY_WINDOW_FOR");
+       atom_kwm_dockwindow = ecore_x_atom_get("KWM_DOCKWINDOW");
+       for (i = 0; i < wnum; i++)
+         {
+             Ecore_X_Window_Attributes att;
+            unsigned char *data = NULL;
+            int count;
+            
+             ecore_x_window_attributes_get(windows[i], &att);
+             if (!ecore_x_window_prop_property_get(windows[i],
+                                                  atom_xmbed,
+                                                  atom_xmbed, 32, 
+                                                  &data, &count))
+              data = NULL;
+            if (!data)
+              {
+                 if (!ecore_x_window_prop_property_get(windows[i],
+                                                       atom_kde_netwm_systray,
+                                                       atom_xmbed, 32, 
+                                                       &data, &count))
+                   data = NULL;
+              }
+            if (!data)
+              {
+                 if (!ecore_x_window_prop_property_get(windows[i],
+                                                       atom_kwm_dockwindow,
+                                                       atom_kwm_dockwindow, 32, 
+                                                       &data, &count))
+                   data = NULL;
+              }
+            if (data)
+              {
+                 _itray_tray_add(itb, windows[i]);
+                 free(data);
+                 data = NULL;
+              }
+         }
+        free(windows);
+     }
 }
 
 void
@@ -990,9 +803,16 @@ _itray_tray_shutdown(ITray_Box *itb)
 {
    _itray_tray_active_set(itb, 0);
 
-   evas_list_free(itb->tray->wins);
+   while (itb->tray->wins)
+     {
+       Ecore_X_Window win;
+       
+       win = (Ecore_X_Window)(itb->tray->wins->data);
+       ecore_x_window_reparent(win, itb->con->manager->root, 0, 0);
+       itb->tray->wins = evas_list_remove_list(itb->tray->wins, itb->tray->wins);
+     }
    evas_object_del(itb->item_object);
-
+   
    ecore_event_handler_del(itb->tray->msg_handler);
    ecore_event_handler_del(itb->tray->dst_handler);
    ecore_x_window_del(itb->tray->win);
@@ -1016,14 +836,14 @@ _itray_tray_active_set(ITray_Box *itb, int active)
 
    snprintf(buf, sizeof(buf), "_NET_SYSTEM_TRAY_S%d", DefaultScreen(display));
    selection_atom = ecore_x_atom_get(buf);
-   XSetSelectionOwner (display, selection_atom, win, CurrentTime);
+   XSetSelectionOwner(display, selection_atom, win, CurrentTime);
 
-   if (active &&
-        XGetSelectionOwner (display, selection_atom) == itb->con->bg_win)
+   if ((active) &&
+        (XGetSelectionOwner(display, selection_atom) == itb->con->bg_win))
      {
        ecore_x_client_message32_send(root, ecore_x_atom_get("MANAGER"),
-             ECORE_X_EVENT_MASK_WINDOW_CONFIGURE,
-             CurrentTime, selection_atom, win, 0, 0);
+                                     ECORE_X_EVENT_MASK_WINDOW_CONFIGURE,
+                                     CurrentTime, selection_atom, win, 0, 0);
      }
 }
 
@@ -1112,6 +932,7 @@ _itray_tray_add(ITray_Box *itb, Ecore_X_Window win)
    
    ecore_x_window_save_set_add(win);
    ecore_x_window_reparent(win, itb->tray->win, 0, 0);
+   ecore_x_window_raise(itb->con->event_win);
    _itray_tray_layout(itb);
    _itray_box_frame_resize(itb);
 
index 0055872..f1d6d00 100644 (file)
@@ -15,9 +15,6 @@ typedef struct _ITray_Tray   ITray_Tray;
 
 struct _Config
 {
-   double        follow_speed;
-   int           follower;
-   double        autoscroll_speed;
    int           rowsize;
    int           width;
    Evas_List    *boxes;
@@ -40,24 +37,18 @@ struct _ITray
 
 struct _ITray_Box
 {
-   ITray        *itray;
+   ITray       *itray;
    E_Container *con;
    Evas        *evas;
    E_Menu      *menu;
    
    Evas_Object *box_object;
-   Evas_Object *overlay_object;
    Evas_Object *item_object;
    Evas_Object *event_object;
    
-   double          align, align_req;
-   double          follow, follow_req;
-   Ecore_Timer    *timer;
-   Ecore_Animator *animator;
-   
    Evas_Coord      x, y, w, h;
    struct {
-       Evas_Coord l, r, t, b;
+      Evas_Coord l, r, t, b;
    } box_inset;
 
    E_Gadman_Client *gmc;