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 log_error("Cannot request session control on '%s': %s",
146 sysview_session_get_name(session), strerror(-r));
150 r = session_new(&s, m, session);
152 log_error("Cannot create session on '%s': %s",
153 sysview_session_get_name(session), strerror(-r));
154 sysview_session_release_control(session);
158 sysview_session_set_userdata(session, s);
163 static int manager_sysview_session_remove(Manager *m, sysview_event *event) {
164 sysview_session *session = event->session_remove.session;
167 s = sysview_session_get_userdata(session);
176 static int manager_sysview_session_attach(Manager *m, sysview_event *event) {
177 sysview_session *session = event->session_attach.session;
178 sysview_device *device = event->session_attach.device;
181 s = sysview_session_get_userdata(session);
185 session_add_device(s, device);
190 static int manager_sysview_session_detach(Manager *m, sysview_event *event) {
191 sysview_session *session = event->session_detach.session;
192 sysview_device *device = event->session_detach.device;
195 s = sysview_session_get_userdata(session);
199 session_remove_device(s, device);
204 static int manager_sysview_session_refresh(Manager *m, sysview_event *event) {
205 sysview_session *session = event->session_refresh.session;
206 sysview_device *device = event->session_refresh.device;
207 struct udev_device *ud = event->session_refresh.ud;
210 s = sysview_session_get_userdata(session);
214 session_refresh_device(s, device, ud);
219 static int manager_sysview_session_control(Manager *m, sysview_event *event) {
220 sysview_session *session = event->session_control.session;
221 int error = event->session_control.error;
224 s = sysview_session_get_userdata(session);
229 log_error("Cannot take session control on '%s': %s",
230 sysview_session_get_name(session), strerror(-error));
232 sysview_session_set_userdata(session, NULL);
239 static int manager_sysview_fn(sysview_context *sysview, void *userdata, sysview_event *event) {
240 Manager *m = userdata;
245 switch (event->type) {
246 case SYSVIEW_EVENT_SESSION_FILTER:
247 r = manager_sysview_session_filter(m, event);
249 case SYSVIEW_EVENT_SESSION_ADD:
250 r = manager_sysview_session_add(m, event);
252 case SYSVIEW_EVENT_SESSION_REMOVE:
253 r = manager_sysview_session_remove(m, event);
255 case SYSVIEW_EVENT_SESSION_ATTACH:
256 r = manager_sysview_session_attach(m, event);
258 case SYSVIEW_EVENT_SESSION_DETACH:
259 r = manager_sysview_session_detach(m, event);
261 case SYSVIEW_EVENT_SESSION_REFRESH:
262 r = manager_sysview_session_refresh(m, event);
264 case SYSVIEW_EVENT_SESSION_CONTROL:
265 r = manager_sysview_session_control(m, event);
275 int manager_run(Manager *m) {
280 r = sysview_context_start(m->sysview, manager_sysview_fn, m);
284 r = sd_event_loop(m->event);
286 sysview_context_stop(m->sysview);