summaryrefslogtreecommitdiffstats
path: root/kwin-styles/smooth-blend/client/smoothblend.cc
diff options
context:
space:
mode:
Diffstat (limited to 'kwin-styles/smooth-blend/client/smoothblend.cc')
-rw-r--r--kwin-styles/smooth-blend/client/smoothblend.cc1396
1 files changed, 0 insertions, 1396 deletions
diff --git a/kwin-styles/smooth-blend/client/smoothblend.cc b/kwin-styles/smooth-blend/client/smoothblend.cc
deleted file mode 100644
index 02efd047..00000000
--- a/kwin-styles/smooth-blend/client/smoothblend.cc
+++ /dev/null
@@ -1,1396 +0,0 @@
-//////////////////////////////////////////////////////////////////////////////
-// smoothblend.cc
-// -------------------
-// Smooth Blend window decoration for KDE
-// -------------------
-// Copyright (c) 2005 Ryan Nickell
-// Please see the header file for copyright and license information.
-//////////////////////////////////////////////////////////////////////////////
-
-#include <kconfig.h>
-#include <kdeversion.h>
-#include <kglobal.h>
-#include <kglobalsettings.h>
-#include <klocale.h>
-#include <kpixmap.h>
-#include <kimageeffect.h>
-#include <kpixmapeffect.h>
-#include <kpixmap.h>
-
-#include <tqbitmap.h>
-#include <tqlabel.h>
-#include <tqlayout.h>
-#include <tqpainter.h>
-#include <tqtooltip.h>
-#include <tqtimer.h>
-#include <tqapplication.h>
-
-#include "smoothblend.h"
-#include "buttons.h"
-
-using namespace smoothblend;
-
-//////////////////////////////////////////////////////////////////////////////
-// smoothblendFactory Class
-//////////////////////////////////////////////////////////////////////////////
-smoothblendFactory* factory=NULL;
-
-bool smoothblendFactory::initialized_ = false;
-TQt::AlignmentFlags smoothblendFactory::titlealign_ = TQt::AlignHCenter;
-bool smoothblendFactory::cornerflags_ = true;
-int smoothblendFactory::titlesize_ = 30;
-int smoothblendFactory::buttonsize_ = 26;
-int smoothblendFactory::framesize_ = 4;
-int smoothblendFactory::roundsize_ = 50;
-bool smoothblendFactory::titleshadow_ = true;
-bool smoothblendFactory::animatebuttons = true;
-int smoothblendFactory::btnComboBox = 0;
-bool smoothblendFactory::menuClose = false;
-
-// global constants
-static const int TOPMARGIN = 4; // do not change
-static const int DECOHEIGHT = 4; // do not change
-static const int SIDETITLEMARGIN = 2;
-// Default button tqlayout
-const char default_left[] = "M";
-const char default_right[] = "HIAX";
-
-static const uint TIMERINTERVAL = 50; // msec
-static const uint ANIMATIONSTEPS = 4;
-
-extern "C" KDecorationFactory* create_factory() {
- return new smoothblend::smoothblendFactory();
-}
-
-//////////////////////////////////////////////////////////////////////////////
-// smoothblendFactory()
-// ----------------
-// Constructor
-
-smoothblendFactory::smoothblendFactory() {
- readConfig();
- initialized_ = true;
-}
-
-//////////////////////////////////////////////////////////////////////////////
-// ~smoothblendFactory()
-// -----------------
-// Destructor
-
-smoothblendFactory::~smoothblendFactory() {
- initialized_ = false;
-}
-
-//////////////////////////////////////////////////////////////////////////////
-// createDecoration()
-// -----------------
-// Create the decoration
-
-KDecoration* smoothblendFactory::createDecoration(KDecorationBridge* b) {
- return new smoothblendClient(b, this);
-}
-
-//////////////////////////////////////////////////////////////////////////////
-// reset()
-// -------
-// Reset the handler. Returns true if decorations need to be remade, false if
-// only a tqrepaint is necessary
-
-bool smoothblendFactory::reset(unsigned long changed) {
- // read in the configuration
- initialized_ = false;
- bool confchange = readConfig();
- initialized_ = true;
-
- if (confchange ||
- (changed & (SettingDecoration | SettingButtons | SettingBorder))) {
- return true;
- } else {
- resetDecorations(changed);
- return false;
- }
-}
-
-//////////////////////////////////////////////////////////////////////////////
-// readConfig()
-// ------------
-// Read in the configuration file
-
-bool smoothblendFactory::readConfig() {
- // create a config object
- KConfig config("twinsmoothblendrc");
- config.setGroup("General");
-
- // grab settings
- TQString value = config.readEntry("TitleAlignment", "AlignHCenter");
- if (value == "AlignLeft")
- titlealign_ = TQt::AlignLeft;
- else if (value == "AlignHCenter")
- titlealign_ = TQt::AlignHCenter;
- else if (value == "AlignRight")
- titlealign_ = TQt::AlignRight;
-
- cornerflags_ = config.readBoolEntry("RoundCorners", true);
- titlesize_ = config.readNumEntry("TitleSize",30);
- buttonsize_ = config.readNumEntry("ButtonSize",26);
- framesize_ = config.readNumEntry("FrameSize",4);
- roundsize_ = config.readNumEntry("RoundPercent",50);
- titleshadow_ = config.readBoolEntry("TitleShadow", true);
- animatebuttons = config.readBoolEntry("AnimateButtons", true);
- btnComboBox = config.readNumEntry("ButtonComboBox", 0);
- menuClose = config.readBoolEntry("CloseOnMenuDoubleClick");
-
- if(buttonsize_ > titlesize_ - framesize_)
- {
- buttonsize_ = titlesize_-framesize_;
- }
-
- return true;
-}
-
-//////////////////////////////////////////////////////////////////////////////
-// smoothblendButton Class
-//////////////////////////////////////////////////////////////////////////////
-
-//////////////////////////////////////////////////////////////////////////////
-// smoothblendButton()
-// ---------------
-// Constructor
-smoothblendButton::smoothblendButton(smoothblendClient *parent, const char *name, const TQString& tip, ButtonType type, int button_size, bool toggle): TQButton(parent->widget(), name),
- client_(parent),
- type_(type),
- size_(button_size),
- deco_(0),
- lastmouse_(Qt::NoButton),
- hover_(false)
-{
- setBackgroundMode(NoBackground);
- setFixedSize( ::factory->buttonSize(), ::factory->buttonSize());
- setCursor(arrowCursor);
- TQToolTip::add(this, tip);
- setToggleButton(toggle);
- //button animation setup
- animTmr = new TQTimer(this);
- connect(animTmr, TQT_SIGNAL(timeout() ), this, TQT_SLOT(animate() ) );
- connect(this, TQT_SIGNAL(pressed() ), this, TQT_SLOT(buttonClicked() ) );
- connect(this, TQT_SIGNAL(released() ), this, TQT_SLOT(buttonReleased() ) );
- animProgress = 0;
- m_clicked=false;
-}
-
-smoothblendButton::~smoothblendButton() {
- if ( deco_ )
- delete deco_;
-}
-
-//////////////////////////////////////////////////////////////////////////////
-// tqsizeHint()
-// ----------
-// Return size hint
-
-TQSize smoothblendButton::tqsizeHint() const {
- return TQSize(::factory->buttonSize(), ::factory->buttonSize());
-}
-
-//////////////////////////////////////////////////////////////////////////////
-// buttonClicked()
-// ----------
-// Button animation progress reset so we don't get any leave event animation
-// when the mouse is still pressed
-void smoothblendButton::buttonClicked() {
- m_clicked=true;
- animProgress=0;
-}
-void smoothblendButton::buttonReleased() {
- //This doesn't work b/c a released() signal is thrown when a leaveEvent occurs
- //m_clicked=false;
-}
-
-//////////////////////////////////////////////////////////////////////////////
-// animate()
-// ----------
-// Button animation timing
-void smoothblendButton::animate() {
- animTmr->stop();
-
- if(hover_) {
- if(animProgress < ANIMATIONSTEPS) {
- if (::factory->animateButtons() ) {
- animProgress++;
- } else {
- animProgress = ANIMATIONSTEPS;
- }
- animTmr->start(TIMERINTERVAL, true); // single-shot
- }
- } else {
- if(animProgress > 0) {
- if (::factory->animateButtons() ) {
- animProgress--;
- } else {
- animProgress = 0;
- }
- animTmr->start(TIMERINTERVAL, true); // single-shot
- }
- }
- tqrepaint(false);
-}
-//////////////////////////////////////////////////////////////////////////////
-// enterEvent()
-// ------------
-// Mouse has entered the button
-
-void smoothblendButton::enterEvent(TQEvent *e) {
- // we wanted to pass on the event
- TQButton::enterEvent(e);
- // we want to do mouseovers, so keep track of it here
- hover_=true;
- if(!m_clicked)
- {
- animate();
- }
-}
-
-//////////////////////////////////////////////////////////////////////////////
-// leaveEvent()
-// ------------
-// Mouse has left the button
-
-void smoothblendButton::leaveEvent(TQEvent *e) {
- // we wanted to pass on the event
- TQButton::leaveEvent(e);
- // we want to do mouseovers, so keep track of it here
- hover_=false;
- if(!m_clicked)
- {
- animate();
- }
-}
-
-//////////////////////////////////////////////////////////////////////////////
-// mousePressEvent()
-// -----------------
-// Button has been pressed
-
-void smoothblendButton::mousePressEvent(TQMouseEvent* e) {
- lastmouse_ = e->button();
-
- // translate and pass on mouse event
- int button = Qt::LeftButton;
- if ((type_ != ButtonMax) && (e->button() != Qt::LeftButton)) {
- button = Qt::NoButton; // middle & right buttons inappropriate
- }
- TQMouseEvent me(e->type(), e->pos(), e->globalPos(),
- button, e->state());
- TQButton::mousePressEvent(&me);
-}
-
-//////////////////////////////////////////////////////////////////////////////
-// mouseReleaseEvent()
-// -----------------
-// Button has been released
-
-void smoothblendButton::mouseReleaseEvent(TQMouseEvent* e) {
- lastmouse_ = e->button();
-
- // translate and pass on mouse event
- int button = Qt::LeftButton;
- if ((type_ != ButtonMax) && (e->button() != Qt::LeftButton)) {
- button = Qt::NoButton; // middle & right buttons inappropriate
- }
- TQMouseEvent me(e->type(), e->pos(), e->globalPos(), button, e->state());
- TQButton::mouseReleaseEvent(&me);
- if(m_clicked)
- {
- m_clicked=false;
- }
-}
-
-void smoothblendButton::setOn(bool on)
-{
- TQButton::setOn(on);
-}
-
-void smoothblendButton::setDown(bool on)
-{
- TQButton::setDown(on);
-}
-
-//////////////////////////////////////////////////////////
-// getButtonImage()
-// ----------------
-// get the button TQImage based on type and window mode
-TQImage smoothblendButton::getButtonImage(ButtonType type)
-{
- TQImage finalImage;
- switch(type) {
- case ButtonClose:
- finalImage = uic_findImage( "close.png" );
- break;
- case ButtonHelp:
- finalImage = uic_findImage( "help.png" );
- break;
- case ButtonMin:
- finalImage = uic_findImage( "minimize.png" );
- break;
- case ButtonMax:
- if(client_->maximizeMode() == KDecorationDefines::MaximizeFull)
- {
- finalImage = uic_findImage( "restore.png" );
- }
- else
- {
- finalImage = uic_findImage( "maximize.png" );
- }
- break;
- case ButtonSticky:
- if(client_->isOnAllDesktops())
- {
- finalImage = uic_findImage( "splat.png" );
- }
- else
- {
- finalImage = uic_findImage( "circle.png" );
- }
- break;
- case ButtonShade:
- if(client_->isShade())
- {
- finalImage = uic_findImage( "shade.png" );
- }
- else
- {
- finalImage = uic_findImage( "shade.png" );
- }
- break;
- case ButtonAbove:
- if(client_->keepAbove())
- {
- finalImage = uic_findImage( "keep_above_lit.png" );
- }
- else
- {
- finalImage = uic_findImage( "keep_above.png" );
- }
- break;
- case ButtonBelow:
- if(client_->keepBelow())
- {
- finalImage = uic_findImage( "keep_below_lit.png" );
- }
- else
- {
- finalImage = uic_findImage( "keep_below.png" );
- }
- break;
- default:
- finalImage = uic_findImage( "splat.png" );
- break;
- }
- return finalImage;
-}
-
-//////////////////////////////////////////////////////////
-// drawButton()
-// -------------------------
-// draw the pixmap button
-
-void smoothblendButton::drawButton( TQPainter *painter ) {
- if ( !smoothblendFactory::initialized() )
- return ;
-
- int newWidth = width() - 2;
- int newHeight = height() - 2;
- int dx = (width() - newWidth) / 2;
- int dy = (height() - newHeight) / 2;
- TQImage tmpResult;
- TQColorGroup group;
- TQColor redColor(red);
- bool active = client_->isActive();
- TQPixmap backgroundTile = client_->getTitleBarTile(active);
- group = KDecoration::options()->tqcolorGroup(KDecoration::ColorTitleBar, active);
-
- //draw the titlebar behind the buttons and app icons
- if ((client_->maximizeMode()==client_->MaximizeFull) && !KDecoration::options()->moveResizeMaximizedWindows())
- {
- painter->drawTiledPixmap(0, 0, width(), height(), backgroundTile);
- }
- else
- {
- painter->drawTiledPixmap(0, 0, width(), height(), backgroundTile, 0, y()-::factory->frameSize());
- }
-
- TQImage buttonImage = getButtonImage(type_).smoothScale( width(),height());
- buttonImage = KImageEffect::blend( group.background(), buttonImage, .50);
- if (type_ == ButtonMenu) {
- //slight movement to show the menu button is depressed
- if (isDown()) {
- dx++;
- dy++;
- }
- TQPixmap menuButtonPixmap(client_->icon().pixmap(TQIconSet::Large, TQIconSet::Normal));
- TQImage menuButtonImage(menuButtonPixmap.convertToImage());
- //draw the menu button the same size as the other buttons
- //using TQIconSet::Large gives us a 32x32 icon to resize, resizing larger than
- //that may produce pixilation of the image
- painter->drawImage( dx, dy, menuButtonImage.smoothScale(newWidth, newHeight) );
- } else {
- //highlight on a mouse over tqrepaint
- double factor = animProgress * 0.13;
-
- if(!isDown())
- {
- switch(::factory->getBtnComboBox())
- {
- case 0:
- tmpResult = KImageEffect::intensity( buttonImage, factor);
- break;
- case 1:
- tmpResult = KImageEffect::fade( buttonImage, factor, group.background());
- break;
- }
- }
- else
- {
- tmpResult = buttonImage;
- }
- painter->drawPixmap( 0, 0, TQPixmap( tmpResult ) );
- }
-}
-
-
-//////////////////////////////////////////////////////////////////////////////
-// smoothblendClient Class
-//////////////////////////////////////////////////////////////////////////////
-
-//////////////////////////////////////////////////////////////////////////////
-// smoothblendClient()
-// ---------------
-// Constructor
-
-smoothblendClient::smoothblendClient(KDecorationBridge *b, KDecorationFactory *f)
- : KDecoration(b, f),
- mainLayout_(0),
- titleLayout_(0),
- topSpacer_(0),
- titleSpacer_(0),
- leftTitleSpacer_(0), rightTitleSpacer_(0),
- decoSpacer_(0),
- leftSpacer_(0), rightSpacer_(0),
- bottomSpacer_(0), windowSpacer_(0),
- aCaptionBuffer(0), iCaptionBuffer(0),
- aTitleBarTile(0), iTitleBarTile(0), aTitleBarTopTile(0), iTitleBarTopTile(0),
- pixmaps_created(false),
- //captionBufferDirty(true),
- s_titleHeight(0),
- s_titleFont(TQFont()),
- closing(false)
- {
- aCaptionBuffer = new TQPixmap();
- iCaptionBuffer = new TQPixmap();
- //s_titleFont = isTool()?smoothblendFactory::titleFontTool():smoothblendFactory::titleFont();
- s_titleFont = options()->font();
- s_titleHeight = smoothblendFactory::titleSize();
- }
-//////////////////////////////////////////////////////////////////////////////////
-// ~smoothblendClient()
-// --------------------
-// Destructor
-smoothblendClient::~smoothblendClient() {
- delete aCaptionBuffer;
- delete iCaptionBuffer;
-}
-
-void smoothblendClient::create_pixmaps() {
- if(pixmaps_created)
- return;
- KPixmap tempPixmap;
- TQPainter painter;
- TQColorGroup group,widgetGroup;
- int FRAMESIZE = ::factory->frameSize();
- // Get the color groups we need for the gradients
- group = options()->tqcolorGroup(KDecoration::ColorTitleBar, true);
- widgetGroup = widget()->tqcolorGroup();
-
- // active top title bar tile
- tempPixmap.resize(1, TOPMARGIN);
- tempPixmap = KPixmapEffect::unbalancedGradient(tempPixmap,
- group.background(),
- widgetGroup.background(),
- KPixmapEffect::VerticalGradient,
- 100,
- -100);
- aTitleBarTopTile = new TQPixmap(1, TOPMARGIN);
- painter.begin(aTitleBarTopTile);
- painter.drawPixmap(0, 0, tempPixmap);
- painter.end();
-
- // inactive top title bar tile
- group = options()->tqcolorGroup(KDecoration::ColorTitleBar, false);
- tempPixmap = KPixmapEffect::unbalancedGradient(tempPixmap,
- group.background(),
- widgetGroup.background(),
- KPixmapEffect::VerticalGradient,
- 100,
- -100);
- iTitleBarTopTile = new TQPixmap(1, TOPMARGIN);
- painter.begin(iTitleBarTopTile);
- painter.drawPixmap(0, 0, tempPixmap);
- painter.end();
-
- // active title bar tile
- tempPixmap.resize(1, s_titleHeight+FRAMESIZE);
- group = options()->tqcolorGroup(KDecoration::ColorTitleBar, true);
- tempPixmap = KPixmapEffect::unbalancedGradient(tempPixmap,
- group.background(),
- widgetGroup.background(),
- KPixmapEffect::VerticalGradient,
- 100,
- 200);
- aTitleBarTile = new TQPixmap(1, s_titleHeight+FRAMESIZE);
- painter.begin(aTitleBarTile);
- painter.drawPixmap(0, 0, tempPixmap);
- painter.end();
-
- // inactive title bar tile
- group = options()->tqcolorGroup(KDecoration::ColorTitleBar, false);
- tempPixmap = KPixmapEffect::unbalancedGradient(tempPixmap,
- group.background(),
- widgetGroup.background(),
- KPixmapEffect::VerticalGradient,
- 100,
- 200);
- iTitleBarTile = new TQPixmap(1, s_titleHeight+FRAMESIZE);
- painter.begin(iTitleBarTile);
- painter.drawPixmap(0, 0, tempPixmap);
- painter.end();
-
- pixmaps_created = true;
-}
-
-void smoothblendClient::delete_pixmaps() {
- delete aTitleBarTopTile;
- aTitleBarTopTile = 0;
-
- delete iTitleBarTopTile;
- iTitleBarTopTile = 0;
-
- delete aTitleBarTile;
- aTitleBarTile = 0;
-
- delete iTitleBarTile;
- iTitleBarTile = 0;
-
- pixmaps_created = false;
-}
-//////////////////////////////////////////////////////////////////////////////
-// init()
-// ------
-// Actual initializer for class
-
-void smoothblendClient::init() {
- createMainWidget(WResizeNoErase | WRepaintNoErase);
- widget()->installEventFilter(this);
- handlebar = ::factory->frameSize() < 4 ? 4 - ::factory->frameSize() : 0;
- // for flicker-free redraws
- widget()->setBackgroundMode(NoBackground);
-
- _resetLayout();
-
- create_pixmaps();
-}
-void smoothblendClient::_resetLayout()
-{
- // basic tqlayout:
- // _______________________________________________________________
- // | topSpacer |
- // |_______________________________________________________________|
- // | leftTitleSpacer | btns | titlebar | bts | rightTitleSpacer |
- // |_________________|______|_____________|_____|__________________|
- // | decoSpacer |
- // |_______________________________________________________________|
- // | | | |
- // | | windowWrapper | |
- // | | | |
- // |leftSpacer rightSpacer|
- // |_|___________________________________________________________|_|
- // | bottomSpacer |
- // |_______________________________________________________________|
- //
- if (!::factory->initialized()) return;
-
- delete mainLayout_;
- delete titleLayout_;
- delete topSpacer_;
- delete titleSpacer_;
- delete leftTitleSpacer_;
- delete rightTitleSpacer_;
- delete decoSpacer_;
- delete leftSpacer_;
- delete rightSpacer_;
- delete bottomSpacer_;
- delete windowSpacer_;
-
- mainLayout_ = new TQVBoxLayout(widget());
- // title
- titleLayout_ = new TQHBoxLayout();
- TQHBoxLayout *windowLayout_ = new TQHBoxLayout();
- int FRAMESIZE = ::factory->frameSize();
-
- topSpacer_ = new TQSpacerItem(1, FRAMESIZE, TQSizePolicy::Expanding, TQSizePolicy::Fixed);
- titlebar_ = new TQSpacerItem(1, ::factory->buttonSize(),
- TQSizePolicy::Expanding, TQSizePolicy::Fixed);
- leftTitleSpacer_ = new TQSpacerItem(FRAMESIZE, s_titleHeight,
- TQSizePolicy::Fixed, TQSizePolicy::Fixed);
- rightTitleSpacer_ = new TQSpacerItem(FRAMESIZE, s_titleHeight,
- TQSizePolicy::Fixed, TQSizePolicy::Fixed);
- decoSpacer_ = new TQSpacerItem(1, FRAMESIZE, TQSizePolicy::Expanding, TQSizePolicy::Fixed);
- leftSpacer_ = new TQSpacerItem(::factory->frameSize(), 1,
- TQSizePolicy::Fixed, TQSizePolicy::Expanding);
- rightSpacer_ = new TQSpacerItem(::factory->frameSize(), 1,
- TQSizePolicy::Fixed, TQSizePolicy::Expanding);
- bottomSpacer_ = new TQSpacerItem(1, ::factory->frameSize(),
- TQSizePolicy::Expanding, TQSizePolicy::Fixed);
-
- // sizeof(...) is calculated at compile time
- memset(button, 0, sizeof(smoothblendButton *) * ButtonTypeCount);
-
- // message in preview widget
- if (isPreview()) {
- windowLayout_->addWidget(
- new TQLabel( i18n("<b><center>Smooth Blend</center></b>"), widget() ), 1 );
- } else {
- windowLayout_->addItem(new TQSpacerItem(0, 0));
- }
-
- // setup titlebar buttons
- for (int n=0; n<ButtonTypeCount; n++)
- button[n] = 0;
- //Deal with the title and buttons
- titleLayout_->addItem(leftTitleSpacer_);
- addButtons(titleLayout_,
- options()->customButtonPositions() ? options()->titleButtonsLeft() : TQString(default_left),
- ::factory->titleSize()-1);
- titleLayout_->addItem(titlebar_);
- addButtons(titleLayout_,
- options()->customButtonPositions() ? options()->titleButtonsRight() : TQString(default_right),
- ::factory->titleSize()-1);
- titleLayout_->addItem(rightTitleSpacer_);
-
- //Mid - left side, middle contents and right side
- TQHBoxLayout * midLayout_ = new TQHBoxLayout();
- midLayout_->addItem(leftSpacer_);
- midLayout_->addLayout(windowLayout_);
- midLayout_->addItem(rightSpacer_);
-
- //Layout order
- mainLayout_->addItem( topSpacer_ );
- mainLayout_->addLayout( titleLayout_ );
- mainLayout_->addItem( decoSpacer_ );
- mainLayout_->addLayout( midLayout_ );
- mainLayout_->addItem( bottomSpacer_ );
-
- // connections
- connect(this, TQT_SIGNAL(keepAboveChanged(bool)), TQT_SLOT(keepAboveChange(bool)));
- connect(this, TQT_SIGNAL(keepBelowChanged(bool)), TQT_SLOT(keepBelowChange(bool)));
-}
-
-//////////////////////////////////////////////////////////////////////////////
-// addButtons()
-// ------------
-// Add buttons to title tqlayout
-
-void smoothblendClient::addButtons(TQBoxLayout *tqlayout, const TQString& s, int button_size) {
- TQString tip;
- if (s.length() > 0) {
- for (unsigned n=0; n < s.length(); n++) {
- switch (s[n]) {
- case 'M': // Menu button
- if (!button[ButtonMenu]) {
- button[ButtonMenu] =
- new smoothblendButton(this, "splat.png", i18n("Menu"),ButtonMenu,button_size);
- connect(button[ButtonMenu], TQT_SIGNAL(pressed()), this, TQT_SLOT(menuButtonPressed()));
- connect(button[ButtonMenu], TQT_SIGNAL(released()), this, TQT_SLOT(menuButtonReleased()));
- tqlayout->addWidget(button[ButtonMenu]);
- if (n < s.length()-1) tqlayout->addSpacing(1);
- }
- break;
-
- case 'S': // Sticky button
- if (!button[ButtonSticky]) {
- if (isOnAllDesktops()) {
- tip = i18n("Un-Sticky");
- } else {
- tip = i18n("Sticky");
- }
- button[ButtonSticky] =
- new smoothblendButton(this, "circle.png", tip, ButtonSticky, button_size, true);
- connect(button[ButtonSticky], TQT_SIGNAL(clicked()),
- this, TQT_SLOT(toggleOnAllDesktops()));
- tqlayout->addWidget(button[ButtonSticky]);
- if (n < s.length()-1) tqlayout->addSpacing(1);
- }
- break;
-
- case 'H': // Help button
- if ((!button[ButtonHelp]) && providesContextHelp()) {
- button[ButtonHelp] =
- new smoothblendButton(this, "help.png", i18n("Help"), ButtonHelp, button_size);
- connect(button[ButtonHelp], TQT_SIGNAL(clicked()),
- this, TQT_SLOT(showContextHelp()));
- tqlayout->addWidget(button[ButtonHelp]);
- if (n < s.length()-1) tqlayout->addSpacing(1);
- }
- break;
-
- case 'I': // Minimize button
- if ((!button[ButtonMin]) && isMinimizable()) {
- button[ButtonMin] =
- new smoothblendButton(this, "minimize.png", i18n("Minimize"), ButtonMin, button_size);
- connect(button[ButtonMin], TQT_SIGNAL(clicked()),
- this, TQT_SLOT(minimize()));
- tqlayout->addWidget(button[ButtonMin]);
- if (n < s.length()-1) tqlayout->addSpacing(1);
- }
- break;
-
- case 'A': // Maximize button
- if ((!button[ButtonMax]) && isMaximizable()) {
- if (maximizeMode() == MaximizeFull) {
- tip = i18n("Restore");
- } else {
- tip = i18n("Maximize");
- }
- button[ButtonMax] =
- new smoothblendButton(this, "maximize.png", tip, ButtonMax, button_size, true);
- connect(button[ButtonMax], TQT_SIGNAL(clicked()),
- this, TQT_SLOT(maxButtonPressed()));
- tqlayout->addWidget(button[ButtonMax]);
- if (n < s.length()-1) tqlayout->addSpacing(1);
- }
- break;
-
- case 'X': // Close button
- if ((!button[ButtonClose]) && isCloseable()) {
- button[ButtonClose] =
- new smoothblendButton(this, "close.png", i18n("Close"), ButtonClose, button_size);
- connect(button[ButtonClose], TQT_SIGNAL(clicked()),
- this, TQT_SLOT(closeWindow()));
- tqlayout->addWidget(button[ButtonClose]);
- if (n < s.length()-1) tqlayout->addSpacing(1);
- }
- break;
-
- case 'F': // Above button
- if ((!button[ButtonAbove])) {
- button[ButtonAbove] =
- new smoothblendButton(this, "keep_above.png",
- i18n("Keep Above Others"), ButtonAbove, button_size, true);
- connect(button[ButtonAbove], TQT_SIGNAL(clicked()),
- this, TQT_SLOT(aboveButtonPressed()));
- tqlayout->addWidget(button[ButtonAbove]);
- if (n < s.length()-1) tqlayout->addSpacing(1);
- }
- break;
-
- case 'B': // Below button
- if ((!button[ButtonBelow])) {
- button[ButtonBelow] =
- new smoothblendButton(this, "keep_below.png",
- i18n("Keep Below Others"), ButtonBelow, button_size, true);
- connect(button[ButtonBelow], TQT_SIGNAL(clicked()),
- this, TQT_SLOT(belowButtonPressed()));
- tqlayout->addWidget(button[ButtonBelow]);
- if (n < s.length()-1) tqlayout->addSpacing(1);
- }
- break;
-
- case 'L': // Shade button
- if ((!button[ButtonShade]) && isShadeable()) {
- if ( isSetShade()) {
- tip = i18n("Unshade");
- } else {
- tip = i18n("Shade");
- }
- button[ButtonShade] =
- new smoothblendButton(this, "shade.png", tip, ButtonShade, button_size, true);
- connect(button[ButtonShade], TQT_SIGNAL(clicked()),
- this, TQT_SLOT(shadeButtonPressed()));
- tqlayout->addWidget(button[ButtonShade]);
- if (n < s.length()-1) tqlayout->addSpacing(1);
- }
- break;
-
- case '_': // Spacer item
- tqlayout->addSpacing(::factory->frameSize());
- }
- }
- }
-}
-
-//////////////////////////////////////////////////////////////////////////////
-// activeChange()
-// --------------
-// window active state has changed
-
-void smoothblendClient::activeChange() {
- for (int n=0; n<ButtonTypeCount; n++)
- if (button[n])
- button[n]->reset();
- widget()->tqrepaint(false);
-}
-
-//////////////////////////////////////////////////////////////////////////////
-// captionChange()
-// ---------------
-// The title has changed
-
-void smoothblendClient::captionChange() {
- widget()->tqrepaint(titlebar_->tqgeometry(), false);
-}
-
-//////////////////////////////////////////////////////////////////////////////
-// desktopChange()
-// ---------------
-// Called when desktop/sticky changes
-
-void smoothblendClient::desktopChange() {
- bool d = isOnAllDesktops();
- if (button[ButtonSticky]) {
- TQToolTip::remove(button[ButtonSticky]);
- TQToolTip::add(button[ButtonSticky], d ? i18n("Un-Sticky") : i18n("Sticky"));
- button[ButtonSticky]->tqrepaint(false);
- }
-}
-
-//////////////////////////////////////////////////////////////////////////////
-// iconChange()
-// ------------
-// The title has changed
-
-void smoothblendClient::iconChange() {
- if (button[ButtonMenu]) {
- button[ButtonMenu]->tqrepaint(false);
- }
-}
-
-//////////////////////////////////////////////////////////////////////////////
-// maximizeChange()
-// ----------------
-// Maximized state has changed
-
-void smoothblendClient::maximizeChange() {
- bool m = (maximizeMode() == MaximizeFull);
- if (button[ButtonMax]) {
- TQToolTip::remove(button[ButtonMax]);
- TQToolTip::add(button[ButtonMax], m ? i18n("Restore") : i18n("Maximize"));
- button[ButtonMax]->tqrepaint(false);
- }
-}
-
-//////////////////////////////////////////////////////////////////////////////
-// shadeChange()
-// -------------
-// Called when window shading changes
-
-void smoothblendClient::shadeChange() {
- bool s = isSetShade();
- if (button[ButtonShade]) {
- TQToolTip::remove(button[ButtonShade]);
- TQToolTip::add(button[ButtonShade], s ? i18n("Unshade") : i18n("Shade"));
- button[ButtonShade]->tqrepaint(false);
- }
-}
-
-//////////////////////////////////////////////////////////////////////////////
-// keepAboveChange()
-// ------------
-// The above state has changed
-
-void smoothblendClient::keepAboveChange(bool a) {
- if (button[ButtonAbove]) {
- button[ButtonAbove]->setOn(a);
- button[ButtonAbove]->tqrepaint(false);
- }
-}
-
-//////////////////////////////////////////////////////////////////////////////
-// keepBelowChange()
-// ------------
-// The below state has changed
-
-void smoothblendClient::keepBelowChange(bool b) {
- if (button[ButtonBelow]) {
- button[ButtonBelow]->setOn(b);
- button[ButtonBelow]->tqrepaint(false);
- }
-}
-
-//////////////////////////////////////////////////////////////////////////////
-// borders()
-// ----------
-// Get the size of the borders
-
-void smoothblendClient::borders(int &left, int &right, int &top, int &bottom) const {
- int FRAMESIZE = ::factory->frameSize();
-
- if ((maximizeMode()==MaximizeFull) && !options()->moveResizeMaximizedWindows()) {
- left = right = bottom = 0;
- top = ::factory->buttonSize();
-
- // update tqlayout etc.
- topSpacer_->changeSize(1, 0, TQSizePolicy::Expanding, TQSizePolicy::Fixed);
- decoSpacer_->changeSize(1, 0, TQSizePolicy::Expanding, TQSizePolicy::Fixed);
- leftSpacer_->changeSize(left, 1, TQSizePolicy::Fixed, TQSizePolicy::Expanding);
- leftTitleSpacer_->changeSize(left, top, TQSizePolicy::Fixed, TQSizePolicy::Fixed);
- rightSpacer_->changeSize(right, 1, TQSizePolicy::Fixed, TQSizePolicy::Expanding);
- rightTitleSpacer_->changeSize(right, top, TQSizePolicy::Fixed, TQSizePolicy::Fixed);
- bottomSpacer_->changeSize(1, bottom, TQSizePolicy::Expanding, TQSizePolicy::Fixed);
- } else {
- left = right = bottom = ::factory->frameSize();
- top = ::factory->titleSize() + (FRAMESIZE*2);
-
- // update tqlayout etc.
- topSpacer_->changeSize(1, FRAMESIZE, TQSizePolicy::Expanding, TQSizePolicy::Fixed);
- decoSpacer_->changeSize(1, FRAMESIZE, TQSizePolicy::Expanding, TQSizePolicy::Fixed);
- leftSpacer_->changeSize(left, 1, TQSizePolicy::Fixed, TQSizePolicy::Expanding);
- leftTitleSpacer_->changeSize(left, s_titleHeight, TQSizePolicy::Fixed, TQSizePolicy::Fixed);
- rightSpacer_->changeSize(right, 1, TQSizePolicy::Fixed, TQSizePolicy::Expanding);
- rightTitleSpacer_->changeSize(right,s_titleHeight,TQSizePolicy::Fixed, TQSizePolicy::Fixed);
- bottomSpacer_->changeSize(1, bottom, TQSizePolicy::Expanding, TQSizePolicy::Fixed);
- }
- widget()->tqlayout()->activate();
-}
-
-//////////////////////////////////////////////////////////////////////////////
-// resize()
-// --------
-// Called to resize the window
-
-void smoothblendClient::resize(const TQSize &size) {
- widget()->resize(size);
-}
-
-//////////////////////////////////////////////////////////////////////////////
-// tqminimumSize()
-// -------------
-// Return the minimum allowable size for this window
-
-TQSize smoothblendClient::tqminimumSize() const {
- return widget()->tqminimumSize();
-}
-
-//////////////////////////////////////////////////////////////////////////////
-// mousePosition()
-// ---------------
-// Return logical mouse position
-
-KDecoration::Position smoothblendClient::mousePosition(const TQPoint &point) const {
- const int corner = 24;
- Position pos;
- int fs = ::factory->frameSize() + handlebar;
- //int fs = ::factory->frameSize();
-
- if (point.y() <= fs) {
- // inside top frame
- if (point.x() <= corner)
- pos = PositionTopLeft;
- else if (point.x() >= (width()-corner))
- pos = PositionTopRight;
- else
- pos = PositionTop;
- } else if (point.y() >= (height()-fs*2)) {
- // inside handle
- if (point.x() <= corner)
- pos = PositionBottomLeft;
- else if (point.x() >= (width()-corner))
- pos = PositionBottomRight;
- else
- pos = PositionBottom;
- } else if (point.x() <= fs ) {
- // on left frame
- if (point.y() <= corner)
- pos = PositionTopLeft;
- else if (point.y() >= (height()-corner))
- pos = PositionBottomLeft;
- else
- pos = PositionLeft;
- } else if (point.x() >= width()-fs) {
- // on right frame
- if (point.y() <= corner)
- pos = PositionTopRight;
- else if (point.y() >= (height()-corner))
- pos = PositionBottomRight;
- else
- pos = PositionRight;
- } else {
- // inside the frame
- pos = PositionCenter;
- }
- return pos;
-}
-
-//////////////////////////////////////////////////////////////////////////////
-// eventFilter()
-// -------------
-// Event filter
-
-bool smoothblendClient::eventFilter(TQObject *obj, TQEvent *e) {
- if (TQT_BASE_OBJECT(obj) != TQT_BASE_OBJECT(widget()))
- return false;
-
- switch (e->type()) {
- case TQEvent::MouseButtonDblClick: {
- mouseDoubleClickEvent(TQT_TQMOUSEEVENT(e));
- return true;
- }
- case TQEvent::MouseButtonPress: {
- processMousePressEvent(TQT_TQMOUSEEVENT(e));
- return true;
- }
- case TQEvent::Paint: {
- paintEvent(TQT_TQPAINTEVENT(e));
- return true;
- }
- case TQEvent::Resize: {
- resizeEvent(TQT_TQRESIZEEVENT(e));
- return true;
- }
- case TQEvent::Show: {
- showEvent(TQT_TQSHOWEVENT(e));
- return true;
- }
- case TQEvent::Wheel: {
- wheelEvent(TQT_TQWHEELEVENT( e ));
- return true;
- }
- default: {
- return false;
- }
- }
-
- return false;
-}
-
-//////////////////////////////////////////////////////////////////////////////
-// mouseDoubleClickEvent()
-// -----------------------
-// Doubleclick on title
-
-void smoothblendClient::mouseDoubleClickEvent(TQMouseEvent *e) {
- if (titlebar_->tqgeometry().contains(e->pos()))
- titlebarDblClickOperation();
-}
-
-//////////////////////////////////////////////////////////////////////////////
-// wheelEvent()
-// ------------
-// Mouse wheel on titlebar
-
-void smoothblendClient::wheelEvent(TQWheelEvent *e)
-{
- if (titleLayout_->tqgeometry().contains(e->pos()) )
- titlebarMouseWheelOperation( e->delta());
-}
-
-//////////////////////////////////////////////////////////////////////////////
-// paintEvent()
-// ------------
-// Repaint the window
-
-void smoothblendClient::paintEvent(TQPaintEvent*) {
- if (!::factory->initialized())
- {
- return;
- }
-
- //int FRAMESIZE = ::factory->frameSize();
- const uint maxCaptionLength = 300; // truncate captions longer than this!
- TQString captionText(caption());
- if (captionText.length() > maxCaptionLength) {
- captionText.truncate(maxCaptionLength);
- captionText.append(" [...]");
- }
-
- TQColor blackColor(black);
- TQColor redColor(red);
- TQColorGroup group,widgetGroup;
- TQPainter painter(widget());
- bool active = isActive();
- //get group information first
- group = options()->tqcolorGroup(KDecoration::ColorTitleBar, isActive());
- widgetGroup = widget()->tqcolorGroup();
-
- TQRect topRect( topSpacer_->tqgeometry() );
- TQRect titleRect( titleLayout_->tqgeometry() );
- TQRect textRect( titlebar_->tqgeometry() );
- TQRect Rltitle( leftTitleSpacer_->tqgeometry() );
- TQRect Rrtitle( rightTitleSpacer_->tqgeometry() );
- TQRect Rdeco( decoSpacer_->tqgeometry() );
- TQRect Rleft( leftSpacer_->tqgeometry() );
- TQRect Rright( rightSpacer_->tqgeometry() );
- TQRect Rbottom( bottomSpacer_->tqgeometry() );
- TQRect tempRect;
-
-
- /*
- if(active)
- {
- qDebug("paintEvent() topRect.y() = %i\tbottom() = %i",topRect.top(),topRect.bottom());
- qDebug("paintEvent() titleRect.y() = %i\tbottom() = %i",titleRect.top(),titleRect.bottom());
- qDebug("paintEvent() textRect.y() = %i\tbottom() = %i",textRect.top(),textRect.bottom());
- qDebug("paintEvent() Rltitle.y() = %i\tbottom() = %i",Rltitle.top(),Rltitle.bottom());
- qDebug("paintEvent() Rrtitle.y() = %i\tbottom() = %i",Rrtitle.top(),Rrtitle.bottom());
- qDebug("paintEvent() Rdeco.y() = %i\tbottom() = %i",Rdeco.top(),Rdeco.bottom());
- qDebug("paintEvent() Rleft.y() = %i\tbottom() = %i",Rleft.top(),Rleft.bottom());
- qDebug("paintEvent() Rright.y() = %i\tbottom() = %i",Rright.top(),Rright.bottom());
- qDebug("paintEvent() Rbottom.y() = %i\tbottom() = %i",Rbottom.top(),Rbottom.bottom());
- }
- */
-
- // top
- painter.drawTiledPixmap(topRect, active ? *aTitleBarTopTile:*iTitleBarTopTile);
- painter.drawTiledPixmap(titleRect.x(),
- titleRect.y(),
- titleRect.width(),
- titleRect.height() + Rdeco.height(),
- active ? *aTitleBarTile:*iTitleBarTile);
-
- textRect.setRect(textRect.x()+SIDETITLEMARGIN,
- textRect.y(),
- textRect.width()-SIDETITLEMARGIN*2,
- textRect.height());
- TQRect shadowRect(textRect.x()+1,textRect.y()+1,textRect.width(),textRect.height());
- //if we are shadowing title bar text
- if(::factory->titleShadow())
- {
- //shadow text
- painter.setFont(options()->font(isActive(), false));
- painter.setPen(blackColor);
- painter.drawText(shadowRect,
- ::factory->titleAlign() | AlignVCenter | TQt::SingleLine,
- captionText);
- }
- // draw title text
- painter.setFont(options()->font(isActive(), false));
- painter.setPen(options()->color(KDecoration::ColorFont, isActive()));
- painter.drawText(textRect,
- ::factory->titleAlign() | AlignVCenter | TQt::SingleLine,
- captionText);
-
- //left of buttons and title
- painter.drawTiledPixmap(Rltitle.x(),
- Rltitle.y(),
- Rltitle.width(),
- Rltitle.height()+Rdeco.height(),
- active ? *aTitleBarTile:*iTitleBarTile);
- // left mid tqlayout
- painter.fillRect(Rleft,widgetGroup.background());
-
- // right of buttons and title
- painter.drawTiledPixmap(Rrtitle.x(),
- Rrtitle.y(),
- Rrtitle.width(),
- Rrtitle.height()+Rdeco.height(),
- active ? *aTitleBarTile:*iTitleBarTile);
- // right mid tqlayout
- painter.fillRect(Rright,widgetGroup.background());
-
- // bottom
- /*
- if(isShade())
- {
- frame.setRect(0,::factory->titleSize()+FRAMESIZE, width(), FRAMESIZE);
- }
- else
- {
- frame.setRect(0, height() - (FRAMESIZE*2), width(), (FRAMESIZE*2));
- }
- */
- painter.fillRect(Rbottom, widgetGroup.background());
-
- //draw a line between title bar and window contents
- painter.setPen(group.background());
-
- // outline outside the frame but not the corners if they are rounded
- tempRect = widget()->rect();
- painter.drawRect(tempRect);
-
- bool cornersFlag = ::factory->roundedCorners();
- if(cornersFlag) {
- // local temp right and bottom
- int r(width());
- painter.setPen(group.background());
- painter.drawPoint(4, 1);
- painter.drawPoint(3, 1);
- painter.drawPoint(2, 2);
- painter.drawPoint(1, 3);
- painter.drawPoint(1, 4);
- painter.drawPoint(r - 5, 1);
- painter.drawPoint(r - 4, 1);
- painter.drawPoint(r - 3, 2);
- painter.drawPoint(r - 2, 3);
- painter.drawPoint(r - 2, 4);
- }
-
-}
-
-//////////////////////////////////////////////////////////////////////////////
-// updateMask()
-// ------------
-// update the frame mask
-void smoothblendClient::updateMask() {
- bool cornersFlag = ::factory->roundedCorners();
- if ( (!options()->moveResizeMaximizedWindows() && maximizeMode() == MaximizeFull ) )
- {
- setMask(TQRegion(widget()->rect()));
- return;
- }
-
- int r(width());
- int b(height());
- TQRegion mask;
-
- mask=TQRegion(widget()->rect());
-
- // Remove top-left corner.
- if(cornersFlag) {
- mask -= TQRegion(0, 0, 5, 1);
- mask -= TQRegion(0, 1, 3, 1);
- mask -= TQRegion(0, 2, 2, 1);
- mask -= TQRegion(0, 3, 1, 2);
- mask -= TQRegion(r - 5, 0, 5, 1);
- mask -= TQRegion(r - 3, 1, 3, 1);
- mask -= TQRegion(r - 2, 2, 2, 1);
- mask -= TQRegion(r - 1, 3, 1, 2);
- }
- //always remove one corner pixel so it simulates a soft corner like plastik
- mask -= TQRegion(0,0,1,1);
- mask -= TQRegion(r-1,0,1,1);
- mask -= TQRegion(0, b-1, 1,1);
- mask -= TQRegion(r-1,b-1,1,1);
-
- setMask(mask);
-}
-
-//////////////////////////////////////////////////////////////////////////////
-// resizeEvent()
-// -------------
-// Window is being resized
-
-void smoothblendClient::resizeEvent(TQResizeEvent *) {
- if (widget()->isShown()) {
- TQRegion region = widget()->rect();
- region = region.subtract(titlebar_->tqgeometry());
- widget()->erase(region);
- updateMask();
- }
-}
-
-//////////////////////////////////////////////////////////////////////////////
-// showEvent()
-// -----------
-// Window is being shown
-
-void smoothblendClient::showEvent(TQShowEvent *) {
- updateMask();
- widget()->tqrepaint();
-}
-
-//////////////////////////////////////////////////////////////////////////////
-// maxButtonPressed()
-// -----------------
-// Max button was pressed
-
-void smoothblendClient::maxButtonPressed() {
- if (button[ButtonMax]) {
-#if KDE_IS_VERSION(3, 3, 0)
- maximize(button[ButtonMax]->lastMousePress());
-#else
-
- switch (button[ButtonMax]->lastMousePress()) {
- case MidButton:
- maximize(maximizeMode() ^ MaximizeVertical);
- break;
- case RightButton:
- maximize(maximizeMode() ^ MaximizeHorizontal);
- break;
- default:
- (maximizeMode() == MaximizeFull) ? maximize(MaximizeRestore)
- : maximize(MaximizeFull);
- }
-#endif
-
- }
-}
-
-//////////////////////////////////////////////////////////////////////////////
-// shadeButtonPressed()
-// -----------------
-// Shade button was pressed
-
-void smoothblendClient::shadeButtonPressed() {
- if (button[ButtonShade]) {
- setShade( !isSetShade());
- }
-}
-
-//////////////////////////////////////////////////////////////////////////////
-// aboveButtonPressed()
-// -----------------
-// Above button was pressed
-
-void smoothblendClient::aboveButtonPressed() {
- if (button[ButtonAbove]) {
- setKeepAbove( !keepAbove());
- }
-}
-
-//////////////////////////////////////////////////////////////////////////////
-// belowButtonPressed()
-// -----------------
-// Below button was pressed
-
-void smoothblendClient::belowButtonPressed() {
- if (button[ButtonBelow]) {
- setKeepBelow( !keepBelow());
- }
-}
-
-//////////////////////////////////////////////////////////////////////////////
-// menuButtonPressed()
-// -------------------
-// Menu button was pressed (popup the menu)
-
-void smoothblendClient::menuButtonPressed() {
- static TQTime* t = NULL;
- static smoothblendClient* lastClient = NULL;
- if (t == NULL)
- t = new TQTime;
- bool dbl = (lastClient==this && t->elapsed() <= TQApplication::doubleClickInterval());
- lastClient = this;
- t->start();
- //if (button[ButtonMenu] && !dbl && !::factory->menuClosed()) {
- if ( !dbl || !::factory->menuClosed()) {
- TQPoint p(button[ButtonMenu]->rect().bottomLeft().x(),
- button[ButtonMenu]->rect().bottomLeft().y());
- KDecorationFactory* f = factory();
- showWindowMenu(button[ButtonMenu]->mapToGlobal(p));
- if (!f->exists(this))
- return; // decoration was destroyed
- button[ButtonMenu]->setDown(false);
- }
- else
- {
- closing = true;
- }
-}
-
-void smoothblendClient::menuButtonReleased()
-{
- if(closing)
- {
- closeWindow();
- }
-}
-
-#include "smoothblend.moc"