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 <tdeversion.h>
40 #include <kdirwatch.h>
42 #include <tdeparts/componentfactory.h>
43 #include <tdeparts/part.h>
46 #include <tqwidgetlist.h>
52 karamba::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)
374 bool 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);
789 void karamba::start()
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) )
804 void 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);
816 void 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);
839 void karamba::popupNotify(
int)
844 void karamba::reloadConfig()
850 TQFileInfo fileInfo( m_theme.file() );
851 (
new karamba(m_theme.file(), fileInfo.baseName(),
true, m_instance))->show();
856 void karamba::closeTheme(
bool reloading)
858 m_reloading = reloading;
862 void karamba::killWidget()
867 void karamba::initPythonInterface()
869 pythonIface =
new KarambaPython(m_theme, m_reloading);
872 void 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" );
890 void 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" );
907 TQString 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)
920 Sensor* karamba::findSensorFromList(Meter* meter)
923 TQObjectListIt it( *sensorList );
927 if (((Sensor*) *it)->hasMeter(meter))
928 return ((Sensor*)*it);
934 TQString karamba::getSensor(Meter* meter)
938 Sensor* sensor = findSensorFromList(meter);
940 s = findSensorFromMap(sensor);
944 void 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);
961 void 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);
991 if( sens ==
"MEMORY" )
993 sensor = sensorMap[
"MEMORY"];
996 int interval = lineParser.getInt(
"INTERVAL");
997 interval = (interval == 0)?3000:interval;
998 sensor = ( sensorMap[
"MEMORY"] =
new MemSensor( interval ) );
999 sensorList->append( sensor );
1002 sp->addParam(
"FORMAT",
1003 m_theme.locale()->translate(lineParser.getString(
"FORMAT").ascii()));
1005 sensor->addMeter(sp);
1006 sensor->setMaxValue(sp);
1010 if( sens ==
"DISK" )
1012 sensor = sensorMap[
"DISK"];
1015 int interval = lineParser.getInt(
"INTERVAL");
1016 interval = (interval == 0)?5000:interval;
1017 sensor = ( sensorMap[
"DISK"] =
new DiskSensor( interval ) );
1018 connect( sensor, TQ_SIGNAL(initComplete()),
this, TQ_SLOT(externalStep()) );
1019 sensorList->append( sensor );
1023 TQString mntPt = lineParser.getString(
"MOUNTPOINT");
1024 if( mntPt.isEmpty() )
1030 if( mntPt.length() > 1 && mntPt.endsWith(
"/") )
1032 mntPt.remove( mntPt.length()-1, 1 );
1034 sp->addParam(
"MOUNTPOINT",mntPt);
1035 sp->addParam(
"FORMAT",
1036 m_theme.locale()->translate(lineParser.getString(
"FORMAT").ascii()));
1037 sensor->addMeter(sp);
1038 sensor->setMaxValue(sp);
1041 if( sens ==
"NETWORK")
1043 int interval = lineParser.getInt(
"INTERVAL");
1044 interval = (interval == 0)?2000:interval;
1045 TQString device = lineParser.getString(
"DEVICE");
1046 sensor = sensorMap[
"NETWORK"+device];
1049 sensor = ( sensorMap[
"NETWORK"+device] =
1050 new NetworkSensor(device, interval));
1051 sensorList->append( sensor );
1054 sp->addParam(
"FORMAT",
1055 m_theme.locale()->translate(lineParser.getString(
"FORMAT").ascii()));
1056 sp->addParam(
"DECIMALS", lineParser.getString(
"DECIMALS"));
1057 sensor->addMeter(sp);
1060 if( sens ==
"UPTIME" )
1062 sensor = sensorMap[
"UPTIME"];
1065 int interval = lineParser.getInt(
"INTERVAL");
1066 interval = (interval == 0)?60000:interval;
1067 sensor = ( sensorMap[
"UPTIME"] =
new UptimeSensor( interval ));
1068 sensorList->append( sensor );
1072 sp->addParam(
"FORMAT",
1073 m_theme.locale()->translate(lineParser.getString(
"FORMAT").ascii()));
1074 sensor->addMeter(sp);
1077 if( sens ==
"SENSOR" )
1079 sensor = sensorMap[
"SENSOR"];
1082 int interval = lineParser.getInt(
"INTERVAL");
1083 interval = (interval == 0)?30000:interval;
1084 sensor = (sensorMap[
"SENSOR"] =
new SensorSensor(interval, tempUnit));
1085 sensorList->append( sensor );
1088 sp->addParam(
"FORMAT",
1089 m_theme.locale()->translate(lineParser.getString(
"FORMAT").ascii()));
1090 sp->addParam(
"TYPE", lineParser.getString(
"TYPE"));
1091 sensor->addMeter(sp);
1095 if( sens ==
"TEXTFILE" )
1097 TQString path = lineParser.getString(
"PATH");
1098 bool rdf = lineParser.getBoolean(
"RDF");
1099 sensor = sensorMap[
"TEXTFILE"+path];
1102 int interval = lineParser.getInt(
"INTERVAL");
1103 interval = ( interval == 0 )?60000:interval;
1104 TQString encoding = lineParser.getString(
"ENCODING");
1106 sensor = ( sensorMap[
"TEXTFILE"+path] =
1108 sensorList->append( sensor );
1111 sp->addParam(
"LINE",TQString::number(lineParser.getInt(
"LINE")));
1112 sensor->addMeter(sp);
1118 sensor = sensorMap[
"DATE"];
1121 int interval = lineParser.getInt(
"INTERVAL");
1122 interval = (interval == 0)?60000:interval;
1123 sensor = ( sensorMap[
"DATE"] =
new DateSensor( interval ) );
1124 sensorList->append( sensor );
1125 timeList->append( sensor );
1128 sp->addParam(
"FORMAT",
1129 m_theme.locale()->translate(lineParser.getString(
"FORMAT").ascii()));
1130 sp->addParam(
"CALWIDTH",lineParser.getString(
"CALWIDTH"));
1131 sp->addParam(
"CALHEIGHT",lineParser.getString(
"CALHEIGHT"));
1132 sensor->addMeter(sp);
1137 if( sens ==
"XMMS" )
1139 sensor = sensorMap[
"XMMS"];
1142 int interval = lineParser.getInt(
"INTERVAL");
1143 interval = (interval == 0)?1000:interval;
1144 TQString encoding = lineParser.getString(
"ENCODING");
1146 sensor = ( sensorMap[
"XMMS"] =
new XMMSSensor( interval, encoding ) );
1147 sensorList->append( sensor );
1150 sp->addParam(
"FORMAT",
1151 m_theme.locale()->translate(lineParser.getString(
"FORMAT").ascii()));
1152 sensor->addMeter(sp);
1153 sensor->setMaxValue(sp);
1158 if( sens ==
"NOATUN" )
1160 sensor = sensorMap[
"NOATUN"];
1163 int interval = lineParser.getInt(
"INTERVAL");
1164 interval = (interval == 0)?1000:interval;
1165 sensor = ( sensorMap[
"NOATUN"] =
new NoatunSensor( interval, client ) );
1166 sensorList->append( sensor );
1169 sp->addParam(
"FORMAT",
1170 m_theme.locale()->translate(lineParser.getString(
"FORMAT").ascii()));
1171 sensor->addMeter(sp);
1172 sensor->setMaxValue(sp);
1175 if( sens ==
"PROGRAM")
1177 TQString progName = lineParser.getString(
"PROGRAM");
1178 sensor = sensorMap[
"PROGRAM"+progName];
1181 int interval = lineParser.getInt(
"INTERVAL");
1182 interval = (interval == 0)?3600000:interval;
1183 TQString encoding = lineParser.getString(
"ENCODING");
1185 sensor = (sensorMap[
"PROGRAM"+progName] =
1186 new ProgramSensor( progName, interval, encoding ) );
1187 sensorList->append( sensor );
1190 sp->addParam(
"LINE", TQString::number(lineParser.getInt(
"LINE")));
1191 sp->addParam(
"THEMAPATH", m_theme.path() );
1192 sensor->addMeter(sp);
1197 TQString source = lineParser.getString(
"SOURCE");
1199 m_theme.locale()->translate(lineParser.getString(
"FORMAT").ascii());
1201 sensor = sensorMap[
"RSS"+source];
1204 int interval = lineParser.getInt(
"INTERVAL");
1205 interval = ( interval == 0 )?60000:interval;
1206 TQString encoding = lineParser.getString(
"ENCODING");
1208 sensor = ( sensorMap[
"RSS"+source] =
1209 new RssSensor( source, interval, format, encoding ) );
1210 sensorList->append( sensor );
1213 sp->addParam(
"SOURCE",lineParser.getString(
"SOURCE"));
1214 sensor->addMeter(sp);
1219 TQTimer::singleShot( 0, sensor, TQ_SLOT(update()) );
1224 void karamba::slotFileChanged(
const TQString & file)
1228 TQString pythonFile = m_theme.path() +
"/" + m_theme.pythonModule() +
".py";
1230 if(file == m_theme.file() || file == pythonFile)
1234 void karamba::passMenuOptionChanged(TQString key,
bool value)
1237 if (pythonIface && pythonIface->isExtensionLoaded())
1238 pythonIface->menuOptionChanged(
this, key, value);
1241 void karamba::setIncomingData(TQString theme, TQString obj)
1243 KarambaApplication* app = (KarambaApplication*)tqApp;
1245 kdDebug() <<
"karamba::setIncomingData " << theme << obj << endl;
1253 DCOPClient *c = kapp->dcopClient();
1254 if (!c->isAttached())
1258 app->dcopStub()->setIncomingData(theme, obj);
1261 void karamba::callTheme(TQString theme, TQString txt)
1263 KarambaApplication* app = (KarambaApplication*)tqApp;
1264 kdDebug() <<
"karamba::callTheme " << theme << txt << endl;
1273 DCOPClient *c = kapp->dcopClient();
1274 if (!c->isAttached())
1278 app->dcopStub()->themeNotify(theme, txt);
1281 void karamba::themeNotify(TQString theme, TQString txt)
1283 kdDebug() <<
"karamba::themeNotify" << theme << txt << endl;
1284 if (pythonIface->isExtensionLoaded())
1286 pythonIface->themeNotify(
this, theme.ascii(), txt.ascii());
1290 void karamba::meterClicked(TQMouseEvent* e, Meter* meter)
1293 if (pythonIface && pythonIface->isExtensionLoaded() && haveUpdated)
1297 if( e->button() == TQt::LeftButton )
1299 else if( e->button() == TQt::MidButton )
1301 else if( e->button() == TQt::RightButton )
1304 if (RichTextLabel* richText =
dynamic_cast<RichTextLabel*
>(meter))
1306 pythonIface->meterClicked(
this, richText->anchorAt(e->x(), e->y()),
1311 pythonIface->meterClicked(
this, meter, button);
1316 void karamba::changeInterval(
int interval)
1318 if (m_sysTimer != NULL)
1319 m_sysTimer->changeInterval(interval);
1322 void karamba::passClick(TQMouseEvent *e)
1325 TQObjectListIt it2( *timeList );
1328 (( DateSensor* ) *it2)->toggleCalendar( e );
1335 TQObjectList clickListTmp(*clickList);
1336 TQObjectListIt it(clickListTmp);
1339 Meter* meter = (Meter*)(*it);
1341 if (clickList->containsRef(meter) && meter->click(e))
1344 meterClicked(e, meter);
1350 if (pythonIface && pythonIface->isExtensionLoaded() && haveUpdated)
1354 if( e->button() == TQt::LeftButton )
1356 else if( e->button() == TQt::MidButton )
1358 else if( e->button() == TQt::RightButton )
1361 pythonIface->widgetClicked(
this, e->x(), e->y(), button);
1365 void karamba::passWheelClick( TQWheelEvent *e )
1369 if (pythonIface && pythonIface->isExtensionLoaded() && haveUpdated)
1373 if( e->delta() > 0 )
1380 if (want_meter_wheel_event)
1382 TQObjectList clickListTmp(*clickList);
1383 TQObjectListIt it(clickListTmp);
1385 TQMouseEvent fakeEvent(TQEvent::MouseButtonPress, e->pos(), e->globalPos(), button, e->state());
1389 Meter* meter = (Meter*)(*it);
1391 if (clickList->containsRef(meter) && meter->click(&fakeEvent))
1393 if (RichTextLabel* richText =
dynamic_cast<RichTextLabel*
>(meter))
1395 pythonIface->meterClicked(
this, richText->anchorAt(fakeEvent.x(), fakeEvent.y()),
1400 pythonIface->meterClicked(
this, meter, button);
1407 pythonIface->widgetClicked(
this, e->x(), e->y(), button);
1411 void karamba::management_popup(
void )
1413 kpop->popup(TQCursor::pos());
1416 void karamba::mousePressEvent( TQMouseEvent *e )
1419 if( e->button() == TQt::RightButton && !want_right_button )
1425 clickPos = e->pos();
1426 if( toggleLocked -> isChecked() )
1428 if( !(onTop || managed))
1429 KWin::lowerWindow( winId() );
1433 void karamba::wheelEvent( TQWheelEvent *e )
1436 passWheelClick( e );
1439 void karamba::mouseReleaseEvent( TQMouseEvent *e )
1442 clickPos = e->pos();
1445 void karamba::mouseDoubleClickEvent( TQMouseEvent *e )
1448 if( !toggleLocked -> isChecked() )
1454 void karamba::keyPressEvent(TQKeyEvent *e)
1457 keyPressed(e->text(), 0);
1460 void karamba::keyPressed(
const TQString& s,
const Meter* meter)
1462 if (pythonIface && pythonIface->isExtensionLoaded())
1463 pythonIface->keyPressed(
this, meter, s);
1466 void karamba::mouseMoveEvent( TQMouseEvent *e )
1469 if( e->state() != 0 && e->state() < 16 && !toggleLocked -> isChecked() )
1471 move( e->globalPos() - clickPos );
1476 TQObjectListIt it(*clickList);
1477 bool insideArea =
false;
1481 insideArea = ((Meter*)(*it)) -> insideActiveArea(e -> x(), e ->y());
1491 if( cursor().shape() != PointingHandCursor )
1492 setCursor( PointingHandCursor );
1496 if( cursor().shape() != ArrowCursor )
1497 setCursor( ArrowCursor );
1500 TQObjectListIt image_it( *imageList);
1501 while ( image_it != 0 )
1503 ((ImageLabel*) *image_it)->rolloverImage(e);
1508 if (pythonIface && pythonIface->isExtensionLoaded())
1516 if( e->state() == TQt::LeftButton)
1519 else if( e->state() == TQt::MidButton )
1522 else if( e->state() == TQt::RightButton )
1525 pythonIface->widgetMouseMoved(
this, e->x(), e->y(), button);
1529 void karamba::closeEvent ( TQCloseEvent * qc)
1537 void karamba::paintEvent ( TQPaintEvent *e)
1542 if( !(onTop || managed))
1544 if( lowerTimer.elapsed() > 100 )
1546 KWin::lowerWindow( winId() );
1547 lowerTimer.restart();
1550 TQRect rect = e->rect();
1551 bitBlt(
this,rect.topLeft(),&pm,rect,TQt::CopyROP);
1554 void karamba::updateSensors()
1557 TQObjectListIt it( *sensorList );
1560 ((Sensor*) *it)->update();
1563 TQTimer::singleShot( 500,
this, TQ_SLOT(step()) );
1566 void karamba::updateBackground(TDESharedPixmap* kpm)
1574 themeStarted =
true;
1577 background = TQPixmap(*kpm);
1579 TQPixmap buffer = TQPixmap(size());
1581 pm = TQPixmap(size());
1582 buffer.fill(TQt::black);
1584 TQObjectListIt it( *imageList );
1586 bitBlt(&buffer,0,0,&background,0,TQt::CopyROP);
1590 if (((ImageLabel*) *it)->background == 1)
1592 ((ImageLabel*) *it)->mUpdate(&p, 1);
1598 bitBlt(&pm,0,0,&buffer,0,TQt::CopyROP);
1601 TQPixmap buffer2 = TQPixmap(size());
1603 pm = TQPixmap(size());
1604 buffer2.fill(TQt::black);
1606 TQObjectListIt it2( *meterList );
1608 bitBlt(&buffer2,0,0,&background,0,TQt::CopyROP);
1612 ((Meter*) *it2)->mUpdate(&p);
1617 bitBlt(&pm,0,0,&buffer2,0,TQt::CopyROP);
1620 systray->updateBackgroundPixmap(buffer2);
1625 void karamba::currentDesktopChanged(
int i )
1628 kroot->repaint(
true );
1629 if (pythonIface && pythonIface->isExtensionLoaded())
1630 pythonIface->desktopChanged(
this, i);
1633 void karamba::currentWallpaperChanged(
int i )
1636 kroot->repaint(
true );
1637 if (pythonIface && pythonIface->isExtensionLoaded())
1638 pythonIface->wallpaperChanged(
this, i);
1641 void karamba::externalStep()
1646 TQPixmap buffer = TQPixmap(size());
1648 pm = TQPixmap(size());
1649 buffer.fill(TQt::black);
1651 TQObjectListIt it( *meterList );
1653 bitBlt(&buffer,0,0,&background,0,TQt::CopyROP);
1657 ((Meter*) *it)->mUpdate(&p);
1662 bitBlt(&pm,0,0,&buffer,0,TQt::CopyROP);
1667 void karamba::step()
1670 if (widgetUpdate && haveUpdated)
1672 pm = TQPixmap(size());
1673 TQPixmap buffer = TQPixmap(size());
1674 buffer.fill(TQt::black);
1676 TQObjectListIt it( *meterList );
1679 bitBlt(&buffer,0,0,&background,0,TQt::CopyROP);
1683 ((Meter*) *it)->mUpdate(&p);
1688 bitBlt(&pm,0,0,&buffer,0,TQt::CopyROP);
1692 if (pythonIface && pythonIface->isExtensionLoaded())
1695 pythonIface->initWidget(
this);
1697 pythonIface->widgetUpdated(
this);
1703 void karamba::widgetClosed()
1706 if (pythonIface && pythonIface->isExtensionLoaded())
1707 pythonIface->widgetClosed(
this);
1710 void karamba::slotToggleLocked()
1713 if(toggleLocked->isChecked())
1715 toggleLocked->setIconSet(SmallIconSet(
"system-lock-screen"));
1719 toggleLocked->setIconSet(SmallIconSet(
"move"));
1723 void karamba::slotToggleFastTransforms()
1741 bool karamba::useSmoothTransforms()
1744 return !toggleFastTransforms -> isChecked();
1747 void karamba::writeConfigData()
1750 config -> setGroup(
"internal");
1751 config -> writeEntry(
"lockedPosition", toggleLocked -> isChecked() );
1752 config -> writeEntry(
"fastTransforms", toggleFastTransforms -> isChecked() );
1753 config -> writeEntry(
"desktop", desktop );
1754 config -> setGroup(
"theme");
1756 config -> writeEntry(
"widgetPosX", x());
1757 config -> writeEntry(
"widgetPosY", y());
1759 config -> writeEntry(
"widgetWidth", width());
1760 config -> writeEntry(
"widgetHeight", height());
1768 void karamba::slotToggleConfigOption(TQString key,
bool value)
1771 config -> setGroup(
"config menu");
1772 config -> writeEntry(key, value);
1773 passMenuOptionChanged(key, value);
1776 void karamba::addMenuConfigOption(TQString key, TQString name)
1779 kpop -> setItemEnabled(THEMECONF,
true);
1782 TDEToggleAction* confItem =
new TDEToggleAction (name, TDEShortcut::null(),
1783 action, TQ_SLOT(receive()),
1784 menuAccColl, key.ascii());
1785 confItem -> setName(key.ascii());
1787 menuAccColl -> insert(confItem);
1789 connect(action, TQ_SIGNAL( enabled(TQString,
bool) ),
1790 this, TQ_SLOT( slotToggleConfigOption(TQString,
bool) ));
1792 config -> setGroup(
"config menu");
1793 confItem -> setChecked(config -> readBoolEntry(key));
1795 confItem -> plug(themeConfMenu);
1797 numberOfConfMenuItems++;
1800 bool karamba::setMenuConfigOption(TQString key,
bool value)
1803 TDEToggleAction* menuAction = ((TDEToggleAction*)menuAccColl -> action(key.ascii()));
1804 if (menuAction == NULL)
1806 tqWarning(
"Menu action %s not found.", key.ascii());
1811 menuAction -> setChecked(value);
1816 bool karamba::readMenuConfigOption(TQString key)
1819 TDEToggleAction* menuAction = ((TDEToggleAction*)menuAccColl -> action(key.ascii()));
1820 if (menuAction == NULL)
1822 tqWarning(
"Menu action %s not found.", key.ascii());
1827 return menuAction -> isChecked();
1831 void karamba::passMenuItemClicked(
int id)
1835 if (pythonIface && pythonIface->isExtensionLoaded())
1837 TDEPopupMenu* menu = 0;
1838 for(
int i = 0; i < (int)menuList->count(); i++)
1843 tmp = (TDEPopupMenu*) menuList->first();
1847 tmp = (TDEPopupMenu*) menuList->next();
1851 if(tmp->isItemVisible(
id))
1858 pythonIface->menuItemClicked(
this, menu,
id);
1862 void karamba::activeTaskChanged(
Task* t)
1866 if (pythonIface && pythonIface->isExtensionLoaded())
1867 pythonIface->activeTaskChanged(
this, t);
1870 void karamba::taskAdded(
Task* t)
1874 if (pythonIface && pythonIface->isExtensionLoaded())
1875 pythonIface->taskAdded(
this, t);
1878 void karamba::taskRemoved(
Task* t)
1882 if (pythonIface && pythonIface->isExtensionLoaded())
1883 pythonIface->taskRemoved(
this, t);
1886 void karamba::startupAdded(
Startup* t)
1890 if (pythonIface && pythonIface->isExtensionLoaded())
1891 pythonIface->startupAdded(
this, t);
1894 void karamba::startupRemoved(
Startup* t)
1898 if (pythonIface && pythonIface->isExtensionLoaded())
1899 pythonIface->startupRemoved(
this, t);
1902 void karamba::processExited (TDEProcess* proc)
1905 if (pythonIface && pythonIface->isExtensionLoaded())
1906 pythonIface->commandFinished(
this, (
int)proc->pid());
1909 void karamba::receivedStdout (TDEProcess *proc,
char *buffer,
int)
1913 if (pythonIface && pythonIface->isExtensionLoaded())
1914 pythonIface->commandOutput(
this, (
int)proc->pid(), buffer);
1918 void karamba::saveProperties(TDEConfig* config)
1921 config->setGroup(
"session");
1922 config->writeEntry(
"theme", m_theme.file());
1927 void karamba::readProperties(TDEConfig* config)
1930 config->setGroup(
"session");
1931 TQString atheme = config->readEntry(
"theme");
1935 void karamba::dragEnterEvent(TQDragEnterEvent* event)
1938 event->accept(TQTextDrag::canDecode(event));
1942 void karamba::dropEvent(TQDropEvent* event)
1947 if ( TQTextDrag::decode(event, text) )
1950 if (pythonIface && pythonIface->isExtensionLoaded())
1952 const TQPoint &p =
event->pos();
1953 pythonIface->itemDropped(
this, text, p.x(), p.y());
1958 void karamba::toDesktop(
int id,
int menuid)
1966 int mid = toDesktopMenu->idAt(i);
1970 toDesktopMenu->setItemChecked(mid,
false);
1972 toDesktopMenu->setItemChecked(menuid,
true);
1975 info->setDesktop( desktop);
1977 info->setDesktop( NETWinInfo::OnAllDesktops );
1980 void karamba::systrayUpdated()
1983 if (pythonIface && pythonIface->isExtensionLoaded())
1984 pythonIface->systrayUpdated(
this);
1987 void karamba::toggleWidgetUpdate(
bool b)
1990 if (pythonIface && pythonIface->isExtensionLoaded())
1994 SignalBridge::SignalBridge(TQObject* parent, TQString name, TDEActionCollection* ac)
1995 : TQObject(parent, name.ascii()), collection(ac)
1997 setName(name.ascii());
2000 void SignalBridge::receive()
2002 emit enabled(name(), ((TDEToggleAction*)collection -> action(name())) ->
2006 DesktopChangeSlot::DesktopChangeSlot(TQObject *parent,
int id)
2007 : TQObject(parent,
"")
2012 void DesktopChangeSlot::receive()
2014 karamba *k = (karamba *)parent();
2018 k->toDesktop(desktopid, menuid);
2021 void DesktopChangeSlot::setMenuId(
int id)
2026 int DesktopChangeSlot::menuId()
2031 void karamba::showMenuExtension()
2033 kglobal =
new TDEPopupMenu(
this);
2035 trayMenuToggleId = kglobal->insertItem(SmallIconSet(
"superkaramba"),
2036 i18n(
"Show System Tray Icon"),
this,
2037 TQ_SLOT(slotToggleSystemTray()),
2040 trayMenuThemeId = kglobal->insertItem(SmallIconSet(
"knewstuff"),
2041 i18n(
"&Manage Themes..."),
this,
2042 TQ_SLOT(slotShowTheme()), CTRL+Key_M);
2044 trayMenuQuitId = kglobal->insertItem(SmallIconSet(
"system-log-out"),
2045 i18n(
"&Quit SuperKaramba"),
this,
2046 TQ_SLOT(slotQuit()), CTRL+Key_Q);
2050 trayMenuSeperatorId = kpop->insertSeparator();
2051 kpop->insertItem(
"SuperKaramba", kglobal);
2054 void karamba::hideMenuExtension()
2058 kpop->removeItem(trayMenuSeperatorId);
2059 kglobal->removeItem(trayMenuToggleId);
2060 kglobal->removeItem(trayMenuThemeId);
2061 kglobal->removeItem(trayMenuQuitId);
2068 void karamba::slotToggleSystemTray()
2070 karambaApp->globalHideSysTray(
false);
2073 void karamba::slotQuit()
2075 karambaApp->globalQuitSuperKaramba();
2078 void karamba::slotShowTheme()
2080 karambaApp->globalShowThemeDialog();
2083 void karamba::setAlwaysOnTop(
bool stay)
2088 KWin::setState( winId(), NET::KeepAbove );
2093 KWin::setState( winId(), NET::KeepBelow );
2097 #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).