24 #include "karamba_python.h"
25 #include "dcopinterface_stub.h"
26 #include "richtextlabel.h"
28 #include "karambaapp.h"
29 #include "themesdlg.h"
30 #include "lineparser.h"
31 #include "themelocale.h"
32 #include "superkarambasettings.h"
35 #include <tdemessagebox.h>
37 #include <tdelocale.h>
39 #include <kdirwatch.h>
41 #include <tdeparts/componentfactory.h>
42 #include <tdeparts/part.h>
45 #include <tqwidgetlist.h>
51 karamba::karamba(TQString fn, TQString name,
bool reloading,
int instance,
53 TQWidget(0,
"karamba", TQt::WGroupLeader | WStyle_Customize |
54 WRepaintNoErase| WStyle_NoBorder | WDestructiveClose ),
55 meterList(0), imageList(0), clickList(0), kpop(0), widgetMask(0),
56 config(0), tWinModule(0), tempUnit(
'C'), m_instance(instance),
57 sensorList(0), timeList(0),
58 themeConfMenu(0), toDesktopMenu(0), kglobal(0), clickPos(0, 0), accColl(0),
59 menuAccColl(0), toggleLocked(0), pythonIface(0), defaultTextField(0),
60 trayMenuSeperatorId(-1), trayMenuQuitId(-1), trayMenuToggleId(-1),
65 want_right_button =
false;
66 want_meter_wheel_event =
false;
68 m_sub_theme = sub_theme;
72 if(fn.find(
'/') == -1)
79 TQTimer::singleShot(100,
this, TQ_SLOT(killWidget()));
84 karambaApp->addKaramba(
this, reloading);
86 if(prettyName.isEmpty())
87 prettyName = TQString(
"%1 - %2").arg(m_theme.name()).arg(m_instance);
89 kdDebug() <<
"Starting theme: " << m_theme.name()
90 <<
" pretty name: " << prettyName << endl;
91 TQString qName =
"karamba - " + prettyName;
92 setName(qName.ascii());
94 KDirWatch *dirWatch = KDirWatch::self();
95 connect(dirWatch, TQ_SIGNAL( dirty(
const TQString & ) ),
96 TQ_SLOT( slotFileChanged(
const TQString & ) ) );
98 if(!dirWatch->contains(m_theme.file()))
99 dirWatch->addFile(m_theme.file());
101 if(!m_theme.isZipTheme() && m_theme.pythonModuleExists())
103 TQString pythonFile = m_theme.path() +
"/" + m_theme.pythonModule() +
".py";
104 if(!dirWatch->contains(pythonFile))
105 dirWatch->addFile(pythonFile);
111 TQString instanceString;
113 instanceString = TQString(
"-%1").arg(m_instance);
114 TQString cfg = TQDir::home().absPath() +
"/.superkaramba/"
115 + m_theme.id() + instanceString +
".rc";
116 kdDebug() << cfg << endl;
117 TQFile themeConfigFile(cfg);
119 if (!TQFileInfo(themeConfigFile).exists())
122 themeConfigFile.open(IO_ReadWrite);
123 themeConfigFile.close();
126 config =
new TDEConfig(cfg,
false,
false);
128 config -> setGroup(
"internal");
130 m_reloading = reloading;
131 if(m_theme.pythonModuleExists())
133 kdDebug() <<
"Loading python module: " << m_theme.pythonModule() << endl;
134 TQTimer::singleShot(0,
this, TQ_SLOT(initPythonInterface()));
138 info =
new NETWinInfo( tqt_xdisplay(), winId(), tqt_xrootwin(), NET::WMState );
141 tWinModule =
new TWinModule();
144 connect( tWinModule,TQ_SIGNAL(currentDesktopChanged(
int)),
this,
145 TQ_SLOT(currentDesktopChanged(
int)) );
146 connect( tdeApp, TQ_SIGNAL(backgroundChanged(
int)),
this,
147 TQ_SLOT(currentWallpaperChanged(
int)));
150 connect(&taskManager, TQ_SIGNAL(activeTaskChanged(
Task*)),
this,
151 TQ_SLOT(activeTaskChanged(
Task*)) );
152 connect(&taskManager, TQ_SIGNAL(taskAdded(
Task*)),
this,
153 TQ_SLOT(taskAdded(
Task*)) );
154 connect(&taskManager, TQ_SIGNAL(taskRemoved(
Task*)),
this,
155 TQ_SLOT(taskRemoved(
Task*)) );
156 connect(&taskManager, TQ_SIGNAL(startupAdded(
Startup*)),
this,
157 TQ_SLOT(startupAdded(
Startup*)) );
158 connect(&taskManager, TQ_SIGNAL(startupRemoved(
Startup*)),
this,
159 TQ_SLOT(startupRemoved(
Startup*)) );
161 themeConfMenu =
new TDEPopupMenu(
this);
162 themeConfMenu -> setCheckable(
true);
165 DesktopChangeSlot *dslot;
169 toDesktopMenu =
new TDEPopupMenu (
this);
170 toDesktopMenu -> setCheckable(
true);
171 mid = toDesktopMenu -> insertItem (i18n(
"&All Desktops"),
172 dslot =
new DesktopChangeSlot(
this,0),
174 dslot->setMenuId(mid);
176 toDesktopMenu -> insertSeparator();
177 for (
int ndesktop=1; ndesktop <= tWinModule->numberOfDesktops(); ndesktop++)
179 TQString name = i18n(
"Desktop &");
180 name += (
'0' + ndesktop);
182 mid = toDesktopMenu -> insertItem (name,
183 dslot =
new DesktopChangeSlot(
this, ndesktop), TQ_SLOT(receive()));
184 dslot->setMenuId(mid);
188 kpop =
new TDEPopupMenu(
this );
189 kpop -> setCheckable(
true);
191 accColl =
new TDEActionCollection(
this );
192 menuAccColl =
new TDEActionCollection(
this );
194 kpop->insertItem( SmallIconSet(
"reload"),i18n(
"Update"),
this,
195 TQ_SLOT(updateSensors()), Key_F5 );
196 toggleLocked =
new TDEToggleAction ( i18n(
"Toggle &Locked Position"),
197 SmallIconSet(
"locked"),
199 TQ_SLOT( slotToggleLocked() ),
200 accColl,
"Locked position" );
201 accColl->insert(toggleLocked);
202 toggleLocked -> setChecked(
true);
204 toggleLocked->plug(kpop);
206 toggleFastTransforms =
new TDEToggleAction(i18n(
"Use &Fast Image Scaling"),
208 TQ_SLOT( slotToggleFastTransforms() ),
209 accColl,
"Fast transformations");
211 accColl->insert(toggleFastTransforms);
212 toggleFastTransforms -> setChecked(
true);
214 toggleFastTransforms -> plug(kpop);
216 kpop->insertSeparator();
218 kpop->insertItem(i18n(
"Configure &Theme"), themeConfMenu, THEMECONF);
219 kpop->setItemEnabled(THEMECONF,
false);
220 kpop->insertItem(i18n(
"To Des&ktop"), toDesktopMenu);
222 kpop->insertItem( SmallIconSet(
"reload3"),i18n(
"&Reload Theme"),
this,
223 TQ_SLOT(reloadConfig()), CTRL+Key_R );
224 kpop->insertItem( SmallIconSet(
"window-close"),i18n(
"&Close This Theme"),
this,
225 TQ_SLOT(killWidget()), CTRL+Key_C );
227 if(!SuperKarambaSettings::showSysTray())
232 numberOfConfMenuItems = 0;
235 foundKaramba =
false;
238 fixedPosition =
false;
241 meterList =
new TQObjectList();
242 meterList->setAutoDelete(
true );
243 sensorList =
new TQObjectList();
244 sensorList->setAutoDelete(
true );
245 clickList =
new TQObjectList();
246 timeList =
new TQObjectList();
247 imageList =
new TQObjectList();
248 menuList =
new TQObjectList();
249 menuList->setAutoDelete(
true );
251 client = tdeApp->dcopClient();
252 if (!client->isAttached())
254 appId = client->registerAs(tqApp->name());
257 setBackgroundMode( NoBackground);
258 if( !(onTop || managed))
259 KWin::lowerWindow( winId() );
264 TQTimer::singleShot( 100,
this, TQ_SLOT(killWidget()) );
265 tqWarning(
"Could not read config file.");
274 bool locked = toggleLocked->isChecked();
275 locked = config->readBoolEntry(
"lockedPosition", locked);
276 toggleLocked->setChecked(locked);
279 if (!config -> readBoolEntry(
"fastTransforms",
true))
281 toggleFastTransforms -> setChecked(
false);
282 slotToggleFastTransforms();
285 desktop = config -> readNumEntry(
"desktop", desktop);
286 if (desktop > tWinModule->numberOfDesktops())
293 info->setDesktop( desktop );
296 info->setDesktop( NETWinInfo::OnAllDesktops);
299 config -> setGroup(
"theme");
300 if (config -> hasKey(
"widgetPosX") && config -> hasKey(
"widgetPosY"))
302 int xpos = config -> readNumEntry(
"widgetPosX");
303 int ypos = config -> readNumEntry(
"widgetPosY");
313 this->setMouseTracking(
true);
316 setFocusPolicy(TQWidget::StrongFocus);
323 karambaApp->deleteKaramba(
this, m_reloading);
326 if(m_theme.isValid())
337 if( sensorList != 0 )
364 delete themeConfMenu;
368 delete defaultTextField;
369 if (pythonIface != NULL)
373 bool karamba::parseConfig()
380 TQValueStack<TQPoint> offsetStack;
387 offsetStack.push(TQPoint(0,0));
389 while(m_theme.nextLine(lineParser))
391 x = lineParser.getInt(
"X") + offsetStack.top().x();
392 y = lineParser.getInt(
"Y") + offsetStack.top().y();
393 w = lineParser.getInt(
"W");
394 h = lineParser.getInt(
"H");
396 if(lineParser.meter() ==
"KARAMBA" && !foundKaramba )
399 toggleLocked->setChecked(lineParser.getBoolean(
"LOCKED"));
405 if( w == 0 || h == 0)
412 if(lineParser.getBoolean(
"RIGHT"))
414 TQDesktopWidget *d = TQApplication::desktop();
417 else if(lineParser.getBoolean(
"LEFT"))
422 if(lineParser.getBoolean(
"BOTTOM"))
424 TQDesktopWidget *d = TQApplication::desktop();
427 else if(lineParser.getBoolean(
"TOP"))
435 if(lineParser.getBoolean(
"ONTOP"))
438 KWin::setState( winId(), NET::StaysOnTop );
441 if(lineParser.getBoolean(
"MANAGED"))
444 reparent(0, TQt::WType_Dialog | WStyle_Customize | WStyle_NormalBorder
445 | WRepaintNoErase | WDestructiveClose, pos());
449 info->setState( NETWinInfo::SkipTaskbar
450 | NETWinInfo::SkipPager,NETWinInfo::SkipTaskbar
451 | NETWinInfo::SkipPager );
454 KWin::setState( winId(), NET::StaysOnTop );
459 if (lineParser.getBoolean(
"ONALLDESKTOPS"))
469 info->setDesktop( dfound );
471 if(lineParser.getBoolean(
"TOPBAR"))
474 KWin::setStrut( winId(), 0, 0, h, 0 );
475 toggleLocked->setChecked(
true );
477 toggleLocked->setEnabled(
false);
480 if(lineParser.getBoolean(
"BOTTOMBAR"))
482 int dh = TQApplication::desktop()->height();
484 KWin::setStrut( winId(), 0, 0, 0, h );
485 toggleLocked->setChecked(
true );
487 toggleLocked->setEnabled(
false);
490 if(lineParser.getBoolean(
"RIGHTBAR"))
492 int dw = TQApplication::desktop()->width();
494 KWin::setStrut( winId(), 0, w, 0, 0 );
495 toggleLocked->setChecked(
true );
497 toggleLocked->setEnabled(
false);
500 if(lineParser.getBoolean(
"LEFTBAR"))
503 KWin::setStrut( winId(), w, 0, 0, 0 );
504 toggleLocked->setChecked(
true );
506 toggleLocked->setEnabled(
false);
509 TQString path = lineParser.getString(
"MASK");
511 TQFileInfo info(path);
515 if( info.isRelative() )
517 absPath.setAscii(m_theme.path().ascii());
518 absPath.append(path.ascii());
519 ba = m_theme.readThemeFile(path);
523 absPath.setAscii(path.ascii());
524 ba = m_theme.readThemeFile(info.fileName());
526 if(m_theme.isZipTheme())
528 bmMask.loadFromData(ba);
532 bmMask.load(absPath);
536 m_interval = lineParser.getInt(
"INTERVAL");
537 m_interval = (m_interval == 0) ? 1000 : m_interval;
539 TQString temp = lineParser.getString(
"TEMPUNIT",
"C").upper();
540 tempUnit = temp.ascii()[0];
544 if(lineParser.meter() ==
"THEME")
546 TQString path = lineParser.getString(
"PATH");
547 TQFileInfo info(path);
548 if( info.isRelative())
549 path = m_theme.path() +
"/" + path;
550 (
new karamba( path, TQString() ))->show();
553 if(lineParser.meter() ==
"<GROUP>")
555 int offsetX = offsetStack.top().x();
556 int offsetY = offsetStack.top().y();
557 offsetStack.push( TQPoint( offsetX + lineParser.getInt(
"X"),
558 offsetY + lineParser.getInt(
"Y")));
561 if(lineParser.meter() ==
"</GROUP>")
566 if(lineParser.meter() ==
"CLICKAREA")
568 if( !hasMouseTracking() )
569 setMouseTracking(
true);
571 tmp->setOnClick(lineParser.getString(
"ONCLICK"));
573 setSensor(lineParser, (Meter*)tmp);
574 clickList->append( tmp );
575 if( lineParser.getBoolean(
"PREVIEW"))
576 meterList->append( tmp );
580 if(lineParser.meter() ==
"SENSOR=PROGRAM")
582 setSensor(lineParser, 0 );
585 if(lineParser.meter() ==
"IMAGE")
587 TQString file = lineParser.getString(
"PATH");
588 TQString file_roll = lineParser.getString(
"PATHROLL");
589 int xon = lineParser.getInt(
"XROLL");
590 int yon = lineParser.getInt(
"YROLL");
591 TQString tiptext = lineParser.getString(
"TOOLTIP");
592 TQString name = lineParser.getString(
"NAME");
593 bool bg = lineParser.getBoolean(
"BACKGROUND");
594 xon = ( xon <= 0 ) ? x:xon;
595 yon = ( yon <= 0 ) ? y:yon;
597 ImageLabel *tmp =
new ImageLabel(
this, x, y, 0, 0);
599 if(!file_roll.isEmpty())
600 tmp->parseImages(file, file_roll, x,y, xon, yon);
601 tmp->setBackground(bg);
603 tmp->setName(name.ascii());
604 if (!tiptext.isEmpty())
605 tmp->setTooltip(tiptext);
607 connect(tmp, TQ_SIGNAL(pixmapLoaded()),
this, TQ_SLOT(externalStep()));
608 setSensor(lineParser, (Meter*) tmp );
609 meterList->append (tmp );
610 imageList->append (tmp );
613 if(lineParser.meter() ==
"DEFAULTFONT" )
615 delete defaultTextField;
618 defaultTextField->setColor(lineParser.getColor(
"COLOR",
620 defaultTextField->setBGColor(lineParser.getColor(
"BGCOLOR",
622 defaultTextField->setFont(lineParser.getString(
"FONT",
"Helvetica"));
623 defaultTextField->setFontSize(lineParser.getInt(
"FONTSIZE", 12));
624 defaultTextField->setAlignment(lineParser.getString(
"ALIGN",
626 defaultTextField->setFixedPitch(lineParser.getBoolean(
"FIXEDPITCH",
628 defaultTextField->setShadow(lineParser.getInt(
"SHADOW", 0));
631 if(lineParser.meter() ==
"TEXT" ||
632 lineParser.meter() ==
"CLICKMAP" ||
633 lineParser.meter() ==
"RICHTEXT" ||
634 lineParser.meter() ==
"INPUT")
639 defTxt = *defaultTextField;
643 tmpText->setColor(lineParser.getColor(
"COLOR", defTxt.getColor()));
644 tmpText->setBGColor(lineParser.getColor(
"BGCOLOR",
645 defTxt.getBGColor()));
646 tmpText->setFont(lineParser.getString(
"FONT", defTxt.getFont()));
647 tmpText->setFontSize(lineParser.getInt(
"FONTSIZE",
648 defTxt.getFontSize()));
649 tmpText->setAlignment(lineParser.getString(
"ALIGN",
650 defTxt.getAlignmentAsString()));
651 tmpText->setFixedPitch(lineParser.getInt(
"FIXEDPITCH",
652 defTxt.getFixedPitch()));
654 tmpText->setShadow(lineParser.getInt(
"SHADOW", defTxt.getShadow()));
658 if(lineParser.meter() ==
"TEXT")
661 TextLabel *tmp =
new TextLabel(
this, x, y, w, h );
662 tmp->setTextProps(tmpText);
664 m_theme.locale()->translate(lineParser.getString(
"VALUE")));
666 TQString name = lineParser.getString(
"NAME");
668 tmp->setName(name.ascii());
670 setSensor(lineParser, (Meter*)tmp);
671 meterList->append ( tmp );
674 if(lineParser.meter() ==
"CLICKMAP")
676 if( !hasMouseTracking() )
677 setMouseTracking(
true);
679 tmp->setTextProps( tmpText );
681 setSensor(lineParser, (Meter*)tmp);
683 clickList -> append(tmp);
684 meterList->append( tmp );
688 if(lineParser.meter() ==
"RICHTEXT")
690 RichTextLabel *tmp =
new RichTextLabel(
this, x, y, w, h);
692 bool dUl = lineParser.getBoolean(
"UNDERLINE");
695 m_theme.locale()->translate(lineParser.getString(
"VALUE").ascii()), dUl);
696 tmp->setTextProps( tmpText );
700 TQString name = lineParser.getString(
"NAME");
702 tmp->setName(name.ascii());
704 setSensor(lineParser, (Meter*)tmp);
705 clickList -> append(tmp);
706 meterList->append ( tmp );
709 if(lineParser.meter() ==
"INPUT")
711 Input *tmp =
new Input(
this, x, y, w, h);
713 TQString name = lineParser.getString(
"NAME");
715 tmp->setName(name.ascii());
717 tmp->setTextProps(tmpText);
719 m_theme.locale()->translate(lineParser.getString(
"VALUE").ascii()));
721 meterList->append(tmp);
726 if(lineParser.meter() ==
"BAR")
728 Bar *tmp =
new Bar(
this, x, y, w, h );
729 tmp->setImage(lineParser.getString(
"PATH").ascii());
730 tmp->setVertical(lineParser.getBoolean(
"VERTICAL"));
731 tmp->setMax(lineParser.getInt(
"MAX", 100));
732 tmp->setMin(lineParser.getInt(
"MIN", 0));
733 tmp->setValue(lineParser.getInt(
"VALUE"));
734 TQString name = lineParser.getString(
"NAME");
736 tmp->setName(name.ascii());
737 setSensor(lineParser, (Meter*)tmp );
738 meterList->append ( tmp );
741 if(lineParser.meter() ==
"GRAPH")
743 int points = lineParser.getInt(
"POINTS");
745 Graph *tmp =
new Graph(
this, x, y, w, h, points);
746 tmp->setMax(lineParser.getInt(
"MAX", 100));
747 tmp->setMin(lineParser.getInt(
"MIN", 0));
748 TQString name = lineParser.getString(
"NAME");
750 tmp->setName(name.ascii());
752 tmp->setColor(lineParser.getColor(
"COLOR"));
754 setSensor(lineParser, (Graph*)tmp);
755 meterList->append ( tmp );
759 if(passive && !managed)
763 KWin::setType(winId(), NET::Dock);
764 KWin::setState(winId(), NET::KeepBelow);
783 void karamba::start()
785 m_sysTimer =
new TQTimer(
this);
787 connect(m_sysTimer, TQ_SIGNAL(timeout()), TQ_SLOT(step()));
789 m_sysTimer->start(m_interval);
792 TQTimer::singleShot( 0,
this, TQ_SLOT(step()) );
794 if( !(onTop || managed) )
798 void karamba::makeActive()
800 KWin::setType(winId(), NET::Normal);
801 KWin::setState(winId(), NET::Modal);
804 void karamba::makePassive()
810 for (meter = meterList->first(); meter; meter = meterList->next())
812 if((meter)->isA(
"Input"))
818 KWin::setType(winId(), NET::Dock);
819 KWin::setState(winId(), NET::KeepBelow);
822 void karamba::popupNotify(
int)
827 void karamba::reloadConfig()
833 TQFileInfo fileInfo( m_theme.file() );
834 (
new karamba(m_theme.file(), fileInfo.baseName(),
true, m_instance))->show();
839 void karamba::closeTheme(
bool reloading)
841 m_reloading = reloading;
845 void karamba::killWidget()
850 void karamba::initPythonInterface()
852 pythonIface =
new KarambaPython(m_theme, m_reloading);
855 void karamba::editConfig()
858 TQFileInfo fileInfo( m_theme.file() );
861 if( fileInfo.isRelative() )
863 path = m_theme.path() +
"/" + m_theme.file();
867 path = m_theme.file();
870 KRun::runURL( KURL( path ),
"text/plain" );
873 void karamba::editScript()
876 TQFileInfo fileInfo( m_theme.file() );
879 if( fileInfo.isRelative() )
881 path = m_theme.path() +
"/" + m_theme.name() +
".py";
885 path = TQFileInfo(m_theme.file()).dirPath() +
"/" + m_theme.name() +
".py";
887 KRun::runURL( KURL( path ),
"text/plain" );
890 TQString karamba::findSensorFromMap(Sensor* sensor)
893 TQMap<TQString,Sensor*>::ConstIterator it;
894 TQMap<TQString,Sensor*>::ConstIterator end( sensorMap.end() );
895 for ( it = sensorMap.begin(); it != end; ++it )
897 if (it.data() == sensor)
903 Sensor* karamba::findSensorFromList(Meter* meter)
906 TQObjectListIt it( *sensorList );
910 if (((Sensor*) *it)->hasMeter(meter))
911 return ((Sensor*)*it);
917 TQString karamba::getSensor(Meter* meter)
921 Sensor* sensor = findSensorFromList(meter);
923 s = findSensorFromMap(sensor);
927 void karamba::deleteMeterFromSensors(Meter* meter)
930 Sensor* sensor = findSensorFromList(meter);
934 sensor->deleteMeter(meter);
935 if (sensor->isEmpty())
937 TQString s = findSensorFromMap(sensor);
939 sensorList->removeRef(sensor);
944 void karamba::setSensor(
const LineParser& lineParser, Meter* meter)
949 deleteMeterFromSensors(meter);
951 TQString sens = lineParser.getString(
"SENSOR").upper();
955 TQString cpuNbr = lineParser.getString(
"CPU");
956 sensor = sensorMap[
"CPU"+cpuNbr];
959 int interval = lineParser.getInt(
"INTERVAL");
960 interval = (interval == 0)?1000:interval;
961 sensor = ( sensorMap[
"CPU"+cpuNbr] =
new CPUSensor( cpuNbr, interval ) );
962 sensorList->append( sensor );
965 sp->addParam(
"FORMAT",
966 m_theme.locale()->translate(lineParser.getString(
"FORMAT").ascii()));
967 sp->addParam(
"DECIMALS",lineParser.getString(
"DECIMALS"));
969 sensor->addMeter(sp);
970 sensor->setMaxValue(sp);
976 TQString gpuId = lineParser.getString(
"GPU");
977 TQString gpuDriver = lineParser.getString(
"DRIVER");
978 TQString sensorId = TQString(
"GPU_%1_%2").arg(gpuDriver, gpuId);
979 sensor = sensorMap[sensorId];
982 int interval = lineParser.getInt(
"INTERVAL");
983 interval = (interval == 0) ? 1000 : interval;
984 sensor = (sensorMap[sensorId] =
new GPUSensor(gpuDriver, gpuId, interval));
985 sensorList->append(sensor);
989 sp->addParam(
"FORMAT", m_theme.locale()->translate(lineParser.getString(
"FORMAT").ascii()));
990 sensor->addMeter(sp);
991 sensor->setMaxValue(sp);
994 if( sens ==
"MEMORY" )
996 sensor = sensorMap[
"MEMORY"];
999 int interval = lineParser.getInt(
"INTERVAL");
1000 interval = (interval == 0)?3000:interval;
1001 sensor = ( sensorMap[
"MEMORY"] =
new MemSensor( interval ) );
1002 sensorList->append( sensor );
1005 sp->addParam(
"FORMAT",
1006 m_theme.locale()->translate(lineParser.getString(
"FORMAT").ascii()));
1008 sensor->addMeter(sp);
1009 sensor->setMaxValue(sp);
1013 if( sens ==
"DISK" )
1015 sensor = sensorMap[
"DISK"];
1018 int interval = lineParser.getInt(
"INTERVAL");
1019 interval = (interval == 0)?5000:interval;
1020 sensor = ( sensorMap[
"DISK"] =
new DiskSensor( interval ) );
1021 connect( sensor, TQ_SIGNAL(initComplete()),
this, TQ_SLOT(externalStep()) );
1022 sensorList->append( sensor );
1026 TQString mntPt = lineParser.getString(
"MOUNTPOINT");
1027 if( mntPt.isEmpty() )
1033 if( mntPt.length() > 1 && mntPt.endsWith(
"/") )
1035 mntPt.remove( mntPt.length()-1, 1 );
1037 sp->addParam(
"MOUNTPOINT",mntPt);
1038 sp->addParam(
"FORMAT",
1039 m_theme.locale()->translate(lineParser.getString(
"FORMAT").ascii()));
1040 sensor->addMeter(sp);
1041 sensor->setMaxValue(sp);
1044 if( sens ==
"NETWORK")
1046 int interval = lineParser.getInt(
"INTERVAL");
1047 interval = (interval == 0)?2000:interval;
1048 TQString device = lineParser.getString(
"DEVICE");
1049 sensor = sensorMap[
"NETWORK"+device];
1052 sensor = ( sensorMap[
"NETWORK"+device] =
1053 new NetworkSensor(device, interval));
1054 sensorList->append( sensor );
1057 sp->addParam(
"FORMAT",
1058 m_theme.locale()->translate(lineParser.getString(
"FORMAT").ascii()));
1059 sp->addParam(
"DECIMALS", lineParser.getString(
"DECIMALS"));
1060 sensor->addMeter(sp);
1063 if( sens ==
"UPTIME" )
1065 sensor = sensorMap[
"UPTIME"];
1068 int interval = lineParser.getInt(
"INTERVAL");
1069 interval = (interval == 0)?60000:interval;
1070 sensor = ( sensorMap[
"UPTIME"] =
new UptimeSensor( interval ));
1071 sensorList->append( sensor );
1075 sp->addParam(
"FORMAT",
1076 m_theme.locale()->translate(lineParser.getString(
"FORMAT").ascii()));
1077 sensor->addMeter(sp);
1080 if( sens ==
"SENSOR" )
1082 sensor = sensorMap[
"SENSOR"];
1085 int interval = lineParser.getInt(
"INTERVAL");
1086 interval = (interval == 0)?30000:interval;
1087 sensor = (sensorMap[
"SENSOR"] =
new SensorSensor(interval, tempUnit));
1088 sensorList->append( sensor );
1091 sp->addParam(
"FORMAT",
1092 m_theme.locale()->translate(lineParser.getString(
"FORMAT").ascii()));
1093 sp->addParam(
"TYPE", lineParser.getString(
"TYPE"));
1094 sensor->addMeter(sp);
1098 if( sens ==
"TEXTFILE" )
1100 TQString path = lineParser.getString(
"PATH");
1101 bool rdf = lineParser.getBoolean(
"RDF");
1102 sensor = sensorMap[
"TEXTFILE"+path];
1105 int interval = lineParser.getInt(
"INTERVAL");
1106 interval = ( interval == 0 )?60000:interval;
1107 TQString encoding = lineParser.getString(
"ENCODING");
1109 sensor = ( sensorMap[
"TEXTFILE"+path] =
1111 sensorList->append( sensor );
1114 sp->addParam(
"LINE",TQString::number(lineParser.getInt(
"LINE")));
1115 sensor->addMeter(sp);
1121 sensor = sensorMap[
"DATE"];
1124 int interval = lineParser.getInt(
"INTERVAL");
1125 interval = (interval == 0)?60000:interval;
1126 sensor = ( sensorMap[
"DATE"] =
new DateSensor( interval ) );
1127 sensorList->append( sensor );
1128 timeList->append( sensor );
1131 sp->addParam(
"FORMAT",
1132 m_theme.locale()->translate(lineParser.getString(
"FORMAT").ascii()));
1133 sp->addParam(
"CALWIDTH",lineParser.getString(
"CALWIDTH"));
1134 sp->addParam(
"CALHEIGHT",lineParser.getString(
"CALHEIGHT"));
1135 sensor->addMeter(sp);
1140 if( sens ==
"XMMS" )
1142 sensor = sensorMap[
"XMMS"];
1145 int interval = lineParser.getInt(
"INTERVAL");
1146 interval = (interval == 0)?1000:interval;
1147 TQString encoding = lineParser.getString(
"ENCODING");
1149 sensor = ( sensorMap[
"XMMS"] =
new XMMSSensor( interval, encoding ) );
1150 sensorList->append( sensor );
1153 sp->addParam(
"FORMAT",
1154 m_theme.locale()->translate(lineParser.getString(
"FORMAT").ascii()));
1155 sensor->addMeter(sp);
1156 sensor->setMaxValue(sp);
1161 if( sens ==
"NOATUN" )
1163 sensor = sensorMap[
"NOATUN"];
1166 int interval = lineParser.getInt(
"INTERVAL");
1167 interval = (interval == 0)?1000:interval;
1168 sensor = ( sensorMap[
"NOATUN"] =
new NoatunSensor( interval, client ) );
1169 sensorList->append( sensor );
1172 sp->addParam(
"FORMAT",
1173 m_theme.locale()->translate(lineParser.getString(
"FORMAT").ascii()));
1174 sensor->addMeter(sp);
1175 sensor->setMaxValue(sp);
1178 if( sens ==
"PROGRAM")
1180 TQString progName = lineParser.getString(
"PROGRAM");
1181 sensor = sensorMap[
"PROGRAM"+progName];
1184 int interval = lineParser.getInt(
"INTERVAL");
1185 interval = (interval == 0)?3600000:interval;
1186 TQString encoding = lineParser.getString(
"ENCODING");
1188 sensor = (sensorMap[
"PROGRAM"+progName] =
1189 new ProgramSensor( progName, interval, encoding ) );
1190 sensorList->append( sensor );
1193 sp->addParam(
"LINE", TQString::number(lineParser.getInt(
"LINE")));
1194 sp->addParam(
"THEMAPATH", m_theme.path() );
1195 sensor->addMeter(sp);
1200 TQString source = lineParser.getString(
"SOURCE");
1202 m_theme.locale()->translate(lineParser.getString(
"FORMAT").ascii());
1204 sensor = sensorMap[
"RSS"+source];
1207 int interval = lineParser.getInt(
"INTERVAL");
1208 interval = ( interval == 0 )?60000:interval;
1209 TQString encoding = lineParser.getString(
"ENCODING");
1211 sensor = ( sensorMap[
"RSS"+source] =
1212 new RssSensor( source, interval, format, encoding ) );
1213 sensorList->append( sensor );
1216 sp->addParam(
"SOURCE",lineParser.getString(
"SOURCE"));
1217 sensor->addMeter(sp);
1222 TQTimer::singleShot( 0, sensor, TQ_SLOT(update()) );
1227 void karamba::slotFileChanged(
const TQString & file)
1231 TQString pythonFile = m_theme.path() +
"/" + m_theme.pythonModule() +
".py";
1233 if(file == m_theme.file() || file == pythonFile)
1237 void karamba::passMenuOptionChanged(TQString key,
bool value)
1240 if (pythonIface && pythonIface->isExtensionLoaded())
1241 pythonIface->menuOptionChanged(
this, key, value);
1244 void karamba::setIncomingData(TQString theme, TQString obj)
1246 KarambaApplication* app = (KarambaApplication*)tqApp;
1248 kdDebug() <<
"karamba::setIncomingData " << theme << obj << endl;
1256 DCOPClient *c = tdeApp->dcopClient();
1257 if (!c->isAttached())
1261 app->dcopStub()->setIncomingData(theme, obj);
1264 void karamba::callTheme(TQString theme, TQString txt)
1266 KarambaApplication* app = (KarambaApplication*)tqApp;
1267 kdDebug() <<
"karamba::callTheme " << theme << txt << endl;
1276 DCOPClient *c = tdeApp->dcopClient();
1277 if (!c->isAttached())
1281 app->dcopStub()->themeNotify(theme, txt);
1284 void karamba::themeNotify(TQString theme, TQString txt)
1286 kdDebug() <<
"karamba::themeNotify" << theme << txt << endl;
1287 if (pythonIface->isExtensionLoaded())
1289 pythonIface->themeNotify(
this, theme.ascii(), txt.ascii());
1293 void karamba::meterClicked(TQMouseEvent* e, Meter* meter)
1296 if (pythonIface && pythonIface->isExtensionLoaded() && haveUpdated)
1300 if( e->button() == TQt::LeftButton )
1302 else if( e->button() == TQt::MidButton )
1304 else if( e->button() == TQt::RightButton )
1307 if (RichTextLabel* richText =
dynamic_cast<RichTextLabel*
>(meter))
1309 pythonIface->meterClicked(
this, richText->anchorAt(e->x(), e->y()),
1314 pythonIface->meterClicked(
this, meter, button);
1319 void karamba::changeInterval(
int interval)
1321 if (m_sysTimer != NULL)
1322 m_sysTimer->changeInterval(interval);
1325 void karamba::passClick(TQMouseEvent *e)
1328 TQObjectListIt it2( *timeList );
1331 (( DateSensor* ) *it2)->toggleCalendar( e );
1338 TQObjectList clickListTmp(*clickList);
1339 TQObjectListIt it(clickListTmp);
1342 Meter* meter = (Meter*)(*it);
1344 if (clickList->containsRef(meter) && meter->click(e))
1347 meterClicked(e, meter);
1353 if (pythonIface && pythonIface->isExtensionLoaded() && haveUpdated)
1357 if( e->button() == TQt::LeftButton )
1359 else if( e->button() == TQt::MidButton )
1361 else if( e->button() == TQt::RightButton )
1364 pythonIface->widgetClicked(
this, e->x(), e->y(), button);
1368 void karamba::passWheelClick( TQWheelEvent *e )
1372 if (pythonIface && pythonIface->isExtensionLoaded() && haveUpdated)
1376 if( e->delta() > 0 )
1383 if (want_meter_wheel_event)
1385 TQObjectList clickListTmp(*clickList);
1386 TQObjectListIt it(clickListTmp);
1388 TQMouseEvent fakeEvent(TQEvent::MouseButtonPress, e->pos(), e->globalPos(), button, e->state());
1392 Meter* meter = (Meter*)(*it);
1394 if (clickList->containsRef(meter) && meter->click(&fakeEvent))
1396 if (RichTextLabel* richText =
dynamic_cast<RichTextLabel*
>(meter))
1398 pythonIface->meterClicked(
this, richText->anchorAt(fakeEvent.x(), fakeEvent.y()),
1403 pythonIface->meterClicked(
this, meter, button);
1410 pythonIface->widgetClicked(
this, e->x(), e->y(), button);
1414 void karamba::management_popup(
void )
1416 kpop->popup(TQCursor::pos());
1419 void karamba::mousePressEvent( TQMouseEvent *e )
1422 if( e->button() == TQt::RightButton && !want_right_button )
1428 clickPos = e->pos();
1429 if( toggleLocked -> isChecked() )
1431 if( !(onTop || managed))
1432 KWin::lowerWindow( winId() );
1436 void karamba::wheelEvent( TQWheelEvent *e )
1439 passWheelClick( e );
1442 void karamba::mouseReleaseEvent( TQMouseEvent *e )
1445 clickPos = e->pos();
1448 void karamba::mouseDoubleClickEvent( TQMouseEvent *e )
1451 if( !toggleLocked -> isChecked() )
1457 void karamba::keyPressEvent(TQKeyEvent *e)
1460 keyPressed(e->text(), 0);
1463 void karamba::keyPressed(
const TQString& s,
const Meter* meter)
1465 if (pythonIface && pythonIface->isExtensionLoaded())
1466 pythonIface->keyPressed(
this, meter, s);
1469 void karamba::mouseMoveEvent( TQMouseEvent *e )
1472 if( e->state() != 0 && e->state() < 16 && !toggleLocked -> isChecked() )
1474 move( e->globalPos() - clickPos );
1479 TQObjectListIt it(*clickList);
1480 bool insideArea =
false;
1484 insideArea = ((Meter*)(*it)) -> insideActiveArea(e -> x(), e ->y());
1494 if( cursor().shape() != PointingHandCursor )
1495 setCursor( PointingHandCursor );
1499 if( cursor().shape() != ArrowCursor )
1500 setCursor( ArrowCursor );
1503 TQObjectListIt image_it( *imageList);
1504 while ( image_it != 0 )
1506 ((ImageLabel*) *image_it)->rolloverImage(e);
1511 if (pythonIface && pythonIface->isExtensionLoaded())
1519 if( e->state() == TQt::LeftButton)
1522 else if( e->state() == TQt::MidButton )
1525 else if( e->state() == TQt::RightButton )
1528 pythonIface->widgetMouseMoved(
this, e->x(), e->y(), button);
1532 void karamba::closeEvent ( TQCloseEvent * qc)
1540 void karamba::paintEvent ( TQPaintEvent *e)
1545 if( !(onTop || managed))
1547 if( lowerTimer.elapsed() > 100 )
1549 KWin::lowerWindow( winId() );
1550 lowerTimer.restart();
1553 TQRect rect = e->rect();
1554 bitBlt(
this,rect.topLeft(),&pm,rect,TQt::CopyROP);
1557 void karamba::updateSensors()
1560 TQObjectListIt it( *sensorList );
1563 ((Sensor*) *it)->update();
1566 TQTimer::singleShot( 500,
this, TQ_SLOT(step()) );
1569 void karamba::updateBackground(TDESharedPixmap* kpm)
1577 themeStarted =
true;
1580 background = TQPixmap(*kpm);
1582 TQPixmap buffer = TQPixmap(size());
1584 pm = TQPixmap(size());
1585 buffer.fill(TQt::black);
1587 TQObjectListIt it( *imageList );
1589 bitBlt(&buffer,0,0,&background,0,TQt::CopyROP);
1593 if (((ImageLabel*) *it)->background == 1)
1595 ((ImageLabel*) *it)->mUpdate(&p, 1);
1601 bitBlt(&pm,0,0,&buffer,0,TQt::CopyROP);
1604 TQPixmap buffer2 = TQPixmap(size());
1606 pm = TQPixmap(size());
1607 buffer2.fill(TQt::black);
1609 TQObjectListIt it2( *meterList );
1611 bitBlt(&buffer2,0,0,&background,0,TQt::CopyROP);
1615 ((Meter*) *it2)->mUpdate(&p);
1620 bitBlt(&pm,0,0,&buffer2,0,TQt::CopyROP);
1623 systray->updateBackgroundPixmap(buffer2);
1628 void karamba::currentDesktopChanged(
int i )
1631 kroot->repaint(
true );
1632 if (pythonIface && pythonIface->isExtensionLoaded())
1633 pythonIface->desktopChanged(
this, i);
1636 void karamba::currentWallpaperChanged(
int i )
1639 kroot->repaint(
true );
1640 if (pythonIface && pythonIface->isExtensionLoaded())
1641 pythonIface->wallpaperChanged(
this, i);
1644 void karamba::externalStep()
1649 TQPixmap buffer = TQPixmap(size());
1651 pm = TQPixmap(size());
1652 buffer.fill(TQt::black);
1654 TQObjectListIt it( *meterList );
1656 bitBlt(&buffer,0,0,&background,0,TQt::CopyROP);
1660 ((Meter*) *it)->mUpdate(&p);
1665 bitBlt(&pm,0,0,&buffer,0,TQt::CopyROP);
1670 void karamba::step()
1673 if (widgetUpdate && haveUpdated)
1675 pm = TQPixmap(size());
1676 TQPixmap buffer = TQPixmap(size());
1677 buffer.fill(TQt::black);
1679 TQObjectListIt it( *meterList );
1682 bitBlt(&buffer,0,0,&background,0,TQt::CopyROP);
1686 ((Meter*) *it)->mUpdate(&p);
1691 bitBlt(&pm,0,0,&buffer,0,TQt::CopyROP);
1695 if (pythonIface && pythonIface->isExtensionLoaded())
1698 pythonIface->initWidget(
this);
1700 pythonIface->widgetUpdated(
this);
1706 void karamba::widgetClosed()
1709 if (pythonIface && pythonIface->isExtensionLoaded())
1710 pythonIface->widgetClosed(
this);
1713 void karamba::slotToggleLocked()
1716 if(toggleLocked->isChecked())
1718 toggleLocked->setIconSet(SmallIconSet(
"system-lock-screen"));
1722 toggleLocked->setIconSet(SmallIconSet(
"move"));
1726 void karamba::slotToggleFastTransforms()
1744 bool karamba::useSmoothTransforms()
1747 return !toggleFastTransforms -> isChecked();
1750 void karamba::writeConfigData()
1753 config -> setGroup(
"internal");
1754 config -> writeEntry(
"lockedPosition", toggleLocked -> isChecked() );
1755 config -> writeEntry(
"fastTransforms", toggleFastTransforms -> isChecked() );
1756 config -> writeEntry(
"desktop", desktop );
1757 config -> setGroup(
"theme");
1759 config -> writeEntry(
"widgetPosX", x());
1760 config -> writeEntry(
"widgetPosY", y());
1762 config -> writeEntry(
"widgetWidth", width());
1763 config -> writeEntry(
"widgetHeight", height());
1771 void karamba::slotToggleConfigOption(TQString key,
bool value)
1774 config -> setGroup(
"config menu");
1775 config -> writeEntry(key, value);
1776 passMenuOptionChanged(key, value);
1779 void karamba::addMenuConfigOption(TQString key, TQString name)
1782 kpop -> setItemEnabled(THEMECONF,
true);
1785 TDEToggleAction* confItem =
new TDEToggleAction (name, TDEShortcut::null(),
1786 action, TQ_SLOT(receive()),
1787 menuAccColl, key.ascii());
1788 confItem -> setName(key.ascii());
1790 menuAccColl -> insert(confItem);
1792 connect(action, TQ_SIGNAL( enabled(TQString,
bool) ),
1793 this, TQ_SLOT( slotToggleConfigOption(TQString,
bool) ));
1795 config -> setGroup(
"config menu");
1796 confItem -> setChecked(config -> readBoolEntry(key));
1798 confItem -> plug(themeConfMenu);
1800 numberOfConfMenuItems++;
1803 bool karamba::setMenuConfigOption(TQString key,
bool value)
1806 TDEToggleAction* menuAction = ((TDEToggleAction*)menuAccColl -> action(key.ascii()));
1807 if (menuAction == NULL)
1809 tqWarning(
"Menu action %s not found.", key.ascii());
1814 menuAction -> setChecked(value);
1819 bool karamba::readMenuConfigOption(TQString key)
1822 TDEToggleAction* menuAction = ((TDEToggleAction*)menuAccColl -> action(key.ascii()));
1823 if (menuAction == NULL)
1825 tqWarning(
"Menu action %s not found.", key.ascii());
1830 return menuAction -> isChecked();
1834 void karamba::passMenuItemClicked(
int id)
1838 if (pythonIface && pythonIface->isExtensionLoaded())
1840 TDEPopupMenu* menu = 0;
1841 for(
int i = 0; i < (int)menuList->count(); i++)
1846 tmp = (TDEPopupMenu*) menuList->first();
1850 tmp = (TDEPopupMenu*) menuList->next();
1854 if(tmp->isItemVisible(
id))
1861 pythonIface->menuItemClicked(
this, menu,
id);
1865 void karamba::activeTaskChanged(
Task* t)
1869 if (pythonIface && pythonIface->isExtensionLoaded())
1870 pythonIface->activeTaskChanged(
this, t);
1873 void karamba::taskAdded(
Task* t)
1877 if (pythonIface && pythonIface->isExtensionLoaded())
1878 pythonIface->taskAdded(
this, t);
1881 void karamba::taskRemoved(
Task* t)
1885 if (pythonIface && pythonIface->isExtensionLoaded())
1886 pythonIface->taskRemoved(
this, t);
1889 void karamba::startupAdded(
Startup* t)
1893 if (pythonIface && pythonIface->isExtensionLoaded())
1894 pythonIface->startupAdded(
this, t);
1897 void karamba::startupRemoved(
Startup* t)
1901 if (pythonIface && pythonIface->isExtensionLoaded())
1902 pythonIface->startupRemoved(
this, t);
1905 void karamba::processExited (TDEProcess* proc)
1908 if (pythonIface && pythonIface->isExtensionLoaded())
1909 pythonIface->commandFinished(
this, (
int)proc->pid());
1912 void karamba::receivedStdout (TDEProcess *proc,
char *buffer,
int)
1916 if (pythonIface && pythonIface->isExtensionLoaded())
1917 pythonIface->commandOutput(
this, (
int)proc->pid(), buffer);
1921 void karamba::saveProperties(TDEConfig* config)
1924 config->setGroup(
"session");
1925 config->writeEntry(
"theme", m_theme.file());
1930 void karamba::readProperties(TDEConfig* config)
1933 config->setGroup(
"session");
1934 TQString atheme = config->readEntry(
"theme");
1938 void karamba::dragEnterEvent(TQDragEnterEvent* event)
1941 event->accept(TQTextDrag::canDecode(event));
1945 void karamba::dropEvent(TQDropEvent* event)
1950 if ( TQTextDrag::decode(event, text) )
1953 if (pythonIface && pythonIface->isExtensionLoaded())
1955 const TQPoint &p =
event->pos();
1956 pythonIface->itemDropped(
this, text, p.x(), p.y());
1961 void karamba::toDesktop(
int id,
int menuid)
1969 int mid = toDesktopMenu->idAt(i);
1973 toDesktopMenu->setItemChecked(mid,
false);
1975 toDesktopMenu->setItemChecked(menuid,
true);
1978 info->setDesktop( desktop);
1980 info->setDesktop( NETWinInfo::OnAllDesktops );
1983 void karamba::systrayUpdated()
1986 if (pythonIface && pythonIface->isExtensionLoaded())
1987 pythonIface->systrayUpdated(
this);
1990 void karamba::toggleWidgetUpdate(
bool b)
1993 if (pythonIface && pythonIface->isExtensionLoaded())
1997 SignalBridge::SignalBridge(TQObject* parent, TQString name, TDEActionCollection* ac)
1998 : TQObject(parent, name.ascii()), collection(ac)
2000 setName(name.ascii());
2003 void SignalBridge::receive()
2005 emit enabled(name(), ((TDEToggleAction*)collection -> action(name())) ->
2009 DesktopChangeSlot::DesktopChangeSlot(TQObject *parent,
int id)
2010 : TQObject(parent,
"")
2015 void DesktopChangeSlot::receive()
2017 karamba *k = (karamba *)parent();
2021 k->toDesktop(desktopid, menuid);
2024 void DesktopChangeSlot::setMenuId(
int id)
2029 int DesktopChangeSlot::menuId()
2034 void karamba::showMenuExtension()
2036 kglobal =
new TDEPopupMenu(
this);
2038 trayMenuToggleId = kglobal->insertItem(SmallIconSet(
"superkaramba"),
2039 i18n(
"Show System Tray Icon"),
this,
2040 TQ_SLOT(slotToggleSystemTray()),
2043 trayMenuThemeId = kglobal->insertItem(SmallIconSet(
"knewstuff"),
2044 i18n(
"&Manage Themes..."),
this,
2045 TQ_SLOT(slotShowTheme()), CTRL+Key_M);
2047 trayMenuQuitId = kglobal->insertItem(SmallIconSet(
"system-log-out"),
2048 i18n(
"&Quit SuperKaramba"),
this,
2049 TQ_SLOT(slotQuit()), CTRL+Key_Q);
2053 trayMenuSeperatorId = kpop->insertSeparator();
2054 kpop->insertItem(
"SuperKaramba", kglobal);
2057 void karamba::hideMenuExtension()
2061 kpop->removeItem(trayMenuSeperatorId);
2062 kglobal->removeItem(trayMenuToggleId);
2063 kglobal->removeItem(trayMenuThemeId);
2064 kglobal->removeItem(trayMenuQuitId);
2071 void karamba::slotToggleSystemTray()
2073 karambaApp->globalHideSysTray(
false);
2076 void karamba::slotQuit()
2078 karambaApp->globalQuitSuperKaramba();
2081 void karamba::slotShowTheme()
2083 karambaApp->globalShowThemeDialog();
2086 void karamba::setAlwaysOnTop(
bool stay)
2091 KWin::setState( winId(), NET::KeepAbove );
2096 KWin::setState( winId(), NET::KeepBelow );
2100 #include "karamba.moc"
SignalBridge is an ungulate that lives in the forests of wild Wisconsin.
Represents a task which is in the process of starting.
A dynamic interface to a task (main window).