[Xfce4-commits] [apps/xfce4-screensaver] 341/425: Tidy up xfce-bg.{c, h}
noreply at xfce.org
noreply at xfce.org
Mon Oct 15 01:53:08 CEST 2018
This is an automated email from the git hooks/post-receive script.
b l u e s a b r e p u s h e d a c o m m i t t o b r a n c h m a s t e r
in repository apps/xfce4-screensaver.
commit 3ea61b8b6c2ab7f9318903d295ec5f30c273879e
Author: Sean Davis <smd.seandavis at gmail.com>
Date: Mon Oct 1 22:47:29 2018 -0400
Tidy up xfce-bg.{c,h}
---
src/xfce-bg.c | 1099 ++-------------------------------------------------------
src/xfce-bg.h | 74 ----
2 files changed, 29 insertions(+), 1144 deletions(-)
diff --git a/src/xfce-bg.c b/src/xfce-bg.c
index 6e04b0c..fb8be1f 100644
--- a/src/xfce-bg.c
+++ b/src/xfce-bg.c
@@ -127,8 +127,6 @@ static cairo_surface_t *make_root_pixmap (GdkWindow *window,
gint height);
/* Pixbuf utils */
-static void pixbuf_average_value (GdkPixbuf *pixbuf,
- GdkRGBA *result);
static GdkPixbuf *pixbuf_scale_to_fit (GdkPixbuf *src,
int max_width,
int max_height);
@@ -154,13 +152,6 @@ static void pixbuf_blend (GdkPixbuf *src,
int dest_y,
double alpha);
-/* Thumbnail utilities */
-static GdkPixbuf *create_thumbnail_for_filename (XfceDesktopThumbnailFactory *factory,
- const char *filename);
-static gboolean get_thumb_annotations (GdkPixbuf *thumb,
- int *orig_width,
- int *orig_height);
-
/* Cache */
static GdkPixbuf *get_pixbuf_for_size (XfceBG *bg,
gint num_monitor,
@@ -170,17 +161,10 @@ static void clear_cache (XfceBG *bg);
static gboolean is_different (XfceBG *bg,
const char *filename);
static time_t get_mtime (const char *filename);
-static GdkPixbuf *create_img_thumbnail (XfceBG *bg,
- XfceDesktopThumbnailFactory *factory,
- GdkScreen *screen,
- int dest_width,
- int dest_height,
- int frame_num);
static SlideShow * get_as_slideshow (XfceBG *bg,
const char *filename);
static Slide * get_current_slide (SlideShow *show,
double *alpha);
-static gboolean slideshow_has_multiple_sizes (SlideShow *show);
static SlideShow *read_slideshow_file (const char *filename,
GError **err);
@@ -191,9 +175,29 @@ static FileSize *find_best_size (GSList *sizes,
gint width,
gint height);
-static void
-color_from_string (const char *string,
- GdkRGBA *colorp)
+static void xfce_bg_set_color(XfceBG *bg,
+ XfceBGColorType type,
+ GdkRGBA *primary,
+ GdkRGBA *secondary);
+
+static void xfce_bg_load_from_gsettings (XfceBG *bg,
+ GSettings *settings);
+
+static cairo_surface_t * xfce_bg_create_surface_scale (XfceBG *bg,
+ GdkWindow *window,
+ int width,
+ int height,
+ int scale,
+ gboolean root);
+
+static void xfce_bg_set_placement (XfceBG *bg,
+ XfceBGPlacement placement);
+
+static void xfce_bg_set_filename (XfceBG *bg,
+ const char *filename);
+
+static void color_from_string(const char *string,
+ GdkRGBA *colorp)
{
/* If all else fails use black */
gdk_rgba_parse (colorp, "#000000");
@@ -204,15 +208,6 @@ color_from_string (const char *string,
gdk_rgba_parse (colorp, string);
}
-static char *
-color_to_string (const GdkRGBA *color)
-{
- return g_strdup_printf ("#%02x%02x%02x",
- ((guint) (color->red * 65535)) >> 8,
- ((guint) (color->green * 65535)) >> 8,
- ((guint) (color->blue * 65535)) >> 8);
-}
-
static gboolean
do_changed (XfceBG *bg)
{
@@ -280,53 +275,7 @@ xfce_bg_load_from_preferences (XfceBG *bg)
queue_changed (bg);
}
-/* This function loads default system settings */
-void
-xfce_bg_load_from_system_preferences (XfceBG *bg)
-{
- GSettings *settings;
-
- /* FIXME: we need to bind system settings instead of user but
- * that's currently impossible, not implemented yet.
- * Hence, reset to system default values.
- */
- settings = g_settings_new (XFCE_BG_SCHEMA);
-
- xfce_bg_load_from_system_gsettings (bg, settings, FALSE);
-
- g_object_unref (settings);
-}
-
-/* This function loads (and optionally resets to) default system settings */
-void
-xfce_bg_load_from_system_gsettings (XfceBG *bg,
- GSettings *settings,
- gboolean reset_apply)
-{
- gchar **keys;
- gchar **k;
-
- g_return_if_fail (XFCE_IS_BG (bg));
- g_return_if_fail (G_IS_SETTINGS (settings));
-
- g_settings_delay (settings);
-
- keys = g_settings_list_keys (settings);
- for (k = keys; *k; k++) {
- g_settings_reset (settings, *k);
- }
- g_strfreev (keys);
-
- if (reset_apply) {
- /* Apply changes atomically. */
- g_settings_apply (settings);
- } else {
- xfce_bg_load_from_gsettings (bg, settings);
- g_settings_revert (settings);
- }
-}
-
-void
+static void
xfce_bg_load_from_gsettings (XfceBG *bg,
GSettings *settings)
{
@@ -401,46 +350,6 @@ xfce_bg_load_from_gsettings (XfceBG *bg,
g_free (filename);
}
-void
-xfce_bg_save_to_preferences (XfceBG *bg)
-{
- GSettings *settings;
- settings = g_settings_new (XFCE_BG_SCHEMA);
-
- xfce_bg_save_to_gsettings (bg, settings);
- g_object_unref (settings);
-}
-
-void
-xfce_bg_save_to_gsettings (XfceBG *bg,
- GSettings *settings)
-{
- gchar *primary;
- gchar *secondary;
-
- g_return_if_fail (XFCE_IS_BG (bg));
- g_return_if_fail (G_IS_SETTINGS (settings));
-
- primary = color_to_string (&bg->primary);
- secondary = color_to_string (&bg->secondary);
-
- g_settings_delay (settings);
-
- g_settings_set_boolean (settings, XFCE_BG_KEY_DRAW_BACKGROUND, bg->is_enabled);
- g_settings_set_string (settings, XFCE_BG_KEY_PICTURE_FILENAME, bg->filename);
- g_settings_set_enum (settings, XFCE_BG_KEY_PICTURE_PLACEMENT, bg->placement);
- g_settings_set_string (settings, XFCE_BG_KEY_PRIMARY_COLOR, primary);
- g_settings_set_string (settings, XFCE_BG_KEY_SECONDARY_COLOR, secondary);
- g_settings_set_enum (settings, XFCE_BG_KEY_COLOR_TYPE, bg->color_type);
-
- /* Apply changes atomically. */
- g_settings_apply (settings);
-
- g_free (primary);
- g_free (secondary);
-}
-
-
static void
xfce_bg_init (XfceBG *bg)
{
@@ -518,7 +427,7 @@ xfce_bg_new (void)
return g_object_new (XFCE_TYPE_BG, NULL);
}
-void
+static void
xfce_bg_set_color (XfceBG *bg,
XfceBGColorType type,
GdkRGBA *primary,
@@ -540,7 +449,7 @@ xfce_bg_set_color (XfceBG *bg,
}
}
-void
+static void
xfce_bg_set_placement (XfceBG *bg,
XfceBGPlacement placement)
{
@@ -553,61 +462,6 @@ xfce_bg_set_placement (XfceBG *bg,
}
}
-XfceBGPlacement
-xfce_bg_get_placement (XfceBG *bg)
-{
- g_return_val_if_fail (bg != NULL, -1);
-
- return bg->placement;
-}
-
-void
-xfce_bg_get_color (XfceBG *bg,
- XfceBGColorType *type,
- GdkRGBA *primary,
- GdkRGBA *secondary)
-{
- g_return_if_fail (bg != NULL);
-
- if (type)
- *type = bg->color_type;
-
- if (primary)
- *primary = bg->primary;
-
- if (secondary)
- *secondary = bg->secondary;
-}
-
-void
-xfce_bg_set_draw_background (XfceBG *bg,
- gboolean draw_background)
-{
- g_return_if_fail (bg != NULL);
-
- if (bg->is_enabled != draw_background) {
- bg->is_enabled = draw_background;
-
- queue_changed (bg);
- }
-}
-
-gboolean
-xfce_bg_get_draw_background (XfceBG *bg)
-{
- g_return_val_if_fail (bg != NULL, FALSE);
-
- return bg->is_enabled;
-}
-
-const gchar *
-xfce_bg_get_filename (XfceBG *bg)
-{
- g_return_val_if_fail (bg != NULL, NULL);
-
- return bg->filename;
-}
-
static inline gchar *
get_wallpaper_cache_dir ()
{
@@ -756,7 +610,7 @@ file_changed (GFileMonitor *file_monitor,
queue_changed (bg);
}
-void
+static void
xfce_bg_set_filename (XfceBG *bg,
const char *filename)
{
@@ -981,21 +835,6 @@ draw_image_area (XfceBG *bg,
}
static void
-draw_image_for_thumb (XfceBG *bg,
- GdkPixbuf *pixbuf,
- GdkPixbuf *dest)
-{
- GdkRectangle rect;
-
- rect.x = 0;
- rect.y = 0;
- rect.width = gdk_pixbuf_get_width (dest);
- rect.height = gdk_pixbuf_get_height (dest);
-
- draw_image_area (bg, -1, pixbuf, dest, &rect);
-}
-
-static void
draw_once (XfceBG *bg,
GdkPixbuf *dest,
gboolean is_root)
@@ -1046,7 +885,7 @@ draw_each_monitor (XfceBG *bg,
}
}
-void
+static void
xfce_bg_draw (XfceBG *bg,
GdkPixbuf *dest,
GdkScreen *screen,
@@ -1068,25 +907,6 @@ xfce_bg_draw (XfceBG *bg,
}
}
-gboolean
-xfce_bg_has_multiple_sizes (XfceBG *bg)
-{
- SlideShow *show;
- gboolean ret;
-
- g_return_val_if_fail (bg != NULL, FALSE);
-
- ret = FALSE;
-
- show = get_as_slideshow (bg, bg->filename);
- if (show) {
- ret = slideshow_has_multiple_sizes (show);
- slideshow_unref (show);
- }
-
- return ret;
-}
-
static void
xfce_bg_get_pixmap_size (XfceBG *bg,
int width,
@@ -1162,7 +982,7 @@ xfce_bg_create_surface (XfceBG *bg,
* so that if someone calls XKillClient on it, it won't affect the application
* who created it.
**/
-cairo_surface_t *
+static cairo_surface_t *
xfce_bg_create_surface_scale (XfceBG *bg,
GdkWindow *window,
int width,
@@ -1222,52 +1042,6 @@ xfce_bg_create_surface_scale (XfceBG *bg,
return surface;
}
-
-/* determine if a background is darker or lighter than average, to help
- * clients know what colors to draw on top with
- */
-gboolean
-xfce_bg_is_dark (XfceBG *bg,
- int width,
- int height)
-{
- GdkRGBA color;
- int intensity;
- GdkPixbuf *pixbuf;
-
- g_return_val_if_fail (bg != NULL, FALSE);
-
- if (bg->color_type == XFCE_BG_COLOR_SOLID) {
- color = bg->primary;
- } else {
- color.red = (bg->primary.red + bg->secondary.red) / 2;
- color.green = (bg->primary.green + bg->secondary.green) / 2;
- color.blue = (bg->primary.blue + bg->secondary.blue) / 2;
- }
- pixbuf = get_pixbuf_for_size (bg, -1, width, height);
- if (pixbuf) {
- GdkRGBA argb;
- guchar a, r, g, b;
-
- pixbuf_average_value (pixbuf, &argb);
- a = argb.alpha * 0xff;
- r = argb.red * 0xff;
- g = argb.green * 0xff;
- b = argb.blue * 0xff;
-
- color.red = (color.red * (0xFF - a) + r * 0x101 * a) / 0xFF;
- color.green = (color.green * (0xFF - a) + g * 0x101 * a) / 0xFF;
- color.blue = (color.blue * (0xFF - a) + b * 0x101 * a) / 0xFF;
- g_object_unref (pixbuf);
- }
-
- intensity = ((guint) (color.red * 65535) * 77 +
- (guint) (color.green * 65535) * 150 +
- (guint) (color.blue * 65535) * 28) >> 16;
-
- return intensity < 160; /* biased slightly to be dark */
-}
-
/*
* Create a persistent pixmap. We create a separate display
* and set the closedown mode on it to RetainPermanent.
@@ -1307,385 +1081,6 @@ make_root_pixmap (GdkWindow *window, gint width, gint height)
return surface;
}
-static gboolean
-get_original_size (const char *filename,
- int *orig_width,
- int *orig_height)
-{
- gboolean result;
-
- if (gdk_pixbuf_get_file_info (filename, orig_width, orig_height))
- result = TRUE;
- else
- result = FALSE;
-
- return result;
-}
-
-static const char *
-get_filename_for_size (XfceBG *bg, gint best_width, gint best_height)
-{
- SlideShow *show;
- Slide *slide;
- FileSize *size;
-
- if (!bg->filename)
- return NULL;
-
- show = get_as_slideshow (bg, bg->filename);
- if (!show) {
- return bg->filename;
- }
-
- slide = get_current_slide (show, NULL);
- slideshow_unref (show);
- size = find_best_size (slide->file1, best_width, best_height);
- return size->file;
-}
-
-gboolean
-xfce_bg_get_image_size (XfceBG *bg,
- XfceDesktopThumbnailFactory *factory,
- int best_width,
- int best_height,
- int *width,
- int *height)
-{
- GdkPixbuf *thumb;
- gboolean result = FALSE;
- const gchar *filename;
-
- g_return_val_if_fail (bg != NULL, FALSE);
- g_return_val_if_fail (factory != NULL, FALSE);
-
- if (!bg->filename)
- return FALSE;
-
- filename = get_filename_for_size (bg, best_width, best_height);
- thumb = create_thumbnail_for_filename (factory, filename);
- if (thumb) {
- if (get_thumb_annotations (thumb, width, height))
- result = TRUE;
-
- g_object_unref (thumb);
- }
-
- if (!result) {
- if (get_original_size (filename, width, height))
- result = TRUE;
- }
-
- return result;
-}
-
-static double
-fit_factor (int from_width, int from_height,
- int to_width, int to_height)
-{
- return MIN (to_width / (double) from_width, to_height / (double) from_height);
-}
-
-/**
- * xfce_bg_create_thumbnail:
- *
- * Returns: (transfer full): a #GdkPixbuf showing the background as a thumbnail
- */
-GdkPixbuf *
-xfce_bg_create_thumbnail (XfceBG *bg,
- XfceDesktopThumbnailFactory *factory,
- GdkScreen *screen,
- int dest_width,
- int dest_height)
-{
- GdkPixbuf *result;
- GdkPixbuf *thumb;
-
- g_return_val_if_fail (bg != NULL, NULL);
-
- result = gdk_pixbuf_new (GDK_COLORSPACE_RGB, FALSE, 8, dest_width, dest_height);
-
- draw_color (bg, result);
-
- if (bg->filename) {
- thumb = create_img_thumbnail (bg, factory, screen, dest_width, dest_height, -1);
-
- if (thumb) {
- draw_image_for_thumb (bg, thumb, result);
- g_object_unref (thumb);
- }
- }
-
- return result;
-}
-
-/**
- * xfce_bg_get_surface_from_root:
- * @screen: a #GdkScreen
- *
- * This function queries the _XROOTPMAP_ID property from
- * the root window associated with @screen to determine
- * the current root window background surface and returns
- * a copy of it. If the _XROOTPMAP_ID is not set, then
- * a black surface is returned.
- *
- * Return value: a #cairo_surface_t if successful or %NULL
- **/
-cairo_surface_t *
-xfce_bg_get_surface_from_root (GdkScreen *screen)
-{
- int result;
- gint format;
- gulong nitems;
- gulong bytes_after;
- guchar *data;
- Atom type;
- Display *display;
- int screen_num;
- cairo_surface_t *surface;
- cairo_surface_t *source_pixmap;
- GdkDisplay *gdkdisplay;
- int width, height;
- cairo_t *cr;
-
- display = GDK_DISPLAY_XDISPLAY (gdk_screen_get_display (screen));
- screen_num = gdk_x11_screen_get_screen_number (screen);
-
- result = XGetWindowProperty (display,
- RootWindow (display, screen_num),
- gdk_x11_get_xatom_by_name ("_XROOTPMAP_ID"),
- 0L, 1L, False, XA_PIXMAP,
- &type, &format, &nitems, &bytes_after,
- &data);
- surface = NULL;
- source_pixmap = NULL;
-
- if (result != Success || type != XA_PIXMAP ||
- format != 32 || nitems != 1) {
- XFree (data);
- data = NULL;
- }
-
- if (data != NULL) {
- gdkdisplay = gdk_screen_get_display (screen);
- gdk_x11_display_error_trap_push (gdkdisplay);
-
- Pixmap xpixmap = *(Pixmap *) data;
- Window root_return;
- int x_ret, y_ret;
- unsigned int w_ret, h_ret, bw_ret, depth_ret;
-
- if (XGetGeometry (GDK_SCREEN_XDISPLAY (screen),
- xpixmap,
- &root_return,
- &x_ret, &y_ret, &w_ret, &h_ret, &bw_ret, &depth_ret))
- {
- source_pixmap = cairo_xlib_surface_create (GDK_SCREEN_XDISPLAY (screen),
- xpixmap,
- GDK_VISUAL_XVISUAL (gdk_screen_get_system_visual (screen)),
- w_ret, h_ret);
- }
-
- gdk_x11_display_error_trap_pop_ignored (gdkdisplay);
- }
-
- width = WidthOfScreen (gdk_x11_screen_get_xscreen (screen));
- height = HeightOfScreen (gdk_x11_screen_get_xscreen (screen));
-
- if (source_pixmap) {
- surface = cairo_surface_create_similar (source_pixmap,
- CAIRO_CONTENT_COLOR,
- width, height);
-
- cr = cairo_create (surface);
- cairo_set_source_surface (cr, source_pixmap, 0, 0);
- cairo_paint (cr);
-
- if (cairo_status (cr) != CAIRO_STATUS_SUCCESS) {
- cairo_surface_destroy (surface);
- surface = NULL;
- }
-
- cairo_destroy (cr);
- }
-
- if (surface == NULL) {
- surface = gdk_window_create_similar_surface (gdk_screen_get_root_window (screen),
- CAIRO_CONTENT_COLOR,
- width, height);
- }
-
- if (source_pixmap != NULL)
- cairo_surface_destroy (source_pixmap);
-
- if (data != NULL)
- XFree (data);
-
- return surface;
-}
-
-/* Sets the "ESETROOT_PMAP_ID" property to later be used to free the pixmap,
- */
-static void
-xfce_bg_set_root_pixmap_id (GdkScreen *screen,
- Display *display,
- Pixmap xpixmap)
-{
- Window xroot = RootWindow (display, gdk_x11_screen_get_screen_number (screen));
- char *atom_names[] = {"_XROOTPMAP_ID", "ESETROOT_PMAP_ID"};
- Atom atoms[G_N_ELEMENTS(atom_names)] = {0};
-
- Atom type;
- int format, result;
- unsigned long nitems, after;
- unsigned char *data_root, *data_esetroot;
- GdkDisplay *gdkdisplay;
-
- /* Get atoms for both properties in an array, only if they exist.
- * This method is to avoid multiple round-trips to Xserver
- */
- if (XInternAtoms (display, atom_names, G_N_ELEMENTS(atom_names), True, atoms) &&
- atoms[0] != None && atoms[1] != None) {
- result = XGetWindowProperty (display, xroot, atoms[0], 0L, 1L,
- False, AnyPropertyType,
- &type, &format, &nitems, &after,
- &data_root);
-
- if (data_root != NULL && result == Success &&
- type == XA_PIXMAP && format == 32 && nitems == 1) {
- result = XGetWindowProperty (display, xroot, atoms[1],
- 0L, 1L, False,
- AnyPropertyType,
- &type, &format, &nitems,
- &after, &data_esetroot);
-
- if (data_esetroot != NULL && result == Success &&
- type == XA_PIXMAP && format == 32 && nitems == 1) {
- Pixmap xrootpmap = *((Pixmap *) data_root);
- Pixmap esetrootpmap = *((Pixmap *) data_esetroot);
-
- gdkdisplay = gdk_screen_get_display (screen);
- gdk_x11_display_error_trap_push (gdkdisplay);
- if (xrootpmap && xrootpmap == esetrootpmap) {
- XKillClient (display, xrootpmap);
- }
- if (esetrootpmap && esetrootpmap != xrootpmap) {
- XKillClient (display, esetrootpmap);
- }
- gdk_x11_display_error_trap_pop_ignored (gdkdisplay);
- }
- if (data_esetroot != NULL) {
- XFree (data_esetroot);
- }
- }
- if (data_root != NULL) {
- XFree (data_root);
- }
- }
-
- /* Get atoms for both properties in an array, create them if needed.
- * This method is to avoid multiple round-trips to Xserver
- */
- if (!XInternAtoms (display, atom_names, G_N_ELEMENTS(atom_names), False, atoms) ||
- atoms[0] == None || atoms[1] == None) {
- g_warning ("Could not create atoms needed to set root pixmap id/properties.\n");
- return;
- }
-
- /* Set new _XROOTMAP_ID and ESETROOT_PMAP_ID properties */
- XChangeProperty (display, xroot, atoms[0], XA_PIXMAP, 32,
- PropModeReplace, (unsigned char *) &xpixmap, 1);
-
- XChangeProperty (display, xroot, atoms[1], XA_PIXMAP, 32,
- PropModeReplace, (unsigned char *) &xpixmap, 1);
-}
-
-/**
- * xfce_bg_set_surface_as_root:
- * @screen: the #GdkScreen to change root background on
- * @surface: the #cairo_surface_t to set root background from.
- * Must be an xlib surface backing a pixmap.
- *
- * Set the root pixmap, and properties pointing to it. We
- * do this atomically with a server grab to make sure that
- * we won't leak the pixmap if somebody else it setting
- * it at the same time. (This assumes that they follow the
- * same conventions we do). @surface should come from a call
- * to xfce_bg_create_surface().
- **/
-void
-xfce_bg_set_surface_as_root (GdkScreen *screen, cairo_surface_t *surface)
-{
- g_return_if_fail (screen != NULL);
- g_return_if_fail (cairo_surface_get_type (surface) == CAIRO_SURFACE_TYPE_XLIB);
-
- /* Desktop background pixmap should be created from dummy X client since most
- * applications will try to kill it with XKillClient later when changing pixmap
- */
- Display *display = GDK_DISPLAY_XDISPLAY (gdk_screen_get_display (screen));
- Pixmap pixmap_id = cairo_xlib_surface_get_drawable (surface);
- Window xroot = RootWindow (display, gdk_x11_screen_get_screen_number (screen));
-
- XGrabServer (display);
- xfce_bg_set_root_pixmap_id (screen, display, pixmap_id);
-
- XSetWindowBackgroundPixmap (display, xroot, pixmap_id);
- XClearWindow (display, xroot);
-
- XFlush (display);
- XUngrabServer (display);
-}
-
-/**
- * xfce_bg_set_surface_as_root_with_crossfade:
- * @screen: the #GdkScreen to change root background on
- * @surface: the cairo xlib surface to set root background from
- *
- * Set the root pixmap, and properties pointing to it.
- * This function differs from xfce_bg_set_surface_as_root()
- * in that it adds a subtle crossfade animation from the
- * current root pixmap to the new one.
- *
- * Return value: (transfer full): a #XfceBGCrossfade object
- **/
-XfceBGCrossfade *
-xfce_bg_set_surface_as_root_with_crossfade (GdkScreen *screen,
- cairo_surface_t *surface)
-{
- GdkWindow *root_window;
- int width, height;
- XfceBGCrossfade *fade;
- cairo_t *cr;
- cairo_surface_t *old_surface;
-
- g_return_val_if_fail (screen != NULL, NULL);
- g_return_val_if_fail (surface != NULL, NULL);
-
- root_window = gdk_screen_get_root_window (screen);
- width = gdk_window_get_width (root_window);
- height = gdk_window_get_height (root_window);
- fade = xfce_bg_crossfade_new (width, height);
- old_surface = xfce_bg_get_surface_from_root (screen);
-
- xfce_bg_crossfade_set_start_surface (fade, old_surface);
- xfce_bg_crossfade_set_end_surface (fade, surface);
-
- /* Before setting the surface as a root pixmap, let's have it draw
- * the old stuff, just so it won't be noticable
- * (crossfade will later get it back)
- */
- cr = cairo_create (surface);
- cairo_set_source_surface (cr, old_surface, 0, 0);
- cairo_pattern_set_extend (cairo_get_source (cr), CAIRO_EXTEND_REPEAT);
- cairo_paint (cr);
- cairo_destroy (cr);
- cairo_surface_destroy (old_surface);
-
- xfce_bg_set_surface_as_root (screen, surface);
- xfce_bg_crossfade_start (fade, root_window);
-
- return fade;
-}
-
/* Implementation of the pixbuf cache */
struct _SlideShow
{
@@ -1870,15 +1265,6 @@ file_cache_add_pixbuf (XfceBG *bg,
}
static void
-file_cache_add_thumbnail (XfceBG *bg,
- const char *filename,
- GdkPixbuf *pixbuf)
-{
- FileCacheEntry *ent = file_cache_entry_new (bg, THUMBNAIL, filename);
- ent->u.thumbnail = g_object_ref (pixbuf);
-}
-
-static void
file_cache_add_slide_show (XfceBG *bg,
const char *filename,
SlideShow *show)
@@ -1980,23 +1366,6 @@ get_as_slideshow (XfceBG *bg, const char *filename)
}
}
-static GdkPixbuf *
-get_as_thumbnail (XfceBG *bg, XfceDesktopThumbnailFactory *factory, const char *filename)
-{
- const FileCacheEntry *ent;
- if ((ent = file_cache_lookup (bg, THUMBNAIL, filename))) {
- return g_object_ref (ent->u.thumbnail);
- }
- else {
- GdkPixbuf *thumb = create_thumbnail_for_filename (factory, filename);
-
- if (thumb)
- file_cache_add_thumbnail (bg, filename, thumb);
-
- return thumb;
- }
-}
-
static gboolean
blow_expensive_caches (gpointer data)
{
@@ -2113,171 +1482,6 @@ get_mtime (const char *filename)
return mtime;
}
-static GdkPixbuf *
-scale_thumbnail (XfceBGPlacement placement,
- const char *filename,
- GdkPixbuf *thumb,
- GdkScreen *screen,
- int dest_width,
- int dest_height)
-{
- int o_width;
- int o_height;
-
- if (placement != XFCE_BG_PLACEMENT_TILED &&
- placement != XFCE_BG_PLACEMENT_CENTERED) {
-
- /* In this case, the pixbuf will be scaled to fit the screen anyway,
- * so just return the pixbuf here
- */
- return g_object_ref (thumb);
- }
-
- if (get_thumb_annotations (thumb, &o_width, &o_height) ||
- (filename && get_original_size (filename, &o_width, &o_height))) {
-
- int scr_height = HeightOfScreen (gdk_x11_screen_get_xscreen (screen));
- int scr_width = WidthOfScreen (gdk_x11_screen_get_xscreen (screen));
- int thumb_width = gdk_pixbuf_get_width (thumb);
- int thumb_height = gdk_pixbuf_get_height (thumb);
- double screen_to_dest = fit_factor (scr_width, scr_height,
- dest_width, dest_height);
- double thumb_to_orig = fit_factor (thumb_width, thumb_height,
- o_width, o_height);
- double f = thumb_to_orig * screen_to_dest;
- int new_width, new_height;
-
- new_width = floor (thumb_width * f + 0.5);
- new_height = floor (thumb_height * f + 0.5);
-
- if (placement == XFCE_BG_PLACEMENT_TILED) {
- /* Heuristic to make sure tiles don't become so small that
- * they turn into a blur.
- *
- * This is strictly speaking incorrect, but the resulting
- * thumbnail gives a much better idea what the background
- * will actually look like.
- */
-
- if ((new_width < 32 || new_height < 32) &&
- (new_width < o_width / 4 || new_height < o_height / 4)) {
- new_width = o_width / 4;
- new_height = o_height / 4;
- }
- }
-
- thumb = gdk_pixbuf_scale_simple (thumb, new_width, new_height,
- GDK_INTERP_BILINEAR);
- }
- else
- g_object_ref (thumb);
-
- return thumb;
-}
-
-/* frame_num determines which slide to thumbnail.
- * -1 means 'current slide'.
- */
-static GdkPixbuf *
-create_img_thumbnail (XfceBG *bg,
- XfceDesktopThumbnailFactory *factory,
- GdkScreen *screen,
- int dest_width,
- int dest_height,
- int frame_num)
-{
- if (bg->filename) {
- GdkPixbuf *thumb;
-
- thumb = get_as_thumbnail (bg, factory, bg->filename);
-
- if (thumb) {
- GdkPixbuf *result;
- result = scale_thumbnail (bg->placement,
- bg->filename,
- thumb,
- screen,
- dest_width,
- dest_height);
- g_object_unref (thumb);
- return result;
- }
- else {
- SlideShow *show = get_as_slideshow (bg, bg->filename);
-
- if (show) {
- double alpha;
- Slide *slide;
-
- if (frame_num == -1)
- slide = get_current_slide (show, &alpha);
- else
- slide = g_queue_peek_nth (show->slides, frame_num);
-
- if (slide->fixed) {
- GdkPixbuf *tmp;
- FileSize *fs;
- fs = find_best_size (slide->file1, dest_width, dest_height);
- tmp = get_as_thumbnail (bg, factory, fs->file);
- if (tmp) {
- thumb = scale_thumbnail (bg->placement,
- fs->file,
- tmp,
- screen,
- dest_width,
- dest_height);
- g_object_unref (tmp);
- }
- }
- else {
- FileSize *fs1, *fs2;
- GdkPixbuf *p1, *p2;
- fs1 = find_best_size (slide->file1, dest_width, dest_height);
- p1 = get_as_thumbnail (bg, factory, fs1->file);
-
- fs2 = find_best_size (slide->file2, dest_width, dest_height);
- p2 = get_as_thumbnail (bg, factory, fs2->file);
-
- if (p1 && p2) {
- GdkPixbuf *thumb1, *thumb2;
-
- thumb1 = scale_thumbnail (bg->placement,
- fs1->file,
- p1,
- screen,
- dest_width,
- dest_height);
-
- thumb2 = scale_thumbnail (bg->placement,
- fs2->file,
- p2,
- screen,
- dest_width,
- dest_height);
-
- thumb = blend (thumb1, thumb2, alpha);
-
- g_object_unref (thumb1);
- g_object_unref (thumb2);
- }
- if (p1)
- g_object_unref (p1);
- if (p2)
- g_object_unref (p2);
- }
-
- ensure_timeout (bg, slide);
-
- slideshow_unref (show);
- }
- }
-
- return thumb;
- }
-
- return NULL;
-}
-
/*
* Find the FileSize that best matches the given size.
* Do two passes; the first pass only considers FileSizes
@@ -2462,72 +1666,6 @@ clear_cache (XfceBG *bg)
}
}
-/* Pixbuf utilities */
-static void
-pixbuf_average_value (GdkPixbuf *pixbuf,
- GdkRGBA *result)
-{
- guint64 a_total, r_total, g_total, b_total;
- guint row, column;
- int row_stride;
- const guchar *pixels, *p;
- int r, g, b, a;
- guint64 dividend;
- guint width, height;
- gdouble dd;
-
- width = gdk_pixbuf_get_width (pixbuf);
- height = gdk_pixbuf_get_height (pixbuf);
- row_stride = gdk_pixbuf_get_rowstride (pixbuf);
- pixels = gdk_pixbuf_get_pixels (pixbuf);
-
- /* iterate through the pixbuf, counting up each component */
- a_total = 0;
- r_total = 0;
- g_total = 0;
- b_total = 0;
-
- if (gdk_pixbuf_get_has_alpha (pixbuf)) {
- for (row = 0; row < height; row++) {
- p = pixels + (row * row_stride);
- for (column = 0; column < width; column++) {
- r = *p++;
- g = *p++;
- b = *p++;
- a = *p++;
-
- a_total += a;
- r_total += r * a;
- g_total += g * a;
- b_total += b * a;
- }
- }
- dividend = height * width * 0xFF;
- a_total *= 0xFF;
- } else {
- for (row = 0; row < height; row++) {
- p = pixels + (row * row_stride);
- for (column = 0; column < width; column++) {
- r = *p++;
- g = *p++;
- b = *p++;
-
- r_total += r;
- g_total += g;
- b_total += b;
- }
- }
- dividend = height * width;
- a_total = dividend * 0xFF;
- }
-
- dd = dividend * 0xFF;
- result->alpha = a_total / dd;
- result->red = r_total / dd;
- result->green = g_total / dd;
- result->blue = b_total / dd;
-}
-
static GdkPixbuf *
pixbuf_scale_to_fit (GdkPixbuf *src, int max_width, int max_height)
{
@@ -3081,182 +2219,3 @@ read_slideshow_file (const char *filename,
return show;
}
-
-/* Thumbnail utilities */
-static GdkPixbuf *
-create_thumbnail_for_filename (XfceDesktopThumbnailFactory *factory,
- const char *filename)
-{
- char *thumb;
- time_t mtime;
- GdkPixbuf *orig, *result = NULL;
- char *uri;
-
- mtime = get_mtime (filename);
-
- if (mtime == (time_t)-1)
- return NULL;
-
- uri = g_filename_to_uri (filename, NULL, NULL);
-
- if (uri == NULL)
- return NULL;
-
- thumb = xfce_desktop_thumbnail_factory_lookup (factory, uri, mtime);
-
- if (thumb) {
- result = gdk_pixbuf_new_from_file (thumb, NULL);
- g_free (thumb);
- }
- else {
- orig = gdk_pixbuf_new_from_file (filename, NULL);
- if (orig) {
- int orig_width = gdk_pixbuf_get_width (orig);
- int orig_height = gdk_pixbuf_get_height (orig);
-
- result = pixbuf_scale_to_fit (orig, 128, 128);
-
- g_object_set_data_full (G_OBJECT (result), "mate-thumbnail-height",
- g_strdup_printf ("%d", orig_height), g_free);
- g_object_set_data_full (G_OBJECT (result), "mate-thumbnail-width",
- g_strdup_printf ("%d", orig_width), g_free);
-
- g_object_unref (orig);
-
- xfce_desktop_thumbnail_factory_save_thumbnail (factory, result, uri, mtime);
- }
- else {
- xfce_desktop_thumbnail_factory_create_failed_thumbnail (factory, uri, mtime);
- }
- }
-
- g_free (uri);
-
- return result;
-}
-
-static gboolean
-get_thumb_annotations (GdkPixbuf *thumb,
- int *orig_width,
- int *orig_height)
-{
- char *end;
- const char *wstr, *hstr;
-
- wstr = gdk_pixbuf_get_option (thumb, "tEXt::Thumb::Image::Width");
- hstr = gdk_pixbuf_get_option (thumb, "tEXt::Thumb::Image::Height");
-
- if (hstr && wstr) {
- *orig_width = strtol (wstr, &end, 10);
- if (*end != 0)
- return FALSE;
-
- *orig_height = strtol (hstr, &end, 10);
- if (*end != 0)
- return FALSE;
-
- return TRUE;
- }
-
- return FALSE;
-}
-
-static gboolean
-slideshow_has_multiple_sizes (SlideShow *show)
-{
- return show->has_multiple_sizes;
-}
-
-/*
- * Returns whether the background is a slideshow.
- */
-gboolean
-xfce_bg_changes_with_time (XfceBG *bg)
-{
- SlideShow *show;
-
- g_return_val_if_fail (bg != NULL, FALSE);
-
- if (!bg->filename)
- return FALSE;
-
- show = get_as_slideshow (bg, bg->filename);
- if (show)
- return g_queue_get_length (show->slides) > 1;
-
- return FALSE;
-}
-
-/**
- * xfce_bg_create_frame_thumbnail:
- *
- * Creates a thumbnail for a certain frame, where 'frame' is somewhat
- * vaguely defined as 'suitable point to show while single-stepping
- * through the slideshow'.
- *
- * Returns: (transfer full): the newly created thumbnail or
- * or NULL if frame_num is out of bounds.
- */
-GdkPixbuf *
-xfce_bg_create_frame_thumbnail (XfceBG *bg,
- XfceDesktopThumbnailFactory *factory,
- GdkScreen *screen,
- int dest_width,
- int dest_height,
- int frame_num)
-{
- SlideShow *show;
- GdkPixbuf *result;
- GdkPixbuf *thumb;
- GList *l;
- int i, skipped;
- gboolean found;
-
- g_return_val_if_fail (bg != NULL, FALSE);
-
- show = get_as_slideshow (bg, bg->filename);
-
- if (!show)
- return NULL;
-
-
- if (frame_num < 0 || frame_num >= g_queue_get_length (show->slides))
- return NULL;
-
- i = 0;
- skipped = 0;
- found = FALSE;
- for (l = show->slides->head; l; l = l->next) {
- Slide *slide = l->data;
- if (!slide->fixed) {
- skipped++;
- continue;
- }
- if (i == frame_num) {
- found = TRUE;
- break;
- }
- i++;
- }
- if (!found)
- return NULL;
-
-
- result = gdk_pixbuf_new (GDK_COLORSPACE_RGB, FALSE, 8, dest_width, dest_height);
-
- draw_color (bg, result);
-
- if (bg->filename) {
- thumb = create_img_thumbnail (bg, factory, screen,
- dest_width, dest_height,
- frame_num + skipped);
-
- if (thumb) {
- draw_image_for_thumb (bg, thumb, result);
- g_object_unref (thumb);
- }
- }
-
- return result;
-}
-
diff --git a/src/xfce-bg.h b/src/xfce-bg.h
index 3ea9c58..647dae0 100644
--- a/src/xfce-bg.h
+++ b/src/xfce-bg.h
@@ -81,88 +81,14 @@ typedef enum {
GType xfce_bg_get_type (void);
XfceBG * xfce_bg_new (void);
void xfce_bg_load_from_preferences (XfceBG *bg);
-void xfce_bg_load_from_system_preferences (XfceBG *bg);
-void xfce_bg_load_from_system_gsettings (XfceBG *bg,
- GSettings *settings,
- gboolean reset_apply);
-void xfce_bg_load_from_gsettings (XfceBG *bg,
- GSettings *settings);
-void xfce_bg_save_to_preferences (XfceBG *bg);
-void xfce_bg_save_to_gsettings (XfceBG *bg,
- GSettings *settings);
-
-/* Setters */
-void xfce_bg_set_filename (XfceBG *bg,
- const char *filename);
-void xfce_bg_set_placement (XfceBG *bg,
- XfceBGPlacement placement);
-void xfce_bg_set_color (XfceBG *bg,
- XfceBGColorType type,
- GdkRGBA *primary,
- GdkRGBA *secondary);
-void xfce_bg_set_draw_background (XfceBG *bg,
- gboolean draw_background);
-/* Getters */
-gboolean xfce_bg_get_draw_background (XfceBG *bg);
-XfceBGPlacement xfce_bg_get_placement (XfceBG *bg);
-void xfce_bg_get_color (XfceBG *bg,
- XfceBGColorType *type,
- GdkRGBA *primary,
- GdkRGBA *secondary);
-const gchar * xfce_bg_get_filename (XfceBG *bg);
/* Drawing and thumbnailing */
-void xfce_bg_draw (XfceBG *bg,
- GdkPixbuf *dest,
- GdkScreen *screen,
- gboolean is_root);
-
cairo_surface_t *xfce_bg_create_surface (XfceBG *bg,
GdkWindow *window,
int width,
int height,
gboolean root);
-cairo_surface_t *xfce_bg_create_surface_scale (XfceBG *bg,
- GdkWindow *window,
- int width,
- int height,
- int scale,
- gboolean root);
-
-gboolean xfce_bg_get_image_size (XfceBG *bg,
- XfceDesktopThumbnailFactory *factory,
- int best_width,
- int best_height,
- int *width,
- int *height);
-GdkPixbuf * xfce_bg_create_thumbnail (XfceBG *bg,
- XfceDesktopThumbnailFactory *factory,
- GdkScreen *screen,
- int dest_width,
- int dest_height);
-gboolean xfce_bg_is_dark (XfceBG *bg,
- int dest_width,
- int dest_height);
-gboolean xfce_bg_has_multiple_sizes (XfceBG *bg);
-gboolean xfce_bg_changes_with_time (XfceBG *bg);
-GdkPixbuf * xfce_bg_create_frame_thumbnail (XfceBG *bg,
- XfceDesktopThumbnailFactory *factory,
- GdkScreen *screen,
- int dest_width,
- int dest_height,
- int frame_num);
-
-/* Set a surface as root - not a XfceBG method. At some point
- * if we decide to stabilize the API then we may want to make
- * these object methods, drop xfce_bg_create_surface, etc.
- */
-void xfce_bg_set_surface_as_root (GdkScreen *screen,
- cairo_surface_t *surface);
-XfceBGCrossfade *xfce_bg_set_surface_as_root_with_crossfade (GdkScreen *screen,
- cairo_surface_t *surface);
-cairo_surface_t *xfce_bg_get_surface_from_root (GdkScreen *screen);
-
G_END_DECLS
#endif
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.
More information about the Xfce4-commits
mailing list