summaryrefslogtreecommitdiffstats
path: root/src/SUSE2.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/SUSE2.cpp')
-rw-r--r--src/SUSE2.cpp334
1 files changed, 334 insertions, 0 deletions
diff --git a/src/SUSE2.cpp b/src/SUSE2.cpp
new file mode 100644
index 0000000..971d146
--- /dev/null
+++ b/src/SUSE2.cpp
@@ -0,0 +1,334 @@
+/* SuSE KWin window decoration
+ Copyright (C) 2005 Gerd Fleischer <gerdfleischer@web.de>
+ Copyright (C) 2005 Adrian Schroeter <adrian@suse.de>
+
+ based on the window decoration "Plastik" and "Web":
+ Copyright (C) 2003 Sandro Giessl <ceebx@users.sourceforge.net>
+ Copyright (C) 2001 Rik Hemsley (rikkus) <rik@kde.org>
+
+ 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; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ Boston, MA 02110-1301 USA.
+*/
+
+//#include <kdebug.h>
+
+#include <qpainter.h>
+#include <qbitmap.h>
+
+#include <kconfig.h>
+#include <klocale.h>
+#include <kglobal.h>
+#include <kstandarddirs.h>
+#include <kpixmap.h>
+
+#include "misc.h"
+#include "shadow.h"
+#include "SUSE2.h"
+#include "SUSE2.moc"
+#include "SUSE2client.h"
+#include "SUSE2button.h"
+
+namespace KWinSUSE2
+{
+
+SUSE2Handler::SUSE2Handler()
+{
+ memset(m_pixmaps, 0, sizeof(QPixmap *) * NumButtonStatus * NumButtonIcons); // set elements to 0
+
+ KGlobal::locale()->insertCatalogue("kwin_clients");
+ KGlobal::locale()->insertCatalogue("kwin_SUSE2");
+
+ reset(0);
+}
+
+SUSE2Handler::~SUSE2Handler()
+{
+ for (int t = 0; t < NumButtonStatus; ++t)
+ for (int i = 0; i < NumButtonIcons; ++i)
+ delete m_pixmaps[t][i];
+}
+
+bool SUSE2Handler::reset(unsigned long /*changed*/)
+{
+ // we assume the active font to be the same as the inactive font since the control
+ // center doesn't offer different settings anyways.
+ m_titleFont = KDecoration::options()->font(true, false); // not small
+ m_titleFontTool = KDecoration::options()->font(true, true); // small
+
+ switch(KDecoration::options()->preferredBorderSize( this )) {
+ case BorderTiny:
+ m_borderSize = 3;
+ break;
+ case BorderLarge:
+ m_borderSize = 8;
+ break;
+ case BorderVeryLarge:
+ m_borderSize = 12;
+ break;
+ case BorderHuge:
+ m_borderSize = 18;
+ break;
+ case BorderVeryHuge:
+ m_borderSize = 27;
+ break;
+ case BorderOversized:
+ m_borderSize = 40;
+ break;
+ case BorderNormal:
+ default:
+ m_borderSize = 4;
+ }
+
+ // check if we are in reverse layout mode
+ m_reverse = QApplication::reverseLayout();
+
+ // read in the configuration
+ readConfig();
+
+ for (int t = 0; t < NumButtonStatus; ++t) {
+ for (int i = 0; i < NumButtonIcons; ++i) {
+ if (m_pixmaps[t][i]) {
+ delete m_pixmaps[t][i];
+ m_pixmaps[t][i] = 0;
+ }
+ }
+ }
+
+ /// I dont want to do smart things here
+ /// just for cases that do not happen very often.
+ return true;
+}
+
+KDecoration* SUSE2Handler::createDecoration( KDecorationBridge* bridge )
+{
+ return new SUSE2Client( bridge, this );
+}
+
+bool SUSE2Handler::supports( Ability ability ) const
+{
+ switch( ability )
+ {
+ case AbilityAnnounceButtons:
+ case AbilityButtonMenu:
+ case AbilityButtonOnAllDesktops:
+ case AbilityButtonSpacer:
+ case AbilityButtonHelp:
+ case AbilityButtonMinimize:
+ case AbilityButtonMaximize:
+ case AbilityButtonClose:
+ case AbilityButtonAboveOthers:
+ case AbilityButtonBelowOthers:
+ case AbilityButtonShade:
+ return true;
+ default:
+ return false;
+ };
+}
+
+void SUSE2Handler::readConfig()
+{
+ // create a config object
+ KConfig config("kwinSUSE2rc");
+ config.setGroup("General");
+
+ // grab settings
+ QString alignValue = config.readEntry("TitleAlignment", "AlignLeft");
+ if (alignValue == "AlignLeft") m_titleAlign = Qt::AlignLeft;
+ else if (alignValue == "AlignHCenter") m_titleAlign = Qt::AlignHCenter;
+ else if (alignValue == "AlignRight") m_titleAlign = Qt::AlignRight;
+
+ QString roundValue = config.readEntry("RoundCorners", "NotMaximized");
+ if (roundValue == "RoundAlways") m_roundCorners = 1;
+ else if (roundValue == "NotMaximized") m_roundCorners = 2;
+ else if (roundValue == "RoundNever") m_roundCorners = 3;
+
+ m_menuClose = config.readBoolEntry("CloseOnMenuDoubleClick", true);
+ m_titleShadow = config.readBoolEntry("TitleShadow", true);
+
+ QFontMetrics fm(m_titleFont); // active font = inactive font
+ int addSpace = config.readNumEntry("AddSpace", 4);
+ // The title should stretch with bigger font sizes!
+ m_titleHeight = QMAX(16, fm.height() + addSpace);
+
+ fm = QFontMetrics(m_titleFontTool); // active font = inactive font
+ m_titleHeightTool = QMAX(13, fm.height() ); // don't care about the shadow etc.
+
+ m_titlebarStyle = config.readNumEntry("TitleBarStyle", 0);
+
+ m_buttonType = config.readNumEntry("TitleBarButtonType", 0);
+ m_customColors = config.readBoolEntry("CustomColors", false);
+ m_useTitleProps = config.readBoolEntry("UseTitleProps", false);
+ m_animateButtons = config.readBoolEntry("AnimateButtons", true);
+ m_redCloseButton = config.readBoolEntry("RedCloseButton", false);
+ m_iconSize = (config.readNumEntry("IconSize", 45))/100.0;
+ m_customIconColors = config.readBoolEntry("CustomIconColors", false);
+ QColor afgcolor = QColor(10, 20, 40);
+ m_aFgColor = config.readColorEntry("AFgColor", &afgcolor);
+ QColor abgcolor = QColor(210, 220, 240);
+ m_aBgColor = config.readColorEntry("ABgColor", &abgcolor);
+ QColor ifgcolor = QColor(40, 40, 40);
+ m_iFgColor = config.readColorEntry("IFgColor", &ifgcolor);
+ QColor ibgcolor = QColor(240, 240, 240);
+ m_iBgColor = config.readColorEntry("IBgColor", &ibgcolor);
+ m_iconShadow = config.readBoolEntry("IconShadow", false);
+
+ m_titleLogo = config.readBoolEntry("TitleBarLogo", true);
+ m_titleLogoOffset = config.readNumEntry("TitleBarLogoOffset", 3);
+ m_titleLogoURL = config.readEntry("TitleBarLogoURL", locate("data", "kwin/pics/titlebar_decor.png"));
+}
+
+QColor SUSE2Handler::getColor(KWinSUSE2::ColorType type, const bool active) const
+{
+ switch (type) {
+ case TitleGradientFrom:
+ return KDecoration::options()->color(ColorTitleBar, active);
+ break;
+ case TitleGradientTo:
+ return KDecoration::options()->color(ColorTitleBlend, active);
+ break;
+ case WindowContour:
+ case Border:
+ return KDecoration::options()->color(ColorFrame, active);
+ break;
+ case TitleFont:
+ return KDecoration::options()->color(ColorFont, active);
+ break;
+ case BtnBg:
+ return KDecoration::options()->color(ColorButtonBg, active);
+ break;
+ default:
+ return Qt::black;
+ }
+}
+
+const KPixmap &SUSE2Handler::buttonPixmap(ButtonIcon type, int size, ButtonStatus status)
+{
+ if (m_pixmaps[status][type]) {
+ if (status != Shadow && m_pixmaps[status][type]->size() == QSize(size, size))
+ return *m_pixmaps[status][type];
+ else if (status == Shadow && m_pixmaps[status][type]->size() == QSize(size+4, size+4))
+ return *m_pixmaps[status][type];
+ }
+
+ // no matching pixmap found, create a new one...
+
+ delete m_pixmaps[status][type];
+ m_pixmaps[status][type] = 0;
+
+ QColor aDecoFgDark = alphaBlendColors(getColor(TitleGradientTo, true), Qt::black, 50);
+ QColor aDecoFgLight = alphaBlendColors(getColor(TitleGradientTo, true), Qt::white, 50);
+ QColor iDecoFgDark = alphaBlendColors(getColor(TitleGradientTo, false), Qt::black, 50);
+ QColor iDecoFgLight = alphaBlendColors(getColor(TitleGradientTo, false), Qt::white, 50);
+
+ if (m_customIconColors && !m_useTitleProps) {
+ aDecoFgDark = m_aFgColor;
+ aDecoFgLight = m_aBgColor;
+ iDecoFgDark = m_iFgColor;
+ iDecoFgLight = m_iBgColor;
+ }
+
+ KPixmap icon = IconEngine::icon(type, size);
+ QImage img = icon.convertToImage();
+
+ KPixmap *pixmap;
+ QImage tmpImage;
+ ShadowEngine se;
+ QPainter painter;
+ KPixmap tmpShadow;
+ switch (status) {
+ case ActiveUp:
+ if (m_useTitleProps)
+ tmpImage = recolorImage(&img, getColor(TitleFont, true));
+ else
+ tmpImage = recolorImage(&img, aDecoFgDark);
+
+ pixmap = new KPixmap(tmpImage);
+ break;
+ case ActiveDown:
+ if (m_useTitleProps)
+ tmpImage = recolorImage(&img, getColor(TitleFont, true));
+ else
+ tmpImage = recolorImage(&img, aDecoFgLight);
+
+ pixmap = new KPixmap(tmpImage);
+ break;
+ case InactiveUp:
+ if (m_useTitleProps)
+ tmpImage = recolorImage(&img, getColor(TitleFont, false));
+ else
+ tmpImage = recolorImage(&img, iDecoFgDark);
+
+ pixmap = new KPixmap(tmpImage);
+ break;
+ case InactiveDown:
+ if (m_useTitleProps)
+ tmpImage = recolorImage(&img, getColor(TitleFont, false));
+ else
+ tmpImage = recolorImage(&img, iDecoFgLight);
+
+ pixmap = new KPixmap(tmpImage);
+ break;
+ case Shadow:
+ // prepare shadow
+ tmpShadow = QPixmap(icon.width()+4, icon.height()+4);
+ tmpShadow.fill(QColor(0,0,0));
+ tmpShadow.setMask(tmpShadow.createHeuristicMask(true));
+ painter.begin(&tmpShadow);
+ painter.setPen(white);
+ painter.drawPixmap(0,0, icon);
+ painter.end();
+ tmpImage = se.makeShadow(tmpShadow, QColor(0, 0, 0));
+ pixmap = new KPixmap(tmpImage);
+ break;
+ default:
+ pixmap = new KPixmap();
+ }
+
+ m_pixmaps[status][type] = pixmap;
+ return *pixmap;
+}
+
+QValueList< SUSE2Handler::BorderSize >
+SUSE2Handler::borderSizes() const
+{
+ // the list must be sorted
+ return QValueList< BorderSize >() << BorderTiny << BorderNormal <<
+ BorderLarge << BorderVeryLarge << BorderHuge <<
+ BorderVeryHuge << BorderOversized;
+}
+
+static SUSE2Handler *handler = 0;
+
+SUSE2Handler *Handler()
+{
+ return handler;
+}
+
+} // KWinSUSE2
+
+//////////////////////////////////////////////////////////////////////////////
+// Plugin Stuff //
+//////////////////////////////////////////////////////////////////////////////
+
+extern "C"
+{
+ KDE_EXPORT KDecorationFactory *create_factory()
+ {
+ KWinSUSE2::handler = new KWinSUSE2::SUSE2Handler();
+ return KWinSUSE2::handler;
+ }
+}
+
+// kate: space-indent on; indent-width 4; replace-tabs on;