Hello ~ all. 

Shilpa Onkar Singh (in India) made a patch for the password. 

After adapting enveloped patches, please export
ELM_PASSWORD_SHOW_LAST_CHARACTER=1.

Then the last charcter of password will be shown. (You can check this with
"Entry Scrolled" in elementary_test)

Thanks.

Index: src/lib/edje_program.c
===================================================================
--- src/lib/edje_program.c      (revision 55575)
+++ src/lib/edje_program.c      (working copy)
@@ -963,6 +963,13 @@ _edje_program_run(Edje *ed, Edje_Program *pr, Eina
              if (_edje_block_break(ed)) goto break_prog;
           }
         break;
+      case EDJE_ACTION_TYPE_HIDE_VISIBLE_PASSWORD:
+          {
+             Edje_Real_Part *part;
+             part = ed->table_parts[pr->param.dst % ed->table_parts_size];
+             _edje_entry_hide_visible_password(part);
+          }
+        break;
      default:
         // _edje_emit(ed, "program,start", pr->name);
         // _edje_emit(ed, "program,stop", pr->name);
Index: src/lib/edje_private.h
===================================================================
--- src/lib/edje_private.h      (revision 55575)
+++ src/lib/edje_private.h      (working copy)
@@ -358,7 +358,9 @@ typedef struct _Edje_Part_Box_Animation
 #define EDJE_ENTRY_EDIT_MODE_SELECTABLE 1
 #define EDJE_ENTRY_EDIT_MODE_EDITABLE 2
 #define EDJE_ENTRY_EDIT_MODE_PASSWORD 3
+#define EDJE_ENTRY_EDIT_MODE_PASSWORD_SHOW_LAST_CHARACTER 4
 
+
 #define EDJE_ENTRY_SELECTION_MODE_DEFAULT 0
 #define EDJE_ENTRY_SELECTION_MODE_EXPLICIT 1
 
@@ -1731,6 +1733,7 @@ void _edje_lua_script_only_message(Edje *ed, Edje_
 void _edje_entry_init(Edje *ed);
 void _edje_entry_shutdown(Edje *ed);
 void _edje_entry_real_part_init(Edje_Real_Part *rp);
+void _edje_entry_hide_visible_password(Edje_Real_Part *rp);
 void _edje_entry_real_part_shutdown(Edje_Real_Part *rp);
 void _edje_entry_real_part_configure(Edje_Real_Part *rp);
 const char *_edje_entry_selection_get(Edje_Real_Part *rp);
Index: src/lib/Edje.h
===================================================================
--- src/lib/Edje.h      (revision 55575)
+++ src/lib/Edje.h      (working copy)
@@ -144,7 +144,8 @@ typedef enum _Edje_Action_Type
    EDJE_ACTION_TYPE_FOCUS_OBJECT  = 10,
    EDJE_ACTION_TYPE_PARAM_COPY    = 11,
    EDJE_ACTION_TYPE_PARAM_SET     = 12,
-   EDJE_ACTION_TYPE_LAST          = 13
+   EDJE_ACTION_TYPE_HIDE_VISIBLE_PASSWORD = 13, 
+   EDJE_ACTION_TYPE_LAST          = 14
 } Edje_Action_Type;
 
 typedef enum _Edje_Tween_Mode
Index: src/lib/edje_entry.c
===================================================================
--- src/lib/edje_entry.c        (revision 55575)
+++ src/lib/edje_entry.c        (working copy)
@@ -996,6 +996,27 @@ _delete(Evas_Textblock_Cursor *c, Evas_Object *o _
    evas_textblock_cursor_char_delete(c);
 }
 
+void
+_edje_entry_hide_visible_password(Edje_Real_Part *rp)
+{
+   Entry *en = rp->entry_data;
+   const Evas_Object_Textblock_Node_Format *node;
+   node = evas_textblock_node_format_first_get(rp->object);
+   for (; node ; node = evas_textblock_node_format_next_get(node))
+     {
+        const char *text = evas_textblock_node_format_text_get(node);
+        if (text)
+          {
+             if (!strcmp(text, "+ password=off"))
+               {
+                  evas_textblock_node_format_remove_pair(rp->object, 
(Evas_Object_Textblock_Node_Format *)node);
+                  break;
+               }
+          }
+     }
+   _edje_entry_real_part_configure(rp);
+}
+
 static void
 _edje_key_down_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, 
void *event_info)
 {
@@ -1322,9 +1343,20 @@ _edje_key_down_cb(void *data, Evas *e __UNUSED__,
              if (en->have_selection)
                 _range_del(en->cursor, rp->object, en);
              _sel_clear(en->cursor, rp->object, en);
-             //zz
-//             evas_textblock_cursor_text_prepend(en->cursor, ev->string);
-             _text_filter_text_prepend(en, en->cursor, ev->string);
+             //   if PASSWORD_SHOW_LAST_CHARACTER mode, appending it with 
password tag
+             if (rp->part->entry_mode == 
EDJE_ENTRY_EDIT_MODE_PASSWORD_SHOW_LAST_CHARACTER)
+               {
+                  _edje_entry_hide_visible_password(en->rp);
+                  _text_filter_markup_prepend(en, en->cursor, 
"<password=off>");
+                  _text_filter_markup_prepend(en, en->cursor, ev->string);
+                  _text_filter_markup_prepend(en, en->cursor, "</password>");
+               }
+             else
+               {
+                  //zz
+                  //   evas_textblock_cursor_text_prepend(en->cursor, 
ev->string);
+                  _text_filter_text_prepend(en, en->cursor, ev->string);
+               }
              _curs_update_from_curs(en->cursor, rp->object, en);
              _anchors_get(en->cursor, rp->object, en);
              _edje_emit(ed, "entry,changed", rp->part->name);
@@ -1794,7 +1826,7 @@ _edje_entry_real_part_init(Edje_Real_Part *rp)
    if (rp->part->select_mode == EDJE_ENTRY_SELECTION_MODE_DEFAULT)
       en->select_allow = EINA_TRUE;
 
-   if (rp->part->entry_mode == EDJE_ENTRY_EDIT_MODE_PASSWORD)
+   if ((rp->part->entry_mode == EDJE_ENTRY_EDIT_MODE_PASSWORD) || 
(rp->part->entry_mode == EDJE_ENTRY_EDIT_MODE_PASSWORD_SHOW_LAST_CHARACTER))
      {
         Edje_Part_Description_Text *txt;
 
@@ -1865,7 +1897,7 @@ _edje_entry_real_part_init(Edje_Real_Part *rp)
         en->imf_ee_handler_delete = 
ecore_event_handler_add(ECORE_IMF_EVENT_DELETE_SURROUNDING, 
_edje_entry_imf_event_delete_surrounding_cb, rp->edje);
         en->imf_ee_handler_changed = 
ecore_event_handler_add(ECORE_IMF_EVENT_PREEDIT_CHANGED, 
_edje_entry_imf_event_preedit_changed_cb, rp->edje);
         ecore_imf_context_input_mode_set(en->imf_context, 
-                                         rp->part->entry_mode == 
EDJE_ENTRY_EDIT_MODE_PASSWORD ? 
+                                         (rp->part->entry_mode == 
EDJE_ENTRY_EDIT_MODE_PASSWORD || rp->part->entry_mode == 
EDJE_ENTRY_EDIT_MODE_PASSWORD_SHOW_LAST_CHARACTER)? 
                                          ECORE_IMF_INPUT_MODE_INVISIBLE : 
ECORE_IMF_INPUT_MODE_FULL);
 #endif
      }
@@ -2647,9 +2679,20 @@ _edje_entry_imf_event_commit_cb(void *data, int ty
    if (evas_textblock_cursor_compare(en->cursor, tc))
       cursor_move = EINA_TRUE;
 
-   //yy
-//   evas_textblock_cursor_text_prepend(en->cursor, ev->str);
-   _text_filter_text_prepend(en, tc, ev->str);
+   //   if PASSWORD_SHOW_LAST_CHARACTER mode, appending it with password
+   if (rp->part->entry_mode == 
EDJE_ENTRY_EDIT_MODE_PASSWORD_SHOW_LAST_CHARACTER)
+     {
+        _edje_entry_hide_visible_password(en->rp);
+        _text_filter_markup_prepend(en, tc, "<password=off>");
+        _text_filter_markup_prepend(en, tc, ev->str);
+        _text_filter_markup_prepend(en, tc, "</password>");
+     }
+   else
+     {
+        //yy
+        //   evas_textblock_cursor_text_prepend(en->cursor, ev->str);
+        _text_filter_text_prepend(en, tc, ev->str);
+     }
 
    if (!cursor_move)
      {
Index: src/bin/edje_cc_handlers.c
===================================================================
--- src/bin/edje_cc_handlers.c  (revision 55575)
+++ src/bin/edje_cc_handlers.c  (working copy)
@@ -2631,6 +2631,7 @@ st_collections_group_parts_part_effect(void)
         @li PLAIN
         @li EDITABLE
         @li PASSWORD
+        @li PASSWORD_SHOW_LAST_CHARACTER
         It causes the part be editable if the edje object has the keyboard
         focus AND the part has the edje focus (or selectable always
         regardless of focus) and in the event of password mode, not
@@ -2653,6 +2654,7 @@ st_collections_group_parts_part_entry_mode(void)
                               "PLAIN", EDJE_ENTRY_EDIT_MODE_SELECTABLE,
                               "EDITABLE", EDJE_ENTRY_EDIT_MODE_EDITABLE,
                               "PASSWORD", EDJE_ENTRY_EDIT_MODE_PASSWORD,
+                              "PASSWORD_SHOW_LAST_CHARACTER", 
EDJE_ENTRY_EDIT_MODE_PASSWORD_SHOW_LAST_CHARACTER,
                               NULL);
 }
 
@@ -6763,6 +6765,7 @@ st_collections_group_programs_program_action(void)
                           "FOCUS_OBJECT", EDJE_ACTION_TYPE_FOCUS_OBJECT,
                           "PARAM_COPY", EDJE_ACTION_TYPE_PARAM_COPY,
                           "PARAM_SET", EDJE_ACTION_TYPE_PARAM_SET,
+                          "HIDE_VISIBLE_PASSWORD", 
EDJE_ACTION_TYPE_HIDE_VISIBLE_PASSWORD,
                           NULL);
    if (ep->action == EDJE_ACTION_TYPE_STATE_SET)
      {
@@ -6825,6 +6828,7 @@ st_collections_group_programs_program_action(void)
        /* this is implicitly set by script {} so this is here just for
         * completeness */
        break;
+      case EDJE_ACTION_TYPE_HIDE_VISIBLE_PASSWORD:
       case EDJE_ACTION_TYPE_FOCUS_OBJECT:
       case EDJE_ACTION_TYPE_FOCUS_SET:
        check_arg_count(1);
@@ -6911,6 +6915,8 @@ st_collections_group_programs_program_target(void)
          data_queue_part_lookup(pc, name, &(et->id));
        else if (ep->action == EDJE_ACTION_TYPE_FOCUS_OBJECT)
          data_queue_part_lookup(pc, name, &(et->id));
+       else if (ep->action == EDJE_ACTION_TYPE_HIDE_VISIBLE_PASSWORD)
+         data_queue_part_lookup(pc, name, &(et->id));
        else
          {
             ERR("%s: Error. parse error %s:%i. "
Index: data/themes/default.edc
===================================================================
--- data/themes/default.edc     (revision 55575)
+++ data/themes/default.edc     (working copy)
@@ -8663,6 +8663,68 @@ collections {
       }
    }
 
+   group { name: "elm/entry/custom-password/default";
+      parts {
+         part { name: "elm.text";
+            type: TEXTBLOCK;
+            mouse_events: 1;
+            scale: 1;
+            entry_mode: PASSWORD_SHOW_LAST_CHARACTER;
+            select_mode: EXPLICIT;
+            multiline: 0;
+            source: "elm/entry/selection/default"; // selection under
+            source4: "elm/entry/cursor/default"; // cursorover
+            source5: "elm/entry/anchor/default"; // anchor under
+            description { state: "default" 0.0;
+               text {
+                  style: "entry_single_textblock_style";
+                  repch: "*";
+                  min: 1 1;
+                  max: 0 1;
+               }
+            }
+            description { state: "disabled" 0.0;
+               inherit: "default" 0.0;
+               text {
+                  style: "entry_single_textblock_disabled_style";
+               }
+            }
+         }
+      }
+      programs {
+         program { name: "focus";
+            signal: "load";
+            source: "";
+            action: FOCUS_SET;
+            target: "elm.text";
+         }
+         program { name: "password_stop"; 
+            signal: "entry,changed";
+            source: "elm.text";
+            action: ACTION_STOP;
+            target: "password_start";
+            after: "password_start";
+         }
+         program { name: "password_start";
+            in: 2.0 0.0;
+            action: HIDE_VISIBLE_PASSWORD;
+            target: "elm.text";
+         }
+         program { name: "disable";
+            signal: "elm,state,disabled";
+            source: "elm";
+            action: STATE_SET "disabled" 0.0;
+            target: "elm.text";
+         }
+         program { name: "enable";
+            signal: "elm,state,enabled";
+            source: "elm";
+            action: STATE_SET "default" 0.0;
+            target: "elm.text";
+         }
+      }
+   }
+
    group { name: "elm/entry/cursor/default";
       images {
          image: "cur_box.png" COMP;
Index: src/lib/elm_config.c
===================================================================
--- src/lib/elm_config.c        (revision 55575)
+++ src/lib/elm_config.c        (working copy)
@@ -582,6 +582,7 @@ _desc_init(void)
    ELM_CONFIG_VAL(D, T, inwin_dialogs_enable, T_UCHAR);
    ELM_CONFIG_VAL(D, T, icon_size, T_INT);
    ELM_CONFIG_VAL(D, T, longpress_timeout, T_DOUBLE);
+   ELM_CONFIG_VAL(D, T, password_show_last_character, T_UCHAR);
 #undef T
 #undef D
 #undef T_INT
@@ -1120,6 +1121,7 @@ _config_load(void)
    _elm_config->inwin_dialogs_enable = EINA_FALSE;
    _elm_config->icon_size = 32;
    _elm_config->longpress_timeout = 1.0;
+   _elm_config->password_show_last_character = EINA_FALSE;
 }
 
 static const char *
@@ -1501,6 +1503,9 @@ _env_get(void)
    s = getenv("ELM_FINGER_SIZE");
    if (s) _elm_config->finger_size = atoi(s);
 
+   s = getenv("ELM_PASSWORD_SHOW_LAST_CHARACTER");
+   if (s) _elm_config->password_show_last_character = !!atoi(s);
+
    s = getenv("ELM_FPS");
    if (s) _elm_config->fps = atof(s);
    if (_elm_config->fps < 1.0) _elm_config->fps = 1.0;
Index: src/lib/elm_entry.c
===================================================================
--- src/lib/elm_entry.c (revision 55575)
+++ src/lib/elm_entry.c (working copy)
@@ -125,6 +125,7 @@ struct _Widget_Data
    Eina_Bool char_linewrap : 1;
    Eina_Bool single_line : 1;
    Eina_Bool password : 1;
+   Eina_Bool show_last_character : 1;
    Eina_Bool editable : 1;
    Eina_Bool selection_asked : 1;
    Eina_Bool have_selection : 1;
@@ -911,8 +912,12 @@ _getbase(Evas_Object *obj)
    if (!wd) return "base";
    if (wd->editable)
      {
-       if (wd->password) return "base-password";
-       else
+        if (wd->password) 
+          {
+             if (wd->show_last_character) return "custom-password";
+             else return "base-password";
+          }
+        else
          {
             if (wd->single_line) return "base-single";
             else
@@ -925,7 +930,11 @@ _getbase(Evas_Object *obj)
      }
    else
      {
-       if (wd->password) return "base-password";
+        if (wd->password) 
+          {
+             if (wd->show_last_character) return "custom-password";
+             else return "base-password";
+          }
        else
          {
             if (wd->single_line) return "base-single-noedit";
@@ -1750,6 +1759,8 @@ elm_entry_password_set(Evas_Object *obj, Eina_Bool
    wd->single_line = EINA_TRUE;
    wd->linewrap = EINA_FALSE;
    wd->char_linewrap = EINA_FALSE;
+   if (_elm_config->password_show_last_character)
+     wd->show_last_character = EINA_TRUE;
    t = eina_stringshare_add(elm_entry_entry_get(obj));
    _elm_theme_object_set(obj, wd->ent, "entry", _getbase(obj), 
elm_widget_style_get(obj));
    elm_entry_entry_set(obj, t);
Index: src/lib/elm_priv.h
===================================================================
--- src/lib/elm_priv.h  (revision 55575)
+++ src/lib/elm_priv.h  (working copy)
@@ -110,6 +110,7 @@ struct _Elm_Config
    Eina_Bool    inwin_dialogs_enable;
    int          icon_size;
    double       longpress_timeout;
+   int          password_show_last_character;
 };
 
 struct _Elm_Module
Index: src/lib/canvas/evas_object_textblock.c
===================================================================
--- src/lib/canvas/evas_object_textblock.c      (revision 55575)
+++ src/lib/canvas/evas_object_textblock.c      (working copy)
@@ -336,6 +336,7 @@ struct _Evas_Object_Textblock_Format
    unsigned char        underline2 : 1;
    unsigned char        strikethrough : 1;
    unsigned char        backing : 1;
+   unsigned char        password : 1; 
 };
 
 struct _Evas_Textblock_Style
@@ -1058,6 +1059,7 @@ static const char *linerelsizestr = NULL;
 static const char *linegapstr = NULL;
 static const char *linerelgapstr = NULL;
 static const char *itemstr = NULL;
+static const char *passwordstr = NULL;
 static const char *linefillstr = NULL;
 
 /**
@@ -1096,6 +1098,7 @@ _format_command_init(void)
         linerelsizestr = eina_stringshare_add("linerelsize");
         linegapstr = eina_stringshare_add("linegap");
         linerelgapstr = eina_stringshare_add("linerelgap");
+        passwordstr = eina_stringshare_add("password");
         itemstr = eina_stringshare_add("item");
         linefillstr = eina_stringshare_add("linefill");
      }
@@ -1139,6 +1142,7 @@ _format_command_shutdown(void)
    eina_stringshare_del(linegapstr);
    eina_stringshare_del(linerelgapstr);
    eina_stringshare_del(itemstr);
+   eina_stringshare_del(passwordstr);
    eina_stringshare_del(linefillstr);
 }
 
@@ -1480,7 +1484,14 @@ _format_command(Evas_Object *obj, Evas_Object_Text
                }
           }
      }
-
+   else if (cmd == passwordstr)
+     {
+        if (!strcmp(tmp_param, "off"))
+          fmt->password = 0;
+        else if (!strcmp(tmp_param, "on"))
+          fmt->password = 1;
+     }
+   
    if (new_font)
      {
         void *of;
@@ -1855,6 +1866,7 @@ _layout_format_push(Ctxt *c, Evas_Object_Textblock
         fmt->linerelsize = 0.0;
         fmt->linegap = 0;
         fmt->linerelgap = 0.0;
+        fmt->password = 1;
      }
    return fmt;
 }
@@ -2326,7 +2338,7 @@ _layout_text_append(Ctxt *c, Evas_Object_Textblock
 
         /* If we work with a replacement char, create a string which is the 
same
          * but with replacement chars instead of regular chars. */
-        if ((repch) && (eina_ustrbuf_length_get(n->unicode)))
+        if ((fmt->password) && (repch) && 
(eina_ustrbuf_length_get(n->unicode)))
           {
              int i, ind;
              Eina_Unicode *ptr;
------------------------------------------------------------------------------
Lotusphere 2011
Register now for Lotusphere 2011 and learn how
to connect the dots, take your collaborative environment
to the next level, and enter the era of Social Business.
http://p.sf.net/sfu/lotusphere-d2d
_______________________________________________
enlightenment-devel mailing list
enlightenment-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel

Reply via email to