/************************************************************************** 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 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include // for "renicing" the bar #include #include #include "kooldock.h" #include #include #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 #include #include 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("
Welcome
It appears to be the first time you run KoolDock.
" "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.
" "Right click on the dock for a menu that allows you to configure it
" "or run with -o parameter to have preferences window at start.
" "We hope this software is usefull for you
-- 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 (w0) 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 (oldtmpwdw) 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 (Xpos0) { 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()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; indexinsertItem(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; iinsertItem(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 (w1isActive() || (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()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 (iwBigstop(); 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 (iwBigzoomVal) { 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("The program name or command %1\n" "cannot be found. Please correct the command\n" "or URL and try again").arg( cmd ) ); return; } } if(KRun::runCommand( cmd, exec, "" )) { return; } else { KMessageBox::sorry( 0, i18n("Could not run %1.\nPlease correct" " the command or URL and try again.").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::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;idw) {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()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=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; isetEnabled(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 (w1resize(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::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; } } } }