You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tde-style-baghira/bab/main.cpp

618 lines
19 KiB

/***************************************************************************
* Copyright (C) 2004 by Thomas Lübking *
* thomas@home *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/
#include "bab.h"
#include <tqpushbutton.h>
#include <tqcheckbox.h>
#include <tqcombobox.h>
#include <tqdir.h>
#include <tqlayout.h>
#include <tqsettings.h>
#include <tqtabwidget.h>
#include <tqtooltip.h>
#include <tqtimer.h>
#include <tqvbox.h>
#include <tqpainter.h>
#include <dcopclient.h>
#include <tdeapplication.h>
// #include <tdeconfig.h>
#include <kiconloader.h>
#include <tdeaboutdata.h>
#include <tdecmdlineargs.h>
#include <kipc.h>
#include <klibloader.h>
#include <tdelocale.h>
#include <kprocess.h>
#if KDE_IS_VERSION(3,4,0)
#include <twin.h>
#endif
#include <stdio.h>
#include <X11/Xlib.h>
#include <X11/extensions/shape.h>
#include "styleconfdialog.h"
static const char description[] =
I18N_NOOP("Baghira Aqua/Brushed");
static const char version[] = "cvs";
static TDECmdLineOptions options[] =
{
// { "+[URL]", I18N_NOOP( "Document to open." ), 0 },
TDECmdLineLastOption
};
int main(int argc, char **argv)
{
TDEAboutData about("bab", I18N_NOOP("BAB - Baghira Aqua/Brushed Switcher"), version, description,
TDEAboutData::License_GPL, "(C) 2004/2005 Thomas Lübking", 0, 0, "baghira-style@gmx.net");
about.addAuthor( "Thomas Lübking", 0, "baghira-style@gmx.net" );
TDECmdLineArgs::init(argc, argv, &about);
TDECmdLineArgs::addCmdLineOptions( options );
TDEApplication app;
DCOPClient* client = app.dcopClient();
client->registerAs( "bab", false);
client->setDefaultObject( "babInterface" );
bab* mainBAB = 0;
mainBAB = new bab;
app.setMainWidget(mainBAB);
Corner leftCorner(Corner::left);
Corner rightCorner(Corner::right);
#if KDE_IS_VERSION(3,4,0)
KWin::setShadowSize(leftCorner.winId(), 0);
KWin::setShadowSize(rightCorner.winId(), 0);
#endif
if (!mainBAB->cornerCheck->isChecked())
{
leftCorner.hide();
rightCorner.hide();
}
leftCorner.connect( mainBAB->cornerCheck, SIGNAL(toggled(bool)), SLOT(toggle(bool)) );
rightCorner.connect( mainBAB->cornerCheck, SIGNAL(toggled(bool)), SLOT(toggle(bool)) );
int ret = app.exec();
if (mainBAB) delete mainBAB;
return ret;
}
bab::bab() : TDEMainWindow(0,"bab",TQt::WStyle_StaysOnTop | TQt::WX11BypassWM ){
bSwitcher = new BabSwitcher(this,"switcher");
TQToolTip::add(bSwitcher, i18n("leftclick toggles state<br>rightclick toggles setupmenu"));
bSwitcher->show();
TQDir d( TQDir::homeDirPath() + "/.baghira");
if (!d.exists())
d.mkdir(TQDir::homeDirPath() + "/.baghira");
d = TQDir( TQDir::homeDirPath() + "/.baghira/.bab");
if (!d.exists())
d.mkdir(TQDir::homeDirPath() + "/.baghira/.bab");
FILE *file = NULL;
TQString tmpString = TQDir::homeDirPath() + "/.baghira/Jaguar";
if (!TQFile::exists(tmpString))
{
if( (file = fopen(tmpString.latin1(), "w")) != NULL )
{
fprintf(file,"0\n0\n0\n0\n0\n1\n-1\n-1\n-1\n-1\n-1\n-1\n-1\n-1\n1\n");
fclose(file);
}
}
tmpString = TQDir::homeDirPath() + "/.baghira/Panther";
if (!TQFile::exists(tmpString))
{
if( (file = fopen(tmpString.latin1(), "w")) != NULL )
{
fprintf(file,"1\n1\n1\n1\n1\n1\n-1\n-1\n-1\n-1\n-1\n-1\n-1\n-1\n1\n");
fclose(file);
}
}
tmpString = TQDir::homeDirPath() + "/.baghira/Brushed";
if (!TQFile::exists(tmpString))
{
if( (file = fopen(tmpString.latin1(), "w")) != NULL )
{
fprintf(file,"2\n2\n1\n2\n1\n1\n-1\n-1\n-1\n-1\n-1\n-1\n-1\n-1\n0\n");
fclose(file);
}
}
tmpString = TQDir::homeDirPath() + "/.baghira/Tiger";
if (!TQFile::exists(tmpString))
{
if( (file = fopen(tmpString.latin1(), "w")) != NULL )
{
fprintf(file,"3\n3\n1\n1\n0\n1\n-1\n-1\n-1\n-1\n-1\n-1\n-1\n-1\n1\n");
fclose(file);
}
}
tmpString = TQDir::homeDirPath() + "/.baghira/Milk";
if (!TQFile::exists(tmpString))
{
if( (file = fopen(tmpString.latin1(), "w")) != NULL )
{
fprintf(file,"4\n4\n4\n4\n1\n0\n-592138\n-4930834\n-1\n-16777216\n-13009982\n-1\n-16777216\n-1116417\n1\n");
fclose(file);
}
}
TQVBox *vb = new TQVBox(this);
vb->setLineWidth(2);
vb->setMargin(2);
// vb->setFrameStyle(TQFrame::Panel | TQFrame::Plain );
TQLabel *DefStyleLabel = new TQLabel("Default Style is", vb);
DefStyle = new TQComboBox(vb);
DefStyle->insertItem ( "Jaguar" );
DefStyle->insertItem ( "Panther" );
DefStyle->insertItem ( "Brushed" );
DefStyle->insertItem ( "Tiger" );
DefStyle->insertItem ( "Milk" );
cornerCheck = new TQCheckBox("Round upper screen corners", vb);
TQSettings config;
config.beginGroup("/baghira/BAB");
DefStyle->setCurrentItem(config.readNumEntry("defaultState", BabSwitcher::Panther ));
cornerCheck->setChecked( config.readBoolEntry("roundCorners", true ) );
config.endGroup();
TQPushButton *configBaghira = new TQPushButton("Configure Baghira", vb);
TQPushButton *Quit = new TQPushButton("Quit BAB", vb);
TQPushButton *Close = new TQPushButton("Close Menu", vb);
vb->adjustSize();
bSwitcher->setStyle(DefStyle->currentText());
bSwitcher->setDeco(DefStyle->currentText());
connect(DefStyle, SIGNAL(activated(int)), this, SLOT(saveSettings()));
connect(cornerCheck, SIGNAL(toggled(bool)), this, SLOT(saveSettings()));
connect(configBaghira, SIGNAL(clicked()), this, SLOT(configureBaghira()));
connect(Close, SIGNAL(clicked()), this, SLOT(hide()));
connect(Quit, SIGNAL(clicked()), this, SLOT(close()));
resize(vb->width(),vb->height());
// show();
}
bab::~ bab()
{
bSwitcher->setStyle(DefStyle->currentText());
bSwitcher->setDeco(DefStyle->currentText());
if (bSwitcher) delete bSwitcher;
}
/*Taken from kcontrol, tdecmshell style*/
void bab::configureBaghira()
{
// Use KLibLoader to get the library, handling
// any errors that arise
KLibLoader* loader = KLibLoader::self();
KLibrary* library = loader->library( TQFile::encodeName("tdestyle_baghira_config") );
if (!library)
{
tqWarning("There was an error loading the configuration dialog for this style.");
return;
}
void* allocPtr = library->symbol("allocate_kstyle_config");
if (!allocPtr)
{
tqWarning("There was an error loading the configuration dialog for this style.");
return;
}
//Create the container dialog
StyleConfigDialog* dial = new StyleConfigDialog(this, "Baghira Configuration");
dial->enableButtonSeparator(true);
typedef TQWidget*(* factoryRoutine)( TQWidget* parent );
//Get the factory, and make the widget.
factoryRoutine factory = (factoryRoutine)(allocPtr);
TQWidget* styleConfig = factory( dial );
TQTabWidget* tw = (TQTabWidget*)styleConfig->child("tabWidget");
TQWidget* decoConfig = 0;
TQObject *decoObject = 0;
if (tw)
{
KLibrary* library2 = loader->library( TQFile::encodeName("twin_baghira_config") );
if (!library2)
{
tqWarning("There was an error loading the configuration dialog for the deco.");
return;
}
void* allocPtr2 = library2->symbol("allocate_config");
if (!allocPtr2)
{
tqWarning("There was an error loading the configuration dialog for this style.");
return;
}
typedef TQObject*(* factoryRoutine2)( TDEConfig* conf, TQWidget* parent );
factoryRoutine2 factory2 = (factoryRoutine2)(allocPtr2);
decoObject = factory2( 0, tw );
decoConfig = (TQWidget*)tw->child("ConfigDialog");
tw->addTab(decoConfig, "Decoration");
}
//Insert it in...
dial->setMainWidget( styleConfig );
TQWidget *desktop = TQApplication::desktop();
TQPoint nPos((desktop->width() - dial->width())/2, (desktop->height() - dial->height() - 100)/2);
dial->move(nPos);
//..and connect it to the wrapper
connect(styleConfig, SIGNAL(changed(bool)), dial, SLOT(setStyleDirty(bool)));
connect(decoObject, SIGNAL(changed()), dial, SLOT(setDecoDirty()));
connect(dial, SIGNAL(defaults()), styleConfig, SLOT(defaults()));
connect(dial, SIGNAL(save()), styleConfig, SLOT(save()));
connect(dial, SIGNAL(defaults()), decoObject, SLOT(defaults()));
connect(dial, SIGNAL(save(TDEConfig*)), decoObject, SLOT(save(TDEConfig*)));
if (dial->exec() == TQDialog::Accepted)
{
//For now, ask all KDE apps to recreate their styles to apply the setitngs
if (dial->isStyleDirty())
{
KIPC::sendMessageAll(KIPC::StyleChanged);
KIPC::sendMessageAll(KIPC::ToolbarStyleChanged);
}
if (dial->isDecoDirty())
kapp->dcopClient()->send("twin", "KWinInterface", "reconfigure()", TQByteArray());
}
tw->removeChild( decoObject );
dial->insertChild( decoObject );
decoConfig->reparent(dial, TQPoint(0,0));
delete dial;
}
/* overwrite the show event for repositioning the window on top
of the icon, adapted from kkeyled */
void bab::showEvent(TQShowEvent *e){
if ( bSwitcher->globalPos->x() >= 0) {
TQWidget *desktop = TQApplication::desktop();
int w = desktop->width();
TQPoint nPos;
if (bSwitcher->globalPos->y() - height() >= 0 )
{ // it's not on top
nPos.setY(bSwitcher->globalPos->y() -height());
nPos.setX(bSwitcher->globalPos->x() - (width() / 2));
}
else if ( bSwitcher->globalPos->y() >= 0 )
{
nPos.setY(bSwitcher->globalPos->y() + bSwitcher->height() );
nPos.setX(bSwitcher->globalPos->x() - (width() / 2));
}
if ( nPos.x() < 0 )
{
nPos.setX(bSwitcher->globalPos->x() + bSwitcher->width());
}
else if ( bSwitcher->globalPos->x() + (width() / 2) > w )
{
nPos.setX(bSwitcher->globalPos->x() - width());
}
move(nPos);
}
// If it was set by the normal sessionmanagement it needs
// to set the Flags again
setWFlags(TQt::WStyle_StaysOnTop | TQt::WX11BypassWM);
TQWidget::showEvent(e); // execute the normal showevent
raise();
}
void bab::saveSettings(){
TQSettings *config = new TQSettings();
// TDEConfig *config = new TDEConfig("baghirarc");
config->beginGroup("/baghira/BAB");
config->writeEntry("defaultState", DefStyle->currentItem());
config->writeEntry("roundCorners", cornerCheck->isChecked());
config->endGroup();
delete config;
}
TQPoint *BabSwitcher::globalPos = new TQPoint(0,0);
BabSwitcher::BabSwitcher(bab *parent, const char *name)
: KSystemTray(parent,name), DCOPObject("babInterface") {
TDEIconLoader* iLoader = TDEGlobal::iconLoader();
JaguarIcon = iLoader->loadIcon("bab_jaguar", TDEIcon::Small, 22);
PantherIcon = iLoader->loadIcon("bab_panther", TDEIcon::Small, 22);
iTunesIcon = iLoader->loadIcon("bab_itunes", TDEIcon::Small, 22);
TigerIcon = iLoader->loadIcon("bab_tiger", TDEIcon::Small, 22);
MilkIcon = iLoader->loadIcon("bab_milk", TDEIcon::Small, 22);
installEventFilter(this);
}
BabSwitcher::~BabSwitcher(){
}
void BabSwitcher::toggle()
{
if ( state_ < Milk )
state_++;
else
state_ = Jaguar;
decoState_ = state_;
TQString nameString;
switch (state_)
{
case Jaguar:
nameString = "Jaguar";
break;
case Panther:
nameString = "Panther";
break;
case iTunes:
nameString = "Brushed";
break;
case Tiger:
nameString = "Tiger";
break;
case Milk:
nameString = "Milk";
}
TQString tmpString = TQDir::homeDirPath() + "/.baghira/" + nameString;
TQString tmpString2 = TQDir::homeDirPath() + "/.baghira/.bab/.style";
remove(tmpString2.latin1());
symlink (tmpString.latin1(), tmpString2.latin1());
tmpString2 = TQDir::homeDirPath() + "/.baghira/.bab/.deco";
remove(tmpString2.latin1());
symlink (tmpString.latin1(), tmpString2.latin1());
repaint();
}
void BabSwitcher::setStyle(TQString style)
{
if (style == "Jaguar")
state_ = Jaguar;
else if (style == "Brushed")
state_ = iTunes;
else if (style == "Tiger")
state_ = Tiger;
else if (style == "Milk")
state_ = Milk;
else
{
if (style != "Panther")
style = "Panther";
state_ = Panther;
}
TQString tmpString = TQDir::homeDirPath() + "/.baghira/" + style;
TQString tmpString2 = TQDir::homeDirPath() + "/.baghira/.bab/.style";
remove(tmpString2.latin1());
symlink (tmpString.latin1(), tmpString2.latin1());
repaint();
}
void BabSwitcher::setDeco(TQString deco)
{
if (deco == "Jaguar")
decoState_ = Jaguar;
else if (deco == "Brushed")
decoState_ = iTunes;
else if (deco == "Tiger")
decoState_ = Tiger;
else if (deco == "Milk")
decoState_ = Milk;
else
{
if (deco != "Panther")
deco = "Panther";
decoState_ = Panther;
}
TQString tmpString = TQDir::homeDirPath() + "/.baghira/" + deco;
TQString tmpString2 = TQDir::homeDirPath() + "/.baghira/.bab/.deco";
remove(tmpString2.latin1());
symlink (tmpString.latin1(), tmpString2.latin1());
}
TQString BabSwitcher::style()
{
switch (state_)
{
case Jaguar:
return "Jaguar";
default:
case Panther:
return "Panther";
case iTunes:
return "Brushed";
case Tiger:
return "Tiger";
case Milk:
return "Milk";
}
}
TQString BabSwitcher::deco()
{
switch (decoState_)
{
case Jaguar:
return "Jaguar";
default:
case Panther:
return "Panther";
case iTunes:
return "Brushed";
case Tiger:
return "Tiger";
case Milk:
return "Milk";
}
}
void BabSwitcher::start(TQString name, TQString settings)
{
TDEProcess proc;
TQString section; int i = 0; bool done = false;
if (name.contains(' '))
{
while (!done)
{
section = name.section(' ',i,i);
if (i == 0)
{
TQString tmpString = TQDir::homeDirPath() + "/.baghira/" + settings;
TQString tmpString2 = TQDir::homeDirPath() + "/.baghira/.bab/" + section;
remove(tmpString2.latin1());
symlink (tmpString.latin1(), tmpString2.latin1());
}
if (!section.isEmpty())
proc << section;
else
done = true;
i++;
}
}
else
{
TQString tmpString = TQDir::homeDirPath() + "/.baghira/" + settings;
TQString tmpString2 = TQDir::homeDirPath() + "/.baghira/.bab/" + name;
remove(tmpString2.latin1());
symlink (tmpString.latin1(), tmpString2.latin1());
proc << name;
}
proc.start(TDEProcess::DontCare);
proc.detach();
}
void BabSwitcher::emitStyleChanged()
{
KIPC::sendMessageAll(KIPC::StyleChanged);
KIPC::sendMessageAll(KIPC::ToolbarStyleChanged);
}
void BabSwitcher::mousePressEvent(TQMouseEvent *e){
TQWidget *daddy = parentWidget();
globalPos->setX(e->globalX() - e->x());
globalPos->setY(e->globalY() - e->y());
switch ( e->button() )
{
case LeftButton:
{
toggle();
break;
}
case RightButton:
default:
{
if ( daddy->isVisible() )
daddy->hide();
else
daddy->show();
}
}
}
void BabSwitcher::paintEvent(TQPaintEvent *ev){
KSystemTray::paintEvent(ev);
TQPainter icyApainter(this);
switch (state_)
{
case Jaguar:
JaguarIcon.isNull() ? icyApainter.fillRect(rect(), TQt::blue) : icyApainter.drawPixmap(0, 0, JaguarIcon);
break;
case Panther:
PantherIcon.isNull() ? icyApainter.fillRect(rect(), TQt::black) : icyApainter.drawPixmap(0, 0, PantherIcon);
break;
case iTunes:
iTunesIcon.isNull() ? icyApainter.fillRect(rect(), TQt::gray) : icyApainter.drawPixmap(0, 0, iTunesIcon);
break;
case Tiger:
TigerIcon.isNull() ? icyApainter.fillRect(rect(), TQt::yellow) : icyApainter.drawPixmap(0, 0, TigerIcon);
break;
case Milk:
MilkIcon.isNull() ? icyApainter.fillRect(rect(), TQt::white) : icyApainter.drawPixmap(0, 0, MilkIcon);
default:
break;
}
icyApainter.end();
}
Corner::Corner(Side side) : TQWidget(0, (side == left)?"left_corner":"right_corner", TQt::WType_TopLevel | TQt::WStyle_NoBorder | TQt::WStyle_StaysOnTop | TQt::WX11BypassWM )
{
if (side == left) {
setFixedSize(5,4);
move(0,0);
show();
setPaletteBackgroundColor(TQt::black);
XRectangle* xrects = new XRectangle[4];
xrects[ 0 ].x = 0;
xrects[ 0 ].y = 0;
xrects[ 0 ].width = 5;
xrects[ 0 ].height = 1;
xrects[ 1 ].x = 0;
xrects[ 1 ].y = 1;
xrects[ 1 ].width = 3;
xrects[ 1 ].height = 1;
xrects[ 2 ].x = 0;
xrects[ 2 ].y = 2;
xrects[ 2 ].width = 2;
xrects[ 2 ].height = 1;
xrects[ 3 ].x = 0;
xrects[ 3 ].y = 3;
xrects[ 3 ].width = 1;
xrects[ 3 ].height = 2;
XShapeCombineRectangles( tqt_xdisplay(), winId(), ShapeBounding, 0, 0,
xrects, 4, ShapeSet, 0 );
delete[] xrects;
}
else {
setFixedSize(5,4);
move(TQApplication::desktop()->width()-5,0);
show();
setPaletteBackgroundColor(TQt::black);
XRectangle* xrects = new XRectangle[4];
xrects[ 0 ].x = 0;
xrects[ 0 ].y = 0;
xrects[ 0 ].width = 5;
xrects[ 0 ].height = 1;
xrects[ 1 ].x = 2;
xrects[ 1 ].y = 1;
xrects[ 1 ].width = 3;
xrects[ 1 ].height = 1;
xrects[ 2 ].x = 3;
xrects[ 2 ].y = 2;
xrects[ 2 ].width = 2;
xrects[ 2 ].height = 1;
xrects[ 3 ].x = 4;
xrects[ 3 ].y = 3;
xrects[ 3 ].width = 1;
xrects[ 3 ].height = 2;
XShapeCombineRectangles( tqt_xdisplay(), winId(), ShapeBounding, 0, 0,
xrects, 4, ShapeSet, 0 );
delete[] xrects;
}
}
void Corner::toggle(bool b)
{
b?show():hide();
}
#include "bab.moc"