Index: src/mainwin.h
===================================================================
--- src/mainwin.h	(revision 5000)
+++ src/mainwin.h	(working copy)
@@ -352,6 +352,7 @@
   friend class WharfIcon;
   friend class IconManager;
   friend class IconManager_Default;
+  friend class IconManager_Small;
   friend class OptionsDlg;
   friend class CUserViewItem;
   friend class UserSendCommon;
Index: src/wharf.cpp
===================================================================
--- src/wharf.cpp	(revision 5000)
+++ src/wharf.cpp	(working copy)
@@ -626,9 +626,9 @@
 
 }
 
-//=============================================================================
+//=====IconManager_Small=====================================================
 
-IconManager_KDEStyle::IconManager_KDEStyle(CMainWindow *_mainwin, QMenu *_menu, QWidget *parent )
+IconManager_Small::IconManager_Small(CMainWindow *_mainwin, QMenu *_menu, QWidget *parent )
   : IconManager(_mainwin, _menu, parent)
 {
   m_timerToggle = false;
@@ -637,49 +637,26 @@
   m_nSysMsg = 0;
   m_nNewMsg = 0;
   m_bStatusInvisible = false;
-  resize(22, 22);
-  setMinimumSize(22, 22);
 
-#if defined(USE_KDE)
-  KWin::setSystemTrayWindowFor( winId(), _mainwin ? _mainwin->topLevelWidget()->winId() : qt_xrootwin() );
-  setBackgroundMode(Qt::X11ParentRelative);
-#elsif defined(Q_WS_X11)
-  setBackgroundMode(Qt::X11ParentRelative);
+  m_SmallIcon = new QSystemTrayIcon(_mainwin);
 
-  Display *dsp = x11Display();  // get the display
-  char buffer[128];
-  XEvent ev;
+  SetDockIconStatus();
 
-  snprintf(buffer, sizeof(buffer), "_NET_SYSTEM_TRAY_S%d", x11Screen());
-  Atom a = XInternAtom(dsp, buffer, False);
-  Window systray = XGetSelectionOwner(dsp, a);
+  m_SmallIcon->setContextMenu(_menu);
 
+  connect(m_SmallIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)),
+	  this, SLOT(mousePressEvent(QSystemTrayIcon::ActivationReason)));
 
-  memset(&ev, 0, sizeof(ev));
-  ev.xclient.type = ClientMessage;
-  ev.xclient.window = systray;
-  ev.xclient.message_type = XInternAtom(dsp, "_NET_SYSTEM_TRAY_OPCODE", False);
-  ev.xclient.format = 32;
-  ev.xclient.data.l[0] = CurrentTime;
-  ev.xclient.data.l[1] = SYSTEM_TRAY_REQUEST_DOCK;
-  ev.xclient.data.l[2] = winId();
-  ev.xclient.data.l[3] = 0;
-  ev.xclient.data.l[4] = 0;
-
-  XSendEvent(dsp, systray, False, NoEventMask, &ev);
-  XSync(dsp, False);
-
-#endif /* defined(Q_WS_X11) */
-
-  show();
+  m_SmallIcon->show();
 }
 
 
-IconManager_KDEStyle::~IconManager_KDEStyle()
+IconManager_Small::~IconManager_Small()
 {
+    delete m_SmallIcon;
 }
 
-void IconManager_KDEStyle::SetDockIconStatus()
+void IconManager_Small::SetDockIconStatus()
 {
   //TODO make general for all plugins
   ICQOwner *o = gUserManager.FetchOwner(LOCK_R);
@@ -690,11 +667,10 @@
   gUserManager.DropOwner();
 
   updateTooltip();
-
-  repaint();
+  updateIcon();
 }
 
-void IconManager_KDEStyle::SetDockIconMsg(unsigned short nNewMsg, unsigned short nSysMsg)
+void IconManager_Small::SetDockIconMsg(unsigned short nNewMsg, unsigned short nSysMsg)
 {
   static int timerId = 0;
   m_nNewMsg = nNewMsg;
@@ -710,28 +686,25 @@
     m_eventIcon = QPixmap();
 
   updateTooltip();
-
-  repaint();
+  updateIcon();
 }
 
-void IconManager_KDEStyle::timerEvent(QTimerEvent* /* e */)
+void IconManager_Small::timerEvent(QTimerEvent* /* e */)
 {
   m_timerToggle = !m_timerToggle;
-  repaint();
+  updateIcon();
 }
 
-void IconManager_KDEStyle::paintEvent( QPaintEvent* /* e */)
+void IconManager_Small::updateIcon()
 {
-  QPainter p(this);
-
   if(m_timerToggle && !m_eventIcon.isNull())
-    p.drawPixmap((width()-m_eventIcon.width())/2, (height()-m_eventIcon.height())/2, m_eventIcon);
+    m_SmallIcon->setIcon(m_eventIcon);
   else
-    p.drawPixmap((width()-m_statusIcon.width())/2, (height()-m_statusIcon.height())/2, m_statusIcon);
+    m_SmallIcon->setIcon(m_statusIcon);
 }
 
 #if defined(Q_WS_X11)
-bool IconManager_KDEStyle::x11Event(XEvent *ev)
+bool IconManager_Small::x11Event(XEvent *ev)
 {
   if ((ev->type == ReparentNotify))
   {
@@ -743,11 +716,12 @@
 }
 #endif /* defined(Q_WS_X11) */
 
-void IconManager_KDEStyle::mousePressEvent( QMouseEvent *e )
+void IconManager_Small::mousePressEvent( enum QSystemTrayIcon::ActivationReason r )
 {
-  switch(e->button())
+  switch(r)
   {
-  case Qt::LeftButton:
+  case QSystemTrayIcon::Trigger:
+  case QSystemTrayIcon::DoubleClick:
     if(mainwin->isVisible() && !mainwin->isMinimized())
       mainwin->hide();
     else
@@ -763,15 +737,31 @@
       mainwin->raise();
     }
     break;
-   default:
-     IconManager::mousePressEvent(e);
-     break;
+
+  case QSystemTrayIcon::MiddleClick:
+    mainwin->callMsgFunction();
+    break;
+
+  case QSystemTrayIcon::Context:
+    // This case is handled by QT itself, thus empty
+    break;
+
+  case QSystemTrayIcon::Unknown:
+#ifdef DEBUG_WHARF
+    //FIXME: printout a gLog warning
+#endif
+    break;
+
+  default:
+#ifdef DEBUG_WHARF
+    //FIXME: printout a gLog error
+#endif
+    break;
   }
 }
 
-void IconManager_KDEStyle::updateTooltip()
+void IconManager_Small::updateTooltip()
 {
-  QToolTip::remove(this);
   QString s = QString("<nobr>") + QString(ICQUser::StatusToStatusStr(m_ownerStatus, m_bStatusInvisible))
       + QString("</nobr>");
 
@@ -787,7 +777,7 @@
           "<br>Middle click - Show next message"
           "<br>Right click - System menu");
 
-  QToolTip::add(this, s);
+  m_SmallIcon->setToolTip(s);
 }
 
 //=====WharfIcon=============================================================
Index: src/optionsdlg.cpp
===================================================================
--- src/optionsdlg.cpp	(revision 5000)
+++ src/optionsdlg.cpp	(working copy)
@@ -594,13 +594,13 @@
           mainwin->licqIcon->close();
           delete mainwin->licqIcon;
         }
-        mainwin->licqIcon = new IconManager_KDEStyle(mainwin, mainwin->mnuSystem);
+        mainwin->licqIcon = new IconManager_Small(mainwin, mainwin->mnuSystem);
         mainwin->m_nDockMode = DockSmall;
       }
     }
 #else
     if(!mainwin->licqIcon)
-      mainwin->licqIcon = new IconManager_KDEStyle(mainwin, mainwin->mnuSystem);
+      mainwin->licqIcon = new IconManager_Small(mainwin, mainwin->mnuSystem);
     mainwin->m_nDockMode = DockDefault;
 #endif
     mainwin->updateStatus();
Index: src/mainwin.cpp
===================================================================
--- src/mainwin.cpp	(revision 5000)
+++ src/mainwin.cpp	(working copy)
@@ -753,7 +753,7 @@
   {
 #ifdef USE_KDE
 	if (m_nDockMode != DockNone)
-      licqIcon = new IconManager_KDEStyle(this, mnuSystem);
+      licqIcon = new IconManager_Small(this, mnuSystem);
 #else
 	switch (m_nDockMode)
 	{
@@ -764,7 +764,7 @@
     	licqIcon = new IconManager_Themed(this, mnuSystem, szDockTheme);
     	break;
       case DockSmall:
-    	licqIcon = new IconManager_KDEStyle(this, mnuSystem);
+    	licqIcon = new IconManager_Small(this, mnuSystem);
       case DockNone:
     	break;
 	}
Index: src/wharf.h
===================================================================
--- src/wharf.h	(revision 5000)
+++ src/wharf.h	(working copy)
@@ -29,6 +29,7 @@
 #include <QtGui/QPixmap>
 #include <QtGui/QBitmap>
 #include <QtGui/QMenu>
+#include <QtGui/QSystemTrayIcon>
 //Added by qt3to4:
 #include <QtGui/QMouseEvent>
 #include <QtCore/QTimerEvent>
@@ -52,7 +53,7 @@
 friend class IconManager;
 friend class IconManager_Default;
 friend class IconManager_Themed;
-friend class IconManager_KDEStyle;
+friend class IconManager_Small;
 };
 
 
@@ -118,21 +119,23 @@
           *pixInvisible, *pixFFC;
 };
 
-class IconManager_KDEStyle : public IconManager
+class IconManager_Small : public IconManager
 {
   Q_OBJECT
 
+public slots:
+  virtual void mousePressEvent(enum QSystemTrayIcon::ActivationReason);
+
 public:
-  IconManager_KDEStyle(CMainWindow*, QMenu*, QWidget* parent=0);
-  virtual ~IconManager_KDEStyle();
+  IconManager_Small(CMainWindow*, QMenu*, QWidget* parent=0);
+  virtual ~IconManager_Small();
 
   virtual void SetDockIconStatus();
   virtual void SetDockIconMsg(unsigned short nNewMsg, unsigned short nSysMsg);
 
 protected:
-  virtual void mousePressEvent (QMouseEvent *);
   virtual void timerEvent(QTimerEvent*);
-  virtual void paintEvent (QPaintEvent *);
+  virtual void updateIcon();
 
 #if defined(Q_WS_X11)
   virtual bool x11Event(XEvent *);
@@ -149,6 +152,9 @@
 
   bool m_bStatusInvisible;
   bool m_timerToggle;
+
+private:
+  QSystemTrayIcon *m_SmallIcon;
 };
 
 #endif
