TabBox uses signals to notify the effects

EffectsHandlerImpl just forwards the signals from TabBox. In order
to have a valid pointer to the TabBox, the TabBox is now initialized
before compositing in Workspace.
icc-effect-5.14.5
Martin Gräßlin 2011-03-06 12:15:16 +01:00
parent 94c301a089
commit 15757e953a
18 changed files with 112 additions and 96 deletions

View File

@ -26,6 +26,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "scene_xrender.h"
#include "scene_opengl.h"
#include "unmanaged.h"
#include "tabbox.h"
#include "workspace.h"
#include "kwinglutils.h"
@ -101,6 +102,10 @@ EffectsHandlerImpl::EffectsHandlerImpl(CompositingType type)
connect(ws, SIGNAL(unmanagedAdded(KWin::Unmanaged*)), this, SLOT(slotUnmanagedAdded(KWin::Unmanaged*)));
connect(ws, SIGNAL(clientActivated(KWin::Client*)), this, SLOT(slotClientActivated(KWin::Client*)));
connect(ws, SIGNAL(deletedRemoved(KWin::Deleted*)), this, SLOT(slotDeletedRemoved(KWin::Deleted*)));
connect(ws->tabBox(), SIGNAL(tabBoxAdded(int)), SIGNAL(tabBoxAdded(int)));
connect(ws->tabBox(), SIGNAL(tabBoxUpdated()), SIGNAL(tabBoxUpdated()));
connect(ws->tabBox(), SIGNAL(tabBoxClosed()), SIGNAL(tabBoxClosed()));
connect(ws->tabBox(), SIGNAL(tabBoxKeyEvent(QKeyEvent*)), SIGNAL(tabBoxKeyEvent(QKeyEvent*)));
// connect all clients
foreach (Client *c, ws->clientList()) {
setupClientConnections(c);
@ -400,30 +405,6 @@ void EffectsHandlerImpl::windowGeometryShapeChanged(EffectWindow* w, const QRect
ep.second->windowGeometryShapeChanged(w, old);
}
void EffectsHandlerImpl::tabBoxAdded(int mode)
{
foreach (const EffectPair & ep, loaded_effects)
ep.second->tabBoxAdded(mode);
}
void EffectsHandlerImpl::tabBoxClosed()
{
foreach (const EffectPair & ep, loaded_effects)
ep.second->tabBoxClosed();
}
void EffectsHandlerImpl::tabBoxUpdated()
{
foreach (const EffectPair & ep, loaded_effects)
ep.second->tabBoxUpdated();
}
void EffectsHandlerImpl::tabBoxKeyEvent(QKeyEvent* event)
{
foreach (const EffectPair & ep, loaded_effects)
ep.second->tabBoxKeyEvent(event);
}
void EffectsHandlerImpl::setActiveFullScreenEffect(Effect* e)
{
fullscreen_effect = e;

View File

@ -164,10 +164,6 @@ public:
void clientGroupItemRemoved(EffectWindow* c, EffectWindow* group);
void windowDamaged(EffectWindow* w, const QRect& r);
void windowGeometryShapeChanged(EffectWindow* w, const QRect& old);
void tabBoxAdded(int mode);
void tabBoxClosed();
void tabBoxUpdated();
void tabBoxKeyEvent(QKeyEvent* event);
bool borderActivated(ElectricBorder border);
void mouseChanged(const QPoint& pos, const QPoint& oldpos,
Qt::MouseButtons buttons, Qt::MouseButtons oldbuttons,

View File

@ -58,6 +58,9 @@ BoxSwitchEffect::BoxSwitchEffect()
highlight_margin = 10;
reconfigure(ReconfigureAll);
connect(effects, SIGNAL(windowClosed(EffectWindow*)), this, SLOT(slotWindowClosed(EffectWindow*)));
connect(effects, SIGNAL(tabBoxAdded(int)), this, SLOT(slotTabBoxAdded(int)));
connect(effects, SIGNAL(tabBoxClosed()), this, SLOT(slotTabBoxClosed()));
connect(effects, SIGNAL(tabBoxUpdated()), this, SLOT(slotTabBoxUpdated()));
}
BoxSwitchEffect::~BoxSwitchEffect()
@ -289,7 +292,7 @@ void BoxSwitchEffect::windowGeometryShapeChanged(EffectWindow* w, const QRect& o
}
}
void BoxSwitchEffect::tabBoxAdded(int mode)
void BoxSwitchEffect::slotTabBoxAdded(int mode)
{
if (!mActivated) {
if ((mode == TabBoxWindowsMode && primaryTabBox) ||
@ -315,13 +318,13 @@ void BoxSwitchEffect::tabBoxAdded(int mode)
}
}
void BoxSwitchEffect::tabBoxClosed()
void BoxSwitchEffect::slotTabBoxClosed()
{
if (mActivated)
setInactive();
}
void BoxSwitchEffect::tabBoxUpdated()
void BoxSwitchEffect::slotTabBoxUpdated()
{
if (mActivated) {
if ((mMode == TabBoxWindowsMode || mMode == TabBoxWindowsAlternativeMode)

View File

@ -55,15 +55,15 @@ public:
virtual void windowInputMouseEvent(Window w, QEvent* e);
virtual void windowDamaged(EffectWindow* w, const QRect& damage);
virtual void windowGeometryShapeChanged(EffectWindow* w, const QRect& old);
virtual void tabBoxAdded(int mode);
virtual void tabBoxClosed();
virtual void tabBoxUpdated();
virtual void* proxy();
void activateFromProxy(int mode, bool animate, bool showText, float positioningFactor);
void paintWindowsBox(const QRegion& region);
public Q_SLOTS:
void slotWindowClosed(EffectWindow* w);
void slotTabBoxAdded(int mode);
void slotTabBoxClosed();
void slotTabBoxUpdated();
private:
class ItemInfo;

View File

@ -71,6 +71,9 @@ CoverSwitchEffect::CoverSwitchEffect()
const QString fragmentshader = KGlobal::dirs()->findResource("data", "kwin/coverswitch-reflection.glsl");
m_reflectionShader = ShaderManager::instance()->loadFragmentShader(ShaderManager::GenericShader, fragmentshader);
connect(effects, SIGNAL(windowClosed(EffectWindow*)), this, SLOT(slotWindowClosed(EffectWindow*)));
connect(effects, SIGNAL(tabBoxAdded(int)), this, SLOT(slotTabBoxAdded(int)));
connect(effects, SIGNAL(tabBoxClosed()), this, SLOT(slotTabBoxClosed()));
connect(effects, SIGNAL(tabBoxUpdated()), this, SLOT(slotTabBoxUpdated()));
}
CoverSwitchEffect::~CoverSwitchEffect()
@ -527,7 +530,7 @@ void CoverSwitchEffect::paintWindow(EffectWindow* w, int mask, QRegion region, W
effects->paintWindow(w, mask, region, data);
}
void CoverSwitchEffect::tabBoxAdded(int mode)
void CoverSwitchEffect::slotTabBoxAdded(int mode)
{
if (effects->activeFullScreenEffect() && effects->activeFullScreenEffect() != this)
return;
@ -590,7 +593,7 @@ void CoverSwitchEffect::tabBoxAdded(int mode)
}
}
void CoverSwitchEffect::tabBoxClosed()
void CoverSwitchEffect::slotTabBoxClosed()
{
if (mActivated) {
if (animateStop) {
@ -612,7 +615,7 @@ void CoverSwitchEffect::tabBoxClosed()
}
}
void CoverSwitchEffect::tabBoxUpdated()
void CoverSwitchEffect::slotTabBoxUpdated()
{
if (mActivated) {
if (animateSwitch && currentWindowList.count() > 1) {

View File

@ -46,15 +46,15 @@ public:
virtual void paintScreen(int mask, QRegion region, ScreenPaintData& data);
virtual void postPaintScreen();
virtual void paintWindow(EffectWindow* w, int mask, QRegion region, WindowPaintData& data);
virtual void tabBoxAdded(int mode);
virtual void tabBoxClosed();
virtual void tabBoxUpdated();
virtual void windowInputMouseEvent(Window w, QEvent* e);
static bool supported();
public Q_SLOTS:
void slotWindowClosed(EffectWindow *c);
void slotTabBoxAdded(int mode);
void slotTabBoxClosed();
void slotTabBoxUpdated();
private:
void paintScene(EffectWindow* frontWindow, const EffectWindowList& leftWindows, const EffectWindowList& rightWindows,

View File

@ -103,6 +103,9 @@ CubeEffect::CubeEffect()
m_capShader = ShaderManager::instance()->loadFragmentShader(ShaderManager::GenericShader, capshader);
m_textureMirrorMatrix.scale(1.0, -1.0, 1.0);
m_textureMirrorMatrix.translate(0.0, -1.0, 0.0);
connect(effects, SIGNAL(tabBoxAdded(int)), this, SLOT(slotTabBoxAdded(int)));
connect(effects, SIGNAL(tabBoxClosed()), this, SLOT(slotTabBoxClosed()));
connect(effects, SIGNAL(tabBoxUpdated()), this, SLOT(slotTabBoxUpdated()));
reconfigure(ReconfigureAll);
}
@ -1969,7 +1972,7 @@ void CubeEffect::windowInputMouseEvent(Window w, QEvent* e)
}
}
void CubeEffect::tabBoxAdded(int mode)
void CubeEffect::slotTabBoxAdded(int mode)
{
if (activated)
return;
@ -1983,7 +1986,7 @@ void CubeEffect::tabBoxAdded(int mode)
}
}
void CubeEffect::tabBoxUpdated()
void CubeEffect::slotTabBoxUpdated()
{
if (activated) {
rotateToDesktop(effects->currentTabBoxDesktop());
@ -1991,7 +1994,7 @@ void CubeEffect::tabBoxUpdated()
}
}
void CubeEffect::tabBoxClosed()
void CubeEffect::slotTabBoxClosed()
{
if (activated) {
effects->unrefTabBox();

View File

@ -51,9 +51,6 @@ public:
virtual void mouseChanged(const QPoint& pos, const QPoint& oldpos, Qt::MouseButtons buttons,
Qt::MouseButtons oldbuttons, Qt::KeyboardModifiers modifiers, Qt::KeyboardModifiers oldmodifiers);
virtual void windowInputMouseEvent(Window w, QEvent* e);
virtual void tabBoxAdded(int mode);
virtual void tabBoxUpdated();
virtual void tabBoxClosed();
// proxy functions
virtual void* proxy();
@ -70,6 +67,9 @@ private slots:
void cubeShortcutChanged(const QKeySequence& seq);
void cylinderShortcutChanged(const QKeySequence& seq);
void sphereShortcutChanged(const QKeySequence& seq);
void slotTabBoxAdded(int mode);
void slotTabBoxUpdated();
void slotTabBoxClosed();
private:
enum RotationDirection {
Left,

View File

@ -71,6 +71,9 @@ FlipSwitchEffect::FlipSwitchEffect()
connect(b, SIGNAL(globalShortcutChanged(QKeySequence)), this, SLOT(globalShortcutChangedAll(QKeySequence)));
connect(effects, SIGNAL(windowAdded(EffectWindow*)), this, SLOT(slotWindowAdded(EffectWindow*)));
connect(effects, SIGNAL(windowClosed(EffectWindow*)), this, SLOT(slotWindowClosed(EffectWindow*)));
connect(effects, SIGNAL(tabBoxAdded(int)), this, SLOT(slotTabBoxAdded(int)));
connect(effects, SIGNAL(tabBoxClosed()), this, SLOT(slotTabBoxClosed()));
connect(effects, SIGNAL(tabBoxUpdated()), this, SLOT(slotTabBoxUpdated()));
}
FlipSwitchEffect::~FlipSwitchEffect()
@ -510,7 +513,7 @@ void FlipSwitchEffect::paintWindow(EffectWindow* w, int mask, QRegion region, Wi
//*************************************************************
// Tabbox handling
//*************************************************************
void FlipSwitchEffect::tabBoxAdded(int mode)
void FlipSwitchEffect::slotTabBoxAdded(int mode)
{
if (effects->activeFullScreenEffect() && effects->activeFullScreenEffect() != this)
return;
@ -525,7 +528,7 @@ void FlipSwitchEffect::tabBoxAdded(int mode)
}
}
void FlipSwitchEffect::tabBoxClosed()
void FlipSwitchEffect::slotTabBoxClosed()
{
if (m_active) {
setActive(false, TabboxMode);
@ -533,7 +536,7 @@ void FlipSwitchEffect::tabBoxClosed()
}
}
void FlipSwitchEffect::tabBoxUpdated()
void FlipSwitchEffect::slotTabBoxUpdated()
{
if (m_active && !m_stop) {
if (!effects->currentTabBoxWindowList().isEmpty()) {

View File

@ -44,9 +44,6 @@ public:
virtual void postPaintScreen();
virtual void prePaintWindow(EffectWindow *w, WindowPrePaintData &data, int time);
virtual void paintWindow(EffectWindow* w, int mask, QRegion region, WindowPaintData& data);
virtual void tabBoxAdded(int mode);
virtual void tabBoxClosed();
virtual void tabBoxUpdated();
virtual bool borderActivated(ElectricBorder border);
virtual void grabbedKeyboardEvent(QKeyEvent* e);
@ -58,6 +55,9 @@ private Q_SLOTS:
void globalShortcutChangedAll(QKeySequence shortcut);
void slotWindowAdded(EffectWindow* w);
void slotWindowClosed(EffectWindow *w);
void slotTabBoxAdded(int mode);
void slotTabBoxClosed();
void slotTabBoxUpdated();
private:
class ItemInfo;

View File

@ -101,6 +101,10 @@ PresentWindowsEffect::PresentWindowsEffect()
connect(effects, SIGNAL(windowAdded(EffectWindow*)), this, SLOT(slotWindowAdded(EffectWindow*)));
connect(effects, SIGNAL(windowClosed(EffectWindow*)), this, SLOT(slotWindowClosed(EffectWindow*)));
connect(effects, SIGNAL(windowDeleted(EffectWindow*)), this, SLOT(slotWindowDeleted(EffectWindow*)));
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(tabBoxKeyEvent(QKeyEvent*)), this, SLOT(slotTabBoxKeyEvent(QKeyEvent*)));
}
PresentWindowsEffect::~PresentWindowsEffect()
@ -662,7 +666,7 @@ void PresentWindowsEffect::grabbedKeyboardEvent(QKeyEvent *e)
//-----------------------------------------------------------------------------
// Tab box
void PresentWindowsEffect::tabBoxAdded(int mode)
void PresentWindowsEffect::slotTabBoxAdded(int mode)
{
if (effects->activeFullScreenEffect() && effects->activeFullScreenEffect() != this)
return;
@ -680,7 +684,7 @@ void PresentWindowsEffect::tabBoxAdded(int mode)
}
}
void PresentWindowsEffect::tabBoxClosed()
void PresentWindowsEffect::slotTabBoxClosed()
{
if (m_activated) {
effects->unrefTabBox();
@ -689,13 +693,13 @@ void PresentWindowsEffect::tabBoxClosed()
}
}
void PresentWindowsEffect::tabBoxUpdated()
void PresentWindowsEffect::slotTabBoxUpdated()
{
if (m_activated)
setHighlightedWindow(effects->currentTabBoxWindow());
}
void PresentWindowsEffect::tabBoxKeyEvent(QKeyEvent* event)
void PresentWindowsEffect::slotTabBoxKeyEvent(QKeyEvent* event)
{
if (!m_activated)
return;

View File

@ -107,12 +107,6 @@ public:
virtual void windowInputMouseEvent(Window w, QEvent *e);
virtual void grabbedKeyboardEvent(QKeyEvent *e);
// Tab box
virtual void tabBoxAdded(int mode);
virtual void tabBoxClosed();
virtual void tabBoxUpdated();
virtual void tabBoxKeyEvent(QKeyEvent* event);
// atoms
virtual void propertyNotify(EffectWindow* w, long atom);
@ -161,6 +155,11 @@ public slots:
void slotWindowAdded(EffectWindow *w);
void slotWindowClosed(EffectWindow *w);
void slotWindowDeleted(EffectWindow *w);
// Tab box
void slotTabBoxAdded(int mode);
void slotTabBoxClosed();
void slotTabBoxUpdated();
void slotTabBoxKeyEvent(QKeyEvent* event);
private slots:
void closeWindow();

View File

@ -155,22 +155,6 @@ void Effect::windowGeometryShapeChanged(EffectWindow*, const QRect&)
{
}
void Effect::tabBoxAdded(int)
{
}
void Effect::tabBoxClosed()
{
}
void Effect::tabBoxUpdated()
{
}
void Effect::tabBoxKeyEvent(QKeyEvent*)
{
}
bool Effect::borderActivated(ElectricBorder)
{
return false;

View File

@ -461,10 +461,6 @@ public:
*/
virtual void propertyNotify(EffectWindow* w, long atom);
virtual void tabBoxAdded(int mode);
virtual void tabBoxClosed();
virtual void tabBoxUpdated();
virtual void tabBoxKeyEvent(QKeyEvent* event);
virtual bool borderActivated(ElectricBorder border);
/**
@ -891,6 +887,45 @@ Q_SIGNALS:
* @since 4.7
**/
void windowUnminimized(EffectWindow *w);
/**
* Signal emitted when a tabbox is added.
* An effect who wants to replace the tabbox with itself should use @link refTabBox.
* @param mode The TabBoxMode.
* @see refTabBox
* @see tabBoxClosed
* @see tabBoxUpdated
* @see tabBoxKeyEvent
* @since 4.7
**/
void tabBoxAdded(int mode);
/**
* Signal emitted when the TabBox was closed by KWin core.
* An effect which referenced the TabBox should use @link unrefTabBox to unref again.
* @see unrefTabBox
* @see tabBoxAdded
* @since 4.7
**/
void tabBoxClosed();
/**
* Signal emitted when the selected TabBox window changed or the TabBox List changed.
* An effect should only response to this signal if it referenced the TabBox with @link refTabBox.
* @see refTabBox
* @see currentTabBoxWindowList
* @see currentTabBoxDesktopList
* @see currentTabBoxWindow
* @see currentTabBoxDesktop
* @since 4.7
**/
void tabBoxUpdated();
/**
* Signal emitted when a key event, which is not handled by TabBox directly is, happens while
* TabBox is active. An effect might use the key event to e.g. change the selected window.
* An effect should only response to this signal if it referenced the TabBox with @link refTabBox.
* @param event The key event not handled by TabBox directly
* @see refTabBox
* @since 4.7
**/
void tabBoxKeyEvent(QKeyEvent* event);
protected:
QVector< EffectPair > loaded_effects;

View File

@ -353,8 +353,7 @@ void TabBox::reset(bool partial_reset)
break;
}
if (effects)
static_cast<EffectsHandlerImpl*>(effects)->tabBoxUpdated();
emit tabBoxUpdated();
}
/*!
@ -363,9 +362,7 @@ void TabBox::reset(bool partial_reset)
void TabBox::nextPrev(bool next)
{
setCurrentIndex(m_tabBox->nextPrev(next), false);
if (effects)
static_cast<EffectsHandlerImpl*>(effects)->tabBoxUpdated();
emit tabBoxUpdated();
}
@ -448,8 +445,9 @@ void TabBox::TabBox::setCurrentIndex(QModelIndex index, bool notifyEffects)
return;
m_index = index;
m_tabBox->setCurrentIndex(index);
if (effects && notifyEffects)
static_cast<EffectsHandlerImpl*>(effects)->tabBoxUpdated();
if (notifyEffects) {
emit tabBoxUpdated();
}
}
/*!
@ -458,8 +456,7 @@ void TabBox::TabBox::setCurrentIndex(QModelIndex index, bool notifyEffects)
*/
void TabBox::show()
{
if (effects)
static_cast<EffectsHandlerImpl*>(effects)->tabBoxAdded(m_tabBoxMode);
emit tabBoxAdded(m_tabBoxMode);
if (isDisplayed()) {
m_isShown = false;
return;
@ -480,8 +477,7 @@ void TabBox::hide(bool abort)
m_isShown = false;
unrefDisplay();
}
if (effects)
static_cast<EffectsHandlerImpl*>(effects)->tabBoxClosed();
emit tabBoxClosed();
if (isDisplayed())
kDebug(1212) << "Tab box was not properly closed by an effect";
m_index = QModelIndex();
@ -620,10 +616,9 @@ void TabBox::handleMouseEvent(XEvent* e)
void TabBox::TabBox::grabbedKeyEvent(QKeyEvent* event)
{
emit tabBoxKeyEvent(event);
if (!m_isShown && isDisplayed()) {
// tabbox has been replaced, check effects
if (effects)
static_cast<EffectsHandlerImpl*>(effects)->tabBoxKeyEvent(event);
return;
}
setCurrentIndex(m_tabBox->grabbedKeyEvent(event));

View File

@ -126,6 +126,12 @@ public:
public slots:
void show();
signals:
void tabBoxAdded(int);
void tabBoxClosed();
void tabBoxUpdated();
void tabBoxKeyEvent(QKeyEvent*);
private:
void setCurrentIndex(QModelIndex index, bool notifyEffects = true);
void loadConfig(const KConfigGroup& config, TabBoxConfig& tabBoxConfig);

View File

@ -217,6 +217,8 @@ Workspace::Workspace(bool restore)
);
Extensions::init();
// need to create the tabbox before compositing scene is setup
tab_box = new TabBox::TabBox(this);
setupCompositing();
// Compatibility
@ -235,7 +237,6 @@ Workspace::Workspace(bool restore)
client_keys = new KActionCollection(this);
initShortcuts();
tab_box = new TabBox::TabBox(this);
desktop_change_osd = new DesktopChangeOSD(this);
init();

View File

@ -385,6 +385,9 @@ public:
void refTabBox();
void unrefTabBox();
void closeTabBox(bool abort = false);
TabBox::TabBox *tabBox() const {
return tab_box;
}
// Tabbing
void addClientGroup(ClientGroup* group);