Merge branch 'master' into frameworks-scratch

Conflicts:
	CMakeLists.txt
	kwin/client.cpp
	kwin/effects/highlightwindow/highlightwindow.cpp
	kwin/libkwineffects/kwingltexture.cpp
	kwin/libkwineffects/kwinxrenderutils.cpp
	kwin/scene_opengl.cpp
	kwin/workspace.cpp
	plasma/desktop/applets/kickoff/CMakeLists.txt
	plasma/desktop/applets/taskmanager/package/contents/code/tools.js
	plasma/desktop/applets/taskmanager/package/contents/ui/Task.qml
	plasma/desktop/applets/taskmanager/package/contents/ui/main.qml
	plasma/desktop/applets/taskmanager/package/metadata.desktop
	plasma/desktop/applets/taskmanager/plugin/textlabel.h
	plasma/desktop/applets/tasks/CMakeLists.txt
	plasma/desktop/applets/tasks/package/metadata.desktop
	plasma/desktop/applets/tasks/tasks.cpp
	plasma/desktop/toolboxes/plasma-toolbox-desktoptoolbox.desktop
	plasma/generic/applets/activitybar/activitybar.cpp
	plasma/generic/wallpapers/color/plasma-wallpaper-color.desktop
	plasma/generic/wallpapers/image/plasma-wallpaper-image.desktop
icc-effect-5.14.5
Martin Gräßlin 2013-09-24 11:28:38 +02:00
commit 969e6b85e7
59 changed files with 301 additions and 116 deletions

View File

@ -352,6 +352,9 @@ void Client::destroyClient()
void Client::updateInputWindow()
{
if (!Xcb::Extensions::self()->isShapeInputAvailable())
return;
QRegion region;
if (!noBorder()) {

View File

@ -12,6 +12,7 @@ Comment[de]=KWin-Fensterdekoration
Comment[el]=Διακοσμήσεις παραθύρου KWin
Comment[es]=Decoración de ventanas de KWin
Comment[et]=KWini akna dekoratsioon
Comment[eu]=KWin leihoen apaingarriak
Comment[fi]=KWin-ikkunakoristus
Comment[fr]=Décorations de fenêtres KWin
Comment[ga]=Maisiúchán Fuinneog KWin

View File

@ -271,6 +271,7 @@ Decoration {
}
Text {
id: caption
textFormat: Text.PlainText
anchors {
top: parent.top
left: leftButtonGroup.right

View File

@ -98,6 +98,7 @@ Comment[de]=Das klassische Design aus KDE 3
Comment[el]=Το γνωστό κλασικό θέμα από το KDE 3
Comment[es]=El tema clásico conocido desde KDE 3
Comment[et]=Klassikaline KDE 3 ajast tuntud teema
Comment[eu]=KDE 3tik ezaguna den gai klasikoa
Comment[fi]=KDE 3:sta tuttu klassinen teema
Comment[fr]=Le thème classique connu depuis KDE 3
Comment[gl]=O tema clásico de KDE 3

View File

@ -961,7 +961,7 @@ void Toplevel::addDamageFull()
return;
damage_region = rect();
repaints_region = rect();
repaints_region |= rect();
emit damaged(this, rect());
}

View File

@ -227,13 +227,15 @@ void X11Cursor::doStopCursorTracking()
void X11Cursor::mousePolled()
{
const QPoint last = currentPos();
const uint16_t lastMask = m_buttonMask;
static QPoint lastPos = currentPos();
static uint16_t lastMask = m_buttonMask;
doGetPos(); // Update if needed
if (last != currentPos() || lastMask != m_buttonMask) {
emit mouseChanged(currentPos(), last,
if (lastPos != currentPos() || lastMask != m_buttonMask) {
emit mouseChanged(currentPos(), lastPos,
x11ToQtMouseButtons(m_buttonMask), x11ToQtMouseButtons(lastMask),
x11ToQtKeyboardModifiers(m_buttonMask), x11ToQtKeyboardModifiers(lastMask));
lastPos = currentPos();
lastMask = m_buttonMask;
}
}

View File

@ -1023,7 +1023,7 @@ int EffectsHandlerImpl::displayWidth() const
int EffectsHandlerImpl::displayHeight() const
{
return KWin::displayWidth();
return KWin::displayHeight();
}
EffectWindow* EffectsHandlerImpl::findWindow(WId id) const

View File

@ -123,6 +123,7 @@ CubeEffect::CubeEffect()
connect(effects, SIGNAL(tabBoxAdded(int)), this, SLOT(slotTabBoxAdded(int)));
connect(effects, SIGNAL(tabBoxClosed()), this, SLOT(slotTabBoxClosed()));
connect(effects, SIGNAL(tabBoxUpdated()), this, SLOT(slotTabBoxUpdated()));
connect(effects, SIGNAL(screenGeometryChanged(const QSize&)), this, SLOT(slotResetShaders()));
reconfigure(ReconfigureAll);
}
@ -290,6 +291,14 @@ void CubeEffect::slotWallPaperLoaded()
watcher->deleteLater();
}
void CubeEffect::slotResetShaders()
{
ShaderManager::instance()->resetShader(m_capShader, ShaderManager::GenericShader);
ShaderManager::instance()->resetShader(m_reflectionShader, ShaderManager::GenericShader);
ShaderManager::instance()->resetShader(cylinderShader, ShaderManager::GenericShader);
ShaderManager::instance()->resetShader(sphereShader, ShaderManager::GenericShader);
}
bool CubeEffect::loadShader()
{
if (!(GLPlatform::instance()->supports(GLSL) &&

View File

@ -136,6 +136,7 @@ private Q_SLOTS:
void slotTabBoxClosed();
void slotCubeCapLoaded();
void slotWallPaperLoaded();
void slotResetShaders();
private:
enum RotationDirection {
Left,

View File

@ -51,11 +51,14 @@ DashboardEffect::~DashboardEffect()
void DashboardEffect::reconfigure(ReconfigureFlags)
{
DashboardConfig::self()->readConfig();
brightness = DashboardConfig::brightness()/ 100.0;
saturation = DashboardConfig::saturation()/ 100.0;
blur = DashboardConfig::blur();
timeline.setDuration(animationTime<DashboardConfig>(500));
if (transformWindow)
effects->addRepaintFull();
}
void DashboardEffect::paintWindow(EffectWindow* w, int mask, QRegion region, WindowPaintData& data)

View File

@ -33,7 +33,7 @@
</widget>
</item>
<item row="4" column="0" colspan="3">
<widget class="QCheckBox" name="kcfg_DimGroup">
<widget class="QCheckBox" name="kcfg_DimByGroup">
<property name="text">
<string>Apply effect to &amp;groups</string>
</property>
@ -104,7 +104,7 @@
<tabstop>kcfg_Strength</tabstop>
<tabstop>kcfg_DimPanels</tabstop>
<tabstop>kcfg_DimDesktop</tabstop>
<tabstop>kcfg_DimGroup</tabstop>
<tabstop>kcfg_DimByGroup</tabstop>
</tabstops>
<resources/>
<connections>

View File

@ -109,12 +109,15 @@ void HighlightWindowEffect::slotWindowAdded(EffectWindow* w)
{
if (!m_highlightedWindows.isEmpty()) {
// The effect is activated thus we need to add it to the opacity hash
if (w->isNormalWindow() || w->isDialog()) // Only fade out windows
m_windowOpacity[w] = isInitiallyHidden(w) ? 0.0 : 0.15;
else
m_windowOpacity[w] = 1.0;
foreach (const WId id, m_highlightedIds) {
if (w == effects->findWindow(id)) {
m_windowOpacity[w] = 1.0; // this window was demanded to be highlighted before it appeared
return;
}
}
m_windowOpacity[w] = 0.15; // this window is not currently highlighted
}
slotPropertyNotify(w, m_atom); // Check initial value
slotPropertyNotify(w, m_atom, w); // Check initial value
}
void HighlightWindowEffect::slotWindowClosed(EffectWindow* w)
@ -128,7 +131,7 @@ void HighlightWindowEffect::slotWindowDeleted(EffectWindow* w)
m_windowOpacity.remove(w);
}
void HighlightWindowEffect::slotPropertyNotify(EffectWindow* w, long a)
void HighlightWindowEffect::slotPropertyNotify(EffectWindow* w, long a, EffectWindow *addedWindow)
{
if (a != m_atom)
return; // Not our atom
@ -138,7 +141,8 @@ void HighlightWindowEffect::slotPropertyNotify(EffectWindow* w, long a)
effects->readRootProperty(m_atom, m_atom, 32);
if (byteData.length() < 1) {
// Property was removed, clearing highlight
finishHighlighting();
if (!addedWindow || w != addedWindow)
finishHighlighting();
return;
}
long* data = reinterpret_cast<long*>(byteData.data());
@ -154,11 +158,13 @@ void HighlightWindowEffect::slotPropertyNotify(EffectWindow* w, long a)
//foreach ( EffectWindow* e, m_highlightedWindows )
// effects->setElevatedWindow( e, false );
m_highlightedWindows.clear();
m_highlightedIds.clear();
for (int i = 0; i < length; i++) {
m_highlightedIds << data[i];
EffectWindow* foundWin = effects->findWindow(data[i]);
if (!foundWin) {
qDebug() << "Invalid window targetted for highlight. Requested:" << data[i];
continue;
continue; // might come in later.
}
m_highlightedWindows.append(foundWin);
// TODO: We cannot just simply elevate the window as this will elevate it over

View File

@ -42,7 +42,7 @@ public Q_SLOTS:
void slotWindowAdded(KWin::EffectWindow* w);
void slotWindowClosed(KWin::EffectWindow *w);
void slotWindowDeleted(KWin::EffectWindow *w);
void slotPropertyNotify(KWin::EffectWindow* w, long atom);
void slotPropertyNotify(KWin::EffectWindow* w, long atom, EffectWindow *addedWindow = NULL);
private:
void prepareHighlighting();
@ -56,6 +56,7 @@ private:
long m_atom;
QList<EffectWindow*> m_highlightedWindows;
EffectWindow* m_monitorWindow;
QList<WId> m_highlightedIds;
// Offscreen position cache
/*QRect m_thumbArea; // Thumbnail area

View File

@ -59,6 +59,7 @@ InvertEffect::InvertEffect()
connect(b, SIGNAL(triggered(bool)), this, SLOT(toggleWindow()));
connect(effects, SIGNAL(windowClosed(KWin::EffectWindow*)), this, SLOT(slotWindowClosed(KWin::EffectWindow*)));
connect(effects, SIGNAL(screenGeometryChanged(const QSize&)), this, SLOT(resetShader()));
}
InvertEffect::~InvertEffect()
@ -178,6 +179,11 @@ bool InvertEffect::provides(Feature f)
return f == ScreenInversion;
}
void InvertEffect::resetShader()
{
ShaderManager::instance()->resetShader(m_shader, ShaderManager::GenericShader);
}
} // namespace
#include "invert.moc"

View File

@ -54,6 +54,9 @@ public Q_SLOTS:
void toggleWindow();
void slotWindowClosed(KWin::EffectWindow *w);
private Q_SLOTS:
void resetShader();
protected:
bool loadData();

View File

@ -7,6 +7,7 @@ Name[da]=KScreen
Name[de]=Kscreen
Name[el]=Kscreen
Name[es]=Kscreen
Name[eu]=Kscreen
Name[fi]=KScreen
Name[fr]=KScreen
Name[gl]=KScreen
@ -15,8 +16,10 @@ Name[ia]=Kscreen
Name[it]=Kscreen
Name[kk]=Kscreen
Name[ko]=Kscreen
Name[nb]=Kscreen
Name[nl]=Kscreen
Name[pa]=ਕੇਸਕਰੀਨ
Name[pl]=Kscreen
Name[pt]=Kscreen
Name[pt_BR]=KScreen
Name[ru]=Kscreen
@ -40,6 +43,7 @@ Comment[cs]=Pomocný efekt pro KScreen
Comment[da]=Hjælpeeffekt til KScreen
Comment[de]=Hilfseffekt für KScreen
Comment[es]=Efecto auxiliar para KScreen
Comment[eu]=KScreen-entzako efektu laguntzailea
Comment[fi]=Avustajatehoste KScreenille
Comment[fr]=Effet d'assistance pour KScreen
Comment[gl]=Efecto auxiliar para KScreen.
@ -48,8 +52,10 @@ Comment[ia]=Effecto de adjutante pro KScreen
Comment[it]=Effetto di assistenza per KScreen
Comment[kk]=KScreen-нің көмек эффекті
Comment[ko]=KScreen 도우미 효과
Comment[nb]=Hjelpereffekt for KScreen
Comment[nl]=Effect van hulp voor KScreen
Comment[pa]=ਕੇਸਕਰੀਨ ਲਈ ਮੱਦਦ ਪ੍ਰਭਾਵ
Comment[pl]=Efekt pomocniczy dla KScreen
Comment[pt]=Efeito auxiliar do KScreen
Comment[pt_BR]=Efeito auxiliar do KScreen
Comment[ru]=Вспомогательный эффект для KScreen

View File

@ -49,6 +49,7 @@ Name[de]=Maximieren
Name[el]=Μεγιστοποίηση
Name[es]=Maximizar
Name[et]=Maksimeerimine
Name[eu]=Maximizatu
Name[fi]=Suurentaminen
Name[fr]=Maximiser
Name[ga]=Uasmhéadaigh

View File

@ -9,6 +9,7 @@ Name[de]=Animation für Mausklicks
Name[el]=Εφέ κίνησης με κλικ του ποντικιού
Name[es]=Animación del clic de ratón
Name[et]=Hiireklõpsu animeerimine
Name[eu]=Sagu-klikaren animazioa
Name[fi]=Hiiren napsautuksen animointi
Name[fr]=Animation du clic de la souris
Name[gl]=Animación ao premer o rato
@ -52,6 +53,7 @@ Comment[de]=Erzeugt bei jedem Mausklick eine Animation. Dies ist sinnvoll für B
Comment[el]=Σχηματίζει εφέ κίνησης όποτε γίνεται κλικ σε κουμπί του ποντικιού. Αυτό είναι χρήσιμο για βιντεοσκόπηση οθόνης / παρουσιάσεις.
Comment[es]=Crea una animación cada vez que se pulsa un botón del ratón. Esto resulta útil para las grabaciones de pantalla y para las presentaciones.
Comment[et]=Animatsiooni loomine hiirenupu klõpsamise peale. See on kasulik näiteks ekraanisalvestuste või esitluste jaoks.
Comment[eu]=Animazio bat sortzen du saguaren botoi bat klikatzen den bakoitzean. Erabilgarria da pantailaren grabaziorako/aurkezpenetarako.
Comment[fi]=Näyttää animoinnin hiirtä napsautettaessa. Tästä on hyötyä näyttötallennuksissa ja esityksissä.
Comment[fr]=Crée une animation associé à un clic sur un bouton de la souris. Ceci est utile pour les enregistrement d'écran ou les présentations.
Comment[gl]=Crea unha animación cando se preme no botón do rato. Isto é útil nas presentacións e nas gravacións da pantalla.

View File

@ -16,6 +16,7 @@ Name[de]=Animation für Mausklicks
Name[el]=Εφέ κίνησης με κλικ του ποντικιού
Name[es]=Animación del clic de ratón
Name[et]=Hiireklõpsu animeerimine
Name[eu]=Sagu-klikaren animazioa
Name[fi]=Hiiren napsautuksen animointi
Name[fr]=Animation du clic de la souris
Name[gl]=Animación ao premer o rato

View File

@ -26,7 +26,7 @@ var scaleInEffect = {
},
isScaleWindow: function (window) {
"use strict";
if (window.popupMenu || window.specialWindow || window.utility ||
if (window.popupMenu || window.specialWindow || window.utility || window.minimized ||
effect.isGrabbed(window, Effect.WindowAddedGrabRole)) {
return false;
}

View File

@ -7,6 +7,7 @@ Name[da]=Skærmkant
Name[de]=Bildschirmkante
Name[el]=Άκρο οθόνης
Name[es]=Borde de la pantalla
Name[eu]=Pantailaren ertza
Name[fi]=Näytön reuna
Name[fr]=Bord de l'écran
Name[gl]=Beira da pantalla
@ -46,6 +47,7 @@ Comment[da]=Fremhæver en skærmkant når den nærmer sig
Comment[de]=Bildschirmkante bei Annäherung hervorheben
Comment[el]=Εμφανίζει τονισμένο το άκρο της οθόνης όταν το πλησιάζετε
Comment[es]=Resalta el borde de la pantalla al aproximarse a él
Comment[eu]=Pantailaren ertz bat nabarmentzen du hurbiltzerakoan
Comment[fi]=Korostaa näytön reunaa sitä lähestyttäessä
Comment[fr]=Mettre en valeur le bord de l'écran à l'approche
Comment[gl]=Realza unha beira da pantalla cando se aproxima

View File

@ -155,8 +155,15 @@ void WindowGeometry::slotWindowStepUserMovedResized(EffectWindow *w, const QRect
myExtraDirtyArea = QRect();
myCurrentGeometry = geometry;
QPoint center = geometry.center();
const QRect &r = geometry;
const QRect &r2 = myOriginalGeometry;
const QRect screen = effects->clientArea(ScreenArea, center, w->desktop());
QRect expandedGeometry = w->expandedGeometry();
expandedGeometry = geometry.adjusted(expandedGeometry.x() - w->x(),
expandedGeometry.y() - w->y(),
expandedGeometry.right() - w->geometry().right(),
expandedGeometry.bottom() - w->geometry().bottom());
// sufficient for moves, resizes calculated otherwise
int dx = r.x() - r2.x();
@ -167,7 +174,9 @@ void WindowGeometry::slotWindowStepUserMovedResized(EffectWindow *w, const QRect
myMeasure[0]->setText( i18nc(myCoordString_1, r.x(), r.y(), number(dx), number(dy) ) );
else
myMeasure[0]->setText( i18nc(myCoordString_0, r.x(), r.y() ) );
myMeasure[0]->setPosition(w->expandedGeometry().topLeft() + QPoint(6,6)); // "6" is magic number because the unstyled effectframe has 5px padding
QPoint pos = expandedGeometry.topLeft();
pos = QPoint(qMax(pos.x(), screen.x()), qMax(pos.y(), screen.y()));
myMeasure[0]->setPosition(pos + QPoint(6,6)); // "6" is magic number because the unstyled effectframe has 5px padding
// center ----------------------
if (w->isUserResize()) {
@ -188,15 +197,22 @@ void WindowGeometry::slotWindowStepUserMovedResized(EffectWindow *w, const QRect
dy = r.bottom() - r2.bottom();
} else
myMeasure[1]->setText( i18nc(myCoordString_0, number(dx), number(dy) ) );
myMeasure[1]->setPosition(geometry.center());
const int cdx = myMeasure[1]->geometry().width() / 2 + 3; // "3" = 6/2 is magic number because
const int cdy = myMeasure[1]->geometry().height() / 2 + 3; // the unstyled effectframe has 5px padding
center = QPoint(qMax(center.x(), screen.x() + cdx),
qMax(center.y(), screen.y() + cdy));
center = QPoint(qMin(center.x(), screen.right() - cdx),
qMin(center.y(), screen.bottom() - cdy));
myMeasure[1]->setPosition(center);
// lower right ----------------------
if (w->isUserResize())
myMeasure[2]->setText( i18nc(myCoordString_1, r.right(), r.bottom(), number(dx), number(dy) ) );
else
myMeasure[2]->setText( i18nc(myCoordString_0, r.right(), r.bottom() ) );
myMeasure[2]->setPosition(w->expandedGeometry().bottomRight() - QPoint(6,6)); // "6" is magic number because the unstyled effectframe has 5px padding
pos = expandedGeometry.bottomRight();
pos = QPoint(qMin(pos.x(), screen.right()), qMin(pos.y(), screen.bottom()));
myMeasure[2]->setPosition(pos - QPoint(6,6)); // "6" is magic number because the unstyled effectframe has 5px padding
myExtraDirtyArea |= myMeasure[0]->geometry();
myExtraDirtyArea |= myMeasure[1]->geometry();

View File

@ -177,7 +177,6 @@ bool EglOnXBackend::initRenderingContext()
const EGLint context_attribs_31_core[] = {
EGL_CONTEXT_MAJOR_VERSION_KHR, 3,
EGL_CONTEXT_MINOR_VERSION_KHR, 1,
EGL_CONTEXT_FLAGS_KHR, EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE_BIT_KHR,
EGL_NONE
};

View File

@ -1523,6 +1523,7 @@ void Unmanaged::configureNotifyEvent(xcb_configure_notify_event_t *e)
addWorkspaceRepaint(visibleRect()); // damage old area
QRect old = geom;
geom = newgeom;
emit geometryChanged(); // update shadow region
addRepaintFull();
if (old.size() != geom.size())
discardWindowPixmap();

View File

@ -378,13 +378,16 @@ QPoint Workspace::adjustClientPosition(Client* c, QPoint pos, bool unrestricted,
{
QSize borderSnapZone(options->borderSnapZone(), options->borderSnapZone());
QRect maxRect;
int guideMaximized = MaximizeRestore;
if (c->maximizeMode() != MaximizeRestore) {
maxRect = clientArea(MovementArea, pos + c->rect().center(), c->desktop());
maxRect = clientArea(MaximizeArea, pos + c->rect().center(), c->desktop());
QRect geo = c->geometry();
if (c->maximizeMode() & MaximizeHorizontal && (geo.x() == maxRect.left() || geo.right() == maxRect.right())) {
guideMaximized |= MaximizeHorizontal;
borderSnapZone.setWidth(qMax(borderSnapZone.width() + 2, maxRect.width() / 16));
}
if (c->maximizeMode() & MaximizeVertical && (geo.y() == maxRect.top() || geo.bottom() == maxRect.bottom())) {
guideMaximized |= MaximizeVertical;
borderSnapZone.setHeight(qMax(borderSnapZone.height() + 2, maxRect.height() / 16));
}
}
@ -473,7 +476,8 @@ QPoint Workspace::adjustClientPosition(Client* c, QPoint pos, bool unrestricted,
lrx = lx + (*l)->width();
lry = ly + (*l)->height();
if (((cy <= lry) && (cy >= ly)) || ((ry >= ly) && (ry <= lry)) || ((cy <= ly) && (ry >= lry))) {
if (!(guideMaximized & MaximizeHorizontal) &&
(((cy <= lry) && (cy >= ly)) || ((ry >= ly) && (ry <= lry)) || ((cy <= ly) && (ry >= lry)))) {
if ((sOWO ? (cx < lrx) : true) && (qAbs(lrx - cx) < snap) && (qAbs(lrx - cx) < deltaX)) {
deltaX = qAbs(lrx - cx);
nx = lrx;
@ -484,7 +488,8 @@ QPoint Workspace::adjustClientPosition(Client* c, QPoint pos, bool unrestricted,
}
}
if (((cx <= lrx) && (cx >= lx)) || ((rx >= lx) && (rx <= lrx)) || ((cx <= lx) && (rx >= lrx))) {
if (!(guideMaximized & MaximizeVertical) &&
(((cx <= lrx) && (cx >= lx)) || ((rx >= lx) && (rx <= lrx)) || ((cx <= lx) && (rx >= lrx)))) {
if ((sOWO ? (cy < lry) : true) && (qAbs(lry - cy) < snap) && (qAbs(lry - cy) < deltaY)) {
deltaY = qAbs(lry - cy);
ny = lry;
@ -497,7 +502,7 @@ QPoint Workspace::adjustClientPosition(Client* c, QPoint pos, bool unrestricted,
}
// Corner snapping
if (nx == lrx || nx + cw == lx) {
if (!(guideMaximized & MaximizeVertical) && (nx == lrx || nx + cw == lx)) {
if ((sOWO ? (ry > lry) : true) && (qAbs(lry - ry) < snap) && (qAbs(lry - ry) < deltaY)) {
deltaY = qAbs(lry - ry);
ny = lry - ch;
@ -507,7 +512,7 @@ QPoint Workspace::adjustClientPosition(Client* c, QPoint pos, bool unrestricted,
ny = ly;
}
}
if (ny == lry || ny + ch == ly) {
if (!(guideMaximized & MaximizeHorizontal) && (ny == lry || ny + ch == ly)) {
if ((sOWO ? (rx > lrx) : true) && (qAbs(lrx - rx) < snap) && (qAbs(lrx - rx) < deltaX)) {
deltaX = qAbs(lrx - rx);
nx = lrx - cw;

View File

@ -154,7 +154,7 @@ bool GlxBackend::initRenderingContext()
const int attribs_31_core_robustness[] = {
GLX_CONTEXT_MAJOR_VERSION_ARB, 3,
GLX_CONTEXT_MINOR_VERSION_ARB, 1,
GLX_CONTEXT_FLAGS_ARB, GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB | GLX_CONTEXT_ROBUST_ACCESS_BIT_ARB,
GLX_CONTEXT_FLAGS_ARB, GLX_CONTEXT_ROBUST_ACCESS_BIT_ARB,
GLX_CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB, GLX_LOSE_CONTEXT_ON_RESET_ARB,
0
};
@ -162,7 +162,6 @@ bool GlxBackend::initRenderingContext()
const int attribs_31_core[] = {
GLX_CONTEXT_MAJOR_VERSION_ARB, 3,
GLX_CONTEXT_MINOR_VERSION_ARB, 1,
GLX_CONTEXT_FLAGS_ARB, GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB,
0
};
@ -222,6 +221,10 @@ bool GlxBackend::initBuffer()
if (overlayWindow()->create()) {
// Try to create double-buffered window in the overlay
XVisualInfo* visual = glXGetVisualFromFBConfig(display(), fbconfig);
if (!visual) {
qCritical() << "Failed to get visual from fbconfig";
return false;
}
XSetWindowAttributes attrs;
attrs.colormap = XCreateColormap(display(), rootWindow(), visual->visual, AllocNone);
window = XCreateWindow(display(), overlayWindow()->window(), 0, 0, displayWidth(), displayHeight(),

View File

@ -197,7 +197,7 @@ X-KDE-Keywords[ia]=kwin,fenestra,gerente,componente,effecto,effectos 3D,effectos
X-KDE-Keywords[it]=kwin,finestra,gestore,composizione,effetto,effetti 3D,effetti 2D,OpenGL,XRender,impostazioni video,effetti grefici,effetti desktop,animazioni,animazioni varie, effetti del gestore delle finestre,effetto dello scambiafinestre, effetto dello scambiatore di desktop,animazioni,velocità animazioni,animazioni desktop,driver,impostazioni driver,disegno,rendering,effetto invertito,effetto vetro,effetto lente,effetto snap helper,effetto evidenzia mouse,effetto ingrandimento, effetto sfocatura,effetto quadro degli strumenti,effetto esplosione,effetto dissolvenza,effetto dissolvenza desktop,effetto caduta,effetto planatura,effetto evidenziazione finestra,effetto schermata di accesso, effetto disconnessione,effetto lampada magica,effetto animazione di minimizzazione,effetto tracciatura mouse, effetto scalatura,effetto istantanea,effetto foglio,effetto diapositiva,effetto scivolamento,effetto icone nella barra delle applicazioni,effetto miniatura su un lato,translucenza,effetto translucenza, trasparenza,effetto geometria finestra,effetto finestre tremolanti,effetto segnale di avvio,effetto finestra padre,effetto oscura finestra inattiva,effetto oscura schermo,effetto scivola all'indietro,gradevole,effetto gradevole,effetto mostra FPS,effetto ridisegno,effetto scambio cubi,effetto scambio copertina,effetto cubi del desktop,effetto animazione cubi del desktop,effetto griglia desktop,effetto scambiatore con inversione,effetto riquadro,effetto finestra presente,effetto ridimensionamento finestra
X-KDE-Keywords[kk]=kwin,window,manager,compositing,effect,3D effects,2D effects,OpenGL,XRender,video settings,graphical effects,desktop effects,animations,various animations,window management effects,window switching effect,desktop switching effect,animations,animation speed,desktop animations,drivers,driver settings,rendering,render,invert effect,looking glass effect,magnifier effect,snap helper effect,track mouse effect,zoom effect,blur effect,dashboard effect,explosion effect,fade effect,fade desktop effect,fall apart effect,glide effect,highlight window effect,login effect,logout effect,magic lamp effect,minimize animation effect,mouse mark effect,scale in effect,screenshot effect,sheet effect,slide effect,sliding popups effect,taskbar thumbnails effect,thumbnail aside effect,translucency,translucency effect,transparency,window geometry effect,wobbly windows effect,startup feedback effect,dialog parent effect,dim inactive effect,dim screen effect,slide back effect,eye candy,candy,show FPS effect,show paint effect,box switch effect,cover switch effect,desktop cube effect,desktop cube animation effect,desktop grid effect,flip switch effect,outline effect,present windows effect,resize window effect
X-KDE-Keywords[km]=kwin,window,manager,compositing,effect,3D effects,2D effects,OpenGL,XRender,video settings,graphical effects,desktop effects,animations,various animations,window management effects,window switching effect,desktop switching effect,animations,animation speed,desktop animations,drivers,driver settings,rendering,render,invert effect,looking glass effect,magnifier effect,snap helper effect,track mouse effect,zoom effect,blur effect,dashboard effect,explosion effect,fade effect,fade desktop effect,fall apart effect,glide effect,highlight window effect,login effect,logout effect,magic lamp effect,minimize animation effect,mouse mark effect,scale in effect,screenshot effect,sheet effect,slide effect,sliding popups effect,taskbar thumbnails effect,thumbnail aside effect,translucency,translucency effect,transparency,window geometry effect,wobbly windows effect,startup feedback effect,dialog parent effect,dim inactive effect,dim screen effect,slide back effect,eye candy,candy,show FPS effect,show paint effect,box switch effect,cover switch effect,desktop cube effect,desktop cube animation effect,desktop grid effect,flip switch effect,outline effect,present windows effect,resize window effect
X-KDE-Keywords[nb]=kwin,vindusbehandler,sammensetting,effekt,3D-effekter,2D-effekter,OpenGL,XRender,videoinnstillinger,grafiske effekter,skrivebordseffekter,animasjoner,diverse animasjoner,vindusbytteeffekter,effekter ved skrivebordsbytte,animasjoner,animasjonsfart,skrivebordsanimasjoner,drivere,driverinnstillinger,opptegning,opptegner,inverteringseffekt,speileffekt,lupeeffekt,gripehjelpereffekt,musesporeffekt,forstørreeffekt,sløreffekt,kontrollpulteffekt,eksplosjonseffekt,uttoningseffekt,skrivebordtoningseffekt,henfallseffekt,glidereffekt,framhev vindu-effekt,innlogingseffekt,utloggingsefffekt,magisk lampe-effekt, animasjonseffekt ved vindusminimering,musmerkeeffekt,innskalerngseffekt,skjermdumpeffekt,ark-effekt,lysbildeeffekt,glidende oppspretteffekt,effekt for minibilder på oppgavelinja,effekt for minibilder på siden,gjennomskinnelighetseffekt,gjennomsiktighet,vindusgeometri-effekt,skjelvende vinduer-effekt,effekt for oppstartsmelding,effekt for foreldredialog,effekt for mørk inaktiv,effekt for mørk skjerm,gli tilbake-effekt,øyesnop,snop,vis FPS-effekt,vis malingseffekt,boksbytteeffekt,lokkbytteeffekt,skrivebordsterning-effekt,effek for animert skrivebordsterning,effekt for skrivebordsruter,effekt for flipp-bytte,omriss-effekt,effekt for vinduer tilstede,effekt for vinduer som endrer størrelse
X-KDE-Keywords[nb]=kwin,vindusbehandler,sammensetting,effekt,3D-effekter,2D-effekter,OpenGL,XRender,videoinnstillinger,grafiske effekter,skrivebordseffekter,animasjoner,diverse animasjoner,vindusbytteeffekter,effekter ved skrivebordsbytte,animasjoner,animasjonsfart,skrivebordsanimasjoner,drivere,driverinnstillinger,opptegning,opptegner,inverteringseffekt,speileffekt,lupeeffekt,gripehjelpereffekt,musesporeffekt,forstørreeffekt,sløreffekt,kontrollpulteffekt,eksplosjonseffekt,uttoningseffekt,skrivebordtoningseffekt,henfallseffekt,glidereffekt,framhev vindu-effekt,innlogingseffekt,utloggingsefffekt,magisk lampe-effekt, animasjonseffekt ved vindusminimering,musmerkeeffekt,innskaleringseffekt,skjermdumpeffekt,ark-effekt,lysbildeeffekt,glidende oppspretteffekt,effekt for minibilder på oppgavelinja,effekt for minibilder på siden,gjennomskinnelighetseffekt,gjennomsiktighet,vindusgeometri-effekt,skjelvende vinduer-effekt,effekt for oppstartsmelding,effekt for foreldredialog,effekt for mørk inaktiv,effekt for mørk skjerm,gli tilbake-effekt,øyesnop,snop,vis FPS-effekt,vis malingseffekt,boksbytteeffekt,lokkbytteeffekt,skrivebordsterning-effekt,effek for animert skrivebordsterning,effekt for skrivebordsruter,effekt for flipp-bytte,omriss-effekt,effekt for vinduer tilstede,effekt for vinduer som endrer størrelse
X-KDE-Keywords[nl]=kwin,venster,beheerder,compositing,effect,3D effecten,2D effecten,OpenGL,XRender,video-instellingen,grafische effecten,bureaubladeffecten,animaties,verrschillende animaties,vensterbeheereffecten,vensteromschakeleffect, bureaublad-omschakeleffect,animaties,animatiesnelheid,bureaubladanimaties,stuurprogramma's,stuurprogramma-instellingen,rendering,render,inversieeffect,vergrootglaseffect,vergrotingseffect,snaphelpereffect,trackmuiseffect,zoomeffect,vervagingseffect,dashboardeffect,explosie-effect,uitvaageffect,uitvaagbureaubladeffect,uiteenvaleffect,glijeffect,vebsteraccentueringseffect,aanmeldeffect,afmeldeffect,magische lampeffect,animatie-effect minimaliseren,muismarkeringseffect,inschaaleffect,schermafdrukeffect,bladeneffect,diaeffect,glijdende pop-upseffect,taakbalkminiatuureffect,miniatuur-opzijeffect,doorzichtigheid,doorzichtigheidseffect,transparantie,vensterafmetingeneffect,wiebelende vensterseffect,opstartterugkoppeleffect,dialoogoudereffect,dim bij inactiviteitseffect,dim het schermeffect,schuif terugeffect,oogstrelend,snoepgoed,FPS toneneffect,verf toneneffect,vak omschakeleffect,deksel schakelaareffect,bureaublad kubuseffect,bureaublad kubus animatie-effect,bureaubladrastereffect,omschakeleffect,omrandingeffect,huidig venstereffect, wijzig grootte van venstereffect
X-KDE-Keywords[pl]=kwin,okno,menadżer,kompozycje,efekt,efekty 3D,efekty 2D,OpenGL,XRender, ustawienia wideo,efekty graficzne,efekty pulpitu,animacje,różne animacje,efekty zarządzania oknami,efekty przełączania okien,efekty przełączania pulpitów,animacje, szybkość animacji,animacje pulpitu,sterowniki,ustawienia sterowników,renderowania, efekt odwrócenia,szkło powiększające,efekt powiększenia,efekt pomocnika przyciągania, efekt śledzenia myszy,efekt przybliżenia,efekt rozmycia,efekt tablicy,efekt eksplozji,efekt zanikania,efekt zanikania pulpitu,efekt rozpadania,efekt slajdu,efekt podświetlania okna, efekt logowania,efekt wylogowywania,efekt magicznej lampy,efekt animacji minimalizacji, efekt znacznika myszy,efekt skalowania,efekt zrzutu ekranu,efekt arkusza,efekt slajdu,efekt wysuwających się elementów wyskakujących,efekt prześwitywania,przezroczystość,efekt geometrii okna,efekt chwiejnych okien,efekt odczuć przy starcie,efekt okna rodzica,efekt przyciemniania nieaktywnych,efekt przyciemniania ekranu,efekt przesuwania do tył,efekt pokazania ilości klatek na sekundę
X-KDE-Keywords[pt]=kwin,janela,gestor,composição,efeito,efeitos 3D,efeitos 2D,OpenGL,XRender,configuração do vídeo,efeitos gráficos,efeitos do ecrã,animações,diversas animações,~efeitos de gestão das janelas,efeito de mudança da janela,efeito de mudança de ecrã,animações,velocidade da animação,animações do ecrã,controladores,configuração do controlador,desenho,efeito de inversão,efeito de lupa,efeito de lente,efeito de ajuste,efeito de seguimento do rato,efeito de ampliação,efeito de borrão,efeito de quadro,efeito de explosão,efeito de desvanecimento,efeito de desvanecimento do ecrã,efeito de queda,efeito de deslizamento,efeito de realce da janela,efeito de autenticação,efeito de encerramento da sessão,efeito de lâmpada mágica,efeito de animação da minimização,efeito de marcação do rato,efeito de ampliação,efeito de captura do ecrã,efeito de folha,efeito de deslizamento,efeito de janelas deslizantes,efeito de miniaturas das tarefas,efeito de miniatura ao lado,translucidez,efeito de translucidez,transparência,efeito de geometria da janela,efeito de janelas ondulantes,efeito da reacção ao arranque,efeito da janela-mãe,efeito de escurecimento da janela inactiva,efeito de escurecimento do ecrã,efeito de deslize para trás,efeitos visuais,visuais,efeito para mostrar FPS,efeito de pintura,efeito de mudança em caixa,efeito de mudança em capas,efeito de cubo do ecrã,efeito de animação do cubo do ecrã,efeito da grelha do ecrã,efeito de viragem de página,efeito de realce,efeito de apresentação das janelas,feito de dimensionamento das janelas

View File

@ -170,6 +170,7 @@ X-KDE-Keywords[de]=KWin,Kwm,Fenster,Manager,Rahmen,Design,Stile,Themes,Optik,Ers
X-KDE-Keywords[el]=kwin,παράθυρο,διαχειριστής,περίγραμμα,στιλ,θέμα,εμφάνιση,αίσθηση,διάταξη,κουμπί,χειρισμός,άκρη,kwm,διακόσμηση
X-KDE-Keywords[es]=kwin,ventana,gestor,borde,estilo,tema,aspecto,sensación,disposición,botón,asa,borde,kwm,decoración
X-KDE-Keywords[et]=kwin,aken,haldur,piire,stiil,teema,välimus,paigutus,nupp,pide,serv,kwm,dekoratsioon
X-KDE-Keywords[eu]=kwin,leiho,kudeatzaile,muga,estilo,gai,itxura,izaera,antolamendu,botoi,helduleku,ertz,kwm,apainketa
X-KDE-Keywords[fi]=kwin,ikkuna,hallinta,ikkunointiohjelma,kehys,reunus,tyyli,teema,ulkoasu,toiminta,asettelu,painike,kahva,kulma,reuna,kwm,koriste
X-KDE-Keywords[fr]=kwin, fenêtre, gestionnaire, composition, bordure, style, thème, apparence, comportement, disposition, bouton, prise en main, bord, kwm, décoration
X-KDE-Keywords[ga]=kwin,fuinneog,bainisteoir,imlíne,stíl,téama,cuma,brath,leagan amach,cnaipe,hanla,ciumhais,kwm,maisiúchán

View File

@ -107,6 +107,7 @@ Comment[cs]=Nastavení činností myši na oknech
Comment[da]=Indstilling af musehandlinger på vinduer
Comment[de]=Maus-Aktionen für Fenster einrichten
Comment[es]=Configurar las acciones del ratón sobre las ventanas
Comment[eu]=Konfiguratu sagu-ekintzak leihoetan
Comment[fi]=Ikkunoiden hiiritoimintojen asetukset
Comment[fr]=Configurer les actions de souris pour les fenêtres
Comment[gl]=Configura a accións do rato nas xanelas

View File

@ -208,7 +208,7 @@ X-KDE-Keywords[it]=fuoco,posizionamento,comportamento della finestra,animazione,
X-KDE-Keywords[kk]=focus,placement,window behavior,animation,raise,auto raise,windows,frame,titlebar,doubleclick
X-KDE-Keywords[km]=focus,placement,window behavior,animation,raise,auto raise,windows,frame,titlebar,doubleclick
X-KDE-Keywords[ko]=focus,placement,window behavior,animation,raise,auto raise,windows,frame,titlebar,doubleclick,초점,위치,창 행동,애니메이션,올리기,창,프레임,제목 표시줄
X-KDE-Keywords[nb]=fokus,plassering,vindusppførsel,animering,hev,autohev,vinduer,ramme,tittellinje,dobbeltklikk
X-KDE-Keywords[nb]=fokus,plassering,vindusoppførsel,animering,hev,autohev,vinduer,ramme,tittellinje,dobbeltklikk
X-KDE-Keywords[nl]=focus,plaatsing,venstegedrag,animatie,omhoog,automatisch omhoog,vensters,frame,titelbalk,dubbelklik
X-KDE-Keywords[pl]=uaktywnienie,umieszczenie,zachowanie okna,animacja,wzniesienie,auto-wzniesienie, okna,ramka,pasek tytułu,podwójne kliknięcie
X-KDE-Keywords[pt]=foco,colocação,comportamento da janela,animação,elevar,elevar automaticamente,janelas,contorno,barra de título,duplo-click

View File

@ -53,6 +53,7 @@ KWinScreenEdgesConfig::KWinScreenEdgesConfig(QWidget* parent, const QVariantList
connect(m_ui->monitor, SIGNAL(changed()), this, SLOT(changed()));
connect(m_ui->desktopSwitchCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(changed()));
connect(m_ui->activationDelaySpin, SIGNAL(valueChanged(int)), this, SLOT(sanitizeCooldown()));
connect(m_ui->activationDelaySpin, SIGNAL(valueChanged(int)), this, SLOT(changed()));
connect(m_ui->triggerCooldownSpin, SIGNAL(valueChanged(int)), this, SLOT(changed()));
connect(m_ui->quickMaximizeBox, SIGNAL(stateChanged(int)), this, SLOT(changed()));
@ -65,6 +66,8 @@ KWinScreenEdgesConfig::KWinScreenEdgesConfig(QWidget* parent, const QVariantList
connect(m_ui->quickTileBox, SIGNAL(stateChanged(int)), this, SLOT(groupChanged()));
load();
sanitizeCooldown();
}
KWinScreenEdgesConfig::~KWinScreenEdgesConfig()
@ -146,6 +149,11 @@ void KWinScreenEdgesConfig::showEvent(QShowEvent* e)
monitorShowEvent();
}
void KWinScreenEdgesConfig::sanitizeCooldown()
{
m_ui->triggerCooldownSpin->setMinimum(m_ui->activationDelaySpin->value() + 50);
}
// Copied from kcmkwin/kwincompositing/main.cpp
bool KWinScreenEdgesConfig::effectEnabled(const QString& effect, const KConfigGroup& cfg) const
{

View File

@ -56,7 +56,8 @@ public slots:
virtual void defaults();
protected:
virtual void showEvent(QShowEvent* e);
private slots:
void sanitizeCooldown();
private:
KWinScreenEdgesConfigForm* m_ui;
KSharedConfigPtr m_config;

View File

@ -18,6 +18,7 @@ X-KDE-Keywords[de]=KWin-Skript
X-KDE-Keywords[el]=σενάριο kwin
X-KDE-Keywords[es]=guion de kwin
X-KDE-Keywords[et]=kwini skript
X-KDE-Keywords[eu]=kwin script-a
X-KDE-Keywords[fi]=kwin-skripti
X-KDE-Keywords[fr]=Script de KWin
X-KDE-Keywords[ga]=Script kwin
@ -63,6 +64,7 @@ Name[de]=KWin-Skripte
Name[el]=Σενάρια KWin
Name[es]=Guiones de KWin
Name[et]=KWini skriptid
Name[eu]=KWin script-ak
Name[fi]=KWin-skriptit
Name[fr]=Scripts de KWin
Name[ga]=Scripteanna KWin
@ -107,6 +109,7 @@ Comment[de]=KWin-Skripte verwalten
Comment[el]=Διαχείριση σεναρίων KWin
Comment[es]=Gestionar guiones de KWin
Comment[et]=KWini skriptide haldamine
Comment[eu]=Kudeatu KWin script-ak
Comment[fi]=KWin-skriptien hallinta
Comment[fr]=Gérer les scripts de KWin
Comment[ga]=Bainistigh scripteanna KWin

View File

@ -201,7 +201,9 @@ Name[bs]=Reset grafike
Name[ca]=Reinici dels gràfics
Name[cs]=Resetovat grafiku
Name[da]=Grafiknulstilling
Name[de]=Grafik-Reset
Name[es]=Reinicio gráfico
Name[eu]=Grafikoak berrezarri
Name[fi]=Grafiikan nollaus
Name[fr]=Réinitialisation graphique
Name[gl]=Reinicio dos gráficos
@ -211,6 +213,7 @@ Name[it]=Azzeramento grafica
Name[kk]=Графиканы ысыру
Name[ko]=그래픽 초기화
Name[lt]=Grafikos atstatymas
Name[nb]=Grafikk tilbakestilt
Name[nl]=Grafische reset
Name[pa]=ਗਰਾਫਿਕਸ ਮੁੜ-ਸੈੱਟ
Name[pl]=Reset grafiki
@ -233,7 +236,9 @@ Comment=A graphics reset event occurred
Comment[bs]=Grafički reset događaj se desio
Comment[ca]=Ha ocorregut un esdeveniment de reinici dels gràfics
Comment[da]=En grafiknulstillingshændelse fandt sted
Comment[de]=Ein Zurücksetzen der Grafik ist aufgetreten
Comment[es]=Ha ocurrido un evento de reinicio gráfico
Comment[eu]=Grafikoak berrezartzeko gertaera bat jazo da
Comment[fi]=Sattui grafiikan nollaustapahtuma
Comment[fr]=Un évènement de réinitialisation graphique est intervenu
Comment[gl]=Aconteceu un reinicio de gráficos
@ -242,6 +247,7 @@ Comment[ia]=Il necessita un evento de reinitiar le graphic
Comment[it]=Si è verificato un evento di azzeramento della grafica
Comment[kk]=Графиканы ысыру оқиғасы болды
Comment[ko]=그래픽 초기화 이벤트가 발생함
Comment[nb]=Det har foregått en grafikk-tilbakestilling
Comment[nl]=Een gebeurtenis van een grafische reset deed zich voor
Comment[pl]=Nastąpiło zdarzenie resetu grafiki
Comment[pt]=Ocorreu um evento de reinício gráfico

View File

@ -581,7 +581,8 @@ void GLPlatform::detect(OpenGLPlatformInterface platformInterface)
GLXContext ctx = glXGetCurrentContext();
m_directRendering = glXIsDirect(display(), ctx);
m_supportsGLSL = m_extensions.contains("GL_ARB_shader_objects") &&
m_supportsGLSL = m_directRendering &&
m_extensions.contains("GL_ARB_shader_objects") &&
m_extensions.contains("GL_ARB_fragment_shader") &&
m_extensions.contains("GL_ARB_vertex_shader");

View File

@ -46,7 +46,10 @@ namespace KWin
bool GLTexturePrivate::sNPOTTextureSupported = false;
bool GLTexturePrivate::sFramebufferObjectSupported = false;
bool GLTexturePrivate::sSaturationSupported = false;
bool GLTexturePrivate::sTextureFormatBGRA = false;
GLenum GLTexturePrivate::sTextureFormat = GL_RGBA; // custom dummy, GL_BGRA is not present on GLES
uint GLTexturePrivate::s_textureObjectCounter = 0;
uint GLTexturePrivate::s_fbo = 0;
GLTexture::GLTexture()
: d_ptr(new GLTexturePrivate())
@ -97,11 +100,8 @@ GLTexture::GLTexture(int width, int height)
glGenTextures(1, &d->m_texture);
bind();
#ifdef KWIN_HAVE_OPENGLES
if (GLTexturePrivate::sTextureFormatBGRA) {
glTexImage2D(d->m_target, 0, GL_BGRA_EXT, width, height, 0, GL_BGRA_EXT, GL_UNSIGNED_BYTE, 0);
} else {
glTexImage2D(d->m_target, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
}
glTexImage2D(d->m_target, 0, GLTexturePrivate::sTextureFormat, width, height,
0, GLTexturePrivate::sTextureFormat, GL_UNSIGNED_BYTE, 0);
#else
glTexImage2D(d->m_target, 0, GL_RGBA8, width, height, 0, GL_BGRA, GL_UNSIGNED_BYTE, 0);
#endif
@ -133,6 +133,7 @@ GLTexturePrivate::GLTexturePrivate()
m_vbo = 0;
m_filterChanged = true;
m_wrapModeChanged = false;
++s_textureObjectCounter;
}
GLTexturePrivate::~GLTexturePrivate()
@ -143,6 +144,11 @@ GLTexturePrivate::~GLTexturePrivate()
if (m_texture != 0) {
glDeleteTextures(1, &m_texture);
}
// Delete the FBO if this is the last Texture
if (--s_textureObjectCounter == 0 && s_fbo) {
glDeleteFramebuffers(1, &s_fbo);
s_fbo = 0;
}
}
void GLTexturePrivate::initStatic()
@ -151,14 +157,17 @@ void GLTexturePrivate::initStatic()
sNPOTTextureSupported = true;
sFramebufferObjectSupported = true;
sSaturationSupported = true;
sTextureFormatBGRA = hasGLExtension(QStringLiteral("GL_EXT_texture_format_BGRA8888"));
if (hasGLExtension(QStringLiteral("GL_EXT_texture_format_BGRA8888")))
sTextureFormat = GL_BGRA_EXT;
else
sTextureFormat = GL_RGBA;
#else
sNPOTTextureSupported = hasGLExtension(QStringLiteral("GL_ARB_texture_non_power_of_two"));
sFramebufferObjectSupported = hasGLExtension(QStringLiteral("GL_EXT_framebuffer_object"));
sSaturationSupported = ((hasGLExtension(QStringLiteral("GL_ARB_texture_env_crossbar"))
&& hasGLExtension(QStringLiteral("GL_ARB_texture_env_dot3"))) || hasGLVersion(1, 4))
&& (glTextureUnitsCount >= 4) && glActiveTexture != NULL;
sTextureFormatBGRA = true;
sTextureFormat = GL_BGRA;
#endif
}
@ -215,11 +224,8 @@ bool GLTexture::load(const QImage& image, GLenum target)
}
bind();
#ifdef KWIN_HAVE_OPENGLES
if (GLTexturePrivate::sTextureFormatBGRA) {
glTexImage2D(d->m_target, 0, GL_BGRA_EXT, img.width(), img.height(), 0, GL_BGRA_EXT, GL_UNSIGNED_BYTE, img.bits());
} else {
glTexImage2D(d->m_target, 0, GL_RGBA, img.width(), img.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, img.bits());
}
glTexImage2D(d->m_target, 0, GLTexturePrivate::sTextureFormat, img.width(), img.height(),
0, GLTexturePrivate::sTextureFormat, GL_UNSIGNED_BYTE, img.bits());
#else
glTexImage2D(d->m_target, 0, GL_RGBA8, img.width(), img.height(), 0,
GL_BGRA, GL_UNSIGNED_BYTE, img.bits());
@ -258,15 +264,8 @@ void GLTexture::update(const QImage &image, const QPoint &offset, const QRect &s
const QImage &img = d->convertToGLFormat(tmpImage.isNull() ? image : tmpImage);
bind();
#ifdef KWIN_HAVE_OPENGLES
if (GLTexturePrivate::sTextureFormatBGRA) {
glTexSubImage2D(d->m_target, 0, offset.x(), offset.y(), width, height, GL_BGRA_EXT, GL_UNSIGNED_BYTE, img.bits());
} else {
glTexSubImage2D(d->m_target, 0, offset.x(), offset.y(), width, height, GL_RGBA, GL_UNSIGNED_BYTE, img.bits());
}
#else
glTexSubImage2D(d->m_target, 0, offset.x(), offset.y(), width, height, GL_BGRA, GL_UNSIGNED_BYTE, img.bits());
#endif
glTexSubImage2D(d->m_target, 0, offset.x(), offset.y(), width, height,
GLTexturePrivate::sTextureFormat, GL_UNSIGNED_BYTE, img.bits());
checkGLError("update texture");
unbind();
setDirty();
@ -428,6 +427,33 @@ GLenum GLTexture::filter() const
return d->m_filter;
}
void GLTexture::clear()
{
Q_D(GLTexture);
if (!GLTexturePrivate::s_fbo && GLRenderTarget::supported() &&
GLPlatform::instance()->driver() != Driver_Catalyst) // fail. -> bug #323065
glGenFramebuffers(1, &GLTexturePrivate::s_fbo);
if (GLTexturePrivate::s_fbo) {
// Clear the texture
glBindFramebuffer(GL_FRAMEBUFFER, GLTexturePrivate::s_fbo);
glClearColor(0, 0, 0, 0);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, d->m_texture, 0);
glClear(GL_COLOR_BUFFER_BIT);
glBindFramebuffer(GL_FRAMEBUFFER, 0);
} else {
if (const int size = width()*height()) {
uint32_t *buffer = new uint32_t[size];
memset(buffer, 0, size*sizeof(uint32_t));
bind();
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width(), height(),
GLTexturePrivate::sTextureFormat, GL_UNSIGNED_BYTE, buffer);
unbind();
delete[] buffer;
}
}
}
bool GLTexture::isDirty() const
{
Q_D(const GLTexture);
@ -470,7 +496,7 @@ QImage GLTexturePrivate::convertToGLFormat(const QImage& img) const
// Copied from Qt's QGLWidget::convertToGLFormat()
QImage res;
if (sTextureFormatBGRA) {
if (sTextureFormat != GL_RGBA) {
if (QSysInfo::ByteOrder == QSysInfo::BigEndian) {
res = QImage(img.size(), QImage::Format_ARGB32);
QImage imgARGB32 = img.convertToFormat(QImage::Format_ARGB32_Premultiplied);

View File

@ -93,6 +93,11 @@ public:
GLuint texture() const;
GLenum target() const;
GLenum filter() const;
/** @short
* Make the texture fully transparent
* Warning: this clobbers the current framebuffer binding except on fglrx
*/
void clear();
bool isDirty() const;
void setFilter(GLenum filter);
void setWrapMode(GLenum mode);

View File

@ -73,7 +73,9 @@ public:
static bool sNPOTTextureSupported;
static bool sFramebufferObjectSupported;
static bool sSaturationSupported;
static bool sTextureFormatBGRA;
static GLenum sTextureFormat;
static uint s_fbo;
static uint s_textureObjectCounter;
private:
Q_DISABLE_COPY(GLTexturePrivate)
};

View File

@ -786,6 +786,16 @@ void ShaderManager::resetAllShaders()
}
}
void ShaderManager::resetShader(GLShader *shader, ShaderType type)
{
if (!(shader && shader->isValid()))
return;
pushShader(shader);
resetShader(type);
popShader();
}
void ShaderManager::pushShader(GLShader *shader)
{

View File

@ -352,6 +352,12 @@ public:
**/
void resetAllShaders();
/**
* Resets ShaderType @p type uniforms of a custom shader
* @since 4.11.1
*/
void resetShader(GLShader *shader, ShaderType type);
/**
* Creates a GLShader with a built-in vertex shader and a custom fragment shader.
* @param vertex The generic vertex shader

View File

@ -108,6 +108,11 @@ static xcb_render_picture_t createPicture(xcb_pixmap_t pix, int depth)
}
XRenderPicture::XRenderPicture(const QImage &img)
{
fromImage(img);
}
void XRenderPicture::fromImage(const QImage &img)
{
const int depth = img.depth();
xcb_pixmap_t xpix = xcb_generate_id(connection());

View File

@ -72,6 +72,7 @@ public:
XRenderPicture(xcb_pixmap_t pix, int depth);
operator xcb_render_picture_t();
private:
void fromImage(const QImage &img);
KSharedPtr< XRenderPictureData > d;
};

View File

@ -377,6 +377,7 @@ bool Client::manage(xcb_window_t w, bool isMapped)
if (!placementDone) {
// Placement needs to be after setting size
Placement::self()->place(this, area);
dontKeepInArea = true;
placementDone = true;
}
@ -419,7 +420,7 @@ bool Client::manage(xcb_window_t w, bool isMapped)
if (pseudo_max != Client::MaximizeRestore) {
maximize((MaximizeMode)pseudo_max);
// from now on, care about maxmode, since the maximization call will override mode for fix aspects
dontKeepInArea = (max_mode == Client::MaximizeFull);
dontKeepInArea |= (max_mode == Client::MaximizeFull);
geom_restore = QRect(); // Use placement when unmaximizing ...
if (!(max_mode & Client::MaximizeVertical)) {
geom_restore.setY(y()); // ...but only for horizontal direction

View File

@ -28,6 +28,7 @@ DEALINGS IN THE SOFTWARE.
#include "client.h"
#include "deleted.h"
#include "effects.h"
#include <kwinglplatform.h>
#include <kwinglutils.h>
#include <kwinxrenderutils.h>
#include <QPaintEngine>
@ -306,21 +307,12 @@ void ImageBasedPaintRedirector::discardScratch()
// ------------------------------------------------------------------
unsigned int OpenGLPaintRedirector::s_count = 0;
unsigned int OpenGLPaintRedirector::s_fbo = 0;
OpenGLPaintRedirector::OpenGLPaintRedirector(Client *c, QWidget *widget)
: ImageBasedPaintRedirector(c, widget)
{
s_count++;
for (int i = 0; i < TextureCount; ++i)
m_textures[i] = NULL;
if (!s_fbo && GLRenderTarget::supported())
glGenFramebuffers(1, &s_fbo);
PaintRedirector::resizePixmaps();
}
@ -328,12 +320,6 @@ OpenGLPaintRedirector::~OpenGLPaintRedirector()
{
for (int i = 0; i < TextureCount; ++i)
delete m_textures[i];
// Delete the FBO if this is the last OpenGLPaintRedirector
if (--s_count == 0 && s_fbo) {
glDeleteFramebuffers(1, &s_fbo);
s_fbo = 0;
}
}
void OpenGLPaintRedirector::resizePixmaps(const QRect *rects)
@ -351,8 +337,6 @@ void OpenGLPaintRedirector::resizePixmaps(const QRect *rects)
}
}
bool fbo_bound = false;
for (int i = 0; i < 2; i++) {
if (m_textures[i] && m_textures[i]->size() == size[i])
continue;
@ -366,22 +350,8 @@ void OpenGLPaintRedirector::resizePixmaps(const QRect *rects)
m_textures[i] = new GLTexture(size[i].width(), size[i].height());
m_textures[i]->setYInverted(true);
m_textures[i]->setWrapMode(GL_CLAMP_TO_EDGE);
if (s_fbo) {
// Clear the texture
if (!fbo_bound) {
glBindFramebuffer(GL_FRAMEBUFFER, s_fbo);
glClearColor(0, 0, 0, 0);
fbo_bound = true;
}
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_textures[i]->texture(), 0);
glClear(GL_COLOR_BUFFER_BIT);
}
m_textures[i]->clear();
}
if (fbo_bound)
glBindFramebuffer(GL_FRAMEBUFFER, 0);
}
void OpenGLPaintRedirector::preparePaint(const QPixmap &pending)

View File

@ -157,9 +157,6 @@ protected:
private:
QImage m_tempImage;
GLTexture *m_textures[2];
static unsigned int s_fbo;
static unsigned int s_count;
};
class RasterXRenderPaintRedirector : public ImageBasedPaintRedirector

View File

@ -28,6 +28,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include <QTextStream>
#ifndef KCMRULES
#include <kdecoration.h>
#include "workspace.h"
#include "client.h"
#include "options.h"
@ -96,6 +97,30 @@ void Placement::place(Client* c, QRect& area, Policy policy, Policy nextPlacemen
placeMaximizing(c, area, nextPlacement);
else
placeSmart(c, area, nextPlacement);
if (options->borderSnapZone()) {
// snap to titlebar / snap to window borders on inner screen edges
const QRect geo(c->geometry());
QPoint corner = geo.topLeft();
const QPoint cp = c->clientPos();
const QSize cs = geo.size() - c->clientSize();
KDecorationDefines::Position titlePos = c->titlebarPosition();
const QRect fullRect = workspace()->clientArea(FullArea, c);
if (!(c->maximizeMode() & KDecorationDefines::MaximizeHorizontal)) {
if (titlePos != KDecorationDefines::PositionRight && geo.right() == fullRect.right())
corner.rx() += cs.width() - cp.x();
if (titlePos != KDecorationDefines::PositionLeft && geo.x() == fullRect.x())
corner.rx() -= cp.x();
}
if (!(c->maximizeMode() & KDecorationDefines::MaximizeVertical)) {
if (titlePos != KDecorationDefines::PositionBottom && geo.bottom() == fullRect.bottom())
corner.ry() += cs.height() - cp.y();
if (titlePos != KDecorationDefines::PositionTop && geo.y() == fullRect.y())
corner.ry() -= cp.y();
}
c->move(corner);
}
}
/*!
@ -442,10 +467,7 @@ void Placement::placeCentered(Client* c, const QRect& area, Policy /*next*/)
void Placement::placeZeroCornered(Client* c, const QRect& area, Policy /*next*/)
{
// get the maximum allowed windows space and desk's origin
const QRect maxRect = checkArea(c, area);
// place the window
c->move(QPoint(maxRect.left(), maxRect.top()));
c->move(checkArea(c, area).topLeft());
}
void Placement::placeUtility(Client* c, QRect& area, Policy /*next*/)

View File

@ -633,17 +633,14 @@ bool SceneOpenGL2::supported(OpenGLBackend *backend)
SceneOpenGL2::SceneOpenGL2(OpenGLBackend *backend)
: SceneOpenGL(Workspace::self(), backend)
, m_lanczosFilter(NULL)
, m_colorCorrection(new ColorCorrection(this))
, m_colorCorrection()
{
if (!init_ok) {
// base ctor already failed
return;
}
// Initialize color correction before the shaders
qDebug() << "Color correction:" << options->isColorCorrected();
m_colorCorrection->setEnabled(options->isColorCorrected());
connect(m_colorCorrection, SIGNAL(changed()), Compositor::self(), SLOT(addRepaintFull()));
connect(m_colorCorrection, SIGNAL(errorOccured()), options, SLOT(setColorCorrected()), Qt::QueuedConnection);
slotColorCorrectedChanged(false);
connect(options, SIGNAL(colorCorrectedChanged()), this, SLOT(slotColorCorrectedChanged()), Qt::QueuedConnection);
if (!ShaderManager::instance()->isValid()) {
@ -717,7 +714,7 @@ SceneOpenGL::Window *SceneOpenGL2::createWindow(Toplevel *t)
void SceneOpenGL2::finalDrawWindow(EffectWindowImpl* w, int mask, QRegion region, WindowPaintData& data)
{
if (m_colorCorrection->isEnabled()) {
if (!m_colorCorrection.isNull() && m_colorCorrection->isEnabled()) {
// Split the painting for separate screens
const int numScreens = screens()->count();
for (int screen = 0; screen < numScreens; ++ screen) {
@ -755,12 +752,29 @@ void SceneOpenGL2::resetLanczosFilter()
ColorCorrection *SceneOpenGL2::colorCorrection()
{
return m_colorCorrection;
return m_colorCorrection.data();
}
void SceneOpenGL2::slotColorCorrectedChanged()
void SceneOpenGL2::slotColorCorrectedChanged(bool recreateShaders)
{
m_colorCorrection->setEnabled(options->isColorCorrected());
qDebug() << "Color correction:" << options->isColorCorrected();
if (options->isColorCorrected() && m_colorCorrection.isNull()) {
m_colorCorrection.reset(new ColorCorrection(this));
if (!m_colorCorrection->setEnabled(true)) {
m_colorCorrection.reset();
return;
}
connect(m_colorCorrection.data(), SIGNAL(changed()), Compositor::self(), SLOT(addRepaintFull()));
connect(m_colorCorrection.data(), SIGNAL(errorOccured()), options, SLOT(setColorCorrected()), Qt::QueuedConnection);
if (recreateShaders) {
// Reload all shaders
ShaderManager::cleanup();
ShaderManager::instance();
}
} else {
m_colorCorrection.reset();
}
Compositor::self()->addRepaintFull();
}
@ -1393,7 +1407,9 @@ void SceneOpenGL2Window::performPaint(int mask, QRegion region, WindowPaintData
}
}
static_cast<SceneOpenGL2*>(m_scene)->colorCorrection()->setupForOutput(data.screen());
if (ColorCorrection *cc = static_cast<SceneOpenGL2*>(m_scene)->colorCorrection()) {
cc->setupForOutput(data.screen());
}
shader->setUniform(GLShader::WindowTransformation, transformation(mask, data));
shader->setUniform(GLShader::Saturation, data.saturation());
@ -1556,7 +1572,9 @@ void SceneOpenGL2Window::prepareStates(TextureType type, qreal opacity, qreal br
shader->setUniform(GLShader::ModulationConstant, QVector4D(rgb, rgb, rgb, a));
shader->setUniform(GLShader::Saturation, saturation);
static_cast<SceneOpenGL2*>(m_scene)->colorCorrection()->setupForOutput(screen);
if (ColorCorrection *cc = static_cast<SceneOpenGL2*>(m_scene)->colorCorrection()) {
cc->setupForOutput(screen);
}
}
void SceneOpenGL2Window::restoreStates(TextureType type, qreal opacity, qreal brightness, qreal saturation)
@ -1569,7 +1587,9 @@ void SceneOpenGL2Window::restoreStates(TextureType type, qreal opacity, qreal br
glDisable(GL_BLEND);
}
static_cast<SceneOpenGL2*>(m_scene)->colorCorrection()->setupForOutput(-1);
if (ColorCorrection *cc = static_cast<SceneOpenGL2*>(m_scene)->colorCorrection()) {
cc->setupForOutput(-1);
}
}
//***************************************

View File

@ -127,7 +127,7 @@ protected:
virtual void paintDesktop(int desktop, int mask, const QRegion &region, ScreenPaintData &data);
private Q_SLOTS:
void slotColorCorrectedChanged();
void slotColorCorrectedChanged(bool recreateShaders = true);
void resetLanczosFilter();
private:
@ -135,7 +135,7 @@ private:
private:
LanczosFilter *m_lanczosFilter;
ColorCorrection *m_colorCorrection;
QScopedPointer<ColorCorrection> m_colorCorrection;
GLuint vao;
};

View File

@ -591,7 +591,7 @@ void ScreenEdges::reconfigure()
// TODO: migrate settings to a group ScreenEdges
KConfigGroup windowsConfig = m_config->group("Windows");
setTimeThreshold(windowsConfig.readEntry("ElectricBorderDelay", 150));
setReActivationThreshold(windowsConfig.readEntry("ElectricBorderCooldown", 350));
setReActivationThreshold(qMax(timeThreshold() + 50, windowsConfig.readEntry("ElectricBorderCooldown", 350)));
int desktopSwitching = windowsConfig.readEntry("ElectricBorders", static_cast<int>(ElectricDisabled));
if (desktopSwitching == ElectricDisabled) {
setDesktopSwitching(false);

View File

@ -12,6 +12,7 @@ Comment[de]=KWin-Skript
Comment[el]=Σενάριο KWin
Comment[es]=Guion de KWin
Comment[et]=KWini skript
Comment[eu]=KWin script-a
Comment[fi]=KWin-skripti
Comment[fr]=Script KWin
Comment[ga]=Script KWin

View File

@ -9,6 +9,7 @@ Name[de]=OSD-Arbeitsflächenwechsel
Name[el]=OSD αλλαγής επιφάνειας εργασίας
Name[es]=Información en pantalla sobre cambio de escritorio
Name[et]=Töölaua muutmise ekraaniesitus
Name[eu]=Mahaigain aldaketa OSD
Name[fi]=Työpöydänvaihdon ilmoitus
Name[fr]=OSD pour le changement de bureau
Name[gl]=OSD de cambio de escritorio
@ -50,6 +51,7 @@ Comment[de]=Ein On-Screen-Display (OSD), das den Wechsel der Arbeitsfläche anze
Comment[el]=Μια ένδειξη στην οθόνη που δηλώνει την αλλαγή της επιφάνειας εργασίας
Comment[es]=Una información en pantalla que indica el cambio de escritorio
Comment[et]=Töölaua muutumist näitab ekraanikuva
Comment[eu]=Mahaigain aldaketa adierazten duen pantailan erakusten den informazioa
Comment[fi]=Näytölle ilmestyvä ilmoitus työpöydän vaihdosta
Comment[fr]=Un affichage sur l'écran (OSD) indiquant le changement de bureau
Comment[gl]=Un visor na pantalla que indica o cambio de escritorio

View File

@ -9,6 +9,7 @@ Name[de]=Video-Wand
Name[el]=Τοίχος με οθόνες
Name[es]=Panel de vídeo
Name[et]=Videosein
Name[eu]=Bideo-horma
Name[fi]=Videoseinä
Name[fr]=Mur de vidéos
Name[ga]=Balla Físe
@ -51,6 +52,7 @@ Comment[de]=Erweitert einen Videospieler im Vollbildmodus über alle Bildschirme
Comment[el]=Απλώνει πλήρη οθόνη για το πρόγραμμα αναπαραγωγής βίντεο σε όλες τις προσαρτημένες οθόνες για να δημιουργήσει ένα Video Wall
Comment[es]=Extiende el reproductor de vídeo a pantalla completa sobre todas las pantallas conectadas para crear un panel de vídeo
Comment[et]=Täisekraan-videomängija laiendamine kõigile ühendatud ekraanile videoseina loomiseks
Comment[eu]=Pantaila-beteko bideo jotzea lotutako pantaila guztietara zabaltzen du bideo-horma bat sortzeko
Comment[fi]=Levittää koko näytön tilassa olevan videotoistimen kaikkiin yhdistettyihin näyttöihin luoden videoseinän
Comment[fr]=Étend le lecteur vidéo en mode plein écran sur l'ensemble des écrans connectés afin de créer un mur de vidéos
Comment[gl]=Estende un reprodutor de vídeo a pantalla completa por todas as pantallas anexas para crear unha parede de vídeo

View File

@ -6,6 +6,7 @@ Comment=KWin Desktop Switcher Layout
Comment[bs]=Izgled KWin prebacivača radnih površina
Comment[ca]=Disposició del commutador d'escriptoris del KWin
Comment[da]=Layout til KWins skrivebordsskifter
Comment[de]=Arbeitsflächenwechsler-Layout
Comment[es]=Esquema del cambiador de escritorios de KWin
Comment[fi]=KWinin työpöydänvalitsimen asettelu
Comment[fr]=Une disposition du sélecteur de bureaux KWin

View File

@ -9,6 +9,7 @@ Name[de]=Große Symbole
Name[el]=Μεγάλα εικονίδια
Name[es]=Iconos grandes
Name[et]=Suured ikoonid
Name[eu]=Ikonoak handiak
Name[fi]=Suuret kuvakkeet
Name[fr]=Grandes icônes
Name[ga]=Deilbhíní Móra

View File

@ -9,6 +9,7 @@ Name[de]=Kompakt
Name[el]=Συμπαγές
Name[es]=Compacto
Name[et]=Kompaktne
Name[eu]=Trinkoa
Name[fi]=Tiivis
Name[fr]=Synthétique
Name[ga]=Dlúth

View File

@ -9,6 +9,7 @@ Name[de]=Raster
Name[el]=Κάνναβος
Name[es]=Rejilla
Name[et]=Võrgustik
Name[eu]=Sareta
Name[fi]=Ruudukko
Name[fr]=Grille
Name[ga]=Greille
@ -54,6 +55,7 @@ Comment[de]=Ein Fensterwechsler-Layout, das Vorschauen aller Fenster in einem Ra
Comment[el]=Μια διάταξη εναλλαγής παραθύρων με όλα τα παράθυρα ως εικόνες επισκόπησης σε κάνναβο
Comment[es]=Un esquema de cambiador de ventanas que muestra todas las ventanas como miniaturas en una rejilla
Comment[et]=Aknavahetaja paigutus kõigi akende näitamisega pisipiltidena võrgustikus
Comment[eu]=Leiho aldaketarako antolamendu bat leiho guztiak sareta batean koadro-txiki gisa erakusten dituena
Comment[fi]=Tehtävänvalitsimen asettelu, joka näyttää kaikkien ikkunoiden pienoiskuvat ruudukossa
Comment[fr]=Une disposition de sélecteur de fenêtres affichant toutes les fenêtres en miniatures dans une grille
Comment[gl]=Unha disposición do alternador de xanelas que mostra nunha grella miniaturas das xanelas

View File

@ -9,6 +9,7 @@ Name[de]=Kleine Symbole
Name[el]=Μικρά εικονίδια
Name[es]=Iconos pequeños
Name[et]=Väikesed ikoonid
Name[eu]=Ikono txikiak
Name[fi]=Pienet kuvakkeet
Name[fr]=Petites icônes
Name[ga]=Deilbhíní Beaga

View File

@ -436,8 +436,13 @@ Workspace::~Workspace()
// TODO: grabXServer();
// Use stacking_order, so that kwin --replace keeps stacking order
for (ToplevelList::iterator it = stacking_order.begin(), end = stacking_order.end(); it != end; ++it) {
Client *c = qobject_cast<Client*>(*it);
const ToplevelList stack = stacking_order;
// "mutex" the stackingorder, since anything trying to access it from now on will find
// many dangeling pointers and crash
stacking_order.clear();
for (ToplevelList::const_iterator it = stack.constBegin(), end = stack.constEnd(); it != end; ++it) {
Client *c = qobject_cast<Client*>(const_cast<Toplevel*>(*it));
if (!c) {
continue;
}
@ -1458,6 +1463,11 @@ QString Workspace::supportInformation() const
} else {
support.append(QStringLiteral("no\n"));
}
support.append(QStringLiteral("Active screen follows mouse: "));
if (screens()->isCurrentFollowsMouse())
support.append(QStringLiteral(" yes\n"));
else
support.append(QStringLiteral(" no\n"));
support.append(QStringLiteral("Number of Screens: %1\n").arg(screens()->count()));
for (int i=0; i<screens()->count(); ++i) {
const QRect geo = screens()->geometry(i);
@ -1555,6 +1565,11 @@ QString Workspace::supportInformation() const
} else {
support.append(QStringLiteral("OpenGL 2 Shaders are not used. Legacy OpenGL 1.x code path is used.\n"));
}
support.append(QStringLiteral("Painting blocks for vertical retrace: "));
if (m_compositor->scene()->blocksForRetrace())
support.append(QStringLiteral(" yes\n"));
else
support.append(QStringLiteral(" no\n"));
break;
}
case XRenderCompositing:

View File

@ -244,7 +244,7 @@ inline xcb_get_input_focus_cookie_t get_input_focus(xcb_connection_t *c, xcb_win
class CurrentInput : public Wrapper<xcb_get_input_focus_reply_t, xcb_get_input_focus_cookie_t, &xcb_get_input_focus_reply, &get_input_focus>
{
public:
CurrentInput() : Wrapper<xcb_get_input_focus_reply_t, xcb_get_input_focus_cookie_t, &xcb_get_input_focus_reply, &get_input_focus>() {}
CurrentInput() : Wrapper<xcb_get_input_focus_reply_t, xcb_get_input_focus_cookie_t, &xcb_get_input_focus_reply, &get_input_focus>(XCB_WINDOW_NONE) {}
inline xcb_window_t window() {
if (isNull())