Fix bug ecore-evas for fb, buffer, sdl back-ends to ensure

mouse is in on init (as events wont always give this) and focus
is set on show if appropriate if no focus in/out events come
from the back-end later

Fix setting override state to only hide if it should be
visible at that point in x back end support
        


SVN revision: 65508
This commit is contained in:
Carsten Haitzler 2011-11-22 05:51:06 +00:00
parent 30f31653f6
commit 8910244dec
8 changed files with 103 additions and 48 deletions

View File

@ -333,3 +333,13 @@
* Ecore_Win32, Ecore_WinCE: fix Shift, Control and Alt keys * Ecore_Win32, Ecore_WinCE: fix Shift, Control and Alt keys
detection detection
* Ecore_Win32: fix "mouse-down inside and mouse-up outside" issue * Ecore_Win32: fix "mouse-down inside and mouse-up outside" issue
2011-11-2 Carsten Haitzler (The Rasterman)
* Fix bug ecore-evas for fb, buffer, sdl back-ends to ensure
mouse is in on init (as events wont always give this) and focus
is set on show if appropriate if no focus in/out events come
from the back-end later
* Fix setting override state to only hide if it should be
visible at that point in x back end support

View File

@ -88,6 +88,7 @@ Fixes:
* use current size not requested size when getting geom in ecore-evas * use current size not requested size when getting geom in ecore-evas
* ecore_cocoa now handles windows correctly * ecore_cocoa now handles windows correctly
* ecore_file_download error handling when ecore_con_url_get fails * ecore_file_download error handling when ecore_con_url_get fails
* focus and mouse-in ininital siate on some ecore-evas back-ends
Improvements: Improvements:
@ -104,6 +105,7 @@ Improvements:
* inet_ntop instead of getnameinfo for ecore_con_client_get_ip * inet_ntop instead of getnameinfo for ecore_con_client_get_ip
* ecore-con unit tests added * ecore-con unit tests added
* ecore-evas fb uses ecore_input_evas now instead of going direct * ecore-evas fb uses ecore_input_evas now instead of going direct
* fix ecore-evas x changing of override support if window not shown yet
Removals: Removals:

View File

@ -101,6 +101,16 @@ _ecore_evas_buffer_shutdown(void)
return _ecore_evas_init_count; return _ecore_evas_init_count;
} }
static void
_ecore_evas_show(Ecore_Evas *ee)
{
if (ee->engine.buffer.image) return;
if (ee->prop.focused) return;
ee->prop.focused = 1;
evas_focus_in(ee->evas);
if (ee->func.fn_focus_in) ee->func.fn_focus_in(ee);
}
int int
_ecore_evas_buffer_render(Ecore_Evas *ee) _ecore_evas_buffer_render(Ecore_Evas *ee)
{ {
@ -484,7 +494,7 @@ static Ecore_Evas_Engine_Func _ecore_buffer_engine_func =
NULL, NULL,
NULL, NULL,
NULL, NULL,
NULL, _ecore_evas_show,
NULL, NULL,
NULL, NULL,
NULL, NULL,
@ -629,6 +639,8 @@ ecore_evas_buffer_allocfunc_new(int w, int h, void *(*alloc_func) (void *data, i
ee->engine.func->fn_render = _ecore_evas_buffer_render; ee->engine.func->fn_render = _ecore_evas_buffer_render;
_ecore_evas_register(ee); _ecore_evas_register(ee);
evas_event_feed_mouse_in(ee->evas, (unsigned int)((unsigned long long)(ecore_time_get() * 1000.0) & 0xffffffff), NULL);
return ee; return ee;
#else #else
return NULL; return NULL;

View File

@ -113,10 +113,12 @@ _ecore_evas_cocoa_event_got_focus(void *data __UNUSED__, int type __UNUSED__, vo
ee = _ecore_evas_cocoa_match(); ee = _ecore_evas_cocoa_match();
if (!ee) return 1; if (!ee) return ECORE_CALLBACK_PASS_ON;
ee->prop.focused = 1; ee->prop.focused = 1;
evas_focus_in(ee->evas);
return 0; if (ee->func.fn_focus_in) ee->func.fn_focus_in(ee);
return ECORE_CALLBACK_PASS_ON;
} }
static int static int
@ -128,10 +130,12 @@ _ecore_evas_cocoa_event_lost_focus(void *data __UNUSED__, int type __UNUSED__, v
ee = _ecore_evas_cocoa_match(); ee = _ecore_evas_cocoa_match();
if (!ee) return 1; if (!ee) return ECORE_CALLBACK_PASS_ON;
evas_focus_out(ee->evas);
ee->prop.focused = 0; ee->prop.focused = 0;
if (ee->func.fn_focus_out) ee->func.fn_focus_out(ee);
return 0; return ECORE_CALLBACK_PASS_ON;
} }
static int static int
@ -149,7 +153,7 @@ _ecore_evas_cocoa_event_video_resize(void *data __UNUSED__, int type __UNUSED__,
return 0;*/ return 0;*/
DBG("Video Resize"); DBG("Video Resize");
return ECORE_CALLBACK_PASS_ON;
} }
static int static int
@ -163,11 +167,11 @@ _ecore_evas_cocoa_event_video_expose(void *data __UNUSED__, int type __UNUSED__,
ee = _ecore_evas_cocoa_match(); ee = _ecore_evas_cocoa_match();
if (!ee) return 1; if (!ee) return ECORE_CALLBACK_PASS_ON;
evas_output_size_get(ee->evas, &w, &h); evas_output_size_get(ee->evas, &w, &h);
evas_damage_rectangle_add(ee->evas, 0, 0, w, h); evas_damage_rectangle_add(ee->evas, 0, 0, w, h);
return 0; return ECORE_CALLBACK_PASS_ON;
} }
static int static int
@ -187,7 +191,7 @@ _ecore_evas_idle_enter(void *data __UNUSED__)
evas_norender(ee->evas); evas_norender(ee->evas);
} }
return 1; return EINA_TRUE;
} }
static int static int
@ -544,6 +548,7 @@ ecore_evas_cocoa_new(Ecore_Cocoa_Window *parent, int x, int y, int w, int h)
_ecore_evas_register(ee); _ecore_evas_register(ee);
ecore_event_window_register(0, ee, ee->evas, NULL, NULL, NULL, NULL); ecore_event_window_register(0, ee, ee->evas, NULL, NULL, NULL, NULL);
evas_event_feed_mouse_in(ee->evas, (unsigned int)((unsigned long long)(ecore_time_get() * 1000.0) & 0xffffffff), NULL);
printf("Ecore Evas returned : %p\n", ee); printf("Ecore Evas returned : %p\n", ee);
return ee; return ee;

View File

@ -102,9 +102,9 @@ _ecore_evas_event_mouse_button_down(void *data __UNUSED__, int type __UNUSED__,
e = event; e = event;
ee = _ecore_evas_fb_match(); ee = _ecore_evas_fb_match();
if (!ee) return EINA_TRUE; /* pass on event */ if (!ee) return ECORE_CALLBACK_PASS_ON;
_ecore_evas_mouse_move_process_fb(ee, e->x, e->y); _ecore_evas_mouse_move_process_fb(ee, e->x, e->y);
return EINA_TRUE; /* dont pass it on */ return ECORE_CALLBACK_PASS_ON;
} }
static Eina_Bool static Eina_Bool
@ -115,9 +115,9 @@ _ecore_evas_event_mouse_button_up(void *data __UNUSED__, int type __UNUSED__, vo
e = event; e = event;
ee = _ecore_evas_fb_match(); ee = _ecore_evas_fb_match();
if (!ee) return EINA_TRUE; /* pass on event */ if (!ee) return ECORE_CALLBACK_PASS_ON;
_ecore_evas_mouse_move_process_fb(ee, e->x, e->y); _ecore_evas_mouse_move_process_fb(ee, e->x, e->y);
return EINA_TRUE; /* dont pass it on */ return ECORE_CALLBACK_PASS_ON;
} }
static Eina_Bool static Eina_Bool
@ -128,9 +128,9 @@ _ecore_evas_event_mouse_move(void *data __UNUSED__, int type __UNUSED__, void *e
e = event; e = event;
ee = _ecore_evas_fb_match(); ee = _ecore_evas_fb_match();
if (!ee) return EINA_TRUE; /* pass on event */ if (!ee) return ECORE_CALLBACK_PASS_ON;
_ecore_evas_mouse_move_process_fb(ee, e->x, e->y); _ecore_evas_mouse_move_process_fb(ee, e->x, e->y);
return EINA_TRUE; /* dont pass it on */ return ECORE_CALLBACK_PASS_ON;
} }
static Eina_Bool static Eina_Bool
@ -141,9 +141,9 @@ _ecore_evas_event_mouse_wheel(void *data __UNUSED__, int type __UNUSED__, void *
e = event; e = event;
ee = _ecore_evas_fb_match(); ee = _ecore_evas_fb_match();
if (!ee) return EINA_TRUE; /* pass on event */ if (!ee) return ECORE_CALLBACK_PASS_ON;
_ecore_evas_mouse_move_process_fb(ee, e->x, e->y); _ecore_evas_mouse_move_process_fb(ee, e->x, e->y);
return EINA_TRUE; /* dont pass it on */ return ECORE_CALLBACK_PASS_ON;
} }
static int static int
@ -370,6 +370,15 @@ _ecore_evas_rotation_set(Ecore_Evas *ee, int rotation, int resize __UNUSED__)
if (ee->func.fn_resize) ee->func.fn_resize(ee); if (ee->func.fn_resize) ee->func.fn_resize(ee);
} }
static void
_ecore_evas_show(Ecore_Evas *ee)
{
if (ee->prop.focused) return;
ee->prop.focused = 1;
evas_focus_in(ee->evas);
if (ee->func.fn_focus_in) ee->func.fn_focus_in(ee);
}
static void static void
_ecore_evas_object_cursor_del(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) _ecore_evas_object_cursor_del(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
{ {
@ -508,7 +517,7 @@ static Ecore_Evas_Engine_Func _ecore_fb_engine_func =
_ecore_evas_move_resize, _ecore_evas_move_resize,
_ecore_evas_rotation_set, _ecore_evas_rotation_set,
NULL, NULL,
NULL, _ecore_evas_show,
NULL, NULL,
NULL, NULL,
NULL, NULL,
@ -636,10 +645,7 @@ ecore_evas_fb_new(const char *disp_name, int rotation, int w, int h)
ee->engine.func->fn_render = _ecore_evas_fb_render; ee->engine.func->fn_render = _ecore_evas_fb_render;
_ecore_evas_register(ee); _ecore_evas_register(ee);
fb_ee = ee; fb_ee = ee;
evas_event_feed_mouse_in(ee->evas, (unsigned int)((unsigned long long)(ecore_time_get() * 1000.0) & 0xffffffff), NULL); evas_event_feed_mouse_in(ee->evas, (unsigned int)((unsigned long long)(ecore_time_get() * 1000.0) & 0xffffffff), NULL);
evas_focus_in(ee->evas);
return ee; return ee;
} }
#else #else

View File

@ -46,8 +46,10 @@ _ecore_evas_psl1ght_event_got_focus(void *data __UNUSED__, int type __UNUSED__,
if (!ee) return ECORE_CALLBACK_PASS_ON; if (!ee) return ECORE_CALLBACK_PASS_ON;
/* pass on event */ /* pass on event */
ee->prop.focused = 1; ee->prop.focused = 1;
evas_focus_in(ee->evas);
return ECORE_CALLBACK_DONE; if (ee->func.fn_focus_in) ee->func.fn_focus_in(ee);
return ECORE_CALLBACK_PASS_ON;
} }
static Eina_Bool static Eina_Bool
@ -59,9 +61,11 @@ _ecore_evas_psl1ght_event_lost_focus(void *data __UNUSED__, int type __UNUSED__,
if (!ee) return ECORE_CALLBACK_PASS_ON; if (!ee) return ECORE_CALLBACK_PASS_ON;
/* pass on event */ /* pass on event */
evas_focus_out(ee->evas);
ee->prop.focused = 0; ee->prop.focused = 0;
if (ee->func.fn_focus_out) ee->func.fn_focus_out(ee);
return ECORE_CALLBACK_DONE;
return ECORE_CALLBACK_PASS_ON;
} }
static Eina_Bool static Eina_Bool
@ -77,7 +81,7 @@ _ecore_evas_psl1ght_event_video_expose(void *data __UNUSED__, int type __UNUSED_
evas_output_size_get(ee->evas, &w, &h); evas_output_size_get(ee->evas, &w, &h);
evas_damage_rectangle_add(ee->evas, 0, 0, w, h); evas_damage_rectangle_add(ee->evas, 0, 0, w, h);
return ECORE_CALLBACK_DONE; return ECORE_CALLBACK_PASS_ON;
} }
static Eina_Bool static Eina_Bool
@ -91,7 +95,7 @@ _ecore_evas_psl1ght_event_key_modifiers(void *data __UNUSED__, int type __UNUSED
if (!ee) return ECORE_CALLBACK_PASS_ON; if (!ee) return ECORE_CALLBACK_PASS_ON;
ecore_event_evas_modifier_lock_update(ee->evas, e->modifiers); ecore_event_evas_modifier_lock_update(ee->evas, e->modifiers);
return ECORE_CALLBACK_DONE; return ECORE_CALLBACK_PASS_ON;
} }
static int static int
@ -254,6 +258,15 @@ _ecore_evas_move_resize(Ecore_Evas *ee, int x __UNUSED__, int y __UNUSED__, int
_ecore_evas_resize (ee, w, h); _ecore_evas_resize (ee, w, h);
} }
static void
_ecore_evas_show(Ecore_Evas *ee)
{
if (ee->prop.focused) return;
ee->prop.focused = 1;
evas_focus_in(ee->evas);
if (ee->func.fn_focus_in) ee->func.fn_focus_in(ee);
}
static void static void
_ecore_evas_screen_geometry_get(const Ecore_Evas *ee __UNUSED__, int *x, int *y, int *w, int *h) _ecore_evas_screen_geometry_get(const Ecore_Evas *ee __UNUSED__, int *x, int *y, int *w, int *h)
{ {
@ -327,7 +340,7 @@ static Ecore_Evas_Engine_Func _ecore_psl1ght_engine_func =
_ecore_evas_move_resize, _ecore_evas_move_resize,
NULL, NULL,
NULL, NULL,
NULL, _ecore_evas_show,
NULL, NULL,
NULL, NULL,
NULL, NULL,
@ -441,13 +454,13 @@ ecore_evas_psl1ght_new(const char *name, int w, int h)
psl1ght_ee = ee; psl1ght_ee = ee;
evas_event_feed_mouse_in(ee->evas, _ecore_evas_time_get (), NULL);
evas_focus_in(ee->evas);
_ecore_evas_screen_resized (ee); _ecore_evas_screen_resized (ee);
if (getenv("ECORE_EVAS_PSL1GHT_CURSOR_PATH")) if (getenv("ECORE_EVAS_PSL1GHT_CURSOR_PATH"))
ecore_evas_cursor_set(ee, getenv("ECORE_EVAS_PSL1GHT_CURSOR_PATH"), EVAS_LAYER_MAX, 0, 0); ecore_evas_cursor_set(ee, getenv("ECORE_EVAS_PSL1GHT_CURSOR_PATH"), EVAS_LAYER_MAX, 0, 0);
evas_event_feed_mouse_in(ee->evas, (unsigned int)((unsigned long long)(ecore_time_get() * 1000.0) & 0xffffffff), NULL);
return ee; return ee;
} }

View File

@ -52,8 +52,9 @@ _ecore_evas_sdl_event_got_focus(void *data __UNUSED__, int type __UNUSED__, void
if (!ee) return ECORE_CALLBACK_PASS_ON; if (!ee) return ECORE_CALLBACK_PASS_ON;
/* pass on event */ /* pass on event */
ee->prop.focused = 1; ee->prop.focused = 1;
evas_focus_in(ee->evas);
return ECORE_CALLBACK_DONE; if (ee->func.fn_focus_in) ee->func.fn_focus_in(ee);
return ECORE_CALLBACK_PASS_ON;
} }
static Eina_Bool static Eina_Bool
@ -66,8 +67,9 @@ _ecore_evas_sdl_event_lost_focus(void *data __UNUSED__, int type __UNUSED__, voi
if (!ee) return ECORE_CALLBACK_PASS_ON; if (!ee) return ECORE_CALLBACK_PASS_ON;
/* pass on event */ /* pass on event */
ee->prop.focused = 0; ee->prop.focused = 0;
evas_focus_out(ee->evas);
return ECORE_CALLBACK_DONE; if (ee->func.fn_focus_out) ee->func.fn_focus_out(ee);
return ECORE_CALLBACK_PASS_ON;
} }
static Eina_Bool static Eina_Bool
@ -82,7 +84,7 @@ _ecore_evas_sdl_event_video_resize(void *data __UNUSED__, int type __UNUSED__, v
if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */ if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */
evas_output_size_set(ee->evas, e->w, e->h); evas_output_size_set(ee->evas, e->w, e->h);
return ECORE_CALLBACK_DONE; return ECORE_CALLBACK_PASS_ON;
} }
static Eina_Bool static Eina_Bool
@ -98,7 +100,7 @@ _ecore_evas_sdl_event_video_expose(void *data __UNUSED__, int type __UNUSED__, v
evas_output_size_get(ee->evas, &w, &h); evas_output_size_get(ee->evas, &w, &h);
evas_damage_rectangle_add(ee->evas, 0, 0, w, h); evas_damage_rectangle_add(ee->evas, 0, 0, w, h);
return ECORE_CALLBACK_DONE; return ECORE_CALLBACK_PASS_ON;
} }
static int static int
@ -239,14 +241,21 @@ _ecore_evas_move_resize(Ecore_Evas *ee, int x __UNUSED__, int y __UNUSED__, int
if (ee->func.fn_resize) ee->func.fn_resize(ee); if (ee->func.fn_resize) ee->func.fn_resize(ee);
} }
static void
_ecore_evas_show(Ecore_Evas *ee)
{
if (ee->prop.focused) return;
ee->prop.focused = 1;
evas_event_feed_mouse_in(ee->evas, (unsigned int)((unsigned long long)(ecore_time_get() * 1000.0) & 0xffffffff), NULL);
}
static void static void
_ecore_evas_object_cursor_del(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) _ecore_evas_object_cursor_del(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
{ {
Ecore_Evas *ee; Ecore_Evas *ee;
ee = data; ee = data;
if (ee) if (ee) ee->prop.cursor.object = NULL;
ee->prop.cursor.object = NULL;
} }
static void static void
@ -304,7 +313,7 @@ static Ecore_Evas_Engine_Func _ecore_sdl_engine_func =
_ecore_evas_move_resize, _ecore_evas_move_resize,
NULL, NULL,
NULL, NULL,
NULL, _ecore_evas_show,
NULL, NULL,
NULL, NULL,
NULL, NULL,
@ -458,10 +467,6 @@ _ecore_evas_internal_sdl_new(int rmethod, const char* name, int w, int h, int fu
_ecore_evas_register(ee); _ecore_evas_register(ee);
sdl_ee = ee; sdl_ee = ee;
evas_event_feed_mouse_in(ee->evas, (unsigned int)((unsigned long long)(ecore_time_get() * 1000.0) & 0xffffffff), NULL);
evas_focus_in(ee->evas);
return ee; return ee;
} }
#endif #endif

View File

@ -1005,7 +1005,8 @@ _ecore_evas_x_event_window_show(void *data __UNUSED__, int type __UNUSED__, void
} }
if ((first_map_bug) && (!strcmp(ee->driver, "opengl_x11"))) if ((first_map_bug) && (!strcmp(ee->driver, "opengl_x11")))
evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h); evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
if (ee->visible) return ECORE_CALLBACK_DONE; if (ee->visible) return ECORE_CALLBACK_PASS_ON;
// if (ee->visible) return ECORE_CALLBACK_DONE;
// printf("SHOW EVENT %p\n", ee); // printf("SHOW EVENT %p\n", ee);
ee->visible = 1; ee->visible = 1;
if (ee->func.fn_show) ee->func.fn_show(ee); if (ee->func.fn_show) ee->func.fn_show(ee);
@ -1022,7 +1023,8 @@ _ecore_evas_x_event_window_hide(void *data __UNUSED__, int type __UNUSED__, void
ee = ecore_event_window_match(e->win); ee = ecore_event_window_match(e->win);
if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */ if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */
if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON; if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
if (!ee->visible) return ECORE_CALLBACK_DONE; if (!ee->visible) return ECORE_CALLBACK_PASS_ON;
// if (!ee->visible) return ECORE_CALLBACK_DONE;
// printf("HIDE EVENT %p\n", ee); // printf("HIDE EVENT %p\n", ee);
ee->visible = 0; ee->visible = 0;
if (ee->func.fn_hide) ee->func.fn_hide(ee); if (ee->func.fn_hide) ee->func.fn_hide(ee);
@ -2460,9 +2462,9 @@ static void
_ecore_evas_x_override_set(Ecore_Evas *ee, int on) _ecore_evas_x_override_set(Ecore_Evas *ee, int on)
{ {
if (ee->prop.override == on) return; if (ee->prop.override == on) return;
ecore_x_window_hide(ee->prop.window); if (ee->should_be_visible) ecore_x_window_hide(ee->prop.window);
ecore_x_window_override_set(ee->prop.window, on); ecore_x_window_override_set(ee->prop.window, on);
if (ee->visible) ecore_x_window_show(ee->prop.window); if (ee->should_be_visible) ecore_x_window_show(ee->prop.window);
if (ee->prop.focused) ecore_x_window_focus(ee->prop.window); if (ee->prop.focused) ecore_x_window_focus(ee->prop.window);
ee->prop.override = on; ee->prop.override = on;
} }