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);
}