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.
856 lines
24 KiB
856 lines
24 KiB
//
|
|
// File : libkvidockwidget.cpp
|
|
// Creation date : Tue Jan 02 20001 14:34:12 CEST by Szymon Stefanek
|
|
//
|
|
// This file is part of the KVirc irc client distribution
|
|
// Copyright (C) 2000-2001 Szymon Stefanek (pragma at kvirc dot net)
|
|
//
|
|
// This program is FREE software. You can redistribute it and/or
|
|
// modify it under the terms of the GNU General Public License
|
|
// as published by the Free Software Foundation; either version 2
|
|
// of the License, or (at your opinion) any later version.
|
|
//
|
|
// This program is distributed in the HOPE that it will be USEFUL,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
// See the GNU General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU General Public License
|
|
// along with this program. If not, write to the Free Software Foundation,
|
|
// Inc. ,51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
//
|
|
|
|
#include "kvi_settings.h"
|
|
#ifndef COMPILE_USE_QT4
|
|
|
|
#include "kvi_app.h"
|
|
#include "kvi_module.h"
|
|
#include "kvi_locale.h"
|
|
#include "kvi_memmove.h"
|
|
#include "kvi_taskbar.h"
|
|
#include "kvi_window.h"
|
|
#include "kvi_dynamictooltip.h"
|
|
#include "kvi_iconmanager.h"
|
|
#include "kvi_internalcmd.h"
|
|
#include "kvi_console.h"
|
|
#include "kvi_ircconnection.h"
|
|
#include "kvi_ircconnectionuserinfo.h"
|
|
#include "kvi_imagelib.h"
|
|
#include "kvi_options.h"
|
|
#include "kvi_ircview.h"
|
|
|
|
#include "libkvidockwidget.h"
|
|
#include "kvi_doublebuffer.h"
|
|
|
|
#ifdef COMPILE_KDE_SUPPORT
|
|
#include <twin.h>
|
|
#include <kpopupmenu.h>
|
|
#else
|
|
#include <tqlabel.h>
|
|
#endif
|
|
|
|
#include "kvi_tal_popupmenu.h"
|
|
|
|
|
|
#include <tqpixmap.h>
|
|
#include <tqpainter.h>
|
|
#include <tqtimer.h>
|
|
#include <tqevent.h>
|
|
#include <tqregexp.h>
|
|
|
|
#include <stdlib.h>
|
|
#include <time.h>
|
|
|
|
#ifdef COMPILE_ON_WINDOWS
|
|
#include <windows.h>
|
|
|
|
#include <tqbitmap.h>
|
|
#include <tqcursor.h>
|
|
|
|
#define ID_DOCKWIDGET_TASKBAR_ICON 0xdeadbeef
|
|
#define WM_KVIRC_NOTIFY_ICON_MESSAGE (WM_USER + 0xbeef)
|
|
|
|
static UINT WM_KVIRC_TASKBAR_CREATED = 0;
|
|
#else
|
|
#ifndef Q_OS_MACX
|
|
#include <X11/Xlib.h>
|
|
|
|
//const int XFocusOut = FocusOut;
|
|
const int XFocusIn = FocusIn;
|
|
#undef FocusOut
|
|
#undef FocusIn
|
|
#undef KeyPress
|
|
#undef KeyRelease
|
|
|
|
//#warning "Later remove this stuff and use a wrapper for #include <X11/Xlib.h>"
|
|
#ifdef Bool
|
|
#undef Bool
|
|
#endif
|
|
#endif
|
|
#endif
|
|
|
|
extern KVIRC_API KviPointerHashTable<const char *,KviWindow> * g_pGlobalWindowDict;
|
|
static KviPointerList<KviDockWidget> * g_pDockWidgetList = 0;
|
|
|
|
static TQPixmap * g_pDock1 = 0;
|
|
static TQPixmap * g_pDock2 = 0;
|
|
static TQPixmap * g_pDock3 = 0;
|
|
|
|
#ifdef COMPILE_ON_WINDOWS
|
|
static HICON g_pCurrentIcon = 0;
|
|
static TQPixmap * g_pCurrentPixmap = 0;
|
|
#endif
|
|
|
|
|
|
KviDockWidget::KviDockWidget(KviFrame * frm,const char * name)
|
|
: TQWidget(0,name)
|
|
{
|
|
m_iConsoles = 0;
|
|
m_iChannels = 0;
|
|
m_iQueries = 0;
|
|
m_iOther = 0;
|
|
|
|
m_pFlashingTimer = new TQTimer(this,"flashing_timer");
|
|
connect( m_pFlashingTimer, TQT_SIGNAL(timeout()), this, TQT_SLOT(flashingTimerShot()) );
|
|
m_bFlashed=0;
|
|
g_pDockWidgetList->append(this);
|
|
m_pFrm = frm;
|
|
m_pFrm->setDockExtension(this);
|
|
|
|
#ifdef COMPILE_ON_WINDOWS
|
|
// kode54
|
|
if(!WM_KVIRC_TASKBAR_CREATED)WM_KVIRC_TASKBAR_CREATED = RegisterWindowMessage(TEXT("TaskbarCreated"));
|
|
createTaskbarIcon();
|
|
#else //!COMPILE_ON_WINDOWS
|
|
setMinimumSize(22,22);
|
|
#ifndef COMPILE_USE_QT4
|
|
setBackgroundMode(X11ParentRelative);
|
|
#endif
|
|
#ifdef COMPILE_KDE_SUPPORT
|
|
KWin::setSystemTrayWindowFor(winId(),frm->winId());
|
|
#endif
|
|
#endif //!COMPILE_ON_WINDOWS
|
|
|
|
#ifdef COMPILE_USE_QT4
|
|
m_pSysTrayIcon = new TQSystemTrayIcon(m_pFrm);
|
|
#endif
|
|
|
|
m_pTip = new KviDynamicToolTip(this,"dock_tooltip");
|
|
connect(m_pTip,TQT_SIGNAL(tipRequest(KviDynamicToolTip *,const TQPoint &)),this,TQT_SLOT(tipRequest(KviDynamicToolTip *,const TQPoint &)));
|
|
|
|
m_pAwayPopup = new KviTalPopupMenu(this);
|
|
|
|
#ifdef COMPILE_KDE_SUPPORT
|
|
m_pContextPopup = new KPopupMenu(this);
|
|
m_pContextPopup->insertTitle(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_KVIRC)),__tr2qs("KVIrc"));
|
|
#else
|
|
m_pContextPopup = new KviTalPopupMenu(this);
|
|
#ifndef COMPILE_USE_QT4
|
|
TQLabel * l = new TQLabel(__tr2qs("KVIrc"),m_pContextPopup);
|
|
l->setFrameStyle(TQFrame::Raised | TQFrame::StyledPanel);
|
|
m_pContextPopup->insertItem(l);
|
|
#endif
|
|
#endif
|
|
m_pContextPopup->setCaption(__tr2qs("Context"));
|
|
m_iAwayMenuId = m_pContextPopup->insertItem ( __tr2qs("Away"), m_pAwayPopup);
|
|
m_pContextPopup->changeItem(m_iAwayMenuId,*(g_pIconManager->getSmallIcon(KVI_SMALLICON_AWAY)),__tr2qs("Away"));
|
|
|
|
int id = m_pContextPopup->insertItem(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_OPTIONS)),__tr2qs("&Configure KVIrc..."),m_pFrm,TQT_SLOT(executeInternalCommand(int)));
|
|
m_pContextPopup->setItemParameter(id,KVI_INTERNALCOMMAND_OPTIONS_DIALOG);
|
|
id = m_pContextPopup->insertItem(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_KVIRC)),__tr2qs("&About KVIrc"),m_pFrm,TQT_SLOT(executeInternalCommand(int)));
|
|
m_pContextPopup->setItemParameter(id,KVI_INTERNALCOMMAND_ABOUT_ABOUTKVIRC);
|
|
m_pContextPopup->insertSeparator();
|
|
m_iToggleFrame = m_pContextPopup->insertItem(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_RAW)),TQString(""),this,TQT_SLOT(toggleParentFrame()));
|
|
m_pContextPopup->insertSeparator();
|
|
id = m_pContextPopup->insertItem(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_DOCKWIDGET)),__tr2qs("Un&dock"),m_pFrm,TQT_SLOT(executeInternalCommand(int)));
|
|
m_pContextPopup->setItemParameter(id,KVI_INTERNALCOMMAND_DOCKWIDGET_HIDE);
|
|
id = m_pContextPopup->insertItem(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_TQUITAPP)),__tr2qs("&Quit"),g_pApp,TQT_SLOT(quit()));
|
|
m_pContextPopup->setAccel(__tr2qs("Ctrl+Q"),id);
|
|
connect(m_pContextPopup,TQT_SIGNAL(aboutToShow()),this,TQT_SLOT(fillContextPopup()));
|
|
}
|
|
|
|
|
|
KviDockWidget::~KviDockWidget()
|
|
{
|
|
#ifdef COMPILE_ON_WINDOWS
|
|
destroyTaskbarIcon();
|
|
#endif
|
|
m_pFrm->setDockExtension(0);
|
|
g_pDockWidgetList->removeRef(this);
|
|
}
|
|
|
|
void KviDockWidget::die()
|
|
{
|
|
delete this;
|
|
}
|
|
void KviDockWidget::flashingTimerShot()
|
|
{
|
|
m_bFlashed=!m_bFlashed;
|
|
#ifdef COMPILE_ON_WINDOWS
|
|
updateTaskbarIcon();
|
|
#else
|
|
update();
|
|
#endif
|
|
}
|
|
|
|
#ifdef COMPILE_ON_WINDOWS
|
|
void KviDockWidget::createTaskbarIcon()
|
|
{
|
|
ICONINFO inf;
|
|
g_pCurrentPixmap=new TQPixmap(*g_pDock1);
|
|
inf.hbmColor = g_pCurrentPixmap->hbm();
|
|
if(!g_pCurrentPixmap->mask())g_pCurrentPixmap->setMask(g_pCurrentPixmap->createHeuristicMask());
|
|
inf.hbmMask = g_pCurrentPixmap->mask()->hbm();
|
|
g_pCurrentIcon=CreateIconIndirect(&inf);
|
|
|
|
NOTIFYICONDATA nid;
|
|
nid.cbSize = sizeof(nid);
|
|
nid.hWnd = winId();
|
|
nid.uID = ID_DOCKWIDGET_TASKBAR_ICON;
|
|
nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
|
|
nid.uCallbackMessage = WM_KVIRC_NOTIFY_ICON_MESSAGE;
|
|
kvi_memmove(nid.szTip,"KVIrc",6);
|
|
nid.hIcon = g_pCurrentIcon;
|
|
Shell_NotifyIcon(NIM_ADD,&nid);
|
|
}
|
|
|
|
void KviDockWidget::destroyTaskbarIcon()
|
|
{
|
|
NOTIFYICONDATA nid;
|
|
nid.cbSize = sizeof(nid);
|
|
nid.hWnd = winId();
|
|
nid.uID = ID_DOCKWIDGET_TASKBAR_ICON;
|
|
nid.uFlags = 0;
|
|
Shell_NotifyIcon(NIM_DELETE,&nid);
|
|
}
|
|
|
|
void KviDockWidget::updateTaskbarIcon()
|
|
{
|
|
ICONINFO inf;
|
|
TQPixmap* pix = m_bFlashed ? g_pIconManager->getSmallIcon(KVI_SMALLICON_MESSAGE) : g_pCurrentPixmap;
|
|
inf.hbmColor = pix->hbm();
|
|
if(!pix->mask())pix->setMask(pix->createHeuristicMask());
|
|
inf.hbmMask = pix->mask()->hbm();
|
|
HICON hIcon=CreateIconIndirect(&inf);
|
|
|
|
NOTIFYICONDATA nid;
|
|
nid.cbSize = sizeof(nid);
|
|
nid.hWnd = winId();
|
|
nid.uID = ID_DOCKWIDGET_TASKBAR_ICON;
|
|
nid.uFlags = NIF_ICON;
|
|
nid.hIcon = hIcon;
|
|
Shell_NotifyIcon(NIM_MODIFY,&nid);
|
|
DestroyIcon(g_pCurrentIcon);
|
|
g_pCurrentIcon=hIcon;
|
|
}
|
|
|
|
bool KviDockWidget::winEvent(MSG * m)
|
|
{
|
|
if(m->message == WM_KVIRC_NOTIFY_ICON_MESSAGE)
|
|
{
|
|
if(m->wParam == ID_DOCKWIDGET_TASKBAR_ICON)
|
|
{
|
|
switch(m->lParam)
|
|
{
|
|
case WM_MOUSEMOVE:
|
|
tipRequest(m_pTip,TQCursor::pos());
|
|
break;
|
|
case WM_LBUTTONDOWN:
|
|
toggleParentFrame();
|
|
break;
|
|
case WM_RBUTTONDOWN:
|
|
m_pContextPopup->popup(TQCursor::pos());
|
|
break;
|
|
}
|
|
return true;
|
|
}
|
|
} else if(m->message == WM_KVIRC_TASKBAR_CREATED)
|
|
{
|
|
// kode54 : when the window shell dies and is restarted
|
|
// it sends the "TaskbarCreated" message to all the toplevel windows
|
|
// We recreate the taskbar icon then
|
|
createTaskbarIcon();
|
|
refresh();
|
|
}
|
|
return false;
|
|
}
|
|
|
|
#endif
|
|
|
|
#define NIDLEMSGS 18
|
|
|
|
static const char * idlemsgs[NIDLEMSGS]=
|
|
{
|
|
__tr("Nothing is happening...") ,
|
|
__tr("Just idling...") ,
|
|
__tr("Dum de dum de dum...") ,
|
|
__tr("Hey man... do something!") ,
|
|
__tr("Umpf!") ,
|
|
__tr("Silence speaking") ,
|
|
__tr("Are ya here?") ,
|
|
__tr("The world has stopped?") ,
|
|
__tr("Everything is all right") ,
|
|
__tr("idle()") ,
|
|
__tr("It's so cold here...") ,
|
|
__tr("Do not disturb... watching TV") ,
|
|
__tr("Just vegetating") ,
|
|
__tr("Hey... are ya sure that your network is up?") ,
|
|
__tr("Seems like the world has stopped spinning") ,
|
|
__tr("This silence is freaking me out!") ,
|
|
__tr("Mieeeeeowww!") ,
|
|
__tr("idle idle idle idle!")
|
|
};
|
|
|
|
#ifdef COMPILE_KDE_SUPPORT
|
|
extern Time qt_x_time;
|
|
#endif
|
|
|
|
void KviDockWidget::enterEvent( TQEvent* )
|
|
{
|
|
#ifdef COMPILE_KDE_SUPPORT
|
|
if(!g_pApp->focusWidget())
|
|
{
|
|
XEvent ev;
|
|
kvi_memset(&ev, 0, sizeof(ev));
|
|
ev.xfocus.display = qt_xdisplay();
|
|
ev.xfocus.type = XFocusIn;
|
|
ev.xfocus.window = winId();
|
|
ev.xfocus.mode = NotifyNormal;
|
|
ev.xfocus.detail = NotifyAncestor;
|
|
Time time = qt_x_time;
|
|
qt_x_time = 1;
|
|
g_pApp->x11ProcessEvent( &ev );
|
|
qt_x_time = time;
|
|
}
|
|
#endif
|
|
}
|
|
|
|
void KviDockWidget::tipRequest(KviDynamicToolTip *tip,const TQPoint &pnt)
|
|
{
|
|
TQString tmp;
|
|
|
|
KviTaskBarBase * t = m_pFrm->taskBar();
|
|
|
|
TQString line;
|
|
|
|
for(KviTaskBarItem * b = t->firstItem();b;b = t->nextItem())
|
|
{
|
|
|
|
if(b->kviWindow()->view())
|
|
{
|
|
if(b->kviWindow()->view()->haveUnreadedMessages())
|
|
{
|
|
line = b->kviWindow()->lastMessageText();
|
|
if(!line.isEmpty())
|
|
{
|
|
line.replace(TQChar('&'),"&");
|
|
line.replace(TQChar('<'),"<");
|
|
line.replace(TQChar('>'),">");
|
|
tmp += "<b>";
|
|
tmp += b->kviWindow()->plainTextCaption();
|
|
tmp += "</b><br>";
|
|
tmp += line;
|
|
tmp += "<br><br>\n";
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
srand(time(0));
|
|
|
|
// We use the bad way to generate random numbers :)))))
|
|
|
|
if(tmp.isEmpty())tmp = __tr2qs_no_xgettext(idlemsgs[(int)(rand() % NIDLEMSGS)]);
|
|
|
|
#ifdef COMPILE_ON_WINDOWS
|
|
|
|
#else
|
|
m_pTip->tip(rect(),tmp);
|
|
#endif
|
|
}
|
|
|
|
//int KviDockWidget::message(int,void *)
|
|
//{
|
|
// debug("Message");
|
|
// update();
|
|
// return 0;
|
|
//}
|
|
|
|
void KviDockWidget::mousePressEvent(TQMouseEvent *e)
|
|
{
|
|
if(e->button() & Qt::LeftButton)toggleParentFrame();
|
|
else if(e->button() & Qt::RightButton)
|
|
m_pContextPopup->popup(mapToGlobal(e->pos()));
|
|
}
|
|
|
|
void KviDockWidget::doAway(int id)
|
|
{
|
|
if(id<0)
|
|
{
|
|
KviPointerHashTableIterator<const char *,KviWindow> it(*g_pGlobalWindowDict);
|
|
while(KviWindow * wnd = it.current())
|
|
{
|
|
if(wnd->type()==KVI_WINDOW_TYPE_CONSOLE)
|
|
{
|
|
KviConsole* pConsole=(KviConsole*)wnd;
|
|
if(pConsole->isConnected())
|
|
if(id==-2)
|
|
pConsole->connection()->sendFmtData("AWAY");
|
|
else
|
|
pConsole->connection()->sendFmtData("AWAY :%s",
|
|
pConsole->connection()->encodeText(KVI_OPTION_STRING(KviOption_stringAwayMessage)).data()
|
|
);
|
|
}
|
|
++it;
|
|
}
|
|
} else {
|
|
KviConsole* pConsole=g_pApp->findConsole((unsigned int)id);
|
|
if(pConsole)
|
|
if(pConsole->isConnected())
|
|
if(pConsole->connection()->userInfo()->isAway())
|
|
pConsole->connection()->sendFmtData("AWAY");
|
|
else
|
|
pConsole->connection()->sendFmtData("AWAY :%s",
|
|
pConsole->connection()->encodeText(KVI_OPTION_STRING(KviOption_stringAwayMessage)).data()
|
|
);
|
|
}
|
|
}
|
|
|
|
void KviDockWidget::fillContextPopup()
|
|
{
|
|
m_pContextPopup->changeItem(m_iToggleFrame,m_pFrm->isVisible() ? __tr2qs("Hide Window") : __tr2qs("Show Window"));
|
|
if(g_pApp->topmostConnectedConsole())
|
|
{
|
|
m_pContextPopup->setItemVisible(m_iAwayMenuId,true);
|
|
m_pAwayPopup->clear();
|
|
|
|
int iAllAway=m_pAwayPopup->insertItem(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_CONSOLE)),__tr2qs("Away on all"),this,TQT_SLOT(doAway(int)));
|
|
m_pAwayPopup->setItemParameter(iAllAway,-1);
|
|
|
|
int iAllUnaway=m_pAwayPopup->insertItem(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_CONSOLE)),__tr2qs("Back on all"),this,TQT_SLOT(doAway(int)));
|
|
m_pAwayPopup->setItemParameter(iAllUnaway,-2);
|
|
|
|
int iSeparator=m_pAwayPopup->insertSeparator();
|
|
|
|
KviPointerHashTableIterator<const char *,KviWindow> it(*g_pGlobalWindowDict);
|
|
bool bAllAway=1;
|
|
bool bAllUnaway=1;
|
|
int iNetCount=0;
|
|
while(KviWindow * wnd = it.current())
|
|
{
|
|
if(wnd->type()==KVI_WINDOW_TYPE_CONSOLE)
|
|
{
|
|
KviConsole* pConsole=(KviConsole*)wnd;
|
|
if(pConsole->isConnected())
|
|
{
|
|
int id;
|
|
if(pConsole->connection()->userInfo()->isAway())
|
|
{
|
|
id=m_pAwayPopup->insertItem(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_CONSOLE)),__tr2qs("Back on %1").arg(pConsole->currentNetworkName()),this,TQT_SLOT(doAway(int)));
|
|
bAllUnaway=0;
|
|
} else {
|
|
id=m_pAwayPopup->insertItem(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_CONSOLE)),__tr2qs("Away on %1").arg(pConsole->currentNetworkName()),this,TQT_SLOT(doAway(int)));
|
|
bAllAway=0;
|
|
}
|
|
m_pAwayPopup->setItemParameter(id,pConsole->ircContextId());
|
|
iNetCount++;
|
|
}
|
|
}
|
|
++it;
|
|
}
|
|
if(iNetCount==1)
|
|
{
|
|
m_pAwayPopup->setItemVisible(iAllAway,false);
|
|
m_pAwayPopup->setItemVisible(iAllUnaway,false);
|
|
m_pAwayPopup->setItemVisible(iSeparator,false);
|
|
} else {
|
|
m_pAwayPopup->setItemVisible(iAllAway,!bAllAway);
|
|
m_pAwayPopup->setItemVisible(iAllUnaway,!bAllUnaway);
|
|
}
|
|
} else {
|
|
m_pContextPopup->setItemVisible(m_iAwayMenuId,false);
|
|
}
|
|
}
|
|
|
|
void KviDockWidget::toggleParentFrame()
|
|
{
|
|
TQWidget *top_widget = m_pFrm->topLevelWidget();
|
|
|
|
if(m_pFrm->isVisible()) {
|
|
m_pFrm->hide();
|
|
} else {
|
|
top_widget->show();
|
|
top_widget->raise();
|
|
top_widget->setActiveWindow();
|
|
if(g_pActiveWindow) g_pActiveWindow->setFocus();
|
|
if(m_pFrm->isMinimized())
|
|
m_pFrm->showNormal();
|
|
else
|
|
m_pFrm->show();
|
|
}
|
|
}
|
|
|
|
void KviDockWidget::refresh()
|
|
{
|
|
grabActivityInfo();
|
|
|
|
#ifdef COMPILE_ON_WINDOWS
|
|
// how to copy transparency????
|
|
delete g_pCurrentPixmap;
|
|
g_pCurrentPixmap=new TQPixmap(16,16);
|
|
bitBlt(g_pCurrentPixmap,0,0,m_iOther ? ((m_iOther == 2) ? g_pDock3 : g_pDock2) : g_pDock1,0,0,8,8,TQt::ClearROP);
|
|
bitBlt(g_pCurrentPixmap,0,8,m_iConsoles ? ((m_iConsoles == 2) ? g_pDock3 : g_pDock2) : g_pDock1,0,8,8,8,TQt::ClearROP);
|
|
bitBlt(g_pCurrentPixmap,8,0,m_iQueries ? ((m_iQueries == 2) ? g_pDock3 : g_pDock2) : g_pDock1,8,0,8,8,TQt::ClearROP);
|
|
bitBlt(g_pCurrentPixmap,8,8,m_iChannels ? ((m_iChannels == 2) ? g_pDock3 : g_pDock2) : g_pDock1,8,8,8,8,TQt::ClearROP);
|
|
#endif
|
|
|
|
if( (m_iChannels == 2) || (m_iQueries == 2) )
|
|
{
|
|
if(!m_pFlashingTimer->isActive() && KVI_OPTION_BOOL(KviOption_boolEnableTrayIconFlashing) ) m_pFlashingTimer->start(1000);
|
|
} else {
|
|
if(m_pFlashingTimer->isActive()) m_pFlashingTimer->stop();
|
|
m_bFlashed=false;
|
|
}
|
|
|
|
#ifdef COMPILE_ON_WINDOWS
|
|
updateTaskbarIcon();
|
|
#else
|
|
update();
|
|
#endif
|
|
}
|
|
|
|
void KviDockWidget::grabActivityInfo()
|
|
{
|
|
KviTaskBarBase * t = m_pFrm->taskBar();
|
|
|
|
if(KVI_OPTION_BOOL(KviOption_boolUseLevelBasedTrayNotification))
|
|
{
|
|
if(KVI_OPTION_UINT(KviOption_uintMinTrayLowLevelMessage)>5) KVI_OPTION_UINT(KviOption_uintMinTrayLowLevelMessage)=5;
|
|
if(KVI_OPTION_UINT(KviOption_uintMinTrayHighLevelMessage)>5) KVI_OPTION_UINT(KviOption_uintMinTrayHighLevelMessage)=5;
|
|
|
|
if(KVI_OPTION_UINT(KviOption_uintMinTrayLowLevelMessage)<1) KVI_OPTION_UINT(KviOption_uintMinTrayLowLevelMessage)=1;
|
|
if(KVI_OPTION_UINT(KviOption_uintMinTrayHighLevelMessage)<1) KVI_OPTION_UINT(KviOption_uintMinTrayHighLevelMessage)=1;
|
|
|
|
if(KVI_OPTION_UINT(KviOption_uintMinTrayHighLevelMessage)<KVI_OPTION_UINT(KviOption_uintMinTrayLowLevelMessage))
|
|
KVI_OPTION_UINT(KviOption_uintMinTrayHighLevelMessage)=KVI_OPTION_UINT(KviOption_uintMinTrayLowLevelMessage);
|
|
}
|
|
|
|
m_iConsoles = 0;
|
|
m_iChannels = 0;
|
|
m_iQueries = 0;
|
|
m_iOther = 0;
|
|
|
|
for(KviTaskBarItem * b = t->firstItem();b;b = t->nextItem())
|
|
{
|
|
if(KVI_OPTION_BOOL(KviOption_boolUseLevelBasedTrayNotification))
|
|
{
|
|
int iLevel = b->highlightLevel();
|
|
switch(b->kviWindow()->type())
|
|
{
|
|
case KVI_WINDOW_TYPE_CONSOLE:
|
|
if(m_iConsoles < iLevel) m_iConsoles = iLevel;
|
|
break;
|
|
case KVI_WINDOW_TYPE_CHANNEL:
|
|
if(m_iChannels < iLevel) m_iChannels = iLevel;
|
|
break;
|
|
case KVI_WINDOW_TYPE_TQUERY:
|
|
if(m_iQueries < iLevel) m_iQueries = iLevel;
|
|
break;
|
|
default:
|
|
if(m_iOther < iLevel) m_iOther = iLevel;
|
|
break;
|
|
}
|
|
} else {
|
|
int iLevel=0;
|
|
if(b->kviWindow()->view())
|
|
{
|
|
if(b->kviWindow()->view()->haveUnreadedHighlightedMessages())
|
|
{
|
|
iLevel=2;
|
|
} else if(b->kviWindow()->view()->haveUnreadedMessages())
|
|
{
|
|
iLevel=1;
|
|
}
|
|
if(iLevel>0)
|
|
switch(b->kviWindow()->type())
|
|
{
|
|
case KVI_WINDOW_TYPE_CONSOLE:
|
|
if(m_iConsoles < iLevel) m_iConsoles = iLevel;
|
|
break;
|
|
case KVI_WINDOW_TYPE_CHANNEL:
|
|
if(m_iChannels < iLevel) m_iChannels = iLevel;
|
|
break;
|
|
case KVI_WINDOW_TYPE_TQUERY:
|
|
if(m_iQueries < iLevel) m_iQueries = iLevel;
|
|
break;
|
|
default:
|
|
if(m_iOther < iLevel) m_iOther = iLevel;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if(KVI_OPTION_BOOL(KviOption_boolUseLevelBasedTrayNotification))
|
|
{
|
|
if(m_iConsoles >= KVI_OPTION_UINT(KviOption_uintMinTrayHighLevelMessage)) m_iConsoles=2;
|
|
else if(m_iConsoles >= KVI_OPTION_UINT(KviOption_uintMinTrayLowLevelMessage)) m_iConsoles=1;
|
|
else m_iConsoles=0;
|
|
|
|
if(m_iChannels >= KVI_OPTION_UINT(KviOption_uintMinTrayHighLevelMessage)) m_iChannels=2;
|
|
else if(m_iChannels >= KVI_OPTION_UINT(KviOption_uintMinTrayLowLevelMessage)) m_iChannels=1;
|
|
else m_iChannels=0;
|
|
|
|
if(m_iQueries >= KVI_OPTION_UINT(KviOption_uintMinTrayHighLevelMessage)) m_iQueries=2;
|
|
else if(m_iQueries >= KVI_OPTION_UINT(KviOption_uintMinTrayLowLevelMessage)) m_iQueries=1;
|
|
else m_iQueries=0;
|
|
|
|
if(m_iOther >= KVI_OPTION_UINT(KviOption_uintMinTrayHighLevelMessage)) m_iOther=2;
|
|
else if(m_iOther >= KVI_OPTION_UINT(KviOption_uintMinTrayLowLevelMessage)) m_iOther=1;
|
|
else m_iOther=0;
|
|
}
|
|
}
|
|
|
|
void KviDockWidget::paintEvent(TQPaintEvent * event)
|
|
{
|
|
#ifdef COMPILE_USE_QT4
|
|
TQPainter thisRestrictionOfTQt4IsNotNice(this);
|
|
if(m_bFlashed)
|
|
{
|
|
erase();
|
|
thisRestrictionOfTQt4IsNotNice.drawPixmap(4,4,16,16,*(g_pIconManager->getSmallIcon(KVI_SMALLICON_MESSAGE)),0,0,16,16);
|
|
} else {
|
|
thisRestrictionOfTQt4IsNotNice.drawPixmap(0,0,12,12,m_iOther ? ((m_iOther == 2) ? *g_pDock3 : *g_pDock2) : *g_pDock1,0,0,12,12);
|
|
thisRestrictionOfTQt4IsNotNice.drawPixmap(0,12,12,12,m_iConsoles ? ((m_iConsoles == 2) ? *g_pDock3 : *g_pDock2) : *g_pDock1,0,12,12,12);
|
|
thisRestrictionOfTQt4IsNotNice.drawPixmap(12,0,12,12,m_iQueries ? ((m_iQueries == 2) ? *g_pDock3 : *g_pDock2) : *g_pDock1,12,0,12,12);
|
|
thisRestrictionOfTQt4IsNotNice.drawPixmap(12,12,12,12,m_iChannels ? ((m_iChannels == 2) ? *g_pDock3 : *g_pDock2) : *g_pDock1,12,12,12,12);
|
|
}
|
|
#else
|
|
if(m_bFlashed)
|
|
{
|
|
erase();
|
|
bitBlt(this,4,4,g_pIconManager->getSmallIcon(KVI_SMALLICON_MESSAGE),0,0,16,16);
|
|
} else {
|
|
bitBlt(TQT_TQPAINTDEVICE(this),0,0,TQT_TQPAINTDEVICE(m_iOther ? ((m_iOther == 2) ? g_pDock3 : g_pDock2) : g_pDock1),0,0,12,12,TQt::CopyROP,false);
|
|
bitBlt(TQT_TQPAINTDEVICE(this),0,12,TQT_TQPAINTDEVICE(m_iConsoles ? ((m_iConsoles == 2) ? g_pDock3 : g_pDock2) : g_pDock1),0,12,12,12,TQt::CopyROP,false);
|
|
bitBlt(TQT_TQPAINTDEVICE(this),12,0,TQT_TQPAINTDEVICE(m_iQueries ? ((m_iQueries == 2) ? g_pDock3 : g_pDock2) : g_pDock1),12,0,12,12,TQt::CopyROP,false);
|
|
bitBlt(TQT_TQPAINTDEVICE(this),12,12,TQT_TQPAINTDEVICE(m_iChannels ? ((m_iChannels == 2) ? g_pDock3 : g_pDock2) : g_pDock1),12,12,12,12,TQt::CopyROP,false);
|
|
}
|
|
#endif
|
|
}
|
|
|
|
|
|
static KviDockWidget * dockwidget_find(KviFrame *f)
|
|
{
|
|
if(!g_pDockWidgetList)return 0;
|
|
for(KviDockWidget * w = g_pDockWidgetList->first();w;w = g_pDockWidgetList->next())
|
|
{
|
|
if(w->frame() == f)return w;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
/*
|
|
@doc: dockwidget.show
|
|
@type:
|
|
command
|
|
@title:
|
|
dockwidget.show
|
|
@short:
|
|
Shows the dock widget for the current frame window
|
|
@keyterms:
|
|
dock widget , system tray
|
|
@syntax:
|
|
dockwidget.show
|
|
@description:
|
|
Shows the dock widget for the current frame window.[br]
|
|
The dock widget is a small widget that docks in the KDE panel.[br]
|
|
It shows a small icon of the earth and eventually displays four squares
|
|
that cover this icon: the bottom left square appears when there is some new
|
|
text in any console window, the square becomes red if the text is highlighted.[br]
|
|
The bottom right square appears when there is some new text in any channel window,
|
|
and it becomes red when the text is highlighted.[br] The upper right square refers to
|
|
query windows and the upper left one to any other kind of window (dcc , links...).[br]
|
|
If you move the mouse over the dock widget a tooltip will show you the last lines
|
|
of the "new" text in all these windows.[br]
|
|
This is useful when you keep the main KVIrc window minimized and you're working on something else:
|
|
if the dock widget shows nothing but the earth icon , nothing is happening in the main KVIrc window.
|
|
If the dock widget shows one or more white (or red) squares , you can move the mouse over
|
|
and check what's happened exactly and eventually bring up the main KVIrc window by clicking on the widget.[br]
|
|
[big]tecnical details[/big]
|
|
The dock widget is currently working in KDE compilation mode only:
|
|
it relies on the KWin implementation of the Window Manager interaction protocol.
|
|
@seealso:
|
|
[cmd]dockwidget.hide[/cmd]
|
|
*/
|
|
|
|
static bool dockwidget_kvs_cmd_show(KviKvsModuleCommandCall * c)
|
|
{
|
|
if(!(dockwidget_find(c->window()->frame())))
|
|
{
|
|
KviDockWidget * w = new KviDockWidget(c->window()->frame(),"dock_widget");
|
|
#ifndef COMPILE_ON_WINDOWS
|
|
w->show();
|
|
#else
|
|
w->hide();
|
|
#endif
|
|
}
|
|
return true;
|
|
}
|
|
|
|
/*
|
|
@doc: dockwidget.hide
|
|
@type:
|
|
command
|
|
@title:
|
|
dockwidget.hide
|
|
@short:
|
|
Hides the dock widget for the current frame window
|
|
@syntax:
|
|
dockwidget.hide
|
|
@description:
|
|
Hides the dock widget for the current frame window
|
|
@seealso:
|
|
[cmd]dockwidget.show[/cmd]
|
|
*/
|
|
|
|
static bool dockwidget_kvs_cmd_hide(KviKvsModuleCommandCall * c)
|
|
{
|
|
KviDockWidget * w= dockwidget_find(c->window()->frame());
|
|
if(w)delete w;
|
|
// show the parent frame.. otherwise there will be no way to get it back
|
|
if(!c->window()->frame()->isVisible())
|
|
{
|
|
c->window()->frame()->show();
|
|
}
|
|
return true;
|
|
}
|
|
|
|
/*
|
|
@doc: dockwidget.hidewindow
|
|
@type:
|
|
command
|
|
@title:
|
|
dockwidget.hidewindow
|
|
@short:
|
|
Returns the state of the dock widget
|
|
@syntax:
|
|
dockwidget.hidewindow
|
|
@description:
|
|
Hides the window, assotiated with dockwidget
|
|
@seealso:
|
|
[cmd]dockwidget.show[/cmd], [cmd]dockwidget.hide[/cmd]
|
|
*/
|
|
|
|
static bool dockwidget_kvs_cmd_hidewindow(KviKvsModuleCommandCall * c)
|
|
{
|
|
KviDockWidget * w= dockwidget_find(c->window()->frame());
|
|
if(w)
|
|
{
|
|
w->setPrevWindowState(c->window()->frame()->windowState());
|
|
c->window()->frame()->hide();
|
|
}
|
|
return true;
|
|
}
|
|
|
|
/*
|
|
@doc: dockwidget.isVisible
|
|
@type:
|
|
function
|
|
@title:
|
|
$dockwidget.isVisible
|
|
@short:
|
|
Returns the state of the dock widget
|
|
@syntax:
|
|
$reguser.isVisible()
|
|
@description:
|
|
Returns 1 if the dock widget is actually visible , 0 otherwise.
|
|
@seealso:
|
|
[cmd]dockwidget.show[/cmd]
|
|
*/
|
|
|
|
static bool dockwidget_kvs_fnc_isvisible(KviKvsModuleFunctionCall * c)
|
|
{
|
|
c->returnValue()->setBoolean(dockwidget_find(c->window()->frame()));
|
|
return true;
|
|
}
|
|
|
|
|
|
|
|
// =======================================
|
|
// init routine
|
|
// =======================================
|
|
static bool dockwidget_module_init(KviModule * m)
|
|
{
|
|
KviStr buffer;
|
|
#ifdef COMPILE_ON_WINDOWS
|
|
g_pApp->findImage(buffer,"kvi_dock_win32.png");
|
|
KviImageLibrary l1(buffer.ptr(),16,16);
|
|
#else
|
|
g_pApp->findImage(buffer,"kvi_dock.png");
|
|
KviImageLibrary l1(buffer.ptr(),22,22);
|
|
#endif
|
|
g_pDock1 = new TQPixmap(l1.getImage(0));
|
|
g_pDock2 = new TQPixmap(l1.getImage(1));
|
|
g_pDock3 = new TQPixmap(l1.getImage(2));
|
|
|
|
#ifdef COMPILE_ON_WINDOWS
|
|
|
|
#endif
|
|
|
|
|
|
g_pDockWidgetList = new KviPointerList<KviDockWidget>;
|
|
g_pDockWidgetList->setAutoDelete(false);
|
|
|
|
|
|
KVSM_REGISTER_SIMPLE_COMMAND(m,"hide",dockwidget_kvs_cmd_hide);
|
|
KVSM_REGISTER_SIMPLE_COMMAND(m,"hidewindow",dockwidget_kvs_cmd_hidewindow);
|
|
KVSM_REGISTER_SIMPLE_COMMAND(m,"show",dockwidget_kvs_cmd_show);
|
|
KVSM_REGISTER_FUNCTION(m,"isVisible",dockwidget_kvs_fnc_isvisible);
|
|
|
|
return true;
|
|
}
|
|
|
|
static bool dockwidget_module_cleanup(KviModule *m)
|
|
{
|
|
while(g_pDockWidgetList->first())delete g_pDockWidgetList->first();
|
|
delete g_pDockWidgetList;
|
|
g_pDockWidgetList = 0;
|
|
|
|
#ifdef COMPILE_ON_WINDOWS
|
|
DestroyIcon(g_pCurrentIcon);
|
|
#endif
|
|
|
|
delete g_pDock1;
|
|
g_pDock1 = 0;
|
|
delete g_pDock2;
|
|
g_pDock2 = 0;
|
|
delete g_pDock3;
|
|
g_pDock3 = 0;
|
|
|
|
return true;
|
|
}
|
|
|
|
static bool dockwidget_module_can_unload(KviModule *)
|
|
{
|
|
return g_pDockWidgetList->isEmpty();
|
|
}
|
|
|
|
// =======================================
|
|
// plugin definition structure
|
|
// =======================================
|
|
KVIRC_MODULE(
|
|
"KVIrc dock widget implementation",
|
|
"1.0.0",
|
|
"Szymon Stefanek <pragma at kvirc dot net>" ,
|
|
"exports the /dockwidget.* interface\n",
|
|
dockwidget_module_init ,
|
|
dockwidget_module_can_unload,
|
|
0,
|
|
dockwidget_module_cleanup
|
|
)
|
|
|
|
#include "libkvidockwidget_qt3.moc"
|
|
|
|
#endif |