static gboolean
locate_pointer_draw (GtkWidget      *widget,
                     cairo_t        *cr,
                     gpointer        user_data)
{
  CsdLocatePointerData *data = (CsdLocatePointerData *) user_data;

  if (gtk_cairo_should_draw_window (cr, data->window))
    locate_pointer_paint (data, cr, gtk_widget_is_composited (data->widget));

  return TRUE;
}
static void
update_shape (GsdLocatePointerData *data)
{
  cairo_t *cr;
  GdkBitmap *mask;

  mask = gdk_pixmap_new (data->window, WINDOW_SIZE, WINDOW_SIZE, 1);
  cr = gdk_cairo_create (mask);
  locate_pointer_paint (data, cr, FALSE);
  gdk_window_shape_combine_mask (data->window, mask, 0, 0);
  g_object_unref (mask);
  cairo_destroy (cr);
}
static gboolean
locate_pointer_expose (GtkWidget      *widget,
		       GdkEventExpose *event,
		       gpointer        user_data)
{
  GsdLocatePointerData *data = (GsdLocatePointerData *) user_data;
  cairo_t *cr;

  if (event->window != data->window)
    return FALSE;

  cr = gdk_cairo_create (data->window);
  locate_pointer_paint (data, cr, gtk_widget_is_composited (data->widget));
  cairo_destroy (cr);

  return TRUE;
}
static void
update_shape (CsdLocatePointerData *data)
{
  cairo_t *cr;
  cairo_region_t *region;
  cairo_surface_t *mask;

  mask = cairo_image_surface_create (CAIRO_FORMAT_A1, WINDOW_SIZE, WINDOW_SIZE);
  cr = cairo_create (mask);

  locate_pointer_paint (data, cr, FALSE);

  region = gdk_cairo_region_create_from_surface (mask);
  gdk_window_shape_combine_region (data->window, region, 0, 0);

  cairo_region_destroy (region);
  cairo_destroy (cr);
  cairo_surface_destroy (mask);
}