24#include "karamba_python.h"
25#include "dcopinterface_stub.h"
26#include "richtextlabel.h"
28#include "karambaapp.h"
30#include "lineparser.h"
31#include "themelocale.h"
32#include "superkarambasettings.h"
35#include <tdemessagebox.h>
39#include <tdeversion.h>
42#include <tdeparts/componentfactory.h>
43#include <tdeparts/part.h>
46#include <tqwidgetlist.h>
52karamba::karamba(TQString fn, TQString name,
bool reloading,
int instance,
54 TQWidget(0,
"karamba", TQt::WGroupLeader | WStyle_Customize |
55 WRepaintNoErase| WStyle_NoBorder | WDestructiveClose ),
56 meterList(0), imageList(0), clickList(0), kpop(0), widgetMask(0),
57 config(0), kWinModule(0), tempUnit(
'C'), m_instance(instance),
58 sensorList(0), timeList(0),
59 themeConfMenu(0), toDesktopMenu(0), kglobal(0), clickPos(0, 0), accColl(0),
60 menuAccColl(0), toggleLocked(0), pythonIface(0), defaultTextField(0),
61 trayMenuSeperatorId(-1), trayMenuQuitId(-1), trayMenuToggleId(-1),
66 want_right_button =
false;
67 want_meter_wheel_event =
false;
69 m_sub_theme = sub_theme;
73 if(fn.find(
'/') == -1)
80 TQTimer::singleShot(100,
this, TQ_SLOT(killWidget()));
85 karambaApp->addKaramba(
this, reloading);
87 if(prettyName.isEmpty())
88 prettyName = TQString(
"%1 - %2").arg(m_theme.name()).arg(m_instance);
90 kdDebug() <<
"Starting theme: " << m_theme.name()
91 <<
" pretty name: " << prettyName << endl;
92 TQString qName =
"karamba - " + prettyName;
93 setName(qName.ascii());
95 KDirWatch *dirWatch = KDirWatch::self();
96 connect(dirWatch, TQ_SIGNAL( dirty(
const TQString & ) ),
97 TQ_SLOT( slotFileChanged(
const TQString & ) ) );
99 if(!dirWatch->contains(m_theme.file()))
100 dirWatch->addFile(m_theme.file());
102 if(!m_theme.isZipTheme() && m_theme.pythonModuleExists())
104 TQString pythonFile = m_theme.path() +
"/" + m_theme.pythonModule() +
".py";
105 if(!dirWatch->contains(pythonFile))
106 dirWatch->addFile(pythonFile);
112 TQString instanceString;
114 instanceString = TQString(
"-%1").arg(m_instance);
115 TQString cfg = TQDir::home().absPath() +
"/.superkaramba/"
116 + m_theme.id() + instanceString +
".rc";
117 kdDebug() << cfg << endl;
118 TQFile themeConfigFile(cfg);
120 if (!TQFileInfo(themeConfigFile).exists())
123 themeConfigFile.open(IO_ReadWrite);
124 themeConfigFile.close();
127 config =
new TDEConfig(cfg,
false,
false);
129 config -> setGroup(
"internal");
131 m_reloading = reloading;
132 if(m_theme.pythonModuleExists())
134 kdDebug() <<
"Loading python module: " << m_theme.pythonModule() << endl;
135 TQTimer::singleShot(0,
this, TQ_SLOT(initPythonInterface()));
139 info =
new NETWinInfo( tqt_xdisplay(), winId(), tqt_xrootwin(), NET::WMState );
142 kWinModule =
new KWinModule();
145 connect( kWinModule,TQ_SIGNAL(currentDesktopChanged(
int)),
this,
146 TQ_SLOT(currentDesktopChanged(
int)) );
147 connect( kapp, TQ_SIGNAL(backgroundChanged(
int)),
this,
148 TQ_SLOT(currentWallpaperChanged(
int)));
151 connect(&taskManager, TQ_SIGNAL(activeTaskChanged(
Task*)),
this,
152 TQ_SLOT(activeTaskChanged(
Task*)) );
153 connect(&taskManager, TQ_SIGNAL(taskAdded(
Task*)),
this,
154 TQ_SLOT(taskAdded(
Task*)) );
155 connect(&taskManager, TQ_SIGNAL(taskRemoved(
Task*)),
this,
156 TQ_SLOT(taskRemoved(
Task*)) );
157 connect(&taskManager, TQ_SIGNAL(startupAdded(
Startup*)),
this,
158 TQ_SLOT(startupAdded(
Startup*)) );
159 connect(&taskManager, TQ_SIGNAL(startupRemoved(
Startup*)),
this,
160 TQ_SLOT(startupRemoved(
Startup*)) );
162 themeConfMenu =
new TDEPopupMenu(
this);
163 themeConfMenu -> setCheckable(
true);
166 DesktopChangeSlot *dslot;
170 toDesktopMenu =
new TDEPopupMenu (
this);
171 toDesktopMenu -> setCheckable(
true);
172 mid = toDesktopMenu -> insertItem (i18n(
"&All Desktops"),
173 dslot =
new DesktopChangeSlot(
this,0),
175 dslot->setMenuId(mid);
177 toDesktopMenu -> insertSeparator();
178 for (
int ndesktop=1; ndesktop <= kWinModule->numberOfDesktops(); ndesktop++)
180 TQString name = i18n(
"Desktop &");
181 name += (
'0' + ndesktop);
183 mid = toDesktopMenu -> insertItem (name,
184 dslot =
new DesktopChangeSlot(
this, ndesktop), TQ_SLOT(receive()));
185 dslot->setMenuId(mid);
189 kpop =
new TDEPopupMenu(
this );
190 kpop -> setCheckable(
true);
192 accColl =
new TDEActionCollection(
this );
193 menuAccColl =
new TDEActionCollection(
this );
195 kpop->insertItem( SmallIconSet(
"reload"),i18n(
"Update"),
this,
196 TQ_SLOT(updateSensors()), Key_F5 );
197 toggleLocked =
new TDEToggleAction ( i18n(
"Toggle &Locked Position"),
198 SmallIconSet(
"locked"),
200 TQ_SLOT( slotToggleLocked() ),
201 accColl,
"Locked position" );
202 accColl->insert(toggleLocked);
203 toggleLocked -> setChecked(
true);
205 toggleLocked->plug(kpop);
207 toggleFastTransforms =
new TDEToggleAction(i18n(
"Use &Fast Image Scaling"),
209 TQ_SLOT( slotToggleFastTransforms() ),
210 accColl,
"Fast transformations");
212 accColl->insert(toggleFastTransforms);
213 toggleFastTransforms -> setChecked(
true);
215 toggleFastTransforms -> plug(kpop);
217 kpop->insertSeparator();
219 kpop->insertItem(i18n(
"Configure &Theme"), themeConfMenu, THEMECONF);
220 kpop->setItemEnabled(THEMECONF,
false);
221 kpop->insertItem(i18n(
"To Des&ktop"), toDesktopMenu);
223 kpop->insertItem( SmallIconSet(
"reload3"),i18n(
"&Reload Theme"),
this,
224 TQ_SLOT(reloadConfig()), CTRL+Key_R );
225 kpop->insertItem( SmallIconSet(
"window-close"),i18n(
"&Close This Theme"),
this,
226 TQ_SLOT(killWidget()), CTRL+Key_C );
228 if(!SuperKarambaSettings::showSysTray())
233 numberOfConfMenuItems = 0;
236 foundKaramba =
false;
239 fixedPosition =
false;
242 meterList =
new TQObjectList();
243 meterList->setAutoDelete(
true );
244 sensorList =
new TQObjectList();
245 sensorList->setAutoDelete(
true );
246 clickList =
new TQObjectList();
247 timeList =
new TQObjectList();
248 imageList =
new TQObjectList();
249 menuList =
new TQObjectList();
250 menuList->setAutoDelete(
true );
252 client = kapp->dcopClient();
253 if (!client->isAttached())
255 appId = client->registerAs(tqApp->name());
258 setBackgroundMode( NoBackground);
259 if( !(onTop || managed))
260 KWin::lowerWindow( winId() );
265 TQTimer::singleShot( 100,
this, TQ_SLOT(killWidget()) );
266 tqWarning(
"Could not read config file.");
275 bool locked = toggleLocked->isChecked();
276 locked = config->readBoolEntry(
"lockedPosition", locked);
277 toggleLocked->setChecked(locked);
280 if (!config -> readBoolEntry(
"fastTransforms",
true))
282 toggleFastTransforms -> setChecked(
false);
283 slotToggleFastTransforms();
286 desktop = config -> readNumEntry(
"desktop", desktop);
287 if (desktop > kWinModule->numberOfDesktops())
294 info->setDesktop( desktop );
297 info->setDesktop( NETWinInfo::OnAllDesktops);
300 config -> setGroup(
"theme");
301 if (config -> hasKey(
"widgetPosX") && config -> hasKey(
"widgetPosY"))
303 int xpos = config -> readNumEntry(
"widgetPosX");
304 int ypos = config -> readNumEntry(
"widgetPosY");
314 this->setMouseTracking(
true);
317 setFocusPolicy(TQWidget::StrongFocus);
324 karambaApp->deleteKaramba(
this, m_reloading);
327 if(m_theme.isValid())
338 if( sensorList != 0 )
365 delete themeConfMenu;
369 delete defaultTextField;
370 if (pythonIface != NULL)
374bool karamba::parseConfig()
381 TQValueStack<TQPoint> offsetStack;
388 offsetStack.push(TQPoint(0,0));
390 while(m_theme.nextLine(lineParser))
392 x = lineParser.getInt(
"X") + offsetStack.top().x();
393 y = lineParser.getInt(
"Y") + offsetStack.top().y();
394 w = lineParser.getInt(
"W");
395 h = lineParser.getInt(
"H");
397 if(lineParser.meter() ==
"KARAMBA" && !foundKaramba )
400 toggleLocked->setChecked(lineParser.getBoolean(
"LOCKED"));
406 if( w == 0 || h == 0)
413 if(lineParser.getBoolean(
"RIGHT"))
415 TQDesktopWidget *d = TQApplication::desktop();
418 else if(lineParser.getBoolean(
"LEFT"))
423 if(lineParser.getBoolean(
"BOTTOM"))
425 TQDesktopWidget *d = TQApplication::desktop();
428 else if(lineParser.getBoolean(
"TOP"))
436 if(lineParser.getBoolean(
"ONTOP"))
439 KWin::setState( winId(), NET::StaysOnTop );
442 if(lineParser.getBoolean(
"MANAGED"))
445 reparent(0, TQt::WType_Dialog | WStyle_Customize | WStyle_NormalBorder
446 | WRepaintNoErase | WDestructiveClose, pos());
450 info->setState( NETWinInfo::SkipTaskbar
451 | NETWinInfo::SkipPager,NETWinInfo::SkipTaskbar
452 | NETWinInfo::SkipPager );
455 KWin::setState( winId(), NET::StaysOnTop );
460 if (lineParser.getBoolean(
"ONALLDESKTOPS"))
470 info->setDesktop( dfound );
472 if(lineParser.getBoolean(
"TOPBAR"))
475 KWin::setStrut( winId(), 0, 0, h, 0 );
476 toggleLocked->setChecked(
true );
478 toggleLocked->setEnabled(
false);
481 if(lineParser.getBoolean(
"BOTTOMBAR"))
483 int dh = TQApplication::desktop()->height();
485 KWin::setStrut( winId(), 0, 0, 0, h );
486 toggleLocked->setChecked(
true );
488 toggleLocked->setEnabled(
false);
491 if(lineParser.getBoolean(
"RIGHTBAR"))
493 int dw = TQApplication::desktop()->width();
495 KWin::setStrut( winId(), 0, w, 0, 0 );
496 toggleLocked->setChecked(
true );
498 toggleLocked->setEnabled(
false);
501 if(lineParser.getBoolean(
"LEFTBAR"))
504 KWin::setStrut( winId(), w, 0, 0, 0 );
505 toggleLocked->setChecked(
true );
507 toggleLocked->setEnabled(
false);
510 TQString path = lineParser.getString(
"MASK");
512 TQFileInfo info(path);
516 if( info.isRelative() )
518 absPath.setAscii(m_theme.path().ascii());
519 absPath.append(path.ascii());
520 ba = m_theme.readThemeFile(path);
524 absPath.setAscii(path.ascii());
525 ba = m_theme.readThemeFile(info.fileName());
527 if(m_theme.isZipTheme())
529 bmMask.loadFromData(ba);
533 bmMask.load(absPath);
537 m_interval = lineParser.getInt(
"INTERVAL");
538 m_interval = (m_interval == 0) ? 1000 : m_interval;
540 TQString temp = lineParser.getString(
"TEMPUNIT",
"C").upper();
541 tempUnit = temp.ascii()[0];
545 if(lineParser.meter() ==
"THEME")
547 TQString path = lineParser.getString(
"PATH");
548 TQFileInfo info(path);
549 if( info.isRelative())
550 path = m_theme.path() +
"/" + path;
551 (
new karamba( path, TQString() ))->show();
554 if(lineParser.meter() ==
"<GROUP>")
556 int offsetX = offsetStack.top().x();
557 int offsetY = offsetStack.top().y();
558 offsetStack.push( TQPoint( offsetX + lineParser.getInt(
"X"),
559 offsetY + lineParser.getInt(
"Y")));
562 if(lineParser.meter() ==
"</GROUP>")
567 if(lineParser.meter() ==
"CLICKAREA")
569 if( !hasMouseTracking() )
570 setMouseTracking(
true);
572 tmp->setOnClick(lineParser.getString(
"ONCLICK"));
574 setSensor(lineParser, (Meter*)tmp);
575 clickList->append( tmp );
576 if( lineParser.getBoolean(
"PREVIEW"))
577 meterList->append( tmp );
581 if(lineParser.meter() ==
"SENSOR=PROGRAM")
583 setSensor(lineParser, 0 );
586 if(lineParser.meter() ==
"IMAGE")
588 TQString file = lineParser.getString(
"PATH");
589 TQString file_roll = lineParser.getString(
"PATHROLL");
590 int xon = lineParser.getInt(
"XROLL");
591 int yon = lineParser.getInt(
"YROLL");
592 TQString tiptext = lineParser.getString(
"TOOLTIP");
593 TQString name = lineParser.getString(
"NAME");
594 bool bg = lineParser.getBoolean(
"BACKGROUND");
595 xon = ( xon <= 0 ) ? x:xon;
596 yon = ( yon <= 0 ) ? y:yon;
598 ImageLabel *tmp =
new ImageLabel(
this, x, y, 0, 0);
600 if(!file_roll.isEmpty())
601 tmp->parseImages(file, file_roll, x,y, xon, yon);
602 tmp->setBackground(bg);
604 tmp->setName(name.ascii());
605 if (!tiptext.isEmpty())
606 tmp->setTooltip(tiptext);
608 connect(tmp, TQ_SIGNAL(pixmapLoaded()),
this, TQ_SLOT(externalStep()));
609 setSensor(lineParser, (Meter*) tmp );
610 meterList->append (tmp );
611 imageList->append (tmp );
614 if(lineParser.meter() ==
"DEFAULTFONT" )
616 delete defaultTextField;
619 defaultTextField->setColor(lineParser.getColor(
"COLOR",
621 defaultTextField->setBGColor(lineParser.getColor(
"BGCOLOR",
623 defaultTextField->setFont(lineParser.getString(
"FONT",
"Helvetica"));
624 defaultTextField->setFontSize(lineParser.getInt(
"FONTSIZE", 12));
625 defaultTextField->setAlignment(lineParser.getString(
"ALIGN",
627 defaultTextField->setFixedPitch(lineParser.getBoolean(
"FIXEDPITCH",
629 defaultTextField->setShadow(lineParser.getInt(
"SHADOW", 0));
632 if(lineParser.meter() ==
"TEXT" ||
633 lineParser.meter() ==
"CLICKMAP" ||
634 lineParser.meter() ==
"RICHTEXT" ||
635 lineParser.meter() ==
"INPUT")
640 defTxt = *defaultTextField;
644 tmpText->setColor(lineParser.getColor(
"COLOR", defTxt.getColor()));
645 tmpText->setBGColor(lineParser.getColor(
"BGCOLOR",
646 defTxt.getBGColor()));
647 tmpText->setFont(lineParser.getString(
"FONT", defTxt.getFont()));
648 tmpText->setFontSize(lineParser.getInt(
"FONTSIZE",
649 defTxt.getFontSize()));
650 tmpText->setAlignment(lineParser.getString(
"ALIGN",
651 defTxt.getAlignmentAsString()));
652 tmpText->setFixedPitch(lineParser.getInt(
"FIXEDPITCH",
653 defTxt.getFixedPitch()));
655 tmpText->setShadow(lineParser.getInt(
"SHADOW", defTxt.getShadow()));
659 if(lineParser.meter() ==
"TEXT")
662 TextLabel *tmp =
new TextLabel(
this, x, y, w, h );
663 tmp->setTextProps(tmpText);
665 m_theme.locale()->translate(lineParser.getString(
"VALUE")));
667 TQString name = lineParser.getString(
"NAME");
669 tmp->setName(name.ascii());
671 setSensor(lineParser, (Meter*)tmp);
672 meterList->append ( tmp );
675 if(lineParser.meter() ==
"CLICKMAP")
677 if( !hasMouseTracking() )
678 setMouseTracking(
true);
680 tmp->setTextProps( tmpText );
682 setSensor(lineParser, (Meter*)tmp);
684 clickList -> append(tmp);
685 meterList->append( tmp );
689 if(lineParser.meter() ==
"RICHTEXT")
691 RichTextLabel *tmp =
new RichTextLabel(
this, x, y, w, h);
693 bool dUl = lineParser.getBoolean(
"UNDERLINE");
696 m_theme.locale()->translate(lineParser.getString(
"VALUE").ascii()), dUl);
697 tmp->setTextProps( tmpText );
701 TQString name = lineParser.getString(
"NAME");
703 tmp->setName(name.ascii());
705 setSensor(lineParser, (Meter*)tmp);
706 clickList -> append(tmp);
707 meterList->append ( tmp );
710 if(lineParser.meter() ==
"INPUT")
712 Input *tmp =
new Input(
this, x, y, w, h);
714 TQString name = lineParser.getString(
"NAME");
716 tmp->setName(name.ascii());
718 tmp->setTextProps(tmpText);
720 m_theme.locale()->translate(lineParser.getString(
"VALUE").ascii()));
722 meterList->append(tmp);
727 if(lineParser.meter() ==
"BAR")
729 Bar *tmp =
new Bar(
this, x, y, w, h );
730 tmp->setImage(lineParser.getString(
"PATH").ascii());
731 tmp->setVertical(lineParser.getBoolean(
"VERTICAL"));
732 tmp->setMax(lineParser.getInt(
"MAX", 100));
733 tmp->setMin(lineParser.getInt(
"MIN", 0));
734 tmp->setValue(lineParser.getInt(
"VALUE"));
735 TQString name = lineParser.getString(
"NAME");
737 tmp->setName(name.ascii());
738 setSensor(lineParser, (Meter*)tmp );
739 meterList->append ( tmp );
742 if(lineParser.meter() ==
"GRAPH")
744 int points = lineParser.getInt(
"POINTS");
746 Graph *tmp =
new Graph(
this, x, y, w, h, points);
747 tmp->setMax(lineParser.getInt(
"MAX", 100));
748 tmp->setMin(lineParser.getInt(
"MIN", 0));
749 TQString name = lineParser.getString(
"NAME");
751 tmp->setName(name.ascii());
753 tmp->setColor(lineParser.getColor(
"COLOR"));
755 setSensor(lineParser, (Graph*)tmp);
756 meterList->append ( tmp );
760 if(passive && !managed)
764 KWin::setType(winId(), NET::Dock);
765 #if defined(TDE_MAKE_VERSION)
766 #if TDE_VERSION >= TDE_MAKE_VERSION(3,1,9)
768 KWin::setState(winId(), NET::KeepBelow);
791 m_sysTimer =
new TQTimer(
this);
793 connect(m_sysTimer, TQ_SIGNAL(timeout()), TQ_SLOT(step()));
795 m_sysTimer->start(m_interval);
798 TQTimer::singleShot( 0,
this, TQ_SLOT(step()) );
800 if( !(onTop || managed) )
804void karamba::makeActive()
806 KWin::setType(winId(), NET::Normal);
808 #if defined(TDE_MAKE_VERSION)
809 #if TDE_VERSION >= TDE_MAKE_VERSION(3,1,9)
811 KWin::setState(winId(), NET::Modal);
816void karamba::makePassive()
822 for (meter = meterList->first(); meter; meter = meterList->next())
824 if((meter)->isA(
"Input"))
830 KWin::setType(winId(), NET::Dock);
831 #if defined(TDE_MAKE_VERSION)
832 #if TDE_VERSION >= TDE_MAKE_VERSION(3,1,9)
834 KWin::setState(winId(), NET::KeepBelow);
839void karamba::popupNotify(
int)
844void karamba::reloadConfig()
850 TQFileInfo fileInfo( m_theme.file() );
851 (
new karamba(m_theme.file(), fileInfo.baseName(),
true, m_instance))->show();
856void karamba::closeTheme(
bool reloading)
858 m_reloading = reloading;
862void karamba::killWidget()
867void karamba::initPythonInterface()
869 pythonIface =
new KarambaPython(m_theme, m_reloading);
872void karamba::editConfig()
875 TQFileInfo fileInfo( m_theme.file() );
878 if( fileInfo.isRelative() )
880 path = m_theme.path() +
"/" + m_theme.file();
884 path = m_theme.file();
887 KRun::runURL( KURL( path ),
"text/plain" );
890void karamba::editScript()
893 TQFileInfo fileInfo( m_theme.file() );
896 if( fileInfo.isRelative() )
898 path = m_theme.path() +
"/" + m_theme.name() +
".py";
902 path = TQFileInfo(m_theme.file()).dirPath() +
"/" + m_theme.name() +
".py";
904 KRun::runURL( KURL( path ),
"text/plain" );
907TQString karamba::findSensorFromMap(Sensor* sensor)
910 TQMap<TQString,Sensor*>::ConstIterator it;
911 TQMap<TQString,Sensor*>::ConstIterator end( sensorMap.end() );
912 for ( it = sensorMap.begin(); it != end; ++it )
914 if (it.data() == sensor)
920Sensor* karamba::findSensorFromList(Meter* meter)
923 TQObjectListIt it( *sensorList );
927 if (((Sensor*) *it)->hasMeter(meter))
928 return ((Sensor*)*it);
934TQString karamba::getSensor(Meter* meter)
938 Sensor* sensor = findSensorFromList(meter);
940 s = findSensorFromMap(sensor);
944void karamba::deleteMeterFromSensors(Meter* meter)
947 Sensor* sensor = findSensorFromList(meter);
951 sensor->deleteMeter(meter);
952 if (sensor->isEmpty())
954 TQString s = findSensorFromMap(sensor);
956 sensorList->removeRef(sensor);
961void karamba::setSensor(
const LineParser& lineParser, Meter* meter)
966 deleteMeterFromSensors(meter);
968 TQString sens = lineParser.getString(
"SENSOR").upper();
972 TQString cpuNbr = lineParser.getString(
"CPU");
973 sensor = sensorMap[
"CPU"+cpuNbr];
976 int interval = lineParser.getInt(
"INTERVAL");
977 interval = (interval == 0)?1000:interval;
978 sensor = ( sensorMap[
"CPU"+cpuNbr] =
new CPUSensor( cpuNbr, interval ) );
979 sensorList->append( sensor );
982 sp->addParam(
"FORMAT",
983 m_theme.locale()->translate(lineParser.getString(
"FORMAT").ascii()));
984 sp->addParam(
"DECIMALS",lineParser.getString(
"DECIMALS"));
986 sensor->addMeter(sp);
987 sensor->setMaxValue(sp);
993 TQString gpuId = lineParser.getString(
"GPU");
994 TQString gpuDriver = lineParser.getString(
"DRIVER");
995 TQString sensorId = TQString(
"GPU_%1_%2").arg(gpuDriver, gpuId);
996 sensor = sensorMap[sensorId];
999 int interval = lineParser.getInt(
"INTERVAL");
1000 interval = (interval == 0) ? 1000 : interval;
1001 sensor = (sensorMap[sensorId] =
new GPUSensor(gpuDriver, gpuId, interval));
1002 sensorList->append(sensor);
1006 sp->addParam(
"FORMAT", m_theme.locale()->translate(lineParser.getString(
"FORMAT").ascii()));
1007 sensor->addMeter(sp);
1008 sensor->setMaxValue(sp);
1011 if( sens ==
"MEMORY" )
1013 sensor = sensorMap[
"MEMORY"];
1016 int interval = lineParser.getInt(
"INTERVAL");
1017 interval = (interval == 0)?3000:interval;
1018 sensor = ( sensorMap[
"MEMORY"] =
new MemSensor( interval ) );
1019 sensorList->append( sensor );
1022 sp->addParam(
"FORMAT",
1023 m_theme.locale()->translate(lineParser.getString(
"FORMAT").ascii()));
1025 sensor->addMeter(sp);
1026 sensor->setMaxValue(sp);
1030 if( sens ==
"DISK" )
1032 sensor = sensorMap[
"DISK"];
1035 int interval = lineParser.getInt(
"INTERVAL");
1036 interval = (interval == 0)?5000:interval;
1037 sensor = ( sensorMap[
"DISK"] =
new DiskSensor( interval ) );
1038 connect( sensor, TQ_SIGNAL(initComplete()),
this, TQ_SLOT(externalStep()) );
1039 sensorList->append( sensor );
1043 TQString mntPt = lineParser.getString(
"MOUNTPOINT");
1044 if( mntPt.isEmpty() )
1050 if( mntPt.length() > 1 && mntPt.endsWith(
"/") )
1052 mntPt.remove( mntPt.length()-1, 1 );
1054 sp->addParam(
"MOUNTPOINT",mntPt);
1055 sp->addParam(
"FORMAT",
1056 m_theme.locale()->translate(lineParser.getString(
"FORMAT").ascii()));
1057 sensor->addMeter(sp);
1058 sensor->setMaxValue(sp);
1061 if( sens ==
"NETWORK")
1063 int interval = lineParser.getInt(
"INTERVAL");
1064 interval = (interval == 0)?2000:interval;
1065 TQString device = lineParser.getString(
"DEVICE");
1066 sensor = sensorMap[
"NETWORK"+device];
1069 sensor = ( sensorMap[
"NETWORK"+device] =
1070 new NetworkSensor(device, interval));
1071 sensorList->append( sensor );
1074 sp->addParam(
"FORMAT",
1075 m_theme.locale()->translate(lineParser.getString(
"FORMAT").ascii()));
1076 sp->addParam(
"DECIMALS", lineParser.getString(
"DECIMALS"));
1077 sensor->addMeter(sp);
1080 if( sens ==
"UPTIME" )
1082 sensor = sensorMap[
"UPTIME"];
1085 int interval = lineParser.getInt(
"INTERVAL");
1086 interval = (interval == 0)?60000:interval;
1087 sensor = ( sensorMap[
"UPTIME"] =
new UptimeSensor( interval ));
1088 sensorList->append( sensor );
1092 sp->addParam(
"FORMAT",
1093 m_theme.locale()->translate(lineParser.getString(
"FORMAT").ascii()));
1094 sensor->addMeter(sp);
1097 if( sens ==
"SENSOR" )
1099 sensor = sensorMap[
"SENSOR"];
1102 int interval = lineParser.getInt(
"INTERVAL");
1103 interval = (interval == 0)?30000:interval;
1104 sensor = (sensorMap[
"SENSOR"] =
new SensorSensor(interval, tempUnit));
1105 sensorList->append( sensor );
1108 sp->addParam(
"FORMAT",
1109 m_theme.locale()->translate(lineParser.getString(
"FORMAT").ascii()));
1110 sp->addParam(
"TYPE", lineParser.getString(
"TYPE"));
1111 sensor->addMeter(sp);
1115 if( sens ==
"TEXTFILE" )
1117 TQString path = lineParser.getString(
"PATH");
1118 bool rdf = lineParser.getBoolean(
"RDF");
1119 sensor = sensorMap[
"TEXTFILE"+path];
1122 int interval = lineParser.getInt(
"INTERVAL");
1123 interval = ( interval == 0 )?60000:interval;
1124 TQString encoding = lineParser.getString(
"ENCODING");
1126 sensor = ( sensorMap[
"TEXTFILE"+path] =
1128 sensorList->append( sensor );
1131 sp->addParam(
"LINE",TQString::number(lineParser.getInt(
"LINE")));
1132 sensor->addMeter(sp);
1138 sensor = sensorMap[
"DATE"];
1141 int interval = lineParser.getInt(
"INTERVAL");
1142 interval = (interval == 0)?60000:interval;
1143 sensor = ( sensorMap[
"DATE"] =
new DateSensor( interval ) );
1144 sensorList->append( sensor );
1145 timeList->append( sensor );
1148 sp->addParam(
"FORMAT",
1149 m_theme.locale()->translate(lineParser.getString(
"FORMAT").ascii()));
1150 sp->addParam(
"CALWIDTH",lineParser.getString(
"CALWIDTH"));
1151 sp->addParam(
"CALHEIGHT",lineParser.getString(
"CALHEIGHT"));
1152 sensor->addMeter(sp);
1157 if( sens ==
"XMMS" )
1159 sensor = sensorMap[
"XMMS"];
1162 int interval = lineParser.getInt(
"INTERVAL");
1163 interval = (interval == 0)?1000:interval;
1164 TQString encoding = lineParser.getString(
"ENCODING");
1166 sensor = ( sensorMap[
"XMMS"] =
new XMMSSensor( interval, encoding ) );
1167 sensorList->append( sensor );
1170 sp->addParam(
"FORMAT",
1171 m_theme.locale()->translate(lineParser.getString(
"FORMAT").ascii()));
1172 sensor->addMeter(sp);
1173 sensor->setMaxValue(sp);
1178 if( sens ==
"NOATUN" )
1180 sensor = sensorMap[
"NOATUN"];
1183 int interval = lineParser.getInt(
"INTERVAL");
1184 interval = (interval == 0)?1000:interval;
1185 sensor = ( sensorMap[
"NOATUN"] =
new NoatunSensor( interval, client ) );
1186 sensorList->append( sensor );
1189 sp->addParam(
"FORMAT",
1190 m_theme.locale()->translate(lineParser.getString(
"FORMAT").ascii()));
1191 sensor->addMeter(sp);
1192 sensor->setMaxValue(sp);
1195 if( sens ==
"PROGRAM")
1197 TQString progName = lineParser.getString(
"PROGRAM");
1198 sensor = sensorMap[
"PROGRAM"+progName];
1201 int interval = lineParser.getInt(
"INTERVAL");
1202 interval = (interval == 0)?3600000:interval;
1203 TQString encoding = lineParser.getString(
"ENCODING");
1205 sensor = (sensorMap[
"PROGRAM"+progName] =
1206 new ProgramSensor( progName, interval, encoding ) );
1207 sensorList->append( sensor );
1210 sp->addParam(
"LINE", TQString::number(lineParser.getInt(
"LINE")));
1211 sp->addParam(
"THEMAPATH", m_theme.path() );
1212 sensor->addMeter(sp);
1217 TQString source = lineParser.getString(
"SOURCE");
1219 m_theme.locale()->translate(lineParser.getString(
"FORMAT").ascii());
1221 sensor = sensorMap[
"RSS"+source];
1224 int interval = lineParser.getInt(
"INTERVAL");
1225 interval = ( interval == 0 )?60000:interval;
1226 TQString encoding = lineParser.getString(
"ENCODING");
1228 sensor = ( sensorMap[
"RSS"+source] =
1229 new RssSensor( source, interval, format, encoding ) );
1230 sensorList->append( sensor );
1233 sp->addParam(
"SOURCE",lineParser.getString(
"SOURCE"));
1234 sensor->addMeter(sp);
1239 TQTimer::singleShot( 0, sensor, TQ_SLOT(update()) );
1244void karamba::slotFileChanged(
const TQString & file)
1248 TQString pythonFile = m_theme.path() +
"/" + m_theme.pythonModule() +
".py";
1250 if(file == m_theme.file() || file == pythonFile)
1254void karamba::passMenuOptionChanged(TQString key,
bool value)
1257 if (pythonIface && pythonIface->isExtensionLoaded())
1258 pythonIface->menuOptionChanged(
this, key, value);
1261void karamba::setIncomingData(TQString theme, TQString obj)
1263 KarambaApplication* app = (KarambaApplication*)tqApp;
1265 kdDebug() <<
"karamba::setIncomingData " << theme << obj << endl;
1273 DCOPClient *c = kapp->dcopClient();
1274 if (!c->isAttached())
1278 app->dcopStub()->setIncomingData(theme, obj);
1281void karamba::callTheme(TQString theme, TQString txt)
1283 KarambaApplication* app = (KarambaApplication*)tqApp;
1284 kdDebug() <<
"karamba::callTheme " << theme << txt << endl;
1293 DCOPClient *c = kapp->dcopClient();
1294 if (!c->isAttached())
1298 app->dcopStub()->themeNotify(theme, txt);
1301void karamba::themeNotify(TQString theme, TQString txt)
1303 kdDebug() <<
"karamba::themeNotify" << theme << txt << endl;
1304 if (pythonIface->isExtensionLoaded())
1306 pythonIface->themeNotify(
this, theme.ascii(), txt.ascii());
1310void karamba::meterClicked(TQMouseEvent* e, Meter* meter)
1313 if (pythonIface && pythonIface->isExtensionLoaded() && haveUpdated)
1317 if( e->button() == TQt::LeftButton )
1319 else if( e->button() == TQt::MidButton )
1321 else if( e->button() == TQt::RightButton )
1324 if (RichTextLabel* richText =
dynamic_cast<RichTextLabel*
>(meter))
1326 pythonIface->meterClicked(
this, richText->anchorAt(e->x(), e->y()),
1331 pythonIface->meterClicked(
this, meter, button);
1336void karamba::changeInterval(
int interval)
1338 if (m_sysTimer != NULL)
1339 m_sysTimer->changeInterval(interval);
1342void karamba::passClick(TQMouseEvent *e)
1345 TQObjectListIt it2( *timeList );
1348 (( DateSensor* ) *it2)->toggleCalendar( e );
1355 TQObjectList clickListTmp(*clickList);
1356 TQObjectListIt it(clickListTmp);
1359 Meter* meter = (Meter*)(*it);
1361 if (clickList->containsRef(meter) && meter->click(e))
1364 meterClicked(e, meter);
1370 if (pythonIface && pythonIface->isExtensionLoaded() && haveUpdated)
1374 if( e->button() == TQt::LeftButton )
1376 else if( e->button() == TQt::MidButton )
1378 else if( e->button() == TQt::RightButton )
1381 pythonIface->widgetClicked(
this, e->x(), e->y(), button);
1385void karamba::passWheelClick( TQWheelEvent *e )
1389 if (pythonIface && pythonIface->isExtensionLoaded() && haveUpdated)
1393 if( e->delta() > 0 )
1400 if (want_meter_wheel_event)
1402 TQObjectList clickListTmp(*clickList);
1403 TQObjectListIt it(clickListTmp);
1405 TQMouseEvent fakeEvent(TQEvent::MouseButtonPress, e->pos(), e->globalPos(), button, e->state());
1409 Meter* meter = (Meter*)(*it);
1411 if (clickList->containsRef(meter) && meter->click(&fakeEvent))
1413 if (RichTextLabel* richText =
dynamic_cast<RichTextLabel*
>(meter))
1415 pythonIface->meterClicked(
this, richText->anchorAt(fakeEvent.x(), fakeEvent.y()),
1420 pythonIface->meterClicked(
this, meter, button);
1427 pythonIface->widgetClicked(
this, e->x(), e->y(), button);
1431void karamba::management_popup(
void )
1433 kpop->popup(TQCursor::pos());
1436void karamba::mousePressEvent( TQMouseEvent *e )
1439 if( e->button() == TQt::RightButton && !want_right_button )
1445 clickPos = e->pos();
1446 if( toggleLocked -> isChecked() )
1448 if( !(onTop || managed))
1449 KWin::lowerWindow( winId() );
1453void karamba::wheelEvent( TQWheelEvent *e )
1456 passWheelClick( e );
1459void karamba::mouseReleaseEvent( TQMouseEvent *e )
1462 clickPos = e->pos();
1465void karamba::mouseDoubleClickEvent( TQMouseEvent *e )
1468 if( !toggleLocked -> isChecked() )
1474void karamba::keyPressEvent(TQKeyEvent *e)
1477 keyPressed(e->text(), 0);
1480void karamba::keyPressed(
const TQString& s,
const Meter* meter)
1482 if (pythonIface && pythonIface->isExtensionLoaded())
1483 pythonIface->keyPressed(
this, meter, s);
1486void karamba::mouseMoveEvent( TQMouseEvent *e )
1489 if( e->state() != 0 && e->state() < 16 && !toggleLocked -> isChecked() )
1491 move( e->globalPos() - clickPos );
1496 TQObjectListIt it(*clickList);
1497 bool insideArea =
false;
1501 insideArea = ((Meter*)(*it)) -> insideActiveArea(e -> x(), e ->y());
1511 if( cursor().shape() != PointingHandCursor )
1512 setCursor( PointingHandCursor );
1516 if( cursor().shape() != ArrowCursor )
1517 setCursor( ArrowCursor );
1520 TQObjectListIt image_it( *imageList);
1521 while ( image_it != 0 )
1523 ((ImageLabel*) *image_it)->rolloverImage(e);
1528 if (pythonIface && pythonIface->isExtensionLoaded())
1536 if( e->state() == TQt::LeftButton)
1539 else if( e->state() == TQt::MidButton )
1542 else if( e->state() == TQt::RightButton )
1545 pythonIface->widgetMouseMoved(
this, e->x(), e->y(), button);
1549void karamba::closeEvent ( TQCloseEvent * qc)
1557void karamba::paintEvent ( TQPaintEvent *e)
1562 if( !(onTop || managed))
1564 if( lowerTimer.elapsed() > 100 )
1566 KWin::lowerWindow( winId() );
1567 lowerTimer.restart();
1570 TQRect rect = e->rect();
1571 bitBlt(
this,rect.topLeft(),&pm,rect,TQt::CopyROP);
1574void karamba::updateSensors()
1577 TQObjectListIt it( *sensorList );
1580 ((Sensor*) *it)->update();
1583 TQTimer::singleShot( 500,
this, TQ_SLOT(step()) );
1586void karamba::updateBackground(TDESharedPixmap* kpm)
1594 themeStarted =
true;
1597 background = TQPixmap(*kpm);
1599 TQPixmap buffer = TQPixmap(size());
1601 pm = TQPixmap(size());
1602 buffer.fill(TQt::black);
1604 TQObjectListIt it( *imageList );
1606 bitBlt(&buffer,0,0,&background,0,TQt::CopyROP);
1610 if (((ImageLabel*) *it)->background == 1)
1612 ((ImageLabel*) *it)->mUpdate(&p, 1);
1618 bitBlt(&pm,0,0,&buffer,0,TQt::CopyROP);
1621 TQPixmap buffer2 = TQPixmap(size());
1623 pm = TQPixmap(size());
1624 buffer2.fill(TQt::black);
1626 TQObjectListIt it2( *meterList );
1628 bitBlt(&buffer2,0,0,&background,0,TQt::CopyROP);
1632 ((Meter*) *it2)->mUpdate(&p);
1637 bitBlt(&pm,0,0,&buffer2,0,TQt::CopyROP);
1640 systray->updateBackgroundPixmap(buffer2);
1645void karamba::currentDesktopChanged(
int i )
1648 kroot->repaint(
true );
1649 if (pythonIface && pythonIface->isExtensionLoaded())
1650 pythonIface->desktopChanged(
this, i);
1653void karamba::currentWallpaperChanged(
int i )
1656 kroot->repaint(
true );
1657 if (pythonIface && pythonIface->isExtensionLoaded())
1658 pythonIface->wallpaperChanged(
this, i);
1661void karamba::externalStep()
1666 TQPixmap buffer = TQPixmap(size());
1668 pm = TQPixmap(size());
1669 buffer.fill(TQt::black);
1671 TQObjectListIt it( *meterList );
1673 bitBlt(&buffer,0,0,&background,0,TQt::CopyROP);
1677 ((Meter*) *it)->mUpdate(&p);
1682 bitBlt(&pm,0,0,&buffer,0,TQt::CopyROP);
1690 if (widgetUpdate && haveUpdated)
1692 pm = TQPixmap(size());
1693 TQPixmap buffer = TQPixmap(size());
1694 buffer.fill(TQt::black);
1696 TQObjectListIt it( *meterList );
1699 bitBlt(&buffer,0,0,&background,0,TQt::CopyROP);
1703 ((Meter*) *it)->mUpdate(&p);
1708 bitBlt(&pm,0,0,&buffer,0,TQt::CopyROP);
1712 if (pythonIface && pythonIface->isExtensionLoaded())
1715 pythonIface->initWidget(
this);
1717 pythonIface->widgetUpdated(
this);
1723void karamba::widgetClosed()
1726 if (pythonIface && pythonIface->isExtensionLoaded())
1727 pythonIface->widgetClosed(
this);
1730void karamba::slotToggleLocked()
1733 if(toggleLocked->isChecked())
1735 toggleLocked->setIconSet(SmallIconSet(
"system-lock-screen"));
1739 toggleLocked->setIconSet(SmallIconSet(
"move"));
1743void karamba::slotToggleFastTransforms()
1761bool karamba::useSmoothTransforms()
1764 return !toggleFastTransforms -> isChecked();
1767void karamba::writeConfigData()
1770 config -> setGroup(
"internal");
1771 config -> writeEntry(
"lockedPosition", toggleLocked -> isChecked() );
1772 config -> writeEntry(
"fastTransforms", toggleFastTransforms -> isChecked() );
1773 config -> writeEntry(
"desktop", desktop );
1774 config -> setGroup(
"theme");
1776 config -> writeEntry(
"widgetPosX", x());
1777 config -> writeEntry(
"widgetPosY", y());
1779 config -> writeEntry(
"widgetWidth", width());
1780 config -> writeEntry(
"widgetHeight", height());
1788void karamba::slotToggleConfigOption(TQString key,
bool value)
1791 config -> setGroup(
"config menu");
1792 config -> writeEntry(key, value);
1793 passMenuOptionChanged(key, value);
1796void karamba::addMenuConfigOption(TQString key, TQString name)
1799 kpop -> setItemEnabled(THEMECONF,
true);
1802 TDEToggleAction* confItem =
new TDEToggleAction (name, TDEShortcut::null(),
1803 action, TQ_SLOT(receive()),
1804 menuAccColl, key.ascii());
1805 confItem -> setName(key.ascii());
1807 menuAccColl -> insert(confItem);
1809 connect(action, TQ_SIGNAL( enabled(TQString,
bool) ),
1810 this, TQ_SLOT( slotToggleConfigOption(TQString,
bool) ));
1812 config -> setGroup(
"config menu");
1813 confItem -> setChecked(config -> readBoolEntry(key));
1815 confItem -> plug(themeConfMenu);
1817 numberOfConfMenuItems++;
1820bool karamba::setMenuConfigOption(TQString key,
bool value)
1823 TDEToggleAction* menuAction = ((TDEToggleAction*)menuAccColl -> action(key.ascii()));
1824 if (menuAction == NULL)
1826 tqWarning(
"Menu action %s not found.", key.ascii());
1831 menuAction -> setChecked(value);
1836bool karamba::readMenuConfigOption(TQString key)
1839 TDEToggleAction* menuAction = ((TDEToggleAction*)menuAccColl -> action(key.ascii()));
1840 if (menuAction == NULL)
1842 tqWarning(
"Menu action %s not found.", key.ascii());
1847 return menuAction -> isChecked();
1851void karamba::passMenuItemClicked(
int id)
1855 if (pythonIface && pythonIface->isExtensionLoaded())
1857 TDEPopupMenu* menu = 0;
1858 for(
int i = 0; i < (int)menuList->count(); i++)
1863 tmp = (TDEPopupMenu*) menuList->first();
1867 tmp = (TDEPopupMenu*) menuList->next();
1871 if(tmp->isItemVisible(
id))
1878 pythonIface->menuItemClicked(
this, menu,
id);
1882void karamba::activeTaskChanged(
Task* t)
1886 if (pythonIface && pythonIface->isExtensionLoaded())
1887 pythonIface->activeTaskChanged(
this, t);
1890void karamba::taskAdded(
Task* t)
1894 if (pythonIface && pythonIface->isExtensionLoaded())
1895 pythonIface->taskAdded(
this, t);
1898void karamba::taskRemoved(
Task* t)
1902 if (pythonIface && pythonIface->isExtensionLoaded())
1903 pythonIface->taskRemoved(
this, t);
1906void karamba::startupAdded(
Startup* t)
1910 if (pythonIface && pythonIface->isExtensionLoaded())
1911 pythonIface->startupAdded(
this, t);
1914void karamba::startupRemoved(
Startup* t)
1918 if (pythonIface && pythonIface->isExtensionLoaded())
1919 pythonIface->startupRemoved(
this, t);
1922void karamba::processExited (TDEProcess* proc)
1925 if (pythonIface && pythonIface->isExtensionLoaded())
1926 pythonIface->commandFinished(
this, (
int)proc->pid());
1929void karamba::receivedStdout (TDEProcess *proc,
char *buffer,
int)
1933 if (pythonIface && pythonIface->isExtensionLoaded())
1934 pythonIface->commandOutput(
this, (
int)proc->pid(), buffer);
1938void karamba::saveProperties(TDEConfig* config)
1941 config->setGroup(
"session");
1942 config->writeEntry(
"theme", m_theme.file());
1947void karamba::readProperties(TDEConfig* config)
1950 config->setGroup(
"session");
1951 TQString atheme = config->readEntry(
"theme");
1955void karamba::dragEnterEvent(TQDragEnterEvent* event)
1958 event->accept(TQTextDrag::canDecode(event));
1962void karamba::dropEvent(TQDropEvent* event)
1967 if ( TQTextDrag::decode(event, text) )
1970 if (pythonIface && pythonIface->isExtensionLoaded())
1972 const TQPoint &p =
event->pos();
1973 pythonIface->itemDropped(
this, text, p.x(), p.y());
1978void karamba::toDesktop(
int id,
int menuid)
1986 int mid = toDesktopMenu->idAt(i);
1990 toDesktopMenu->setItemChecked(mid,
false);
1992 toDesktopMenu->setItemChecked(menuid,
true);
1995 info->setDesktop( desktop);
1997 info->setDesktop( NETWinInfo::OnAllDesktops );
2000void karamba::systrayUpdated()
2003 if (pythonIface && pythonIface->isExtensionLoaded())
2004 pythonIface->systrayUpdated(
this);
2007void karamba::toggleWidgetUpdate(
bool b)
2010 if (pythonIface && pythonIface->isExtensionLoaded())
2014SignalBridge::SignalBridge(TQObject* parent, TQString name, TDEActionCollection* ac)
2015 : TQObject(parent, name.ascii()), collection(ac)
2017 setName(name.ascii());
2020void SignalBridge::receive()
2022 emit enabled(name(), ((TDEToggleAction*)collection -> action(name())) ->
2026DesktopChangeSlot::DesktopChangeSlot(TQObject *parent,
int id)
2027 : TQObject(parent,
"")
2032void DesktopChangeSlot::receive()
2034 karamba *k = (karamba *)parent();
2038 k->toDesktop(desktopid, menuid);
2041void DesktopChangeSlot::setMenuId(
int id)
2046int DesktopChangeSlot::menuId()
2051void karamba::showMenuExtension()
2053 kglobal =
new TDEPopupMenu(
this);
2055 trayMenuToggleId = kglobal->insertItem(SmallIconSet(
"superkaramba"),
2056 i18n(
"Show System Tray Icon"),
this,
2057 TQ_SLOT(slotToggleSystemTray()),
2060 trayMenuThemeId = kglobal->insertItem(SmallIconSet(
"knewstuff"),
2061 i18n(
"&Manage Themes..."),
this,
2062 TQ_SLOT(slotShowTheme()), CTRL+Key_M);
2064 trayMenuQuitId = kglobal->insertItem(SmallIconSet(
"system-log-out"),
2065 i18n(
"&Quit SuperKaramba"),
this,
2066 TQ_SLOT(slotQuit()), CTRL+Key_Q);
2070 trayMenuSeperatorId = kpop->insertSeparator();
2071 kpop->insertItem(
"SuperKaramba", kglobal);
2074void karamba::hideMenuExtension()
2078 kpop->removeItem(trayMenuSeperatorId);
2079 kglobal->removeItem(trayMenuToggleId);
2080 kglobal->removeItem(trayMenuThemeId);
2081 kglobal->removeItem(trayMenuQuitId);
2088void karamba::slotToggleSystemTray()
2090 karambaApp->globalHideSysTray(
false);
2093void karamba::slotQuit()
2095 karambaApp->globalQuitSuperKaramba();
2098void karamba::slotShowTheme()
2100 karambaApp->globalShowThemeDialog();
2103void karamba::setAlwaysOnTop(
bool stay)
2108 KWin::setState( winId(), NET::KeepAbove );
2113 KWin::setState( winId(), NET::KeepBelow );
2117#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).