| 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;
}