static void
photos_dlna_renderers_dialog_init (PhotosDlnaRenderersDialog *self)
{
  PhotosDlnaRenderersDialogPrivate *priv;
  GList *renderers;

  self->priv = photos_dlna_renderers_dialog_get_instance_private (self);
  priv = self->priv;

  priv->item_mngr = photos_item_manager_dup_singleton ();
  priv->renderers_mngr = photos_dlna_renderers_manager_dup_singleton ();
  priv->remote_mngr = photos_remote_display_manager_dup_singleton ();
  priv->mode_cntrlr = photos_mode_controller_dup_singleton ();

  gtk_widget_init_template (GTK_WIDGET (self));

  gtk_list_box_set_header_func (priv->listbox, photos_dlna_renderers_separator_cb, NULL, NULL);

  renderers = photos_dlna_renderers_manager_dup_renderers (priv->renderers_mngr);

  while (renderers != NULL)
    {
      PhotosDlnaRenderer *renderer = PHOTOS_DLNA_RENDERER (renderers->data);

      photos_dlna_renderers_dialog_add_renderer (self, renderer);
      renderers = g_list_delete_link (renderers, renderers);
    }

  g_signal_connect (self, "response", G_CALLBACK (gtk_widget_destroy), NULL);
}
static void
photos_dlna_renderers_dialog_init (PhotosDlnaRenderersDialog *self)
{
  GApplication *app;
  GList *renderers;
  PhotosSearchContextState *state;

  app = g_application_get_default ();
  state = photos_search_context_get_state (PHOTOS_SEARCH_CONTEXT (app));

  self->item_mngr = g_object_ref (state->item_mngr);
  self->renderers_mngr = photos_dlna_renderers_manager_dup_singleton ();
  self->remote_mngr = photos_remote_display_manager_dup_singleton ();
  self->mode_cntrlr = g_object_ref (state->mode_cntrlr);

  gtk_widget_init_template (GTK_WIDGET (self));

  gtk_list_box_set_header_func (self->listbox, photos_utils_list_box_header_func, NULL, NULL);

  renderers = photos_dlna_renderers_manager_dup_renderers (self->renderers_mngr);

  while (renderers != NULL)
    {
      PhotosDlnaRenderer *renderer = PHOTOS_DLNA_RENDERER (renderers->data);

      photos_dlna_renderers_dialog_add_renderer (self, renderer);
      renderers = g_list_delete_link (renderers, renderers);
      g_object_unref (renderer);
    }

  g_signal_connect (self, "response", G_CALLBACK (gtk_widget_destroy), NULL);
}
static void
photos_dlna_renderers_manager_renderer_lost_cb (PhotosDlnaRenderersManager *self,
                                                const gchar                *object_path,
                                                gpointer                   *data)
{
  PhotosDlnaRenderersManagerPrivate *priv = self->priv;
  PhotosDlnaRenderer *renderer;

  renderer = PHOTOS_DLNA_RENDERER (g_hash_table_lookup (priv->renderers, object_path));
  g_return_if_fail (renderer != NULL);

  g_hash_table_steal (priv->renderers, object_path);
  g_debug ("%s '%s' %s %s", G_STRFUNC,
           photos_dlna_renderer_get_friendly_name (renderer),
           photos_dlna_renderer_get_udn (renderer),
           object_path);
  g_signal_emit (self, signals[RENDERER_LOST], 0, renderer);
  g_object_unref (renderer);
}
static void
photos_dlna_renderers_dialog_set_icon_cb (GObject      *source_object,
                                          GAsyncResult *res,
                                          gpointer      user_data)
{
  GdkPixbuf *pixbuf;
  GtkImage *image = GTK_IMAGE (user_data);
  PhotosDlnaRenderer *renderer = PHOTOS_DLNA_RENDERER (source_object);
  GError *error = NULL;

  pixbuf = photos_dlna_renderer_get_icon_finish (renderer, res, &error);
  if (error != NULL)
    {
      g_warning ("Unable to load renderer icon: %s", error->message);
      g_error_free (error);
      goto out;
    }

  gtk_image_set_from_pixbuf (image, pixbuf);

out:
  /* release the ref we took before the async call */
  g_object_unref (image);
}