Modified: trunk/Tools/ChangeLog (138696 => 138697)
--- trunk/Tools/ChangeLog 2013-01-03 04:44:09 UTC (rev 138696)
+++ trunk/Tools/ChangeLog 2013-01-03 04:47:46 UTC (rev 138697)
@@ -1,3 +1,43 @@
+2013-01-02 Byungwoo Lee <[email protected]>
+
+ [EFL][WK2] Fix tooltip bugs in MiniBrowser.
+ https://bugs.webkit.org/show_bug.cgi?id=102209
+
+ Reviewed by Gyuyoung Kim.
+
+ Set tooltip on the elm_window instead of ewk_view, and add delay to
+ show the tooltip window.
+
+ Setting tooltip on the ewk_view makes elementary error message because
+ ewk_view is not an elementary widget. To remove the error message,
+ tooltip should be set on the elm_window.
+
+ Most browsers show the tooltip after a mouse pointer stays on an
+ element object that has tooltip text.
+ But elm_tooltip widget itself doesn't have delay or handle mouse
+ events to show/hide.
+
+ So additional codes are added to show/hide tooltip widget along with
+ mouse events.
+ 1) When a mouse pointer stays for a second on an element which has
+ tooltip text, then tooltip widget is displayed.
+ 2) When a mouse pointer is moved or out of ewk_view, hide the tooltip
+ widget.
+
+ * MiniBrowser/efl/main.c:
+ (_Tooltip_Information):
+ (_Browser_Window):
+ (on_tooltip_show):
+ (window_tooltip_hide):
+ (window_tooltip_update):
+ (on_mouse_in):
+ (on_mouse_move):
+ (on_mouse_out):
+ (window_free):
+ (on_tooltip_text_set):
+ (on_tooltip_text_unset):
+ (window_create):
+
2013-01-02 Tony Chang <[email protected]>
Unreviewed, rolling out r138661.
Modified: trunk/Tools/MiniBrowser/efl/main.c (138696 => 138697)
--- trunk/Tools/MiniBrowser/efl/main.c 2013-01-03 04:44:09 UTC (rev 138696)
+++ trunk/Tools/MiniBrowser/efl/main.c 2013-01-03 04:47:46 UTC (rev 138697)
@@ -29,6 +29,7 @@
static const char APP_NAME[] = "EFL MiniBrowser";
static const int TOOL_BAR_ICON_SIZE = 24;
static const int TOOL_BAR_BUTTON_SIZE = 32;
+static const double TOOLTIP_DELAY_SECONDS = 1.0;
#define info(format, args...) \
do { \
@@ -75,6 +76,13 @@
return &ewkViewClass;
}
+typedef struct _Tooltip_Information {
+ Ecore_Timer *show_timer;
+ Eina_Bool activated;
+ Eina_Bool text_set;
+ Eina_Bool shown;
+} Tooltip_Information;
+
typedef struct _Browser_Window {
Evas_Object *elm_window;
Evas_Object *ewk_view;
@@ -82,6 +90,7 @@
Evas_Object *back_button;
Evas_Object *forward_button;
int current_zoom_level;
+ Tooltip_Information tooltip;
} Browser_Window;
typedef struct _File_Selector_Data {
@@ -166,11 +175,77 @@
return NULL;
}
+static Eina_Bool
+on_tooltip_show(void *user_data)
+{
+ Browser_Window *window = (Browser_Window *)user_data;
+
+ window->tooltip.show_timer = NULL;
+ elm_object_tooltip_show(window->elm_window);
+ window->tooltip.shown = EINA_TRUE;
+ return ECORE_CALLBACK_CANCEL;
+}
+
+static void
+window_tooltip_hide(Browser_Window *window)
+{
+ if (window->tooltip.show_timer) {
+ ecore_timer_del(window->tooltip.show_timer);
+ window->tooltip.show_timer = NULL;
+ }
+
+ if (window->tooltip.shown) {
+ elm_object_tooltip_hide(window->elm_window);
+ window->tooltip.shown = EINA_FALSE;
+ }
+}
+
+static void
+window_tooltip_update(Browser_Window *window)
+{
+ window_tooltip_hide(window);
+
+ if (window->tooltip.activated && window->tooltip.text_set)
+ window->tooltip.show_timer = ecore_timer_add(TOOLTIP_DELAY_SECONDS, on_tooltip_show, window);
+}
+
+static void
+on_mouse_in(void *user_data, Evas *e, Evas_Object *ewk_view, void *event_info)
+{
+ Browser_Window *window = (Browser_Window *)user_data;
+
+ window->tooltip.activated = EINA_TRUE;
+ window_tooltip_update(window);
+}
+
+static void
+on_mouse_move(void *user_data, Evas *e, Evas_Object *ewk_view, void *event_info)
+{
+ window_tooltip_update((Browser_Window *)user_data);
+}
+
+static void
+on_mouse_out(void *user_data, Evas *e, Evas_Object *ewk_view, void *event_info)
+{
+ Browser_Window *window = (Browser_Window *)user_data;
+
+ window->tooltip.activated = EINA_FALSE;
+ window_tooltip_update(window);
+}
+
static void window_free(Browser_Window *window)
{
+ evas_object_event_callback_del(window->ewk_view, EVAS_CALLBACK_MOUSE_IN, on_mouse_in);
+ evas_object_event_callback_del(window->ewk_view, EVAS_CALLBACK_MOUSE_OUT, on_mouse_out);
+ evas_object_event_callback_del(window->ewk_view, EVAS_CALLBACK_MOUSE_MOVE, on_mouse_move);
+
evas_object_del(window->ewk_view);
/* The elm_win will take care of freeing its children */
evas_object_del(window->elm_window);
+
+ if (window->tooltip.show_timer)
+ ecore_timer_del(window->tooltip.show_timer);
+
free(window);
}
@@ -954,8 +1029,9 @@
Browser_Window *window = (Browser_Window *)user_data;
const char *message = (const char*)event_info;
- elm_object_tooltip_text_set(window->ewk_view, message);
- elm_object_tooltip_show(window->ewk_view);
+ elm_object_tooltip_text_set(window->elm_window, message);
+ window->tooltip.text_set = EINA_TRUE;
+ window_tooltip_update(window);
}
static void
@@ -963,7 +1039,9 @@
{
Browser_Window *window = (Browser_Window *)user_data;
- elm_object_tooltip_unset(window->ewk_view);
+ window_tooltip_hide(window);
+ elm_object_tooltip_unset(window->elm_window);
+ window->tooltip.text_set = EINA_FALSE;
}
static void
@@ -1004,6 +1082,12 @@
return NULL;
}
+ /* Initialize tooltip information */
+ window->tooltip.show_timer = NULL;
+ window->tooltip.activated = EINA_FALSE;
+ window->tooltip.text_set = EINA_FALSE;
+ window->tooltip.shown = EINA_FALSE;
+
/* Create window */
window->elm_window = elm_win_add(NULL, "minibrowser-window", ELM_WIN_BASIC);
elm_win_title_set(window->elm_window, APP_NAME);
@@ -1146,6 +1230,10 @@
view_focus_set(window, EINA_TRUE);
+ evas_object_event_callback_add(window->ewk_view, EVAS_CALLBACK_MOUSE_IN, on_mouse_in, window);
+ evas_object_event_callback_add(window->ewk_view, EVAS_CALLBACK_MOUSE_OUT, on_mouse_out, window);
+ evas_object_event_callback_add(window->ewk_view, EVAS_CALLBACK_MOUSE_MOVE, on_mouse_move, window);
+
return window;
}