window-props: Don't make another round-trip to fetch the opaque region

We already have the property value from our property fetching.
This commit is contained in:
Jasper St. Pierre 2014-07-13 22:51:25 -04:00
parent 799de4f0f4
commit 39357fc242
3 changed files with 61 additions and 72 deletions

View File

@ -607,12 +607,72 @@ reload_wm_name (MetaWindow *window,
} }
} }
static void
meta_window_set_opaque_region (MetaWindow *window,
cairo_region_t *region)
{
if (cairo_region_equal (window->opaque_region, region))
return;
g_clear_pointer (&window->opaque_region, cairo_region_destroy);
if (region != NULL)
window->opaque_region = cairo_region_reference (region);
meta_compositor_window_shape_changed (window->display->compositor, window);
}
static void static void
reload_opaque_region (MetaWindow *window, reload_opaque_region (MetaWindow *window,
MetaPropValue *value, MetaPropValue *value,
gboolean initial) gboolean initial)
{ {
meta_window_x11_update_opaque_region (window); cairo_region_t *opaque_region = NULL;
if (value->type != META_PROP_VALUE_INVALID)
{
gulong *region = value->v.cardinal_list.cardinals;
int nitems = value->v.cardinal_list.n_cardinals;
cairo_rectangle_int_t *rects;
int i, rect_index, nrects;
if (nitems % 4 != 0)
{
meta_verbose ("_NET_WM_OPAQUE_REGION does not have a list of 4-tuples.");
goto out;
}
/* empty region */
if (nitems == 0)
goto out;
nrects = nitems / 4;
rects = g_new (cairo_rectangle_int_t, nrects);
rect_index = 0;
i = 0;
while (i < nitems)
{
cairo_rectangle_int_t *rect = &rects[rect_index];
rect->x = region[i++];
rect->y = region[i++];
rect->width = region[i++];
rect->height = region[i++];
rect_index++;
}
opaque_region = cairo_region_create_rectangles (rects, nrects);
g_free (rects);
}
out:
meta_window_set_opaque_region (window, opaque_region);
cairo_region_destroy (opaque_region);
} }
static void static void

View File

@ -1585,76 +1585,6 @@ meta_window_x11_set_net_wm_state (MetaWindow *window)
} }
} }
static void
meta_window_set_opaque_region (MetaWindow *window,
cairo_region_t *region)
{
if (cairo_region_equal (window->opaque_region, region))
return;
g_clear_pointer (&window->opaque_region, cairo_region_destroy);
if (region != NULL)
window->opaque_region = cairo_region_reference (region);
meta_compositor_window_shape_changed (window->display->compositor, window);
}
void
meta_window_x11_update_opaque_region (MetaWindow *window)
{
cairo_region_t *opaque_region = NULL;
gulong *region = NULL;
int nitems;
if (meta_prop_get_cardinal_list (window->display,
window->xwindow,
window->display->atom__NET_WM_OPAQUE_REGION,
&region, &nitems))
{
cairo_rectangle_int_t *rects;
int i, rect_index, nrects;
if (nitems % 4 != 0)
{
meta_verbose ("_NET_WM_OPAQUE_REGION does not have a list of 4-tuples.");
goto out;
}
/* empty region */
if (nitems == 0)
goto out;
nrects = nitems / 4;
rects = g_new (cairo_rectangle_int_t, nrects);
rect_index = 0;
i = 0;
while (i < nitems)
{
cairo_rectangle_int_t *rect = &rects[rect_index];
rect->x = region[i++];
rect->y = region[i++];
rect->width = region[i++];
rect->height = region[i++];
rect_index++;
}
opaque_region = cairo_region_create_rectangles (rects, nrects);
g_free (rects);
}
out:
meta_XFree (region);
meta_window_set_opaque_region (window, opaque_region);
cairo_region_destroy (opaque_region);
}
static cairo_region_t * static cairo_region_t *
region_create_from_x_rectangles (const XRectangle *rects, region_create_from_x_rectangles (const XRectangle *rects,
int n_rects) int n_rects)

View File

@ -55,7 +55,6 @@ void meta_window_x11_destroy_sync_request_alarm (MetaWindow *window);
void meta_window_x11_update_sync_request_counter (MetaWindow *window, void meta_window_x11_update_sync_request_counter (MetaWindow *window,
gint64 new_counter_value); gint64 new_counter_value);
void meta_window_x11_update_opaque_region (MetaWindow *window);
void meta_window_x11_update_input_region (MetaWindow *window); void meta_window_x11_update_input_region (MetaWindow *window);
void meta_window_x11_update_shape_region (MetaWindow *window); void meta_window_x11_update_shape_region (MetaWindow *window);