Commit 1eb96ead authored by Matthias Clasen's avatar Matthias Clasen

Bug 384940 – handle rejecting jobs and authentication meaningfully

        Patch by Marek Kasik, icons by Mike Langlie:
        * gtk/gtk.symbols:
        * gtk/gtkprintbackend.h:
        * gtk/gtkprinter.[hc]: Add new paused and accepting-jobs properties
        and getters/setters.

        * gtk/gtkstock.h:
        * gtk/gtkiconfactory.c:
        * gtk/Makefile.am:
        * gtk/stock-icons/{16,24}/gtk-print-paused.{png,svg}: New icon.

        * modules/printbackends/cups/gtkprintbackendcups.c:
        * gtk/gtkprintunixdialog.c: Handle paused and job-rejecting
        printers.


svn path=/trunk/; revision=20838
parent 1ea43444
2008-07-15 Matthias Clasen <mclasen@redhat.com>
Bug 384940 – handle rejecting jobs and authentication meaningfully
Patch by Marek Kasik, icons by Mike Langlie:
* gtk/gtk.symbols:
* gtk/gtkprintbackend.h:
* gtk/gtkprinter.[hc]: Add new paused and accepting-jobs properties
and getters/setters.
* gtk/gtkstock.h:
* gtk/gtkiconfactory.c:
* gtk/Makefile.am:
* gtk/stock-icons/{16,24}/gtk-print-paused.{png,svg}: New icon.
* modules/printbackends/cups/gtkprintbackendcups.c:
* gtk/gtkprintunixdialog.c: Handle paused and job-rejecting
printers.
2008-07-15 Matthias Clasen <mclasen@redhat.com>
* configure.in: Add a test to see if GIO can sniff image data,
......
2008-07-15 Matthias Clasen <mclasen@redhat.com>
* gtk/Makefile.am:
* gtk/tmpl/gtkstock.sgml: Add new icon.
* gtk/gtk-sections.txt: Add new GtkPrinter functions
2008-07-14 Matthias Clasen <mclasen@redhat.com>
* gtk/tmpl/gtklabel.sgml: Fix markup
......
......@@ -242,6 +242,7 @@ HTML_IMAGES = \
$(top_srcdir)/gtk/stock-icons/24/gtk-preferences.png \
$(top_srcdir)/gtk/stock-icons/24/gtk-print.png \
$(top_srcdir)/gtk/stock-icons/24/gtk-print-error.png \
$(top_srcdir)/gtk/stock-icons/24/gtk-print-paused.png \
$(top_srcdir)/gtk/stock-icons/24/gtk-print-preview.png \
$(top_srcdir)/gtk/stock-icons/24/gtk-print-report.png \
$(top_srcdir)/gtk/stock-icons/24/gtk-print-warning.png \
......
......@@ -6441,6 +6441,8 @@ gtk_printer_get_location
gtk_printer_get_icon_name
gtk_printer_get_job_count
gtk_printer_is_active
gtk_printer_is_paused
gtk_printer_is_accepting_jobs
gtk_printer_is_virtual
gtk_printer_is_default
gtk_printer_accepts_ps
......
......@@ -755,13 +755,22 @@ The "Print" item.
<!-- ##### MACRO GTK_STOCK_PRINT_ERROR ##### -->
<para>
The "Print Error" item.
The "Print Error" icon.
<inlinegraphic fileref="gtk-print-error.png" format="PNG"></inlinegraphic>
</para>
@Since: 2.14
<!-- ##### MACRO GTK_STOCK_PRINT_PAUSED ##### -->
<para>
The "Print Paused" icon.
<inlinegraphic fileref="gtk-print-paused.png" format="PNG"></inlinegraphic>
</para>
@Since: 2.14
<!-- ##### MACRO GTK_STOCK_PRINT_PREVIEW ##### -->
<para>
The "Print Preview" item.
......@@ -772,7 +781,7 @@ The "Print Preview" item.
<!-- ##### MACRO GTK_STOCK_PRINT_REPORT ##### -->
<para>
The "Print Report" item.
The "Print Report" icon.
<inlinegraphic fileref="gtk-print-report.png" format="PNG"></inlinegraphic>
</para>
......@@ -781,7 +790,7 @@ The "Print Report" item.
<!-- ##### MACRO GTK_STOCK_PRINT_WARNING ##### -->
<para>
The "Print Warning" item.
The "Print Warning" icon.
<inlinegraphic fileref="gtk-print-warning.png" format="PNG"></inlinegraphic>
</para>
......
......@@ -1000,6 +1000,7 @@ STOCK_ICONS = \
stock-icons/16/gtk-preferences.png \
stock-icons/16/gtk-print.png \
stock-icons/16/gtk-print-error.png \
stock-icons/16/gtk-print-paused.png \
stock-icons/16/gtk-print-preview.png \
stock-icons/16/gtk-print-report.png \
stock-icons/16/gtk-print-warning.png \
......@@ -1109,6 +1110,7 @@ STOCK_ICONS = \
stock-icons/24/gtk-preferences.png \
stock-icons/24/gtk-print.png \
stock-icons/24/gtk-print-error.png \
stock-icons/24/gtk-print-paused.png \
stock-icons/24/gtk-print-preview.png \
stock-icons/24/gtk-print-report.png \
stock-icons/24/gtk-print-warning.png \
......
......@@ -2691,12 +2691,16 @@ gtk_printer_set_description
gtk_printer_set_has_details
gtk_printer_set_icon_name
gtk_printer_set_is_active
gtk_printer_set_is_paused
gtk_printer_set_is_accepting_jobs
gtk_printer_set_is_default
gtk_printer_set_is_new
gtk_printer_set_job_count
gtk_printer_set_location
gtk_printer_set_state_message
gtk_printer_is_active
gtk_printer_is_paused
gtk_printer_is_accepting_jobs
gtk_printer_is_new
gtk_printer_is_default
#endif
......
......@@ -452,6 +452,7 @@ get_default_icons (GtkIconFactory *factory)
register_stock_icon (factory, GTK_STOCK_PREFERENCES);
register_stock_icon (factory, GTK_STOCK_PRINT);
register_stock_icon (factory, GTK_STOCK_PRINT_ERROR);
register_stock_icon (factory, GTK_STOCK_PRINT_PAUSED);
register_stock_icon (factory, GTK_STOCK_PRINT_PREVIEW);
register_stock_icon (factory, GTK_STOCK_PRINT_REPORT);
register_stock_icon (factory, GTK_STOCK_PRINT_WARNING);
......
......@@ -149,30 +149,32 @@ void gtk_print_backend_set_list_done (GtkPrintBackend *bac
/* Backend-only functions for GtkPrinter */
GtkPrinter *gtk_printer_new (const char *name,
GtkPrintBackend *backend,
gboolean is_virtual);
gboolean gtk_printer_is_new (GtkPrinter *printer);
void gtk_printer_set_is_new (GtkPrinter *printer,
gboolean val);
void gtk_printer_set_is_active (GtkPrinter *printer,
gboolean val);
void gtk_printer_set_has_details (GtkPrinter *printer,
gboolean val);
void gtk_printer_set_is_default (GtkPrinter *printer,
gboolean val);
void gtk_printer_set_icon_name (GtkPrinter *printer,
const gchar *icon);
gboolean gtk_printer_set_job_count (GtkPrinter *printer,
gint count);
gboolean gtk_printer_set_location (GtkPrinter *printer,
const gchar *location);
gboolean gtk_printer_set_description (GtkPrinter *printer,
const gchar *description);
gboolean gtk_printer_set_state_message (GtkPrinter *printer,
const gchar *message);
void gtk_printer_set_is_active (GtkPrinter *printer,
gboolean active);
GtkPrinter *gtk_printer_new (const char *name,
GtkPrintBackend *backend,
gboolean is_virtual);
gboolean gtk_printer_is_new (GtkPrinter *printer);
void gtk_printer_set_is_new (GtkPrinter *printer,
gboolean val);
void gtk_printer_set_is_active (GtkPrinter *printer,
gboolean val);
gboolean gtk_printer_set_is_paused (GtkPrinter *printer,
gboolean val);
gboolean gtk_printer_set_is_accepting_jobs (GtkPrinter *printer,
gboolean val);
void gtk_printer_set_has_details (GtkPrinter *printer,
gboolean val);
void gtk_printer_set_is_default (GtkPrinter *printer,
gboolean val);
void gtk_printer_set_icon_name (GtkPrinter *printer,
const gchar *icon);
gboolean gtk_printer_set_job_count (GtkPrinter *printer,
gint count);
gboolean gtk_printer_set_location (GtkPrinter *printer,
const gchar *location);
gboolean gtk_printer_set_description (GtkPrinter *printer,
const gchar *description);
gboolean gtk_printer_set_state_message (GtkPrinter *printer,
const gchar *message);
G_END_DECLS
......
......@@ -43,13 +43,15 @@ struct _GtkPrinterPrivate
gchar *description;
gchar *icon_name;
guint is_active : 1;
guint is_new : 1;
guint is_virtual : 1;
guint is_default : 1;
guint has_details : 1;
guint accepts_pdf : 1;
guint accepts_ps : 1;
guint is_active : 1;
guint is_paused : 1;
guint is_accepting_jobs : 1;
guint is_new : 1;
guint is_virtual : 1;
guint is_default : 1;
guint has_details : 1;
guint accepts_pdf : 1;
guint accepts_ps : 1;
gchar *state_message;
gint job_count;
......@@ -72,7 +74,9 @@ enum {
PROP_ICON_NAME,
PROP_JOB_COUNT,
PROP_ACCEPTS_PDF,
PROP_ACCEPTS_PS
PROP_ACCEPTS_PS,
PROP_PAUSED,
PROP_ACCEPTING_JOBS
};
static guint signals[LAST_SIGNAL] = { 0 };
......@@ -179,6 +183,37 @@ gtk_printer_class_init (GtkPrinterClass *class)
0,
GTK_PARAM_READABLE));
/**
* GtkPrinter:paused:
*
* This property is %TRUE if this printer is paused.
* A paused printer still accepts jobs, but it does
* not print them.
*
* Since: 2.14
*/
g_object_class_install_property (G_OBJECT_CLASS (class),
PROP_PAUSED,
g_param_spec_boolean ("paused",
P_("Paused Printer"),
P_("TRUE if this printer is paused"),
FALSE,
GTK_PARAM_READABLE));
/**
* GtkPrinter:accepting-jobs:
*
* This property is %TRUE if the printer is accepting jobs.
*
* Since: 2.14
*/
g_object_class_install_property (G_OBJECT_CLASS (class),
PROP_ACCEPTING_JOBS,
g_param_spec_boolean ("accepting-jobs",
P_("Accepting Jobs"),
P_("TRUE if this printer is accepting new jobs"),
TRUE,
GTK_PARAM_READABLE));
/**
* GtkPrinter::details-acquired:
* @printer: the #GtkPrinter on which the signal is emitted
......@@ -213,6 +248,8 @@ gtk_printer_init (GtkPrinter *printer)
priv->icon_name = NULL;
priv->is_active = TRUE;
priv->is_paused = FALSE;
priv->is_accepting_jobs = TRUE;
priv->is_new = TRUE;
priv->has_details = FALSE;
priv->accepts_pdf = TRUE;
......@@ -327,6 +364,12 @@ gtk_printer_get_property (GObject *object,
case PROP_ACCEPTS_PS:
g_value_set_boolean (value, priv->accepts_ps);
break;
case PROP_PAUSED:
g_value_set_boolean (value, priv->is_paused);
break;
case PROP_ACCEPTING_JOBS:
g_value_set_boolean (value, priv->is_accepting_jobs);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
......@@ -635,6 +678,79 @@ gtk_printer_set_is_active (GtkPrinter *printer,
printer->priv->is_active = val;
}
/**
* gtk_printer_is_paused:
* @printer: a #GtkPrinter
*
* Returns whether the printer is currently paused.
* A paused printer still accepts jobs, but it is not
* printing them.
*
* Return value: %TRUE if @printer is paused
*
* Since: 2.14
*/
gboolean
gtk_printer_is_paused (GtkPrinter *printer)
{
g_return_val_if_fail (GTK_IS_PRINTER (printer), TRUE);
return printer->priv->is_paused;
}
gboolean
gtk_printer_set_is_paused (GtkPrinter *printer,
gboolean val)
{
GtkPrinterPrivate *priv;
g_return_val_if_fail (GTK_IS_PRINTER (printer), FALSE);
priv = printer->priv;
if (val == priv->is_paused)
return FALSE;
priv->is_paused = val;
return TRUE;
}
/**
* gtk_printer_is_accepting_jobs:
* @printer: a #GtkPrinter
*
* Returns whether the printer is accepting jobs
*
* Return value: %TRUE if @printer is accepting jobs
*
* Since: 2.14
*/
gboolean
gtk_printer_is_accepting_jobs (GtkPrinter *printer)
{
g_return_val_if_fail (GTK_IS_PRINTER (printer), TRUE);
return printer->priv->is_accepting_jobs;
}
gboolean
gtk_printer_set_is_accepting_jobs (GtkPrinter *printer,
gboolean val)
{
GtkPrinterPrivate *priv;
g_return_val_if_fail (GTK_IS_PRINTER (printer), FALSE);
priv = printer->priv;
if (val == priv->is_accepting_jobs)
return FALSE;
priv->is_accepting_jobs = val;
return TRUE;
}
/**
* gtk_printer_is_virtual:
......
......@@ -99,6 +99,8 @@ G_CONST_RETURN gchar *gtk_printer_get_location (GtkPrinter *pri
G_CONST_RETURN gchar *gtk_printer_get_icon_name (GtkPrinter *printer);
gint gtk_printer_get_job_count (GtkPrinter *printer);
gboolean gtk_printer_is_active (GtkPrinter *printer);
gboolean gtk_printer_is_paused (GtkPrinter *printer);
gboolean gtk_printer_is_accepting_jobs (GtkPrinter *printer);
gboolean gtk_printer_is_virtual (GtkPrinter *printer);
gboolean gtk_printer_is_default (GtkPrinter *printer);
gboolean gtk_printer_accepts_pdf (GtkPrinter *printer);
......
......@@ -96,6 +96,12 @@ static gboolean dialog_get_collate (GtkPrintUnixDialog *dialog);
static gboolean dialog_get_reverse (GtkPrintUnixDialog *dialog);
static gint dialog_get_n_copies (GtkPrintUnixDialog *dialog);
static void set_cell_sensitivity_func (GtkTreeViewColumn *tree_column,
GtkCellRenderer *cell,
GtkTreeModel *model,
GtkTreeIter *iter,
gpointer data);
/* GtkBuildable */
static void gtk_print_unix_dialog_buildable_init (GtkBuildableIface *iface);
static GObject *gtk_print_unix_dialog_buildable_get_internal_child (GtkBuildable *buildable,
......@@ -309,12 +315,12 @@ add_custom_button_to_dialog (GtkDialog *dialog,
gtk_dialog_add_action_widget (GTK_DIALOG (dialog), button, response_id);
}
/* Presents an overwrite confirmation dialog ("print to file" backend).
/* This function handles error messages before printing.
*/
static gboolean
overwrite_confirmation_dialog (GtkPrintUnixDialog *print_dialog,
gint print_dialog_response_id,
gpointer data)
error_dialogs (GtkPrintUnixDialog *print_dialog,
gint print_dialog_response_id,
gpointer data)
{
GtkPrintUnixDialogPrivate *priv = print_dialog->priv;
GtkPrinterOption *option = NULL;
......@@ -330,6 +336,8 @@ overwrite_confirmation_dialog (GtkPrintUnixDialog *print_dialog,
{
printer = gtk_print_unix_dialog_get_selected_printer (print_dialog);
/* Shows overwrite confirmation dialog in the case of printing to file which
* already exists. */
if (printer != NULL && gtk_printer_is_virtual (printer))
{
option = gtk_printer_option_set_lookup (priv->options,
......@@ -418,7 +426,7 @@ gtk_print_unix_dialog_init (GtkPrintUnixDialog *dialog)
g_signal_connect (dialog,
"response",
(GCallback) overwrite_confirmation_dialog,
(GCallback) error_dialogs,
NULL);
priv->preview_button = gtk_button_new_from_stock (GTK_STOCK_PRINT_PREVIEW);
......@@ -568,6 +576,28 @@ gtk_print_unix_dialog_buildable_get_internal_child (GtkBuildable *buildable,
return parent_buildable_iface->get_internal_child (buildable, builder, childname);
}
/* This function controls "sensitive" property of GtkCellRenderer based on pause
* state of printers. */
void set_cell_sensitivity_func (GtkTreeViewColumn *tree_column,
GtkCellRenderer *cell,
GtkTreeModel *tree_model,
GtkTreeIter *iter,
gpointer data)
{
GtkPrinter *printer;
gtk_tree_model_get (tree_model, iter, PRINTER_LIST_COL_PRINTER_OBJ, &printer, -1);
if (printer != NULL && !gtk_printer_is_accepting_jobs (printer))
g_object_set (cell,
"sensitive", FALSE,
NULL);
else
g_object_set (cell,
"sensitive", TRUE,
NULL);
}
static void
printer_status_cb (GtkPrintBackend *backend,
GtkPrinter *printer,
......@@ -575,6 +605,7 @@ printer_status_cb (GtkPrintBackend *backend,
{
GtkPrintUnixDialogPrivate *priv = dialog->priv;
GtkTreeIter *iter;
GtkTreeSelection *selection;
iter = g_object_get_data (G_OBJECT (printer), "gtk-print-tree-iter");
......@@ -585,6 +616,10 @@ printer_status_cb (GtkPrintBackend *backend,
PRINTER_LIST_COL_LOCATION, gtk_printer_get_location (printer),
-1);
/* When the pause state change then we need to update sensitive property
* of GTK_RESPONSE_OK button inside of selected_printer_changed function. */
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->printer_treeview));
selected_printer_changed (selection, dialog);
}
static void
......@@ -1410,6 +1445,21 @@ selected_printer_changed (GtkTreeSelection *selection,
PRINTER_LIST_COL_PRINTER_OBJ, &printer,
-1);
}
/* sets GTK_RESPONSE_OK button sensitive/insensitive depending on whether the printer
* accepts/rejects jobs */
if (printer != NULL)
{
if (!gtk_printer_is_accepting_jobs (printer))
{
gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog), GTK_RESPONSE_OK, FALSE);
}
else
{
if (priv->current_printer == printer && gtk_printer_has_details (printer))
gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog), GTK_RESPONSE_OK, TRUE);
}
}
if (printer != NULL && !gtk_printer_has_details (printer))
{
......@@ -1445,7 +1495,8 @@ selected_printer_changed (GtkTreeSelection *selection,
priv->printer_capabilities = 0;
gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog), GTK_RESPONSE_OK, TRUE);
if (gtk_printer_is_accepting_jobs (printer))
gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog), GTK_RESPONSE_OK, TRUE);
priv->current_printer = printer;
if (printer != NULL)
......@@ -1659,6 +1710,7 @@ create_main_page (GtkPrintUnixDialog *dialog)
"icon-name",
PRINTER_LIST_COL_ICON,
NULL);
gtk_tree_view_column_set_cell_data_func (column, renderer, set_cell_sensitivity_func, NULL, NULL);
gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column);
renderer = gtk_cell_renderer_text_new ();
......@@ -1667,6 +1719,7 @@ create_main_page (GtkPrintUnixDialog *dialog)
"text",
PRINTER_LIST_COL_NAME,
NULL);
gtk_tree_view_column_set_cell_data_func (column, renderer, set_cell_sensitivity_func, NULL, NULL);
gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column);
renderer = gtk_cell_renderer_text_new ();
......@@ -1675,6 +1728,7 @@ create_main_page (GtkPrintUnixDialog *dialog)
"text",
PRINTER_LIST_COL_LOCATION,
NULL);
gtk_tree_view_column_set_cell_data_func (column, renderer, set_cell_sensitivity_func, NULL, NULL);
gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column);
renderer = gtk_cell_renderer_text_new ();
......@@ -1684,6 +1738,7 @@ create_main_page (GtkPrintUnixDialog *dialog)
"text",
PRINTER_LIST_COL_STATE,
NULL);
gtk_tree_view_column_set_cell_data_func (column, renderer, set_cell_sensitivity_func, NULL, NULL);
gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column);
gtk_widget_show (treeview);
......
......@@ -148,6 +148,7 @@ void gtk_stock_set_translate_func (const gchar *domain,
#define GTK_STOCK_PREFERENCES "gtk-preferences"
#define GTK_STOCK_PRINT "gtk-print"
#define GTK_STOCK_PRINT_ERROR "gtk-print-error"
#define GTK_STOCK_PRINT_PAUSED "gtk-print-paused"
#define GTK_STOCK_PRINT_PREVIEW "gtk-print-preview"
#define GTK_STOCK_PRINT_REPORT "gtk-print-report"
#define GTK_STOCK_PRINT_WARNING "gtk-print-warning"
......
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="16"
height="16"
id="svg4908"
sodipodi:version="0.32"
inkscape:version="0.46"
version="1.0"
sodipodi:docbase="/home/andreas/project/gtk/24"
sodipodi:docname="gtk-print-paused.svg"
inkscape:output_extension="org.inkscape.output.svg.inkscape"
inkscape:export-filename="/home/mkasik/Devel/Bugs/gtk+384940/icons/GTK/16x16/gtk-print-paused.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90"
sodipodi:modified="true">
<defs
id="defs4910">
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient7658"
id="linearGradient3441"
gradientUnits="userSpaceOnUse"
x1="43.882969"
y1="-42.861526"
x2="39.987103"
y2="-42.861526"
gradientTransform="translate(0,4.0216698)" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3460"
id="linearGradient3456"
x1="44.287689"
y1="-39.951534"
x2="36.799889"
y2="-39.951534"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1,0,0,1.1101512,0,4.348586)" />
<linearGradient
id="linearGradient7658"
inkscape:collect="always">
<stop
id="stop7660"
offset="0"
style="stop-color:#d3d7cf" />
<stop
id="stop7662"
offset="1"
style="stop-color:#eeeeec" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient7658"
id="linearGradient3447"
gradientUnits="userSpaceOnUse"
x1="43.882969"
y1="-42.861526"
x2="39.987103"
y2="-42.861526" />
<linearGradient
id="linearGradient3460">
<stop
id="stop3462"
offset="0"
style="stop-color:#343533;stop-opacity:1;" />
<stop
id="stop3464"
offset="1"
style="stop-color:#343533;stop-opacity:0.5;" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3460"
id="linearGradient3458"
x1="44.287689"
y1="-39.951534"
x2="36.799889"
y2="-39.951534"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1,0,0,1.1101512,0,4.7915781)" />
<linearGradient
inkscape:collect="always"
id="linearGradient3061">
<stop
style="stop-color:black;stop-opacity:1;"
offset="0"
id="stop3063" />
<stop
style="stop-color:black;stop-opacity:0;"
offset="1"
id="stop3065" />
</linearGradient>
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient3061"
id="radialGradient2559"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1,0,0,1.025362,0,-1.055427)"
cx="40.393475"
cy="41.613941"
fx="40.393475"
fy="41.613941"
r="6.0987959" />
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 12 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="24 : 12 : 1"
inkscape:persp3d-origin="12 : 8 : 1"
id="perspective3630" />
<linearGradient
inkscape:collect="always"
id="linearGradient6093">
<stop
style="stop-color:#000000;stop-opacity:1;"
offset="0"
id="stop6095" />
<stop
style="stop-color:#000000;stop-opacity:0;"
offset="1"
id="stop6097" />
</linearGradient>
<linearGradient
id="linearGradient6056"
inkscape:collect="always">
<stop
id="stop6058"
offset="0"
style="stop-color:#ffffff;stop-opacity:1" />
<stop
id="stop6060"
offset="1"
style="stop-color:#d3d7cf;stop-opacity:1" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient6056"
id="linearGradient5966"
x1="13.84057"
y1="9.1469946"
x2="4.4762087"
y2="-0.6407786"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient6093"
id="linearGradient6099"
x1="11.5625"
y1="11.125"
x2="11.5625"
y2="8.1793661"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1,0,0,0.5,0,6)" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3460"
id="linearGradient3683"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1,0,0,1.1101512,0,4.7915781)"
x1="44.287689"
y1="-39.951534"
x2="36.799889"
y2="-39.951534" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient7658"
id="linearGradient3685"
gradientUnits="userSpaceOnUse"
x1="43.882969"
y1="-42.861526"
x2="39.987103"
y2="-42.861526" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3460"
id="linearGradient3687"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1,0,0,1.1101512,0,4.348586)"
x1="44.287689"
y1="-39.951534"
x2="36.799889"
y2="-39.951534" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient7658"
id="linearGradient3689"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(0,4.0216698)"
x1="43.882969"
y1="-42.861526"
x2="39.987103"
y2="-42.861526" />
<linearGradient
gradientTransform="matrix(0.7142859,0,0,0.5,-0.5714286,1.9999993)"
gradientUnits="userSpaceOnUse"
y2="8.1793661"
x2="11.5625"
y1="11.125"
x1="11.5625"
id="linearGradient2586"
xlink