}
static void
+_e_hwc_window_obj_cb_show(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
+{
+ E_Hwc_Window *hwc_window;
+
+ if (!(hwc_window = data)) return;
+
+ hwc_window->evas_visible = EINA_TRUE;
+
+ e_hwc_window_changed_set(hwc_window, E_HWC_WINS_CHANGED_WIN_VISIBLE);
+}
+
+static void
+_e_hwc_window_obj_cb_hide(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
+{
+ E_Hwc_Window *hwc_window;
+
+ if (!(hwc_window = data)) return;
+
+ hwc_window->evas_visible = EINA_FALSE;
+
+ e_hwc_window_changed_set(hwc_window, E_HWC_WINS_CHANGED_WIN_VISIBLE);
+}
+
+static void
+_e_hwc_window_obj_cb_move(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
+{
+ E_Hwc_Window *hwc_window;
+
+ if (!(hwc_window = data)) return;
+
+ e_hwc_window_changed_set(hwc_window, E_HWC_WINS_CHANGED_WIN_GEOMETRY);
+
+ if (hwc_window->hwc_visible)
+ {
+ if (!e_hwc_window_client_geometry_visible_get(hwc_window))
+ e_hwc_window_changed_set(hwc_window, E_HWC_WINS_CHANGED_WIN_VISIBLE);
+ }
+ else
+ {
+ if ((hwc_window->evas_visible) && (e_hwc_window_client_geometry_visible_get(hwc_window)))
+ e_hwc_window_changed_set(hwc_window, E_HWC_WINS_CHANGED_WIN_VISIBLE);
+ }
+}
+
+static void
+_e_hwc_window_obj_cb_resize(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
+{
+ E_Hwc_Window *hwc_window;
+
+ if (!(hwc_window = data)) return;
+
+ e_hwc_window_changed_set(hwc_window, E_HWC_WINS_CHANGED_WIN_GEOMETRY);
+
+ if (hwc_window->hwc_visible)
+ {
+ if (!e_hwc_window_client_geometry_visible_get(hwc_window))
+ e_hwc_window_changed_set(hwc_window, E_HWC_WINS_CHANGED_WIN_VISIBLE);
+ }
+ else
+ {
+ if ((hwc_window->evas_visible) && (e_hwc_window_client_geometry_visible_get(hwc_window)))
+ e_hwc_window_changed_set(hwc_window, E_HWC_WINS_CHANGED_WIN_VISIBLE);
+ }
+}
+
+static void
+_e_hwc_window_obj_cb_restack(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
+{
+ E_Hwc_Window *hwc_window;
+
+ if (!(hwc_window = data)) return;
+
+ e_hwc_window_changed_set(hwc_window, E_HWC_WINS_CHANGED_WIN_VISIBLE);
+}
+
+static void
_e_hwc_window_del(E_Hwc_Window *hwc_window)
{
E_Client *ec;
ec = hwc_window->ec;
EINA_SAFETY_ON_NULL_RETURN(ec);
+ evas_object_event_callback_del_full(hwc_window->ec->frame, EVAS_CALLBACK_SHOW,
+ _e_hwc_window_obj_cb_show,
+ hwc_window);
+ evas_object_event_callback_del_full(hwc_window->ec->frame, EVAS_CALLBACK_HIDE,
+ _e_hwc_window_obj_cb_hide,
+ hwc_window);
+ evas_object_event_callback_del_full(hwc_window->ec->frame, EVAS_CALLBACK_MOVE,
+ _e_hwc_window_obj_cb_move,
+ hwc_window);
+ evas_object_event_callback_del_full(hwc_window->ec->frame, EVAS_CALLBACK_RESIZE,
+ _e_hwc_window_obj_cb_resize,
+ hwc_window);
+ evas_object_event_callback_del_full(hwc_window->ec->frame, EVAS_CALLBACK_RESTACK,
+ _e_hwc_window_obj_cb_restack,
+ hwc_window);
+
ec->hwc_window = NULL;
hwc_window->ec = NULL;
hwc_window->is_deleted = EINA_TRUE;
if (hwc_window->color_set_listener.notify)
wl_list_remove(&hwc_window->color_set_listener.link);
+ if (hwc_window->color_visible_set_listener.notify)
+ wl_list_remove(&hwc_window->color_visible_set_listener.link);
+
e_hwc_window_below_transparent_obj_set(hwc_window, EINA_FALSE);
e_hwc_window_state_set(hwc_window, E_HWC_WINDOW_STATE_NONE, EINA_TRUE);
+ e_hwc_window_changed_set(hwc_window, E_HWC_WINS_CHANGED_WIN_VISIBLE);
+
e_object_del(E_OBJECT(hwc_window));
}
_e_hwc_window_commit_restriction_update(hwc_window);
}
+static void
+_e_hwc_window_cb_color_visible_set(struct wl_listener *listener, void *data)
+{
+ E_Hwc_Window *hwc_window;
+
+ hwc_window = container_of(listener, E_Hwc_Window, color_visible_set_listener);
+
+ e_hwc_window_changed_set(hwc_window, E_HWC_WINS_CHANGED_WIN_VISIBLE);
+}
+
static E_Hwc_Window *
_e_hwc_window_new(E_Hwc *hwc, E_Client *ec, E_Hwc_Window_State state)
{
hwc_window->color_set_listener.notify = _e_hwc_window_cb_color_set;
e_comp_object_color_set_listener_add(ec->frame, &hwc_window->color_set_listener);
+ hwc_window->color_visible_set_listener.notify = _e_hwc_window_cb_color_visible_set;
+ e_comp_object_color_visible_set_listener_add(ec->frame, &hwc_window->color_visible_set_listener);
+
+ evas_object_event_callback_add(hwc_window->ec->frame, EVAS_CALLBACK_SHOW,
+ _e_hwc_window_obj_cb_show,
+ hwc_window);
+ evas_object_event_callback_add(hwc_window->ec->frame, EVAS_CALLBACK_HIDE,
+ _e_hwc_window_obj_cb_hide,
+ hwc_window);
+ evas_object_event_callback_add(hwc_window->ec->frame, EVAS_CALLBACK_MOVE,
+ _e_hwc_window_obj_cb_move,
+ hwc_window);
+ evas_object_event_callback_add(hwc_window->ec->frame, EVAS_CALLBACK_RESIZE,
+ _e_hwc_window_obj_cb_resize,
+ hwc_window);
+ evas_object_event_callback_add(hwc_window->ec->frame, EVAS_CALLBACK_RESTACK,
+ _e_hwc_window_obj_cb_restack,
+ hwc_window);
+
+ if (evas_object_visible_get(ec->frame))
+ e_hwc_window_changed_set(hwc_window, E_HWC_WINS_CHANGED_WIN_VISIBLE);
+
EHWINF("is created on eout:%p, video:%d cursor:%d",
hwc_window->ec, hwc_window->hwc, hwc_window, hwc->output,
hwc_window->is_video, hwc_window->is_cursor);
else
e_hwc_window_restriction_unset(hwc_window, E_HWC_WINDOW_RESTRICTION_TRANSFORM);
+ e_hwc_window_changed_set(hwc_window, E_HWC_WINS_CHANGED_WIN_GEOMETRY);
+
+ if ((hwc_window->hwc_visible) && (!e_hwc_window_client_geometry_visible_get(hwc_window)))
+ e_hwc_window_changed_set(hwc_window, E_HWC_WINS_CHANGED_WIN_VISIBLE);
+
if (!e_comp_wl_video_subsurface_has(ec) && !e_comp_wl_normal_subsurface_has(ec))
return;
_e_hwc_window_commit_restriction_update(ec->hwc_window);
}
+static void
+_e_hwc_window_cb_buffer_change(void *data, E_Client *ec)
+{
+ E_Hwc_Window *hwc_window;
+
+ EINA_SAFETY_ON_NULL_RETURN(ec);
+
+ hwc_window = ec->hwc_window;
+ if (!hwc_window) return;
+
+ e_hwc_window_changed_set(hwc_window, E_HWC_WINS_CHANGED_WIN_BUFFER);
+}
+
+static void
+_e_hwc_window_cb_alpha_change(void *data, E_Client *ec)
+{
+ E_Hwc_Window *hwc_window;
+
+ EINA_SAFETY_ON_NULL_RETURN(ec);
+
+ hwc_window = ec->hwc_window;
+ if (!hwc_window) return;
+
+ if (!hwc_window->hwc_visible) return;
+
+ e_hwc_window_changed_set(hwc_window, E_HWC_WINS_CHANGED_WIN_VISIBLE);
+}
+
static Eina_Bool
_e_hwc_window_cb_update_lock_set(void *data, E_Client *ec)
{
if (!hwc_window) return EINA_TRUE;
e_hwc_window_restriction_unset(hwc_window, E_HWC_WINDOW_RESTRICTION_RENDER_UPDATE_LOCK);
+ e_hwc_window_changed_set(hwc_window, E_HWC_WINS_CHANGED_WIN_BUFFER | E_HWC_WINS_CHANGED_WIN_GEOMETRY);
return EINA_TRUE;
}
if (!hwc_window) return EINA_TRUE;
e_hwc_window_restriction_set(hwc_window, E_HWC_WINDOW_RESTRICTION_EFFECT);
+ e_hwc_window_changed_set(hwc_window, E_HWC_WINS_CHANGED_WIN_VISIBLE);
return EINA_TRUE;
}
if (!hwc_window) return EINA_TRUE;
e_hwc_window_restriction_unset(hwc_window, E_HWC_WINDOW_RESTRICTION_EFFECT);
+ e_hwc_window_changed_set(hwc_window, E_HWC_WINS_CHANGED_WIN_VISIBLE);
return EINA_TRUE;
}
if (!hwc_window) return;
e_hwc_window_restriction_set(hwc_window, E_HWC_WINDOW_RESTRICTION_BUFFER);
+ e_hwc_window_changed_set(hwc_window, E_HWC_WINS_CHANGED_WIN_BUFFER);
}
EINTERN Eina_Bool
_e_hwc_window_cb_subsurface_synchronized_commit, NULL);
E_COMP_WL_HOOK_APPEND(hwc_window_comp_wl_hooks, E_COMP_WL_HOOK_CLIENT_SURFACE_COMMIT,
_e_hwc_window_cb_surface_commit, NULL);
+ E_COMP_WL_HOOK_APPEND(hwc_window_comp_wl_hooks, E_COMP_WL_HOOK_BUFFER_CHANGE,
+ _e_hwc_window_cb_buffer_change, NULL);
+ E_COMP_WL_HOOK_APPEND(hwc_window_comp_wl_hooks, E_COMP_WL_HOOK_CLIENT_ALPHA_CHANGE,
+ _e_hwc_window_cb_alpha_change, NULL);
E_PIXMAP_HOOK_APPEND(hwc_window_pixmap_hooks, E_PIXMAP_HOOK_BUFFER_CLEAR_DONE,
_e_hwc_window_cb_pixmap_buffer_clear_done, NULL);
E_COMP_COMP_HOOK_APPEND(hwc_window_comp_object_hooks, E_COMP_OBJECT_HOOK_RENDER_UPDATE_LOCK_SET,
hwc_window->restriction |= restriction;
+ e_hwc_windows_changed_set(hwc_window->hwc, E_HWC_WINS_CHANGED_WIN_RESTRICTION);
+
EHWTRACE("restriction set:0x%x", hwc_window->ec, hwc_window->hwc, hwc_window, restriction);
}
hwc_window->restriction &= ~restriction;
+ e_hwc_windows_changed_set(hwc_window->hwc, E_HWC_WINS_CHANGED_WIN_RESTRICTION);
+
EHWTRACE("restriction unset:0x%x", hwc_window->ec, hwc_window->hwc, hwc_window, restriction);
}
hwc_window->ec, hwc_window->hwc, hwc_window,
prop->name, (unsigned int)value.u32,
e_hwc_window_name_get(hwc_window));
+
+ e_hwc_window_changed_set(hwc_window, E_HWC_WINS_CHANGED_WIN_PROPERTY);
}
return EINA_TRUE;
hwc_window->visible_skip = set;
+ e_hwc_window_changed_set(hwc_window, E_HWC_WINS_CHANGED_WIN_VISIBLE);
+
+ return EINA_TRUE;
+}
+
+EINTERN void
+e_hwc_window_changed_set(E_Hwc_Window *hwc_window, E_Hwc_Wins_Changed changed)
+{
+ EINA_SAFETY_ON_NULL_RETURN(hwc_window);
+ EINA_SAFETY_ON_NULL_RETURN(hwc_window->hwc);
+
+ e_hwc_windows_changed_set(hwc_window->hwc, changed);
+
+ if (hwc_window->changed & changed) return;
+
+ if (!hwc_window->changed)
+ {
+ hwc_window->hwc->changed_windows = eina_list_append(hwc_window->hwc->changed_windows, hwc_window);
+ e_hwc_window_ref(hwc_window);
+ }
+
+ hwc_window->changed |= changed;
+
+ EHWTRACE("changed set:0x%x", hwc_window->ec, hwc_window->hwc, hwc_window, changed);
+}
+
+EINTERN Eina_Bool
+e_hwc_window_changed_get(E_Hwc_Window *hwc_window)
+{
+ EINA_SAFETY_ON_NULL_RETURN_VAL(hwc_window, EINA_FALSE);
+
+ return hwc_window->changed;
+}
+
+EINTERN void
+e_hwc_window_changed_clear(E_Hwc_Window *hwc_window)
+{
+ EINA_SAFETY_ON_NULL_RETURN(hwc_window);
+
+ if (hwc_window->changed == E_HWC_WINS_CHANGED_NONE)
+ return;
+
+ hwc_window->changed = E_HWC_WINS_CHANGED_NONE;
+}
+
+EINTERN Eina_Bool
+e_hwc_window_client_geometry_visible_get(E_Hwc_Window *hwc_window)
+{
+ E_Client *ec;
+ int x, y, w, h;
+ int ee_w, ee_h;
+ int x1, x2, y1, y2;
+ E_Map *map;
+
+ EINA_SAFETY_ON_NULL_RETURN_VAL(hwc_window, EINA_FALSE);
+
+ ec = hwc_window->ec;
+ if (!ec) return EINA_FALSE;
+
+ ecore_evas_geometry_get(e_comp->ee, NULL, NULL, &ee_w, &ee_h);
+ evas_object_geometry_get(ec->frame, &x, &y, &w, &h);
+
+ if ((ec->is_cursor) && (evas_object_map_enable_get(ec->frame)))
+ {
+ map = e_client_map_get(ec);
+ if (map)
+ {
+ e_map_point_coord_get(map, 0, &x1, &y1, NULL);
+ e_map_point_coord_get(map, 2, &x2, &y2, NULL);
+
+ x = MIN(x1, x2);
+ y = MIN(y1, y2);
+ w = MAX(x1, x2) - x;
+ h = MAX(y1, y2) - y;
+
+ e_map_free(map);
+ }
+ }
+
+ if (!E_INTERSECTS(0, 0, ee_w, ee_h, x, y, w, h))
+ return EINA_FALSE;
+
return EINA_TRUE;
}
E_Zone *zone;
Evas_Object *o;
int ee_w, ee_h;
- int x, y, w, h, x1, x2, y1, y2;
+ int x, y, w, h;
int ui_skip = EINA_FALSE;
Eina_Bool effect_client;
Evas_Render_Op render_op;
- E_Map *map;
Eina_Bool qps_visible;
ecore_evas_geometry_get(e_comp->ee, NULL, NULL, &ee_w, &ee_h);
e_client_geometry_get(ec, &x, &y, &w, &h);
- if ((ec->is_cursor) && (evas_object_map_enable_get(ec->frame)))
- {
- map = e_client_map_get(ec);
- if (map)
- {
- e_map_point_coord_get(map, 0, &x1, &y1, NULL);
- e_map_point_coord_get(map, 2, &x2, &y2, NULL);
-
- x = MIN(x1, x2);
- y = MIN(y1, y2);
- w = MAX(x1, x2) - x;
- h = MAX(y1, y2) - y;
-
- e_map_free(map);
- }
- }
-
if ((!effect_client) && (!e_comp_object_color_visible_get(ec->frame)))
{
e_hwc_window_state_set(hwc_window, E_HWC_WINDOW_STATE_NONE, EINA_TRUE);
}
// check geometry if located out of screen such as quick panel
- if (!E_INTERSECTS(0, 0, ee_w, ee_h, x, y, w, h))
+ if (!e_hwc_window_client_geometry_visible_get(hwc_window))
{
e_hwc_window_state_set(hwc_window, E_HWC_WINDOW_STATE_NONE, EINA_TRUE);
continue;
if (eina_list_count(hwc->visible_windows))
{
EINA_LIST_FREE(hwc->visible_windows, hwc_window)
- e_hwc_window_unref(hwc_window);
+ {
+ hwc_window->hwc_visible = EINA_FALSE;
+ e_hwc_window_unref(hwc_window);
+ }
}
/* store the current visible windows and the number of them */
EINA_LIST_REVERSE_FOREACH(hwc->visible_windows, l, hwc_window)
{
/* assign zpos */
+ hwc_window->hwc_visible = EINA_TRUE;
e_hwc_window_zpos_set(hwc_window, zpos++);
e_hwc_window_ref(hwc_window);
}
{
E_Hwc_Window *hwc_window;
Eina_Bool update_changes = EINA_FALSE;
- const Eina_List *l, *ll;
+ unsigned int changed;
+
+ changed = e_hwc_windows_changed_get(hwc);
+ if (changed)
+ update_changes = EINA_TRUE;
- if (hwc->property_changed)
+ if (changed & E_HWC_WINS_CHANGED_WIN_VISIBLE)
{
- hwc->property_changed = EINA_FALSE;
- update_changes = EINA_TRUE;
+ if (_e_hwc_windows_visible_windows_update(hwc))
+ update_changes = EINA_TRUE;
}
- /* update the the visible windows */
- if (_e_hwc_windows_visible_windows_update(hwc))
- update_changes = EINA_TRUE;
-
- EINA_LIST_FOREACH_SAFE(hwc->hwc_windows, l, ll, hwc_window)
+ EINA_LIST_FREE(hwc->changed_windows, hwc_window)
{
- if (e_hwc_window_is_target(hwc_window)) continue;
+ if (changed & E_HWC_WINS_CHANGED_WIN_BUFFER)
+ {
+ if (e_hwc_window_buffer_fetch(hwc_window))
+ update_changes = EINA_TRUE;
+ }
- /* fetch the window buffer */
- if (e_hwc_window_buffer_fetch(hwc_window))
- update_changes = EINA_TRUE;
- else
+ if ((changed & E_HWC_WINS_CHANGED_WIN_BUFFER) ||
+ (changed & E_HWC_WINS_CHANGED_WIN_GEOMETRY))
{
- /* sometimes client add frame cb without buffer attach */
- if ((hwc_window->ec) &&
- (hwc_window->ec->pixmap) &&
- (e_pixmap_type_get(hwc_window->ec->pixmap) == E_PIXMAP_TYPE_WL) &&
- (hwc_window->accepted_state == E_HWC_WINDOW_STATE_DEVICE))
- e_pixmap_image_clear(hwc_window->ec->pixmap, 1);
+ if (e_hwc_window_info_update(hwc_window))
+ update_changes = EINA_TRUE;
}
- /* update the window's info */
- if (e_hwc_window_info_update(hwc_window))
- update_changes = EINA_TRUE;
+ if (changed & E_HWC_WINS_CHANGED_WIN_PROPERTY)
+ {
+ if (e_hwc_window_prop_update(hwc_window))
+ update_changes = EINA_TRUE;
+ }
- /* update the window's props */
- if (e_hwc_window_prop_update(hwc_window))
- update_changes = EINA_TRUE;
+ e_hwc_window_changed_clear(hwc_window);
+ e_hwc_window_unref(hwc_window);
}
if (hwc->primary_output)
_e_hwc_windows_visible_windows_states_update(hwc);
}
+ e_hwc_windows_changed_clear(hwc);
+
return update_changes;
}
}
EINTERN void
+e_hwc_windows_changed_set(E_Hwc *hwc, E_Hwc_Wins_Changed changed)
+{
+ EINA_SAFETY_ON_NULL_RETURN(hwc);
+
+ if (hwc->changed & changed) return;
+
+ hwc->changed |= changed;
+
+ EHWSTRACE("changed set:0x%x", NULL, hwc, changed);
+}
+
+EINTERN Eina_Bool
+e_hwc_windows_changed_get(E_Hwc *hwc)
+{
+ EINA_SAFETY_ON_NULL_RETURN_VAL(hwc, EINA_FALSE);
+
+ return hwc->changed;
+}
+
+EINTERN void
+e_hwc_windows_changed_clear(E_Hwc *hwc)
+{
+ EINA_SAFETY_ON_NULL_RETURN(hwc);
+
+ if (hwc->changed == E_HWC_WINS_CHANGED_NONE)
+ return;
+
+ hwc->changed = E_HWC_WINS_CHANGED_NONE;
+}
+
+EINTERN void
e_hwc_windows_comp_override_set(E_Hwc *hwc, Eina_Bool set)
{
EINA_SAFETY_ON_NULL_RETURN(hwc);
hwc->restriction |= restriction;
+ e_hwc_windows_changed_set(hwc, E_HWC_WINS_CHANGED_RISTRICTION);
+
EHWSTRACE("restriction set:0x%x", NULL, hwc, restriction);
}
hwc->restriction &= ~restriction;
+ e_hwc_windows_changed_set(hwc, E_HWC_WINS_CHANGED_RISTRICTION);
+
EHWSTRACE("restriction set:0x%x", NULL, hwc, restriction);
}