| /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ |
| |
| #pragma once |
| |
| /*** |
| This file is part of systemd. |
| |
| Copyright 2014 David Herrmann <dh.herrmann@gmail.com> |
| |
| systemd is free software; you can redistribute it and/or modify it |
| under the terms of the GNU Lesser General Public License as published by |
| the Free Software Foundation; either version 2.1 of the License, or |
| (at your option) any later version. |
| |
| systemd is distributed in the hope that it will be useful, but |
| WITHOUT ANY WARRANTY; without even the implied warranty of |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| Lesser General Public License for more details. |
| |
| You should have received a copy of the GNU Lesser General Public License |
| along with systemd; If not, see <http://www.gnu.org/licenses/>. |
| ***/ |
| |
| #include "grdev.h" |
| #include "idev.h" |
| #include "list.h" |
| #include "macro.h" |
| #include "pty.h" |
| #include "sd-bus.h" |
| #include "sd-event.h" |
| #include "sysview.h" |
| #include "term.h" |
| #include "unifont.h" |
| |
| typedef struct Manager Manager; |
| typedef struct Session Session; |
| typedef struct Display Display; |
| typedef struct Workspace Workspace; |
| typedef struct Terminal Terminal; |
| |
| /* |
| * Terminals |
| */ |
| |
| struct Terminal { |
| Workspace *workspace; |
| LIST_FIELDS(Terminal, terminals_by_workspace); |
| |
| term_utf8 utf8; |
| term_parser *parser; |
| term_screen *screen; |
| Pty *pty; |
| }; |
| |
| int terminal_new(Terminal **out, Workspace *w); |
| Terminal *terminal_free(Terminal *t); |
| |
| DEFINE_TRIVIAL_CLEANUP_FUNC(Terminal*, terminal_free); |
| |
| void terminal_resize(Terminal *t); |
| void terminal_run(Terminal *t); |
| void terminal_feed(Terminal *t, idev_data *data); |
| bool terminal_draw(Terminal *t, const grdev_display_target *target); |
| |
| /* |
| * Workspaces |
| */ |
| |
| struct Workspace { |
| unsigned long ref; |
| Manager *manager; |
| LIST_FIELDS(Workspace, workspaces_by_manager); |
| |
| LIST_HEAD(Terminal, terminal_list); |
| Terminal *current; |
| |
| LIST_HEAD(Session, session_list); |
| uint32_t width; |
| uint32_t height; |
| }; |
| |
| int workspace_new(Workspace **out, Manager *m); |
| Workspace *workspace_ref(Workspace *w); |
| Workspace *workspace_unref(Workspace *w); |
| |
| DEFINE_TRIVIAL_CLEANUP_FUNC(Workspace*, workspace_unref); |
| |
| Workspace *workspace_attach(Workspace *w, Session *s); |
| Workspace *workspace_detach(Workspace *w, Session *s); |
| void workspace_refresh(Workspace *w); |
| |
| void workspace_dirty(Workspace *w); |
| void workspace_feed(Workspace *w, idev_data *data); |
| bool workspace_draw(Workspace *w, const grdev_display_target *target); |
| |
| /* |
| * Displays |
| */ |
| |
| struct Display { |
| Session *session; |
| LIST_FIELDS(Display, displays_by_session); |
| grdev_display *grdev; |
| uint32_t width; |
| uint32_t height; |
| }; |
| |
| int display_new(Display **out, Session *s, grdev_display *grdev); |
| Display *display_free(Display *d); |
| |
| DEFINE_TRIVIAL_CLEANUP_FUNC(Display*, display_free); |
| |
| void display_refresh(Display *d); |
| void display_render(Display *d, Workspace *w); |
| |
| /* |
| * Sessions |
| */ |
| |
| struct Session { |
| Manager *manager; |
| sysview_session *sysview; |
| grdev_session *grdev; |
| idev_session *idev; |
| |
| LIST_FIELDS(Session, sessions_by_workspace); |
| Workspace *my_ws; |
| Workspace *active_ws; |
| |
| LIST_HEAD(Display, display_list); |
| sd_event_source *redraw_src; |
| }; |
| |
| int session_new(Session **out, Manager *m, sysview_session *session); |
| Session *session_free(Session *s); |
| |
| DEFINE_TRIVIAL_CLEANUP_FUNC(Session*, session_free); |
| |
| void session_dirty(Session *s); |
| |
| void session_add_device(Session *s, sysview_device *device); |
| void session_remove_device(Session *s, sysview_device *device); |
| void session_refresh_device(Session *s, sysview_device *device, struct udev_device *ud); |
| |
| /* |
| * Managers |
| */ |
| |
| struct Manager { |
| sd_event *event; |
| sd_bus *sysbus; |
| unifont *uf; |
| sysview_context *sysview; |
| grdev_context *grdev; |
| idev_context *idev; |
| LIST_HEAD(Workspace, workspace_list); |
| }; |
| |
| int manager_new(Manager **out); |
| Manager *manager_free(Manager *m); |
| |
| DEFINE_TRIVIAL_CLEANUP_FUNC(Manager*, manager_free); |
| |
| int manager_run(Manager *m); |