diff -bpru dillo/dillorc dillo.alt/dillorc
--- dillo/dillorc	Sun Mar  4 16:21:17 2001
+++ dillo.alt/dillorc	Sat Mar 31 01:16:35 2001
@@ -43,5 +43,7 @@ link_color=blue
 # All fontsizes are scaled by this value (default is 1.0)
 # font_factor=1.2
 
+# If you don't want ALT popup for images, comment out next line
+show_alt=YES
 
 # dillorc ends here.
diff -bpru dillo/src/dw_image.c dillo.alt/src/dw_image.c
--- dillo/src/dw_image.c	Sun Mar 18 00:01:29 2001
+++ dillo.alt/src/dw_image.c	Sat Mar 31 04:53:57 2001
@@ -13,23 +13,40 @@
 #include <gdk/gdk.h>
 #include "dw_image.h"
 #include <gtk/gtkwidget.h>
+#include <gtk/gtkwindow.h>
+#include <gtk/gtkmain.h>    /* for gtk_timeout_*() */
 #include "dw_gtk_viewport.h"
+#include "prefs.h"
 #include <stdio.h>
 #include <string.h>
 
 static void Dw_image_init               (DwImage *image);
 static void Dw_image_class_init         (DwImageClass *klass);
 
+static void Dw_image_destroy            (GtkObject *object);
+
 static void Dw_image_size_request       (DwWidget *widget,
                                          DwRequisition *requisition);
 static void Dw_image_draw               (DwWidget *widget,
                                          DwRectangle *area,
                                          GdkEventExpose *event);
+
+gint Dw_image_button_press              (DwWidget *widget,
+					 gint32 x,
+					 gint32 y,
+					 GdkEventButton *event);
+gint Dw_image_motion_notify             (DwWidget *widget,
+					 gint32 x,
+					 gint32 y,
+                                         GdkEventMotion *event);
 gint Dw_image_enter_notify              (DwWidget *widget,
                                          GdkEventMotion *event);
 gint Dw_image_leave_notify              (DwWidget *widget,
                                          GdkEventMotion *event);
 
+static void Dw_image_destroy_alt        (DwImage *image);
+static gint Dw_image_draw_alt           (gpointer data);
+
 
 GtkType a_Dw_image_get_type (void)
 {
@@ -52,11 +69,12 @@ GtkType a_Dw_image_get_type (void)
    return type;
 }
 
-DwWidget* a_Dw_image_new (DwImageType type)
+DwWidget* a_Dw_image_new (DwImageType type, const gchar *alt)
 {
    GtkObject *object;
    
    object = gtk_object_new (DW_TYPE_IMAGE, NULL);
+   DW_IMAGE(object)->alt_text = (alt) ? strdup(alt) : NULL;
    return DW_WIDGET (object);
 }
 
@@ -65,6 +83,8 @@ static void Dw_image_init (DwImage *imag
    image->width = 0;
    image->height = 0;
    image->buffer = NULL;
+   image->alt_img = NULL;
+   image->timeout_id = 0;
 }
 
 
@@ -74,14 +94,25 @@ static void Dw_image_class_init (DwImage
    DwWidgetClass *widget_class;
 
    object_class = (GtkObjectClass*)klass;
+   object_class->destroy = Dw_image_destroy;
 
    widget_class = (DwWidgetClass*)klass;
    widget_class->size_request = Dw_image_size_request;
    widget_class->draw = Dw_image_draw;
+   widget_class->button_press_event = Dw_image_button_press;
+   widget_class->motion_notify_event = Dw_image_motion_notify;
    widget_class->enter_notify_event = Dw_image_enter_notify;
    widget_class->leave_notify_event = Dw_image_leave_notify;
 }
 
+static void Dw_image_destroy (GtkObject *object)
+{
+   DwImage *image = DW_IMAGE (object);
+
+   Dw_image_destroy_alt(image);
+   if (image->alt_text)
+      g_free(image->alt_text);
+}
 
 static void Dw_image_size_request (DwWidget *widget,
                                    DwRequisition *requisition)
@@ -130,7 +161,11 @@ static void Dw_image_draw (DwWidget *wid
 gint Dw_image_enter_notify (DwWidget *widget,
                             GdkEventMotion *event)
 {
-// g_print ("Dw_image_enter_notify: %p\n", widget);
+   DwImage *image = DW_IMAGE (widget);
+
+   if (prefs.show_alt && image->alt_text)
+      image->timeout_id = gtk_timeout_add(700, Dw_image_draw_alt, image);
+   
    return TRUE;
 }
 
@@ -138,10 +173,39 @@ gint Dw_image_enter_notify (DwWidget *wi
 gint Dw_image_leave_notify (DwWidget *widget,
                             GdkEventMotion *event)
 {
-// g_print ("Dw_image_leave_notify: %p\n", widget);
+   DwImage *image = DW_IMAGE (widget);
+
+   if (prefs.show_alt && image->alt_text)
+      Dw_image_destroy_alt(image);
+
    return TRUE;
 }
 
+gint Dw_image_button_press (DwWidget *widget,
+			    gint32 x, gint32 y,
+			    GdkEventButton *event)
+{
+   DwImage *image = DW_IMAGE (widget);
+
+   if (prefs.show_alt && image->alt_text)
+      Dw_image_destroy_alt(image);
+
+   return FALSE;
+}
+
+gint Dw_image_motion_notify (DwWidget *widget,
+			     gint32 x, gint32 y,
+			     GdkEventMotion *event)
+{
+   DwImage *image = DW_IMAGE (widget);
+
+   if (prefs.show_alt && image->alt_text) {
+      Dw_image_destroy_alt(image);   
+      image->timeout_id = gtk_timeout_add(700, Dw_image_draw_alt, image);
+   }
+
+   return FALSE;
+}
 
 /*
  * Set or resize a image.
@@ -178,3 +242,56 @@ void a_Dw_image_set_buffer(DwImage *imag
    image->buffer = ImageBuffer;
 }
 
+
+/*
+ * Destroy alt_img struct inside DwImage
+ */
+void Dw_image_destroy_alt(DwImage *image)
+{
+   if (image->timeout_id)
+      gtk_timeout_remove(image->timeout_id);
+   
+   if (image->alt_img) {
+      gtk_widget_hide(image->alt_img);
+      gtk_widget_unmap(image->alt_img);
+      gtk_widget_unrealize(image->alt_img);
+      g_free(image->alt_img);
+      image->alt_img = NULL;
+   }
+}
+
+/*
+ *  Request to draw alt on current DwImage
+ */ 
+static gint Dw_image_draw_alt(gpointer data)
+{
+   GtkStyle *style;
+   gint x, y, width, ascent, descent;
+   DwImage *image = (DwImage *)data;
+
+   gdk_window_get_pointer (NULL, &x, &y, NULL);
+   
+   image->alt_img = gtk_window_new(GTK_WINDOW_POPUP);
+   gtk_widget_set_app_paintable (image->alt_img, TRUE);
+   gtk_window_set_policy (GTK_WINDOW (image->alt_img), FALSE, FALSE, TRUE); 
+   gtk_widget_set_name (image->alt_img, "Alt Image");
+   gtk_widget_ensure_style (image->alt_img);
+   style = image->alt_img->style;
+   gdk_string_extents(style->font, image->alt_text, NULL, NULL,
+		      &width, &ascent, &descent);
+   gtk_widget_set_usize (image->alt_img, width + 8, ascent + descent + 8);
+   
+   gtk_widget_popup(image->alt_img, x+10, y+10);
+   
+   gtk_paint_box(style, image->alt_img->window,
+		 GTK_STATE_NORMAL, GTK_SHADOW_OUT, 
+		 NULL, GTK_WIDGET(image->alt_img), "Alt Image",
+		 0, 0, -1 , -1);
+   
+   gtk_paint_string(style, image->alt_img->window,
+		    GTK_STATE_NORMAL, NULL, 
+		    GTK_WIDGET(image->alt_img), "Alt Image",
+		    4, ascent + 4, image->alt_text);
+
+   return FALSE;
+}
diff -bpru dillo/src/dw_image.h dillo.alt/src/dw_image.h
--- dillo/src/dw_image.h	Sun Mar  4 16:21:27 2001
+++ dillo.alt/src/dw_image.h	Fri Mar 30 04:47:33 2001
@@ -30,6 +30,11 @@ struct _DwImage
    guchar* buffer;
    gint width;
    gint height;
+
+   /* Alt "tooltip" for images */
+   GtkWidget *alt_img;
+   gchar *alt_text;
+   guint timeout_id;
 };
 
 struct _DwImageClass
@@ -42,7 +47,7 @@ struct _DwImageClass
  * Function prototypes
  */
 GtkType a_Dw_image_get_type (void);
-DwWidget* a_Dw_image_new  (DwImageType type);
+DwWidget* a_Dw_image_new  (DwImageType type, const gchar *alt);
 void a_Dw_image_size (DwImage *image, gint width, gint height);
 void a_Dw_image_draw_row(DwImage *image, guchar *LineBuf,
                          gint Width, gint Height, gint x, gint y);
diff -bpru dillo/src/gif.c dillo.alt/src/gif.c
--- dillo/src/gif.c	Sun Mar  4 16:21:32 2001
+++ dillo.alt/src/gif.c	Fri Mar 30 05:07:20 2001
@@ -161,7 +161,7 @@ DwWidget *a_Gif_image(const char *Type, 
    DICacheEntry *DicEntry;
 
    if ( !web->Image )
-      web->Image = a_Image_new(0, 0, "gif", prefs.bg_color);
+      web->Image = a_Image_new(0, 0, NULL, prefs.bg_color);
       /* todo: get the backgound color from the parent widget -- Livio. */
 
    DicEntry = a_Dicache_get_entry(web->url);
diff -bpru dillo/src/image.c dillo.alt/src/image.c
--- dillo/src/image.c	Sun Mar  4 16:21:33 2001
+++ dillo.alt/src/image.c	Fri Mar 30 05:06:31 2001
@@ -96,8 +96,6 @@ void a_Image_write(DilloImage *Image, co
  */
 void a_Image_close(DilloImage *Image)
 {
-   if (Image->alt)
-     g_free(Image->alt);
    g_free(Image);
 }
 
@@ -134,12 +132,11 @@ DilloImage *
    DilloImage *Image;
 
    Image = g_new(DilloImage, 1);
-   Image->dw = (DwImage *) a_Dw_image_new(DW_IMAGE_RGB);
+   Image->dw = (DwImage *) a_Dw_image_new(DW_IMAGE_RGB, alt);
    Image->width = Image->in_width = 0;
    Image->height = Image->in_height = 0;
    Image->cmap = NULL;
    Image->in_type = DILLO_IMG_TYPE_NOTSET;
-   Image->alt = (alt) ? g_strdup(alt) : NULL;
    Image->bg_color = bg_color;
    Image->ProcessedBytes = 0;
 
diff -bpru dillo/src/image.h dillo.alt/src/image.h
--- dillo/src/image.h	Sun Mar  4 16:21:33 2001
+++ dillo.alt/src/image.h	Sun Mar 25 03:41:17 2001
@@ -30,7 +30,6 @@ struct _DilloImage {
 
   const guchar *cmap;     /* Color map (only for indexed) */
   DilloImgType in_type;   /* Image Type */
-  gchar *alt;             /* Alternative text for the image */
   gint32 bg_color;        /* Background color */
 
   gint ProcessedBytes;    /* Amount of bytes already decoded */
diff -bpru dillo/src/jpeg.c dillo.alt/src/jpeg.c
--- dillo/src/jpeg.c	Sun Mar  4 16:21:34 2001
+++ dillo.alt/src/jpeg.c	Fri Mar 30 05:06:43 2001
@@ -98,7 +98,7 @@ DwWidget *a_Jpeg_image(const char *Type,
    DICacheEntry *DicEntry;
 
    if ( !web->Image )
-      web->Image = a_Image_new(0, 0, "jpeg", DW_PAINT_DEFAULT_BGND);
+      web->Image = a_Image_new(0, 0, NULL, DW_PAINT_DEFAULT_BGND);
 
    DicEntry = a_Dicache_get_entry(web->url);
    if ( !DicEntry ) {
diff -bpru dillo/src/png.c dillo.alt/src/png.c
--- dillo/src/png.c	Wed Mar  7 16:38:13 2001
+++ dillo.alt/src/png.c	Fri Mar 30 05:07:28 2001
@@ -439,7 +439,7 @@ DwWidget *a_Png_image(const char *Type, 
 #endif
 
    if ( !web->Image )
-      web->Image = a_Image_new(0, 0, "png", prefs.bg_color);
+      web->Image = a_Image_new(0, 0, NULL, prefs.bg_color);
 
    DicEntry = a_Dicache_get_entry(web->url);
    if ( !DicEntry ) {
diff -bpru dillo/src/prefs.c dillo.alt/src/prefs.c
--- dillo/src/prefs.c	Sun Mar  4 16:21:34 2001
+++ dillo.alt/src/prefs.c	Sat Mar 31 01:30:45 2001
@@ -44,6 +44,7 @@ static const struct {
    { "text_color", DRC_TOKEN_TEXT_COLOR },
    { "use_oblique", DRC_TOKEN_USE_OBLIQUE },
    { "home", DRC_TOKEN_HOME },
+   { "show_alt", DRC_TOKEN_SHOW_ALT },
    { "font_factor", DRC_TOKEN_FONT_FACTOR }
 };
 
@@ -119,6 +120,9 @@ static guint Prefs_parser(GScanner *scan
    case DRC_TOKEN_HOME:
       prefs.home = g_strdup(scanner->value.v_string);
       break;
+   case DRC_TOKEN_SHOW_ALT:
+      prefs.show_alt = (strcmp(scanner->value.v_string, "YES") == 0);
+      break;
    case DRC_TOKEN_FONT_FACTOR:
       prefs.font_factor = strtod(scanner->value.v_string, NULL);
       break;
@@ -222,6 +226,7 @@ void a_Prefs_init(void)
    prefs.home = DILLO_HOME;
    prefs.allow_white_bg = FALSE;
    prefs.force_my_colors = FALSE;
+   prefs.show_alt = FALSE;
    prefs.font_factor = 1.0;
    Prefs_load();
 }
diff -bpru dillo/src/prefs.h dillo.alt/src/prefs.h
--- dillo/src/prefs.h	Sun Mar  4 16:21:34 2001
+++ dillo.alt/src/prefs.h	Sat Mar 31 01:09:47 2001
@@ -35,6 +35,7 @@ typedef enum {
    DRC_TOKEN_USE_OBLIQUE,
    DRC_TOKEN_HOME,
    DRC_TOKEN_FONT_FACTOR,
+   DRC_TOKEN_SHOW_ALT,
    DRC_TOKEN_LAST
 } Dillo_Rc_TokenType;
 
@@ -53,6 +54,7 @@ struct _DilloPrefs {
    gboolean allow_white_bg;
    gboolean use_oblique;
    gboolean force_my_colors;
+   gboolean show_alt;
    gdouble font_factor;
 };
 
