| File: | capplets/appearance/cafe-wp-item.c |
| Warning: | line 35, column 7 This statement is never executed |
Press '?' to see keyboard shortcuts
Keyboard shortcuts:
| 1 | /* |
| 2 | * Authors: Rodney Dawes <dobey@ximian.com> |
| 3 | * |
| 4 | * Copyright 2003-2006 Novell, Inc. (www.novell.com) |
| 5 | * |
| 6 | * This program is free software; you can redistribute it and/or modify |
| 7 | * it under the terms of version 2 of the GNU General Public License |
| 8 | * as published by the Free Software Foundation |
| 9 | * |
| 10 | * This program is distributed in the hope that it will be useful, |
| 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 13 | * GNU General Public License for more details. |
| 14 | * |
| 15 | * You should have received a copy of the GNU General Public License |
| 16 | * along with this program; if not, write to the Free Software |
| 17 | * Foundation, Inc., 59 Temple Street #330, Boston, MA 02110-1301, USA. |
| 18 | * |
| 19 | */ |
| 20 | |
| 21 | #include <config.h> |
| 22 | |
| 23 | #include <glib/gi18n.h> |
| 24 | #include <gio/gio.h> |
| 25 | #include <string.h> |
| 26 | #include "appearance.h" |
| 27 | #include "cafe-wp-item.h" |
| 28 | |
| 29 | const gchar *wp_item_option_to_string (CafeBGPlacement type) |
| 30 | { |
| 31 | switch (type) |
| 32 | { |
| 33 | case CAFE_BG_PLACEMENT_CENTERED: |
| 34 | return "centered"; |
| 35 | break; |
This statement is never executed | |
| 36 | case CAFE_BG_PLACEMENT_FILL_SCREEN: |
| 37 | return "stretched"; |
| 38 | break; |
| 39 | case CAFE_BG_PLACEMENT_SCALED: |
| 40 | return "scaled"; |
| 41 | break; |
| 42 | case CAFE_BG_PLACEMENT_ZOOMED: |
| 43 | return "zoom"; |
| 44 | break; |
| 45 | case CAFE_BG_PLACEMENT_TILED: |
| 46 | return "wallpaper"; |
| 47 | break; |
| 48 | case CAFE_BG_PLACEMENT_SPANNED: |
| 49 | return "spanned"; |
| 50 | break; |
| 51 | } |
| 52 | return ""; |
| 53 | } |
| 54 | |
| 55 | const gchar *wp_item_shading_to_string (CafeBGColorType type) |
| 56 | { |
| 57 | switch (type) { |
| 58 | case CAFE_BG_COLOR_SOLID: |
| 59 | return "solid"; |
| 60 | break; |
| 61 | case CAFE_BG_COLOR_H_GRADIENT: |
| 62 | return "horizontal-gradient"; |
| 63 | break; |
| 64 | case CAFE_BG_COLOR_V_GRADIENT: |
| 65 | return "vertical-gradient"; |
| 66 | break; |
| 67 | } |
| 68 | return ""; |
| 69 | } |
| 70 | |
| 71 | CafeBGPlacement wp_item_string_to_option (const gchar *option) |
| 72 | { |
| 73 | if (!g_strcmp0(option, "centered")) |
| 74 | return CAFE_BG_PLACEMENT_CENTERED; |
| 75 | else if (!g_strcmp0(option, "stretched")) |
| 76 | return CAFE_BG_PLACEMENT_FILL_SCREEN; |
| 77 | else if (!g_strcmp0(option, "scaled")) |
| 78 | return CAFE_BG_PLACEMENT_SCALED; |
| 79 | else if (!g_strcmp0(option, "zoom")) |
| 80 | return CAFE_BG_PLACEMENT_ZOOMED; |
| 81 | else if (!g_strcmp0(option, "wallpaper")) |
| 82 | return CAFE_BG_PLACEMENT_TILED; |
| 83 | else if (!g_strcmp0(option, "spanned")) |
| 84 | return CAFE_BG_PLACEMENT_SPANNED; |
| 85 | else |
| 86 | return CAFE_BG_PLACEMENT_SCALED; |
| 87 | } |
| 88 | |
| 89 | CafeBGColorType wp_item_string_to_shading (const gchar *shade_type) |
| 90 | { |
| 91 | if (!g_strcmp0(shade_type, "solid")) |
| 92 | return CAFE_BG_COLOR_SOLID; |
| 93 | else if (!g_strcmp0(shade_type, "horizontal-gradient")) |
| 94 | return CAFE_BG_COLOR_H_GRADIENT; |
| 95 | else if (!g_strcmp0(shade_type, "vertical-gradient")) |
| 96 | return CAFE_BG_COLOR_V_GRADIENT; |
| 97 | else |
| 98 | return CAFE_BG_COLOR_SOLID; |
| 99 | } |
| 100 | |
| 101 | static void set_bg_properties (CafeWPItem *item) |
| 102 | { |
| 103 | if (item->filename) |
| 104 | cafe_bg_set_filename (item->bg, item->filename); |
| 105 | |
| 106 | cafe_bg_set_color (item->bg, item->shade_type, item->pcolor, item->scolor); |
| 107 | cafe_bg_set_placement (item->bg, item->options); |
| 108 | } |
| 109 | |
| 110 | void cafe_wp_item_ensure_cafe_bg (CafeWPItem *item) |
| 111 | { |
| 112 | if (!item->bg) { |
| 113 | item->bg = cafe_bg_new (); |
| 114 | |
| 115 | set_bg_properties (item); |
| 116 | } |
| 117 | } |
| 118 | |
| 119 | void cafe_wp_item_update (CafeWPItem *item) { |
| 120 | GSettings *settings; |
| 121 | CdkRGBA color1 = { 0, 0, 0, 1.0 }, color2 = { 0, 0, 0, 1.0 }; |
| 122 | gchar *s; |
| 123 | |
| 124 | settings = g_settings_new (WP_SCHEMA"org.cafe.background"); |
| 125 | |
| 126 | item->options = g_settings_get_enum (settings, WP_OPTIONS_KEY"picture-options"); |
| 127 | |
| 128 | item->shade_type = g_settings_get_enum (settings, WP_SHADING_KEY"color-shading-type"); |
| 129 | |
| 130 | s = g_settings_get_string (settings, WP_PCOLOR_KEY"primary-color"); |
| 131 | if (s != NULL((void*)0)) { |
| 132 | cdk_rgba_parse (&color1, s); |
| 133 | g_free (s); |
| 134 | } |
| 135 | |
| 136 | s = g_settings_get_string (settings, WP_SCOLOR_KEY"secondary-color"); |
| 137 | if (s != NULL((void*)0)) { |
| 138 | cdk_rgba_parse (&color2, s); |
| 139 | g_free (s); |
| 140 | } |
| 141 | |
| 142 | g_object_unref (settings); |
| 143 | |
| 144 | if (item->pcolor != NULL((void*)0)) |
| 145 | cdk_rgba_free (item->pcolor); |
| 146 | |
| 147 | if (item->scolor != NULL((void*)0)) |
| 148 | cdk_rgba_free (item->scolor); |
| 149 | |
| 150 | item->pcolor = cdk_rgba_copy (&color1); |
| 151 | item->scolor = cdk_rgba_copy (&color2); |
| 152 | } |
| 153 | |
| 154 | CafeWPItem * cafe_wp_item_new (const gchar * filename, |
| 155 | GHashTable * wallpapers, |
| 156 | CafeDesktopThumbnailFactory * thumbnails) { |
| 157 | CafeWPItem *item = g_new0 (CafeWPItem, 1)((CafeWPItem *) g_malloc0_n ((1), sizeof (CafeWPItem))); |
| 158 | |
| 159 | item->filename = g_strdup (filename)g_strdup_inline (filename); |
| 160 | item->fileinfo = cafe_wp_info_new (filename, thumbnails); |
| 161 | |
| 162 | if (item->fileinfo != NULL((void*)0) && item->fileinfo->mime_type != NULL((void*)0) && |
| 163 | (g_str_has_prefix (item->fileinfo->mime_type, "image/")(__builtin_constant_p ("image/")? __extension__ ({ const char * const __str = (item->fileinfo->mime_type); const char * const __prefix = ("image/"); gboolean __result = (0); if ( __str == ((void*)0) || __prefix == ((void*)0)) __result = (g_str_has_prefix ) (__str, __prefix); else { const size_t __str_len = strlen ( ((__str) + !(__str))); const size_t __prefix_len = strlen ((( __prefix) + !(__prefix))); if (__str_len >= __prefix_len) __result = memcmp (((__str) + !(__str)), ((__prefix) + !(__prefix)), __prefix_len ) == 0; } __result; }) : (g_str_has_prefix) (item->fileinfo ->mime_type, "image/") ) || |
| 164 | strcmp (item->fileinfo->mime_type, "application/xml") == 0)) { |
| 165 | |
| 166 | if (g_utf8_validate (item->fileinfo->name, -1, NULL((void*)0))) |
| 167 | item->name = g_strdup (item->fileinfo->name)g_strdup_inline (item->fileinfo->name); |
| 168 | else |
| 169 | item->name = g_filename_to_utf8 (item->fileinfo->name, -1, NULL((void*)0), |
| 170 | NULL((void*)0), NULL((void*)0)); |
| 171 | |
| 172 | cafe_wp_item_update (item); |
| 173 | cafe_wp_item_ensure_cafe_bg (item); |
| 174 | cafe_wp_item_update_description (item); |
| 175 | |
| 176 | g_hash_table_insert (wallpapers, item->filename, item); |
| 177 | } else { |
| 178 | cafe_wp_item_free (item); |
| 179 | item = NULL((void*)0); |
| 180 | } |
| 181 | |
| 182 | return item; |
| 183 | } |
| 184 | |
| 185 | void cafe_wp_item_free (CafeWPItem * item) { |
| 186 | if (item == NULL((void*)0)) { |
| 187 | return; |
| 188 | } |
| 189 | |
| 190 | g_free (item->name); |
| 191 | g_free (item->filename); |
| 192 | g_free (item->description); |
| 193 | |
| 194 | if (item->pcolor != NULL((void*)0)) |
| 195 | cdk_rgba_free (item->pcolor); |
| 196 | |
| 197 | if (item->scolor != NULL((void*)0)) |
| 198 | cdk_rgba_free (item->scolor); |
| 199 | |
| 200 | cafe_wp_info_free (item->fileinfo); |
| 201 | if (item->bg) |
| 202 | g_object_unref (item->bg); |
| 203 | |
| 204 | ctk_tree_row_reference_free (item->rowref); |
| 205 | |
| 206 | g_free (item); |
| 207 | } |
| 208 | |
| 209 | static GdkPixbuf * |
| 210 | add_slideshow_frame (GdkPixbuf *pixbuf) |
| 211 | { |
| 212 | GdkPixbuf *sheet, *sheet2; |
| 213 | GdkPixbuf *tmp; |
| 214 | gint w, h; |
| 215 | |
| 216 | w = gdk_pixbuf_get_width (pixbuf); |
| 217 | h = gdk_pixbuf_get_height (pixbuf); |
| 218 | |
| 219 | sheet = gdk_pixbuf_new (GDK_COLORSPACE_RGB, FALSE(0), 8, w, h); |
| 220 | gdk_pixbuf_fill (sheet, 0x00000000); |
| 221 | sheet2 = gdk_pixbuf_new_subpixbuf (sheet, 1, 1, w - 2, h - 2); |
| 222 | gdk_pixbuf_fill (sheet2, 0xffffffff); |
| 223 | g_object_unref (sheet2); |
| 224 | |
| 225 | tmp = gdk_pixbuf_new (GDK_COLORSPACE_RGB, TRUE(!(0)), 8, w + 6, h + 6); |
| 226 | |
| 227 | gdk_pixbuf_fill (tmp, 0x00000000); |
| 228 | gdk_pixbuf_composite (sheet, tmp, 6, 6, w, h, 6.0, 6.0, 1.0, 1.0, GDK_INTERP_NEAREST, 255); |
| 229 | gdk_pixbuf_composite (sheet, tmp, 3, 3, w, h, 3.0, 3.0, 1.0, 1.0, GDK_INTERP_NEAREST, 255); |
| 230 | gdk_pixbuf_composite (pixbuf, tmp, 0, 0, w, h, 0.0, 0.0, 1.0, 1.0, GDK_INTERP_NEAREST, 255); |
| 231 | |
| 232 | g_object_unref (sheet); |
| 233 | |
| 234 | return tmp; |
| 235 | } |
| 236 | |
| 237 | GdkPixbuf * cafe_wp_item_get_frame_thumbnail (CafeWPItem * item, |
| 238 | CafeDesktopThumbnailFactory * thumbs, |
| 239 | int width, |
| 240 | int height, |
| 241 | gint frame) { |
| 242 | GdkPixbuf *pixbuf = NULL((void*)0); |
| 243 | |
| 244 | set_bg_properties (item); |
| 245 | |
| 246 | if (frame != -1) |
| 247 | pixbuf = cafe_bg_create_frame_thumbnail (item->bg, thumbs, cdk_screen_get_default (), width, height, frame); |
| 248 | else |
| 249 | pixbuf = cafe_bg_create_thumbnail (item->bg, thumbs, cdk_screen_get_default(), width, height); |
| 250 | |
| 251 | if (pixbuf && cafe_bg_changes_with_time (item->bg)) |
| 252 | { |
| 253 | GdkPixbuf *tmp; |
| 254 | |
| 255 | tmp = add_slideshow_frame (pixbuf); |
| 256 | g_object_unref (pixbuf); |
| 257 | pixbuf = tmp; |
| 258 | } |
| 259 | |
| 260 | cafe_bg_get_image_size (item->bg, thumbs, width, height, &item->width, &item->height); |
| 261 | |
| 262 | return pixbuf; |
| 263 | } |
| 264 | |
| 265 | |
| 266 | GdkPixbuf * cafe_wp_item_get_thumbnail (CafeWPItem * item, |
| 267 | CafeDesktopThumbnailFactory * thumbs, |
| 268 | gint width, |
| 269 | gint height) { |
| 270 | return cafe_wp_item_get_frame_thumbnail (item, thumbs, width, height, -1); |
| 271 | } |
| 272 | |
| 273 | void cafe_wp_item_update_description (CafeWPItem * item) { |
| 274 | g_free (item->description); |
| 275 | |
| 276 | if (!strcmp (item->filename, "(none)")) { |
| 277 | item->description = g_strdup (item->name)g_strdup_inline (item->name); |
| 278 | } else { |
| 279 | const gchar *description; |
| 280 | gchar *size; |
| 281 | gchar *dirname = g_path_get_dirname (item->filename); |
| 282 | gchar *artist; |
| 283 | |
| 284 | description = NULL((void*)0); |
| 285 | size = NULL((void*)0); |
| 286 | |
| 287 | if (!item->artist || item->artist[0] == 0 || !g_strcmp0(item->artist, "(none)")) |
| 288 | artist = g_strdup (_("unknown"))g_strdup_inline (gettext ("unknown")); |
| 289 | else |
| 290 | artist = g_strdup (item->artist)g_strdup_inline (item->artist); |
| 291 | |
| 292 | if (strcmp (item->fileinfo->mime_type, "application/xml") == 0) |
| 293 | { |
| 294 | if (cafe_bg_changes_with_time (item->bg)) |
| 295 | description = _("Slide Show")gettext ("Slide Show"); |
| 296 | else if (item->width > 0 && item->height > 0) |
| 297 | description = _("Image")gettext ("Image"); |
| 298 | } |
| 299 | else |
| 300 | description = g_content_type_get_description (item->fileinfo->mime_type); |
| 301 | |
| 302 | if (cafe_bg_has_multiple_sizes (item->bg)) |
| 303 | size = g_strdup (_("multiple sizes"))g_strdup_inline (gettext ("multiple sizes")); |
| 304 | else if (item->width > 0 && item->height > 0) { |
| 305 | /* translators: x pixel(s) by y pixel(s) */ |
| 306 | size = g_strdup_printf (_("%d %s by %d %s")gettext ("%d %s by %d %s"), |
| 307 | item->width, |
| 308 | ngettext ("pixel", "pixels", item->width), |
| 309 | item->height, |
| 310 | ngettext ("pixel", "pixels", item->height)); |
| 311 | } |
| 312 | |
| 313 | if (description && size) { |
| 314 | /* translators: <b>wallpaper name</b> |
| 315 | * mime type, size |
| 316 | * Folder: /path/to/file |
| 317 | * Artist: wallpaper author |
| 318 | */ |
| 319 | item->description = g_markup_printf_escaped (_("<b>%s</b>\n"gettext ("<b>%s</b>\n" "%s, %s\n" "Folder: %s\n" "Artist: %s" ) |
| 320 | "%s, %s\n"gettext ("<b>%s</b>\n" "%s, %s\n" "Folder: %s\n" "Artist: %s" ) |
| 321 | "Folder: %s\n"gettext ("<b>%s</b>\n" "%s, %s\n" "Folder: %s\n" "Artist: %s" ) |
| 322 | "Artist: %s")gettext ("<b>%s</b>\n" "%s, %s\n" "Folder: %s\n" "Artist: %s" ), |
| 323 | item->name, |
| 324 | description, |
| 325 | size, |
| 326 | dirname, |
| 327 | artist); |
| 328 | } else { |
| 329 | /* translators: <b>wallpaper name</b> |
| 330 | * Image missing |
| 331 | * Folder: /path/to/file |
| 332 | * Artist: wallpaper author |
| 333 | */ |
| 334 | item->description = g_markup_printf_escaped (_("<b>%s</b>\n"gettext ("<b>%s</b>\n" "%s\n" "Folder: %s\n" "Artist: %s" ) |
| 335 | "%s\n"gettext ("<b>%s</b>\n" "%s\n" "Folder: %s\n" "Artist: %s" ) |
| 336 | "Folder: %s\n"gettext ("<b>%s</b>\n" "%s\n" "Folder: %s\n" "Artist: %s" ) |
| 337 | "Artist: %s")gettext ("<b>%s</b>\n" "%s\n" "Folder: %s\n" "Artist: %s" ), |
| 338 | item->name, |
| 339 | _("Image missing")gettext ("Image missing"), |
| 340 | dirname, |
| 341 | artist); |
| 342 | } |
| 343 | |
| 344 | g_free (size); |
| 345 | g_free (dirname); |
| 346 | g_free (artist); |
| 347 | } |
| 348 | } |