int
get_property_page (ThunarxProviderFactory* f,
		   GList *flist,
		   const char *class_name,
		   GtkWidget **pp,
		   char *title,
		   int tlen,
		   GtkWindow *win)
{
  GList *ps, *lp;

  ps = thunarx_provider_factory_list_providers(f, THUNARX_TYPE_PROPERTY_PAGE_PROVIDER);

  *pp = NULL;
  for (lp = ps; lp != NULL; lp = lp->next) {
    GList *pgs, *lpg;

    pgs = thunarx_property_page_provider_get_pages(lp->data, flist);
    for (lpg = pgs; lpg != NULL && *pp == NULL; lpg = lpg->next) {
      if (strncmp(class_name, G_OBJECT_TYPE_NAME(lpg->data), 256) == 0) {
	*pp = GTK_WIDGET(g_object_ref(lpg->data));
      }
    }

    g_list_foreach (pgs, (GFunc) g_object_ref_sink, NULL);
    g_list_foreach (pgs, (GFunc) g_object_unref, NULL);
    g_list_free (pgs);
  }

  g_list_foreach (ps, (GFunc) g_object_unref, NULL);
  g_list_free (ps);

  if (*pp != NULL)
    {
      if (g_list_length(flist) == 1)
	{
	  snprintf(title,
		   tlen,
		   "%s: %s",
		   gtk_label_get_text(GTK_LABEL(thunarx_property_page_get_label_widget(THUNARX_PROPERTY_PAGE(*pp)))),
		   thunarx_file_info_get_name(THUNARX_FILE_INFO(flist->data)));
      }
    else
      {
	snprintf(title,
		 tlen,
		 "%s",
		 gtk_label_get_text(GTK_LABEL(thunarx_property_page_get_label_widget(THUNARX_PROPERTY_PAGE(*pp)))));
      }

      /* Try to adjust some buttons to close the window on click */
      gtk_container_foreach (*pp, adjust_destroy, win);
    }

  return *pp != NULL;
}
static void
thunarx_property_page_destroy (GtkObject *object)
{
  ThunarxPropertyPage *property_page = THUNARX_PROPERTY_PAGE (object);

  /* destroy the label widget (if any) */
  if (G_LIKELY (property_page->priv->label_widget != NULL))
    {
      gtk_object_destroy (GTK_OBJECT (property_page->priv->label_widget));
      g_object_unref (G_OBJECT (property_page->priv->label_widget));
      property_page->priv->label_widget = NULL;
    }

  (*GTK_OBJECT_CLASS (thunarx_property_page_parent_class)->destroy) (object);
}
static void
thunarx_property_page_set_property (GObject      *object,
                                    guint         prop_id,
                                    const GValue *value,
                                    GParamSpec   *pspec)
{
  ThunarxPropertyPage *property_page = THUNARX_PROPERTY_PAGE (object);

  switch (prop_id)
    {
    case PROP_LABEL:
      thunarx_property_page_set_label (property_page, g_value_get_string (value));
      break;

    case PROP_LABEL_WIDGET:
      thunarx_property_page_set_label_widget (property_page, g_value_get_object (value));
      break;

    default:
      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
      break;
    }
}
static void
thunar_apr_desktop_page_file_changed (ThunarAprAbstractPage *abstract_page,
                                      ThunarxFileInfo       *file)
{
    ThunarAprDesktopPage *desktop_page = THUNAR_APR_DESKTOP_PAGE (abstract_page);
    GKeyFile             *key_file;
    gboolean              writable;
    gboolean              enabled;
    GError               *error = NULL;
    gchar                *filename;
    gchar                *value;
    gchar                *type;
    gchar                *uri;

    /* allocate the key file memory */
    key_file = g_key_file_new ();

    /* determine the local path to the file */
    uri = thunarx_file_info_get_uri (file);
    filename = g_filename_from_uri (uri, NULL, NULL);
    g_free (uri);

    /* try to load the file contents */
    if (filename != NULL && g_key_file_load_from_file (key_file, filename, G_KEY_FILE_NONE, NULL))
    {
        /* determine the type of the .desktop file (default to "Application") */
        type = g_key_file_get_string (key_file, G_KEY_FILE_DESKTOP_GROUP, "Type", NULL);
        if (G_UNLIKELY (type == NULL))
            type = g_strdup ("Application");

        /* change page title depending on the type */
        if (strcmp (type, "Application") == 0)
            thunarx_property_page_set_label (THUNARX_PROPERTY_PAGE (desktop_page), _("Launcher"));
        else if (strcmp (type, "Link") == 0)
            thunarx_property_page_set_label (THUNARX_PROPERTY_PAGE (desktop_page), _("Link"));
        else
            thunarx_property_page_set_label (THUNARX_PROPERTY_PAGE (desktop_page), type);

        /* update the "Description" entry */
        value = g_key_file_get_locale_string (key_file, G_KEY_FILE_DESKTOP_GROUP, "GenericName", NULL, NULL);
        if (!exo_str_is_equal (value, desktop_page->description_text))
        {
            /* update the entry */
            gtk_entry_set_text (GTK_ENTRY (desktop_page->description_entry), (value != NULL) ? value : "");

            /* update the saved value */
            g_free (desktop_page->description_text);
            desktop_page->description_text = value;
        }
        else
        {
            g_free (value);
        }

        /* update the "Comment" entry */
        value = g_key_file_get_locale_string (key_file, G_KEY_FILE_DESKTOP_GROUP, "Comment", NULL, NULL);
        if (!exo_str_is_equal (value, desktop_page->comment_text))
        {
            /* update the entry */
            gtk_entry_set_text (GTK_ENTRY (desktop_page->comment_entry), (value != NULL) ? value : "");

            /* update the saved value */
            g_free (desktop_page->comment_text);
            desktop_page->comment_text = value;
        }
        else
        {
            g_free (value);
        }

        /* update the type dependant entries */
        if (strcmp (type, "Application") == 0)
        {
            /* update the "Command" entry */
            value = g_key_file_get_string (key_file, G_KEY_FILE_DESKTOP_GROUP, "Exec", NULL);
            if (!exo_str_is_equal (value, desktop_page->command_text))
            {
                /* update the entry */
                gtk_entry_set_text (GTK_ENTRY (desktop_page->command_entry), (value != NULL) ? value : "");

                /* update the saved value */
                g_free (desktop_page->command_text);
                desktop_page->command_text = value;
            }
            else
            {
                g_free (value);
            }

            /* update the "Path" entry */
            value = g_key_file_get_string (key_file, G_KEY_FILE_DESKTOP_GROUP, "Path", NULL);
            if (!exo_str_is_equal (value, desktop_page->path_text))
            {
                /* update the entry */
                gtk_entry_set_text (GTK_ENTRY (desktop_page->path_entry), (value != NULL) ? value : "");

                /* update the saved value */
                g_free (desktop_page->path_text);
                desktop_page->path_text = value;
            }
            else
            {
                g_free (value);
            }

            /* update the "Use startup notification" button */
            enabled = g_key_file_get_boolean (key_file, G_KEY_FILE_DESKTOP_GROUP, "StartupNotify", &error);
            g_signal_handlers_block_by_func (G_OBJECT (desktop_page->snotify_button), thunar_apr_desktop_page_toggled, desktop_page);
            gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (desktop_page->snotify_button), (error == NULL && enabled));
            g_signal_handlers_unblock_by_func (G_OBJECT (desktop_page->snotify_button), thunar_apr_desktop_page_toggled, desktop_page);
            g_clear_error (&error);

            /* update the "Run in terminal" button */
            enabled = g_key_file_get_boolean (key_file, G_KEY_FILE_DESKTOP_GROUP, "Terminal", &error);
            g_signal_handlers_block_by_func (G_OBJECT (desktop_page->terminal_button), thunar_apr_desktop_page_toggled, desktop_page);
            gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (desktop_page->terminal_button), (error == NULL && enabled));
            g_signal_handlers_unblock_by_func (G_OBJECT (desktop_page->terminal_button), thunar_apr_desktop_page_toggled, desktop_page);
            g_clear_error (&error);

            /* update visibility of the specific widgets */
            gtk_widget_show (desktop_page->command_entry);
            gtk_widget_show (desktop_page->path_entry);
            gtk_widget_hide (desktop_page->url_entry);
            gtk_widget_show (desktop_page->snotify_button);
            gtk_widget_show (desktop_page->terminal_button);
        }
        else if (strcmp (type, "Link") == 0)
        {
            /* update the "URL" entry */
            value = g_key_file_get_string (key_file, G_KEY_FILE_DESKTOP_GROUP, "URL", NULL);
            if (!exo_str_is_equal (value, desktop_page->url_text))
            {
                /* update the entry */
                gtk_entry_set_text (GTK_ENTRY (desktop_page->url_entry), (value != NULL) ? value : "");

                /* update the saved value */
                g_free (desktop_page->url_text);
                desktop_page->url_text = value;
            }
            else
            {
                g_free (value);
            }

            /* update visibility of the specific widgets */
            gtk_widget_hide (desktop_page->command_entry);
            gtk_widget_hide (desktop_page->path_entry);
            gtk_widget_show (desktop_page->url_entry);
            gtk_widget_hide (desktop_page->snotify_button);
            gtk_widget_hide (desktop_page->terminal_button);
        }
        else
        {
            /* hide the specific widgets */
            gtk_widget_hide (desktop_page->command_entry);
            gtk_widget_hide (desktop_page->path_entry);
            gtk_widget_hide (desktop_page->url_entry);
            gtk_widget_hide (desktop_page->snotify_button);
            gtk_widget_hide (desktop_page->terminal_button);
        }

        /* check if the file is writable... */
        writable = (g_access (filename, W_OK) == 0);

        /* ...and update the editability of the entries */
        gtk_editable_set_editable (GTK_EDITABLE (desktop_page->description_entry), writable);
        gtk_editable_set_editable (GTK_EDITABLE (desktop_page->command_entry), writable);
        gtk_editable_set_editable (GTK_EDITABLE (desktop_page->path_entry), writable);
        gtk_editable_set_editable (GTK_EDITABLE (desktop_page->url_entry), writable);
        gtk_editable_set_editable (GTK_EDITABLE (desktop_page->comment_entry), writable);
        gtk_widget_set_sensitive (desktop_page->snotify_button, writable);
        gtk_widget_set_sensitive (desktop_page->terminal_button, writable);

        /* cleanup */
        g_free (type);
    }
    else
    {
        /* reset page title */
        thunarx_property_page_set_label (THUNARX_PROPERTY_PAGE (desktop_page), _("Unknown"));

        /* hide all widgets */
        gtk_widget_hide (desktop_page->description_entry);
        gtk_widget_hide (desktop_page->command_entry);
        gtk_widget_hide (desktop_page->path_entry);
        gtk_widget_hide (desktop_page->url_entry);
        gtk_widget_hide (desktop_page->comment_entry);
        gtk_widget_hide (desktop_page->snotify_button);
        gtk_widget_hide (desktop_page->terminal_button);
    }

    /* cleanup */
    g_key_file_free (key_file);
    g_free (filename);
}