2 * (c) 2011 Adam Lackorzynski <adam@os.inf.tu-dresden.de>,
3 * Alexander Warg <warg@os.inf.tu-dresden.de>
4 * economic rights: Technische Universität Dresden (Germany)
6 * This file is part of TUD:OS and distributed under the terms of the
7 * GNU General Public License 2.
8 * Please see the COPYING-GPL-2 file for details.
11 #include <l4/mag/server/session>
12 #include <l4/mag/server/plugin>
13 #include <l4/mag/server/view>
14 #include <l4/mag/server/user_state>
15 #include <l4/mag/server/menu>
17 #include <l4/mag-gfx/canvas>
18 #include <l4/mag-gfx/clip_guard>
20 #include <l4/re/event_enums.h>
22 namespace Mag_server { namespace {
24 typedef Menu<Session_list> Session_menu;
26 class Session_manager_view : public View, private cxx::Observer
29 Core_api const *_core;
33 struct So : public Observer
35 explicit So(Session_manager_view *v) : v(v) {}
36 Session_manager_view *v;
37 void notify() { v->sessions_changed(); }
43 explicit Session_manager_view(Core_api const *core)
44 : View(Rect(), View::F_super_view /*| F_transparent*/), _core(core),
45 _m(core, this, core->sessions()),
46 _visible(false), _session_observer(this)
49 Observer *mode_observer() { return this; }
50 Observer *session_observer() { return &_session_observer; }
52 void handle_event(Hid_report *e, Point const &mouse, bool core_dev);
53 void draw(Canvas *canvas, View_stack const *, Mode mode) const;
55 void sessions_changed();
59 class Session_manager : public Plugin
62 Session_manager_view *_v;
65 Session_manager() : Plugin("Session manager") {}
66 char const *type() const { return "Session manager"; }
67 void start(Core_api *core);
73 Session_manager::start(Core_api *core)
75 _v = new Session_manager_view(core);
76 core->user_state()->vstack()->add_mode_observer(_v->mode_observer());
77 core->add_session_observer(_v->session_observer());
81 Session_manager::stop()
89 static Session_manager session_manager;
93 Session_manager_view::handle_event(Hid_report *e, Point const &mouse, bool)
95 Session_list::Const_iterator s = _m.handle_event(e, mouse - p1());
97 if (s != _core->sessions()->end())
99 s->ignore(!s->ignore());
100 _core->user_state()->vstack()->update_all_views();
105 Session_manager_view::draw(Canvas *canvas, View_stack const *, Mode) const
107 _m.draw(canvas, p1());
111 Session_manager_view::calc_geometry()
116 Area cs = _core->user_state()->vstack()->canvas()->size();
117 cs = cs - Area(BORDER * 2, BORDER * 2);
118 Area sz =_m.calc_geometry(cs);
120 Point p = Point(20, 20).min(Point(BORDER, BORDER) + Point(cs) - Point(sz));
121 set_geometry(Rect(p, sz));
125 Session_manager_view::sessions_changed()
131 _core->user_state()->vstack()->refresh_view(this, 0, *this);
135 Session_manager_view::notify()
137 View_stack *vs = _core->user_state()->vstack();
139 if (_visible && !m.kill())
143 vs->refresh_view(0, 0, *this);
145 else if (!_visible && m.kill())
149 vs->push_top(this, true);