gimp/app/dialogs/about-dialog.c

1001 lines
36 KiB
C
Raw Normal View History

/* The GIMP -- an image manipulation program
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
*
* 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 2 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, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "config.h"
1999-03-07 20:56:03 +08:00
#include <string.h>
1997-11-25 06:05:25 +08:00
#include <time.h>
1998-07-15 10:28:31 +08:00
#include <gtk/gtk.h>
1998-07-15 10:28:31 +08:00
#include "libgimpbase/gimpbase.h"
configure.in added new directory app/dialogs and link libappdialogs.c into 2004-09-13 Michael Natterer <mitch@gimp.org> * configure.in * app/Makefile.am: added new directory app/dialogs and link libappdialogs.c into the gimp binary. * app/gui/Makefile.am * app/gui/gui-types.h * app/gui/gui-vtable.c * app/gui/gui.c * app/gui/about-dialog.[ch] * app/gui/authors.h * app/gui/color-notebook.[ch] * app/gui/convert-dialog.[ch] * app/gui/dialogs-constructors.[ch] * app/gui/dialogs.[ch] * app/gui/file-dialog-utils.[ch] * app/gui/file-new-dialog.[ch] * app/gui/file-open-dialog.[ch] * app/gui/file-open-location-dialog.[ch] * app/gui/file-save-dialog.[ch] * app/gui/grid-dialog.[ch] * app/gui/info-dialog.[ch] * app/gui/info-window.[ch] * app/gui/module-browser.[ch] * app/gui/offset-dialog.[ch] * app/gui/palette-import-dialog.[ch] * app/gui/preferences-dialog.[ch] * app/gui/quit-dialog.[ch] * app/gui/resize-dialog.[ch] * app/gui/resolution-calibrate-dialog.[ch] * app/gui/stroke-dialog.[ch] * app/gui/tips-dialog.[ch] * app/gui/tips-parser.[ch] * app/gui/user-install-dialog.[ch]: removed these files... * app/dialogs/Makefile.am * app/dialogs/dialogs-types.h * app/dialogs/*.[ch]: ...and added them here. Changed some filenames like module-browser -> module-dialog. * app/app_procs.c * app/actions/actions-types.h * app/actions/actions.c * app/actions/dialogs-actions.c * app/actions/dialogs-commands.c * app/actions/dockable-commands.c * app/actions/drawable-commands.c * app/actions/edit-commands.c * app/actions/file-commands.c * app/actions/gradient-editor-commands.c * app/actions/image-commands.c * app/actions/layers-commands.c * app/actions/palettes-commands.c * app/actions/select-commands.c * app/actions/templates-commands.c * app/actions/templates-commands.h * app/actions/vectors-commands.c * app/actions/view-commands.c * app/display/gimpdisplayshell-cursor.c * app/display/gimpdisplayshell-title.c * app/display/gimpdisplayshell.[ch] * app/tools/gimpcroptool.c * app/tools/gimpperspectivetool.c * app/tools/gimprotatetool.c * app/tools/gimpscaletool.c * app/tools/gimpsheartool.c * app/tools/gimptransformtool.[ch] * app/tools/gimpvectortool.c * app/widgets/gimpcolormapeditor.[ch] * app/widgets/gimpcolorpanel.c * app/widgets/gimpgradienteditor.[ch] * app/widgets/gimppaletteeditor.[ch] * app/widgets/gimptoolbox-color-area.c * menus/toolbox-menu.xml.in * tools/authorsgen/authorsgen.pl: changed accordingly.
2004-09-13 23:15:23 +08:00
#include "dialogs-types.h"
#include "core/gimpcontext.h"
Made the tool system work again and integrated it back with the 2001-02-21 Michael Natterer <mitch@gimp.org> Made the tool system work again and integrated it back with the GimpContext. It's a hack between old, new and freshly hacked stuff. There are still lots of warnings but at least we can switch tools again. * app/tools/Makefile.am * app/tools/gimptoolinfo.[ch]: resurrected as real object. The GimpToolInfo objects are derived from GimpData, which gives us the tool icon stuff for free. Also, we need a list of _objects_ which is allocated all the time. All tools are required to have a "register" function which registers themselves with the list of GimpToolInfo objects which is maintained by the tool manager. * app/tools/tool.[ch]: made a real GtkObject with properly named functions out of it. The former "active_tool_control" is of course not the default implementation of the tool's "control" method but a hack _around_ it, so it went to the tool manager. * app/tools/color_picker.[ch] * app/tools/measure.[ch]: ditto. Added "register" functions and "destroy" implementations so the tools go away after use. * app/tools/tool_manager.[ch]: badly hacked at the moment to keep both the list of class structures _and_ the tool info list. * app/tools/tools.c: call the tools' register functions. * app/gimpcontext.[ch]: store a pointer to a GimpToolInfo object as "active_tool" in the context, so we're independent of tools being allocated or not. It's treated just like a brush or pattern now. * app/gimpdnd.[ch]: made tool DND work like all other DND types. * app/devices.[ch]: also here: the tool is just a normal data object now, resulting in removal of lots of code. * app/commands.c * app/context_manager.c: updated the tool select and context stuff to work again. * app/toolbox.c: removed the old pixmap buttons and put GimpPreviews inside the tool buttons. Still needs an own preview type to look nice. * app/disp_callbacks.c * app/about_dialog.c * app/app_procs.c * app/appenums.h * app/apptypes.h * app/gimage.c * app/gimppalette.c * app/gimppreview.c * app/gimprc.c * app/info_window.c * app/menus.c * app/palette_select.h * app/scale.c * app/scroll.c: lots of changes to make it work again.
2001-02-21 20:18:09 +08:00
#include "pdb/procedural_db.h"
app/Makefile.am app/gui/Makefile.am app/about_dialog.[ch] 2001-04-17 Michael Natterer <mitch@gimp.org> * app/Makefile.am * app/gui/Makefile.am * app/about_dialog.[ch] * app/brush_edit.[ch] * app/brush_select.[ch] * app/channels_dialog.[ch] * app/color_area.[ch] * app/color_notebook.[ch] * app/color_select.[ch] * app/colormap_dialog.[ch] * app/commands.[ch] * app/file_new_dialog.[ch] * app/gradient_editor.[ch] * app/gradient_select.[ch] * app/indicator_area.[ch] * app/info_dialog.[ch] * app/info_window.[ch] * app/layer_select.[ch] * app/layers_dialog.[ch] * app/menus.[ch] * app/palette.[ch] * app/palette_import.[ch] * app/palette_select.[ch] * app/paths_dialog.[ch] * app/pattern_select.[ch] * app/preferences_dialog.[ch] * app/session.[ch] * app/test_commands.[ch] * app/tips_dialog.[ch] * app/toolbox.[ch]: moved to gui/ (s/_/-/ and some more useful filenames on the way). * app/app_procs.c * app/context_manager.c * app/convert.c * app/disp_callbacks.c * app/errorconsole.c * app/file-open.c * app/file-save.c * app/file-utils.c * app/gdisplay.c * app/gimage.c * app/gimprc.c * app/image_new.c * app/interface.c * app/nav_window.c * app/path.c * app/plug_in.c * app/gui/dialogs-constructors.c * app/pdb/brush_select_cmds.c * app/pdb/convert_cmds.c * app/pdb/gradient_select_cmds.c * app/pdb/pattern_select_cmds.c * app/tools/gimpcolorpickertool.c * app/tools/gimpcroptool.c * app/tools/gimpmagnifytool.c * app/tools/gimpmeasuretool.c * app/tools/gimpscaletool.c * app/tools/gimptransformtool.c * app/widgets/gimpcolorpanel.c * tools/pdbgen/pdb/brush_select.pdb * tools/pdbgen/pdb/convert.pdb * tools/pdbgen/pdb/gradient_select.pdb * tools/pdbgen/pdb/pattern_select.pdb * po/POTFILES.in: changed accordingly.
2001-04-18 05:43:29 +08:00
#include "about-dialog.h"
#include "authors.h"
app/Makefile.am app/gui/Makefile.am app/about_dialog.[ch] 2001-04-17 Michael Natterer <mitch@gimp.org> * app/Makefile.am * app/gui/Makefile.am * app/about_dialog.[ch] * app/brush_edit.[ch] * app/brush_select.[ch] * app/channels_dialog.[ch] * app/color_area.[ch] * app/color_notebook.[ch] * app/color_select.[ch] * app/colormap_dialog.[ch] * app/commands.[ch] * app/file_new_dialog.[ch] * app/gradient_editor.[ch] * app/gradient_select.[ch] * app/indicator_area.[ch] * app/info_dialog.[ch] * app/info_window.[ch] * app/layer_select.[ch] * app/layers_dialog.[ch] * app/menus.[ch] * app/palette.[ch] * app/palette_import.[ch] * app/palette_select.[ch] * app/paths_dialog.[ch] * app/pattern_select.[ch] * app/preferences_dialog.[ch] * app/session.[ch] * app/test_commands.[ch] * app/tips_dialog.[ch] * app/toolbox.[ch]: moved to gui/ (s/_/-/ and some more useful filenames on the way). * app/app_procs.c * app/context_manager.c * app/convert.c * app/disp_callbacks.c * app/errorconsole.c * app/file-open.c * app/file-save.c * app/file-utils.c * app/gdisplay.c * app/gimage.c * app/gimprc.c * app/image_new.c * app/interface.c * app/nav_window.c * app/path.c * app/plug_in.c * app/gui/dialogs-constructors.c * app/pdb/brush_select_cmds.c * app/pdb/convert_cmds.c * app/pdb/gradient_select_cmds.c * app/pdb/pattern_select_cmds.c * app/tools/gimpcolorpickertool.c * app/tools/gimpcroptool.c * app/tools/gimpmagnifytool.c * app/tools/gimpmeasuretool.c * app/tools/gimpscaletool.c * app/tools/gimptransformtool.c * app/widgets/gimpcolorpanel.c * tools/pdbgen/pdb/brush_select.pdb * tools/pdbgen/pdb/convert.pdb * tools/pdbgen/pdb/gradient_select.pdb * tools/pdbgen/pdb/pattern_select.pdb * po/POTFILES.in: changed accordingly.
2001-04-18 05:43:29 +08:00
#include "gimp-intl.h"
app/Makefile.am app/channel_pvt.h app/drawable_pvt.h app/gdisplayF.h 2000-12-29 Michael Natterer <mitch@gimp.org> * app/Makefile.am * app/channel_pvt.h * app/drawable_pvt.h * app/gdisplayF.h * app/gimpdrawableP.h * app/gimpimageP.h * app/layer_pvt.h * app/toolsF.h: removed these files. * app/apptypes.h * tools/pdbgen/enums.pl: added tons of opaque typedefs and enums. * tools/pdbgen/pdb/brush_select.pdb * tools/pdbgen/pdb/brushes.pdb * tools/pdbgen/pdb/channel.pdb * tools/pdbgen/pdb/color.pdb * tools/pdbgen/pdb/convert.pdb * tools/pdbgen/pdb/display.pdb * tools/pdbgen/pdb/drawable.pdb * tools/pdbgen/pdb/fileops.pdb * tools/pdbgen/pdb/gradient_select.pdb * tools/pdbgen/pdb/gradients.pdb * tools/pdbgen/pdb/help.pdb * tools/pdbgen/pdb/image.pdb * tools/pdbgen/pdb/layer.pdb * tools/pdbgen/pdb/pattern_select.pdb * tools/pdbgen/pdb/patterns.pdb * tools/pdbgen/pdb/selection.pdb * tools/pdbgen/pdb/tools.pdb * app/*: chainsaw #include cleanup: - Never (never!!) include stuff in header files except where we need access to structures' contents (like derived objects). - Added prototypes and proper formating in many files. - The #include order in *all* *.c files is as follows: #include "config.h" #include <system stuff> #include <gtk/gtk.h> #include "apptypes.h" #include "gimp stuff" #include "libgimp stuff" #include "libgimp/gimpintl.h" By following this scheme we can easily see a file's dependencies from it's #include's and can grep for the inclusion to find out where a file is used. * tools/pdbgen/app.pl: changed to follow the include scheme above. * libgimp/Makefile.am * libgimp/gimpuitypes.h: new file, included from libgimp/gimpui.h and from app/apptypes.h. * libgimp/gimpcolorbutton.[ch] * libgimp/gimpdialog.[ch] * libgimp/gimphelpui.[ch] * libgimp/gimpparasite.[ch] * libgimp/gimppatheditor.[ch] * libgimp/gimpprotocol.c * libgimp/gimpquerybox.[ch] * libgimp/gimpsizeentry.[ch] * libgimp/gimptypes.h * libgimp/gimpui.h * libgimp/gimpunit.h * libgimp/gimpunitmenu.[ch] * libgimp/gimpwidgets.[ch]: changed accordingly. * plug-ins/FractalExplorer/Dialogs.c * plug-ins/gdyntext/message_window.c * plug-ins/imagemap/imap_default_dialog.c * plug-ins/imagemap/imap_file.c: these files used to include "libgimp/gimpui.h" without including "libgimp/gimp.h". This is no longer possible because the libgimpui headers don't inlcude "libgimp/gimpunit.h" any more.
2000-12-29 23:22:01 +08:00
#define COPYRIGHT \
"Copyright (C) 1995-2005\n" \
"Spencer Kimball, Peter Mattis and the GIMP Development Team"
/* FIXME: let GTK+ do the wrapping (requires GTK+ 2.8) */
#define LICENSE \
"This program is free software; you can redistribute it and/or modify\n" \
"it under the terms of the GNU General Public License as published by\n" \
"the Free Software Foundation; either version 2 of the License, or\n" \
"(at your option) any later version.\n\n" \
"This program is distributed in the hope that it will be useful,\n" \
"but WITHOUT ANY WARRANTY; without even the implied warranty of\n" \
"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n" \
"See the GNU General Public License for more details.\n\n" \
"You should have received a copy of the GNU General Public License\n" \
"along with this program; if not, write to the Free Software\n" \
"Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA."
#define COMMENTS _("GNU Image Manipulation Program")
#define WEBSITE "http://www.gimp.org/"
#define WEBSITE_LABEL _("Visit the GIMP website")
#define PDB_URL_LOAD "plug-in-web-browser"
typedef struct
{
GtkWidget *dialog;
GtkWidget *logo_area;
GdkPixmap *logo_pixmap;
gint logo_width;
gint logo_height;
GdkRectangle text_area;
gdouble text_size;
gdouble min_text_size;
PangoLayout *layout;
PangoFontDescription *font_desc;
gint n_authors;
gint shuffle[G_N_ELEMENTS (authors) - 1]; /* NULL terminated */
guint timer;
gint index;
gint animstep;
gint textrange[2];
gint state;
gboolean visible;
gboolean pp;
} GimpAboutDialog;
static const gchar *founders[] =
{
N_("Version %s brought to you by"), "Spencer Kimball & Peter Mattis"
};
static const PangoColor foreground = { 5000, 5000, 5000 };
static const PangoColor background = { 139 * 257, 137 * 257, 124 * 257 };
static const PangoColor gradient[] =
{
{ 139 * 257, 137 * 257, 124 * 257 },
{ 65535, 65535, 65535 },
{ 5000, 5000, 5000 }
};
/* backup values */
static const PangoColor grad1ent[] =
{
{ 0xff * 257, 0xba * 257, 0x00 * 257 },
{ 37522, 51914, 57568 }
};
static const PangoColor foregr0und = { 37522, 51914, 57568 };
static const PangoColor backgr0und = { 0, 0, 0 };
static void about_dialog_map (GtkWidget *widget,
GimpAboutDialog *dialog);
static void about_dialog_unmap (GtkWidget *widget,
GimpAboutDialog *dialog);
static void about_dialog_load_url (GtkAboutDialog *dialog,
const gchar *url,
gpointer data);
static void about_dialog_add_logo (GtkWidget *vbox,
GimpAboutDialog *dialog);
static gboolean about_dialog_logo_expose (GtkWidget *widget,
GdkEventExpose *event,
GimpAboutDialog *dialog);
static gboolean about_dialog_load_logo (GtkWidget *widget,
GimpAboutDialog *dialog);
static void about_dialog_reshuffle (GimpAboutDialog *dialog);
static gboolean about_dialog_timer (gpointer data);
generate app/file/Makefile 2001-10-25 Michael Natterer <mitch@gimp.org> * configure.in: generate app/file/Makefile * app/Makefile.am * app/file-open.[ch] * app/file-save.[ch] * app/file-utils.[ch]: removed... * app/file/Makefile.am * app/file/file-open.[ch] * app/file/file-save.[ch] * app/file/file-utils.[ch]: ...and added here. * app/gui/file-commands.c * app/gui/file-open-dialog.c * app/gui/file-save-dialog.c * tools/pdbgen/pdb/fileops.pdb: changed includes accordingly. * app/app_procs.[ch]: removed app_exit_finish() and app_exit_finish_done() from the public API, call gtk_main() here, pass "no_data" to gimp_new() and "restore_session" to gui_restore(). * app/main.c: removed global variable "double_speed", don't call gtk_main() in main.c. Added some missing log domains. * app/appenv.h: removed "double_speed". * app/core/gimp.[ch]: added "gboolean no_data" property which must be passed to gimp_new(). * app/display/gimpdisplay-foreach.[ch]: added gdisplays_set_busy() and gdisplays_unset_busy(). * app/gui/about-dialog.c: don't include "appenv.h", declare "double_speed" extern. * app/gui/brush-select.[ch] * app/gui/gradient-select.[ch] * app/gui/palette-select.[ch] * app/gui/pattern-select.[ch]: made the list of dialogs and the global selection dialogs private. Added functions which get a dialog by PDB callback_name. Pass a "Gimp" and the callback_name to the constructors. Don't include "app_procs.h" for "the_gimp" and "appenv.h" for "no_data" any more. Use the passed "Gimp" instead and look at gimp->no_data. * app/gui/toolbox.[ch]: pass a "Gimp" to the constructor. * app/gui/gui.[ch]: use the new gdisplays_[un]set_busy() functions, use the passed "Gimp" all over the place, don't include "appenv.h" and "app_procs.h". gui_really_quit_dialog() takes a "quit_func" callback now and calls it instead of calling app_exit_finish() (which is now private) directly. * app/gui/convert-dialog.c * app/gui/dialogs-constructors.c * app/gui/palette-import-dialog.c * tools/pdbgen/pdb/brush_select.pdb * tools/pdbgen/pdb/gradient_select.pdb * tools/pdbgen/pdb/pattern_select.pdb: changed accordingly. * app/pdb/brush_select_cmds.c * app/pdb/fileops_cmds.c * app/pdb/gradient_select_cmds.c * app/pdb/pattern_select_cmds.c: regenerated. 2001-10-25 Michael Natterer <mitch@gimp.org> * POTFILES.in: app/file-*.c -> app/file/file-*.c
2001-10-25 21:30:01 +08:00
GtkWidget *
about_dialog_create (GimpContext *context)
1997-11-25 06:05:25 +08:00
{
static GimpAboutDialog *dialog = NULL;
g_return_val_if_fail (GIMP_IS_CONTEXT (context), NULL);
if (! dialog)
{
GtkWidget *widget;
GtkWidget *container;
GList *children;
GdkModifierType mask;
if (procedural_db_lookup (context->gimp, PDB_URL_LOAD))
gtk_about_dialog_set_url_hook (about_dialog_load_url,
g_object_ref (context),
(GDestroyNotify) g_object_unref);
dialog = g_new0 (GimpAboutDialog, 1);
dialog->n_authors = G_N_ELEMENTS (authors) - 1;
widget = g_object_new (GTK_TYPE_ABOUT_DIALOG,
"role", "about-dialog",
"window-position", GTK_WIN_POS_CENTER,
"version", GIMP_VERSION,
"copyright", COPYRIGHT,
"comments", COMMENTS,
"license", LICENSE,
"website", WEBSITE,
"website-label", WEBSITE_LABEL,
"authors", authors,
/* Translators: insert your names here,
* separated by newline
*/
"translator-credits", _("translator-credits"),
NULL);
dialog->dialog = widget;
g_object_add_weak_pointer (G_OBJECT (widget), (gpointer) &dialog);
g_signal_connect (widget, "response",
G_CALLBACK (gtk_widget_destroy),
NULL);
g_signal_connect (widget, "map",
G_CALLBACK (about_dialog_map),
dialog);
g_signal_connect (widget, "unmap",
G_CALLBACK (about_dialog_unmap),
dialog);
if (! about_dialog_load_logo (widget, dialog))
{
gtk_widget_destroy (widget);
return NULL;
}
1997-11-25 06:05:25 +08:00
/* kids, don't try this at home! */
container = GTK_DIALOG (widget)->vbox;
children = gtk_container_get_children (GTK_CONTAINER (container));
if (GTK_IS_VBOX (children->data))
about_dialog_add_logo (children->data, dialog);
else
g_warning ("%s: ooops, no vbox in this container?", G_STRLOC);
g_list_free (children);
/* weird magic to determine the way the logo should be shown */
gdk_window_get_pointer (NULL, NULL, NULL, &mask);
mask &= ~GDK_BUTTON3_MASK;
dialog->pp = (mask &= (GDK_SHIFT_MASK | GDK_CONTROL_MASK) &
(GDK_CONTROL_MASK | GDK_MOD1_MASK) &
(GDK_MOD1_MASK | ~GDK_SHIFT_MASK));
dialog->text_area.height = dialog->pp ? 50 : 32;
dialog->text_area.y = (dialog->logo_height - dialog->text_area.height);
}
gtk_window_present (GTK_WINDOW (dialog->dialog));
return dialog->dialog;
}
static void
about_dialog_map (GtkWidget *widget,
GimpAboutDialog *dialog)
{
if (dialog->layout && dialog->timer == 0)
{
dialog->state = 0;
dialog->index = 0;
dialog->animstep = 0;
dialog->visible = FALSE;
about_dialog_reshuffle (dialog);
dialog->timer = g_timeout_add (800, about_dialog_timer, dialog);
1997-11-25 06:05:25 +08:00
}
}
1997-11-25 06:05:25 +08:00
static void
about_dialog_unmap (GtkWidget *widget,
GimpAboutDialog *dialog)
{
if (dialog->timer)
1997-11-25 06:05:25 +08:00
{
g_source_remove (dialog->timer);
dialog->timer = 0;
1997-11-25 06:05:25 +08:00
}
}
static void
about_dialog_load_url (GtkAboutDialog *dialog,
const gchar *url,
gpointer data)
1997-11-25 06:05:25 +08:00
{
GimpContext *context = GIMP_CONTEXT (data);
Argument *return_vals;
gint nreturn_vals;
return_vals = procedural_db_run_proc (context->gimp, context, NULL,
PDB_URL_LOAD,
&nreturn_vals,
GIMP_PDB_STRING, url,
GIMP_PDB_END);
procedural_db_destroy_args (return_vals, nreturn_vals);
1997-11-25 06:05:25 +08:00
}
1997-11-25 06:05:25 +08:00
static void
about_dialog_add_logo (GtkWidget *vbox,
GimpAboutDialog *dialog)
1997-11-25 06:05:25 +08:00
{
GtkWidget *align;
GList *children;
children = gtk_container_get_children (GTK_CONTAINER (vbox));
for (children = gtk_container_get_children (GTK_CONTAINER (vbox));
children;
children = g_list_next (children))
{
if (GTK_IS_IMAGE (children->data))
{
gtk_widget_hide (children->data);
break;
}
}
1997-11-25 06:05:25 +08:00
g_list_free (children);
align = gtk_alignment_new (0.5, 0.5, 0.0, 0.0);
gtk_box_pack_start (GTK_BOX (vbox), align, FALSE, FALSE, 0);
gtk_widget_show (align);
dialog->logo_area = gtk_drawing_area_new ();
gtk_widget_set_size_request (dialog->logo_area,
dialog->logo_width, dialog->logo_height);
gtk_widget_set_events (dialog->logo_area, GDK_EXPOSURE_MASK);
gtk_container_add (GTK_CONTAINER (align), dialog->logo_area);
gtk_widget_show (dialog->logo_area);
g_signal_connect (dialog->logo_area, "expose-event",
G_CALLBACK (about_dialog_logo_expose),
dialog);
/* place the scrolltext at the bottom of the image */
dialog->text_area.width = dialog->logo_width;
dialog->text_area.height = 32; /* gets changed in map() as well */
dialog->text_area.x = 0;
dialog->text_area.y = (dialog->logo_height - dialog->text_area.height);
dialog->layout = gtk_widget_create_pango_layout (dialog->logo_area, NULL);
g_object_weak_ref (G_OBJECT (dialog->logo_area),
(GWeakNotify) g_object_unref, dialog->layout);
dialog->font_desc = pango_font_description_from_string ("Sans, 11");
pango_layout_set_font_description (dialog->layout, dialog->font_desc);
pango_layout_set_justify (dialog->layout, PANGO_ALIGN_CENTER);
}
static void
about_dialog_reshuffle (GimpAboutDialog *dialog)
1997-11-25 06:05:25 +08:00
{
GRand *gr = g_rand_new ();
gint i;
for (i = 0; i < dialog->n_authors; i++)
dialog->shuffle[i] = i;
for (i = 0; i < dialog->n_authors; i++)
{
gint j = g_rand_int_range (gr, 0, dialog->n_authors);
if (i != j)
{
gint t;
t = dialog->shuffle[j];
dialog->shuffle[j] = dialog->shuffle[i];
dialog->shuffle[i] = t;
}
}
g_rand_free (gr);
}
static gboolean
about_dialog_logo_expose (GtkWidget *widget,
GdkEventExpose *event,
GimpAboutDialog *dialog)
{
gdk_gc_set_clip_rectangle (widget->style->black_gc, &event->area);
gdk_draw_drawable (widget->window,
widget->style->black_gc,
dialog->logo_pixmap,
event->area.x, event->area.y +
(dialog->pp ? dialog->logo_height : 0),
event->area.x, event->area.y,
event->area.width, event->area.height);
gdk_gc_set_clip_rectangle (widget->style->black_gc, NULL);
if (dialog->visible)
1997-11-25 06:05:25 +08:00
{
GdkGC *text_gc;
gint layout_x, layout_y;
gint width, height;
text_gc = dialog->logo_area->style->text_gc[GTK_STATE_NORMAL];
pango_layout_get_pixel_size (dialog->layout, &width, &height);
layout_x = dialog->text_area.x + (dialog->text_area.width - width) / 2;
layout_y = dialog->text_area.y + (dialog->text_area.height - height) / 2;
if (dialog->textrange[1] > 0)
{
GdkRegion *covered_region = NULL;
GdkRegion *rect_region;
covered_region =
gdk_pango_layout_get_clip_region (dialog->layout,
layout_x, layout_y,
dialog->textrange, 1);
rect_region = gdk_region_rectangle (&event->area);
gdk_region_intersect (covered_region, rect_region);
gdk_region_destroy (rect_region);
gdk_gc_set_clip_region (text_gc, covered_region);
gdk_region_destroy (covered_region);
}
gdk_draw_layout (widget->window,
widget->style->text_gc[GTK_STATE_NORMAL],
layout_x, layout_y,
dialog->layout);
gdk_gc_set_clip_region (text_gc, NULL);
}
return FALSE;
}
static gchar *
insert_spacers (const gchar *string)
{
GString *str = g_string_new (NULL);
gchar *normalized;
gchar *ptr;
gunichar unichr;
normalized = g_utf8_normalize (string, -1, G_NORMALIZE_DEFAULT_COMPOSE);
ptr = normalized;
while ((unichr = g_utf8_get_char (ptr)))
{
g_string_append_unichar (str, unichr);
g_string_append_unichar (str, 0x200b); /* ZERO WIDTH SPACE */
ptr = g_utf8_next_char (ptr);
}
added "wm_name", "wm_class", "display_name" and "monitor_number" to the 2003-11-07 Michael Natterer <mitch@gimp.org> * libgimpbase/gimpprotocol.[ch]: added "wm_name", "wm_class", "display_name" and "monitor_number" to the GPConfig message. Increased protocol version number. * libgimp/gimp.[ch] (gimp_config): read them from the GPConfig message and remember them. Added public accessors for the new config values. * libgimp/gimpui.c (gimp_ui_init): pass wm_name and wm_class to gtk_init() and export the display/screen to use to the environment. * app/core/gimp.[ch]: added vtable entries to get the values from the GUI. * app/gui/gui-vtable.c: implement the vtable entries. * app/plug-in/plug-in-run.c: fill in the GPConfig values using the new Gimp vtable functions. * app/display/gimpdisplayshell-layer-select.c * app/display/gimpdisplayshell.c * app/gui/about-dialog.c * app/gui/channels-commands.c * app/gui/color-notebook.c * app/gui/convert-dialog.c * app/gui/file-dialog-utils.[ch] * app/gui/file-new-dialog.c * app/gui/file-open-dialog.c * app/gui/file-save-dialog.c * app/gui/gradient-editor-commands.c * app/gui/gradients-commands.c * app/gui/grid-dialog.c * app/gui/image-commands.c * app/gui/info-dialog.[ch] * app/gui/info-window.c * app/gui/layers-commands.c * app/gui/module-browser.c * app/gui/offset-dialog.c * app/gui/palette-import-dialog.c * app/gui/qmask-commands.c * app/gui/resize-dialog.c * app/gui/splash.c * app/gui/stroke-dialog.c * app/gui/templates-commands.c * app/gui/tips-dialog.c * app/gui/vectors-commands.c * app/tools/gimpcurvestool.c * app/tools/gimplevelstool.c * app/widgets/gimpdock.c * app/widgets/gimperrorconsole.c * app/widgets/gimptexteditor.c * app/widgets/gimptoolbox.c * app/widgets/gimpviewabledialog.[ch] * libgimpwidgets/gimpfileselection.c * libgimpwidgets/gimpquerybox.c * libgimpwidgets/gimpunitmenu.c * plug-ins/helpbrowser/dialog.c * plug-ins/ifscompose/ifscompose.c: replaced all calls to gtk_window_set_wmclass() by gtk_window_set_role() and all "const gchar *wmclass_name" parameters by "const gchar *role". Cleaned up the window role strings.
2003-11-08 01:29:02 +08:00
g_free (normalized);
added "wm_name", "wm_class", "display_name" and "monitor_number" to the 2003-11-07 Michael Natterer <mitch@gimp.org> * libgimpbase/gimpprotocol.[ch]: added "wm_name", "wm_class", "display_name" and "monitor_number" to the GPConfig message. Increased protocol version number. * libgimp/gimp.[ch] (gimp_config): read them from the GPConfig message and remember them. Added public accessors for the new config values. * libgimp/gimpui.c (gimp_ui_init): pass wm_name and wm_class to gtk_init() and export the display/screen to use to the environment. * app/core/gimp.[ch]: added vtable entries to get the values from the GUI. * app/gui/gui-vtable.c: implement the vtable entries. * app/plug-in/plug-in-run.c: fill in the GPConfig values using the new Gimp vtable functions. * app/display/gimpdisplayshell-layer-select.c * app/display/gimpdisplayshell.c * app/gui/about-dialog.c * app/gui/channels-commands.c * app/gui/color-notebook.c * app/gui/convert-dialog.c * app/gui/file-dialog-utils.[ch] * app/gui/file-new-dialog.c * app/gui/file-open-dialog.c * app/gui/file-save-dialog.c * app/gui/gradient-editor-commands.c * app/gui/gradients-commands.c * app/gui/grid-dialog.c * app/gui/image-commands.c * app/gui/info-dialog.[ch] * app/gui/info-window.c * app/gui/layers-commands.c * app/gui/module-browser.c * app/gui/offset-dialog.c * app/gui/palette-import-dialog.c * app/gui/qmask-commands.c * app/gui/resize-dialog.c * app/gui/splash.c * app/gui/stroke-dialog.c * app/gui/templates-commands.c * app/gui/tips-dialog.c * app/gui/vectors-commands.c * app/tools/gimpcurvestool.c * app/tools/gimplevelstool.c * app/widgets/gimpdock.c * app/widgets/gimperrorconsole.c * app/widgets/gimptexteditor.c * app/widgets/gimptoolbox.c * app/widgets/gimpviewabledialog.[ch] * libgimpwidgets/gimpfileselection.c * libgimpwidgets/gimpquerybox.c * libgimpwidgets/gimpunitmenu.c * plug-ins/helpbrowser/dialog.c * plug-ins/ifscompose/ifscompose.c: replaced all calls to gtk_window_set_wmclass() by gtk_window_set_role() and all "const gchar *wmclass_name" parameters by "const gchar *role". Cleaned up the window role strings.
2003-11-08 01:29:02 +08:00
return g_string_free (str, FALSE);
}
static void
mix_gradient (const PangoColor *gradient,
guint ncolors,
PangoColor *target,
gdouble pos)
{
gint index;
if (pos == 1.0)
{
target->red = gradient[ncolors - 1].red;
target->green = gradient[ncolors - 1].green;
target->blue = gradient[ncolors - 1].blue;
return;
}
index = (gint) floor (pos * (ncolors - 1));
pos = pos * (ncolors - 1) - index;
target->red = (gradient[index].red *
(1.0 - pos) + gradient[index + 1].red * pos);
target->green = (gradient[index].green *
(1.0 - pos) + gradient[index + 1].green * pos);
target->blue = (gradient[index].blue *
(1.0 - pos) + gradient[index + 1].blue * pos);
}
static void inline
mix_colors (const PangoColor *start,
const PangoColor *end,
PangoColor *target,
gdouble pos)
{
target->red = start->red * (1.0 - pos) + end->red * pos;
target->green = start->green * (1.0 - pos) + end->green * pos;
target->blue = start->blue * (1.0 - pos) + end->blue * pos;
}
static void
decorate_text (GimpAboutDialog *dialog,
gint anim_type,
gdouble time)
{
const gchar *text;
const gchar *ptr;
gint letter_count = 0;
gint text_length = 0;
gint text_bytelen = 0;
gint cluster_start, cluster_end;
gunichar unichr;
PangoAttrList *attrlist = NULL;
PangoAttribute *attr;
PangoRectangle irect = {0, 0, 0, 0};
PangoRectangle lrect = {0, 0, 0, 0};
PangoColor mix;
mix_colors ((dialog->pp ? &backgr0und : &background),
(dialog->pp ? &foregr0und : &foreground), &mix, time);
text = pango_layout_get_text (dialog->layout);
g_return_if_fail (text != NULL);
text_length = g_utf8_strlen (text, -1);
text_bytelen = strlen (text);
attrlist = pango_attr_list_new ();
dialog->textrange[0] = 0;
dialog->textrange[1] = text_bytelen;
switch (anim_type)
{
case 0: /* Fade in */
attr = pango_attr_foreground_new (mix.red, mix.green, mix.blue);
attr->start_index = 0;
attr->end_index = text_bytelen;
pango_attr_list_insert (attrlist, attr);
break;
case 1: /* Fade in, spread */
attr = pango_attr_foreground_new (mix.red, mix.green, mix.blue);
attr->start_index = 0;
attr->end_index = text_bytelen;
pango_attr_list_change (attrlist, attr);
ptr = text;
cluster_start = 0;
while ((unichr = g_utf8_get_char (ptr)))
{
ptr = g_utf8_next_char (ptr);
cluster_end = (ptr - text);
if (unichr == 0x200b)
{
lrect.width = (1.0 - time) * 15.0 * PANGO_SCALE + 0.5;
attr = pango_attr_shape_new (&irect, &lrect);
attr->start_index = cluster_start;
attr->end_index = cluster_end;
pango_attr_list_change (attrlist, attr);
}
cluster_start = cluster_end;
}
break;
case 2: /* Fade in, sinewave */
attr = pango_attr_foreground_new (mix.red, mix.green, mix.blue);
attr->start_index = 0;
attr->end_index = text_bytelen;
pango_attr_list_change (attrlist, attr);
ptr = text;
cluster_start = 0;
while ((unichr = g_utf8_get_char (ptr)))
{
if (unichr == 0x200b)
{
cluster_end = ptr - text;
attr = pango_attr_rise_new ((1.0 -time) * 18000 *
sin (4.0 * time +
(float) letter_count * 0.7));
attr->start_index = cluster_start;
attr->end_index = cluster_end;
pango_attr_list_change (attrlist, attr);
letter_count++;
cluster_start = cluster_end;
}
ptr = g_utf8_next_char (ptr);
}
break;
case 3: /* letterwise Fade in */
ptr = text;
letter_count = 0;
cluster_start = 0;
while ((unichr = g_utf8_get_char (ptr)))
{
gint border = (text_length + 15) * time - 15;
gdouble pos;
if (letter_count < border)
pos = 0;
else if (letter_count > border + 15)
pos = 1;
else
pos = ((gdouble) (letter_count - border)) / 15;
mix_colors ((dialog->pp ? &foregr0und : &foreground),
(dialog->pp ? &backgr0und : &background),
&mix, pos);
ptr = g_utf8_next_char (ptr);
cluster_end = ptr - text;
attr = pango_attr_foreground_new (mix.red, mix.green, mix.blue);
attr->start_index = cluster_start;
attr->end_index = cluster_end;
pango_attr_list_change (attrlist, attr);
if (pos < 1.0)
dialog->textrange[1] = cluster_end;
letter_count++;
cluster_start = cluster_end;
}
break;
case 4: /* letterwise Fade in, triangular */
ptr = text;
letter_count = 0;
cluster_start = 0;
while ((unichr = g_utf8_get_char (ptr)))
{
gint border = (text_length + 15) * time - 15;
gdouble pos;
if (letter_count < border)
pos = 1.0;
else if (letter_count > border + 15)
pos = 0.0;
else
pos = 1.0 - ((gdouble) (letter_count - border)) / 15;
mix_gradient (dialog->pp ? grad1ent : gradient,
dialog->pp ?
G_N_ELEMENTS (grad1ent) : G_N_ELEMENTS (gradient),
&mix, pos);
ptr = g_utf8_next_char (ptr);
cluster_end = ptr - text;
attr = pango_attr_foreground_new (mix.red, mix.green, mix.blue);
attr->start_index = cluster_start;
attr->end_index = cluster_end;
pango_attr_list_change (attrlist, attr);
if (pos > 0.0)
dialog->textrange[1] = cluster_end;
letter_count++;
cluster_start = cluster_end;
}
break;
default:
g_printerr ("Unknown animation type %d\n", anim_type);
}
pango_layout_set_attributes (dialog->layout, attrlist);
pango_attr_list_unref (attrlist);
}
static gboolean
1997-11-25 06:05:25 +08:00
about_dialog_timer (gpointer data)
{
GimpAboutDialog *dialog = data;
gint timeout = 0;
1997-11-25 06:05:25 +08:00
if (dialog->state == 0)
1997-11-25 06:05:25 +08:00
{
dialog->timer = g_timeout_add (30, about_dialog_timer, dialog);
dialog->index = 0;
dialog->state = 1;
return FALSE;
}
if (dialog->animstep == 0)
{
gchar *text = NULL;
gdouble size = 11.0;
gint width;
gint height;
dialog->visible = TRUE;
if (dialog->state == 1)
{
if (dialog->index >= G_N_ELEMENTS (founders))
{
dialog->index = 0;
dialog->state = 2;
}
else
{
if (dialog->index == 0)
{
gchar *tmp = g_strdup_printf (gettext (founders[0]),
GIMP_VERSION);
text = insert_spacers (tmp);
g_free (tmp);
}
else
{
text = insert_spacers (gettext (founders[dialog->index]));
}
dialog->index++;
}
}
if (dialog->state == 2)
{
text = insert_spacers (_("Contributions by"));
dialog->index = 0;
dialog->state++;
}
if (dialog->state == 3)
{
dialog->index += 1;
if (dialog->index == dialog->n_authors)
dialog->index = 0;
text = insert_spacers (authors[dialog->shuffle[dialog->index]]);
}
g_return_val_if_fail (text != NULL, TRUE);
pango_layout_set_text (dialog->layout, text, -1);
pango_layout_set_attributes (dialog->layout, NULL);
1997-11-25 06:05:25 +08:00
pango_font_description_set_size (dialog->font_desc, size * PANGO_SCALE);
pango_layout_set_font_description (dialog->layout, dialog->font_desc);
1997-11-25 06:05:25 +08:00
pango_layout_get_pixel_size (dialog->layout, &width, &height);
1997-11-25 06:05:25 +08:00
while (width >= dialog->text_area.width && size >= 6.0)
{
size -= 0.5;
pango_font_description_set_size (dialog->font_desc,
size * PANGO_SCALE);
pango_layout_set_font_description (dialog->layout, dialog->font_desc);
pango_layout_get_pixel_size (dialog->layout, &width, &height);
}
}
1997-11-25 06:05:25 +08:00
if (dialog->animstep < 16)
{
decorate_text (dialog, 4, ((gfloat) dialog->animstep) / 15.0);
}
else if (dialog->animstep == 16)
{
timeout = 800;
1997-11-25 06:05:25 +08:00
}
else if (dialog->animstep == 17)
{
timeout = 30;
}
else if (dialog->animstep < 33)
{
decorate_text (dialog, 1,
1.0 - ((gfloat) (dialog->animstep - 17)) / 15.0);
}
else if (dialog->animstep == 33)
{
dialog->visible = FALSE;
timeout = 300;
}
else
{
dialog->visible = FALSE;
dialog->animstep = -1;
timeout = 30;
}
dialog->animstep++;
1997-11-25 06:05:25 +08:00
gtk_widget_queue_draw_area (dialog->logo_area,
dialog->text_area.x,
dialog->text_area.y,
dialog->text_area.width,
dialog->text_area.height);
if (timeout > 0)
{
dialog->timer = g_timeout_add (timeout, about_dialog_timer, dialog);
return FALSE;
}
/* else keep the current timeout */
return TRUE;
1997-11-25 06:05:25 +08:00
}
/* some handy shortcuts */
#define random() gdk_pixbuf_loader_new_with_type ("\160\x6e\147", NULL)
#define pink(a) gdk_pixbuf_loader_close ((a), NULL)
#define line gdk_pixbuf_loader_write
#define white gdk_pixbuf_loader_get_pixbuf
#define level(a) gdk_pixbuf_get_width ((a))
#define variance(a) gdk_pixbuf_get_height ((a))
#define GPL GdkPixbufLoader
static gboolean
about_dialog_load_logo (GtkWidget *widget,
GimpAboutDialog *dialog)
{
GdkPixbuf *pixbuf;
GdkGC *gc;
GPL *noise;
gchar *filename;
g_return_val_if_fail (dialog->logo_pixmap == NULL, FALSE);
filename = g_build_filename (gimp_data_directory (), "images",
"gimp-logo.png",
NULL);
pixbuf = gdk_pixbuf_new_from_file (filename, NULL);
g_free (filename);
if (! pixbuf)
return FALSE;
dialog->logo_width = gdk_pixbuf_get_width (pixbuf);
dialog->logo_height = gdk_pixbuf_get_height (pixbuf);
gtk_widget_realize (widget);
dialog->logo_pixmap = gdk_pixmap_new (widget->window,
dialog->logo_width,
dialog->logo_height * 2,
-1);
gc = gdk_gc_new (dialog->logo_pixmap);
/* draw a defined content to the pixmap */
gdk_draw_rectangle (GDK_DRAWABLE (dialog->logo_pixmap),
gc, TRUE,
0, 0,
dialog->logo_width, dialog->logo_height * 2);
gdk_draw_pixbuf (GDK_DRAWABLE (dialog->logo_pixmap),
gc, pixbuf,
0, 0, 0, 0,
dialog->logo_width, dialog->logo_height,
GDK_RGB_DITHER_NORMAL, 0, 0);
g_object_unref (pixbuf);
if ((noise = random ()) && line (noise, (const guchar *)
"\211\120\116\107\r\n\032\n\0\0\0\r\111\110D\122\0\0\001+\0\0\001"
"\r\004\003\0\0\0\245\177^\254\0\0\0000\120\114TE\0\0\0\023\026\026"
" \'(2=ANXYSr\177surg\216\234\226\230\225z\247\272\261\263\257\222<EFBFBD>"
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;\014<EFBFBD>\016\000\000\017\210I\104A\124x<EFBFBD><EFBFBD>\235[l\033<EFBFBD>\025"
"@gw)<29>a<EFBFBD>b<EFBFBD>\246\255<EFBFBD><EFBFBD>\242\037)j+\251hII\2122)i<>v<EFBFBD>\270\211\234<EFBFBD><EFBFBD>\010"
"<EFBFBD><EFBFBD>&F`\004\251\251<EFBFBD>\r\202B?jR\030A\220\226I\213<EFBFBD>0<EFBFBD>\243<EFBFBD>\201a\030\t"
"X;\026\004\201?<3F>\003E\020\250\241<EFBFBD>\257\242?\222Q#\010\002W\264e\201"
"\020\004\205<EFBFBD>y-\271\217;\273\\\212\273b\212\275\200%q<>\261gg<EFBFBD><EFBFBD>\271"
"sg\226F(\220@\002\t$\220@\276B\"\037\2760>}<7D>D\254\265\250\036-p9"
"<EFBFBD>BPR\272P\225<EFBFBD>h<EFBFBD>`<60>\2500W\253P%\n\006<EFBFBD>SkP}\243`\222\221\226\030\203"
"<EFBFBD>f\254<EFBFBD>X<EFBFBD>u!\221k\033O\245\024\000<EFBFBD><EFBFBD><EFBFBD><EFBFBD>\205\260\256n\270<EFBFBD>\032\207\260"
"\2467\016h<EFBFBD>\000\221Gk,<2C>_\256!\236\035X\237<EFBFBD>7h\224<EFBFBD>3\267<EFBFBD><EFBFBD>\230~\016"
"Z\27744\213<EFBFBD>g\256<EFBFBD>iv<EFBFBD>\201<EFBFBD>q<EFBFBD>\261\t\266<EFBFBD>--\245\275y\\<EFBFBD>u\017\277I<EFBFBD>"
"<EFBFBD>\270.y<>5<EFBFBD>\270<EFBFBD><EFBFBD><EFBFBD>\232<EFBFBD>\\n\255_\233<EFBFBD>s\035k\032<EFBFBD>\233<EFBFBD><EFBFBD>C<EFBFBD><EFBFBD><EFBFBD>\276a\275"
"8j2\236\006##5\r<EFBFBD>\245Q\226<EFBFBD>\n\177\257<EFBFBD>)\\\227\254O\265\210\\\270"
"p<EFBFBD><EFBFBD>\223\'O\014\r<EFBFBD><EFBFBD><EFBFBD>\273AX<EFBFBD>\013>I#\256<EFBFBD>{n<>\270\023.<2E><>c\r`\271w\215"
"\245\267\032\032<EFBFBD>\256\212\204<EFBFBD><EFBFBD>\r<EFBFBD>\256z\217<EFBFBD><EFBFBD>~<7E>\216<EFBFBD>\200\225pm<EFBFBD><EFBFBD>"
"\013>`\215\273\236\031<EFBFBD>>`<60>5E<35>\225\235<EFBFBD>\036\253<EFBFBD>\265M9<EFBFBD>\007V\257<EFBFBD>"
"H\203R<EFBFBD>\003+m]r<>\265\245\001\231\036M\2461<EFBFBD>\007\226\004\030<EFBFBD><EFBFBD><EFBFBD>\205"
"<EFBFBD>/\235\034<EFBFBD><EFBFBD>)\\<EFBFBD>z\216<EFBFBD>\006x\216<EFBFBD>\216;9\\\236cm\242\005\246\214&#"
"<EFBFBD>4\223{\216u<EFBFBD>jL\225i;\'<EFBFBD>\037,<2C>\230vN:<3A>J\274<EFBFBD>R\200y:q<><71>\033<EFBFBD>\032\013"
"\232\247G\247<EFBFBD>\026k\276`\261y<EFBFBD>\272<EFBFBD>\265<EFBFBD>\271S<EFBFBD>\n\033\201<EFBFBD><EFBFBD><EFBFBD>\257&"
"\203P[<5B><><EFBFBD>\033\201<EFBFBD>\027=<3D><><EFBFBD>4<EFBFBD>\260<EFBFBD><EFBFBD>\030\213\033<EFBFBD>\250e6<EFBFBD>s<EFBFBD>\274o<EFBFBD>\'"
"<EFBFBD>v\2531<EFBFBD>\226\253\'<EFBFBD>w\037\256<EFBFBD><EFBFBD><EFBFBD>C\232<EFBFBD><EFBFBD>\017\254\2645\222<EFBFBD>f\037\004"
"j<EFBFBD>\003\013\230\2477\001T\223<EFBFBD>W,h<>\003EhF<EFBFBD><EFBFBD>\202\214)`\021\246\220"
"\277X<EFBFBD>\242\'\0044<EFBFBD>q\237\261\240y<EFBFBD>Ju\035<EFBFBD>\213\005-z\022\016<EFBFBD>E\037"
"\260\240E\217U\265R<EFBFBD>g,`<60>c<EFBFBD>\256\236F~c\001\213\036<EFBFBD>\200<EFBFBD>\240\272<EFBFBD>"
"\203\005-zX<7A>)\211<EFBFBD>1\205\227b<EFBFBD>w,h<>3\252<EFBFBD>F<EFBFBD><EFBFBD><EFBFBD>\223C1Q!/\2616\t<EFBFBD><EFBFBD>\021"
"\247g<EFBFBD>\022\013X<EFBFBD>\2649\206<EFBFBD>\274<EFBFBD>\002\214<EFBFBD>v<EFBFBD>\020\234<EFBFBD>X\2201M;\206<EFBFBD>"
"<<3C>J\000-<2D>\2749<EFBFBD>5\226\014\234Uis\016:{\215<EFBFBD>\013x<EFBFBD>\235<EFBFBD>;\270\036ci"
"+\255<EFBFBD>\240\0138\031<EFBFBD> ,mY\032\205<EFBFBD><EFBFBD><EFBFBD>\003\033\202\245\235w\230\022"
"<EFBFBD><EFBFBD>g7\002k\233y\257<EFBFBD><EFBFBD>\002<EFBFBD>\035<EFBFBD>-<2D>8t<38><74>\024\234\001;<3B>S\254v<EFBFBD>\254\221"
"<EFBFBD><EFBFBD><EFBFBD>\257|<7C>\032\025l\266\207<EFBFBD>\235N\224y\211<EFBFBD>.<2E><>\226\237\261<EFBFBD>\266<EFBFBD>\032"
"+ms\220<EFBFBD>Q<EFBFBD>C\002\036b\265<EFBFBD>\236\0000\234\002\232<EFBFBD>\021+]\260<EFBFBD>~RFmN<6D>"
"x\207\025r<Q<>cq/z\207\225\020,j@Kq<4B>/,\245\236<EFBFBD>\267<EFBFBD>\216\274<EFBFBD>\027"
"V\242\256S\256<EFBFBD>3<EFBFBD>\244<EFBFBD>!\226\\\200<EFBFBD>\'\260\024<EFBFBD>>a<>\002\215<EFBFBD>vP8o<EFBFBD>\204"
"\245\271\177<EFBFBD>F/g<>\240`<60><>S\'B\036\r=<3D>c\001S<EFBFBD>\201<EFBFBD>\r\226<EFBFBD><EFBFBD><EFBFBD>\';mh\232"
"<EFBFBD><EFBFBD>|\034\211Pc<EFBFBD>\202\270S?\2658\205<EFBFBD>|<7C>\002<EFBFBD>?C ^\007\266<EFBFBD>\272\035<EFBFBD>\025"
"\026<EFBFBD><EFBFBD>\231vW\247~f\260o#~`\001<EFBFBD><EFBFBD>6Q\0107\rN<EFBFBD>^`\001<EFBFBD>\037\2603w]<5D>\010"
"1\037\260\000<EFBFBD>O<EFBFBD>2\001|<7C><>\003,<2C><>S\204<EFBFBD>Vex\212<EFBFBD>\000\013p<EFBFBD><EFBFBD><EFBFBD>\035\236"
"\220_<EFBFBD>iH\264<EFBFBD>\005\006<EFBFBD><EFBFBD>a\277\272<EFBFBD>X\200<EFBFBD>\247\215<EFBFBD><EFBFBD>\207<EFBFBD><EFBFBD>\273\026\235"
"\240<EFBFBD>j>\026<EFBFBD><EFBFBD>m\253\235\217\227j`<60>%\266<EFBFBD>+\037\253<EFBFBD>W5\016L\261\037"
"\036<EFBFBD>ky\002v\254\233\215\005\270\177\t<EFBFBD>VE\233<EFBFBD>\232<EFBFBD>\275<EFBFBD>\262\272"
"\177!<21><>\\\273<EFBFBD>l\215[<5B>_\036`\001<EFBFBD>_<EFBFBD>\274\026<EFBFBD>O<EFBFBD>\222 \024<EFBFBD>d,\253G<EFBFBD>n"
"y\247\244W<EFBFBD>\234\212<EFBFBD><EFBFBD>o.\226<EFBFBD><EFBFBD>\223F-<2D>\017<EFBFBD><EFBFBD>\014;\201<EFBFBD><EFBFBD>\2626<EFBFBD>6k\260"
"h<EFBFBD>b\266\256y\214eq<EFBFBD>L<EFBFBD><EFBFBD>29<EFBFBD>N`\223\261\254<EFBFBD>_<EFBFBD>\272\217)[<5B>\226<EFBFBD>a7\213"
"<EFBFBD>\027\002\266<EFBFBD><EFBFBD>\234\235<EFBFBD><EFBFBD>bY<EFBFBD>\2774\020(2\230\255Q<EFBFBD>\033C<EFBFBD><EFBFBD>\262\270"
"\177<EFBFBD><EFBFBD>\013g\006u\022\235tn\"\226<EFBFBD><EFBFBD>\253\276\034i\210\215<EFBFBD><EFBFBD>\226,<2C>X"
"l\"\226<EFBFBD><EFBFBD><EFBFBD>\013F\222\217<EFBFBD>\206@H\024kj\036\226<EFBFBD><EFBFBD>\223<EFBFBD><EFBFBD>\250^\235<EFBFBD>E<EFBFBD>"
"<EFBFBD><EFBFBD>aY<EFBFBD>\277\004|<7C>A\257N\235\242\2737\rK67M\010~<7E><>`\266zE<EFBFBD>\260M<EFBFBD><EFBFBD>f<EFBFBD>"
"\2434\034E6\250SB\024]m\032V<EFBFBD>4<EFBFBD>\264\013<EFBFBD>F5\250SZ\264\235<EFBFBD>,,<2C><>X\260"
"q0\233-\201\023<EFBFBD><\254\220<EFBFBD><EFBFBD><EFBFBD>+<2B>f<EFBFBD>\233-Ix\036\242YX<EFBFBD>F\217F\021n\233"
"<EFBFBD><EFBFBD>\226\"\214<EFBFBD>6\013\253<EFBFBD><EFBFBD>c\211\202hgE\257N\"\'\260yX\233\014<EFBFBD><EFBFBD>&~\021"
"u<EFBFBD>b\266\256y\216U<EFBFBD>WO\214<EFBFBD><EFBFBD>8\211\214\013\234<EFBFBD><EFBFBD>\275<EFBFBD>l<EFBFBD><EFBFBD>\202<EFBFBD>5s\273"
"(<28>\210M c\275X<EFBFBD>\013<EFBFBD><EFBFBD>Q<EFBFBD>\252\273 <\200\'\212<5\202\005<EFBFBD>3b\263\276"
"\255\t<EFBFBD>m\tMz\201Y\262?:m<><6D>S\266<EFBFBD>W<EFBFBD>2<EFBFBD>\2403<EFBFBD>\266\253R<EFBFBD>[<5B>\275\rc]\265"
"o\005<EFBFBD>\261\261<EFBFBD>\272<EFBFBD>\261o|(\036\007\035\033<EFBFBD><EFBFBD>\245<EFBFBD><EFBFBD><,tKN<4B>b<EFBFBD>\211\275"
"<EFBFBD><EFBFBD>\001\212\205\277<EFBFBD>\260?\263<EFBFBD>/80}<7D><>\244<EFBFBD>\206\220mc5<EFBFBD>\022\277<EFBFBD>\266"
"\206\023\004S1<EFBFBD>\034\241\273<EFBFBD>\264<EFBFBD>\220\247<EFBFBD><EFBFBD>`\234\002\236R\032<\251"
"I\277<EFBFBD><EFBFBD><EFBFBD><EFBFBD>o<EFBFBD><EFBFBD>s<EFBFBD><EFBFBD>{<7B>\016\277<EFBFBD>VN\240@\002\t$\220@\002\t$\220@\002\201"
"$<24><>\257[\220\212\2548<EFBFBD>k=\254<EFBFBD><EFBFBD><EFBFBD>NN0\030<EFBFBD>f<EFBFBD>a\215:\204<EFBFBD>\244<EFBFBD><EFBFBD>1W\025"
"~\272\270\270\030oP\241v\r<EFBFBD><EFBFBD>t\221 \033<EFBFBD>\222Tu\214\227<EFBFBD>=\260\253\216"
"\257<EFBFBD>,\251\252<EFBFBD>\020V<EFBFBD>]\225<EFBFBD><EFBFBD>\251j\014<EFBFBD>\031<EFBFBD>\205\"-S\271\034<EFBFBD>\014"
"k\263<EFBFBD>%SO\'2\254\222Vf5<EFBFBD>9<EFBFBD>Z\224\007#G<><47>\242\205\274<EFBFBD>\272<EFBFBD><EFBFBD><EFBFBD>7p<EFBFBD>\031"
"\026\240\232\216\272<EFBFBD>R<EFBFBD><EFBFBD>\014k\215<EFBFBD><EFBFBD>\247\252+<2B>B<EFBFBD>\022\271<EFBFBD>Z<EFBFBD>\026\013"
"\r\253*\031\216\017<EFBFBD>Gub<EFBFBD>\267\246\222\036buhc\277N\254\030\222\237"
"\"X\013<EFBFBD>b<EFBFBD>\032\026<EFBFBD>`\221\217y<EFBFBD><EFBFBD>\256<EFBFBD>Xy<EFBFBD>\216[\254\035*<2A>H/\261r<EFBFBD>\222"
"(<28>\236<EFBFBD>\247<EFBFBD>\020V\0071]<5D>\233<EFBFBD><EFBFBD><EFBFBD>-\273vq<EFBFBD>\277<EFBFBD><EFBFBD>\225s\251\032V<EFBFBD><EFBFBD>s5\266"
"<EFBFBD>k\237\2604$<24><><EFBFBD>\227z<EFBFBD>\242\035V\226<EFBFBD><EFBFBD>fr\233\244<EFBFBD>%+VRo\220<EFBFBD>\277 \026"
"=\003`\205<EFBFBD>PT<EFBFBD><EFBFBD>\254<EFBFBD><EFBFBD><EFBFBD>\233t0\\<EFBFBD>\260\276E<EFBFBD>k\206\227\245<EFBFBD>l\021\242"
"\242JI]vl\255n\202\245i\177\227\252\222<EFBFBD>~<7E>,A\254n\2540\033\243\025"
"\236s\220~<7E>\235<EFBFBD><EFBFBD><EFBFBD><EFBFBD>\034+\216-<2D>\262\275n<EFBFBD><EFBFBD>Xh\236<EFBFBD><EFBFBD><EFBFBD>\272B\270<EFBFBD>-<2D><>\206"
"\260\023<EFBFBD>Xy\265\nBrf<EFBFBD>Z\003iit\244<EFBFBD><EFBFBD>V\207T\007,j<>\031V\222>\251<EFBFBD>F"
"<EFBFBD>0\261MJ\236f3a<EFBFBD><EFBFBD>nn<EFBFBD><EFBFBD>\215E<EFBFBD>\2463\274KZ\277\261<EFBFBD>\2122\254\'\034\260"
":\250edXaZ}\027\035DRI<EFBFBD>g5<EFBFBD>\204\225eu\232\260zt\034:\254U\246)\270"
"<EFBFBD><EFBFBD>L\247N0\254\274\003\026n\224\250\206\205\212\244\221\207<EFBFBD>2m<EFBFBD>\n"
"o<EFBFBD>\0053\026<EFBFBD>\223<EFBFBD>\026,<2C><>\"<EFBFBD>sf\241\212<EFBFBD><EFBFBD> \\\275<EFBFBD><EFBFBD>\276<EFBFBD>\240\273t<EFBFBD>*"
"<EFBFBD><EFBFBD>\003\204@p\254><\026q3<EFBFBD><EFBFBD>?Y\251$<24>\255<EFBFBD>:\270<EFBFBD>\210\2462&\254\034C"
"@q\236\023\017<EFBFBD>a\222%<25>@&\250<EFBFBD>\222<EFBFBD><EFBFBD><EFBFBD>\177<EFBFBD>&\210U\031\212n=<3D><>s,<2C>\213"
"\231\0166I<EFBFBD><EFBFBD>9<EFBFBD>\264b\005\232\252\t\200\t+<2B>\2614\273\205\037G<EFBFBD>\017"
"<EFBFBD>\247\262J\263t\234R\254J<EFBFBD><EFBFBD><EFBFBD>\242#\230c<EFBFBD>\252\227\222\264<EFBFBD>p<EFBFBD>\031\256"
"{k\020<EFBFBD>2\002\261<EFBFBD><EFBFBD>a\215Q\255\240\217\235U\265<EFBFBD> <20>\024<EFBFBD>\037\016n`J"
"\217\265C]-<2D><>\223\264<EFBFBD>#L\236<EFBFBD>\212\225B\240n\251\037<EFBFBD>\260R<i\202\022"
"\257\2209!I\215?<3F>\212<EFBFBD>bq<EFBFBD>W<EFBFBD>\n<EFBFBD>1L<EFBFBD>\270<EFBFBD>\032\2217<EFBFBD>\255-X\037 +V\037"
"M<EFBFBD>,\212\252\276\006\035PDSu\235\217i;l<>5\254[\247\257\\><3E>?iX<69>\271"
"\226Q<EFBFBD>bs52c\275\215\000\254\260N)\214X\222\036+C\261V\234\246j#V"
"7}:#\226\241\265<EFBFBD>\277\177=\213 ,<2C>\222O<EFBFBD>\260\222\024K<EFBFBD>c\215Q\254\262"
";\254,o-\\<EFBFBD>\212&F7\260<EFBFBD>%<25>\2029q<EFBFBD>\036+<2B>\000\226\254<EFBFBD>V\230<EFBFBD>\021<EFBFBD>N\r"
"X1\275\007<EFBFBD><EFBFBD><EFBFBD>p0bIV<EFBFBD>r\207\025Q<EFBFBD>X/\204\014\000b\254\270\036\213\267"
"<EFBFBD>\214\031\213<EFBFBD>\\<EFBFBD>\276<EFBFBD>/<2F>\000VN\275\221\247\275\250p<EFBFBD>a\207\245Y\201"
"|\025\013\205<EFBFBD><EFBFBD>\274d<EFBFBD>*\252|*\253:9\256\2600L\246\207<EFBFBD>\"k4G\254\031"
"<EFBFBD><EFBFBD><EFBFBD>e<EFBFBD>f6<EFBFBD>\231\260r\252<EFBFBD>)]c<><63>\027<EFBFBD>\014(\257<EFBFBD>\245a,<2C>\005<EFBFBD><EFBFBD>\261$<24>B\002"
"XI<EFBFBD>\232<EFBFBD>5V\216\024.<2E>^L<><4C>a,j<>\177<EFBFBD>\2106s<EFBFBD>\275<EFBFBD>[<5B><>\211<EFBFBD><EFBFBD>\"<EFBFBD><EFBFBD><EFBFBD>\250{"
"\254\020\255>I{1\242<EFBFBD>E\030+i\260F\230<EFBFBD>\213s<EFBFBD>\227@\225\0171<EFBFBD>q<EFBFBD><EFBFBD>t\214"
"\270<EFBFBD><EFBFBD>A\025\263\203\002<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B\254\210\016k\242<EFBFBD>\027[\r\004S\256<EFBFBD>"
"j<EFBFBD>-\026\033\204<EFBFBD>\245\037&\201\254<EFBFBD>_+\222<EFBFBD>a,\205<EFBFBD><EFBFBD>s\206URE<EFBFBD>T<EFBFBD>\004"
"\023\256\261<EFBFBD>|@%\251<EFBFBD>\024<EFBFBD>=\037\214<EFBFBD><EFBFBD>\240<EFBFBD>\035z7Y\037<EFBFBD>1c<EFBFBD>\232k<EFBFBD>5"
"V\0373\r\274\027I0<EFBFBD>\001\213\271\231<EFBFBD>\207\030\026o\2552\202\260\250"
"A<EFBFBD><EFBFBD>\266\035V<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Oo<EFBFBD>ro<EFBFBD>\235<EFBFBD>\017<EFBFBD>\\\202\253\252<EFBFBD>\233<EFBFBD>\233<EFBFBD><EFBFBD>\014\275"
">;k\210\202<EFBFBD>+\021\017K<EFBFBD>\2271\265L\226\020\225KQ<EFBFBD>s\022\254<EFBFBD><EFBFBD>o6rB\277"
"\'P_\220Y>\214/~\264\236\010<EFBFBD><EFBFBD>\203N9\006<EFBFBD>\255\'<EFBFBD>\261;\256\263ep\250"
"u<EFBFBD>s\274@\002\t<EFBFBD>+(<28>\200<EFBFBD><EFBFBD>\204h@@<40>y<EFBFBD>e\ry<EFBFBD><EFBFBD>\227<EFBFBD>__\207y<EFBFBD><EFBFBD><EFBFBD>g<EFBFBD>\235):\033"
"t\254<EFBFBD>_<EFBFBD>\2207\253<EFBFBD><EFBFBD>\201\021<EFBFBD>\'<EFBFBD><<3C><>-<2D>3<EFBFBD><33><EFBFBD><EFBFBD><EFBFBD>+W<>\002U<EFBFBD><EFBFBD><EFBFBD>|<7C>\214\025\276"
"Y\037\026)k<>k<EFBFBD>:\003E=\036#<23>ld<6C>E<EFBFBD>0<EFBFBD>s<EFBFBD>1\224[\\\274\001U\235B;<3B>\230"
"\261<EFBFBD>micY3\026(<28>f1V.\205<EFBFBD>\251\216e<EFBFBD>\265\214<EFBFBD>\021V<EFBFBD>qW<EFBFBD>\217<EFBFBD>.<2E>8\035"
"\212\206<EFBFBD><EFBFBD>\020<EFBFBD>\227\235h\013\032$\213\254C<EFBFBD>-<2D>\'Y\252<EFBFBD><EFBFBD>\023<EFBFBD>\001\234"
"D\263nAC<EFBFBD>\262;qn|\001)C<>\n\256\204N\222\007<EFBFBD>\226\250\024#\027\021"
"<EFBFBD>3<EFBFBD>\222\261<EFBFBD>z0<EFBFBD>\227<EFBFBD>M\231<EFBFBD>\236C<EFBFBD>*<2A><>\006+\214<EFBFBD>\275\"\222<EFBFBD><EFBFBD>\205p9\217"
"\035%<25>9<EFBFBD>\030<EFBFBD>q\236RW\263\230.\227!<21><>8qkX<6B><58><EFBFBD>+\265\262<EFBFBD>\032\222*Q\245"
"\244<EFBFBD>\007_!\225<EFBFBD>\244\207\260\203\233Mu<EFBFBD>\245q\237\007qA\232L\004c"
"a\032<EFBFBD>\275<EFBFBD>\207S*\250,<2C>\210<EFBFBD><EFBFBD>^]<5D>r*\\ye<EFBFBD>*\271w<EFBFBD>\213\201<EFBFBD>\230R\211"
"<EFBFBD>#^w<>\014\212,)\225\003,\211`<60>>\247+\233<EFBFBD>t<EFBFBD>E}\037(\213<EFBFBD>l\212TB\034"
"<EFBFBD><EFBFBD>\036\234\034\256\\<EFBFBD><EFBFBD>\n<EFBFBD><EFBFBD>^<5E>\023\247<EFBFBD>:\254<EFBFBD>\267\tVI^\273\014<EFBFBD>{6<>"
"\265<EFBFBD>\030\273W7~<7E>0.Q\242X\023\250g!B<>T<EFBFBD>e<EFBFBD>Z<EFBFBD>\265E<EFBFBD>jh><3E>\261<EFBFBD><EFBFBD>e#K<>\031"
"\224\217\242<EFBFBD>L6<EFBFBD><EFBFBD>v\216*\224\032<EFBFBD>&U\210\006!\226<EFBFBD>\261H\235<EFBFBD><EFBFBD>\233\227"
"\260\273\255|R\254<EFBFBD><EFBFBD>A^<5E>M\020<EFBFBD>\035C<EFBFBD><EFBFBD><EFBFBD>h\013\240<EFBFBD>\235\236\031<EFBFBD>\t[\263"
"2\276\007<EFBFBD>\220<EFBFBD>O\220<EFBFBD><EFBFBD><EFBFBD><EFBFBD>k\267\020Z%w<>\246\"<EFBFBD>^\024<EFBFBD>(\026<EFBFBD>\242b\264"
"\207<<3C>*\003b?\263\237\035--\204+\247<EFBFBD>@By\2719\010<EFBFBD><EFBFBD>\251(<28>tk%Z<>J\241"
"\256;I2j<32><6A>,<2C><>$\276<EFBFBD><EFBFBD>\004<EFBFBD>J\031<EFBFBD>f\227\230\013?Atk%Ju<4A>\267\004\213"
"<EFBFBD>\026MN<EFBFBD>%w\025+\\Z\033\236@g<>\217<EFBFBD>\202&r\027<EFBFBD>D\2048\026\n\025<EFBFBD>\254"
"Xy\032<EFBFBD><EFBFBD>\277\002aie<EFBFBD>e\244\254\036\032\030\210<EFBFBD><EFBFBD>\270\022\222<EFBFBD>\223"
"/\rX,Y<>BR\224\224\275\227\232\243\216e!\026N.\221}\205e#V\017V\224"
"\"\251\254<EFBFBD>\034<EFBFBD>\2569\222\233e5b\205<EFBFBD><EFBFBD>1iM\263[]<5D>6<EFBFBD>\224\206<EFBFBD>G\"<EFBFBD><EFBFBD>"
"\205\014<EFBFBD>J\231\206HH\n\036<EFBFBD>\",<<3C>Cd<43>\025.\033\261\272<EFBFBD><EFBFBD>:<3A><>\2725Cn"
"\'\225b,\253\021\253o.9\203\212q\216<EFBFBD>-r6\243aE<EFBFBD>\205b<EFBFBD>\200<EFBFBD>\275e\272"
"\005\227<EFBFBD><EFBFBD>@,Tz;W\214v=<3D><>\222\021K.}\234\247\255\025<EFBFBD><EFBFBD>1Y}<7D><>2<EFBFBD>j<EFBFBD>*<2A>"
";<3B>\250\257<p\024\227\"\225<EFBFBD>\253\227\006K1\rKQ<EFBFBD>>\222\242<EFBFBD>\032V<EFBFBD>\005"
"\262<EFBFBD>>\222<EFBFBD>v<EFBFBD><EFBFBD>#\245\224\020<EFBFBD>!<21>f6z\277Z\241\025<EFBFBD>\252Xx\215x\221<EFBFBD>\026"
"\"1<EFBFBD>\007<EFBFBD>\262\237f5`\205W<EFBFBD>\220W\212xy\231M<EFBFBD>O7\000\244y<EFBFBD>fU\267<EFBFBD><\250"
"fh\262\206<EFBFBD>]y\205<EFBFBD><EFBFBD>y\214Dv>\264\231\252v<EFBFBD>\245\022dA\212<EFBFBD><EFBFBD>\241<EFBFBD>~w"
"\254\232\025ts\242\265J$C\256\255<EFBFBD>\253<EFBFBD>,<@<40>\244\207\010\266<EFBFBD>7<EFBFBD><EFBFBD><EFBFBD>"
"TWw<EFBFBD>h)\'<EFBFBD><EFBFBD>{\237\244\241<EFBFBD><EFBFBD>T+Q<>|\253\250\257<EFBFBD>R\215\205\224#t\\\207"
"c<EFBFBD><EFBFBD>\"\220@\002\t$\220@\002\t$\220@\002\t$\220@\002\t$\220@\002\t"
"$\220@<40><><EFBFBD>\177t<EFBFBD>\007<EFBFBD>uUy$\0\0\0\0IE\116\104\256B`\202", 4093, NULL)
&& pink (noise) && white (noise))
{
gdk_draw_pixbuf (GDK_DRAWABLE (dialog->logo_pixmap),
gc, white (noise), 0, 0,
(dialog->logo_width - level (white (noise))) / 2,
dialog->logo_height + (dialog->logo_height -
variance (white (noise))) / 2,
level (white (noise)),
variance (white (noise)),
GDK_RGB_DITHER_NORMAL, 0, 0);
}
g_object_unref (noise);
g_object_unref (gc);
return TRUE;
}