summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHermet Park <hermetpark@gmail.com>2020-01-03 12:43:27 +0900
committerHermet Park <hermetpark@gmail.com>2020-01-03 12:43:27 +0900
commit5739920ba7f7a0e890deaa6974ef18a22ffe0808 (patch)
tree0a1aee17b2b2ac1c9f6fcc343c3b3b458499361d
parent121f177fdef6f5010b380591a7a9d53e7408ed35 (diff)
parent5c99f08511f8628c14e176026c641bf1da3eaed2 (diff)
downloadefl-5739920ba7f7a0e890deaa6974ef18a22ffe0808.tar.gz
Merge branch 'master' into devs/hermet/lottie
-rw-r--r--src/bin/eolian_mono/eolian/mono/events.hh17
-rw-r--r--src/bin/eolian_mono/eolian/mono/function_definition.hh1
-rw-r--r--src/bin/eolian_mono/eolian/mono/parameter.hh25
-rw-r--r--src/bin/eolian_mono/eolian_mono.cc3
-rw-r--r--src/lib/edje/Edje_Legacy.h38
-rw-r--r--src/lib/edje/edje_cache.c11
-rw-r--r--src/lib/edje/edje_load.c1
-rw-r--r--src/lib/edje/edje_private.h6
-rw-r--r--src/lib/edje/edje_smart.c7
-rw-r--r--src/lib/edje/edje_textblock_styles.c156
-rw-r--r--src/lib/edje/edje_util.c160
-rw-r--r--src/lib/edje/efl_canvas_layout_part_text.eo6
-rw-r--r--src/lib/efl/interfaces/efl_text_font_properties.eo5
-rw-r--r--src/lib/elementary/efl_text_interactive.eo2
-rw-r--r--src/lib/elementary/efl_ui_collection.c18
-rw-r--r--src/lib/elementary/efl_ui_collection.eo1
-rw-r--r--src/lib/elementary/efl_ui_internal_text_interactive.c2
-rw-r--r--src/lib/elementary/efl_ui_internal_text_scroller.c7
-rw-r--r--src/lib/elementary/efl_ui_item.c5
-rw-r--r--src/lib/elementary/efl_ui_radio_group_impl.c12
-rw-r--r--src/lib/elementary/efl_ui_radio_group_impl.eo1
-rw-r--r--src/lib/elementary/efl_ui_single_selectable.eo6
-rw-r--r--src/lib/elementary/efl_ui_spin_button.c2
-rw-r--r--src/lib/elementary/efl_ui_spotlight_manager_stack.c2
-rw-r--r--src/lib/elementary/efl_ui_tab_bar.c13
-rw-r--r--src/lib/elementary/efl_ui_tab_bar.eo1
-rw-r--r--src/lib/elementary/efl_ui_tab_bar_private.h1
-rw-r--r--src/lib/elementary/efl_ui_textbox.c47
-rw-r--r--src/lib/elementary/efl_ui_textbox.eo1
-rw-r--r--src/lib/elementary/efl_ui_vg_animation_eo.legacy.c4
-rw-r--r--src/lib/evas/canvas/efl_canvas_animation_scale.eo2
-rw-r--r--src/lib/evas/canvas/efl_canvas_textblock.eo42
-rw-r--r--src/lib/evas/canvas/efl_text_cursor.c9
-rw-r--r--src/lib/evas/canvas/efl_text_formatter.c3
-rw-r--r--src/lib/evas/canvas/evas_callbacks.c7
-rw-r--r--src/lib/evas/canvas/evas_object_main.c2
-rw-r--r--src/lib/evas/canvas/evas_object_text.c2
-rw-r--r--src/lib/evas/canvas/evas_object_textblock.c226
-rw-r--r--src/lib/evas/include/evas_private.h1
-rw-r--r--src/modules/evas/engines/gl_drm/evas_engine.c2
-rw-r--r--src/tests/efl_mono/EinaTestData.cs3
-rw-r--r--src/tests/elementary/efl_ui_test_text.c26
-rw-r--r--src/tests/elementary/elm_test_entry.c73
-rw-r--r--src/tests/elementary/spec/efl_test_range_display.c4
-rw-r--r--src/tests/evas/evas_test_textblock.c9
45 files changed, 724 insertions, 248 deletions
diff --git a/src/bin/eolian_mono/eolian/mono/events.hh b/src/bin/eolian_mono/eolian/mono/events.hh
index a77f6d7d9c..8bb1799485 100644
--- a/src/bin/eolian_mono/eolian/mono/events.hh
+++ b/src/bin/eolian_mono/eolian/mono/events.hh
@@ -165,7 +165,8 @@ struct pack_event_info_and_call_visitor
if (regular.is_struct())
{
return as_generator(
- indent << "IntPtr info = Marshal.AllocHGlobal(Marshal.SizeOf(e.arg));\n"
+ indent << "Contract.Requires(e != null, nameof(e));\n"
+ << indent << "IntPtr info = Marshal.AllocHGlobal(Marshal.SizeOf(e.arg));\n"
<< indent << "CallNativeEventCallback(" + library_name + ", \"_" + evt_c_name + "\", info, " << "(p) => Marshal.FreeHGlobal(p));\n"
).generate(sink, attributes::unused, *context);
}
@@ -192,7 +193,8 @@ struct pack_event_info_and_call_visitor
auto str_accept_func = [&](std::string const& conversion)
{
return as_generator(
- indent << "IntPtr info = Eina.StringConversion.ManagedStringToNativeUtf8Alloc(" << conversion << ");\n"
+ indent << "Contract.Requires(e != null, nameof(e));\n"
+ << indent << "IntPtr info = Eina.StringConversion.ManagedStringToNativeUtf8Alloc(" << conversion << ");\n"
<< indent << "CallNativeEventCallback(" + library_name + ", \"_" + evt_c_name + "\", info, " << "(p) => Eina.MemoryNative.Free(p));\n"
).generate(sink, attributes::unused, *context);
};
@@ -210,7 +212,8 @@ struct pack_event_info_and_call_visitor
auto value_accept_func = [&](std::string const& conversion)
{
return as_generator(
- indent << "IntPtr info = Eina.PrimitiveConversion.ManagedToPointerAlloc(" << conversion << ");\n"
+ indent << "Contract.Requires(e != null, nameof(e));\n"
+ << indent << "IntPtr info = Eina.PrimitiveConversion.ManagedToPointerAlloc(" << conversion << ");\n"
<< indent << "CallNativeEventCallback(" + library_name + ", \"_" + evt_c_name + "\", info, " << "(p) => Marshal.FreeHGlobal(p));\n"
).generate(sink, attributes::unused, *context);
};
@@ -223,7 +226,9 @@ struct pack_event_info_and_call_visitor
bool operator()(grammar::attributes::klass_name const&) const
{
auto const& indent = current_indentation(*context);
- return as_generator(indent << "IntPtr info = e.arg.NativeHandle;\n"
+ return as_generator(
+ indent << "Contract.Requires(e != null, nameof(e));\n"
+ << indent << "IntPtr info = e.arg.NativeHandle;\n"
<< "CallNativeEventCallback(" << library_name << ", \"_" << evt_c_name << "\", IntPtr.Zero, null);\n"
).generate(sink, attributes::unused, *context);
}
@@ -233,7 +238,9 @@ struct pack_event_info_and_call_visitor
if ((type.outer.base_type == "iterator") || (type.outer.base_type == "accessor"))
return true;
- return as_generator(indent << "IntPtr info = e.arg.Handle;\n"
+ return as_generator(
+ indent << "Contract.Requires(e != null, nameof(e));\n"
+ << indent << "IntPtr info = e.arg.Handle;\n"
<< "CallNativeEventCallback(" << library_name << ", \"_" << evt_c_name << "\", IntPtr.Zero, null);\n"
).generate(sink, attributes::unused, *context);
}
diff --git a/src/bin/eolian_mono/eolian/mono/function_definition.hh b/src/bin/eolian_mono/eolian/mono/function_definition.hh
index 86eb2db192..fa4941213f 100644
--- a/src/bin/eolian_mono/eolian/mono/function_definition.hh
+++ b/src/bin/eolian_mono/eolian/mono/function_definition.hh
@@ -305,6 +305,7 @@ struct property_extension_method_definition_generator
if (!as_generator(scope_tab << "public static Efl.BindableProperty<" << type(true) << "> " << managed_name << "<T>(this Efl.BindablePart<T> part, Efl.Csharp.ExtensionTag<"
<< name_helpers::klass_full_concrete_or_interface_name(cls)
<< ", T>magic = null) where T : " << name_helpers::klass_full_concrete_or_interface_name(cls) << " {\n"
+ << scope_tab << scope_tab << "Contract.Requires(part != null, nameof(part));\n"
<< scope_tab << scope_tab << "return new Efl.BindableProperty<" << type(true) << ">(part.PartName, \"" << property.name << "\", part.Binder);\n"
<< scope_tab << "}\n\n"
).generate(sink, std::make_tuple(prop_type, prop_type), context))
diff --git a/src/bin/eolian_mono/eolian/mono/parameter.hh b/src/bin/eolian_mono/eolian/mono/parameter.hh
index 4af5fe2aef..5e6246d174 100644
--- a/src/bin/eolian_mono/eolian/mono/parameter.hh
+++ b/src/bin/eolian_mono/eolian/mono/parameter.hh
@@ -693,10 +693,10 @@ struct convert_in_variable_generator
}
else if (param.type.c_type == "Eina_Binbuf *" || param.type.c_type == "const Eina_Binbuf *")
{
- auto var_name = in_variable_name(param.param_name);
if (!as_generator(
- "var " << string << " = " << escape_keyword(param.param_name) << ".Handle;\n"
- ).generate(sink, var_name, context))
+ "Contract.Requires(" << string << " != null, nameof(" << string << "));\n"
+ << scope_tab(2) << "var " << string << " = " << string << ".Handle;\n"
+ ).generate(sink, std::make_tuple(escape_keyword(param.param_name), escape_keyword(param.param_name), in_variable_name(param.param_name), escape_keyword(param.param_name)), context))
return false;
if (param.type.has_own)
{
@@ -710,10 +710,10 @@ struct convert_in_variable_generator
attributes::complex_type_def const* complex = efl::eina::get<attributes::complex_type_def>(&param.type.original_type);
if (!complex || complex->subtypes.size() != 2)
return false;
- auto var_name = in_variable_name(param.param_name);
if (!as_generator(
- "var " << string << " = " << escape_keyword(param.param_name) << ".Handle;\n"
- ).generate(sink, var_name, context))
+ "Contract.Requires(" << string << " != null, nameof(" << string << "));\n"
+ << scope_tab(2) << "var " << string << " = " << string << ".Handle;\n"
+ ).generate(sink, std::make_tuple(escape_keyword(param.param_name), escape_keyword(param.param_name), in_variable_name(param.param_name), escape_keyword(param.param_name)), context))
return false;
if (param.type.has_own && !as_generator(
escape_keyword(param.param_name) << ".SetOwn(false);\n"
@@ -736,10 +736,12 @@ struct convert_in_variable_generator
attributes::complex_type_def const* complex = efl::eina::get<attributes::complex_type_def>(&param.type.original_type);
if (!complex)
return false;
- auto var_name = in_variable_name(param.param_name);
if (!as_generator(
- "var " << string << " = " << escape_keyword(param.param_name) << ".Handle;\n"
- ).generate(sink, var_name, context))
+ "Contract.Requires(" << string << " != null, nameof(" << string << "));\n"
+ << "var " << string << " = " << string << ".Handle;\n"
+ ).generate(sink, std::make_tuple(escape_keyword(param.param_name), escape_keyword(param.param_name),
+ in_variable_name(param.param_name), escape_keyword(param.param_name))
+ , context))
return false;
if (param.type.has_own && !as_generator(
escape_keyword(param.param_name) << ".Own = false;\n"
@@ -777,8 +779,9 @@ struct convert_in_variable_generator
else if (param.type.c_type == "Eina_Value")
{
return as_generator(
- "var " << string << " = " << string << ".GetNative();\n"
- ).generate(sink, std::make_tuple(in_variable_name(param.param_name), param.param_name), context);
+ "Contract.Requires(" << string << " != null, nameof(" << string << "));\n"
+ "var " << string << " = " << string << ".GetNative();\n"
+ ).generate(sink, std::make_tuple(param.param_name, param.param_name, in_variable_name(param.param_name), param.param_name), context);
}
return true;
}
diff --git a/src/bin/eolian_mono/eolian_mono.cc b/src/bin/eolian_mono/eolian_mono.cc
index b6d2b6f1a0..bf3874a414 100644
--- a/src/bin/eolian_mono/eolian_mono.cc
+++ b/src/bin/eolian_mono/eolian_mono.cc
@@ -172,7 +172,8 @@ run(options_type const& opts)
"using System.Linq;\n"
"using System.Threading;\n"
"using System.ComponentModel;\n"
- "using System.Diagnostics.CodeAnalysis;\n")
+ "using System.Diagnostics.CodeAnalysis;\n"
+ "using System.Diagnostics.Contracts;\n")
.generate(iterator, efl::eolian::grammar::attributes::unused, efl::eolian::grammar::context_null()))
{
throw std::runtime_error("Failed to generate file preamble");
diff --git a/src/lib/edje/Edje_Legacy.h b/src/lib/edje/Edje_Legacy.h
index af89a4939c..f36cb53953 100644
--- a/src/lib/edje/Edje_Legacy.h
+++ b/src/lib/edje/Edje_Legacy.h
@@ -3147,6 +3147,44 @@ EAPI void edje_object_perspective_set(Evas_Object *obj, Edje_Perspective *ps);
EAPI const Edje_Perspective *edje_object_perspective_get(const Evas_Object *obj);
/**
+ * @brief Sets Edje text class for edje file (if loaded)
+ *
+ * This function sets the text class for All Edje Objects created from Edje file.
+ * (if edje file loaded before)
+ *
+ * @param[in] file edje file path
+ * @param[in] text_class The text class name
+ * @param[in] font Font name
+ * @param[in] size Font Size
+ *
+ * @return @c true, on success or @c false, on error
+ */
+EAPI Eina_Bool edje_file_text_class_set(const char *file, const char *text_class, const char *font, Evas_Font_Size size);
+
+/**
+ * @brief Delete the file text class.
+ *
+ * This function deletes any values at the file level for the specified
+ * file and text class.
+ *
+ * @param[in] text_class The text class to be deleted.
+ */
+EAPI Eina_Bool edje_file_text_class_del(const char *file, const char *text_class);
+
+/**
+ * @brief Gets font and font size from edje file if loaded.
+ *
+ * This function gets the font and the font size from the file text class.
+ *
+ * @param[in] text_class The text class name
+ * @param[out] font Font name
+ * @param[out] size Font Size
+ *
+ * @return @c true, on success or @c false, on error
+ */
+EAPI Eina_Bool edje_file_text_class_get(const char *file, const char * text_class, const char **font, Evas_Font_Size *size);
+
+/**
* @}
*/
diff --git a/src/lib/edje/edje_cache.c b/src/lib/edje/edje_cache.c
index 64eb6ad5ec..e58584cba4 100644
--- a/src/lib/edje/edje_cache.c
+++ b/src/lib/edje/edje_cache.c
@@ -600,8 +600,13 @@ _edje_file_open(const Eina_File *f, int *error_ret, time_t mtime, Eina_Bool coll
edf->text_hash = eina_hash_string_small_new(NULL);
EINA_LIST_FOREACH(edf->text_classes, l, tc)
- if (tc->name)
- eina_hash_direct_add(edf->text_hash, tc->name, tc);
+ {
+ if (tc->name)
+ eina_hash_direct_add(edf->text_hash, tc->name, tc);
+
+ if (tc->font)
+ tc->font = eina_stringshare_add(tc->font);
+ }
edf->size_hash = eina_hash_string_small_new(NULL);
EINA_LIST_FOREACH(edf->size_classes, l, sc)
@@ -713,7 +718,7 @@ _edje_file_cache_trash_pop(const Eina_File *file)
return NULL;
}
-static inline Edje_File*
+Edje_File*
_edje_file_cache_find(const Eina_File *file)
{
Edje_File *edf;
diff --git a/src/lib/edje/edje_load.c b/src/lib/edje/edje_load.c
index 5a1cc33067..552f57f52a 100644
--- a/src/lib/edje/edje_load.c
+++ b/src/lib/edje/edje_load.c
@@ -2103,6 +2103,7 @@ _edje_file_del(Edje *ed)
_edje_text_part_on_del(ed, ep);
_edje_color_class_on_del(ed, ep);
}
+ _edje_object_textblock_styles_cache_cleanup(ed);
_edje_cache_coll_unref(ed->file, ed->collection);
ed->collection = NULL;
diff --git a/src/lib/edje/edje_private.h b/src/lib/edje/edje_private.h
index 1b2ec8ca1c..f46687ea5f 100644
--- a/src/lib/edje/edje_private.h
+++ b/src/lib/edje/edje_private.h
@@ -1733,6 +1733,7 @@ struct _Edje
Eina_List *groups;
+ Eina_Hash *styles;
Edje_Perspective *persp;
Ecore_Animator *animator;
@@ -2827,14 +2828,17 @@ void _edje_message_del (Edje *ed);
Evas_Textblock_Style * _edje_textblock_style_get(Edje *ed, const char *style);
void _edje_textblock_styles_add(Edje *ed, Edje_Real_Part *ep);
void _edje_textblock_styles_del(Edje *ed, Edje_Part *pt);
+void _edje_object_textblock_style_all_update_text_class(Edje *ed, const char *text_class);
+void _edje_object_textblock_styles_cache_cleanup(Edje *ed);
// Edje File level textblock style api
void _edje_file_textblock_style_all_update(Edje_File *ed);
-void _edje_file_textblock_style_all_update_text_class(Edje_File *edf, const char *text_class);
+void _edje_file_textblock_styles_all_update_text_class(Edje *ed, const char *text_class);
void _edje_file_textblock_style_parse_and_fix(Edje_File *edf);
void _edje_file_textblock_style_cleanup(Edje_File *edf);
Edje_File *_edje_cache_file_coll_open(const Eina_File *file, const char *coll, int *error_ret, Edje_Part_Collection **edc_ret, Edje *ed);
+Edje_File *_edje_file_cache_find(const Eina_File *file);
void _edje_cache_coll_clean(Edje_File *edf);
void _edje_cache_coll_flush(Edje_File *edf);
void _edje_cache_coll_unref(Edje_File *edf, Edje_Part_Collection *edc);
diff --git a/src/lib/edje/edje_smart.c b/src/lib/edje/edje_smart.c
index f8d42d9069..d0d794790b 100644
--- a/src/lib/edje/edje_smart.c
+++ b/src/lib/edje/edje_smart.c
@@ -504,7 +504,12 @@ _efl_canvas_layout_efl_observer_update(Eo *obj EINA_UNUSED, Edje *ed, Efl_Object
}
else if (obs == _edje_text_class_member)
{
- _edje_file_textblock_style_all_update_text_class(ed->file, key);
+ if (data == ed)
+ // Object level update
+ _edje_object_textblock_style_all_update_text_class(ed, key);
+ else if ((data == ed->file) || // File level update will pass ed->file
+ (!data)) // Global update will pass NULL
+ _edje_file_textblock_styles_all_update_text_class(ed, key);
#ifdef EDJE_CALC_CACHE
ed->text_part_change = EINA_TRUE;
#endif
diff --git a/src/lib/edje/edje_textblock_styles.c b/src/lib/edje/edje_textblock_styles.c
index 3618d201c4..0eec7bca80 100644
--- a/src/lib/edje/edje_textblock_styles.c
+++ b/src/lib/edje/edje_textblock_styles.c
@@ -1,5 +1,72 @@
#include "edje_private.h"
+void _edje_textblock_style_update(Edje *ed, Edje_Style *stl);
+
+static Edje_Style *
+_edje_textblock_style_copy(Edje_Style *stl)
+{
+ Edje_Style *new_stl;
+
+ new_stl = calloc(1, sizeof(Edje_Style));
+ if (!new_stl) return NULL;
+
+ new_stl->style = evas_textblock_style_new();
+ evas_textblock_style_set(new_stl->style, NULL);
+
+ // just keep a reference.
+ new_stl->tags = stl->tags;
+ new_stl->name = stl->name;
+ new_stl->cache = EINA_FALSE;
+
+ return new_stl;
+}
+
+static void
+_edje_object_textblock_styles_cache_style_free(void *data)
+{
+ Edje_Style *obj_stl = data;
+
+ if (!obj_stl) return;
+
+ if (obj_stl->style) evas_textblock_style_free(obj_stl->style);
+ free(obj_stl);
+}
+
+static Edje_Style *
+_edje_object_textblock_styles_cache_add(Edje *ed, Edje_Style *stl)
+{
+ Edje_Style *obj_stl = eina_hash_find(ed->styles, stl->name);
+ // Find the style in the object cache
+
+ if (!obj_stl)
+ {
+ obj_stl = _edje_textblock_style_copy(stl);
+
+ if (obj_stl)
+ {
+ if (!ed->styles) ed->styles = eina_hash_stringshared_new(_edje_object_textblock_styles_cache_style_free);
+ eina_hash_direct_add(ed->styles, obj_stl->name, obj_stl);
+ _edje_textblock_style_update(ed, obj_stl);
+ }
+ }
+ return obj_stl;
+}
+
+void
+_edje_object_textblock_styles_cache_cleanup(Edje *ed)
+{
+ if (!ed || !ed->styles) return;
+ eina_hash_free(ed->styles);
+ ed->styles = NULL;
+}
+
+static Edje_Style *
+_edje_object_textblock_styles_cache_get(Edje *ed, const char *stl)
+{
+ // Find the style in the object cache
+ return eina_hash_find(ed->styles, stl);
+}
+
static int
_edje_font_is_embedded(Edje_File *edf, const char *font)
{
@@ -230,26 +297,6 @@ _edje_textblock_style_update(Edje *ed, Edje_Style *stl)
eina_strbuf_free(txt);
}
-/*
- * mark all the styles in the Edje_File dirty (except readonly styles)so that
- * subsequent request to style will update before giving the style.
- * Note: this will enable lazy style computation (only when some
- * widget request for new style it will get computed).
- *
- * @param ed The edje containing styles which need to be updated
- */
-void
-_edje_file_textblock_style_all_update(Edje_File *edf)
-{
- Eina_List *l;
- Edje_Style *stl;
-
- if (!edf) return;
-
- EINA_LIST_FOREACH(edf->styles, l, stl)
- if (stl && !stl->readonly) stl->cache = EINA_FALSE;
-}
-
static inline Edje_Style *
_edje_textblock_style_search(Edje *ed, const char *style)
{
@@ -371,9 +418,18 @@ _edje_textblock_styles_del(Edje *ed, Edje_Part *pt)
Evas_Textblock_Style *
_edje_textblock_style_get(Edje *ed, const char *style)
{
+ Edje_Style *stl;
+
if (!style) return NULL;
- Edje_Style *stl = _edje_textblock_style_search(ed, style);
+ // First search in Edje_Object styles list
+ stl = _edje_object_textblock_styles_cache_get(ed, style);
+
+ if (!stl)
+ {
+ // If not found in Edje_Object search in Edje_File styles list
+ stl = _edje_textblock_style_search(ed, style);
+ }
if (!stl) return NULL;
@@ -387,19 +443,21 @@ _edje_textblock_style_get(Edje *ed, const char *style)
return stl->style;
}
-/*
- * Finds all the styles having text class tag as text_class and
- * updates them.
- */
-void
-_edje_file_textblock_style_all_update_text_class(Edje_File *edf, const char *text_class)
+static void
+_edje_textblock_style_all_update_text_class(Edje *ed, const char *text_class, Eina_Bool is_object_level)
{
- Eina_List *l, *ll;
+ Eina_List *ll, *l;
Edje_Style *stl;
+ Edje_Style *obj_stl;
+ Edje_File *edf;
- if (!edf) return;
+ if (!ed) return;
+ if (!ed->file) return;
if (!text_class) return;
+ edf = ed->file;
+
+ // check if there is styles in file that uses this text_class
EINA_LIST_FOREACH(edf->styles, l, stl)
{
Edje_Style_Tag *tag;
@@ -412,15 +470,49 @@ _edje_file_textblock_style_all_update_text_class(Edje_File *edf, const char *tex
if (!strcmp(tag->text_class, text_class))
{
- // just mark it dirty so the next request
- // for this style will trigger recomputation.
- stl->cache = EINA_FALSE;
+ if (is_object_level)
+ {
+ obj_stl = _edje_object_textblock_styles_cache_get(ed, stl->name);
+ if (obj_stl)
+ // If already in Edje styles just make it dirty
+ obj_stl->cache = EINA_FALSE;
+ else
+ // create a copy from it if it's not exists
+ _edje_object_textblock_styles_cache_add(ed, stl);
+ }
+ else
+ {
+ // just mark it dirty so the next request
+ // for this style will trigger recomputation.
+ stl->cache = EINA_FALSE;
+ }
+ // don't need to continue searching
break;
}
}
}
}
+/*
+ * Finds all the styles having text class tag as text_class and
+ * updates them in object level.
+ */
+void
+_edje_object_textblock_style_all_update_text_class(Edje *ed, const char *text_class)
+{
+ _edje_textblock_style_all_update_text_class(ed, text_class, EINA_TRUE);
+}
+
+/*
+ * Finds all the styles having text class tag as text_class and
+ * updates them in file level.
+ */
+void
+_edje_file_textblock_styles_all_update_text_class(Edje *ed, const char *text_class)
+{
+ _edje_textblock_style_all_update_text_class(ed, text_class, EINA_FALSE);
+}
+
/* When we get to here the edje file had been read into memory
* the name of the style is established as well as the name and
* data for the tags. This function will create the Evas_Style
diff --git a/src/lib/edje/edje_util.c b/src/lib/edje/edje_util.c
index f699f835ff..0e6bc3e9ba 100644
--- a/src/lib/edje/edje_util.c
+++ b/src/lib/edje/edje_util.c
@@ -1336,6 +1336,140 @@ _edje_text_class_list_foreach(const Eina_Hash *hash EINA_UNUSED, const void *key
return EINA_TRUE;
}
+static Edje_File *
+_edje_file_find(const char *file)
+{
+ char *tmp = NULL;
+ Eina_File *f = NULL;
+ Edje_File *edf = NULL;
+
+ if (!file) return NULL;
+
+ tmp = eina_vpath_resolve(file);
+ if (!tmp) return NULL;
+
+ f = eina_file_open(tmp, EINA_FALSE);
+
+ if (tmp) free(tmp);
+ if (!f) return NULL;
+
+ edf = _edje_file_cache_find(f);
+
+ eina_file_close(f);
+ return edf;
+}
+
+EAPI Eina_Bool
+edje_file_text_class_get(const char *file, const char * text_class, const char **font, Evas_Font_Size *size)
+{
+ Edje_Text_Class *tc = NULL;
+ Edje_File *edf = NULL;
+ Eina_Bool ret = EINA_FALSE;
+
+ if (font) *font = NULL;
+ if (size) *size = 0;
+
+ if ((!file) || (!text_class)) return ret;
+ if ((!font) && (!size)) return ret; // No need to go deep
+
+ edf = _edje_file_find(file);
+ if (!edf) return ret;
+
+ tc = eina_hash_find(edf->text_hash, text_class);
+ if (!tc) goto end;
+
+ if (font) *font = tc->font;
+ if (size) *size = tc->size;
+ ret = EINA_TRUE;
+
+end:
+ _edje_cache_file_unref(edf);
+ return ret;
+}
+
+EAPI Eina_Bool
+edje_file_text_class_del(const char *file, const char *text_class)
+{
+ Edje_Text_Class *tc = NULL;
+ Edje_File *edf = NULL;
+ Eina_Bool ret = EINA_FALSE;
+ if ((!file) || (!text_class)) return ret;
+
+ edf = _edje_file_find(file);
+ if (!edf) return ret;
+
+ tc = eina_hash_find(edf->text_hash, text_class);
+ if (!tc) goto end;
+
+ eina_hash_del(edf->text_hash, text_class, tc);
+ eina_stringshare_del(tc->name);
+ eina_stringshare_del(tc->font);
+ free(tc);
+
+ /* Tell all members of the text class to recalc */
+ efl_observable_observers_update(_edje_text_class_member, text_class, edf);
+
+ ret = EINA_TRUE;
+end:
+ _edje_cache_file_unref(edf);
+ return ret;
+}
+
+EAPI Eina_Bool
+edje_file_text_class_set(const char *file, const char *text_class, const char *font, Evas_Font_Size size)
+{
+ Edje_File *edf = NULL;
+ Edje_Text_Class *tc = NULL;
+ Eina_Bool ret = EINA_FALSE;
+
+ if ((!file) || (!text_class)) return ret;
+
+ edf = _edje_file_find(file);
+ if (!edf) return ret;
+
+ // update text_class properties, or create new text_class if not found
+ if (edf->text_hash) tc = eina_hash_find(edf->text_hash, text_class);
+ if (!tc)
+ {
+ /* Create new text class */
+ tc = calloc(1, sizeof(Edje_Text_Class));
+ if (!tc) goto error_end;
+ tc->name = eina_stringshare_add(text_class);
+ if (!tc->name)
+ {
+ free(tc);
+ goto error_end;
+ }
+ if (!edf->text_hash) edf->text_hash = eina_hash_string_small_new(NULL);
+ eina_hash_direct_add(edf->text_hash, text_class, tc);
+
+ tc->font = eina_stringshare_add(font);
+ tc->size = size;
+ }
+ else
+ {
+ /* Match and the same, return */
+ if (((tc->font && font) && !strcmp(tc->font, font)) &&
+ (tc->size == size))
+ goto success_end;
+
+ /* Update the class found */
+ eina_stringshare_replace(&tc->font, font);
+ tc->size = size;
+ }
+
+
+ /* Tell all members of the text class to recalc */
+ efl_observable_observers_update(_edje_text_class_member, text_class, edf);
+
+success_end:
+ ret = EINA_TRUE;
+
+error_end:
+ _edje_cache_file_unref(edf);
+ return ret;
+}
+
EAPI Eina_Bool
edje_object_text_class_set(Evas_Object *obj, const char *text_class, const char *font, Evas_Font_Size size)
{
@@ -1401,7 +1535,7 @@ _efl_canvas_layout_efl_gfx_text_class_text_class_set(Eo *obj EINA_UNUSED, Edje *
text_class, font, size);
}
- efl_observer_update(obj, _edje_text_class_member, text_class, NULL);
+ efl_observer_update(obj, _edje_text_class_member, text_class, ed);
return EINA_TRUE;
}
@@ -1460,7 +1594,7 @@ _efl_canvas_layout_efl_gfx_text_class_text_class_del(Eo *obj EINA_UNUSED, Edje *
efl_gfx_text_class_del(rp->typedata.swallow->swallowed_object, text_class);
}
- efl_observer_update(obj, _edje_text_class_member, text_class, NULL);
+ efl_observer_update(obj, _edje_text_class_member, text_class, ed);
}
typedef struct _Edje_File_Text_Class_Iterator Edje_File_Text_Class_Iterator;
@@ -5828,24 +5962,28 @@ _edje_color_class_on_del(Edje *ed, Edje_Part *ep)
Edje_Text_Class *
_edje_text_class_find(Edje *ed, const char *text_class)
{
- Edje_Text_Class *tc;
+ Edje_Text_Class *tc = NULL;
+
+ if (!text_class) return NULL;
- if ((!ed) || (!text_class)) return NULL;
+ if (!ed)
+ {
+ /* If ed object is NULL, then look through the global scope only */
+ return eina_hash_find(_edje_text_class_hash, text_class);
+ }
/* first look through the object scope */
tc = eina_hash_find(ed->text_classes, text_class);
- if (tc) return tc;
-
+
/* next look through the global scope */
- tc = eina_hash_find(_edje_text_class_hash, text_class);
- if (tc) return tc;
+ if (!tc)
+ tc = eina_hash_find(_edje_text_class_hash, text_class);
/* finally, look through the file scope */
- if (ed->file)
+ if (!tc && ed->file)
tc = eina_hash_find(ed->file->text_hash, text_class);
- if (tc) return tc;
- return NULL;
+ return tc;
}
static Eina_Bool
diff --git a/src/lib/edje/efl_canvas_layout_part_text.eo b/src/lib/edje/efl_canvas_layout_part_text.eo
index a593424062..6c9c4cb06e 100644
--- a/src/lib/edje/efl_canvas_layout_part_text.eo
+++ b/src/lib/edje/efl_canvas_layout_part_text.eo
@@ -11,7 +11,7 @@ enum @beta Efl.Canvas.Layout_Part_Text_Expand
}
class @beta Efl.Canvas.Layout_Part_Text extends Efl.Canvas.Layout_Part implements Efl.Text,
-Efl.Text_Markup, Efl.Text_Format, Efl.Text.Font.Properties, Efl.Text_Style
+Efl.Text_Markup, Efl.Text_Format, Efl.Text_Font_Properties, Efl.Text_Style
{
[[Represents a TEXT part of a layout
@@ -38,8 +38,8 @@ Efl.Text_Markup, Efl.Text_Format, Efl.Text.Font.Properties, Efl.Text_Style
Efl.Text_Markup.markup { get; set; }
Efl.Text_Format.ellipsis { set; get; }
Efl.Text_Format.wrap { set; get; }
- Efl.Text.Font.Properties.font_family { set; get; }
- Efl.Text.Font.Properties.font_size { set; get; }
+ Efl.Text_Font_Properties.font_family { set; get; }
+ Efl.Text_Font_Properties.font_size { set; get; }
Efl.Text_Style.text_color { set; get; }
Efl.Text_Style.text_background_type { set; get; }
Efl.Text_Style.text_background_color { set; get;}
diff --git a/src/lib/efl/interfaces/efl_text_font_properties.eo b/src/lib/efl/interfaces/efl_text_font_properties.eo
index 796a020324..160b182803 100644
--- a/src/lib/efl/interfaces/efl_text_font_properties.eo
+++ b/src/lib/efl/interfaces/efl_text_font_properties.eo
@@ -36,9 +36,6 @@ enum @beta Efl.Text_Font_Slant {
italic, [[Italic font slant.]]
}
-/* FIXME: It needs to support "normal" option for non-color bitmap font.
- For supporting "normal" option, S/W glyph drawing engine should be updated.
- */
enum @beta Efl.Text_Font_Bitmap_Scalable {
[[Scalable of bitmap fonts.
]]
@@ -46,7 +43,7 @@ enum @beta Efl.Text_Font_Bitmap_Scalable {
color = (1 << 0), [[Enable scalable feature for color bitmap fonts.]]
}
-interface @beta Efl.Text.Font.Properties {
+interface @beta Efl.Text_Font_Properties {
[[Font settings for text.
]]
c_prefix: efl_text;
diff --git a/src/lib/elementary/efl_text_interactive.eo b/src/lib/elementary/efl_text_interactive.eo
index 85b5a811d7..933aad0cb1 100644
--- a/src/lib/elementary/efl_text_interactive.eo
+++ b/src/lib/elementary/efl_text_interactive.eo
@@ -1,6 +1,6 @@
import efl_text_types;
-interface @beta Efl.Text_Interactive extends Efl.Text, Efl.Text.Font.Properties,
+interface @beta Efl.Text_Interactive extends Efl.Text, Efl.Text_Font_Properties,
Efl.Text_Format, Efl.Text_Style
{
[[Interface for interactive (editable) text inputs (text entries).
diff --git a/src/lib/elementary/efl_ui_collection.c b/src/lib/elementary/efl_ui_collection.c
index 53eb344d4e..b6f96ba2da 100644
--- a/src/lib/elementary/efl_ui_collection.c
+++ b/src/lib/elementary/efl_ui_collection.c
@@ -146,6 +146,7 @@ typedef struct {
Fast_Accessor size_accessor;
Efl_Gfx_Entity *sizer;
unsigned int start_id, end_id;
+ Eina_Bool allow_manual_deselection : 1;
} Efl_Ui_Collection_Data;
static Eina_Bool register_item(Eo *obj, Efl_Ui_Collection_Data *pd, Efl_Ui_Item *item);
@@ -360,6 +361,8 @@ _efl_ui_collection_efl_object_constructor(Eo *obj, Efl_Ui_Collection_Data *pd EI
{
Eo *o;
+ efl_ui_selectable_allow_manual_deselection_set(obj, EINA_TRUE);
+
pd->dir = EFL_UI_LAYOUT_ORIENTATION_VERTICAL;
_fast_accessor_init(&pd->obj_accessor, &pd->items);
@@ -1087,7 +1090,7 @@ _efl_ui_collection_efl_ui_focus_manager_move(Eo *obj, Efl_Ui_Collection_Data *pd
}
else
{
- _item_scroll_internal(obj, pd, new_obj, .0, EINA_TRUE);
+ _item_scroll_internal(obj, pd, efl_provider_find(new_obj, EFL_UI_ITEM_CLASS), .0, EINA_TRUE);
}
return new_obj;
@@ -1176,6 +1179,19 @@ _efl_ui_collection_efl_ui_single_selectable_fallback_selection_get(const Eo *obj
return pd->fallback;
}
+EOLIAN static void
+_efl_ui_collection_efl_ui_single_selectable_allow_manual_deselection_set(Eo *obj EINA_UNUSED, Efl_Ui_Collection_Data *pd, Eina_Bool allow_manual_deselection)
+{
+ pd->allow_manual_deselection = !!allow_manual_deselection;
+}
+
+EOLIAN static Eina_Bool
+_efl_ui_collection_efl_ui_single_selectable_allow_manual_deselection_get(const Eo *obj EINA_UNUSED, Efl_Ui_Collection_Data *pd)
+{
+ return pd->allow_manual_deselection;
+}
+
+
#include "efl_ui_collection.eo.c"
#define ITEM_IS_OUTSIDE_VISIBLE(id) id < collection_pd->start_id || id > collection_pd->end_id
diff --git a/src/lib/elementary/efl_ui_collection.eo b/src/lib/elementary/efl_ui_collection.eo
index 4a5a440002..d890b1656e 100644
--- a/src/lib/elementary/efl_ui_collection.eo
+++ b/src/lib/elementary/efl_ui_collection.eo
@@ -97,6 +97,7 @@ class Efl.Ui.Collection extends Efl.Ui.Layout_Base implements
Efl.Ui.Multi_Selectable_Object_Range.range_select;
Efl.Ui.Multi_Selectable_Object_Range.range_unselect;
Efl.Ui.Single_Selectable.fallback_selection {get; set;}
+ Efl.Ui.Single_Selectable.allow_manual_deselection {get; set;}
}
}
diff --git a/src/lib/elementary/efl_ui_internal_text_interactive.c b/src/lib/elementary/efl_ui_internal_text_interactive.c
index 2bb112f265..4958a83582 100644
--- a/src/lib/elementary/efl_ui_internal_text_interactive.c
+++ b/src/lib/elementary/efl_ui_internal_text_interactive.c
@@ -1459,9 +1459,7 @@ _key_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void
info.position = efl_text_cursor_position_get(cur);
info.length = eina_unicode_utf8_get_len(string);
- efl_event_freeze(obj);
efl_text_cursor_text_insert(cur, string);
- efl_event_thaw(obj);
changed_user = EINA_TRUE;
ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
diff --git a/src/lib/elementary/efl_ui_internal_text_scroller.c b/src/lib/elementary/efl_ui_internal_text_scroller.c
index 3387759e38..7f10c2989a 100644
--- a/src/lib/elementary/efl_ui_internal_text_scroller.c
+++ b/src/lib/elementary/efl_ui_internal_text_scroller.c
@@ -63,7 +63,6 @@ _efl_ui_internal_text_scroller_efl_object_constructor(Eo *obj,
Efl_Ui_Internal_Text_Scroller_Data *sd EINA_UNUSED)
{
obj = efl_constructor(efl_super(obj, MY_CLASS));
- //EFL_UI_SCROLLER_DATA_GET_OR_RETURN(obj, psd, NULL);
efl_ui_scrollbar_bar_mode_set(obj,
EFL_UI_SCROLLBAR_MODE_OFF, EFL_UI_SCROLLBAR_MODE_OFF);
@@ -138,7 +137,6 @@ _efl_ui_internal_text_scroller_efl_object_finalize(Eo *obj,
efl_ui_scrollbar_bar_mode_set(obj,
EFL_UI_SCROLLBAR_MODE_OFF, EFL_UI_SCROLLBAR_MODE_OFF);
efl_content_set(obj, sd->text_table);
-
return obj;
}
@@ -170,16 +168,15 @@ _efl_ui_internal_text_scroller_scroller_mode_set(Eo *obj,
Efl_Ui_Internal_Text_Scroller_Data *sd,
Efl_Ui_Text_Scroller_Mode mode)
{
- EFL_UI_SCROLLER_DATA_GET_OR_RETURN(obj, psd);
sd->mode = mode;
if (mode == EFL_UI_TEXT_SCROLLER_MODE_MULTILINE)
{
- efl_ui_scrollbar_bar_mode_set(psd->smanager,
+ efl_ui_scrollbar_bar_mode_set(obj,
EFL_UI_SCROLLBAR_MODE_AUTO, EFL_UI_SCROLLBAR_MODE_AUTO);
}
else // default (single-line)
{
- efl_ui_scrollbar_bar_mode_set(psd->smanager,
+ efl_ui_scrollbar_bar_mode_set(obj,
EFL_UI_SCROLLBAR_MODE_OFF, EFL_UI_SCROLLBAR_MODE_OFF);
}
}
diff --git a/src/lib/elementary/efl_ui_item.c b/src/lib/elementary/efl_ui_item.c
index 85b50ee758..2504f410e0 100644
--- a/src/lib/elementary/efl_ui_item.c
+++ b/src/lib/elementary/efl_ui_item.c
@@ -96,7 +96,10 @@ _item_unpressed(void *data, const Efl_Event *ev EINA_UNUSED)
m = _fetch_state(pd->container);
if (pd->selected)
- efl_ui_selectable_selected_set(obj, EINA_FALSE);
+ {
+ if (efl_ui_selectable_allow_manual_deselection_get(pd->container))
+ efl_ui_selectable_selected_set(obj, EINA_FALSE);
+ }
else if (m != EFL_UI_SELECT_MODE_NONE)
efl_ui_selectable_selected_set(obj, EINA_TRUE);
}
diff --git a/src/lib/elementary/efl_ui_radio_group_impl.c b/src/lib/elementary/efl_ui_radio_group_impl.c
index 6a14f37115..ff1e085b8d 100644
--- a/src/lib/elementary/efl_ui_radio_group_impl.c
+++ b/src/lib/elementary/efl_ui_radio_group_impl.c
@@ -16,6 +16,18 @@ typedef struct {
Eina_Bool in_value_change;
} Efl_Ui_Radio_Group_Impl_Data;
+EOLIAN static void
+_efl_ui_radio_group_impl_efl_ui_single_selectable_allow_manual_deselection_set(Eo *obj EINA_UNUSED, Efl_Ui_Radio_Group_Impl_Data *pd EINA_UNUSED, Eina_Bool allow_manual_deselection EINA_UNUSED)
+{
+ if (allow_manual_deselection == EINA_FALSE)
+ ERR("This is right now not supported.");
+}
+
+EOLIAN static Eina_Bool
+_efl_ui_radio_group_impl_efl_ui_single_selectable_allow_manual_deselection_get(const Eo *obj EINA_UNUSED, Efl_Ui_Radio_Group_Impl_Data *pd EINA_UNUSED)
+{
+ return EINA_FALSE;
+}
EOLIAN static void
_efl_ui_radio_group_impl_efl_ui_single_selectable_fallback_selection_set(Eo *obj EINA_UNUSED, Efl_Ui_Radio_Group_Impl_Data *pd, Efl_Ui_Selectable *fallback)
diff --git a/src/lib/elementary/efl_ui_radio_group_impl.eo b/src/lib/elementary/efl_ui_radio_group_impl.eo
index 7e4fefe01b..6bc4379d39 100644
--- a/src/lib/elementary/efl_ui_radio_group_impl.eo
+++ b/src/lib/elementary/efl_ui_radio_group_impl.eo
@@ -12,5 +12,6 @@ class Efl.Ui.Radio_Group_Impl extends Efl.Object implements Efl.Ui.Radio_Group
Efl.Ui.Radio_Group.unregister;
Efl.Ui.Single_Selectable.last_selected {get;}
Efl.Ui.Single_Selectable.fallback_selection {set; get;}
+ Efl.Ui.Single_Selectable.allow_manual_deselection {set; get;}
}
}
diff --git a/src/lib/elementary/efl_ui_single_selectable.eo b/src/lib/elementary/efl_ui_single_selectable.eo
index 1044082cc6..6e65c0a0ac 100644
--- a/src/lib/elementary/efl_ui_single_selectable.eo
+++ b/src/lib/elementary/efl_ui_single_selectable.eo
@@ -30,6 +30,12 @@ interface Efl.Ui.Single_Selectable {
fallback : Efl.Ui.Selectable;
}
}
+ @property allow_manual_deselection {
+ [[This controlls if a selected item can be deselected due to clicking]]
+ values {
+ allow_manual_deselection : bool; [[$true if clicking while selected results in a state change to unselected]]
+ }
+ }
}
events {
selection_changed : void; [[Emitted when there is a change in the selection state. This event will collect all
diff --git a/src/lib/elementary/efl_ui_spin_button.c b/src/lib/elementary/efl_ui_spin_button.c
index 5ddd1f363a..514272fae4 100644
--- a/src/lib/elementary/efl_ui_spin_button.c
+++ b/src/lib/elementary/efl_ui_spin_button.c
@@ -24,7 +24,7 @@
//when a item is pressed but not released, this time passes by
//until another step is added or removed from the current value.
//given in seconds
-#define REPEAT_INTERVAL 0.85
+#define REPEAT_INTERVAL 0.2
static const char PART_NAME_ENTRY[] = "entry";
static const char PART_NAME_DEC_BUTTON[] = "dec_button";
diff --git a/src/lib/elementary/efl_ui_spotlight_manager_stack.c b/src/lib/elementary/efl_ui_spotlight_manager_stack.c
index d7d6d94c62..b89a4c6554 100644
--- a/src/lib/elementary/efl_ui_spotlight_manager_stack.c
+++ b/src/lib/elementary/efl_ui_spotlight_manager_stack.c
@@ -65,7 +65,6 @@ _efl_ui_spotlight_manager_stack_efl_ui_spotlight_manager_bind(Eo *obj, Efl_Ui_Sp
pd->alpha_anim = efl_add(EFL_CANVAS_ANIMATION_ALPHA_CLASS, obj);
efl_animation_alpha_set(pd->alpha_anim, 0.0, 1.0);
efl_animation_duration_set(pd->alpha_anim, 0.5);
- efl_animation_final_state_keep_set(pd->alpha_anim, EINA_TRUE);
for (int i = 0; i < efl_content_count(spotlight) ; ++i) {
Efl_Gfx_Entity *elem = efl_pack_content_get(spotlight, i);
@@ -144,6 +143,7 @@ _efl_ui_spotlight_manager_stack_efl_ui_spotlight_manager_switch_to(Eo *obj, Efl_
{
efl_event_callback_add(pd->content[0], EFL_CANVAS_OBJECT_ANIMATION_EVENT_ANIMATION_CHANGED, _hide_object_cb, obj);
efl_event_callback_add(pd->content[0], EFL_CANVAS_OBJECT_ANIMATION_EVENT_ANIMATION_PROGRESS_UPDATED, _running_cb, obj);
+ efl_gfx_stack_above(pd->content[1], pd->content[0]); //Stack the "to content" above the "from content"
}
}
else
diff --git a/src/lib/elementary/efl_ui_tab_bar.c b/src/lib/elementary/efl_ui_tab_bar.c
index 34e37299e2..da5ca2c43d 100644
--- a/src/lib/elementary/efl_ui_tab_bar.c
+++ b/src/lib/elementary/efl_ui_tab_bar.c
@@ -26,6 +26,19 @@ _efl_ui_tab_bar_efl_ui_single_selectable_fallback_selection_set(Eo *obj EINA_UNU
efl_ui_selectable_selected_set(pd->fallback_selection, EINA_TRUE);
}
+EOLIAN static void
+_efl_ui_tab_bar_efl_ui_single_selectable_allow_manual_deselection_set(Eo *obj EINA_UNUSED, Efl_Ui_Tab_Bar_Data *pd, Eina_Bool allow_manual_deselection)
+{
+ pd->allow_manual_deselection = !!allow_manual_deselection;
+}
+
+EOLIAN static Eina_Bool
+_efl_ui_tab_bar_efl_ui_single_selectable_allow_manual_deselection_get(const Eo *obj EINA_UNUSED, Efl_Ui_Tab_Bar_Data *pd)
+{
+ return pd->allow_manual_deselection;
+}
+
+
EOLIAN static Efl_Ui_Selectable*
_efl_ui_tab_bar_efl_ui_single_selectable_fallback_selection_get(const Eo *obj EINA_UNUSED, Efl_Ui_Tab_Bar_Data *pd)
{
diff --git a/src/lib/elementary/efl_ui_tab_bar.eo b/src/lib/elementary/efl_ui_tab_bar.eo
index cf06e0de47..c077cf0a57 100644
--- a/src/lib/elementary/efl_ui_tab_bar.eo
+++ b/src/lib/elementary/efl_ui_tab_bar.eo
@@ -15,6 +15,7 @@ class @beta Efl.Ui.Tab_Bar extends Efl.Ui.Layout_Base
Efl.Object.destructor;
Efl.Ui.Single_Selectable.last_selected {get;}
Efl.Ui.Single_Selectable.fallback_selection {get; set;}
+ Efl.Ui.Single_Selectable.allow_manual_deselection {get; set;}
Efl.Pack.pack;
Efl.Pack.pack_clear;
Efl.Pack.unpack_all;
diff --git a/src/lib/elementary/efl_ui_tab_bar_private.h b/src/lib/elementary/efl_ui_tab_bar_private.h
index 87763a9e87..02775c36a7 100644
--- a/src/lib/elementary/efl_ui_tab_bar_private.h
+++ b/src/lib/elementary/efl_ui_tab_bar_private.h
@@ -8,6 +8,7 @@ struct _Efl_Ui_Tab_Bar_Data
Efl_Ui_Box *bx;
Efl_Ui_Item *selected, *fallback_selection;
Eina_Bool in_value_change;
+ Eina_Bool allow_manual_deselection : 1;
};
#define EFL_UI_TAB_BAR_DATA_GET(o, sd) \
diff --git a/src/lib/elementary/efl_ui_textbox.c b/src/lib/elementary/efl_ui_textbox.c
index da63751e53..c3bbf688b7 100644
--- a/src/lib/elementary/efl_ui_textbox.c
+++ b/src/lib/elementary/efl_ui_textbox.c
@@ -816,24 +816,10 @@ _efl_ui_textbox_efl_canvas_group_group_calculate(Eo *obj, Efl_Ui_Textbox_Data *s
if (sd->scroll)
{
- if (!efl_text_multiline_get(obj))
- {
- efl_ui_internal_text_scroller_mode_set(sd->scroller,
- EFL_UI_TEXT_SCROLLER_MODE_SINGLELINE);
- }
- else
- {
- efl_ui_internal_text_scroller_mode_set(sd->scroller,
- EFL_UI_TEXT_SCROLLER_MODE_MULTILINE);
-
- }
-
efl_canvas_group_calculate(sd->scroller);
min = efl_gfx_hint_size_min_get(sd->scroller);
if (!efl_text_multiline_get(obj))
{
- efl_ui_internal_text_scroller_mode_set(sd->scroller,
- EFL_UI_TEXT_SCROLLER_MODE_SINGLELINE);
edje_object_size_min_calc(wd->resize_obj, &edmin.w, &edmin.h);
min.w = edmin.w;
min.h = edmin.h;
@@ -2138,6 +2124,26 @@ _efl_ui_textbox_efl_object_destructor(Eo *obj, Efl_Ui_Textbox_Data *sd)
}
EOLIAN static void
+_efl_ui_textbox_efl_text_format_multiline_set(Eo *obj, Efl_Ui_Textbox_Data *sd, Eina_Bool enabled)
+{
+ enabled = !!enabled;
+ if (efl_text_multiline_get(obj) == enabled) return;
+ efl_text_multiline_set(sd->text_obj, enabled);
+
+ if (sd->scroller)
+ {
+ if (enabled)
+ {
+ efl_ui_internal_text_scroller_mode_set(sd->scroller, EFL_UI_TEXT_SCROLLER_MODE_MULTILINE);
+ }
+ else
+ {
+ efl_ui_internal_text_scroller_mode_set(sd->scroller, EFL_UI_TEXT_SCROLLER_MODE_SINGLELINE);
+ }
+ }
+}
+
+EOLIAN static void
_efl_ui_textbox_efl_text_format_password_set(Eo *obj, Efl_Ui_Textbox_Data *sd, Eina_Bool password)
{
password = !!password;
@@ -2429,7 +2435,7 @@ _efl_ui_textbox_cnp_mode_get(const Eo *obj EINA_UNUSED, Efl_Ui_Textbox_Data *sd)
}
EOLIAN static void
-_efl_ui_textbox_scrollable_set(Eo *obj EINA_UNUSED, Efl_Ui_Textbox_Data *sd, Eina_Bool scroll)
+_efl_ui_textbox_scrollable_set(Eo *obj, Efl_Ui_Textbox_Data *sd, Eina_Bool scroll)
{
if (sd->scroll == scroll) return;
sd->scroll = scroll;
@@ -2440,7 +2446,12 @@ _efl_ui_textbox_scrollable_set(Eo *obj EINA_UNUSED, Efl_Ui_Textbox_Data *sd, Ein
sd->scroller = efl_add(EFL_UI_INTERNAL_TEXT_SCROLLER_CLASS, obj,
efl_ui_internal_text_scroller_initialize(efl_added,
sd->text_obj, sd->text_table));
- efl_ui_scrollbar_bar_mode_set(sd->scroller, EFL_UI_SCROLLBAR_MODE_AUTO, EFL_UI_SCROLLBAR_MODE_AUTO);
+
+ if (efl_text_multiline_get(obj))
+ efl_ui_internal_text_scroller_mode_set(sd->scroller, EFL_UI_TEXT_SCROLLER_MODE_MULTILINE);
+ else
+ efl_ui_internal_text_scroller_mode_set(sd->scroller, EFL_UI_TEXT_SCROLLER_MODE_SINGLELINE);
+
efl_content_set(efl_part(sd->entry_edje, "efl.text"), sd->scroller);
efl_canvas_object_clipper_set(sd->cursor,
efl_ui_internal_text_scroller_viewport_clip_get(sd->scroller));
@@ -3711,11 +3722,11 @@ _part_is_efl_ui_text_part(const Eo *obj EINA_UNUSED, const char *part)
//FIXME
//ELM_PART_OVERRIDE_PARTIAL(efl_ui_text, EFL_UI_TEXTBOX, Efl_Ui_Textbox_Data, _part_is_efl_ui_text_part)
EOLIAN static Efl_Object *
-_efl_ui_textbox_efl_part_part_get(const Eo *obj, Efl_Ui_Textbox_Data *priv EINA_UNUSED, const char *part)
+_efl_ui_textbox_efl_part_part_get(const Eo *obj, Efl_Ui_Textbox_Data *priv EINA_UNUSED, const char *part)
{
EINA_SAFETY_ON_NULL_RETURN_VAL(part, NULL);
if (_part_is_efl_ui_text_part(obj, part)) return ELM_PART_IMPLEMENT(EFL_UI_TEXT_PART_CLASS, obj, part);
- return efl_part_get(efl_super(obj, EFL_UI_TEXTBOX_CLASS), part);
+ return efl_part_get(efl_super(obj, EFL_UI_TEXTBOX_CLASS), part);
}
//FIXME
diff --git a/src/lib/elementary/efl_ui_textbox.eo b/src/lib/elementary/efl_ui_textbox.eo
index 9104d436b2..b723c59e44 100644
--- a/src/lib/elementary/efl_ui_textbox.eo
+++ b/src/lib/elementary/efl_ui_textbox.eo
@@ -103,6 +103,7 @@ class @beta Efl.Ui.Textbox extends Efl.Ui.Layout_Base implements Efl.Input.Click
Efl.Ui.Widget.interest_region { get; }
Efl.Ui.Widget.disabled {set;}
Efl.Text_Format.password {set;}
+ Efl.Text_Format.multiline {set;}
//Efl.Ui.Widget.widget_sub_object_del;
//Elm.Interface_Scrollable.policy { set; }
//Elm.Interface_Scrollable.bounce_allow { set; }
diff --git a/src/lib/elementary/efl_ui_vg_animation_eo.legacy.c b/src/lib/elementary/efl_ui_vg_animation_eo.legacy.c
index eca7abf616..ad99d1b8a9 100644
--- a/src/lib/elementary/efl_ui_vg_animation_eo.legacy.c
+++ b/src/lib/elementary/efl_ui_vg_animation_eo.legacy.c
@@ -70,6 +70,8 @@ elm_animation_view_frame_get(const Efl_Ui_Vg_Animation *obj)
EAPI Eina_Bool
elm_animation_view_play(Efl_Ui_Vg_Animation *obj)
{
+ double speed = efl_player_playback_speed_get(obj);
+ efl_player_playback_speed_set(obj, speed < 0 ? speed * -1 : speed);
return efl_player_playing_set(obj, EINA_TRUE);
}
@@ -77,7 +79,7 @@ EAPI Eina_Bool
elm_animation_view_play_back(Efl_Ui_Vg_Animation *obj)
{
double speed = efl_player_playback_speed_get(obj);
- efl_player_playback_speed_set(obj, speed < 0 ? speed * -1 : speed);
+ efl_player_playback_speed_set(obj, speed > 0 ? speed * -1 : speed);
return efl_player_playing_set(obj, EINA_TRUE);
}
diff --git a/src/lib/evas/canvas/efl_canvas_animation_scale.eo b/src/lib/evas/canvas/efl_canvas_animation_scale.eo
index 58a44f132f..ab691617b4 100644
--- a/src/lib/evas/canvas/efl_canvas_animation_scale.eo
+++ b/src/lib/evas/canvas/efl_canvas_animation_scale.eo
@@ -48,7 +48,7 @@ class Efl.Canvas.Animation_Scale extends Efl.Canvas.Animation
values {
from_scale: Eina.Vector2; [[Initial scale value.]]
to_scale: Eina.Vector2; [[Ending scale value.]]
- pivot_point: Eina.Position2D; [[Position of the pivot point relative to the canvas.]]
+ pivot_point: Eina.Position2D; [[Position of the pivot point relative to the canvas. If $null the target passed to @Efl.Canvas.Animation.animation_apply is used as pivot element]]
}
}
}
diff --git a/src/lib/evas/canvas/efl_canvas_textblock.eo b/src/lib/evas/canvas/efl_canvas_textblock.eo
index 724103040a..031f74a13e 100644
--- a/src/lib/evas/canvas/efl_canvas_textblock.eo
+++ b/src/lib/evas/canvas/efl_canvas_textblock.eo
@@ -1,7 +1,7 @@
import efl_text_types;
class @beta Efl.Canvas.Textblock extends Efl.Canvas.Object implements Efl.Text,
- Efl.Canvas.Filter.Internal, Efl.Text.Font.Properties,
+ Efl.Canvas.Filter.Internal, Efl.Text_Font_Properties,
Efl.Text_Style, Efl.Text_Format,
Efl.Text_Markup, Efl.Ui.I18n
{
@@ -9,7 +9,7 @@ class @beta Efl.Canvas.Textblock extends Efl.Canvas.Object implements Efl.Text,
if you need user interaction consider the classes in $[Efl.Ui].
Note: No text will be rendered until a font, a font size and a font color are specified.
- This can be accomplished using @Efl.Text.Font.Properties.font_family, @Efl.Text.Font.Properties.font_size and
+ This can be accomplished using @Efl.Text_Font_Properties.font_family, @Efl.Text_Font_Properties.font_size and
@Efl.Text_Style.text_color.
Alternatively, @.style_apply can be used providing the attributes $font, $font_size and $color.
]]
@@ -92,7 +92,7 @@ class @beta Efl.Canvas.Textblock extends Efl.Canvas.Object implements Efl.Text,
[[Applies several style attributes at once using a formatting string.
Given style attributes override previous values, leaving other attributes unaffected.
This is akin to setting individual style attributes using properties like
- @Efl.Text.Font.Properties.font_slant or @Efl.Text_Format.wrap, for example.
+ @Efl.Text_Font_Properties.font_slant or @Efl.Text_Format.wrap, for example.
The formatting string is a whitespace-separated list of $[attribute=value] pairs.
@@ -101,43 +101,43 @@ class @beta Efl.Canvas.Textblock extends Efl.Canvas.Object implements Efl.Text,
- $font: Name of the font to use.
Default value is empty, meaning that no text will be rendered.
Requires $font_size and $font_color.
- See @Efl.Text.Font.Properties.font_family.
+ See @Efl.Text_Font_Properties.font_family.
- $font_fallbacks: Comma-delimited list of fonts to try if finding the primary font fails.
Example: $[font_fallbacks=consolas,courier,monospace].
Default value is empty.
- See @Efl.Text.Font.Properties.font_fallbacks.
+ See @Efl.Text_Font_Properties.font_fallbacks.
- $font_size: Height of font, in points.
Default value is 0.
Requires $font and $font_color.
- See @Efl.Text.Font.Properties.font_size.
+ See @Efl.Text_Font_Properties.font_size.
- $font_source: Path to the file containing the font to use.
Example: $[font_source=/usr/share/fonts/Sans.ttf].
Default value is empty.
- See @Efl.Text.Font.Properties.font_source.
+ See @Efl.Text_Font_Properties.font_source.
- $font_weight: Thickness of the font. The value must be one of: $normal, $thin, $ultralight, $extralight,
$light, $book, $medium, $semibold, $bold, $ultrabold, $extrabold, $black and $extrablack.
Default value is $normal.
- See @Efl.Text.Font.Properties.font_weight.
+ See @Efl.Text_Font_Properties.font_weight.
- $font_style: Style of the font. The value must be one of: $normal, $oblique and $italic.
Default value is $normal.
- See @Efl.Text.Font.Properties.font_slant.
+ See @Efl.Text_Font_Properties.font_slant.
- $font_width: How wide the font is, relative to its height. The value must be one of:
$normal, $ultracondensed, $extracondensed, $condensed, $semicondensed, $semiexpanded, $expanded,
$extraexpanded and $ultraexpanded.
Default value is $normal.
- See @Efl.Text.Font.Properties.font_weight.
+ See @Efl.Text_Font_Properties.font_weight.
- $lang: A 2-letter ISO 639-1 language code, $auto (to use the system locale setting) or $none (to disable
language support).
Example: $[lang=he].
Default value is empty.
- See @Efl.Text.Font.Properties.font_lang.
+ See @Efl.Text_Font_Properties.font_lang.
- $color: Color code for the text (See bottom for the complete list of supported codes).
Default value is $[rgba(0,0,0,0)] meaning that no text will be rendered.
@@ -340,7 +340,7 @@ class @beta Efl.Canvas.Textblock extends Efl.Canvas.Object implements Efl.Text,
@property all_styles {
[[A string representing the complete set of attributes applied to this text object.
This includes the default attributes plus any additional style applied with @.style_apply
- or individual style properties like @Efl.Text.Font.Properties.font_slant or @Efl.Text_Format.wrap.
+ or individual style properties like @Efl.Text_Font_Properties.font_slant or @Efl.Text_Format.wrap.
See @.style_apply for the description of all attributes.
]]
@@ -455,15 +455,15 @@ class @beta Efl.Canvas.Textblock extends Efl.Canvas.Object implements Efl.Text,
Efl.Canvas.Filter.Internal.filter_dirty;
Efl.Canvas.Filter.Internal.filter_input_render;
Efl.Canvas.Filter.Internal.filter_state_prepare;
- Efl.Text.Font.Properties.font_family { get; set; }
- Efl.Text.Font.Properties.font_size { get; set; }
- Efl.Text.Font.Properties.font_source { get; set; }
- Efl.Text.Font.Properties.font_fallbacks { get; set; }
- Efl.Text.Font.Properties.font_lang { get; set; }
- Efl.Text.Font.Properties.font_weight { get; set; }
- Efl.Text.Font.Properties.font_slant { get; set; }
- Efl.Text.Font.Properties.font_width { get; set; }
- Efl.Text.Font.Properties.font_bitmap_scalable { get; set; }
+ Efl.Text_Font_Properties.font_family { get; set; }
+ Efl.Text_Font_Properties.font_size { get; set; }
+ Efl.Text_Font_Properties.font_source { get; set; }
+ Efl.Text_Font_Properties.font_fallbacks { get; set; }
+ Efl.Text_Font_Properties.font_lang { get; set; }
+ Efl.Text_Font_Properties.font_weight { get; set; }
+ Efl.Text_Font_Properties.font_slant { get; set; }
+ Efl.Text_Font_Properties.font_width { get; set; }
+ Efl.Text_Font_Properties.font_bitmap_scalable { get; set; }
Efl.Text_Style.text_color { get; set; }
Efl.Text_Style.text_background_type { get; set; }
Efl.Text_Style.text_background_color { get; set; }
diff --git a/src/lib/evas/canvas/efl_text_cursor.c b/src/lib/evas/canvas/efl_text_cursor.c
index b52298c1c0..eb699728b8 100644
--- a/src/lib/evas/canvas/efl_text_cursor.c
+++ b/src/lib/evas/canvas/efl_text_cursor.c
@@ -246,7 +246,8 @@ _cursor_text_append(Efl_Text_Cursor_Handle *cur,
const char *off = text;
int len = 0;
- Evas_Object_Protected_Data *obj = efl_data_scope_get(cur->obj, EFL_CANVAS_OBJECT_CLASS);
+ Evas_Object_Protected_Data *obj = efl_data_scope_safe_get(cur->obj, EFL_CANVAS_OBJECT_CLASS);
+ EINA_SAFETY_ON_NULL_RETURN_VAL(obj, 0);
evas_object_async_block(obj);
while (*off)
@@ -412,7 +413,8 @@ _efl_text_cursor_range_delete(Eo *obj EINA_UNUSED, Efl_Text_Cursor_Data *pd, Efl
EAPI void
efl_text_cursor_handle_set(Eo *obj, Efl_Text_Cursor_Handle *handle)
{
- Efl_Text_Cursor_Data *pd = efl_data_scope_get(obj, MY_CLASS);
+ Efl_Text_Cursor_Data *pd = efl_data_scope_safe_get(obj, MY_CLASS);
+ EINA_SAFETY_ON_NULL_RETURN(pd);
if (handle == pd->handle)
return;
@@ -429,7 +431,8 @@ efl_text_cursor_handle_set(Eo *obj, Efl_Text_Cursor_Handle *handle)
EAPI Efl_Text_Cursor_Handle *
efl_text_cursor_handle_get(const Eo *obj)
{
- Efl_Text_Cursor_Data *pd = efl_data_scope_get(obj, MY_CLASS);
+ Efl_Text_Cursor_Data *pd = efl_data_scope_safe_get(obj, MY_CLASS);
+ EINA_SAFETY_ON_NULL_RETURN_VAL(pd, NULL);
return pd->handle;
}
diff --git a/src/lib/evas/canvas/efl_text_formatter.c b/src/lib/evas/canvas/efl_text_formatter.c
index 8325245cd2..aea3e42356 100644
--- a/src/lib/evas/canvas/efl_text_formatter.c
+++ b/src/lib/evas/canvas/efl_text_formatter.c
@@ -121,7 +121,8 @@ efl_text_formatter_item_geometry_get(const Efl_Text_Attribute_Handle *annotation
Efl_Text_Cursor_Handle cur;
Eo *eo_obj = annotation->obj;
- Evas_Object_Protected_Data *obj_data = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
+ Evas_Object_Protected_Data *obj_data = efl_data_scope_safe_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
+ EINA_SAFETY_ON_NULL_RETURN_VAL(obj_data, EINA_FALSE);
evas_object_async_block(obj_data);
_evas_textblock_relayout_if_needed(eo_obj);
diff --git a/src/lib/evas/canvas/evas_callbacks.c b/src/lib/evas/canvas/evas_callbacks.c
index d9aac154f8..14ab286acd 100644
--- a/src/lib/evas/canvas/evas_callbacks.c
+++ b/src/lib/evas/canvas/evas_callbacks.c
@@ -872,3 +872,10 @@ evas_object_callbacks_event_catcher_del(Eo *eo_obj EINA_UNUSED, Evas_Object_Prot
}
}
+void
+evas_object_callbacks_shutdown(Eo *eo_obj EINA_UNUSED, Evas_Object_Protected_Data *obj)
+{
+ if (obj->animator_ref > 0)
+ efl_event_callback_del(obj->layer->evas->evas, EFL_CANVAS_OBJECT_EVENT_ANIMATOR_TICK, _animator_repeater, obj);
+ obj->animator_ref = 0;
+}
diff --git a/src/lib/evas/canvas/evas_object_main.c b/src/lib/evas/canvas/evas_object_main.c
index 6b78b581e7..f01ab01e41 100644
--- a/src/lib/evas/canvas/evas_object_main.c
+++ b/src/lib/evas/canvas/evas_object_main.c
@@ -1179,7 +1179,7 @@ _efl_canvas_object_efl_object_destructor(Eo *eo_obj, Evas_Object_Protected_Data
end:
evas_object_event_callback_all_del(eo_obj);
evas_object_event_callback_cleanup(eo_obj);
-
+ evas_object_callbacks_shutdown(eo_obj, obj);
efl_destructor(efl_super(eo_obj, MY_CLASS));
}
diff --git a/src/lib/evas/canvas/evas_object_text.c b/src/lib/evas/canvas/evas_object_text.c
index 6cacf8e899..e016585591 100644
--- a/src/lib/evas/canvas/evas_object_text.c
+++ b/src/lib/evas/canvas/evas_object_text.c
@@ -410,6 +410,8 @@ _evas_text_font_reload(Eo *eo_obj, Evas_Text_Data *o)
Eina_Bool source_invisible = EINA_FALSE;
Eina_List *was = NULL;
+ if (o->cur.size == 0 || (!o->cur.font && !o->cur.source)) return ;
+
if (!(obj->layer->evas->is_frozen))
{
pass = evas_event_passes_through(eo_obj, obj);
diff --git a/src/lib/evas/canvas/evas_object_textblock.c b/src/lib/evas/canvas/evas_object_textblock.c
index 2347961759..817008c889 100644
--- a/src/lib/evas/canvas/evas_object_textblock.c
+++ b/src/lib/evas/canvas/evas_object_textblock.c
@@ -8524,7 +8524,7 @@ static void
_evas_object_textblock_text_markup_prepend(Eo *eo_obj,
Efl_Text_Cursor_Handle *cur, const char *text)
{
- if (!cur) return;
+ if (!cur || !text || !*text) return;
Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
evas_object_async_block(obj);
TB_HEAD();
@@ -8533,140 +8533,138 @@ _evas_object_textblock_text_markup_prepend(Eo *eo_obj,
* this should be done once, when markup_prepend finished */
o->pause_change = EINA_TRUE;
- if (text)
- {
- char *s, *p;
- char *tag_start, *tag_end, *esc_start, *esc_end;
-
- tag_start = tag_end = esc_start = esc_end = NULL;
- p = (char *)text;
- s = p;
- /* This loop goes through all of the mark up text until it finds format
- * tags, escape sequences or the terminating NULL. When it finds either
- * of those, it appends the text found up until that point to the textblock
- * proccesses whatever found. It repeats itself until the terminating
- * NULL is reached. */
- for (;;)
- {
- size_t text_len;
- /* If we got to the end of string or just finished/started tag
- * or escape sequence handling. */
- if ((*p == 0) ||
- (tag_end) || (esc_end) ||
- (tag_start) || (esc_start))
+ char *s, *p;
+ char *tag_start, *tag_end, *esc_start, *esc_end;
+
+ tag_start = tag_end = esc_start = esc_end = NULL;
+ p = (char *)text;
+ s = p;
+ /* This loop goes through all of the mark up text until it finds format
+ * tags, escape sequences or the terminating NULL. When it finds either
+ * of those, it appends the text found up until that point to the textblock
+ * proccesses whatever found. It repeats itself until the terminating
+ * NULL is reached. */
+ for (;;)
+ {
+ size_t text_len;
+ /* If we got to the end of string or just finished/started tag
+ * or escape sequence handling. */
+ if ((*p == 0) ||
+ (tag_end) || (esc_end) ||
+ (tag_start) || (esc_start))
+ {
+ if (tag_end)
{
- if (tag_end)
- {
- /* If we reached to a tag ending, analyze the tag */
- char *ttag;
- size_t ttag_len = tag_end - tag_start;
+ /* If we reached to a tag ending, analyze the tag */
+ char *ttag;
+ size_t ttag_len = tag_end - tag_start;
- ttag = malloc(ttag_len + 1);
- if (ttag)
- {
- memcpy(ttag, tag_start, ttag_len);
- ttag[ttag_len] = 0;
- evas_textblock_cursor_format_prepend(cur, ttag);
- free(ttag);
- }
- tag_start = tag_end = NULL;
- }
- else if (esc_end)
- {
- _prepend_escaped_char(cur, esc_start, esc_end + 1);
- esc_start = esc_end = NULL;
- }
- else if (*p == 0 && esc_start) /* escape start with no end, append it as text */
- {
- _prepend_text_run(cur, esc_start, p);
- esc_start = esc_end = NULL;
- s = NULL;
- }
- else if (*p == 0)
+ ttag = malloc(ttag_len + 1);
+ if (ttag)
{
- _prepend_text_run(cur, s, p);
- s = NULL;
+ memcpy(ttag, tag_start, ttag_len);
+ ttag[ttag_len] = 0;
+ evas_textblock_cursor_format_prepend(cur, ttag);
+ free(ttag);
}
- if (*p == 0)
- break;
+ tag_start = tag_end = NULL;
}
- if (*p == '<')
+ else if (esc_end)
{
- if (esc_start) /* escape start with no end, append it as text */
- {
- _prepend_text_run(cur, esc_start, p);
- esc_start = esc_end = NULL;
- s = NULL;
- }
- if (!esc_start)
- {
- /* Append the text prior to this to the textblock and mark
- * the start of the tag */
- tag_start = p;
- tag_end = NULL;
- _prepend_text_run(cur, s, p);
- s = NULL;
- }
+ _prepend_escaped_char(cur, esc_start, esc_end + 1);
+ esc_start = esc_end = NULL;
}
- else if (*p == '>')
+ else if (*p == 0 && esc_start) /* escape start with no end, append it as text */
{
- if (tag_start)
- {
- tag_end = p + 1;
- s = p + 1;
- }
+ _prepend_text_run(cur, esc_start, p);
+ esc_start = esc_end = NULL;
+ s = NULL;
}
- else if (*p == '&')
+ else if (*p == 0)
{
- if (esc_start) /* escape start with no end, append it as text */
- {
- _prepend_text_run(cur, esc_start, p);
- esc_start = esc_end = NULL;
- s = NULL;
- }
- if (!tag_start)
- {
- /* Append the text prior to this to the textblock and mark
- * the start of the escape sequence */
- esc_start = p;
- esc_end = NULL;
- _prepend_text_run(cur, s, p);
- s = NULL;
- }
+ _prepend_text_run(cur, s, p);
+ s = NULL;
}
- else if (*p == ';')
+ if (*p == 0)
+ break;
+ }
+ if (*p == '<')
+ {
+ if (esc_start) /* escape start with no end, append it as text */
{
- if (esc_start)
- {
- esc_end = p;
- s = p + 1;
- }
+ _prepend_text_run(cur, esc_start, p);
+ esc_start = esc_end = NULL;
+ s = NULL;
}
- /* Unicode object replacement char */
- else if (!strncmp(_REPLACEMENT_CHAR_UTF8, p,
- text_len = strlen(_REPLACEMENT_CHAR_UTF8)) ||
- !strncmp(_NEWLINE_UTF8, p,
- text_len = strlen(_NEWLINE_UTF8)) ||
- !strncmp(_TAB_UTF8, p,
- text_len = strlen(_TAB_UTF8)) ||
- !strncmp(_PARAGRAPH_SEPARATOR_UTF8, p,
- text_len = strlen(_PARAGRAPH_SEPARATOR_UTF8)))
+ if (!esc_start)
{
- /*FIXME: currently just remove them, maybe do something
- * fancier in the future, atm it breaks if this char
- * is inside <> */
+ /* Append the text prior to this to the textblock and mark
+ * the start of the tag */
+ tag_start = p;
+ tag_end = NULL;
_prepend_text_run(cur, s, p);
- /* it's also advanced later in this loop need +text_len
- in total*/
- p += text_len - 1;
- s = p + 1; /* One after the end of the replacement char */
+ s = NULL;
}
- p++;
}
+ else if (*p == '>')
+ {
+ if (tag_start)
+ {
+ tag_end = p + 1;
+ s = p + 1;
+ }
+ }
+ else if (*p == '&')
+ {
+ if (esc_start) /* escape start with no end, append it as text */
+ {
+ _prepend_text_run(cur, esc_start, p);
+ esc_start = esc_end = NULL;
+ s = NULL;
+ }
+ if (!tag_start)
+ {
+ /* Append the text prior to this to the textblock and mark
+ * the start of the escape sequence */
+ esc_start = p;
+ esc_end = NULL;
+ _prepend_text_run(cur, s, p);
+ s = NULL;
+ }
+ }
+ else if (*p == ';')
+ {
+ if (esc_start)
+ {
+ esc_end = p;
+ s = p + 1;
+ }
+ }
+ /* Unicode object replacement char */
+ else if (!strncmp(_REPLACEMENT_CHAR_UTF8, p,
+ text_len = strlen(_REPLACEMENT_CHAR_UTF8)) ||
+ !strncmp(_NEWLINE_UTF8, p,
+ text_len = strlen(_NEWLINE_UTF8)) ||
+ !strncmp(_TAB_UTF8, p,
+ text_len = strlen(_TAB_UTF8)) ||
+ !strncmp(_PARAGRAPH_SEPARATOR_UTF8, p,
+ text_len = strlen(_PARAGRAPH_SEPARATOR_UTF8)))
+ {
+ /*FIXME: currently just remove them, maybe do something
+ * fancier in the future, atm it breaks if this char
+ * is inside <> */
+ _prepend_text_run(cur, s, p);
+ /* it's also advanced later in this loop need +text_len
+ in total*/
+ p += text_len - 1;
+ s = p + 1; /* One after the end of the replacement char */
+ }
+ p++;
}
o->pause_change = EINA_FALSE;
+ efl_event_callback_call(cur->obj, EFL_CANVAS_TEXTBLOCK_EVENT_CHANGED, NULL);
_evas_textblock_changed(o, eo_obj);
}
diff --git a/src/lib/evas/include/evas_private.h b/src/lib/evas/include/evas_private.h
index 20a04959f8..aacbe016f8 100644
--- a/src/lib/evas/include/evas_private.h
+++ b/src/lib/evas/include/evas_private.h
@@ -1623,6 +1623,7 @@ void evas_event_callback_call(Evas *e, Evas_Callback_Type type, void *event_info
void evas_object_callbacks_finalized(Eo *eo_obj EINA_UNUSED, Evas_Object_Protected_Data *obj);
void evas_object_callbacks_event_catcher_add(Eo *eo_obj EINA_UNUSED, Evas_Object_Protected_Data *obj, const Efl_Callback_Array_Item *array);
void evas_object_callbacks_event_catcher_del(Eo *eo_obj EINA_UNUSED, Evas_Object_Protected_Data *obj, const Efl_Callback_Array_Item *array);
+void evas_object_callbacks_shutdown(Eo *eo_obj EINA_UNUSED, Evas_Object_Protected_Data *obj);
void evas_object_event_callback_call(Evas_Object *obj, Evas_Object_Protected_Data *pd, Evas_Callback_Type type, void *event_info, int event_id, const Efl_Event_Description *efl_event_desc);
Eina_List *evas_event_objects_event_list(Evas *e, Evas_Object *stop, int x, int y);
diff --git a/src/modules/evas/engines/gl_drm/evas_engine.c b/src/modules/evas/engines/gl_drm/evas_engine.c
index a5b4c7a4c8..8c1d6013e7 100644
--- a/src/modules/evas/engines/gl_drm/evas_engine.c
+++ b/src/modules/evas/engines/gl_drm/evas_engine.c
@@ -3,8 +3,6 @@
#include "../gl_common/evas_gl_define.h"
#include "../software_generic/evas_native_common.h"
-#include <wayland-client.h>
-
#ifdef HAVE_DLSYM
# include <dlfcn.h> /* dlopen,dlclose,etc */
#else
diff --git a/src/tests/efl_mono/EinaTestData.cs b/src/tests/efl_mono/EinaTestData.cs
index 5b8c84db81..9727548f93 100644
--- a/src/tests/efl_mono/EinaTestData.cs
+++ b/src/tests/efl_mono/EinaTestData.cs
@@ -17,6 +17,7 @@ using System;
using System.Linq;
using System.Runtime.InteropServices;
using System.Runtime.CompilerServices;
+using System.Diagnostics.Contracts;
namespace EinaTestData
{
@@ -95,6 +96,8 @@ public static class BaseData
[ CallerLineNumber ] int line = 0,
[ CallerFilePath ] string file = null,
[ CallerMemberName ] string member = null) {
+ Contract.Requires(a != null, nameof(a));
+ Contract.Requires(b != null, nameof(b));
Test.Assert(a.Length == b.Length, "Different lenght", line, file, member);
for (int i = 0; i < a.Length; ++i)
{
diff --git a/src/tests/elementary/efl_ui_test_text.c b/src/tests/elementary/efl_ui_test_text.c
index 5c26e6f528..49ba50d91d 100644
--- a/src/tests/elementary/efl_ui_test_text.c
+++ b/src/tests/elementary/efl_ui_test_text.c
@@ -5,6 +5,7 @@
#define EFL_LAYOUT_CALC_PROTECTED
#include <Efl_Ui.h>
#include "efl_ui_suite.h"
+#include "Evas_Legacy.h"
static void
increment_int_changed(void *data EINA_UNUSED, const Efl_Event *ev EINA_UNUSED)
@@ -153,6 +154,30 @@ EFL_START_TEST(text_scroll_mode)
}
EFL_END_TEST
+EFL_START_TEST(text_change_event)
+{
+ Eo *txt;
+ Eo *win = win_add();
+
+ txt = efl_add(EFL_UI_TEXTBOX_CLASS, win);
+ efl_gfx_entity_size_set(txt, EINA_SIZE2D(300, 300));
+ efl_text_set(txt, "Hello");
+ int i_changed = 0;
+ efl_event_callback_add(txt, EFL_UI_TEXTBOX_EVENT_CHANGED, increment_int_changed, &i_changed);
+ efl_gfx_entity_visible_set(txt, EINA_TRUE);
+ Evas *e = evas_object_evas_get(txt);
+ efl_ui_focus_util_focus(txt);
+ evas_event_feed_key_down(e, "s", "s", "s", "s", time(NULL), NULL);
+ ecore_main_loop_iterate();
+ ck_assert_str_eq(efl_text_get(txt),"Hellos");
+ ck_assert_int_eq(i_changed,1);
+ ecore_main_loop_iterate();
+
+ efl_del(txt);
+ efl_del(win);
+}
+EFL_END_TEST
+
void efl_ui_test_text(TCase *tc)
{
tcase_add_test(tc, text_cnp);
@@ -160,4 +185,5 @@ void efl_ui_test_text(TCase *tc)
tcase_add_test(tc, text_selection);
tcase_add_test(tc, text_user_change);
tcase_add_test(tc, text_scroll_mode);
+ tcase_add_test(tc, text_change_event);
}
diff --git a/src/tests/elementary/elm_test_entry.c b/src/tests/elementary/elm_test_entry.c
index 1b383b2936..4655a688ba 100644
--- a/src/tests/elementary/elm_test_entry.c
+++ b/src/tests/elementary/elm_test_entry.c
@@ -518,6 +518,78 @@ EFL_START_TEST(elm_entry_file_get_set)
}
EFL_END_TEST
+EFL_START_TEST(elm_entry_test_text_class)
+{
+ Evas_Object *win, *entry1, *entry2, *entry3, *entry4;
+ const char *filename = NULL;
+ int w1 = 0, h1 = 0, w2 = 0, h2 = 0, w3 = 0, h3 = 0;
+ const char *font;
+ int font_size;
+
+ win = win_add(NULL, "entry", ELM_WIN_BASIC);
+ entry1 = elm_entry_add(win);
+ entry2 = elm_entry_add(win);
+ entry3 = elm_entry_add(win);
+
+ elm_object_text_set(entry1, "hello");
+ elm_object_text_set(entry2, "hello");
+ elm_object_text_set(entry3, "hello");
+
+ edje_object_file_get(elm_layout_edje_get(entry1), &filename, NULL);
+ ck_assert(filename != NULL);
+
+ ck_assert(edje_file_text_class_set(filename, "entry_text", "Serif:Style=Bold", 24));
+
+ ck_assert(edje_object_text_class_get(elm_layout_edje_get(entry1), "entry_text", &font, &font_size));
+ ck_assert_int_eq(font_size, 24);
+ ck_assert_str_eq(font, "Serif:Style=Bold");
+ ck_assert(edje_object_text_class_get(elm_layout_edje_get(entry2), "entry_text", &font, &font_size));
+ ck_assert_int_eq(font_size, 24);
+ ck_assert_str_eq(font, "Serif:Style=Bold");
+ ck_assert(edje_object_text_class_get(elm_layout_edje_get(entry3), "entry_text", &font, &font_size));
+ ck_assert_int_eq(font_size, 24);
+ ck_assert_str_eq(font, "Serif:Style=Bold");
+
+ evas_object_textblock_size_formatted_get(elm_entry_textblock_get(entry1), &w1, &h1);
+ evas_object_textblock_size_formatted_get(elm_entry_textblock_get(entry2), &w2, &h2);
+ evas_object_textblock_size_formatted_get(elm_entry_textblock_get(entry3), &w3, &h3);
+
+ ck_assert_int_eq(w1, w2);
+ ck_assert_int_eq(h1, h2);
+ ck_assert_int_eq(w2, w3);
+ ck_assert_int_eq(h2, h3);
+
+ ck_assert(edje_object_text_class_set(elm_layout_edje_get(entry1), "entry_text", "Sans", 50));
+ ck_assert(edje_object_text_class_set(elm_layout_edje_get(entry2), "entry_text", "Serif", 20));
+
+ ck_assert(edje_object_text_class_get(elm_layout_edje_get(entry1), "entry_text", &font, &font_size));
+ ck_assert_int_eq(font_size, 50);
+ ck_assert_str_eq(font, "Sans");
+ ck_assert(edje_object_text_class_get(elm_layout_edje_get(entry2), "entry_text", &font, &font_size));
+ ck_assert_int_eq(font_size, 20);
+ ck_assert_str_eq(font, "Serif");
+ ck_assert(edje_object_text_class_get(elm_layout_edje_get(entry3), "entry_text", &font, &font_size));
+ ck_assert_int_eq(font_size, 24);
+ ck_assert_str_eq(font, "Serif:Style=Bold");
+
+ evas_object_textblock_size_formatted_get(elm_entry_textblock_get(entry1), &w1, &h1);
+ evas_object_textblock_size_formatted_get(elm_entry_textblock_get(entry2), &w2, &h2);
+ evas_object_textblock_size_formatted_get(elm_entry_textblock_get(entry3), &w3, &h3);
+
+ ck_assert_int_ne(w1, w2);
+ ck_assert_int_ne(h1, h2);
+ ck_assert_int_ne(w2, w3);
+ ck_assert_int_ne(h2, h3);
+
+ entry4 = elm_entry_add(win);
+
+ elm_object_text_set(entry4, "hello");
+ ck_assert(edje_object_text_class_get(elm_layout_edje_get(entry4), "entry_text", &font, &font_size));
+ ck_assert_int_eq(font_size, 24);
+ ck_assert_str_eq(font, "Serif:Style=Bold");
+}
+EFL_END_TEST
+
void elm_test_entry(TCase *tc)
{
tcase_add_test(tc, elm_entry_legacy_type_check);
@@ -535,4 +607,5 @@ void elm_test_entry(TCase *tc)
tcase_add_test(tc, elm_entry_text_set);
tcase_add_test(tc, elm_entry_magnifier);
tcase_add_test(tc, elm_entry_file_get_set);
+ tcase_add_test(tc, elm_entry_test_text_class);
}
diff --git a/src/tests/elementary/spec/efl_test_range_display.c b/src/tests/elementary/spec/efl_test_range_display.c
index f072e02c10..5704741556 100644
--- a/src/tests/elementary/spec/efl_test_range_display.c
+++ b/src/tests/elementary/spec/efl_test_range_display.c
@@ -124,6 +124,10 @@ EFL_START_TEST (range_display_value_events)
changed = EINA_FALSE;
min_reached = EINA_FALSE;
max_reached = EINA_FALSE;
+ efl_event_callback_del(widget, EFL_UI_RANGE_EVENT_CHANGED, _set_flag, &changed);
+ efl_event_callback_del(widget, EFL_UI_RANGE_EVENT_MIN_REACHED, _set_flag, &min_reached);
+ efl_event_callback_del(widget, EFL_UI_RANGE_EVENT_MAX_REACHED, _set_flag, &max_reached);
+
}
EFL_END_TEST
diff --git a/src/tests/evas/evas_test_textblock.c b/src/tests/evas/evas_test_textblock.c
index ef830e8507..261c12145c 100644
--- a/src/tests/evas/evas_test_textblock.c
+++ b/src/tests/evas/evas_test_textblock.c
@@ -4530,7 +4530,12 @@ EFL_START_TEST(efl_canvas_textblock_cursor)
efl_text_set(txt, "");
efl_text_set(txt, "");
efl_text_cursor_text_insert(cursor1, "aa");
- ck_assert_int_eq(changed_emit, 3);
+ ck_assert_int_eq(changed_emit, 4);
+
+ efl_text_markup_set(txt, "Hello<br/>Word");
+ efl_text_markup_set(txt, "Hello<br/>Word");
+ efl_text_cursor_markup_insert(cursor1, "aa");
+ ck_assert_int_eq(changed_emit, 6);
efl_text_set(txt, "");
ck_assert(!efl_text_cursor_move(cur_obj, EFL_TEXT_CURSOR_MOVE_TYPE_CHAR_NEXT));
@@ -4549,7 +4554,7 @@ EFL_START_TEST(efl_canvas_textblock_cursor)
ck_assert(!efl_text_cursor_move(cur_obj, EFL_TEXT_CURSOR_MOVE_TYPE_LAST));
ck_assert_int_eq(efl_text_cursor_position_get(cur_obj), 0);
- ck_assert_int_eq(changed_emit, 4);
+ ck_assert_int_eq(changed_emit, 7);
efl_text_markup_set(txt, "Hello World<ps/>This is EFL<br/>Enlightenment");
ck_assert(efl_text_cursor_move(cur_obj, EFL_TEXT_CURSOR_MOVE_TYPE_CHAR_NEXT));