[evolution-patches] GNOME about box



Hi,

The current about box is really cool but it has a few problems.

 - Not themeable
- Does not scale with font size (clips off fonts larger than or equal to 14pts)
 - Not accessible
 - Doesn't include documentor or translator credits
 - Closes on any key press or mouse click
 - Doesn't conform to the HIG
 - Can't quickly view credits list

Here is a patch to implement the standard (and yes, possibly boring) about dialog.

I have taken the liberty of adding my name to the credits list.

Please let me know if this is ok.

Thanks,
Jon
Index: ChangeLog
===================================================================
RCS file: /cvs/gnome/evolution/shell/ChangeLog,v
retrieving revision 1.1428
diff -p -u -r1.1428 ChangeLog
--- ChangeLog	5 May 2004 15:36:37 -0000	1.1428
+++ ChangeLog	6 May 2004 16:49:42 -0000
@@ -1,3 +1,8 @@
+2004-05-06  William Jon McCann  <mccann jhu edu>
+
+	* e-shell-window-commands.c (command_about_box): 
+	* e-shell-about-box.[ch] (e_shell_about_box_new): Use GNOME about box.
+
 2004-05-05  Dan Winship  <danw ximian com>
 
 	* e-sidebar.c (layout_buttons): Change the algorithm so that if
Index: e-shell-window-commands.c
===================================================================
RCS file: /cvs/gnome/evolution/shell/e-shell-window-commands.c,v
retrieving revision 1.14
diff -p -u -r1.14 e-shell-window-commands.c
--- e-shell-window-commands.c	30 Apr 2004 19:05:34 -0000	1.14
+++ e-shell-window-commands.c	6 May 2004 16:49:42 -0000
@@ -128,47 +128,25 @@ command_submit_bug (BonoboUIComponent *u
                 e_notice (NULL, GTK_MESSAGE_ERROR, _("Bug buddy could not be run."));
 }
 
-static int
-about_box_event_callback (GtkWidget *widget,
-			  GdkEvent *event,
-			  GtkWidget **widget_pointer)
-{
-	gtk_widget_destroy (GTK_WIDGET (*widget_pointer));
-	*widget_pointer = NULL;
-
-	return TRUE;
-}
-
 static void
 command_about_box (BonoboUIComponent *uih,
 		   EShellWindow *window,
 		   const char *path)
 {
 	static GtkWidget *about_box_window = NULL;
-	GtkWidget *about_box;
 
 	if (about_box_window != NULL) {
 		gdk_window_raise (about_box_window->window);
 		return;
 	}
 
-	about_box = e_shell_about_box_new ();
-	gtk_widget_show (about_box);
+	about_box_window = e_shell_about_box_new ();
 
-	about_box_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-	gtk_window_set_type_hint (GTK_WINDOW (about_box_window), GDK_WINDOW_TYPE_HINT_DIALOG);
-	
-	gtk_window_set_resizable (GTK_WINDOW (about_box_window), FALSE);
-	g_signal_connect (about_box_window, "key_press_event",
-			  G_CALLBACK (about_box_event_callback), &about_box_window);
-	g_signal_connect (about_box_window, "button_press_event",
-			  G_CALLBACK (about_box_event_callback), &about_box_window);
-	g_signal_connect (about_box_window, "delete_event",
-			  G_CALLBACK (about_box_event_callback), &about_box_window);
+	g_signal_connect (G_OBJECT (about_box_window), "destroy",
+			  G_CALLBACK (gtk_widget_destroyed), &about_box_window);
 
 	gtk_window_set_transient_for (GTK_WINDOW (about_box_window), GTK_WINDOW (window));
-	gtk_window_set_title (GTK_WINDOW (about_box_window), _("About Ximian Evolution"));
-	gtk_container_add (GTK_CONTAINER (about_box_window), about_box);
+
 	gtk_widget_show (about_box_window);
 }
 
Index: e-shell-about-box.c
===================================================================
RCS file: /cvs/gnome/evolution/shell/e-shell-about-box.c,v
retrieving revision 1.25
diff -p -u -r1.25 e-shell-about-box.c
--- e-shell-about-box.c	18 Mar 2004 04:13:20 -0000	1.25
+++ e-shell-about-box.c	6 May 2004 16:49:42 -0000
@@ -26,24 +26,11 @@
 
 #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;
-
 /* must be in utf8, the weird breaking of escaped strings
    is so the hex escape strings dont swallow too many chars */
-static const char *text[] = {
-	"",
-	"Evolution " VERSION,
-	"Copyright \xC2\xA9 1999 - 2004 Novell, Inc.",
-	"",
-	N_("Brought to you by"),
-	"",
+static const char *authors[] = {
 	"Darin Adler",
 	"Arturo Espinosa Aldama",
 	"H\xC3\xA9" "ctor Garc\xC3\xAD" "a \xC3\x81" "lvarez",
@@ -143,6 +130,7 @@ static const char *text[] = {
 	"Matt Martin",
 	"Carlos Perell\xC3\xB3" " Mar\xC3\xAD" "n",
 	"Dietmar Maurer",
+	"William Jon McCann",
 	"Mike McEwan",
 	"Alastair McKinstry",
 	"Michael Meeks",
@@ -199,336 +187,37 @@ static const char *text[] = {
 	"Jukka Zitting",
 	"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);
+static const gchar *documentors[] = { NULL };
+static const gchar *translator_credits = NULL;
 
-	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);
+	static GtkWidget *about_box = NULL;
+	GdkPixbuf *pixbuf = NULL;
+	const gchar copyright[1024];
+
+	g_sprintf (copyright, "Copyright \xC2\xA9 1999 - 2004 Novell, Inc.");
+	gchar *filename = NULL;
+                                                                                
+	filename = g_build_filename (EVOLUTION_DATADIR, "pixmaps",
+				     "evolution-1.5.png", NULL);
+	if (filename != NULL) {
+		pixbuf = gdk_pixbuf_new_from_file (filename, NULL);
+		g_free (filename);
+	}
+                                                                                
+	about_box = gnome_about_new ("Evolution",
+				     VERSION,
+				     copyright,
+				     _("Groupware Suite"),
+				     authors, documentors,
+				     translator_credits,
+				     pixbuf);
+	
+        if (pixbuf != NULL)
+                g_object_unref (pixbuf);
 
 	return GTK_WIDGET (about_box);
 }
-
-
-E_MAKE_TYPE (e_shell_about_box, "EShellAboutBox", EShellAboutBox, class_init, init, GTK_TYPE_EVENT_BOX)
Index: e-shell-about-box.h
===================================================================
RCS file: /cvs/gnome/evolution/shell/e-shell-about-box.h,v
retrieving revision 1.5
diff -p -u -r1.5 e-shell-about-box.h
--- e-shell-about-box.h	4 Nov 2002 18:53:06 -0000	1.5
+++ e-shell-about-box.h	6 May 2004 16:49:42 -0000
@@ -25,38 +25,10 @@
 
 #include <gnome.h>
 
-#ifdef __cplusplus
-extern "C" {
-#pragma }
-#endif /* __cplusplus */
+G_BEGIN_DECLS
 
-#define E_TYPE_SHELL_ABOUT_BOX			(e_shell_about_box_get_type ())
-#define E_SHELL_ABOUT_BOX(obj)			(GTK_CHECK_CAST ((obj), E_TYPE_SHELL_ABOUT_BOX, EShellAboutBox))
-#define E_SHELL_ABOUT_BOX_CLASS(klass)		(GTK_CHECK_CLASS_CAST ((klass), E_TYPE_SHELL_ABOUT_BOX, EShellAboutBoxClass))
-#define E_IS_SHELL_ABOUT_BOX(obj)			(GTK_CHECK_TYPE ((obj), E_TYPE_SHELL_ABOUT_BOX))
-#define E_IS_SHELL_ABOUT_BOX_CLASS(klass)		(GTK_CHECK_CLASS_TYPE ((obj), E_TYPE_SHELL_ABOUT_BOX))
-
-
-typedef struct _EShellAboutBox        EShellAboutBox;
-typedef struct _EShellAboutBoxPrivate EShellAboutBoxPrivate;
-typedef struct _EShellAboutBoxClass   EShellAboutBoxClass;
-
-struct _EShellAboutBox {
-	GtkEventBox parent;
-
-	EShellAboutBoxPrivate *priv;
-};
-
-struct _EShellAboutBoxClass {
-	GtkEventBoxClass parent_class;
-};
-
-
-GtkType    e_shell_about_box_get_type   (void);
 GtkWidget *e_shell_about_box_new        (void);
 
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
+G_END_DECLS
 
 #endif /* _E_SHELL_ABOUT_BOX_H_ */


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]