Merge branch 'master' of git://anongit.kde.org/kde-workspace

This commit is contained in:
Dr. Robert Marmorstein 2011-02-06 13:57:17 -05:00
commit 6f695d9a76
7 changed files with 116 additions and 69 deletions

View file

@ -2148,7 +2148,8 @@ void Client::updateAllowedActions(bool force)
return;
// TODO: This could be delayed and compressed - It's only for pagers etc. anyway
info->setAllowedActions(allowed_actions);
// TODO: This should also tell the decoration, so that it can update the buttons
if (decoration)
decoration->reset(KDecoration::SettingButtons);
}
void Client::autoRaise()

View file

@ -152,8 +152,10 @@ void BoxSwitchEffect::paintWindowsBox(const QRegion& region)
{
if ((mAnimateSwitch && !mProxyActivated) || (mProxyActivated && mProxyAnimateSwitch))
thumbnailFrame->setSelection(highlight_area);
else
thumbnailFrame->setSelection(windows[ selected_window ]->area);
else {
ItemInfo *info = windows.value(selected_window, 0);
thumbnailFrame->setSelection(info ? info->area : QRect());
}
thumbnailFrame->render(region);
if ((mAnimateSwitch && !mProxyActivated) || (mProxyActivated && mProxyAnimateSwitch)) {
@ -271,8 +273,9 @@ void BoxSwitchEffect::windowGeometryShapeChanged(EffectWindow* w, const QRect& o
{
if (mActivated) {
if (mMode == TabBoxWindowsMode || mMode == TabBoxWindowsAlternativeMode) {
if (windows.contains(w) && w->size() != old.size()) {
effects->addRepaint(windows[ w ]->area);
ItemInfo *info = windows.value( w, 0L );
if (info && w->size() != old.size()) {
effects->addRepaint(info->area);
}
} else {
if (w->isOnAllDesktops()) {
@ -357,24 +360,25 @@ void BoxSwitchEffect::tabBoxUpdated()
}
}
}
if (windows.contains(selected_window))
effects->addRepaint(windows.value(selected_window)->area);
if (ItemInfo *info = windows.value(selected_window, 0))
effects->addRepaint(info->area);
selected_window->addRepaintFull();
}
setSelectedWindow(effects->currentTabBoxWindow());
if (windows.contains(selected_window))
effects->addRepaint(windows.value(selected_window)->area);
if (ItemInfo *info = windows.value(selected_window, 0))
effects->addRepaint(info->area);
if (selected_window) // @Martin can effects->currentTabBoxWindow() be NULL?
selected_window->addRepaintFull();
effects->addRepaint(text_area);
} else if (mMode != TabBoxWindowsMode && mMode != TabBoxWindowsAlternativeMode) {
// DesktopMode
if (desktops.contains(selected_desktop))
effects->addRepaint(desktops.value(selected_desktop)->area);
if (ItemInfo *info = desktops.value(selected_desktop, 0))
effects->addRepaint(info->area);
selected_desktop = effects->currentTabBoxDesktop();
if (!mProxyActivated || mProxyShowText)
thumbnailFrame->setText(effects->desktopName(selected_desktop));
if (desktops.contains(selected_desktop))
effects->addRepaint(desktops.value(selected_desktop)->area);
if (ItemInfo *info = desktops.value(selected_desktop, 0))
effects->addRepaint(info->area);
effects->addRepaint(text_area);
if (effects->currentTabBoxDesktopList() == original_desktops)
return;
@ -476,12 +480,13 @@ void BoxSwitchEffect::windowClosed(EffectWindow* w)
if (w == selected_window) {
setSelectedWindow(0);
}
if (windows.contains(w)) {
QHash<EffectWindow*, ItemInfo*>::iterator it = windows.find(w);
if (it != windows.end()) {
w->refWindow();
referrencedWindows.append(w);
original_windows.removeAll(w);
delete windows[ w ];
windows.remove(w);
delete *it; *it = 0;
windows.erase( it );
effects->addRepaintFull();
}
}
@ -595,11 +600,13 @@ void BoxSwitchEffect::calculateItemSizes()
if (!ordered_windows.at(i))
continue;
EffectWindow* w = ordered_windows.at(i);
windows[ w ] = new ItemInfo();
ItemInfo *info = windows.value(w, 0);
if (!info)
windows[ w ] = info = new ItemInfo();
windows[ w ]->iconFrame = effects->effectFrame(EffectFrameUnstyled, false);
windows[ w ]->iconFrame->setAlignment(Qt::AlignTop | Qt::AlignLeft);
windows[ w ]->iconFrame->setIcon(w->icon());
info->iconFrame = effects->effectFrame(EffectFrameUnstyled, false);
info->iconFrame->setAlignment(Qt::AlignTop | Qt::AlignLeft);
info->iconFrame->setIcon(w->icon());
float moveIndex = i;
if (animation && timeLine.value() < 0.5) {
@ -610,16 +617,17 @@ void BoxSwitchEffect::calculateItemSizes()
}
if (ordered_windows.count() % 2 == 0)
moveIndex += 0.5;
windows[ w ]->area = QRect(frame_area.x() + moveIndex * item_max_size.width() + offset,
info->area = QRect(frame_area.x() + moveIndex * item_max_size.width() + offset,
frame_area.y(),
item_max_size.width(), item_max_size.height());
windows[ w ]->clickable = windows[ w ]->area;
info->clickable = info->area;
}
if (ordered_windows.count() % 2 == 0) {
right_window = ordered_windows.last();
}
if (!highlight_is_set) {
highlight_area = windows[ selected_window ]->area;
ItemInfo *info = windows.value(selected_window, 0);
highlight_area = info ? info->area : QRect();
highlight_is_set = true;
}
} else {
@ -627,41 +635,46 @@ void BoxSwitchEffect::calculateItemSizes()
if (!original_windows.at(i))
continue;
EffectWindow* w = original_windows.at(i);
windows[ w ] = new ItemInfo();
ItemInfo *info = windows.value(w, 0);
if (!info)
windows[ w ] = info = new ItemInfo();
windows[ w ]->iconFrame = effects->effectFrame(EffectFrameUnstyled, false);
windows[ w ]->iconFrame->setAlignment(Qt::AlignTop | Qt::AlignLeft);
windows[ w ]->iconFrame->setIcon(w->icon());
info->iconFrame = effects->effectFrame(EffectFrameUnstyled, false);
info->iconFrame->setAlignment(Qt::AlignTop | Qt::AlignLeft);
info->iconFrame->setIcon(w->icon());
windows[ w ]->area = QRect(frame_area.x() + i * item_max_size.width(),
info->area = QRect(frame_area.x() + i * item_max_size.width(),
frame_area.y(),
item_max_size.width(), item_max_size.height());
windows[ w ]->clickable = windows[ w ]->area;
info->clickable = info->area;
}
}
} else {
desktops.clear();
for (int i = 0; i < original_desktops.count(); i++) {
int it = original_desktops.at(i);
desktops[ it ] = new ItemInfo();
ItemInfo *info = desktops.value( it, 0 );
if (!info)
desktops[ it ] = info = new ItemInfo();
desktops[ it ]->area = QRect(frame_area.x() + i * item_max_size.width(),
info->area = QRect(frame_area.x() + i * item_max_size.width(),
frame_area.y(),
item_max_size.width(), item_max_size.height());
desktops[ it ]->clickable = desktops[ it ]->area;
info->clickable = info->area;
}
}
}
void BoxSwitchEffect::paintWindowThumbnail(EffectWindow* w)
{
if (!windows.contains(w))
ItemInfo *info = windows.value(w, 0);
if (!info)
return;
WindowPaintData data(w);
setPositionTransformations(data,
windows[ w ]->thumbnail, w,
windows[ w ]->area.adjusted(highlight_margin, highlight_margin, -highlight_margin, -highlight_margin),
info->thumbnail, w,
info->area.adjusted(highlight_margin, highlight_margin, -highlight_margin, -highlight_margin),
Qt::KeepAspectRatio);
if (animation && (w == edge_window) && (windows.size() % 2 == 1)) {
@ -698,7 +711,7 @@ void BoxSwitchEffect::paintWindowThumbnail(EffectWindow* w)
// paint one part of the thumbnail
effects->paintWindow(w,
PAINT_WINDOW_OPAQUE | PAINT_WINDOW_TRANSFORMED | PAINT_WINDOW_LANCZOS,
windows[ w ]->thumbnail, data);
info->thumbnail, data);
QRect secondThumbnail;
@ -733,12 +746,12 @@ void BoxSwitchEffect::paintWindowThumbnail(EffectWindow* w)
}
}
setPositionTransformations(data,
windows[ w ]->thumbnail, w,
info->thumbnail, w,
secondThumbnail.adjusted(highlight_margin, highlight_margin, -highlight_margin, -highlight_margin),
Qt::KeepAspectRatio);
effects->paintWindow(w,
PAINT_WINDOW_OPAQUE | PAINT_WINDOW_TRANSFORMED | PAINT_WINDOW_LANCZOS,
windows[ w ]->thumbnail, data);
info->thumbnail, data);
} else if ((windows.size() % 2 == 0) && (w == right_window)) {
// in case of even number of thumbnails:
// the window on the right is painted one half on left and on half on the right side
@ -779,7 +792,7 @@ void BoxSwitchEffect::paintWindowThumbnail(EffectWindow* w)
data.quads = leftQuads;
effects->drawWindow(w,
PAINT_WINDOW_OPAQUE | PAINT_WINDOW_TRANSFORMED | PAINT_WINDOW_LANCZOS,
windows[ w ]->thumbnail, data);
info->thumbnail, data);
// right quads are painted on left side of frame
data.quads = rightQuads;
@ -788,28 +801,28 @@ void BoxSwitchEffect::paintWindowThumbnail(EffectWindow* w)
(float)item_max_size.width() * 0.5 + animationOffset,
frame_area.y(), item_max_size.width(), item_max_size.height());
setPositionTransformations(data,
windows[ w ]->thumbnail, w,
info->thumbnail, w,
secondThumbnail.adjusted(highlight_margin, highlight_margin, -highlight_margin, -highlight_margin),
Qt::KeepAspectRatio);
effects->drawWindow(w,
PAINT_WINDOW_OPAQUE | PAINT_WINDOW_TRANSFORMED | PAINT_WINDOW_LANCZOS,
windows[ w ]->thumbnail, data);
info->thumbnail, data);
} else {
effects->drawWindow(w,
PAINT_WINDOW_OPAQUE | PAINT_WINDOW_TRANSFORMED | PAINT_WINDOW_LANCZOS,
windows[ w ]->thumbnail, data);
info->thumbnail, data);
}
}
void BoxSwitchEffect::paintDesktopThumbnail(int iDesktop)
{
if (!desktops.contains(iDesktop))
ItemInfo *info = desktops.value(iDesktop, 0);
if (!info)
return;
ScreenPaintData data;
QRect region;
QRect r = desktops[ iDesktop ]->area.adjusted(highlight_margin, highlight_margin,
-highlight_margin, -highlight_margin);
QRect r = info->area.adjusted(highlight_margin, highlight_margin, -highlight_margin, -highlight_margin);
QSize size = QSize(displayWidth(), displayHeight());
size.scale(r.size(), Qt::KeepAspectRatio);
@ -829,7 +842,8 @@ void BoxSwitchEffect::paintDesktopThumbnail(int iDesktop)
void BoxSwitchEffect::paintWindowIcon(EffectWindow* w)
{
if (!windows.contains(w))
ItemInfo *info = windows.value(w, 0);
if (!info)
return;
// Don't render null icons
if (w->icon().isNull()) {
@ -838,24 +852,24 @@ void BoxSwitchEffect::paintWindowIcon(EffectWindow* w)
int width = w->icon().width();
int height = w->icon().height();
int x = windows[ w ]->area.x() + windows[ w ]->area.width() - width - highlight_margin;
int y = windows[ w ]->area.y() + windows[ w ]->area.height() - height - highlight_margin;
int x = info->area.x() + info->area.width() - width - highlight_margin;
int y = info->area.y() + info->area.height() - height - highlight_margin;
if ((windows.size() % 2 == 0)) {
if (w == right_window) {
// in case of right window the icon has to be painted on the left side of the frame
x = frame_area.x() + windows[ w ]->area.width() * 0.5 - width - highlight_margin;
x = frame_area.x() + info->area.width() * 0.5 - width - highlight_margin;
if (animation) {
if (timeLine.value() <= 0.5) {
if (direction == Left) {
x -= windows[ w ]->area.width() * timeLine.value();
x -= info->area.width() * timeLine.value();
x = qMax(x, frame_area.x());
} else
x += windows[ w ]->area.width() * timeLine.value();
x += info->area.width() * timeLine.value();
} else {
if (direction == Left)
x += windows[ w ]->area.width() * (1.0 - timeLine.value());
x += info->area.width() * (1.0 - timeLine.value());
else {
x -= windows[ w ]->area.width() * (1.0 - timeLine.value());
x -= info->area.width() * (1.0 - timeLine.value());
x = qMax(x, frame_area.x());
}
}
@ -866,20 +880,20 @@ void BoxSwitchEffect::paintWindowIcon(EffectWindow* w)
if (animation && w == edge_window) {
if (timeLine.value() < 0.5) {
if (direction == Left)
x += windows[ w ]->area.width() * timeLine.value();
x += info->area.width() * timeLine.value();
else
x -= windows[ w ]->area.width() * timeLine.value();
x -= info->area.width() * timeLine.value();
} else {
if (direction == Left)
x -= windows[ w ]->area.width() * (1.0 - timeLine.value());
x -= info->area.width() * (1.0 - timeLine.value());
else
x += windows[ w ]->area.width() * (1.0 - timeLine.value());
x += info->area.width() * (1.0 - timeLine.value());
}
}
}
windows[ w ]->iconFrame->setPosition(QPoint(x, y));
windows[ w ]->iconFrame->render(infiniteRegion(), 1.0, 0.75);
info->iconFrame->setPosition(QPoint(x, y));
info->iconFrame->render(infiniteRegion(), 1.0, 0.75);
}
void* BoxSwitchEffect::proxy()

View file

@ -32,6 +32,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "resize/resize_config.h"
#include "showfps/showfps_config.h"
#include "thumbnailaside/thumbnailaside_config.h"
#include "windowgeometry/windowgeometry_config.h"
#include "zoom/zoom_config.h"
#ifdef KWIN_HAVE_OPENGL_COMPOSITING
@ -67,6 +68,7 @@ KWIN_EFFECT_CONFIG_MULTIPLE(builtins,
KWIN_EFFECT_CONFIG_SINGLE(showfps, ShowFpsEffectConfig)
KWIN_EFFECT_CONFIG_SINGLE(translucency, TranslucencyEffectConfig)
KWIN_EFFECT_CONFIG_SINGLE(thumbnailaside, ThumbnailAsideEffectConfig)
KWIN_EFFECT_CONFIG_SINGLE(windowgeometry, WindowGeometryConfig)
KWIN_EFFECT_CONFIG_SINGLE(zoom, ZoomEffectConfig)
#ifdef KWIN_HAVE_OPENGL_COMPOSITING

View file

@ -240,6 +240,7 @@ void HighlightWindowEffect::prepareHighlighting()
foreach (EffectWindow * w, effects->stackingOrder())
if (!m_windowOpacity.contains(w)) // Just in case we are still finishing from last time
m_windowOpacity[w] = isInitiallyHidden(w) ? 0.0 : 1.0;
m_highlightedWindows.at(0)->addRepaintFull();
}
void HighlightWindowEffect::finishHighlighting()
@ -247,6 +248,8 @@ void HighlightWindowEffect::finishHighlighting()
m_finishing = true;
m_monitorWindow = NULL;
m_highlightedWindows.clear();
if (!m_windowOpacity.isEmpty())
m_windowOpacity.constBegin().key()->addRepaintFull();
}
} // namespace

View file

@ -318,6 +318,7 @@ void LogoutEffect::windowClosed(EffectWindow* w)
void LogoutEffect::windowDeleted(EffectWindow* w)
{
windows.removeAll(w);
ignoredWindows.removeAll(w);
if (w == logoutWindow)
logoutWindow = NULL;

View file

@ -23,6 +23,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#ifdef KWIN_HAVE_OPENGL
#include "kwinglobals.h"
#include "kwineffects.h"
#include "kwinglplatform.h"
#include "kdebug.h"
#include <kstandarddirs.h>
@ -93,9 +94,10 @@ void initGL()
// Get OpenGL version
QString glversionstring = QString((const char*)glGetString(GL_VERSION));
QStringList glversioninfo = glversionstring.left(glversionstring.indexOf(' ')).split('.');
while (glversioninfo.count() < 3)
glversioninfo << "0";
#ifndef KWIN_HAVE_OPENGLES
glVersion = MAKE_GL_VERSION(glversioninfo[0].toInt(), glversioninfo[1].toInt(),
glversioninfo.count() > 2 ? glversioninfo[2].toInt() : 0);
glVersion = MAKE_GL_VERSION(glversioninfo[0].toInt(), glversioninfo[1].toInt(), glversioninfo[2].toInt());
#endif
// Get list of supported OpenGL extensions
glExtensions = QString((const char*)glGetString(GL_EXTENSIONS)).split(' ');

View file

@ -587,6 +587,13 @@ void SceneOpenGL::flushBuffer(int mask, QRegion damage)
glXCopySubBuffer(display(), glxbuffer, r.x(), y, r.width(), r.height());
}
} else {
// if a shader is bound, copy pixels results in a black screen
// therefore unbind the shader and restore after copying the pixels
GLint shader = 0;
if (ShaderManager::instance()->isShaderBound()) {
glGetIntegerv(GL_CURRENT_PROGRAM, &shader);
glUseProgram(0);
}
// no idea why glScissor() is used, but Compiz has it and it doesn't seem to hurt
glEnable(GL_SCISSOR_TEST);
glDrawBuffer(GL_FRONT);
@ -608,6 +615,10 @@ void SceneOpenGL::flushBuffer(int mask, QRegion damage)
glBitmap(0, 0, 0, 0, -xpos, -ypos, NULL); // move position back to 0,0
glDrawBuffer(GL_BACK);
glDisable(GL_SCISSOR_TEST);
// rebind previously bound shader
if (ShaderManager::instance()->isShaderBound()) {
glUseProgram(shader);
}
}
} else {
waitSync();
@ -640,7 +651,9 @@ void SceneOpenGL::Texture::init()
void SceneOpenGL::Texture::release()
{
if (glxpixmap != None) {
if (!options->glStrictBinding) {
glXReleaseTexImageEXT(display(), glxpixmap, GLX_FRONT_LEFT_EXT);
}
glXDestroyPixmap(display(), glxpixmap);
glxpixmap = None;
}
@ -651,6 +664,17 @@ void SceneOpenGL::Texture::findTarget()
unsigned int new_target = 0;
if (glXQueryDrawable && glxpixmap != None)
glXQueryDrawable(display(), glxpixmap, GLX_TEXTURE_TARGET_EXT, &new_target);
// HACK: this used to be a hack for Xgl.
// without this hack the NVIDIA blob aborts when trying to bind a texture from
// a pixmap icon
if (new_target == 0) {
if (NPOTTextureSupported() ||
(isPowerOfTwo(mSize.width()) && isPowerOfTwo(mSize.height()))) {
new_target = GLX_TEXTURE_2D_EXT;
} else {
new_target = GLX_TEXTURE_RECTANGLE_EXT;
}
}
switch(new_target) {
case GLX_TEXTURE_2D_EXT:
mTarget = GL_TEXTURE_2D;