summaryrefslogtreecommitdiffstats
path: root/twin/clients/b2/b2client.h
blob: c9748ccd6cd9c0492944b9055f6e166dfa07a76a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
/*
 * B-II KWin Client
 *
 * Changes:
 * 	Customizable button positions by Karol Szwed <[email protected]>
 * 	Ported to the trinity.2 API by Luciano Montanaro <[email protected]>
 */

#ifndef __B2CLIENT_H
#define __B2CLIENT_H

#include <tqvariant.h>
#include <tqdatetime.h>
#include <tqbutton.h>
#include <tqbitmap.h>
#include <kpixmap.h>
#include <kdecoration.h>
#include <kdecorationfactory.h>

class TQSpacerItem;
class TQBoxLayout;
class TQGridLayout;

namespace B2 {

class B2Client;

class B2Button : public TQButton
{
public:
    B2Button(B2Client *_client=0, TQWidget *parent=0, const TQString& tip=NULL, const int realizeBtns = TQt::LeftButton);
    ~B2Button() {};

    void setBg(const TQColor &c){bg = c;}
    void setPixmaps(KPixmap *pix, KPixmap *pixDown, KPixmap *iPix,
                    KPixmap *iPixDown);
    void setPixmaps(int button_id);
    void setToggle(){setToggleType(Toggle);}
    void setActive(bool on){setOn(on);}
    void setUseMiniIcon(){useMiniIcon = true;}
    TQSize sizeHint() const;
    TQSizePolicy sizePolicy() const;
protected:
    virtual void drawButton(TQPainter *p);
    void drawButtonLabel(TQPainter *){;}

    void mousePressEvent( TQMouseEvent* e );
    void mouseReleaseEvent( TQMouseEvent* e );
private:
    void enterEvent(TQEvent *e);
    void leaveEvent(TQEvent *e);
    
    bool useMiniIcon;
    KPixmap *icon[6];
    TQColor bg; //only use one color (the rest is pixmap) so forget TQPalette ;)

public:
    B2Client* client;
    ButtonState last_button;
    int realizeButtons;
    bool hover;
};

class B2Titlebar : public TQWidget
{
    friend class B2Client;
public:
    B2Titlebar(B2Client *parent);
    ~B2Titlebar(){;}
    bool isFullyObscured() const {return isfullyobscured;}
    void recalcBuffer();
    TQSpacerItem *captionSpacer;
protected:
    void paintEvent( TQPaintEvent* );
    bool x11Event(XEvent *e);
    void mouseDoubleClickEvent( TQMouseEvent * );
    void wheelEvent(TQWheelEvent *);
    void mousePressEvent( TQMouseEvent * );
    void mouseReleaseEvent( TQMouseEvent * );
    void mouseMoveEvent(TQMouseEvent *);
    void resizeEvent(TQResizeEvent *ev);
private:
    void drawTitlebar(TQPainter &p, bool state);

    B2Client *client;
    TQString oldTitle;
    KPixmap titleBuffer;
    TQPoint moveOffset;
    bool set_x11mask;
    bool isfullyobscured;
    bool shift_move;
};

class B2Client : public KDecoration
{
    TQ_OBJECT
    friend class B2Titlebar;
public:
    B2Client(KDecorationBridge *b, KDecorationFactory *f);
    ~B2Client(){;}
    void init();
    void unobscureTitlebar();
    void titleMoveAbs(int new_ofs);
    void titleMoveRel(int xdiff);
    // transparent stuff
    virtual bool drawbound(const TQRect& geom, bool clear);
protected:
    void resizeEvent( TQResizeEvent* );
    void paintEvent( TQPaintEvent* );
    void showEvent( TQShowEvent* );
    void windowWrapperShowEvent( TQShowEvent* );
    void captionChange();
    void desktopChange();
    void shadeChange();
    void activeChange();
    void maximizeChange();
    void iconChange();
    void doShape();
    Position mousePosition( const TQPoint& p ) const;
    void resize(const TQSize&);
    void borders(int &, int &, int &, int &) const;
    TQSize minimumSize() const;
    bool eventFilter(TQObject *, TQEvent *);
private slots:
    void menuButtonPressed();
    //void slotReset();
    void maxButtonClicked();
    void shadeButtonClicked();
    void resizeButtonPressed();
private:
    void addButtons(const TQString& s, const TQString tips[],
                    B2Titlebar* tb, TQBoxLayout* titleLayout);
    void positionButtons();
    void calcHiddenButtons();
    bool mustDrawHandle() const;
    bool isModalSystemNotification();
    
    enum ButtonType{BtnMenu=0, BtnSticky, BtnIconify, BtnMax, BtnClose,
        BtnHelp, BtnShade, BtnResize, BtnCount};
    B2Button* button[BtnCount];
    TQGridLayout *g;
    // Border spacers
    TQSpacerItem *topSpacer; 
    TQSpacerItem *bottomSpacer; 
    TQSpacerItem *leftSpacer;
    TQSpacerItem *rightSpacer;
    B2Titlebar *titlebar;
    int bar_x_ofs;
    int in_unobs;
    TQTime time;
    bool resizable;
};

class B2ClientFactory : public TQObject, public KDecorationFactory
{
public:
    B2ClientFactory();
    virtual ~B2ClientFactory();
    virtual KDecoration *createDecoration(KDecorationBridge *);
    virtual bool reset(unsigned long changed);
    virtual bool supports( Ability ability );
    TQValueList< B2ClientFactory::BorderSize > borderSizes() const;
};

}

#endif