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(L4Re::Event_buffer::Event const &e, Point const &mouse);
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(L4Re::Event_buffer::Event const &e,
96 Session *s = _m.handle_event(e, mouse - p1());
100 s->ignore(!s->ignore());
101 _core->user_state()->vstack()->update_all_views();
106 Session_manager_view::draw(Canvas *canvas, View_stack const *, Mode) const
108 _m.draw(canvas, p1());
112 Session_manager_view::calc_geometry()
117 Area cs = _core->user_state()->vstack()->canvas()->size();
118 cs = cs - Area(BORDER * 2, BORDER * 2);
119 Area sz =_m.calc_geometry(cs);
121 Point p = Point(20, 20).min(Point(BORDER, BORDER) + Point(cs) - Point(sz));
122 set_geometry(Rect(p, sz));
126 Session_manager_view::sessions_changed()
132 _core->user_state()->vstack()->refresh_view(this, 0, *this);
136 Session_manager_view::notify()
138 View_stack *vs = _core->user_state()->vstack();
140 if (_visible && !m.kill())
144 vs->refresh_view(0, 0, *this);
146 else if (!_visible && m.kill())
150 vs->push_top(this, true);