Enlightenment CVS committal

Author  : kwo
Project : e16
Module  : e

Dir     : e16/e/src


Modified Files:
        backgrounds.c edge.c ewins.c focus.c fx.c ipc.c magwin.c 
        menus.c mod-misc.c mod-trans.c pager.c session.c snaps.c 
        snaps.h timers.c timers.h tooltips.c util.h 


Log Message:
Simplify timers.

===================================================================
RCS file: /cvs/e/e16/e/src/backgrounds.c,v
retrieving revision 1.110
retrieving revision 1.111
diff -u -3 -r1.110 -r1.111
--- backgrounds.c       10 May 2008 23:22:31 -0000      1.110
+++ backgrounds.c       24 May 2008 18:13:16 -0000      1.111
@@ -64,6 +64,7 @@
 };
 
 static Ecore_List  *bg_list = NULL;
+static Timer       *bg_timer = NULL;
 static unsigned int bg_seq_no = 0;
 
 #define N_BG_ASSIGNED 32
@@ -1415,16 +1416,17 @@
    }
 }
 
-static void
-BackgroundsTimeout(int val __UNUSED__, void *data __UNUSED__)
+static int
+BackgroundsTimeout(void *data __UNUSED__)
 {
    if (Conf.backgrounds.timeout <= 0)
       Conf.backgrounds.timeout = 1;
 
    BackgroundsAccounting();
 
-   DoIn("BACKGROUND_ACCOUNTING_TIMEOUT", 1.0 * Conf.backgrounds.timeout,
-       BackgroundsTimeout, 0, NULL);
+   TimerSetInterval(bg_timer, 1.0 * Conf.backgrounds.timeout);
+
+   return 1;
 }
 
 static void
@@ -1446,8 +1448,7 @@
        break;
 
      case ESIGNAL_START:
-       DoIn("BACKGROUND_ACCOUNTING_TIMEOUT", 30.0, BackgroundsTimeout, 0,
-            NULL);
+       TIMER_ADD(bg_timer, 30.0, BackgroundsTimeout, NULL);
        break;
 
      case ESIGNAL_EXIT:
===================================================================
RCS file: /cvs/e/e16/e/src/edge.c,v
retrieving revision 1.39
retrieving revision 1.40
diff -u -3 -r1.39 -r1.40
--- edge.c      24 Mar 2008 11:12:40 -0000      1.39
+++ edge.c      24 May 2008 18:13:16 -0000      1.40
@@ -30,29 +30,32 @@
 #include "xwin.h"
 
 static EObj        *w1 = NULL, *w2 = NULL, *w3 = NULL, *w4 = NULL;
+static Timer       *edge_timer = NULL;
 
-static void
-EdgeTimeout(int val, void *data __UNUSED__)
+static int
+EdgeTimeout(void *data)
 {
+   int                 val;
    int                 ax, ay, aw, ah, dx, dy, dax, day;
    EWin               *ewin;
 
    if (MenusActive())
-      return;
+      goto done;
    if (Conf.desks.edge_flip_mode == EDGE_FLIP_OFF)
-      return;
+      goto done;
 
    /* Quit if pointer has left screen */
    if (!EQueryPointer(NULL, NULL, NULL, NULL, NULL))
-      return;
+      goto done;
 
    /* Quit if in fullscreen window */
    ewin = GetEwinPointerInClient();
    if (ewin && ewin->state.fullscreen)
-      return;
+      goto done;
 
    DeskCurrentGetArea(&ax, &ay);
    DesksGetAreaSize(&aw, &ah);
+   val = PTR2INT(data);
    dx = 0;
    dy = 0;
    dax = 0;
@@ -61,25 +64,25 @@
      {
      case 0:
        if (ax == 0 && !Conf.desks.areas_wraparound)
-          return;
+          goto done;
        dx = WinGetW(VROOT) - 2;
        dax = -1;
        break;
      case 1:
        if (ax == (aw - 1) && !Conf.desks.areas_wraparound)
-          return;
+          goto done;
        dx = -(WinGetW(VROOT) - 2);
        dax = 1;
        break;
      case 2:
        if (ay == 0 && !Conf.desks.areas_wraparound)
-          return;
+          goto done;
        dy = WinGetH(VROOT) - 2;
        day = -1;
        break;
      case 3:
        if (ay == (ah - 1) && !Conf.desks.areas_wraparound)
-          return;
+          goto done;
        dy = -(WinGetH(VROOT) - 2);
        day = 1;
        break;
@@ -98,6 +101,10 @@
    DeskCurrentMoveAreaBy(dax, day);
    Mode.events.px = Mode.events.mx;
    Mode.events.py = Mode.events.my;
+
+ done:
+   edge_timer = NULL;
+   return 0;
 }
 
 static void
@@ -114,14 +121,13 @@
    if (Conf.desks.edge_flip_mode == EDGE_FLIP_MOVE && Mode.mode != MODE_MOVE)
       return;
 
-   RemoveTimerEvent("EDGE_TIMEOUT");
+   TIMER_DEL(edge_timer);
    if (dir >= 0)
      {
        if (Conf.desks.edge_flip_resistance <= 0)
           Conf.desks.edge_flip_resistance = 1;
-       DoIn("EDGE_TIMEOUT",
-            ((double)Conf.desks.edge_flip_resistance) / 100.0, EdgeTimeout,
-            dir, NULL);
+       TIMER_ADD(edge_timer, ((double)Conf.desks.edge_flip_resistance) / 100.0,
+                 EdgeTimeout, INT2PTR(dir));
      }
    lastdir = dir;
 }
===================================================================
RCS file: /cvs/e/e16/e/src/ewins.c,v
retrieving revision 1.227
retrieving revision 1.228
diff -u -3 -r1.227 -r1.228
--- ewins.c     10 May 2008 23:22:31 -0000      1.227
+++ ewins.c     24 May 2008 18:13:16 -0000      1.228
@@ -53,7 +53,7 @@
    /* StructureNotifyMask | */ ResizeRedirectMask | \
    PropertyChangeMask | ColormapChangeMask | VisibilityChangeMask)
 
-static void         EwinSlideIn(int val __UNUSED__, void *data);
+static int          EwinSlideIn(void *data);
 
 static void         EwinChangesStart(EWin * ewin);
 static void         EwinChangesProcess(EWin * ewin);
@@ -886,6 +886,8 @@
      }
    else if (doslide)
      {
+       Timer              *slide_timer;
+
        k = rand() % 4;
        if (k == 0)
          {
@@ -915,7 +917,7 @@
        EwinShow(ewin);
        ewin->req_x = x;
        ewin->req_y = y;
-       DoIn("Slide", 0.05, EwinSlideIn, 0, ewin);
+       TIMER_ADD(slide_timer, 0.05, EwinSlideIn, ewin);
      }
    else
      {
@@ -1876,8 +1878,8 @@
 /*
  * Slidein
  */
-static void
-EwinSlideIn(int val __UNUSED__, void *data)
+static int
+EwinSlideIn(void *data)
 {
    EWin               *ewin = (EWin *) data;
 
@@ -1891,6 +1893,8 @@
  done:
    Mode.place.doing_slide = 0;
    FocusEnable(1);
+
+   return 0;
 }
 
 /*
===================================================================
RCS file: /cvs/e/e16/e/src/focus.c,v
retrieving revision 1.175
retrieving revision 1.176
diff -u -3 -r1.175 -r1.176
--- focus.c     10 May 2008 23:22:31 -0000      1.175
+++ focus.c     24 May 2008 18:13:17 -0000      1.176
@@ -42,6 +42,8 @@
 static int          focus_pending_why = 0;
 static EWin        *focus_pending_ewin = NULL;
 static EWin        *focus_pending_new = NULL;
+static Timer       *focus_timer_autoraise = NULL;
+static Timer       *focus_timer_reverse = NULL;
 
 void
 FocusEnable(int on)
@@ -135,27 +137,32 @@
    return ewin;
 }
 
-static void
-AutoraiseTimeout(int val, void *data __UNUSED__)
+static int
+AutoraiseTimeout(void *data)
 {
-   EWin               *ewin;
+   EWin               *ewin = (EWin *) data;
 
    if (Conf.focus.mode == MODE_FOCUS_CLICK)
-      return;
+      goto done;
 
-   ewin = EwinFindByClient(val);
-   if (ewin)
+   if (EwinFindByPtr(ewin))    /* May be gone */
       EwinRaise(ewin);
+
+ done:
+   focus_timer_autoraise = NULL;
+   return 0;
 }
 
-static void
-ReverseTimeout(int val, void *data __UNUSED__)
+static int
+ReverseTimeout(void *data)
 {
-   EWin               *ewin;
+   EWin               *ewin = (EWin *) data;
 
-   ewin = EwinFindByClient(val);
-   if (ewin)
+   if (EwinFindByPtr(ewin))    /* May be gone */
       EwinListFocusRaise(ewin);
+
+   focus_timer_reverse = NULL;
+   return 0;
 }
 
 static void
@@ -386,11 +393,11 @@
 
    if (Conf.autoraise.enable)
      {
-       RemoveTimerEvent("AUTORAISE_TIMEOUT");
+       TIMER_DEL(focus_timer_autoraise);
 
        if (Conf.focus.mode != MODE_FOCUS_CLICK)
-          DoIn("AUTORAISE_TIMEOUT", 0.001 * Conf.autoraise.delay,
-               AutoraiseTimeout, EwinGetClientXwin(ewin), NULL);
+          TIMER_ADD(focus_timer_autoraise, 0.001 * Conf.autoraise.delay,
+                    AutoraiseTimeout, ewin);
      }
 
    if (do_raise)
@@ -401,12 +408,11 @@
    if (do_warp)
       EwinWarpTo(ewin);
 
-   RemoveTimerEvent("REVERSE_FOCUS_TIMEOUT");
+   TIMER_DEL(focus_timer_reverse);
    switch (why)
      {
      case FOCUS_PREV:
-       DoIn("REVERSE_FOCUS_TIMEOUT", 0.5, ReverseTimeout,
-            EwinGetClientXwin(ewin), NULL);
+       TIMER_ADD(focus_timer_reverse, 0.5, ReverseTimeout, ewin);
        break;
      case FOCUS_DESK_ENTER:
        if (Conf.focus.mode == MODE_FOCUS_CLICK)
@@ -853,10 +859,11 @@
  * Focus Module
  */
 
-static void
-FocusInitTimeout(int val __UNUSED__, void *data __UNUSED__)
+static int
+FocusInitTimeout(void *data __UNUSED__)
 {
    FocusInit();
+   return 0;
 }
 
 static void
@@ -871,12 +878,14 @@
 static void
 FocusSighan(int sig, void *prm __UNUSED__)
 {
+   Timer              *focus_init_timer;
+
    switch (sig)
      {
      case ESIGNAL_START:
        /* Delay focusing a bit to allow things to settle down */
        IdlerAdd(_FocusIdler, NULL);
-       DoIn("FOCUS_INIT_TIMEOUT", 0.5, FocusInitTimeout, 0, NULL);
+       TIMER_ADD(focus_init_timer, 0.5, FocusInitTimeout, NULL);
        break;
 
      case ESIGNAL_EXIT:
===================================================================
RCS file: /cvs/e/e16/e/src/fx.c,v
retrieving revision 1.87
retrieving revision 1.88
diff -u -3 -r1.87 -r1.88
--- fx.c        10 May 2008 23:17:40 -0000      1.87
+++ fx.c        24 May 2008 18:13:17 -0000      1.88
@@ -59,9 +59,10 @@
 static Pixmap       fx_ripple_above = None;
 static Win          fx_ripple_win = NULL;
 static int          fx_ripple_count = 0;
+static Timer       *fx_ripple_timer = NULL;
 
-static void
-FX_ripple_timeout(int val __UNUSED__, void *data __UNUSED__)
+static int
+FX_ripple_timeout(void *data __UNUSED__)
 {
    static double       incv = 0, inch = 0;
    static GC           gc1 = 0, gc = 0;
@@ -118,14 +119,15 @@
                  WinGetW(VROOT), 1, off,
                  WinGetH(VROOT) - fx_ripple_waterh + y);
      }
-   DoIn("FX_RIPPLE_TIMEOUT", 0.066, FX_ripple_timeout, 0, NULL);
+
+   return 1;
 }
 
 static void
 FX_Ripple_Init(const char *name __UNUSED__)
 {
    fx_ripple_count = 0;
-   DoIn("FX_RIPPLE_TIMEOUT", 0.066, FX_ripple_timeout, 0, NULL);
+   TIMER_ADD(fx_ripple_timer, 0.066, FX_ripple_timeout, NULL);
 }
 
 static void
@@ -140,7 +142,7 @@
 static void
 FX_Ripple_Quit(void)
 {
-   RemoveTimerEvent("FX_RIPPLE_TIMEOUT");
+   TIMER_DEL(fx_ripple_timer);
    EClearArea(fx_ripple_win, 0, WinGetH(VROOT) - fx_ripple_waterh,
              WinGetW(VROOT), fx_ripple_waterh);
 }
@@ -175,6 +177,7 @@
 static Win          fx_raindrops_win = NULL;
 static int          fx_raindrops_number = 4;
 static PixImg      *fx_raindrops_draw = NULL;
+static Timer       *fx_raindrops_timer = NULL;
 
 typedef struct {
    int                 x, y;
@@ -184,8 +187,8 @@
 
 static DropContext  fx_raindrops[4];
 
-static void
-FX_raindrops_timeout(int val __UNUSED__, void *data __UNUSED__)
+static int
+FX_raindrops_timeout(void *data __UNUSED__)
 {
    static GC           gc1 = 0, gc = 0;
    int                 i, x, y, xx, yy;
@@ -233,7 +236,7 @@
           ECreatePixImg(WinGetXwin(fx_raindrops_win), fx_raindrop_size,
                         fx_raindrop_size);
        if (!fx_raindrops_draw)
-          return;
+          return 0;
 
        for (i = 0; i < fx_raindrops_number; i++)
          {
@@ -245,7 +248,7 @@
                             fx_raindrops[i].buf->xim, fx_raindrops[i].x,
                             fx_raindrops[i].y, 0xffffffff);
             if (!fx_raindrops[i].buf)
-               return;
+               return 0;
          }
      }
 
@@ -380,8 +383,7 @@
        ESync(0);
      }
 
-   DoIn("FX_RAINDROPS_TIMEOUT", (0.066 /*/ (float)fx_raindrops_number */ ),
-       FX_raindrops_timeout, 0, NULL);
+   return 1;
 }
 
 static void
@@ -396,7 +398,7 @@
        fx_raindrops[i].x = rand() % (WinGetW(VROOT) - fx_raindrop_size);
        fx_raindrops[i].y = rand() % (WinGetH(VROOT) - fx_raindrop_size);
      }
-   DoIn("FX_RAINDROPS_TIMEOUT", 0.066, FX_raindrops_timeout, 0, NULL);
+   TIMER_ADD(fx_raindrops_timer, 0.066, FX_raindrops_timeout, NULL);
 }
 
 static void
@@ -410,7 +412,7 @@
 {
    int                 i;
 
-   RemoveTimerEvent("FX_RAINDROPS_TIMEOUT");
+   TIMER_DEL(fx_raindrops_timer);
    for (i = 0; i < fx_raindrops_number; i++)
      {
        EClearArea(fx_raindrops_win, fx_raindrops[i].x, fx_raindrops[i].y,
@@ -456,9 +458,10 @@
 static Pixmap       fx_wave_above = None;
 static Win          fx_wave_win = NULL;
 static int          fx_wave_count = 0;
+static Timer       *fx_wave_timer = NULL;
 
-static void
-FX_Wave_timeout(int val __UNUSED__, void *data __UNUSED__)
+static int
+FX_Wave_timeout(void *data __UNUSED__)
 {
    /* Variables */
    static double       incv = 0, inch = 0;
@@ -561,15 +564,14 @@
          }
      }
 
-   /* Make noise */
-   DoIn("FX_WAVE_TIMEOUT", 0.066, FX_Wave_timeout, 0, NULL);
+   return 1;
 }
 
 static void
 FX_Waves_Init(const char *name __UNUSED__)
 {
    fx_wave_count = 0;
-   DoIn("FX_WAVE_TIMEOUT", 0.066, FX_Wave_timeout, 0, NULL);
+   TIMER_ADD(fx_wave_timer, 0.066, FX_Wave_timeout, NULL);
 }
 
 static void
@@ -583,7 +585,7 @@
 static void
 FX_Waves_Quit(void)
 {
-   RemoveTimerEvent("FX_WAVE_TIMEOUT");
+   TIMER_DEL(fx_wave_timer);
    EClearArea(fx_wave_win, 0, WinGetH(VROOT) - FX_WAVE_WATERH,
              WinGetW(VROOT), FX_WAVE_WATERH);
 }
@@ -612,9 +614,10 @@
 static Win          fx_imagespinner_win = NULL;
 static int          fx_imagespinner_count = 3;
 static char        *fx_imagespinner_params = NULL;
+static Timer       *fx_imagespinner_timer = NULL;
 
-static void
-FX_imagespinner_timeout(int val __UNUSED__, void *data __UNUSED__)
+static int
+FX_imagespinner_timeout(void *data __UNUSED__)
 {
    char               *string = NULL;
 
@@ -654,14 +657,14 @@
        Efree(string);
      }
 
-   DoIn("FX_IMAGESPINNER_TIMEOUT", 0.066, FX_imagespinner_timeout, 0, NULL);
+   return 1;
 }
 
 static void
 FX_ImageSpinner_Init(const char *name)
 {
    fx_imagespinner_count = 3;
-   DoIn("FX_IMAGESPINNER_TIMEOUT", 0.066, FX_imagespinner_timeout, 0, NULL);
+   TIMER_ADD(fx_imagespinner_timer, 0.066, FX_imagespinner_timeout, NULL);
    fx_imagespinner_params = Estrdup(name);
 }
 
@@ -674,7 +677,7 @@
 static void
 FX_ImageSpinner_Quit(void)
 {
-   RemoveTimerEvent("FX_IMAGESPINNER_TIMEOUT");
+   TIMER_DEL(fx_imagespinner_timer);
    EClearArea(fx_imagespinner_win, 0, 0, WinGetW(VROOT), WinGetH(VROOT));
    Efree(fx_imagespinner_params);
    fx_imagespinner_params = NULL;
===================================================================
RCS file: /cvs/e/e16/e/src/ipc.c,v
retrieving revision 1.312
retrieving revision 1.313
diff -u -3 -r1.312 -r1.313
--- ipc.c       30 Mar 2008 12:13:16 -0000      1.312
+++ ipc.c       24 May 2008 18:13:17 -0000      1.313
@@ -402,15 +402,18 @@
 }
 #endif
 
-static void
-OpacityTimeout(int val, void *data __UNUSED__)
+static int
+OpacityTimeout(void *data)
 {
-   EWin               *ewin;
+   EWin               *ewin = (EWin *) data;
+
+   if (!EwinFindByPtr(ewin))   /* May be gone */
+      return 0;
+
+   if (ewin->state.active)
+      EoChangeOpacity(ewin, ewin->props.focused_opacity);
 
-   ewin = EwinFindByClient(val);
-   if (ewin)
-      if (ewin->state.active)
-        EoChangeOpacity(ewin, ewin->props.focused_opacity);
+   return 0;
 }
 
 static void
@@ -686,10 +689,11 @@
        EwinOpSetOpacity(ewin, OPSRC_USER, a);
        if (ewin->state.active)
          {
+            Timer              *op_timer;
+
             EoChangeOpacity(ewin, OpacityFromPercent(a));
             if (ewin->props.focused_opacity)
-               DoIn("OPACITY_TIMEOUT", 0.001 * 700, OpacityTimeout,
-                    EwinGetClientXwin(ewin), NULL);
+               TIMER_ADD(op_timer, 0.001 * 700, OpacityTimeout, ewin);
          }
        break;
 
@@ -1713,28 +1717,29 @@
    return ok;
 }
 
-static void
-doEFuncDeferred(int val __UNUSED__, void *data)
+static int
+doEFuncDeferred(void *data)
 {
    void              **prm = (void **)data;
    EWin               *ewin;
 
    ewin = (EWin *) prm[0];
    if (ewin && !EwinFindByPtr(ewin))
-      return;
+      return 0;
 
    EFunc(ewin, (const char *)prm[1]);
 
    Efree(prm[1]);
    Efree(data);
+
+   return 0;
 }
 
 void
 EFuncDefer(EWin * ewin, const char *cmd)
 {
-   static int          seqn = 0;
-   char                s[32];
    void              **prm;
+   Timer              *defer_timer;
 
    prm = EMALLOC(void *, 2);
 
@@ -1743,8 +1748,7 @@
    prm[0] = ewin;
    prm[1] = Estrdup(cmd);
 
-   Esnprintf(s, sizeof(s), "EFunc-%d", seqn++);
-   DoIn(s, 0.0, doEFuncDeferred, 0, prm);
+   TIMER_ADD(defer_timer, 0.0, doEFuncDeferred, prm);
 }
 
 static int
===================================================================
RCS file: /cvs/e/e16/e/src/magwin.c,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -3 -r1.11 -r1.12
--- magwin.c    29 Mar 2008 17:18:58 -0000      1.11
+++ magwin.c    24 May 2008 18:13:17 -0000      1.12
@@ -46,6 +46,9 @@
 typedef struct {
    EWin               *ewin;
    const char         *title;
+#if USE_TIMER
+   Timer              *timer;
+#endif
    int                 cx, cy; /* Center */
    int                 scale;  /* Zoom level */
    int                 sx, sy; /* Scene x,y */
@@ -200,17 +203,18 @@
 }
 
 #if USE_TIMER
-static void
+static int
 _MagwinTimeout(int val __UNUSED__, void *data)
 {
    MagWindow          *mw = (MagWindow *) data;
    int                 again;
 
    again = _MagwinUpdate(mw);
-   if (!again)
-      return;
+   if (again)
+      return 1;
 
-   DoIn("magwin", .050, _MagwinTimeout, 0, data);
+   mw->timer = NULL;
+   return 0;
 }
 #elif USE_ANIMATOR
 static int
@@ -353,7 +357,7 @@
      case MapNotify:
        MagwinKeyPress(mw, XK_g);
 #if USE_TIMER
-       _MagwinTimeout(1, mw);
+       TIMER_ADD(mw->timer, .050, _MagwinTimeout, 0, mw);
 #elif USE_ANIMATOR
        AnimatorAdd(_MagwinAnimator, mw);
 #endif
@@ -443,7 +447,7 @@
 MagwinDestroy(MagWindow * mw)
 {
 #if USE_TIMER
-   RemoveTimerEvent("magwin");
+   TIMER_DEL(mw->timer);
 #endif
    EventCallbackUnregister(EwinGetClientWin(mw->ewin), 0, MagwinEvent, mw);
    EDestroyWindow(EwinGetClientWin(mw->ewin));
===================================================================
RCS file: /cvs/e/e16/e/src/menus.c,v
retrieving revision 1.300
retrieving revision 1.301
diff -u -3 -r1.300 -r1.301
--- menus.c     24 Mar 2008 11:12:40 -0000      1.300
+++ menus.c     24 May 2008 18:13:17 -0000      1.301
@@ -46,7 +46,7 @@
 
 #define DEBUG_MENU_EVENTS 0
 
-#define MENU_UNLOAD_CHECK_IMTERVAL 300 /* Seconds */
+#define MENU_UNLOAD_CHECK_INTERVAL 300 /* Seconds */
 
 static struct {
    Menu               *first;
@@ -135,6 +135,7 @@
 
 static Ecore_List  *menu_list = NULL;
 static Ecore_List  *menu_style_list = NULL;
+static Timer       *menu_timer_submenu = NULL;
 
 static MenuItem    *
 MenuFindItemByChild(Menu * m, Menu * mc)
@@ -1154,7 +1155,7 @@
 static void
 MenusHide(void)
 {
-   RemoveTimerEvent("SUBMENU_SHOW");
+   TIMER_DEL(menu_timer_submenu);
 
    MenuHide(Mode_menus.first);
    Mode_menus.first = NULL;
@@ -1549,8 +1550,8 @@
    MenuSelectItem(m, mi, 0);
 }
 
-static void
-SubmenuShowTimeout(int val __UNUSED__, void *dat)
+static int
+SubmenuShowTimeout(void *dat)
 {
    int                 mx, my, my2, xo, yo, mw;
    Menu               *m;
@@ -1561,35 +1562,33 @@
    int                 bl2, br2, bt2, bb2;
 
    data = (struct _mdata *)dat;
-   if (!data)
-      return;
-   if (!data->m)
-      return;
+   if (!data || !data->m)
+      goto done;
 
    m = data->m;
    if (!ecore_list_goto(menu_list, m))
-      return;
+      goto done;
    ewin = m->ewin;
    if (!ewin || !EwinFindByPtr(ewin))
-      return;
+      goto done;
    if (!EoIsShown(ewin))
-      return;
+      goto done;
 
    mi = data->mi;
    if (!mi)
-      return;
+      goto done;
 
    if (mi->child != m->child)
       MenuHide(m->child);
    m->child = mi->child;
    if (!mi->child)
-      return;
+      goto done;
 
    mi->child->parent = m;
    MenuShow(mi->child, 1);
    ewin2 = mi->child->ewin;
    if (!ewin2 || !EwinFindByPtr(ewin2))
-      return;
+      goto done;
 
    EGetGeometry(mi->win, NULL, &mx, &my, &mw, NULL, NULL, NULL);
    my2 = 0;
@@ -1664,6 +1663,10 @@
 
    if (Conf.menus.animate)
       EwinUnShade(ewin2);
+
+ done:
+   menu_timer_submenu = NULL;
+   return 0;
 }
 
 static void
@@ -1686,13 +1689,13 @@
    if (mi && !mi->child && mi_prev && !mi_prev->child)
       return;
 
-   RemoveTimerEvent("SUBMENU_SHOW");
+   TIMER_DEL(menu_timer_submenu);
 
    if ((mi && mi->child && !mi->child->shown) || (mi && mi->child != m->child))
      {
        mdata.m = m;
        mdata.mi = mi;
-       DoIn("SUBMENU_SHOW", 0.2, SubmenuShowTimeout, 0, &mdata);
+       TIMER_ADD(menu_timer_submenu, 0.2, SubmenuShowTimeout, &mdata);
      }
 }
 
@@ -1945,8 +1948,8 @@
    return err;
 }
 
-static void
-MenusTimeout(int val __UNUSED__, void *data __UNUSED__)
+static int
+MenusTimeout(void *data __UNUSED__)
 {
    Menu               *m;
    time_t              ts;
@@ -1956,7 +1959,7 @@
    ECORE_LIST_FOR_EACH(menu_list, m)
    {
       if (m->shown || !m->filled ||
-         ts - m->last_access < MENU_UNLOAD_CHECK_IMTERVAL)
+         ts - m->last_access < MENU_UNLOAD_CHECK_INTERVAL)
         continue;
 
       m->last_change = 0;
@@ -1968,7 +1971,7 @@
         MenuDestroy(m);
    }
 
-   DoIn("MenusCheck", 1. * MENU_UNLOAD_CHECK_IMTERVAL, MenusTimeout, 0, NULL);
+   return 1;
 }
 
 /*
@@ -1978,6 +1981,8 @@
 static void
 MenusSighan(int sig, void *prm __UNUSED__)
 {
+   Timer              *menu_unload_timer;
+
    switch (sig)
      {
      case ESIGNAL_CONFIGURE:
@@ -1985,8 +1990,8 @@
        break;
 
      case ESIGNAL_START:
-       DoIn("MenusCheck", 1. * MENU_UNLOAD_CHECK_IMTERVAL, MenusTimeout, 0,
-            NULL);
+       TIMER_ADD(menu_unload_timer, 1. * MENU_UNLOAD_CHECK_INTERVAL,
+                 MenusTimeout, NULL);
        break;
 
      case ESIGNAL_AREA_SWITCH_START:
===================================================================
RCS file: /cvs/e/e16/e/src/mod-misc.c,v
retrieving revision 1.66
retrieving revision 1.67
diff -u -3 -r1.66 -r1.67
--- mod-misc.c  11 Mar 2008 22:03:57 -0000      1.66
+++ mod-misc.c  24 May 2008 18:13:17 -0000      1.67
@@ -291,7 +291,7 @@
    if (EDebug(EDBUG_TYPE_SESSION))
       Eprintf("autosave\n");
 
-   Real_SaveSnapInfo(0, NULL);
+   Real_SaveSnapInfo(NULL);
 
    /* Save the configuration parameters */
    ConfigurationSave();
===================================================================
RCS file: /cvs/e/e16/e/src/mod-trans.c,v
retrieving revision 1.25
retrieving revision 1.26
diff -u -3 -r1.25 -r1.26
--- mod-trans.c 18 May 2007 08:25:05 -0000      1.25
+++ mod-trans.c 24 May 2008 18:13:17 -0000      1.26
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2004-2007 Jaron Omega
- * Copyright (C) 2004-2007 Kim Woelders
+ * Copyright (C) 2004-2008 Kim Woelders
  *
  * Permission is hereby granted, free of charge, to any person obtaining a copy
  * of this software and associated documentation files (the "Software"), to
@@ -41,16 +41,22 @@
 static int          tmp_st_tooltip;
 static int          tmp_st_hilight;
 
-static void
-TransparencyChangeTimeout(int val, void *data __UNUSED__)
+static Timer       *st_timer = NULL;
+
+static int
+TransparencyChangeTimeout(void *data)
 {
-   TransparencySet(val);
+   TransparencySet(PTR2INT(data));
+
+   st_timer = NULL;
+   return 0;
 }
 
 static void
 TransparencyChange(int val)
 {
-   DoIn("PT-Change", .01, TransparencyChangeTimeout, val, NULL);
+   TIMER_DEL(st_timer);
+   TIMER_ADD(st_timer, .01, TransparencyChangeTimeout, INT2PTR(val));
 }
 
 static void
===================================================================
RCS file: /cvs/e/e16/e/src/pager.c,v
retrieving revision 1.267
retrieving revision 1.268
diff -u -3 -r1.267 -r1.268
--- pager.c     10 May 2008 23:15:32 -0000      1.267
+++ pager.c     24 May 2008 18:13:17 -0000      1.268
@@ -93,9 +93,9 @@
    int                 screen_w, screen_h;
    int                 update_phase;
    Win                 sel_win;
+   Timer              *scan_timer;
 
    /* State flags */
-   char                scan_pending;
    char                do_newbg;
    char                do_update;
    int                 x1, y1, x2, y2;
@@ -105,7 +105,7 @@
 } Pager;
 
 static void         PagerScanCancel(Pager * p);
-static void         PagerScanTimeout(int val, void *data);
+static int          PagerScanTimeout(void *data);
 static void         PagerCheckUpdate(Pager * p, void *prm);
 static void         PagerUpdateEwinsFromPager(Pager * p);
 static void         PagerHiwinHide(void);
@@ -169,31 +169,21 @@
 static void
 PagerScanTrig(Pager * p)
 {
-   char                s[128];
-
-   if (p->scan_pending || Conf_pagers.scanspeed <= 0)
+   if (p->scan_timer || Conf_pagers.scanspeed <= 0)
       return;
 
-   Esnprintf(s, sizeof(s), "pg-scan.%x", (unsigned)WinGetXwin(p->win));
-   DoIn(s, 1 / ((double)Conf_pagers.scanspeed), PagerScanTimeout, 0, p);
-   p->scan_pending = 1;
+   TIMER_ADD(p->scan_timer, 1 / ((double)Conf_pagers.scanspeed),
+            PagerScanTimeout, p);
 }
 
 static void
 PagerScanCancel(Pager * p)
 {
-   char                s[128];
-
-   if (!p->scan_pending)
-      return;
-   p->scan_pending = 0;
-
-   Esnprintf(s, sizeof(s), "pg-scan.%x", (unsigned)WinGetXwin(p->win));
-   RemoveTimerEvent(s);
+   TIMER_DEL(p->scan_timer);
 }
 
-static void
-PagerScanTimeout(int val __UNUSED__, void *data)
+static int
+PagerScanTimeout(void *data)
 {
    Pager              *p;
    EWin               *ewin;
@@ -201,25 +191,24 @@
    static int          offsets[8] = { 0, 4, 2, 6, 1, 5, 3, 7 };
    int                 pager_mode = PagersGetMode();
 
-   if (pager_mode != PAGER_MODE_SNAP)
-      return;
-
    p = (Pager *) data;
-   p->scan_pending = 0;
+
+   if (pager_mode != PAGER_MODE_SNAP)
+      goto nomore;
 
    ewin = p->ewin;
    if (!ewin || !EoIsShown(ewin))
-      return;
+      goto nomore;
    if (p->dsk != DesksGetCurrent())
-      return;
+      goto nomore;
    if (ewin->state.visibility == VisibilityFullyObscured)
-      return;
+      goto nomore;
 
-   if (Conf_pagers.scanspeed > 0)
-      PagerScanTrig(p);
+   if (Conf_pagers.scanspeed <= 0)
+      goto nomore;
 
    if (Mode.mode != MODE_NONE)
-      return;
+      goto nomore;
 
    DeskCurrentGetArea(&cx, &cy);
    ww = p->dw;
@@ -228,7 +217,7 @@
    yy = cy * hh;
    phase = p->update_phase;
    if (ww <= 0 || hh <= 0)
-      return;
+      goto nomore;
 
 #if 0
    /* Due to a bug in imlib2 <= 1.2.0 we have to scan left->right in stead
@@ -255,6 +244,13 @@
        PagerUpdateEwinsFromPager(p);
        p->update_phase = 0;
      }
+
+   TimerSetInterval(p->scan_timer, 1 / ((double)Conf_pagers.scanspeed));
+   return 1;
+
+ nomore:
+   p->scan_timer = NULL;
+   return 0;
 }
 
 #if 0                          /* FIXME - Remove? */
@@ -821,10 +817,12 @@
    p->do_newbg = p->do_update = 0;
 }
 
-static void
-_PagersUpdateTimeout(int val __UNUSED__, void *data __UNUSED__)
+static int
+_PagersUpdateTimeout(void *data __UNUSED__)
 {
    Mode_pagers.timer_pending = 0;
+
+   return 0;
 }
 
 static void
@@ -832,6 +830,7 @@
 {
    static double       tlast = 0.;
    double              t, dt;
+   Timer              *pager_update_timer;
 
    if (!Mode_pagers.update_pending || !Conf_pagers.enable)
       return;
@@ -844,7 +843,7 @@
          {
             /* The purpose of this timer is to trigger the idler */
             if (!Mode_pagers.timer_pending)
-               DoIn("pg-upd", dt, _PagersUpdateTimeout, 0, NULL);
+               TIMER_ADD(pager_update_timer, dt, _PagersUpdateTimeout, NULL);
             Mode_pagers.timer_pending = 1;
             return;
          }
@@ -1284,7 +1283,6 @@
 static void
 _PagerSetSnap(Pager * p, void *prm __UNUSED__)
 {
-   p->scan_pending = 0;
    PagerScanTrig(p);
 }
 
@@ -1747,19 +1745,23 @@
    PagerReconfigure(p, 1);
 }
 
-static void
-_PagersReconfigureTimeout(int val __UNUSED__, void *data __UNUSED__)
+static int
+_PagersReconfigureTimeout(void *data __UNUSED__)
 {
    PagersForeach(NULL, _PagerReconfigure, NULL);
+
+   return 0;
 }
 
 static void
 PagersReconfigure(void)
 {
+   Timer              *pg_timer_cfg;
+
    if (!Conf_pagers.enable)
       return;
 
-   DoIn("pg-cfg", .5, _PagersReconfigureTimeout, 0, NULL);
+   TIMER_ADD(pg_timer_cfg, .5, _PagersReconfigureTimeout, NULL);
 }
 
 /*
===================================================================
RCS file: /cvs/e/e16/e/src/session.c,v
retrieving revision 1.155
retrieving revision 1.156
diff -u -3 -r1.155 -r1.156
--- session.c   10 May 2008 23:29:01 -0000      1.155
+++ session.c   24 May 2008 18:13:17 -0000      1.156
@@ -473,7 +473,7 @@
    if (EDebug(EDBUG_TYPE_SESSION))
       Eprintf("SessionSave(%d)\n", shutdown);
 
-   Real_SaveSnapInfo(0, NULL);
+   Real_SaveSnapInfo(NULL);
 
 #if USE_SM
    if (shutdown && sm_conn)
===================================================================
RCS file: /cvs/e/e16/e/src/snaps.c,v
retrieving revision 1.139
retrieving revision 1.140
diff -u -3 -r1.139 -r1.140
--- snaps.c     10 May 2008 23:22:31 -0000      1.139
+++ snaps.c     24 May 2008 18:13:17 -0000      1.140
@@ -71,6 +71,7 @@
 };
 
 static Ecore_List  *ss_list = NULL;
+static Timer       *ss_timer = NULL;
 
 static Snapshot    *
 SnapshotCreate(const char *name)
@@ -1077,16 +1078,16 @@
 };
 
 /* ... combine writes, only save after a timeout */
-
 void
 SaveSnapInfo(void)
 {
-   DoIn("SAVESNAP_TIMEOUT", 5.0, Real_SaveSnapInfo, 0, NULL);
+   TIMER_DEL(ss_timer);
+   TIMER_ADD(ss_timer, 5.0, Real_SaveSnapInfo, NULL);
 }
 
 /* save out all snapped info to disk */
-void
-Real_SaveSnapInfo(int dumval __UNUSED__, void *dumdat __UNUSED__)
+int
+Real_SaveSnapInfo(void *data __UNUSED__)
 {
    Snapshot           *sn;
    int                 j;
@@ -1094,12 +1095,12 @@
    FILE               *f;
 
    if (!Mode.wm.save_ok)
-      return;
+      goto done;
 
    Etmp(s);
    f = fopen(s, "w");
    if (!f)
-      return;
+      goto done;
 
    ECORE_LIST_FOR_EACH(ss_list, sn)
    {
@@ -1167,6 +1168,10 @@
       Alert(_("Error saving snaps file\n"));
 
    SaveGroups();
+
+ done:
+   TIMER_DEL(ss_timer);
+   return 0;
 }
 
 void
===================================================================
RCS file: /cvs/e/e16/e/src/snaps.h,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -3 -r1.9 -r1.10
--- snaps.h     18 May 2007 08:25:06 -0000      1.9
+++ snaps.h     24 May 2008 18:13:17 -0000      1.10
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2005-2007 Kim Woelders
+ * Copyright (C) 2005-2008 Kim Woelders
  *
  * Permission is hereby granted, free of charge, to any person obtaining a copy
  * of this software and associated documentation files (the "Software"), to
@@ -51,7 +51,7 @@
 
 #define SNAP_USE_ALL            (~1)
 
-void                Real_SaveSnapInfo(int dumval, void *dumdat);
+int                 Real_SaveSnapInfo(void *data);
 void                LoadSnapInfo(void);
 void                SaveSnapInfo(void);
 void                SpawnSnappedCmds(void);
===================================================================
RCS file: /cvs/e/e16/e/src/timers.c,v
retrieving revision 1.37
retrieving revision 1.38
diff -u -3 -r1.37 -r1.38
--- timers.c    10 May 2008 23:15:32 -0000      1.37
+++ timers.c    24 May 2008 18:13:17 -0000      1.38
@@ -26,14 +26,15 @@
 #include "timers.h"
 #include <sys/time.h>
 
-typedef struct _qentry Qentry;
-struct _qentry {
-   char               *name;
+#define DEBUG_TIMERS 0
+
+struct _timer {
+   double              in_time;
    double              at_time;
-   void                (*func) (int val, void *data);
-   struct _qentry     *next;
-   int                 runtime_val;
-   void               *runtime_data;
+   struct _timer      *next;
+   int                 (*func) (void *data);
+   void               *data;
+   char                again;
 };
 
 double
@@ -45,98 +46,155 @@
    return (double)timev.tv_sec + (((double)timev.tv_usec) / 1000000);
 }
 
-static Qentry      *q_first = NULL;
+static Timer       *q_first = NULL;
 
-void
-DoIn(const char *name, double in_time, void (*func) (int val, void *data),
-     int runtime_val, void *runtime_data)
+static void
+_TimerSet(Timer * timer)
 {
-   Qentry             *qe, *ptr, *pptr;
-
-   RemoveTimerEvent(name);
-   qe = EMALLOC(Qentry, 1);
-   if (!qe)
-      return;
-
-   if (in_time < 0.)           /* No negative in-times */
-      in_time = 0.;
+   Timer              *ptr, *pptr;
 
+#if DEBUG_TIMERS
    if (EDebug(EDBUG_TYPE_TIMERS))
-      Eprintf("DoIn %8.3f: %s\n", in_time, name);
-
-   qe->name = Estrdup(name);
-   qe->func = func;
-   qe->at_time = GetTime() + in_time;
-   qe->runtime_val = runtime_val;
-   qe->runtime_data = runtime_data;
+      Eprintf("_TimerSet %p: func=%p data=%p\n", timer, timer->func,
+             timer->data);
+#endif
 
    /* if there is no queue it becomes the queue */
    if (!q_first)
      {
-       q_first = qe;
-       qe->next = NULL;
+       q_first = timer;
+       timer->next = NULL;
      }
    else
      {
        pptr = NULL;
        for (ptr = q_first; ptr; pptr = ptr, ptr = ptr->next)
          {
-            if (ptr->at_time > qe->at_time)
+            if (ptr->at_time > timer->at_time)
                break;
          }
        if (pptr)
-          pptr->next = qe;
+          pptr->next = timer;
        else
-          q_first = qe;
-       qe->next = ptr;
+          q_first = timer;
+       timer->next = ptr;
      }
 }
 
+static void
+_TimerDel(Timer * timer)
+{
+#if DEBUG_TIMERS
+   if (EDebug(EDBUG_TYPE_TIMERS))
+      Eprintf("_TimerDel %p: func=%p data=%p\n", timer, timer->func,
+             timer->data);
+#endif
+   Efree(timer);
+}
+
+Timer              *
+TimerAdd(double in_time, int (*func) (void *data), void *data)
+{
+   Timer              *timer;
+
+   timer = EMALLOC(Timer, 1);
+   if (!timer)
+      return NULL;
+
+   if (in_time < 0.)           /* No negative in-times */
+      in_time = 0.;
+
+   if (EDebug(EDBUG_TYPE_TIMERS))
+      Eprintf("TimerAdd %p: func=%p data=%p: %8.3f\n", timer,
+             timer->func, timer->data, in_time);
+
+   timer->func = func;
+   timer->in_time = in_time;
+   timer->at_time = GetTime() + in_time;
+   timer->data = data;
+
+   _TimerSet(timer);           /* Add to timer queue */
+
+   return timer;
+}
+
 double
 TimersRun(double tt)
 {
-   Qentry             *qe;
+   Timer              *timer, *q_old, *q_run;
    double              t;
 
-   qe = q_first;
+   timer = q_first;
    if (!q_first)
       return 0.;               /* No timers pending */
 
    t = tt;
    if (t <= 0.)
-      t = qe->at_time;
+      t = timer->at_time;
 
-   for (; qe; qe = q_first)
+   q_run = NULL;
+   q_old = q_first;
+   for (; timer; timer = q_first)
      {
-       if (qe->at_time > t + 200e-6)   /* Within 200 us is close enough */
+       if (timer->at_time > t + 200e-6)        /* Within 200 us is close 
enough */
           break;
 
        if (EDebug(EDBUG_TYPE_TIMERS))
-          Eprintf("TimersRun - run %8.3lf: %s\n", qe->at_time - t, qe->name);
+          Eprintf("TimersRun - run %p: func=%p data=%p: %8.3lf\n", timer,
+                  timer->func, timer->data, timer->at_time - t);
 
-       /* remove it */
-       q_first = qe->next;
+       q_first = timer->next;
 
-       /* run this callback */
-       qe->func(qe->runtime_val, qe->runtime_data);
+       /* Run this callback */
+       timer->again = timer->func(timer->data);
+       q_run = timer;
+     }
 
-       /* free the timer */
-       Efree(qe->name);
-       Efree(qe);
+   if (q_old != q_first)
+     {
+       /* At least one timer has run */
+       q_run->next = NULL;     /* Terminate expired timer list */
+
+       /* Re-schedule/remove timers that have run */
+       for (timer = q_old; timer; timer = q_old)
+         {
+            q_old = timer->next;
+            if (timer->again)
+              {
+                 timer->at_time += timer->in_time;
+                 _TimerSet(timer);     /* Add to timer queue */
+              }
+            else
+              {
+                 _TimerDel(timer);
+              }
+         }
      }
 
    if (tt <= 0.)               /* Avoid some redundant debug output */
       return tt;
 
+   timer = q_first;
+
    if (EDebug(EDBUG_TYPE_TIMERS) > 1)
      {
-       Qentry             *qp;
+       Timer              *qp;
 
-       for (qp = qe; qp; qp = qp->next)
-          Eprintf("TimersRun - pend %8.3lf: %s\n", qp->at_time - t, qp->name);
+       for (qp = timer; qp; qp = qp->next)
+          Eprintf("TimersRun - pend %p: func=%p data=%p: %8.3lf\n", timer,
+                  timer->func, timer->data, timer->at_time - t);
      }
 
-   t = (qe) ? qe->at_time - t : 0.;
+   if (timer)
+     {
+       t = timer->at_time - t;
+       if (t <= 0.)
+          t = 1e-6;
+     }
+   else
+     {
+       t = 0.;
+     }
 
    if (EDebug(EDBUG_TYPE_TIMERS))
       Eprintf("TimersRun - next in %8.3lf\n", t);
@@ -145,15 +203,15 @@
 }
 
 int
-RemoveTimerEvent(const char *name)
+TimerDel(Timer * timer)
 {
-   Qentry             *qe, *ptr, *pptr;
+   Timer              *qe, *ptr, *pptr;
 
    pptr = NULL;
    for (ptr = q_first; ptr; pptr = ptr, ptr = ptr->next)
      {
        qe = ptr;
-       if (strcmp(qe->name, name))
+       if (qe != timer)
           continue;
 
        /* Match - remove it from the queue */
@@ -161,9 +219,10 @@
           pptr->next = qe->next;
        else
           q_first = qe->next;
+
        /* free it */
-       Efree(qe->name);
-       Efree(qe);
+       _TimerDel(timer);
+
        /* done */
        return 1;
      }
@@ -171,6 +230,12 @@
    return 0;
 }
 
+void
+TimerSetInterval(Timer * timer, double dt)
+{
+   timer->in_time = dt;
+}
+
 /*
  * Idlers
  */
@@ -232,6 +297,7 @@
  */
 #define DEBUG_ANIMATORS 0
 static Ecore_List  *animator_list = NULL;
+static Timer       *animator_timer = NULL;
 
 typedef int         (AnimatorFunc) (void *data);
 
@@ -254,13 +320,21 @@
       AnimatorDel(an);
 }
 
-static void
-AnimatorsRun(int val __UNUSED__, void *data __UNUSED__)
+static int
+AnimatorsRun(void *data __UNUSED__)
 {
    ecore_list_for_each(animator_list, _AnimatorRun, NULL);
 
    if (ecore_list_count(animator_list))
-      DoIn("Anim", 1e-3 * Conf.animation.step, AnimatorsRun, 0, NULL);
+     {
+       TimerSetInterval(animator_timer, 1e-3 * Conf.animation.step);
+       return 1;
+     }
+   else
+     {
+       animator_timer = NULL;
+       return 0;
+     }
 }
 
 Animator           *
@@ -288,7 +362,8 @@
        if (Conf.animation.step <= 0)
           Conf.animation.step = 1;
        /* Animator list was empty - Add to timer qeueue */
-       DoIn("Anim", 1e-3 * Conf.animation.step, AnimatorsRun, 0, NULL);
+       TIMER_ADD(animator_timer, 1e-3 * Conf.animation.step,
+                 AnimatorsRun, NULL);
      }
 
    return an;
@@ -306,7 +381,7 @@
 
    if (ecore_list_count(animator_list) == 0)
      {
-       /* Animator list was empty - Add to timer qeueue */
-       RemoveTimerEvent("Anim");
+       /* Animator list is empty - Remove from timer qeueue */
+       TIMER_DEL(animator_timer);
      }
 }
===================================================================
RCS file: /cvs/e/e16/e/src/timers.h,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -3 -r1.5 -r1.6
--- timers.h    10 May 2008 23:15:32 -0000      1.5
+++ timers.h    24 May 2008 18:13:17 -0000      1.6
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2000-2007 Carsten Haitzler, Geoff Harrison and various 
contributors
- * Copyright (C) 2004-2007 Kim Woelders
+ * Copyright (C) 2004-2008 Kim Woelders
  *
  * Permission is hereby granted, free of charge, to any person obtaining a copy
  * of this software and associated documentation files (the "Software"), to
@@ -27,11 +27,17 @@
 /* timers.c */
 double              GetTime(void);
 
-void                DoIn(const char *name, double in_time,
-                        void (*func) (int val, void *data),
-                        int runtime_val, void *runtime_data);
-int                 RemoveTimerEvent(const char *name);
+typedef struct _timer Timer;
+Timer              *TimerAdd(double in_time,
+                            int (*func) (void *data), void *data);
+int                 TimerDel(Timer * timer);
+void                TimerSetInterval(Timer * timer, double dt);
 double              TimersRun(double t);
+
+#define TIMER_ADD(timer, in, func, prm) \
+   timer = TimerAdd(in, func, prm)
+#define TIMER_DEL(timer) \
+   if (timer) { TimerDel(timer); timer = NULL; }
 
 typedef struct _idler Idler;
 Idler              *IdlerAdd(void (*func) (void *data), void *data);
===================================================================
RCS file: /cvs/e/e16/e/src/tooltips.c,v
retrieving revision 1.126
retrieving revision 1.127
diff -u -3 -r1.126 -r1.127
--- tooltips.c  10 May 2008 23:29:01 -0000      1.126
+++ tooltips.c  24 May 2008 18:13:17 -0000      1.127
@@ -36,6 +36,7 @@
 #include "xwin.h"
 
 static Ecore_List  *tt_list = NULL;
+static Timer       *tt_timer = NULL;
 
 static struct {
    char                enable;
@@ -714,8 +715,8 @@
 
 static ToolTip     *ttip = NULL;
 
-static void
-ToolTipTimeout(int val __UNUSED__, void *data __UNUSED__)
+static int
+ToolTipTimeout(void *data __UNUSED__)
 {
    int                 x, y;
    unsigned int        mask;
@@ -725,33 +726,37 @@
    if (!ttip)
       ttip = TooltipFind("DEFAULT");
    if (!ttip)
-      return;
+      goto done;
 
    /* In the case of multiple screens, check to make sure
     * the root window is still where the mouse is... */
    if (!EQueryPointer(NULL, &x, &y, NULL, &mask))
-      return;
+      goto done;
 
    /* In case this is a virtual root */
    if (x < 0 || y < 0 || x >= WinGetW(VROOT) || y >= WinGetH(VROOT))
-      return;
+      goto done;
 
    /* dont pop up tooltip is mouse button down */
    if (mask &
        (Button1Mask | Button2Mask | Button3Mask | Button4Mask | Button5Mask))
-      return;
+      goto done;
 
    if (!Mode_tooltips.ac_func)
-      return;
+      goto done;
    ac = Mode_tooltips.ac_func(Mode_tooltips.ac_data);
    if (!ac)
-      return;
+      goto done;
 
    tts = ActionclassGetTooltipString(ac);
    if (!tts)
-      return;
+      goto done;
 
    TooltipShow(ttip, _(tts), ac, x, y);
+
+ done:
+   tt_timer = NULL;
+   return 0;
 }
 
 /*
@@ -769,7 +774,7 @@
 
    TooltipHide(ttip);
 
-   RemoveTimerEvent("TOOLTIP_TIMEOUT");
+   TIMER_DEL(tt_timer);
 
    if (Conf_tooltips.showroottooltip)
      {
@@ -795,8 +800,7 @@
    if (type && !Conf_tooltips.showroottooltip)
       return;
 
-   DoIn("TOOLTIP_TIMEOUT", 0.001 * Conf_tooltips.delay, ToolTipTimeout, 0,
-       NULL);
+   TIMER_ADD(tt_timer, 0.001 * Conf_tooltips.delay, ToolTipTimeout, NULL);
 }
 
 /*
===================================================================
RCS file: /cvs/e/e16/e/src/util.h,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -3 -r1.16 -r1.17
--- util.h      8 Mar 2008 19:23:54 -0000       1.16
+++ util.h      24 May 2008 18:13:17 -0000      1.17
@@ -27,6 +27,9 @@
 #include "config.h"
 #include <stdarg.h>
 
+#define INT2PTR(i) ((void*)(long)(i))
+#define PTR2INT(p) ((int)(long)(p))
+
 /* Inspired by Xfuncproto.h */
 #if defined(__GNUC__) && ((__GNUC__ * 100 + __GNUC_MINOR__) >= 303)
 # define __EXPORT__      __attribute__((visibility("default")))



-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to