diff -urN mldonkey/config/configure.in mldonkey-2.5.30.17a/config/configure.in
--- mldonkey/config/configure.in	2005-07-05 14:32:04.000000000 +0200
+++ mldonkey-2.5.30.17a/config/configure.in	2005-07-09 10:18:15.000000000 +0200
@@ -885,15 +885,9 @@
 if test "$USE_GTK2" = "yes" ; then
   GTK=gtk2
   GUIS="mldonkey_gui\$(EXE)"
-  case "`uname -s`" in
-    *win32* | *WIN32* | MINGW* )
-      GTKCFLAGS="`pkg-config --cflags-only-I gtk+-2.0`"
-      GTKLLIBS="`pkg-config --libs-only-L gtk+-2.0`"
-      GTKLFLAGS="`pkg-config --libs-only-l gtk+-2.0`"
-      ;;
-    *)
-      ;;
-  esac
+  GTKCFLAGS="`pkg-config --cflags-only-I gtk+-2.0`"
+  GTKLLIBS="`pkg-config --libs-only-L gtk+-2.0`"
+  GTKLFLAGS="`pkg-config --libs-only-l gtk+-2.0`"
 else
   GTK=gtk
   GUIS="mldonkey_gui\$(EXE) mldonkey_gui2\$(EXE) mlchat\$(EXE)"
diff -urN mldonkey/config/Makefile.in mldonkey-2.5.30.17a/config/Makefile.in
--- mldonkey/config/Makefile.in	2005-06-25 01:49:14.000000000 +0200
+++ mldonkey-2.5.30.17a/config/Makefile.in	2005-07-09 11:12:34.781086760 +0200
@@ -130,12 +130,14 @@
 
 LIBS_flags += -ccopt "$(LDFLAGS) $(CPPFLAGS)" -cclib "$(LIBS)"
 
+LIBS_flags += -ccopt "$(GTKCFLAGS) $(GTKLLIBS)" -cclib "$(GTKLFLAGS)"
+
 ifeq ("$(OS_FILES2)", "mingw")
-  LIBS_flags += -ccopt "$(GTKCFLAGS) $(GTKLLIBS)" -cclib "$(GTKLFLAGS) -lws2_32 -lgdi32 -luser32 -ladvapi32 -lwsock32 -limm32 -lshell32 -lole32 resfile.o"
+  LIBS_flags += -cclib "-lws2_32 -lgdi32 -luser32 -ladvapi32 -lwsock32 -limm32 -lshell32 -lole32 resfile.o"
 endif
 
 ifeq ("$(OS_FILES2)", "cygwin")
-  LIBS_flags += -ccopt "$(GTKCFLAGS) $(GTKLLIBS)" -cclib "$(GTKLFLAGS) -lws2_32 -lgdi32 -luser32 -ladvapi32 -lwsock32 -limm32 -lshell32 -lole32 resfile.o"
+  LIBS_flags += -cclib "-lws2_32 -lgdi32 -luser32 -ladvapi32 -lwsock32 -limm32 -lshell32 -lole32 resfile.o"
 endif
 
 ifeq ("$(ZLIB)" , "yes")
@@ -809,7 +811,7 @@
 
 ifeq ("$(COMPILE_GUI)" , "yes")
   ifeq ("$(USE_GTK2)", "yes")
-    SUBDIRS += $(SRC_GUI) $(SRC_GUI)/win32 $(ICONS_CHOICE) +lablgtk2
+    SUBDIRS += $(SRC_GUI) $(SRC_GUI)/x11 $(SRC_GUI)/win32 $(ICONS_CHOICE) +lablgtk2
     GTK_LIBS_byte=-I +lablgtk2 $(LABLGL_CMA) lablgtk.cma gtkInit.cmo lablrsvg.cma
     GTK_LIBS_opt=-I +lablgtk2 $(LABLGL_CMXA) lablgtk.cmxa gtkInit.cmx lablrsvg.cmxa
     GTK_STATIC_LIBS_opt=-I +lablgtk2 lablgtk.cmxa gtkInit.cmx lablrsvg.cmxa
@@ -1185,10 +1187,14 @@
   $(SRC_GUI)/guiWindow.ml
 
 ifeq ("$(OS_FILES2)", "mingw")
-  GTK2GUI_SRCS += $(SRC_GUI)/win32/systraystubs.c $(SRC_GUI)/win32/systray.ml
+  GTK2GUI_SRCS += $(SRC_GUI)/win32/systraystubs.c
+else
+  GTK2GUI_SRCS += $(SRC_GUI)/x11/eggtrayicon.c $(SRC_GUI)/x11/eggtrayicon.h $(SRC_GUI)/x11/systraystubs.c
 endif
 
-GTK2GUI_SRCS += $(SRC_GUI)/guiMain.ml
+GTK2GUI_SRCS += \
+  $(SRC_GUI)/guiSystray.ml \
+  $(SRC_GUI)/guiMain.ml
 
 NEWGUI_SRCS=  \
   $(SRC_PROGRESS)/gui_progress.ml \
diff -urN mldonkey/src/gtk2/gui/guiMain.ml mldonkey-2.5.30.17a/src/gtk2/gui/guiMain.ml
--- mldonkey/src/gtk2/gui/guiMain.ml	2005-05-02 14:57:59.000000000 +0200
+++ mldonkey-2.5.30.17a/src/gtk2/gui/guiMain.ml	2005-07-09 10:56:03.000000000 +0200
@@ -537,7 +537,7 @@
         ~modi:[`CONTROL] ~flags:[`VISIBLE] GdkKeysyms._k;
     end;
   let im =
-    GMenu.image_menu_item ~label:!M.mW_lb_im ~use_mnemonic:true
+    GMenu.image_menu_item ~label:!M.mW_me_im ~use_mnemonic:true
       ~image:(GMisc.image ~pixbuf:(A.get_icon ~icon:M.icon_menu_im ~size:A.SMALL ()) ())
       ~packing:menu#add ()
   in
@@ -619,8 +619,13 @@
         (fun _ -> GuiCom.send KillServer
       ));
     end;
+  let restore =
+    GMenu.image_menu_item ~label:!M.mW_me_restore ~use_mnemonic:true
+      ~image:(GMisc.image ~pixbuf:(A.get_icon ~icon:M.icon_menu_interfaces ~size:A.SMALL ()) ())
+      ~packing:menu#add ()
+  in
   let im =
-    GMenu.image_menu_item ~label:!M.mW_lb_im ~use_mnemonic:true
+    GMenu.image_menu_item ~label:!M.mW_me_im ~use_mnemonic:true
       ~image:(GMisc.image ~pixbuf:(A.get_icon ~icon:M.icon_menu_im ~size:A.SMALL ()) ())
       ~packing:menu#add ()
   in
@@ -634,6 +639,11 @@
       ~image:(GMisc.image ~pixbuf:(A.get_icon ~icon:M.icon_menu_quit ~size:A.SMALL ()) ())
       ~packing:menu#add ()
   in
+  ignore (restore#connect#activate 
+    (fun _ ->
+       gui.window#show ();
+       G.tray.destroy_tray ();
+  ));
   ignore (im#connect#activate 
     (fun _ -> GuiWindow.display_im gui ()
   ));
@@ -803,16 +813,10 @@
 
   ignore (w#event#connect#delete ~callback:
     (fun _ ->
-       if Autoconf.system = "windows"
-         then begin
-           w#misc#hide ();
-           let icon = A.get_icon ~icon:M.icon_type_source_normal ~size:A.LARGE () in
-           G.tray.create_tray icon "MLDonkey";
-           true
-         end else begin
-           quit ();
-           true
-         end
+       w#misc#hide ();
+       let icon = A.get_icon ~icon:M.icon_type_source_normal ~size:A.MEDIUM () in
+       G.tray.create_tray icon "MLDonkey";
+       true
   ));
 
   let main_menu = core_menu gui quit in
@@ -832,33 +836,30 @@
     !l
   );
 
-  if Autoconf.system = "windows"
-    then begin
-      !G.set_systray_callback (fun ev ->
-             match ev with
-               DOUBLE_CLICKED ->
-                 begin
-                   (if !!verbose then lprintf' "tray double clicked\n");
-                   G.tray.destroy_tray ();
-                   w#misc#show ();
-                   w#maximize ();
-                 end
-             | RBUTTON_CLICKED ->
-                 begin
-                   (if !!verbose then lprintf' "tray right clicked\n");
-                   let menu = tray_menu gui quit in
-                   let w_opt = GWindow.toplevel menu in
-                   match w_opt with
-                       None -> (if !!verbose then lprintf' "No toplevel window\n"; flush stdout)
-                     | Some win ->
-                         begin
-                           win#set_position `MOUSE;
-                           win#show ()
-                         end
-                 end
-             | _ -> ()
-           )
-    end;
+  !G.set_systray_callback (fun ev ->
+    match ev with
+        DOUBLE_CLICKED ->
+           begin
+             (if !!verbose then lprintf' "tray double clicked\n");
+             G.tray.destroy_tray ();
+             w#misc#show ();
+             w#maximize ();
+           end
+      | RBUTTON_CLICKED ->
+           begin
+             (if !!verbose then lprintf' "tray right clicked\n");
+             let menu = tray_menu gui quit in
+             let w_opt = GWindow.toplevel menu in
+             match w_opt with
+                 None -> (if !!verbose then lprintf' "No toplevel window\n"; flush stdout)
+               | Some win ->
+                   begin
+                     win#set_position `MOUSE;
+                     win#show ()
+                   end
+           end
+      | _ -> ()
+  );
 
   CommonGlobals.do_at_exit (fun _ ->
       GuiMisc.save_gui_options gui;
diff -urN mldonkey/src/gtk2/gui/guiMessages.ml mldonkey-2.5.30.17a/src/gtk2/gui/guiMessages.ml
--- mldonkey/src/gtk2/gui/guiMessages.ml	2005-04-26 13:02:21.000000000 +0200
+++ mldonkey-2.5.30.17a/src/gtk2/gui/guiMessages.ml	2005-07-09 10:48:29.000000000 +0200
@@ -351,6 +351,8 @@
 let mW_me_reconnect_to  = ref ""
 let mW_me_settings  = ref ""
 let mW_me_main_menu  = ref ""
+let mW_me_im  = ref ""
+let mW_me_restore = ref ""
 
 (* Settings Window *)
 
@@ -794,6 +796,8 @@
   mW_me_reconnect_to  :=  _s "Reconnect t_o";
   mW_me_settings  :=  !mW_lb_settings;
   mW_me_main_menu  :=  _s "Main me_nu";
+  mW_me_im  := _s "_Im";
+  mW_me_restore := _s "R_estore";
 
 (* Settings Window *)
 
diff -urN mldonkey/src/gtk2/gui/guiSystray.ml mldonkey-2.5.30.17a/src/gtk2/gui/guiSystray.ml
--- mldonkey/src/gtk2/gui/guiSystray.ml	1970-01-01 01:00:00.000000000 +0100
+++ mldonkey-2.5.30.17a/src/gtk2/gui/guiSystray.ml	2005-03-02 20:45:12.000000000 +0100
@@ -0,0 +1,44 @@
+open GuiTypes2
+
+type f = {mutable f : button_types -> unit}
+
+external systray_create : GdkPixbuf.pixbuf -> string -> unit = "caml_systray_create"
+external systray_set_icon : GdkPixbuf.pixbuf -> unit = "caml_systray_modify_icon"
+external systray_set_tooltip : string -> unit = "caml_systray_modify_tooltip"
+external systray_destroy : unit -> unit = "caml_systray_destroy"
+
+let tray_create pixb s =
+  systray_create pixb s;
+  GuiGlobal.is_docked := true
+
+let tray_set_icon = systray_set_icon
+let tray_set_tooltip = systray_set_tooltip
+
+let tray_destroy () =
+  systray_destroy ();
+  GuiGlobal.is_docked := false
+
+let callback = {f = (fun ev -> 
+             match ev with
+               DOUBLE_CLICKED ->
+               begin
+                   Printf.printf "tray double clicked\n";
+                   flush stdout;
+                 end
+             | RBUTTON_CLICKED ->
+                 begin
+                   Printf.printf "tray right clicked\n";
+                   flush stdout;
+                 end
+             | _ -> ()
+)}
+
+let f ev = callback.f ev
+
+let _ =
+  GuiGlobal.set_systray_callback := (fun g -> callback.f <- g);
+  Callback.register "on_systray_clicked" f;
+  GuiGlobal.tray.create_tray <- tray_create;
+  GuiGlobal.tray.set_icon_tray <- tray_set_icon;
+  GuiGlobal.tray.set_tooltip_tray <- tray_set_tooltip;
+  GuiGlobal.tray.destroy_tray <- tray_destroy
diff -urN mldonkey/src/gtk2/gui/win32/systray.ml mldonkey-2.5.30.17a/src/gtk2/gui/win32/systray.ml
--- mldonkey/src/gtk2/gui/win32/systray.ml	2005-03-02 20:45:12.000000000 +0100
+++ mldonkey-2.5.30.17a/src/gtk2/gui/win32/systray.ml	1970-01-01 01:00:00.000000000 +0100
@@ -1,44 +0,0 @@
-open GuiTypes2
-
-type f = {mutable f : button_types -> unit}
-
-external systray_create : GdkPixbuf.pixbuf -> string -> unit = "caml_systray_create"
-external systray_set_icon : GdkPixbuf.pixbuf -> unit = "caml_systray_modify_icon"
-external systray_set_tooltip : string -> unit = "caml_systray_modify_tooltip"
-external systray_destroy : unit -> unit = "caml_systray_destroy"
-
-let tray_create pixb s =
-  systray_create pixb s;
-  GuiGlobal.is_docked := true
-
-let tray_set_icon = systray_set_icon
-let tray_set_tooltip = systray_set_tooltip
-
-let tray_destroy () =
-  systray_destroy ();
-  GuiGlobal.is_docked := false
-
-let callback = {f = (fun ev -> 
-             match ev with
-               DOUBLE_CLICKED ->
-               begin
-                   Printf.printf "tray double clicked\n";
-                   flush stdout;
-                 end
-             | RBUTTON_CLICKED ->
-                 begin
-                   Printf.printf "tray right clicked\n";
-                   flush stdout;
-                 end
-             | _ -> ()
-)}
-
-let f ev = callback.f ev
-
-let _ =
-  GuiGlobal.set_systray_callback := (fun g -> callback.f <- g);
-  Callback.register "on_systray_clicked" f;
-  GuiGlobal.tray.create_tray <- tray_create;
-  GuiGlobal.tray.set_icon_tray <- tray_set_icon;
-  GuiGlobal.tray.set_tooltip_tray <- tray_set_tooltip;
-  GuiGlobal.tray.destroy_tray <- tray_destroy
diff -urN mldonkey/src/gtk2/gui/x11/eggtrayicon.c mldonkey-2.5.30.17a/src/gtk2/gui/x11/eggtrayicon.c
--- mldonkey/src/gtk2/gui/x11/eggtrayicon.c	1970-01-01 01:00:00.000000000 +0100
+++ mldonkey-2.5.30.17a/src/gtk2/gui/x11/eggtrayicon.c	2005-07-09 10:19:06.000000000 +0200
@@ -0,0 +1,476 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/* eggtrayicon.c
+ * Copyright (C) 2002 Anders Carlsson <andersca@gnu.org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef GUI_DISABLE_SYSTRAY
+
+
+#include <gtk/gtkversion.h>
+
+#if ((GTK_MAJOR_VERSION == 2) && (GTK_MINOR_VERSION >= 2))
+
+#include "eggtrayicon.h"
+#include <string.h>
+
+#define SYSTEM_TRAY_REQUEST_DOCK    0
+#define SYSTEM_TRAY_BEGIN_MESSAGE   1
+#define SYSTEM_TRAY_CANCEL_MESSAGE  2
+
+#define SYSTEM_TRAY_ORIENTATION_HORZ 0
+#define SYSTEM_TRAY_ORIENTATION_VERT 1
+
+enum {
+  PROP_0,
+  PROP_ORIENTATION
+};
+         
+static GtkPlugClass *parent_class = NULL;
+
+static void egg_tray_icon_init (EggTrayIcon *icon);
+static void egg_tray_icon_class_init (EggTrayIconClass *klass);
+
+static void egg_tray_icon_get_property (GObject    *object,
+                                        guint       prop_id,
+                                        GValue     *value,
+                                        GParamSpec *pspec);
+
+static void egg_tray_icon_realize   (GtkWidget *widget);
+static void egg_tray_icon_unrealize (GtkWidget *widget);
+
+static void egg_tray_icon_update_manager_window (EggTrayIcon *icon);
+
+GType
+egg_tray_icon_get_type (void)
+{
+  static GType our_type = 0;
+
+  if (our_type == 0)
+    {
+      static const GTypeInfo our_info =
+      {
+	sizeof (EggTrayIconClass),
+	(GBaseInitFunc) NULL,
+	(GBaseFinalizeFunc) NULL,
+	(GClassInitFunc) egg_tray_icon_class_init,
+	NULL, /* class_finalize */
+	NULL, /* class_data */
+	sizeof (EggTrayIcon),
+	0,    /* n_preallocs */
+	(GInstanceInitFunc) egg_tray_icon_init
+      };
+
+      our_type = g_type_register_static (GTK_TYPE_PLUG, "EggTrayIcon", &our_info, 0);
+    }
+
+  return our_type;
+}
+
+static void
+egg_tray_icon_init (EggTrayIcon *icon)
+{
+  icon->stamp = 1;
+  icon->orientation = GTK_ORIENTATION_HORIZONTAL;
+  
+  gtk_widget_add_events (GTK_WIDGET (icon), GDK_PROPERTY_CHANGE_MASK);
+}
+
+static void
+egg_tray_icon_class_init (EggTrayIconClass *klass)
+{
+  GObjectClass *gobject_class = (GObjectClass *)klass;
+  GtkWidgetClass *widget_class = (GtkWidgetClass *)klass;
+
+  parent_class = g_type_class_peek_parent (klass);
+
+  gobject_class->get_property = egg_tray_icon_get_property;
+
+  widget_class->realize   = egg_tray_icon_realize;
+  widget_class->unrealize = egg_tray_icon_unrealize;
+
+  g_object_class_install_property (gobject_class,
+				   PROP_ORIENTATION,
+				   g_param_spec_enum ("orientation",
+						      "Orientation",
+						      "The orientation of the tray.",
+						      GTK_TYPE_ORIENTATION,
+						      GTK_ORIENTATION_HORIZONTAL,
+						      G_PARAM_READABLE));
+}
+
+static void
+egg_tray_icon_get_property (GObject    *object,
+                            guint       prop_id,
+                            GValue     *value,
+                            GParamSpec *pspec)
+{
+  EggTrayIcon *icon = EGG_TRAY_ICON (object);
+
+  switch (prop_id)
+    {
+    case PROP_ORIENTATION:
+      g_value_set_enum (value, icon->orientation);
+      break;
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+      break;
+    }
+}
+
+static void
+egg_tray_icon_get_orientation_property (EggTrayIcon *icon)
+{
+  Display *xdisplay;
+  Atom type;
+  int format;
+	union {
+	  gulong *prop;
+		guchar *prop_ch;
+	} prop = { NULL };
+  gulong nitems;
+  gulong bytes_after;
+  int error, result;
+
+  g_assert (icon->manager_window != None);
+
+  xdisplay = GDK_DISPLAY_XDISPLAY (gtk_widget_get_display (GTK_WIDGET (icon)));
+
+  gdk_error_trap_push ();
+  type = None;
+  result = XGetWindowProperty (xdisplay,
+			       icon->manager_window,
+			       icon->orientation_atom,
+			       0, G_MAXLONG, FALSE,
+			       XA_CARDINAL,
+			       &type, &format, &nitems,
+			       &bytes_after, &(prop.prop_ch));
+  error = gdk_error_trap_pop ();
+
+  if (error || result != Success)
+    return;
+
+  if (type == XA_CARDINAL)
+    {
+      GtkOrientation orientation;
+
+      orientation = (prop.prop [0] == SYSTEM_TRAY_ORIENTATION_HORZ) ?
+					GTK_ORIENTATION_HORIZONTAL :
+					GTK_ORIENTATION_VERTICAL;
+
+      if (icon->orientation != orientation)
+	{
+	  icon->orientation = orientation;
+
+	  g_object_notify (G_OBJECT (icon), "orientation");
+	}
+    }
+
+  if (prop.prop)
+    XFree (prop.prop);
+}
+
+static GdkFilterReturn
+egg_tray_icon_manager_filter (GdkXEvent *xevent, GdkEvent *event, gpointer user_data)
+{
+  EggTrayIcon *icon = user_data;
+  XEvent *xev = (XEvent *)xevent;
+
+  if (xev->xany.type == ClientMessage &&
+      xev->xclient.message_type == icon->manager_atom &&
+      xev->xclient.data.l[1] == icon->selection_atom)
+    {
+      egg_tray_icon_update_manager_window (icon);
+    }
+  else if (xev->xany.window == icon->manager_window)
+    {
+      if (xev->xany.type == PropertyNotify &&
+	  xev->xproperty.atom == icon->orientation_atom)
+	{
+	  egg_tray_icon_get_orientation_property (icon);
+	}
+      if (xev->xany.type == DestroyNotify)
+	{
+	  egg_tray_icon_update_manager_window (icon);
+	}
+    }
+  
+  return GDK_FILTER_CONTINUE;
+}
+
+static void
+egg_tray_icon_unrealize (GtkWidget *widget)
+{
+  EggTrayIcon *icon = EGG_TRAY_ICON (widget);
+  GdkWindow *root_window;
+
+  if (icon->manager_window != None)
+    {
+      GdkWindow *gdkwin;
+
+      gdkwin = gdk_window_lookup_for_display (gtk_widget_get_display (widget),
+                                              icon->manager_window);
+
+      gdk_window_remove_filter (gdkwin, egg_tray_icon_manager_filter, icon);
+    }
+
+  root_window = gdk_screen_get_root_window (gtk_widget_get_screen (widget));
+
+  gdk_window_remove_filter (root_window, egg_tray_icon_manager_filter, icon);
+
+  if (GTK_WIDGET_CLASS (parent_class)->unrealize)
+    (* GTK_WIDGET_CLASS (parent_class)->unrealize) (widget);
+}
+
+static void
+egg_tray_icon_send_manager_message (EggTrayIcon *icon,
+				    long         message,
+				    Window       window,
+				    long         data1,
+				    long         data2,
+				    long         data3)
+{
+  XClientMessageEvent ev;
+  Display *display;
+  
+  ev.type = ClientMessage;
+  ev.window = window;
+  ev.message_type = icon->system_tray_opcode_atom;
+  ev.format = 32;
+  ev.data.l[0] = gdk_x11_get_server_time (GTK_WIDGET (icon)->window);
+  ev.data.l[1] = message;
+  ev.data.l[2] = data1;
+  ev.data.l[3] = data2;
+  ev.data.l[4] = data3;
+
+  display = GDK_DISPLAY_XDISPLAY (gtk_widget_get_display (GTK_WIDGET (icon)));
+  
+  gdk_error_trap_push ();
+  XSendEvent (display,
+	      icon->manager_window, False, NoEventMask, (XEvent *)&ev);
+  XSync (display, False);
+  gdk_error_trap_pop ();
+}
+
+static void
+egg_tray_icon_send_dock_request (EggTrayIcon *icon)
+{
+  egg_tray_icon_send_manager_message (icon,
+				      SYSTEM_TRAY_REQUEST_DOCK,
+				      icon->manager_window,
+				      gtk_plug_get_id (GTK_PLUG (icon)),
+				      0, 0);
+}
+
+static void
+egg_tray_icon_update_manager_window (EggTrayIcon *icon)
+{
+  Display *xdisplay;
+
+  xdisplay = GDK_DISPLAY_XDISPLAY (gtk_widget_get_display (GTK_WIDGET (icon)));
+  
+  if (icon->manager_window != None)
+    {
+      GdkWindow *gdkwin;
+
+      gdkwin = gdk_window_lookup_for_display (gtk_widget_get_display (GTK_WIDGET (icon)),
+					      icon->manager_window);
+      
+      gdk_window_remove_filter (gdkwin, egg_tray_icon_manager_filter, icon);
+    }
+  
+  XGrabServer (xdisplay);
+  
+  icon->manager_window = XGetSelectionOwner (xdisplay,
+					     icon->selection_atom);
+
+  if (icon->manager_window != None)
+    XSelectInput (xdisplay,
+		  icon->manager_window, StructureNotifyMask|PropertyChangeMask);
+
+  XUngrabServer (xdisplay);
+  XFlush (xdisplay);
+  
+  if (icon->manager_window != None)
+    {
+      GdkWindow *gdkwin;
+
+      gdkwin = gdk_window_lookup_for_display (gtk_widget_get_display (GTK_WIDGET (icon)),
+					      icon->manager_window);
+      
+      gdk_window_add_filter (gdkwin, egg_tray_icon_manager_filter, icon);
+
+      /* Send a request that we'd like to dock */
+      egg_tray_icon_send_dock_request (icon);
+
+      egg_tray_icon_get_orientation_property (icon);
+    }
+}
+
+static void
+egg_tray_icon_realize (GtkWidget *widget)
+{
+  EggTrayIcon *icon = EGG_TRAY_ICON (widget);
+  GdkScreen *screen;
+  GdkDisplay *display;
+  Display *xdisplay;
+  char buffer[256];
+  GdkWindow *root_window;
+
+  if (GTK_WIDGET_CLASS (parent_class)->realize)
+    GTK_WIDGET_CLASS (parent_class)->realize (widget);
+
+  screen = gtk_widget_get_screen (widget);
+  display = gdk_screen_get_display (screen);
+  xdisplay = gdk_x11_display_get_xdisplay (display);
+
+  /* Now see if there's a manager window around */
+  g_snprintf (buffer, sizeof (buffer),
+	      "_NET_SYSTEM_TRAY_S%d",
+	      gdk_screen_get_number (screen));
+
+  icon->selection_atom = XInternAtom (xdisplay, buffer, False);
+  
+  icon->manager_atom = XInternAtom (xdisplay, "MANAGER", False);
+  
+  icon->system_tray_opcode_atom = XInternAtom (xdisplay,
+						   "_NET_SYSTEM_TRAY_OPCODE",
+						   False);
+
+  icon->orientation_atom = XInternAtom (xdisplay,
+					"_NET_SYSTEM_TRAY_ORIENTATION",
+					False);
+
+  egg_tray_icon_update_manager_window (icon);
+
+  root_window = gdk_screen_get_root_window (screen);
+
+  /* Add a root window filter so that we get changes on MANAGER */
+  gdk_window_add_filter (root_window,
+			 egg_tray_icon_manager_filter, icon);
+}
+
+EggTrayIcon *
+egg_tray_icon_new_for_xscreen (Screen *xscreen, const char *name)
+{
+  GdkDisplay *display;
+  GdkScreen *screen;
+
+  display = gdk_x11_lookup_xdisplay (DisplayOfScreen (xscreen));
+  screen = gdk_display_get_screen (display, XScreenNumberOfScreen (xscreen));
+
+  return egg_tray_icon_new_for_screen (screen, name);
+}
+
+EggTrayIcon *
+egg_tray_icon_new_for_screen (GdkScreen *screen, const char *name)
+{
+  g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL);
+
+  return g_object_new (EGG_TYPE_TRAY_ICON, "screen", screen, "title", name, NULL);
+}
+
+EggTrayIcon*
+egg_tray_icon_new (const gchar *name)
+{
+  return g_object_new (EGG_TYPE_TRAY_ICON, "title", name, NULL);
+}
+
+guint
+egg_tray_icon_send_message (EggTrayIcon *icon,
+			    gint         timeout,
+			    const gchar *message,
+			    gint         len)
+{
+  guint stamp;
+  
+  g_return_val_if_fail (EGG_IS_TRAY_ICON (icon), 0);
+  g_return_val_if_fail (timeout >= 0, 0);
+  g_return_val_if_fail (message != NULL, 0);
+		     
+  if (icon->manager_window == None)
+    return 0;
+
+  if (len < 0)
+    len = strlen (message);
+
+  stamp = icon->stamp++;
+  
+  /* Get ready to send the message */
+  egg_tray_icon_send_manager_message (icon, SYSTEM_TRAY_BEGIN_MESSAGE,
+				      (Window)gtk_plug_get_id (GTK_PLUG (icon)),
+				      timeout, len, stamp);
+
+  /* Now to send the actual message */
+  gdk_error_trap_push ();
+  while (len > 0)
+    {
+      XClientMessageEvent ev;
+      Display *xdisplay;
+
+      xdisplay = GDK_DISPLAY_XDISPLAY (gtk_widget_get_display (GTK_WIDGET (icon)));
+      
+      ev.type = ClientMessage;
+      ev.window = (Window)gtk_plug_get_id (GTK_PLUG (icon));
+      ev.format = 8;
+      ev.message_type = XInternAtom (xdisplay,
+				     "_NET_SYSTEM_TRAY_MESSAGE_DATA", False);
+      if (len > 20)
+	{
+	  memcpy (&ev.data, message, 20);
+	  len -= 20;
+	  message += 20;
+	}
+      else
+	{
+	  memcpy (&ev.data, message, len);
+	  len = 0;
+	}
+
+      XSendEvent (xdisplay,
+		  icon->manager_window, False, StructureNotifyMask, (XEvent *)&ev);
+      XSync (xdisplay, False);
+    }
+  gdk_error_trap_pop ();
+
+  return stamp;
+}
+
+void
+egg_tray_icon_cancel_message (EggTrayIcon *icon,
+			      guint        id)
+{
+  g_return_if_fail (EGG_IS_TRAY_ICON (icon));
+  g_return_if_fail (id > 0);
+  
+  egg_tray_icon_send_manager_message (icon, SYSTEM_TRAY_CANCEL_MESSAGE,
+				      (Window)gtk_plug_get_id (GTK_PLUG (icon)),
+				      id, 0, 0);
+}
+
+GtkOrientation
+egg_tray_icon_get_orientation (EggTrayIcon *icon)
+{
+  g_return_val_if_fail (EGG_IS_TRAY_ICON (icon), GTK_ORIENTATION_HORIZONTAL);
+
+  return icon->orientation;
+}
+#endif   /* ((GTK_MAJOR_VERSION == 2) && (GTK_MINOR_VERSION >= 2)) */
+
+#endif   /* not defined GUI_DISABLE_SYSTRAY */
+
+
diff -urN mldonkey/src/gtk2/gui/x11/eggtrayicon.h mldonkey-2.5.30.17a/src/gtk2/gui/x11/eggtrayicon.h
--- mldonkey/src/gtk2/gui/x11/eggtrayicon.h	1970-01-01 01:00:00.000000000 +0100
+++ mldonkey-2.5.30.17a/src/gtk2/gui/x11/eggtrayicon.h	2005-07-09 10:19:17.000000000 +0200
@@ -0,0 +1,82 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/* eggtrayicon.h
+ * Copyright (C) 2002 Anders Carlsson <andersca@gnu.org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __EGG_TRAY_ICON_H__
+#define __EGG_TRAY_ICON_H__
+
+#ifndef GUI_DISABLE_SYSTRAY
+
+#include <gtk/gtkplug.h>
+#include <gdk/gdkx.h>
+#include <X11/Xatom.h>
+
+G_BEGIN_DECLS
+
+#define EGG_TYPE_TRAY_ICON		(egg_tray_icon_get_type ())
+#define EGG_TRAY_ICON(obj)		(G_TYPE_CHECK_INSTANCE_CAST ((obj), EGG_TYPE_TRAY_ICON, EggTrayIcon))
+#define EGG_TRAY_ICON_CLASS(klass)	(G_TYPE_CHECK_CLASS_CAST ((klass), EGG_TYPE_TRAY_ICON, EggTrayIconClass))
+#define EGG_IS_TRAY_ICON(obj)		(G_TYPE_CHECK_INSTANCE_TYPE ((obj), EGG_TYPE_TRAY_ICON))
+#define EGG_IS_TRAY_ICON_CLASS(klass)	(G_TYPE_CHECK_CLASS_TYPE ((klass), EGG_TYPE_TRAY_ICON))
+#define EGG_TRAY_ICON_GET_CLASS(obj)	(G_TYPE_INSTANCE_GET_CLASS ((obj), EGG_TYPE_TRAY_ICON, EggTrayIconClass))
+
+typedef struct _EggTrayIcon	  EggTrayIcon;
+typedef struct _EggTrayIconClass  EggTrayIconClass;
+
+struct _EggTrayIcon
+{
+  GtkPlug parent_instance;
+
+  guint stamp;
+
+  Atom selection_atom;
+  Atom manager_atom;
+  Atom system_tray_opcode_atom;
+  Atom orientation_atom;
+  Window manager_window;
+
+  GtkOrientation orientation;
+};
+
+struct _EggTrayIconClass
+{
+  GtkPlugClass parent_class;
+};
+
+GType        egg_tray_icon_get_type       (void);
+
+EggTrayIcon *egg_tray_icon_new_for_screen (GdkScreen   *screen,
+					   const gchar *name);
+
+EggTrayIcon *egg_tray_icon_new            (const gchar *name);
+
+guint        egg_tray_icon_send_message   (EggTrayIcon *icon,
+					   gint         timeout,
+					   const char  *message,
+					   gint         len);
+void         egg_tray_icon_cancel_message (EggTrayIcon *icon,
+					   guint        id);
+
+GtkOrientation egg_tray_icon_get_orientation (EggTrayIcon *icon);
+
+G_END_DECLS
+
+#endif /* __EGG_TRAY_ICON_H__ */
+
+#endif /* not defined GUI_DISABLE_SYSTRAY */
diff -urN mldonkey/src/gtk2/gui/x11/systraystubs.c mldonkey-2.5.30.17a/src/gtk2/gui/x11/systraystubs.c
--- mldonkey/src/gtk2/gui/x11/systraystubs.c	1970-01-01 01:00:00.000000000 +0100
+++ mldonkey-2.5.30.17a/src/gtk2/gui/x11/systraystubs.c	2005-01-31 20:52:14.000000000 +0100
@@ -0,0 +1,136 @@
+/* Copyright 2004 b8_bavard, INRIA */
+/*
+    This file is part of mldonkey.
+
+    mldonkey 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.
+
+    mldonkey 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 mldonkey; if not, write to the Free Software
+    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+
+/* Stub code to interface with x11 embedded */
+
+#include <gdk-pixbuf/gdk-pixbuf.h>
+#include <gtk/gtkeventbox.h>
+#include <gtk/gtkimage.h>
+#include <gtk/gtktooltips.h>
+
+#include <stdio.h>
+#include <lablgtk2/wrappers.h>
+#include <lablgtk2/ml_gdkpixbuf.h>
+#include <lablgtk2/ml_gobject.h>
+
+#include <caml/mlvalues.h>
+#include <caml/alloc.h>
+#include <caml/callback.h>
+#include <caml/fail.h>
+#include <caml/memory.h>
+
+#include "eggtrayicon.h"
+
+#define SYSTRAY_LBUTTONDBLCLK    0
+#define SYSTRAY_LBUTTONCLK       1
+#define SYSTRAY_RBUTTONCLK       2
+
+static GtkWidget   *systray_icon = NULL;
+static GtkWidget   *evbox = NULL;
+static GtkTooltips *systray_icon_tooltips = NULL;
+
+void call_caml_systray_clicked(int button_type)
+{
+
+  static value * closure_f = NULL;
+
+  if (closure_f == NULL) {
+    closure_f = caml_named_value("on_systray_clicked");
+  }
+
+  callback(*closure_f, Val_int(button_type));
+}
+
+
+static void msg_handler(GtkWidget *tray, GdkEventButton *ev)
+{
+
+  if (ev->type == GDK_BUTTON_PRESS) {
+
+    switch (ev->button)	{
+      case 3:
+	call_caml_systray_clicked(SYSTRAY_RBUTTONCLK);
+	return;
+
+      case 1:
+	call_caml_systray_clicked(SYSTRAY_LBUTTONCLK);
+	return;
+
+      case 2:
+	call_caml_systray_clicked(SYSTRAY_LBUTTONDBLCLK);
+	return;
+
+      default : break;
+
+    }
+
+  }
+}
+
+
+void caml_systray_modify_icon (value pixbuf)
+{
+  CAMLparam1 (pixbuf);
+  GtkWidget   *img, *old_img;
+
+  img = gtk_image_new_from_pixbuf (GdkPixbuf_val(pixbuf));
+  old_img = gtk_bin_get_child(GTK_BIN(evbox));
+  gtk_widget_destroy(old_img);
+  gtk_container_add (GTK_CONTAINER (evbox), img);
+  CAMLreturn0;
+}
+
+void caml_systray_modify_tooltip (value tooltip)
+{
+  CAMLparam1 (tooltip);
+
+  gtk_tooltips_set_tip (systray_icon_tooltips, systray_icon, String_val(tooltip), "");
+  CAMLreturn0;
+}
+
+void caml_systray_create (value pixbuf, value tooltip)
+{
+  CAMLparam2 (pixbuf, tooltip);
+  GtkWidget   *img;
+
+  systray_icon = GTK_WIDGET (egg_tray_icon_new ("MLDonkey"));
+  img = gtk_image_new_from_pixbuf (GdkPixbuf_val(pixbuf));
+  evbox = gtk_event_box_new ();
+  gtk_container_add (GTK_CONTAINER (systray_icon), evbox);
+  gtk_container_add (GTK_CONTAINER (evbox), img);
+  gtk_widget_show_all (systray_icon);
+  gtk_widget_realize (systray_icon);
+  gtk_widget_show (systray_icon);
+
+  systray_icon_tooltips = gtk_tooltips_new ();
+  gtk_tooltips_enable (systray_icon_tooltips);
+
+  gtk_tooltips_set_tip (systray_icon_tooltips, systray_icon, String_val(tooltip), "");
+
+  g_signal_connect (G_OBJECT (evbox), "button_press_event", G_CALLBACK (msg_handler), NULL);
+
+  CAMLreturn0;
+}
+
+void caml_systray_destroy (void)
+{
+
+  gtk_widget_destroy(systray_icon);
+  return;
+}
