E_HWC_WINDOW_RESTRICTION_DESK_ZOOM,
E_HWC_WINDOW_RESTRICTION_BLEND_ALPHA,
E_HWC_WINDOW_RESTRICTION_BLEND_EQUATION,
+ E_HWC_WINDOW_RESTRICTION_ZONE,
} E_Hwc_Window_Restriction;
static Eina_Bool ehw_trace = EINA_FALSE;
}
static void
+_e_hwc_window_cb_zone_del(void *data, void *obj)
+{
+ E_Hwc_Window *hwc_window = (E_Hwc_Window *)data;
+
+ hwc_window->zone_delfn = NULL;
+ hwc_window->zone = NULL;
+}
+
+static void
+_e_hwc_window_zone_set(E_Hwc_Window *hwc_window, E_Zone *zone)
+{
+ if (hwc_window->zone == zone) return;
+
+ if (hwc_window->zone)
+ {
+ if (hwc_window->zone_delfn)
+ {
+ e_object_delfn_del(E_OBJECT(hwc_window->zone), hwc_window->zone_delfn);
+ hwc_window->zone_delfn = NULL;
+ }
+
+ hwc_window->zone = NULL;
+ }
+
+ if (zone)
+ {
+ hwc_window->zone_delfn = e_object_delfn_add(E_OBJECT(zone),
+ _e_hwc_window_cb_zone_del,
+ hwc_window);
+ hwc_window->zone = zone;
+ }
+}
+
+static void
_e_hwc_window_free(E_Hwc_Window *hwc_window)
{
E_Hwc *hwc;
NULL,
NULL);
+ _e_hwc_window_zone_set(hwc_window, NULL);
+
if (hwc_window->cursor_buffer_destroy_listener.notify)
{
wl_list_remove(&hwc_window->cursor_buffer_destroy_listener.link);
static void
_e_hwc_window_client_cb_del(void *data EINA_UNUSED, E_Client *ec)
{
+ E_Hwc_Window *hwc_window;
E_Output *output;
E_Zone *zone;
EINA_SAFETY_ON_NULL_RETURN(ec);
- zone = e_comp_zone_find_by_ec(ec);
+ if (!(hwc_window = ec->hwc_window)) return;
+
+ zone = hwc_window->zone;
EINA_SAFETY_ON_NULL_RETURN(zone);
EINA_SAFETY_ON_NULL_RETURN(zone->output_id);
if (e_hwc_policy_get(output->hwc) == E_HWC_POLICY_PLANES)
return;
- if (!ec->hwc_window) return;
- if (e_hwc_window_is_video(ec->hwc_window)) return;
+ if (e_hwc_window_is_video(hwc_window)) return;
- e_hwc_window_client_type_override(ec->hwc_window);
+ e_hwc_window_client_type_override(hwc_window);
}
static void
Eina_List *l;
E_Client *subc;
E_Hwc_Window_State state;
+ E_Hwc_Window *hwc_window;
EINA_SAFETY_ON_NULL_RETURN(ec);
- zone = e_comp_zone_find_by_ec(ec);
+ if (!(hwc_window = ec->hwc_window)) return;
+
+ zone = hwc_window->zone;
EINA_SAFETY_ON_NULL_RETURN(zone);
EINA_SAFETY_ON_NULL_RETURN(zone->output_id);
/* If an e_client belongs to the e_output managed by hwc_plane policy,
* there's no need to deal with hwc_windows. */
if (e_hwc_policy_get(output->hwc) == E_HWC_POLICY_PLANES) return;
- if (!ec->hwc_window) return;
if (!e_comp_wl_video_subsurface_has(ec) && !e_comp_wl_normal_subsurface_has(ec))
return;
static Eina_Bool
_e_hwc_window_client_cb_zone_set(void *data, int type, void *event)
{
- E_Event_Client *ev;
+ E_Event_Client_Zone_Set *ev;
E_Client *ec;
E_Zone *zone;
E_Output *output;
Eina_Bool is_video = EINA_FALSE;
ev = event;
- EINA_SAFETY_ON_NULL_GOTO(ev, end);
+ EINA_SAFETY_ON_NULL_RETURN_VAL(ev, ECORE_CALLBACK_PASS_ON);
ec = ev->ec;
- EINA_SAFETY_ON_NULL_GOTO(ec, end);
+ EINA_SAFETY_ON_NULL_RETURN_VAL(ec, ECORE_CALLBACK_PASS_ON);
- zone = e_comp_zone_find_by_ec(ec);
- EINA_SAFETY_ON_NULL_GOTO(zone, end);
- EINA_SAFETY_ON_NULL_GOTO(zone->output_id, end);
+ zone = ev->zone;
+ EINA_SAFETY_ON_NULL_RETURN_VAL(zone, ECORE_CALLBACK_PASS_ON);
+ EINA_SAFETY_ON_NULL_RETURN_VAL(zone->output_id, ECORE_CALLBACK_PASS_ON);
output = e_output_find(zone->output_id);
- EINA_SAFETY_ON_NULL_GOTO(output, end);
+ EINA_SAFETY_ON_NULL_RETURN_VAL(output, ECORE_CALLBACK_PASS_ON);
/* If an e_client belongs to the e_output managed by hwc_plane policy,
* there's no need to deal with hwc_windows. */
if (e_object_is_del(E_OBJECT(ec)))
return ECORE_CALLBACK_PASS_ON;
- if (ec->hwc_window)
+ hwc_window = ec->hwc_window;
+ if (hwc_window)
{
- if (ec->hwc_window->hwc == output->hwc) goto end;
+ if (hwc_window->hwc == output->hwc) goto done;
- is_video = e_hwc_window_is_video(ec->hwc_window);
- _e_hwc_window_del(ec->hwc_window);
+ is_video = e_hwc_window_is_video(hwc_window);
+ _e_hwc_window_del(hwc_window);
}
hwc_window = _e_hwc_window_new(output->hwc, ec, E_HWC_WINDOW_STATE_NONE);
- EINA_SAFETY_ON_NULL_GOTO(hwc_window, end);
+ EINA_SAFETY_ON_NULL_RETURN_VAL(hwc_window, ECORE_CALLBACK_PASS_ON);
if (is_video) e_hwc_window_video_set(hwc_window, is_video);
EHWINF("set on eout:%p, zone_id:%d",
ec, hwc_window->hwc, hwc_window, output, zone->id);
-end:
+done:
+ _e_hwc_window_zone_set(hwc_window, zone);
+
return ECORE_CALLBACK_PASS_ON;
}
EINA_SAFETY_ON_NULL_RETURN_VAL(ec, EINA_FALSE);
EINA_SAFETY_ON_TRUE_RETURN_VAL(e_object_is_del(E_OBJECT(ec)), EINA_FALSE);
- zone = e_comp_zone_find_by_ec(ec);
+ zone = hwc_window->zone;
EINA_SAFETY_ON_NULL_RETURN_VAL(zone, EINA_FALSE);
pointer = e_pointer_get(ec);
hwc = hwc_window->hwc;
EINA_SAFETY_ON_NULL_RETURN_VAL(hwc, EINA_FALSE);
- zone = e_comp_zone_find_by_ec(ec);
+ zone = hwc_window->zone;
EINA_SAFETY_ON_NULL_RETURN_VAL(zone, EINA_FALSE);
output = hwc->output;
hwc = hwc_window->hwc;
EINA_SAFETY_ON_NULL_RETURN_VAL(hwc, EINA_FALSE);
- zone = e_comp_zone_find_by_ec(ec);
+ zone = hwc_window->zone;
EINA_SAFETY_ON_NULL_RETURN_VAL(zone, EINA_FALSE);
if (!e_client_video_info_get(ec, &vinfo))
EINA_SAFETY_ON_NULL_RETURN_VAL(hwc_window, EINA_FALSE);
ec = hwc_window->ec;
- zone = e_comp_zone_find_by_ec(ec);
- EINA_SAFETY_ON_NULL_RETURN_VAL(zone, EINA_FALSE);
if ((hwc_window->is_deleted) || (!ec) || e_object_is_del(E_OBJECT(ec)))
{
goto finish;
}
+ zone = hwc_window->zone;
+ if (!zone)
+ {
+ restriction = E_HWC_WINDOW_RESTRICTION_ZONE;
+ available = EINA_FALSE;
+ goto finish;
+ }
+
eout = e_output_find(zone->output_id);
if (!eout)
{
return "blend alpha";
case E_HWC_WINDOW_RESTRICTION_BLEND_EQUATION:
return "blend equation";
+ case E_HWC_WINDOW_RESTRICTION_ZONE:
+ return "zone";
default:
return "UNKNOWN";
}