/* * SuSE window decoration for SuSE 9.1 * written by Adrian Schroeter * * copyright 2002 SuSE AG, GPL License * */ #include "MachBunt.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include extern "C" { TDE_EXPORT KDecorationFactory *create_factory() { return new SuSEMachBunt::BuntFactory(); } } namespace SuSEMachBunt { #include "pixmaps.h" // [button number][inactive/active][std/mouseOver/buttonPressed][miniIcon] KPixmap buttonPixmap[BtnCount][2][3][2]; bool titlebarResize, titlebarPlain, titlebarLogo, titlebarSidebar, titlebarNoPlainButtons; double titlebarLenseButtonFlare; static bool pixmaps_created = false; static TQImage left_img[2][2]; static TQImage middle_img[2][2]; static TQImage right_img[2][2]; static TQImage text_img[2][2]; static TQImage bar_img[2][2]; static TQImage kroete_img[2][2]; static TQImage button_img[2][2]; static TQImage button_l_img[2][2]; static TQImage button_r_img[2][2]; extern TQColor *btnForeground; extern TQPixmap *defaultPixmap; static TQImage colorize(TQImage img, const TQColor &col1, const TQColor &col2, float bright, float contrast ) { int rval, gval, bval, val, val2, i; int pixels = (img.depth() > 8) ? img.width()*img.height() : img.numColors(); unsigned int *data = img.depth() > 8 ? (unsigned int *) img.bits() : (unsigned int *) img.colorTable(); for (i=0; i(tqBlue(data[i]) * contrast); val2 = static_cast(tqGreen(data[i]) * contrast); rval = static_cast( (val2*255*3 + (255-val2)*col2.red())/255 ); gval = static_cast( (val2*255*3 + (255-val2)*col2.green())/255 ); bval = static_cast( (val2*255*3 + (255-val2)*col2.blue())/255 ); rval = static_cast( (val *rval + (255-val)*col1.red())/255 ); gval = static_cast( (val *gval + (255-val)*col1.green())/255 ); bval = static_cast( (val *bval + (255-val)*col1.blue())/255 ); if ( 255 < rval+tqRed(data[i]) ) rval = 255; else rval += tqRed(data[i]); if ( 255 < gval+tqRed(data[i]) ) gval = 255; else gval += tqRed(data[i]); if ( 255 < bval+tqRed(data[i]) ) bval = 255; else bval += tqRed(data[i]); if (bright != 1.0) { rval = static_cast(bright*rval); gval = static_cast(bright*gval); bval = static_cast(bright*bval); } data[i] = tqRgba(rval, gval, bval, tqAlpha(data[i])); } return img; } KPixmap create_buttonPixmap( int x, int y, TQPixmap _pix, TQPixmap bg, int active, int mouse ) { TQImage i; KPixmap _p(TQPixmap(x,y)); TQPixmap t, pix; TQPainter p; if ( _pix.isNull() ) pix = TQPixmap(kdelogo); else pix = _pix; p.begin(&_p); if ( x != pix.width() || y != pix.height() ){ p.drawImage( 0, 0, bg.convertToImage().smoothScale(x,y) ); p.drawPixmap((x-pix.width())/2, (y-pix.height())/2, pix ); }else{ p.drawTiledPixmap(0, 0, x, y, bg ); p.drawPixmap(0, (y-pix.height())/2, pix ); } p.end(); if ( !(mouse == 1 && titlebarPlain) && !(mouse == 0 && !titlebarPlain) ){ // not standard i=_p; if ( (mouse == 0 && titlebarPlain) || (mouse == 1 && !titlebarPlain) ){ // mouse over _p.convertFromImage(KImageEffect::blend(TQt::white, i, 0.25 )); }else{ // pressed _p.convertFromImage(KImageEffect::blend(TQt::black, i, 0.25 )); } if ( mouse == 2 ) { // pressed i=_p; p.begin(&_p); p.drawImage( 0, 2, i, 0, 0, i.width(), i.height()-2 ); p.end(); } } return _p; } TQImage image_convert( const char **b, int h){ TQPixmap p(b); TQImage i; i = p.convertToImage(); if ( p.height()!=h ) i = i.smoothScale((p.width()*h)/p.height(),h); return i; } static void create_pixmaps( ) { if(pixmaps_created) return; pixmaps_created = true; for ( int m=0; m<2; m++ ) for ( int i=0; i<2; i++){ TQColor ctb = KDecoration::options()->color(KDecoration::ColorTitleBar,i); TQColor ctbB = KDecoration::options()->color(KDecoration::ColorTitleBlend,i); left_img[i][m] = colorize(image_convert(left_xpm, m ? 12 : PIX_HEIGHT) , ctb, ctbB, 0.75 , 0.75 ); right_img[i][m] = colorize(image_convert(right_xpm, m ? 12 : PIX_HEIGHT) , ctb, ctbB, 1.0 , 1.0 ); middle_img[i][m] = colorize(image_convert(middle_xpm, m ? 12 : PIX_HEIGHT), ctb, ctbB, 1.0 , 1.0 ); text_img[i][m] = colorize(image_convert(middle_xpm, m ? 12 : PIX_HEIGHT), ctb, ctbB, 0.75 , 0.75 ); kroete_img[i][m] = colorize(image_convert(kroete_xpm, m ? 12 : PIX_HEIGHT), ctb, ctbB, 1.0 , 1.0 ); bar_img[i][m] = colorize(image_convert(bar_xpm, m ? 12 : PIX_HEIGHT), ctb, ctbB, 1.0 , 1.0 ); button_img[i][m] = colorize(image_convert(middle_button_xpm, m ? 12 : PIX_HEIGHT), ctb, ctbB, 1.0 , 1.0 ); button_l_img[i][m] = colorize(image_convert(middle_button_left_xpm, m ? 12 : PIX_HEIGHT), ctb, ctbB, 1.0 , 1.0 ); button_r_img[i][m] = colorize(image_convert(middle_button_right_xpm, m ? 12 : PIX_HEIGHT), ctb, ctbB, 1.0 , 1.0 ); } for ( int m=0; m<2; m++ ) for ( int M=0; M<3; M++ ) for ( int a=0; a<2; a++ ){ buttonPixmap[0][a][M][m] = create_buttonPixmap( m ? 12 : PIX_HEIGHT, m ? 12 : PIX_HEIGHT, TQPixmap(kdelogo), button_img[a][m], a, M ); buttonPixmap[1][a][M][m] = create_buttonPixmap( m ? 12 : PIX_HEIGHT, m ? 12 : PIX_HEIGHT, TQPixmap(sticky_xpm), button_img[a][m], a, M ); buttonPixmap[2][a][M][m] = create_buttonPixmap( m ? 12 : PIX_HEIGHT, m ? 12 : PIX_HEIGHT, TQPixmap(question_xpm), button_img[a][m], a, M ); buttonPixmap[3][a][M][m] = create_buttonPixmap( m ? 12 : PIX_HEIGHT, m ? 12 : PIX_HEIGHT, TQPixmap(iconify_xpm), button_img[a][m], a, M ); buttonPixmap[4][a][M][m] = create_buttonPixmap( m ? 12 : PIX_HEIGHT, m ? 12 : PIX_HEIGHT, TQPixmap(maximze_xpm), button_img[a][m], a, M ); TQPixmap i(button_img[a][m]); TQPainter p(&i); p.drawPixmap(button_img[a][m].width()-right_img[a][m].width()+BORDER_RIGHT, 0, right_img[a][m]); p.end(); buttonPixmap[5][a][M][m] = create_buttonPixmap( m ? 12 : PIX_HEIGHT, m ? 12 : PIX_HEIGHT, TQPixmap(close_xpm), i, a, M ); } // Make sure button pixmaps contrast with the current colour scheme. if(tqGray(KDecoration::options()->color(KDecoration::ColorTitleBar,true).rgb()) > 127) btnForeground = new TQColor(TQt::black); else btnForeground = new TQColor(TQt::white); } void delete_pixmaps() { delete btnForeground; pixmaps_created = false; } MachBunt::MachBunt(KDecorationBridge* bridge, KDecorationFactory* factory) : KDecoration(bridge, factory), windowLayout(0) { TDEGlobal::locale()->insertCatalogue("twin_clients"); TDEGlobal::locale()->insertCatalogue("twin-style-machbunt"); lastButtonWidth = 0; buttonPressedPosition.setX( -1 ); for ( int i=0; i < BtnCount; i++ ) button[i]=0; hiddenItems = false; } MachBunt::~MachBunt() { } void MachBunt::init() { if ( isTool() ) { titleHeight = 12; smallButtons = true; } else { titleHeight = PIX_HEIGHT; smallButtons = false; } createMainWidget(WNoAutoErase); widget()->installEventFilter( this ); widget()->setBackgroundMode(NoBackground); TDEConfig c("twinMachBuntrc"); c.setGroup("General"); titlebarResize = c.readBoolEntry("TitleBarResize", true); titlebarLogo = c.readBoolEntry("TitleBarLogo", true); titlebarPlain = c.readBoolEntry("TitleBarPlain", true); titlebarNoPlainButtons = c.readBoolEntry("TitleBarNoPlainButtons", false); titlebarSidebar = c.readBoolEntry("TitleBarSideBar", false); titlebarLenseButtonFlare = c.readDoubleNumEntry("titlebarLenseButtonFlare", 1.7); defaultPixmap = new TQPixmap(kdelogo); create_pixmaps(); createButtons(); doLayout(); } void MachBunt::createButtons() { if ( !button[BtnMenu] ) button[BtnMenu] = new MachBuntButton(this, "menu", BtnMenu, text_img[0][smallButtons], text_img[1][smallButtons], smallButtons, i18n("Menu")); //if ( !button[BtnSticky] ) // button[BtnSticky] = new MachBuntButton(this, "sticky", BtnSticky, middle_img[0][smallButtons], middle_img[1][smallButtons], smallButtons, i18n("Sticky")); if ( !button[BtnHelp] ) button[BtnHelp]= new MachBuntButton(this, "help", BtnHelp, middle_img[0][smallButtons], middle_img[1][smallButtons], smallButtons, i18n("Help")); if ( !button[BtnIconify] ) button[BtnIconify] = new MachBuntButton(this, "iconify", BtnIconify, middle_img[0][smallButtons], middle_img[1][smallButtons], smallButtons, i18n("Minimize")); if ( !button[BtnMax] ) button[BtnMax] = new MachBuntButton(this, "maximize", BtnMax, middle_img[0][smallButtons], middle_img[1][smallButtons], smallButtons, i18n("Maximize")); if ( !button[BtnClose] ) button[BtnClose] = new MachBuntButton(this, "close", BtnClose, middle_img[0][smallButtons], middle_img[1][smallButtons], smallButtons, i18n("Close")); // Connect required stuff together connect( button[BtnMenu], TQ_SIGNAL(pressed()), this, TQ_SLOT( menuButtonPressed() )); connect( button[BtnClose], TQ_SIGNAL( clicked() ), this, TQ_SLOT( closeWindow() )); connect( button[BtnIconify], TQ_SIGNAL( clicked() ), this, TQ_SLOT( minimize() )); connect( button[BtnMax], TQ_SIGNAL( clicked() ), this, TQ_SLOT( slotMaximize() )); for ( int i=0; i < BtnCount; i++ ) if ( button[i] ){ connect( button[i], TQ_SIGNAL(shapeMe(int)),this, TQ_SLOT(doShape(int))); connect( button[i], TQ_SIGNAL(pressed()),this, TQ_SLOT(buttonPressed())); connect( button[i], TQ_SIGNAL(released()),this, TQ_SLOT(buttonReleased())); connect( button[i], TQ_SIGNAL(mousePressedMove(TQMouseEvent*)),this, TQ_SLOT(mouseMoveOnButtonPressed(TQMouseEvent*))); } connect( button[BtnHelp], TQ_SIGNAL( clicked() ), this, TQ_SLOT( showContextHelp() )); // Hide buttons which are not required // We can un-hide them if required later if ( !isMinimizable() ) button[BtnIconify]->hide(); if ( !isMaximizable() ) button[BtnMax]->hide(); if ( !providesContextHelp()) button[BtnHelp]->hide(); // Make sure that the menu button uses the correct mini-icon iconChange(); maximizeChange(); desktopChange(); } void MachBunt::reset( unsigned long changed ) { for(int i = 0; i < BtnCount; i++) if(button[i]) button[i]->reset( changed ); widget()->repaint(); } int MachBunt::mapButton( const TQChar &c) { if (c.isNull()) return -1; switch (c.latin1()) { case 'M': return BtnMenu; //case 'S': // return BtnSticky; case 'H': // Help return BtnHelp; case 'I': // Minimize return BtnIconify; case 'A': // Maximize return BtnMax; case 'X': // Close return BtnClose; } // something went wrong tqDebug("unknown Button to map: %c\n", c.latin1() ); return -1; } void MachBunt::doLayout() { delete windowLayout; windowLayout = new TQVBoxLayout(widget(), 0, 0); titlebar = new TQSpacerItem ( 0, titleHeight, TQSizePolicy::Expanding, TQSizePolicy::Fixed); TQBoxLayout *topLayout = new TQBoxLayout(windowLayout, TQBoxLayout::LeftToRight, 0, 0); TQString leftButtons(options()->customButtonPositions() ? options()->titleButtonsLeft() : "M"); TQString rightButtons(options()->customButtonPositions() ? options()->titleButtonsRight() : "HIAX"); bool first_left = true; for ( unsigned int i = 0; i < leftButtons.length(); i++) { int b = mapButton(leftButtons[i]); if (b >= 0) { topLayout->addWidget(button[b], TQt::AlignVCenter); topLayout->setStretchFactor(button[b], 0); button[b]->setFixedSize(titleHeight, titleHeight); if( first_left ) { first_left = false; button[b]->setPosition( ButtonLeft ); } } } topLayout->addItem(titlebar); MachBuntButton* last_right = NULL; for ( unsigned int i = 0; i < rightButtons.length(); i++) { int b = mapButton(rightButtons[i]); if ( b>=0 ){ topLayout->addWidget(button[b], TQt::AlignVCenter); topLayout->setStretchFactor(button[b], 0); button[b]->setFixedSize(titleHeight, titleHeight); last_right = button[b]; } } if( last_right ) last_right->setPosition( ButtonRight ); TQHBoxLayout * midLayout = new TQHBoxLayout(windowLayout, 0, 0); midLayout->addSpacing(BORDER_LEFT); if( isPreview()) midLayout->addWidget(new TQLabel( i18n( "
MachBunt
" ), widget())); else midLayout->addItem( new TQSpacerItem( 0, 0 )); // no widget in the middle midLayout->addSpacing(BORDER_RIGHT); windowLayout->addSpacing(BORDER_BOTTOM); windowLayout->setStretchFactor(topLayout, 0); windowLayout->setStretchFactor(midLayout, 1); } void MachBunt::borders(int& left, int& right, int& top, int& bottom) const { left = BORDER_LEFT; right = BORDER_RIGHT; top = titleHeight; bottom = BORDER_BOTTOM; } void MachBunt::mouseMoveOnButtonPressed( TQMouseEvent *e ) { #if 0 if ( buttonPressedPosition.x() >= 0 ){ TQPoint p( buttonPressedPosition.x() - geometry().x(), buttonPressedPosition.y() - geometry().y()); if ( mousePosition(p) == KDecoration::TopLeft || mousePosition(p) == KDecoration::TopRight ) performMouseCommand(Options::MouseResize, TQCursor::pos()); else if ( mousePosition(p) == KDecoration::Top ){ TQPoint m(geometry().x()+geometry().width()/2, geometry().y()); performMouseCommand(Options::MouseResize, m ); } buttonPressedPosition.setX( -1 ); } KDecoration::mouseMoveEvent(e); #endif } void MachBunt::buttonPressed() { TQPoint p( TQCursor::pos().x() - geometry().x(), TQCursor::pos().y() - geometry().y()); if ( mousePosition(p) == KDecorationDefines::PositionTopLeft || mousePosition(p) == KDecorationDefines::PositionTopRight || mousePosition(p) == KDecorationDefines::PositionTop ) buttonPressedPosition = TQCursor::pos(); } void MachBunt::buttonReleased() { buttonPressedPosition.setX( -1 ); // keyPressEvent( Key_Escape ); } KDecoration::Position MachBunt::mousePosition(const TQPoint & p) const { int x = p.x(); int y = p.y(); if ( y < titleHeight ){ if ( x < BUTTON_RESIZE_SIZE ) return KDecorationDefines::PositionTopLeft; if ( x > width() - 1 - BUTTON_RESIZE_SIZE ) return KDecorationDefines::PositionTopRight; } if ( titlebarResize ){ if ( ( ! (x < BUTTON_RESIZE_SIZE || x > width() - 1 - BUTTON_RESIZE_SIZE) ) && (y < TOP_RESIZE_HEIGHT )) { if ( titlebarResize==true ) return KDecorationDefines::PositionTop; else return KDecorationDefines::PositionCenter; } } return KDecoration::mousePosition(p); } void MachBunt::slotMaximize() { if ( button[BtnMax]->last_button == MidButton ) maximize(maximizeMode() ^ MaximizeVertical ); else if ( button[BtnMax]->last_button == RightButton ) maximize(maximizeMode() ^ MaximizeHorizontal ); else maximize(maximizeMode() == MaximizeFull ? MaximizeRestore : MaximizeFull); } void MachBunt::resize( const TQSize& s ) { widget()->resize( s ); } TQSize MachBunt::minimumSize() const { return TQSize( 200, 50 ); } const int SUPPORTED_WINDOW_TYPES_MASK = NET::NormalMask | NET::DesktopMask | NET::DockMask | NET::ToolbarMask | NET::MenuMask | NET::DialogMask | NET::OverrideMask | NET::TopMenuMask | NET::UtilityMask | NET::SplashMask; bool MachBunt::isTool() { NET::WindowType type = windowType( SUPPORTED_WINDOW_TYPES_MASK ); return ((type==NET::Toolbar)||(type==NET::NET::Utility)||(type==NET::Menu)); } bool MachBunt::eventFilter( TQObject* o, TQEvent* e ) { if( o != widget()) return false; switch( e->type()) { case TQEvent::Resize: resizeEvent(static_cast< TQResizeEvent* >( e ) ); return true; case TQEvent::Paint: paintEvent(static_cast< TQPaintEvent* >( e ) ); return true; case TQEvent::MouseButtonDblClick: mouseDoubleClickEvent(static_cast< TQMouseEvent* >( e ) ); return true; case TQEvent::MouseButtonPress: processMousePressEvent(static_cast< TQMouseEvent* >( e ) ); return true; default: break; } return false; } void MachBunt::desktopChange() { emit(oadChange(isOnAllDesktops())); } KDecoration* BuntFactory::createDecoration( KDecorationBridge* b ) { return(new MachBunt(b, this)); } bool BuntFactory::reset(unsigned long changed) { // Do we need to "hit the wooden hammer" ? bool needHardReset = false; if (changed & (SettingDecoration | SettingFont | SettingButtons | SettingBorder)) { needHardReset = true; } if( changed & SettingColors ) { // pixmaps need to be recreated delete_pixmaps(); create_pixmaps(); } if (needHardReset) { return true; } else { resetDecorations(changed); return false; } } TQValueList< BuntFactory::BorderSize > BuntFactory::borderSizes() const { // the list must be sorted return TQValueList< BorderSize >() << BorderNormal; // TODO << BorderLarge << BorderVeryLarge << BorderHuge << BorderVeryHuge << BorderOversized; } void MachBunt::resizeEvent( TQResizeEvent*) { doShape(); calcHiddenButtons(); widget()->repaint(); #if 0 for ( int i=0; i < BtnCount; i++ ) if ( button[i] ) button[i]->reset(0); if (isVisibleToTLW()) { update(rect()); int dx = 0; int dy = 0; if ( e->oldSize().width() != width() ) dx = 32 + TQABS( e->oldSize().width() - width() ); if ( e->oldSize().height() != height() ) dy = 8 + TQABS( e->oldSize().height() - height() ); if ( dy ) update( 0, height() - dy + 1, width(), dy ); if ( dx ) { update( width() - dx + 1, 0, dx, height() ); update( TQRect( TQPoint(4,4), titlebar->geometry().bottomLeft() - TQPoint(1,0) ) ); update( TQRect( titlebar->geometry().topRight(), TQPoint( width() - 4, titlebar->geometry().bottom() ) ) ); // Titlebar needs no paint event TQApplication::postEvent( widget(), new TQPaintEvent( titlebar->geometry(), FALSE ) ); } } #endif } void MachBunt::captionChange() { widget()->repaint( titlebar->geometry(), false ); } void MachBunt::iconChange() { button[BtnMenu]->setPixmap( icon().pixmap( TQIconSet::Small, TQIconSet::Normal )); if (button[BtnMenu]->isVisible()) button[BtnMenu]->repaint(false); } void MachBunt::paintEvent( TQPaintEvent *pe ) { // bool hicolor = TQPixmap::defaultDepth() > 8; int fontoffset = 1; TQPainter p(widget()); p.setClipRegion(pe->region()); // Obtain widget bounds. TQRect r(widget()->rect()); int i; int x = r.x(); int y = r.y(); int x2 = r.width()-1; int y2 = r.height()-1; int w = r.width(); int ps = smallButtons ? PIX_SIDE/2 : PIX_SIDE; TQColorGroup g = options()->colorGroup(KDecorationDefines::ColorFrame, isActive()); p.setPen( g.dark() ); // the dark outer drawings p.drawLine(x, y+PIX_CORNER_RADIUS+2*BORDER_LEFT, x, y2); p.drawLine(x2, y+PIX_CORNER_RADIUS+2*BORDER_LEFT, x2, y2); p.drawLine(x, y2 , x2, y2); // the dark diagonals beside titlebar p.drawLine(x, y+PIX_CORNER_RADIUS+2*BORDER_LEFT, x+BORDER_LEFT, y+PIX_CORNER_RADIUS+BORDER_LEFT); p.drawLine(x2, y+PIX_CORNER_RADIUS+2*BORDER_LEFT, x2-BORDER_LEFT, y+PIX_CORNER_RADIUS+BORDER_LEFT); p.setPen( g.light() ); if ( titlebarSidebar ){ for ( i=1; igeometry(); // TQFontMetrics fm(options()->font(true)); KPixmap titleBuffer; if ( titlebarSidebar ) titleBuffer.resize(w-BORDER_LEFT-BORDER_RIGHT, titleHeight); else titleBuffer.resize(w, titleHeight); TDEIconEffect kie; TQPainter p2( &titleBuffer, widget()); p2.drawTiledPixmap( ps, 0, titleBuffer.width()-2*ps, titleHeight, middle_img[isActive()][smallButtons]); p2.drawTiledPixmap( 0, 0, ps, titleHeight, left_img[isActive()][smallButtons]); p2.drawTiledPixmap( titleBuffer.width()-ps, 0, ps, titleHeight, right_img[isActive()][smallButtons]); int l; if ( button[BtnHelp] && button[BtnHelp]->isShown() ) l=button[BtnHelp]->x(); else if ( button[BtnIconify]->isShown() ) l=button[BtnIconify]->x(); else if ( button[BtnMax]->isShown() ) l=button[BtnMax]->x(); else if ( button[BtnClose]->isShown() ) l=button[BtnClose]->x(); else l=0; p2.drawTiledPixmap(l-titleHeight/2, 0, titleHeight-(titleHeight/2), titleHeight, button_img[isActive()][smallButtons], titleHeight/2, 0); // Reduce the font size and weight for toolwindows. TQFont font = options()->font(true); if ( smallButtons ) { font.setPointSize( font.pointSize() - 2 ); font.setWeight( TQFont::Normal ); fontoffset = 0; } p2.setFont( font ); p2.setPen( options()->color(KDecorationDefines::ColorFont, isActive() )); w = p2.fontMetrics().width(caption())+2*TEXT_BORDER; if ( w > r.width()-3-button_l_img[0][smallButtons].width()-bar_img[0][smallButtons].width() ) w=r.width()-3-button_l_img[0][smallButtons].width()-bar_img[0][smallButtons].width(); p2.drawTiledPixmap( r.x()-TEXT_BORDER-ps, 0, w+ps+2*TEXT_BORDER+3, titleHeight , text_img[isActive()][smallButtons]); p2.drawPixmap(r.x()+w+TEXT_BORDER, 0, bar_img[isActive()][smallButtons]); if ( titlebarLogo && isActive() && r.x()+w+kroete_img[0][smallButtons].width() < r.width() ) p2.drawTiledPixmap( r.x()+w+bar_img[0][smallButtons].width(), 0, kroete_img[0][smallButtons].width(), titleHeight, kroete_img[isActive()][smallButtons]); p2.drawText( r.x(), fontoffset, w+TEXT_BORDER, r.height()-1, AlignLeft | AlignVCenter, caption() ); p2.end(); if ( titlebarSidebar ) p.drawPixmap( BORDER_LEFT, 0, titleBuffer ); else p.drawPixmap( 0, 0, titleBuffer ); } void MachBunt::showEvent(TQShowEvent *) { doShape(); widget()->repaint(); } void MachBunt::mouseDoubleClickEvent( TQMouseEvent * e ) { if (titlebar->geometry().contains( e->pos() ) ) titlebarDblClickOperation(); } void MachBunt::maximizeChange() { // button[BtnMax]->setBitmap(m ? minmax_bits : maximize_bits); button[BtnMax]->setTipText( (maximizeMode()==MaximizeFull) ? i18n("Restore") : i18n("Maximize")); } void MachBunt::activeChange() { for(int i=0; i < BtnCount; i++) { if(button[i]) button[i]->repaint(); } widget()->repaint(); } void MachBunt::calcHiddenButtons() { // order of hiding is help, maximize, minimize, close, then menu; int minWidth = 32 + titleHeight*4 + (providesContextHelp() ? titleHeight*2 : titleHeight ); if(lastButtonWidth > width()) // Shrinking { lastButtonWidth = width(); if(width() < minWidth) { hiddenItems = true; for(int i = 0; i < BtnCount; i++) { if(button[i]) { if( !button[i]->isHidden() ) { button[i]->hide(); } minWidth -= button[i]->sizeHint().width(); if(width() >= minWidth) return; } } } } else if(hiddenItems) // Expanding { lastButtonWidth = width(); int totalSize = titleHeight*3; for(int i = BtnCount - 1; i >= 0; i--) { if(button[i]) { if(button[i]->sizeHint().width() + totalSize <= width()) { totalSize += button[i]->sizeHint().width(); button[i]->resize(button[i]->sizeHint()); button[i]->show(); } else return; } } // all items shown now hiddenItems = false; } else lastButtonWidth = width(); } void MachBunt::menuButtonPressed() { // KS - move the menu left by 3 pixels, and down 2 pixels. TQPoint menupoint ( button[BtnMenu]->rect().bottomLeft().x()-3, button[BtnMenu]->rect().bottomLeft().y()+2 ); KDecorationFactory* f = factory(); showWindowMenu( button[BtnMenu]->mapToGlobal( menupoint )); if( !f->exists( this )) // 'this' was destroyed return; button[BtnMenu]->setDown(false); } void MachBunt::doShape(int x) { TQRegion mask(0, 0, width(), height()); int bWidth = smallButtons ? 12 : PIX_HEIGHT; int i, bl=0, br=0, p=0; int r(width()); if ( titlebarSidebar ){ bl=BORDER_LEFT; br=BORDER_RIGHT; // is the right button pressed ? if ( x >= (r - br - bWidth) ) p=2; } mask -= TQRegion(0, 0, bl+3, 1); mask -= TQRegion(0, 1, bl+1, 1); // Remove top-right corner. if ( smallButtons ){ mask -= TQRegion(r-3-br, 0, 3+br, 1+p); mask -= TQRegion(r-2-br, 1, 2+br, 1+p); mask -= TQRegion(r-1-br, 2, 1+br, 1+p); }else{ mask -= TQRegion(r-7-br, 0, 7+br, 1+p); mask -= TQRegion(r-5-br, 1, 5+br, 1+p); mask -= TQRegion(r-4-br, 2, 4+br, 1+p); mask -= TQRegion(r-3-br, 3, 3+br, 1+p); mask -= TQRegion(r-2-br, 4, 2+br, 1+p); mask -= TQRegion(r-1-br, 5, 1+br, 2+p); } for ( i=0; iisShown() ){ // top left corner of this button and right part of the button before mask -= TQRegion( button[i]->x() - 3, 0, 4, 1 ); mask -= TQRegion( button[i]->x() - 1, 0, 1, 2 ); } } // the pressed button if ( x != 0 ){ mask -= TQRegion( x, 0, bWidth, 2 ); mask -= TQRegion( x, 0, 1, 3 ); mask -= TQRegion( x + bWidth -3 , 0, 3, 3 ); mask -= TQRegion( x + bWidth -1 , 0, 1, 4 ); } setMask(mask); } } #include "MachBunt.moc"