summaryrefslogtreecommitdiffstats
path: root/twin-styles/system
diff options
context:
space:
mode:
authorTimothy Pearson <kb9vqf@pearsoncomputing.net>2011-11-07 21:50:31 -0600
committerTimothy Pearson <kb9vqf@pearsoncomputing.net>2011-11-07 21:50:31 -0600
commite35f3fe53cd8df85d4fd04e49dfffbaeac971cdf (patch)
tree95836fc22de909b3b20dbf3fc3dea230e5e58e3b /twin-styles/system
parenta5355f151396be579eba5838c7d8d93a43362cd7 (diff)
downloadtdeartwork-e35f3fe53cd8df85d4fd04e49dfffbaeac971cdf.tar.gz
tdeartwork-e35f3fe53cd8df85d4fd04e49dfffbaeac971cdf.zip
Rename kwin to twin (Part 2 of 2)
Diffstat (limited to 'twin-styles/system')
-rw-r--r--twin-styles/system/CMakeLists.txt32
-rw-r--r--twin-styles/system/Makefile.am21
-rw-r--r--twin-styles/system/system.desktop27
-rw-r--r--twin-styles/system/systemclient.cpp737
-rw-r--r--twin-styles/system/systemclient.h113
5 files changed, 930 insertions, 0 deletions
diff --git a/twin-styles/system/CMakeLists.txt b/twin-styles/system/CMakeLists.txt
new file mode 100644
index 00000000..09a3a966
--- /dev/null
+++ b/twin-styles/system/CMakeLists.txt
@@ -0,0 +1,32 @@
+#################################################
+#
+# (C) 2011 Golubev Alexander
+# fatzer2 (AT) gmail.com
+#
+# Improvements and feedback are welcome
+#
+# This file is released under GPL >= 2
+#
+#################################################
+
+include_directories(
+ ${CMAKE_CURRENT_BINARY_DIR}
+ ${TDE_INCLUDE_DIR}
+ ${TQT_INCLUDE_DIRS}
+)
+
+link_directories(
+ ${TQT_LIBRARY_DIRS}
+)
+
+##### other data ################################
+
+install( FILES system.desktop DESTINATION ${DATA_INSTALL_DIR}/twin )
+
+##### twin3_system ###############################
+
+tde_add_kpart( twin3_system AUTOMOC
+ SOURCES systemclient.cpp
+ LINK tdecorations-shared
+ DESTINATION ${PLUGIN_INSTALL_DIR}
+)
diff --git a/twin-styles/system/Makefile.am b/twin-styles/system/Makefile.am
new file mode 100644
index 00000000..5b401370
--- /dev/null
+++ b/twin-styles/system/Makefile.am
@@ -0,0 +1,21 @@
+
+INCLUDES = $(all_includes)
+
+kde_module_LTLIBRARIES = twin3_system.la
+
+twin3_system_la_SOURCES = systemclient.cpp
+twin3_system_la_LDFLAGS = $(all_libraries) $(KDE_PLUGIN) -module $(LIB_QT) $(LIB_TDECORE) $(LIB_TDEUI) -ltdefx
+#twin_system_la_LDFLAGS = $(all_libraries) -avoid-version -module $(KDE_RPATH) $(KDE_MT_LDFLAGS)
+twin3_system_la_LIBADD = $(LIB_TDEUI) -ltdecorations
+
+METASOURCES = AUTO
+noinst_HEADERS = systemclient.h
+
+lnkdir = $(kde_datadir)/twin/
+lnk_DATA = system.desktop
+
+EXTRA_DIST = $(lnk_DATA)
+
+###KMAKE-start (don't edit or delete this block)
+
+###KMAKE-end
diff --git a/twin-styles/system/system.desktop b/twin-styles/system/system.desktop
new file mode 100644
index 00000000..94156b29
--- /dev/null
+++ b/twin-styles/system/system.desktop
@@ -0,0 +1,27 @@
+[Desktop Entry]
+Name=System++
+Name[br]=Reizhiad++
+Name[cs]=Systém++
+Name[cy]=Cysawd++
+Name[eo]=Sistem++
+Name[fa]=سیستم++
+Name[fi]=Järjestelmä++
+Name[fr]=Système++
+Name[fy]=Systeem++
+Name[hi]=सिस्टम++
+Name[it]=Sistem++
+Name[ja]=システム++
+Name[lt]=Sistema++
+Name[lv]=Sistēma++
+Name[nds]=Systeem++
+Name[nl]=Systeem++
+Name[pa]=ਸਿਸਟਮ++
+Name[sl]=Sistem++
+Name[ta]=தளம்++
+Name[tg]=Системаи++
+Name[th]=แบบ System++
+Name[tr]=Sistem++
+Name[ven]=Sisitemu++
+Name[xh]=Indlela esetyenziswayo++
+Name[zu]=Indlela esetshenziswayo++
+X-KDE-Library=twin3_system
diff --git a/twin-styles/system/systemclient.cpp b/twin-styles/system/systemclient.cpp
new file mode 100644
index 00000000..a676a02a
--- /dev/null
+++ b/twin-styles/system/systemclient.cpp
@@ -0,0 +1,737 @@
+#include "systemclient.h"
+
+#include <tqlayout.h>
+#include <tqdrawutil.h>
+#include <tqbitmap.h>
+#include <tqtooltip.h>
+#include <tqlabel.h>
+#include <tqcursor.h>
+
+#include <kpixmapeffect.h>
+#include <kdrawutil.h>
+#include <klocale.h>
+#include <kapplication.h>
+#include <kdebug.h>
+
+// Default button tqlayout
+const char default_left[] = "X";
+const char default_right[] = "HSIA";
+
+namespace System {
+
+static unsigned char iconify_bits[] = {
+ 0x00, 0x00, 0xff, 0xff, 0x7e, 0x3c, 0x18, 0x00};
+
+static unsigned char maximize_bits[] = {
+ 0x00, 0x18, 0x3c, 0x7e, 0xff, 0xff, 0x00, 0x00};
+
+static unsigned char r_minmax_bits[] = {
+ 0x0c, 0x18, 0x33, 0x67, 0xcf, 0x9f, 0x3f, 0x3f};
+
+static unsigned char l_minmax_bits[] = {
+ 0x30, 0x18, 0xcc, 0xe6, 0xf3, 0xf9, 0xfc, 0xfc};
+
+static unsigned char unsticky_bits[] = {
+ 0x00, 0x18, 0x18, 0x7e, 0x7e, 0x18, 0x18, 0x00};
+
+static unsigned char sticky_bits[] = {
+ 0x00, 0x00, 0x00, 0x7e, 0x7e, 0x00, 0x00, 0x00};
+
+static unsigned char question_bits[] = {
+ 0x3c, 0x66, 0x60, 0x30, 0x18, 0x00, 0x18, 0x18};
+
+static KPixmap *aUpperGradient=0;
+static KPixmap *iUpperGradient=0;
+
+static KPixmap *btnPix=0;
+static KPixmap *btnPixDown=0;
+static KPixmap *iBtnPix=0;
+static KPixmap *iBtnPixDown=0;
+static TQColor *btnForeground;
+
+static bool pixmaps_created = false;
+
+static void drawButtonFrame(KPixmap *pix, const TQColorGroup &g)
+{
+ TQPainter p;
+ p.begin(pix);
+ p.setPen(g.mid());
+ p.drawLine(0, 0, 13, 0);
+ p.drawLine(0, 0, 0, 13);
+ p.setPen(g.light());
+ p.drawLine(13, 0, 13, 13);
+ p.drawLine(0, 13, 13, 13);
+ p.setPen(g.dark());
+ p.drawRect(1, 1, 12, 12);
+ p.end();
+}
+
+static void create_pixmaps()
+{
+ if(pixmaps_created)
+ return;
+ pixmaps_created = true;
+
+ if(TQPixmap::defaultDepth() > 8){
+ // titlebar
+ aUpperGradient = new KPixmap;
+ aUpperGradient->resize(32, 18);
+ iUpperGradient = new KPixmap;
+ iUpperGradient->resize(32, 18);
+ TQColor bgColor = kapp->tqpalette().active().background();
+ KPixmapEffect::gradient(*aUpperGradient,
+ KDecoration::options()->color(KDecorationOptions::ColorFrame, true).light(130),
+ bgColor,
+ KPixmapEffect::VerticalGradient);
+ KPixmapEffect::gradient(*iUpperGradient,
+ KDecoration::options()->color(KDecorationOptions::ColorFrame, false).light(130),
+ bgColor,
+ KPixmapEffect::VerticalGradient);
+
+ // buttons
+ KPixmap aPix;
+ aPix.resize(12, 12);
+ KPixmap iPix;
+ iPix.resize(12, 12);
+ KPixmap aInternal;
+ aInternal.resize(8, 8);
+ KPixmap iInternal;
+ iInternal.resize(8, 8);
+
+ TQColor hColor(KDecoration::options()->color(KDecorationOptions::ColorButtonBg, false));
+ KPixmapEffect::gradient(iInternal,
+ hColor.dark(120),
+ hColor.light(120),
+ KPixmapEffect::DiagonalGradient);
+ KPixmapEffect::gradient(iPix,
+ hColor.light(150),
+ hColor.dark(150),
+ KPixmapEffect::DiagonalGradient);
+
+ hColor =KDecoration::options()->color(KDecorationOptions::ColorButtonBg, true);
+ KPixmapEffect::gradient(aInternal,
+ hColor.dark(120),
+ hColor.light(120),
+ KPixmapEffect::DiagonalGradient);
+ KPixmapEffect::gradient(aPix,
+ hColor.light(150),
+ hColor.dark(150),
+ KPixmapEffect::DiagonalGradient);
+ bitBlt(TQT_TQPAINTDEVICE(&aPix), 1, 1, TQT_TQPAINTDEVICE(&aInternal), 0, 0, 8, 8, TQt::CopyROP, true);
+ bitBlt(TQT_TQPAINTDEVICE(&iPix), 1, 1, TQT_TQPAINTDEVICE(&iInternal), 0, 0, 8, 8, TQt::CopyROP, true);
+
+ // normal buttons
+ btnPix = new KPixmap;
+ btnPix->resize(14, 14);
+ bitBlt(TQT_TQPAINTDEVICE(btnPix), 2, 2, TQT_TQPAINTDEVICE(&aPix), 0, 0, 10, 10, TQt::CopyROP, true);
+ drawButtonFrame(btnPix, KDecoration::options()->tqcolorGroup(KDecorationOptions::ColorFrame, true));
+
+ iBtnPix = new KPixmap;
+ iBtnPix->resize(14, 14);
+ bitBlt(TQT_TQPAINTDEVICE(iBtnPix), 2, 2, TQT_TQPAINTDEVICE(&iPix), 0, 0, 10, 10, TQt::CopyROP, true);
+ drawButtonFrame(iBtnPix, KDecoration::options()->tqcolorGroup(KDecorationOptions::ColorFrame, false));
+
+
+ // pressed buttons
+ hColor = KDecoration::options()->color(KDecorationOptions::ColorButtonBg, false);
+ KPixmapEffect::gradient(iInternal,
+ hColor.light(130),
+ hColor.dark(130),
+ KPixmapEffect::DiagonalGradient);
+ KPixmapEffect::gradient(iPix,
+ hColor.light(150),
+ hColor.dark(150),
+ KPixmapEffect::DiagonalGradient);
+
+ hColor =KDecoration::options()->color(KDecorationOptions::ColorButtonBg, true);
+ KPixmapEffect::gradient(aInternal,
+ hColor.light(130),
+ hColor.dark(130),
+ KPixmapEffect::DiagonalGradient);
+ KPixmapEffect::gradient(aPix,
+ hColor.light(150),
+ hColor.dark(150),
+ KPixmapEffect::DiagonalGradient);
+ bitBlt(TQT_TQPAINTDEVICE(&aPix), 1, 1, TQT_TQPAINTDEVICE(&aInternal), 0, 0, 8, 8, TQt::CopyROP, true);
+ bitBlt(TQT_TQPAINTDEVICE(&iPix), 1, 1, TQT_TQPAINTDEVICE(&iInternal), 0, 0, 8, 8, TQt::CopyROP, true);
+
+ btnPixDown = new KPixmap;
+ btnPixDown->resize(14, 14);
+ bitBlt(TQT_TQPAINTDEVICE(btnPixDown), 2, 2, TQT_TQPAINTDEVICE(&aPix), 0, 0, 10, 10, TQt::CopyROP, true);
+ drawButtonFrame(btnPixDown, KDecoration::options()->tqcolorGroup(KDecorationOptions::ColorFrame,
+ true));
+
+ iBtnPixDown = new KPixmap;
+ iBtnPixDown->resize(14, 14);
+ bitBlt(TQT_TQPAINTDEVICE(iBtnPixDown), 2, 2, TQT_TQPAINTDEVICE(&iPix), 0, 0, 10, 10, TQt::CopyROP, true);
+ drawButtonFrame(iBtnPixDown, KDecoration::options()->tqcolorGroup(KDecorationOptions::ColorFrame,
+ false));
+ }
+ if(tqGray(KDecoration::options()->color(KDecorationOptions::ColorButtonBg, true).rgb()) > 128)
+ btnForeground = new TQColor(TQt::black);
+ else
+ btnForeground = new TQColor(TQt::white);
+}
+
+static void delete_pixmaps()
+{
+ if(aUpperGradient){
+ delete aUpperGradient;
+ delete iUpperGradient;
+ delete btnPix;
+ delete btnPixDown;
+ delete iBtnPix;
+ delete iBtnPixDown;
+ aUpperGradient = 0;
+ }
+ delete btnForeground;
+ pixmaps_created = false;
+}
+
+SystemButton::SystemButton(SystemClient *parent, const char *name,
+ const unsigned char *bitmap, const TQString& tip)
+: TQButton(parent->widget(), name)
+{
+ setTipText(tip);
+ setBackgroundMode( NoBackground );
+ setCursor(ArrowCursor);
+ resize(14, 14);
+ if(bitmap)
+ setBitmap(bitmap);
+ client = parent;
+}
+
+void SystemButton::setTipText(const TQString &tip)
+{
+ if (KDecoration::options()->showTooltips())
+ {
+ TQToolTip::remove(this );
+ TQToolTip::add(this, tip );
+ }
+}
+
+
+TQSize SystemButton::tqsizeHint() const
+{
+ return(TQSize(14, 14));
+}
+
+void SystemButton::reset()
+{
+ tqrepaint(false);
+}
+
+void SystemButton::setBitmap(const unsigned char *bitmap)
+{
+ deco = TQBitmap(8, 8, bitmap, true);
+ deco.setMask(deco);
+ tqrepaint();
+}
+
+void SystemButton::drawButton(TQPainter *p)
+{
+ if(btnPixDown){
+ if(client->isActive())
+ p->drawPixmap(0, 0, isDown() ? *btnPixDown : *btnPix);
+ else
+ p->drawPixmap(0, 0, isDown() ? *iBtnPixDown : *iBtnPix);
+ }
+ else{
+ TQColorGroup g = KDecoration::options()->tqcolorGroup(KDecorationOptions::ColorFrame,
+ client->isActive());
+ int x2 = width()-1;
+ int y2 = height()-1;
+ // outer frame
+ p->setPen(g.mid());
+ p->drawLine(0, 0, x2, 0);
+ p->drawLine(0, 0, 0, y2);
+ p->setPen(g.light());
+ p->drawLine(x2, 0, x2, y2);
+ p->drawLine(0, x2, y2, x2);
+ p->setPen(g.dark());
+ p->drawRect(1, 1, width()-2, height()-2);
+ // inner frame
+ g = KDecoration::options()->tqcolorGroup(KDecorationOptions::ColorButtonBg, client->isActive());
+ p->fillRect(3, 3, width()-6, height()-6, g.background());
+ p->setPen(isDown() ? g.mid() : g.light());
+ p->drawLine(2, 2, x2-2, 2);
+ p->drawLine(2, 2, 2, y2-2);
+ p->setPen(isDown() ? g.light() : g.mid());
+ p->drawLine(x2-2, 2, x2-2, y2-2);
+ p->drawLine(2, x2-2, y2-2, x2-2);
+
+ }
+
+ if(!deco.isNull()){
+ p->setPen(*btnForeground);
+ p->drawPixmap(isDown() ? 4 : 3, isDown() ? 4 : 3, deco);
+ }
+}
+
+void SystemButton::mousePressEvent( TQMouseEvent* e )
+{
+ last_button = e->button();
+ TQMouseEvent me ( e->type(), e->pos(), e->globalPos(), Qt::LeftButton, e->state() );
+ TQButton::mousePressEvent( &me );
+}
+
+void SystemButton::mouseReleaseEvent( TQMouseEvent* e )
+{
+ last_button = e->button();
+ TQMouseEvent me ( e->type(), e->pos(), e->globalPos(), Qt::LeftButton, e->state() );
+ TQButton::mouseReleaseEvent( &me );
+}
+
+
+
+SystemClient::SystemClient(KDecorationBridge* bridge, KDecorationFactory* factory)
+ : KDecoration(bridge, factory)
+{}
+
+SystemClient::~SystemClient()
+{
+ for (int n=0; n<ButtonTypeCount; n++) {
+ if (button[n]) delete button[n];
+ }
+}
+
+void SystemClient::init()
+{
+ createMainWidget(0);
+ widget()->installEventFilter( this );
+
+ TQGridLayout* g = new TQGridLayout(widget(), 0, 0, 2);
+
+ if (isPreview())
+ {
+ g->addWidget(new TQLabel(i18n("<center><b>System++ preview</b></center>"), widget()), 1, 1);
+ }
+ else
+ {
+ g->addItem(new TQSpacerItem( 0, 0 ), 1, 1); // no widget in the middle
+ }
+// g->addItem( new TQSpacerItem( 0, 0, TQSizePolicy::Fixed, TQSizePolicy::Expanding ) );
+ g->setRowStretch(1, 10);
+
+ g->addColSpacing(0, 2);
+ g->addColSpacing(2, 2);
+ g->addRowSpacing(2, 6);
+
+ TQBoxLayout* hb = new TQBoxLayout(0, TQBoxLayout::LeftToRight, 0, 0, 0);
+ hb->setResizeMode(TQLayout::FreeResize);
+ g->addLayout( hb, 0, 1 );
+ hb->addSpacing(3);
+
+ titlebar = new TQSpacerItem(10, 14, TQSizePolicy::Expanding,
+ TQSizePolicy::Minimum);
+
+ // setup titlebar buttons
+ for (int n=0; n<ButtonTypeCount; n++) button[n] = 0;
+ addButtons(hb, KDecoration::options()->customButtonPositions() ?
+ KDecoration::options()->titleButtonsLeft() : TQString(default_left));
+ hb->addSpacing(2);
+ hb->addItem(titlebar);
+ hb->addSpacing(3);
+ addButtons(hb, KDecoration::options()->customButtonPositions() ?
+ KDecoration::options()->titleButtonsRight() : TQString(default_right));
+ hb->addSpacing(2);
+
+ widget()->setBackgroundMode(TQWidget::NoBackground);
+ recalcTitleBuffer();
+}
+
+void SystemClient::addButtons(TQBoxLayout *hb, const TQString& s)
+{
+ unsigned char *minmax_bits;
+ int l_max = KDecoration::options()->titleButtonsLeft().find('A');
+ if (s.length() > 0) {
+ for (unsigned n=0; n < s.length(); n++) {
+ switch (s[n]) {
+ case 'X': // Close button
+ if ((!button[ButtonClose]) && isCloseable()) {
+ button[ButtonClose] = new SystemButton(this, "close", NULL, i18n("Close"));
+ connect( button[ButtonClose], TQT_SIGNAL( clicked() ), this, ( TQT_SLOT( closeWindow() ) ) );
+ hb->addWidget(button[ButtonClose]);
+ hb->addSpacing(1);
+ }
+ break;
+
+ case 'S': // Sticky button
+ if (!button[ButtonSticky]) {
+ button[ButtonSticky] = new SystemButton(this, "sticky", NULL, i18n("On all desktops"));
+ if(isOnAllDesktops())
+ button[ButtonSticky]->setBitmap(unsticky_bits);
+ else
+ button[ButtonSticky]->setBitmap(sticky_bits);
+ connect( button[ButtonSticky], TQT_SIGNAL( clicked() ), this, ( TQT_SLOT( toggleOnAllDesktops() ) ) );
+ hb->addWidget(button[ButtonSticky]);
+ hb->addSpacing(1);
+ }
+ break;
+
+ case 'I': // Minimize button
+ if ((!button[ButtonMinimize]) && isMinimizable()) {
+ button[ButtonMinimize] = new SystemButton(this, "iconify", iconify_bits, i18n("Minimize"));
+ connect( button[ButtonMinimize], TQT_SIGNAL( clicked() ), this, ( TQT_SLOT( minimize() ) ) );
+ hb->addWidget(button[ButtonMinimize]);
+ hb->addSpacing(1);
+ }
+ break;
+
+ case 'A': // Maximize button
+ if ((!button[ButtonMaximize]) && isMaximizable()) {
+ if (maximizeMode()==MaximizeFull) {
+ if (KDecoration::options()->customButtonPositions() && (l_max>-1))
+ minmax_bits = l_minmax_bits;
+ else
+ minmax_bits = r_minmax_bits;
+ button[ButtonMaximize] = new SystemButton(this, "maximize", minmax_bits, i18n("Restore"));
+ }
+ else
+ button[ButtonMaximize] = new SystemButton(this, "maximize", maximize_bits, i18n("Maximize"));
+ connect( button[ButtonMaximize], TQT_SIGNAL( clicked() ), this, ( TQT_SLOT( maxButtonClicked() ) ) );
+ hb->addWidget(button[ButtonMaximize]);
+ hb->addSpacing(1);
+ }
+ break;
+
+ case 'H': // Help button
+ if ((!button[ButtonHelp]) && providesContextHelp()) {
+ button[ButtonHelp] = new SystemButton(this, "help", question_bits, i18n("Help"));
+ connect( button[ButtonHelp], TQT_SIGNAL( clicked() ), this, ( TQT_SLOT( showContextHelp() ) ) );
+ hb->addWidget(button[ButtonHelp]);
+ hb->addSpacing(1);
+ }
+ break;
+
+ }
+ }
+ }
+}
+
+bool SystemClient::eventFilter( TQObject* o, TQEvent* e )
+{
+ if( TQT_BASE_OBJECT(o) != TQT_BASE_OBJECT(widget()))
+ return false;
+ switch( e->type())
+ {
+ case TQEvent::Resize:
+ resizeEvent(TQT_TQRESIZEEVENT( e ) );
+ return true;
+ case TQEvent::Paint:
+ paintEvent(TQT_TQPAINTEVENT( e ) );
+ return true;
+ case TQEvent::MouseButtonDblClick:
+ mouseDoubleClickEvent(TQT_TQMOUSEEVENT( e ) );
+ return true;
+ case TQEvent::MouseButtonPress:
+ processMousePressEvent(TQT_TQMOUSEEVENT( e ) );
+ return true;
+ case TQEvent::Wheel:
+ wheelEvent( TQT_TQWHEELEVENT( e ));
+ return true;
+ default:
+ break;
+ }
+ return false;
+}
+
+void SystemClient::reset(unsigned long)
+{
+ titleBuffer.resize(0, 0);
+ recalcTitleBuffer();
+ widget()->tqrepaint();
+ if (button[ButtonClose])
+ button[ButtonClose]->reset();
+ if (button[ButtonSticky])
+ button[ButtonSticky]->reset();
+ if (button[ButtonMinimize])
+ button[ButtonMinimize]->reset();
+ if (button[ButtonMaximize])
+ button[ButtonMaximize]->reset();
+ if (button[ButtonHelp])
+ button[ButtonHelp]->reset();
+}
+
+void SystemClient::maxButtonClicked()
+{
+ maximize( button[ButtonMaximize]->last_button );
+}
+
+void SystemClient::resizeEvent( TQResizeEvent* )
+{
+ //Client::resizeEvent( e );
+ recalcTitleBuffer();
+ doShape();
+ /*
+ if ( isVisibleToTLW() && !testWFlags( WStaticContents )) {
+ TQPainter p( this );
+ TQRect t = titlebar->tqgeometry();
+ t.setTop( 0 );
+ TQRegion r = rect();
+ r = r.subtract( t );
+ p.setClipRegion( r );
+ p.eraseRect( rect() );
+ }*/
+}
+
+void SystemClient::resize( const TQSize& s )
+{
+ widget()->resize( s );
+}
+
+
+TQSize SystemClient::tqminimumSize() const
+{
+ return widget()->tqminimumSize();
+}
+
+
+void SystemClient::recalcTitleBuffer()
+{
+ if(oldTitle == caption() && width() == titleBuffer.width())
+ return;
+ TQFontMetrics fm(options()->font(true));
+ titleBuffer.resize(width(), 18);
+ TQPainter p;
+ p.begin(&titleBuffer);
+ if(aUpperGradient)
+ p.drawTiledPixmap(0, 0, width(), 18, *aUpperGradient);
+ else
+ p.fillRect(0, 0, width(), 18,
+ options()->tqcolorGroup(KDecorationOptions::ColorFrame, true).
+ brush(TQColorGroup::Button));
+
+ TQRect t = titlebar->tqgeometry();
+ t.setTop( 2 );
+ t.setLeft( t.left() + 4 );
+ t.setRight( t.right() - 2 );
+
+ TQRegion r(t.x(), 0, t.width(), 18);
+ r -= TQRect(t.x()+((t.width()-fm.width(caption()))/2)-4,
+ 0, fm.width(caption())+8, 18);
+ p.setClipRegion(r);
+ int i, ly;
+ for(i=0, ly=4; i < 4; ++i, ly+=3){
+ p.setPen(options()->color(KDecorationOptions::ColorTitleBar, true).light(150));
+ p.drawLine(0, ly, width()-1, ly);
+ p.setPen(options()->color(KDecorationOptions::ColorTitleBar, true).dark(120));
+ p.drawLine(0, ly+1, width()-1, ly+1);
+ }
+ p.setClipRect(t);
+ p.setPen(options()->color(KDecorationOptions::ColorFont, true));
+ p.setFont(options()->font(true));
+
+ p.drawText(t.x()+((t.width()-fm.width(caption()))/2)-4,
+ 0, fm.width(caption())+8, 18, AlignCenter, caption());
+ p.setClipping(false);
+ p.end();
+ oldTitle = caption();
+}
+
+void SystemClient::captionChange()
+{
+ recalcTitleBuffer();
+ widget()->tqrepaint(titlebar->tqgeometry(), false);
+}
+
+void SystemClient::drawRoundFrame(TQPainter &p, int x, int y, int w, int h)
+{
+ kDrawRoundButton(&p, x, y, w, h,
+ options()->tqcolorGroup(KDecorationOptions::ColorFrame, isActive()), false);
+
+}
+
+void SystemClient::paintEvent( TQPaintEvent* )
+{
+ TQPainter p(widget());
+ TQRect t = titlebar->tqgeometry();
+
+ TQBrush fillBrush(TQBrush(widget()->tqcolorGroup().brush(TQColorGroup::Background)).pixmap() ?
+ widget()->tqcolorGroup().brush(TQColorGroup::Background) :
+ options()->tqcolorGroup(KDecorationOptions::ColorFrame, isActive()).
+ brush(TQColorGroup::Button));
+
+ p.fillRect(1, 18, width()-2, height()-19, fillBrush);
+
+ t.setTop( 2 );
+ t.setLeft( t.left() + 4 );
+ t.setRight( t.right() - 2 );
+
+ if(isActive())
+ p.drawPixmap(0, 0, titleBuffer);
+ else{
+ if(iUpperGradient)
+ p.drawTiledPixmap(0, 0, width(), 18, *iUpperGradient);
+ else
+ p.fillRect(0, 0, width(), 18, fillBrush);
+ p.setPen(options()->color(KDecorationOptions::ColorFont, isActive()));
+ p.setFont(options()->font(isActive()));
+ p.drawText(t, AlignCenter, caption() );
+ }
+
+ p.setPen(options()->tqcolorGroup(KDecorationOptions::ColorFrame, isActive()).light());
+ p.drawLine(width()-20, height()-7, width()-10, height()-7);
+ p.drawLine(width()-20, height()-5, width()-10, height()-5);
+ p.setPen(options()->tqcolorGroup(KDecorationOptions::ColorFrame, isActive()).dark());
+ p.drawLine(width()-20, height()-6, width()-10, height()-6);
+ p.drawLine(width()-20, height()-4, width()-10, height()-4);
+
+ drawRoundFrame(p, 0, 0, width(), height());
+}
+
+#define TQCOORDARRLEN(x) sizeof(x)/(sizeof(TQCOORD)*2)
+
+void SystemClient::doShape()
+{
+ // using a bunch of TQRect lines seems much more efficent than bitmaps or
+ // point arrays
+
+ TQRegion mask;
+ kRoundMaskRegion(mask, 0, 0, width(), height());
+ setMask(mask);
+}
+
+void SystemClient::showEvent(TQShowEvent *)
+{
+// Client::showEvent(ev);
+ doShape();
+ widget()->show();
+// widget()->tqrepaint();
+}
+
+/*void SystemClient::windowWrapperShowEvent( TQShowEvent* )
+{
+ doShape();
+}*/
+
+void SystemClient::mouseDoubleClickEvent( TQMouseEvent * e )
+{
+ if ( e->button() == Qt::LeftButton && titlebar->tqgeometry().contains( e->pos() ) )
+ titlebarDblClickOperation();
+}
+
+void SystemClient::wheelEvent( TQWheelEvent *e )
+{
+ if (isSetShade() || TQRect( 0, 0, width(), titlebar->tqgeometry().height() ).contains( e->pos() ) )
+ titlebarMouseWheelOperation( e->delta());
+}
+
+void SystemClient::maximizeChange()
+{
+ unsigned char *minmax_bits;
+ int l_max = KDecoration::options()->titleButtonsLeft().find('A');
+ if (KDecoration::options()->customButtonPositions() && (l_max>-1))
+ minmax_bits = l_minmax_bits;
+ else
+ minmax_bits = r_minmax_bits;
+ if (button[ButtonMaximize]) {
+ button[ButtonMaximize]->setBitmap((maximizeMode()==MaximizeFull) ? minmax_bits : maximize_bits);
+ button[ButtonMaximize]->setTipText((maximizeMode()==MaximizeFull) ? i18n("Restore") : i18n("Maximize"));
+ }
+}
+
+void SystemClient::activeChange()
+{
+ widget()->tqrepaint(false);
+ if (button[ButtonClose])
+ button[ButtonClose]->reset();
+ if (button[ButtonSticky])
+ button[ButtonSticky]->reset();
+ if (button[ButtonMinimize])
+ button[ButtonMinimize]->reset();
+ if (button[ButtonMaximize])
+ button[ButtonMaximize]->reset();
+ if (button[ButtonHelp])
+ button[ButtonHelp]->reset();
+}
+
+void SystemClient::iconChange()
+{
+// if (button[BtnMenu] && button[BtnMenu]->isVisible())
+// button[BtnMenu]->tqrepaint(false);
+}
+
+void SystemClient::desktopChange()
+{
+ if (button[ButtonSticky]) {
+ button[ButtonSticky]->setBitmap(isOnAllDesktops() ? unsticky_bits : sticky_bits);
+ button[ButtonSticky]->setTipText(isOnAllDesktops() ? i18n("Not on all desktops") : i18n("On all desktops"));
+ }
+}
+
+/*void SystemClient::stickyChange(bool on)
+{
+}*/
+
+KDecoration::Position SystemClient::mousePosition(const TQPoint &p) const
+{
+ return KDecoration::mousePosition(p);
+}
+
+void SystemClient::borders(int& left, int& right, int& top, int& bottom) const
+{
+ left = 4;
+ right = 4;
+ top = 18;
+ bottom = 8;
+
+/* if ((maximizeMode()==MaximizeFull) && !options()->moveResizeMaximizedWindows()) {
+ left = right = bottom = 0;
+ top = 1 + titleHeight + (borderSize-1);
+ }*/
+}
+
+SystemDecoFactory::SystemDecoFactory()
+{
+ create_pixmaps();
+}
+
+SystemDecoFactory::~SystemDecoFactory()
+{
+ delete_pixmaps();
+}
+
+KDecoration *SystemDecoFactory::createDecoration( KDecorationBridge *b )
+{
+ return new SystemClient(b, this);
+}
+
+bool SystemDecoFactory::reset( unsigned long changed )
+{
+ System::delete_pixmaps();
+ System::create_pixmaps();
+ // Ensure changes in tooltip state get applied
+ resetDecorations(changed);
+ return true;
+}
+
+bool SystemDecoFactory::supports( Ability ability )
+{
+ switch( ability )
+ {
+ case AbilityAnnounceButtons:
+ case AbilityButtonOnAllDesktops:
+ case AbilityButtonHelp:
+ case AbilityButtonMinimize:
+ case AbilityButtonMaximize:
+ case AbilityButtonClose:
+ return true;
+ default:
+ return false;
+ };
+}
+
+TQValueList<KDecorationFactory::BorderSize> SystemDecoFactory::borderSizes() const
+{ // the list must be sorted
+ return TQValueList< BorderSize >() << BorderNormal;
+}
+
+}
+
+extern "C" KDE_EXPORT KDecorationFactory *create_factory()
+{
+ return new System::SystemDecoFactory();
+}
+
+#include "systemclient.moc"
diff --git a/twin-styles/system/systemclient.h b/twin-styles/system/systemclient.h
new file mode 100644
index 00000000..ecaf25ee
--- /dev/null
+++ b/twin-styles/system/systemclient.h
@@ -0,0 +1,113 @@
+#ifndef __SYSTEMCLIENT_H
+#define __SYSTEMCLIENT_H
+
+#include <tqvariant.h>
+#include <tqbitmap.h>
+#include <tqbutton.h>
+
+#include <kpixmap.h>
+#include <kdecoration.h>
+#include <kdecorationfactory.h>
+
+
+class TQLabel;
+class TQSpacerItem;
+class TQBoxLayout;
+
+namespace System {
+
+class SystemButton;
+
+enum ButtonType {
+ ButtonClose=0,
+ ButtonSticky,
+ ButtonMinimize,
+ ButtonMaximize,
+ ButtonHelp,
+ ButtonTypeCount
+};
+
+class SystemClient : public KDecoration
+{
+ Q_OBJECT
+ TQ_OBJECT
+ public:
+ SystemClient(KDecorationBridge* bridge, KDecorationFactory* factory);
+ ~SystemClient();
+ virtual Position mousePosition(const TQPoint& p) const;
+ virtual void resize(const TQSize&);
+ virtual bool eventFilter(TQObject* o, TQEvent* e);
+ virtual void init();
+ protected:
+ virtual void maximizeChange();
+ virtual void captionChange();
+ virtual void shadeChange() {};
+ virtual void iconChange();
+ virtual void desktopChange();
+ virtual void activeChange();
+ virtual TQSize tqminimumSize() const;
+ virtual void borders(int&, int&, int&, int&) const;
+ virtual void reset( unsigned long changed );
+ void drawRoundFrame(TQPainter &p, int x, int y, int w, int h);
+ void resizeEvent( TQResizeEvent* );
+ void paintEvent( TQPaintEvent* );
+ void showEvent( TQShowEvent* );
+ void mouseDoubleClickEvent( TQMouseEvent * );
+ void wheelEvent(TQWheelEvent *e);
+ void doShape();
+ void recalcTitleBuffer();
+ private:
+ void addButtons(TQBoxLayout* hb, const TQString& buttons);
+ private slots:
+ void maxButtonClicked();
+
+ private:
+ SystemButton* button[ButtonTypeCount];
+ TQSpacerItem* titlebar;
+ TQPixmap titleBuffer;
+ TQString oldTitle;
+};
+
+class SystemButton : public TQButton
+{
+ public:
+ SystemButton(SystemClient *parent=0, const char *name=0,
+ const unsigned char *bitmap=NULL, const TQString& tip=NULL);
+ void setBitmap(const unsigned char *bitmap);
+ void reset();
+ TQSize tqsizeHint() const;
+ void setTipText(const TQString &tip);
+ ButtonState last_button;
+ protected:
+ virtual void drawButton(TQPainter *p);
+ void drawButtonLabel(TQPainter *){}
+ TQBitmap deco;
+
+ void mousePressEvent( TQMouseEvent* e );
+ void mouseReleaseEvent( TQMouseEvent* e );
+
+ private:
+ SystemClient* client;
+};
+
+
+class SystemDecoFactory : public TQObject, public KDecorationFactory
+{
+ Q_OBJECT
+ TQ_OBJECT
+ public:
+ SystemDecoFactory();
+ virtual ~SystemDecoFactory();
+ virtual KDecoration *createDecoration(KDecorationBridge *);
+ virtual bool reset(unsigned long);
+ virtual bool supports( Ability ability );
+ virtual TQValueList< BorderSize > borderSizes() const;
+ private:
+ void readConfig();
+};
+
+
+
+}
+
+#endif