--- kdebase-3.0.2/kicker/applets/systemtray/systemtrayapplet.cpp.dock 2002-07-29 19:54:48.000000000 +0200 +++ kdebase-3.0.2/kicker/applets/systemtray/systemtrayapplet.cpp 2002-07-29 20:41:02.000000000 +0200 @@ -94,6 +93,46 @@ this, SLOT( systemTrayWindowAdded(WId) ) ); connect( kwin_module, SIGNAL( systemTrayWindowRemoved(WId) ), this, SLOT( updateTrayWindows() ) ); + + QCString screenstr; + screenstr.setNum(qt_xscreen()); + QCString trayatom = "_NET_SYSTEM_TRAY_S" + screenstr; + + Display *display = qt_xdisplay(); + + net_system_tray_selection = XInternAtom( display, + trayatom, FALSE ); + net_system_tray_opcode = XInternAtom( display, + "_NET_SYSTEM_TRAY_OPCODE", FALSE ); + + // Acquire system tray + XSetSelectionOwner(display, + net_system_tray_selection, + winId(), + CurrentTime); + + WId root = qt_xrootwin(); + + if (XGetSelectionOwner (display, net_system_tray_selection) \ + == winId()) + { + XClientMessageEvent xev; + + xev.type = ClientMessage; + xev.window = root +; + xev.message_type = XInternAtom (display, "MANAGER", False); + xev.format = 32; + xev.data.l[0] = CurrentTime; + xev.data.l[1] = net_system_tray_selection; + xev.data.l[2] = winId(); + xev.data.l[3] = 0; /* manager specific data */ + xev.data.l[4] = 0; /* manager specific data */ + + XSendEvent (display, root, + False, StructureNotifyMask, (XEvent *)&xev); + + } } SystemTrayApplet::~SystemTrayApplet() @@ -102,6 +141,21 @@ m_Wins.clear(); } +bool SystemTrayApplet::x11Event( XEvent *e ) +{ +#define SYSTEM_TRAY_REQUEST_DOCK 0 +#define SYSTEM_TRAY_BEGIN_MESSAGE 1 +#define SYSTEM_TRAY_CANCEL_MESSAGE 2 + if ( e->type == ClientMessage ) { + if ( e->xclient.message_type == net_system_tray_opcode && \ + e->xclient.data.l[1] == SYSTEM_TRAY_REQUEST_DOCK) { + systemTrayWindowAdded(e->xclient.data.l[2]); + return true; + } + } + return KPanelApplet::x11Event( e ) ; +} + void SystemTrayApplet::mousePressEvent(QMouseEvent* e) { propagateMouseEvent(e); --- kdebase-3.0.2/kicker/applets/systemtray/systemtrayapplet.h.dock 2002-07-29 19:58:35.000000000 +0200 +++ kdebase-3.0.2/kicker/applets/systemtray/systemtrayapplet.h 2002-07-29 20:34:48.000000000 +0200 @@ -76,6 +76,7 @@ void mouseDoubleClickEvent(QMouseEvent*); void mouseMoveEvent(QMouseEvent*); void propagateMouseEvent(QMouseEvent*); + bool x11Event( XEvent *e ); protected slots: void systemTrayWindowAdded( WId ); @@ -86,7 +87,8 @@ private: KXEmbedList m_Wins; KWinModule *kwin_module; - + Atom net_system_tray_selection; + Atom net_system_tray_opcode; }; #endif