1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
4 This file is part of systemd.
6 Copyright 2014 David Herrmann <dh.herrmann@gmail.com>
8 systemd is free software; you can redistribute it and/or modify it
9 under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 2.1 of the License, or
11 (at your option) any later version.
13 systemd is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
18 You should have received a copy of the GNU Lesser General Public License
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
35 int manager_new(Manager **out) {
36 _cleanup_(manager_freep) Manager *m = NULL;
45 r = sd_event_default(&m->event);
49 r = sd_event_set_watchdog(m->event, true);
53 r = sigprocmask_many(SIG_BLOCK, SIGTERM, SIGQUIT, SIGINT, SIGWINCH, SIGCHLD, -1);
57 r = sd_event_add_signal(m->event, NULL, SIGTERM, NULL, NULL);
61 r = sd_event_add_signal(m->event, NULL, SIGQUIT, NULL, NULL);
65 r = sd_event_add_signal(m->event, NULL, SIGINT, NULL, NULL);
69 r = sd_bus_open_system(&m->sysbus);
73 r = sd_bus_attach_event(m->sysbus, m->event, SD_EVENT_PRIORITY_NORMAL);
77 r = unifont_new(&m->uf);
81 r = sysview_context_new(&m->sysview,
82 SYSVIEW_CONTEXT_SCAN_LOGIND |
83 SYSVIEW_CONTEXT_SCAN_EVDEV |
84 SYSVIEW_CONTEXT_SCAN_DRM,
91 r = grdev_context_new(&m->grdev, m->event, m->sysbus);
95 r = idev_context_new(&m->idev, m->event, m->sysbus);
104 Manager *manager_free(Manager *m) {
108 assert(!m->workspace_list);
110 m->idev = idev_context_unref(m->idev);
111 m->grdev = grdev_context_unref(m->grdev);
112 m->sysview = sysview_context_free(m->sysview);
113 m->uf = unifont_unref(m->uf);
114 m->sysbus = sd_bus_unref(m->sysbus);
115 m->event = sd_event_unref(m->event);
121 static int manager_sysview_session_filter(Manager *m, sysview_event *event) {
122 const char *sid = event->session_filter.id;
123 _cleanup_free_ char *desktop = NULL;
128 r = sd_session_get_desktop(sid, &desktop);
132 return streq(desktop, "systemd-console");
135 static int manager_sysview_session_add(Manager *m, sysview_event *event) {
136 sysview_session *session = event->session_add.session;
140 r = sysview_session_take_control(session);
142 return log_error_errno(r, "Cannot request session control on '%s': %m",
143 sysview_session_get_name(session));
145 r = session_new(&s, m, session);
147 log_error_errno(r, "Cannot create session on '%s': %m",
148 sysview_session_get_name(session));
149 sysview_session_release_control(session);
153 sysview_session_set_userdata(session, s);
158 static int manager_sysview_session_remove(Manager *m, sysview_event *event) {
159 sysview_session *session = event->session_remove.session;
162 s = sysview_session_get_userdata(session);
171 static int manager_sysview_session_attach(Manager *m, sysview_event *event) {
172 sysview_session *session = event->session_attach.session;
173 sysview_device *device = event->session_attach.device;
176 s = sysview_session_get_userdata(session);
180 session_add_device(s, device);
185 static int manager_sysview_session_detach(Manager *m, sysview_event *event) {
186 sysview_session *session = event->session_detach.session;
187 sysview_device *device = event->session_detach.device;
190 s = sysview_session_get_userdata(session);
194 session_remove_device(s, device);
199 static int manager_sysview_session_refresh(Manager *m, sysview_event *event) {
200 sysview_session *session = event->session_refresh.session;
201 sysview_device *device = event->session_refresh.device;
202 struct udev_device *ud = event->session_refresh.ud;
205 s = sysview_session_get_userdata(session);
209 session_refresh_device(s, device, ud);
214 static int manager_sysview_session_control(Manager *m, sysview_event *event) {
215 sysview_session *session = event->session_control.session;
216 int error = event->session_control.error;
219 s = sysview_session_get_userdata(session);
224 log_error_errno(error, "Cannot take session control on '%s': %m",
225 sysview_session_get_name(session));
227 sysview_session_set_userdata(session, NULL);
234 static int manager_sysview_fn(sysview_context *sysview, void *userdata, sysview_event *event) {
235 Manager *m = userdata;
240 switch (event->type) {
241 case SYSVIEW_EVENT_SESSION_FILTER:
242 r = manager_sysview_session_filter(m, event);
244 case SYSVIEW_EVENT_SESSION_ADD:
245 r = manager_sysview_session_add(m, event);
247 case SYSVIEW_EVENT_SESSION_REMOVE:
248 r = manager_sysview_session_remove(m, event);
250 case SYSVIEW_EVENT_SESSION_ATTACH:
251 r = manager_sysview_session_attach(m, event);
253 case SYSVIEW_EVENT_SESSION_DETACH:
254 r = manager_sysview_session_detach(m, event);
256 case SYSVIEW_EVENT_SESSION_REFRESH:
257 r = manager_sysview_session_refresh(m, event);
259 case SYSVIEW_EVENT_SESSION_CONTROL:
260 r = manager_sysview_session_control(m, event);
270 int manager_run(Manager *m) {
275 r = sysview_context_start(m->sysview, manager_sysview_fn, m);
279 r = sd_event_loop(m->event);
281 sysview_context_stop(m->sysview);