From 622f0b188f165e5b561eb3acae9721a62e731333 Mon Sep 17 00:00:00 2001 From: Ali Alzyod Date: Thu, 9 Jan 2020 13:44:50 +0900 Subject: [PATCH 01/22] efl.ui.textbox: rename selection_handler to selection_handles Summary: efl.ui.textbox: rename selection_handler to selection_handles Reviewers: segfaultxavi Subscribers: cedric, #reviewers, #committers Tags: #efl Maniphest Tasks: T8522 Differential Revision: https://phab.enlightenment.org/D11042 --- src/lib/elementary/efl_ui_textbox.c | 16 ++++++++-------- src/lib/elementary/efl_ui_textbox.eo | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/lib/elementary/efl_ui_textbox.c b/src/lib/elementary/efl_ui_textbox.c index dd25e39419..507d7866a8 100644 --- a/src/lib/elementary/efl_ui_textbox.c +++ b/src/lib/elementary/efl_ui_textbox.c @@ -89,7 +89,7 @@ struct _Efl_Ui_Textbox_Data Eina_Future *primary; Eina_Future *clipboard; } sel_future; - Eina_Bool sel_handler_enabled : 1; + Eina_Bool sel_handles_enabled : 1; Eina_Bool start_handler_down : 1; Eina_Bool start_handler_shown : 1; Eina_Bool end_handler_down : 1; @@ -428,7 +428,7 @@ _update_selection_handler(Eo *obj) return; } - if (sd->sel_handler_enabled) + if (sd->sel_handles_enabled) { Eina_Rect rect; Eina_Position2D off; @@ -1886,7 +1886,7 @@ _efl_ui_textbox_efl_object_constructor(Eo *obj, Efl_Ui_Textbox_Data *sd) efl_text_interactive_selection_allowed_set(obj, EINA_TRUE); sd->drop_format = EFL_UI_SELECTION_FORMAT_MARKUP | EFL_UI_SELECTION_FORMAT_IMAGE; sd->last.scroll = EINA_SIZE2D(0, 0); - sd->sel_handler_enabled = EINA_FALSE; + sd->sel_handles_enabled = EINA_FALSE; return obj; } @@ -2089,16 +2089,16 @@ _efl_ui_textbox_selection_get(const Eo *obj, Efl_Ui_Textbox_Data *sd EINA_UNUSED } EOLIAN static void -_efl_ui_textbox_selection_handler_enabled_set(Eo *obj EINA_UNUSED, Efl_Ui_Textbox_Data *sd, Eina_Bool enabled) +_efl_ui_textbox_selection_handles_enabled_set(Eo *obj EINA_UNUSED, Efl_Ui_Textbox_Data *sd, Eina_Bool enabled) { - if (sd->sel_handler_enabled == enabled) return; - sd->sel_handler_enabled = enabled; + if (sd->sel_handles_enabled == enabled) return; + sd->sel_handles_enabled = enabled; } EOLIAN static Eina_Bool -_efl_ui_textbox_selection_handler_enabled_get(const Eo *obj EINA_UNUSED, Efl_Ui_Textbox_Data *sd) +_efl_ui_textbox_selection_handles_enabled_get(const Eo *obj EINA_UNUSED, Efl_Ui_Textbox_Data *sd) { - return sd->sel_handler_enabled; + return sd->sel_handles_enabled; } static void diff --git a/src/lib/elementary/efl_ui_textbox.eo b/src/lib/elementary/efl_ui_textbox.eo index b723c59e44..3f8097a90a 100644 --- a/src/lib/elementary/efl_ui_textbox.eo +++ b/src/lib/elementary/efl_ui_textbox.eo @@ -45,7 +45,7 @@ class @beta Efl.Ui.Textbox extends Efl.Ui.Layout_Base implements Efl.Input.Click format: Efl.Ui.Selection_Format; [[Format for copy & paste.]] } } - @property selection_handler_enabled { + @property selection_handles_enabled { [[This enables or disables the entry's selection handlers.]] set { } From b03f06ca8d9ff95a11b2d9be7b522c2d591adf66 Mon Sep 17 00:00:00 2001 From: Ali Alzyod Date: Thu, 9 Jan 2020 13:57:04 +0900 Subject: [PATCH 02/22] efl_ui_textbox: replace elm_obj stuff and focuse stuff Summary: efl_ui_textbox: replace elm_obj stuff and focuse stuff Reviewers: woohyun, bu5hm4n Reviewed By: woohyun, bu5hm4n Subscribers: cedric, #reviewers, #committers Tags: #efl Maniphest Tasks: T8522 Differential Revision: https://phab.enlightenment.org/D11025 --- src/lib/elementary/efl_ui_textbox.c | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/src/lib/elementary/efl_ui_textbox.c b/src/lib/elementary/efl_ui_textbox.c index 507d7866a8..0f545e319f 100644 --- a/src/lib/elementary/efl_ui_textbox.c +++ b/src/lib/elementary/efl_ui_textbox.c @@ -259,7 +259,7 @@ _load_do(Evas_Object *obj) if (!sd->file) { - elm_object_text_set(obj, ""); + efl_text_set(obj, ""); return 0; } @@ -556,15 +556,13 @@ static void _dnd_enter_cb(void *data EINA_UNUSED, Evas_Object *obj) { - elm_object_focus_set(obj, EINA_TRUE); + efl_ui_focus_util_focus(obj); } static void _dnd_leave_cb(void *data EINA_UNUSED, Evas_Object *obj) { - if (_elm_config->desktop_entry) - elm_object_focus_set(obj, EINA_FALSE); } static void @@ -820,7 +818,7 @@ _efl_ui_textbox_efl_ui_focus_object_on_focus_update(Eo *obj, Efl_Ui_Textbox_Data if (efl_ui_focus_object_focus_get(obj)) { - evas_object_focus_set(sd->text_obj, EINA_TRUE); + efl_canvas_object_key_focus_set(sd->text_obj, EINA_TRUE); _edje_signal_emit(sd, "efl,action,focus", "efl"); @@ -834,7 +832,7 @@ _efl_ui_textbox_efl_ui_focus_object_on_focus_update(Eo *obj, Efl_Ui_Textbox_Data Eo *sw = sd->text_obj; _edje_signal_emit(sd, "efl,action,unfocus", "efl"); - evas_object_focus_set(sw, EINA_FALSE); + efl_canvas_object_key_focus_set(sw, EINA_FALSE); if (top && top_is_win && efl_input_text_input_panel_autoshow_get(obj)) elm_win_keyboard_mode_set(top, ELM_WIN_KEYBOARD_OFF); @@ -2173,6 +2171,17 @@ _efl_ui_textbox_select_region_set(Eo *obj, Efl_Ui_Textbox_Data *sd EINA_UNUSED, efl_text_cursor_position_set(sel_end, end); } +static void +_efl_ui_textbox_select_region_get(Eo *obj, int *start, int *end) +{ + Efl_Text_Cursor *sel_start, *sel_end; + + efl_text_interactive_selection_cursors_get(obj, &sel_start, &sel_end); + + if(start) *start = efl_text_cursor_position_get(sel_start); + if(end) *end = efl_text_cursor_position_get(sel_end); +} + EOLIAN static void _efl_ui_textbox_selection_cut(Eo *obj, Efl_Ui_Textbox_Data *sd) { @@ -2264,7 +2273,7 @@ EOLIAN static void _efl_ui_textbox_efl_file_unload(Eo *obj, Efl_Ui_Textbox_Data *sd EINA_UNUSED) { efl_file_unload(efl_super(obj, MY_CLASS)); - elm_object_text_set(obj, ""); + efl_text_set(obj, ""); } EOLIAN static Eina_Error @@ -2553,7 +2562,7 @@ _efl_ui_textbox_efl_access_text_access_selection_get(const Eo *obj, Efl_Ui_Textb { if (selection_number != 0) return; - elm_obj_entry_select_region_get(obj, start_offset, end_offset); + _efl_ui_textbox_select_region_get((Eo *)obj, start_offset, end_offset); } EOLIAN static Eina_Bool From f6f67d60f3c2171a7e96cff2a205d4895c13117c Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Thu, 9 Jan 2020 15:00:22 +0900 Subject: [PATCH 03/22] evas ector: ++safety. add return value by ector_begin() for vector safety. --- src/lib/evas/canvas/efl_canvas_vg_object.c | 8 +++++++- src/lib/evas/include/evas_private.h | 2 +- src/modules/evas/engines/gl_generic/evas_engine.c | 6 ++++-- src/modules/evas/engines/software_generic/evas_engine.c | 7 +++++-- 4 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/lib/evas/canvas/efl_canvas_vg_object.c b/src/lib/evas/canvas/efl_canvas_vg_object.c index c94cf28b48..60008de27a 100644 --- a/src/lib/evas/canvas/efl_canvas_vg_object.c +++ b/src/lib/evas/canvas/efl_canvas_vg_object.c @@ -519,7 +519,11 @@ _render_to_buffer(Evas_Object_Protected_Data *obj, Efl_Canvas_Vg_Object_Data *pd _evas_vg_render_pre(obj, root, engine, buffer, context, ector, NULL, 255, NULL, 0); //Actual content drawing - ENFN->ector_begin(engine, buffer, context, ector, 0, 0, do_async); + if (!ENFN->ector_begin(engine, buffer, context, ector, 0, 0, do_async)) + { + ERR("Failed ector begin!"); + return NULL; + } //draw on buffer _evas_vg_render(obj, pd, @@ -546,6 +550,8 @@ _render_buffer_to_screen(Evas_Object_Protected_Data *obj, int x, int y, int w, int h, Eina_Bool do_async, Eina_Bool cacheable) { + if (!buffer) return; + Eina_Bool async_unref; //Draw the buffer as image to canvas diff --git a/src/lib/evas/include/evas_private.h b/src/lib/evas/include/evas_private.h index aacbe016f8..e57910f930 100644 --- a/src/lib/evas/include/evas_private.h +++ b/src/lib/evas/include/evas_private.h @@ -1514,7 +1514,7 @@ struct _Evas_Func void (*ector_destroy) (void *engine, Ector_Surface *surface); Ector_Buffer *(*ector_buffer_wrap) (void *engine, Evas *e, void *engine_image); Ector_Buffer *(*ector_buffer_new) (void *engine, Evas *e, int width, int height, Efl_Gfx_Colorspace cspace, Ector_Buffer_Flag flags); - void (*ector_begin) (void *engine, void *output, void *context, Ector_Surface *ector, int x, int y, Eina_Bool do_async); + Eina_Bool (*ector_begin) (void *engine, void *output, void *context, Ector_Surface *ector, int x, int y, Eina_Bool do_async); void (*ector_renderer_draw) (void *engine, void *output, void *context, Ector_Renderer *r, Eina_Array *clips, Eina_Bool do_async); void (*ector_end) (void *engine, void *output, void *context, Ector_Surface *ector, Eina_Bool do_async); diff --git a/src/modules/evas/engines/gl_generic/evas_engine.c b/src/modules/evas/engines/gl_generic/evas_engine.c index 045323b680..ec14e2bacc 100644 --- a/src/modules/evas/engines/gl_generic/evas_engine.c +++ b/src/modules/evas/engines/gl_generic/evas_engine.c @@ -2712,7 +2712,7 @@ eng_ector_surface_cache_drop(void *engine, void *key) generic_cache_data_drop(e->software.surface_cache, key); } -static void +static Eina_Bool eng_ector_begin(void *engine, void *surface, void *context EINA_UNUSED, Ector_Surface *ector, int x, int y, Eina_Bool do_async EINA_UNUSED) @@ -2720,6 +2720,7 @@ eng_ector_begin(void *engine, void *surface, if (use_gl) { //FIXME: No implementation yet + return EINA_FALSE; } else { @@ -2729,6 +2730,7 @@ eng_ector_begin(void *engine, void *surface, int load_err; glim = eng_image_data_get(engine, glim, EINA_TRUE, &pixels, &load_err,NULL); + if (!glim || !pixels) return EINA_FALSE; eng_image_stride_get(engine, glim, &stride); eng_image_size_get(engine, glim, &w, &h); @@ -2737,8 +2739,8 @@ eng_ector_begin(void *engine, void *surface, // it just uses the software backend to draw for now ector_buffer_pixels_set(ector, pixels, w, h, stride, EFL_GFX_COLORSPACE_ARGB8888, EINA_TRUE); ector_surface_reference_point_set(ector, x, y); - } + return EINA_TRUE; } static void diff --git a/src/modules/evas/engines/software_generic/evas_engine.c b/src/modules/evas/engines/software_generic/evas_engine.c index 33c56b1238..b548322539 100644 --- a/src/modules/evas/engines/software_generic/evas_engine.c +++ b/src/modules/evas/engines/software_generic/evas_engine.c @@ -4463,7 +4463,7 @@ _draw_thread_ector_surface_set(void *data) eina_mempool_free(_mp_command_ector_surface, ector_surface); } -static void +static Eina_Bool eng_ector_begin(void *engine EINA_UNUSED, void *surface, void *context EINA_UNUSED, Ector_Surface *ector, int x, int y, Eina_Bool do_async) @@ -4473,7 +4473,7 @@ eng_ector_begin(void *engine EINA_UNUSED, void *surface, Evas_Thread_Command_Ector_Surface *nes; nes = eina_mempool_malloc(_mp_command_ector_surface, sizeof (Evas_Thread_Command_Ector_Surface)); - if (!nes) return; + if (!nes) return EINA_FALSE; nes->ector = ector; nes->pixels = surface; @@ -4490,6 +4490,8 @@ eng_ector_begin(void *engine EINA_UNUSED, void *surface, unsigned int h = 0; pixels = evas_cache_image_pixels(&sf->cache_entry); + if (!pixels) return EINA_FALSE; + w = sf->cache_entry.w; h = sf->cache_entry.h; // clear the surface before giving to ector @@ -4498,6 +4500,7 @@ eng_ector_begin(void *engine EINA_UNUSED, void *surface, ector_buffer_pixels_set(ector, pixels, w, h, 0, EFL_GFX_COLORSPACE_ARGB8888, EINA_TRUE); ector_surface_reference_point_set(ector, x, y); } + return EINA_TRUE; } static void From dcc7813caf4a8e686b2f25064c312366d94c8bbb Mon Sep 17 00:00:00 2001 From: Ali Alzyod Date: Thu, 9 Jan 2020 10:59:12 +0100 Subject: [PATCH 04/22] TEXT_FORMAT_HORIZONTAL_ALIGNMENT_AUTO_TYPE: rename end enum into opposite Summary: TEXT_FORMAT_HORIZONTAL_ALIGNMENT_AUTO_TYPE: rename end enum into opposite Reviewers: segfaultxavi, woohyun Reviewed By: segfaultxavi, woohyun Subscribers: cedric, #reviewers, #committers Tags: #efl Maniphest Tasks: T7939 Differential Revision: https://phab.enlightenment.org/D11058 --- src/lib/efl/interfaces/efl_text_format.eo | 2 +- src/lib/evas/canvas/evas_object_textblock.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/lib/efl/interfaces/efl_text_format.eo b/src/lib/efl/interfaces/efl_text_format.eo index 03a44295a5..96b724c84b 100644 --- a/src/lib/efl/interfaces/efl_text_format.eo +++ b/src/lib/efl/interfaces/efl_text_format.eo @@ -13,7 +13,7 @@ enum @beta Efl.Text_Format_Horizontal_Alignment_Auto_Type { none, [[No auto-alignment rule: Horizontal Alignment is decided by @Efl.Text_Format.text_horizontal_align]] auto, [[Respects LTR/RTL (bidirectional) characters found inside the text content.]] locale, [[Respects the system's language settings.]] - end [[Text is placed at opposite side of LTR/RTL (bidirectional) settings.]] + opposite [[Text is placed at opposite side of LTR/RTL (bidirectional) settings.]] } interface @beta Efl.Text_Format { diff --git a/src/lib/evas/canvas/evas_object_textblock.c b/src/lib/evas/canvas/evas_object_textblock.c index 93c7a4b5d5..edef5e88f1 100644 --- a/src/lib/evas/canvas/evas_object_textblock.c +++ b/src/lib/evas/canvas/evas_object_textblock.c @@ -16781,7 +16781,7 @@ _efl_canvas_textblock_efl_text_format_text_horizontal_align_auto_type_set(Eo *ob { _FMT_SET(halign_auto, EVAS_TEXTBLOCK_ALIGN_AUTO_LOCALE); } - else if (type == EFL_TEXT_FORMAT_HORIZONTAL_ALIGNMENT_AUTO_TYPE_END) + else if (type == EFL_TEXT_FORMAT_HORIZONTAL_ALIGNMENT_AUTO_TYPE_OPPOSITE) { _FMT_SET(halign_auto, EVAS_TEXTBLOCK_ALIGN_AUTO_END); } @@ -16799,7 +16799,7 @@ _efl_canvas_textblock_efl_text_format_text_horizontal_align_auto_type_get(const } else if (_FMT(halign_auto) == EVAS_TEXTBLOCK_ALIGN_AUTO_END) { - ret = EFL_TEXT_FORMAT_HORIZONTAL_ALIGNMENT_AUTO_TYPE_END; + ret = EFL_TEXT_FORMAT_HORIZONTAL_ALIGNMENT_AUTO_TYPE_OPPOSITE; } else if (_FMT(halign_auto) == EVAS_TEXTBLOCK_ALIGN_AUTO_LOCALE) { From 7b0a44dd3316d32e8150d9c800e00d923fc3a684 Mon Sep 17 00:00:00 2001 From: Ali Alzyod Date: Thu, 9 Jan 2020 12:14:22 +0100 Subject: [PATCH 05/22] efl.canvas.textblock: rename style strings to have underscore between words Summary: rename following styling strings: tabstops -> tab_stops linesize -> line_size linerelsize -> line_rel_size linegap -> line_gap linerelgap -> line_rel_gap linefill -> line_fill This will affect Style_Apply, all_style_get, and any method expect styling string Reviewers: segfaultxavi, woohyun Reviewed By: segfaultxavi Subscribers: cedric, #reviewers, #committers Tags: #efl Maniphest Tasks: T8523 Differential Revision: https://phab.enlightenment.org/D11043 --- src/lib/evas/canvas/efl_canvas_textblock.eo | 22 +++++----- src/lib/evas/canvas/evas_object_textblock.c | 46 ++++++++++++++------- src/tests/evas/evas_test_textblock.c | 2 +- 3 files changed, 44 insertions(+), 26 deletions(-) diff --git a/src/lib/evas/canvas/efl_canvas_textblock.eo b/src/lib/evas/canvas/efl_canvas_textblock.eo index 72cd8a693e..c9ed381e95 100644 --- a/src/lib/evas/canvas/efl_canvas_textblock.eo +++ b/src/lib/evas/canvas/efl_canvas_textblock.eo @@ -257,37 +257,37 @@ class @beta Efl.Canvas.Textblock extends Efl.Canvas.Object implements Efl.Text, Examples: $[style=outline], $[style=shadow,bottom_right], $[style=outline_shadow,bottom]. See @Efl.Text_Style.text_effect_type and @Efl.Text_Style.text_shadow_direction. - - $tabstops: Size (in pixels) of the tab character. The value must be a number greater than one. + - $tab_stops: Size (in pixels) of the tab character. The value must be a number greater than one. Default value is $[32]. See @Efl.Text_Format.tab_stops. - - $linesize: Distance (in pixels) from the baseline of one line of text to the next. This is, a value of + - $line_size: Distance (in pixels) from the baseline of one line of text to the next. This is, a value of $[0] would render all lines on top of each other (However, this value will be ignored if it results in overlapping lines of text). - Setting this value sets $linerelsize to $[0%] (disables it). + Setting this value sets $line_rel_size to $[0%] (disables it). Default value is $[0]. - - $linerelsize: Distance (in percentage over the natural line height) from the baseline of one line of + - $line_rel_size: Distance (in percentage over the natural line height) from the baseline of one line of text to the next. A value of $[100%] does not have any impact, smaller values render lines closer together and bigger values render them further apart. - Setting this value sets $linesize to $[0] (disables it). + Setting this value sets $line_size to $[0] (disables it). Default value is $[0%]. - - $linegap: Additional empty space (in pixels) between the bottom of one line of text and the top of the - next. Setting this value sets $linerelgap to $[0%] (disables it). + - $line_gap: Additional empty space (in pixels) between the bottom of one line of text and the top of the + next. Setting this value sets $line_rel_gap to $[0%] (disables it). Default value is $[0]. See @Efl.Text_Format.line_gap. - - $linerelgap: Additional empty space (in percentage over the natural line height) between the bottom of + - $line_rel_gap: Additional empty space (in percentage over the natural line height) between the bottom of one line of text and the top of the next. - Setting this value sets $linegap to $[0] (disables it). + Setting this value sets $line_gap to $[0] (disables it). Default value is $[0%]. See @Efl.Text_Format.line_rel_gap. - - $linefill: An alternate way to specify the $linesize as a percentage of the canvas height. + - $line_fill: An alternate way to specify the $line_size as a percentage of the canvas height. A value of $[100%] means that a single line fills the canvas, whereas $[25%] means that 4 lines fit in the same height. - When both $linefill and $linesize are specified the one resulting in the smallest line size is used. + When both $line_fill and $line_size are specified the one resulting in the smallest line size is used. Default value is $[0]. - $ellipsis: Controls automatic addition of ellipsis "..." to replace text which cannot be shown. diff --git a/src/lib/evas/canvas/evas_object_textblock.c b/src/lib/evas/canvas/evas_object_textblock.c index edef5e88f1..1996134966 100644 --- a/src/lib/evas/canvas/evas_object_textblock.c +++ b/src/lib/evas/canvas/evas_object_textblock.c @@ -1418,12 +1418,18 @@ static const char *strikethroughstr = NULL; static const char *backingstr = NULL; static const char *stylestr = NULL; static const char *tabstopsstr = NULL; +static const char *tab_stopsstr = NULL; static const char *linesizestr = NULL; +static const char *line_sizestr = NULL; static const char *linerelsizestr = NULL; +static const char *line_rel_sizestr = NULL; static const char *linegapstr = NULL; +static const char *line_gapstr = NULL; static const char *linerelgapstr = NULL; +static const char *line_rel_gapstr = NULL; static const char *itemstr = NULL; static const char *linefillstr = NULL; +static const char *line_fillstr = NULL; static const char *ellipsisstr = NULL; static const char *passwordstr = NULL; static const char *replacement_charstr = NULL; @@ -1607,12 +1613,18 @@ _format_command_init(void) backingstr = eina_stringshare_add("backing"); stylestr = eina_stringshare_add("style"); tabstopsstr = eina_stringshare_add("tabstops"); + tab_stopsstr = eina_stringshare_add("tab_stops"); linesizestr = eina_stringshare_add("linesize"); + line_sizestr = eina_stringshare_add("line_size"); linerelsizestr = eina_stringshare_add("linerelsize"); + line_rel_sizestr = eina_stringshare_add("line_rel_size"); linegapstr = eina_stringshare_add("linegap"); + line_gapstr = eina_stringshare_add("line_gap"); linerelgapstr = eina_stringshare_add("linerelgap"); + line_rel_gapstr = eina_stringshare_add("line_rel_gap"); itemstr = eina_stringshare_add("item"); linefillstr = eina_stringshare_add("linefill"); + line_fillstr = eina_stringshare_add("line_fill"); ellipsisstr = eina_stringshare_add("ellipsis"); passwordstr = eina_stringshare_add("password"); replacement_charstr = eina_stringshare_add("replacement_char"); @@ -1664,12 +1676,18 @@ _format_command_shutdown(void) eina_stringshare_del(backingstr); eina_stringshare_del(stylestr); eina_stringshare_del(tabstopsstr); + eina_stringshare_del(tab_stopsstr); eina_stringshare_del(linesizestr); + eina_stringshare_del(line_sizestr); eina_stringshare_del(linerelsizestr); + eina_stringshare_del(line_rel_sizestr); eina_stringshare_del(linegapstr); + eina_stringshare_del(line_gapstr); eina_stringshare_del(linerelgapstr); + eina_stringshare_del(line_rel_gapstr); eina_stringshare_del(itemstr); eina_stringshare_del(linefillstr); + eina_stringshare_del(line_fillstr); eina_stringshare_del(ellipsisstr); eina_stringshare_del(passwordstr); eina_stringshare_del(replacement_charstr); @@ -2524,7 +2542,7 @@ _format_command(Evas_Object *eo_obj, Evas_Object_Textblock_Format *fmt, const ch if (*part2) _format_shadow_direction_set(fmt, part2, EINA_FALSE, NULL); } - else if (cmd == tabstopsstr) + else if (cmd == tabstopsstr || cmd == tab_stopsstr) { /** * @page evas_textblock_style_page Evas Textblock Style Options @@ -2540,7 +2558,7 @@ _format_command(Evas_Object *eo_obj, Evas_Object_Textblock_Format *fmt, const ch fmt->tabstops = atoi(param); if (fmt->tabstops < 1) fmt->tabstops = 1; } - else if (cmd == linesizestr) + else if (cmd == linesizestr || cmd == line_sizestr) { /** * @page evas_textblock_style_page Evas Textblock Style Options @@ -2556,7 +2574,7 @@ _format_command(Evas_Object *eo_obj, Evas_Object_Textblock_Format *fmt, const ch fmt->linesize = atoi(param); fmt->linerelsize = 0.0; } - else if (cmd == linerelsizestr) + else if (cmd == linerelsizestr || cmd == line_rel_sizestr) { /** * @page evas_textblock_style_page Evas Textblock Style Options @@ -2584,7 +2602,7 @@ _format_command(Evas_Object *eo_obj, Evas_Object_Textblock_Format *fmt, const ch } } } - else if (cmd == linegapstr) + else if (cmd == linegapstr || cmd == line_gapstr) { /** * @page evas_textblock_style_page Evas Textblock Style Options @@ -2601,7 +2619,7 @@ _format_command(Evas_Object *eo_obj, Evas_Object_Textblock_Format *fmt, const ch fmt->linegap = atoi(param); fmt->linerelgap = 0.0; } - else if (cmd == linerelgapstr) + else if (cmd == linerelgapstr || cmd == line_rel_gapstr) { /** * @page evas_textblock_style_page Evas Textblock Style Options @@ -2644,7 +2662,7 @@ _format_command(Evas_Object *eo_obj, Evas_Object_Textblock_Format *fmt, const ch // itemstr == replacement object items in textblock - inline imges // for example } - else if (cmd == linefillstr) + else if (cmd == linefillstr || cmd == line_fillstr) { /** * @page evas_textblock_style_page Evas Textblock Style Options @@ -3329,7 +3347,7 @@ _format_string_get(const Eo *eo_obj, Evas_Object_Textblock_Format *fmt) PRINTF_APPEND_COLOR(underline_colorstr, fmt->color.underline.r, fmt->color.underline.g, fmt->color.underline.b, fmt->color.underline.a); - PRINTF_APPEND_COLOR(underline2_colorstr, fmt->color.underline2.r, fmt->color.underline2.g, + PRINTF_APPEND_COLOR(secondary_underline_colorstr, fmt->color.underline2.r, fmt->color.underline2.g, fmt->color.underline2.b, fmt->color.underline2.a); PRINTF_APPEND_COLOR(underline_dash_colorstr, fmt->color.underline_dash.r, fmt->color.underline_dash.g, @@ -3344,7 +3362,7 @@ _format_string_get(const Eo *eo_obj, Evas_Object_Textblock_Format *fmt) PRINTF_APPEND_COLOR(glow_colorstr, fmt->color.glow.r, fmt->color.glow.g, fmt->color.glow.b, fmt->color.glow.a); - PRINTF_APPEND_COLOR(glow2_colorstr, fmt->color.glow2.r, fmt->color.glow2.g, + PRINTF_APPEND_COLOR(secondary_glow_colorstr, fmt->color.glow2.r, fmt->color.glow2.g, fmt->color.glow2.b, fmt->color.glow2.a); PRINTF_APPEND_COLOR(backing_colorstr, fmt->color.backing.r, fmt->color.backing.g, @@ -3496,12 +3514,12 @@ _format_string_get(const Eo *eo_obj, Evas_Object_Textblock_Format *fmt) else PRINTF_APPEND_STR(stylestr, style_value_str_1); - PRINTF_APPEND_INT(tabstopsstr, fmt->tabstops); - PRINTF_APPEND_INT(linesizestr, fmt->linesize); - PRINTF_APPEND_PERCENT_FLOAT(linerelsizestr, (fmt->linerelsize*100)); - PRINTF_APPEND_INT(linegapstr, fmt->linegap); - PRINTF_APPEND_PERCENT_FLOAT(linerelgapstr, (fmt->linerelgap*100)); - PRINTF_APPEND_PERCENT_FLOAT(linefillstr, (fmt->linefill*100)); + PRINTF_APPEND_INT(tab_stopsstr, fmt->tabstops); + PRINTF_APPEND_INT(line_sizestr, fmt->linesize); + PRINTF_APPEND_PERCENT_FLOAT(line_rel_sizestr, (fmt->linerelsize*100)); + PRINTF_APPEND_INT(line_gapstr, fmt->linegap); + PRINTF_APPEND_PERCENT_FLOAT(line_rel_gapstr, (fmt->linerelgap*100)); + PRINTF_APPEND_PERCENT_FLOAT(line_fillstr, (fmt->linefill*100)); PRINTF_APPEND_FLOAT(ellipsisstr, fmt->ellipsis); PRINTF_APPEND_STR(passwordstr, (fmt->password == 0 ? "off" : "on")); diff --git a/src/tests/evas/evas_test_textblock.c b/src/tests/evas/evas_test_textblock.c index 261c12145c..c23eb65caa 100644 --- a/src/tests/evas/evas_test_textblock.c +++ b/src/tests/evas/evas_test_textblock.c @@ -4896,7 +4896,7 @@ EFL_START_TEST(efl_canvas_textblock_style) // from functions fail_if(!strstr(style, "font_weight=extrabold")); - fail_if(!strstr(style, "tabstops=20")); + fail_if(!strstr(style, "tab_stops=20")); fail_if(!strstr(style, "color=rgba(144,225,53,255)")); fail_if(!strstr(style, "password=off")); efl_text_password_set(txt, EINA_TRUE); From 1a02745a88eb863cad307f0ba9fd386594ce4e82 Mon Sep 17 00:00:00 2001 From: Ali Alzyod Date: Thu, 9 Jan 2020 22:33:07 +0900 Subject: [PATCH 06/22] efl.text.cursor: change to abstract class Summary: 1- Change cursor to abstract class 2- Remove copy method from cursor 3- remove cursor_Add method from efl.canvas.textblock and efl.ui.textbox Reviewers: woohyun, segfaultxavi, bu5hm4n Reviewed By: bu5hm4n Subscribers: lauromoura, YOhoho, cedric, #reviewers, #committers Tags: #efl Maniphest Tasks: T8299, T8454 Differential Revision: https://phab.enlightenment.org/D11034 --- .../efl_ui_internal_text_interactive.c | 40 +++++++++++-------- src/lib/elementary/efl_ui_textbox.c | 8 +--- src/lib/elementary/efl_ui_textbox.eo | 7 ---- src/lib/evas/canvas/efl_canvas_textblock.eo | 9 ----- .../canvas/efl_canvas_textblock_internal.h | 8 ++++ src/lib/evas/canvas/efl_text_cursor.c | 20 ++++++++-- src/lib/evas/canvas/efl_text_cursor.eo | 9 +---- src/lib/evas/canvas/evas_object_textblock.c | 8 +--- src/tests/evas/evas_test_textblock.c | 21 +++++----- 9 files changed, 59 insertions(+), 71 deletions(-) diff --git a/src/lib/elementary/efl_ui_internal_text_interactive.c b/src/lib/elementary/efl_ui_internal_text_interactive.c index 3212632532..54b29f2712 100644 --- a/src/lib/elementary/efl_ui_internal_text_interactive.c +++ b/src/lib/elementary/efl_ui_internal_text_interactive.c @@ -76,6 +76,12 @@ _text_filter_markup_prepend(Efl_Canvas_Textblock *obj, Efl_Ui_Internal_Text_Inte const char *fmtpre, const char *fmtpost, Eina_Bool clearsel, Eina_Bool changeinfo); +static void +_cur_pos_copy(Efl_Text_Cursor *src, Efl_Text_Cursor *dest) +{ + efl_text_cursor_position_set(dest, efl_text_cursor_position_get(src)); +} + #ifdef HAVE_ECORE_IMF static void _preedit_clear(Efl_Ui_Internal_Text_Interactive_Data *en) @@ -523,12 +529,12 @@ _entry_imf_event_preedit_changed_cb(void *data, Ecore_IMF_Context *ctx EINA_UNUS /* set preedit start cursor */ if (!en->preedit_start) en->preedit_start = efl_canvas_textblock_cursor_create(obj); - efl_text_cursor_copy(cur, en->preedit_start); + _cur_pos_copy(cur, en->preedit_start); /* set preedit end cursor */ if (!en->preedit_end) en->preedit_end = efl_canvas_textblock_cursor_create(obj); - efl_text_cursor_copy(cur, en->preedit_end); + _cur_pos_copy(cur, en->preedit_end); preedit_end_pos = efl_text_cursor_position_get(cur); @@ -752,8 +758,8 @@ _sel_init(Efl_Text_Cursor *c, Evas_Object *o EINA_UNUSED, Efl_Ui_Internal_Text_I if (en->have_selection) return; - efl_text_cursor_copy(c, en->sel_start); - efl_text_cursor_copy(c, en->sel_end); + _cur_pos_copy(c, en->sel_start); + _cur_pos_copy(c, en->sel_end); en->have_selection = EINA_FALSE; if (en->selection) @@ -804,7 +810,7 @@ _sel_extend(Efl_Text_Cursor *c, Evas_Object *o, Efl_Ui_Internal_Text_Interactive _sel_enable(c, o, en); if (efl_text_cursor_equal(c, en->sel_end)) return; - efl_text_cursor_copy(c, en->sel_end); + _cur_pos_copy(c, en->sel_end); _entry_imf_cursor_info_set(en); @@ -830,7 +836,7 @@ _sel_clear(Evas_Object *o EINA_UNUSED, Efl_Ui_Internal_Text_Interactive_Data *en { en->have_selection = EINA_FALSE; Eina_Bool b_value = en->have_selection; - efl_text_cursor_copy(en->sel_start, en->sel_end); + _cur_pos_copy(en->sel_start, en->sel_end); efl_event_callback_call(o, EFL_TEXT_INTERACTIVE_EVENT_HAVE_SELECTION_CHANGED, &b_value); } } @@ -1024,9 +1030,9 @@ _key_down_sel_pre(Efl_Ui_Internal_Text_Interactive *obj, Efl_Text_Cursor *cur, E { Eina_Bool sel_forward = efl_text_cursor_compare(en->sel_start, en->sel_end); if ((sel_forward && movement_forward) || (!sel_forward && !movement_forward)) - efl_text_cursor_copy(en->sel_end, cur); + _cur_pos_copy(en->sel_end, cur); else - efl_text_cursor_copy(en->sel_start, cur); + _cur_pos_copy(en->sel_start, cur); _sel_clear(obj, en); } } @@ -1207,7 +1213,7 @@ _key_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void // del to start of previous word Efl_Text_Cursor *tc = efl_canvas_textblock_cursor_create(obj); - efl_text_cursor_copy(tc, cur); + _cur_pos_copy(tc, cur); efl_text_cursor_move(cur, EFL_TEXT_CURSOR_MOVE_TYPE_CHAR_PREV); efl_text_cursor_move(cur, EFL_TEXT_CURSOR_MOVE_TYPE_WORD_START); @@ -1242,7 +1248,7 @@ _key_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void // del to end of next word Efl_Text_Cursor *tc = efl_canvas_textblock_cursor_create(obj); - efl_text_cursor_copy(tc, cur); + _cur_pos_copy(tc, cur); efl_text_cursor_move(cur, EFL_TEXT_CURSOR_MOVE_TYPE_WORD_END); efl_text_cursor_move(cur, EFL_TEXT_CURSOR_MOVE_TYPE_CHAR_NEXT); @@ -1484,7 +1490,7 @@ _cursor_char_coord_set(Efl_Canvas_Textblock *obj, Efl_Text_Cursor *cur, Evas_Coo Efl_Text_Cursor *tc; tc = efl_canvas_textblock_cursor_create(obj); - efl_text_cursor_copy(cur, tc); + _cur_pos_copy(cur, tc); evas_object_geometry_get(obj, &x, &y, NULL, NULL); cx = canvasx - x; cy = canvasy - y; @@ -1549,7 +1555,7 @@ _mouse_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj EIN if (shift) { tc = efl_canvas_textblock_cursor_create(obj); - efl_text_cursor_copy(cur, tc); + _cur_pos_copy(cur, tc); if (efl_text_cursor_compare(cur, en->sel_start) < 0) efl_text_cursor_move(cur, EFL_TEXT_CURSOR_MOVE_TYPE_LINE_START); else @@ -1562,7 +1568,7 @@ _mouse_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj EIN en->selecting = EINA_FALSE; _sel_clear(obj, en); tc = efl_canvas_textblock_cursor_create(obj); - efl_text_cursor_copy(cur, tc); + _cur_pos_copy(cur, tc); efl_text_cursor_move(cur, EFL_TEXT_CURSOR_MOVE_TYPE_LINE_START); _sel_init(cur, obj, en); efl_text_cursor_move(cur, EFL_TEXT_CURSOR_MOVE_TYPE_LINE_END); @@ -1575,7 +1581,7 @@ _mouse_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj EIN if (shift) { tc = efl_canvas_textblock_cursor_create(obj); - efl_text_cursor_copy(cur, tc); + _cur_pos_copy(cur, tc); if (efl_text_cursor_compare(cur, en->sel_start) < 0) efl_text_cursor_move(cur, EFL_TEXT_CURSOR_MOVE_TYPE_WORD_START); else @@ -1591,7 +1597,7 @@ _mouse_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj EIN en->selecting = EINA_FALSE; _sel_clear(obj, en); tc = efl_canvas_textblock_cursor_create(obj); - efl_text_cursor_copy(cur, tc); + _cur_pos_copy(cur, tc); efl_text_cursor_move(cur, EFL_TEXT_CURSOR_MOVE_TYPE_WORD_START); _sel_init(cur, obj, en); efl_text_cursor_move(cur, EFL_TEXT_CURSOR_MOVE_TYPE_WORD_END); @@ -1650,7 +1656,7 @@ _mouse_up_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void if (en->select_allow) { - efl_text_cursor_copy(en->sel_end, cur); + _cur_pos_copy(en->sel_end, cur); } if (en->selecting) { @@ -1690,7 +1696,7 @@ _mouse_move_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, vo if (en->selecting) { tc = efl_canvas_textblock_cursor_create(obj); - efl_text_cursor_copy(cur, tc); + _cur_pos_copy(cur, tc); evas_object_geometry_get(obj, &x, &y, &w, &h); cx = ev->cur.canvas.x - x; cy = ev->cur.canvas.y - y; diff --git a/src/lib/elementary/efl_ui_textbox.c b/src/lib/elementary/efl_ui_textbox.c index 0f545e319f..ea26e3ce0b 100644 --- a/src/lib/elementary/efl_ui_textbox.c +++ b/src/lib/elementary/efl_ui_textbox.c @@ -2108,16 +2108,10 @@ _efl_ui_textbox_entry_insert(Eo *obj, Efl_Ui_Textbox_Data *sd, const char *entry efl_canvas_group_change(obj); } -EOLIAN static void -_efl_ui_textbox_cursor_add(Eo *obj, Efl_Ui_Textbox_Data *pd, Efl_Text_Cursor *cursor) -{ - efl_text_cursor_text_object_set(cursor, pd->text_obj, obj); -} - EOLIAN static Efl_Text_Cursor * _efl_ui_textbox_cursor_create(Eo *obj, Efl_Ui_Textbox_Data *pd) { - Eo* cursor = efl_add(EFL_TEXT_CURSOR_CLASS, pd->text_obj); + Eo* cursor = efl_text_cursor_create(pd->text_obj);; efl_text_cursor_text_object_set(cursor, pd->text_obj, obj); return cursor; } diff --git a/src/lib/elementary/efl_ui_textbox.eo b/src/lib/elementary/efl_ui_textbox.eo index 3f8097a90a..aa3a5dd5be 100644 --- a/src/lib/elementary/efl_ui_textbox.eo +++ b/src/lib/elementary/efl_ui_textbox.eo @@ -64,13 +64,6 @@ class @beta Efl.Ui.Textbox extends Efl.Ui.Layout_Base implements Efl.Input.Click item_factory: Efl.Canvas.Textblock_Factory; [[Factory to create items]] } } - cursor_add { - [[Add cursor that will manipulate and iterate content of the text object. - It is typically more convenient to obtain a cursor directly from the text object using @.cursor_create.]] - params { - cursor: Efl.Text.Cursor; [[Text cursor.]] - } - } cursor_create { [[Creates and returns a new cursor for the text.]] return: Efl.Text.Cursor @move; [[Text cursor.]] diff --git a/src/lib/evas/canvas/efl_canvas_textblock.eo b/src/lib/evas/canvas/efl_canvas_textblock.eo index c9ed381e95..edc170ba81 100644 --- a/src/lib/evas/canvas/efl_canvas_textblock.eo +++ b/src/lib/evas/canvas/efl_canvas_textblock.eo @@ -23,15 +23,6 @@ class @beta Efl.Canvas.Textblock extends Efl.Canvas.Object implements Efl.Text, is_empty: bool; [[$true if empty.]] } } - cursor_add { - [[Adds an existing cursor to the text object. - If the cursor already belonged to another text object it will be reassigned to the new one. - It is typically more convenient to obtain a cursor directly from the text object using @.cursor_create. - ]] - params { - cursor: Efl.Text.Cursor; [[The text cursor to use.]] - } - } cursor_create { [[Creates a new cursor and adds it to the text object. This cursor can be used to manipulate and iterate the content of the text object. diff --git a/src/lib/evas/canvas/efl_canvas_textblock_internal.h b/src/lib/evas/canvas/efl_canvas_textblock_internal.h index a4f03fcef8..eb137455ea 100644 --- a/src/lib/evas/canvas/efl_canvas_textblock_internal.h +++ b/src/lib/evas/canvas/efl_canvas_textblock_internal.h @@ -293,6 +293,14 @@ _evas_textblock_relayout_if_needed(Evas_Object *o); EAPI void efl_text_cursor_text_object_set(Eo *cursor, Eo *canvas_text_obj, Eo *text_obj); +/** + * Internally create instance of cursor object. + * + * @param parent the parent of the cursor object. + */ +EAPI Eo* efl_text_cursor_create(Eo *parent); + + /** * Internally sets cursor handle(legacy textblock cursor) into cursor object. * diff --git a/src/lib/evas/canvas/efl_text_cursor.c b/src/lib/evas/canvas/efl_text_cursor.c index eb699728b8..c0a6c627d9 100644 --- a/src/lib/evas/canvas/efl_text_cursor.c +++ b/src/lib/evas/canvas/efl_text_cursor.c @@ -1,6 +1,7 @@ #include "evas_common_private.h" #include "evas_private.h" #include "efl_canvas_textblock_internal.h" +#include "eo_internal.h" #define MY_CLASS EFL_TEXT_CURSOR_CLASS #define MY_CLASS_NAME "Efl.Text.Cursor" @@ -20,6 +21,8 @@ struct _Evas_Textblock_Selection_Iterator typedef struct _Evas_Textblock_Selection_Iterator Evas_Textblock_Selection_Iterator; +EFL_CLASS_SIMPLE_CLASS(efl_text_cursor, "efl_text_cursor", EFL_TEXT_CURSOR_CLASS) + EOLIAN static void _efl_text_cursor_position_set(Eo *obj EINA_UNUSED, Efl_Text_Cursor_Data *pd, int position) { @@ -102,11 +105,15 @@ _efl_text_cursor_compare(const Eo *obj EINA_UNUSED, Efl_Text_Cursor_Data *pd, co return evas_textblock_cursor_compare(pd->handle, efl_text_cursor_handle_get(dst)); } -EOLIAN static void -_efl_text_cursor_copy(const Eo *obj EINA_UNUSED, Efl_Text_Cursor_Data *pd, Efl_Text_Cursor *dst) +static void +_efl_text_cursor_copy(const Efl_Text_Cursor *obj, Efl_Text_Cursor *dst) { + Efl_Text_Cursor_Data *pd = efl_data_scope_safe_get(obj, MY_CLASS); + EINA_SAFETY_ON_NULL_RETURN(pd); + Efl_Text_Cursor_Data *pd_dest = efl_data_scope_safe_get(dst, MY_CLASS); EINA_SAFETY_ON_NULL_RETURN(pd_dest); + if (!pd->handle) return; Efl_Text_Cursor_Handle *handle = evas_object_textblock_cursor_new(pd->handle->obj); @@ -119,9 +126,9 @@ _efl_text_cursor_copy(const Eo *obj EINA_UNUSED, Efl_Text_Cursor_Data *pd, Efl_T EOLIAN static Efl_Text_Cursor * _efl_text_cursor_efl_duplicate_duplicate(const Eo *obj, Efl_Text_Cursor_Data *pd EINA_UNUSED) { - Efl_Text_Cursor *dup = efl_new(MY_CLASS); + Efl_Text_Cursor *dup = efl_text_cursor_create(efl_parent_get(obj)); - efl_text_cursor_copy(obj, dup); + _efl_text_cursor_copy(obj, dup); return dup; } @@ -436,6 +443,11 @@ efl_text_cursor_handle_get(const Eo *obj) return pd->handle; } +Eo* efl_text_cursor_create(Eo *parent) +{ + return efl_add(efl_text_cursor_realized_class_get(), parent); +} + void efl_text_cursor_text_object_set(Eo *cursor, Eo *canvas_text_obj, Eo *text_obj) { Efl_Text_Cursor_Data *pd = efl_data_scope_safe_get(cursor, MY_CLASS); diff --git a/src/lib/evas/canvas/efl_text_cursor.eo b/src/lib/evas/canvas/efl_text_cursor.eo index 70cfdfad21..00dcbd6e63 100644 --- a/src/lib/evas/canvas/efl_text_cursor.eo +++ b/src/lib/evas/canvas/efl_text_cursor.eo @@ -26,7 +26,7 @@ enum @beta Efl.Text.Cursor_Move_Type paragraph_prev [[Advances to the end of the previous paragraph.]] } -class @beta Efl.Text.Cursor extends Efl.Object implements Efl.Duplicate{ +abstract @beta Efl.Text.Cursor extends Efl.Object implements Efl.Duplicate{ [[Cursor API.]] c_prefix: efl_text_cursor; methods { @@ -112,13 +112,6 @@ class @beta Efl.Text.Cursor extends Efl.Object implements Efl.Duplicate{ return: int; [[Difference between cursors.]] } - copy @const { - [[Copy existing cursor to destination cursor, like position and cursor text object.]] - params { - dst: Efl.Text.Cursor; [[Destination Cursor.]] - } - } - move { [[Move the cursor.]] params { diff --git a/src/lib/evas/canvas/evas_object_textblock.c b/src/lib/evas/canvas/evas_object_textblock.c index 1996134966..f4d6cfb88f 100644 --- a/src/lib/evas/canvas/evas_object_textblock.c +++ b/src/lib/evas/canvas/evas_object_textblock.c @@ -8077,16 +8077,10 @@ _efl_canvas_textblock_all_styles_get(const Eo *eo_obj EINA_UNUSED, Efl_Canvas_Te return o->default_format.default_style_str; } -EOLIAN static void -_efl_canvas_textblock_cursor_add(Eo *obj, Efl_Canvas_Textblock_Data *pd EINA_UNUSED, Efl_Text_Cursor *cursor) -{ - efl_text_cursor_text_object_set(cursor, obj, obj); -} - EOLIAN static Efl_Text_Cursor * _efl_canvas_textblock_cursor_create(Eo *obj, Efl_Canvas_Textblock_Data *pd EINA_UNUSED) { - Eo* cursor = efl_add(EFL_TEXT_CURSOR_CLASS, obj); + Eo* cursor = efl_text_cursor_create(obj); efl_text_cursor_text_object_set(cursor, obj, obj); return cursor; } diff --git a/src/tests/evas/evas_test_textblock.c b/src/tests/evas/evas_test_textblock.c index c23eb65caa..b51f149174 100644 --- a/src/tests/evas/evas_test_textblock.c +++ b/src/tests/evas/evas_test_textblock.c @@ -4515,14 +4515,12 @@ EFL_START_TEST(efl_canvas_textblock_cursor) efl_text_cursor_line_number_set(cur_obj, 0); ck_assert_int_eq(efl_text_cursor_position_get(cur_obj), 0); - Eo * cursor1 = efl_add(EFL_TEXT_CURSOR_CLASS, txt); - pos = efl_text_cursor_position_get(cursor1); - ck_assert_int_eq(pos, -1); - efl_text_cursor_position_set(cursor1, 10); - pos = efl_text_cursor_position_get(cursor1); - ck_assert_int_eq(pos, -1); + Eo * cursor_temp = efl_duplicate(cur_obj); + ck_assert_ptr_ne(cursor_temp, NULL); + efl_del(cursor_temp); + cursor_temp = NULL; - efl_canvas_textblock_cursor_add(txt, cursor1); + Eo * cursor1 = efl_canvas_textblock_cursor_create(txt); efl_text_cursor_position_set(cursor1, 1); pos = efl_text_cursor_position_get(cursor1); ck_assert_int_eq(pos, 1); @@ -4633,13 +4631,12 @@ EFL_START_TEST(efl_canvas_textblock_cursor) ck_assert_int_eq(efl_text_cursor_position_get(cur_obj), 0); #endif - Eo *nCur = efl_add(EFL_TEXT_CURSOR_CLASS, txt), *nCur2 = efl_add(EFL_TEXT_CURSOR_CLASS, txt), *nCur3 = efl_add(EFL_TEXT_CURSOR_CLASS, txt); + Eo *nCur = efl_canvas_textblock_cursor_create(txt); + Eo *nCur2 = efl_canvas_textblock_cursor_create(txt); + Eo *nCur3 = efl_canvas_textblock_cursor_create(txt); efl_text_markup_set(txt, "Hello WorldThis is EFL
Enlightenment"); efl_text_cursor_position_set(cur_obj, 0); - efl_text_cursor_copy(cur_obj, nCur); ck_assert_ptr_ne(nCur, NULL); - efl_text_cursor_copy(cur_obj, nCur2); - efl_text_cursor_copy(cur_obj, nCur3); ck_assert_ptr_ne(nCur2, NULL); ck_assert_ptr_ne(nCur3, NULL); @@ -4655,7 +4652,7 @@ EFL_START_TEST(efl_canvas_textblock_cursor) ck_assert(efl_text_cursor_move(nCur, EFL_TEXT_CURSOR_MOVE_TYPE_PARAGRAPH_NEXT)); ck_assert_int_lt(efl_text_cursor_compare(cur_obj, nCur), 0); ck_assert_int_gt(efl_text_cursor_compare(nCur, cur_obj), 0); - efl_text_cursor_copy(nCur, nCur2); + efl_text_cursor_position_set(nCur2, efl_text_cursor_position_get(nCur)); ck_assert_int_lt(efl_text_cursor_compare(cur_obj, nCur2), 0); ck_assert_int_gt(efl_text_cursor_compare(nCur2, cur_obj), 0); ck_assert(!efl_text_cursor_equal(nCur2, nCur3)); From 9488991ee5712bd1215e2f98ca005529152de772 Mon Sep 17 00:00:00 2001 From: Christopher Michael Date: Thu, 9 Jan 2020 09:17:28 -0500 Subject: [PATCH 07/22] elementary: Add missing EINA_UNUSED for unused parameter NB: This file is a mess wrt formatting --- src/lib/elementary/efl_ui_textbox.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/elementary/efl_ui_textbox.c b/src/lib/elementary/efl_ui_textbox.c index ea26e3ce0b..728c060adb 100644 --- a/src/lib/elementary/efl_ui_textbox.c +++ b/src/lib/elementary/efl_ui_textbox.c @@ -561,7 +561,7 @@ _dnd_enter_cb(void *data EINA_UNUSED, static void _dnd_leave_cb(void *data EINA_UNUSED, - Evas_Object *obj) + Evas_Object *obj EINA_UNUSED) { } From f7c859d9f8473c468093315c2b7f1478d23f45cf Mon Sep 17 00:00:00 2001 From: Xavi Artigas Date: Thu, 9 Jan 2020 15:38:23 +0100 Subject: [PATCH 08/22] docs: Fine-tuning the gesture descriptions --- src/lib/evas/gesture/efl_gesture_events.eo | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/lib/evas/gesture/efl_gesture_events.eo b/src/lib/evas/gesture/efl_gesture_events.eo index 5c907b9f3c..df0a473d0b 100644 --- a/src/lib/evas/gesture/efl_gesture_events.eo +++ b/src/lib/evas/gesture/efl_gesture_events.eo @@ -29,13 +29,13 @@ interface @beta Efl.Gesture.Events ]] gesture,momentum: Efl.Canvas.Gesture_Momentum; [[Emitted when a Momentum gesture has been detected. - A Momentum gesture consists of a quick displacement of the finger while touching the screen (or while - holding down a mouse button). + A Momentum gesture is any motion of the finger while touching the screen (or while + holding down a mouse button). This gesture is also known as swipe. ]] gesture,flick: Efl.Canvas.Gesture_Flick; [[Emitted when a Flick gesture has been detected. - A Flick gesture consists of a quick displacement of the finger while touching the screen (or while - holding down a mouse button) followed by a release before slowing down. + A Flick gesture consists of a quick motion of the finger while touching the screen (or while + holding down a mouse button) with the release occurring before slowing down. ]] gesture,zoom: Efl.Canvas.Gesture_Zoom; [[Emitted when a Zoom gesture has been detected. From e5c64b13c159125d86a671e7fde36d7517d0f27b Mon Sep 17 00:00:00 2001 From: Christopher Michael Date: Thu, 9 Jan 2020 09:48:58 -0500 Subject: [PATCH 09/22] tests/ecore_wl2: Fix ecore_wl2_display_input_find test So apparently Enlightenment uses 'seat0' for input name and Weston uses 'default'. Test for E_START env var and adjust function call so that the test does not fail in either case. --- src/tests/ecore_wl2/ecore_wl2_test_display.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/tests/ecore_wl2/ecore_wl2_test_display.c b/src/tests/ecore_wl2/ecore_wl2_test_display.c index 2f77d2705f..dd0799c3fd 100644 --- a/src/tests/ecore_wl2/ecore_wl2_test_display.c +++ b/src/tests/ecore_wl2/ecore_wl2_test_display.c @@ -185,7 +185,12 @@ EFL_START_TEST(wl2_display_input_find_by_name) disp = _display_connect(); ck_assert(disp != NULL); - input = ecore_wl2_display_input_find_by_name(disp, "default"); + /* NB: Enlightenment uses "seat0" here, but Weston uses "default" */ + if (getenv("E_START")) + input = ecore_wl2_display_input_find_by_name(disp, "seat0"); + else + input = ecore_wl2_display_input_find_by_name(disp, "default"); + ck_assert(input != NULL); } EFL_END_TEST From b3114e2484d831bfedfd4f21ece766742a5e1acf Mon Sep 17 00:00:00 2001 From: Christopher Michael Date: Thu, 9 Jan 2020 10:12:51 -0500 Subject: [PATCH 10/22] ecore-wl2: Move ecore_wl2_dnd functions to be internal These functions are not used inside Enlightenment and are only used internally in EFL, so no need to be public ref T8013 --- src/lib/ecore_wl2/Ecore_Wl2.h | 94 -------------------------- src/lib/ecore_wl2/ecore_wl2_internal.h | 93 +++++++++++++++++++++++++ 2 files changed, 93 insertions(+), 94 deletions(-) diff --git a/src/lib/ecore_wl2/Ecore_Wl2.h b/src/lib/ecore_wl2/Ecore_Wl2.h index 484708287c..63b62c5752 100644 --- a/src/lib/ecore_wl2/Ecore_Wl2.h +++ b/src/lib/ecore_wl2/Ecore_Wl2.h @@ -452,7 +452,6 @@ typedef struct _Ecore_Wl2_Surface_Interface * @li @ref Ecore_Wl2_Display_Group * @li @ref Ecore_Wl2_Window_Group * @li @ref Ecore_Wl2_Output_Group - * @li @ref Ecore_Wl2_Dnd_Group * @li @ref Ecore_Wl2_Input_Group * @li @ref Ecore_Wl2_Subsurface_Group */ @@ -1565,99 +1564,6 @@ EAPI void ecore_wl2_input_pointer_set(Ecore_Wl2_Input *input, struct wl_surface */ EAPI void ecore_wl2_input_cursor_from_name_set(Ecore_Wl2_Input *input, const char *cursor); -/** - * @defgroup Ecore_Wl2_Dnd_Group Wayland Library Drag-n-Drop Functions - * @ingroup Ecore_Wl2_Group - * - * Functions that deal with creating, destroying, or interacting with - * Wayland Drag-n-Drop - */ - -/** - * Set the types which are supported by a possible drag and drop operation. - * This call initializes a data source and offeres the given mimetypes - * - * @param input the input where to add on the data source - * @param types a null-terminated array of mimetypes - * - * @ingroup Ecore_Wl2_Dnd_Group - * @since 1.17 - */ -EAPI void ecore_wl2_dnd_drag_types_set(Ecore_Wl2_Input *input, const char **types); - -/** - * Start a drag on the given input - * - * @param input the input to use - * @param window the window which is the origin of the drag operation - * @param drag_window the window which is used as window of the visible hint. - * - * @return The serial for the start_drag request - * - * @ingroup Ecore_Wl2_Dnd_Group - * @since 1.17 - */ -EAPI uint32_t ecore_wl2_dnd_drag_start(Ecore_Wl2_Input *input, Ecore_Wl2_Window *window, Ecore_Wl2_Window *drag_window); - -/** - * Call wl_data_source.set_actions on an existing source - * - * @param input the input to use - * - * @see ecore_wl2_dnd_drag_start for a more useful function. - * - * @ingroup Ecore_Wl2_Dnd_Group - * @since 1.20 - */ -EAPI void ecore_wl2_dnd_set_actions(Ecore_Wl2_Input *input); - -/** - * End a drag started by a call to ecore_wl2_dnd_drag_start - * - * @param input the input object on which the drag was started - * - * @ingroup Ecore_Wl2_Dnd_Group - * @since 1.17 - */ -EAPI void ecore_wl2_dnd_drag_end(Ecore_Wl2_Input *input); - -/** - * Get the offer which is currently resposible for the clipboard - * - * @param input the input object to use - * - * @ingroup Ecore_Wl2_Dnd_Group - * @since 1.19 - */ -EAPI Ecore_Wl2_Offer* ecore_wl2_dnd_selection_get(Ecore_Wl2_Input *input); - -/** - * Set the types which are available from this client - * Later the event ECORE_WL2_EVENT_DATA_SOURCE_SEND is emitted, - * where the caller of this api must write the data (encoded in the given mimetype) to the fd - * - * @param input the input to provice this types on - * @param types a null-terminated array of mimetypes supported by the client - * - * @return serial of request on success, 0 on failure - * - * @ingroup Ecore_Wl2_Dnd_Group - * @since 1.17 - */ -EAPI uint32_t ecore_wl2_dnd_selection_set(Ecore_Wl2_Input *input, const char **types); - -/** - * Clear the selection currently setted on this input. - * - * @param input the input to clear - * - * @return serial of request on success, 0 on failure - * - * @ingroup Ecore_Wl2_Dnd_Group - * @since 1.17 - */ -EAPI uint32_t ecore_wl2_dnd_selection_clear(Ecore_Wl2_Input *input); - /** * @defgroup Ecore_Wl2_Subsurface_Group Functions to manipulate subsurfaces. * @ingroup Ecore_Wl2_Group diff --git a/src/lib/ecore_wl2/ecore_wl2_internal.h b/src/lib/ecore_wl2/ecore_wl2_internal.h index cda98d6459..82f7046ed1 100644 --- a/src/lib/ecore_wl2/ecore_wl2_internal.h +++ b/src/lib/ecore_wl2/ecore_wl2_internal.h @@ -125,6 +125,99 @@ EAPI void ecore_wl2_window_iconified_set(Ecore_Wl2_Window *window, Eina_Bool ico */ EAPI Eina_Bool ecore_wl2_window_pending_get(Ecore_Wl2_Window *window); +/** + * @defgroup Ecore_Wl2_Dnd_Group Wayland Library Drag-n-Drop Functions + * @ingroup Ecore_Wl2_Group + * + * Functions that deal with creating, destroying, or interacting with + * Wayland Drag-n-Drop + */ + +/** + * Set the types which are supported by a possible drag and drop operation. + * This call initializes a data source and offeres the given mimetypes + * + * @param input the input where to add on the data source + * @param types a null-terminated array of mimetypes + * + * @ingroup Ecore_Wl2_Dnd_Group + * @since 1.17 + */ +EAPI void ecore_wl2_dnd_drag_types_set(Ecore_Wl2_Input *input, const char **types); + +/** + * Start a drag on the given input + * + * @param input the input to use + * @param window the window which is the origin of the drag operation + * @param drag_window the window which is used as window of the visible hint. + * + * @return The serial for the start_drag request + * + * @ingroup Ecore_Wl2_Dnd_Group + * @since 1.17 + */ +EAPI uint32_t ecore_wl2_dnd_drag_start(Ecore_Wl2_Input *input, Ecore_Wl2_Window *window, Ecore_Wl2_Window *drag_window); + +/** + * Call wl_data_source.set_actions on an existing source + * + * @param input the input to use + * + * @see ecore_wl2_dnd_drag_start for a more useful function. + * + * @ingroup Ecore_Wl2_Dnd_Group + * @since 1.20 + */ +EAPI void ecore_wl2_dnd_set_actions(Ecore_Wl2_Input *input); + +/** + * End a drag started by a call to ecore_wl2_dnd_drag_start + * + * @param input the input object on which the drag was started + * + * @ingroup Ecore_Wl2_Dnd_Group + * @since 1.17 + */ +EAPI void ecore_wl2_dnd_drag_end(Ecore_Wl2_Input *input); + +/** + * Get the offer which is currently resposible for the clipboard + * + * @param input the input object to use + * + * @ingroup Ecore_Wl2_Dnd_Group + * @since 1.19 + */ +EAPI Ecore_Wl2_Offer* ecore_wl2_dnd_selection_get(Ecore_Wl2_Input *input); + +/** + * Set the types which are available from this client + * Later the event ECORE_WL2_EVENT_DATA_SOURCE_SEND is emitted, + * where the caller of this api must write the data (encoded in the given mimetype) to the fd + * + * @param input the input to provice this types on + * @param types a null-terminated array of mimetypes supported by the client + * + * @return serial of request on success, 0 on failure + * + * @ingroup Ecore_Wl2_Dnd_Group + * @since 1.17 + */ +EAPI uint32_t ecore_wl2_dnd_selection_set(Ecore_Wl2_Input *input, const char **types); + +/** + * Clear the selection currently setted on this input. + * + * @param input the input to clear + * + * @return serial of request on success, 0 on failure + * + * @ingroup Ecore_Wl2_Dnd_Group + * @since 1.17 + */ +EAPI uint32_t ecore_wl2_dnd_selection_clear(Ecore_Wl2_Input *input); + # undef EAPI # define EAPI From e3a28ecd1e74465f96185e38dc447d9edc6aaa98 Mon Sep 17 00:00:00 2001 From: Christopher Michael Date: Thu, 9 Jan 2020 10:14:46 -0500 Subject: [PATCH 11/22] ecore-wl2: Move ecore_wl2_offer functions to be internal These functions are not used outside of EFL, so there is no need for them to be public. ref T8013 --- src/lib/ecore_wl2/Ecore_Wl2.h | 130 ------------------------- src/lib/ecore_wl2/ecore_wl2_internal.h | 130 +++++++++++++++++++++++++ 2 files changed, 130 insertions(+), 130 deletions(-) diff --git a/src/lib/ecore_wl2/Ecore_Wl2.h b/src/lib/ecore_wl2/Ecore_Wl2.h index 63b62c5752..7806f5d167 100644 --- a/src/lib/ecore_wl2/Ecore_Wl2.h +++ b/src/lib/ecore_wl2/Ecore_Wl2.h @@ -1769,136 +1769,6 @@ EAPI int ecore_wl2_output_transform_get(Ecore_Wl2_Output *output); */ EAPI int ecore_wl2_display_compositor_version_get(Ecore_Wl2_Display *disp); -/** - * Get the actions available from the data source - * - * @param offer Offer object to use - * - * @return or´ed values from Ecore_Wl2_Drag_Action which are describing the available actions - * - * @ingroup Ecore_Wl2_Dnd_Group - * @since 1.19 - */ -EAPI Ecore_Wl2_Drag_Action ecore_wl2_offer_actions_get(Ecore_Wl2_Offer *offer); - -/** - * Set the actions which are supported by you - * - * @param offer Offer object to use - * @param actions A or´ed value of mutliple Ecore_Wl2_Drag_Action values - * @param action the preferred action out of the actions - * - * @ingroup Ecore_Wl2_Dnd_Group - * @since 1.19 - */ -EAPI void ecore_wl2_offer_actions_set(Ecore_Wl2_Offer *offer, Ecore_Wl2_Drag_Action actions, Ecore_Wl2_Drag_Action action); - -/** - * Get action which is set by either the data source or in the last call of actions_set - * - * @param offer Offer object to use - * - * @return the preferred action - * - * @ingroup Ecore_Wl2_Dnd_Group - * @since 1.19 - */ -EAPI Ecore_Wl2_Drag_Action ecore_wl2_offer_action_get(Ecore_Wl2_Offer *offer); - -/** - * Get the mime types which are given by the source - * - * @param offer the offer to query - * - * @return a eina array of strdup´ed strings, this array must NOT be changed or freed - * - * @ingroup Ecore_Wl2_Dnd_Group - * @since 1.19 - */ -EAPI Eina_Array* ecore_wl2_offer_mimes_get(Ecore_Wl2_Offer *offer); - -/** - * Set mimetypes you are accepting under this offer - * - * @param offer the offer to use - * - * @ingroup Ecore_Wl2_Dnd_Group - * @since 1.19 - */ -EAPI void ecore_wl2_offer_mimes_set(Ecore_Wl2_Offer *offer, Eina_Array *mimes); - -/** - * Accept a single mime type for an offer - * - * @param offer the offer to use - * @param mime_type the mime type - * - * @ingroup Ecore_Wl2_Dnd_Group - * @since 1.20 - */ -EAPI void ecore_wl2_offer_accept(Ecore_Wl2_Offer *offer, const char *mime_type); - -/** - * Request the data from this offer. - * The event ECORE_WL2_EVENT_OFFER_DATA_READY is called when the data is available. - * There offer will be not destroyed as long as requested data is not emitted by the event. - * - * @param offer the offer to use - * @param mime the mimetype to receive - * - * @ingroup Ecore_Wl2_Dnd_Group - * @since 1.19 - */ -EAPI void ecore_wl2_offer_receive(Ecore_Wl2_Offer *offer, char *mime); - -/** - * Request the data from this offer on an externally managed fd. - * The event ECORE_WL2_EVENT_OFFER_DATA_READY is called when the data is available. - * There offer will be not destroyed as long as requested data is not emitted by the event. - * - * @param offer the offer to use - * @param mime the mimetype to receive - * @param fd the fd to pass for receiving - * - * @ingroup Ecore_Wl2_Dnd_Group - * @since 1.20 - */ -EAPI void ecore_wl2_offer_proxy_receive(Ecore_Wl2_Offer *offer, const char *mime, int fd); - -/** - * End the use of a proxy received offer. This may invalidate the offer object - * - * @param offer the offer - * - * @ingroup Ecore_Wl2_Dnd_Group - * @since 1.20 - */ -EAPI void ecore_wl2_offer_proxy_receive_end(Ecore_Wl2_Offer *offer); - -/** - * Check if the given offer supports the given mimetype - * - * @param offer the offer to use - * @param mime the mimetype to check - * - * @return Returns true if the mimetype is supported by this offer, false if not - * - * @ingroup Ecore_Wl2_Dnd_Group - * @since 1.19 - */ -EAPI Eina_Bool ecore_wl2_offer_supports_mime(Ecore_Wl2_Offer *offer, const char *mime); - -/** - * Mark this offer as finished - * This will call the dnd_finished event on the source of the sender. - * - * @param offer the offer to use - * - * @ingroup Ecore_Wl2_Dnd_Group - * @since 1.19 - */ -EAPI void ecore_wl2_offer_finish(Ecore_Wl2_Offer *offer); - /** * Disable session recovery for any further connections. Must be called * before connecting. This is irreversible and not intended for general diff --git a/src/lib/ecore_wl2/ecore_wl2_internal.h b/src/lib/ecore_wl2/ecore_wl2_internal.h index 82f7046ed1..cbe1e13ef3 100644 --- a/src/lib/ecore_wl2/ecore_wl2_internal.h +++ b/src/lib/ecore_wl2/ecore_wl2_internal.h @@ -218,6 +218,136 @@ EAPI uint32_t ecore_wl2_dnd_selection_set(Ecore_Wl2_Input *input, const char **t */ EAPI uint32_t ecore_wl2_dnd_selection_clear(Ecore_Wl2_Input *input); +/** + * Get the actions available from the data source + * + * @param offer Offer object to use + * + * @return or´ed values from Ecore_Wl2_Drag_Action which are describing the available actions + * + * @ingroup Ecore_Wl2_Dnd_Group + * @since 1.19 + */ +EAPI Ecore_Wl2_Drag_Action ecore_wl2_offer_actions_get(Ecore_Wl2_Offer *offer); + +/** + * Set the actions which are supported by you + * + * @param offer Offer object to use + * @param actions A or´ed value of mutliple Ecore_Wl2_Drag_Action values + * @param action the preferred action out of the actions + * + * @ingroup Ecore_Wl2_Dnd_Group + * @since 1.19 + */ +EAPI void ecore_wl2_offer_actions_set(Ecore_Wl2_Offer *offer, Ecore_Wl2_Drag_Action actions, Ecore_Wl2_Drag_Action action); + +/** + * Get action which is set by either the data source or in the last call of actions_set + * + * @param offer Offer object to use + * + * @return the preferred action + * + * @ingroup Ecore_Wl2_Dnd_Group + * @since 1.19 + */ +EAPI Ecore_Wl2_Drag_Action ecore_wl2_offer_action_get(Ecore_Wl2_Offer *offer); + +/** + * Get the mime types which are given by the source + * + * @param offer the offer to query + * + * @return a eina array of strdup´ed strings, this array must NOT be changed or freed + * + * @ingroup Ecore_Wl2_Dnd_Group + * @since 1.19 + */ +EAPI Eina_Array* ecore_wl2_offer_mimes_get(Ecore_Wl2_Offer *offer); + +/** + * Set mimetypes you are accepting under this offer + * + * @param offer the offer to use + * + * @ingroup Ecore_Wl2_Dnd_Group + * @since 1.19 + */ +EAPI void ecore_wl2_offer_mimes_set(Ecore_Wl2_Offer *offer, Eina_Array *mimes); + +/** + * Accept a single mime type for an offer + * + * @param offer the offer to use + * @param mime_type the mime type + * + * @ingroup Ecore_Wl2_Dnd_Group + * @since 1.20 + */ +EAPI void ecore_wl2_offer_accept(Ecore_Wl2_Offer *offer, const char *mime_type); + +/** + * Request the data from this offer. + * The event ECORE_WL2_EVENT_OFFER_DATA_READY is called when the data is available. + * There offer will be not destroyed as long as requested data is not emitted by the event. + * + * @param offer the offer to use + * @param mime the mimetype to receive + * + * @ingroup Ecore_Wl2_Dnd_Group + * @since 1.19 + */ +EAPI void ecore_wl2_offer_receive(Ecore_Wl2_Offer *offer, char *mime); + +/** + * Request the data from this offer on an externally managed fd. + * The event ECORE_WL2_EVENT_OFFER_DATA_READY is called when the data is available. + * There offer will be not destroyed as long as requested data is not emitted by the event. + * + * @param offer the offer to use + * @param mime the mimetype to receive + * @param fd the fd to pass for receiving + * + * @ingroup Ecore_Wl2_Dnd_Group + * @since 1.20 + */ +EAPI void ecore_wl2_offer_proxy_receive(Ecore_Wl2_Offer *offer, const char *mime, int fd); + +/** + * End the use of a proxy received offer. This may invalidate the offer object + * + * @param offer the offer + * + * @ingroup Ecore_Wl2_Dnd_Group + * @since 1.20 + */ +EAPI void ecore_wl2_offer_proxy_receive_end(Ecore_Wl2_Offer *offer); + +/** + * Check if the given offer supports the given mimetype + * + * @param offer the offer to use + * @param mime the mimetype to check + * + * @return Returns true if the mimetype is supported by this offer, false if not + * + * @ingroup Ecore_Wl2_Dnd_Group + * @since 1.19 + */ +EAPI Eina_Bool ecore_wl2_offer_supports_mime(Ecore_Wl2_Offer *offer, const char *mime); + +/** + * Mark this offer as finished + * This will call the dnd_finished event on the source of the sender. + * + * @param offer the offer to use + * + * @ingroup Ecore_Wl2_Dnd_Group + * @since 1.19 + */ +EAPI void ecore_wl2_offer_finish(Ecore_Wl2_Offer *offer); + # undef EAPI # define EAPI From eafed87ffd70c0a1da1893bd05d076fb6078bf3f Mon Sep 17 00:00:00 2001 From: Christopher Michael Date: Thu, 9 Jan 2020 10:17:32 -0500 Subject: [PATCH 12/22] ecore-wl2: Move ecore_wl2_subsurface functions to be internal These functions are not used outside of EFL so there is no need for them to be public. ref T8013 --- src/lib/ecore_wl2/Ecore_Wl2.h | 158 ------------------------- src/lib/ecore_wl2/ecore_wl2_internal.h | 157 ++++++++++++++++++++++++ 2 files changed, 157 insertions(+), 158 deletions(-) diff --git a/src/lib/ecore_wl2/Ecore_Wl2.h b/src/lib/ecore_wl2/Ecore_Wl2.h index 7806f5d167..6be9c8c4a9 100644 --- a/src/lib/ecore_wl2/Ecore_Wl2.h +++ b/src/lib/ecore_wl2/Ecore_Wl2.h @@ -453,7 +453,6 @@ typedef struct _Ecore_Wl2_Surface_Interface * @li @ref Ecore_Wl2_Window_Group * @li @ref Ecore_Wl2_Output_Group * @li @ref Ecore_Wl2_Input_Group - * @li @ref Ecore_Wl2_Subsurface_Group */ /** @@ -1564,163 +1563,6 @@ EAPI void ecore_wl2_input_pointer_set(Ecore_Wl2_Input *input, struct wl_surface */ EAPI void ecore_wl2_input_cursor_from_name_set(Ecore_Wl2_Input *input, const char *cursor); -/** - * @defgroup Ecore_Wl2_Subsurface_Group Functions to manipulate subsurfaces. - * @ingroup Ecore_Wl2_Group - * - * Functions to manipulate wayland subsurfaces, using Ecore_Wl2_Subsurface. - * - * This API is intended to expose Wayland subsurface functionality, although it - * should not be necessary for most applications to use it, as soon as we have - * means to make Evas automatically switch Evas images to use subsurfaces. - * - * It can/should be used, for instance, when subsurfaces are needed to be not - * in sync with the main window surface. - */ - -/** - * Create and return a new subsurface. - * - * Create a new surface (and subsurface interface), with the parent surface - * being the one associated with the given @param win. - * - * The @param win must be visible, otherwise there will be no surface created - * for it yet. - * - * @return the allocated and initialized Ecore_Wl2_Subsurface object, or - * NULL on failure - * - * @ingroup Ecore_Wl2_Subsurface_Group - * @since 1.17 - */ -EAPI Ecore_Wl2_Subsurface *ecore_wl2_subsurface_new(Ecore_Wl2_Window *window); - -/** - * Destroy the given subsurface, as well as the surface associated with it. - * - * @param subsurface the subsurface - * - * @ingroup Ecore_Wl2_Subsurface_Group - * @since 1.17 - */ -EAPI void ecore_wl2_subsurface_del(Ecore_Wl2_Subsurface *subsurface); - -/** - * Get the wl_surface for this subsurface - * - * @param subsurface the subsurface - * - * @return the wl_surface associated with this subsurface, or NULL on failure - * - * @ingroup Ecore_Wl2_Subsurface_Group - * @since 1.17 - */ -EAPI struct wl_surface *ecore_wl2_subsurface_surface_get(Ecore_Wl2_Subsurface *subsurface); - -/** - * Set the position of this subsurface, relative to its parent surface. - * If subsurface is defined and the x, y coordinates differ from the currently - * tracked position, this also schedules a sub-surface position change. - * - * @param subsurface the subsurface - * @param x coordinate in the parent surface - * @param y coordinate in the parent surface - * - * @ingroup Ecore_Wl2_Subsurface_Group - * @since 1.17 - */ -EAPI void ecore_wl2_subsurface_position_set(Ecore_Wl2_Subsurface *subsurface, int x, int y); - -/** - * Get the position of this subsurface, relative to its parent surface. - * Coordinates will be returned in x and y if non-NULL. - * - * @param subsurface the subsurface - * @param x coordinate in the parent surface, or NULL to ignore - * @param y coordinate in the parent surface, or NULL to ignore - * - * @ingroup Ecore_Wl2_Subsurface_Group - * @since 1.17 - */ -EAPI void ecore_wl2_subsurface_position_get(Ecore_Wl2_Subsurface *subsurface, int *x, int *y); - -/** - * Place subsurface on layer above a reference surface - * - * Moves the @param subsurface to just above the reference @param - * surface, changing the z-order. The reference @param surface must - * be either a sibling or parent surface, else a protocol error will - * be generated. - * - * @param subsurface the subsurface - * @param surface the sibling reference surface - * - * @ingroup Ecore_Wl2_Subsurface_Group - * @since 1.17 - */ -EAPI void ecore_wl2_subsurface_place_above(Ecore_Wl2_Subsurface *subsurface, struct wl_surface *surface); - -/** - * Place subsurface on layer below a reference surface - * - * See ecore_wl2_subsurface_place_above. - * - * @param subsurface the subsurface - * @param surface the sibling reference surface - * - * @ingroup Ecore_Wl2_Subsurface_Group - * @since 1.17 - */ -EAPI void ecore_wl2_subsurface_place_below(Ecore_Wl2_Subsurface *subsurface, struct wl_surface *surface); - -/** - * Enables or disables sub-surface synchronization - * - * When synchronization is enabled, surface commits on the subsurface - * will be cached and only applied when the parent surface's state is - * applied. This ensures atomic updates of the parent and all of its - * synchronized sub-surfaces. - * - * When synchronization is disabled, commits will apply to the pending - * state directly without caching, just like a normal wl_surface. If - * there are already cached events when this is set, those events are - * applied simultaneously with the desync event. - * - * Attempting to enable synchronization when the subsurface already - * thinks it's sync'd, or desync when it believes its desync'd, will - * be trivially ignored and will not generate a Wayland event. - * - * See Wayland's set_desync documentation for further details and - * exceptional cases. - * - * @param subsurface the subsurface - * @param sync true to enable synchronization, false to desynchronize - * - * @ingroup Ecore_Wl2_Subsurface_Group - * @since 1.17 - */ -EAPI void ecore_wl2_subsurface_sync_set(Ecore_Wl2_Subsurface *subsurface, Eina_Bool sync); - -/** - * Set an opaque region for the given subsurface. - * - * This is an optimization hint to the compositor to allow it avoid - * redrawing content unnecessarily. Note that marking transparent - * content as opaque will cause repaint artifacts. - * - * Use a 0x0 region size to unset the opaque region. - * - * @param subsurface the subsurface - * @param x coordinate in the parent surface - * @param y coordinate in the parent surface - * @param w width to set as opaque - * @param h height to set as opaque - * - * @ingroup Ecore_Wl2_Subsurface_Group - * @since 1.17 - */ -EAPI void ecore_wl2_subsurface_opaque_region_set(Ecore_Wl2_Subsurface *subsurface, int x, int y, int w, int h); - /** * @defgroup Ecore_Wl2_Output_Group Wayland Library Output Functions * @ingroup Ecore_Wl2_Group diff --git a/src/lib/ecore_wl2/ecore_wl2_internal.h b/src/lib/ecore_wl2/ecore_wl2_internal.h index cbe1e13ef3..4edcec3cd4 100644 --- a/src/lib/ecore_wl2/ecore_wl2_internal.h +++ b/src/lib/ecore_wl2/ecore_wl2_internal.h @@ -348,6 +348,163 @@ EAPI Eina_Bool ecore_wl2_offer_supports_mime(Ecore_Wl2_Offer *offer, const char */ EAPI void ecore_wl2_offer_finish(Ecore_Wl2_Offer *offer); +/** + * @defgroup Ecore_Wl2_Subsurface_Group Functions to manipulate subsurfaces. + * @ingroup Ecore_Wl2_Group + * + * Functions to manipulate wayland subsurfaces, using Ecore_Wl2_Subsurface. + * + * This API is intended to expose Wayland subsurface functionality, although it + * should not be necessary for most applications to use it, as soon as we have + * means to make Evas automatically switch Evas images to use subsurfaces. + * + * It can/should be used, for instance, when subsurfaces are needed to be not + * in sync with the main window surface. + */ + +/** + * Create and return a new subsurface. + * + * Create a new surface (and subsurface interface), with the parent surface + * being the one associated with the given @param win. + * + * The @param win must be visible, otherwise there will be no surface created + * for it yet. + * + * @return the allocated and initialized Ecore_Wl2_Subsurface object, or + * NULL on failure + * + * @ingroup Ecore_Wl2_Subsurface_Group + * @since 1.17 + */ +EAPI Ecore_Wl2_Subsurface *ecore_wl2_subsurface_new(Ecore_Wl2_Window *window); + +/** + * Destroy the given subsurface, as well as the surface associated with it. + * + * @param subsurface the subsurface + * + * @ingroup Ecore_Wl2_Subsurface_Group + * @since 1.17 + */ +EAPI void ecore_wl2_subsurface_del(Ecore_Wl2_Subsurface *subsurface); + +/** + * Get the wl_surface for this subsurface + * + * @param subsurface the subsurface + * + * @return the wl_surface associated with this subsurface, or NULL on failure + * + * @ingroup Ecore_Wl2_Subsurface_Group + * @since 1.17 + */ +EAPI struct wl_surface *ecore_wl2_subsurface_surface_get(Ecore_Wl2_Subsurface *subsurface); + +/** + * Set the position of this subsurface, relative to its parent surface. + * If subsurface is defined and the x, y coordinates differ from the currently + * tracked position, this also schedules a sub-surface position change. + * + * @param subsurface the subsurface + * @param x coordinate in the parent surface + * @param y coordinate in the parent surface + * + * @ingroup Ecore_Wl2_Subsurface_Group + * @since 1.17 + */ +EAPI void ecore_wl2_subsurface_position_set(Ecore_Wl2_Subsurface *subsurface, int x, int y); + +/** + * Get the position of this subsurface, relative to its parent surface. + * Coordinates will be returned in x and y if non-NULL. + * + * @param subsurface the subsurface + * @param x coordinate in the parent surface, or NULL to ignore + * @param y coordinate in the parent surface, or NULL to ignore + * + * @ingroup Ecore_Wl2_Subsurface_Group + * @since 1.17 + */ +EAPI void ecore_wl2_subsurface_position_get(Ecore_Wl2_Subsurface *subsurface, int *x, int *y); + +/** + * Place subsurface on layer above a reference surface + * + * Moves the @param subsurface to just above the reference @param + * surface, changing the z-order. The reference @param surface must + * be either a sibling or parent surface, else a protocol error will + * be generated. + * + * @param subsurface the subsurface + * @param surface the sibling reference surface + * + * @ingroup Ecore_Wl2_Subsurface_Group + * @since 1.17 + */ +EAPI void ecore_wl2_subsurface_place_above(Ecore_Wl2_Subsurface *subsurface, struct wl_surface *surface); + +/** + * Place subsurface on layer below a reference surface + * + * See ecore_wl2_subsurface_place_above. + * + * @param subsurface the subsurface + * @param surface the sibling reference surface + * + * @ingroup Ecore_Wl2_Subsurface_Group + * @since 1.17 + */ +EAPI void ecore_wl2_subsurface_place_below(Ecore_Wl2_Subsurface *subsurface, struct wl_surface *surface); + +/** + * Enables or disables sub-surface synchronization + * + * When synchronization is enabled, surface commits on the subsurface + * will be cached and only applied when the parent surface's state is + * applied. This ensures atomic updates of the parent and all of its + * synchronized sub-surfaces. + * + * When synchronization is disabled, commits will apply to the pending + * state directly without caching, just like a normal wl_surface. If + * there are already cached events when this is set, those events are + * applied simultaneously with the desync event. + * + * Attempting to enable synchronization when the subsurface already + * thinks it's sync'd, or desync when it believes its desync'd, will + * be trivially ignored and will not generate a Wayland event. + * + * See Wayland's set_desync documentation for further details and + * exceptional cases. + * + * @param subsurface the subsurface + * @param sync true to enable synchronization, false to desynchronize + * + * @ingroup Ecore_Wl2_Subsurface_Group + * @since 1.17 + */ +EAPI void ecore_wl2_subsurface_sync_set(Ecore_Wl2_Subsurface *subsurface, Eina_Bool sync); + +/** + * Set an opaque region for the given subsurface. + * + * This is an optimization hint to the compositor to allow it avoid + * redrawing content unnecessarily. Note that marking transparent + * content as opaque will cause repaint artifacts. + * + * Use a 0x0 region size to unset the opaque region. + * + * @param subsurface the subsurface + * @param x coordinate in the parent surface + * @param y coordinate in the parent surface + * @param w width to set as opaque + * @param h height to set as opaque + * + * @ingroup Ecore_Wl2_Subsurface_Group + * @since 1.17 + */ +EAPI void ecore_wl2_subsurface_opaque_region_set(Ecore_Wl2_Subsurface *subsurface, int x, int y, int w, int h); + # undef EAPI # define EAPI From a866de4ff0c0bb2de9a39a8657bde2f030d7dd4a Mon Sep 17 00:00:00 2001 From: Christopher Michael Date: Thu, 9 Jan 2020 10:31:29 -0500 Subject: [PATCH 13/22] elementary: Include ecore_wl2_internal header when building Wayland support Commits b3114e2484d831bfedfd, e3a28ecd1e74465f96, and eafed87ffd70c0a1da18 moved some previously public API functions to be internal because they are not used outside of EFL. As such, we need to include the ecore_wl2_internal.h header file here because those functions are used inside Elementary. --- src/lib/elementary/elm_priv.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/lib/elementary/elm_priv.h b/src/lib/elementary/elm_priv.h index ca3ab0620f..5aa18c3e62 100644 --- a/src/lib/elementary/elm_priv.h +++ b/src/lib/elementary/elm_priv.h @@ -8,6 +8,7 @@ # endif # ifdef HAVE_ELEMENTARY_WL2 # include +# include "ecore_wl2_internal.h" # endif # ifdef HAVE_ELEMENTARY_DRM # include From d0845de6b36c3cf6f2f5dc4153fb3b3b650641da Mon Sep 17 00:00:00 2001 From: Christopher Michael Date: Thu, 9 Jan 2020 10:46:54 -0500 Subject: [PATCH 14/22] tests/ecore_wl2: Simplify test infrastructure This commit adds the _display_connect function to the tests_helpers file so that we do not have to duplicate the function across files. ref T8016 --- src/tests/ecore_wl2/ecore_wl2_test_display.c | 6 ++++++ src/tests/ecore_wl2/ecore_wl2_test_input.c | 10 +--------- src/tests/ecore_wl2/ecore_wl2_test_window.c | 10 +--------- src/tests/ecore_wl2/ecore_wl2_tests_helpers.h | 14 +------------- 4 files changed, 9 insertions(+), 31 deletions(-) diff --git a/src/tests/ecore_wl2/ecore_wl2_test_display.c b/src/tests/ecore_wl2/ecore_wl2_test_display.c index dd0799c3fd..fcc560311d 100644 --- a/src/tests/ecore_wl2/ecore_wl2_test_display.c +++ b/src/tests/ecore_wl2/ecore_wl2_test_display.c @@ -11,6 +11,12 @@ #include "ecore_wl2_suite.h" #include "ecore_wl2_tests_helpers.h" +static Ecore_Wl2_Display * +_display_setup(void) +{ + return ecore_wl2_display_create(NULL); +} + EFL_START_TEST(wl2_display_create) { Ecore_Wl2_Display *disp; diff --git a/src/tests/ecore_wl2/ecore_wl2_test_input.c b/src/tests/ecore_wl2/ecore_wl2_test_input.c index 98b9e9758e..db6cbf3ea5 100644 --- a/src/tests/ecore_wl2/ecore_wl2_test_input.c +++ b/src/tests/ecore_wl2/ecore_wl2_test_input.c @@ -9,15 +9,7 @@ #include #include "ecore_wl2_suite.h" - -static Ecore_Wl2_Display * -_display_connect(void) -{ - Ecore_Wl2_Display *disp; - - disp = ecore_wl2_display_connect(NULL); - return disp; -} +#include "ecore_wl2_tests_helpers.h" EFL_START_TEST(wl2_input_seat_get) { diff --git a/src/tests/ecore_wl2/ecore_wl2_test_window.c b/src/tests/ecore_wl2/ecore_wl2_test_window.c index 611b36768c..b3ed5a7cb6 100644 --- a/src/tests/ecore_wl2/ecore_wl2_test_window.c +++ b/src/tests/ecore_wl2/ecore_wl2_test_window.c @@ -9,19 +9,11 @@ #include #include "ecore_wl2_suite.h" +#include "ecore_wl2_tests_helpers.h" #define WIDTH 480 #define HEIGHT 360 -static Ecore_Wl2_Display * -_display_connect(void) -{ - Ecore_Wl2_Display *disp; - - disp = ecore_wl2_display_connect(NULL); - return disp; -} - static Ecore_Wl2_Window * _window_create(Ecore_Wl2_Display *disp) { diff --git a/src/tests/ecore_wl2/ecore_wl2_tests_helpers.h b/src/tests/ecore_wl2/ecore_wl2_tests_helpers.h index f897dc9123..257838f50c 100644 --- a/src/tests/ecore_wl2/ecore_wl2_tests_helpers.h +++ b/src/tests/ecore_wl2/ecore_wl2_tests_helpers.h @@ -3,22 +3,10 @@ # include -static Ecore_Wl2_Display * -_display_setup(void) -{ - Ecore_Wl2_Display *disp; - - disp = ecore_wl2_display_create(NULL); - return disp; -} - static Ecore_Wl2_Display * _display_connect(void) { - Ecore_Wl2_Display *disp; - - disp = ecore_wl2_display_connect(NULL); - return disp; + return ecore_wl2_display_connect(NULL); } #endif From 18e01e88d5a85526fe059498dc20abb575ccee27 Mon Sep 17 00:00:00 2001 From: Christopher Michael Date: Thu, 9 Jan 2020 10:53:26 -0500 Subject: [PATCH 15/22] efl_wl: Add ecore_wl2_internal include This library uses functions which are now internal to Ecore_Wl2, so we need to add the ecore_wl2_internal header here. --- src/lib/efl_wl/efl_wl.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/lib/efl_wl/efl_wl.c b/src/lib/efl_wl/efl_wl.c index 02406d1d21..d872a4a426 100644 --- a/src/lib/efl_wl/efl_wl.c +++ b/src/lib/efl_wl/efl_wl.c @@ -16,6 +16,7 @@ #include "Ecore_Evas.h" #include "Ecore_Wl2.h" +#include "ecore_wl2_internal.h" #include "Ecore_Input.h" #include "Evas_GL.h" From 64dacb3d07f6ed74a53e4e38c25e27ebd9bfb6f7 Mon Sep 17 00:00:00 2001 From: Christopher Michael Date: Thu, 9 Jan 2020 10:54:17 -0500 Subject: [PATCH 16/22] ecore-wl2: Move ecore_wl2_window_output_find function to be internal This function is unused outside of EFL, so it does not need to be public. Move function to be internal ref T8013 --- src/lib/ecore_wl2/Ecore_Wl2.h | 12 ------------ src/lib/ecore_wl2/ecore_wl2_internal.h | 12 ++++++++++++ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/lib/ecore_wl2/Ecore_Wl2.h b/src/lib/ecore_wl2/Ecore_Wl2.h index 6be9c8c4a9..7b65b5c418 100644 --- a/src/lib/ecore_wl2/Ecore_Wl2.h +++ b/src/lib/ecore_wl2/Ecore_Wl2.h @@ -1134,18 +1134,6 @@ EAPI void ecore_wl2_window_type_set(Ecore_Wl2_Window *window, Ecore_Wl2_Window_T */ EAPI Ecore_Wl2_Window_Type ecore_wl2_window_type_get(Ecore_Wl2_Window *window); -/** - * Find the output that a given window is on - * - * @param window The window to find the output for - * - * @return An Ecore_Wl2_Output if found, or NULL otherwise - * - * @ingroup Ecore_Wl2_Window_Group - * @since 1.20 - */ -EAPI Ecore_Wl2_Output *ecore_wl2_window_output_find(Ecore_Wl2_Window *window); - /** * Set if window rotation is supported by the window manager * diff --git a/src/lib/ecore_wl2/ecore_wl2_internal.h b/src/lib/ecore_wl2/ecore_wl2_internal.h index 4edcec3cd4..b464fb231f 100644 --- a/src/lib/ecore_wl2/ecore_wl2_internal.h +++ b/src/lib/ecore_wl2/ecore_wl2_internal.h @@ -125,6 +125,18 @@ EAPI void ecore_wl2_window_iconified_set(Ecore_Wl2_Window *window, Eina_Bool ico */ EAPI Eina_Bool ecore_wl2_window_pending_get(Ecore_Wl2_Window *window); +/** + * Find the output that a given window is on + * + * @param window The window to find the output for + * + * @return An Ecore_Wl2_Output if found, or NULL otherwise + * + * @ingroup Ecore_Wl2_Window_Group + * @since 1.20 + */ +EAPI Ecore_Wl2_Output *ecore_wl2_window_output_find(Ecore_Wl2_Window *window); + /** * @defgroup Ecore_Wl2_Dnd_Group Wayland Library Drag-n-Drop Functions * @ingroup Ecore_Wl2_Group From 83a291604399351a4c92da539eb6754c083b9360 Mon Sep 17 00:00:00 2001 From: Christopher Michael Date: Thu, 9 Jan 2020 10:54:58 -0500 Subject: [PATCH 17/22] tests/ecore_wl2: Remove test the ecore_wl2_window_output_find This function is internal to EFL so does not need a test case ref T8016 --- src/tests/ecore_wl2/ecore_wl2_test_window.c | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/src/tests/ecore_wl2/ecore_wl2_test_window.c b/src/tests/ecore_wl2/ecore_wl2_test_window.c index b3ed5a7cb6..ca843730af 100644 --- a/src/tests/ecore_wl2/ecore_wl2_test_window.c +++ b/src/tests/ecore_wl2/ecore_wl2_test_window.c @@ -84,23 +84,6 @@ EFL_START_TEST(wl2_window_rotation) } EFL_END_TEST -EFL_START_TEST(wl2_window_output_find) -{ - Ecore_Wl2_Display *disp; - Ecore_Wl2_Window *win; - Ecore_Wl2_Output *out; - - disp = _display_connect(); - ck_assert(disp != NULL); - - win = _window_create(disp); - ck_assert(win != NULL); - - out = ecore_wl2_window_output_find(win); - ck_assert(out != NULL); -} -EFL_END_TEST - EFL_START_TEST(wl2_window_aux_hints_supported_get) { Ecore_Wl2_Display *disp; @@ -520,7 +503,6 @@ ecore_wl2_test_window(TCase *tc) tcase_add_test(tc, wl2_window_new); tcase_add_test(tc, wl2_window_surface_test); tcase_add_test(tc, wl2_window_rotation); - tcase_add_test(tc, wl2_window_output_find); if (getenv("E_START")) tcase_add_test(tc, wl2_window_aux_hints_supported_get); tcase_add_test(tc, wl2_window_display_get); From 93c7e7dc8f2ad5efa7617e25b8f51346e67778ce Mon Sep 17 00:00:00 2001 From: Xavi Artigas Date: Thu, 9 Jan 2020 18:11:59 +0100 Subject: [PATCH 18/22] docs: Improvements to Text API documentation Ref T7855 Ref T7934 Ref T7935 Ref T7936 Ref T7937 Ref T7938 Ref T7941 Ref T7942 Ref T7943 Ref T7944 Ref T7945 --- .../interfaces/efl_text_font_properties.eo | 82 +++++++------- src/lib/efl/interfaces/efl_text_format.eo | 39 ++++--- src/lib/efl/interfaces/efl_text_style.eo | 107 ++++++++++-------- src/lib/elementary/efl_ui_textbox.eo | 21 ++-- src/lib/evas/canvas/efl_canvas_textblock.eo | 8 +- 5 files changed, 140 insertions(+), 117 deletions(-) diff --git a/src/lib/efl/interfaces/efl_text_font_properties.eo b/src/lib/efl/interfaces/efl_text_font_properties.eo index 160b182803..71d8e3d5d9 100644 --- a/src/lib/efl/interfaces/efl_text_font_properties.eo +++ b/src/lib/efl/interfaces/efl_text_font_properties.eo @@ -1,50 +1,54 @@ import efl_gfx_types; enum @beta Efl.Text_Font_Weight { - [[Type of font weight.]] - normal, [[Normal font weight.]] - thin, [[Thin font weight.]] - ultralight, [[Ultralight font weight.]] - extralight, [[Extralight font weight.]] - light, [[Light font weight.]] - book, [[Book font weight.]] - medium, [[Medium font weight.]] - semibold, [[Semibold font weight.]] - bold, [[Bold font weight.]] - ultrabold, [[Ultrabold font weight.]] - extrabold, [[Extrabold font weight.]] - black, [[Black font weight.]] - extrablack, [[Extrablack font weight.]] + [[The weight of a particular font is the thickness of the character outlines relative to their height. + The given numerical values follow the TrueType scale (from 100 to 900) and are approximate. + It is up to each font to provide all of them.]] + normal, [[Normal font weight (400).]] + thin, [[Thin font weight (100).]] + ultralight, [[Ultralight font weight (200).]] + extralight, [[Extralight font weight (200).]] + light, [[Light font weight (300).]] + book, [[Book font weight (350).]] + medium, [[Medium font weight (500).]] + semibold, [[Semibold font weight (600).]] + bold, [[Bold font weight (700).]] + ultrabold, [[Ultrabold font weight (800).]] + extrabold, [[Extrabold font weight (800).]] + black, [[Black font weight (900).]] + extrablack, [[Extrablack font weight (950).]] } enum @beta Efl.Text_Font_Width { - [[Type of font width.]] - normal, [[Normal font width.]] + [[Font width relative to its height. + It is up to each font to provide all these widths.]] + normal, [[Normal font width.]] ultracondensed, [[Ultracondensed font width.]] extracondensed, [[Extracondensed font width.]] - condensed, [[Condensed font width.]] - semicondensed, [[Semicondensed font width.]] - semiexpanded, [[Semiexpanded font width.]] - expanded, [[Expanded font width.]] - extraexpanded, [[Extraexpanded font width.]] - ultraexpanded, [[Ultraexpanded font width.]] + condensed, [[Condensed font width.]] + semicondensed, [[Semicondensed font width.]] + semiexpanded, [[Semiexpanded font width.]] + expanded, [[Expanded font width.]] + extraexpanded, [[Extraexpanded font width.]] + ultraexpanded, [[Ultraexpanded font width.]] } enum @beta Efl.Text_Font_Slant { [[Type of font slant.]] - normal, [[Normal font slant.]] - oblique, [[Oblique font slant.]] - italic, [[Italic font slant.]] + normal, [[Normal font slant: Sets the text to the normal font (non-italicized).]] + oblique, [[Oblique font slant: Sets the text to use a simulated version of an italic font, + created by algorithmically slanting the normal version.]] + italic, [[Italic font slant: Sets the text to use the italic version of the font if available. + If not available, it will simulate italics with oblique instead.]] } enum @beta Efl.Text_Font_Bitmap_Scalable { - [[Scalable of bitmap fonts. - ]] - none = 0, [[Disable scalable feature for bitmap fonts.]] - color = (1 << 0), [[Enable scalable feature for color bitmap fonts.]] + [[When are bitmap fonts allowed to be scaled.]] + none = 0, [[Disable scaling for bitmap fonts.]] + color = (1 << 0), [[Enable scaling for color bitmap fonts.]] } interface @beta Efl.Text_Font_Properties { - [[Font settings for text. + [[Properties related to font handling. ]] c_prefix: efl_text; methods { @@ -72,9 +76,9 @@ interface @beta Efl.Text_Font_Properties { } @property font_size { - [[The font size for a given text object. + [[The font size to use, in points. - This property controls the font size of a text object. + If the specified @.font_family does not provide this particular size, it will be scaled. ]] set {} get {} @@ -112,7 +116,7 @@ interface @beta Efl.Text_Font_Properties { } @property font_weight { - [[Type of weight of the displayed font + [[Type of weight (e.g. bold or normal) of the displayed font Default is @Efl.Text_Font_Weight.normal. ]] @@ -122,7 +126,7 @@ interface @beta Efl.Text_Font_Properties { } @property font_slant { - [[Type of slant of the displayed font. + [[Type of slant (e.g. italic or normal) of the displayed font. Default is @Efl.Text_Font_Slant.normal. ]] @@ -132,7 +136,7 @@ interface @beta Efl.Text_Font_Properties { } @property font_width { - [[Type of width of the displayed font. + [[Type of width (e.g. condensed, expanded or normal) of the displayed font. Default is @Efl.Text_Font_Width.normal. ]] @@ -155,14 +159,14 @@ interface @beta Efl.Text_Font_Properties { } @property font_bitmap_scalable { - [[The bitmap fonts have fixed size glyphs for several available sizes. - Basically, it is not scalable. But, it needs to be scalable for some use cases. - (e.g. colorful emoji fonts) + [[Bitmap fonts have fixed size glyphs for several available sizes. + Other sizes need to be algorithmically scaled, resulting in blurry glyphs. + This property controls whether scaling of non-provided sizes is allowed. Default is @Efl.Text_Font_Bitmap_Scalable.none. ]] values { - scalable: Efl.Text_Font_Bitmap_Scalable; [[Scalable.]] + scalable: Efl.Text_Font_Bitmap_Scalable; [[When should bitmap fonts be scaled.]] } } } diff --git a/src/lib/efl/interfaces/efl_text_format.eo b/src/lib/efl/interfaces/efl_text_format.eo index 96b724c84b..14d80a107c 100644 --- a/src/lib/efl/interfaces/efl_text_format.eo +++ b/src/lib/efl/interfaces/efl_text_format.eo @@ -1,5 +1,5 @@ enum @beta Efl.Text_Format_Wrap { - [[Wrapping policy of the text.]] + [[Wrapping policy for the text.]] none, [[No wrapping.]] char, [[Wrap at character boundaries.]] word, [[Wrap at word boundaries.]] @@ -9,7 +9,7 @@ enum @beta Efl.Text_Format_Wrap { } enum @beta Efl.Text_Format_Horizontal_Alignment_Auto_Type { - [[Auto-horizontal alignment setting for the text (Left-To-Right or Right-To-Left).]] + [[Automatic horizontal alignment setting for the text (Left-To-Right or Right-To-Left).]] none, [[No auto-alignment rule: Horizontal Alignment is decided by @Efl.Text_Format.text_horizontal_align]] auto, [[Respects LTR/RTL (bidirectional) characters found inside the text content.]] locale, [[Respects the system's language settings.]] @@ -33,36 +33,42 @@ interface @beta Efl.Text_Format { ]] values { - value: double; [[Ellipsis value.]] + value: double; [[Position of the ellipsis inside the text, from $[0.0] to $[1.0].]] } } @property wrap { - [[Wrapping policy of the text. Requires @.multiline to be $true.]] + [[Wrapping policy for the text. + + When text does not fit the widget in a single line, it can be automatically wrapped at + character or word boundaries, for example. + + Requires @.multiline to be $true. + ]] values { - wrap: Efl.Text_Format_Wrap; [[Wrap mode.]] + wrap: Efl.Text_Format_Wrap; [[Wrapping policy.]] } } @property multiline { [[Enables text to span multiple lines. - + When $false, new-line characters are ignored and no text wrapping occurs. ]] values { - enabled: bool; [[$true if multiline is enabled.]] + enabled: bool; [[$true if multiple lines should be rendered.]] } } @property text_horizontal_align_auto_type { [[Specifies when the text's horizontal alignment should be set automatically.]] values { - value: Efl.Text_Format_Horizontal_Alignment_Auto_Type; [[Alignment type.]] + value: Efl.Text_Format_Horizontal_Alignment_Auto_Type; [[Automatic horizontal alignment type.]] } } @property text_horizontal_align { - [[Horizontal alignment of text. $[0.0] means "left" + [[Manual horizontal alignment of text. $[0.0] means "left" and $[1.0] means "right". Setting this value also sets @.text_horizontal_align_auto_type to @Efl.Text_Format_Horizontal_Alignment_Auto_Type.none. @@ -75,7 +81,7 @@ interface @beta Efl.Text_Format { } @property text_vertical_align { - [[Vertical alignment of text.$[0.0] means "top" + [[Vertical alignment of text. $[0.0] means "top" and $[1.0] means "bottom"]] values { value: double; [[Alignment value between $[0.0] and $[1.0].]] @@ -105,16 +111,16 @@ interface @beta Efl.Text_Format { } @property tab_stops { - [[Size of the tab character.]] + [[Size (in pixels) of the tab character.]] values { - value: int; [[Size in pixels.]] + value: int; [[Size in pixels, greater than 1.]] } } @property password { [[Enabling this causes all characters to be replaced by @.replacement_char. - + This is useful for password input boxes. ]] values @@ -124,13 +130,12 @@ interface @beta Efl.Text_Format { } @property replacement_char { - [[The character used to replace characters that can't be displayed + [[The character used to replace characters that can't be displayed. - Currently only used to replace characters if @.password - is enabled. + Only used to replace characters if @.password is enabled. ]] values { - repch: string; [[Replacement character]] + repch: string; [[Replacement character.]] } } } diff --git a/src/lib/efl/interfaces/efl_text_style.eo b/src/lib/efl/interfaces/efl_text_style.eo index a975ebdc96..bb168fd5dd 100644 --- a/src/lib/efl/interfaces/efl_text_style.eo +++ b/src/lib/efl/interfaces/efl_text_style.eo @@ -1,70 +1,80 @@ enum @beta Efl.Text_Style_Background_Type { - [[Whether to add a background colored rectangle (background) to each line of text or not.]] - none = 0, [[Do not use background.]] - solid_color, [[Use solid color background.]] - + [[Type of background to use behind each line of text.]] + none = 0, [[Do not use background.]] + solid_color, [[Use a solid-color rectangle as background. + Requires @Efl.Text_Style.text_background_color.]] } enum @beta Efl.Text_Style_Strikethrough_Type { [[Whether to add a strike-through decoration to the displayed text or not.]] none = 0, [[Do not use strike-through.]] - single, [[Strikethrough with a single line.]] - + single, [[Strike-through with a single line. + Requires @Efl.Text_Style.text_strikethrough_color.]] } enum @beta Efl.Text_Style_Effect_Type { [[Effect to apply to the displayed text.]] - none = 0, [[No effect.]] - - // colored with shadow_color - shadow, [[Shadow effect.]] - far_shadow, [[Far shadow effect.]] - soft_shadow, [[Soft shadow effect.]] - far_soft_shadow, [[Far and soft shadow effect.]] - // colored with glow_color - glow, [[Glow effect.]] - // colored with outline_color - outline, [[Outline effect.]] - soft_outline, [[Soft outline effect.]] - // colored with outline_color + shadow_color - outline_shadow, [[Outline + shadow effect.]] - outline_soft_shadow, [[Outline + soft shadow effect.]] + none = 0, [[No effect.]] + shadow, [[Shadow effect. + Uses @Efl.Text_Style.text_shadow_color and @Efl.Text_Style.text_shadow_direction.]] + far_shadow, [[Far shadow effect. + Uses @Efl.Text_Style.text_shadow_color and @Efl.Text_Style.text_shadow_direction.]] + soft_shadow, [[Soft shadow effect. + Uses @Efl.Text_Style.text_shadow_color and @Efl.Text_Style.text_shadow_direction.]] + far_soft_shadow, [[Far and soft shadow effect. + Uses @Efl.Text_Style.text_shadow_color and @Efl.Text_Style.text_shadow_direction.]] + glow, [[Glow effect. + Uses @Efl.Text_Style.text_glow_color and @Efl.Text_Style.text_secondary_glow_color.]] + outline, [[Outline effect. + Uses @Efl.Text_Style.text_outline_color.]] + soft_outline, [[Soft outline effect. + Uses @Efl.Text_Style.text_outline_color.]] + outline_shadow, [[Outline + shadow effect. + Uses @Efl.Text_Style.text_shadow_color, @Efl.Text_Style.text_shadow_direction and + @Efl.Text_Style.text_outline_color.]] + outline_soft_shadow, [[Outline + soft shadow effect. + Uses @Efl.Text_Style.text_shadow_color, @Efl.Text_Style.text_shadow_direction and + @Efl.Text_Style.text_outline_color.]] } enum @beta Efl.Text_Style_Shadow_Direction { - [[Direction of the shadow.]] + [[Direction of the shadow effect.]] bottom_right = 0, [[Shadow towards bottom right.]] - bottom, [[Shadow towards bottom.]] - bottom_left, [[Shadow towards bottom left.]] - left, [[Shadow towards left.]] - top_left, [[Shadow towards top left.]] - top, [[Shadow towards top.]] - top_right, [[Shadow towards top right.]] - right, [[Shadow towards right.]] + bottom, [[Shadow towards bottom.]] + bottom_left, [[Shadow towards bottom left.]] + left, [[Shadow towards left.]] + top_left, [[Shadow towards top left.]] + top, [[Shadow towards top.]] + top_right, [[Shadow towards top right.]] + right, [[Shadow towards right.]] } enum @beta Efl.Text_Style_Underline_Type { - [[Type of underline of the displayed text.]] + [[Type of underline for the displayed text.]] none = 0, [[Text without underline.]] - single, [[Underlined with a single line.]] - double, [[Underlined with a double line.]] - dashed, [[Underlined with a dashed line.]] + single, [[Underlined with a single line. + Requires @Efl.Text_Style.text_underline_color.]] + double, [[Underlined with a double line. + Requires @Efl.Text_Style.text_underline_color and @Efl.Text_Style.text_secondary_underline_color.]] + dashed, [[Underlined with a dashed line. + Requires @Efl.Text_Style.text_underline_dashed_color, @Efl.Text_Style.text_underline_dashed_width and + @Efl.Text_Style.text_underline_dashed_gap.]] } interface @beta Efl.Text_Style { [[Decorations to add to the text. - Decorations can be coloring, effects, underlines, strike-through etc. + Decorations include text color, glow, outline, underline, strike-through and shadows. ]] c_prefix: efl_text; methods { @property text_color { - [[Color of text, excluding decorations like, shadow, outline or glow.]] + [[Color of text, excluding all other decorations. By default it is invisible.]] values { r: ubyte; [[Red component.]] @@ -75,7 +85,7 @@ interface @beta Efl.Text_Style { } @property text_background_type { - [[Enables rendering of a background rectangle behind each line of text.]] + [[Type of background to use behind each line of text.]] values { type: Efl.Text_Style_Background_Type; [[Background type.]] @@ -83,7 +93,7 @@ interface @beta Efl.Text_Style { } @property text_background_color { - [[Color of the background rectangle (backing) behind each line of text.]] + [[Color of the background behind each line of text. By default it is invisible.]] values { r: ubyte; [[Red component.]] @@ -94,7 +104,7 @@ interface @beta Efl.Text_Style { } @property text_underline_type { - [[Underline style for the text.]] + [[Type of underline to use for the text.]] values { type: Efl.Text_Style_Underline_Type; [[Underline type.]] @@ -103,7 +113,7 @@ interface @beta Efl.Text_Style { @property text_underline_color { - [[Color of normal underline style.]] + [[Color of the primary underline. By default it is invisible.]] values { r: ubyte; [[Red component.]] @@ -126,7 +136,7 @@ interface @beta Efl.Text_Style { @property text_underline_dashed_color { [[Color of the dashed underline. Only valid when @.text_underline_type is - @Efl.Text_Style_Underline_Type.dashed.]] + @Efl.Text_Style_Underline_Type.dashed. By default it is invisible.]] values { r: ubyte; [[Red component.]] @@ -159,7 +169,7 @@ interface @beta Efl.Text_Style { @property text_secondary_underline_color { [[Color of the secondary underline. Only valid when @.text_underline_type is - @Efl.Text_Style_Underline_Type.double.]] + @Efl.Text_Style_Underline_Type.double. By default it is invisible.]] values { r: ubyte; [[Red component.]] @@ -179,7 +189,7 @@ interface @beta Efl.Text_Style { @property text_strikethrough_color { - [[Color of the line striking through the text.]] + [[Color of the line striking through the text. By default it is invisible.]] values { r: ubyte; [[Red component.]] @@ -198,7 +208,7 @@ interface @beta Efl.Text_Style { } @property text_outline_color { - [[Color of the text outline.]] + [[Color of the text outline. By default it is invisible.]] values { r: ubyte; [[Red component.]] @@ -210,7 +220,7 @@ interface @beta Efl.Text_Style { @property text_shadow_direction { - [[Direction of shadow effect.]] + [[Direction of the shadow effect.]] values { type: Efl.Text_Style_Shadow_Direction; [[Shadow direction.]] @@ -219,7 +229,7 @@ interface @beta Efl.Text_Style { @property text_shadow_color { - [[Color of the shadow.]] + [[Color of the text shadow. By default it is invisible.]] values { r: ubyte; [[Red component.]] @@ -231,7 +241,7 @@ interface @beta Efl.Text_Style { @property text_glow_color { - [[Color of the glow decoration.]] + [[Color of the text glow. By default it is invisible.]] values { r: ubyte; [[Red component.]] @@ -245,7 +255,8 @@ interface @beta Efl.Text_Style { { [[Color of the secondary glow decoration. This is the color of the inner glow (where it touches the text) which - gradually fades into @.text_glow_color as it reaches the edge. + gradually fades into @.text_glow_color as it reaches the outer edge. + By default it is invisible. ]] values { @@ -264,7 +275,7 @@ interface @beta Efl.Text_Style { ]] values { - code: string; [[Filter code]] + code: string; [[Filter code.]] } } } diff --git a/src/lib/elementary/efl_ui_textbox.eo b/src/lib/elementary/efl_ui_textbox.eo index aa3a5dd5be..ce4ca09b24 100644 --- a/src/lib/elementary/efl_ui_textbox.eo +++ b/src/lib/elementary/efl_ui_textbox.eo @@ -6,7 +6,7 @@ class @beta Efl.Ui.Textbox extends Efl.Ui.Layout_Base implements Efl.Input.Click [[A flexible text widget which can be static (as a label) or editable by the user (as a text entry). It provides all sorts of editing facilities like automatic scrollbars, virtual keyboard, clipboard, configurable - context menus or autocapitalization, for example.]] + context menus or auto-capitalization, for example.]] methods { @property scrollable { [[Enable or disable scrolling in the widget. @@ -16,17 +16,19 @@ class @beta Efl.Ui.Textbox extends Efl.Ui.Layout_Base implements Efl.Input.Click set {} get {} values { - scroll: bool; [[$true to enable scrolling. Default is $false.]] + scroll: bool(false); [[$true to enable scrolling.]] } } @property context_menu_enabled { - [[This enables or disables the entry's contextual (longpress) menu.]] + [[This enables or disables the widget's contextual menu, typically + accessible through a long-press or a right-button click. + ]] set { } get { } values { - enabled: bool; [[If $true, the menu is enabled.]] + enabled: bool; [[$true to enable the contextual menu.]] } } @property cnp_mode { @@ -46,13 +48,14 @@ class @beta Efl.Ui.Textbox extends Efl.Ui.Layout_Base implements Efl.Input.Click } } @property selection_handles_enabled { - [[This enables or disables the entry's selection handlers.]] + [[This enables or disables the visual handles around selected text, + to allow simpler modification on touch screens.]] set { } get { } values { - enabled: bool; [[If $true, the selection handlers are enabled.]] + enabled: bool; [[$true to enable the selection handles.]] } } @@ -69,13 +72,13 @@ class @beta Efl.Ui.Textbox extends Efl.Ui.Layout_Base implements Efl.Input.Click return: Efl.Text.Cursor @move; [[Text cursor.]] } selection_copy { - [[This executes a "copy" action on the selected text in the entry.]] + [[This executes a "copy" action on the selected text in the widget.]] } selection_paste { - [[This executes a "paste" action in the entry.]] + [[This executes a "paste" action in the widget.]] } selection_cut { - [[This executes a "cut" action on the selected text in the entry.]] + [[This executes a "cut" action on the selected text in the widget.]] } } implements { diff --git a/src/lib/evas/canvas/efl_canvas_textblock.eo b/src/lib/evas/canvas/efl_canvas_textblock.eo index edc170ba81..8e9bee7dba 100644 --- a/src/lib/evas/canvas/efl_canvas_textblock.eo +++ b/src/lib/evas/canvas/efl_canvas_textblock.eo @@ -140,8 +140,8 @@ class @beta Efl.Canvas.Textblock extends Efl.Canvas.Object implements Efl.Text, Requires $underline. See @Efl.Text_Style.text_underline_color. - - $secondary_underline_color: Color code for the secondary text underline (See bottom for the complete list of - supported codes). Only valid when $[underline=double]. + - $secondary_underline_color: Color code for the secondary text underline (See bottom for the complete list + of supported codes). Only valid when $[underline=double]. Default value is $[rgba(0,0,0,0)] meaning that secondary underline will not be rendered. See @Efl.Text_Style.text_secondary_underline_color. @@ -165,8 +165,8 @@ class @beta Efl.Canvas.Textblock extends Efl.Canvas.Object implements Efl.Text, Default value is $[rgba(0,0,0,0)] meaning that no glow will be rendered. See @Efl.Text_Style.text_glow_color. - - $secondary_glow_color: Color code for the secondary (inner) glow component of the text (See bottom for the complete - list of supported codes). Only valid when the $style attribute includes a glow. + - $secondary_glow_color: Color code for the secondary (inner) glow component of the text (See bottom for + the complete list of supported codes). Only valid when the $style attribute includes a glow. Default value is $[rgba(0,0,0,0)] meaning that only the primary $glow_color will be used. See @Efl.Text_Style.text_secondary_glow_color. From 9ac976b079dae2e0355216af26f671837c9e5dc2 Mon Sep 17 00:00:00 2001 From: Cedric BAIL Date: Fri, 3 Jan 2020 15:35:17 -0800 Subject: [PATCH 19/22] elementary: properly propagate "child.selected" change. Reviewed-by: Mike Blumenkrantz Differential Revision: https://phab.enlightenment.org/D11013 --- src/lib/elementary/efl_ui_select_model.c | 38 +++++++++++++----------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/src/lib/elementary/efl_ui_select_model.c b/src/lib/elementary/efl_ui_select_model.c index 6852b50b40..fde6cca4c7 100644 --- a/src/lib/elementary/efl_ui_select_model.c +++ b/src/lib/elementary/efl_ui_select_model.c @@ -24,10 +24,15 @@ struct _Efl_Ui_Select_Model_Data Efl_Ui_Select_Model *last_model; Efl_Ui_Select_Mode selection; - - Eina_Bool none : 1; }; +static void +_efl_ui_select_model_apply_last_model(Eo *obj, Efl_Ui_Select_Model_Data *pd, Eo *last_model) +{ + efl_replace(&pd->last_model, last_model); + efl_model_properties_changed(obj, "child.selected"); +} + static void _efl_ui_select_model_child_removed(void *data, const Efl_Event *event) { @@ -35,7 +40,7 @@ _efl_ui_select_model_child_removed(void *data, const Efl_Event *event) Efl_Model_Children_Event *ev = event->info; if (ev->child == pd->last_model) - efl_replace(&pd->last_model, NULL); + _efl_ui_select_model_apply_last_model(event->object, pd, NULL); } static Eo* @@ -49,7 +54,6 @@ _efl_ui_select_model_efl_object_constructor(Eo *obj, efl_boolean_model_boolean_add(obj, "selected", EINA_FALSE); efl_event_callback_add(obj, EFL_MODEL_EVENT_CHILD_REMOVED, _efl_ui_select_model_child_removed, pd); - pd->none = EINA_TRUE; parent = efl_parent_get(obj); if (efl_isa(parent, EFL_UI_SELECT_MODEL_CLASS)) @@ -64,7 +68,6 @@ _efl_ui_select_model_efl_object_invalidate(Eo *obj, { efl_replace(&pd->fallback_model, NULL); efl_replace(&pd->last_model, NULL); - pd->none = EINA_TRUE; efl_invalidate(efl_super(obj, EFL_UI_SELECT_MODEL_CLASS)); } @@ -75,7 +78,7 @@ _efl_ui_select_model_fallback(Efl_Ui_Select_Model_Data *pd) Eina_Value selected; if (!pd->parent) return; - if (!pd->parent->none) return; + if (!pd->parent->last_model) return; if (!pd->parent->fallback_model) return; // I think it only make sense to trigger the fallback on single mode if (pd->parent->selection != EFL_UI_SELECT_MODE_SINGLE) return; @@ -129,8 +132,7 @@ _commit_change(Eo *child, void *data EINA_UNUSED, const Eina_Value v) if (selflag) { // select case - pd->none = EINA_FALSE; - efl_replace(&pd->last_model, child); + _efl_ui_select_model_apply_last_model(parent, pd, child); efl_event_callback_call(child, EFL_UI_SELECT_MODEL_EVENT_SELECTED, child); } else @@ -139,8 +141,7 @@ _commit_change(Eo *child, void *data EINA_UNUSED, const Eina_Value v) // There should only be one model which represent the same data at all in memory if (pd->last_model == child) // direct comparison of pointer is ok { - efl_replace(&pd->last_model, NULL); - pd->none = EINA_TRUE; + _efl_ui_select_model_apply_last_model(parent, pd, NULL); // Just in case we need to refill the fallback _efl_ui_select_model_fallback(pd); @@ -401,13 +402,12 @@ _efl_ui_select_model_efl_model_property_set(Eo *obj, { if (pd->parent->last_model == obj && !newflag) { - efl_replace(&pd->last_model, NULL); - pd->parent->none = EINA_TRUE; + _efl_ui_select_model_apply_last_model(efl_parent_get(obj), pd->parent, NULL); _efl_ui_select_model_fallback(pd); } } - else + else if (pd->parent->last_model) { Eo *parent; unsigned long selected = 0; @@ -431,6 +431,10 @@ _efl_ui_select_model_efl_model_property_set(Eo *obj, .error = _untangle_error, .free = _untangle_free); } + else + { + _efl_ui_select_model_apply_last_model(efl_parent_get(obj), pd->parent, obj); + } } return efl_future_then(efl_ref(obj), chain, @@ -450,10 +454,10 @@ _efl_ui_select_model_efl_model_property_get(const Eo *obj, Efl_Ui_Select_Model_D // Last selected child if (eina_streq("child.selected", property)) { - if (pd->none) - return eina_value_error_new(EFL_MODEL_ERROR_INCORRECT_VALUE); - else if (pd->last_model) + if (pd->last_model) return eina_value_ulong_new(efl_composite_model_index_get(pd->last_model)); + else if (pd->fallback_model) + return eina_value_ulong_new(efl_composite_model_index_get(pd->fallback_model)); else // Nothing selected yet, try again later return eina_value_error_new(EAGAIN); } @@ -653,7 +657,7 @@ _efl_ui_select_model_efl_ui_single_selectable_fallback_selection_set(Eo *obj, efl_replace(&pd->fallback_model, fallback); - if (!pd->none) return ; + if (!pd->last_model) return ; // When we provide a fallback, we should use it! index = efl_model_property_get(fallback, EFL_COMPOSITE_MODEL_CHILD_INDEX); From 52d0452f0ddfd0c9c4305c71914b963fab7d2230 Mon Sep 17 00:00:00 2001 From: Cedric BAIL Date: Fri, 3 Jan 2020 15:35:49 -0800 Subject: [PATCH 20/22] elementary: add proper test for "child.selected" propagation. Reviewed-by: Mike Blumenkrantz Differential Revision: https://phab.enlightenment.org/D11014 --- src/tests/elementary/efl_ui_test_select_model.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/tests/elementary/efl_ui_test_select_model.c b/src/tests/elementary/efl_ui_test_select_model.c index 12d5e6e148..78259085a3 100644 --- a/src/tests/elementary/efl_ui_test_select_model.c +++ b/src/tests/elementary/efl_ui_test_select_model.c @@ -102,8 +102,11 @@ EFL_START_TEST(efl_test_select_model) model = efl_add_ref(EFL_UI_SELECT_MODEL_CLASS, efl_main_loop_get(), efl_ui_view_model_set(efl_added, base_model)); ck_assert(!!model); - future = efl_model_property_set(model, "child.selected", eina_value_int_new(2)); + + future = efl_model_property_ready_get(model, "child.selected"); eina_future_then(future, _wait_propagate, NULL, NULL); + + efl_model_property_set(model, "child.selected", eina_value_int_new(2)); ecore_main_loop_begin(); future = efl_model_children_slice_get(model, 0, efl_model_children_count_get(model)); @@ -120,6 +123,8 @@ EFL_START_TEST(efl_test_select_model) EINA_ITERATOR_FOREACH(it, index) fail_if(*index == 2); eina_iterator_free(it); + + efl_model_property_set(model, "child.selected", eina_value_int_new(1)); } EFL_END_TEST From 91ed9b59d90b5fc65ad5b64f8beba96d608d31c0 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Fri, 3 Jan 2020 10:06:40 -0500 Subject: [PATCH 21/22] elementary: start some collectionview tests * basic test checking realize/unrealize signals * selection model test Reviewed-by: Cedric BAIL Differential Revision: https://phab.enlightenment.org/D11012 --- src/tests/elementary/efl_ui_suite.c | 1 + src/tests/elementary/efl_ui_suite.h | 1 + .../elementary/efl_ui_test_collection_view.c | 158 ++++++++++++++++++ src/tests/elementary/meson.build | 1 + 4 files changed, 161 insertions(+) create mode 100644 src/tests/elementary/efl_ui_test_collection_view.c diff --git a/src/tests/elementary/efl_ui_suite.c b/src/tests/elementary/efl_ui_suite.c index 9234d68a2f..4b8dc0dbbb 100644 --- a/src/tests/elementary/efl_ui_suite.c +++ b/src/tests/elementary/efl_ui_suite.c @@ -38,6 +38,7 @@ static const Efl_Test_Case etc[] = { { "efl_ui_collection", efl_ui_test_item_container }, { "efl_ui_grid_container", efl_ui_test_grid_container }, { "efl_ui_list_container", efl_ui_test_list_container }, + { "efl_ui_collection_view", efl_ui_test_collection_view }, { "efl_ui_select_model", efl_ui_test_select_model }, { "efl_ui_view_model", efl_ui_test_view_model }, { "efl_ui_group_item", efl_ui_test_group_item }, diff --git a/src/tests/elementary/efl_ui_suite.h b/src/tests/elementary/efl_ui_suite.h index cb83a00ce7..c63df11bfb 100644 --- a/src/tests/elementary/efl_ui_suite.h +++ b/src/tests/elementary/efl_ui_suite.h @@ -46,6 +46,7 @@ void efl_ui_test_spin_button(TCase *tc); void efl_ui_test_item_container(TCase *tc); void efl_ui_test_list_container(TCase *tc); void efl_ui_test_grid_container(TCase *tc); +void efl_ui_test_collection_view(TCase *tc); void efl_ui_test_config(TCase *tc); void efl_ui_test_popup(TCase *tc); void efl_ui_test_scroller(TCase *tc); diff --git a/src/tests/elementary/efl_ui_test_collection_view.c b/src/tests/elementary/efl_ui_test_collection_view.c new file mode 100644 index 0000000000..8740fdb623 --- /dev/null +++ b/src/tests/elementary/efl_ui_test_collection_view.c @@ -0,0 +1,158 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif + +#include +#include "efl_ui_suite.h" + +#define NUM_ITEMS 50 + +static Efl_Model* +_make_model(Efl_Ui_Win *win) +{ + Eina_Value vi; + Efl_Generic_Model *model, *child; + unsigned int i; + + model = efl_add(EFL_GENERIC_MODEL_CLASS, win); + model = efl_add(EFL_UI_VIEW_MODEL_CLASS, model, + efl_ui_view_model_set(efl_added, model)); + eina_value_setup(&vi, EINA_VALUE_TYPE_INT); + + efl_ui_view_model_property_string_add(model, "relative", "Relative index ${child.index}", "WRONG", "WRONG"); + efl_ui_view_model_property_string_add(model, "title", "Initial index ${initial}", "WRONG", "WRONG"); + + + for (i = 0; i < (NUM_ITEMS); i++) + { + child = efl_model_child_add(model); + eina_value_set(&vi, i); + efl_model_property_set(child, "initial", &vi); + } + + eina_value_flush(&vi); + return model; +} + +static Eina_Value +_quit(Eo *obj, void *data EINA_UNUSED, const Eina_Value v) +{ + efl_loop_quit(efl_loop_get(obj), v); + return v; +} + +static Eina_Value +_children_get(Eo *obj EINA_UNUSED, void *data EINA_UNUSED, const Eina_Value v) +{ + Efl_Model *child; + Eina_Future **all; + unsigned int i, len; + + all = calloc(1 + 1, sizeof(Eina_Future*)); + if (!all) return eina_value_error_init(ENOMEM); + + EINA_VALUE_ARRAY_FOREACH(&v, len, i, child) + { + Eina_Value *rel_val, *title_val; + char *relative, *title; + if (i != 5) continue; + rel_val = efl_model_property_get(child, "relative"); + title_val = efl_model_property_get(child, "title"); + relative = eina_value_to_string(rel_val); + title = eina_value_to_string(title_val); + + ck_assert(eina_streq(relative, "Relative index 5")); + ck_assert(eina_streq(title, "Initial index 5")); + free(relative); + free(title); + break; + } + return EINA_VALUE_EMPTY; +} + +EFL_START_TEST(test_efl_ui_collection_view_basic) +{ + Efl_Ui_Win *win; + Efl_Model *model; + Efl_Ui_List_View *lv; + Efl_Ui_Factory *fl; + Eina_Future *f; + int count_realize = 0; + int count_unrealize = 0; + + win = win_add(); + efl_gfx_entity_size_set(win, EINA_SIZE2D(100, 100)); + + model = _make_model(win); + fl = efl_add(EFL_UI_LAYOUT_FACTORY_CLASS, win, + efl_ui_property_bind(efl_added, "text", "title"), + efl_ui_widget_factory_item_class_set(efl_added, EFL_UI_LIST_DEFAULT_ITEM_CLASS)); + + lv = efl_add(EFL_UI_LIST_VIEW_CLASS, win, + efl_ui_collection_view_factory_set(efl_added, fl), + efl_ui_view_model_set(efl_added, model), + efl_event_callback_add(efl_added, EFL_UI_COLLECTION_VIEW_EVENT_ITEM_REALIZED, + (void*)event_callback_that_increments_an_int_when_called, &count_realize), + efl_event_callback_add(efl_added, EFL_UI_COLLECTION_VIEW_EVENT_ITEM_UNREALIZED, + (void*)event_callback_that_increments_an_int_when_called, &count_unrealize) + ); + efl_content_set(win, lv); + + get_me_to_those_events(lv); + ck_assert_int_gt(count_realize, 0); + /* FIXME: this should eventually be eq(0) */ + ck_assert_int_gt(count_unrealize, 0); + + f = efl_model_children_slice_get(lv, 0, efl_model_children_count_get(lv)); + f = efl_future_then(lv, f, .success_type = EINA_VALUE_TYPE_ARRAY, .success = _children_get); + ecore_main_loop_iterate(); +} +EFL_END_TEST + +EFL_START_TEST(test_efl_ui_collection_view_select) +{ + Efl_Ui_Win *win; + Efl_Model *model; + Efl_Ui_List_View *lv; + Efl_Ui_Factory *fl; + Eina_Value *sel_val; + unsigned long sel = 10000; + + win = win_add(); + efl_gfx_entity_size_set(win, EINA_SIZE2D(100, 100)); + + model = _make_model(win); + model = efl_add(EFL_UI_SELECT_MODEL_CLASS, efl_main_loop_get(), efl_ui_view_model_set(efl_added, model)); + fl = efl_add(EFL_UI_LAYOUT_FACTORY_CLASS, win, + efl_ui_property_bind(efl_added, "text", "title"), + efl_ui_widget_factory_item_class_set(efl_added, EFL_UI_LIST_DEFAULT_ITEM_CLASS)); + + lv = efl_add(EFL_UI_LIST_VIEW_CLASS, win, + efl_ui_collection_view_factory_set(efl_added, fl), + efl_ui_view_model_set(efl_added, model) + ); + efl_content_set(win, lv); + + get_me_to_those_events(lv); + + /* nothing selected yet */ + sel_val = efl_model_property_get(model, "child.selected"); + ck_assert(eina_value_type_get(sel_val) == EINA_VALUE_TYPE_ERROR); + + click_object_at(lv, 50, 5); + get_me_to_those_events(lv); + + //efl_future_then(model, efl_model_property_ready_get(model, "child.selected"), .success = _quit); + //ecore_main_loop_begin(); + sel_val = efl_model_property_get(model, "child.selected"); + ck_assert(eina_value_type_get(sel_val) == EINA_VALUE_TYPE_ULONG); + ck_assert(eina_value_ulong_get(sel_val, &sel)); + ck_assert_int_eq(sel, 0); +} +EFL_END_TEST + +void efl_ui_test_collection_view(TCase *tc) +{ + tcase_add_test(tc, test_efl_ui_collection_view_basic); + tcase_add_test(tc, test_efl_ui_collection_view_select); +} diff --git a/src/tests/elementary/meson.build b/src/tests/elementary/meson.build index 7c7c62fdac..c3e85d92ef 100644 --- a/src/tests/elementary/meson.build +++ b/src/tests/elementary/meson.build @@ -150,6 +150,7 @@ efl_ui_suite_src = [ 'efl_ui_test_slider.c', 'efl_ui_test_collection_common.c', 'efl_ui_test_collection.c', + 'efl_ui_test_collection_view.c', 'efl_ui_test_list_collection.c', 'efl_ui_test_grid_collection.c', 'efl_ui_test_position_manager_common.c', From 33c3cb3667be8ea2889998a10459d98fceba139f Mon Sep 17 00:00:00 2001 From: Cedric BAIL Date: Fri, 3 Jan 2020 15:36:22 -0800 Subject: [PATCH 22/22] elementary: enable collection view test to wait for "child.selected" event. Reviewed-by: Mike Blumenkrantz Differential Revision: https://phab.enlightenment.org/D11015 --- src/tests/elementary/efl_ui_test_collection_view.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/tests/elementary/efl_ui_test_collection_view.c b/src/tests/elementary/efl_ui_test_collection_view.c index 8740fdb623..d064203ffb 100644 --- a/src/tests/elementary/efl_ui_test_collection_view.c +++ b/src/tests/elementary/efl_ui_test_collection_view.c @@ -139,11 +139,11 @@ EFL_START_TEST(test_efl_ui_collection_view_select) sel_val = efl_model_property_get(model, "child.selected"); ck_assert(eina_value_type_get(sel_val) == EINA_VALUE_TYPE_ERROR); - click_object_at(lv, 50, 5); - get_me_to_those_events(lv); + efl_future_then(model, efl_model_property_ready_get(model, "child.selected"), .success = _quit); + + click_object_at(lv, 50, 5); + ecore_main_loop_begin(); - //efl_future_then(model, efl_model_property_ready_get(model, "child.selected"), .success = _quit); - //ecore_main_loop_begin(); sel_val = efl_model_property_get(model, "child.selected"); ck_assert(eina_value_type_get(sel_val) == EINA_VALUE_TYPE_ULONG); ck_assert(eina_value_ulong_get(sel_val, &sel));