2010-04-25 16:43:14 +00:00
|
|
|
/********************************************************************
|
|
|
|
KWin - the KDE window manager
|
|
|
|
This file is part of the KDE project.
|
|
|
|
|
|
|
|
Copyright (C) 2009 Nikhil Marathe <nsm.nikhil@gmail.com>
|
2011-07-13 16:48:56 +00:00
|
|
|
Copyright (C) 2011 Arthur Arlt <a.arlt@stud.uni-heidelberg.de>
|
2010-04-25 16:43:14 +00:00
|
|
|
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
|
|
it under the terms of the GNU General Public License as published by
|
|
|
|
the Free Software Foundation; either version 2 of the License, or
|
|
|
|
(at your option) any later version.
|
|
|
|
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
GNU General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
*********************************************************************/
|
|
|
|
|
2011-07-13 16:48:56 +00:00
|
|
|
#include <tiling/tiling.h>
|
2010-04-25 16:43:14 +00:00
|
|
|
|
|
|
|
#include <klocale.h>
|
2011-07-13 16:48:56 +00:00
|
|
|
#include <knotification.h>
|
2010-06-14 15:17:17 +00:00
|
|
|
#include <kwindowinfo.h>
|
|
|
|
#include <kwindowsystem.h>
|
2010-04-25 16:43:14 +00:00
|
|
|
|
2011-07-13 16:48:56 +00:00
|
|
|
#include "tile.h"
|
|
|
|
#include "tilinglayout.h"
|
|
|
|
#include "tilinglayoutfactory.h"
|
|
|
|
#include "workspace.h"
|
|
|
|
|
|
|
|
namespace KWin {
|
|
|
|
Tiling::Tiling(KWin::Workspace* w)
|
|
|
|
: QObject(w)
|
|
|
|
, m_workspace(w)
|
|
|
|
, tilingEnabled_(false)
|
|
|
|
{
|
|
|
|
}
|
2010-04-25 16:43:14 +00:00
|
|
|
|
2011-07-13 16:48:56 +00:00
|
|
|
Tiling::~Tiling()
|
2010-04-25 16:43:14 +00:00
|
|
|
{
|
2011-07-13 16:48:56 +00:00
|
|
|
}
|
2010-04-25 16:43:14 +00:00
|
|
|
|
2011-07-13 16:48:56 +00:00
|
|
|
bool Tiling::tilingEnabled() const
|
2011-01-30 14:34:42 +00:00
|
|
|
{
|
2010-05-05 12:09:49 +00:00
|
|
|
return tilingEnabled_;
|
2011-01-30 14:34:42 +00:00
|
|
|
}
|
2010-04-25 16:43:14 +00:00
|
|
|
|
2011-07-13 16:48:56 +00:00
|
|
|
void Tiling::setTilingEnabled(bool tiling)
|
2011-01-30 14:34:42 +00:00
|
|
|
{
|
|
|
|
if (tilingEnabled() == tiling) return;
|
2010-09-12 06:06:23 +00:00
|
|
|
|
2010-05-05 12:09:49 +00:00
|
|
|
tilingEnabled_ = tiling;
|
2010-04-25 16:43:14 +00:00
|
|
|
|
2010-09-12 06:06:23 +00:00
|
|
|
KSharedConfig::Ptr _config = KGlobal::config();
|
2011-01-30 14:34:42 +00:00
|
|
|
KConfigGroup config(_config, "Windows");
|
2010-09-12 06:06:23 +00:00
|
|
|
config.writeEntry("TilingOn", tilingEnabled_);
|
|
|
|
config.sync();
|
|
|
|
options->tilingOn = tilingEnabled_;
|
2011-01-30 14:34:42 +00:00
|
|
|
options->tilingLayout = static_cast<TilingLayoutFactory::Layouts>(config.readEntry("TilingDefaultLayout", 0));
|
|
|
|
options->tilingRaisePolicy = config.readEntry("TilingRaisePolicy", 0);
|
|
|
|
|
|
|
|
if (tilingEnabled_) {
|
2011-07-15 19:52:19 +00:00
|
|
|
connect(m_workspace, SIGNAL(clientAdded(KWin::Client*)), this, SLOT(createTile(KWin::Client*)));
|
|
|
|
connect(m_workspace, SIGNAL(clientAdded(KWin::Client*)), this, SLOT(slotResizeTilingLayouts()));
|
|
|
|
connect(m_workspace, SIGNAL(numberDesktopsChanged(int)), this, SLOT(slotResizeTilingLayouts()));
|
|
|
|
connect(m_workspace, SIGNAL(clientRemoved(KWin::Client*)), this, SLOT(removeTile(KWin::Client*)));
|
2011-07-13 16:48:56 +00:00
|
|
|
tilingLayouts.resize(Workspace::self()->numberOfDesktops() + 1);
|
|
|
|
foreach (Client * c, Workspace::self()->stackingOrder()) {
|
2011-01-30 14:34:42 +00:00
|
|
|
createTile(c);
|
2010-04-25 16:43:14 +00:00
|
|
|
}
|
2011-01-30 14:34:42 +00:00
|
|
|
} else {
|
2011-07-15 19:52:19 +00:00
|
|
|
disconnect(m_workspace, SIGNAL(clientAdded(KWin::Client*)));
|
|
|
|
disconnect(m_workspace, SIGNAL(numberDesktopsChanged(int)));
|
|
|
|
disconnect(m_workspace, SIGNAL(clientRemoved(KWin::Client*)));
|
2011-01-30 14:34:42 +00:00
|
|
|
qDeleteAll(tilingLayouts);
|
2010-04-25 16:43:14 +00:00
|
|
|
tilingLayouts.clear();
|
|
|
|
}
|
2011-01-30 14:34:42 +00:00
|
|
|
}
|
2010-04-25 16:43:14 +00:00
|
|
|
|
2011-07-13 16:48:56 +00:00
|
|
|
void Tiling::slotToggleTiling()
|
2011-01-30 14:34:42 +00:00
|
|
|
{
|
|
|
|
if (tilingEnabled()) {
|
|
|
|
setTilingEnabled(false);
|
|
|
|
QString message = i18n("Tiling Disabled");
|
|
|
|
KNotification::event("tilingdisabled", message, QPixmap(), NULL, KNotification::CloseOnTimeout, KComponentData("kwin"));
|
|
|
|
} else {
|
|
|
|
setTilingEnabled(true);
|
|
|
|
QString message = i18n("Tiling Enabled");
|
|
|
|
KNotification::event("tilingenabled", message, QPixmap(), NULL, KNotification::CloseOnTimeout, KComponentData("kwin"));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-07-13 16:48:56 +00:00
|
|
|
void Tiling::createTile(Client* c)
|
2011-01-30 14:34:42 +00:00
|
|
|
{
|
|
|
|
if (c == NULL)
|
2010-05-05 11:46:19 +00:00
|
|
|
return;
|
|
|
|
|
2011-01-30 14:34:42 +00:00
|
|
|
if (c->desktop() < 0 || c->desktop() >= tilingLayouts.size()) return;
|
2010-04-25 16:43:14 +00:00
|
|
|
|
|
|
|
kDebug(1212) << "Now tiling " << c->caption();
|
2011-01-30 14:34:42 +00:00
|
|
|
if (!tilingEnabled() || !tileable(c))
|
2010-04-25 16:43:14 +00:00
|
|
|
return;
|
|
|
|
|
2011-07-13 16:48:56 +00:00
|
|
|
Tile *t = new Tile(c, Workspace::self()->clientArea(PlacementArea, c));
|
2011-01-30 14:34:42 +00:00
|
|
|
if (!tileable(c)) {
|
2010-04-25 16:43:14 +00:00
|
|
|
kDebug(1212) << c->caption() << "is not tileable";
|
|
|
|
t->floatTile();
|
|
|
|
}
|
|
|
|
|
2011-01-30 14:34:42 +00:00
|
|
|
if (!tilingLayouts.value(c->desktop())) {
|
2011-07-13 16:48:56 +00:00
|
|
|
tilingLayouts[c->desktop()] = TilingLayoutFactory::createLayout(TilingLayoutFactory::DefaultLayout, m_workspace);
|
2010-04-25 16:43:14 +00:00
|
|
|
}
|
2011-01-30 14:34:42 +00:00
|
|
|
tilingLayouts[c->desktop()]->addTile(t);
|
|
|
|
tilingLayouts[c->desktop()]->commit();
|
|
|
|
}
|
2010-04-25 16:43:14 +00:00
|
|
|
|
2011-07-13 16:48:56 +00:00
|
|
|
void Tiling::removeTile(Client *c)
|
2011-01-30 14:34:42 +00:00
|
|
|
{
|
2011-07-15 19:52:19 +00:00
|
|
|
if (!tilingLayouts.value(c->desktop())) {
|
|
|
|
return;
|
|
|
|
}
|
2011-01-30 14:34:42 +00:00
|
|
|
if (tilingLayouts[ c->desktop()])
|
|
|
|
tilingLayouts[ c->desktop()]->removeTile(c);
|
|
|
|
}
|
|
|
|
|
2011-07-13 16:48:56 +00:00
|
|
|
bool Tiling::tileable(Client* c)
|
2011-01-30 14:34:42 +00:00
|
|
|
{
|
2010-06-14 15:17:17 +00:00
|
|
|
kDebug(1212) << c->caption();
|
2011-01-30 14:34:42 +00:00
|
|
|
KWindowInfo info = KWindowSystem::windowInfo(c->window(), -1U, NET::WM2WindowClass);
|
|
|
|
kDebug(1212) << "WINDOW CLASS IS " << info.windowClassClass();
|
|
|
|
if (info.windowClassClass() == "Plasma-desktop") {
|
2010-04-25 16:43:14 +00:00
|
|
|
return false;
|
2011-01-30 14:34:42 +00:00
|
|
|
}
|
2010-06-14 15:17:17 +00:00
|
|
|
// TODO: if application specific settings
|
|
|
|
// to ignore, put them here
|
2010-04-25 16:43:14 +00:00
|
|
|
|
2011-01-30 14:34:42 +00:00
|
|
|
if (!c->isNormalWindow()) {
|
|
|
|
return false;
|
|
|
|
}
|
2010-04-25 16:43:14 +00:00
|
|
|
|
2010-05-05 12:29:35 +00:00
|
|
|
// 0 means tile it, if we get 1 (floating), don't tile
|
2011-01-30 14:34:42 +00:00
|
|
|
if (c->rules()->checkTilingOption(0) == 1) {
|
2010-05-05 12:29:35 +00:00
|
|
|
return false;
|
2011-01-30 14:34:42 +00:00
|
|
|
}
|
2010-05-05 12:29:35 +00:00
|
|
|
|
2010-06-14 15:17:17 +00:00
|
|
|
kDebug() << "Tiling" << c;
|
2010-04-25 16:43:14 +00:00
|
|
|
return true;
|
2011-01-30 14:34:42 +00:00
|
|
|
}
|
2010-04-25 16:43:14 +00:00
|
|
|
|
2011-07-13 16:48:56 +00:00
|
|
|
void Tiling::belowCursor()
|
2011-01-30 14:34:42 +00:00
|
|
|
{
|
|
|
|
// TODO
|
|
|
|
}
|
2010-04-25 16:43:14 +00:00
|
|
|
|
2011-07-13 16:48:56 +00:00
|
|
|
Tile* Tiling::getNiceTile() const
|
2011-01-30 14:34:42 +00:00
|
|
|
{
|
|
|
|
if (!tilingEnabled()) return NULL;
|
2011-07-13 16:48:56 +00:00
|
|
|
if (!tilingLayouts.value(m_workspace->activeClient()->desktop())) return NULL;
|
2011-01-30 14:34:42 +00:00
|
|
|
|
2011-07-13 16:48:56 +00:00
|
|
|
return tilingLayouts[ m_workspace->activeClient()->desktop()]->findTile(m_workspace->activeClient());
|
2010-04-25 16:43:14 +00:00
|
|
|
// TODO
|
2011-01-30 14:34:42 +00:00
|
|
|
}
|
2010-04-25 16:43:14 +00:00
|
|
|
|
2011-07-13 16:48:56 +00:00
|
|
|
void Tiling::updateAllTiles()
|
2011-01-30 14:34:42 +00:00
|
|
|
{
|
|
|
|
foreach (TilingLayout * t, tilingLayouts) {
|
|
|
|
if (!t) continue;
|
2010-04-25 16:43:14 +00:00
|
|
|
t->commit();
|
|
|
|
}
|
2011-01-30 14:34:42 +00:00
|
|
|
}
|
2010-04-25 16:43:14 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Resize the neighbouring clients to close any gaps
|
|
|
|
*/
|
2011-07-13 16:48:56 +00:00
|
|
|
void Tiling::notifyTilingWindowResize(Client *c, const QRect &moveResizeGeom, const QRect &orig)
|
2011-01-30 14:34:42 +00:00
|
|
|
{
|
|
|
|
if (tilingLayouts.value(c->desktop()) == NULL)
|
2010-04-25 16:43:14 +00:00
|
|
|
return;
|
2011-01-30 14:34:42 +00:00
|
|
|
tilingLayouts[ c->desktop()]->clientResized(c, moveResizeGeom, orig);
|
|
|
|
}
|
2010-04-25 16:43:14 +00:00
|
|
|
|
2011-07-13 16:48:56 +00:00
|
|
|
void Tiling::notifyTilingWindowMove(Client *c, const QRect &moveResizeGeom, const QRect &orig)
|
2011-01-30 14:34:42 +00:00
|
|
|
{
|
|
|
|
if (tilingLayouts.value(c->desktop()) == NULL) {
|
2010-04-25 16:43:14 +00:00
|
|
|
return;
|
|
|
|
}
|
2011-01-30 14:34:42 +00:00
|
|
|
tilingLayouts[ c->desktop()]->clientMoved(c, moveResizeGeom, orig);
|
|
|
|
updateAllTiles();
|
|
|
|
}
|
2010-04-25 16:43:14 +00:00
|
|
|
|
2011-07-13 16:48:56 +00:00
|
|
|
void Tiling::notifyTilingWindowResizeDone(Client *c, const QRect &moveResizeGeom, const QRect &orig, bool canceled)
|
2011-01-30 14:34:42 +00:00
|
|
|
{
|
|
|
|
if (canceled)
|
|
|
|
notifyTilingWindowResize(c, orig, moveResizeGeom);
|
2010-04-25 16:43:14 +00:00
|
|
|
else
|
2011-01-30 14:34:42 +00:00
|
|
|
notifyTilingWindowResize(c, moveResizeGeom, orig);
|
|
|
|
}
|
2010-04-25 16:43:14 +00:00
|
|
|
|
2011-07-13 16:48:56 +00:00
|
|
|
void Tiling::notifyTilingWindowMoveDone(Client *c, const QRect &moveResizeGeom, const QRect &orig, bool canceled)
|
2011-01-30 14:34:42 +00:00
|
|
|
{
|
|
|
|
if (canceled)
|
|
|
|
notifyTilingWindowMove(c, orig, moveResizeGeom);
|
2010-04-25 16:43:14 +00:00
|
|
|
else
|
2011-01-30 14:34:42 +00:00
|
|
|
notifyTilingWindowMove(c, moveResizeGeom, orig);
|
|
|
|
}
|
2010-04-25 16:43:14 +00:00
|
|
|
|
2011-07-13 16:48:56 +00:00
|
|
|
void Tiling::notifyTilingWindowDesktopChanged(Client *c, int old_desktop)
|
2011-01-30 14:34:42 +00:00
|
|
|
{
|
2011-07-13 16:48:56 +00:00
|
|
|
if (c->desktop() < 1 || c->desktop() > m_workspace->numberOfDesktops())
|
2010-04-25 16:43:14 +00:00
|
|
|
return;
|
|
|
|
|
2011-01-30 14:34:42 +00:00
|
|
|
if (tilingLayouts.value(old_desktop)) {
|
|
|
|
Tile *t = tilingLayouts[ old_desktop ]->findTile(c);
|
|
|
|
|
2010-04-25 16:43:14 +00:00
|
|
|
// TODO: copied from createTile(), move this into separate method?
|
2011-01-30 14:34:42 +00:00
|
|
|
if (!tilingLayouts.value(c->desktop())) {
|
2011-07-13 16:48:56 +00:00
|
|
|
tilingLayouts[c->desktop()] = TilingLayoutFactory::createLayout(TilingLayoutFactory::DefaultLayout, m_workspace);
|
2011-01-30 14:34:42 +00:00
|
|
|
}
|
2010-04-25 16:43:14 +00:00
|
|
|
|
2011-01-30 14:34:42 +00:00
|
|
|
if (t)
|
|
|
|
tilingLayouts[ c->desktop()]->addTile(t);
|
2010-04-25 16:43:14 +00:00
|
|
|
|
2011-01-30 14:34:42 +00:00
|
|
|
tilingLayouts[ old_desktop ]->removeTile(c);
|
2010-04-25 16:43:14 +00:00
|
|
|
tilingLayouts[ old_desktop ]->commit();
|
|
|
|
}
|
2011-01-30 14:34:42 +00:00
|
|
|
}
|
2010-04-25 16:43:14 +00:00
|
|
|
|
|
|
|
/*
|
2010-05-09 06:15:40 +00:00
|
|
|
* Implements the 3 raising modes in Window Behaviour -> Advanced
|
2010-04-25 16:43:14 +00:00
|
|
|
*/
|
2011-07-13 16:48:56 +00:00
|
|
|
void Tiling::notifyTilingWindowActivated(Client *c)
|
2011-01-30 14:34:42 +00:00
|
|
|
{
|
|
|
|
if (c == NULL)
|
2010-04-25 16:43:14 +00:00
|
|
|
return;
|
|
|
|
|
2011-01-30 14:34:42 +00:00
|
|
|
if (options->tilingRaisePolicy == 1) // individual raise/lowers
|
2010-04-25 16:43:14 +00:00
|
|
|
return;
|
|
|
|
|
2011-01-30 14:34:42 +00:00
|
|
|
if (tilingLayouts.value(c->desktop())) {
|
|
|
|
QList<Tile *> tiles = tilingLayouts[ c->desktop()]->tiles();
|
2010-04-25 16:43:14 +00:00
|
|
|
|
2011-07-13 16:48:56 +00:00
|
|
|
StackingUpdatesBlocker blocker(m_workspace);
|
2010-04-25 16:43:14 +00:00
|
|
|
|
2011-01-30 14:34:42 +00:00
|
|
|
Tile *tile_to_raise = tilingLayouts[ c->desktop()]->findTile(c);
|
2010-04-25 16:43:14 +00:00
|
|
|
|
2011-01-30 14:34:42 +00:00
|
|
|
if (!tile_to_raise) {
|
2010-04-25 16:43:14 +00:00
|
|
|
return;
|
2011-01-30 14:34:42 +00:00
|
|
|
}
|
2010-04-25 16:43:14 +00:00
|
|
|
|
|
|
|
kDebug(1212) << "FOUND TILE";
|
|
|
|
bool raise_floating = false;
|
2011-01-30 14:34:42 +00:00
|
|
|
if (options->tilingRaisePolicy == 2) // floating always on top
|
2010-04-25 16:43:14 +00:00
|
|
|
raise_floating = true;
|
|
|
|
else
|
|
|
|
raise_floating = tile_to_raise->floating();
|
|
|
|
|
2011-01-30 14:34:42 +00:00
|
|
|
foreach (Tile * t, tiles) {
|
|
|
|
if (t->floating() == raise_floating && t != tile_to_raise)
|
2011-07-13 16:48:56 +00:00
|
|
|
m_workspace->raiseClient(t->client());
|
2011-01-30 14:34:42 +00:00
|
|
|
}
|
2010-04-25 16:43:14 +00:00
|
|
|
// raise the current tile last so that it ends up on top
|
|
|
|
// but only if it supposed to be raised, required to support tilingRaisePolicy
|
|
|
|
kDebug(1212) << "Raise floating? " << raise_floating << "to raise is floating?" << tile_to_raise->floating();
|
2011-01-30 14:34:42 +00:00
|
|
|
if (tile_to_raise->floating() == raise_floating)
|
2011-07-13 16:48:56 +00:00
|
|
|
m_workspace->raiseClient(tile_to_raise->client());
|
2010-04-25 16:43:14 +00:00
|
|
|
}
|
2011-01-30 14:34:42 +00:00
|
|
|
}
|
2010-04-25 16:43:14 +00:00
|
|
|
|
2011-07-13 16:48:56 +00:00
|
|
|
void Tiling::notifyTilingWindowMinimizeToggled(Client *c)
|
2011-01-30 14:34:42 +00:00
|
|
|
{
|
|
|
|
if (tilingLayouts.value(c->desktop())) {
|
|
|
|
tilingLayouts[ c->desktop()]->clientMinimizeToggled(c);
|
2010-04-25 16:43:14 +00:00
|
|
|
}
|
2011-01-30 14:34:42 +00:00
|
|
|
}
|
2010-04-25 16:43:14 +00:00
|
|
|
|
2011-07-13 16:48:56 +00:00
|
|
|
void Tiling::notifyTilingWindowMaximized(Client *c, Options::WindowOperation op)
|
2011-01-30 14:34:42 +00:00
|
|
|
{
|
|
|
|
if (tilingLayouts.value(c->desktop())) {
|
|
|
|
Tile *t = tilingLayouts[ c->desktop()]->findTile(c);
|
|
|
|
if (!t) {
|
|
|
|
createTile(c);
|
|
|
|
t = tilingLayouts[ c->desktop()]->findTile(c);
|
2010-04-25 16:43:14 +00:00
|
|
|
|
|
|
|
// if still no tile, it couldn't be tiled
|
|
|
|
// so ignore it
|
2011-01-30 14:34:42 +00:00
|
|
|
if (!t)
|
2010-04-25 16:43:14 +00:00
|
|
|
return;
|
2011-01-30 14:34:42 +00:00
|
|
|
}
|
2010-04-25 16:43:14 +00:00
|
|
|
|
|
|
|
// if window IS tiled and a maximize
|
|
|
|
// is attempted, make the window float.
|
|
|
|
// That is all we do since that can
|
|
|
|
// mess up the layout.
|
|
|
|
// In all other cases, don't do
|
|
|
|
// anything, let the user manage toggling
|
|
|
|
// using Meta+F
|
2011-01-30 14:34:42 +00:00
|
|
|
if (!t->floating()
|
|
|
|
&& (op == Options::MaximizeOp
|
|
|
|
|| op == Options::HMaximizeOp
|
|
|
|
|| op == Options::VMaximizeOp)) {
|
|
|
|
tilingLayouts[ c->desktop()]->toggleFloatTile(c);
|
2010-04-25 16:43:14 +00:00
|
|
|
}
|
2011-01-30 14:34:42 +00:00
|
|
|
|
2010-04-25 16:43:14 +00:00
|
|
|
}
|
2011-01-30 14:34:42 +00:00
|
|
|
}
|
2010-04-25 16:43:14 +00:00
|
|
|
|
2011-07-13 16:48:56 +00:00
|
|
|
Tile* Tiling::findAdjacentTile(Tile *ref, int d)
|
2011-01-30 14:34:42 +00:00
|
|
|
{
|
2010-04-25 16:43:14 +00:00
|
|
|
QRect reference = ref->geometry();
|
|
|
|
QPoint origin = reference.center();
|
|
|
|
|
|
|
|
Tile *closest = NULL;
|
|
|
|
int minDist = -1;
|
|
|
|
|
2011-01-30 14:34:42 +00:00
|
|
|
QList<Tile *> tiles = tilingLayouts[ ref->client()->desktop()]->tiles();
|
2010-04-25 16:43:14 +00:00
|
|
|
|
2011-01-30 14:34:42 +00:00
|
|
|
foreach (Tile * t, tiles) {
|
|
|
|
if (t->client() == ref->client() || t->ignoreGeometry())
|
2010-04-25 16:43:14 +00:00
|
|
|
continue;
|
|
|
|
|
|
|
|
bool consider = false;
|
|
|
|
|
|
|
|
QRect other = t->geometry();
|
|
|
|
QPoint otherCenter = other.center();
|
|
|
|
|
2011-01-30 14:34:42 +00:00
|
|
|
switch(d) {
|
|
|
|
case Tile::Top:
|
|
|
|
consider = otherCenter.y() < origin.y()
|
|
|
|
&& other.bottom() < reference.top();
|
|
|
|
break;
|
|
|
|
|
|
|
|
case Tile::Right:
|
|
|
|
consider = otherCenter.x() > origin.x()
|
|
|
|
&& other.left() > reference.right();
|
|
|
|
break;
|
|
|
|
|
|
|
|
case Tile::Bottom:
|
|
|
|
consider = otherCenter.y() > origin.y()
|
|
|
|
&& other.top() > reference.bottom();
|
|
|
|
break;
|
|
|
|
|
|
|
|
case Tile::Left:
|
|
|
|
consider = otherCenter.x() < origin.x()
|
|
|
|
&& other.right() < reference.left();
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
abort();
|
|
|
|
}
|
2010-04-25 16:43:14 +00:00
|
|
|
|
2011-01-30 14:34:42 +00:00
|
|
|
if (consider) {
|
|
|
|
int dist = (otherCenter - origin).manhattanLength();
|
|
|
|
if (minDist > dist || minDist < 0) {
|
|
|
|
minDist = dist;
|
|
|
|
closest = t;
|
2010-04-25 16:43:14 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2011-01-30 14:34:42 +00:00
|
|
|
return closest;
|
|
|
|
}
|
2010-04-25 16:43:14 +00:00
|
|
|
|
2011-07-13 16:48:56 +00:00
|
|
|
void Tiling::focusTile(int d)
|
2011-01-30 14:34:42 +00:00
|
|
|
{
|
2010-04-25 16:43:14 +00:00
|
|
|
Tile *t = getNiceTile();
|
2011-01-30 14:34:42 +00:00
|
|
|
if (t) {
|
|
|
|
Tile *adj = findAdjacentTile(t, d);
|
|
|
|
if (adj)
|
2011-07-13 16:48:56 +00:00
|
|
|
m_workspace->activateClient(adj->client());
|
2010-04-25 16:43:14 +00:00
|
|
|
}
|
2011-01-30 14:34:42 +00:00
|
|
|
}
|
2010-04-25 16:43:14 +00:00
|
|
|
|
2011-07-13 16:48:56 +00:00
|
|
|
void Tiling::moveTile(int d)
|
2011-01-30 14:34:42 +00:00
|
|
|
{
|
2010-04-25 16:43:14 +00:00
|
|
|
Tile *t = getNiceTile();
|
2011-01-30 14:34:42 +00:00
|
|
|
if (t) {
|
|
|
|
Tile* adj = findAdjacentTile(t, d);
|
2010-04-25 16:43:14 +00:00
|
|
|
|
2011-01-30 14:34:42 +00:00
|
|
|
tilingLayouts[ t->client()->desktop()]->swapTiles(t, adj);
|
2010-04-25 16:43:14 +00:00
|
|
|
}
|
2011-01-30 14:34:42 +00:00
|
|
|
}
|
2010-04-25 16:43:14 +00:00
|
|
|
|
2011-07-13 16:48:56 +00:00
|
|
|
void Tiling::slotFocusTileLeft()
|
2011-01-30 14:34:42 +00:00
|
|
|
{
|
|
|
|
focusTile(Tile::Left);
|
|
|
|
}
|
2010-04-25 16:43:14 +00:00
|
|
|
|
2011-07-13 16:48:56 +00:00
|
|
|
void Tiling::slotFocusTileRight()
|
2011-01-30 14:34:42 +00:00
|
|
|
{
|
|
|
|
focusTile(Tile::Right);
|
|
|
|
}
|
2010-04-25 16:43:14 +00:00
|
|
|
|
2011-07-13 16:48:56 +00:00
|
|
|
void Tiling::slotFocusTileTop()
|
2011-01-30 14:34:42 +00:00
|
|
|
{
|
|
|
|
focusTile(Tile::Top);
|
|
|
|
}
|
2010-04-25 16:43:14 +00:00
|
|
|
|
2011-07-13 16:48:56 +00:00
|
|
|
void Tiling::slotFocusTileBottom()
|
2011-01-30 14:34:42 +00:00
|
|
|
{
|
|
|
|
focusTile(Tile::Bottom);
|
|
|
|
}
|
2010-04-25 16:43:14 +00:00
|
|
|
|
2011-07-13 16:48:56 +00:00
|
|
|
void Tiling::slotMoveTileLeft()
|
2011-01-30 14:34:42 +00:00
|
|
|
{
|
|
|
|
moveTile(Tile::Left);
|
|
|
|
}
|
2010-04-25 16:43:14 +00:00
|
|
|
|
2011-07-13 16:48:56 +00:00
|
|
|
void Tiling::slotMoveTileRight()
|
2011-01-30 14:34:42 +00:00
|
|
|
{
|
|
|
|
moveTile(Tile::Right);
|
|
|
|
}
|
2010-04-25 16:43:14 +00:00
|
|
|
|
2011-07-13 16:48:56 +00:00
|
|
|
void Tiling::slotMoveTileTop()
|
2011-01-30 14:34:42 +00:00
|
|
|
{
|
|
|
|
moveTile(Tile::Top);
|
|
|
|
}
|
2010-04-25 16:43:14 +00:00
|
|
|
|
2011-07-13 16:48:56 +00:00
|
|
|
void Tiling::slotMoveTileBottom()
|
2011-01-30 14:34:42 +00:00
|
|
|
{
|
|
|
|
moveTile(Tile::Bottom);
|
|
|
|
}
|
2010-04-25 16:43:14 +00:00
|
|
|
|
2011-07-13 16:48:56 +00:00
|
|
|
void Tiling::slotToggleFloating()
|
2011-01-30 14:34:42 +00:00
|
|
|
{
|
2011-07-13 16:48:56 +00:00
|
|
|
Client *c = m_workspace->activeClient();
|
2011-01-30 14:34:42 +00:00
|
|
|
if (tilingLayouts.value(c->desktop())) {
|
|
|
|
tilingLayouts[ c->desktop()]->toggleFloatTile(c);
|
2010-04-25 16:43:14 +00:00
|
|
|
}
|
2011-01-30 14:34:42 +00:00
|
|
|
}
|
2010-04-25 16:43:14 +00:00
|
|
|
|
2011-07-13 16:48:56 +00:00
|
|
|
void Tiling::slotNextTileLayout()
|
2011-01-30 14:34:42 +00:00
|
|
|
{
|
2011-07-13 16:48:56 +00:00
|
|
|
if (tilingLayouts.value(m_workspace->currentDesktop())) {
|
2010-04-25 16:43:14 +00:00
|
|
|
|
2011-07-13 16:48:56 +00:00
|
|
|
tilingLayouts.replace(m_workspace->currentDesktop(), TilingLayoutFactory::nextLayout(tilingLayouts[m_workspace->currentDesktop()]));
|
2010-04-25 16:43:14 +00:00
|
|
|
|
2011-07-13 16:48:56 +00:00
|
|
|
tilingLayouts[m_workspace->currentDesktop()]->commit();
|
2010-04-25 16:43:14 +00:00
|
|
|
}
|
2011-01-30 14:34:42 +00:00
|
|
|
}
|
2010-04-25 16:43:14 +00:00
|
|
|
|
2011-07-13 16:48:56 +00:00
|
|
|
void Tiling::slotPreviousTileLayout()
|
2011-01-30 14:34:42 +00:00
|
|
|
{
|
2011-07-13 16:48:56 +00:00
|
|
|
if (tilingLayouts.value(m_workspace->currentDesktop())) {
|
2010-04-25 16:43:14 +00:00
|
|
|
|
2011-07-13 16:48:56 +00:00
|
|
|
tilingLayouts.replace(m_workspace->currentDesktop(), TilingLayoutFactory::previousLayout(tilingLayouts[m_workspace->currentDesktop()]));
|
2010-04-25 16:43:14 +00:00
|
|
|
|
2011-07-13 16:48:56 +00:00
|
|
|
tilingLayouts[m_workspace->currentDesktop()]->commit();
|
2010-04-25 16:43:14 +00:00
|
|
|
}
|
2011-01-30 14:34:42 +00:00
|
|
|
}
|
2010-04-25 16:43:14 +00:00
|
|
|
|
2011-07-13 16:48:56 +00:00
|
|
|
KDecorationDefines::Position Tiling::supportedTilingResizeMode(Client *c, KDecorationDefines::Position currentMode)
|
2011-01-30 14:34:42 +00:00
|
|
|
{
|
|
|
|
if (tilingLayouts.value(c->desktop())) {
|
|
|
|
return tilingLayouts[c->desktop()]->resizeMode(c, currentMode);
|
2010-04-25 16:43:14 +00:00
|
|
|
}
|
2011-01-30 14:34:42 +00:00
|
|
|
return currentMode;
|
|
|
|
}
|
2010-04-25 16:43:14 +00:00
|
|
|
|
2011-07-13 16:48:56 +00:00
|
|
|
void Tiling::dumpTiles() const
|
2011-01-30 14:34:42 +00:00
|
|
|
{
|
|
|
|
foreach (TilingLayout * t, tilingLayouts) {
|
|
|
|
if (!t) {
|
2010-04-25 16:43:14 +00:00
|
|
|
kDebug(1212) << "EMPTY DESKTOP";
|
|
|
|
continue;
|
|
|
|
}
|
2011-01-30 14:34:42 +00:00
|
|
|
kDebug(1212) << "Desktop" << tilingLayouts.indexOf(t);
|
|
|
|
foreach (Tile * tile, t->tiles()) {
|
|
|
|
tile->dumpTile("--");
|
2010-04-25 16:43:14 +00:00
|
|
|
}
|
|
|
|
}
|
2011-01-30 14:34:42 +00:00
|
|
|
}
|
2010-04-25 16:43:14 +00:00
|
|
|
|
2011-07-15 19:52:19 +00:00
|
|
|
const QVector< TilingLayout* >& Tiling::getTilingLayouts() const
|
2011-07-13 16:48:56 +00:00
|
|
|
{
|
|
|
|
return tilingLayouts;
|
|
|
|
}
|
|
|
|
|
2011-07-15 19:52:19 +00:00
|
|
|
void Tiling::slotResizeTilingLayouts()
|
|
|
|
{
|
|
|
|
tilingLayouts.resize(m_workspace->numberOfDesktops() + 1);
|
|
|
|
}
|
|
|
|
|
2011-07-13 16:48:56 +00:00
|
|
|
}
|