diff options
Diffstat (limited to 'shell/e-shell-about-box.c')
-rw-r--r-- | shell/e-shell-about-box.c | 426 |
1 files changed, 0 insertions, 426 deletions
diff --git a/shell/e-shell-about-box.c b/shell/e-shell-about-box.c deleted file mode 100644 index be313941fd..0000000000 --- a/shell/e-shell-about-box.c +++ /dev/null @@ -1,426 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-shell-about-box.c - * - * Copyright (C) 2001, 2002, 2003 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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. - * - * Author: Ettore Perazzoli <ettore@ximian.com> - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include "e-shell-about-box.h" - -#include <gal/util/e-util.h> - -#include <gtk/gtkeventbox.h> -#include <gdk-pixbuf/gdk-pixbuf.h> - - -#define PARENT_TYPE gtk_event_box_get_type () -static GtkEventBoxClass *parent_class = NULL; - -static const char *text[] = { - "", - "Evolution " VERSION, - "Copyright 1999 - 2003 Ximian, Inc.", - "", - N_("Brought to you by"), - "", - "Seth Alves", - "Jacob Berkman", - "Kevin Breit", - "Anders Carlsson", - "Damon Chaplin", - "Zbigniew Chyla", - "Clifford R. Conover", - "Anna Dirks", - "Bob Doan", - "Miguel de Icaza", - "Radek Doulik", - "Arturo Espinoza", - "Larry Ewing", - "Nat Friedman", - "Alex Graveley", - "Bertrand Guiheneuf", - "Heath Harrelson", - "Iain Holmes", - "Mike Kestner", - "Tuomas Kuosmanen", - "Christopher J. Lahey", - "Miles Lane", - "Jason Leach", - "Timothy Lee", - "Matthew Loper", - "Michael MacDonald", - "Kjartan Maraas", - "Gerardo Marin", - "Michael Meeks", - "Federico Mena", - "Michael M. Morrison", - "Rodrigo Moya", - "Eskil Heyn Olsen", - "Gediminas Paulauskas", - "Jesse Pavel", - "Ettore Perazzoli", - "JP Rosevear", - "Jeffrey Stedfast", - "Jakub Steiner", - "Russell Steinthal", - "Peter Teichman", - "Chris Toshok", - "Jon Trowbridge", - "Luis Villa", - "Aaron Weber", - "Peter Williams", - "Dan Winship", - "Michael Zucchi" -}; -#define NUM_TEXT_LINES (sizeof (text) / sizeof (*text)) - -struct _EShellAboutBoxPrivate { - GdkPixmap *pixmap; - GdkPixmap *text_background_pixmap; - GdkGC *clipped_gc; - int text_y_offset; - int timeout_id; - const gchar **permuted_text; -}; - - -#define ANIMATION_DELAY 40 - -#define WIDTH 400 -#define HEIGHT 200 - -#define TEXT_Y_OFFSET 57 -#define TEXT_X_OFFSET 60 -#define TEXT_WIDTH (WIDTH - 2 * TEXT_X_OFFSET) -#define TEXT_HEIGHT 90 - -#define IMAGE_PATH EVOLUTION_IMAGES "/about-box.png" - - - -static void -permute_names (EShellAboutBox *about_box) -{ - EShellAboutBoxPrivate *priv = about_box->priv; - gint i, j; - - srandom (time (NULL)); - - for (i = 6; i < NUM_TEXT_LINES-1; ++i) { - const gchar *tmp; - j = i + random () % (NUM_TEXT_LINES - i); - if (i != j) { - tmp = priv->permuted_text[i]; - priv->permuted_text[i] = priv->permuted_text[j]; - priv->permuted_text[j] = tmp; - } - } -} - -/* The callback. */ - -static int -timeout_callback (void *data) -{ - EShellAboutBox *about_box; - EShellAboutBoxPrivate *priv; - GdkRectangle redraw_rect; - GtkWidget *widget; - PangoContext *context; - PangoFontMetrics *metrics; - PangoLayout *layout; - int line_height; - int first_line; - int y; - int i; - - about_box = E_SHELL_ABOUT_BOX (data); - priv = about_box->priv; - - widget = GTK_WIDGET (about_box); - - context = gtk_widget_get_pango_context (widget); - metrics = pango_context_get_metrics (context, gtk_widget_get_style (GTK_WIDGET (about_box))->font_desc, - pango_context_get_language (context)); - line_height = PANGO_PIXELS (pango_font_metrics_get_ascent (metrics) - + pango_font_metrics_get_descent (metrics)); - pango_font_metrics_unref (metrics); - - if (priv->text_y_offset < TEXT_HEIGHT) { - y = TEXT_Y_OFFSET + (TEXT_HEIGHT - priv->text_y_offset); - first_line = 0; - } else { - y = TEXT_Y_OFFSET - ((priv->text_y_offset - TEXT_HEIGHT) % line_height); - first_line = (priv->text_y_offset - TEXT_HEIGHT) / line_height; - } - - gdk_draw_pixmap (priv->pixmap, priv->clipped_gc, priv->text_background_pixmap, - 0, 0, - TEXT_X_OFFSET, TEXT_Y_OFFSET, TEXT_WIDTH, TEXT_HEIGHT); - - layout = pango_layout_new (context); - - for (i = 0; i < TEXT_HEIGHT / line_height + 3; i ++) { - const char *line; - int width; - int x; - - if (first_line + i >= NUM_TEXT_LINES) - break; - - if (*priv->permuted_text[first_line + i] == '\0') - line = ""; - else - line = _(priv->permuted_text[first_line + i]); - - pango_layout_set_text (layout, line, -1); - pango_layout_get_pixel_size (layout, &width, NULL); - x = TEXT_X_OFFSET + (TEXT_WIDTH - width) / 2; - gdk_draw_layout (priv->pixmap, priv->clipped_gc, x, y, layout); - - y += line_height; - } - - redraw_rect.x = TEXT_X_OFFSET; - redraw_rect.y = TEXT_Y_OFFSET; - redraw_rect.width = TEXT_WIDTH; - redraw_rect.height = TEXT_HEIGHT; - gdk_window_invalidate_rect (widget->window, &redraw_rect, FALSE); - gdk_window_process_updates (widget->window, FALSE); - - priv->text_y_offset ++; - if (priv->text_y_offset > line_height * NUM_TEXT_LINES + TEXT_HEIGHT) { - priv->text_y_offset = 0; - permute_names (about_box); - } - - g_object_unref (layout); - - return TRUE; -} - - -/* GObject methods. */ - -static void -impl_dispose (GObject *object) -{ - EShellAboutBox *about_box; - EShellAboutBoxPrivate *priv; - - about_box = E_SHELL_ABOUT_BOX (object); - priv = about_box->priv; - - if (priv->pixmap != NULL) { - gdk_pixmap_unref (priv->pixmap); - priv->pixmap = NULL; - } - - if (priv->text_background_pixmap != NULL) { - gdk_pixmap_unref (priv->text_background_pixmap); - priv->text_background_pixmap = NULL; - } - - if (priv->clipped_gc != NULL) { - gdk_gc_unref (priv->clipped_gc); - priv->clipped_gc = NULL; - } - - (* G_OBJECT_CLASS (parent_class)->dispose) (object); -} - -static void -impl_finalize (GObject *object) -{ - EShellAboutBox *about_box; - EShellAboutBoxPrivate *priv; - - about_box = E_SHELL_ABOUT_BOX (object); - priv = about_box->priv; - - if (priv->timeout_id != -1) - g_source_remove (priv->timeout_id); - - g_free (priv->permuted_text); - - g_free (priv); - - (* G_OBJECT_CLASS (parent_class)->finalize) (object); -} - - -/* GtkWidget methods. */ - -static void -impl_size_request (GtkWidget *widget, - GtkRequisition *requisition) -{ - requisition->width = WIDTH; - requisition->height = HEIGHT; -} - -static void -impl_realize (GtkWidget *widget) -{ - EShellAboutBox *about_box; - EShellAboutBoxPrivate *priv; - GdkPixbuf *background_pixbuf; - GdkRectangle clip_rectangle; - - (* GTK_WIDGET_CLASS (parent_class)->realize) (widget); - - about_box = E_SHELL_ABOUT_BOX (widget); - priv = about_box->priv; - - background_pixbuf = gdk_pixbuf_new_from_file (IMAGE_PATH, NULL); - g_assert (background_pixbuf != NULL); - g_assert (gdk_pixbuf_get_width (background_pixbuf) == WIDTH); - g_assert (gdk_pixbuf_get_height (background_pixbuf) == HEIGHT); - - g_assert (priv->pixmap == NULL); - priv->pixmap = gdk_pixmap_new (widget->window, WIDTH, HEIGHT, -1); - - gdk_pixbuf_render_to_drawable (background_pixbuf, priv->pixmap, widget->style->black_gc, - 0, 0, 0, 0, WIDTH, HEIGHT, - GDK_RGB_DITHER_MAX, 0, 0); - - g_assert (priv->clipped_gc == NULL); - priv->clipped_gc = gdk_gc_new (widget->window); - gdk_gc_copy (priv->clipped_gc, widget->style->black_gc); - - clip_rectangle.x = TEXT_X_OFFSET; - clip_rectangle.y = TEXT_Y_OFFSET; - clip_rectangle.width = TEXT_WIDTH; - clip_rectangle.height = TEXT_HEIGHT; - gdk_gc_set_clip_rectangle (priv->clipped_gc, & clip_rectangle); - - priv->text_background_pixmap = gdk_pixmap_new (widget->window, clip_rectangle.width, clip_rectangle.height, -1); - gdk_pixbuf_render_to_drawable (background_pixbuf, priv->text_background_pixmap, widget->style->black_gc, - TEXT_X_OFFSET, TEXT_Y_OFFSET, - 0, 0, TEXT_WIDTH, TEXT_HEIGHT, - GDK_RGB_DITHER_MAX, 0, 0); - - g_assert (priv->timeout_id == -1); - priv->timeout_id = g_timeout_add (ANIMATION_DELAY, timeout_callback, about_box); - - g_object_unref (background_pixbuf); -} - -static void -impl_unrealize (GtkWidget *widget) -{ - EShellAboutBox *about_box; - EShellAboutBoxPrivate *priv; - - about_box = E_SHELL_ABOUT_BOX (widget); - priv = about_box->priv; - - (* GTK_WIDGET_CLASS (parent_class)->unrealize) (widget); - - g_assert (priv->clipped_gc != NULL); - gdk_gc_unref (priv->clipped_gc); - priv->clipped_gc = NULL; - - g_assert (priv->pixmap != NULL); - gdk_pixmap_unref (priv->pixmap); - priv->pixmap = NULL; - - if (priv->timeout_id != -1) { - g_source_remove (priv->timeout_id); - priv->timeout_id = -1; - } -} - -static int -impl_expose_event (GtkWidget *widget, - GdkEventExpose *event) -{ - EShellAboutBoxPrivate *priv; - - if (! GTK_WIDGET_DRAWABLE (widget)) - return FALSE; - - priv = E_SHELL_ABOUT_BOX (widget)->priv; - - gdk_draw_pixmap (widget->window, widget->style->black_gc, - priv->pixmap, - event->area.x, event->area.y, - event->area.x, event->area.y, - event->area.width, event->area.height); - - return TRUE; -} - - -static void -class_init (GObjectClass *object_class) -{ - GtkWidgetClass *widget_class; - - parent_class = g_type_class_ref(PARENT_TYPE); - - object_class->dispose = impl_dispose; - object_class->finalize = impl_finalize; - - widget_class = GTK_WIDGET_CLASS (object_class); - widget_class->size_request = impl_size_request; - widget_class->realize = impl_realize; - widget_class->unrealize = impl_unrealize; - widget_class->expose_event = impl_expose_event; -} - -static void -init (EShellAboutBox *shell_about_box) -{ - EShellAboutBoxPrivate *priv; - gint i; - - priv = g_new (EShellAboutBoxPrivate, 1); - priv->pixmap = NULL; - priv->text_background_pixmap = NULL; - priv->clipped_gc = NULL; - priv->timeout_id = -1; - priv->text_y_offset = 0; - - priv->permuted_text = g_new (const gchar *, NUM_TEXT_LINES); - for (i = 0; i < NUM_TEXT_LINES; ++i) { - priv->permuted_text[i] = text[i]; - } - - shell_about_box->priv = priv; - - permute_names (shell_about_box); -} - - -GtkWidget * -e_shell_about_box_new (void) -{ - EShellAboutBox *about_box; - - about_box = g_object_new (e_shell_about_box_get_type (), NULL); - - return GTK_WIDGET (about_box); -} - - -E_MAKE_TYPE (e_shell_about_box, "EShellAboutBox", EShellAboutBox, class_init, init, GTK_TYPE_EVENT_BOX) |