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