yoz pushed a commit to branch master.

commit 13ea3f533ab69ffe7fd14f73bfaf4b80d2220b50
Author: Michael Bouchaud <[email protected]>
Date:   Wed Sep 4 02:10:38 2013 +0200

    entrance: add login error on wrong password
---
 data/themes/default/default.edc | 89 +++++++++++++++++++++++------------------
 src/bin/entrance_client.c       |  9 +++--
 src/bin/entrance_connect.c      | 53 +++++++++++++++++++-----
 src/bin/entrance_connect.h      |  5 +++
 src/bin/entrance_fill.c         |  2 +-
 src/bin/entrance_gui.c          | 67 ++++++++++++++-----------------
 src/bin/entrance_login.c        | 67 ++++++++++++++++++++++++++++---
 src/bin/entrance_login.h        |  2 +-
 8 files changed, 196 insertions(+), 98 deletions(-)

diff --git a/data/themes/default/default.edc b/data/themes/default/default.edc
index 82c3d7e..8603045 100644
--- a/data/themes/default/default.edc
+++ b/data/themes/default/default.edc
@@ -92,7 +92,7 @@ collections {
                visible: 1;
             }
          }
-         part { name: "entrance.login";
+         part { name: "entrance.screen";
             type: SWALLOW;
             description { state: "default" 0.0;
                visible: 1;
@@ -196,32 +196,6 @@ collections {
             }
          }
 /*
-         part { name: "entrance.error";
-            type: TEXT;
-            mouse_events: 0;
-            effect: SOFT_SHADOW;
-            scale: 1;
-            description { state: "default" 0.0;
-               color: 255 255 255 0;
-               fixed: 1 1;
-               rel1.to_y: "entrance.xsessions";
-               rel1.relative: 0.0 1.0;
-               align: 0.5 0.0;
-               text {
-                  text: "Error on login ! Maybe wrong password ?";
-                  font: "Sans";
-                  size: 18;
-                  min: 1 1;
-                  align: 0.5 0.5;
-               }
-            }
-            description { state: "visible" 0.0;
-               inherit: "default" 0.0;
-               rel1.offset: 0 50;
-               rel2.offset: 0 50;
-               color: 255 255 255 255;
-            }
-         }
 */
       }
       programs {
@@ -275,6 +249,18 @@ collections {
       name : "entrance/login";
       parts {
          part {
+            name: "error";
+            type: RECT;
+            description { state: "default" 0.0;
+               color: 255 0 0 96;
+               visible: 0;
+            }
+            description { state: "visible" 0.0;
+               inherit: "default" 0.0;
+               visible: 1;
+            }
+         }
+         part {
             name: "entrance.login";
             type: SWALLOW;
             repeat_events: 0;
@@ -293,7 +279,6 @@ collections {
             name: "entrance.password";
             type: SWALLOW;
             repeat_events: 0;
-            source: "entrance/entry/password";
             description {
                state: "default" 0.0;
                min: 140 0;
@@ -316,9 +301,39 @@ collections {
                visible: 1;
             }
          }
+         part { name: "entrance.error";
+            type: TEXT;
+            mouse_events: 0;
+            effect: SOFT_SHADOW;
+            scale: 1;
+            description { state: "default" 0.0;
+               visible: 0;
+               color: 255 255 255 0;
+               fixed: 1 1;
+               rel1.to_y: "entrance.xsessions";
+               rel1.relative: 0.0 1.0;
+               align: 0.5 0.0;
+               rel1.offset: 0 50;
+               rel2.offset: -1 51;
+               text {
+                  text: "Error on login ! Maybe wrong password ?";
+                  font: "Sans";
+                  size: 18;
+                  min: 1 1;
+                  align: 0.5 0.5;
+               }
+            }
+            description { state: "visible" 0.0;
+               inherit: "default" 0.0;
+               visible: 1;
+               color: 255 255 255 255;
+            }
+         }
 
       /*
+       *
        * PROGRAMS
+       *
        */
       programs {
          program {
@@ -335,30 +350,24 @@ collections {
             action: STATE_SET "default" 0.0;
             target: "entrance.xsessions";
          }
-      }
-
-      /*
-       *
-       * PROGRAMS
-       *
-
-      programs {
          program {
             name: "login_error";
             signal: "entrance,auth,error";
             source: "";
             action: STATE_SET "visible" 0.0;
-            transition: DECELERATE 0.2;
+            target: "error";
             target: "entrance.error";
          }
          program {
             name: "login_change";
-            signal: "entrance.auth.change";
+            signal: "entrance,auth,changed";
             source: "";
             action: STATE_SET "default" 0.0;
-            transition: ACCELERATE 0.4;
+            target: "error";
             target: "entrance.error";
          }
+      }
+/*
 
          program {
             name: "auth_enable";
@@ -389,6 +398,8 @@ collections {
             transition: LINEAR 0.7;
             target: "clip";
          }
+ * If you want check auth, emit this signal "entrance.auth.request" ""
+ * Here is an example
          program {
             name: "login_valid";
             signal: "mouse,down,*";
diff --git a/src/bin/entrance_client.c b/src/bin/entrance_client.c
index 1d30835..a757364 100644
--- a/src/bin/entrance_client.c
+++ b/src/bin/entrance_client.c
@@ -60,19 +60,22 @@ main(int argc, char **argv)
    elm_init(argc, argv);
    PT("login init\n");
    entrance_login_init();
-   PT("client init\n");
+   PT("gui init\n");
    if (!entrance_gui_init(theme)) return EXIT_FAILURE;
-   PT("client run\n");
+   PT("connect init\n");
    entrance_connect_init();
    elm_run();
+   PT("connect shutdown\n");
    entrance_connect_shutdown();
-   PT("_client: client shutdown\n");
+   PT("gui shutdown\n");
    entrance_gui_shutdown();
+   PT("login shutdown\n");
    entrance_login_shutdown();
    elm_shutdown();
    ecore_x_shutdown();
    ecore_shutdown();
    eina_shutdown();
+   PT("exit\n");
    return EXIT_SUCCESS;
 }
 
diff --git a/src/bin/entrance_connect.c b/src/bin/entrance_connect.c
index 95a804f..820eec9 100644
--- a/src/bin/entrance_connect.c
+++ b/src/bin/entrance_connect.c
@@ -1,13 +1,19 @@
 #include <Ecore_Con.h>
 #include "entrance_client.h"
 
+typedef struct
+{
+   Entrance_Connect_Auth_Cb func;
+   void *data;
+} Entrance_Connect_Auth;
 
 static Eina_Bool _entrance_connect_add(void *data, int type, void *event);
 static Eina_Bool _entrance_connect_del(void *data, int type, void *event);
 static Eina_Bool _entrance_connect_data(void *data, int type, void *event);
 
-Ecore_Con_Server *_entrance_connect;
-Eina_List *_handlers;
+static Ecore_Con_Server *_entrance_connect;
+static Eina_List *_handlers = NULL;
+static Eina_List *_auth_list = NULL;
 
 static Eina_Bool
 _entrance_connect_add(void *data __UNUSED__, int type __UNUSED__, void *event 
__UNUSED__)
@@ -36,6 +42,19 @@ _entrance_connect_data(void *data __UNUSED__, int type 
__UNUSED__, void *event)
    return ECORE_CALLBACK_RENEW;
 }
 
+static void
+_entrance_connect_auth(Eina_Bool granted)
+{
+   Entrance_Connect_Auth *auth;
+   Eina_List *l, *ll;
+
+   EINA_LIST_FOREACH_SAFE(_auth_list, l, ll, auth)
+     {
+        if (auth->func)
+          auth->func(auth->data, granted);
+     }
+}
+
 static Eina_Bool
 _entrance_connect_read_cb(const void *data, size_t size EINA_UNUSED, void 
*user_data EINA_UNUSED)
 {
@@ -46,15 +65,10 @@ _entrance_connect_read_cb(const void *data, size_t size 
EINA_UNUSED, void *user_
         if (eev->type == ENTRANCE_EVENT_STATUS)
           {
              if (eev->event.status.granted)
-               {
-                  PT("Auth granted :)\n");
-                  entrance_gui_auth_valid();
-               }
+               PT("Auth granted :)\n");
              else
-               {
-                  PT("Auth error :(\n");
-                  entrance_gui_auth_error();
-               }
+               PT("Auth error :(\n");
+             _entrance_connect_auth(eev->event.status.granted);
           }
         else if (eev->type == ENTRANCE_EVENT_MAXTRIES)
           {
@@ -135,6 +149,24 @@ entrance_connect_conf_send(Entrance_Conf_Gui_Event *ev)
    entrance_event_send(&eev);
 }
 
+void *
+entrance_connect_auth_cb_add(Entrance_Connect_Auth_Cb func, void *data)
+{
+   PT("auth handler add\n");
+   Entrance_Connect_Auth *auth;
+   auth = malloc(sizeof(Entrance_Connect_Auth));
+   auth->func = func;
+   auth->data = data;
+   _auth_list = eina_list_append(_auth_list, auth);
+   return auth;
+}
+
+void
+entrance_connect_auth_cb_del(void *auth)
+{
+   PT("auth handler remove\n");
+   _auth_list = eina_list_remove(_auth_list, auth);
+}
 
 void
 entrance_connect_init()
@@ -165,7 +197,6 @@ void
 entrance_connect_shutdown()
 {
    Ecore_Event_Handler *h;
-   PT("client server shutdown\n");
    EINA_LIST_FREE(_handlers, h)
       ecore_event_handler_del(h);
    entrance_event_shutdown();
diff --git a/src/bin/entrance_connect.h b/src/bin/entrance_connect.h
index e12aa76..9dfed41 100644
--- a/src/bin/entrance_connect.h
+++ b/src/bin/entrance_connect.h
@@ -1,8 +1,13 @@
 #ifndef ENTRANCE_CONNECT_
 #define ENTRANCE_CONNECT_
+
+typedef void (*Entrance_Connect_Auth_Cb)(void *data, Eina_Bool granted);
+
 void entrance_connect_init();
 void entrance_connect_auth_send(const char *login, const char *password, const 
char *session, Eina_Bool open_session);
 void entrance_connect_action_send(unsigned char id);
 void entrance_connect_conf_send(Entrance_Conf_Gui_Event *conf);
+void *entrance_connect_auth_cb_add(Entrance_Connect_Auth_Cb func, void *data);
+void entrance_connect_auth_cb_del(void *list);
 void entrance_connect_shutdown();
 #endif /* ENTRANCE_CONNECT_ */
diff --git a/src/bin/entrance_fill.c b/src/bin/entrance_fill.c
index 2e41139..949ddf8 100644
--- a/src/bin/entrance_fill.c
+++ b/src/bin/entrance_fill.c
@@ -99,7 +99,7 @@ _entrance_fill_gengrid(Evas_Object *obj, Entrance_Fill *ef, 
Eina_List *contents,
 
 ///////////////// HOVERSEL /////////////////////////////
 static void
-_entrance_fill_hoversell_func_cb(void *data, Evas_Object *obj, void 
*event_info)
+_entrance_fill_hoversell_func_cb(void *data EINA_UNUSED, Evas_Object *obj, 
void *event_info)
 {
    Entrance_Fill *ef;
 
diff --git a/src/bin/entrance_gui.c b/src/bin/entrance_gui.c
index 0b3828d..7725dc5 100644
--- a/src/bin/entrance_gui.c
+++ b/src/bin/entrance_gui.c
@@ -14,6 +14,7 @@ static void _entrance_gui_user_del(void *data, Evas_Object 
*obj);
 static void _entrance_gui_actions_populate();
 static void _entrance_gui_conf_clicked_cb(void *data, Evas_Object *obj, void 
*event_info);
 static void _entrance_gui_update(void);
+static void _entrance_gui_auth_cb(void *data, Eina_Bool granted);
 
 
 /*
@@ -118,8 +119,8 @@ entrance_gui_init(const char *theme)
               fprintf(stderr, "%s\n", "entrance");
               return j;
            }
-         elm_object_part_content_set(o, "entrance.login", ol);
-         o = entrance_login_add(ol);
+         elm_object_part_content_set(o, "entrance.screen", ol);
+         o = entrance_login_add(ol, _entrance_gui_auth_cb, screen);
          entrance_login_open_session_set(o, EINA_TRUE);
          screen->login = o;
          elm_object_part_content_set(ol, "entrance.login", o);
@@ -245,40 +246,6 @@ entrance_gui_stringlist_free(Eina_List *list)
       eina_stringshare_del(s);
 }
 
-void
-entrance_gui_auth_valid()
-{
-   Eina_List *l;
-   Entrance_Screen *screen;
-   EINA_LIST_FOREACH(_gui->screens, l, screen)
-     {
-        edje_object_signal_emit(elm_layout_edje_get(screen->edj),
-                                "entrance,auth,valid", "");
-     }
-   /*
-   _gui_login_timeout = ecore_timer_add(10.0,
-                                        _entrance_gui_login_timeout,
-                                        screen);
-                                        */
-}
-
-void
-entrance_gui_auth_error()
-{
-   /*
-   Evas_Object *o;
-   Eina_List *l;
-   Entrance_Screen *screen;
-
-   EINA_LIST_FOREACH(_gui->screens, l, screen)
-     {
-        o = ENTRANCE_GUI_GET(screen->edj, "entrance.password");
-        elm_entry_entry_set(o, "");
-        edje_object_signal_emit(elm_layout_edje_get(screen->edj),
-                                "entrance,auth,error", "");
-     }
-     */
-}
 
 void
 entrance_gui_actions_set(Eina_List *actions)
@@ -329,7 +296,7 @@ entrance_gui_users_set(Eina_List *users)
         ol = ENTRANCE_GUI_GET(screen->edj, "entrance.users");
         if (!ol) continue;
         entrance_fill(ol, ef, users, _entrance_gui_user_sel_cb, screen->login);
-        edje_object_signal_emit(elm_layout_edje_get(screen->edj),
+        elm_object_signal_emit(screen->edj,
                                 "entrance,users,enabled", "");
      }
    _gui->users = users;
@@ -882,6 +849,32 @@ _entrance_gui_actions_populate()
 }
 
 
////////////////////////////////////////////////////////////////////////////////
+static void
+_entrance_gui_auth_cb(void *data, Eina_Bool granted)
+{
+   Eina_List *l;
+   Entrance_Screen *screen;
+
+   EINA_LIST_FOREACH(_gui->screens, l, screen)
+     {
+        if (granted)
+          {
+             elm_object_signal_emit(screen->edj,
+                                    "entrance,auth,valid", "");
+          }
+        else
+          {
+             elm_object_signal_emit(screen->edj,
+                                    "entrance,auth,error", "");
+          }
+     }
+   /*
+      if (granted)
+      _gui_login_timeout = ecore_timer_add(10.0,
+      _entrance_gui_login_timeout,
+      data);
+    */
+}
 
 static Eina_Bool
 _entrance_gui_cb_window_property(void *data EINA_UNUSED, int type EINA_UNUSED, 
void *event_info)
diff --git a/src/bin/entrance_login.c b/src/bin/entrance_login.c
index 5ca8fe3..40a36c6 100644
--- a/src/bin/entrance_login.c
+++ b/src/bin/entrance_login.c
@@ -19,6 +19,7 @@ static void _login_password_focused_cb(void *data, 
Evas_Object *obj, void *event
 static void _login_password_unfocused_cb(void *data, Evas_Object *obj, void 
*event);
 static void _login_login_activated_cb(void *data, Evas_Object *obj, void 
*event);
 static char *_login_xsession_text_get(void *data, Evas_Object *obj, const char 
*part);
+static void _login_auth_cb(void *data, Eina_Bool granted);
 
 static Entrance_Fill *_login_fill;
 
@@ -27,9 +28,16 @@ struct Entrance_Login_
    Ecore_Event_Handler *handler;
    char passwd[ENTRANCE_PASSWD_LEN];
    Entrance_Xsession *session;
+   struct
+     {
+        Entrance_Login_Cb login;
+        void *data;
+     } func;
+   void *auth;
    Eina_Bool open_session : 1;
    Eina_Bool selected : 1;
    Eina_Bool catch : 1;
+   Eina_Bool wait : 1;
 };
 
 #define LOGIN_GET(widget) \
@@ -116,6 +124,9 @@ _login_check_auth(Evas_Object *widget)
 
    o = elm_object_part_content_get(widget, "entrance.login");
    host = elm_entry_markup_to_utf8(elm_object_text_get(o));
+   login->wait = EINA_TRUE;
+   if (!login->auth)
+     login->auth = entrance_connect_auth_cb_add(_login_auth_cb, widget);
    if (login->session)
      entrance_connect_auth_send(host, login->passwd,
                                 login->session->name,
@@ -154,6 +165,13 @@ _login_key_down_cb(void *data, int type EINA_UNUSED, void 
*event)
    LOGIN_GET(data) ECORE_CALLBACK_PASS_ON;
    ev = event;
 
+
+   elm_object_signal_emit(data,
+                          "entrance,auth,changed", "");
+   elm_object_signal_emit(elm_object_part_content_get(data,
+                                                      "entrance.password"),
+                          "entrance,auth,changed", "");
+
    if (!strcmp(ev->key, "KP_Enter"))
      {
         _login_check_auth(data);
@@ -215,7 +233,7 @@ _login_key_down_cb(void *data, int type EINA_UNUSED, void 
*event)
                }
           }
      }
-     return ECORE_CALLBACK_PASS_ON;
+   return ECORE_CALLBACK_PASS_ON;
 }
 
 static Eina_Bool
@@ -276,13 +294,50 @@ _login_xsession_update(Evas_Object *obj)
 }
 
 static void
-_login_xsession_clicked_cb(void *data, Evas_Object *obj, void *event_info)
+_login_xsession_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED, void 
*event_info)
 {
    LOGIN_GET(data);
    login->session = elm_object_item_data_get(event_info);
    _login_xsession_update(data);
 }
 
+static void
+_login_auth_cb(void *data, Eina_Bool granted)
+{
+   LOGIN_GET(data);
+   if (login->wait)
+     {
+        if (login->func.login)
+          login->func.login(login->func.data, granted);
+        login->wait = EINA_FALSE;
+        entrance_connect_auth_cb_del(login->auth);
+        login->auth = NULL;
+        if (!granted)
+          {
+             elm_object_signal_emit(data,
+                                    "entrance,auth,error", "");
+             elm_object_signal_emit(
+                elm_object_part_content_get(data, "entrance.login"),
+                "entrance,auth,error", "login");
+             elm_object_signal_emit(
+                elm_object_part_content_get(data, "entrance.password"),
+                "entrance,auth,error", "password");
+          }
+        else
+          {
+             elm_object_signal_emit(data,
+                                    "entrance,auth,valid", "");
+             elm_object_signal_emit(
+                elm_object_part_content_get(data, "entrance.login"),
+                "entrance,auth,valid", "login");
+             elm_object_signal_emit(
+                elm_object_part_content_get(data, "entrance.password"),
+                "entrance,auth,valid", "password");
+          }
+     }
+}
+
+
 
////////////////////////////////////////////////////////////////////////////////
 
 void
@@ -302,14 +357,16 @@ entrance_login_shutdown(void)
 }
 
 Evas_Object *
-entrance_login_add(Evas_Object *obj)
+entrance_login_add(Evas_Object *obj, Entrance_Login_Cb login_cb, void *data)
 {
    Evas_Object *o, *h, *p;
    Entrance_Login *login;
 
    /* layout */
-   o = entrance_gui_theme_get(obj, "entrance/login");
    login = calloc(1, sizeof(Entrance_Login));
+   login->func.login = login_cb;
+   login->func.data = data;
+   o = entrance_gui_theme_get(obj, "entrance/login");
    evas_object_data_set(o, "entrance", login);
 
 
@@ -376,7 +433,6 @@ void
 entrance_login_session_set(Evas_Object *widget, const char *name)
 {
    Entrance_Xsession *sess;
-   Evas_Object *o;
    const Eina_List *l = NULL;
    LOGIN_GET(widget);
    if (name)
@@ -392,7 +448,6 @@ entrance_login_session_set(Evas_Object *widget, const char 
*name)
      }
    if (l)
      login->session = sess;
-   o = elm_object_part_content_get(widget, "entrance.xsessions");
    _login_xsession_update(widget);
 }
 
diff --git a/src/bin/entrance_login.h b/src/bin/entrance_login.h
index 9fca437..d3c2d80 100644
--- a/src/bin/entrance_login.h
+++ b/src/bin/entrance_login.h
@@ -5,7 +5,7 @@ typedef void (*Entrance_Login_Cb) (void *data, Eina_Bool 
granted);
 
 void entrance_login_init(void);
 void entrance_login_shutdown(void);
-Evas_Object *entrance_login_add(Evas_Object *win);
+Evas_Object *entrance_login_add(Evas_Object *win, Entrance_Login_Cb login_cb, 
void *data);
 void entrance_login_xsessions_populate(Evas_Object *widget, Eina_List 
*xsessions);
 void entrance_login_login_set(Evas_Object *widget, const char *user);
 void entrance_login_session_set(Evas_Object *widget, const char *user);

-- 

------------------------------------------------------------------------------
Learn the latest--Visual Studio 2012, SharePoint 2013, SQL 2012, more!
Discover the easy way to master current and previous Microsoft technologies
and advance your career. Get an incredible 1,500+ hours of step-by-step
tutorial videos with LearnDevNow. Subscribe today and save!
http://pubads.g.doubleclick.net/gampad/clk?id=58040911&iu=/4140/ostg.clktrk

Reply via email to