Hi List,
Since we need to limit the entered text length, we create a patch
the allow etk_entry to to that
Adding two functions:
void etk_entry_text_set(Etk_Entry *entry, const char *text)
int etk_entry_text_limit_get(Etk_Entry *entry)
let programmer's to limit the max input length of etk_entry.
if set to 0 that means no limited.
default is 0
Cheers,
Tick
Index: etk/src/lib/etk_entry.c
===
--- etk.orig/src/lib/etk_entry.c 2008-04-29 16:09:01.0 +0800
+++ etk/src/lib/etk_entry.c 2008-04-29 16:12:24.0 +0800
@@ -1,5 +1,6 @@
/** @file etk_entry.c */
#ifdef HAVE_CONFIG_H
+#define _GNU_SOURCE
#include "config.h"
#endif
@@ -126,6 +127,7 @@
*/
void etk_entry_text_set(Etk_Entry *entry, const char *text)
{
+ char *text_tmp;
if (!entry)
return;
@@ -134,11 +136,15 @@
if (entry->text != text)
{
free(entry->text);
- entry->text = text ? strdup(text) : NULL;
+ entry->text = text ? entry->text_limit==0 ? strdup(text) : strndup(text, entry->text_limit) : NULL;
}
}
- else
- etk_editable_text_set(entry->editable_object, text);
+ else
+ {
+ text_tmp = !text || entry->text_limit==0 ? strdup(text) : strndup(text, entry->text_limit);
+ etk_editable_text_set(entry->editable_object, text_tmp);
+ free(text_tmp);
+ }
etk_signal_emit(ETK_ENTRY_TEXT_CHANGED_SIGNAL, ETK_OBJECT(entry));
}
@@ -159,6 +165,37 @@
return etk_editable_text_get(entry->editable_object);
}
+
+/**
+ * @brief Set the text limit of the entry
+ * @param entry an entry
+ * @param limit the limit of text length, 0 means no limit
+ */
+void etk_entry_text_limit_set(Etk_Entry *entry, int limit)
+{
+ if (!entry)
+ return;
+ if (limit >= 0)
+ {
+ entry->text_limit = limit;
+ return;
+ }
+ entry->text_limit = 0;
+ return;
+}
+
+/**
+ * @brief Get the text limit of the entry
+ * @param entry an entry
+ * @return Returns the limit of text entry, 0 means no limit.
+ */
+int etk_entry_text_limit_get(Etk_Entry *entry)
+{
+ if (!entry)
+ return -1;
+ return entry->text_limit;
+}
+
/**
* @brief Clears the text of the entry
* @param entry the entry to clear
@@ -375,6 +412,7 @@
entry->imf_ee_handler_commit = NULL;
entry->imf_ee_handler_delete = NULL;
entry->text = NULL;
+ entry->text_limit=0;
entry->internal_entry = etk_widget_new(ETK_WIDGET_TYPE, "repeat-mouse-events", ETK_TRUE,
"theme-group", "entry", "theme-parent", entry, "parent", entry, "internal", ETK_TRUE, NULL);
@@ -562,6 +600,7 @@
Evas *evas;
const char *ctx_id;
const Ecore_IMF_Context_Info *ctx_info;
+ char *text_tmp;
if (!(internal_entry = ETK_WIDGET(object)) || !(evas = etk_widget_toplevel_evas_get(internal_entry)))
return ETK_TRUE;
@@ -609,7 +648,14 @@
etk_editable_theme_set(entry->editable_object, etk_widget_theme_file_get(internal_entry),
etk_widget_theme_group_get(internal_entry));
- etk_editable_text_set(entry->editable_object, entry->text);
+ if (entry->text_limit==0)
+ etk_editable_text_set(entry->editable_object, entry->text);
+ else
+ {
+ text_tmp = entry->text ? strndup(entry->text, entry->text_limit): NULL;
+ etk_editable_text_set(entry->editable_object, text_tmp);
+ free(text_tmp);
+ }
etk_editable_password_mode_set(entry->editable_object, entry->password_mode);
if (!etk_widget_is_focused(ETK_WIDGET(entry)))
@@ -665,6 +711,7 @@
{
Etk_Entry *entry;
const char *text;
+ char *text_tmp;
if (!(entry = ETK_ENTRY(etk_object_data_get(object, "_Etk_Entry::Entry"
return ETK_TRUE;
@@ -689,7 +736,12 @@
free(entry->text);
if ((text = etk_editable_text_get(entry->editable_object)))
- entry->text = strdup(text);
+ {
+ if (entry->text_limit==0)
+ entry->text = strdup(text);
+ else
+ entry->text = strndup(text, entry->text_limit);
+ }
else
entry->text = NULL;
@@ -823,7 +875,9 @@
{
if (selecting)
changed |= etk_editable_delete(editable, start_pos, end_pos);
- changed |= etk_editable_insert(editable, start_pos, event->string);
+ if (!entry->text_limit ||
+(etk_editable_text_length_get(editable) + strlen(event->string)) <= entry->text_limit)
+ changed |= etk_editable_insert(editable, start_pos, event->string);
}
else
stop_signal = ETK_FALSE;
@@ -1187,7 +1241,9 @@
if (selecting)
changed |= etk_editable_delete(editable, start_pos, end_pos);
- changed |= etk_editable_insert(editable, start_pos, text);
+ if (!entry->text_limit ||
+etk_editable_text_length_get(editable) + strlen(text) <= entry->text_limit)
+ changed |= etk_editable_insert(editable, start_pos, text);
if (changed)
etk_signal_emit(ETK_ENTRY_TEXT_CHANGED_SIGNAL, ETK_OBJECT(entry