diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 4a2aeed1b..86e6b27d6 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -31,7 +31,6 @@ variables: gnome-desktop3-devel gnome-online-accounts-devel gnome-settings-daemon-devel - grilo-devel gsettings-desktop-schemas-devel gsound-devel gtk3-devel ibus-devel diff --git a/build-aux/flatpak/org.gnome.Settings.json b/build-aux/flatpak/org.gnome.Settings.json index 3e19894b0..b64b4c2fd 100644 --- a/build-aux/flatpak/org.gnome.Settings.json +++ b/build-aux/flatpak/org.gnome.Settings.json @@ -485,23 +485,6 @@ } ] }, - { - "name" : "grilo", - "buildsystem" : "meson", - "config-opts" : [ - "-Denable-grl-pls=false", - "-Denable-gtk-doc=false", - "-Denable-introspection=false", - "-Denable-test-ui=false", - "-Denable-vala=false" - ], - "sources" : [ - { - "type" : "git", - "url" : "https://gitlab.gnome.org/GNOME/grilo.git" - } - ] - }, { "name" : "openldap", "buildsystem" : "autotools", diff --git a/panels/background/bg-pictures-source.c b/panels/background/bg-pictures-source.c deleted file mode 100644 index 3a3027b13..000000000 --- a/panels/background/bg-pictures-source.c +++ /dev/null @@ -1,855 +0,0 @@ -/* bg-pictures-source.c */ -/* - * Copyright (C) 2010 Intel, Inc - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, see . - * - * Author: Thomas Wood - * - */ - -#include - -#include "bg-pictures-source.h" - -#include "cc-background-grilo-miner.h" -#include "cc-background-item.h" - -#include -#include -#include -#include -#include -#include - -#define ATTRIBUTES G_FILE_ATTRIBUTE_STANDARD_NAME "," \ - G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE "," \ - G_FILE_ATTRIBUTE_TIME_MODIFIED - -struct _BgPicturesSource -{ - BgSource parent_instance; - - GCancellable *cancellable; - - CcBackgroundGriloMiner *grl_miner; - - GFileMonitor *picture_dir_monitor; - GFileMonitor *cache_dir_monitor; - - GHashTable *known_items; -}; - -G_DEFINE_TYPE (BgPicturesSource, bg_pictures_source, BG_TYPE_SOURCE) - -const char * const content_types[] = { - "image/png", - "image/jp2", - "image/jpeg", - "image/bmp", - "image/svg+xml", - "image/x-portable-anymap", - NULL -}; - -const char * const screenshot_types[] = { - "image/png", - NULL -}; - -static char *bg_pictures_source_get_unique_filename (const char *uri); - -static void picture_opened_for_read (GObject *source_object, GAsyncResult *res, gpointer user_data); - -static void -bg_pictures_source_dispose (GObject *object) -{ - BgPicturesSource *source = BG_PICTURES_SOURCE (object); - - if (source->cancellable) - { - g_cancellable_cancel (source->cancellable); - g_clear_object (&source->cancellable); - } - - g_clear_object (&source->grl_miner); - - G_OBJECT_CLASS (bg_pictures_source_parent_class)->dispose (object); -} - -static void -bg_pictures_source_finalize (GObject *object) -{ - BgPicturesSource *bg_source = BG_PICTURES_SOURCE (object); - - g_clear_pointer (&bg_source->known_items, g_hash_table_destroy); - - g_clear_object (&bg_source->picture_dir_monitor); - g_clear_object (&bg_source->cache_dir_monitor); - - G_OBJECT_CLASS (bg_pictures_source_parent_class)->finalize (object); -} - -static void -bg_pictures_source_class_init (BgPicturesSourceClass *klass) -{ - GObjectClass *object_class = G_OBJECT_CLASS (klass); - - object_class->dispose = bg_pictures_source_dispose; - object_class->finalize = bg_pictures_source_finalize; -} - -static void -remove_placeholder (BgPicturesSource *bg_source, - CcBackgroundItem *item) -{ - GListStore *store; - guint i; - - store = bg_source_get_liststore (BG_SOURCE (bg_source)); - - for (i = 0; i < g_list_model_get_n_items (G_LIST_MODEL (store)); i++) - { - g_autoptr(CcBackgroundItem) item_n = NULL; - - item_n = g_list_model_get_item (G_LIST_MODEL (store), i); - - if (item_n == item) - { - g_list_store_remove (store, i); - break; - } - } -} - -static gboolean -picture_needs_rotation (GdkPixbuf *pixbuf) -{ - const gchar *str; - - str = gdk_pixbuf_get_option (pixbuf, "orientation"); - if (str == NULL) - return FALSE; - - if (*str == '5' || *str == '6' || *str == '7' || *str == '8') - return TRUE; - - return FALSE; -} - -static GdkPixbuf * -swap_rotated_pixbuf (GdkPixbuf *pixbuf) -{ - GdkPixbuf *tmp_pixbuf; - - tmp_pixbuf = gdk_pixbuf_apply_embedded_orientation (pixbuf); - if (tmp_pixbuf == NULL) - return pixbuf; - - g_object_unref (pixbuf); - return tmp_pixbuf; -} - -static int -sort_func (gconstpointer a, - gconstpointer b, - gpointer user_data) -{ - CcBackgroundItem *item_a; - CcBackgroundItem *item_b; - guint64 modified_a; - guint64 modified_b; - int retval; - - item_a = (CcBackgroundItem *) a; - item_b = (CcBackgroundItem *) b; - modified_a = cc_background_item_get_modified (item_a); - modified_b = cc_background_item_get_modified (item_b); - - retval = modified_b - modified_a; - - return retval; -} - -static void -picture_scaled (GObject *source_object, - GAsyncResult *res, - gpointer user_data) -{ - BgPicturesSource *bg_source; - CcBackgroundItem *item; - g_autoptr(GError) error = NULL; - g_autoptr(GdkPixbuf) pixbuf = NULL; - const char *software; - const char *uri; - GListStore *store; - cairo_surface_t *surface = NULL; - int scale_factor; - gboolean rotation_applied; - - item = g_object_get_data (source_object, "item"); - pixbuf = gdk_pixbuf_new_from_stream_finish (res, &error); - if (pixbuf == NULL) - { - if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) - { - g_warning ("Failed to load image: %s", error->message); - remove_placeholder (BG_PICTURES_SOURCE (user_data), item); - } - - return; - } - - /* since we were not cancelled, we can now cast user_data - * back to BgPicturesSource. - */ - bg_source = BG_PICTURES_SOURCE (user_data); - store = bg_source_get_liststore (BG_SOURCE (bg_source)); - uri = cc_background_item_get_uri (item); - if (uri == NULL) - uri = cc_background_item_get_source_url (item); - - /* Ignore screenshots */ - software = gdk_pixbuf_get_option (pixbuf, "tEXt::Software"); - if (software != NULL && - g_str_equal (software, "gnome-screenshot")) - { - g_debug ("Ignored URL '%s' as it's a screenshot from gnome-screenshot", uri); - remove_placeholder (BG_PICTURES_SOURCE (user_data), item); - return; - } - - /* Process embedded orientation */ - rotation_applied = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (item), "rotation-applied")); - - if (!rotation_applied && picture_needs_rotation (pixbuf)) - { - /* the width and height of pixbuf we requested are wrong for EXIF - * orientations 5, 6, 7 and 8. the file has to be reloaded. */ - g_autoptr(GFile) file = NULL; - - file = g_file_new_for_uri (uri); - g_object_set_data (G_OBJECT (item), "needs-rotation", GINT_TO_POINTER (TRUE)); - g_object_set_data_full (G_OBJECT (file), "item", g_object_ref (item), g_object_unref); - g_file_read_async (G_FILE (file), G_PRIORITY_DEFAULT, - bg_source->cancellable, - picture_opened_for_read, bg_source); - return; - } - - pixbuf = swap_rotated_pixbuf (pixbuf); - - scale_factor = bg_source_get_scale_factor (BG_SOURCE (bg_source)); - surface = gdk_cairo_surface_create_from_pixbuf (pixbuf, scale_factor, NULL); - cc_background_item_load (item, NULL); - - /* insert the item into the liststore */ - g_list_store_insert_sorted (store, item, sort_func, bg_source); - - g_hash_table_insert (bg_source->known_items, - bg_pictures_source_get_unique_filename (uri), - GINT_TO_POINTER (TRUE)); - - g_clear_pointer (&surface, cairo_surface_destroy); -} - -static void -picture_opened_for_read (GObject *source_object, - GAsyncResult *res, - gpointer user_data) -{ - BgPicturesSource *bg_source; - CcBackgroundItem *item; - g_autoptr(GFileInputStream) stream = NULL; - g_autoptr(GError) error = NULL; - gint thumbnail_height; - gint thumbnail_width; - gboolean needs_rotation; - - item = g_object_get_data (source_object, "item"); - stream = g_file_read_finish (G_FILE (source_object), res, &error); - if (stream == NULL) - { - if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) - { - g_autofree gchar *filename = g_file_get_path (G_FILE (source_object)); - g_warning ("Failed to load picture '%s': %s", filename, error->message); - remove_placeholder (BG_PICTURES_SOURCE (user_data), item); - } - - return; - } - - /* since we were not cancelled, we can now cast user_data - * back to BgPicturesSource. - */ - bg_source = BG_PICTURES_SOURCE (user_data); - - needs_rotation = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (item), "needs-rotation")); - if (needs_rotation) - { - /* swap width and height for EXIF orientations that need it */ - thumbnail_width = bg_source_get_thumbnail_height (BG_SOURCE (bg_source)); - thumbnail_height = bg_source_get_thumbnail_width (BG_SOURCE (bg_source)); - g_object_set_data (G_OBJECT (item), "rotation-applied", GINT_TO_POINTER (TRUE)); - } - else - { - thumbnail_width = bg_source_get_thumbnail_width (BG_SOURCE (bg_source)); - thumbnail_height = bg_source_get_thumbnail_height (BG_SOURCE (bg_source)); - } - - g_object_set_data_full (G_OBJECT (stream), "item", g_object_ref (item), g_object_unref); - gdk_pixbuf_new_from_stream_at_scale_async (G_INPUT_STREAM (stream), - thumbnail_width, thumbnail_height, - TRUE, - bg_source->cancellable, - picture_scaled, bg_source); -} - -static void -picture_copied_for_read (GObject *source_object, - GAsyncResult *res, - gpointer user_data) -{ - BgPicturesSource *bg_source; - CcBackgroundItem *item; - g_autoptr(GError) error = NULL; - GFile *thumbnail_file = G_FILE (source_object); - GFile *native_file; - - if (!g_file_copy_finish (thumbnail_file, res, &error)) - { - if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) - return; - else if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_EXISTS)) - { - g_autofree gchar *uri = NULL; - - uri = g_file_get_uri (thumbnail_file); - g_warning ("Failed to download '%s': %s", uri, error->message); - return; - } - } - - bg_source = BG_PICTURES_SOURCE (user_data); - - native_file = g_object_get_data (G_OBJECT (thumbnail_file), "native-file"); - item = g_object_get_data (G_OBJECT (thumbnail_file), "item"); - g_object_set_data_full (G_OBJECT (native_file), "item", g_object_ref (item), g_object_unref); - g_file_read_async (native_file, - G_PRIORITY_DEFAULT, - bg_source->cancellable, - picture_opened_for_read, - bg_source); -} - -static gboolean -in_content_types (const char *content_type) -{ - guint i; - for (i = 0; content_types[i]; i++) - if (g_str_equal (content_types[i], content_type)) - return TRUE; - return FALSE; -} - -static GFile * -bg_pictures_source_get_cache_file (void) -{ - g_autofree gchar *path = NULL; - GFile *file; - - path = bg_pictures_source_get_cache_path (); - file = g_file_new_for_path (path); - - return file; -} - -static gboolean -add_single_file (BgPicturesSource *bg_source, - GFile *file, - const gchar *content_type, - guint64 mtime) -{ - g_autoptr(CcBackgroundItem) item = NULL; - CcBackgroundItemFlags flags = 0; - g_autofree gchar *source_uri = NULL; - g_autofree gchar *uri = NULL; - gboolean needs_download; - gboolean retval = FALSE; - const gchar *pictures_path; - g_autoptr(GFile) pictures_dir = NULL; - g_autoptr(GFile) cache_dir = NULL; - GrlMedia *media; - - /* find png and jpeg files */ - if (!content_type) - goto out; - if (!in_content_types (content_type)) - goto out; - - /* create a new CcBackgroundItem */ - uri = g_file_get_uri (file); - - pictures_path = g_get_user_special_dir (G_USER_DIRECTORY_PICTURES); - if (pictures_path == NULL) - pictures_path = g_get_home_dir (); - pictures_dir = g_file_new_for_path (pictures_path); - cache_dir = bg_pictures_source_get_cache_file (); - needs_download = !g_file_has_parent (file, pictures_dir) && - !g_file_has_parent (file, cache_dir); - - if (!needs_download) - { - source_uri = g_strdup (uri); - flags |= CC_BACKGROUND_ITEM_HAS_URI; - } - else - { - source_uri = g_steal_pointer (&uri); - } - - item = cc_background_item_new (uri); - flags |= CC_BACKGROUND_ITEM_HAS_SHADING | CC_BACKGROUND_ITEM_HAS_PLACEMENT; - g_object_set (G_OBJECT (item), - "flags", flags, - "shading", G_DESKTOP_BACKGROUND_SHADING_SOLID, - "placement", G_DESKTOP_BACKGROUND_STYLE_ZOOM, - "modified", mtime, - "needs-download", needs_download, - "source-url", source_uri, - NULL); - - media = g_object_get_data (G_OBJECT (file), "grl-media"); - if (media == NULL) - { - g_object_set_data_full (G_OBJECT (file), "item", g_object_ref (item), g_object_unref); - g_file_read_async (file, G_PRIORITY_DEFAULT, - bg_source->cancellable, - picture_opened_for_read, bg_source); - } - else - { - g_autoptr(GFile) native_file = NULL; - g_autoptr(GFile) thumbnail_file = NULL; - g_autofree gchar *native_dir = NULL; - g_autofree gchar *native_path = NULL; - const gchar *title; - const gchar *thumbnail_uri; - - title = grl_media_get_title (media); - g_object_set (G_OBJECT (item), "name", title, NULL); - - thumbnail_uri = grl_media_get_thumbnail (media); - thumbnail_file = g_file_new_for_uri (thumbnail_uri); - - native_path = gnome_desktop_thumbnail_path_for_uri (source_uri, GNOME_DESKTOP_THUMBNAIL_SIZE_LARGE); - native_file = g_file_new_for_path (native_path); - - native_dir = g_path_get_dirname (native_path); - g_mkdir_with_parents (native_dir, USER_DIR_MODE); - - g_object_set_data_full (G_OBJECT (thumbnail_file), "item", g_object_ref (item), g_object_unref); - g_object_set_data_full (G_OBJECT (thumbnail_file), - "native-file", - g_object_ref (native_file), - g_object_unref); - g_file_copy_async (thumbnail_file, - native_file, - G_FILE_COPY_ALL_METADATA, - G_PRIORITY_DEFAULT, - bg_source->cancellable, - NULL, - NULL, - picture_copied_for_read, - bg_source); - } - - retval = TRUE; - - out: - return retval; -} - -static gboolean -add_single_file_from_info (BgPicturesSource *bg_source, - GFile *file, - GFileInfo *info) -{ - const gchar *content_type; - guint64 mtime; - - content_type = g_file_info_get_content_type (info); - mtime = g_file_info_get_attribute_uint64 (info, G_FILE_ATTRIBUTE_TIME_MODIFIED); - return add_single_file (bg_source, file, content_type, mtime); -} - -static gboolean -add_single_file_from_media (BgPicturesSource *bg_source, - GFile *file, - GrlMedia *media) -{ - GDateTime *mtime; - const gchar *content_type; - gint64 mtime_unix; - - content_type = grl_media_get_mime (media); - - /* only GRL_METADATA_KEY_CREATION_DATE is implemented in the Flickr - * plugin, GRL_METADATA_KEY_MODIFICATION_DATE is not - */ - mtime = grl_media_get_creation_date (media); - if (!mtime) - mtime = grl_media_get_modification_date (media); - if (mtime) - mtime_unix = g_date_time_to_unix (mtime); - else - mtime_unix = g_get_real_time () / G_USEC_PER_SEC; - - return add_single_file (bg_source, file, content_type, (guint64) mtime_unix); -} - -gboolean -bg_pictures_source_add (BgPicturesSource *bg_source, - const char *uri, - GtkTreeRowReference **ret_row_ref) -{ - g_autoptr(GFile) file = NULL; - GFileInfo *info; - gboolean retval; - - file = g_file_new_for_uri (uri); - info = g_file_query_info (file, ATTRIBUTES, G_FILE_QUERY_INFO_NONE, NULL, NULL); - if (info == NULL) - return FALSE; - - retval = add_single_file_from_info (bg_source, file, info); - - return retval; -} - -gboolean -bg_pictures_source_remove (BgPicturesSource *bg_source, - const char *uri) -{ - GListStore *store; - gboolean retval; - guint i; - - retval = FALSE; - store = bg_source_get_liststore (BG_SOURCE (bg_source)); - - for (i = 0; i < g_list_model_get_n_items (G_LIST_MODEL (store)); i++) - { - g_autoptr(CcBackgroundItem) tmp_item = NULL; - const char *tmp_uri; - - tmp_item = g_list_model_get_item (G_LIST_MODEL (store), i); - tmp_uri = cc_background_item_get_uri (tmp_item); - if (g_str_equal (tmp_uri, uri)) - { - char *uuid; - uuid = bg_pictures_source_get_unique_filename (uri); - g_hash_table_insert (bg_source->known_items, - uuid, NULL); - - g_list_store_remove (store, i); - retval = TRUE; - break; - } - } - return retval; -} - -static int -file_sort_func (gconstpointer a, - gconstpointer b) -{ - GFileInfo *file_a = G_FILE_INFO (a); - GFileInfo *file_b = G_FILE_INFO (b); - guint64 modified_a, modified_b; - - modified_a = g_file_info_get_attribute_uint64 (file_a, G_FILE_ATTRIBUTE_TIME_MODIFIED); - - modified_b = g_file_info_get_attribute_uint64 (file_b, G_FILE_ATTRIBUTE_TIME_MODIFIED); - - return modified_b - modified_a; -} - -static void -file_info_async_ready (GObject *source, - GAsyncResult *res, - gpointer user_data) -{ - BgPicturesSource *bg_source; - GList *files, *l; - g_autoptr(GError) err = NULL; - GFile *parent; - - files = g_file_enumerator_next_files_finish (G_FILE_ENUMERATOR (source), - res, - &err); - if (err) - { - if (!g_error_matches (err, G_IO_ERROR, G_IO_ERROR_CANCELLED)) - g_warning ("Could not get pictures file information: %s", err->message); - - g_list_foreach (files, (GFunc) g_object_unref, NULL); - g_list_free (files); - return; - } - - bg_source = BG_PICTURES_SOURCE (user_data); - - parent = g_file_enumerator_get_container (G_FILE_ENUMERATOR (source)); - - files = g_list_sort (files, file_sort_func); - - /* iterate over the available files */ - for (l = files; l; l = g_list_next (l)) - { - GFileInfo *info = l->data; - g_autoptr(GFile) file = NULL; - - file = g_file_get_child (parent, g_file_info_get_name (info)); - - add_single_file_from_info (bg_source, file, info); - } - - g_list_foreach (files, (GFunc) g_object_unref, NULL); - g_list_free (files); -} - -static void -dir_enum_async_ready (GObject *s, - GAsyncResult *res, - gpointer user_data) -{ - BgPicturesSource *source = (BgPicturesSource *) user_data; - g_autoptr(GFileEnumerator) enumerator = NULL; - g_autoptr(GError) err = NULL; - - enumerator = g_file_enumerate_children_finish (G_FILE (s), res, &err); - - if (err) - { - if (!g_error_matches (err, G_IO_ERROR, G_IO_ERROR_CANCELLED)) - g_warning ("Could not fill pictures source: %s", err->message); - return; - } - - /* get the files */ - g_file_enumerator_next_files_async (enumerator, - G_MAXINT, - G_PRIORITY_LOW, - source->cancellable, - file_info_async_ready, - user_data); -} - -char * -bg_pictures_source_get_cache_path (void) -{ - return g_build_filename (g_get_user_cache_dir (), - "gnome-control-center", - "backgrounds", - NULL); -} - -static char * -bg_pictures_source_get_unique_filename (const char *uri) -{ - g_autoptr(GChecksum) csum = NULL; - char *ret; - - csum = g_checksum_new (G_CHECKSUM_SHA256); - g_checksum_update (csum, (guchar *) uri, -1); - ret = g_strdup (g_checksum_get_string (csum)); - - return ret; -} - -char * -bg_pictures_source_get_unique_path (const char *uri) -{ - g_autoptr(GFile) parent = NULL; - g_autoptr(GFile) file = NULL; - g_autofree gchar *cache_path = NULL; - g_autofree gchar *filename = NULL; - - cache_path = bg_pictures_source_get_cache_path (); - parent = g_file_new_for_path (cache_path); - - filename = bg_pictures_source_get_unique_filename (uri); - file = g_file_get_child (parent, filename); - - return g_file_get_path (file); -} - -gboolean -bg_pictures_source_is_known (BgPicturesSource *bg_source, - const char *uri) -{ - g_autofree gchar *uuid = NULL; - - uuid = bg_pictures_source_get_unique_filename (uri); - - return GPOINTER_TO_INT (g_hash_table_lookup (bg_source->known_items, uuid)); -} - -static void -file_info_ready (GObject *object, - GAsyncResult *res, - gpointer user_data) -{ - GFileInfo *info; - GError *error = NULL; - GFile *file = G_FILE (object); - - info = g_file_query_info_finish (file, res, &error); - - if (!info) - { - if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) - g_warning ("Problem looking up file info: %s", error->message); - g_clear_error (&error); - return; - } - - add_single_file_from_info (BG_PICTURES_SOURCE (user_data), file, info); -} - -static void -file_added (GFile *file, - BgPicturesSource *self) -{ - g_autofree gchar *uri = NULL; - uri = g_file_get_uri (file); - - if (!bg_pictures_source_is_known (self, uri)) - { - g_file_query_info_async (file, - ATTRIBUTES, - G_FILE_QUERY_INFO_NONE, - G_PRIORITY_LOW, - NULL, - file_info_ready, - self); - } -} - -static void -files_changed_cb (BgPicturesSource *self, - GFile *file, - GFile *other_file, - GFileMonitorEvent event_type) -{ - g_autofree gchar *uri = NULL; - - switch (event_type) - { - case G_FILE_MONITOR_EVENT_CHANGES_DONE_HINT: - file_added (file, self); - break; - - case G_FILE_MONITOR_EVENT_DELETED: - uri = g_file_get_uri (file); - bg_pictures_source_remove (self, uri); - break; - - default: - return; - } -} - -static GFileMonitor * -monitor_path (BgPicturesSource *self, - const char *path) -{ - GFileMonitor *monitor; - g_autoptr(GFile) dir = NULL; - - g_mkdir_with_parents (path, USER_DIR_MODE); - - dir = g_file_new_for_path (path); - g_file_enumerate_children_async (dir, - ATTRIBUTES, - G_FILE_QUERY_INFO_NONE, - G_PRIORITY_LOW, self->cancellable, - dir_enum_async_ready, self); - - monitor = g_file_monitor_directory (dir, - G_FILE_MONITOR_NONE, - self->cancellable, - NULL); - - if (monitor) - g_signal_connect_object (monitor, - "changed", - G_CALLBACK (files_changed_cb), - self, G_CONNECT_SWAPPED); - - return monitor; -} - -static void -media_found_cb (BgPicturesSource *self, GrlMedia *media) -{ - g_autoptr(GFile) file = NULL; - const gchar *uri; - - uri = grl_media_get_url (media); - file = g_file_new_for_uri (uri); - g_object_set_data_full (G_OBJECT (file), "grl-media", g_object_ref (media), g_object_unref); - add_single_file_from_media (self, file, media); -} - -static void -bg_pictures_source_init (BgPicturesSource *self) -{ - const gchar *pictures_path; - g_autofree gchar *cache_path = NULL; - - self->cancellable = g_cancellable_new (); - self->known_items = g_hash_table_new_full (g_str_hash, - g_str_equal, - (GDestroyNotify) g_free, - NULL); - - pictures_path = g_get_user_special_dir (G_USER_DIRECTORY_PICTURES); - if (pictures_path == NULL) - pictures_path = g_get_home_dir (); - - self->picture_dir_monitor = monitor_path (self, pictures_path); - - cache_path = bg_pictures_source_get_cache_path (); - self->cache_dir_monitor = monitor_path (self, cache_path); - - self->grl_miner = cc_background_grilo_miner_new (); - g_signal_connect_object (self->grl_miner, "media-found", G_CALLBACK (media_found_cb), self, G_CONNECT_SWAPPED); - cc_background_grilo_miner_start (self->grl_miner); -} - -BgPicturesSource * -bg_pictures_source_new (GtkWidget *widget) -{ - return g_object_new (BG_TYPE_PICTURES_SOURCE, "widget", widget, NULL); -} - -const char * const * -bg_pictures_get_support_content_types (void) -{ - return content_types; -} diff --git a/panels/background/bg-pictures-source.h b/panels/background/bg-pictures-source.h deleted file mode 100644 index f62cbe532..000000000 --- a/panels/background/bg-pictures-source.h +++ /dev/null @@ -1,46 +0,0 @@ -/* bg-pictures-source.h */ -/* - * Copyright (C) 2010 Intel, Inc - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, see . - * - * Author: Thomas Wood - * - */ - -#pragma once - -#include -#include "bg-source.h" -#include "cc-background-item.h" - -G_BEGIN_DECLS - -#define BG_TYPE_PICTURES_SOURCE (bg_pictures_source_get_type ()) -G_DECLARE_FINAL_TYPE (BgPicturesSource, bg_pictures_source, BG, PICTURES_SOURCE, BgSource) - -BgPicturesSource *bg_pictures_source_new (GtkWidget *widget); -char *bg_pictures_source_get_cache_path (void); -char *bg_pictures_source_get_unique_path(const char *uri); -gboolean bg_pictures_source_add (BgPicturesSource *bg_source, - const char *uri, - GtkTreeRowReference **ret_row_ref); -gboolean bg_pictures_source_remove (BgPicturesSource *bg_source, - const char *uri); -gboolean bg_pictures_source_is_known (BgPicturesSource *bg_source, - const char *uri); - -const char * const * bg_pictures_get_support_content_types (void); - -G_END_DECLS diff --git a/panels/background/cc-background-chooser.c b/panels/background/cc-background-chooser.c index 6c8f56136..04fd85c47 100644 --- a/panels/background/cc-background-chooser.c +++ b/panels/background/cc-background-chooser.c @@ -25,7 +25,6 @@ #include #include "bg-colors-source.h" -#include "bg-pictures-source.h" #include "bg-recent-source.h" #include "bg-wallpapers-source.h" #include "cc-background-chooser.h" diff --git a/panels/background/cc-background-grilo-miner.c b/panels/background/cc-background-grilo-miner.c deleted file mode 100644 index 85c09daf6..000000000 --- a/panels/background/cc-background-grilo-miner.c +++ /dev/null @@ -1,315 +0,0 @@ -/* - * Copyright (C) 2014 Red Hat, Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, see . - */ - -#include - -#include -#include - -#define GOA_API_IS_SUBJECT_TO_CHANGE -#include - -#include "bg-pictures-source.h" -#include "cc-background-grilo-miner.h" - -struct _CcBackgroundGriloMiner -{ - GObject parent_instance; - - GCancellable *cancellable; - GList *accounts; -}; - -G_DEFINE_TYPE (CcBackgroundGriloMiner, cc_background_grilo_miner, G_TYPE_OBJECT) - -enum -{ - MEDIA_FOUND, - LAST_SIGNAL -}; - -static guint signals[LAST_SIGNAL] = { 0 }; - -#define REMOTE_ITEM_COUNT 50 - -static gchar * -get_grilo_id (GoaObject *goa_object) -{ - GoaAccount *account; - - account = goa_object_peek_account (goa_object); - return g_strdup_printf ("grl-flickr-%s", goa_account_get_id (account)); -} - -static void -is_online_data_cached (GObject *object, - GAsyncResult *res, - gpointer user_data) -{ - CcBackgroundGriloMiner *self; - GError *error = NULL; - GFileInfo *info = NULL; - GFile *cache_file = G_FILE (object); - GrlMedia *media; - const gchar *uri; - - info = g_file_query_info_finish (cache_file, res, &error); - if (info == NULL) - { - if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) - goto out; - } - - self = CC_BACKGROUND_GRILO_MINER (user_data); - - media = g_object_get_data (G_OBJECT (cache_file), "grl-media"); - uri = grl_media_get_url (media); - - if (info != NULL) - { - g_debug ("Ignored URL '%s' as it is already in the cache", uri); - goto out; - } - - g_signal_emit (self, signals[MEDIA_FOUND], 0, media); - - out: - g_clear_object (&info); - g_clear_error (&error); -} - -static void -searched_online_source (GrlSource *source, - guint operation_id, - GrlMedia *media, - guint remaining, - gpointer user_data, - const GError *error) -{ - CcBackgroundGriloMiner *self = CC_BACKGROUND_GRILO_MINER (user_data); - g_autoptr(GFile) cache_file = NULL; - const gchar *uri; - g_autofree gchar *cache_path = NULL; - - if (error != NULL) - { - const gchar *source_id; - - source_id = grl_source_get_id (source); - g_warning ("Error searching %s: %s", source_id, error->message); - grl_operation_cancel (operation_id); - remaining = 0; - goto out; - } - - uri = grl_media_get_url (media); - cache_path = bg_pictures_source_get_unique_path (uri); - cache_file = g_file_new_for_path (cache_path); - g_object_set_data_full (G_OBJECT (cache_file), "grl-media", media, g_object_unref); - g_file_query_info_async (cache_file, - G_FILE_ATTRIBUTE_STANDARD_TYPE, - G_FILE_QUERY_INFO_NONE, - G_PRIORITY_DEFAULT, - self->cancellable, - is_online_data_cached, - self); - - out: - if (remaining == 0) - g_object_unref (self); -} - -static void -query_online_source (CcBackgroundGriloMiner *self, GrlSource *source) -{ - const GList *keys; - GrlCaps *caps; - GrlOperationOptions *options; - - keys = grl_source_supported_keys (source); - caps = grl_source_get_caps (source, GRL_OP_BROWSE); - options = grl_operation_options_new (caps); - grl_operation_options_set_count (options, REMOTE_ITEM_COUNT); - grl_operation_options_set_resolution_flags (options, GRL_RESOLVE_FAST_ONLY); - grl_operation_options_set_type_filter (options, GRL_TYPE_FILTER_IMAGE); - - grl_source_search (source, NULL, keys, options, searched_online_source, g_object_ref (self)); - g_object_unref (options); -} - -static void -add_online_source_cb (CcBackgroundGriloMiner *self, - GrlSource *source) -{ - GList *l; - gboolean found = FALSE; - const gchar *source_id; - - source_id = grl_source_get_id (source); - for (l = self->accounts; l != NULL && !found; l = l->next) - { - GoaObject *goa_object = GOA_OBJECT (l->data); - g_autofree gchar *account_id = NULL; - - account_id = get_grilo_id (goa_object); - if (g_strcmp0 (source_id, account_id) == 0) - { - query_online_source (self, source); - found = TRUE; - } - } -} - -static void -client_async_ready (GObject *source, - GAsyncResult *res, - gpointer user_data) -{ - CcBackgroundGriloMiner *self; - g_autoptr(GError) error = NULL; - GList *accounts = NULL; - GList *photo_accounts = NULL; - GList *l; - GoaClient *client = NULL; - GrlRegistry *registry; - - client = goa_client_new_finish (res, &error); - if (client == NULL) - { - if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) - g_warning ("Failed to create GoaClient: %s", error->message); - goto out; - } - - self = CC_BACKGROUND_GRILO_MINER (user_data); - - accounts = goa_client_get_accounts (client); - for (l = accounts; l != NULL; l = l->next) - { - GoaObject *goa_object = GOA_OBJECT (l->data); - GoaAccount *account; - GoaPhotos *photos; - const gchar *provider_type; - - account = goa_object_peek_account (goa_object); - provider_type = goa_account_get_provider_type (account); - - photos = goa_object_peek_photos (goa_object); - if (photos != NULL && g_strcmp0 (provider_type, "flickr") == 0) - photo_accounts = g_list_prepend (photo_accounts, g_object_ref (goa_object)); - } - - if (photo_accounts == NULL) - goto out; - - registry = grl_registry_get_default (); - - for (l = photo_accounts; l != NULL; l = l->next) - { - GoaObject *goa_object = GOA_OBJECT (l->data); - GrlSource *source; - g_autofree gchar *account_id = NULL; - - account_id = get_grilo_id (goa_object); - source = grl_registry_lookup_source (registry, account_id); - if (source != NULL) - query_online_source (self, source); - } - - self->accounts = photo_accounts; - photo_accounts = NULL; - - g_signal_connect_object (registry, "source-added", G_CALLBACK (add_online_source_cb), self, G_CONNECT_SWAPPED); - - out: - g_list_free_full (photo_accounts, g_object_unref); - g_list_free_full (accounts, g_object_unref); - g_clear_object (&client); -} - -static void -setup_online_accounts (CcBackgroundGriloMiner *self) -{ - goa_client_new (self->cancellable, client_async_ready, self); -} - -static void -cc_background_grilo_miner_dispose (GObject *object) -{ - CcBackgroundGriloMiner *self = CC_BACKGROUND_GRILO_MINER (object); - - if (self->cancellable) - { - g_cancellable_cancel (self->cancellable); - g_clear_object (&self->cancellable); - } - - if (self->accounts) - { - g_list_free_full (self->accounts, g_object_unref); - self->accounts = NULL; - } - - G_OBJECT_CLASS (cc_background_grilo_miner_parent_class)->dispose (object); -} - -static void -cc_background_grilo_miner_init (CcBackgroundGriloMiner *self) -{ - self->cancellable = g_cancellable_new (); -} - -static void -cc_background_grilo_miner_class_init (CcBackgroundGriloMinerClass *klass) -{ - g_autoptr(GError) error = NULL; - GObjectClass *object_class = G_OBJECT_CLASS (klass); - GrlRegistry *registry; - - object_class->dispose = cc_background_grilo_miner_dispose; - - signals[MEDIA_FOUND] = g_signal_new ("media-found", - G_TYPE_FROM_CLASS (klass), - G_SIGNAL_RUN_LAST, - 0, /* class_offset */ - NULL, /* accumulator */ - NULL, /* accu_data */ - g_cclosure_marshal_VOID__OBJECT, - G_TYPE_NONE, - 1, - GRL_TYPE_MEDIA); - - grl_init (NULL, NULL); - registry = grl_registry_get_default (); - - error = NULL; - if (!grl_registry_load_all_plugins (registry, FALSE, &error) || - !grl_registry_activate_plugin_by_id (registry, "grl-flickr", &error)) - g_warning ("%s", error->message); -} - -CcBackgroundGriloMiner * -cc_background_grilo_miner_new (void) -{ - return g_object_new (CC_TYPE_BACKGROUND_GRILO_MINER, NULL); -} - -void -cc_background_grilo_miner_start (CcBackgroundGriloMiner *self) -{ - setup_online_accounts (self); -} diff --git a/panels/background/cc-background-grilo-miner.h b/panels/background/cc-background-grilo-miner.h deleted file mode 100644 index b018129ae..000000000 --- a/panels/background/cc-background-grilo-miner.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (C) 2014 Red Hat, Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, see . - */ - -#pragma once - -#include - -G_BEGIN_DECLS - -#define CC_TYPE_BACKGROUND_GRILO_MINER (cc_background_grilo_miner_get_type ()) -G_DECLARE_FINAL_TYPE (CcBackgroundGriloMiner, cc_background_grilo_miner, CC, BACKGROUND_GRILO_MINER, GObject); - -CcBackgroundGriloMiner *cc_background_grilo_miner_new (void); - -void cc_background_grilo_miner_start (CcBackgroundGriloMiner *self); - -G_END_DECLS diff --git a/panels/background/cc-background-panel.c b/panels/background/cc-background-panel.c index 29dedf165..3e50f506b 100644 --- a/panels/background/cc-background-panel.c +++ b/panels/background/cc-background-panel.c @@ -35,8 +35,6 @@ #include "cc-background-resources.h" #include "cc-background-xml.h" -#include "bg-pictures-source.h" - #define WP_PATH_ID "org.gnome.desktop.background" #define WP_LOCK_PATH_ID "org.gnome.desktop.screensaver" #define WP_URI_KEY "picture-uri" diff --git a/panels/background/meson.build b/panels/background/meson.build index e9fa398d4..eb5e9ec84 100644 --- a/panels/background/meson.build +++ b/panels/background/meson.build @@ -76,12 +76,10 @@ common_sources += gnome.compile_resources( sources = common_sources + files( 'bg-colors-source.c', - 'bg-pictures-source.c', 'bg-recent-source.c', 'bg-source.c', 'bg-wallpapers-source.c', 'cc-background-chooser.c', - 'cc-background-grilo-miner.c', 'cc-background-item.c', 'cc-background-panel.c', 'cc-background-preview.c', @@ -91,10 +89,8 @@ sources = common_sources + files( deps = common_deps + [ gdk_pixbuf_dep, gnome_desktop_dep, - goa_dep, libxml_dep, dependency('cairo-gobject'), - dependency('grilo-0.3', version: '>= 0.3.0') ] cflags += [