Use kdrawutil and committing my initial implementation of the kwm theme
compatible style. This isn't done but currently reads most of the entries. It requires you use kwinrc and kdeglobals so kthememgr will need to be updated if you don't want to apply things manually ;-) I also have to add custom cursor positioning and some other small things. Also, KWM used a bitmap to set the mask and I do for now as well. This needs to change into regions as it is *really* inefficent with KWin. For now installing the .desktop for the plugin is disabled. I will provide some screenshots for the curious when I launch mosfet.org ;-) svn path=/trunk/kdebase/kwin/; revision=37503
This commit is contained in:
parent
4e650b8d0f
commit
cb69226b40
7 changed files with 747 additions and 125 deletions
|
@ -1 +1 @@
|
|||
SUBDIRS=be kstep system
|
||||
SUBDIRS=be kstep system kwmtheme
|
||||
|
|
20
clients/kwmtheme/Makefile.am
Normal file
20
clients/kwmtheme/Makefile.am
Normal file
|
@ -0,0 +1,20 @@
|
|||
|
||||
INCLUDES = $(all_includes)
|
||||
|
||||
lib_LTLIBRARIES = libkwinkwmtheme.la
|
||||
|
||||
libkwinkwmtheme_la_SOURCES = kwmthemeclient.cpp
|
||||
|
||||
METASOURCES = AUTO
|
||||
noinst_HEADERS = kwmthemeclient.h
|
||||
|
||||
lnkdir = $(kde_datadir)/kwin/
|
||||
lnk_DATA = #kwmtheme.desktop
|
||||
|
||||
EXTRA_DIST = $(lnk_DATA)
|
||||
|
||||
libkwinkwmtheme_la_LDFLAGS = $(all_libraries) -version-info 1:0:0 -module
|
||||
|
||||
###KMAKE-start (don't edit or delete this block)
|
||||
|
||||
###KMAKE-end
|
3
clients/kwmtheme/kwmtheme.desktop
Normal file
3
clients/kwmtheme/kwmtheme.desktop
Normal file
|
@ -0,0 +1,3 @@
|
|||
[Desktop Entry]
|
||||
Name=KWM Theme
|
||||
X-KDE-Library=libkwinkwmtheme
|
605
clients/kwmtheme/kwmthemeclient.cpp
Normal file
605
clients/kwmtheme/kwmthemeclient.cpp
Normal file
|
@ -0,0 +1,605 @@
|
|||
#include <kconfig.h>
|
||||
#include "kwmthemeclient.h"
|
||||
#include <kglobal.h>
|
||||
#include <kiconloader.h>
|
||||
#include <qapplication.h>
|
||||
#include <qcursor.h>
|
||||
#include <qabstractlayout.h>
|
||||
#include <qlayout.h>
|
||||
#include <qtoolbutton.h>
|
||||
#include <qlabel.h>
|
||||
#include <qdrawutil.h>
|
||||
#include <kpixmapeffect.h>
|
||||
#include <klocale.h>
|
||||
#include <qbitmap.h>
|
||||
#include <qtooltip.h>
|
||||
#include "../../workspace.h"
|
||||
#include "../../options.h"
|
||||
|
||||
extern "C"
|
||||
{
|
||||
Client *allocate(Workspace *ws, WId w)
|
||||
{
|
||||
return(new KWMThemeClient(ws, w));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
enum FramePixmap{FrameTop=0, FrameBottom, FrameLeft, FrameRight, FrameTopLeft,
|
||||
FrameTopRight, FrameBottomLeft, FrameBottomRight};
|
||||
|
||||
static QPixmap *framePixmaps[8];
|
||||
static QPixmap *menuPix, *iconifyPix, *closePix, *maxPix, *minmaxPix,
|
||||
*pinupPix, *pindownPix;
|
||||
static KPixmap *aTitlePix = NULL;
|
||||
static KPixmap *iTitlePix = NULL;
|
||||
static KPixmapEffect::GradientType grType;
|
||||
static int maxExtent, titleAlign;
|
||||
static bool titleGradient = true;
|
||||
static bool pixmaps_created = false;
|
||||
static bool titleSunken = false;
|
||||
static bool titleTransparent;
|
||||
|
||||
extern Options *options;
|
||||
|
||||
static void init_theme()
|
||||
{
|
||||
static char *keys[] = {"wm_top", "wm_bottom", "wm_left", "wm_right",
|
||||
"wm_topleft", "wm_topright", "wm_bottomleft", "wm_bottomright"};
|
||||
|
||||
if(pixmaps_created)
|
||||
return;
|
||||
pixmaps_created = true;
|
||||
|
||||
KIconLoader *ldr = KGlobal::iconLoader();
|
||||
KConfig *config = KGlobal::config();
|
||||
config->setGroup("General");
|
||||
|
||||
int i;
|
||||
for(i=0; i < 8; ++i){
|
||||
framePixmaps[i] = new QPixmap(ldr->loadIcon(keys[i]));
|
||||
if(framePixmaps[i]->isNull())
|
||||
warning("Unable to load frame pixmap for %s", keys[i]);
|
||||
else
|
||||
warning("Loaded pixmap %d", i+1);
|
||||
}
|
||||
maxExtent = framePixmaps[FrameTop]->height();
|
||||
if(framePixmaps[FrameBottom]->height() > maxExtent)
|
||||
maxExtent = framePixmaps[FrameBottom]->height();
|
||||
if(framePixmaps[FrameLeft]->width() > maxExtent)
|
||||
maxExtent = framePixmaps[FrameLeft]->width();
|
||||
if(framePixmaps[FrameRight]->width() > maxExtent)
|
||||
maxExtent = framePixmaps[FrameRight]->width();
|
||||
|
||||
menuPix = new QPixmap(ldr->loadIcon("menu"));
|
||||
iconifyPix = new QPixmap(ldr->loadIcon("iconify"));
|
||||
maxPix = new QPixmap(ldr->loadIcon("maximize"));
|
||||
minmaxPix = new QPixmap(ldr->loadIcon("maximizedown"));
|
||||
closePix = new QPixmap(ldr->loadIcon("close"));
|
||||
pinupPix = new QPixmap(ldr->loadIcon("pinup"));
|
||||
pindownPix = new QPixmap(ldr->loadIcon("pindown"));
|
||||
|
||||
QString tmpStr = config->readEntry("TitleAlignment");
|
||||
if(tmpStr == "right")
|
||||
titleAlign = Qt::AlignRight | Qt::AlignVCenter;
|
||||
else if(tmpStr == "middle")
|
||||
titleAlign = Qt::AlignCenter;
|
||||
else
|
||||
titleAlign = Qt::AlignLeft | Qt::AlignVCenter;
|
||||
titleSunken = config->readBoolEntry("TitleFrameShaded", false);
|
||||
titleTransparent = config->readBoolEntry("PixmapUnderTitleText", true);
|
||||
|
||||
tmpStr = config->readEntry("TitlebarLook");
|
||||
if(tmpStr == "shadedVertical"){
|
||||
aTitlePix = new KPixmap;
|
||||
aTitlePix->resize(32, 20);
|
||||
KPixmapEffect::gradient(*aTitlePix,
|
||||
options->color(Options::TitleBar, true),
|
||||
options->color(Options::TitleBlend, true),
|
||||
KPixmapEffect::VerticalGradient);
|
||||
iTitlePix = new KPixmap;
|
||||
iTitlePix->resize(32, 20);
|
||||
KPixmapEffect::gradient(*iTitlePix,
|
||||
options->color(Options::TitleBar, false),
|
||||
options->color(Options::TitleBlend, false),
|
||||
KPixmapEffect::VerticalGradient);
|
||||
titleGradient = false; // we can just tile this
|
||||
|
||||
}
|
||||
else if(tmpStr == "shadedHorizontal")
|
||||
grType = KPixmapEffect::HorizontalGradient;
|
||||
else if(tmpStr == "shadedDiagonal")
|
||||
grType = KPixmapEffect::DiagonalGradient;
|
||||
else if(tmpStr == "shadedCrossDiagonal")
|
||||
grType = KPixmapEffect::CrossDiagonalGradient;
|
||||
else if(tmpStr == "shadedPyramid")
|
||||
grType = KPixmapEffect::PyramidGradient;
|
||||
else if(tmpStr == "shadedRectangle")
|
||||
grType = KPixmapEffect::RectangleGradient;
|
||||
else if(tmpStr == "shadedPipeCross")
|
||||
grType = KPixmapEffect::PipeCrossGradient;
|
||||
else if(tmpStr == "shadedElliptic")
|
||||
grType = KPixmapEffect::EllipticGradient;
|
||||
else
|
||||
titleGradient = false;
|
||||
}
|
||||
|
||||
void MyButton::drawButtonLabel(QPainter *p)
|
||||
{
|
||||
if(pixmap()){
|
||||
style().drawItem(p, 0, 0, width(), height(), AlignCenter, colorGroup(),
|
||||
true, pixmap(), QString::null);
|
||||
}
|
||||
}
|
||||
|
||||
KWMThemeClient::KWMThemeClient( Workspace *ws, WId w, QWidget *parent,
|
||||
const char *name )
|
||||
: Client( ws, w, parent, name, WResizeNoErase )
|
||||
{
|
||||
init_theme();
|
||||
|
||||
QGridLayout *layout = new QGridLayout(this);
|
||||
layout->addColSpacing(0, maxExtent);
|
||||
layout->addColSpacing(2, maxExtent);
|
||||
|
||||
layout->addRowSpacing(0, maxExtent);
|
||||
|
||||
layout->addItem(new QSpacerItem(1, 1, QSizePolicy::Fixed,
|
||||
QSizePolicy::Expanding));
|
||||
|
||||
layout->addWidget(windowWrapper(), 2, 1);
|
||||
layout->addRowSpacing(3, maxExtent);
|
||||
layout->setRowStretch(2, 10);
|
||||
layout->setColStretch(1, 10);
|
||||
|
||||
QHBoxLayout* hb = new QHBoxLayout;
|
||||
layout->addLayout( hb, 1, 1 );
|
||||
|
||||
KConfig *config = KGlobal::config();
|
||||
config->setGroup("Buttons");
|
||||
QString val;
|
||||
MyButton *btn;
|
||||
int i;
|
||||
static const char *defaultButtons[]={"Menu","Sticky","Off","Iconify",
|
||||
"Maximize","Close"};
|
||||
static const char keyOffsets[]={"ABCDEF"};
|
||||
for(i=0; i < 6; ++i){
|
||||
if(i == 3){
|
||||
titlebar = new QSpacerItem(10, 20, QSizePolicy::Expanding,
|
||||
QSizePolicy::Minimum );
|
||||
hb->addItem( titlebar );
|
||||
}
|
||||
QString key("Button");
|
||||
key += QChar(keyOffsets[i]);
|
||||
val = config->readEntry(key, defaultButtons[i]);
|
||||
if(val == "Menu"){
|
||||
btn = new MyButton(this, "menu");
|
||||
btn->setPixmap(*menuPix);
|
||||
hb->addWidget(btn);
|
||||
btn->setFixedSize(20, 20);
|
||||
}
|
||||
else if(val == "Sticky"){
|
||||
stickyBtn = new MyButton(this, "sticky");
|
||||
stickyBtn->setPixmap(*pinupPix);
|
||||
connect(stickyBtn, SIGNAL( clicked() ), this, SLOT(toggleSticky()));
|
||||
hb->addWidget(stickyBtn);
|
||||
stickyBtn->setFixedSize(20, 20);
|
||||
}
|
||||
else if(val == "Iconify"){
|
||||
btn = new MyButton(this, "iconify");
|
||||
btn->setPixmap(*iconifyPix);
|
||||
connect(btn, SIGNAL(clicked()), this, SLOT(iconify()));
|
||||
hb->addWidget(btn);
|
||||
btn->setFixedSize(20, 20);
|
||||
}
|
||||
else if(val == "Maximize"){
|
||||
maxBtn = new MyButton(this, "max");
|
||||
maxBtn->setPixmap(*maxPix);
|
||||
connect(maxBtn, SIGNAL(clicked()), this, SLOT(maximize()));
|
||||
hb->addWidget(maxBtn);
|
||||
maxBtn->setFixedSize(20, 20);
|
||||
}
|
||||
else if(val == "Close"){
|
||||
btn = new MyButton(this, "close");
|
||||
btn->setPixmap(*closePix);
|
||||
connect(btn, SIGNAL(clicked()), this, SLOT(closeWindow()));
|
||||
hb->addWidget(btn);
|
||||
btn->setFixedSize(20, 20);
|
||||
}
|
||||
else{
|
||||
if(val != "Off")
|
||||
warning("KWin: Unrecognized button value: %s", val.latin1());
|
||||
}
|
||||
}
|
||||
if(titleGradient){
|
||||
aGradient = new KPixmap;
|
||||
iGradient = new KPixmap;
|
||||
}
|
||||
else{
|
||||
aGradient = NULL;
|
||||
iGradient = NULL;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void KWMThemeClient::drawTitle(QPainter &p)
|
||||
{
|
||||
QRect r = titlebar->geometry();
|
||||
|
||||
if(titleSunken){
|
||||
qDrawShadeRect(&p, r, options->colorGroup(Options::Frame, isActive()),
|
||||
true, 1, 0);
|
||||
r.setRect(r.x()+1, r.y()+1, r.width()-2, r.height()-2);
|
||||
}
|
||||
|
||||
KPixmap *fill = isActive() ? aTitlePix : iTitlePix;
|
||||
if(fill)
|
||||
p.drawTiledPixmap(r, *fill);
|
||||
else if(titleGradient){
|
||||
fill = isActive() ? aGradient : iGradient;
|
||||
if(fill->width() != r.width()){
|
||||
fill->resize(r.width(), 20);
|
||||
KPixmapEffect::gradient(*fill,
|
||||
options->color(Options::TitleBar, isActive()),
|
||||
options->color(Options::TitleBlend, isActive()),
|
||||
grType);
|
||||
}
|
||||
p.drawTiledPixmap(r, *fill);
|
||||
}
|
||||
else{
|
||||
p.fillRect(r, options->colorGroup(Options::TitleBar, isActive()).
|
||||
brush(QColorGroup::Button));
|
||||
}
|
||||
p.setFont(options->font(isActive()));
|
||||
p.setPen(options->color(Options::Font, isActive()));
|
||||
p.drawText(r, titleAlign, caption());
|
||||
}
|
||||
|
||||
void KWMThemeClient::resizeEvent( QResizeEvent* e)
|
||||
{
|
||||
Client::resizeEvent( e );
|
||||
doShape();
|
||||
if ( isVisibleToTLW() && !testWFlags( WNorthWestGravity )) {
|
||||
QPainter p( this );
|
||||
QRect t = titlebar->geometry();
|
||||
t.setTop( 0 );
|
||||
QRegion r = rect();
|
||||
r = r.subtract( t );
|
||||
p.setClipRegion( r );
|
||||
p.eraseRect( rect() );
|
||||
}
|
||||
}
|
||||
|
||||
void KWMThemeClient::captionChange( const QString& )
|
||||
{
|
||||
repaint( titlebar->geometry(), false );
|
||||
}
|
||||
|
||||
void KWMThemeClient::paintEvent( QPaintEvent* )
|
||||
{
|
||||
QPainter p;
|
||||
p.begin(this);
|
||||
int x,y;
|
||||
// first the corners
|
||||
int w1 = framePixmaps[FrameTopLeft]->width();
|
||||
int h1 = framePixmaps[FrameTopLeft]->height();
|
||||
if (w1 > width()/2) w1 = width()/2;
|
||||
if (h1 > height()/2) h1 = height()/2;
|
||||
p.drawPixmap(0,0,*(framePixmaps[FrameTopLeft]),
|
||||
0,0, w1, h1);
|
||||
|
||||
int w2 = framePixmaps[FrameTopRight]->width();
|
||||
int h2 = framePixmaps[FrameTopRight]->height();
|
||||
if (w2 > width()/2) w2 = width()/2;
|
||||
if (h2 > height()/2) h2 = height()/2;
|
||||
p.drawPixmap(width()-w2,0,*(framePixmaps[FrameTopRight]),
|
||||
framePixmaps[FrameTopRight]->width()-w2,0,w2, h2);
|
||||
|
||||
int w3 = framePixmaps[FrameBottomLeft]->width();
|
||||
int h3 = framePixmaps[FrameBottomLeft]->height();
|
||||
if (w3 > width()/2) w3 = width()/2;
|
||||
if (h3 > height()/2) h3 = height()/2;
|
||||
p.drawPixmap(0,height()-h3,*(framePixmaps[FrameBottomLeft]),
|
||||
0,framePixmaps[FrameBottomLeft]->height()-h3,w3, h3);
|
||||
|
||||
int w4 = framePixmaps[FrameBottomRight]->width();
|
||||
int h4 = framePixmaps[FrameBottomRight]->height();
|
||||
if (w4 > width()/2) w4 = width()/2;
|
||||
if (h4 > height()/2) h4 = height()/2;
|
||||
p.drawPixmap(width()-w4,height()-h4,*(framePixmaps[FrameBottomRight]),
|
||||
framePixmaps[FrameBottomRight]->width()-w4,
|
||||
framePixmaps[FrameBottomRight]->height()-h4,
|
||||
w4, h4);
|
||||
|
||||
QPixmap pm;
|
||||
QWMatrix m;
|
||||
int n,s,w;
|
||||
//top
|
||||
pm = *(framePixmaps[FrameTop]);
|
||||
|
||||
s = width()-w2-w1;
|
||||
n = s/pm.width();
|
||||
w = n>0?s/n:s;
|
||||
m.reset();
|
||||
m.scale(w/(float)pm.width(), 1);
|
||||
pm = pm.xForm(m);
|
||||
|
||||
x = w1;
|
||||
while (1){
|
||||
if (pm.width() < width()-w2-x){
|
||||
p.drawPixmap(x,maxExtent-pm.height()-1,
|
||||
pm);
|
||||
x += pm.width();
|
||||
}
|
||||
else {
|
||||
p.drawPixmap(x,maxExtent-pm.height()-1,
|
||||
pm,
|
||||
0,0,width()-w2-x,pm.height());
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//bottom
|
||||
pm = *(framePixmaps[FrameBottom]);
|
||||
|
||||
s = width()-w4-w3;
|
||||
n = s/pm.width();
|
||||
w = n>0 ? s/n : s;
|
||||
m.reset();
|
||||
m.scale(w/(float)pm.width(), 1);
|
||||
pm = pm.xForm(m);
|
||||
|
||||
x = w3;
|
||||
while (1){
|
||||
if (pm.width() < width()-w4-x){
|
||||
p.drawPixmap(x,height()-maxExtent+1,pm);
|
||||
x += pm.width();
|
||||
}
|
||||
else {
|
||||
p.drawPixmap(x,height()-maxExtent+1,pm,
|
||||
0,0,width()-w4-x,pm.height());
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//left
|
||||
pm = *(framePixmaps[FrameLeft]);
|
||||
|
||||
s = height()-h3-h1;
|
||||
n = s/pm.height();
|
||||
w = n>0 ? s/n : s;
|
||||
m.reset();
|
||||
m.scale(1, w/(float)pm.height());
|
||||
pm = pm.xForm(m);
|
||||
|
||||
y = h1;
|
||||
while (1){
|
||||
if (pm.height() < height()-h3-y){
|
||||
p.drawPixmap(maxExtent-pm.width()-1, y,
|
||||
pm);
|
||||
y += pm.height();
|
||||
}
|
||||
else {
|
||||
p.drawPixmap(maxExtent-pm.width()-1, y,
|
||||
pm,
|
||||
0,0, pm.width(),
|
||||
height()-h3-y);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//right
|
||||
pm = *(framePixmaps[FrameRight]);
|
||||
|
||||
s = height()-h4-h2;
|
||||
n = s/pm.height();
|
||||
w = n>0 ? s/n : s;
|
||||
m.reset();
|
||||
m.scale(1, w/(float)pm.height());
|
||||
pm = pm.xForm(m);
|
||||
|
||||
y = h2;
|
||||
while (1){
|
||||
if (pm.height() < height()-h4-y){
|
||||
p.drawPixmap(width()-maxExtent+1, y,
|
||||
pm);
|
||||
y += pm.height();
|
||||
}
|
||||
else {
|
||||
p.drawPixmap(width()-maxExtent+1, y,
|
||||
pm,
|
||||
0,0, pm.width(),
|
||||
height()-h4-y);
|
||||
break;
|
||||
}
|
||||
}
|
||||
drawTitle(p);
|
||||
p.end();
|
||||
}
|
||||
|
||||
void KWMThemeClient::doShape()
|
||||
{
|
||||
QBitmap mask(width(), height());
|
||||
mask.fill(color0);
|
||||
QPainter p;
|
||||
p.begin(&mask);
|
||||
p.setBrush(color1);
|
||||
p.setPen(color1);
|
||||
|
||||
int x,y;
|
||||
// first the corners
|
||||
int w1 = framePixmaps[FrameTopLeft]->width();
|
||||
int h1 = framePixmaps[FrameTopLeft]->height();
|
||||
if (w1 > width()/2) w1 = width()/2;
|
||||
if (h1 > height()/2) h1 = height()/2;
|
||||
p.drawPixmap(0,0,*(framePixmaps[FrameTopLeft]->mask()),
|
||||
0,0,w1, h1);
|
||||
int w2 = framePixmaps[FrameTopRight]->width();
|
||||
int h2 = framePixmaps[FrameTopRight]->height();
|
||||
if (w2 > width()/2) w2 = width()/2;
|
||||
if (h2 > height()/2) h2 = height()/2;
|
||||
p.drawPixmap(width()-w2,0,*(framePixmaps[FrameTopRight]->mask()),
|
||||
framePixmaps[FrameTopRight]->width()-w2,0,w2, h2);
|
||||
|
||||
int w3 = framePixmaps[FrameBottomLeft]->width();
|
||||
int h3 = framePixmaps[FrameBottomLeft]->height();
|
||||
if (w3 > width()/2) w3 = width()/2;
|
||||
if (h3 > height()/2) h3 = height()/2;
|
||||
p.drawPixmap(0,height()-h3,*(framePixmaps[FrameBottomLeft]->mask()),
|
||||
0, framePixmaps[FrameBottomLeft]->height()-h3,w3, h3);
|
||||
|
||||
int w4 = framePixmaps[FrameBottomRight]->width();
|
||||
int h4 = framePixmaps[FrameBottomRight]->height();
|
||||
if (w4 > width()/2) w4 = width()/2;
|
||||
if (h4 > height()/2) h4 = height()/2;
|
||||
p.drawPixmap(width()-w4,height()-h4,*(framePixmaps[FrameBottomRight]->mask()),
|
||||
framePixmaps[FrameBottomRight]->width()-w4,
|
||||
framePixmaps[FrameBottomRight]->height()-h4,
|
||||
w4, h4);
|
||||
|
||||
|
||||
QPixmap pm;
|
||||
QWMatrix m;
|
||||
int n,s,w;
|
||||
//top
|
||||
pm = *(framePixmaps[FrameTop]->mask());
|
||||
|
||||
s = width()-w2-w1;
|
||||
n = s/pm.width();
|
||||
w = n>0?s/n:s;
|
||||
m.reset();
|
||||
m.scale(w/(float)pm.width(), 1);
|
||||
pm = pm.xForm(m);
|
||||
|
||||
x = w1;
|
||||
while (1){
|
||||
if (pm.width() < width()-w2-x){
|
||||
p.drawPixmap(x,maxExtent-pm.height()-1,
|
||||
pm);
|
||||
x += pm.width();
|
||||
}
|
||||
else {
|
||||
p.drawPixmap(x,maxExtent-pm.height()-1,
|
||||
pm,
|
||||
0,0,width()-w2-x,pm.height());
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//bottom
|
||||
pm = *(framePixmaps[FrameBottom]->mask());
|
||||
|
||||
s = width()-w4-w3;
|
||||
n = s/pm.width();
|
||||
w = n>0?s/n:s;
|
||||
m.reset();
|
||||
m.scale(w/(float)pm.width(), 1);
|
||||
pm = pm.xForm(m);
|
||||
|
||||
x = w3;
|
||||
while (1){
|
||||
if (pm.width() < width()-w4-x){
|
||||
p.drawPixmap(x,height()-maxExtent+1,pm);
|
||||
x += pm.width();
|
||||
}
|
||||
else {
|
||||
p.drawPixmap(x,height()-maxExtent+1,pm,
|
||||
0,0,width()-w4-x,pm.height());
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//left
|
||||
pm = *(framePixmaps[FrameLeft]->mask());
|
||||
|
||||
s = height()-h3-h1;
|
||||
n = s/pm.height();
|
||||
w = n>0?s/n:s;
|
||||
m.reset();
|
||||
m.scale(1, w/(float)pm.height());
|
||||
pm = pm.xForm(m);
|
||||
|
||||
y = h1;
|
||||
while (1){
|
||||
if (pm.height() < height()-h3-y){
|
||||
p.drawPixmap(maxExtent-pm.width()-1, y,
|
||||
pm);
|
||||
y += pm.height();
|
||||
}
|
||||
else {
|
||||
p.drawPixmap(maxExtent-pm.width()-1, y,
|
||||
pm,
|
||||
0,0, pm.width(),
|
||||
height()-h3-y);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//right
|
||||
pm = *(framePixmaps[FrameRight]->mask());
|
||||
|
||||
s = height()-h4-h2;
|
||||
n = s/pm.height();
|
||||
w = n>0?s/n:s;
|
||||
m.reset();
|
||||
m.scale(1, w/(float)pm.height());
|
||||
pm = pm.xForm(m);
|
||||
|
||||
y = h2;
|
||||
while (1){
|
||||
if (pm.height() < height()-h4-y){
|
||||
p.drawPixmap(width()-maxExtent+1, y,
|
||||
pm);
|
||||
y += pm.height();
|
||||
}
|
||||
else {
|
||||
p.drawPixmap(width()-maxExtent+1, y,
|
||||
pm,
|
||||
0,0, pm.width(),
|
||||
height()-h4-y);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
p.fillRect(maxExtent-1, maxExtent-1, width()-2*maxExtent+2, height()-2*maxExtent+2, color1);
|
||||
|
||||
p.end();
|
||||
setMask(mask);
|
||||
}
|
||||
|
||||
|
||||
void KWMThemeClient::showEvent(QShowEvent *ev)
|
||||
{
|
||||
Client::showEvent(ev);
|
||||
doShape();
|
||||
repaint(false);
|
||||
}
|
||||
|
||||
void KWMThemeClient::windowWrapperShowEvent( QShowEvent* )
|
||||
{
|
||||
doShape();
|
||||
}
|
||||
|
||||
void KWMThemeClient::mouseDoubleClickEvent( QMouseEvent * e )
|
||||
{
|
||||
if (titlebar->geometry().contains( e->pos() ) )
|
||||
setShade( !isShade() );
|
||||
workspace()->requestFocus( this );
|
||||
}
|
||||
|
||||
void KWMThemeClient::stickyChange(bool on)
|
||||
{
|
||||
stickyBtn->setPixmap(on ? *pinupPix : *pindownPix);
|
||||
}
|
||||
|
||||
void KWMThemeClient::maximizeChange(bool m)
|
||||
{
|
||||
maxBtn->setPixmap(m ? *minmaxPix : *maxPix);
|
||||
}
|
||||
|
||||
void KWMThemeClient::init()
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
|
47
clients/kwmtheme/kwmthemeclient.h
Normal file
47
clients/kwmtheme/kwmthemeclient.h
Normal file
|
@ -0,0 +1,47 @@
|
|||
#ifndef __KWMTHEMECLIENT_H
|
||||
#define __KWMTHEMECLIENT_H
|
||||
|
||||
#include <qbutton.h>
|
||||
#include <qtoolbutton.h>
|
||||
#include <kpixmap.h>
|
||||
#include "../../client.h"
|
||||
class QLabel;
|
||||
class QSpacerItem;
|
||||
|
||||
// QToolButton uses a 1 pixel border :P
|
||||
class MyButton : public QToolButton
|
||||
{
|
||||
public:
|
||||
MyButton(QWidget *parent=0, const char *name=0)
|
||||
: QToolButton(parent, name){;}
|
||||
protected:
|
||||
void drawButtonLabel(QPainter *p);
|
||||
};
|
||||
|
||||
class KWMThemeClient : public Client
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
KWMThemeClient( Workspace *ws, WId w, QWidget *parent=0, const char *name=0 );
|
||||
~KWMThemeClient(){;}
|
||||
protected:
|
||||
void doShape();
|
||||
void drawTitle(QPainter &p);
|
||||
void resizeEvent( QResizeEvent* );
|
||||
void paintEvent( QPaintEvent* );
|
||||
void showEvent( QShowEvent* );
|
||||
void windowWrapperShowEvent( QShowEvent* );
|
||||
void mouseDoubleClickEvent( QMouseEvent * );
|
||||
void init();
|
||||
void captionChange( const QString& name );
|
||||
void stickyChange(bool on);
|
||||
void maximizeChange(bool m);
|
||||
private:
|
||||
KPixmap *aGradient, *iGradient;
|
||||
MyButton *maxBtn, *stickyBtn;
|
||||
QSpacerItem *titlebar;
|
||||
};
|
||||
|
||||
|
||||
|
||||
#endif
|
|
@ -7,6 +7,7 @@
|
|||
#include <qlabel.h>
|
||||
#include <qdrawutil.h>
|
||||
#include <kpixmapeffect.h>
|
||||
#include <kdrawutil.h>
|
||||
#include <qbitmap.h>
|
||||
#include "../../workspace.h"
|
||||
#include "../../options.h"
|
||||
|
@ -271,6 +272,10 @@ void SystemClient::captionChange( const QString& )
|
|||
|
||||
void SystemClient::drawRoundFrame(QPainter &p, int x, int y, int w, int h)
|
||||
{
|
||||
kDrawRoundButton(&p, x, y, w, h,
|
||||
options->colorGroup(Options::Frame, isActive()), false);
|
||||
|
||||
/*
|
||||
int x2=x+w-1, y2=y+h-1;
|
||||
QPointArray hPntArray, lPntArray;
|
||||
hPntArray.putPoints(0, 12, x+4,y+1, x+5,y+1, // top left
|
||||
|
@ -297,7 +302,7 @@ void SystemClient::drawRoundFrame(QPainter &p, int x, int y, int w, int h)
|
|||
p.drawLine(x+6, y2-1, x2-6, y2-1);
|
||||
p.drawLine(x2, y+6, x2, y2-6);
|
||||
p.drawLine(x2-1, y+6, x2-1, y2-6);
|
||||
p.drawPoints(lPntArray);
|
||||
p.drawPoints(lPntArray); */
|
||||
}
|
||||
|
||||
void SystemClient::paintEvent( QPaintEvent* )
|
||||
|
@ -351,7 +356,10 @@ void SystemClient::doShape()
|
|||
// using a bunch of QRect lines seems much more efficent than bitmaps or
|
||||
// point arrays
|
||||
|
||||
QRegion mask(QRect(6, 0, width()-12, height()));
|
||||
QRegion mask;
|
||||
kRoundMaskRegion(mask, 0, 0, width(), height());
|
||||
/*
|
||||
(QRect(6, 0, width()-12, height()));
|
||||
mask += QRegion(QRect(5, 1, 1, height()-2)); // left
|
||||
mask += QRegion(QRect(4, 1, 1, height()-2));
|
||||
mask += QRegion(QRect(3, 2, 1, height()-4));
|
||||
|
@ -364,11 +372,8 @@ void SystemClient::doShape()
|
|||
mask += QRegion(QRect(x2-3, 2, 1, height()-4));
|
||||
mask += QRegion(QRect(x2-2, 3, 1, height()-6));
|
||||
mask += QRegion(QRect(x2-1, 4, 1, height()-8));
|
||||
mask += QRegion(QRect(x2, 6, 1, height()-12));
|
||||
|
||||
mask += QRegion(QRect(x2, 6, 1, height()-12)); */
|
||||
setMask(mask);
|
||||
|
||||
|
||||
}
|
||||
|
||||
void SystemClient::showEvent(QShowEvent *ev)
|
||||
|
|
178
stdclient.cpp
178
stdclient.cpp
|
@ -7,6 +7,7 @@
|
|||
#include <qlabel.h>
|
||||
#include <qdrawutil.h>
|
||||
#include <qbitmap.h>
|
||||
#include <kdrawutil.h>
|
||||
#include "workspace.h"
|
||||
#include "options.h"
|
||||
|
||||
|
@ -66,150 +67,91 @@ QPixmap* kwin_get_menu_pix_hack()
|
|||
return menu_pix;
|
||||
}
|
||||
|
||||
/**
|
||||
* Pixmap creation routine that creates full pixmaps out of bitmaps
|
||||
* for each shade and the user defined titlebutton foreground colors. There
|
||||
* is a large amount of QBitmap constructors/copies here since loadFromData
|
||||
* with type XBM doesn't seem to work with QBitmaps, the only way I could get
|
||||
* a load from data is via the constructor :( Matthias, do you know about
|
||||
* this? <mosfet@kde.org>
|
||||
*/
|
||||
static void create_pixmaps()
|
||||
{
|
||||
if ( pixmaps_created )
|
||||
return;
|
||||
pixmaps_created = true;
|
||||
QColorGroup aGrp = options->colorGroup(Options::ButtonFg, true);
|
||||
QColorGroup iGrp = options->colorGroup(Options::ButtonFg, false);
|
||||
|
||||
QPainter pact, pdis;
|
||||
QBitmap bitmap;
|
||||
QColor actHigh = options->color(Options::ButtonFg, true).light(150);
|
||||
QColor actMed = options->color(Options::ButtonFg, true);
|
||||
QColor actLow = options->color(Options::ButtonFg, true).dark(120);
|
||||
QColor disHigh = options->color(Options::ButtonFg, false).light(150);
|
||||
QColor disMed = options->color(Options::ButtonFg, false);
|
||||
QColor disLow = options->color(Options::ButtonFg, false).dark(120);
|
||||
|
||||
QPainter aPainter, iPainter;
|
||||
close_pix = new QPixmap(16, 16);
|
||||
dis_close_pix = new QPixmap(16, 16);
|
||||
pact.begin(close_pix); pdis.begin(dis_close_pix);
|
||||
bitmap = QBitmap(16, 16, close_white_bits, true);
|
||||
bitmap.setMask(bitmap);
|
||||
pact.setPen(actHigh); pdis.setPen(disHigh);
|
||||
pact.drawPixmap(0, 0, bitmap);
|
||||
pdis.drawPixmap(0, 0, bitmap);
|
||||
bitmap = QBitmap(16, 16, close_dgray_bits, true);
|
||||
pact.setPen(actLow); pdis.setPen(disLow);
|
||||
pact.drawPixmap(0, 0, bitmap);
|
||||
pdis.drawPixmap(0, 0, bitmap);
|
||||
pact.end(); pdis.end();
|
||||
bitmap = QBitmap(16, 16, close_mask_bits, true);
|
||||
close_pix->setMask(bitmap); dis_close_pix->setMask(bitmap);
|
||||
aPainter.begin(close_pix); iPainter.begin(dis_close_pix);
|
||||
kColorBitmaps(&aPainter, aGrp, 0, 0, 16, 16, true, close_white_bits,
|
||||
NULL, NULL, close_dgray_bits, NULL, NULL);
|
||||
kColorBitmaps(&iPainter, iGrp, 0, 0, 16, 16, true, close_white_bits,
|
||||
NULL, NULL, close_dgray_bits, NULL, NULL);
|
||||
aPainter.end(); iPainter.end();
|
||||
close_pix->setMask(QBitmap(16, 16, close_mask_bits, true));
|
||||
dis_close_pix->setMask(*close_pix->mask());
|
||||
|
||||
minimize_pix = new QPixmap(16, 16);
|
||||
dis_minimize_pix = new QPixmap(16, 16);
|
||||
pact.begin(minimize_pix); pdis.begin(dis_minimize_pix);
|
||||
bitmap = QBitmap(16, 16, iconify_white_bits, true);
|
||||
bitmap.setMask(bitmap);
|
||||
pact.setPen(actHigh); pdis.setPen(disHigh);
|
||||
pact.drawPixmap(0, 0, bitmap);
|
||||
pdis.drawPixmap(0, 0, bitmap);
|
||||
bitmap = QBitmap(16, 16, iconify_dgray_bits, true);
|
||||
pact.setPen(actLow); pdis.setPen(disLow);
|
||||
pact.drawPixmap(0, 0, bitmap);
|
||||
pdis.drawPixmap(0, 0, bitmap);
|
||||
pact.end(); pdis.end();
|
||||
bitmap = QBitmap(16, 16, iconify_mask_bits, true);
|
||||
minimize_pix->setMask(bitmap); dis_minimize_pix->setMask(bitmap);
|
||||
aPainter.begin(minimize_pix); iPainter.begin(dis_minimize_pix);
|
||||
kColorBitmaps(&aPainter, aGrp, 0, 0, 16, 16, true, iconify_white_bits,
|
||||
NULL, NULL, iconify_dgray_bits, NULL, NULL);
|
||||
kColorBitmaps(&iPainter, iGrp, 0, 0, 16, 16, true, iconify_white_bits,
|
||||
NULL, NULL, iconify_dgray_bits, NULL, NULL);
|
||||
aPainter.end(); iPainter.end();
|
||||
minimize_pix->setMask(QBitmap(16, 16, iconify_mask_bits, true));
|
||||
dis_minimize_pix->setMask(*minimize_pix->mask());
|
||||
|
||||
maximize_pix = new QPixmap(16, 16);
|
||||
dis_maximize_pix = new QPixmap(16, 16);
|
||||
pact.begin(maximize_pix); pdis.begin(dis_maximize_pix);
|
||||
bitmap = QBitmap(16, 16, maximize_white_bits, true);
|
||||
bitmap.setMask(bitmap);
|
||||
pact.setPen(actHigh); pdis.setPen(disHigh);
|
||||
pact.drawPixmap(0, 0, bitmap);
|
||||
pdis.drawPixmap(0, 0, bitmap);
|
||||
bitmap = QBitmap(16, 16, maximize_dgray_bits, true);
|
||||
pact.setPen(actLow); pdis.setPen(disLow);
|
||||
pact.drawPixmap(0, 0, bitmap);
|
||||
pdis.drawPixmap(0, 0, bitmap);
|
||||
pact.end(); pdis.end();
|
||||
bitmap = QBitmap(16, 16, maximize_mask_bits, true);
|
||||
maximize_pix->setMask(bitmap); dis_maximize_pix->setMask(bitmap);
|
||||
aPainter.begin(maximize_pix); iPainter.begin(dis_maximize_pix);
|
||||
kColorBitmaps(&aPainter, aGrp, 0, 0, 16, 16, true, maximize_white_bits,
|
||||
NULL, NULL, maximize_dgray_bits, NULL, NULL);
|
||||
kColorBitmaps(&iPainter, iGrp, 0, 0, 16, 16, true, maximize_white_bits,
|
||||
NULL, NULL, maximize_dgray_bits, NULL, NULL);
|
||||
aPainter.end(); iPainter.end();
|
||||
maximize_pix->setMask(QBitmap(16, 16, maximize_mask_bits, true));
|
||||
dis_maximize_pix->setMask(*maximize_pix->mask());
|
||||
|
||||
normalize_pix = new QPixmap(16, 16);
|
||||
dis_normalize_pix = new QPixmap(16, 16);
|
||||
pact.begin(normalize_pix); pdis.begin(dis_normalize_pix);
|
||||
bitmap = QBitmap(16, 16, maximizedown_white_bits, true);
|
||||
bitmap.setMask(bitmap);
|
||||
pact.setPen(actHigh); pdis.setPen(disHigh);
|
||||
pact.drawPixmap(0, 0, bitmap);
|
||||
pdis.drawPixmap(0, 0, bitmap);
|
||||
bitmap = QBitmap(16, 16, maximizedown_dgray_bits, true);
|
||||
pact.setPen(actLow); pdis.setPen(disLow);
|
||||
pact.drawPixmap(0, 0, bitmap);
|
||||
pdis.drawPixmap(0, 0, bitmap);
|
||||
pact.end(); pdis.end();
|
||||
bitmap = QBitmap(16, 16, maximizedown_mask_bits, true);
|
||||
normalize_pix->setMask(bitmap); dis_normalize_pix->setMask(bitmap);
|
||||
aPainter.begin(normalize_pix); iPainter.begin(dis_normalize_pix);
|
||||
kColorBitmaps(&aPainter, aGrp, 0, 0, 16, 16, true, maximizedown_white_bits,
|
||||
NULL, NULL, maximizedown_dgray_bits, NULL, NULL);
|
||||
kColorBitmaps(&iPainter, iGrp, 0, 0, 16, 16, true, maximizedown_white_bits,
|
||||
NULL, NULL, maximizedown_dgray_bits, NULL, NULL);
|
||||
aPainter.end(); iPainter.end();
|
||||
normalize_pix->setMask(QBitmap(16, 16, maximizedown_mask_bits, true));
|
||||
dis_normalize_pix->setMask(*normalize_pix->mask());
|
||||
|
||||
menu_pix = new QPixmap(16, 16);
|
||||
dis_menu_pix = new QPixmap(16, 16);
|
||||
pact.begin(menu_pix); pdis.begin(dis_menu_pix);
|
||||
bitmap = QBitmap(16, 16, menu_white_bits, true);
|
||||
bitmap.setMask(bitmap);
|
||||
pact.setPen(actHigh); pdis.setPen(disHigh);
|
||||
pact.drawPixmap(0, 0, bitmap);
|
||||
pdis.drawPixmap(0, 0, bitmap);
|
||||
bitmap = QBitmap(16, 16, menu_dgray_bits, true);
|
||||
pact.setPen(actLow); pdis.setPen(disLow);
|
||||
pact.drawPixmap(0, 0, bitmap);
|
||||
pdis.drawPixmap(0, 0, bitmap);
|
||||
pact.end(); pdis.end();
|
||||
bitmap = QBitmap(16, 16, menu_mask_bits, true);
|
||||
menu_pix->setMask(bitmap); dis_menu_pix->setMask(bitmap);
|
||||
aPainter.begin(menu_pix); iPainter.begin(dis_menu_pix);
|
||||
kColorBitmaps(&aPainter, aGrp, 0, 0, 16, 16, true, menu_white_bits,
|
||||
NULL, NULL, menu_dgray_bits, NULL, NULL);
|
||||
kColorBitmaps(&iPainter, iGrp, 0, 0, 16, 16, true, menu_white_bits,
|
||||
NULL, NULL, menu_dgray_bits, NULL, NULL);
|
||||
aPainter.end(); iPainter.end();
|
||||
menu_pix->setMask(QBitmap(16, 16, menu_mask_bits, true));
|
||||
dis_menu_pix->setMask(*menu_pix->mask());
|
||||
|
||||
pinup_pix = new QPixmap(16, 16);
|
||||
dis_pinup_pix = new QPixmap(16, 16);
|
||||
pact.begin(pinup_pix); pdis.begin(dis_pinup_pix);
|
||||
bitmap = QBitmap(16, 16, pinup_white_bits, true);
|
||||
bitmap.setMask(bitmap);
|
||||
pact.setPen(actHigh); pdis.setPen(disHigh);
|
||||
pact.drawPixmap(0, 0, bitmap);
|
||||
pdis.drawPixmap(0, 0, bitmap);
|
||||
bitmap = QBitmap(16, 16, pinup_gray_bits, true);
|
||||
pact.setPen(actMed); pdis.setPen(disMed);
|
||||
pact.drawPixmap(0, 0, bitmap);
|
||||
pdis.drawPixmap(0, 0, bitmap);
|
||||
bitmap = QBitmap(16, 16, pinup_dgray_bits, true);
|
||||
bitmap.setMask(bitmap);
|
||||
pact.setPen(actLow); pdis.setPen(disLow);
|
||||
pact.drawPixmap(0, 0, bitmap);
|
||||
pdis.drawPixmap(0, 0, bitmap);
|
||||
pact.end(); pdis.end();
|
||||
bitmap = QBitmap(16, 16, pinup_mask_bits, true);
|
||||
pinup_pix->setMask(bitmap); dis_pinup_pix->setMask(bitmap);
|
||||
aPainter.begin(pinup_pix); iPainter.begin(dis_pinup_pix);
|
||||
kColorBitmaps(&aPainter, aGrp, 0, 0, 16, 16, true, pinup_white_bits,
|
||||
pinup_gray_bits, NULL, pinup_dgray_bits, NULL, NULL);
|
||||
kColorBitmaps(&iPainter, iGrp, 0, 0, 16, 16, true, pinup_white_bits,
|
||||
pinup_gray_bits, NULL, pinup_dgray_bits, NULL, NULL);
|
||||
aPainter.end(); iPainter.end();
|
||||
pinup_pix->setMask(QBitmap(16, 16, pinup_mask_bits, true));
|
||||
dis_pinup_pix->setMask(*pinup_pix->mask());
|
||||
|
||||
pindown_pix = new QPixmap(16, 16);
|
||||
dis_pindown_pix = new QPixmap(16, 16);
|
||||
pact.begin(pindown_pix); pdis.begin(dis_pindown_pix);
|
||||
bitmap = QBitmap(16, 16, pindown_white_bits, true);
|
||||
bitmap.setMask(bitmap);
|
||||
pact.setPen(actHigh); pdis.setPen(disHigh);
|
||||
pact.drawPixmap(0, 0, bitmap);
|
||||
pdis.drawPixmap(0, 0, bitmap);
|
||||
bitmap = QBitmap(16, 16, pindown_gray_bits, true);
|
||||
pact.setPen(actMed); pdis.setPen(disMed);
|
||||
pact.drawPixmap(0, 0, bitmap);
|
||||
pdis.drawPixmap(0, 0, bitmap);
|
||||
bitmap = QBitmap(16, 16, pindown_dgray_bits, true);
|
||||
bitmap.setMask(bitmap);
|
||||
pact.setPen(actLow); pdis.setPen(disLow);
|
||||
pact.drawPixmap(0, 0, bitmap);
|
||||
pdis.drawPixmap(0, 0, bitmap);
|
||||
pact.end(); pdis.end();
|
||||
bitmap = QBitmap(16, 16, pindown_mask_bits, true);
|
||||
pindown_pix->setMask(bitmap); dis_pindown_pix->setMask(bitmap);
|
||||
aPainter.begin(pindown_pix); iPainter.begin(dis_pindown_pix);
|
||||
kColorBitmaps(&aPainter, aGrp, 0, 0, 16, 16, true, pindown_white_bits,
|
||||
pindown_gray_bits, NULL, pindown_dgray_bits, NULL, NULL);
|
||||
kColorBitmaps(&iPainter, iGrp, 0, 0, 16, 16, true, pindown_white_bits,
|
||||
pindown_gray_bits, NULL, pindown_dgray_bits, NULL, NULL);
|
||||
aPainter.end(); iPainter.end();
|
||||
pindown_pix->setMask(QBitmap(16, 16, pindown_mask_bits, true));
|
||||
dis_pindown_pix->setMask(*pindown_pix->mask());
|
||||
|
||||
question_mark_pix = new QPixmap(question_mark );
|
||||
|
||||
|
|
Loading…
Reference in a new issue