Enlightenment CVS committal

Author  : kwo
Project : e16
Module  : e

Dir     : e16/e/src


Modified Files:
      Tag: branch-exp
        E.h buttons.c desktops.c ewins.c focus.c grabs.c ipc.c 
        menus-misc.c menus.c moveresize.c 


Log Message:
Merge+fixups.
===================================================================
RCS file: /cvsroot/enlightenment/e16/e/src/E.h,v
retrieving revision 1.314.2.60
retrieving revision 1.314.2.61
diff -u -3 -r1.314.2.60 -r1.314.2.61
--- E.h 19 Nov 2004 21:02:23 -0000      1.314.2.60
+++ E.h 20 Nov 2004 20:48:55 -0000      1.314.2.61
@@ -1314,7 +1314,7 @@
 void                ButtonToggle(Button * b);
 void                ButtonDraw(Button * b);
 void                ButtonDrawWithState(Button * b, int state);
-void                ButtonMoveToDesktop(Button * b, int num);
+void                ButtonMoveToDesktop(Button * b, int desk);
 void                ButtonMoveToCoord(Button * b, int x, int y);
 void                ButtonMoveRelative(Button * b, int dx, int dy);
 void                ButtonIncRefcount(Button * b);
@@ -1331,8 +1331,9 @@
 int                 ButtonGetWidth(const Button * b);
 int                 ButtonGetHeight(const Button * b);
 int                 ButtonIsFixed(const Button * b);
-int                 ButtonIsSticky(const Button * b);
+int                 ButtonIsInternal(const Button * b);
 int                 ButtonIsAbove(const Button * b, int desk);
+int                 ButtonIsNormal(const Button * b, int desk);
 int                 ButtonIsBelow(const Button * b, int desk);
 int                 ButtonDoShowDefault(const Button * b);
 int                 ButtonEmbedWindow(Button * ButtonToUse,
@@ -1407,6 +1408,7 @@
 Window              DeskGetCurrentRoot(void);
 void                DeskSetCurrentArea(int ax, int ay);
 int                 DesksGetNumber(void);
+int                 DesksGetTotal(void);
 int                 DesksGetCurrent(void);
 void                DesksSetCurrent(int desk);
 
@@ -1575,11 +1577,11 @@
 #define EDBUG_TYPE_SESSION      134
 #define EDBUG_TYPE_SNAPS        135
 #define EDBUG_TYPE_DESKS        136
-#define EDBUG_TYPE_DISPATCH     137
-#define EDBUG_TYPE_MODULES      138
-#define EDBUG_TYPE_CONFIG       139
-#define EDBUG_TYPE_IPC          140
-#define EDBUG_TYPE_GRABS        141
+#define EDBUG_TYPE_GRABS        137
+#define EDBUG_TYPE_DISPATCH     138
+#define EDBUG_TYPE_MODULES      139
+#define EDBUG_TYPE_CONFIG       140
+#define EDBUG_TYPE_IPC          141
 #define EDBUG_TYPE_EVENTS       142
 int                 EventDebug(unsigned int type);
 #else
===================================================================
RCS file: /cvsroot/enlightenment/e16/e/src/buttons.c,v
retrieving revision 1.36.2.16
retrieving revision 1.36.2.17
diff -u -3 -r1.36.2.16 -r1.36.2.17
--- buttons.c   19 Nov 2004 21:02:25 -0000      1.36.2.16
+++ buttons.c   20 Nov 2004 20:48:56 -0000      1.36.2.17
@@ -111,6 +111,8 @@
    EoSetLayer(b, ontop);
    b->flags = flags;
    EoSetSticky(b, sticky);
+   if (sticky && ontop == 1)
+      desk = 0;
    b->o.desk = desk;
    b->visible = 0;
    b->geom.width.min = minw;
@@ -300,6 +302,8 @@
 
    EDBUG(3, "ButtonMoveToDesktop");
 
+   if (EoIsSticky(b) && EoGetLayer(b) == 1)
+      desk = 0;
    pdesk = EoGetDesk(b);
    desk = EoSetDesk(b, desk);
 
@@ -529,23 +533,27 @@
 }
 
 int
-ButtonIsSticky(const Button * b)
+ButtonIsInternal(const Button * b)
 {
-   return !b->internal && EoIsSticky(b);
+   return b->internal;
 }
 
 int
 ButtonIsAbove(const Button * b, int desk)
 {
-   return !b->internal && !EoIsSticky(b) && EoGetDesk(b) == desk
-      && EoGetLayer(b) > 0;
+   return !b->internal && EoGetDesk(b) == desk && EoGetLayer(b) > 0;
+}
+
+int
+ButtonIsNormal(const Button * b, int desk)
+{
+   return !b->internal && EoGetDesk(b) == desk && EoGetLayer(b) == 0;
 }
 
 int
 ButtonIsBelow(const Button * b, int desk)
 {
-   return !b->internal && !EoIsSticky(b) && EoGetDesk(b) == desk
-      && EoGetLayer(b) < 0;
+   return !b->internal && EoGetDesk(b) == desk && EoGetLayer(b) < 0;
 }
 
 int
@@ -993,8 +1001,9 @@
             break;
          case BUTTON_DESK:
             desk = atoi(s2);
+            desk = ((unsigned int)desk) % DesksGetTotal();
             if (pbt)
-               EoSetDesk(pbt, desk);
+               ButtonMoveToDesktop(pbt, desk);
             break;
          case BUTTON_STICKY:
             sticky = atoi(s2);
@@ -1224,8 +1233,8 @@
        for (i = 0; i < num; i++)
          {
             b = lst[i];
-            IpcPrintf("%2d %2d %2d %5d+%5d %5dx%5d %s\n",
-                      EoGetDesk(b), EoIsSticky(b), EoGetLayer(b),
+            IpcPrintf("%#lx %2d %2d %2d %5d+%5d %5dx%5d %s\n",
+                      EoGetWin(b), EoGetDesk(b), EoIsSticky(b), EoGetLayer(b),
                       EoGetX(b), EoGetY(b), EoGetW(b), EoGetH(b),
                       ButtonGetName(lst[i]));
          }
===================================================================
RCS file: /cvsroot/enlightenment/e16/e/src/desktops.c,v
retrieving revision 1.95.2.27
retrieving revision 1.95.2.28
diff -u -3 -r1.95.2.27 -r1.95.2.28
--- desktops.c  19 Nov 2004 21:02:26 -0000      1.95.2.27
+++ desktops.c  20 Nov 2004 20:48:56 -0000      1.95.2.28
@@ -130,6 +130,12 @@
 }
 
 int
+DesksGetTotal(void)
+{
+   return ENLIGHTENMENT_CONF_NUM_DESKTOPS;
+}
+
+int
 DesksGetCurrent(void)
 {
    return desks.current;
@@ -757,11 +763,10 @@
 static void
 MoveStickyWindowsToCurrentDesk(void)
 {
-   EWin               *const *lst, *ewin, *last_ewin;
+   EWin               *const *lst, *ewin;
    int                 i, num;
 
    lst = EwinListGetStacking(&num);
-   last_ewin = NULL;
    for (i = 0; i < num; i++)
      {
        ewin = lst[i];
@@ -774,7 +779,23 @@
        EMoveWindow(disp, EoGetWin(ewin), EoGetX(ewin), EoGetY(ewin));
        HintsSetWindowArea(ewin);
        HintsSetWindowDesktop(ewin);
-       last_ewin = ewin;
+     }
+}
+
+static void
+MoveStickyButtonsToCurrentDesk(void)
+{
+   Button            **lst, *btn;
+   int                 i, num;
+
+   lst = (Button **) ListItemType(&num, LIST_TYPE_BUTTON);
+   for (i = 0; i < num; i++)
+     {
+       btn = lst[i];
+       if (ButtonIsInternal(btn) || !EoIsSticky((EWin *) btn))
+          continue;
+
+       ButtonMoveToDesktop(btn, desks.current);
      }
 }
 
@@ -1004,6 +1025,7 @@
    StackDesktops();
    desks.current = desk;
    MoveStickyWindowsToCurrentDesk();
+   MoveStickyButtonsToCurrentDesk();
    StackDesktop(DesksGetCurrent());
    FocusNewDesk();
 #if 0                          /* FIXME - TBD */
@@ -1032,6 +1054,7 @@
    StackDesktops();
    desks.current = desks.order[0];
    MoveStickyWindowsToCurrentDesk();
+   MoveStickyButtonsToCurrentDesk();
    StackDesktop(DesksGetCurrent());
 #if 0                          /* FIXME - TBD */
    ModulesSignal(ESIGNAL_DESK_SWITCH_DONE, NULL);
@@ -1127,67 +1150,64 @@
     */
 
 #if 1                          /* FIXME - Somehow */
-   wl2 = ProgressbarsListWindows(&wnum);
-   if (wl2)
-     {
-       for (i = 0; i < wnum; i++)
-          _APPEND_TO_WIN_LIST(wl2[i]);
-       Efree(wl2);
-     }
-   if (init_win_ext)
-     {
-       _APPEND_TO_WIN_LIST(init_win_ext);
-     }
-   if (init_win1)
+   if (desk == 0)
      {
-       _APPEND_TO_WIN_LIST(init_win1);
-       _APPEND_TO_WIN_LIST(init_win2);
+       wl2 = ProgressbarsListWindows(&wnum);
+       if (wl2)
+         {
+            for (i = 0; i < wnum; i++)
+               _APPEND_TO_WIN_LIST(wl2[i]);
+            Efree(wl2);
+         }
+       if (init_win_ext)
+         {
+            _APPEND_TO_WIN_LIST(init_win_ext);
+         }
+       if (init_win1)
+         {
+            _APPEND_TO_WIN_LIST(init_win1);
+            _APPEND_TO_WIN_LIST(init_win2);
+         }
      }
 #endif
 
    lst = EwinListGetStacking(&wnum);
    blst = (Button **) ListItemType(&bnum, LIST_TYPE_BUTTON);
 
-   /* Sticky buttons */
-   for (i = 0; i < bnum; i++)
-     {
-       if (ButtonIsSticky(blst[i]))
-          _APPEND_TO_WIN_LIST(ButtonGetWindow(blst[i]));
-     }
-
    /* Floating EWins */
-   if (lst)
-     {
-       for (i = 0; i < wnum; i++)
-         {
-            if (!EoIsFloating(lst[i]))
-               continue;
-
-            _APPEND_TO_WIN_LIST(EoGetWin(lst[i]));
-         }
-     }
-
-   /* The virtual desktop windows */
-   for (i = 0; i < ENLIGHTENMENT_CONF_NUM_DESKTOPS; i++)
+   for (i = 0; i < wnum; i++)
      {
-       if (desks.order[i] == 0)
-          break;
+       ewin = lst[i];
+       if (!EoIsFloating(lst[i]) || EoGetDesk(ewin) != desk)
+          continue;
 
-       _APPEND_TO_WIN_LIST(desks.desk[desks.order[i]].win);
+       _APPEND_TO_WIN_LIST(EoGetWin(lst[i]));
      }
 
-   /* Non-sticky, "above" buttons */
+   /* "Above" buttons */
    for (i = 0; i < bnum; i++)
      {
        if (ButtonIsAbove(blst[i], desk))
           _APPEND_TO_WIN_LIST(ButtonGetWindow(blst[i]));
      }
 
+   if (desk == 0)
+     {
+       /* The virtual desktop windows */
+       for (i = 0; i < ENLIGHTENMENT_CONF_NUM_DESKTOPS; i++)
+         {
+            if (desks.order[i] == 0)
+               break;
+
+            _APPEND_TO_WIN_LIST(desks.desk[desks.order[i]].win);
+         }
+     }
+
    /* Normal EWins on this desk */
    for (i = 0; i < wnum; i++)
      {
        ewin = lst[i];
-       if (EoGetDesk(ewin) != desk || EoIsFloating(ewin))
+       if (EoIsFloating(ewin) || EoGetDesk(ewin) != desk)
           continue;
 
        _APPEND_TO_WIN_LIST(EoGetWin(ewin));
@@ -1197,15 +1217,19 @@
 #endif
      }
 
-   /* Non-sticky, "below" buttons */
+   /* "Normal" buttons */
    for (i = 0; i < bnum; i++)
      {
-       if (ButtonIsBelow(blst[i], desk))
+       if (ButtonIsNormal(blst[i], desk))
           _APPEND_TO_WIN_LIST(ButtonGetWindow(blst[i]));
      }
 
-   /* The current (virtual) root window */
-   _APPEND_TO_WIN_LIST(desks.desk[desk].win);
+   /* "Below" buttons */
+   for (i = 0; i < bnum; i++)
+     {
+       if (ButtonIsBelow(blst[i], desk))
+          _APPEND_TO_WIN_LIST(ButtonGetWindow(blst[i]));
+     }
 
    if (EventDebug(EDBUG_TYPE_STACKING))
      {
===================================================================
RCS file: /cvsroot/enlightenment/e16/e/src/Attic/ewins.c,v
retrieving revision 1.1.2.27
retrieving revision 1.1.2.28
diff -u -3 -r1.1.2.27 -r1.1.2.28
--- ewins.c     13 Nov 2004 10:41:56 -0000      1.1.2.27
+++ ewins.c     20 Nov 2004 20:48:56 -0000      1.1.2.28
@@ -618,7 +618,6 @@
    EWin              **lst;
    int                 i, k, num, speed, fx, fy, x, y;
    char                doslide, manplace;
-   char                cangrab = 0;
 
    EDBUG(3, "AddToFamily");
 
@@ -762,18 +761,11 @@
    if ((!ewin->client.transient) && (Conf.place.manual)
        && (!ewin->client.already_placed) && (!Mode.wm.startup) && 
(!Mode.place))
      {
+       char                cangrab;
+
        cangrab = GrabPointerSet(VRoot.win, ECSR_GRAB, 0);
-       if ((cangrab == GrabNotViewable) || (cangrab == AlreadyGrabbed)
-           || (cangrab == GrabFrozen))
-         {
-            XUngrabPointer(disp, CurrentTime);
-            cangrab = 0;
-         }
-       else
-         {
-            manplace = 1;
-            cangrab = 1;
-         }
+       if (cangrab == GrabSuccess)
+          manplace = 1;
      }
 
    /* if it hasn't been placed yet.... find a spot for it */
@@ -794,10 +786,8 @@
             /* the window there */
             GotoDesktop(EoGetDesk(ewin));
 
-            GrabPointerSet(VRoot.win, ECSR_GRAB, 0);
             XQueryPointer(disp, VRoot.win, &root_return, &junk, &rx, &ry, &wx,
                           &wy, &mask);
-            XUngrabPointer(disp, CurrentTime);
             Mode.x = rx;
             Mode.y = ry;
             ewin->client.already_placed = 1;
@@ -833,6 +823,7 @@
        EwinBorderDraw(ewin, 1, 0);
        MoveEwinToDesktopAt(ewin, EoGetDesk(ewin), x, y);
        ecore_x_ungrab();
+       ewin->state = EWIN_STATE_MAPPED;
        EwinIconify(ewin);
        ewin->state = EWIN_STATE_ICONIC;
        EDBUG_RETURN_;
@@ -1897,6 +1888,9 @@
 {
    switch (ev->type)
      {
+     case EnterNotify:
+       FocusHandleEnter(NULL, ev);
+       break;
      case LeaveNotify:
        FocusHandleLeave(NULL, ev);
        break;
===================================================================
RCS file: /cvsroot/enlightenment/e16/e/src/focus.c,v
retrieving revision 1.81.2.9
retrieving revision 1.81.2.10
diff -u -3 -r1.81.2.9 -r1.81.2.10
--- focus.c     13 Nov 2004 10:41:56 -0000      1.81.2.9
+++ focus.c     20 Nov 2004 20:48:57 -0000      1.81.2.10
@@ -246,7 +246,7 @@
      case FOCUS_DESK_ENTER:
        ewin = FocusEwinSelect();
        if (!ewin)
-          EDBUG_RETURN_;
+          goto done;
        break;
 
      case FOCUS_NONE:
@@ -355,7 +355,8 @@
    /* Set new focus window (if any) highlighting */
    if (Mode.focuswin)
       FocusEwinSetActive(Mode.focuswin, 1);
-   ICCCM_Focus(ewin);
+   if (why != FOCUS_DESK_LEAVE)
+      ICCCM_Focus(ewin);
 
    EDBUG_RETURN_;
 }
@@ -406,6 +407,8 @@
 {
    Window              win = ev->xcrossing.window;
 
+   Mode.mouse_over_ewin = ewin;
+
    if (!ewin)
      {
        /* Entering root may mean entering this screen */
@@ -414,9 +417,8 @@
             ev->xcrossing.detail != NotifyInferior))
          {
             FocusToEWin(NULL, FOCUS_DESK_ENTER);
+            return;
          }
-       Mode.mouse_over_ewin = ewin;
-       return;
      }
 
    Mode.mouse_over_ewin = ewin;
@@ -448,7 +450,7 @@
    if (win == VRoot.win &&
        (ev->xcrossing.mode == NotifyNormal &&
        ev->xcrossing.detail != NotifyInferior))
-      FocusToEWin(NULL, FOCUS_SET);
+      FocusToEWin(NULL, FOCUS_DESK_LEAVE);
 }
 
 void
===================================================================
RCS file: /cvsroot/enlightenment/e16/e/src/grabs.c,v
retrieving revision 1.17.2.5
retrieving revision 1.17.2.6
diff -u -3 -r1.17.2.5 -r1.17.2.6
--- grabs.c     10 Oct 2004 11:17:38 -0000      1.17.2.5
+++ grabs.c     20 Nov 2004 20:48:57 -0000      1.17.2.6
@@ -22,6 +22,7 @@
  */
 #include "E.h"
 
+#if 0                          /* Unused */
 void
 GrabButtonsSet(Window win, unsigned int csr)
 {
@@ -34,15 +35,16 @@
    Mode.grabs.pointer_grab_window = win;
    Mode.grabs.pointer_grab_active = 1;
 }
+#endif
 
 int
 GrabPointerSet(Window win, unsigned int csr, int confine)
 {
-   int                 ret;
+   int                 ret = -1;
    Window              confine_to = (confine) ? win : None;
 
    if (Mode.grabs.pointer_grab_active)
-      return 1;
+      goto done;
 
    ret = XGrabPointer(disp, win, False,
                      ButtonPressMask | ButtonReleaseMask | PointerMotionMask |
@@ -52,8 +54,11 @@
 
    Mode.grabs.pointer_grab_window = win;
    Mode.grabs.pointer_grab_active = 1;
+
+ done:
    if (EventDebug(EDBUG_TYPE_GRABS))
-      Eprintf("GrabPointerSet %#lx ok=%d\n", win, ret);
+      Eprintf("GrabPointerSet: %#lx, ret=%d\n", Mode.grabs.pointer_grab_window,
+             ret);
 
    return ret;
 }
@@ -62,14 +67,16 @@
 GrabPointerRelease(void)
 {
    if (!Mode.grabs.pointer_grab_active)
-      return;
+      goto done;
 
    XUngrabPointer(disp, CurrentTime);
 
+ done:
+   if (EventDebug(EDBUG_TYPE_GRABS))
+      Eprintf("GrabPointerRelease: %#lx\n", Mode.grabs.pointer_grab_window);
+
    Mode.grabs.pointer_grab_active = 0;
    Mode.grabs.pointer_grab_window = None;
-   if (EventDebug(EDBUG_TYPE_GRABS))
-      Eprintf("GrabPointerRelease\n");
 }
 
 void
===================================================================
RCS file: /cvsroot/enlightenment/e16/e/src/ipc.c,v
retrieving revision 1.174.2.34
retrieving revision 1.174.2.35
diff -u -3 -r1.174.2.34 -r1.174.2.35
--- ipc.c       19 Nov 2004 21:02:26 -0000      1.174.2.34
+++ ipc.c       20 Nov 2004 20:48:57 -0000      1.174.2.35
@@ -914,17 +914,16 @@
      {
        if (!strcmp(param1, "?"))
          {
-            if (ewin == GetFocusEwin())
-              {
-                 IpcPrintf("focused: yes");
-              }
-            else
-              {
-                 IpcPrintf("focused: no");
-              }
+            IpcPrintf("focused: %s", (ewin == GetFocusEwin())? "yes" : "no");
          }
        else
          {
+            GotoDesktopByEwin(ewin);
+            if (ewin->iconified)
+               EwinOpIconify(ewin, 0);
+            if (ewin->shaded)
+               EwinOpShade(ewin, 0);
+            EwinOpRaise(ewin);
             FocusToEWin(ewin, FOCUS_SET);
          }
      }
===================================================================
RCS file: /cvsroot/enlightenment/e16/e/src/Attic/menus-misc.c,v
retrieving revision 1.1.2.13
retrieving revision 1.1.2.14
diff -u -3 -r1.1.2.13 -r1.1.2.14
--- menus-misc.c        13 Nov 2004 10:41:56 -0000      1.1.2.13
+++ menus-misc.c        20 Nov 2004 20:48:58 -0000      1.1.2.14
@@ -608,7 +608,7 @@
        if (lst[i]->skipwinlist || !EwinGetTitle(lst[i]))
           continue;
 
-       Esnprintf(s, sizeof(s), "focus %lu", lst[i]->client.win);
+       Esnprintf(s, sizeof(s), "wop %#lx focus", lst[i]->client.win);
        mi = MenuItemCreate(EwinGetTitle(lst[i]), NULL, s, NULL);
        MenuAddItem(m, mi);
      }
@@ -674,7 +674,7 @@
                 EoGetDesk(lst[i]) != j)
                continue;
 
-            Esnprintf(s, sizeof(s), "focus %lu", lst[i]->client.win);
+            Esnprintf(s, sizeof(s), "wop %#lx focus", lst[i]->client.win);
             mi = MenuItemCreate(EwinGetTitle(lst[i]), NULL, s, NULL);
             MenuAddItem(mm, mi);
          }
@@ -742,7 +742,7 @@
 
             for (j = 0; j < lst[i]->num_members; j++)
               {
-                 Esnprintf(s, sizeof(s), "focus %lu",
+                 Esnprintf(s, sizeof(s), "wop %#lx focus",
                            lst[i]->members[j]->client.win);
                  mi = MenuItemCreate(EwinGetTitle(lst[i]->members[j]), NULL,
                                      s, NULL);
===================================================================
RCS file: /cvsroot/enlightenment/e16/e/src/menus.c,v
retrieving revision 1.147.2.19
retrieving revision 1.147.2.20
diff -u -3 -r1.147.2.19 -r1.147.2.20
--- menus.c     19 Nov 2004 21:02:43 -0000      1.147.2.19
+++ menus.c     20 Nov 2004 20:48:58 -0000      1.147.2.20
@@ -1027,7 +1027,6 @@
    m = FindItem(name, 0, LIST_FINDBY_NAME, LIST_TYPE_MENU);
    if (m)
      {
-       XUngrabPointer(disp, CurrentTime);
        if (!FindEwinByMenu(m)) /* Don't show if already shown */
           MenuShow(m, 0);
        Mode_menus.list[0] = m;
@@ -1157,8 +1156,6 @@
 
    EDBUG(5, "ShowInternalMenu");
 
-   XUngrabPointer(disp, CurrentTime);
-
    if (!ms)
      {
        ms = FindItem(style, 0, LIST_FINDBY_NAME, LIST_TYPE_MENU_STYLE);
@@ -1411,7 +1408,6 @@
        Mode_menus.list[0] = m;
        Mode_menus.current_depth = 1;
        MenuShowMasker(m);
-       XUngrabPointer(disp, CurrentTime);
        ewin = FindEwinByMenu(m);
        if (ewin)
          {
===================================================================
RCS file: /cvsroot/enlightenment/e16/e/src/moveresize.c,v
retrieving revision 1.22.2.12
retrieving revision 1.22.2.13
diff -u -3 -r1.22.2.12 -r1.22.2.13
--- moveresize.c        13 Nov 2004 10:41:56 -0000      1.22.2.12
+++ moveresize.c        20 Nov 2004 20:48:58 -0000      1.22.2.13
@@ -166,12 +166,7 @@
    Conf.movemode = move_mode_real;
    Mode.nogroup = 0;
    Mode.move.swap = 0;
-
-   if (Mode.have_place_grab)
-     {
-       Mode.have_place_grab = 0;
-       XUngrabPointer(disp, CurrentTime);
-     }
+   Mode.have_place_grab = 0;
 
    ModulesSignal(ESIGNAL_MOVE_DONE, NULL);
 




-------------------------------------------------------
This SF.Net email is sponsored by: InterSystems CACHE
FREE OODBMS DOWNLOAD - A multidimensional database that combines
robust object and relational technologies, making it a perfect match
for Java, C++,COM, XML, ODBC and JDBC. www.intersystems.com/match8
_______________________________________________
enlightenment-cvs mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to