Add initial bits of window management abstraction

This commit is contained in:
Simon Fels 2016-11-18 13:07:39 +01:00
commit 7c7c8982b2
10 changed files with 245 additions and 3 deletions

View file

@ -134,6 +134,9 @@ set(SOURCES
anbox/wm/task.cpp
anbox/wm/manager.cpp
anbox/wm/window_state.cpp
anbox/wm/window.cpp
anbox/wm/platform_policy.cpp
anbox/wm/default_platform_policy.cpp
anbox/input/manager.cpp
anbox/input/device.cpp

View file

@ -37,6 +37,7 @@
#include "anbox/dbus/skeleton/service.h"
#include "anbox/container/client.h"
#include "anbox/wm/manager.h"
#include "anbox/wm/default_platform_policy.h"
#include <sys/prctl.h>
@ -89,7 +90,8 @@ anbox::cmds::Run::Run(const BusFactory& bus_factory)
auto input_manager = std::make_shared<input::Manager>(rt);
auto window_manager = std::make_shared<wm::Manager>();
auto policy = std::make_shared<wm::DefaultPlatformPolicy>();
auto window_manager = std::make_shared<wm::Manager>(policy);
auto window_creator = std::make_shared<ubuntu::WindowCreator>(input_manager);
auto renderer = std::make_shared<graphics::GLRendererServer>(window_creator);

View file

@ -0,0 +1,39 @@
/*
* Copyright (C) 2016 Simon Fels <morphis@gravedo.de>
*
* This program is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 3, as published
* by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranties of
* MERCHANTABILITY, SATISFACTORY QUALITY, 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/>.
*
*/
#include "anbox/wm/default_platform_policy.h"
#include "anbox/wm/window.h"
namespace {
class Window : public anbox::wm::Window {
public:
Window(const anbox::wm::WindowState &state) :
anbox::wm::Window(state) {
}
};
}
namespace anbox {
namespace wm {
DefaultPlatformPolicy::DefaultPlatformPolicy() {
}
std::shared_ptr<Window> DefaultPlatformPolicy::create_window(const WindowState &state) {
return std::make_shared<::Window>(state);
}
} // namespace wm
} // namespace anbox

View file

@ -0,0 +1,33 @@
/*
* Copyright (C) 2016 Simon Fels <morphis@gravedo.de>
*
* This program is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 3, as published
* by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranties of
* MERCHANTABILITY, SATISFACTORY QUALITY, 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/>.
*
*/
#ifndef ANBOX_WM_DEFAULT_PLATFORM_POLICY_H_
#define ANBOX_WM_DEFAULT_PLATFORM_POLICY_H_
#include "anbox/wm/platform_policy.h"
namespace anbox {
namespace wm {
class DefaultPlatformPolicy : public PlatformPolicy {
public:
DefaultPlatformPolicy();
std::shared_ptr<Window> create_window(const WindowState &state) override;
};
} // namespace wm
} // namespace anbox
#endif

View file

@ -20,7 +20,8 @@
namespace anbox {
namespace wm {
Manager::Manager() {
Manager::Manager(const std::shared_ptr<PlatformPolicy> &platform) :
platform_(platform) {
}
Manager::~Manager() {

View file

@ -20,17 +20,21 @@
#include "anbox/wm/window_state.h"
#include <memory>
namespace anbox {
namespace wm {
class PlatformPolicy;
class Manager {
public:
Manager();
Manager(const std::shared_ptr<PlatformPolicy> &platform);
~Manager();
void apply_window_state_update(const WindowState::List &updated,
const WindowState::List &removed);
private:
std::shared_ptr<PlatformPolicy> platform_;
};
} // namespace wm
} // namespace anbox

View file

@ -0,0 +1,25 @@
/*
* Copyright (C) 2016 Simon Fels <morphis@gravedo.de>
*
* This program is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 3, as published
* by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranties of
* MERCHANTABILITY, SATISFACTORY QUALITY, 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/>.
*
*/
#include "anbox/wm/platform_policy.h"
namespace anbox {
namespace wm {
PlatformPolicy::~PlatformPolicy() {
}
} // namespace wm
} // namespace anbox

View file

@ -0,0 +1,38 @@
/*
* Copyright (C) 2016 Simon Fels <morphis@gravedo.de>
*
* This program is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 3, as published
* by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranties of
* MERCHANTABILITY, SATISFACTORY QUALITY, 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/>.
*
*/
#ifndef ANBOX_WM_PLATFORM_POLICY_H_
#define ANBOX_WM_PLATFORM_POLICY_H_
#include "anbox/graphics/rect.h"
#include "anbox/wm/window_state.h"
#include <memory>
namespace anbox {
namespace wm {
class Window;
class PlatformPolicy {
public:
virtual ~PlatformPolicy();
virtual std::shared_ptr<Window> create_window(const WindowState &state) = 0;
};
} // namespace wm
} // namespace anbox
#endif

38
src/anbox/wm/window.cpp Normal file
View file

@ -0,0 +1,38 @@
/*
* Copyright (C) 2016 Simon Fels <morphis@gravedo.de>
*
* This program is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 3, as published
* by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranties of
* MERCHANTABILITY, SATISFACTORY QUALITY, 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/>.
*
*/
#include "anbox/wm/window.h"
namespace anbox {
namespace wm {
Window::Window(const WindowState &state) :
state_(state) {
}
Window::~Window() {
}
void Window::update_state(const WindowState &state) {
state_ = state;
}
void Window::render_layer(const Layer &layer) {
(void) layer;
}
} // namespace wm
} // namespace anbox

59
src/anbox/wm/window.h Normal file
View file

@ -0,0 +1,59 @@
/*
* Copyright (C) 2016 Simon Fels <morphis@gravedo.de>
*
* This program is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 3, as published
* by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranties of
* MERCHANTABILITY, SATISFACTORY QUALITY, 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/>.
*
*/
#ifndef ANBOX_WM_WINDOW_H_
#define ANBOX_WM_WINDOW_H_
#include "anbox/wm/window_state.h"
#include <vector>
#include <string>
namespace anbox {
namespace wm {
// FIXME(morphis): move this somewhere else once we have the integration
// with the emugl layer.
class Layer {
public:
graphics::Rect frame() const { return frame_; }
private:
graphics::Rect frame_;
};
class Window {
public:
typedef std::vector<Window> List;
Window(const WindowState &state);
virtual ~Window();
void update_state(const WindowState &state);
// Render a layer into the window. The layer itself includes all
// necessary information for correct rendering.
void render_layer(const Layer &layer);
WindowState state() const;
private:
WindowState state_;
};
} // namespace wm
} // namespace anbox
#endif