[evolution-patches] GNOME about box
- From: William Jon McCann <mccannwj pha jhu edu>
- To: evolution-patches lists ximian com
- Subject: [evolution-patches] GNOME about box
- Date: Thu, 06 May 2004 13:05:45 -0400
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]