summaryrefslogtreecommitdiffstats
path: root/src/kooldock.cpp
diff options
context:
space:
mode:
authorSlávek Banko <slavek.banko@axis.cz>2015-10-01 17:05:29 +0200
committerSlávek Banko <slavek.banko@axis.cz>2015-10-01 17:05:29 +0200
commit39f2c6a84cd715b11fb3ffa82a86abf2fb9bcd70 (patch)
treed6bc97f38d36892b14703c788cef782f13ee2a4d /src/kooldock.cpp
downloadkooldock-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.cpp3848
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;
+ }
+ }
+ }
+}
+