mirror of
https://github.com/Bismuth-Forge/bismuth.git
synced 2024-10-05 12:37:47 +03:00
chore: add layout cxx skeleton
This commit is contained in:
parent
5b79638032
commit
6a61242a5f
@ -1,5 +1,7 @@
|
||||
# SPDX-FileCopyrightText: 2022 Mikhail Zolotukhin <mail@gikari.com>
|
||||
# SPDX-License-Identifier: MIT
|
||||
|
||||
add_subdirectory(layout)
|
||||
|
||||
target_sources(bismuth_core PRIVATE engine.cpp windows_list.cpp window.cpp
|
||||
surface.cpp)
|
||||
|
5
src/core/engine/layout/CMakeLists.txt
Normal file
5
src/core/engine/layout/CMakeLists.txt
Normal file
@ -0,0 +1,5 @@
|
||||
# SPDX-FileCopyrightText: 2022 Mikhail Zolotukhin <mail@gikari.com>
|
||||
# SPDX-License-Identifier: MIT
|
||||
|
||||
target_sources(bismuth_core PRIVATE layout.cpp monocle.cpp stacked.cpp
|
||||
layout_list.cpp)
|
9
src/core/engine/layout/layout.cpp
Normal file
9
src/core/engine/layout/layout.cpp
Normal file
@ -0,0 +1,9 @@
|
||||
// SPDX-FileCopyrightText: 2022 Mikhail Zolotukhin <mail@gikari.com>
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#include "layout.hpp"
|
||||
|
||||
namespace Bismuth
|
||||
{
|
||||
|
||||
}
|
23
src/core/engine/layout/layout.hpp
Normal file
23
src/core/engine/layout/layout.hpp
Normal file
@ -0,0 +1,23 @@
|
||||
// SPDX-FileCopyrightText: 2022 Mikhail Zolotukhin <mail@gikari.com>
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <QRect>
|
||||
|
||||
#include <vector>
|
||||
|
||||
#include "engine/window.hpp"
|
||||
|
||||
namespace Bismuth
|
||||
{
|
||||
class Layout
|
||||
{
|
||||
public:
|
||||
/**
|
||||
* Apply layout for the @p windows on tiling @p area. Method changes the
|
||||
* geometry of the windows to match the particular layout.
|
||||
*/
|
||||
virtual void apply(QRect area, std::vector<Window> &windows) = 0;
|
||||
};
|
||||
}
|
23
src/core/engine/layout/layout_list.cpp
Normal file
23
src/core/engine/layout/layout_list.cpp
Normal file
@ -0,0 +1,23 @@
|
||||
// SPDX-FileCopyrightText: 2022 Mikhail Zolotukhin <mail@gikari.com>
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#include "layout_list.hpp"
|
||||
#include "engine/layout/stacked.hpp"
|
||||
#include <memory>
|
||||
|
||||
namespace Bismuth
|
||||
{
|
||||
|
||||
const Layout &LayoutList::layoutOnSurface(const Surface &surface) const
|
||||
{
|
||||
auto &layout = m_layouts.at(surface);
|
||||
|
||||
if (layout) {
|
||||
return *layout;
|
||||
} else {
|
||||
// m_layouts.emplace(Surface(surface), std::make_unique<Stacked>());
|
||||
return *m_layouts.at(surface);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
20
src/core/engine/layout/layout_list.hpp
Normal file
20
src/core/engine/layout/layout_list.hpp
Normal file
@ -0,0 +1,20 @@
|
||||
// SPDX-FileCopyrightText: 2022 Mikhail Zolotukhin <mail@gikari.com>
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <map>
|
||||
#include <memory>
|
||||
|
||||
#include "engine/surface.hpp"
|
||||
#include "layout.hpp"
|
||||
|
||||
namespace Bismuth
|
||||
{
|
||||
struct LayoutList {
|
||||
const Layout &layoutOnSurface(const Surface &) const;
|
||||
|
||||
private:
|
||||
std::map<Surface, std::unique_ptr<Layout>> m_layouts{};
|
||||
};
|
||||
}
|
15
src/core/engine/layout/monocle.cpp
Normal file
15
src/core/engine/layout/monocle.cpp
Normal file
@ -0,0 +1,15 @@
|
||||
// SPDX-FileCopyrightText: 2022 Mikhail Zolotukhin <mail@gikari.com>
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#include "monocle.hpp"
|
||||
|
||||
namespace Bismuth
|
||||
{
|
||||
void Monocle::apply(QRect area, std::vector<Window> &windows)
|
||||
{
|
||||
for (auto &window : windows) {
|
||||
// Place the window on the all available area
|
||||
window.setGeometry(area);
|
||||
}
|
||||
}
|
||||
}
|
13
src/core/engine/layout/monocle.hpp
Normal file
13
src/core/engine/layout/monocle.hpp
Normal file
@ -0,0 +1,13 @@
|
||||
// SPDX-FileCopyrightText: 2022 Mikhail Zolotukhin <mail@gikari.com>
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "layout.hpp"
|
||||
|
||||
namespace Bismuth
|
||||
{
|
||||
struct Monocle : Layout {
|
||||
virtual void apply(QRect area, std::vector<Window> &windows) override;
|
||||
};
|
||||
}
|
11
src/core/engine/layout/stacked.cpp
Normal file
11
src/core/engine/layout/stacked.cpp
Normal file
@ -0,0 +1,11 @@
|
||||
// SPDX-FileCopyrightText: 2022 Mikhail Zolotukhin <mail@gikari.com>
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#include "stacked.hpp"
|
||||
|
||||
namespace Bismuth
|
||||
{
|
||||
void Stacked::apply(QRect area, std::vector<Window> &windows)
|
||||
{
|
||||
}
|
||||
}
|
13
src/core/engine/layout/stacked.hpp
Normal file
13
src/core/engine/layout/stacked.hpp
Normal file
@ -0,0 +1,13 @@
|
||||
// SPDX-FileCopyrightText: 2022 Mikhail Zolotukhin <mail@gikari.com>
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "layout.hpp"
|
||||
|
||||
namespace Bismuth
|
||||
{
|
||||
struct Stacked : Layout {
|
||||
virtual void apply(QRect area, std::vector<Window> &windows) override;
|
||||
};
|
||||
}
|
@ -16,6 +16,16 @@ bool Window::operator<(const Window &rhs) const
|
||||
return m_client < m_client;
|
||||
}
|
||||
|
||||
QRect Window::geometry() const
|
||||
{
|
||||
return m_client.frameGeometry();
|
||||
}
|
||||
|
||||
void Window::setGeometry(QRect newGeometry)
|
||||
{
|
||||
m_client.setFrameGeometry(newGeometry);
|
||||
}
|
||||
|
||||
void Window::setMode(Mode value)
|
||||
{
|
||||
m_mode = value;
|
||||
|
@ -23,6 +23,9 @@ public:
|
||||
|
||||
bool operator<(const Window &rhs) const;
|
||||
|
||||
QRect geometry() const;
|
||||
void setGeometry(QRect);
|
||||
|
||||
void setMode(Mode);
|
||||
Mode mode() const;
|
||||
|
||||
|
@ -30,6 +30,12 @@ public:
|
||||
*/
|
||||
BI_READONLY_PROPERTY(QStringList, activities)
|
||||
|
||||
/**
|
||||
* The geometry of this Client. Be aware that depending on resize mode the frameGeometryChanged
|
||||
* signal might be emitted at each resize step or only at the end of the resize operation.
|
||||
*/
|
||||
BI_PROPERTY(QRect, frameGeometry, setFrameGeometry)
|
||||
|
||||
// /**
|
||||
// * Whether the window is active.
|
||||
// */
|
||||
|
@ -1,4 +1,6 @@
|
||||
# SPDX-FileCopyrightText: 2022 Mikhail Zolotukhin <mail@gikari.com>
|
||||
# SPDX-License-Identifier: MIT
|
||||
|
||||
add_subdirectory(layout)
|
||||
|
||||
target_sources(test_runner PRIVATE window.cpp)
|
||||
|
4
tests/core/engine/layout/CMakeLists.txt
Normal file
4
tests/core/engine/layout/CMakeLists.txt
Normal file
@ -0,0 +1,4 @@
|
||||
# SPDX-FileCopyrightText: 2022 Mikhail Zolotukhin <mail@gikari.com>
|
||||
# SPDX-License-Identifier: MIT
|
||||
|
||||
target_sources(test_runner PRIVATE monocle.cpp)
|
33
tests/core/engine/layout/monocle.cpp
Normal file
33
tests/core/engine/layout/monocle.cpp
Normal file
@ -0,0 +1,33 @@
|
||||
// SPDX-FileCopyrightText: 2022 Mikhail Zolotukhin <mail@gikari.com>
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#include <doctest/doctest.h>
|
||||
|
||||
#include "engine/layout/monocle.hpp"
|
||||
#include "engine/window.hpp"
|
||||
|
||||
#include "plasma-api/client.hpp"
|
||||
#include "plasma-api/client.mock.hpp"
|
||||
|
||||
TEST_CASE("Monocle Tiling Logic")
|
||||
{
|
||||
auto monocleLayout = Bismuth::Monocle();
|
||||
|
||||
auto fakeClient1 = FakeKWinClient();
|
||||
fakeClient1.m_frameGeometry = QRect(15, 42, 48, 67);
|
||||
|
||||
auto fakeClient2 = FakeKWinClient();
|
||||
fakeClient1.m_frameGeometry = QRect(18, 24, 79, 10);
|
||||
|
||||
auto tilingArea = QRect(0, 0, 1000, 1000);
|
||||
auto windowsToTile = std::vector<Bismuth::Window>({
|
||||
Bismuth::Window(PlasmaApi::Client(&fakeClient1)),
|
||||
Bismuth::Window(PlasmaApi::Client(&fakeClient2)),
|
||||
});
|
||||
|
||||
monocleLayout.apply(tilingArea, windowsToTile);
|
||||
|
||||
for (auto &window : windowsToTile) {
|
||||
CHECK(window.geometry() == tilingArea);
|
||||
}
|
||||
}
|
@ -9,36 +9,7 @@
|
||||
#include "engine/window.hpp"
|
||||
#include "plasma-api/client.hpp"
|
||||
|
||||
class FakeKWinClient : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
Q_PROPERTY(bool minimized MEMBER m_minimized)
|
||||
Q_PROPERTY(bool onAllDesktops MEMBER m_onAllDesktops)
|
||||
Q_PROPERTY(int desktop MEMBER m_desktop)
|
||||
Q_PROPERTY(int screen MEMBER m_screen)
|
||||
Q_PROPERTY(QStringList activities MEMBER m_activities)
|
||||
|
||||
public:
|
||||
FakeKWinClient &operator=(const FakeKWinClient &rhs)
|
||||
{
|
||||
if (&rhs != this) {
|
||||
m_minimized = rhs.m_minimized;
|
||||
m_onAllDesktops = rhs.m_onAllDesktops;
|
||||
m_desktop = rhs.m_desktop;
|
||||
m_screen = rhs.m_screen;
|
||||
m_activities = rhs.m_activities;
|
||||
}
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
bool m_minimized{};
|
||||
bool m_onAllDesktops{};
|
||||
int m_desktop{};
|
||||
int m_screen{};
|
||||
QStringList m_activities{};
|
||||
};
|
||||
#include "plasma-api/client.mock.hpp"
|
||||
|
||||
TEST_CASE("Window Visibility")
|
||||
{
|
||||
@ -136,5 +107,3 @@ TEST_CASE("Window Visibility")
|
||||
CHECK(visible == true);
|
||||
}
|
||||
}
|
||||
|
||||
#include "window.moc"
|
||||
|
@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: 2022 Mikhail Zolotukhin <mail@gikari.com>
|
||||
# SPDX-License-Identifier: MIT
|
||||
|
||||
target_sources(test_runner PRIVATE workspace.cpp)
|
||||
target_sources(test_runner PRIVATE workspace.cpp client.mock.cpp)
|
||||
|
17
tests/core/plasma-api/client.mock.cpp
Normal file
17
tests/core/plasma-api/client.mock.cpp
Normal file
@ -0,0 +1,17 @@
|
||||
// SPDX-FileCopyrightText: 2022 Mikhail Zolotukhin <mail@gikari.com>
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#include "client.mock.hpp"
|
||||
|
||||
FakeKWinClient &FakeKWinClient::operator=(const FakeKWinClient &rhs)
|
||||
{
|
||||
if (&rhs != this) {
|
||||
m_minimized = rhs.m_minimized;
|
||||
m_onAllDesktops = rhs.m_onAllDesktops;
|
||||
m_desktop = rhs.m_desktop;
|
||||
m_screen = rhs.m_screen;
|
||||
m_activities = rhs.m_activities;
|
||||
}
|
||||
|
||||
return *this;
|
||||
}
|
30
tests/core/plasma-api/client.mock.hpp
Normal file
30
tests/core/plasma-api/client.mock.hpp
Normal file
@ -0,0 +1,30 @@
|
||||
// SPDX-FileCopyrightText: 2022 Mikhail Zolotukhin <mail@gikari.com>
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <QObject>
|
||||
#include <QRect>
|
||||
#include <QStringList>
|
||||
|
||||
class FakeKWinClient : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
Q_PROPERTY(bool minimized MEMBER m_minimized)
|
||||
Q_PROPERTY(bool onAllDesktops MEMBER m_onAllDesktops)
|
||||
Q_PROPERTY(int desktop MEMBER m_desktop)
|
||||
Q_PROPERTY(int screen MEMBER m_screen)
|
||||
Q_PROPERTY(QStringList activities MEMBER m_activities)
|
||||
Q_PROPERTY(QRect frameGeometry MEMBER m_frameGeometry)
|
||||
|
||||
public:
|
||||
FakeKWinClient &operator=(const FakeKWinClient &);
|
||||
|
||||
bool m_minimized{};
|
||||
bool m_onAllDesktops{};
|
||||
int m_desktop{};
|
||||
int m_screen{};
|
||||
QStringList m_activities{};
|
||||
QRect m_frameGeometry{};
|
||||
};
|
Loading…
Reference in New Issue
Block a user