You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
qps-packaging/src/trayicon.cpp

241 lines
5.7 KiB

/*
really sucking codes.. sorry..
from psi , modified and cleand by fasthyun@magicn.com
trayicon_x11.cpp - X11 trayicon (for use with KDE and GNOME)
Copyright (C) 2003 Justin Karneges
GNOME2 Notification Area support: Tomasz Sterna
*/
#include <QApplication> // *****should be First!!!
#include "global.h" // Qps *qps;
#include "trayicon.h"
#include <QMouseEvent>
#include <QDesktopWidget>
#include <QPainter>
#include <QToolTip>
// QIcon icon = iconComboBox->itemIcon(index);
// trayIcon->setIcon(icon);
extern bool flag_session_start;
//----------------------------------------------------------------------------
// common stuff
//----------------------------------------------------------------------------
// for Gnome2 Notification Area
static int dock_xerror = 0;
extern bool flag_xcompmgr;
#define SYSTEM_TRAY_REQUEST_DOCK 0
#define SYSTEM_TRAY_BEGIN_MESSAGE 1
#define SYSTEM_TRAY_CANCEL_MESSAGE 2
TrayIcon::TrayIcon(const QPixmap &icon, const QString &tooltip, QMenu *popup,
QWidget *parent, const char *name)
: QSystemTrayIcon(0 /* shoud be NULL!! */), pop(popup), pm(icon),
tip(tooltip)
{
flag_show_tip = false;
flag_systray_ready = false;
inTray = false;
isWMDock = false;
QSystemTrayIcon::setIcon(icon);
QSystemTrayIcon::setContextMenu(popup);
if (!pm.width() || !pm.height())
pm = QPixmap(45, 45);
}
/*!
Removes the icon from the system tray and frees all allocated resources.
*/
TrayIcon::~TrayIcon() { sysRemove(); }
/*!
Sets the context menu to \a popup. The context menu will pop up when the
user clicks the system tray entry with the right mouse button.
*/
void TrayIcon::setPopup(QMenu *popup) { pop = popup; }
/*!
Returns the current popup menu.
*/
QMenu *TrayIcon::popup() const { return pop; }
QPixmap TrayIcon::icon() const { return pm; }
//----------------------------------------------------------------------------
// TrayIcon
//----------------------------------------------------------------------------
// DRAFT Code (by fasthyun@magicn.com)
void TrayIcon::init_TrayIconFreeDesktop() {}
void TrayIcon::init_WindowMakerDock() {}
void TrayIcon::sysInstall()
{
/// boolSysTray=hasSysTray();
if (hasSysTray() == true)
{
show();
}
/*
if(hasSysTray()==false)
{
setFixedSize(46,46); // setIconSize
init_WindowMakerDock();
setSysTray(true);
} */
}
bool TrayIcon::hasSysTray() { return QSystemTrayIcon::isSystemTrayAvailable(); }
void TrayIcon::sysRemove()
{
// printf("Qps: sysRemove\n");
inTray = false;
/// boolSysTray=isWMDock=false;
hide();
}
/*!
update systray icon
called by qps::refresh()
*/
void TrayIcon::setIcon(const QPixmap &pix)
{
QSystemTrayIcon::setIcon(pix);
if (isVisible() == false)
return;
pm = pix;
}
/*!
\property TrayIcon::toolTip
\brief the tooltip for the system tray entry
On some systems, the tooltip's length is limited and will be truncated as
necessary.
*/
void TrayIcon::setToolTip(const QString &tooltip)
{
if (pop->isVisible())
flag_show_tip = false;
if (flag_show_tip)
QToolTip::showText(tip_pos, tooltip);
else
QToolTip::hideText();
tip = tooltip;
}
void TrayIcon::leaveEvent(QEvent *) { flag_show_tip = false; }
void TrayIcon::mouseMoveEvent(QMouseEvent *e)
{
// printf("move\n");
// QToolTip::showText(QPoint(0,0),"" );
// QToolTip::showText(e->globalPos(),tip );
tip_pos = e->globalPos();
flag_show_tip = true;
QToolTip::showText(tip_pos, tip);
e->accept();
}
void TrayIcon::mousePressEvent(QMouseEvent *e)
{
// test_xapp();
// This is for X11, menus appear on mouse press
// I'm not sure whether Mac should be here or below.. Somebody check?
switch (e->button())
{
case Qt::RightButton:
if (pop)
{
pop->popup(e->globalPos());
e->accept();
}
break;
case Qt::LeftButton:
case Qt::MidButton:
// emit clicked( e->globalPos(), e->button() );
emit clicked(e->globalPos());
default:
break;
}
e->ignore();
}
void TrayIcon::mouseReleaseEvent(QMouseEvent *e)
{
// printf("mouseReleaseEvent\n");
switch (e->button())
{
case Qt::RightButton:
if (pop)
{
// Necessary to make keyboard focus
// and menu closing work on Windows.
// e->accept();
}
break;
case Qt::LeftButton:
case Qt::MidButton:
// emit clicked( e->globalPos(), e->button() );
// emit clicked( e->globalPos());
break;
default:
break;
}
e->ignore();
}
void TrayIcon::mouseDoubleClickEvent(QMouseEvent *e)
{
if (e->button() == Qt::LeftButton)
emit doubleClicked(e->globalPos());
e->accept();
}
// this will be called before shown !!
void TrayIcon::paintEvent(QPaintEvent *)
{
/*
//printf("paintEvent()\n");
QPainter p(this);
int w,h;
if(isVisible()==false) // ** important to prevent X11 Error !!
{
// printf("paintEvent(): hidden\n");
return;
}
w=width()/2 ;
h=height()/2;
p.drawPixmap(w - pm.width()/2, h - pm.height()/2, pm); */
}
// for session logout ?? never called
void TrayIcon::closeEvent(QCloseEvent *e)
{
printf("TrayIcon::closeEvent()\n");
e->accept();
}
// called after size changed
void TrayIcon::resizeEvent(QResizeEvent *e)
{
int w, h;
// printf("TrayIcon::resizeEvent(): w=%d,h=%d\n",width(),height());
// if(isVisible()==false) return; // X11 error !!
/// w=width();h=height();
if (isWMDock)
{
/// w=w-14;h=h-14;
}
// qps->setIconSize(w,h);
}
void QPS_SHOW();