Revision 1 (by moose, 2006/03/06 10:35:57) Initial Import
#include <QEvent>

#include "SciQX11TrayIcon.h"
#include "SciQMWBase.h"

#define SYSTEM_TRAY_REQUEST_DOCK    0
#define SYSTEM_TRAY_BEGIN_MESSAGE   1
#define SYSTEM_TRAY_CANCEL_MESSAGE  2
#define _NET_WM_STATE_REMOVE  0
#define _NET_WM_STATE_ADD  1
#define _NET_WM_STATE_TOGGLE  2
#include <X11/Xlib.h>
#include <X11/Xatom.h>

#include <QX11Info>
#include <QIcon>
#include <QPainter>
#include <QMouseEvent>
#include <QMenu>

const bool WTF = false;

SciQX11TrayIcon::SciQX11TrayIcon(QWidget *p) : QX11EmbedWidget(p), mw((SciQMWBase *)p)
{
	QX11Info xinfo;

	Display * dpy = QX11Info::display();
	Window w = winId();
   // find the systray
   char selection[32];
   snprintf(selection, sizeof(selection), "_NET_SYSTEM_TRAY_S%d", xinfo.screen());
   // non-zero indicates there is one on this screen
   Window systray =
      XGetSelectionOwner(dpy, XInternAtom(dpy, selection, False));
   if (! systray)
      return;
   XEvent ev;
   memset(&ev, 0, sizeof(ev));
   ev.type = ClientMessage;
   ev.xclient.display = dpy;
   ev.xclient.window = systray;
   ev.xclient.message_type =
      XInternAtom(dpy, "_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] = w;
   ev.xclient.data.l[3] = 0;
   ev.xclient.data.l[4] = 0;

   // TODO: trap errors?
   XSendEvent(dpy, systray, False, NoEventMask, &ev);
   XSync(dpy, False);

	setWindowIcon(QIcon("edit.png"));
	menu = new QMenu(this);
	menu->addAction("Test1");
	menu->addAction("Test2");
	menu->addAction("Test3");
	menu->addSeparator();
	menu->addAction("E&xit", (QObject*)mw, SLOT(close()));

	installed = true;
}

SciQX11TrayIcon::~SciQX11TrayIcon()
{

}

void SciQX11TrayIcon::paintEvent ( QPaintEvent * event )
{
	QPainter p(this);

	p.drawPixmap(0, 0, windowIcon().pixmap(22,22));
}

bool SciQX11TrayIcon::event(QEvent *e)
{
	switch(e->type()) {
		case QEvent::MouseButtonRelease:
			if(QMouseEvent *mevent = dynamic_cast<QMouseEvent *>(e)) {
				switch(mevent->button()) {
					case Qt::RightButton:
						//printf("YAY!\n");
						menu->popup(mevent->globalPos());
						e->accept();
						return true;

					case Qt::LeftButton:
						mw->setVisible(mw->isHidden());
						e->accept();
						return true;

					default:;
				}
			} // fall through

		default:
			return QX11EmbedWidget::event(e);
	}

	return WTF;
}