Commit 6762bf5b authored by Benoit Touchette's avatar Benoit Touchette Committed by Michael Natterer

Bug 759105 - Patch to add icon theme selection

Add support for custom icon themes much like custom theme
support. There is still work to be done but this is the
basic functionality.
parent 01bdb712
......@@ -40,6 +40,7 @@
#endif
#define DEFAULT_THEME "Default"
#define DEFAULT_ICON_THEME "Default"
#define DEFAULT_USER_MANUAL_ONLINE_URI \
"http://docs.gimp.org/" GIMP_APP_VERSION_STRING
......@@ -69,6 +70,8 @@ enum
PROP_TOOLBOX_WILBER,
PROP_THEME_PATH,
PROP_THEME,
PROP_ICON_THEME_PATH,
PROP_ICON_THEME,
PROP_USE_HELP,
PROP_SHOW_HELP_BUTTON,
PROP_HELP_LOCALES,
......@@ -228,6 +231,17 @@ gimp_gui_config_class_init (GimpGuiConfigClass *klass)
"theme", THEME_BLURB,
DEFAULT_THEME,
GIMP_PARAM_STATIC_STRINGS);
path = gimp_config_build_data_path ("icons");
GIMP_CONFIG_INSTALL_PROP_PATH (object_class, PROP_ICON_THEME_PATH,
"icon-theme-path", ICON_THEME_PATH_BLURB,
GIMP_CONFIG_PATH_DIR_LIST, path,
GIMP_PARAM_STATIC_STRINGS |
GIMP_CONFIG_PARAM_RESTART);
g_free (path);
GIMP_CONFIG_INSTALL_PROP_STRING (object_class, PROP_ICON_THEME,
"icon-theme", ICON_THEME_BLURB,
DEFAULT_ICON_THEME,
GIMP_PARAM_STATIC_STRINGS);
GIMP_CONFIG_INSTALL_PROP_BOOLEAN (object_class, PROP_USE_HELP,
"use-help", USE_HELP_BLURB,
TRUE,
......@@ -394,6 +408,8 @@ gimp_gui_config_finalize (GObject *object)
g_free (gui_config->theme_path);
g_free (gui_config->theme);
g_free (gui_config->icon_theme_path);
g_free (gui_config->icon_theme);
g_free (gui_config->help_locales);
g_free (gui_config->web_browser);
g_free (gui_config->user_manual_online_uri);
......@@ -476,6 +492,14 @@ gimp_gui_config_set_property (GObject *object,
g_free (gui_config->theme);
gui_config->theme = g_value_dup_string (value);
break;
case PROP_ICON_THEME_PATH:
g_free (gui_config->icon_theme_path);
gui_config->icon_theme_path = g_value_dup_string (value);
break;
case PROP_ICON_THEME:
g_free (gui_config->icon_theme);
gui_config->icon_theme = g_value_dup_string (value);
break;
case PROP_USE_HELP:
gui_config->use_help = g_value_get_boolean (value);
break;
......@@ -625,6 +649,12 @@ gimp_gui_config_get_property (GObject *object,
case PROP_THEME:
g_value_set_string (value, gui_config->theme);
break;
case PROP_ICON_THEME_PATH:
g_value_set_string (value, gui_config->icon_theme_path);
break;
case PROP_ICON_THEME:
g_value_set_string (value, gui_config->icon_theme);
break;
case PROP_USE_HELP:
g_value_set_boolean (value, gui_config->use_help);
break;
......
......@@ -58,6 +58,8 @@ struct _GimpGuiConfig
gboolean toolbox_wilber;
gchar *theme_path;
gchar *theme;
gchar *icon_theme_path;
gchar *icon_theme;
gboolean use_help;
gboolean show_help_button;
gchar *help_locales;
......
......@@ -431,6 +431,12 @@ _("Sets the folder for temporary storage. Files will appear here " \
#define THEME_PATH_BLURB \
"Sets the theme search path."
#define ICON_THEME_BLURB \
"The name of the icon theme to use."
#define ICON_THEME_PATH_BLURB \
"Sets the icon theme search path."
#define THUMBNAIL_SIZE_BLURB \
_("Sets the size of the thumbnail shown in the Open dialog.")
......
......@@ -52,6 +52,7 @@ gimp_gui_init (Gimp *gimp)
gimp->gui.get_display_name = NULL;
gimp->gui.get_user_time = NULL;
gimp->gui.get_theme_dir = NULL;
gimp->gui.get_icon_theme_dir = NULL;
gimp->gui.display_get_by_id = NULL;
gimp->gui.display_get_id = NULL;
gimp->gui.display_get_window_id = NULL;
......@@ -266,6 +267,17 @@ gimp_get_theme_dir (Gimp *gimp)
return NULL;
}
GFile *
gimp_get_icon_theme_dir (Gimp *gimp)
{
g_return_val_if_fail (GIMP_IS_GIMP (gimp), NULL);
if (gimp->gui.get_icon_theme_dir)
return gimp->gui.get_icon_theme_dir (gimp);
return NULL;
}
GimpObject *
gimp_get_window_strategy (Gimp *gimp)
{
......
......@@ -49,6 +49,7 @@ struct _GimpGui
guint32 (* get_user_time) (Gimp *gimp);
GFile * (* get_theme_dir) (Gimp *gimp);
GFile * (* get_icon_theme_dir) (Gimp *gimp);
GimpObject * (* get_window_strategy) (Gimp *gimp);
GimpObject * (* get_empty_display) (Gimp *gimp);
......@@ -159,6 +160,7 @@ gchar * gimp_get_display_name (Gimp *gimp,
gint *monitor);
guint32 gimp_get_user_time (Gimp *gimp);
GFile * gimp_get_theme_dir (Gimp *gimp);
GFile * gimp_get_icon_theme_dir (Gimp *gimp);
gboolean gimp_pdb_dialog_new (Gimp *gimp,
GimpContext *context,
......
......@@ -102,6 +102,7 @@ gimp_user_install_items[] =
{ "scripts", USER_INSTALL_MKDIR },
{ "templates", USER_INSTALL_MKDIR },
{ "themes", USER_INSTALL_MKDIR },
{ "icons", USER_INSTALL_MKDIR },
{ "tmp", USER_INSTALL_MKDIR },
{ "curves", USER_INSTALL_MKDIR },
{ "levels", USER_INSTALL_MKDIR },
......
......@@ -60,6 +60,7 @@
#include "tools/gimp-tools.h"
#include "gui/session.h"
#include "gui/icon-themes.h"
#include "gui/themes.h"
#include "preferences-dialog.h"
......@@ -723,7 +724,7 @@ prefs_theme_select_callback (GtkTreeSelection *sel,
GValue val = { 0, };
gtk_tree_model_get_value (model, &iter, 0, &val);
g_object_set (gimp->config, "theme", g_value_get_string (&val), NULL);
g_object_set_property (G_OBJECT (gimp->config), "theme", &val);
g_value_unset (&val);
}
}
......@@ -735,6 +736,24 @@ prefs_theme_reload_callback (GtkWidget *button,
g_object_notify (G_OBJECT (gimp->config), "theme");
}
static void
prefs_icon_theme_select_callback (GtkTreeSelection *sel,
Gimp *gimp)
{
GtkTreeModel *model;
GtkTreeIter iter;
if (gtk_tree_selection_get_selected (sel, &model, &iter))
{
GtkWidget *dialog;
GValue val = { 0, };
gtk_tree_model_get_value (model, &iter, 0, &val);
g_object_set_property (G_OBJECT (gimp->config), "icon-theme", &val);
g_value_unset (&val);
}
}
static GtkWidget *
prefs_frame_new (const gchar *label,
GtkContainer *parent,
......@@ -1661,6 +1680,97 @@ prefs_dialog_new (Gimp *gimp,
gimp);
/****************/
/* Icon Theme */
/****************/
pixbuf = prefs_get_pixbufs (dialog, "icon-theme", &small_pixbuf);
vbox = gimp_prefs_box_add_page (GIMP_PREFS_BOX (prefs_box),
_("Icon Theme"),
pixbuf,
NULL,
small_pixbuf,
GIMP_HELP_PREFS_ICON_THEME,
NULL,
&top_iter);
vbox2 = prefs_frame_new (_("Select an Icon Theme"), GTK_CONTAINER (vbox), TRUE);
{
GtkWidget *scrolled_win;
GtkListStore *list_store;
GtkWidget *view;
GtkTreeSelection *sel;
gchar **icon_themes;
gint n_icon_themes;
gint i;
scrolled_win = gtk_scrolled_window_new (NULL, NULL);
gtk_widget_set_size_request (scrolled_win, -1, 80);
gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_win),
GTK_SHADOW_IN);
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
GTK_POLICY_NEVER,
GTK_POLICY_AUTOMATIC);
gtk_box_pack_start (GTK_BOX (vbox2), scrolled_win, TRUE, TRUE, 0);
gtk_widget_show (scrolled_win);
list_store = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_STRING);
view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (list_store));
gtk_container_add (GTK_CONTAINER (scrolled_win), view);
gtk_widget_show (view);
g_object_unref (list_store);
gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (view), 0,
_("Icon Theme"),
gtk_cell_renderer_text_new (),
"text", 0,
NULL);
gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (view), 1,
_("Folder"),
gtk_cell_renderer_text_new (),
"text", 1,
NULL);
sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (view));
icon_themes = icon_themes_list_themes (gimp, &n_icon_themes);
for (i = 0; i < n_icon_themes; i++)
{
GtkTreeIter iter;
GFile *icon_theme_dir = icon_themes_get_theme_dir (gimp, icon_themes[i]);
gtk_list_store_append (list_store, &iter);
gtk_list_store_set (list_store, &iter,
0, icon_themes[i],
1, gimp_file_get_utf8_name (icon_theme_dir),
-1);
if (GIMP_GUI_CONFIG (object)->icon_theme &&
! strcmp (GIMP_GUI_CONFIG (object)->icon_theme, icon_themes[i]))
{
GtkTreePath *path;
path = gtk_tree_model_get_path (GTK_TREE_MODEL (list_store), &iter);
gtk_tree_view_set_cursor (GTK_TREE_VIEW (view), path, NULL, FALSE);
gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (view), path,
NULL, FALSE, 0.0, 0.0);
gtk_tree_path_free (path);
}
}
g_strfreev (icon_themes);
g_signal_connect (sel, "changed",
G_CALLBACK (prefs_icon_theme_select_callback),
gimp);
}
/*****************/
/* Help System */
/*****************/
......
......@@ -35,6 +35,8 @@ libappgui_a_sources = \
gui-vtable.c \
gui-vtable.h \
gui-types.h \
icon-themes.c \
icon-themes.h \
session.c \
session.h \
splash.c \
......
......@@ -81,6 +81,7 @@
#include "gui.h"
#include "gui-message.h"
#include "gui-vtable.h"
#include "icon-themes.h"
#include "themes.h"
......@@ -105,6 +106,7 @@ static gchar * gui_get_display_name (Gimp *gimp,
gint *monitor);
static guint32 gui_get_user_time (Gimp *gimp);
static GFile * gui_get_theme_dir (Gimp *gimp);
static GFile * gui_get_icon_theme_dir (Gimp *gimp);
static GimpObject * gui_get_window_strategy (Gimp *gimp);
static GimpObject * gui_get_empty_display (Gimp *gimp);
static GimpObject * gui_display_get_by_ID (Gimp *gimp,
......@@ -176,6 +178,7 @@ gui_vtable_init (Gimp *gimp)
gimp->gui.get_display_name = gui_get_display_name;
gimp->gui.get_user_time = gui_get_user_time;
gimp->gui.get_theme_dir = gui_get_theme_dir;
gimp->gui.get_icon_theme_dir = gui_get_icon_theme_dir;
gimp->gui.get_window_strategy = gui_get_window_strategy;
gimp->gui.get_empty_display = gui_get_empty_display;
gimp->gui.display_get_by_id = gui_display_get_by_ID;
......@@ -306,6 +309,12 @@ gui_get_theme_dir (Gimp *gimp)
return themes_get_theme_dir (gimp, GIMP_GUI_CONFIG (gimp->config)->theme);
}
static GFile *
gui_get_icon_theme_dir (Gimp *gimp)
{
return icon_themes_get_theme_dir (gimp, GIMP_GUI_CONFIG (gimp->config)->icon_theme);
}
static GimpObject *
gui_get_window_strategy (Gimp *gimp)
{
......
......@@ -74,6 +74,7 @@
#include "gui.h"
#include "gui-unique.h"
#include "gui-vtable.h"
#include "icon-themes.h"
#include "session.h"
#include "splash.h"
#include "themes.h"
......@@ -234,6 +235,8 @@ gui_init (Gimp *gimp,
themes_init (gimp);
icon_themes_init (gimp);
initial_monitor = gimp_get_monitor_at_pointer (&initial_screen);
gtk_widget_set_default_colormap (gdk_screen_get_rgb_colormap (initial_screen));
......
/* GIMP - The GNU Image Manipulation Program
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
*
* icon-themes.c
* Copyright (C) 2015 Benoit Touchette
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "config.h"
#include <stdlib.h>
#include <gegl.h>
#include <gtk/gtk.h>
#include "libgimpbase/gimpbase.h"
#include "libgimpconfig/gimpconfig.h"
#include "libgimpwidgets/gimpwidgets.h"
#include "gui-types.h"
#include "config/gimpguiconfig.h"
#include "core/gimp.h"
#include "icon-themes.h"
#include "gimp-intl.h"
static void icons_list_icons_foreach (gpointer key,
gpointer value,
gpointer data);
static gint icons_name_compare (const void *p1,
const void *p2);
static void icons_theme_change_notify (GimpGuiConfig *config,
GParamSpec *pspec,
Gimp *gimp);
void icons_set_icon_theme (GtkIconTheme *new_icon_theme);
static void icons_apply_theme (Gimp *gimp,
const gchar *icon_theme_name);
static GHashTable *icon_themes_hash = NULL;
void
icon_themes_init (Gimp *gimp)
{
GimpGuiConfig *config;
g_return_if_fail (GIMP_IS_GIMP (gimp));
config = GIMP_GUI_CONFIG (gimp->config);
icon_themes_hash = g_hash_table_new_full (g_str_hash,
g_str_equal,
g_free,
g_object_unref);
if (config->icon_theme_path)
{
GList *path;
GList *list;
path = gimp_config_path_expand_to_files (config->icon_theme_path, NULL);
for (list = path; list; list = g_list_next (list))
{
GFile *dir = list->data;
GFileEnumerator *enumerator;
enumerator =
g_file_enumerate_children (dir,
G_FILE_ATTRIBUTE_STANDARD_NAME ","
G_FILE_ATTRIBUTE_STANDARD_IS_HIDDEN ","
G_FILE_ATTRIBUTE_STANDARD_TYPE,
G_FILE_QUERY_INFO_NONE,
NULL, NULL);
if (enumerator)
{
GFileInfo *info;
while ((info = g_file_enumerator_next_file (enumerator,
NULL, NULL)))
{
if (! g_file_info_get_is_hidden (info) &&
g_file_info_get_file_type (info) == G_FILE_TYPE_DIRECTORY)
{
GFile *file;
GFile *index_theme;
file = g_file_enumerator_get_child (enumerator, info);
/* make sure there is a index.theme file */
index_theme = g_file_get_child (file, "index.theme");
if (index_theme)
{
const gchar *name;
gchar *basename;
g_object_unref (index_theme);
name = gimp_file_get_utf8_name (file);
basename = g_path_get_basename (name);
if (gimp->be_verbose)
g_print ("Adding icon theme '%s' (%s)\n",
basename, name);
g_hash_table_insert (icon_themes_hash, basename, file);
}
}
g_object_unref (info);
}
g_object_unref (enumerator);
}
}
g_list_free_full (path, (GDestroyNotify) g_object_unref);
}
g_signal_connect (config, "notify::icon-theme",
G_CALLBACK (icons_theme_change_notify),
gimp);
icons_theme_change_notify (config, NULL, gimp);
}
void
icon_themes_exit (Gimp *gimp)
{
g_return_if_fail (GIMP_IS_GIMP (gimp));
if (icon_themes_hash)
{
g_signal_handlers_disconnect_by_func (gimp->config,
icons_theme_change_notify,
gimp);
g_hash_table_destroy (icon_themes_hash);
icon_themes_hash = NULL;
}
}
gchar **
icon_themes_list_themes (Gimp *gimp,
gint *n_icon_themes)
{
g_return_val_if_fail (GIMP_IS_GIMP (gimp), NULL);
g_return_val_if_fail (n_icon_themes != NULL, NULL);
*n_icon_themes = g_hash_table_size (icon_themes_hash);
if (*n_icon_themes > 0)
{
gchar **icon_themes;
gchar **index;
icon_themes = g_new0 (gchar *, *n_icon_themes + 1);
index = icon_themes;
g_hash_table_foreach (icon_themes_hash, icons_list_icons_foreach, &index);
qsort (icon_themes, *n_icon_themes, sizeof (gchar *), icons_name_compare);
return icon_themes;
}
return NULL;
}
GFile *
icon_themes_get_theme_dir (Gimp *gimp,
const gchar *icon_theme_name)
{
g_return_val_if_fail (GIMP_IS_GIMP (gimp), NULL);
if (! icon_theme_name)
icon_theme_name = "Default";
return g_hash_table_lookup (icon_themes_hash, icon_theme_name);
}
static void
icons_apply_theme (Gimp *gimp,
const gchar *icon_theme_name)
{
GtkIconTheme *icon_theme;
gchar **paths;
gint n_paths;
g_return_if_fail (GIMP_IS_GIMP (gimp));
if (! icon_theme_name)
icon_theme_name = "Default";
if (gimp->be_verbose)
g_print ("Loading icon theme '%s'\n", icon_theme_name);
icon_theme = gtk_icon_theme_get_default ();
gtk_icon_theme_get_search_path (icon_theme, &paths, &n_paths);
if (paths)
{
GFile *icon_theme_dir = icon_themes_get_theme_dir (gimp, icon_theme_name);
g_free (paths[0]);
paths[0] = g_file_get_path (icon_theme_dir);
gtk_icon_theme_set_search_path (icon_theme,
(const gchar **) paths, n_paths);
g_strfreev (paths);
}
}
static void
icons_list_icons_foreach (gpointer key,
gpointer value,
gpointer data)
{
gchar ***index = data;
**index = g_strdup ((gchar *) key);
(*index)++;
}
static gint
icons_name_compare (const void *p1,
const void *p2)
{
return strcmp (* (char **) p1, * (char **) p2);
}
static void
icons_theme_change_notify (GimpGuiConfig *config,
GParamSpec *pspec,
Gimp *gimp)
{
icons_apply_theme (gimp, config->icon_theme);
}
/* GIMP - The GNU Image Manipulation Program
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
*
* icon-themes.h
* Copyright (C) 2015 Benoit Touchette
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef __ICONS_THEMES_H__
#define __ICONS_THEMES_H__
void icon_themes_init (Gimp *gimp);
void icon_themes_exit (Gimp *gimp);
gchar ** icon_themes_list_themes (Gimp *gimp,
gint *n_themes);
GFile * icon_themes_get_theme_dir (Gimp *gimp,
const gchar *theme_name);
#endif /* __ICONS_THEMES_H__ */
......@@ -473,6 +473,7 @@
#define GIMP_HELP_PREFS_INTERFACE "gimp-prefs-interface"
#define GIMP_HELP_PREFS_HELP "gimp-prefs-help"
#define GIMP_HELP_PREFS_THEME "gimp-prefs-theme"
#define GIMP_HELP_PREFS_ICON_THEME "gimp-prefs-icon-theme"
#define GIMP_HELP_PREFS_TOOL_OPTIONS "gimp-prefs-tool-options"
#define GIMP_HELP_PREFS_TOOLBOX "gimp-prefs-toolbox"
#define GIMP_HELP_PREFS_INPUT_DEVICES "gimp-prefs-input-devices"
......@@ -501,6 +502,7 @@
#define GIMP_HELP_PREFS_FOLDERS_INTERPRETERS "gimp-prefs-folders-interpreters"
#define GIMP_HELP_PREFS_FOLDERS_ENVIRONMENT "gimp-prefs-folders-environment"
#define GIMP_HELP_PREFS_FOLDERS_THEMES "gimp-prefs-folders-themes"
#define GIMP_HELP_PREFS_FOLDERS_ICON_THEMES "gimp-prefs-folders-icon-themes"
#define GIMP_HELP_INPUT_DEVICES "gimp-help-input-devices"
#define GIMP_HELP_KEYBOARD_SHORTCUTS "gimp-help-keyboard-shortcuts"
......
<?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"
version="1.0"
x="0.0000000"
y="0.0000000"
width="16"
height="16"
id="svg1"
sodipodi:version="0.32"
inkscape:version="0.91 r13725"
sodipodi:docname="gimp-prefs-icon-theme.svg">
<metadata
id="metadata162">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<dc:creator>
<cc:Agent>
<dc:title>Jakub Steiner</dc:title>
</cc:Agent>
</dc:creator>
<dc:date>2005-02-01</dc:date>
<cc:license
rdf:resource="http://creativecommons.org/licenses/GPL/2.0/" />
<dc:identifier>http://jimmac.musichall.cz/</dc:identifier>
<dc:subject>
<rdf:Bag>
<rdf:li>folder</rdf:li>
<rdf:li>directory</rdf:li>
<rdf:li>storage</rdf:li>
</rdf:Bag>
</dc:subject>
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/GPL/2.0/">
<cc:permits
rdf:resource="http://web.resource.org/cc/Reproduction" />
<cc:permits
rdf:resource="http://web.resource.org/cc/Distribution" />
<cc:requires
rdf:resource="http://web.resource.org/cc/Notice" />
<cc:permits
rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
<cc:requires
rdf:resource="http://web.resource.org/cc/ShareAlike" />
<cc:requires
rdf:resource="http://web.resource.org/cc/SourceCode" />
</cc:License>
</rdf:RDF>
</metadata>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666"
borderopacity="1"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:window-width="1043"
inkscape:window-height="655"
inkscape:cy="2.1714916"
inkscape:cx="12.766286"
inkscape:zoom="16"
inkscape:document-units="px"
showgrid="false"
inkscape:window-x="515"
inkscape:window-y="217"
inkscape:current-layer="layer2"