~ubuntu-branches/ubuntu/saucy/gnome-control-center/saucy-proposed

« back to all changes in this revision

Viewing changes to .pc/04_new_appearance_settings.patch/panels/background/cc-background-panel.c

  • Committer: Package Import Robot
  • Author(s): Sebastien Bacher, Sebastien Bacher, Robert Ancell, Iain Lane, Edward Donovan, Rico Tzschichholz, Jeremy Bicha, David Henningsson
  • Date: 2012-11-21 19:32:45 UTC
  • mfrom: (1.1.63)
  • Revision ID: package-import@ubuntu.com-20121121193245-mj61nzz1z4fk3z25
Tags: 1:3.6.3-0ubuntu1
[ Sebastien Bacher ]
* New upstream version
* debian/control.in: recommends libcanberra-pulse (lp: #1004973)
* debian/patches/58_ubuntu_icon_views_redesign.patch:
  - drop most of the changes, keep the different grid size though
    to fit on screen with our extra icons
* debian/patches/91_dont_show_in_unity.patch:
  - dropped, show the upstream printer panel and the layout tab
* debian/patches/revert_git_keyboard_gsettings.patch,
  debian/patches/revert_git_stop_using_gconf.patch:
  - dropped the gconf->gsettings reverts

[ Robert Ancell ]
* New upstream release (LP: #1010317)
* debian/control:
  - Bump build-depends on libgnome-desktop-3-dev, libwacom-dev
  - Add build-depends on libclutter-1.0-dev, libclutter-gtk-1.0-dev,
    libpwquality-dev
  - Drop build-depends on libgnomekbd-dev
* debian/patches/60_ubuntu_nav_bar.patch:
  - Disabled for now, doesn't apply
* debian/patches/revert_ua_gsettings.patch:
  - We can use GSettings for universal access now
* debian/patches/00git_online_accounts_gtkgrid.patch:
* debian/patches/00git_online_accounts_layout.part:
* debian/patches/git_wacom_translations.patch:
  - Applied upstream

[ Iain Lane ]
* Add Build-Depends on libxkbfile-dev
* New upstream release.
* Refresh all patches to apply cleanly.

[ Edward Donovan ]
* debian/source_gnome-control-center.py: Fix for Python 3. (LP: #1013171)

[ Rico Tzschichholz ]
* debian/control.in:
  - Build-depend on gtk-doc-tools instead of docbook directly
  - Bump minimum glib-2.0, gnome-desktop3, gnome-settings-daemon
     and gsettings-desktop-schemas

[ Jeremy Bicha ]
* Dropped more patches applied in new version:
  - git_unmute_sound_event.patch
  - git_fix_big_editable_labels.patch
  - 96_sound_nua_panel.patch
* debian/patches/04_new_appearance_settings.patch:
  - Dropped, this is now packaged separately as gnome-control-center-unity
* debian/patches/10_keyboard_layout_on_unity.patch:
  - Don't change the keyboard panel name when not running Unity
* debian/patches/52_ubuntu_language_list_mods.patch:
  - Don't disable adding current language to the list. While this
    fix shows the current language twice, at least it avoids the
    "Ubuntu suddenly in Chinese" bug (LP: #1035219)
* debian/patches/53_use_ubuntu_help.patch:
  - Only show Ubuntu help when running Unity
* debian/patches/58_hide_gdm_notifications.patch:
  - Hide "Show notifications when locked" settings when running Unity
    since it's a GNOME Shell-specific feature
* debian/patches/63_normal_scrollbar_in_a11y.patch:
  - Drop, overlay-scrollbars should handle this instead
* debian/patches/91_dont_show_in_unity.patch:
  - Hide Printers & Region panels in Unity until we're ready to switch
    to them.
* debian/patches/fix-crash-on-user-panel.patch:
  - Dropped, GNOME says it's obsolete
* debian/rules:
  - Build with -z,defs again
  - Explicitly disable ibus support since ibus 1.4 isn't supported in
    this version
* debian/control.in:
  - Drop ubuntu-docs and gnome-user-guide from recommends to suggests
  - Don't recommend indicators; let's leave that to Unity

[ David Henningsson ]
* sound_nua_panel.patch: Rebase to gnome 3.6 

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/*
2
 
 * Copyright (C) 2010 Intel, Inc
3
 
 *
4
 
 * This program is free software; you can redistribute it and/or modify
5
 
 * it under the terms of the GNU General Public License as published by
6
 
 * the Free Software Foundation; either version 2 of the License, or
7
 
 * (at your option) any later version.
8
 
 *
9
 
 * This program is distributed in the hope that it will be useful,
10
 
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11
 
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
 
 * GNU General Public License for more details.
13
 
 *
14
 
 * You should have received a copy of the GNU General Public License
15
 
 * along with this program; if not, write to the Free Software
16
 
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
17
 
 *
18
 
 * Author: Thomas Wood <thomas.wood@intel.com>
19
 
 *
20
 
 */
21
 
 
22
 
#include <config.h>
23
 
 
24
 
#include <string.h>
25
 
#include <glib/gi18n-lib.h>
26
 
#include <gdesktop-enums.h>
27
 
 
28
 
#include "cc-background-panel.h"
29
 
#include "bg-wallpapers-source.h"
30
 
#include "bg-pictures-source.h"
31
 
#include "bg-colors-source.h"
32
 
 
33
 
#ifdef HAVE_LIBSOCIALWEB
34
 
#include "bg-flickr-source.h"
35
 
#endif
36
 
 
37
 
#include "cc-background-item.h"
38
 
#include "cc-background-xml.h"
39
 
 
40
 
#define WP_PATH_ID "org.gnome.desktop.background"
41
 
#define WP_URI_KEY "picture-uri"
42
 
#define WP_OPTIONS_KEY "picture-options"
43
 
#define WP_SHADING_KEY "color-shading-type"
44
 
#define WP_PCOLOR_KEY "primary-color"
45
 
#define WP_SCOLOR_KEY "secondary-color"
46
 
 
47
 
enum {
48
 
  COL_SOURCE_NAME,
49
 
  COL_SOURCE_TYPE,
50
 
  COL_SOURCE,
51
 
  NUM_COLS
52
 
};
53
 
 
54
 
G_DEFINE_DYNAMIC_TYPE (CcBackgroundPanel, cc_background_panel, CC_TYPE_PANEL)
55
 
 
56
 
#define BACKGROUND_PANEL_PRIVATE(o) \
57
 
  (G_TYPE_INSTANCE_GET_PRIVATE ((o), CC_TYPE_BACKGROUND_PANEL, CcBackgroundPanelPrivate))
58
 
 
59
 
struct _CcBackgroundPanelPrivate
60
 
{
61
 
  GtkBuilder *builder;
62
 
 
63
 
  BgWallpapersSource *wallpapers_source;
64
 
  BgPicturesSource *pictures_source;
65
 
  BgColorsSource *colors_source;
66
 
 
67
 
#ifdef HAVE_LIBSOCIALWEB
68
 
  BgFlickrSource *flickr_source;
69
 
#endif
70
 
 
71
 
  GSettings *settings;
72
 
 
73
 
  GnomeDesktopThumbnailFactory *thumb_factory;
74
 
 
75
 
  CcBackgroundItem *current_background;
76
 
  gint current_source;
77
 
 
78
 
  GCancellable *copy_cancellable;
79
 
 
80
 
  GtkWidget *spinner;
81
 
 
82
 
  GdkPixbuf *display_base;
83
 
  GdkPixbuf *display_overlay;
84
 
};
85
 
 
86
 
enum
87
 
{
88
 
  SOURCE_WALLPAPERS,
89
 
  SOURCE_PICTURES,
90
 
  SOURCE_COLORS,
91
 
#ifdef HAVE_LIBSOCIALWEB
92
 
  SOURCE_FLICKR
93
 
#endif
94
 
};
95
 
 
96
 
 
97
 
#define WID(y) (GtkWidget *) gtk_builder_get_object (priv->builder, y)
98
 
 
99
 
static void
100
 
cc_background_panel_get_property (GObject    *object,
101
 
                                  guint       property_id,
102
 
                                  GValue     *value,
103
 
                                  GParamSpec *pspec)
104
 
{
105
 
  switch (property_id)
106
 
    {
107
 
    default:
108
 
      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
109
 
    }
110
 
}
111
 
 
112
 
static void
113
 
cc_background_panel_set_property (GObject      *object,
114
 
                                  guint         property_id,
115
 
                                  const GValue *value,
116
 
                                  GParamSpec   *pspec)
117
 
{
118
 
  switch (property_id)
119
 
    {
120
 
    default:
121
 
      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
122
 
    }
123
 
}
124
 
 
125
 
static void
126
 
cc_background_panel_dispose (GObject *object)
127
 
{
128
 
  CcBackgroundPanelPrivate *priv = CC_BACKGROUND_PANEL (object)->priv;
129
 
 
130
 
  if (priv->builder)
131
 
    {
132
 
      g_object_unref (priv->builder);
133
 
      priv->builder = NULL;
134
 
 
135
 
      /* destroying the builder object will also destroy the spinner */
136
 
      priv->spinner = NULL;
137
 
    }
138
 
 
139
 
  if (priv->wallpapers_source)
140
 
    {
141
 
      g_object_unref (priv->wallpapers_source);
142
 
      priv->wallpapers_source = NULL;
143
 
    }
144
 
 
145
 
  if (priv->pictures_source)
146
 
    {
147
 
      g_object_unref (priv->pictures_source);
148
 
      priv->pictures_source = NULL;
149
 
    }
150
 
 
151
 
  if (priv->colors_source)
152
 
    {
153
 
      g_object_unref (priv->colors_source);
154
 
      priv->colors_source = NULL;
155
 
    }
156
 
#ifdef HAVE_LIBSOCIALWEB
157
 
  if (priv->flickr_source)
158
 
    {
159
 
      g_object_unref (priv->flickr_source);
160
 
      priv->flickr_source = NULL;
161
 
    }
162
 
#endif
163
 
 
164
 
  if (priv->settings)
165
 
    {
166
 
      g_object_unref (priv->settings);
167
 
      priv->settings = NULL;
168
 
    }
169
 
 
170
 
  if (priv->copy_cancellable)
171
 
    {
172
 
      /* cancel any copy operation */
173
 
      g_cancellable_cancel (priv->copy_cancellable);
174
 
 
175
 
      g_object_unref (priv->copy_cancellable);
176
 
      priv->copy_cancellable = NULL;
177
 
    }
178
 
 
179
 
  if (priv->thumb_factory)
180
 
    {
181
 
      g_object_unref (priv->thumb_factory);
182
 
      priv->thumb_factory = NULL;
183
 
    }
184
 
 
185
 
  if (priv->display_base)
186
 
    {
187
 
      g_object_unref (priv->display_base);
188
 
      priv->display_base = NULL;
189
 
    }
190
 
 
191
 
  if (priv->display_overlay)
192
 
    {
193
 
      g_object_unref (priv->display_overlay);
194
 
      priv->display_overlay = NULL;
195
 
    }
196
 
 
197
 
  G_OBJECT_CLASS (cc_background_panel_parent_class)->dispose (object);
198
 
}
199
 
 
200
 
static void
201
 
cc_background_panel_finalize (GObject *object)
202
 
{
203
 
  CcBackgroundPanelPrivate *priv = CC_BACKGROUND_PANEL (object)->priv;
204
 
 
205
 
  if (priv->current_background)
206
 
    {
207
 
      g_object_unref (priv->current_background);
208
 
      priv->current_background = NULL;
209
 
    }
210
 
 
211
 
  G_OBJECT_CLASS (cc_background_panel_parent_class)->finalize (object);
212
 
}
213
 
 
214
 
static void
215
 
cc_background_panel_class_init (CcBackgroundPanelClass *klass)
216
 
{
217
 
  GObjectClass *object_class = G_OBJECT_CLASS (klass);
218
 
 
219
 
  g_type_class_add_private (klass, sizeof (CcBackgroundPanelPrivate));
220
 
 
221
 
  object_class->get_property = cc_background_panel_get_property;
222
 
  object_class->set_property = cc_background_panel_set_property;
223
 
  object_class->dispose = cc_background_panel_dispose;
224
 
  object_class->finalize = cc_background_panel_finalize;
225
 
}
226
 
 
227
 
static void
228
 
cc_background_panel_class_finalize (CcBackgroundPanelClass *klass)
229
 
{
230
 
}
231
 
 
232
 
static void
233
 
source_update_edit_box (CcBackgroundPanelPrivate *priv,
234
 
                        gboolean                  initial)
235
 
{
236
 
  CcBackgroundItemFlags flags;
237
 
 
238
 
  flags = cc_background_item_get_flags (priv->current_background);
239
 
 
240
 
  if ((flags & CC_BACKGROUND_ITEM_HAS_SCOLOR &&
241
 
       priv->current_source != SOURCE_COLORS) ||
242
 
      cc_background_item_get_shading (priv->current_background) == G_DESKTOP_BACKGROUND_SHADING_SOLID)
243
 
    gtk_widget_hide (WID ("style-scolor"));
244
 
  else
245
 
    gtk_widget_show (WID ("style-scolor"));
246
 
 
247
 
  if (flags & CC_BACKGROUND_ITEM_HAS_PCOLOR &&
248
 
      priv->current_source != SOURCE_COLORS)
249
 
    gtk_widget_hide (WID ("style-pcolor"));
250
 
  else
251
 
    gtk_widget_show (WID ("style-pcolor"));
252
 
 
253
 
  if (gtk_widget_get_visible (WID ("style-pcolor")) &&
254
 
      gtk_widget_get_visible (WID ("style-scolor")))
255
 
    gtk_widget_show (WID ("swap-color-button"));
256
 
  else
257
 
    gtk_widget_hide (WID ("swap-color-button"));
258
 
 
259
 
  if (flags & CC_BACKGROUND_ITEM_HAS_PLACEMENT ||
260
 
      cc_background_item_get_uri (priv->current_background) == NULL)
261
 
    gtk_widget_hide (WID ("style-combobox"));
262
 
  else
263
 
    gtk_widget_show (WID ("style-combobox"));
264
 
 
265
 
  /* FIXME What to do if the background has a gradient shading
266
 
   * and provides the colours? */
267
 
}
268
 
 
269
 
static void
270
 
source_changed_cb (GtkComboBox              *combo,
271
 
                   CcBackgroundPanelPrivate *priv)
272
 
{
273
 
  GtkTreeIter iter;
274
 
  GtkTreeModel *model;
275
 
  GtkIconView *view;
276
 
  guint type;
277
 
  BgSource *source;
278
 
 
279
 
  gtk_combo_box_get_active_iter (combo, &iter);
280
 
  model = gtk_combo_box_get_model (combo);
281
 
  gtk_tree_model_get (model, &iter,
282
 
                      COL_SOURCE_TYPE, &type,
283
 
                      COL_SOURCE, &source, -1);
284
 
 
285
 
  view = (GtkIconView *) gtk_builder_get_object (priv->builder,
286
 
                                                 "backgrounds-iconview");
287
 
 
288
 
  gtk_icon_view_set_model (view,
289
 
                           GTK_TREE_MODEL (bg_source_get_liststore (source)));
290
 
}
291
 
 
292
 
static void
293
 
select_style (GtkComboBox *box,
294
 
              GDesktopBackgroundStyle new_style)
295
 
{
296
 
  GtkTreeModel *model;
297
 
  GtkTreeIter iter;
298
 
  gboolean cont;
299
 
 
300
 
  model = gtk_combo_box_get_model (box);
301
 
  cont = gtk_tree_model_get_iter_first (model, &iter);
302
 
  while (cont != FALSE)
303
 
    {
304
 
      GDesktopBackgroundStyle style;
305
 
 
306
 
      gtk_tree_model_get (model, &iter,
307
 
                          1, &style,
308
 
                          -1);
309
 
 
310
 
      if (style == new_style)
311
 
        {
312
 
          gtk_combo_box_set_active_iter (box, &iter);
313
 
          break;
314
 
        }
315
 
      cont = gtk_tree_model_iter_next (model, &iter);
316
 
    }
317
 
 
318
 
  if (cont == FALSE)
319
 
    gtk_combo_box_set_active (box, -1);
320
 
}
321
 
 
322
 
static void
323
 
update_preview (CcBackgroundPanelPrivate *priv,
324
 
                CcBackgroundItem         *item)
325
 
{
326
 
  gchar *markup;
327
 
  gboolean changes_with_time;
328
 
 
329
 
  if (item && priv->current_background)
330
 
    {
331
 
      g_object_unref (priv->current_background);
332
 
      priv->current_background = cc_background_item_copy (item);
333
 
      cc_background_item_load (priv->current_background, NULL);
334
 
    }
335
 
 
336
 
  source_update_edit_box (priv, FALSE);
337
 
 
338
 
  changes_with_time = FALSE;
339
 
 
340
 
  if (priv->current_background)
341
 
    {
342
 
      GdkColor pcolor, scolor;
343
 
 
344
 
      markup = g_strdup_printf ("<b>%s</b>", cc_background_item_get_name (priv->current_background));
345
 
      gtk_label_set_markup (GTK_LABEL (WID ("background-label")), markup);
346
 
      g_free (markup);
347
 
 
348
 
      gtk_label_set_text (GTK_LABEL (WID ("size_label")), cc_background_item_get_size (priv->current_background));
349
 
 
350
 
      gdk_color_parse (cc_background_item_get_pcolor (priv->current_background), &pcolor);
351
 
      gdk_color_parse (cc_background_item_get_scolor (priv->current_background), &scolor);
352
 
 
353
 
      gtk_color_button_set_color (GTK_COLOR_BUTTON (WID ("style-pcolor")), &pcolor);
354
 
      gtk_color_button_set_color (GTK_COLOR_BUTTON (WID ("style-scolor")), &scolor);
355
 
 
356
 
      select_style (GTK_COMBO_BOX (WID ("style-combobox")),
357
 
                    cc_background_item_get_placement (priv->current_background));
358
 
 
359
 
      changes_with_time = cc_background_item_changes_with_time (priv->current_background);
360
 
    }
361
 
 
362
 
  gtk_widget_set_visible (WID ("slide_image"), changes_with_time);
363
 
  gtk_widget_set_visible (WID ("slide-label"), changes_with_time);
364
 
 
365
 
  gtk_widget_queue_draw (WID ("preview-area"));
366
 
}
367
 
 
368
 
static char *
369
 
get_save_path (void)
370
 
{
371
 
  return g_build_filename (g_get_user_config_dir (),
372
 
                           "gnome-control-center",
373
 
                           "backgrounds",
374
 
                           "last-edited.xml",
375
 
                           NULL);
376
 
}
377
 
 
378
 
static gboolean
379
 
create_save_dir (void)
380
 
{
381
 
  char *path;
382
 
 
383
 
  path = g_build_filename (g_get_user_config_dir (),
384
 
                           "gnome-control-center",
385
 
                           "backgrounds",
386
 
                           NULL);
387
 
  if (g_mkdir_with_parents (path, 0755) < 0)
388
 
    {
389
 
      g_warning ("Failed to create directory '%s'", path);
390
 
      g_free (path);
391
 
      return FALSE;
392
 
    }
393
 
  g_free (path);
394
 
  return TRUE;
395
 
}
396
 
 
397
 
static void
398
 
copy_finished_cb (GObject      *source_object,
399
 
                  GAsyncResult *result,
400
 
                  gpointer      pointer)
401
 
{
402
 
  GError *err = NULL;
403
 
  CcBackgroundPanel *panel = (CcBackgroundPanel *) pointer;
404
 
  CcBackgroundPanelPrivate *priv = panel->priv;
405
 
  CcBackgroundItem *item;
406
 
 
407
 
  if (!g_file_copy_finish (G_FILE (source_object), result, &err))
408
 
    {
409
 
      if (err->code != G_IO_ERROR_CANCELLED)
410
 
        g_warning ("Failed to copy image to cache location: %s", err->message);
411
 
 
412
 
      g_error_free (err);
413
 
    }
414
 
  item = g_object_get_data (source_object, "item");
415
 
 
416
 
  /* the panel may have been destroyed before the callback is run, so be sure
417
 
   * to check the widgets are not NULL */
418
 
 
419
 
  if (priv->spinner)
420
 
    {
421
 
      gtk_widget_destroy (GTK_WIDGET (priv->spinner));
422
 
      priv->spinner = NULL;
423
 
    }
424
 
 
425
 
  if (priv->current_background)
426
 
    cc_background_item_load (priv->current_background, NULL);
427
 
 
428
 
  if (priv->builder)
429
 
    {
430
 
      char *filename;
431
 
 
432
 
      update_preview (priv, item);
433
 
 
434
 
      /* Save the source XML if there is one */
435
 
      filename = get_save_path ();
436
 
      if (create_save_dir ())
437
 
        cc_background_xml_save (priv->current_background, filename);
438
 
    }
439
 
 
440
 
  /* remove the reference taken when the copy was set up */
441
 
  g_object_unref (panel);
442
 
}
443
 
 
444
 
static void
445
 
update_remove_button (CcBackgroundPanel *panel,
446
 
                      CcBackgroundItem  *item)
447
 
{
448
 
  CcBackgroundPanelPrivate *priv;
449
 
  const char *uri;
450
 
  char *cache_path;
451
 
  GFile *bg, *cache, *parent;
452
 
  gboolean sensitive = FALSE;
453
 
 
454
 
  priv = panel->priv;
455
 
 
456
 
  if (priv->current_source != SOURCE_PICTURES)
457
 
    goto bail;
458
 
 
459
 
  uri = cc_background_item_get_uri (item);
460
 
  if (uri == NULL)
461
 
    goto bail;
462
 
 
463
 
  bg = g_file_new_for_uri (uri);
464
 
  parent = g_file_get_parent (bg);
465
 
  if (parent == NULL)
466
 
    {
467
 
      g_object_unref (bg);
468
 
      goto bail;
469
 
    }
470
 
  cache_path = bg_pictures_source_get_cache_path ();
471
 
  cache = g_file_new_for_path (cache_path);
472
 
  g_free (cache_path);
473
 
 
474
 
  if (g_file_equal (parent, cache))
475
 
    sensitive = TRUE;
476
 
 
477
 
  g_object_unref (parent);
478
 
  g_object_unref (cache);
479
 
 
480
 
bail:
481
 
  gtk_widget_set_sensitive (WID ("remove_button"), sensitive);
482
 
 
483
 
}
484
 
 
485
 
static CcBackgroundItem *
486
 
get_selected_item (CcBackgroundPanel *panel)
487
 
{
488
 
  CcBackgroundPanelPrivate *priv = panel->priv;
489
 
  GtkIconView *icon_view;
490
 
  GtkTreeIter iter;
491
 
  GtkTreeModel *model;
492
 
  GList *list;
493
 
  CcBackgroundItem *item;
494
 
 
495
 
  icon_view = GTK_ICON_VIEW (WID ("backgrounds-iconview"));
496
 
  item = NULL;
497
 
  list = gtk_icon_view_get_selected_items (icon_view);
498
 
 
499
 
  if (!list)
500
 
    return NULL;
501
 
 
502
 
  model = gtk_icon_view_get_model (icon_view);
503
 
 
504
 
  if (gtk_tree_model_get_iter (model, &iter, (GtkTreePath*) list->data) == FALSE)
505
 
    goto bail;
506
 
 
507
 
  gtk_tree_model_get (model, &iter, 1, &item, -1);
508
 
 
509
 
bail:
510
 
  g_list_foreach (list, (GFunc)gtk_tree_path_free, NULL);
511
 
  g_list_free (list);
512
 
 
513
 
  return item;
514
 
}
515
 
 
516
 
static void
517
 
backgrounds_changed_cb (GtkIconView       *icon_view,
518
 
                        CcBackgroundPanel *panel)
519
 
{
520
 
  GtkTreeIter iter;
521
 
  GtkTreeModel *model;
522
 
  CcBackgroundItem *item;
523
 
  CcBackgroundPanelPrivate *priv = panel->priv;
524
 
  char *pcolor, *scolor;
525
 
  gboolean draw_preview = TRUE;
526
 
  const char *uri;
527
 
  CcBackgroundItemFlags flags;
528
 
  char *filename;
529
 
 
530
 
  item = get_selected_item (panel);
531
 
 
532
 
  if (item == NULL)
533
 
    return;
534
 
 
535
 
  /* Update current source */
536
 
  model = gtk_combo_box_get_model (GTK_COMBO_BOX (WID ("sources-combobox")));
537
 
  gtk_combo_box_get_active_iter (GTK_COMBO_BOX (WID ("sources-combobox")),
538
 
                                 &iter);
539
 
  gtk_tree_model_get (model, &iter,
540
 
                      COL_SOURCE_TYPE, &priv->current_source, -1);
541
 
 
542
 
  uri = cc_background_item_get_uri (item);
543
 
  flags = cc_background_item_get_flags (item);
544
 
 
545
 
  if ((flags & CC_BACKGROUND_ITEM_HAS_URI) && uri == NULL)
546
 
    {
547
 
      g_settings_set_enum (priv->settings, WP_OPTIONS_KEY, G_DESKTOP_BACKGROUND_STYLE_NONE);
548
 
      g_settings_set_string (priv->settings, WP_URI_KEY, "");
549
 
    }
550
 
  else if (cc_background_item_get_source_url (item) != NULL &&
551
 
           cc_background_item_get_needs_download (item))
552
 
    {
553
 
      GFile *source, *dest;
554
 
      gchar *cache_path, *basename, *dest_path, *display_name, *dest_uri;
555
 
      GdkPixbuf *pixbuf;
556
 
 
557
 
      cache_path = bg_pictures_source_get_cache_path ();
558
 
      if (g_mkdir_with_parents (cache_path, 0755) < 0)
559
 
        {
560
 
          g_warning ("Failed to create directory '%s'", cache_path);
561
 
          g_free (cache_path);
562
 
          return;
563
 
        }
564
 
      g_free (cache_path);
565
 
 
566
 
      dest_path = bg_pictures_source_get_unique_path (cc_background_item_get_source_url (item));
567
 
      dest = g_file_new_for_path (dest_path);
568
 
      g_free (dest_path);
569
 
      source = g_file_new_for_uri (cc_background_item_get_source_url (item));
570
 
      basename = g_file_get_basename (source);
571
 
      display_name = g_filename_display_name (basename);
572
 
      dest_path = g_file_get_path (dest);
573
 
      g_free (basename);
574
 
 
575
 
      /* create a blank image to use until the source image is ready */
576
 
      pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, TRUE, 8, 1, 1);
577
 
      gdk_pixbuf_fill (pixbuf, 0x00000000);
578
 
      gdk_pixbuf_save (pixbuf, dest_path, "png", NULL, NULL);
579
 
      g_object_unref (pixbuf);
580
 
      g_free (dest_path);
581
 
 
582
 
      if (priv->copy_cancellable)
583
 
        {
584
 
          g_cancellable_cancel (priv->copy_cancellable);
585
 
          g_cancellable_reset (priv->copy_cancellable);
586
 
        }
587
 
 
588
 
      if (priv->spinner)
589
 
        {
590
 
          gtk_widget_destroy (GTK_WIDGET (priv->spinner));
591
 
          priv->spinner = NULL;
592
 
        }
593
 
 
594
 
      /* create a spinner while the file downloads */
595
 
      priv->spinner = gtk_spinner_new ();
596
 
      gtk_spinner_start (GTK_SPINNER (priv->spinner));
597
 
      gtk_box_pack_start (GTK_BOX (WID ("bottom-hbox")), priv->spinner, FALSE,
598
 
                          FALSE, 6);
599
 
      gtk_widget_show (priv->spinner);
600
 
 
601
 
      /* reference the panel in case it is removed before the copy is
602
 
       * finished */
603
 
      g_object_ref (panel);
604
 
      g_object_set_data_full (G_OBJECT (source), "item", g_object_ref (item), g_object_unref);
605
 
      g_file_copy_async (source, dest, G_FILE_COPY_OVERWRITE,
606
 
                         G_PRIORITY_DEFAULT, priv->copy_cancellable,
607
 
                         NULL, NULL,
608
 
                         copy_finished_cb, panel);
609
 
      g_object_unref (source);
610
 
      dest_uri = g_file_get_uri (dest);
611
 
      g_object_unref (dest);
612
 
 
613
 
      g_settings_set_string (priv->settings, WP_URI_KEY, dest_uri);
614
 
      g_object_set (G_OBJECT (item),
615
 
                    "uri", dest_uri,
616
 
                    "needs-download", FALSE,
617
 
                    "name", display_name,
618
 
                    NULL);
619
 
      g_free (display_name);
620
 
      g_free (dest_uri);
621
 
 
622
 
      /* delay the updated drawing of the preview until the copy finishes */
623
 
      draw_preview = FALSE;
624
 
    }
625
 
  else
626
 
    {
627
 
      g_settings_set_string (priv->settings, WP_URI_KEY, uri);
628
 
    }
629
 
 
630
 
  /* Also set the placement if we have a URI and the previous value was none */
631
 
  if (flags & CC_BACKGROUND_ITEM_HAS_PLACEMENT)
632
 
    {
633
 
      g_settings_set_enum (priv->settings, WP_OPTIONS_KEY, cc_background_item_get_placement (item));
634
 
    }
635
 
  else if (uri != NULL)
636
 
    {
637
 
      GDesktopBackgroundStyle style;
638
 
      style = g_settings_get_enum (priv->settings, WP_OPTIONS_KEY);
639
 
      if (style == G_DESKTOP_BACKGROUND_STYLE_NONE)
640
 
        g_settings_set_enum (priv->settings, WP_OPTIONS_KEY, cc_background_item_get_placement (item));
641
 
    }
642
 
 
643
 
  if (flags & CC_BACKGROUND_ITEM_HAS_SHADING)
644
 
    g_settings_set_enum (priv->settings, WP_SHADING_KEY, cc_background_item_get_shading (item));
645
 
 
646
 
  /* When changing to a background with colours set,
647
 
   * don't overwrite what's in GSettings, but read
648
 
   * from it instead.
649
 
   * We have a hack for the colors source though */
650
 
  if (flags & CC_BACKGROUND_ITEM_HAS_PCOLOR &&
651
 
      priv->current_source != SOURCE_COLORS)
652
 
    {
653
 
      g_settings_set_string (priv->settings, WP_PCOLOR_KEY, cc_background_item_get_pcolor (item));
654
 
    }
655
 
  else
656
 
    {
657
 
      pcolor = g_settings_get_string (priv->settings, WP_PCOLOR_KEY);
658
 
      g_object_set (G_OBJECT (item), "primary-color", pcolor, NULL);
659
 
    }
660
 
 
661
 
  if (flags & CC_BACKGROUND_ITEM_HAS_SCOLOR &&
662
 
      priv->current_source != SOURCE_COLORS)
663
 
    {
664
 
      g_settings_set_string (priv->settings, WP_SCOLOR_KEY, cc_background_item_get_scolor (item));
665
 
    }
666
 
  else
667
 
    {
668
 
      scolor = g_settings_get_string (priv->settings, WP_SCOLOR_KEY);
669
 
      g_object_set (G_OBJECT (item), "secondary-color", scolor, NULL);
670
 
    }
671
 
 
672
 
  /* Apply all changes */
673
 
  g_settings_apply (priv->settings);
674
 
 
675
 
  update_remove_button (panel, item);
676
 
 
677
 
  /* update the preview information */
678
 
  if (draw_preview != FALSE)
679
 
    {
680
 
      update_preview (priv, item);
681
 
 
682
 
      /* Save the source XML if there is one */
683
 
      filename = get_save_path ();
684
 
      if (create_save_dir ())
685
 
        cc_background_xml_save (priv->current_background, filename);
686
 
    }
687
 
}
688
 
 
689
 
static gboolean
690
 
preview_draw_cb (GtkWidget         *widget,
691
 
                 cairo_t           *cr,
692
 
                 CcBackgroundPanel *panel)
693
 
{
694
 
  GtkAllocation allocation;
695
 
  CcBackgroundPanelPrivate *priv = panel->priv;
696
 
  GdkPixbuf *pixbuf = NULL;
697
 
  const gint preview_width = 416;
698
 
  const gint preview_height = 248;
699
 
  const gint preview_x = 45;
700
 
  const gint preview_y = 84;
701
 
  GdkPixbuf *preview, *temp;
702
 
  gint size;
703
 
 
704
 
  gtk_widget_get_allocation (widget, &allocation);
705
 
 
706
 
  if (priv->current_background)
707
 
    {
708
 
      GIcon *icon;
709
 
      icon = cc_background_item_get_frame_thumbnail (priv->current_background,
710
 
                                                     priv->thumb_factory,
711
 
                                                     preview_width,
712
 
                                                     preview_height,
713
 
                                                     -2, TRUE);
714
 
      pixbuf = GDK_PIXBUF (icon);
715
 
    }
716
 
 
717
 
  if (!priv->display_base)
718
 
    return FALSE;
719
 
 
720
 
 
721
 
  preview = gdk_pixbuf_copy (priv->display_base);
722
 
 
723
 
  if (pixbuf)
724
 
    {
725
 
      gdk_pixbuf_composite (pixbuf, preview,
726
 
                            preview_x, preview_y,
727
 
                            preview_width, preview_height,
728
 
                            preview_x, preview_y, 1, 1,
729
 
                            GDK_INTERP_BILINEAR, 255);
730
 
 
731
 
      g_object_unref (pixbuf);
732
 
    }
733
 
 
734
 
 
735
 
  if (priv->display_overlay)
736
 
    {
737
 
      gdk_pixbuf_composite (priv->display_overlay, preview,
738
 
                            0, 0, 512, 512,
739
 
                            0, 0, 1, 1,
740
 
                            GDK_INTERP_BILINEAR, 255);
741
 
    }
742
 
 
743
 
 
744
 
  if (allocation.width < allocation.height)
745
 
    size = allocation.width;
746
 
  else
747
 
    size = allocation.height;
748
 
 
749
 
  temp = gdk_pixbuf_scale_simple (preview, size, size, GDK_INTERP_BILINEAR);
750
 
 
751
 
  gdk_cairo_set_source_pixbuf (cr,
752
 
                               temp,
753
 
                               allocation.width / 2 - (size / 2),
754
 
                               allocation.height / 2 - (size / 2));
755
 
  cairo_paint (cr);
756
 
 
757
 
  g_object_unref (temp);
758
 
  g_object_unref (preview);
759
 
 
760
 
  return TRUE;
761
 
}
762
 
 
763
 
static void
764
 
style_changed_cb (GtkComboBox       *box,
765
 
                  CcBackgroundPanel *panel)
766
 
{
767
 
  CcBackgroundPanelPrivate *priv = panel->priv;
768
 
  GtkTreeModel *model;
769
 
  GtkTreeIter iter;
770
 
  GDesktopBackgroundStyle value;
771
 
 
772
 
  if (!gtk_combo_box_get_active_iter (box, &iter))
773
 
    {
774
 
      return;
775
 
    }
776
 
 
777
 
  model = gtk_combo_box_get_model (box);
778
 
 
779
 
  gtk_tree_model_get (model, &iter, 1, &value, -1);
780
 
 
781
 
  g_settings_set_enum (priv->settings, WP_OPTIONS_KEY, value);
782
 
 
783
 
  if (priv->current_background)
784
 
    g_object_set (G_OBJECT (priv->current_background), "placement", value, NULL);
785
 
 
786
 
  g_settings_apply (priv->settings);
787
 
 
788
 
  update_preview (priv, NULL);
789
 
}
790
 
 
791
 
static void
792
 
color_changed_cb (GtkColorButton    *button,
793
 
                  CcBackgroundPanel *panel)
794
 
{
795
 
  CcBackgroundPanelPrivate *priv = panel->priv;
796
 
  GdkColor color;
797
 
  gchar *value;
798
 
  gboolean is_pcolor = FALSE;
799
 
 
800
 
  gtk_color_button_get_color (button, &color);
801
 
  if (WID ("style-pcolor") == GTK_WIDGET (button))
802
 
    is_pcolor = TRUE;
803
 
 
804
 
  value = gdk_color_to_string (&color);
805
 
 
806
 
  if (priv->current_background)
807
 
    {
808
 
      g_object_set (G_OBJECT (priv->current_background),
809
 
                    is_pcolor ? "primary-color" : "secondary-color", value, NULL);
810
 
    }
811
 
 
812
 
  g_settings_set_string (priv->settings,
813
 
                         is_pcolor ? WP_PCOLOR_KEY : WP_SCOLOR_KEY, value);
814
 
 
815
 
  g_settings_apply (priv->settings);
816
 
 
817
 
  g_free (value);
818
 
 
819
 
  update_preview (priv, NULL);
820
 
}
821
 
 
822
 
static void
823
 
swap_colors_clicked (GtkButton         *button,
824
 
                     CcBackgroundPanel *panel)
825
 
{
826
 
  CcBackgroundPanelPrivate *priv = panel->priv;
827
 
  GdkColor pcolor, scolor;
828
 
  char *new_pcolor, *new_scolor;
829
 
 
830
 
  gtk_color_button_get_color (GTK_COLOR_BUTTON (WID ("style-pcolor")), &pcolor);
831
 
  gtk_color_button_get_color (GTK_COLOR_BUTTON (WID ("style-scolor")), &scolor);
832
 
 
833
 
  gtk_color_button_set_color (GTK_COLOR_BUTTON (WID ("style-scolor")), &pcolor);
834
 
  gtk_color_button_set_color (GTK_COLOR_BUTTON (WID ("style-pcolor")), &scolor);
835
 
 
836
 
  new_pcolor = gdk_color_to_string (&scolor);
837
 
  new_scolor = gdk_color_to_string (&pcolor);
838
 
 
839
 
  g_object_set (priv->current_background,
840
 
                "primary-color", new_pcolor,
841
 
                "secondary-color", new_scolor,
842
 
                NULL);
843
 
 
844
 
  g_settings_set_string (priv->settings, WP_PCOLOR_KEY, new_pcolor);
845
 
  g_settings_set_string (priv->settings, WP_SCOLOR_KEY, new_scolor);
846
 
 
847
 
  g_free (new_pcolor);
848
 
  g_free (new_scolor);
849
 
 
850
 
  g_settings_apply (priv->settings);
851
 
 
852
 
  update_preview (priv, NULL);
853
 
}
854
 
 
855
 
static void
856
 
row_inserted (GtkTreeModel      *tree_model,
857
 
              GtkTreePath       *path,
858
 
              GtkTreeIter       *iter,
859
 
              CcBackgroundPanel *panel)
860
 
{
861
 
  GtkListStore *store;
862
 
  CcBackgroundPanelPrivate *priv;
863
 
 
864
 
  priv = panel->priv;
865
 
 
866
 
  store = bg_source_get_liststore (BG_SOURCE (panel->priv->pictures_source));
867
 
  g_signal_handlers_disconnect_by_func (G_OBJECT (store), G_CALLBACK (row_inserted), panel);
868
 
 
869
 
  /* Change source */
870
 
  gtk_combo_box_set_active (GTK_COMBO_BOX (WID ("sources-combobox")), SOURCE_PICTURES);
871
 
 
872
 
  /* And select the newly added item */
873
 
  gtk_icon_view_select_path (GTK_ICON_VIEW (WID ("backgrounds-iconview")), path);
874
 
}
875
 
 
876
 
static void
877
 
add_custom_wallpaper (CcBackgroundPanel *panel,
878
 
                      const char        *uri)
879
 
{
880
 
  GtkListStore *store;
881
 
 
882
 
  store = bg_source_get_liststore (BG_SOURCE (panel->priv->pictures_source));
883
 
  g_signal_connect (G_OBJECT (store), "row-inserted",
884
 
                    G_CALLBACK (row_inserted), panel);
885
 
 
886
 
  if (bg_pictures_source_add (panel->priv->pictures_source, uri) == FALSE) {
887
 
    g_signal_handlers_disconnect_by_func (G_OBJECT (store), G_CALLBACK (row_inserted), panel);
888
 
    return;
889
 
  }
890
 
 
891
 
  /* Wait for the item to get added */
892
 
}
893
 
 
894
 
static void
895
 
file_chooser_response (GtkDialog         *chooser,
896
 
                       gint               response,
897
 
                       CcBackgroundPanel *panel)
898
 
{
899
 
  GSList *selected, *l;
900
 
 
901
 
  if (response != GTK_RESPONSE_ACCEPT)
902
 
    {
903
 
      gtk_widget_destroy (GTK_WIDGET (chooser));
904
 
      return;
905
 
    }
906
 
 
907
 
  selected = gtk_file_chooser_get_uris (GTK_FILE_CHOOSER (chooser));
908
 
  gtk_widget_destroy (GTK_WIDGET (chooser));
909
 
 
910
 
  for (l = selected; l != NULL; l = l->next)
911
 
    {
912
 
      char *uri = l->data;
913
 
      add_custom_wallpaper (panel, uri);
914
 
      g_free (uri);
915
 
    }
916
 
  g_slist_free (selected);
917
 
}
918
 
 
919
 
static void
920
 
update_chooser_preview (GtkFileChooser    *chooser,
921
 
                        CcBackgroundPanel *panel)
922
 
{
923
 
  GnomeDesktopThumbnailFactory *thumb_factory;
924
 
  char *uri;
925
 
 
926
 
  thumb_factory = panel->priv->thumb_factory;
927
 
 
928
 
  uri = gtk_file_chooser_get_preview_uri (chooser);
929
 
 
930
 
  if (uri)
931
 
    {
932
 
      GdkPixbuf *pixbuf = NULL;
933
 
      const gchar *mime_type = NULL;
934
 
      GFile *file;
935
 
      GFileInfo *file_info;
936
 
      GtkWidget *preview;
937
 
 
938
 
      preview = gtk_file_chooser_get_preview_widget (chooser);
939
 
 
940
 
      file = g_file_new_for_uri (uri);
941
 
      file_info = g_file_query_info (file,
942
 
                                     G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE,
943
 
                                     G_FILE_QUERY_INFO_NONE,
944
 
                                     NULL, NULL);
945
 
      g_object_unref (file);
946
 
 
947
 
      if (file_info != NULL) {
948
 
              mime_type = g_file_info_get_content_type (file_info);
949
 
              g_object_unref (file_info);
950
 
      }
951
 
 
952
 
      if (mime_type)
953
 
        {
954
 
        pixbuf = gnome_desktop_thumbnail_factory_generate_thumbnail (thumb_factory,
955
 
                                                                     uri,
956
 
                                                                     mime_type);
957
 
        }
958
 
 
959
 
      gtk_dialog_set_response_sensitive (GTK_DIALOG (chooser),
960
 
                                         GTK_RESPONSE_ACCEPT,
961
 
                                         (pixbuf != NULL));
962
 
 
963
 
      if (pixbuf != NULL)
964
 
        {
965
 
          gtk_image_set_from_pixbuf (GTK_IMAGE (preview), pixbuf);
966
 
          g_object_unref (pixbuf);
967
 
        }
968
 
      else
969
 
        {
970
 
          gtk_image_set_from_stock (GTK_IMAGE (preview),
971
 
                                    GTK_STOCK_DIALOG_QUESTION,
972
 
                                    GTK_ICON_SIZE_DIALOG);
973
 
        }
974
 
 
975
 
      if (bg_pictures_source_is_known (panel->priv->pictures_source, uri))
976
 
        gtk_dialog_set_response_sensitive (GTK_DIALOG (chooser), GTK_RESPONSE_ACCEPT, FALSE);
977
 
      else
978
 
        gtk_dialog_set_response_sensitive (GTK_DIALOG (chooser), GTK_RESPONSE_ACCEPT, TRUE);
979
 
 
980
 
      g_free (uri);
981
 
    }
982
 
 
983
 
  gtk_file_chooser_set_preview_widget_active (chooser, TRUE);
984
 
}
985
 
 
986
 
static void
987
 
add_button_clicked (GtkButton         *button,
988
 
                    CcBackgroundPanel *panel)
989
 
{
990
 
  GtkWidget *chooser;
991
 
  const gchar *folder;
992
 
  GtkWidget *preview;
993
 
  GtkFileFilter *filter;
994
 
  CcBackgroundPanelPrivate *priv;
995
 
 
996
 
  priv = panel->priv;
997
 
 
998
 
  filter = gtk_file_filter_new ();
999
 
  gtk_file_filter_add_mime_type (filter, "image/*");
1000
 
 
1001
 
  chooser = gtk_file_chooser_dialog_new (_("Browse for more pictures"),
1002
 
                                         GTK_WINDOW (gtk_widget_get_toplevel (WID ("background-panel"))),
1003
 
                                         GTK_FILE_CHOOSER_ACTION_OPEN,
1004
 
                                         GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
1005
 
                                         GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
1006
 
                                         NULL);
1007
 
  gtk_file_chooser_set_filter (GTK_FILE_CHOOSER (chooser), filter);
1008
 
  gtk_file_chooser_set_select_multiple (GTK_FILE_CHOOSER (chooser), TRUE);
1009
 
 
1010
 
  gtk_window_set_modal (GTK_WINDOW (chooser), TRUE);
1011
 
 
1012
 
  preview = gtk_image_new ();
1013
 
  gtk_widget_set_size_request (preview, 128, -1);
1014
 
  gtk_file_chooser_set_preview_widget (GTK_FILE_CHOOSER (chooser), preview);
1015
 
  gtk_file_chooser_set_use_preview_label (GTK_FILE_CHOOSER (chooser), FALSE);
1016
 
  gtk_widget_show (preview);
1017
 
  g_signal_connect (chooser, "update-preview",
1018
 
                    G_CALLBACK (update_chooser_preview), panel);
1019
 
 
1020
 
  folder = g_get_user_special_dir (G_USER_DIRECTORY_PICTURES);
1021
 
  if (folder)
1022
 
    gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (chooser),
1023
 
                                         folder);
1024
 
 
1025
 
  g_signal_connect (chooser, "response",
1026
 
                    G_CALLBACK (file_chooser_response), panel);
1027
 
 
1028
 
  gtk_window_present (GTK_WINDOW (chooser));
1029
 
}
1030
 
 
1031
 
static void
1032
 
remove_button_clicked (GtkButton         *button,
1033
 
                       CcBackgroundPanel *panel)
1034
 
{
1035
 
  CcBackgroundItem *item;
1036
 
  GtkListStore *store;
1037
 
  GtkTreePath *path;
1038
 
  CcBackgroundPanelPrivate *priv;
1039
 
 
1040
 
  priv = panel->priv;
1041
 
 
1042
 
  item = get_selected_item (panel);
1043
 
  if (item == NULL)
1044
 
    g_assert_not_reached ();
1045
 
 
1046
 
  bg_pictures_source_remove (panel->priv->pictures_source, item);
1047
 
  g_object_unref (item);
1048
 
 
1049
 
  /* Are there any items left in the pictures tree store? */
1050
 
  store = bg_source_get_liststore (BG_SOURCE (panel->priv->pictures_source));
1051
 
  if (gtk_tree_model_iter_n_children (GTK_TREE_MODEL (store), NULL) == 0)
1052
 
    gtk_combo_box_set_active (GTK_COMBO_BOX (WID ("sources-combobox")), SOURCE_WALLPAPERS);
1053
 
 
1054
 
  path = gtk_tree_path_new_from_string ("0");
1055
 
  gtk_icon_view_select_path (GTK_ICON_VIEW (WID ("backgrounds-iconview")), path);
1056
 
  gtk_tree_path_free (path);
1057
 
}
1058
 
 
1059
 
static void
1060
 
load_current_bg (CcBackgroundPanel *self)
1061
 
{
1062
 
  CcBackgroundPanelPrivate *priv;
1063
 
  CcBackgroundItem *saved, *configured;
1064
 
  gchar *uri, *pcolor, *scolor;
1065
 
 
1066
 
  priv = self->priv;
1067
 
 
1068
 
  /* Load the saved configuration */
1069
 
  uri = get_save_path ();
1070
 
  saved = cc_background_xml_get_item (uri);
1071
 
  g_free (uri);
1072
 
 
1073
 
  /* initalise the current background information from settings */
1074
 
  uri = g_settings_get_string (priv->settings, WP_URI_KEY);
1075
 
  if (uri && *uri == '\0')
1076
 
    {
1077
 
      g_free (uri);
1078
 
      uri = NULL;
1079
 
    }
1080
 
  else
1081
 
    {
1082
 
      GFile *file;
1083
 
 
1084
 
      file = g_file_new_for_commandline_arg (uri);
1085
 
      g_object_unref (file);
1086
 
    }
1087
 
  configured = cc_background_item_new (uri);
1088
 
  g_free (uri);
1089
 
 
1090
 
  pcolor = g_settings_get_string (priv->settings, WP_PCOLOR_KEY);
1091
 
  scolor = g_settings_get_string (priv->settings, WP_SCOLOR_KEY);
1092
 
  g_object_set (G_OBJECT (configured),
1093
 
                "name", _("Current background"),
1094
 
                "placement", g_settings_get_enum (priv->settings, WP_OPTIONS_KEY),
1095
 
                "shading", g_settings_get_enum (priv->settings, WP_SHADING_KEY),
1096
 
                "primary-color", pcolor,
1097
 
                "secondary-color", scolor,
1098
 
                NULL);
1099
 
  g_free (pcolor);
1100
 
  g_free (scolor);
1101
 
 
1102
 
  if (saved != NULL && cc_background_item_compare (saved, configured))
1103
 
    {
1104
 
      CcBackgroundItemFlags flags;
1105
 
      flags = cc_background_item_get_flags (saved);
1106
 
      /* Special case for colours */
1107
 
      if (cc_background_item_get_placement (saved) == G_DESKTOP_BACKGROUND_STYLE_NONE)
1108
 
        flags &=~ (CC_BACKGROUND_ITEM_HAS_PCOLOR | CC_BACKGROUND_ITEM_HAS_SCOLOR);
1109
 
      g_object_set (G_OBJECT (configured),
1110
 
                    "name", cc_background_item_get_name (saved),
1111
 
                    "flags", flags,
1112
 
                    "source-url", cc_background_item_get_source_url (saved),
1113
 
                    "source-xml", cc_background_item_get_source_xml (saved),
1114
 
                    NULL);
1115
 
    }
1116
 
  if (saved != NULL)
1117
 
    g_object_unref (saved);
1118
 
 
1119
 
  priv->current_background = configured;
1120
 
  cc_background_item_load (priv->current_background, NULL);
1121
 
}
1122
 
 
1123
 
static void
1124
 
scrolled_realize_cb (GtkWidget         *scrolled,
1125
 
                     CcBackgroundPanel *self)
1126
 
{
1127
 
  /* FIXME, hack for https://bugzilla.gnome.org/show_bug.cgi?id=645649 */
1128
 
  GdkScreen *screen;
1129
 
  GdkRectangle rect;
1130
 
  int monitor;
1131
 
 
1132
 
  screen = gtk_widget_get_screen (scrolled);
1133
 
  monitor = gdk_screen_get_monitor_at_window (screen, gtk_widget_get_window (scrolled));
1134
 
  gdk_screen_get_monitor_geometry (screen, monitor, &rect);
1135
 
  if (rect.height <= 768)
1136
 
    g_object_set (G_OBJECT (scrolled), "height-request", 280, NULL);
1137
 
}
1138
 
 
1139
 
static void
1140
 
cc_background_panel_drag_uris (GtkWidget *widget,
1141
 
                               GdkDragContext *context, gint x, gint y,
1142
 
                               GtkSelectionData *data, guint info, guint time,
1143
 
                               CcBackgroundPanel *panel)
1144
 
{
1145
 
  gint i;
1146
 
  char *uri;
1147
 
  gchar **uris;
1148
 
 
1149
 
  uris = gtk_selection_data_get_uris (data);
1150
 
  if (!uris)
1151
 
    return;
1152
 
 
1153
 
  gtk_drag_finish (context, TRUE, FALSE, time);
1154
 
 
1155
 
  for (i = 0; uris[i] != NULL; i++) {
1156
 
    uri = uris[i];
1157
 
    if (!bg_pictures_source_is_known (panel->priv->pictures_source, uri)) {
1158
 
      add_custom_wallpaper (panel, uri);
1159
 
    }
1160
 
  }
1161
 
 
1162
 
  g_strfreev(uris);
1163
 
}
1164
 
 
1165
 
static void
1166
 
cc_background_panel_init (CcBackgroundPanel *self)
1167
 
{
1168
 
  CcBackgroundPanelPrivate *priv;
1169
 
  gchar *objects[] = { "style-liststore",
1170
 
      "sources-liststore", "background-panel", "sizegroup", NULL };
1171
 
  GError *err = NULL;
1172
 
  GtkWidget *widget;
1173
 
  GtkListStore *store;
1174
 
  GtkStyleContext *context;
1175
 
 
1176
 
  priv = self->priv = BACKGROUND_PANEL_PRIVATE (self);
1177
 
 
1178
 
  priv->builder = gtk_builder_new ();
1179
 
 
1180
 
  gtk_builder_add_objects_from_file (priv->builder,
1181
 
                                     DATADIR"/background.ui",
1182
 
                                     objects, &err);
1183
 
 
1184
 
  if (err)
1185
 
    {
1186
 
      g_warning ("Could not load ui: %s", err->message);
1187
 
      g_error_free (err);
1188
 
      return;
1189
 
    }
1190
 
 
1191
 
  /* See shell_notify_cb for details */
1192
 
  g_signal_connect (WID ("scrolledwindow1"), "realize",
1193
 
                    G_CALLBACK (scrolled_realize_cb), self);
1194
 
 
1195
 
  priv->settings = g_settings_new (WP_PATH_ID);
1196
 
  g_settings_delay (priv->settings);
1197
 
 
1198
 
  store = (GtkListStore*) gtk_builder_get_object (priv->builder,
1199
 
                                                  "sources-liststore");
1200
 
 
1201
 
  priv->wallpapers_source = bg_wallpapers_source_new ();
1202
 
  gtk_list_store_insert_with_values (store, NULL, G_MAXINT,
1203
 
                                     COL_SOURCE_NAME, _("Wallpapers"),
1204
 
                                     COL_SOURCE_TYPE, SOURCE_WALLPAPERS,
1205
 
                                     COL_SOURCE, priv->wallpapers_source,
1206
 
                                     -1);
1207
 
 
1208
 
  priv->pictures_source = bg_pictures_source_new ();
1209
 
  gtk_list_store_insert_with_values (store, NULL, G_MAXINT,
1210
 
                                     COL_SOURCE_NAME, _("Pictures Folder"),
1211
 
                                     COL_SOURCE_TYPE, SOURCE_PICTURES,
1212
 
                                     COL_SOURCE, priv->pictures_source,
1213
 
                                     -1);
1214
 
 
1215
 
  priv->colors_source = bg_colors_source_new ();
1216
 
  gtk_list_store_insert_with_values (store, NULL, G_MAXINT,
1217
 
                                     COL_SOURCE_NAME, _("Colors & Gradients"),
1218
 
                                     COL_SOURCE_TYPE, SOURCE_COLORS,
1219
 
                                     COL_SOURCE, priv->colors_source,
1220
 
                                     -1);
1221
 
 
1222
 
#ifdef HAVE_LIBSOCIALWEB
1223
 
  priv->flickr_source = bg_flickr_source_new ();
1224
 
  gtk_list_store_insert_with_values (store, NULL, G_MAXINT,
1225
 
                                     COL_SOURCE_NAME, _("Flickr"),
1226
 
                                     COL_SOURCE_TYPE, SOURCE_FLICKR,
1227
 
                                     COL_SOURCE, priv->flickr_source,
1228
 
                                     -1);
1229
 
#endif
1230
 
 
1231
 
 
1232
 
  /* add the top level widget */
1233
 
  widget = WID ("background-panel");
1234
 
 
1235
 
  gtk_container_add (GTK_CONTAINER (self), widget);
1236
 
  gtk_widget_show_all (GTK_WIDGET (self));
1237
 
 
1238
 
  /* connect to source change signal */
1239
 
  widget = WID ("sources-combobox");
1240
 
  g_signal_connect (widget, "changed", G_CALLBACK (source_changed_cb), priv);
1241
 
 
1242
 
  /* select first item */
1243
 
  gtk_combo_box_set_active (GTK_COMBO_BOX (widget), 0);
1244
 
 
1245
 
  /* connect to the background iconview change signal */
1246
 
  widget = WID ("backgrounds-iconview");
1247
 
  g_signal_connect (widget, "selection-changed",
1248
 
                    G_CALLBACK (backgrounds_changed_cb),
1249
 
                    self);
1250
 
 
1251
 
  /* Join treeview and buttons */
1252
 
  widget = WID ("scrolledwindow1");
1253
 
  context = gtk_widget_get_style_context (widget);
1254
 
  gtk_style_context_set_junction_sides (context, GTK_JUNCTION_BOTTOM);
1255
 
  widget = WID ("toolbar1");
1256
 
  context = gtk_widget_get_style_context (widget);
1257
 
  gtk_style_context_set_junction_sides (context, GTK_JUNCTION_TOP);
1258
 
 
1259
 
  g_signal_connect (WID ("add_button"), "clicked",
1260
 
                    G_CALLBACK (add_button_clicked), self);
1261
 
  g_signal_connect (WID ("remove_button"), "clicked",
1262
 
                    G_CALLBACK (remove_button_clicked), self);
1263
 
 
1264
 
  /* Add drag and drop support for bg images */
1265
 
  widget = WID ("scrolledwindow1");
1266
 
  gtk_drag_dest_set (widget, GTK_DEST_DEFAULT_ALL, NULL, 0, GDK_ACTION_COPY);
1267
 
  gtk_drag_dest_add_uri_targets (widget);
1268
 
  g_signal_connect (widget, "drag-data-received",
1269
 
                    G_CALLBACK (cc_background_panel_drag_uris), self);
1270
 
 
1271
 
 
1272
 
  /* setup preview area */
1273
 
  gtk_label_set_ellipsize (GTK_LABEL (WID ("background-label")), PANGO_ELLIPSIZE_END);
1274
 
  widget = WID ("preview-area");
1275
 
  g_signal_connect (widget, "draw", G_CALLBACK (preview_draw_cb),
1276
 
                    self);
1277
 
 
1278
 
  priv->display_base = gdk_pixbuf_new_from_file (DATADIR "/display-base.png",
1279
 
                                                 NULL);
1280
 
  priv->display_overlay = gdk_pixbuf_new_from_file (DATADIR
1281
 
                                                    "/display-overlay.png",
1282
 
                                                    NULL);
1283
 
 
1284
 
  g_signal_connect (WID ("style-combobox"), "changed",
1285
 
                    G_CALLBACK (style_changed_cb), self);
1286
 
 
1287
 
  g_signal_connect (WID ("style-pcolor"), "color-set",
1288
 
                    G_CALLBACK (color_changed_cb), self);
1289
 
  g_signal_connect (WID ("style-scolor"), "color-set",
1290
 
                    G_CALLBACK (color_changed_cb), self);
1291
 
  g_signal_connect (WID ("swap-color-button"), "clicked",
1292
 
                    G_CALLBACK (swap_colors_clicked), self);
1293
 
 
1294
 
  priv->copy_cancellable = g_cancellable_new ();
1295
 
 
1296
 
  priv->thumb_factory = gnome_desktop_thumbnail_factory_new (GNOME_DESKTOP_THUMBNAIL_SIZE_NORMAL);
1297
 
 
1298
 
  load_current_bg (self);
1299
 
 
1300
 
  update_preview (priv, NULL);
1301
 
 
1302
 
  /* Setup the edit box with our current settings */
1303
 
  source_update_edit_box (priv, TRUE);
1304
 
}
1305
 
 
1306
 
void
1307
 
cc_background_panel_register (GIOModule *module)
1308
 
{
1309
 
  cc_background_panel_register_type (G_TYPE_MODULE (module));
1310
 
  g_io_extension_point_implement (CC_SHELL_PANEL_EXTENSION_POINT,
1311
 
                                  CC_TYPE_BACKGROUND_PANEL,
1312
 
                                  "background", 0);
1313
 
}
1314