[gnome-control-center/wip/background-content] New background panel design
- From: William Jon McCann <mccann src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-control-center/wip/background-content] New background panel design
- Date: Tue, 22 May 2012 15:48:59 +0000 (UTC)
commit 5c8ddbc044ae32115c636be02b5f57a03c2d35d2
Author: William Jon McCann <jmccann redhat com>
Date: Tue May 22 11:34:20 2012 -0400
New background panel design
panels/background/Makefile.am | 1 -
panels/background/background.ui | 352 +++-------
panels/background/cc-background-panel.c | 1138 +++++--------------------------
panels/background/display-base.png | Bin 22374 -> 0 bytes
panels/background/display-overlay.png | Bin 9549 -> 6700 bytes
5 files changed, 259 insertions(+), 1232 deletions(-)
---
diff --git a/panels/background/Makefile.am b/panels/background/Makefile.am
index b359ea2..f5d17f2 100644
--- a/panels/background/Makefile.am
+++ b/panels/background/Makefile.am
@@ -4,7 +4,6 @@ cappletname = background
uidir = $(pkgdatadir)/ui/background
dist_ui_DATA = \
background.ui \
- display-base.png \
display-overlay.png
slideshowicondir = $(datadir)/icons/hicolor/scalable/categories/
diff --git a/panels/background/background.ui b/panels/background/background.ui
index 8ddfbec..bb31b5e 100644
--- a/panels/background/background.ui
+++ b/panels/background/background.ui
@@ -1,76 +1,74 @@
-<?xml version="1.0"?>
+<?xml version="1.0" encoding="UTF-8"?>
<interface>
- <requires lib="gtk+" version="2.16"/>
- <!-- interface-naming-policy project-wide -->
- <object class="GtkListStore" id="sources-liststore">
- <columns>
- <!-- column-name source-name -->
- <column type="gchararray"/>
- <!-- column-name source-id -->
- <column type="guint"/>
- <!-- column-name source-pointer -->
- <column type="gpointer"/>
- </columns>
- </object>
+ <!-- interface-requires gtk+ 3.0 -->
<object class="GtkHBox" id="background-panel">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="border_width">10</property>
<property name="spacing">12</property>
<child>
- <object class="GtkVBox" id="vbox2">
+ <object class="GtkVBox" id="vbox3">
<property name="visible">True</property>
- <property name="orientation">vertical</property>
- <property name="spacing">0</property>
- <child>
- <object class="GtkComboBox" id="sources-combobox">
- <property name="visible">True</property>
- <property name="model">sources-liststore</property>
- <child>
- <object class="GtkCellRendererText" id="cellrenderertext2"/>
- <attributes>
- <attribute name="text">0</attribute>
- </attributes>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="position">0</property>
- <property name="padding">6</property>
- </packing>
- </child>
+ <property name="can_focus">False</property>
+ <property name="spacing">6</property>
<child>
- <object class="GtkScrolledWindow" id="scrolledwindow1">
- <property name="width_request">220</property>
- <property name="height_request">380</property>
+ <object class="GtkAspectFrame" id="aspectframe1">
<property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="hscrollbar_policy">automatic</property>
- <property name="vscrollbar_policy">automatic</property>
- <property name="shadow_type">in</property>
+ <property name="can_focus">False</property>
+ <property name="margin_left">12</property>
+ <property name="label_xalign">0</property>
+ <property name="shadow_type">none</property>
<child>
- <object class="GtkIconView" id="backgrounds-iconview">
+ <object class="GtkButton" id="background-set-button">
+ <property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
- <property name="row_spacing">0</property>
- <property name="column_spacing">0</property>
- <property name="margin">0</property>
- <child>
- <object class="GtkCellRendererPixbuf" id="pixbuf-renderer">
- <property name="stock_size">6</property>
- </object>
- <attributes>
- <attribute name="gicon">0</attribute>
- </attributes>
- </child>
+ <property name="receives_default">True</property>
+ <property name="valign">center</property>
<child>
- <!-- this cell renderer is here just to have
- the text spoken in orca -->
- <object class="GtkCellRendererText" id="text-renderer">
- <property name="visible">False</property>
+ <object class="GtkBox" id="box1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="spacing">18</property>
+ <child>
+ <object class="GtkDrawingArea" id="background-desktop-drawingarea">
+ <property name="width_request">417</property>
+ <property name="height_request">250</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">center</property>
+ <property name="margin_left">6</property>
+ <property name="margin_right">6</property>
+ <property name="margin_top">6</property>
+ <property name="margin_bottom">6</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkDrawingArea" id="background-lock-drawingarea">
+ <property name="can_focus">False</property>
+ <property name="no_show_all">True</property>
+ <property name="valign">center</property>
+ <property name="margin_left">6</property>
+ <property name="margin_right">6</property>
+ <property name="margin_top">6</property>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
</object>
- <attributes>
- <attribute name="text">2</attribute>
- </attributes>
</child>
</object>
</child>
@@ -78,265 +76,88 @@
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkToolbar" id="toolbar1">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="icon_size">1</property>
- <property name="toolbar-style">icons</property>
- <style>
- <class name="inline-toolbar"/>
- </style>
- <child>
- <object class="GtkToolButton" id="add_button">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Add wallpaper</property>
- <property name="use_action_appearance">False</property>
- <property name="use_underline">True</property>
- <property name="icon_name">list-add-symbolic</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="homogeneous">True</property>
- </packing>
- </child>
- <child>
- <object class="GtkToolButton" id="remove_button">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Remove wallpaper</property>
- <property name="use_action_appearance">False</property>
- <property name="use_underline">True</property>
- <property name="icon_name">list-remove-symbolic</property>
- <property name="sensitive">False</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="homogeneous">True</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">2</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkVBox" id="vbox3">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="spacing">6</property>
- <child>
- <object class="GtkHBox" id="heading-hbox">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="spacing">24</property>
- <child>
- <object class="GtkLabel" id="background-label">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="xalign">0</property>
- <property name="label">Current background</property>
- <attributes>
- <attribute name="weight" value="bold"/>
- </attributes>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkLabel" id="size_label">
- <property name="visible">True</property>
- <property name="xalign">1</property>
- <property name="label">1280x700px</property>
- </object>
- <packing>
- <property name="position">1</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
- <object class="GtkDrawingArea" id="preview-area">
- <property name="visible">True</property>
- </object>
- <packing>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
<object class="GtkHBox" id="bottom-hbox">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="spacing">12</property>
<child>
<object class="GtkHBox" id="hbox2">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">center</property>
<property name="spacing">2</property>
<child>
<object class="GtkImage" id="slide_image">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="icon_name">slideshow-symbolic</property>
</object>
<packing>
<property name="expand">False</property>
+ <property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="slide-label">
<property name="visible">True</property>
+ <property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="label" translatable="yes" comments="This refers to a slideshow background">Changes throughout the day</property>
</object>
<packing>
<property name="expand">False</property>
+ <property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="strut">
<property name="visible">True</property>
- <property name="label" translatable="no"> </property>
+ <property name="can_focus">False</property>
+ <property name="label"> </property>
</object>
<packing>
<property name="expand">False</property>
+ <property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
- <child>
- <object class="GtkHBox" id="edit-hbox">
- <property name="visible">True</property>
- <property name="spacing">6</property>
- <child>
- <object class="GtkColorButton" id="style-pcolor">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">True</property>
- <property name="color">#000000000000</property>
- <child internal-child="accessible">
- <object class="AtkObject" id="style-pcolor-a11y">
- <property name="accessible-name" translatable="yes">Primary Color</property>
- </object>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkButton" id="swap-color-button">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">True</property>
- <property name="use_action_appearance">False</property>
- <child internal-child="accessible">
- <object class="AtkObject" id="swap-color-a11y">
- <property name="accessible-name" translatable="yes">Swap colors</property>
- </object>
- </child>
- <child>
- <object class="GtkImage" id="image1">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="icon_name">object-flip-horizontal-symbolic</property>
- </object>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkComboBox" id="style-combobox">
- <property name="visible">True</property>
- <property name="model">style-liststore</property>
- <property name="active">0</property>
- <child>
- <object class="GtkCellRendererText" id="cellrenderertext1"/>
- <attributes>
- <attribute name="text">0</attribute>
- </attributes>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="pack_type">end</property>
- <property name="position">3</property>
- </packing>
- </child>
- <child>
- <object class="GtkColorButton" id="style-scolor">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">True</property>
- <property name="use_action_appearance">False</property>
- <property name="color">#000000000000</property>
- <child internal-child="accessible">
- <object class="AtkObject" id="style-scolor-a11y">
- <property name="accessible-name" translatable="yes">Secondary color</property>
- </object>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">2</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="pack_type">end</property>
- <property name="position">1</property>
- </packing>
- </child>
</object>
<packing>
<property name="expand">False</property>
+ <property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
</object>
<packing>
- <property name="position">1</property>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
</packing>
</child>
</object>
- <object class="GtkSizeGroup" id="sizegroup">
- <property name="mode">vertical</property>
- <widgets>
- <widget name="sources-combobox"/>
- <widget name="heading-hbox"/>
- <widget name="slide-label"/>
- <widget name="strut"/>
- </widgets>
+ <object class="GtkListStore" id="sources-liststore">
+ <columns>
+ <!-- column-name source-name -->
+ <column type="gchararray"/>
+ <!-- column-name source-id -->
+ <column type="guint"/>
+ <!-- column-name source-pointer -->
+ <column type="gpointer"/>
+ </columns>
</object>
<object class="GtkListStore" id="style-liststore">
<columns>
@@ -372,4 +193,13 @@
</row>
</data>
</object>
+ <object class="GtkSizeGroup" id="sizegroup">
+ <property name="mode">vertical</property>
+ <widgets>
+ <widget name="sources-combobox"/>
+ <widget name="heading-hbox"/>
+ <widget name="slide-label"/>
+ <widget name="strut"/>
+ </widgets>
+ </object>
</interface>
diff --git a/panels/background/cc-background-panel.c b/panels/background/cc-background-panel.c
index fc856e7..bc32857 100644
--- a/panels/background/cc-background-panel.c
+++ b/panels/background/cc-background-panel.c
@@ -22,17 +22,13 @@
#include <config.h>
#include <string.h>
+#include <glib.h>
#include <glib/gi18n-lib.h>
+#include <glib/gstdio.h>
+
#include <gdesktop-enums.h>
#include "cc-background-panel.h"
-#include "bg-wallpapers-source.h"
-#include "bg-pictures-source.h"
-#include "bg-colors-source.h"
-
-#ifdef HAVE_LIBSOCIALWEB
-#include "bg-flickr-source.h"
-#endif
#include "cc-background-item.h"
#include "cc-background-xml.h"
@@ -59,28 +55,21 @@ G_DEFINE_DYNAMIC_TYPE (CcBackgroundPanel, cc_background_panel, CC_TYPE_PANEL)
struct _CcBackgroundPanelPrivate
{
GtkBuilder *builder;
-
- BgWallpapersSource *wallpapers_source;
- BgPicturesSource *pictures_source;
- BgColorsSource *colors_source;
-
-#ifdef HAVE_LIBSOCIALWEB
- BgFlickrSource *flickr_source;
-#endif
+ GDBusConnection *connection;
GSettings *settings;
GnomeDesktopThumbnailFactory *thumb_factory;
CcBackgroundItem *current_background;
- gint current_source;
GCancellable *copy_cancellable;
GtkWidget *spinner;
- GdkPixbuf *display_base;
GdkPixbuf *display_overlay;
+ GdkPixbuf *display_screenshot;
+ char *screenshot_path;
};
enum
@@ -103,32 +92,6 @@ cc_background_panel_get_help_uri (CcPanel *panel)
}
static void
-cc_background_panel_get_property (GObject *object,
- guint property_id,
- GValue *value,
- GParamSpec *pspec)
-{
- switch (property_id)
- {
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
- }
-}
-
-static void
-cc_background_panel_set_property (GObject *object,
- guint property_id,
- const GValue *value,
- GParamSpec *pspec)
-{
- switch (property_id)
- {
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
- }
-}
-
-static void
cc_background_panel_dispose (GObject *object)
{
CcBackgroundPanelPrivate *priv = CC_BACKGROUND_PANEL (object)->priv;
@@ -142,31 +105,6 @@ cc_background_panel_dispose (GObject *object)
priv->spinner = NULL;
}
- if (priv->wallpapers_source)
- {
- g_object_unref (priv->wallpapers_source);
- priv->wallpapers_source = NULL;
- }
-
- if (priv->pictures_source)
- {
- g_object_unref (priv->pictures_source);
- priv->pictures_source = NULL;
- }
-
- if (priv->colors_source)
- {
- g_object_unref (priv->colors_source);
- priv->colors_source = NULL;
- }
-#ifdef HAVE_LIBSOCIALWEB
- if (priv->flickr_source)
- {
- g_object_unref (priv->flickr_source);
- priv->flickr_source = NULL;
- }
-#endif
-
if (priv->settings)
{
g_object_unref (priv->settings);
@@ -188,18 +126,21 @@ cc_background_panel_dispose (GObject *object)
priv->thumb_factory = NULL;
}
- if (priv->display_base)
- {
- g_object_unref (priv->display_base);
- priv->display_base = NULL;
- }
-
if (priv->display_overlay)
{
g_object_unref (priv->display_overlay);
priv->display_overlay = NULL;
}
+ if (priv->display_screenshot)
+ {
+ g_object_unref (priv->display_screenshot);
+ priv->display_screenshot = NULL;
+ }
+
+ g_free (priv->screenshot_path);
+ g_clear_object (&priv->connection);
+
G_OBJECT_CLASS (cc_background_panel_parent_class)->dispose (object);
}
@@ -227,8 +168,6 @@ cc_background_panel_class_init (CcBackgroundPanelClass *klass)
panel_class->get_help_uri = cc_background_panel_get_help_uri;
- object_class->get_property = cc_background_panel_get_property;
- object_class->set_property = cc_background_panel_set_property;
object_class->dispose = cc_background_panel_dispose;
object_class->finalize = cc_background_panel_finalize;
}
@@ -239,100 +178,9 @@ cc_background_panel_class_finalize (CcBackgroundPanelClass *klass)
}
static void
-source_update_edit_box (CcBackgroundPanelPrivate *priv,
- gboolean initial)
-{
- CcBackgroundItemFlags flags;
-
- flags = cc_background_item_get_flags (priv->current_background);
-
- if ((flags & CC_BACKGROUND_ITEM_HAS_SCOLOR &&
- priv->current_source != SOURCE_COLORS) ||
- cc_background_item_get_shading (priv->current_background) == G_DESKTOP_BACKGROUND_SHADING_SOLID)
- gtk_widget_hide (WID ("style-scolor"));
- else
- gtk_widget_show (WID ("style-scolor"));
-
- if (flags & CC_BACKGROUND_ITEM_HAS_PCOLOR &&
- priv->current_source != SOURCE_COLORS)
- gtk_widget_hide (WID ("style-pcolor"));
- else
- gtk_widget_show (WID ("style-pcolor"));
-
- if (gtk_widget_get_visible (WID ("style-pcolor")) &&
- gtk_widget_get_visible (WID ("style-scolor")))
- gtk_widget_show (WID ("swap-color-button"));
- else
- gtk_widget_hide (WID ("swap-color-button"));
-
- if (flags & CC_BACKGROUND_ITEM_HAS_PLACEMENT ||
- cc_background_item_get_uri (priv->current_background) == NULL)
- gtk_widget_hide (WID ("style-combobox"));
- else
- gtk_widget_show (WID ("style-combobox"));
-
- /* FIXME What to do if the background has a gradient shading
- * and provides the colours? */
-}
-
-static void
-source_changed_cb (GtkComboBox *combo,
- CcBackgroundPanelPrivate *priv)
-{
- GtkTreeIter iter;
- GtkTreeModel *model;
- GtkIconView *view;
- guint type;
- BgSource *source;
-
- gtk_combo_box_get_active_iter (combo, &iter);
- model = gtk_combo_box_get_model (combo);
- gtk_tree_model_get (model, &iter,
- COL_SOURCE_TYPE, &type,
- COL_SOURCE, &source, -1);
-
- view = (GtkIconView *) gtk_builder_get_object (priv->builder,
- "backgrounds-iconview");
-
- gtk_icon_view_set_model (view,
- GTK_TREE_MODEL (bg_source_get_liststore (source)));
-}
-
-static void
-select_style (GtkComboBox *box,
- GDesktopBackgroundStyle new_style)
-{
- GtkTreeModel *model;
- GtkTreeIter iter;
- gboolean cont;
-
- model = gtk_combo_box_get_model (box);
- cont = gtk_tree_model_get_iter_first (model, &iter);
- while (cont != FALSE)
- {
- GDesktopBackgroundStyle style;
-
- gtk_tree_model_get (model, &iter,
- 1, &style,
- -1);
-
- if (style == new_style)
- {
- gtk_combo_box_set_active_iter (box, &iter);
- break;
- }
- cont = gtk_tree_model_iter_next (model, &iter);
- }
-
- if (cont == FALSE)
- gtk_combo_box_set_active (box, -1);
-}
-
-static void
update_preview (CcBackgroundPanelPrivate *priv,
CcBackgroundItem *item)
{
- gchar *markup;
gboolean changes_with_time;
if (item && priv->current_background)
@@ -342,731 +190,213 @@ update_preview (CcBackgroundPanelPrivate *priv,
cc_background_item_load (priv->current_background, NULL);
}
- source_update_edit_box (priv, FALSE);
-
changes_with_time = FALSE;
if (priv->current_background)
{
- GdkColor pcolor, scolor;
-
- markup = g_strdup_printf ("<b>%s</b>", cc_background_item_get_name (priv->current_background));
- gtk_label_set_markup (GTK_LABEL (WID ("background-label")), markup);
- g_free (markup);
-
- gtk_label_set_text (GTK_LABEL (WID ("size_label")), cc_background_item_get_size (priv->current_background));
-
- gdk_color_parse (cc_background_item_get_pcolor (priv->current_background), &pcolor);
- gdk_color_parse (cc_background_item_get_scolor (priv->current_background), &scolor);
-
- gtk_color_button_set_color (GTK_COLOR_BUTTON (WID ("style-pcolor")), &pcolor);
- gtk_color_button_set_color (GTK_COLOR_BUTTON (WID ("style-scolor")), &scolor);
-
- select_style (GTK_COMBO_BOX (WID ("style-combobox")),
- cc_background_item_get_placement (priv->current_background));
-
changes_with_time = cc_background_item_changes_with_time (priv->current_background);
}
gtk_widget_set_visible (WID ("slide_image"), changes_with_time);
gtk_widget_set_visible (WID ("slide-label"), changes_with_time);
- gtk_widget_queue_draw (WID ("preview-area"));
+ gtk_widget_queue_draw (WID ("background-desktop-drawingarea"));
}
static char *
get_save_path (void)
{
return g_build_filename (g_get_user_config_dir (),
- "gnome-control-center",
- "backgrounds",
- "last-edited.xml",
- NULL);
-}
-
-static gboolean
-create_save_dir (void)
-{
- char *path;
-
- path = g_build_filename (g_get_user_config_dir (),
- "gnome-control-center",
- "backgrounds",
- NULL);
- if (g_mkdir_with_parents (path, 0755) < 0)
- {
- g_warning ("Failed to create directory '%s'", path);
- g_free (path);
- return FALSE;
- }
- g_free (path);
- return TRUE;
-}
-
-static void
-copy_finished_cb (GObject *source_object,
- GAsyncResult *result,
- gpointer pointer)
-{
- GError *err = NULL;
- CcBackgroundPanel *panel = (CcBackgroundPanel *) pointer;
- CcBackgroundPanelPrivate *priv = panel->priv;
- CcBackgroundItem *item;
-
- if (!g_file_copy_finish (G_FILE (source_object), result, &err))
- {
- if (err->code != G_IO_ERROR_CANCELLED)
- g_warning ("Failed to copy image to cache location: %s", err->message);
-
- g_error_free (err);
- }
- item = g_object_get_data (source_object, "item");
-
- /* the panel may have been destroyed before the callback is run, so be sure
- * to check the widgets are not NULL */
-
- if (priv->spinner)
- {
- gtk_widget_destroy (GTK_WIDGET (priv->spinner));
- priv->spinner = NULL;
- }
-
- if (priv->current_background)
- cc_background_item_load (priv->current_background, NULL);
-
- if (priv->builder)
- {
- char *filename;
-
- update_preview (priv, item);
-
- /* Save the source XML if there is one */
- filename = get_save_path ();
- if (create_save_dir ())
- cc_background_xml_save (priv->current_background, filename);
- }
-
- /* remove the reference taken when the copy was set up */
- g_object_unref (panel);
+ "gnome-control-center",
+ "backgrounds",
+ "last-edited.xml",
+ NULL);
}
static void
-update_remove_button (CcBackgroundPanel *panel,
- CcBackgroundItem *item)
-{
- CcBackgroundPanelPrivate *priv;
- const char *uri;
- char *cache_path;
- GFile *bg, *cache, *parent;
- gboolean sensitive = FALSE;
-
- priv = panel->priv;
-
- if (priv->current_source != SOURCE_PICTURES)
- goto bail;
-
- uri = cc_background_item_get_uri (item);
- if (uri == NULL)
- goto bail;
-
- bg = g_file_new_for_uri (uri);
- parent = g_file_get_parent (bg);
- if (parent == NULL)
- {
- g_object_unref (bg);
- goto bail;
- }
- cache_path = bg_pictures_source_get_cache_path ();
- cache = g_file_new_for_path (cache_path);
- g_free (cache_path);
-
- if (g_file_equal (parent, cache))
- sensitive = TRUE;
-
- g_object_unref (parent);
- g_object_unref (cache);
-
-bail:
- gtk_widget_set_sensitive (WID ("remove_button"), sensitive);
-
-}
-
-static CcBackgroundItem *
-get_selected_item (CcBackgroundPanel *panel)
+update_display_preview (CcBackgroundPanel *panel)
{
CcBackgroundPanelPrivate *priv = panel->priv;
- GtkIconView *icon_view;
- GtkTreeIter iter;
- GtkTreeModel *model;
- GList *list;
- CcBackgroundItem *item;
-
- icon_view = GTK_ICON_VIEW (WID ("backgrounds-iconview"));
- item = NULL;
- list = gtk_icon_view_get_selected_items (icon_view);
-
- if (!list)
- return NULL;
-
- model = gtk_icon_view_get_model (icon_view);
-
- if (gtk_tree_model_get_iter (model, &iter, (GtkTreePath*) list->data) == FALSE)
- goto bail;
-
- gtk_tree_model_get (model, &iter, 1, &item, -1);
-
-bail:
- g_list_foreach (list, (GFunc)gtk_tree_path_free, NULL);
- g_list_free (list);
-
- return item;
-}
-
-static void
-backgrounds_changed_cb (GtkIconView *icon_view,
- CcBackgroundPanel *panel)
-{
- GtkTreeIter iter;
- GtkTreeModel *model;
- CcBackgroundItem *item;
- CcBackgroundPanelPrivate *priv = panel->priv;
- char *pcolor, *scolor;
- gboolean draw_preview = TRUE;
- const char *uri;
- CcBackgroundItemFlags flags;
- char *filename;
-
- item = get_selected_item (panel);
-
- if (item == NULL)
- return;
-
- /* Update current source */
- model = gtk_combo_box_get_model (GTK_COMBO_BOX (WID ("sources-combobox")));
- gtk_combo_box_get_active_iter (GTK_COMBO_BOX (WID ("sources-combobox")),
- &iter);
- gtk_tree_model_get (model, &iter,
- COL_SOURCE_TYPE, &priv->current_source, -1);
-
- uri = cc_background_item_get_uri (item);
- flags = cc_background_item_get_flags (item);
-
- if ((flags & CC_BACKGROUND_ITEM_HAS_URI) && uri == NULL)
- {
- g_settings_set_enum (priv->settings, WP_OPTIONS_KEY, G_DESKTOP_BACKGROUND_STYLE_NONE);
- g_settings_set_string (priv->settings, WP_URI_KEY, "");
- }
- else if (cc_background_item_get_source_url (item) != NULL &&
- cc_background_item_get_needs_download (item))
- {
- GFile *source, *dest;
- gchar *cache_path, *basename, *dest_path, *display_name, *dest_uri;
- GdkPixbuf *pixbuf;
-
- cache_path = bg_pictures_source_get_cache_path ();
- if (g_mkdir_with_parents (cache_path, 0755) < 0)
- {
- g_warning ("Failed to create directory '%s'", cache_path);
- g_free (cache_path);
- return;
- }
- g_free (cache_path);
-
- dest_path = bg_pictures_source_get_unique_path (cc_background_item_get_source_url (item));
- dest = g_file_new_for_path (dest_path);
- g_free (dest_path);
- source = g_file_new_for_uri (cc_background_item_get_source_url (item));
- basename = g_file_get_basename (source);
- display_name = g_filename_display_name (basename);
- dest_path = g_file_get_path (dest);
- g_free (basename);
-
- /* create a blank image to use until the source image is ready */
- pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, TRUE, 8, 1, 1);
- gdk_pixbuf_fill (pixbuf, 0x00000000);
- gdk_pixbuf_save (pixbuf, dest_path, "png", NULL, NULL);
- g_object_unref (pixbuf);
- g_free (dest_path);
-
- if (priv->copy_cancellable)
- {
- g_cancellable_cancel (priv->copy_cancellable);
- g_cancellable_reset (priv->copy_cancellable);
- }
-
- if (priv->spinner)
- {
- gtk_widget_destroy (GTK_WIDGET (priv->spinner));
- priv->spinner = NULL;
- }
-
- /* create a spinner while the file downloads */
- priv->spinner = gtk_spinner_new ();
- gtk_spinner_start (GTK_SPINNER (priv->spinner));
- gtk_box_pack_start (GTK_BOX (WID ("bottom-hbox")), priv->spinner, FALSE,
- FALSE, 6);
- gtk_widget_show (priv->spinner);
-
- /* reference the panel in case it is removed before the copy is
- * finished */
- g_object_ref (panel);
- g_object_set_data_full (G_OBJECT (source), "item", g_object_ref (item), g_object_unref);
- g_file_copy_async (source, dest, G_FILE_COPY_OVERWRITE,
- G_PRIORITY_DEFAULT, priv->copy_cancellable,
- NULL, NULL,
- copy_finished_cb, panel);
- g_object_unref (source);
- dest_uri = g_file_get_uri (dest);
- g_object_unref (dest);
-
- g_settings_set_string (priv->settings, WP_URI_KEY, dest_uri);
- g_object_set (G_OBJECT (item),
- "uri", dest_uri,
- "needs-download", FALSE,
- "name", display_name,
- NULL);
- g_free (display_name);
- g_free (dest_uri);
-
- /* delay the updated drawing of the preview until the copy finishes */
- draw_preview = FALSE;
- }
- else
- {
- g_settings_set_string (priv->settings, WP_URI_KEY, uri);
- }
-
- /* Also set the placement if we have a URI and the previous value was none */
- if (flags & CC_BACKGROUND_ITEM_HAS_PLACEMENT)
- {
- g_settings_set_enum (priv->settings, WP_OPTIONS_KEY, cc_background_item_get_placement (item));
- }
- else if (uri != NULL)
- {
- GDesktopBackgroundStyle style;
- style = g_settings_get_enum (priv->settings, WP_OPTIONS_KEY);
- if (style == G_DESKTOP_BACKGROUND_STYLE_NONE)
- g_settings_set_enum (priv->settings, WP_OPTIONS_KEY, cc_background_item_get_placement (item));
- }
-
- if (flags & CC_BACKGROUND_ITEM_HAS_SHADING)
- g_settings_set_enum (priv->settings, WP_SHADING_KEY, cc_background_item_get_shading (item));
-
- /* When changing to a background with colours set,
- * don't overwrite what's in GSettings, but read
- * from it instead.
- * We have a hack for the colors source though */
- if (flags & CC_BACKGROUND_ITEM_HAS_PCOLOR &&
- priv->current_source != SOURCE_COLORS)
- {
- g_settings_set_string (priv->settings, WP_PCOLOR_KEY, cc_background_item_get_pcolor (item));
- }
- else
- {
- pcolor = g_settings_get_string (priv->settings, WP_PCOLOR_KEY);
- g_object_set (G_OBJECT (item), "primary-color", pcolor, NULL);
- }
-
- if (flags & CC_BACKGROUND_ITEM_HAS_SCOLOR &&
- priv->current_source != SOURCE_COLORS)
- {
- g_settings_set_string (priv->settings, WP_SCOLOR_KEY, cc_background_item_get_scolor (item));
- }
- else
- {
- scolor = g_settings_get_string (priv->settings, WP_SCOLOR_KEY);
- g_object_set (G_OBJECT (item), "secondary-color", scolor, NULL);
- }
-
- /* Apply all changes */
- g_settings_apply (priv->settings);
-
- update_remove_button (panel, item);
-
- /* update the preview information */
- if (draw_preview != FALSE)
- {
- update_preview (priv, item);
-
- /* Save the source XML if there is one */
- filename = get_save_path ();
- if (create_save_dir ())
- cc_background_xml_save (priv->current_background, filename);
- }
-}
-
-static gboolean
-preview_draw_cb (GtkWidget *widget,
- cairo_t *cr,
- CcBackgroundPanel *panel)
-{
+ GtkWidget *widget;
GtkAllocation allocation;
- CcBackgroundPanelPrivate *priv = panel->priv;
- GdkPixbuf *pixbuf = NULL;
const gint preview_width = 416;
const gint preview_height = 248;
- const gint preview_x = 45;
- const gint preview_y = 84;
- GdkPixbuf *preview, *temp;
- gint size;
+ GdkPixbuf *pixbuf;
+ GIcon *icon;
+ cairo_t *cr;
+ widget = WID ("background-desktop-drawingarea");
gtk_widget_get_allocation (widget, &allocation);
- if (priv->current_background)
- {
- GIcon *icon;
- icon = cc_background_item_get_frame_thumbnail (priv->current_background,
- priv->thumb_factory,
- preview_width,
- preview_height,
- -2, TRUE);
- pixbuf = GDK_PIXBUF (icon);
- }
+ if (!priv->current_background)
+ return;
- if (!priv->display_base)
- return FALSE;
+ icon = cc_background_item_get_frame_thumbnail (priv->current_background,
+ priv->thumb_factory,
+ preview_width,
+ preview_height,
+ -2, TRUE);
+ pixbuf = GDK_PIXBUF (icon);
+ cr = gdk_cairo_create (gtk_widget_get_window (widget));
+ gdk_cairo_set_source_pixbuf (cr,
+ pixbuf,
+ 0, 0);
+ cairo_paint (cr);
+ g_object_unref (pixbuf);
- preview = gdk_pixbuf_copy (priv->display_base);
+ pixbuf = NULL;
+ if (panel->priv->display_screenshot != NULL)
+ pixbuf = gdk_pixbuf_scale_simple (panel->priv->display_screenshot,
+ preview_width,
+ preview_height,
+ GDK_INTERP_BILINEAR);
if (pixbuf)
{
- gdk_pixbuf_composite (pixbuf, preview,
- preview_x, preview_y,
- preview_width, preview_height,
- preview_x, preview_y, 1, 1,
- GDK_INTERP_BILINEAR, 255);
-
- g_object_unref (pixbuf);
+ gdk_cairo_set_source_pixbuf (cr,
+ pixbuf,
+ 0, 0);
+ cairo_paint (cr);
}
-
if (priv->display_overlay)
{
- gdk_pixbuf_composite (priv->display_overlay, preview,
- 0, 0, 512, 512,
- 0, 0, 1, 1,
- GDK_INTERP_BILINEAR, 255);
+ gdk_cairo_set_source_pixbuf (cr,
+ priv->display_overlay,
+ 0, 0);
+ cairo_paint (cr);
}
-
- if (allocation.width < allocation.height)
- size = allocation.width;
- else
- size = allocation.height;
-
- temp = gdk_pixbuf_scale_simple (preview, size, size, GDK_INTERP_BILINEAR);
-
- gdk_cairo_set_source_pixbuf (cr,
- temp,
- allocation.width / 2 - (size / 2),
- allocation.height / 2 - (size / 2));
- cairo_paint (cr);
-
- g_object_unref (temp);
- g_object_unref (preview);
-
- return TRUE;
+ cairo_destroy (cr);
}
static void
-style_changed_cb (GtkComboBox *box,
- CcBackgroundPanel *panel)
+on_screenshot_finished (GObject *source,
+ GAsyncResult *res,
+ gpointer user_data)
{
+ CcBackgroundPanel *panel = user_data;
CcBackgroundPanelPrivate *priv = panel->priv;
- GtkTreeModel *model;
- GtkTreeIter iter;
- GDesktopBackgroundStyle value;
-
- if (!gtk_combo_box_get_active_iter (box, &iter))
- {
- return;
- }
-
- model = gtk_combo_box_get_model (box);
-
- gtk_tree_model_get (model, &iter, 1, &value, -1);
-
- g_settings_set_enum (priv->settings, WP_OPTIONS_KEY, value);
-
- if (priv->current_background)
- g_object_set (G_OBJECT (priv->current_background), "placement", value, NULL);
-
- g_settings_apply (priv->settings);
-
- update_preview (priv, NULL);
-}
-
-static void
-color_changed_cb (GtkColorButton *button,
- CcBackgroundPanel *panel)
-{
- CcBackgroundPanelPrivate *priv = panel->priv;
- GdkColor color;
- gchar *value;
- gboolean is_pcolor = FALSE;
-
- gtk_color_button_get_color (button, &color);
- if (WID ("style-pcolor") == GTK_WIDGET (button))
- is_pcolor = TRUE;
-
- value = gdk_color_to_string (&color);
+ GError *error;
+ GdkRectangle rect;
+ GtkWidget *widget;
+ GdkPixbuf *pixbuf;
+ cairo_surface_t *surface;
+ cairo_t *cr;
+ int width;
+ int height;
+
+ error = NULL;
+ g_dbus_connection_call_finish (panel->priv->connection,
+ res,
+ &error);
+
+ if (error != NULL) {
+ g_debug ("Unable to get screenshot: %s",
+ error->message);
+ g_error_free (error);
+ /* fallback? */
+ goto out;
+ }
- if (priv->current_background)
+ pixbuf = gdk_pixbuf_new_from_file (panel->priv->screenshot_path, &error);
+ if (error != NULL)
{
- g_object_set (G_OBJECT (priv->current_background),
- is_pcolor ? "primary-color" : "secondary-color", value, NULL);
+ g_debug ("Unable to use GNOME Shell's builtin screenshot interface: %s",
+ error->message);
+ g_error_free (error);
+ goto out;
}
- g_settings_set_string (priv->settings,
- is_pcolor ? WP_PCOLOR_KEY : WP_SCOLOR_KEY, value);
-
- g_settings_apply (priv->settings);
-
- g_free (value);
-
- update_preview (priv, NULL);
-}
-
-static void
-swap_colors_clicked (GtkButton *button,
- CcBackgroundPanel *panel)
-{
- CcBackgroundPanelPrivate *priv = panel->priv;
- GdkColor pcolor, scolor;
- char *new_pcolor, *new_scolor;
+ /* remove the temporary file created by the shell */
+ g_unlink (panel->priv->screenshot_path);
- gtk_color_button_get_color (GTK_COLOR_BUTTON (WID ("style-pcolor")), &pcolor);
- gtk_color_button_get_color (GTK_COLOR_BUTTON (WID ("style-scolor")), &scolor);
-
- gtk_color_button_set_color (GTK_COLOR_BUTTON (WID ("style-scolor")), &pcolor);
- gtk_color_button_set_color (GTK_COLOR_BUTTON (WID ("style-pcolor")), &scolor);
-
- new_pcolor = gdk_color_to_string (&scolor);
- new_scolor = gdk_color_to_string (&pcolor);
-
- g_object_set (priv->current_background,
- "primary-color", new_pcolor,
- "secondary-color", new_scolor,
- NULL);
-
- g_settings_set_string (priv->settings, WP_PCOLOR_KEY, new_pcolor);
- g_settings_set_string (priv->settings, WP_SCOLOR_KEY, new_scolor);
-
- g_free (new_pcolor);
- g_free (new_scolor);
-
- g_settings_apply (priv->settings);
-
- update_preview (priv, NULL);
-}
-
-static void
-row_inserted (GtkTreeModel *tree_model,
- GtkTreePath *path,
- GtkTreeIter *iter,
- CcBackgroundPanel *panel)
-{
- GtkListStore *store;
- CcBackgroundPanelPrivate *priv;
+ width = gdk_pixbuf_get_width (pixbuf);
+ height = gdk_pixbuf_get_height (pixbuf);
+ surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32,
+ width, height);
+ cr = cairo_create (surface);
+ gdk_cairo_set_source_pixbuf (cr, pixbuf, 0, 0);
+ cairo_paint (cr);
+ g_object_unref (pixbuf);
- priv = panel->priv;
+ /* clear the workarea */
+ widget = WID ("background-desktop-drawingarea");
+ gdk_screen_get_monitor_workarea (gtk_widget_get_screen (widget), 0, &rect);
- store = bg_source_get_liststore (BG_SOURCE (panel->priv->pictures_source));
- g_signal_handlers_disconnect_by_func (G_OBJECT (store), G_CALLBACK (row_inserted), panel);
+ cairo_save (cr);
+ cairo_set_operator (cr, CAIRO_OPERATOR_CLEAR);
+ cairo_rectangle (cr, rect.x, rect.y, rect.width, rect.height);
+ cairo_fill (cr);
+ cairo_restore (cr);
- /* Change source */
- gtk_combo_box_set_active (GTK_COMBO_BOX (WID ("sources-combobox")), SOURCE_PICTURES);
+ g_clear_object (&panel->priv->display_screenshot);
+ panel->priv->display_screenshot = gdk_pixbuf_get_from_surface (surface,
+ 0, 0,
+ width,
+ height);
+ cairo_destroy (cr);
+ cairo_surface_destroy (surface);
- /* And select the newly added item */
- gtk_icon_view_select_path (GTK_ICON_VIEW (WID ("backgrounds-iconview")), path);
+ out:
+ update_display_preview (panel);
}
static void
-add_custom_wallpaper (CcBackgroundPanel *panel,
- const char *uri)
+get_screenshot_async (CcBackgroundPanel *panel,
+ GdkRectangle *rectangle)
{
- GtkListStore *store;
+ gchar *path, *tmpname;
+ const gchar *method_name;
+ GVariant *method_params;
- store = bg_source_get_liststore (BG_SOURCE (panel->priv->pictures_source));
- g_signal_connect (G_OBJECT (store), "row-inserted",
- G_CALLBACK (row_inserted), panel);
-
- if (bg_pictures_source_add (panel->priv->pictures_source, uri) == FALSE) {
- g_signal_handlers_disconnect_by_func (G_OBJECT (store), G_CALLBACK (row_inserted), panel);
- return;
- }
-
- /* Wait for the item to get added */
-}
+ path = g_build_filename (g_get_user_cache_dir (), "gnome-control-center", NULL);
+ g_mkdir_with_parents (path, 0700);
-static void
-file_chooser_response (GtkDialog *chooser,
- gint response,
- CcBackgroundPanel *panel)
-{
- GSList *selected, *l;
-
- if (response != GTK_RESPONSE_ACCEPT)
- {
- gtk_widget_destroy (GTK_WIDGET (chooser));
- return;
- }
-
- selected = gtk_file_chooser_get_uris (GTK_FILE_CHOOSER (chooser));
- gtk_widget_destroy (GTK_WIDGET (chooser));
-
- for (l = selected; l != NULL; l = l->next)
- {
- char *uri = l->data;
- add_custom_wallpaper (panel, uri);
- g_free (uri);
- }
- g_slist_free (selected);
+ tmpname = g_strdup_printf ("scr-%d.png", g_random_int ());
+ g_free (panel->priv->screenshot_path);
+ panel->priv->screenshot_path = g_build_filename (path, tmpname, NULL);
+ g_free (path);
+ g_free (tmpname);
+
+ method_name = "ScreenshotArea";
+ method_params = g_variant_new ("(iiiibs)",
+ rectangle->x, rectangle->y,
+ rectangle->width, rectangle->height,
+ FALSE, /* flash */
+ panel->priv->screenshot_path);
+
+ g_dbus_connection_call (panel->priv->connection,
+ "org.gnome.Shell",
+ "/org/gnome/Shell",
+ "org.gnome.Shell",
+ method_name,
+ method_params,
+ NULL,
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL,
+ on_screenshot_finished,
+ panel);
}
-static void
-update_chooser_preview (GtkFileChooser *chooser,
- CcBackgroundPanel *panel)
+static gboolean
+on_preview_draw (GtkWidget *widget,
+ cairo_t *cr,
+ CcBackgroundPanel *panel)
{
- GnomeDesktopThumbnailFactory *thumb_factory;
- char *uri;
-
- thumb_factory = panel->priv->thumb_factory;
-
- uri = gtk_file_chooser_get_preview_uri (chooser);
-
- if (uri)
+ if (!panel->priv->display_screenshot)
{
- GdkPixbuf *pixbuf = NULL;
- const gchar *mime_type = NULL;
- GFile *file;
- GFileInfo *file_info;
- GtkWidget *preview;
+ GdkRectangle rect;
- preview = gtk_file_chooser_get_preview_widget (chooser);
-
- file = g_file_new_for_uri (uri);
- file_info = g_file_query_info (file,
- G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE,
- G_FILE_QUERY_INFO_NONE,
- NULL, NULL);
- g_object_unref (file);
-
- if (file_info != NULL) {
- mime_type = g_file_info_get_content_type (file_info);
- g_object_unref (file_info);
- }
-
- if (mime_type)
- {
- pixbuf = gnome_desktop_thumbnail_factory_generate_thumbnail (thumb_factory,
- uri,
- mime_type);
- }
-
- gtk_dialog_set_response_sensitive (GTK_DIALOG (chooser),
- GTK_RESPONSE_ACCEPT,
- (pixbuf != NULL));
-
- if (pixbuf != NULL)
- {
- gtk_image_set_from_pixbuf (GTK_IMAGE (preview), pixbuf);
- g_object_unref (pixbuf);
- }
- else
- {
- gtk_image_set_from_stock (GTK_IMAGE (preview),
- GTK_STOCK_DIALOG_QUESTION,
- GTK_ICON_SIZE_DIALOG);
- }
-
- if (bg_pictures_source_is_known (panel->priv->pictures_source, uri))
- gtk_dialog_set_response_sensitive (GTK_DIALOG (chooser), GTK_RESPONSE_ACCEPT, FALSE);
- else
- gtk_dialog_set_response_sensitive (GTK_DIALOG (chooser), GTK_RESPONSE_ACCEPT, TRUE);
-
- g_free (uri);
+ gdk_screen_get_monitor_geometry (gtk_widget_get_screen (widget), 0, &rect);
+ get_screenshot_async (panel, &rect);
}
+ else
+ update_display_preview (panel);
- gtk_file_chooser_set_preview_widget_active (chooser, TRUE);
-}
-
-static void
-add_button_clicked (GtkButton *button,
- CcBackgroundPanel *panel)
-{
- GtkWidget *chooser;
- const gchar *folder;
- GtkWidget *preview;
- GtkFileFilter *filter;
- CcBackgroundPanelPrivate *priv;
- const char * const * content_types;
- guint i;
-
- priv = panel->priv;
-
- filter = gtk_file_filter_new ();
- content_types = bg_pictures_get_support_content_types ();
- for (i = 0; content_types[i] != NULL; i++)
- gtk_file_filter_add_mime_type (filter, content_types[i]);
-
- chooser = gtk_file_chooser_dialog_new (_("Browse for more pictures"),
- GTK_WINDOW (gtk_widget_get_toplevel (WID ("background-panel"))),
- GTK_FILE_CHOOSER_ACTION_OPEN,
- GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
- GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
- NULL);
- gtk_file_chooser_set_filter (GTK_FILE_CHOOSER (chooser), filter);
- gtk_file_chooser_set_select_multiple (GTK_FILE_CHOOSER (chooser), TRUE);
-
- gtk_window_set_modal (GTK_WINDOW (chooser), TRUE);
-
- preview = gtk_image_new ();
- gtk_widget_set_size_request (preview, 128, -1);
- gtk_file_chooser_set_preview_widget (GTK_FILE_CHOOSER (chooser), preview);
- gtk_file_chooser_set_use_preview_label (GTK_FILE_CHOOSER (chooser), FALSE);
- gtk_widget_show (preview);
- g_signal_connect (chooser, "update-preview",
- G_CALLBACK (update_chooser_preview), panel);
-
- folder = g_get_user_special_dir (G_USER_DIRECTORY_PICTURES);
- if (folder)
- gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (chooser),
- folder);
-
- g_signal_connect (chooser, "response",
- G_CALLBACK (file_chooser_response), panel);
-
- gtk_window_present (GTK_WINDOW (chooser));
-}
-
-static void
-remove_button_clicked (GtkButton *button,
- CcBackgroundPanel *panel)
-{
- CcBackgroundItem *item;
- GtkListStore *store;
- GtkTreePath *path;
- CcBackgroundPanelPrivate *priv;
-
- priv = panel->priv;
-
- item = get_selected_item (panel);
- if (item == NULL)
- g_assert_not_reached ();
-
- bg_pictures_source_remove (panel->priv->pictures_source, item);
- g_object_unref (item);
-
- /* Are there any items left in the pictures tree store? */
- store = bg_source_get_liststore (BG_SOURCE (panel->priv->pictures_source));
- if (gtk_tree_model_iter_n_children (GTK_TREE_MODEL (store), NULL) == 0)
- gtk_combo_box_set_active (GTK_COMBO_BOX (WID ("sources-combobox")), SOURCE_WALLPAPERS);
-
- path = gtk_tree_path_new_from_string ("0");
- gtk_icon_view_select_path (GTK_ICON_VIEW (WID ("backgrounds-iconview")), path);
- gtk_tree_path_free (path);
+ return TRUE;
}
static void
@@ -1103,12 +433,12 @@ load_current_bg (CcBackgroundPanel *self)
pcolor = g_settings_get_string (priv->settings, WP_PCOLOR_KEY);
scolor = g_settings_get_string (priv->settings, WP_SCOLOR_KEY);
g_object_set (G_OBJECT (configured),
- "name", _("Current background"),
- "placement", g_settings_get_enum (priv->settings, WP_OPTIONS_KEY),
- "shading", g_settings_get_enum (priv->settings, WP_SHADING_KEY),
- "primary-color", pcolor,
- "secondary-color", scolor,
- NULL);
+ "name", _("Current background"),
+ "placement", g_settings_get_enum (priv->settings, WP_OPTIONS_KEY),
+ "shading", g_settings_get_enum (priv->settings, WP_SHADING_KEY),
+ "primary-color", pcolor,
+ "secondary-color", scolor,
+ NULL);
g_free (pcolor);
g_free (scolor);
@@ -1134,61 +464,17 @@ load_current_bg (CcBackgroundPanel *self)
}
static void
-scrolled_realize_cb (GtkWidget *scrolled,
- CcBackgroundPanel *self)
-{
- /* FIXME, hack for https://bugzilla.gnome.org/show_bug.cgi?id=645649 */
- GdkScreen *screen;
- GdkRectangle rect;
- int monitor;
-
- screen = gtk_widget_get_screen (scrolled);
- monitor = gdk_screen_get_monitor_at_window (screen, gtk_widget_get_window (scrolled));
- gdk_screen_get_monitor_geometry (screen, monitor, &rect);
- if (rect.height <= 768)
- g_object_set (G_OBJECT (scrolled), "height-request", 280, NULL);
-}
-
-static void
-cc_background_panel_drag_uris (GtkWidget *widget,
- GdkDragContext *context, gint x, gint y,
- GtkSelectionData *data, guint info, guint time,
- CcBackgroundPanel *panel)
-{
- gint i;
- char *uri;
- gchar **uris;
-
- uris = gtk_selection_data_get_uris (data);
- if (!uris)
- return;
-
- gtk_drag_finish (context, TRUE, FALSE, time);
-
- for (i = 0; uris[i] != NULL; i++) {
- uri = uris[i];
- if (!bg_pictures_source_is_known (panel->priv->pictures_source, uri)) {
- add_custom_wallpaper (panel, uri);
- }
- }
-
- g_strfreev(uris);
-}
-
-static void
cc_background_panel_init (CcBackgroundPanel *self)
{
CcBackgroundPanelPrivate *priv;
- gchar *objects[] = { "style-liststore",
- "sources-liststore", "background-panel", "sizegroup", NULL };
+ gchar *objects[] = {"background-panel", NULL };
GError *err = NULL;
GtkWidget *widget;
- GtkListStore *store;
- GtkStyleContext *context;
priv = self->priv = BACKGROUND_PANEL_PRIVATE (self);
priv->builder = gtk_builder_new ();
+ priv->connection = g_application_get_dbus_connection (g_application_get_default ());
gtk_builder_add_objects_from_file (priv->builder,
DATADIR"/background.ui",
@@ -1201,119 +487,31 @@ cc_background_panel_init (CcBackgroundPanel *self)
return;
}
- /* See shell_notify_cb for details */
- g_signal_connect (WID ("scrolledwindow1"), "realize",
- G_CALLBACK (scrolled_realize_cb), self);
-
priv->settings = g_settings_new (WP_PATH_ID);
g_settings_delay (priv->settings);
- store = (GtkListStore*) gtk_builder_get_object (priv->builder,
- "sources-liststore");
-
- priv->wallpapers_source = bg_wallpapers_source_new ();
- gtk_list_store_insert_with_values (store, NULL, G_MAXINT,
- COL_SOURCE_NAME, _("Wallpapers"),
- COL_SOURCE_TYPE, SOURCE_WALLPAPERS,
- COL_SOURCE, priv->wallpapers_source,
- -1);
-
- priv->pictures_source = bg_pictures_source_new ();
- gtk_list_store_insert_with_values (store, NULL, G_MAXINT,
- COL_SOURCE_NAME, _("Pictures Folder"),
- COL_SOURCE_TYPE, SOURCE_PICTURES,
- COL_SOURCE, priv->pictures_source,
- -1);
-
- priv->colors_source = bg_colors_source_new ();
- gtk_list_store_insert_with_values (store, NULL, G_MAXINT,
- COL_SOURCE_NAME, _("Colors & Gradients"),
- COL_SOURCE_TYPE, SOURCE_COLORS,
- COL_SOURCE, priv->colors_source,
- -1);
-
-#ifdef HAVE_LIBSOCIALWEB
- priv->flickr_source = bg_flickr_source_new ();
- gtk_list_store_insert_with_values (store, NULL, G_MAXINT,
- COL_SOURCE_NAME, _("Flickr"),
- COL_SOURCE_TYPE, SOURCE_FLICKR,
- COL_SOURCE, priv->flickr_source,
- -1);
-#endif
-
-
/* add the top level widget */
widget = WID ("background-panel");
gtk_container_add (GTK_CONTAINER (self), widget);
gtk_widget_show_all (GTK_WIDGET (self));
- /* connect to source change signal */
- widget = WID ("sources-combobox");
- g_signal_connect (widget, "changed", G_CALLBACK (source_changed_cb), priv);
-
- /* select first item */
- gtk_combo_box_set_active (GTK_COMBO_BOX (widget), 0);
-
- /* connect to the background iconview change signal */
- widget = WID ("backgrounds-iconview");
- g_signal_connect (widget, "selection-changed",
- G_CALLBACK (backgrounds_changed_cb),
- self);
-
- /* Join treeview and buttons */
- widget = WID ("scrolledwindow1");
- context = gtk_widget_get_style_context (widget);
- gtk_style_context_set_junction_sides (context, GTK_JUNCTION_BOTTOM);
- widget = WID ("toolbar1");
- context = gtk_widget_get_style_context (widget);
- gtk_style_context_set_junction_sides (context, GTK_JUNCTION_TOP);
-
- g_signal_connect (WID ("add_button"), "clicked",
- G_CALLBACK (add_button_clicked), self);
- g_signal_connect (WID ("remove_button"), "clicked",
- G_CALLBACK (remove_button_clicked), self);
-
- /* Add drag and drop support for bg images */
- widget = WID ("scrolledwindow1");
- gtk_drag_dest_set (widget, GTK_DEST_DEFAULT_ALL, NULL, 0, GDK_ACTION_COPY);
- gtk_drag_dest_add_uri_targets (widget);
- g_signal_connect (widget, "drag-data-received",
- G_CALLBACK (cc_background_panel_drag_uris), self);
-
-
/* setup preview area */
- gtk_label_set_ellipsize (GTK_LABEL (WID ("background-label")), PANGO_ELLIPSIZE_END);
- widget = WID ("preview-area");
- g_signal_connect (widget, "draw", G_CALLBACK (preview_draw_cb),
+ widget = WID ("background-desktop-drawingarea");
+ g_signal_connect (widget, "draw", G_CALLBACK (on_preview_draw),
self);
- priv->display_base = gdk_pixbuf_new_from_file (DATADIR "/display-base.png",
- NULL);
+ priv->copy_cancellable = g_cancellable_new ();
+
priv->display_overlay = gdk_pixbuf_new_from_file (DATADIR
"/display-overlay.png",
NULL);
- g_signal_connect (WID ("style-combobox"), "changed",
- G_CALLBACK (style_changed_cb), self);
-
- g_signal_connect (WID ("style-pcolor"), "color-set",
- G_CALLBACK (color_changed_cb), self);
- g_signal_connect (WID ("style-scolor"), "color-set",
- G_CALLBACK (color_changed_cb), self);
- g_signal_connect (WID ("swap-color-button"), "clicked",
- G_CALLBACK (swap_colors_clicked), self);
-
- priv->copy_cancellable = g_cancellable_new ();
-
priv->thumb_factory = gnome_desktop_thumbnail_factory_new (GNOME_DESKTOP_THUMBNAIL_SIZE_NORMAL);
load_current_bg (self);
update_preview (priv, NULL);
-
- /* Setup the edit box with our current settings */
- source_update_edit_box (priv, TRUE);
}
void
diff --git a/panels/background/display-overlay.png b/panels/background/display-overlay.png
index 74113ac..f5cf785 100644
Binary files a/panels/background/display-overlay.png and b/panels/background/display-overlay.png differ
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]