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/>.
31 #include "sd-daemon.h"
38 int manager_new(Manager **out) {
39 _cleanup_(manager_freep) Manager *m = NULL;
48 r = sd_event_default(&m->event);
52 r = sd_event_set_watchdog(m->event, true);
56 r = sigprocmask_many(SIG_BLOCK, SIGTERM, SIGQUIT, SIGINT, SIGWINCH, SIGCHLD, -1);
60 r = sd_event_add_signal(m->event, NULL, SIGTERM, NULL, NULL);
64 r = sd_event_add_signal(m->event, NULL, SIGQUIT, NULL, NULL);
68 r = sd_event_add_signal(m->event, NULL, SIGINT, NULL, NULL);
72 r = sd_bus_open_system(&m->sysbus);
76 r = sd_bus_attach_event(m->sysbus, m->event, SD_EVENT_PRIORITY_NORMAL);
80 r = unifont_new(&m->uf);
84 r = sysview_context_new(&m->sysview,
85 SYSVIEW_CONTEXT_SCAN_LOGIND |
86 SYSVIEW_CONTEXT_SCAN_EVDEV |
87 SYSVIEW_CONTEXT_SCAN_DRM,
94 r = grdev_context_new(&m->grdev, m->event, m->sysbus);
98 r = idev_context_new(&m->idev, m->event, m->sysbus);
107 Manager *manager_free(Manager *m) {
111 assert(!m->workspace_list);
113 m->idev = idev_context_unref(m->idev);
114 m->grdev = grdev_context_unref(m->grdev);
115 m->sysview = sysview_context_free(m->sysview);
116 m->uf = unifont_unref(m->uf);
117 m->sysbus = sd_bus_unref(m->sysbus);
118 m->event = sd_event_unref(m->event);
124 static int manager_sysview_session_filter(Manager *m, sysview_event *event) {
125 const char *sid = event->session_filter.id;
126 _cleanup_free_ char *desktop = NULL;
131 r = sd_session_get_desktop(sid, &desktop);
135 return streq(desktop, "systemd-console");
138 static int manager_sysview_session_add(Manager *m, sysview_event *event) {
139 sysview_session *session = event->session_add.session;
143 r = sysview_session_take_control(session);
145 return log_error_errno(r, "Cannot request session control on '%s': %m",
146 sysview_session_get_name(session));
148 r = session_new(&s, m, session);
150 log_error_errno(r, "Cannot create session on '%s': %m",
151 sysview_session_get_name(session));
152 sysview_session_release_control(session);
156 sysview_session_set_userdata(session, s);
161 static int manager_sysview_session_remove(Manager *m, sysview_event *event) {
162 sysview_session *session = event->session_remove.session;
165 s = sysview_session_get_userdata(session);
174 static int manager_sysview_session_attach(Manager *m, sysview_event *event) {
175 sysview_session *session = event->session_attach.session;
176 sysview_device *device = event->session_attach.device;
179 s = sysview_session_get_userdata(session);
183 session_add_device(s, device);
188 static int manager_sysview_session_detach(Manager *m, sysview_event *event) {
189 sysview_session *session = event->session_detach.session;
190 sysview_device *device = event->session_detach.device;
193 s = sysview_session_get_userdata(session);
197 session_remove_device(s, device);
202 static int manager_sysview_session_refresh(Manager *m, sysview_event *event) {
203 sysview_session *session = event->session_refresh.session;
204 sysview_device *device = event->session_refresh.device;
205 struct udev_device *ud = event->session_refresh.ud;
208 s = sysview_session_get_userdata(session);
212 session_refresh_device(s, device, ud);
217 static int manager_sysview_session_control(Manager *m, sysview_event *event) {
218 sysview_session *session = event->session_control.session;
219 int error = event->session_control.error;
222 s = sysview_session_get_userdata(session);
227 log_error_errno(error, "Cannot take session control on '%s': %m",
228 sysview_session_get_name(session));
230 sysview_session_set_userdata(session, NULL);
237 static int manager_sysview_fn(sysview_context *sysview, void *userdata, sysview_event *event) {
238 Manager *m = userdata;
243 switch (event->type) {
244 case SYSVIEW_EVENT_SESSION_FILTER:
245 r = manager_sysview_session_filter(m, event);
247 case SYSVIEW_EVENT_SESSION_ADD:
248 r = manager_sysview_session_add(m, event);
250 case SYSVIEW_EVENT_SESSION_REMOVE:
251 r = manager_sysview_session_remove(m, event);
253 case SYSVIEW_EVENT_SESSION_ATTACH:
254 r = manager_sysview_session_attach(m, event);
256 case SYSVIEW_EVENT_SESSION_DETACH:
257 r = manager_sysview_session_detach(m, event);
259 case SYSVIEW_EVENT_SESSION_REFRESH:
260 r = manager_sysview_session_refresh(m, event);
262 case SYSVIEW_EVENT_SESSION_CONTROL:
263 r = manager_sysview_session_control(m, event);
273 int manager_run(Manager *m) {
278 r = sysview_context_start(m->sysview, manager_sysview_fn, m);
282 r = sd_event_loop(m->event);
284 sysview_context_stop(m->sysview);