diff options
author | Slávek Banko <slavek.banko@axis.cz> | 2015-10-01 17:05:29 +0200 |
---|---|---|
committer | Slávek Banko <slavek.banko@axis.cz> | 2015-10-01 17:05:29 +0200 |
commit | 39f2c6a84cd715b11fb3ffa82a86abf2fb9bcd70 (patch) | |
tree | d6bc97f38d36892b14703c788cef782f13ee2a4d /src/kooldock.cpp | |
download | kooldock-39f2c6a84cd715b11fb3ffa82a86abf2fb9bcd70.tar.gz kooldock-39f2c6a84cd715b11fb3ffa82a86abf2fb9bcd70.zip |
Initial import of kooldock 0.4.7
Signed-off-by: Slávek Banko <slavek.banko@axis.cz>
Diffstat (limited to 'src/kooldock.cpp')
-rw-r--r-- | src/kooldock.cpp | 3848 |
1 files changed, 3848 insertions, 0 deletions
diff --git a/src/kooldock.cpp b/src/kooldock.cpp new file mode 100644 index 0000000..58a0831 --- /dev/null +++ b/src/kooldock.cpp @@ -0,0 +1,3848 @@ +/************************************************************************** + kooldock.cpp - description + ------------------- + begin : Tue Jun 10 22:18:34 BST 2003 + copyright : (C) 2003 by KoolDock team + email : +***************************************************************************/ + +/*************************************************************************** + * * + * 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 option) any later version. * + * * +***************************************************************************/ + +#include <stdlib.h> +#include <math.h> + +#include <qpixmap.h> +#include <qimage.h> +#include <qpainter.h> +#include <qcursor.h> +#include <qdir.h> +#include <qstringlist.h> +#include <qvaluelist.h> +#include <qtooltip.h> +#include <qrect.h> +#include <qfile.h> +#include <qtextstream.h> +#include <qbrush.h> +#include <qpoint.h> +#include <qfont.h> +#include <qdatetime.h> + +#include <kwin.h> +#include <kprocess.h> +#include <netwm_def.h> +#include <kmessagebox.h> +#include <klocale.h> +#include <kcmdlineargs.h> +#include <krun.h> +#include <kurifilter.h> +#include <kpixmapio.h> +#include <kstandarddirs.h> +#include <kaboutapplication.h> +#include <qlistbox.h> +#include <keditlistbox.h> + +// for "renicing" the bar +#include <sys/time.h> +#include <sys/resource.h> + + +#include "kooldock.h" + +#include <kconfig.h> +#include <kdebug.h> +#include "setupdialogprg.h" + +// macros + +#define min(a, b) (a < b) ? (a) : (b) +#define max(a, b) (a > b) ? (a) : (b) + +// compiler issues +#if __GNUC__ == 2 && __GNUC_MINOR__ <= 95 +# define _GCC295 +#endif +#include <dcopclient.h> +#include <iostream> +#include <qdatastream.h> + +KoolDock::KoolDock(QWidget *parent, const char *name) : QWidget(parent, name, WStyle_Customize | WStyle_NoBorder | WNoAutoErase | WDestructiveClose | WStyle_StaysOnTop )//| WX11BypassWM) +{ + // Default configuration paths + progPath = locateLocal("data", "kooldock"); + menuPath = progPath + QString("/menu/"); + confFile = locateLocal("config", "kooldockrc"); + + noSet=false; + firstInit=true; + setupdlg = new SetupDialogPrg(); // create the setup dialog object. + + connect (setupdlg, SIGNAL(apply()), SLOT(chkRestart())); + perf = new QTime(); + + reloadIcons=TRUE; + + //Menu definitions + deskpopup=new KPopupMenu(); + appMenu=new KPopupMenu(); + godesk=new KPopupMenu; + tasklist=new KPopupMenu; + popup=new KPopupMenu; + advMenu=new KPopupMenu; + + connect(popup, SIGNAL(aboutToShow()), SLOT(aboutToShow())); + connect(popup, SIGNAL(aboutToHide()), SLOT(aboutToHide())); + connect(appMenu, SIGNAL(aboutToShow()), SLOT(aboutToShow())); + connect(appMenu, SIGNAL(aboutToHide()), SLOT(aboutToHide())); + connect(deskpopup, SIGNAL(aboutToShow()), SLOT(menuShow())); + connect(appMenu, SIGNAL(highlighted(int)), this, SLOT(menuX(int))); + connect(godesk, SIGNAL(activated(int)), this, SLOT(goToDesktop(int))); + connect(tasklist, SIGNAL(activated(int)), this, SLOT(goToWindow(int))); + connect(deskpopup, SIGNAL(activated(int)), this, SLOT(sendToDesktop(int))); + menuCount=0; + + init1(); + + QString welcomeMsg; + if (fFirstRun) + { + // Show welcome dialog. + welcomeMsg = QString("<center><B>Welcome</B></center>It appears to be the first time you run KoolDock.<br>" + "By default the dock is hidden at the botton of the screen, move your mouse" + " to the bottom edge of the screen and the dock will appear.<br>" + "Right click on the dock for a menu that allows you to configure it<br>" + "or run with <I>-o</I> parameter to have preferences window at start.<br>" + "We hope this software is usefull for you<br>-- The KoolDock Team"); + KMessageBox::information(0L, i18n(welcomeMsg)); + saveConf(); // create initial configuration. + } + + init2(); + firstInit=false; +} +KoolDock::~KoolDock() +{ + if (xosdw) delete(xosdw); + if (clipw) delete(clipw); + if (info) delete(info); + if (wm) delete(wm); + if (setupdlg) delete(setupdlg); + if (rootpix) delete(rootpix); + if (trackTimer) delete(trackTimer); + if (mTimer) delete(mTimer); + if (mkbigTimer) delete(mkbigTimer); + if (mksmallTimer) delete(mksmallTimer); + if (onChangeTimer) delete(onChangeTimer); + if (_filterData) delete(_filterData); +} + +void KoolDock::mTimerEnd() +{ + if (menuCount>0) return; + QPoint pointer; + pointer = QCursor::pos(); + lastXPos=pointer.x()-rx; + lastYPos=pointer.y()-ry; + int px,py,pw,ph,pt; + int mpx, mpy; + mpx=pointer.x(); + mpy=pointer.y(); + + if (fExpanded && !mksmallTimer->isActive()) {px=x1;} else {px=x0;} + if ((fOrientation & 2)==2) py=0; else py=dh-h; + pw=w; + ph=h; + if ((fOrientation & 1)==1) + { + pt=px;px=py;py=pt; + pt=pw;pw=ph;ph=pt; + pt=mpx;mpx=mpy;mpy=pt; + } + if (xinerama==1) px+=XinPreviousWidth; + + if (fHidden==1) + { + if (pointer.y() >= py && pointer.y() <= (py + ph) && pointer.x() >= px && pointer.x() <= (px + pw)) + { + mMoveEvent(pointer.x()-rx,pointer.y()-ry); + } + else + { + debug(QString("mTimer1Leave: %1 %2 %3 %4 %5 %6").arg(pointer.x()).arg(pointer.y()).arg(dh-h).arg(ry).arg(rx).arg(x+w)); + onleaveEvent(NULL); + } + } + else + { + if (pointer.y() >= py && pointer.y() <= (py + ph) && pointer.x() >= px && pointer.x() <= (px + pw)) + { + if (fExpanded && !mksmallTimer->isActive()) + { + mMoveEvent(pointer.x()-rx,pointer.y()-ry); + } + else + { + debug(QString("mTimer2EnterEv: %1 %2").arg(pointer.x()-rx).arg(pointer.y()-ry)); + if (mpx>=firstX && mpx<=firstX+tmpw) + { + enterEvent(NULL); + } + } + } + else + { + if (fExpanded) + { + debug(QString("mTimer2Leave")); + onleaveEvent(NULL); + } + } + } + if (fSteppy==1) if (!mkbigTimer->isActive() || !mksmallTimer->isActive()) mMoveEvent(pointer.x()-rx, pointer.y()-ry); +} + + +void KoolDock::trackTimerEnd() +{ + + QPoint pointer; + pointer = QCursor::pos(); + int px, py; + if ((fOrientation & 1) == 1) + { + px = pointer.y(); + py = pointer.x(); + } + else + { + py = pointer.y(); + px = pointer.x(); + } + if ((fOrientation & 2) == 2) py = dh-py; + if (py+2 >= dh && px > x0 && px < x0+w0) + { + if(track2active==FALSE) QTimer::singleShot( hideTimer, this, SLOT(trackTimer2End()) ); + track2active=true; + } +} + +void KoolDock::trackTimer2End() +{ + QPoint pointer; + pointer = QCursor::pos(); + int px, py; + if ((fOrientation & 1) == 1) + { + px = pointer.y(); + py = pointer.x(); + } + else + { + py = pointer.y(); + px = pointer.x(); + } + if ((fOrientation & 2) == 2) py = dh-py; + if (py+2 >= dh && px > x0 && px < x0+w0) + { + if(mksmallTimer->isActive()==TRUE) mksmallTimerstop(); + move( 0, rdh); + raise(); + trackTimer->stop(); + getBottomBG(); + if(h1 > h0) getTopBG(); + debug(QString("tracktimer: grabWindow(%1, %2, %3, %4)").arg(x1).arg(dh - h1).arg(w1).arg(h1)); + move2( x, dh - h); + resize2(w, h); + Ybase = iwBig2; + enterEvent(NULL); + } + track2active=FALSE; +} + +void KoolDock::paintEvent(QPaintEvent *) +{ + // Draw backgound, icons, and all that stuff over the widget. + QPainter p; + if (initialization && ptPart==5) return; + p.begin (&offscr,this); + + int i; + int ii; + + debug(QString("painting")); + + // draw background (new engine) + int bgY; + QImage TempBG; + QPixmap TempScaledLeft; + //QPixmap TempScaledCenter; + QPixmap TempScaledRight; + int p1,p2,p3,p4=0,p5=0,p6,p7,p8,p9,p10,pt; + if (w<dw) Offset=0; + if (fExpanded==FALSE) + { + bgY = 0; + } + else + { + bgY = h1 - h0 + Ybase; + } + lastX = cur_cx[items.count()-1] - iSize[items.count()-1]/2 + adjust; + lastX += iSize[items.count()-1]; + if (ii_first == 0) + { + firstX = cur_cx[0] - iSize[0]/2 - iSpace/2 + adjust+soffset-eoffset+x; + } + else + { + firstX = cur_cx[0] - iSize[0]/2 - iSpace/2 + SPACE_W+x; + } + lastX +=soffset; + tmpw=lastX+x-firstX+iSpace/2; + if (ii_last < (int)items.count()-1) + { + tmpw+=eoffset; + } + if (ii_first==ii_last && ii_first>0) tmpw-=adjust; + + p1=0; + p2=0; + KPixmapIO pixio; + if (!fLeftImg.isEmpty()) + { + TempBG = pixio.convertToImage(LeftImg); + if ((fOrientation & 1)==1) {p1=LeftImg.height();} else {p1=LeftImg.width();} + p2=h0; + if ((fOrientation & 1)==1) {pt=p1; p1=p2; p2=pt;} + if (scaleMax) + {TempScaledLeft = QPixmap(TempBG.scale(p1, p2, QImage::ScaleMin));} + else + {TempScaledLeft = QPixmap(TempBG.scale(p1, p2));} + p2=0; + if ((fOrientation & 1)==1) {p1=TempScaledLeft.height();} else {p1=TempScaledLeft.width();} + } + if (!fRightImg.isEmpty()) + { + TempBG = pixio.convertToImage(RightImg); + if ((fOrientation & 1)==1) {p2=RightImg.height();} else {p2=RightImg.width();} + p3=h0; + if ((fOrientation & 1)==1) {pt=p2; p2=p3; p3=pt;} + if (scaleMax) + {TempScaledRight = QPixmap(TempBG.scale(p2, p3, QImage::ScaleMin));} + else + {TempScaledRight = QPixmap(TempBG.scale(p2, p3));} + if ((fOrientation & 1)==1) {p2=TempScaledRight.height();} else {p2=TempScaledRight.width();} + } + if (oldtmpw<tmpw) + { + p10=oldfirstX-Offset-p1; + p8=oldtmpw+p1+p2; + } + else + { + p10=firstX-Offset-p1; + p8=tmpw+p1+p2; + } + + oldfirstX=firstX; + oldtmpw=tmpw; + + if (p10<0) p10=0; + if (p8+p10>dw) p8=dw-p10; + + p1=p10; + p2=0; + p3=p8; + p4=h1 - h0; + p5=p10; + p6=h1 - h0; + p7=p8; + p8=h0; + p9=p10; + p10=0; + if ((fOrientation & 2)==2) + { + p6=0; + p2=h0; + } + if ((fOrientation & 1)==1) + { + pt=p1; p1=p2; p2=pt; + pt=p3; p3=p4; p4=pt; + pt=p5; p5=p6; p6=pt; + pt=p7; p7=p8; p8=pt; + pt=p9; p9=p10; p10=pt; + } + if((h1 - h0)>0) bitBlt(&offscr, p1, p2, &topBg, p9, p10, p3, p4); // put the top background + bitBlt(&offscr, p5, p6, &bottomBg, p5, p6, p7, p8); //put the rest of the background + if (dockOpacity>0) + { + p1=firstX-Offset; + if ((fOrientation & 2)==2) {p2=0;} else {p2=h1 - h0+Ybase;} + p3=tmpw; + p4=h0-Ybase; + if (p4>0) + { + if ((fOrientation & 1)==1) + { + pt=p1; p1=p2; p2=pt; + pt=p3; p3=p4; p4=pt; + } + bitBlt(&offscr, p1, p2, &bottomBgf, p1, p2, p3, p4); + } + } + // end drawing background + +// Left side image + p1=0; + p5=0; + p6=0; + if (!fLeftImg.isEmpty()) + { + if ((fOrientation & 1)==1) {p1=TempScaledLeft.height();} else {p1=TempScaledLeft.width();} + + p4=firstX-Offset-p1; + if (fNWideBg) if (p4<0) p4=0; + p5=p4+p1; + if ((fOrientation & 2)==2) + {if (fExpanded==1) { + p2=-Ybase; + } else {p2=0;}} + else + if (fExpanded==1) {p2=bgY;} else {p2=h1-h0;} + if ((fOrientation & 1)==1) {pt=p4; p4=p2; p2=pt;} + bitBlt(&offscr, p4, p2, &TempScaledLeft); + } +// Right side image + if (!fRightImg.isEmpty()) + { + if ((fOrientation & 1)==1) {p1=TempScaledRight.height();} else {p1=TempScaledRight.width();} + + p2=firstX - Offset+tmpw; + if (fNWideBg) if (p2>dw-p1) p2=dw-p1; + p6=p2; + if ((fOrientation & 2)==2) + { + if (fExpanded==1) {p3=-Ybase;} else {p3=0;} + } + else + if (fExpanded==1) {p3=bgY;} else {p3=h1-h0;} + if ((fOrientation & 1)==1) {pt=p2; p2=p3; p3=pt;} + bitBlt(&offscr, p2, p3, &TempScaledRight); + } + + //Center image + if (!fCenterImg.isEmpty()) + { + TempBG = pixio.convertToImage(CenterImg); + // hack!! to optimize drawing speed, now it scales the background image only when it's + // necessary, I'd prefeer to use a bit more of memory instead of loosing speed. + // -- Matias + if ((fOrientation & 1)==1) {p1=TempScaledCenter.height();} else {p1=TempScaledCenter.width();} + if (p1 != (p6-p5)) + { + p2=p6-p5; + p3=h0; + if ((fOrientation & 1)==1) {pt=p2; p2=p3; p3=pt;} + TempScaledCenter = QPixmap(TempBG.scale( p2, p3)); + } + p1=p5; + if ((fOrientation & 2)==2) + {if (fExpanded) {p2=-Ybase;} else {p2=0;}} + else + {if (fExpanded==1) {p2=bgY;} else {p2=h1-h0;}} + if ((fOrientation & 1)==1) {pt=p1; p1=p2; p2=pt;} + bitBlt(&offscr, p1, p2, &TempScaledCenter); + } + +// End drawing the backgound + + + // draw borders + if (fShowBorders) + { + p1=firstX-Offset; + p3=SPACE_W; + p4=h0; + p5=tmpw; + p6=SPACE_W; + p7=tmpw - SPACE_W+firstX-Offset; + p2=h1 - h0+Ybase; + p8=p2; + p9=p1; + p10=p2; + if ((fOrientation & 2)==2) + { + p2=-Ybase; + p8=-Ybase; + p10=p4-Ybase-1; + } + if ((fOrientation & 1)==1) + { + pt=p1; p1=p2; p2=pt; + pt=p3; p3=p4; p4=pt; + pt=p5; p5=p6; p6=pt; + pt=p7; p7=p8; p8=pt; + pt=p9; p9=p10; p10=pt; + } + p.fillRect (QRect(p1, p2, p3, p4), QBrush(borderColor)); + p.fillRect (QRect(p9, p10, p5, p6), QBrush(borderColor)); + p.fillRect (QRect(p7, p8, p3, p4), QBrush(borderColor)); + } + // end drawing borders + + Item *item; + // new icon drawing engine + int Ypos; // Y position + int Xpos; // X position + KPixmap *currentIcon; // current icon pixmap + i=0; + for (i = 0; i < (int)items.count(); i++) + { + item = items.at(i); + // start setting the icon position + if(i < ii_first) + { + // left side icons + Xpos = cur_cx[i] - iwSmall/2 + SPACE_W-Offset; + } + else if(i >= ii_first && i <= ii_last) + { + // zoomed icons (center) + Xpos = cur_cx[i] - iSize[i]/2 + adjust - Offset+soffset-eoffset; + if (i==ii_first && i==(int)items.count()-1 && i>0) Xpos=cur_cx[i-1] + iwSmall/2 + SPACE_W-Offset + iSpace; + } + else if(i > ii_last) + { + // right side icons + Xpos = cur_cx[i] - iwSmall/2 + adjust + SPACE_W - 2 - Offset; + } // end getting icon positions + if ((fOrientation & 2)==2) + {Ypos = iy-Ybase;} + else + {Ypos = h1 - iy - iSize[i]+Ybase;} + + // now, get the icon image + if (Xpos<dw && Xpos+iwBig2>0) + { + currentIcon = new KPixmap(*item->getIcon(iSize[i])); + if (items.at(i)->wIcon==TRUE) + { + for (ii=0;ii<(int)witems.count();ii++) + { + if (items.at(i)->getId()==witems.at(ii)->getId()) + { + currentIcon = new KPixmap(*witems.at(ii)->getIcon(iSize[i])); + } + } + } + + // misc icon effects and animations + if (iOnClick == i) + { + // highlight the clicked icon + KPixmapEffect::fade(*currentIcon, ((float)50)*0.01, QColor("#FFFFFF")); + QTimer::singleShot( 10*60, this, SLOT( unhighlight() ) ); // unhighlight the icon in 1 second + } + + // notify animation + if (fShowNotification && item->isAnimed()) + { + KPixmapEffect::fade(*currentIcon, ((float) animValue )*0.01, QColor("#FFFFFF")); + } + + //Lets apply an effect to the active window in TaskBar + if(item->getId()==wm->activeWindow() && item->getId()!=0) + { + KPixmapEffect::fade(*currentIcon, ((float)60)*0.01, QColor("#FFFFFF")); + } + + // End drawing icon effects + Xpos+=x; + if ((fOrientation & 1)==1) {ii=Xpos;Xpos=Ypos;Ypos=ii;} + // Draw the icon on the widget in its respective position + bitBlt(&offscr, Xpos, Ypos, currentIcon); + // Destroy the unused currentIcon pixmap. + delete currentIcon; + } + } // End drawing icons + + // Draw the seperator between launcher and taskbar + if(fShowTaskbar && ((numLaunchers>0 && (int)items.count()>numLaunchers) || (fShowKMenu==1 && items.count()>1))) + { + i=numLaunchers-1; + if (i>=0 && i<(int)items.count()-1) + { + Xpos=xFromIndex(i)+xFromIndex(i+1)+iSize[i]; + p1=Xpos/2 - Offset+x; + p3=SPACE_W; + p4=h0; + if (fExpanded==0) + { + p2=h1-h0; + if ((fOrientation & 2)==2) p2=0; + } + else if ( (signed)items.count() > numLaunchers) + { + p2=h1 - h0 + Ybase; + if ((fOrientation & 2)==2) p2=-Ybase; + } + if ((fOrientation & 1)==1) + {p.fillRect (QRect(p2, p1, p4, p3), QBrush(sepColor));} + else + {p.fillRect (QRect(p1, p2, p3, p4), QBrush(sepColor));} + } + } + if((fSystray==1) && (numSystray>0)) + { + i=items.count()-numSystray-1; + if (i>=0 && i<(int)items.count()-1) + { + Xpos=xFromIndex(i)+xFromIndex(i+1)+iSize[i]; + p1=Xpos/2 - Offset+x; + p3=SPACE_W; + p4=h0; + if(h == h0) + { + p2=h; + if ((fOrientation & 2)==2) p2=0; + } + else + { + p2=h1 - h0 + Ybase; + if ((fOrientation & 2)==2) p2=-Ybase; + } + if ((fOrientation &1)==1) + {p.fillRect (QRect(p2, p1, p4, p3), QBrush(sepColor));} + else + {p.fillRect (QRect(p1, p2, p3, p4), QBrush(sepColor));} + } + } + p.end(); + + // Finally update the widget + if ((fOrientation & 1)==1) + {bitBlt(this, 0, 0, &offscr, 0, 0, h1, dh, Qt::CopyROP);} + else + {bitBlt(this, 0, 0, &offscr, 0, 0, dw, h1, Qt::CopyROP);} + + //return; + //Preparing mask + QBitmap bm(size(),true); + QPainter mp; + + mp.begin(&bm, this); + mp.setPen( Qt::black ); + mp.fillRect(rect(), Qt::black); + mp.fillRect(QRect(0, 0, 1, 1), Qt::white); + p1=0; + p2=0; + if (!fLeftImg.isEmpty()) + if ((fOrientation & 1)==1) {p1=TempScaledLeft.height();} else {p1=TempScaledLeft.width();} + if (!fRightImg.isEmpty()) + if ((fOrientation & 1)==1) {p2=TempScaledRight.height();} else {p2=TempScaledRight.width();} + p3=firstX-Offset-p1; + if ((fOrientation & 2)==2) {p4=0;} else {if (fExpanded) p4=0; else p4 = h1-h0;} + p5=tmpw+p1+p2; + if (fExpanded) p6=h1; else p6=h0; + if (p3<0) p3=0; + if (p5+p3>dw) p5=dw-p3; + if ((fOrientation & 1)==1) + {p6++;mp.fillRect(QRect(p4, p3, p6, p5), Qt::white);} + else + {mp.fillRect(QRect(p3, p4, p5, p6), Qt::white);} + if ((fOrientation & 2)==2) + {mp.fillRect(QRect(rw-1, rh-1, 1, 1), Qt::black);} + else + { + if ((fOrientation & 1)==1) + {mp.fillRect(QRect(0, rh-1, 1, 1), Qt::black);} + else + {mp.fillRect(QRect(rw-1, 0, 1, 1), Qt::black);} + } + if (initialization) + { + mp.fillRect(rect(), Qt::black); + mp.fillRect(QRect(0, 0, 1, 1), Qt::white); + } + mp.end(); + setMask(bm); + +} + + +void KoolDock::unhighlight() +{ + iOnClick = -1; + paintEvent(NULL);; +} + +void KoolDock::mousePressEvent( QMouseEvent *e) +{ + mPress (e->x(), e->y(), e->button()); +} + +void KoolDock::mPress(int mx, int my, ButtonState srcButton) +{ + int i, j; + int iClicked; + Item *item; + + if ((fOrientation & 1)==1) + { + i=mx; + mx=my; + my=i; + } + if ((fOrientation & 2)==2) + {my=h1-my;} + mx=mx-x1; + + mx = mx+Offset; + iClicked=itemFromPoint(mx); + + if (srcButton == Qt::LeftButton) + { + i=iClicked; + + if ((my >= h1 - iy - iSize[i]) && (my <= h1 - iy)) + { + if ((i >= 0) && (i < (int)items.count())) + { + items.at(i)->anim(FALSE); + WId id = items.at(i)->getId(); + if (id == 0) + { + // if user clicked on a quick launcher, launch the app + // acknowledge on click + iOnClick = i; + paintEvent(NULL); + + // run the app + debug(QString("clicked: %1").arg(items.at(i)->getName())); + if (items.at(i)->getName() == "KMenu") + { + // show K Menu + run(items.at(i)->getCommand()); + } + else + { + // run the application with KDE feedback (loading icon) + // we need to run the .desktop file, since the command + // may be a url or another KIO stuff like 'system:/' + if (items.at(i)->getFilename()!="") + { + run(items.at(i)->getFilename()); + } + else + { + run(items.at(i)->getCommand()); + } + } + } + else + { + KWin::WindowInfo info; + KWin::WindowInfo winfo; + info = KWin::windowInfo(id,0,NET::WM2WindowClass); + QString name = info.visibleName(); + QCString cls = info.windowClassClass(); + + if(i>=((int)items.count()-numSystray)) + { + //KWin::forceActiveWindow(id); + + KWin::deIconifyWindow(id); + kdDebug(0) << "Systray: " << id << " Name: " << name << " Estado: " << info.state() << endl; + //QMouseEvent me(e->type(), mapTo( topLevelWidget(), e->pos() ), e->globalPos(), e->button(), e->state() ); + + //QApplication::sendEvent(, &me); + } + else + { + // if user clicked on a running task's icon, activate it + cId = id; + + if (fGrouping) //switches between windows when clicking on window group icon + { + //find currently focused window in witems list + int jl=-1,il; + bool getNext=false; + for (j=0, item = witems.at(0); item; j++, item = witems.next()) + if (item->getId()==CurrentFocus) {jl=j;break;} + + if (jl>=0) + {if(witems.at(jl)->getClass()==cls) getNext=true;} + else + {getNext=true;} + + jl=-1; + if (getNext) + { + il=witems.count(); + for (j=0, item = witems.at(0); item; j++, item = witems.next()) + { + if (item->getIndex()<il) + { + if (item->getClass()==cls) + { + winfo = item->info; + if ((fMinimizedOnly==0 || winfo.isMinimized()) && (fCurrent==0 || winfo.isOnDesktop(KWin::currentDesktop()))) + {jl=j;il=item->getIndex();} + } + } + } + } + else + { + il=-1; + for (j=0, item = witems.at(0); item; j++, item = witems.next()) + { + if (item->getIndex()>il) + { + if (item->getClass()==cls) + { + winfo = item->info; + if ((fMinimizedOnly==0 || winfo.isMinimized()) && (fCurrent==0 || winfo.isOnDesktop(KWin::currentDesktop()))) + {jl=j;il=item->getIndex();} + } + } + } + } + if (jl>=0) cId=witems.at(jl)->getId(); + } + + if (cId!=CurrentFocus) + { + //KWin::activateWindow(id); + activateApp(); + } + else + { + minApp(); + //KWin::iconifyWindow(id, true); + CurrentFocus = winId(); + } + } + } + } + if(fHidden == 1 && fHideOnClick == 1) onleaveEvent(NULL); // it's configurable + } + } + else if(srcButton == Qt::RightButton) + { + // Right button. + i = iClicked; + advMenu->clear(); + advMenu->insertItem(SmallIconSet("up"), i18n("Keep &Above Others"), this, SLOT(toggleAlwaysOnTop()),0,1); + advMenu->insertItem(SmallIconSet("down"), i18n("Keep &Below Others"), this, SLOT(toggleKeptBelowOthers()),0,2); + advMenu->insertItem(SmallIconSet("window_fullscreen"), i18n("&Fullscreen"), this, SLOT(toggleFullScreen()),0,3); + + // Main KoolDock popup menu + popup->clear(); + popup->insertTitle(i18n("Main Menu")); + popup->insertItem(SmallIcon("configure"), i18n("Edit Quick Launch &Menu"), this, SLOT(edit())); + popup->insertItem(SmallIcon("pencil"), i18n("Edit &Preferences"), this, SLOT(editPref())); + popup->insertItem(SmallIcon("redo"), i18n("&Reload configuration"), this, SLOT(restart())); + popup->insertSeparator(); + popup->insertItem(SmallIcon("about_kde"), i18n("&About"), this, SLOT(about())); + popup->insertSeparator(); + popup->insertItem(SmallIcon("exit"), i18n("E&xit"), this, SLOT(endProg())); + // End Main KoolDock Menu + + if(fShowNav==1) + { + //Menu to be appended to MainMenu + godesk->clear(); + for(int index=0; index<KWin::numberOfDesktops(); index++) + { + QString tmp=i18n("Desktop &%1").arg(index+1); + int menustate=godesk->insertItem(SmallIcon("forward"), tmp, index+1); + if(KWin::currentDesktop()==(index+1)) godesk->setItemEnabled(menustate, false); + } + //End godesk Menu + + //Append Navigation Menu (godesk+Time) + QDateTime timeEntry=QDateTime::currentDateTime(); + QString tmp=i18n("Navigation: Desktop %1").arg(KWin::currentDesktop()); + popup->insertTitle(tmp); + popup->insertItem(SmallIcon("forward"), i18n("&Go to Desktop"), godesk); + popup->insertItem(SmallIcon("forward"), i18n("&Task List"), tasklist); + popup->insertSeparator(); + popup->insertItem(SmallIcon("clock"), timeEntry.toString()); + //End append Navigation Menu + } + + if ((my >= h1 - iy - iSize[i]) && (my <= h1 - iy)) + { + if ((i >= 0) && (i < (int)items.count())) + { + WId id = items.at(i)->getId(); + if (id == 0) + { + // if user right clicked on a quick launch icon. + if (items.at(i)->getCommand() != "") + { + // Edit the .desktop file + if (i==0 && fShowKMenu) + { + // if user right clicked on the K menu, show the configuration menu. + popup->exec(QCursor::pos()); + } + else + { + iGroup=false; + appMenu->clear(); + appMenu->insertTitle(i18n("Item menu")); + iFilename = items.at(i)->getFilename(); + appMenu->insertItem(SmallIcon("configure"), i18n("&Edit item"), this, SLOT(editItem())); + appMenu->insertItem(SmallIcon("fileclose"), i18n("&Delete item"), this, SLOT(removeItem())); + appMenu->insertSeparator(); + appMenu->insertItem(SmallIcon("forward"), "&KoolDock", popup); + appMenu->exec(QCursor::pos()); + } + } + } + else + { + // If user clicked on a running task icon, show the app menu. + // Pop-up menu for right-clicking on a taskbar icon. + cId = id; + KWin::WindowInfo winfo; + winfo = KWin::windowInfo(cId,0, NET::WM2WindowClass | NET::WM2AllowedActions); + int menustate; + //winfo.desktop() = -1 1 2 3 ... + + //Begin Move to Desktop Menu + deskpopup->clear(); + QString tmp=i18n("All desktops"); + menustate=deskpopup->insertItem(SmallIcon("forward"), tmp, 0); + tmp=i18n("Current Desktop &%1").arg(KWin::currentDesktop()); + menustate=deskpopup->insertItem(SmallIcon("forward"), tmp, KWin::currentDesktop()); + + deskpopup->insertSeparator(); + for(int i=0; i<KWin::numberOfDesktops(); i++) + { + if(winfo.isOnDesktop(KWin::currentDesktop()) && (i+1)==KWin::currentDesktop()) + { + continue; + } + else + { + if((i+1)!=KWin::currentDesktop()) + { + QString tmpd=i18n("Desktop &%1").arg(i+1); + menustate=deskpopup->insertItem(SmallIcon("forward"), tmpd, i+1); + } + } + } + dIndex=winfo.desktop(); + if(dIndex==-1) dIndex=0; + deskpopup->setItemChecked(dIndex, true); + + //End Move to Desktop Menu + + advMenu->setItemChecked(1,winfo.state() & NET::KeepAbove); + advMenu->setItemChecked(2,winfo.state() & NET::KeepBelow); + advMenu->setItemChecked(3,winfo.state() & NET::FullScreen); + advMenu->setItemEnabled(3,winfo.actionSupported(NET::ActionFullScreen)); + + appMenu->clear(); + if (fGrouping && items.at(iClicked)->getCount()>0) + { + iGroup=true; + QCString cls = winfo.windowClassClass(); + popups.clear(); + for (j=0, item = witems.at(0); item; j++, item = witems.next()) + { + if (item->getClass()==cls) + { + winfo = item->info; + if ((fMinimizedOnly==0 || winfo.isMinimized()) && (fCurrent==0 || winfo.isOnDesktop(KWin::currentDesktop()))) + { + KPopupMenu *tmpMenu = new KPopupMenu; + createMenu(item->getId(), tmpMenu, &winfo); + connect(tmpMenu, SIGNAL(aboutToShow()), SLOT(menuShow())); + popups.append (tmpMenu); + appMenu->setItemParameter(appMenu->insertItem(*item->getIcon(iwBig2), item->getName(), tmpMenu), item->getId()); + } + } + } + appMenu->insertSeparator(); + appMenu->insertItem(SmallIcon("forward"), "&Move to Desktop", deskpopup); + appMenu->insertItem(i18n("Mi&nimize all"), this, SLOT(minAllApps())); + appMenu->insertItem(i18n("Ma&ximize all"), this, SLOT(maxAllApps())); + appMenu->insertItem(i18n("&Restore all"), this, SLOT(restAllApps())); + appMenu->insertItem(SmallIcon("fileclose"), i18n("&Close all"), this, SLOT(closeAllApps())); + } + else + { + iGroup=false; + createMenu(cId, appMenu, &winfo); + } + appMenu->insertSeparator(); + appMenu->insertItem(SmallIcon("forward"), "KoolDock", popup); + appMenu->exec(QCursor::pos()); + iGroup=false; + } + } + } + else + { + // Show the configuration popup menu if the user clicked on another place. + popup->exec(QCursor::pos()); + } + deskpopup->clear(); + godesk->clear(); + //tasklist->clear(); + popup->clear(); + popups.clear(); + appMenu->clear(); + } + +} + +void KoolDock::mMoveEvent( int ex, int ey) +{ + if (!fExpanded) return; + unsigned int i; + int mx, my, dmx; + int dx; + unsigned int k; + int cur_cx_desk; + int p1=0,p2=0; + + if ((fOrientation & 1)==1) + { + mx=ex; + ex=ey; + ey=mx; + } + if ((fOrientation & 2)==2) + {ey=h1-ey;} + + if (w0>dw) + { + mx=w0*ex/dw; + } + else + { + mx = ex-x0; + } + dmx=abs(mx - last_mx); + last_mx = mx; + if (w1>dw) + { + Offset=(w1-dw)*mx/w0; + ex=ex+Offset; + } + else + { + Offset=0; + } + + if (fSteppy==1) last_ncx=mx=(int)(last_ncx*0.7+cx[(ex - x0 - iSpace)/iDist]*0.3); + + if (!mkbigTimer->isActive() && !mksmallTimer->isActive()) + { + Ybase=0; + } + if (dmx >= UPDATE_DIST && fExpanded || mkbigTimer->isActive() || mksmallTimer->isActive()) + { + ii_first = 0; + ii_last = items.count() - 1; + for (i = 0; i < items.count(); i++) + { + dx = abs(cx[i] - mx); + if (dx < funcW) + { + iSize[i] = func(dx); + } + else + { + iSize[i] = iwSmall; + if (cx[i] < mx) + { + ii_first = min(i + 1, items.count() - 1); + } + else if (ii_last == (int)items.count() - 1) + { + ii_last = max(i - 1, 0); + } + } + } + + cur_cx[0] = iSpace + iSize[0]/2; + + for(i=1; i < items.count() + 1; i++) + { + cur_cx[i] = cur_cx[i-1] + (iSize[i] + iSize[i-1])/2 + iSpace; + } + for(k=0; (k < items.count()-1) && (mx > cx[k]); k++); + + cur_cx_desk = ((int)((iwBig2 - iwSmall)*0.6*fAmount) + iSpace*2)/2 + cx[k] + (int)((cx[k] - mx)*(func(0) + func(iDist) - 2*iwSmall)/(2*iDist)); + adjust = cur_cx_desk - cur_cx[k]; + + if (w1<dw && (!mkbigTimer->isActive() || (zoomTicksB>1 && mkbigTimer->isActive()))) + { + if (!initialization && menuCount==0) + { + if (mx < 0) onleaveEvent(NULL); + if (lastX>0) if (mx > tmpw+firstX-x1-(w1-w0)/2) onleaveEvent(NULL); + } + } + if (ii_last < (int)items.count() - 1) + { + cur_cx[items.count() - 1] = w1*zoomVal/fzoomSpeed + (eoffset-soffset+(w1+w0)/2)*(fzoomSpeed-zoomVal)/(fzoomSpeed) - iwSmall/2 - iSpace - adjust; + for (i = items.count() - 2; (int)i >= ii_last + 1; i--) + { + cur_cx[i] = cur_cx[i+1] - iDist; + } + if (ii_last == 0) cur_cx[0] = cur_cx[1] - iDist - (iSize[0] - iSize[1])/2; + } + + for (i = 0; (int)i < ii_first; i++) + { + cur_cx[i]+=(int)((soffset-eoffset+(w1-w0)/2)*(fzoomSpeed-zoomVal)/fzoomSpeed); + } + paintEvent(NULL); + } + + /*if (mx<0) + { + ii_first = 0; + ii_last = items.count() - 1; +}*/ + my = ey; + mx = ex-x1; + + i=itemFromPoint(mx); + if ((int)i < numLaunchers) + { + mouseOnLauncher=true; + } + else + { + mouseOnLauncher=false; + } + + if(showNames == 1 && iwBig == iwBig2 && dmx<10 ) + { + // get the name of the item at the mouse position + if (!mksmallTimer->isActive() && !mkbigTimer->isActive()) + { + QPoint pointer; + pointer = QCursor::pos(); + if (i < MAX_ICONS+1) + { + if (((int)i >= 0) && (i < items.count())) + { + nom = items.at(i)->getName(); + } + else + {nom = "";} + } + + if(nom!=aux) + { + xosd_st=0; + } + if(xosd_st==0) + { + xosdw->setText(nom); + xosd_st=1; + } + aux = nom; + mx=mx-Offset; + if (fOrientation==0) + { + p1=mx+x1 - (xosdw->w/2); + p2=dh - h - xosdw->h; + } + if (fOrientation==1) + { + p1=dh-h1-xosdw->w; + p2=mx- xosdw->h/2+x1; + } + if (fOrientation==2) + { + p1=mx+x1 - (xosdw->w/2); + p2=h1; + } + if (fOrientation==3) + { + p1=h1; + p2=mx- xosdw->h/2+x1; + } + if ((fOrientation & 1)==0) + { + if (p1<0) p1=0; + if (p1+xosdw->w>dw) p1=dw-xosdw->w; + } + if (xinerama==1) p1+=XinPreviousWidth; + if (!initialization && (xosdw->pos().x()!=p1 || xosdw->pos().y()!=p2)) xosdw->move2(p1, p2); + } + } + if (dmx>=10) + { + xosdw->move2(0,rdh); + } + +} + +//Mouse Wheel now switches desktops (away from user desktop+1, towards user desktop-1) +//-Francisco +void KoolDock::wheelEvent(QWheelEvent *e) +{ + if(e->delta()==120 && (KWin::currentDesktop()<KWin::numberOfDesktops())) + { + KWin::setCurrentDesktop(KWin::currentDesktop()+1); + } + if((e->delta()==-120) && (KWin::currentDesktop()>0)) + { + KWin::setCurrentDesktop(KWin::currentDesktop()-1); + } +} + + +void KoolDock::mkbigTimerDo() +{ + int timing; + + zoomTicksB++; + iwBig = iwBig2*zoomVal/fzoomSpeed+iwSmall*(fzoomSpeed-zoomVal)/fzoomSpeed; // frames to grow up the dockbar + if (iwBig<iwSmall) iwBig=iwSmall; + zoomVal=zoomVal+zoomStepB; + + if (fzoomSpeed<=zoomVal) + { + zoomVal=fzoomSpeed; + iwBig = iwBig2; + mkbigTimer->stop(); + last_mx=-1; + debug(QString("Stopped mkbigTimer")); + if (zoomTicksB>=neededTicksB && fSpeed) + { + //performace check + timing =perf->elapsed(); + zoomStepB=zoomStepB*timing/fzoomSpeed; + if (zoomStepB<=0) zoomStepB=1; + if (zoomStepB>200) zoomStepB=200; + neededTicksB=(int)((fzoomSpeed/zoomStep)-1)*zoomStep/zoomStepB; + } + zoomTicksB=0; + zoomTicksS=0; + if (initialization) + { + pTest(); + } + else + { + if (fHidden==1) + {mTimer->start(fMouseTimer, FALSE);} + else + {mTimer->changeInterval(fMouseTimer);} + } + } + iy = (iDist - iwSmall) / 2; + funcH = iwBig - iwSmall; + if (fHidden == 1) Ybase = iwBig2*(fzoomSpeed-zoomVal)/fzoomSpeed; + mMoveEvent(QWidget::mapFromGlobal ( QCursor::pos() ).x(), QWidget::mapFromGlobal ( QCursor::pos() ).y()); + paintEvent(NULL); +} + +void KoolDock::mksmallTimerDo() +{ + zoomTicksS++; + iwBig = iwBig2*zoomVal/fzoomSpeed+iwSmall*(fzoomSpeed-zoomVal)/fzoomSpeed; + if (iwBig<iwSmall) iwBig=iwSmall; + if (0>zoomVal) + { + zoomVal=0; + mksmallTimerstop(); + } + else + { + if (fHidden == 1) Ybase = iwBig2*(fzoomSpeed-zoomVal)/fzoomSpeed; + funcH = iwBig - iwSmall; + iy = (iDist - iwSmall) / 2; + mMoveEvent(lastXPos,lastYPos); + paintEvent(NULL); + } + zoomVal=zoomVal-zoomStepS; +} + +void KoolDock::mksmallTimerstop() +{ + zoomVal=0; + if (fStayBelow==1 && fHidden==0) setDockBelow(); + int i; + mksmallTimer->stop(); + xosdw->move2(0,rdh); + fExpanded=FALSE; + debug(QString("Stopped mksmallTimer")); + if (!initialization) + {if (fHidden==0) {mTimer->changeInterval(250);} else {mTimer->stop();}} + + w = w0; + x = x0; + h = h0; + + // normalize the dock + for (i = 0; i < (int)items.count() + 1; i++) + { + iSize[i] = iwSmall; + cur_cx[i] = cx[i]; + } + + ii_first = 0; + ii_last = items.count() - 1; + ii_first = 0; + ii_last = items.count() - 1; + adjust = 0; + iwBig = iwBig2; + if (fHidden == 0) + { + move2( x, dh - h ); + resize2(w, h); + } + else + { + move( 0, rdh); + resize2(w, h); + } + oldfirstX=x; + oldtmpw=w; + paintEvent(NULL); + if (zoomTicksS>=neededTicksS && fSpeed) + { + //performace check + int timing =perf->elapsed(); + zoomStepS=zoomStepS*timing/fzoomSpeed; + if (zoomStepS<=0) zoomStepS=1; + if (zoomStepS>200) zoomStepS=200; + neededTicksS=(int)((fzoomSpeed/zoomStep)-1)*zoomStep/zoomStepS; + } + zoomTicksB=0; + zoomTicksS=0; + if (initialization) pTest(); +} + +void KoolDock::enterEvent(QEvent *) +{ + if (fExpanded==TRUE && !mksmallTimer->isActive() || mkbigTimer->isActive()) return; + if (fStayBelow==1 && fHidden==0) setDockAbove(); + if (mksmallTimer->isActive()==TRUE) mksmallTimer->stop(); + + w=w1; + x=x1; + h=h1; + + if (!fExpanded) + { + getTopBG(); + if (dockOpacity > 0) {bitBlt(&bottomBgf,0,0,&bottomBg);KPixmapEffect::fade(bottomBgf, ((float)dockOpacity)*0.01, bgColor);} + + adjust=x0-x1; + iwBig = iwSmall; + } + + resize2(w,h); + move2(x,dh-h); + + funcH = iwBig - iwSmall; + iy = (iDist - iwSmall) / 2; + + fExpanded=TRUE; + oldfirstX=x; + oldtmpw=w; + paintEvent(NULL); + debug("enterEvent"); + zoomTicksB=0; + zoomTicksS=0; + + perf->start(); + mkbigTimer->start(zoomStep, FALSE); +} + +void KoolDock::onleaveEvent(QEvent *) +{ + if (menuCount>0) return; + if (mksmallTimer->isActive()==TRUE) return; + zoomTicksB=0; + zoomTicksS=0; + perf->start(); + debug("onleaveEvent"); + lastXPos = QWidget::mapFromGlobal ( QCursor::pos() ).x(); + lastYPos = QWidget::mapFromGlobal ( QCursor::pos() ).y(); + if (mkbigTimer->isActive()) + { + mkbigTimer->stop(); + } + mksmallTimer->start(zoomStep, FALSE); + + if(showNames==1) + { + xosdw->move2(0,rdh); + xosd_st=0; + } + if(fHidden==1) + { + trackTimer->start(250, FALSE); + } +} + + +void KoolDock::edit() +{ + editPref(); + setupdlg->tabWidget->setCurrentPage(3); +} + + +void KoolDock::run(QString command) +{ + + QString exec; + + kapp->propagateSessionManager(); + + _filterData->setData( command.stripWhiteSpace() ); + QStringList filters; + filters << "kurisearchfilter" << "kshorturifilter"; + KURIFilter::self()->filterURI( *(_filterData), filters ); + + QString cmd = (_filterData->uri().isLocalFile() ? _filterData->uri().path():_filterData->uri().url()); + // Nothing interesting. Quit! + if(cmd.isEmpty()) + { + KMessageBox::sorry(0L, i18n("You have to enter a command to execute or a URL to be opened first.")); + return; + } + else + { + switch( _filterData->uriType() ) + { + case KURIFilterData::LOCAL_FILE: + case KURIFilterData::LOCAL_DIR: + case KURIFilterData::NET_PROTOCOL: + case KURIFilterData::HELP: + { + if (useList) + { + KApplication::startServiceByDesktopPath (command, lstDrop, &QString(0) ,&QCString(0) ,0 , "" ,true); + } + else + { + (void) new KRun( _filterData->uri() ); + } + return; + } + case KURIFilterData::EXECUTABLE: + case KURIFilterData::SHELL: + { + exec = cmd; + if( _filterData->hasArgsAndOptions() ) cmd += _filterData->argsAndOptions(); + break; + } + case KURIFilterData::UNKNOWN: + case KURIFilterData::ERROR: + default: + KMessageBox::sorry( 0, i18n("<qt>The program name or command <b>%1</b>\n" + "cannot be found. Please correct the command\n" + "or URL and try again</qt>").arg( cmd ) ); + return; + } + } + if(KRun::runCommand( cmd, exec, "" )) + { + return; + } + else + { + KMessageBox::sorry( 0, i18n("<qt>Could not run <b>%1</b>.\nPlease correct" + " the command or URL and try again.</qt>").arg( cmd ) ); + return; + } +} + + +// Parabolic function +int KoolDock::func(int x) +{ + int res = iwBig - (int)((x*x*funcH)/(funcW*funcW)); + return res; +} +int KoolDock::func2(int x) +{ + int res; + if (x<funcW) + {res = iwBig - (int)((x*x*funcH)/(funcW*funcW));} + else + {res=iwSmall;} + return res; +} + +//Here we add windows to the taskbar +void KoolDock::addWindows() +{ + // Show task bar + int index; + if(fShowTaskbar) + { + KWin::WindowInfo info; + QValueList<WId>::ConstIterator it; + int i; + Item *item; + + //First we removed every taskbar item + int count=items.count()-numSystray; + + for (i=0, item = witems.at(0); item; i++, item = witems.next()) + { + item->setCount(0); + } + for(i=count; i>=numLaunchers; i--) + { + items.remove(i); + } + + //Lets go through all the windows + if(firstTime) + { + for (it=wm->windows().begin(); it != wm->windows().end(); ++it) + { + addwTask(*it); + } + firstTime=false; + } + + for (i=0, item = witems.at(0); item; i++, item = witems.next()) + { + item->setId(item->getId()); + info=item->info; + index=info.desktop(); + //If it belongs to the current desktop, lets add it + if (info.valid()) + { + if(fCurrent==0 || index==KWin::currentDesktop() || index==-1) + { + addTask(item->getId(), i); + } + } + } + for (i=0, item = witems.at(0); item; i++, item = witems.next()) + if (!item->info.valid()) witems.remove(i); + doUpdateGeometry(); + } + CurrentFocus=wm->activeWindow(); + + updTaskList(); +} + +void KoolDock::workAreaChanged() +{ + int mdw,mdh,mdt; + if (xinerama==0) + { + mdw=QApplication::desktop()->width(); + mdh = QApplication::desktop()->height(); + } + else + { + mdw=leftRes; + mdh=XinDesiredHeight; + } + if ((fOrientation & 1)==1) + { + mdt=mdw;mdw=mdh;mdh=mdt; + } + if (dw!=mdw || dh!=mdh) reload(); +} + +//What happens when we change desktops +void KoolDock::currentDesktopChanged(int) +{ + if (initialization) return; + funcH = iwBig2 - iwSmall; + iwBig = iwBig2; + addWindows(); + doUpdateGeometry(); + move(0,rdh); + getTopBG(); + if (fExpanded) move2(x1,dh-h1); + if (fHidden==0 && !fExpanded) move2(x0,dh-h0); + xosdw->move2(0,rdh); + oldDesktop=KWin::currentDesktop(); +} + +void KoolDock::windowAdded(WId id) +{ + if (initialization) return; + if (fShowNav) + { + addToTaskList(id); + } + if (!fShowTaskbar) return; + KWin::WindowInfo info; + info = KWin::windowInfo(id); + QString name = info.name(); + if (name == "kooldock xosd window") + { + debug("Not adding OSD window to taskbar."); + return; + } + if (name == "kooldock") + { + debug("Not adding ourselves."); + return; + } + + debug(QString("windowAdded(%1)").arg(name)); + + if (addwTask(id)) addToTaskList(id); + addTask(id); + doUpdateGeometry(); + +} + +void KoolDock::windowRemoved(WId id) +{ + if (initialization) return; + if (fShowNav) + { + rmFromTaskList(id); + } + if (!fShowTaskbar) return; + unsigned int i; + Item *item; + debug(QString("windowRemoved(%1)").arg(id)); + + KWin::WindowInfo info; + info = KWin::windowInfo(id); + QString name = info.name(); + + if (name == "kooldock xosd window") + { + debug("Not removing OSD window from taskbar."); + return; + } + for (i=0; i < witems.count(); i++ ) + { + item = witems.at(i); + if(item->getId() == id) + { + rmTask(id,i); + rmwTask(i); + rmFromTaskList(id); + break; + } + } + doUpdateGeometry(); +} + +void KoolDock::windowChanged(WId id, unsigned int properties) +{ + if (initialization) return; + if (fShowNav) + { + rmFromTaskList(id); + addToTaskList(id); + } + if (!fShowTaskbar) return; + Item *item; + bool iconChanged, nameChanged; + int i; + bool toRepaint = FALSE; + bool hasfound=FALSE; + int iFound; + + KWin::WindowInfo winfo; + winfo = KWin::windowInfo(id); + + iconChanged = (properties & NET::WMIcon); + nameChanged = ((properties & NET::WMName) | (properties & NET::WMVisibleName)); + + properties = 0; + + if (id != winId() ) //not add kooldock window + { + if (ignored(winfo.name()) == false) + { + for (i=0, item = witems.at(0); item; i++, item = witems.next()) + { + //find item in witem (window item) list + if (item->getId()==id) + { + hasfound=true; //remember whether item was found, and its index + iFound=i; + + //Handle icon/name changes + if (iconChanged) {item->setIcon(KWin::icon(id, iwBig2, iwBig2, TRUE));toRepaint=true;} + // FIXME: on gcc2.95 item->setName() falls on a loop and gets a segfault. (?) +#ifndef _GCC295 + if (nameChanged) item->setName(winfo.name()); +#endif + if ((fShowNotification) && (id != wm->activeWindow())) + { + debug(QString("windowChanged (inactive window changed)")); + // An inactive window's title changed + // notify user + item->anim(TRUE); + if(onChangeTimer == NULL) + { + onChangeTimer = new QTimer(this); + connect( onChangeTimer, SIGNAL(timeout()), this, SLOT(onChangeTimerTicked())); + onChangeTimer->start( ON_CHANGE_ANIM_INTERVAL, FALSE ); + } + } + item->setId(id); + break; + } + } + //If window is on window list, and user haven't changed desktop recently... + if (hasfound && oldDesktop==KWin::currentDesktop()) + { + if (witems.at(iFound)->getCount()==0) //window icon is not visible on kooldock + { + //... check whether it can be added + if ((fCurrent==0 || winfo.isOnDesktop(KWin::currentDesktop())) && (fMinimizedOnly==0 || winfo.isMinimized())) {toRepaint|=addTask(id);} + } + else + { + //... check whether it can be removed + if ((fCurrent==1 && !winfo.isOnDesktop(KWin::currentDesktop())) || (fMinimizedOnly==1 && !winfo.isMinimized())) {toRepaint|=rmTask(id, iFound);} + } + rmFromTaskList(id); + addToTaskList(id); + } + if(toRepaint) {doUpdateGeometry();paintEvent(NULL);} + } + } +} + +void KoolDock::systemTrayWindowAdded(WId id) +{ + if (initialization) return; + if(fSystray==1) + { + KWin::WindowInfo info; + info = KWin::windowInfo(id); + QString name = info.visibleName(); + + if (ignored(info.name()) == false) + { + QPixmap pix = KWin::icon(id, iwBig2, iwBig2, TRUE); + numSystray++; + items.append(new Item(pix, id, name, iwSmall, iwBig2)); + debug(QString("addSystem Tray(%1)").arg(info.visibleName())); + doUpdateGeometry(); + } + } +} + +void KoolDock::systemTrayWindowRemoved(WId id) +{ + if (initialization) return; + if(fSystray==1) + { + numSystray--; + if(numSystray<0) numSystray=0; + windowRemoved(id); + } +} + +void KoolDock::activeWindowChanged(WId id) +{ + if (initialization) return; + if (id != winId()) CurrentFocus = id; + + // end notify animation + unsigned int i; + for (i=0; i<=items.count()-1; i++) + { + if (items.at(i)->getId() == id) + { + items.at(i)->anim(FALSE); + } + } + + bool toDelete = TRUE; + for (i=0; i<=items.count()-1; i++) + { + if (items.at(i)->isAnimed()) toDelete = FALSE; + } + + if (toDelete && onChangeTimer != NULL) + { + delete(onChangeTimer); + onChangeTimer = NULL; + debug("Deleted onChangeTimer"); + } + if (fGrouping) movetoback(id); + paintEvent(NULL); +} + +void KoolDock::doUpdateGeometry() +{ + int dw1, dw0; + unsigned int i; + iwBig=iwBig2; + for (i=0;i<items.count();i++) + { + cx[i] = iSpace + i*iDist + iwSmall/2; + iSize[i]=iwSmall; + if (!fExpanded) cur_cx[i]=cx[i]; + } + w0 = 2*iSpace + (items.count()-1)*iDist +iwSmall+soffset*2-eoffset*2; + w = w0; + w1 = w0 + (int)((iwBig - iwSmall)*0.6*fAmount) + iSpace*2; + x1 = (dw - w1) * fpercentPos / 100; + if (w1>dw) {x1=0;} + if (w1>dw) {dw1=dw;} else {dw1=w1;} + if (w0>dw) {dw0=dw;} else {dw0=w0;} + x0 = (dw1 - dw0)/2 + x1; + //x0 = (dw - w0) * fpercentPos / 100; + //if(xinerama==1) {if (fOrientation && 1)==0) {x0=x0+XinPreviousWidth; x1=x1+XinPreviousWidth;}} + x = x0; + h0 = 2*iy + iwSmall; + h = h0; + h1 = 2*iy + iwBig; + + adjust = 0; + + if(fHidden == 0) + { + resize2(w, h); + move2( x, dh - h ); + } + + //if ((fOrientation & 1)==1) {offscr = QPixmap(h1, w1);} else {offscr = QPixmap(w1, h1);} + + ii_first = 0; + ii_last = items.count() - 1; + ii_first = 0; + ii_last = ii_last; + + if (fExpanded==TRUE) + { + w=w1; + h=h1; + x=x1; + funcH = iwBig2 - iwSmall; + iy = (iDist - iwSmall) / 2; + if(fHidden==1) + { + move(0,rdh); + getBottomBG(); + getTopBG(); + //move(rx,ry); + } + resize2(w, h); + move2( x, dh - h ); + } + else if (fHidden==1) + { + move(0,rdh); + } + debug(QString("w1: %1").arg(w1)); + debug(QString("x1: %1").arg(x1)); + if (fExpanded) {last_mx=-10; mMoveEvent(lastXPos,lastYPos);} + oldfirstX=x; + oldtmpw=w; + paintEvent(NULL); + xosdw->move2(0,rdh); + +} + +bool KoolDock::rmTask(WId id, int iFound) +{ + Item *item, *witem, *fitem; + int i, j; + int miFound; + bool hasfound; + hasfound=false; + miFound=iFound; + QCString cls; + + if (miFound==-1) + { + for (i=0, item = witems.at(0); item; i++, item = witems.next()) + { + if (item->getId()==id) + {hasfound=true;miFound=i;break;} + } + } + else + { + hasfound=true; + } + if (hasfound) + { + fitem=witems.at(miFound); + if (fitem->getId()==id) + { + if (fitem->getCount()==1) + { + cls=fitem->getClass(); + //Removing item + for (i=numLaunchers, item = items.at(numLaunchers); item; i++, item = items.next()) + { + if (fGrouping) + { + if (cls==item->getClass()) + { + int cnt=item->getCount(); + //KMessageBox::information(0,QString("%1").arg(cnt)); + fitem->setCount(0); + if (cnt==0) + { + items.remove(i); + return true; + } + else + { + int ir, il=-1, im=-1; + int jl=-1,jm=-1; + ir=fitem->getIndex(); + for (j=0, witem = witems.at(0); witem; j++, witem = witems.next()) + { + if (witem->getClass()==cls) + { + if (witem->getIndex()<ir && witem->getIndex()>il) + {il=witem->getIndex(); jl=witem->getId();} + if (witem->getIndex()>im) + {im=witem->getIndex(); jm=witem->getId();} + } + } + item->setCount(cnt-1); + if (jl>=0) {item->setId(jl);return true;} + if (jm>=0) {item->setId(jm);} + return true; + } + } + } + else + { + if (item->getId()==id) + { + items.remove(i); + witems.at(miFound)->setCount(0); + return true; + } + } + } + } + } + } + return false; +} + +void KoolDock::rmwTask(int iFound) +{ + int i, ind; + Item *item; + + ind=witems.at(iFound)->getIndex(); + for (i=0, item = witems.at(0); item; i++, item = witems.next()) + { + if (item->getIndex()>ind) item->setIndex(item->getIndex()-1); + } + witems.remove(iFound); +} + +bool KoolDock::addTask(WId id, int iFound) +{ + Item *item; + int i ; + int miFound; + bool hasfound; + hasfound=false; + miFound=iFound; + + KWin::WindowInfo info; + info = KWin::windowInfo(id,0,NET::WM2WindowClass); + const int SUPPORTED_WINDOW_TYPES = NET::NormalMask | NET::DesktopMask | NET::DockMask | NET::ToolbarMask | NET::MenuMask | NET::DialogMask | NET::OverrideMask | NET::TopMenuMask | NET::UtilityMask | NET::SplashMask; + QString name = info.visibleName(); + QCString cls = info.windowClassClass(); + if (info.windowType(SUPPORTED_WINDOW_TYPES) == NET::Normal || info.windowType(SUPPORTED_WINDOW_TYPES) == NET::Override || info.windowType(SUPPORTED_WINDOW_TYPES) == NET::Dialog || info.windowType(SUPPORTED_WINDOW_TYPES) == NET::Unknown) + { + if (info.isMinimized() || fMinimizedOnly==0) + if (fCurrent==0 || info.isOnDesktop(KWin::currentDesktop())) + if ((info.state() & NET::SkipTaskbar) == 0) + if (ignored(info.name()) == false) + { + if (miFound==-1) + { + for (i=0, item = witems.at(0); item; i++, item = witems.next()) + { + if (item->getId()==id) + {hasfound=true;miFound=i;break;} + } + } + else + { + hasfound=true; + } + + if (hasfound) + { + if (witems.at(miFound)->getId()==id) + { + if (witems.at(miFound)->getCount()==0) + { + witems.at(miFound)->setCount(1); + if (fGrouping) + { + hasfound=false; + for (i=numLaunchers, item = items.at(numLaunchers); item; i++, item = items.next()) + { + if (item->getClass()==cls) + { + item->setCount(item->getCount()+1); + return true; + } + } + } + QPixmap pix; + items.insert(items.count()-numSystray, new Item(pix, id, name, iwSmall, iwBig2, TRUE)); + items.at(items.count()-1)->setClass(cls); + debug(QString("addTask(%1)").arg(info.visibleName())); + return true; + } + } + } + } + } + return false; +} + +bool KoolDock::addwTask(WId id) +{ + KWin::WindowInfo info; + info = KWin::windowInfo(id,0,NET::WM2WindowClass); + const int SUPPORTED_WINDOW_TYPES = NET::NormalMask | NET::DesktopMask | NET::DockMask | NET::ToolbarMask | NET::MenuMask | NET::DialogMask | NET::OverrideMask | NET::TopMenuMask | NET::UtilityMask | NET::SplashMask; + QString name = info.visibleName(); + QCString cls = info.windowClassClass(); + + if (info.windowType(SUPPORTED_WINDOW_TYPES) == NET::Normal || info.windowType(SUPPORTED_WINDOW_TYPES) == NET::Override || info.windowType(SUPPORTED_WINDOW_TYPES) == NET::Dialog || info.windowType(SUPPORTED_WINDOW_TYPES) == NET::Unknown) + { + if ((info.state() & NET::SkipTaskbar) == 0) + { + if (ignored(info.name()) == false) + { + QPixmap pix = KWin::icon(id, iwBig2, iwBig2, TRUE); + witems.append(new Item(pix, id, name, iwSmall, iwBig2)); + witems.at(witems.count()-1)->setClass(cls); + witems.at(witems.count()-1)->setIndex(witems.count()-1); + return true; + } + } + } + return false; +} + +void KoolDock::loadConf() +{ + KConfig *config = KGlobal::config(); + + config->setGroup("kooldock"); + fShowTaskbar = config->readNumEntry("ShowTaskbar", 0); + fMinimizedOnly = config->readNumEntry("MinimizedOnly", 0); + fShowNotification = config->readNumEntry("ShowNotification", 0); + showNames = config->readNumEntry("showNames", 1); + fCleaner = config->readNumEntry("Cleaner", 0); + xosdFont = config->readEntry("xosdFont", "Tahoma"); + xosdColor = config->readEntry("xosdColor", "#f1f1f1"); + xosdShadowColor = config->readEntry("xosdShadowColor", "#000000"); + xosdSize = config->readNumEntry("xosdSize", 17); + xosdShadowOffset = config->readNumEntry("xosdShadowOffset", 2); + fShowBorders = config->readNumEntry("ShowBorders", 0); + borderColor = QColor(config->readEntry("BorderColor", "#b1c4de")); + iwSmall = config->readNumEntry("SmallIconSize", 32); + iwBig = config->readNumEntry("BigIconSize", 90); + fAmount = config->readNumEntry("BigIconAmount", 5); + if (fAmount>10) fAmount=10; + if (fAmount<4) fAmount=4; + fShowKMenu = config->readNumEntry("ShowKMenu", 0); + fUseKBFX = config->readNumEntry("KBFX", 0); + dockOpacity = config->readNumEntry("DockOpacity", 0); + iSpace = config->readNumEntry("iSpace", 10); + if (dockOpacity < 0) + { + dockOpacity = 0; + } + else if (dockOpacity > 100) + { + dockOpacity = 100; + } + bgColor = QColor(config->readEntry("BackgroundColor", "#ccccff")); + sepColor = QColor(config->readEntry("SeparatorColor", "#000000")); + fPriority = config->readNumEntry("Priority", 3); + fMouseTimer = config->readNumEntry("MouseTimer", 25); + fClipping = config->readNumEntry("Clipping", 0); + fClipIcons = config->readNumEntry("ClipIconArea", 0); + fpercentPos = config->readNumEntry("percentPos", 50); + fOrientation = config->readNumEntry("fOrientation", 0); + if (fOrientation<0 || fOrientation>3) fOrientation=0; + fzoomSpeed = config->readNumEntry("zoomSpeed", 20); + fSpeed = config->readNumEntry("speedControl", 0)==1; + //fSpeed=true; + if (fzoomSpeed>10) + { + if (fzoomSpeed>100) + {zoomStep=10;} + else + {zoomStep=fzoomSpeed/10;} + } + else + {zoomStep=1;} + if (fSpeed) + { + zoomStepB=200; + zoomStepS=200; + neededTicksB=1; + neededTicksS=1; + } + else + { + zoomStepB=zoomStep; + zoomStepS=zoomStep; + neededTicksB=(int)(fzoomSpeed/zoomStep)-1; + neededTicksS=(int)(fzoomSpeed/zoomStep)-1; + } + + if (neededTicksB==0) neededTicksB=1; + if (neededTicksS==0) neededTicksS=1; + + if (fpercentPos<0) fpercentPos=0; + if (fpercentPos>100) fpercentPos=100; + fHidden = config->readNumEntry("Hidden", 1); + fHighLightTime = config->readNumEntry("HighLightTime", 2); + fHideOnClick = config->readNumEntry("HideOnClick", 0); + fStayBelow = config->readNumEntry("StayBelow", 0); + fSteppy = config->readNumEntry("fSteppy", 0); + fLeftImg = config->readEntry("LeftImg"); + fRightImg = config->readEntry("RightImg"); + fCenterImg = config->readEntry("CenterImg"); + fNWideBg = config->readBoolEntry("nWideBg", TRUE); + scaleMax = config->readBoolEntry("scaleMax", FALSE); + fFirstRun = config->readBoolEntry("FirstRun", TRUE); + xinerama = config->readNumEntry("Xinerama", 0); + leftRes=config->readNumEntry("leftRes", QApplication::desktop()->width()); + XinDesiredHeight=config->readNumEntry("XinDesiredHeight", QApplication::desktop()->height()); + XinPreviousWidth=config->readNumEntry("XinPreviousWidth", 0); + hideTimer = config->readNumEntry("hideTimer", 125); + Solid = config->readNumEntry("Solid", 1); + fShowShot = config->readBoolEntry("ShowSShot", false); + fGrouping = config->readBoolEntry("iconGrouping", false); + fShowNav=config->readNumEntry("Navigator", 1); + fSystray=0;//config->readNumEntry("Systray", 0); + fCurrent=config->readNumEntry("currentDesktop", 0); + curTheme=config->readEntry("Theme"); + + if(config->readNumEntry("xosdBold", 1) == 0) + { + xosdBold = false; + } + else + { + xosdBold = true; + } + + if(config->readNumEntry("xosdItalic", 1) == 0) + { + xosdItalic = false; + } + else + { + xosdItalic = true; + } + + if (iwSmall > iwBig) + { + iwSmall = 32; + iwBig = 90; + } + if (!fShowTaskbar) + { + fShowNotification = 0; + } + if (fHidden!=1 && fHidden!=0) fHidden = 1; + if (fStayBelow!=1 && fStayBelow!=0) fStayBelow = 0; +} + + +void KoolDock::loadIgnore() +{ + QString line; + + // read the ignorelist into 'ignoreList' + QFile in(QString(progPath + "/ignorelist.conf")); + + //clear de ignoreList and the KEditListBox (ignoreBox) + ignoreList.clear(); + setupdlg->ignoreBox->clear(); + if (in.open(IO_ReadOnly)) + { + while (in.readLine(line, MAX_LEN) != -1) + { + //append the item and strip the last char (new line) + ignoreList.append(line.mid(0, line.length()-1)); + } + in.close(); + if(!ignoreList.isEmpty()) setupdlg->ignoreBox->insertStringList(ignoreList); + } +} + + +void KoolDock::saveConf() +{ + KConfig *config = KGlobal::config(); + + config->setGroup("kooldock"); + config->writeEntry("ShowTaskbar", fShowTaskbar); + config->writeEntry("MinimizedOnly", fMinimizedOnly); + config->writeEntry("ShowNotification", fShowNotification); + config->writeEntry("ShowBorders", fShowBorders); + config->writeEntry("BorderColor", borderColor.name()); + config->writeEntry("SmallIconSize", iwSmall); + config->writeEntry("BigIconSize", iwBig2); + config->writeEntry("BigIconAmount", fAmount); + config->writeEntry("DockOpacity", dockOpacity); + config->writeEntry("BackgroundColor", bgColor.name()); + config->writeEntry("SeparatorColor", sepColor.name()); + config->writeEntry("ShowKMenu", fShowKMenu); + config->writeEntry("KBFX", fUseKBFX); + config->writeEntry("Priority", fPriority); + config->writeEntry("MouseTimer", fMouseTimer); + config->writeEntry("Clipping", fClipping); + config->writeEntry("ClipIconArea", fClipIcons); + config->writeEntry("percentPos", fpercentPos); + config->writeEntry("zoomSpeed", fzoomSpeed); + config->writeEntry("speedControl", fSpeed); + config->writeEntry("Hidden", fHidden); + config->writeEntry("StayBelow", fStayBelow); + config->writeEntry("fOrientation", fOrientation); + config->writeEntry("showNames", showNames); + config->writeEntry("Cleaner", fCleaner); + config->writeEntry("xosdFont", xosdFont); + config->writeEntry("xosdColor", xosdColor); + config->writeEntry("xosdShadowColor", xosdShadowColor); + config->writeEntry("xosdSize", xosdSize); + config->writeEntry("HideOnClick", fHideOnClick); + config->writeEntry("fSteppy", fSteppy); + config->writeEntry("HighLightTime", fHighLightTime); + config->writeEntry("iSpace", iSpace); + config->writeEntry("FirstRun", FALSE); + config->writeEntry("Xinerama", xinerama); + config->writeEntry("hideTimer", hideTimer); + config->writeEntry("Solid", Solid); + config->writeEntry("ShowSShot", fShowShot); + config->writeEntry("iconGrouping", fGrouping); + config->writeEntry("Navigator", fShowNav); + config->writeEntry("Systray", fSystray); + config->writeEntry("currentDesktop", fCurrent); + + if (xosdBold == true) + { + config->writeEntry("xosdBold", 1); + } + else + { + config->writeEntry("xosdBold", 0); + } + + if (xosdItalic == true) + { + config->writeEntry("xosdItalic", 1); + } + else + { + config->writeEntry("xosdItalic", 0); + } + + config->sync(); +} + + +void KoolDock::editPref() +{ + bool tmp; //to save some code + + // open up the configuration dialog + + // Fill dialog with values from configuration + tmp=fHidden==1; + + setupdlg->chk1->setChecked(tmp); + setupdlg->hideTimer->setEnabled(tmp); + setupdlg->hideOnClick->setEnabled(tmp); + setupdlg->cbStayBelow->setEnabled(!tmp); + setupdlg->cbStayBelow->setChecked(fStayBelow==1); + + tmp=fShowTaskbar==1; + + setupdlg->chk6->setEnabled(tmp); + setupdlg->cbMinimizedOnly->setEnabled(tmp); + setupdlg->chkSshot->setEnabled(tmp); + setupdlg->chkGrouping->setEnabled(tmp); + setupdlg->currentDesk->setEnabled(tmp); + + setupdlg->systray->setChecked(fSystray==1); + + setupdlg->currentDesk->setChecked(fCurrent==1); + + //Even if start Hidden is disabled we load the stored value + setupdlg->hideTimer->setValue(hideTimer); + setupdlg->hideOnClick->setChecked(fHideOnClick == 1); + setupdlg->Steppy->setChecked(fSteppy == 1); + setupdlg->cbCleaner->setChecked(fCleaner == 1); + + tmp=showNames==1; + + setupdlg->chk2->setChecked(tmp); + setupdlg->xosdBold->setEnabled(tmp); + setupdlg->xosdItalic->setEnabled(tmp); + setupdlg->xosdSize->setEnabled(tmp); + setupdlg->spinBox2->setEnabled(tmp); + setupdlg->kColorCombo1->setEnabled(tmp); + setupdlg->kColorCombo_shadow->setEnabled(tmp); + setupdlg->xosdFont->setEnabled(tmp); + setupdlg->cbCleaner->setEnabled(tmp); + + if(Solid==1) + { + setupdlg->chkSolid->setChecked(true); + setupdlg->chkSolidSlot(); + } + else + { + if(!curTheme.isEmpty()) setupdlg->theme->setCurrentText(curTheme); + setupdlg->chkImg->setChecked(true); + setupdlg->chkSolidSlot(); + } + setupdlg->chk4->setChecked(fShowBorders == 1); + setupdlg->kColorCombo1->setColor(xosdColor); + setupdlg->kColorCombo_shadow->setColor(xosdShadowColor); + setupdlg->xosdFont->setCurrentFont(xosdFont); + setupdlg->kColorCombo2->setColor(bgColor.name()); + setupdlg->kColorCombo3->setColor(borderColor.name()); + setupdlg->kColorCombo4->setColor(sepColor.name()); + setupdlg->spinBox1->setValue(dockOpacity); + setupdlg->xosdSize->setValue(xosdSize); + setupdlg->spinBox2->setValue(xosdShadowOffset); + setupdlg->chk5->setChecked(fShowTaskbar == 1); + setupdlg->cbMinimizedOnly->setChecked(fMinimizedOnly == 1); + setupdlg->chk6->setChecked(fShowNotification == 1); + setupdlg->chk7->setChecked(fShowKMenu == 1); + setupdlg->chkUseKBFX->setChecked(fUseKBFX == 1); + setupdlg->iwSmall->setValue(iwSmall); + setupdlg->iwBig->setValue(iwBig2); + setupdlg->fAmount->setValue(fAmount); + setupdlg->sbSpace->setValue(iSpace); + setupdlg->nWideBg->setChecked(fNWideBg); + if (scaleMax) {setupdlg->opScale2->setChecked(true);} else {setupdlg->opScale1->setChecked(true);} + setupdlg->xosdBold->setChecked(xosdBold); + setupdlg->xosdItalic->setChecked(xosdItalic); + if (xinerama==1) + { + setupdlg->xrma->setChecked(true); + setupdlg->SleftRes->setEnabled(true); + setupdlg->SHeight->setEnabled(true); + setupdlg->PWidth->setEnabled(true); + setupdlg->SleftRes->setValue(leftRes); + setupdlg->SHeight->setValue(XinDesiredHeight); + setupdlg->PWidth->setValue(XinPreviousWidth); + } + else + { + setupdlg->SleftRes->setEnabled(false); + setupdlg->SHeight->setEnabled(false); + setupdlg->PWidth->setEnabled(false); + setupdlg->xrma->setChecked(false); + setupdlg->SleftRes->setValue(QApplication::desktop()->width()); + setupdlg->SHeight->setValue(QApplication::desktop()->height()); + } + setupdlg->nav->setChecked(fShowNav==1); + setupdlg->chkSshot->setChecked(fShowShot); + setupdlg->chkGrouping->setChecked(fGrouping); + setupdlg->Priority->setValue(fPriority); + //setupdlg->cbMouseTimer->setValue(fMouseTimer); + setupdlg->chClipping->setChecked(fClipping==1); + setupdlg->chClipIcons->setChecked(fClipIcons==1); + setupdlg->zoomSpeed->setValue(fzoomSpeed); + setupdlg->chkSpeed->setChecked(fSpeed); + setupdlg->percentPos->setValue(fpercentPos); + if (fOrientation==0) setupdlg->op0->setChecked(true); + if (fOrientation==1) setupdlg->op1->setChecked(true); + if (fOrientation==2) setupdlg->op2->setChecked(true); + if (fOrientation==3) setupdlg->op3->setChecked(true); + loadIgnore(); //Load Ignore List + + if (!setupdlg->isVisible()) if (!noSet) setupdlg->tabWidget->setCurrentPage(0); + setupdlg->toReloadIcons->setChecked(FALSE); + + setupdlg->show(); + KWin::WindowInfo winfo; + winfo = KWin::windowInfo(setupdlg->winId()); + + if (winfo.desktop()!=-1) KWin::setOnDesktop(setupdlg->winId(), KWin::currentDesktop()); + KWin::activateWindow(setupdlg->winId()); + +} + +void KoolDock::loadMenu() +{ + QDir homeDir = QDir::home(); + if (homeDir.exists(menuPath)) + { + QDir dir(menuPath); + //First we make sure every index is correct! + //Lets update the launchers index + QString preffix; + QStringList fileListRemove=dir.entryList("*.desktop"); + QStringList fileListRemove2=fileListRemove; + + //Not really sure why I couldn't do this within the other for, something like fileListRemove[i].remove(0,2).prepend(preffix), but hell it works + for(unsigned int i=0; i<fileListRemove2.count(); i++) + { + fileListRemove2[i].remove(0,2); + } + + //Rename the files so they reflect their new position + for(unsigned int i=0; i<fileListRemove.count(); i++) + { + if(i<10) preffix=QString("0%1").arg(i); + if(i>=10) preffix=QString("%1").arg(i); + + dir.rename(fileListRemove[i], QString("%1%2").arg(preffix).arg(fileListRemove2[i])); + } + //End updating launchers index + + QStringList fileList = dir.entryList( "*.desktop"); + if(!fileList.isEmpty()) + { + for ( QStringList::Iterator it = fileList.begin(); it != fileList.end(); ++it ) + { + if ( ((*it) != ".") && ((*it) != "..") ) + { + items.append(new Item(menuPath + (*it), iwSmall, iwBig2)); + } + } + } + } + else + { + debug("Config directory doesn't exits"); + QDir progPathDir(progPath); + progPathDir.mkdir(progPath); + QDir menuPathDir(menuPath); + menuPathDir.mkdir(menuPath); + debug("Created item directory"); + + // create initial entries. + addFile(QString("00_konqueror.desktop"), QString("konqueror"), QString("kfmclient openProfile webbrowsing"), QString("Konqueror Web Browser"), true, false, false, false, QString("na")); + addFile(QString("01_home.desktop"), QString("kfm_home"), QString("kfmclient openProfile filemanagement"), QString("Home directory"), true, false, false, false, QString("na")); + addFile(QString("02_kmail.desktop"), QString("kmail"), QString("kmail"), QString("KMail"), true, false, false, false, QString("na")); + addFile(QString("03_kate.desktop"), QString("kate"), QString("kate"), QString("Kate"), true, false, false, false, QString("na")); + addFile(QString("04_konsole.desktop"), QString("konsole"), QString("konsole"), QString("Konsole"), true, false, false, false, QString("na")); + addFile(QString("05_kcontrol.desktop"), QString("kcontrol"), QString("kcontrol"), QString("Control Center"), true, false, false, false, QString("na")); + + loadMenu(); + } + numLaunchers = items.count(); +} + + +void KoolDock::about() +{ + KAboutApplication about(this, 0, false); + about.exec(); +} + + +void KoolDock::onChangeTimerTicked() +{ + if (animValue > 70) animState = FALSE; + if (animValue < 5) animState = TRUE; + + if (animState == TRUE) + { + animValue = animValue + 5; + } + else + { + animValue = animValue - 5; + } + paintEvent(NULL); +} + + +void KoolDock::updateBackground(const QPixmap& pix) +{ + if (pix.width()==1 && pix.height()==1) + { + if (fHidden == 0) + { + if ((fOrientation & 1)==1) {bottomBg = QPixmap(h1, dw);} else {bottomBg = QPixmap(dw, h1);} + bottomBg.fill (pix.convertToImage().pixel(0,0)); + } + if (dockOpacity > 0) {bitBlt(&bottomBgf,0,0,&bottomBg);KPixmapEffect::fade(bottomBgf, ((float)dockOpacity)*0.01, bgColor);} + } + else + { + if (fHidden == 0) bottomBg = QPixmap(pix); + if (dockOpacity > 0) {bitBlt(&bottomBgf,0,0,&bottomBg);KPixmapEffect::fade(bottomBgf, ((float)dockOpacity)*0.01, bgColor);} + } + uw=w; + paintEvent(NULL); + +} + +void KoolDock::toggleAlwaysOnTop() +{ + KWin::WindowInfo info=KWin::windowInfo(cId); + + if (info.state() & NET::KeepAbove) + { + KWin::clearState(cId,NET::KeepAbove); + } + else + { + KWin::setState(cId,NET::KeepAbove); + KWin::raiseWindow(cId); + } +} + +void KoolDock::toggleKeptBelowOthers() +{ + KWin::WindowInfo info=KWin::windowInfo(cId); + + if (info.state() & NET::KeepBelow) + { + KWin::clearState(cId,NET::KeepBelow); + } + else + { + KWin::setState(cId,NET::KeepBelow); + KWin::lowerWindow(cId); + } +} + +void KoolDock::toggleFullScreen() +{ + KWin::WindowInfo info=KWin::windowInfo(cId); + + if (info.state() & NET::FullScreen) + { + KWin::clearState(cId,NET::FullScreen); + } + else + { + KWin::setState(cId,NET::FullScreen); + } +} + +void KoolDock::moveApp() +{ + KWin::WindowInfo info=KWin::windowInfo(cId); + activateApp(); + + QCursor::setPos(info.geometry().center()); + + NETRootInfo ri(qt_xdisplay(), NET::WMMoveResize); + ri.moveResizeRequest(cId, info.geometry().center().x(), info.geometry().center().y(), NET::Move); +} + +void KoolDock::resizeApp() +{ + KWin::WindowInfo info=KWin::windowInfo(cId); + activateApp(); + + QCursor::setPos(info.geometry().bottomRight()); + + NETRootInfo ri(qt_xdisplay(), NET::WMMoveResize); + ri.moveResizeRequest(cId, info.geometry().bottomRight().x(), + info.geometry().bottomRight().y(), NET::BottomRight); +} + +void KoolDock::minApp() +{ + Item *item; + int i; + QPixmap shot; + QImage tmpImg; + KWin::WindowInfo info=KWin::windowInfo(cId); + + if (info.isMinimized()) + { + for (i=0, item = witems.at(0); item; i++, item = witems.next()) + { + if(item->getId() == cId) + { + // set default's item icon + item->setIcon(KWin::icon(cId, iwBig2, iwBig2, TRUE)); + } + } + KWin::deIconifyWindow(cId, true); + KWin::activateWindow(cId); + } + else + { + if (fShowShot == TRUE) + { + for (i=0, item = witems.at(0); item; i++, item = witems.next()) + { + if(item->getId() == cId) + { + // take the screenshot + shot = QPixmap::grabWindow(cId); + // scale the screenshot + tmpImg = shot.convertToImage(); + tmpImg.scale(iwBig2, iwBig2); + shot.convertFromImage(tmpImg); + // set the new item's icon + item->setIcon(shot); + } + } + paintEvent(NULL); + } + KWin::iconifyWindow(cId, true); + } + hide(); + QTimer::singleShot( 100, this, SLOT(refreshBackground()) ); +} + + +void KoolDock::maxApp() +{ + Item *item; + int i; + KWin::WindowInfo info=KWin::windowInfo(cId); + + if (fShowShot == TRUE) + { + for (i=0, item = witems.at(0); item; i++, item = witems.next()) + { + if(item->getId() == cId) + { + // set default's item icon + item->setIcon(KWin::icon(cId, iwBig2, iwBig2, TRUE)); + } + } + } + if (info.isMinimized()) + { + KWin::deIconifyWindow(cId, true); + } + else + { + if (info.state() & NET::Max) + { + KWin::clearState(cId, NET::Max); + } + else + { + KWin::setState(cId, NET::Max); + } + } + KWin::activateWindow(cId); + hide(); + QTimer::singleShot( 100, this, SLOT(refreshBackground()) ); +} + +void KoolDock::restApp() +{ + Item *item; + int i; + KWin::WindowInfo info=KWin::windowInfo(cId); + + if (fShowShot == TRUE) + { + for (i=0, item = witems.at(0); item; i++, item = witems.next()) + { + if(item->getId() == cId) + { + // set default's item icon + item->setIcon(KWin::icon(cId, iwBig2, iwBig2, TRUE)); + } + } + } + + KWin::clearState(cId, NET::MaxVert + NET::MaxHoriz); + KWin::deIconifyWindow(cId, true); + KWin::activateWindow(cId); + hide(); + QTimer::singleShot( 100, this, SLOT(refreshBackground()) ); +} + +void KoolDock::minAllApps() +{ + int i; + Item *item; + KWin::WindowInfo info=KWin::windowInfo(cId,0,NET::WM2WindowClass); + QCString cls=info.windowClassClass(); + for (i=0, item = witems.at(0); item; i++, item = witems.next()) + { + if (!item->info.isMinimized()) + { + if ((fMinimizedOnly==0 || item->info.isMinimized()) || (fCurrent==0 || item->info.isOnDesktop(info.desktop()))) + { + if (cls==item->getClass()) + { + KWin::iconifyWindow(item->getId(), true); + } + } + } + } + +} + +void KoolDock::maxAllApps() +{ + int i; + Item *item; + KWin::WindowInfo info=KWin::windowInfo(cId,0,NET::WM2WindowClass); + QCString cls=info.windowClassClass(); + for (i=0, item = witems.at(0); item; i++, item = witems.next()) + { + if (!(item->info.state() & NET::Max) || item->info.isMinimized()) + { + if ((fMinimizedOnly==0 || item->info.isMinimized()) || (fCurrent==0 || item->info.isOnDesktop(info.desktop()))) + { + if (cls==item->getClass()) + { + if (item->info.isMinimized()) KWin::deIconifyWindow(item->getId(),true); + KWin::setState(item->getId(), NET::Max); + } + } + } + } +} + +void KoolDock::restAllApps() +{ + int i; + Item *item; + KWin::WindowInfo info=KWin::windowInfo(cId,0,NET::WM2WindowClass); + QCString cls=info.windowClassClass(); + for (i=0, item = witems.at(0); item; i++, item = witems.next()) + { + if (item->info.state() & NET::Max || item->info.isMinimized()) + { + if ((fMinimizedOnly==0 || item->info.isMinimized()) || (fCurrent==0 || item->info.isOnDesktop(info.desktop()))) + { + if (cls==item->getClass()) + { + if (item->info.isMinimized()) + { + KWin::deIconifyWindow(item->getId(),true); + } + else + { + KWin::clearState(item->getId(), NET::Max); + } + } + } + } + } +} + +void KoolDock::closeAllApps() +{ + int i; + Item *item; + KWin::WindowInfo info=KWin::windowInfo(cId,0,NET::WM2WindowClass); + QCString cls=info.windowClassClass(); + for (i=0, item = witems.at(0); item; i++, item = witems.next()) + { + if ((fMinimizedOnly==0 || item->info.isMinimized()) || (fCurrent==0 || item->info.isOnDesktop(info.desktop()))) + { + if (cls==item->getClass()) + { + NETRootInfo app(qt_xdisplay(), NET::CloseWindow); + app.closeWindowRequest(item->getId()); + } + } + } +} + +void KoolDock::shadeApp() +{ + KWin::WindowInfo info=KWin::windowInfo(cId); + + if (info.state() & NET::Shaded) + { + KWin::clearState(cId, NET::Shaded); + } + else + { + KWin::setState(cId, NET::Shaded); + } + + hide(); + QTimer::singleShot( 100, this, SLOT(refreshBackground()) ); +} + +void KoolDock::activateApp() +{ + Item *item; + int i; + KWin::WindowInfo info = KWin::windowInfo(cId); + + if (fShowShot == TRUE) + { + for (i=0, item = witems.at(0); item; i++, item = witems.next()) + { + if(item->getId() == cId) + { + // set default's item icon + item->setIcon(KWin::icon(cId, iwBig2, iwBig2, TRUE)); + } + } + } + + if (info.desktop()!=-1 && info.desktop()!=KWin::currentDesktop()) + { + goToDesktop(info.desktop()); + } + if (info.isMinimized()) KWin::deIconifyWindow(cId, true); + KWin::activateWindow(cId); + hide(); + QTimer::singleShot( 100, this, SLOT(refreshBackground()) ); +} + +void KoolDock::closeApp() +{ + NETRootInfo app(qt_xdisplay(), NET::CloseWindow); + app.closeWindowRequest(cId); + debug(QString("Closed: %1").arg(cId)); +} + + +void KoolDock::editItem() +{ + run(QString("kfmclient openProperties ") + iFilename); +} + + +void KoolDock::sendToDesktop(int desktop) +{ + if (desktop==0) desktop=-1; + if (iGroup && allApps) + { + int i; + Item *item; + KWin::WindowInfo info=KWin::windowInfo(cId,0,NET::WM2WindowClass); + QCString cls=info.windowClassClass(); + for (i=0, item = witems.at(0); item; i++, item = witems.next()) + { + if ((fMinimizedOnly==0 || item->info.isMinimized()) || (fCurrent==0 || item->info.isOnDesktop(info.desktop()))) + { + if (cls==item->getClass()) + { + KWin::setOnDesktop(item->getId(), desktop); + } + } + } + return; + } + KWin::setOnDesktop(cId, desktop); +} + + +void KoolDock::goToDesktop(int desktop) +{ + KWin::setCurrentDesktop(desktop); +} + + +void KoolDock::goToWindow(int win) +{ + cId=(WId)win; + activateApp(); +} + + +void KoolDock::removeItem() +{ + QFile::remove(iFilename); + restart(); +} + + +void KoolDock::addFile(QString filename, QString iconname, QString execname, QString name, bool notify, bool terminal, bool tclose, bool cuser, QString puser) +{ + QString progPath = locateLocal("data", "kooldock"); + QString menuPath = progPath + QString("/menu/"); + QString confFile = locateLocal("config", "kooldockrc"); + + QFile out(QString(menuPath + filename)); + if (out.open(IO_WriteOnly)) + { + QTextStream out_s(&out); + out_s << "[Desktop Entry]" << endl; + out_s << "Comment=" << endl; + out_s << "Encoding=UTF-8" << endl; + out_s << "Exec=" << execname << endl; + out_s << "GenericName=" << endl; + out_s << "Icon=" << iconname << endl; + out_s << "MimeType=" << endl; + out_s << "Name=" << name << endl; + out_s << "Path=" << endl; + out_s << "ServiceTypes=" << endl; + out_s << "SwallowExec=" << endl; + out_s << "SwallowTitle=" << endl; + out_s << "Terminal=false" << endl; + out_s << "TerminalOptions=" << endl; + out_s << "Type=Application" << endl; + if(notify == true) + { + out_s << "X-KDE-StartupNotify=true" << endl; + } + else + { + out_s << "X-KDE-StartupNotify=false" << endl; + } + if(cuser==true) + { + out_s << "X-KDE-SubstituteUID=true" << endl; + out_s << "X-KDE-Username=" << puser << endl; + } + else + { + out_s << "X-KDE-SubstituteUID=false" << endl; + out_s << "X-KDE-Username=" << endl; + } + if(terminal==true) + { + out_s << "Terminal=true" << endl; + } + else + { + out_s << "Terminal=false" << endl; + } + if(tclose==true) + { + out_s << "TerminalOptions=\\s--noclose" << endl; + } + else + { + out_s << "TerminalOptions=" << endl; + } + out.close(); + } +} + + +bool KoolDock::ignored(QString appname) +{ + if(ignoreList.count()>0) + { + for(unsigned int i=0; i<ignoreList.count(); i++) + { + if(ignoreList[i]==appname) + return(true); + + } + } + return(false); +} + + +#ifdef _ENABLE_DEBUG +void KoolDock::debug(QString message) +{ + // debugging function (show messages to stdout) + kdDebug(0) << "DEBUG: " << message << endl; +} +#endif +#ifndef _ENABLE_DEBUG +void KoolDock::debug(QString) +{ +} +#endif + +void KoolDock::endProg() +{ + if (fHidden==0 && fClipping==1) + { + if ((fOrientation & 1)==1) + { + setDesktopIconsArea(0,0,dh,dw); + } + else + { + setDesktopIconsArea(0,0,dw,dh); + } + } + debug("Clean exit."); + exit(0); +} + +void KoolDock::restart() +{ + QString cmd; + cmd = mainPath + " &"; + kdDebug(0) << "mainPath: " << mainPath << endl; + debug("Restarting..."); + system(cmd.latin1()); + endProg(); +} + +void KoolDock::reload() +{ + setupdlg->setEnabled(FALSE); + + hide(); + if (wm) delete(wm); + trackTimer->stop(); + mkbigTimer->stop(); + mksmallTimer->stop(); + mTimer->stop(); + if (onChangeTimer != NULL) onChangeTimer->stop(); + + if (trackTimer) delete(trackTimer); + if (mTimer) delete(mTimer); + if (mkbigTimer) delete(mkbigTimer); + if (mksmallTimer) delete(mksmallTimer); + if (onChangeTimer != NULL) delete(onChangeTimer); + if (_filterData) delete(_filterData); + + if (rootpix) delete(rootpix); + if (xosdw) delete(xosdw); + if (clipw) delete(clipw); + if (info) delete(info); + + if (reloadIcons) + { + items.clear(); + witems.clear(); + } + init1(); + init2(); + if (setupdlg->isVisible()) + { + noSet=true; + editPref(); + if (reloadIcons) + { + setupdlg->appClear(); + setupdlg->appFill(); + } + noSet=false; + } +} + +void KoolDock::chkRestart() +{ + if (initialization) return; + if (!setupdlg ) return; + // this function is called by a timer to check if the dock should be restarted + // or not, depending on what was done in the configuration dialog. + reloadIcons=setupdlg->toReloadIcons->isChecked(); + reload(); + reloadIcons=false; + setupdlg->toReloadIcons->setChecked(FALSE); +} + + +void KoolDock::setMainPath(QString path) +{ + mainPath = path; +} + +void KoolDock::setArgs(QString params) +{ + args = params; + if (args=="-options" || args=="-o") editPref(); + +} + +void KoolDock::move2(int nx, int ny) +{ + int cx, cy, tmp, xn=0; + if (xinerama==1) {xn=XinPreviousWidth;} + + cx=0; + if ((fOrientation & 2) == 2) {ny=0; cy=0;} else {ny=dh-h1; cy=dh-h0;} + if ((fOrientation & 1) == 1) + {rx=ny; ry=nx; + tmp=cx;cx=cy;cy=tmp;} + else + {rx=nx; ry=ny;} + //if (fHidden==0) clipw->move(cx,cy); + if (rx==x0 && ry==dh-h0 && fExpanded==FALSE && w1>dw) + { + if (w0>dw) + { + Offset=(w1-dw)*lastXPos/dw - rx; + if ((fOrientation & 1) == 1) ry=0; + move(xn,ry); + } + else + { + Offset=0; + if ((fOrientation & 1) == 1) {ry=0;} else {rx=0;} + move(rx+xn,ry); + } + } + else + { + if ((fOrientation & 1) == 1) {ry=0;} else {rx=0;} + move(rx+xn,ry); + } + rx+=xn; + //clipw->lower(); +} + +void KoolDock::resize2(int nw, int nh) +{ + int mw, mh; + //if (w1>dw && nw>w1) + nw=dw; + nh=h1; + if ((fOrientation & 1) == 1) {rw=nh; rh=nw;} else {rw=nw; rh=nh;} + if (w1<dw) Offset=0; + resize(rw,rh); + nw=dw; + nh=h0; + if ((fOrientation & 1) == 1) {mw=nh; mh=nw;} else {mw=nw; mh=nh;} + //clipw->resize(200, 200); + //clipw->lower(); +} +void KoolDock::getBottomBG() +{ + if (fHidden==0) return; + int p1,p2,p3,p4,pt; + p1=0; + if ((fOrientation & 2)==2) {p2=0;} else {p2=dh - h1;} + p3=dw; + p4=h1; + if ((fOrientation & 1)==1) + { + pt=p1; p1=p2; p2=pt; + pt=p3; p3=p4; p4=pt; + } + if (xinerama==1) p1+=XinPreviousWidth; + bottomBg = QPixmap::grabWindow(qt_xrootwin(), p1, p2, p3, p4); + //bottomBg = QPixmap::grabWindow(qt_xrootwin(), x1, dh - h1, w1, h1); +} + +void KoolDock::getTopBG() +{ + int p1,p2,p3,p4,pt; + p1=0; + if ((fOrientation & 2)==2) {p2=h0;} else {p2=dh - h1;} + p3=dw; + p4=h1 - h0; + if ((fOrientation & 1)==1) + { + pt=p1; p1=p2; p2=pt; + pt=p3; p3=p4; p4=pt; + } + if (xinerama==1) p1+=XinPreviousWidth; + topBg = QPixmap::grabWindow(qt_xrootwin(), p1, p2, p3, p4); + //topBg = QPixmap::grabWindow(qt_xrootwin(), x1, dh - h1, w1, h1 - h0); +} + +void KoolDock::setDesktopIconsArea(int left, int top, int width, int height) +{ + if (fClipIcons==0) return; + DCOPClient* client = KApplication::dcopClient(); + if (!client->isAttached()) { + client->attach(); + client->registerAs("KoolDock"); + } + + for (int i = 0; i < KWin::numberOfDesktops(); i++) { + QByteArray data; + QDataStream args(data, IO_WriteOnly); + args << left << top << width << height << i; + client->send("kdesktop", "KDesktopIface", "desktopIconsAreaChanged(QRect, int)", data); + } +} + +void KoolDock::setDockAbove() { + KWin::setState(winId(), NET::KeepAbove); + raise(); +} + +void KoolDock::setDockBelow() { + KWin::setState(winId(), NET::KeepBelow); + lower(); +} + +void KoolDock::menuShow() +{ + allApps=false; + int tcId; + if (iGroup && menuCount!=0) + { + tcId=appMenu->itemParameter(currMenu); + + if (tcId==currMenu && menuCount==1) + { + allApps=true; + deskpopup->setItemChecked(dIndex,false); + return; + } + cId=tcId; + KWin::WindowInfo info=KWin::windowInfo(cId,0,NET::WM2AllowedActions); + deskpopup->setItemChecked(dIndex,false); + dIndex=info.desktop(); + if (dIndex==-1) dIndex=0; + deskpopup->setItemChecked(dIndex,true); + advMenu->setItemChecked(1,info.state() & NET::KeepAbove); + advMenu->setItemChecked(2,info.state() & NET::KeepBelow); + advMenu->setItemChecked(3,info.state() & NET::FullScreen); + advMenu->setItemEnabled(3,info.actionSupported(NET::ActionFullScreen)); + } +} + +void KoolDock::menuX(int num) +{ + if (iGroup && menuCount!=0) + { + currMenu=num; + } +} + +void KoolDock::init1() +{ + initialization=true; + ptPart=5; + // Load the configuration + loadConf(); + + if (fStayBelow==0 || fHidden==1) + { + reparent (0, getWFlags() | WX11BypassWM, pos(),FALSE); + } + else + { + reparent (0, getWFlags() & !WX11BypassWM, pos(),FALSE); + } + hide(); + + // Lets initialize the systray counter + if (reloadIcons) numSystray=0; + + // first, we set our "nice" priority + if (fPriority > 19) fPriority = DEF_PRIORITY; + if (fPriority < 0) fPriority = DEF_PRIORITY; + setpriority(0, 0, fPriority); + debug(QString("Priority: %1").arg(fPriority)); + + iwBig2 = iwBig; + + lastX=0; + + iDist = iwSmall + iSpace; + funcW = (int)(iDist*fAmount/2); + funcH = iwBig - iwSmall; + iy = iSpace/ 2; + + + KWin::setOnAllDesktops(winId(), true); + KWin::setState(winId(), NET::SkipTaskbar | NET::SkipPager); + KWin::setType(winId(), NET::Dock); + + items.setAutoDelete(TRUE); + popups.setAutoDelete(TRUE); + desks.setAutoDelete(TRUE); + + if(fShowKMenu==1) + { + if (fUseKBFX==1) + { + if (reloadIcons) items.append(new Item("kmenu", "dcop kicker KBFXInterface showMenu", "KMenu", iwSmall, iwBig2)); + } + else + { + if (reloadIcons) items.append(new Item("kmenu", "dcop kicker kicker popupKMenu 0", "KMenu", iwSmall, iwBig2)); + } + } + + + //Lets load the menu entries + if (reloadIcons) loadMenu(); + if (items.count()==0) + { + items.append(new Item("kooldock", "kooldock -k; kooldock -o" , "K", iwSmall, iwBig2)); + } + // Create the "xosd" widget + xosdw = new xosd(); + rdh=QApplication::desktop()->height(); + xosdw->move(0,rdh); + + wm = new KWinModule(); + + info = new NETWinInfo( qt_xdisplay(), winId(), qt_xrootwin(), NET::WMState); + info->setDesktop( NETWinInfo::OnAllDesktops ); + info->setState(NETWinInfo::SkipTaskbar | NETWinInfo::SkipPager, NETWinInfo::SkipTaskbar | NETWinInfo::SkipPager); + setBackgroundMode(NoBackground); + + // Load the ignore List + loadIgnore(); + + xosd_st = 0; + xosdw->setFont(xosdFont); + if (xosdItalic == true) xosdw->setItalic(); + if (xosdBold == true) xosdw->setBold(); + xosdw->setSize(xosdSize); + xosdw->setShadowOffset(xosdShadowOffset); + xosdw->setColor(xosdColor); + xosdw->setShadowColor(xosdShadowColor); + + // Show task bar + if (fShowTaskbar) + { + //Lets add the necesary windows + if (reloadIcons) {firstTime=true;addWindows();} + connect(wm, SIGNAL(activeWindowChanged(WId)), SLOT(activeWindowChanged(WId))); + + } + connect(wm, SIGNAL(windowAdded(WId)), SLOT(windowAdded(WId))); + connect(wm, SIGNAL(windowRemoved(WId)), SLOT(windowRemoved(WId))); + connect(wm, SIGNAL(windowChanged(WId, unsigned int)), SLOT(windowChanged(WId, unsigned int))); + if (fSystray) + { + /* System Tray implementation (hope this works - Francisco) */ + connect(wm, SIGNAL(systemTrayWindowAdded(WId)), SLOT(systemTrayWindowAdded(WId))); + connect(wm, SIGNAL(systemTrayWindowRemoved(WId)), SLOT(systemTrayWindowRemoved(WId))); + + 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; + xev.data.l[4] = 0; + + //XSendEvent (display, root, False, StructureNotifyMask, (XEvent *)&xev); + } + } + connect(wm, SIGNAL(currentDesktopChanged(int)), SLOT(currentDesktopChanged(int))); + connect(wm, SIGNAL(workAreaChanged()), SLOT(workAreaChanged())); + + // Pseudo-Transparency code + rootpix = new KRootPixmap(this); + rootpix->setCustomPainting(TRUE); + connect(rootpix, SIGNAL(backgroundUpdated (const QPixmap &)), SLOT(updateBackground(const QPixmap &))); + rootpix->start(); + + debug(QString("Items loaded: %1").arg(items.count())); + + //Simple work around to support xinerama (user defined) + if(xinerama==0) + { + dw=QApplication::desktop()->width(); + dh = QApplication::desktop()->height(); + } + else + { + dw=leftRes; + dh=XinDesiredHeight; + } + + xosdw->setClear(fCleaner); + xosdw->setOrientation(fOrientation & 1, dw, rdh); + + // All icons to small size + unsigned int i; + for (i=0; i < items.count() + 1; i++) + { + iSize[i] = iwSmall; + } + for (i=0; i < items.count() + 1; i++) + { + cx[i] = iSpace + i*iDist + iwSmall/2; + cur_cx[i] = cx[i]; + } + if ((fOrientation & 1)==1) + { + int tmpdw; + tmpdw=dw; + dw=dh; + dh=tmpdw; + } + if (fOrientation==2 || fOrientation==1) + { + QString tmpstr; + tmpstr=fLeftImg; + fLeftImg=fRightImg; + fRightImg=tmpstr; + } + + Offset=0; + + xosdw->move2(0,rdh); + xosdw->show(); + //setMouseTracking(TRUE); + fExpanded=FALSE; + // Timer to track the mouse position + // When the mouse pointer reaches the bottom of the screen, the bar should popup in a userdefined time (int hideTimer) + + track2active=FALSE; + trackTimer = new QTimer(this); + connect(trackTimer, SIGNAL(timeout()), this, SLOT(trackTimerEnd())); + + ii_first = 0; + ii_last = items.count() - 1; + + iOnClick = -1; + onChangeTimer = NULL; + Ybase = 0; + soffset=0; + eoffset=0; + last_ncx=0; + + /* For the the onscreen text (icon names) */ + nom = ""; + aux = ""; + + mTimer = new QTimer(this); + connect(mTimer, SIGNAL(timeout()), this, SLOT(mTimerEnd())); + + _filterData = new KURIFilterData(); + + mkbigTimer = new QTimer(this); + connect(mkbigTimer, SIGNAL(timeout()), this, SLOT(mkbigTimerDo())); + + mksmallTimer = new QTimer(this); + connect(mksmallTimer, SIGNAL(timeout()), this, SLOT(mksmallTimerDo())); + + QWMatrix m; + m.rotate( -90*fOrientation ); + if (!fLeftImg.isEmpty()) + { + LeftImg.load(fLeftImg); + LeftImg = LeftImg.xForm( m ); + } + if (!fRightImg.isEmpty()) + { + RightImg.load(fRightImg); + RightImg = RightImg.xForm( m ); + } + if (!fCenterImg.isEmpty()) + { + CenterImg.load(fCenterImg); + CenterImg = CenterImg.xForm( m ); + } + + if (fHidden==1) + { + move (0,rdh); + } + debug("Kooldock has started"); + + doUpdateGeometry(); + if ((fOrientation & 1)==1) {offscr = QPixmap(h1, dw); bottomBgf = QPixmap(h1, dw);} else {offscr = QPixmap(dw, h1); bottomBgf = QPixmap(dw, h1);} + + soffset = iwSmall/2 + func2(abs(1-funcW)) + func2(abs(iDist+1-funcW)) + func2(abs(2*iDist+1-funcW)) + func2(abs(3*iDist +1-funcW))/2 - ((int)((iwBig - iwSmall)*0.6*fAmount) + iSpace*2)/2 - 4*iwSmall - (int)((3*iDist+1-funcW)*(func(0) + func(iDist) - 2*iwSmall)/(2*iDist))+1; + eoffset=(int)((iwBig2-iwSmall)*fAmount/100); + doUpdateGeometry(); + +} + +void KoolDock::init2() +{ + clipw = new clip(); + + if (fHidden==1) + { + clipw->resize(0,0); + clipw->move(-10,-10); + } + else + { + int cx, cy; + cx=0; + if ((fOrientation & 2) == 2) {cy=0;} else {cy=dh-h0;} + if ((fOrientation & 1) == 1) + {clipw->move(cy,cx);clipw->resize(h0,dw);} + else + {clipw->move(cx,cy);clipw->resize(dw,h0);} + } + KWin::setOnAllDesktops(clipw->winId(), true); + KWin::setState(clipw->winId(), NET::KeepBelow); + clipw->lower(); + clipw->show(); + + animValue = 0; + animState = TRUE; + + if (fHidden==0) + { + resize2(w0,h0); + rootpix->repaint(true); + } + //Create desktop clipper widget + + if (fHidden==0 && fClipping==1) + { + //clipping desktop + if (fOrientation==0) {clipw->clipDesktop(0, 0, 0, 0, 0, 0, 0, 0, 0, h0, 0, dh);setDesktopIconsArea(0,0,dw,dh-h0);} + if (fOrientation==1) {clipw->clipDesktop(0, 0, 0, h0, 0, dh, 0, 0, 0, 0, 0, 0);setDesktopIconsArea(0,0,dh-h0,dw);} + if (fOrientation==2) {clipw->clipDesktop(0, 0, 0, 0, 0, 0, h0, 0, dh, 0, 0, 0);setDesktopIconsArea(0,h0,dw,dh);} + if (fOrientation==3) {clipw->clipDesktop(h0, 0, dh, 0, 0, 0, 0, 0, 0, 0, 0, 0);setDesktopIconsArea(h0,0,dh,dw);} + } + if (fStayBelow==1 && fHidden==0) setDockBelow(); + setAcceptDrops(TRUE); + useList=false; + if (fSpeed) ptPart=0; else ptPart=1; + if (fHidden==0) paintEvent(NULL); + if (ptPart==0) + enterEvent(NULL); + else + pTest(); +} + +void KoolDock::pTest() +{ + + if (ptPart==0) + { + onleaveEvent(NULL); ptPart=1; + return; + } + + //Finalize initialization + if(fHidden==1) + { + trackTimer->start(250, FALSE); + } + else + { + mTimer->start(250, FALSE); + } + oldDesktop=KWin::currentDesktop(); + initialization=false; + if (fShowTaskbar) addWindows(); + show(); + if (fHidden==0) paintEvent(NULL); + setupdlg->setEnabled(TRUE); + if (fFirstRun) editPref(); + updTaskList(); +} + +void KoolDock::refreshBackground() +{ + getBottomBG(); + getTopBG(); + if (dockOpacity > 0) {bitBlt(&bottomBgf,0,0,&bottomBg);KPixmapEffect::fade(bottomBgf, ((float)dockOpacity)*0.01, bgColor);} + show(); + paintEvent(NULL); +} + +void KoolDock::dragMoveEvent(QDragMoveEvent* event) +{ + if (mouseOnLauncher && QTextDrag::canDecode(event)) + { + event->accept(); + } + else + { + event->ignore(); + } +} + +void KoolDock::dropEvent(QDropEvent* event) +{ + QString strDrop; + QPoint pointer; + pointer = QCursor::pos(); + int px, py; + + px = pointer.x()-pos().x(); + py = pointer.y()-pos().y(); + + QTextDrag::decode(event, strDrop); + lstDrop=QStringList::split(QString("\n"),strDrop,false); + + useList=true; + mPress (px, py, Qt::LeftButton); + useList=false; +} + +void KoolDock::movetoback(WId id) +{ + int i; + Item *item; + int ic=-1,jc; + QCString cls; + + //find clicked item in witems list + for (i=0, item = witems.at(0); item; i++, item = witems.next()) + if (item->getId()==id) {ic=i;break;} + + if (ic>=0) + { + jc=witems.at(ic)->getIndex(); //get item stack index + for (i=0, item = witems.at(0); item; i++, item = witems.next()) + { + if (item->getIndex()>jc) item->setIndex(item->getIndex()-1); + } + //move clicked item to last position in the stack + witems.at(ic)->setIndex(witems.count()-1); + cls = witems.at(ic)->getClass(); + for (i=numLaunchers, item = items.at(numLaunchers); item; i++, item = items.next()) + { + if (item->getClass()==cls) + { + item->setId(witems.at(ic)->getId()); + item->setName(witems.at(ic)->getName()); + break; + } + } + } +} + +int KoolDock::itemFromPoint(int x) +{ + int i, Xpos=-1; + for (i=0; i<(int)items.count(); i++) + { + Xpos=xFromIndex(i); + if ((x+iSpace/2)>Xpos && (x-iSpace)<(Xpos+iSize[i])) break; + } + currXPos=Xpos; + return i; +} + +int KoolDock::xFromIndex(int i) +{ + int Xpos; + if(i < ii_first){Xpos = cur_cx[i] - iwSmall/2 + SPACE_W;} + else if(i >= ii_first && i <= ii_last){Xpos = cur_cx[i] - iSize[i]/2 + adjust+soffset;} + else if(i > ii_last){Xpos = cur_cx[i] - iwSmall/2 + adjust + SPACE_W - 3+soffset*0;} + return Xpos; +} + +void KoolDock::aboutToShow() +{ + menuCount++; +} + +void KoolDock::aboutToHide() +{ + menuCount--; +} + +void KoolDock::createMenu(WId id, KPopupMenu* tmpMenu, KWin::WindowInfo * info) +{ + QString appTitle; + int menustate; + appTitle = info->visibleName(); + appTitle.truncate(30); + + tmpMenu->insertTitle(appTitle); + + tmpMenu->insertItem(i18n("Ad&vanced"), advMenu); + + menustate = tmpMenu->insertItem(SmallIcon("move"), i18n("&Move"), this, SLOT(moveApp())); + tmpMenu->setItemEnabled(menustate, info->actionSupported(NET::ActionMove)); + + menustate = tmpMenu->insertItem(i18n("Re&size"), this, SLOT(resizeApp())); + tmpMenu->setItemEnabled(menustate, info->actionSupported(NET::ActionMove)); + + menustate = tmpMenu->insertItem(i18n("Mi&nimize"), this, SLOT(minApp())); + if (info->isMinimized()) tmpMenu->setItemChecked(menustate, true); + tmpMenu->setItemEnabled(menustate, info->actionSupported(NET::ActionMinimize)); + + menustate = tmpMenu->insertItem(i18n("Ma&ximize"), this, SLOT(maxApp())); + if ((info->state() & NET::Max) && !info->isMinimized()) tmpMenu->setItemChecked(menustate, true); + tmpMenu->setItemEnabled(menustate, info->actionSupported(NET::ActionMax)); + + menustate = tmpMenu->insertItem(i18n("&Shade"), this, SLOT(shadeApp())); + if (info->state() & NET::Shaded) tmpMenu->setItemChecked(menustate, true); + tmpMenu->setItemEnabled(menustate, info->actionSupported(NET::ActionShade)); + + //menustate = tmpMenu->insertItem(i18n("&Restore"), this, SLOT(restApp())); + //if (!info->isMinimized() && info->state() != NET::Max) tmpMenu->setItemEnabled(menustate, false); + + tmpMenu->insertItem(SmallIcon("forward"), i18n("&Move to Desktop"), deskpopup); + tmpMenu->insertSeparator(); + tmpMenu->insertItem(SmallIcon("fileclose"), i18n("&Close"), this, SLOT(closeApp())); +} + +void KoolDock::updTaskList() +{ + + if (!fShowNav) return; + + desks.setAutoDelete (true); + + //tasklist; menu to access every window throught navigation menu + int j, index, incr, nDesks; + KWin::WindowInfo tmpinfo; + + nDesks=KWin::numberOfDesktops(); + + tasklist->clear(); + desks.clear(); + + for(index=0; index<=nDesks; index++) + { + desks.append (new dInfo); + } + + KWin::WindowInfo info; + QValueList<WId>::ConstIterator it; + for (it=wm->windows().begin(); it != wm->windows().end(); ++it) + { + tmpinfo=KWin::windowInfo(*it); + + const int SUPPORTED_WINDOW_TYPES = NET::NormalMask | NET::DesktopMask | NET::DockMask | NET::ToolbarMask | NET::MenuMask | NET::DialogMask | NET::OverrideMask | NET::TopMenuMask | NET::UtilityMask | NET::SplashMask; + QString name = tmpinfo.visibleName(); + + if (tmpinfo.windowType(SUPPORTED_WINDOW_TYPES) == NET::Normal || tmpinfo.windowType(SUPPORTED_WINDOW_TYPES) == NET::Override || tmpinfo.windowType(SUPPORTED_WINDOW_TYPES) == NET::Dialog || tmpinfo.windowType(SUPPORTED_WINDOW_TYPES) == NET::Unknown) + { + if ((tmpinfo.state() & NET::SkipTaskbar) == 0) + { + if (ignored(tmpinfo.name()) == false) + { + index=tmpinfo.desktop(); + if (index==-1) index=0; + + incr=0; + + if (!desks.at(index)->gBool()) + { + desks.current()->sBool(true); + if (index==0) + {tasklist->insertTitle(i18n("All desktops"),-1,desks.current()->gInt());} + else + {tasklist->insertTitle(i18n("Desktop %1").arg(index),-1,desks.current()->gInt());} + incr++; + } + tasklist->insertItem(KWin::icon(*it), tmpinfo.visibleName(), *it, desks.current()->gInt()+incr); + incr++; + for(j=index; j<=nDesks; j++) + { + desks.at(j)->inc(incr); + } + } + } + } + } +} + +void KoolDock::addToTaskList(WId id) +{ + int i; + Item *item; + int index, rIndex, j, incr=0, decr=0; + KWin::WindowInfo tmpinfo; + tmpinfo=KWin::windowInfo(id); + nDesks=KWin::numberOfDesktops(); + rIndex = tmpinfo.desktop(); + + const int SUPPORTED_WINDOW_TYPES = NET::NormalMask | NET::DesktopMask | NET::DockMask | NET::ToolbarMask | NET::MenuMask | NET::DialogMask | NET::OverrideMask | NET::TopMenuMask | NET::UtilityMask | NET::SplashMask; + QString name = tmpinfo.visibleName(); + + if (tmpinfo.windowType(SUPPORTED_WINDOW_TYPES) == NET::Normal || tmpinfo.windowType(SUPPORTED_WINDOW_TYPES) == NET::Override || tmpinfo.windowType(SUPPORTED_WINDOW_TYPES) == NET::Dialog || tmpinfo.windowType(SUPPORTED_WINDOW_TYPES) == NET::Unknown) + { + if ((tmpinfo.state() & NET::SkipTaskbar) == 0) + { + if (ignored(tmpinfo.name()) == false) + { + + if (rIndex==0) return; + index=rIndex; + if (index==-1) index=0; + + if (!desks.at(index)->gBool()) + { + desks.at(index)->sBool(true); + if (index==0) + {tasklist->insertTitle(i18n("All desktops"),-1,desks.at(index)->gInt());} + else + {tasklist->insertTitle(i18n("Desktop %1").arg(index),-1,desks.at(index)->gInt());} + incr++; + } + else + { + if (fShowTaskbar) + { + for (i=witems.count(), item = witems.at(i); item; i--, item = witems.prev()) + { + if (item->getId()==id) break; + if (item->info.desktop()==rIndex) decr++; + } + } + } + tasklist->insertItem(KWin::icon(id), tmpinfo.visibleName(), id, desks.at(index)->gInt()+incr-decr); + incr++; + for(j=index; j<=nDesks; j++) + { + desks.at(j)->inc(incr); + } + } + } + } +} + +void KoolDock::rmFromTaskList(WId id) +{ + nDesks=KWin::numberOfDesktops(); + int i, j, k, dec=0; + int index=0; + i=tasklist->indexOf(id); + index=tasklist->idAt(i); + if (index==id) + { + tasklist->removeItem(id); + dec--; + for(j=0; j<=nDesks; j++) + { + if (desks.at(j)->gBool() && desks.at(j)->gInt()>=i+1) + { + if (desks.at(j)->gInt()==i+1) + { + if (tasklist->text(tasklist->idAt(i-1)).isNull() && tasklist->text(tasklist->idAt(i)).isNull()) + { + dec--; + desks.at(j)->sBool(false); + tasklist->removeItemAt(i-1); + } + } + for(k=j; k<=nDesks; k++) + { + desks.at(k)->inc(dec); + } + break; + } + } + } +} + |